summaryrefslogtreecommitdiff
path: root/src/msd-osd-window.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/msd-osd-window.c')
-rw-r--r--src/msd-osd-window.c359
1 files changed, 76 insertions, 283 deletions
diff --git a/src/msd-osd-window.c b/src/msd-osd-window.c
index 46dfebd..11c26d7 100644
--- a/src/msd-osd-window.c
+++ b/src/msd-osd-window.c
@@ -55,7 +55,7 @@ struct MsdOsdWindowPrivate
};
enum {
- EXPOSE_WHEN_COMPOSITED,
+ DRAW_WHEN_COMPOSITED,
LAST_SIGNAL
};
@@ -139,122 +139,27 @@ add_hide_timeout (MsdOsdWindow *window)
window);
}
-void
-msd_osd_window_draw_rounded_rectangle (cairo_t* cr,
- gdouble aspect,
- gdouble x,
- gdouble y,
- gdouble corner_radius,
- gdouble width,
- gdouble height)
-{
- gdouble radius = corner_radius / aspect;
-
- cairo_move_to (cr, x + radius, y);
-
- cairo_line_to (cr,
- x + width - radius,
- y);
- cairo_arc (cr,
- x + width - radius,
- y + radius,
- radius,
- -90.0f * G_PI / 180.0f,
- 0.0f * G_PI / 180.0f);
- cairo_line_to (cr,
- x + width,
- y + height - radius);
- cairo_arc (cr,
- x + width - radius,
- y + height - radius,
- radius,
- 0.0f * G_PI / 180.0f,
- 90.0f * G_PI / 180.0f);
- cairo_line_to (cr,
- x + radius,
- y + height);
- cairo_arc (cr,
- x + radius,
- y + height - radius,
- radius,
- 90.0f * G_PI / 180.0f,
- 180.0f * G_PI / 180.0f);
- cairo_line_to (cr,
- x,
- y + radius);
- cairo_arc (cr,
- x + radius,
- y + radius,
- radius,
- 180.0f * G_PI / 180.0f,
- 270.0f * G_PI / 180.0f);
- cairo_close_path (cr);
-}
-
-void
-msd_osd_window_color_reverse (const GdkColor *a,
- GdkColor *b)
-{
- gdouble red;
- gdouble green;
- gdouble blue;
- gdouble h;
- gdouble s;
- gdouble v;
-
- red = (gdouble) a->red / 65535.0;
- green = (gdouble) a->green / 65535.0;
- blue = (gdouble) a->blue / 65535.0;
-
- gtk_rgb_to_hsv (red, green, blue, &h, &s, &v);
-
- v = 0.5 + (0.5 - v);
- if (v > 1.0)
- v = 1.0;
- else if (v < 0.0)
- v = 0.0;
-
- gtk_hsv_to_rgb (h, s, v, &red, &green, &blue);
-
- b->red = red * 65535.0;
- b->green = green * 65535.0;
- b->blue = blue * 65535.0;
-}
-
-/* This is our expose-event handler when the window is in a compositing manager.
+/* This is our draw-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
-#if GTK_CHECK_VERSION (3, 0, 0)
-draw_when_composited (GtkWidget *widget, cairo_t *context)
-#else
-expose_when_composited (GtkWidget *widget, GdkEventExpose *event)
-#endif
+draw_when_composited (GtkWidget *widget, cairo_t *orig_cr)
{
MsdOsdWindow *window;
-#if !GTK_CHECK_VERSION (3, 0, 0)
- cairo_t *context;
-#endif
cairo_t *cr;
cairo_surface_t *surface;
int width;
int height;
- GtkStyle *style;
- GdkColor color;
- double r, g, b;
+ GtkStyleContext *context;
window = MSD_OSD_WINDOW (widget);
-#if !GTK_CHECK_VERSION (3, 0, 0)
- context = gdk_cairo_create (gtk_widget_get_window (widget));
-#endif
-
- style = gtk_widget_get_style (widget);
- cairo_set_operator (context, CAIRO_OPERATOR_SOURCE);
+ context = gtk_widget_get_style_context (widget);
+ cairo_set_operator (orig_cr, CAIRO_OPERATOR_SOURCE);
gtk_window_get_size (GTK_WINDOW (widget), &width, &height);
- surface = cairo_surface_create_similar (cairo_get_target (context),
+ surface = cairo_surface_create_similar (cairo_get_target (orig_cr),
CAIRO_CONTENT_COLOR_ALPHA,
width,
height);
@@ -267,137 +172,73 @@ expose_when_composited (GtkWidget *widget, GdkEventExpose *event)
if (cairo_status (cr) != CAIRO_STATUS_SUCCESS) {
goto done;
}
- cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.0);
- cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
- cairo_paint (cr);
-
- /* draw a box */
- msd_osd_window_draw_rounded_rectangle (cr, 1.0, 0.5, 0.5, height / 10, width-1, height-1);
- msd_osd_window_color_reverse (&style->bg[GTK_STATE_NORMAL], &color);
- r = (float)color.red / 65535.0;
- g = (float)color.green / 65535.0;
- b = (float)color.blue / 65535.0;
- cairo_set_source_rgba (cr, r, g, b, BG_ALPHA);
- cairo_fill_preserve (cr);
-
- msd_osd_window_color_reverse (&style->text_aa[GTK_STATE_NORMAL], &color);
- r = (float)color.red / 65535.0;
- g = (float)color.green / 65535.0;
- b = (float)color.blue / 65535.0;
- cairo_set_source_rgba (cr, r, g, b, BG_ALPHA / 2);
- cairo_set_line_width (cr, 1);
- cairo_stroke (cr);
-
- g_signal_emit (window, signals[EXPOSE_WHEN_COMPOSITED], 0, cr);
+
+ gtk_render_background (context, cr, 0, 0, width, height);
+ gtk_render_frame (context, cr, 0, 0, width, height);
+
+ g_signal_emit (window, signals[DRAW_WHEN_COMPOSITED], 0, cr);
cairo_destroy (cr);
/* Make sure we have a transparent background */
- cairo_rectangle (context, 0, 0, width, height);
- cairo_set_source_rgba (context, 0.0, 0.0, 0.0, 0.0);
- cairo_fill (context);
+ cairo_rectangle (orig_cr, 0, 0, width, height);
+ cairo_set_source_rgba (orig_cr, 0.0, 0.0, 0.0, 0.0);
+ cairo_fill (orig_cr);
- cairo_set_source_surface (context, surface, 0, 0);
- cairo_paint_with_alpha (context, window->priv->fade_out_alpha);
+ cairo_set_source_surface (orig_cr, surface, 0, 0);
+ cairo_paint_with_alpha (orig_cr, window->priv->fade_out_alpha);
- done:
+done:
if (surface != NULL) {
cairo_surface_destroy (surface);
}
-#if !GTK_CHECK_VERSION (3, 0, 0)
- cairo_destroy (context);
-#endif
}
-/* This is our expose-event handler when the window is *not* in a compositing manager.
+/* This is our expose/draw-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
-#if GTK_CHECK_VERSION (3, 0, 0)
draw_when_not_composited (GtkWidget *widget, cairo_t *cr)
-#else
-expose_when_not_composited (GtkWidget *widget, GdkEventExpose *event)
-#endif
{
- MsdOsdWindow *window;
-#if GTK_CHECK_VERSION (3, 0, 0)
- int width;
- int height;
-#else
- GtkAllocation allocation;
-#endif
-
- window = MSD_OSD_WINDOW (widget);
-
-#if GTK_CHECK_VERSION (3, 0, 0)
- width = gtk_widget_get_allocated_width (widget);
- height = gtk_widget_get_allocated_width (widget);
-#else
- gtk_widget_get_allocation (widget, &allocation);
-#endif
+ GtkStyleContext *context;
+ int width;
+ int height;
- gtk_paint_shadow (gtk_widget_get_style (widget),
-#if GTK_CHECK_VERSION (3, 0, 0)
- cr,
-#else
- gtk_widget_get_window (widget),
-#endif
- gtk_widget_get_state (widget),
- GTK_SHADOW_OUT,
-#if !GTK_CHECK_VERSION (3, 0, 0)
- &event->area,
-#endif
- widget,
- NULL, /* NULL detail -> themes should use the MsdOsdWindow widget name, probably */
- 0,
- 0,
-#if GTK_CHECK_VERSION (3, 0, 0)
- width,
- height);
-#else
- allocation.width,
- allocation.height);
-#endif
+ gtk_window_get_size (GTK_WINDOW (widget), &width, &height);
+ context = gtk_widget_get_style_context (widget);
+
+ gtk_style_context_set_state (context, GTK_STATE_FLAG_ACTIVE);
+ gtk_style_context_add_class(context,"msd-osd-window-solid");
+ gtk_render_frame (context,
+ cr,
+ 0,
+ 0,
+ width,
+ height);
}
static gboolean
-#if GTK_CHECK_VERSION (3, 0, 0)
msd_osd_window_draw (GtkWidget *widget,
- cairo_t *cr)
-#else
-msd_osd_window_expose_event (GtkWidget *widget,
- GdkEventExpose *event)
-#endif
+ cairo_t *cr)
{
MsdOsdWindow *window;
GtkWidget *child;
window = MSD_OSD_WINDOW (widget);
-#if GTK_CHECK_VERSION (3, 0, 0)
if (window->priv->is_composited)
draw_when_composited (widget, cr);
else
draw_when_not_composited (widget, cr);
-#else
- if (window->priv->is_composited)
- expose_when_composited (widget, event);
- else
- expose_when_not_composited (widget, event);
-#endif
child = gtk_bin_get_child (GTK_BIN (window));
if (child)
-#if GTK_CHECK_VERSION (3, 0, 0)
gtk_container_propagate_draw (GTK_CONTAINER (window), child, cr);
-#else
- gtk_container_propagate_expose (GTK_CONTAINER (window), child, event);
-#endif
- return FALSE;
+ return FALSE;
}
static void
@@ -430,129 +271,84 @@ msd_osd_window_real_hide (GtkWidget *widget)
static void
msd_osd_window_real_realize (GtkWidget *widget)
{
-#if GTK_CHECK_VERSION (3, 0, 0)
GdkScreen *screen;
GdkVisual *visual;
cairo_region_t *region;
-#else
- GdkColormap *colormap;
- GtkAllocation allocation;
- GdkBitmap *mask;
- cairo_t *cr;
-#endif
-#if GTK_CHECK_VERSION (3, 0, 0)
screen = gtk_widget_get_screen (widget);
visual = gdk_screen_get_rgba_visual (screen);
if (visual == NULL) {
visual = gdk_screen_get_system_visual (screen);
}
- gtk_widget_set_visual (widget, visual);
-#else
- colormap = gdk_screen_get_rgba_colormap (gtk_widget_get_screen (widget));
- if (colormap != NULL) {
- gtk_widget_set_colormap (widget, colormap);
- }
-#endif
+ gtk_widget_set_visual (widget, visual);
if (GTK_WIDGET_CLASS (msd_osd_window_parent_class)->realize) {
GTK_WIDGET_CLASS (msd_osd_window_parent_class)->realize (widget);
}
-#if GTK_CHECK_VERSION (3, 0, 0)
/* make the whole window ignore events */
region = cairo_region_create ();
gtk_widget_input_shape_combine_region (widget, region);
cairo_region_destroy (region);
-#else
- gtk_widget_get_allocation (widget, &allocation);
- mask = gdk_pixmap_new (gtk_widget_get_window (widget),
- allocation.width,
- allocation.height,
- 1);
- cr = gdk_cairo_create (mask);
-
- cairo_set_source_rgba (cr, 1., 1., 1., 0.);
- cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
- cairo_paint (cr);
-
- /* make the whole window ignore events */
- gdk_window_input_shape_combine_mask (gtk_widget_get_window (widget), mask, 0, 0);
- g_object_unref (mask);
- cairo_destroy (cr);
-#endif
}
static void
-msd_osd_window_style_set (GtkWidget *widget,
- GtkStyle *previous_style)
+msd_osd_window_style_updated (GtkWidget *widget)
{
- GtkStyle *style;
+ GtkStyleContext *context;
+ GtkBorder padding;
- GTK_WIDGET_CLASS (msd_osd_window_parent_class)->style_set (widget, previous_style);
+ GTK_WIDGET_CLASS (msd_osd_window_parent_class)->style_updated (widget);
/* We set our border width to 12 (per the MATE standard), plus the
- * thickness of the frame that we draw in our expose handler. This will
+ * padding of the frame that we draw in our expose handler. This will
* make our child be 12 pixels away from the frame.
*/
- style = gtk_widget_get_style (widget);
- gtk_container_set_border_width (GTK_CONTAINER (widget), 12 + MAX (style->xthickness, style->ythickness));
+ context = gtk_widget_get_style_context (widget);
+ gtk_style_context_get_padding (context, GTK_STATE_FLAG_NORMAL, &padding);
+ gtk_container_set_border_width (GTK_CONTAINER (widget), 12 + MAX (padding.left, padding.top));
}
-#if GTK_CHECK_VERSION (3, 0, 0)
static void
msd_osd_window_get_preferred_width (GtkWidget *widget,
- gint *minimum_width,
- gint *natural_width)
+ gint *minimum,
+ gint *natural)
{
- GtkStyle *style;
+ GtkStyleContext *context;
+ GtkBorder padding;
- GTK_WIDGET_CLASS (msd_osd_window_parent_class)->get_preferred_width (widget, minimum_width, natural_width);
+ GTK_WIDGET_CLASS (msd_osd_window_parent_class)->get_preferred_width (widget, minimum, natural);
- /* See the comment in msd_osd_window_style_set() for why we add the thickness here */
+ /* See the comment in msd_osd_window_style_updated() for why we add the padding here */
- style = gtk_widget_get_style (widget);
+ context = gtk_widget_get_style_context (widget);
+ gtk_style_context_get_padding (context, GTK_STATE_FLAG_NORMAL, &padding);
- *minimum_width += style->xthickness;
- *natural_width += style->xthickness;
+ *minimum += padding.left;
+ *natural += padding.left;
}
static void
msd_osd_window_get_preferred_height (GtkWidget *widget,
- gint *minimum_height,
- gint *natural_height)
+ gint *minimum,
+ gint *natural)
{
- GtkStyle *style;
+ GtkStyleContext *context;
+ GtkBorder padding;
- GTK_WIDGET_CLASS (msd_osd_window_parent_class)->get_preferred_height (widget, minimum_height, natural_height);
+ GTK_WIDGET_CLASS (msd_osd_window_parent_class)->get_preferred_height (widget, minimum, natural);
- /* See the comment in msd_osd_window_style_set() for why we add the thickness here */
+ /* See the comment in msd_osd_window_style_updated() for why we add the padding here */
- style = gtk_widget_get_style (widget);
+ context = gtk_widget_get_style_context (widget);
+ gtk_style_context_get_padding (context, GTK_STATE_FLAG_NORMAL, &padding);
- *minimum_height += style->ythickness;
- *natural_height += style->ythickness;
+ *minimum += padding.top;
+ *natural += padding.top;
}
-#else
-static void
-msd_osd_window_size_request (GtkWidget *widget,
- GtkRequisition *requisition)
-{
- GtkStyle *style;
-
- GTK_WIDGET_CLASS (msd_osd_window_parent_class)->size_request (widget, requisition);
-
- /* See the comment in msd_osd_window_style_set() for why we add the thickness here */
-
- style = gtk_widget_get_style (widget);
-
- requisition->width += style->xthickness;
- requisition->height += style->ythickness;
-}
-#endif
static GObject *
msd_osd_window_constructor (GType type,
@@ -571,6 +367,10 @@ msd_osd_window_constructor (GType type,
"focus-on-map", FALSE,
NULL);
+ GtkWidget *widget = GTK_WIDGET (object);
+ GtkStyleContext *style_context = gtk_widget_get_style_context (widget);
+ gtk_style_context_add_class (style_context, "osd");
+
return object;
}
@@ -585,33 +385,23 @@ msd_osd_window_class_init (MsdOsdWindowClass *klass)
widget_class->show = msd_osd_window_real_show;
widget_class->hide = msd_osd_window_real_hide;
widget_class->realize = msd_osd_window_real_realize;
- widget_class->style_set = msd_osd_window_style_set;
-#if GTK_CHECK_VERSION (3, 0, 0)
+ widget_class->style_updated = msd_osd_window_style_updated;
widget_class->get_preferred_width = msd_osd_window_get_preferred_width;
widget_class->get_preferred_height = msd_osd_window_get_preferred_height;
widget_class->draw = msd_osd_window_draw;
-#else
- widget_class->size_request = msd_osd_window_size_request;
- widget_class->expose_event = msd_osd_window_expose_event;
-#endif
-#if GTK_CHECK_VERSION (3, 0, 0)
- signals[EXPOSE_WHEN_COMPOSITED] = g_signal_new ("draw-when-composited",
-#else
- signals[EXPOSE_WHEN_COMPOSITED] = g_signal_new ("expose-when-composited",
-#endif
+ signals[DRAW_WHEN_COMPOSITED] = g_signal_new ("draw-when-composited",
G_TYPE_FROM_CLASS (gobject_class),
G_SIGNAL_RUN_FIRST,
-#if GTK_CHECK_VERSION (3, 0, 0)
G_STRUCT_OFFSET (MsdOsdWindowClass, draw_when_composited),
-#else
- G_STRUCT_OFFSET (MsdOsdWindowClass, expose_when_composited),
-#endif
NULL, NULL,
g_cclosure_marshal_VOID__POINTER,
G_TYPE_NONE, 1,
G_TYPE_POINTER);
+#if GTK_CHECK_VERSION (3, 20, 0)
+ gtk_widget_class_set_css_name (widget_class, "MsdOsdWindow");
+#endif
g_type_class_add_private (klass, sizeof (MsdOsdWindowPrivate));
}
@@ -659,6 +449,9 @@ msd_osd_window_init (MsdOsdWindow *window)
gtk_window_set_decorated (GTK_WINDOW (window), FALSE);
gtk_widget_set_app_paintable (GTK_WIDGET (window), TRUE);
+ GtkStyleContext *style = gtk_widget_get_style_context (GTK_WIDGET (window));
+ gtk_style_context_add_class (style, "window-frame");
+
/* assume 130x130 on a 640x480 display and scale from there */
scalew = gdk_screen_get_width (screen) / 640.0;
scaleh = gdk_screen_get_height (screen) / 480.0;