From f18de447f6df235068be395848fa637bd267d657 Mon Sep 17 00:00:00 2001 From: David Maciejak Date: Wed, 10 Jun 2026 16:37:35 -0400 Subject: [PATCH] wmaker: grab the keyboard during partial screenshot selection imageCaptureArea() already looked for XK_Escape in its event loop but only grabbed the pointer, so the KeyPress went to the focused client and the cancel branch was unreachable. Grab the keyboard for the duration of the rubber-band selection, erase the XOR rectangle when Escape aborts mid-drag, and release the keyboard on every exit path. --- src/screen.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/screen.c b/src/screen.c index 8cb27487..b8f83af9 100644 --- a/src/screen.c +++ b/src/screen.c @@ -1143,6 +1143,7 @@ static XImage *imageCaptureArea(WScreen *scr) GrabModeAsync, None, wPreferences.cursor[WCUR_CAPTURE], CurrentTime) != Success) { return NULL; } + XGrabKeyboard(dpy, scr->root_win, False, GrabModeAsync, GrabModeAsync, CurrentTime); XGrabServer(dpy); @@ -1162,6 +1163,7 @@ static XImage *imageCaptureArea(WScreen *scr) if (w > 0 && h > 0) { XDrawRectangle(dpy, scr->root_win, scr->frame_gc, x, y, w, h); XUngrabServer(dpy); + XUngrabKeyboard(dpy, CurrentTime); XUngrabPointer(dpy, CurrentTime); return XGetImage(dpy, scr->root_win, x, y, w, h, AllPlanes, ZPixmap); } @@ -1186,8 +1188,11 @@ static XImage *imageCaptureArea(WScreen *scr) XDrawRectangle(dpy, scr->root_win, scr->frame_gc, x, y, w, h); break; case KeyPress: - if (W_KeycodeToKeysym(dpy, event.xkey.keycode, 0) == XK_Escape) + if (W_KeycodeToKeysym(dpy, event.xkey.keycode, 0) == XK_Escape) { + if (w > 0 && h > 0) + XDrawRectangle(dpy, scr->root_win, scr->frame_gc, x, y, w, h); quit = 1; + } break; default: WMHandleEvent(&event); @@ -1196,6 +1201,7 @@ static XImage *imageCaptureArea(WScreen *scr) } XUngrabServer(dpy); + XUngrabKeyboard(dpy, CurrentTime); XUngrabPointer(dpy, CurrentTime); return NULL; }