|
|
|
@ -68,12 +68,8 @@ static void showCursor(_GLFWwindow* window) |
|
|
|
|
{ |
|
|
|
|
UNREFERENCED_PARAMETER(window); |
|
|
|
|
|
|
|
|
|
// Un-capture cursor
|
|
|
|
|
ReleaseCapture(); |
|
|
|
|
|
|
|
|
|
// Release the cursor from the window
|
|
|
|
|
ClipCursor(NULL); |
|
|
|
|
|
|
|
|
|
ShowCursor(TRUE); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -85,10 +81,9 @@ static int translateKey(WPARAM wParam, LPARAM lParam) |
|
|
|
|
DWORD msg_time; |
|
|
|
|
DWORD scan_code; |
|
|
|
|
|
|
|
|
|
// Check for numeric keypad keys.
|
|
|
|
|
// Note: This way we always force "NumLock = ON", which is intentional
|
|
|
|
|
// since the returned key code should correspond to a physical
|
|
|
|
|
// location.
|
|
|
|
|
// Check for numeric keypad keys
|
|
|
|
|
// NOTE: This way we always force "NumLock = ON", which is intentional since
|
|
|
|
|
// the returned key code should correspond to a physical location.
|
|
|
|
|
int hiFlags = HIWORD(lParam); |
|
|
|
|
if (!(hiFlags & 0x100)) |
|
|
|
|
{ |
|
|
|
@ -506,11 +501,8 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg, |
|
|
|
|
|
|
|
|
|
case WM_MOUSEMOVE: |
|
|
|
|
{ |
|
|
|
|
int newCursorX, newCursorY; |
|
|
|
|
|
|
|
|
|
// Get signed (!) cursor position
|
|
|
|
|
newCursorX = GET_X_LPARAM(lParam); |
|
|
|
|
newCursorY = GET_Y_LPARAM(lParam); |
|
|
|
|
const int newCursorX = GET_X_LPARAM(lParam); |
|
|
|
|
const int newCursorY = GET_Y_LPARAM(lParam); |
|
|
|
|
|
|
|
|
|
if (newCursorX != window->win32.oldCursorX || |
|
|
|
|
newCursorY != window->win32.oldCursorY) |
|
|
|
@ -592,20 +584,12 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg, |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Was the window contents damaged?
|
|
|
|
|
case WM_PAINT: |
|
|
|
|
{ |
|
|
|
|
_glfwInputWindowDamage(window); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
case WM_DISPLAYCHANGE: |
|
|
|
|
{ |
|
|
|
|
// TODO: Do stuff here.
|
|
|
|
|
|
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
case WM_DEVICECHANGE: |
|
|
|
|
{ |
|
|
|
|
if (DBT_DEVNODES_CHANGED == wParam) |
|
|
|
@ -617,7 +601,6 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg, |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Pass all unhandled messages to DefWindowProc
|
|
|
|
|
return DefWindowProc(hWnd, uMsg, wParam, lParam); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -627,20 +610,14 @@ static void getFullWindowSize(_GLFWwindow* window, |
|
|
|
|
int clientWidth, int clientHeight, |
|
|
|
|
int* fullWidth, int* fullHeight) |
|
|
|
|
{ |
|
|
|
|
RECT rect; |
|
|
|
|
|
|
|
|
|
// Create a window rectangle
|
|
|
|
|
rect.left = (long) 0; |
|
|
|
|
rect.right = (long) clientWidth - 1; |
|
|
|
|
rect.top = (long) 0; |
|
|
|
|
rect.bottom = (long) clientHeight - 1; |
|
|
|
|
RECT rect = { 0, 0, clientWidth, clientHeight }; |
|
|
|
|
|
|
|
|
|
// Adjust according to window styles
|
|
|
|
|
AdjustWindowRectEx(&rect, window->win32.dwStyle, FALSE, window->win32.dwExStyle); |
|
|
|
|
|
|
|
|
|
// Calculate width and height of full window
|
|
|
|
|
*fullWidth = rect.right - rect.left + 1; |
|
|
|
|
*fullHeight = rect.bottom - rect.top + 1; |
|
|
|
|
*fullWidth = rect.right - rect.left; |
|
|
|
|
*fullHeight = rect.bottom - rect.top; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Registers the GLFW window class
|
|
|
|
@ -665,7 +642,7 @@ static ATOM registerWindowClass(void) |
|
|
|
|
wc.hIcon = LoadIcon(GetModuleHandle(NULL), L"GLFW_ICON"); |
|
|
|
|
if (!wc.hIcon) |
|
|
|
|
{ |
|
|
|
|
// Load default icon
|
|
|
|
|
// User-provided icon not found; load default icon
|
|
|
|
|
wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -704,8 +681,7 @@ static int createWindow(_GLFWwindow* window, |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
window->win32.dwStyle |= WS_OVERLAPPED | WS_CAPTION | |
|
|
|
|
WS_SYSMENU | WS_MINIMIZEBOX; |
|
|
|
|
window->win32.dwStyle |= WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX; |
|
|
|
|
|
|
|
|
|
if (wndconfig->resizable) |
|
|
|
|
{ |
|
|
|
@ -738,7 +714,7 @@ static int createWindow(_GLFWwindow* window, |
|
|
|
|
NULL, // No parent window
|
|
|
|
|
NULL, // No window menu
|
|
|
|
|
GetModuleHandle(NULL), |
|
|
|
|
window); // Pass GLFW window to WM_CREATE
|
|
|
|
|
window); // Pass GLFW window to WM_CREATE
|
|
|
|
|
|
|
|
|
|
free(wideTitle); |
|
|
|
|
|
|
|
|
@ -766,11 +742,6 @@ static void destroyWindow(_GLFWwindow* window) |
|
|
|
|
{ |
|
|
|
|
_glfwDestroyContext(window); |
|
|
|
|
|
|
|
|
|
// This is duplicated from glfwDestroyWindow
|
|
|
|
|
// TODO: Stop duplicating code
|
|
|
|
|
if (window == _glfw.focusedWindow) |
|
|
|
|
_glfw.focusedWindow = NULL; |
|
|
|
|
|
|
|
|
|
if (window->win32.handle) |
|
|
|
|
{ |
|
|
|
|
DestroyWindow(window->win32.handle); |
|
|
|
@ -980,11 +951,6 @@ void _glfwPlatformPollEvents(void) |
|
|
|
|
window->win32.oldCursorX = width / 2; |
|
|
|
|
window->win32.oldCursorY = height / 2; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
//window->win32.oldCursorX = window->cursorPosX;
|
|
|
|
|
//window->win32.oldCursorY = window->cursorPosY;
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) |
|
|
|
|
{ |
|
|
|
@ -1006,31 +972,29 @@ void _glfwPlatformPollEvents(void) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// LSHIFT/RSHIFT fixup (keys tend to "stick" without this fix)
|
|
|
|
|
// This is the only async event handling in GLFW, but it solves some
|
|
|
|
|
// nasty problems.
|
|
|
|
|
window = _glfw.focusedWindow; |
|
|
|
|
if (window) |
|
|
|
|
{ |
|
|
|
|
int lshift_down, rshift_down; |
|
|
|
|
// LSHIFT/RSHIFT fixup (keys tend to "stick" without this fix)
|
|
|
|
|
// This is the only async event handling in GLFW, but it solves some
|
|
|
|
|
// nasty problems
|
|
|
|
|
{ |
|
|
|
|
int lshift_down, rshift_down; |
|
|
|
|
|
|
|
|
|
// Get current state of left and right shift keys
|
|
|
|
|
lshift_down = (GetAsyncKeyState(VK_LSHIFT) >> 15) & 1; |
|
|
|
|
rshift_down = (GetAsyncKeyState(VK_RSHIFT) >> 15) & 1; |
|
|
|
|
// Get current state of left and right shift keys
|
|
|
|
|
lshift_down = (GetAsyncKeyState(VK_LSHIFT) >> 15) & 1; |
|
|
|
|
rshift_down = (GetAsyncKeyState(VK_RSHIFT) >> 15) & 1; |
|
|
|
|
|
|
|
|
|
// See if this differs from our belief of what has happened
|
|
|
|
|
// (we only have to check for lost key up events)
|
|
|
|
|
if (!lshift_down && window->key[GLFW_KEY_LEFT_SHIFT] == 1) |
|
|
|
|
_glfwInputKey(window, GLFW_KEY_LEFT_SHIFT, GLFW_RELEASE); |
|
|
|
|
// See if this differs from our belief of what has happened
|
|
|
|
|
// (we only have to check for lost key up events)
|
|
|
|
|
if (!lshift_down && window->key[GLFW_KEY_LEFT_SHIFT] == 1) |
|
|
|
|
_glfwInputKey(window, GLFW_KEY_LEFT_SHIFT, GLFW_RELEASE); |
|
|
|
|
|
|
|
|
|
if (!rshift_down && window->key[GLFW_KEY_RIGHT_SHIFT] == 1) |
|
|
|
|
_glfwInputKey(window, GLFW_KEY_RIGHT_SHIFT, GLFW_RELEASE); |
|
|
|
|
} |
|
|
|
|
if (!rshift_down && window->key[GLFW_KEY_RIGHT_SHIFT] == 1) |
|
|
|
|
_glfwInputKey(window, GLFW_KEY_RIGHT_SHIFT, GLFW_RELEASE); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Did the cursor move in an focused window that has captured the cursor
|
|
|
|
|
window = _glfw.focusedWindow; |
|
|
|
|
if (window) |
|
|
|
|
{ |
|
|
|
|
// Did the cursor move in an focused window that has captured the cursor
|
|
|
|
|
if (window->cursorMode == GLFW_CURSOR_CAPTURED && |
|
|
|
|
!window->win32.cursorCentered) |
|
|
|
|
{ |
|
|
|
@ -1049,15 +1013,10 @@ void _glfwPlatformWaitEvents(void) |
|
|
|
|
_glfwPlatformPollEvents(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void _glfwPlatformSetCursorPos(_GLFWwindow* window, int x, int y) |
|
|
|
|
void _glfwPlatformSetCursorPos(_GLFWwindow* window, int xpos, int ypos) |
|
|
|
|
{ |
|
|
|
|
POINT pos; |
|
|
|
|
|
|
|
|
|
// Convert client coordinates to screen coordinates
|
|
|
|
|
pos.x = x; |
|
|
|
|
pos.y = y; |
|
|
|
|
POINT pos = { xpos, ypos }; |
|
|
|
|
ClientToScreen(window->win32.handle, &pos); |
|
|
|
|
|
|
|
|
|
SetCursorPos(pos.x, pos.y); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|