Extract UI state and Win32 window shell
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
#include "pch.h"
|
||||
|
||||
#include "platform_windows/windows_bootstrap_helpers.h"
|
||||
#include "platform_windows/windows_window_shell.h"
|
||||
|
||||
#include "app.h"
|
||||
#include "legacy_gl_runtime_dispatch.h"
|
||||
@@ -15,8 +16,6 @@
|
||||
#define USE_RENDERDOC
|
||||
#endif
|
||||
|
||||
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);
|
||||
|
||||
namespace pp::platform::windows {
|
||||
void set_async_render_context(HDC hdc, HGLRC hrc);
|
||||
}
|
||||
@@ -113,7 +112,7 @@ MainWindowStartupState initialize_main_window_startup_state()
|
||||
const auto className = L"EngineMain";
|
||||
|
||||
startup.window_class.hInstance = hInst;
|
||||
startup.window_class.lpfnWndProc = (WNDPROC)WndProc;
|
||||
startup.window_class.lpfnWndProc = (WNDPROC)main_window_proc;
|
||||
startup.window_class.lpszClassName = className;
|
||||
startup.window_class.hbrBackground = (HBRUSH)COLOR_WINDOW;
|
||||
startup.window_class.hCursor = LoadCursor(NULL, IDC_ARROW);
|
||||
|
||||
247
src/platform_windows/windows_window_shell.cpp
Normal file
247
src/platform_windows/windows_window_shell.cpp
Normal file
@@ -0,0 +1,247 @@
|
||||
#include "pch.h"
|
||||
|
||||
#include "platform_windows/windows_window_shell.h"
|
||||
|
||||
#include "app.h"
|
||||
#include "platform_windows/windows_lifecycle_shell.h"
|
||||
#include "platform_windows/windows_platform_services.h"
|
||||
#include "platform_windows/windows_stylus_input.h"
|
||||
#include "keymap.h"
|
||||
#include "wacom.h"
|
||||
|
||||
void destroy_window();
|
||||
|
||||
namespace pp::platform::windows {
|
||||
|
||||
RetainedState& retained_state()
|
||||
{
|
||||
static RetainedState state;
|
||||
return state;
|
||||
}
|
||||
|
||||
LRESULT CALLBACK main_window_proc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
|
||||
{
|
||||
auto& state = retained_state();
|
||||
static glm::vec2 lastPoint;
|
||||
|
||||
auto extra = GetMessageExtraInfo();
|
||||
|
||||
switch (msg)
|
||||
{
|
||||
case kUserCloseMessage:
|
||||
handle_window_close_message(state.vr);
|
||||
return 0;
|
||||
case WM_PAINT:
|
||||
App::I->redraw = true;
|
||||
break;
|
||||
case WM_CREATE:
|
||||
BT_SetTerminate();
|
||||
break;
|
||||
case WM_CLOSE:
|
||||
{
|
||||
App::I->ui_task_async([] {
|
||||
if (App::I->request_close())
|
||||
{
|
||||
destroy_window();
|
||||
}
|
||||
});
|
||||
return 1;
|
||||
break;
|
||||
}
|
||||
case WM_SIZE:
|
||||
{
|
||||
auto w = (float)LOWORD(lp);
|
||||
auto h = (float)HIWORD(lp);
|
||||
if (h != 0 && lifecycle_is_running())
|
||||
{
|
||||
App::I->ui_task_async([=]
|
||||
{
|
||||
App::I->resize(w, h);
|
||||
App::I->redraw = true;
|
||||
}, true);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case WM_ACTIVATE:
|
||||
{
|
||||
platform_services().set_cursor_visible(true);
|
||||
App::I->ui_task_async([&state, wp, lp] {
|
||||
int active = GET_WM_ACTIVATE_STATE(wp, lp);
|
||||
WacomTablet::I.set_focus(active);
|
||||
static BYTE keys[256];
|
||||
if (GetKeyboardState(keys))
|
||||
{
|
||||
bool alt = keys[VK_MENU] & 0x80;
|
||||
for (auto k : state.vkey_map)
|
||||
{
|
||||
if (alt && k.first == kKey::KeyTab)
|
||||
continue;
|
||||
bool down = keys[k.second] & 0x80;
|
||||
if (App::I->keys[(int)k.first] && !down)
|
||||
App::I->key_up(k.first);
|
||||
else if (!App::I->keys[(int)k.first] && down)
|
||||
App::I->key_down(k.first);
|
||||
}
|
||||
}
|
||||
});
|
||||
break;
|
||||
}
|
||||
case WT_PACKET:
|
||||
{
|
||||
note_wintab_packet();
|
||||
App::I->ui_task_async([=] {
|
||||
WacomTablet::I.handle_message(hWnd, msg, wp, lp);
|
||||
});
|
||||
break;
|
||||
}
|
||||
case WM_SYSKEYDOWN:
|
||||
case WM_KEYDOWN:
|
||||
if ((lp >> 30 & 1) == 0 &&
|
||||
!(wp == VK_TAB && App::I->keys[(int)kKey::KeyAlt]))
|
||||
{
|
||||
App::I->ui_task_async([wp] {
|
||||
App::I->key_down(convert_key((int)wp));
|
||||
});
|
||||
}
|
||||
break;
|
||||
case WM_SYSKEYUP:
|
||||
case WM_KEYUP:
|
||||
if (!(wp == VK_TAB && App::I->keys[(int)kKey::KeyAlt]))
|
||||
{
|
||||
App::I->ui_task_async([wp] {
|
||||
App::I->key_up(convert_key((int)wp));
|
||||
});
|
||||
}
|
||||
break;
|
||||
case WM_CHAR:
|
||||
App::I->ui_task_async([wp] {
|
||||
App::I->key_char((int)wp);
|
||||
});
|
||||
break;
|
||||
case WM_MOUSEMOVE:
|
||||
lastPoint = { GET_X_LPARAM(lp), GET_Y_LPARAM(lp) };
|
||||
{
|
||||
auto pt = lastPoint;
|
||||
App::I->ui_task_async([pt, extra, p = WacomTablet::I.get_pressure()] {
|
||||
kEventSource pointer_source;
|
||||
if (WacomTablet::I.m_ink_pen || WacomTablet::I.m_ink_touch)
|
||||
{
|
||||
pointer_source = WacomTablet::I.m_ink_pen ? kEventSource::Stylus : kEventSource::Touch;
|
||||
}
|
||||
else
|
||||
{
|
||||
pointer_source = WacomTablet::I.m_stylus ? kEventSource::Stylus : kEventSource::Mouse;
|
||||
if ((extra & 0xFFFFFF00) == 0xFF515700)
|
||||
pointer_source = kEventSource::Touch;
|
||||
}
|
||||
App::I->mouse_move((float)pt.x, (float)pt.y, p, pointer_source, WacomTablet::I.m_eraser);
|
||||
});
|
||||
}
|
||||
break;
|
||||
case WM_LBUTTONDOWN:
|
||||
{
|
||||
SetCapture(hWnd);
|
||||
auto pt = lastPoint;
|
||||
App::I->ui_task_async([pt, extra, hWnd, p = WacomTablet::I.get_pressure()] {
|
||||
kEventSource pointer_source;
|
||||
if (WacomTablet::I.m_ink_pen || WacomTablet::I.m_ink_touch)
|
||||
{
|
||||
pointer_source = WacomTablet::I.m_ink_pen ? kEventSource::Stylus : kEventSource::Touch;
|
||||
}
|
||||
else
|
||||
{
|
||||
pointer_source = WacomTablet::I.m_stylus ? kEventSource::Stylus : kEventSource::Mouse;
|
||||
if ((extra & 0xFFFFFF00) == 0xFF515700)
|
||||
pointer_source = kEventSource::Touch;
|
||||
}
|
||||
App::I->mouse_down(0, (float)pt.x, (float)pt.y, p, pointer_source, WacomTablet::I.m_eraser);
|
||||
});
|
||||
}
|
||||
break;
|
||||
case WM_LBUTTONUP:
|
||||
{
|
||||
ReleaseCapture();
|
||||
auto pt = lastPoint;
|
||||
App::I->ui_task_async([pt, extra] {
|
||||
WacomTablet::I.reset_pressure();
|
||||
kEventSource pointer_source;
|
||||
if (WacomTablet::I.m_ink_pen || WacomTablet::I.m_ink_touch)
|
||||
{
|
||||
pointer_source = WacomTablet::I.m_ink_pen ? kEventSource::Stylus : kEventSource::Touch;
|
||||
}
|
||||
else
|
||||
{
|
||||
pointer_source = WacomTablet::I.m_stylus ? kEventSource::Stylus : kEventSource::Mouse;
|
||||
if ((extra & 0xFFFFFF00) == 0xFF515700)
|
||||
pointer_source = kEventSource::Touch;
|
||||
}
|
||||
App::I->mouse_up(0, (float)pt.x, (float)pt.y, pointer_source, WacomTablet::I.m_eraser);
|
||||
});
|
||||
}
|
||||
break;
|
||||
case WM_RBUTTONDOWN:
|
||||
{
|
||||
SetCapture(hWnd);
|
||||
auto pt = lastPoint;
|
||||
App::I->ui_task_async([pt, extra, hWnd] {
|
||||
kEventSource pointer_source;
|
||||
if (WacomTablet::I.m_ink_pen || WacomTablet::I.m_ink_touch)
|
||||
{
|
||||
pointer_source = WacomTablet::I.m_ink_pen ? kEventSource::Stylus : kEventSource::Touch;
|
||||
}
|
||||
else
|
||||
{
|
||||
pointer_source = WacomTablet::I.m_stylus ? kEventSource::Stylus : kEventSource::Mouse;
|
||||
if ((extra & 0xFFFFFF00) == 0xFF515700)
|
||||
pointer_source = kEventSource::Touch;
|
||||
}
|
||||
App::I->mouse_down(1, (float)pt.x, (float)pt.y, 1.f, pointer_source, 0);
|
||||
});
|
||||
}
|
||||
break;
|
||||
case WM_RBUTTONUP:
|
||||
{
|
||||
ReleaseCapture();
|
||||
auto pt = lastPoint;
|
||||
App::I->ui_task_async([pt, extra] {
|
||||
kEventSource pointer_source;
|
||||
if (WacomTablet::I.m_ink_pen || WacomTablet::I.m_ink_touch)
|
||||
{
|
||||
pointer_source = WacomTablet::I.m_ink_pen ? kEventSource::Stylus : kEventSource::Touch;
|
||||
}
|
||||
else
|
||||
{
|
||||
pointer_source = WacomTablet::I.m_stylus ? kEventSource::Stylus : kEventSource::Mouse;
|
||||
if ((extra & 0xFFFFFF00) == 0xFF515700)
|
||||
pointer_source = kEventSource::Touch;
|
||||
}
|
||||
App::I->mouse_up(1, (float)pt.x, (float)pt.y, pointer_source, 0);
|
||||
});
|
||||
}
|
||||
break;
|
||||
case WM_MOUSEWHEEL:
|
||||
{
|
||||
POINT pt;
|
||||
pt.x = GET_X_LPARAM(lp);
|
||||
pt.y = GET_Y_LPARAM(lp);
|
||||
ScreenToClient(hWnd, &pt);
|
||||
App::I->ui_task_async([pt, wp] {
|
||||
App::I->mouse_scroll((float)pt.x, (float)pt.y,
|
||||
(float)GET_WHEEL_DELTA_WPARAM(wp) / (float)WHEEL_DELTA);
|
||||
});
|
||||
break;
|
||||
}
|
||||
case WM_POINTERUPDATE:
|
||||
{
|
||||
handle_pointer_update_message(wp);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (wp == SC_KEYMENU && (lp >> 16) <= 0)
|
||||
return 0;
|
||||
|
||||
return DefWindowProc(hWnd, msg, wp, lp);
|
||||
}
|
||||
|
||||
}
|
||||
25
src/platform_windows/windows_window_shell.h
Normal file
25
src/platform_windows/windows_window_shell.h
Normal file
@@ -0,0 +1,25 @@
|
||||
#pragma once
|
||||
|
||||
#include <Windows.h>
|
||||
#include <map>
|
||||
|
||||
#include "event.h"
|
||||
#include "platform_windows/windows_vr_shell.h"
|
||||
|
||||
struct RetainedState
|
||||
{
|
||||
HINSTANCE hInst{};
|
||||
HWND hWnd{};
|
||||
bool keys[256]{};
|
||||
std::map<kKey, int> vkey_map;
|
||||
wchar_t window_title[512]{};
|
||||
bool sandboxed = false;
|
||||
pp::platform::windows::VrShellState vr;
|
||||
};
|
||||
|
||||
namespace pp::platform::windows {
|
||||
|
||||
RetainedState& retained_state();
|
||||
LRESULT CALLBACK main_window_proc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user