← Back to team overview

ayatana-commits team mailing list archive

[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