1216N/A/*
6447N/A * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved.
1216N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
1216N/A *
1216N/A * This code is free software; you can redistribute it and/or modify it
1216N/A * under the terms of the GNU General Public License version 2 only, as
2362N/A * published by the Free Software Foundation. Oracle designates this
1216N/A * particular file as subject to the "Classpath" exception as provided
2362N/A * by Oracle in the LICENSE file that accompanied this code.
1216N/A *
1216N/A * This code is distributed in the hope that it will be useful, but WITHOUT
1216N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1216N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
1216N/A * version 2 for more details (a copy is included in the LICENSE file that
1216N/A * accompanied this code).
1216N/A *
1216N/A * You should have received a copy of the GNU General Public License version
1216N/A * 2 along with this work; if not, write to the Free Software Foundation,
1216N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
1216N/A *
2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2362N/A * or visit www.oracle.com if you need additional information or have any
2362N/A * questions.
1216N/A */
1216N/Apackage sun.awt.X11;
1216N/A
1216N/Apublic abstract class XErrorHandler {
1216N/A
1216N/A /*
1216N/A * Called under AWT lock
1216N/A */
1216N/A public abstract int handleError(long display, XErrorEvent err);
1216N/A
1216N/A /*
1216N/A * Forwards all the errors to saved error handler (which was
1216N/A * set before XToolkit had been initialized).
1216N/A */
1216N/A public static class XBaseErrorHandler extends XErrorHandler {
1216N/A @Override
1216N/A public int handleError(long display, XErrorEvent err) {
6447N/A return XErrorHandlerUtil.SAVED_XERROR_HANDLER(display, err);
6447N/A }
6447N/A }
6447N/A
6447N/A /**
6447N/A * This is a base synthetic error handler containing a boolean flag which allows
6447N/A * to show that an error is handled or not.
6447N/A */
6447N/A public static class XErrorHandlerWithFlag extends XBaseErrorHandler {
6447N/A private volatile boolean errorOccurred = false;
6447N/A
6447N/A public boolean getErrorOccurredFlag() {
6447N/A return errorOccurred;
6447N/A }
6447N/A
6447N/A /**
6447N/A * Sets an internal boolean flag to a particular value. Should be always called
6447N/A * with {@code false} value of the parameter {@code errorOccurred} before this
6447N/A * error handler is set as current.
6447N/A * @param errorOccurred {@code true} to indicate that an error was handled,
6447N/A * {@code false} to reset the internal boolean flag
6447N/A */
6447N/A public void setErrorOccurredFlag(boolean errorOccurred) {
6447N/A this.errorOccurred = errorOccurred;
1216N/A }
1216N/A }
1216N/A
1216N/A /*
1216N/A * Instead of validating window id, we simply call XGetWindowProperty,
1216N/A * but temporary install this function as the error handler to ignore
1216N/A * BadWindow error.
1216N/A */
1216N/A public static class IgnoreBadWindowHandler extends XBaseErrorHandler {
1216N/A @Override
1216N/A public int handleError(long display, XErrorEvent err) {
1216N/A if (err.get_error_code() == XConstants.BadWindow) {
1216N/A return 0;
1216N/A }
1216N/A return super.handleError(display, err);
1216N/A }
1216N/A // Shared instance
1216N/A private static IgnoreBadWindowHandler theInstance = new IgnoreBadWindowHandler();
1216N/A public static IgnoreBadWindowHandler getInstance() {
1216N/A return theInstance;
1216N/A }
1216N/A }
1216N/A
1216N/A public static class VerifyChangePropertyHandler extends XBaseErrorHandler {
1216N/A @Override
1216N/A public int handleError(long display, XErrorEvent err) {
1216N/A if (err.get_request_code() == XProtocolConstants.X_ChangeProperty) {
1216N/A return 0;
1216N/A }
1216N/A return super.handleError(display, err);
1216N/A }
1216N/A // Shared instance
1616N/A private static VerifyChangePropertyHandler theInstance = new VerifyChangePropertyHandler();
1616N/A public static VerifyChangePropertyHandler getInstance() {
1216N/A return theInstance;
1216N/A }
1216N/A }
6447N/A
6447N/A /**
6447N/A * This is a synthetic error handler for errors generated by the native function
6447N/A * {@code XShmAttach}. If an error is handled, an internal boolean flag of the
6447N/A * handler is set to {@code true}.
6447N/A */
6447N/A public static final class XShmAttachHandler extends XErrorHandlerWithFlag {
6447N/A private XShmAttachHandler() {}
6447N/A
6447N/A @Override
6447N/A public int handleError(long display, XErrorEvent err) {
6447N/A if (err.get_minor_code() == XConstants.X_ShmAttach) {
6447N/A setErrorOccurredFlag(true);
6447N/A return 0;
6447N/A }
6447N/A return super.handleError(display, err);
6447N/A }
6447N/A
6447N/A // Shared instance
6447N/A private static XShmAttachHandler theInstance = new XShmAttachHandler();
6447N/A public static XShmAttachHandler getInstance() {
6447N/A return theInstance;
6447N/A }
6447N/A }
6447N/A
6447N/A /**
6447N/A * This is a synthetic error handler for {@code BadAlloc} errors generated by the
6447N/A * native {@code glX*} functions. Its internal boolean flag is set to {@code true},
6447N/A * if an error is handled.
6447N/A */
6447N/A public static final class GLXBadAllocHandler extends XErrorHandlerWithFlag {
6447N/A private GLXBadAllocHandler() {}
6447N/A
6447N/A @Override
6447N/A public int handleError(long display, XErrorEvent err) {
6447N/A if (err.get_error_code() == XConstants.BadAlloc) {
6447N/A setErrorOccurredFlag(true);
6447N/A return 0;
6447N/A }
6447N/A return super.handleError(display, err);
6447N/A }
6447N/A
6447N/A private static GLXBadAllocHandler theInstance = new GLXBadAllocHandler();
6447N/A public static GLXBadAllocHandler getInstance() {
6447N/A return theInstance;
6447N/A }
6447N/A }
6447N/A
6447N/A /**
6447N/A * This is a synthetic error handler for errors generated by the native function
6447N/A * {@code XChangeWindowAttributes}. If an error is handled, an internal boolean
6447N/A * flag of the handler is set to {@code true}.
6447N/A */
6447N/A public static final class XChangeWindowAttributesHandler extends XErrorHandlerWithFlag {
6447N/A private XChangeWindowAttributesHandler() {}
6447N/A
6447N/A @Override
6447N/A public int handleError(long display, XErrorEvent err) {
6447N/A if ((err.get_request_code() == XProtocolConstants.X_ChangeWindowAttributes) &&
6447N/A (err.get_error_code() == XConstants.BadAccess)) {
6447N/A setErrorOccurredFlag(true);
6447N/A return 0;
6447N/A }
6447N/A return super.handleError(display, err);
6447N/A }
6447N/A
6447N/A private static XChangeWindowAttributesHandler theInstance = new XChangeWindowAttributesHandler();
6447N/A public static XChangeWindowAttributesHandler getInstance() {
6447N/A return theInstance;
6447N/A }
6447N/A }
1216N/A}