From 4799d07ac1bb08a770ee702eb3fd0ab4654f878a Mon Sep 17 00:00:00 2001 From: "S. Christoffer Eliesen" Date: Wed, 28 Oct 2015 00:41:28 +0100 Subject: input_state: Extract 'pointer_position_set' function from handlers. --- sway/input_state.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'sway/input_state.c') diff --git a/sway/input_state.c b/sway/input_state.c index 2743a9ea..bd46a5ac 100644 --- a/sway/input_state.c +++ b/sway/input_state.c @@ -2,6 +2,7 @@ #include #include #include "log.h" +#include "config.h" #include "input_state.h" @@ -161,6 +162,29 @@ static void reset_initial_sibling(void) { pointer_state.mode = 0; } +void pointer_position_set(struct wlc_origin *new_origin, bool force_focus) { + pointer_state.delta.x = new_origin->x - pointer_state.origin.x; + pointer_state.delta.y = new_origin->y - pointer_state.origin.y; + pointer_state.origin.x = new_origin->x; + pointer_state.origin.y = new_origin->y; + + // Update view under pointer + swayc_t *prev_view = pointer_state.view; + pointer_state.view = container_under_pointer(); + + // If pointer is in a mode, update it + if (pointer_state.mode) { + pointer_mode_update(); + // Otherwise change focus if config is set + } else if (force_focus || (prev_view != pointer_state.view && config->focus_follows_mouse)) { + if (pointer_state.view && pointer_state.view->type == C_VIEW) { + set_focused_container(pointer_state.view); + } + } + + wlc_pointer_set_origin(new_origin); +} + // Mode set left/right click static void pointer_mode_set_left(void) { -- cgit v1.2.3 From 78ca6197697d4f07eddf0c544daff85603adab90 Mon Sep 17 00:00:00 2001 From: "S. Christoffer Eliesen" Date: Mon, 26 Oct 2015 12:20:32 +0100 Subject: commands: Learn mouse_warping. Place mouse at center of focused view when changing to a workspace on a different output, if option is enabled. (This replicates existing i3 option.) This can be triggered in multiple ways: A) via `workspace ` which changes output B) via `focus ` which changes output C) via `focus output ` which (obviously) changes output --- sway/input_state.c | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'sway/input_state.c') diff --git a/sway/input_state.c b/sway/input_state.c index bd46a5ac..ee3dc7cf 100644 --- a/sway/input_state.c +++ b/sway/input_state.c @@ -185,6 +185,13 @@ void pointer_position_set(struct wlc_origin *new_origin, bool force_focus) { wlc_pointer_set_origin(new_origin); } +void center_pointer_on(swayc_t *view) { + struct wlc_origin new_origin; + new_origin.x = view->x + view->width/2; + new_origin.y = view->y + view->height/2; + pointer_position_set(&new_origin, true); +} + // Mode set left/right click static void pointer_mode_set_left(void) { -- cgit v1.2.3 From 5ba47d4a44b21500ed3af2670cb1c807b7fed850 Mon Sep 17 00:00:00 2001 From: "S. Christoffer Eliesen" Date: Thu, 29 Oct 2015 18:02:02 +0100 Subject: input_state: Remove mouse_origin (x&y). Query wlc instead. --- sway/input_state.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) (limited to 'sway/input_state.c') diff --git a/sway/input_state.c b/sway/input_state.c index ee3dc7cf..9bd8ad4d 100644 --- a/sway/input_state.c +++ b/sway/input_state.c @@ -163,10 +163,10 @@ static void reset_initial_sibling(void) { } void pointer_position_set(struct wlc_origin *new_origin, bool force_focus) { - pointer_state.delta.x = new_origin->x - pointer_state.origin.x; - pointer_state.delta.y = new_origin->y - pointer_state.origin.y; - pointer_state.origin.x = new_origin->x; - pointer_state.origin.y = new_origin->y; + struct wlc_origin origin; + wlc_pointer_get_origin(&origin); + pointer_state.delta.x = new_origin->x - origin.x; + pointer_state.delta.y = new_origin->y - origin.y; // Update view under pointer swayc_t *prev_view = pointer_state.view; @@ -214,8 +214,10 @@ static void pointer_mode_set_right(void) { int midway_x = initial.ptr->x + initial.ptr->width/2; int midway_y = initial.ptr->y + initial.ptr->height/2; - lock.left = pointer_state.origin.x > midway_x; - lock.top = pointer_state.origin.y > midway_y; + struct wlc_origin origin; + wlc_pointer_get_origin(&origin); + lock.left = origin.x > midway_x; + lock.top = origin.y > midway_y; if (initial.ptr->is_floating) { pointer_state.mode = M_RESIZING | M_FLOATING; @@ -277,8 +279,10 @@ void pointer_mode_update(void) { pointer_state.mode = 0; return; } - int dx = pointer_state.origin.x; - int dy = pointer_state.origin.y; + struct wlc_origin origin; + wlc_pointer_get_origin(&origin); + int dx = origin.x; + int dy = origin.y; switch (pointer_state.mode) { case M_FLOATING | M_DRAGGING: -- cgit v1.2.3