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 */