X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=src%2Fwindow.c;h=5f2bd5b349673bb2b46a755e46c3da8906c93240;hb=91214934fbcdfd363202a65c142194506604ff7b;hp=876db66933867406084ab9dfa75081c5b46e2cd1;hpb=5b7840544b25551ffa0da10e5f0abfe9fd4fa6b9;p=projects%2Fchimara%2Fchimara.git diff --git a/src/window.c b/src/window.c index 876db66..5f2bd5b 100644 --- a/src/window.c +++ b/src/window.c @@ -211,15 +211,11 @@ glk_window_get_root() * * So to create a text buffer window which takes the top 40% of the original * window's space, you would execute - * - * newwin = #glk_window_open(win, #winmethod_Above | #winmethod_Proportional, 40, #wintype_TextBuffer, 0); - * + * |[ newwin = #glk_window_open(win, #winmethod_Above | #winmethod_Proportional, 40, #wintype_TextBuffer, 0); ]| * * To create a text grid which is always five lines high, at the bottom of the * original window, you would do - * - * newwin = #glk_window_open(win, #winmethod_Below | #winmethod_Fixed, 5, #wintype_TextGrid, 0); - * + * |[ newwin = #glk_window_open(win, #winmethod_Below | #winmethod_Fixed, 5, #wintype_TextGrid, 0); ]| * * Note that the meaning of the @size argument depends on the @method argument. * If the method is #winmethod_Fixed, it also depends on the @wintype argument. @@ -237,8 +233,17 @@ glk_window_get_root() * What happens when there is a conflict? The rules are simple. Size control * always flows down the tree, and the player is at the top. Let's bring out an * example: - * Screen shot 5 - * + * + * + * + * + * O + * / \ + * O B + * / \ + * A C + * + * * * First we split A into A and B, with a 50% proportional split. Then we split * A into A and C, with C above, C being a text grid window, and C gets a fixed @@ -246,8 +251,8 @@ glk_window_get_root() * of the 50% it had before. * * Now the player stretches the window vertically. - * Screen shot 6 - * + * + * * * The library figures: the topmost split, the original A/B split, is 50-50. So * B gets half the screen space, and the pair window next to it (the lower @@ -255,8 +260,18 @@ glk_window_get_root() * O. C gets two rows; A gets the rest. All done. * * Then the user maliciously starts squeezing the window down, in stages: - * - * Screen shot 7 + * + * + * + * + * + * + * + * + * + * + * + * * * The logic remains the same. B always gets half the space. At stage 3, * there's no room left for A, so it winds up with zero height. Nothing @@ -290,8 +305,29 @@ glk_window_get_root() * is stored by a window's parent, not the window itself; and a constraint * consists of a pointer to a key window plus a size value. * - * Screen shot 8 - * + * + * + * + * + * A + * + * + * + * + * O1 + * / \ + * A B + * + * + * + * + * O1 + * / \ + * O2 B + * / \ + * A C + * + * * After the first split, the new pair window (O1, which covers the whole * screen) knows that its first child (A) is above the second, and gets 50% of * its own area. (A is the key window for this split, but a proportional split @@ -306,8 +342,19 @@ glk_window_get_root() * If we split C, now, the resulting pair will still be two C-font rows high * — that is, tall enough for two lines of whatever font C displays. For * the sake of example, we'll do this vertically. - * Screen shot 9 - * + * + * + * + * + * O1 + * / \ + * O2 B + * / \ + * A O3 + * / \ + * C D + * + * * * O3 now knows that its children have a 50-50 left-right split. O2 is still * committed to giving its upper child, O3, two C-font rows. Again, this is @@ -366,7 +413,7 @@ glk_window_open(winid_t split, glui32 method, glui32 size, glui32 wintype, { GtkWidget *textview = gtk_text_view_new(); - gtk_text_view_set_wrap_mode( GTK_TEXT_VIEW(textview), GTK_WRAP_CHAR ); + gtk_text_view_set_wrap_mode( GTK_TEXT_VIEW(textview), GTK_WRAP_NONE ); gtk_text_view_set_editable( GTK_TEXT_VIEW(textview), FALSE ); gtk_widget_show(textview); @@ -439,6 +486,9 @@ glk_window_open(winid_t split, glui32 method, glui32 size, glui32 wintype, (for line input) */ gtk_text_buffer_create_tag(textbuffer, "uneditable", "editable", FALSE, "editable-set", TRUE, NULL); + /* Create the default styles available to the window stream */ + style_init_textbuffer(textbuffer); + /* Mark the position where the user will input text */ GtkTextIter end; gtk_text_buffer_get_end_iter(textbuffer, &end); @@ -512,7 +562,7 @@ glk_window_open(winid_t split, glui32 method, glui32 size, glui32 wintype, /* Set the window as a child of the Glk widget */ gtk_widget_set_parent(win->frame, GTK_WIDGET(glk_data->self)); gtk_widget_queue_resize(GTK_WIDGET(glk_data->self)); - + gdk_threads_leave(); /* For blank or pair windows, this is almost a no-op. For text grid and @@ -611,8 +661,17 @@ free_winids_below(winid_t win) * When you close a window (and it is not the root window), the other window * in its pair takes over all the freed-up area. Let's close D, in the current * example: - * Screen shot 10 - * + * + * + * + * + * O1 + * / \ + * O2 B + * / \ + * A C + * + * * * Notice what has happened. D is gone. O3 is gone, and its 50-50 left-right * split has gone with it. The other size constraints are unchanged; O2 is @@ -622,8 +681,17 @@ free_winids_below(winid_t win) * to the way it was before we created D. * * But what if we had closed C instead of D? We would have gotten this: - * Screen shot 11 - * + * + * + * + * + * O1 + * / \ + * O2 B + * / \ + * A D + * + * * * Again, O3 is gone. But D has collapsed to zero height. This is because its * height is controlled by O2, and O2's key window was C, and C is now gone. O2 @@ -702,6 +770,7 @@ glk_window_close(winid_t win, stream_result_t *result) /* Schedule a redraw */ gdk_threads_enter(); gtk_widget_queue_resize( GTK_WIDGET(glk_data->self) ); + gdk_window_process_all_updates(); gdk_threads_leave(); } @@ -919,6 +988,7 @@ glk_window_get_size(winid_t win, glui32 *widthptr, glui32 *heightptr) case wintype_TextGrid: gdk_threads_enter(); /* Wait for the window to be drawn, and then cache the width and height */ + gdk_window_process_all_updates(); while(win->widget->allocation.width == 1 && win->widget->allocation.height == 1) { /* Release the GDK lock momentarily */ @@ -927,7 +997,8 @@ glk_window_get_size(winid_t win, glui32 *widthptr, glui32 *heightptr) while(gtk_events_pending()) gtk_main_iteration(); } - win->width = (glui32)(win->widget->allocation.width / win->unit_width); + + win->width = (glui32)(win->widget->allocation.width / win->unit_width); win->height = (glui32)(win->widget->allocation.height / win->unit_height); gdk_threads_leave(); @@ -948,7 +1019,8 @@ glk_window_get_size(winid_t win, glui32 *widthptr, glui32 *heightptr) } */ /* Instead, we wait for GTK to draw the widget. This is probably very slow and should be fixed. */ - while(win->widget->allocation.width == 1 && win->widget->allocation.height == 1) + gdk_window_process_all_updates(); + while(win->widget->allocation.width == 1 && win->widget->allocation.height == 1) { /* Release the GDK lock momentarily */ gdk_threads_leave();