Changes in uspace/app/nav/nav.c [b336bfd8:13277e3] in mainline
- File:
-
- 1 edited
-
uspace/app/nav/nav.c (modified) (18 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/nav/nav.c
rb336bfd8 r13277e3 1 1 /* 2 * Copyright (c) 202 5Jiri Svoboda2 * Copyright (c) 2026 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 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 51 #include "copy.h" 52 #include "delete.h" 53 #include "dlg/existsdlg.h" 54 #include "dlg/ioerrdlg.h" 47 55 #include "menu.h" 56 #include "move.h" 57 #include "newdir.h" 58 #include "newfile.h" 48 59 #include "nav.h" 49 60 #include "panel.h" 61 #include "rename.h" 62 #include "verify.h" 50 63 51 64 #define EDITOR_CMD "/app/edit" 52 65 66 static void wnd_resize(ui_window_t *, void *); 53 67 static void wnd_close(ui_window_t *, void *); 54 68 static void wnd_kbd(ui_window_t *, void *, kbd_event_t *); 55 69 56 70 static ui_window_cb_t window_cb = { 71 .resize = wnd_resize, 57 72 .close = wnd_close, 58 73 .kbd = wnd_kbd 59 74 }; 60 75 76 static void navigator_file_new_file(void *); 77 static void navigator_file_new_dir(void *); 61 78 static void navigator_file_open(void *); 62 79 static void navigator_file_edit(void *); 80 static void navigator_file_verify(void *); 81 static void navigator_file_copy(void *); 82 static void navigator_file_rename(void *); 83 static void navigator_file_move(void *); 84 static void navigator_file_delete(void *); 63 85 static void navigator_file_exit(void *); 64 86 65 87 static nav_menu_cb_t navigator_menu_cb = { 88 .file_new_file = navigator_file_new_file, 89 .file_new_dir = navigator_file_new_dir, 66 90 .file_open = navigator_file_open, 67 91 .file_edit = navigator_file_edit, 92 .file_verify = navigator_file_verify, 93 .file_copy = navigator_file_copy, 94 .file_rename = navigator_file_rename, 95 .file_move = navigator_file_move, 96 .file_delete = navigator_file_delete, 68 97 .file_exit = navigator_file_exit 69 98 }; 70 99 100 static void navigator_panel_rect(navigator_t *, unsigned, gfx_rect_t *); 71 101 static void navigator_panel_activate_req(void *, panel_t *); 72 102 static void navigator_panel_file_open(void *, panel_t *, const char *); … … 76 106 .file_open = navigator_panel_file_open 77 107 }; 108 109 static void navigator_progress_babort(progress_dlg_t *, void *); 110 static void navigator_progress_close(progress_dlg_t *, void *); 111 112 progress_dlg_cb_t navigator_progress_cb = { 113 .babort = navigator_progress_babort, 114 .close = navigator_progress_close 115 }; 116 117 static void navigator_io_err_abort(io_err_dlg_t *, void *); 118 static void navigator_io_err_retry(io_err_dlg_t *, void *); 119 static void navigator_io_err_close(io_err_dlg_t *, void *); 120 121 static io_err_dlg_cb_t navigator_io_err_dlg_cb = { 122 .babort = navigator_io_err_abort, 123 .bretry = navigator_io_err_retry, 124 .close = navigator_io_err_close 125 }; 126 127 static void navigator_exists_overwrite(exists_dlg_t *, void *); 128 static void navigator_exists_skip(exists_dlg_t *, void *); 129 static void navigator_exists_abort(exists_dlg_t *, void *); 130 static void navigator_exists_close(exists_dlg_t *, void *); 131 132 static exists_dlg_cb_t navigator_exists_dlg_cb = { 133 .boverwrite = navigator_exists_overwrite, 134 .bskip = navigator_exists_skip, 135 .babort = navigator_exists_abort, 136 .close = navigator_exists_close 137 }; 138 139 /** Window size has changed. 140 * 141 * @param window Window 142 * @param arg Argument (navigator) 143 */ 144 static void wnd_resize(ui_window_t *window, void *arg) 145 { 146 navigator_t *navigator = (navigator_t *) arg; 147 unsigned i; 148 gfx_rect_t rect; 149 150 nav_menu_resize(navigator->menu); 151 152 for (i = 0; i < navigator_panels; i++) { 153 navigator_panel_rect(navigator, i, &rect); 154 panel_set_rect(navigator->panel[i], &rect); 155 } 156 } 78 157 79 158 /** Window close button was clicked. … … 104 183 (event->mods & KM_CTRL) != 0) { 105 184 switch (event->key) { 185 case KC_M: 186 navigator_new_file_dlg(navigator); 187 break; 188 case KC_N: 189 navigator_new_dir_dlg(navigator); 190 break; 106 191 case KC_E: 107 192 navigator_file_edit((void *)navigator); 193 break; 194 case KC_V: 195 navigator_file_verify((void *)navigator); 196 break; 197 case KC_C: 198 navigator_file_copy((void *)navigator); 199 break; 200 case KC_X: 201 navigator_file_move((void *)navigator); 202 break; 203 case KC_D: 204 navigator_file_delete((void *)navigator); 205 break; 206 case KC_R: 207 navigator_file_rename((void *)navigator); 108 208 break; 109 209 case KC_Q: … … 129 229 } 130 230 231 /** Compute size of panel rectangle. 232 * 233 * @param navigator Navigator 234 * @param i Panel index (0 .. navigator_panels -1) 235 * @param rect Place to store rectangle. 236 */ 237 static void navigator_panel_rect(navigator_t *navigator, unsigned i, 238 gfx_rect_t *rect) 239 { 240 gfx_rect_t arect; 241 gfx_coord_t pw; 242 243 ui_window_get_app_rect(navigator->window, &arect); 244 245 /* Panel width */ 246 pw = (arect.p1.x - arect.p0.x) / navigator_panels; 247 248 rect->p0.x = arect.p0.x + pw * i; 249 rect->p0.y = arect.p0.y + 1; 250 rect->p1.x = arect.p0.x + pw * (i + 1); 251 rect->p1.y = arect.p1.y - 1; 252 } 253 131 254 /** Create navigator. 132 255 * … … 142 265 gfx_rect_t rect; 143 266 gfx_rect_t arect; 144 gfx_coord_t pw;145 267 unsigned i; 146 268 errno_t rc; … … 164 286 if (rc != EOK) { 165 287 printf("Error creating window.\n"); 288 166 289 goto error; 167 290 } … … 191 314 } 192 315 193 /* Panel width */ 194 pw = (arect.p1.x - arect.p0.x) / 2; 195 196 for (i = 0; i < 2; i++) { 316 /* Create panels. */ 317 for (i = 0; i < navigator_panels; i++) { 197 318 rc = panel_create(navigator->window, i == 0, 198 319 &navigator->panel[i]); … … 200 321 goto error; 201 322 202 rect.p0.x = arect.p0.x + pw * i; 203 rect.p0.y = arect.p0.y + 1; 204 rect.p1.x = arect.p0.x + pw * (i + 1); 205 rect.p1.y = arect.p1.y - 1; 323 navigator_panel_rect(navigator, i, &rect); 206 324 panel_set_rect(navigator->panel[i], &rect); 207 325 … … 229 347 } 230 348 349 fibril_mutex_initialize(&navigator->io_err_act_lock); 350 fibril_condvar_initialize(&navigator->io_err_act_cv); 351 navigator->io_err_act_sel = false; 352 353 fibril_mutex_initialize(&navigator->exists_act_lock); 354 fibril_condvar_initialize(&navigator->exists_act_cv); 355 navigator->exists_act_sel = false; 356 231 357 *rnavigator = navigator; 232 358 return EOK; … … 240 366 unsigned i; 241 367 242 for (i = 0; i < 2; i++) {368 for (i = 0; i < navigator_panels; i++) { 243 369 if (navigator->panel[i] != NULL) { 244 370 ui_fixed_remove(navigator->fixed, … … 287 413 for (i = 0; i < navigator_panels; i++) { 288 414 if (panel_is_active(navigator->panel[i])) 415 return navigator->panel[i]; 416 } 417 418 /* This should not happen */ 419 assert(false); 420 return NULL; 421 } 422 423 /** Get the currently inactive navigator panel. 424 * 425 * @param navigator Navigator 426 * @return Currently inactive panel 427 */ 428 panel_t *navigator_get_inactive_panel(navigator_t *navigator) 429 { 430 int i; 431 432 for (i = 0; i < navigator_panels; i++) { 433 if (!panel_is_active(navigator->panel[i])) 289 434 return navigator->panel[i]; 290 435 } … … 318 463 } 319 464 465 /** Refresh navigator panels. 466 * 467 * This needs to be called when the disk/directory contents might have 468 * changed. 469 * 470 * @param navigator Navigator 471 */ 472 void navigator_refresh_panels(navigator_t *navigator) 473 { 474 errno_t rc; 475 unsigned i; 476 477 /* First refresh inactive panel. */ 478 479 for (i = 0; i < navigator_panels; i++) { 480 if (!panel_is_active(navigator->panel[i])) { 481 rc = panel_refresh(navigator->panel[i]); 482 if (rc != EOK) 483 return; 484 } 485 } 486 487 /* 488 * Refresh active panel last so that working directory is left 489 * to that of the active panel. 490 */ 491 492 for (i = 0; i < navigator_panels; i++) { 493 if (panel_is_active(navigator->panel[i])) { 494 rc = panel_refresh(navigator->panel[i]); 495 if (rc != EOK) 496 return; 497 } 498 } 499 } 500 501 /** File / New File menu entry selected */ 502 static void navigator_file_new_file(void *arg) 503 { 504 navigator_t *navigator = (navigator_t *)arg; 505 506 navigator_new_file_dlg(navigator); 507 } 508 509 /** File / New Directory menu entry selected */ 510 static void navigator_file_new_dir(void *arg) 511 { 512 navigator_t *navigator = (navigator_t *)arg; 513 514 navigator_new_dir_dlg(navigator); 515 } 516 320 517 /** File / Open menu entry selected */ 321 518 static void navigator_file_open(void *arg) … … 361 558 return rc; 362 559 560 navigator_refresh_panels(navigator); 363 561 (void) ui_paint(navigator->ui); 364 562 return EOK; … … 402 600 return rc; 403 601 602 navigator_refresh_panels(navigator); 603 404 604 (void) ui_paint(navigator->ui); 405 605 return EOK; … … 447 647 } 448 648 649 /** File / Verify menu entry selected */ 650 static void navigator_file_verify(void *arg) 651 { 652 navigator_t *navigator = (navigator_t *)arg; 653 654 ui_file_list_entry_t *entry; 655 ui_file_list_entry_attr_t attr; 656 fmgt_flist_t *flist; 657 panel_t *panel; 658 errno_t rc; 659 660 panel = navigator_get_active_panel(navigator); 661 entry = ui_file_list_get_cursor(panel->flist); 662 ui_file_list_entry_get_attr(entry, &attr); 663 664 rc = fmgt_flist_create(&flist); 665 if (rc != EOK) 666 return; 667 668 rc = fmgt_flist_append(flist, attr.name); 669 if (rc != EOK) { 670 fmgt_flist_destroy(flist); 671 return; 672 } 673 674 /* flist ownership transferred */ 675 navigator_verify_dlg(navigator, flist); 676 } 677 678 /** File / Copy menu entry selected */ 679 static void navigator_file_copy(void *arg) 680 { 681 navigator_t *navigator = (navigator_t *)arg; 682 683 ui_file_list_entry_t *entry; 684 ui_file_list_entry_attr_t attr; 685 fmgt_flist_t *flist; 686 panel_t *panel; 687 errno_t rc; 688 689 panel = navigator_get_active_panel(navigator); 690 entry = ui_file_list_get_cursor(panel->flist); 691 ui_file_list_entry_get_attr(entry, &attr); 692 693 rc = fmgt_flist_create(&flist); 694 if (rc != EOK) 695 return; 696 697 rc = fmgt_flist_append(flist, attr.name); 698 if (rc != EOK) { 699 fmgt_flist_destroy(flist); 700 return; 701 } 702 703 /* flist ownership transferred */ 704 navigator_copy_dlg(navigator, flist); 705 } 706 707 /** File / Move menu entry selected */ 708 static void navigator_file_move(void *arg) 709 { 710 navigator_t *navigator = (navigator_t *)arg; 711 712 ui_file_list_entry_t *entry; 713 ui_file_list_entry_attr_t attr; 714 fmgt_flist_t *flist; 715 panel_t *panel; 716 errno_t rc; 717 718 panel = navigator_get_active_panel(navigator); 719 entry = ui_file_list_get_cursor(panel->flist); 720 ui_file_list_entry_get_attr(entry, &attr); 721 722 rc = fmgt_flist_create(&flist); 723 if (rc != EOK) 724 return; 725 726 rc = fmgt_flist_append(flist, attr.name); 727 if (rc != EOK) { 728 fmgt_flist_destroy(flist); 729 return; 730 } 731 732 /* flist ownership transferred */ 733 navigator_move_dlg(navigator, flist); 734 } 735 736 /** File / Delete menu entry selected */ 737 static void navigator_file_delete(void *arg) 738 { 739 navigator_t *navigator = (navigator_t *)arg; 740 741 ui_file_list_entry_t *entry; 742 ui_file_list_entry_attr_t attr; 743 fmgt_flist_t *flist; 744 panel_t *panel; 745 errno_t rc; 746 747 panel = navigator_get_active_panel(navigator); 748 entry = ui_file_list_get_cursor(panel->flist); 749 ui_file_list_entry_get_attr(entry, &attr); 750 751 rc = fmgt_flist_create(&flist); 752 if (rc != EOK) 753 return; 754 755 rc = fmgt_flist_append(flist, attr.name); 756 if (rc != EOK) { 757 fmgt_flist_destroy(flist); 758 return; 759 } 760 761 /* flist ownership transferred */ 762 navigator_delete_dlg(navigator, flist); 763 } 764 765 /** File / Rename menu entry selected */ 766 static void navigator_file_rename(void *arg) 767 { 768 navigator_t *navigator = (navigator_t *)arg; 769 770 ui_file_list_entry_t *entry; 771 ui_file_list_entry_attr_t attr; 772 panel_t *panel; 773 774 panel = navigator_get_active_panel(navigator); 775 entry = ui_file_list_get_cursor(panel->flist); 776 ui_file_list_entry_get_attr(entry, &attr); 777 778 /* flist ownership transferred */ 779 navigator_rename_dlg(navigator, attr.name); 780 } 781 449 782 /** File / Exit menu entry selected */ 450 783 static void navigator_file_exit(void *arg) … … 482 815 } 483 816 817 /** Wrapper fibril function for worker function. 818 * 819 * This is the main fibril function for the worker fibril. It executes 820 * the worker function, then clears worker FID to indicate the worker 821 * is finished. 822 * 823 * @param arg Argument (navigator_worker_job_t *) 824 * @return EOK 825 */ 826 static errno_t navigator_worker_func(void *arg) 827 { 828 navigator_worker_job_t *job = (navigator_worker_job_t *)arg; 829 830 job->wfunc(job->arg); 831 job->navigator->worker_fid = 0; 832 free(job); 833 return EOK; 834 } 835 836 /** Start long-time work in a worker fibril. 837 * 838 * Actions which can take time (file operations) cannot block the main UI 839 * fibril. This function will start an action in the worker fibril, i.e., 840 * in the background. At the same time the caller should create a modal 841 * progress dialog that will be shown until the work is completed. 842 * 843 * (Only a single worker can execute at any given time). 844 * 845 * @param nav Navigator 846 * @param wfunc Worker main function 847 * @param arg Argument to worker function 848 * 849 * @return EOK on success or an error code 850 */ 851 errno_t navigator_worker_start(navigator_t *nav, void (*wfunc)(void *), 852 void *arg) 853 { 854 navigator_worker_job_t *job; 855 856 if (nav->worker_fid != 0) 857 return EBUSY; 858 859 job = calloc(1, sizeof(navigator_worker_job_t)); 860 if (job == NULL) 861 return ENOMEM; 862 863 job->navigator = nav; 864 job->wfunc = wfunc; 865 job->arg = arg; 866 867 nav->worker_fid = fibril_create(navigator_worker_func, (void *)job); 868 if (nav->worker_fid == 0) { 869 free(job); 870 return ENOMEM; 871 } 872 873 fibril_add_ready(nav->worker_fid); 874 return EOK; 875 } 876 877 /** Abort button pressed in progress dialog. 878 * 879 * @param dlg Progress dialog 880 * @param arg Argument (navigator_t *) 881 */ 882 static void navigator_progress_babort(progress_dlg_t *dlg, void *arg) 883 { 884 navigator_t *nav = (navigator_t *)arg; 885 886 (void)dlg; 887 nav->abort_op = true; 888 } 889 890 /** Progress dialog closed, 891 * 892 * @param dlg Progress dialog 893 * @param arg Argument (navigator_t *) 894 */ 895 static void navigator_progress_close(progress_dlg_t *dlg, void *arg) 896 { 897 navigator_t *nav = (navigator_t *)arg; 898 899 (void)dlg; 900 nav->abort_op = true; 901 } 902 903 /** Called by fmgt to query for I/O error recovery action. 904 * 905 * @param arg Argument (navigator_t *) 906 * @param err I/O error report 907 * @return Recovery action to take. 908 */ 909 fmgt_error_action_t navigator_io_error_query(void *arg, fmgt_io_error_t *err) 910 { 911 navigator_t *nav = (navigator_t *)arg; 912 io_err_dlg_t *dlg; 913 io_err_dlg_params_t params; 914 fmgt_error_action_t err_act; 915 char *text1; 916 const char *fmt = NULL; 917 errno_t rc; 918 int rv; 919 920 switch (err->optype) { 921 case fmgt_io_write: 922 fmt = "Error reading file %s."; 923 break; 924 case fmgt_io_read: 925 fmt = "Error writing file %s."; 926 break; 927 case fmgt_io_open: 928 fmt = "Error opening %s."; 929 break; 930 case fmgt_io_create: 931 fmt = "Error creating %s."; 932 break; 933 case fmgt_io_delete: 934 fmt = "Error deleting %s."; 935 break; 936 case fmgt_io_rename: 937 fmt = "Error renaming %s."; 938 break; 939 } 940 941 io_err_dlg_params_init(¶ms); 942 rv = asprintf(&text1, fmt, err->fname); 943 if (rv < 0) 944 return fmgt_er_abort; 945 946 params.text1 = text1; 947 params.text2 = str_error(err->rc); 948 949 ui_lock(nav->ui); 950 rc = io_err_dlg_create(nav->ui, ¶ms, &dlg); 951 if (rc != EOK) { 952 ui_unlock(nav->ui); 953 free(text1); 954 return fmgt_er_abort; 955 } 956 957 io_err_dlg_set_cb(dlg, &navigator_io_err_dlg_cb, (void *)nav); 958 959 ui_unlock(nav->ui); 960 free(text1); 961 962 fibril_mutex_lock(&nav->io_err_act_lock); 963 964 while (!nav->io_err_act_sel) { 965 fibril_condvar_wait(&nav->io_err_act_cv, 966 &nav->io_err_act_lock); 967 } 968 969 err_act = nav->io_err_act; 970 nav->io_err_act_sel = false; 971 fibril_mutex_unlock(&nav->io_err_act_lock); 972 973 return err_act; 974 } 975 976 /** I/O error dialog abort button was pressed. 977 * 978 * @param dlg I/O error dialog 979 * @param arg Argument (navigator_t *) 980 */ 981 static void navigator_io_err_abort(io_err_dlg_t *dlg, void *arg) 982 { 983 navigator_t *nav = (navigator_t *)arg; 984 985 io_err_dlg_destroy(dlg); 986 987 fibril_mutex_lock(&nav->io_err_act_lock); 988 nav->io_err_act = fmgt_er_abort; 989 nav->io_err_act_sel = true; 990 fibril_condvar_signal(&nav->io_err_act_cv); 991 fibril_mutex_unlock(&nav->io_err_act_lock); 992 } 993 994 /** I/O error dialog retry button was pressed. 995 * 996 * @param dlg I/O error dialog 997 * @param arg Argument (navigator_t *) 998 */ 999 static void navigator_io_err_retry(io_err_dlg_t *dlg, void *arg) 1000 { 1001 navigator_t *nav = (navigator_t *)arg; 1002 1003 io_err_dlg_destroy(dlg); 1004 1005 fibril_mutex_lock(&nav->io_err_act_lock); 1006 nav->io_err_act = fmgt_er_retry; 1007 nav->io_err_act_sel = true; 1008 fibril_condvar_signal(&nav->io_err_act_cv); 1009 fibril_mutex_unlock(&nav->io_err_act_lock); 1010 } 1011 1012 /** I/O error dialog closure requested. 1013 * 1014 * @param dlg I/O error dialog 1015 * @param arg Argument (navigator_t *) 1016 */ 1017 static void navigator_io_err_close(io_err_dlg_t *dlg, void *arg) 1018 { 1019 navigator_t *nav = (navigator_t *)arg; 1020 1021 io_err_dlg_destroy(dlg); 1022 1023 fibril_mutex_lock(&nav->io_err_act_lock); 1024 nav->io_err_act = fmgt_er_abort; 1025 nav->io_err_act_sel = true; 1026 fibril_condvar_signal(&nav->io_err_act_cv); 1027 fibril_mutex_unlock(&nav->io_err_act_lock); 1028 } 1029 1030 /** Called by fmgt to query for file/directory exists recovery action. 1031 * 1032 * @param arg Argument (navigator_t *) 1033 * @param exists File/directory exists report 1034 * @return Recovery action to take. 1035 */ 1036 fmgt_exists_action_t navigator_exists_query(void *arg, fmgt_exists_t *exists) 1037 { 1038 navigator_t *nav = (navigator_t *)arg; 1039 exists_dlg_t *dlg; 1040 exists_dlg_params_t params; 1041 fmgt_exists_action_t exists_act; 1042 char *text1; 1043 errno_t rc; 1044 int rv; 1045 1046 exists_dlg_params_init(¶ms); 1047 rv = asprintf(&text1, "File %s exists.", exists->fname); 1048 if (rv < 0) 1049 return fmgt_exr_abort; 1050 1051 params.text1 = text1; 1052 1053 ui_lock(nav->ui); 1054 rc = exists_dlg_create(nav->ui, ¶ms, &dlg); 1055 if (rc != EOK) { 1056 ui_unlock(nav->ui); 1057 free(text1); 1058 return fmgt_exr_abort; 1059 } 1060 1061 exists_dlg_set_cb(dlg, &navigator_exists_dlg_cb, (void *)nav); 1062 1063 ui_unlock(nav->ui); 1064 free(text1); 1065 1066 fibril_mutex_lock(&nav->exists_act_lock); 1067 1068 while (!nav->exists_act_sel) { 1069 fibril_condvar_wait(&nav->exists_act_cv, 1070 &nav->exists_act_lock); 1071 } 1072 1073 exists_act = nav->exists_act; 1074 nav->exists_act_sel = false; 1075 fibril_mutex_unlock(&nav->exists_act_lock); 1076 1077 return exists_act; 1078 } 1079 1080 /** File/directory exists dialog overwrite button was pressed. 1081 * 1082 * @param dlg File/directory exists dialog 1083 * @param arg Argument (navigator_t *) 1084 */ 1085 static void navigator_exists_overwrite(exists_dlg_t *dlg, void *arg) 1086 { 1087 navigator_t *nav = (navigator_t *)arg; 1088 1089 exists_dlg_destroy(dlg); 1090 1091 fibril_mutex_lock(&nav->exists_act_lock); 1092 nav->exists_act = fmgt_exr_overwrite; 1093 nav->exists_act_sel = true; 1094 fibril_condvar_signal(&nav->exists_act_cv); 1095 fibril_mutex_unlock(&nav->exists_act_lock); 1096 } 1097 1098 /** File/directory exists dialog skip button was pressed. 1099 * 1100 * @param dlg File/directory exists dialog 1101 * @param arg Argument (navigator_t *) 1102 */ 1103 static void navigator_exists_skip(exists_dlg_t *dlg, void *arg) 1104 { 1105 navigator_t *nav = (navigator_t *)arg; 1106 1107 exists_dlg_destroy(dlg); 1108 1109 fibril_mutex_lock(&nav->exists_act_lock); 1110 nav->exists_act = fmgt_exr_skip; 1111 nav->exists_act_sel = true; 1112 fibril_condvar_signal(&nav->exists_act_cv); 1113 fibril_mutex_unlock(&nav->exists_act_lock); 1114 } 1115 1116 /** File/directory exists dialog abort button was pressed. 1117 * 1118 * @param dlg File/directory exists dialog 1119 * @param arg Argument (navigator_t *) 1120 */ 1121 static void navigator_exists_abort(exists_dlg_t *dlg, void *arg) 1122 { 1123 navigator_t *nav = (navigator_t *)arg; 1124 1125 exists_dlg_destroy(dlg); 1126 1127 fibril_mutex_lock(&nav->exists_act_lock); 1128 nav->exists_act = fmgt_exr_abort; 1129 nav->exists_act_sel = true; 1130 fibril_condvar_signal(&nav->exists_act_cv); 1131 fibril_mutex_unlock(&nav->exists_act_lock); 1132 } 1133 1134 /** File/directory exists dialog closure requested. 1135 * 1136 * @param dlg File/directory exists dialog 1137 * @param arg Argument (navigator_t *) 1138 */ 1139 static void navigator_exists_close(exists_dlg_t *dlg, void *arg) 1140 { 1141 navigator_t *nav = (navigator_t *)arg; 1142 1143 exists_dlg_destroy(dlg); 1144 1145 fibril_mutex_lock(&nav->exists_act_lock); 1146 nav->exists_act = fmgt_exr_abort; 1147 nav->exists_act_sel = true; 1148 fibril_condvar_signal(&nav->exists_act_cv); 1149 fibril_mutex_unlock(&nav->exists_act_lock); 1150 } 1151 484 1152 /** @} 485 1153 */
Note:
See TracChangeset
for help on using the changeset viewer.
