summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2007-04-01 21:27:04 -0400
committerRay Strode <rstrode@redhat.com>2007-04-01 21:27:04 -0400
commitf8f3d93f473262afd390e23fddda05a643a3853b (patch)
tree8eef4198b14beedf7a59890d6f33c3faaa75d3cc
parented59ee42780a5c8386d7086a016fee298f616d88 (diff)
tackle the aforementioned event-listener problem without the junk
workaround.
-rw-r--r--src/pop-demo.c27
-rw-r--r--src/pop-event-listener.c18
-rw-r--r--src/pop-event-listener.h4
-rw-r--r--src/pop-window-view.c7
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);