kxerrorhandler.cpp00001
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 #include <netwm_def.h>
00032
00033 KXErrorHandler** KXErrorHandler::handlers = NULL;
00034 int KXErrorHandler::pos = 0;
00035 int KXErrorHandler::size = 0;
00036
00037 KXErrorHandler::KXErrorHandler( Display* dpy )
00038 : user_handler1( NULL ),
00039 user_handler2( NULL ),
00040 old_handler( XSetErrorHandler( handler_wrapper )),
00041 first_request( XNextRequest( dpy )),
00042 display( dpy ),
00043 was_error( false )
00044 {
00045 addHandler();
00046 }
00047
00048 KXErrorHandler::KXErrorHandler( bool (*handler)( int request, int error_code, unsigned long resource_id ), Display* dpy )
00049 : user_handler1( handler ),
00050 user_handler2( NULL ),
00051 old_handler( XSetErrorHandler( handler_wrapper )),
00052 first_request( XNextRequest( dpy )),
00053 display( dpy ),
00054 was_error( false )
00055 {
00056 addHandler();
00057 }
00058
00059 KXErrorHandler::KXErrorHandler( int (*handler)( Display*, XErrorEvent* ), Display* dpy )
00060 : user_handler1( NULL ),
00061 user_handler2( handler ),
00062 old_handler( XSetErrorHandler( handler_wrapper )),
00063 first_request( XNextRequest( dpy )),
00064 display( dpy ),
00065 was_error( false )
00066 {
00067 addHandler();
00068 }
00069
00070 KXErrorHandler::~KXErrorHandler()
00071 {
00072 XSetErrorHandler( old_handler );
00073 assert( this == handlers[ pos - 1 ] );
00074 --pos;
00075 }
00076
00077 void KXErrorHandler::addHandler()
00078 {
00079 if( size == pos )
00080 {
00081 size += 16;
00082 handlers = static_cast< KXErrorHandler** >( realloc( handlers, size * sizeof( KXErrorHandler* )));
00083 }
00084 handlers[ pos++ ] = this;
00085 }
00086
00087 bool KXErrorHandler::error( bool sync ) const
00088 {
00089 if( sync )
00090 XSync( display, False );
00091 return was_error;
00092 }
00093
00094 int KXErrorHandler::handler_wrapper( Display* dpy, XErrorEvent* e )
00095 {
00096 --pos;
00097 int ret = handlers[ pos ]->handle( dpy, e );
00098 ++pos;
00099 return ret;
00100 }
00101
00102 int KXErrorHandler::handle( Display* dpy, XErrorEvent* e )
00103 {
00104 if( dpy == display
00105
00106 && NET::timestampCompare( e->serial, first_request ) >= 0 )
00107 {
00108
00109 if( user_handler1 != NULL && user_handler1( e->request_code, e->error_code, e->resourceid ))
00110 was_error = true;
00111 if( user_handler2 != NULL && user_handler2( dpy, e ) != 0 )
00112 was_error = true;
00113 else
00114 was_error = true;
00115 return 0;
00116 }
00117
00118 return old_handler( dpy, e );
00119 }
00120
00121 #endif
|