b=576933 ignore BadDevice errors from XCloseDevice (for GDK2) r=roc
authorKarl Tomlinson <karlt+@karlt.net>
Fri, 25 Mar 2011 16:38:59 +1300
changeset 63424 b9af0765d235bbd0a968c3775ada81463f4ac18a
parent 63423 5eeb8a849e746bcd43b347cca5a7fee4c6100624
child 63425 714b1288f956a45c084b904e09e7f69c0efb38a8
push id67
push userktomlinson@mozilla.com
push dateWed, 13 Apr 2011 17:25:58 +0000
reviewersroc
bugs576933
milestone2.0.1pre
b=576933 ignore BadDevice errors from XCloseDevice (for GDK2) r=roc
toolkit/xre/nsX11ErrorHandler.cpp
--- a/toolkit/xre/nsX11ErrorHandler.cpp
+++ b/toolkit/xre/nsX11ErrorHandler.cpp
@@ -51,19 +51,16 @@ using mozilla::plugins::PluginProcessChi
 #include "mozilla/X11Util.h"
 #include <X11/Xlib.h>
 
 #define BUFSIZE 2048 // What Xlib uses with XGetErrorDatabaseText
 
 extern "C" {
 static int
 X11Error(Display *display, XErrorEvent *event) {
-  nsCAutoString notes;
-  char buffer[BUFSIZE];
-
   // Get an indication of how long ago the request that caused the error was
   // made.
   unsigned long age = NextRequest(display) - event->serial;
 
   // Get a string to represent the request that caused the error.
   nsCAutoString message;
   if (event->request_code < 128) {
     // Core protocol request
@@ -76,42 +73,56 @@ X11Error(Display *display, XErrorEvent *
     // protocol requests or that will look for input events" so we use another
     // temporary Display to request extension information.  This assumes on
     // the DISPLAY environment variable has been set and matches what was used
     // to open |display|.
     Display *tmpDisplay = XOpenDisplay(NULL);
     if (tmpDisplay) {
       int nExts;
       char** extNames = XListExtensions(tmpDisplay, &nExts);
+      int first_error;
       if (extNames) {
         for (int i = 0; i < nExts; ++i) {
-          int major_opcode, first_event, first_error;
+          int major_opcode, first_event;
           if (XQueryExtension(tmpDisplay, extNames[i],
                               &major_opcode, &first_event, &first_error)
               && major_opcode == event->request_code) {
             message.Append(extNames[i]);
             message.Append('.');
             message.AppendInt(event->minor_code);
             break;
           }
         }
 
         XFreeExtensionList(extNames);
       }
       XCloseDisplay(tmpDisplay);
+
+#ifdef MOZ_WIDGET_GTK2
+      // GDK2 calls XCloseDevice the devices that it opened on startup, but
+      // the XI protocol no longer ensures that the devices will still exist.
+      // If they have been removed, then a BadDevice error results.  Ignore
+      // this error.
+      if (message.EqualsLiteral("XInputExtension.4") &&
+          event->error_code == first_error + 0) {
+        return 0;
+      }
+#endif
     }
   }
 
+  char buffer[BUFSIZE];
   if (message.IsEmpty()) {
     buffer[0] = '\0';
   } else {
     XGetErrorDatabaseText(display, "XRequest", message.get(), "",
                           buffer, sizeof(buffer));
   }
 
+  nsCAutoString notes;
   if (buffer[0]) {
     notes.Append(buffer);
   } else {
     notes.Append("Request ");
     notes.AppendInt(event->request_code);
     notes.Append('.');
     notes.AppendInt(event->minor_code);
   }