Changes in uspace/app/edit/edit.c [3052ff4:743e17b] in mainline


Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/edit/edit.c

    r3052ff4 r743e17b  
    7272        /** Current position of the caret */
    7373        tag_t caret_pos;
     74
     75        /**
     76         * Ideal column where the caret should try to get. This is used
     77         * for maintaining the same column during vertical movement.
     78         */
     79        int ideal_column;
    7480} pane_t;
    7581
     
    8894static pane_t pane;
    8995
    90 static ipcarg_t scr_rows, scr_columns;
     96static int scr_rows, scr_columns;
    9197
    9298#define ROW_BUF_SIZE 4096
     
    130136
    131137        pane.rows = scr_rows - 1;
     138        pane.columns = scr_columns;
    132139        pane.sh_row = 1;
     140        pane.sh_column = 1;
    133141
    134142        /* Start with an empty sheet. */
     
    139147        sheet_get_cell_pt(&doc.sh, &coord, dir_before, &pt);
    140148        sheet_place_tag(&doc.sh, &pt, &pane.caret_pos);
     149        pane.ideal_column = coord.column;
    141150
    142151        if (argc == 2) {
     
    206215        case KC_ENTER:
    207216                insert_char('\n');
    208                 pane.rflags |= REDRAW_TEXT;
    209217                caret_update();
    210218                break;
     
    235243        case KC_BACKSPACE:
    236244                delete_char_before();
    237                 pane.rflags |= REDRAW_TEXT;
    238245                caret_update();
    239246                break;
    240247        case KC_DELETE:
    241248                delete_char_after();
    242                 pane.rflags |= REDRAW_TEXT;
    243249                caret_update();
    244250                break;
     
    246252                if (ev->c >= 32 || ev->c == '\t') {
    247253                        insert_char(ev->c);
    248                         pane.rflags |= REDRAW_ROW;
    249254                        caret_update();
    250255                }
     
    362367{
    363368        int sh_rows, rows;
    364         int i;
    365         unsigned j;
     369        int i, j;
    366370
    367371        sheet_get_num_rows(&doc.sh, &sh_rows);
     
    403407static void pane_row_range_display(int r0, int r1)
    404408{
    405         int width;
    406409        int i, j, fill;
    407410        spt_t rb, re, dep;
     
    416419        console_goto(con, 0, 0);
    417420        for (i = r0; i < r1; ++i) {
    418                 sheet_get_row_width(&doc.sh, pane.sh_row + i, &width);
    419 
    420                 /* Determine row starting point. */
    421                 rbc.row = pane.sh_row + i; rbc.column = 1;
     421                /* Starting point for row display */
     422                rbc.row = pane.sh_row + i;
     423                rbc.column = pane.sh_column;
    422424                sheet_get_cell_pt(&doc.sh, &rbc, dir_before, &rb);
    423425
    424                 /* Determine row ending point. */
    425                 rec.row = pane.sh_row + i; rec.column = width + 1;
     426                /* Ending point for row display */
     427                rec.row = pane.sh_row + i;
     428                rec.column = pane.sh_column + pane.columns;
    426429                sheet_get_cell_pt(&doc.sh, &rec, dir_before, &re);
    427430
     
    452455                /* Fill until the end of display area. */
    453456
    454                 if (str_length(row_buf) < scr_columns)
     457                if (str_length(row_buf) < (unsigned) scr_columns)
    455458                        fill = scr_columns - str_length(row_buf);
    456459                else
     
    495498
    496499        spt_get_coord(&caret_pt, &coord);
    497         console_goto(con, coord.column - 1, coord.row - pane.sh_row);
     500        console_goto(con, coord.column - pane.sh_column,
     501            coord.row - pane.sh_row);
    498502}
    499503
     
    512516
    513517        (void) sheet_insert(&doc.sh, &pt, dir_before, cbuf);
     518
     519        pane.rflags |= REDRAW_ROW;
     520        if (c == '\n')
     521                pane.rflags |= REDRAW_TEXT;
    514522}
    515523
     
    527535
    528536        (void) sheet_delete(&doc.sh, &sp, &ep);
     537
     538        pane.rflags |= REDRAW_ROW;
     539        if (coord.column < 1)
     540                pane.rflags |= REDRAW_TEXT;
    529541}
    530542
     
    533545{
    534546        spt_t sp, ep;
    535         coord_t coord;
     547        coord_t sc, ec;
    536548
    537549        tag_get_pt(&pane.caret_pos, &sp);
    538         spt_get_coord(&sp, &coord);
    539 
    540         sheet_get_cell_pt(&doc.sh, &coord, dir_after, &ep);
     550        spt_get_coord(&sp, &sc);
     551
     552        sheet_get_cell_pt(&doc.sh, &sc, dir_after, &ep);
     553        spt_get_coord(&ep, &ec);
    541554
    542555        (void) sheet_delete(&doc.sh, &sp, &ep);
     556
     557        pane.rflags |= REDRAW_ROW;
     558        if (ec.row != sc.row)
     559                pane.rflags |= REDRAW_TEXT;
    543560}
    544561
     
    556573        spt_get_coord(&pt, &coord);
    557574
    558         /* Scroll pane as necessary. */
     575        /* Scroll pane vertically. */
    559576
    560577        if (coord.row < pane.sh_row) {
     
    562579                pane.rflags |= REDRAW_TEXT;
    563580        }
     581
    564582        if (coord.row > pane.sh_row + pane.rows - 1) {
    565583                pane.sh_row = coord.row - pane.rows + 1;
     
    567585        }
    568586
     587        /* Scroll pane horizontally. */
     588
     589        if (coord.column < pane.sh_column) {
     590                pane.sh_column = coord.column;
     591                pane.rflags |= REDRAW_TEXT;
     592        }
     593
     594        if (coord.column > pane.sh_column + pane.columns - 1) {
     595                pane.sh_column = coord.column - pane.columns + 1;
     596                pane.rflags |= REDRAW_TEXT;
     597        }
     598
    569599        pane.rflags |= (REDRAW_CARET | REDRAW_STATUS);
    570 
    571600}
    572601
     
    583612        coord_t coord;
    584613        int num_rows;
     614        bool pure_vertical;
    585615
    586616        tag_get_pt(&pane.caret_pos, &pt);
     
    595625                if (coord.row > num_rows) coord.row = num_rows;
    596626        }
     627
     628        /* For purely vertical movement try attaining @c ideal_column. */
     629        pure_vertical = (dcolumn == 0 && align_dir == dir_before);
     630        if (pure_vertical)
     631                coord.column = pane.ideal_column;
    597632
    598633        /*
     
    604639        sheet_place_tag(&doc.sh, &pt, &pane.caret_pos);
    605640
     641        /* For non-vertical movement set the new value for @c ideal_column. */
     642        if (!pure_vertical) {
     643                spt_get_coord(&pt, &coord);
     644                pane.ideal_column = coord.column;
     645        }
     646
    606647        caret_update();
    607648}
Note: See TracChangeset for help on using the changeset viewer.