Changeset 4fcc2de in mainline for uspace/app/nav/panel.c


Ignore:
Timestamp:
2021-10-25T00:32:45Z (2 years ago)
Author:
jxsvoboda <5887334+jxsvoboda@…>
Branches:
master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
f783081
Parents:
fa792e8
git-author:
Jiri Svoboda <jiri@…> (2021-10-16 20:41:33)
git-committer:
jxsvoboda <5887334+jxsvoboda@…> (2021-10-25 00:32:45)
Message:

Opening directories

File:
1 edited

Legend:

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

    rfa792e8 r4fcc2de  
    281281                                panel_page_down(panel);
    282282                                break;
     283                        case KC_ENTER:
     284                                panel_open(panel, panel->cursor);
     285                                break;
    283286                        default:
    284287                                break;
     
    344347 *
    345348 * @param panel Panel
    346  */
    347 void panel_activate(panel_t *panel)
    348 {
     349 *
     350 * @return EOK on success or an error code
     351 */
     352errno_t panel_activate(panel_t *panel)
     353{
     354        errno_t rc;
     355
     356        if (panel->dir != NULL) {
     357                rc = vfs_cwd_set(panel->dir);
     358                if (rc != EOK)
     359                        return rc;
     360        }
     361
    349362        panel->active = true;
    350363        (void) panel_paint(panel);
     364        return EOK;
    351365}
    352366
     
    485499        struct dirent *dirent;
    486500        vfs_stat_t finfo;
     501        char newdir[256];
     502        char *ndir = NULL;
    487503        errno_t rc;
    488504
    489         dir = opendir(dirname);
    490         if (dir == NULL)
    491                 return errno;
     505        rc = vfs_cwd_set(dirname);
     506        if (rc != EOK)
     507                return rc;
     508
     509        rc = vfs_cwd_get(newdir, sizeof(newdir));
     510        if (rc != EOK)
     511                return rc;
     512
     513        ndir = str_dup(newdir);
     514        if (ndir == NULL)
     515                return ENOMEM;
     516
     517        dir = opendir(".");
     518        if (dir == NULL) {
     519                rc = errno;
     520                goto error;
     521        }
     522
     523        if (str_cmp(ndir, "/") != 0) {
     524                /* Need to add a synthetic up-dir entry */
     525                rc = panel_entry_append(panel, "..", 0, true);
     526                if (rc != EOK)
     527                        goto error;
     528        }
    492529
    493530        dirent = readdir(dir);
    494531        while (dirent != NULL) {
    495532                rc = vfs_stat_path(dirent->d_name, &finfo);
    496                 if (rc != EOK)
    497                         goto error;
    498 
    499                 rc = panel_entry_append(panel, dirent->d_name, 1,
     533                if (rc != EOK) {
     534                        /* Possibly a stale entry */
     535                        dirent = readdir(dir);
     536                        continue;
     537                }
     538
     539                rc = panel_entry_append(panel, dirent->d_name, finfo.size,
    500540                    finfo.is_directory);
    501541                if (rc != EOK)
     
    515555        panel->page = panel_first(panel);
    516556        panel->page_idx = 0;
     557        free(panel->dir);
     558        panel->dir = ndir;
    517559        return EOK;
    518560error:
    519         closedir(dir);
     561        (void) vfs_cwd_set(panel->dir);
     562        if (ndir != NULL)
     563                free(ndir);
     564        if (dir != NULL)
     565                closedir(dir);
    520566        return rc;
    521567}
     
    870916}
    871917
     918/** Open panel entry.
     919 *
     920 * Perform Open action on a panel entry (e.g. switch to a subdirectory).
     921 *
     922 * @param panel Panel
     923 * @param entry Panel entry
     924 *
     925 * @return EOK on success or an error code
     926 */
     927errno_t panel_open(panel_t *panel, panel_entry_t *entry)
     928{
     929        gfx_context_t *gc = ui_window_get_gc(panel->window);
     930        char *dirname;
     931        errno_t rc;
     932
     933        if (!entry->isdir)
     934                return EOK;
     935
     936        dirname = str_dup(entry->name);
     937        panel_clear_entries(panel);
     938
     939        rc = panel_read_dir(panel, dirname);
     940        if (rc != EOK) {
     941                free(dirname);
     942                return rc;
     943        }
     944
     945        rc = panel_paint(panel);
     946        if (rc != EOK) {
     947                free(dirname);
     948                return rc;
     949        }
     950
     951        free(dirname);
     952        return gfx_update(gc);
     953}
     954
    872955/** @}
    873956 */
Note: See TracChangeset for help on using the changeset viewer.