2#include "imgui/imgui_internal.h"
4#include <imgui_widgets/utils.h>
5#include <ospp/clipboard.h>
6#include <ospp/display_mode.h>
12#if !defined(_WINDOWS_)
13#define WIN32_LEAN_AND_MEAN
27#include <sys/sysctl.h>
32#pragma clang diagnostic push
33#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion"
37#if !defined(__EMSCRIPTEN__) && !defined(__ANDROID__) && !(defined(__APPLE__) && TARGET_OS_IOS) && \
38 !defined(__amigaos4__)
39#define OSPP_HAS_CAPTURE_AND_GLOBAL_MOUSE 1
41#define OSPP_HAS_CAPTURE_AND_GLOBAL_MOUSE 0
64static bool ImOsIsDebuggerPresent()
67 return ::IsDebuggerPresent() != 0;
68#elif defined(__linux__)
71 FILE* fp = fopen(
"/proc/self/status",
75 fread(buf, 1, IM_ARRAYSIZE(buf), fp);
77 buf[IM_ARRAYSIZE(buf) - 1] = 0;
78 if(
char* tracer_pid = strstr(buf,
"TracerPid:"))
81 while(isspace(*tracer_pid))
83 debugger_pid = atoi(tracer_pid);
85 return debugger_pid != 0;
86#elif defined(__APPLE__)
90 struct kinfo_proc info;
95 info.kp_proc.p_flag = 0;
98 mib[2] = KERN_PROC_PID;
102 junk = sysctl(mib,
sizeof(mib) /
sizeof(*mib), &info, &
size, NULL, 0);
103 IM_ASSERT(junk == 0);
106 return (info.kp_proc.p_flag & P_TRACED) != 0;
113static bool ImOsOpenInShell(ImGuiContext* ctx,
const char* path)
116 fs::show_in_graphical_env(p);
138 IM_ASSERT(
Window ==
nullptr);
144 if(viewport && viewport->PlatformUserData)
153static void ImGui_ImplOSPP_ForEachViewport(
156 ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
158 for(
int i = 0;
i != platform_io.Viewports.Size;
i++)
160 auto data = ImGui_ImplOSPP_GetViewportData(platform_io.Viewports[i]);
163 callback(platform_io.Viewports[i], data);
168static auto ImGui_ImplOSPP_GetViewportFromWindowId(uint32_t
id) -> ImGuiViewport*
170 ImGuiViewport* result{
nullptr};
171 ImGui_ImplOSPP_ForEachViewport(
186static auto ImGui_ImplOSPP_GetFocusedViewport() -> ImGuiViewport*
188 ImGuiViewport* result{
nullptr};
189 ImGui_ImplOSPP_ForEachViewport(
208 return ImGui::GetCurrentContext() ? (
ImGui_ImplOSPP_Data*)ImGui::GetIO().BackendPlatformUserData :
nullptr;
213 return reinterpret_cast<void*
>(uintptr_t(
id));
218 static const std::map<ImGuiMouseCursor, os::cursor::type> cursor_map = {
219 {ImGuiMouseCursor_Arrow, os::cursor::type::arrow},
220 {ImGuiMouseCursor_TextInput, os::cursor::type::ibeam},
221 {ImGuiMouseCursor_ResizeNS, os::cursor::type::size_ns},
222 {ImGuiMouseCursor_ResizeEW, os::cursor::type::size_we},
223 {ImGuiMouseCursor_ResizeNESW, os::cursor::type::size_nesw},
224 {ImGuiMouseCursor_ResizeNWSE, os::cursor::type::size_nwse},
225 {ImGuiMouseCursor_ResizeAll, os::cursor::type::size_all},
226 {ImGuiMouseCursor_Hand, os::cursor::type::hand},
227 {ImGuiMouseCursor_Wait, os::cursor::type::wait},
228 {ImGuiMouseCursor_Progress, os::cursor::type::arrow_wait},
229 {ImGuiMouseCursor_Help, os::cursor::type::hand},
230 {ImGuiMouseCursor_Cross, os::cursor::type::crosshair},
231 {ImGuiMouseCursor_NotAllowed, os::cursor::type::not_allowed}};
232 auto it = cursor_map.find(cursor);
233 if(it != cursor_map.end())
237 return os::cursor::type::arrow;
241static void ImGui_ImplOSPP_UpdateMonitors();
243static void ImGui_ImplOSPP_ShutdownPlatformInterface();
246static auto ImGui_ImplOSPP_GetClipboardText(ImGuiContext* ctx) ->
const char*
254static void ImGui_ImplOSPP_SetClipboardText(ImGuiContext* ctx,
const char* text)
257 os::clipboard::set_text(unwrapped_text);
260static void ImGui_ImplOSPP_SetPlatformImeData(ImGuiContext* ctx, ImGuiViewport* viewport, ImGuiPlatformImeData* data)
262 if(data->WantVisible)
273static auto ImGui_ImplOSPP_KeycodeToImGuiKey(os::key::code keycode) -> ImGuiKey
277 case os::key::code::tab:
279 case os::key::code::left:
280 return ImGuiKey_LeftArrow;
281 case os::key::code::right:
282 return ImGuiKey_RightArrow;
283 case os::key::code::up:
284 return ImGuiKey_UpArrow;
285 case os::key::code::down:
286 return ImGuiKey_DownArrow;
287 case os::key::code::pageup:
288 return ImGuiKey_PageUp;
289 case os::key::code::pagedown:
290 return ImGuiKey_PageDown;
291 case os::key::code::home:
292 return ImGuiKey_Home;
293 case os::key::code::end:
295 case os::key::code::insert:
296 return ImGuiKey_Insert;
297 case os::key::code::del:
298 return ImGuiKey_Delete;
299 case os::key::code::backspace:
300 return ImGuiKey_Backspace;
301 case os::key::code::space:
302 return ImGuiKey_Space;
303 case os::key::code::enter:
304 return ImGuiKey_Enter;
305 case os::key::code::escape:
306 return ImGuiKey_Escape;
307 case os::key::code::apostrophe:
308 return ImGuiKey_Apostrophe;
309 case os::key::code::comma:
310 return ImGuiKey_Comma;
311 case os::key::code::minus:
312 return ImGuiKey_Minus;
313 case os::key::code::period:
314 return ImGuiKey_Period;
315 case os::key::code::slash:
316 return ImGuiKey_Slash;
317 case os::key::code::semicolon:
318 return ImGuiKey_Semicolon;
319 case os::key::code::equals:
320 return ImGuiKey_Equal;
321 case os::key::code::leftbracket:
322 return ImGuiKey_LeftBracket;
323 case os::key::code::backslash:
324 return ImGuiKey_Backslash;
325 case os::key::code::rightbracket:
326 return ImGuiKey_RightBracket;
328 case os::key::code::capslock:
329 return ImGuiKey_CapsLock;
330 case os::key::code::scrolllock:
331 return ImGuiKey_ScrollLock;
332 case os::key::code::numlockclear:
333 return ImGuiKey_NumLock;
334 case os::key::code::printscreen:
335 return ImGuiKey_PrintScreen;
336 case os::key::code::pause:
337 return ImGuiKey_Pause;
338 case os::key::code::kp_digit0:
339 return ImGuiKey_Keypad0;
340 case os::key::code::kp_digit1:
341 return ImGuiKey_Keypad1;
342 case os::key::code::kp_digit2:
343 return ImGuiKey_Keypad2;
344 case os::key::code::kp_digit3:
345 return ImGuiKey_Keypad3;
346 case os::key::code::kp_digit4:
347 return ImGuiKey_Keypad4;
348 case os::key::code::kp_digit5:
349 return ImGuiKey_Keypad5;
350 case os::key::code::kp_digit6:
351 return ImGuiKey_Keypad6;
352 case os::key::code::kp_digit7:
353 return ImGuiKey_Keypad7;
354 case os::key::code::kp_digit8:
355 return ImGuiKey_Keypad8;
356 case os::key::code::kp_digit9:
357 return ImGuiKey_Keypad9;
358 case os::key::code::kp_period:
359 return ImGuiKey_KeypadDecimal;
360 case os::key::code::kp_divide:
361 return ImGuiKey_KeypadDivide;
362 case os::key::code::kp_multiply:
363 return ImGuiKey_KeypadMultiply;
364 case os::key::code::kp_minus:
365 return ImGuiKey_KeypadSubtract;
366 case os::key::code::kp_plus:
367 return ImGuiKey_KeypadAdd;
368 case os::key::code::kp_enter:
369 return ImGuiKey_KeypadEnter;
370 case os::key::code::kp_equals:
371 return ImGuiKey_KeypadEqual;
372 case os::key::code::lctrl:
373 return ImGuiKey_LeftCtrl;
374 case os::key::code::lshift:
375 return ImGuiKey_LeftShift;
376 case os::key::code::lalt:
377 return ImGuiKey_LeftAlt;
378 case os::key::code::lgui:
379 return ImGuiKey_LeftSuper;
380 case os::key::code::rctrl:
381 return ImGuiKey_RightCtrl;
382 case os::key::code::rshift:
383 return ImGuiKey_RightShift;
384 case os::key::code::ralt:
385 return ImGuiKey_RightAlt;
386 case os::key::code::rgui:
387 return ImGuiKey_RightSuper;
388 case os::key::code::application:
389 return ImGuiKey_Menu;
390 case os::key::code::digit0:
392 case os::key::code::digit1:
394 case os::key::code::digit2:
396 case os::key::code::digit3:
398 case os::key::code::digit4:
400 case os::key::code::digit5:
402 case os::key::code::digit6:
404 case os::key::code::digit7:
406 case os::key::code::digit8:
408 case os::key::code::digit9:
410 case os::key::code::a:
412 case os::key::code::b:
414 case os::key::code::c:
416 case os::key::code::d:
418 case os::key::code::e:
420 case os::key::code::f:
422 case os::key::code::g:
424 case os::key::code::h:
426 case os::key::code::i:
428 case os::key::code::j:
430 case os::key::code::k:
432 case os::key::code::l:
434 case os::key::code::m:
436 case os::key::code::n:
438 case os::key::code::o:
440 case os::key::code::p:
442 case os::key::code::q:
444 case os::key::code::r:
446 case os::key::code::s:
448 case os::key::code::t:
450 case os::key::code::u:
452 case os::key::code::v:
454 case os::key::code::w:
456 case os::key::code::x:
458 case os::key::code::y:
460 case os::key::code::z:
462 case os::key::code::f1:
464 case os::key::code::f2:
466 case os::key::code::f3:
468 case os::key::code::f4:
470 case os::key::code::f5:
472 case os::key::code::f6:
474 case os::key::code::f7:
476 case os::key::code::f8:
478 case os::key::code::f9:
480 case os::key::code::f10:
482 case os::key::code::f11:
484 case os::key::code::f12:
487 return ImGuiKey_None;
491static void ImGui_ImplOSPP_UpdateKeyModifiers(os::key_event e)
493 ImGuiIO& io = ImGui::GetIO();
494 io.AddKeyEvent(ImGuiMod_Ctrl,
e.ctrl);
495 io.AddKeyEvent(ImGuiMod_Shift,
e.shift);
496 io.AddKeyEvent(ImGuiMod_Alt,
e.alt);
497 io.AddKeyEvent(ImGuiMod_Super,
e.system);
502 if(ImGui::IsAnyItemActive())
504 bool is_window_move =
false;
505 for(
auto window : ImGui::GetCurrentContext()->Windows)
507 if(window->MoveId == ImGui::GetActiveID())
509 is_window_move =
true;
531 ImGuiIO& io = ImGui::GetIO();
536 case os::events::mouse_motion:
538 os::point mouse_pos(
event.motion.x,
event.motion.y);
539 if(io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable)
541 auto viewport = ImGui_ImplOSPP_GetViewportFromWindowId(
event.motion.window_id);
542 auto vd = ImGui_ImplOSPP_GetViewportData(viewport);
545 auto window_pos = vd->Window->get_window().get_position();
546 mouse_pos.x += window_pos.x;
547 mouse_pos.y += window_pos.y;
550 io.AddMouseSourceEvent(ImGuiMouseSource_Mouse);
551 io.AddMousePosEvent(
float(mouse_pos.x),
float(mouse_pos.y));
555 case os::events::mouse_wheel:
559 float wheel_x = -float(
event.wheel.x);
560 float wheel_y = float(
event.wheel.y);
564 io.AddMouseSourceEvent(ImGuiMouseSource_Mouse);
565 io.AddMouseWheelEvent(wheel_x, wheel_y);
568 case os::events::mouse_button:
570 int mouse_button = int(uint8_t(
event.button.button)) - 1;
571 if(mouse_button == -1)
574 bool pressed =
event.button.state_id == os::state::pressed;
575 io.AddMouseSourceEvent(ImGuiMouseSource_Mouse);
576 io.AddMouseButtonEvent(mouse_button, pressed);
581 case os::events::text_input:
583 io.AddInputCharactersUTF8(
event.text.text.c_str());
590 case os::events::key_up:
591 case os::events::key_down:
593 ImGui_ImplOSPP_UpdateKeyModifiers(
event.key);
594 ImGuiKey key = ImGui_ImplOSPP_KeycodeToImGuiKey(
event.key.code);
595 io.AddKeyEvent(key, (
event.type == os::events::key_down));
596 io.SetKeyEventNativeData(key,
event.key.code,
event.key.code,
event.key.code);
604 case os::events::window:
606 switch(
event.window.type)
608 case os::window_event_id::focus_gained:
610 io.AddFocusEvent(
true);
613 case os::window_event_id::focus_lost:
615 io.AddFocusEvent(
false);
618 case os::window_event_id::enter:
626 case os::window_event_id::leave:
635 case os::window_event_id::close:
636 case os::window_event_id::moved:
637 case os::window_event_id::resized:
638 if(ImGuiViewport* viewport = ImGui_ImplOSPP_GetViewportFromWindowId(
event.window.window_id))
640 if(
event.window.type == os::window_event_id::close)
641 viewport->PlatformRequestClose =
true;
642 if(
event.window.type == os::window_event_id::moved)
643 viewport->PlatformRequestMove =
true;
644 if(
event.window.type == os::window_event_id::resized)
645 viewport->PlatformRequestResize =
true;
654 case os::events::display_orientation:
655 case os::events::display_connected:
656 case os::events::display_disconnected:
657 case os::events::display_moved:
658 case os::events::display_content_scale_changed:
675 ImGuiIO& io = ImGui::GetIO();
676 IM_ASSERT(io.BackendPlatformUserData ==
nullptr &&
"Already initialized a platform backend!");
680 bool mouse_can_use_global_state =
false;
681#if OSPP_HAS_CAPTURE_AND_GLOBAL_MOUSE
686 mouse_can_use_global_state =
true;
691 io.BackendPlatformUserData = bd;
692 io.BackendPlatformName =
"imgui_impl_ospp";
695 io.BackendFlags |= ImGuiBackendFlags_HasMouseCursors;
700 io.BackendFlags |= ImGuiBackendFlags_HasSetMousePos;
701 io.ConfigDebugHighlightIdConflicts =
true;
704 if(mouse_can_use_global_state)
705 io.BackendFlags |= ImGuiBackendFlags_PlatformHasViewports;
722 ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
723 platform_io.Platform_SetClipboardTextFn = ImGui_ImplOSPP_SetClipboardText;
724 platform_io.Platform_GetClipboardTextFn = ImGui_ImplOSPP_GetClipboardText;
725 platform_io.Platform_OpenInShellFn = ImOsOpenInShell;
726 platform_io.Platform_ClipboardUserData =
nullptr;
727 platform_io.Platform_SetImeDataFn = ImGui_ImplOSPP_SetPlatformImeData;
732 ImGuiViewport* main_viewport = ImGui::GetMainViewport();
735 main_viewport->PlatformHandleRaw = window->get_window().get_native_handle();
743 os::set_hint(
"HINT_MOUSE_FOCUS_CLICKTHROUGH",
"1");
746 os::set_hint(
"HINT_MOUSE_AUTO_CAPTURE",
"0");
749 os::set_hint(
"HINT_BORDERLESS_WINDOWED_STYLE",
"0");
751 if((io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable) &&
752 (io.BackendFlags & ImGuiBackendFlags_PlatformHasViewports))
753 ImGui_ImplOSPP_InitPlatformInterface(window);
761 IM_ASSERT(bd !=
nullptr &&
"No platform backend to shutdown, or already shutdown?");
762 ImGuiIO& io = ImGui::GetIO();
764 ImGui_ImplOSPP_ShutdownPlatformInterface();
766 io.BackendPlatformName =
nullptr;
767 io.BackendPlatformUserData =
nullptr;
769 ~(ImGuiBackendFlags_HasMouseCursors | ImGuiBackendFlags_HasSetMousePos | ImGuiBackendFlags_HasGamepad |
770 ImGuiBackendFlags_PlatformHasViewports | ImGuiBackendFlags_HasMouseHoveredViewport);
776static void ImGui_ImplOSPP_UpdateMouseData()
779 ImGuiIO& io = ImGui::GetIO();
785 io.AddMousePosEvent(-FLT_MAX, -FLT_MAX);
792 io.BackendFlags |= ImGuiBackendFlags_HasMouseHoveredViewport;
794 io.BackendFlags &= ~ImGuiBackendFlags_HasMouseHoveredViewport;
797#if OSPP_HAS_CAPTURE_AND_GLOBAL_MOUSE
803 ImGuiViewport* focused_viewport = ImGui_ImplOSPP_GetFocusedViewport();
805 const bool is_app_focused = !!focused_viewport;
807 const bool is_app_focused =
814 if(io.WantSetMousePos)
816 os::point mouse_pos(int32_t(io.MousePos.x), int32_t(io.MousePos.y));
817#if OSPP_HAS_CAPTURE_AND_GLOBAL_MOUSE
818 if(io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable)
819 os::mouse::set_position(mouse_pos);
833 auto mouse_pos = os::mouse::get_position();
834 if(!(io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable))
836 auto fvd = ImGui_ImplOSPP_GetViewportData(focused_viewport);
839 mouse_pos = os::mouse::get_position(fvd->Window->get_window());
842 io.AddMouseSourceEvent(ImGuiMouseSource_Mouse);
843 io.AddMousePosEvent(
float(mouse_pos.x),
float(mouse_pos.y));
857 if(io.BackendFlags & ImGuiBackendFlags_HasMouseHoveredViewport)
859 ImGuiID mouse_viewport_id = 0;
860 if(ImGuiViewport* mouse_viewport = ImGui_ImplOSPP_GetViewportFromWindowId(bd->
MouseWindowID))
863 mouse_viewport_id = mouse_viewport->ID;
865 io.AddMouseViewportEvent(mouse_viewport_id);
869static void ImGui_ImplOSPP_UpdateMouseCursor()
871 ImGuiIO& io = ImGui::GetIO();
872 if(io.ConfigFlags & ImGuiConfigFlags_NoMouseCursorChange)
876 ImGuiMouseCursor imgui_cursor = ImGui::GetMouseCursor();
877 if(io.MouseDrawCursor || imgui_cursor == ImGuiMouseCursor_None)
895static void ImGui_ImplOSPP_UpdateGamepads()
899static void ImGui_ImplOSPP_UpdateMonitors()
903 ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
907 if(!platform_io.Monitors.empty())
919 platform_io.Monitors.resize(0);
920 int display_count = os::display::get_available_displays_count();
922 if(display_count < 1)
924 ImGuiPlatformMonitor monitor;
925 monitor.MainPos = monitor.WorkPos = ImVec2();
926 monitor.MainSize = monitor.WorkSize = ImVec2(1920.f, 1080.f);
927 platform_io.Monitors.push_back(monitor);
935 for(
int n = 0;
n < display_count;
n++)
939 ImGuiPlatformMonitor monitor;
940 auto bounds = os::display::get_bounds(n);
941 auto mode = os::display::get_desktop_mode(n);
942 monitor.DpiScale = os::display::get_content_scale(n);
943 monitor.MainPos = monitor.WorkPos = ImVec2(
float(bounds.x),
float(bounds.y));
944 monitor.MainSize = monitor.WorkSize = ImVec2(
float(bounds.w),
float(bounds.h));
945 auto usable_bounds = os::display::get_usable_bounds(n);
946 monitor.WorkPos = ImVec2((
float)usable_bounds.x, (
float)usable_bounds.y);
947 monitor.WorkSize = ImVec2((
float)usable_bounds.w, (
float)usable_bounds.h);
949 monitor.PlatformHandle = (
void*)(intptr_t)
n;
950 if (monitor.DpiScale <= 0.0f)
952 platform_io.Monitors.push_back(monitor);
956static void ImGui_ImplOSPP_GetWindowSizeAndFramebufferScale(
unravel::render_window* window, ImVec2* out_size, ImVec2* out_framebuffer_scale)
959 int display_w, display_h;
971 auto surface_size = window->
get_surface()->get_size();
974 display_w = surface_size.width;
975 display_h = surface_size.height;
982 if (out_size !=
nullptr)
983 *out_size = ImVec2((
float)w, (
float)h);
984 if (out_framebuffer_scale !=
nullptr)
985 *out_framebuffer_scale = (
w > 0 &&
h > 0) ? ImVec2((
float)display_w / w, (
float)display_h / h) : ImVec2(1.0f, 1.0f);
991 IM_ASSERT(bd !=
nullptr &&
"Did you call ImGui_ImplOSPP_Init()?");
992 ImGuiIO& io = ImGui::GetIO();
994 ImGui_ImplOSPP_GetWindowSizeAndFramebufferScale(bd->
Window, &io.DisplaySize, &io.DisplayFramebufferScale);
996 io.DeltaTime = delta_time;
997 if(io.DeltaTime <= 0.00001f)
998 io.DeltaTime = 1.0f / 60.0f;
1003 ImGui_ImplOSPP_UpdateMonitors();
1005 ImGui_ImplOSPP_UpdateMouseData();
1006 ImGui_ImplOSPP_UpdateMouseCursor();
1009 ImGui_ImplOSPP_UpdateGamepads();
1014 ImGuiIO& io = ImGui::GetIO();
1020 if(io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable)
1022 ImGui::UpdatePlatformWindows();
1023 ImGui::RenderPlatformWindowsDefault();
1033static void ImGui_ImplOSPP_CreateWindow(ImGuiViewport* viewport)
1036 viewport->PlatformUserData = vd;
1038 ImGuiViewport* main_viewport = ImGui::GetMainViewport();
1041 uint32_t win_flags = 0;
1042 win_flags |= os::window::hidden;
1043 win_flags |= os::window::resizable;
1044 win_flags |= (viewport->Flags & ImGuiViewportFlags_NoDecoration) ? os::window::borderless : 0;
1045 win_flags |= (viewport->Flags & ImGuiViewportFlags_NoTaskBarIcon) ? os::window::no_taskbar : 0;
1046 win_flags |= (viewport->Flags & ImGuiViewportFlags_TopMost) ? os::window::always_on_top : 0;
1048 os::window os_win(
"No Title Yet",
1049 int32_t(viewport->Pos.x),
1050 int32_t(viewport->Pos.y),
1051 uint32_t(viewport->Size.x),
1052 uint32_t(viewport->Size.y),
1059 viewport->PlatformHandleRaw = vd->
Window->
get_window().get_native_handle();
1062static void ImGui_ImplOSPP_DestroyWindow(ImGuiViewport* viewport)
1072 viewport->PlatformUserData = viewport->PlatformHandle =
nullptr;
1075static void ImGui_ImplOSPP_ShowWindow(ImGuiViewport* viewport)
1079#if defined(_WIN32) && \
1080 !(defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP || WINAPI_FAMILY == WINAPI_FAMILY_GAMES))
1081 HWND hwnd = (HWND)viewport->PlatformHandleRaw;
1086 if(!(viewport->Flags & ImGuiViewportFlags_NoTaskBarIcon))
1088 LONG ex_style = ::GetWindowLong(hwnd, GWL_EXSTYLE);
1089 ex_style |= WS_EX_APPWINDOW;
1090 ex_style &= ~WS_EX_TOOLWINDOW;
1091 ::ShowWindow(hwnd, SW_HIDE);
1092 ::SetWindowLong(hwnd, GWL_EXSTYLE, ex_style);
1096 os::set_hint(
"HINT_WINDOW_ACTIVATE_WHEN_SHOWN",
1097 (viewport->Flags & ImGuiViewportFlags_NoFocusOnAppearing) ?
"0" :
"1");
1110static auto ImGui_ImplOSPP_GetWindowPos(ImGuiViewport* viewport) -> ImVec2
1114 return {float(pos.x), float(pos.y)};
1117static void ImGui_ImplOSPP_SetWindowPos(ImGuiViewport* viewport, ImVec2 pos)
1123static auto ImGui_ImplOSPP_GetWindowSize(ImGuiViewport* viewport) -> ImVec2
1127 return {float(
size.w), float(
size.h)};
1130static void ImGui_ImplOSPP_SetWindowSize(ImGuiViewport* viewport, ImVec2
size)
1136static ImVec2 ImGui_ImplOSPP_GetWindowFramebufferScale(ImGuiViewport* viewport)
1139 ImVec2 framebuffer_scale;
1140 ImGui_ImplOSPP_GetWindowSizeAndFramebufferScale(vd->
Window,
nullptr, &framebuffer_scale);
1141 return framebuffer_scale;
1145static void ImGui_ImplOSPP_SetWindowTitle(ImGuiViewport* viewport,
const char* title)
1151static void ImGui_ImplOSPP_SetWindowAlpha(ImGuiViewport* viewport,
float alpha)
1160static void ImGui_ImplOSPP_SetWindowFocus(ImGuiViewport* viewport)
1166static auto ImGui_ImplOSPP_GetWindowFocus(ImGuiViewport* viewport) ->
bool
1172static auto ImGui_ImplOSPP_GetWindowMinimized(ImGuiViewport* viewport) ->
bool
1197 ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
1198 platform_io.Platform_CreateWindow = ImGui_ImplOSPP_CreateWindow;
1199 platform_io.Platform_DestroyWindow = ImGui_ImplOSPP_DestroyWindow;
1200 platform_io.Platform_ShowWindow = ImGui_ImplOSPP_ShowWindow;
1201 platform_io.Platform_SetWindowPos = ImGui_ImplOSPP_SetWindowPos;
1202 platform_io.Platform_GetWindowPos = ImGui_ImplOSPP_GetWindowPos;
1203 platform_io.Platform_SetWindowSize = ImGui_ImplOSPP_SetWindowSize;
1204 platform_io.Platform_GetWindowSize = ImGui_ImplOSPP_GetWindowSize;
1205 platform_io.Platform_GetWindowFramebufferScale = ImGui_ImplOSPP_GetWindowFramebufferScale;
1206 platform_io.Platform_SetWindowFocus = ImGui_ImplOSPP_SetWindowFocus;
1207 platform_io.Platform_GetWindowFocus = ImGui_ImplOSPP_GetWindowFocus;
1208 platform_io.Platform_GetWindowMinimized = ImGui_ImplOSPP_GetWindowMinimized;
1209 platform_io.Platform_SetWindowTitle = ImGui_ImplOSPP_SetWindowTitle;
1212 platform_io.Platform_SetWindowAlpha = ImGui_ImplOSPP_SetWindowAlpha;
1217 ImGuiViewport* main_viewport = ImGui::GetMainViewport();
1222 main_viewport->PlatformUserData = vd;
1224 main_viewport->PlatformHandleRaw = window->
get_window().get_native_handle();
1227static void ImGui_ImplOSPP_ShutdownPlatformInterface()
1229 ImGui::DestroyPlatformWindows();
1232#if defined(__clang__)
1233#pragma clang diagnostic pop
void ImGui_ImplOSPP_Shutdown()
auto ImGui_ImplOSPP_MapCursor(ImGuiMouseCursor cursor) -> os::cursor::type
void ImGui_ImplOSPP_RenderWindow(ImGuiViewport *viewport, void *rend_args)
void ImGui_ImplOSPP_SwapBuffers(ImGuiViewport *viewport, void *rend_args)
auto ImGui_ImplOSPP_IdToHandle(uint32_t id) -> void *
void ImGui_ImplOSPP_EndFrame()
auto ImGui_ImplOSPP_Init(unravel::render_window *window, ImGui_ImplOSPP_RenderWindow_Callback render_callback, ImGui_ImplOSPP_SwapBuffers_Callback swap_callback) -> bool
auto ImGui_IsAnyRealItemActive() -> bool
void ImGui_ImplOSPP_NewFrame(float delta_time)
auto ImGui_ImplOSPP_ProcessEvent(os::event &event) -> bool
std::function< void(unravel::render_window *window, ImGuiViewport *viewport, void *)> ImGui_ImplOSPP_RenderWindow_Callback
std::function< void(unravel::render_window *window, ImGuiViewport *viewport, void *)> ImGui_ImplOSPP_SwapBuffers_Callback
auto replace(const std::string &str, const std::string &search, const std::string &replace) -> std::string
bool MouseCanUseGlobalState
ImGui_ImplOSPP_RenderWindow_Callback RenderCallback
unravel::render_window * Window
std::string ClipboardTextData
ImGuiMouseCursor LastMouseCursor
ImGui_ImplOSPP_SwapBuffers_Callback SwapCallback
int PendingMouseLeaveFrame
bool MouseCanReportHoveredViewport
unravel::render_window * Window
bool WindowShownAtLeastOnce
ImGui_ImplOSPP_ViewportData()
~ImGui_ImplOSPP_ViewportData()
Struct representing a render window.
auto get_surface() -> graphics_surface_t &
Gets the rendering surface.
void resize(uint32_t w, uint32_t h)
Resizes the render window to the specified width and height.
auto get_window() -> os::window &
Gets the associated OS window.