ecere/gui/XInterface: Fixed X11 deadlocks with threads enabled
authorJerome St-Louis <jerome@ecere.com>
Fri, 14 Mar 2014 22:29:46 +0000 (18:29 -0400)
committerJerome St-Louis <jerome@ecere.com>
Fri, 14 Mar 2014 22:29:46 +0000 (18:29 -0400)
- Avoiding calling XFindContext from within the FocusInChecker predicate, as that deadlocked
- Put back call to XInitThreads(), for use with libraries / applications not mutexing out X calls
- Fixed initial XLockDisplay being skipped due to xGlobalDisplay not yet initialized

ecere/src/gui/GuiApplication.ec
ecere/src/gui/drivers/XInterface.ec

index 3be36b3..4589254 100644 (file)
@@ -568,10 +568,10 @@ public class GuiApplication : Application
          errorLevel = 2;
 
          lockMutex.Wait();
-#if (defined(__unix__) || defined(__APPLE__)) && !defined(__ANDROID__)
+/*#if (defined(__unix__) || defined(__APPLE__)) && !defined(__ANDROID__)
          if(xGlobalDisplay)
             XLockDisplay(xGlobalDisplay);
-#endif
+#endif*/
 
          // Setup Desktop
          if(!desktop)
index e7586f1..efb282d 100644 (file)
@@ -934,7 +934,16 @@ static X11Bool FocusInChecker(void *display, XFocusChangeEvent *event, char * da
    if(event->type == FocusIn)
    {
       Window window = null;
-      XFindContext(xGlobalDisplay, event->window, windowContext, (XPointer *) &window);
+      // --- This deadlocks and I think Xorg should fix this.
+      // XFindContext(xGlobalDisplay, event->window, windowContext, (XPointer *) &window);
+      if((X11Window)guiApp.desktop.windowHandle == event->window)
+         window = guiApp.desktop;
+      else
+      {
+         for(window = guiApp.desktop.firstChild; window; window = window.next)
+            if((X11Window)window.windowHandle == event->window)
+               break;
+      }
       if(window)
          result = True;
    }
@@ -1354,7 +1363,7 @@ class XInterface : Interface
    bool Initialize()
    {
       setlocale(LC_ALL, "en_US.UTF-8");
-      // XInitThreads();
+      XInitThreads();
       XSupportsLocale();
       XSetLocaleModifiers("");
       XSetErrorHandler(MyXErrorHandler);
@@ -1364,6 +1373,12 @@ class XInterface : Interface
 #endif
       xTerminate = false;
       xGlobalDisplay = XOpenDisplay(null);
+
+#if (defined(__unix__) || defined(__APPLE__)) && !defined(__ANDROID__)
+      if(xGlobalDisplay)
+         XLockDisplay(xGlobalDisplay);
+#endif
+
       // XSynchronize(xGlobalDisplay, True);
       frameExtentSupported = unknown;