merge view rules & view specs entirely; simplify graphical view rules down to single hook

This commit is contained in:
Ryan Fleury
2024-09-16 14:44:28 -07:00
parent 84f685803d
commit 9899efe93c
19 changed files with 680 additions and 1153 deletions
+10 -10
View File
@@ -303,10 +303,10 @@ os_get_events(Arena *arena, B32 wait)
case KeyRelease:
{
// rjf: determine flags
OS_EventFlags flags = 0;
if(evt.xkey.state & ShiftMask) { flags |= OS_EventFlag_Shift; }
if(evt.xkey.state & ControlMask) { flags |= OS_EventFlag_Ctrl; }
if(evt.xkey.state & Mod1Mask) { flags |= OS_EventFlag_Alt; }
OS_Modifiers flags = 0;
if(evt.xkey.state & ShiftMask) { flags |= OS_Modifier_Shift; }
if(evt.xkey.state & ControlMask) { flags |= OS_Modifier_Ctrl; }
if(evt.xkey.state & Mod1Mask) { flags |= OS_Modifier_Alt; }
// rjf: map keycode -> keysym
U32 keysym = XLookupKeysym(&evt.xkey, 0);
@@ -374,10 +374,10 @@ os_get_events(Arena *arena, B32 wait)
case ButtonRelease:
{
// rjf: determine flags
OS_EventFlags flags = 0;
if(evt.xbutton.state & ShiftMask) { flags |= OS_EventFlag_Shift; }
if(evt.xbutton.state & ControlMask) { flags |= OS_EventFlag_Ctrl; }
if(evt.xbutton.state & Mod1Mask) { flags |= OS_EventFlag_Alt; }
OS_Modifiers flags = 0;
if(evt.xbutton.state & ShiftMask) { flags |= OS_Modifier_Shift; }
if(evt.xbutton.state & ControlMask) { flags |= OS_Modifier_Ctrl; }
if(evt.xbutton.state & Mod1Mask) { flags |= OS_Modifier_Alt; }
// rjf: map button -> OS_Key
OS_Key key = OS_Key_Null;
@@ -442,8 +442,8 @@ os_get_events(Arena *arena, B32 wait)
return evts;
}
internal OS_EventFlags
os_get_event_flags(void)
internal OS_Modifiers
os_get_modifiers(void)
{
return 0;
}
+58 -58
View File
@@ -32,60 +32,60 @@ os_string_from_event_kind(OS_EventKind kind)
}
internal String8List
os_string_list_from_event_flags(Arena *arena, OS_EventFlags flags)
os_string_list_from_modifiers(Arena *arena, OS_Modifiers modifiers)
{
String8List result = {0};
String8 flag_strs[] =
String8 modifier_strs[] =
{
str8_lit("Ctrl"),
str8_lit("Shift"),
str8_lit("Alt"),
};
str8_list_from_flags(arena, &result, flags, flag_strs, ArrayCount(flag_strs));
str8_list_from_flags(arena, &result, modifiers, modifier_strs, ArrayCount(modifier_strs));
return result;
}
internal U32
os_codepoint_from_event_flags_and_key(OS_EventFlags flags, OS_Key key)
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_EventFlags flags;} map[] =
local_persist read_only struct {U32 character; OS_Key key; OS_Modifiers modifiers;} map[] =
{
{'!', OS_Key_1, OS_EventFlag_Shift},
{'@', OS_Key_2, OS_EventFlag_Shift},
{'#', OS_Key_3, OS_EventFlag_Shift},
{'$', OS_Key_4, OS_EventFlag_Shift},
{'%', OS_Key_5, OS_EventFlag_Shift},
{'^', OS_Key_6, OS_EventFlag_Shift},
{'&', OS_Key_7, OS_EventFlag_Shift},
{'*', OS_Key_8, OS_EventFlag_Shift},
{'(', OS_Key_9, OS_EventFlag_Shift},
{')', OS_Key_0, OS_EventFlag_Shift},
{'_', OS_Key_Minus, OS_EventFlag_Shift},
{'_', OS_Key_Minus, OS_EventFlag_Shift},
{'!', 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_EventFlag_Shift},
{'+', OS_Key_Equal, OS_Modifier_Shift},
{'`', OS_Key_Tick, 0},
{'~', OS_Key_Tick, OS_EventFlag_Shift},
{'~', OS_Key_Tick, OS_Modifier_Shift},
{'[', OS_Key_LeftBracket, 0},
{']', OS_Key_RightBracket, 0},
{'{', OS_Key_LeftBracket, OS_EventFlag_Shift},
{'}', OS_Key_RightBracket, OS_EventFlag_Shift},
{'{', OS_Key_LeftBracket, OS_Modifier_Shift},
{'}', OS_Key_RightBracket, OS_Modifier_Shift},
{'\\', OS_Key_BackSlash, 0},
{'|', OS_Key_BackSlash, OS_EventFlag_Shift},
{'|', OS_Key_BackSlash, OS_Modifier_Shift},
{';', OS_Key_Semicolon, 0},
{':', OS_Key_Semicolon, OS_EventFlag_Shift},
{':', OS_Key_Semicolon, OS_Modifier_Shift},
{'\'', OS_Key_Quote, 0},
{'"', OS_Key_Quote, OS_EventFlag_Shift},
{'"', OS_Key_Quote, OS_Modifier_Shift},
{'.', OS_Key_Period, 0},
{',', OS_Key_Comma, 0},
{'<', OS_Key_Period, OS_EventFlag_Shift},
{'>', OS_Key_Comma, OS_EventFlag_Shift},
{'<', OS_Key_Period, OS_Modifier_Shift},
{'>', OS_Key_Comma, OS_Modifier_Shift},
{'/', OS_Key_Slash, 0},
{'?', OS_Key_Slash, OS_EventFlag_Shift},
{'?', OS_Key_Slash, OS_Modifier_Shift},
{'a', OS_Key_A, 0},
{'b', OS_Key_B, 0},
{'c', OS_Key_C, 0},
@@ -112,32 +112,32 @@ os_codepoint_from_event_flags_and_key(OS_EventFlags flags, OS_Key key)
{'x', OS_Key_X, 0},
{'y', OS_Key_Y, 0},
{'z', OS_Key_Z, 0},
{'A', OS_Key_A, OS_EventFlag_Shift},
{'B', OS_Key_B, OS_EventFlag_Shift},
{'C', OS_Key_C, OS_EventFlag_Shift},
{'D', OS_Key_D, OS_EventFlag_Shift},
{'E', OS_Key_E, OS_EventFlag_Shift},
{'F', OS_Key_F, OS_EventFlag_Shift},
{'G', OS_Key_G, OS_EventFlag_Shift},
{'H', OS_Key_H, OS_EventFlag_Shift},
{'I', OS_Key_I, OS_EventFlag_Shift},
{'J', OS_Key_J, OS_EventFlag_Shift},
{'K', OS_Key_K, OS_EventFlag_Shift},
{'L', OS_Key_L, OS_EventFlag_Shift},
{'M', OS_Key_M, OS_EventFlag_Shift},
{'N', OS_Key_N, OS_EventFlag_Shift},
{'O', OS_Key_O, OS_EventFlag_Shift},
{'P', OS_Key_P, OS_EventFlag_Shift},
{'Q', OS_Key_Q, OS_EventFlag_Shift},
{'R', OS_Key_R, OS_EventFlag_Shift},
{'S', OS_Key_S, OS_EventFlag_Shift},
{'T', OS_Key_T, OS_EventFlag_Shift},
{'U', OS_Key_U, OS_EventFlag_Shift},
{'V', OS_Key_V, OS_EventFlag_Shift},
{'W', OS_Key_W, OS_EventFlag_Shift},
{'X', OS_Key_X, OS_EventFlag_Shift},
{'Y', OS_Key_Y, OS_EventFlag_Shift},
{'Z', OS_Key_Z, OS_EventFlag_Shift},
{'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
@@ -149,7 +149,7 @@ os_codepoint_from_event_flags_and_key(OS_EventFlags flags, OS_Key key)
// rjf: check special-case map
for(U64 idx = 0; idx < ArrayCount(map); idx += 1)
{
if(map[idx].key == key && map[idx].flags == flags)
if(map[idx].key == key && map[idx].modifiers == modifiers)
{
result = map[idx].character;
break;
@@ -167,13 +167,13 @@ os_eat_event(OS_EventList *events, OS_Event *event)
}
internal B32
os_key_press(OS_EventList *events, OS_Handle window, OS_EventFlags flags, OS_Key key)
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->flags == flags)
event->kind == OS_EventKind_Press && event->key == key && event->modifiers == modifiers)
{
result = 1;
os_eat_event(events, event);
@@ -184,13 +184,13 @@ os_key_press(OS_EventList *events, OS_Handle window, OS_EventFlags flags, OS_Key
}
internal B32
os_key_release(OS_EventList *events, OS_Handle window, OS_EventFlags flags, OS_Key key)
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->flags == flags)
event->kind == OS_EventKind_Release && event->key == key && event->modifiers == modifiers)
{
result = 1;
os_eat_event(events, event);
+10 -10
View File
@@ -66,12 +66,12 @@ typedef enum OS_EventKind
}
OS_EventKind;
typedef U32 OS_EventFlags;
typedef U32 OS_Modifiers;
enum
{
OS_EventFlag_Ctrl = (1<<0),
OS_EventFlag_Shift = (1<<1),
OS_EventFlag_Alt = (1<<2),
OS_Modifier_Ctrl = (1<<0),
OS_Modifier_Shift = (1<<1),
OS_Modifier_Alt = (1<<2),
};
typedef struct OS_Event OS_Event;
@@ -82,7 +82,7 @@ struct OS_Event
U64 timestamp_us;
OS_Handle window;
OS_EventKind kind;
OS_EventFlags flags;
OS_Modifiers modifiers;
OS_Key key;
B32 is_repeat;
B32 right_sided;
@@ -110,11 +110,11 @@ internal B32 frame(void);
//~ rjf: Event Functions (Helpers, Implemented Once)
internal String8 os_string_from_event_kind(OS_EventKind kind);
internal String8List os_string_list_from_event_flags(Arena *arena, OS_EventFlags flags);
internal U32 os_codepoint_from_event_flags_and_key(OS_EventFlags flags, OS_Key key);
internal String8List os_string_list_from_modifiers(Arena *arena, OS_Modifiers flags);
internal U32 os_codepoint_from_modifiers_and_key(OS_Modifiers flags, OS_Key key);
internal void os_eat_event(OS_EventList *events, OS_Event *event);
internal B32 os_key_press(OS_EventList *events, OS_Handle window, OS_EventFlags flags, OS_Key key);
internal B32 os_key_release(OS_EventList *events, OS_Handle window, OS_EventFlags flags, OS_Key key);
internal B32 os_key_press(OS_EventList *events, OS_Handle window, OS_Modifiers modifiers, OS_Key key);
internal B32 os_key_release(OS_EventList *events, OS_Handle window, OS_Modifiers modifiers, OS_Key key);
internal B32 os_text(OS_EventList *events, OS_Handle window, U32 character);
internal OS_EventList os_event_list_copy(Arena *arena, OS_EventList *src);
internal void os_event_list_concat_in_place(OS_EventList *dst, OS_EventList *to_push);
@@ -173,7 +173,7 @@ internal Vec2F32 os_dim_from_monitor(OS_Handle monitor);
internal void os_send_wakeup_event(void);
internal OS_EventList os_get_events(Arena *arena, B32 wait);
internal OS_EventFlags os_get_event_flags(void);
internal OS_Modifiers os_get_modifiers(void);
internal Vec2F32 os_mouse_from_window(OS_Handle window);
////////////////////////////////
+3 -3
View File
@@ -190,10 +190,10 @@ os_get_events(Arena *arena, B32 wait)
return evts;
}
internal OS_EventFlags
os_get_event_flags(void)
internal OS_Modifiers
os_get_modifiers(void)
{
OS_EventFlags f = 0;
OS_Modifiers f = 0;
return f;
}
+12 -12
View File
@@ -101,7 +101,7 @@ os_w32_push_event(OS_EventKind kind, OS_W32_Window *window)
{
OS_Event *result = os_event_list_push_new(os_w32_event_arena, &os_w32_event_list, kind);
result->window = os_w32_handle_from_window(window);
result->flags = os_get_event_flags();
result->modifiers = os_get_modifiers();
return result;
}
@@ -475,9 +475,9 @@ os_w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
event->repeat_count = lParam & bitmask16;
event->is_repeat = is_repeat;
event->right_sided = right_sided;
if(event->key == OS_Key_Alt && event->flags & OS_EventFlag_Alt) { event->flags &= ~OS_EventFlag_Alt; }
if(event->key == OS_Key_Ctrl && event->flags & OS_EventFlag_Ctrl) { event->flags &= ~OS_EventFlag_Ctrl; }
if(event->key == OS_Key_Shift && event->flags & OS_EventFlag_Shift) { event->flags &= ~OS_EventFlag_Shift; }
if(event->key == OS_Key_Alt && event->modifiers & OS_Modifier_Alt) { event->modifiers &= ~OS_Modifier_Alt; }
if(event->key == OS_Key_Ctrl && event->modifiers & OS_Modifier_Ctrl) { event->modifiers &= ~OS_Modifier_Ctrl; }
if(event->key == OS_Key_Shift && event->modifiers & OS_Modifier_Shift) { event->modifiers &= ~OS_Modifier_Shift; }
}break;
case WM_SYSCHAR:
@@ -493,7 +493,7 @@ os_w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
OS_Event *event = os_w32_push_event(OS_EventKind_Text, window);
if(lParam & bit29)
{
event->flags |= OS_EventFlag_Alt;
event->modifiers |= OS_Modifier_Alt;
}
event->character = character;
}
@@ -1393,23 +1393,23 @@ os_get_events(Arena *arena, B32 wait)
return os_w32_event_list;
}
internal OS_EventFlags
os_get_event_flags(void)
internal OS_Modifiers
os_get_modifiers(void)
{
OS_EventFlags flags = 0;
OS_Modifiers modifiers = 0;
if(GetKeyState(VK_CONTROL) & 0x8000)
{
flags |= OS_EventFlag_Ctrl;
modifiers |= OS_Modifier_Ctrl;
}
if(GetKeyState(VK_SHIFT) & 0x8000)
{
flags |= OS_EventFlag_Shift;
modifiers |= OS_Modifier_Shift;
}
if(GetKeyState(VK_MENU) & 0x8000)
{
flags |= OS_EventFlag_Alt;
modifiers |= OS_Modifier_Alt;
}
return(flags);
return modifiers;
}
internal Vec2F32