aboutsummaryrefslogtreecommitdiff
path: root/src/gtk-dialog/gtk-logout-helper.c
blob: 75ab63f4362b29e03f005e1e0f762b5195553e09 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134

#include <glib.h>
#include <gtk/gtk.h>
#include <dbus/dbus-glib.h>
#include "logout-dialog.h"
#include "ck-pk-helper.h"

static void
session_action (LogoutDialogAction action)
{
	DBusGConnection * sbus;
	DBusGProxy * sm_proxy;
	GError * error = NULL;
	gboolean res = FALSE;
	
	sbus = dbus_g_bus_get(DBUS_BUS_SESSION, NULL); 
	if (sbus == NULL) {
		g_warning("Unable to get DBus session bus.");
		return;
	}
	sm_proxy = dbus_g_proxy_new_for_name_owner (sbus,
                                            	"org.gnome.SessionManager",
                                            	"/org/gnome/SessionManager",
                                            	"org.gnome.SessionManager",
                                           	 	&error);
	if (sm_proxy == NULL) {
		g_warning("Unable to get DBus proxy to SessionManager interface: %s", error->message);
		g_error_free(error);
		return;
	}		
	
	g_clear_error (&error);
	
	if (action == LOGOUT_DIALOG_LOGOUT) {
		res = dbus_g_proxy_call_with_timeout (sm_proxy, "Logout", INT_MAX, &error, 
											  G_TYPE_UINT, 1, G_TYPE_INVALID, G_TYPE_INVALID);
	} else if (action == LOGOUT_DIALOG_SHUTDOWN) {
		res = dbus_g_proxy_call_with_timeout (sm_proxy, "RequestShutdown", INT_MAX, &error, 
											  G_TYPE_INVALID, G_TYPE_INVALID);
	} else if (action == LOGOUT_DIALOG_RESTART) {
		res = dbus_g_proxy_call_with_timeout (sm_proxy, "RequestReboot", INT_MAX, &error, 
											  G_TYPE_INVALID, G_TYPE_INVALID);
	} else {
		g_warning ("Unknown session action");
	}
	
	if (!res) {
		if (error != NULL) {
			g_warning ("SessionManager action failed: %s", error->message);
		} else {
			g_warning ("SessionManager action failed: unknown error");
		}
	}
	
	g_object_unref(sm_proxy);
	
	if (error != NULL) {
		g_error_free(error);
	}
	
	return;
}	

static LogoutDialogAction type = LOGOUT_DIALOG_LOGOUT;

static gboolean
option_logout (const gchar * arg, const gchar * value, gpointer data, GError * error)
{
	type = LOGOUT_DIALOG_LOGOUT;
	return TRUE;
}

static gboolean
option_shutdown (const gchar * arg, const gchar * value, gpointer data, GError * error)
{
	type = LOGOUT_DIALOG_SHUTDOWN;
	return TRUE;
}

static gboolean
option_restart (const gchar * arg, const gchar * value, gpointer data, GError * error)
{
	type = LOGOUT_DIALOG_RESTART;
	return TRUE;
}

static GOptionEntry options[] = {
	{"logout",     'l',  G_OPTION_FLAG_NO_ARG,  G_OPTION_ARG_CALLBACK,  option_logout,   "Log out of the current session",   NULL},
	{"shutdown",   's',  G_OPTION_FLAG_NO_ARG,  G_OPTION_ARG_CALLBACK,  option_shutdown, "Shutdown the entire system",       NULL},
	{"restart",    'r',  G_OPTION_FLAG_NO_ARG,  G_OPTION_ARG_CALLBACK,  option_restart,  "Restart the system",               NULL},

	{NULL}
};

int
main (int argc, char * argv[])
{
	gtk_init(&argc, &argv);

	GError * error = NULL;
	GOptionContext * context = g_option_context_new(" - logout of the current session");
	g_option_context_add_main_entries(context, options, "gtk-logout-helper");
	g_option_context_add_group(context, gtk_get_option_group(TRUE));
	g_option_context_set_help_enabled(context, TRUE);

	if (!g_option_context_parse(context, &argc, &argv, &error)) {
		g_debug("Option parsing failed: %s", error->message);
		g_error_free(error);
		return 1;
	}

	GtkWidget * dialog = NULL;
	if (!pk_require_auth(type)) {	
		dialog = logout_dialog_new(type);
	}

	if (dialog != NULL) {
		GtkResponseType response = gtk_dialog_run(GTK_DIALOG(dialog));
		gtk_widget_hide(dialog);

		if (response == GTK_RESPONSE_HELP) {
			type = LOGOUT_DIALOG_RESTART;
			response = GTK_RESPONSE_OK;
		}

		if (response != GTK_RESPONSE_OK) {
			return 0;
		}
	}

	session_action(type);

	return 0;
}