Ignore:
File:
1 edited

Legend:

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

    ra2bdcf87 rbe61b8f  
    4040#include <errno.h>
    4141#include <assert.h>
    42 #include <stdbool.h>
     42#include <bool.h>
    4343#include <tinput.h>
    4444
    4545#define LIN_TO_COL(ti, lpos) ((lpos) % ((ti)->con_cols))
    4646#define LIN_TO_ROW(ti, lpos) ((lpos) / ((ti)->con_cols))
    47 #define LIN_POS(ti, col, row) ((col) + (row) * (ti)->con_cols)
    4847
    4948/** Seek direction */
     
    105104static void tinput_display_tail(tinput_t *ti, size_t start, size_t pad)
    106105{
    107         wchar_t *dbuf = malloc((INPUT_MAX_SIZE + 1) * sizeof(wchar_t));
    108         if (!dbuf)
    109                 return;
     106        wchar_t dbuf[INPUT_MAX_SIZE + 1];
    110107       
    111108        size_t sa;
     
    149146       
    150147        console_flush(ti->console);
    151 
    152         free(dbuf);
    153148}
    154149
     
    384379}
    385380
    386 static void tinput_seek_scrpos(tinput_t *ti, int col, int line, bool shift_held)
    387 {
    388         unsigned lpos;
    389         tinput_pre_seek(ti, shift_held);
    390 
    391         lpos = LIN_POS(ti, col, line);
    392 
    393         if (lpos > ti->text_coord)
    394                 ti->pos = lpos -  ti->text_coord;
    395         else
    396                 ti->pos = 0;
    397         if (ti->pos > ti->nc)
    398                 ti->pos = ti->nc;
    399 
    400         tinput_post_seek(ti, shift_held);
    401 }
    402 
    403381static void tinput_seek_max(tinput_t *ti, seek_dir_t dir, bool shift_held)
    404382{
     
    617595{
    618596        unsigned int i;
    619         /* Determine the maximum width of the completion in chars */
    620         size_t max_width = 0;
     597        /* Determine the maximum length of the completion in chars */
     598        size_t max_length = 0;
    621599        for (i = 0; i < cnum; i++)
    622                 max_width = max(max_width, str_width(compl[i]));
    623        
    624         unsigned int cols = max(1, (ti->con_cols + 1) / (max_width + 1));
    625         unsigned int padding = 0;
    626         if ((cols * max_width) + (cols - 1) < ti->con_cols) {
    627                 padding = ti->con_cols - (cols * max_width) - (cols - 1);
    628         }
    629         unsigned int col_width = max_width + padding / cols;
     600                max_length = max(max_length, str_length(compl[i]));
     601       
     602        unsigned int cols = max(1, (ti->con_cols + 1) / (max_length + 1));
     603        unsigned int col_width = ti->con_cols / cols;
    630604        unsigned int rows = cnum / cols + ((cnum % cols) != 0);
    631605       
     
    633607       
    634608        for (row = 0; row < rows; row++) {
    635                 unsigned int display_col = 0;
     609                bool wlc = false;
    636610                for (col = 0; col < cols; col++) {
    637611                        size_t compl_idx = col * rows + row;
    638612                        if (compl_idx >= cnum)
    639613                                break;
    640                         if (col) {
     614                        if (col)
    641615                                printf(" ");
    642                                 display_col++;
     616                        printf("%s", compl[compl_idx]);
     617                        size_t compl_len = str_length(compl[compl_idx]);
     618                        if (col == cols -1) {
     619                                wlc = (compl_len == max_length);
    643620                        }
    644                         printf("%s", compl[compl_idx]);
    645                         size_t compl_width = str_width(compl[compl_idx]);
    646                         display_col += compl_width;
    647                         if (col < cols - 1) {
    648                                 for (i = compl_width; i < col_width; i++) {
     621                        else {
     622                                for (i = compl_len; i < col_width; i++) {
    649623                                        printf(" ");
    650                                         display_col++;
    651624                                }
    652625                        }
    653626                }
    654                 if ((display_col % ti->con_cols) > 0)
    655                         printf("\n");
    656         }
    657         fflush(stdout);
     627                if (!wlc) printf("\n");
     628        }
    658629}
    659630
     
    803774{
    804775        ti->compl_ops = compl_ops;
    805 }
    806 
    807 /** Handle key press event. */
    808 static void tinput_key_press(tinput_t *ti, kbd_event_t *kev)
    809 {
    810         if (kev->key == KC_LSHIFT)
    811                 ti->lshift_held = true;
    812         if (kev->key == KC_RSHIFT)
    813                 ti->rshift_held = true;
    814 
    815         if (((kev->mods & KM_CTRL) != 0) &&
    816             ((kev->mods & (KM_ALT | KM_SHIFT)) == 0))
    817                 tinput_key_ctrl(ti, kev);
    818        
    819         if (((kev->mods & KM_SHIFT) != 0) &&
    820             ((kev->mods & (KM_CTRL | KM_ALT)) == 0))
    821                 tinput_key_shift(ti, kev);
    822        
    823         if (((kev->mods & KM_CTRL) != 0) &&
    824             ((kev->mods & KM_SHIFT) != 0) &&
    825             ((kev->mods & KM_ALT) == 0))
    826                 tinput_key_ctrl_shift(ti, kev);
    827        
    828         if ((kev->mods & (KM_CTRL | KM_ALT | KM_SHIFT)) == 0)
    829                 tinput_key_unmod(ti, kev);
    830        
    831         if (kev->c >= ' ') {
    832                 tinput_sel_delete(ti);
    833                 tinput_insert_char(ti, kev->c);
    834         }
    835 }
    836 
    837 /** Handle key release event. */
    838 static void tinput_key_release(tinput_t *ti, kbd_event_t *kev)
    839 {
    840         if (kev->key == KC_LSHIFT)
    841                 ti->lshift_held = false;
    842         if (kev->key == KC_RSHIFT)
    843                 ti->rshift_held = false;
    844 }
    845 
    846 /** Position event */
    847 static void tinput_pos(tinput_t *ti, pos_event_t *ev)
    848 {
    849         if (ev->type == POS_PRESS) {
    850                 tinput_seek_scrpos(ti, ev->hpos, ev->vpos,
    851                     ti->lshift_held || ti->rshift_held);
    852         }
    853776}
    854777
     
    882805                console_flush(ti->console);
    883806               
    884                 cons_event_t ev;
    885                 if (!console_get_event(ti->console, &ev))
     807                kbd_event_t ev;
     808                if (!console_get_kbd_event(ti->console, &ev))
    886809                        return EIO;
    887810               
    888                 switch (ev.type) {
    889                 case CEV_KEY:
    890                         if (ev.ev.key.type == KEY_PRESS)
    891                                 tinput_key_press(ti, &ev.ev.key);
    892                         else
    893                                 tinput_key_release(ti, &ev.ev.key);
    894                         break;
    895                 case CEV_POS:
    896                         tinput_pos(ti, &ev.ev.pos);
    897                         break;
     811                if (ev.type != KEY_PRESS)
     812                        continue;
     813               
     814                if (((ev.mods & KM_CTRL) != 0) &&
     815                    ((ev.mods & (KM_ALT | KM_SHIFT)) == 0))
     816                        tinput_key_ctrl(ti, &ev);
     817               
     818                if (((ev.mods & KM_SHIFT) != 0) &&
     819                    ((ev.mods & (KM_CTRL | KM_ALT)) == 0))
     820                        tinput_key_shift(ti, &ev);
     821               
     822                if (((ev.mods & KM_CTRL) != 0) &&
     823                    ((ev.mods & KM_SHIFT) != 0) &&
     824                    ((ev.mods & KM_ALT) == 0))
     825                        tinput_key_ctrl_shift(ti, &ev);
     826               
     827                if ((ev.mods & (KM_CTRL | KM_ALT | KM_SHIFT)) == 0)
     828                        tinput_key_unmod(ti, &ev);
     829               
     830                if (ev.c >= ' ') {
     831                        tinput_sel_delete(ti);
     832                        tinput_insert_char(ti, ev.c);
    898833                }
    899834        }
Note: See TracChangeset for help on using the changeset viewer.