summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--gtk/gtkplug-x11.c8
-rw-r--r--gtk/gtkplug.c44
-rwxr-xr-xgtk/gtkstatusicon.c60
-rwxr-xr-xtests/teststatusicon.c29
5 files changed, 147 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 524c160eb9..d97ee1224a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
2006-12-22 Matthias Clasen <mclasen@redhat.com>
+ Make it possible to track the embeddedness of
+ statusicon (#387215, Martyn Russell, patch by Christian
+ Persch)
+
+ * gtk/gtkstatusicon.c: Add orientation and embedded properties.
+ * gtk/gtkplug.c:
+ * gtk/gtkplug-x11.c: Add an embedded property.
+ * tests/teststatusicon.c: Test the new properties.
+
* gtk/gtkwidget.c (gtk_widget_get_draw_rectangle): Don't
leak draw_border. (#387170, Kjartan Maraas)
diff --git a/gtk/gtkplug-x11.c b/gtk/gtkplug-x11.c
index 0ba2f5807c..028b2fe288 100644
--- a/gtk/gtkplug-x11.c
+++ b/gtk/gtkplug-x11.c
@@ -278,6 +278,8 @@ _gtk_plug_windowing_filter_func (GdkXEvent *gdk_xevent,
{
GTK_NOTE (PLUGSOCKET, g_message ("GtkPlug: calling gtk_plug_send_delete_event()\n"));
_gtk_plug_send_delete_event (widget);
+
+ g_object_notify (G_OBJECT (plug), "embedded");
}
}
else
@@ -299,7 +301,7 @@ _gtk_plug_windowing_filter_func (GdkXEvent *gdk_xevent,
{
g_warning (G_STRLOC "Plug reparented unexpectedly into window in the same process");
plug->socket_window = NULL;
- break;
+ break; /* FIXME: shouldn't this unref the plug? i.e. "goto done;" instead */
}
g_object_ref (plug->socket_window);
@@ -308,13 +310,15 @@ _gtk_plug_windowing_filter_func (GdkXEvent *gdk_xevent,
{
plug->socket_window = gdk_window_foreign_new_for_display (display, xre->parent);
if (!plug->socket_window) /* Already gone */
- break;
+ break; /* FIXME: shouldn't this unref the plug? i.e. "goto done;" instead */
}
_gtk_plug_add_all_grabbed_keys (plug);
if (!was_embedded)
g_signal_emit_by_name (plug, "embedded");
+
+ g_object_notify (G_OBJECT (plug), "embedded");
}
done:
diff --git a/gtk/gtkplug.c b/gtk/gtkplug.c
index d4f94ce77d..499b1e04da 100644
--- a/gtk/gtkplug.c
+++ b/gtk/gtkplug.c
@@ -36,6 +36,10 @@
#include "gtkalias.h"
+static void gtk_plug_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec);
static void gtk_plug_finalize (GObject *object);
static void gtk_plug_realize (GtkWidget *widget);
static void gtk_plug_unrealize (GtkWidget *widget);
@@ -65,6 +69,11 @@ typedef struct
} GrabbedKey;
enum {
+ PROP_0,
+ PROP_EMBEDDED,
+};
+
+enum {
EMBEDDED,
LAST_SIGNAL
};
@@ -74,6 +83,25 @@ static guint plug_signals[LAST_SIGNAL] = { 0 };
G_DEFINE_TYPE (GtkPlug, gtk_plug, GTK_TYPE_WINDOW)
static void
+gtk_plug_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GtkPlug *plug = GTK_PLUG (object);
+
+ switch (prop_id)
+ {
+ case PROP_EMBEDDED:
+ g_value_set_boolean (value, plug->socket_window != NULL);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
gtk_plug_class_init (GtkPlugClass *class)
{
GObjectClass *gobject_class = (GObjectClass *)class;
@@ -83,6 +111,7 @@ gtk_plug_class_init (GtkPlugClass *class)
bin_class = g_type_class_peek (GTK_TYPE_BIN);
+ gobject_class->get_property = gtk_plug_get_property;
gobject_class->finalize = gtk_plug_finalize;
widget_class->realize = gtk_plug_realize;
@@ -104,6 +133,21 @@ gtk_plug_class_init (GtkPlugClass *class)
window_class->set_focus = gtk_plug_set_focus;
window_class->keys_changed = gtk_plug_keys_changed;
+ /**
+ * GtkPlug:embedded:
+ *
+ * %TRUE if the plug is embedded in a socket.
+ *
+ * Since: 2.12
+ */
+ g_object_class_install_property (gobject_class,
+ PROP_EMBEDDED,
+ g_param_spec_boolean ("embedded",
+ P_("Embedded"),
+ P_("Whether or not the plug is embedded"),
+ FALSE,
+ GTK_PARAM_READABLE));
+
plug_signals[EMBEDDED] =
g_signal_new (I_("embedded"),
G_OBJECT_CLASS_TYPE (class),
diff --git a/gtk/gtkstatusicon.c b/gtk/gtkstatusicon.c
index b507e3c1f8..f9d5215f70 100755
--- a/gtk/gtkstatusicon.c
+++ b/gtk/gtkstatusicon.c
@@ -69,6 +69,8 @@ enum
PROP_SIZE,
PROP_SCREEN,
PROP_VISIBLE,
+ PROP_ORIENTATION,
+ PROP_EMBEDDED,
PROP_BLINKING
};
@@ -141,6 +143,9 @@ static void gtk_status_icon_size_allocate (GtkStatusIcon *status_icon,
GtkAllocation *allocation);
static void gtk_status_icon_screen_changed (GtkStatusIcon *status_icon,
GdkScreen *old_screen);
+static void gtk_status_icon_embedded_changed (GtkStatusIcon *status_icon);
+static void gtk_status_icon_orientation_changed (GtkStatusIcon *status_icon);
+
#endif
static gboolean gtk_status_icon_button_press (GtkStatusIcon *status_icon,
GdkEventButton *event);
@@ -236,6 +241,39 @@ gtk_status_icon_class_init (GtkStatusIconClass *class)
/**
+ * GtkStatusIcon:embedded:
+ *
+ * %TRUE if the statusicon is embedded in a notification area.
+ *
+ * Since: 2.12
+ */
+ g_object_class_install_property (gobject_class,
+ PROP_EMBEDDED,
+ g_param_spec_boolean ("embedded",
+ P_("Embedded"),
+ P_("Whether or not the status icon is embedded"),
+ FALSE,
+ GTK_PARAM_READABLE));
+
+ /**
+ * GtkStatusIcon:orientation:
+ *
+ * The orientation of the tray in which the statusicon
+ * is embedded.
+ *
+ * Since: 2.12
+ */
+ g_object_class_install_property (gobject_class,
+ PROP_ORIENTATION,
+ g_param_spec_enum ("orientation",
+ P_("Orientation"),
+ P_("The orientation of the tray"),
+ GTK_TYPE_ORIENTATION,
+ GTK_ORIENTATION_HORIZONTAL,
+ GTK_PARAM_READABLE));
+
+
+ /**
* GtkStatusIcon::activate:
* @status_icon: the object which received the signal
*
@@ -427,6 +465,10 @@ gtk_status_icon_init (GtkStatusIcon *status_icon)
gtk_widget_add_events (GTK_WIDGET (priv->tray_icon),
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
+ g_signal_connect_swapped (priv->tray_icon, "notify::embedded",
+ G_CALLBACK (gtk_status_icon_embedded_changed), status_icon);
+ g_signal_connect_swapped (priv->tray_icon, "notify::orientation",
+ G_CALLBACK (gtk_status_icon_orientation_changed), status_icon);
g_signal_connect_swapped (priv->tray_icon, "button-press-event",
G_CALLBACK (gtk_status_icon_button_press), status_icon);
g_signal_connect_swapped (priv->tray_icon, "screen-changed",
@@ -623,6 +665,12 @@ gtk_status_icon_get_property (GObject *object,
case PROP_VISIBLE:
g_value_set_boolean (value, gtk_status_icon_get_visible (status_icon));
break;
+ case PROP_EMBEDDED:
+ g_value_set_boolean (value, gtk_status_icon_is_embedded (status_icon));
+ break;
+ case PROP_ORIENTATION:
+ g_value_set_enum (value, _gtk_tray_icon_get_orientation (status_icon->priv->tray_icon));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -1076,6 +1124,18 @@ gtk_status_icon_screen_changed (GtkStatusIcon *status_icon,
#endif
+static void
+gtk_status_icon_embedded_changed (GtkStatusIcon *status_icon)
+{
+ g_object_notify (G_OBJECT (status_icon), "embedded");
+}
+
+static void
+gtk_status_icon_orientation_changed (GtkStatusIcon *status_icon)
+{
+ g_object_notify (G_OBJECT (status_icon), "orientation");
+}
+
static gboolean
gtk_status_icon_button_press (GtkStatusIcon *status_icon,
GdkEventButton *event)
diff --git a/tests/teststatusicon.c b/tests/teststatusicon.c
index 85007e3f34..d17c4c8283 100755
--- a/tests/teststatusicon.c
+++ b/tests/teststatusicon.c
@@ -34,6 +34,29 @@ static gint timeout = 0;
static GSList *icons = NULL;
static void
+size_changed_cb (GtkStatusIcon *icon,
+ int size)
+{
+ g_print ("status icon %p size-changed size = %d\n", icon, size);
+}
+
+static void
+embedded_changed_cb (GtkStatusIcon *icon)
+{
+ g_print ("status icon %p embedded changed to %d\n", icon,
+ gtk_status_icon_is_embedded (icon));
+}
+
+static void
+orientation_changed_cb (GtkStatusIcon *icon)
+{
+ GtkOrientation orientation;
+
+ g_object_get (icon, "orientation", &orientation, NULL);
+ g_print ("status icon %p orientation changed to %d\n", icon, orientation);
+}
+
+static void
update_icons (void)
{
GSList *l;
@@ -264,7 +287,11 @@ main (int argc, char **argv)
gtk_status_icon_set_screen (icon, gdk_display_get_screen (display, i));
update_icons ();
- gtk_status_icon_set_blinking (GTK_STATUS_ICON (icon), TRUE);
+ g_signal_connect (icon, "size-changed", G_CALLBACK (size_changed_cb), NULL);
+ g_signal_connect (icon, "notify::embedded", G_CALLBACK (embedded_changed_cb), NULL);
+ g_signal_connect (icon, "notify::orientation", G_CALLBACK (orientation_changed_cb), NULL);
+ g_print ("icon size %d\n", gtk_status_icon_get_size (icon));
+ gtk_status_icon_set_blinking (GTK_STATUS_ICON (icon), FALSE);
g_signal_connect (icon, "activate",
G_CALLBACK (icon_activated), NULL);