X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=libchimara%2Fchimara-glk.c;h=1155175fa9a49f965bf07f14ec260bf68d7c43d5;hb=fd95bbfc8f01fe812d9f24d1d377079df5f968d5;hp=8fd1a1e81b752a430537961253813191dd685ba4;hpb=59f3bc1e4f21377c362c1f497fb225711127d7a0;p=projects%2Fchimara%2Fchimara.git diff --git a/libchimara/chimara-glk.c b/libchimara/chimara-glk.c index 8fd1a1e..1155175 100644 --- a/libchimara/chimara-glk.c +++ b/libchimara/chimara-glk.c @@ -161,7 +161,6 @@ chimara_glk_init(ChimaraGlk *self) priv->protect = FALSE; priv->styles = g_new0(StyleSet,1); priv->glk_styles = g_new0(StyleSet,1); - priv->pager_attr_list = pango_attr_list_new(); priv->final_message = g_strdup("[ The game has finished ]"); priv->running = FALSE; priv->program = NULL; @@ -270,8 +269,7 @@ chimara_glk_finalize(GObject *object) g_hash_table_destroy(priv->styles->text_grid); g_hash_table_destroy(priv->glk_styles->text_buffer); g_hash_table_destroy(priv->glk_styles->text_grid); - pango_attr_list_unref(priv->pager_attr_list); - + /* Free the event queue */ g_mutex_lock(priv->event_lock); g_queue_foreach(priv->event_queue, (GFunc)g_free, NULL); @@ -324,99 +322,15 @@ chimara_glk_finalize(GObject *object) G_OBJECT_CLASS(chimara_glk_parent_class)->finalize(object); } -/* Internal function: Recursively get the Glk window tree's size request */ -static void -request_recurse(winid_t win, GtkRequisition *requisition, guint spacing) +/* Implementation of get_request_mode(): Always request constant size */ +static GtkSizeRequestMode +chimara_glk_get_request_mode(GtkWidget *widget) { - if(win->type == wintype_Pair) - { - /* Get children's size requests */ - GtkRequisition child1, child2; - request_recurse(win->window_node->children->data, &child1, spacing); - request_recurse(win->window_node->children->next->data, &child2, spacing); - - glui32 division = win->split_method & winmethod_DivisionMask; - glui32 direction = win->split_method & winmethod_DirMask; - unsigned border = ((win->split_method & winmethod_BorderMask) == winmethod_NoBorder)? 0 : spacing; - - /* If the split is fixed, get the size of the fixed child */ - if(division == winmethod_Fixed) - { - switch(direction) - { - case winmethod_Left: - child1.width = win->key_window? - win->constraint_size * win->key_window->unit_width - : 0; - break; - case winmethod_Right: - child2.width = win->key_window? - win->constraint_size * win->key_window->unit_width - : 0; - break; - case winmethod_Above: - child1.height = win->key_window? - win->constraint_size * win->key_window->unit_height - : 0; - break; - case winmethod_Below: - child2.height = win->key_window? - win->constraint_size * win->key_window->unit_height - : 0; - break; - } - } - - /* Add the children's requests */ - switch(direction) - { - case winmethod_Left: - case winmethod_Right: - requisition->width = child1.width + child2.width + border; - requisition->height = MAX(child1.height, child2.height); - break; - case winmethod_Above: - case winmethod_Below: - requisition->width = MAX(child1.width, child2.width); - requisition->height = child1.height + child2.height + border; - break; - } - } - - /* For non-pair windows, just use the size that GTK requests */ - else - gtk_widget_size_request(win->frame, requisition); -} - -/* Old GTK 2 functionality overriding gtk_widget_size_request(); -get_preferred_width() and get_preferred_height() are implemented in terms of -this function. */ -static void -chimara_glk_size_request(GtkWidget *widget, GtkRequisition *requisition) -{ - g_return_if_fail(widget); - g_return_if_fail(requisition); - g_return_if_fail(CHIMARA_IS_GLK(widget)); - - ChimaraGlkPrivate *priv = CHIMARA_GLK_PRIVATE(widget); - - guint border_width = gtk_container_get_border_width(GTK_CONTAINER(widget)); - /* For now, just pass the size request on to the root Glk window */ - if(priv->root_window) - { - request_recurse(priv->root_window->data, requisition, priv->spacing); - requisition->width += 2 * border_width; - requisition->height += 2 * border_width; - } - else - { - requisition->width = CHIMARA_GLK_MIN_WIDTH + 2 * border_width; - requisition->height = CHIMARA_GLK_MIN_HEIGHT + 2 * border_width; - } + return GTK_SIZE_REQUEST_CONSTANT_SIZE; } -/* Minimal implementation of width-for-height request, in terms of the old -GTK 2 mechanism. FIXME: make this more efficient. */ +/* Minimal implementation of width request. Allocation in Glk is +strictly top-down, so we just request our current size by returning 1. */ static void chimara_glk_get_preferred_width(GtkWidget *widget, int *minimal, int *natural) { @@ -424,14 +338,11 @@ chimara_glk_get_preferred_width(GtkWidget *widget, int *minimal, int *natural) g_return_if_fail(minimal); g_return_if_fail(natural); - GtkRequisition requisition; - - chimara_glk_size_request(widget, &requisition); - *minimal = *natural = requisition.width; + *minimal = *natural = 1; } -/* Minimal implementation of height-for-width request, in terms of the old -GTK 2 mechanism. FIXME: make this more efficient. */ +/* Minimal implementation of height request. Allocation in Glk is +strictly top-down, so we just request our current size by returning 1. */ static void chimara_glk_get_preferred_height(GtkWidget *widget, int *minimal, int *natural) { @@ -439,10 +350,7 @@ chimara_glk_get_preferred_height(GtkWidget *widget, int *minimal, int *natural) g_return_if_fail(minimal); g_return_if_fail(natural); - GtkRequisition requisition; - - chimara_glk_size_request(widget, &requisition); - *minimal = *natural = requisition.height; + *minimal = *natural = 1; } /* Recursively give the Glk windows their allocated space. Returns a window @@ -640,16 +548,11 @@ chimara_glk_size_allocate(GtkWidget *widget, GtkAllocation *allocation) ChimaraGlkPrivate *priv = CHIMARA_GLK_PRIVATE(widget); gtk_widget_set_allocation(widget, allocation); - + if(priv->root_window) { - GtkAllocation child; - guint border_width = gtk_container_get_border_width(GTK_CONTAINER(widget)); - child.x = allocation->x + border_width; - child.y = allocation->y + border_width; - child.width = CLAMP(allocation->width - 2 * border_width, 0, allocation->width); - child.height = CLAMP(allocation->height - 2 * border_width, 0, allocation->height); + GtkAllocation child = *allocation; winid_t arrange = allocate_recurse(priv->root_window->data, &child, priv->spacing); - + /* arrange points to a window that contains all text grid and graphics windows which have been resized */ g_mutex_lock(priv->arrange_lock); @@ -756,12 +659,15 @@ chimara_glk_class_init(ChimaraGlkClass *klass) object_class->finalize = chimara_glk_finalize; GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass); + widget_class->get_request_mode = chimara_glk_get_request_mode; widget_class->get_preferred_width = chimara_glk_get_preferred_width; widget_class->get_preferred_height = chimara_glk_get_preferred_height; widget_class->size_allocate = chimara_glk_size_allocate; GtkContainerClass *container_class = GTK_CONTAINER_CLASS(klass); container_class->forall = chimara_glk_forall; + /* Automatically handle the GtkContainer:border-width property */ + gtk_container_class_handle_border_width(container_class); /* Signals */ klass->stopped = chimara_glk_stopped; @@ -1589,28 +1495,6 @@ chimara_glk_get_tag_names(ChimaraGlk *glk, unsigned int *num_tags) return style_get_tag_names(); } -/** - * chimara_glk_update_style: - * @glk: a #ChimaraGlk widget - * - * Processes style updates and updates the widget to reflect the new style. - * Call this every time you change a property of a #GtkTextTag retrieved by - * chimara_glk_get_tag(). - */ -void -chimara_glk_update_style(ChimaraGlk *glk) -{ - CHIMARA_GLK_USE_PRIVATE(glk, priv); - style_update(glk); - - /* Schedule a redraw */ - g_mutex_lock(priv->arrange_lock); - priv->needs_rearrange = TRUE; - priv->ignore_next_arrange_event = TRUE; - g_mutex_unlock(priv->arrange_lock); - gtk_widget_queue_resize( GTK_WIDGET(priv->self) ); -} - /** * chimara_glk_set_resource_load_callback: * @glk: a #ChimaraGlk widget