Changeset 61bf9dd9 in mainline for uspace/lib/ui/src/entry.c
- Timestamp:
- 2021-06-30T16:48:54Z (3 years ago)
- Branches:
- master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- d63623f
- Parents:
- 5d1ff11
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ui/src/entry.c
r5d1ff11 r61bf9dd9 180 180 free(entry->text); 181 181 entry->text = tcopy; 182 entry->pos = str_size(text); 182 183 183 184 return EOK; … … 223 224 error: 224 225 return rc; 226 } 227 228 /** Return width of text before cursor. 229 * 230 * @param entry Text entry 231 * @return Widht of text before cursor 232 */ 233 static gfx_coord_t ui_entry_lwidth(ui_entry_t *entry) 234 { 235 ui_resource_t *res; 236 uint8_t tmp; 237 gfx_coord_t width; 238 239 res = ui_window_get_res(entry->window); 240 241 tmp = entry->text[entry->pos]; 242 243 entry->text[entry->pos] = '\0'; 244 width = gfx_text_width(res->font, entry->text); 245 entry->text[entry->pos] = tmp; 246 247 return width; 225 248 } 226 249 … … 304 327 if (entry->active) { 305 328 /* Cursor */ 306 pos.x += width;329 pos.x += ui_entry_lwidth(entry); 307 330 308 331 rc = ui_entry_paint_cursor(entry, &pos); … … 357 380 errno_t ui_entry_insert_str(ui_entry_t *entry, const char *str) 358 381 { 382 uint8_t tmp; 383 char *ltext = NULL; 359 384 char *newtext; 360 385 char *oldtext; 361 386 int rc; 362 387 363 rc = asprintf(&newtext, "%s%s", entry->text, str); 364 if (rc < 0) 388 tmp = entry->text[entry->pos]; 389 entry->text[entry->pos] = '\0'; 390 ltext = str_dup(entry->text); 391 if (ltext == NULL) 365 392 return ENOMEM; 393 394 entry->text[entry->pos] = tmp; 395 396 rc = asprintf(&newtext, "%s%s%s", ltext, str, entry->text + entry->pos); 397 if (rc < 0) { 398 free(ltext); 399 return ENOMEM; 400 } 366 401 367 402 oldtext = entry->text; 368 403 entry->text = newtext; 404 entry->pos += str_size(str); 369 405 free(oldtext); 406 free(ltext); 407 370 408 ui_entry_paint(entry); 371 409 … … 381 419 size_t off; 382 420 383 off = str_size(entry->text); 421 if (entry->pos == 0) 422 return; 423 424 /* Find offset where character before cursor starts */ 425 off = entry->pos; 384 426 (void) str_decode_reverse(entry->text, &off, 385 427 str_size(entry->text)); 386 entry->text[off] = '\0'; 428 429 memmove(entry->text + off, entry->text + entry->pos, 430 str_size(entry->text + entry->pos) + 1); 431 entry->pos = off; 432 433 ui_entry_paint(entry); 434 } 435 436 /** Delete character after cursor. 437 * 438 * @param entry Text entry 439 */ 440 void ui_entry_delete(ui_entry_t *entry) 441 { 442 size_t off; 443 444 /* Find offset where character after cursor end */ 445 off = entry->pos; 446 (void) str_decode(entry->text, &off, 447 str_size(entry->text)); 448 449 memmove(entry->text + entry->pos, entry->text + off, 450 str_size(entry->text + off) + 1); 451 387 452 ui_entry_paint(entry); 388 453 } … … 398 463 assert(event->type == KEY_PRESS); 399 464 400 if (event->key == KC_BACKSPACE) 465 switch (event->key) { 466 case KC_BACKSPACE: 401 467 ui_entry_backspace(entry); 402 403 if (event->key == KC_ESCAPE) 468 break; 469 470 case KC_DELETE: 471 ui_entry_delete(entry); 472 break; 473 474 case KC_ESCAPE: 404 475 ui_entry_deactivate(entry); 476 break; 477 478 case KC_HOME: 479 ui_entry_seek_start(entry); 480 break; 481 482 case KC_END: 483 ui_entry_seek_end(entry); 484 break; 485 486 case KC_LEFT: 487 ui_entry_seek_prev_char(entry); 488 break; 489 490 case KC_RIGHT: 491 ui_entry_seek_next_char(entry); 492 break; 493 494 default: 495 break; 496 } 405 497 406 498 return ui_claimed; … … 526 618 527 619 entry->active = true; 620 entry->pos = str_size(entry->text); 528 621 (void) ui_entry_paint(entry); 529 622 … … 532 625 } 533 626 627 /** Move text cursor to the beginning of text. 628 * 629 * @param entry Text entry 630 */ 631 void ui_entry_seek_start(ui_entry_t *entry) 632 { 633 entry->pos = 0; 634 (void) ui_entry_paint(entry); 635 } 636 637 /** Move text cursor to the end of text. 638 * 639 * @param entry Text entry 640 */ 641 void ui_entry_seek_end(ui_entry_t *entry) 642 { 643 entry->pos = str_size(entry->text); 644 (void) ui_entry_paint(entry); 645 } 646 647 /** Move text cursor one character backward. 648 * 649 * @param entry Text entry 650 */ 651 void ui_entry_seek_prev_char(ui_entry_t *entry) 652 { 653 size_t off; 654 655 off = entry->pos; 656 (void) str_decode_reverse(entry->text, &off, 657 str_size(entry->text)); 658 entry->pos = off; 659 (void) ui_entry_paint(entry); 660 } 661 662 /** Move text cursor one character forward. 663 * 664 * @param entry Text entry 665 */ 666 void ui_entry_seek_next_char(ui_entry_t *entry) 667 { 668 size_t off; 669 670 off = entry->pos; 671 (void) str_decode(entry->text, &off, 672 str_size(entry->text)); 673 entry->pos = off; 674 (void) ui_entry_paint(entry); 675 } 676 534 677 /** Deactivate text entry. 535 678 *
Note:
See TracChangeset
for help on using the changeset viewer.