[gnome-settings-daemon/reusable-osd-window: 2/5] Split the composited and non-composited code for the expose-event handler
- From: Federico Mena Quintero <federico src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gnome-settings-daemon/reusable-osd-window: 2/5] Split the composited and non-composited code for the expose-event handler
- Date: Wed, 23 Dec 2009 00:04:40 +0000 (UTC)
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]