From 2edafdea9222193c6cd5504d5f82d9471b21d5a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dejan=20Leki=C4=87?= Date: Wed, 17 Dec 2025 11:51:53 +0000 Subject: [PATCH 01/12] Implemented toString methods for mouse events and for other event types (Event, PasteEvent, FocusEvent and ResizeEvent). --- source/dcell/coord.d | 7 ++++++ source/dcell/event.d | 43 +++++++++++++++++++++++++++++++++ source/dcell/mouse.d | 57 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 107 insertions(+) diff --git a/source/dcell/coord.d b/source/dcell/coord.d index be9cba4..cde7c8b 100644 --- a/source/dcell/coord.d +++ b/source/dcell/coord.d @@ -10,6 +10,8 @@ */ module dcell.coord; +import std.format : format; + /** * Coordinates are X, Y values. */ @@ -17,4 +19,9 @@ struct Coord { int x; // aka column int y; // aka row + + string toString() const pure + { + return format("(%d, %d)", x, y); + } } diff --git a/source/dcell/event.d b/source/dcell/event.d index 0c60a59..70f46c7 100644 --- a/source/dcell/event.d +++ b/source/dcell/event.d @@ -11,6 +11,7 @@ module dcell.event; import core.time; +import std.format : format; import std.range; import dcell.key; @@ -46,6 +47,29 @@ struct Event PasteEvent paste; FocusEvent focus; } + + string toString() const + { + final switch (type) + { + case EventType.none: + return "Event[none]"; + case EventType.closed: + return "Event[closed]"; + case EventType.error: + return "Event[error]"; + case EventType.key: + return format("Event[key: %s]", key.toString()); + case EventType.mouse: + return format("Event[mouse: %s]", mouse.toString()); + case EventType.paste: + return format("Event[paste: %s]", paste.toString()); + case EventType.resize: + return format("Event[resize: %s]", resize.toString()); + case EventType.focus: + return format("Event[focus: %s]", focus.toString()); + } + } } /** @@ -55,6 +79,10 @@ struct Event */ struct ResizeEvent { + string toString() const pure + { + return "Resize"; + } } /** @@ -64,12 +92,27 @@ struct PasteEvent { string content; /// string content for normal paste ubyte[] binary; /// binary data via OSC 52 or similar + + string toString() const pure + { + if (content.length > 0) + return format("Paste[%d chars]", content.length); + else if (binary.length > 0) + return format("Paste[%d bytes binary]", binary.length); + else + return "Paste[empty]"; + } } /// Focus event. struct FocusEvent { bool focused; + + string toString() const pure + { + return focused ? "Focus[gained]" : "Focus[lost]"; + } } /** diff --git a/source/dcell/mouse.d b/source/dcell/mouse.d index b78b900..4f188a2 100644 --- a/source/dcell/mouse.d +++ b/source/dcell/mouse.d @@ -10,6 +10,8 @@ */ module dcell.mouse; +import std.format : format; + public import dcell.coord; public import dcell.key : Modifiers; @@ -78,4 +80,59 @@ struct MouseEvent Buttons btn; /// Buttons involved. Modifiers mod; /// Keyboard modifiers pressed during event. Coord pos; /// Coordinates of mouse. + + string toString() const pure + { + string s = ""; + + // Add modifiers + if (mod & Modifiers.ctrl) + s ~= "Ctrl+"; + if (mod & Modifiers.shift) + s ~= "Shift+"; + if (mod & Modifiers.meta) + s ~= "Meta+"; + if (mod & Modifiers.alt) + s ~= "Alt+"; + if (mod & Modifiers.hyper) + s ~= "Hyper+"; + + // Add button names + string[] buttons; + if (btn & Buttons.button1) + buttons ~= "Button1"; + if (btn & Buttons.button2) + buttons ~= "Button2"; + if (btn & Buttons.button3) + buttons ~= "Button3"; + if (btn & Buttons.button4) + buttons ~= "Button4"; + if (btn & Buttons.button5) + buttons ~= "Button5"; + if (btn & Buttons.button6) + buttons ~= "Button6"; + if (btn & Buttons.button7) + buttons ~= "Button7"; + if (btn & Buttons.button8) + buttons ~= "Button8"; + if (btn & Buttons.wheelUp) + buttons ~= "WheelUp"; + if (btn & Buttons.wheelDown) + buttons ~= "WheelDown"; + if (btn & Buttons.wheelLeft) + buttons ~= "WheelLeft"; + if (btn & Buttons.wheelRight) + buttons ~= "WheelRight"; + + if (buttons.length == 0) + s ~= "None"; + else + { + import std.array : join; + s ~= buttons.join("+"); + } + + s ~= format("@%s", pos.toString()); + return s; + } } From 83b411577c40b8d3c1de879f52843d2b80d86894 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dejan=20Leki=C4=87?= Date: Wed, 17 Dec 2025 12:01:19 +0000 Subject: [PATCH 02/12] Use Appender instead of plain string concatenation. --- source/dcell/mouse.d | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/source/dcell/mouse.d b/source/dcell/mouse.d index 4f188a2..489de24 100644 --- a/source/dcell/mouse.d +++ b/source/dcell/mouse.d @@ -10,6 +10,7 @@ */ module dcell.mouse; +import std.array : Appender; import std.format : format; public import dcell.coord; @@ -83,19 +84,19 @@ struct MouseEvent string toString() const pure { - string s = ""; + Appender!string s; // Add modifiers if (mod & Modifiers.ctrl) - s ~= "Ctrl+"; + s.put("Ctrl+"); if (mod & Modifiers.shift) - s ~= "Shift+"; + s.put("Shift+"); if (mod & Modifiers.meta) - s ~= "Meta+"; + s.put("Meta+"); if (mod & Modifiers.alt) - s ~= "Alt+"; + s.put("Alt+"); if (mod & Modifiers.hyper) - s ~= "Hyper+"; + s.put("Hyper+"); // Add button names string[] buttons; @@ -125,14 +126,14 @@ struct MouseEvent buttons ~= "WheelRight"; if (buttons.length == 0) - s ~= "None"; + s.put("None"); else { import std.array : join; - s ~= buttons.join("+"); + s.put(buttons.join("+")); } - s ~= format("@%s", pos.toString()); - return s; + s.put(format("@%s", pos.toString())); + return s.data; } } From 31fe5d1fa194ed170c11b7d938a4e5e251b7cf45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dejan=20Leki=C4=87?= Date: Thu, 8 Jan 2026 22:45:11 +0000 Subject: [PATCH 03/12] Now mouse events are correctly converted to strings --- source/dcell/mouse.d | 78 ++++++++++++++++++++++++-------------------- 1 file changed, 42 insertions(+), 36 deletions(-) diff --git a/source/dcell/mouse.d b/source/dcell/mouse.d index eb80953..716d993 100644 --- a/source/dcell/mouse.d +++ b/source/dcell/mouse.d @@ -17,7 +17,7 @@ public import dcell.coord; public import dcell.key : Modifiers; /** - * The buttons that may be clicked, etc. on a mouse. These can be cmobined + * The buttons that may be clicked, etc. on a mouse. These can be combined * together as a binary value to represent chording. Scroll wheels are * included. */ @@ -43,9 +43,48 @@ enum Buttons : short wheels = wheelUp | wheelDown | wheelLeft | wheelRight, } +/** + * toString returns a string representation of the buttons, with + * multiple buttons separated by '+'. + */ +string toString(Buttons btn) pure +{ + string[] buttons; + if (btn & Buttons.button1) + buttons ~= "Button1"; + if (btn & Buttons.button2) + buttons ~= "Button2"; + if (btn & Buttons.button3) + buttons ~= "Button3"; + if (btn & Buttons.button4) + buttons ~= "Button4"; + if (btn & Buttons.button5) + buttons ~= "Button5"; + if (btn & Buttons.button6) + buttons ~= "Button6"; + if (btn & Buttons.button7) + buttons ~= "Button7"; + if (btn & Buttons.button8) + buttons ~= "Button8"; + if (btn & Buttons.wheelUp) + buttons ~= "WheelUp"; + if (btn & Buttons.wheelDown) + buttons ~= "WheelDown"; + if (btn & Buttons.wheelLeft) + buttons ~= "WheelLeft"; + if (btn & Buttons.wheelRight) + buttons ~= "WheelRight"; + + if (buttons.length == 0) + return "None"; + + import std.array : join; + return buttons.join("+"); +} + /** * MouseEnable are the different modes that can be enabled for - * mouse tracking. The flagse can be OR'd together (except disable + * mouse tracking. The flags can be OR'd together (except disable * which should be used alone). */ enum MouseEnable @@ -99,40 +138,7 @@ struct MouseEvent if (mod & Modifiers.hyper) s.put("Hyper+"); - // Add button names - string[] buttons; - if (btn & Buttons.button1) - buttons ~= "Button1"; - if (btn & Buttons.button2) - buttons ~= "Button2"; - if (btn & Buttons.button3) - buttons ~= "Button3"; - if (btn & Buttons.button4) - buttons ~= "Button4"; - if (btn & Buttons.button5) - buttons ~= "Button5"; - if (btn & Buttons.button6) - buttons ~= "Button6"; - if (btn & Buttons.button7) - buttons ~= "Button7"; - if (btn & Buttons.button8) - buttons ~= "Button8"; - if (btn & Buttons.wheelUp) - buttons ~= "WheelUp"; - if (btn & Buttons.wheelDown) - buttons ~= "WheelDown"; - if (btn & Buttons.wheelLeft) - buttons ~= "WheelLeft"; - if (btn & Buttons.wheelRight) - buttons ~= "WheelRight"; - - if (buttons.length == 0) - s.put("None"); - else - { - import std.array : join; - s.put(buttons.join("+")); - } + s.put(dcell.mouse.toString(btn)); s.put(format("@%s", pos.toString())); return s.data; From 784885eb93e5a3b494583329004b3ee6adbb52f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dejan=20Leki=C4=87?= Date: Thu, 8 Jan 2026 23:40:24 +0000 Subject: [PATCH 04/12] Unittest --- source/dcell/mouse.d | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/source/dcell/mouse.d b/source/dcell/mouse.d index 716d993..547e590 100644 --- a/source/dcell/mouse.d +++ b/source/dcell/mouse.d @@ -144,3 +144,20 @@ struct MouseEvent return s.data; } } + +unittest +{ + MouseEvent ev; + ev.pos = Coord(10, 20); + ev.btn = cast(Buttons)(Buttons.button1 | Buttons.button2); + assert(ev.toString() == "Button1+Button2@(10, 20)"); + + ev.mod = Modifiers.ctrl | Modifiers.shift; + assert(ev.toString() == "Ctrl+Shift+Button1+Button2@(10, 20)"); + + ev.btn = Buttons.wheelUp; + assert(ev.toString() == "Ctrl+Shift+WheelUp@(10, 20)"); + + ev.btn = Buttons.wheels; + assert(ev.toString() == "Ctrl+Shift+WheelUp+WheelDown+WheelLeft+WheelRight@(10, 20)"); +} From 6b03688ecdc5a3196211a33ff7b0dae148c04491 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dejan=20Leki=C4=87?= Date: Thu, 8 Jan 2026 23:53:51 +0000 Subject: [PATCH 05/12] Updated unittest --- source/dcell/mouse.d | 89 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 76 insertions(+), 13 deletions(-) diff --git a/source/dcell/mouse.d b/source/dcell/mouse.d index 547e590..40f6325 100644 --- a/source/dcell/mouse.d +++ b/source/dcell/mouse.d @@ -49,31 +49,84 @@ enum Buttons : short */ string toString(Buttons btn) pure { + if (btn == Buttons.none) + return "None"; + string[] buttons; - if (btn & Buttons.button1) + Buttons remaining = btn; + + if (remaining & Buttons.button1) + { buttons ~= "Button1"; - if (btn & Buttons.button2) + remaining &= ~Buttons.button1; + } + if (remaining & Buttons.button2) + { buttons ~= "Button2"; - if (btn & Buttons.button3) + remaining &= ~Buttons.button2; + } + if (remaining & Buttons.button3) + { buttons ~= "Button3"; - if (btn & Buttons.button4) + remaining &= ~Buttons.button3; + } + if (remaining & Buttons.button4) + { buttons ~= "Button4"; - if (btn & Buttons.button5) + remaining &= ~Buttons.button4; + } + if (remaining & Buttons.button5) + { buttons ~= "Button5"; - if (btn & Buttons.button6) + remaining &= ~Buttons.button5; + } + if (remaining & Buttons.button6) + { buttons ~= "Button6"; - if (btn & Buttons.button7) + remaining &= ~Buttons.button6; + } + if (remaining & Buttons.button7) + { buttons ~= "Button7"; - if (btn & Buttons.button8) + remaining &= ~Buttons.button7; + } + if (remaining & Buttons.button8) + { buttons ~= "Button8"; - if (btn & Buttons.wheelUp) + remaining &= ~Buttons.button8; + } + + if ((remaining & Buttons.wheels) == Buttons.wheels && Buttons.wheels != 0) + { + buttons ~= "Wheels"; + remaining &= ~Buttons.wheels; + } + + if (remaining & Buttons.wheelUp) + { buttons ~= "WheelUp"; - if (btn & Buttons.wheelDown) + remaining &= ~Buttons.wheelUp; + } + if (remaining & Buttons.wheelDown) + { buttons ~= "WheelDown"; - if (btn & Buttons.wheelLeft) + remaining &= ~Buttons.wheelDown; + } + if (remaining & Buttons.wheelLeft) + { buttons ~= "WheelLeft"; - if (btn & Buttons.wheelRight) + remaining &= ~Buttons.wheelLeft; + } + if (remaining & Buttons.wheelRight) + { buttons ~= "WheelRight"; + remaining &= ~Buttons.wheelRight; + } + + if (remaining != Buttons.none) + { + buttons ~= format("Buttons(%04X)", cast(short) remaining); + } if (buttons.length == 0) return "None"; @@ -82,6 +135,7 @@ string toString(Buttons btn) pure return buttons.join("+"); } + /** * MouseEnable are the different modes that can be enabled for * mouse tracking. The flags can be OR'd together (except disable @@ -159,5 +213,14 @@ unittest assert(ev.toString() == "Ctrl+Shift+WheelUp@(10, 20)"); ev.btn = Buttons.wheels; - assert(ev.toString() == "Ctrl+Shift+WheelUp+WheelDown+WheelLeft+WheelRight@(10, 20)"); + assert(ev.toString() == "Ctrl+Shift+Wheels@(10, 20)"); + + ev.btn = cast(Buttons)(Buttons.button1 | Buttons.wheels); + assert(ev.toString() == "Ctrl+Shift+Button1+Wheels@(10, 20)"); + + // Test toString explicitly + assert(dcell.mouse.toString(cast(Buttons)(Buttons.button1 | Buttons.button2)) == "Button1+Button2"); + assert(dcell.mouse.toString(Buttons.wheels) == "Wheels"); + assert(dcell.mouse.toString(cast(Buttons) 0x8000) == "Buttons(8000)"); + assert(dcell.mouse.toString(cast(Buttons)(Buttons.button1 | 0x8000)) == "Button1+Buttons(8000)"); } From 23a58974c9061557d8fe7556ba3bff3af9270451 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dejan=20Leki=C4=87?= Date: Fri, 9 Jan 2026 15:26:32 +0000 Subject: [PATCH 06/12] Applied coderabbitai's suggestion. --- source/dcell/mouse.d | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/dcell/mouse.d b/source/dcell/mouse.d index 40f6325..9ce5427 100644 --- a/source/dcell/mouse.d +++ b/source/dcell/mouse.d @@ -96,7 +96,7 @@ string toString(Buttons btn) pure remaining &= ~Buttons.button8; } - if ((remaining & Buttons.wheels) == Buttons.wheels && Buttons.wheels != 0) + if ((remaining & Buttons.wheels) == Buttons.wheels) { buttons ~= "Wheels"; remaining &= ~Buttons.wheels; From acbb351d59ce62d9ccb8e301a08107109de96488 Mon Sep 17 00:00:00 2001 From: Dejan Lekic Date: Sat, 10 Jan 2026 10:52:04 +0000 Subject: [PATCH 07/12] Updated to do cast(ushort) Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- source/dcell/mouse.d | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/dcell/mouse.d b/source/dcell/mouse.d index 9ce5427..144ab96 100644 --- a/source/dcell/mouse.d +++ b/source/dcell/mouse.d @@ -125,7 +125,7 @@ string toString(Buttons btn) pure if (remaining != Buttons.none) { - buttons ~= format("Buttons(%04X)", cast(short) remaining); + buttons ~= format("Buttons(%04X)", cast(ushort) remaining); } if (buttons.length == 0) From eb46cc7de48528d5491b82a87efd669379e666bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dejan=20Leki=C4=87?= Date: Sun, 11 Jan 2026 11:15:31 +0000 Subject: [PATCH 08/12] Removed the redundant check --- source/dcell/mouse.d | 6 ------ 1 file changed, 6 deletions(-) diff --git a/source/dcell/mouse.d b/source/dcell/mouse.d index 144ab96..9ab1869 100644 --- a/source/dcell/mouse.d +++ b/source/dcell/mouse.d @@ -96,12 +96,6 @@ string toString(Buttons btn) pure remaining &= ~Buttons.button8; } - if ((remaining & Buttons.wheels) == Buttons.wheels) - { - buttons ~= "Wheels"; - remaining &= ~Buttons.wheels; - } - if (remaining & Buttons.wheelUp) { buttons ~= "WheelUp"; From bffc1bcf1ffcefba99b3965f0887c30107feed42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dejan=20Leki=C4=87?= Date: Sun, 11 Jan 2026 11:26:34 +0000 Subject: [PATCH 09/12] Fixed the failing build and removed the redundant check in the dcell.mouse.toString(Buttons) --- source/dcell/color.d | 2 +- source/dcell/mouse.d | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/source/dcell/color.d b/source/dcell/color.d index 156fec4..e6fbc74 100644 --- a/source/dcell/color.d +++ b/source/dcell/color.d @@ -171,7 +171,7 @@ enum Color : uint private static immutable uint[Color] rgbValues; private static immutable Color[uint] palValues; -shared static this() @safe +shared static this() @trusted { rgbValues[Color.black] = 0x000000; rgbValues[Color.maroon] = 0x800000; diff --git a/source/dcell/mouse.d b/source/dcell/mouse.d index 9ab1869..2e0017d 100644 --- a/source/dcell/mouse.d +++ b/source/dcell/mouse.d @@ -207,14 +207,14 @@ unittest assert(ev.toString() == "Ctrl+Shift+WheelUp@(10, 20)"); ev.btn = Buttons.wheels; - assert(ev.toString() == "Ctrl+Shift+Wheels@(10, 20)"); + assert(ev.toString() == "Ctrl+Shift+WheelUp+WheelDown+WheelLeft+WheelRight@(10, 20)"); ev.btn = cast(Buttons)(Buttons.button1 | Buttons.wheels); - assert(ev.toString() == "Ctrl+Shift+Button1+Wheels@(10, 20)"); + assert(ev.toString() == "Ctrl+Shift+Button1+WheelUp+WheelDown+WheelLeft+WheelRight@(10, 20)"); // Test toString explicitly assert(dcell.mouse.toString(cast(Buttons)(Buttons.button1 | Buttons.button2)) == "Button1+Button2"); - assert(dcell.mouse.toString(Buttons.wheels) == "Wheels"); + assert(dcell.mouse.toString(Buttons.wheels) == "WheelUp+WheelDown+WheelLeft+WheelRight"); assert(dcell.mouse.toString(cast(Buttons) 0x8000) == "Buttons(8000)"); assert(dcell.mouse.toString(cast(Buttons)(Buttons.button1 | 0x8000)) == "Button1+Buttons(8000)"); } From f447acdb2caa9dd90d7441eadd3adf99df544a8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dejan=20Leki=C4=87?= Date: Sun, 11 Jan 2026 11:34:33 +0000 Subject: [PATCH 10/12] Remove unreachable code. --- source/dcell/mouse.d | 3 --- 1 file changed, 3 deletions(-) diff --git a/source/dcell/mouse.d b/source/dcell/mouse.d index 2e0017d..9d5ee3e 100644 --- a/source/dcell/mouse.d +++ b/source/dcell/mouse.d @@ -122,9 +122,6 @@ string toString(Buttons btn) pure buttons ~= format("Buttons(%04X)", cast(ushort) remaining); } - if (buttons.length == 0) - return "None"; - import std.array : join; return buttons.join("+"); } From d68b7c222daded609625a49a954a551cc867edc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dejan=20Leki=C4=87?= Date: Sun, 11 Jan 2026 11:41:21 +0000 Subject: [PATCH 11/12] dcell.mouse.toString now uses Appender!string instead of plain concatenation. Buttons.none added to the unittest. --- source/dcell/mouse.d | 46 +++++++++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/source/dcell/mouse.d b/source/dcell/mouse.d index 9d5ee3e..d3b3edd 100644 --- a/source/dcell/mouse.d +++ b/source/dcell/mouse.d @@ -52,78 +52,86 @@ string toString(Buttons btn) pure if (btn == Buttons.none) return "None"; - string[] buttons; + Appender!string s; Buttons remaining = btn; + bool first = true; + + void add(string name) + { + if (!first) + s.put("+"); + s.put(name); + first = false; + } if (remaining & Buttons.button1) { - buttons ~= "Button1"; + add("Button1"); remaining &= ~Buttons.button1; } if (remaining & Buttons.button2) { - buttons ~= "Button2"; + add("Button2"); remaining &= ~Buttons.button2; } if (remaining & Buttons.button3) { - buttons ~= "Button3"; + add("Button3"); remaining &= ~Buttons.button3; } if (remaining & Buttons.button4) { - buttons ~= "Button4"; + add("Button4"); remaining &= ~Buttons.button4; } if (remaining & Buttons.button5) { - buttons ~= "Button5"; + add("Button5"); remaining &= ~Buttons.button5; } if (remaining & Buttons.button6) { - buttons ~= "Button6"; + add("Button6"); remaining &= ~Buttons.button6; } if (remaining & Buttons.button7) { - buttons ~= "Button7"; + add("Button7"); remaining &= ~Buttons.button7; } if (remaining & Buttons.button8) { - buttons ~= "Button8"; + add("Button8"); remaining &= ~Buttons.button8; } if (remaining & Buttons.wheelUp) { - buttons ~= "WheelUp"; + add("WheelUp"); remaining &= ~Buttons.wheelUp; } if (remaining & Buttons.wheelDown) { - buttons ~= "WheelDown"; + add("WheelDown"); remaining &= ~Buttons.wheelDown; } if (remaining & Buttons.wheelLeft) { - buttons ~= "WheelLeft"; + add("WheelLeft"); remaining &= ~Buttons.wheelLeft; } if (remaining & Buttons.wheelRight) { - buttons ~= "WheelRight"; + add("WheelRight"); remaining &= ~Buttons.wheelRight; } if (remaining != Buttons.none) { - buttons ~= format("Buttons(%04X)", cast(ushort) remaining); + add(format("Buttons(%04X)", cast(ushort) remaining)); } - import std.array : join; - return buttons.join("+"); + return s.data; } @@ -192,6 +200,12 @@ struct MouseEvent unittest { + + MouseEvent evNone; + evNone.pos = Coord(5, 10); + evNone.btn = Buttons.none; + assert(evNone.toString() == "None@(5, 10)"); + MouseEvent ev; ev.pos = Coord(10, 20); ev.btn = cast(Buttons)(Buttons.button1 | Buttons.button2); From 5cca08db0e75c3f4b2e1505cd67726a3934246d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dejan=20Leki=C4=87?= Date: Sun, 11 Jan 2026 11:56:40 +0000 Subject: [PATCH 12/12] Removed an empty line. --- source/dcell/mouse.d | 1 - 1 file changed, 1 deletion(-) diff --git a/source/dcell/mouse.d b/source/dcell/mouse.d index d3b3edd..b616c43 100644 --- a/source/dcell/mouse.d +++ b/source/dcell/mouse.d @@ -200,7 +200,6 @@ struct MouseEvent unittest { - MouseEvent evNone; evNone.pos = Coord(5, 10); evNone.btn = Buttons.none;