Changeset c111da2 in mainline for uspace/app/nav
- Timestamp:
- 2025-10-09T15:44:52Z (5 months ago)
- Branches:
- master
- Children:
- cfd04c4
- Parents:
- 1a96db9
- Location:
- uspace/app/nav
- Files:
-
- 4 added
- 7 edited
-
dlg/newfiledlg.c (modified) (4 diffs)
-
dlg/progress.c (added)
-
dlg/progress.h (added)
-
meson.build (modified) (2 diffs)
-
nav.c (modified) (2 diffs)
-
nav.h (modified) (1 diff)
-
newfile.c (modified) (6 diffs)
-
types/dlg/newfiledlg.h (modified) (1 diff)
-
types/dlg/progress.h (added)
-
types/nav.h (modified) (3 diffs)
-
types/newfile.h (added)
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/nav/dlg/newfiledlg.c
r1a96db9 rc111da2 358 358 359 359 (void)window; 360 if (dialog->cb != NULL && dialog->cb-> bcancel!= NULL) {360 if (dialog->cb != NULL && dialog->cb->close != NULL) { 361 361 dialog->cb->close(dialog, dialog->arg); 362 362 } … … 373 373 { 374 374 new_file_dlg_t *dialog = (new_file_dlg_t *) arg; 375 const char *text; 375 const char *fname; 376 const char *fsize; 376 377 377 378 if (event->type == KEY_PRESS && … … 380 381 /* Confirm */ 381 382 if (dialog->cb != NULL && dialog->cb->bok != NULL) { 382 text = ui_entry_get_text(dialog->ename); 383 dialog->cb->bok(dialog, dialog->arg, text); 383 fname = ui_entry_get_text(dialog->ename); 384 fsize = ui_entry_get_text(dialog->esize); 385 dialog->cb->bok(dialog, dialog->arg, fname, 386 fsize); 384 387 return; 385 388 } … … 404 407 { 405 408 new_file_dlg_t *dialog = (new_file_dlg_t *) arg; 406 const char *text; 409 const char *fname; 410 const char *fsize; 407 411 408 412 if (dialog->cb != NULL && dialog->cb->bok != NULL) { 409 text = ui_entry_get_text(dialog->ename); 410 dialog->cb->bok(dialog, dialog->arg, text); 413 fname = ui_entry_get_text(dialog->ename); 414 fsize = ui_entry_get_text(dialog->esize); 415 dialog->cb->bok(dialog, dialog->arg, fname, fsize); 411 416 } 412 417 } -
uspace/app/nav/meson.build
r1a96db9 rc111da2 30 30 src = files( 31 31 'dlg/newfiledlg.c', 32 'dlg/progress.c', 32 33 'main.c', 33 34 'menu.c', … … 39 40 test_src = files( 40 41 'dlg/newfiledlg.c', 42 'dlg/progress.c', 41 43 'menu.c', 42 44 'nav.c', -
uspace/app/nav/nav.c
r1a96db9 rc111da2 35 35 */ 36 36 37 #include <fibril.h> 37 38 #include <gfx/coord.h> 38 39 #include <stdio.h> … … 535 536 } 536 537 538 /** Wrapper fibril function for worker function. 539 * 540 * This is the main fibril function for the worker fibril. It executes 541 * the worker function, then clears worker FID to indicate the worker 542 * is finished. 543 * 544 * @param arg Argument (navigator_worker_job_t *) 545 * @return EOK 546 */ 547 static errno_t navigator_worker_func(void *arg) 548 { 549 navigator_worker_job_t *job = (navigator_worker_job_t *)arg; 550 551 job->wfunc(job->arg); 552 job->navigator->worker_fid = 0; 553 free(job); 554 return EOK; 555 } 556 557 /** Start long-time work in a worker fibril. 558 * 559 * Actions which can take time (file operations) cannot block the main UI 560 * fibril. This function will start an action in the worker fibril, i.e., 561 * in the background. At the same time the caller should create a modal 562 * progress dialog that will be shown until the work is completed. 563 * 564 * (Only a single worker can execute at any given time). 565 * 566 * @param nav Navigator 567 * @param wfunc Worker main function 568 * @param arg Argument to worker function 569 * 570 * @return EOK on success or an error code 571 */ 572 errno_t navigator_worker_start(navigator_t *nav, void (*wfunc)(void *), 573 void *arg) 574 { 575 navigator_worker_job_t *job; 576 577 if (nav->worker_fid != 0) 578 return EBUSY; 579 580 job = calloc(1, sizeof(navigator_worker_job_t)); 581 if (job == NULL) 582 return ENOMEM; 583 584 job->navigator = nav; 585 job->wfunc = wfunc; 586 job->arg = arg; 587 588 nav->worker_fid = fibril_create(navigator_worker_func, (void *)job); 589 if (nav->worker_fid == 0) { 590 free(job); 591 return ENOMEM; 592 } 593 594 fibril_add_ready(nav->worker_fid); 595 return EOK; 596 } 597 537 598 /** @} 538 599 */ -
uspace/app/nav/nav.h
r1a96db9 rc111da2 47 47 extern void navigator_switch_panel(navigator_t *); 48 48 extern void navigator_refresh_panels(navigator_t *); 49 extern errno_t navigator_worker_start(navigator_t *, void (*)(void *), 50 void *); 49 51 50 52 #endif -
uspace/app/nav/newfile.c
r1a96db9 rc111da2 34 34 */ 35 35 36 #include <capa.h> 37 #include <fmgt.h> 36 38 #include <stdlib.h> 37 39 #include <str_error.h> … … 42 44 #include <ui/ui.h> 43 45 #include <ui/window.h> 46 #include <str.h> 44 47 #include "dlg/newfiledlg.h" 48 #include "dlg/progress.h" 45 49 #include "menu.h" 46 50 #include "newfile.h" 47 51 #include "nav.h" 48 49 static void new_file_bok(new_file_dlg_t *, void *, const char *); 52 #include "types/newfile.h" 53 54 static void new_file_bok(new_file_dlg_t *, void *, const char *, const char *); 50 55 static void new_file_bcancel(new_file_dlg_t *, void *); 51 56 static void new_file_close(new_file_dlg_t *, void *); … … 57 62 }; 58 63 64 static void new_file_progress(void *, fmgt_progress_t *); 65 66 static fmgt_cb_t new_file_fmgt_cb = { 67 .progress = new_file_progress 68 }; 69 59 70 /** Open New File dialog. 60 71 * … … 69 80 } 70 81 82 /** New file worker function. 83 * 84 * @param arg Argument (navigator_new_file_job_t) 85 */ 86 static void new_file_wfunc(void *arg) 87 { 88 fmgt_t *fmgt = NULL; 89 navigator_new_file_job_t *job = (navigator_new_file_job_t *)arg; 90 char *msg = NULL; 91 navigator_t *nav = job->navigator; 92 ui_msg_dialog_t *dialog = NULL; 93 ui_msg_dialog_params_t params; 94 errno_t rc; 95 int rv; 96 97 rc = fmgt_create(&fmgt); 98 if (rc != EOK) { 99 /* out of memory */ 100 return; 101 } 102 103 fmgt_set_cb(fmgt, &new_file_fmgt_cb, (void *)nav); 104 fmgt_set_init_update(fmgt, true); 105 106 rc = fmgt_new_file(fmgt, job->fname, job->nbytes); 107 if (rc != EOK) { 108 rv = asprintf(&msg, "Error creating file (%s).", 109 str_error(rc)); 110 if (rv < 0) 111 return; 112 goto error; 113 } 114 115 fmgt_destroy(fmgt); 116 ui_lock(nav->ui); 117 progress_dlg_destroy(nav->progress_dlg); 118 navigator_refresh_panels(nav); 119 ui_unlock(nav->ui); 120 free(job); 121 return; 122 error: 123 ui_lock(nav->ui); 124 progress_dlg_destroy(nav->progress_dlg); 125 ui_msg_dialog_params_init(¶ms); 126 params.caption = "Error"; 127 params.text = msg; 128 (void) ui_msg_dialog_create(nav->ui, ¶ms, &dialog); 129 ui_unlock(nav->ui); 130 free(msg); 131 } 132 71 133 /** New file dialog confirmed. 72 134 * … … 74 136 * @param arg Argument (navigator_t *) 75 137 * @param fname New file name 76 */ 77 static void new_file_bok(new_file_dlg_t *dlg, void *arg, const char *fname) 138 * @param fsize New file size 139 */ 140 static void new_file_bok(new_file_dlg_t *dlg, void *arg, const char *fname, 141 const char *fsize) 78 142 { 79 143 navigator_t *nav = (navigator_t *)arg; 80 144 ui_msg_dialog_t *dialog = NULL; 145 navigator_new_file_job_t *job; 81 146 ui_msg_dialog_params_t params; 147 progress_dlg_params_t pd_params; 148 capa_spec_t fcap; 82 149 char *msg = NULL; 150 errno_t rc; 151 uint64_t nbytes; 83 152 int rv; 84 FILE *f; 153 154 rc = capa_parse(fsize, &fcap); 155 if (rc != EOK) { 156 /* invalid file size */ 157 return; 158 } 85 159 86 160 new_file_dlg_destroy(dlg); 87 f = fopen(fname, "wx"); 88 if (f == NULL) {89 rv = asprintf(&msg, "Error creating file (%s).",90 str_error(errno));161 162 rc = capa_to_blocks(&fcap, cv_nom, 1, &nbytes); 163 if (rc != EOK) { 164 rv = asprintf(&msg, "File size too large (%s).", fsize); 91 165 if (rv < 0) 92 166 return; 93 94 ui_msg_dialog_params_init(¶ms); 95 params.caption = "Error"; 96 params.text = msg; 97 (void) ui_msg_dialog_create(nav->ui, ¶ms, &dialog); 98 free(msg); 167 goto error; 168 } 169 170 job = calloc(1, sizeof(navigator_new_file_job_t)); 171 if (job == NULL) 99 172 return; 100 } 101 102 fclose(f); 103 navigator_refresh_panels(nav); 173 174 job->navigator = nav; 175 job->fname = fname; 176 job->nbytes = nbytes; 177 178 progress_dlg_params_init(&pd_params); 179 pd_params.caption = "Creating new file"; 180 181 rc = progress_dlg_create(nav->ui, &pd_params, &nav->progress_dlg); 182 if (rc != EOK) { 183 msg = str_dup("Out of memory."); 184 if (msg == NULL) 185 return; 186 goto error; 187 } 188 189 rc = navigator_worker_start(nav, new_file_wfunc, (void *)job); 190 if (rc != EOK) { 191 msg = str_dup("Out of memory."); 192 if (msg == NULL) 193 return; 194 goto error; 195 } 196 197 return; 198 error: 199 ui_msg_dialog_params_init(¶ms); 200 params.caption = "Error"; 201 params.text = msg; 202 (void) ui_msg_dialog_create(nav->ui, ¶ms, &dialog); 203 free(msg); 104 204 } 105 205 … … 126 226 } 127 227 228 /** New file progress update. 229 * 230 * @param arg Argument (navigator_t *) 231 * @param progress Progress update 232 */ 233 static void new_file_progress(void *arg, fmgt_progress_t *progress) 234 { 235 navigator_t *nav = (navigator_t *)arg; 236 char buf[128]; 237 238 snprintf(buf, sizeof(buf), "Written %s of %s (%s done).", 239 progress->curf_procb, progress->curf_totalb, 240 progress->curf_percent); 241 progress_dlg_set_curf_prog(nav->progress_dlg, buf); 242 } 243 128 244 /** @} 129 245 */ -
uspace/app/nav/types/dlg/newfiledlg.h
r1a96db9 rc111da2 60 60 } new_file_dlg_t; 61 61 62 /** Prompt dialog callback*/62 /** New File dialog callbacks */ 63 63 typedef struct new_file_dlg_cb { 64 64 /** OK button was pressed */ 65 void (*bok)(new_file_dlg_t *, void *, const char * );65 void (*bok)(new_file_dlg_t *, void *, const char *, const char *); 66 66 /** Cancel button was pressed */ 67 67 void (*bcancel)(new_file_dlg_t *, void *); -
uspace/app/nav/types/nav.h
r1a96db9 rc111da2 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> 39 40 #include <ui/fixed.h> 40 41 #include <ui/ui.h> … … 57 58 /** Panels */ 58 59 struct panel *panel[navigator_panels]; 60 /** Progress dialog */ 61 struct progress_dlg *progress_dlg; 62 /** Worker fibril ID */ 63 fid_t worker_fid; 59 64 } navigator_t; 65 66 /** Navigator worker job */ 67 typedef struct { 68 /** Navigator */ 69 navigator_t *navigator; 70 /** Worker function */ 71 void (*wfunc)(void *); 72 /** Worker argument */ 73 void *arg; 74 } navigator_worker_job_t; 60 75 61 76 #endif
Note:
See TracChangeset
for help on using the changeset viewer.
