78#pragma clang diagnostic push
79#pragma clang diagnostic ignored "-Wold-style-cast"
80#pragma clang diagnostic ignored "-Wsign-conversion"
84#include <GLFW/glfw3.h>
88#ifndef GLFW_EXPOSE_NATIVE_WIN32
89#define GLFW_EXPOSE_NATIVE_WIN32
91#include <GLFW/glfw3native.h>
94#ifndef GLFW_EXPOSE_NATIVE_COCOA
95#define GLFW_EXPOSE_NATIVE_COCOA
97#include <GLFW/glfw3native.h>
101#include <emscripten.h>
102#include <emscripten/html5.h>
106#define GLFW_VERSION_COMBINED (GLFW_VERSION_MAJOR * 1000 + GLFW_VERSION_MINOR * 100 + GLFW_VERSION_REVISION)
107#ifdef GLFW_RESIZE_NESW_CURSOR
108#define GLFW_HAS_NEW_CURSORS (GLFW_VERSION_COMBINED >= 3400)
110#define GLFW_HAS_NEW_CURSORS (0)
112#define GLFW_HAS_GAMEPAD_API (GLFW_VERSION_COMBINED >= 3300)
113#define GLFW_HAS_GETKEYNAME (GLFW_VERSION_COMBINED >= 3200)
114#define GLFW_HAS_GETERROR (GLFW_VERSION_COMBINED >= 3300)
135 const char* CanvasSelector;
163 return ImGui::GetCurrentContext() ? (
ImGui_ImplGlfw_Data*)ImGui::GetIO().BackendPlatformUserData :
nullptr;
169 return glfwGetClipboardString((GLFWwindow*)user_data);
174 glfwSetClipboardString((GLFWwindow*)user_data, text);
181 case GLFW_KEY_TAB:
return ImGuiKey_Tab;
182 case GLFW_KEY_LEFT:
return ImGuiKey_LeftArrow;
183 case GLFW_KEY_RIGHT:
return ImGuiKey_RightArrow;
184 case GLFW_KEY_UP:
return ImGuiKey_UpArrow;
185 case GLFW_KEY_DOWN:
return ImGuiKey_DownArrow;
186 case GLFW_KEY_PAGE_UP:
return ImGuiKey_PageUp;
187 case GLFW_KEY_PAGE_DOWN:
return ImGuiKey_PageDown;
188 case GLFW_KEY_HOME:
return ImGuiKey_Home;
189 case GLFW_KEY_END:
return ImGuiKey_End;
190 case GLFW_KEY_INSERT:
return ImGuiKey_Insert;
191 case GLFW_KEY_DELETE:
return ImGuiKey_Delete;
192 case GLFW_KEY_BACKSPACE:
return ImGuiKey_Backspace;
193 case GLFW_KEY_SPACE:
return ImGuiKey_Space;
194 case GLFW_KEY_ENTER:
return ImGuiKey_Enter;
195 case GLFW_KEY_ESCAPE:
return ImGuiKey_Escape;
196 case GLFW_KEY_APOSTROPHE:
return ImGuiKey_Apostrophe;
197 case GLFW_KEY_COMMA:
return ImGuiKey_Comma;
198 case GLFW_KEY_MINUS:
return ImGuiKey_Minus;
199 case GLFW_KEY_PERIOD:
return ImGuiKey_Period;
200 case GLFW_KEY_SLASH:
return ImGuiKey_Slash;
201 case GLFW_KEY_SEMICOLON:
return ImGuiKey_Semicolon;
202 case GLFW_KEY_EQUAL:
return ImGuiKey_Equal;
203 case GLFW_KEY_LEFT_BRACKET:
return ImGuiKey_LeftBracket;
204 case GLFW_KEY_BACKSLASH:
return ImGuiKey_Backslash;
205 case GLFW_KEY_RIGHT_BRACKET:
return ImGuiKey_RightBracket;
206 case GLFW_KEY_GRAVE_ACCENT:
return ImGuiKey_GraveAccent;
207 case GLFW_KEY_CAPS_LOCK:
return ImGuiKey_CapsLock;
208 case GLFW_KEY_SCROLL_LOCK:
return ImGuiKey_ScrollLock;
209 case GLFW_KEY_NUM_LOCK:
return ImGuiKey_NumLock;
210 case GLFW_KEY_PRINT_SCREEN:
return ImGuiKey_PrintScreen;
211 case GLFW_KEY_PAUSE:
return ImGuiKey_Pause;
212 case GLFW_KEY_KP_0:
return ImGuiKey_Keypad0;
213 case GLFW_KEY_KP_1:
return ImGuiKey_Keypad1;
214 case GLFW_KEY_KP_2:
return ImGuiKey_Keypad2;
215 case GLFW_KEY_KP_3:
return ImGuiKey_Keypad3;
216 case GLFW_KEY_KP_4:
return ImGuiKey_Keypad4;
217 case GLFW_KEY_KP_5:
return ImGuiKey_Keypad5;
218 case GLFW_KEY_KP_6:
return ImGuiKey_Keypad6;
219 case GLFW_KEY_KP_7:
return ImGuiKey_Keypad7;
220 case GLFW_KEY_KP_8:
return ImGuiKey_Keypad8;
221 case GLFW_KEY_KP_9:
return ImGuiKey_Keypad9;
222 case GLFW_KEY_KP_DECIMAL:
return ImGuiKey_KeypadDecimal;
223 case GLFW_KEY_KP_DIVIDE:
return ImGuiKey_KeypadDivide;
224 case GLFW_KEY_KP_MULTIPLY:
return ImGuiKey_KeypadMultiply;
225 case GLFW_KEY_KP_SUBTRACT:
return ImGuiKey_KeypadSubtract;
226 case GLFW_KEY_KP_ADD:
return ImGuiKey_KeypadAdd;
227 case GLFW_KEY_KP_ENTER:
return ImGuiKey_KeypadEnter;
228 case GLFW_KEY_KP_EQUAL:
return ImGuiKey_KeypadEqual;
229 case GLFW_KEY_LEFT_SHIFT:
return ImGuiKey_LeftShift;
230 case GLFW_KEY_LEFT_CONTROL:
return ImGuiKey_LeftCtrl;
231 case GLFW_KEY_LEFT_ALT:
return ImGuiKey_LeftAlt;
232 case GLFW_KEY_LEFT_SUPER:
return ImGuiKey_LeftSuper;
233 case GLFW_KEY_RIGHT_SHIFT:
return ImGuiKey_RightShift;
234 case GLFW_KEY_RIGHT_CONTROL:
return ImGuiKey_RightCtrl;
235 case GLFW_KEY_RIGHT_ALT:
return ImGuiKey_RightAlt;
236 case GLFW_KEY_RIGHT_SUPER:
return ImGuiKey_RightSuper;
237 case GLFW_KEY_MENU:
return ImGuiKey_Menu;
238 case GLFW_KEY_0:
return ImGuiKey_0;
239 case GLFW_KEY_1:
return ImGuiKey_1;
240 case GLFW_KEY_2:
return ImGuiKey_2;
241 case GLFW_KEY_3:
return ImGuiKey_3;
242 case GLFW_KEY_4:
return ImGuiKey_4;
243 case GLFW_KEY_5:
return ImGuiKey_5;
244 case GLFW_KEY_6:
return ImGuiKey_6;
245 case GLFW_KEY_7:
return ImGuiKey_7;
246 case GLFW_KEY_8:
return ImGuiKey_8;
247 case GLFW_KEY_9:
return ImGuiKey_9;
248 case GLFW_KEY_A:
return ImGuiKey_A;
249 case GLFW_KEY_B:
return ImGuiKey_B;
250 case GLFW_KEY_C:
return ImGuiKey_C;
251 case GLFW_KEY_D:
return ImGuiKey_D;
252 case GLFW_KEY_E:
return ImGuiKey_E;
253 case GLFW_KEY_F:
return ImGuiKey_F;
254 case GLFW_KEY_G:
return ImGuiKey_G;
255 case GLFW_KEY_H:
return ImGuiKey_H;
256 case GLFW_KEY_I:
return ImGuiKey_I;
257 case GLFW_KEY_J:
return ImGuiKey_J;
258 case GLFW_KEY_K:
return ImGuiKey_K;
259 case GLFW_KEY_L:
return ImGuiKey_L;
260 case GLFW_KEY_M:
return ImGuiKey_M;
261 case GLFW_KEY_N:
return ImGuiKey_N;
262 case GLFW_KEY_O:
return ImGuiKey_O;
263 case GLFW_KEY_P:
return ImGuiKey_P;
264 case GLFW_KEY_Q:
return ImGuiKey_Q;
265 case GLFW_KEY_R:
return ImGuiKey_R;
266 case GLFW_KEY_S:
return ImGuiKey_S;
267 case GLFW_KEY_T:
return ImGuiKey_T;
268 case GLFW_KEY_U:
return ImGuiKey_U;
269 case GLFW_KEY_V:
return ImGuiKey_V;
270 case GLFW_KEY_W:
return ImGuiKey_W;
271 case GLFW_KEY_X:
return ImGuiKey_X;
272 case GLFW_KEY_Y:
return ImGuiKey_Y;
273 case GLFW_KEY_Z:
return ImGuiKey_Z;
274 case GLFW_KEY_F1:
return ImGuiKey_F1;
275 case GLFW_KEY_F2:
return ImGuiKey_F2;
276 case GLFW_KEY_F3:
return ImGuiKey_F3;
277 case GLFW_KEY_F4:
return ImGuiKey_F4;
278 case GLFW_KEY_F5:
return ImGuiKey_F5;
279 case GLFW_KEY_F6:
return ImGuiKey_F6;
280 case GLFW_KEY_F7:
return ImGuiKey_F7;
281 case GLFW_KEY_F8:
return ImGuiKey_F8;
282 case GLFW_KEY_F9:
return ImGuiKey_F9;
283 case GLFW_KEY_F10:
return ImGuiKey_F10;
284 case GLFW_KEY_F11:
return ImGuiKey_F11;
285 case GLFW_KEY_F12:
return ImGuiKey_F12;
286 case GLFW_KEY_F13:
return ImGuiKey_F13;
287 case GLFW_KEY_F14:
return ImGuiKey_F14;
288 case GLFW_KEY_F15:
return ImGuiKey_F15;
289 case GLFW_KEY_F16:
return ImGuiKey_F16;
290 case GLFW_KEY_F17:
return ImGuiKey_F17;
291 case GLFW_KEY_F18:
return ImGuiKey_F18;
292 case GLFW_KEY_F19:
return ImGuiKey_F19;
293 case GLFW_KEY_F20:
return ImGuiKey_F20;
294 case GLFW_KEY_F21:
return ImGuiKey_F21;
295 case GLFW_KEY_F22:
return ImGuiKey_F22;
296 case GLFW_KEY_F23:
return ImGuiKey_F23;
297 case GLFW_KEY_F24:
return ImGuiKey_F24;
298 default:
return ImGuiKey_None;
306 ImGuiIO& io = ImGui::GetIO();
307 io.AddKeyEvent(ImGuiMod_Ctrl, (glfwGetKey(window, GLFW_KEY_LEFT_CONTROL) == GLFW_PRESS) || (glfwGetKey(window, GLFW_KEY_RIGHT_CONTROL) == GLFW_PRESS));
308 io.AddKeyEvent(ImGuiMod_Shift, (glfwGetKey(window, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS) || (glfwGetKey(window, GLFW_KEY_RIGHT_SHIFT) == GLFW_PRESS));
309 io.AddKeyEvent(ImGuiMod_Alt, (glfwGetKey(window, GLFW_KEY_LEFT_ALT) == GLFW_PRESS) || (glfwGetKey(window, GLFW_KEY_RIGHT_ALT) == GLFW_PRESS));
310 io.AddKeyEvent(ImGuiMod_Super, (glfwGetKey(window, GLFW_KEY_LEFT_SUPER) == GLFW_PRESS) || (glfwGetKey(window, GLFW_KEY_RIGHT_SUPER) == GLFW_PRESS));
327 ImGuiIO& io = ImGui::GetIO();
328 if (button >= 0 && button < ImGuiMouseButton_COUNT)
329 io.AddMouseButtonEvent(button, action == GLFW_PRESS);
343 ImGuiIO& io = ImGui::GetIO();
344 io.AddMouseWheelEvent((
float)xoffset, (
float)yoffset);
349#if GLFW_HAS_GETKEYNAME && !defined(__EMSCRIPTEN__)
355 if (key >= GLFW_KEY_KP_0 && key <= GLFW_KEY_KP_EQUAL)
357 GLFWerrorfun prev_error_callback = glfwSetErrorCallback(
nullptr);
358 const char* key_name = glfwGetKeyName(key, scancode);
359 glfwSetErrorCallback(prev_error_callback);
360#if GLFW_HAS_GETERROR && !defined(__EMSCRIPTEN__)
361 (void)glfwGetError(
nullptr);
363 if (key_name && key_name[0] != 0 && key_name[1] == 0)
365 const char char_names[] =
"`-=[]\\,;\'./";
366 const int char_keys[] = { GLFW_KEY_GRAVE_ACCENT, GLFW_KEY_MINUS, GLFW_KEY_EQUAL, GLFW_KEY_LEFT_BRACKET, GLFW_KEY_RIGHT_BRACKET, GLFW_KEY_BACKSLASH, GLFW_KEY_COMMA, GLFW_KEY_SEMICOLON, GLFW_KEY_APOSTROPHE, GLFW_KEY_PERIOD, GLFW_KEY_SLASH, 0 };
367 IM_ASSERT(IM_ARRAYSIZE(char_names) == IM_ARRAYSIZE(char_keys));
368 if (key_name[0] >=
'0' && key_name[0] <=
'9') { key = GLFW_KEY_0 + (key_name[0] -
'0'); }
369 else if (key_name[0] >=
'A' && key_name[0] <=
'Z') { key = GLFW_KEY_A + (key_name[0] -
'A'); }
370 else if (key_name[0] >=
'a' && key_name[0] <=
'z') { key = GLFW_KEY_A + (key_name[0] -
'a'); }
371 else if (
const char* p = strchr(char_names, key_name[0])) { key = char_keys[p - char_names]; }
386 if (action != GLFW_PRESS && action != GLFW_RELEASE)
393 ImGuiIO& io = ImGui::GetIO();
395 io.AddKeyEvent(imgui_key, (action == GLFW_PRESS));
396 io.SetKeyEventNativeData(imgui_key, keycode, scancode);
405 ImGuiIO& io = ImGui::GetIO();
406 io.AddFocusEvent(focused != 0);
415 ImGuiIO& io = ImGui::GetIO();
416 io.AddMousePosEvent((
float)x, (
float)y);
428 ImGuiIO& io = ImGui::GetIO();
438 io.AddMousePosEvent(-FLT_MAX, -FLT_MAX);
448 ImGuiIO& io = ImGui::GetIO();
449 io.AddInputCharacter(c);
458static EM_BOOL ImGui_ImplEmscripten_WheelCallback(
int,
const EmscriptenWheelEvent* ev,
void*)
462 float multiplier = 0.0f;
463 if (ev->deltaMode == DOM_DELTA_PIXEL) { multiplier = 1.0f / 100.0f; }
464 else if (ev->deltaMode == DOM_DELTA_LINE) { multiplier = 1.0f / 3.0f; }
465 else if (ev->deltaMode == DOM_DELTA_PAGE) { multiplier = 80.0f; }
466 float wheel_x = ev->deltaX * -multiplier;
467 float wheel_y = ev->deltaY * -multiplier;
468 ImGuiIO& io = ImGui::GetIO();
469 io.AddMouseWheelEvent(wheel_x, wheel_y);
478static ImGuiMouseSource GetMouseSourceFromMessageExtraInfo()
480 LPARAM extra_info = ::GetMessageExtraInfo();
481 if ((extra_info & 0xFFFFFF80) == 0xFF515700)
482 return ImGuiMouseSource_Pen;
483 if ((extra_info & 0xFFFFFF80) == 0xFF515780)
484 return ImGuiMouseSource_TouchScreen;
485 return ImGuiMouseSource_Mouse;
487static LRESULT CALLBACK ImGui_ImplGlfw_WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
492 case WM_MOUSEMOVE:
case WM_NCMOUSEMOVE:
493 case WM_LBUTTONDOWN:
case WM_LBUTTONDBLCLK:
case WM_LBUTTONUP:
494 case WM_RBUTTONDOWN:
case WM_RBUTTONDBLCLK:
case WM_RBUTTONUP:
495 case WM_MBUTTONDOWN:
case WM_MBUTTONDBLCLK:
case WM_MBUTTONUP:
496 case WM_XBUTTONDOWN:
case WM_XBUTTONDBLCLK:
case WM_XBUTTONUP:
497 ImGui::GetIO().AddMouseSourceEvent(GetMouseSourceFromMessageExtraInfo());
500 return ::CallWindowProcW(bd->GlfwWndProc, hWnd, msg, wParam, lParam);
508 IM_ASSERT(bd->
Window == window);
525 IM_ASSERT(bd->
Window == window);
558 ImGuiIO& io = ImGui::GetIO();
559 IMGUI_CHECKVERSION();
560 IM_ASSERT(io.BackendPlatformUserData ==
nullptr &&
"Already initialized a platform backend!");
565 io.BackendPlatformUserData = (
void*)bd;
566 io.BackendPlatformName =
"imgui_impl_glfw";
567 io.BackendFlags |= ImGuiBackendFlags_HasMouseCursors;
568 io.BackendFlags |= ImGuiBackendFlags_HasSetMousePos;
575 io.ClipboardUserData = bd->
Window;
581 GLFWerrorfun prev_error_callback = glfwSetErrorCallback(
nullptr);
582 bd->
MouseCursors[ImGuiMouseCursor_Arrow] = glfwCreateStandardCursor(GLFW_ARROW_CURSOR);
583 bd->
MouseCursors[ImGuiMouseCursor_TextInput] = glfwCreateStandardCursor(GLFW_IBEAM_CURSOR);
584 bd->
MouseCursors[ImGuiMouseCursor_ResizeNS] = glfwCreateStandardCursor(GLFW_VRESIZE_CURSOR);
585 bd->
MouseCursors[ImGuiMouseCursor_ResizeEW] = glfwCreateStandardCursor(GLFW_HRESIZE_CURSOR);
586 bd->
MouseCursors[ImGuiMouseCursor_Hand] = glfwCreateStandardCursor(GLFW_HAND_CURSOR);
587#if GLFW_HAS_NEW_CURSORS
588 bd->
MouseCursors[ImGuiMouseCursor_ResizeAll] = glfwCreateStandardCursor(GLFW_RESIZE_ALL_CURSOR);
589 bd->
MouseCursors[ImGuiMouseCursor_ResizeNESW] = glfwCreateStandardCursor(GLFW_RESIZE_NESW_CURSOR);
590 bd->
MouseCursors[ImGuiMouseCursor_ResizeNWSE] = glfwCreateStandardCursor(GLFW_RESIZE_NWSE_CURSOR);
591 bd->
MouseCursors[ImGuiMouseCursor_NotAllowed] = glfwCreateStandardCursor(GLFW_NOT_ALLOWED_CURSOR);
593 bd->
MouseCursors[ImGuiMouseCursor_ResizeAll] = glfwCreateStandardCursor(GLFW_ARROW_CURSOR);
594 bd->
MouseCursors[ImGuiMouseCursor_ResizeNESW] = glfwCreateStandardCursor(GLFW_ARROW_CURSOR);
595 bd->
MouseCursors[ImGuiMouseCursor_ResizeNWSE] = glfwCreateStandardCursor(GLFW_ARROW_CURSOR);
596 bd->
MouseCursors[ImGuiMouseCursor_NotAllowed] = glfwCreateStandardCursor(GLFW_ARROW_CURSOR);
598 glfwSetErrorCallback(prev_error_callback);
599#if GLFW_HAS_GETERROR && !defined(__EMSCRIPTEN__)
600 (void)glfwGetError(
nullptr);
604 if (install_callbacks)
610 emscripten_set_wheel_callback(EMSCRIPTEN_EVENT_TARGET_DOCUMENT,
nullptr,
false, ImGui_ImplEmscripten_WheelCallback);
614 ImGuiViewport* main_viewport = ImGui::GetMainViewport();
616 main_viewport->PlatformHandleRaw = glfwGetWin32Window(bd->
Window);
617#elif defined(__APPLE__)
618 main_viewport->PlatformHandleRaw = (
void*)glfwGetCocoaWindow(bd->
Window);
620 IM_UNUSED(main_viewport);
625 bd->GlfwWndProc = (WNDPROC)::GetWindowLongPtrW((HWND)main_viewport->PlatformHandleRaw, GWLP_WNDPROC);
626 IM_ASSERT(bd->GlfwWndProc !=
nullptr);
627 ::SetWindowLongPtrW((HWND)main_viewport->PlatformHandleRaw, GWLP_WNDPROC, (LONG_PTR)ImGui_ImplGlfw_WndProc);
652 IM_ASSERT(bd !=
nullptr &&
"No platform backend to shutdown, or already shutdown?");
653 ImGuiIO& io = ImGui::GetIO();
658 emscripten_set_wheel_callback(EMSCRIPTEN_EVENT_TARGET_DOCUMENT,
nullptr,
false,
nullptr);
661 for (ImGuiMouseCursor cursor_n = 0; cursor_n < ImGuiMouseCursor_COUNT; cursor_n++)
666 ImGuiViewport* main_viewport = ImGui::GetMainViewport();
667 ::SetWindowLongPtrW((HWND)main_viewport->PlatformHandleRaw, GWLP_WNDPROC, (LONG_PTR)bd->GlfwWndProc);
668 bd->GlfwWndProc =
nullptr;
671 io.BackendPlatformName =
nullptr;
672 io.BackendPlatformUserData =
nullptr;
673 io.BackendFlags &= ~(ImGuiBackendFlags_HasMouseCursors | ImGuiBackendFlags_HasSetMousePos | ImGuiBackendFlags_HasGamepad);
680 ImGuiIO& io = ImGui::GetIO();
684 GLFWwindow* window = bd->
Window;
686 const bool is_window_focused =
true;
688 const bool is_window_focused = glfwGetWindowAttrib(window, GLFW_FOCUSED) != 0;
690 if (is_window_focused)
693 if (io.WantSetMousePos)
694 glfwSetCursorPos(window, (
double)io.MousePos.x, (
double)io.MousePos.y);
699 double mouse_x, mouse_y;
700 glfwGetCursorPos(window, &mouse_x, &mouse_y);
702 io.AddMousePosEvent((
float)mouse_x, (
float)mouse_y);
710 ImGuiIO& io = ImGui::GetIO();
712 if ((io.ConfigFlags & ImGuiConfigFlags_NoMouseCursorChange) || glfwGetInputMode(bd->
Window, GLFW_CURSOR) == GLFW_CURSOR_DISABLED)
715 ImGuiMouseCursor imgui_cursor = ImGui::GetMouseCursor();
718 GLFWwindow* window = bd->
Window;
719 if (imgui_cursor == ImGuiMouseCursor_None || io.MouseDrawCursor)
722 glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_HIDDEN);
729 glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_NORMAL);
735static inline float Saturate(
float v) {
return v < 0.0f ? 0.0f : v > 1.0f ? 1.0f : v; }
738 ImGuiIO& io = ImGui::GetIO();
739 if ((io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) == 0)
742 io.BackendFlags &= ~ImGuiBackendFlags_HasGamepad;
743#if GLFW_HAS_GAMEPAD_API && !defined(__EMSCRIPTEN__)
744 GLFWgamepadstate gamepad;
745 if (!glfwGetGamepadState(GLFW_JOYSTICK_1, &gamepad))
747 #define MAP_BUTTON(KEY_NO, BUTTON_NO, _UNUSED) do { io.AddKeyEvent(KEY_NO, gamepad.buttons[BUTTON_NO] != 0); } while (0)
748 #define MAP_ANALOG(KEY_NO, AXIS_NO, _UNUSED, V0, V1) do { float v = gamepad.axes[AXIS_NO]; v = (v - V0) / (V1 - V0); io.AddKeyAnalogEvent(KEY_NO, v > 0.10f, Saturate(v)); } while (0)
750 int axes_count = 0, buttons_count = 0;
751 const float* axes = glfwGetJoystickAxes(GLFW_JOYSTICK_1, &axes_count);
752 const unsigned char* buttons = glfwGetJoystickButtons(GLFW_JOYSTICK_1, &buttons_count);
753 if (axes_count == 0 || buttons_count == 0)
755 #define MAP_BUTTON(KEY_NO, _UNUSED, BUTTON_NO) do { io.AddKeyEvent(KEY_NO, (buttons_count > BUTTON_NO && buttons[BUTTON_NO] == GLFW_PRESS)); } while (0)
756 #define MAP_ANALOG(KEY_NO, _UNUSED, AXIS_NO, V0, V1) do { float v = (axes_count > AXIS_NO) ? axes[AXIS_NO] : V0; v = (v - V0) / (V1 - V0); io.AddKeyAnalogEvent(KEY_NO, v > 0.10f, Saturate(v)); } while (0)
758 io.BackendFlags |= ImGuiBackendFlags_HasGamepad;
759 MAP_BUTTON(ImGuiKey_GamepadStart, GLFW_GAMEPAD_BUTTON_START, 7);
760 MAP_BUTTON(ImGuiKey_GamepadBack, GLFW_GAMEPAD_BUTTON_BACK, 6);
761 MAP_BUTTON(ImGuiKey_GamepadFaceLeft, GLFW_GAMEPAD_BUTTON_X, 2);
762 MAP_BUTTON(ImGuiKey_GamepadFaceRight, GLFW_GAMEPAD_BUTTON_B, 1);
763 MAP_BUTTON(ImGuiKey_GamepadFaceUp, GLFW_GAMEPAD_BUTTON_Y, 3);
764 MAP_BUTTON(ImGuiKey_GamepadFaceDown, GLFW_GAMEPAD_BUTTON_A, 0);
765 MAP_BUTTON(ImGuiKey_GamepadDpadLeft, GLFW_GAMEPAD_BUTTON_DPAD_LEFT, 13);
766 MAP_BUTTON(ImGuiKey_GamepadDpadRight, GLFW_GAMEPAD_BUTTON_DPAD_RIGHT, 11);
767 MAP_BUTTON(ImGuiKey_GamepadDpadUp, GLFW_GAMEPAD_BUTTON_DPAD_UP, 10);
768 MAP_BUTTON(ImGuiKey_GamepadDpadDown, GLFW_GAMEPAD_BUTTON_DPAD_DOWN, 12);
769 MAP_BUTTON(ImGuiKey_GamepadL1, GLFW_GAMEPAD_BUTTON_LEFT_BUMPER, 4);
770 MAP_BUTTON(ImGuiKey_GamepadR1, GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER, 5);
771 MAP_ANALOG(ImGuiKey_GamepadL2, GLFW_GAMEPAD_AXIS_LEFT_TRIGGER, 4, -0.75f, +1.0f);
772 MAP_ANALOG(ImGuiKey_GamepadR2, GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER, 5, -0.75f, +1.0f);
773 MAP_BUTTON(ImGuiKey_GamepadL3, GLFW_GAMEPAD_BUTTON_LEFT_THUMB, 8);
774 MAP_BUTTON(ImGuiKey_GamepadR3, GLFW_GAMEPAD_BUTTON_RIGHT_THUMB, 9);
775 MAP_ANALOG(ImGuiKey_GamepadLStickLeft, GLFW_GAMEPAD_AXIS_LEFT_X, 0, -0.25f, -1.0f);
776 MAP_ANALOG(ImGuiKey_GamepadLStickRight, GLFW_GAMEPAD_AXIS_LEFT_X, 0, +0.25f, +1.0f);
777 MAP_ANALOG(ImGuiKey_GamepadLStickUp, GLFW_GAMEPAD_AXIS_LEFT_Y, 1, -0.25f, -1.0f);
778 MAP_ANALOG(ImGuiKey_GamepadLStickDown, GLFW_GAMEPAD_AXIS_LEFT_Y, 1, +0.25f, +1.0f);
779 MAP_ANALOG(ImGuiKey_GamepadRStickLeft, GLFW_GAMEPAD_AXIS_RIGHT_X, 2, -0.25f, -1.0f);
780 MAP_ANALOG(ImGuiKey_GamepadRStickRight, GLFW_GAMEPAD_AXIS_RIGHT_X, 2, +0.25f, +1.0f);
781 MAP_ANALOG(ImGuiKey_GamepadRStickUp, GLFW_GAMEPAD_AXIS_RIGHT_Y, 3, -0.25f, -1.0f);
782 MAP_ANALOG(ImGuiKey_GamepadRStickDown, GLFW_GAMEPAD_AXIS_RIGHT_Y, 3, +0.25f, +1.0f);
789 ImGuiIO& io = ImGui::GetIO();
791 IM_ASSERT(bd !=
nullptr &&
"Context or backend not initialized! Did you call ImGui_ImplGlfw_InitForXXX()?");
795 int display_w, display_h;
796 glfwGetWindowSize(bd->
Window, &w, &h);
797 glfwGetFramebufferSize(bd->
Window, &display_w, &display_h);
798 io.DisplaySize = ImVec2((
float)w, (
float)h);
800 io.DisplayFramebufferScale = ImVec2((
float)display_w / (
float)w, (
float)display_h / (
float)h);
804 double current_time = glfwGetTime();
805 if (current_time <= bd->Time)
806 current_time = bd->
Time + 0.00001f;
807 io.DeltaTime = bd->
Time > 0.0 ? (float)(current_time - bd->
Time) : (float)(1.0f / 60.0f);
808 bd->
Time = current_time;
818static EM_BOOL ImGui_ImplGlfw_OnCanvasSizeChange(
int event_type,
const EmscriptenUiEvent* event,
void* user_data)
821 double canvas_width, canvas_height;
822 emscripten_get_element_css_size(bd->CanvasSelector, &canvas_width, &canvas_height);
823 glfwSetWindowSize(bd->
Window, (
int)canvas_width, (
int)canvas_height);
827static EM_BOOL ImGui_ImplEmscripten_FullscreenChangeCallback(
int event_type,
const EmscriptenFullscreenChangeEvent* event,
void* user_data)
830 double canvas_width, canvas_height;
831 emscripten_get_element_css_size(bd->CanvasSelector, &canvas_width, &canvas_height);
832 glfwSetWindowSize(bd->
Window, (
int)canvas_width, (
int)canvas_height);
838void ImGui_ImplGlfw_InstallEmscriptenCanvasResizeCallback(
const char* canvas_selector)
840 IM_ASSERT(canvas_selector !=
nullptr);
842 IM_ASSERT(bd !=
nullptr &&
"Context or backend not initialized! Did you call ImGui_ImplGlfw_InitForXXX()?");
844 bd->CanvasSelector = canvas_selector;
845 emscripten_set_resize_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, bd,
false, ImGui_ImplGlfw_OnCanvasSizeChange);
846 emscripten_set_fullscreenchange_callback(EMSCRIPTEN_EVENT_TARGET_DOCUMENT, bd,
false, ImGui_ImplEmscripten_FullscreenChangeCallback);
849 ImGui_ImplGlfw_OnCanvasSizeChange(EMSCRIPTEN_EVENT_RESIZE, {}, bd);
855#if defined(__clang__)
856#pragma clang diagnostic pop
void ImGui_ImplGlfw_MouseButtonCallback(GLFWwindow *window, int button, int action, int mods)
void ImGui_ImplGlfw_NewFrame()
#define MAP_BUTTON(KEY_NO, _UNUSED, BUTTON_NO)
static bool ImGui_ImplGlfw_ShouldChainCallback(GLFWwindow *window)
void ImGui_ImplGlfw_CursorEnterCallback(GLFWwindow *window, int entered)
static int ImGui_ImplGlfw_TranslateUntranslatedKey(int key, int scancode)
bool ImGui_ImplGlfw_InitForOpenGL(GLFWwindow *window, bool install_callbacks)
static ImGui_ImplGlfw_Data * ImGui_ImplGlfw_GetBackendData()
static const char * ImGui_ImplGlfw_GetClipboardText(void *user_data)
void ImGui_ImplGlfw_ScrollCallback(GLFWwindow *window, double xoffset, double yoffset)
static bool ImGui_ImplGlfw_Init(GLFWwindow *window, bool install_callbacks, GlfwClientApi client_api)
void ImGui_ImplGlfw_WindowFocusCallback(GLFWwindow *window, int focused)
void ImGui_ImplGlfw_KeyCallback(GLFWwindow *window, int keycode, int scancode, int action, int mods)
static void ImGui_ImplGlfw_UpdateGamepads()
void ImGui_ImplGlfw_InstallCallbacks(GLFWwindow *window)
static float Saturate(float v)
static ImGuiKey ImGui_ImplGlfw_KeyToImGuiKey(int key)
static void ImGui_ImplGlfw_UpdateMouseCursor()
void ImGui_ImplGlfw_Shutdown()
void ImGui_ImplGlfw_MonitorCallback(GLFWmonitor *, int)
#define MAP_ANALOG(KEY_NO, _UNUSED, AXIS_NO, V0, V1)
void ImGui_ImplGlfw_RestoreCallbacks(GLFWwindow *window)
bool ImGui_ImplGlfw_InitForOther(GLFWwindow *window, bool install_callbacks)
static void ImGui_ImplGlfw_SetClipboardText(void *user_data, const char *text)
static void ImGui_ImplGlfw_UpdateKeyModifiers(GLFWwindow *window)
bool ImGui_ImplGlfw_InitForVulkan(GLFWwindow *window, bool install_callbacks)
static void ImGui_ImplGlfw_UpdateMouseData()
void ImGui_ImplGlfw_SetCallbacksChainForAllWindows(bool chain_for_all_windows)
void ImGui_ImplGlfw_CharCallback(GLFWwindow *window, unsigned int c)
void ImGui_ImplGlfw_CursorPosCallback(GLFWwindow *window, double x, double y)
GLFWcursorenterfun PrevUserCallbackCursorEnter
bool CallbacksChainForAllWindows
GLFWscrollfun PrevUserCallbackScroll
GLFWmousebuttonfun PrevUserCallbackMousebutton
GLFWcharfun PrevUserCallbackChar
GLFWcursorposfun PrevUserCallbackCursorPos
GLFWkeyfun PrevUserCallbackKey
GLFWmonitorfun PrevUserCallbackMonitor
GLFWwindowfocusfun PrevUserCallbackWindowFocus
GLFWcursor * MouseCursors[ImGuiMouseCursor_COUNT]