static void bar_pane_exif_menu_popup(GtkWidget *widget, PaneExifData *ped) { GtkWidget *menu; /* the widget can be either ExifEntry (for editing) or Pane (for new entry) we can decide it by the attached data */ ExifEntry *ee = g_object_get_data(G_OBJECT(widget), "entry_data"); menu = popup_menu_short_lived(); if (ee) { /* for the entry */ gchar *conf = g_strdup_printf(_("Configure \"%s\""), ee->title); gchar *del = g_strdup_printf(_("Remove \"%s\""), ee->title); gchar *copy = g_strdup_printf(_("Copy \"%s\""), ee->title); menu_item_add_stock(menu, conf, GTK_STOCK_EDIT, G_CALLBACK(bar_pane_exif_conf_dialog_cb), widget); menu_item_add_stock(menu, del, GTK_STOCK_DELETE, G_CALLBACK(bar_pane_exif_delete_entry_cb), widget); menu_item_add_stock(menu, copy, GTK_STOCK_COPY, G_CALLBACK(bar_pane_exif_copy_entry_cb), widget); menu_item_add_divider(menu); g_free(conf); g_free(del); } /* for the pane */ menu_item_add_stock(menu, _("Add entry"), GTK_STOCK_ADD, G_CALLBACK(bar_pane_exif_conf_dialog_cb), ped->widget); menu_item_add_check(menu, _("Show hidden entries"), ped->show_all, G_CALLBACK(bar_pane_exif_toggle_show_all_cb), ped); gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 0, GDK_CURRENT_TIME); }
static void bar_menu_popup(GtkWidget *widget) { GtkWidget *menu; GtkWidget *bar; GtkWidget *expander; const KnownPanes *pane = known_panes; BarData *bd; bd = g_object_get_data(G_OBJECT(widget), "bar_data"); if (bd) { expander = NULL; bar = widget; } else { expander = widget; bar = gtk_widget_get_parent(widget); while (bar && !g_object_get_data(G_OBJECT(bar), "bar_data")) bar = gtk_widget_get_parent(bar); if (!bar) return; } menu = popup_menu_short_lived(); if (expander) { menu_item_add_stock(menu, _("Move to _top"), GTK_STOCK_GOTO_TOP, G_CALLBACK(bar_expander_move_top_cb), expander); menu_item_add_stock(menu, _("Move _up"), GTK_STOCK_GO_UP, G_CALLBACK(bar_expander_move_up_cb), expander); menu_item_add_stock(menu, _("Move _down"), GTK_STOCK_GO_DOWN, G_CALLBACK(bar_expander_move_down_cb), expander); menu_item_add_stock(menu, _("Move to _bottom"), GTK_STOCK_GOTO_BOTTOM, G_CALLBACK(bar_expander_move_bottom_cb), expander); menu_item_add_divider(menu); menu_item_add_stock(menu, _("Remove"), GTK_STOCK_DELETE, G_CALLBACK(bar_expander_delete_cb), expander); menu_item_add_divider(menu); } while (pane->id) { GtkWidget *item; item = menu_item_add_stock(menu, _(pane->title), GTK_STOCK_ADD, G_CALLBACK(bar_expander_add_cb), bar); g_object_set_data(G_OBJECT(item), "pane_add_id", pane->id); pane++; } gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, bar, 0, GDK_CURRENT_TIME); }
static void bar_menu_add_popup(GtkWidget *widget) { GtkWidget *menu; GtkWidget *bar; const KnownPanes *pane = known_panes; bar = widget; menu = popup_menu_short_lived(); while (pane->id) { GtkWidget *item; item = menu_item_add_stock(menu, _(pane->title), GTK_STOCK_ADD, G_CALLBACK(bar_expander_add_cb), bar); g_object_set_data(G_OBJECT(item), "pane_add_id", pane->id); pane++; } gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, bar, 0, GDK_CURRENT_TIME); }
static GtkWidget *bar_pane_gps_menu(PaneGPSData *pgd) { GtkWidget *menu; GtkWidget *map_centre; GtkWidget *parent; ChamplainMapSourceFactory *map_factory; GSList *map_list; ChamplainMapSourceDesc *map_desc; const gchar *current; menu = popup_menu_short_lived(); map_factory = champlain_map_source_factory_dup_default(); map_list = champlain_map_source_factory_dup_list(map_factory); current = bar_pane_gps_get_map_id(pgd); while (map_list) { map_desc = (ChamplainMapSourceDesc *)(map_list->data); menu_item_add_radio(menu, map_desc->name, map_desc->id, strcmp(map_desc->id, current) == 0, G_CALLBACK(bar_pane_gps_change_map_cb), pgd); map_list = g_slist_next(map_list); } menu_item_add_divider(menu); menu_item_add_check(menu, _("Enable markers"), pgd->enable_markers_checked, G_CALLBACK(bar_pane_gps_enable_markers_checked_toggle_cb), pgd); map_centre = menu_item_add_check(menu, _("Centre map on marker"), pgd->centre_map_checked, G_CALLBACK(bar_pane_gps_centre_map_checked_toggle_cb), pgd); if (!pgd->enable_markers_checked) { gtk_widget_set_sensitive(map_centre, FALSE); } g_slist_free(map_list); g_object_unref(map_factory); //g_object_unref(map_centre); return menu; }
static GtkWidget *view_confirm_dir_list(ViewWindow *vw, GList *list) { GtkWidget *menu; CViewConfirmD *d; d = g_new(CViewConfirmD, 1); d->vw = vw; d->list = list; menu = popup_menu_short_lived(); g_signal_connect(G_OBJECT(menu), "destroy", G_CALLBACK(view_dir_list_destroy), d); menu_item_add_stock(menu, _("Dropped list includes folders."), GTK_STOCK_DND_MULTIPLE, NULL, NULL); menu_item_add_divider(menu); menu_item_add_stock(menu, _("_Add contents"), GTK_STOCK_OK, G_CALLBACK(view_dir_list_add), d); menu_item_add_stock(menu, _("Add contents _recursive"), GTK_STOCK_ADD, G_CALLBACK(view_dir_list_recurse), d); menu_item_add_stock(menu, _("_Skip folders"), GTK_STOCK_REMOVE, G_CALLBACK(view_dir_list_skip), d); menu_item_add_divider(menu); menu_item_add_stock(menu, _("Cancel"), GTK_STOCK_CANCEL, G_CALLBACK(view_dir_list_cancel), d); return menu; }
static void bar_pane_keywords_menu_popup(GtkWidget *widget, PaneKeywordsData *pkd, gint x, gint y) { GtkWidget *menu; GtkWidget *item; GtkWidget *submenu; GtkTreeViewDropPosition pos; if (pkd->click_tpath) gtk_tree_path_free(pkd->click_tpath); pkd->click_tpath = NULL; gtk_tree_view_get_dest_row_at_pos(GTK_TREE_VIEW(pkd->keyword_treeview), x, y, &pkd->click_tpath, &pos); menu = popup_menu_short_lived(); menu_item_add_stock(menu, _("Add keyword"), GTK_STOCK_EDIT, G_CALLBACK(bar_pane_keywords_add_dialog_cb), pkd); menu_item_add_divider(menu); menu_item_add(menu, _("Add keyword to all selected images"), G_CALLBACK(bar_pane_keywords_add_to_selected_cb), pkd); menu_item_add_divider(menu); if (pkd->click_tpath) { /* for the entry */ gchar *text; gchar *mark; gint i; GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(pkd->keyword_treeview)); GtkTreeIter iter; gtk_tree_model_get_iter(model, &iter, pkd->click_tpath); gchar *name; gtk_tree_model_get(model, &iter, FILTER_KEYWORD_COLUMN_NAME, &name, FILTER_KEYWORD_COLUMN_MARK, &mark, -1); text = g_strdup_printf(_("Hide \"%s\""), name); menu_item_add_stock(menu, text, GTK_STOCK_EDIT, G_CALLBACK(bar_pane_keywords_hide_cb), pkd); g_free(text); submenu = gtk_menu_new(); for (i = 0; i < FILEDATA_MARKS_SIZE; i++) { text = g_strdup_printf(_("Mark %d"), i + 1); item = menu_item_add(submenu, text, G_CALLBACK(bar_pane_keywords_connect_mark_cb), pkd); g_object_set_data(G_OBJECT(item), "mark", GINT_TO_POINTER(i + 1)); g_free(text); } text = g_strdup_printf(_("Connect \"%s\" to mark"), name); item = menu_item_add(menu, text, NULL, NULL); gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu); g_free(text); menu_item_add_divider(menu); text = g_strdup_printf(_("Edit \"%s\""), name); menu_item_add_stock(menu, text, GTK_STOCK_EDIT, G_CALLBACK(bar_pane_keywords_edit_dialog_cb), pkd); g_free(text); text = g_strdup_printf(_("Remove \"%s\""), name); menu_item_add_stock(menu, text, GTK_STOCK_DELETE, G_CALLBACK(bar_pane_keywords_delete_cb), pkd); g_free(text); if (mark && mark[0]) { text = g_strdup_printf(_("Disconnect \"%s\" from mark %s"), name, mark); menu_item_add_stock(menu, text, GTK_STOCK_DELETE, G_CALLBACK(bar_pane_keywords_connect_mark_cb), pkd); g_free(text); } menu_item_add_divider(menu); g_free(mark); g_free(name); } /* for the pane */ menu_item_add(menu, _("Expand checked"), G_CALLBACK(bar_pane_keywords_expand_checked_cb), pkd); menu_item_add(menu, _("Collapse unchecked"), G_CALLBACK(bar_pane_keywords_collapse_unchecked_cb), pkd); menu_item_add(menu, _("Hide unchecked"), G_CALLBACK(bar_pane_keywords_hide_unchecked_cb), pkd); menu_item_add(menu, _("Show all"), G_CALLBACK(bar_pane_keywords_show_all_cb), pkd); submenu = gtk_menu_new(); item = menu_item_add(menu, _("On any change"), NULL, NULL); gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu); menu_item_add_check(submenu, _("Expand checked"), pkd->expand_checked, G_CALLBACK(bar_pane_keywords_expand_checked_toggle_cb), pkd); menu_item_add_check(submenu, _("Collapse unchecked"), pkd->collapse_unchecked, G_CALLBACK(bar_pane_keywords_collapse_unchecked_toggle_cb), pkd); menu_item_add_check(submenu, _("Hide unchecked"), pkd->hide_unchecked, G_CALLBACK(bar_pane_keywords_hide_unchecked_toggle_cb), pkd); gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 0, GDK_CURRENT_TIME); }
GtkWidget *vf_pop_menu(ViewFile *vf) { GtkWidget *menu; GtkWidget *item; GtkWidget *submenu; gboolean active = FALSE; switch (vf->type) { case FILEVIEW_LIST: vflist_color_set(vf, VFLIST(vf)->click_fd, TRUE); active = (VFLIST(vf)->click_fd != NULL); break; case FILEVIEW_ICON: active = (VFICON(vf)->click_id != NULL); break; } menu = popup_menu_short_lived(); g_signal_connect(G_OBJECT(menu), "destroy", G_CALLBACK(vf_popup_destroy_cb), vf); if (vf->clicked_mark > 0) { gint mark = vf->clicked_mark; gchar *str_set_mark = g_strdup_printf(_("_Set mark %d"), mark); gchar *str_res_mark = g_strdup_printf(_("_Reset mark %d"), mark); gchar *str_toggle_mark = g_strdup_printf(_("_Toggle mark %d"), mark); gchar *str_sel_mark = g_strdup_printf(_("_Select mark %d"), mark); gchar *str_sel_mark_or = g_strdup_printf(_("_Add mark %d"), mark); gchar *str_sel_mark_and = g_strdup_printf(_("_Intersection with mark %d"), mark); gchar *str_sel_mark_minus = g_strdup_printf(_("_Unselect mark %d"), mark); g_assert(mark >= 1 && mark <= FILEDATA_MARKS_SIZE); vf->active_mark = mark; vf->clicked_mark = 0; menu_item_add_sensitive(menu, str_set_mark, active, G_CALLBACK(vf_pop_menu_set_mark_sel_cb), vf); menu_item_add_sensitive(menu, str_res_mark, active, G_CALLBACK(vf_pop_menu_res_mark_sel_cb), vf); menu_item_add_sensitive(menu, str_toggle_mark, active, G_CALLBACK(vf_pop_menu_toggle_mark_sel_cb), vf); menu_item_add_divider(menu); menu_item_add_sensitive(menu, str_sel_mark, active, G_CALLBACK(vf_pop_menu_sel_mark_cb), vf); menu_item_add_sensitive(menu, str_sel_mark_or, active, G_CALLBACK(vf_pop_menu_sel_mark_or_cb), vf); menu_item_add_sensitive(menu, str_sel_mark_and, active, G_CALLBACK(vf_pop_menu_sel_mark_and_cb), vf); menu_item_add_sensitive(menu, str_sel_mark_minus, active, G_CALLBACK(vf_pop_menu_sel_mark_minus_cb), vf); menu_item_add_divider(menu); g_free(str_set_mark); g_free(str_res_mark); g_free(str_toggle_mark); g_free(str_sel_mark); g_free(str_sel_mark_and); g_free(str_sel_mark_or); g_free(str_sel_mark_minus); } vf->editmenu_fd_list = vf_pop_menu_file_list(vf); submenu_add_edit(menu, &item, G_CALLBACK(vf_pop_menu_edit_cb), vf, vf->editmenu_fd_list); gtk_widget_set_sensitive(item, active); menu_item_add_stock_sensitive(menu, _("View in _new window"), GTK_STOCK_NEW, active, G_CALLBACK(vf_pop_menu_view_cb), vf); menu_item_add_divider(menu); menu_item_add_stock_sensitive(menu, _("_Copy..."), GTK_STOCK_COPY, active, G_CALLBACK(vf_pop_menu_copy_cb), vf); menu_item_add_sensitive(menu, _("_Move..."), active, G_CALLBACK(vf_pop_menu_move_cb), vf); menu_item_add_sensitive(menu, _("_Rename..."), active, G_CALLBACK(vf_pop_menu_rename_cb), vf); menu_item_add_stock_sensitive(menu, _("_Delete..."), GTK_STOCK_DELETE, active, G_CALLBACK(vf_pop_menu_delete_cb), vf); menu_item_add_sensitive(menu, _("_Copy path"), active, G_CALLBACK(vf_pop_menu_copy_path_cb), vf); menu_item_add_sensitive(menu, _("Enable file _grouping"), active, G_CALLBACK(vf_pop_menu_enable_grouping_cb), vf); menu_item_add_sensitive(menu, _("Disable file groupi_ng"), active, G_CALLBACK(vf_pop_menu_disable_grouping_cb), vf); menu_item_add_divider(menu); submenu = submenu_add_sort(NULL, G_CALLBACK(vf_pop_menu_sort_cb), vf, FALSE, FALSE, TRUE, vf->sort_method); menu_item_add_divider(submenu); menu_item_add_check(submenu, _("Ascending"), vf->sort_ascend, G_CALLBACK(vf_pop_menu_sort_ascend_cb), vf); item = menu_item_add(menu, _("_Sort"), NULL, NULL); gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu); item = menu_item_add_radio(menu, _("View as _List"), GINT_TO_POINTER(FILEVIEW_LIST), vf->type == FILEVIEW_LIST, G_CALLBACK(vf_pop_menu_toggle_view_type_cb), vf); item = menu_item_add_radio(menu, _("View as _Icons"), GINT_TO_POINTER(FILEVIEW_ICON), vf->type == FILEVIEW_ICON, G_CALLBACK(vf_pop_menu_toggle_view_type_cb), vf); switch (vf->type) { case FILEVIEW_LIST: menu_item_add_check(menu, _("Show _thumbnails"), VFLIST(vf)->thumbs_enabled, G_CALLBACK(vflist_pop_menu_thumbs_cb), vf); break; case FILEVIEW_ICON: menu_item_add_check(menu, _("Show filename _text"), VFICON(vf)->show_text, G_CALLBACK(vficon_pop_menu_show_names_cb), vf); break; } menu_item_add_stock(menu, _("Re_fresh"), GTK_STOCK_REFRESH, G_CALLBACK(vf_pop_menu_refresh_cb), vf); return menu; }
static GtkWidget *view_popup_menu(ViewWindow *vw) { GtkWidget *menu; GtkWidget *item; GList *editmenu_fd_list; menu = popup_menu_short_lived(); menu_item_add_stock(menu, _("Zoom _in"), GTK_STOCK_ZOOM_IN, G_CALLBACK(view_zoom_in_cb), vw); menu_item_add_stock(menu, _("Zoom _out"), GTK_STOCK_ZOOM_OUT, G_CALLBACK(view_zoom_out_cb), vw); menu_item_add_stock(menu, _("Zoom _1:1"), GTK_STOCK_ZOOM_100, G_CALLBACK(view_zoom_1_1_cb), vw); menu_item_add_stock(menu, _("Fit image to _window"), GTK_STOCK_ZOOM_FIT, G_CALLBACK(view_zoom_fit_cb), vw); menu_item_add_divider(menu); editmenu_fd_list = view_window_get_fd_list(vw); g_signal_connect(G_OBJECT(menu), "destroy", G_CALLBACK(view_popup_menu_destroy_cb), editmenu_fd_list); item = submenu_add_edit(menu, NULL, G_CALLBACK(view_edit_cb), vw, editmenu_fd_list); menu_item_add_divider(item); menu_item_add(item, _("Set as _wallpaper"), G_CALLBACK(view_wallpaper_cb), vw); submenu_add_alter(menu, G_CALLBACK(view_alter_cb), vw); menu_item_add_stock(menu, _("View in _new window"), GTK_STOCK_NEW, G_CALLBACK(view_new_window_cb), vw); item = menu_item_add(menu, _("_Go to directory view"), G_CALLBACK(view_set_layout_path_cb), vw); menu_item_add_divider(menu); menu_item_add_stock(menu, _("_Copy..."), GTK_STOCK_COPY, G_CALLBACK(view_copy_cb), vw); menu_item_add(menu, _("_Move..."), G_CALLBACK(view_move_cb), vw); menu_item_add(menu, _("_Rename..."), G_CALLBACK(view_rename_cb), vw); menu_item_add_stock(menu, _("_Delete..."), GTK_STOCK_DELETE, G_CALLBACK(view_delete_cb), vw); menu_item_add(menu, _("_Copy path"), G_CALLBACK(view_copy_path_cb), vw); menu_item_add_divider(menu); if (vw->ss) { menu_item_add(menu, _("_Stop slideshow"), G_CALLBACK(view_slideshow_stop_cb), vw); if (slideshow_paused(vw->ss)) { item = menu_item_add(menu, _("Continue slides_how"), G_CALLBACK(view_slideshow_pause_cb), vw); } else { item = menu_item_add(menu, _("Pause slides_how"), G_CALLBACK(view_slideshow_pause_cb), vw); } } else { item = menu_item_add(menu, _("_Start slideshow"), G_CALLBACK(view_slideshow_start_cb), vw); gtk_widget_set_sensitive(item, (vw->list != NULL) || view_window_contains_collection(vw)); item = menu_item_add(menu, _("Pause slides_how"), G_CALLBACK(view_slideshow_pause_cb), vw); gtk_widget_set_sensitive(item, FALSE); } if (vw->fs) { menu_item_add(menu, _("Exit _full screen"), G_CALLBACK(view_fullscreen_cb), vw); } else { menu_item_add(menu, _("_Full screen"), G_CALLBACK(view_fullscreen_cb), vw); } menu_item_add_divider(menu); menu_item_add_stock(menu, _("C_lose window"), GTK_STOCK_CLOSE, G_CALLBACK(view_close_cb), vw); return menu; }
static void tab_completion_popup_list(TabCompData *td, GList *list) { GtkWidget *menu; GList *work; GdkEvent *event; guint32 etime; gint ebutton; gint count = 0; if (!list) return; #if 0 /* * well, the menu would be too long anyway... * (listing /dev causes gtk+ window allocation errors, -> too big a window) * this is why menu popups are disabled, this really should be a popup scrollable listview. */ if (g_list_length(list) > 200) return; #endif menu = popup_menu_short_lived(); work = list; while (work && count < TAB_COMP_POPUP_MAX) { gchar *name = work->data; GtkWidget *item; item = menu_item_add_simple(menu, name, G_CALLBACK(tab_completion_popup_cb), name); g_object_set_data(G_OBJECT(item), "tab_completion_data", td); work = work->next; count++; } g_signal_connect(G_OBJECT(menu), "key_press_event", G_CALLBACK(tab_completion_popup_key_press), td); /* peek at the current event to get the time, etc. */ event = gtk_get_current_event(); if (event && event->type == GDK_BUTTON_RELEASE) { ebutton = event->button.button; } else { ebutton = 0; } if (event) { etime = gdk_event_get_time(event); gdk_event_free(event); } else { etime = 0; } gtk_menu_popup(GTK_MENU(menu), NULL, NULL, tab_completion_popup_pos_cb, td, ebutton, etime); }