From ebc2ea79f7343c4ced8277b80178091a3226ea72 Mon Sep 17 00:00:00 2001 From: Ulrich Sibiller Date: Mon, 22 Jul 2019 18:10:12 +0200 Subject: Events.c: safe some lines by calling SAFE_XFree --- nx-X11/programs/Xserver/hw/nxagent/Events.c | 35 ++++++----------------------- 1 file changed, 7 insertions(+), 28 deletions(-) (limited to 'nx-X11/programs/Xserver/hw/nxagent/Events.c') diff --git a/nx-X11/programs/Xserver/hw/nxagent/Events.c b/nx-X11/programs/Xserver/hw/nxagent/Events.c index d8bf4df60..74781f638 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Events.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Events.c @@ -329,7 +329,7 @@ void nxagentRemoteWindowID(Window window, Bool newline) else if (winName) { fprintf(stderr, " \"%s\" ", winName); - XFree(winName); + SAFE_XFree(winName); } #else @@ -477,10 +477,7 @@ void nxagentRemoteWindowsTree(Window window, int level) nxagentRemoteWindowsTree(childList[i], level + 1); } - if (childList) - { - XFree((char *) childList); - } + SAFE_XFree((char *) childList); } #endif @@ -3128,10 +3125,7 @@ int nxagentCheckWindowConfiguration(XConfigureEvent* X) #endif } - if (children_return) - { - XFree(children_return); - } + SAFE_XFree(children_return); #if 0 fprintf(stderr, "nxagentCheckWindowConfiguration: Trees match: %s\n", @@ -3513,11 +3507,7 @@ int nxagentHandleReparentNotify(XEvent* X) result = XQueryTree(nxagentDisplay, w, &root_return, &parent_return, &children_return, &nchildren_return); - if (children_return) - { - XFree(children_return); - children_return = NULL; - } + SAFE_XFree(children_return); if (!result) { @@ -3555,11 +3545,7 @@ int nxagentHandleReparentNotify(XEvent* X) #endif } - if (children_return) - { - XFree(children_return); - children_return = NULL; - } + SAFE_XFree(children_return); } else { @@ -3623,11 +3609,7 @@ int nxagentHandleReparentNotify(XEvent* X) result = XQueryTree(nxagentDisplay, w, &rootReturn, &parentReturn, &childrenReturn, &nchildrenReturn); - if (childrenReturn) - { - XFree(childrenReturn); - childrenReturn = NULL; - } + SAFE_XFree(childrenReturn); if (parentReturn == rootReturn || parentReturn == 0 || result == 0) { @@ -4024,10 +4006,7 @@ void nxagentHandleCollectPropertyEvent(XEvent *X) #endif } - if (pszReturnData != NULL) - { - XFree(pszReturnData); - } + SAFE_XFree(pszReturnData); return; } -- cgit v1.2.3 From e7451477e00896b188188af622ab1a870715203f Mon Sep 17 00:00:00 2001 From: Ulrich Sibiller Date: Fri, 28 Jun 2019 22:07:00 +0200 Subject: Events.c: refactor nxagentHandleKeypress --- nx-X11/programs/Xserver/hw/nxagent/Events.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) (limited to 'nx-X11/programs/Xserver/hw/nxagent/Events.c') diff --git a/nx-X11/programs/Xserver/hw/nxagent/Events.c b/nx-X11/programs/Xserver/hw/nxagent/Events.c index 74781f638..c93842305 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Events.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Events.c @@ -2222,8 +2222,6 @@ FIXME: Don't enqueue the KeyRelease event if the key was int nxagentHandleKeyPress(XEvent *X, enum HandleEventResult *result) { - xEvent x; - if (nxagentXkbState.Initialized == 0) { if (X -> xkey.keycode == nxagentCapsLockKeycode) @@ -2255,15 +2253,15 @@ int nxagentHandleKeyPress(XEvent *X, enum HandleEventResult *result) nxagentXkbState.Num = (~nxagentXkbState.Num & 1); } + nxagentLastServerTime = X -> xkey.time; + nxagentLastEventTime = nxagentLastKeyPressTime = GetTimeInMillis(); - - memset(&x, 0, sizeof(xEvent)); + + xEvent x = {0}; x.u.u.type = KeyPress; x.u.u.detail = nxagentConvertKeycode(X -> xkey.keycode); x.u.keyButtonPointer.time = nxagentLastKeyPressTime; - nxagentLastServerTime = X -> xkey.time; - mieqEnqueue(&x); CriticalOutputPending = 1; -- cgit v1.2.3 From bcbf255104a1214c83e31a4266e38eb3c6369def Mon Sep 17 00:00:00 2001 From: Ulrich Sibiller Date: Fri, 28 Jun 2019 22:09:23 +0200 Subject: Events.c: add more comments and TEST output --- nx-X11/programs/Xserver/hw/nxagent/Events.c | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) (limited to 'nx-X11/programs/Xserver/hw/nxagent/Events.c') diff --git a/nx-X11/programs/Xserver/hw/nxagent/Events.c b/nx-X11/programs/Xserver/hw/nxagent/Events.c index c93842305..89030b1b0 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Events.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Events.c @@ -1110,8 +1110,8 @@ FIXME: If we don't flush the queue here, it could happen /* FIXME: Don't enqueue the KeyRelease event if the key was not already pressed. This workaround avoids a fake - KeyPress is enqueued by the XKEYBOARD extension. - Another solution would be to let the events are + KeyPress being enqueued by the XKEYBOARD extension. + Another solution would be to let the events enqueued and to remove the KeyPress afterwards. */ if (BitIsOn(inputInfo.keyboard -> key -> down, @@ -1150,6 +1150,9 @@ FIXME: Don't enqueue the KeyRelease event if the key was nxagentXkbNumTrap = 0; } + /* Calculate the time elapsed between this and the last event we + received. Add this delta to time we recorded for the last + KeyPress event we passed on to our clients. */ memset(&x, 0, sizeof(xEvent)); x.u.u.type = KeyRelease; x.u.u.detail = nxagentConvertKeycode(X.xkey.keycode); @@ -1165,8 +1168,14 @@ FIXME: Don't enqueue the KeyRelease event if the key was x.u.keyButtonPointer.time = nxagentLastEventTime; } - if (!(nxagentCheckSpecialKeystroke(&X.xkey, &result)) && sendKey == 1) + /* do not send a KeyRelease for a special keystroke since we + also did not send a KeyPress event in that case */ + if (!(nxagentCheckSpecialKeystroke(&X.xkey, &result)) && (sendKey == 1)) { + #ifdef TEST + fprintf(stderr, "%s: passing KeyRelease event to clients\n", __func__); + #endif + mieqEnqueue(&x); CriticalOutputPending = 1; @@ -1178,6 +1187,12 @@ FIXME: Don't enqueue the KeyRelease event if the key was NXShadowEvent(nxagentDisplay, X); } } + else + { + #ifdef TEST + fprintf(stderr, "%s: NOT passing KeyRelease event to clients\n", __func__); + #endif + } break; } @@ -2241,6 +2256,9 @@ int nxagentHandleKeyPress(XEvent *X, enum HandleEventResult *result) if (nxagentCheckSpecialKeystroke(&X -> xkey, result)) { + #ifdef TEST + fprintf(stderr, "%s: NOT passing KeyPress event to clients\n", __func__); + #endif return 1; } @@ -2262,6 +2280,10 @@ int nxagentHandleKeyPress(XEvent *X, enum HandleEventResult *result) x.u.u.detail = nxagentConvertKeycode(X -> xkey.keycode); x.u.keyButtonPointer.time = nxagentLastKeyPressTime; + #ifdef TEST + fprintf(stderr, "%s: passing KeyPress event to clients\n", __func__); + #endif + mieqEnqueue(&x); CriticalOutputPending = 1; -- cgit v1.2.3 From 17495dd6aedd27fb8a083fc841a7f297e6a8da8f Mon Sep 17 00:00:00 2001 From: Ulrich Sibiller Date: Sat, 5 May 2018 18:56:35 +0200 Subject: nxagent: simplify nxagentWaitEvents() no more need to pass down a struct, we now only pass the milliseconds and let the function do the rest. --- nx-X11/programs/Xserver/hw/nxagent/Events.c | 43 +++++++++++++++-------------- 1 file changed, 22 insertions(+), 21 deletions(-) (limited to 'nx-X11/programs/Xserver/hw/nxagent/Events.c') diff --git a/nx-X11/programs/Xserver/hw/nxagent/Events.c b/nx-X11/programs/Xserver/hw/nxagent/Events.c index 89030b1b0..0223667c4 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Events.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Events.c @@ -3303,7 +3303,6 @@ int nxagentHandleConfigureNotify(XEvent* X) ScreenPtr pScreen = nxagentScreen(X -> xconfigure.window); Bool doRandR = False; - struct timeval timeout; if (X -> xconfigure.window == nxagentDefaultWindows[pScreen -> myNum]) { @@ -3339,10 +3338,7 @@ int nxagentHandleConfigureNotify(XEvent* X) { newEvents = False; - timeout.tv_sec = 0; - timeout.tv_usec = 500 * 1000; - - nxagentWaitEvents(nxagentDisplay, &timeout); + nxagentWaitEvents(nxagentDisplay, 500); /* * This should also flush the NX link for us. @@ -3809,7 +3805,7 @@ int nxagentWaitForResource(GetResourceFuncPtr pGetResource, PredicateFuncPtr pPr while ((resource = (*pGetResource)(nxagentDisplay)) == -1) { - if (nxagentWaitEvents(nxagentDisplay, NULL) == -1) + if (nxagentWaitEvents(nxagentDisplay, 0) == -1) { return -1; } @@ -4490,14 +4486,11 @@ int nxagentPendingEvents(Display *dpy) } /* - * Blocks until an event becomes - * available. + * Blocks until an event becomes available. */ -int nxagentWaitEvents(Display *dpy, struct timeval *tm) +int nxagentWaitEvents(Display *dpy, useconds_t msec) { - XEvent ev; - #ifdef DEBUG fprintf(stderr, "nxagentWaitEvents called.\n"); #endif @@ -4505,33 +4498,41 @@ int nxagentWaitEvents(Display *dpy, struct timeval *tm) NXFlushDisplay(dpy, NXFlushLink); /* - * If the transport is not running we - * have to rely on Xlib to wait for an - * event. In this case the timeout is - * ignored. + * If the transport is not running we have to rely on Xlib to wait + * for an event. In this case the timeout is ignored. */ if (NXTransRunning(NX_FD_ANY) == 1) { - NXTransContinue(tm); + if (msec > 0) + { + struct timeval tm = { + .tv_sec = 0, + .tv_usec = msec * 1000 + }; + NXTransContinue(&tm); + } + else + { + NXTransContinue(NULL); + } } else { + XEvent ev; XPeekEvent(dpy, &ev); } /* - * Check if we encountered a display - * error. If we did, wait for the + * Check if we encountered a display error. If we did, wait for the * time requested by the caller. */ if (NXDisplayError(dpy) == 1) { - if (tm != NULL) + if (msec > 0) { - usleep(tm -> tv_sec * 1000 * 1000 + - tm -> tv_usec); + usleep(msec * 1000); } return -1; -- cgit v1.2.3 From e12983a677c84794f5ff34e5b14c3feb78878a9c Mon Sep 17 00:00:00 2001 From: Ulrich Sibiller Date: Thu, 15 Aug 2019 22:06:14 +0200 Subject: nxagent: drop nxagentRootTileWindow We either use a solid black or a white background and no backround pixmap. So nxagentRootTileWindow is always empty and we can drop all stuff around it. remove nxagentSplashCount, too, since it is no longer checked anywhere. --- nx-X11/programs/Xserver/hw/nxagent/Events.c | 15 --------------- 1 file changed, 15 deletions(-) (limited to 'nx-X11/programs/Xserver/hw/nxagent/Events.c') diff --git a/nx-X11/programs/Xserver/hw/nxagent/Events.c b/nx-X11/programs/Xserver/hw/nxagent/Events.c index 0223667c4..553eaccd6 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Events.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Events.c @@ -124,7 +124,6 @@ extern Bool nxagentOnce; extern WindowPtr nxagentRootTileWindow; -extern int nxagentSplashCount; extern int nxagentLastClipboardClient; @@ -2450,20 +2449,6 @@ FIXME: This can be maybe optimized by consuming the } } - if (nxagentRootTileWindow != NULL) - { - if (nxagentWindowPriv(nxagentRootTileWindow) -> window == nxagentWindowPriv(pWin) -> window && - nxagentSplashCount == 1 && X -> xexpose.count == 0) - { - #ifdef DEBUG - fprintf(stderr, "nxagentHandleExposeEvent: Clearing root tile window id [%u].\n", - nxagentWindowPriv(nxagentRootTileWindow) -> window); - #endif - - XClearWindow(nxagentDisplay, nxagentWindowPriv(nxagentRootTileWindow) -> window); - } - } - RegionUninit(&sum); } -- cgit v1.2.3