summaryrefslogtreecommitdiffstats
path: root/kdecore/kxerrorhandler.cpp
diff options
context:
space:
mode:
authortoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
committertoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
commitce4a32fe52ef09d8f5ff1dd22c001110902b60a2 (patch)
tree5ac38a06f3dde268dc7927dc155896926aaf7012 /kdecore/kxerrorhandler.cpp
downloadtdelibs-ce4a32fe52ef09d8f5ff1dd22c001110902b60a2.tar.gz
tdelibs-ce4a32fe52ef09d8f5ff1dd22c001110902b60a2.zip
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdelibs@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kdecore/kxerrorhandler.cpp')
-rw-r--r--kdecore/kxerrorhandler.cpp121
1 files changed, 121 insertions, 0 deletions
diff --git a/kdecore/kxerrorhandler.cpp b/kdecore/kxerrorhandler.cpp
new file mode 100644
index 000000000..c632012d2
--- /dev/null
+++ b/kdecore/kxerrorhandler.cpp
@@ -0,0 +1,121 @@
+/*
+
+ Copyright (c) 2003 Lubos Lunak <l.lunak@kde.org>
+
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the "Software"),
+ to deal in the Software without restriction, including without limitation
+ the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ and/or sell copies of the Software, and to permit persons to whom the
+ Software is furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ DEALINGS IN THE SOFTWARE.
+
+*/
+
+#include <qwidget.h>
+#ifdef Q_WS_X11 //FIXME
+
+#include "kxerrorhandler.h"
+#include <assert.h>
+#include <stdlib.h>
+#include <netwm_def.h>
+
+KXErrorHandler** KXErrorHandler::handlers = NULL;
+int KXErrorHandler::pos = 0;
+int KXErrorHandler::size = 0;
+
+KXErrorHandler::KXErrorHandler( Display* dpy )
+ : user_handler1( NULL ),
+ user_handler2( NULL ),
+ old_handler( XSetErrorHandler( handler_wrapper )),
+ first_request( XNextRequest( dpy )),
+ display( dpy ),
+ was_error( false )
+ {
+ addHandler();
+ }
+
+KXErrorHandler::KXErrorHandler( bool (*handler)( int request, int error_code, unsigned long resource_id ), Display* dpy )
+ : user_handler1( handler ),
+ user_handler2( NULL ),
+ old_handler( XSetErrorHandler( handler_wrapper )),
+ first_request( XNextRequest( dpy )),
+ display( dpy ),
+ was_error( false )
+ {
+ addHandler();
+ }
+
+KXErrorHandler::KXErrorHandler( int (*handler)( Display*, XErrorEvent* ), Display* dpy )
+ : user_handler1( NULL ),
+ user_handler2( handler ),
+ old_handler( XSetErrorHandler( handler_wrapper )),
+ first_request( XNextRequest( dpy )),
+ display( dpy ),
+ was_error( false )
+ {
+ addHandler();
+ }
+
+KXErrorHandler::~KXErrorHandler()
+ {
+ XSetErrorHandler( old_handler );
+ assert( this == handlers[ pos - 1 ] ); // destroy in reverse order
+ --pos;
+ }
+
+void KXErrorHandler::addHandler()
+ {
+ if( size == pos )
+ {
+ size += 16;
+ handlers = static_cast< KXErrorHandler** >( realloc( handlers, size * sizeof( KXErrorHandler* )));
+ }
+ handlers[ pos++ ] = this;
+ }
+
+bool KXErrorHandler::error( bool sync ) const
+ {
+ if( sync )
+ XSync( display, False );
+ return was_error;
+ }
+
+int KXErrorHandler::handler_wrapper( Display* dpy, XErrorEvent* e )
+ {
+ --pos;
+ int ret = handlers[ pos ]->handle( dpy, e );
+ ++pos;
+ return ret;
+ }
+
+int KXErrorHandler::handle( Display* dpy, XErrorEvent* e )
+ {
+ if( dpy == display
+ // e->serial >= first_request , compare like X timestamps to handle wrapping
+ && NET::timestampCompare( e->serial, first_request ) >= 0 )
+ { // it's for us
+ //qDebug( "Handling: %p", static_cast< void* >( this ));
+ if( user_handler1 != NULL && user_handler1( e->request_code, e->error_code, e->resourceid ))
+ was_error = true;
+ if( user_handler2 != NULL && user_handler2( dpy, e ) != 0 )
+ was_error = true;
+ else // no handler set, simply set that there was an error
+ was_error = true;
+ return 0;
+ }
+ //qDebug( "Going deeper: %p", static_cast< void* >( this ));
+ return old_handler( dpy, e );
+ }
+
+#endif