[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [54033] trunk/blender/intern/ghost/intern: fix for blender quitting in X11 if you start blender with a tablet, unplug it, then open a new window.

Campbell Barton ideasman42 at gmail.com
Wed Jan 23 11:32:11 CET 2013


Revision: 54033
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=54033
Author:   campbellbarton
Date:     2013-01-23 10:32:09 +0000 (Wed, 23 Jan 2013)
Log Message:
-----------
fix for blender quitting in X11 if you start blender with a tablet, unplug it, then open a new window.

Modified Paths:
--------------
    trunk/blender/intern/ghost/intern/GHOST_SystemX11.cpp
    trunk/blender/intern/ghost/intern/GHOST_SystemX11.h
    trunk/blender/intern/ghost/intern/GHOST_WindowX11.cpp

Modified: trunk/blender/intern/ghost/intern/GHOST_SystemX11.cpp
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_SystemX11.cpp	2013-01-23 08:07:39 UTC (rev 54032)
+++ trunk/blender/intern/ghost/intern/GHOST_SystemX11.cpp	2013-01-23 10:32:09 UTC (rev 54033)
@@ -69,9 +69,11 @@
 #include <stdio.h> /* for fprintf only */
 #include <cstdlib> /* for exit */
 
-static GHOST_TKey
-convertXKey(KeySym key);
+/* for debugging - so we can breakpoint X11 errors */
+// #define USE_X11_ERROR_HANDLERS
 
+static GHOST_TKey convertXKey(KeySym key);
+
 /* these are for copy and select copy */
 static char *txt_cut_buffer = NULL;
 static char *txt_select_buffer = NULL;
@@ -91,6 +93,11 @@
 		abort(); /* was return before, but this would just mean it will crash later */
 	}
 
+#ifdef USE_X11_ERROR_HANDLERS
+	(void) XSetErrorHandler(GHOST_X11_ApplicationErrorHandler);
+	(void) XSetIOErrorHandler(GHOST_X11_ApplicationIOErrorHandler);
+#endif
+
 #if defined(WITH_X11_XINPUT) && defined(X_HAVE_UTF8_STRING)
 	/* note -- don't open connection to XIM server here, because the locale
 	 * has to be set before opening the connection but setlocale() has not
@@ -1726,7 +1733,7 @@
  * Basically it will not crash blender now if you have a X device that
  * is configured but not plugged in.
  */
-static int ApplicationErrorHandler(Display *display, XErrorEvent *theEvent)
+int GHOST_X11_ApplicationErrorHandler(Display *display, XErrorEvent *theEvent)
 {
 	fprintf(stderr, "Ignoring Xlib error: error code %d request code %d\n",
 	        theEvent->error_code, theEvent->request_code);
@@ -1735,6 +1742,14 @@
 	return 0;
 }
 
+int GHOST_X11_ApplicationIOErrorHandler(Display *display)
+{
+	fprintf(stderr, "Ignoring Xlib error: error IO\n");
+
+	/* No exit! - but keep lint happy */
+	return 0;
+}
+
 /* These C functions are copied from Wine 1.1.13's wintab.c */
 #define BOOL int
 #define TRUE 1
@@ -1832,7 +1847,9 @@
 
 void GHOST_SystemX11::initXInputDevices()
 {
-	static XErrorHandler old_handler = (XErrorHandler) 0;
+	static XErrorHandler   old_handler = (XErrorHandler) 0;
+	static XIOErrorHandler old_handler_io = (XIOErrorHandler) 0;
+
 	XExtensionVersion *version = XGetExtensionVersion(m_display, INAME);
 
 	if (version && (version != (XExtensionVersion *)NoSuchExtension)) {
@@ -1843,7 +1860,8 @@
 			m_xtablet.EraserDevice = NULL;
 
 			/* Install our error handler to override Xlib's termination behavior */
-			old_handler = XSetErrorHandler(ApplicationErrorHandler);
+			old_handler = XSetErrorHandler(GHOST_X11_ApplicationErrorHandler);
+			old_handler_io = XSetIOErrorHandler(GHOST_X11_ApplicationIOErrorHandler);
 
 			for (int i = 0; i < device_count; ++i) {
 				char *device_type = device_info[i].type ? XGetAtomName(m_display, device_info[i].type) : NULL;
@@ -1893,6 +1911,7 @@
 
 			/* Restore handler */
 			(void) XSetErrorHandler(old_handler);
+			(void) XSetIOErrorHandler(old_handler_io);
 
 			XFreeDeviceList(device_info);
 		}

Modified: trunk/blender/intern/ghost/intern/GHOST_SystemX11.h
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_SystemX11.h	2013-01-23 08:07:39 UTC (rev 54032)
+++ trunk/blender/intern/ghost/intern/GHOST_SystemX11.h	2013-01-23 10:32:09 UTC (rev 54033)
@@ -49,6 +49,9 @@
 #  define GHOST_X11_RES_CLASS "Blender" /* res_class */
 #endif
 
+/* generic error handlers */
+int GHOST_X11_ApplicationErrorHandler(Display *display, XErrorEvent *theEvent);
+int GHOST_X11_ApplicationIOErrorHandler(Display *display);
 
 class GHOST_WindowX11;
 

Modified: trunk/blender/intern/ghost/intern/GHOST_WindowX11.cpp
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_WindowX11.cpp	2013-01-23 08:07:39 UTC (rev 54032)
+++ trunk/blender/intern/ghost/intern/GHOST_WindowX11.cpp	2013-01-23 10:32:09 UTC (rev 54033)
@@ -1210,6 +1210,13 @@
 	GHOST_TSuccess success;
 	switch (type) {
 		case GHOST_kDrawingContextTypeOpenGL:
+		{
+			/* use our own event handlers to avoid exiting blender,
+			 * this would happen for eg:
+			 * if you open blender, unplug a tablet, then open a new window. */
+			XErrorHandler old_handler      = XSetErrorHandler(GHOST_X11_ApplicationErrorHandler);
+			XIOErrorHandler old_handler_io = XSetIOErrorHandler(GHOST_X11_ApplicationIOErrorHandler);
+
 			m_context = glXCreateContext(m_display, m_visual, s_firstContext, True);
 			if (m_context != NULL) {
 				if (!s_firstContext) {
@@ -1224,12 +1231,17 @@
 				success = GHOST_kFailure;
 			}
 
+			/* Restore handler */
+			(void) XSetErrorHandler(old_handler);
+			(void) XSetIOErrorHandler(old_handler_io);
+
 			break;
-
+		}
 		case GHOST_kDrawingContextTypeNone:
+		{
 			success = GHOST_kSuccess;
 			break;
-
+		}
 		default:
 			success = GHOST_kFailure;
 	}




More information about the Bf-blender-cvs mailing list