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

Changeset dc5aa568 in mainline


Ignore:
Timestamp:
2012-08-16T15:18:44Z (9 years ago)
Author:
Vojtech Horky <vojtechhorky@…>
Branches:
lfn, master
Children:
ebbc8a74
Parents:
80d8885 (diff), 13c4fe0 (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 mainline changes

Location:
uspace
Files:
1 added
6 edited

Legend:

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

    r80d8885 rdc5aa568  
    9191typedef struct {
    9292        char *file_name;
    93         sheet_t sh;
     93        sheet_t *sh;
    9494} doc_t;
    9595
     
    175175        coord_t coord;
    176176        bool new_file;
     177        int rc;
    177178
    178179        spt_t pt;
     
    189190
    190191        /* Start with an empty sheet. */
    191         sheet_init(&doc.sh);
     192        rc = sheet_create(&doc.sh);
     193        if (rc != EOK) {
     194                printf("Out of memory.\n");
     195                return -1;
     196        }
    192197
    193198        /* Place caret at the beginning of file. */
    194199        coord.row = coord.column = 1;
    195         sheet_get_cell_pt(&doc.sh, &coord, dir_before, &pt);
    196         sheet_place_tag(&doc.sh, &pt, &pane.caret_pos);
     200        sheet_get_cell_pt(doc.sh, &coord, dir_before, &pt);
     201        sheet_place_tag(doc.sh, &pt, &pane.caret_pos);
    197202        pane.ideal_column = coord.column;
    198203
     
    216221        /* Place selection start tag. */
    217222        tag_get_pt(&pane.caret_pos, &pt);
    218         sheet_place_tag(&doc.sh, &pt, &pane.sel_start);
     223        sheet_place_tag(doc.sh, &pt, &pane.sel_start);
    219224
    220225        /* Initial display */
     
    447452        if (select == false) {
    448453                /* Move sel_start to the same point as caret. */
    449                 sheet_remove_tag(&doc.sh, &pane.sel_start);
     454                sheet_remove_tag(doc.sh, &pane.sel_start);
    450455                tag_get_pt(&pane.caret_pos, &pt);
    451                 sheet_place_tag(&doc.sh, &pt, &pane.sel_start);
     456                sheet_place_tag(doc.sh, &pt, &pane.sel_start);
    452457        }
    453458
     
    670675
    671676        do {
    672                 sheet_copy_out(&doc.sh, &sp, epos, buf, BUF_SIZE, &bep);
     677                sheet_copy_out(doc.sh, &sp, epos, buf, BUF_SIZE, &bep);
    673678                bytes = str_size(buf);
    674679
     
    705710
    706711        while (true) {
    707                 sheet_copy_out(&doc.sh, &sp, epos, &buf[bpos], buf_size - bpos,
     712                sheet_copy_out(doc.sh, &sp, epos, &buf[bpos], buf_size - bpos,
    708713                    &bep);
    709714                bytes = str_size(&buf[bpos]);
     
    727732        int sh_rows, rows;
    728733
    729         sheet_get_num_rows(&doc.sh, &sh_rows);
     734        sheet_get_num_rows(doc.sh, &sh_rows);
    730735        rows = min(sh_rows - pane.sh_row + 1, pane.rows);
    731736
     
    797802                rbc.row = pane.sh_row + i;
    798803                rbc.column = pane.sh_column;
    799                 sheet_get_cell_pt(&doc.sh, &rbc, dir_before, &rb);
     804                sheet_get_cell_pt(doc.sh, &rbc, dir_before, &rb);
    800805
    801806                /* Ending point for row display */
    802807                rec.row = pane.sh_row + i;
    803808                rec.column = pane.sh_column + pane.columns;
    804                 sheet_get_cell_pt(&doc.sh, &rec, dir_before, &re);
     809                sheet_get_cell_pt(doc.sh, &rec, dir_before, &re);
    805810
    806811                /* Copy the text of the row to the buffer. */
    807                 sheet_copy_out(&doc.sh, &rb, &re, row_buf, ROW_BUF_SIZE, &dep);
     812                sheet_copy_out(doc.sh, &rb, &re, row_buf, ROW_BUF_SIZE, &dep);
    808813
    809814                /* Display text from the buffer. */
     
    874879        spt_t caret_pt;
    875880        coord_t coord;
     881        int last_row;
    876882
    877883        tag_get_pt(&pane.caret_pos, &caret_pt);
    878884        spt_get_coord(&caret_pt, &coord);
    879885
     886        sheet_get_num_rows(doc.sh, &last_row);
     887
    880888        const char *fname = (doc.file_name != NULL) ? doc.file_name : "<unnamed>";
    881889
    882890        console_set_pos(con, 0, scr_rows - 1);
    883891        console_set_style(con, STYLE_INVERTED);
    884         int n = printf(" %d, %d: File '%s'. Ctrl-Q Quit  Ctrl-S Save  "
    885             "Ctrl-E Save As", coord.row, coord.column, fname);
     892        int n = printf(" %d, %d (%d): File '%s'. Ctrl-Q Quit  Ctrl-S Save  "
     893            "Ctrl-E Save As", coord.row, coord.column, last_row, fname);
    886894       
    887895        int pos = scr_columns - 1 - n;
     
    919927        cbuf[offs] = '\0';
    920928
    921         (void) sheet_insert(&doc.sh, &pt, dir_before, cbuf);
     929        (void) sheet_insert(doc.sh, &pt, dir_before, cbuf);
    922930
    923931        pane.rflags |= REDRAW_ROW;
     
    936944
    937945        coord.column -= 1;
    938         sheet_get_cell_pt(&doc.sh, &coord, dir_before, &sp);
    939 
    940         (void) sheet_delete(&doc.sh, &sp, &ep);
     946        sheet_get_cell_pt(doc.sh, &coord, dir_before, &sp);
     947
     948        (void) sheet_delete(doc.sh, &sp, &ep);
    941949
    942950        pane.rflags |= REDRAW_ROW;
     
    954962        spt_get_coord(&sp, &sc);
    955963
    956         sheet_get_cell_pt(&doc.sh, &sc, dir_after, &ep);
     964        sheet_get_cell_pt(doc.sh, &sc, dir_after, &ep);
    957965        spt_get_coord(&ep, &ec);
    958966
    959         (void) sheet_delete(&doc.sh, &sp, &ep);
     967        (void) sheet_delete(doc.sh, &sp, &ep);
    960968
    961969        pane.rflags |= REDRAW_ROW;
     
    10291037                else {
    10301038                        coord.row--;
    1031                         sheet_get_row_width(&doc.sh, coord.row, &coord.column);
     1039                        sheet_get_row_width(doc.sh, coord.row, &coord.column);
    10321040                }
    10331041        }
    10341042        if (drow > 0) {
    1035                 sheet_get_num_rows(&doc.sh, &num_rows);
     1043                sheet_get_num_rows(doc.sh, &num_rows);
    10361044                if (coord.row > num_rows) coord.row = num_rows;
    10371045        }
     
    10461054         * coordinates. The character can be wider than one cell (e.g. tab).
    10471055         */
    1048         sheet_get_cell_pt(&doc.sh, &coord, align_dir, &pt);
    1049         sheet_remove_tag(&doc.sh, &pane.caret_pos);
    1050         sheet_place_tag(&doc.sh, &pt, &pane.caret_pos);
     1056        sheet_get_cell_pt(doc.sh, &coord, align_dir, &pt);
     1057        sheet_remove_tag(doc.sh, &pane.caret_pos);
     1058        sheet_place_tag(doc.sh, &pt, &pane.caret_pos);
    10511059
    10521060        /* For non-vertical movement set the new value for @c ideal_column. */
     
    10681076                tag_get_pt(&pane.caret_pos, &pt);
    10691077
    1070                 sheet_remove_tag(&doc.sh, &pane.sel_start);
    1071                 sheet_place_tag(&doc.sh, &pt, &pane.sel_start);
     1078                sheet_remove_tag(doc.sh, &pane.sel_start);
     1079                sheet_place_tag(doc.sh, &pt, &pane.sel_start);
    10721080        } while (!pt_is_word_beginning(&pt));
    10731081
     
    10841092                tag_get_pt(&pane.caret_pos, &pt);
    10851093
    1086                 sheet_remove_tag(&doc.sh, &pane.sel_start);
    1087                 sheet_place_tag(&doc.sh, &pt, &pane.sel_start);
     1094                sheet_remove_tag(doc.sh, &pane.sel_start);
     1095                sheet_place_tag(doc.sh, &pt, &pane.sel_start);
    10881096        } while (!pt_is_word_beginning(&pt));
    10891097
     
    11631171
    11641172        if (rel < 0)
    1165                 sheet_delete(&doc.sh, &pa, &pb);
     1173                sheet_delete(doc.sh, &pa, &pb);
    11661174        else
    1167                 sheet_delete(&doc.sh, &pb, &pa);
     1175                sheet_delete(doc.sh, &pb, &pa);
    11681176
    11691177        if (ca.row == cb.row)
     
    11871195static void selection_sel_range(spt_t pa, spt_t pb)
    11881196{
    1189         sheet_remove_tag(&doc.sh, &pane.sel_start);
    1190         sheet_place_tag(&doc.sh, &pa, &pane.sel_start);
    1191         sheet_remove_tag(&doc.sh, &pane.caret_pos);
    1192         sheet_place_tag(&doc.sh, &pb, &pane.caret_pos);
     1197        sheet_remove_tag(doc.sh, &pane.sel_start);
     1198        sheet_place_tag(doc.sh, &pa, &pane.sel_start);
     1199        sheet_remove_tag(doc.sh, &pane.caret_pos);
     1200        sheet_place_tag(doc.sh, &pb, &pane.caret_pos);
    11931201
    11941202        pane.rflags |= REDRAW_TEXT;
     
    12731281
    12741282        coord.row = coord.column = 1;
    1275         sheet_get_cell_pt(&doc.sh, &coord, dir_before, pt);
     1283        sheet_get_cell_pt(doc.sh, &coord, dir_before, pt);
    12761284}
    12771285
     
    12821290        int num_rows;
    12831291
    1284         sheet_get_num_rows(&doc.sh, &num_rows);
     1292        sheet_get_num_rows(doc.sh, &num_rows);
    12851293        coord.row = num_rows + 1;
    12861294        coord.column = 1;
    12871295
    1288         sheet_get_cell_pt(&doc.sh, &coord, dir_after, pt);
     1296        sheet_get_cell_pt(doc.sh, &coord, dir_after, pt);
    12891297}
    12901298
     
    12971305        coord.column = 1;
    12981306
    1299         sheet_get_cell_pt(&doc.sh, &coord, dir_before, spt);
     1307        sheet_get_cell_pt(doc.sh, &coord, dir_before, spt);
    13001308}
    13011309
     
    13071315
    13081316        spt_get_coord(cpt, &coord);
    1309         sheet_get_row_width(&doc.sh, coord.row, &row_width);
     1317        sheet_get_row_width(doc.sh, coord.row, &row_width);
    13101318        coord.column = row_width - 1;
    13111319
    1312         sheet_get_cell_pt(&doc.sh, &coord, dir_after, ept);
     1320        sheet_get_cell_pt(doc.sh, &coord, dir_after, ept);
    13131321}
    13141322
     
    13361344
    13371345        coord.column -= 1;
    1338         sheet_get_cell_pt(&doc.sh, &coord, dir_before, &lp);
     1346        sheet_get_cell_pt(doc.sh, &coord, dir_before, &lp);
    13391347
    13401348        return pt_is_delimiter(&lp)
     
    13581366
    13591367        coord.column += 1;
    1360         sheet_get_cell_pt(&doc.sh, &coord, dir_after, &rp);
     1368        sheet_get_cell_pt(doc.sh, &coord, dir_after, &rp);
    13611369
    13621370        ch = range_get_str(pt, &rp);
     
    13841392
    13851393        coord.column += 1;
    1386         sheet_get_cell_pt(&doc.sh, &coord, dir_after, &rp);
     1394        sheet_get_cell_pt(doc.sh, &coord, dir_after, &rp);
    13871395
    13881396        ch = range_get_str(pt, &rp);
  • uspace/app/edit/sheet.c

    r80d8885 rdc5aa568  
    5757
    5858#include "sheet.h"
     59#include "sheet_impl.h"
    5960
    6061enum {
     
    6667
    6768/** Initialize an empty sheet. */
    68 int sheet_init(sheet_t *sh)
    69 {
     69int sheet_create(sheet_t **rsh)
     70{
     71        sheet_t *sh;
     72
     73        sh = calloc(1, sizeof(sheet_t));
     74        if (sh == NULL)
     75                return ENOMEM;
     76
    7077        sh->dbuf_size = INITIAL_SIZE;
    7178        sh->text_size = 0;
     
    7784        list_initialize(&sh->tags);
    7885
     86        *rsh = sh;
    7987        return EOK;
    8088}
  • uspace/app/edit/sheet.h

    r80d8885 rdc5aa568  
    5050
    5151/** Sheet */
    52 typedef struct {
    53         /* Note: This structure is opaque for the user. */
    54 
    55         size_t text_size;
    56         size_t dbuf_size;
    57         char *data;
    58 
    59         list_t tags;
    60 } sheet_t;
     52struct sheet;
     53typedef struct sheet sheet_t;
    6154
    6255/** Character cell coordinates
     
    9790} tag_t;
    9891
    99 extern int sheet_init(sheet_t *);
     92extern int sheet_create(sheet_t **);
    10093extern int sheet_insert(sheet_t *, spt_t *, enum dir_spec, char *);
    10194extern int sheet_delete(sheet_t *, spt_t *, spt_t *);
  • uspace/lib/c/generic/str.c

    r80d8885 rdc5aa568  
    397397       
    398398        return len;
     399}
     400
     401/** Get character display width on a character cell display.
     402 *
     403 * @param ch    Character
     404 * @return      Width of character in cells.
     405 */
     406size_t chr_width(wchar_t ch)
     407{
     408        return 1;
     409}
     410
     411/** Get string display width on a character cell display.
     412 *
     413 * @param str   String
     414 * @return      Width of string in cells.
     415 */
     416size_t str_width(const char *str)
     417{
     418        size_t width = 0;
     419        size_t offset = 0;
     420        wchar_t ch;
     421       
     422        while ((ch = str_decode(str, &offset, STR_NO_LIMIT)) != 0)
     423                width += chr_width(ch);
     424       
     425        return width;
    399426}
    400427
  • uspace/lib/c/include/str.h

    r80d8885 rdc5aa568  
    7373extern size_t wstr_nlength(const wchar_t *str, size_t size);
    7474
     75extern size_t chr_width(wchar_t ch);
     76extern size_t str_width(const char *str);
     77
    7578extern bool ascii_check(wchar_t ch);
    7679extern bool chr_check(wchar_t ch);
  • uspace/lib/clui/tinput.c

    r80d8885 rdc5aa568  
    595595{
    596596        unsigned int i;
    597         /* Determine the maximum length of the completion in chars */
    598         size_t max_length = 0;
     597        /* Determine the maximum width of the completion in chars */
     598        size_t max_width = 0;
    599599        for (i = 0; i < cnum; i++)
    600                 max_length = max(max_length, str_length(compl[i]));
    601        
    602         unsigned int cols = max(1, (ti->con_cols + 1) / (max_length + 1));
     600                max_width = max(max_width, str_width(compl[i]));
     601       
     602        unsigned int cols = max(1, (ti->con_cols + 1) / (max_width + 1));
    603603        unsigned int padding = 0;
    604         if ((cols * max_length) + (cols - 1) < ti->con_cols) {
    605                 padding = ti->con_cols - (cols * max_length) - (cols - 1);
    606         }
    607         unsigned int col_width = max_length + padding / cols;
     604        if ((cols * max_width) + (cols - 1) < ti->con_cols) {
     605                padding = ti->con_cols - (cols * max_width) - (cols - 1);
     606        }
     607        unsigned int col_width = max_width + padding / cols;
    608608        unsigned int rows = cnum / cols + ((cnum % cols) != 0);
    609609       
     
    611611       
    612612        for (row = 0; row < rows; row++) {
    613                 bool wlc = false;
     613                unsigned int display_col = 0;
    614614                for (col = 0; col < cols; col++) {
    615615                        size_t compl_idx = col * rows + row;
    616616                        if (compl_idx >= cnum)
    617617                                break;
    618                         if (col)
     618                        if (col) {
    619619                                printf(" ");
     620                                display_col++;
     621                        }
    620622                        printf("%s", compl[compl_idx]);
    621                         size_t compl_len = str_length(compl[compl_idx]);
    622                         if (col == cols -1) {
    623                                 wlc = (compl_len == max_length);
    624                         }
    625                         else {
    626                                 for (i = compl_len; i < col_width; i++) {
     623                        size_t compl_width = str_width(compl[compl_idx]);
     624                        display_col += compl_width;
     625                        if (col < cols - 1) {
     626                                for (i = compl_width; i < col_width; i++) {
    627627                                        printf(" ");
     628                                        display_col++;
    628629                                }
    629630                        }
    630631                }
    631                 if (!wlc) printf("\n");
    632         }
     632                if ((display_col % ti->con_cols) > 0) printf("\n");
     633        }
     634        fflush(stdout);
    633635}
    634636
Note: See TracChangeset for help on using the changeset viewer.