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

Changeset 025759c in mainline


Ignore:
Timestamp:
2009-11-29T12:47:25Z (12 years ago)
Author:
jirka <jirka@…>
Branches:
lfn, master
Children:
da2bd08
Parents:
19528516
Message:

Word seek.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/bdsh/input.c

    r19528516 r025759c  
    5656
    5757typedef enum {
    58         seek_cell,
    59         seek_max
    60 } seek_dist_t;
    61 
    62 typedef enum {
    6358        seek_backward = -1,
    6459        seek_forward = 1
     
    183178}
    184179
    185 static void tinput_seek(tinput_t *ti, seek_dir_t dir, seek_dist_t dist)
    186 {
    187         switch (dist) {
    188         case seek_cell:
    189                 ti->pos += dir;
    190                 break;
    191         case seek_max:
    192                 if (dir == seek_backward)
    193                         ti->pos = 0;
    194                 else
    195                         ti->pos = ti->nc;
    196                 break;
    197         }
    198                
    199         if (ti->pos < 0) ti->pos = 0;
    200         if (ti->pos > ti->nc) ti->pos = ti->nc;
     180static void tinput_seek_cell(tinput_t *ti, seek_dir_t dir)
     181{
     182        if (dir == seek_forward) {
     183                if (ti->pos < ti->nc)
     184                        ti->pos += 1;
     185        } else {
     186                if (ti->pos > 0)
     187                        ti->pos -= 1;
     188        }
     189
     190        tinput_position_caret(ti);
     191}
     192
     193static void tinput_seek_word(tinput_t *ti, seek_dir_t dir)
     194{
     195        if (dir == seek_forward) {
     196                if (ti->pos == ti->nc)
     197                        return;
     198
     199                while (1) {
     200                        ti->pos += 1;
     201
     202                        if (ti->pos == ti->nc)
     203                                break;
     204
     205                        if (ti->buffer[ti->pos - 1] == ' ' &&
     206                            ti->buffer[ti->pos] != ' ')
     207                                break;
     208                }
     209        } else {
     210                if (ti->pos == 0)
     211                        return;
     212
     213                while (1) {
     214                        ti->pos -= 1;
     215
     216                        if (ti->pos == 0)
     217                                break;
     218
     219                        if (ti->buffer[ti->pos - 1] == ' ' &&
     220                            ti->buffer[ti->pos] != ' ')
     221                                break;
     222                }
     223
     224        }
     225
     226        tinput_position_caret(ti);
     227}
     228
     229static void tinput_seek_max(tinput_t *ti, seek_dir_t dir)
     230{
     231        if (dir == seek_backward)
     232                ti->pos = 0;
     233        else
     234                ti->pos = ti->nc;
    201235
    202236        tinput_position_caret(ti);
     
    226260                        continue;
    227261
    228                 if ((ev.mods & (KM_CTRL | KM_ALT | KM_SHIFT)) != 0)
    229                         continue;
    230 
    231                 switch(ev.key) {
    232                 case KC_ENTER:
    233                 case KC_NENTER:
    234                         goto done;
    235                 case KC_BACKSPACE:
    236                         tinput_backspace(ti);
    237                         break;
    238                 case KC_DELETE:
    239                         tinput_delete(ti);
    240                         break;
    241                 case KC_LEFT:
    242                         tinput_seek(ti, seek_backward, seek_cell);
    243                         break;
    244                 case KC_RIGHT:
    245                         tinput_seek(ti, seek_forward, seek_cell);
    246 
    247                         break;
    248                 case KC_HOME:
    249                         tinput_seek(ti, seek_backward, seek_max);
    250                         break;
    251                 case KC_END:
    252                         tinput_seek(ti, seek_forward, seek_max);
    253                         break;
    254                 }
     262                if ((ev.mods & KM_CTRL) != 0 &&
     263                    (ev.mods & (KM_ALT | KM_SHIFT)) == 0) {
     264                        switch (ev.key) {
     265                        case KC_LEFT:
     266                                tinput_seek_word(ti, seek_backward);
     267                                break;
     268                        case KC_RIGHT:
     269                                tinput_seek_word(ti, seek_forward);
     270                                break;
     271                        }
     272                }
     273
     274                if ((ev.mods & (KM_CTRL | KM_ALT | KM_SHIFT)) == 0) {
     275                        switch (ev.key) {
     276                        case KC_ENTER:
     277                        case KC_NENTER:
     278                                goto done;
     279                        case KC_BACKSPACE:
     280                                tinput_backspace(ti);
     281                                break;
     282                        case KC_DELETE:
     283                                tinput_delete(ti);
     284                                break;
     285                        case KC_LEFT:
     286                                tinput_seek_cell(ti, seek_backward);
     287                                break;
     288                        case KC_RIGHT:
     289                                tinput_seek_cell(ti, seek_forward);
     290                                break;
     291                        case KC_HOME:
     292                                tinput_seek_max(ti, seek_backward);
     293                                break;
     294                        case KC_END:
     295                                tinput_seek_max(ti, seek_forward);
     296                                break;
     297                        }
     298                }
     299
    255300                if (ev.c >= ' ') {
    256301                        tinput_insert_char(ti, ev.c);
Note: See TracChangeset for help on using the changeset viewer.