win32 standalone gui

This commit is contained in:
Jonathan Marler 2024-07-20 16:05:00 -06:00 committed by CJ van den Berg
parent 1ad6b8db3d
commit 1a595871dd
Signed by: neurocyte
GPG key ID: 8EB1E1BB660E3FB9
10 changed files with 1773 additions and 1 deletions

365
src/win32/windowmsg.zig Normal file
View file

@ -0,0 +1,365 @@
const std = @import("std");
const win32 = @import("win32").everything;
pub fn pointFromLparam(lparam: win32.LPARAM) win32.POINT {
return .{
.x = @as(i16, @bitCast(win32.loword(lparam))),
.y = @as(i16, @bitCast(win32.hiword(lparam))),
};
}
pub const MessageNode = struct {
tail_ref: *?*MessageNode,
hwnd: win32.HWND,
msg: u32,
wparam: win32.WPARAM,
lparam: win32.LPARAM,
old_tail: ?*MessageNode,
pub fn init(
self: *MessageNode,
tail_ref: *?*MessageNode,
hwnd: win32.HWND,
msg: u32,
wparam: win32.WPARAM,
lparam: win32.LPARAM,
) void {
if (tail_ref.*) |old_tail| {
std.debug.assert(old_tail.hwnd == hwnd);
}
self.* = .{
.tail_ref = tail_ref,
.hwnd = hwnd,
.msg = msg,
.wparam = wparam,
.lparam = lparam,
.old_tail = tail_ref.*,
};
tail_ref.* = self;
}
pub fn deinit(self: *MessageNode) void {
std.debug.assert(self.tail_ref.* == self);
self.tail_ref.* = self.old_tail;
}
pub fn fmtPath(self: *MessageNode) FmtPath {
return .{ .node = self };
}
};
fn writeMessageNodePath(
writer: anytype,
node: *MessageNode,
) !void {
if (node.old_tail) |old_tail| {
try writeMessageNodePath(writer, old_tail);
try writer.writeAll(" > ");
}
try writer.print("{s}:{}", .{ msg_name(node.msg) orelse "?", node.msg });
switch (node.msg) {
win32.WM_NCMOUSEMOVE,
win32.WM_NCLBUTTONDOWN,
=> {
const hit_value = node.wparam;
const point = pointFromLparam(node.lparam);
try writer.print(
"(hit={s}:{},point={},{})",
.{ getHitName(@bitCast(hit_value)) orelse "?", hit_value, point.x, point.y },
);
},
win32.WM_NCHITTEST,
win32.WM_MOUSEMOVE,
=> {
const point = pointFromLparam(node.lparam);
try writer.print("({},{})", .{ point.x, point.y });
},
win32.WM_CAPTURECHANGED => {
try writer.print("({})", .{node.lparam});
},
win32.WM_SYSCOMMAND => {
try writer.print("(type=0x{x})", .{0xfff0 & node.wparam});
},
else => {},
}
}
const FmtPath = struct {
node: *MessageNode,
const Self = @This();
pub fn format(
self: Self,
comptime fmt: []const u8,
options: std.fmt.FormatOptions,
writer: anytype,
) @TypeOf(writer).Error!void {
_ = fmt;
_ = options;
try writeMessageNodePath(writer, self.node);
}
};
pub fn msg_name(msg: u32) ?[]const u8 {
return switch (msg) {
0 => "WM_NULL",
1 => "WM_CREATE",
2 => "WM_DESTROY",
3 => "WM_MOVE",
5 => "WM_SIZE",
6 => "WM_ACTIVATE",
7 => "WM_SETFOCUS",
8 => "WM_KILLFOCUS",
10 => "WM_ENABLE",
11 => "WM_SETREDRAW",
12 => "WM_SETTEXT",
13 => "WM_GETTEXT",
14 => "WM_GETTEXTLENGTH",
15 => "WM_PAINT",
16 => "WM_CLOSE",
17 => "WM_QUERYENDSESSION",
18 => "WM_QUIT",
19 => "WM_QUERYOPEN",
20 => "WM_ERASEBKGND",
21 => "WM_SYSCOLORCHANGE",
22 => "WM_ENDSESSION",
24 => "WM_SHOWWINDOW",
25 => "WM_CTLCOLOR",
26 => "WM_WININICHANGE",
27 => "WM_DEVMODECHANGE",
28 => "WM_ACTIVATEAPP",
29 => "WM_FONTCHANGE",
30 => "WM_TIMECHANGE",
31 => "WM_CANCELMODE",
32 => "WM_SETCURSOR",
33 => "WM_MOUSEACTIVATE",
34 => "WM_CHILDACTIVATE",
35 => "WM_QUEUESYNC",
36 => "WM_GETMINMAXINFO",
38 => "WM_PAINTICON",
39 => "WM_ICONERASEBKGND",
40 => "WM_NEXTDLGCTL",
42 => "WM_SPOOLERSTATUS",
43 => "WM_DRAWITEM",
44 => "WM_MEASUREITEM",
45 => "WM_DELETEITEM",
46 => "WM_VKEYTOITEM",
47 => "WM_CHARTOITEM",
48 => "WM_SETFONT",
49 => "WM_GETFONT",
50 => "WM_SETHOTKEY",
51 => "WM_GETHOTKEY",
55 => "WM_QUERYDRAGICON",
57 => "WM_COMPAREITEM",
61 => "WM_GETOBJECT",
65 => "WM_COMPACTING",
68 => "WM_COMMNOTIFY",
70 => "WM_WINDOWPOSCHANGING",
71 => "WM_WINDOWPOSCHANGED",
72 => "WM_POWER",
73 => "WM_COPYGLOBALDATA",
74 => "WM_COPYDATA",
75 => "WM_CANCELJOURNAL",
78 => "WM_NOTIFY",
80 => "WM_INPUTLANGCHANGEREQUEST",
81 => "WM_INPUTLANGCHANGE",
82 => "WM_TCARD",
83 => "WM_HELP",
84 => "WM_USERCHANGED",
85 => "WM_NOTIFYFORMAT",
123 => "WM_CONTEXTMENU",
124 => "WM_STYLECHANGING",
125 => "WM_STYLECHANGED",
126 => "WM_DISPLAYCHANGE",
127 => "WM_GETICON",
128 => "WM_SETICON",
129 => "WM_NCCREATE",
130 => "WM_NCDESTROY",
131 => "WM_NCCALCSIZE",
132 => "WM_NCHITTEST",
133 => "WM_NCPAINT",
134 => "WM_NCACTIVATE",
135 => "WM_GETDLGCODE",
136 => "WM_SYNCPAINT",
160 => "WM_NCMOUSEMOVE",
161 => "WM_NCLBUTTONDOWN",
162 => "WM_NCLBUTTONUP",
163 => "WM_NCLBUTTONDBLCLK",
164 => "WM_NCRBUTTONDOWN",
165 => "WM_NCRBUTTONUP",
166 => "WM_NCRBUTTONDBLCLK",
167 => "WM_NCMBUTTONDOWN",
168 => "WM_NCMBUTTONUP",
169 => "WM_NCMBUTTONDBLCLK",
171 => "WM_NCXBUTTONDOWN",
172 => "WM_NCXBUTTONUP",
173 => "WM_NCXBUTTONDBLCLK",
255 => "WM_INPUT",
256 => "WM_KEYDOWN",
257 => "WM_KEYUP",
258 => "WM_CHAR",
259 => "WM_DEADCHAR",
260 => "WM_SYSKEYDOWN",
261 => "WM_SYSKEYUP",
262 => "WM_SYSCHAR",
263 => "WM_SYSDEADCHAR",
265 => "WM_UNICHAR",
266 => "WM_CONVERTREQUEST",
267 => "WM_CONVERTRESULT",
268 => "WM_INTERIM",
269 => "WM_IME_STARTCOMPOSITION",
270 => "WM_IME_ENDCOMPOSITION",
271 => "WM_IME_COMPOSITION",
272 => "WM_INITDIALOG",
273 => "WM_COMMAND",
274 => "WM_SYSCOMMAND",
275 => "WM_TIMER",
276 => "WM_HSCROLL",
277 => "WM_VSCROLL",
278 => "WM_INITMENU",
279 => "WM_INITMENUPOPUP",
280 => "WM_SYSTIMER",
287 => "WM_MENUSELECT",
288 => "WM_MENUCHAR",
289 => "WM_ENTERIDLE",
290 => "WM_MENURBUTTONUP",
291 => "WM_MENUDRAG",
292 => "WM_MENUGETOBJECT",
293 => "WM_UNINITMENUPOPUP",
294 => "WM_MENUCOMMAND",
295 => "WM_CHANGEUISTATE",
296 => "WM_UPDATEUISTATE",
297 => "WM_QUERYUISTATE",
305 => "WM_LBTRACKPOINT",
306 => "WM_CTLCOLORMSGBOX",
307 => "WM_CTLCOLOREDIT",
308 => "WM_CTLCOLORLISTBOX",
309 => "WM_CTLCOLORBTN",
310 => "WM_CTLCOLORDLG",
311 => "WM_CTLCOLORSCROLLBAR",
312 => "WM_CTLCOLORSTATIC",
512 => "WM_MOUSEMOVE",
513 => "WM_LBUTTONDOWN",
514 => "WM_LBUTTONUP",
515 => "WM_LBUTTONDBLCLK",
516 => "WM_RBUTTONDOWN",
517 => "WM_RBUTTONUP",
518 => "WM_RBUTTONDBLCLK",
519 => "WM_MBUTTONDOWN",
520 => "WM_MBUTTONUP",
521 => "WM_MBUTTONDBLCLK",
522 => "WM_MOUSEWHEEL",
523 => "WM_XBUTTONDOWN",
524 => "WM_XBUTTONUP",
525 => "WM_XBUTTONDBLCLK",
526 => "WM_MOUSEHWHEEL",
528 => "WM_PARENTNOTIFY",
529 => "WM_ENTERMENULOOP",
530 => "WM_EXITMENULOOP",
531 => "WM_NEXTMENU",
532 => "WM_SIZING",
533 => "WM_CAPTURECHANGED",
534 => "WM_MOVING",
536 => "WM_POWERBROADCAST",
537 => "WM_DEVICECHANGE",
544 => "WM_MDICREATE",
545 => "WM_MDIDESTROY",
546 => "WM_MDIACTIVATE",
547 => "WM_MDIRESTORE",
548 => "WM_MDINEXT",
549 => "WM_MDIMAXIMIZE",
550 => "WM_MDITILE",
551 => "WM_MDICASCADE",
552 => "WM_MDIICONARRANGE",
553 => "WM_MDIGETACTIVE",
560 => "WM_MDISETMENU",
561 => "WM_ENTERSIZEMOVE",
562 => "WM_EXITSIZEMOVE",
563 => "WM_DROPFILES",
564 => "WM_MDIREFRESHMENU",
640 => "WM_IME_REPORT",
641 => "WM_IME_SETCONTEXT",
642 => "WM_IME_NOTIFY",
643 => "WM_IME_CONTROL",
644 => "WM_IME_COMPOSITIONFULL",
645 => "WM_IME_SELECT",
646 => "WM_IME_CHAR",
648 => "WM_IME_REQUEST",
656 => "WM_IME_KEYDOWN",
657 => "WM_IME_KEYUP",
672 => "WM_NCMOUSEHOVER",
673 => "WM_MOUSEHOVER",
674 => "WM_NCMOUSELEAVE",
675 => "WM_MOUSELEAVE",
768 => "WM_CUT",
769 => "WM_COPY",
770 => "WM_PASTE",
771 => "WM_CLEAR",
772 => "WM_UNDO",
773 => "WM_RENDERFORMAT",
774 => "WM_RENDERALLFORMATS",
775 => "WM_DESTROYCLIPBOARD",
776 => "WM_DRAWCLIPBOARD",
777 => "WM_PAINTCLIPBOARD",
778 => "WM_VSCROLLCLIPBOARD",
779 => "WM_SIZECLIPBOARD",
780 => "WM_ASKCBFORMATNAME",
781 => "WM_CHANGECBCHAIN",
782 => "WM_HSCROLLCLIPBOARD",
783 => "WM_QUERYNEWPALETTE",
784 => "WM_PALETTEISCHANGING",
785 => "WM_PALETTECHANGED",
786 => "WM_HOTKEY",
791 => "WM_PRINT",
792 => "WM_PRINTCLIENT",
793 => "WM_APPCOMMAND",
799 => "WM_DWMNCRENDERINGCHANGED",
856 => "WM_HANDHELDFIRST",
863 => "WM_HANDHELDLAST",
864 => "WM_AFXFIRST",
895 => "WM_AFXLAST",
896 => "WM_PENWINFIRST",
897 => "WM_RCRESULT",
898 => "WM_HOOKRCRESULT",
899 => "WM_GLOBALRCCHANGE",
900 => "WM_SKB",
901 => "WM_PENCTL",
902 => "WM_PENMISC",
903 => "WM_CTLINIT",
904 => "WM_PENEVENT",
911 => "WM_PENWINLAST",
1024 => "WM_USER+0",
1025 => "WM_USER+1",
1026 => "WM_USER+2",
1027 => "WM_USER+3",
1028 => "WM_USER+4",
1029 => "WM_USER+5",
1030 => "WM_USER+6",
else => null,
};
}
pub fn getHitName(hit: win32.LRESULT) ?[]const u8 {
return switch (hit) {
win32.HTERROR => "err",
win32.HTTRANSPARENT => "transprnt",
win32.HTNOWHERE => "nowhere",
win32.HTCLIENT => "client",
win32.HTCAPTION => "caption",
win32.HTSYSMENU => "sysmnu",
win32.HTSIZE => "size",
win32.HTMENU => "menu",
win32.HTHSCROLL => "hscroll",
win32.HTVSCROLL => "vscroll",
win32.HTMINBUTTON => "minbtn",
win32.HTMAXBUTTON => "max",
win32.HTLEFT => "left",
win32.HTRIGHT => "right",
win32.HTTOP => "top",
win32.HTTOPLEFT => "topleft",
win32.HTTOPRIGHT => "topright",
win32.HTBOTTOM => "bottom",
win32.HTBOTTOMLEFT => "botmleft",
win32.HTBOTTOMRIGHT => "botmright",
win32.HTBORDER => "border",
win32.HTCLOSE => "close",
win32.HTHELP => "help",
else => null,
};
}