diff options
Diffstat (limited to 'src/themes')
-rw-r--r-- | src/themes/coco/coco-theme.c | 128 | ||||
-rw-r--r-- | src/themes/nodoka/nodoka-theme.c | 184 | ||||
-rw-r--r-- | src/themes/slider/theme.c | 395 | ||||
-rw-r--r-- | src/themes/standard/theme.c | 159 |
4 files changed, 735 insertions, 131 deletions
diff --git a/src/themes/coco/coco-theme.c b/src/themes/coco/coco-theme.c index 2c257e7..2825500 100644 --- a/src/themes/coco/coco-theme.c +++ b/src/themes/coco/coco-theme.c @@ -156,16 +156,51 @@ draw_pie(GtkWidget *pie, WindowData *windata, cairo_t *cr) static gboolean paint_window(GtkWidget *widget, +#if GTK_CHECK_VERSION (3, 0, 0) + cairo_t *cr, +#else GdkEventExpose *event, +#endif WindowData *windata) { + cairo_surface_t *surface; + cairo_t *context; + GtkAllocation allocation; +#if !GTK_CHECK_VERSION (3, 0, 0) + cairo_t *cr; +#endif + if (windata->width == 0) { - windata->width = windata->win->allocation.width; - windata->height = windata->win->allocation.height; +#if GTK_CHECK_VERSION(3, 0, 0) + gtk_widget_get_allocation(windata->win, &allocation); +#else + allocation = windata->win->allocation; +#endif + windata->width = allocation.width; + windata->height = allocation.height; } if (!(windata->enable_transparency)) { +#if GTK_CHECK_VERSION (3, 0, 0) + surface = cairo_surface_create_similar (cairo_get_target (cr), + CAIRO_CONTENT_COLOR_ALPHA, + windata->width, + windata->height); + + cairo_save (cr); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_surface (cr, surface, 0, 0); + cairo_paint (cr); + + cairo_set_source_rgba (cr, 1, 1, 1, 1); + nodoka_rounded_rectangle (cr, 0, 0, + windata->width, windata->height, 6); + cairo_fill (cr); + + cairo_restore (cr); + cairo_surface_destroy(surface); +#else GdkPixmap *mask; cairo_t *mask_cr; mask = gdk_pixmap_new (NULL, windata->width, @@ -183,24 +218,36 @@ paint_window(GtkWidget *widget, (GdkBitmap *) mask, 0,0); gdk_pixmap_unref (mask); cairo_destroy (mask_cr); +#endif } - cairo_t *context; - cairo_surface_t *surface; - cairo_t *cr; - +#if GTK_CHECK_VERSION(3, 0, 0) + context = gdk_cairo_create(gtk_widget_get_window(widget)); +#else context = gdk_cairo_create(widget->window); +#endif cairo_set_operator(context, CAIRO_OPERATOR_SOURCE); + +#if GTK_CHECK_VERSION (3, 0, 0) + surface = cairo_surface_create_similar(cairo_get_target(context), + CAIRO_CONTENT_COLOR_ALPHA, + windata->width, + windata->height); + cairo_set_source_surface (cr, surface, 0, 0); +#else surface = cairo_surface_create_similar(cairo_get_target(context), CAIRO_CONTENT_COLOR_ALPHA, widget->allocation.width, widget->allocation.height); cr = cairo_create(surface); +#endif fill_background(widget, windata, cr); +#if !GTK_CHECK_VERSION (3, 0, 0) cairo_destroy(cr); +#endif cairo_set_source_surface(context, surface, 0, 0); cairo_paint(context); cairo_surface_destroy(surface); @@ -224,29 +271,57 @@ configure_event_cb(GtkWidget *nw, } static gboolean -countdown_expose_cb(GtkWidget *pie, GdkEventExpose *event, +countdown_expose_cb(GtkWidget *pie, +#if GTK_CHECK_VERSION (3, 0, 0) + cairo_t *cr, +#else + GdkEventExpose *event, +#endif WindowData *windata) { cairo_t *context; cairo_surface_t *surface; +#if GTK_CHECK_VERSION (3, 0, 0) + GtkAllocation alloc; +#else cairo_t *cr; +#endif +#if GTK_CHECK_VERSION(3, 0, 0) + context = gdk_cairo_create(gtk_widget_get_window(pie)); +#else context = gdk_cairo_create(pie->window); +#endif cairo_set_operator(context, CAIRO_OPERATOR_SOURCE); +#if GTK_CHECK_VERSION (3, 0, 0) + gtk_widget_get_allocation(pie, &alloc); + surface = cairo_surface_create_similar(cairo_get_target(context), + CAIRO_CONTENT_COLOR_ALPHA, + alloc.width, + alloc.height); +#else surface = cairo_surface_create_similar(cairo_get_target(context), CAIRO_CONTENT_COLOR_ALPHA, pie->allocation.width, pie->allocation.height); +#endif cr = cairo_create(surface); +#if GTK_CHECK_VERSION(3, 0, 0) + cairo_translate (cr, -alloc.x, -alloc.y); + fill_background (pie, windata, cr); + cairo_translate (cr, alloc.x, alloc.y); +#else cairo_translate (cr, -pie->allocation.x, -pie->allocation.y); fill_background (pie, windata, cr); cairo_translate (cr, pie->allocation.x, pie->allocation.y); - +#endif draw_pie (pie, windata, cr); +#if !GTK_CHECK_VERSION(3, 0, 0) cairo_destroy(cr); +#endif cairo_set_source_surface(context, surface, 0, 0); cairo_paint(context); cairo_surface_destroy(surface); @@ -303,7 +378,11 @@ create_notification(UrlClickedCb url_clicked) GtkWidget *padding; AtkObject *atkobj; WindowData *windata; +#if GTK_CHECK_VERSION(3, 0, 0) + GdkVisual *visual; +#else GdkColormap *colormap; +#endif GdkScreen *screen; windata = g_new0(WindowData, 1); @@ -316,6 +395,16 @@ create_notification(UrlClickedCb url_clicked) windata->rtl = gtk_widget_get_default_direction(); windata->enable_transparency = FALSE; screen = gtk_window_get_screen(GTK_WINDOW(win)); +#if GTK_CHECK_VERSION(3, 0, 0) + visual = gdk_screen_get_rgba_visual(screen); + + if (visual != NULL) + { + gtk_widget_set_visual(win, visual); + if (gdk_screen_is_composited(screen)) + windata->enable_transparency = TRUE; + } +#else colormap = gdk_screen_get_rgba_colormap(screen); if (colormap != NULL) @@ -324,6 +413,7 @@ create_notification(UrlClickedCb url_clicked) if (gdk_screen_is_composited(screen)) windata->enable_transparency = TRUE; } +#endif gtk_window_set_title(GTK_WINDOW(win), "Notification"); gtk_widget_add_events(win, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); @@ -351,8 +441,13 @@ create_notification(UrlClickedCb url_clicked) gtk_widget_show(main_vbox); gtk_container_add(GTK_CONTAINER(drawbox), main_vbox); +#if GTK_CHECK_VERSION (3, 0, 0) + g_signal_connect(G_OBJECT(main_vbox), "draw", + G_CALLBACK(paint_window), windata); +#else g_signal_connect(G_OBJECT(main_vbox), "expose_event", G_CALLBACK(paint_window), windata); +#endif padding = gtk_alignment_new(0, 0, 0, 0); gtk_widget_show(padding); @@ -490,7 +585,11 @@ add_notification_action(GtkWindow *nw, const char *text, const char *key, g_assert(windata != NULL); +#if GTK_CHECK_VERSION(3, 0, 0) + if (gtk_widget_get_visible(windata->actions_box)) +#else if (!GTK_WIDGET_VISIBLE(windata->actions_box)) +#endif { GtkWidget *alignment; @@ -506,8 +605,13 @@ add_notification_action(GtkWindow *nw, const char *text, const char *key, gtk_container_add(GTK_CONTAINER(alignment), windata->pie_countdown); gtk_widget_set_size_request(windata->pie_countdown, PIE_WIDTH, PIE_HEIGHT); +#if GTK_CHECK_VERSION (3, 0, 0) + g_signal_connect(G_OBJECT(windata->pie_countdown), "draw", + G_CALLBACK(countdown_expose_cb), windata); +#else g_signal_connect(G_OBJECT(windata->pie_countdown), "expose_event", G_CALLBACK(countdown_expose_cb), windata); +#endif } button = gtk_button_new(); @@ -522,7 +626,11 @@ add_notification_action(GtkWindow *nw, const char *text, const char *key, buf = g_strdup_printf("stock_%s", key); pixbuf = gtk_icon_theme_load_icon( gtk_icon_theme_get_for_screen( +#if GTK_CHECK_VERSION(3, 0, 0) + gdk_window_get_screen(gtk_widget_get_window(GTK_WIDGET(nw)))), +#else gdk_drawable_get_screen(GTK_WIDGET(nw)->window)), +#endif buf, 16, GTK_ICON_LOOKUP_USE_BUILTIN, NULL); g_free(buf); @@ -559,7 +667,11 @@ clear_notification_actions(GtkWindow *nw) gtk_widget_hide(windata->actions_box); gtk_container_foreach(GTK_CONTAINER(windata->actions_box), +#if GTK_CHECK_VERSION (3, 0, 0) + (GtkCallback)g_object_unref, NULL); +#else (GtkCallback)gtk_object_destroy, NULL); +#endif } /* Move notification window */ diff --git a/src/themes/nodoka/nodoka-theme.c b/src/themes/nodoka/nodoka-theme.c index 9ec831f..2a0e56a 100644 --- a/src/themes/nodoka/nodoka-theme.c +++ b/src/themes/nodoka/nodoka-theme.c @@ -27,6 +27,10 @@ #include <gtk/gtk.h> +#if GTK_CHECK_VERSION(3, 0, 0) + #define GTK_WIDGET_VISIBLE(w) gtk_widget_get_visible(w) +#endif + /* Define basic nodoka types */ typedef void (*ActionInvokedCb)(GtkWindow *nw, const char *key); typedef void (*UrlClickedCb)(GtkWindow *nw, const char *url); @@ -117,8 +121,13 @@ get_notification_arrow_type(GtkWidget *nw) WindowData *windata = g_object_get_data(G_OBJECT(nw), "windata"); int screen_height; +#if GTK_CHECK_VERSION(3, 0, 0) + screen_height = gdk_screen_get_height( + gdk_window_get_screen(gtk_widget_get_window(nw))); +#else screen_height = gdk_screen_get_height( gdk_drawable_get_screen(GDK_DRAWABLE(nw->window))); +#endif if (windata->arrow.position.y + windata->height + DEFAULT_ARROW_HEIGHT > screen_height) @@ -140,21 +149,41 @@ set_arrow_parameters (WindowData *windata) int x,y; GtkArrowType arrow_type; +#if GTK_CHECK_VERSION(3, 0, 0) + screen_height = gdk_screen_get_height( + gdk_window_get_screen(gtk_widget_get_window(windata->win))); + screen_width = gdk_screen_get_width( + gdk_window_get_screen(gtk_widget_get_window(windata->win))); +#else screen_height = gdk_screen_get_height( - gdk_drawable_get_screen(GDK_DRAWABLE(windata->win->window))); + gdk_window_get_screen(GDK_DRAWABLE(windata->win->window))); screen_width = gdk_screen_get_width( - gdk_drawable_get_screen(GDK_DRAWABLE(windata->win->window))); + gdk_window_get_screen(GDK_DRAWABLE(windata->win->window))); +#endif /* Set arrow offset */ +#if GTK_CHECK_VERSION(3, 0, 0) + GtkAllocation alloc; + gtk_widget_get_allocation(windata->win, &alloc); +#endif + if ((windata->arrow.position.x - DEFAULT_ARROW_SKEW - +#if GTK_CHECK_VERSION(3, 0, 0) + DEFAULT_ARROW_OFFSET + alloc.width) > +#else DEFAULT_ARROW_OFFSET + windata->win->allocation.width) > +#endif screen_width) { windata->arrow.offset = windata->arrow.position.x - DEFAULT_ARROW_SKEW - (screen_width - +#if GTK_CHECK_VERSION(3, 0, 0) + alloc.width); +#else windata->win->allocation.width); +#endif } else if ((windata->arrow.position.x - DEFAULT_ARROW_SKEW - DEFAULT_ARROW_OFFSET < 0)) @@ -173,10 +202,19 @@ set_arrow_parameters (WindowData *windata) windata->arrow.position.x += 6; } else if (windata->arrow.offset + DEFAULT_ARROW_WIDTH + 6 > +#if GTK_CHECK_VERSION(3, 0, 0) + alloc.width) +#else windata->win->allocation.width) +#endif { +#if GTK_CHECK_VERSION(3, 0, 0) + windata->arrow.offset = alloc.width - 6 - + DEFAULT_ARROW_WIDTH; +#else windata->arrow.offset = windata->win->allocation.width - 6 - DEFAULT_ARROW_WIDTH; +#endif windata->arrow.position.x -= 6; } @@ -201,14 +239,30 @@ set_arrow_parameters (WindowData *windata) break; case GTK_ARROW_DOWN: windata->arrow.point_begin.y = +#if GTK_CHECK_VERSION(3, 0, 0) + alloc.height - +#else windata->win->allocation.height - +#endif DEFAULT_ARROW_HEIGHT; windata->arrow.point_middle.y = +#if GTK_CHECK_VERSION(3, 0, 0) + alloc.height; +#else windata->win->allocation.height; +#endif windata->arrow.point_end.y = +#if GTK_CHECK_VERSION(3, 0, 0) + alloc.height - +#else windata->win->allocation.height - +#endif DEFAULT_ARROW_HEIGHT; +#if GTK_CHECK_VERSION(3, 0, 0) + y = windata->arrow.position.y - alloc.height; +#else y = windata->arrow.position.y - windata->win->allocation.height; +#endif break; default: g_assert_not_reached(); @@ -491,12 +545,32 @@ draw_pie(GtkWidget *pie, WindowData *windata, cairo_t *cr) static gboolean paint_window(GtkWidget *widget, +#if GTK_CHECK_VERSION (3, 0, 0) + cairo_t *cr, +#else GdkEventExpose *event, +#endif WindowData *windata) { + cairo_t *context; + cairo_surface_t *surface; +#if GTK_CHECK_VERSION(3, 0, 0) + cairo_t *cr2; + GtkAllocation alloc; + + gtk_widget_get_allocation(windata->win, &alloc); +#else + cairo_t *cr; +#endif + if (windata->width == 0) { +#if GTK_CHECK_VERSION(3, 0, 0) + windata->width = alloc.width; + windata->height = alloc.height; +#else windata->width = windata->win->allocation.width; windata->height = windata->win->allocation.height; +#endif } if (windata->arrow.has_arrow) @@ -504,6 +578,28 @@ paint_window(GtkWidget *widget, if (!(windata->enable_transparency)) { +#if GTK_CHECK_VERSION (3, 0, 0) + surface = cairo_surface_create_similar (cairo_get_target (cr), + CAIRO_CONTENT_COLOR_ALPHA, + windata->width, + windata->height); + +/* + cr2 = cairo_create (surface); + /* transparent background * / + cairo_rectangle (cr2, 0, 0, windata->width, windata->height); + cairo_set_source_rgba (cr2, 0.0, 0.0, 0.0, 0.0); + cairo_fill (cr2); + cairo_destroy (cr2); +*/ + + cairo_save (cr); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_surface (cr, surface, 0, 0); + cairo_paint (cr); + cairo_restore (cr); + cairo_surface_destroy(surface); +#else GdkPixmap *mask; cairo_t *mask_cr; mask = gdk_pixmap_new (NULL, windata->width, @@ -528,26 +624,36 @@ paint_window(GtkWidget *widget, (GdkBitmap *) mask, 0,0); gdk_pixmap_unref (mask); cairo_destroy (mask_cr); +#endif } - cairo_t *context; - cairo_surface_t *surface; - cairo_t *cr; - +#if GTK_CHECK_VERSION(3, 0, 0) + context = gdk_cairo_create(gtk_widget_get_window(widget)); + gtk_widget_get_allocation(widget, &alloc); +#else context = gdk_cairo_create(widget->window); +#endif cairo_set_operator(context, CAIRO_OPERATOR_SOURCE); surface = cairo_surface_create_similar(cairo_get_target(context), CAIRO_CONTENT_COLOR_ALPHA, +#if GTK_CHECK_VERSION(3, 0, 0) + alloc.width, + alloc.height); + cairo_set_source_surface (cr, surface, 0, 0); +#else widget->allocation.width, widget->allocation.height); cr = cairo_create(surface); +#endif fill_background(widget, windata, cr); draw_border(widget, windata, cr); draw_stripe(widget, windata, cr); +#if !GTK_CHECK_VERSION (3, 0, 0) cairo_destroy(cr); +#endif cairo_set_source_surface(context, surface, 0, 0); cairo_paint(context); cairo_surface_destroy(surface); @@ -572,29 +678,58 @@ configure_event_cb(GtkWidget *nw, } static gboolean -countdown_expose_cb(GtkWidget *pie, GdkEventExpose *event, +countdown_expose_cb(GtkWidget *pie, +#if GTK_CHECK_VERSION (3, 0, 0) + cairo_t *cr, +#else + GdkEventExpose *event, +#endif WindowData *windata) { cairo_t *context; cairo_surface_t *surface; - cairo_t *cr; +#if GTK_CHECK_VERSION(3, 0, 0) + context = gdk_cairo_create(gtk_widget_get_window(pie)); + GtkAllocation alloc; + gtk_widget_get_allocation(pie, &alloc); +#else context = gdk_cairo_create(pie->window); + cairo_t *cr; +#endif cairo_set_operator(context, CAIRO_OPERATOR_SOURCE); surface = cairo_surface_create_similar(cairo_get_target(context), CAIRO_CONTENT_COLOR_ALPHA, + #if GTK_CHECK_VERSION(3, 0, 0) + alloc.width, + alloc.height); + #else pie->allocation.width, pie->allocation.height); + #endif +#if GTK_CHECK_VERSION(3, 0, 0) + cairo_set_source_surface (cr, surface, 0, 0); +#else cr = cairo_create(surface); +#endif + +#if GTK_CHECK_VERSION(3, 0, 0) + cairo_translate (cr, -alloc.x, -alloc.y); + fill_background (pie, windata, cr); + cairo_translate (cr, alloc.x, alloc.y); +#else cairo_translate (cr, -pie->allocation.x, -pie->allocation.y); fill_background (pie, windata, cr); cairo_translate (cr, pie->allocation.x, pie->allocation.y); +#endif draw_pie (pie, windata, cr); +#if !GTK_CHECK_VERSION(3, 0, 0) cairo_destroy(cr); +#endif cairo_set_source_surface(context, surface, 0, 0); cairo_paint(context); cairo_surface_destroy(surface); @@ -654,7 +789,11 @@ create_notification(UrlClickedCb url_clicked) GtkWidget *alignment; AtkObject *atkobj; WindowData *windata; +#if GTK_CHECK_VERSION(3, 0, 0) + GdkVisual *visual; +#else GdkColormap *colormap; +#endif GdkScreen *screen; windata = g_new0(WindowData, 1); @@ -666,6 +805,16 @@ create_notification(UrlClickedCb url_clicked) windata->enable_transparency = FALSE; screen = gtk_window_get_screen(GTK_WINDOW(win)); +#if GTK_CHECK_VERSION(3, 0, 0) + visual = gdk_screen_get_rgba_visual(screen); + + if (visual != NULL) + { + gtk_widget_set_visual(win, visual); + if (gdk_screen_is_composited(screen)) + windata->enable_transparency = TRUE; + } +#else colormap = gdk_screen_get_rgba_colormap(screen); if (colormap != NULL) @@ -674,6 +823,7 @@ create_notification(UrlClickedCb url_clicked) if (gdk_screen_is_composited(screen)) windata->enable_transparency = TRUE; } +#endif gtk_window_set_title(GTK_WINDOW(win), "Notification"); gtk_widget_add_events(win, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); @@ -703,8 +853,13 @@ create_notification(UrlClickedCb url_clicked) gtk_container_add(GTK_CONTAINER(drawbox), main_vbox); gtk_container_set_border_width(GTK_CONTAINER(main_vbox), 1); +#if GTK_CHECK_VERSION (3, 0, 0) + g_signal_connect(G_OBJECT(main_vbox), "draw", + G_CALLBACK(paint_window), windata); +#else g_signal_connect(G_OBJECT(main_vbox), "expose_event", G_CALLBACK(paint_window), windata); +#endif windata->top_spacer = gtk_image_new(); gtk_box_pack_start(GTK_BOX(main_vbox), windata->top_spacer, @@ -902,8 +1057,13 @@ add_notification_action(GtkWindow *nw, const char *text, const char *key, gtk_container_add(GTK_CONTAINER(alignment), windata->pie_countdown); gtk_widget_set_size_request(windata->pie_countdown, PIE_WIDTH, PIE_HEIGHT); +#if GTK_CHECK_VERSION (3, 0, 0) + g_signal_connect(G_OBJECT(windata->pie_countdown), "draw", + G_CALLBACK(countdown_expose_cb), windata); +#else g_signal_connect(G_OBJECT(windata->pie_countdown), "expose_event", G_CALLBACK(countdown_expose_cb), windata); +#endif } button = gtk_button_new(); @@ -918,7 +1078,11 @@ add_notification_action(GtkWindow *nw, const char *text, const char *key, buf = g_strdup_printf("stock_%s", key); pixbuf = gtk_icon_theme_load_icon( gtk_icon_theme_get_for_screen( +#if GTK_CHECK_VERSION(3, 0, 0) + gdk_window_get_screen(gtk_widget_get_window(GTK_WIDGET(nw)))), +#else gdk_drawable_get_screen(GTK_WIDGET(nw)->window)), +#endif buf, 16, GTK_ICON_LOOKUP_USE_BUILTIN, NULL); g_free(buf); @@ -955,7 +1119,11 @@ clear_notification_actions(GtkWindow *nw) gtk_widget_hide(windata->actions_box); gtk_container_foreach(GTK_CONTAINER(windata->actions_box), +#if GTK_CHECK_VERSION(3, 0, 0) + (GtkCallback)g_object_unref, NULL); +#else (GtkCallback)gtk_object_destroy, NULL); +#endif } /* Move notification window */ diff --git a/src/themes/slider/theme.c b/src/themes/slider/theme.c index 5f5d589..d116f05 100644 --- a/src/themes/slider/theme.c +++ b/src/themes/slider/theme.c @@ -62,6 +62,9 @@ enum { }; #define WIDTH 400 +#if GTK_CHECK_VERSION(3, 0, 0) +#define HEIGHT 100 +#endif #define DEFAULT_X0 0 #define DEFAULT_Y0 0 #define DEFAULT_RADIUS 8 @@ -74,7 +77,9 @@ enum { #define MAX_ICON_SIZE IMAGE_SIZE -#define USE_COMPOSITE +#if GTK_CHECK_VERSION(3, 0, 0) +#define GTK_WIDGET_VISIBLE(w) gtk_widget_get_visible(w) +#endif static void draw_round_rect(cairo_t* cr, gdouble aspect, gdouble x, gdouble y, gdouble corner_radius, gdouble width, gdouble height) { @@ -109,66 +114,80 @@ static void draw_round_rect(cairo_t* cr, gdouble aspect, gdouble x, gdouble y, g static void fill_background(GtkWidget* widget, WindowData* windata, cairo_t* cr) { +#if GTK_CHECK_VERSION(3, 0, 0) + GtkAllocation allocation; + GtkStyleContext *context; + GdkRGBA color; + GdkRGBA fg_color; + GdkRGBA bg_color; +#else GdkColor color; +#endif double r, g, b; - #if GTK_CHECK_VERSION(3, 0, 0) +#if GTK_CHECK_VERSION(3, 0, 0) + gtk_widget_get_allocation(widget, &allocation); + context = gtk_widget_get_style_context(widget); - GtkAllocation allocation; + draw_round_rect(cr, 1.0f, DEFAULT_X0 + 1, DEFAULT_Y0 + 1, DEFAULT_RADIUS, allocation.width - 2, allocation.height - 2); - gtk_widget_get_allocation(widget, &allocation); + gtk_style_context_get_background_color (context, GTK_STATE_FLAG_NORMAL, &bg_color); + r = bg_color.red; + g = bg_color.green; + b = bg_color.blue; + cairo_set_source_rgba(cr, r, g, b, BACKGROUND_ALPHA); + cairo_fill_preserve(cr); - draw_round_rect(cr, 1.0f, DEFAULT_X0 + 1, DEFAULT_Y0 + 1, DEFAULT_RADIUS, allocation.width - 2, allocation.height - 2); + /* Should we show urgency somehow? Probably doesn't + * have any meaningful value to the user... */ - //GdkRGBA color; + gtk_style_context_get_color (context, GTK_STATE_FLAG_NORMAL, &fg_color); - //gtk_style_context_get_background_color(); - color = widget->style->bg[GTK_STATE_NORMAL]; - 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, BACKGROUND_ALPHA); - cairo_fill_preserve(cr); + color.red = (fg_color.red + bg_color.red) / 2.0; + color.green = (fg_color.green + bg_color.green) / 2.0; + color.blue = (fg_color.blue + bg_color.blue) / 2.0; + color.alpha = (fg_color.alpha + bg_color.alpha) / 2.0; - /* Should we show urgency somehow? Probably doesn't - * have any meaningful value to the user... */ + r = color.red; + g = color.green; + b = color.blue; + cairo_set_source_rgba(cr, r, g, b, BACKGROUND_ALPHA / 2); + cairo_set_line_width(cr, 1); + cairo_stroke(cr); - color = widget->style->text_aa[GTK_STATE_NORMAL]; - 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, BACKGROUND_ALPHA / 2); - cairo_set_line_width(cr, 1); - cairo_stroke(cr); +#else - #else + draw_round_rect(cr, 1.0f, DEFAULT_X0 + 1, DEFAULT_Y0 + 1, DEFAULT_RADIUS, widget->allocation.width - 2, widget->allocation.height - 2); - draw_round_rect(cr, 1.0f, DEFAULT_X0 + 1, DEFAULT_Y0 + 1, DEFAULT_RADIUS, widget->allocation.width - 2, widget->allocation.height - 2); - - color = widget->style->bg[GTK_STATE_NORMAL]; - 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, BACKGROUND_ALPHA); - cairo_fill_preserve(cr); - - /* Should we show urgency somehow? Probably doesn't - * have any meaningful value to the user... */ - - color = widget->style->text_aa[GTK_STATE_NORMAL]; - 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, BACKGROUND_ALPHA / 2); - cairo_set_line_width(cr, 1); - cairo_stroke(cr); - #endif + color = widget->style->bg[GTK_STATE_NORMAL]; + 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, BACKGROUND_ALPHA); + cairo_fill_preserve(cr); + + /* Should we show urgency somehow? Probably doesn't + * have any meaningful value to the user... */ + + color = widget->style->text_aa[GTK_STATE_NORMAL]; + 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, BACKGROUND_ALPHA / 2); + cairo_set_line_width(cr, 1); + cairo_stroke(cr); +#endif } static void update_shape(WindowData* windata) { - GdkBitmap* mask; cairo_t* cr; +#if GTK_CHECK_VERSION (3, 0, 0) + cairo_surface_t *surface; + cairo_region_t *region; +#else + GdkBitmap* mask; +#endif if (windata->width == windata->last_width && windata->height == windata->last_height) { @@ -177,36 +196,43 @@ static void update_shape(WindowData* windata) if (windata->width == 0 || windata->height == 0) { - #if GTK_CHECK_VERSION(3, 0, 0) - +#if GTK_CHECK_VERSION(3, 0, 0) GtkAllocation allocation; gtk_widget_get_allocation(windata->win, &allocation); windata->width = MAX(allocation.width, 1); windata->height = MAX(allocation.height, 1); - #else +#else windata->width = MAX(windata->win->allocation.width, 1); windata->height = MAX(windata->win->allocation.height, 1); - #endif +#endif } if (windata->composited) { +#if GTK_CHECK_VERSION (3, 0, 0) + gtk_widget_shape_combine_region (windata->win, NULL); +#else gtk_widget_shape_combine_mask(windata->win, NULL, 0, 0); +#endif return; } windata->last_width = windata->width; windata->last_height = windata->height; +#if GTK_CHECK_VERSION (3, 0, 0) + surface = cairo_image_surface_create (CAIRO_FORMAT_A8, windata->width, windata->height); + cr = cairo_create (surface); +#else mask = (GdkBitmap*) gdk_pixmap_new(NULL, windata->width, windata->height, 1); if (mask == NULL) { return; } - cr = gdk_cairo_create(mask); +#endif if (cairo_status(cr) == CAIRO_STATUS_SUCCESS) { @@ -218,11 +244,21 @@ static void update_shape(WindowData* windata) draw_round_rect(cr, 1.0f, DEFAULT_X0, DEFAULT_Y0, DEFAULT_RADIUS, windata->width, windata->height); cairo_fill(cr); +#if GTK_CHECK_VERSION (3, 0, 0) + region = gdk_cairo_region_create_from_surface (surface); + gtk_widget_shape_combine_region (windata->win, region); + cairo_region_destroy (region); +#else gtk_widget_shape_combine_mask(windata->win, mask, 0, 0); +#endif } cairo_destroy(cr); +#if GTK_CHECK_VERSION (3, 0, 0) + cairo_surface_destroy (surface); +#else g_object_unref(mask); +#endif } static void paint_window(GtkWidget* widget, WindowData* windata) @@ -247,7 +283,11 @@ static void paint_window(GtkWidget* widget, WindowData* windata) #endif } +#if GTK_CHECK_VERSION(3, 0, 0) + context = gdk_cairo_create(gtk_widget_get_window(widget)); +#else context = gdk_cairo_create(widget->window); +#endif cairo_set_operator(context, CAIRO_OPERATOR_SOURCE); @@ -282,7 +322,11 @@ static gboolean on_window_map(GtkWidget* widget, GdkEvent* event, WindowData* wi return FALSE; } +#if GTK_CHECK_VERSION (3, 0, 0) +static gboolean on_window_draw(GtkWidget* widget, cairo_t* cr, WindowData* windata) +#else static gboolean on_window_expose(GtkWidget* widget, GdkEventExpose* event, WindowData* windata) +#endif { paint_window(widget, windata); @@ -321,7 +365,11 @@ static void on_window_realize(GtkWidget* widget, WindowData* windata) /* Nothing */ } +#if GTK_CHECK_VERSION (3, 0, 0) +static void color_reverse(const GdkRGBA* a, GdkRGBA* b) +#else static void color_reverse(const GdkColor* a, GdkColor* b) +#endif { gdouble red; gdouble green; @@ -330,9 +378,15 @@ static void color_reverse(const GdkColor* a, GdkColor* b) gdouble s; gdouble v; +#if GTK_CHECK_VERSION (3, 0, 0) + red = a->red; + green = a->green; + blue = a->blue; +#else red = (gdouble) a->red / 65535.0; green = (gdouble) a->green / 65535.0; blue = (gdouble) a->blue / 65535.0; +#endif gtk_rgb_to_hsv(red, green, blue, &h, &s, &v); @@ -353,11 +407,81 @@ static void color_reverse(const GdkColor* a, GdkColor* b) gtk_hsv_to_rgb(h, s, v, &red, &green, &blue); +#if GTK_CHECK_VERSION (3, 0, 0) + b->red = red; + b->green = green; + b->blue = blue; +#else b->red = red * 65535.0; b->green = green * 65535.0; b->blue = blue * 65535.0; +#endif +} +#if GTK_CHECK_VERSION (3, 0, 0) +static GtkStateFlags state_flags_from_type (GtkStateType state) +{ + GtkStateFlags flags; + + switch (state) + { + case GTK_STATE_NORMAL: + flags = GTK_STATE_FLAG_NORMAL; + break; + case GTK_STATE_ACTIVE: + flags = GTK_STATE_FLAG_ACTIVE; + break; + case GTK_STATE_PRELIGHT: + flags = GTK_STATE_FLAG_PRELIGHT; + break; + case GTK_STATE_SELECTED: + flags = GTK_STATE_FLAG_SELECTED; + break; + case GTK_STATE_INSENSITIVE: + flags = GTK_STATE_FLAG_INSENSITIVE; + break; + case GTK_STATE_INCONSISTENT: + flags = GTK_STATE_FLAG_INCONSISTENT; + break; + case GTK_STATE_FOCUSED: + flags = GTK_STATE_FLAG_FOCUSED; + break; + default: + g_assert_not_reached(); + } + + return flags; } +static void override_style(GtkWidget* widget) +{ + GtkStyleContext *context; + GtkStateType state; + GdkRGBA fg; + GdkRGBA bg; + GdkRGBA fg2; + GdkRGBA bg2; + + context = gtk_widget_get_style_context (widget); + + state = (GtkStateType) 0; + while (state <= GTK_STATE_FOCUSED) + { + GtkStateFlags flags; + flags = state_flags_from_type (state); + + gtk_style_context_get_color (context, flags, &fg); + gtk_style_context_get_background_color (context, flags, &bg); + + color_reverse(&fg, &fg2); + color_reverse(&bg, &bg2); + + gtk_widget_override_color (widget, flags, &fg2); + gtk_widget_override_background_color (widget, flags, &bg2); + + state++; + } +} +#else static void override_style(GtkWidget* widget, GtkStyle* previous_style) { GtkStateType state; @@ -393,7 +517,19 @@ static void override_style(GtkWidget* widget, GtkStyle* previous_style) g_object_unref(style); } +#endif + +#if GTK_CHECK_VERSION (3, 0, 0) +static void on_style_updated(GtkWidget* widget, WindowData* windata) +{ + g_signal_handlers_block_by_func(G_OBJECT(widget), on_style_updated, windata); + override_style(widget); + + gtk_widget_queue_draw(widget); + g_signal_handlers_unblock_by_func(G_OBJECT(widget), on_style_updated, windata); +} +#else static void on_style_set(GtkWidget* widget, GtkStyle* previous_style, WindowData* windata) { g_signal_handlers_block_by_func(G_OBJECT(widget), on_style_set, windata); @@ -403,6 +539,7 @@ static void on_style_set(GtkWidget* widget, GtkStyle* previous_style, WindowData g_signal_handlers_unblock_by_func(G_OBJECT(widget), on_style_set, windata); } +#endif static void on_composited_changed(GtkWidget* window, WindowData* windata) { @@ -421,10 +558,12 @@ GtkWindow* create_notification(UrlClickedCb url_clicked) AtkObject* atkobj; GtkRcStyle* rcstyle; WindowData* windata; - #ifdef USE_COMPOSITE - GdkColormap* colormap; - GdkScreen* screen; - #endif +#if GTK_CHECK_VERSION(3, 0, 0) + GdkVisual *visual; +#else + GdkColormap *colormap; +#endif + GdkScreen* screen; windata = g_new0(WindowData, 1); windata->urgency = URGENCY_NORMAL; @@ -433,31 +572,50 @@ GtkWindow* create_notification(UrlClickedCb url_clicked) win = gtk_window_new(GTK_WINDOW_POPUP); gtk_window_set_resizable(GTK_WINDOW(win), FALSE); gtk_widget_set_app_paintable(win, TRUE); +#if GTK_CHECK_VERSION (3, 0, 0) + g_signal_connect(G_OBJECT(win), "style-updated", G_CALLBACK(on_style_updated), windata); +#else g_signal_connect(G_OBJECT(win), "style-set", G_CALLBACK(on_style_set), windata); +#endif g_signal_connect(G_OBJECT(win), "map-event", G_CALLBACK(on_window_map), windata); +#if GTK_CHECK_VERSION (3, 0, 0) + g_signal_connect(G_OBJECT(win), "draw", G_CALLBACK(on_window_draw), windata); +#else g_signal_connect(G_OBJECT(win), "expose-event", G_CALLBACK(on_window_expose), windata); +#endif g_signal_connect(G_OBJECT(win), "realize", G_CALLBACK(on_window_realize), windata); windata->win = win; windata->composited = FALSE; - #ifdef USE_COMPOSITE - screen = gtk_window_get_screen(GTK_WINDOW(win)); - colormap = gdk_screen_get_rgba_colormap(screen); + screen = gtk_window_get_screen(GTK_WINDOW(win)); + +#if GTK_CHECK_VERSION(3, 0, 0) + visual = gdk_screen_get_rgba_visual(screen); + if (visual != NULL) + { + gtk_widget_set_visual(win, visual); - if (colormap != NULL) + if (gdk_screen_is_composited(screen)) { - gtk_widget_set_colormap(win, colormap); + windata->composited = TRUE; + } + } +#else + colormap = gdk_screen_get_rgba_colormap(screen); + if (colormap != NULL) + { + gtk_widget_set_colormap(win, colormap); - if (gdk_screen_is_composited(screen)) - { - windata->composited = TRUE; - } + if (gdk_screen_is_composited(screen)) + { + windata->composited = TRUE; } + } +#endif - g_signal_connect(win, "composited-changed", G_CALLBACK(on_composited_changed), windata); - #endif + g_signal_connect(win, "composited-changed", G_CALLBACK(on_composited_changed), windata); gtk_window_set_title(GTK_WINDOW(win), "Notification"); gtk_window_set_type_hint(GTK_WINDOW(win), GDK_WINDOW_TYPE_HINT_NOTIFICATION); @@ -469,7 +627,11 @@ GtkWindow* create_notification(UrlClickedCb url_clicked) g_signal_connect(G_OBJECT(win), "configure-event", G_CALLBACK(on_configure_event), windata); main_vbox = gtk_vbox_new(FALSE, 0); +#if GTK_CHECK_VERSION (3, 0, 0) + g_signal_connect(G_OBJECT(main_vbox), "style-updated", G_CALLBACK(on_style_updated), windata); +#else g_signal_connect(G_OBJECT(main_vbox), "style-set", G_CALLBACK(on_style_set), windata); +#endif gtk_widget_show(main_vbox); gtk_container_add(GTK_CONTAINER(win), main_vbox); gtk_container_set_border_width(GTK_CONTAINER(main_vbox), 12); @@ -500,7 +662,11 @@ GtkWindow* create_notification(UrlClickedCb url_clicked) gtk_box_pack_start(GTK_BOX(windata->main_hbox), alignment, FALSE, FALSE, 0); close_button = gtk_button_new(); +#if GTK_CHECK_VERSION (3, 0, 0) + g_signal_connect(G_OBJECT(close_button), "style-updated", G_CALLBACK(on_style_updated), windata); +#else g_signal_connect(G_OBJECT(close_button), "style-set", G_CALLBACK(on_style_set), windata); +#endif gtk_widget_show(close_button); windata->close_button = close_button; gtk_container_add(GTK_CONTAINER(alignment), close_button); @@ -524,7 +690,11 @@ GtkWindow* create_notification(UrlClickedCb url_clicked) /* center vbox */ windata->summary_label = gtk_label_new(NULL); +#if GTK_CHECK_VERSION (3, 0, 0) + g_signal_connect(G_OBJECT(windata->summary_label), "style-updated", G_CALLBACK(on_style_updated), windata); +#else g_signal_connect(G_OBJECT(windata->summary_label), "style-set", G_CALLBACK(on_style_set), windata); +#endif gtk_widget_show(windata->summary_label); gtk_box_pack_start(GTK_BOX(vbox), windata->summary_label, TRUE, TRUE, 0); gtk_misc_set_alignment(GTK_MISC(windata->summary_label), 0, 0); @@ -543,7 +713,11 @@ 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); +#if GTK_CHECK_VERSION (3, 0, 0) + g_signal_connect(G_OBJECT(windata->body_label), "style-updated", G_CALLBACK(on_style_updated), windata); +#else g_signal_connect(G_OBJECT(windata->body_label), "style-set", G_CALLBACK(on_style_set), windata); +#endif gtk_widget_show(windata->body_label); gtk_box_pack_start(GTK_BOX(vbox), windata->body_label, TRUE, TRUE, 0); gtk_misc_set_alignment(GTK_MISC(windata->body_label), 0, 0); @@ -733,47 +907,58 @@ void set_notification_arrow(GtkWidget* nw, gboolean visible, int x, int y) g_assert(windata != NULL); } +#if GTK_CHECK_VERSION (3, 0, 0) +static gboolean on_countdown_draw(GtkWidget* pie, cairo_t* cr, WindowData* windata) +#else static gboolean on_countdown_expose(GtkWidget* pie, GdkEventExpose* event, WindowData* windata) +#endif { +#if GTK_CHECK_VERSION (3, 0, 0) + GtkAllocation allocation; + GtkStyleContext* style; + GdkRGBA color; + GdkRGBA fg_color; +#else GtkStyle* style; + GdkColor color; + cairo_t* cr; +#endif cairo_t* context; cairo_surface_t* surface; - cairo_t* cr; - GdkColor color; double r, g, b; +#if GTK_CHECK_VERSION(3, 0, 0) + style = gtk_widget_get_style_context(windata->win); + context = gdk_cairo_create(gtk_widget_get_window(GDK_WINDOW(windata->pie_countdown))); +#else style = gtk_widget_get_style(windata->win); - - #if GTK_CHECK_VERSION(3, 0, 0) - context = gdk_cairo_create(GDK_WINDOW(windata->pie_countdown->window)); - #else - context = gdk_cairo_create(GDK_DRAWABLE(windata->pie_countdown->window)); - #endif + context = gdk_cairo_create(GDK_DRAWABLE(windata->pie_countdown->window)); +#endif cairo_set_operator(context, CAIRO_OPERATOR_SOURCE); - - #if GTK_CHECK_VERSION(3, 0, 0) - - GtkAllocation allocation; - - gtk_widget_get_allocation(pie, &allocation); - - surface = cairo_surface_create_similar(cairo_get_target(context), CAIRO_CONTENT_COLOR_ALPHA, allocation.width, allocation.height); - - #else - - surface = cairo_surface_create_similar(cairo_get_target(context), CAIRO_CONTENT_COLOR_ALPHA, pie->allocation.width, pie->allocation.height); - - #endif - +#if GTK_CHECK_VERSION(3, 0, 0) + gtk_widget_get_allocation(pie, &allocation); + surface = cairo_surface_create_similar(cairo_get_target(context), CAIRO_CONTENT_COLOR_ALPHA, allocation.width, allocation.height); + cairo_set_source_surface (cr, surface, 0, 0); +#else + surface = cairo_surface_create_similar(cairo_get_target(context), CAIRO_CONTENT_COLOR_ALPHA, pie->allocation.width, pie->allocation.height); cr = cairo_create(surface); +#endif cairo_set_operator(cr, CAIRO_OPERATOR_OVER); +#if GTK_CHECK_VERSION (3, 0, 0) + gtk_style_context_get_color (context, GTK_STATE_FLAG_NORMAL, &color); + gtk_style_context_get_background_color (context, GTK_STATE_FLAG_NORMAL, &fg_color); + r = color.red; + g = color.green; + b = color.blue; +#else color = windata->win->style->bg[GTK_STATE_NORMAL]; r = (float) color.red / 65535.0; g = (float) color.green / 65535.0; b = (float) color.blue / 65535.0; +#endif cairo_set_source_rgba(cr, r, g, b, BACKGROUND_ALPHA); cairo_paint(cr); @@ -781,7 +966,11 @@ static gboolean on_countdown_expose(GtkWidget* pie, GdkEventExpose* event, Windo { gdouble pct = (gdouble) windata->remaining / (gdouble) windata->timeout; +#if GTK_CHECK_VERSION (3, 0, 0) + gdk_cairo_set_source_rgba(cr, &fg_color); +#else gdk_cairo_set_source_color(cr, &style->fg[GTK_STATE_NORMAL]); +#endif cairo_move_to(cr, PIE_RADIUS, PIE_RADIUS); cairo_arc_negative(cr, PIE_RADIUS, PIE_RADIUS, PIE_RADIUS, -G_PI_2, -(pct * G_PI * 2) - G_PI_2); @@ -829,16 +1018,28 @@ void add_notification_action(GtkWindow* nw, const char* text, const char* key, A gtk_box_pack_end(GTK_BOX(windata->actions_box), alignment, FALSE, TRUE, 0); windata->pie_countdown = gtk_drawing_area_new(); +#if GTK_CHECK_VERSION (3, 0, 0) + g_signal_connect(G_OBJECT(windata->pie_countdown), "style-updated", G_CALLBACK(on_style_updated), windata); +#else g_signal_connect(G_OBJECT(windata->pie_countdown), "style-set", G_CALLBACK(on_style_set), windata); +#endif gtk_widget_show(windata->pie_countdown); gtk_container_add(GTK_CONTAINER(alignment), windata->pie_countdown); gtk_widget_set_size_request(windata->pie_countdown, PIE_WIDTH, PIE_HEIGHT); +#if GTK_CHECK_VERSION (3, 0, 0) + g_signal_connect(G_OBJECT(windata->pie_countdown), "draw", G_CALLBACK(on_countdown_draw), windata); +#else g_signal_connect(G_OBJECT(windata->pie_countdown), "expose_event", G_CALLBACK(on_countdown_expose), windata); +#endif } button = gtk_button_new(); +#if GTK_CHECK_VERSION (3, 0, 0) + g_signal_connect(G_OBJECT(button), "style-updated", G_CALLBACK(on_style_updated), windata); +#else g_signal_connect(G_OBJECT(button), "style-set", G_CALLBACK(on_style_set), windata); +#endif gtk_widget_show(button); gtk_box_pack_start(GTK_BOX(windata->actions_box), button, FALSE, FALSE, 0); gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); @@ -850,20 +1051,34 @@ void add_notification_action(GtkWindow* nw, const char* text, const char* key, A /* Try to be smart and find a suitable icon. */ buf = g_strdup_printf("stock_%s", key); - pixbuf = gtk_icon_theme_load_icon(gtk_icon_theme_get_for_screen(gdk_drawable_get_screen(GTK_WIDGET(nw)->window)), buf, 16, GTK_ICON_LOOKUP_USE_BUILTIN, NULL); +#if GTK_CHECK_VERSION(3, 0, 0) + pixbuf = gtk_icon_theme_load_icon(gtk_icon_theme_get_for_screen(gdk_window_get_screen(gtk_widget_get_window(GTK_WIDGET(nw)))), + buf, 16, GTK_ICON_LOOKUP_USE_BUILTIN, NULL); +#else + pixbuf = gtk_icon_theme_load_icon(gtk_icon_theme_get_for_screen(gdk_drawable_get_screen(GTK_WIDGET(nw)->window)), + buf, 16, GTK_ICON_LOOKUP_USE_BUILTIN, NULL); +#endif g_free(buf); if (pixbuf != NULL) { GtkWidget* image = gtk_image_new_from_pixbuf(pixbuf); +#if GTK_CHECK_VERSION (3, 0, 0) + g_signal_connect(G_OBJECT(image), "style-updated", G_CALLBACK(on_style_updated), windata); +#else g_signal_connect(G_OBJECT(image), "style-set", G_CALLBACK(on_style_set), windata); +#endif gtk_widget_show(image); gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0); gtk_misc_set_alignment(GTK_MISC(image), 0.5, 0.5); } label = gtk_label_new(NULL); +#if GTK_CHECK_VERSION (3, 0, 0) + g_signal_connect(G_OBJECT(label), "style-updated", G_CALLBACK(on_style_updated), windata); +#else g_signal_connect(G_OBJECT(label), "style-set", G_CALLBACK(on_style_set), windata); +#endif gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); @@ -883,7 +1098,11 @@ void clear_notification_actions(GtkWindow* nw) windata->pie_countdown = NULL; gtk_widget_hide(windata->actions_box); +#if GTK_CHECK_VERSION(3, 0, 0) + gtk_container_foreach(GTK_CONTAINER(windata->actions_box), (GtkCallback) g_object_unref, NULL); +#else gtk_container_foreach(GTK_CONTAINER(windata->actions_box), (GtkCallback) gtk_object_destroy, NULL); +#endif } void move_notification(GtkWidget* widget, int x, int y) diff --git a/src/themes/standard/theme.c b/src/themes/standard/theme.c index a767434..f7cee91 100644 --- a/src/themes/standard/theme.c +++ b/src/themes/standard/theme.c @@ -23,6 +23,10 @@ #include <gtk/gtk.h> +#if GTK_CHECK_VERSION(3, 0, 0) +#define GTK_WIDGET_VISIBLE(w) gtk_widget_get_visible(w) +#endif + typedef void (*ActionInvokedCb) (GtkWindow* nw, const char* key); typedef void (*UrlClickedCb) (GtkWindow* nw, const char* url); @@ -58,10 +62,14 @@ typedef struct { int width; int height; - GdkGC* gc; GdkPoint* border_points; size_t num_border_points; + +#if GTK_CHECK_VERSION(3, 0, 0) + cairo_region_t *window_region; +#else GdkRegion* window_region; +#endif guchar urgency; glong timeout; @@ -99,8 +107,6 @@ enum { #define BACKGROUND_OPACITY 0.92 #define BOTTOM_GRADIENT_HEIGHT 30 -#define USE_COMPOSITE - static void fill_background(GtkWidget* widget, WindowData* windata, cairo_t* cr) { GtkStyle* style; @@ -178,15 +184,30 @@ static void draw_stripe(GtkWidget* widget, WindowData* windata, cairo_t* cr) #endif style = gtk_widget_get_style(widget); + +#if GTK_CHECK_VERSION(3, 0, 0) + GtkAllocation alloc; + gtk_widget_get_allocation(windata->main_hbox, &alloc); +#endif + +#if GTK_CHECK_VERSION(3, 0, 0) + stripe_x = alloc.x + 1; +#else stripe_x = windata->main_hbox->allocation.x + 1; +#endif if (gtk_widget_get_direction(widget) == GTK_TEXT_DIR_RTL) { stripe_x = windata->width - STRIPE_WIDTH - stripe_x; } +#if GTK_CHECK_VERSION(3, 0, 0) + stripe_y = alloc.y + 1; + stripe_height = alloc.height - 2; +#else stripe_y = windata->main_hbox->allocation.y + 1; stripe_height = windata->main_hbox->allocation.height - 2; +#endif switch (windata->urgency) { @@ -232,7 +253,11 @@ static GtkArrowType get_notification_arrow_type(GtkWidget* nw) windata = g_object_get_data(G_OBJECT(nw), "windata"); +#if GTK_CHECK_VERSION(3, 0, 0) + screen = gdk_window_get_screen(GDK_WINDOW( gtk_widget_get_window(nw))); +#else screen = gdk_drawable_get_screen(GDK_DRAWABLE(nw->window)); +#endif monitor = gdk_screen_get_monitor_at_point(screen, windata->point_x, windata->point_y); gdk_screen_get_monitor_geometry(screen, monitor, &monitor_geometry); @@ -275,7 +300,11 @@ static void create_border_with_arrow(GtkWidget* nw, WindowData* windata) width = windata->width; height = windata->height; +#if GTK_CHECK_VERSION(3, 0, 0) + screen = gdk_window_get_screen(GDK_WINDOW(gtk_widget_get_window(nw))); +#else screen = gdk_drawable_get_screen(GDK_DRAWABLE(nw->window)); +#endif monitor = gdk_screen_get_monitor_at_point(screen, windata->point_x, windata->point_y); gdk_screen_get_monitor_geometry(screen, monitor, &monitor_geometry); @@ -437,7 +466,11 @@ static void create_border_with_arrow(GtkWidget* nw, WindowData* windata) g_assert(shape_points != NULL); +#if GTK_CHECK_VERSION(3, 0, 0) + /* FIXME!!! */ +#else windata->window_region = gdk_region_polygon(shape_points, windata->num_border_points, GDK_EVEN_ODD_RULE); +#endif g_free(shape_points); } @@ -460,7 +493,11 @@ static void draw_border(GtkWidget* widget, WindowData *windata, cairo_t* cr) } cairo_close_path(cr); +#if GTK_CHECK_VERSION(3, 0, 0) + /* FIXME!!! */ +#else gdk_window_shape_combine_region(windata->win->window, windata->window_region, 0, 0); +#endif g_free(windata->border_points); windata->border_points = NULL; } @@ -472,30 +509,40 @@ static void draw_border(GtkWidget* widget, WindowData *windata, cairo_t* cr) cairo_stroke(cr); } +#if GTK_CHECK_VERSION(3, 0, 0) +static gboolean paint_window(GtkWidget* widget, cairo_t* cr, WindowData* windata) +#else static gboolean paint_window(GtkWidget* widget, GdkEventExpose* event, WindowData* windata) +#endif { cairo_t* context; cairo_surface_t* surface; +#if GTK_CHECK_VERSION(3, 0, 0) + GtkAllocation allocation; +#else cairo_t* cr; +#endif - #if GTK_CHECK_VERSION(3, 0, 0) - GtkAllocation allocation; - - gtk_widget_get_allocation(windata->win, &allocation); - #endif +#if GTK_CHECK_VERSION(3, 0, 0) + gtk_widget_get_allocation(windata->win, &allocation); +#endif if (windata->width == 0) { - #if GTK_CHECK_VERSION(3, 0, 0) +#if GTK_CHECK_VERSION(3, 0, 0) windata->width = allocation.width; windata->height = allocation.height; - #else +#else windata->width = windata->win->allocation.width; windata->height = windata->win->allocation.height; - #endif +#endif } +#if GTK_CHECK_VERSION(3, 0, 0) + context = gdk_cairo_create(gtk_widget_get_window(widget)); +#else context = gdk_cairo_create(widget->window); +#endif cairo_set_operator(context, CAIRO_OPERATOR_SOURCE); @@ -507,13 +554,19 @@ static gboolean paint_window(GtkWidget* widget, GdkEventExpose* event, WindowDat surface = cairo_surface_create_similar(cairo_get_target(context), CAIRO_CONTENT_COLOR_ALPHA, widget->allocation.width, widget->allocation.height); #endif +#if GTK_CHECK_VERSION (3, 0, 0) + cairo_set_source_surface(cr, surface, 0, 0); +#else cr = cairo_create(surface); +#endif fill_background(widget, windata, cr); draw_border(widget, windata, cr); draw_stripe(widget, windata, cr); +#if !GTK_CHECK_VERSION (3, 0, 0) cairo_destroy(cr); +#endif cairo_set_source_surface(context, surface, 0, 0); cairo_paint(context); cairo_surface_destroy(surface); @@ -524,14 +577,13 @@ static gboolean paint_window(GtkWidget* widget, GdkEventExpose* event, WindowDat static void destroy_windata(WindowData* windata) { - if (windata->gc != NULL) - { - g_object_unref(G_OBJECT(windata->gc)); - } - if (windata->window_region != NULL) { +#if GTK_CHECK_VERSION (3, 0, 0) + cairo_region_destroy(windata->window_region); +#else gdk_region_destroy(windata->window_region); +#endif } g_free(windata); @@ -617,10 +669,12 @@ GtkWindow* create_notification(UrlClickedCb url_clicked) GtkRcStyle* rcstyle; WindowData* windata; - #ifdef USE_COMPOSITE - GdkColormap* colormap; - GdkScreen* screen; - #endif +#if GTK_CHECK_VERSION (3, 0, 0) + GdkVisual *visual; +#else + GdkColormap* colormap; +#endif + GdkScreen* screen; windata = g_new0(WindowData, 1); windata->urgency = URGENCY_NORMAL; @@ -631,18 +685,30 @@ GtkWindow* create_notification(UrlClickedCb url_clicked) windata->enable_transparency = FALSE; - #ifdef USE_COMPOSITE - screen = gtk_window_get_screen(GTK_WINDOW(win)); - colormap = gdk_screen_get_rgba_colormap(screen); + screen = gtk_window_get_screen(GTK_WINDOW(win)); + +#if GTK_CHECK_VERSION (3, 0, 0) + visual = gdk_screen_get_rgba_visual(screen); - if (colormap != NULL && gdk_screen_is_composited(screen)) + if (visual != NULL) + { + gtk_widget_set_visual(win, visual); + + if (gdk_screen_is_composited(screen)) { - gtk_widget_set_colormap(win, colormap); windata->enable_transparency = TRUE; } + } +#else + colormap = gdk_screen_get_rgba_colormap(screen); - #endif + if (colormap != NULL && gdk_screen_is_composited(screen)) + { + gtk_widget_set_colormap(win, colormap); + windata->enable_transparency = TRUE; + } +#endif gtk_window_set_title(GTK_WINDOW(win), "Notification"); gtk_window_set_type_hint(GTK_WINDOW(win), GDK_WINDOW_TYPE_HINT_NOTIFICATION); @@ -671,7 +737,11 @@ GtkWindow* create_notification(UrlClickedCb url_clicked) gtk_container_add(GTK_CONTAINER(drawbox), main_vbox); gtk_container_set_border_width(GTK_CONTAINER(main_vbox), 1); +#if GTK_CHECK_VERSION (3, 0, 0) + g_signal_connect(G_OBJECT(main_vbox), "draw", G_CALLBACK(paint_window), windata); +#else g_signal_connect(G_OBJECT(main_vbox), "expose_event", G_CALLBACK(paint_window), windata); +#endif windata->top_spacer = gtk_image_new(); gtk_box_pack_start(GTK_BOX(main_vbox), windata->top_spacer, FALSE, FALSE, 0); @@ -720,7 +790,11 @@ GtkWindow* create_notification(UrlClickedCb url_clicked) gtk_button_set_relief(GTK_BUTTON(close_button), GTK_RELIEF_NONE); gtk_container_set_border_width(GTK_CONTAINER(close_button), 0); //gtk_widget_set_size_request(close_button, 20, 20); +#if GTK_CHECK_VERSION(3, 0, 0) + g_signal_connect_swapped(G_OBJECT(close_button), "clicked", G_CALLBACK(g_object_unref), win); +#else g_signal_connect_swapped(G_OBJECT(close_button), "clicked", G_CALLBACK(gtk_widget_destroy), win); +#endif rcstyle = gtk_rc_style_new(); rcstyle->xthickness = rcstyle->ythickness = 0; @@ -897,18 +971,33 @@ void set_notification_arrow(GtkWidget* nw, gboolean visible, int x, int y) update_spacers(nw); } +#if GTK_CHECK_VERSION (3, 0, 0) +static gboolean countdown_draw_cb(GtkWidget* pie, cairo_t* cr, WindowData* windata) +#else static gboolean countdown_expose_cb(GtkWidget* pie, GdkEventExpose* event, WindowData* windata) +#endif { GtkStyle* style; cairo_t* context; cairo_surface_t* surface; +#if !GTK_CHECK_VERSION(3, 0, 0) cairo_t* cr; +#endif style = gtk_widget_get_style(windata->win); +#if GTK_CHECK_VERSION(3, 0, 0) + context = gdk_cairo_create(GTK_WINDOW(gtk_widget_get_window(windata->pie_countdown))); + GtkAllocation alloc; + gtk_widget_get_allocation(pie, &alloc); + cairo_set_operator(context, CAIRO_OPERATOR_SOURCE); + surface = cairo_surface_create_similar(cairo_get_target(context), CAIRO_CONTENT_COLOR_ALPHA, alloc.width, alloc.height); + cairo_set_source_surface(cr, surface, 0, 0); +#else context = gdk_cairo_create(GDK_DRAWABLE(windata->pie_countdown->window)); cairo_set_operator(context, CAIRO_OPERATOR_SOURCE); surface = cairo_surface_create_similar(cairo_get_target(context), CAIRO_CONTENT_COLOR_ALPHA, pie->allocation.width, pie->allocation.height); cr = cairo_create(surface); +#endif fill_background(pie, windata, cr); @@ -924,7 +1013,9 @@ static gboolean countdown_expose_cb(GtkWidget* pie, GdkEventExpose* event, Windo cairo_fill(cr); } +#if !GTK_CHECK_VERSION (3, 0, 0) cairo_destroy(cr); +#endif cairo_set_source_surface(context, surface, 0, 0); cairo_paint(context); cairo_surface_destroy(surface); @@ -970,7 +1061,11 @@ void add_notification_action(GtkWindow* nw, const char* text, const char* key, A gtk_widget_show(windata->pie_countdown); gtk_container_add(GTK_CONTAINER(alignment), windata->pie_countdown); gtk_widget_set_size_request(windata->pie_countdown, PIE_WIDTH, PIE_HEIGHT); +#if GTK_CHECK_VERSION (3, 0, 0) + g_signal_connect(G_OBJECT(windata->pie_countdown), "draw", G_CALLBACK(countdown_draw_cb), windata); +#else g_signal_connect(G_OBJECT(windata->pie_countdown), "expose_event", G_CALLBACK(countdown_expose_cb), windata); +#endif } button = gtk_button_new(); @@ -983,7 +1078,13 @@ void add_notification_action(GtkWindow* nw, const char* text, const char* key, A /* Try to be smart and find a suitable icon. */ buf = g_strdup_printf("stock_%s", key); - pixbuf = gtk_icon_theme_load_icon(gtk_icon_theme_get_for_screen(gdk_drawable_get_screen(GTK_WIDGET(nw)->window)), buf, 16, GTK_ICON_LOOKUP_USE_BUILTIN, NULL); +#if GTK_CHECK_VERSION(3, 0, 0) + pixbuf = gtk_icon_theme_load_icon(gtk_icon_theme_get_for_screen(gdk_window_get_screen(gtk_widget_get_window(GTK_WIDGET(nw)))), + buf, 16, GTK_ICON_LOOKUP_USE_BUILTIN, NULL); +#else + pixbuf = gtk_icon_theme_load_icon(gtk_icon_theme_get_for_screen(gdk_drawable_get_screen(GTK_WIDGET(nw)->window)), + buf, 16, GTK_ICON_LOOKUP_USE_BUILTIN, NULL); +#endif g_free(buf); if (pixbuf != NULL) @@ -1014,7 +1115,11 @@ void clear_notification_actions(GtkWindow* nw) windata->pie_countdown = NULL; gtk_widget_hide(windata->actions_box); +#if GTK_CHECK_VERSION(3, 0, 0) + gtk_container_foreach(GTK_CONTAINER(windata->actions_box), (GtkCallback) g_object_unref, NULL); +#else gtk_container_foreach(GTK_CONTAINER(windata->actions_box), (GtkCallback) gtk_object_destroy, NULL); +#endif } void move_notification(GtkWidget* nw, int x, int y) |