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.3.1.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Fri Feb 18 15:10:01 2005 by doxygen 1.3.9.1 written by Dimitri van Heesch, © 1997-2003