← Back to team overview

ayatana-commits team mailing list archive

[Branch ~indicator-applet-developers/indicator-messages/trunk] Rev 177: Making a small indicator on apps that are running.

 

Merge authors:
  Ted Gould (ted)
Related merge proposals:
  https://code.launchpad.net/~ted/indicator-messages/running-indicator/+merge/21983
  proposed by: Ted Gould (ted)
  review: Approve - David Barth (dbarth)
------------------------------------------------------------
revno: 177 [merge]
committer: Ted Gould <ted@xxxxxxxx>
branch nick: trunk
timestamp: Wed 2010-03-24 10:02:47 -0500
message:
  Making a small indicator on apps that are running.
modified:
  .bzrignore
  src/app-menu-item.c
  src/dbus-data.h
  src/indicator-messages.c


--
lp:indicator-messages
https://code.launchpad.net/~indicator-applet-developers/indicator-messages/trunk

Your team ayatana-commits is subscribed to branch lp:indicator-messages.
To unsubscribe from this branch go to https://code.launchpad.net/~indicator-applet-developers/indicator-messages/trunk/+edit-subscription.
=== modified file '.bzrignore'
--- .bzrignore	2010-02-09 03:59:51 +0000
+++ .bzrignore	2010-03-04 21:14:24 +0000
@@ -22,3 +22,4 @@
 src/messages-service-client.h
 src/messages-service-server.h
 po/indicator-messages.pot
+src/libmessaging_la-app-gtk-menu-item.lo

=== modified file 'src/app-menu-item.c'
--- src/app-menu-item.c	2010-03-04 20:41:48 +0000
+++ src/app-menu-item.c	2010-03-23 21:08:48 +0000
@@ -210,6 +210,8 @@
 	/* Can not ref as not real GObject */
 	priv->server = server;
 
+	dbusmenu_menuitem_property_set(DBUSMENU_MENUITEM(self), DBUSMENU_MENUITEM_PROP_TYPE, APPLICATION_MENUITEM_TYPE);
+
 	/* Set up listener signals */
 	g_signal_connect(G_OBJECT(listener), INDICATE_LISTENER_SIGNAL_SERVER_COUNT_CHANGED, G_CALLBACK(count_changed), self);
 
@@ -244,10 +246,10 @@
 		/* TRANSLATORS: This is the name of the program and the number of indicators.  So it
 		                would read something like "Mail Client (5)" */
 		gchar * label = g_strdup_printf(_("%s (%d)"), _(name), priv->unreadcount);
-		dbusmenu_menuitem_property_set(DBUSMENU_MENUITEM(self), DBUSMENU_MENUITEM_PROP_LABEL, label);
+		dbusmenu_menuitem_property_set(DBUSMENU_MENUITEM(self), APPLICATION_MENUITEM_PROP_NAME, label);
 		g_free(label);
 	} else {
-		dbusmenu_menuitem_property_set(DBUSMENU_MENUITEM(self), DBUSMENU_MENUITEM_PROP_LABEL, _(name));
+		dbusmenu_menuitem_property_set(DBUSMENU_MENUITEM(self), APPLICATION_MENUITEM_PROP_NAME, _(name));
 	}
 
 	return;
@@ -318,10 +320,10 @@
 	if (def_icon == NULL) {
 		GIcon * icon = g_app_info_get_icon(priv->appinfo);
 		gchar * iconstr = g_icon_to_string(icon);
-		dbusmenu_menuitem_property_set(DBUSMENU_MENUITEM(self), DBUSMENU_MENUITEM_PROP_ICON_NAME, iconstr);
+		dbusmenu_menuitem_property_set(DBUSMENU_MENUITEM(self), APPLICATION_MENUITEM_PROP_ICON, iconstr);
 		g_free(iconstr);
 	} else {
-		dbusmenu_menuitem_property_set(DBUSMENU_MENUITEM(self), DBUSMENU_MENUITEM_PROP_ICON_NAME, def_icon);
+		dbusmenu_menuitem_property_set(DBUSMENU_MENUITEM(self), APPLICATION_MENUITEM_PROP_ICON, def_icon);
 	}
 
 	g_signal_emit(G_OBJECT(self), signals[NAME_CHANGED], 0, app_menu_item_get_name(self), TRUE);

=== modified file 'src/dbus-data.h'
--- src/dbus-data.h	2010-02-18 03:36:33 +0000
+++ src/dbus-data.h	2010-03-23 20:45:35 +0000
@@ -10,7 +10,7 @@
 
 #define APPLICATION_MENUITEM_TYPE        "application-item"
 #define APPLICATION_MENUITEM_PROP_NAME   "app-name"
-#define APPLICATION_MENUITEM_PROP_COUNT  "app-count"
+#define APPLICATION_MENUITEM_PROP_ICON   "app-icon"
 
 #define INDICATOR_MENUITEM_TYPE          "indicator-item"
 #define INDICATOR_MENUITEM_PROP_LABEL    "indicator-label"

=== modified file 'src/indicator-messages.c'
--- src/indicator-messages.c	2010-03-18 18:24:29 +0000
+++ src/indicator-messages.c	2010-03-23 21:22:26 +0000
@@ -207,6 +207,70 @@
 	return FALSE;
 }
 
+/* Sets the label when it changes. */
+static void
+application_prop_change_cb (DbusmenuMenuitem * mi, gchar * prop, GValue * value, gpointer user_data)
+{
+	if (!g_strcmp0(prop, APPLICATION_MENUITEM_PROP_NAME)) {
+		/* Set the main label */
+		if (GTK_IS_LABEL(user_data)) {
+			gtk_label_set_text(GTK_LABEL(user_data), g_value_get_string(value));
+		}
+	}
+
+	return;
+}
+
+/* Builds a menu item representing a running application in the
+   messaging menu */
+static gboolean
+new_application_item (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client)
+{
+	GtkMenuItem * gmi = GTK_MENU_ITEM(gtk_image_menu_item_new());
+
+	gint padding = 4;
+	gtk_widget_style_get(GTK_WIDGET(gmi), "horizontal-padding", &padding, NULL);
+
+	GtkWidget * hbox = gtk_hbox_new(FALSE, 0);
+
+	/* Set the minimum size, we always want it to take space */
+	gint width, height;
+	gtk_icon_size_lookup(GTK_ICON_SIZE_MENU, &width, &height);
+
+	GtkWidget * icon = gtk_image_new_from_icon_name(dbusmenu_menuitem_property_get(newitem, APPLICATION_MENUITEM_PROP_ICON), GTK_ICON_SIZE_MENU);
+	gtk_widget_set_size_request(icon, width, height);
+	gtk_misc_set_alignment(GTK_MISC(icon), 0.0, 0.5);
+	gtk_box_pack_start(GTK_BOX(hbox), icon, FALSE, FALSE, padding);
+	gtk_widget_show(icon);
+
+	/* Application name in a label */
+	GtkWidget * label = gtk_label_new(dbusmenu_menuitem_property_get(newitem, APPLICATION_MENUITEM_PROP_NAME));
+	gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+	gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, padding);
+	gtk_widget_show(label);
+
+	/* Insert the hbox */
+	gtk_container_add(GTK_CONTAINER(gmi), hbox);
+	gtk_widget_show(hbox);
+
+	/* Build up the running icon */
+	GtkWidget * running_icon = gtk_image_new_from_icon_name("application-running", GTK_ICON_SIZE_MENU);
+	gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(gmi), running_icon);
+	gtk_widget_show(running_icon);
+
+	/* Make sure it always appears */
+	gtk_image_menu_item_set_always_show_image(GTK_IMAGE_MENU_ITEM(gmi), TRUE);
+
+	/* Attach some of the standard GTK stuff */
+	dbusmenu_gtkclient_newitem_base(DBUSMENU_GTKCLIENT(client), newitem, gmi, parent);
+
+	/* Make sure we can handle the label changing */
+	g_signal_connect(G_OBJECT(newitem), DBUSMENU_MENUITEM_SIGNAL_PROPERTY_CHANGED, G_CALLBACK(application_prop_change_cb), label);
+
+	return TRUE;
+}
+
+
 typedef struct _indicator_item_t indicator_item_t;
 struct _indicator_item_t {
 	GtkWidget * icon;
@@ -380,6 +444,7 @@
 	DbusmenuGtkClient * client = dbusmenu_gtkmenu_get_client(menu);
 
 	dbusmenu_client_add_type_handler(DBUSMENU_CLIENT(client), INDICATOR_MENUITEM_TYPE, new_indicator_item);
+	dbusmenu_client_add_type_handler(DBUSMENU_CLIENT(client), APPLICATION_MENUITEM_TYPE, new_application_item);
 
 	return GTK_MENU(menu);
 }