setup for resizable windows, drop weight

This commit is contained in:
taiyu 2015-08-20 04:47:36 -07:00
parent ba6034e8c8
commit fbaa9111a8
5 changed files with 58 additions and 30 deletions

View file

@ -44,8 +44,6 @@ struct sway_container {
bool is_floating; bool is_floating;
bool is_focused; bool is_focused;
int weight;
char *name; char *name;
int gaps; int gaps;

View file

@ -242,6 +242,7 @@ static bool cmd_floating(struct sway_config *config, int argc, char **argv) {
add_sibling(focused, view); add_sibling(focused, view);
} }
// Refocus on the view once its been put back into the layout // Refocus on the view once its been put back into the layout
view->width = view->height = 0;
arrange_windows(active_workspace, -1, -1); arrange_windows(active_workspace, -1, -1);
} }
set_focused_container(view); set_focused_container(view);

View file

@ -14,7 +14,6 @@ static swayc_t *new_swayc(enum swayc_types type) {
c->handle = -1; c->handle = -1;
c->layout = L_NONE; c->layout = L_NONE;
c->type = type; c->type = type;
c->weight = 1;
if (type != C_VIEW) { if (type != C_VIEW) {
c->children = create_list(); c->children = create_list();
} }
@ -172,6 +171,14 @@ swayc_t *new_view(swayc_t *sibling, wlc_handle handle) {
view->name = title ? strdup(title) : NULL; view->name = title ? strdup(title) : NULL;
view->visible = true; view->visible = true;
view->is_focused = true; view->is_focused = true;
//Setup geometry
view->width = sibling->parent->width;
view->height = sibling->parent->height;
if (sibling->parent->layout == L_HORIZ) {
view->width /= sibling->parent->children->length;
} else {
view->height /= sibling->parent->children->length;
}
view->gaps = config->gaps_inner; view->gaps = config->gaps_inner;

View file

@ -186,40 +186,63 @@ void arrange_windows(swayc_t *container, int width, int height) {
break; break;
} }
double total_weight = 0; x = y = 0;
for (i = 0; i < container->children->length; ++i) { double scale = 0;
swayc_t *child = container->children->items[i];
total_weight += child->weight;
}
switch (container->layout) { switch (container->layout) {
case L_HORIZ: case L_HORIZ:
default: default:
sway_log(L_DEBUG, "Arranging %p horizontally", container); //Calculate total width
for (i = 0; i < container->children->length; ++i) { for (i = 0; i < container->children->length; ++i) {
swayc_t *child = container->children->items[i]; int *old_width = &((swayc_t *)container->children->items[i])->width;
double percent = child->weight / total_weight; if (*old_width == 0) {
sway_log(L_DEBUG, "Calculating arrangement for %p:%d (will receive %.2f of %d)", child, child->type, percent, width); if (container->children->length > 1) {
child->x = x + container->x; *old_width = width / (container->children->length - 1);
child->y = y + container->y; } else {
int w = width * percent; *old_width = width;
int h = height; }
arrange_windows(child, w, h); sway_log(L_DEBUG,"setting width as %d",*old_width);
x += w; }
scale += *old_width;
}
//Resize windows
if (scale > 0.1) {
scale = width / scale;
sway_log(L_DEBUG, "Arranging %p horizontally", container);
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 %d by %f)", child, child->type, width, scale);
child->x = x + container->x;
child->y = y + container->y;
arrange_windows(child, child->width * scale, height);
x += child->width;
}
} }
break; break;
case L_VERT: case L_VERT:
sway_log(L_DEBUG, "Arranging %p vertically", container); //Calculate total height
for (i = 0; i < container->children->length; ++i) { for (i = 0; i < container->children->length; ++i) {
swayc_t *child = container->children->items[i]; int *old_height = &((swayc_t *)container->children->items[i])->height;
double percent = child->weight / total_weight; if (container->children->length > 1) {
sway_log(L_DEBUG, "Calculating arrangement for %p:%d (will receive %.2f of %d)", child, child->type, percent, width); *old_height = height / (container->children->length - 1);
child->x = x + container->x; } else {
child->y = y + container->y; *old_height = height;
int w = width; }
int h = height * percent; if (*old_height == 0) {
arrange_windows(child, w, h); }
y += h; scale += *old_height;
}
//Resize
if (scale > 0.1) {
scale = height / scale;
sway_log(L_DEBUG, "Arranging %p vertically", container);
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 %d by %f)", child, child->type, height, scale);
child->x = x + container->x;
child->y = y + container->y;
arrange_windows(child, width, child->height * scale);
y += child->height;
}
} }
break; break;
} }

View file

@ -114,7 +114,6 @@ static void container_log(const swayc_t *c) {
fprintf(stderr, "w:%d|h:%d|", c->width, c->height); fprintf(stderr, "w:%d|h:%d|", c->width, c->height);
fprintf(stderr, "x:%d|y:%d|", c->x, c->y); fprintf(stderr, "x:%d|y:%d|", c->x, c->y);
fprintf(stderr, "vis:%c|", c->visible?'t':'f'); fprintf(stderr, "vis:%c|", c->visible?'t':'f');
fprintf(stderr, "wgt:%d|", c->weight);
fprintf(stderr, "name:%.16s|", c->name); fprintf(stderr, "name:%.16s|", c->name);
fprintf(stderr, "children:%d\n",c->children?c->children->length:0); fprintf(stderr, "children:%d\n",c->children?c->children->length:0);
} }