Changeset b1f0a14 in mainline for uspace/app/launcher/launcher.c


Ignore:
Timestamp:
2023-01-22T11:05:28Z (15 months ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
0161d16
Parents:
5d380b6
Message:

Pass input device ID via display specification argument

This allows launcher to start applications in the correct seat,
meaning the correct seat's focus will be changed to the newly
created window.

File:
1 edited

Legend:

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

    r5d380b6 rb1f0a14  
    11/*
    2  * Copyright (c) 2021 Jiri Svoboda
     2 * Copyright (c) 2023 Jiri Svoboda
    33 * Copyright (c) 2012 Petr Koupy
    44 * All rights reserved.
     
    5959
    6060static void wnd_close(ui_window_t *, void *);
     61static void wnd_pos(ui_window_t *, void *, pos_event_t *);
    6162
    6263static ui_window_cb_t window_cb = {
    63         .close = wnd_close
     64        .close = wnd_close,
     65        .pos = wnd_pos
    6466};
    6567
     
    7072};
    7173
    72 static int app_launchl(const char *, ...);
     74static int app_launchl(launcher_t *, const char *, ...);
    7375
    7476/** Window close button was clicked.
     
    8486}
    8587
     88/** Window received position event.
     89 *
     90 * @param window Window
     91 * @param arg Argument (launcher)
     92 * @param event Position event
     93 */
     94static void wnd_pos(ui_window_t *window, void *arg, pos_event_t *event)
     95{
     96        launcher_t *launcher = (launcher_t *) arg;
     97
     98        /* Remember ID of device that sent the last event */
     99        launcher->ev_pos_id = event->pos_id;
     100
     101        ui_window_def_pos(window, event);
     102}
     103
    86104/** Push button was clicked.
    87105 *
     
    94112
    95113        if (pbutton == launcher->pb1) {
    96                 app_launchl("/app/terminal", "-c", "/app/nav", NULL);
     114                app_launchl(launcher, "/app/terminal", "-c", "/app/nav", NULL);
    97115        } else if (pbutton == launcher->pb2) {
    98                 app_launchl("/app/terminal", "-c", "/app/edit", NULL);
     116                app_launchl(launcher, "/app/terminal", "-c", "/app/edit", NULL);
    99117        } else if (pbutton == launcher->pb3) {
    100                 app_launchl("/app/terminal", NULL);
     118                app_launchl(launcher, "/app/terminal", NULL);
    101119        } else if (pbutton == launcher->pb4) {
    102                 app_launchl("/app/calculator", NULL);
     120                app_launchl(launcher, "/app/calculator", NULL);
    103121        } else if (pbutton == launcher->pb5) {
    104                 app_launchl("/app/uidemo", NULL);
     122                app_launchl(launcher, "/app/uidemo", NULL);
    105123        } else if (pbutton == launcher->pb6) {
    106                 app_launchl("/app/gfxdemo", "ui", NULL);
    107         }
    108 }
    109 
    110 static int app_launchl(const char *app, ...)
     124                app_launchl(launcher, "/app/gfxdemo", "ui", NULL);
     125        }
     126}
     127
     128static int app_launchl(launcher_t *launcher, const char *app, ...)
    111129{
    112130        errno_t rc;
     
    117135        const char **argv;
    118136        const char **argp;
     137        char *dspec;
    119138        int cnt = 0;
    120139        int i;
     140        int rv;
    121141
    122142        va_start(ap, app);
     
    137157        *argp++ = app;
    138158
    139         if (str_cmp(display_spec, UI_DISPLAY_DEFAULT) != 0) {
    140                 *argp++ = "-d";
    141                 *argp++ = display_spec;
    142         }
     159        rv = asprintf(&dspec, "%s?idev=%zu", display_spec,
     160            (size_t)launcher->ev_pos_id);
     161        if (rv < 0) {
     162                printf("Out of memory.\n");
     163                return -1;
     164        }
     165
     166        /* TODO Might be omitted if default display AND only one seat */
     167        *argp++ = "-d";
     168        *argp++ = dspec;
    143169
    144170        va_start(ap, app);
     
    192218        gfx_rect_t rect;
    193219        gfx_coord2_t off;
     220        const char *dspec = UI_DISPLAY_DEFAULT;
     221        char *qmark;
    194222        errno_t rc;
    195223
     
    204232                        }
    205233
    206                         display_spec = argv[i++];
     234                        dspec = argv[i++];
    207235                } else {
    208236                        printf("Invalid option '%s'.\n", argv[i]);
     
    212240        }
    213241
    214         rc = ui_create(display_spec, &ui);
     242        display_spec = str_dup(dspec);
     243        if (display_spec == NULL) {
     244                printf("Out of memory.\n");
     245                return 1;
     246        }
     247
     248        /* Remove additional arguments */
     249        qmark = str_chr(display_spec, '?');
     250        if (qmark != NULL)
     251                *qmark = '\0';
     252
     253        rc = ui_create(dspec, &ui);
    215254        if (rc != EOK) {
    216255                printf("Error creating UI on display %s.\n", display_spec);
Note: See TracChangeset for help on using the changeset viewer.