134 lines
4.5 KiB
C
134 lines
4.5 KiB
C
#pragma once
|
|
|
|
#include "base/base_core.h"
|
|
#include "base/base_math.h"
|
|
|
|
////////////////////////////////
|
|
// Input — accumulated per frame, consumed by the app each tick.
|
|
|
|
#define PLATFORM_MAX_CHARS_PER_FRAME 64
|
|
#define PLATFORM_MAX_KEYS_PER_FRAME 32
|
|
|
|
// Virtual key codes (subset matching Win32 VK_ codes)
|
|
enum {
|
|
PKEY_BACKSPACE = 0x08,
|
|
PKEY_TAB = 0x09,
|
|
PKEY_RETURN = 0x0D,
|
|
PKEY_ESCAPE = 0x1B,
|
|
PKEY_DELETE = 0x2E,
|
|
PKEY_LEFT = 0x25,
|
|
PKEY_UP = 0x26,
|
|
PKEY_RIGHT = 0x27,
|
|
PKEY_DOWN = 0x28,
|
|
PKEY_HOME = 0x24,
|
|
PKEY_END = 0x23,
|
|
PKEY_A = 0x41,
|
|
PKEY_C = 0x43,
|
|
PKEY_V = 0x56,
|
|
PKEY_X = 0x58,
|
|
PKEY_0 = 0x30,
|
|
PKEY_EQUAL = 0xBB, // '='/'+' (VK_OEM_PLUS)
|
|
PKEY_MINUS = 0xBD, // '-'/'_' (VK_OEM_MINUS)
|
|
};
|
|
|
|
struct PlatformInput {
|
|
// Typed characters (UTF-16 code units, printable only)
|
|
U16 chars[PLATFORM_MAX_CHARS_PER_FRAME];
|
|
S32 char_count;
|
|
|
|
// Key-down events (virtual key codes)
|
|
U8 keys[PLATFORM_MAX_KEYS_PER_FRAME];
|
|
S32 key_count;
|
|
|
|
// Modifier state at time of last key event
|
|
B32 ctrl_held;
|
|
B32 shift_held;
|
|
|
|
// Mouse state (polled per frame)
|
|
Vec2F32 mouse_pos;
|
|
Vec2F32 scroll_delta;
|
|
B32 mouse_down;
|
|
B32 was_mouse_down;
|
|
};
|
|
|
|
struct PlatformWindow;
|
|
|
|
enum PlatformWindowStyle {
|
|
PLATFORM_WINDOW_STYLE_NORMAL = 0,
|
|
PLATFORM_WINDOW_STYLE_POPUP = 1, // utility panel, owned by parent, fixed size
|
|
PLATFORM_WINDOW_STYLE_POPUP_RESIZABLE = 2, // utility panel, owned by parent, resizable
|
|
};
|
|
|
|
struct PlatformWindowDesc {
|
|
const char *title = "autosample";
|
|
S32 width = 1280;
|
|
S32 height = 720;
|
|
PlatformWindowStyle style = PLATFORM_WINDOW_STYLE_NORMAL;
|
|
PlatformWindow *parent = nullptr;
|
|
B32 independent = 0; // if true, don't attach as child (independent top-level window)
|
|
};
|
|
|
|
enum PlatformMsgBoxType {
|
|
PLATFORM_MSGBOX_OK = 0,
|
|
PLATFORM_MSGBOX_OK_CANCEL = 1,
|
|
PLATFORM_MSGBOX_YES_NO = 2,
|
|
};
|
|
|
|
struct PlatformMenuItem {
|
|
const char *label; // nullptr = separator
|
|
S32 id; // command ID (ignored for separators)
|
|
};
|
|
|
|
struct PlatformMenu {
|
|
const char *label;
|
|
PlatformMenuItem *items;
|
|
S32 item_count;
|
|
};
|
|
|
|
// Called by the platform layer when the window needs a frame rendered
|
|
// (e.g., during a live resize). user_data is the pointer passed to
|
|
// platform_set_frame_callback.
|
|
typedef void (*PlatformFrameCallback)(void *user_data);
|
|
|
|
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);
|
|
|
|
void platform_set_frame_callback(PlatformWindow *window, PlatformFrameCallback cb, void *user_data);
|
|
void platform_set_menu(PlatformWindow *window, PlatformMenu *menus, S32 menu_count);
|
|
S32 platform_poll_menu_command(PlatformWindow *window);
|
|
|
|
// Returns accumulated input since last call (keyboard events + polled mouse state), then clears the buffer.
|
|
PlatformInput platform_get_input(PlatformWindow *window);
|
|
|
|
// Returns true if the window's close button was clicked (for popup windows).
|
|
B32 platform_window_should_close(PlatformWindow *window);
|
|
|
|
// Bring a window to front and give it keyboard focus.
|
|
void platform_focus_window(PlatformWindow *window);
|
|
|
|
// Blocks until user responds. Returns 0=first button, 1=second button, -1=dismissed.
|
|
S32 platform_message_box(PlatformWindow *parent, const char *title,
|
|
const char *message, PlatformMsgBoxType type);
|
|
|
|
// Cursor shapes for resize handles
|
|
enum PlatformCursor {
|
|
PLATFORM_CURSOR_ARROW = 0,
|
|
PLATFORM_CURSOR_SIZE_WE = 1, // horizontal resize
|
|
PLATFORM_CURSOR_SIZE_NS = 2, // vertical resize
|
|
};
|
|
|
|
void platform_set_cursor(PlatformCursor cursor);
|
|
|
|
// DPI scale factor for the window's current monitor.
|
|
// Returns 1.0 at 96 DPI (100%), 1.5 at 144 DPI (150%), etc.
|
|
F32 platform_get_dpi_scale(PlatformWindow *window);
|
|
|
|
// Clipboard operations (null-terminated UTF-8 strings).
|
|
// platform_clipboard_set copies text to the system clipboard.
|
|
// platform_clipboard_get returns a pointer to a static buffer (valid until next call), or nullptr.
|
|
void platform_clipboard_set(const char *text);
|
|
const char *platform_clipboard_get();
|