Changes in uspace/srv/hid/display/seat.c [554a5f1:d7f82635] in mainline
- File:
-
- 1 edited
-
uspace/srv/hid/display/seat.c (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/hid/display/seat.c
r554a5f1 rd7f82635 1 1 /* 2 * Copyright (c) 20 19Jiri Svoboda2 * Copyright (c) 2021 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 104 104 ds_window_bring_to_top(wnd); 105 105 } 106 } 107 108 /** Evacuate focus from window. 106 107 /* When focus changes, popup window should be closed */ 108 ds_seat_set_popup(seat, NULL); 109 } 110 111 /** Set seat popup window. 112 * 113 * @param seat Seat 114 * @param wnd Popup window 115 */ 116 void ds_seat_set_popup(ds_seat_t *seat, ds_window_t *wnd) 117 { 118 if (wnd == seat->popup) 119 return; 120 121 if (seat->popup != NULL) { 122 /* Window is no longer the popup window, send close request */ 123 ds_client_post_close_event(seat->popup->client, 124 seat->popup); 125 } 126 127 seat->popup = wnd; 128 } 129 130 /** Evacuate seat references to window. 109 131 * 110 132 * If seat's focus is @a wnd, it will be set to a different window. 133 * If seat's popup window is @a wnd, it will be set to NULL. 111 134 * 112 135 * @param seat Seat 113 136 * @param wnd Window to evacuate focus from 114 137 */ 115 void ds_seat_evac_ focus(ds_seat_t *seat, ds_window_t *wnd)138 void ds_seat_evac_wnd_refs(ds_seat_t *seat, ds_window_t *wnd) 116 139 { 117 140 ds_window_t *nwnd; 118 141 119 142 if (seat->focus == wnd) { 120 nwnd = ds_display_ next_window(wnd);143 nwnd = ds_display_prev_window(wnd); 121 144 if (nwnd == NULL) 122 nwnd = ds_display_ first_window(wnd->display);145 nwnd = ds_display_last_window(wnd->display); 123 146 if (nwnd == wnd) 124 147 nwnd = NULL; … … 126 149 ds_seat_set_focus(seat, nwnd); 127 150 } 151 152 if (seat->popup == wnd) 153 ds_seat_set_popup(seat, NULL); 154 } 155 156 /** Switch focus to another window. 157 * 158 * @param seat Seat 159 * @param wnd Window to evacuate focus from 160 */ 161 void ds_seat_switch_focus(ds_seat_t *seat) 162 { 163 ds_window_t *nwnd; 164 165 if (seat->focus != NULL) 166 nwnd = ds_display_prev_window(seat->focus); 167 else 168 nwnd = NULL; 169 170 if (nwnd == NULL) 171 nwnd = ds_display_last_window(seat->display); 172 173 if (nwnd != NULL) 174 ds_seat_set_focus(seat, nwnd); 128 175 } 129 176 … … 143 190 if (event->type == KEY_PRESS && alt_or_shift && event->key == KC_TAB) { 144 191 /* On Alt-Tab or Shift-Tab, switch focus to next window */ 145 ds_seat_ evac_focus(seat, seat->focus);192 ds_seat_switch_focus(seat); 146 193 return EOK; 147 194 } 148 195 149 dwindow = seat->focus; 196 dwindow = seat->popup; 197 if (dwindow == NULL) 198 dwindow = seat->focus; 199 150 200 if (dwindow == NULL) 151 201 return EOK; … … 307 357 /* Focus window on button press */ 308 358 if (event->type == PTD_PRESS && event->btn_num == 1) { 309 if (wnd != NULL ) {359 if (wnd != NULL && (wnd->flags & wndf_popup) == 0) { 310 360 ds_seat_set_focus(seat, wnd); 311 361 } … … 390 440 wnd = ds_display_window_by_pos(seat->display, &seat->pntpos); 391 441 392 if (seat->focus != wnd) { 442 /* Click outside popup window */ 443 if (event->type == POS_PRESS && wnd != seat->popup) { 444 /* Close popup window */ 445 ds_seat_set_popup(seat, NULL); 446 } 447 448 /* Deliver event to popup window. */ 449 if (seat->popup != NULL) { 450 rc = ds_window_post_pos_event(seat->popup, event); 451 if (rc != EOK) 452 return rc; 453 } 454 455 if (seat->focus != wnd && seat->focus != NULL) { 393 456 rc = ds_window_post_pos_event(seat->focus, event); 394 457 if (rc != EOK) … … 404 467 ds_seat_set_client_cursor(seat, wnd->cursor); 405 468 406 rc = ds_window_post_pos_event(wnd, event); 407 if (rc != EOK) 408 return rc; 469 /* 470 * Only deliver event if we didn't already deliver it 471 * to the same window above. 472 */ 473 if (wnd != seat->popup) { 474 rc = ds_window_post_pos_event(wnd, event); 475 if (rc != EOK) 476 return rc; 477 } 409 478 } else { 410 479 /* Not over a window */
Note:
See TracChangeset
for help on using the changeset viewer.
