diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Overlay.cpp | 6 | ||||
-rw-r--r-- | src/RegionSelector.cpp | 21 |
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; } |