{
#ifndef HAVE_GTK3
XSyncValue initial_value;
+ XSyncCounter counters[2];
XSyncIntToValue (&initial_value, 0);
- FRAME_X_BASIC_COUNTER (f) = XSyncCreateCounter (FRAME_X_DISPLAY (f),
- initial_value);
+ counters[0]
+ = FRAME_X_BASIC_COUNTER (f)
+ = XSyncCreateCounter (FRAME_X_DISPLAY (f),
+ initial_value);
+ counters[1]
+ = FRAME_X_EXTENDED_COUNTER (f)
+ = XSyncCreateCounter (FRAME_X_DISPLAY (f),
+ initial_value);
+
+ FRAME_X_OUTPUT (f)->current_extended_counter_value
+ = initial_value;
XChangeProperty (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f),
dpyinfo->Xatom_net_wm_sync_request_counter,
XA_CARDINAL, 32, PropModeReplace,
- (unsigned char *) &FRAME_X_BASIC_COUNTER (f), 1);
+ (unsigned char *) &counters, 2);
#endif
}
#endif
#ifdef HAVE_XSYNC
if (FRAME_X_OUTPUT (f)->sync_end_pending_p
- && FRAME_X_BASIC_COUNTER (f))
+ && FRAME_X_BASIC_COUNTER (f) != None)
{
XSyncSetCounter (FRAME_X_DISPLAY (f),
FRAME_X_BASIC_COUNTER (f),
FRAME_X_OUTPUT (f)->pending_basic_counter_value);
FRAME_X_OUTPUT (f)->sync_end_pending_p = false;
}
+
+ if (FRAME_X_OUTPUT (f)->ext_sync_end_pending_p
+ && FRAME_X_EXTENDED_COUNTER (f) != None)
+ {
+ XSyncValue add;
+ Bool overflow_p;
+
+ XSyncIntToValue (&add, 1);
+ XSyncValueAdd (&FRAME_X_OUTPUT (f)->current_extended_counter_value,
+ add, add, &overflow_p);
+
+ if (overflow_p)
+ emacs_abort ();
+
+ XSyncSetCounter (FRAME_X_DISPLAY (f),
+ FRAME_X_EXTENDED_COUNTER (f),
+ FRAME_X_OUTPUT (f)->current_extended_counter_value);
+
+ FRAME_X_OUTPUT (f)->ext_sync_end_pending_p = false;
+ }
#endif
unblock_input ();
}
if (f)
{
- XSyncIntsToValue (&FRAME_X_OUTPUT (f)->pending_basic_counter_value,
- event->xclient.data.l[2], event->xclient.data.l[3]);
- FRAME_X_OUTPUT (f)->sync_end_pending_p = true;
+ if (event->xclient.data.l[4] == 0)
+ {
+ XSyncIntsToValue (&FRAME_X_OUTPUT (f)->pending_basic_counter_value,
+ event->xclient.data.l[2], event->xclient.data.l[3]);
+ FRAME_X_OUTPUT (f)->sync_end_pending_p = true;
+ }
+ else if (event->xclient.data.l[4] == 1)
+ FRAME_X_OUTPUT (f)->ext_sync_end_pending_p = true;
*finish = X_EVENT_DROP;
goto done;
if (FRAME_X_BASIC_COUNTER (f) != None)
XSyncDestroyCounter (FRAME_X_DISPLAY (f),
FRAME_X_BASIC_COUNTER (f));
+
+ if (FRAME_X_EXTENDED_COUNTER (f) != None)
+ XSyncDestroyCounter (FRAME_X_DISPLAY (f),
+ FRAME_X_EXTENDED_COUNTER (f));
#endif
unload_color (f, FRAME_FOREGROUND_PIXEL (f));
ATOM_REFS_INIT ("_NET_WORKAREA", Xatom_net_workarea)
ATOM_REFS_INIT ("_NET_WM_SYNC_REQUEST", Xatom_net_wm_sync_request)
ATOM_REFS_INIT ("_NET_WM_SYNC_REQUEST_COUNTER", Xatom_net_wm_sync_request_counter)
+ ATOM_REFS_INIT ("_NET_WM_FRAME_DRAWN", Xatom_net_wm_frame_drawn)
/* Session management */
ATOM_REFS_INIT ("SM_CLIENT_ID", Xatom_SM_CLIENT_ID)
ATOM_REFS_INIT ("_XSETTINGS_SETTINGS", Xatom_xsettings_prop)
Xatom_net_wm_state_hidden, Xatom_net_wm_state_skip_taskbar,
Xatom_net_frame_extents, Xatom_net_current_desktop, Xatom_net_workarea,
Xatom_net_wm_opaque_region, Xatom_net_wm_ping, Xatom_net_wm_sync_request,
- Xatom_net_wm_sync_request_counter;
+ Xatom_net_wm_sync_request_counter, Xatom_net_wm_frame_drawn;
/* XSettings atoms and windows. */
Atom Xatom_xsettings_sel, Xatom_xsettings_prop, Xatom_xsettings_mgr;
#ifdef HAVE_XSYNC
XSyncCounter basic_frame_counter;
+ XSyncCounter extended_frame_counter;
XSyncValue pending_basic_counter_value;
+ XSyncValue current_extended_counter_value;
- bool_bf sync_end_pending_p;
+ bool_bf sync_end_pending_p : 1;
+ bool_bf ext_sync_end_pending_p : 1;
#endif
/* Relief GCs, colors etc. */
#ifdef HAVE_XSYNC
#define FRAME_X_BASIC_COUNTER(f) FRAME_X_OUTPUT (f)->basic_frame_counter
+#define FRAME_X_EXTENDED_COUNTER(f) FRAME_X_OUTPUT (f)->extended_frame_counter
#endif
/* This is the Colormap which frame F uses. */