From 22916e9ebc130dbd365e6403730b9e0857977b8e Mon Sep 17 00:00:00 2001 From: Mikkel Oscar Lyderik Date: Fri, 11 Dec 2015 11:39:24 +0100 Subject: 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. --- sway/input_state.c | 93 +++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 74 insertions(+), 19 deletions(-) (limited to 'sway/input_state.c') 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) { // Mode set left/right click -static void pointer_mode_set_left(void) { - set_initial_view(pointer_state.left.view); +static void pointer_mode_set_dragging(void) { + switch (config->dragging_key) { + case M_LEFT_CLICK: + set_initial_view(pointer_state.left.view); + break; + case M_RIGHT_CLICK: + set_initial_view(pointer_state.right.view); + break; + } + if (initial.ptr->is_floating) { pointer_state.mode = M_DRAGGING | M_FLOATING; } else { @@ -208,8 +216,15 @@ static void pointer_mode_set_left(void) { } } -static void pointer_mode_set_right(void) { - set_initial_view(pointer_state.right.view); +static void pointer_mode_set_resizing(void) { + switch (config->resizing_key) { + case M_LEFT_CLICK: + set_initial_view(pointer_state.left.view); + break; + case M_RIGHT_CLICK: + set_initial_view(pointer_state.right.view); + break; + } // Setup locking information int midway_x = initial.ptr->x + initial.ptr->width/2; int midway_y = initial.ptr->y + initial.ptr->height/2; @@ -233,15 +248,19 @@ void pointer_mode_set(uint32_t button, bool condition) { // switch on drag/resize mode switch (pointer_state.mode & (M_DRAGGING | M_RESIZING)) { case M_DRAGGING: - // end drag mode when left click is unpressed - if (!pointer_state.left.held) { + // end drag mode when 'dragging' click is unpressed + if (config->dragging_key == M_LEFT_CLICK && !pointer_state.left.held) { + pointer_state.mode = 0; + } else if (config->dragging_key == M_RIGHT_CLICK && !pointer_state.right.held) { pointer_state.mode = 0; } break; case M_RESIZING: - // end resize mode when right click is unpressed - if (!pointer_state.right.held) { + // end resize mode when 'resizing' click is unpressed + if (config->resizing_key == M_LEFT_CLICK && !pointer_state.left.held) { + pointer_state.mode = 0; + } else if (config->resizing_key == M_RIGHT_CLICK && !pointer_state.right.held) { pointer_state.mode = 0; } break; @@ -255,19 +274,27 @@ void pointer_mode_set(uint32_t button, bool condition) { // Set mode depending on current button press switch (button) { - // Start dragging mode + // Start left-click mode case M_LEFT_CLICK: // if button release dont do anything if (pointer_state.left.held) { - pointer_mode_set_left(); + if (config->dragging_key == M_LEFT_CLICK) { + pointer_mode_set_dragging(); + } else if (config->resizing_key == M_LEFT_CLICK) { + pointer_mode_set_resizing(); + } } break; - // Start resize mode + // Start right-click mode case M_RIGHT_CLICK: // if button release dont do anyhting if (pointer_state.right.held) { - pointer_mode_set_right(); + if (config->dragging_key == M_RIGHT_CLICK) { + pointer_mode_set_dragging(); + } else if (config->resizing_key == M_RIGHT_CLICK) { + pointer_mode_set_resizing(); + } } break; } @@ -287,8 +314,17 @@ void pointer_mode_update(void) { switch (pointer_state.mode) { case M_FLOATING | M_DRAGGING: // Update position - dx -= pointer_state.left.x; - dy -= pointer_state.left.y; + switch (config->resizing_key) { + case M_LEFT_CLICK: + dx -= pointer_state.left.x; + dy -= pointer_state.left.y; + break; + case M_RIGHT_CLICK: + dx -= pointer_state.right.x; + dy -= pointer_state.right.y; + break; + } + if (initial.x + dx != initial.ptr->x) { initial.ptr->x = initial.x + dx; } @@ -299,9 +335,19 @@ void pointer_mode_update(void) { break; case M_FLOATING | M_RESIZING: - dx -= pointer_state.right.x; - dy -= pointer_state.right.y; - initial.ptr = pointer_state.right.view; + switch (config->resizing_key) { + case M_LEFT_CLICK: + dx -= pointer_state.left.x; + dy -= pointer_state.left.y; + initial.ptr = pointer_state.left.view; + break; + case M_RIGHT_CLICK: + dx -= pointer_state.right.x; + dy -= pointer_state.right.y; + initial.ptr = pointer_state.right.view; + break; + } + if (lock.left) { if (initial.w + dx > min_sane_w) { initial.ptr->width = initial.w + dx; @@ -341,8 +387,17 @@ void pointer_mode_update(void) { break; case M_TILING | M_RESIZING: - dx -= pointer_state.right.x; - dy -= pointer_state.right.y; + switch (config->resizing_key) { + case M_LEFT_CLICK: + dx -= pointer_state.left.x; + dy -= pointer_state.left.y; + break; + case M_RIGHT_CLICK: + dx -= pointer_state.right.x; + dy -= pointer_state.right.y; + break; + } + // resize if we can if (initial.horiz.ptr) { if (lock.left) { -- cgit v1.2.3-54-g00ecf