summaryrefslogtreecommitdiffstats
path: root/tdecore/kxerrorhandler.cpp
diff options
context:
space:
mode:
authorTimothy Pearson <kb9vqf@pearsoncomputing.net>2011-11-06 15:56:40 -0600
committerTimothy Pearson <kb9vqf@pearsoncomputing.net>2011-11-06 15:56:40 -0600
commite16866e072f94410321d70daedbcb855ea878cac (patch)
treeee3f52eabde7da1a0e6ca845fb9c2813cf1558cf /tdecore/kxerrorhandler.cpp
parenta58c20c1a7593631a1b50213c805507ebc16adaf (diff)
downloadtdelibs-e16866e072f94410321d70daedbcb855ea878cac.tar.gz
tdelibs-e16866e072f94410321d70daedbcb855ea878cac.zip
Actually move the kde files that were renamed in the last commit
Diffstat (limited to 'tdecore/kxerrorhandler.cpp')
-rw-r--r--tdecore/kxerrorhandler.cpp121
1 files changed, 121 insertions, 0 deletions
diff --git a/tdecore/kxerrorhandler.cpp b/tdecore/kxerrorhandler.cpp
new file mode 100644
index 000000000..43a05f42e
--- /dev/null
+++ b/tdecore/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 <tqwidget.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