+/****************************************************************************\r
+**\r
+** Copyright (C) Qxt Foundation. Some rights reserved.\r
+**\r
+** This file is part of the QxtGui module of the Qt eXTension library\r
+**\r
+** This library is free software; you can redistribute it and/or modify it\r
+** under the terms of th Common Public License, version 1.0, as published by\r
+** IBM.\r
+**\r
+** This file is provided "AS IS", without WARRANTIES OR CONDITIONS OF ANY\r
+** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY\r
+** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR\r
+** FITNESS FOR A PARTICULAR PURPOSE.\r
+**\r
+** You should have received a copy of the CPL along with this file.\r
+** See the LICENSE file and the cpl1.0.txt file included with the source\r
+** distribution for more information. If you did not receive a copy of the\r
+** license, contact the Qxt Foundation.\r
+**\r
+** <http://libqxt.sourceforge.net> <foundation@libqxt.org>\r
+**\r
+****************************************************************************/\r
+#include "qxtapplication.h"\r
+#include "qxtapplication_p.h"\r
+#include <qt_windows.h>\r
+#include <QWidget>\r
+\r
+bool QxtApplication::winEventFilter(MSG* msg, long* result)\r
+{\r
+ foreach (QxtNativeEventFilter* filter, qxt_d().nativeFilters)\r
+ {\r
+ if (filter && filter->winEventFilter(msg, result))\r
+ return true;\r
+ }\r
+\r
+ if (msg->message == WM_HOTKEY)\r
+ {\r
+ uint modifiers = LOWORD(msg->lParam);\r
+ uint keycode = HIWORD(msg->lParam);\r
+ qxt_d().activateHotKey(modifiers, keycode);\r
+ }\r
+ return QApplication::winEventFilter(msg, result);\r
+}\r
+\r
+uint QxtApplicationPrivate::nativeModifiers(Qt::KeyboardModifiers modifiers) const\r
+{\r
+ // MOD_ALT, MOD_CONTROL, (MOD_KEYUP), MOD_SHIFT, MOD_WIN\r
+ uint native = 0;\r
+ if (modifiers & Qt::ShiftModifier)\r
+ native |= MOD_SHIFT;\r
+ if (modifiers & Qt::ControlModifier)\r
+ native |= MOD_CONTROL;\r
+ if (modifiers & Qt::AltModifier)\r
+ native |= MOD_ALT;\r
+ if (modifiers & Qt::MetaModifier)\r
+ native |= MOD_WIN;\r
+ // TODO: resolve these?\r
+ //if (modifiers & Qt::KeypadModifier)\r
+ //if (modifiers & Qt::GroupSwitchModifier)\r
+ return native;\r
+}\r
+\r
+uint QxtApplicationPrivate::nativeKeycode(Qt::Key key) const\r
+{\r
+ switch (key)\r
+ {\r
+ case Qt::Key_Escape:\r
+ return VK_ESCAPE;\r
+ case Qt::Key_Tab:\r
+ case Qt::Key_Backtab:\r
+ return VK_TAB;\r
+ case Qt::Key_Backspace:\r
+ return VK_BACK;\r
+ case Qt::Key_Return:\r
+ case Qt::Key_Enter:\r
+ return VK_RETURN;\r
+ case Qt::Key_Insert:\r
+ return VK_INSERT;\r
+ case Qt::Key_Delete:\r
+ return VK_DELETE;\r
+ case Qt::Key_Pause:\r
+ return VK_PAUSE;\r
+ case Qt::Key_Print:\r
+ return VK_PRINT;\r
+ case Qt::Key_Clear:\r
+ return VK_CLEAR;\r
+ case Qt::Key_Home:\r
+ return VK_HOME;\r
+ case Qt::Key_End:\r
+ return VK_END;\r
+ case Qt::Key_Left:\r
+ return VK_LEFT;\r
+ case Qt::Key_Up:\r
+ return VK_UP;\r
+ case Qt::Key_Right:\r
+ return VK_RIGHT;\r
+ case Qt::Key_Down:\r
+ return VK_DOWN;\r
+ case Qt::Key_PageUp:\r
+ return VK_PRIOR;\r
+ case Qt::Key_PageDown:\r
+ return VK_NEXT;\r
+ case Qt::Key_F1:\r
+ return VK_F1;\r
+ case Qt::Key_F2:\r
+ return VK_F2;\r
+ case Qt::Key_F3:\r
+ return VK_F3;\r
+ case Qt::Key_F4:\r
+ return VK_F4;\r
+ case Qt::Key_F5:\r
+ return VK_F5;\r
+ case Qt::Key_F6:\r
+ return VK_F6;\r
+ case Qt::Key_F7:\r
+ return VK_F7;\r
+ case Qt::Key_F8:\r
+ return VK_F8;\r
+ case Qt::Key_F9:\r
+ return VK_F9;\r
+ case Qt::Key_F10:\r
+ return VK_F10;\r
+ case Qt::Key_F11:\r
+ return VK_F11;\r
+ case Qt::Key_F12:\r
+ return VK_F12;\r
+ case Qt::Key_F13:\r
+ return VK_F13;\r
+ case Qt::Key_F14:\r
+ return VK_F14;\r
+ case Qt::Key_F15:\r
+ return VK_F15;\r
+ case Qt::Key_F16:\r
+ return VK_F16;\r
+ case Qt::Key_F17:\r
+ return VK_F17;\r
+ case Qt::Key_F18:\r
+ return VK_F18;\r
+ case Qt::Key_F19:\r
+ return VK_F19;\r
+ case Qt::Key_F20:\r
+ return VK_F20;\r
+ case Qt::Key_F21:\r
+ return VK_F21;\r
+ case Qt::Key_F22:\r
+ return VK_F22;\r
+ case Qt::Key_F23:\r
+ return VK_F23;\r
+ case Qt::Key_F24:\r
+ return VK_F24;\r
+ case Qt::Key_Space:\r
+ return VK_SPACE;\r
+ case Qt::Key_Asterisk:\r
+ return VK_MULTIPLY;\r
+ case Qt::Key_Plus:\r
+ return VK_ADD;\r
+ case Qt::Key_Comma:\r
+ return VK_SEPARATOR;\r
+ case Qt::Key_Minus:\r
+ return VK_SUBTRACT;\r
+ case Qt::Key_Slash:\r
+ return VK_DIVIDE;\r
+\r
+ // numbers\r
+ case Qt::Key_0:\r
+ case Qt::Key_1:\r
+ case Qt::Key_2:\r
+ case Qt::Key_3:\r
+ case Qt::Key_4:\r
+ case Qt::Key_5:\r
+ case Qt::Key_6:\r
+ case Qt::Key_7:\r
+ case Qt::Key_8:\r
+ case Qt::Key_9:\r
+ return key;\r
+\r
+ // letters\r
+ case Qt::Key_A:\r
+ case Qt::Key_B:\r
+ case Qt::Key_C:\r
+ case Qt::Key_D:\r
+ case Qt::Key_E:\r
+ case Qt::Key_F:\r
+ case Qt::Key_G:\r
+ case Qt::Key_H:\r
+ case Qt::Key_I:\r
+ case Qt::Key_J:\r
+ case Qt::Key_K:\r
+ case Qt::Key_L:\r
+ case Qt::Key_M:\r
+ case Qt::Key_N:\r
+ case Qt::Key_O:\r
+ case Qt::Key_P:\r
+ case Qt::Key_Q:\r
+ case Qt::Key_R:\r
+ case Qt::Key_S:\r
+ case Qt::Key_T:\r
+ case Qt::Key_U:\r
+ case Qt::Key_V:\r
+ case Qt::Key_W:\r
+ case Qt::Key_X:\r
+ case Qt::Key_Y:\r
+ case Qt::Key_Z:\r
+ return key;\r
+\r
+ default:\r
+ return 0;\r
+ }\r
+}\r
+\r
+bool QxtApplicationPrivate::registerHotKey(uint modifiers, uint keycode, QWidget* receiver)\r
+{\r
+ Q_ASSERT(receiver);\r
+ return RegisterHotKey(receiver->winId(), modifiers ^ keycode, modifiers, keycode);\r
+}\r
+\r
+bool QxtApplicationPrivate::unregisterHotKey(uint modifiers, uint keycode, QWidget* receiver)\r
+{\r
+ Q_ASSERT(receiver);\r
+ return UnregisterHotKey(receiver->winId(), modifiers ^ keycode);\r
+}\r