585
add_app_to_panel (GtkWidget *item,
586
GMenuTreeEntry *entry)
588
PanelWidget *panel_widget;
589
PanelToplevel *toplevel;
593
panel_widget = menu_get_panel (item);
594
toplevel = panel_widget->toplevel;
596
pd = g_object_get_data (G_OBJECT (toplevel), "PanelData");
597
position = pd ? pd->insertion_pos : -1;
599
panel_launcher_create (toplevel,
601
gmenu_tree_entry_get_desktop_file_path (entry));
606
add_app_to_desktop (GtkWidget *item,
607
GMenuTreeEntry *entry)
616
g_return_if_fail (entry != NULL);
618
if (desktop_is_home_dir ()) {
619
target_dir = g_build_filename (g_get_home_dir (), NULL);
621
target_dir = g_strdup (g_get_user_special_dir (G_USER_DIRECTORY_DESKTOP));
624
source = gmenu_tree_entry_get_desktop_file_path (entry);
625
source_uri = g_filename_to_uri (source, NULL, NULL);
627
target_uri = panel_make_unique_desktop_uri (target_dir, source_uri);
631
g_return_if_fail (target_uri != NULL);
633
target = g_filename_from_uri (target_uri, NULL, NULL);
637
panel_key_file_copy_and_mark_trusted (source, target, &error);
642
g_warning ("Problem while copying launcher to desktop: %s",
644
g_error_free (error);
649
static void add_drawers_from_dir (GMenuTreeDirectory *directory,
651
const char *toplevel_id);
654
add_drawers_from_alias (GMenuTreeAlias *alias,
655
const char *toplevel_id)
657
GMenuTreeItem *aliased_item;
659
aliased_item = gmenu_tree_alias_get_item (alias);
661
switch (gmenu_tree_item_get_type (aliased_item)) {
662
case GMENU_TREE_ITEM_DIRECTORY:
663
add_drawers_from_dir (GMENU_TREE_DIRECTORY (aliased_item),
668
case GMENU_TREE_ITEM_ENTRY:
669
panel_launcher_create_with_id (toplevel_id,
671
gmenu_tree_entry_get_desktop_file_path (GMENU_TREE_ENTRY (aliased_item)));
678
gmenu_tree_item_unref (aliased_item);
682
add_drawers_from_dir (GMenuTreeDirectory *directory,
684
const char *toplevel_id)
690
char *attached_toplevel_id;
692
name = gmenu_tree_directory_get_name (directory);
693
icon = gmenu_tree_directory_get_icon (directory);
695
attached_toplevel_id = panel_drawer_create_with_id (toplevel_id,
700
if (!attached_toplevel_id)
703
items = gmenu_tree_directory_get_contents (directory);
704
for (l = items; l; l = l->next) {
705
GMenuTreeItem *item = l->data;
707
switch (gmenu_tree_item_get_type (item)) {
708
case GMENU_TREE_ITEM_ENTRY:
709
panel_launcher_create_with_id (attached_toplevel_id,
711
gmenu_tree_entry_get_desktop_file_path (GMENU_TREE_ENTRY (item)));
714
case GMENU_TREE_ITEM_DIRECTORY:
715
add_drawers_from_dir (GMENU_TREE_DIRECTORY (item),
717
attached_toplevel_id);
720
case GMENU_TREE_ITEM_ALIAS:
721
add_drawers_from_alias (GMENU_TREE_ALIAS (item), attached_toplevel_id);
728
gmenu_tree_item_unref (item);
731
g_slist_free (items);
733
g_free (attached_toplevel_id);
737
add_menudrawer_to_panel (GtkWidget *menuitem,
738
GMenuTreeEntry *entry)
741
GMenuTreeDirectory *directory;
746
directory = gmenu_tree_item_get_parent (GMENU_TREE_ITEM (entry));
748
panel = menu_get_panel (menuitem);
750
pd = g_object_get_data (G_OBJECT (panel->toplevel), "PanelData");
751
insertion_pos = pd ? pd->insertion_pos : -1;
753
add_drawers_from_dir (directory,
755
panel_profile_get_toplevel_id (panel->toplevel));
757
gmenu_tree_item_unref (directory);
761
add_menu_to_panel (GtkWidget *menuitem,
762
GMenuTreeEntry *entry)
764
GMenuTreeDirectory *directory;
770
const char *menu_filename;
772
directory = gmenu_tree_item_get_parent (GMENU_TREE_ITEM (entry));
774
g_warning ("Cannot find the filename for the menu: no directory");
778
tree = gmenu_tree_directory_get_tree (directory);
780
gmenu_tree_item_unref (directory);
781
g_warning ("Cannot find the filename for the menu: no tree");
785
menu_filename = gmenu_tree_get_menu_file (tree);
786
gmenu_tree_unref (tree);
787
if (!menu_filename) {
788
gmenu_tree_item_unref (directory);
789
g_warning ("Cannot find the filename for the menu: no filename");
793
panel = menu_get_panel (menuitem);
795
pd = g_object_get_data (G_OBJECT (panel->toplevel), "PanelData");
796
insertion_pos = pd ? pd->insertion_pos : -1;
798
menu_path = gmenu_tree_directory_make_path (directory, NULL);
800
panel_menu_button_create (panel->toplevel,
805
gmenu_tree_directory_get_name (directory));
809
gmenu_tree_item_unref (directory);
812
/*most of this function stolen from the real gtk_menu_popup*/
814
restore_grabs(GtkWidget *w, gpointer data)
816
GtkWidget *menu_item = data;
817
GtkMenu *menu = GTK_MENU (gtk_widget_get_parent (menu_item));
818
GtkWidget *xgrab_shell;
821
/* Find the last viewable ancestor, and make an X grab on it
823
parent = GTK_WIDGET (menu);
826
gboolean viewable = TRUE;
827
GtkWidget *tmp = parent;
830
if (!gtk_widget_get_mapped (tmp)) {
834
tmp = gtk_widget_get_parent (tmp);
838
xgrab_shell = parent;
840
parent = GTK_MENU_SHELL (parent)->parent_menu_shell;
843
/*only grab if this HAD a grab before*/
844
if (xgrab_shell && (GTK_MENU_SHELL (xgrab_shell)->have_xgrab))
846
GdkWindow *window = gtk_widget_get_window (xgrab_shell);
848
if (gdk_pointer_grab (window, TRUE,
849
GDK_BUTTON_PRESS_MASK |
850
GDK_BUTTON_RELEASE_MASK |
851
GDK_ENTER_NOTIFY_MASK |
852
GDK_LEAVE_NOTIFY_MASK,
855
if (gdk_keyboard_grab (window, TRUE,
856
GDK_CURRENT_TIME) == 0)
857
GTK_MENU_SHELL (xgrab_shell)->have_xgrab = TRUE;
859
gdk_pointer_ungrab (GDK_CURRENT_TIME);
863
gtk_grab_add (GTK_WIDGET (menu));
867
menu_destroy_context_menu (GtkWidget *item,
870
g_signal_handlers_disconnect_by_func (menu, restore_grabs, item);
871
gtk_widget_destroy (menu);
875
create_item_context_menu (GtkWidget *item,
876
PanelWidget *panel_widget)
878
GMenuTreeEntry *entry;
879
GMenuTreeDirectory *directory;
884
const char *menu_filename;
885
gboolean id_lists_writable;
887
id_lists_writable = panel_profile_id_lists_are_writable ();
889
entry = g_object_get_data (G_OBJECT (item), "panel-menu-tree-entry");
893
directory = gmenu_tree_item_get_parent (GMENU_TREE_ITEM (entry));
897
tree = gmenu_tree_directory_get_tree (directory);
898
gmenu_tree_item_unref (directory);
902
menu_filename = gmenu_tree_get_menu_file (tree);
903
gmenu_tree_unref (tree);
907
menu = create_empty_menu ();
908
g_object_set_data (G_OBJECT (item), "panel-item-context-menu", menu);
909
g_object_set_data (G_OBJECT (menu), "menu_panel", panel_widget);
911
g_signal_connect (item, "destroy",
912
G_CALLBACK (menu_destroy_context_menu), menu);
913
g_signal_connect (menu, "deactivate",
914
G_CALLBACK (restore_grabs), item);
916
menuitem = gtk_menu_item_new_with_mnemonic (_("Add this launcher to _panel"));
917
g_signal_connect (menuitem, "activate",
918
G_CALLBACK (add_app_to_panel), entry);
919
gtk_widget_set_sensitive (menuitem, id_lists_writable);
920
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
921
gtk_widget_show (menuitem);
923
menuitem = gtk_menu_item_new_with_mnemonic (_("Add this launcher to _desktop"));
924
g_signal_connect (menuitem, "activate",
925
G_CALLBACK (add_app_to_desktop), entry);
926
gtk_widget_set_sensitive (menuitem, id_lists_writable);
927
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
928
gtk_widget_show (menuitem);
931
submenu = create_empty_menu ();
933
g_object_set_data (G_OBJECT (submenu), "menu_panel", panel_widget);
935
menuitem = gtk_menu_item_new_with_mnemonic (_("_Entire menu"));
936
gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
937
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
938
gtk_widget_show (menuitem);
940
menuitem = gtk_menu_item_new_with_mnemonic (_("Add this as _drawer to panel"));
941
g_signal_connect (menuitem, "activate",
942
G_CALLBACK (add_menudrawer_to_panel), entry);
943
gtk_widget_set_sensitive (menuitem, id_lists_writable);
944
gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
945
gtk_widget_show (menuitem);
947
menuitem = gtk_menu_item_new_with_mnemonic (_("Add this as _menu to panel"));
948
g_signal_connect (menuitem, "activate",
949
G_CALLBACK (add_menu_to_panel), entry);
950
gtk_widget_set_sensitive (menuitem, id_lists_writable);
951
gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem);
952
gtk_widget_show (menuitem);
958
show_item_menu (GtkWidget *item,
959
GdkEventButton *bevent)
961
PanelWidget *panel_widget;
964
if (panel_lockdown_get_locked_down ())
967
panel_widget = menu_get_panel (item);
969
menu = g_object_get_data (G_OBJECT (item), "panel-item-context-menu");
972
menu = create_item_context_menu (item, panel_widget);
977
gtk_menu_set_screen (GTK_MENU (menu),
978
gtk_window_get_screen (GTK_WINDOW (panel_widget->toplevel)));
980
gtk_menu_popup (GTK_MENU (menu),
981
NULL, NULL, NULL, NULL,
989
568
menu_dummy_button_press_event (GtkWidget *menuitem,
990
569
GdkEventButton *event)
1053
622
xgrab_shell = parent;
1055
parent = GTK_MENU_SHELL (parent)->parent_menu_shell;
624
parent = gtk_menu_shell_get_parent_shell (GTK_MENU_SHELL (parent));
1058
627
if (xgrab_shell && !gtk_menu_get_tearoff_state (GTK_MENU(xgrab_shell)))
633
GdkDeviceManager *device_manager;
1060
634
GdkWindow *window = gtk_widget_get_window (xgrab_shell);
1061
635
GdkCursor *cursor = gdk_cursor_new (GDK_ARROW);
1063
if ((gdk_pointer_grab (window, TRUE,
1064
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
1065
GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK |
1066
GDK_POINTER_MOTION_MASK,
1067
NULL, cursor, GDK_CURRENT_TIME) == 0))
637
display = gdk_window_get_display (window);
638
device_manager = gdk_display_get_device_manager (display);
639
pointer = gdk_device_manager_get_client_pointer (device_manager);
640
keyboard = gdk_device_get_associated_device (pointer);
642
/* FIXMEgpoo: Not sure if report to GDK_OWNERSHIP_WINDOW
643
or GDK_OWNERSHIP_APPLICATION. Idem for the
645
status = gdk_device_grab (pointer, window,
646
GDK_OWNERSHIP_WINDOW, TRUE,
647
GDK_BUTTON_PRESS_MASK
648
| GDK_BUTTON_RELEASE_MASK
649
| GDK_ENTER_NOTIFY_MASK
650
| GDK_LEAVE_NOTIFY_MASK
651
| GDK_POINTER_MOTION_MASK,
652
cursor, GDK_CURRENT_TIME);
1069
if (gdk_keyboard_grab (window, TRUE,
1070
GDK_CURRENT_TIME) == 0)
1071
GTK_MENU_SHELL (xgrab_shell)->have_xgrab = TRUE;
656
if (gdk_device_grab (keyboard, window,
657
GDK_OWNERSHIP_WINDOW, TRUE,
658
GDK_KEY_PRESS | GDK_KEY_RELEASE,
659
NULL, GDK_CURRENT_TIME) == GDK_GRAB_SUCCESS)
661
/* FIXMEgpoo: We need either accessors or a workaround to grab
664
GTK_MENU_SHELL (xgrab_shell)->GSEAL(have_xgrab) = TRUE;
1074
gdk_pointer_ungrab (GDK_CURRENT_TIME);
669
gdk_device_ungrab (pointer, GDK_CURRENT_TIME);
1078
gdk_cursor_unref (cursor);
673
g_object_unref (cursor);