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);  | 
