mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-07-19 23:16:48 +00:00
280 lines
8.4 KiB
C
280 lines
8.4 KiB
C
// Copyright (c) 2024 Epic Games Tools
|
|
// Licensed under the MIT license (https://opensource.org/license/mit/)
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Generated Code
|
|
|
|
#include "generated/os_gfx.meta.c"
|
|
|
|
////////////////////////////////
|
|
//~ rjf: Event Functions (Helpers, Implemented Once)
|
|
|
|
internal String8
|
|
os_string_from_event_kind(OS_EventKind kind)
|
|
{
|
|
String8 result = {0};
|
|
switch(kind)
|
|
{
|
|
case OS_EventKind_Null:
|
|
case OS_EventKind_COUNT:
|
|
{}break;
|
|
case OS_EventKind_Press: {result = str8_lit("Press");}break;
|
|
case OS_EventKind_Release: {result = str8_lit("Release");}break;
|
|
case OS_EventKind_MouseMove: {result = str8_lit("MouseMove");}break;
|
|
case OS_EventKind_Text: {result = str8_lit("Text");}break;
|
|
case OS_EventKind_Scroll: {result = str8_lit("Scroll");}break;
|
|
case OS_EventKind_WindowLoseFocus: {result = str8_lit("WindowLoseFocus");}break;
|
|
case OS_EventKind_WindowClose: {result = str8_lit("WindowClose");}break;
|
|
case OS_EventKind_FileDrop: {result = str8_lit("FileDrop");}break;
|
|
case OS_EventKind_Wakeup: {result = str8_lit("Wakeup");}break;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
internal String8List
|
|
os_string_list_from_modifiers(Arena *arena, OS_Modifiers modifiers)
|
|
{
|
|
String8List result = {0};
|
|
String8 modifier_strs[] =
|
|
{
|
|
str8_lit("Ctrl"),
|
|
str8_lit("Shift"),
|
|
str8_lit("Alt"),
|
|
};
|
|
str8_list_from_flags(arena, &result, modifiers, modifier_strs, ArrayCount(modifier_strs));
|
|
return result;
|
|
}
|
|
|
|
internal String8
|
|
os_string_from_modifiers_key(Arena *arena, OS_Modifiers modifiers, OS_Key key)
|
|
{
|
|
String8 result = {0};
|
|
if(key != OS_Key_Null)
|
|
{
|
|
Temp scratch = scratch_begin(&arena, 1);
|
|
String8List mods = os_string_list_from_modifiers(scratch.arena, modifiers);
|
|
String8 key_string = os_g_key_display_string_table[key];
|
|
str8_list_push(scratch.arena, &mods, key_string);
|
|
StringJoin join = {0};
|
|
join.sep = str8_lit(" + ");
|
|
result = str8_list_join(arena, &mods, &join);
|
|
scratch_end(scratch);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
internal U32
|
|
os_codepoint_from_modifiers_and_key(OS_Modifiers modifiers, OS_Key key)
|
|
{
|
|
U32 result = 0;
|
|
|
|
// rjf: special-case map
|
|
local_persist read_only struct {U32 character; OS_Key key; OS_Modifiers modifiers;} map[] =
|
|
{
|
|
{'!', OS_Key_1, OS_Modifier_Shift},
|
|
{'@', OS_Key_2, OS_Modifier_Shift},
|
|
{'#', OS_Key_3, OS_Modifier_Shift},
|
|
{'$', OS_Key_4, OS_Modifier_Shift},
|
|
{'%', OS_Key_5, OS_Modifier_Shift},
|
|
{'^', OS_Key_6, OS_Modifier_Shift},
|
|
{'&', OS_Key_7, OS_Modifier_Shift},
|
|
{'*', OS_Key_8, OS_Modifier_Shift},
|
|
{'(', OS_Key_9, OS_Modifier_Shift},
|
|
{')', OS_Key_0, OS_Modifier_Shift},
|
|
{'_', OS_Key_Minus, OS_Modifier_Shift},
|
|
{'_', OS_Key_Minus, OS_Modifier_Shift},
|
|
{'-', OS_Key_Minus, 0},
|
|
{'=', OS_Key_Equal, 0},
|
|
{'+', OS_Key_Equal, OS_Modifier_Shift},
|
|
{'`', OS_Key_Tick, 0},
|
|
{'~', OS_Key_Tick, OS_Modifier_Shift},
|
|
{'[', OS_Key_LeftBracket, 0},
|
|
{']', OS_Key_RightBracket, 0},
|
|
{'{', OS_Key_LeftBracket, OS_Modifier_Shift},
|
|
{'}', OS_Key_RightBracket, OS_Modifier_Shift},
|
|
{'\\', OS_Key_BackSlash, 0},
|
|
{'|', OS_Key_BackSlash, OS_Modifier_Shift},
|
|
{';', OS_Key_Semicolon, 0},
|
|
{':', OS_Key_Semicolon, OS_Modifier_Shift},
|
|
{'\'', OS_Key_Quote, 0},
|
|
{'"', OS_Key_Quote, OS_Modifier_Shift},
|
|
{'.', OS_Key_Period, 0},
|
|
{',', OS_Key_Comma, 0},
|
|
{'<', OS_Key_Period, OS_Modifier_Shift},
|
|
{'>', OS_Key_Comma, OS_Modifier_Shift},
|
|
{'/', OS_Key_Slash, 0},
|
|
{'?', OS_Key_Slash, OS_Modifier_Shift},
|
|
{'a', OS_Key_A, 0},
|
|
{'b', OS_Key_B, 0},
|
|
{'c', OS_Key_C, 0},
|
|
{'d', OS_Key_D, 0},
|
|
{'e', OS_Key_E, 0},
|
|
{'f', OS_Key_F, 0},
|
|
{'g', OS_Key_G, 0},
|
|
{'h', OS_Key_H, 0},
|
|
{'i', OS_Key_I, 0},
|
|
{'j', OS_Key_J, 0},
|
|
{'k', OS_Key_K, 0},
|
|
{'l', OS_Key_L, 0},
|
|
{'m', OS_Key_M, 0},
|
|
{'n', OS_Key_N, 0},
|
|
{'o', OS_Key_O, 0},
|
|
{'p', OS_Key_P, 0},
|
|
{'q', OS_Key_Q, 0},
|
|
{'r', OS_Key_R, 0},
|
|
{'s', OS_Key_S, 0},
|
|
{'t', OS_Key_T, 0},
|
|
{'u', OS_Key_U, 0},
|
|
{'v', OS_Key_V, 0},
|
|
{'w', OS_Key_W, 0},
|
|
{'x', OS_Key_X, 0},
|
|
{'y', OS_Key_Y, 0},
|
|
{'z', OS_Key_Z, 0},
|
|
{'A', OS_Key_A, OS_Modifier_Shift},
|
|
{'B', OS_Key_B, OS_Modifier_Shift},
|
|
{'C', OS_Key_C, OS_Modifier_Shift},
|
|
{'D', OS_Key_D, OS_Modifier_Shift},
|
|
{'E', OS_Key_E, OS_Modifier_Shift},
|
|
{'F', OS_Key_F, OS_Modifier_Shift},
|
|
{'G', OS_Key_G, OS_Modifier_Shift},
|
|
{'H', OS_Key_H, OS_Modifier_Shift},
|
|
{'I', OS_Key_I, OS_Modifier_Shift},
|
|
{'J', OS_Key_J, OS_Modifier_Shift},
|
|
{'K', OS_Key_K, OS_Modifier_Shift},
|
|
{'L', OS_Key_L, OS_Modifier_Shift},
|
|
{'M', OS_Key_M, OS_Modifier_Shift},
|
|
{'N', OS_Key_N, OS_Modifier_Shift},
|
|
{'O', OS_Key_O, OS_Modifier_Shift},
|
|
{'P', OS_Key_P, OS_Modifier_Shift},
|
|
{'Q', OS_Key_Q, OS_Modifier_Shift},
|
|
{'R', OS_Key_R, OS_Modifier_Shift},
|
|
{'S', OS_Key_S, OS_Modifier_Shift},
|
|
{'T', OS_Key_T, OS_Modifier_Shift},
|
|
{'U', OS_Key_U, OS_Modifier_Shift},
|
|
{'V', OS_Key_V, OS_Modifier_Shift},
|
|
{'W', OS_Key_W, OS_Modifier_Shift},
|
|
{'X', OS_Key_X, OS_Modifier_Shift},
|
|
{'Y', OS_Key_Y, OS_Modifier_Shift},
|
|
{'Z', OS_Key_Z, OS_Modifier_Shift},
|
|
};
|
|
|
|
// rjf: check numeric
|
|
if(OS_Key_0 <= key && key <= OS_Key_9)
|
|
{
|
|
result = '0' + (key - OS_Key_0);
|
|
}
|
|
|
|
// rjf: check special-case map
|
|
for(U64 idx = 0; idx < ArrayCount(map); idx += 1)
|
|
{
|
|
if(map[idx].key == key && map[idx].modifiers == modifiers)
|
|
{
|
|
result = map[idx].character;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
internal void
|
|
os_eat_event(OS_EventList *events, OS_Event *event)
|
|
{
|
|
DLLRemove(events->first, events->last, event);
|
|
events->count -= 1;
|
|
}
|
|
|
|
internal B32
|
|
os_key_press(OS_EventList *events, OS_Handle window, OS_Modifiers modifiers, OS_Key key)
|
|
{
|
|
B32 result = 0;
|
|
for(OS_Event *event = events->first; event != 0; event = event->next)
|
|
{
|
|
if((os_handle_match(event->window, window) || os_handle_match(window, os_handle_zero())) &&
|
|
event->kind == OS_EventKind_Press && event->key == key && event->modifiers == modifiers)
|
|
{
|
|
result = 1;
|
|
os_eat_event(events, event);
|
|
break;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
internal B32
|
|
os_key_release(OS_EventList *events, OS_Handle window, OS_Modifiers modifiers, OS_Key key)
|
|
{
|
|
B32 result = 0;
|
|
for(OS_Event *event = events->first; event != 0; event = event->next)
|
|
{
|
|
if((os_handle_match(event->window, window) || os_handle_match(window, os_handle_zero())) &&
|
|
event->kind == OS_EventKind_Release && event->key == key && event->modifiers == modifiers)
|
|
{
|
|
result = 1;
|
|
os_eat_event(events, event);
|
|
break;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
internal B32
|
|
os_text(OS_EventList *events, OS_Handle window, U32 character)
|
|
{
|
|
B32 result = 0;
|
|
for(OS_Event *event = events->first; event != 0; event = event->next)
|
|
{
|
|
if((os_handle_match(event->window, window) || os_handle_match(window, os_handle_zero())) &&
|
|
event->kind == OS_EventKind_Text && event->character == character)
|
|
{
|
|
result = 1;
|
|
os_eat_event(events, event);
|
|
break;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
internal OS_EventList
|
|
os_event_list_copy(Arena *arena, OS_EventList *src)
|
|
{
|
|
OS_EventList dst = {0};
|
|
for(OS_Event *s = src->first; s != 0; s = s->next)
|
|
{
|
|
OS_Event *d = push_array(arena, OS_Event, 1);
|
|
MemoryCopyStruct(d, s);
|
|
d->strings = str8_list_copy(arena, &s->strings);
|
|
DLLPushBack(dst.first, dst.last, d);
|
|
dst.count += 1;
|
|
}
|
|
return dst;
|
|
}
|
|
|
|
internal void
|
|
os_event_list_concat_in_place(OS_EventList *dst, OS_EventList *to_push)
|
|
{
|
|
if(dst->last && to_push->first)
|
|
{
|
|
dst->last->next = to_push->first;
|
|
to_push->first->prev = dst->last;
|
|
dst->last = to_push->last;
|
|
dst->count += to_push->count;
|
|
}
|
|
else if(!dst->last && to_push->first)
|
|
{
|
|
MemoryCopyStruct(dst, to_push);
|
|
}
|
|
MemoryZeroStruct(to_push);
|
|
}
|
|
|
|
internal OS_Event *
|
|
os_event_list_push_new(Arena *arena, OS_EventList *evts, OS_EventKind kind)
|
|
{
|
|
OS_Event *evt = push_array(arena, OS_Event, 1);
|
|
DLLPushBack(evts->first, evts->last, evt);
|
|
evts->count += 1;
|
|
evt->timestamp_us = os_now_microseconds();
|
|
evt->kind = kind;
|
|
return evt;
|
|
}
|