static void panel_context_menu_build_edition (PanelWidget *panel_widget, GtkWidget *menu) { GtkWidget *menuitem; gtk_menu_set_reserve_toggle_size (GTK_MENU (menu), FALSE); menuitem = panel_image_menu_item_new_from_icon ("list-add", _("_Add to Panel…")); gtk_widget_show (menuitem); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); g_signal_connect (G_OBJECT (menuitem), "activate", G_CALLBACK (panel_addto_present), panel_widget); if (!panel_profile_id_lists_are_writable ()) gtk_widget_set_sensitive (menuitem, FALSE); menuitem = panel_image_menu_item_new_from_icon ("document-properties", _("_Properties")); gtk_widget_show (menuitem); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); g_signal_connect_swapped (menuitem, "activate", G_CALLBACK (panel_properties_dialog_present), panel_widget->toplevel); add_menu_separator (menu); menuitem = panel_image_menu_item_new_from_icon ("document-revert", _("_Reset Panel")); gtk_widget_show (menuitem); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); g_signal_connect_swapped (menuitem, "activate", G_CALLBACK (query_panel_reset), panel_widget->toplevel); menuitem = panel_image_menu_item_new_from_icon ("edit-delete", _("_Delete This Panel")); gtk_widget_show (menuitem); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); g_signal_connect_swapped (G_OBJECT (menuitem), "activate", G_CALLBACK (panel_context_menu_delete_panel), panel_widget->toplevel); g_signal_connect (G_OBJECT (menu), "show", G_CALLBACK (panel_context_menu_setup_delete_panel_item), menuitem); add_menu_separator (menu); menuitem = panel_image_menu_item_new_from_icon ("document-new", _("_New Panel")); gtk_widget_show (menuitem); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); g_signal_connect (menuitem, "activate", G_CALLBACK (panel_context_menu_create_new_panel), NULL); gtk_widget_set_sensitive (menuitem, panel_profile_id_lists_are_writable ()); add_menu_separator (menu); }
static void panel_context_menu_build_edition (PanelWidget *panel_widget, GtkWidget *menu) { GtkWidget *menuitem; GtkWidget *image; menuitem = gtk_image_menu_item_new_with_mnemonic (_("_Add to Panel...")); image = gtk_image_new_from_stock (GTK_STOCK_ADD, GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image); gtk_widget_show (menuitem); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); g_signal_connect (G_OBJECT (menuitem), "activate", G_CALLBACK (panel_addto_present), panel_widget); if (!panel_profile_id_lists_are_writable ()) gtk_widget_set_sensitive (menuitem, FALSE); menuitem = gtk_image_menu_item_new_with_mnemonic (_("_Properties")); image = gtk_image_new_from_stock (GTK_STOCK_PROPERTIES, GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image); gtk_widget_show (menuitem); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); g_signal_connect_swapped (menuitem, "activate", G_CALLBACK (panel_properties_dialog_present), panel_widget->toplevel); menuitem = gtk_image_menu_item_new_with_mnemonic (_("_Delete This Panel")); image = gtk_image_new_from_stock (GTK_STOCK_DELETE, GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image); gtk_widget_show (menuitem); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); g_signal_connect_swapped (G_OBJECT (menuitem), "activate", G_CALLBACK (panel_context_menu_delete_panel), panel_widget->toplevel); g_signal_connect (G_OBJECT (menu), "show", G_CALLBACK (panel_context_menu_setup_delete_panel_item), menuitem); add_menu_separator (menu); menuitem = gtk_image_menu_item_new_with_mnemonic (_("_New Panel")); image = gtk_image_new_from_stock (GTK_STOCK_NEW, GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image); gtk_widget_show (menuitem); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); g_signal_connect (menuitem, "activate", G_CALLBACK (panel_context_menu_create_new_panel), NULL); gtk_widget_set_sensitive (menuitem, panel_profile_id_lists_are_writable ()); add_menu_separator (menu); }
static gboolean drop_internal_icon (PanelWidget *panel, int pos, const char *icon_name, int action) { Launcher *old_launcher = NULL; if (!icon_name) return FALSE; if (!panel_profile_id_lists_are_writable ()) return FALSE; if (action == GDK_ACTION_MOVE) old_launcher = find_launcher (icon_name); if (!panel_launcher_create_copy (panel->toplevel, pos, icon_name)) return FALSE; if (old_launcher && old_launcher->button) { if (old_launcher->prop_dialog) { g_signal_handler_disconnect (old_launcher->button, old_launcher->destroy_handler); launcher_properties_destroy (old_launcher); } panel_profile_delete_object (old_launcher->info); } return TRUE; }
static void panel_addto_make_applet_model (PanelAddtoDialog *dialog) { GtkListStore *model; GSList *l; if (dialog->filter_applet_model != NULL) return; if (panel_profile_id_lists_are_writable ()) { dialog->applet_list = panel_addto_query_applets (dialog->applet_list); dialog->applet_list = panel_addto_prepend_internal_applets (dialog->applet_list); } dialog->applet_list = g_slist_sort (dialog->applet_list, (GCompareFunc) panel_addto_applet_info_sort_func); model = gtk_list_store_new (NUMBER_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_STRING); if (panel_profile_id_lists_are_writable ()) { panel_addto_append_special_applets (dialog, model); if (dialog->applet_list) panel_addto_append_item (dialog, model, NULL); } for (l = dialog->applet_list; l; l = l->next) panel_addto_append_item (dialog, model, l->data); dialog->applet_model = GTK_TREE_MODEL (model); dialog->filter_applet_model = gtk_tree_model_filter_new (GTK_TREE_MODEL (dialog->applet_model), NULL); gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (dialog->filter_applet_model), panel_addto_filter_func, dialog, NULL); }
static gboolean drop_menu (PanelWidget *panel, int position, const char *menu_filename, const char *menu_path) { if (!panel_profile_id_lists_are_writable ()) return FALSE; return panel_menu_button_create (panel->toplevel, position, menu_filename, menu_path, menu_path != NULL, NULL); }
static void panel_context_menu_setup_delete_panel_item (GtkWidget *menu, GtkWidget *menuitem) { PanelWidget *panel_widget; gboolean sensitive; panel_widget = menu_get_panel (menu); g_assert (PANEL_IS_TOPLEVEL (panel_widget->toplevel)); sensitive = !panel_toplevel_is_last_unattached (panel_widget->toplevel) && !panel_lockdown_get_locked_down () && panel_profile_id_lists_are_writable (); gtk_widget_set_sensitive (menuitem, sensitive); }
static gboolean drop_uri (PanelWidget *panel, int position, const char *uri, const char *fallback_icon) { char *name; char *comment; char *buf; char *icon; GFile *file; if (!panel_profile_id_lists_are_writable ()) return FALSE; name = panel_util_get_label_for_uri (uri); icon = panel_util_get_icon_for_uri (uri); if (!icon) icon = g_strdup (fallback_icon); /* FIXME: we might get icons like "folder-music" that might not exist in * the icon theme. This would usually be okay if we could use fallback * icons (and get "folder" this way). However, this is not possible for * launchers: this could be an application that uses an icon named * folder-magic-app, for which we don't want fallbacks. We just want to * go to hicolor. */ file = g_file_new_for_uri (uri); buf = g_file_get_parse_name (file); g_object_unref (file); /* Translators: %s is a URI */ comment = g_strdup_printf (_("Open '%s'"), buf); g_free (buf); panel_launcher_create_from_info (panel->toplevel, position, FALSE, uri, name, comment, icon); g_free (name); g_free (comment); g_free (icon); return TRUE; }
static gboolean drop_url (PanelWidget *panel, int position, const char *url) { enum { NETSCAPE_URL_URL, NETSCAPE_URL_NAME }; char **netscape_url; char *name; char *comment; g_return_val_if_fail (url != NULL, FALSE); if (!panel_profile_id_lists_are_writable ()) return FALSE; netscape_url = g_strsplit (url, "\n", 2); if (!netscape_url || PANEL_GLIB_STR_EMPTY (netscape_url[NETSCAPE_URL_URL])) { g_strfreev (netscape_url); return FALSE; } comment = g_strdup_printf (_("Open URL: %s"), netscape_url[NETSCAPE_URL_URL]); if (PANEL_GLIB_STR_EMPTY (netscape_url[NETSCAPE_URL_NAME])) name = netscape_url[NETSCAPE_URL_URL]; else name = netscape_url[NETSCAPE_URL_NAME]; panel_launcher_create_from_info (panel->toplevel, position, FALSE, netscape_url[NETSCAPE_URL_URL], name, comment, PANEL_ICON_REMOTE); g_free (comment); g_strfreev (netscape_url); return TRUE; }
static void panel_addto_selection_changed (GtkTreeSelection *selection, PanelAddtoDialog *dialog) { GtkTreeModel *filter_model; GtkTreeModel *child_model; GtkTreeIter iter; GtkTreeIter filter_iter; PanelAddtoItemInfo *data; char *iid; if (!gtk_tree_selection_get_selected (selection, &filter_model, &filter_iter)) { gtk_widget_set_sensitive (GTK_WIDGET (dialog->add_button), FALSE); return; } gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (filter_model), &iter, &filter_iter); child_model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (filter_model)); gtk_tree_model_get (child_model, &iter, COLUMN_DATA, &data, -1); if (!data) { gtk_widget_set_sensitive (GTK_WIDGET (dialog->add_button), FALSE); return; } gtk_widget_set_sensitive (GTK_WIDGET (dialog->add_button), TRUE); if (data->type == PANEL_ADDTO_LAUNCHER_MENU) { gtk_button_set_label (GTK_BUTTON (dialog->add_button), GTK_STOCK_GO_FORWARD); } else { gtk_button_set_label (GTK_BUTTON (dialog->add_button), GTK_STOCK_ADD); } gtk_button_set_use_stock (GTK_BUTTON (dialog->add_button), TRUE); /* only allow dragging applets if we can add applets */ if (panel_profile_id_lists_are_writable ()) { switch (data->type) { case PANEL_ADDTO_LAUNCHER: panel_addto_setup_launcher_drag (GTK_TREE_VIEW (dialog->tree_view), data->launcher_path); break; case PANEL_ADDTO_APPLET: panel_addto_setup_applet_drag (GTK_TREE_VIEW (dialog->tree_view), data->iid); break; case PANEL_ADDTO_LAUNCHER_MENU: gtk_tree_view_unset_rows_drag_source (GTK_TREE_VIEW (dialog->tree_view)); break; case PANEL_ADDTO_MENU: /* build the iid for menus other than the main menu */ if (data->iid == NULL) { iid = g_strdup_printf ("MENU:%s/%s", data->menu_filename, data->menu_path); } else { iid = g_strdup (data->iid); } panel_addto_setup_internal_applet_drag (GTK_TREE_VIEW (dialog->tree_view), iid); g_free (iid); break; default: panel_addto_setup_internal_applet_drag (GTK_TREE_VIEW (dialog->tree_view), data->iid); break; } } }
static gboolean drop_internal_applet (PanelWidget *panel, int pos, const char *applet_type, int action) { int applet_index = -1; gboolean remove_applet = FALSE; gboolean success = FALSE; if (applet_type == NULL) return FALSE; if (sscanf (applet_type, "MENU:%d", &applet_index) == 1 || sscanf (applet_type, "DRAWER:%d", &applet_index) == 1) { if (action != GDK_ACTION_MOVE) g_warning ("Only MOVE supported for menus/drawers"); success = move_applet (panel, pos, applet_index); } else if (strncmp (applet_type, "MENU:", strlen ("MENU:")) == 0) { const char *menu; const char *menu_path; menu = &applet_type[strlen ("MENU:")]; menu_path = strchr (menu, '/'); if (!menu_path) { if (strncmp (menu, "MAIN", strlen ("MAIN")) == 0) success = drop_menu (panel, pos, NULL, NULL); else success = drop_menu (panel, pos, menu, NULL); } else { char *menu_filename; menu_filename = g_strndup (menu, menu_path - menu); menu_path++; success = drop_menu (panel, pos, menu_filename, menu_path); g_free (menu_filename); } } else if (!strcmp (applet_type, "DRAWER:NEW")) { if (panel_profile_id_lists_are_writable ()) { panel_drawer_create (panel->toplevel, pos, NULL, FALSE, NULL); success = TRUE; } else { success = FALSE; } } else if (!strncmp (applet_type, "ACTION:", strlen ("ACTION:"))) { if (panel_profile_id_lists_are_writable ()) { remove_applet = panel_action_button_load_from_drag ( panel->toplevel, pos, applet_type, &applet_index); success = TRUE; } else { success = FALSE; } } else if (!strcmp (applet_type, "MENUBAR:NEW")) { if (panel_profile_id_lists_are_writable ()) { panel_menu_bar_create (panel->toplevel, pos); success = TRUE; } else { success = FALSE; } } else if (!strcmp(applet_type,"SEPARATOR:NEW")) { if (panel_profile_id_lists_are_writable ()) { panel_separator_create (panel->toplevel, pos); success = TRUE; } else { success = FALSE; } } else if (!strcmp(applet_type,"LAUNCHER:ASK")) { if (panel_profile_id_lists_are_writable ()) { ask_about_launcher (NULL, panel, pos, TRUE); success = TRUE; } else { success = FALSE; } } if (remove_applet && action == GDK_ACTION_MOVE) { AppletInfo *info; GSList *applet_list; applet_list = mate_panel_applet_list_applets (); info = g_slist_nth_data (applet_list, applet_index); if (info) panel_profile_delete_object (info); } return success; }
static gboolean drop_urilist (PanelWidget *panel, int pos, char *urilist) { char **uris; gboolean success; int i; uris = g_uri_list_extract_uris (urilist); success = TRUE; for (i = 0; uris[i]; i++) { GFile *file; GFileInfo *info; const char *uri; uri = uris[i]; if (g_ascii_strncasecmp (uri, "http:", strlen ("http:")) == 0 || g_ascii_strncasecmp (uri, "https:", strlen ("https:")) == 0 || g_ascii_strncasecmp (uri, "ftp:", strlen ("ftp:")) == 0 || g_ascii_strncasecmp (uri, "gopher:", strlen ("gopher:")) == 0 || g_ascii_strncasecmp (uri, "ghelp:", strlen ("ghelp:")) == 0 || g_ascii_strncasecmp (uri, "man:", strlen ("man:")) == 0 || g_ascii_strncasecmp (uri, "info:", strlen ("info:")) == 0) { /* FIXME: probably do this only on link, * in fact, on link always set up a link, * on copy do all the other stuff. Or something. */ if ( ! drop_url (panel, pos, uri)) success = FALSE; continue; } if (g_ascii_strncasecmp (uri, "x-caja-desktop:", strlen ("x-caja-desktop:")) == 0) { success = drop_caja_desktop_uri (panel, pos, uri); continue; } file = g_file_new_for_uri (uri); info = g_file_query_info (file, "standard::type," "standard::content-type," "access::can-execute", G_FILE_QUERY_INFO_NONE, NULL, NULL); if (info) { const char *mime; GFileType type; gboolean can_exec; mime = g_file_info_get_content_type (info); type = g_file_info_get_file_type (info); can_exec = g_file_info_get_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_EXECUTE); if (mime && g_str_has_prefix (mime, "image")) { if (!set_background_image_from_uri (panel->toplevel, uri)) success = FALSE; } else if (mime && (!strcmp (mime, "application/x-mate-app-info") || !strcmp (mime, "application/x-desktop") || !strcmp (mime, "application/x-kde-app-info"))) { if (panel_profile_id_lists_are_writable ()) panel_launcher_create (panel->toplevel, pos, uri); else success = FALSE; } else if (type != G_FILE_TYPE_DIRECTORY && can_exec) { char *filename; filename = g_file_get_path (file); if (panel_profile_id_lists_are_writable ()) /* executable and local, so add a * launcher with it */ ask_about_launcher (filename, panel, pos, TRUE); else success = FALSE; g_free (filename); } else { if (!drop_uri (panel, pos, uri, PANEL_ICON_UNKNOWN)) success = FALSE; } } else { if (!drop_uri (panel, pos, uri, PANEL_ICON_UNKNOWN)) success = FALSE; } g_object_unref (info); g_object_unref (file); } g_strfreev (uris); return success; }
void panel_receive_dnd_data (PanelWidget *panel, guint info, int pos, GtkSelectionData *selection_data, GdkDragContext *context, guint time_) { const guchar *data; gboolean success = FALSE; if (panel_lockdown_get_locked_down ()) { gtk_drag_finish (context, FALSE, FALSE, time_); return; } data = gtk_selection_data_get_data (selection_data); switch (info) { case TARGET_URL: success = drop_urilist (panel, pos, (char *)data); break; case TARGET_NETSCAPE_URL: success = drop_url (panel, pos, (char *)data); break; case TARGET_COLOR: success = set_background_color (panel->toplevel, (guint16 *) data); break; case TARGET_BGIMAGE: success = set_background_image_from_uri (panel->toplevel, (char *) data); break; case TARGET_BACKGROUND_RESET: if (panel_profile_background_key_is_writable (panel->toplevel, "type")) { panel_profile_set_background_type (panel->toplevel, PANEL_BACK_NONE); success = TRUE; } else { success = FALSE; } break; case TARGET_DIRECTORY: success = drop_uri (panel, pos, (char *)data, PANEL_ICON_FOLDER); break; case TARGET_APPLET: if (!gtk_selection_data_get_data (selection_data)) { gtk_drag_finish (context, FALSE, FALSE, time_); return; } if (panel_profile_id_lists_are_writable ()) { mate_panel_applet_frame_create (panel->toplevel, pos, (char *) data); success = TRUE; } else { success = FALSE; } break; case TARGET_APPLET_INTERNAL: success = drop_internal_applet (panel, pos, (char *)data, gdk_drag_context_get_selected_action (context)); break; case TARGET_ICON_INTERNAL: success = drop_internal_icon (panel, pos, (char *)data, gdk_drag_context_get_selected_action (context)); break; default: gtk_drag_finish (context, FALSE, FALSE, time_); return; } gtk_drag_finish (context, success, FALSE, time_); }
GtkWidget * mate_panel_applet_create_menu (AppletInfo *info) { GtkWidget *menu; GtkWidget *menuitem; GList *l; PanelWidget *panel_widget; gboolean added_anything = FALSE; panel_widget = mate_panel_applet_get_panel_widget (info); menu = g_object_ref_sink (gtk_menu_new ()); /* connect the show & deactivate signal, so that we can "disallow" and * "re-allow" autohide when the menu is shown/deactivated. */ g_signal_connect (menu, "show", G_CALLBACK (applet_menu_show), info); g_signal_connect (menu, "deactivate", G_CALLBACK (applet_menu_deactivate), info); for (l = info->user_menu; l; l = l->next) { AppletUserMenu *user_menu = l->data; if (user_menu->is_enabled_func && !user_menu->is_enabled_func ()) continue; add_to_submenus (info, "", user_menu->name, user_menu, menu, info->user_menu); added_anything = TRUE; } if (!panel_lockdown_get_locked_down ()) { GtkWidget *image; gboolean locked; gboolean lockable; gboolean movable; gboolean removable; lockable = mate_panel_applet_lockable (info); movable = mate_panel_applet_can_freely_move (info); removable = panel_profile_id_lists_are_writable (); locked = panel_widget_get_applet_locked (panel_widget, info->widget); if (added_anything) { menuitem = gtk_separator_menu_item_new (); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); gtk_widget_show (menuitem); } menuitem = gtk_image_menu_item_new_with_mnemonic (_("_Remove From Panel")); image = gtk_image_new_from_stock (GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image); g_signal_connect (menuitem, "activate", G_CALLBACK (applet_remove_callback), info); gtk_widget_show (menuitem); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); gtk_widget_set_sensitive (menuitem, (!locked || lockable) && removable); menuitem = gtk_menu_item_new_with_mnemonic (_("_Move")); g_signal_connect (menuitem, "activate", G_CALLBACK (move_applet_callback), info); gtk_widget_show (menuitem); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); gtk_widget_set_sensitive (menuitem, !locked && movable); g_assert (info->move_item == NULL); info->move_item = menuitem; g_object_add_weak_pointer (G_OBJECT (menuitem), (gpointer *) &info->move_item); menuitem = gtk_separator_menu_item_new (); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); gtk_widget_show (menuitem); menuitem = gtk_check_menu_item_new_with_mnemonic (_("Loc_k To Panel")); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menuitem), locked); g_signal_connect (menuitem, "toggled", G_CALLBACK (mate_panel_applet_lock), info); gtk_widget_show (menuitem); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); gtk_widget_set_sensitive (menuitem, lockable); added_anything = TRUE; } if ( ! added_anything) { g_object_unref (menu); return NULL; } return menu; }
static GtkWidget * create_item_context_menu (GtkWidget *item, PanelWidget *panel_widget) { MateMenuTreeEntry *entry; MateMenuTreeDirectory *directory; MateMenuTree *tree; GtkWidget *menu; GtkWidget *submenu; GtkWidget *menuitem; const char *menu_filename; gboolean id_lists_writable; id_lists_writable = panel_profile_id_lists_are_writable (); entry = g_object_get_data (G_OBJECT (item), "panel-menu-tree-entry"); if (!entry) return NULL; directory = matemenu_tree_item_get_parent (MATEMENU_TREE_ITEM (entry)); if (!directory) return NULL; tree = matemenu_tree_directory_get_tree (directory); matemenu_tree_item_unref (directory); if (!tree) return NULL; menu_filename = matemenu_tree_get_menu_file (tree); matemenu_tree_unref (tree); if (!menu_filename) return NULL; menu = create_empty_menu (); g_object_set_data (G_OBJECT (item), "panel-item-context-menu", menu); g_object_set_data (G_OBJECT (menu), "menu_panel", panel_widget); g_signal_connect (item, "destroy", G_CALLBACK (menu_destroy_context_menu), menu); g_signal_connect (menu, "deactivate", G_CALLBACK (restore_grabs), item); menuitem = gtk_menu_item_new_with_mnemonic (_("Add this launcher to _panel")); g_signal_connect (menuitem, "activate", G_CALLBACK (add_app_to_panel), entry); gtk_widget_set_sensitive (menuitem, id_lists_writable); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); gtk_widget_show (menuitem); menuitem = gtk_menu_item_new_with_mnemonic (_("Add this launcher to _desktop")); g_signal_connect (menuitem, "activate", G_CALLBACK (add_app_to_desktop), entry); gtk_widget_set_sensitive (menuitem, id_lists_writable); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); gtk_widget_show (menuitem); submenu = create_empty_menu (); g_object_set_data (G_OBJECT (submenu), "menu_panel", panel_widget); menuitem = gtk_menu_item_new_with_mnemonic (_("_Entire menu")); gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); gtk_widget_show (menuitem); menuitem = gtk_menu_item_new_with_mnemonic (_("Add this as _drawer to panel")); g_signal_connect (menuitem, "activate", G_CALLBACK (add_menudrawer_to_panel), entry); gtk_widget_set_sensitive (menuitem, id_lists_writable); gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem); gtk_widget_show (menuitem); menuitem = gtk_menu_item_new_with_mnemonic (_("Add this as _menu to panel")); g_signal_connect (menuitem, "activate", G_CALLBACK (add_menu_to_panel), entry); gtk_widget_set_sensitive (menuitem, id_lists_writable); gtk_menu_shell_append (GTK_MENU_SHELL (submenu), menuitem); gtk_widget_show (menuitem); return menu; }
GtkWidget * mate_panel_applet_create_menu (AppletInfo *info) { GtkWidget *menu; GtkWidget *menuitem; GList *l; PanelWidget *panel_widget; gboolean added_anything = FALSE; panel_widget = mate_panel_applet_get_panel_widget (info); menu = g_object_ref_sink (gtk_menu_new ()); gtk_menu_set_reserve_toggle_size (GTK_MENU (menu), FALSE); /* connect the show & deactivate signal, so that we can "disallow" and * "re-allow" autohide when the menu is shown/deactivated. */ g_signal_connect (menu, "show", G_CALLBACK (applet_menu_show), info); g_signal_connect (menu, "deactivate", G_CALLBACK (applet_menu_deactivate), info); for (l = info->user_menu; l; l = l->next) { AppletUserMenu *user_menu = l->data; if (user_menu->is_enabled_func && !user_menu->is_enabled_func ()) continue; add_to_submenus (info, "", user_menu->name, user_menu, menu, info->user_menu); added_anything = TRUE; } if (!panel_lockdown_get_locked_down ()) { gboolean locked; gboolean lockable; gboolean movable; gboolean removable; lockable = mate_panel_applet_lockable (info); movable = mate_panel_applet_can_freely_move (info); removable = panel_profile_id_lists_are_writable (); locked = panel_widget_get_applet_locked (panel_widget, info->widget); if (added_anything) { menuitem = gtk_separator_menu_item_new (); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); gtk_widget_show (menuitem); } menuitem = panel_image_menu_item_new_from_icon ("list-remove", _("_Remove From Panel")); g_signal_connect (menuitem, "activate", G_CALLBACK (applet_remove_callback), info); gtk_widget_show (menuitem); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); gtk_widget_set_sensitive (menuitem, (!locked || lockable) && removable); menuitem = panel_image_menu_item_new_from_icon (NULL, _("_Move")); g_signal_connect (menuitem, "activate", G_CALLBACK (move_applet_callback), info); gtk_widget_show (menuitem); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); gtk_widget_set_sensitive (menuitem, !locked && movable); g_assert (info->move_item == NULL); info->move_item = menuitem; g_object_add_weak_pointer (G_OBJECT (menuitem), (gpointer *) &info->move_item); menuitem = gtk_separator_menu_item_new (); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); gtk_widget_show (menuitem); menuitem = gtk_check_menu_item_new_with_mnemonic (_("Loc_k To Panel")); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menuitem), locked); g_signal_connect (menuitem, "map", G_CALLBACK (checkbox_status), info); menuitem = panel_check_menu_item_new (menuitem); g_signal_connect (menuitem, "activate", G_CALLBACK (mate_panel_applet_lock), info); gtk_widget_show (menuitem); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); gtk_widget_set_sensitive (menuitem, lockable); added_anything = TRUE; } if ( ! added_anything) { g_object_unref (menu); return NULL; } /* Set up theme and transparency support */ GtkWidget *toplevel = gtk_widget_get_toplevel (menu); /* Fix any failures of compiz/other wm's to communicate with gtk for transparency */ 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); /* Set menu and it's toplevel window to follow panel theme */ GtkStyleContext *context; context = gtk_widget_get_style_context (GTK_WIDGET(toplevel)); gtk_style_context_add_class(context,"gnome-panel-menu-bar"); gtk_style_context_add_class(context,"mate-panel-menu-bar"); return menu; }