mirror of
https://github.com/labwc/labwc.git
synced 2025-10-31 22:25:34 -04:00
Prevent cursor based region-snapping when starting a move with A-Left
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
This commit is contained in:
parent
a0b5a80ce1
commit
a4fb5b093b
6 changed files with 40 additions and 28 deletions
|
|
@ -164,6 +164,8 @@ struct seat {
|
||||||
/* Private use by regions.c */
|
/* Private use by regions.c */
|
||||||
struct region *region_active;
|
struct region *region_active;
|
||||||
struct region_overlay region_overlay;
|
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_client *active_client_while_inhibited;
|
||||||
struct wl_list inputs;
|
struct wl_list inputs;
|
||||||
|
|
|
||||||
|
|
@ -33,8 +33,8 @@ struct region_overlay {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Can be used as a cheap check to detect if there are any regions configured */
|
/* Returns true if we should show the region overlay or snap to region */
|
||||||
bool regions_available(void);
|
bool regions_should_snap(struct server *server);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* regions_reconfigure*() - re-initializes all regions from struct rc.
|
* regions_reconfigure*() - re-initializes all regions from struct rc.
|
||||||
|
|
|
||||||
15
src/cursor.c
15
src/cursor.c
|
|
@ -190,17 +190,14 @@ process_cursor_move(struct server *server, uint32_t time)
|
||||||
view_move(view, dx, dy);
|
view_move(view, dx, dy);
|
||||||
|
|
||||||
/* Region overlay */
|
/* Region overlay */
|
||||||
if (!regions_available()) {
|
if (!regions_should_snap(server)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
struct wlr_keyboard *keyboard = &server->seat.keyboard_group->keyboard;
|
struct region *region = regions_from_cursor(server);
|
||||||
if (keyboard_any_modifiers_pressed(keyboard)) {
|
if (region) {
|
||||||
struct region *region = regions_from_cursor(server);
|
regions_show_overlay(view, &server->seat, region);
|
||||||
if (region) {
|
} else {
|
||||||
regions_show_overlay(view, &server->seat, region);
|
regions_hide_overlay(&server->seat);
|
||||||
} else {
|
|
||||||
regions_hide_overlay(&server->seat);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -58,6 +58,11 @@ interactive_begin(struct view *view, enum input_mode mode, uint32_t edges)
|
||||||
/* Store natural geometry at start of move */
|
/* Store natural geometry at start of move */
|
||||||
view_store_natural_geometry(view);
|
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);
|
cursor_set(seat, LAB_CURSOR_GRAB);
|
||||||
break;
|
break;
|
||||||
case LAB_INPUT_STATE_RESIZE:
|
case LAB_INPUT_STATE_RESIZE:
|
||||||
|
|
@ -137,20 +142,15 @@ snap_to_edge(struct view *view)
|
||||||
static bool
|
static bool
|
||||||
snap_to_region(struct view *view)
|
snap_to_region(struct view *view)
|
||||||
{
|
{
|
||||||
if (!regions_available()) {
|
if (!regions_should_snap(view->server)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct wlr_keyboard *keyboard =
|
struct region *region = regions_from_cursor(view->server);
|
||||||
&view->server->seat.keyboard_group->keyboard;
|
if (region) {
|
||||||
|
view_snap_to_region(view, region,
|
||||||
if (keyboard_any_modifiers_pressed(keyboard)) {
|
/*store_natural_geometry*/ false);
|
||||||
struct region *region = regions_from_cursor(view->server);
|
return true;
|
||||||
if (region) {
|
|
||||||
view_snap_to_region(view, region,
|
|
||||||
/*store_natural_geometry*/ false);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
@ -159,11 +159,8 @@ void
|
||||||
interactive_finish(struct view *view)
|
interactive_finish(struct view *view)
|
||||||
{
|
{
|
||||||
if (view->server->grabbed_view == view) {
|
if (view->server->grabbed_view == view) {
|
||||||
enum input_mode mode = view->server->input_mode;
|
|
||||||
regions_hide_overlay(&view->server->seat);
|
regions_hide_overlay(&view->server->seat);
|
||||||
view->server->input_mode = LAB_INPUT_STATE_PASSTHROUGH;
|
if (view->server->input_mode == LAB_INPUT_STATE_MOVE) {
|
||||||
view->server->grabbed_view = NULL;
|
|
||||||
if (mode == LAB_INPUT_STATE_MOVE) {
|
|
||||||
if (!snap_to_region(view)) {
|
if (!snap_to_region(view)) {
|
||||||
if (!snap_to_edge(view)) {
|
if (!snap_to_edge(view)) {
|
||||||
/* Reset tiled state if not snapped */
|
/* 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 */
|
/* Update focus/cursor image */
|
||||||
cursor_update_focus(view->server);
|
cursor_update_focus(view->server);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,11 @@ keyboard_modifiers_notify(struct wl_listener *listener, void *data)
|
||||||
struct wlr_keyboard_key_event *event = data;
|
struct wlr_keyboard_key_event *event = data;
|
||||||
struct wlr_keyboard *wlr_keyboard = keyboard->wlr_keyboard;
|
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
|
if (server->osd_state.cycle_view || server->grabbed_view
|
||||||
|| seat->workspace_osd_shown_by_modifier) {
|
|| seat->workspace_osd_shown_by_modifier) {
|
||||||
if (event->state == WL_KEYBOARD_KEY_STATE_RELEASED
|
if (event->state == WL_KEYBOARD_KEY_STATE_RELEASED
|
||||||
|
|
|
||||||
|
|
@ -17,9 +17,16 @@
|
||||||
#include "view.h"
|
#include "view.h"
|
||||||
|
|
||||||
bool
|
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
|
static void
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue