From 1e2d4592308c3bff63c74c48b9e97b6d246d2b92 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 9 Jun 2009 10:59:51 -0500 Subject: Now we're building services. Snazy. --- src/users-service.c | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/users-service.c (limited to 'src/users-service.c') diff --git a/src/users-service.c b/src/users-service.c new file mode 100644 index 0000000..63590c7 --- /dev/null +++ b/src/users-service.c @@ -0,0 +1,7 @@ + +int +main (int argc, char ** argv) +{ + + return 0; +} -- cgit v1.2.3 From 21cc4e9079d0cf6b13f8232f10a265ce64fd260c Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 9 Jun 2009 16:58:52 -0500 Subject: Bringing up a dbusmenu item. --- src/users-service.c | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) (limited to 'src/users-service.c') diff --git a/src/users-service.c b/src/users-service.c index 63590c7..39afe39 100644 --- a/src/users-service.c +++ b/src/users-service.c @@ -1,7 +1,42 @@ +#include +#include + +#include +#include + +#include "dbus-shared-names.h" + +static DbusmenuMenuitem * root_menuitem = NULL; +static GMainLoop * mainloop = NULL; + 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; - return 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(); + 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; } + -- cgit v1.2.3 From 42644e5fb655c101d553773a29050323d1711a7e Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 30 Jun 2009 16:53:09 -0500 Subject: Getting some menuitems --- src/users-service.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'src/users-service.c') diff --git a/src/users-service.c b/src/users-service.c index 39afe39..c3c842f 100644 --- a/src/users-service.c +++ b/src/users-service.c @@ -10,6 +10,19 @@ static DbusmenuMenuitem * root_menuitem = NULL; static GMainLoop * mainloop = NULL; +gchar * dummies[] = { + "Bob", "Jim", "Alvin", "Mary", NULL +}; + +void dummy_users (void) { + int count; + for (count = 0; dummies[count] != NULL; count++) { + DbusmenuMenuitem * mi = dbusmenu_menuitem_new(); + dbusmenu_menuitem_property_set(mi, "label", dummies[count]); + dbusmenu_menuitem_child_append(root_menuitem, mi); + } +} + int main (int argc, char ** argv) { -- cgit v1.2.3 From ee4d58a3a1a25f1264df9c9732a480e1f436790f Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 30 Jun 2009 23:56:13 -0500 Subject: Moving the server to after the items makes things work better, but I'm curious why it's failing. This is more a test for dbusmenu though which'll have better debug. --- src/users-service.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'src/users-service.c') diff --git a/src/users-service.c b/src/users-service.c index c3c842f..409a1d0 100644 --- a/src/users-service.c +++ b/src/users-service.c @@ -14,13 +14,18 @@ gchar * dummies[] = { "Bob", "Jim", "Alvin", "Mary", NULL }; -void dummy_users (void) { +static void +dummy_users (DbusmenuMenuitem * root) { int count; for (count = 0; dummies[count] != NULL; count++) { DbusmenuMenuitem * mi = dbusmenu_menuitem_new(); + g_debug("Creating item: %d %s", dbusmenu_menuitem_get_id(mi), dummies[count]); + g_debug("\tRoot ID: %d", dbusmenu_menuitem_get_id(root)); dbusmenu_menuitem_property_set(mi, "label", dummies[count]); - dbusmenu_menuitem_child_append(root_menuitem, mi); + dbusmenu_menuitem_child_add_position(root, mi, count); } + + return; } int @@ -44,6 +49,10 @@ main (int argc, char ** argv) } root_menuitem = dbusmenu_menuitem_new(); + g_debug("Root ID: %d", dbusmenu_menuitem_get_id(root_menuitem)); + + dummy_users(root_menuitem); + DbusmenuServer * server = dbusmenu_server_new(INDICATOR_USERS_DBUS_OBJECT); dbusmenu_server_set_root(server, root_menuitem); -- cgit v1.2.3 From 015f1c1636e6c3b3d84375121ed14a760d76ee8e Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 20 Jul 2009 11:28:50 -0500 Subject: Switching from dummy users to useful menuitems --- src/users-service.c | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) (limited to 'src/users-service.c') diff --git a/src/users-service.c b/src/users-service.c index 409a1d0..66dc86e 100644 --- a/src/users-service.c +++ b/src/users-service.c @@ -1,4 +1,6 @@ +#include + #include #include @@ -10,20 +12,31 @@ static DbusmenuMenuitem * root_menuitem = NULL; static GMainLoop * mainloop = NULL; -gchar * dummies[] = { - "Bob", "Jim", "Alvin", "Mary", NULL -}; +static void +activate_guest_session (DbusmenuMenuitem * mi, gpointer user_data) +{ + +} + +static void +activate_new_session (DbusmenuMenuitem * mi, gpointer user_data) +{ + +} static void -dummy_users (DbusmenuMenuitem * root) { - int count; - for (count = 0; dummies[count] != NULL; count++) { - DbusmenuMenuitem * mi = dbusmenu_menuitem_new(); - g_debug("Creating item: %d %s", dbusmenu_menuitem_get_id(mi), dummies[count]); - g_debug("\tRoot ID: %d", dbusmenu_menuitem_get_id(root)); - dbusmenu_menuitem_property_set(mi, "label", dummies[count]); - dbusmenu_menuitem_child_add_position(root, mi, count); - } +create_items (DbusmenuMenuitem * root) { + DbusmenuMenuitem * mi = NULL; + + 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; } @@ -51,7 +64,7 @@ main (int argc, char ** argv) root_menuitem = dbusmenu_menuitem_new(); g_debug("Root ID: %d", dbusmenu_menuitem_get_id(root_menuitem)); - dummy_users(root_menuitem); + create_items(root_menuitem); DbusmenuServer * server = dbusmenu_server_new(INDICATOR_USERS_DBUS_OBJECT); dbusmenu_server_set_root(server, root_menuitem); -- cgit v1.2.3 From c1b327315d06e8082dad23380d360a22a0542c4b Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 20 Jul 2009 12:44:32 -0500 Subject: Setting the menu item to activate the guest user session --- src/users-service.c | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) (limited to 'src/users-service.c') diff --git a/src/users-service.c b/src/users-service.c index 66dc86e..39c30bb 100644 --- a/src/users-service.c +++ b/src/users-service.c @@ -9,13 +9,33 @@ #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 @@ -28,10 +48,12 @@ static void create_items (DbusmenuMenuitem * root) { DbusmenuMenuitem * mi = NULL; - 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); + 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...")); -- cgit v1.2.3 From bde7584ca763892c43a1db195d27a27e231a68fe Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 20 Jul 2009 14:02:40 -0500 Subject: Turning everythign into a check and a way to start a new fancy login session --- src/users-service.c | 58 +++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 8 deletions(-) (limited to 'src/users-service.c') diff --git a/src/users-service.c b/src/users-service.c index 39c30bb..b8b5c2f 100644 --- a/src/users-service.c +++ b/src/users-service.c @@ -11,6 +11,10 @@ #define GUEST_SESSION_LAUNCHER "/usr/share/gdm/guest-session/guest-session-launch" +static DBusGConnection * session_bus = NULL; +static DBusGConnection * system_bus = NULL; +static DBusGProxy * bus_proxy = NULL; +static DBusGProxy * gdm_proxy = NULL; static DbusmenuMenuitem * root_menuitem = NULL; static GMainLoop * mainloop = NULL; @@ -34,14 +38,50 @@ check_guest_session (void) 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); + GError * error = NULL; + if (!g_spawn_command_line_async(GUEST_SESSION_LAUNCHER, &error)) { + g_warning("Unable to start guest session: %s", error->message); + g_error_free(error); + } + + return; +} + +static gboolean +check_new_session (void) +{ + if (system_bus == NULL) { + system_bus = dbus_g_bus_get(DBUS_BUS_SYSTEM, NULL); + } + + if (system_bus == NULL) { + return FALSE; + } + + if (gdm_proxy == NULL) { + gdm_proxy = dbus_g_proxy_new_for_name(system_bus, + "org.gnome.DisplayManager", + "/org/gnome/DisplayManager/LocalDisplayFactory", + "org.gnome.DisplayManager.LocalDisplayFactory"); + } + + if (gdm_proxy == NULL) { + return FALSE; + } + + return TRUE; } static void activate_new_session (DbusmenuMenuitem * mi, gpointer user_data) { + GError * error = NULL; + if (!g_spawn_command_line_async("gdmflexiserver -s", &error)) { + g_warning("Unable to start guest session: %s", error->message); + g_error_free(error); + } + return; } static void @@ -55,10 +95,12 @@ create_items (DbusmenuMenuitem * root) { 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); + if (check_new_session()) { + 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; } @@ -68,8 +110,8 @@ 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); + session_bus = dbus_g_bus_get(DBUS_BUS_SESSION, NULL); + bus_proxy = dbus_g_proxy_new_for_name(session_bus, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS); GError * error = NULL; guint nameret = 0; -- cgit v1.2.3 From fdb5cc0addc4ad4a801854879a2b1869da18073f Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 20 Jul 2009 14:04:15 -0500 Subject: Expanding command line option to make it easier to read --- src/users-service.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/users-service.c') diff --git a/src/users-service.c b/src/users-service.c index b8b5c2f..731bc4d 100644 --- a/src/users-service.c +++ b/src/users-service.c @@ -76,7 +76,7 @@ static void activate_new_session (DbusmenuMenuitem * mi, gpointer user_data) { GError * error = NULL; - if (!g_spawn_command_line_async("gdmflexiserver -s", &error)) { + if (!g_spawn_command_line_async("gdmflexiserver --startnew", &error)) { g_warning("Unable to start guest session: %s", error->message); g_error_free(error); } -- cgit v1.2.3