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
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;
116 fs::show_in_graphical_env(p);
138 IM_ASSERT(
Window ==
nullptr);
144 if(viewport && viewport->PlatformUserData)
156 ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
158 for(
int i = 0; i != platform_io.Viewports.Size; i++)
163 callback(platform_io.Viewports[i], data);
170 ImGuiViewport* result{
nullptr};
188 ImGuiViewport* result{
nullptr};
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;
257 os::clipboard::set_text(unwrapped_text);
262 if(data->WantVisible)
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;
496 return os::key::code::tab;
497 case ImGuiKey_LeftArrow:
498 return os::key::code::left;
499 case ImGuiKey_RightArrow:
500 return os::key::code::right;
501 case ImGuiKey_UpArrow:
502 return os::key::code::up;
503 case ImGuiKey_DownArrow:
504 return os::key::code::down;
505 case ImGuiKey_PageUp:
506 return os::key::code::pageup;
507 case ImGuiKey_PageDown:
508 return os::key::code::pagedown;
510 return os::key::code::home;
512 return os::key::code::end;
513 case ImGuiKey_Insert:
514 return os::key::code::insert;
515 case ImGuiKey_Delete:
516 return os::key::code::del;
517 case ImGuiKey_Backspace:
518 return os::key::code::backspace;
520 return os::key::code::space;
522 return os::key::code::enter;
523 case ImGuiKey_Escape:
524 return os::key::code::escape;
525 case ImGuiKey_Apostrophe:
526 return os::key::code::apostrophe;
528 return os::key::code::comma;
530 return os::key::code::minus;
531 case ImGuiKey_Period:
532 return os::key::code::period;
534 return os::key::code::slash;
535 case ImGuiKey_Semicolon:
536 return os::key::code::semicolon;
538 return os::key::code::equals;
539 case ImGuiKey_LeftBracket:
540 return os::key::code::leftbracket;
541 case ImGuiKey_Backslash:
542 return os::key::code::backslash;
543 case ImGuiKey_RightBracket:
544 return os::key::code::rightbracket;
545 case ImGuiKey_CapsLock:
546 return os::key::code::capslock;
547 case ImGuiKey_ScrollLock:
548 return os::key::code::scrolllock;
549 case ImGuiKey_NumLock:
550 return os::key::code::numlockclear;
551 case ImGuiKey_PrintScreen:
552 return os::key::code::printscreen;
554 return os::key::code::pause;
555 case ImGuiKey_Keypad0:
556 return os::key::code::kp_digit0;
557 case ImGuiKey_Keypad1:
558 return os::key::code::kp_digit1;
559 case ImGuiKey_Keypad2:
560 return os::key::code::kp_digit2;
561 case ImGuiKey_Keypad3:
562 return os::key::code::kp_digit3;
563 case ImGuiKey_Keypad4:
564 return os::key::code::kp_digit4;
565 case ImGuiKey_Keypad5:
566 return os::key::code::kp_digit5;
567 case ImGuiKey_Keypad6:
568 return os::key::code::kp_digit6;
569 case ImGuiKey_Keypad7:
570 return os::key::code::kp_digit7;
571 case ImGuiKey_Keypad8:
572 return os::key::code::kp_digit8;
573 case ImGuiKey_Keypad9:
574 return os::key::code::kp_digit9;
575 case ImGuiKey_KeypadDecimal:
576 return os::key::code::kp_period;
577 case ImGuiKey_KeypadDivide:
578 return os::key::code::kp_divide;
579 case ImGuiKey_KeypadMultiply:
580 return os::key::code::kp_multiply;
581 case ImGuiKey_KeypadSubtract:
582 return os::key::code::kp_minus;
583 case ImGuiKey_KeypadAdd:
584 return os::key::code::kp_plus;
585 case ImGuiKey_KeypadEnter:
586 return os::key::code::kp_enter;
587 case ImGuiKey_KeypadEqual:
588 return os::key::code::kp_equals;
589 case ImGuiKey_LeftCtrl:
590 return os::key::code::lctrl;
591 case ImGuiKey_LeftShift:
592 return os::key::code::lshift;
593 case ImGuiKey_LeftAlt:
594 return os::key::code::lalt;
595 case ImGuiKey_LeftSuper:
596 return os::key::code::lgui;
597 case ImGuiKey_RightCtrl:
598 return os::key::code::rctrl;
599 case ImGuiKey_RightShift:
600 return os::key::code::rshift;
601 case ImGuiKey_RightAlt:
602 return os::key::code::ralt;
603 case ImGuiKey_RightSuper:
604 return os::key::code::rgui;
606 return os::key::code::application;
608 return os::key::code::digit0;
610 return os::key::code::digit1;
612 return os::key::code::digit2;
614 return os::key::code::digit3;
616 return os::key::code::digit4;
618 return os::key::code::digit5;
620 return os::key::code::digit6;
622 return os::key::code::digit7;
624 return os::key::code::digit8;
626 return os::key::code::digit9;
628 return os::key::code::a;
630 return os::key::code::b;
632 return os::key::code::c;
634 return os::key::code::d;
636 return os::key::code::e;
638 return os::key::code::f;
640 return os::key::code::g;
642 return os::key::code::h;
644 return os::key::code::i;
646 return os::key::code::j;
648 return os::key::code::k;
650 return os::key::code::l;
652 return os::key::code::m;
654 return os::key::code::n;
656 return os::key::code::o;
658 return os::key::code::p;
660 return os::key::code::q;
662 return os::key::code::r;
664 return os::key::code::s;
666 return os::key::code::t;
668 return os::key::code::u;
670 return os::key::code::v;
672 return os::key::code::w;
674 return os::key::code::x;
676 return os::key::code::y;
678 return os::key::code::z;
680 return os::key::code::f1;
682 return os::key::code::f2;
684 return os::key::code::f3;
686 return os::key::code::f4;
688 return os::key::code::f5;
690 return os::key::code::f6;
692 return os::key::code::f7;
694 return os::key::code::f8;
696 return os::key::code::f9;
698 return os::key::code::f10;
700 return os::key::code::f11;
702 return os::key::code::f12;
704 return os::key::code::unknown;
710 ImGuiIO& io = ImGui::GetIO();
711 io.AddKeyEvent(ImGuiMod_Ctrl, e.ctrl);
712 io.AddKeyEvent(ImGuiMod_Shift, e.shift);
713 io.AddKeyEvent(ImGuiMod_Alt, e.alt);
714 io.AddKeyEvent(ImGuiMod_Super, e.system);
719 if(ImGui::IsAnyItemActive())
721 bool is_window_move =
false;
722 for(
auto window : ImGui::GetCurrentContext()->Windows)
724 if(window->MoveId == ImGui::GetActiveID())
726 is_window_move =
true;
748 ImGuiIO& io = ImGui::GetIO();
753 case os::events::mouse_motion:
755 os::point mouse_pos(
event.motion.x,
event.motion.y);
756 if(io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable)
762 auto window_pos = vd->Window->get_window().get_position();
763 mouse_pos.x += window_pos.x;
764 mouse_pos.y += window_pos.y;
767 io.AddMouseSourceEvent(ImGuiMouseSource_Mouse);
768 io.AddMousePosEvent(
float(mouse_pos.x),
float(mouse_pos.y));
772 case os::events::mouse_wheel:
776 float wheel_x = -float(
event.wheel.x);
777 float wheel_y = float(
event.wheel.y);
781 io.AddMouseSourceEvent(ImGuiMouseSource_Mouse);
782 io.AddMouseWheelEvent(wheel_x, wheel_y);
785 case os::events::mouse_button:
787 int mouse_button = int(uint8_t(
event.button.button)) - 1;
788 if(mouse_button == -1)
791 bool pressed =
event.button.state_id == os::state::pressed;
792 io.AddMouseSourceEvent(ImGuiMouseSource_Mouse);
793 io.AddMouseButtonEvent(mouse_button, pressed);
798 case os::events::text_input:
800 io.AddInputCharactersUTF8(
event.text.text.c_str());
807 case os::events::key_up:
808 case os::events::key_down:
812 io.AddKeyEvent(key, (
event.type == os::events::key_down));
813 io.SetKeyEventNativeData(key,
event.key.code,
event.key.code,
event.key.code);
821 case os::events::window:
823 switch(
event.window.type)
825 case os::window_event_id::focus_gained:
827 io.AddFocusEvent(
true);
830 case os::window_event_id::focus_lost:
832 io.AddFocusEvent(
false);
835 case os::window_event_id::enter:
843 case os::window_event_id::leave:
852 case os::window_event_id::close:
853 case os::window_event_id::moved:
854 case os::window_event_id::resized:
857 if(
event.window.type == os::window_event_id::close)
858 viewport->PlatformRequestClose =
true;
859 if(
event.window.type == os::window_event_id::moved)
860 viewport->PlatformRequestMove =
true;
861 if(
event.window.type == os::window_event_id::resized)
862 viewport->PlatformRequestResize =
true;
871 case os::events::display_orientation:
872 case os::events::display_connected:
873 case os::events::display_disconnected:
874 case os::events::display_moved:
875 case os::events::display_content_scale_changed:
892 ImGuiIO& io = ImGui::GetIO();
893 IM_ASSERT(io.BackendPlatformUserData ==
nullptr &&
"Already initialized a platform backend!");
897 bool mouse_can_use_global_state =
false;
898#if OSPP_HAS_CAPTURE_AND_GLOBAL_MOUSE
903 mouse_can_use_global_state =
true;
908 io.BackendPlatformUserData = bd;
909 io.BackendPlatformName =
"imgui_impl_ospp";
912 io.BackendFlags |= ImGuiBackendFlags_HasMouseCursors;
917 io.BackendFlags |= ImGuiBackendFlags_HasSetMousePos;
918 io.ConfigDebugHighlightIdConflicts =
true;
921 if(mouse_can_use_global_state)
922 io.BackendFlags |= ImGuiBackendFlags_PlatformHasViewports;
939 ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
943 platform_io.Platform_ClipboardUserData =
nullptr;
949 ImGuiViewport* main_viewport = ImGui::GetMainViewport();
952 main_viewport->PlatformHandleRaw = window->get_window().get_native_handle();
960 os::set_hint(
"HINT_MOUSE_FOCUS_CLICKTHROUGH",
"1");
963 os::set_hint(
"HINT_MOUSE_AUTO_CAPTURE",
"0");
966 os::set_hint(
"HINT_BORDERLESS_WINDOWED_STYLE",
"0");
968 if((io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable) &&
969 (io.BackendFlags & ImGuiBackendFlags_PlatformHasViewports))
978 IM_ASSERT(bd !=
nullptr &&
"No platform backend to shutdown, or already shutdown?");
979 ImGuiIO& io = ImGui::GetIO();
983 io.BackendPlatformName =
nullptr;
984 io.BackendPlatformUserData =
nullptr;
986 ~(ImGuiBackendFlags_HasMouseCursors | ImGuiBackendFlags_HasSetMousePos | ImGuiBackendFlags_HasGamepad |
987 ImGuiBackendFlags_PlatformHasViewports | ImGuiBackendFlags_HasMouseHoveredViewport);
996 ImGuiIO& io = ImGui::GetIO();
1002 io.AddMousePosEvent(-FLT_MAX, -FLT_MAX);
1009 io.BackendFlags |= ImGuiBackendFlags_HasMouseHoveredViewport;
1011 io.BackendFlags &= ~ImGuiBackendFlags_HasMouseHoveredViewport;
1014#if OSPP_HAS_CAPTURE_AND_GLOBAL_MOUSE
1022 const bool is_app_focused = !!focused_viewport;
1024 const bool is_app_focused =
1031 if(io.WantSetMousePos)
1033 os::point mouse_pos(int32_t(io.MousePos.x), int32_t(io.MousePos.y));
1034#if OSPP_HAS_CAPTURE_AND_GLOBAL_MOUSE
1035 if(io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable)
1036 os::mouse::set_position(mouse_pos);
1050 auto mouse_pos = os::mouse::get_position();
1051 if(!(io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable))
1056 mouse_pos = os::mouse::get_position(fvd->Window->get_window());
1059 io.AddMouseSourceEvent(ImGuiMouseSource_Mouse);
1060 io.AddMousePosEvent(
float(mouse_pos.x),
float(mouse_pos.y));
1074 if(io.BackendFlags & ImGuiBackendFlags_HasMouseHoveredViewport)
1076 ImGuiID mouse_viewport_id = 0;
1080 mouse_viewport_id = mouse_viewport->ID;
1082 io.AddMouseViewportEvent(mouse_viewport_id);
1088 ImGuiIO& io = ImGui::GetIO();
1089 if(io.ConfigFlags & ImGuiConfigFlags_NoMouseCursorChange)
1093 ImGuiMouseCursor imgui_cursor = ImGui::GetMouseCursor();
1094 if(io.MouseDrawCursor || imgui_cursor == ImGuiMouseCursor_None)
1120 ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
1124 if(!platform_io.Monitors.empty())
1136 platform_io.Monitors.resize(0);
1137 int display_count = os::display::get_available_displays_count();
1139 if(display_count < 1)
1141 ImGuiPlatformMonitor monitor;
1142 monitor.MainPos = monitor.WorkPos = ImVec2();
1143 monitor.MainSize = monitor.WorkSize = ImVec2(1920.f, 1080.f);
1144 platform_io.Monitors.push_back(monitor);
1152 for(
int n = 0; n < display_count; n++)
1156 ImGuiPlatformMonitor monitor;
1157 auto bounds = os::display::get_bounds(n);
1158 auto mode = os::display::get_desktop_mode(n);
1159 monitor.DpiScale = os::display::get_content_scale(n);
1160 monitor.MainPos = monitor.WorkPos = ImVec2(
float(bounds.x),
float(bounds.y));
1161 monitor.MainSize = monitor.WorkSize = ImVec2(
float(bounds.w),
float(bounds.h));
1162 auto usable_bounds = os::display::get_usable_bounds(n);
1163 monitor.WorkPos = ImVec2((
float)usable_bounds.x, (
float)usable_bounds.y);
1164 monitor.WorkSize = ImVec2((
float)usable_bounds.w, (
float)usable_bounds.h);
1166 monitor.PlatformHandle = (
void*)(intptr_t)n;
1167 if (monitor.DpiScale <= 0.0f)
1169 platform_io.Monitors.push_back(monitor);
1176 int display_w, display_h;
1188 auto surface_size = window->
get_surface()->get_size();
1189 if(surface_size.width !=
size.w || surface_size.
height !=
size.h)
1191 display_w = surface_size.width;
1192 display_h = surface_size.height;
1199 if (out_size !=
nullptr)
1200 *out_size = ImVec2((
float)w, (
float)h);
1201 if (out_framebuffer_scale !=
nullptr)
1202 *out_framebuffer_scale = (w > 0 && h > 0) ? ImVec2((
float)display_w / w, (
float)display_h / h) : ImVec2(1.0f, 1.0f);
1208 IM_ASSERT(bd !=
nullptr &&
"Did you call ImGui_ImplOSPP_Init()?");
1209 ImGuiIO& io = ImGui::GetIO();
1213 io.DeltaTime = delta_time;
1214 if(io.DeltaTime <= 0.00001f)
1215 io.DeltaTime = 1.0f / 60.0f;
1231 ImGuiIO& io = ImGui::GetIO();
1237 if(io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable)
1239 ImGui::UpdatePlatformWindows();
1240 ImGui::RenderPlatformWindowsDefault();
1253 viewport->PlatformUserData = vd;
1255 ImGuiViewport* main_viewport = ImGui::GetMainViewport();
1258 uint32_t win_flags = 0;
1259 win_flags |= os::window::hidden;
1260 win_flags |= os::window::resizable;
1261 win_flags |= (viewport->Flags & ImGuiViewportFlags_NoDecoration) ? os::window::borderless : 0;
1262 win_flags |= (viewport->Flags & ImGuiViewportFlags_NoTaskBarIcon) ? os::window::no_taskbar : 0;
1263 win_flags |= (viewport->Flags & ImGuiViewportFlags_TopMost) ? os::window::always_on_top : 0;
1265 os::window os_win(
"No Title Yet",
1266 int32_t(viewport->Pos.x),
1267 int32_t(viewport->Pos.y),
1268 uint32_t(viewport->Size.x),
1269 uint32_t(viewport->Size.y),
1276 viewport->PlatformHandleRaw = vd->
Window->
get_window().get_native_handle();
1283 if(vd->Window && vd->WindowOwned)
1284 IM_DELETE(vd->Window);
1286 vd->Window =
nullptr;
1289 viewport->PlatformUserData = viewport->PlatformHandle =
nullptr;
1296#if defined(_WIN32) && \
1297 !(defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP || WINAPI_FAMILY == WINAPI_FAMILY_GAMES))
1298 HWND hwnd = (HWND)viewport->PlatformHandleRaw;
1303 if(!(viewport->Flags & ImGuiViewportFlags_NoTaskBarIcon))
1305 LONG ex_style = ::GetWindowLong(hwnd, GWL_EXSTYLE);
1306 ex_style |= WS_EX_APPWINDOW;
1307 ex_style &= ~WS_EX_TOOLWINDOW;
1308 ::ShowWindow(hwnd, SW_HIDE);
1309 ::SetWindowLong(hwnd, GWL_EXSTYLE, ex_style);
1313 os::set_hint(
"HINT_WINDOW_ACTIVATE_WHEN_SHOWN",
1314 (viewport->Flags & ImGuiViewportFlags_NoFocusOnAppearing) ?
"0" :
"1");
1331 return {float(pos.x), float(pos.y)};
1344 return {float(
size.w), float(
size.h)};
1356 ImVec2 framebuffer_scale;
1358 return framebuffer_scale;
1414 ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
1434 ImGuiViewport* main_viewport = ImGui::GetMainViewport();
1439 main_viewport->PlatformUserData = vd;
1441 main_viewport->PlatformHandleRaw = window->
get_window().get_native_handle();
1446 ImGui::DestroyPlatformWindows();
1449#if defined(__clang__)
1450#pragma clang diagnostic pop
void ImGui_ImplOSPP_Shutdown()
static ImVec2 ImGui_ImplOSPP_GetWindowFramebufferScale(ImGuiViewport *viewport)
static auto ImGui_ImplOSPP_GetViewportFromWindowId(uint32_t id) -> ImGuiViewport *
static void ImGui_ImplOSPP_ShowWindow(ImGuiViewport *viewport)
auto ImGui_ImplOSPP_MapCursor(ImGuiMouseCursor cursor) -> os::cursor::type
static void ImGui_ImplOSPP_GetWindowSizeAndFramebufferScale(unravel::render_window *window, ImVec2 *out_size, ImVec2 *out_framebuffer_scale)
static void ImGui_ImplOSPP_SetWindowAlpha(ImGuiViewport *viewport, float alpha)
void ImGui_ImplOSPP_RenderWindow(ImGuiViewport *viewport, void *rend_args)
static void ImGui_ImplOSPP_ForEachViewport(const std::function< void(ImGuiViewport *viewport, ImGui_ImplOSPP_ViewportData *data)> &callback)
static auto ImGui_ImplOSPP_GetWindowMinimized(ImGuiViewport *viewport) -> bool
void ImGui_ImplOSPP_SwapBuffers(ImGuiViewport *viewport, void *rend_args)
static void ImGui_ImplOSPP_UpdateMouseData()
static auto ImGui_ImplOSPP_GetWindowSize(ImGuiViewport *viewport) -> ImVec2
static void ImGui_ImplOSPP_UpdateMouseCursor()
static void ImGui_ImplOSPP_CreateWindow(ImGuiViewport *viewport)
static void ImGui_ImplOSPP_UpdateMonitors()
auto ImGui_ImplOSPP_IdToHandle(uint32_t id) -> void *
auto ImGui_ImplOSPP_KeycodeToImGuiKey(os::key::code keycode) -> ImGuiKey
static auto ImGui_ImplOSPP_GetFocusedViewport() -> ImGuiViewport *
static void ImGui_ImplOSPP_SetPlatformImeData(ImGuiContext *ctx, ImGuiViewport *viewport, ImGuiPlatformImeData *data)
void ImGui_ImplOSPP_EndFrame()
static void ImGui_ImplOSPP_SetWindowSize(ImGuiViewport *viewport, ImVec2 size)
static void ImGui_ImplOSPP_UpdateKeyModifiers(os::key_event e)
auto ImGui_ImplOSPP_Init(unravel::render_window *window, ImGui_ImplOSPP_RenderWindow_Callback render_callback, ImGui_ImplOSPP_SwapBuffers_Callback swap_callback) -> bool
static void ImGui_ImplOSPP_InitPlatformInterface(unravel::render_window *window)
static auto ImGui_ImplOSPP_GetViewportData(ImGuiViewport *viewport) -> ImGui_ImplOSPP_ViewportData *
static auto ImGui_ImplOSPP_GetClipboardText(ImGuiContext *ctx) -> const char *
static void ImGui_ImplOSPP_SetWindowTitle(ImGuiViewport *viewport, const char *title)
static void ImGui_ImplOSPP_SetWindowFocus(ImGuiViewport *viewport)
static auto ImGui_ImplOSPP_GetWindowPos(ImGuiViewport *viewport) -> ImVec2
static void ImGui_ImplOSPP_UpdateGamepads()
static bool ImOsOpenInShell(ImGuiContext *ctx, const char *path)
static void ImGui_ImplOSPP_SetWindowPos(ImGuiViewport *viewport, ImVec2 pos)
auto ImGui_IsAnyRealItemActive() -> bool
static void ImGui_ImplOSPP_ShutdownPlatformInterface()
static void ImGui_ImplOSPP_SetClipboardText(ImGuiContext *ctx, const char *text)
auto ImGui_ImplOSPP_ImGuiKeyToKeycode(ImGuiKey key) -> os::key::code
void ImGui_ImplOSPP_NewFrame(float delta_time)
static auto ImGui_ImplOSPP_GetBackendData() -> ImGui_ImplOSPP_Data *
static void ImGui_ImplOSPP_DestroyWindow(ImGuiViewport *viewport)
static auto ImGui_ImplOSPP_GetWindowFocus(ImGuiViewport *viewport) -> bool
static bool ImOsIsDebuggerPresent()
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.