|
|
@ -398,9 +398,58 @@ static swayc_t *get_swayc_in_output_direction(swayc_t *output,
|
|
|
|
return output;
|
|
|
|
return output;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void get_absolute_center_position(swayc_t *container, int *x, int *y) {
|
|
|
|
static void get_layout_center_position(swayc_t *container, int *x, int *y) {
|
|
|
|
*x = container->x + container->width/2;
|
|
|
|
// FIXME view coords are inconsistently referred to in layout/output systems
|
|
|
|
*y = container->y + container->height/2;
|
|
|
|
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,
|
|
|
|
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
|
|
|
|
// If moving to an adjacent output we need a starting position (since this
|
|
|
|
// output might border to multiple outputs).
|
|
|
|
// output might border to multiple outputs).
|
|
|
|
//struct wlc_point abs_pos;
|
|
|
|
//struct wlc_point abs_pos;
|
|
|
|
//get_absolute_center_position(container, &abs_pos);
|
|
|
|
//get_layout_center_position(container, &abs_pos);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// TODO WLR fullscreen
|
|
|
|
// 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)) {
|
|
|
|
if (container->type == C_VIEW && swayc_is_fullscreen(container)) {
|
|
|
|
wlr_log(L_DEBUG, "Moving from fullscreen view, skipping to output");
|
|
|
|
wlr_log(L_DEBUG, "Moving from fullscreen view, skipping to output");
|
|
|
|
container = swayc_parent_by_type(container, C_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);
|
|
|
|
swayc_t *output = swayc_adjacent_output(container, dir, &abs_pos, true);
|
|
|
|
return get_swayc_in_output_direction(output, dir);
|
|
|
|
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 desired;
|
|
|
|
int idx = index_child(container);
|
|
|
|
int idx = index_child(container);
|
|
|
|
if (parent->type == C_ROOT) {
|
|
|
|
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;
|
|
|
|
struct wlr_output_layout *layout = root_container.sway_root->output_layout;
|
|
|
|
wlr_output_layout_adjacent_output(layout, container->sway_output->wlr_output);
|
|
|
|
struct wlr_output *wlr_adjacent =
|
|
|
|
//swayc_t *output = swayc_adjacent_output(container, dir, &abs_pos, true);
|
|
|
|
wlr_output_layout_adjacent_output(layout, wlr_dir,
|
|
|
|
if (!output || output == container) {
|
|
|
|
container->sway_output->wlr_output, lx, ly);
|
|
|
|
|
|
|
|
swayc_t *adjacent = sway_output_from_wlr(wlr_adjacent);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!adjacent || adjacent == container) {
|
|
|
|
return wrap_candidate;
|
|
|
|
return wrap_candidate;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
wlr_log(L_DEBUG, "Moving between outputs");
|
|
|
|
// TODO descend into the focus-inactive of the physically closest
|
|
|
|
return get_swayc_in_output_direction(output, dir, seat);
|
|
|
|
// 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 {
|
|
|
|
} else {
|
|
|
|
if (dir == MOVE_LEFT || dir == MOVE_RIGHT) {
|
|
|
|
if (dir == MOVE_LEFT || dir == MOVE_RIGHT) {
|
|
|
|
if (parent->layout == L_HORIZ || parent->layout == L_TABBED) {
|
|
|
|
if (parent->layout == L_HORIZ || parent->layout == L_TABBED) {
|
|
|
|