aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Pitt <martin.pitt@canonical.com>2011-03-10 11:11:44 +0100
committerMartin Pitt <martin.pitt@canonical.com>2011-03-10 11:11:44 +0100
commitf96caa9a2ae83bda51f7e7b609ef4e6f61ab3c8e (patch)
treea47958cc7842ecc14cc48822cab59f1397e56498
parentf4cdae15419acd81f378c158fb8159016ef0a9dd (diff)
downloadayatana-indicator-session-f96caa9a2ae83bda51f7e7b609ef4e6f61ab3c8e.tar.gz
ayatana-indicator-session-f96caa9a2ae83bda51f7e7b609ef4e6f61ab3c8e.tar.bz2
ayatana-indicator-session-f96caa9a2ae83bda51f7e7b609ef4e6f61ab3c8e.zip
Add support for extra launcher dir
Hardcoding a single extra launcher path is impractical for distributions, as multiple packages would collide on the name and wouldn't give any extra customization possibility for OEMs. Obsolete /usr/share/applications/indicator-session-extra.desktop and instead read /usr/share/indicators/session/applications/*.desktop https://launchpad.net/bugs/727823
-rw-r--r--src/session-service.c42
1 files changed, 39 insertions, 3 deletions
diff --git a/src/session-service.c b/src/session-service.c
index 1d8cd3a..579b12f 100644
--- a/src/session-service.c
+++ b/src/session-service.c
@@ -55,6 +55,7 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
#define UP_INTERFACE "org.freedesktop.UPower"
#define DESKTOP_FILE "/usr/share/applications/indicator-session-extra.desktop"
+#define EXTRA_LAUNCHER_DIR "/usr/share/indicators/session/applications"
#define GUEST_SESSION_LAUNCHER "/usr/share/gdm/guest-session/guest-session-launch"
@@ -517,6 +518,19 @@ desktop_activate_cb (DbusmenuMenuitem * mi, guint timestamp, gpointer data)
return;
}
+static void
+add_extra_separator_once (DbusmenuMenuitem *menu)
+{
+ static gboolean added = FALSE;
+
+ if (!added) {
+ DbusmenuMenuitem * separator = dbusmenu_menuitem_new();
+ dbusmenu_menuitem_property_set(separator, DBUSMENU_MENUITEM_PROP_TYPE, DBUSMENU_CLIENT_TYPES_SEPARATOR);
+ dbusmenu_menuitem_child_append(menu, separator);
+ added = TRUE;
+ }
+}
+
/* Builds up the menu for us */
static void
rebuild_items (DbusmenuMenuitem *root,
@@ -529,6 +543,8 @@ rebuild_items (DbusmenuMenuitem *root,
gboolean can_activate;
gboolean can_lockscreen;
GList *children;
+ GDir *extra_launchers_dir;
+ const gchar *extra_launcher_file;
/* Make sure we have a valid GConf client, and build one
if needed */
@@ -713,14 +729,34 @@ rebuild_items (DbusmenuMenuitem *root,
update_menu_entries(restart_shutdown_logout_mi);
+ /* now add extra launchers */
+
if (g_file_test(DESKTOP_FILE, G_FILE_TEST_EXISTS)) {
GAppInfo * appinfo = G_APP_INFO(g_desktop_app_info_new_from_filename(DESKTOP_FILE));
if (appinfo != NULL) {
- DbusmenuMenuitem * separator = dbusmenu_menuitem_new();
- dbusmenu_menuitem_property_set(separator, DBUSMENU_MENUITEM_PROP_TYPE, DBUSMENU_CLIENT_TYPES_SEPARATOR);
- dbusmenu_menuitem_child_append(root, separator);
+ add_extra_separator_once (root);
+ DbusmenuMenuitem * desktop_mi = dbusmenu_menuitem_new();
+ dbusmenu_menuitem_property_set(desktop_mi, DBUSMENU_MENUITEM_PROP_LABEL, g_app_info_get_name(appinfo));
+ g_signal_connect(G_OBJECT(desktop_mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(desktop_activate_cb), appinfo);
+ dbusmenu_menuitem_child_append(root, desktop_mi);
+ }
+ }
+
+ extra_launchers_dir = g_dir_open (EXTRA_LAUNCHER_DIR, 0, NULL);
+ if (extra_launchers_dir != NULL) {
+ for (;;) {
+ extra_launcher_file = g_dir_read_name (extra_launchers_dir);
+ if (extra_launcher_file == NULL)
+ break;
+ if (!g_str_has_suffix (extra_launcher_file, ".desktop"))
+ continue;
+
+ gchar *full_path = g_build_filename (EXTRA_LAUNCHER_DIR, extra_launcher_file, NULL);
+ GAppInfo * appinfo = G_APP_INFO(g_desktop_app_info_new_from_filename (full_path));
+ g_free (full_path);
+ add_extra_separator_once (root);
DbusmenuMenuitem * desktop_mi = dbusmenu_menuitem_new();
dbusmenu_menuitem_property_set(desktop_mi, DBUSMENU_MENUITEM_PROP_LABEL, g_app_info_get_name(appinfo));
g_signal_connect(G_OBJECT(desktop_mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(desktop_activate_cb), appinfo);