1 19171 mattman /jds/bin/diff -uprN gnome-panel-2.27.91.old/gnome-panel/panel-addto.c gnome-panel-2.27.91/gnome-panel/panel-addto.c 2 19171 mattman --- gnome-panel-2.27.91.old/gnome-panel/panel-addto.c 2009-08-26 17:27:48.018970000 +0100 3 19171 mattman +++ gnome-panel-2.27.91/gnome-panel/panel-addto.c 2009-08-26 17:33:56.113982000 +0100 4 18706 mattman @@ -571,9 +571,10 @@ panel_addto_make_applet_model (PanelAddt 5 12125 gman dialog, NULL); 6 12125 gman } 7 12125 gman 8 12125 gman -static void panel_addto_make_application_list (GSList **parent_list, 9 12125 gman +static gint panel_addto_make_application_list (GSList **parent_list, 10 12125 gman GMenuTreeDirectory *directory, 11 12125 gman const char *filename); 12 12125 gman +static void panel_addto_dialog_free_item_info (PanelAddtoItemInfo *item_info); 13 12125 gman 14 12125 gman static void 15 12125 gman panel_addto_prepend_directory (GSList **parent_list, 16 18706 mattman @@ -581,6 +582,7 @@ panel_addto_prepend_directory (GSList 17 12125 gman const char *filename) 18 12125 gman { 19 12125 gman PanelAddtoAppList *data; 20 12125 gman + gint entries_added = 0; 21 12125 gman 22 12125 gman data = g_new0 (PanelAddtoAppList, 1); 23 12125 gman 24 18706 mattman @@ -600,9 +602,16 @@ panel_addto_prepend_directory (GSList 25 12125 gman * So the iid is built when we select the row. 26 12125 gman */ 27 12125 gman 28 12125 gman - *parent_list = g_slist_prepend (*parent_list, data); 29 12125 gman - 30 12125 gman - panel_addto_make_application_list (&data->children, directory, filename); 31 12125 gman + entries_added = panel_addto_make_application_list (&data->children, directory, filename); 32 12125 gman + if (entries_added > 0) { 33 12125 gman + /*Only prepend if there are entries */ 34 12125 gman + *parent_list = g_slist_prepend (*parent_list, data); 35 12125 gman + } 36 12125 gman + else { 37 12125 gman + /* Free data as not being appended */ 38 12125 gman + panel_addto_dialog_free_item_info (&data->item_info); 39 12125 gman + g_free (data); 40 12125 gman + } 41 12125 gman } 42 12125 gman 43 12125 gman static void 44 18706 mattman @@ -624,12 +633,13 @@ panel_addto_prepend_entry (GSList 45 12125 gman *parent_list = g_slist_prepend (*parent_list, data); 46 12125 gman } 47 12125 gman 48 12125 gman -static void 49 12125 gman +static gint 50 12125 gman panel_addto_prepend_alias (GSList **parent_list, 51 12125 gman GMenuTreeAlias *alias, 52 12125 gman const char *filename) 53 12125 gman { 54 12125 gman GMenuTreeItem *aliased_item; 55 12125 gman + gint entry = 0; 56 12125 gman 57 12125 gman aliased_item = gmenu_tree_alias_get_item (alias); 58 12125 gman 59 18706 mattman @@ -641,9 +651,14 @@ panel_addto_prepend_alias (GSList 60 12125 gman break; 61 12125 gman 62 12125 gman case GMENU_TREE_ITEM_ENTRY: 63 12125 gman - panel_addto_prepend_entry (parent_list, 64 12125 gman - GMENU_TREE_ENTRY (aliased_item), 65 12125 gman - filename); 66 14681 mattman + 67 14681 mattman + if (panel_lockdown_is_allowed_menu_entry 68 14681 mattman + (GMENU_TREE_ENTRY (aliased_item))) { 69 14681 mattman + panel_addto_prepend_entry (parent_list, 70 14681 mattman + GMENU_TREE_ENTRY (aliased_item), 71 14681 mattman + filename); 72 14681 mattman + entry = 1; 73 14681 mattman + } 74 12125 gman break; 75 12125 gman 76 12125 gman default: 77 18706 mattman @@ -651,15 +666,17 @@ panel_addto_prepend_alias (GSList 78 12125 gman } 79 12125 gman 80 12125 gman gmenu_tree_item_unref (aliased_item); 81 12125 gman + return entry; 82 12125 gman } 83 12125 gman 84 12125 gman -static void 85 12125 gman +static gint 86 12125 gman panel_addto_make_application_list (GSList **parent_list, 87 12125 gman GMenuTreeDirectory *directory, 88 12125 gman const char *filename) 89 12125 gman { 90 12125 gman GSList *items; 91 12125 gman GSList *l; 92 12125 gman + gint number_entries = 0; 93 12125 gman 94 12125 gman items = gmenu_tree_directory_get_contents (directory); 95 12125 gman 96 18706 mattman @@ -670,11 +687,15 @@ panel_addto_make_application_list (GSLis 97 12125 gman break; 98 12125 gman 99 12125 gman case GMENU_TREE_ITEM_ENTRY: 100 12125 gman - panel_addto_prepend_entry (parent_list, l->data, filename); 101 14681 mattman + if (panel_lockdown_is_allowed_menu_entry (l->data)) { 102 14681 mattman + panel_addto_prepend_entry (parent_list, l->data, filename); 103 14681 mattman + number_entries = number_entries + 1; 104 14681 mattman + } 105 12125 gman break; 106 12125 gman 107 12125 gman case GMENU_TREE_ITEM_ALIAS: 108 12125 gman - panel_addto_prepend_alias (parent_list, l->data, filename); 109 12125 gman + number_entries = number_entries + 110 12125 gman + panel_addto_prepend_alias (parent_list, l->data, filename); 111 12125 gman break; 112 12125 gman 113 12125 gman default: 114 18706 mattman @@ -687,6 +708,8 @@ panel_addto_make_application_list (GSLis 115 12125 gman g_slist_free (items); 116 12125 gman 117 12125 gman *parent_list = g_slist_reverse (*parent_list); 118 12125 gman + 119 12125 gman + return number_entries; 120 12125 gman } 121 12125 gman 122 12125 gman static void 123 19171 mattman /jds/bin/diff -uprN gnome-panel-2.27.91.old/gnome-panel/panel-lockdown.h gnome-panel-2.27.91/gnome-panel/panel-lockdown.h 124 19171 mattman --- gnome-panel-2.27.91.old/gnome-panel/panel-lockdown.h 2009-08-26 17:27:47.990078000 +0100 125 19171 mattman +++ gnome-panel-2.27.91/gnome-panel/panel-lockdown.h 2009-08-26 17:34:10.921311000 +0100 126 15098 mattman @@ -25,8 +25,11 @@ 127 15098 mattman #ifndef __PANEL_LOCKDOWN_H__ 128 15098 mattman #define __PANEL_LOCKDOWN_H__ 129 15098 mattman 130 15098 mattman +#include <libgnome/gnome-desktop-item.h> 131 15098 mattman #include <glib.h> 132 15098 mattman #include <glib-object.h> 133 15098 mattman +#include <gmenu-tree.h> 134 15098 mattman +#include "launcher.h" 135 15098 mattman 136 15098 mattman G_BEGIN_DECLS 137 15098 mattman 138 18706 mattman @@ -39,13 +42,56 @@ gboolean panel_lockdown_get_disable_lock 139 15098 mattman gboolean panel_lockdown_get_disable_log_out (void); 140 15098 mattman gboolean panel_lockdown_get_disable_force_quit (void); 141 15098 mattman 142 15098 mattman +gboolean panel_lockdown_get_restrict_application_launching (void); 143 15098 mattman +GSList *panel_lockdown_get_allowed_applications (void); 144 15098 mattman + 145 15098 mattman gboolean panel_lockdown_is_applet_disabled (const char *iid); 146 15098 mattman +gboolean panel_lockdown_is_allowed_application (const gchar *app); 147 15098 mattman 148 15098 mattman void panel_lockdown_notify_add (GCallback callback_func, 149 15098 mattman gpointer user_data); 150 15098 mattman void panel_lockdown_notify_remove (GCallback callback_func, 151 15098 mattman gpointer user_data); 152 15098 mattman 153 15098 mattman +gchar *panel_lockdown_get_stripped_exec (const gchar *full_exec); 154 15098 mattman +gchar *panel_lockdown_get_exec_from_ditem (GnomeDesktopItem *ditem); 155 15098 mattman +gboolean panel_lockdown_ditem_in_allowed_applications (GnomeDesktopItem *ditem); 156 15098 mattman +gboolean panel_lockdown_is_disabled_command_line (const gchar *term_cmd); 157 15098 mattman + 158 15098 mattman +/** 159 15098 mattman + * Returns true if the ditem corresponds to an application whose use has been 160 15098 mattman + * disallowed by the administrator (tests whether restrictions are in place 161 15098 mattman + * and if the ditem matches the allowed applications list). 162 15098 mattman + */ 163 15098 mattman +gboolean panel_lockdown_is_forbidden_app (GnomeDesktopItem *ditem); 164 15098 mattman +/** 165 15098 mattman + * Returns true if the ditem corresponds to either an application whose use 166 15098 mattman + * has been disallowed by the administrator (same as previous function) or 167 15098 mattman + * a shell when command line use has been restricted. 168 15098 mattman + */ 169 15098 mattman +gboolean panel_lockdown_is_forbidden_ditem (GnomeDesktopItem *ditem); 170 15098 mattman +/** 171 15098 mattman + * Returns true if the command line corresponds to an application whose use 172 15098 mattman + * has been disallowed by the administrator. 173 15098 mattman + */ 174 15098 mattman +gboolean panel_lockdown_is_forbidden_command (const gchar *command); 175 15098 mattman + 176 15098 mattman +/** 177 15098 mattman + * Returns true if the menu entry corresponds to an application whose use 178 15098 mattman + * has been allowed by the administrator. 179 15098 mattman + */ 180 15098 mattman +gboolean panel_lockdown_is_allowed_menu_entry (GMenuTreeEntry *entry); 181 15098 mattman + 182 15098 mattman +/** 183 15098 mattman + * Returns true if the launcher application has been disallowed by the administrator. 184 15098 mattman + */ 185 15098 mattman +gboolean panel_lockdown_is_forbidden_launcher (Launcher *launcher); 186 15098 mattman + 187 15098 mattman +/** 188 15098 mattman + * Returns true if the key_file application has been disallowed by the administrator. 189 15098 mattman + */ 190 15098 mattman +gboolean panel_lockdown_is_forbidden_key_file (GKeyFile *key_file); 191 15098 mattman + 192 15098 mattman G_END_DECLS 193 15098 mattman 194 15098 mattman #endif /* __PANEL_LOCKDOWN_H__ */ 195 19171 mattman /jds/bin/diff -uprN gnome-panel-2.27.91.old/gnome-panel/panel-menu-items.h gnome-panel-2.27.91/gnome-panel/panel-menu-items.h 196 19171 mattman --- gnome-panel-2.27.91.old/gnome-panel/panel-menu-items.h 2009-08-26 17:27:47.989560000 +0100 197 19171 mattman +++ gnome-panel-2.27.91/gnome-panel/panel-menu-items.h 2009-08-26 17:34:22.060144000 +0100 198 18706 mattman @@ -90,6 +90,8 @@ void panel_desktop_menu_item_set_panel ( 199 15098 mattman void panel_menu_items_append_lock_logout (GtkWidget *menu); 200 15098 mattman void panel_menu_item_activate_desktop_file (GtkWidget *menuitem, 201 15098 mattman const char *path); 202 15098 mattman +void panel_place_menu_item_recreate_menu (GtkWidget *widget); 203 15098 mattman +void panel_desktop_menu_item_recreate_menu (PanelDesktopMenuItem *desktop_item); 204 15098 mattman 205 15098 mattman G_END_DECLS 206 15098 mattman 207 19171 mattman /jds/bin/diff -uprN gnome-panel-2.27.91.old/gnome-panel/Makefile.am gnome-panel-2.27.91/gnome-panel/Makefile.am 208 19171 mattman --- gnome-panel-2.27.91.old/gnome-panel/Makefile.am 2009-08-26 17:27:47.958497000 +0100 209 19171 mattman +++ gnome-panel-2.27.91/gnome-panel/Makefile.am 2009-08-26 17:34:33.698263000 +0100 210 19171 mattman @@ -165,6 +165,8 @@ gnome_desktop_item_edit_SOURCES = \ 211 15098 mattman panel-ditem-editor.c \ 212 15098 mattman panel-marshal.c \ 213 15098 mattman panel-util.c \ 214 15098 mattman + panel-lockdown.c \ 215 15098 mattman + panel-gconf.c \ 216 15098 mattman xstuff.c 217 15098 mattman 218 15098 mattman gnome_desktop_item_edit_LDFLAGS = -export-dynamic 219 19171 mattman /jds/bin/diff -uprN gnome-panel-2.27.91.old/gnome-panel/panel-action-button.c gnome-panel-2.27.91/gnome-panel/panel-action-button.c 220 19171 mattman --- gnome-panel-2.27.91.old/gnome-panel/panel-action-button.c 2009-08-26 17:27:47.940413000 +0100 221 19171 mattman +++ gnome-panel-2.27.91/gnome-panel/panel-action-button.c 2009-08-26 17:40:26.368224000 +0100 222 18706 mattman @@ -207,8 +207,11 @@ panel_action_shutdown_reboot_is_disabled 223 15098 mattman static void 224 15098 mattman panel_action_run_program (GtkWidget *widget) 225 15098 mattman { 226 15098 mattman - panel_run_dialog_present (gtk_widget_get_screen (widget), 227 15098 mattman - gtk_get_current_event_time ()); 228 15098 mattman + if (!panel_lockdown_get_restrict_application_launching () && 229 15098 mattman + !panel_lockdown_get_disable_command_line ()) { 230 15098 mattman + panel_run_dialog_present (gtk_widget_get_screen (widget), 231 15098 mattman + gtk_get_current_event_time ()); 232 15098 mattman + } 233 15098 mattman } 234 15098 mattman 235 15098 mattman /* Search For Files 236 19171 mattman /jds/bin/diff -uprN gnome-panel-2.27.91.old/gnome-panel/panel-menu-bar.c gnome-panel-2.27.91/gnome-panel/panel-menu-bar.c 237 19171 mattman --- gnome-panel-2.27.91.old/gnome-panel/panel-menu-bar.c 2009-08-26 17:27:47.961196000 +0100 238 19171 mattman +++ gnome-panel-2.27.91/gnome-panel/panel-menu-bar.c 2009-08-26 17:35:05.241962000 +0100 239 18706 mattman @@ -132,6 +132,32 @@ panel_menu_bar_setup_tooltip (PanelMenuB 240 15098 mattman } 241 15098 mattman 242 15098 mattman static void 243 15098 mattman +panel_menu_bar_parent_set (GtkWidget *widget, 244 15098 mattman + GtkWidget *previous_parent); 245 15098 mattman + 246 15098 mattman +static void 247 15098 mattman +panel_menubar_recreate_menus (PanelMenuBar *menubar) 248 15098 mattman +{ 249 15098 mattman + if (menubar->priv->applications_menu != NULL) { 250 15098 mattman + while (GTK_MENU_SHELL (menubar->priv->applications_menu)->children) { 251 15098 mattman + gtk_widget_destroy ( 252 15098 mattman + GTK_MENU_SHELL (menubar->priv->applications_menu)->children->data); 253 15098 mattman + } 254 15098 mattman + menubar->priv->applications_menu = 255 19383 mattman + create_applications_menu ("applications.menu", NULL, TRUE); 256 15098 mattman + gtk_menu_item_set_submenu 257 15098 mattman + (GTK_MENU_ITEM (menubar->priv->applications_item), 258 15098 mattman + menubar->priv->applications_menu); 259 15098 mattman + 260 15098 mattman + panel_place_menu_item_recreate_menu(menubar->priv->places_item); 261 15098 mattman + panel_desktop_menu_item_recreate_menu( 262 15098 mattman + (PanelDesktopMenuItem *)menubar->priv->desktop_item); 263 15098 mattman + 264 15098 mattman + panel_menu_bar_parent_set ((GtkWidget *)menubar, NULL); 265 15098 mattman + } 266 15098 mattman +} 267 15098 mattman + 268 15098 mattman +static void 269 15098 mattman panel_menu_bar_init (PanelMenuBar *menubar) 270 15098 mattman { 271 15098 mattman GtkWidget *image; 272 19171 mattman @@ -164,6 +190,8 @@ panel_menu_bar_init (PanelMenuBar *menub 273 15098 mattman menubar->priv->desktop_item); 274 15098 mattman 275 15098 mattman panel_menu_bar_setup_tooltip (menubar); 276 15098 mattman + panel_lockdown_notify_add (G_CALLBACK (panel_menubar_recreate_menus), 277 15098 mattman + menubar); 278 15098 mattman 279 15098 mattman panel_menu_bar_update_text_gravity (menubar); 280 15098 mattman g_signal_connect (menubar, "screen-changed", 281 19171 mattman /jds/bin/diff -uprN gnome-panel-2.27.91.old/gnome-panel/gnome-desktop-item-edit.c gnome-panel-2.27.91/gnome-panel/gnome-desktop-item-edit.c 282 19171 mattman --- gnome-panel-2.27.91.old/gnome-panel/gnome-desktop-item-edit.c 2009-08-26 17:27:48.019780000 +0100 283 19171 mattman +++ gnome-panel-2.27.91/gnome-panel/gnome-desktop-item-edit.c 2009-08-26 17:41:37.134321000 +0100 284 18706 mattman @@ -21,7 +21,6 @@ GConfClient *panel_gconf_get_client (voi 285 15098 mattman #include "panel-config-global.h" 286 15098 mattman gboolean panel_global_config_get_tooltips_enabled (void) { return FALSE; } 287 15098 mattman #include "panel-lockdown.h" 288 15098 mattman -gboolean panel_lockdown_get_disable_lock_screen (void) { return FALSE; } 289 15098 mattman 290 15098 mattman static int dialogs = 0; 291 15098 mattman static gboolean create_new = FALSE; 292 18706 mattman @@ -107,6 +106,8 @@ main (int argc, char * argv[]) 293 15098 mattman bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); 294 15098 mattman textdomain (GETTEXT_PACKAGE); 295 15098 mattman 296 15098 mattman + panel_lockdown_init (); 297 15098 mattman + 298 15098 mattman context = g_option_context_new (N_("- Edit .desktop files")); 299 15098 mattman g_option_context_set_translation_domain (context, GETTEXT_PACKAGE); 300 15098 mattman g_option_context_add_main_entries (context, options, GETTEXT_PACKAGE); 301 18706 mattman @@ -226,5 +227,7 @@ main (int argc, char * argv[]) 302 15098 mattman 303 15098 mattman g_object_unref (program); 304 15098 mattman 305 15098 mattman + panel_lockdown_finalize (); 306 15098 mattman + 307 15098 mattman return 0; 308 15098 mattman } 309 19171 mattman /jds/bin/diff -uprN gnome-panel-2.27.91.old/gnome-panel/panel-lockdown.c gnome-panel-2.27.91/gnome-panel/panel-lockdown.c 310 19171 mattman --- gnome-panel-2.27.91.old/gnome-panel/panel-lockdown.c 2009-08-26 17:27:47.989262000 +0100 311 19171 mattman +++ gnome-panel-2.27.91/gnome-panel/panel-lockdown.c 2009-08-26 17:50:44.869236000 +0100 312 8949 mattk @@ -28,13 +28,16 @@ 313 8947 mattk 314 7958 cm122549 #include <string.h> 315 7958 cm122549 #include "panel-gconf.h" 316 14682 mattman +#include <libpanel-util/panel-keyfile.h> 317 7958 cm122549 318 7958 cm122549 -#define N_LISTENERS 6 319 7958 cm122549 +#define N_LISTENERS 8 320 7958 cm122549 321 7958 cm122549 #define PANEL_GLOBAL_LOCKDOWN_DIR "/apps/panel/global" 322 7958 cm122549 #define DESKTOP_GNOME_LOCKDOWN_DIR "/desktop/gnome/lockdown" 323 7958 cm122549 #define PANEL_GLOBAL_LOCKED_DOWN_KEY PANEL_GLOBAL_LOCKDOWN_DIR "/locked_down" 324 7958 cm122549 #define DISABLE_COMMAND_LINE_KEY DESKTOP_GNOME_LOCKDOWN_DIR "/disable_command_line" 325 10405 mattman +#define RESTRICT_APPLICATION_LAUNCHING_KEY DESKTOP_GNOME_LOCKDOWN_DIR "/restrict_application_launching" 326 7958 cm122549 +#define ALLOWED_APPLICATIONS_KEY DESKTOP_GNOME_LOCKDOWN_DIR "/allowed_applications" 327 19171 mattman #define DISABLE_LOCK_SCREEN_KEY DESKTOP_GNOME_LOCKDOWN_DIR "/disable_lock_screen" 328 7958 cm122549 #define DISABLE_LOG_OUT_KEY PANEL_GLOBAL_LOCKDOWN_DIR "/disable_log_out" 329 7958 cm122549 #define DISABLE_FORCE_QUIT_KEY PANEL_GLOBAL_LOCKDOWN_DIR "/disable_force_quit" 330 18706 mattman @@ -48,6 +51,9 @@ typedef struct { 331 7958 cm122549 guint disable_lock_screen : 1; 332 7958 cm122549 guint disable_log_out : 1; 333 7958 cm122549 guint disable_force_quit : 1; 334 7958 cm122549 + guint restrict_application_launching : 1; 335 15098 mattman + 336 15098 mattman + GSList *allowed_applications; 337 7958 cm122549 338 7958 cm122549 GSList *disabled_applets; 339 7958 cm122549 340 18706 mattman @@ -56,6 +62,12 @@ typedef struct { 341 7958 cm122549 GSList *closures; 342 7958 cm122549 } PanelLockdown; 343 7958 cm122549 344 7958 cm122549 +static const gchar *command_line_execs[] = { 345 7958 cm122549 + "/usr/bin/gnome-terminal", 346 7958 cm122549 + "/usr/bin/xterm" 347 7958 cm122549 +}; 348 7958 cm122549 +#define NUMBER_COMMAND_LINE_EXECS 2 349 7958 cm122549 + 350 7958 cm122549 static PanelLockdown panel_lockdown = { 0, }; 351 7958 cm122549 352 7958 cm122549 353 18706 mattman @@ -63,9 +75,17 @@ static inline void 354 7958 cm122549 panel_lockdown_invoke_closures (PanelLockdown *lockdown) 355 7958 cm122549 { 356 7958 cm122549 GSList *l; 357 8947 mattk + GSList *copy = NULL; 358 7958 cm122549 359 7958 cm122549 - for (l = lockdown->closures; l; l = l->next) 360 10405 mattman + copy = g_slist_copy (lockdown->closures); 361 8947 mattk + for (l = copy; l != NULL; l = l->next) { 362 10405 mattman + if (g_slist_find (lockdown->closures, l->data)) { 363 10405 mattman + g_closure_ref (l->data); 364 7958 cm122549 g_closure_invoke (l->data, NULL, 0, NULL, NULL); 365 10405 mattman + g_closure_unref (l->data); 366 10405 mattman + } 367 10405 mattman + } 368 8947 mattk + g_slist_free (copy); 369 7958 cm122549 } 370 7958 cm122549 371 7958 cm122549 static void 372 18706 mattman @@ -166,6 +186,50 @@ disabled_applets_notify (GConfClient * 373 7958 cm122549 panel_lockdown_invoke_closures (lockdown); 374 7958 cm122549 } 375 7958 cm122549 376 7958 cm122549 +static void 377 7958 cm122549 +restrict_application_launching_notify (GConfClient *client, 378 7958 cm122549 + guint cnxn_id, 379 7958 cm122549 + GConfEntry *entry, 380 7958 cm122549 + PanelLockdown *lockdown) 381 7958 cm122549 +{ 382 8947 mattk + if (!entry->value || entry->value->type != GCONF_VALUE_BOOL) 383 8947 mattk + return; 384 7958 cm122549 + 385 8947 mattk + lockdown->restrict_application_launching = 386 8947 mattk + gconf_value_get_bool (entry->value); 387 7958 cm122549 + 388 8947 mattk + panel_lockdown_invoke_closures (lockdown); 389 7958 cm122549 +} 390 7958 cm122549 + 391 7958 cm122549 + 392 7958 cm122549 +static void 393 7958 cm122549 +allowed_applications_notify (GConfClient *client, 394 7958 cm122549 + guint cnxn_id, 395 7958 cm122549 + GConfEntry *entry, 396 7958 cm122549 + PanelLockdown *lockdown) 397 7958 cm122549 +{ 398 8947 mattk + GSList *l; 399 7958 cm122549 + 400 8947 mattk + if (!entry->value || entry->value->type != GCONF_VALUE_LIST || 401 8947 mattk + gconf_value_get_list_type (entry->value) != GCONF_VALUE_STRING) 402 8947 mattk + return; 403 7958 cm122549 + 404 8947 mattk + for (l = lockdown->allowed_applications; l; l = l->next) 405 8947 mattk + g_free (l->data); 406 8947 mattk + g_slist_free (lockdown->allowed_applications); 407 8947 mattk + lockdown->allowed_applications = NULL; 408 7958 cm122549 + 409 8947 mattk + for (l = gconf_value_get_list (entry->value); l; l = l->next) { 410 8947 mattk + const char *iid = gconf_value_get_string (l->data); 411 7958 cm122549 + 412 8947 mattk + lockdown->allowed_applications = 413 7958 cm122549 + g_slist_prepend (lockdown->allowed_applications, 414 7958 cm122549 + g_strdup (iid)); 415 8947 mattk + } 416 7958 cm122549 + 417 8947 mattk + panel_lockdown_invoke_closures (lockdown); 418 7958 cm122549 +} 419 7958 cm122549 + 420 7958 cm122549 static gboolean 421 7958 cm122549 panel_lockdown_load_bool (PanelLockdown *lockdown, 422 7958 cm122549 GConfClient *client, 423 18706 mattman @@ -215,6 +279,28 @@ panel_lockdown_load_disabled_applets (Pa 424 7958 cm122549 return retval; 425 7958 cm122549 } 426 7958 cm122549 427 7958 cm122549 +static GSList * 428 7958 cm122549 +panel_lockdown_load_allowed_applications (PanelLockdown *lockdown, 429 7958 cm122549 + GConfClient *client, 430 7958 cm122549 + int listener) 431 7958 cm122549 +{ 432 8947 mattk + GSList *retval; 433 7958 cm122549 + 434 8947 mattk + retval = gconf_client_get_list (client, 435 8947 mattk + ALLOWED_APPLICATIONS_KEY, 436 8947 mattk + GCONF_VALUE_STRING, 437 8947 mattk + NULL); 438 7958 cm122549 + 439 8947 mattk + lockdown->listeners [listener] = 440 8947 mattk + gconf_client_notify_add (client, 441 8947 mattk + ALLOWED_APPLICATIONS_KEY, 442 8947 mattk + (GConfClientNotifyFunc) allowed_applications_notify, 443 8947 mattk + lockdown, 444 8947 mattk + NULL, NULL); 445 7958 cm122549 + 446 8947 mattk + return retval; 447 7958 cm122549 +} 448 7958 cm122549 + 449 7958 cm122549 void 450 7958 cm122549 panel_lockdown_init (void) 451 7958 cm122549 { 452 18706 mattman @@ -273,6 +359,18 @@ panel_lockdown_init (void) 453 7958 cm122549 client, 454 7958 cm122549 i++); 455 7958 cm122549 456 8947 mattk + panel_lockdown.restrict_application_launching = 457 7958 cm122549 + panel_lockdown_load_bool (&panel_lockdown, 458 7958 cm122549 + client, 459 7958 cm122549 + RESTRICT_APPLICATION_LAUNCHING_KEY, 460 7958 cm122549 + (GConfClientNotifyFunc) restrict_application_launching_notify, 461 7958 cm122549 + i++); 462 7958 cm122549 + 463 7958 cm122549 + panel_lockdown.allowed_applications = 464 7958 cm122549 + panel_lockdown_load_allowed_applications (&panel_lockdown, 465 7958 cm122549 + client, 466 7958 cm122549 + i++); 467 7958 cm122549 + 468 7958 cm122549 g_assert (i == N_LISTENERS); 469 7958 cm122549 470 7958 cm122549 panel_lockdown.initialized = TRUE; 471 18706 mattman @@ -294,6 +392,13 @@ panel_lockdown_finalize (void) 472 7958 cm122549 g_slist_free (panel_lockdown.disabled_applets); 473 7958 cm122549 panel_lockdown.disabled_applets = NULL; 474 8947 mattk 475 8947 mattk + for (l = panel_lockdown.allowed_applications; l; l = l->next) { 476 8947 mattk + g_free (l->data); 477 7958 cm122549 + } 478 8947 mattk + 479 8947 mattk + g_slist_free (panel_lockdown.allowed_applications); 480 8947 mattk + panel_lockdown.allowed_applications = NULL; 481 8947 mattk + 482 7958 cm122549 for (i = 0; i < N_LISTENERS; i++) { 483 7958 cm122549 if (panel_lockdown.listeners [i]) 484 7958 cm122549 gconf_client_notify_remove (client, 485 18706 mattman @@ -371,6 +476,36 @@ panel_lockdown_is_applet_disabled (const 486 7958 cm122549 return FALSE; 487 7958 cm122549 } 488 7958 cm122549 489 7958 cm122549 +gboolean 490 7958 cm122549 +panel_lockdown_get_restrict_application_launching (void) 491 7958 cm122549 +{ 492 8947 mattk + g_assert (panel_lockdown.initialized != FALSE); 493 7958 cm122549 + 494 8947 mattk + return panel_lockdown.restrict_application_launching; 495 7958 cm122549 +} 496 7958 cm122549 + 497 7958 cm122549 +GSList * 498 7958 cm122549 +panel_lockdown_get_allowed_applications (void) 499 7958 cm122549 +{ 500 8947 mattk + g_assert (panel_lockdown.initialized == TRUE); 501 7958 cm122549 + 502 8947 mattk + return panel_lockdown.allowed_applications; 503 7958 cm122549 +} 504 7958 cm122549 + 505 7958 cm122549 +gboolean 506 7958 cm122549 +panel_lockdown_is_allowed_application (const gchar *app) 507 7958 cm122549 +{ 508 8947 mattk + GSList *l; 509 7958 cm122549 + 510 8947 mattk + g_assert (panel_lockdown.initialized != FALSE); 511 7958 cm122549 + 512 8947 mattk + for (l = panel_lockdown.allowed_applications; l; l = l->next) 513 8947 mattk + if (!strcmp (l->data, app)) 514 8947 mattk + return TRUE; 515 7958 cm122549 + 516 8947 mattk + return FALSE; 517 7958 cm122549 +} 518 7958 cm122549 + 519 7958 cm122549 static GClosure * 520 7958 cm122549 panel_lockdown_notify_find (GSList *closures, 521 7958 cm122549 GCallback callback_func, 522 18706 mattman @@ -440,3 +575,161 @@ panel_lockdown_notify_remove (GCallback 523 7958 cm122549 524 7958 cm122549 g_closure_unref (closure); 525 15098 mattman } 526 7958 cm122549 + 527 7958 cm122549 +gchar * 528 7958 cm122549 +panel_lockdown_get_stripped_exec (const gchar *full_exec) 529 7958 cm122549 +{ 530 8947 mattk + gchar *str1, *str2, *retval, *p; 531 7958 cm122549 + 532 8947 mattk + str1 = g_strdup (full_exec); 533 8947 mattk + p = strtok (str1, " "); 534 7958 cm122549 + 535 8947 mattk + if (p != NULL) 536 8947 mattk + str2 = g_strdup (p); 537 8947 mattk + else 538 8947 mattk + str2 = g_strdup (full_exec); 539 7958 cm122549 + 540 8947 mattk + g_free (str1); 541 7958 cm122549 + 542 8947 mattk + if (g_path_is_absolute (str2)) 543 8947 mattk + retval = g_strdup (str2); 544 8947 mattk + else 545 8947 mattk + retval = g_strdup (g_find_program_in_path ((const gchar *)str2)); 546 8947 mattk + g_free (str2); 547 7958 cm122549 + 548 8947 mattk + return retval; 549 7958 cm122549 +} 550 7958 cm122549 + 551 7958 cm122549 +gchar * 552 7958 cm122549 +panel_lockdown_get_exec_from_ditem (GnomeDesktopItem *ditem) 553 7958 cm122549 +{ 554 8947 mattk + const char *full_exec; 555 8947 mattk + gchar *retval = NULL; 556 7958 cm122549 + 557 8947 mattk + full_exec = gnome_desktop_item_get_string (ditem, 558 8947 mattk + GNOME_DESKTOP_ITEM_EXEC); 559 7958 cm122549 + 560 8947 mattk + if (full_exec != NULL) 561 8947 mattk + retval = panel_lockdown_get_stripped_exec (full_exec); 562 7958 cm122549 + 563 8947 mattk + return retval; 564 7958 cm122549 +} 565 7958 cm122549 + 566 7958 cm122549 +gboolean 567 7958 cm122549 +panel_lockdown_ditem_in_allowed_applications (GnomeDesktopItem *ditem) 568 7958 cm122549 +{ 569 8947 mattk + gboolean retval = FALSE; 570 8947 mattk + gchar *stripped_exec; 571 7958 cm122549 + 572 8947 mattk + stripped_exec = panel_lockdown_get_exec_from_ditem (ditem); 573 7958 cm122549 + 574 8947 mattk + if (stripped_exec != NULL) { 575 8947 mattk + retval = panel_lockdown_is_allowed_application (stripped_exec); 576 8947 mattk + g_free (stripped_exec); 577 8947 mattk + } 578 7958 cm122549 + 579 8947 mattk + return retval; 580 7958 cm122549 +} 581 7958 cm122549 + 582 7958 cm122549 +gboolean 583 7958 cm122549 +panel_lockdown_is_disabled_command_line (const gchar *term_cmd) 584 7958 cm122549 +{ 585 8947 mattk + int i = 0; 586 8947 mattk + gboolean retval = FALSE; 587 7958 cm122549 + 588 8947 mattk + for (i=0; i<NUMBER_COMMAND_LINE_EXECS; i++) { 589 8947 mattk + if (!strcmp (command_line_execs [i], term_cmd)) { 590 8947 mattk + retval = TRUE; 591 8947 mattk + break; 592 8947 mattk + } 593 7958 cm122549 + } 594 7958 cm122549 + 595 8947 mattk + return retval; 596 7958 cm122549 +} 597 7958 cm122549 + 598 8947 mattk +gboolean 599 8947 mattk +panel_lockdown_is_forbidden_app(GnomeDesktopItem *ditem) { 600 8947 mattk + g_return_val_if_fail (ditem != NULL, TRUE) ; 601 8947 mattk + return panel_lockdown_get_restrict_application_launching () && 602 8947 mattk + !panel_lockdown_ditem_in_allowed_applications (ditem) ; 603 7958 cm122549 +} 604 7958 cm122549 + 605 8947 mattk +gboolean 606 8947 mattk +panel_lockdown_is_forbidden_ditem(GnomeDesktopItem *ditem) 607 7958 cm122549 +{ 608 8947 mattk + g_return_val_if_fail (ditem != NULL, TRUE) ; 609 8947 mattk + if (panel_lockdown_is_forbidden_app (ditem)) { return TRUE ; } 610 8947 mattk + if (panel_lockdown_get_disable_command_line ()) { 611 8947 mattk + char *stripped = panel_lockdown_get_exec_from_ditem (ditem) ; 612 7958 cm122549 + 613 8947 mattk + if (stripped != NULL) { 614 8947 mattk + gboolean retCode = 615 8947 mattk + panel_lockdown_is_disabled_command_line (stripped) ; 616 7958 cm122549 + 617 8947 mattk + g_free (stripped) ; 618 8947 mattk + return retCode ; 619 8947 mattk + } 620 7958 cm122549 + } 621 8947 mattk + return FALSE ; 622 7958 cm122549 +} 623 7958 cm122549 + 624 8947 mattk +gboolean 625 8947 mattk +panel_lockdown_is_forbidden_command (const char *command) 626 7958 cm122549 +{ 627 8947 mattk + g_return_val_if_fail (command != NULL, TRUE) ; 628 8947 mattk + return panel_lockdown_get_restrict_application_launching () && 629 8947 mattk + !panel_lockdown_is_allowed_application (command) ; 630 7958 cm122549 +} 631 7958 cm122549 + 632 8947 mattk +gboolean 633 8947 mattk +panel_lockdown_is_allowed_menu_entry (GMenuTreeEntry *entry) 634 8071 mattk +{ 635 8947 mattk + const char *path; 636 8947 mattk + GnomeDesktopItem *item = NULL ; 637 8071 mattk + 638 8947 mattk + if (!panel_lockdown_get_restrict_application_launching ()) 639 8947 mattk + return TRUE; 640 8071 mattk + 641 8947 mattk + path = gmenu_tree_entry_get_desktop_file_path (entry) ; 642 8071 mattk + 643 8947 mattk + if (path != NULL) { 644 8947 mattk + item = gnome_desktop_item_new_from_file (path, 0, NULL) ; 645 8947 mattk + if (item != NULL) { 646 8947 mattk + gboolean retCode = !panel_lockdown_is_forbidden_ditem (item) ; 647 8071 mattk + 648 8947 mattk + gnome_desktop_item_unref (item) ; 649 8947 mattk + return retCode ; 650 8947 mattk + } 651 8071 mattk + } 652 8947 mattk + return TRUE ; 653 8071 mattk +} 654 7958 cm122549 + 655 8947 mattk +gboolean 656 8947 mattk +panel_lockdown_is_forbidden_launcher (Launcher *launcher) 657 7958 cm122549 +{ 658 8949 mattk + return (panel_lockdown_is_forbidden_key_file(launcher->key_file)); 659 7958 cm122549 +} 660 8949 mattk + 661 8949 mattk +gboolean 662 8949 mattk +panel_lockdown_is_forbidden_key_file (GKeyFile *key_file) 663 8949 mattk +{ 664 8949 mattk + gchar *full_exec; /* Executable including possible arguments */ 665 8949 mattk + gchar *stripped_exec; /* Executable with arguments stripped away */ 666 8949 mattk + gboolean retval = FALSE; 667 8949 mattk + 668 15098 mattman + /* If restrict_application_launching not set on return TRUE */ 669 15098 mattman + if (!panel_lockdown_get_restrict_application_launching ()) { 670 15113 mattman + return retval; 671 15098 mattman + } 672 15098 mattman + 673 8949 mattk + if (key_file != NULL) 674 8949 mattk + { 675 14682 mattman + full_exec = panel_key_file_get_string (key_file, "Exec"); 676 8949 mattk + if (full_exec != NULL) { 677 8949 mattk + stripped_exec = panel_lockdown_get_stripped_exec (full_exec); 678 12125 gman + retval = panel_lockdown_is_forbidden_command (stripped_exec); 679 12125 gman + g_free (stripped_exec); 680 8949 mattk + } 681 8949 mattk + } 682 8949 mattk + return retval; 683 12125 gman +} 684 19171 mattman /jds/bin/diff -uprN gnome-panel-2.27.91.old/gnome-panel/panel-menu-items.c gnome-panel-2.27.91/gnome-panel/panel-menu-items.c 685 19171 mattman --- gnome-panel-2.27.91.old/gnome-panel/panel-menu-items.c 2009-08-26 17:27:47.973492000 +0100 686 19171 mattman +++ gnome-panel-2.27.91/gnome-panel/panel-menu-items.c 2009-08-26 17:36:15.979872000 +0100 687 19171 mattman @@ -157,6 +157,21 @@ panel_menu_items_append_from_desktop (Gt 688 17173 mattman char *icon; 689 17173 mattman char *name; 690 17173 mattman char *comment; 691 17173 mattman + GnomeDesktopItem *ditem; 692 17173 mattman + 693 17173 mattman + /* If restricted application, then don't append */ 694 17173 mattman + if (g_path_is_absolute (path)) 695 17173 mattman + ditem = gnome_desktop_item_new_from_file (path, 0, NULL); 696 17173 mattman + else 697 17173 mattman + ditem = gnome_desktop_item_new_from_basename (path, 0, NULL); 698 17173 mattman + if (ditem != NULL && panel_lockdown_is_forbidden_ditem (ditem)) { 699 17173 mattman + gnome_desktop_item_unref (ditem); 700 17173 mattman + return; 701 17173 mattman + } 702 17173 mattman + 703 17173 mattman + if (ditem != NULL) { 704 17173 mattman + gnome_desktop_item_unref (ditem); 705 17173 mattman + } 706 17173 mattman 707 17173 mattman path_freeme = NULL; 708 17173 mattman 709 19171 mattman @@ -1073,7 +1088,7 @@ panel_place_menu_item_create_menu (Panel 710 17176 mattman return places_menu; 711 17173 mattman } 712 17173 mattman 713 17173 mattman -static void 714 17173 mattman +void 715 17176 mattman panel_place_menu_item_recreate_menu (GtkWidget *widget) 716 17173 mattman { 717 17176 mattman PanelPlaceMenuItem *place_item; 718 19171 mattman @@ -1181,7 +1196,7 @@ panel_desktop_menu_item_create_menu (Pan 719 17173 mattman return desktop_menu; 720 17173 mattman } 721 17173 mattman 722 17173 mattman -static void 723 17173 mattman +void 724 17173 mattman panel_desktop_menu_item_recreate_menu (PanelDesktopMenuItem *desktop_item) 725 17173 mattman { 726 17173 mattman if (desktop_item->priv->menu) { 727 19171 mattman @@ -1548,8 +1563,11 @@ panel_menu_items_append_lock_logout (Gtk 728 17173 mattman tooltip = NULL; 729 17173 mattman } 730 17173 mattman 731 17173 mattman - item = panel_menu_items_create_action_item_full (PANEL_ACTION_LOGOUT, 732 17173 mattman - label, tooltip); 733 17173 mattman + if (!panel_lockdown_get_disable_log_out ()) { 734 17173 mattman + item = panel_menu_items_create_action_item_full (PANEL_ACTION_LOGOUT, 735 17173 mattman + label, tooltip); 736 17173 mattman + } 737 17173 mattman + 738 17173 mattman g_free (label); 739 17173 mattman g_free (tooltip); 740 17173 mattman 741 19171 mattman @@ -1575,5 +1593,21 @@ void 742 17173 mattman panel_menu_item_activate_desktop_file (GtkWidget *menuitem, 743 17173 mattman const char *path) 744 17173 mattman { 745 17173 mattman + GnomeDesktopItem *ditem; 746 17173 mattman + 747 17173 mattman + if (g_path_is_absolute (path)) 748 17173 mattman + ditem = gnome_desktop_item_new_from_file (path, 0, NULL); 749 17173 mattman + else 750 17173 mattman + ditem = gnome_desktop_item_new_from_basename (path, 0, NULL); 751 17173 mattman + 752 17173 mattman + if (ditem != NULL && panel_lockdown_is_forbidden_ditem (ditem)) { 753 17173 mattman + gnome_desktop_item_unref (ditem); 754 17173 mattman + return; /* Don't launch as it's a forbidden desktop file */ 755 17173 mattman + } 756 17173 mattman + 757 17173 mattman + if (ditem != NULL) { 758 17173 mattman + gnome_desktop_item_unref (ditem); 759 17173 mattman + } 760 17173 mattman + 761 17173 mattman panel_launch_desktop_file (path, menuitem_to_screen (menuitem), NULL); 762 17173 mattman } 763 19328 davelam /jds/bin/diff -uprN gnome-panel-2.27.91.old/gnome-panel/launcher.c gnome-panel-2.27.91/gnome-panel/launcher.c 764 19328 davelam --- gnome-panel-2.27.91.old/gnome-panel/launcher.c 2009-08-26 17:27:47.942300000 +0100 765 19328 davelam +++ gnome-panel-2.27.91/gnome-panel/launcher.c 2009-08-26 17:56:11.860620000 +0100 766 19328 davelam @@ -105,6 +105,9 @@ launch_url (Launcher *launcher) 767 19328 davelam g_return_if_fail (launcher != NULL); 768 19328 davelam g_return_if_fail (launcher->key_file != NULL); 769 19328 davelam 770 19328 davelam + if (panel_lockdown_is_forbidden_launcher (launcher)) 771 19328 davelam + return; 772 19328 davelam + 773 19328 davelam /* FIXME panel_ditem_launch() should be enough for this! */ 774 19328 davelam url = panel_key_file_get_string (launcher->key_file, "URL"); 775 19328 davelam 776 19328 davelam @@ -136,6 +139,9 @@ launcher_launch (Launcher *launcher, 777 19328 davelam g_return_if_fail (launcher != NULL); 778 19328 davelam g_return_if_fail (launcher->key_file != NULL); 779 19328 davelam 780 19328 davelam + if (panel_lockdown_is_forbidden_launcher (launcher)) 781 19328 davelam + return; 782 19328 davelam + 783 19328 davelam if (panel_global_config_get_enable_animations ()) 784 19328 davelam xstuff_zoom_animate (widget, 785 19328 davelam button_widget_get_pixbuf (BUTTON_WIDGET (widget)), 786 19328 davelam @@ -410,6 +416,19 @@ drag_data_get_cb (GtkWidget *widg 787 19328 davelam 788 19328 davelam } 789 19328 davelam 790 19328 davelam +static void 791 19328 davelam +panel_recheck_launcher (Launcher *launcher) 792 19328 davelam +{ 793 19328 davelam + if (!launcher || !launcher->button) 794 19328 davelam + return; 795 19328 davelam + 796 19328 davelam + if (panel_lockdown_is_forbidden_launcher (launcher)) { 797 19328 davelam + gtk_widget_hide (launcher->button); 798 19328 davelam + } else { 799 19328 davelam + gtk_widget_show (launcher->button); 800 19328 davelam + } 801 19328 davelam +} 802 19328 davelam + 803 19328 davelam static Launcher * 804 19328 davelam create_launcher (const char *location) 805 19328 davelam { 806 19328 davelam @@ -488,7 +507,11 @@ create_launcher (const char *location) 807 19328 davelam FALSE, 808 19328 davelam PANEL_ORIENTATION_TOP); 809 19328 davelam 810 19328 davelam - gtk_widget_show (launcher->button); 811 19328 davelam + if (panel_lockdown_is_forbidden_launcher (launcher)) { 812 19328 davelam + gtk_widget_hide (launcher->button); 813 19328 davelam + } else { 814 19328 davelam + gtk_widget_show (launcher->button); 815 19328 davelam + } 816 19328 davelam 817 19328 davelam /*gtk_drag_dest_set (GTK_WIDGET (launcher->button), 818 19328 davelam GTK_DEST_DEFAULT_ALL, 819 19328 davelam @@ -515,6 +538,8 @@ create_launcher (const char *location) 820 19328 davelam G_CALLBACK (destroy_launcher), 821 19328 davelam launcher); 822 19328 davelam 823 19328 davelam + panel_lockdown_notify_add (G_CALLBACK (panel_recheck_launcher), launcher); 824 19328 davelam + 825 19328 davelam return launcher; 826 19328 davelam } 827 19328 davelam 828 19328 davelam @@ -813,6 +838,12 @@ load_launcher_applet (const char * 829 19328 davelam /* setup button according to ditem */ 830 19328 davelam setup_button (launcher); 831 19328 davelam 832 19328 davelam + if (panel_lockdown_is_forbidden_launcher (launcher)) { 833 19328 davelam + gtk_widget_hide (launcher->button); 834 19328 davelam + } else { 835 19328 davelam + gtk_widget_show (launcher->button); 836 19328 davelam + } 837 19328 davelam + 838 19328 davelam return launcher; 839 19328 davelam } 840 19328 davelam 841 19328 davelam @@ -901,6 +932,10 @@ ask_about_launcher (const char *file, 842 19328 davelam if (file != NULL) 843 19328 davelam panel_key_file_set_string (key_file, "Exec", file); 844 19328 davelam panel_key_file_set_string (key_file, "Type", "Application"); 845 19328 davelam + 846 19328 davelam + if (panel_lockdown_is_forbidden_key_file (key_file)) 847 19328 davelam + return; /* Application being dragged is forbidden so just return */ 848 19328 davelam + 849 19328 davelam panel_ditem_editor_sync_display (PANEL_DITEM_EDITOR (dialog)); 850 19328 davelam 851 19328 davelam panel_ditem_register_save_uri_func (PANEL_DITEM_EDITOR (dialog), 852 19328 davelam @@ -955,17 +990,19 @@ panel_launcher_create_from_info (PanelTo 853 19328 davelam } 854 19328 davelam 855 19328 davelam location = panel_make_unique_desktop_uri (NULL, exec_or_uri); 856 19328 davelam - if (panel_key_file_to_file (key_file, location, &error)) { 857 19328 davelam - panel_launcher_create (toplevel, position, location); 858 19328 davelam - } else { 859 19328 davelam - panel_error_dialog (GTK_WINDOW (toplevel), 860 19328 davelam - gtk_window_get_screen (GTK_WINDOW (toplevel)), 861 19328 davelam - "cannot_save_launcher", TRUE, 862 19328 davelam - _("Could not save launcher"), 863 19328 davelam - error->message); 864 19328 davelam - g_error_free (error); 865 19328 davelam - } 866 19328 davelam 867 19328 davelam + if (!panel_lockdown_is_forbidden_key_file (key_file)) { 868 19328 davelam + if (panel_key_file_to_file (key_file, location, &error)) { 869 19328 davelam + panel_launcher_create (toplevel, position, location); 870 19328 davelam + } else { 871 19328 davelam + panel_error_dialog (GTK_WINDOW (toplevel), 872 19328 davelam + gtk_window_get_screen (GTK_WINDOW (toplevel)), 873 19328 davelam + "cannot_save_launcher", TRUE, 874 19328 davelam + _("Could not save launcher"), 875 19328 davelam + error->message); 876 19328 davelam + g_error_free (error); 877 19328 davelam + } 878 19328 davelam + } 879 19328 davelam g_key_file_free (key_file); 880 19328 davelam } 881 19328 davelam 882 19328 davelam --- gnome-panel-2.27.92/gnome-panel/menu.c.ori 2009-09-09 10:13:23.778451017 +0100 883 19328 davelam +++ gnome-panel-2.27.92/gnome-panel/menu.c 2009-09-09 10:21:41.371983238 +0100 884 19328 davelam @@ -74,7 +74,8 @@ 885 17968 mattman static GSList *image_menu_items = NULL; 886 17968 mattman 887 17968 mattman static GtkWidget *populate_menu_from_directory (GtkWidget *menu, 888 17968 mattman - GMenuTreeDirectory *directory); 889 17968 mattman + GMenuTreeDirectory *directory, 890 17968 mattman + gboolean *is_hidden); 891 17968 mattman 892 17968 mattman static void panel_load_menu_image_deferred (GtkWidget *image_menu_item, 893 17968 mattman GtkIconSize icon_size, 894 19328 davelam @@ -1272,7 +1273,8 @@ 895 17968 mattman } 896 17968 mattman 897 17968 mattman static void 898 17968 mattman -submenu_to_display (GtkWidget *menu) 899 17968 mattman +submenu_to_display (GtkWidget *menu, 900 17968 mattman + gboolean *is_hidden) 901 17968 mattman { 902 17968 mattman GMenuTree *tree; 903 17968 mattman GMenuTreeDirectory *directory; 904 19328 davelam @@ -1307,7 +1309,15 @@ 905 17968 mattman } 906 17968 mattman 907 17968 mattman if (directory) 908 17968 mattman - populate_menu_from_directory (menu, directory); 909 17968 mattman + { /* It's possible that is_hidden is NULL if we end up here from the show 910 17968 mattman + signal, which could only happen for the top level menu. */ 911 17968 mattman + gboolean local_is_hidden = FALSE; 912 17968 mattman + 913 17968 mattman + populate_menu_from_directory (menu, directory, &local_is_hidden); 914 17968 mattman + if (is_hidden != NULL) { 915 17968 mattman + *is_hidden = local_is_hidden; 916 17968 mattman + } 917 17968 mattman + } 918 17968 mattman 919 17968 mattman append_callback = g_object_get_data (G_OBJECT (menu), 920 17968 mattman "panel-menu-append-callback"); 921 19328 davelam @@ -1321,10 +1331,11 @@ 922 17968 mattman submenu_to_display_in_idle (gpointer data) 923 17968 mattman { 924 17968 mattman GtkWidget *menu = GTK_WIDGET (data); 925 17968 mattman + gboolean is_hidden = FALSE; 926 17968 mattman 927 17968 mattman g_object_set_data (G_OBJECT (menu), "panel-menu-idle-id", NULL); 928 17968 mattman 929 17968 mattman - submenu_to_display (menu); 930 17968 mattman + submenu_to_display (menu, &is_hidden); 931 17968 mattman 932 17968 mattman return FALSE; 933 17968 mattman } 934 19328 davelam @@ -1419,19 +1430,25 @@ 935 17968 mattman static void 936 17968 mattman create_submenu (GtkWidget *menu, 937 17968 mattman GMenuTreeDirectory *directory, 938 17968 mattman - GMenuTreeDirectory *alias_directory) 939 17968 mattman + GMenuTreeDirectory *alias_directory, 940 19328 davelam + gboolean *is_hidden) 941 17968 mattman { 942 17968 mattman GtkWidget *menuitem; 943 17968 mattman GtkWidget *submenu; 944 19328 davelam gboolean force_categories_icon; 945 17968 mattman 946 17968 mattman + submenu = create_fake_menu (directory); 947 19328 davelam + if (panel_lockdown_get_restrict_application_launching ()) { 948 19328 davelam + submenu_to_display (submenu, is_hidden); 949 19328 davelam + } else { 950 19328 davelam + *is_hidden = FALSE; 951 19328 davelam + } 952 17968 mattman + 953 17968 mattman if (alias_directory) 954 17968 mattman menuitem = create_submenu_entry (menu, alias_directory); 955 17968 mattman else 956 17968 mattman menuitem = create_submenu_entry (menu, directory); 957 17968 mattman 958 17968 mattman - submenu = create_fake_menu (directory); 959 17968 mattman - 960 17968 mattman gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu); 961 19328 davelam 962 19328 davelam /* Keep the infor that we force (or not) the icons to be visible */ 963 19328 davelam @@ -1440,15 +1457,21 @@ 964 19328 davelam g_object_set_data (G_OBJECT (submenu), 965 19328 davelam "panel-menu-force-icon-for-categories", 966 19328 davelam GINT_TO_POINTER (force_categories_icon)); 967 17968 mattman + 968 19328 davelam + if (*is_hidden) { 969 19328 davelam + gtk_widget_hide (menuitem); 970 19328 davelam + } 971 17968 mattman } 972 17968 mattman 973 17968 mattman static void 974 17968 mattman create_header (GtkWidget *menu, 975 17968 mattman - GMenuTreeHeader *header) 976 17968 mattman + GMenuTreeHeader *header, 977 19328 davelam + gboolean *is_hidden) 978 17968 mattman { 979 17968 mattman GMenuTreeDirectory *directory; 980 17968 mattman GtkWidget *menuitem; 981 17968 mattman 982 19328 davelam + *is_hidden = FALSE; 983 17968 mattman directory = gmenu_tree_header_get_directory (header); 984 17968 mattman menuitem = create_submenu_entry (menu, directory); 985 17968 mattman gmenu_tree_item_unref (directory); 986 19328 davelam @@ -1465,10 +1488,12 @@ 987 19171 mattman static void 988 19171 mattman create_menuitem (GtkWidget *menu, 989 19171 mattman GMenuTreeEntry *entry, 990 19171 mattman - GMenuTreeDirectory *alias_directory) 991 19171 mattman + GMenuTreeDirectory *alias_directory, 992 19171 mattman + gboolean *is_hidden) 993 19171 mattman { 994 19171 mattman GtkWidget *menuitem; 995 19171 mattman 996 19171 mattman + *is_hidden = FALSE; 997 19171 mattman menuitem = panel_image_menu_item_new (); 998 19171 mattman 999 19171 mattman g_object_set_data_full (G_OBJECT (menuitem), 1000 19328 davelam @@ -1545,12 +1570,18 @@ 1001 17968 mattman g_signal_connect (menuitem, "activate", 1002 17968 mattman G_CALLBACK (activate_app_def), entry); 1003 17968 mattman 1004 17968 mattman - gtk_widget_show (menuitem); 1005 17968 mattman + if (entry != NULL && !panel_lockdown_is_allowed_menu_entry (entry)) { 1006 17968 mattman + gtk_widget_hide (menuitem); 1007 17968 mattman + *is_hidden = TRUE; 1008 17968 mattman + } else { 1009 17968 mattman + gtk_widget_show (menuitem); 1010 17968 mattman + } 1011 17968 mattman } 1012 17968 mattman 1013 17968 mattman static void 1014 17968 mattman create_menuitem_from_alias (GtkWidget *menu, 1015 17968 mattman - GMenuTreeAlias *alias) 1016 17968 mattman + GMenuTreeAlias *alias, 1017 17968 mattman + gboolean *is_hidden) 1018 17968 mattman { 1019 17968 mattman GMenuTreeItem *aliased_item; 1020 17968 mattman 1021 19328 davelam @@ -1560,13 +1591,15 @@ 1022 17968 mattman case GMENU_TREE_ITEM_DIRECTORY: 1023 17968 mattman create_submenu (menu, 1024 17968 mattman GMENU_TREE_DIRECTORY (aliased_item), 1025 17968 mattman - gmenu_tree_alias_get_directory (alias)); 1026 17968 mattman + gmenu_tree_alias_get_directory (alias), 1027 17968 mattman + is_hidden); 1028 17968 mattman break; 1029 17968 mattman 1030 17968 mattman case GMENU_TREE_ITEM_ENTRY: 1031 17968 mattman create_menuitem (menu, 1032 17968 mattman GMENU_TREE_ENTRY (aliased_item), 1033 17968 mattman - gmenu_tree_alias_get_directory (alias)); 1034 17968 mattman + gmenu_tree_alias_get_directory (alias), 1035 17968 mattman + is_hidden); 1036 17968 mattman break; 1037 17968 mattman 1038 17968 mattman default: 1039 19328 davelam @@ -1673,18 +1706,21 @@ 1040 17968 mattman 1041 17968 mattman static GtkWidget * 1042 17968 mattman populate_menu_from_directory (GtkWidget *menu, 1043 17968 mattman - GMenuTreeDirectory *directory) 1044 17968 mattman + GMenuTreeDirectory *directory, 1045 17968 mattman + gboolean *is_hidden) 1046 17968 mattman { 1047 17968 mattman GSList *l; 1048 17968 mattman GSList *items; 1049 17968 mattman gboolean add_separator; 1050 17968 mattman 1051 18614 mattman + *is_hidden = TRUE; 1052 17968 mattman add_separator = (GTK_MENU_SHELL (menu)->children != NULL); 1053 17968 mattman 1054 17968 mattman items = gmenu_tree_directory_get_contents (directory); 1055 17968 mattman 1056 17968 mattman for (l = items; l; l = l->next) { 1057 17968 mattman GMenuTreeItem *item = l->data; 1058 17968 mattman + gboolean is_item_hidden = TRUE; 1059 17968 mattman 1060 17968 mattman if (add_separator || 1061 17968 mattman gmenu_tree_item_get_type (item) == GMENU_TREE_ITEM_SEPARATOR) { 1062 19328 davelam @@ -1694,11 +1730,13 @@ 1063 17968 mattman 1064 17968 mattman switch (gmenu_tree_item_get_type (item)) { 1065 17968 mattman case GMENU_TREE_ITEM_DIRECTORY: 1066 17968 mattman - create_submenu (menu, GMENU_TREE_DIRECTORY (item), NULL); 1067 17968 mattman + create_submenu (menu, GMENU_TREE_DIRECTORY (item), NULL, 1068 17968 mattman + &is_item_hidden); 1069 17968 mattman break; 1070 17968 mattman 1071 17968 mattman case GMENU_TREE_ITEM_ENTRY: 1072 17968 mattman - create_menuitem (menu, GMENU_TREE_ENTRY (item), NULL); 1073 17968 mattman + create_menuitem (menu, GMENU_TREE_ENTRY (item), NULL, 1074 17968 mattman + &is_item_hidden); 1075 17968 mattman break; 1076 17968 mattman 1077 17968 mattman case GMENU_TREE_ITEM_SEPARATOR : 1078 19328 davelam @@ -1706,11 +1744,13 @@ 1079 17968 mattman break; 1080 17968 mattman 1081 17968 mattman case GMENU_TREE_ITEM_ALIAS: 1082 17968 mattman - create_menuitem_from_alias (menu, GMENU_TREE_ALIAS (item)); 1083 17968 mattman + create_menuitem_from_alias (menu, GMENU_TREE_ALIAS (item), 1084 17968 mattman + &is_item_hidden); 1085 17968 mattman break; 1086 17968 mattman 1087 17968 mattman case GMENU_TREE_ITEM_HEADER: 1088 17968 mattman - create_header (menu, GMENU_TREE_HEADER (item)); 1089 17968 mattman + create_header (menu, GMENU_TREE_HEADER (item), 1090 17968 mattman + &is_item_hidden); 1091 17968 mattman break; 1092 17968 mattman 1093 17968 mattman default: 1094 19328 davelam @@ -1718,6 +1758,10 @@ 1095 17968 mattman } 1096 17968 mattman 1097 17968 mattman gmenu_tree_item_unref (item); 1098 17968 mattman + 1099 17968 mattman + if (!is_item_hidden) { 1100 17968 mattman + *is_hidden = FALSE; 1101 17968 mattman + } 1102 17968 mattman } 1103 17968 mattman 1104 17968 mattman g_slist_free (items); 1105