Changeset aefdccd in mainline for uspace/app/nav
- Timestamp:
- 2025-10-20T06:14:54Z (5 months ago)
- Parents:
- adbd7e1 (diff), 3e41cc4 (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. - git-author:
- boba-buba <120932204+boba-buba@…> (2025-10-20 06:14:54)
- git-committer:
- GitHub <noreply@…> (2025-10-20 06:14:54)
- Location:
- uspace/app/nav
- Files:
-
- 12 added
- 9 edited
-
dlg/ioerrdlg.c (added)
-
dlg/ioerrdlg.h (added)
-
dlg/newfiledlg.c (added)
-
dlg/newfiledlg.h (added)
-
dlg/progress.c (added)
-
dlg/progress.h (added)
-
menu.c (modified) (3 diffs)
-
menu.h (modified) (1 diff)
-
meson.build (modified) (2 diffs)
-
nav.c (modified) (11 diffs)
-
nav.h (modified) (3 diffs)
-
newfile.c (added)
-
newfile.h (added)
-
panel.c (modified) (1 diff)
-
panel.h (modified) (2 diffs)
-
types/dlg/ioerrdlg.h (added)
-
types/dlg/newfiledlg.h (added)
-
types/dlg/progress.h (added)
-
types/menu.h (modified) (1 diff)
-
types/nav.h (modified) (3 diffs)
-
types/newfile.h (added)
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/nav/menu.c
radbd7e1 raefdccd 54 54 nav_menu_t *menu; 55 55 ui_menu_t *mfile; 56 ui_menu_entry_t *mnew; 56 57 ui_menu_entry_t *mopen; 57 58 ui_menu_entry_t *medit; … … 78 79 goto error; 79 80 81 rc = ui_menu_entry_create(mfile, "~N~ew File", "Ctrl-M", &mnew); 82 if (rc != EOK) 83 goto error; 84 85 ui_menu_entry_set_cb(mnew, nav_menu_file_new_file, (void *) menu); 86 80 87 rc = ui_menu_entry_create(mfile, "~O~pen", "Enter", &mopen); 81 88 if (rc != EOK) … … 148 155 } 149 156 157 /** File / New File menu entry selected. 158 * 159 * @param mentry Menu entry 160 * @param arg Argument (navigator_t *) 161 */ 162 void nav_menu_file_new_file(ui_menu_entry_t *mentry, void *arg) 163 { 164 nav_menu_t *menu = (nav_menu_t *)arg; 165 166 if (menu->cb != NULL && menu->cb->file_new_file != NULL) 167 menu->cb->file_new_file(menu->cb_arg); 168 } 169 150 170 /** File / Open menu entry selected. 151 171 * -
uspace/app/nav/menu.h
radbd7e1 raefdccd 46 46 extern void nav_menu_destroy(nav_menu_t *); 47 47 extern ui_control_t *nav_menu_ctl(nav_menu_t *); 48 extern void nav_menu_file_new_file(ui_menu_entry_t *, void *); 48 49 extern void nav_menu_file_open(ui_menu_entry_t *, void *); 49 50 extern void nav_menu_file_edit(ui_menu_entry_t *, void *); -
uspace/app/nav/meson.build
radbd7e1 raefdccd 1 1 # 2 # Copyright (c) 202 1Jiri Svoboda2 # Copyright (c) 2025 Jiri Svoboda 3 3 # All rights reserved. 4 4 # … … 27 27 # 28 28 29 deps = [ ' ui' ]29 deps = [ 'fmgt', 'ui' ] 30 30 src = files( 31 'dlg/ioerrdlg.c', 32 'dlg/newfiledlg.c', 33 'dlg/progress.c', 31 34 'main.c', 32 35 'menu.c', 33 36 'nav.c', 37 'newfile.c', 34 38 'panel.c', 35 39 ) 36 40 37 41 test_src = files( 42 'dlg/ioerrdlg.c', 43 'dlg/newfiledlg.c', 44 'dlg/progress.c', 38 45 'menu.c', 39 46 'nav.c', 47 'newfile.c', 40 48 'panel.c', 41 49 'test/main.c', -
uspace/app/nav/nav.c
radbd7e1 raefdccd 35 35 */ 36 36 37 #include <fibril.h> 38 #include <fmgt.h> 37 39 #include <gfx/coord.h> 38 40 #include <stdio.h> 39 41 #include <stdlib.h> 40 42 #include <str.h> 43 #include <str_error.h> 41 44 #include <task.h> 42 45 #include <ui/fixed.h> … … 45 48 #include <ui/ui.h> 46 49 #include <ui/window.h> 50 #include "dlg/ioerrdlg.h" 47 51 #include "menu.h" 52 #include "newfile.h" 48 53 #include "nav.h" 49 54 #include "panel.h" … … 59 64 }; 60 65 66 static void navigator_file_new_file(void *); 61 67 static void navigator_file_open(void *); 62 68 static void navigator_file_edit(void *); … … 64 70 65 71 static nav_menu_cb_t navigator_menu_cb = { 72 .file_new_file = navigator_file_new_file, 66 73 .file_open = navigator_file_open, 67 74 .file_edit = navigator_file_edit, … … 75 82 .activate_req = navigator_panel_activate_req, 76 83 .file_open = navigator_panel_file_open 84 }; 85 86 static void navigator_progress_babort(progress_dlg_t *, void *); 87 static void navigator_progress_close(progress_dlg_t *, void *); 88 89 progress_dlg_cb_t navigator_progress_cb = { 90 .babort = navigator_progress_babort, 91 .close = navigator_progress_close 92 }; 93 94 static void navigator_io_err_abort(io_err_dlg_t *, void *); 95 static void navigator_io_err_retry(io_err_dlg_t *, void *); 96 static void navigator_io_err_close(io_err_dlg_t *, void *); 97 98 static io_err_dlg_cb_t navigator_io_err_dlg_cb = { 99 .babort = navigator_io_err_abort, 100 .bretry = navigator_io_err_retry, 101 .close = navigator_io_err_close 77 102 }; 78 103 … … 104 129 (event->mods & KM_CTRL) != 0) { 105 130 switch (event->key) { 131 case KC_M: 132 navigator_new_file_dlg(navigator); 133 break; 106 134 case KC_E: 107 135 navigator_file_edit((void *)navigator); … … 228 256 goto error; 229 257 } 258 259 fibril_mutex_initialize(&navigator->io_err_act_lock); 260 fibril_condvar_initialize(&navigator->io_err_act_cv); 261 navigator->io_err_act_sel = false; 230 262 231 263 *rnavigator = navigator; … … 318 350 } 319 351 352 /** Refresh navigator panels. 353 * 354 * This needs to be called when the disk/directory contents might have 355 * changed. 356 * 357 * @param navigator Navigator 358 */ 359 void navigator_refresh_panels(navigator_t *navigator) 360 { 361 errno_t rc; 362 unsigned i; 363 364 /* First refresh inactive panel. */ 365 366 for (i = 0; i < 2; i++) { 367 if (!panel_is_active(navigator->panel[i])) { 368 rc = panel_refresh(navigator->panel[i]); 369 if (rc != EOK) 370 return; 371 } 372 } 373 374 /* 375 * Refresh active panel last so that working directory is left 376 * to that of the active panel. 377 */ 378 379 for (i = 0; i < 2; i++) { 380 if (panel_is_active(navigator->panel[i])) { 381 rc = panel_refresh(navigator->panel[i]); 382 if (rc != EOK) 383 return; 384 } 385 } 386 } 387 388 /** File / New File menu entry selected */ 389 static void navigator_file_new_file(void *arg) 390 { 391 navigator_t *navigator = (navigator_t *)arg; 392 393 navigator_new_file_dlg(navigator); 394 } 395 320 396 /** File / Open menu entry selected */ 321 397 static void navigator_file_open(void *arg) … … 361 437 return rc; 362 438 439 navigator_refresh_panels(navigator); 363 440 (void) ui_paint(navigator->ui); 364 441 return EOK; … … 402 479 return rc; 403 480 481 navigator_refresh_panels(navigator); 482 404 483 (void) ui_paint(navigator->ui); 405 484 return EOK; … … 482 561 } 483 562 563 /** Wrapper fibril function for worker function. 564 * 565 * This is the main fibril function for the worker fibril. It executes 566 * the worker function, then clears worker FID to indicate the worker 567 * is finished. 568 * 569 * @param arg Argument (navigator_worker_job_t *) 570 * @return EOK 571 */ 572 static errno_t navigator_worker_func(void *arg) 573 { 574 navigator_worker_job_t *job = (navigator_worker_job_t *)arg; 575 576 job->wfunc(job->arg); 577 job->navigator->worker_fid = 0; 578 free(job); 579 return EOK; 580 } 581 582 /** Start long-time work in a worker fibril. 583 * 584 * Actions which can take time (file operations) cannot block the main UI 585 * fibril. This function will start an action in the worker fibril, i.e., 586 * in the background. At the same time the caller should create a modal 587 * progress dialog that will be shown until the work is completed. 588 * 589 * (Only a single worker can execute at any given time). 590 * 591 * @param nav Navigator 592 * @param wfunc Worker main function 593 * @param arg Argument to worker function 594 * 595 * @return EOK on success or an error code 596 */ 597 errno_t navigator_worker_start(navigator_t *nav, void (*wfunc)(void *), 598 void *arg) 599 { 600 navigator_worker_job_t *job; 601 602 if (nav->worker_fid != 0) 603 return EBUSY; 604 605 job = calloc(1, sizeof(navigator_worker_job_t)); 606 if (job == NULL) 607 return ENOMEM; 608 609 job->navigator = nav; 610 job->wfunc = wfunc; 611 job->arg = arg; 612 613 nav->worker_fid = fibril_create(navigator_worker_func, (void *)job); 614 if (nav->worker_fid == 0) { 615 free(job); 616 return ENOMEM; 617 } 618 619 fibril_add_ready(nav->worker_fid); 620 return EOK; 621 } 622 623 /** Abort button pressed in progress dialog. 624 * 625 * @param dlg Progress dialog 626 * @param arg Argument (navigator_t *) 627 */ 628 static void navigator_progress_babort(progress_dlg_t *dlg, void *arg) 629 { 630 navigator_t *nav = (navigator_t *)arg; 631 632 (void)dlg; 633 nav->abort_op = true; 634 } 635 636 /** Progress dialog closed, 637 * 638 * @param dlg Progress dialog 639 * @param arg Argument (navigator_t *) 640 */ 641 static void navigator_progress_close(progress_dlg_t *dlg, void *arg) 642 { 643 navigator_t *nav = (navigator_t *)arg; 644 645 (void)dlg; 646 nav->abort_op = true; 647 } 648 649 /** Called by fmgt to query for I/O error recovery action. 650 * 651 * @param arg Argument (navigator_t *) 652 * @param err I/O error report 653 * @return Recovery action to take. 654 */ 655 fmgt_error_action_t navigator_io_error_query(void *arg, fmgt_io_error_t *err) 656 { 657 navigator_t *nav = (navigator_t *)arg; 658 io_err_dlg_t *dlg; 659 io_err_dlg_params_t params; 660 fmgt_error_action_t err_act; 661 char *text1; 662 errno_t rc; 663 int rv; 664 665 io_err_dlg_params_init(¶ms); 666 rv = asprintf(&text1, err->optype == fmgt_io_write ? 667 "Error writing file %s." : "Error reading file %s.", 668 err->fname); 669 if (rv < 0) 670 return fmgt_er_abort; 671 672 params.text1 = text1; 673 params.text2 = str_error(err->rc); 674 675 ui_lock(nav->ui); 676 rc = io_err_dlg_create(nav->ui, ¶ms, &dlg); 677 if (rc != EOK) { 678 ui_unlock(nav->ui); 679 free(text1); 680 return fmgt_er_abort; 681 } 682 683 io_err_dlg_set_cb(dlg, &navigator_io_err_dlg_cb, (void *)nav); 684 685 ui_unlock(nav->ui); 686 free(text1); 687 688 fibril_mutex_lock(&nav->io_err_act_lock); 689 690 while (!nav->io_err_act_sel) { 691 fibril_condvar_wait(&nav->io_err_act_cv, 692 &nav->io_err_act_lock); 693 } 694 695 err_act = nav->io_err_act; 696 nav->io_err_act_sel = false; 697 fibril_mutex_unlock(&nav->io_err_act_lock); 698 699 return err_act; 700 } 701 702 /** I/O error dialog abort button was pressed. 703 * 704 * @param dlg I/O error dialog 705 * @param arg Argument (navigator_t *) 706 */ 707 static void navigator_io_err_abort(io_err_dlg_t *dlg, void *arg) 708 { 709 navigator_t *nav = (navigator_t *)arg; 710 711 io_err_dlg_destroy(dlg); 712 713 fibril_mutex_lock(&nav->io_err_act_lock); 714 nav->io_err_act = fmgt_er_abort; 715 nav->io_err_act_sel = true; 716 fibril_condvar_signal(&nav->io_err_act_cv); 717 fibril_mutex_unlock(&nav->io_err_act_lock); 718 } 719 720 /** I/O error dialog retry button was pressed. 721 * 722 * @param dlg I/O error dialog 723 * @param arg Argument (navigator_t *) 724 */ 725 static void navigator_io_err_retry(io_err_dlg_t *dlg, void *arg) 726 { 727 navigator_t *nav = (navigator_t *)arg; 728 729 io_err_dlg_destroy(dlg); 730 731 fibril_mutex_lock(&nav->io_err_act_lock); 732 nav->io_err_act = fmgt_er_retry; 733 nav->io_err_act_sel = true; 734 fibril_condvar_signal(&nav->io_err_act_cv); 735 fibril_mutex_unlock(&nav->io_err_act_lock); 736 } 737 738 /** I/O error dialog closure requested. 739 * 740 * @param dlg I/O error dialog 741 * @param arg Argument (navigator_t *) 742 */ 743 static void navigator_io_err_close(io_err_dlg_t *dlg, void *arg) 744 { 745 navigator_t *nav = (navigator_t *)arg; 746 747 io_err_dlg_destroy(dlg); 748 749 fibril_mutex_lock(&nav->io_err_act_lock); 750 nav->io_err_act = fmgt_er_abort; 751 nav->io_err_act_sel = true; 752 fibril_condvar_signal(&nav->io_err_act_cv); 753 fibril_mutex_unlock(&nav->io_err_act_lock); 754 } 755 484 756 /** @} 485 757 */ -
uspace/app/nav/nav.h
radbd7e1 raefdccd 1 1 /* 2 * Copyright (c) 202 1Jiri Svoboda2 * Copyright (c) 2025 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 38 38 39 39 #include <errno.h> 40 #include <fmgt.h> 41 #include "types/dlg/progress.h" 40 42 #include "types/nav.h" 41 43 #include "types/panel.h" 44 45 extern progress_dlg_cb_t navigator_progress_cb; 42 46 43 47 extern errno_t navigator_create(const char *, navigator_t **); … … 46 50 extern panel_t *navigator_get_active_panel(navigator_t *); 47 51 extern void navigator_switch_panel(navigator_t *); 52 extern void navigator_refresh_panels(navigator_t *); 53 extern errno_t navigator_worker_start(navigator_t *, void (*)(void *), 54 void *); 55 extern fmgt_error_action_t navigator_io_error_query(void *, fmgt_io_error_t *); 48 56 49 57 #endif -
uspace/app/nav/panel.c
radbd7e1 raefdccd 365 365 } 366 366 367 /** Refresh panel contents. 368 * 369 * @param panel Panel 370 * @return EOK on success or an error code 371 */ 372 errno_t panel_refresh(panel_t *panel) 373 { 374 errno_t rc; 375 376 rc = ui_file_list_refresh(panel->flist); 377 if (rc != EOK) 378 return rc; 379 380 return panel_paint(panel); 381 } 382 367 383 /** Request panel activation. 368 384 * -
uspace/app/nav/panel.h
radbd7e1 raefdccd 1 1 /* 2 * Copyright (c) 202 2Jiri Svoboda2 * Copyright (c) 2025 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 58 58 extern void panel_deactivate(panel_t *); 59 59 extern errno_t panel_read_dir(panel_t *, const char *); 60 extern errno_t panel_refresh(panel_t *); 60 61 extern void panel_activate_req(panel_t *); 61 62 -
uspace/app/nav/types/menu.h
radbd7e1 raefdccd 43 43 /** Navigator menu callbacks */ 44 44 typedef struct nav_menu_cb { 45 /** File / New File */ 46 void (*file_new_file)(void *); 45 47 /** File / Open */ 46 48 void (*file_open)(void *); -
uspace/app/nav/types/nav.h
radbd7e1 raefdccd 1 1 /* 2 * Copyright (c) 202 1Jiri Svoboda2 * Copyright (c) 2025 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 37 37 #define TYPES_NAV_H 38 38 39 #include <fibril.h> 40 #include <fmgt.h> 41 #include <stdbool.h> 39 42 #include <ui/fixed.h> 40 43 #include <ui/ui.h> … … 57 60 /** Panels */ 58 61 struct panel *panel[navigator_panels]; 62 /** Progress dialog */ 63 struct progress_dlg *progress_dlg; 64 /** Worker fibril ID */ 65 fid_t worker_fid; 66 /** Abort current file management operation */ 67 bool abort_op; 68 69 /** @c true if user selected I/O error recovery action */ 70 bool io_err_act_sel; 71 /** Selected I/O error recovery action */ 72 fmgt_error_action_t io_err_act; 73 /** Signalled when user selects I/O error recovery action */ 74 fibril_condvar_t io_err_act_cv; 75 /** Synchronizes access to I/O error recovery action */ 76 fibril_mutex_t io_err_act_lock; 59 77 } navigator_t; 78 79 /** Navigator worker job */ 80 typedef struct { 81 /** Navigator */ 82 navigator_t *navigator; 83 /** Worker function */ 84 void (*wfunc)(void *); 85 /** Worker argument */ 86 void *arg; 87 } navigator_worker_job_t; 60 88 61 89 #endif
Note:
See TracChangeset
for help on using the changeset viewer.
