2 * Copyright (C) 2000-2007 Carsten Haitzler, Geoff Harrison and various contributors
3 * Copyright (C) 2004-2008 Kim Woelders
5 * Permission is hereby granted, free of charge, to any person obtaining a copy
6 * of this software and associated documentation files (the "Software"), to
7 * deal in the Software without restriction, including without limitation the
8 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
9 * sell copies of the Software, and to permit persons to whom the Software is
10 * furnished to do so, subject to the following conditions:
12 * The above copyright notice and this permission notice shall be included in
13 * all copies of the Software, its documentation and marketing & publicity
14 * materials, and acknowledgment shall be given in the documentation, materials
15 * and software packages that this Software was used.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
21 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 #include "e16-ecore_hints.h"
31 #include <X11/Xutil.h>
34 #include <X11/extensions/sync.h>
37 static void ICCCM_SetIconSizes(void);
52 wm_props[0] = ECORE_X_ATOM_WM_DELETE_WINDOW;
53 XSetWMProtocols(disp, WinGetXwin(VROOT), wm_props, 1);
58 ICCCM_ProcessClientClientMessage(EWin * ewin, XClientMessageEvent * event)
60 if (event->message_type == ECORE_X_ATOM_WM_CHANGE_STATE)
62 if (event->data.l[0] == IconicState)
73 ICCCM_ProcessRootClientMessage(XClientMessageEvent * event)
77 if (event->message_type == ECORE_X_ATOM_WM_PROTOCOLS)
80 if (a == ECORE_X_ATOM_WM_DELETE_WINDOW)
81 SessionExit(EEXIT_EXIT, NULL);
89 ICCCM_GetTitle(EWin * ewin)
91 _EFREE(EwinGetIcccmName(ewin));
93 EwinGetIcccmName(ewin) = ecore_x_icccm_title_get(EwinGetClientXwin(ewin));
95 EwinChange(ewin, EWIN_CHANGE_NAME);
99 ICCCM_GetColormap(EWin * ewin)
101 XWindowAttributes xwa;
103 ewin->client.cmap = None;
104 if (XGetWindowAttributes(disp, EwinGetClientXwin(ewin), &xwa)
106 ewin->client.cmap = xwa.colormap;
110 ICCCM_Delete(const EWin * ewin)
112 if (EwinIsInternal(ewin))
114 EwinHide((EWin *) ewin);
118 if (ewin->icccm.delete_window)
119 ecore_x_icccm_delete_window_send(EwinGetClientXwin(ewin), CurrentTime);
121 XKillClient(disp, EwinGetClientXwin(ewin));
124 #if 0 /* Deprecated */
126 ICCCM_Save(const EWin * ewin)
128 if (EwinIsInternal(ewin))
131 ecore_x_icccm_send_save_yourself(EwinGetClientXwin(ewin));
136 ICCCM_Iconify(const EWin * ewin)
138 EUnmapWindow(EwinGetClientWin(ewin));
139 ecore_x_icccm_state_set_iconic(EwinGetClientXwin(ewin));
143 ICCCM_DeIconify(const EWin * ewin)
145 EMapWindow(EwinGetClientWin(ewin));
146 ecore_x_icccm_state_set_normal(EwinGetClientXwin(ewin));
150 ICCCM_Withdraw(const EWin * ewin)
152 /* We have a choice of deleting the WM_STATE property
153 * or changing the value to Withdrawn. Since twm/fvwm does
154 * it that way, we change it to Withdrawn.
156 ecore_x_icccm_state_set_withdrawn(EwinGetClientXwin(ewin));
158 XRemoveFromSaveSet(disp, EwinGetClientXwin(ewin));
162 ICCCM_SizeMatch(const EWin * ewin, int wi, int hi, int *pwo, int *pho)
166 double aspect, dw, dh;
171 if (w < ewin->icccm.width_min)
172 w = ewin->icccm.width_min;
173 if (w > ewin->icccm.width_max)
174 w = ewin->icccm.width_max;
175 if (h < ewin->icccm.height_min)
176 h = ewin->icccm.height_min;
177 if (h > ewin->icccm.height_max)
178 h = ewin->icccm.height_max;
179 if ((w > 0) && (h > 0))
181 w -= ewin->icccm.base_w;
182 h -= ewin->icccm.base_h;
183 if ((w > 0) && (h > 0))
185 aspect = ((double)w) / ((double)h);
186 dw = ewin->icccm.w_inc / 4.;
187 dh = ewin->icccm.h_inc / 4.;
188 if (Mode.mode == MODE_RESIZE_H)
190 if (aspect < ewin->icccm.aspect_min)
191 w = (int)((double)h * ewin->icccm.aspect_min + dw);
192 else if (aspect > ewin->icccm.aspect_max)
193 w = (int)((double)h * ewin->icccm.aspect_max + dw);
195 else if (Mode.mode == MODE_RESIZE_V)
197 if (aspect < ewin->icccm.aspect_min)
198 h = (int)((double)w / ewin->icccm.aspect_min + dh);
199 else if (aspect > ewin->icccm.aspect_max)
200 h = (int)((double)w / ewin->icccm.aspect_max + dh);
204 if (aspect < ewin->icccm.aspect_min)
206 if (ewin->icccm.aspect_min >= 1.)
207 h = (int)((double)w / ewin->icccm.aspect_min + dh);
209 w = (int)((double)h * ewin->icccm.aspect_min + dw);
211 else if (aspect > ewin->icccm.aspect_max)
213 if (ewin->icccm.aspect_max >= 1.)
214 h = (int)((double)w / ewin->icccm.aspect_max + dh);
216 w = (int)((double)h * ewin->icccm.aspect_max + dw);
219 i = w / ewin->icccm.w_inc;
220 j = h / ewin->icccm.h_inc;
221 w = i * ewin->icccm.w_inc;
222 h = j * ewin->icccm.h_inc;
224 w += ewin->icccm.base_w;
225 h += ewin->icccm.base_h;
234 ICCCM_MatchSize(EWin * ewin)
236 ICCCM_SizeMatch(ewin, ewin->client.w, ewin->client.h, &ewin->client.w,
242 ICCCM_GetIncrementalSize(EWin * ewin, unsigned int w, unsigned int h,
243 unsigned int *wi, unsigned int *hi)
245 *wi = (w - ewin->icccm.base_w) / ewin->icccm.w_inc;
246 *hi = (h - ewin->icccm.base_h) / ewin->icccm.h_inc;
250 ICCCM_SetSizeConstraints(EWin * ewin, unsigned int wmin, unsigned int hmin,
251 unsigned int wmax, unsigned int hmax,
252 unsigned int wbase, unsigned int hbase,
253 unsigned int winc, unsigned int hinc,
254 double amin, double amax)
256 ewin->icccm.width_min = wmin;
257 ewin->icccm.height_min = hmin;
258 ewin->icccm.width_max = wmax;
259 ewin->icccm.height_max = hmax;
261 ewin->icccm.base_w = wbase;
262 ewin->icccm.base_h = hbase;
263 ewin->icccm.w_inc = winc;
264 ewin->icccm.h_inc = hinc;
266 ewin->icccm.aspect_min = amin;
267 ewin->icccm.aspect_max = amax;
269 ewin->props.no_resize_h = (wmin == wmax);
270 ewin->props.no_resize_v = (hmin == hmax);
274 ICCCM_Configure(EWin * ewin)
279 if (EwinIsInternal(ewin))
282 ev.type = ConfigureNotify;
283 ev.xconfigure.display = disp;
284 ev.xconfigure.event = EwinGetClientXwin(ewin);
285 ev.xconfigure.window = EwinGetClientXwin(ewin);
286 #if 0 /* FIXME - Remove? */
289 dsk = EoGetDesk(ewin);
290 ev.xconfigure.x = EoGetX(dsk) + ewin->client.x;
291 ev.xconfigure.y = EoGetY(dsk) + ewin->client.y;
293 ev.xconfigure.x = ewin->client.x;
294 ev.xconfigure.y = ewin->client.y;
297 ETranslateCoordinates(VROOT, RROOT,
298 ev.xconfigure.x, ev.xconfigure.y,
299 &ev.xconfigure.x, &ev.xconfigure.y, &child);
300 ev.xconfigure.width = ewin->client.w;
301 ev.xconfigure.height = ewin->client.h;
302 ev.xconfigure.border_width = 0;
303 ev.xconfigure.above = EoGetXwin(ewin);
304 ev.xconfigure.override_redirect = False;
305 EXSendEvent(EwinGetClientXwin(ewin), StructureNotifyMask, &ev);
309 ICCCM_AdoptStart(const EWin * ewin)
311 Window win = EwinGetClientXwin(ewin);
313 if (!EwinIsInternal(ewin))
314 XAddToSaveSet(disp, win);
318 ICCCM_Adopt(const EWin * ewin)
320 Window win = EwinGetClientXwin(ewin);
322 if (ewin->icccm.start_iconified)
323 ecore_x_icccm_state_set_iconic(win);
325 ecore_x_icccm_state_set_normal(win);
329 ICCCM_Cmap(EWin * ewin)
333 if (Mode.current_cmap)
335 XUninstallColormap(disp, Mode.current_cmap);
336 Mode.current_cmap = 0;
341 if (EwinIsInternal(ewin))
344 ICCCM_GetColormap(ewin);
346 if ((ewin->client.cmap) && (Mode.current_cmap != ewin->client.cmap))
348 XWindowAttributes xwa;
350 Ecore_X_Window *wlist;
352 num = ecore_x_window_prop_window_list_get(EwinGetClientXwin(ewin),
353 ECORE_X_ATOM_WM_COLORMAP_WINDOWS,
357 for (i = 0; i < num; i++)
359 if (XGetWindowAttributes(disp, wlist[i], &xwa))
361 if (xwa.colormap != WinGetCmap(VROOT))
363 XInstallColormap(disp, xwa.colormap);
364 Mode.current_cmap = xwa.colormap;
371 XInstallColormap(disp, ewin->client.cmap);
372 Mode.current_cmap = ewin->client.cmap;
377 ICCCM_Focus(const EWin * ewin)
379 if (EDebug(EDBUG_TYPE_FOCUS))
382 Eprintf("ICCCM_Focus T=%#lx %#lx %s\n", Mode.events.time,
383 EwinGetClientXwin(ewin), EwinGetTitle(ewin));
385 Eprintf("ICCCM_Focus None T=%#lx\n", Mode.events.time);
390 XSetInputFocus(disp, WinGetXwin(VROOT), RevertToPointerRoot,
392 HintsSetActiveWindow(None);
396 if (ewin->icccm.take_focus)
398 ecore_x_icccm_take_focus_send(EwinGetClientXwin(ewin),
402 XSetInputFocus(disp, EwinGetClientXwin(ewin), RevertToPointerRoot,
405 HintsSetActiveWindow(EwinGetClientXwin(ewin));
409 ICCCM_GetGeoms(EWin * ewin)
414 if (XGetWMNormalHints(disp, EwinGetClientXwin(ewin), &hint, &mask))
416 if (!(ewin->state.placed))
418 if ((hint.flags & USPosition) || ((hint.flags & PPosition)))
420 if ((hint.flags & PPosition) && (!EoIsSticky(ewin)))
424 dsk = EoGetDesk(ewin);
426 dsk = DesksGetCurrent();
427 ewin->client.x -= EoGetX(dsk);
428 ewin->client.y -= EoGetY(dsk);
429 if (ewin->client.x + ewin->client.w >= WinGetW(VROOT))
431 ewin->client.x += EoGetX(dsk);
433 else if (ewin->client.x < 0)
435 ewin->client.x += EoGetX(dsk);
437 if (ewin->client.y + ewin->client.h >= WinGetH(VROOT))
439 ewin->client.y += EoGetY(dsk);
441 else if (ewin->client.y < 0)
443 ewin->client.y += EoGetY(dsk);
446 ewin->state.placed = 1;
450 if (hint.flags & PMinSize)
452 ewin->icccm.width_min = MAX(0, hint.min_width);
453 ewin->icccm.height_min = MAX(0, hint.min_height);
457 ewin->icccm.width_min = 0;
458 ewin->icccm.height_min = 0;
461 if (hint.flags & PMaxSize)
463 ewin->icccm.width_max = MIN(hint.max_width, 65535);
464 ewin->icccm.height_max = MIN(hint.max_height, 65535);
468 ewin->icccm.width_max = 65535;
469 ewin->icccm.height_max = 65535;
472 if (hint.flags & PResizeInc)
474 ewin->icccm.w_inc = MAX(1, hint.width_inc);
475 ewin->icccm.h_inc = MAX(1, hint.height_inc);
479 ewin->icccm.w_inc = 1;
480 ewin->icccm.h_inc = 1;
483 if (hint.flags & PAspect)
485 if ((hint.min_aspect.y > 0.0) && (hint.min_aspect.x > 0.0))
487 ewin->icccm.aspect_min =
488 ((double)hint.min_aspect.x) / ((double)hint.min_aspect.y);
492 ewin->icccm.aspect_min = 0.0;
494 if ((hint.max_aspect.y > 0.0) && (hint.max_aspect.x > 0.0))
496 ewin->icccm.aspect_max =
497 ((double)hint.max_aspect.x) / ((double)hint.max_aspect.y);
501 ewin->icccm.aspect_max = 65535.0;
506 ewin->icccm.aspect_min = 0.0;
507 ewin->icccm.aspect_max = 65535.0;
510 if (hint.flags & PBaseSize)
512 ewin->icccm.base_w = hint.base_width;
513 ewin->icccm.base_h = hint.base_height;
517 ewin->icccm.base_w = ewin->icccm.width_min;
518 ewin->icccm.base_h = ewin->icccm.height_min;
521 if (ewin->icccm.width_min < ewin->icccm.base_w)
522 ewin->icccm.width_min = ewin->icccm.base_w;
523 if (ewin->icccm.height_min < ewin->icccm.base_h)
524 ewin->icccm.height_min = ewin->icccm.base_h;
526 if (ewin->icccm.width_max < ewin->icccm.base_w)
527 ewin->icccm.width_max = ewin->icccm.base_w;
528 if (ewin->icccm.height_max < ewin->icccm.base_h)
529 ewin->icccm.height_max = ewin->icccm.base_h;
531 if (hint.flags & PWinGravity)
532 ewin->icccm.grav = hint.win_gravity;
534 ewin->icccm.grav = NorthWestGravity;
537 ewin->props.no_resize_h = (ewin->icccm.width_min == ewin->icccm.width_max);
538 ewin->props.no_resize_v = (ewin->icccm.height_min == ewin->icccm.height_max);
540 if (EDebug(EDBUG_TYPE_SNAPS))
541 Eprintf("Snap get icccm %#lx: %4d+%4d %4dx%4d: %s\n",
542 EwinGetClientXwin(ewin), ewin->client.x, ewin->client.y,
543 ewin->client.w, ewin->client.h, EwinGetTitle(ewin));
546 #define TryGroup(e) (((e)->icccm.group != None) && ((e)->icccm.group != EwinGetClientXwin(e)))
549 ICCCM_GetWmClass(EWin * ewin)
551 _EFREE(EwinGetIcccmCName(ewin));
552 _EFREE(EwinGetIcccmClass(ewin));
554 ecore_x_icccm_name_class_get(EwinGetClientXwin(ewin),
555 &EwinGetIcccmCName(ewin),
556 &EwinGetIcccmClass(ewin));
557 if (!EwinGetIcccmCName(ewin) && TryGroup(ewin))
558 ecore_x_icccm_name_class_get(ewin->icccm.group,
559 &EwinGetIcccmCName(ewin),
560 &EwinGetIcccmClass(ewin));
564 ICCCM_GetWmCommand(EWin * ewin)
567 char **argv, s[4096], *ss;
569 _EFREE(ewin->icccm.wm_command);
571 argc = ecore_x_window_prop_string_list_get(EwinGetClientXwin(ewin),
572 ECORE_X_ATOM_WM_COMMAND, &argv);
573 if ((argc < 0) && TryGroup(ewin))
574 argc = ecore_x_window_prop_string_list_get(ewin->icccm.group,
575 ECORE_X_ATOM_WM_COMMAND,
578 ss = StrlistEncodeEscaped(s, sizeof(s), argv, argc);
579 ewin->icccm.wm_command = Estrdup(ss);
580 StrlistFree(argv, argc);
584 ICCCM_GetWmClientMachine(EWin * ewin)
586 _EFREE(ewin->icccm.wm_machine);
588 ewin->icccm.wm_machine =
589 ecore_x_window_prop_string_get(EwinGetClientXwin(ewin),
590 ECORE_X_ATOM_WM_CLIENT_MACHINE);
591 if (!ewin->icccm.wm_machine && TryGroup(ewin))
592 ewin->icccm.wm_machine =
593 ecore_x_window_prop_string_get(ewin->icccm.group,
594 ECORE_X_ATOM_WM_CLIENT_MACHINE);
598 ICCCM_GetWmIconName(EWin * ewin)
600 _EFREE(ewin->icccm.wm_icon_name);
602 ewin->icccm.wm_icon_name =
603 ecore_x_window_prop_string_get(EwinGetClientXwin(ewin),
604 ECORE_X_ATOM_WM_ICON_NAME);
605 if (!ewin->icccm.wm_icon_name && TryGroup(ewin))
606 ewin->icccm.wm_icon_name =
607 ecore_x_window_prop_string_get(ewin->icccm.group,
608 ECORE_X_ATOM_WM_ICON_NAME);
612 ICCCM_GetWmWindowRole(EWin * ewin)
614 _EFREE(ewin->icccm.wm_role);
615 ewin->icccm.wm_role =
616 ecore_x_window_prop_string_get(EwinGetClientXwin(ewin),
617 ECORE_X_ATOM_WM_WINDOW_ROLE);
621 ICCCM_GetInfo(EWin * ewin)
623 ICCCM_GetWmClass(ewin);
624 ICCCM_GetWmCommand(ewin);
625 ICCCM_GetWmClientMachine(ewin);
626 ICCCM_GetWmIconName(ewin);
627 ICCCM_GetWmWindowRole(ewin);
631 ICCCM_GetWmHints(EWin * ewin)
635 hint = XGetWMHints(disp, EwinGetClientXwin(ewin));
639 /* I have to make sure the thing i'm docking is a dock app */
640 if ((hint->flags & StateHint) && (hint->initial_state == WithdrawnState))
642 if (hint->flags & (StateHint | IconWindowHint | IconPositionHint |
645 if ((hint->icon_x == 0) && (hint->icon_y == 0)
646 && hint->window_group == EwinGetClientXwin(ewin))
647 ewin->state.docked = 1;
651 ewin->icccm.need_input =
652 ((hint->flags & InputHint) && (!hint->input)) ? 0 : 1;
654 ewin->icccm.start_iconified =
655 ((hint->flags & StateHint) &&
656 (hint->initial_state == IconicState)) ? 1 : 0;
658 if (hint->flags & IconPixmapHint)
660 if (ewin->icccm.icon_pmap != hint->icon_pixmap)
662 ewin->icccm.icon_pmap = hint->icon_pixmap;
663 EwinChange(ewin, EWIN_CHANGE_ICON_PMAP);
668 ewin->icccm.icon_pmap = None;
671 ewin->icccm.icon_mask =
672 (hint->flags & IconMaskHint) ? hint->icon_mask : None;
674 ewin->icccm.icon_win =
675 (hint->flags & IconWindowHint) ? hint->icon_window : None;
678 (hint->flags & WindowGroupHint) ? hint->window_group : None;
680 if (hint->flags & XUrgencyHint)
682 if (!ewin->state.attention)
683 EwinChange(ewin, EWIN_CHANGE_ATTENTION);
684 ewin->icccm.urgency = 1;
685 ewin->state.attention = 1;
689 ewin->icccm.urgency = 0;
692 if (ewin->icccm.group == EwinGetClientXwin(ewin))
694 ewin->icccm.is_group_leader = 1;
698 ewin->icccm.is_group_leader = 0;
705 ICCCM_GetWmProtocols(EWin * ewin)
710 if (XGetWMProtocols(disp, EwinGetClientXwin(ewin), &prop, &num))
712 ewin->icccm.take_focus = 0;
713 ewin->icccm.delete_window = 0;
714 for (i = 0; i < num; i++)
716 if (prop[i] == ECORE_X_ATOM_WM_TAKE_FOCUS)
717 ewin->icccm.take_focus = ewin->icccm.need_input = 1;
718 else if (prop[i] == ECORE_X_ATOM_WM_DELETE_WINDOW)
719 ewin->icccm.delete_window = 1;
721 else if (prop[i] == ECORE_X_ATOM_NET_WM_SYNC_REQUEST)
725 ewin->ewmh.sync_request_enable = 1;
726 ecore_x_window_prop_card32_get(EwinGetClientXwin(ewin),
727 ECORE_X_ATOM_NET_WM_SYNC_REQUEST_COUNTER,
729 ewin->ewmh.sync_request_counter = c;
738 ICCCM_GetWmTransientFor(EWin * ewin)
742 ewin->icccm.transient = 0;
743 ewin->icccm.transient_for = None;
744 if (XGetTransientForHint(disp, EwinGetClientXwin(ewin), &win))
746 ewin->icccm.transient = 1;
747 ewin->icccm.transient_for = win;
752 ICCCM_GetWmClientLeader(EWin * ewin)
755 Ecore_X_Window cleader;
757 num = ecore_x_window_prop_window_get(EwinGetClientXwin(ewin),
758 ECORE_X_ATOM_WM_CLIENT_LEADER,
762 ewin->icccm.client_leader = cleader;
763 if (!ewin->icccm.group)
764 ewin->icccm.group = cleader;
769 ICCCM_GetHints(EWin * ewin)
771 ICCCM_GetWmHints(ewin);
772 ICCCM_GetWmProtocols(ewin);
773 ICCCM_GetWmTransientFor(ewin);
774 ICCCM_GetWmClientLeader(ewin);
778 ICCCM_SetIconSizes(void)
782 is = XAllocIconSize();
789 XSetIconSizes(disp, WinGetXwin(VROOT), is, 1);
794 * Process received window property change
797 ICCCM_ProcessPropertyChange(EWin * ewin, Atom atom_change)
799 if (atom_change == ECORE_X_ATOM_WM_NAME)
801 ICCCM_GetTitle(ewin);
806 if (atom_change == ECORE_X_ATOM_WM_HINTS)
808 ICCCM_GetWmHints(ewin);
811 if (atom_change == ECORE_X_ATOM_WM_PROTOCOLS)
813 ICCCM_GetWmProtocols(ewin);
816 if (atom_change == ECORE_X_ATOM_WM_TRANSIENT_FOR)
818 ICCCM_GetWmTransientFor(ewin);
821 if (atom_change == ECORE_X_ATOM_WM_CLIENT_LEADER)
823 ICCCM_GetWmClientLeader(ewin);
828 if (atom_change == ECORE_X_ATOM_WM_ICON_NAME)
830 ICCCM_GetWmIconName(ewin);
833 #if 1 /* FIXME - Any reason to process these? */
834 if (atom_change == ECORE_X_ATOM_WM_CLASS)
836 ICCCM_GetWmClass(ewin);
839 if (atom_change == ECORE_X_ATOM_WM_COMMAND)
841 ICCCM_GetWmCommand(ewin);
844 if (atom_change == ECORE_X_ATOM_WM_CLIENT_MACHINE)
846 ICCCM_GetWmClientMachine(ewin);
849 if (atom_change == ECORE_X_ATOM_WM_WINDOW_ROLE)
851 ICCCM_GetWmWindowRole(ewin);
856 if (atom_change == ECORE_X_ATOM_WM_COLORMAP_WINDOWS)
862 if (atom_change == ECORE_X_ATOM_WM_NORMAL_HINTS)
864 ICCCM_GetGeoms(ewin);
873 EwinSyncRequestSend(EWin * ewin)
877 if (!ewin->ewmh.sync_request_enable || EServerIsGrabbed())
880 count = ++ewin->ewmh.sync_request_count;
883 ewin->ewmh.sync_request_count = ++count;
884 ecore_x_client_message32_send(EwinGetClientXwin(ewin),
885 ECORE_X_ATOM_WM_PROTOCOLS,
887 ECORE_X_ATOM_NET_WM_SYNC_REQUEST,
889 (long)(count & 0xffffffff),
890 (long)(count >> 32), 0);
896 EwinSyncRequestWait(EWin * ewin)
898 XSyncWaitCondition xswc[2];
901 if (!ewin->ewmh.sync_request_enable || EServerIsGrabbed())
904 xswc[0].trigger.counter = ewin->ewmh.sync_request_counter;
905 xswc[0].trigger.value_type = XSyncAbsolute;
906 XSyncIntsToValue(&xswc[0].trigger.wait_value,
907 ewin->ewmh.sync_request_count & 0xffffffff,
908 ewin->ewmh.sync_request_count >> 32);
909 xswc[0].trigger.test_type = XSyncPositiveComparison;
910 XSyncIntsToValue(&xswc[0].event_threshold, 0, 0);
912 xswc[1].trigger.counter = Mode.display.server_time;
913 xswc[1].trigger.value_type = XSyncRelative;
914 XSyncIntsToValue(&xswc[1].trigger.wait_value, 200, 0); /* 200 ms */
915 xswc[1].trigger.test_type = XSyncPositiveComparison;
916 XSyncIntsToValue(&xswc[1].event_threshold, 0, 0);
919 XSyncAwait(disp, xswc, 2);
920 if (EDebug(EDBUG_TYPE_SYNC))
921 Eprintf("Sync t=%#lx c=%llx: Delay=%8.6lf us\n",
922 xswc[0].trigger.counter, ewin->ewmh.sync_request_count,
925 #endif /* USE_XSYNC */