X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=src%2Fchimara-glk.c;h=16e674969c10f9ae9feaf92804261b0b4414c8d5;hb=5a06246277a255fe6e0e465ce0f190541b7b0e16;hp=889b4f265e041387f5931c7b889e954592a3f397;hpb=fed235e548376a8a2763405c4623fdf23f5c6529;p=rodin%2Fchimara.git diff --git a/src/chimara-glk.c b/src/chimara-glk.c index 889b4f2..16e6749 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,19 +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 = CLAMP(win->constraint_size * win->key_window->unit_width, 0, 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 = CLAMP(win->constraint_size * win->key_window->unit_width, 0, 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 = CLAMP(win->constraint_size * win->key_window->unit_height, 0, 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 = CLAMP(win->constraint_size * win->key_window->unit_height, 0, allocation->height - spacing); + child2.height = win->key_window? + CLAMP(win->constraint_size * win->key_window->unit_height, 0, allocation->height - spacing) + : 0; break; } } @@ -346,7 +365,8 @@ allocate_recurse(winid_t win, GtkAllocation *allocation, guint spacing) for(line = 0; line < win->height; line++) { gtk_text_buffer_get_iter_at_line(textbuffer, &start, line); - if(line > newheight) + /* 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); @@ -354,6 +374,7 @@ allocate_recurse(winid_t win, GtkAllocation *allocation, guint spacing) 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, ' '); @@ -361,6 +382,7 @@ allocate_recurse(winid_t win, GtkAllocation *allocation, guint spacing) 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; @@ -368,7 +390,9 @@ allocate_recurse(winid_t win, GtkAllocation *allocation, guint spacing) 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, ' '); @@ -899,7 +923,7 @@ chimara_glk_run(ChimaraGlk *glk, gchar *plugin, GError **error) /* Set the thread's private data */ /* TODO: Do this with a GPrivate */ glk_data = priv; - + /* Run in a separate thread */ priv->thread = g_thread_create(glk_enter, glk_main, TRUE, error);