mirror of
https://github.com/italicsjenga/portability.git
synced 2024-12-02 03:41:31 +11:00
117 lines
2.5 KiB
C++
117 lines
2.5 KiB
C++
|
|
#include <stdio.h>
|
|
|
|
#include "window.hpp"
|
|
|
|
#if defined(_WIN32)
|
|
const char *CLASS_NAME = "PortabilityClass";
|
|
|
|
auto WINAPI window_func(HWND hwnd, UINT u_msg, WPARAM w_param, LPARAM l_param) -> LRESULT {
|
|
if (u_msg == WM_CLOSE) {
|
|
PostQuitMessage(0);
|
|
}
|
|
return DefWindowProc(hwnd, u_msg, w_param, l_param);
|
|
}
|
|
|
|
auto register_class(HINSTANCE hinstance) -> bool {
|
|
WNDCLASS wclass = {0};
|
|
|
|
wclass.style = CS_HREDRAW | CS_VREDRAW;
|
|
wclass.lpszClassName = CLASS_NAME;
|
|
wclass.hInstance = hinstance;
|
|
wclass.lpfnWndProc = window_func;
|
|
wclass.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
|
|
if(!RegisterClass(&wclass)) {
|
|
printf("Couldn't register window class");
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
auto new_window(Config config) -> Window {
|
|
auto hinstance = GetModuleHandle(0);
|
|
register_class(hinstance);
|
|
|
|
RECT rect;
|
|
|
|
rect.left = config.x; rect.right = config.x + config.width;
|
|
rect.top = config.y; rect.bottom = config.y + config.height;
|
|
|
|
AdjustWindowRectEx(&rect, 0, false, 0);
|
|
|
|
auto hwnd = ::CreateWindow(
|
|
CLASS_NAME,
|
|
"GfxPortability",
|
|
WS_THICKFRAME | WS_SYSMENU,
|
|
rect.left,
|
|
rect.top,
|
|
rect.right-rect.left,
|
|
rect.bottom-rect.top,
|
|
NULL,
|
|
NULL,
|
|
::GetModuleHandle(0),
|
|
NULL
|
|
);
|
|
|
|
if(!hwnd) {
|
|
printf("Couldn't create window! error: %d", ::GetLastError());
|
|
}
|
|
|
|
::ShowWindow(hwnd, SW_SHOWDEFAULT);
|
|
::UpdateWindow(hwnd);
|
|
|
|
Window window = { hinstance, hwnd };
|
|
return window;
|
|
}
|
|
|
|
auto poll_events() -> bool {
|
|
MSG msg;
|
|
while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
|
|
if (msg.message == WM_QUIT) {
|
|
return false;
|
|
}
|
|
TranslateMessage(&msg);
|
|
DispatchMessage(&msg);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
#else
|
|
auto new_window(Config config) -> Window {
|
|
auto connection = xcb_connect(NULL, NULL);
|
|
|
|
auto setup = xcb_get_setup(connection);
|
|
auto screen_iterator = xcb_setup_roots_iterator(setup);
|
|
auto screen = screen_iterator.data;
|
|
|
|
auto hwnd = xcb_generate_id(connection);
|
|
xcb_create_window(
|
|
connection,
|
|
XCB_COPY_FROM_PARENT,
|
|
hwnd,
|
|
screen->root,
|
|
config.x,
|
|
config.y,
|
|
config.width,
|
|
config.height,
|
|
0,
|
|
XCB_WINDOW_CLASS_INPUT_OUTPUT,
|
|
screen->root_visual,
|
|
0,
|
|
NULL);
|
|
|
|
xcb_map_window(connection, hwnd);
|
|
xcb_flush(connection);
|
|
|
|
Window window = Window { connection, hwnd };
|
|
return window;
|
|
}
|
|
|
|
auto poll_events() -> bool {
|
|
return true;
|
|
}
|
|
|
|
#endif
|