Changeset b1f0a14 in mainline for uspace/lib/ui/src/ui.c


Ignore:
Timestamp:
2023-01-22T11:05:28Z (2 years 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/lib/ui/src/ui.c

    r5d380b6 rb1f0a14  
    11/*
    2  * Copyright (c) 2022 Jiri Svoboda
     2 * Copyright (c) 2023 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    4848#include <str.h>
    4949#include <task.h>
     50#include <types/common.h>
    5051#include <ui/clickmatic.h>
    5152#include <ui/ui.h>
     
    6566 * @param ws Place to store window system type (protocol)
    6667 * @param osvc Place to store pointer to output service name
    67  */
    68 static void ui_ospec_parse(const char *ospec, ui_winsys_t *ws,
    69     const char **osvc)
     68 * @param ridev_id Place to store input device ID
     69 * @return EOK on success, EINVAL if syntax is invalid, ENOMEM if out of
     70 *         memory
     71 */
     72static errno_t ui_ospec_parse(const char *ospec, ui_winsys_t *ws,
     73    char **osvc, sysarg_t *ridev_id)
    7074{
    7175        const char *cp;
     76        const char *qm;
     77        const char *endptr;
     78        uint64_t idev_id;
     79        errno_t rc;
     80
     81        *ridev_id = 0;
    7282
    7383        cp = ospec;
     
    7585                ++cp;
    7686
     87        /* Window system / protocol */
    7788        if (*cp == '@') {
    7889                if (str_lcmp(ospec, "disp@", str_length("disp@")) == 0) {
     
    8899                }
    89100
    90                 if (cp[1] != '\0')
    91                         *osvc = cp + 1;
    92                 else
    93                         *osvc = NULL;
     101                ++cp;
    94102        } else {
    95103                *ws = ui_ws_display;
    96                 *osvc = ospec;
    97         }
     104        }
     105
     106        /* Output service is the part before question mark */
     107        qm = str_chr(cp, '?');
     108        if (qm != NULL) {
     109                *osvc = str_ndup(cp, qm - cp);
     110        } else {
     111                /* No question mark */
     112                *osvc = str_dup(cp);
     113        }
     114
     115        if (*osvc == NULL)
     116                return ENOMEM;
     117
     118        if (qm != NULL) {
     119                /* The part after the question mark */
     120                cp = qm + 1;
     121
     122                /* Input device ID parameter */
     123                if (str_lcmp(cp, "idev=", str_length("idev=")) == 0) {
     124                        cp += str_length("idev=");
     125
     126                        rc = str_uint64_t(cp, &endptr, 10, false, &idev_id);
     127                        if (rc != EOK)
     128                                goto error;
     129
     130                        *ridev_id = idev_id;
     131                        cp = endptr;
     132                }
     133        }
     134
     135        if (*cp != '\0') {
     136                rc = EINVAL;
     137                goto error;
     138        }
     139
     140        return EOK;
     141error:
     142        free(*osvc);
     143        *osvc = NULL;
     144        return rc;
    98145}
    99146
     
    114161        console_gc_t *cgc;
    115162        ui_winsys_t ws;
    116         const char *osvc;
     163        char *osvc;
    117164        sysarg_t cols;
    118165        sysarg_t rows;
     166        sysarg_t idev_id;
    119167        ui_t *ui;
    120168
    121         ui_ospec_parse(ospec, &ws, &osvc);
     169        rc = ui_ospec_parse(ospec, &ws, &osvc, &idev_id);
     170        if (rc != EOK)
     171                return rc;
    122172
    123173        if (ws == ui_ws_display || ws == ui_ws_any) {
    124                 rc = display_open(osvc != NULL ? osvc : DISPLAY_DEFAULT,
    125                     &display);
     174                rc = display_open((str_cmp(osvc, "") != 0) ? osvc :
     175                    DISPLAY_DEFAULT, &display);
    126176                if (rc != EOK)
    127177                        goto disp_fail;
     
    133183                }
    134184
     185                free(osvc);
    135186                ui->myoutput = true;
     187                ui->idev_id = idev_id;
    136188                *rui = ui;
    137189                return EOK;
     
    166218                }
    167219
     220                free(osvc);
     221
    168222                ui->cgc = cgc;
    169223                ui->rect.p0.x = 0;
     
    180234cons_fail:
    181235        if (ws == ui_ws_null) {
     236                free(osvc);
    182237                rc = ui_create_disp(NULL, &ui);
    183238                if (rc != EOK)
     
    189244        }
    190245
     246        free(osvc);
    191247        return EINVAL;
    192248}
Note: See TracChangeset for help on using the changeset viewer.