14
14
#include <glib/gi18n.h>
15
15
#include <gdk/gdkx.h>
17
#include <libpanel-util/panel-glib.h>
17
18
#include <libpanel-util/panel-show.h>
19
20
#include "button-widget.h"
21
21
#include "launcher.h"
22
23
#include "panel-addto.h"
23
#include "panel-gconf.h"
24
#include "panel-config-global.h"
24
#include "panel-bindings.h"
25
25
#include "panel-applet-frame.h"
26
26
#include "panel-action-button.h"
27
27
#include "panel-menu-bar.h"
28
28
#include "panel-separator.h"
29
#include "panel-compatibility.h"
30
29
#include "panel-toplevel.h"
31
30
#include "panel-util.h"
32
#include "panel-profile.h"
33
31
#include "panel-menu-button.h"
34
32
#include "panel-globals.h"
35
33
#include "panel-properties-dialog.h"
34
#include "panel-layout.h"
36
35
#include "panel-lockdown.h"
38
#define SMALL_ICON_SIZE 20
36
#include "panel-schemas.h"
40
38
static GSList *registered_applets = NULL;
41
39
static GSList *queued_position_saves = NULL;
42
40
static guint queued_position_source = 0;
42
static GtkWidget *panel_applet_get_menu (AppletInfo *info);
43
static void applet_menu_show (GtkWidget *w, AppletInfo *info);
44
static void applet_menu_deactivate (GtkWidget *w, AppletInfo *info);
45
46
static inline PanelWidget *
46
47
panel_applet_get_panel_widget (AppletInfo *info)
155
panel_applet_recreate_menu (AppletInfo *info)
121
panel_applet_recreate_menu (AppletInfo *info)
162
for (l = info->user_menu; l; l = l->next) {
163
AppletUserMenu *menu = l->data;
165
menu->menuitem =NULL;
126
for (l = info->user_menu; l; l = l->next) {
127
AppletUserMenu *menu = l->data;
129
menu->menuitem = NULL;
130
menu->submenu = NULL;
133
if (gtk_widget_get_visible (info->menu))
134
gtk_menu_shell_deactivate (GTK_MENU_SHELL (info->menu));
136
g_signal_handlers_disconnect_by_func (info->menu,
137
G_CALLBACK (applet_menu_show), info);
138
g_signal_handlers_disconnect_by_func (info->menu,
139
G_CALLBACK (applet_menu_deactivate), info);
141
g_object_unref (info->menu);
169
g_object_unref (info->menu);
170
info->menu = panel_applet_create_menu (info);
174
panel_applet_locked_change_notify (GConfClient *client,
181
gboolean applet_locked;
183
PanelWidget *panel_widget;
185
g_assert (applet != NULL);
187
info = (AppletInfo *) g_object_get_data (G_OBJECT (applet),
192
value = gconf_entry_get_value (entry);
193
if (value == NULL || value->type != GCONF_VALUE_BOOL)
196
locked = gconf_value_get_bool (value);
198
panel_widget = panel_applet_get_panel_widget (info);
199
applet_locked = panel_widget_get_applet_locked (panel_widget,
202
if ((locked && applet_locked) || !(locked || applet_locked))
205
panel_applet_toggle_locked (info);
207
if (info->type == PANEL_OBJECT_APPLET)
208
panel_applet_frame_sync_menu_state (PANEL_APPLET_FRAME (info->widget));
210
panel_applet_recreate_menu (info);
145
panel_applet_get_menu (info);
504
438
added_anything = TRUE;
507
if (!panel_lockdown_get_locked_down ()) {
514
lockable = panel_applet_lockable (info);
515
movable = panel_applet_can_freely_move (info);
516
removable = panel_profile_id_lists_are_writable ();
518
locked = panel_widget_get_applet_locked (panel_widget, info->widget);
520
if (added_anything) {
521
menuitem = gtk_separator_menu_item_new ();
522
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
523
gtk_widget_show (menuitem);
526
menuitem = gtk_image_menu_item_new_with_mnemonic (_("_Remove From Panel"));
527
image = gtk_image_new_from_stock (GTK_STOCK_REMOVE,
529
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem),
531
g_signal_connect (menuitem, "activate",
532
G_CALLBACK (applet_remove_callback), info);
533
gtk_widget_show (menuitem);
534
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
535
gtk_widget_set_sensitive (menuitem, (!locked || lockable) && removable);
537
menuitem = gtk_menu_item_new_with_mnemonic (_("_Move"));
538
g_signal_connect (menuitem, "activate",
539
G_CALLBACK (move_applet_callback), info);
540
gtk_widget_show (menuitem);
541
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
542
gtk_widget_set_sensitive (menuitem, !locked && movable);
544
g_assert (info->move_item == NULL);
546
info->move_item = menuitem;
547
g_object_add_weak_pointer (G_OBJECT (menuitem),
548
(gpointer *) &info->move_item);
550
menuitem = gtk_separator_menu_item_new ();
551
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
552
gtk_widget_show (menuitem);
554
menuitem = gtk_check_menu_item_new_with_mnemonic (_("Loc_k To Panel"));
555
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menuitem),
557
g_signal_connect (menuitem, "toggled",
558
G_CALLBACK (panel_applet_lock), info);
559
gtk_widget_show (menuitem);
560
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
561
gtk_widget_set_sensitive (menuitem, lockable);
563
added_anything = TRUE;
566
441
if ( ! added_anything) {
442
g_signal_handlers_disconnect_by_func (menu,
443
G_CALLBACK (applet_menu_show), info);
444
g_signal_handlers_disconnect_by_func (menu,
445
G_CALLBACK (applet_menu_deactivate), info);
567
447
g_object_unref (menu);
453
panel_lockdown_on_notify (panel_lockdown_get (),
455
G_OBJECT (info->menu),
456
panel_applet_menu_lockdown_changed,
463
panel_applet_edit_menu_lockdown_changed (PanelLockdown *lockdown,
466
AppletInfo *info = user_data;
468
if (!panel_lockdown_get_panels_locked_down (lockdown))
471
if (info->edit_menu) {
472
if (gtk_widget_get_visible (info->edit_menu))
473
gtk_menu_shell_deactivate (GTK_MENU_SHELL (info->edit_menu));
475
g_signal_handlers_disconnect_by_func (info->edit_menu,
476
G_CALLBACK (applet_menu_deactivate), info);
477
gtk_widget_destroy (info->edit_menu);
478
info->edit_menu = NULL;
483
panel_applet_get_edit_menu (AppletInfo *info)
487
PanelWidget *panel_widget;
493
return info->edit_menu;
495
if (panel_lockdown_get_panels_locked_down_s ())
498
menu = panel_applet_create_bare_menu (info);
499
panel_widget = panel_applet_get_panel_widget (info);
501
movable = panel_applet_can_freely_move (info);
502
removable = panel_layout_is_writable ();
504
menuitem = gtk_menu_item_new_with_mnemonic (_("_Move"));
505
g_signal_connect (menuitem, "activate",
506
G_CALLBACK (move_applet_callback), info);
507
gtk_widget_show (menuitem);
508
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
509
gtk_widget_set_sensitive (menuitem, movable);
511
menuitem = gtk_image_menu_item_new_with_mnemonic (_("_Remove From Panel"));
512
image = gtk_image_new_from_stock (GTK_STOCK_REMOVE,
514
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem),
516
g_signal_connect (menuitem, "activate",
517
G_CALLBACK (applet_remove_callback), info);
518
gtk_widget_show (menuitem);
519
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
520
gtk_widget_set_sensitive (menuitem, removable);
522
info->edit_menu = menu;
524
panel_lockdown_on_notify (panel_lockdown_get (),
525
"panels-locked-down",
526
G_OBJECT (info->edit_menu),
527
panel_applet_edit_menu_lockdown_changed,
530
return info->edit_menu;
575
535
panel_applet_menu_set_recurse (GtkMenu *menu,
669
629
applet_show_menu (AppletInfo *info,
631
gboolean custom_position,
670
632
GdkEventButton *event)
672
634
PanelWidget *panel_widget;
674
636
g_return_if_fail (info != NULL);
676
641
panel_widget = panel_applet_get_panel_widget (info);
678
if (info->menu == NULL)
679
info->menu = panel_applet_create_menu (info);
681
if (info->menu == NULL)
684
panel_applet_menu_set_recurse (GTK_MENU (info->menu),
643
panel_applet_menu_set_recurse (GTK_MENU (menu),
688
gtk_menu_set_screen (GTK_MENU (info->menu),
647
gtk_menu_set_screen (GTK_MENU (menu),
689
648
gtk_window_get_screen (GTK_WINDOW (panel_widget->toplevel)));
691
if (!gtk_widget_get_realized (info->menu))
692
gtk_widget_show (info->menu);
650
if (!gtk_widget_get_realized (menu))
651
gtk_widget_show (menu);
694
gtk_menu_popup (GTK_MENU (info->menu),
697
(GtkMenuPositionFunc) panel_applet_position_menu,
653
gtk_menu_popup (GTK_MENU (menu),
657
(GtkMenuPositionFunc) panel_applet_position_menu : NULL,
704
applet_do_popup_menu (GtkWidget *widget,
705
GdkEventButton *event,
664
applet_must_skip_menu (AppletInfo *info)
708
666
if (panel_applet_is_in_drag ())
711
669
if (info->type == PANEL_OBJECT_APPLET)
714
applet_show_menu (info, event);
720
applet_popup_menu (GtkWidget *widget,
723
GdkEventButton event;
726
event.time = GDK_CURRENT_TIME;
728
return applet_do_popup_menu (widget, &event, info);
733
677
GdkEventButton *event,
734
678
AppletInfo *info)
736
if (event->button == 3)
737
return applet_do_popup_menu (widget, event, info);
682
if (event->button != 3)
685
if (applet_must_skip_menu (info))
688
modifiers = event->state & gtk_accelerator_get_default_mod_mask ();
690
if (modifiers == panel_bindings_get_mouse_button_modifier_keymask ())
691
applet_show_menu (info, panel_applet_get_edit_menu (info), FALSE, event);
693
applet_show_menu (info, panel_applet_get_menu (info), TRUE, event);
699
applet_key_press (GtkWidget *widget,
703
GdkEventButton eventbutton;
704
gboolean is_popup = FALSE;
705
gboolean is_edit_popup = FALSE;
707
if (applet_must_skip_menu (info))
710
eventbutton.button = 3;
711
eventbutton.time = event->time;
713
/* We're not connecting to the popup-menu signal since we want to be
714
* able to deal with two cases:
715
* - exact keybinding of popup-menu => we open the context menu
716
* - keybinding of popup-menu + modifier from metacity => we open menu
719
panel_util_key_event_is_popup (event, &is_popup, &is_edit_popup);
722
applet_show_menu (info, panel_applet_get_edit_menu (info), FALSE, &eventbutton);
724
applet_show_menu (info, panel_applet_get_menu (info), TRUE, &eventbutton);
726
return (is_popup || is_edit_popup);
754
741
queued_position_saves =
755
742
g_slist_remove (queued_position_saves, info);
757
if (info->type == PANEL_OBJECT_DRAWER) {
758
Drawer *drawer = info->data;
760
if (drawer->toplevel) {
761
PanelWidget *panel_widget;
763
panel_widget = panel_toplevel_get_panel_widget (
765
panel_widget->master_widget = NULL;
767
gtk_widget_destroy (GTK_WIDGET (drawer->toplevel));
768
drawer->toplevel = NULL;
772
if (info->type != PANEL_OBJECT_APPLET)
773
panel_lockdown_notify_remove (G_CALLBACK (panel_applet_recreate_menu),
745
if (gtk_widget_get_visible (info->menu))
746
gtk_menu_shell_deactivate (GTK_MENU_SHELL (info->menu));
748
g_signal_handlers_disconnect_by_func (info->menu,
749
G_CALLBACK (applet_menu_show), info);
750
g_signal_handlers_disconnect_by_func (info->menu,
751
G_CALLBACK (applet_menu_deactivate), info);
777
752
g_object_unref (info->menu);
778
754
info->menu = NULL;
756
if (info->edit_menu) {
757
if (gtk_widget_get_visible (info->edit_menu))
758
gtk_menu_shell_deactivate (GTK_MENU_SHELL (info->edit_menu));
760
g_signal_handlers_disconnect_by_func (info->edit_menu,
761
G_CALLBACK (applet_menu_show), info);
762
g_signal_handlers_disconnect_by_func (info->edit_menu,
763
G_CALLBACK (applet_menu_deactivate), info);
764
g_object_unref (info->edit_menu);
766
info->edit_menu = NULL;
780
768
if (info->data_destroy)
781
769
info->data_destroy (info->data);
782
770
info->data = NULL;
794
782
g_list_free (info->user_menu);
795
783
info->user_menu = NULL;
786
g_object_unref (info->settings);
787
info->settings = NULL;
797
789
g_free (info->id);
805
PanelObjectType type;
808
guint right_stick : 1;
812
/* Each time those lists get both empty,
813
* panel_applet_queue_initial_unhide_toplevels() should be called */
814
static GSList *panel_applets_to_load = NULL;
815
static GSList *panel_applets_loading = NULL;
816
/* We have a timeout to always unhide toplevels after a delay, in case of some
818
#define UNHIDE_TOPLEVELS_TIMEOUT_SECONDS 5
819
static guint panel_applet_unhide_toplevels_timeout = 0;
821
static gboolean panel_applet_have_load_idle = FALSE;
824
free_applet_to_load (PanelAppletToLoad *applet)
829
g_free (applet->toplevel_id);
830
applet->toplevel_id = NULL;
836
panel_applet_on_load_queue (const char *id)
839
for (li = panel_applets_to_load; li != NULL; li = li->next) {
840
PanelAppletToLoad *applet = li->data;
841
if (strcmp (applet->id, id) == 0)
844
for (li = panel_applets_loading; li != NULL; li = li->next) {
845
PanelAppletToLoad *applet = li->data;
846
if (strcmp (applet->id, id) == 0)
852
/* This doesn't do anything if the initial unhide already happened */
854
panel_applet_queue_initial_unhide_toplevels (gpointer user_data)
858
if (panel_applet_unhide_toplevels_timeout != 0) {
859
g_source_remove (panel_applet_unhide_toplevels_timeout);
860
panel_applet_unhide_toplevels_timeout = 0;
863
for (l = panel_toplevel_list_toplevels (); l != NULL; l = l->next)
864
panel_toplevel_queue_initial_unhide ((PanelToplevel *) l->data);
870
panel_applet_stop_loading (const char *id)
872
PanelAppletToLoad *applet;
875
for (l = panel_applets_loading; l; l = l->next) {
878
if (strcmp (applet->id, id) == 0)
882
/* this can happen if we reload an applet after it crashed,
885
panel_applets_loading = g_slist_delete_link (panel_applets_loading, l);
886
free_applet_to_load (applet);
889
if (panel_applets_loading == NULL && panel_applets_to_load == NULL)
890
panel_applet_queue_initial_unhide_toplevels (NULL);
894
panel_applet_load_idle_handler (gpointer dummy)
896
PanelObjectType applet_type;
897
PanelAppletToLoad *applet = NULL;
898
PanelToplevel *toplevel = NULL;
899
PanelWidget *panel_widget;
902
if (!panel_applets_to_load) {
903
panel_applet_have_load_idle = FALSE;
907
for (l = panel_applets_to_load; l; l = l->next) {
910
toplevel = panel_profile_get_toplevel_by_id (applet->toplevel_id);
916
/* All the remaining applets don't have a panel */
917
for (l = panel_applets_to_load; l; l = l->next)
918
free_applet_to_load (l->data);
919
g_slist_free (panel_applets_to_load);
920
panel_applets_to_load = NULL;
921
panel_applet_have_load_idle = FALSE;
923
if (panel_applets_loading == NULL) {
924
/* unhide any potential initially hidden toplevel */
925
panel_applet_queue_initial_unhide_toplevels (NULL);
931
panel_applets_to_load = g_slist_delete_link (panel_applets_to_load, l);
932
panel_applets_loading = g_slist_append (panel_applets_loading, applet);
934
panel_widget = panel_toplevel_get_panel_widget (toplevel);
936
if (applet->right_stick) {
937
if (!panel_widget->packed)
938
applet->position = panel_widget->size - applet->position;
940
applet->position = -1;
943
/* We load applets asynchronously, so we specifically don't call
944
* panel_applet_stop_loading() for this type. However, in case of
945
* failure during the load, we might call panel_applet_stop_loading()
946
* synchronously, which will make us lose the content of the applet
947
* variable. So we save the type to be sure we always ignore the
949
applet_type = applet->type;
951
switch (applet_type) {
952
case PANEL_OBJECT_APPLET:
953
panel_applet_frame_load_from_gconf (
959
case PANEL_OBJECT_DRAWER:
960
drawer_load_from_gconf (panel_widget,
965
case PANEL_OBJECT_MENU:
966
panel_menu_button_load_from_gconf (panel_widget,
972
case PANEL_OBJECT_LAUNCHER:
973
launcher_load_from_gconf (panel_widget,
978
case PANEL_OBJECT_LOGOUT:
979
case PANEL_OBJECT_LOCK:
980
panel_action_button_load_compatible (
988
case PANEL_OBJECT_ACTION:
989
panel_action_button_load_from_gconf (
996
case PANEL_OBJECT_MENU_BAR:
997
panel_menu_bar_load_from_gconf (
1004
case PANEL_OBJECT_SEPARATOR:
1005
panel_separator_load_from_gconf (panel_widget,
1011
g_assert_not_reached ();
1015
/* Only the real applets will do a late stop_loading */
1016
if (applet_type != PANEL_OBJECT_APPLET)
1017
panel_applet_stop_loading (applet->id);
1023
panel_applet_queue_applet_to_load (const char *id,
1024
PanelObjectType type,
1025
const char *toplevel_id,
1027
gboolean right_stick,
1030
PanelAppletToLoad *applet;
1033
g_warning ("No toplevel on which to load object '%s'\n", id);
1037
applet = g_new0 (PanelAppletToLoad, 1);
1039
applet->id = g_strdup (id);
1040
applet->type = type;
1041
applet->toplevel_id = g_strdup (toplevel_id);
1042
applet->position = position;
1043
applet->right_stick = right_stick != FALSE;
1044
applet->locked = locked != FALSE;
1046
panel_applets_to_load = g_slist_prepend (panel_applets_to_load, applet);
1050
panel_applet_compare (const PanelAppletToLoad *a,
1051
const PanelAppletToLoad *b)
1055
if ((c = strcmp (a->toplevel_id, b->toplevel_id)))
1057
else if (a->right_stick != b->right_stick)
1058
return b->right_stick ? -1 : 1;
1060
return a->position - b->position;
1064
panel_applet_load_queued_applets (gboolean initial_load)
1066
if (!panel_applets_to_load) {
1067
panel_applet_queue_initial_unhide_toplevels (NULL);
1071
if (panel_applets_to_load && panel_applet_unhide_toplevels_timeout == 0) {
1072
/* Install a timeout to make sure we don't block the
1073
* unhiding because of an applet that doesn't load */
1074
panel_applet_unhide_toplevels_timeout =
1075
g_timeout_add_seconds (UNHIDE_TOPLEVELS_TIMEOUT_SECONDS,
1076
panel_applet_queue_initial_unhide_toplevels,
1080
panel_applets_to_load = g_slist_sort (panel_applets_to_load,
1081
(GCompareFunc) panel_applet_compare);
1083
if ( ! panel_applet_have_load_idle) {
1084
/* on panel startup, we don't care about redraws of the
1085
* toplevels since they are hidden, so we give a higher
1086
* priority to loading of applets */
1088
g_idle_add_full (G_PRIORITY_HIGH_IDLE,
1089
panel_applet_load_idle_handler,
1092
g_idle_add (panel_applet_load_idle_handler, NULL);
1094
panel_applet_have_load_idle = TRUE;
1098
795
static G_CONST_RETURN char *
1099
796
panel_applet_get_toplevel_id (AppletInfo *applet)
1163
855
if (!(toplevel_id = panel_applet_get_toplevel_id (applet_info)))
1166
client = panel_gconf_get_client ();
1168
key_type = applet_info->type == PANEL_OBJECT_APPLET ? PANEL_GCONF_APPLETS : PANEL_GCONF_OBJECTS;
1170
858
panel_widget = panel_applet_get_panel_widget (applet_info);
1172
/* FIXME: Instead of getting keys, comparing and setting, there
1173
should be a dirty flag */
1175
key = panel_gconf_full_key (key_type, id, "toplevel_id");
1176
old_toplevel_id = gconf_client_get_string (client, key, NULL);
1177
if (old_toplevel_id == NULL || strcmp (old_toplevel_id, toplevel_id) != 0)
1178
gconf_client_set_string (client, key, toplevel_id, NULL);
1179
g_free (old_toplevel_id);
1181
/* Note: changing some properties of the panel that may not be locked down
1182
(e.g. background) can change the state of the "panel_right_stick" and
1183
"position" properties of an applet that may in fact be locked down.
1184
So check if these are writable before attempting to write them */
1186
right_stick = panel_is_applet_right_stick (applet_info->widget) ? 1 : 0;
1187
key = panel_gconf_full_key (
1188
key_type, id, "panel_right_stick");
1189
if (gconf_client_key_is_writable (client, key, NULL) &&
1190
(gconf_client_get_bool (client, key, NULL) ? 1 : 0) != right_stick)
1191
gconf_client_set_bool (client, key, right_stick, NULL);
1193
position = panel_applet_get_position (applet_info);
1194
if (right_stick && !panel_widget->packed)
1195
position = panel_widget->size - position;
1197
key = panel_gconf_full_key (key_type, id, "position");
1198
if (gconf_client_key_is_writable (client, key, NULL) &&
1199
gconf_client_get_int (client, key, NULL) != position)
1200
gconf_client_set_int (client, key, position, NULL);
1202
locked = panel_widget_get_applet_locked (panel_widget, applet_info->widget) ? 1 : 0;
1203
key = panel_gconf_full_key (key_type, id, "locked");
1204
if (gconf_client_get_bool (client, key, NULL) ? 1 : 0 != locked)
1205
gconf_client_set_bool (client, key, locked, NULL);
860
applet_data = g_object_get_data (G_OBJECT (applet_info->widget),
863
g_settings_set_string (applet_info->settings,
864
PANEL_OBJECT_TOPLEVEL_ID_KEY,
866
g_settings_set_enum (applet_info->settings,
867
PANEL_OBJECT_PACK_TYPE_KEY,
868
applet_data->pack_type);
869
g_settings_set_int (applet_info->settings,
870
PANEL_OBJECT_PACK_INDEX_KEY,
871
applet_data->pack_index);
1298
963
info = g_new0 (AppletInfo, 1);
1299
964
info->type = type;
1300
965
info->widget = applet;
966
info->settings = g_object_ref (settings);
1301
967
info->menu = NULL;
968
info->edit_menu = NULL;
1302
969
info->data = data;
1303
970
info->data_destroy = data_destroy;
1304
971
info->user_menu = NULL;
1305
info->move_item = NULL;
1306
972
info->id = g_strdup (id);
1308
974
g_object_set_data (G_OBJECT (applet), "applet_info", info);
1310
if (type != PANEL_OBJECT_APPLET)
1311
panel_lockdown_notify_add (G_CALLBACK (panel_applet_recreate_menu),
1314
key = panel_gconf_full_key ((type == PANEL_OBJECT_APPLET) ?
1315
PANEL_GCONF_APPLETS : PANEL_GCONF_OBJECTS,
1317
panel_gconf_notify_add_while_alive (key,
1318
(GConfClientNotifyFunc) panel_applet_locked_change_notify,
1321
if (type == PANEL_OBJECT_DRAWER) {
1322
Drawer *drawer = data;
1323
PanelWidget *assoc_panel;
1325
assoc_panel = panel_toplevel_get_panel_widget (drawer->toplevel);
1327
g_object_set_data (G_OBJECT (applet),
1328
PANEL_APPLET_ASSOC_PANEL_KEY, assoc_panel);
1329
assoc_panel->master_widget = applet;
1330
g_object_add_weak_pointer (
1331
G_OBJECT (applet), (gpointer *) &assoc_panel->master_widget);
1334
g_object_set_data (G_OBJECT (applet),
1335
PANEL_APPLET_FORBIDDEN_PANELS, NULL);
1337
976
registered_applets = g_slist_append (registered_applets, info);
1339
if (panel_widget_add (panel, applet, locked, pos, exactpos) == -1 &&
1340
panel_widget_add (panel, applet, locked, 0, TRUE) == -1) {
1343
for (l = panels; l; l = l->next) {
1344
panel = PANEL_WIDGET (l->data);
1346
if (panel_widget_add (panel, applet, locked, 0, TRUE) != -1)
1351
g_warning (_("Cannot find an empty spot"));
1352
panel_profile_delete_object (info);
978
/* Find where to insert the applet */
979
pack_type = g_settings_get_enum (info->settings, PANEL_OBJECT_PACK_TYPE_KEY);
980
pack_index = g_settings_get_int (info->settings, PANEL_OBJECT_PACK_INDEX_KEY);
983
panel_widget_add (panel, applet, pack_type, pack_index, TRUE);
1357
985
if (BUTTON_IS_WIDGET (applet) ||
1358
986
gtk_widget_get_has_window (applet)) {
1389
panel_applet_get_position (AppletInfo *applet)
1017
panel_applet_get_settings (AppletInfo *applet)
1391
AppletData *applet_data;
1393
g_return_val_if_fail (applet != NULL, 0);
1394
g_return_val_if_fail (G_IS_OBJECT (applet->widget), 0);
1396
applet_data = g_object_get_data (G_OBJECT (applet->widget), PANEL_APPLET_DATA);
1398
return applet_data->pos;
1019
g_return_val_if_fail (applet != NULL, NULL);
1021
return applet->settings;
1402
1025
panel_applet_can_freely_move (AppletInfo *applet)
1404
GConfClient *client;
1405
PanelGConfKeyType key_type;
1408
if (panel_lockdown_get_locked_down ())
1411
client = panel_gconf_get_client ();
1413
key_type = (applet->type == PANEL_OBJECT_APPLET) ? PANEL_GCONF_APPLETS : PANEL_GCONF_OBJECTS;
1415
key = panel_gconf_full_key (key_type, applet->id, "position");
1416
if (!gconf_client_key_is_writable (client, key, NULL))
1419
key = panel_gconf_full_key (key_type, applet->id, "toplevel_id");
1420
if (!gconf_client_key_is_writable (client, key, NULL))
1423
key = panel_gconf_full_key (key_type, applet->id, "panel_right_stick");
1424
if (!gconf_client_key_is_writable (client, key, NULL))
1431
panel_applet_lockable (AppletInfo *applet)
1433
GConfClient *client;
1434
PanelGConfKeyType key_type;
1437
if (panel_lockdown_get_locked_down ())
1440
client = panel_gconf_get_client ();
1442
key_type = (applet->type == PANEL_OBJECT_APPLET) ? PANEL_GCONF_APPLETS : PANEL_GCONF_OBJECTS;
1444
key = panel_gconf_full_key (key_type, applet->id, "locked");
1446
return gconf_client_key_is_writable (client, key, NULL);
1027
/* if we check for more lockdown than this, then we'll need to update
1028
* callers that use panel_lockdown_on_notify() */
1029
if (panel_lockdown_get_panels_locked_down_s ())
1032
return (g_settings_is_writable (applet->settings,
1033
PANEL_OBJECT_TOPLEVEL_ID_KEY) &&
1034
g_settings_is_writable (applet->settings,
1035
PANEL_OBJECT_PACK_TYPE_KEY) &&
1036
g_settings_is_writable (applet->settings,
1037
PANEL_OBJECT_PACK_INDEX_KEY));