2 Some misc dialog boxes for the program.
4 Copyright (C) 1994-2018
5 Free Software Foundation, Inc.
8 Miguel de Icaza, 1994, 1995
10 Andrew Borodin <aborodin@vmail.ru>, 2009-2015
12 This file is part of the Midnight Commander.
14 The Midnight Commander is free software: you can redistribute it
15 and/or modify it under the terms of the GNU General Public License as
16 published by the Free Software Foundation, either version 3 of the License,
17 or (at your option) any later version.
19 The Midnight Commander is distributed in the hope that it will be useful,
20 but WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 GNU General Public License for more details.
24 You should have received a copy of the GNU General Public License
25 along with this program. If not, see <http://www.gnu.org/licenses/>.
29 * \brief Source: Some misc dialog boxes for the program
39 #include <sys/types.h>
42 #include "lib/global.h"
44 #include "lib/tty/tty.h"
45 #include "lib/tty/key.h" /* XCTRL and ALT macros */
46 #include "lib/skin.h" /* INPUT_COLOR */
47 #include "lib/mcconfig.h" /* Load/save user formats */
48 #include "lib/strutil.h"
50 #include "lib/vfs/vfs.h"
52 #include "src/vfs/ftpfs/ftpfs.h"
53 #endif /* ENABLE_VFS_FTP */
55 #include "src/vfs/smbfs/smbfs.h"
56 #endif /* ENABLE_VFS_SMB */
58 #include "lib/util.h" /* Q_() */
59 #include "lib/widget.h"
61 #include "src/setup.h"
62 #include "src/history.h" /* MC_HISTORY_ESC_TIMEOUT */
63 #include "src/execute.h" /* pause_after_run */
64 #ifdef ENABLE_BACKGROUND
65 #include "src/background.h" /* task_list */
69 #include "lib/charsets.h"
70 #include "src/selcodepage.h"
73 #include "command.h" /* For cmdline */
75 #include "panel.h" /* LIST_FORMATS */
77 #include "layout.h" /* for get_nth_panel_name proto */
78 #include "midnight.h" /* current_panel */
82 /*** global variables ****************************************************************************/
84 /*** file scope macro definitions ****************************************************************/
86 #ifdef ENABLE_BACKGROUND
87 #define B_STOP (B_USER+1)
88 #define B_RESUME (B_USER+2)
89 #define B_KILL (B_USER+3)
90 #endif /* ENABLE_BACKGROUND */
92 /*** file scope type declarations ****************************************************************/
94 /*** file scope variables ************************************************************************/
96 static unsigned long configure_old_esc_mode_id
, configure_time_out_id
;
98 /* Index in list_formats[] for "brief" */
99 static const int panel_list_brief_idx
= 1;
100 /* Index in list_formats[] for "user defined" */
101 static const int panel_list_user_idx
= 3;
103 static char **status_format
;
104 static unsigned long panel_list_formats_id
, panel_user_format_id
, panel_brief_cols_id
;
105 static unsigned long mini_user_status_id
, mini_user_format_id
;
108 static int new_display_codepage
;
109 #endif /* HAVE_CHARSET */
111 #if defined(ENABLE_VFS) && defined(ENABLE_VFS_FTP)
112 static unsigned long ftpfs_always_use_proxy_id
, ftpfs_proxy_host_id
;
113 #endif /* ENABLE_VFS && ENABLE_VFS_FTP */
115 static GPtrArray
*skin_names
;
116 static gchar
*current_skin_name
;
118 #ifdef ENABLE_BACKGROUND
119 static WListbox
*bg_list
= NULL
;
120 #endif /* ENABLE_BACKGROUND */
122 /* --------------------------------------------------------------------------------------------- */
123 /*** file scope functions ************************************************************************/
124 /* --------------------------------------------------------------------------------------------- */
127 configure_callback (Widget
* w
, Widget
* sender
, widget_msg_t msg
, int parm
, void *data
)
132 /* message from "Single press" checkbutton */
133 if (sender
!= NULL
&& sender
->id
== configure_old_esc_mode_id
)
135 const gboolean not_single
= !CHECK (sender
)->state
;
139 ww
= dlg_find_by_id (DIALOG (w
), configure_time_out_id
);
140 widget_disable (ww
, not_single
);
144 return MSG_NOT_HANDLED
;
147 return dlg_default_callback (w
, sender
, msg
, parm
, data
);
151 /* --------------------------------------------------------------------------------------------- */
154 skin_apply (const gchar
* skin_override
)
156 GError
*mcerror
= NULL
;
159 mc_skin_init (skin_override
, &mcerror
);
160 mc_fhl_free (&mc_filehighlight
);
161 mc_filehighlight
= mc_fhl_new (TRUE
);
162 dlg_set_default_colors ();
163 input_set_default_colors ();
164 if (mc_global
.mc_run_mode
== MC_RUN_FULL
)
165 command_set_default_colors ();
170 mc_error_message (&mcerror
, NULL
);
173 /* --------------------------------------------------------------------------------------------- */
176 skin_name_to_label (const gchar
* name
)
178 if (strcmp (name
, "default") == 0)
179 return _("< Default >");
183 /* --------------------------------------------------------------------------------------------- */
186 skin_dlg_callback (Widget
* w
, Widget
* sender
, widget_msg_t msg
, int parm
, void *data
)
192 WDialog
*d
= DIALOG (w
);
193 Widget
*wd
= WIDGET (d
->data
);
196 y
= wd
->y
+ (wd
->lines
- w
->lines
) / 2;
197 x
= wd
->x
+ wd
->cols
/ 2;
198 dlg_set_position (d
, y
, x
, w
->lines
, w
->cols
);
204 return dlg_default_callback (w
, sender
, msg
, parm
, data
);
208 /* --------------------------------------------------------------------------------------------- */
211 sel_skin_button (WButton
* button
, int action
)
216 const gchar
*skin_name
;
218 unsigned int pos
= 1;
223 dlg_create (TRUE
, 0, 0, 13, 24, WPOS_KEEP_DEFAULT
, TRUE
, dialog_colors
, skin_dlg_callback
,
224 NULL
, "[Appearance]", _("Skins"));
225 /* use Appearance dialog for positioning */
226 skin_dlg
->data
= WIDGET (button
)->owner
;
228 /* set dialog location before all */
229 send_message (skin_dlg
, NULL
, MSG_RESIZE
, 0, NULL
);
231 skin_list
= listbox_new (1, 1, 11, 22, FALSE
, NULL
);
232 skin_name
= "default";
233 listbox_add_item (skin_list
, LISTBOX_APPEND_AT_END
, 0, skin_name_to_label (skin_name
),
234 (void *) skin_name
, FALSE
);
236 if (strcmp (skin_name
, current_skin_name
) == 0)
237 listbox_select_entry (skin_list
, 0);
239 for (i
= 0; i
< skin_names
->len
; i
++)
241 skin_name
= g_ptr_array_index (skin_names
, i
);
242 if (strcmp (skin_name
, "default") != 0)
244 listbox_add_item (skin_list
, LISTBOX_APPEND_AT_END
, 0, skin_name_to_label (skin_name
),
245 (void *) skin_name
, FALSE
);
246 if (strcmp (skin_name
, current_skin_name
) == 0)
247 listbox_select_entry (skin_list
, pos
);
252 /* make list stick to all sides of dialog, effectively make it be resized with dialog */
253 add_widget_autopos (skin_dlg
, skin_list
, WPOS_KEEP_ALL
, NULL
);
255 result
= dlg_run (skin_dlg
);
256 if (result
== B_ENTER
)
260 listbox_get_current (skin_list
, &skin_label
, (void **) &skin_name
);
261 g_free (current_skin_name
);
262 current_skin_name
= g_strdup (skin_name
);
263 skin_apply (skin_name
);
265 button_set_text (button
, str_fit_to_term (skin_label
, 20, J_LEFT_FIT
));
267 dlg_destroy (skin_dlg
);
272 /* --------------------------------------------------------------------------------------------- */
275 panel_listing_callback (Widget
* w
, Widget
* sender
, widget_msg_t msg
, int parm
, void *data
)
277 WDialog
*h
= DIALOG (w
);
282 if (sender
!= NULL
&& sender
->id
== panel_list_formats_id
)
285 WInput
*in1
, *in2
, *in3
;
287 in1
= INPUT (dlg_find_by_id (h
, panel_user_format_id
));
288 in2
= INPUT (dlg_find_by_id (h
, panel_brief_cols_id
));
289 ch
= CHECK (dlg_find_by_id (h
, mini_user_status_id
));
290 in3
= INPUT (dlg_find_by_id (h
, mini_user_format_id
));
293 input_assign_text (in3
, status_format
[RADIO (sender
)->sel
]);
294 input_update (in1
, FALSE
);
295 input_update (in2
, FALSE
);
296 input_update (in3
, FALSE
);
297 widget_disable (WIDGET (in1
), RADIO (sender
)->sel
!= panel_list_user_idx
);
298 widget_disable (WIDGET (in2
), RADIO (sender
)->sel
!= panel_list_brief_idx
);
302 if (sender
!= NULL
&& sender
->id
== mini_user_status_id
)
306 in
= INPUT (dlg_find_by_id (h
, mini_user_format_id
));
308 if (CHECK (sender
)->state
)
310 widget_disable (WIDGET (in
), FALSE
);
311 input_assign_text (in
, status_format
[3]);
317 r
= RADIO (dlg_find_by_id (h
, panel_list_formats_id
));
318 widget_disable (WIDGET (in
), TRUE
);
319 input_assign_text (in
, status_format
[r
->sel
]);
321 /* input_update (in, FALSE); */
325 return MSG_NOT_HANDLED
;
328 return dlg_default_callback (w
, sender
, msg
, parm
, data
);
332 /* --------------------------------------------------------------------------------------------- */
336 sel_charset_button (WButton
* button
, int action
)
342 new_dcp
= select_charset (-1, -1, new_display_codepage
, TRUE
);
344 if (new_dcp
!= SELECT_CHARSET_CANCEL
)
348 new_display_codepage
= new_dcp
;
349 cpname
= (new_display_codepage
== SELECT_CHARSET_OTHER_8BIT
) ?
351 ((codepage_desc
*) g_ptr_array_index (codepages
, new_display_codepage
))->name
;
353 mc_global
.utf8_display
= str_isutf8 (cpname
);
355 cpname
= _("7-bit ASCII"); /* FIXME */
357 button_set_text (button
, cpname
);
358 dlg_redraw (WIDGET (button
)->owner
);
363 #endif /* HAVE_CHARSET */
365 /* --------------------------------------------------------------------------------------------- */
368 tree_callback (Widget
* w
, Widget
* sender
, widget_msg_t msg
, int parm
, void *data
)
370 WDialog
*h
= DIALOG (w
);
378 /* simply call dlg_set_size() with new size */
379 dlg_set_size (h
, LINES
- 9, COLS
- 20);
380 bar
= WIDGET (find_buttonbar (h
));
387 return send_message (find_tree (h
), NULL
, MSG_ACTION
, parm
, NULL
);
390 return dlg_default_callback (w
, sender
, msg
, parm
, data
);
394 /* --------------------------------------------------------------------------------------------- */
396 #if defined(ENABLE_VFS) && defined (ENABLE_VFS_FTP)
398 confvfs_callback (Widget
* w
, Widget
* sender
, widget_msg_t msg
, int parm
, void *data
)
403 /* message from "Always use ftp proxy" checkbutton */
404 if (sender
!= NULL
&& sender
->id
== ftpfs_always_use_proxy_id
)
406 const gboolean not_use
= !CHECK (sender
)->state
;
410 wi
= dlg_find_by_id (DIALOG (w
), ftpfs_proxy_host_id
);
411 widget_disable (wi
, not_use
);
414 return MSG_NOT_HANDLED
;
417 return dlg_default_callback (w
, sender
, msg
, parm
, data
);
420 #endif /* ENABLE_VFS && ENABLE_VFS_FTP */
422 /* --------------------------------------------------------------------------------------------- */
424 #ifdef ENABLE_BACKGROUND
426 jobs_fill_listbox (WListbox
* list
)
428 static const char *state_str
[2] = { "", "" };
431 if (state_str
[0][0] == '\0')
433 state_str
[0] = _("Running");
434 state_str
[1] = _("Stopped");
437 for (tl
= task_list
; tl
!= NULL
; tl
= tl
->next
)
441 s
= g_strconcat (state_str
[tl
->state
], " ", tl
->info
, (char *) NULL
);
442 listbox_add_item (list
, LISTBOX_APPEND_AT_END
, 0, s
, (void *) tl
, FALSE
);
447 /* --------------------------------------------------------------------------------------------- */
450 task_cb (WButton
* button
, int action
)
457 if (bg_list
->list
== NULL
)
460 /* Get this instance information */
461 listbox_get_current (bg_list
, NULL
, (void **) &tl
);
464 if (action
== B_STOP
)
467 tl
->state
= Task_Stopped
;
469 else if (action
== B_RESUME
)
472 tl
->state
= Task_Running
;
476 if (action
== B_KILL
)
480 unregister_task_running (tl
->pid
, tl
->fd
);
483 listbox_remove_list (bg_list
);
484 jobs_fill_listbox (bg_list
);
486 /* This can be optimized to just redraw this widget :-) */
487 dlg_redraw (WIDGET (button
)->owner
);
491 #endif /* ENABLE_BACKGROUND */
493 /* --------------------------------------------------------------------------------------------- */
494 /*** public functions ****************************************************************************/
495 /* --------------------------------------------------------------------------------------------- */
500 const char *pause_options
[] = {
502 N_("On dum&b terminals"),
506 int pause_options_num
;
508 pause_options_num
= G_N_ELEMENTS (pause_options
);
511 char time_out
[BUF_TINY
] = "";
514 quick_widget_t quick_widgets
[] = {
517 QUICK_START_GROUPBOX (N_("File operations")),
518 QUICK_CHECKBOX (N_("&Verbose operation"), &verbose
, NULL
),
519 QUICK_CHECKBOX (N_("Compute tota&ls"), &file_op_compute_totals
, NULL
),
520 QUICK_CHECKBOX (N_("Classic pro&gressbar"), &classic_progressbar
, NULL
),
521 QUICK_CHECKBOX (N_("Mkdi&r autoname"), &auto_fill_mkdir_name
, NULL
),
522 QUICK_CHECKBOX (N_("&Preallocate space"), &mc_global
.vfs
.preallocate_space
,
525 QUICK_START_GROUPBOX (N_("Esc key mode")),
526 QUICK_CHECKBOX (N_("S&ingle press"), &old_esc_mode
, &configure_old_esc_mode_id
),
527 QUICK_LABELED_INPUT (N_("Timeout:"), input_label_left
,
528 (const char *) time_out
, MC_HISTORY_ESC_TIMEOUT
,
529 &time_out_new
, &configure_time_out_id
, FALSE
, FALSE
,
530 INPUT_COMPLETE_NONE
),
532 QUICK_START_GROUPBOX (N_("Pause after run")),
533 QUICK_RADIO (pause_options_num
, pause_options
, &pause_after_run
, NULL
),
536 QUICK_START_GROUPBOX (N_("Other options")),
537 QUICK_CHECKBOX (N_("Use internal edi&t"), &use_internal_edit
, NULL
),
538 QUICK_CHECKBOX (N_("Use internal vie&w"), &use_internal_view
, NULL
),
539 QUICK_CHECKBOX (N_("A&sk new file name"),
540 &editor_ask_filename_before_edit
, NULL
),
541 QUICK_CHECKBOX (N_("Auto m&enus"), &auto_menu
, NULL
),
542 QUICK_CHECKBOX (N_("&Drop down menus"), &drop_menus
, NULL
),
543 QUICK_CHECKBOX (N_("S&hell patterns"), &easy_patterns
, NULL
),
544 QUICK_CHECKBOX (N_("Co&mplete: show all"),
545 &mc_global
.widget
.show_all_if_ambiguous
, NULL
),
546 QUICK_CHECKBOX (N_("Rotating d&ash"), &nice_rotating_dash
, NULL
),
547 QUICK_CHECKBOX (N_("Cd follows lin&ks"), &mc_global
.vfs
.cd_symlinks
, NULL
),
548 QUICK_CHECKBOX (N_("Sa&fe delete"), &safe_delete
, NULL
),
549 QUICK_CHECKBOX (N_("Safe overwrite"), &safe_overwrite
, NULL
), /* w/o hotkey */
550 QUICK_CHECKBOX (N_("A&uto save setup"), &auto_save_setup
, NULL
),
551 QUICK_SEPARATOR (FALSE
),
552 QUICK_SEPARATOR (FALSE
),
555 QUICK_BUTTONS_OK_CANCEL
,
560 quick_dialog_t qdlg
= {
562 N_("Configure options"), "[Configuration]",
563 quick_widgets
, configure_callback
, NULL
566 g_snprintf (time_out
, sizeof (time_out
), "%d", old_esc_mode_timeout
);
568 #ifndef USE_INTERNAL_EDIT
569 quick_widgets
[17].state
= WST_DISABLED
;
573 quick_widgets
[10].state
= quick_widgets
[11].state
= WST_DISABLED
;
575 #ifndef HAVE_POSIX_FALLOCATE
576 mc_global
.vfs
.preallocate_space
= FALSE
;
577 quick_widgets
[7].state
= WST_DISABLED
;
580 if (quick_dialog (&qdlg
) == B_ENTER
)
581 old_esc_mode_timeout
= atoi (time_out_new
);
583 g_free (time_out_new
);
587 /* --------------------------------------------------------------------------------------------- */
590 appearance_box (void)
592 current_skin_name
= g_strdup (mc_skin__default
.name
);
593 skin_names
= mc_skin_list ();
596 quick_widget_t quick_widgets
[] = {
599 QUICK_LABEL (N_("Skin:"), NULL
),
601 QUICK_BUTTON (str_fit_to_term (skin_name_to_label (current_skin_name
), 20, J_LEFT_FIT
),
602 B_USER
, sel_skin_button
, NULL
),
604 QUICK_BUTTONS_OK_CANCEL
,
609 quick_dialog_t qdlg
= {
611 N_("Appearance"), "[Appearance]",
612 quick_widgets
, dlg_default_callback
, NULL
615 if (quick_dialog (&qdlg
) == B_ENTER
)
616 mc_config_set_string (mc_global
.main_config
, CONFIG_APP_SECTION
, "skin",
622 g_free (current_skin_name
);
623 g_ptr_array_foreach (skin_names
, (GFunc
) g_free
, NULL
);
624 g_ptr_array_free (skin_names
, TRUE
);
627 /* --------------------------------------------------------------------------------------------- */
630 panel_options_box (void)
632 gboolean simple_swap
;
634 simple_swap
= mc_config_get_bool (mc_global
.main_config
, CONFIG_PANELS_SECTION
,
635 "simple_swap", FALSE
) ? 1 : 0;
637 const char *qsearch_options
[] = {
638 N_("Case &insensitive"),
639 N_("Cas&e sensitive"),
640 N_("Use panel sort mo&de")
643 quick_widget_t quick_widgets
[] = {
646 QUICK_START_GROUPBOX (N_("Main options")),
647 QUICK_CHECKBOX (N_("Show mi&ni-status"), &panels_options
.show_mini_info
, NULL
),
648 QUICK_CHECKBOX (N_("Use SI si&ze units"), &panels_options
.kilobyte_si
, NULL
),
649 QUICK_CHECKBOX (N_("Mi&x all files"), &panels_options
.mix_all_files
, NULL
),
650 QUICK_CHECKBOX (N_("Show &backup files"), &panels_options
.show_backups
, NULL
),
651 QUICK_CHECKBOX (N_("Show &hidden files"), &panels_options
.show_dot_files
, NULL
),
652 QUICK_CHECKBOX (N_("&Fast dir reload"), &panels_options
.fast_reload
, NULL
),
653 QUICK_CHECKBOX (N_("Ma&rk moves down"), &panels_options
.mark_moves_down
, NULL
),
654 QUICK_CHECKBOX (N_("Re&verse files only"), &panels_options
.reverse_files_only
,
656 QUICK_CHECKBOX (N_("Simple s&wap"), &simple_swap
, NULL
),
657 QUICK_CHECKBOX (N_("A&uto save panels setup"), &panels_options
.auto_save_setup
,
659 QUICK_SEPARATOR (FALSE
),
660 QUICK_SEPARATOR (FALSE
),
661 QUICK_SEPARATOR (FALSE
),
664 QUICK_START_GROUPBOX (N_("Navigation")),
665 QUICK_CHECKBOX (N_("L&ynx-like motion"), &panels_options
.navigate_with_arrows
,
667 QUICK_CHECKBOX (N_("Pa&ge scrolling"), &panels_options
.scroll_pages
, NULL
),
668 QUICK_CHECKBOX (N_("Center &scrolling"), &panels_options
.scroll_center
, NULL
),
669 QUICK_CHECKBOX (N_("&Mouse page scrolling"), &panels_options
.mouse_move_pages
,
672 QUICK_START_GROUPBOX (N_("File highlight")),
673 QUICK_CHECKBOX (N_("File &types"), &panels_options
.filetype_mode
, NULL
),
674 QUICK_CHECKBOX (N_("&Permissions"), &panels_options
.permission_mode
, NULL
),
676 QUICK_START_GROUPBOX (N_("Quick search")),
677 QUICK_RADIO (QSEARCH_NUM
, qsearch_options
, (int *) &panels_options
.qsearch_mode
,
681 QUICK_BUTTONS_OK_CANCEL
,
686 quick_dialog_t qdlg
= {
688 N_("Panel options"), "[Panel options]",
689 quick_widgets
, NULL
, NULL
692 if (quick_dialog (&qdlg
) != B_ENTER
)
696 mc_config_set_bool (mc_global
.main_config
, CONFIG_PANELS_SECTION
, "simple_swap", simple_swap
);
698 if (!panels_options
.fast_reload_msg_shown
&& panels_options
.fast_reload
)
700 message (D_NORMAL
, _("Information"),
701 _("Using the fast reload option may not reflect the exact\n"
702 "directory contents. In this case you'll need to do a\n"
703 "manual reload of the directory. See the man page for\n" "the details."));
704 panels_options
.fast_reload_msg_shown
= TRUE
;
707 update_panels (UP_RELOAD
, UP_KEEPSEL
);
710 /* --------------------------------------------------------------------------------------------- */
712 /* return list type */
714 panel_listing_box (WPanel
* panel
, int num
, char **userp
, char **minip
, gboolean
* use_msformat
,
718 char *section
= NULL
;
725 p
= get_nth_panel_name (num
);
726 panel
= g_new (WPanel
, 1);
727 panel
->list_format
= list_full
;
728 panel
->user_format
= g_strdup (DEFAULT_USER_FORMAT
);
729 panel
->user_mini_status
= FALSE
;
730 for (i
= 0; i
< LIST_FORMATS
; i
++)
731 panel
->user_status_format
[i
] = g_strdup (DEFAULT_USER_FORMAT
);
732 section
= g_strconcat ("Temporal:", p
, (char *) NULL
);
733 if (!mc_config_has_group (mc_global
.main_config
, section
))
736 section
= g_strdup (p
);
738 panel_load_setup (panel
, section
);
743 gboolean mini_user_status
;
744 char panel_brief_cols_in
[BUF_TINY
];
745 char *panel_brief_cols_out
= NULL
;
746 char *panel_user_format
= NULL
;
747 char *mini_user_format
= NULL
;
749 /* Controls whether the array strings have been translated */
750 const char *list_formats
[LIST_FORMATS
] = {
751 N_("&Full file list"),
752 N_("&Brief file list:"),
753 N_("&Long file list"),
757 quick_widget_t quick_widgets
[] = {
760 QUICK_RADIO (LIST_FORMATS
, list_formats
, &result
, &panel_list_formats_id
),
762 QUICK_SEPARATOR (FALSE
),
763 QUICK_LABELED_INPUT (_ ("columns"), input_label_right
, panel_brief_cols_in
,
764 "panel-brief-cols-input", &panel_brief_cols_out
,
765 &panel_brief_cols_id
, FALSE
, FALSE
, INPUT_COMPLETE_NONE
),
767 QUICK_INPUT (panel
->user_format
, "user-fmt-input", &panel_user_format
,
768 &panel_user_format_id
, FALSE
, FALSE
, INPUT_COMPLETE_NONE
),
769 QUICK_SEPARATOR (TRUE
),
770 QUICK_CHECKBOX (N_("User &mini status"), &mini_user_status
, &mini_user_status_id
),
771 QUICK_INPUT (panel
->user_status_format
[panel
->list_format
], "mini_input",
772 &mini_user_format
, &mini_user_format_id
, FALSE
, FALSE
, INPUT_COMPLETE_NONE
),
773 QUICK_BUTTONS_OK_CANCEL
,
778 quick_dialog_t qdlg
= {
780 N_("Listing format"), "[Listing Format...]",
781 quick_widgets
, panel_listing_callback
, NULL
784 mini_user_status
= panel
->user_mini_status
;
785 result
= panel
->list_format
;
786 status_format
= panel
->user_status_format
;
788 g_snprintf (panel_brief_cols_in
, sizeof (panel_brief_cols_in
), "%d", panel
->brief_cols
);
790 if ((int) panel
->list_format
!= panel_list_brief_idx
)
791 quick_widgets
[4].state
= WST_DISABLED
;
793 if ((int) panel
->list_format
!= panel_list_user_idx
)
794 quick_widgets
[6].state
= WST_DISABLED
;
796 if (!mini_user_status
)
797 quick_widgets
[9].state
= WST_DISABLED
;
799 if (quick_dialog (&qdlg
) == B_CANCEL
)
806 *userp
= panel_user_format
;
807 *minip
= mini_user_format
;
808 *use_msformat
= mini_user_status
;
810 cols
= strtol (panel_brief_cols_out
, &error
, 10);
814 *brief_cols
= panel
->brief_cols
;
816 g_free (panel_brief_cols_out
);
824 g_free (panel
->user_format
);
825 for (i
= 0; i
< LIST_FORMATS
; i
++)
826 g_free (panel
->user_status_format
[i
]);
833 /* --------------------------------------------------------------------------------------------- */
835 const panel_field_t
*
836 sort_box (dir_sort_options_t
* op
, const panel_field_t
* sort_field
)
838 char **sort_orders_names
;
840 gsize sort_names_num
= 0;
842 const panel_field_t
*result
= NULL
;
844 sort_orders_names
= panel_get_sortable_fields (&sort_names_num
);
846 for (i
= 0; i
< sort_names_num
; i
++)
847 if (strcmp (sort_orders_names
[i
], _(sort_field
->title_hotkey
)) == 0)
854 quick_widget_t quick_widgets
[] = {
857 QUICK_RADIO (sort_names_num
, (const char **) sort_orders_names
, &sort_idx
, NULL
),
859 QUICK_CHECKBOX (N_("Executable &first"), &op
->exec_first
, NULL
),
860 QUICK_CHECKBOX (N_("Cas&e sensitive"), &op
->case_sensitive
, NULL
),
861 QUICK_CHECKBOX (N_("&Reverse"), &op
->reverse
, NULL
),
863 QUICK_BUTTONS_OK_CANCEL
,
868 quick_dialog_t qdlg
= {
870 N_("Sort order"), "[Sort Order...]",
871 quick_widgets
, NULL
, NULL
874 if (quick_dialog (&qdlg
) != B_CANCEL
)
875 result
= panel_get_field_by_title_hotkey (sort_orders_names
[sort_idx
]);
881 g_strfreev (sort_orders_names
);
886 /* --------------------------------------------------------------------------------------------- */
891 quick_widget_t quick_widgets
[] = {
893 /* TRANSLATORS: no need to translate 'Confirmation', it's just a context prefix */
894 QUICK_CHECKBOX (Q_("Confirmation|&Delete"), &confirm_delete
, NULL
),
895 QUICK_CHECKBOX (Q_("Confirmation|O&verwrite"), &confirm_overwrite
, NULL
),
896 QUICK_CHECKBOX (Q_("Confirmation|&Execute"), &confirm_execute
, NULL
),
897 QUICK_CHECKBOX (Q_("Confirmation|E&xit"), &confirm_exit
, NULL
),
898 QUICK_CHECKBOX (Q_("Confirmation|Di&rectory hotlist delete"),
899 &confirm_directory_hotlist_delete
, NULL
),
900 QUICK_CHECKBOX (Q_("Confirmation|&History cleanup"),
901 &mc_global
.widget
.confirm_history_cleanup
, NULL
),
902 QUICK_BUTTONS_OK_CANCEL
,
907 quick_dialog_t qdlg
= {
909 N_("Confirmation"), "[Confirmation]",
910 quick_widgets
, NULL
, NULL
913 (void) quick_dialog (&qdlg
);
916 /* --------------------------------------------------------------------------------------------- */
920 display_bits_box (void)
925 const char *display_bits_str
[] = {
927 N_("&Full 8 bits output"),
932 quick_widget_t quick_widgets
[] = {
934 QUICK_RADIO (4, display_bits_str
, ¤t_mode
, NULL
),
935 QUICK_SEPARATOR (TRUE
),
936 QUICK_CHECKBOX (N_("F&ull 8 bits input"), &new_meta
, NULL
),
937 QUICK_BUTTONS_OK_CANCEL
,
942 quick_dialog_t qdlg
= {
944 _("Display bits"), "[Display bits]",
945 quick_widgets
, NULL
, NULL
948 if (mc_global
.full_eight_bits
)
950 else if (mc_global
.eight_bit_clean
)
955 new_meta
= !use_8th_bit_as_meta
;
957 if (quick_dialog (&qdlg
) != B_CANCEL
)
959 mc_global
.eight_bit_clean
= current_mode
< 3;
960 mc_global
.full_eight_bits
= current_mode
< 2;
962 meta (stdscr
, mc_global
.eight_bit_clean
);
964 SLsmg_Display_Eight_Bit
= mc_global
.full_eight_bits
? 128 : 160;
966 use_8th_bit_as_meta
= !new_meta
;
970 /* --------------------------------------------------------------------------------------------- */
971 #else /* HAVE_CHARSET */
974 display_bits_box (void)
978 new_display_codepage
= mc_global
.display_codepage
;
980 cpname
= (new_display_codepage
< 0) ? _("Other 8 bit")
981 : ((codepage_desc
*) g_ptr_array_index (codepages
, new_display_codepage
))->name
;
986 quick_widget_t quick_widgets
[] = {
989 QUICK_LABEL (N_("Input / display codepage:"), NULL
),
991 QUICK_BUTTON (cpname
, B_USER
, sel_charset_button
, NULL
),
993 QUICK_SEPARATOR (TRUE
),
994 QUICK_CHECKBOX (N_("F&ull 8 bits input"), &new_meta
, NULL
),
995 QUICK_BUTTONS_OK_CANCEL
,
1000 quick_dialog_t qdlg
= {
1002 N_("Display bits"), "[Display bits]",
1003 quick_widgets
, NULL
, NULL
1006 new_meta
= !use_8th_bit_as_meta
;
1007 application_keypad_mode ();
1009 if (quick_dialog (&qdlg
) == B_ENTER
)
1013 mc_global
.display_codepage
= new_display_codepage
;
1015 errmsg
= init_translation_table (mc_global
.source_codepage
, mc_global
.display_codepage
);
1018 message (D_ERROR
, MSG_ERROR
, "%s", errmsg
);
1023 tty_display_8bit (mc_global
.display_codepage
!= 0 && mc_global
.display_codepage
!= 1);
1025 tty_display_8bit (mc_global
.display_codepage
!= 0);
1027 use_8th_bit_as_meta
= !new_meta
;
1033 #endif /* HAVE_CHARSET */
1035 /* --------------------------------------------------------------------------------------------- */
1036 /** Show tree in a box, not on a panel */
1039 tree_box (const char *current_dir
)
1049 /* Create the components */
1050 dlg
= dlg_create (TRUE
, 0, 0, LINES
- 9, COLS
- 20, WPOS_CENTER
, FALSE
, dialog_colors
,
1051 tree_callback
, NULL
, "[Directory Tree]", _("Directory tree"));
1054 mytree
= tree_new (2, 2, wd
->lines
- 6, wd
->cols
- 5, FALSE
);
1055 add_widget_autopos (dlg
, mytree
, WPOS_KEEP_ALL
, NULL
);
1056 add_widget_autopos (dlg
, hline_new (wd
->lines
- 4, 1, -1), WPOS_KEEP_BOTTOM
, NULL
);
1057 bar
= buttonbar_new (TRUE
);
1058 add_widget (dlg
, bar
);
1059 /* restore ButtonBar coordinates after add_widget() */
1060 WIDGET (bar
)->x
= 0;
1061 WIDGET (bar
)->y
= LINES
- 1;
1063 if (dlg_run (dlg
) == B_ENTER
)
1065 const vfs_path_t
*selected_name
;
1067 selected_name
= tree_selected_name (mytree
);
1068 val
= g_strdup (vfs_path_as_str (selected_name
));
1075 /* --------------------------------------------------------------------------------------------- */
1079 configure_vfs (void)
1081 char buffer2
[BUF_TINY
];
1082 #ifdef ENABLE_VFS_FTP
1083 char buffer3
[BUF_TINY
];
1085 g_snprintf (buffer3
, sizeof (buffer3
), "%i", ftpfs_directory_timeout
);
1088 g_snprintf (buffer2
, sizeof (buffer2
), "%i", vfs_timeout
);
1092 #ifdef ENABLE_VFS_FTP
1094 char *ret_ftp_proxy
;
1095 char *ret_directory_timeout
;
1096 #endif /* ENABLE_VFS_FTP */
1098 quick_widget_t quick_widgets
[] = {
1100 QUICK_LABELED_INPUT (N_("Timeout for freeing VFSs (sec):"), input_label_left
,
1101 buffer2
, "input-timo-vfs", &ret_timeout
, NULL
, FALSE
, FALSE
,
1102 INPUT_COMPLETE_NONE
),
1103 #ifdef ENABLE_VFS_FTP
1104 QUICK_SEPARATOR (TRUE
),
1105 QUICK_LABELED_INPUT (N_("FTP anonymous password:"), input_label_left
,
1106 ftpfs_anonymous_passwd
, "input-passwd", &ret_passwd
, NULL
,
1107 FALSE
, FALSE
, INPUT_COMPLETE_NONE
),
1108 QUICK_LABELED_INPUT (N_("FTP directory cache timeout (sec):"), input_label_left
,
1109 buffer3
, "input-timeout", &ret_directory_timeout
, NULL
,
1110 FALSE
, FALSE
, INPUT_COMPLETE_NONE
),
1111 QUICK_CHECKBOX (N_("&Always use ftp proxy:"), &ftpfs_always_use_proxy
,
1112 &ftpfs_always_use_proxy_id
),
1113 QUICK_INPUT (ftpfs_proxy_host
, "input-ftp-proxy", &ret_ftp_proxy
,
1114 &ftpfs_proxy_host_id
, FALSE
, FALSE
, INPUT_COMPLETE_HOSTNAMES
),
1115 QUICK_CHECKBOX (N_("&Use ~/.netrc"), &ftpfs_use_netrc
, NULL
),
1116 QUICK_CHECKBOX (N_("Use &passive mode"), &ftpfs_use_passive_connections
, NULL
),
1117 QUICK_CHECKBOX (N_("Use passive mode over pro&xy"),
1118 &ftpfs_use_passive_connections_over_proxy
, NULL
),
1119 #endif /* ENABLE_VFS_FTP */
1120 QUICK_BUTTONS_OK_CANCEL
,
1125 quick_dialog_t qdlg
= {
1127 N_("Virtual File System Setting"), "[Virtual FS]",
1129 #ifdef ENABLE_VFS_FTP
1137 #ifdef ENABLE_VFS_FTP
1138 if (!ftpfs_always_use_proxy
)
1139 quick_widgets
[5].state
= WST_DISABLED
;
1142 if (quick_dialog (&qdlg
) != B_CANCEL
)
1144 /* cppcheck-suppress uninitvar */
1145 vfs_timeout
= atoi (ret_timeout
);
1146 g_free (ret_timeout
);
1148 if (vfs_timeout
< 0 || vfs_timeout
> 10000)
1150 #ifdef ENABLE_VFS_FTP
1151 g_free (ftpfs_anonymous_passwd
);
1152 /* cppcheck-suppress uninitvar */
1153 ftpfs_anonymous_passwd
= ret_passwd
;
1154 g_free (ftpfs_proxy_host
);
1155 /* cppcheck-suppress uninitvar */
1156 ftpfs_proxy_host
= ret_ftp_proxy
;
1157 /* cppcheck-suppress uninitvar */
1158 ftpfs_directory_timeout
= atoi (ret_directory_timeout
);
1159 g_free (ret_directory_timeout
);
1165 #endif /* ENABLE_VFS */
1167 /* --------------------------------------------------------------------------------------------- */
1172 const Widget
*w
= CONST_WIDGET (current_panel
);
1175 quick_widget_t quick_widgets
[] = {
1176 QUICK_LABELED_INPUT (N_("cd"), input_label_left
, "", "input", &my_str
, NULL
, FALSE
, TRUE
,
1177 INPUT_COMPLETE_FILENAMES
| INPUT_COMPLETE_CD
),
1181 quick_dialog_t qdlg
= {
1182 w
->y
+ w
->lines
- 6, w
->x
, w
->cols
,
1183 N_("Quick cd"), "[Quick cd]",
1184 quick_widgets
, NULL
, NULL
1187 return (quick_dialog (&qdlg
) != B_CANCEL
) ? my_str
: NULL
;
1190 /* --------------------------------------------------------------------------------------------- */
1193 symlink_dialog (const vfs_path_t
* existing_vpath
, const vfs_path_t
* new_vpath
,
1194 char **ret_existing
, char **ret_new
)
1196 quick_widget_t quick_widgets
[] = {
1198 QUICK_LABELED_INPUT (N_("Existing filename (filename symlink will point to):"),
1199 input_label_above
, vfs_path_as_str (existing_vpath
), "input-2",
1200 ret_existing
, NULL
, FALSE
, FALSE
, INPUT_COMPLETE_FILENAMES
),
1201 QUICK_SEPARATOR (FALSE
),
1202 QUICK_LABELED_INPUT (N_("Symbolic link filename:"), input_label_above
,
1203 vfs_path_as_str (new_vpath
), "input-1",
1204 ret_new
, NULL
, FALSE
, FALSE
, INPUT_COMPLETE_FILENAMES
),
1205 QUICK_BUTTONS_OK_CANCEL
,
1210 quick_dialog_t qdlg
= {
1212 N_("Symbolic link"), "[File Menu]",
1213 quick_widgets
, NULL
, NULL
1216 if (quick_dialog (&qdlg
) == B_CANCEL
)
1219 *ret_existing
= NULL
;
1223 /* --------------------------------------------------------------------------------------------- */
1225 #ifdef ENABLE_BACKGROUND
1240 { N_("&Stop"), NORMAL_BUTTON
, B_STOP
, 0, task_cb
},
1241 { N_("&Resume"), NORMAL_BUTTON
, B_RESUME
, 0, task_cb
},
1242 { N_("&Kill"), NORMAL_BUTTON
, B_KILL
, 0, task_cb
},
1243 { N_("&OK"), DEFPUSH_BUTTON
, B_CANCEL
, 0, NULL
}
1248 const size_t n_but
= G_N_ELEMENTS (job_but
);
1255 for (i
= 0; i
< n_but
; i
++)
1258 job_but
[i
].name
= _(job_but
[i
].name
);
1259 #endif /* ENABLE_NLS */
1261 job_but
[i
].len
= str_term_width1 (job_but
[i
].name
) + 3;
1262 if (job_but
[i
].flags
== DEFPUSH_BUTTON
)
1263 job_but
[i
].len
+= 2;
1264 x
+= job_but
[i
].len
;
1267 x
+= (int) n_but
- 1;
1268 cols
= MAX (cols
, x
+ 6);
1270 jobs_dlg
= dlg_create (TRUE
, 0, 0, lines
, cols
, WPOS_CENTER
, FALSE
, dialog_colors
, NULL
, NULL
,
1271 "[Background jobs]", _("Background jobs"));
1273 bg_list
= listbox_new (2, 2, lines
- 6, cols
- 6, FALSE
, NULL
);
1274 jobs_fill_listbox (bg_list
);
1275 add_widget (jobs_dlg
, bg_list
);
1277 add_widget (jobs_dlg
, hline_new (lines
- 4, -1, -1));
1280 for (i
= 0; i
< n_but
; i
++)
1282 add_widget (jobs_dlg
,
1283 button_new (lines
- 3, x
, job_but
[i
].value
, job_but
[i
].flags
, job_but
[i
].name
,
1284 job_but
[i
].callback
));
1285 x
+= job_but
[i
].len
+ 1;
1288 (void) dlg_run (jobs_dlg
);
1289 dlg_destroy (jobs_dlg
);
1291 #endif /* ENABLE_BACKGROUND */
1293 /* --------------------------------------------------------------------------------------------- */
1295 #ifdef ENABLE_VFS_SMB
1296 struct smb_authinfo
*
1297 vfs_smb_get_authinfo (const char *host
, const char *share
, const char *domain
, const char *user
)
1300 struct smb_authinfo
*return_value
= NULL
;
1307 label
= g_strdup_printf (_("Password for \\\\%s\\%s"), host
, share
);
1310 char *ret_domain
, *ret_user
, *ret_password
;
1312 quick_widget_t quick_widgets
[] = {
1314 QUICK_LABEL (label
, NULL
),
1315 QUICK_SEPARATOR (TRUE
),
1316 QUICK_START_COLUMNS
,
1317 QUICK_LABEL (N_("Domain:"), NULL
),
1318 QUICK_SEPARATOR (FALSE
),
1319 QUICK_LABEL (N_("Username:"), NULL
),
1320 QUICK_SEPARATOR (FALSE
),
1321 QUICK_LABEL (N_("Password:"), NULL
),
1323 QUICK_INPUT (domain
, "auth_domain", &ret_domain
, NULL
, FALSE
, FALSE
, INPUT_COMPLETE_HOSTNAMES
),
1324 QUICK_SEPARATOR (FALSE
),
1325 QUICK_INPUT (user
, "auth_name", &ret_user
, NULL
, FALSE
, FALSE
, INPUT_COMPLETE_USERNAMES
),
1326 QUICK_SEPARATOR (FALSE
),
1327 QUICK_INPUT ("", "auth_password", &ret_password
, NULL
, TRUE
, FALSE
, INPUT_COMPLETE_NONE
),
1329 QUICK_BUTTONS_OK_CANCEL
,
1334 quick_dialog_t qdlg
= {
1336 N_("SMB authentication"), "[Smb Authinfo]",
1337 quick_widgets
, NULL
, NULL
1340 if (quick_dialog (&qdlg
) != B_CANCEL
)
1342 return_value
= vfs_smb_authinfo_new (host
, share
, ret_domain
, ret_user
, ret_password
);
1344 g_free (ret_domain
);
1346 g_free (ret_password
);
1352 return return_value
;
1354 #endif /* ENABLE_VFS_SMB */
1356 /* --------------------------------------------------------------------------------------------- */