]> git.mdlowis.com Git - proto/labwc.git/commitdiff
Prevent cursor based region-snapping when starting a move with A-Left
authorConsolatis <35009135+Consolatis@users.noreply.github.com>
Tue, 7 Mar 2023 16:51:28 +0000 (17:51 +0100)
committerJohan Malm <johanmalm@users.noreply.github.com>
Tue, 7 Mar 2023 20:55:35 +0000 (20:55 +0000)
When wanting to snap to a region when starting the move
operation with A-Left (or a similar mousebind which includes a
modifier), the modifier - or another one - must be pressed again.

Fixes #761

include/labwc.h
include/regions.h
src/cursor.c
src/interactive.c
src/keyboard.c
src/regions.c

index d71e00f0f545b6fbf7b812a797ac9b5a036ac84a..c3bdfd8fe68b77c3d8a8516ecc02b3149f17d869 100644 (file)
@@ -164,6 +164,8 @@ struct seat {
        /* Private use by regions.c */
        struct region *region_active;
        struct region_overlay region_overlay;
+       /* Used to prevent region snapping when starting a move with A-Left */
+       bool region_prevent_snap;
 
        struct wl_client *active_client_while_inhibited;
        struct wl_list inputs;
index 3b294a99e36b82e494308d03002876ea98a79016..67dcb78dfeec8dfb2b7683faca298e84a3e05061 100644 (file)
@@ -33,8 +33,8 @@ struct region_overlay {
        };
 };
 
-/* Can be used as a cheap check to detect if there are any regions configured */
-bool regions_available(void);
+/* Returns true if we should show the region overlay or snap to region */
+bool regions_should_snap(struct server *server);
 
 /**
  * regions_reconfigure*() - re-initializes all regions from struct rc.
index 1f05ad0ffa08e13d4350dfa95d91bdfe7bcab767..8c217c2f432a6f0d8dae36d904c97c9256e72a77 100644 (file)
@@ -190,17 +190,14 @@ process_cursor_move(struct server *server, uint32_t time)
        view_move(view, dx, dy);
 
        /* Region overlay */
-       if (!regions_available()) {
+       if (!regions_should_snap(server)) {
                return;
        }
-       struct wlr_keyboard *keyboard = &server->seat.keyboard_group->keyboard;
-       if (keyboard_any_modifiers_pressed(keyboard)) {
-               struct region *region = regions_from_cursor(server);
-               if (region) {
-                       regions_show_overlay(view, &server->seat, region);
-               } else {
-                       regions_hide_overlay(&server->seat);
-               }
+       struct region *region = regions_from_cursor(server);
+       if (region) {
+               regions_show_overlay(view, &server->seat, region);
+       } else {
+               regions_hide_overlay(&server->seat);
        }
 }
 
index 100783e2af6ff3f3538c7bdcf568242a45e5b460..482b20ea1ccaad00aeda3e4ca851ed37d1cf75ef 100644 (file)
@@ -58,6 +58,11 @@ interactive_begin(struct view *view, enum input_mode mode, uint32_t edges)
                        /* Store natural geometry at start of move */
                        view_store_natural_geometry(view);
                }
+
+               /* Prevent region snapping when just moving via A-Left mousebind */
+               struct wlr_keyboard *keyboard = &seat->keyboard_group->keyboard;
+               seat->region_prevent_snap = keyboard_any_modifiers_pressed(keyboard);
+
                cursor_set(seat, LAB_CURSOR_GRAB);
                break;
        case LAB_INPUT_STATE_RESIZE:
@@ -137,20 +142,15 @@ snap_to_edge(struct view *view)
 static bool
 snap_to_region(struct view *view)
 {
-       if (!regions_available()) {
+       if (!regions_should_snap(view->server)) {
                return false;
        }
 
-       struct wlr_keyboard *keyboard =
-               &view->server->seat.keyboard_group->keyboard;
-
-       if (keyboard_any_modifiers_pressed(keyboard)) {
-               struct region *region = regions_from_cursor(view->server);
-               if (region) {
-                       view_snap_to_region(view, region,
-                               /*store_natural_geometry*/ false);
-                       return true;
-               }
+       struct region *region = regions_from_cursor(view->server);
+       if (region) {
+               view_snap_to_region(view, region,
+                       /*store_natural_geometry*/ false);
+               return true;
        }
        return false;
 }
@@ -159,11 +159,8 @@ void
 interactive_finish(struct view *view)
 {
        if (view->server->grabbed_view == view) {
-               enum input_mode mode = view->server->input_mode;
                regions_hide_overlay(&view->server->seat);
-               view->server->input_mode = LAB_INPUT_STATE_PASSTHROUGH;
-               view->server->grabbed_view = NULL;
-               if (mode == LAB_INPUT_STATE_MOVE) {
+               if (view->server->input_mode == LAB_INPUT_STATE_MOVE) {
                        if (!snap_to_region(view)) {
                                if (!snap_to_edge(view)) {
                                        /* Reset tiled state if not snapped */
@@ -171,6 +168,10 @@ interactive_finish(struct view *view)
                                }
                        }
                }
+
+               view->server->input_mode = LAB_INPUT_STATE_PASSTHROUGH;
+               view->server->grabbed_view = NULL;
+
                /* Update focus/cursor image */
                cursor_update_focus(view->server);
        }
index a0edc0243fe3e83d686d295f872524de6fe45a0d..5cfbaa05c49a10d77bb4b034f288be3b7e9e494e 100644 (file)
@@ -56,6 +56,11 @@ keyboard_modifiers_notify(struct wl_listener *listener, void *data)
        struct wlr_keyboard_key_event *event = data;
        struct wlr_keyboard *wlr_keyboard = keyboard->wlr_keyboard;
 
+       if (server->input_mode == LAB_INPUT_STATE_MOVE) {
+               /* Any change to the modifier state re-enable region snap */
+               seat->region_prevent_snap = false;
+       }
+
        if (server->osd_state.cycle_view || server->grabbed_view
                        || seat->workspace_osd_shown_by_modifier) {
                if (event->state == WL_KEYBOARD_KEY_STATE_RELEASED
index 2f19e09e1ac687a6bc4c9d7da50a786d55119acf..353ae255f7b66f5332c1d0f7cdc56ab76d421126 100644 (file)
 #include "view.h"
 
 bool
-regions_available(void)
+regions_should_snap(struct server *server)
 {
-       return !wl_list_empty(&rc.regions);
+       if (server->input_mode != LAB_INPUT_STATE_MOVE
+                       || wl_list_empty(&rc.regions)
+                       || server->seat.region_prevent_snap) {
+               return false;
+       }
+
+       struct wlr_keyboard *keyboard = &server->seat.keyboard_group->keyboard;
+       return keyboard_any_modifiers_pressed(keyboard);
 }
 
 static void