Ticket #2371: mc-movement_position.patch

File mc-movement_position.patch, 8.9 KB (added by gotar, 8 years ago)
  • src/viewer/display.c

    diff -urp mc-4.7.5.4/src/viewer/display.c mc-4.7.5.4.new/src/viewer/display.c
    old new mcview_display_status (mcview_t * view) 
    135135    const screen_dimen height = view->status_area.height; 
    136136    const char *file_label; 
    137137    screen_dimen file_label_width; 
     138    screen_dimen extra_space = 0; 
    138139 
    139140    if (height < 1) 
    140141        return; 
    mcview_display_status (mcview_t * view) 
    148149    if (width > 40) 
    149150    { 
    150151        char buffer[BUF_TINY]; 
    151         widget_move (view, top, width - 32); 
    152152        if (view->hex_mode) 
     153        { 
     154            widget_move (view, top, width - 32); 
    153155            tty_printf ("0x%08" PRIxMAX, (uintmax_t) view->hex_cursor); 
     156        } 
    154157        else 
    155158        { 
    156159            size_trunc_len (buffer, 5, mcview_get_filesize (view), 0, panels_options.kilobyte_si); 
     160            if (width - file_label_width - 32 > 6) 
     161            { 
     162                extra_space = width-file_label_width-32-4; 
     163                widget_move (view, top, width - 32 - extra_space); 
     164                tty_printf ("C:%ld L:", (ulong) view->dpy_text_column); 
     165                if (view->dpy_lines_status == -1) 
     166                    tty_print_string("EOF"); 
     167                tty_printf ("%ld+%ld=%ld /%ld", (long) view->dpy_start_line, (ulong) view->dpy_visible_lines, (long) (view->dpy_start_line+view->dpy_visible_lines), view->dpy_lines_total); 
     168                if (view->dpy_lines_status != 1) 
     169                    tty_print_string("+"); 
     170            } 
     171            widget_move (view, top, width - 32); 
    157172            tty_printf ("%9" PRIuMAX "/%s%s %s", (uintmax_t) view->dpy_end, 
    158173                        buffer, mcview_may_still_grow (view) ? "+" : " ", 
    159174#ifdef HAVE_CHARSET 
    mcview_display_status (mcview_t * view) 
    166181    } 
    167182    widget_move (view, top, left); 
    168183    if (width > 40) 
    169         tty_print_string (str_fit_to_term (file_label, width - 34, J_LEFT_FIT)); 
     184        tty_print_string (str_fit_to_term (file_label, width - 34 - extra_space, J_LEFT_FIT)); 
    170185    else 
    171186        tty_print_string (str_fit_to_term (file_label, width - 5, J_LEFT_FIT)); 
    172187    if (width > 26) 
  • src/viewer/internal.h

    diff -urp mc-4.7.5.4/src/viewer/internal.h mc-4.7.5.4.new/src/viewer/internal.h
    old new typedef struct mcview_struct 
    138138    screen_dimen dpy_frame_size;        /* Size of the frame surrounding the real viewer */ 
    139139    off_t dpy_start;            /* Offset of the displayed data */ 
    140140    off_t dpy_end;              /* Offset after the displayed data */ 
     141    off_t dpy_start_line;       /* Line number of beginning of the displayed data */ 
     142    off_t dpy_visible_lines;    /* Number of lines of the displayed data */ 
     143    off_t dpy_lines_total;      /* Number of lines of entire file */ 
     144    int dpy_lines_status;       /* 0: total count unknown 
     145                                  -1: counting back from EOF 
     146                                   1: counting complete */ 
    141147    off_t dpy_text_column;      /* Number of skipped columns in non-wrap 
    142148                                 * text mode */ 
    143149    off_t hex_cursor;           /* Hexview cursor position in file */ 
  • src/viewer/lib.c

    diff -urp mc-4.7.5.4/src/viewer/lib.c mc-4.7.5.4.new/src/viewer/lib.c
    old new mcview_init (mcview_t * view) 
    202202    view->dpy_start = 0; 
    203203    view->dpy_text_column = 0; 
    204204    view->dpy_end = 0; 
     205    view->dpy_start_line = 0; 
     206    view->dpy_visible_lines = 0; 
     207    view->dpy_lines_total = 0; 
     208    view->dpy_lines_status = 0; 
    205209    view->hex_cursor = 0; 
    206210    view->cursor_col = 0; 
    207211    view->cursor_row = 0; 
  • src/viewer/mcviewer.c

    diff -urp mc-4.7.5.4/src/viewer/mcviewer.c mc-4.7.5.4.new/src/viewer/mcviewer.c
    old new mcview_load (mcview_t * view, const char 
    390390  finish: 
    391391    view->command = g_strdup (command); 
    392392    view->dpy_start = 0; 
     393    view->dpy_start_line = 0; 
     394    view->dpy_visible_lines = 0; 
     395    view->dpy_lines_total = 0; 
     396    view->dpy_lines_status = 0; 
    393397    view->search_start = 0; 
    394398    view->search_end = 0; 
    395399    view->dpy_text_column = 0; 
  • src/viewer/move.c

    diff -urp mc-4.7.5.4/src/viewer/move.c mc-4.7.5.4.new/src/viewer/move.c
    old new mcview_move_up (mcview_t * view, off_t l 
    128128                         * and move down all but the last rows */ 
    129129                        new_offset = view->dpy_start - (off_t) last_row_length; 
    130130                    } 
     131                    view->dpy_start_line--; 
    131132                } 
    132133                else 
    133134                { 
    mcview_move_up (mcview_t * view, off_t l 
    143144                /* if unwrapped -> current BOL equals dpy_start, just find BOL of previous line */ 
    144145                new_offset = view->dpy_start - 1; 
    145146                view->dpy_start = mcview_bol (view, new_offset, 0); 
     147                view->dpy_start_line--; 
    146148            } 
    147149        } 
    148150    } 
    mcview_move_down (mcview_t * view, off_t 
    193195                else 
    194196                    new_offset = mcview_eol (view, view->dpy_start, last_byte); 
    195197                if (new_offset < last_byte) 
     198                { 
    196199                    view->dpy_start = new_offset; 
     200                    if(new_offset == mcview_bol (view, new_offset, new_offset - (off_t) 1)) 
     201                        view->dpy_start_line++; 
     202                } 
    197203                if (view->dpy_end >= last_byte) 
    198204                    break; 
    199205            } 
    mcview_move_down (mcview_t * view, off_t 
    210216                else 
    211217                    new_offset = mcview_eol (view, view->dpy_start, last_byte); 
    212218                if (new_offset < last_byte) 
     219                { 
    213220                    view->dpy_start = new_offset; 
     221                    if(new_offset == mcview_bol (view, new_offset, new_offset - (off_t) 1)) 
     222                        view->dpy_start_line++; 
     223                } 
    214224            } 
    215225        } 
    216226    } 
    void 
    298308mcview_moveto_top (mcview_t * view) 
    299309{ 
    300310    view->dpy_start = 0; 
     311    view->dpy_start_line = 0; 
    301312    view->hex_cursor = 0; 
    302313    view->dpy_text_column = 0; 
    303314    mcview_movement_fixups (view, TRUE); 
     315    if (view->dpy_lines_status == -1) 
     316        view->dpy_lines_status = 0; 
    304317} 
    305318 
    306319/* --------------------------------------------------------------------------------------------- */ 
    mcview_moveto_bottom (mcview_t * view) 
    327340        const off_t datalines = view->data_area.height; 
    328341 
    329342        view->dpy_start = filesize; 
     343        if (view->dpy_lines_status == 0) 
     344            view->dpy_lines_status = -1; 
     345        if (view->dpy_lines_status != 1) 
     346            view->dpy_start_line = 0; 
     347        else 
     348            view->dpy_start_line=view->dpy_lines_total; 
    330349        mcview_move_up (view, datalines); 
    331350    } 
    332351} 
  • src/viewer/plain.c

    diff -urp mc-4.7.5.4/src/viewer/plain.c mc-4.7.5.4.new/src/viewer/plain.c
    old new mcview_display_text (mcview_t * view) 
    8484 
    8585    /* Find the first displayable changed byte */ 
    8686    from = view->dpy_start; 
     87    view->dpy_visible_lines = 0; 
    8788    while ((curr != NULL) && (curr->offset < from)) 
    8889        curr = curr->next; 
    8990 
    mcview_display_text (mcview_t * view) 
    101102 
    102103            c = mcview_get_utf (view, from, &cw, &read_res); 
    103104            if (!read_res) 
     105            { 
     106                if (view->dpy_lines_status == 0) 
     107                    view->dpy_lines_status = 1; 
    104108                break; 
     109            } 
    105110        } 
    106111        else 
    107112#endif 
    108113        if (!mcview_get_byte (view, from, &c)) 
     114            { 
     115            if (view->dpy_lines_status == 0) 
     116                view->dpy_lines_status = 1; 
    109117            break; 
     118        } 
    110119 
    111120        last_row = FALSE; 
    112121        from++; 
    mcview_display_text (mcview_t * view) 
    130139        { 
    131140            col = 0; 
    132141            row++; 
     142            view->dpy_visible_lines++; 
    133143            continue; 
    134144        } 
    135145 
    mcview_display_text (mcview_t * view) 
    193203#endif 
    194204    } 
    195205 
     206    if (view->dpy_lines_status >= 0 && view->dpy_start_line+view->dpy_visible_lines>view->dpy_lines_total) 
     207        view->dpy_lines_total = view->dpy_start_line+view->dpy_visible_lines; 
     208    else if (view->dpy_lines_total<-view->dpy_start_line) 
     209        view->dpy_lines_total = -view->dpy_start_line; 
     210    if (view->dpy_start == 0 && view->dpy_lines_status == -1) 
     211    { 
     212        view->dpy_start_line = 0; 
     213        view->dpy_lines_status = 1; 
     214    } 
    196215    view->dpy_end = from; 
    197216    if (mcview_show_eof != NULL && mcview_show_eof[0] != '\0') 
    198217    {