Files
raddebugger/src/os/gfx/os_gfx.c
T

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;
}