+static void
+gtk_tray_icon_get_colors_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->colors_atom,
+ 0, G_MAXLONG, FALSE,
+ XA_CARDINAL,
+ &type, &format, &nitems,
+ &bytes_after, &(prop.prop_ch));
+ error = gdk_error_trap_pop ();
+
+ if (error || result != Success)
+ return;
+
+ if (type == XA_CARDINAL && nitems == 12 && format == 32)
+ {
+ GdkRGBA color;
+
+ g_object_freeze_notify (G_OBJECT (icon));
+
+ color.red = prop.prop[0] / 65535.0;
+ color.green = prop.prop[1] / 65535.0;
+ color.blue = prop.prop[2] / 65535.0;
+
+ 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] / 65535.0;
+ color.green = prop.prop[4] / 65535.0;
+ color.blue = prop.prop[5] / 65535.0;
+
+ if (!gdk_rgba_equal (&icon->priv->error_color, &color))
+ {
+ icon->priv->error_color = color;
+
+ g_object_notify (G_OBJECT (icon), "error-color");
+ }
+
+ color.red = prop.prop[6] / 65535.0;
+ color.green = prop.prop[7] / 65535.0;
+ color.blue = prop.prop[8] / 65535.0;
+
+ if (!gdk_rgba_equal (&icon->priv->warning_color, &color))
+ {
+ icon->priv->warning_color = color;
+
+ g_object_notify (G_OBJECT (icon), "warning-color");
+ }
+
+ color.red = prop.prop[9] / 65535.0;
+ color.green = prop.prop[10] / 65535.0;
+ color.blue = prop.prop[11] / 65535.0;
+
+ if (!gdk_rgba_equal (&icon->priv->success_color, &color))
+ {
+ icon->priv->success_color = color;
+
+ g_object_notify (G_OBJECT (icon), "success-color");
+ }
+
+ g_object_thaw_notify (G_OBJECT (icon));
+ }
+
+ if (type != None)
+ XFree (prop.prop);
+}
+
+static void
+gtk_tray_icon_get_padding_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->padding_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 padding;
+
+ padding = prop.prop[0];
+
+ if (icon->priv->padding != padding)
+ {
+ icon->priv->padding = padding;
+
+ g_object_notify (G_OBJECT (icon), "padding");
+ }
+ }
+
+ if (type != None)
+ 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);
+}
+