131 lines
3.6 KiB
C
131 lines
3.6 KiB
C
#pragma once
|
|
// platform.h — GUI windowing, input, and system services
|
|
//
|
|
// Provides window creation, keyboard/mouse input, clipboard access,
|
|
// and process spawning. Implementation: platform_win32.c.
|
|
|
|
#include "base/base_core.h"
|
|
#include "base/base_math.h"
|
|
|
|
////////////////////////////////
|
|
// Key codes (matching Windows VK codes)
|
|
|
|
enum {
|
|
PKEY_BACKSPACE = 0x08,
|
|
PKEY_TAB = 0x09,
|
|
PKEY_RETURN = 0x0D,
|
|
PKEY_ESCAPE = 0x1B,
|
|
PKEY_PAGEUP = 0x21,
|
|
PKEY_PAGEDOWN = 0x22,
|
|
PKEY_END = 0x23,
|
|
PKEY_HOME = 0x24,
|
|
PKEY_LEFT = 0x25,
|
|
PKEY_UP = 0x26,
|
|
PKEY_RIGHT = 0x27,
|
|
PKEY_DOWN = 0x28,
|
|
PKEY_DELETE = 0x2E,
|
|
PKEY_0 = 0x30,
|
|
PKEY_1 = 0x31,
|
|
PKEY_2 = 0x32,
|
|
PKEY_3 = 0x33,
|
|
PKEY_A = 0x41,
|
|
PKEY_B = 0x42,
|
|
PKEY_C = 0x43,
|
|
PKEY_E = 0x45,
|
|
PKEY_F = 0x46,
|
|
PKEY_G = 0x47,
|
|
PKEY_H = 0x48,
|
|
PKEY_J = 0x4A,
|
|
PKEY_K = 0x4B,
|
|
PKEY_L = 0x4C,
|
|
PKEY_N = 0x4E,
|
|
PKEY_O = 0x4F,
|
|
PKEY_P = 0x50,
|
|
PKEY_Q = 0x51,
|
|
PKEY_S = 0x53,
|
|
PKEY_V = 0x56,
|
|
PKEY_W = 0x57,
|
|
PKEY_X = 0x58,
|
|
PKEY_Y = 0x59,
|
|
PKEY_Z = 0x5A,
|
|
PKEY_F4 = 0x73,
|
|
PKEY_F8 = 0x77,
|
|
PKEY_EQUAL = 0xBB,
|
|
PKEY_MINUS = 0xBD,
|
|
PKEY_BACKSLASH = 0xDC,
|
|
};
|
|
|
|
////////////////////////////////
|
|
// Input accumulated per frame
|
|
|
|
#define PLATFORM_MAX_CHARS_PER_FRAME 64
|
|
#define PLATFORM_MAX_KEYS_PER_FRAME 32
|
|
|
|
// Editor-facing input (ASCII chars + key codes + modifiers)
|
|
typedef struct PlatformInput {
|
|
char chars[PLATFORM_MAX_CHARS_PER_FRAME];
|
|
S32 char_count;
|
|
|
|
U8 keys[PLATFORM_MAX_KEYS_PER_FRAME];
|
|
S32 key_count;
|
|
|
|
B32 ctrl_held;
|
|
B32 shift_held;
|
|
B32 alt_held;
|
|
} PlatformInput;
|
|
|
|
// Raw windowing input (UTF-16 chars + VK codes + mouse)
|
|
typedef struct PlatformRawInput {
|
|
U16 chars[PLATFORM_MAX_CHARS_PER_FRAME];
|
|
S32 char_count;
|
|
U8 keys[PLATFORM_MAX_KEYS_PER_FRAME];
|
|
S32 key_count;
|
|
B32 ctrl_held;
|
|
B32 shift_held;
|
|
Vec2F32 mouse_pos;
|
|
Vec2F32 scroll_delta;
|
|
B32 mouse_down;
|
|
B32 was_mouse_down;
|
|
} PlatformRawInput;
|
|
|
|
////////////////////////////////
|
|
// Window
|
|
|
|
typedef struct PlatformWindow PlatformWindow;
|
|
|
|
typedef struct PlatformWindowDesc {
|
|
const char *title;
|
|
S32 width;
|
|
S32 height;
|
|
} PlatformWindowDesc;
|
|
|
|
typedef void (*PlatformFrameCallback)(void *user_data);
|
|
|
|
////////////////////////////////
|
|
// Window API
|
|
|
|
PlatformWindow *platform_create_window(PlatformWindowDesc *desc);
|
|
void platform_destroy_window(PlatformWindow *window);
|
|
B32 platform_poll_events(PlatformWindow *window);
|
|
void platform_get_size(PlatformWindow *window, S32 *w, S32 *h);
|
|
void *platform_get_native_handle(PlatformWindow *window);
|
|
PlatformRawInput platform_get_input(PlatformWindow *window);
|
|
void platform_set_frame_callback(PlatformWindow *window, PlatformFrameCallback cb, void *user_data);
|
|
F32 platform_get_dpi_scale(PlatformWindow *window);
|
|
|
|
////////////////////////////////
|
|
// Input adapter — convert raw windowing input to editor input
|
|
|
|
PlatformInput platform_adapt_input(PlatformRawInput *raw);
|
|
|
|
////////////////////////////////
|
|
// Clipboard
|
|
|
|
void platform_clipboard_set(const char *text);
|
|
const char *platform_clipboard_get(void);
|
|
|
|
////////////////////////////////
|
|
// Process spawning
|
|
|
|
void platform_spawn_terminal(const char *command, const char *working_dir);
|