2023-02-01 15:23:51 +00:00
|
|
|
/************************************************************//**
|
|
|
|
*
|
|
|
|
* @file: mp_app_internal.h
|
|
|
|
* @author: Martin Fouilleul
|
|
|
|
* @date: 23/12/2022
|
|
|
|
* @revision:
|
|
|
|
*
|
|
|
|
*****************************************************************/
|
|
|
|
#ifndef __MP_APP_INTERNAL_H_
|
|
|
|
#define __MP_APP_INTERNAL_H_
|
|
|
|
|
|
|
|
#include"platform.h"
|
|
|
|
#include"ringbuffer.h"
|
|
|
|
|
|
|
|
#if defined(OS_WIN64) || defined(OS_WIN32)
|
|
|
|
#include"win32_app.h"
|
|
|
|
#elif defined(OS_MACOS)
|
|
|
|
#include"osx_app.h"
|
|
|
|
#else
|
|
|
|
#error "platform not supported yet"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
//---------------------------------------------------------------
|
|
|
|
// Input State
|
|
|
|
//---------------------------------------------------------------
|
|
|
|
|
|
|
|
typedef struct mp_key_utf8
|
|
|
|
{
|
|
|
|
u8 labelLen;
|
|
|
|
char label[8];
|
|
|
|
} mp_key_utf8;
|
|
|
|
|
|
|
|
typedef struct mp_key_state
|
|
|
|
{
|
|
|
|
u64 lastUpdate;
|
|
|
|
u32 transitionCounter;
|
|
|
|
bool down;
|
|
|
|
bool clicked;
|
|
|
|
bool doubleClicked;
|
|
|
|
|
|
|
|
} mp_key_state;
|
|
|
|
|
|
|
|
typedef struct mp_keyboard_state
|
|
|
|
{
|
|
|
|
mp_key_state keys[MP_KEY_COUNT];
|
|
|
|
mp_key_mods mods;
|
|
|
|
} mp_keyboard_state;
|
|
|
|
|
|
|
|
typedef struct mp_mouse_state
|
|
|
|
{
|
|
|
|
u64 lastUpdate;
|
|
|
|
bool posValid;
|
|
|
|
vec2 pos;
|
|
|
|
vec2 delta;
|
|
|
|
vec2 wheel;
|
|
|
|
|
|
|
|
union
|
|
|
|
{
|
|
|
|
mp_key_state buttons[MP_MOUSE_BUTTON_COUNT];
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
mp_key_state left;
|
|
|
|
mp_key_state right;
|
|
|
|
mp_key_state middle;
|
|
|
|
mp_key_state ext1;
|
|
|
|
mp_key_state ext2;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
} mp_mouse_state;
|
|
|
|
|
|
|
|
enum { MP_INPUT_TEXT_BACKING_SIZE = 64 };
|
|
|
|
|
|
|
|
typedef struct mp_text_state
|
|
|
|
{
|
|
|
|
u64 lastUpdate;
|
|
|
|
utf32 backing[MP_INPUT_TEXT_BACKING_SIZE];
|
|
|
|
str32 codePoints;
|
|
|
|
} mp_text_state;
|
|
|
|
|
|
|
|
typedef struct mp_input_state
|
|
|
|
{
|
|
|
|
u64 frameCounter;
|
|
|
|
mp_keyboard_state keyboard;
|
|
|
|
mp_mouse_state mouse;
|
|
|
|
mp_text_state text;
|
|
|
|
} mp_input_state;
|
|
|
|
|
|
|
|
//---------------------------------------------------------------
|
|
|
|
// Window structure
|
|
|
|
//---------------------------------------------------------------
|
|
|
|
|
|
|
|
typedef struct mp_frame_stats
|
|
|
|
{
|
|
|
|
f64 start;
|
|
|
|
f64 workTime;
|
|
|
|
f64 remainingTime;
|
|
|
|
f64 targetFramePeriod;
|
|
|
|
} mp_frame_stats;
|
|
|
|
|
|
|
|
typedef struct mp_window_data
|
|
|
|
{
|
|
|
|
list_elt freeListElt;
|
|
|
|
u32 generation;
|
|
|
|
|
|
|
|
mp_rect contentRect;
|
|
|
|
mp_rect frameRect;
|
|
|
|
mp_window_style style;
|
|
|
|
|
|
|
|
bool shouldClose; //TODO could be in status flags
|
|
|
|
bool hidden;
|
|
|
|
bool minimized;
|
|
|
|
|
|
|
|
MP_PLATFORM_WINDOW_DATA
|
|
|
|
} mp_window_data;
|
|
|
|
|
|
|
|
|
|
|
|
//---------------------------------------------------------------
|
|
|
|
// Global App State
|
|
|
|
//---------------------------------------------------------------
|
|
|
|
|
|
|
|
enum { MP_APP_MAX_WINDOWS = 128 };
|
|
|
|
|
|
|
|
typedef struct mp_app
|
|
|
|
{
|
|
|
|
bool init;
|
|
|
|
bool shouldQuit;
|
|
|
|
bool minimized;
|
|
|
|
|
|
|
|
str8 pendingPathDrop;
|
|
|
|
mem_arena eventArena;
|
|
|
|
|
|
|
|
ringbuffer eventQueue;
|
|
|
|
|
|
|
|
mp_frame_stats frameStats;
|
|
|
|
|
|
|
|
mp_window_data windowPool[MP_APP_MAX_WINDOWS];
|
|
|
|
list_info windowFreeList;
|
|
|
|
|
|
|
|
mp_live_resize_callback liveResizeCallback;
|
|
|
|
void* liveResizeData;
|
|
|
|
|
|
|
|
mp_input_state inputState;
|
|
|
|
|
|
|
|
mp_key_utf8 keyLabels[512];
|
|
|
|
int keyCodes[512];
|
|
|
|
int nativeKeys[MP_KEY_COUNT];
|
|
|
|
|
|
|
|
MP_PLATFORM_APP_DATA
|
|
|
|
} mp_app;
|
|
|
|
|
2023-02-20 10:05:01 +00:00
|
|
|
mp_window_data* mp_window_ptr_from_handle(mp_window handle);
|
2023-02-01 15:23:51 +00:00
|
|
|
|
|
|
|
#endif // __MP_APP_INTERNAL_H_
|