We now have a current svn snapshot of libqxt in our contrib dir, and
[quassel.git] / src / contrib / libqxt-2007-10-24 / src / gui / qxtapplication_x11.cpp
diff --git a/src/contrib/libqxt-2007-10-24/src/gui/qxtapplication_x11.cpp b/src/contrib/libqxt-2007-10-24/src/gui/qxtapplication_x11.cpp
new file mode 100644 (file)
index 0000000..237a5e5
--- /dev/null
@@ -0,0 +1,94 @@
+/****************************************************************************
+**
+** Copyright (C) Qxt Foundation. Some rights reserved.
+**
+** This file is part of the QxtGui module of the Qt eXTension library
+**
+** This library is free software; you can redistribute it and/or modify it
+** under the terms of th Common Public License, version 1.0, as published by
+** IBM.
+**
+** This file is provided "AS IS", without WARRANTIES OR CONDITIONS OF ANY
+** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY
+** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR
+** FITNESS FOR A PARTICULAR PURPOSE.
+**
+** You should have received a copy of the CPL along with this file.
+** See the LICENSE file and the cpl1.0.txt file included with the source
+** distribution for more information. If you did not receive a copy of the
+** license, contact the Qxt Foundation.
+**
+** <http://libqxt.sourceforge.net>  <foundation@libqxt.org>
+**
+****************************************************************************/
+#include "qxtapplication.h"
+#include "qxtapplication_p.h"
+#include <QKeySequence>
+#include <QX11Info>
+#include <X11/Xlib.h>
+
+QxtApplication::QxtApplication(Display* display, Qt::HANDLE visual, Qt::HANDLE colormap)
+        : QApplication(display, visual, colormap)
+{}
+
+QxtApplication::QxtApplication(Display* display, int& argc, char** argv, Qt::HANDLE visual, Qt::HANDLE colormap)
+        : QApplication(display, argc, argv, visual, colormap)
+{}
+
+bool QxtApplication::x11EventFilter(XEvent* event)
+{
+    foreach (QxtNativeEventFilter* filter, qxt_d().nativeFilters)
+    {
+        if (filter && filter->x11EventFilter(event))
+            return true;
+    }
+
+    if (event->type == KeyPress)
+    {
+        XKeyEvent* key = (XKeyEvent*) event;
+        qxt_d().activateHotKey(key->state, key->keycode);
+    }
+    return QApplication::x11EventFilter(event);
+}
+
+uint QxtApplicationPrivate::nativeModifiers(Qt::KeyboardModifiers modifiers) const
+{
+    // ShiftMask, LockMask, ControlMask, Mod1Mask, Mod2Mask, Mod3Mask, Mod4Mask, and Mod5Mask
+    uint native = 0;
+    if (modifiers & Qt::ShiftModifier)
+        native |= ShiftMask;
+    if (modifiers & Qt::ControlModifier)
+        native |= ControlMask;
+    if (modifiers & Qt::AltModifier)
+        native |= Mod1Mask;
+    // TODO: resolve these?
+    //if (modifiers & Qt::MetaModifier)
+    //if (modifiers & Qt::KeypadModifier)
+    //if (modifiers & Qt::GroupSwitchModifier)
+    return native;
+}
+
+uint QxtApplicationPrivate::nativeKeycode(Qt::Key key) const
+{
+    Display* display = QX11Info::display();
+    return XKeysymToKeycode(display, XStringToKeysym(QKeySequence(key).toString().toLatin1().data()));
+}
+
+bool QxtApplicationPrivate::registerHotKey(uint modifiers, uint keycode, QWidget* receiver)
+{
+    Q_UNUSED(receiver);
+    Display* display = QX11Info::display();
+    Window window = QX11Info::appRootWindow();
+    Bool owner = True;
+    int pointer = GrabModeAsync;
+    int keyboard = GrabModeAsync;
+    return XGrabKey(display, keycode, modifiers, window, owner, pointer, keyboard);
+}
+
+bool QxtApplicationPrivate::unregisterHotKey(uint modifiers, uint keycode, QWidget* receiver)
+{
+    Q_UNUSED(receiver);
+    Display* display = QX11Info::display();
+    Window window = QX11Info::appRootWindow();
+    return XUngrabKey(display, keycode, modifiers, window);
+}