/* * Various Menu-invoked Command implementations specific to the GNOME port * * Copyright (C) 1998 the Free Software Foundation * * Author: Miguel de Icaza (miguel@kernel.org) */ #include #include "x.h" #include #include #include "dir.h" #include "panel.h" #include "gscreen.h" #include "main.h" #include "gmain.h" #include "cmd.h" #include "boxes.h" #include "profile.h" #include "setup.h" #include "panelize.h" #include "gcmd.h" #include "dialog.h" #include "layout.h" #include "../vfs/vfs.h" enum { SORT_NAME, SORT_EXTENSION, SORT_ACCESS, SORT_MODIFY, SORT_CHANGE, SORT_SIZE }; static char *panelize_section = "Panelize"; void gnome_listing_cmd (GtkWidget *widget, WPanel *panel) { int view_type, use_msformat; char *user, *status; view_type = display_box (panel, &user, &status, &use_msformat, get_current_index ()); if (view_type == -1) return; configure_panel_listing (panel, view_type, use_msformat, user, status); } void gnome_compare_panels (void) { if (get_other_panel () == NULL){ message (1, MSG_ERROR, _(" There is no other panel to compare contents to ")); return; } compare_dirs_cmd (); } void gnome_open_terminal (void) { char *p; if (!(p = gnome_is_program_in_path ("gnome-terminal"))) if (!(p = gnome_is_program_in_path ("dtterm"))) if (!(p = gnome_is_program_in_path ("nxterm"))) if (!(p = gnome_is_program_in_path ("color-xterm"))) if (!(p = gnome_is_program_in_path ("rxvt"))) p = gnome_is_program_in_path ("xterm"); if (p) my_system (EXECUTE_AS_SHELL, shell, p); else message (1, MSG_ERROR, " Could not start a terminal "); } void gnome_about_cmd (void) { GtkWidget *about; const gchar *authors[] = { "The Midnight Commander Team", "http://www.gnome.org/mc/", "bug reports: mc-bugs@nuclecu.unam.mx", NULL }; about = gnome_about_new (_("GNU Midnight Commander"), VERSION, "Copyright 1994-1999 the Free Software Foundation", authors, _("The GNOME edition of the Midnight Commander file manager."), NULL); gtk_widget_show (about); } void gnome_quit_cmd (void) { int q = 0; if (!confirm_exit) q = 1; else if (query_dialog (_(" The Midnight Commander "), _(" Do you really want to quit the Midnight Commander? "), 0, 2, _("&Yes"), _("&No")) == 0) q = 1; if (q == 1) gtk_main_quit (); } void gnome_open_panel (GtkWidget *widget, WPanel *panel) { new_panel_at (panel->cwd); } void gnome_close_panel (GtkWidget *widget, WPanel *panel) { Dlg_head *h = panel->widget.parent; g_print ("closing the panel\n"); if (panel->timer_id){ gtk_timeout_remove (panel->timer_id); panel->timer_id = -1; } /* Remove the widgets from the dialog head */ remove_widget (h, panel->current_dir); remove_widget (h, panel->filter_w); remove_widget (h, panel); /* Kill them */ destroy_widget (panel->current_dir); destroy_widget (panel->filter_w); destroy_widget ((Widget *)panel); layout_panel_gone (panel); mc_chdir ("/"); } void gnome_icon_view_cmd (GtkWidget *widget, WPanel *panel) { if (panel->list_type == list_icons) return; panel->list_type = list_icons; set_panel_formats (panel); paint_panel (panel); do_refresh (); } void gnome_partial_view_cmd (GtkWidget *widget, WPanel *panel) { if (panel->list_type == list_brief) return; panel->list_type = list_brief; set_panel_formats (panel); paint_panel (panel); do_refresh (); } void gnome_full_view_cmd (GtkWidget *widget, WPanel *panel) { if (panel->list_type == list_full) return; panel->list_type = list_full; set_panel_formats (panel); paint_panel (panel); do_refresh (); } void gnome_custom_view_cmd (GtkWidget *widget, WPanel *panel) { if (panel->list_type == list_user) return; panel->list_type = list_user; set_panel_formats (panel); paint_panel (panel); do_refresh (); } static void sort_callback (GtkWidget *menu_item, GtkWidget *cbox1) { if (gtk_object_get_data (GTK_OBJECT (menu_item), "SORT_ORDER_CODE") == SORT_NAME) gtk_widget_set_sensitive (cbox1, TRUE); else gtk_widget_set_sensitive (cbox1, FALSE); } void gnome_sort_cmd (GtkWidget *widget, WPanel *panel) { GtkWidget *sort_box; GtkWidget *hbox; GtkWidget *omenu; GtkWidget *menu; GtkWidget *menu_item; GtkWidget *cbox1, *cbox2; sortfn *sfn = NULL; sort_box = gnome_dialog_new (_("Sort By"), GNOME_STOCK_BUTTON_OK, GNOME_STOCK_BUTTON_CANCEL, NULL); gmc_window_setup_from_panel (GNOME_DIALOG (sort_box), panel); /* we define this up here so we can pass it in to our callback */ cbox1 = gtk_check_button_new_with_label (N_("Ignore case sensitivity.")); hbox = gtk_hbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (sort_box)->vbox), hbox, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (hbox), gtk_label_new ("Sort files by "), FALSE, FALSE, 0); omenu = gtk_option_menu_new (); gtk_box_pack_start (GTK_BOX (hbox), omenu, FALSE, FALSE, 0); menu = gtk_menu_new (); menu_item = gtk_menu_item_new_with_label ( _("Name")); /* FIXME: we want to set the option menu to be the correct ordering. */ gtk_menu_append (GTK_MENU (menu), menu_item); gtk_object_set_data (GTK_OBJECT (menu_item), "SORT_ORDER_CODE", (gpointer) SORT_NAME); gtk_signal_connect (GTK_OBJECT (menu_item), "activate", GTK_SIGNAL_FUNC (sort_callback), cbox1); menu_item = gtk_menu_item_new_with_label ( _("File Type")); gtk_menu_append (GTK_MENU (menu), menu_item); gtk_object_set_data (GTK_OBJECT (menu_item), "SORT_ORDER_CODE", (gpointer) SORT_EXTENSION); gtk_signal_connect (GTK_OBJECT (menu_item), "activate", GTK_SIGNAL_FUNC (sort_callback), cbox1); menu_item = gtk_menu_item_new_with_label ( _("Size")); gtk_menu_append (GTK_MENU (menu), menu_item); gtk_object_set_data (GTK_OBJECT (menu_item), "SORT_ORDER_CODE", (gpointer) SORT_SIZE); gtk_signal_connect (GTK_OBJECT (menu_item), "activate", GTK_SIGNAL_FUNC (sort_callback), cbox1); menu_item = gtk_menu_item_new_with_label ( _("Time Last Accessed")); gtk_menu_append (GTK_MENU (menu), menu_item); gtk_object_set_data (GTK_OBJECT (menu_item), "SORT_ORDER_CODE", (gpointer) SORT_ACCESS); gtk_signal_connect (GTK_OBJECT (menu_item), "activate", GTK_SIGNAL_FUNC (sort_callback), cbox1); menu_item = gtk_menu_item_new_with_label ( _("Time Last Modified")); gtk_menu_append (GTK_MENU (menu), menu_item); gtk_object_set_data (GTK_OBJECT (menu_item), "SORT_ORDER_CODE", (gpointer) SORT_MODIFY); gtk_signal_connect (GTK_OBJECT (menu_item), "activate", GTK_SIGNAL_FUNC (sort_callback), cbox1); menu_item = gtk_menu_item_new_with_label ( _("Time Last Changed")); gtk_menu_append (GTK_MENU (menu), menu_item); gtk_object_set_data (GTK_OBJECT (menu_item), "SORT_ORDER_CODE", (gpointer) SORT_CHANGE); gtk_signal_connect (GTK_OBJECT (menu_item), "activate", GTK_SIGNAL_FUNC (sort_callback), cbox1); gtk_widget_show_all (menu); gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu); gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (cbox1), panel->case_sensitive); gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (sort_box)->vbox), cbox1, FALSE, FALSE, 0); cbox2 = gtk_check_button_new_with_label (N_("Reverse the order.")); gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (cbox2), panel->reverse); gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (sort_box)->vbox), cbox2, FALSE, FALSE, 0); /* off to the races */ gtk_widget_show_all (GNOME_DIALOG (sort_box)->vbox); switch (gnome_dialog_run (GNOME_DIALOG (sort_box))) { case 0: switch( (gint) gtk_object_get_data (GTK_OBJECT (GTK_OPTION_MENU (omenu)->menu_item), "SORT_ORDER_CODE") ) { case SORT_NAME: sfn = (sortfn *) sort_name; break; case SORT_EXTENSION: sfn = (sortfn *) sort_ext; break; case SORT_ACCESS: sfn = (sortfn *) sort_atime; break; case SORT_MODIFY: sfn = (sortfn *) sort_time; break; case SORT_CHANGE: sfn = (sortfn *) sort_ctime; break; case SORT_SIZE: sfn = (sortfn *) sort_size; break; } /* case sensitive */ panel->case_sensitive = GTK_TOGGLE_BUTTON (cbox1)->active; /* Reverse order */ panel->reverse = GTK_TOGGLE_BUTTON (cbox2)->active; panel_set_sort_order (panel, sfn); break; case 1: default: break; } gtk_widget_destroy (sort_box); } typedef struct ep_dlg_data { GtkWidget *ep_dlg; GtkWidget *clist; GtkWidget *entry; GtkWidget *add_button; GtkWidget *remove_button; gboolean setting_text; gint selected; /* if this is -1 then nothing is selected, otherwise, it's the row selected */ } ep_dlg_data; static gchar * get_nickname (gchar *text) { GtkWidget *dlg; GtkWidget *entry; GtkWidget *label; gchar *retval = NULL; dlg = gnome_dialog_new (_("Enter name."), GNOME_STOCK_BUTTON_OK, GNOME_STOCK_BUTTON_CANCEL, NULL); gtk_window_set_position (GTK_WINDOW (dlg), GTK_WIN_POS_MOUSE); entry = gtk_entry_new (); if (text) gtk_entry_set_text (GTK_ENTRY (entry), text); label = gtk_label_new (_("Enter label for command:")); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dlg)->vbox), label, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dlg)->vbox), entry, FALSE, FALSE, 0); gtk_widget_show_all (GNOME_DIALOG (dlg)->vbox); switch (gnome_dialog_run (GNOME_DIALOG (dlg))) { case 0: retval = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry))); break; case 1: default: } gtk_widget_destroy (dlg); return retval; } static void ep_add_callback (GtkWidget *widget, ep_dlg_data *data) { gint i; gchar *insert_tab[1]; insert_tab[0] = get_nickname (NULL); if (insert_tab[0] == NULL) return; i = gtk_clist_append (GTK_CLIST (data->clist), insert_tab); gtk_clist_set_row_data (GTK_CLIST (data->clist), i, g_strdup (gtk_entry_get_text (GTK_ENTRY (data->entry)))); g_free (insert_tab [0]); data->selected = -1; gtk_widget_set_sensitive (data->add_button, FALSE); gtk_entry_set_text (GTK_ENTRY (data->entry), ""); } static void ep_remove_callback (GtkWidget *widget, ep_dlg_data *data) { if (data->selected > -1) { g_free (gtk_clist_get_row_data (GTK_CLIST (data->clist), data->selected)); gtk_clist_remove (GTK_CLIST (data->clist), data->selected); data->selected = -1; gtk_entry_set_text (GTK_ENTRY (data->entry), ""); } gtk_widget_set_sensitive (data->remove_button, FALSE); } static void ep_select_callback (GtkWidget *widget, gint row, gint column, GdkEventButton *event, ep_dlg_data *data) { if (event && event->type == GDK_2BUTTON_PRESS) { gchar *nick; gtk_clist_get_text (GTK_CLIST (widget), row, 0, &nick); /* ugly but correct... (: */ nick = get_nickname (nick); gtk_clist_set_text (GTK_CLIST (data->clist), row, 0, nick); gtk_clist_select_row (GTK_CLIST (data->clist), row, 0); } else { data->setting_text = TRUE; gtk_entry_set_text (GTK_ENTRY (data->entry), (gchar *) gtk_clist_get_row_data (GTK_CLIST (widget), row)); data->setting_text = FALSE; data->selected = row; gtk_widget_set_sensitive (data->remove_button, TRUE); gtk_widget_set_sensitive (data->add_button, FALSE); } } static void ep_text_changed_callback (GtkWidget *widget, ep_dlg_data *data) { if (data->setting_text) /* we don't want to deselect text if we just clicked on something */ return; if (data->selected > -1) { gtk_clist_unselect_row (GTK_CLIST (data->clist), data->selected, 0); data->selected = -1; } gtk_widget_set_sensitive (data->remove_button, FALSE); gtk_widget_set_sensitive (data->add_button, TRUE); } static void load_settings (GtkCList *clist) { gchar *insert_tab[1]; void *profile_keys; gchar *key, *value; gint i = 0; profile_keys = profile_init_iterator (panelize_section, profile_name); if (!profile_keys){ insert_tab[0] = _("Find all core files"); i = gtk_clist_insert (clist, i, insert_tab); gtk_clist_set_row_data (clist, i, g_strdup ("find / -name core")); insert_tab[0] = _("Find rejects after patching"); i = gtk_clist_insert (clist, i, insert_tab); gtk_clist_set_row_data (clist, i, g_strdup ("find . -name \\*.rej -print")); } else { while (profile_keys) { profile_keys = profile_iterator_next (profile_keys, &key, &value); insert_tab[0] = key; i = gtk_clist_insert (clist, i, insert_tab); gtk_clist_set_row_data (clist, i, g_strdup (value)); } } } static void save_settings (GtkCList *clist) { gint i; gchar *text; profile_clean_section (panelize_section, profile_name); for (i = 0; i < GTK_CLIST (clist)->rows; i++) { gtk_clist_get_text (GTK_CLIST (clist), i, 0, &text); WritePrivateProfileString (panelize_section, text, (gchar *) gtk_clist_get_row_data (GTK_CLIST (clist), i), profile_name); } sync_profiles (); } void gnome_external_panelize (GtkWidget *widget, WPanel *panel) { ep_dlg_data *data; GtkWidget *frame; GtkWidget *sw; GtkWidget *vbox; GtkWidget *hbox; gint i; gchar *row_data; data = g_new0 (ep_dlg_data, 1); data->setting_text = FALSE; data->selected = -1; data->ep_dlg = gnome_dialog_new (_("Run Command"), GNOME_STOCK_BUTTON_OK, GNOME_STOCK_BUTTON_CANCEL, NULL); gtk_window_set_position (GTK_WINDOW (data->ep_dlg), GTK_WIN_POS_MOUSE); /* Frame 1 */ frame = gtk_frame_new (_("Preset Commands")); gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (data->ep_dlg)->vbox), frame, FALSE, FALSE, 0); data->clist = gtk_clist_new (1); load_settings (GTK_CLIST (data->clist)); gtk_signal_connect (GTK_OBJECT (data->clist), "select_row", GTK_SIGNAL_FUNC (ep_select_callback), (gpointer) data); vbox = gtk_vbox_new (FALSE, GNOME_PAD_SMALL); gtk_clist_columns_autosize (GTK_CLIST (data->clist)); gtk_clist_set_auto_sort (GTK_CLIST (data->clist), TRUE); gtk_container_set_border_width (GTK_CONTAINER (vbox), GNOME_PAD_SMALL); sw = gtk_scrolled_window_new (GTK_CLIST (data->clist)->hadjustment, GTK_CLIST (data->clist)->vadjustment); gtk_widget_set_usize (sw, 300, 100); gtk_container_add (GTK_CONTAINER (sw), data->clist); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0); gtk_container_add (GTK_CONTAINER (frame), vbox); hbox = gtk_hbox_new (FALSE, GNOME_PAD_SMALL); data->add_button = gtk_button_new_with_label (_("Add")); gtk_signal_connect (GTK_OBJECT (data->add_button), "clicked", GTK_SIGNAL_FUNC (ep_add_callback), (gpointer) data); gtk_widget_set_usize (data->add_button, 75, 25); gtk_box_pack_end (GTK_BOX (hbox), data->add_button, FALSE, FALSE, 0); data->remove_button = gtk_button_new_with_label (_("Remove")); gtk_widget_set_sensitive (data->remove_button, FALSE); gtk_signal_connect (GTK_OBJECT (data->remove_button), "clicked", GTK_SIGNAL_FUNC (ep_remove_callback), (gpointer) data); gtk_widget_set_usize (data->remove_button, 75, 25); gtk_box_pack_end (GTK_BOX (hbox), data->remove_button, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); /* Frame 2 */ frame = gtk_frame_new (_("Run this Command")); gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (data->ep_dlg)->vbox), frame, FALSE, FALSE, 0); data->entry = gtk_entry_new (); gtk_signal_connect (GTK_OBJECT (data->entry), "changed", GTK_SIGNAL_FUNC (ep_text_changed_callback), (gpointer) data); hbox = gtk_hbox_new (FALSE, GNOME_PAD_SMALL); gtk_container_set_border_width (GTK_CONTAINER (hbox), GNOME_PAD_SMALL); gtk_box_pack_start (GTK_BOX (hbox), gtk_label_new (_("Command: ")), FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (hbox), data->entry, TRUE, TRUE, 0); gtk_container_add (GTK_CONTAINER (frame), hbox); gtk_widget_show_all (GNOME_DIALOG (data->ep_dlg)->vbox); switch (gnome_dialog_run (GNOME_DIALOG (data->ep_dlg))) { case 0: gtk_widget_hide (data->ep_dlg); while (gtk_events_pending () ) gtk_main_iteration (); do_external_panelize (gtk_entry_get_text (GTK_ENTRY (data->entry))); save_settings (GTK_CLIST (data->clist)); break; case 1: default: } for (i = 0; i < GTK_CLIST (data->clist)->rows; i++) { row_data = gtk_clist_get_row_data (GTK_CLIST (data->clist), i); if (row_data) g_free (row_data); } gtk_widget_destroy (GTK_WIDGET (data->ep_dlg)); g_free (data); } void gnome_select_all_cmd (GtkWidget *widget, WPanel *panel) { gint i; for (i = 0; i < panel->count; i++){ if (!strcmp (panel->dir.list [i].fname, "..")) { continue; } do_file_mark (panel, i, 1); } paint_panel (panel); do_refresh (); } void gnome_reverse_selection_cmd_panel (WPanel *panel) { file_entry *file; int i; for (i = 0; i < panel->count; i++){ if (!strcmp (panel->dir.list [i].fname, "..")) { continue; } file = &panel->dir.list [i]; do_file_mark (panel, i, !file->f.marked); } paint_panel (panel); } void gnome_filter_cmd (GtkWidget *widget, WPanel *panel) { GtkWidget *filter_dlg; GtkWidget *entry; GtkWidget *label; gchar *text1, *text2, *text3; filter_dlg = gnome_dialog_new (_("Set Filter"), GNOME_STOCK_BUTTON_OK, GNOME_STOCK_BUTTON_CANCEL, NULL); gtk_window_set_position (GTK_WINDOW (filter_dlg), GTK_WIN_POS_MOUSE); if (easy_patterns) { text1 = "mc_filter_globs"; text3 = _("Show all files"); if (panel->filter && (strcmp (panel->filter, "*"))) text2 = panel->filter; else text2 = NULL; } else { text1 = ("mc_filter_regexps"); text3 = _("."); if (!panel->filter) text2 = NULL; else text2 = panel->filter; } entry = gnome_entry_new (text1); gnome_entry_load_history (GNOME_ENTRY (entry)); if (text2) { gtk_entry_set_text (GTK_ENTRY (gnome_entry_gtk_entry (GNOME_ENTRY (entry))), text2); gnome_entry_prepend_history (GNOME_ENTRY (entry), FALSE, text3); } else gtk_entry_set_text (GTK_ENTRY (gnome_entry_gtk_entry (GNOME_ENTRY (entry))), text3); if (easy_patterns) label = gtk_label_new (_("Enter a filter here for files in the panel view.\n\nFor example:\n*.gif will show just gif images")); else label = gtk_label_new (_("Enter a Regular Expression to filter files in the panel view.")); gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT); gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (filter_dlg)->vbox), label, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (filter_dlg)->vbox), entry, FALSE, FALSE, 0); gtk_widget_show_all (GNOME_DIALOG (filter_dlg)->vbox); switch (gnome_dialog_run (GNOME_DIALOG (filter_dlg))) { case 0: gtk_widget_hide (filter_dlg); if (panel->filter) { g_free (panel->filter); panel->filter = NULL; } panel->filter = g_strdup (gtk_entry_get_text (GTK_ENTRY (gnome_entry_gtk_entry (GNOME_ENTRY (entry))))); if (!strcmp (_("Show all files"), panel->filter)) { g_free (panel->filter); panel->filter = NULL; gtk_entry_set_text (GTK_ENTRY (gnome_entry_gtk_entry (GNOME_ENTRY (entry))), ""); gtk_label_set_text (GTK_LABEL (panel->status), _("Show all files")); } else if (!strcmp ("*", panel->filter)) { g_free (panel->filter); panel->filter = NULL; gtk_label_set_text (GTK_LABEL (panel->status), _("Show all files")); } else gtk_label_set_text (GTK_LABEL (panel->status), panel->filter); gnome_entry_save_history (GNOME_ENTRY (entry)); reread_cmd (); x_filter_changed (panel); break; } gtk_widget_destroy (filter_dlg); } void gnome_open_files (GtkWidget *widget, WPanel *panel) { GList *later = NULL; #if 0 GList *now; #endif gint i; /* FIXME: this is the easy way to do things. We want the * hard way sometime. */ for (i = 0; i < panel->count; i++) { if (panel->dir.list [i].f.marked) if (!do_enter_on_file_entry ((panel->dir.list) + i)) later = g_list_prepend (later, panel->dir.list + i); } #if 0 /* This is sorta ugly. Should we just skip these? There should be a better way. */ for (now = later; now; now = now->next) { gchar *command; command = input_expand_dialog (_(" Open with..."), _("Enter extra arguments:"), (WPanel *) now->data); if (!command) /* we break out. */ break; execute (command); g_free (command); } #endif g_list_free (later); } void gnome_run_new (GtkWidget *widget, GnomeDesktopEntry *gde) { gnome_desktop_entry_launch (gde); } void gnome_mkdir_cmd (GtkWidget *widget, WPanel *panel) { mkdir_cmd (panel); }