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

Changeset 7a7b8efa in mainline


Ignore:
Timestamp:
2012-08-16T11:34:12Z (8 years ago)
Author:
Martin Sucha <sucha14@…>
Branches:
master
Children:
13c4fe0
Parents:
be2a38ad
Message:

Use str_width instead of str_length in tab completions and fix display in corner cases.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/clui/tinput.c

    rbe2a38ad r7a7b8efa  
    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)
    619                                 printf(" ");
     618                        if (col) {
     619                                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++) {
    627                                         printf(" ");
     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++) {
     627                                        printf("=");
     628                                        display_col++;
    628629                                }
    629630                        }
    630631                }
    631                 if (!wlc) printf("\n");
    632         }
     632                if ((display_col % ti->con_cols) > 0) printf("\n");
     633                printf("%u %u\n", display_col, (unsigned int) ti->con_cols);
     634        }
     635        fflush(stdout);
    633636}
    634637
Note: See TracChangeset for help on using the changeset viewer.