kxerrorhandler.cpp
00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
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 ] ); 
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 ) 
00105         { 
00106         
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 
00112             was_error = true;
00113         return 0;
00114         }
00115     
00116     return old_handler( dpy, e );
00117     }
00118 
00119 #endif
 
This file is part of the documentation for kdecore Library Version 3.2.0.