diff options
author | Martin Pitt <martin.pitt@canonical.com> | 2011-03-10 11:11:44 +0100 |
---|---|---|
committer | Martin Pitt <martin.pitt@canonical.com> | 2011-03-10 11:11:44 +0100 |
commit | f96caa9a2ae83bda51f7e7b609ef4e6f61ab3c8e (patch) | |
tree | a47958cc7842ecc14cc48822cab59f1397e56498 /src | |
parent | f4cdae15419acd81f378c158fb8159016ef0a9dd (diff) | |
download | ayatana-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
Diffstat (limited to 'src')
-rw-r--r-- | src/session-service.c | 42 |
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); |