mirror of
https://github.com/NickHu/sway
synced 2024-12-27 21:58:11 +01:00
basic move focus in direction across outputs
This commit is contained in:
parent
80927985fb
commit
fb37e80225
1 changed files with 73 additions and 13 deletions
|
@ -398,9 +398,58 @@ static swayc_t *get_swayc_in_output_direction(swayc_t *output,
|
|||
return output;
|
||||
}
|
||||
|
||||
static void get_absolute_center_position(swayc_t *container, int *x, int *y) {
|
||||
*x = container->x + container->width/2;
|
||||
*y = container->y + container->height/2;
|
||||
static void get_layout_center_position(swayc_t *container, int *x, int *y) {
|
||||
// FIXME view coords are inconsistently referred to in layout/output systems
|
||||
if (container->type == C_OUTPUT) {
|
||||
*x = container->x + container->width/2;
|
||||
*y = container->y + container->height/2;
|
||||
} else {
|
||||
swayc_t *output = swayc_parent_by_type(container, C_OUTPUT);
|
||||
if (container->type == C_WORKSPACE) {
|
||||
// Workspace coordinates are actually wrong/arbitrary, but should
|
||||
// be same as output.
|
||||
*x = output->x;
|
||||
*y = output->y;
|
||||
} else {
|
||||
*x = output->x + container->x;
|
||||
*y = output->y + container->y;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static bool sway_dir_to_wlr(enum movement_direction dir, enum wlr_direction *out) {
|
||||
*out = 0;
|
||||
switch (dir) {
|
||||
case MOVE_UP:
|
||||
*out = WLR_DIRECTION_UP;
|
||||
break;
|
||||
case MOVE_DOWN:
|
||||
*out = WLR_DIRECTION_DOWN;
|
||||
break;
|
||||
case MOVE_LEFT:
|
||||
*out = WLR_DIRECTION_LEFT;
|
||||
break;
|
||||
case MOVE_RIGHT:
|
||||
*out = WLR_DIRECTION_RIGHT;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return *out != 0;
|
||||
}
|
||||
|
||||
static swayc_t *sway_output_from_wlr(struct wlr_output *output) {
|
||||
if (output == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
for (int i = 0; i < root_container.children->length; ++i) {
|
||||
swayc_t *o = root_container.children->items[i];
|
||||
if (o->type == C_OUTPUT && o->sway_output->wlr_output == output) {
|
||||
return o;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static swayc_t *get_swayc_in_direction_under(swayc_t *container,
|
||||
|
@ -435,7 +484,7 @@ static swayc_t *get_swayc_in_direction_under(swayc_t *container,
|
|||
// If moving to an adjacent output we need a starting position (since this
|
||||
// output might border to multiple outputs).
|
||||
//struct wlc_point abs_pos;
|
||||
//get_absolute_center_position(container, &abs_pos);
|
||||
//get_layout_center_position(container, &abs_pos);
|
||||
|
||||
|
||||
// TODO WLR fullscreen
|
||||
|
@ -443,7 +492,7 @@ static swayc_t *get_swayc_in_direction_under(swayc_t *container,
|
|||
if (container->type == C_VIEW && swayc_is_fullscreen(container)) {
|
||||
wlr_log(L_DEBUG, "Moving from fullscreen view, skipping to output");
|
||||
container = swayc_parent_by_type(container, C_OUTPUT);
|
||||
get_absolute_center_position(container, &abs_pos);
|
||||
get_layout_center_position(container, &abs_pos);
|
||||
swayc_t *output = swayc_adjacent_output(container, dir, &abs_pos, true);
|
||||
return get_swayc_in_output_direction(output, dir);
|
||||
}
|
||||
|
@ -460,17 +509,28 @@ static swayc_t *get_swayc_in_direction_under(swayc_t *container,
|
|||
int desired;
|
||||
int idx = index_child(container);
|
||||
if (parent->type == C_ROOT) {
|
||||
// TODO
|
||||
/*
|
||||
enum wlr_direction wlr_dir = 0;
|
||||
if (!sway_assert(sway_dir_to_wlr(dir, &wlr_dir),
|
||||
"got invalid direction: %d", dir)) {
|
||||
return NULL;
|
||||
}
|
||||
int lx, ly;
|
||||
get_layout_center_position(container, &lx, &ly);
|
||||
struct wlr_output_layout *layout = root_container.sway_root->output_layout;
|
||||
wlr_output_layout_adjacent_output(layout, container->sway_output->wlr_output);
|
||||
//swayc_t *output = swayc_adjacent_output(container, dir, &abs_pos, true);
|
||||
if (!output || output == container) {
|
||||
struct wlr_output *wlr_adjacent =
|
||||
wlr_output_layout_adjacent_output(layout, wlr_dir,
|
||||
container->sway_output->wlr_output, lx, ly);
|
||||
swayc_t *adjacent = sway_output_from_wlr(wlr_adjacent);
|
||||
|
||||
if (!adjacent || adjacent == container) {
|
||||
return wrap_candidate;
|
||||
}
|
||||
wlr_log(L_DEBUG, "Moving between outputs");
|
||||
return get_swayc_in_output_direction(output, dir, seat);
|
||||
*/
|
||||
// TODO descend into the focus-inactive of the physically closest
|
||||
// view of the output
|
||||
//swayc_t *new_con = get_swayc_in_output_direction(adjacent, dir, seat);
|
||||
swayc_t *new_con = sway_seat_get_focus_inactive(seat, adjacent);
|
||||
return new_con;
|
||||
|
||||
} else {
|
||||
if (dir == MOVE_LEFT || dir == MOVE_RIGHT) {
|
||||
if (parent->layout == L_HORIZ || parent->layout == L_TABBED) {
|
||||
|
|
Loading…
Reference in a new issue