aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKen VanDine <ken.vandine@canonical.com>2010-03-25 16:42:06 -0400
committerKen VanDine <ken.vandine@canonical.com>2010-03-25 16:42:06 -0400
commitbe818d5ddb10cf3c7151d44cc2ee3b65a3fdaac4 (patch)
tree0f61c1b28fd9adeb75c34c1db6472d0503e7c3d3
parent4f50f8df62010ee4033b69f69847c3050adecf87 (diff)
parentfe62bca868de09629a6077323942847290444bd9 (diff)
downloadayatana-indicator-messages-be818d5ddb10cf3c7151d44cc2ee3b65a3fdaac4.tar.gz
ayatana-indicator-messages-be818d5ddb10cf3c7151d44cc2ee3b65a3fdaac4.tar.bz2
ayatana-indicator-messages-be818d5ddb10cf3c7151d44cc2ee3b65a3fdaac4.zip
releasing version 0.3.5-0ubuntu1
-rw-r--r--.bzrignore1
-rw-r--r--configure.ac6
-rw-r--r--debian/changelog20
-rw-r--r--debian/control4
-rw-r--r--src/Makefile.am2
-rw-r--r--src/app-menu-item.c15
-rw-r--r--src/dbus-data.h2
-rw-r--r--src/im-menu-item.c21
-rw-r--r--src/indicator-messages.c110
-rw-r--r--src/launcher-menu-item.c55
-rw-r--r--src/messages-service.c3
-rw-r--r--src/seen-db.c177
-rw-r--r--src/seen-db.h31
13 files changed, 405 insertions, 42 deletions
diff --git a/.bzrignore b/.bzrignore
index dce3b2e..24932b4 100644
--- a/.bzrignore
+++ b/.bzrignore
@@ -22,3 +22,4 @@ indicator-messages-service-activate
src/messages-service-client.h
src/messages-service-server.h
po/indicator-messages.pot
+src/libmessaging_la-app-gtk-menu-item.lo
diff --git a/configure.ac b/configure.ac
index 1427bf0..e768823 100644
--- a/configure.ac
+++ b/configure.ac
@@ -4,7 +4,7 @@ AC_INIT(src/indicator-messages.c)
AC_PREREQ(2.53)
AM_CONFIG_HEADER(config.h)
-AM_INIT_AUTOMAKE(indicator-messages, 0.3.3)
+AM_INIT_AUTOMAKE(indicator-messages, 0.3.5)
AM_MAINTAINER_MODE
@@ -30,8 +30,8 @@ GTK_REQUIRED_VERSION=2.12
GIO_UNIX_REQUIRED_VERSION=2.18
PANEL_REQUIRED_VERSION=2.0.0
INDICATE_REQUIRED_VERSION=0.3.0
-INDICATOR_REQUIRED_VERSION=0.3.3
-DBUSMENUGTK_REQUIRED_VERSION=0.2.5
+INDICATOR_REQUIRED_VERSION=0.3.5
+DBUSMENUGTK_REQUIRED_VERSION=0.2.8
PKG_CHECK_MODULES(APPLET, gtk+-2.0 >= $GTK_REQUIRED_VERSION
gio-unix-2.0 >= $GIO_UNIX_REQUIRED_VERSION
diff --git a/debian/changelog b/debian/changelog
index 5bd32af..063321a 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,23 @@
+indicator-messages (0.3.5-0ubuntu1) lucid; urgency=low
+
+ * Upstream release 0.3.5
+ * Show which applications are running with a small icon
+ next to their entry. (LP: #438526)
+ * Shift command items to line up with application names.
+ (LP: #537312)
+ * Track applications we've seen so that we can show "Set Up"
+ text if we've not seen the app before.
+ * Fix avatar spacing to match other menu items
+ * Use standard libindicator icon handling in panel
+ * Fix translation of non-running applications (LP: #540148)
+ * Handling bools for requesting attention from apps
+ * Changing microblogging to broadcast to match Me Menu (LP: #534952)
+ * debian/control:
+ - Updating requirement to libindicator 0.3.5
+ - Increasing dbusmenu-glib dep to 0.2.8
+
+ -- Ted Gould <ted@ubuntu.com> Thu, 25 Mar 2010 10:53:01 -0500
+
indicator-messages (0.3.3-0ubuntu2) lucid; urgency=low
* src/default-applications.c
diff --git a/debian/control b/debian/control
index 99aff27..b2a013b 100644
--- a/debian/control
+++ b/debian/control
@@ -11,9 +11,9 @@ Build-Depends: debhelper (>= 5.0),
intltool,
libindicate-dev (>= 0.3.0),
libindicate-gtk-dev (>= 0.3.0),
- libindicator-dev (>= 0.3.3),
+ libindicator-dev (>= 0.3.5),
libdbusmenu-gtk-dev (>= 0.2.5),
- libdbusmenu-glib-dev (>= 0.2.5)
+ libdbusmenu-glib-dev (>= 0.2.8)
Standards-Version: 3.8.0
Homepage: https://launchpad.net/indicator-applet
Vcs-Bzr: http://bazaar.launchpad.net/~ubuntu-desktop/indicator-messages/ubuntu
diff --git a/src/Makefile.am b/src/Makefile.am
index c96ef2d..7c9842a 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -32,6 +32,8 @@ indicator_messages_service_SOURCES = \
app-menu-item.h \
launcher-menu-item.c \
launcher-menu-item.h \
+ seen-db.c \
+ seen-db.h \
dirs.h \
dbus-data.h
indicator_messages_service_CFLAGS = $(APPLET_CFLAGS) -Wall -Wl,-Bsymbolic-functions -Wl,-z,defs -Wl,--as-needed -Werror
diff --git a/src/app-menu-item.c b/src/app-menu-item.c
index 7db72bf..87423c0 100644
--- a/src/app-menu-item.c
+++ b/src/app-menu-item.c
@@ -31,6 +31,7 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
#include "app-menu-item.h"
#include "dbus-data.h"
#include "default-applications.h"
+#include "seen-db.h"
enum {
COUNT_CHANGED,
@@ -210,6 +211,8 @@ app_menu_item_new (IndicateListener * listener, IndicateListenerServer * server)
/* 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 +247,10 @@ update_label (AppMenuItem * self)
/* 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;
@@ -307,6 +310,8 @@ desktop_cb (IndicateListener * listener, IndicateListenerServer * server, gchar
return;
}
+ seen_db_add(value);
+
priv->appinfo = G_APP_INFO(g_desktop_app_info_new_from_filename(value));
g_return_if_fail(priv->appinfo != NULL);
@@ -318,10 +323,10 @@ desktop_cb (IndicateListener * listener, IndicateListenerServer * server, gchar
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);
@@ -338,6 +343,7 @@ child_added_cb (DbusmenuMenuitem * root, DbusmenuMenuitem * child, guint positio
AppMenuItem * self = APP_MENU_ITEM(data);
AppMenuItemPrivate * priv = APP_MENU_ITEM_GET_PRIVATE(self);
DbusmenuMenuitemProxy * mip = dbusmenu_menuitem_proxy_new(child);
+ dbusmenu_menuitem_property_set(DBUSMENU_MENUITEM(mip), DBUSMENU_MENUITEM_PROP_ICON_NAME, DBUSMENU_MENUITEM_ICON_NAME_BLANK);
priv->shortcuts = g_list_insert(priv->shortcuts, mip, position);
@@ -439,6 +445,7 @@ root_changed (DbusmenuClient * client, DbusmenuMenuitem * newroot, gpointer data
g_debug("\tProcessing %d children", g_list_length(children));
while (children != NULL) {
DbusmenuMenuitemProxy * mip = dbusmenu_menuitem_proxy_new(DBUSMENU_MENUITEM(children->data));
+ dbusmenu_menuitem_property_set(DBUSMENU_MENUITEM(mip), DBUSMENU_MENUITEM_PROP_ICON_NAME, DBUSMENU_MENUITEM_ICON_NAME_BLANK);
priv->shortcuts = g_list_append(priv->shortcuts, mip);
children = g_list_next(children);
}
diff --git a/src/dbus-data.h b/src/dbus-data.h
index e3d9fd5..c16b2b5 100644
--- a/src/dbus-data.h
+++ b/src/dbus-data.h
@@ -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"
diff --git a/src/im-menu-item.c b/src/im-menu-item.c
index ea9190a..5841d81 100644
--- a/src/im-menu-item.c
+++ b/src/im-menu-item.c
@@ -358,7 +358,7 @@ count_cb (IndicateListener * listener, IndicateListenerServer * server, Indicate
this indicator should be calling for attention or not. If we are,
we need to signal that. */
static void
-attention_cb (IndicateListener * listener, IndicateListenerServer * server, IndicateListenerIndicator * indicator, gchar * property, const gchar * propertydata, gpointer data)
+attention_cb (IndicateListener * listener, IndicateListenerServer * server, IndicateListenerIndicator * indicator, gchar * property, const GValue * propertydata, gpointer data)
{
g_debug("Got Attention Information");
ImMenuItem * self = IM_MENU_ITEM(data);
@@ -373,10 +373,19 @@ attention_cb (IndicateListener * listener, IndicateListenerServer * server, Indi
ImMenuItemPrivate * priv = IM_MENU_ITEM_GET_PRIVATE(self);
gboolean wantit;
- if (propertydata == NULL || propertydata[0] == '\0' || !g_strcmp0(propertydata, "false")) {
- wantit = FALSE;
+ if (G_VALUE_HOLDS_BOOLEAN(propertydata)) {
+ wantit = g_value_get_boolean(propertydata);
+ } else if (G_VALUE_HOLDS_STRING(propertydata)) {
+ const gchar * propstring = g_value_get_string(propertydata);
+
+ if (propstring == NULL || propstring[0] == '\0' || !g_strcmp0(propstring, "false")) {
+ wantit = FALSE;
+ } else {
+ wantit = TRUE;
+ }
} else {
- wantit = TRUE;
+ g_warning("Got property '%s' of an unknown type.", property);
+ return;
}
if (priv->attention != wantit) {
@@ -418,7 +427,7 @@ indicator_modified_cb (IndicateListener * listener, IndicateListenerServer * ser
} else if (!g_strcmp0(property, INDICATE_INDICATOR_MESSAGES_PROP_COUNT)) {
indicate_listener_get_property(listener, server, indicator, INDICATE_INDICATOR_MESSAGES_PROP_COUNT, count_cb, self);
} else if (!g_strcmp0(property, INDICATE_INDICATOR_MESSAGES_PROP_ATTENTION)) {
- indicate_listener_get_property(listener, server, indicator, INDICATE_INDICATOR_MESSAGES_PROP_ATTENTION, attention_cb, self);
+ indicate_listener_get_property_value(listener, server, indicator, INDICATE_INDICATOR_MESSAGES_PROP_ATTENTION, attention_cb, self);
} else if (!g_strcmp0(property, "sender")) {
/* This is a compatibility string with v1 and should be removed */
g_debug("Indicator is using 'sender' property which is a v1 string.");
@@ -451,7 +460,7 @@ im_menu_item_new (IndicateListener * listener, IndicateListenerServer * server,
indicate_listener_get_property_time(listener, server, indicator, INDICATE_INDICATOR_MESSAGES_PROP_TIME, time_cb, self);
indicate_listener_get_property(listener, server, indicator, INDICATE_INDICATOR_MESSAGES_PROP_ICON, icon_cb, self);
indicate_listener_get_property(listener, server, indicator, INDICATE_INDICATOR_MESSAGES_PROP_COUNT, count_cb, self);
- indicate_listener_get_property(listener, server, indicator, INDICATE_INDICATOR_MESSAGES_PROP_ATTENTION, attention_cb, self);
+ indicate_listener_get_property_value(listener, server, indicator, INDICATE_INDICATOR_MESSAGES_PROP_ATTENTION, attention_cb, self);
indicate_listener_get_property(listener, server, indicator, "sender", sender_cb, self);
g_signal_connect(G_OBJECT(self), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(activate_cb), NULL);
diff --git a/src/indicator-messages.c b/src/indicator-messages.c
index 3f533a5..988d9d6 100644
--- a/src/indicator-messages.c
+++ b/src/indicator-messages.c
@@ -31,6 +31,7 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
#include <libindicator/indicator.h>
#include <libindicator/indicator-object.h>
+#include <libindicator/indicator-image-helper.h>
#include "dbus-data.h"
#include "messages-service-client.h"
@@ -61,8 +62,6 @@ INDICATOR_SET_TYPE(INDICATOR_MESSAGES_TYPE)
/* Globals */
static GtkWidget * main_image = NULL;
-#define DESIGN_TEAM_SIZE design_team_size
-static GtkIconSize design_team_size;
static DBusGProxy * icon_proxy = NULL;
static GtkSizeGroup * indicator_right_group = NULL;
@@ -116,9 +115,9 @@ static void
attention_changed_cb (DBusGProxy * proxy, gboolean dot, gpointer userdata)
{
if (dot) {
- gtk_image_set_from_icon_name(GTK_IMAGE(main_image), "indicator-messages-new", DESIGN_TEAM_SIZE);
+ indicator_image_helper_update(GTK_IMAGE(main_image), "indicator-messages-new");
} else {
- gtk_image_set_from_icon_name(GTK_IMAGE(main_image), "indicator-messages", DESIGN_TEAM_SIZE);
+ indicator_image_helper_update(GTK_IMAGE(main_image), "indicator-messages");
}
return;
}
@@ -208,6 +207,85 @@ setup_icon_proxy (gpointer userdata)
return FALSE;
}
+/* Sets the icon when it changes. */
+static void
+application_icon_change_cb (DbusmenuMenuitem * mi, gchar * prop, GValue * value, gpointer user_data)
+{
+ if (!g_strcmp0(prop, APPLICATION_MENUITEM_PROP_ICON)) {
+ /* Set the main icon */
+ if (GTK_IS_IMAGE(user_data)) {
+ gtk_image_set_from_icon_name(GTK_IMAGE(user_data), g_value_get_string(value), GTK_ICON_SIZE_MENU);
+ }
+ }
+
+ return;
+}
+
+/* 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);
+ g_signal_connect(G_OBJECT(newitem), DBUSMENU_MENUITEM_SIGNAL_PROPERTY_CHANGED, G_CALLBACK(application_icon_change_cb), icon);
+
+ return TRUE;
+}
+
+
typedef struct _indicator_item_t indicator_item_t;
struct _indicator_item_t {
GtkWidget * icon;
@@ -278,17 +356,24 @@ new_indicator_item (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, Dbusm
GtkMenuItem * gmi = GTK_MENU_ITEM(gtk_menu_item_new());
- GtkWidget * hbox = gtk_hbox_new(FALSE, 4);
+ gint padding = 4;
+ gtk_widget_style_get(GTK_WIDGET(gmi), "horizontal-padding", &padding, NULL);
+
+ GtkWidget * hbox = gtk_hbox_new(FALSE, 0);
/* Icon, probably someone's face or avatar on an IM */
mi_data->icon = gtk_image_new();
+
+ /* Set the minimum size, we always want it to take space */
+ gint width, height;
+ gtk_icon_size_lookup(GTK_ICON_SIZE_MENU, &width, &height);
+ gtk_widget_set_size_request(mi_data->icon, width, height);
+
GdkPixbuf * pixbuf = dbusmenu_menuitem_property_get_image(newitem, INDICATOR_MENUITEM_PROP_ICON);
if (pixbuf != NULL) {
/* If we've got a pixbuf we need to make sure it's of a reasonable
size to fit in the menu. If not, rescale it. */
GdkPixbuf * resized_pixbuf;
- gint width, height;
- gtk_icon_size_lookup(GTK_ICON_SIZE_MENU, &width, &height);
if (gdk_pixbuf_get_width(pixbuf) > width ||
gdk_pixbuf_get_height(pixbuf) > height) {
g_debug("Resizing icon from %dx%d to %dx%d", gdk_pixbuf_get_width(pixbuf), gdk_pixbuf_get_height(pixbuf), width, height);
@@ -309,13 +394,13 @@ new_indicator_item (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, Dbusm
}
}
gtk_misc_set_alignment(GTK_MISC(mi_data->icon), 0.0, 0.5);
- gtk_box_pack_start(GTK_BOX(hbox), mi_data->icon, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(hbox), mi_data->icon, FALSE, FALSE, padding);
gtk_widget_show(mi_data->icon);
/* Label, probably a username, chat room or mailbox name */
mi_data->label = gtk_label_new(dbusmenu_menuitem_property_get(newitem, INDICATOR_MENUITEM_PROP_LABEL));
gtk_misc_set_alignment(GTK_MISC(mi_data->label), 0.0, 0.5);
- gtk_box_pack_start(GTK_BOX(hbox), mi_data->label, TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(hbox), mi_data->label, TRUE, TRUE, padding);
gtk_widget_show(mi_data->label);
/* Usually either the time or the count on the individual
@@ -323,7 +408,7 @@ new_indicator_item (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, Dbusm
mi_data->right = gtk_label_new(dbusmenu_menuitem_property_get(newitem, INDICATOR_MENUITEM_PROP_RIGHT));
gtk_size_group_add_widget(indicator_right_group, mi_data->right);
gtk_misc_set_alignment(GTK_MISC(mi_data->right), 1.0, 0.5);
- gtk_box_pack_start(GTK_BOX(hbox), mi_data->right, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(hbox), mi_data->right, FALSE, FALSE, padding);
gtk_widget_show(mi_data->right);
gtk_container_add(GTK_CONTAINER(gmi), hbox);
@@ -340,9 +425,7 @@ new_indicator_item (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, Dbusm
static GtkImage *
get_icon (IndicatorObject * io)
{
- design_team_size = gtk_icon_size_register("design-team-size", 22, 22);
-
- main_image = gtk_image_new_from_icon_name("indicator-messages", DESIGN_TEAM_SIZE);
+ main_image = GTK_WIDGET(indicator_image_helper("indicator-messages"));
gtk_widget_show(main_image);
return GTK_IMAGE(main_image);
@@ -376,6 +459,7 @@ get_menu (IndicatorObject * io)
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);
}
diff --git a/src/launcher-menu-item.c b/src/launcher-menu-item.c
index f70f28b..63e5594 100644
--- a/src/launcher-menu-item.c
+++ b/src/launcher-menu-item.c
@@ -31,6 +31,7 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
#include "launcher-menu-item.h"
#include "dbus-data.h"
#include "default-applications.h"
+#include "seen-db.h"
enum {
NAME_CHANGED,
@@ -163,11 +164,18 @@ launcher_menu_item_new (const gchar * desktop_file)
app info that we've parsed */
g_debug("\tName: %s", launcher_menu_item_get_name(self));
- const gchar * default_name = get_default_name(desktop_file);
+ const gchar * default_name = NULL;
+
+ if (seen_db_seen(desktop_file)) {
+ default_name = get_default_name(desktop_file);
+ } else {
+ default_name = get_default_setup(desktop_file);
+ }
+
if (default_name == NULL) {
dbusmenu_menuitem_property_set(DBUSMENU_MENUITEM(self), DBUSMENU_MENUITEM_PROP_LABEL, launcher_menu_item_get_name(self));
} else {
- dbusmenu_menuitem_property_set(DBUSMENU_MENUITEM(self), DBUSMENU_MENUITEM_PROP_LABEL, default_name);
+ dbusmenu_menuitem_property_set(DBUSMENU_MENUITEM(self), DBUSMENU_MENUITEM_PROP_LABEL, _(default_name));
}
gchar * iconstr;
@@ -183,17 +191,20 @@ launcher_menu_item_new (const gchar * desktop_file)
g_signal_connect(G_OBJECT(self), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(activate_cb), NULL);
/* Start to build static shortcuts */
- priv->ids = indicator_desktop_shortcuts_new(priv->desktop, "Messaging Menu");
- const gchar ** nicks = indicator_desktop_shortcuts_get_nicks(priv->ids);
- gint i;
- for (i = 0; nicks[i] != NULL; i++) {
- DbusmenuMenuitem * mi = dbusmenu_menuitem_new();
- g_object_set_data(G_OBJECT(mi), NICK_DATA, (gpointer)nicks[i]);
-
- dbusmenu_menuitem_property_set(mi, DBUSMENU_MENUITEM_PROP_LABEL, indicator_desktop_shortcuts_nick_get_name(priv->ids, nicks[i]));
- g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(nick_activate_cb), self);
-
- priv->shortcuts = g_list_append(priv->shortcuts, mi);
+ if (seen_db_seen(desktop_file)) {
+ priv->ids = indicator_desktop_shortcuts_new(priv->desktop, "Messaging Menu");
+ const gchar ** nicks = indicator_desktop_shortcuts_get_nicks(priv->ids);
+ gint i;
+ for (i = 0; nicks[i] != NULL; i++) {
+ DbusmenuMenuitem * mi = dbusmenu_menuitem_new();
+ g_object_set_data(G_OBJECT(mi), NICK_DATA, (gpointer)nicks[i]);
+
+ dbusmenu_menuitem_property_set(mi, DBUSMENU_MENUITEM_PROP_ICON_NAME, DBUSMENU_MENUITEM_ICON_NAME_BLANK);
+ dbusmenu_menuitem_property_set(mi, DBUSMENU_MENUITEM_PROP_LABEL, indicator_desktop_shortcuts_nick_get_name(priv->ids, nicks[i]));
+ g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(nick_activate_cb), self);
+
+ priv->shortcuts = g_list_append(priv->shortcuts, mi);
+ }
}
/* Check to see if we should be eclipsed */
@@ -311,6 +322,24 @@ launcher_menu_item_set_eclipsed (LauncherMenuItem * li, gboolean eclipsed)
dbusmenu_menuitem_property_set_bool(DBUSMENU_MENUITEM(li), DBUSMENU_MENUITEM_PROP_VISIBLE, !eclipsed);
g_list_foreach(priv->shortcuts, eclipse_shortcuts_cb, GINT_TO_POINTER(eclipsed));
+
+ /* If we're being reshown let's re-evaluate how we should be
+ showing the label */
+ if (!eclipsed) {
+ const gchar * default_name = NULL;
+
+ if (seen_db_seen(priv->desktop)) {
+ default_name = get_default_name(priv->desktop);
+ } else {
+ default_name = get_default_setup(priv->desktop);
+ }
+
+ if (default_name == NULL) {
+ dbusmenu_menuitem_property_set(DBUSMENU_MENUITEM(li), DBUSMENU_MENUITEM_PROP_LABEL, launcher_menu_item_get_name(li));
+ } else {
+ dbusmenu_menuitem_property_set(DBUSMENU_MENUITEM(li), DBUSMENU_MENUITEM_PROP_LABEL, _(default_name));
+ }
+ }
return;
}
diff --git a/src/messages-service.c b/src/messages-service.c
index 0ebab0b..bc3e9e8 100644
--- a/src/messages-service.c
+++ b/src/messages-service.c
@@ -39,6 +39,7 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
#include "dbus-data.h"
#include "dirs.h"
#include "messages-service-dbus.h"
+#include "seen-db.h"
static IndicateListener * listener;
static GList * serverList = NULL;
@@ -1422,6 +1423,8 @@ main (int argc, char ** argv)
bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR);
textdomain (GETTEXT_PACKAGE);
+ seen_db_init();
+
dbus_interface = message_service_dbus_new();
listener = indicate_listener_ref_default();
diff --git a/src/seen-db.c b/src/seen-db.c
new file mode 100644
index 0000000..57765cc
--- /dev/null
+++ b/src/seen-db.c
@@ -0,0 +1,177 @@
+/*
+A small database of which desktop files we've seen.
+
+Copyright 2010 Canonical Ltd.
+
+Authors:
+ Ted Gould <ted@canonical.com>
+
+This program is free software: you can redistribute it and/or modify it
+under the terms of the GNU General Public License version 3, as published
+by the Free Software Foundation.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranties of
+MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
+PURPOSE. See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along
+with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "seen-db.h"
+
+#define GROUP_NAME "Seen Database"
+#define KEY_NAME "DesktopFiles"
+
+GHashTable * seendb = NULL;
+gchar * filename = NULL;
+gchar * dirname = NULL;
+guint write_process = 0;
+
+/* Build the hashtable and then see if we have a keyfile that
+ we can get the history of desktop files we've seen. */
+void
+seen_db_init(void)
+{
+ g_return_if_fail(seendb == NULL);
+
+ seendb = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
+
+ /* Build the filename for the seen database. We're putting
+ it in the cache directory because it could get deleted and
+ it really wouldn't be a big deal. */
+ if (dirname == NULL) {
+ dirname = g_build_filename(g_get_user_cache_dir(), "indicators", "messages", NULL);
+ }
+ if (filename == NULL) {
+ filename = g_build_filename(dirname, "seen-db.keyfile", NULL);
+ }
+
+ if (g_file_test(filename, G_FILE_TEST_EXISTS)) {
+ GKeyFile * keyfile = g_key_file_new();
+
+ /* Load from file */
+ if (!g_key_file_load_from_file(keyfile, filename, G_KEY_FILE_NONE, NULL)) {
+ g_key_file_free(keyfile);
+ keyfile = NULL;
+ }
+
+ /* Check for keys */
+ if (keyfile != NULL && !g_key_file_has_key(keyfile, GROUP_NAME, KEY_NAME, NULL)) {
+ g_warning("Seen DB '%s' does not have key '%s' in group '%s'", filename, KEY_NAME, GROUP_NAME);
+ g_key_file_free(keyfile);
+ keyfile = NULL;
+ }
+
+ /* Grab them and put in DB */
+ if (keyfile != NULL) {
+ gchar ** desktops = g_key_file_get_string_list(keyfile, GROUP_NAME, KEY_NAME, NULL, NULL);
+ gint i = 0;
+
+ while (desktops[i] != NULL) {
+ g_hash_table_insert(seendb,
+ g_strdup(desktops[i]),
+ GINT_TO_POINTER(TRUE));
+ i++;
+ }
+
+ g_strfreev(desktops);
+ }
+
+ /* Clean up our file */
+ if (keyfile != NULL) {
+ g_key_file_free(keyfile);
+ }
+ }
+
+ return;
+}
+
+/* A function to write out the seen database after it's been
+ modified for a while. */
+static gboolean
+write_seen_db (gpointer user_data)
+{
+ write_process = 0;
+
+ /* Build up the key file */
+ GKeyFile * keyfile = g_key_file_new();
+ GArray * desktops = g_array_new(FALSE, FALSE, sizeof(gchar *));
+
+ /* Get the keys from the hashtable and make them
+ into an array */
+ if (keyfile != NULL) {
+ GList * desktop_keys = g_hash_table_get_keys(seendb);
+ GList * head = NULL;
+
+ for (head = desktop_keys; head != NULL; head = g_list_next(head)) {
+ g_array_append_val(desktops, head->data);
+ }
+
+ g_list_free(desktop_keys);
+ }
+
+ /* Use the array to dump the strings into the keyfile */
+ g_key_file_set_string_list(keyfile,
+ GROUP_NAME,
+ KEY_NAME,
+ (const gchar * const *)desktops->data,
+ desktops->len);
+ g_array_free(desktops, TRUE);
+
+ /* Dump the key file to string */
+ gchar * keydump = NULL;
+ gsize keydumplen = 0;
+ keydump = g_key_file_to_data(keyfile, &keydumplen, NULL);
+ g_key_file_free(keyfile);
+
+ /* Ensure the directory exists */
+ if (g_mkdir_with_parents(dirname, 0700) != 0) {
+ g_warning("Unable to make directory: %s", dirname);
+ g_free(keydump);
+ return FALSE;
+ }
+
+ /* Dump out the file */
+ GError * error = NULL;
+ if (!g_file_set_contents(filename, keydump, keydumplen, &error)) {
+ g_warning("Unable to write out file '%s': %s", filename, error->message);
+ g_error_free(error);
+ }
+
+ /* Clean up */
+ g_free(keydump);
+
+ return FALSE;
+}
+
+/* Add a new desktop file to the seen database. Also sets up a timer
+ to do the write out. */
+void
+seen_db_add (const gchar * desktop)
+{
+ /* If this is a new one, let's set up the timer. If
+ there's already one clear it. */
+ if (!seen_db_seen(desktop)) {
+ if (write_process != 0) {
+ g_source_remove(write_process);
+ write_process = 0;
+ }
+
+ write_process = g_timeout_add_seconds(60, write_seen_db, NULL);
+ }
+
+ g_hash_table_insert(seendb,
+ g_strdup(desktop),
+ GINT_TO_POINTER(TRUE));
+
+ return;
+}
+
+/* Checks to see if a desktop file has been seen. */
+gboolean
+seen_db_seen (const gchar * desktop)
+{
+ return GPOINTER_TO_INT(g_hash_table_lookup(seendb, desktop));
+}
diff --git a/src/seen-db.h b/src/seen-db.h
new file mode 100644
index 0000000..a998ff0
--- /dev/null
+++ b/src/seen-db.h
@@ -0,0 +1,31 @@
+/*
+A small database of which desktop files we've seen.
+
+Copyright 2010 Canonical Ltd.
+
+Authors:
+ Ted Gould <ted@canonical.com>
+
+This program is free software: you can redistribute it and/or modify it
+under the terms of the GNU General Public License version 3, as published
+by the Free Software Foundation.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranties of
+MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
+PURPOSE. See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along
+with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef SEEN_DB_H__
+#define SEEN_DB_H__ 1
+
+#include <glib.h>
+
+void seen_db_init(void);
+void seen_db_add (const gchar * desktop);
+gboolean seen_db_seen (const gchar * desktop);
+
+#endif /* SEEN_DB_H__ */