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]