From 7a76a0c888ed927c0ce94b48a421c9752d30a62b Mon Sep 17 00:00:00 2001 From: Benjamin Trosch Date: Mon, 10 Jul 2023 23:53:55 -0400 Subject: [PATCH] added function prototypes, removed imguikey function, and added documentation blurb --- util/sokol_imgui.h | 138 ++++++++++++++++++++++++++++++--------------- 1 file changed, 92 insertions(+), 46 deletions(-) diff --git a/util/sokol_imgui.h b/util/sokol_imgui.h index 0166cfb14..dfc0bbac7 100644 --- a/util/sokol_imgui.h +++ b/util/sokol_imgui.h @@ -239,6 +239,30 @@ itself though, not any allocations in Dear ImGui. + IMGUI EVENT HANDLING + ==================== + You can use this set of functions to handle ImGui events when using + a non-sokol_app platform and SOKOL_IMGUI_NO_SOKOL_APP is defined. + + Call these functions from your platform's event handling. For example: + + Mouse position events can be dispatched like this: + + simgui_add_mouse_pos_event(100, 200); + + Key events require a mapping function to convert your platform's key values to ImGuiKey's: + + int map_keycode(int keycode) { + // Your mapping logic here... + } + simgui_add_key_event(map_keycode, keycode, true); + + Take note that modifiers (shift, ctrl, etc.) must be updated manually. + + These are useful for running your code on a platform other than sokol_app. + If sokol_app is being used, events will be handled for you. + + LICENSE ======= @@ -332,6 +356,15 @@ typedef struct simgui_frame_desc_t { SOKOL_IMGUI_API_DECL void simgui_setup(const simgui_desc_t* desc); SOKOL_IMGUI_API_DECL void simgui_new_frame(const simgui_frame_desc_t* desc); SOKOL_IMGUI_API_DECL void simgui_render(void); +SOKOL_IMGUI_API_DECL void simgui_add_focus_event(bool focus); +SOKOL_IMGUI_API_DECL void simgui_add_mouse_pos_event(float x, float y); +SOKOL_IMGUI_API_DECL void simgui_add_touch_pos_event(float x, float y); +SOKOL_IMGUI_API_DECL void simgui_add_mouse_button_event(int mouse_button, bool down); +SOKOL_IMGUI_API_DECL void simgui_add_mouse_wheel_event(float wheel_x, float wheel_y); +SOKOL_IMGUI_API_DECL void simgui_add_key_event(int (*map_keycode)(int), int keycode, bool down); +SOKOL_IMGUI_API_DECL void simgui_add_input_character(uint32_t c); +SOKOL_IMGUI_API_DECL void simgui_add_input_characters_utf8(const char* c); +SOKOL_IMGUI_API_DECL void simgui_add_touch_button_event(int mouse_button, bool down); #if !defined(SOKOL_IMGUI_NO_SOKOL_APP) SOKOL_IMGUI_API_DECL bool simgui_handle_event(const sapp_event* ev); SOKOL_IMGUI_API_DECL int simgui_map_keycode(sapp_keycode keycode); // returns ImGuiKey_* @@ -2137,21 +2170,25 @@ SOKOL_API_IMPL void simgui_render(void) { sg_pop_debug_group(); } -SOKOL_API_IMPL void simgui_add_focus_event(ImGuiIO* io, bool focus) { +SOKOL_API_IMPL void simgui_add_focus_event(bool focus) { #if defined(__cplusplus) + ImGuiIO* io = &ImGui::GetIO(); io->AddFocusEvent(focus); #else + ImGuiIO* io = igGetIO(); ImGuiIO_AddFocusEvent(io, focus); #endif } -SOKOL_API_IMPL void simgui_add_mouse_pos_event(ImGuiIO* io, float x, float y) { +SOKOL_API_IMPL void simgui_add_mouse_pos_event(float x, float y) { #if defined(__cplusplus) + ImGuiIO* io = &ImGui::GetIO(); #if (IMGUI_VERSION_NUM >= 18950) io->AddMouseSourceEvent(ImGuiMouseSource_Mouse); #endif io->AddMousePosEvent(x, y); #else + ImGuiIO* io = igGetIO(); #if (IMGUI_VERSION_NUM >= 18950) ImGuiIO_AddMouseSourceEvent(io, ImGuiMouseSource_Mouse); #endif @@ -2159,13 +2196,15 @@ SOKOL_API_IMPL void simgui_add_mouse_pos_event(ImGuiIO* io, float x, float y) { #endif } -SOKOL_API_IMPL void simgui_add_touch_pos_event(ImGuiIO* io, float x, float y) { +SOKOL_API_IMPL void simgui_add_touch_pos_event(float x, float y) { #if defined(__cplusplus) + ImGuiIO* io = &ImGui::GetIO(); #if (IMGUI_VERSION_NUM >= 18950) io->AddMouseSourceEvent(ImGuiMouseSource_TouchScreen); #endif io->AddMousePosEvent(x, y); #else + ImGuiIO* io = igGetIO(); #if (IMGUI_VERSION_NUM >= 18950) ImGuiIO_AddMouseSourceEvent(io, ImGuiMouseSource_TouchScreen); #endif @@ -2173,13 +2212,15 @@ SOKOL_API_IMPL void simgui_add_touch_pos_event(ImGuiIO* io, float x, float y) { #endif } -SOKOL_API_IMPL void simgui_add_mouse_button_event(ImGuiIO* io, int mouse_button, bool down) { +SOKOL_API_IMPL void simgui_add_mouse_button_event(int mouse_button, bool down) { #if defined(__cplusplus) + ImGuiIO* io = &ImGui::GetIO(); #if (IMGUI_VERSION_NUM >= 18950) io->AddMouseSourceEvent(ImGuiMouseSource_Mouse); #endif io->AddMouseButtonEvent(mouse_button, down); #else + ImGuiIO* io = igGetIO(); #if (IMGUI_VERSION_NUM >= 18950) ImGuiIO_AddMouseSourceEvent(io, ImGuiMouseSource_Mouse); #endif @@ -2187,13 +2228,15 @@ SOKOL_API_IMPL void simgui_add_mouse_button_event(ImGuiIO* io, int mouse_button, #endif } -SOKOL_API_IMPL void simgui_add_touch_button_event(ImGuiIO* io, int mouse_button, bool down) { +SOKOL_API_IMPL void simgui_add_touch_button_event(int mouse_button, bool down) { #if defined(__cplusplus) + ImGuiIO* io = &ImGui::GetIO(); #if (IMGUI_VERSION_NUM >= 18950) io->AddMouseSourceEvent(ImGuiMouseSource_TouchScreen); #endif io->AddMouseButtonEvent(mouse_button, down); #else + ImGuiIO* io = igGetIO(); #if (IMGUI_VERSION_NUM >= 18950) ImGuiIO_AddMouseSourceEvent(io, ImGuiMouseSource_TouchScreen); #endif @@ -2201,13 +2244,15 @@ SOKOL_API_IMPL void simgui_add_touch_button_event(ImGuiIO* io, int mouse_button, #endif } -SOKOL_API_IMPL void simgui_add_mouse_wheel_event(ImGuiIO* io, float wheel_x, float wheel_y) { +SOKOL_API_IMPL void simgui_add_mouse_wheel_event(float wheel_x, float wheel_y) { #if defined(__cplusplus) + ImGuiIO* io = &ImGui::GetIO(); #if (IMGUI_VERSION_NUM >= 18950) io->AddMouseSourceEvent(ImGuiMouseSource_Mouse); #endif io->AddMouseWheelEvent(wheel_x, wheel_y); #else + ImGuiIO* io = igGetIO(); #if (IMGUI_VERSION_NUM >= 18950) ImGuiIO_AddMouseSourceEvent(io, ImGuiMouseSource_Mouse); #endif @@ -2215,46 +2260,39 @@ SOKOL_API_IMPL void simgui_add_mouse_wheel_event(ImGuiIO* io, float wheel_x, flo #endif } -SOKOL_API_IMPL void simgui_add_key_event(ImGuiIO* io, int (*map_keycode)(int), int keycode, bool down) { +SOKOL_API_IMPL void simgui_add_key_event(int (*map_keycode)(int), int keycode, bool down) { const ImGuiKey imgui_key = (ImGuiKey)map_keycode(keycode); #if defined(__cplusplus) + ImGuiIO* io = &ImGui::GetIO(); io->AddKeyEvent(imgui_key, down); io->SetKeyEventNativeData(imgui_key, keycode, 0, -1); #else + ImGuiIO* io = igGetIO(); ImGuiIO_AddKeyEvent(io, imgui_key, down); ImGuiIO_SetKeyEventNativeData(io, imgui_key, keycode, 0, -1); #endif } -SOKOL_API_IMPL void simgui_add_imgui_key_event(ImGuiIO* io, ImGuiKey imgui_key, bool down) { - #if defined(__cplusplus) - io->AddKeyEvent(imgui_key, down); - #else - ImGuiIO_AddKeyEvent(io, imgui_key, down); - #endif -} - -SOKOL_API_IMPL void simgui_add_input_character(ImGuiIO* io, uint32_t c) { +SOKOL_API_IMPL void simgui_add_input_character(uint32_t c) { #if defined(__cplusplus) + ImGuiIO* io = &ImGui::GetIO(); io->AddInputCharacter(c); #else + ImGuiIO* io = igGetIO(); ImGuiIO_AddInputCharacter(io, c); #endif } -SOKOL_API_IMPL void simgui_add_input_characters_utf8(ImGuiIO* io, const char* c) { +SOKOL_API_IMPL void simgui_add_input_characters_utf8(const char* c) { #if defined(__cplusplus) + ImGuiIO* io = &ImGui::GetIO(); io->AddInputCharactersUTF8(c); #else + ImGuiIO* io = igGetIO(); ImGuiIO_AddInputCharactersUTF8(io, c); #endif } -// returns Ctrl or Super, depending on platform -SOKOL_API_IMPL ImGuiKey simgui_copypaste_modifier(bool is_osx) { - return is_osx ? ImGuiMod_Super : ImGuiMod_Ctrl; -} - #if !defined(SOKOL_IMGUI_NO_SOKOL_APP) _SOKOL_PRIVATE bool _simgui_is_ctrl(uint32_t modifiers) { if (_simgui.is_osx) { @@ -2387,11 +2425,19 @@ _SOKOL_PRIVATE void _simgui_add_sapp_key_event(ImGuiIO* io, sapp_keycode sapp_ke #endif } +_SOKOL_PRIVATE void _simgui_add_imgui_key_event(ImGuiIO* io, ImGuiKey imgui_key, bool down) { + #if defined(__cplusplus) + io->AddKeyEvent(imgui_key, down); + #else + ImGuiIO_AddKeyEvent(io, imgui_key, down); + #endif +} + _SOKOL_PRIVATE void _simgui_update_modifiers(ImGuiIO* io, uint32_t mods) { - simgui_add_imgui_key_event(io, ImGuiMod_Ctrl, (mods & SAPP_MODIFIER_CTRL) != 0); - simgui_add_imgui_key_event(io, ImGuiMod_Shift, (mods & SAPP_MODIFIER_SHIFT) != 0); - simgui_add_imgui_key_event(io, ImGuiMod_Alt, (mods & SAPP_MODIFIER_ALT) != 0); - simgui_add_imgui_key_event(io, ImGuiMod_Super, (mods & SAPP_MODIFIER_SUPER) != 0); + _simgui_add_imgui_key_event(io, ImGuiMod_Ctrl, (mods & SAPP_MODIFIER_CTRL) != 0); + _simgui_add_imgui_key_event(io, ImGuiMod_Shift, (mods & SAPP_MODIFIER_SHIFT) != 0); + _simgui_add_imgui_key_event(io, ImGuiMod_Alt, (mods & SAPP_MODIFIER_ALT) != 0); + _simgui_add_imgui_key_event(io, ImGuiMod_Super, (mods & SAPP_MODIFIER_SUPER) != 0); } // returns Ctrl or Super, depending on platform @@ -2412,23 +2458,23 @@ SOKOL_API_IMPL bool simgui_handle_event(const sapp_event* ev) { #endif switch (ev->type) { case SAPP_EVENTTYPE_FOCUSED: - simgui_add_focus_event(io, true); + simgui_add_focus_event(true); break; case SAPP_EVENTTYPE_UNFOCUSED: - simgui_add_focus_event(io, false); + simgui_add_focus_event(false); break; case SAPP_EVENTTYPE_MOUSE_DOWN: - simgui_add_mouse_pos_event(io, ev->mouse_x / dpi_scale, ev->mouse_y / dpi_scale); - simgui_add_mouse_button_event(io, (int)ev->mouse_button, true); + simgui_add_mouse_pos_event(ev->mouse_x / dpi_scale, ev->mouse_y / dpi_scale); + simgui_add_mouse_button_event((int)ev->mouse_button, true); _simgui_update_modifiers(io, ev->modifiers); break; case SAPP_EVENTTYPE_MOUSE_UP: - simgui_add_mouse_pos_event(io, ev->mouse_x / dpi_scale, ev->mouse_y / dpi_scale); - simgui_add_mouse_button_event(io, (int)ev->mouse_button, false); + simgui_add_mouse_pos_event(ev->mouse_x / dpi_scale, ev->mouse_y / dpi_scale); + simgui_add_mouse_button_event((int)ev->mouse_button, false); _simgui_update_modifiers(io, ev->modifiers); break; case SAPP_EVENTTYPE_MOUSE_MOVE: - simgui_add_mouse_pos_event(io, ev->mouse_x / dpi_scale, ev->mouse_y / dpi_scale); + simgui_add_mouse_pos_event(ev->mouse_x / dpi_scale, ev->mouse_y / dpi_scale); break; case SAPP_EVENTTYPE_MOUSE_ENTER: case SAPP_EVENTTYPE_MOUSE_LEAVE: @@ -2439,26 +2485,26 @@ SOKOL_API_IMPL bool simgui_handle_event(const sapp_event* ev) { // "platform behaviour flags". #if defined(__EMSCRIPTEN__) for (int i = 0; i < SAPP_MAX_MOUSEBUTTONS; i++) { - simgui_add_mouse_button_event(io, i, false); + simgui_add_mouse_button_event(i, false); } #endif break; case SAPP_EVENTTYPE_MOUSE_SCROLL: - simgui_add_mouse_wheel_event(io, ev->scroll_x, ev->scroll_y); + simgui_add_mouse_wheel_event(ev->scroll_x, ev->scroll_y); break; case SAPP_EVENTTYPE_TOUCHES_BEGAN: - simgui_add_touch_pos_event(io, ev->touches[0].pos_x / dpi_scale, ev->touches[0].pos_y / dpi_scale); - simgui_add_touch_button_event(io, 0, true); + simgui_add_touch_pos_event(ev->touches[0].pos_x / dpi_scale, ev->touches[0].pos_y / dpi_scale); + simgui_add_touch_button_event(0, true); break; case SAPP_EVENTTYPE_TOUCHES_MOVED: - simgui_add_touch_pos_event(io, ev->touches[0].pos_x / dpi_scale, ev->touches[0].pos_y / dpi_scale); + simgui_add_touch_pos_event(ev->touches[0].pos_x / dpi_scale, ev->touches[0].pos_y / dpi_scale); break; case SAPP_EVENTTYPE_TOUCHES_ENDED: - simgui_add_touch_pos_event(io, ev->touches[0].pos_x / dpi_scale, ev->touches[0].pos_y / dpi_scale); - simgui_add_touch_button_event(io, 0, false); + simgui_add_touch_pos_event(ev->touches[0].pos_x / dpi_scale, ev->touches[0].pos_y / dpi_scale); + simgui_add_touch_button_event(0, false); break; case SAPP_EVENTTYPE_TOUCHES_CANCELLED: - simgui_add_touch_button_event(io, 0, false); + simgui_add_touch_button_event(0, false); break; case SAPP_EVENTTYPE_KEY_DOWN: _simgui_update_modifiers(io, ev->modifiers); @@ -2505,16 +2551,16 @@ SOKOL_API_IMPL bool simgui_handle_event(const sapp_event* ev) { (ev->char_code != 127) && (0 == (ev->modifiers & (SAPP_MODIFIER_ALT|SAPP_MODIFIER_CTRL|SAPP_MODIFIER_SUPER)))) { - simgui_add_input_character(io, ev->char_code); + simgui_add_input_character(ev->char_code); } break; case SAPP_EVENTTYPE_CLIPBOARD_PASTED: /* simulate a Ctrl-V key down/up */ if (!_simgui.desc.disable_paste_override) { - simgui_add_imgui_key_event(io, _simgui_copypaste_modifier(), true); - simgui_add_imgui_key_event(io, ImGuiKey_V, true); - simgui_add_imgui_key_event(io, ImGuiKey_V, false); - simgui_add_imgui_key_event(io, _simgui_copypaste_modifier(), false); + _simgui_add_imgui_key_event(io, _simgui_copypaste_modifier(), true); + _simgui_add_imgui_key_event(io, ImGuiKey_V, true); + _simgui_add_imgui_key_event(io, ImGuiKey_V, false); + _simgui_add_imgui_key_event(io, _simgui_copypaste_modifier(), false); } break; default: