~indicator-applet-developers/indicator-session/trunk.0.1

« back to all changes in this revision

Viewing changes to src/users-service.c

  • Committer: Ted Gould
  • Date: 2009-07-27 04:47:27 UTC
  • mfrom: (9.1.94 fusa.libindicator)
  • Revision ID: ted@canonical.com-20090727044727-m04ul5d8sxqt2pd4
Merging in the branch to port everything to libindicator and fleshing thigns out.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
 
 
2
#include <glib/gi18n.h>
 
3
 
 
4
#include <dbus/dbus-glib.h>
 
5
#include <dbus/dbus-glib-bindings.h>
 
6
 
 
7
#include <libdbusmenu-glib/server.h>
 
8
#include <libdbusmenu-glib/menuitem.h>
 
9
 
 
10
#include "dbus-shared-names.h"
 
11
 
 
12
#define GUEST_SESSION_LAUNCHER  "/usr/share/gdm/guest-session/guest-session-launch"
 
13
 
 
14
static DBusGConnection * session_bus = NULL;
 
15
static DBusGConnection * system_bus = NULL;
 
16
static DBusGProxy * bus_proxy = NULL;
 
17
static DBusGProxy * gdm_proxy = NULL;
 
18
static DbusmenuMenuitem * root_menuitem = NULL;
 
19
static GMainLoop * mainloop = NULL;
 
20
 
 
21
static gboolean
 
22
check_guest_session (void)
 
23
{
 
24
        if (geteuid() < 500) {
 
25
                /* System users shouldn't have guest account shown.  Mosly
 
26
                   this would be the case of the guest user itself. */
 
27
                return FALSE;
 
28
        }
 
29
        if (!g_file_test(GUEST_SESSION_LAUNCHER, G_FILE_TEST_IS_EXECUTABLE)) {
 
30
                /* It doesn't appear that the Guest session stuff is
 
31
                   installed.  So let's not use it then! */
 
32
                return FALSE;
 
33
        }
 
34
 
 
35
        return TRUE;
 
36
}
 
37
 
 
38
static void
 
39
activate_guest_session (DbusmenuMenuitem * mi, gpointer user_data)
 
40
{
 
41
        GError * error = NULL;
 
42
        if (!g_spawn_command_line_async(GUEST_SESSION_LAUNCHER, &error)) {
 
43
                g_warning("Unable to start guest session: %s", error->message);
 
44
                g_error_free(error);
 
45
        }
 
46
 
 
47
        return;
 
48
}
 
49
 
 
50
static gboolean
 
51
check_new_session (void)
 
52
{
 
53
        if (system_bus == NULL) {
 
54
                system_bus = dbus_g_bus_get(DBUS_BUS_SYSTEM, NULL);
 
55
        }
 
56
 
 
57
        if (system_bus == NULL) {
 
58
                return FALSE;
 
59
        }
 
60
 
 
61
        if (gdm_proxy == NULL) {
 
62
                gdm_proxy = dbus_g_proxy_new_for_name(system_bus,
 
63
                                                      "org.gnome.DisplayManager",
 
64
                                                      "/org/gnome/DisplayManager/LocalDisplayFactory",
 
65
                                                      "org.gnome.DisplayManager.LocalDisplayFactory");
 
66
        }
 
67
 
 
68
        if (gdm_proxy == NULL) {
 
69
                return FALSE;
 
70
        }
 
71
 
 
72
        return TRUE;
 
73
}
 
74
 
 
75
static void
 
76
activate_new_session (DbusmenuMenuitem * mi, gpointer user_data)
 
77
{
 
78
        GError * error = NULL;
 
79
        if (!g_spawn_command_line_async("gdmflexiserver --startnew", &error)) {
 
80
                g_warning("Unable to start guest session: %s", error->message);
 
81
                g_error_free(error);
 
82
        }
 
83
 
 
84
        return;
 
85
}
 
86
 
 
87
static void
 
88
create_items (DbusmenuMenuitem * root) {
 
89
        DbusmenuMenuitem * mi = NULL;
 
90
 
 
91
        if (check_guest_session()) {
 
92
                mi = dbusmenu_menuitem_new();
 
93
                dbusmenu_menuitem_property_set(mi, "label", _("Guest Session"));
 
94
                dbusmenu_menuitem_child_append(root, mi);
 
95
                g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(activate_guest_session), NULL);
 
96
        }
 
97
 
 
98
        if (check_new_session()) {
 
99
                mi = dbusmenu_menuitem_new();
 
100
                dbusmenu_menuitem_property_set(mi, "label", _("New Session..."));
 
101
                dbusmenu_menuitem_child_append(root, mi);
 
102
                g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(activate_new_session), NULL);
 
103
        }
 
104
 
 
105
        return;
 
106
}
 
107
 
 
108
int
 
109
main (int argc, char ** argv)
 
110
{
 
111
    g_type_init();
 
112
 
 
113
    session_bus = dbus_g_bus_get(DBUS_BUS_SESSION, NULL);
 
114
    bus_proxy = dbus_g_proxy_new_for_name(session_bus, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS);
 
115
    GError * error = NULL;
 
116
    guint nameret = 0;
 
117
 
 
118
    if (!org_freedesktop_DBus_request_name(bus_proxy, INDICATOR_USERS_DBUS_NAME, 0, &nameret, &error)) {
 
119
        g_error("Unable to call to request name");
 
120
        return 1;
 
121
    }   
 
122
 
 
123
    if (nameret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
 
124
        g_error("Unable to get name");
 
125
        return 1;
 
126
    }   
 
127
 
 
128
    root_menuitem = dbusmenu_menuitem_new();
 
129
        g_debug("Root ID: %d", dbusmenu_menuitem_get_id(root_menuitem));
 
130
 
 
131
        create_items(root_menuitem);
 
132
 
 
133
    DbusmenuServer * server = dbusmenu_server_new(INDICATOR_USERS_DBUS_OBJECT);
 
134
    dbusmenu_server_set_root(server, root_menuitem);
 
135
 
 
136
    mainloop = g_main_loop_new(NULL, FALSE);
 
137
    g_main_loop_run(mainloop);
 
138
 
 
139
    return 0;
 
140
}
 
141