Add focus_follows_mouse always. (#3081)
* Add focus_follows_mouse_mode. * Fail if focus_follows_mouse is invalid. * Fix indentation.
This commit is contained in:
parent
001ec1f3fd
commit
4a21981855
|
@ -327,6 +327,12 @@ struct ipc_policy {
|
||||||
uint32_t features;
|
uint32_t features;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum focus_follows_mouse_mode {
|
||||||
|
FOLLOWS_NO,
|
||||||
|
FOLLOWS_YES,
|
||||||
|
FOLLOWS_ALWAYS
|
||||||
|
};
|
||||||
|
|
||||||
enum focus_wrapping_mode {
|
enum focus_wrapping_mode {
|
||||||
WRAP_NO,
|
WRAP_NO,
|
||||||
WRAP_YES,
|
WRAP_YES,
|
||||||
|
@ -378,7 +384,7 @@ struct sway_config {
|
||||||
enum sway_popup_during_fullscreen popup_during_fullscreen;
|
enum sway_popup_during_fullscreen popup_during_fullscreen;
|
||||||
|
|
||||||
// Flags
|
// Flags
|
||||||
bool focus_follows_mouse;
|
enum focus_follows_mouse_mode focus_follows_mouse;
|
||||||
enum mouse_warping_mode mouse_warping;
|
enum mouse_warping_mode mouse_warping;
|
||||||
enum focus_wrapping_mode focus_wrapping;
|
enum focus_wrapping_mode focus_wrapping;
|
||||||
bool active;
|
bool active;
|
||||||
|
|
|
@ -7,8 +7,15 @@ struct cmd_results *cmd_focus_follows_mouse(int argc, char **argv) {
|
||||||
struct cmd_results *error = NULL;
|
struct cmd_results *error = NULL;
|
||||||
if ((error = checkarg(argc, "focus_follows_mouse", EXPECTED_EQUAL_TO, 1))) {
|
if ((error = checkarg(argc, "focus_follows_mouse", EXPECTED_EQUAL_TO, 1))) {
|
||||||
return error;
|
return error;
|
||||||
|
} else if(strcmp(argv[0], "no") == 0) {
|
||||||
|
config->focus_follows_mouse = FOLLOWS_NO;
|
||||||
|
} else if(strcmp(argv[0], "yes") == 0) {
|
||||||
|
config->focus_follows_mouse = FOLLOWS_YES;
|
||||||
|
} else if(strcmp(argv[0], "always") == 0) {
|
||||||
|
config->focus_follows_mouse = FOLLOWS_ALWAYS;
|
||||||
|
} else {
|
||||||
|
return cmd_results_new(CMD_FAILURE, "focus_follows_mouse",
|
||||||
|
"Expected 'focus_follows_mouse no|yes|always'");
|
||||||
}
|
}
|
||||||
config->focus_follows_mouse =
|
|
||||||
parse_boolean(argv[0], config->focus_follows_mouse);
|
|
||||||
return cmd_results_new(CMD_SUCCESS, NULL, NULL);
|
return cmd_results_new(CMD_SUCCESS, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
|
@ -220,7 +220,7 @@ static void config_defaults(struct sway_config *config) {
|
||||||
config->floating_minimum_height = 50;
|
config->floating_minimum_height = 50;
|
||||||
|
|
||||||
// Flags
|
// Flags
|
||||||
config->focus_follows_mouse = true;
|
config->focus_follows_mouse = FOLLOWS_YES;
|
||||||
config->mouse_warping = WARP_OUTPUT;
|
config->mouse_warping = WARP_OUTPUT;
|
||||||
config->focus_wrapping = WRAP_YES;
|
config->focus_wrapping = WRAP_YES;
|
||||||
config->validating = false;
|
config->validating = false;
|
||||||
|
|
|
@ -637,7 +637,8 @@ void cursor_send_pointer_motion(struct sway_cursor *cursor,
|
||||||
cursor->previous.y = cursor->cursor->y;
|
cursor->previous.y = cursor->cursor->y;
|
||||||
cursor->previous.node = node;
|
cursor->previous.node = node;
|
||||||
|
|
||||||
if (node && config->focus_follows_mouse) {
|
if (node && (config->focus_follows_mouse == FOLLOWS_YES ||
|
||||||
|
config->focus_follows_mouse == FOLLOWS_ALWAYS)) {
|
||||||
struct sway_node *focus = seat_get_focus(seat);
|
struct sway_node *focus = seat_get_focus(seat);
|
||||||
if (focus && node->type == N_WORKSPACE) {
|
if (focus && node->type == N_WORKSPACE) {
|
||||||
// Only follow the mouse if it would move to a new output
|
// Only follow the mouse if it would move to a new output
|
||||||
|
@ -652,9 +653,10 @@ void cursor_send_pointer_motion(struct sway_cursor *cursor,
|
||||||
// - cursor is over a new view, i.e. entered a new window; and
|
// - cursor is over a new view, i.e. entered a new window; and
|
||||||
// - the new view is visible, i.e. not hidden in a stack or tab; and
|
// - the new view is visible, i.e. not hidden in a stack or tab; and
|
||||||
// - the seat does not have a keyboard grab
|
// - the seat does not have a keyboard grab
|
||||||
if (!wlr_seat_keyboard_has_grab(cursor->seat->wlr_seat) &&
|
if ((!wlr_seat_keyboard_has_grab(cursor->seat->wlr_seat) &&
|
||||||
node != prev_node &&
|
node != prev_node &&
|
||||||
view_is_visible(node->sway_container->view)) {
|
view_is_visible(node->sway_container->view)) ||
|
||||||
|
config->focus_follows_mouse == FOLLOWS_ALWAYS) {
|
||||||
seat_set_focus(seat, node);
|
seat_set_focus(seat, node);
|
||||||
} else {
|
} else {
|
||||||
struct sway_node *next_focus =
|
struct sway_node *next_focus =
|
||||||
|
|
Loading…
Reference in a new issue