Merge pull request #935 from thejan2009/wrap-focus-change

Wrap focus change
This commit is contained in:
Drew DeVault 2016-10-07 08:40:18 -04:00
parent 61097085b0
commit a92d427b37
5 changed files with 46 additions and 4 deletions

View file

@ -106,6 +106,7 @@ sway_cmd cmd_focus;
sway_cmd cmd_focus_follows_mouse; sway_cmd cmd_focus_follows_mouse;
sway_cmd cmd_font; sway_cmd cmd_font;
sway_cmd cmd_for_window; sway_cmd cmd_for_window;
sway_cmd cmd_force_focus_wrapping;
sway_cmd cmd_fullscreen; sway_cmd cmd_fullscreen;
sway_cmd cmd_gaps; sway_cmd cmd_gaps;
sway_cmd cmd_hide_edge_borders; sway_cmd cmd_hide_edge_borders;

View file

@ -211,6 +211,7 @@ struct sway_config {
// Flags // Flags
bool focus_follows_mouse; bool focus_follows_mouse;
bool mouse_warping; bool mouse_warping;
bool force_focus_wrapping;
bool active; bool active;
bool failed; bool failed;
bool reloading; bool reloading;

View file

@ -171,6 +171,7 @@ static struct cmd_handler handlers[] = {
{ "focus", cmd_focus }, { "focus", cmd_focus },
{ "focus_follows_mouse", cmd_focus_follows_mouse }, { "focus_follows_mouse", cmd_focus_follows_mouse },
{ "font", cmd_font }, { "font", cmd_font },
{ "force_focus_wrapping", cmd_force_focus_wrapping },
{ "for_window", cmd_for_window }, { "for_window", cmd_for_window },
{ "fullscreen", cmd_fullscreen }, { "fullscreen", cmd_fullscreen },
{ "gaps", cmd_gaps }, { "gaps", cmd_gaps },

View file

@ -0,0 +1,12 @@
#include <string.h>
#include "sway/commands.h"
struct cmd_results *cmd_force_focus_wrapping(int argc, char **argv) {
struct cmd_results *error = NULL;
if ((error = checkarg(argc, "force_focus_wrapping", EXPECTED_EQUAL_TO, 1))) {
return error;
}
config->force_focus_wrapping = !strcasecmp(argv[0], "yes");
return cmd_results_new(CMD_SUCCESS, NULL, NULL);
}

View file

@ -1084,13 +1084,17 @@ swayc_t *get_swayc_in_direction_under(swayc_t *container, enum movement_directio
return container->fullscreen; return container->fullscreen;
} }
swayc_t *wrap_candidate = NULL;
while (true) { while (true) {
// Test if we can even make a difference here // Test if we can even make a difference here
bool can_move = false; bool can_move = false;
int diff = 0; int diff = 0;
if (parent->type == C_ROOT) { if (parent->type == C_ROOT) {
sway_log(L_DEBUG, "Moving between outputs");
swayc_t *output = swayc_adjacent_output(container, dir, &abs_pos, true); swayc_t *output = swayc_adjacent_output(container, dir, &abs_pos, true);
if (!output || output == container) {
return wrap_candidate;
}
sway_log(L_DEBUG, "Moving between outputs");
return get_swayc_in_output_direction(output, dir); return get_swayc_in_output_direction(output, dir);
} else { } else {
if (dir == MOVE_LEFT || dir == MOVE_RIGHT) { if (dir == MOVE_LEFT || dir == MOVE_RIGHT) {
@ -1108,8 +1112,31 @@ swayc_t *get_swayc_in_direction_under(swayc_t *container, enum movement_directio
if (can_move) { if (can_move) {
int desired = index_child(container) + diff; int desired = index_child(container) + diff;
if (container->is_floating || desired < 0 || desired >= parent->children->length) { if (container->is_floating) {
if (desired < 0) {
wrap_candidate = parent->floating->items[parent->floating->length-1];
} else if (desired >= parent->floating->length){
wrap_candidate = parent->floating->items[0];
} else {
wrap_candidate = parent->floating->items[desired];
}
if (wrap_candidate) {
wlc_view_bring_to_front(wrap_candidate->handle);
}
return wrap_candidate;
} else if (desired < 0 || desired >= parent->children->length) {
can_move = false; can_move = false;
int len = parent->children->length;
if (!wrap_candidate && len > 1) {
if (desired < 0) {
wrap_candidate = parent->children->items[len-1];
} else {
wrap_candidate = parent->children->items[0];
}
if (config->force_focus_wrapping) {
return wrap_candidate;
}
}
} else { } else {
return parent->children->items[desired]; return parent->children->items[desired];
} }
@ -1118,8 +1145,8 @@ swayc_t *get_swayc_in_direction_under(swayc_t *container, enum movement_directio
container = parent; container = parent;
parent = parent->parent; parent = parent->parent;
if (!parent || container == limit) { if (!parent || container == limit) {
// Nothing we can do // wrapping is the last chance
return NULL; return wrap_candidate;
} }
} }
} }