Browse Source

mcviewer: refactor mode flags.

Signed-off-by: Andrew Borodin <aborodin@vmail.ru>
Andrew Borodin 7 years ago
parent
commit
074008025b

+ 21 - 22
src/filemanager/cmd.c

@@ -522,31 +522,30 @@ view_file_at_line (const vfs_path_t * filename_vpath, gboolean plain_view, gbool
 
     if (plain_view)
     {
-        int changed_hex_mode = 0;
-        int changed_nroff_flag = 0;
-        int changed_magic_flag = 0;
-
-        mcview_altered_hex_mode = 0;
-        mcview_altered_nroff_flag = 0;
-        mcview_altered_magic_flag = 0;
-        if (mcview_default_hex_mode)
-            changed_hex_mode = 1;
-        if (mcview_default_nroff_flag)
-            changed_nroff_flag = 1;
-        if (mcview_default_magic_flag)
-            changed_magic_flag = 1;
-        mcview_default_hex_mode = 0;
-        mcview_default_nroff_flag = 0;
-        mcview_default_magic_flag = 0;
+        mcview_mode_flags_t changed_flags;
+
+        mcview_clear_mode_flags (&changed_flags);
+        mcview_altered_flags.hex = FALSE;
+        mcview_altered_flags.magic = FALSE;
+        mcview_altered_flags.nroff = FALSE;
+        if (mcview_global_flags.hex)
+            changed_flags.hex = TRUE;
+        if (mcview_global_flags.magic)
+            changed_flags.magic = TRUE;
+        if (mcview_global_flags.nroff)
+            changed_flags.nroff = TRUE;
+        mcview_global_flags.hex = FALSE;
+        mcview_global_flags.magic = FALSE;
+        mcview_global_flags.nroff = FALSE;
 
         ret = mcview_viewer (NULL, filename_vpath, start_line, search_start, search_end);
 
-        if (changed_hex_mode && !mcview_altered_hex_mode)
-            mcview_default_hex_mode = 1;
-        if (changed_nroff_flag && !mcview_altered_nroff_flag)
-            mcview_default_nroff_flag = 1;
-        if (changed_magic_flag && !mcview_altered_magic_flag)
-            mcview_default_magic_flag = 1;
+        if (changed_flags.hex && !mcview_altered_flags.hex)
+            mcview_global_flags.hex = TRUE;
+        if (changed_flags.magic && !mcview_altered_flags.magic)
+            mcview_global_flags.magic = TRUE;
+        if (changed_flags.nroff && !mcview_altered_flags.nroff)
+            mcview_global_flags.nroff = TRUE;
 
         dialog_switch_process_pending ();
     }

+ 21 - 12
src/filemanager/ext.c

@@ -353,25 +353,34 @@ exec_make_shell_string (const char *lc_data, const vfs_path_t * filename_vpath)
 static void
 exec_extension_view (void *target, char *cmd, const vfs_path_t * filename_vpath, int start_line)
 {
-    int def_hex_mode = mcview_default_hex_mode, changed_hex_mode = 0;
-    int def_nroff_flag = mcview_default_nroff_flag, changed_nroff_flag = 0;
+    mcview_mode_flags_t def_flags = {
+        /* *INDENT-OFF* */
+        .wrap = FALSE,
+        .hex = mcview_global_flags.hex,
+        .magic = FALSE,
+        .nroff = mcview_global_flags.nroff
+        /* *INDENT-ON* */
+    };
+
+    mcview_mode_flags_t changed_flags;
 
-    mcview_altered_hex_mode = 0;
-    mcview_altered_nroff_flag = 0;
-    if (def_hex_mode != mcview_default_hex_mode)
-        changed_hex_mode = 1;
-    if (def_nroff_flag != mcview_default_nroff_flag)
-        changed_nroff_flag = 1;
+    mcview_clear_mode_flags (&changed_flags);
+    mcview_altered_flags.hex = FALSE;
+    mcview_altered_flags.nroff = FALSE;
+    if (def_flags.hex != mcview_global_flags.hex)
+        changed_flags.hex = TRUE;
+    if (def_flags.nroff != mcview_global_flags.nroff)
+        changed_flags.nroff = TRUE;
 
     if (target == NULL)
         mcview_viewer (cmd, filename_vpath, start_line, 0, 0);
     else
         mcview_load ((WView *) target, cmd, vfs_path_as_str (filename_vpath), start_line, 0, 0);
 
-    if (changed_hex_mode && !mcview_altered_hex_mode)
-        mcview_default_hex_mode = def_hex_mode;
-    if (changed_nroff_flag && !mcview_altered_nroff_flag)
-        mcview_default_nroff_flag = def_nroff_flag;
+    if (changed_flags.hex && !mcview_altered_flags.hex)
+        mcview_global_flags.hex = def_flags.hex;
+    if (changed_flags.nroff && !mcview_altered_flags.nroff)
+        mcview_global_flags.nroff = def_flags.nroff;
 
     dialog_switch_process_pending ();
 }

+ 1 - 1
src/setup.c

@@ -302,7 +302,7 @@ static const struct
     { "mouse_close_dialog", &mouse_close_dialog},
     { "fast_refresh", &fast_refresh },
     { "drop_menus", &drop_menus },
-    { "wrap_mode",  &mcview_global_wrap_mode },
+    { "wrap_mode",  &mcview_global_flags.wrap },
     { "old_esc_mode", &old_esc_mode },
     { "cd_symlinks", &mc_global.vfs.cd_symlinks },
     { "show_all_if_ambiguous", &mc_global.widget.show_all_if_ambiguous },

+ 4 - 4
src/usermenu.c

@@ -640,22 +640,22 @@ check_format_view (const char *p)
             {
                 if (strncmp (q, DEFAULT_CHARSET, 5) == 0)
                 {
-                    mcview_default_hex_mode = 0;
+                    mcview_global_flags.hex = FALSE;
                     q += 4;
                 }
                 else if (strncmp (q, "hex", 3) == 0)
                 {
-                    mcview_default_hex_mode = 1;
+                    mcview_global_flags.hex = TRUE;
                     q += 2;
                 }
                 else if (strncmp (q, "nroff", 5) == 0)
                 {
-                    mcview_default_nroff_flag = 1;
+                    mcview_global_flags.nroff = TRUE;
                     q += 4;
                 }
                 else if (strncmp (q, "unform", 6) == 0)
                 {
-                    mcview_default_nroff_flag = 0;
+                    mcview_global_flags.nroff = FALSE;
                     q += 5;
                 }
             }

+ 6 - 6
src/viewer/actions_cmd.c

@@ -105,7 +105,7 @@ mcview_search (WView * view, gboolean start_search)
     {
         if (mcview_dialog_search (view))
         {
-            if (view->hex_mode)
+            if (view->mode_flags.hex)
                 want_search_start = view->hex_cursor;
 
             mcview_do_search (view, want_search_start);
@@ -113,7 +113,7 @@ mcview_search (WView * view, gboolean start_search)
     }
     else
     {
-        if (view->hex_mode)
+        if (view->mode_flags.hex)
         {
             if (!mcview_search_options.backwards)
                 want_search_start = view->hex_cursor + 1;
@@ -459,11 +459,11 @@ mcview_execute_cmd (WView * view, long command)
         mcview_move_right (view, 1);
         break;
     case CK_LeftQuick:
-        if (!view->hex_mode)
+        if (!view->mode_flags.hex)
             mcview_move_left (view, 10);
         break;
     case CK_RightQuick:
-        if (!view->hex_mode)
+        if (!view->mode_flags.hex)
             mcview_move_right (view, 10);
         break;
     case CK_SearchContinue:
@@ -552,7 +552,7 @@ mcview_handle_key (WView * view, int key)
     key = convert_from_input_c (key);
 #endif
 
-    if (view->hex_mode)
+    if (view->mode_flags.hex)
     {
         if (view->hexedit_mode && (mcview_handle_editkey (view, key) == MSG_HANDLED))
             return MSG_HANDLED;
@@ -667,7 +667,7 @@ mcview_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *
         return MSG_HANDLED;
 
     case MSG_CURSOR:
-        if (view->hex_mode)
+        if (view->mode_flags.hex)
             mcview_place_cursor (view);
         return MSG_HANDLED;
 

+ 11 - 11
src/viewer/ascii.c

@@ -402,7 +402,7 @@ mcview_get_next_maybe_nroff_char (WView * view, mcview_state_machine_t * state,
     if (color != NULL)
         *color = VIEW_NORMAL_COLOR;
 
-    if (!view->text_nroff_mode)
+    if (!view->mode_flags.nroff)
         return mcview_get_next_char (view, state, c);
 
     if (!mcview_get_next_char (view, state, c))
@@ -583,7 +583,7 @@ mcview_display_line (WView * view, mcview_state_machine_t * state, int row,
     const screen_dimen top = view->data_area.top;
     const screen_dimen width = view->data_area.width;
     const screen_dimen height = view->data_area.height;
-    off_t dpy_text_column = view->text_wrap_mode ? 0 : view->dpy_text_column;
+    off_t dpy_text_column = view->mode_flags.wrap ? 0 : view->dpy_text_column;
     screen_dimen col = 0;
     int cs[1 + MAX_COMBINING_CHARS];
     char str[(1 + MAX_COMBINING_CHARS) * UTF8_CHAR_LEN + 1];
@@ -592,7 +592,7 @@ mcview_display_line (WView * view, mcview_state_machine_t * state, int row,
     if (paragraph_ended != NULL)
         *paragraph_ended = TRUE;
 
-    if (!view->text_wrap_mode && (row < 0 || row >= (int) height) && linewidth == NULL)
+    if (!view->mode_flags.wrap && (row < 0 || row >= (int) height) && linewidth == NULL)
     {
         /* Optimization: Fast forward to the end of the line, rather than carefully
          * parsing and then not actually displaying it. */
@@ -661,7 +661,7 @@ mcview_display_line (WView * view, mcview_state_machine_t * state, int row,
         /* In wrap mode only: We're done with this row if the character sequence wouldn't fit.
          * Except if at the first column, because then it wouldn't fit in the next row either.
          * In this extreme case let the unwrapped code below do its best to display it. */
-        if (view->text_wrap_mode && (off_t) col + charwidth > dpy_text_column + (off_t) width
+        if (view->mode_flags.wrap && (off_t) col + charwidth > dpy_text_column + (off_t) width
             && col > 0)
         {
             *state = state_saved;
@@ -730,7 +730,7 @@ mcview_display_line (WView * view, mcview_state_machine_t * state, int row,
         col += charwidth;
         state->unwrapped_column += charwidth;
 
-        if (!view->text_wrap_mode && (off_t) col >= dpy_text_column + (off_t) width
+        if (!view->mode_flags.wrap && (off_t) col >= dpy_text_column + (off_t) width
             && linewidth == NULL)
         {
             /* Optimization: Fast forward to the end of the line, rather than carefully
@@ -870,7 +870,7 @@ mcview_display_text (WView * view)
         mcview_display_clean (view);
         mcview_display_ruler (view);
 
-        if (!view->text_wrap_mode)
+        if (!view->mode_flags.wrap)
             mcview_state_machine_init (&state, view->dpy_start);
         else
         {
@@ -888,7 +888,7 @@ mcview_display_text (WView * view)
                  * scroll the file and display again. This happens when e.g. the
                  * window is made bigger, or the file becomes shorter due to
                  * charset change or enabling nroff. */
-                if ((view->text_wrap_mode ? view->dpy_state_top.offset : view->dpy_start) > 0)
+                if ((view->mode_flags.wrap ? view->dpy_state_top.offset : view->dpy_start) > 0)
                 {
                     mcview_ascii_move_up (view, height - row);
                     again = TRUE;
@@ -940,7 +940,7 @@ mcview_ascii_move_down (WView * view, off_t lines)
 
         /* Okay, there's enough data. Move by 1 row at the top, too. No need to check for
          * EOF, that can't happen. */
-        if (!view->text_wrap_mode)
+        if (!view->mode_flags.wrap)
         {
             view->dpy_start = mcview_eol (view, view->dpy_start);
             view->dpy_paragraph_skip_lines = 0;
@@ -977,7 +977,7 @@ mcview_ascii_move_down (WView * view, off_t lines)
 void
 mcview_ascii_move_up (WView * view, off_t lines)
 {
-    if (!view->text_wrap_mode)
+    if (!view->mode_flags.wrap)
     {
         while (lines-- != 0)
             view->dpy_start = mcview_bol (view, view->dpy_start - 1, 0);
@@ -1027,7 +1027,7 @@ mcview_ascii_move_up (WView * view, off_t lines)
 void
 mcview_ascii_moveto_bol (WView * view)
 {
-    if (!view->text_wrap_mode)
+    if (!view->mode_flags.wrap)
         view->dpy_text_column = 0;
 }
 
@@ -1036,7 +1036,7 @@ mcview_ascii_moveto_bol (WView * view)
 void
 mcview_ascii_moveto_eol (WView * view)
 {
-    if (!view->text_wrap_mode)
+    if (!view->mode_flags.wrap)
     {
         mcview_state_machine_t state;
         off_t linewidth;

+ 3 - 2
src/viewer/coord_cache.c

@@ -312,7 +312,7 @@ mcview_ccache_lookup (WView * view, coord_cache_entry_t * coord, enum ccache_typ
 
     if (sorter == CCACHE_OFFSET)
         cmp_func = mcview_coord_cache_entry_less_offset;
-    else if (view->text_nroff_mode)
+    else if (view->mode_flags.nroff)
         cmp_func = mcview_coord_cache_entry_less_nroff;
     else
         cmp_func = mcview_coord_cache_entry_less_plain;
@@ -342,7 +342,8 @@ mcview_ccache_lookup (WView * view, coord_cache_entry_t * coord, enum ccache_typ
 
         if (!cmp_func (&current, coord))
         {
-            if (lookup_what == CCACHE_OFFSET && view->text_nroff_mode && nroff_state != NROFF_START)
+            if (lookup_what == CCACHE_OFFSET && view->mode_flags.nroff
+                && nroff_state != NROFF_START)
             {
                 /* don't break here */
             }

+ 2 - 2
src/viewer/dialogs.c

@@ -251,12 +251,12 @@ mcview_dialog_goto (WView * view, off_t * offset)
                 if (view->growbuf_in_use)
                     mcview_growbuf_read_all_data (view);
                 *offset = addr * mcview_get_filesize (view) / 100;
-                if (!view->hex_mode)
+                if (!view->mode_flags.hex)
                     *offset = mcview_bol (view, *offset, 0);
                 break;
             case MC_VIEW_GOTO_OFFSET_DEC:
             case MC_VIEW_GOTO_OFFSET_HEX:
-                if (!view->hex_mode)
+                if (!view->mode_flags.hex)
                 {
                     if (view->growbuf_in_use)
                         mcview_growbuf_read_until (view, addr);

+ 9 - 13
src/viewer/display.c

@@ -80,11 +80,11 @@ mcview_set_buttonbar (WView * view)
 {
     WDialog *h = WIDGET (view)->owner;
     WButtonBar *b = find_buttonbar (h);
-    const global_keymap_t *keymap = view->hex_mode ? viewer_hex_map : viewer_map;
+    const global_keymap_t *keymap = view->mode_flags.hex ? viewer_hex_map : viewer_map;
 
     buttonbar_set_label (b, 1, Q_ ("ButtonBar|Help"), keymap, WIDGET (view));
 
-    if (view->hex_mode)
+    if (view->mode_flags.hex)
     {
         if (view->hexedit_mode)
             buttonbar_set_label (b, 2, Q_ ("ButtonBar|View"), keymap, WIDGET (view));
@@ -100,7 +100,7 @@ mcview_set_buttonbar (WView * view)
     }
     else
     {
-        buttonbar_set_label (b, 2, view->text_wrap_mode ? Q_ ("ButtonBar|UnWrap")
+        buttonbar_set_label (b, 2, view->mode_flags.wrap ? Q_ ("ButtonBar|UnWrap")
                              : Q_ ("ButtonBar|Wrap"), keymap, WIDGET (view));
         buttonbar_set_label (b, 4, Q_ ("ButtonBar|Hex"), keymap, WIDGET (view));
         buttonbar_set_label (b, 6, "", keymap, WIDGET (view));
@@ -108,13 +108,13 @@ mcview_set_buttonbar (WView * view)
     }
 
     buttonbar_set_label (b, 5, Q_ ("ButtonBar|Goto"), keymap, WIDGET (view));
-    buttonbar_set_label (b, 8, view->magic_mode ? Q_ ("ButtonBar|Raw")
+    buttonbar_set_label (b, 8, view->mode_flags.magic ? Q_ ("ButtonBar|Raw")
                          : Q_ ("ButtonBar|Parse"), keymap, WIDGET (view));
 
     if (!mcview_is_in_panel (view))     /* don't override some panel buttonbar keys  */
     {
         buttonbar_set_label (b, 3, Q_ ("ButtonBar|Quit"), keymap, WIDGET (view));
-        buttonbar_set_label (b, 9, view->text_nroff_mode ? Q_ ("ButtonBar|Unform")
+        buttonbar_set_label (b, 9, view->mode_flags.nroff ? Q_ ("ButtonBar|Unform")
                              : Q_ ("ButtonBar|Format"), keymap, WIDGET (view));
         buttonbar_set_label (b, 10, Q_ ("ButtonBar|Quit"), keymap, WIDGET (view));
     }
@@ -165,7 +165,7 @@ mcview_display_status (WView * view)
     if (width > 40)
     {
         widget_move (view, top, width - 32);
-        if (view->hex_mode)
+        if (view->mode_flags.hex)
             tty_printf ("0x%08" PRIxMAX, (uintmax_t) view->hex_cursor);
         else
         {
@@ -188,7 +188,7 @@ mcview_display_status (WView * view)
     else
         tty_print_string (str_fit_to_term (file_label, width - 5, J_LEFT_FIT));
     if (width > 26)
-        mcview_display_percent (view, view->hex_mode ? view->hex_cursor : view->dpy_end);
+        mcview_display_percent (view, view->mode_flags.hex ? view->hex_cursor : view->dpy_end);
 }
 
 /* --------------------------------------------------------------------------------------------- */
@@ -244,14 +244,10 @@ mcview_update (WView * view)
 void
 mcview_display (WView * view)
 {
-    if (view->hex_mode)
-    {
+    if (view->mode_flags.hex)
         mcview_display_hex (view);
-    }
     else
-    {
         mcview_display_text (view);
-    }
     mcview_display_status (view);
 }
 
@@ -285,7 +281,7 @@ mcview_compute_areas (WView * view)
     view->status_area.height = height;
     rest -= height;
 
-    height = (ruler == RULER_NONE || view->hex_mode) ? 0 : 2;
+    height = (ruler == RULER_NONE || view->mode_flags.hex) ? 0 : 2;
     height = MIN (rest, height);
     view->ruler_area.height = height;
     rest -= height;

+ 12 - 19
src/viewer/internal.h

@@ -134,13 +134,13 @@ struct WView
                                    growing buffer */
     gboolean growbuf_finished;  /* TRUE when all data has been read. */
 
-    /* Editor modes */
-    gboolean hex_mode;          /* Hexview or Hexedit */
-    gboolean hexedit_mode;      /* Hexedit */
+    mcview_mode_flags_t mode_flags;
+
+    /* Hex editor modes */
+    gboolean hexedit_mode;      /* Hexview or Hexedit */
     gboolean hexview_in_text;   /* Is the hexview cursor in the text area? */
-    gboolean text_nroff_mode;   /* Nroff-style highlighting */
-    gboolean text_wrap_mode;    /* Wrap text lines to fit them on the screen */
-    gboolean magic_mode;        /* Preprocess the file using external programs */
+    int bytes_per_line;         /* Number of bytes per line in hex mode */
+    off_t hex_cursor;           /* Hexview cursor position in file */
     gboolean hexedit_lownibble; /* Are we editing the last significant nibble? */
     gboolean locked;            /* We hold lock on current file */
 
@@ -160,7 +160,6 @@ struct WView
     gboolean dpy_wrap_dirty;    /* dpy_state_top needs to be recomputed */
     off_t dpy_text_column;      /* Number of skipped columns in non-wrap
                                  * text mode */
-    off_t hex_cursor;           /* Hexview cursor position in file */
     screen_dimen cursor_col;    /* Cursor column */
     screen_dimen cursor_row;    /* Cursor row */
     struct hexedit_change_node *change_list;    /* Linked list of changes */
@@ -173,31 +172,25 @@ struct WView
     int dirty;                  /* Number of skipped updates */
     gboolean dpy_bbar_dirty;    /* Does the button bar need to be updated? */
 
-    /* Mode variables */
-    int bytes_per_line;         /* Number of bytes per line in hex mode */
 
-    /* Search variables */
+    /* handle of search engine */
+    mc_search_t *search;
+    gchar *last_search_string;
+    struct mcview_nroff_struct *search_nroff_seq;
     off_t search_start;         /* First character to start searching from */
     off_t search_end;           /* Length of found string or 0 if none was found */
+    int search_numNeedSkipChar;
 
     /* Markers */
     int marker;                 /* mark to use */
     off_t marks[10];            /* 10 marks: 0..9 */
 
-    off_t update_steps;         /* The number of bytes between percent
-                                 * increments */
+    off_t update_steps;         /* The number of bytes between percent increments */
     off_t update_activate;      /* Last point where we updated the status */
 
     /* converter for translation of text */
     GIConv converter;
 
-    /* handle of search engine */
-    mc_search_t *search;
-    gchar *last_search_string;
-    struct mcview_nroff_struct *search_nroff_seq;
-
-    int search_numNeedSkipChar;
-
     GArray *saved_bookmarks;
 
     dir_list *dir;              /* List of current directory files

Some files were not shown because too many files changed in this diff