mirror of
https://github.com/NickHu/sway
synced 2024-12-30 22:23:30 +01:00
Merge pull request #414 from sce/fix_layout_calc
Fix layout calculations
This commit is contained in:
commit
e363546b69
3 changed files with 35 additions and 12 deletions
|
@ -32,6 +32,7 @@ target_link_libraries(sway
|
|||
${PCRE_LIBRARIES}
|
||||
${JSONC_LIBRARIES}
|
||||
${WAYLAND_SERVER_LIBRARIES}
|
||||
m
|
||||
)
|
||||
|
||||
install(
|
||||
|
|
|
@ -279,8 +279,8 @@ static void handle_view_focus(wlc_handle view, bool focus) {
|
|||
}
|
||||
|
||||
static void handle_view_geometry_request(wlc_handle handle, const struct wlc_geometry *geometry) {
|
||||
sway_log(L_DEBUG, "geometry request for %ld %dx%d : %dx%d",
|
||||
handle, geometry->origin.x, geometry->origin.y, geometry->size.w, geometry->size.h);
|
||||
sway_log(L_DEBUG, "geometry request for %ld %dx%d @ %d,%d", handle,
|
||||
geometry->size.w, geometry->size.h, geometry->origin.x, geometry->origin.y);
|
||||
// If the view is floating, then apply the geometry.
|
||||
// Otherwise save the desired width/height for the view.
|
||||
// This will not do anything for the time being as WLC improperly sends geometry requests
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <math.h>
|
||||
#include <wlc/wlc.h>
|
||||
#include "extensions.h"
|
||||
#include "layout.h"
|
||||
|
@ -379,6 +380,11 @@ void update_geometry(swayc_t *container) {
|
|||
swayc_t *ws = swayc_parent_by_type(container, C_WORKSPACE);
|
||||
swayc_t *op = ws->parent;
|
||||
int gap = container->is_floating ? 0 : swayc_gap(container);
|
||||
if (gap % 2 != 0) {
|
||||
// because gaps are implemented as "half sized margins" it's currently
|
||||
// not possible to align views properly with odd sized gaps.
|
||||
gap -= 1;
|
||||
}
|
||||
|
||||
struct wlc_geometry geometry = {
|
||||
.origin = {
|
||||
|
@ -430,11 +436,16 @@ static void arrange_windows_r(swayc_t *container, double width, double height) {
|
|||
width = container->width;
|
||||
height = container->height;
|
||||
}
|
||||
// pixels are indivisable. if we don't round the pixels, then the view
|
||||
// calculations will be off (e.g. 50.5 + 50.5 = 101, but in reality it's
|
||||
// 50 + 50 = 100). doing it here cascades properly to all width/height/x/y.
|
||||
width = floor(width);
|
||||
height = floor(height);
|
||||
|
||||
sway_log(L_DEBUG, "Arranging layout for %p %s %fx%f+%f,%f", container,
|
||||
container->name, container->width, container->height, container->x, container->y);
|
||||
|
||||
int x = 0, y = 0;
|
||||
double x = 0, y = 0;
|
||||
switch (container->type) {
|
||||
case C_ROOT:
|
||||
for (i = 0; i < container->children->length; ++i) {
|
||||
|
@ -489,8 +500,8 @@ static void arrange_windows_r(swayc_t *container, double width, double height) {
|
|||
}
|
||||
}
|
||||
int gap = swayc_gap(container);
|
||||
container->x = x + gap;
|
||||
container->y = y + gap;
|
||||
x = container->x = x + gap;
|
||||
y = container->y = y + gap;
|
||||
width = container->width = width - gap * 2;
|
||||
height = container->height = height - gap * 2;
|
||||
sway_log(L_DEBUG, "Arranging workspace '%s' at %f, %f", container->name, container->x, container->y);
|
||||
|
@ -509,10 +520,11 @@ static void arrange_windows_r(swayc_t *container, double width, double height) {
|
|||
default:
|
||||
container->width = width;
|
||||
container->height = height;
|
||||
x = container->x;
|
||||
y = container->y;
|
||||
break;
|
||||
}
|
||||
|
||||
x = y = 0;
|
||||
double scale = 0;
|
||||
switch (container->layout) {
|
||||
case L_HORIZ:
|
||||
|
@ -536,9 +548,14 @@ static void arrange_windows_r(swayc_t *container, double width, double height) {
|
|||
for (i = 0; i < container->children->length; ++i) {
|
||||
swayc_t *child = container->children->items[i];
|
||||
sway_log(L_DEBUG, "Calculating arrangement for %p:%d (will scale %f by %f)", child, child->type, width, scale);
|
||||
child->x = x + container->x;
|
||||
child->y = y + container->y;
|
||||
arrange_windows_r(child, child->width * scale, height);
|
||||
child->x = x;
|
||||
child->y = y;
|
||||
if (i == container->children->length - 1) {
|
||||
double remaining_width = container->x + width - x;
|
||||
arrange_windows_r(child, remaining_width, height);
|
||||
} else {
|
||||
arrange_windows_r(child, child->width * scale, height);
|
||||
}
|
||||
x += child->width;
|
||||
}
|
||||
}
|
||||
|
@ -563,9 +580,14 @@ static void arrange_windows_r(swayc_t *container, double width, double height) {
|
|||
for (i = 0; i < container->children->length; ++i) {
|
||||
swayc_t *child = container->children->items[i];
|
||||
sway_log(L_DEBUG, "Calculating arrangement for %p:%d (will scale %f by %f)", child, child->type, height, scale);
|
||||
child->x = x + container->x;
|
||||
child->y = y + container->y;
|
||||
arrange_windows_r(child, width, child->height * scale);
|
||||
child->x = x;
|
||||
child->y = y;
|
||||
if (i == container->children->length - 1) {
|
||||
double remaining_height = container->y + height - y;
|
||||
arrange_windows_r(child, width, remaining_height);
|
||||
} else {
|
||||
arrange_windows_r(child, width, child->height * scale);
|
||||
}
|
||||
y += child->height;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue