#include #include #include #include #include #include "dbus-shared-names.h" #define GUEST_SESSION_LAUNCHER "/usr/share/gdm/guest-session/guest-session-launch" static DbusmenuMenuitem * root_menuitem = NULL; static GMainLoop * mainloop = NULL; static gboolean check_guest_session (void) { if (geteuid() < 500) { /* System users shouldn't have guest account shown. Mosly this would be the case of the guest user itself. */ return FALSE; } if (!g_file_test(GUEST_SESSION_LAUNCHER, G_FILE_TEST_IS_EXECUTABLE)) { /* It doesn't appear that the Guest session stuff is installed. So let's not use it then! */ return FALSE; } return TRUE; } static void activate_guest_session (DbusmenuMenuitem * mi, gpointer user_data) { gchar *argv[] = {GUEST_SESSION_LAUNCHER, NULL }; g_spawn_sync (NULL, argv, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL); } static void activate_new_session (DbusmenuMenuitem * mi, gpointer user_data) { } static void create_items (DbusmenuMenuitem * root) { DbusmenuMenuitem * mi = NULL; if (check_guest_session()) { mi = dbusmenu_menuitem_new(); dbusmenu_menuitem_property_set(mi, "label", _("Guest Session")); dbusmenu_menuitem_child_append(root, mi); g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(activate_guest_session), NULL); } mi = dbusmenu_menuitem_new(); dbusmenu_menuitem_property_set(mi, "label", _("New Session...")); dbusmenu_menuitem_child_append(root, mi); g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(activate_new_session), NULL); return; } int main (int argc, char ** argv) { g_type_init(); DBusGConnection * connection = dbus_g_bus_get(DBUS_BUS_SESSION, NULL); DBusGProxy * bus_proxy = dbus_g_proxy_new_for_name(connection, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS); GError * error = NULL; guint nameret = 0; if (!org_freedesktop_DBus_request_name(bus_proxy, INDICATOR_USERS_DBUS_NAME, 0, &nameret, &error)) { g_error("Unable to call to request name"); return 1; } if (nameret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { g_error("Unable to get name"); return 1; } root_menuitem = dbusmenu_menuitem_new(); g_debug("Root ID: %d", dbusmenu_menuitem_get_id(root_menuitem)); create_items(root_menuitem); DbusmenuServer * server = dbusmenu_server_new(INDICATOR_USERS_DBUS_OBJECT); dbusmenu_server_set_root(server, root_menuitem); mainloop = g_main_loop_new(NULL, FALSE); g_main_loop_run(mainloop); return 0; }