263 lines
8.5 KiB
Diff
263 lines
8.5 KiB
Diff
|
|
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
|
|||
|
|
|