kdecore Library API Documentation

kxerrorhandler.cpp

00001 /* 00002 00003 Copyright (c) 2003 Lubos Lunak <l.lunak@kde.org> 00004 00005 Permission is hereby granted, free of charge, to any person obtaining a 00006 copy of this software and associated documentation files (the "Software"), 00007 to deal in the Software without restriction, including without limitation 00008 the rights to use, copy, modify, merge, publish, distribute, sublicense, 00009 and/or sell copies of the Software, and to permit persons to whom the 00010 Software is furnished to do so, subject to the following conditions: 00011 00012 The above copyright notice and this permission notice shall be included in 00013 all copies or substantial portions of the Software. 00014 00015 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 00016 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00017 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 00018 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00019 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 00020 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 00021 DEALINGS IN THE SOFTWARE. 00022 00023 */ 00024 00025 #include <qwidget.h> 00026 #ifdef Q_WS_X11 //FIXME 00027 00028 #include "kxerrorhandler.h" 00029 #include <assert.h> 00030 #include <stdlib.h> 00031 00032 KXErrorHandler** KXErrorHandler::handlers = NULL; 00033 int KXErrorHandler::pos = 0; 00034 int KXErrorHandler::size = 0; 00035 00036 KXErrorHandler::KXErrorHandler( Display* dpy ) 00037 : user_handler1( NULL ), 00038 user_handler2( NULL ), 00039 old_handler( XSetErrorHandler( handler_wrapper )), 00040 first_request( XNextRequest( dpy )), 00041 display( dpy ), 00042 was_error( false ) 00043 { 00044 addHandler(); 00045 } 00046 00047 KXErrorHandler::KXErrorHandler( bool (*handler)( int request, int error_code, unsigned long resource_id ), Display* dpy ) 00048 : user_handler1( handler ), 00049 user_handler2( NULL ), 00050 old_handler( XSetErrorHandler( handler_wrapper )), 00051 first_request( XNextRequest( dpy )), 00052 display( dpy ), 00053 was_error( false ) 00054 { 00055 addHandler(); 00056 } 00057 00058 KXErrorHandler::KXErrorHandler( int (*handler)( Display*, XErrorEvent* ), Display* dpy ) 00059 : user_handler1( NULL ), 00060 user_handler2( handler ), 00061 old_handler( XSetErrorHandler( handler_wrapper )), 00062 first_request( XNextRequest( dpy )), 00063 display( dpy ), 00064 was_error( false ) 00065 { 00066 addHandler(); 00067 } 00068 00069 KXErrorHandler::~KXErrorHandler() 00070 { 00071 XSetErrorHandler( old_handler ); 00072 assert( this == handlers[ pos - 1 ] ); // destroy in reverse order 00073 --pos; 00074 } 00075 00076 void KXErrorHandler::addHandler() 00077 { 00078 if( size == pos ) 00079 { 00080 size += 16; 00081 handlers = static_cast< KXErrorHandler** >( realloc( handlers, size * sizeof( KXErrorHandler* ))); 00082 } 00083 handlers[ pos++ ] = this; 00084 } 00085 00086 bool KXErrorHandler::error( bool sync ) const 00087 { 00088 if( sync ) 00089 XSync( display, False ); 00090 return was_error; 00091 } 00092 00093 int KXErrorHandler::handler_wrapper( Display* dpy, XErrorEvent* e ) 00094 { 00095 --pos; 00096 int ret = handlers[ pos ]->handle( dpy, e ); 00097 ++pos; 00098 return ret; 00099 } 00100 00101 int KXErrorHandler::handle( Display* dpy, XErrorEvent* e ) 00102 { 00103 if( dpy == display 00104 && e->serial - first_request < 1000000000 ) // e->serial > first_request, with wrapping 00105 { // it's for us 00106 //qDebug( "Handling: %p", static_cast< void* >( this )); 00107 if( user_handler1 != NULL ) 00108 was_error |= user_handler1( e->request_code, e->error_code, e->resourceid ); 00109 else if( user_handler2 != NULL ) 00110 was_error |= ( user_handler2( dpy, e ) != 0 ); 00111 else // no handler set, simply set that there was an error 00112 was_error = true; 00113 return 0; 00114 } 00115 //qDebug( "Going deeper: %p", static_cast< void* >( this )); 00116 return old_handler( dpy, e ); 00117 } 00118 00119 #endif
KDE Logo
This file is part of the documentation for kdecore Library Version 3.2.3.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Mar 16 17:21:44 2005 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003