Changeset accdf882 in mainline


Ignore:
Timestamp:
2025-02-05T21:26:26Z (5 days ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
60e9ba9, 74a165cc, b336bfd8
Parents:
832cbe7
Message:

File / Edit (Ctrl-E) in Navigator to start editor on current file

Location:
uspace
Files:
9 edited

Legend:

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

    r832cbe7 raccdf882  
    11/*
    2  * Copyright (c) 2023 Jiri Svoboda
     2 * Copyright (c) 2025 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    5555        ui_menu_t *mfile;
    5656        ui_menu_entry_t *mopen;
     57        ui_menu_entry_t *medit;
    5758        ui_menu_entry_t *mfsep;
    5859        ui_menu_entry_t *mexit;
     
    8283
    8384        ui_menu_entry_set_cb(mopen, nav_menu_file_open, (void *) menu);
     85
     86        rc = ui_menu_entry_create(mfile, "~E~dit", "Ctrl-E", &medit);
     87        if (rc != EOK)
     88                goto error;
     89
     90        ui_menu_entry_set_cb(medit, nav_menu_file_edit, (void *) menu);
    8491
    8592        rc = ui_menu_entry_sep_create(mfile, &mfsep);
     
    154161}
    155162
     163/** File / Edit menu entry selected.
     164 *
     165 * @param mentry Menu entry
     166 * @param arg Argument (navigator_t *)
     167 */
     168void nav_menu_file_edit(ui_menu_entry_t *mentry, void *arg)
     169{
     170        nav_menu_t *menu = (nav_menu_t *)arg;
     171
     172        if (menu->cb != NULL && menu->cb->file_edit != NULL)
     173                menu->cb->file_edit(menu->cb_arg);
     174}
     175
    156176/** File / Exit menu entry selected.
    157177 *
  • uspace/app/nav/menu.h

    r832cbe7 raccdf882  
    11/*
    2  * Copyright (c) 2021 Jiri Svoboda
     2 * Copyright (c) 2025 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    4747extern ui_control_t *nav_menu_ctl(nav_menu_t *);
    4848extern void nav_menu_file_open(ui_menu_entry_t *, void *);
     49extern void nav_menu_file_edit(ui_menu_entry_t *, void *);
    4950extern void nav_menu_file_exit(ui_menu_entry_t *, void *);
    5051
  • uspace/app/nav/nav.c

    r832cbe7 raccdf882  
    11/*
    2  * Copyright (c) 2022 Jiri Svoboda
     2 * Copyright (c) 2025 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    3939#include <stdlib.h>
    4040#include <str.h>
     41#include <task.h>
    4142#include <ui/fixed.h>
    4243#include <ui/filelist.h>
     
    4849#include "panel.h"
    4950
     51#define EDITOR_CMD "/app/edit"
     52
    5053static void wnd_close(ui_window_t *, void *);
    5154static void wnd_kbd(ui_window_t *, void *, kbd_event_t *);
     
    5760
    5861static void navigator_file_open(void *);
     62static void navigator_file_edit(void *);
    5963static void navigator_file_exit(void *);
    6064
    6165static nav_menu_cb_t navigator_menu_cb = {
    6266        .file_open = navigator_file_open,
     67        .file_edit = navigator_file_edit,
    6368        .file_exit = navigator_file_exit
    6469};
     
    97102            (event->mods & KM_CTRL) != 0) {
    98103                switch (event->key) {
     104                case KC_E:
     105                        navigator_file_edit((void *)navigator);
     106                        break;
    99107                case KC_Q:
    100108                        ui_quit(navigator->ui);
     
    318326}
    319327
     328/** Open file in text editor.
     329 *
     330 * @param panel Panel
     331 * @param fname File name
     332 *
     333 * @return EOK on success or an error code
     334 */
     335static errno_t navigator_edit_file(navigator_t *navigator, const char *fname)
     336{
     337        task_id_t id;
     338        task_wait_t wait;
     339        task_exit_t texit;
     340        int retval;
     341        errno_t rc;
     342
     343        /* Free up and clean console for the child task. */
     344        rc = ui_suspend(navigator->ui);
     345        if (rc != EOK)
     346                return rc;
     347
     348        rc = task_spawnl(&id, &wait, EDITOR_CMD, EDITOR_CMD, fname, NULL);
     349        if (rc != EOK)
     350                goto error;
     351
     352        rc = task_wait(&wait, &texit, &retval);
     353        if ((rc != EOK) || (texit != TASK_EXIT_NORMAL))
     354                goto error;
     355
     356        /* Resume UI operation */
     357        rc = ui_resume(navigator->ui);
     358        if (rc != EOK)
     359                return rc;
     360
     361        (void) ui_paint(navigator->ui);
     362        return EOK;
     363error:
     364        (void) ui_resume(navigator->ui);
     365        (void) ui_paint(navigator->ui);
     366        return rc;
     367}
     368
     369/** File / Edit menu entry selected */
     370static void navigator_file_edit(void *arg)
     371{
     372        navigator_t *navigator = (navigator_t *)arg;
     373        ui_file_list_entry_t *entry;
     374        ui_file_list_entry_attr_t attr;
     375        panel_t *panel;
     376
     377        panel = navigator_get_active_panel(navigator);
     378        entry = ui_file_list_get_cursor(panel->flist);
     379        ui_file_list_entry_get_attr(entry, &attr);
     380
     381        (void)navigator_edit_file(navigator, attr.name);
     382}
     383
    320384/** File / Exit menu entry selected */
    321385static void navigator_file_exit(void *arg)
  • uspace/app/nav/test/menu.c

    r832cbe7 raccdf882  
    11/*
    2  * Copyright (c) 2021 Jiri Svoboda
     2 * Copyright (c) 2025 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    3737
    3838static void test_menu_file_open(void *);
     39static void test_menu_file_edit(void *);
    3940static void test_menu_file_exit(void *);
    4041
     
    4243static nav_menu_cb_t test_cb = {
    4344        .file_open = test_menu_file_open,
     45        .file_edit = test_menu_file_edit,
    4446        .file_exit = test_menu_file_exit
    4547};
     
    4850typedef struct {
    4951        bool file_open;
     52        bool file_edit;
    5053        bool file_exit;
    5154} test_resp_t;
     
    148151}
    149152
     153/** File / Edit callback */
     154PCUT_TEST(file_edit)
     155{
     156        ui_t *ui;
     157        ui_window_t *window;
     158        ui_wnd_params_t params;
     159        nav_menu_t *menu;
     160        test_resp_t resp;
     161        errno_t rc;
     162
     163        rc = ui_create_disp(NULL, &ui);
     164        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     165
     166        ui_wnd_params_init(&params);
     167        params.caption = "Test";
     168
     169        rc = ui_window_create(ui, &params, &window);
     170        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     171
     172        rc = nav_menu_create(window, &menu);
     173        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     174
     175        /* Call back with no callbacks set */
     176        nav_menu_file_edit(NULL, menu);
     177
     178        /* Call back with dummy callbacks set */
     179        nav_menu_set_cb(menu, &dummy_cb, &resp);
     180        nav_menu_file_edit(NULL, menu);
     181
     182        /* Call back with test callbacks set */
     183        resp.file_edit = false;
     184        nav_menu_set_cb(menu, &test_cb, &resp);
     185        nav_menu_file_edit(NULL, menu);
     186        PCUT_ASSERT_TRUE(resp.file_edit);
     187
     188        nav_menu_destroy(menu);
     189        ui_window_destroy(window);
     190        ui_destroy(ui);
     191}
     192
     193/** File / Exit callback */
     194PCUT_TEST(file_exit)
     195{
     196        ui_t *ui;
     197        ui_window_t *window;
     198        ui_wnd_params_t params;
     199        nav_menu_t *menu;
     200        test_resp_t resp;
     201        errno_t rc;
     202
     203        rc = ui_create_disp(NULL, &ui);
     204        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     205
     206        ui_wnd_params_init(&params);
     207        params.caption = "Test";
     208
     209        rc = ui_window_create(ui, &params, &window);
     210        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     211
     212        rc = nav_menu_create(window, &menu);
     213        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     214
     215        /* Call back with no callbacks set */
     216        nav_menu_file_exit(NULL, menu);
     217
     218        /* Call back with dummy callbacks set */
     219        nav_menu_set_cb(menu, &dummy_cb, &resp);
     220        nav_menu_file_exit(NULL, menu);
     221
     222        /* Call back with test callbacks set */
     223        resp.file_exit = false;
     224        nav_menu_set_cb(menu, &test_cb, &resp);
     225        nav_menu_file_exit(NULL, menu);
     226        PCUT_ASSERT_TRUE(resp.file_exit);
     227
     228        nav_menu_destroy(menu);
     229        ui_window_destroy(window);
     230        ui_destroy(ui);
     231}
     232
    150233/** Testing File / Open callback */
    151234static void test_menu_file_open(void *arg)
     
    156239}
    157240
     241/** Testing File / Edit callback */
     242static void test_menu_file_edit(void *arg)
     243{
     244        test_resp_t *resp = (test_resp_t *)arg;
     245
     246        resp->file_edit = true;
     247}
     248
    158249/** Testing File / Exit callback */
    159250static void test_menu_file_exit(void *arg)
  • uspace/app/nav/types/menu.h

    r832cbe7 raccdf882  
    11/*
    2  * Copyright (c) 2021 Jiri Svoboda
     2 * Copyright (c) 2025 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    4545        /** File / Open */
    4646        void (*file_open)(void *);
     47        /** File / Edit */
     48        void (*file_edit)(void *);
    4749        /** File / Exit */
    4850        void (*file_exit)(void *);
  • uspace/lib/ui/include/types/ui/filelist.h

    r832cbe7 raccdf882  
    11/*
    2  * Copyright (c) 2022 Jiri Svoboda
     2 * Copyright (c) 2025 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    3737#define _UI_TYPES_FILELIST_H
    3838
     39#include <loc.h>
     40#include <stdbool.h>
     41#include <stdint.h>
     42
    3943struct ui_file_list;
    4044typedef struct ui_file_list ui_file_list_t;
     
    4347typedef struct ui_file_list_entry ui_file_list_entry_t;
    4448
    45 struct ui_file_list_entry_attr;
    46 typedef struct ui_file_list_entry_attr ui_file_list_entry_attr_t;
     49/** File list entry attributes */
     50typedef struct ui_file_list_entry_attr {
     51        /** File name */
     52        const char *name;
     53        /** File size */
     54        uint64_t size;
     55        /** @c true iff entry is a directory */
     56        bool isdir;
     57        /** Service number for service special entries */
     58        service_id_t svc;
     59} ui_file_list_entry_attr_t;
    4760
    4861/** File list callbacks */
  • uspace/lib/ui/include/ui/filelist.h

    r832cbe7 raccdf882  
    11/*
    2  * Copyright (c) 2023 Jiri Svoboda
     2 * Copyright (c) 2025 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    5454extern errno_t ui_file_list_open(ui_file_list_t *, ui_file_list_entry_t *);
    5555extern ui_file_list_entry_t *ui_file_list_get_cursor(ui_file_list_t *);
     56extern void ui_file_list_entry_get_attr(ui_file_list_entry_t *,
     57    ui_file_list_entry_attr_t *);
    5658
    5759#endif
  • uspace/lib/ui/private/filelist.h

    r832cbe7 raccdf882  
    11/*
    2  * Copyright (c) 2023 Jiri Svoboda
     2 * Copyright (c) 2025 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    4343#include <stdint.h>
    4444#include <types/ui/filelist.h>
    45 
    46 /** File list entry attributes */
    47 struct ui_file_list_entry_attr {
    48         /** File name */
    49         const char *name;
    50         /** File size */
    51         uint64_t size;
    52         /** @c true iff entry is a directory */
    53         bool isdir;
    54         /** Service number for service special entries */
    55         service_id_t svc;
    56 };
    5745
    5846/** File list entry */
  • uspace/lib/ui/src/filelist.c

    r832cbe7 raccdf882  
    11/*
    2  * Copyright (c) 2023 Jiri Svoboda
     2 * Copyright (c) 2025 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    535535}
    536536
     537/** Get file list entry attributes.
     538 *
     539 * @param entry File list entry
     540 * @return Current cursor
     541 */
     542void ui_file_list_entry_get_attr(ui_file_list_entry_t *entry,
     543    ui_file_list_entry_attr_t *attr)
     544{
     545        attr->name = entry->name;
     546        attr->size = entry->size;
     547        attr->isdir = entry->isdir;
     548        attr->svc = entry->svc;
     549}
     550
    537551/** Open file list entry.
    538552 *
Note: See TracChangeset for help on using the changeset viewer.