summaryrefslogtreecommitdiffstats
path: root/sway/input_state.c
diff options
context:
space:
mode:
authorLibravatar Mikkel Oscar Lyderik <mikkeloscar@gmail.com>2015-12-11 11:39:24 +0100
committerLibravatar Mikkel Oscar Lyderik <mikkeloscar@gmail.com>2015-12-11 18:04:27 +0100
commit22916e9ebc130dbd365e6403730b9e0857977b8e (patch)
tree55c1c7b5022cb1d30b08827e9b286d2e830db9cf /sway/input_state.c
parentInitialize keyboard in registry poll (diff)
downloadsway-22916e9ebc130dbd365e6403730b9e0857977b8e.tar.gz
sway-22916e9ebc130dbd365e6403730b9e0857977b8e.tar.zst
sway-22916e9ebc130dbd365e6403730b9e0857977b8e.zip
Make mouse key used for drag/resize configurable
This makes it possible to define what mouse button key (left|right) to use for dragging/resizing.
Diffstat (limited to 'sway/input_state.c')
-rw-r--r--sway/input_state.c93
1 files changed, 74 insertions, 19 deletions
diff --git a/sway/input_state.c b/sway/input_state.c
index 88506c92..24678f71 100644
--- a/sway/input_state.c
+++ b/sway/input_state.c
@@ -194,8 +194,16 @@ void center_pointer_on(swayc_t *view) {
194 194
195// Mode set left/right click 195// Mode set left/right click
196 196
197static void pointer_mode_set_left(void) { 197static void pointer_mode_set_dragging(void) {
198 set_initial_view(pointer_state.left.view); 198 switch (config->dragging_key) {
199 case M_LEFT_CLICK:
200 set_initial_view(pointer_state.left.view);
201 break;
202 case M_RIGHT_CLICK:
203 set_initial_view(pointer_state.right.view);
204 break;
205 }
206
199 if (initial.ptr->is_floating) { 207 if (initial.ptr->is_floating) {
200 pointer_state.mode = M_DRAGGING | M_FLOATING; 208 pointer_state.mode = M_DRAGGING | M_FLOATING;
201 } else { 209 } else {
@@ -208,8 +216,15 @@ static void pointer_mode_set_left(void) {
208 } 216 }
209} 217}
210 218
211static void pointer_mode_set_right(void) { 219static void pointer_mode_set_resizing(void) {
212 set_initial_view(pointer_state.right.view); 220 switch (config->resizing_key) {
221 case M_LEFT_CLICK:
222 set_initial_view(pointer_state.left.view);
223 break;
224 case M_RIGHT_CLICK:
225 set_initial_view(pointer_state.right.view);
226 break;
227 }
213 // Setup locking information 228 // Setup locking information
214 int midway_x = initial.ptr->x + initial.ptr->width/2; 229 int midway_x = initial.ptr->x + initial.ptr->width/2;
215 int midway_y = initial.ptr->y + initial.ptr->height/2; 230 int midway_y = initial.ptr->y + initial.ptr->height/2;
@@ -233,15 +248,19 @@ void pointer_mode_set(uint32_t button, bool condition) {
233 // switch on drag/resize mode 248 // switch on drag/resize mode
234 switch (pointer_state.mode & (M_DRAGGING | M_RESIZING)) { 249 switch (pointer_state.mode & (M_DRAGGING | M_RESIZING)) {
235 case M_DRAGGING: 250 case M_DRAGGING:
236 // end drag mode when left click is unpressed 251 // end drag mode when 'dragging' click is unpressed
237 if (!pointer_state.left.held) { 252 if (config->dragging_key == M_LEFT_CLICK && !pointer_state.left.held) {
253 pointer_state.mode = 0;
254 } else if (config->dragging_key == M_RIGHT_CLICK && !pointer_state.right.held) {
238 pointer_state.mode = 0; 255 pointer_state.mode = 0;
239 } 256 }
240 break; 257 break;
241 258
242 case M_RESIZING: 259 case M_RESIZING:
243 // end resize mode when right click is unpressed 260 // end resize mode when 'resizing' click is unpressed
244 if (!pointer_state.right.held) { 261 if (config->resizing_key == M_LEFT_CLICK && !pointer_state.left.held) {
262 pointer_state.mode = 0;
263 } else if (config->resizing_key == M_RIGHT_CLICK && !pointer_state.right.held) {
245 pointer_state.mode = 0; 264 pointer_state.mode = 0;
246 } 265 }
247 break; 266 break;
@@ -255,19 +274,27 @@ void pointer_mode_set(uint32_t button, bool condition) {
255 274
256 // Set mode depending on current button press 275 // Set mode depending on current button press
257 switch (button) { 276 switch (button) {
258 // Start dragging mode 277 // Start left-click mode
259 case M_LEFT_CLICK: 278 case M_LEFT_CLICK:
260 // if button release dont do anything 279 // if button release dont do anything
261 if (pointer_state.left.held) { 280 if (pointer_state.left.held) {
262 pointer_mode_set_left(); 281 if (config->dragging_key == M_LEFT_CLICK) {
282 pointer_mode_set_dragging();
283 } else if (config->resizing_key == M_LEFT_CLICK) {
284 pointer_mode_set_resizing();
285 }
263 } 286 }
264 break; 287 break;
265 288
266 // Start resize mode 289 // Start right-click mode
267 case M_RIGHT_CLICK: 290 case M_RIGHT_CLICK:
268 // if button release dont do anyhting 291 // if button release dont do anyhting
269 if (pointer_state.right.held) { 292 if (pointer_state.right.held) {
270 pointer_mode_set_right(); 293 if (config->dragging_key == M_RIGHT_CLICK) {
294 pointer_mode_set_dragging();
295 } else if (config->resizing_key == M_RIGHT_CLICK) {
296 pointer_mode_set_resizing();
297 }
271 } 298 }
272 break; 299 break;
273 } 300 }
@@ -287,8 +314,17 @@ void pointer_mode_update(void) {
287 switch (pointer_state.mode) { 314 switch (pointer_state.mode) {
288 case M_FLOATING | M_DRAGGING: 315 case M_FLOATING | M_DRAGGING:
289 // Update position 316 // Update position
290 dx -= pointer_state.left.x; 317 switch (config->resizing_key) {
291 dy -= pointer_state.left.y; 318 case M_LEFT_CLICK:
319 dx -= pointer_state.left.x;
320 dy -= pointer_state.left.y;
321 break;
322 case M_RIGHT_CLICK:
323 dx -= pointer_state.right.x;
324 dy -= pointer_state.right.y;
325 break;
326 }
327
292 if (initial.x + dx != initial.ptr->x) { 328 if (initial.x + dx != initial.ptr->x) {
293 initial.ptr->x = initial.x + dx; 329 initial.ptr->x = initial.x + dx;
294 } 330 }
@@ -299,9 +335,19 @@ void pointer_mode_update(void) {
299 break; 335 break;
300 336
301 case M_FLOATING | M_RESIZING: 337 case M_FLOATING | M_RESIZING:
302 dx -= pointer_state.right.x; 338 switch (config->resizing_key) {
303 dy -= pointer_state.right.y; 339 case M_LEFT_CLICK:
304 initial.ptr = pointer_state.right.view; 340 dx -= pointer_state.left.x;
341 dy -= pointer_state.left.y;
342 initial.ptr = pointer_state.left.view;
343 break;
344 case M_RIGHT_CLICK:
345 dx -= pointer_state.right.x;
346 dy -= pointer_state.right.y;
347 initial.ptr = pointer_state.right.view;
348 break;
349 }
350
305 if (lock.left) { 351 if (lock.left) {
306 if (initial.w + dx > min_sane_w) { 352 if (initial.w + dx > min_sane_w) {
307 initial.ptr->width = initial.w + dx; 353 initial.ptr->width = initial.w + dx;
@@ -341,8 +387,17 @@ void pointer_mode_update(void) {
341 break; 387 break;
342 388
343 case M_TILING | M_RESIZING: 389 case M_TILING | M_RESIZING:
344 dx -= pointer_state.right.x; 390 switch (config->resizing_key) {
345 dy -= pointer_state.right.y; 391 case M_LEFT_CLICK:
392 dx -= pointer_state.left.x;
393 dy -= pointer_state.left.y;
394 break;
395 case M_RIGHT_CLICK:
396 dx -= pointer_state.right.x;
397 dy -= pointer_state.right.y;
398 break;
399 }
400
346 // resize if we can 401 // resize if we can
347 if (initial.horiz.ptr) { 402 if (initial.horiz.ptr) {
348 if (lock.left) { 403 if (lock.left) {