Esc to close region selection

This commit is contained in:
dec05eba
2025-03-15 09:31:06 +01:00
parent d8a0b49bc2
commit d45897164a
3 changed files with 25 additions and 4 deletions

View File

@@ -28,6 +28,7 @@ namespace gsr {
bool poll_events(); bool poll_events();
bool is_selected() const; bool is_selected() const;
bool take_selection(); bool take_selection();
bool take_canceled();
Region get_selection() const; Region get_selection() const;
private: private:
void on_button_press(const void *de); void on_button_press(const void *de);
@@ -45,6 +46,7 @@ namespace gsr {
Region region; Region region;
bool selecting_region = false; bool selecting_region = false;
bool selected = false; bool selected = false;
bool canceled = false;
bool is_wayland = false; bool is_wayland = false;
std::vector<Monitor> monitors; std::vector<Monitor> monitors;
mgl::vec2i cursor_pos; mgl::vec2i cursor_pos;

View File

@@ -592,7 +592,9 @@ namespace gsr {
handle_keyboard_mapping_event(); handle_keyboard_mapping_event();
region_selector.poll_events(); 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();
on_region_selected = nullptr; on_region_selected = nullptr;
} }
@@ -635,7 +637,7 @@ namespace gsr {
start_region_capture = false; start_region_capture = false;
hide(); hide();
if(!region_selector.start(get_color_theme().tint_color)) { 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; on_region_selected = nullptr;
} }
} }

View File

@@ -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); 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) { if(window) {
set_window_size_not_resizable(dpy, window, width, height); 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); make_window_click_through(dpy, window);
} }
return window; return window;
@@ -148,7 +148,7 @@ namespace gsr {
const int y = cursor_y - cursor_window_size / 2; 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 + 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); 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); XMoveWindow(dpy, cursor_window, cursor_x - cursor_window_size / 2, cursor_y - cursor_window_size / 2);
} }
XFlush(dpy); XFlush(dpy);
@@ -253,6 +253,7 @@ namespace gsr {
hide_window_from_taskbar(dpy, region_window); hide_window_from_taskbar(dpy, region_window);
XFixesHideCursor(dpy, region_window); XFixesHideCursor(dpy, region_window);
XGrabPointer(dpy, DefaultRootWindow(dpy), True, ButtonPressMask | ButtonReleaseMask | ButtonMotionMask, GrabModeAsync, GrabModeAsync, None, None, CurrentTime); 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); xi_grab_all_mouse_devices(dpy);
XFlush(dpy); XFlush(dpy);
@@ -271,6 +272,7 @@ namespace gsr {
XFlush(dpy); XFlush(dpy);
selected = false; selected = false;
canceled = false;
return true; return true;
} }
@@ -283,6 +285,7 @@ namespace gsr {
XFixesShowCursor(dpy, region_window); XFixesShowCursor(dpy, region_window);
XUngrabPointer(dpy, CurrentTime); XUngrabPointer(dpy, CurrentTime);
XUngrabKeyboard(dpy, CurrentTime);
xi_ungrab_all_mouse_devices(dpy); xi_ungrab_all_mouse_devices(dpy);
XFlush(dpy); XFlush(dpy);
@@ -326,6 +329,14 @@ namespace gsr {
XEvent xev; XEvent xev;
while(XPending(dpy)) { while(XPending(dpy)) {
XNextEvent(dpy, &xev); 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; XGenericEventCookie *cookie = &xev.xcookie;
if(cookie->type != GenericEvent || cookie->extension != xi_opcode || !XGetEventData(dpy, cookie)) if(cookie->type != GenericEvent || cookie->extension != xi_opcode || !XGetEventData(dpy, cookie))
continue; continue;
@@ -365,6 +376,12 @@ namespace gsr {
return result; return result;
} }
bool RegionSelector::take_canceled() {
const bool result = canceled;
canceled = false;
return result;
}
Region RegionSelector::get_selection() const { Region RegionSelector::get_selection() const {
return region; return region;
} }