glfw/src/win32_input.c

129 lines
4.5 KiB
C
Raw Normal View History

2010-09-07 15:34:51 +00:00
//========================================================================
// GLFW - An OpenGL library
2010-09-07 15:34:51 +00:00
// Platform: Win32/WGL
2010-09-07 15:41:26 +00:00
// API version: 3.0
2010-09-07 15:34:51 +00:00
// WWW: http://www.glfw.org/
//------------------------------------------------------------------------
// Copyright (c) 2002-2006 Marcus Geelnard
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would
// be appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such, and must not
// be misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source
// distribution.
//
//========================================================================
#include "internal.h"
//========================================================================
// Low level keyboard hook (system callback) function
// Used to disable system keys under Windows NT
//========================================================================
2010-09-10 20:03:36 +00:00
static LRESULT CALLBACK keyboardHook(int nCode, WPARAM wParam, LPARAM lParam)
2010-09-07 15:34:51 +00:00
{
BOOL syskeys = FALSE;
PKBDLLHOOKSTRUCT p;
// We are only looking for keyboard events - interpret lParam as a
// pointer to a KBDLLHOOKSTRUCT
p = (PKBDLLHOOKSTRUCT) lParam;
2010-09-10 20:03:36 +00:00
if (nCode == HC_ACTION)
2010-09-07 15:34:51 +00:00
{
// We have a keyboard event
2010-09-10 20:03:36 +00:00
switch (wParam)
2010-09-07 15:34:51 +00:00
{
case WM_KEYDOWN:
case WM_SYSKEYDOWN:
case WM_KEYUP:
case WM_SYSKEYUP:
// Detect: ALT+TAB, ALT+ESC, ALT+F4, CTRL+ESC,
// LWIN, RWIN, APPS (mysterious menu key)
2010-09-10 20:03:36 +00:00
syskeys = (p->vkCode == VK_TAB &&
p->flags & LLKHF_ALTDOWN) ||
(p->vkCode == VK_ESCAPE &&
p->flags & LLKHF_ALTDOWN) ||
(p->vkCode == VK_F4 &&
p->flags & LLKHF_ALTDOWN) ||
(p->vkCode == VK_ESCAPE &&
(GetKeyState(VK_CONTROL) & 0x8000)) ||
2010-09-07 15:34:51 +00:00
p->vkCode == VK_LWIN ||
p->vkCode == VK_RWIN ||
p->vkCode == VK_APPS;
break;
default:
break;
}
}
// Was it a system key combination (e.g. ALT+TAB)?
2010-09-10 20:03:36 +00:00
if (syskeys)
2010-09-07 15:34:51 +00:00
{
2010-09-12 14:26:00 +00:00
_GLFWwindow* window = _glfwLibrary.activeWindow;
2010-09-07 15:34:51 +00:00
// Pass the key event to our window message loop
2010-09-12 14:26:00 +00:00
if (window)
PostMessage(window->Win32.handle, (UINT) wParam, p->vkCode, 0);
2010-09-07 15:34:51 +00:00
// We've taken care of it - don't let the system know about this
// key event
return 1;
}
else
{
// It's a harmless key press, let the system deal with it
2010-09-12 14:26:00 +00:00
return CallNextHookEx(_glfwLibrary.Win32.keyboardHook, nCode, wParam, lParam);
2010-09-07 15:34:51 +00:00
}
}
2010-09-10 20:03:36 +00:00
//////////////////////////////////////////////////////////////////////////
////// GLFW platform API //////
//////////////////////////////////////////////////////////////////////////
2010-09-07 15:34:51 +00:00
//========================================================================
// Enable system keys
//========================================================================
2010-09-12 23:23:22 +00:00
void _glfwPlatformEnableSystemKeys(_GLFWwindow* window)
2010-09-07 15:34:51 +00:00
{
2010-09-12 14:26:00 +00:00
if (_glfwLibrary.Win32.keyboardHook != NULL)
2010-09-07 15:34:51 +00:00
{
2010-09-12 14:26:00 +00:00
UnhookWindowsHookEx(_glfwLibrary.Win32.keyboardHook);
_glfwLibrary.Win32.keyboardHook = NULL;
2010-09-07 15:34:51 +00:00
}
}
2010-09-10 20:03:36 +00:00
2010-09-07 15:34:51 +00:00
//========================================================================
// Disable system keys
//========================================================================
2010-09-12 23:23:22 +00:00
void _glfwPlatformDisableSystemKeys(_GLFWwindow* window)
2010-09-07 15:34:51 +00:00
{
2010-09-12 14:26:00 +00:00
_glfwLibrary.Win32.keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL,
keyboardHook,
_glfwLibrary.Win32.instance,
0);
2010-09-07 15:34:51 +00:00
}