Skip to content

Commit

Permalink
layout: Keep output at the correct size, workspace can be smaller.
Browse files Browse the repository at this point in the history
If the output is not at the correct size then that info must be queried
from wlc. The output size is used by e.g. seamless mouse to detect
output edges.

With this patch the output size is now correct and the workspace size is
adjusted according to any panels.

Without this patch seamless mouse would fail to detect outputs
above/below each other if there was a panel in between because the
output would offically end where the panel started, not at the actual
screen edge.
  • Loading branch information
sce committed Dec 18, 2015
1 parent 8033eb4 commit ed730db
Showing 1 changed file with 29 additions and 20 deletions.
49 changes: 29 additions & 20 deletions sway/layout.c
Original file line number Diff line number Diff line change
Expand Up @@ -432,9 +432,29 @@ static void arrange_windows_r(swayc_t *container, double width, double height) {
{
struct wlc_size resolution = *wlc_output_get_resolution(container->handle);
width = resolution.w; height = resolution.h;
// output must have correct size due to e.g. seamless mouse,
// but a workspace might be smaller depending on panels.
container->width = width;
container->height = height;
}
// arrange all workspaces:
for (i = 0; i < container->children->length; ++i) {
swayc_t *child = container->children->items[i];
arrange_windows_r(child, -1, -1);
}
// Bring all unmanaged views to the front
for (i = 0; i < container->unmanaged->length; ++i) {
wlc_handle *handle = container->unmanaged->items[i];
wlc_view_bring_to_front(*handle);
}
return;
case C_WORKSPACE:
{
swayc_t *output = swayc_parent_by_type(container, C_OUTPUT);
int width = output->width, height = output->height;
for (i = 0; i < desktop_shell.panels->length; ++i) {
struct panel_config *config = desktop_shell.panels->items[i];
if (config->output == container->handle) {
if (config->output == output->handle) {
struct wlc_size size = *wlc_surface_get_size(config->surface);
switch (desktop_shell.panel_position) {
case DESKTOP_SHELL_PANEL_POSITION_TOP:
Expand All @@ -452,27 +472,16 @@ static void arrange_windows_r(swayc_t *container, double width, double height) {
}
}
}
int gap = swayc_gap(container);
container->x = gap;
container->y = gap;
container->width = width - gap * 2;
container->height = height - gap * 2;
sway_log(L_DEBUG, "Arranging workspace #%d at %f, %f", i, container->x, container->y);

container->width = width;
container->height = height;
for (i = 0; i < container->children->length; ++i) {
swayc_t *child = container->children->items[i];
int gap = swayc_gap(child);
child->x = x + gap;
child->y = y + gap;
child->width = width - gap * 2;
child->height = height - gap * 2;
sway_log(L_DEBUG, "Arranging workspace #%d at %f, %f", i, child->x, child->y);
arrange_windows_r(child, -1, -1);
}

// Bring all unmanaged views to the front
for (i = 0; i < container->unmanaged->length; ++i) {
wlc_handle *handle = container->unmanaged->items[i];
wlc_view_bring_to_front(*handle);
}
}
return;
// children are properly handled below
break;
case C_VIEW:
{
container->width = width;
Expand Down

0 comments on commit ed730db

Please sign in to comment.