Changes in uspace/srv/hid/display/seat.c [1543d4c:0d00e53] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/hid/display/seat.c
r1543d4c r0d00e53 1 1 /* 2 * Copyright (c) 202 3Jiri Svoboda2 * Copyright (c) 2024 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 38 38 #include <gfx/color.h> 39 39 #include <gfx/render.h> 40 #include <sif.h> 41 #include <stdio.h> 40 42 #include <stdlib.h> 41 43 #include <str.h> … … 119 121 } 120 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; 192 } 193 121 194 /** Set seat focus to a window. 122 195 * … … 419 492 /* Focus window on button press */ 420 493 if (event->type == PTD_PRESS && event->btn_num == 1) { 421 if (wnd != NULL && (wnd->flags & wndf_popup) == 0) { 494 if (wnd != NULL && (wnd->flags & wndf_popup) == 0 && 495 (wnd->flags & wndf_nofocus) == 0) { 422 496 ds_seat_set_focus(seat, wnd); 423 497 } … … 510 584 errno_t ds_seat_post_pos_event(ds_seat_t *seat, pos_event_t *event) 511 585 { 512 ds_window_t *wnd; 586 ds_window_t *pwindow; 587 ds_window_t *cwindow; 513 588 errno_t rc; 514 589 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) {590 /* Window under pointer */ 591 pwindow = ds_display_window_by_pos(seat->display, &seat->pntpos); 592 593 /* Current window: popup or focused */ 594 cwindow = seat->popup; 595 if (cwindow == NULL) 596 cwindow = seat->focus; 597 598 /* 599 * Deliver move and release event to current window if different 600 * from pwindow 601 */ 602 if (event->type != POS_PRESS && cwindow != NULL && 603 cwindow != pwindow) { 604 rc = ds_window_post_pos_event(cwindow, event); 605 if (rc != EOK) 606 return rc; 607 } 608 609 if (pwindow != NULL) { 535 610 /* Moving over a window */ 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 } 611 ds_seat_set_client_cursor(seat, pwindow->cursor); 612 613 rc = ds_window_post_pos_event(pwindow, event); 614 if (rc != EOK) 615 return rc; 547 616 } else { 548 617 /* Not over a window */ 549 ds_seat_set_client_cursor(seat, seat->display->cursor[dcurs_arrow]); 618 ds_seat_set_client_cursor(seat, 619 seat->display->cursor[dcurs_arrow]); 550 620 } 551 621 552 622 /* Click outside popup window */ 553 if (event->type == POS_PRESS && wnd!= seat->popup) {623 if (event->type == POS_PRESS && pwindow != seat->popup) { 554 624 /* Close popup window */ 555 625 ds_seat_set_popup(seat, NULL);
Note:
See TracChangeset
for help on using the changeset viewer.