Changes in uspace/srv/hid/display/window.c [1215db9:be0ec50] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/hid/display/window.c
r1215db9 rbe0ec50 1 1 /* 2 * Copyright (c) 202 1Jiri Svoboda2 * Copyright (c) 2023 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 44 44 #include <memgfx/memgc.h> 45 45 #include <stdlib.h> 46 #include <str.h> 47 #include <wndmgt.h> 46 48 #include "client.h" 47 49 #include "display.h" 48 50 #include "seat.h" 49 51 #include "window.h" 52 #include "wmclient.h" 50 53 51 54 static void ds_window_invalidate_cb(void *, gfx_rect_t *); … … 64 67 * @param client Client owning the window 65 68 * @param params Window parameters 66 * @param r gc Place to store pointer to new GC.69 * @param rwnd Place to store pointer to new window. 67 70 * 68 71 * @return EOK on success or an error code 69 72 */ 70 73 errno_t ds_window_create(ds_client_t *client, display_wnd_params_t *params, 71 ds_window_t **r gc)74 ds_window_t **rwnd) 72 75 { 73 76 ds_window_t *wnd = NULL; … … 85 88 } 86 89 90 /* Caption */ 91 wnd->caption = str_dup(params->caption); 92 if (wnd->caption == NULL) { 93 rc = ENOMEM; 94 goto error; 95 } 96 97 wnd->flags = params->flags; 98 87 99 ds_client_add_window(client, wnd); 88 100 ds_display_add_window(client->display, wnd); … … 90 102 gfx_bitmap_params_init(&bparams); 91 103 bparams.rect = params->rect; 104 105 /* Allocate window bitmap */ 92 106 93 107 dgc = ds_display_get_gc(wnd->display); … … 122 136 wnd->gc = mem_gc_get_ctx(wnd->mgc); 123 137 wnd->cursor = wnd->display->cursor[dcurs_arrow]; 124 wnd->flags = params->flags;125 138 126 139 if ((params->flags & wndf_setpos) != 0) { … … 133 146 } 134 147 135 seat = ds_display_first_seat(client->display); 136 148 /* Determine which seat should own the window */ 149 if (params->idev_id != 0) 150 seat = ds_display_seat_by_idev(wnd->display, params->idev_id); 151 else 152 seat = ds_display_default_seat(wnd->display); 153 154 /* Is this a popup window? */ 137 155 if ((params->flags & wndf_popup) != 0) 138 156 ds_seat_set_popup(seat, wnd); … … 140 158 ds_seat_set_focus(seat, wnd); 141 159 160 /* Is this window a panel? */ 161 if ((params->flags & wndf_avoid) != 0) 162 ds_display_update_max_rect(wnd->display); 163 142 164 (void) ds_display_paint(wnd->display, NULL); 143 165 144 *r gc= wnd;166 *rwnd = wnd; 145 167 return EOK; 146 168 error: 147 169 if (wnd != NULL) { 170 ds_client_remove_window(wnd); 171 ds_display_remove_window(wnd); 172 if (wnd->mgc != NULL) 173 mem_gc_delete(wnd->mgc); 148 174 if (wnd->bitmap != NULL) 149 175 gfx_bitmap_destroy(wnd->bitmap); 176 if (wnd->caption != NULL) 177 free(wnd->caption); 150 178 free(wnd); 151 179 } … … 163 191 164 192 disp = wnd->display; 193 194 ds_window_unfocus(wnd); 165 195 166 196 ds_client_remove_window(wnd); 167 197 ds_display_remove_window(wnd); 168 198 199 if ((wnd->flags & wndf_avoid) != 0) 200 ds_display_update_max_rect(disp); 201 169 202 mem_gc_delete(wnd->mgc); 170 203 … … 172 205 gfx_bitmap_destroy(wnd->bitmap); 173 206 207 free(wnd->caption); 174 208 free(wnd); 175 209 … … 183 217 void ds_window_bring_to_top(ds_window_t *wnd) 184 218 { 185 ds_display_t *disp = wnd->display; 186 187 ds_display_remove_window(wnd); 188 ds_display_add_window(disp, wnd); 219 ds_display_window_to_top(wnd); 189 220 (void) ds_display_paint(wnd->display, NULL); 190 221 } … … 198 229 { 199 230 return wnd->gc; 231 } 232 233 /** Determine if window is visible. 234 * 235 * @param wnd Window 236 * @return @c true iff window is visible 237 */ 238 bool ds_window_is_visible(ds_window_t *wnd) 239 { 240 return (wnd->flags & wndf_minimized) == 0; 200 241 } 201 242 … … 212 253 gfx_rect_t crect; 213 254 214 log_msg(LOG_DEFAULT, LVL_DEBUG, "ds_window_paint"); 255 log_msg(LOG_DEFAULT, LVL_DEBUG2, "ds_window_paint"); 256 257 /* Skip painting the window if not visible */ 258 if (!ds_window_is_visible(wnd)) 259 return EOK; 215 260 216 261 if (rect != NULL) { … … 357 402 bool newr; 358 403 359 log_msg(LOG_DEFAULT, LVL_DEBUG , "ds_window_repaint_preview");404 log_msg(LOG_DEFAULT, LVL_DEBUG2, "ds_window_repaint_preview"); 360 405 361 406 /* … … 401 446 * @param wnd Window 402 447 * @param pos Position where mouse button was pressed 403 */ 404 static void ds_window_start_move(ds_window_t *wnd, gfx_coord2_t *pos) 448 * @param pos_id Positioning device ID 449 */ 450 static void ds_window_start_move(ds_window_t *wnd, gfx_coord2_t *pos, 451 sysarg_t pos_id) 405 452 { 406 453 log_msg(LOG_DEFAULT, LVL_DEBUG, "ds_window_start_move (%d, %d)", … … 411 458 412 459 wnd->orig_pos = *pos; 460 wnd->orig_pos_id = pos_id; 413 461 wnd->state = dsw_moving; 414 462 wnd->preview_pos = wnd->dpos; … … 440 488 wnd->dpos = nwpos; 441 489 wnd->state = dsw_idle; 490 wnd->orig_pos_id = 0; 442 491 443 492 (void) ds_display_paint(wnd->display, NULL); … … 455 504 gfx_rect_t old_rect; 456 505 457 log_msg(LOG_DEFAULT, LVL_DEBUG , "ds_window_update_move (%d, %d)",506 log_msg(LOG_DEFAULT, LVL_DEBUG2, "ds_window_update_move (%d, %d)", 458 507 (int) pos->x, (int) pos->y); 459 508 … … 474 523 * @param rsztype Resize type (which part of window is being dragged) 475 524 * @param pos Position where mouse button was pressed 525 * @param pos_id Positioning device ID 476 526 */ 477 527 static void ds_window_start_resize(ds_window_t *wnd, 478 display_wnd_rsztype_t rsztype, gfx_coord2_t *pos )528 display_wnd_rsztype_t rsztype, gfx_coord2_t *pos, sysarg_t pos_id) 479 529 { 480 530 ds_seat_t *seat; … … 487 537 return; 488 538 539 /* Determine which seat started the resize */ 540 seat = ds_display_seat_by_idev(wnd->display, pos_id); 541 if (seat == NULL) 542 return; 543 489 544 wnd->orig_pos = *pos; 545 wnd->orig_pos_id = pos_id; 490 546 wnd->state = dsw_resizing; 491 547 wnd->rsztype = rsztype; 492 548 wnd->preview_rect = wnd->rect; 493 549 494 // XXX Need client to tell us which seat started the resize!495 seat = ds_display_first_seat(wnd->display);496 550 ctype = display_cursor_from_wrsz(rsztype); 497 551 ds_seat_set_wm_cursor(seat, wnd->display->cursor[ctype]); … … 523 577 ds_client_post_resize_event(wnd->client, wnd, &nrect); 524 578 525 // XXX Need to know which seat started the resize! 526 seat = ds_display_first_seat(wnd->display); 527 ds_seat_set_wm_cursor(seat, NULL); 579 /* Determine which seat started the resize */ 580 seat = ds_display_seat_by_idev(wnd->display, wnd->orig_pos_id); 581 if (seat != NULL) 582 ds_seat_set_wm_cursor(seat, NULL); 583 584 wnd->orig_pos_id = 0; 528 585 529 586 (void) ds_display_paint(wnd->display, NULL); … … 541 598 gfx_rect_t old_rect; 542 599 543 log_msg(LOG_DEFAULT, LVL_DEBUG , "ds_window_update_resize (%d, %d)",600 log_msg(LOG_DEFAULT, LVL_DEBUG2, "ds_window_update_resize (%d, %d)", 544 601 (int) pos->x, (int) pos->y); 545 602 … … 580 637 * @param wnd Window 581 638 * @param event Position event 639 * 640 * @return EOK on success or an error code 582 641 */ 583 642 errno_t ds_window_post_pos_event(ds_window_t *wnd, pos_event_t *event) … … 585 644 pos_event_t tevent; 586 645 gfx_coord2_t pos; 646 sysarg_t pos_id; 587 647 gfx_rect_t drect; 588 648 bool inside; 589 649 590 log_msg(LOG_DEFAULT, LVL_DEBUG ,650 log_msg(LOG_DEFAULT, LVL_DEBUG2, 591 651 "ds_window_post_pos_event type=%d pos=%d,%d", event->type, 592 652 (int) event->hpos, (int) event->vpos); … … 594 654 pos.x = event->hpos; 595 655 pos.y = event->vpos; 656 pos_id = event->pos_id; 596 657 gfx_rect_translate(&wnd->dpos, &wnd->rect, &drect); 597 658 inside = gfx_pix_inside_rect(&pos, &drect); 598 659 599 if (event->type == POS_PRESS && event->btn_num == 2 && inside) { 600 ds_window_start_move(wnd, &pos); 660 if (event->type == POS_PRESS && event->btn_num == 2 && inside && 661 (wnd->flags & wndf_maximized) == 0) { 662 ds_window_start_move(wnd, &pos, pos_id); 601 663 return EOK; 602 664 } 603 665 604 666 if (event->type == POS_RELEASE) { 605 if (wnd->state == dsw_moving) { 667 /* Finish move/resize if they were started by the same seat */ 668 if (wnd->state == dsw_moving && 669 ds_window_orig_seat(wnd, pos_id)) { 606 670 ds_window_finish_move(wnd, &pos); 607 671 return EOK; 608 672 } 609 673 610 if (wnd->state == dsw_resizing) { 674 if (wnd->state == dsw_resizing && 675 ds_window_orig_seat(wnd, pos_id)) { 611 676 ds_window_finish_resize(wnd, &pos); 612 677 return EOK; … … 615 680 616 681 if (event->type == POS_UPDATE) { 617 if (wnd->state == dsw_moving) { 682 /* Update move/resize if they were started by the same seat */ 683 if (wnd->state == dsw_moving && 684 ds_window_orig_seat(wnd, pos_id)) { 618 685 ds_window_update_move(wnd, &pos); 619 686 return EOK; 620 687 } 621 688 622 if (wnd->state == dsw_resizing) { 689 if (wnd->state == dsw_resizing && 690 ds_window_orig_seat(wnd, pos_id)) { 623 691 ds_window_update_resize(wnd, &pos); 624 692 return EOK; … … 637 705 * 638 706 * @param wnd Window 707 * @return EOK on success or an error code 639 708 */ 640 709 errno_t ds_window_post_focus_event(ds_window_t *wnd) 641 710 { 711 display_wnd_focus_ev_t efocus; 712 errno_t rc; 713 ds_wmclient_t *wmclient; 714 642 715 log_msg(LOG_DEFAULT, LVL_DEBUG, "ds_window_post_focus_event"); 643 716 644 return ds_client_post_focus_event(wnd->client, wnd); 717 /* Increase focus counter */ 718 ++wnd->nfocus; 719 efocus.nfocus = wnd->nfocus; 720 721 rc = ds_client_post_focus_event(wnd->client, wnd, &efocus); 722 if (rc != EOK) 723 return rc; 724 725 /* Notify window managers about window information change */ 726 wmclient = ds_display_first_wmclient(wnd->display); 727 while (wmclient != NULL) { 728 ds_wmclient_post_wnd_changed_event(wmclient, wnd->id); 729 wmclient = ds_display_next_wmclient(wmclient); 730 } 731 732 return EOK; 645 733 } 646 734 … … 648 736 * 649 737 * @param wnd Window 738 * @return EOK on success or an error code 650 739 */ 651 740 errno_t ds_window_post_unfocus_event(ds_window_t *wnd) 652 741 { 742 display_wnd_unfocus_ev_t eunfocus; 743 errno_t rc; 744 ds_wmclient_t *wmclient; 745 653 746 log_msg(LOG_DEFAULT, LVL_DEBUG, "ds_window_post_unfocus_event"); 654 747 655 return ds_client_post_unfocus_event(wnd->client, wnd); 748 /* Decrease focus counter */ 749 --wnd->nfocus; 750 eunfocus.nfocus = wnd->nfocus; 751 752 rc = ds_client_post_unfocus_event(wnd->client, wnd, &eunfocus); 753 if (rc != EOK) 754 return rc; 755 756 /* Notify window managers about window information change */ 757 wmclient = ds_display_first_wmclient(wnd->display); 758 while (wmclient != NULL) { 759 ds_wmclient_post_wnd_changed_event(wmclient, wnd->id); 760 wmclient = ds_display_next_wmclient(wmclient); 761 } 762 763 return EOK; 656 764 } 657 765 … … 661 769 * @param pos Position where the pointer was when the move started 662 770 * relative to the window 771 * @param pos_id Positioning device ID 663 772 * @param event Button press event 664 773 */ 665 void ds_window_move_req(ds_window_t *wnd, gfx_coord2_t *pos )774 void ds_window_move_req(ds_window_t *wnd, gfx_coord2_t *pos, sysarg_t pos_id) 666 775 { 667 776 gfx_coord2_t orig_pos; … … 671 780 672 781 gfx_coord2_add(&wnd->dpos, pos, &orig_pos); 673 ds_window_start_move(wnd, &orig_pos );782 ds_window_start_move(wnd, &orig_pos, pos_id); 674 783 } 675 784 … … 691 800 { 692 801 *dpos = wnd->dpos; 802 } 803 804 /** Get maximized window rectangle. 805 * 806 * @param wnd Window 807 */ 808 void ds_window_get_max_rect(ds_window_t *wnd, gfx_rect_t *rect) 809 { 810 *rect = wnd->display->max_rect; 693 811 } 694 812 … … 699 817 * @param pos Position where the pointer was when the resize started 700 818 * relative to the window 819 * @param pos_id Positioning device ID 701 820 * @param event Button press event 702 821 */ 703 822 void ds_window_resize_req(ds_window_t *wnd, display_wnd_rsztype_t rsztype, 704 gfx_coord2_t *pos )823 gfx_coord2_t *pos, sysarg_t pos_id) 705 824 { 706 825 gfx_coord2_t orig_pos; 707 826 708 log_msg(LOG_DEFAULT, LVL_DEBUG, "ds_window_resize_req (%d, %d, %d )",709 (int) rsztype, (int) pos->x, (int) pos->y);827 log_msg(LOG_DEFAULT, LVL_DEBUG, "ds_window_resize_req (%d, %d, %d, %d)", 828 (int)rsztype, (int)pos->x, (int)pos->y, (int)pos_id); 710 829 711 830 gfx_coord2_add(&wnd->dpos, pos, &orig_pos); 712 ds_window_start_resize(wnd, rsztype, &orig_pos );831 ds_window_start_resize(wnd, rsztype, &orig_pos, pos_id); 713 832 } 714 833 … … 716 835 * 717 836 * @param wnd Window 837 * @return EOK on success or an error code 718 838 */ 719 839 errno_t ds_window_resize(ds_window_t *wnd, gfx_coord2_t *offs, … … 766 886 wnd->rect = *nrect; 767 887 888 if ((wnd->flags & wndf_avoid) != 0) 889 ds_display_update_max_rect(wnd->display); 890 768 891 (void) ds_display_paint(wnd->display, NULL); 892 return EOK; 893 } 894 895 /** Minimize window. 896 * 897 * @param wnd Window 898 * @return EOK on success or an error code 899 */ 900 errno_t ds_window_minimize(ds_window_t *wnd) 901 { 902 /* If already minimized, do nothing and return success. */ 903 if ((wnd->flags & wndf_minimized) != 0) 904 return EOK; 905 906 ds_window_unfocus(wnd); 907 908 wnd->flags |= wndf_minimized; 909 (void) ds_display_paint(wnd->display, NULL); 910 return EOK; 911 } 912 913 /** Unminimize window. 914 * 915 * @param wnd Window 916 * @return EOK on success or an error code 917 */ 918 errno_t ds_window_unminimize(ds_window_t *wnd) 919 { 920 /* If not minimized, do nothing and return success. */ 921 if ((wnd->flags & wndf_minimized) == 0) 922 return EOK; 923 924 wnd->flags &= ~wndf_minimized; 925 (void) ds_display_paint(wnd->display, NULL); 926 return EOK; 927 } 928 929 /** Maximize window. 930 * 931 * @param wnd Window 932 * @return EOK on success or an error code 933 */ 934 errno_t ds_window_maximize(ds_window_t *wnd) 935 { 936 gfx_coord2_t old_dpos; 937 gfx_rect_t old_rect; 938 gfx_coord2_t offs; 939 gfx_rect_t max_rect; 940 gfx_rect_t nrect; 941 errno_t rc; 942 943 /* If already maximized, do nothing and return success. */ 944 if ((wnd->flags & wndf_maximized) != 0) 945 return EOK; 946 947 /* Remember the old window rectangle and display position */ 948 old_rect = wnd->rect; 949 old_dpos = wnd->dpos; 950 951 ds_window_get_max_rect(wnd, &max_rect); 952 953 /* Keep window contents on the same position on the screen */ 954 offs.x = max_rect.p0.x - wnd->dpos.x; 955 offs.y = max_rect.p0.y - wnd->dpos.y; 956 957 /* Maximized window's coordinates will start at 0,0 */ 958 gfx_rect_rtranslate(&max_rect.p0, &max_rect, &nrect); 959 960 rc = ds_window_resize(wnd, &offs, &nrect); 961 if (rc != EOK) 962 return rc; 963 964 /* Set window flags, remember normal rectangle */ 965 wnd->flags |= wndf_maximized; 966 wnd->normal_rect = old_rect; 967 wnd->normal_dpos = old_dpos; 968 969 return EOK; 970 } 971 972 /** Unmaximize window. 973 * 974 * @param wnd Window 975 * @return EOK on success or an error code 976 */ 977 errno_t ds_window_unmaximize(ds_window_t *wnd) 978 { 979 gfx_coord2_t offs; 980 errno_t rc; 981 982 /* If not maximized, do nothing and return success. */ 983 if ((wnd->flags & wndf_maximized) == 0) 984 return EOK; 985 986 /* Keep window contents on the same position on the screen */ 987 offs.x = wnd->normal_dpos.x - wnd->dpos.x; 988 offs.y = wnd->normal_dpos.y - wnd->dpos.y; 989 990 rc = ds_window_resize(wnd, &offs, &wnd->normal_rect); 991 if (rc != EOK) 992 return rc; 993 994 /* Clear maximized flag */ 995 wnd->flags &= ~wndf_maximized; 996 769 997 return EOK; 770 998 } … … 812 1040 * 813 1041 * @param wnd Window 1042 * @param cursor New cursor 814 1043 * @return EOK on success, EINVAL if @a cursor is invalid 815 1044 */ … … 825 1054 } 826 1055 1056 /** Set window caption. 1057 * 1058 * @param wnd Window 1059 * @param caption New caption 1060 * 1061 * @return EOK on success, EINVAL if @a cursor is invalid 1062 */ 1063 errno_t ds_window_set_caption(ds_window_t *wnd, const char *caption) 1064 { 1065 char *dcaption; 1066 ds_wmclient_t *wmclient; 1067 1068 dcaption = str_dup(caption); 1069 if (dcaption == NULL) 1070 return ENOMEM; 1071 1072 free(wnd->caption); 1073 wnd->caption = dcaption; 1074 1075 /* Notify window managers about window information change */ 1076 wmclient = ds_display_first_wmclient(wnd->display); 1077 while (wmclient != NULL) { 1078 ds_wmclient_post_wnd_changed_event(wmclient, wnd->id); 1079 wmclient = ds_display_next_wmclient(wmclient); 1080 } 1081 1082 return EOK; 1083 } 1084 1085 /** Find alternate window with the allowed flags. 1086 * 1087 * An alternate window is a *different* window that is preferably previous 1088 * in the display order and only has the @a allowed flags. 1089 * 1090 * @param wnd Window 1091 * @param allowed_flags Bitmask of flags that the window is allowed to have 1092 * 1093 * @return Alternate window matching the criteria or @c NULL if there is none 1094 */ 1095 ds_window_t *ds_window_find_prev(ds_window_t *wnd, 1096 display_wnd_flags_t allowed_flags) 1097 { 1098 ds_window_t *nwnd; 1099 1100 /* Try preceding windows in display order */ 1101 nwnd = ds_display_next_window(wnd); 1102 while (nwnd != NULL && (nwnd->flags & ~allowed_flags) != 0) { 1103 nwnd = ds_display_next_window(nwnd); 1104 } 1105 1106 /* Do we already have a matching window? */ 1107 if (nwnd != NULL && (nwnd->flags & ~allowed_flags) == 0) { 1108 return nwnd; 1109 } 1110 1111 /* Try succeeding windows in display order */ 1112 nwnd = ds_display_first_window(wnd->display); 1113 while (nwnd != NULL && nwnd != wnd && 1114 (nwnd->flags & ~allowed_flags) != 0) { 1115 nwnd = ds_display_next_window(nwnd); 1116 } 1117 1118 if (nwnd == wnd) 1119 return NULL; 1120 1121 return nwnd; 1122 } 1123 1124 /** Find alternate window with the allowed flags. 1125 * 1126 * An alternate window is a *different* window that is preferably previous 1127 * in the display order and only has the @a allowed flags. 1128 * 1129 * @param wnd Window 1130 * @param allowed_flags Bitmask of flags that the window is allowed to have 1131 * 1132 * @return Alternate window matching the criteria or @c NULL if there is none 1133 */ 1134 ds_window_t *ds_window_find_next(ds_window_t *wnd, 1135 display_wnd_flags_t allowed_flags) 1136 { 1137 ds_window_t *nwnd; 1138 1139 /* Try preceding windows in display order */ 1140 nwnd = ds_display_prev_window(wnd); 1141 while (nwnd != NULL && (nwnd->flags & ~allowed_flags) != 0) { 1142 nwnd = ds_display_prev_window(nwnd); 1143 } 1144 1145 /* Do we already have a matching window? */ 1146 if (nwnd != NULL && (nwnd->flags & ~allowed_flags) == 0) { 1147 return nwnd; 1148 } 1149 1150 /* Try succeeding windows in display order */ 1151 nwnd = ds_display_last_window(wnd->display); 1152 while (nwnd != NULL && nwnd != wnd && 1153 (nwnd->flags & ~allowed_flags) != 0) { 1154 nwnd = ds_display_prev_window(nwnd); 1155 } 1156 1157 if (nwnd == wnd) 1158 return NULL; 1159 1160 return nwnd; 1161 } 1162 1163 /** Remove focus from window. 1164 * 1165 * Used to switch focus to another window when closing or minimizing window. 1166 * 1167 * @param wnd Window 1168 */ 1169 void ds_window_unfocus(ds_window_t *wnd) 1170 { 1171 ds_seat_t *seat; 1172 1173 /* Make sure window is no longer focused in any seat */ 1174 seat = ds_display_first_seat(wnd->display); 1175 while (seat != NULL) { 1176 ds_seat_unfocus_wnd(seat, wnd); 1177 seat = ds_display_next_seat(seat); 1178 } 1179 } 1180 1181 /** Determine if input device belongs to the same seat as the original device. 1182 * 1183 * Compare the seat ownning @a idev_id with the seat owning @a wnd->orig_pos_id 1184 * (the device that started the window move or resize). 1185 * 1186 * This is used to make sure that, when two seats focus the same window, 1187 * only devices owned by the seat that started the resize or move can 1188 * affect it. Otherwise moving the other pointer(s) would disrupt the 1189 * resize or move operation. 1190 * 1191 * @param wnd Window (that is currently being resized or moved) 1192 * @param idev_id Input device ID 1193 * @return @c true iff idev_id is owned by the same seat as the input 1194 * device that started the resize or move 1195 */ 1196 bool ds_window_orig_seat(ds_window_t *wnd, sysarg_t idev_id) 1197 { 1198 ds_seat_t *orig_seat; 1199 ds_seat_t *seat; 1200 1201 /* Window must be in state such that wnd->orig_pos_id is valid */ 1202 assert(wnd->state == dsw_moving || wnd->state == dsw_resizing); 1203 1204 orig_seat = ds_display_seat_by_idev(wnd->display, wnd->orig_pos_id); 1205 seat = ds_display_seat_by_idev(wnd->display, idev_id); 1206 1207 return seat == orig_seat; 1208 } 1209 827 1210 /** Window memory GC invalidate callback. 828 1211 *
Note:
See TracChangeset
for help on using the changeset viewer.