Changes in uspace/srv/hid/display/seat.c [0d00e53:1543d4c] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/hid/display/seat.c
r0d00e53 r1543d4c 1 1 /* 2 * Copyright (c) 202 4Jiri Svoboda2 * Copyright (c) 2023 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>42 40 #include <stdlib.h> 43 41 #include <str.h> … … 121 119 } 122 120 123 /** Load seat from SIF node.124 *125 * @param display Display126 * @param snode Seat node from which to load the seat127 * @param rseat Place to store pointer to the newly loaded seat128 *129 * @return EOK on success or an error code130 */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 Seat163 * @param snode Seat node into which the seat should be saved164 *165 * @return EOK on success or an error code166 */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 194 121 /** Set seat focus to a window. 195 122 * … … 492 419 /* Focus window on button press */ 493 420 if (event->type == PTD_PRESS && event->btn_num == 1) { 494 if (wnd != NULL && (wnd->flags & wndf_popup) == 0 && 495 (wnd->flags & wndf_nofocus) == 0) { 421 if (wnd != NULL && (wnd->flags & wndf_popup) == 0) { 496 422 ds_seat_set_focus(seat, wnd); 497 423 } … … 584 510 errno_t ds_seat_post_pos_event(ds_seat_t *seat, pos_event_t *event) 585 511 { 586 ds_window_t *pwindow; 587 ds_window_t *cwindow; 512 ds_window_t *wnd; 588 513 errno_t rc; 589 514 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 different600 * from pwindow601 */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) {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) { 610 535 /* Moving over a window */ 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; 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 } 616 547 } else { 617 548 /* Not over a window */ 618 ds_seat_set_client_cursor(seat, 619 seat->display->cursor[dcurs_arrow]); 549 ds_seat_set_client_cursor(seat, seat->display->cursor[dcurs_arrow]); 620 550 } 621 551 622 552 /* Click outside popup window */ 623 if (event->type == POS_PRESS && pwindow!= seat->popup) {553 if (event->type == POS_PRESS && wnd != seat->popup) { 624 554 /* Close popup window */ 625 555 ds_seat_set_popup(seat, NULL);
Note:
See TracChangeset
for help on using the changeset viewer.