diff --git a/fenster.h b/fenster.h index ed4332e..d00a7bf 100644 --- a/fenster.h +++ b/fenster.h @@ -258,6 +258,7 @@ FENSTER_API int fenster_loop(struct fenster *f) { #else // clang-format off static int FENSTER_KEYCODES[124] = {XK_BackSpace,8,XK_Delete,127,XK_Down,18,XK_End,5,XK_Escape,27,XK_Home,2,XK_Insert,26,XK_Left,20,XK_Page_Down,4,XK_Page_Up,3,XK_Return,10,XK_Right,19,XK_Tab,9,XK_Up,17,XK_apostrophe,39,XK_backslash,92,XK_bracketleft,91,XK_bracketright,93,XK_comma,44,XK_equal,61,XK_grave,96,XK_minus,45,XK_period,46,XK_semicolon,59,XK_slash,47,XK_space,32,XK_a,65,XK_b,66,XK_c,67,XK_d,68,XK_e,69,XK_f,70,XK_g,71,XK_h,72,XK_i,73,XK_j,74,XK_k,75,XK_l,76,XK_m,77,XK_n,78,XK_o,79,XK_p,80,XK_q,81,XK_r,82,XK_s,83,XK_t,84,XK_u,85,XK_v,86,XK_w,87,XK_x,88,XK_y,89,XK_z,90,XK_0,48,XK_1,49,XK_2,50,XK_3,51,XK_4,52,XK_5,53,XK_6,54,XK_7,55,XK_8,56,XK_9,57}; +static Atom wmDeleteWindow; // clang-format on FENSTER_API int fenster_open(struct fenster *f) { f->dpy = XOpenDisplay(NULL); @@ -266,9 +267,11 @@ FENSTER_API int fenster_open(struct fenster *f) { f->height, 0, BlackPixel(f->dpy, screen), WhitePixel(f->dpy, screen)); f->gc = XCreateGC(f->dpy, f->w, 0, 0); + wmDeleteWindow = XInternAtom(f->dpy, "WM_DELETE_WINDOW", False); + XSetWMProtocols(f->dpy, f->w, &wmDeleteWindow, 1); XSelectInput(f->dpy, f->w, ExposureMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | - ButtonReleaseMask | PointerMotionMask); + ButtonReleaseMask | PointerMotionMask | StructureNotifyMask); XStoreName(f->dpy, f->w, f->title); XMapWindow(f->dpy, f->w); XSync(f->dpy, f->w); @@ -276,7 +279,10 @@ FENSTER_API int fenster_open(struct fenster *f) { (char *)f->buf, f->width, f->height, 32, 0); return 0; } -FENSTER_API void fenster_close(struct fenster *f) { XCloseDisplay(f->dpy); } +FENSTER_API void fenster_close(struct fenster *f) { + XDestroyWindow(f->dpy, f->w); + XCloseDisplay(f->dpy); +} FENSTER_API int fenster_loop(struct fenster *f) { XEvent ev; XPutImage(f->dpy, f->w, f->gc, f->img, 0, 0, 0, 0, f->width, f->height); @@ -284,6 +290,11 @@ FENSTER_API int fenster_loop(struct fenster *f) { while (XPending(f->dpy)) { XNextEvent(f->dpy, &ev); switch (ev.type) { + case ClientMessage: + if ((Atom)ev.xclient.data.l[0] == wmDeleteWindow) { + return 1; + } + break; case ButtonPress: case ButtonRelease: f->mouse = (ev.type == ButtonPress);