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.
This commit is contained in:
Mikkel Oscar Lyderik 2015-12-11 11:39:24 +01:00
parent fc9908a40a
commit 0aeee6963d
4 changed files with 93 additions and 21 deletions

View file

@ -119,6 +119,8 @@ struct sway_config {
struct bar_config bar; struct bar_config bar;
struct bar_config *current_bar; struct bar_config *current_bar;
uint32_t floating_mod; uint32_t floating_mod;
uint32_t dragging_key;
uint32_t resizing_key;
enum swayc_layouts default_orientation; enum swayc_layouts default_orientation;
enum swayc_layouts default_layout; enum swayc_layouts default_layout;

View file

@ -385,14 +385,14 @@ static struct cmd_results *cmd_floating(int argc, char **argv) {
static struct cmd_results *cmd_floating_mod(int argc, char **argv) { static struct cmd_results *cmd_floating_mod(int argc, char **argv) {
struct cmd_results *error = NULL; struct cmd_results *error = NULL;
if ((error = checkarg(argc, "floating_modifier", EXPECTED_EQUAL_TO, 1))) { if ((error = checkarg(argc, "floating_modifier", EXPECTED_AT_LEAST, 1))) {
return error; return error;
} }
int i, j; int i, j;
list_t *split = split_string(argv[0], "+"); list_t *split = split_string(argv[0], "+");
config->floating_mod = 0; config->floating_mod = 0;
// set modifer keys // set modifier keys
for (i = 0; i < split->length; ++i) { for (i = 0; i < split->length; ++i) {
for (j = 0; j < (int)(sizeof(modifiers) / sizeof(struct modifier_key)); ++j) { for (j = 0; j < (int)(sizeof(modifiers) / sizeof(struct modifier_key)); ++j) {
if (strcasecmp(modifiers[j].name, split->items[i]) == 0) { if (strcasecmp(modifiers[j].name, split->items[i]) == 0) {
@ -405,6 +405,19 @@ static struct cmd_results *cmd_floating_mod(int argc, char **argv) {
error = cmd_results_new(CMD_INVALID, "floating_modifier", "Unknown keys %s", argv[0]); error = cmd_results_new(CMD_INVALID, "floating_modifier", "Unknown keys %s", argv[0]);
return error; return error;
} }
if (argc >= 2) {
if (strcasecmp("inverse", argv[1]) == 0) {
config->dragging_key = M_RIGHT_CLICK;
config->resizing_key = M_LEFT_CLICK;
} else if (strcasecmp("normal", argv[1]) == 0) {
config->dragging_key = M_LEFT_CLICK;
config->resizing_key = M_RIGHT_CLICK;
} else {
error = cmd_results_new(CMD_INVALID, "floating_modifier", "Invalid definition %s", argv[1]);
return error;
}
}
return cmd_results_new(CMD_SUCCESS, NULL, NULL); return cmd_results_new(CMD_SUCCESS, NULL, NULL);
} }

View file

@ -115,6 +115,8 @@ static void config_defaults(struct sway_config *config) {
list_add(config->modes, config->current_mode); list_add(config->modes, config->current_mode);
config->floating_mod = 0; config->floating_mod = 0;
config->dragging_key = M_LEFT_CLICK;
config->resizing_key = M_RIGHT_CLICK;
config->default_layout = L_NONE; config->default_layout = L_NONE;
config->default_orientation = L_NONE; config->default_orientation = L_NONE;
// Flags // Flags

View file

@ -194,8 +194,16 @@ void center_pointer_on(swayc_t *view) {
// Mode set left/right click // Mode set left/right click
static void pointer_mode_set_left(void) { static void pointer_mode_set_dragging(void) {
switch (config->dragging_key) {
case M_LEFT_CLICK:
set_initial_view(pointer_state.left.view); 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) { if (initial.ptr->is_floating) {
pointer_state.mode = M_DRAGGING | M_FLOATING; pointer_state.mode = M_DRAGGING | M_FLOATING;
} else { } else {
@ -208,8 +216,15 @@ static void pointer_mode_set_left(void) {
} }
} }
static void pointer_mode_set_right(void) { 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); set_initial_view(pointer_state.right.view);
break;
}
// Setup locking information // Setup locking information
int midway_x = initial.ptr->x + initial.ptr->width/2; int midway_x = initial.ptr->x + initial.ptr->width/2;
int midway_y = initial.ptr->y + initial.ptr->height/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 on drag/resize mode
switch (pointer_state.mode & (M_DRAGGING | M_RESIZING)) { switch (pointer_state.mode & (M_DRAGGING | M_RESIZING)) {
case M_DRAGGING: case M_DRAGGING:
// end drag mode when left click is unpressed // end drag mode when 'dragging' click is unpressed
if (!pointer_state.left.held) { 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; pointer_state.mode = 0;
} }
break; break;
case M_RESIZING: case M_RESIZING:
// end resize mode when right click is unpressed // end resize mode when 'resizing' click is unpressed
if (!pointer_state.right.held) { 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; pointer_state.mode = 0;
} }
break; break;
@ -255,19 +274,27 @@ void pointer_mode_set(uint32_t button, bool condition) {
// Set mode depending on current button press // Set mode depending on current button press
switch (button) { switch (button) {
// Start dragging mode // Start left-click mode
case M_LEFT_CLICK: case M_LEFT_CLICK:
// if button release dont do anything // if button release dont do anything
if (pointer_state.left.held) { 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; break;
// Start resize mode // Start right-click mode
case M_RIGHT_CLICK: case M_RIGHT_CLICK:
// if button release dont do anyhting // if button release dont do anyhting
if (pointer_state.right.held) { 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; break;
} }
@ -287,8 +314,17 @@ void pointer_mode_update(void) {
switch (pointer_state.mode) { switch (pointer_state.mode) {
case M_FLOATING | M_DRAGGING: case M_FLOATING | M_DRAGGING:
// Update position // Update position
switch (config->resizing_key) {
case M_LEFT_CLICK:
dx -= pointer_state.left.x; dx -= pointer_state.left.x;
dy -= pointer_state.left.y; 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) { if (initial.x + dx != initial.ptr->x) {
initial.ptr->x = initial.x + dx; initial.ptr->x = initial.x + dx;
} }
@ -299,9 +335,19 @@ void pointer_mode_update(void) {
break; break;
case M_FLOATING | M_RESIZING: case M_FLOATING | M_RESIZING:
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; dx -= pointer_state.right.x;
dy -= pointer_state.right.y; dy -= pointer_state.right.y;
initial.ptr = pointer_state.right.view; initial.ptr = pointer_state.right.view;
break;
}
if (lock.left) { if (lock.left) {
if (initial.w + dx > min_sane_w) { if (initial.w + dx > min_sane_w) {
initial.ptr->width = initial.w + dx; initial.ptr->width = initial.w + dx;
@ -341,8 +387,17 @@ void pointer_mode_update(void) {
break; break;
case M_TILING | M_RESIZING: case M_TILING | M_RESIZING:
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; dx -= pointer_state.right.x;
dy -= pointer_state.right.y; dy -= pointer_state.right.y;
break;
}
// resize if we can // resize if we can
if (initial.horiz.ptr) { if (initial.horiz.ptr) {
if (lock.left) { if (lock.left) {