summaryrefslogtreecommitdiffstats
path: root/sway/input_state.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/input_state.c')
-rw-r--r--sway/input_state.c43
1 files changed, 39 insertions, 4 deletions
diff --git a/sway/input_state.c b/sway/input_state.c
index 2743a9ea..9bd8ad4d 100644
--- a/sway/input_state.c
+++ b/sway/input_state.c
@@ -2,6 +2,7 @@
2#include <stdbool.h> 2#include <stdbool.h>
3#include <ctype.h> 3#include <ctype.h>
4#include "log.h" 4#include "log.h"
5#include "config.h"
5 6
6#include "input_state.h" 7#include "input_state.h"
7 8
@@ -161,6 +162,36 @@ static void reset_initial_sibling(void) {
161 pointer_state.mode = 0; 162 pointer_state.mode = 0;
162} 163}
163 164
165void pointer_position_set(struct wlc_origin *new_origin, bool force_focus) {
166 struct wlc_origin origin;
167 wlc_pointer_get_origin(&origin);
168 pointer_state.delta.x = new_origin->x - origin.x;
169 pointer_state.delta.y = new_origin->y - origin.y;
170
171 // Update view under pointer
172 swayc_t *prev_view = pointer_state.view;
173 pointer_state.view = container_under_pointer();
174
175 // If pointer is in a mode, update it
176 if (pointer_state.mode) {
177 pointer_mode_update();
178 // Otherwise change focus if config is set
179 } else if (force_focus || (prev_view != pointer_state.view && config->focus_follows_mouse)) {
180 if (pointer_state.view && pointer_state.view->type == C_VIEW) {
181 set_focused_container(pointer_state.view);
182 }
183 }
184
185 wlc_pointer_set_origin(new_origin);
186}
187
188void center_pointer_on(swayc_t *view) {
189 struct wlc_origin new_origin;
190 new_origin.x = view->x + view->width/2;
191 new_origin.y = view->y + view->height/2;
192 pointer_position_set(&new_origin, true);
193}
194
164// Mode set left/right click 195// Mode set left/right click
165 196
166static void pointer_mode_set_left(void) { 197static void pointer_mode_set_left(void) {
@@ -183,8 +214,10 @@ static void pointer_mode_set_right(void) {
183 int midway_x = initial.ptr->x + initial.ptr->width/2; 214 int midway_x = initial.ptr->x + initial.ptr->width/2;
184 int midway_y = initial.ptr->y + initial.ptr->height/2; 215 int midway_y = initial.ptr->y + initial.ptr->height/2;
185 216
186 lock.left = pointer_state.origin.x > midway_x; 217 struct wlc_origin origin;
187 lock.top = pointer_state.origin.y > midway_y; 218 wlc_pointer_get_origin(&origin);
219 lock.left = origin.x > midway_x;
220 lock.top = origin.y > midway_y;
188 221
189 if (initial.ptr->is_floating) { 222 if (initial.ptr->is_floating) {
190 pointer_state.mode = M_RESIZING | M_FLOATING; 223 pointer_state.mode = M_RESIZING | M_FLOATING;
@@ -246,8 +279,10 @@ void pointer_mode_update(void) {
246 pointer_state.mode = 0; 279 pointer_state.mode = 0;
247 return; 280 return;
248 } 281 }
249 int dx = pointer_state.origin.x; 282 struct wlc_origin origin;
250 int dy = pointer_state.origin.y; 283 wlc_pointer_get_origin(&origin);
284 int dx = origin.x;
285 int dy = origin.y;
251 286
252 switch (pointer_state.mode) { 287 switch (pointer_state.mode) {
253 case M_FLOATING | M_DRAGGING: 288 case M_FLOATING | M_DRAGGING: