aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bindings/mono/ApplicationIndicator.custom26
-rw-r--r--bindings/mono/Makefile.am53
-rw-r--r--bindings/mono/libappindicator-api.metadata26
-rw-r--r--configure.ac4
-rw-r--r--example/simple-client.c26
-rw-r--r--src/libappindicator/app-indicator.c123
-rw-r--r--tests/test-libappindicator-dbus-client.c2
7 files changed, 211 insertions, 49 deletions
diff --git a/bindings/mono/ApplicationIndicator.custom b/bindings/mono/ApplicationIndicator.custom
new file mode 100644
index 0000000..11d16a8
--- /dev/null
+++ b/bindings/mono/ApplicationIndicator.custom
@@ -0,0 +1,26 @@
+[DllImport ("libappindicator.so.0")]
+static extern int app_indicator_get_status (IntPtr i);
+
+[DllImport ("libappindicator.so.0")]
+static extern int app_indicator_get_category (IntPtr i);
+
+[DllImport ("libappindicator.so.0")]
+static extern void app_indicator_set_status (IntPtr i, int s);
+
+ [GLib.Property ("status")]
+ public Status Status {
+ get {
+ return (Status) app_indicator_get_status (Handle);
+ }
+
+ set {
+ app_indicator_set_status (Handle, (int) value);
+ }
+ }
+
+ [GLib.Property ("category")]
+ public Category Category {
+ get {
+ return (Category) app_indicator_get_category (Handle);
+ }
+ } \ No newline at end of file
diff --git a/bindings/mono/Makefile.am b/bindings/mono/Makefile.am
index dedbeb7..455a23e 100644
--- a/bindings/mono/Makefile.am
+++ b/bindings/mono/Makefile.am
@@ -6,6 +6,7 @@ pkgconfig_DATA = appindicator-sharp-0.1.pc
TEST = AppIndicator.Test.dll
API = libappindicator-api.xml
+MIDDLE_API = libappindicator-api.middle
RAW_API = libappindicator-api.raw
METADATA = libappindicator-api.metadata
ASSEMBLY_NAME = appindicator-sharp
@@ -13,16 +14,18 @@ ASSEMBLY = appindicator-sharp.dll
TARGET = $(ASSEMBLY) $(ASSEMBLY).config
assemblydir = $(libdir)/appindicator-sharp-0.1
assembly_DATA = $(TARGET)
-CLEANFILES = $(ASSEMBLY) $(ASSEMBLY).mdb generated-stamp generated/*.cs $(API) $(RAW_API) $(TEST)
+CLEANFILES = $(ASSEMBLY) $(ASSEMBLY).mdb generated-stamp generated/*.cs $(API) $(MIDDLE_API) $(RAW_API) $(TEST)
DISTCLEANFILES = $(ASSEMBLY).config
TEST_SOURCES = TestIndicator.cs
-EXTRA_DIST = \
- $(RAW_API) \
- $(METADATA) \
- appindicator-sharp-0.1.pc.in \
- appindicator-sharp.dll.config.in \
- app-indicator.sources.xml \
- $(ASSEMBLY_NAME).snk \
+customs = ApplicationIndicator.custom
+EXTRA_DIST = \
+ $(RAW_API) \
+ $(METADATA) \
+ appindicator-sharp-0.1.pc.in \
+ appindicator-sharp.dll.config.in \
+ app-indicator.sources.xml \
+ $(ASSEMBLY_NAME).snk \
+ $(customs) \
$(TEST_SOURCES)
GACUTIL_FLAGS="-package $(ASSEMBLY_NAME) -root $(DESTDIR)$(prefix)/lib"
@@ -33,19 +36,41 @@ test_references = $(GTK_SHARP_LIBS) $(NUNIT_LIBS) -r:$(ASSEMBLY)
$(RAW_API): app-indicator.sources.xml
$(GAPI_PARSER) app-indicator.sources.xml
-$(API): $(METADATA) $(RAW_API)
- cp $(srcdir)/$(RAW_API) $(API)
- chmod u+w $(API)
+$(MIDDLE_API): $(METADATA) $(RAW_API)
+ cp $(srcdir)/$(RAW_API) $(MIDDLE_API)
+ chmod u+w $(MIDDLE_API)
@if test -n '$(METADATA)'; then \
- echo "$(GAPI_FIXUP) --api=$(API) --metadata=$(srcdir)/$(METADATA)"; \
- $(GAPI_FIXUP) --api=$(API) --metadata=$(srcdir)/$(METADATA); \
+ echo "$(GAPI_FIXUP) --api=$(MIDDLE_API) --metadata=$(srcdir)/$(METADATA)"; \
+ $(GAPI_FIXUP) --api=$(MIDDLE_API) --metadata=$(srcdir)/$(METADATA); \
fi
+$(API): $(MIDDLE_API) Makefile.am
+ sed -e "s|PROP_ID_S|ID|" \
+ -e "s|PROP_ID_S|id|" \
+ -e "s|PROP_STATUS_S|Status|" \
+ -e "s|PROP_STATUS_S|status|" \
+ -e "s|PROP_CATEGORY_S|Category|" \
+ -e "s|PROP_CATEGORY_S|category|" \
+ -e "s|PROP_ICON_NAME_S|IconName|" \
+ -e "s|PROP_ICON_NAME_S|icon-name|" \
+ -e "s|PROP_ATTENTION_ICON_NAME_S|AttentionIconName|" \
+ -e "s|PROP_ATTENTION_ICON_NAME_S|attention-icon-name|" \
+ -e "s|PROP_ICON_THEME_PATH_S|IconThemePath|" \
+ -e "s|PROP_ICON_THEME_PATH_S|icon-theme-path|" \
+ -e "s|PROP_MENU_S|Menu|" \
+ -e "s|PROP_MENU_S|menu|" \
+ -e "s|PROP_CONNECTED_S|Connected|" \
+ -e "s|PROP_CONNECTED_S|connected|" \
+ $< > $@
+
api_includes = $(GTK_SHARP_CFLAGS)
-generated-stamp: $(API)
+build_customs = $(addprefix $(srcdir)/, $(customs))
+
+generated-stamp: $(API) $(build_customs)
rm -f generated/* && \
$(GAPI_CODEGEN) --generate $(API) $(api_includes) \
+ --customdir=$(srcdir) \
--outdir=generated --assembly-name=$(ASSEMBLY_NAME) \
&& touch generated-stamp
diff --git a/bindings/mono/libappindicator-api.metadata b/bindings/mono/libappindicator-api.metadata
index f019f0a..86f0f26 100644
--- a/bindings/mono/libappindicator-api.metadata
+++ b/bindings/mono/libappindicator-api.metadata
@@ -5,27 +5,27 @@
<attr path="/api/namespace/object[@cname='AppIndicator']/signal[@field_name='new_status']" name="name">NewStatus</attr>
<attr path="/api/namespace/object[@cname='AppIndicator']/signal[@field_name='connection_changed']" name="name">ConnectionChanged</attr>
<attr path="/api/namespace/object[@cname='AppIndicator']/signal[@field_name='new_icon']" name="name">NewIcon</attr>
- <attr path="/api/namespace/object[@cname='AppIndicator']/property[@cname='PROP_ID_S']" name="name">ID</attr>
- <attr path="/api/namespace/object[@cname='AppIndicator']/property[@cname='PROP_CATEGORY_S']" name="name">Category</attr>
- <attr path="/api/namespace/object[@cname='AppIndicator']/property[@cname='PROP_CATEGORY_S']" name="type">AppIndicatorCategory</attr>
- <attr path="/api/namespace/object[@cname='AppIndicator']/property[@cname='PROP_STATUS_S']" name="name">Status</attr>
- <attr path="/api/namespace/object[@cname='AppIndicator']/property[@cname='PROP_STATUS_S']" name="type">AppIndicatorStatus</attr>
- <attr path="/api/namespace/object[@cname='AppIndicator']/property[@cname='PROP_ICON_NAME_S']" name="name">IconName</attr>
- <attr path="/api/namespace/object[@cname='AppIndicator']/property[@cname='PROP_ATTENTION_ICON_NAME_S']" name="name">AttentionIconName</attr>
- <attr path="/api/namespace/object[@cname='AppIndicator']/property[@cname='PROP_MENU_S']" name="name">Menu</attr>
- <attr path="/api/namespace/object[@cname='AppIndicator']/property[@cname='PROP_MENU_S']" name="type">GtkMenu*</attr>
- <attr path="/api/namespace/object[@cname='AppIndicator']/property[@cname='PROP_CONNECTED_S']" name="name">Connected</attr>
+ <attr path="/api/namespace/object[@cname='AppIndicator']/property[@cname='id']" name="name">ID</attr>
+ <attr path="/api/namespace/object[@cname='AppIndicator']/property[@cname='PROP_CATEGORY_S']" name="hidden"></attr>
+ <attr path="/api/namespace/object[@cname='AppIndicator']/property[@cname='PROP_CATEGORY_S']" name="hidden"></attr>
+ <attr path="/api/namespace/object[@cname='AppIndicator']/property[@cname='PROP_STATUS_S']" name="hidden"></attr>
+ <attr path="/api/namespace/object[@cname='AppIndicator']/property[@cname='PROP_STATUS_S']" name="hidden"></attr>
+ <attr path="/api/namespace/object[@cname='AppIndicator']/property[@cname='icon-name']" name="name">IconName</attr>
+ <attr path="/api/namespace/object[@cname='AppIndicator']/property[@cname='attention-icon-name']" name="name">AttentionIconName</attr>
+ <attr path="/api/namespace/object[@cname='AppIndicator']/property[@cname='menu']" name="name">Menu</attr>
+ <attr path="/api/namespace/object[@cname='AppIndicator']/property[@cname='menu']" name="type">GtkMenu*</attr>
+ <attr path="/api/namespace/object[@cname='AppIndicator']/property[@cname='connected']" name="name">Connected</attr>
<attr path="/api/namespace/object[@cname='AppIndicator']/method[@name='SetMenu']" name="name">SetMenu</attr>
-
+
<remove-node path="/api/namespace/object/method[@cname='app_indicator_get_id']" />
<remove-node path="/api/namespace/object/method[@cname='app_indicator_get_status']" />
<remove-node path="/api/namespace/object/method[@cname='app_indicator_get_icon']" />
<remove-node path="/api/namespace/object/method[@cname='app_indicator_get_category']" />
<remove-node path="/api/namespace/object/method[@cname='app_indicator_get_attention_icon']" />
-
+
<remove-node path="/api/namespace/object/method[@cname='app_indicator_set_id']" />
<remove-node path="/api/namespace/object/method[@cname='app_indicator_set_status']" />
<remove-node path="/api/namespace/object/method[@cname='app_indicator_set_icon']" />
<remove-node path="/api/namespace/object/method[@cname='app_indicator_set_category']" />
- <remove-node path="/api/namespace/object/method[@cname='app_indicator_set_attention_icon']" />
+ <remove-node path="/api/namespace/object/method[@cname='app_indicator_set_attention_icon']" />
</metadata>
diff --git a/configure.ac b/configure.ac
index 4bc18b2..713f40e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,11 +1,11 @@
-AC_INIT(indicator-application, 0.0.7, ted@canonical.com)
+AC_INIT(indicator-application, 0.0.8, ted@canonical.com)
AC_COPYRIGHT([Copyright 2009 Canonical])
AC_PREREQ(2.53)
AM_CONFIG_HEADER(config.h)
-AM_INIT_AUTOMAKE(indicator-application, 0.0.7)
+AM_INIT_AUTOMAKE(indicator-application, 0.0.8)
AM_MAINTAINER_MODE
diff --git a/example/simple-client.c b/example/simple-client.c
index 8ce9fba..8ff3827 100644
--- a/example/simple-client.c
+++ b/example/simple-client.c
@@ -34,6 +34,22 @@ item_clicked_cb (GtkWidget *widget, gpointer data)
g_print ("%s clicked!\n", text);
}
+static void
+toggle_sensitivity_cb (GtkWidget *widget, gpointer data)
+{
+ GtkWidget *target = (GtkWidget *)data;
+
+ gtk_menu_item_set_label (GTK_MENU_ITEM (target), "modified!!");
+ gtk_widget_set_sensitive (target, !GTK_WIDGET_IS_SENSITIVE (target));
+}
+
+static void
+image_clicked_cb (GtkWidget *widget, gpointer data)
+{
+ gtk_image_set_from_stock (GTK_IMAGE (GTK_IMAGE_MENU_ITEM (widget)->image),
+ GTK_STOCK_OPEN, GTK_ICON_SIZE_MENU);
+}
+
int
main (int argc, char ** argv)
{
@@ -68,6 +84,16 @@ main (int argc, char ** argv)
G_CALLBACK (item_clicked_cb), "3");
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+ GtkWidget *toggle_item = gtk_menu_item_new_with_label ("Toggle 3");
+ g_signal_connect (toggle_item, "activate",
+ G_CALLBACK (toggle_sensitivity_cb), item);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), toggle_item);
+
+ item = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, NULL);
+ g_signal_connect (item, "activate",
+ G_CALLBACK (image_clicked_cb), NULL);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+
app_indicator_set_menu (ci, GTK_MENU (menu));
mainloop = g_main_loop_new(NULL, FALSE);
diff --git a/src/libappindicator/app-indicator.c b/src/libappindicator/app-indicator.c
index 2650342..e3de406 100644
--- a/src/libappindicator/app-indicator.c
+++ b/src/libappindicator/app-indicator.c
@@ -112,6 +112,10 @@ enum {
#define APP_INDICATOR_GET_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE ((o), APP_INDICATOR_TYPE, AppIndicatorPrivate))
+/* Default Paths */
+#define DEFAULT_ITEM_PATH "/org/ayatana/NotificationItem"
+#define DEFAULT_MENU_PATH "/org/ayatana/NotificationItem/Menu"
+
/* Boiler plate */
static void app_indicator_class_init (AppIndicatorClass *klass);
static void app_indicator_init (AppIndicator *self);
@@ -314,7 +318,7 @@ app_indicator_init (AppIndicator *self)
}
dbus_g_connection_register_g_object(priv->connection,
- "/need/a/path",
+ DEFAULT_ITEM_PATH,
G_OBJECT(self));
self->priv = priv;
@@ -558,7 +562,7 @@ check_connect (AppIndicator *self)
return;
}
- org_freedesktop_StatusNotifierWatcher_register_status_notifier_item_async(priv->watcher_proxy, "/need/a/path", register_service_cb, self);
+ org_freedesktop_StatusNotifierWatcher_register_status_notifier_item_async(priv->watcher_proxy, DEFAULT_ITEM_PATH, register_service_cb, self);
return;
}
@@ -775,6 +779,85 @@ menuitem_iterate (GtkWidget *widget,
}
static void
+update_icon_name (DbusmenuMenuitem *menuitem,
+ GtkImage *image)
+{
+ if (gtk_image_get_storage_type (image) != GTK_IMAGE_ICON_NAME)
+ return;
+
+ dbusmenu_menuitem_property_set (menuitem,
+ DBUSMENU_MENUITEM_PROP_ICON,
+ image->data.name.icon_name);
+}
+
+/* return value specifies whether the label is set or not */
+static gboolean
+update_stock_item (DbusmenuMenuitem *menuitem,
+ GtkImage *image)
+{
+ GtkStockItem stock;
+
+ if (gtk_image_get_storage_type (image) != GTK_IMAGE_STOCK)
+ return FALSE;
+
+ gtk_stock_lookup (image->data.stock.stock_id, &stock);
+
+ dbusmenu_menuitem_property_set (menuitem,
+ DBUSMENU_MENUITEM_PROP_ICON,
+ image->data.stock.stock_id);
+
+ if (stock.label != NULL)
+ {
+ dbusmenu_menuitem_property_set (menuitem,
+ DBUSMENU_MENUITEM_PROP_LABEL,
+ stock.label);
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void
+image_notify_cb (GtkWidget *widget,
+ GParamSpec *pspec,
+ gpointer data)
+{
+ DbusmenuMenuitem *child = (DbusmenuMenuitem *)data;
+ GtkImage *image = GTK_IMAGE (widget);
+
+ if (pspec->name == g_intern_static_string ("stock"))
+ {
+ update_stock_item (child, image);
+ }
+ else if (pspec->name == g_intern_static_string ("icon-name"))
+ {
+ update_icon_name (child, image);
+ }
+}
+
+static void
+widget_notify_cb (GtkWidget *widget,
+ GParamSpec *pspec,
+ gpointer data)
+{
+ DbusmenuMenuitem *child = (DbusmenuMenuitem *)data;
+
+ if (pspec->name == g_intern_static_string ("sensitive"))
+ {
+ dbusmenu_menuitem_property_set_bool (child,
+ DBUSMENU_MENUITEM_PROP_SENSITIVE,
+ GTK_WIDGET_IS_SENSITIVE (widget));
+ }
+ else if (pspec->name == g_intern_static_string ("label"))
+ {
+ dbusmenu_menuitem_property_set (child,
+ DBUSMENU_MENUITEM_PROP_LABEL,
+ gtk_menu_item_get_label (GTK_MENU_ITEM (widget)));
+ }
+}
+
+static void
container_iterate (GtkWidget *widget,
gpointer data)
{
@@ -821,25 +904,24 @@ container_iterate (GtkWidget *widget,
}
else if (GTK_IS_IMAGE_MENU_ITEM (widget))
{
- GtkWidget *image = gtk_image_menu_item_get_image (GTK_IMAGE_MENU_ITEM (widget));
-
- if (gtk_image_get_storage_type (GTK_IMAGE (image)) == GTK_IMAGE_STOCK)
- {
- GtkStockItem stock;
+ GtkWidget *image;
+ GtkImageType image_type;
- gtk_stock_lookup (GTK_IMAGE (image)->data.stock.stock_id, &stock);
+ image = gtk_image_menu_item_get_image (GTK_IMAGE_MENU_ITEM (widget));
+ image_type = gtk_image_get_storage_type (GTK_IMAGE (image));
- dbusmenu_menuitem_property_set (child,
- DBUSMENU_MENUITEM_PROP_ICON,
- GTK_IMAGE (image)->data.stock.stock_id);
+ g_signal_connect (image,
+ "notify",
+ G_CALLBACK (image_notify_cb),
+ child);
- if (stock.label != NULL)
- {
- dbusmenu_menuitem_property_set (child,
- DBUSMENU_MENUITEM_PROP_LABEL,
- stock.label);
- label_set = TRUE;
- }
+ if (image_type == GTK_IMAGE_STOCK)
+ {
+ label_set = update_stock_item (child, GTK_IMAGE (image));
+ }
+ else if (image_type == GTK_IMAGE_ICON_NAME)
+ {
+ update_icon_name (child, GTK_IMAGE (image));
}
}
}
@@ -861,6 +943,9 @@ container_iterate (GtkWidget *widget,
}
}
+ g_signal_connect (widget, "notify",
+ G_CALLBACK (widget_notify_cb), child);
+
g_signal_connect (G_OBJECT (child),
DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED,
G_CALLBACK (activate_menuitem), widget);
@@ -881,7 +966,7 @@ setup_dbusmenu (AppIndicator *self)
root);
if (priv->menuservice == NULL) {
- priv->menuservice = dbusmenu_server_new ("/need/a/menu/path");
+ priv->menuservice = dbusmenu_server_new (DEFAULT_MENU_PATH);
}
dbusmenu_server_set_root (priv->menuservice, root);
diff --git a/tests/test-libappindicator-dbus-client.c b/tests/test-libappindicator-dbus-client.c
index 8598f9a..5a7107f 100644
--- a/tests/test-libappindicator-dbus-client.c
+++ b/tests/test-libappindicator-dbus-client.c
@@ -200,7 +200,7 @@ main (gint argc, gchar * argv[])
DBusGProxy * props = dbus_g_proxy_new_for_name_owner(session_bus,
":1.0",
- "/need/a/path",
+ "/org/ayatana/NotificationItem",
DBUS_INTERFACE_PROPERTIES,
&error);
if (error != NULL) {