commit a067880

uint  ·  2026-06-05 13:26:44 +0000 UTC
parent b199f0e
X11: Add atom support, use WM_DELETE_WINDOW atom for close window
2 files changed,  +28, -9
+21, -9
 1@@ -11,9 +11,12 @@ static bool handle_event(XEvent* xev, MausEvent* ev, Maus* mw);
 2 static bool handle_event(XEvent* xev, MausEvent* ev, Maus* mw)
 3 {
 4 	switch (xev->type) {
 5-		case ClientMessage: /* TODO proper quit handling */
 6-			ev->type = MAUS_EV_CLOSE;
 7-			return true;
 8+		case ClientMessage:
 9+			if ((Atom)xev->xclient.data.l[0] == mw->atoms[MAUS_ATOM_WM_DELETE_WINDOW]) {
10+				ev->type = MAUS_EV_CLOSE;
11+				return true;
12+			}
13+			break;
14 
15 		case KeyPress:
16 			ev->type = MAUS_EV_KEY;
17@@ -84,23 +87,32 @@ bool maus_close_window(Maus* mw)
18 
19 bool maus_create_window(Maus* mw)
20 {
21-	mw->win = XCreateSimpleWindow(
22-		mw->display, mw->root,
23+	Display* dpy = mw->display;
24+	Window* win = &mw->win;
25+
26+	*win = XCreateSimpleWindow(
27+		dpy, mw->root,
28 		mw->x, mw->y,
29 		mw->width, mw->height,
30 		0u, 0u, 0u
31 	);
32 
33-	if (mw->win == None)
34+	if (*win == None)
35 		return false;
36 
37-	XSelectInput(mw->display, mw->win,
38+	XSelectInput(dpy, *win,
39 		ExposureMask | KeyPressMask | KeyReleaseMask | ButtonPressMask |
40 		ButtonReleaseMask | PointerMotionMask | StructureNotifyMask
41 	);
42 
43-	XMapWindow(mw->display, mw->win);
44-	XFlush(mw->display);
45+	/* atoms */
46+	mw->atoms[MAUS_ATOM_WM_DELETE_WINDOW] = XInternAtom(dpy, "WM_DELETE_WINDOW", False);
47+
48+	XSetWMProtocols(dpy, *win, &mw->atoms[MAUS_ATOM_WM_DELETE_WINDOW], 1);
49+	XStoreName(dpy, *win, mw->title);
50+
51+	XMapWindow(dpy, *win);
52+	XFlush(dpy);
53 
54 	return true;
55 }
+7, -0
 1@@ -6,10 +6,16 @@
 2 
 3 #include <X11/Xlib.h>
 4 
 5+typedef enum {
 6+	MAUS_ATOM_WM_DELETE_WINDOW,
 7+	MAUS_ATOM_LAST,
 8+} MausX11Atoms;
 9+
10 typedef struct {
11 	Display*       display;
12 	Window         root;
13 	Window         win;
14+	Atom           atoms[MAUS_ATOM_LAST];
15 
16 	const char*    title;
17 	uint32_t       width;
18@@ -18,6 +24,7 @@ typedef struct {
19 	int32_t        y;
20 
21 	uint32_t*      pixels;
22+	bool           keys[256];
23 } Maus;
24 
25 #endif /* MAUS_X11_H */