+/* Recursively give the Glk windows their allocated space */
+static void
+allocate_recurse(winid_t win, GtkAllocation *allocation, guint spacing)
+{
+ if(win->type == wintype_Pair)
+ {
+ GtkAllocation child1, child2;
+ child1.x = allocation->x;
+ child1.y = allocation->y;
+
+ if((win->split_method & winmethod_DivisionMask) == winmethod_Fixed)
+ {
+ switch(win->split_method & winmethod_DirMask)
+ {
+ case winmethod_Left:
+ child1.width = CLAMP(win->constraint_size * win->key_window->unit_width, 0, allocation->width - spacing);
+ break;
+ case winmethod_Right:
+ child2.width = CLAMP(win->constraint_size * win->key_window->unit_width, 0, allocation->width - spacing);
+ break;
+ case winmethod_Above:
+ child1.height = CLAMP(win->constraint_size * win->key_window->unit_height, 0, allocation->height - spacing);
+ break;
+ case winmethod_Below:
+ child2.height = CLAMP(win->constraint_size * win->key_window->unit_height, 0, allocation->height - spacing);
+ break;
+ }
+ }
+ else /* proportional */
+ {
+ gdouble fraction = win->constraint_size / 100.0;
+ switch(win->split_method & winmethod_DirMask)
+ {
+ case winmethod_Left:
+ child1.width = (glui32) ceil( fraction * (allocation->width - spacing) );
+ break;
+ case winmethod_Right:
+ child2.width = (glui32) ceil( fraction * (allocation->width - spacing) );
+ break;
+ case winmethod_Above:
+ child1.height = (glui32) ceil( fraction * (allocation->height - spacing) );
+ break;
+ case winmethod_Below:
+ child2.height = (glui32) ceil( fraction * (allocation->height - spacing) );
+ break;
+ }
+ }
+
+ /* Fill in the rest of the size requisitions according to the child specified above */
+ switch(win->split_method & winmethod_DirMask)
+ {
+ case winmethod_Left:
+ child2.width = allocation->width - spacing - child1.width;
+ child2.x = child1.x + child1.width + spacing;
+ child2.y = child1.y;
+ child1.height = child2.height = allocation->height;
+ break;
+ case winmethod_Right:
+ child1.width = allocation->width - spacing - child2.width;
+ child2.x = child1.x + child1.width + spacing;
+ child2.y = child1.y;
+ child1.height = child2.height = allocation->height;
+ break;
+ case winmethod_Above:
+ child2.height = allocation->height - spacing - child1.height;
+ child2.x = child1.x;
+ child2.y = child1.y + child1.height + spacing;
+ child1.width = child2.width = allocation->width;
+ break;
+ case winmethod_Below:
+ child1.height = allocation->height - spacing - child2.height;
+ child2.x = child1.x;
+ child2.y = child1.y + child1.height + spacing;
+ child1.width = child2.width = allocation->width;
+ break;
+ }
+
+ /* Recurse */
+ allocate_recurse(win->window_node->children->data, &child1, spacing);
+ allocate_recurse(win->window_node->children->next->data, &child2, spacing);
+ }
+
+ /* For non-pair windows, just give them the size */
+ else
+ gtk_widget_size_allocate(win->frame, allocation);
+}
+
+/* Overrides gtk_widget_size_allocate */