Changeset aefdccd in mainline for uspace/app/nav


Ignore:
Timestamp:
2025-10-20T06:14:54Z (5 months ago)
Author:
GitHub <noreply@…>
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)
Message:

Merge branch 'HelenOS:master' into ticket/packet-capture

Location:
uspace/app/nav
Files:
12 added
9 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/nav/menu.c

    radbd7e1 raefdccd  
    5454        nav_menu_t *menu;
    5555        ui_menu_t *mfile;
     56        ui_menu_entry_t *mnew;
    5657        ui_menu_entry_t *mopen;
    5758        ui_menu_entry_t *medit;
     
    7879                goto error;
    7980
     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
    8087        rc = ui_menu_entry_create(mfile, "~O~pen", "Enter", &mopen);
    8188        if (rc != EOK)
     
    148155}
    149156
     157/** File / New File menu entry selected.
     158 *
     159 * @param mentry Menu entry
     160 * @param arg Argument (navigator_t *)
     161 */
     162void 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
    150170/** File / Open menu entry selected.
    151171 *
  • uspace/app/nav/menu.h

    radbd7e1 raefdccd  
    4646extern void nav_menu_destroy(nav_menu_t *);
    4747extern ui_control_t *nav_menu_ctl(nav_menu_t *);
     48extern void nav_menu_file_new_file(ui_menu_entry_t *, void *);
    4849extern void nav_menu_file_open(ui_menu_entry_t *, void *);
    4950extern void nav_menu_file_edit(ui_menu_entry_t *, void *);
  • uspace/app/nav/meson.build

    radbd7e1 raefdccd  
    11#
    2 # Copyright (c) 2021 Jiri Svoboda
     2# Copyright (c) 2025 Jiri Svoboda
    33# All rights reserved.
    44#
     
    2727#
    2828
    29 deps = [ 'ui' ]
     29deps = [ 'fmgt', 'ui' ]
    3030src = files(
     31        'dlg/ioerrdlg.c',
     32        'dlg/newfiledlg.c',
     33        'dlg/progress.c',
    3134        'main.c',
    3235        'menu.c',
    3336        'nav.c',
     37        'newfile.c',
    3438        'panel.c',
    3539)
    3640
    3741test_src = files(
     42        'dlg/ioerrdlg.c',
     43        'dlg/newfiledlg.c',
     44        'dlg/progress.c',
    3845        'menu.c',
    3946        'nav.c',
     47        'newfile.c',
    4048        'panel.c',
    4149        'test/main.c',
  • uspace/app/nav/nav.c

    radbd7e1 raefdccd  
    3535 */
    3636
     37#include <fibril.h>
     38#include <fmgt.h>
    3739#include <gfx/coord.h>
    3840#include <stdio.h>
    3941#include <stdlib.h>
    4042#include <str.h>
     43#include <str_error.h>
    4144#include <task.h>
    4245#include <ui/fixed.h>
     
    4548#include <ui/ui.h>
    4649#include <ui/window.h>
     50#include "dlg/ioerrdlg.h"
    4751#include "menu.h"
     52#include "newfile.h"
    4853#include "nav.h"
    4954#include "panel.h"
     
    5964};
    6065
     66static void navigator_file_new_file(void *);
    6167static void navigator_file_open(void *);
    6268static void navigator_file_edit(void *);
     
    6470
    6571static nav_menu_cb_t navigator_menu_cb = {
     72        .file_new_file = navigator_file_new_file,
    6673        .file_open = navigator_file_open,
    6774        .file_edit = navigator_file_edit,
     
    7582        .activate_req = navigator_panel_activate_req,
    7683        .file_open = navigator_panel_file_open
     84};
     85
     86static void navigator_progress_babort(progress_dlg_t *, void *);
     87static void navigator_progress_close(progress_dlg_t *, void *);
     88
     89progress_dlg_cb_t navigator_progress_cb = {
     90        .babort = navigator_progress_babort,
     91        .close = navigator_progress_close
     92};
     93
     94static void navigator_io_err_abort(io_err_dlg_t *, void *);
     95static void navigator_io_err_retry(io_err_dlg_t *, void *);
     96static void navigator_io_err_close(io_err_dlg_t *, void *);
     97
     98static 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
    77102};
    78103
     
    104129            (event->mods & KM_CTRL) != 0) {
    105130                switch (event->key) {
     131                case KC_M:
     132                        navigator_new_file_dlg(navigator);
     133                        break;
    106134                case KC_E:
    107135                        navigator_file_edit((void *)navigator);
     
    228256                goto error;
    229257        }
     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;
    230262
    231263        *rnavigator = navigator;
     
    318350}
    319351
     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 */
     359void 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 */
     389static void navigator_file_new_file(void *arg)
     390{
     391        navigator_t *navigator = (navigator_t *)arg;
     392
     393        navigator_new_file_dlg(navigator);
     394}
     395
    320396/** File / Open menu entry selected */
    321397static void navigator_file_open(void *arg)
     
    361437                return rc;
    362438
     439        navigator_refresh_panels(navigator);
    363440        (void) ui_paint(navigator->ui);
    364441        return EOK;
     
    402479                return rc;
    403480
     481        navigator_refresh_panels(navigator);
     482
    404483        (void) ui_paint(navigator->ui);
    405484        return EOK;
     
    482561}
    483562
     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 */
     572static 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 */
     597errno_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 */
     628static 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 */
     641static 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 */
     655fmgt_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(&params);
     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, &params, &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 */
     707static 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 */
     725static 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 */
     743static 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
    484756/** @}
    485757 */
  • uspace/app/nav/nav.h

    radbd7e1 raefdccd  
    11/*
    2  * Copyright (c) 2021 Jiri Svoboda
     2 * Copyright (c) 2025 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    3838
    3939#include <errno.h>
     40#include <fmgt.h>
     41#include "types/dlg/progress.h"
    4042#include "types/nav.h"
    4143#include "types/panel.h"
     44
     45extern progress_dlg_cb_t navigator_progress_cb;
    4246
    4347extern errno_t navigator_create(const char *, navigator_t **);
     
    4650extern panel_t *navigator_get_active_panel(navigator_t *);
    4751extern void navigator_switch_panel(navigator_t *);
     52extern void navigator_refresh_panels(navigator_t *);
     53extern errno_t navigator_worker_start(navigator_t *, void (*)(void *),
     54    void *);
     55extern fmgt_error_action_t navigator_io_error_query(void *, fmgt_io_error_t *);
    4856
    4957#endif
  • uspace/app/nav/panel.c

    radbd7e1 raefdccd  
    365365}
    366366
     367/** Refresh panel contents.
     368 *
     369 * @param panel Panel
     370 * @return EOK on success or an error code
     371 */
     372errno_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
    367383/** Request panel activation.
    368384 *
  • uspace/app/nav/panel.h

    radbd7e1 raefdccd  
    11/*
    2  * Copyright (c) 2022 Jiri Svoboda
     2 * Copyright (c) 2025 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    5858extern void panel_deactivate(panel_t *);
    5959extern errno_t panel_read_dir(panel_t *, const char *);
     60extern errno_t panel_refresh(panel_t *);
    6061extern void panel_activate_req(panel_t *);
    6162
  • uspace/app/nav/types/menu.h

    radbd7e1 raefdccd  
    4343/** Navigator menu callbacks */
    4444typedef struct nav_menu_cb {
     45        /** File / New File */
     46        void (*file_new_file)(void *);
    4547        /** File / Open */
    4648        void (*file_open)(void *);
  • uspace/app/nav/types/nav.h

    radbd7e1 raefdccd  
    11/*
    2  * Copyright (c) 2021 Jiri Svoboda
     2 * Copyright (c) 2025 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    3737#define TYPES_NAV_H
    3838
     39#include <fibril.h>
     40#include <fmgt.h>
     41#include <stdbool.h>
    3942#include <ui/fixed.h>
    4043#include <ui/ui.h>
     
    5760        /** Panels */
    5861        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;
    5977} navigator_t;
     78
     79/** Navigator worker job */
     80typedef 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;
    6088
    6189#endif
Note: See TracChangeset for help on using the changeset viewer.