src/solaris/classes/sun/awt/X11/XErrorHandler.java

Print this page

        

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.  Oracle designates this

@@ -36,11 +36,34 @@
      * set before XToolkit had been initialized).
      */
     public static class XBaseErrorHandler extends XErrorHandler {
         @Override
         public int handleError(long display, XErrorEvent err) {
-            return XToolkit.SAVED_ERROR_HANDLER(display, err);
+            return XErrorHandlerUtil.SAVED_XERROR_HANDLER(display, err);
+        }
+    }
+
+    /**
+     * This is a base synthetic error handler containing a boolean flag which allows
+     * to show that an error is handled or not.
+     */
+    public static class XErrorHandlerWithFlag extends XBaseErrorHandler {
+        private volatile boolean errorOccurred = false;
+
+        public boolean getErrorOccurredFlag() {
+            return errorOccurred;
+        }
+
+        /**
+         * Sets an internal boolean flag to a particular value. Should be always called
+         * with {@code false} value of the parameter {@code errorOccurred} before this
+         * error handler is set as current.
+         * @param errorOccurred {@code true} to indicate that an error was handled,
+         *     {@code false} to reset the internal boolean flag
+         */
+        public void setErrorOccurredFlag(boolean errorOccurred) {
+            this.errorOccurred = errorOccurred;
         }
     }
 
     /*
      * Instead of validating window id, we simply call XGetWindowProperty,

@@ -74,6 +97,77 @@
         private static VerifyChangePropertyHandler theInstance = new VerifyChangePropertyHandler();
         public static VerifyChangePropertyHandler getInstance() {
             return theInstance;
         }
     }
+
+    /**
+     * This is a synthetic error handler for errors generated by the native function
+     * {@code XShmAttach}. If an error is handled, an internal boolean flag of the
+     * handler is set to {@code true}.
+     */
+    public static final class XShmAttachHandler extends XErrorHandlerWithFlag {
+        private XShmAttachHandler() {}
+
+        @Override
+        public int handleError(long display, XErrorEvent err) {
+            if (err.get_minor_code() == XConstants.X_ShmAttach) {
+                setErrorOccurredFlag(true);
+                return 0;
+            }
+            return super.handleError(display, err);
+        }
+
+        // Shared instance
+        private static XShmAttachHandler theInstance = new XShmAttachHandler();
+        public static XShmAttachHandler getInstance() {
+            return theInstance;
+        }
+    }
+
+    /**
+     * This is a synthetic error handler for {@code BadAlloc} errors generated by the
+     * native {@code glX*} functions. Its internal boolean flag is set to {@code true},
+     * if an error is handled.
+     */
+    public static final class GLXBadAllocHandler extends XErrorHandlerWithFlag {
+        private GLXBadAllocHandler() {}
+
+        @Override
+        public int handleError(long display, XErrorEvent err) {
+            if (err.get_error_code() == XConstants.BadAlloc) {
+                setErrorOccurredFlag(true);
+                return 0;
+            }
+            return super.handleError(display, err);
+        }
+
+        private static GLXBadAllocHandler theInstance = new GLXBadAllocHandler();
+        public static GLXBadAllocHandler getInstance() {
+            return theInstance;
+        }
+    }
+
+    /**
+     * This is a synthetic error handler for errors generated by the native function
+     * {@code XChangeWindowAttributes}. If an error is handled, an internal boolean
+     * flag of the handler is set to {@code true}.
+     */
+    public static final class XChangeWindowAttributesHandler extends XErrorHandlerWithFlag {
+        private XChangeWindowAttributesHandler() {}
+
+        @Override
+        public int handleError(long display, XErrorEvent err) {
+            if ((err.get_request_code() == XProtocolConstants.X_ChangeWindowAttributes) &&
+                (err.get_error_code() == XConstants.BadAccess)) {
+                setErrorOccurredFlag(true);
+                return 0;
+            }
+            return super.handleError(display, err);
+        }
+
+        private static XChangeWindowAttributesHandler theInstance = new XChangeWindowAttributesHandler();
+        public static XChangeWindowAttributesHandler getInstance() {
+            return theInstance;
+        }
+    }
 }