tk/Latest-fix-proposal-from-Christian-Werner-revert-the.patch
2019-09-30 11:18:32 -04:00

263 lines
8.5 KiB
Diff
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

From 37c12f688751bcc6c13ca455d52451c2833aa457 Mon Sep 17 00:00:00 2001
From: fvogel <fvogelnew1@free.fr>
Date: Fri, 19 Jan 2018 20:54:18 +0000
Subject: [PATCH 121/693] Latest fix proposal from Christian Werner: revert the
two previous commits and add XSync() just before the garbage collector, which
minimizes the number of XSync() calls, therefore optimizing performance while
still fixing the bug.
---
generic/tkError.c | 28 ++++++++++++++++++----------
unix/tkUnixColor.c | 1 -
unix/tkUnixEmbed.c | 3 ---
unix/tkUnixFocus.c | 1 -
unix/tkUnixRFont.c | 4 ----
unix/tkUnixSelect.c | 3 ---
unix/tkUnixSend.c | 1 -
unix/tkUnixWm.c | 9 ++-------
8 files changed, 20 insertions(+), 30 deletions(-)
diff --git a/generic/tkError.c b/generic/tkError.c
index fc223e6b3..277d7f0e0 100644
--- a/generic/tkError.c
+++ b/generic/tkError.c
@@ -82,8 +82,8 @@ Tk_CreateErrorHandler(
* errors. */
ClientData clientData) /* Arbitrary value to pass to errorProc. */
{
- register TkErrorHandler *errorPtr;
- register TkDisplay *dispPtr;
+ TkErrorHandler *errorPtr;
+ TkDisplay *dispPtr;
/*
* Find the display. If Tk doesn't know about this display then it's an
@@ -147,8 +147,8 @@ Tk_DeleteErrorHandler(
Tk_ErrorHandler handler) /* Token for handler to delete; was previous
* return value from Tk_CreateErrorHandler. */
{
- register TkErrorHandler *errorPtr = (TkErrorHandler *) handler;
- register TkDisplay *dispPtr = errorPtr->dispPtr;
+ TkErrorHandler *errorPtr = (TkErrorHandler *) handler;
+ TkDisplay *dispPtr = errorPtr->dispPtr;
errorPtr->lastRequest = NextRequest(dispPtr->display) - 1;
@@ -166,12 +166,20 @@ Tk_DeleteErrorHandler(
dispPtr->deleteCount += 1;
if (dispPtr->deleteCount >= 10) {
- register TkErrorHandler *prevPtr;
+ TkErrorHandler *prevPtr;
TkErrorHandler *nextPtr;
- int lastSerial;
+ int lastSerial = LastKnownRequestProcessed(dispPtr->display);
+ /*
+ * Last chance to catch errors for this handler: if no event/error
+ * processing took place to follow up the end of this error handler
+ * we need a round trip with the X server now.
+ */
+
+ if (errorPtr->lastRequest > (unsigned long) lastSerial) {
+ XSync(dispPtr->display, False);
+ }
dispPtr->deleteCount = 0;
- lastSerial = LastKnownRequestProcessed(dispPtr->display);
errorPtr = dispPtr->errorPtr;
for (prevPtr = NULL; errorPtr != NULL; errorPtr = nextPtr) {
nextPtr = errorPtr->nextPtr;
@@ -213,11 +221,11 @@ Tk_DeleteErrorHandler(
static int
ErrorProc(
Display *display, /* Display for which error occurred. */
- register XErrorEvent *errEventPtr)
+ XErrorEvent *errEventPtr)
/* Information about error. */
{
- register TkDisplay *dispPtr;
- register TkErrorHandler *errorPtr;
+ TkDisplay *dispPtr;
+ TkErrorHandler *errorPtr;
/*
* See if we know anything about the display. If not, then invoke the
diff --git a/unix/tkUnixColor.c b/unix/tkUnixColor.c
index b11a1ebbc..43500ad5b 100644
--- a/unix/tkUnixColor.c
+++ b/unix/tkUnixColor.c
@@ -94,7 +94,6 @@ TkpFreeColor(
-1, -1, -1, NULL, NULL);
XFreeColors(DisplayOfScreen(screen), tkColPtr->colormap,
&tkColPtr->color.pixel, 1, 0L);
- XSync(DisplayOfScreen(screen), False);
Tk_DeleteErrorHandler(handler);
}
DeleteStressedCmap(DisplayOfScreen(screen), tkColPtr->colormap);
diff --git a/unix/tkUnixEmbed.c b/unix/tkUnixEmbed.c
index b285fbe73..b170ad037 100644
--- a/unix/tkUnixEmbed.c
+++ b/unix/tkUnixEmbed.c
@@ -472,7 +472,6 @@ ContainerEventProc(
Tk_DestroyWindow((Tk_Window) winPtr);
}
- XSync(eventPtr->xfocus.display, False);
Tk_DeleteErrorHandler(errHandler);
}
@@ -516,7 +515,6 @@ EmbedStructureProc(
containerPtr->wrapper, 0, 0,
(unsigned) Tk_Width((Tk_Window) containerPtr->parentPtr),
(unsigned) Tk_Height((Tk_Window) containerPtr->parentPtr));
- XSync(eventPtr->xfocus.display, False);
Tk_DeleteErrorHandler(errHandler);
}
} else if (eventPtr->type == DestroyNotify) {
@@ -566,7 +564,6 @@ EmbedFocusProc(
-1, -1, NULL, NULL);
XSetInputFocus(display, containerPtr->wrapper, RevertToParent,
CurrentTime);
- XSync(eventPtr->xfocus.display, False);
Tk_DeleteErrorHandler(errHandler);
}
}
diff --git a/unix/tkUnixFocus.c b/unix/tkUnixFocus.c
index 7f4771e9d..07676181d 100644
--- a/unix/tkUnixFocus.c
+++ b/unix/tkUnixFocus.c
@@ -112,7 +112,6 @@ TkpChangeFocus(
}
XSetInputFocus(dispPtr->display, winPtr->window, RevertToParent,
CurrentTime);
- XSync(dispPtr->display, False);
Tk_DeleteErrorHandler(errHandler);
/*
diff --git a/unix/tkUnixRFont.c b/unix/tkUnixRFont.c
index 44e733944..d43ed2460 100644
--- a/unix/tkUnixRFont.c
+++ b/unix/tkUnixRFont.c
@@ -388,7 +388,6 @@ FinishedWithFont(
if (fontPtr->fontset) {
FcFontSetDestroy(fontPtr->fontset);
}
- XSync(fontPtr->display, False);
Tk_DeleteErrorHandler(handler);
}
@@ -876,7 +875,6 @@ Tk_DrawChars(
Tk_CreateErrorHandler(display, -1, -1, -1, NULL, NULL);
XftDrawChange(fontPtr->ftDraw, drawable);
- XSync(display, False);
Tk_DeleteErrorHandler(handler);
}
XGetGCValues(display, gc, GCForeground, &values);
@@ -1010,7 +1008,6 @@ TkDrawAngledChars(
Tk_CreateErrorHandler(display, -1, -1, -1, NULL, NULL);
XftDrawChange(fontPtr->ftDraw, drawable);
- XSync(display, False);
Tk_DeleteErrorHandler(handler);
}
@@ -1100,7 +1097,6 @@ TkDrawAngledChars(
Tk_CreateErrorHandler(display, -1, -1, -1, NULL, NULL);
XftDrawChange(fontPtr->ftDraw, drawable);
- XSync(display, False);
Tk_DeleteErrorHandler(handler);
}
XGetGCValues(display, gc, GCForeground, &values);
diff --git a/unix/tkUnixSelect.c b/unix/tkUnixSelect.c
index 9313df5c0..6d379ecc8 100644
--- a/unix/tkUnixSelect.c
+++ b/unix/tkUnixSelect.c
@@ -470,7 +470,6 @@ TkSelPropProc(
ckfree(propPtr);
}
}
- XSync(eventPtr->xproperty.display, False);
Tk_DeleteErrorHandler(errorHandler);
/*
@@ -1049,7 +1048,6 @@ ConvertSelection(
reply.xsel.property = incr.multAtoms[1];
}
XSendEvent(reply.xsel.display, reply.xsel.requestor, False, 0, &reply.ev);
- XSync(reply.xsel.display, False);
Tk_DeleteErrorHandler(errorHandler);
/*
@@ -1068,7 +1066,6 @@ ConvertSelection(
errorHandler = Tk_CreateErrorHandler(winPtr->display,
-1, -1, -1, (int (*)()) NULL, NULL);
XSelectInput(reply.xsel.display, reply.xsel.requestor, 0L);
- XSync(winPtr->display, False);
Tk_DeleteErrorHandler(errorHandler);
if (tsdPtr->pendingIncrs == &incr) {
tsdPtr->pendingIncrs = incr.nextPtr;
diff --git a/unix/tkUnixSend.c b/unix/tkUnixSend.c
index 0322a78d5..bbbdd774c 100644
--- a/unix/tkUnixSend.c
+++ b/unix/tkUnixSend.c
@@ -1748,7 +1748,6 @@ AppendPropCarefully(
pendingPtr);
XChangeProperty(display, window, property, XA_STRING, 8,
PropModeAppend, (unsigned char *) value, length);
- XSync(display, False);
Tk_DeleteErrorHandler(handler);
}
diff --git a/unix/tkUnixWm.c b/unix/tkUnixWm.c
index 31e14cb72..19ac86cb5 100644
--- a/unix/tkUnixWm.c
+++ b/unix/tkUnixWm.c
@@ -4084,7 +4084,6 @@ ConfigureEvent(
XMoveResizeWindow(winPtr->display, winPtr->window, 0,
wmPtr->menuHeight, (unsigned) wrapperPtr->changes.width,
(unsigned) (wrapperPtr->changes.height - wmPtr->menuHeight));
- XSync(winPtr->display, False);
Tk_DeleteErrorHandler(handler);
if ((wmPtr->menubar != NULL)
&& ((Tk_Width(wmPtr->menubar) != wrapperPtr->changes.width)
@@ -4421,11 +4420,10 @@ WrapperEventProc(
* Tk_DestroyWindow will try to destroy the window, but of course
* it's already gone.
*/
- Display *display = wmPtr->winPtr->display;
- handler = Tk_CreateErrorHandler(display, -1, -1, -1, NULL, NULL);
+ handler = Tk_CreateErrorHandler(wmPtr->winPtr->display, -1, -1, -1,
+ NULL, NULL);
Tk_DestroyWindow((Tk_Window) wmPtr->winPtr);
- XSync(display, False);
Tk_DeleteErrorHandler(handler);
}
if (dispPtr->flags & TK_DISPLAY_WM_TRACING) {
@@ -5848,12 +5846,10 @@ Tk_CoordsToWindow(
* deleted
*/
- XSync(Tk_Display(tkwin), False);
Tk_DeleteErrorHandler(handler);
return NULL;
}
if (child == None) {
- XSync(Tk_Display(tkwin), False);
Tk_DeleteErrorHandler(handler);
return NULL;
}
@@ -5883,7 +5879,6 @@ Tk_CoordsToWindow(
* or below
*/
- XSync(Tk_Display(tkwin), False);
Tk_DeleteErrorHandler(handler);
handler = NULL;
}
--
2.19.1