Skip to content

Commit 5db2385

Browse files
committed
Add support for dark mode.
1 parent 779a205 commit 5db2385

File tree

3 files changed

+59
-9
lines changed

3 files changed

+59
-9
lines changed

gui/test.cpp

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -70,16 +70,12 @@ int main()
7070
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls
7171
io.ConfigFlags |= ImGuiConfigFlags_DockingEnable;
7272

73-
// Setup Dear ImGui style
74-
ImGui::StyleColorsDark();
75-
// ImGui::StyleColorsLight();
76-
7773
// Setup Platform/Renderer backends
7874
ImGui_ImplSDL2_InitForOpenGL(window, gl_context);
7975
ImGui_ImplOpenGL3_Init(glsl_version);
8076

8177
bool done = false;
82-
ImVec4 clear_color = ImVec4(0.45, 0.55, 0.60, 1.00);
78+
ImVec4 clear_color = ImVec4(0.22, 0.22, 0.22, 1.00);
8379
std::array<char, 100> buf{};
8480
loadFonts(&io);
8581

@@ -114,11 +110,20 @@ int main()
114110
ImGui::InputText("Input", buf.data(), buf.size());
115111
ImGui::End();
116112

113+
if (isDarkModeEnabled())
114+
{
115+
glClearColor(0.22, 0.22, 0.22, 1.0);
116+
ImGui::StyleColorsDark();
117+
}
118+
else
119+
{
120+
glClearColor(0.95, 0.95, 0.95, 1.0);
121+
ImGui::StyleColorsLight();
122+
}
123+
117124
// Rendering
118125
ImGui::Render();
119126
glViewport(0, 0, (int)io.DisplaySize.x, (int)io.DisplaySize.y);
120-
glClearColor(
121-
clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w);
122127
glClear(GL_COLOR_BUFFER_BIT);
123128
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
124129
SDL_GL_SwapWindow(window);

include/CMakeLists.txt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,19 @@ IF (STP_BUILD_GUI EQUAL 1)
3838

3939
# If we have freetype, we can use it to render text
4040
FIND_PACKAGE(Freetype QUIET)
41-
if (FREETYPE_FOUND)
41+
IF (FREETYPE_FOUND)
4242
MESSAGE(STATUS "Found Freetype")
4343
ADD_LIBRARY(imgui_freetype STATIC "${STP_BASE_DIRECTORY}/include/imgui/misc/freetype/imgui_freetype.cpp")
4444
TARGET_INCLUDE_DIRECTORIES(imgui_freetype PRIVATE "${STP_BASE_DIRECTORY}/include/imgui")
4545
TARGET_LINK_LIBRARIES(imgui_freetype PRIVATE ${FREETYPE_LIBRARIES})
4646
TARGET_LINK_LIBRARIES(imgui PRIVATE imgui_freetype)
4747
TARGET_INCLUDE_DIRECTORIES(imgui_freetype PRIVATE ${FREETYPE_INCLUDE_DIRS})
4848
TARGET_COMPILE_DEFINITIONS(imgui PRIVATE IMGUI_ENABLE_FREETYPE)
49-
endif()
49+
ENDIF()
50+
51+
IF (CMAKE_SYSTEM_NAME STREQUAL "Darwin")
52+
TARGET_LINK_LIBRARIES(imgui PRIVATE "-framework CoreFoundation")
53+
ENDIF()
5054

5155
TARGET_LINK_LIBRARIES(imgui PRIVATE SDL2::SDL2)
5256
TARGET_INCLUDE_DIRECTORIES(imgui PRIVATE ${SDL2_INCLUDE_DIRS})

include/gui.hpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,47 @@ using namespace std::literals;
1212

1313
namespace steppable::gui::__internals
1414
{
15+
#ifdef MACOSX
16+
#include <CoreFoundation/CoreFoundation.h>
17+
18+
bool isDarkModeEnabled()
19+
{
20+
bool isDarkMode = false;
21+
CFPreferencesAppSynchronize(CFSTR("AppleInterfaceStyle"));
22+
CFPropertyListRef value = CFPreferencesCopyAppValue(CFSTR("AppleInterfaceStyle"), kCFPreferencesAnyApplication);
23+
if (value != nullptr)
24+
{
25+
const auto* interfaceStyle = static_cast<CFStringRef>(value);
26+
if (CFStringCompare(interfaceStyle, CFSTR("Dark"), 0) == kCFCompareEqualTo)
27+
isDarkMode = true;
28+
CFRelease(value);
29+
}
30+
return isDarkMode;
31+
}
32+
#elif defined(LINUX)
33+
bool isDarkModeEnabled() { return std::filesystem::exists("/usr/share/themes/Adwaita-dark/gtk-3.0"); }
34+
#elif defined(WINDOWS)
35+
bool isDarkModeEnabled()
36+
{
37+
HKEY key;
38+
if (RegOpenKeyExA(HKEY_CURRENT_USER,
39+
"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize",
40+
0,
41+
KEY_QUERY_VALUE,
42+
&key) == ERROR_SUCCESS)
43+
{
44+
DWORD value = 0;
45+
DWORD size = sizeof(DWORD);
46+
if (RegQueryValueExA(key, "AppsUseLightTheme", nullptr, nullptr, reinterpret_cast<LPBYTE>(&value), &size) ==
47+
ERROR_SUCCESS)
48+
return value == 0;
49+
}
50+
return false;
51+
}
52+
#else
53+
bool isDarkModeEnabled() { return false; }
54+
#endif
55+
1556
inline void addIfExistent(const ImGuiIO* io,
1657
const std::filesystem::path& path,
1758
const ImFontConfig* config,

0 commit comments

Comments
 (0)