aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Gould <ted@gould.cx>2010-03-25 10:28:25 -0500
committerTed Gould <ted@gould.cx>2010-03-25 10:28:25 -0500
commit1172358fd8ff6ed86efb42bcda25e4ab134f24ca (patch)
tree4e0a5928c75b6179be715e2914ad6d5353b7e9ba
parent0c4c949c296aa4e740d383f2dacdd48ec0f1f180 (diff)
parent3fba03247a657a3d088920511e3621572bdae4e8 (diff)
downloadayatana-indicator-messages-1172358fd8ff6ed86efb42bcda25e4ab134f24ca.tar.gz
ayatana-indicator-messages-1172358fd8ff6ed86efb42bcda25e4ab134f24ca.tar.bz2
ayatana-indicator-messages-1172358fd8ff6ed86efb42bcda25e4ab134f24ca.zip
Tracking which applications we've seen before.
-rw-r--r--src/Makefile.am2
-rw-r--r--src/app-menu-item.c3
-rw-r--r--src/launcher-menu-item.c54
-rw-r--r--src/messages-service.c3
-rw-r--r--src/seen-db.c177
-rw-r--r--src/seen-db.h31
6 files changed, 257 insertions, 13 deletions
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 cbd2242..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,
@@ -309,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);
diff --git a/src/launcher-menu-item.c b/src/launcher-menu-item.c
index 18f54d8..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,7 +164,14 @@ 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 {
@@ -183,18 +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_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);
+ 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 */
@@ -312,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__ */