Changes in / [e5d4294:8c73012] in mainline


Ignore:
Location:
uspace/app/edit
Files:
2 edited

Legend:

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

    re5d4294 r8c73012  
    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;
    8074} pane_t;
    8175
     
    136130
    137131        pane.rows = scr_rows - 1;
    138         pane.columns = scr_columns;
    139132        pane.sh_row = 1;
    140         pane.sh_column = 1;
    141133
    142134        /* Start with an empty sheet. */
     
    147139        sheet_get_cell_pt(&doc.sh, &coord, dir_before, &pt);
    148140        sheet_place_tag(&doc.sh, &pt, &pane.caret_pos);
    149         pane.ideal_column = coord.column;
    150141
    151142        if (argc == 2) {
     
    215206        case KC_ENTER:
    216207                insert_char('\n');
     208                pane.rflags |= REDRAW_TEXT;
    217209                caret_update();
    218210                break;
     
    243235        case KC_BACKSPACE:
    244236                delete_char_before();
     237                pane.rflags |= REDRAW_TEXT;
    245238                caret_update();
    246239                break;
    247240        case KC_DELETE:
    248241                delete_char_after();
     242                pane.rflags |= REDRAW_TEXT;
    249243                caret_update();
    250244                break;
     
    252246                if (ev->c >= 32 || ev->c == '\t') {
    253247                        insert_char(ev->c);
     248                        pane.rflags |= REDRAW_ROW;
    254249                        caret_update();
    255250                }
     
    407402static void pane_row_range_display(int r0, int r1)
    408403{
     404        int width;
    409405        int i, j, fill;
    410406        spt_t rb, re, dep;
     
    419415        console_goto(con, 0, 0);
    420416        for (i = r0; i < r1; ++i) {
    421                 /* Starting point for row display */
    422                 rbc.row = pane.sh_row + i;
    423                 rbc.column = pane.sh_column;
     417                sheet_get_row_width(&doc.sh, pane.sh_row + i, &width);
     418
     419                /* Determine row starting point. */
     420                rbc.row = pane.sh_row + i; rbc.column = 1;
    424421                sheet_get_cell_pt(&doc.sh, &rbc, dir_before, &rb);
    425422
    426                 /* Ending point for row display */
    427                 rec.row = pane.sh_row + i;
    428                 rec.column = pane.sh_column + pane.columns;
     423                /* Determine row ending point. */
     424                rec.row = pane.sh_row + i; rec.column = width + 1;
    429425                sheet_get_cell_pt(&doc.sh, &rec, dir_before, &re);
    430426
     
    498494
    499495        spt_get_coord(&caret_pt, &coord);
    500         console_goto(con, coord.column - pane.sh_column,
    501             coord.row - pane.sh_row);
     496        console_goto(con, coord.column - 1, coord.row - pane.sh_row);
    502497}
    503498
     
    516511
    517512        (void) sheet_insert(&doc.sh, &pt, dir_before, cbuf);
    518 
    519         pane.rflags |= REDRAW_ROW;
    520         if (c == '\n')
    521                 pane.rflags |= REDRAW_TEXT;
    522513}
    523514
     
    535526
    536527        (void) sheet_delete(&doc.sh, &sp, &ep);
    537 
    538         pane.rflags |= REDRAW_ROW;
    539         if (coord.column < 1)
    540                 pane.rflags |= REDRAW_TEXT;
    541528}
    542529
     
    545532{
    546533        spt_t sp, ep;
    547         coord_t sc, ec;
     534        coord_t coord;
    548535
    549536        tag_get_pt(&pane.caret_pos, &sp);
    550         spt_get_coord(&sp, &sc);
    551 
    552         sheet_get_cell_pt(&doc.sh, &sc, dir_after, &ep);
    553         spt_get_coord(&ep, &ec);
     537        spt_get_coord(&sp, &coord);
     538
     539        sheet_get_cell_pt(&doc.sh, &coord, dir_after, &ep);
    554540
    555541        (void) sheet_delete(&doc.sh, &sp, &ep);
    556 
    557         pane.rflags |= REDRAW_ROW;
    558         if (ec.row != sc.row)
    559                 pane.rflags |= REDRAW_TEXT;
    560542}
    561543
     
    573555        spt_get_coord(&pt, &coord);
    574556
    575         /* Scroll pane vertically. */
     557        /* Scroll pane as necessary. */
    576558
    577559        if (coord.row < pane.sh_row) {
     
    579561                pane.rflags |= REDRAW_TEXT;
    580562        }
    581 
    582563        if (coord.row > pane.sh_row + pane.rows - 1) {
    583564                pane.sh_row = coord.row - pane.rows + 1;
     
    585566        }
    586567
    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 
    599568        pane.rflags |= (REDRAW_CARET | REDRAW_STATUS);
     569
    600570}
    601571
     
    612582        coord_t coord;
    613583        int num_rows;
    614         bool pure_vertical;
    615584
    616585        tag_get_pt(&pane.caret_pos, &pt);
     
    625594                if (coord.row > num_rows) coord.row = num_rows;
    626595        }
    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;
    632596
    633597        /*
     
    639603        sheet_place_tag(&doc.sh, &pt, &pane.caret_pos);
    640604
    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 
    647605        caret_update();
    648606}
  • uspace/app/edit/sheet.c

    re5d4294 r8c73012  
    5454#include <adt/list.h>
    5555#include <align.h>
    56 #include <macros.h>
    5756
    5857#include "sheet.h"
    5958
    6059enum {
    61         TAB_WIDTH       = 8,
    62 
    63         /** Initial  of dat buffer in bytes */
    64         INITIAL_SIZE    = 32
     60        TAB_WIDTH = 8
    6561};
    6662
     
    6864int sheet_init(sheet_t *sh)
    6965{
    70         sh->dbuf_size = INITIAL_SIZE;
     66        sh->dbuf_size = 65536;
    7167        sh->text_size = 0;
    7268
     
    9995        link_t *link;
    10096        tag_t *tag;
    101         char *newp;
    10297
    10398        sz = str_size(str);
    104         if (sh->text_size + sz > sh->dbuf_size) {
    105                 /* Enlarge data buffer. */
    106                 newp = realloc(sh->data, sh->dbuf_size * 2);
    107                 if (newp == NULL)
    108                         return ELIMIT;
    109 
    110                 sh->data = newp;
    111                 sh->dbuf_size = sh->dbuf_size * 2;
    112         }
     99        if (sh->text_size + sz > sh->dbuf_size)
     100                return ELIMIT;
    113101
    114102        ipp = sh->data + pos->b_off;
    115103
    116         /* Copy data. */
    117104        memmove(ipp + sz, ipp, sh->text_size - pos->b_off);
    118105        memcpy(ipp, str, sz);
    119106        sh->text_size += sz;
    120107
    121         /* Adjust tags. */
     108        /* Adjust tags */
    122109
    123110        link = sh->tags_head.next;
     
    152139        link_t *link;
    153140        tag_t *tag;
    154         char *newp;
    155         size_t shrink_size;
    156141
    157142        spp = sh->data + spos->b_off;
     
    161146        sh->text_size -= sz;
    162147
    163         /* Adjust tags. */
     148        /* Adjust tags */
    164149        link = sh->tags_head.next;
    165150        while (link != &sh->tags_head) {
     
    173158                link = link->next;
    174159        }
    175 
    176         /* See if we should free up some memory. */
    177         shrink_size = max(sh->dbuf_size / 4, INITIAL_SIZE);
    178         if (sh->text_size <= shrink_size && sh->dbuf_size > INITIAL_SIZE) {
    179                 /* Shrink data buffer. */
    180                 newp = realloc(sh->data, shrink_size);
    181                 if (newp == NULL) {
    182                         /* Failed to shrink buffer... no matter. */
    183                         return EOK;
    184                 }
    185 
    186                 sh->data = newp;
    187                 sh->dbuf_size = shrink_size;
    188         }
    189 
     160       
    190161        return EOK;
    191162}
Note: See TracChangeset for help on using the changeset viewer.