diff options
author | Ray Strode <rstrode@redhat.com> | 2007-04-01 21:27:04 -0400 |
---|---|---|
committer | Ray Strode <rstrode@redhat.com> | 2007-04-01 21:27:04 -0400 |
commit | f8f3d93f473262afd390e23fddda05a643a3853b (patch) | |
tree | 8eef4198b14beedf7a59890d6f33c3faaa75d3cc | |
parent | ed59ee42780a5c8386d7086a016fee298f616d88 (diff) |
tackle the aforementioned event-listener problem without the junk
workaround.
-rw-r--r-- | src/pop-demo.c | 27 | ||||
-rw-r--r-- | src/pop-event-listener.c | 18 | ||||
-rw-r--r-- | src/pop-event-listener.h | 4 | ||||
-rw-r--r-- | src/pop-window-view.c | 7 |
4 files changed, 37 insertions, 19 deletions
diff --git a/src/pop-demo.c b/src/pop-demo.c index 3aa71df..cf50435 100644 --- a/src/pop-demo.c +++ b/src/pop-demo.c @@ -211,6 +211,28 @@ on_map (GtkWidget *widget) } static void +remove_window_from_stack_from_list (PopWindowStack *stack, + GdkWindow *window) +{ + remove_window_from_list (window); +} + +static gboolean +on_close (GtkWidget *widget) +{ + pop_window_stack_foreach (stack, + (PopWindowStackForeachFunc) + remove_window_from_stack_from_list, + NULL); + g_object_unref (stack); + stack = NULL; + + gtk_main_quit (); + + return FALSE; +} + +static void on_damage_event (XDamageNotifyEvent *damage_event, PopOverlayWindow *overlay_window) { @@ -319,6 +341,8 @@ main (int argc, G_CALLBACK (on_expose_event), NULL); g_signal_connect (G_OBJECT (overlay_window), "map", G_CALLBACK (on_map), NULL); + g_signal_connect (G_OBJECT (overlay_window), "delete-event", + G_CALLBACK (on_close), NULL); root_window = gdk_get_default_root_window (); gdk_window_set_events (root_window, GDK_SUBSTRUCTURE_MASK); @@ -326,8 +350,7 @@ main (int argc, gtk_widget_show (overlay_window); - listener = pop_event_listener_new (gtk_widget_get_display (overlay_window)); - pop_event_listener_start (listener); + listener = pop_event_listener_get_default (); gtk_main(); diff --git a/src/pop-event-listener.c b/src/pop-event-listener.c index 7fbb9d2..f07ec00 100644 --- a/src/pop-event-listener.c +++ b/src/pop-event-listener.c @@ -35,7 +35,6 @@ #include <gtk/gtk.h> #include "pop-marshal.h" -#include "pop-window-view.h" static void pop_event_listener_do_finalize (GObject *object); static void pop_event_listener_destroy_handler (PopEventListener *listener, @@ -60,6 +59,8 @@ static void pop_event_listener_shape_handler (PopEventListener *listener, static void pop_event_listener_reparent_handler (PopEventListener *listener, GdkEvent *event, GdkWindow *window); +static void pop_event_listener_stop (PopEventListener *listener); + static int pop_event_listener_damage_notify_event_type, pop_event_listener_shape_notify_event_type; @@ -416,6 +417,8 @@ pop_event_listener_do_finalize (GObject *object) parent_class = G_OBJECT_CLASS (pop_event_listener_parent_class); + pop_event_listener_stop (listener); + if (parent_class->finalize != NULL) parent_class->finalize (object); } @@ -470,7 +473,7 @@ pop_event_listener_error_quark (void) return error_quark; } -PopEventListener * +static PopEventListener * pop_event_listener_new (GdkDisplay *display) { PopEventListener *listener; @@ -586,9 +589,6 @@ pop_event_listener_cache_window_geometry (PopEventListener *listener, GINT_TO_POINTER (TRUE)); } -static void pop_window_view_window_moved (PopWindowView *view); -static void pop_window_view_window_resized (PopWindowView *view); - static void pop_event_listener_configure_handler (PopEventListener *listener, GdkEvent *event, @@ -617,8 +617,6 @@ pop_event_listener_configure_handler (PopEventListener *listener, view = g_object_get_data (G_OBJECT (window), "pop-window-view"); if (changed_position) { - if (view != NULL) - pop_window_view_window_moved (view); g_signal_emit (G_OBJECT (listener), pop_event_listener_signals[WINDOW_MOVED], pop_event_listener_get_signal_detail_for_window (listener, @@ -628,8 +626,6 @@ pop_event_listener_configure_handler (PopEventListener *listener, if (changed_size) { - if (view != NULL) - pop_window_view_window_resized (view); g_signal_emit (G_OBJECT (listener), pop_event_listener_signals[WINDOW_RESIZED], pop_event_listener_get_signal_detail_for_window (listener, @@ -844,7 +840,7 @@ pop_event_listener_filter (XEvent *x_event, return GDK_FILTER_CONTINUE; } -void +static void pop_event_listener_start (PopEventListener *listener) { /* used for questionable hack to get damage and shape events reported @@ -858,7 +854,7 @@ pop_event_listener_start (PopEventListener *listener) listener, NULL); } -void +static void pop_event_listener_stop (PopEventListener *listener) { gdk_event_handler_set ((GdkEventFunc) gtk_main_do_event, NULL, NULL); diff --git a/src/pop-event-listener.h b/src/pop-event-listener.h index d302f44..21b7f59 100644 --- a/src/pop-event-listener.h +++ b/src/pop-event-listener.h @@ -76,10 +76,6 @@ enum _PopEventListenerError GType pop_event_listener_get_type (void); GQuark pop_event_listener_error_quark (void); -PopEventListener *pop_event_listener_new (GdkDisplay *display) G_GNUC_MALLOC; -void pop_event_listener_start (PopEventListener *listener); -void pop_event_listener_stop (PopEventListener *listener); - PopEventListener *pop_event_listener_get_default (void); #endif diff --git a/src/pop-window-view.c b/src/pop-window-view.c index b713e2a..f197d6b 100644 --- a/src/pop-window-view.c +++ b/src/pop-window-view.c @@ -158,7 +158,6 @@ pop_window_view_init (PopWindowView *view) PopWindowViewPrivate); view->priv->event_listener = pop_event_listener_get_default (); - pop_event_listener_start (view->priv->event_listener); } static void @@ -484,9 +483,11 @@ pop_window_view_set_clip_path_from_window (PopWindowView *view) rectangles[i].width, rectangles[i].height); } - + XFree (rectangles); + view->priv->clip_path = cairo_copy_path_flat (cairo_context); cairo_destroy (cairo_context); + cairo_surface_destroy (surface); return TRUE; } @@ -891,12 +892,14 @@ pop_window_view_render_to_context (PopWindowView *view, cairo_save (cairo_context); cairo_translate (cairo_context, view->priv->x, view->priv->y); +#if 0 char *text; text = g_strdup_printf ("0x%lx", GDK_WINDOW_XWINDOW (view->priv->window)); cairo_move_to (cairo_context, view->priv->width, view->priv->height); cairo_set_source_rgb (cairo_context, 1.0, 1.0, 0.0); cairo_show_text (cairo_context, text); g_free (text); +#endif cairo_set_source (cairo_context, view->priv->pattern); cairo_move_to (cairo_context, 0.0, 0.0); |