X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=libchimara%2Fwindow.c;h=bb5fde32cf5d6e168dc06a7b247b046ff46008b1;hb=734e6185b06e70e10528a33e4e4d719e18821200;hp=fc407f751ed1ea71d0b13829f76745db197b1ad3;hpb=8ce1c3879ac0d72744ab0e4301cce28c04cb9e1c;p=projects%2Fchimara%2Fchimara.git diff --git a/libchimara/window.c b/libchimara/window.c index fc407f7..bb5fde3 100644 --- a/libchimara/window.c +++ b/libchimara/window.c @@ -375,7 +375,7 @@ glk_window_open(winid_t split, glui32 method, glui32 size, glui32 wintype, { VALID_WINDOW_OR_NULL(split, return NULL); g_return_val_if_fail(method == (method & (winmethod_DirMask | winmethod_DivisionMask)), NULL); - g_return_val_if_fail(!(((method & winmethod_DivisionMask) == winmethod_Proportional) && size >= 100), NULL); + g_return_val_if_fail(!(((method & winmethod_DivisionMask) == winmethod_Proportional) && size > 100), NULL); if(split == NULL && glk_data->root_window != NULL) { @@ -561,7 +561,10 @@ glk_window_open(winid_t split, glui32 method, glui32 size, glui32 wintype, glk_data->root_window = win->window_node; } - /* Set the window as a child of the Glk widget */ + /* Set the window as a child of the Glk widget, don't trigger an arrange event */ + g_mutex_lock(glk_data->arrange_lock); + glk_data->ignore_next_arrange_event = TRUE; + g_mutex_unlock(glk_data->arrange_lock); gtk_widget_set_parent(win->frame, GTK_WIDGET(glk_data->self)); gtk_widget_queue_resize(GTK_WIDGET(glk_data->self)); @@ -603,24 +606,16 @@ remove_key_windows(GNode *node, winid_t closing_win) } /* Internal function: destroy this window's GTK widgets, window streams, - and those of all its children */ + and those of all its children. GDK threads must be locked. */ static void destroy_windows_below(winid_t win, stream_result_t *result) { switch(win->type) { case wintype_Blank: - gdk_threads_enter(); - gtk_widget_unparent(win->widget); - gdk_threads_leave(); - break; - case wintype_TextGrid: case wintype_TextBuffer: - gdk_threads_enter(); gtk_widget_unparent(win->frame); - gdk_threads_leave(); - /* TODO: Cancel all input requests */ break; case wintype_Pair: @@ -714,6 +709,8 @@ glk_window_close(winid_t win, stream_result_t *result) { VALID_WINDOW(win, return); + gdk_threads_enter(); /* Prevent redraw while we're trashing the window */ + /* If any pair windows have this window or its children as a key window, set their key window to NULL */ g_node_traverse(glk_data->root_window, G_IN_ORDER, G_TRAVERSE_NON_LEAVES, -1, (GNodeTraverseFunc)remove_key_windows, win); @@ -770,9 +767,10 @@ glk_window_close(winid_t win, stream_result_t *result) g_free(win); /* Schedule a redraw */ - gdk_threads_enter(); + g_mutex_lock(glk_data->arrange_lock); + glk_data->ignore_next_arrange_event = TRUE; + g_mutex_unlock(glk_data->arrange_lock); gtk_widget_queue_resize( GTK_WIDGET(glk_data->self) ); - gdk_window_process_all_updates(); gdk_threads_leave(); } @@ -1120,7 +1118,7 @@ glk_window_set_arrangement(winid_t win, glui32 method, glui32 size, winid_t keyw g_return_if_fail(g_node_is_ancestor(win->window_node, keywin->window_node)); } g_return_if_fail(method == (method & (winmethod_DirMask | winmethod_DivisionMask))); - g_return_if_fail(!(((method & winmethod_DivisionMask) == winmethod_Proportional) && size >= 100)); + g_return_if_fail(!(((method & winmethod_DivisionMask) == winmethod_Proportional) && size > 100)); win->split_method = method; win->constraint_size = size; @@ -1129,8 +1127,10 @@ glk_window_set_arrangement(winid_t win, glui32 method, glui32 size, winid_t keyw /* Tell GTK to rearrange the windows */ gdk_threads_enter(); + g_mutex_lock(glk_data->arrange_lock); + glk_data->ignore_next_arrange_event = TRUE; + g_mutex_unlock(glk_data->arrange_lock); gtk_widget_queue_resize(GTK_WIDGET(glk_data->self)); - gdk_window_process_all_updates(); gdk_threads_leave(); } @@ -1193,6 +1193,10 @@ glk_window_move_cursor(winid_t win, glui32 xpos, glui32 ypos) VALID_WINDOW(win, return); g_return_if_fail(win->type == wintype_TextGrid); + /* Don't do anything if the window is shrunk down to nothing */ + if(win->width == 0 || win->height == 0) + return; + /* Calculate actual position if cursor is moved past the right edge */ if(xpos >= win->width) {