X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=src%2Fchimara-glk.c;h=14d1e44801f7b73e0c76c41bdded91eeeb7d0c3f;hb=53fe9495a46d16106fa91cfa589e312e882428dd;hp=ad50b0f7306d2dd07138deb23838b1644970b461;hpb=1adfde093c3ec4bad34aad21251007e265fe6287;p=rodin%2Fchimara.git diff --git a/src/chimara-glk.c b/src/chimara-glk.c index ad50b0f..14d1e44 100644 --- a/src/chimara-glk.c +++ b/src/chimara-glk.c @@ -27,11 +27,11 @@ * On Linux systems, this is a file with a name like * plugin.so. For portability, you can use libtool and * automake: - * + * |[ * pkglib_LTLIBRARIES = plugin.la * plugin_la_SOURCES = plugin.c foo.c bar.c * plugin_la_LDFLAGS = -module -shared -avoid-version -export-symbols-regex "^glk_main$$" - * + * ]| * This will produce plugin.la which is a text file * containing the correct plugin file to open (see the relevant section of the * fileref_list = NULL; priv->current_stream = NULL; priv->stream_list = NULL; + priv->timer_id = 0; } static void @@ -189,16 +190,24 @@ request_recurse(winid_t win, GtkRequisition *requisition, guint spacing) switch(win->split_method & winmethod_DirMask) { case winmethod_Left: - child1.width = win->constraint_size * win->key_window->unit_width; + child1.width = win->key_window? + win->constraint_size * win->key_window->unit_width + : 0; break; case winmethod_Right: - child2.width = win->constraint_size * win->key_window->unit_width; + child2.width = win->key_window? + win->constraint_size * win->key_window->unit_width + : 0; break; case winmethod_Above: - child1.height = win->constraint_size * win->key_window->unit_height; + child1.height = win->key_window? + win->constraint_size * win->key_window->unit_height + : 0; break; case winmethod_Below: - child2.height = win->constraint_size * win->key_window->unit_height; + child2.height = win->key_window? + win->constraint_size * win->key_window->unit_height + : 0; break; } } @@ -260,27 +269,29 @@ allocate_recurse(winid_t win, GtkAllocation *allocation, guint spacing) if((win->split_method & winmethod_DivisionMask) == winmethod_Fixed) { + /* If the key window has been closed, then default to 0; otherwise + use the key window to determine the size */ switch(win->split_method & winmethod_DirMask) { case winmethod_Left: - child1.width = win->constraint_size * win->key_window->unit_width; - if(child1.width > allocation->width - spacing) - child1.width = allocation->width - spacing; + child1.width = win->key_window? + CLAMP(win->constraint_size * win->key_window->unit_width, 0, allocation->width - spacing) + : 0; break; case winmethod_Right: - child2.width = win->constraint_size * win->key_window->unit_width; - if(child2.width > allocation->width - spacing) - child2.width = allocation->width - spacing; + child2.width = win->key_window? + CLAMP(win->constraint_size * win->key_window->unit_width, 0, allocation->width - spacing) + : 0; break; case winmethod_Above: - child1.height = win->constraint_size * win->key_window->unit_height; - if(child1.height > allocation->height - spacing) - child1.height = allocation->height - spacing; + child1.height = win->key_window? + CLAMP(win->constraint_size * win->key_window->unit_height, 0, allocation->height - spacing) + : 0; break; case winmethod_Below: - child2.height = win->constraint_size * win->key_window->unit_height; - if(child2.height > allocation->height - spacing) - child2.height = allocation->height - spacing; + child2.height = win->key_window? + CLAMP(win->constraint_size * win->key_window->unit_height, 0, allocation->height - spacing) + : 0; break; } } @@ -338,7 +349,73 @@ allocate_recurse(winid_t win, GtkAllocation *allocation, guint spacing) allocate_recurse(win->window_node->children->next->data, &child2, spacing); } - /* For non-pair windows, just give them the size */ + else if(win->type == wintype_TextGrid) + { + /* Pass the size allocation on to the framing widget */ + gtk_widget_size_allocate(win->frame, allocation); + /* It says in the spec that when a text grid window is resized smaller, + the bottom or right area is thrown away; when it is resized larger, the + bottom or right area is filled with blanks. */ + glui32 newwidth = (glui32)(win->widget->allocation.width / win->unit_width); + glui32 newheight = (glui32)(win->widget->allocation.height / win->unit_height); + gint line; + GtkTextBuffer *textbuffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW(win->widget) ); + GtkTextIter start, end; + + for(line = 0; line < win->height; line++) + { + gtk_text_buffer_get_iter_at_line(textbuffer, &start, line); + /* If this line is going to fall off the bottom, delete it */ + if(line >= newheight) + { + end = start; + gtk_text_iter_forward_to_line_end(&end); + gtk_text_iter_forward_char(&end); + gtk_text_buffer_delete(textbuffer, &start, &end); + break; + } + /* If this line is not long enough, add spaces on the end */ + if(newwidth > win->width) + { + gchar *spaces = g_strnfill(newwidth - win->width, ' '); + gtk_text_iter_forward_to_line_end(&start); + gtk_text_buffer_insert(textbuffer, &start, spaces, -1); + g_free(spaces); + } + /* But if it's too long, delete characters from the end */ + else if(newwidth < win->width) + { + end = start; + gtk_text_iter_forward_chars(&start, newwidth); + gtk_text_iter_forward_to_line_end(&end); + gtk_text_buffer_delete(textbuffer, &start, &end); + } + /* Note: if the widths are equal, do nothing */ + } + /* Add blank lines if there aren't enough lines to fit the new size */ + if(newheight > win->height) + { + gchar *blanks = g_strnfill(win->width, ' '); + gchar **blanklines = g_new0(gchar *, (newheight - win->height) + 1); + int count; + for(count = 0; count < newheight - win->height; count++) + blanklines[count] = blanks; + blanklines[newheight - win->height] = NULL; + gchar *text = g_strjoinv("\n", blanklines); + g_free(blanklines); /* not g_strfreev() */ + g_free(blanks); + + gtk_text_buffer_get_end_iter(textbuffer, &start); + gtk_text_buffer_insert(textbuffer, &start, "\n", -1); + gtk_text_buffer_insert(textbuffer, &start, text, -1); + g_free(text); + } + + win->width = newwidth; + win->height = newheight; + } + + /* For non-pair, non-text-grid windows, just give them the size */ else gtk_widget_size_allocate(win->frame, allocation); } @@ -359,12 +436,8 @@ chimara_glk_size_allocate(GtkWidget *widget, GtkAllocation *allocation) GtkAllocation child; child.x = allocation->x + GTK_CONTAINER(widget)->border_width; child.y = allocation->y + GTK_CONTAINER(widget)->border_width; - child.width = allocation->width - 2 * GTK_CONTAINER(widget)->border_width; - child.height = allocation->height - 2 * GTK_CONTAINER(widget)->border_width; - if(child.width < 0) - child.width = 0; - if(child.height < 0) - child.height = 0; + child.width = CLAMP(allocation->width - 2 * GTK_CONTAINER(widget)->border_width, 0, allocation->width); + child.height = CLAMP(allocation->height - 2 * GTK_CONTAINER(widget)->border_width, 0, allocation->height); allocate_recurse(priv->root_window->data, &child, priv->spacing); } }