X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtktrayicon-x11.c;h=8295161d7758e11fce46bb9e8e4a9710c07302f5;hb=HEAD;hp=ae426b3765541a8fbce2099d24c0407d5863a863;hpb=a4d4b54a7dab25b7ca894a90f89064400137718b;p=~andy%2Fgtk diff --git a/gtk/gtktrayicon-x11.c b/gtk/gtktrayicon-x11.c index ae426b376..8295161d7 100644 --- a/gtk/gtktrayicon-x11.c +++ b/gtk/gtktrayicon-x11.c @@ -12,9 +12,7 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library. If not, see . */ /* @@ -23,16 +21,20 @@ */ #include "config.h" + +#include #include +#include "x11/gdkx.h" +#include +#include + #include "gtkintl.h" #include "gtkprivate.h" #include "gtktrayicon.h" - -#include "gtkalias.h" - -#include "x11/gdkx.h" -#include +#include "gtktestutils.h" +#include "gtkdebug.h" +#include "gtktypebuiltins.h" #define SYSTEM_TRAY_REQUEST_DOCK 0 #define SYSTEM_TRAY_BEGIN_MESSAGE 1 @@ -48,7 +50,8 @@ enum { PROP_ERROR_COLOR, PROP_WARNING_COLOR, PROP_SUCCESS_COLOR, - PROP_PADDING + PROP_PADDING, + PROP_ICON_SIZE }; struct _GtkTrayIconPrivate @@ -62,16 +65,18 @@ struct _GtkTrayIconPrivate Atom visual_atom; Atom colors_atom; Atom padding_atom; + Atom icon_size_atom; Window manager_window; GdkVisual *manager_visual; gboolean manager_visual_rgba; GtkOrientation orientation; - GdkColor fg_color; - GdkColor error_color; - GdkColor warning_color; - GdkColor success_color; + GdkRGBA fg_color; + GdkRGBA error_color; + GdkRGBA warning_color; + GdkRGBA success_color; gint padding; + gint icon_size; }; static void gtk_tray_icon_constructed (GObject *object); @@ -83,12 +88,11 @@ static void gtk_tray_icon_get_property (GObject *object, GParamSpec *pspec); static void gtk_tray_icon_realize (GtkWidget *widget); -static void gtk_tray_icon_style_set (GtkWidget *widget, - GtkStyle *previous_style); +static void gtk_tray_icon_style_updated (GtkWidget *widget); static gboolean gtk_tray_icon_delete (GtkWidget *widget, GdkEventAny *event); -static gboolean gtk_tray_icon_expose (GtkWidget *widget, - GdkEventExpose *event); +static gboolean gtk_tray_icon_draw (GtkWidget *widget, + cairo_t *cr); static void gtk_tray_icon_clear_manager_window (GtkTrayIcon *icon); static void gtk_tray_icon_update_manager_window (GtkTrayIcon *icon); @@ -112,9 +116,9 @@ gtk_tray_icon_class_init (GtkTrayIconClass *class) gobject_class->dispose = gtk_tray_icon_dispose; widget_class->realize = gtk_tray_icon_realize; - widget_class->style_set = gtk_tray_icon_style_set; + widget_class->style_updated = gtk_tray_icon_style_updated; widget_class->delete_event = gtk_tray_icon_delete; - widget_class->expose_event = gtk_tray_icon_expose; + widget_class->draw = gtk_tray_icon_draw; g_object_class_install_property (gobject_class, PROP_ORIENTATION, @@ -130,7 +134,7 @@ gtk_tray_icon_class_init (GtkTrayIconClass *class) g_param_spec_boxed ("fg-color", P_("Foreground color"), P_("Foreground color for symbolic icons"), - GDK_TYPE_COLOR, + GDK_TYPE_RGBA, GTK_PARAM_READABLE)); g_object_class_install_property (gobject_class, @@ -138,7 +142,7 @@ gtk_tray_icon_class_init (GtkTrayIconClass *class) g_param_spec_boxed ("error-color", P_("Error color"), P_("Error color for symbolic icons"), - GDK_TYPE_COLOR, + GDK_TYPE_RGBA, GTK_PARAM_READABLE)); g_object_class_install_property (gobject_class, @@ -146,7 +150,7 @@ gtk_tray_icon_class_init (GtkTrayIconClass *class) g_param_spec_boxed ("warning-color", P_("Warning color"), P_("Warning color for symbolic icons"), - GDK_TYPE_COLOR, + GDK_TYPE_RGBA, GTK_PARAM_READABLE)); g_object_class_install_property (gobject_class, @@ -154,7 +158,7 @@ gtk_tray_icon_class_init (GtkTrayIconClass *class) g_param_spec_boxed ("success-color", P_("Success color"), P_("Success color for symbolic icons"), - GDK_TYPE_COLOR, + GDK_TYPE_RGBA, GTK_PARAM_READABLE)); g_object_class_install_property (gobject_class, @@ -167,6 +171,16 @@ gtk_tray_icon_class_init (GtkTrayIconClass *class) 0, GTK_PARAM_READABLE)); + g_object_class_install_property (gobject_class, + PROP_ICON_SIZE, + g_param_spec_int ("icon-size", + P_("Icon Size"), + P_("The pixel size that icons should be forced to, or zero"), + 0, + G_MAXINT, + 0, + GTK_PARAM_READABLE)); + g_type_class_add_private (class, sizeof (GtkTrayIconPrivate)); } @@ -178,19 +192,24 @@ gtk_tray_icon_init (GtkTrayIcon *icon) icon->priv->stamp = 1; icon->priv->orientation = GTK_ORIENTATION_HORIZONTAL; - icon->priv->fg_color.red = 0x0000; - icon->priv->fg_color.green = 0x0000; - icon->priv->fg_color.blue = 0x0000; - icon->priv->error_color.red = 0xcc00; - icon->priv->error_color.green = 0x0000; - icon->priv->error_color.blue = 0x0000; - icon->priv->warning_color.red = 0xf500; - icon->priv->warning_color.green = 0x7900; - icon->priv->warning_color.blue = 0x3e00; - icon->priv->success_color.red = 0x4e00; - icon->priv->success_color.green = 0x9a00; - icon->priv->success_color.blue = 0x0600; + icon->priv->fg_color.red = 0.0; + icon->priv->fg_color.green = 0.0; + icon->priv->fg_color.blue = 0.0; + icon->priv->fg_color.alpha = 1.0; + icon->priv->error_color.red = 0.7968; + icon->priv->error_color.green = 0.0; + icon->priv->error_color.blue = 0.0; + icon->priv->error_color.alpha = 1.0; + icon->priv->warning_color.red = 0.9570; + icon->priv->warning_color.green = 0.4726; + icon->priv->warning_color.blue = 0.2421; + icon->priv->warning_color.alpha = 1.0; + icon->priv->success_color.red = 0.3047; + icon->priv->success_color.green = 0.6016; + icon->priv->success_color.blue = 0.0234; + icon->priv->success_color.alpha = 1.0; icon->priv->padding = 0; + icon->priv->icon_size = 0; gtk_widget_set_app_paintable (GTK_WIDGET (icon), TRUE); gtk_widget_add_events (GTK_WIDGET (icon), GDK_PROPERTY_CHANGE_MASK); @@ -236,6 +255,10 @@ gtk_tray_icon_constructed (GObject *object) "_NET_SYSTEM_TRAY_PADDING", False); + icon->priv->icon_size_atom = XInternAtom (xdisplay, + "_NET_SYSTEM_TRAY_ICON_SIZE", + False); + /* Add a root window filter so that we get changes on MANAGER */ gdk_window_add_filter (root_window, gtk_tray_icon_manager_filter, icon); @@ -252,8 +275,8 @@ gtk_tray_icon_clear_manager_window (GtkTrayIcon *icon) { GdkWindow *gdkwin; - gdkwin = gdk_window_lookup_for_display (display, - icon->priv->manager_window); + gdkwin = gdk_x11_window_lookup_for_display (display, + icon->priv->manager_window); gdk_window_remove_filter (gdkwin, gtk_tray_icon_manager_filter, icon); @@ -272,6 +295,8 @@ gtk_tray_icon_dispose (GObject *object) gtk_tray_icon_clear_manager_window (icon); gdk_window_remove_filter (root_window, gtk_tray_icon_manager_filter, icon); + + G_OBJECT_CLASS (gtk_tray_icon_parent_class)->dispose (object); } static void @@ -302,6 +327,9 @@ gtk_tray_icon_get_property (GObject *object, case PROP_PADDING: g_value_set_int (value, icon->priv->padding); break; + case PROP_ICON_SIZE: + g_value_set_int (value, icon->priv->icon_size); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -309,49 +337,64 @@ gtk_tray_icon_get_property (GObject *object, } static gboolean -gtk_tray_icon_expose (GtkWidget *widget, - GdkEventExpose *event) +gtk_tray_icon_draw (GtkWidget *widget, + cairo_t *cr) { GtkTrayIcon *icon = GTK_TRAY_ICON (widget); GtkWidget *focus_child; - gint border_width, x, y, width, height; + GdkWindow *window; + gint border_width; gboolean retval = FALSE; + cairo_surface_t *target; - if (icon->priv->manager_visual_rgba) + window = gtk_widget_get_window (widget); + target = cairo_get_group_target (cr); + + if (icon->priv->manager_visual_rgba || + cairo_surface_get_type (target) != CAIRO_SURFACE_TYPE_XLIB || + cairo_xlib_surface_get_drawable (target) != GDK_WINDOW_XID (window)) { /* Clear to transparent */ - cairo_t *cr = gdk_cairo_create (widget->window); cairo_set_source_rgba (cr, 0, 0, 0, 0); cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); - gdk_cairo_region (cr, event->region); - cairo_fill (cr); - cairo_destroy (cr); + cairo_paint (cr); } else { - /* Clear to parent-relative pixmap */ - gdk_window_clear_area (widget->window, event->area.x, event->area.y, - event->area.width, event->area.height); + GdkRectangle clip; + + if (gdk_cairo_get_clip_rectangle (cr, &clip)) + { + /* Clear to parent-relative pixmap + * We need to use direct X access here because GDK doesn't know about + * the parent realtive pixmap. */ + cairo_surface_flush (target); + + XClearArea (GDK_WINDOW_XDISPLAY (window), + GDK_WINDOW_XID (window), + clip.x, clip.y, + clip.width, clip.height, + False); + cairo_surface_mark_dirty_rectangle (target, + clip.x, clip.y, + clip.width, clip.height); + } } - if (GTK_WIDGET_CLASS (gtk_tray_icon_parent_class)->expose_event) - retval = GTK_WIDGET_CLASS (gtk_tray_icon_parent_class)->expose_event (widget, event); + if (GTK_WIDGET_CLASS (gtk_tray_icon_parent_class)->draw) + retval = GTK_WIDGET_CLASS (gtk_tray_icon_parent_class)->draw (widget, cr); - focus_child = GTK_CONTAINER (widget)->focus_child; - if (focus_child && gtk_widget_has_focus (focus_child)) + focus_child = gtk_container_get_focus_child (GTK_CONTAINER (widget)); + if (focus_child && gtk_widget_has_visible_focus (focus_child)) { - border_width = GTK_CONTAINER (widget)->border_width; + GtkStyleContext *context; - x = widget->allocation.x + border_width; - y = widget->allocation.y + border_width; + border_width = gtk_container_get_border_width (GTK_CONTAINER (widget)); + context = gtk_widget_get_style_context (widget); - width = widget->allocation.width - 2 * border_width; - height = widget->allocation.height - 2 * border_width; - - gtk_paint_focus (widget->style, widget->window, - gtk_widget_get_state (widget), - &event->area, widget, "tray_icon", - x, y, width, height); + gtk_render_focus (context, cr, border_width, border_width, + gtk_widget_get_allocated_width (widget) - 2 * border_width, + gtk_widget_get_allocated_height (widget) - 2 * border_width); } return retval; @@ -426,7 +469,6 @@ gtk_tray_icon_get_visual_property (GtkTrayIcon *icon) gulong nitems; gulong bytes_after; int error, result; - GdkVisual *visual; g_assert (icon->priv->manager_window != None); @@ -441,21 +483,31 @@ gtk_tray_icon_get_visual_property (GtkTrayIcon *icon) &bytes_after, &(prop.prop_ch)); error = gdk_error_trap_pop (); - visual = NULL; - if (!error && result == Success && type == XA_VISUALID && nitems == 1 && format == 32) { - VisualID visual_id = prop.prop[0]; + VisualID visual_id; + GdkVisual *visual; + gint red_prec, green_prec, blue_prec; + + visual_id = prop.prop[0]; visual = gdk_x11_screen_lookup_visual (screen, visual_id); + gdk_visual_get_red_pixel_details (visual, NULL, NULL, &red_prec); + gdk_visual_get_green_pixel_details (visual, NULL, NULL, &green_prec); + gdk_visual_get_blue_pixel_details (visual, NULL, NULL, &blue_prec); + icon->priv->manager_visual = visual; + icon->priv->manager_visual_rgba = + (red_prec + blue_prec + green_prec < gdk_visual_get_depth (visual)); + } + else + { + icon->priv->manager_visual = NULL; + icon->priv->manager_visual_rgba = FALSE; } - icon->priv->manager_visual = visual; - icon->priv->manager_visual_rgba = visual != NULL && - (visual->red_prec + visual->blue_prec + visual->green_prec < visual->depth); - - /* For the background-relative hack we use when we aren't using a real RGBA - * visual, we can't be double-buffered */ + /* For the background-relative hack we use when we aren't + * using a real RGBA visual, we can't be double-buffered + */ gtk_widget_set_double_buffered (GTK_WIDGET (icon), icon->priv->manager_visual_rgba); if (type != None) @@ -497,52 +549,48 @@ gtk_tray_icon_get_colors_property (GtkTrayIcon *icon) if (type == XA_CARDINAL && nitems == 12 && format == 32) { - GdkColor color; + GdkRGBA color; g_object_freeze_notify (G_OBJECT (icon)); - color.red = prop.prop[0]; - color.green = prop.prop[1]; - color.blue = prop.prop[2]; + color.red = prop.prop[0] / 65535.0; + color.green = prop.prop[1] / 65535.0; + color.blue = prop.prop[2] / 65535.0; - if (!gdk_color_equal (&icon->priv->fg_color, &color)) + if (!gdk_rgba_equal (&icon->priv->fg_color, &color)) { icon->priv->fg_color = color; g_object_notify (G_OBJECT (icon), "fg-color"); } - color.red = prop.prop[3]; - color.green = prop.prop[4]; - color.blue = prop.prop[5]; + color.red = prop.prop[3] / 65535.0; + color.green = prop.prop[4] / 65535.0; + color.blue = prop.prop[5] / 65535.0; - if (!gdk_color_equal (&icon->priv->error_color, &color)) + if (!gdk_rgba_equal (&icon->priv->error_color, &color)) { icon->priv->error_color = color; g_object_notify (G_OBJECT (icon), "error-color"); } - g_object_thaw_notify (G_OBJECT (icon)); + color.red = prop.prop[6] / 65535.0; + color.green = prop.prop[7] / 65535.0; + color.blue = prop.prop[8] / 65535.0; - color.red = prop.prop[6]; - color.green = prop.prop[7]; - color.blue = prop.prop[8]; - - if (!gdk_color_equal (&icon->priv->warning_color, &color)) + if (!gdk_rgba_equal (&icon->priv->warning_color, &color)) { icon->priv->warning_color = color; g_object_notify (G_OBJECT (icon), "warning-color"); } - g_object_thaw_notify (G_OBJECT (icon)); - - color.red = prop.prop[9]; - color.green = prop.prop[10]; - color.blue = prop.prop[11]; + color.red = prop.prop[9] / 65535.0; + color.green = prop.prop[10] / 65535.0; + color.blue = prop.prop[11] / 65535.0; - if (!gdk_color_equal (&icon->priv->success_color, &color)) + if (!gdk_rgba_equal (&icon->priv->success_color, &color)) { icon->priv->success_color = color; @@ -605,6 +653,55 @@ gtk_tray_icon_get_padding_property (GtkTrayIcon *icon) XFree (prop.prop); } +static void +gtk_tray_icon_get_icon_size_property (GtkTrayIcon *icon) +{ + GdkScreen *screen = gtk_widget_get_screen (GTK_WIDGET (icon)); + GdkDisplay *display = gdk_screen_get_display (screen); + Display *xdisplay = GDK_DISPLAY_XDISPLAY (display); + + Atom type; + int format; + union { + gulong *prop; + guchar *prop_ch; + } prop = { NULL }; + gulong nitems; + gulong bytes_after; + int error, result; + + g_assert (icon->priv->manager_window != None); + + gdk_error_trap_push (); + type = None; + result = XGetWindowProperty (xdisplay, + icon->priv->manager_window, + icon->priv->icon_size_atom, + 0, G_MAXLONG, FALSE, + XA_CARDINAL, + &type, &format, &nitems, + &bytes_after, &(prop.prop_ch)); + error = gdk_error_trap_pop (); + + if (!error && result == Success && + type == XA_CARDINAL && nitems == 1 && format == 32) + { + gint icon_size; + + icon_size = prop.prop[0]; + + if (icon->priv->icon_size != icon_size) + { + icon->priv->icon_size = icon_size; + + g_object_notify (G_OBJECT (icon), "icon-size"); + } + } + + if (type != None) + XFree (prop.prop); +} + static GdkFilterReturn gtk_tray_icon_manager_filter (GdkXEvent *xevent, GdkEvent *event, @@ -645,6 +742,11 @@ gtk_tray_icon_manager_filter (GdkXEvent *xevent, { gtk_tray_icon_get_padding_property (icon); } + else if (xev->xany.type == PropertyNotify && + xev->xproperty.atom == icon->priv->icon_size_atom) + { + gtk_tray_icon_get_icon_size_property (icon); + } else if (xev->xany.type == DestroyNotify) { GTK_NOTE (PLUGSOCKET, @@ -653,8 +755,10 @@ gtk_tray_icon_manager_filter (GdkXEvent *xevent, gtk_tray_icon_manager_window_destroyed (icon); } else - GTK_NOTE (PLUGSOCKET, - g_print ("GtkStatusIcon %p: got other message on manager window\n", icon)); + { + GTK_NOTE (PLUGSOCKET, + g_print ("GtkStatusIcon %p: got other message on manager window\n", icon)); + } } return GDK_FILTER_CONTINUE; @@ -668,27 +772,29 @@ gtk_tray_icon_send_manager_message (GtkTrayIcon *icon, long data2, long data3) { + GtkWidget *widget; XClientMessageEvent ev; Display *display; - + + widget = GTK_WIDGET (icon); + memset (&ev, 0, sizeof (ev)); ev.type = ClientMessage; ev.window = window; ev.message_type = icon->priv->system_tray_opcode_atom; ev.format = 32; - ev.data.l[0] = gdk_x11_get_server_time (GTK_WIDGET (icon)->window); + ev.data.l[0] = gdk_x11_get_server_time (gtk_widget_get_window (widget)); ev.data.l[1] = message; ev.data.l[2] = data1; ev.data.l[3] = data2; ev.data.l[4] = data3; - display = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon))); - + display = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (widget)); + gdk_error_trap_push (); XSendEvent (display, icon->priv->manager_window, False, NoEventMask, (XEvent *)&ev); - gdk_display_sync (gtk_widget_get_display (GTK_WIDGET (icon))); - gdk_error_trap_pop (); + gdk_error_trap_pop_ignored (); } static void @@ -740,18 +846,19 @@ gtk_tray_icon_update_manager_window (GtkTrayIcon *icon) GdkWindow *gdkwin; GTK_NOTE (PLUGSOCKET, - g_print ("GtkStatusIcon %p: is being managed by window %lx\n", - icon, (gulong) icon->priv->manager_window)); + g_print ("GtkStatusIcon %p: is being managed by window %lx\n", + icon, (gulong) icon->priv->manager_window)); + + gdkwin = gdk_x11_window_lookup_for_display (display, + icon->priv->manager_window); - gdkwin = gdk_window_lookup_for_display (display, - icon->priv->manager_window); - gdk_window_add_filter (gdkwin, gtk_tray_icon_manager_filter, icon); gtk_tray_icon_get_orientation_property (icon); gtk_tray_icon_get_visual_property (icon); gtk_tray_icon_get_colors_property (icon); gtk_tray_icon_get_padding_property (icon); + gtk_tray_icon_get_icon_size_property (icon); if (gtk_widget_get_realized (GTK_WIDGET (icon))) { @@ -774,8 +881,10 @@ gtk_tray_icon_update_manager_window (GtkTrayIcon *icon) } } else - GTK_NOTE (PLUGSOCKET, - g_print ("GtkStatusIcon %p: no tray manager found\n", icon)); + { + GTK_NOTE (PLUGSOCKET, + g_print ("GtkStatusIcon %p: no tray manager found\n", icon)); + } } static void @@ -815,73 +924,60 @@ gtk_tray_icon_delete (GtkWidget *widget, } static void -gtk_tray_icon_set_colormap (GtkTrayIcon *icon) +gtk_tray_icon_set_visual (GtkTrayIcon *icon) { GdkScreen *screen = gtk_widget_get_screen (GTK_WIDGET (icon)); - GdkColormap *colormap; GdkVisual *visual = icon->priv->manager_visual; - gboolean new_colormap = FALSE; /* To avoid uncertainty about colormaps, _NET_SYSTEM_TRAY_VISUAL is supposed * to be either the screen default visual or a TrueColor visual; ignore it * if it is something else */ - if (visual && visual->type != GDK_VISUAL_TRUE_COLOR) + if (visual && gdk_visual_get_visual_type (visual) != GDK_VISUAL_TRUE_COLOR) visual = NULL; - if (visual == NULL || visual == gdk_screen_get_system_visual (screen)) - colormap = gdk_screen_get_system_colormap (screen); - else if (visual == gdk_screen_get_rgb_visual (screen)) - colormap = gdk_screen_get_rgb_colormap (screen); - else if (visual == gdk_screen_get_rgba_visual (screen)) - colormap = gdk_screen_get_rgba_colormap (screen); - else - { - colormap = gdk_colormap_new (visual, FALSE); - new_colormap = TRUE; - } - - gtk_widget_set_colormap (GTK_WIDGET (icon), colormap); + if (visual == NULL) + visual = gdk_screen_get_system_visual (screen); - if (new_colormap) - g_object_unref (colormap); + gtk_widget_set_visual (GTK_WIDGET (icon), visual); } static void gtk_tray_icon_realize (GtkWidget *widget) { GtkTrayIcon *icon = GTK_TRAY_ICON (widget); + GdkWindow *window; - /* Set our colormap before realizing */ - gtk_tray_icon_set_colormap (icon); + /* Set our visual before realizing */ + gtk_tray_icon_set_visual (icon); GTK_WIDGET_CLASS (gtk_tray_icon_parent_class)->realize (widget); + window = gtk_widget_get_window (widget); if (icon->priv->manager_visual_rgba) { /* Set a transparent background */ - GdkColor transparent = { 0, 0, 0, 0 }; /* Only pixel=0 matters */ - gdk_window_set_background (widget->window, &transparent); + GdkRGBA transparent = { 0.0, 0.0, 0.0, 0.0 }; + gdk_window_set_background_rgba (window, &transparent); } else { /* Set a parent-relative background pixmap */ - gdk_window_set_back_pixmap (widget->window, NULL, TRUE); + gdk_window_set_background_pattern (window, NULL); } GTK_NOTE (PLUGSOCKET, g_print ("GtkStatusIcon %p: realized, window: %lx, socket window: %lx\n", widget, - (gulong) GDK_WINDOW_XWINDOW (widget->window), - GTK_PLUG (icon)->socket_window ? - (gulong) GDK_WINDOW_XWINDOW (GTK_PLUG (icon)->socket_window) : 0UL)); + (gulong) GDK_WINDOW_XID (window), + gtk_plug_get_socket_window (GTK_PLUG (icon)) ? + (gulong) GDK_WINDOW_XID (gtk_plug_get_socket_window (GTK_PLUG (icon))) : 0UL)); if (icon->priv->manager_window != None) gtk_tray_icon_send_dock_request (icon); } static void -gtk_tray_icon_style_set (GtkWidget *widget, - GtkStyle *previous_style) +gtk_tray_icon_style_updated (GtkWidget *widget) { /* The default handler resets the background according to the style. We either * use a transparent background or a parent-relative background and ignore the @@ -944,8 +1040,7 @@ _gtk_tray_icon_send_message (GtkTrayIcon *icon, icon->priv->manager_window, False, StructureNotifyMask, (XEvent *)&ev); } - gdk_display_sync (gtk_widget_get_display (GTK_WIDGET (icon))); - gdk_error_trap_pop (); + gdk_error_trap_pop_ignored (); return stamp; } @@ -998,6 +1093,10 @@ _gtk_tray_icon_get_padding (GtkTrayIcon *icon) return icon->priv->padding; } -#define __GTK_TRAY_ICON_X11_C__ -#include "gtkaliasdef.c" +gint +_gtk_tray_icon_get_icon_size (GtkTrayIcon *icon) +{ + g_return_val_if_fail (GTK_IS_TRAY_ICON (icon), 0); + return icon->priv->icon_size; +}