summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2007-04-18 19:18:31 -0400
committerRay Strode <rstrode@redhat.com>2007-04-18 19:18:31 -0400
commit5967995b9cf644428966b71d3a250e8c1cabdac1 (patch)
tree0266112c3666e0bfe8d4ff93cea15a3c22554a5f
parent984354cce83e152dcef6b6cef0f5c80988563ec4 (diff)
port more things over to use the new async error handling
-rw-r--r--src/Makefile.am2
-rw-r--r--src/pop-demo.c68
-rw-r--r--src/pop-window-stack.c55
-rw-r--r--src/pop-x-reply-watch.c3
-rw-r--r--src/pop-x-reply-watch.h5
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,