diff --git a/src/Makefile.am b/src/Makefile.am index 6d87a3952..ae9a36e87 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -143,6 +143,9 @@ install-exec-hook: if USE_EDIT $(MAKE) install_mcedit endif +if USE_DIFF + $(MAKE) install_mcdiff +endif # # Make relative symlinks, but do the right thing if LN_S is `ln' or `cp'. @@ -153,8 +156,14 @@ install_mcview: install_mcedit: cd $(DESTDIR)$(bindir)/$(binprefix) && rm -f mcedit && $(LN_S) mc mcedit +install_mcdiff: + cd $(DESTDIR)$(bindir)/$(binprefix) && rm -f mcdiff && $(LN_S) mc mcdiff + uninstall-hook: rm -f $(DESTDIR)$(bindir)/$(binprefix)/mcview if USE_EDIT rm -f $(DESTDIR)$(bindir)/$(binprefix)/mcedit endif +if USE_DIFF + rm -f $(DESTDIR)$(bindir)/$(binprefix)/mcdiff +endif diff --git a/src/args.c b/src/args.c index 1c753d989..15e3da203 100644 --- a/src/args.c +++ b/src/args.c @@ -145,13 +145,13 @@ static const GOptionEntry argument_main_table[] = { /* single file operations */ { "view", 'v', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_STRING, - &view_one_file, + &mc_run_param0, N_("Launches the file viewer on a file"), ""}, { "edit", 'e', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_STRING, - &edit_one_file, + &mc_run_param0, N_("Edits one file"), ""}, diff --git a/src/diffviewer/ydiff.c b/src/diffviewer/ydiff.c index 9281fcf80..50bf59048 100644 --- a/src/diffviewer/ydiff.c +++ b/src/diffviewer/ydiff.c @@ -31,29 +31,30 @@ #include #include +#include "lib/global.h" + +#include "lib/tty/tty.h" +#include "lib/tty/color.h" +#include "lib/tty/key.h" + +#include "lib/skin.h" /* EDITOR_NORMAL_COLOR */ +#include "lib/vfs/mc-vfs/vfs.h" /* mc_opendir, mc_readdir, mc_closedir, */ + #include "src/cmddef.h" #include "src/keybind.h" -#include "lib/global.h" -#include "lib/tty/tty.h" #include "src/cmd.h" #include "src/dialog.h" #include "src/widget.h" -#include "lib/tty/color.h" #include "src/help.h" -#include "lib/tty/key.h" #include "src/wtools.h" #include "src/charsets.h" #include "src/history.h" #include "src/panel.h" /* Needed for current_panel and other_panel */ #include "src/layout.h" /* Needed for get_current_index and get_other_panel */ -#include "lib/skin.h" /* EDITOR_NORMAL_COLOR */ -#include "lib/vfs/mc-vfs/vfs.h" /* mc_opendir, mc_readdir, mc_closedir, */ /* mc_open, mc_close, mc_read, mc_stat */ #include "src/main.h" /* mc_run_mode */ #include "ydiff.h" -#ifdef USE_DIFF_VIEW - /*** global variables ****************************************************************************/ const global_keymap_t *diff_map; @@ -3133,7 +3134,7 @@ view_diff_cmd (WDiff *dview) int is_dir0 = 0; int is_dir1 = 0; - if (dview == NULL) + if ((mc_run_mode == MC_RUN_FULL) && (dview == NULL)) { const WPanel *panel0 = current_panel; const WPanel *panel1 = other_panel; diff --git a/src/execute.c b/src/execute.c index 16c0898e2..234429cec 100644 --- a/src/execute.c +++ b/src/execute.c @@ -304,7 +304,7 @@ toggle_panels (void) } #endif /* HAVE_SUBSHELL_SUPPORT */ - if ((view_one_file == NULL) && (edit_one_file == NULL)) { + if (mc_run_mode == MC_RUN_FULL) { update_panels (UP_OPTIMIZE, UP_KEEPSEL); update_xterm_title_path (); } diff --git a/src/main.c b/src/main.c index 2b194e220..afeb6e778 100644 --- a/src/main.c +++ b/src/main.c @@ -91,21 +91,23 @@ #include "cmddef.h" /* CK_ cmd name const */ #include "user.h" /* user_file_menu_cmd() */ - #include "chmod.h" #include "chown.h" #include "achown.h" #include "main.h" - #ifdef USE_INTERNAL_EDIT -# include "src/editor/edit.h" +#include "src/editor/edit.h" #endif -#ifdef HAVE_CHARSET +#ifdef USE_DIFF_VIEW +#include "src/diffviewer/ydiff.h" +#endif + +#ifdef HAVE_CHARSET #include "charsets.h" -#endif /* HAVE_CHARSET */ +#endif #include "keybind.h" /* type global_keymap_t */ @@ -257,14 +259,9 @@ const char *home_dir = NULL; /* Tab size */ int option_tab_spacing = 8; -/* The value of the other directory, only used when loading the setup */ -char *other_dir = NULL; - /* Only used at program boot */ int boot_current_is_left = 1; -static char *this_dir = NULL; - /* If this is true, then when browsing the tree the other window will * automatically reload it's directory with the contents of the currently * selected directory. @@ -276,11 +273,9 @@ static char *last_wd_string = NULL; /* Set to 1 to suppress printing the last directory */ static int print_last_revert = 0; -/* File name to view if argument was supplied */ -const char *view_one_file = NULL; - -/* File name to edit if argument was supplied */ -const char *edit_one_file = NULL; +mc_run_mode_t mc_run_mode = MC_RUN_FULL; +char *mc_run_param0 = NULL; +char *mc_run_param1 = NULL; /* Line to start the editor on */ static int edit_one_file_start_line = 0; @@ -952,23 +947,23 @@ create_panels (void) other_mode = startup_left_mode; } /* Creates the left panel */ - if (this_dir) { - if (other_dir) { + if (mc_run_param0 != NULL) { + if (mc_run_param1 != NULL) { /* Ok, user has specified two dirs, save the original one, * since we may not be able to chdir to the proper * second directory later */ mc_get_current_wd (original_dir, sizeof (original_dir) - 2); } - translated_mc_chdir (this_dir); + translated_mc_chdir (mc_run_param0); } set_display_type (current_index, current_mode); /* The other panel */ - if (other_dir) { + if (mc_run_param1 != NULL) { if (original_dir[0] != '\0') translated_mc_chdir (original_dir); - translated_mc_chdir (other_dir); + translated_mc_chdir (mc_run_param1); } set_display_type (other_index, other_mode); @@ -1158,11 +1153,6 @@ midnight_execute_cmd (Widget *sender, unsigned long command) case CK_CompareDirsCmd: compare_dirs_cmd (); break; -#ifdef USE_DIFF_VIEW - case CK_DiffViewCmd: - diff_view_cmd (); - break; -#endif case CK_ConfigureBox: configure_box (); break; @@ -1198,6 +1188,11 @@ midnight_execute_cmd (Widget *sender, unsigned long command) case CK_DeleteCmd: delete_cmd (); break; +#ifdef USE_DIFF_VIEW + case CK_DiffViewCmd: + diff_view_cmd (); + break; +#endif case CK_DisplayBitsBox: display_bits_box (); break; @@ -1829,16 +1824,28 @@ prepend_cwd_on_local (const char *filename) static void mc_maybe_editor_or_viewer (void) { - if (view_one_file != NULL) { + switch (mc_run_mode) { +#ifdef USE_INTERNAL_EDIT + case MC_RUN_EDITOR: + edit_file (mc_run_param0, edit_one_file_start_line); + break; +#endif /* USE_INTERNAL_EDIT */ + case MC_RUN_VIEWER: + { char *path; - path = prepend_cwd_on_local (view_one_file); + path = prepend_cwd_on_local (mc_run_param0); view_file (path, 0, 1); g_free (path); + break; + } +#ifdef USE_DIFF_VIEW + case MC_RUN_DIFFVIEWER: + diff_view (mc_run_param0, mc_run_param1, mc_run_param0, mc_run_param1); + break; +#endif /* USE_DIFF_VIEW */ + default: + break; } -#ifdef USE_INTERNAL_EDIT - else - edit_file (edit_one_file, edit_one_file_start_line); -#endif /* USE_INTERNAL_EDIT */ midnight_shutdown = 1; done_mc (); } @@ -1858,10 +1865,10 @@ do_nc (void) midnight_dlg = create_dlg (0, 0, LINES, COLS, midnight_colors, midnight_callback, "[main]", NULL, DLG_WANT_IDLE); - if ((view_one_file != NULL) || (edit_one_file != NULL)) - setup_dummy_mc (); - else + if (mc_run_mode == MC_RUN_FULL) setup_mc (); + else + setup_dummy_mc (); /* start check display_codepage and source_codepage */ check_codeset (); @@ -1897,7 +1904,7 @@ do_nc (void) #endif /* Check if we were invoked as an editor or file viewer */ - if ((view_one_file != NULL) || (edit_one_file != NULL)) + if (mc_run_mode != MC_RUN_FULL) mc_maybe_editor_or_viewer (); else { create_panels_and_run_mc (); @@ -2048,8 +2055,8 @@ mc_main__setup_by_args (int argc, char *argv[]) tmp = (argc > 0) ? argv[1] : NULL; if (!STRNCOMP (base, "mce", 3) || !STRCOMP (base, "vi")) { - edit_one_file = ""; - if (tmp) { + mc_run_param0 = g_strdup (""); + if (tmp != NULL) { /* * Check for filename:lineno, followed by an optional colon. * This format is used by many programs (especially compilers) @@ -2069,7 +2076,7 @@ mc_main__setup_by_args (int argc, char *argv[]) * If it doesn't exist, revert to the old behavior. */ if (mc_stat (tmp, &st) == -1 && mc_stat (fname, &st) != -1) { - edit_one_file = fname; + mc_run_param0 = fname; edit_one_file_start_line = atoi (p); } else { g_free (fname); @@ -2087,24 +2094,40 @@ mc_main__setup_by_args (int argc, char *argv[]) } } } - edit_one_file = g_strdup (tmp); + mc_run_param0 = g_strdup (tmp); } } + mc_run_mode = MC_RUN_EDITOR; } else if (!STRNCOMP (base, "mcv", 3) || !STRCOMP (base, "view")) { - if (tmp) - view_one_file = g_strdup (tmp); + if (tmp != NULL) + mc_run_param0 = g_strdup (tmp); else { fputs ("No arguments given to the viewer\n", stderr); exit (1); } + mc_run_mode = MC_RUN_VIEWER; +#ifdef USE_DIFF_VIEW + } else if (!STRNCOMP (base, "mcd", 3) || !STRCOMP (base, "diff")) { + if (argc < 3) { + fputs ("There 2 files are required to diffviewer\n", stderr); + exit (1); + } else if (tmp != NULL) { + mc_run_param0 = g_strdup (tmp); + tmp = (argc > 1) ? argv[2] : NULL; + if (tmp != NULL) + mc_run_param1 = g_strdup (tmp); + mc_run_mode = MC_RUN_DIFFVIEWER; + } +#endif /* USE_DIFF_VIEW */ } else { /* sets the current dir and the other dir */ - if (tmp) { - this_dir = g_strdup (tmp); + if (tmp != NULL) { + mc_run_param0 = g_strdup (tmp); tmp = (argc > 1) ? argv[2] : NULL; - if (tmp) - other_dir = g_strdup (tmp); + if (tmp != NULL) + mc_run_param1 = g_strdup (tmp); } + mc_run_mode = MC_RUN_FULL; } } @@ -2152,7 +2175,7 @@ main (int argc, char *argv[]) #ifdef HAVE_SUBSHELL_SUPPORT /* Don't use subshell when invoked as viewer or editor */ - if ((view_one_file != NULL) || (edit_one_file != NULL)) + if (mc_run_mode != MC_RUN_FULL) use_subshell = 0; if (use_subshell) @@ -2254,8 +2277,8 @@ main (int argc, char *argv[]) handle_console (CONSOLE_DONE); putchar ('\n'); /* Hack to make shell's prompt start at left of screen */ - if (mc_args__last_wd_file && last_wd_string && !print_last_revert - && !edit_one_file && !view_one_file) { + if (mc_run_mode == MC_RUN_FULL && mc_args__last_wd_file && last_wd_string + && !print_last_revert) { int last_wd_fd = open (mc_args__last_wd_file, O_WRONLY | O_CREAT | O_TRUNC | O_EXCL, S_IRUSR | S_IWUSR); @@ -2278,8 +2301,8 @@ main (int argc, char *argv[]) #endif str_uninit_strings (); - g_free (this_dir); - g_free (other_dir); + g_free (mc_run_param0); + g_free (mc_run_param1); #ifdef USE_INTERNAL_EDIT edit_stack_free (); diff --git a/src/main.h b/src/main.h index 1f1572681..63aab2461 100644 --- a/src/main.h +++ b/src/main.h @@ -9,6 +9,31 @@ #include "lib/global.h" #include "keybind.h" +/* run mode and params */ +typedef enum +{ + MC_RUN_FULL = 0, + MC_RUN_EDITOR, + MC_RUN_VIEWER, + MC_RUN_DIFFVIEWER +} mc_run_mode_t; + +extern mc_run_mode_t mc_run_mode; +/* + * MC_RUN_FULL: dir for left panel + * MC_RUN_EDITOR: file to edit + * MC_RUN_VIEWER: file to view + * MC_RUN_DIFFVIEWER: first file to compare + */ +extern char *mc_run_param0; +/* + * MC_RUN_FULL: dir for right panel + * MC_RUN_EDITOR: unused + * MC_RUN_VIEWER: unused + * MC_RUN_DIFFVIEWER: second file to compare + */ +extern char *mc_run_param1; + /* Toggling functions */ void toggle_fast_reload (void); void toggle_mix_all_files (void); @@ -29,8 +54,6 @@ struct WButtonBar; void midnight_set_buttonbar (struct WButtonBar *b); /* See main.c for details on these variables */ -extern const char *edit_one_file; -extern const char *view_one_file; extern int mark_moves_down; extern int auto_menu; extern int pause_after_run; @@ -39,7 +62,6 @@ extern int use_internal_view; extern int use_internal_edit; extern int fast_reload_w; extern int clear_before_exec; -extern char *other_dir; extern int mouse_move_pages; extern int option_tab_spacing; @@ -136,7 +158,6 @@ void print_vfs_message(const char *msg, ...) __attribute__ ((format (__printf__, 1, 2))); extern const char *mc_prompt; -extern const char *edit_one_file; extern char *mc_home; extern char *mc_home_alt; diff --git a/src/setup.c b/src/setup.c index 19b8d298c..b195cca73 100644 --- a/src/setup.c +++ b/src/setup.c @@ -356,7 +356,7 @@ save_panel_types (void) { panel_view_mode_t type; - if ((view_one_file != NULL) || (edit_one_file != NULL)) + if (mc_run_mode != MC_RUN_FULL) return; if (!mc_config_get_int (mc_main_config, CONFIG_APP_SECTION, @@ -812,11 +812,11 @@ load_setup (void) if (startup_left_mode != view_listing && startup_right_mode != view_listing) startup_left_mode = view_listing; - if (!other_dir) + if (mc_run_param1 == NULL) { buffer = mc_config_get_string (mc_panels_config, "Dirs", "other_dir", "."); if (vfs_file_is_local (buffer)) - other_dir = buffer; + mc_run_param1 = buffer; else g_free (buffer); } diff --git a/src/user.c b/src/user.c index f7444c613..dcca7a2ab 100644 --- a/src/user.c +++ b/src/user.c @@ -193,7 +193,7 @@ expand_format (struct WEdit *edit_widget, char c, gboolean do_quote) if (c == '%') return g_strdup ("%"); - if (edit_one_file == NULL) { + if (mc_run_mode == MC_RUN_FULL) { if (g_ascii_islower ((gchar) c)) panel = current_panel; else {