[gnome-settings-daemon/reusable-osd-window: 2/5] Split the composited and non-composited code for the expose-event handler



commit d76b86b6378f71d58f8bb50e6538a4f8c16bc474
Author: Federico Mena Quintero <federico novell com>
Date:   Tue Dec 22 13:09:52 2009 -0600

    Split the composited and non-composited code for the expose-event handler
    
    This way we can use a normal overriden method instead of a magic
    signal connection to the expose-event signal.
    
    Signed-off-by: Federico Mena Quintero <federico novell com>

 plugins/common/gsd-osd-window.c |   45 ++++++++++++++++++++++++++++++++++----
 1 files changed, 40 insertions(+), 5 deletions(-)
---
diff --git a/plugins/common/gsd-osd-window.c b/plugins/common/gsd-osd-window.c
index 19bc459..2722228 100644
--- a/plugins/common/gsd-osd-window.c
+++ b/plugins/common/gsd-osd-window.c
@@ -107,11 +107,14 @@ rounded_rectangle (cairo_t* cr,
         cairo_close_path (cr);
 }
 
-static gboolean
-on_expose_event (GtkWidget          *widget,
-                 GdkEventExpose     *event,
-                 GsdOsdWindow *window)
+/* This is our expose-event handler when the window is in a compositing manager.
+ * We draw everything by hand, using Cairo, so that we can have a nice
+ * transparent/rounded look.
+ */
+static void
+expose_when_composited (GtkWidget *widget, GdkEventExpose *event)
 {
+	GsdOsdWindow    *window;
         cairo_t         *context;
         cairo_t         *cr;
         cairo_surface_t *surface;
@@ -121,6 +124,8 @@ on_expose_event (GtkWidget          *widget,
         GdkColor         color;
         double           r, g, b;
 
+	window = GSD_OSD_WINDOW (widget);
+
         context = gdk_cairo_create (gtk_widget_get_window (widget));
 
         style = gtk_widget_get_style (widget);
@@ -181,6 +186,36 @@ on_expose_event (GtkWidget          *widget,
                 cairo_surface_destroy (surface);
         }
         cairo_destroy (context);
+}
+
+/* This is our expose-event handler when the window is *not* in a compositing manager.
+ * We just draw a rectangular frame by hand.  We do this with hardcoded drawing code,
+ * instead of GtkFrame, to avoid changing the window's internal widget hierarchy:  in
+ * either case (composited or non-composited), callers can assume that this works
+ * identically to a GtkWindow without any intermediate widgetry.
+ */
+static void
+expose_when_not_composited (GtkWidget *widget, GdkEventExpose *event)
+{
+	GsdOsdWindow *window;
+
+	window = GSD_OSD_WINDOW (widget);
+
+	/* FIXME */
+}
+
+static gboolean
+gsd_osd_window_expose_event (GtkWidget          *widget,
+			     GdkEventExpose     *event)
+{
+	GsdOsdWindow *window;
+
+	window = GSD_OSD_WINDOW (widget);
+
+	if (window->priv->is_composited)
+		expose_when_composited (widget, event);
+	else
+		expose_when_not_composited (widget, event);
 
         return FALSE;
 }
@@ -255,6 +290,7 @@ gsd_osd_window_class_init (GsdOsdWindowClass *klass)
         widget_class->show = gsd_osd_window_real_show;
         widget_class->hide = gsd_osd_window_real_hide;
         widget_class->realize = gsd_osd_window_real_realize;
+	widget_class->expose_event = gsd_osd_window_expose_event;
 
         g_type_class_add_private (klass, sizeof (GsdOsdWindowPrivate));
 }
@@ -298,7 +334,6 @@ gsd_osd_window_init (GsdOsdWindow *window)
                 size = 130 * MAX (1, scale);
 
                 gtk_window_set_default_size (GTK_WINDOW (window), size, size);
-                g_signal_connect (window, "expose-event", G_CALLBACK (on_expose_event), window);
 
                 window->priv->fade_out_alpha = 1.0;
         } else {



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]