Changeset 34aad53d in mainline for uspace/app/taskbar/tbsmenu.c


Ignore:
Timestamp:
2024-04-07T09:45:45Z (7 months ago)
Author:
Nataliia Korop <n.corop08@…>
Children:
c37c24c
Parents:
e4cc266 (diff), 522eecf (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.
Message:

merge master to topic/packet-capture

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/taskbar/tbsmenu.c

    re4cc266 r34aad53d  
    6464static void tbsmenu_smenu_entry_cb(ui_menu_entry_t *, void *);
    6565static errno_t tbsmenu_entry_start(tbsmenu_entry_t *);
     66static void tbsmenu_cmd_fini(tbsmenu_cmd_t *);
    6667
    6768/** Create taskbar start menu.
     
    6970 * @param window Containing window
    7071 * @param fixed Fixed layout to which start button will be added
     72 * @param dspec Display specification (for passing to applications)
    7173 * @param rtbsmenu Place to store pointer to new start menu
    7274 * @return @c EOK on success or an error code
    7375 */
    7476errno_t tbsmenu_create(ui_window_t *window, ui_fixed_t *fixed,
    75     tbsmenu_t **rtbsmenu)
     77    const char *dspec, tbsmenu_t **rtbsmenu)
    7678{
    7779        ui_resource_t *res = ui_window_get_res(window);
     
    8587        }
    8688
     89        tbsmenu->display_spec = str_dup(dspec);
     90        if (tbsmenu->display_spec == NULL) {
     91                rc = ENOMEM;
     92                goto error;
     93        }
     94
    8795        rc = ui_pbutton_create(res, "Start", &tbsmenu->sbutton);
    8896        if (rc != EOK)
     
    111119        return EOK;
    112120error:
     121        if (tbsmenu != NULL && tbsmenu->display_spec != NULL)
     122                free(tbsmenu->display_spec);
    113123        if (tbsmenu != NULL)
    114124                ui_pbutton_destroy(tbsmenu->sbutton);
     
    134144        bool terminal;
    135145        errno_t rc;
     146
     147        if (tbsmenu->repopath != NULL)
     148                free(tbsmenu->repopath);
     149
     150        tbsmenu->repopath = str_dup(repopath);
     151        if (tbsmenu->repopath == NULL)
     152                return ENOMEM;
     153
     154        /* Remove existing entries */
     155        tentry = tbsmenu_first(tbsmenu);
     156        while (tentry != NULL) {
     157                tbsmenu_remove(tbsmenu, tentry, false);
     158                tentry = tbsmenu_first(tbsmenu);
     159        }
    136160
    137161        rc = tbarcfg_open(repopath, &tbcfg);
     
    170194}
    171195
     196/** Reload start menu from repository (or schedule reload).
     197 *
     198 * @param tbsmenu Start menu
     199 */
     200void tbsmenu_reload(tbsmenu_t *tbsmenu)
     201{
     202        if (!tbsmenu_is_open(tbsmenu))
     203                (void) tbsmenu_load(tbsmenu, tbsmenu->repopath);
     204        else
     205                tbsmenu->needs_reload = true;
     206}
     207
    172208/** Set start menu rectangle.
    173209 *
     
    198234{
    199235        ui_menu_close(tbsmenu->smenu);
     236
     237        if (tbsmenu->needs_reload)
     238                (void) tbsmenu_load(tbsmenu, tbsmenu->repopath);
    200239}
    201240
     
    447486static errno_t tbsmenu_cmd_split(const char *str, tbsmenu_cmd_t *cmd)
    448487{
     488        char *buf;
    449489        char *arg;
    450490        char *next;
    451491        size_t cnt;
    452492
    453         cmd->buf = str_dup(str);
    454         if (cmd->buf == NULL)
     493        buf = str_dup(str);
     494        if (buf == NULL)
    455495                return ENOMEM;
    456496
    457497        /* Count the entries */
    458498        cnt = 0;
    459         arg = str_tok(cmd->buf, " ", &next);
     499        arg = str_tok(buf, " ", &next);
    460500        while (arg != NULL) {
    461501                ++cnt;
     
    464504
    465505        /* Need to copy again as buf was mangled */
    466         free(cmd->buf);
    467         cmd->buf = str_dup(str);
    468         if (cmd->buf == NULL)
     506        free(buf);
     507        buf = str_dup(str);
     508        if (buf == NULL)
    469509                return ENOMEM;
    470510
    471511        cmd->argv = calloc(cnt + 1, sizeof(char *));
    472512        if (cmd->argv == NULL) {
    473                 free(cmd->buf);
     513                free(buf);
    474514                return ENOMEM;
    475515        }
    476516
    477         /* Fill in pointers */
     517        /* Copy individual arguments */
    478518        cnt = 0;
    479         arg = str_tok(cmd->buf, " ", &next);
     519        arg = str_tok(buf, " ", &next);
    480520        while (arg != NULL) {
    481                 cmd->argv[cnt++] = arg;
     521                cmd->argv[cnt] = str_dup(arg);
     522                if (cmd->argv[cnt] == NULL) {
     523                        tbsmenu_cmd_fini(cmd);
     524                        return ENOMEM;
     525                }
     526                ++cnt;
     527
    482528                arg = str_tok(next, " ", &next);
    483529        }
     
    494540static void tbsmenu_cmd_fini(tbsmenu_cmd_t *cmd)
    495541{
     542        char **cp;
     543
     544        /* Free all pointers in NULL-terminated list */
     545        cp = cmd->argv;
     546        while (*cp != NULL) {
     547                free(*cp);
     548                ++cp;
     549        }
     550
     551        /* Free the array of pointers */
    496552        free(cmd->argv);
    497         free(cmd->buf);
     553}
     554
     555/** Free command structure.
     556 *
     557 * @param cmd Command
     558 * @param entry Start menu entry
     559 * @param dspec Display specification
     560 * @return EOK on success or an error code
     561 */
     562static errno_t tbsmenu_cmd_subst(tbsmenu_cmd_t *cmd, tbsmenu_entry_t *entry,
     563    const char *dspec)
     564{
     565        char **cp;
     566
     567        (void)entry;
     568
     569        /* Walk NULL-terminated list of arguments */
     570        cp = cmd->argv;
     571        while (*cp != NULL) {
     572                if (str_cmp(*cp, "%d") == 0) {
     573                        /* Display specification */
     574                        free(*cp);
     575                        *cp = str_dup(dspec);
     576                        if (*cp == NULL)
     577                                return ENOMEM;
     578                }
     579                ++cp;
     580        }
     581
     582        return EOK;
    498583}
    499584
     
    516601        char **cp;
    517602        const char **targv = NULL;
     603        char *dspec = NULL;
     604        sysarg_t idev_id;
     605        int rv;
    518606        errno_t rc;
    519607        ui_t *ui;
     
    522610        suspended = false;
    523611
     612        idev_id = ui_menu_get_idev_id(entry->tbsmenu->smenu);
     613
     614        rv = asprintf(&dspec, "%s?idev=%zu",
     615            entry->tbsmenu->display_spec, (size_t)idev_id);
     616        if (rv < 0)
     617                return ENOMEM;
     618
     619        /* Split command string into individual arguments */
    524620        rc = tbsmenu_cmd_split(entry->cmd, &cmd);
    525         if (rc != EOK)
     621        if (rc != EOK) {
     622                free(dspec);
    526623                return rc;
     624        }
     625
     626        /* Substitute metacharacters in command */
     627        rc = tbsmenu_cmd_subst(&cmd, entry, dspec);
     628        if (rc != EOK)
     629                goto error;
    527630
    528631        /* Free up and clean console for the child task. */
     
    542645                }
    543646
    544                 targv = calloc(cnt + 3, sizeof(char **));
     647                targv = calloc(cnt + 5, sizeof(char **));
    545648                if (targv == NULL)
    546649                        goto error;
    547650
    548651                targv[0] = "/app/terminal";
    549                 targv[1] = "-c";
     652                targv[1] = "-d";
     653                targv[2] = dspec;
     654                targv[3] = "-c";
    550655
    551656                for (i = 0; i <= cnt; i++) {
    552                         targv[2 + i] = cmd.argv[i];
     657                        targv[4 + i] = cmd.argv[i];
    553658                }
    554659
     
    578683        return EOK;
    579684error:
     685        free(dspec);
    580686        if (targv != NULL)
    581687                free(targv);
Note: See TracChangeset for help on using the changeset viewer.