Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/hid/display/seat.c

    r9546146 r1543d4c  
    11/*
    2  * Copyright (c) 2024 Jiri Svoboda
     2 * Copyright (c) 2023 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    3838#include <gfx/color.h>
    3939#include <gfx/render.h>
    40 #include <sif.h>
    41 #include <stdio.h>
    4240#include <stdlib.h>
    4341#include <str.h>
     
    119117        free(seat->name);
    120118        free(seat);
    121 }
    122 
    123 /** Load seat from SIF node.
    124  *
    125  * @param display Display
    126  * @param snode Seat node from which to load the seat
    127  * @param rseat Place to store pointer to the newly loaded seat
    128  *
    129  * @return EOK on success or an error code
    130  */
    131 errno_t ds_seat_load(ds_display_t *display, sif_node_t *snode,
    132     ds_seat_t **rseat)
    133 {
    134         const char *sid;
    135         const char *name;
    136         char *endptr;
    137         unsigned long id;
    138         errno_t rc;
    139 
    140         sid = sif_node_get_attr(snode, "id");
    141         if (sid == NULL)
    142                 return EIO;
    143 
    144         name = sif_node_get_attr(snode, "name");
    145         if (name == NULL)
    146                 return EIO;
    147 
    148         id = strtoul(sid, &endptr, 10);
    149         if (*endptr != '\0')
    150                 return EIO;
    151 
    152         rc = ds_seat_create(display, name, rseat);
    153         if (rc != EOK)
    154                 return EIO;
    155 
    156         (*rseat)->id = id;
    157         return EOK;
    158 }
    159 
    160 /** Save seat to SIF node.
    161  *
    162  * @param seat Seat
    163  * @param snode Seat node into which the seat should be saved
    164  *
    165  * @return EOK on success or an error code
    166  */
    167 errno_t ds_seat_save(ds_seat_t *seat, sif_node_t *snode)
    168 {
    169         char *sid;
    170         errno_t rc;
    171         int rv;
    172 
    173         rv = asprintf(&sid, "%lu", (unsigned long)seat->id);
    174         if (rv < 0) {
    175                 rc = ENOMEM;
    176                 return rc;
    177         }
    178 
    179         rc = sif_node_set_attr(snode, "id", sid);
    180         if (rc != EOK) {
    181                 free(sid);
    182                 return rc;
    183         }
    184 
    185         free(sid);
    186 
    187         rc = sif_node_set_attr(snode, "name", seat->name);
    188         if (rc != EOK)
    189                 return rc;
    190 
    191         return EOK;
    192119}
    193120
     
    583510errno_t ds_seat_post_pos_event(ds_seat_t *seat, pos_event_t *event)
    584511{
    585         ds_window_t *pwindow;
    586         ds_window_t *cwindow;
     512        ds_window_t *wnd;
    587513        errno_t rc;
    588514
    589         /* Window under pointer */
    590         pwindow = ds_display_window_by_pos(seat->display, &seat->pntpos);
    591 
    592         /* Current window: popup or focused */
    593         cwindow = seat->popup;
    594         if (cwindow == NULL)
    595                 cwindow = seat->focus;
    596 
    597         /*
    598          * Deliver move and release event to current window if different
    599          * from pwindow
    600          */
    601         if (event->type != POS_PRESS && cwindow != NULL &&
    602             cwindow != pwindow) {
    603                 rc = ds_window_post_pos_event(cwindow, event);
    604                 if (rc != EOK)
    605                         return rc;
    606         }
    607 
    608         if (pwindow != NULL) {
     515        wnd = ds_display_window_by_pos(seat->display, &seat->pntpos);
     516
     517        /* Deliver event to popup window. */
     518        if (seat->popup != NULL && event->type != POS_PRESS) {
     519                rc = ds_window_post_pos_event(seat->popup, event);
     520                if (rc != EOK)
     521                        return rc;
     522        }
     523
     524        if (seat->focus != wnd && seat->focus != NULL) {
     525                rc = ds_window_post_pos_event(seat->focus, event);
     526                if (rc != EOK)
     527                        return rc;
     528
     529                /* Only deliver release events to the focused window */
     530                if (event->type == POS_RELEASE)
     531                        return EOK;
     532        }
     533
     534        if (wnd != NULL) {
    609535                /* Moving over a window */
    610                 ds_seat_set_client_cursor(seat, pwindow->cursor);
    611 
    612                 rc = ds_window_post_pos_event(pwindow, event);
    613                 if (rc != EOK)
    614                         return rc;
     536                ds_seat_set_client_cursor(seat, wnd->cursor);
     537
     538                /*
     539                 * Only deliver event if we didn't already deliver it
     540                 * to the same window above.
     541                 */
     542                if (wnd != seat->popup || event->type == POS_PRESS) {
     543                        rc = ds_window_post_pos_event(wnd, event);
     544                        if (rc != EOK)
     545                                return rc;
     546                }
    615547        } else {
    616548                /* Not over a window */
    617                 ds_seat_set_client_cursor(seat,
    618                     seat->display->cursor[dcurs_arrow]);
     549                ds_seat_set_client_cursor(seat, seat->display->cursor[dcurs_arrow]);
    619550        }
    620551
    621552        /* Click outside popup window */
    622         if (event->type == POS_PRESS && pwindow != seat->popup) {
     553        if (event->type == POS_PRESS && wnd != seat->popup) {
    623554                /* Close popup window */
    624555                ds_seat_set_popup(seat, NULL);
Note: See TracChangeset for help on using the changeset viewer.