static GtkWidget * create_fake_menu (MateMenuTreeDirectory *directory) { GtkWidget *menu; guint idle_id; menu = create_empty_menu (); g_object_set_data_full (G_OBJECT (menu), "panel-menu-tree-directory", matemenu_tree_item_ref (directory), (GDestroyNotify) matemenu_tree_item_unref); g_object_set_data (G_OBJECT (menu), "panel-menu-needs-loading", GUINT_TO_POINTER (TRUE)); g_signal_connect (menu, "show", G_CALLBACK (submenu_to_display), NULL); idle_id = g_idle_add_full (G_PRIORITY_LOW, submenu_to_display_in_idle, menu, NULL); g_object_set_data_full (G_OBJECT (menu), "panel-menu-idle-id", GUINT_TO_POINTER (idle_id), remove_submenu_to_display_idle); g_signal_connect (menu, "button_press_event", G_CALLBACK (menu_dummy_button_press_event), NULL); return menu; }
static GSList * get_all_applications_from_dir (MateMenuTreeDirectory *directory, GSList *list) { GSList *items; GSList *l; items = matemenu_tree_directory_get_contents (directory); for (l = items; l; l = l->next) { switch (matemenu_tree_item_get_type (l->data)) { case MATEMENU_TREE_ITEM_ENTRY: list = g_slist_append (list, matemenu_tree_item_ref (l->data)); break; case MATEMENU_TREE_ITEM_DIRECTORY: list = get_all_applications_from_dir (l->data, list); break; case MATEMENU_TREE_ITEM_ALIAS: list = get_all_applications_from_alias (l->data, list); break; default: break; } matemenu_tree_item_unref (l->data); } g_slist_free (items); return list; }
static GSList * get_all_applications_from_alias (MateMenuTreeAlias *alias, GSList *list) { MateMenuTreeItem *aliased_item; aliased_item = matemenu_tree_alias_get_item (alias); switch (matemenu_tree_item_get_type (aliased_item)) { case MATEMENU_TREE_ITEM_ENTRY: list = g_slist_append (list, matemenu_tree_item_ref (aliased_item)); break; case MATEMENU_TREE_ITEM_DIRECTORY: list = get_all_applications_from_dir (MATEMENU_TREE_DIRECTORY (aliased_item), list); break; default: break; } matemenu_tree_item_unref (aliased_item); return list; }
static void create_header (GtkWidget *menu, MateMenuTreeHeader *header) { MateMenuTreeDirectory *directory; GtkWidget *menuitem; directory = matemenu_tree_header_get_directory (header); menuitem = create_submenu_entry (menu, directory); matemenu_tree_item_unref (directory); g_object_set_data_full (G_OBJECT (menuitem), "panel-matemenu-tree.header", matemenu_tree_item_ref (header), (GDestroyNotify) matemenu_tree_item_unref); g_signal_connect (menuitem, "activate", G_CALLBACK (gtk_false), NULL); }
static GtkWidget * create_fake_menu (MateMenuTreeDirectory *directory) { GtkWidget *menu; guint idle_id; menu = create_empty_menu (); g_object_set_data_full (G_OBJECT (menu), "panel-menu-tree-directory", matemenu_tree_item_ref (directory), (GDestroyNotify) matemenu_tree_item_unref); g_object_set_data (G_OBJECT (menu), "panel-menu-needs-loading", GUINT_TO_POINTER (TRUE)); g_signal_connect (menu, "show", G_CALLBACK (submenu_to_display), NULL); idle_id = g_idle_add_full (G_PRIORITY_LOW, submenu_to_display_in_idle, menu, NULL); g_object_set_data_full (G_OBJECT (menu), "panel-menu-idle-id", GUINT_TO_POINTER (idle_id), remove_submenu_to_display_idle); g_signal_connect (menu, "button_press_event", G_CALLBACK (menu_dummy_button_press_event), NULL); /* Fix any failures of compiz/other wm's to communicate with gtk for transparency */ #if GTK_CHECK_VERSION (3, 0, 0) GtkWidget *toplevel = gtk_widget_get_toplevel (menu); GdkScreen *screen = gtk_widget_get_screen(GTK_WIDGET(toplevel)); GdkVisual *visual = gdk_screen_get_rgba_visual(screen); gtk_widget_set_visual(GTK_WIDGET(toplevel), visual); #endif return menu; }
static void create_menuitem (GtkWidget *menu, MateMenuTreeEntry *entry, MateMenuTreeDirectory *alias_directory) { GtkWidget *menuitem; menuitem = panel_image_menu_item_new (); g_object_set_data_full (G_OBJECT (menuitem), "panel-menu-tree-entry", matemenu_tree_item_ref (entry), (GDestroyNotify) matemenu_tree_item_unref); if (alias_directory) //FIXME: we should probably use this data when we do dnd or //context menu for this menu item g_object_set_data_full (G_OBJECT (menuitem), "panel-menu-tree-alias-directory", matemenu_tree_item_ref (alias_directory), (GDestroyNotify) matemenu_tree_item_unref); panel_load_menu_image_deferred (menuitem, panel_menu_icon_get_size (), NULL, NULL, alias_directory ? matemenu_tree_directory_get_icon (alias_directory) : matemenu_tree_entry_get_icon (entry), PANEL_STOCK_DEFAULT_ICON); setup_menuitem (menuitem, panel_menu_icon_get_size (), NULL, alias_directory ? matemenu_tree_directory_get_name (alias_directory) : matemenu_tree_entry_get_display_name (entry)); if (alias_directory && matemenu_tree_directory_get_comment (alias_directory)) panel_util_set_tooltip_text (menuitem, matemenu_tree_directory_get_comment (alias_directory)); else if (!alias_directory && matemenu_tree_entry_get_comment (entry)) panel_util_set_tooltip_text (menuitem, matemenu_tree_entry_get_comment (entry)); else if (!alias_directory && matemenu_tree_entry_get_generic_name (entry)) panel_util_set_tooltip_text (menuitem, matemenu_tree_entry_get_generic_name (entry)); g_signal_connect_after (menuitem, "button_press_event", G_CALLBACK (menuitem_button_press_event), NULL); if (!panel_lockdown_get_locked_down ()) { static GtkTargetEntry menu_item_targets[] = { { "text/uri-list", 0, 0 } }; gtk_drag_source_set (menuitem, GDK_BUTTON1_MASK | GDK_BUTTON2_MASK, menu_item_targets, 1, GDK_ACTION_COPY); if (matemenu_tree_entry_get_icon (entry) != NULL) { const char *icon; char *icon_no_ext; icon = matemenu_tree_entry_get_icon (entry); if (!g_path_is_absolute (icon)) { icon_no_ext = panel_xdg_icon_remove_extension (icon); gtk_drag_source_set_icon_name (menuitem, icon_no_ext); g_free (icon_no_ext); } } g_signal_connect (G_OBJECT (menuitem), "drag_begin", G_CALLBACK (drag_begin_menu_cb), NULL); g_signal_connect (menuitem, "drag_data_get", G_CALLBACK (drag_data_get_menu_cb), entry); g_signal_connect (menuitem, "drag_end", G_CALLBACK (drag_end_menu_cb), NULL); } gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); g_signal_connect (menuitem, "activate", G_CALLBACK (activate_app_def), entry); gtk_widget_show (menuitem); }