Changeset d92b8e8f in mainline


Ignore:
Timestamp:
2024-03-04T14:12:26Z (2 months ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
e229148
Parents:
ee3b28a9
git-author:
Jiri Svoboda <jiri@…> (2024-03-03 18:12:02)
git-committer:
Jiri Svoboda <jiri@…> (2024-03-04 14:12:26)
Message:

Start menu support for passing input device ID (multiseat)

Location:
uspace
Files:
12 edited

Legend:

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

    ree3b28a9 rd92b8e8f  
    131131        gfx_rect_t scr_rect;
    132132        gfx_rect_t rect;
     133        char *dspec = NULL;
     134        char *qmark;
    133135        errno_t rc;
    134136
    135137        taskbar = calloc(1, sizeof(taskbar_t));
    136138        if (taskbar == NULL) {
     139                printf("Out of memory.\n");
    137140                rc = ENOMEM;
    138141                goto error;
    139142        }
     143
     144        dspec = str_dup(display_spec);
     145        if (dspec == NULL) {
     146                printf("Out of memory.\n");
     147                rc = ENOMEM;
     148                goto error;
     149        }
     150
     151        /* Remove additional arguments */
     152        qmark = str_chr(dspec, '?');
     153        if (qmark != NULL)
     154                *qmark = '\0';
    140155
    141156        rc = ui_create(display_spec, &taskbar->ui);
     
    198213        }
    199214
    200         rc = tbsmenu_create(taskbar->window, taskbar->fixed, &taskbar->tbsmenu);
     215        rc = tbsmenu_create(taskbar->window, taskbar->fixed, dspec,
     216            &taskbar->tbsmenu);
    201217        if (rc != EOK) {
    202218                printf("Error creating start menu.\n");
     
    293309        }
    294310
     311        free(dspec);
    295312        *rtaskbar = taskbar;
    296313        return EOK;
    297314error:
     315        if (dspec != NULL)
     316                free(dspec);
    298317        if (taskbar->lst != NULL)
    299318                tbarcfg_listener_destroy(taskbar->lst);
     
    308327        if (taskbar->ui != NULL)
    309328                ui_destroy(taskbar->ui);
     329        free(taskbar);
    310330        return rc;
    311331
  • uspace/app/taskbar/taskbar.sif

    ree3b28a9 rd92b8e8f  
    1 [sif](){[entries](){[entry]([caption]=[~N~avigator][cmd]=[/app/nav][terminal]=[y]){}[entry]([caption]=[Text ~E~ditor][cmd]=[/app/edit][terminal]=[y]){}[entry]([caption]=[Co~m~mand Line][cmd]=[/app/bdsh][terminal]=[y]){}[entry]([caption]=[~C~alculator][cmd]=[/app/calculator][terminal]=[n]){}[entry]([separator]=[y]){}[entry]([caption]=[~U~I Demo][cmd]=[/app/uidemo][terminal]=[n]){}[entry]([caption]=[~G~FX Demo][cmd]=[/app/gfxdemo ui][terminal]=[n]){}[entry]([caption]=[~B~arber Pole][cmd]=[/app/barber][terminal]=[n]){}[entry]([caption]=[~T~etris][cmd]=[/app/tetris][terminal]=[y]){}[entry]([separator]=[y]){}[entry]([caption]=[~D~isplay Configuration][cmd]=[/app/display-cfg][terminal]=[n]){}[entry]([caption]=[Ta~s~kbar Configuration][cmd]=[/app/taskbar-cfg][terminal]=[n]){}[entry]([separator]=[y]){}[entry]([caption]=[Tas~k~ Monitor (top)][cmd]=[/app/top][terminal]=[y]){}[entry]([caption]=[~F~disk Disk Editor][cmd]=[/app/fdisk][terminal]=[y]){}}}
     1[sif](){[entries](){[entry]([caption]=[~N~avigator][cmd]=[/app/nav][terminal]=[y]){}[entry]([caption]=[Text ~E~ditor][cmd]=[/app/edit][terminal]=[y]){}[entry]([caption]=[Co~m~mand Line][cmd]=[/app/bdsh][terminal]=[y]){}[entry]([caption]=[~C~alculator][cmd]=[/app/calculator -d %d][terminal]=[n]){}[entry]([separator]=[y]){}[entry]([caption]=[~U~I Demo][cmd]=[/app/uidemo -d %d][terminal]=[n]){}[entry]([caption]=[~G~FX Demo][cmd]=[/app/gfxdemo -d %d ui][terminal]=[n]){}[entry]([caption]=[~B~arber Pole][cmd]=[/app/barber -d %d][terminal]=[n]){}[entry]([caption]=[~T~etris][cmd]=[/app/tetris][terminal]=[y]){}[entry]([separator]=[y]){}[entry]([caption]=[~D~isplay Configuration][cmd]=[/app/display-cfg -d %d][terminal]=[n]){}[entry]([caption]=[Ta~s~kbar Configuration][cmd]=[/app/taskbar-cfg -d %d][terminal]=[n]){}[entry]([separator]=[y]){}[entry]([caption]=[Tas~k~ Monitor (top)][cmd]=[/app/top][terminal]=[y]){}[entry]([caption]=[~F~disk Disk Editor][cmd]=[/app/fdisk][terminal]=[y]){}}}
  • uspace/app/taskbar/tbsmenu.c

    ree3b28a9 rd92b8e8f  
    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);
     
    476486static errno_t tbsmenu_cmd_split(const char *str, tbsmenu_cmd_t *cmd)
    477487{
     488        char *buf;
    478489        char *arg;
    479490        char *next;
    480491        size_t cnt;
    481492
    482         cmd->buf = str_dup(str);
    483         if (cmd->buf == NULL)
     493        buf = str_dup(str);
     494        if (buf == NULL)
    484495                return ENOMEM;
    485496
    486497        /* Count the entries */
    487498        cnt = 0;
    488         arg = str_tok(cmd->buf, " ", &next);
     499        arg = str_tok(buf, " ", &next);
    489500        while (arg != NULL) {
    490501                ++cnt;
     
    493504
    494505        /* Need to copy again as buf was mangled */
    495         free(cmd->buf);
    496         cmd->buf = str_dup(str);
    497         if (cmd->buf == NULL)
     506        free(buf);
     507        buf = str_dup(str);
     508        if (buf == NULL)
    498509                return ENOMEM;
    499510
    500511        cmd->argv = calloc(cnt + 1, sizeof(char *));
    501512        if (cmd->argv == NULL) {
    502                 free(cmd->buf);
     513                free(buf);
    503514                return ENOMEM;
    504515        }
    505516
    506         /* Fill in pointers */
     517        /* Copy individual arguments */
    507518        cnt = 0;
    508         arg = str_tok(cmd->buf, " ", &next);
     519        arg = str_tok(buf, " ", &next);
    509520        while (arg != NULL) {
    510                 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
    511528                arg = str_tok(next, " ", &next);
    512529        }
     
    523540static void tbsmenu_cmd_fini(tbsmenu_cmd_t *cmd)
    524541{
     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 */
    525552        free(cmd->argv);
    526         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;
    527583}
    528584
     
    545601        char **cp;
    546602        const char **targv = NULL;
     603        char *dspec = NULL;
     604        sysarg_t idev_id;
     605        int rv;
    547606        errno_t rc;
    548607        ui_t *ui;
     
    551610        suspended = false;
    552611
     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 */
    553620        rc = tbsmenu_cmd_split(entry->cmd, &cmd);
    554         if (rc != EOK)
     621        if (rc != EOK) {
     622                free(dspec);
    555623                return rc;
     624        }
     625
     626        /* Substitute metacharacters in command */
     627        rc = tbsmenu_cmd_subst(&cmd, entry, dspec);
     628        if (rc != EOK)
     629                goto error;
    556630
    557631        /* Free up and clean console for the child task. */
     
    571645                }
    572646
    573                 targv = calloc(cnt + 3, sizeof(char **));
     647                targv = calloc(cnt + 5, sizeof(char **));
    574648                if (targv == NULL)
    575649                        goto error;
    576650
    577651                targv[0] = "/app/terminal";
    578                 targv[1] = "-c";
     652                targv[1] = "-d";
     653                targv[2] = dspec;
     654                targv[3] = "-c";
    579655
    580656                for (i = 0; i <= cnt; i++) {
    581                         targv[2 + i] = cmd.argv[i];
     657                        targv[4 + i] = cmd.argv[i];
    582658                }
    583659
     
    607683        return EOK;
    608684error:
     685        free(dspec);
    609686        if (targv != NULL)
    610687                free(targv);
  • uspace/app/taskbar/tbsmenu.h

    ree3b28a9 rd92b8e8f  
    4646#include "types/tbsmenu.h"
    4747
    48 extern errno_t tbsmenu_create(ui_window_t *, ui_fixed_t *, tbsmenu_t **);
     48extern errno_t tbsmenu_create(ui_window_t *, ui_fixed_t *, const char *,
     49    tbsmenu_t **);
    4950extern errno_t tbsmenu_load(tbsmenu_t *, const char *);
    5051extern void tbsmenu_reload(tbsmenu_t *);
  • uspace/app/taskbar/test/tbsmenu.c

    ree3b28a9 rd92b8e8f  
    11/*
    2  * Copyright (c) 2023 Jiri Svoboda
     2 * Copyright (c) 2024 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    6161        ui_window_add(window, ui_fixed_ctl(fixed));
    6262
    63         rc = tbsmenu_create(window, fixed, &tbsmenu);
     63        rc = tbsmenu_create(window, fixed, UI_DISPLAY_DEFAULT, &tbsmenu);
    6464        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    6565
     
    9292        ui_window_add(window, ui_fixed_ctl(fixed));
    9393
    94         rc = tbsmenu_create(window, fixed, &tbsmenu);
     94        rc = tbsmenu_create(window, fixed, UI_DISPLAY_DEFAULT, &tbsmenu);
    9595        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    9696
  • uspace/app/taskbar/types/tbsmenu.h

    ree3b28a9 rd92b8e8f  
    9191        /** Need to reload menu when possible */
    9292        bool needs_reload;
     93
     94        /** Display specification */
     95        char *display_spec;
    9396} tbsmenu_t;
    9497
    9598/** Command split into individual parts */
    9699typedef struct {
    97         /** Buffer holding broken down command */
    98         char *buf;
    99100        /** NULL-terminated array of string pointers */
    100101        char **argv;
  • uspace/lib/ui/include/ui/menu.h

    ree3b28a9 rd92b8e8f  
    11/*
    2  * Copyright (c) 2023 Jiri Svoboda
     2 * Copyright (c) 2024 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    5959extern ui_evclaim_t ui_menu_pos_event(ui_menu_t *, gfx_coord2_t *,
    6060    pos_event_t *);
     61extern sysarg_t ui_menu_get_idev_id(ui_menu_t *);
    6162
    6263#endif
  • uspace/lib/ui/include/ui/popup.h

    ree3b28a9 rd92b8e8f  
    11/*
    2  * Copyright (c) 2021 Jiri Svoboda
     2 * Copyright (c) 2024 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    5454extern ui_resource_t *ui_popup_get_res(ui_popup_t *);
    5555extern gfx_context_t *ui_popup_get_gc(ui_popup_t *);
     56extern sysarg_t ui_popup_get_idev_id(ui_popup_t *);
    5657
    5758#endif
  • uspace/lib/ui/private/menu.h

    ree3b28a9 rd92b8e8f  
    11/*
    2  * Copyright (c) 2023 Jiri Svoboda
     2 * Copyright (c) 2024 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    7070        /** Callback argument */
    7171        void *arg;
     72        /** ID of device that activated entry */
     73        sysarg_t idev_id;
    7274};
    7375
  • uspace/lib/ui/private/popup.h

    ree3b28a9 rd92b8e8f  
    11/*
    2  * Copyright (c) 2021 Jiri Svoboda
     2 * Copyright (c) 2024 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    5858        /** Placement rectangle */
    5959        gfx_rect_t place;
     60        /** ID of device that sent input event */
     61        sysarg_t idev_id;
    6062};
    6163
  • uspace/lib/ui/src/menu.c

    ree3b28a9 rd92b8e8f  
    11/*
    2  * Copyright (c) 2023 Jiri Svoboda
     2 * Copyright (c) 2024 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    578578        ui_menu_t *menu = (ui_menu_t *)arg;
    579579
     580        menu->idev_id = ui_popup_get_idev_id(menu->popup);
    580581        ui_menu_kbd_event(menu, event);
    581582}
     
    592593        gfx_coord2_t spos;
    593594
     595        menu->idev_id = ui_popup_get_idev_id(menu->popup);
     596
    594597        spos.x = 0;
    595598        spos.y = 0;
     
    641644}
    642645
     646/** Get ID of last device that input event.
     647 *
     648 * @param menu Menu
     649 * @return Input device ID
     650 */
     651sysarg_t ui_menu_get_idev_id(ui_menu_t *menu)
     652{
     653        return menu->idev_id;
     654}
     655
    643656/** @}
    644657 */
  • uspace/lib/ui/src/popup.c

    ree3b28a9 rd92b8e8f  
    11/*
    2  * Copyright (c) 2023 Jiri Svoboda
     2 * Copyright (c) 2024 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    190190}
    191191
     192/** Get ID of device that sent the last position event.
     193 *
     194 * @param popup Popup window
     195 * @return Input device ID
     196 */
     197sysarg_t ui_popup_get_idev_id(ui_popup_t *popup)
     198{
     199        return popup->idev_id;
     200}
     201
    192202/** Handle close event in popup window.
    193203 *
     
    214224        ui_popup_t *popup = (ui_popup_t *)arg;
    215225
     226        /* Remember ID of device that sent the last event */
     227        popup->idev_id = event->kbd_id;
     228
    216229        if (popup->cb != NULL && popup->cb->kbd != NULL)
    217230                popup->cb->kbd(popup, popup->arg, event);
     
    229242        ui_popup_t *popup = (ui_popup_t *)arg;
    230243
     244        /* Remember ID of device that sent the last event */
     245        popup->idev_id = event->pos_id;
     246
    231247        if (popup->cb != NULL && popup->cb->pos != NULL)
    232248                popup->cb->pos(popup, popup->arg, event);
Note: See TracChangeset for help on using the changeset viewer.