ayatana-commits team mailing list archive
-
ayatana-commits team
-
Mailing list archive
-
Message #01289
[Merge] lp:~ted/indicator-messages/seen-applications-list into lp:indicator-messages
Ted Gould has proposed merging lp:~ted/indicator-messages/seen-applications-list into lp:indicator-messages.
Requested reviews:
Indicator Applet Developers (indicator-applet-developers)
Watches for when applications start to know whether they've been seen by
the messaging menu before. If they haven't, and they're a default
application. We replace the default name with "Set Up <blah>..."
instead of just the name of it.
--
https://code.launchpad.net/~ted/indicator-messages/seen-applications-list/+merge/22100
Your team ayatana-commits is subscribed to branch lp:indicator-messages.
=== modified file 'src/Makefile.am'
--- src/Makefile.am 2010-03-23 21:22:57 +0000
+++ src/Makefile.am 2010-03-25 03:50:30 +0000
@@ -32,6 +32,8 @@
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
=== modified file 'src/app-menu-item.c'
--- src/app-menu-item.c 2010-03-23 21:08:48 +0000
+++ src/app-menu-item.c 2010-03-25 03:50:30 +0000
@@ -31,6 +31,7 @@
#include "app-menu-item.h"
#include "dbus-data.h"
#include "default-applications.h"
+#include "seen-db.h"
enum {
COUNT_CHANGED,
@@ -309,6 +310,8 @@
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);
=== modified file 'src/launcher-menu-item.c'
--- src/launcher-menu-item.c 2010-03-17 18:34:27 +0000
+++ src/launcher-menu-item.c 2010-03-25 03:50:30 +0000
@@ -31,6 +31,7 @@
#include "launcher-menu-item.h"
#include "dbus-data.h"
#include "default-applications.h"
+#include "seen-db.h"
enum {
NAME_CHANGED,
@@ -163,7 +164,14 @@
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,17 +191,19 @@
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_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 +321,24 @@
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;
}
=== modified file 'src/messages-service.c'
--- src/messages-service.c 2010-02-18 17:19:27 +0000
+++ src/messages-service.c 2010-03-25 03:50:30 +0000
@@ -39,6 +39,7 @@
#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 @@
bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR);
textdomain (GETTEXT_PACKAGE);
+ seen_db_init();
+
dbus_interface = message_service_dbus_new();
listener = indicate_listener_ref_default();
=== added file 'src/seen-db.c'
--- src/seen-db.c 1970-01-01 00:00:00 +0000
+++ src/seen-db.c 2010-03-25 03:50:30 +0000
@@ -0,0 +1,179 @@
+/*
+A small database of which desktop files we've seen.
+
+Copyright 2010 Canonical Ltd.
+
+Authors:
+ Ted Gould <ted@xxxxxxxxxxxxx>
+
+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)
+{
+ if (seendb != NULL) {
+ return;
+ }
+
+ 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));
+}
=== added file 'src/seen-db.h'
--- src/seen-db.h 1970-01-01 00:00:00 +0000
+++ src/seen-db.h 2010-03-25 03:50:30 +0000
@@ -0,0 +1,31 @@
+/*
+A small database of which desktop files we've seen.
+
+Copyright 2010 Canonical Ltd.
+
+Authors:
+ Ted Gould <ted@xxxxxxxxxxxxx>
+
+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__ */
Follow ups