Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset e5d4294 in mainline


Ignore:
Timestamp:
2009-09-16T21:31:46Z (11 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
57688fe2
Parents:
8c73012 (diff), 743e17b (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge editor improvements from ~jsvoboda/helenos/edit.

Location:
uspace/app/edit
Files:
2 edited

Legend:

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

    r8c73012 re5d4294  
    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
     
    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                }
     
    402407static void pane_row_range_display(int r0, int r1)
    403408{
    404         int width;
    405409        int i, j, fill;
    406410        spt_t rb, re, dep;
     
    415419        console_goto(con, 0, 0);
    416420        for (i = r0; i < r1; ++i) {
    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;
     421                /* Starting point for row display */
     422                rbc.row = pane.sh_row + i;
     423                rbc.column = pane.sh_column;
    421424                sheet_get_cell_pt(&doc.sh, &rbc, dir_before, &rb);
    422425
    423                 /* Determine row ending point. */
    424                 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;
    425429                sheet_get_cell_pt(&doc.sh, &rec, dir_before, &re);
    426430
     
    494498
    495499        spt_get_coord(&caret_pt, &coord);
    496         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);
    497502}
    498503
     
    511516
    512517        (void) sheet_insert(&doc.sh, &pt, dir_before, cbuf);
     518
     519        pane.rflags |= REDRAW_ROW;
     520        if (c == '\n')
     521                pane.rflags |= REDRAW_TEXT;
    513522}
    514523
     
    526535
    527536        (void) sheet_delete(&doc.sh, &sp, &ep);
     537
     538        pane.rflags |= REDRAW_ROW;
     539        if (coord.column < 1)
     540                pane.rflags |= REDRAW_TEXT;
    528541}
    529542
     
    532545{
    533546        spt_t sp, ep;
    534         coord_t coord;
     547        coord_t sc, ec;
    535548
    536549        tag_get_pt(&pane.caret_pos, &sp);
    537         spt_get_coord(&sp, &coord);
    538 
    539         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);
    540554
    541555        (void) sheet_delete(&doc.sh, &sp, &ep);
     556
     557        pane.rflags |= REDRAW_ROW;
     558        if (ec.row != sc.row)
     559                pane.rflags |= REDRAW_TEXT;
    542560}
    543561
     
    555573        spt_get_coord(&pt, &coord);
    556574
    557         /* Scroll pane as necessary. */
     575        /* Scroll pane vertically. */
    558576
    559577        if (coord.row < pane.sh_row) {
     
    561579                pane.rflags |= REDRAW_TEXT;
    562580        }
     581
    563582        if (coord.row > pane.sh_row + pane.rows - 1) {
    564583                pane.sh_row = coord.row - pane.rows + 1;
     
    566585        }
    567586
     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
    568599        pane.rflags |= (REDRAW_CARET | REDRAW_STATUS);
    569 
    570600}
    571601
     
    582612        coord_t coord;
    583613        int num_rows;
     614        bool pure_vertical;
    584615
    585616        tag_get_pt(&pane.caret_pos, &pt);
     
    594625                if (coord.row > num_rows) coord.row = num_rows;
    595626        }
     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;
    596632
    597633        /*
     
    603639        sheet_place_tag(&doc.sh, &pt, &pane.caret_pos);
    604640
     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
    605647        caret_update();
    606648}
  • uspace/app/edit/sheet.c

    r8c73012 re5d4294  
    5454#include <adt/list.h>
    5555#include <align.h>
     56#include <macros.h>
    5657
    5758#include "sheet.h"
    5859
    5960enum {
    60         TAB_WIDTH = 8
     61        TAB_WIDTH       = 8,
     62
     63        /** Initial  of dat buffer in bytes */
     64        INITIAL_SIZE    = 32
    6165};
    6266
     
    6468int sheet_init(sheet_t *sh)
    6569{
    66         sh->dbuf_size = 65536;
     70        sh->dbuf_size = INITIAL_SIZE;
    6771        sh->text_size = 0;
    6872
     
    9599        link_t *link;
    96100        tag_t *tag;
     101        char *newp;
    97102
    98103        sz = str_size(str);
    99         if (sh->text_size + sz > sh->dbuf_size)
    100                 return ELIMIT;
     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        }
    101113
    102114        ipp = sh->data + pos->b_off;
    103115
     116        /* Copy data. */
    104117        memmove(ipp + sz, ipp, sh->text_size - pos->b_off);
    105118        memcpy(ipp, str, sz);
    106119        sh->text_size += sz;
    107120
    108         /* Adjust tags */
     121        /* Adjust tags. */
    109122
    110123        link = sh->tags_head.next;
     
    139152        link_t *link;
    140153        tag_t *tag;
     154        char *newp;
     155        size_t shrink_size;
    141156
    142157        spp = sh->data + spos->b_off;
     
    146161        sh->text_size -= sz;
    147162
    148         /* Adjust tags */
     163        /* Adjust tags. */
    149164        link = sh->tags_head.next;
    150165        while (link != &sh->tags_head) {
     
    158173                link = link->next;
    159174        }
    160        
     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
    161190        return EOK;
    162191}
Note: See TracChangeset for help on using the changeset viewer.