aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPo Lu2022-02-07 14:58:32 +0800
committerPo Lu2022-02-07 14:59:06 +0800
commit61a5bbc6836337479f5d8dba1897380b1c63bc25 (patch)
treed2e69a3ae522553d8a11b351ee1c7f7ce0885bcb /src
parentf91a911ef339975a39ae5e4b41eeab0be7824b25 (diff)
downloademacs-61a5bbc6836337479f5d8dba1897380b1c63bc25.tar.gz
emacs-61a5bbc6836337479f5d8dba1897380b1c63bc25.zip
Really fix extended frame synchronization
* src/xterm.c (XTframe_up_to_date): Make sure the extended counter ends up even.
Diffstat (limited to 'src')
-rw-r--r--src/xterm.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/src/xterm.c b/src/xterm.c
index d3d8dc468cd..49fc2b1bb74 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -1848,6 +1848,12 @@ x_update_end (struct frame *f)
1848static void 1848static void
1849XTframe_up_to_date (struct frame *f) 1849XTframe_up_to_date (struct frame *f)
1850{ 1850{
1851#ifdef HAVE_XSYNC
1852 XSyncValue add;
1853 XSyncValue current;
1854 Bool overflow_p;
1855#endif
1856
1851 eassert (FRAME_X_P (f)); 1857 eassert (FRAME_X_P (f));
1852 block_input (); 1858 block_input ();
1853 FRAME_MOUSE_UPDATE (f); 1859 FRAME_MOUSE_UPDATE (f);
@@ -1867,12 +1873,15 @@ XTframe_up_to_date (struct frame *f)
1867 if (FRAME_X_OUTPUT (f)->ext_sync_end_pending_p 1873 if (FRAME_X_OUTPUT (f)->ext_sync_end_pending_p
1868 && FRAME_X_EXTENDED_COUNTER (f) != None) 1874 && FRAME_X_EXTENDED_COUNTER (f) != None)
1869 { 1875 {
1870 XSyncValue add; 1876 current = FRAME_X_OUTPUT (f)->current_extended_counter_value;
1871 Bool overflow_p; 1877
1878 if (XSyncValueLow32 (current) % 2)
1879 XSyncIntToValue (&add, 1);
1880 else
1881 XSyncIntToValue (&add, 2);
1872 1882
1873 XSyncIntToValue (&add, 1);
1874 XSyncValueAdd (&FRAME_X_OUTPUT (f)->current_extended_counter_value, 1883 XSyncValueAdd (&FRAME_X_OUTPUT (f)->current_extended_counter_value,
1875 add, add, &overflow_p); 1884 current, add, &overflow_p);
1876 1885
1877 if (overflow_p) 1886 if (overflow_p)
1878 emacs_abort (); 1887 emacs_abort ();