/* 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;
};
};
-/* 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.
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);
}
}
/* 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:
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;
}
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 */
}
}
}
+
+ view->server->input_mode = LAB_INPUT_STATE_PASSTHROUGH;
+ view->server->grabbed_view = NULL;
+
/* Update focus/cursor image */
cursor_update_focus(view->server);
}
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
#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