diff options
author | Ray Strode <rstrode@redhat.com> | 2007-04-18 19:18:31 -0400 |
---|---|---|
committer | Ray Strode <rstrode@redhat.com> | 2007-04-18 19:18:31 -0400 |
commit | 5967995b9cf644428966b71d3a250e8c1cabdac1 (patch) | |
tree | 0266112c3666e0bfe8d4ff93cea15a3c22554a5f | |
parent | 984354cce83e152dcef6b6cef0f5c80988563ec4 (diff) |
port more things over to use the new async error handling
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/pop-demo.c | 68 | ||||
-rw-r--r-- | src/pop-window-stack.c | 55 | ||||
-rw-r--r-- | src/pop-x-reply-watch.c | 3 | ||||
-rw-r--r-- | src/pop-x-reply-watch.h | 5 |
5 files changed, 98 insertions, 35 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index f401637..cce5661 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -21,6 +21,8 @@ pop_demo_SOURCES = pop-window-stack.c \ pop-window-view.h \ pop-event-listener.c \ pop-event-listener.h \ + pop-x-reply-watch.c \ + pop-x-reply-watch.h \ pop-overlay-window.c \ pop-overlay-window.h \ $(BUILT_SOURCES) \ diff --git a/src/pop-demo.c b/src/pop-demo.c index c7fa5cb..ecb6ffb 100644 --- a/src/pop-demo.c +++ b/src/pop-demo.c @@ -248,6 +248,9 @@ draw_window_from_stack (PopWindowStack *stack, static void draw_windows (cairo_t *cairo_context) { + if (!pop_window_stack_is_ready (stack)) + return; + pop_window_stack_foreach (stack, (PopWindowStackForeachFunc) draw_window_from_stack, cairo_context); @@ -260,17 +263,6 @@ add_window_from_stack_to_list (PopWindowStack *stack, add_window_to_list (g_object_ref (window)); } -static void -get_initial_view_list (void) -{ - - stack = pop_window_stack_get_for_screen (NULL); - - pop_window_stack_foreach (stack, - (PopWindowStackForeachFunc) - add_window_from_stack_to_list, NULL); -} - static gboolean on_expose_event (GtkWidget *widget, GdkEventExpose *event) @@ -298,9 +290,36 @@ on_expose_event (GtkWidget *widget, } static void +add_windows_from_stack_to_list (PopWindowStack *stack) +{ + if (pop_window_stack_is_ready (stack)) + pop_window_stack_foreach (stack, + (PopWindowStackForeachFunc) + add_window_from_stack_to_list, NULL); +} + +static void +on_stack_ready_add_windows (GObject *object, + GParamSpec *param_spec, + gpointer user_data) +{ + PopWindowStack *stack; + stack = POP_WINDOW_STACK (object); + add_windows_from_stack_to_list (stack); + + g_signal_handlers_disconnect_by_func (object, on_stack_ready_add_windows, user_data); +} + +static void on_map (GtkWidget *widget) { - get_initial_view_list (); + stack = pop_window_stack_get_for_screen (NULL); + + if (pop_window_stack_is_ready (stack)) + add_windows_from_stack_to_list (stack); + else + g_signal_connect (G_OBJECT (stack), "notify::is-ready", + on_stack_ready_add_windows, NULL); } static void @@ -310,8 +329,8 @@ remove_window_from_stack_from_list (PopWindowStack *stack, remove_window_from_list (window); } -static gboolean -on_close (GtkWidget *widget) +static void +remove_windows_from_stack_from_list (PopWindowStack *stack) { pop_window_stack_foreach (stack, (PopWindowStackForeachFunc) @@ -321,6 +340,27 @@ on_close (GtkWidget *widget) stack = NULL; gtk_main_quit (); +} + +static void +on_stack_ready_remove_windows (GObject *object, + GParamSpec *param_spec, + gpointer user_data) +{ + PopWindowStack *stack; + stack = POP_WINDOW_STACK (object); + remove_windows_from_stack_from_list (stack); + g_signal_handlers_disconnect_by_func (object, on_stack_ready_remove_windows, user_data); +} + +static gboolean +on_close (GtkWidget *widget) +{ + if (pop_window_stack_is_ready (stack)) + remove_windows_from_stack_from_list (stack); + else + g_signal_connect (G_OBJECT (stack), "notify::is-ready", + on_stack_ready_remove_windows, NULL); return FALSE; } diff --git a/src/pop-window-stack.c b/src/pop-window-stack.c index 397a932..578f96e 100644 --- a/src/pop-window-stack.c +++ b/src/pop-window-stack.c @@ -46,7 +46,7 @@ typedef struct { PopWindowStack *stack; PopWindowStackForeachFunc func; - gpointer user_data; + gpointer data; } PopWindowStackForeachClosure; typedef struct @@ -54,7 +54,7 @@ typedef struct PopWindowStack *stack; GdkWindow *window; PopWindowStackAboveWindowForeachFunc func; - gpointer user_data; + gpointer data; } PopWindowStackAboveWindowForeachClosure; static void pop_window_stack_finalize (GObject * object); @@ -75,10 +75,12 @@ static void pop_window_stack_get_property (GObject *object, static void pop_window_stack_set_screen (PopWindowStack *stack, GdkScreen *screen); +static void pop_window_stack_set_readiness (PopWindowStack *stack, + gboolean is_ready); + static void pop_window_stack_clear_window_list (PopWindowStack *stack); static void pop_window_stack_ask_for_window_list (PopWindowStack *stack); - enum { PROP_0 = 0, @@ -202,8 +204,8 @@ pop_window_stack_finalize (GObject * object) static void pop_window_stack_set_property (GObject *object, - guint prop_id, - const GValue *value, + guint prop_id, + const GValue *value, GParamSpec *pspec) { PopWindowStack *stack = POP_WINDOW_STACK (object); @@ -213,7 +215,7 @@ pop_window_stack_set_property (GObject *object, case PROP_SCREEN: pop_window_stack_set_screen (stack, g_value_get_pointer (value)); break; - case POP_IS_READY: + case PROP_IS_READY: pop_window_stack_set_readiness (stack, g_value_get_boolean (value)); break; @@ -235,7 +237,7 @@ pop_window_stack_get_property (GObject * object, g_value_set_pointer (value, stack->priv->screen); break; - case POP_IS_READY: + case PROP_IS_READY: g_value_set_boolean (value, stack->priv->is_ready); break; @@ -321,23 +323,28 @@ pop_window_stack_foreach_func (gpointer data, window = (GdkWindow *) data; closure = (PopWindowStackForeachClosure *) user_data; - closure->func (closure->stack, window, closure->user_data); + closure->func (closure->stack, window, closure->data); } void pop_window_stack_foreach (PopWindowStack *stack, PopWindowStackForeachFunc func, - gpointer user_data) + gpointer data) { PopWindowStackForeachClosure closure; g_return_if_fail (POP_IS_WINDOW_STACK (stack)); g_return_if_fail (func != NULL); g_return_if_fail (pop_window_stack_is_ready (stack)); +#if 0 + while (!pop_window_stack_is_ready (stack)) + while (g_main_context_pending (NULL)) + g_main_context_iteration (NULL, TRUE); +#endif closure.stack = stack; closure.func = func; - closure.user_data = user_data; + closure.data = data; g_queue_foreach (stack->priv->windows, pop_window_stack_foreach_func, &closure); } @@ -352,14 +359,14 @@ pop_window_stack_above_window_foreach_func (gpointer data, above_window = (GdkWindow *) data; closure = (PopWindowStackAboveWindowForeachClosure *) user_data; - closure->func (closure->stack, closure->window, above_window, closure->user_data); + closure->func (closure->stack, closure->window, above_window, closure->data); } void pop_window_stack_above_window_foreach (PopWindowStack *stack, GdkWindow *window, PopWindowStackAboveWindowForeachFunc func, - gpointer user_data) + gpointer data) { PopWindowStackAboveWindowForeachClosure closure; GList *window_link; @@ -380,7 +387,7 @@ pop_window_stack_above_window_foreach (PopWindowStack *sta closure.stack = stack; closure.window = g_object_ref (window); closure.func = func; - closure.user_data = user_data; + closure.data = data; g_list_foreach (window_link->next, pop_window_stack_above_window_foreach_func, &closure); @@ -427,6 +434,7 @@ typedef struct GdkWindow *window; Window *children; guint number_of_children; + gpointer data; } PopQueryTreeState; static Status @@ -437,7 +445,7 @@ query_tree_request (GdkDisplay *display, PopQueryTreeState *state; g_assert (state != NULL); - state = (PopQueryTreeState *) state; + state = (PopQueryTreeState *) data; g_assert (GDK_IS_WINDOW (state->window)); @@ -448,16 +456,18 @@ query_tree_request (GdkDisplay *display, } static void -queried_window_foreach_func (Window window, +queried_window_foreach_func (Window x_window_id, gpointer data) { PopWindowStack *stack; + GdkDisplay *display; GdkWindow *window; g_assert (POP_IS_WINDOW_STACK (data)); stack = POP_WINDOW_STACK (data); - window = gdk_window_foreign_new_for_display (display, children[i]); + display = gdk_screen_get_display (stack->priv->screen); + window = gdk_window_foreign_new_for_display (display, x_window_id); if (window == NULL) return; @@ -476,12 +486,13 @@ static void on_query_tree_reply (GdkDisplay *display, Status tree_queried, XErrorEvent *error, - gpointer user_data) + gpointer data) { PopQueryTreeState *state; + state = (PopQueryTreeState *) data; + g_assert (state != NULL); - state = (PopQueryTreeState *) state; if (tree_queried) { @@ -489,8 +500,8 @@ on_query_tree_reply (GdkDisplay *display, g_assert (state->number_of_children > 0); g_assert (state->children != NULL); - for (i = 0; i < number_of_children; i++) - queried_window_foreach_func (state->children[i], stack); + for (i = 0; i < state->number_of_children; i++) + queried_window_foreach_func (state->children[i], state->data); XFree (state->children); state->children = NULL; @@ -501,7 +512,8 @@ on_query_tree_reply (GdkDisplay *display, state->window = NULL; g_slice_free (PopQueryTreeState, state); - pop_window_stack_set_readiness (stack, TRUE); + g_assert (POP_IS_WINDOW_STACK (state->data)); + pop_window_stack_set_readiness (POP_WINDOW_STACK (state->data), TRUE); } static void @@ -522,6 +534,7 @@ pop_window_stack_ask_for_window_list (PopWindowStack *stack) state = g_slice_new0 (PopQueryTreeState); state->window = g_object_ref (gdk_screen_get_root_window (screen)); + state->data = stack; pop_x_reply_watch_add (display, query_tree_request, state, diff --git a/src/pop-x-reply-watch.c b/src/pop-x-reply-watch.c index 1ab987b..63a7087 100644 --- a/src/pop-x-reply-watch.c +++ b/src/pop-x-reply-watch.c @@ -18,6 +18,9 @@ * 02111-1307, USA. */ #include "config.h" + +#include "pop-x-reply-watch.h" + #include <glib.h> #include <gdk/gdk.h> diff --git a/src/pop-x-reply-watch.h b/src/pop-x-reply-watch.h index beb1114..2eac23b 100644 --- a/src/pop-x-reply-watch.h +++ b/src/pop-x-reply-watch.h @@ -20,6 +20,11 @@ #ifndef POP_X_REPLY_WATCH_H #define POP_X_REPLY_WATCH_H +#include <glib.h> + +#include <gdk/gdkx.h> +#include <gdk/gdk.h> + typedef Status (* PopXRequestFunc) (GdkDisplay *display, gpointer user_data); typedef void (* PopXReplyWatchFunc) (GdkDisplay *display, |