This source file includes following definitions.
- stop_dialogs
- treebox_cmd
- create_panel_menu
- create_file_menu
- create_command_menu
- create_options_menu
- init_menu
- menu_last_selected_cmd
- menu_cmd
- sort_cmd
- midnight_get_shortcut
- midnight_get_title
- toggle_panels_split
- check_panel_timestamp
- check_current_panel_timestamp
- check_other_panel_timestamp
- print_vfs_message
- create_panels
- midnight_put_panel_path
- put_link
- put_current_link
- put_other_link
- put_current_selected
- put_tagged
- put_current_tagged
- put_other_tagged
- setup_mc
- setup_dummy_mc
- done_mc
- create_file_manager
- prepend_cwd_on_local
- mc_maybe_editor_or_viewer
- show_editor_viewer_history
- quit_cmd_internal
- quit_cmd
- update_dirty_panels
- toggle_show_hidden
- midnight_execute_cmd
- is_cmdline_mute
- handle_cmdline_enter
- midnight_callback
- update_menu
- midnight_set_buttonbar
- get_random_hint
- load_hint
- change_panel
- save_cwds_stat
- quiet_quit_cmd
- do_nc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 #include <config.h>
35
36 #include <ctype.h>
37 #include <locale.h>
38 #include <stdio.h>
39 #include <stdlib.h>
40 #include <string.h>
41 #include <sys/types.h>
42 #include <sys/stat.h>
43 #include <sys/wait.h>
44 #include <pwd.h>
45
46 #include "lib/global.h"
47 #include "lib/fileloc.h"
48 #include "lib/tty/tty.h"
49 #include "lib/tty/key.h"
50 #include "lib/skin.h"
51 #include "lib/util.h"
52 #include "lib/vfs/vfs.h"
53
54 #include "src/args.h"
55 #ifdef ENABLE_SUBSHELL
56 #include "src/subshell/subshell.h"
57 #endif
58 #include "src/execute.h"
59 #include "src/setup.h"
60 #include "src/learn.h"
61 #include "src/keymap.h"
62 #include "src/usermenu.h"
63
64 #include "lib/keybind.h"
65 #include "lib/event.h"
66
67 #include "tree.h"
68 #include "boxes.h"
69 #include "layout.h"
70 #include "cmd.h"
71 #include "hotlist.h"
72 #include "panelize.h"
73 #include "command.h"
74 #include "dir.h"
75
76 #ifdef USE_INTERNAL_EDIT
77 #include "src/editor/edit.h"
78 #endif
79
80 #ifdef USE_DIFF_VIEW
81 #include "src/diffviewer/ydiff.h"
82 #endif
83
84 #include "src/consaver/cons.saver.h"
85 #include "src/file_history.h"
86
87 #include "filemanager.h"
88
89
90
91
92
93
94
95
96
97 WPanel *left_panel = NULL;
98 WPanel *right_panel = NULL;
99
100 WPanel *current_panel = NULL;
101
102
103 WMenuBar *the_menubar = NULL;
104
105 WLabel *the_prompt;
106
107 WLabel *the_hint;
108
109 WButtonBar *the_keybar;
110
111
112 char *mc_prompt = NULL;
113
114
115 static const label_colors_t hintbar_colors = {
116 [LABEL_COLOR_MAIN] = CORE_HINTBAR_COLOR,
117 [LABEL_COLOR_DISABLED] = CORE_DISABLED_COLOR,
118 };
119 static const label_colors_t prompt_colors = {
120 [LABEL_COLOR_MAIN] = CORE_SHELLPROMPT_COLOR,
121 [LABEL_COLOR_DISABLED] = CORE_DISABLED_COLOR,
122 };
123
124
125
126
127
128
129
130
131
132 static menu_t *left_menu, *right_menu;
133
134
135
136
137
138
139
140 static void
141 stop_dialogs (void)
142 {
143 dlg_close (filemanager);
144
145 if (top_dlg != NULL)
146 dlg_close (DIALOG (top_dlg->data));
147 }
148
149
150
151 static void
152 treebox_cmd (void)
153 {
154 const file_entry_t *fe;
155 char *sel_dir;
156
157 fe = panel_current_entry (current_panel);
158 if (fe == NULL)
159 return;
160
161 sel_dir = tree_box (fe->fname->str);
162 if (sel_dir != NULL)
163 {
164 vfs_path_t *sel_vdir;
165
166 sel_vdir = vfs_path_from_str (sel_dir);
167 panel_cd (current_panel, sel_vdir, cd_exact);
168 vfs_path_free (sel_vdir, TRUE);
169 g_free (sel_dir);
170 }
171 }
172
173
174
175 static GList *
176 create_panel_menu (void)
177 {
178 GList *entries = NULL;
179
180 entries = g_list_prepend (entries, menu_entry_new (_ ("File listin&g"), CK_PanelListing));
181 entries = g_list_prepend (entries, menu_entry_new (_ ("&Quick view"), CK_PanelQuickView));
182 entries = g_list_prepend (entries, menu_entry_new (_ ("&Info"), CK_PanelInfo));
183 entries = g_list_prepend (entries, menu_entry_new (_ ("&Tree"), CK_PanelTree));
184 entries = g_list_prepend (entries, menu_entry_new (_ ("Paneli&ze"), CK_Panelize));
185 entries = g_list_prepend (entries, menu_separator_new ());
186 entries =
187 g_list_prepend (entries, menu_entry_new (_ ("&Listing format..."), CK_SetupListingFormat));
188 entries = g_list_prepend (entries, menu_entry_new (_ ("&Sort order..."), CK_Sort));
189 entries = g_list_prepend (entries, menu_entry_new (_ ("&Filter..."), CK_Filter));
190 entries = g_list_prepend (entries, menu_entry_new (_ ("&Encoding..."), CK_SelectCodepage));
191 entries = g_list_prepend (entries, menu_separator_new ());
192 #ifdef ENABLE_VFS_FTP
193 entries = g_list_prepend (entries, menu_entry_new (_ ("FT&P link..."), CK_ConnectFtp));
194 #endif
195 #ifdef ENABLE_VFS_SHELL
196 entries = g_list_prepend (entries, menu_entry_new (_ ("S&hell link..."), CK_ConnectShell));
197 #endif
198 #ifdef ENABLE_VFS_SFTP
199 entries = g_list_prepend (entries, menu_entry_new (_ ("SFTP li&nk..."), CK_ConnectSftp));
200 #endif
201 entries = g_list_prepend (entries, menu_separator_new ());
202 entries = g_list_prepend (entries, menu_entry_new (_ ("&Rescan"), CK_Reread));
203
204 return g_list_reverse (entries);
205 }
206
207
208
209 static GList *
210 create_file_menu (void)
211 {
212 GList *entries = NULL;
213
214 entries = g_list_prepend (entries, menu_entry_new (_ ("&View"), CK_View));
215 entries = g_list_prepend (entries, menu_entry_new (_ ("Vie&w file..."), CK_ViewFile));
216 entries = g_list_prepend (entries, menu_entry_new (_ ("&Filtered view"), CK_ViewFiltered));
217 entries = g_list_prepend (entries, menu_entry_new (_ ("&Edit"), CK_Edit));
218 entries = g_list_prepend (entries, menu_entry_new (_ ("&Copy"), CK_Copy));
219 entries = g_list_prepend (entries, menu_entry_new (_ ("C&hmod"), CK_ChangeMode));
220 entries = g_list_prepend (entries, menu_entry_new (_ ("&Link"), CK_Link));
221 entries = g_list_prepend (entries, menu_entry_new (_ ("&Symlink"), CK_LinkSymbolic));
222 entries =
223 g_list_prepend (entries, menu_entry_new (_ ("Relative symlin&k"), CK_LinkSymbolicRelative));
224 entries = g_list_prepend (entries, menu_entry_new (_ ("Edit s&ymlink"), CK_LinkSymbolicEdit));
225 entries = g_list_prepend (entries, menu_entry_new (_ ("Ch&own"), CK_ChangeOwn));
226 entries =
227 g_list_prepend (entries, menu_entry_new (_ ("&Advanced chown"), CK_ChangeOwnAdvanced));
228 #ifdef ENABLE_EXT2FS_ATTR
229 entries = g_list_prepend (entries, menu_entry_new (_ ("Cha&ttr"), CK_ChangeAttributes));
230 #endif
231 entries = g_list_prepend (entries, menu_entry_new (_ ("&Rename/Move"), CK_Move));
232 entries = g_list_prepend (entries, menu_entry_new (_ ("&Mkdir"), CK_MakeDir));
233 entries = g_list_prepend (entries, menu_entry_new (_ ("&Delete"), CK_Delete));
234 entries = g_list_prepend (entries, menu_entry_new (_ ("&Quick cd"), CK_CdQuick));
235 entries = g_list_prepend (entries, menu_separator_new ());
236 entries = g_list_prepend (entries, menu_entry_new (_ ("Select &group"), CK_Select));
237 entries = g_list_prepend (entries, menu_entry_new (_ ("U&nselect group"), CK_Unselect));
238 entries = g_list_prepend (entries, menu_entry_new (_ ("&Invert selection"), CK_SelectInvert));
239 entries = g_list_prepend (entries, menu_separator_new ());
240 entries = g_list_prepend (entries, menu_entry_new (_ ("E&xit"), CK_Quit));
241
242 return g_list_reverse (entries);
243 }
244
245
246
247 static GList *
248 create_command_menu (void)
249 {
250
251
252
253
254 GList *entries = NULL;
255
256 entries = g_list_prepend (entries, menu_entry_new (_ ("&User menu"), CK_UserMenu));
257 entries = g_list_prepend (entries, menu_entry_new (_ ("&Directory tree"), CK_Tree));
258 entries = g_list_prepend (entries, menu_entry_new (_ ("&Find file"), CK_Find));
259 entries = g_list_prepend (entries, menu_entry_new (_ ("S&wap panels"), CK_Swap));
260 entries = g_list_prepend (entries, menu_entry_new (_ ("Switch &panels on/off"), CK_Shell));
261 entries = g_list_prepend (entries, menu_entry_new (_ ("&Compare directories"), CK_CompareDirs));
262 #ifdef USE_DIFF_VIEW
263 entries = g_list_prepend (entries, menu_entry_new (_ ("C&ompare files"), CK_CompareFiles));
264 #endif
265 entries =
266 g_list_prepend (entries, menu_entry_new (_ ("E&xternal panelize"), CK_ExternalPanelize));
267 entries = g_list_prepend (entries, menu_entry_new (_ ("Show directory s&izes"), CK_DirSize));
268 entries = g_list_prepend (entries, menu_separator_new ());
269 entries = g_list_prepend (entries, menu_entry_new (_ ("Command &history"), CK_History));
270 entries = g_list_prepend (
271 entries, menu_entry_new (_ ("Viewed/edited files hi&story"), CK_EditorViewerHistory));
272 entries = g_list_prepend (entries, menu_entry_new (_ ("Di&rectory hotlist"), CK_HotList));
273 #ifdef ENABLE_VFS
274 entries = g_list_prepend (entries, menu_entry_new (_ ("&Active VFS list"), CK_VfsList));
275 #endif
276 #ifdef ENABLE_BACKGROUND
277 entries = g_list_prepend (entries, menu_entry_new (_ ("&Background jobs"), CK_Jobs));
278 #endif
279 entries = g_list_prepend (entries, menu_entry_new (_ ("Screen lis&t"), CK_ScreenList));
280 entries = g_list_prepend (entries, menu_separator_new ());
281 entries = g_list_prepend (entries,
282 menu_entry_new (_ ("Edit &extension file"), CK_EditExtensionsFile));
283 entries = g_list_prepend (entries, menu_entry_new (_ ("Edit &menu file"), CK_EditUserMenu));
284 entries = g_list_prepend (
285 entries, menu_entry_new (_ ("Edit hi&ghlighting group file"), CK_EditFileHighlightFile));
286
287 return g_list_reverse (entries);
288 }
289
290
291
292 static GList *
293 create_options_menu (void)
294 {
295 GList *entries = NULL;
296
297 entries = g_list_prepend (entries, menu_entry_new (_ ("&Configuration..."), CK_Options));
298 entries = g_list_prepend (entries, menu_entry_new (_ ("&Layout..."), CK_OptionsLayout));
299 entries = g_list_prepend (entries, menu_entry_new (_ ("&Panel options..."), CK_OptionsPanel));
300 entries = g_list_prepend (entries, menu_entry_new (_ ("C&onfirmation..."), CK_OptionsConfirm));
301 entries = g_list_prepend (entries, menu_entry_new (_ ("&Appearance..."), CK_OptionsAppearance));
302 entries = g_list_prepend (entries, menu_entry_new (_ ("Learn &keys..."), CK_LearnKeys));
303 #ifdef ENABLE_VFS
304 entries = g_list_prepend (entries, menu_entry_new (_ ("&Virtual FS..."), CK_OptionsVfs));
305 #endif
306 entries = g_list_prepend (entries, menu_separator_new ());
307 entries = g_list_prepend (entries, menu_entry_new (_ ("&Save setup"), CK_SaveSetup));
308 entries = g_list_prepend (entries, menu_separator_new ());
309 entries = g_list_prepend (entries, menu_entry_new (_ ("A&bout..."), CK_About));
310
311 return g_list_reverse (entries);
312 }
313
314
315
316 static void
317 init_menu (void)
318 {
319 left_menu = menu_new ("", create_panel_menu (), "[Left and Right Menus]");
320 menubar_add_menu (the_menubar, left_menu);
321 menubar_add_menu (the_menubar, menu_new (_ ("&File"), create_file_menu (), "[File Menu]"));
322 menubar_add_menu (the_menubar,
323 menu_new (_ ("&Command"), create_command_menu (), "[Command Menu]"));
324 menubar_add_menu (the_menubar,
325 menu_new (_ ("&Options"), create_options_menu (), "[Options Menu]"));
326 right_menu = menu_new ("", create_panel_menu (), "[Left and Right Menus]");
327 menubar_add_menu (the_menubar, right_menu);
328 update_menu ();
329 }
330
331
332
333 static void
334 menu_last_selected_cmd (void)
335 {
336 menubar_activate (the_menubar, drop_menus, -1);
337 }
338
339
340
341 static void
342 menu_cmd (void)
343 {
344 int selected;
345
346 if ((get_current_index () == 0) == widget_get_state (WIDGET (current_panel), WST_FOCUSED))
347 selected = 0;
348 else
349 selected = g_list_length (the_menubar->menu) - 1;
350
351 menubar_activate (the_menubar, drop_menus, selected);
352 }
353
354
355
356 static void
357 sort_cmd (void)
358 {
359 WPanel *p;
360 const panel_field_t *sort_order;
361
362 if (!SELECTED_IS_PANEL)
363 return;
364
365 p = MENU_PANEL;
366 sort_order = sort_box (&p->sort_info, p->sort_field);
367 panel_set_sort_order (p, sort_order);
368 }
369
370
371
372 static char *
373 midnight_get_shortcut (long command)
374 {
375 const char *ext_map;
376 const char *shortcut = NULL;
377
378 shortcut = keybind_lookup_keymap_shortcut (filemanager_map, command);
379 if (shortcut != NULL)
380 return g_strdup (shortcut);
381
382 shortcut = keybind_lookup_keymap_shortcut (panel_map, command);
383 if (shortcut != NULL)
384 return g_strdup (shortcut);
385
386 ext_map = keybind_lookup_keymap_shortcut (filemanager_map, CK_ExtendedKeyMap);
387 if (ext_map != NULL)
388 shortcut = keybind_lookup_keymap_shortcut (filemanager_x_map, command);
389 if (shortcut != NULL)
390 return g_strdup_printf ("%s %s", ext_map, shortcut);
391
392 return NULL;
393 }
394
395
396
397 static char *
398 midnight_get_title (const WDialog *h, const ssize_t width)
399 {
400 char *path;
401 char *login;
402 char *p;
403
404 (void) h;
405
406 title_path_prepare (&path, &login);
407
408 p = g_strdup_printf ("%s [%s]:%s", _ ("Panels:"), login, path);
409 g_free (path);
410 g_free (login);
411 path = g_strdup (str_trunc (p, width - 4));
412 g_free (p);
413
414 return path;
415 }
416
417
418
419 static void
420 toggle_panels_split (void)
421 {
422 panels_layout.horizontal_split = !panels_layout.horizontal_split;
423 layout_change ();
424 do_refresh ();
425 }
426
427
428
429 #ifdef ENABLE_VFS
430
431 static gboolean
432 check_panel_timestamp (const WPanel *panel, panel_view_mode_t mode, const struct vfs_class *vclass,
433 const vfsid id)
434 {
435 return (mode != view_listing
436 || (vfs_path_get_last_path_vfs (panel->cwd_vpath) == vclass
437 && vfs_getid (panel->cwd_vpath) == id));
438 }
439
440
441
442
443 static gboolean
444 check_current_panel_timestamp (const gchar *event_group_name, const gchar *event_name,
445 gpointer init_data, gpointer data)
446 {
447 ev_vfs_stamp_create_t *event_data = (ev_vfs_stamp_create_t *) data;
448
449 (void) event_group_name;
450 (void) event_name;
451 (void) init_data;
452
453 event_data->ret = check_panel_timestamp (current_panel, get_current_type (), event_data->vclass,
454 event_data->id);
455 return !event_data->ret;
456 }
457
458
459
460
461 static gboolean
462 check_other_panel_timestamp (const gchar *event_group_name, const gchar *event_name,
463 gpointer init_data, gpointer data)
464 {
465 ev_vfs_stamp_create_t *event_data = (ev_vfs_stamp_create_t *) data;
466
467 (void) event_group_name;
468 (void) event_name;
469 (void) init_data;
470
471 event_data->ret =
472 check_panel_timestamp (other_panel, get_other_type (), event_data->vclass, event_data->id);
473 return !event_data->ret;
474 }
475 #endif
476
477
478
479
480 static gboolean
481 print_vfs_message (const gchar *event_group_name, const gchar *event_name, gpointer init_data,
482 gpointer data)
483 {
484 ev_vfs_print_message_t *event_data = (ev_vfs_print_message_t *) data;
485
486 (void) event_group_name;
487 (void) event_name;
488 (void) init_data;
489
490 if (mc_global.midnight_shutdown)
491 goto ret;
492
493 if (!mc_global.hint_visible || the_hint == NULL || WIDGET (the_hint)->owner == NULL)
494 {
495 int col, row;
496
497 if (!nice_rotating_dash || (ok_to_refresh <= 0))
498 goto ret;
499
500
501 tty_getyx (&row, &col);
502
503 tty_gotoyx (0, 0);
504 tty_setcolor (CORE_NORMAL_COLOR);
505 tty_print_string (str_fit_to_term (event_data->msg, COLS - 1, J_LEFT));
506
507
508 tty_gotoyx (row, col);
509 mc_refresh ();
510 goto ret;
511 }
512
513 if (mc_global.hint_visible)
514 set_hintbar (event_data->msg);
515
516 ret:
517 MC_PTR_FREE (event_data->msg);
518 return TRUE;
519 }
520
521
522
523 static void
524 create_panels (void)
525 {
526 int current_index, other_index;
527 panel_view_mode_t current_mode, other_mode;
528 char *current_dir, *other_dir;
529 vfs_path_t *original_dir;
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547 if (boot_current_is_left)
548 {
549
550 current_index = 0;
551 other_index = 1;
552 current_mode = startup_left_mode;
553 other_mode = startup_right_mode;
554
555 if (mc_run_param0 == NULL && mc_run_param1 == NULL)
556 {
557
558 current_dir = NULL;
559 other_dir = saved_other_dir;
560 }
561 else if (mc_run_param0 != NULL && mc_run_param1 != NULL)
562 {
563
564 current_dir = (char *) mc_run_param0;
565 other_dir = mc_run_param1;
566 }
567 else
568 {
569
570 current_dir = (char *) mc_run_param0;
571 other_dir = saved_other_dir;
572 }
573 }
574 else
575 {
576
577 current_index = 1;
578 other_index = 0;
579 current_mode = startup_right_mode;
580 other_mode = startup_left_mode;
581
582 if (mc_run_param0 == NULL && mc_run_param1 == NULL)
583 {
584
585 current_dir = NULL;
586 other_dir = saved_other_dir;
587 }
588 else if (mc_run_param0 != NULL && mc_run_param1 != NULL)
589 {
590
591 current_dir = (char *) mc_run_param0;
592 other_dir = mc_run_param1;
593 }
594 else
595 {
596
597 current_dir = (char *) mc_run_param0;
598 other_dir = saved_other_dir;
599 }
600 }
601
602
603 original_dir = vfs_path_clone (vfs_get_raw_current_dir ());
604
605
606 if (other_dir != NULL)
607 {
608 vfs_path_t *vpath;
609
610 if (g_path_is_absolute (other_dir))
611 vpath = vfs_path_from_str (other_dir);
612 else
613 vpath = vfs_path_append_new (original_dir, other_dir, (char *) NULL);
614 mc_chdir (vpath);
615 vfs_path_free (vpath, TRUE);
616 }
617 create_panel (other_index, other_mode);
618
619
620 if (current_dir == NULL)
621 mc_chdir (original_dir);
622 else
623 {
624 vfs_path_t *vpath;
625
626 if (g_path_is_absolute (current_dir))
627 vpath = vfs_path_from_str (current_dir);
628 else
629 vpath = vfs_path_append_new (original_dir, current_dir, (char *) NULL);
630 mc_chdir (vpath);
631 vfs_path_free (vpath, TRUE);
632 }
633 create_panel (current_index, current_mode);
634
635 if (startup_left_mode == view_listing)
636 current_panel = left_panel;
637 else if (right_panel != NULL)
638 current_panel = right_panel;
639 else
640 current_panel = left_panel;
641
642 vfs_path_free (original_dir, TRUE);
643
644 #ifdef ENABLE_VFS
645 mc_event_add (MCEVENT_GROUP_CORE, "vfs_timestamp", check_other_panel_timestamp, NULL, NULL);
646 mc_event_add (MCEVENT_GROUP_CORE, "vfs_timestamp", check_current_panel_timestamp, NULL, NULL);
647 #endif
648
649 mc_event_add (MCEVENT_GROUP_CORE, "vfs_print_message", print_vfs_message, NULL, NULL);
650 }
651
652
653
654 static void
655 midnight_put_panel_path (WPanel *panel)
656 {
657 vfs_path_t *cwd_vpath;
658 const char *cwd_vpath_str;
659
660 if (!mc_global.cmdline_visible)
661 return;
662
663 cwd_vpath = remove_encoding_from_path (panel->cwd_vpath);
664 cwd_vpath_str = vfs_path_as_str (cwd_vpath);
665
666 command_insert (the_cmdline, cwd_vpath_str, FALSE);
667
668 if (!IS_PATH_SEP (cwd_vpath_str[strlen (cwd_vpath_str) - 1]))
669 command_insert (the_cmdline, PATH_SEP_STR, FALSE);
670
671 vfs_path_free (cwd_vpath, TRUE);
672 }
673
674
675
676 static void
677 put_link (WPanel *panel)
678 {
679 const file_entry_t *fe;
680
681 if (!mc_global.cmdline_visible)
682 return;
683
684 fe = panel_current_entry (panel);
685
686 if (fe != NULL && S_ISLNK (fe->st.st_mode))
687 {
688 char buffer[MC_MAXPATHLEN];
689 vfs_path_t *vpath;
690 int i;
691
692 vpath = vfs_path_append_new (panel->cwd_vpath, fe->fname->str, (char *) NULL);
693 i = mc_readlink (vpath, buffer, sizeof (buffer) - 1);
694 vfs_path_free (vpath, TRUE);
695
696 if (i > 0)
697 {
698 buffer[i] = '\0';
699 command_insert (the_cmdline, buffer, TRUE);
700 }
701 }
702 }
703
704
705
706 static void
707 put_current_link (void)
708 {
709 put_link (current_panel);
710 }
711
712
713
714 static void
715 put_other_link (void)
716 {
717 if (get_other_type () == view_listing)
718 put_link (other_panel);
719 }
720
721
722
723
724 static void
725 put_current_selected (void)
726 {
727 if (!mc_global.cmdline_visible)
728 return;
729
730 if (get_current_type () == view_tree)
731 {
732 WTree *tree;
733 const vfs_path_t *selected_name;
734
735 tree = (WTree *) get_panel_widget (get_current_index ());
736 selected_name = tree_selected_name (tree);
737 command_insert (the_cmdline, vfs_path_as_str (selected_name), TRUE);
738 }
739 else
740 {
741 const file_entry_t *fe;
742
743 fe = panel_current_entry (current_panel);
744 if (fe != NULL)
745 command_insert (the_cmdline, fe->fname->str, TRUE);
746 }
747 }
748
749
750
751 static void
752 put_tagged (const WPanel *panel)
753 {
754 if (!mc_global.cmdline_visible)
755 return;
756
757 input_disable_update (the_cmdline);
758
759 if (panel->marked == 0)
760 {
761 const file_entry_t *fe = panel_current_entry (panel);
762
763 if (fe != NULL)
764 command_insert (the_cmdline, fe->fname->str, TRUE);
765 }
766 else
767 for (int m = 0, i = 0; m < panel->marked && i < panel->dir.len; i++)
768 if (panel->dir.list[i].f.marked != 0)
769 {
770 command_insert (the_cmdline, panel->dir.list[i].fname->str, TRUE);
771 m++;
772 }
773
774 input_enable_update (the_cmdline);
775 }
776
777
778
779 static void
780 put_current_tagged (void)
781 {
782 put_tagged (current_panel);
783 }
784
785
786
787 static void
788 put_other_tagged (void)
789 {
790 if (get_other_type () == view_listing)
791 put_tagged (other_panel);
792 }
793
794
795
796 static void
797 setup_mc (void)
798 {
799 tty_display_8bit (TRUE);
800
801 const int baudrate = tty_baudrate ();
802
803 if ((baudrate > 0 && baudrate < 9600) || mc_global.tty.slow_terminal)
804 verbose = FALSE;
805 }
806
807
808
809 static void
810 setup_dummy_mc (void)
811 {
812 vfs_path_t *vpath;
813 char *d;
814 int ret;
815
816 d = vfs_get_cwd ();
817 setup_mc ();
818 vpath = vfs_path_from_str (d);
819 ret = mc_chdir (vpath);
820 (void) ret;
821 vfs_path_free (vpath, TRUE);
822 g_free (d);
823 }
824
825
826
827 static void
828 done_mc (void)
829 {
830
831
832
833
834
835
836 save_setup (auto_save_setup, panels_options.auto_save_setup);
837
838 vfs_stamp_path (vfs_get_raw_current_dir ());
839 }
840
841
842
843 static void
844 create_file_manager (void)
845 {
846 Widget *w = WIDGET (filemanager);
847 WGroup *g = GROUP (filemanager);
848
849 w->keymap = filemanager_map;
850 w->ext_keymap = filemanager_x_map;
851
852 filemanager->get_shortcut = midnight_get_shortcut;
853 filemanager->get_title = midnight_get_title;
854
855 widget_want_tab (w, TRUE);
856
857 the_menubar = menubar_new (NULL);
858 group_add_widget (g, the_menubar);
859 init_menu ();
860 widget_set_visibility (WIDGET (the_menubar), mc_global.menubar_visible);
861
862 create_panels ();
863 group_add_widget (g, get_panel_widget (0));
864 group_add_widget (g, get_panel_widget (1));
865
866 the_hint = label_new (0, 0, NULL);
867 the_hint->color = hintbar_colors;
868 the_hint->auto_adjust_cols = 0;
869 WIDGET (the_hint)->rect.cols = COLS;
870 group_add_widget (g, the_hint);
871 widget_set_visibility (WIDGET (the_hint), mc_global.hint_visible);
872
873 the_cmdline = command_new (0, 0, 0);
874 group_add_widget (g, the_cmdline);
875 widget_set_visibility (WIDGET (the_cmdline), mc_global.cmdline_visible);
876
877 the_prompt = label_new (0, 0, mc_prompt);
878 the_prompt->color = prompt_colors;
879 group_add_widget (g, the_prompt);
880 widget_set_visibility (WIDGET (the_prompt), mc_global.cmdline_visible);
881
882 the_keybar = buttonbar_new ();
883 group_add_widget (g, the_keybar);
884 midnight_set_buttonbar (the_keybar);
885 widget_set_visibility (WIDGET (the_keybar), mc_global.keybar_visible);
886
887 #ifdef ENABLE_SUBSHELL
888
889
890 if (mc_global.tty.use_subshell)
891 add_select_channel (mc_global.tty.subshell_pty, load_prompt, NULL);
892 #endif
893 }
894
895
896
897
898 static vfs_path_t *
899 prepend_cwd_on_local (const char *filename)
900 {
901 vfs_path_t *vpath;
902
903 vpath = vfs_path_from_str (filename);
904 if (!vfs_file_is_local (vpath) || g_path_is_absolute (filename))
905 return vpath;
906
907 vfs_path_free (vpath, TRUE);
908
909 return vfs_path_append_new (vfs_get_raw_current_dir (), filename, (char *) NULL);
910 }
911
912
913
914
915
916
917 static gboolean
918 mc_maybe_editor_or_viewer (void)
919 {
920 gboolean ret;
921
922 switch (mc_global.mc_run_mode)
923 {
924 #ifdef USE_INTERNAL_EDIT
925 case MC_RUN_EDITOR:
926 ret = edit_files ((GList *) mc_run_param0);
927 break;
928 #endif
929 case MC_RUN_VIEWER:
930 {
931 vfs_path_t *vpath = NULL;
932
933 if (mc_run_param0 != NULL && *(char *) mc_run_param0 != '\0')
934 vpath = prepend_cwd_on_local ((char *) mc_run_param0);
935
936 ret = view_file (vpath, FALSE, TRUE);
937 vfs_path_free (vpath, TRUE);
938 break;
939 }
940 #ifdef USE_DIFF_VIEW
941 case MC_RUN_DIFFVIEWER:
942 ret = dview_diff_cmd (mc_run_param0, mc_run_param1);
943 break;
944 #endif
945 default:
946 ret = FALSE;
947 }
948
949 return ret;
950 }
951
952
953
954 static void
955 show_editor_viewer_history (void)
956 {
957 char *s;
958 int act;
959
960 s = show_file_history (WIDGET (filemanager), &act);
961 if (s != NULL)
962 {
963 vfs_path_t *s_vpath;
964
965 switch (act)
966 {
967 case CK_Edit:
968 s_vpath = vfs_path_from_str (s);
969 edit_file_at_line (s_vpath, use_internal_edit, 0);
970 break;
971
972 case CK_View:
973 s_vpath = vfs_path_from_str (s);
974 view_file (s_vpath, use_internal_view, FALSE);
975 break;
976
977 default:
978 {
979 char *d;
980
981 d = g_path_get_dirname (s);
982 s_vpath = vfs_path_from_str (d);
983 panel_cd (current_panel, s_vpath, cd_exact);
984 panel_set_current_by_name (current_panel, s);
985 g_free (d);
986 }
987 }
988
989 g_free (s);
990 vfs_path_free (s_vpath, TRUE);
991 }
992 }
993
994
995
996 static gboolean
997 quit_cmd_internal (int quiet)
998 {
999 int q = quit;
1000 size_t n;
1001
1002 n = dialog_switch_num () - 1;
1003 if (n != 0)
1004 {
1005 char msg[BUF_MEDIUM];
1006
1007 g_snprintf (msg, sizeof (msg),
1008 ngettext ("You have %zu opened screen. Quit anyway?",
1009 "You have %zu opened screens. Quit anyway?", n),
1010 n);
1011
1012 if (query_dialog (PACKAGE_NAME, msg, D_NORMAL, 2, _ ("&Yes"), _ ("&No")) != 0)
1013 return FALSE;
1014 q = 1;
1015 }
1016 else if (quiet || !confirm_exit)
1017 q = 1;
1018 else if (query_dialog (PACKAGE_NAME, _ ("Do you really want to quit?"), D_NORMAL, 2, _ ("&Yes"),
1019 _ ("&No"))
1020 == 0)
1021 q = 1;
1022
1023 if (q != 0)
1024 {
1025 #ifdef ENABLE_SUBSHELL
1026 if (!mc_global.tty.use_subshell)
1027 stop_dialogs ();
1028 else if ((q = exit_subshell () ? 1 : 0) != 0)
1029 #endif
1030 stop_dialogs ();
1031 }
1032
1033 if (q != 0)
1034 quit |= 1;
1035 return (quit != 0);
1036 }
1037
1038
1039
1040 static gboolean
1041 quit_cmd (void)
1042 {
1043 return quit_cmd_internal (0);
1044 }
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055 static void
1056 update_dirty_panels (void)
1057 {
1058 if (get_current_type () == view_listing && current_panel->dirty)
1059 widget_draw (WIDGET (current_panel));
1060
1061 if (get_other_type () == view_listing && other_panel->dirty)
1062 widget_draw (WIDGET (other_panel));
1063 }
1064
1065
1066
1067 static void
1068 toggle_show_hidden (void)
1069 {
1070 panels_options.show_dot_files = !panels_options.show_dot_files;
1071 update_panels (UP_RELOAD, UP_KEEPSEL);
1072
1073 update_dirty_panels ();
1074 }
1075
1076
1077
1078 static cb_ret_t
1079 midnight_execute_cmd (Widget *sender, long command)
1080 {
1081 cb_ret_t res = MSG_HANDLED;
1082
1083 (void) sender;
1084
1085
1086 send_message (current_panel, NULL, MSG_ACTION, CK_SearchStop, NULL);
1087
1088 switch (command)
1089 {
1090 case CK_About:
1091 about_box ();
1092 break;
1093 case CK_ChangePanel:
1094 (void) change_panel ();
1095 break;
1096 case CK_HotListAdd:
1097 add2hotlist_cmd (current_panel);
1098 break;
1099 case CK_SetupListingFormat:
1100 setup_listing_format_cmd ();
1101 break;
1102 case CK_ChangeMode:
1103 chmod_cmd (current_panel);
1104 break;
1105 case CK_ChangeOwn:
1106 chown_cmd (current_panel);
1107 break;
1108 case CK_ChangeOwnAdvanced:
1109 advanced_chown_cmd (current_panel);
1110 break;
1111 #ifdef ENABLE_EXT2FS_ATTR
1112 case CK_ChangeAttributes:
1113 chattr_cmd (current_panel);
1114 break;
1115 #endif
1116 case CK_CompareDirs:
1117 compare_dirs_cmd ();
1118 break;
1119 case CK_Options:
1120 configure_box ();
1121 break;
1122 #ifdef ENABLE_VFS
1123 case CK_OptionsVfs:
1124 configure_vfs_box ();
1125 break;
1126 #endif
1127 case CK_OptionsConfirm:
1128 confirm_box ();
1129 break;
1130 case CK_Copy:
1131 copy_cmd (current_panel);
1132 break;
1133 case CK_PutCurrentPath:
1134 midnight_put_panel_path (current_panel);
1135 break;
1136 case CK_PutCurrentSelected:
1137 put_current_selected ();
1138 break;
1139 case CK_PutCurrentFullSelected:
1140 midnight_put_panel_path (current_panel);
1141 put_current_selected ();
1142 break;
1143 case CK_PutCurrentLink:
1144 put_current_link ();
1145 break;
1146 case CK_PutCurrentTagged:
1147 put_current_tagged ();
1148 break;
1149 case CK_PutOtherPath:
1150 if (get_other_type () == view_listing)
1151 midnight_put_panel_path (other_panel);
1152 break;
1153 case CK_PutOtherLink:
1154 put_other_link ();
1155 break;
1156 case CK_PutOtherTagged:
1157 put_other_tagged ();
1158 break;
1159 case CK_Delete:
1160 delete_cmd (current_panel);
1161 break;
1162 case CK_ScreenList:
1163 dialog_switch_list ();
1164 break;
1165 #ifdef USE_DIFF_VIEW
1166 case CK_CompareFiles:
1167 diff_view_cmd ();
1168 break;
1169 #endif
1170 case CK_Edit:
1171 edit_cmd (current_panel);
1172 break;
1173 #ifdef USE_INTERNAL_EDIT
1174 case CK_EditForceInternal:
1175 edit_cmd_force_internal (current_panel);
1176 break;
1177 #endif
1178 case CK_EditExtensionsFile:
1179 ext_cmd ();
1180 break;
1181 case CK_EditFileHighlightFile:
1182 edit_fhl_cmd ();
1183 break;
1184 case CK_EditUserMenu:
1185 edit_mc_menu_cmd ();
1186 break;
1187 case CK_LinkSymbolicEdit:
1188 edit_symlink_cmd ();
1189 break;
1190 case CK_ExternalPanelize:
1191 external_panelize_cmd ();
1192 break;
1193 case CK_ViewFiltered:
1194 view_filtered_cmd (current_panel);
1195 break;
1196 case CK_Find:
1197 find_cmd (current_panel);
1198 break;
1199 #ifdef ENABLE_VFS_SHELL
1200 case CK_ConnectShell:
1201 shelllink_cmd ();
1202 break;
1203 #endif
1204 #ifdef ENABLE_VFS_FTP
1205 case CK_ConnectFtp:
1206 ftplink_cmd ();
1207 break;
1208 #endif
1209 #ifdef ENABLE_VFS_SFTP
1210 case CK_ConnectSftp:
1211 sftplink_cmd ();
1212 break;
1213 #endif
1214 case CK_Panelize:
1215 panel_panelize_restore ();
1216 break;
1217 case CK_Help:
1218 help_cmd ();
1219 break;
1220 case CK_History:
1221
1222 send_message (the_cmdline, NULL, MSG_ACTION, CK_History, NULL);
1223 break;
1224 case CK_PanelInfo:
1225 if (sender == WIDGET (the_menubar))
1226 info_cmd ();
1227 else
1228 info_cmd_no_menu ();
1229 break;
1230 #ifdef ENABLE_BACKGROUND
1231 case CK_Jobs:
1232 jobs_box ();
1233 break;
1234 #endif
1235 case CK_OptionsLayout:
1236 layout_box ();
1237 break;
1238 case CK_OptionsAppearance:
1239 appearance_box ();
1240 break;
1241 case CK_LearnKeys:
1242 learn_keys ();
1243 break;
1244 case CK_Link:
1245 link_cmd (LINK_HARDLINK);
1246 break;
1247 case CK_PanelListing:
1248 listing_cmd ();
1249 break;
1250 case CK_Menu:
1251 menu_cmd ();
1252 break;
1253 case CK_MenuLastSelected:
1254 menu_last_selected_cmd ();
1255 break;
1256 case CK_MakeDir:
1257 mkdir_cmd (current_panel);
1258 break;
1259 case CK_OptionsPanel:
1260 panel_options_box ();
1261 break;
1262 case CK_SelectCodepage:
1263 encoding_cmd ();
1264 break;
1265 case CK_CdQuick:
1266 quick_cd_cmd (current_panel);
1267 break;
1268 case CK_HotList:
1269 hotlist_cmd (current_panel);
1270 break;
1271 case CK_PanelQuickView:
1272 if (sender == WIDGET (the_menubar))
1273 quick_view_cmd ();
1274 else
1275 quick_cmd_no_menu ();
1276 break;
1277 case CK_QuitQuiet:
1278 quiet_quit_cmd (TRUE);
1279 break;
1280 case CK_Quit:
1281 quit_cmd ();
1282 break;
1283 case CK_LinkSymbolicRelative:
1284 link_cmd (LINK_SYMLINK_RELATIVE);
1285 break;
1286 case CK_Move:
1287 rename_cmd (current_panel);
1288 break;
1289 case CK_Reread:
1290 reread_cmd ();
1291 break;
1292 #ifdef ENABLE_VFS
1293 case CK_VfsList:
1294 vfs_list (current_panel);
1295 break;
1296 #endif
1297 case CK_SaveSetup:
1298 save_setup_cmd ();
1299 break;
1300 case CK_Select:
1301 case CK_Unselect:
1302 case CK_SelectInvert:
1303 case CK_Filter:
1304 res = send_message (current_panel, filemanager, MSG_ACTION, command, NULL);
1305 break;
1306 case CK_Shell:
1307 toggle_subshell ();
1308 break;
1309 case CK_DirSize:
1310 smart_dirsize_cmd (current_panel);
1311 break;
1312 case CK_Sort:
1313 sort_cmd ();
1314 break;
1315 case CK_ExtendedKeyMap:
1316 WIDGET (filemanager)->ext_mode = TRUE;
1317 break;
1318 case CK_Suspend:
1319 mc_event_raise (MCEVENT_GROUP_CORE, "suspend", NULL);
1320 break;
1321 case CK_Swap:
1322 swap_cmd ();
1323 break;
1324 case CK_LinkSymbolic:
1325 link_cmd (LINK_SYMLINK_ABSOLUTE);
1326 break;
1327 case CK_ShowHidden:
1328 toggle_show_hidden ();
1329 break;
1330 case CK_SplitVertHoriz:
1331 toggle_panels_split ();
1332 break;
1333 case CK_SplitEqual:
1334 panels_split_equal ();
1335 break;
1336 case CK_SplitMore:
1337 panels_split_more ();
1338 break;
1339 case CK_SplitLess:
1340 panels_split_less ();
1341 break;
1342 case CK_PanelTree:
1343 panel_tree_cmd ();
1344 break;
1345 case CK_Tree:
1346 treebox_cmd ();
1347 break;
1348 case CK_UserMenu:
1349 user_file_menu_cmd ();
1350 break;
1351 case CK_View:
1352 view_cmd (current_panel);
1353 break;
1354 case CK_ViewFile:
1355 view_file_cmd (current_panel);
1356 break;
1357 case CK_EditorViewerHistory:
1358 show_editor_viewer_history ();
1359 break;
1360 case CK_Cancel:
1361
1362 break;
1363 default:
1364 res = MSG_NOT_HANDLED;
1365 }
1366
1367 return res;
1368 }
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379 static gboolean
1380 is_cmdline_mute (void)
1381 {
1382
1383
1384
1385
1386
1387 return (!widget_get_state (WIDGET (current_panel), WST_FOCUSED)
1388 && (get_other_type () == view_quick || get_other_type () == view_tree));
1389 }
1390
1391
1392
1393
1394
1395
1396
1397
1398 static gboolean
1399 handle_cmdline_enter (void)
1400 {
1401 const char *s;
1402
1403 for (s = input_get_ctext (the_cmdline); *s != '\0' && whitespace (*s); s++)
1404 ;
1405
1406 if (*s != '\0')
1407 {
1408 send_message (the_cmdline, NULL, MSG_KEY, '\n', NULL);
1409 return TRUE;
1410 }
1411
1412 input_insert (the_cmdline, "", FALSE);
1413 the_cmdline->point = 0;
1414
1415 return FALSE;
1416 }
1417
1418
1419
1420 static cb_ret_t
1421 midnight_callback (Widget *w, Widget *sender, widget_msg_t msg, int parm, void *data)
1422 {
1423 long command;
1424
1425 switch (msg)
1426 {
1427 case MSG_INIT:
1428 panel_init ();
1429 setup_panels ();
1430 return MSG_HANDLED;
1431
1432 case MSG_DRAW:
1433 load_hint (TRUE);
1434 group_default_callback (w, NULL, MSG_DRAW, 0, NULL);
1435
1436 if (mc_global.tty.console_flag != '\0' && output_lines != 0)
1437 {
1438 unsigned char end_line;
1439
1440 end_line = LINES - (mc_global.keybar_visible ? 1 : 0) - 1;
1441 show_console_contents (output_start_y, end_line - output_lines, end_line);
1442 }
1443 return MSG_HANDLED;
1444
1445 case MSG_RESIZE:
1446 widget_adjust_position (w->pos_flags, &w->rect);
1447 setup_panels ();
1448 menubar_arrange (the_menubar);
1449 return MSG_HANDLED;
1450
1451 case MSG_IDLE:
1452
1453 widget_idle (w, FALSE);
1454
1455 if (boot_current_is_left)
1456 widget_select (get_panel_widget (0));
1457 else
1458 widget_select (get_panel_widget (1));
1459
1460 if (auto_menu)
1461 midnight_execute_cmd (NULL, CK_UserMenu);
1462 return MSG_HANDLED;
1463
1464 case MSG_KEY:
1465 if (w->ext_mode)
1466 {
1467 command = widget_lookup_key (w, parm);
1468 if (command != CK_IgnoreKey)
1469 return midnight_execute_cmd (NULL, command);
1470 }
1471
1472
1473 if (widget_get_state (WIDGET (the_menubar), WST_FOCUSED))
1474 return MSG_NOT_HANDLED;
1475
1476 if (parm == '\n' && !is_cmdline_mute ())
1477 {
1478 if (handle_cmdline_enter ())
1479 return MSG_HANDLED;
1480
1481 }
1482
1483 if ((!mc_global.tty.alternate_plus_minus
1484 || !(mc_global.tty.console_flag != '\0' || mc_global.tty.xterm_flag))
1485 && !quote && !current_panel->quick_search.active)
1486 {
1487 if (!only_leading_plus_minus)
1488 {
1489
1490 if (parm == '+')
1491 return send_message (current_panel, filemanager, MSG_ACTION, CK_Select, NULL);
1492
1493 if (parm == '\\' || parm == '-')
1494 return send_message (current_panel, filemanager, MSG_ACTION, CK_Unselect, NULL);
1495
1496 if (parm == '*')
1497 return send_message (current_panel, filemanager, MSG_ACTION, CK_SelectInvert,
1498 NULL);
1499 }
1500 else if (!mc_global.cmdline_visible || input_is_empty (the_cmdline))
1501 {
1502
1503
1504
1505 if (parm == '+')
1506 return send_message (current_panel, filemanager, MSG_ACTION, CK_Select, NULL);
1507
1508 if (parm == '\\' || parm == '-')
1509 return send_message (current_panel, filemanager, MSG_ACTION, CK_Unselect, NULL);
1510
1511 if (parm == '*')
1512 return send_message (current_panel, filemanager, MSG_ACTION, CK_SelectInvert,
1513 NULL);
1514 }
1515 }
1516 return MSG_NOT_HANDLED;
1517
1518 case MSG_HOTKEY_HANDLED:
1519 if ((get_current_type () == view_listing) && current_panel->quick_search.active)
1520 {
1521 current_panel->dirty = TRUE;
1522 send_message (current_panel, NULL, MSG_ACTION, CK_SearchStop, NULL);
1523 }
1524 return MSG_HANDLED;
1525
1526 case MSG_UNHANDLED_KEY:
1527 {
1528 cb_ret_t v = MSG_NOT_HANDLED;
1529
1530 command = widget_lookup_key (w, parm);
1531 if (command != CK_IgnoreKey)
1532 v = midnight_execute_cmd (NULL, command);
1533
1534 if (v == MSG_NOT_HANDLED && mc_global.cmdline_visible && !is_cmdline_mute ())
1535 v = send_message (the_cmdline, NULL, MSG_KEY, parm, NULL);
1536
1537 return v;
1538 }
1539
1540 case MSG_POST_KEY:
1541 if (!widget_get_state (WIDGET (the_menubar), WST_FOCUSED))
1542 update_dirty_panels ();
1543 return MSG_HANDLED;
1544
1545 case MSG_ACTION:
1546
1547 return midnight_execute_cmd (sender, parm);
1548
1549 case MSG_DESTROY:
1550 panel_deinit ();
1551 return MSG_HANDLED;
1552
1553 default:
1554 return dlg_default_callback (w, sender, msg, parm, data);
1555 }
1556 }
1557
1558
1559
1560
1561
1562 void
1563 update_menu (void)
1564 {
1565 menu_set_name (left_menu, panels_layout.horizontal_split ? _ ("&Above") : _ ("&Left"));
1566 menu_set_name (right_menu, panels_layout.horizontal_split ? _ ("&Below") : _ ("&Right"));
1567 menubar_arrange (the_menubar);
1568 widget_set_visibility (WIDGET (the_menubar), mc_global.menubar_visible);
1569 }
1570
1571
1572
1573 void
1574 midnight_set_buttonbar (WButtonBar *b)
1575 {
1576 Widget *w = WIDGET (filemanager);
1577
1578 buttonbar_set_label (b, 1, Q_ ("ButtonBar|Help"), w->keymap, NULL);
1579 buttonbar_set_label (b, 2, Q_ ("ButtonBar|Menu"), w->keymap, NULL);
1580 buttonbar_set_label (b, 3, Q_ ("ButtonBar|View"), w->keymap, NULL);
1581 buttonbar_set_label (b, 4, Q_ ("ButtonBar|Edit"), w->keymap, NULL);
1582 buttonbar_set_label (b, 5, Q_ ("ButtonBar|Copy"), w->keymap, NULL);
1583 buttonbar_set_label (b, 6, Q_ ("ButtonBar|RenMov"), w->keymap, NULL);
1584 buttonbar_set_label (b, 7, Q_ ("ButtonBar|Mkdir"), w->keymap, NULL);
1585 buttonbar_set_label (b, 8, Q_ ("ButtonBar|Delete"), w->keymap, NULL);
1586 buttonbar_set_label (b, 9, Q_ ("ButtonBar|PullDn"), w->keymap, NULL);
1587 buttonbar_set_label (b, 10, Q_ ("ButtonBar|Quit"), w->keymap, NULL);
1588 }
1589
1590
1591
1592
1593
1594
1595 char *
1596 get_random_hint (gboolean force)
1597 {
1598 static const gint64 update_period = 60 * G_USEC_PER_SEC;
1599 static gint64 tv = 0;
1600
1601 char *data, *result, *eop;
1602 size_t len, start;
1603 GIConv conv;
1604
1605
1606 if (!force && !mc_time_elapsed (&tv, update_period))
1607 return g_strdup ("");
1608
1609 data = load_mc_home_file (mc_global.share_data_dir, MC_HINT, NULL, &len);
1610 if (data == NULL)
1611 return NULL;
1612
1613
1614 srand ((unsigned int) (tv / G_USEC_PER_SEC));
1615 start = ((size_t) rand ()) % (len - 1);
1616
1617
1618 for (; start != 0; start--)
1619 if (data[start] == '\n' && data[start + 1] == '\n')
1620 {
1621 start += 2;
1622 break;
1623 }
1624
1625
1626 for (eop = data + start; *eop != '\0'; eop++)
1627 {
1628 if (*eop == '\n' && *(eop + 1) == '\n')
1629 {
1630 *eop = '\0';
1631 break;
1632 }
1633 if (*eop == '\n')
1634 *eop = ' ';
1635 }
1636
1637
1638
1639 conv = str_crt_conv_from ("UTF-8");
1640 if (conv == INVALID_CONV)
1641 result = g_strndup (data + start, len - start);
1642 else
1643 {
1644 GString *buffer;
1645 gboolean nok;
1646
1647 buffer = g_string_sized_new (len - start);
1648 nok = (str_convert (conv, data + start, buffer) == ESTR_FAILURE);
1649 result = g_string_free (buffer, nok);
1650 str_close_conv (conv);
1651 }
1652
1653 g_free (data);
1654 return result;
1655 }
1656
1657
1658
1659
1660
1661
1662
1663 void
1664 load_hint (gboolean force)
1665 {
1666 char *hint;
1667
1668 if (WIDGET (the_hint)->owner == NULL)
1669 return;
1670
1671 if (!mc_global.hint_visible)
1672 {
1673 label_set_text (the_hint, NULL);
1674 return;
1675 }
1676
1677 hint = get_random_hint (force);
1678
1679 if (hint != NULL)
1680 {
1681 if (*hint != '\0')
1682 set_hintbar (hint);
1683 g_free (hint);
1684 }
1685 else
1686 {
1687 char text[BUF_SMALL];
1688
1689 g_snprintf (text, sizeof (text), "%s %s\n", PACKAGE_NAME, mc_global.mc_version);
1690 set_hintbar (text);
1691 }
1692 }
1693
1694
1695
1696
1697
1698
1699
1700
1701 WPanel *
1702 change_panel (void)
1703 {
1704 input_complete_free (the_cmdline);
1705 group_select_next_widget (GROUP (filemanager));
1706 return current_panel;
1707 }
1708
1709
1710
1711
1712
1713
1714 void
1715 save_cwds_stat (void)
1716 {
1717 if (panels_options.fast_reload)
1718 {
1719 mc_stat (current_panel->cwd_vpath, &(current_panel->dir_stat));
1720 if (get_other_type () == view_listing)
1721 mc_stat (other_panel->cwd_vpath, &(other_panel->dir_stat));
1722 }
1723 }
1724
1725
1726
1727 gboolean
1728 quiet_quit_cmd (const gboolean suppress_last_pwd)
1729 {
1730 print_last_revert = suppress_last_pwd;
1731 return quit_cmd_internal (1);
1732 }
1733
1734
1735
1736
1737 gboolean
1738 do_nc (void)
1739 {
1740 gboolean ret;
1741
1742 #ifdef USE_INTERNAL_EDIT
1743 edit_stack_init ();
1744 #endif
1745
1746
1747 if (mc_global.mc_run_mode != MC_RUN_FULL)
1748 {
1749 setup_dummy_mc ();
1750 ret = mc_maybe_editor_or_viewer ();
1751 }
1752 else
1753 {
1754 filemanager = dlg_create (FALSE, 0, 0, 1, 1, WPOS_FULLSCREEN, FALSE, dialog_colors,
1755 midnight_callback, NULL, "[main]", NULL);
1756
1757
1758 widget_idle (WIDGET (filemanager), TRUE);
1759
1760 setup_mc ();
1761 mc_filehighlight = mc_fhl_new (TRUE);
1762
1763 create_file_manager ();
1764 (void) dlg_run (filemanager);
1765
1766 mc_fhl_free (&mc_filehighlight);
1767
1768 ret = TRUE;
1769
1770
1771 if (mc_args__last_wd_file != NULL && vfs_current_is_local ())
1772 last_wd_str = g_strdup (vfs_path_as_str (current_panel->cwd_vpath));
1773
1774
1775 mc_event_destroy (MCEVENT_GROUP_CORE, "vfs_timestamp");
1776 }
1777
1778
1779 mc_global.midnight_shutdown = TRUE;
1780 dialog_switch_shutdown ();
1781 done_mc ();
1782
1783 if (filemanager != NULL)
1784 widget_destroy (WIDGET (filemanager));
1785
1786 current_panel = NULL;
1787
1788 #ifdef USE_INTERNAL_EDIT
1789 edit_stack_free ();
1790 #endif
1791
1792 if ((quit & SUBSHELL_EXIT) == 0)
1793 tty_clear_screen ();
1794
1795 return ret;
1796 }
1797
1798