Skip to content

Commit

Permalink
added function prototypes, removed imguikey function, and added docum…
Browse files Browse the repository at this point in the history
…entation blurb
  • Loading branch information
benjitrosch committed Jul 11, 2023
1 parent f74c77a commit 7a76a0c
Showing 1 changed file with 92 additions and 46 deletions.
138 changes: 92 additions & 46 deletions util/sokol_imgui.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
=======
Expand Down Expand Up @@ -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_*
Expand Down Expand Up @@ -2137,124 +2170,129 @@ 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
ImGuiIO_AddMousePosEvent(io, x, 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
ImGuiIO_AddMousePosEvent(io, x, 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
ImGuiIO_AddMouseButtonEvent(io, mouse_button, down);
#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
ImGuiIO_AddMouseButtonEvent(io, mouse_button, down);
#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
ImGuiIO_AddMouseWheelEvent(io, wheel_x, wheel_y);
#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) {
Expand Down Expand Up @@ -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
Expand All @@ -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:
Expand All @@ -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);
Expand Down Expand Up @@ -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:
Expand Down

0 comments on commit 7a76a0c

Please sign in to comment.