21
* Matt Keenan <matt.keenan@sun.com>
22
* Mark McLoughlin <mark@skynet.ie>
23
* Vincent Untz <vuntz@gnome.org>
26
#include <libpanel-util/panel-cleanup.h>
28
#include "panel-schemas.h"
27
30
#include "panel-lockdown.h"
30
#include "panel-gconf.h"
34
#define PANEL_GLOBAL_LOCKDOWN_DIR "/apps/panel/global"
35
#define DESKTOP_GNOME_LOCKDOWN_DIR "/desktop/gnome/lockdown"
36
#define PANEL_GLOBAL_LOCKED_DOWN_KEY PANEL_GLOBAL_LOCKDOWN_DIR "/locked_down"
37
#define DISABLE_COMMAND_LINE_KEY DESKTOP_GNOME_LOCKDOWN_DIR "/disable_command_line"
38
#define DISABLE_LOCK_SCREEN_KEY DESKTOP_GNOME_LOCKDOWN_DIR "/disable_lock_screen"
39
#define DISABLE_LOG_OUT_KEY PANEL_GLOBAL_LOCKDOWN_DIR "/disable_log_out"
40
#define DISABLE_FORCE_QUIT_KEY PANEL_GLOBAL_LOCKDOWN_DIR "/disable_force_quit"
41
#define DISABLED_APPLETS_KEY PANEL_GLOBAL_LOCKDOWN_DIR "/disabled_applets"
44
guint initialized : 1;
46
guint locked_down : 1;
47
guint disable_command_line : 1;
48
guint disable_lock_screen : 1;
49
guint disable_log_out : 1;
50
guint disable_force_quit : 1;
52
GSList *disabled_applets;
54
guint listeners [N_LISTENERS];
59
static PanelLockdown panel_lockdown = { 0, };
63
panel_lockdown_invoke_closures (PanelLockdown *lockdown)
67
for (l = lockdown->closures; l; l = l->next)
68
g_closure_invoke (l->data, NULL, 0, NULL, NULL);
72
locked_down_notify (GConfClient *client,
75
PanelLockdown *lockdown)
77
if (!entry->value || entry->value->type != GCONF_VALUE_BOOL)
80
lockdown->locked_down = gconf_value_get_bool (entry->value);
82
panel_lockdown_invoke_closures (lockdown);
86
disable_command_line_notify (GConfClient *client,
89
PanelLockdown *lockdown)
91
if (!entry->value || entry->value->type != GCONF_VALUE_BOOL)
94
lockdown->disable_command_line = gconf_value_get_bool (entry->value);
96
panel_lockdown_invoke_closures (lockdown);
100
disable_lock_screen_notify (GConfClient *client,
103
PanelLockdown *lockdown)
105
if (!entry->value || entry->value->type != GCONF_VALUE_BOOL)
108
lockdown->disable_lock_screen = gconf_value_get_bool (entry->value);
110
panel_lockdown_invoke_closures (lockdown);
114
disable_log_out_notify (GConfClient *client,
117
PanelLockdown *lockdown)
119
if (!entry->value || entry->value->type != GCONF_VALUE_BOOL)
122
lockdown->disable_log_out = gconf_value_get_bool (entry->value);
124
panel_lockdown_invoke_closures (lockdown);
128
disable_force_quit_notify (GConfClient *client,
131
PanelLockdown *lockdown)
133
if (!entry->value || entry->value->type != GCONF_VALUE_BOOL)
136
lockdown->disable_force_quit = gconf_value_get_bool (entry->value);
138
panel_lockdown_invoke_closures (lockdown);
142
disabled_applets_notify (GConfClient *client,
145
PanelLockdown *lockdown)
149
if (!entry->value || entry->value->type != GCONF_VALUE_LIST ||
150
gconf_value_get_list_type (entry->value) != GCONF_VALUE_STRING)
153
for (l = lockdown->disabled_applets; l; l = l->next)
155
g_slist_free (lockdown->disabled_applets);
156
lockdown->disabled_applets = NULL;
158
for (l = gconf_value_get_list (entry->value); l; l = l->next) {
159
const char *iid = gconf_value_get_string (l->data);
161
lockdown->disabled_applets =
162
g_slist_prepend (lockdown->disabled_applets,
166
panel_lockdown_invoke_closures (lockdown);
170
panel_lockdown_load_bool (PanelLockdown *lockdown,
173
GConfClientNotifyFunc notify_func,
176
GError *error = NULL;
179
retval = gconf_client_get_bool (client, key, &error);
181
g_warning ("Error getting value of '%s': %s\n",
182
key, error->message);
186
lockdown->listeners [listener] =
187
gconf_client_notify_add (client,
197
panel_lockdown_load_disabled_applets (PanelLockdown *lockdown,
203
retval = gconf_client_get_list (client,
204
DISABLED_APPLETS_KEY,
208
lockdown->listeners [listener] =
209
gconf_client_notify_add (client,
210
DISABLED_APPLETS_KEY,
211
(GConfClientNotifyFunc) disabled_applets_notify,
219
panel_lockdown_init (void)
224
client = panel_gconf_get_client ();
226
gconf_client_add_dir (client,
227
DESKTOP_GNOME_LOCKDOWN_DIR,
228
GCONF_CLIENT_PRELOAD_ONELEVEL,
231
gconf_client_add_dir (client,
232
PANEL_GLOBAL_LOCKDOWN_DIR,
233
GCONF_CLIENT_PRELOAD_ONELEVEL,
236
panel_lockdown.locked_down =
237
panel_lockdown_load_bool (&panel_lockdown,
239
PANEL_GLOBAL_LOCKED_DOWN_KEY,
240
(GConfClientNotifyFunc) locked_down_notify,
243
panel_lockdown.disable_command_line =
244
panel_lockdown_load_bool (&panel_lockdown,
246
DISABLE_COMMAND_LINE_KEY,
247
(GConfClientNotifyFunc) disable_command_line_notify,
250
panel_lockdown.disable_lock_screen =
251
panel_lockdown_load_bool (&panel_lockdown,
253
DISABLE_LOCK_SCREEN_KEY,
254
(GConfClientNotifyFunc) disable_lock_screen_notify,
257
panel_lockdown.disable_log_out =
258
panel_lockdown_load_bool (&panel_lockdown,
261
(GConfClientNotifyFunc) disable_log_out_notify,
264
panel_lockdown.disable_force_quit =
265
panel_lockdown_load_bool (&panel_lockdown,
267
DISABLE_FORCE_QUIT_KEY,
268
(GConfClientNotifyFunc) disable_force_quit_notify,
271
panel_lockdown.disabled_applets =
272
panel_lockdown_load_disabled_applets (&panel_lockdown,
276
g_assert (i == N_LISTENERS);
278
panel_lockdown.initialized = TRUE;
282
panel_lockdown_finalize (void)
288
g_assert (panel_lockdown.initialized != FALSE);
290
client = panel_gconf_get_client ();
292
for (l = panel_lockdown.disabled_applets; l; l = l->next)
294
g_slist_free (panel_lockdown.disabled_applets);
295
panel_lockdown.disabled_applets = NULL;
297
for (i = 0; i < N_LISTENERS; i++) {
298
if (panel_lockdown.listeners [i])
299
gconf_client_notify_remove (client,
300
panel_lockdown.listeners [i]);
301
panel_lockdown.listeners [i] = 0;
304
gconf_client_remove_dir (client,
305
PANEL_GLOBAL_LOCKDOWN_DIR,
308
gconf_client_remove_dir (client,
309
DESKTOP_GNOME_LOCKDOWN_DIR,
312
for (l = panel_lockdown.closures; l; l = l->next)
313
g_closure_unref (l->data);
314
g_slist_free (panel_lockdown.closures);
315
panel_lockdown.closures = NULL;
317
panel_lockdown.initialized = FALSE;
321
panel_lockdown_get_locked_down (void)
323
g_assert (panel_lockdown.initialized != FALSE);
325
return panel_lockdown.locked_down;
329
panel_lockdown_get_disable_command_line (void)
331
g_assert (panel_lockdown.initialized != FALSE);
333
return panel_lockdown.disable_command_line;
337
panel_lockdown_get_disable_lock_screen (void)
339
g_assert (panel_lockdown.initialized != FALSE);
341
return panel_lockdown.disable_lock_screen;
345
panel_lockdown_get_disable_log_out (void)
347
g_assert (panel_lockdown.initialized != FALSE);
349
return panel_lockdown.disable_log_out;
353
panel_lockdown_get_disable_force_quit (void)
355
g_assert (panel_lockdown.initialized != FALSE);
357
return panel_lockdown.disable_force_quit;
361
panel_lockdown_is_applet_disabled (const char *iid)
365
g_assert (panel_lockdown.initialized != FALSE);
367
for (l = panel_lockdown.disabled_applets; l; l = l->next)
368
if (!strcmp (l->data, iid))
32
struct _PanelLockdownPrivate {
33
GSettings *desktop_settings;
34
GSettings *panel_settings;
37
gboolean disable_command_line;
38
gboolean disable_lock_screen;
39
gboolean disable_log_out;
40
gboolean disable_switch_user;
43
gboolean panels_locked_down;
44
gboolean disable_force_quit;
45
char **disabled_applets;
50
PROP_DISABLE_COMMAND_LINE,
51
PROP_DISABLE_LOCK_SCREEN,
53
PROP_DISABLE_SWITCH_USER,
54
PROP_PANELS_LOCKED_DOWN,
55
PROP_DISABLE_FORCE_QUIT
58
G_DEFINE_TYPE (PanelLockdown, panel_lockdown, G_TYPE_OBJECT);
61
_panel_lockdown_disabled_applets_changed (GSettings *settings,
63
PanelLockdown *lockdown)
65
if (lockdown->priv->disabled_applets)
66
g_strfreev (lockdown->priv->disabled_applets);
67
lockdown->priv->disabled_applets = g_settings_get_strv (lockdown->priv->panel_settings,
68
PANEL_LOCKDOWN_DISABLED_APPLETS_KEY);
72
panel_lockdown_constructor (GType type,
73
guint n_construct_properties,
74
GObjectConstructParam *construct_properties)
77
PanelLockdown *lockdown;
79
obj = G_OBJECT_CLASS (panel_lockdown_parent_class)->constructor (type,
80
n_construct_properties,
81
construct_properties);
83
lockdown = PANEL_LOCKDOWN (obj);
85
lockdown->priv->desktop_settings = g_settings_new (PANEL_DESKTOP_LOCKDOWN_SCHEMA);
86
lockdown->priv->panel_settings = g_settings_new (PANEL_LOCKDOWN_SCHEMA);
88
g_settings_bind (lockdown->priv->desktop_settings,
89
PANEL_DESKTOP_DISABLE_COMMAND_LINE_KEY,
91
"disable-command-line",
94
g_settings_bind (lockdown->priv->desktop_settings,
95
PANEL_DESKTOP_DISABLE_LOCK_SCREEN_KEY,
97
"disable-lock-screen",
100
g_settings_bind (lockdown->priv->desktop_settings,
101
PANEL_DESKTOP_DISABLE_LOG_OUT_KEY,
104
G_SETTINGS_BIND_GET);
106
g_settings_bind (lockdown->priv->desktop_settings,
107
PANEL_DESKTOP_DISABLE_SWITCH_USER_KEY,
109
"disable-switch-user",
110
G_SETTINGS_BIND_GET);
112
g_settings_bind (lockdown->priv->panel_settings,
113
PANEL_LOCKDOWN_COMPLETE_LOCKDOWN_KEY,
115
"panels-locked-down",
116
G_SETTINGS_BIND_GET);
118
g_settings_bind (lockdown->priv->panel_settings,
119
PANEL_LOCKDOWN_DISABLE_FORCE_QUIT_KEY,
121
"disable-force-quit",
122
G_SETTINGS_BIND_GET);
124
g_signal_connect (lockdown->priv->panel_settings,
125
"changed::"PANEL_LOCKDOWN_DISABLED_APPLETS_KEY,
126
G_CALLBACK (_panel_lockdown_disabled_applets_changed),
129
_panel_lockdown_disabled_applets_changed (lockdown->priv->panel_settings,
130
PANEL_LOCKDOWN_DISABLED_APPLETS_KEY,
137
_panel_lockdown_set_property_helper (PanelLockdown *lockdown,
140
const char *property)
144
new = g_value_get_boolean (value);
149
g_object_notify (G_OBJECT (lockdown), property);
153
panel_lockdown_set_property (GObject *object,
158
PanelLockdown *lockdown;
160
g_return_if_fail (PANEL_IS_LOCKDOWN (object));
162
lockdown = PANEL_LOCKDOWN (object);
165
case PROP_DISABLE_COMMAND_LINE:
166
_panel_lockdown_set_property_helper (lockdown,
167
&lockdown->priv->disable_command_line,
169
"disable-command-line");
171
case PROP_DISABLE_LOCK_SCREEN:
172
_panel_lockdown_set_property_helper (lockdown,
173
&lockdown->priv->disable_lock_screen,
175
"disable-lock-screen");
177
case PROP_DISABLE_LOG_OUT:
178
_panel_lockdown_set_property_helper (lockdown,
179
&lockdown->priv->disable_log_out,
183
case PROP_DISABLE_SWITCH_USER:
184
_panel_lockdown_set_property_helper (lockdown,
185
&lockdown->priv->disable_switch_user,
187
"disable-switch-user");
189
case PROP_PANELS_LOCKED_DOWN:
190
_panel_lockdown_set_property_helper (lockdown,
191
&lockdown->priv->panels_locked_down,
193
"panels-locked-down");
195
case PROP_DISABLE_FORCE_QUIT:
196
_panel_lockdown_set_property_helper (lockdown,
197
&lockdown->priv->disable_force_quit,
199
"disable-force-quit");
202
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
208
panel_lockdown_get_property (GObject *object,
213
PanelLockdown *lockdown;
215
g_return_if_fail (PANEL_IS_LOCKDOWN (object));
217
lockdown = PANEL_LOCKDOWN (object);
220
case PROP_DISABLE_COMMAND_LINE:
221
g_value_set_boolean (value, lockdown->priv->disable_command_line);
223
case PROP_DISABLE_LOCK_SCREEN:
224
g_value_set_boolean (value, lockdown->priv->disable_lock_screen);
226
case PROP_DISABLE_LOG_OUT:
227
g_value_set_boolean (value, lockdown->priv->disable_log_out);
229
case PROP_DISABLE_SWITCH_USER:
230
g_value_set_boolean (value, lockdown->priv->disable_switch_user);
232
case PROP_PANELS_LOCKED_DOWN:
233
g_value_set_boolean (value, lockdown->priv->panels_locked_down);
235
case PROP_DISABLE_FORCE_QUIT:
236
g_value_set_boolean (value, lockdown->priv->disable_force_quit);
239
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
245
panel_lockdown_dispose (GObject *object)
247
PanelLockdown *lockdown;
249
lockdown = PANEL_LOCKDOWN (object);
251
if (lockdown->priv->desktop_settings)
252
g_object_unref (lockdown->priv->desktop_settings);
253
lockdown->priv->desktop_settings = NULL;
255
if (lockdown->priv->panel_settings)
256
g_object_unref (lockdown->priv->panel_settings);
257
lockdown->priv->panel_settings = NULL;
259
if (lockdown->priv->disabled_applets)
260
g_strfreev (lockdown->priv->disabled_applets);
261
lockdown->priv->disabled_applets = NULL;
263
G_OBJECT_CLASS (panel_lockdown_parent_class)->dispose (object);
267
panel_lockdown_init (PanelLockdown *lockdown)
269
lockdown->priv = G_TYPE_INSTANCE_GET_PRIVATE (lockdown,
271
PanelLockdownPrivate);
275
panel_lockdown_class_init (PanelLockdownClass *lockdown_class)
277
GObjectClass *gobject_class;
279
gobject_class = G_OBJECT_CLASS (lockdown_class);
281
gobject_class->constructor = panel_lockdown_constructor;
282
gobject_class->set_property = panel_lockdown_set_property;
283
gobject_class->get_property = panel_lockdown_get_property;
284
gobject_class->dispose = panel_lockdown_dispose;
286
g_object_class_install_property (
288
PROP_DISABLE_COMMAND_LINE,
289
g_param_spec_boolean (
290
"disable-command-line",
291
"Disable command line",
292
"Whether command line is disabled or not",
294
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
296
g_object_class_install_property (
298
PROP_DISABLE_LOCK_SCREEN,
299
g_param_spec_boolean (
300
"disable-lock-screen",
301
"Disable lock screen",
302
"Whether lock screen is disabled or not",
304
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
306
g_object_class_install_property (
308
PROP_DISABLE_LOG_OUT,
309
g_param_spec_boolean (
312
"Whether log out is disabled or not",
314
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
316
g_object_class_install_property (
318
PROP_DISABLE_SWITCH_USER,
319
g_param_spec_boolean (
320
"disable-switch-user",
321
"Disable user switching",
322
"Whether user switching is disabled or not",
324
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
326
g_object_class_install_property (
328
PROP_PANELS_LOCKED_DOWN,
329
g_param_spec_boolean (
330
"panels-locked-down",
331
"Full locked down of panels",
332
"Whether panels are fully locked down or not",
334
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
336
g_object_class_install_property (
338
PROP_DISABLE_FORCE_QUIT,
339
g_param_spec_boolean (
340
"disable-force-quit",
341
"Disable force quit",
342
"Whether force quit is disabled or not",
344
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
346
g_type_class_add_private (lockdown_class,
347
sizeof (PanelLockdownPrivate));
351
panel_lockdown_is_applet_disabled (PanelLockdown *lockdown,
356
g_return_val_if_fail (PANEL_IS_LOCKDOWN (lockdown), TRUE);
358
for (i = 0; lockdown->priv->disabled_applets[i] != NULL; i++)
359
if (g_strcmp0 (lockdown->priv->disabled_applets[i], iid) == 0)
375
panel_lockdown_notify_find (GSList *closures,
376
GCallback callback_func,
381
for (l = closures; l; l = l->next) {
382
GCClosure *cclosure = l->data;
383
GClosure *closure = l->data;
385
if (closure->data == user_data &&
386
cclosure->callback == callback_func)
366
panel_lockdown_get_disable_command_line (PanelLockdown *lockdown)
368
g_return_val_if_fail (PANEL_IS_LOCKDOWN (lockdown), TRUE);
370
return lockdown->priv->disable_command_line;
374
panel_lockdown_get_disable_lock_screen (PanelLockdown *lockdown)
376
g_return_val_if_fail (PANEL_IS_LOCKDOWN (lockdown), TRUE);
378
return lockdown->priv->disable_lock_screen;
382
panel_lockdown_get_disable_log_out (PanelLockdown *lockdown)
384
g_return_val_if_fail (PANEL_IS_LOCKDOWN (lockdown), TRUE);
386
return lockdown->priv->disable_log_out;
390
panel_lockdown_get_disable_switch_user (PanelLockdown *lockdown)
392
g_return_val_if_fail (PANEL_IS_LOCKDOWN (lockdown), TRUE);
394
return lockdown->priv->disable_switch_user;
398
panel_lockdown_get_panels_locked_down (PanelLockdown *lockdown)
400
g_return_val_if_fail (PANEL_IS_LOCKDOWN (lockdown), TRUE);
402
return lockdown->priv->panels_locked_down;
406
panel_lockdown_get_disable_force_quit (PanelLockdown *lockdown)
408
g_return_val_if_fail (PANEL_IS_LOCKDOWN (lockdown), TRUE);
410
return lockdown->priv->disable_force_quit;
414
PanelLockdown *lockdown;
415
PanelLockdownNotify callback;
416
gpointer callback_data;
418
} PanelLockdownNotifyData;
421
_panel_lockdown_notify_data_destroy (gpointer data)
423
PanelLockdownNotifyData *notify_data = data;
425
g_signal_handler_disconnect (notify_data->lockdown,
426
notify_data->handler_id);
428
g_slice_free (PanelLockdownNotifyData, notify_data);
432
panel_lockdown_on_notify_notified (GObject *gobject,
436
PanelLockdownNotifyData *notify_data = user_data;
438
g_assert (notify_data->callback != NULL);
439
g_assert ((gpointer) notify_data->lockdown == (gpointer) gobject);
441
notify_data->callback (notify_data->lockdown,
442
notify_data->callback_data);
445
/* An object can only call this once per property.
446
* User NULL property to notify for all lockdown changes. (except disabled_applets) */
448
panel_lockdown_on_notify (PanelLockdown *lockdown,
449
const char *property,
450
GObject *object_while_alive,
451
PanelLockdownNotify callback,
452
gpointer callback_data)
454
PanelLockdownNotifyData *notify_data;
458
g_return_if_fail (PANEL_IS_LOCKDOWN (lockdown));
459
g_return_if_fail (G_IS_OBJECT (object_while_alive));
460
g_return_if_fail (callback != NULL);
462
notify_data = g_slice_new0 (PanelLockdownNotifyData);
464
notify_data->lockdown = lockdown;
465
notify_data->callback = callback;
466
notify_data->callback_data = callback_data;
467
notify_data->handler_id = 0;
470
key = g_strdup_printf ("panel-lockdown-%s", property);
472
key = g_strdup_printf ("panel-lockdown");
473
g_object_set_data_full (object_while_alive, key,
475
_panel_lockdown_notify_data_destroy);
479
signal_name = g_strdup_printf ("notify::%s", property);
481
signal_name = g_strdup_printf ("notify");
482
notify_data->handler_id = g_signal_connect (lockdown, signal_name,
483
G_CALLBACK (panel_lockdown_on_notify_notified),
485
g_free (signal_name);
489
panel_lockdown_get (void)
491
static PanelLockdown *shared_lockdown = NULL;
493
if (shared_lockdown == NULL) {
494
shared_lockdown = g_object_new (PANEL_TYPE_LOCKDOWN, NULL);
495
panel_cleanup_register (panel_cleanup_unref_and_nullify,
394
marshal_user_data (GClosure *closure,
395
GValue *return_value,
396
guint n_param_values,
397
const GValue *param_values,
398
gpointer invocation_hint,
399
gpointer marshal_data)
401
GCClosure *cclosure = (GCClosure*) closure;
403
g_return_if_fail (cclosure->callback != NULL);
404
g_return_if_fail (n_param_values == 0);
406
((void (*) (gpointer *))cclosure->callback) (closure->data);
410
panel_lockdown_notify_add (GCallback callback_func,
415
g_assert (panel_lockdown_notify_find (panel_lockdown.closures,
419
closure = g_cclosure_new (callback_func, user_data, NULL);
420
g_closure_set_marshal (closure, marshal_user_data);
422
panel_lockdown.closures = g_slist_append (panel_lockdown.closures,
427
panel_lockdown_notify_remove (GCallback callback_func,
432
closure = panel_lockdown_notify_find (panel_lockdown.closures,
436
g_assert (closure != NULL);
438
panel_lockdown.closures = g_slist_remove (panel_lockdown.closures,
441
g_closure_unref (closure);
499
return shared_lockdown;
503
panel_lockdown_get_disable_command_line_s (void)
505
return panel_lockdown_get_disable_command_line (panel_lockdown_get ());
509
panel_lockdown_get_disable_lock_screen_s (void)
511
return panel_lockdown_get_disable_lock_screen (panel_lockdown_get ());
515
panel_lockdown_get_disable_log_out_s (void)
517
return panel_lockdown_get_disable_log_out (panel_lockdown_get ());
521
panel_lockdown_get_disable_switch_user_s (void)
523
return panel_lockdown_get_disable_switch_user (panel_lockdown_get ());
527
panel_lockdown_get_panels_locked_down_s (void)
529
return panel_lockdown_get_panels_locked_down (panel_lockdown_get ());
533
panel_lockdown_get_not_panels_locked_down_s (void)
535
return !panel_lockdown_get_panels_locked_down (panel_lockdown_get ());
539
panel_lockdown_get_disable_force_quit_s (void)
541
return panel_lockdown_get_disable_force_quit (panel_lockdown_get ());