aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2025-03-15 09:31:06 +0100
committerdec05eba <dec05eba@protonmail.com>2025-03-15 09:31:06 +0100
commitd45897164ab808b7aa02ea1e6a5990b067ecbac1 (patch)
treeeead8662aa0054795c6a77b5bf5c6306e067c19e /src
parentd8a0b49bc2055e340dd5f3fe5f3dc9145fb58d63 (diff)
Esc to close region selection
Diffstat (limited to 'src')
-rw-r--r--src/Overlay.cpp6
-rw-r--r--src/RegionSelector.cpp21
2 files changed, 23 insertions, 4 deletions
diff --git a/src/Overlay.cpp b/src/Overlay.cpp
index d98bc54..1147cc7 100644
--- a/src/Overlay.cpp
+++ b/src/Overlay.cpp
@@ -592,7 +592,9 @@ namespace gsr {
handle_keyboard_mapping_event();
region_selector.poll_events();
- if(region_selector.take_selection() && on_region_selected) {
+ if(region_selector.take_canceled()) {
+ on_region_selected = nullptr;
+ } else if(region_selector.take_selection() && on_region_selected) {
on_region_selected();
on_region_selected = nullptr;
}
@@ -635,7 +637,7 @@ namespace gsr {
start_region_capture = false;
hide();
if(!region_selector.start(get_color_theme().tint_color)) {
- show_notification("Failed to start region capture", notification_error_timeout_seconds, mgl::Color(255, 0, 0, 0), mgl::Color(255, 0, 0, 0), NotificationType::RECORD);
+ show_notification("Failed to start region capture", notification_error_timeout_seconds, mgl::Color(255, 0, 0, 0), mgl::Color(255, 0, 0, 0), NotificationType::NONE);
on_region_selected = nullptr;
}
}
diff --git a/src/RegionSelector.cpp b/src/RegionSelector.cpp
index 5d838f1..5b7243b 100644
--- a/src/RegionSelector.cpp
+++ b/src/RegionSelector.cpp
@@ -108,7 +108,7 @@ namespace gsr {
const Window window = XCreateWindow(dpy, DefaultRootWindow(dpy), 0, 0, width, height, 0, vinfo->depth, InputOutput, vinfo->visual, CWBackPixel | CWBorderPixel | CWOverrideRedirect | CWEventMask | CWColormap, &window_attr);
if(window) {
set_window_size_not_resizable(dpy, window, width, height);
- set_window_shape_cross(dpy, window, width, height, 5);
+ set_window_shape_cross(dpy, window, width, height, cursor_thickness);
make_window_click_through(dpy, window);
}
return window;
@@ -148,7 +148,7 @@ namespace gsr {
const int y = cursor_y - cursor_window_size / 2;
XFillRectangle(dpy, window, cursor_gc, x + cursor_window_size / 2 - thickness / 2 , y, thickness, cursor_window_size);
XFillRectangle(dpy, window, cursor_gc, x, y + cursor_window_size / 2 - thickness / 2, cursor_window_size, thickness);
- } else {
+ } else if(cursor_window) {
XMoveWindow(dpy, cursor_window, cursor_x - cursor_window_size / 2, cursor_y - cursor_window_size / 2);
}
XFlush(dpy);
@@ -253,6 +253,7 @@ namespace gsr {
hide_window_from_taskbar(dpy, region_window);
XFixesHideCursor(dpy, region_window);
XGrabPointer(dpy, DefaultRootWindow(dpy), True, ButtonPressMask | ButtonReleaseMask | ButtonMotionMask, GrabModeAsync, GrabModeAsync, None, None, CurrentTime);
+ XGrabKeyboard(dpy, DefaultRootWindow(dpy), True, GrabModeAsync, GrabModeAsync, CurrentTime);
xi_grab_all_mouse_devices(dpy);
XFlush(dpy);
@@ -271,6 +272,7 @@ namespace gsr {
XFlush(dpy);
selected = false;
+ canceled = false;
return true;
}
@@ -283,6 +285,7 @@ namespace gsr {
XFixesShowCursor(dpy, region_window);
XUngrabPointer(dpy, CurrentTime);
+ XUngrabKeyboard(dpy, CurrentTime);
xi_ungrab_all_mouse_devices(dpy);
XFlush(dpy);
@@ -326,6 +329,14 @@ namespace gsr {
XEvent xev;
while(XPending(dpy)) {
XNextEvent(dpy, &xev);
+
+ if(xev.type == KeyRelease && XKeycodeToKeysym(dpy, xev.xkey.keycode, 0) == XK_Escape) {
+ canceled = true;
+ selected = false;
+ stop();
+ break;
+ }
+
XGenericEventCookie *cookie = &xev.xcookie;
if(cookie->type != GenericEvent || cookie->extension != xi_opcode || !XGetEventData(dpy, cookie))
continue;
@@ -365,6 +376,12 @@ namespace gsr {
return result;
}
+ bool RegionSelector::take_canceled() {
+ const bool result = canceled;
+ canceled = false;
+ return result;
+ }
+
Region RegionSelector::get_selection() const {
return region;
}