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