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"
37
#include "applet-signaler.h"
39
#define SMALL_ICON_SIZE 20
36
#include "panel-schemas.h"
41
38
static GSList *registered_applets = NULL;
42
39
static GSList *queued_position_saves = NULL;
43
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);
46
46
static inline PanelWidget *
47
47
panel_applet_get_panel_widget (AppletInfo *info)
156
panel_applet_recreate_menu (AppletInfo *info)
121
panel_applet_recreate_menu (AppletInfo *info)
163
for (l = info->user_menu; l; l = l->next) {
164
AppletUserMenu *menu = l->data;
166
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);
170
g_object_unref (info->menu);
171
info->menu = panel_applet_create_menu (info);
175
panel_applet_locked_change_notify (GConfClient *client,
182
gboolean applet_locked;
184
PanelWidget *panel_widget;
186
g_assert (applet != NULL);
188
info = (AppletInfo *) g_object_get_data (G_OBJECT (applet),
193
value = gconf_entry_get_value (entry);
194
if (value == NULL || value->type != GCONF_VALUE_BOOL)
197
locked = gconf_value_get_bool (value);
199
panel_widget = panel_applet_get_panel_widget (info);
200
applet_locked = panel_widget_get_applet_locked (panel_widget,
203
if ((locked && applet_locked) || !(locked || applet_locked))
206
panel_applet_toggle_locked (info);
208
if (info->type == PANEL_OBJECT_APPLET)
209
panel_applet_frame_sync_menu_state (PANEL_APPLET_FRAME (info->widget));
211
panel_applet_recreate_menu (info);
145
panel_applet_get_menu (info);
505
438
added_anything = TRUE;
508
if (!panel_lockdown_get_locked_down ()) {
515
lockable = panel_applet_lockable (info);
516
movable = panel_applet_can_freely_move (info);
517
removable = panel_profile_id_lists_are_writable ();
519
locked = panel_widget_get_applet_locked (panel_widget, info->widget);
521
if (added_anything) {
522
menuitem = gtk_separator_menu_item_new ();
523
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
524
gtk_widget_show (menuitem);
527
menuitem = gtk_image_menu_item_new_with_mnemonic (_("_Remove From Panel"));
528
image = gtk_image_new_from_stock (GTK_STOCK_REMOVE,
530
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem),
532
g_signal_connect (menuitem, "activate",
533
G_CALLBACK (applet_remove_callback), info);
534
gtk_widget_show (menuitem);
535
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
536
gtk_widget_set_sensitive (menuitem, (!locked || lockable) && removable);
538
menuitem = gtk_menu_item_new_with_mnemonic (_("_Move"));
539
g_signal_connect (menuitem, "activate",
540
G_CALLBACK (move_applet_callback), info);
541
gtk_widget_show (menuitem);
542
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
543
gtk_widget_set_sensitive (menuitem, !locked && movable);
545
g_assert (info->move_item == NULL);
547
info->move_item = menuitem;
548
g_object_add_weak_pointer (G_OBJECT (menuitem),
549
(gpointer *) &info->move_item);
551
menuitem = gtk_separator_menu_item_new ();
552
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
553
gtk_widget_show (menuitem);
555
menuitem = gtk_check_menu_item_new_with_mnemonic (_("Loc_k To Panel"));
556
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menuitem),
558
g_signal_connect (menuitem, "toggled",
559
G_CALLBACK (panel_applet_lock), info);
560
gtk_widget_show (menuitem);
561
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
562
gtk_widget_set_sensitive (menuitem, lockable);
564
added_anything = TRUE;
567
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);
568
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;
576
535
panel_applet_menu_set_recurse (GtkMenu *menu,
670
629
applet_show_menu (AppletInfo *info,
631
gboolean custom_position,
671
632
GdkEventButton *event)
673
634
PanelWidget *panel_widget;
675
636
g_return_if_fail (info != NULL);
677
641
panel_widget = panel_applet_get_panel_widget (info);
679
if (info->menu == NULL)
680
info->menu = panel_applet_create_menu (info);
682
if (info->menu == NULL)
685
panel_applet_menu_set_recurse (GTK_MENU (info->menu),
643
panel_applet_menu_set_recurse (GTK_MENU (menu),
689
gtk_menu_set_screen (GTK_MENU (info->menu),
647
gtk_menu_set_screen (GTK_MENU (menu),
690
648
gtk_window_get_screen (GTK_WINDOW (panel_widget->toplevel)));
692
if (!gtk_widget_get_realized (info->menu))
693
gtk_widget_show (info->menu);
650
if (!gtk_widget_get_realized (menu))
651
gtk_widget_show (menu);
695
gtk_menu_popup (GTK_MENU (info->menu),
698
(GtkMenuPositionFunc) panel_applet_position_menu,
653
gtk_menu_popup (GTK_MENU (menu),
657
(GtkMenuPositionFunc) panel_applet_position_menu : NULL,
705
applet_do_popup_menu (GtkWidget *widget,
706
GdkEventButton *event,
664
applet_must_skip_menu (AppletInfo *info)
709
666
if (panel_applet_is_in_drag ())
712
669
if (info->type == PANEL_OBJECT_APPLET)
715
applet_show_menu (info, event);
721
applet_popup_menu (GtkWidget *widget,
724
GdkEventButton event;
727
event.time = GDK_CURRENT_TIME;
729
return applet_do_popup_menu (widget, &event, info);
734
677
GdkEventButton *event,
735
678
AppletInfo *info)
737
if (event->button == 3)
738
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);
751
737
info->widget = NULL;
753
739
registered_applets = g_slist_remove (registered_applets, info);
754
panel_applet_signaler_remove_applet(info);
756
741
queued_position_saves =
757
742
g_slist_remove (queued_position_saves, info);
759
if (info->type == PANEL_OBJECT_DRAWER) {
760
Drawer *drawer = info->data;
762
if (drawer->toplevel) {
763
PanelWidget *panel_widget;
765
panel_widget = panel_toplevel_get_panel_widget (
767
panel_widget->master_widget = NULL;
769
gtk_widget_destroy (GTK_WIDGET (drawer->toplevel));
770
drawer->toplevel = NULL;
774
if (info->type != PANEL_OBJECT_APPLET)
775
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);
779
752
g_object_unref (info->menu);
780
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;
782
768
if (info->data_destroy)
783
769
info->data_destroy (info->data);
784
770
info->data = NULL;
796
782
g_list_free (info->user_menu);
797
783
info->user_menu = NULL;
786
g_object_unref (info->settings);
787
info->settings = NULL;
799
789
g_free (info->id);
807
PanelObjectType type;
810
guint right_stick : 1;
814
/* Each time those lists get both empty,
815
* panel_applet_queue_initial_unhide_toplevels() should be called */
816
static GSList *panel_applets_to_load = NULL;
817
static GSList *panel_applets_loading = NULL;
818
/* We have a timeout to always unhide toplevels after a delay, in case of some
820
#define UNHIDE_TOPLEVELS_TIMEOUT_SECONDS 5
821
static guint panel_applet_unhide_toplevels_timeout = 0;
823
static gboolean panel_applet_have_load_idle = FALSE;
826
free_applet_to_load (PanelAppletToLoad *applet)
831
g_free (applet->toplevel_id);
832
applet->toplevel_id = NULL;
838
panel_applet_on_load_queue (const char *id)
841
for (li = panel_applets_to_load; li != NULL; li = li->next) {
842
PanelAppletToLoad *applet = li->data;
843
if (strcmp (applet->id, id) == 0)
846
for (li = panel_applets_loading; li != NULL; li = li->next) {
847
PanelAppletToLoad *applet = li->data;
848
if (strcmp (applet->id, id) == 0)
854
/* This doesn't do anything if the initial unhide already happened */
856
panel_applet_queue_initial_unhide_toplevels (gpointer user_data)
860
if (panel_applet_unhide_toplevels_timeout != 0) {
861
g_source_remove (panel_applet_unhide_toplevels_timeout);
862
panel_applet_unhide_toplevels_timeout = 0;
865
for (l = panel_toplevel_list_toplevels (); l != NULL; l = l->next)
866
panel_toplevel_queue_initial_unhide ((PanelToplevel *) l->data);
872
panel_applet_stop_loading (const char *id)
874
PanelAppletToLoad *applet;
877
for (l = panel_applets_loading; l; l = l->next) {
880
if (strcmp (applet->id, id) == 0)
884
/* this can happen if we reload an applet after it crashed,
887
panel_applets_loading = g_slist_delete_link (panel_applets_loading, l);
888
free_applet_to_load (applet);
891
if (panel_applets_loading == NULL && panel_applets_to_load == NULL)
892
panel_applet_queue_initial_unhide_toplevels (NULL);
896
panel_applet_load_idle_handler (gpointer dummy)
898
PanelObjectType applet_type;
899
PanelAppletToLoad *applet = NULL;
900
PanelToplevel *toplevel = NULL;
901
PanelWidget *panel_widget;
904
if (!panel_applets_to_load) {
905
panel_applet_have_load_idle = FALSE;
909
for (l = panel_applets_to_load; l; l = l->next) {
912
toplevel = panel_profile_get_toplevel_by_id (applet->toplevel_id);
918
/* All the remaining applets don't have a panel */
919
for (l = panel_applets_to_load; l; l = l->next)
920
free_applet_to_load (l->data);
921
g_slist_free (panel_applets_to_load);
922
panel_applets_to_load = NULL;
923
panel_applet_have_load_idle = FALSE;
925
if (panel_applets_loading == NULL) {
926
/* unhide any potential initially hidden toplevel */
927
panel_applet_queue_initial_unhide_toplevels (NULL);
933
panel_applets_to_load = g_slist_delete_link (panel_applets_to_load, l);
934
panel_applets_loading = g_slist_append (panel_applets_loading, applet);
936
panel_widget = panel_toplevel_get_panel_widget (toplevel);
938
if (applet->right_stick) {
939
if (!panel_widget->packed)
940
applet->position = panel_widget->size - applet->position;
942
applet->position = -1;
945
/* We load applets asynchronously, so we specifically don't call
946
* panel_applet_stop_loading() for this type. However, in case of
947
* failure during the load, we might call panel_applet_stop_loading()
948
* synchronously, which will make us lose the content of the applet
949
* variable. So we save the type to be sure we always ignore the
951
applet_type = applet->type;
953
switch (applet_type) {
954
case PANEL_OBJECT_APPLET:
955
panel_applet_frame_load_from_gconf (
961
case PANEL_OBJECT_DRAWER:
962
drawer_load_from_gconf (panel_widget,
967
case PANEL_OBJECT_MENU:
968
panel_menu_button_load_from_gconf (panel_widget,
974
case PANEL_OBJECT_LAUNCHER:
975
launcher_load_from_gconf (panel_widget,
980
case PANEL_OBJECT_LOGOUT:
981
case PANEL_OBJECT_LOCK:
982
panel_action_button_load_compatible (
990
case PANEL_OBJECT_ACTION:
991
panel_action_button_load_from_gconf (
998
case PANEL_OBJECT_MENU_BAR:
999
panel_menu_bar_load_from_gconf (
1006
case PANEL_OBJECT_SEPARATOR:
1007
panel_separator_load_from_gconf (panel_widget,
1013
g_assert_not_reached ();
1017
/* Only the real applets will do a late stop_loading */
1018
if (applet_type != PANEL_OBJECT_APPLET)
1019
panel_applet_stop_loading (applet->id);
1025
panel_applet_queue_applet_to_load (const char *id,
1026
PanelObjectType type,
1027
const char *toplevel_id,
1029
gboolean right_stick,
1032
PanelAppletToLoad *applet;
1035
g_warning ("No toplevel on which to load object '%s'\n", id);
1039
applet = g_new0 (PanelAppletToLoad, 1);
1041
applet->id = g_strdup (id);
1042
applet->type = type;
1043
applet->toplevel_id = g_strdup (toplevel_id);
1044
applet->position = position;
1045
applet->right_stick = right_stick != FALSE;
1046
applet->locked = locked != FALSE;
1048
panel_applets_to_load = g_slist_prepend (panel_applets_to_load, applet);
1052
panel_applet_compare (const PanelAppletToLoad *a,
1053
const PanelAppletToLoad *b)
1057
if ((c = strcmp (a->toplevel_id, b->toplevel_id)))
1059
else if (a->right_stick != b->right_stick)
1060
return b->right_stick ? -1 : 1;
1062
return a->position - b->position;
1066
panel_applet_load_queued_applets (gboolean initial_load)
1068
if (!panel_applets_to_load) {
1069
panel_applet_queue_initial_unhide_toplevels (NULL);
1073
if (panel_applets_to_load && panel_applet_unhide_toplevels_timeout == 0) {
1074
/* Install a timeout to make sure we don't block the
1075
* unhiding because of an applet that doesn't load */
1076
panel_applet_unhide_toplevels_timeout =
1077
g_timeout_add_seconds (UNHIDE_TOPLEVELS_TIMEOUT_SECONDS,
1078
panel_applet_queue_initial_unhide_toplevels,
1082
panel_applets_to_load = g_slist_sort (panel_applets_to_load,
1083
(GCompareFunc) panel_applet_compare);
1085
if ( ! panel_applet_have_load_idle) {
1086
/* on panel startup, we don't care about redraws of the
1087
* toplevels since they are hidden, so we give a higher
1088
* priority to loading of applets */
1090
g_idle_add_full (G_PRIORITY_HIGH_IDLE,
1091
panel_applet_load_idle_handler,
1094
g_idle_add (panel_applet_load_idle_handler, NULL);
1096
panel_applet_have_load_idle = TRUE;
1100
795
static G_CONST_RETURN char *
1101
796
panel_applet_get_toplevel_id (AppletInfo *applet)
1165
855
if (!(toplevel_id = panel_applet_get_toplevel_id (applet_info)))
1168
client = panel_gconf_get_client ();
1170
key_type = applet_info->type == PANEL_OBJECT_APPLET ? PANEL_GCONF_APPLETS : PANEL_GCONF_OBJECTS;
1172
858
panel_widget = panel_applet_get_panel_widget (applet_info);
1174
/* FIXME: Instead of getting keys, comparing and setting, there
1175
should be a dirty flag */
1177
key = panel_gconf_full_key (key_type, id, "toplevel_id");
1178
old_toplevel_id = gconf_client_get_string (client, key, NULL);
1179
if (old_toplevel_id == NULL || strcmp (old_toplevel_id, toplevel_id) != 0)
1180
gconf_client_set_string (client, key, toplevel_id, NULL);
1181
g_free (old_toplevel_id);
1183
/* Note: changing some properties of the panel that may not be locked down
1184
(e.g. background) can change the state of the "panel_right_stick" and
1185
"position" properties of an applet that may in fact be locked down.
1186
So check if these are writable before attempting to write them */
1188
right_stick = panel_is_applet_right_stick (applet_info->widget) ? 1 : 0;
1189
key = panel_gconf_full_key (
1190
key_type, id, "panel_right_stick");
1191
if (gconf_client_key_is_writable (client, key, NULL) &&
1192
(gconf_client_get_bool (client, key, NULL) ? 1 : 0) != right_stick)
1193
gconf_client_set_bool (client, key, right_stick, NULL);
1195
position = panel_applet_get_position (applet_info);
1196
if (right_stick && !panel_widget->packed)
1197
position = panel_widget->size - position;
1199
key = panel_gconf_full_key (key_type, id, "position");
1200
if (gconf_client_key_is_writable (client, key, NULL) &&
1201
gconf_client_get_int (client, key, NULL) != position)
1202
gconf_client_set_int (client, key, position, NULL);
1204
locked = panel_widget_get_applet_locked (panel_widget, applet_info->widget) ? 1 : 0;
1205
key = panel_gconf_full_key (key_type, id, "locked");
1206
if (gconf_client_get_bool (client, key, NULL) ? 1 : 0 != locked)
1207
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);
1350
963
info = g_new0 (AppletInfo, 1);
1351
964
info->type = type;
1352
965
info->widget = applet;
966
info->settings = g_object_ref (settings);
1353
967
info->menu = NULL;
968
info->edit_menu = NULL;
1354
969
info->data = data;
1355
970
info->data_destroy = data_destroy;
1356
971
info->user_menu = NULL;
1357
info->move_item = NULL;
1358
972
info->id = g_strdup (id);
1360
974
g_object_set_data (G_OBJECT (applet), "applet_info", info);
1362
if (type != PANEL_OBJECT_APPLET)
1363
panel_lockdown_notify_add (G_CALLBACK (panel_applet_recreate_menu),
1366
key = panel_gconf_full_key ((type == PANEL_OBJECT_APPLET) ?
1367
PANEL_GCONF_APPLETS : PANEL_GCONF_OBJECTS,
1369
panel_gconf_notify_add_while_alive (key,
1370
(GConfClientNotifyFunc) panel_applet_locked_change_notify,
1373
if (type == PANEL_OBJECT_DRAWER) {
1374
Drawer *drawer = data;
1375
PanelWidget *assoc_panel;
1377
assoc_panel = panel_toplevel_get_panel_widget (drawer->toplevel);
1379
g_object_set_data (G_OBJECT (applet),
1380
PANEL_APPLET_ASSOC_PANEL_KEY, assoc_panel);
1381
assoc_panel->master_widget = applet;
1382
g_object_add_weak_pointer (
1383
G_OBJECT (applet), (gpointer *) &assoc_panel->master_widget);
1386
g_object_set_data (G_OBJECT (applet),
1387
PANEL_APPLET_FORBIDDEN_PANELS, NULL);
1389
976
registered_applets = g_slist_append (registered_applets, info);
1391
if (panel_widget_add (panel, applet, locked, pos, exactpos) == -1 &&
1392
panel_widget_add (panel, applet, locked, 0, TRUE) == -1) {
1395
for (l = panels; l; l = l->next) {
1396
panel = PANEL_WIDGET (l->data);
1398
if (panel_widget_add (panel, applet, locked, 0, TRUE) != -1)
1403
g_warning (_("Cannot find an empty spot"));
1404
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);
1409
985
if (BUTTON_IS_WIDGET (applet) ||
1410
986
gtk_widget_get_has_window (applet)) {
1435
1011
gtk_widget_child_focus (applet, GTK_DIR_TAB_FORWARD);
1437
panel_applet_signaler_add_applet(info);
1442
panel_applet_get_position (AppletInfo *applet)
1017
panel_applet_get_settings (AppletInfo *applet)
1444
AppletData *applet_data;
1446
g_return_val_if_fail (applet != NULL, 0);
1447
g_return_val_if_fail (G_IS_OBJECT (applet->widget), 0);
1449
applet_data = g_object_get_data (G_OBJECT (applet->widget), PANEL_APPLET_DATA);
1451
return applet_data->pos;
1019
g_return_val_if_fail (applet != NULL, NULL);
1021
return applet->settings;
1455
1025
panel_applet_can_freely_move (AppletInfo *applet)
1457
GConfClient *client;
1458
PanelGConfKeyType key_type;
1461
if (panel_lockdown_get_locked_down ())
1464
client = panel_gconf_get_client ();
1466
key_type = (applet->type == PANEL_OBJECT_APPLET) ? PANEL_GCONF_APPLETS : PANEL_GCONF_OBJECTS;
1468
key = panel_gconf_full_key (key_type, applet->id, "position");
1469
if (!gconf_client_key_is_writable (client, key, NULL))
1472
key = panel_gconf_full_key (key_type, applet->id, "toplevel_id");
1473
if (!gconf_client_key_is_writable (client, key, NULL))
1476
key = panel_gconf_full_key (key_type, applet->id, "panel_right_stick");
1477
if (!gconf_client_key_is_writable (client, key, NULL))
1484
panel_applet_lockable (AppletInfo *applet)
1486
GConfClient *client;
1487
PanelGConfKeyType key_type;
1490
if (panel_lockdown_get_locked_down ())
1493
client = panel_gconf_get_client ();
1495
key_type = (applet->type == PANEL_OBJECT_APPLET) ? PANEL_GCONF_APPLETS : PANEL_GCONF_OBJECTS;
1497
key = panel_gconf_full_key (key_type, applet->id, "locked");
1499
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));