diff options
-rw-r--r-- | src/themes/standard/theme.c | 180 |
1 files changed, 112 insertions, 68 deletions
diff --git a/src/themes/standard/theme.c b/src/themes/standard/theme.c index b138495..990facc 100644 --- a/src/themes/standard/theme.c +++ b/src/themes/standard/theme.c @@ -117,57 +117,81 @@ void notification_tick(GtkWindow *nw, glong remaining); #define BACKGROUND_OPACITY 0.92 #define BOTTOM_GRADIENT_HEIGHT 30 +static void +get_background_color (GtkStyleContext *context, + GtkStateFlags state, + GdkRGBA *color) +{ + GdkRGBA *c; + + g_return_if_fail (color != NULL); + g_return_if_fail (GTK_IS_STYLE_CONTEXT (context)); + + gtk_style_context_get (context, state, + "background-color", &c, + NULL); + + *color = *c; + gdk_rgba_free (c); +} + static void fill_background(GtkWidget* widget, WindowData* windata, cairo_t* cr) { - GtkStyle* style; - GdkColor* background_color; + GtkStyleContext *context; + GdkRGBA bg; - GtkAllocation allocation; + GtkAllocation allocation; - gtk_widget_get_allocation(widget, &allocation); + gtk_widget_get_allocation(widget, &allocation); - #ifdef ENABLE_GRADIENT_LOOK + #ifdef ENABLE_GRADIENT_LOOK - cairo_pattern_t *gradient; - int gradient_y; + cairo_pattern_t *gradient; + int gradient_y; - gradient_y = allocation.height - BOTTOM_GRADIENT_HEIGHT; + gradient_y = allocation.height - BOTTOM_GRADIENT_HEIGHT; - #endif + #endif - style = gtk_widget_get_style(widget); - background_color = &style->base[GTK_STATE_NORMAL]; + context = gtk_widget_get_style_context (windata->win); - if (windata->composited) - { - cairo_set_source_rgba(cr, background_color->red / 65535.0, background_color->green / 65535.0, background_color->blue / 65535.0, BACKGROUND_OPACITY); - } - else - { - gdk_cairo_set_source_color(cr, background_color); - } + gtk_style_context_save (context); + gtk_style_context_set_state (context, GTK_STATE_FLAG_NORMAL); - cairo_rectangle(cr, 0, 0, allocation.width, allocation.height); + get_background_color (context, GTK_STATE_FLAG_NORMAL, &bg); - cairo_fill(cr); + gtk_style_context_restore (context); - #ifdef ENABLE_GRADIENT_LOOK - /* Add a very subtle gradient to the bottom of the notification */ - gradient = cairo_pattern_create_linear(0, gradient_y, 0, allocation.height); - cairo_pattern_add_color_stop_rgba(gradient, 0, 0, 0, 0, 0); - cairo_pattern_add_color_stop_rgba(gradient, 1, 0, 0, 0, 0.15); - cairo_rectangle(cr, 0, gradient_y, allocation.width, BOTTOM_GRADIENT_HEIGHT); + if (windata->composited) + { + cairo_set_source_rgba(cr, bg.red, bg.green, bg.blue, BACKGROUND_OPACITY); + } + else + { + gdk_cairo_set_source_rgba (cr, &bg); + } - cairo_set_source(cr, gradient); - cairo_fill(cr); - cairo_pattern_destroy(gradient); - #endif + cairo_rectangle(cr, 0, 0, allocation.width, allocation.height); + + cairo_fill(cr); + + #ifdef ENABLE_GRADIENT_LOOK + /* Add a very subtle gradient to the bottom of the notification */ + gradient = cairo_pattern_create_linear(0, gradient_y, 0, allocation.height); + cairo_pattern_add_color_stop_rgba(gradient, 0, 0, 0, 0, 0); + cairo_pattern_add_color_stop_rgba(gradient, 1, 0, 0, 0, 0.15); + cairo_rectangle(cr, 0, gradient_y, allocation.width, BOTTOM_GRADIENT_HEIGHT); + + cairo_set_source(cr, gradient); + cairo_fill(cr); + cairo_pattern_destroy(gradient); + #endif } static void draw_stripe(GtkWidget* widget, WindowData* windata, cairo_t* cr) { - GtkStyle* style; - GdkColor color; + GtkStyleContext* context; + GdkRGBA bg; int stripe_x; int stripe_y; int stripe_height; @@ -176,7 +200,9 @@ static void draw_stripe(GtkWidget* widget, WindowData* windata, cairo_t* cr) double r, g, b; #endif - style = gtk_widget_get_style(widget); + context = gtk_widget_get_style_context (widget); + + gtk_style_context_save (context); GtkAllocation alloc; gtk_widget_get_allocation(windata->main_hbox, &alloc); @@ -194,19 +220,27 @@ static void draw_stripe(GtkWidget* widget, WindowData* windata, cairo_t* cr) switch (windata->urgency) { case URGENCY_LOW: // LOW - color = style->bg[GTK_STATE_NORMAL]; + gtk_style_context_set_state (context, GTK_STATE_FLAG_NORMAL); + gtk_style_context_add_class (context, GTK_STYLE_CLASS_VIEW); + get_background_color (context, GTK_STATE_FLAG_NORMAL, &bg); + gdk_cairo_set_source_rgba (cr, &bg); break; case URGENCY_CRITICAL: // CRITICAL - gdk_color_parse("#CC0000", &color); + gdk_rgba_parse (&bg, "#CC0000"); break; case URGENCY_NORMAL: // NORMAL default: - color = style->bg[GTK_STATE_SELECTED]; + gtk_style_context_set_state (context, GTK_STATE_FLAG_SELECTED); + gtk_style_context_add_class (context, GTK_STYLE_CLASS_VIEW); + get_background_color (context, GTK_STATE_FLAG_SELECTED, &bg); + gdk_cairo_set_source_rgba (cr, &bg); break; } + gtk_style_context_restore (context); + cairo_rectangle(cr, stripe_x, stripe_y, STRIPE_WIDTH, stripe_height); #ifdef ENABLE_GRADIENT_LOOK @@ -221,7 +255,7 @@ static void draw_stripe(GtkWidget* widget, WindowData* windata, cairo_t* cr) cairo_fill(cr); cairo_pattern_destroy(gradient); #else - gdk_cairo_set_source_color(cr, &color); + gdk_cairo_set_source_rgba (cr, &bg); cairo_fill(cr); #endif } @@ -738,6 +772,7 @@ GtkWindow* create_notification(UrlClickedCb url_clicked) gtk_box_pack_start(GTK_BOX(windata->content_hbox), vbox, TRUE, TRUE, 0); windata->body_label = gtk_label_new(NULL); + gtk_widget_show(windata->body_label); gtk_box_pack_start(GTK_BOX(vbox), windata->body_label, TRUE, TRUE, 0); #if GTK_CHECK_VERSION (3, 16, 0) gtk_label_set_xalign (GTK_LABEL (windata->body_label), 0.0); @@ -889,46 +924,55 @@ void set_notification_arrow(GtkWidget* nw, gboolean visible, int x, int y) static void paint_countdown (GtkWidget *pie, - cairo_t *cr, - WindowData *windata) + cairo_t *cr, + WindowData *windata) { - GtkStyle* style; - cairo_t* cr2; - cairo_surface_t* surface; + GtkStyleContext *context; + GdkRGBA bg; + GtkAllocation alloc; + cairo_t* cr2; + cairo_surface_t* surface; - style = gtk_widget_get_style(windata->win); - GtkAllocation alloc; - gtk_widget_get_allocation(pie, &alloc); - cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); - surface = cairo_surface_create_similar (cairo_get_target(cr), - CAIRO_CONTENT_COLOR_ALPHA, - alloc.width, - alloc.height); + context = gtk_widget_get_style_context (windata->win); - cr2 = cairo_create (surface); + gtk_style_context_save (context); + gtk_style_context_set_state (context, GTK_STATE_FLAG_SELECTED); - fill_background (pie, windata, cr2); + get_background_color (context, GTK_STATE_FLAG_SELECTED, &bg); - if (windata->timeout > 0) - { - gdouble pct = (gdouble) windata->remaining / (gdouble) windata->timeout; + gtk_style_context_restore (context); - gdk_cairo_set_source_color (cr2, &style->bg[GTK_STATE_SELECTED]); + gtk_widget_get_allocation(pie, &alloc); + cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); + surface = cairo_surface_create_similar (cairo_get_target(cr), + CAIRO_CONTENT_COLOR_ALPHA, + alloc.width, + alloc.height); - cairo_move_to (cr2, PIE_RADIUS, PIE_RADIUS); - cairo_arc_negative (cr2, PIE_RADIUS, PIE_RADIUS, PIE_RADIUS, -G_PI_2, -(pct * G_PI * 2) - G_PI_2); - cairo_line_to (cr2, PIE_RADIUS, PIE_RADIUS); - cairo_fill (cr2); - } + cr2 = cairo_create (surface); - cairo_destroy(cr2); + fill_background (pie, windata, cr2); - cairo_save (cr); - cairo_set_source_surface (cr, surface, 0, 0); - cairo_paint (cr); - cairo_restore (cr); + if (windata->timeout > 0) + { + gdouble pct = (gdouble) windata->remaining / (gdouble) windata->timeout; - cairo_surface_destroy(surface); + gdk_cairo_set_source_rgba (cr2, &bg); + + cairo_move_to (cr2, PIE_RADIUS, PIE_RADIUS); + cairo_arc_negative (cr2, PIE_RADIUS, PIE_RADIUS, PIE_RADIUS, -G_PI_2, -(pct * G_PI * 2) - G_PI_2); + cairo_line_to (cr2, PIE_RADIUS, PIE_RADIUS); + cairo_fill (cr2); + } + + cairo_destroy(cr2); + + cairo_save (cr); + cairo_set_source_surface (cr, surface, 0, 0); + cairo_paint (cr); + cairo_restore (cr); + + cairo_surface_destroy(surface); } static gboolean |