mirror of
https://github.com/glfw/glfw.git
synced 2025-06-06 15:54:56 +00:00
Merge 8b991ae051
into 6f1ddf51a1
This commit is contained in:
commit
69595def04
@ -240,7 +240,7 @@ focus when @ref glfwShowWindow is called. Possible values are `GLFW_TRUE` and
|
||||
`GLFW_FALSE`.
|
||||
|
||||
@anchor GLFW_SCALE_TO_MONITOR
|
||||
__GLFW_SCALE_TO_MONITOR__ specified whether the window content area should be
|
||||
__GLFW_SCALE_TO_MONITOR__ specifies whether the window content area should be
|
||||
resized based on the [monitor content scale](@ref monitor_scale) of any monitor
|
||||
it is placed on. This includes the initial placement when the window is
|
||||
created. Possible values are `GLFW_TRUE` and `GLFW_FALSE`.
|
||||
@ -249,6 +249,11 @@ This hint only has an effect on platforms where screen coordinates and pixels
|
||||
always map 1:1 such as Windows and X11. On platforms like macOS the resolution
|
||||
of the framebuffer is changed independently of the window size.
|
||||
|
||||
@anchor GLFW_THEME
|
||||
__GLFW_THEME__ specifies whether the window should use light theme or not.
|
||||
Possible values are `GLFW_THEME_AUTO`, `GLFW_THEME_DARK`, and `GLFW_THEME_LIGHT`. This hint only has effect
|
||||
on windows operating system.
|
||||
|
||||
@anchor GLFW_MOUSE_PASSTHROUGH_hint
|
||||
__GLFW_MOUSE_PASSTHROUGH__ specifies whether the window is transparent to mouse
|
||||
input, letting any mouse events pass through to whatever window is behind it.
|
||||
|
@ -1101,6 +1101,11 @@ extern "C" {
|
||||
/*! @brief macOS specific
|
||||
* [window hint](@ref GLFW_COCOA_RETINA_FRAMEBUFFER_hint).
|
||||
*/
|
||||
#define GLFW_THEME 0x0002200D
|
||||
/*! @brief windows specific
|
||||
*
|
||||
* Allows specifying whether light or dark theme should be used.
|
||||
*/
|
||||
#define GLFW_COCOA_RETINA_FRAMEBUFFER 0x00023001
|
||||
/*! @brief macOS specific
|
||||
* [window hint](@ref GLFW_COCOA_FRAME_NAME_hint).
|
||||
@ -1171,6 +1176,10 @@ extern "C" {
|
||||
|
||||
#define GLFW_ANY_POSITION 0x80000000
|
||||
|
||||
#define GLFW_THEME_AUTO 0x00000000
|
||||
#define GLFW_THEME_DARK 0x00000001
|
||||
#define GLFW_THEME_LIGHT 0x00000002
|
||||
|
||||
/*! @defgroup shapes Standard cursor shapes
|
||||
* @brief Standard system cursor shapes.
|
||||
*
|
||||
@ -3381,6 +3390,8 @@ GLFWAPI void glfwGetWindowPos(GLFWwindow* window, int* xpos, int* ypos);
|
||||
*/
|
||||
GLFWAPI void glfwSetWindowPos(GLFWwindow* window, int xpos, int ypos);
|
||||
|
||||
GLFWAPI int glfwIsWindowLightTheme(GLFWwindow* window);
|
||||
|
||||
/*! @brief Retrieves the size of the content area of the specified window.
|
||||
*
|
||||
* This function retrieves the size, in screen coordinates, of the content area
|
||||
|
106
premake5.lua
Normal file
106
premake5.lua
Normal file
@ -0,0 +1,106 @@
|
||||
project "GLFW"
|
||||
kind "StaticLib"
|
||||
language "C"
|
||||
|
||||
targetdir ("bin/" .. outputdir .. "/%{prj.name}")
|
||||
objdir ("bin-int/" .. outputdir .. "/%{prj.name}")
|
||||
|
||||
files
|
||||
{
|
||||
"include/GLFW/glfw3.h",
|
||||
"include/GLFW/glfw3native.h",
|
||||
"src/glfw_config.h",
|
||||
"src/context.c",
|
||||
"src/init.c",
|
||||
"src/input.c",
|
||||
"src/monitor.c",
|
||||
|
||||
"src/null_init.c",
|
||||
"src/null_joystick.c",
|
||||
"src/null_monitor.c",
|
||||
"src/null_window.c",
|
||||
|
||||
"src/platform.c",
|
||||
"src/vulkan.c",
|
||||
"src/window.c"
|
||||
}
|
||||
filter "system:linux"
|
||||
pic "On"
|
||||
|
||||
systemversion "latest"
|
||||
staticruntime "On"
|
||||
|
||||
files
|
||||
{
|
||||
"src/x11_init.c",
|
||||
"src/x11_monitor.c",
|
||||
"src/x11_window.c",
|
||||
"src/xkb_unicode.c",
|
||||
"src/posix_module.c",
|
||||
"src/posix_time.c",
|
||||
"src/posix_thread.c",
|
||||
"src/posix_module.c",
|
||||
"src/glx_context.c",
|
||||
"src/egl_context.c",
|
||||
"src/osmesa_context.c",
|
||||
"src/linux_joystick.c"
|
||||
}
|
||||
|
||||
defines
|
||||
{
|
||||
"_GLFW_X11"
|
||||
}
|
||||
|
||||
filter "system:macosx"
|
||||
pic "On"
|
||||
|
||||
files
|
||||
{
|
||||
"src/cocoa_init.m",
|
||||
"src/cocoa_monitor.m",
|
||||
"src/cocoa_window.m",
|
||||
"src/cocoa_joystick.m",
|
||||
"src/cocoa_time.c",
|
||||
"src/nsgl_context.m",
|
||||
"src/posix_thread.c",
|
||||
"src/posix_module.c",
|
||||
"src/osmesa_context.c",
|
||||
"src/egl_context.c"
|
||||
}
|
||||
|
||||
defines
|
||||
{
|
||||
"_GLFW_COCOA"
|
||||
}
|
||||
|
||||
filter "system:windows"
|
||||
systemversion "latest"
|
||||
staticruntime "On"
|
||||
|
||||
files
|
||||
{
|
||||
"src/win32_init.c",
|
||||
"src/win32_joystick.c",
|
||||
"src/win32_module.c",
|
||||
"src/win32_monitor.c",
|
||||
"src/win32_time.c",
|
||||
"src/win32_thread.c",
|
||||
"src/win32_window.c",
|
||||
"src/wgl_context.c",
|
||||
"src/egl_context.c",
|
||||
"src/osmesa_context.c"
|
||||
}
|
||||
|
||||
defines
|
||||
{
|
||||
"_GLFW_WIN32",
|
||||
"_CRT_SECURE_NO_WARNINGS"
|
||||
}
|
||||
|
||||
filter "configurations:Debug"
|
||||
runtime "Debug"
|
||||
symbols "on"
|
||||
|
||||
filter "configurations:Release"
|
||||
runtime "Release"
|
||||
optimize "on"
|
@ -402,6 +402,7 @@ struct _GLFWwndconfig
|
||||
GLFWbool focusOnShow;
|
||||
GLFWbool mousePassthrough;
|
||||
GLFWbool scaleToMonitor;
|
||||
int theme;
|
||||
struct {
|
||||
GLFWbool retina;
|
||||
char frameName[256];
|
||||
@ -526,6 +527,7 @@ struct _GLFWwindow
|
||||
GLFWbool focusOnShow;
|
||||
GLFWbool mousePassthrough;
|
||||
GLFWbool shouldClose;
|
||||
GLFWbool isLightTheme;
|
||||
void* userPointer;
|
||||
GLFWbool doublebuffer;
|
||||
GLFWvidmode videoMode;
|
||||
|
@ -149,6 +149,8 @@ static GLFWbool loadLibraries(void)
|
||||
_glfwPlatformGetModuleSymbol(_glfw.win32.dwmapi.instance, "DwmEnableBlurBehindWindow");
|
||||
_glfw.win32.dwmapi.GetColorizationColor = (PFN_DwmGetColorizationColor)
|
||||
_glfwPlatformGetModuleSymbol(_glfw.win32.dwmapi.instance, "DwmGetColorizationColor");
|
||||
_glfw.win32.dwmapi.DwmSetWindowAttribute = (PFN_DwmSetWindowAttribute)
|
||||
_glfwPlatformGetModuleSymbol(_glfw.win32.dwmapi.instance, "DwmSetWindowAttribute");
|
||||
}
|
||||
|
||||
_glfw.win32.shcore.instance = _glfwPlatformLoadModule("shcore.dll");
|
||||
@ -607,6 +609,14 @@ void _glfwUpdateKeyNamesWin32(void)
|
||||
}
|
||||
}
|
||||
|
||||
void _glfwSetWindowTheme(BOOL dark, HWND hwnd)
|
||||
{
|
||||
#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE
|
||||
#define DWMWA_USE_IMMERSIVE_DARK_MODE 20
|
||||
#endif
|
||||
_glfw.win32.dwmapi.DwmSetWindowAttribute(hwnd, DWMWA_USE_IMMERSIVE_DARK_MODE, &dark, sizeof(dark));
|
||||
}
|
||||
|
||||
// Replacement for IsWindowsVersionOrGreater, as we cannot rely on the
|
||||
// application having a correct embedded manifest
|
||||
//
|
||||
|
@ -299,8 +299,9 @@ typedef int (WINAPI * PFN_GetSystemMetricsForDpi)(int,UINT);
|
||||
// dwmapi.dll function pointer typedefs
|
||||
typedef HRESULT (WINAPI * PFN_DwmIsCompositionEnabled)(BOOL*);
|
||||
typedef HRESULT (WINAPI * PFN_DwmFlush)(VOID);
|
||||
typedef HRESULT(WINAPI * PFN_DwmEnableBlurBehindWindow)(HWND,const DWM_BLURBEHIND*);
|
||||
typedef HRESULT (WINAPI * PFN_DwmEnableBlurBehindWindow)(HWND,const DWM_BLURBEHIND*);
|
||||
typedef HRESULT (WINAPI * PFN_DwmGetColorizationColor)(DWORD*,BOOL*);
|
||||
typedef HRESULT (WINAPI * PFN_DwmSetWindowAttribute)(HWND, DWORD, LPCVOID, DWORD);
|
||||
#define DwmIsCompositionEnabled _glfw.win32.dwmapi.IsCompositionEnabled
|
||||
#define DwmFlush _glfw.win32.dwmapi.Flush
|
||||
#define DwmEnableBlurBehindWindow _glfw.win32.dwmapi.EnableBlurBehindWindow
|
||||
@ -491,6 +492,7 @@ typedef struct _GLFWlibraryWin32
|
||||
PFN_DwmFlush Flush;
|
||||
PFN_DwmEnableBlurBehindWindow EnableBlurBehindWindow;
|
||||
PFN_DwmGetColorizationColor GetColorizationColor;
|
||||
PFN_DwmSetWindowAttribute DwmSetWindowAttribute;
|
||||
} dwmapi;
|
||||
|
||||
struct {
|
||||
@ -537,6 +539,7 @@ BOOL _glfwIsWindowsVersionOrGreaterWin32(WORD major, WORD minor, WORD sp);
|
||||
BOOL _glfwIsWindows10BuildOrGreaterWin32(WORD build);
|
||||
void _glfwInputErrorWin32(int error, const char* description);
|
||||
void _glfwUpdateKeyNamesWin32(void);
|
||||
void _glfwSetWindowTheme(BOOL dark, HWND hwnd);
|
||||
|
||||
void _glfwPollMonitorsWin32(void);
|
||||
void _glfwSetVideoModeWin32(_GLFWmonitor* monitor, const GLFWvidmode* desired);
|
||||
|
@ -1367,6 +1367,36 @@ static int createNativeWindow(_GLFWwindow* window,
|
||||
_glfw.win32.instance,
|
||||
(LPVOID) wndconfig);
|
||||
|
||||
BOOL should_use_light_mode;
|
||||
if (wndconfig->theme == GLFW_THEME_AUTO)
|
||||
{
|
||||
BOOL success = FALSE;
|
||||
HKEY hRootKey = HKEY_CURRENT_USER;
|
||||
const wchar_t* lpSubKey = L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize";
|
||||
const wchar_t* lpValueName = L"AppsUseLightTheme";
|
||||
DWORD result;
|
||||
{
|
||||
HKEY hKey = 0;
|
||||
if (RegOpenKeyExW(hRootKey, lpSubKey, 0, KEY_READ, &hKey) == ERROR_SUCCESS)
|
||||
{
|
||||
DWORD dwBufferSize = sizeof(DWORD);
|
||||
DWORD dwData = 0;
|
||||
if (RegQueryValueExW(hKey, lpValueName, 0, NULL, (LPBYTE)(&dwData), &dwBufferSize) == ERROR_SUCCESS)
|
||||
{
|
||||
result = dwData;
|
||||
success = TRUE;
|
||||
}
|
||||
RegCloseKey(hKey);
|
||||
}
|
||||
}
|
||||
should_use_light_mode = success && result != 0;
|
||||
}
|
||||
else
|
||||
should_use_light_mode = wndconfig->theme == GLFW_THEME_LIGHT;
|
||||
|
||||
_glfwSetWindowTheme(!should_use_light_mode, window->win32.handle);
|
||||
window->isLightTheme = should_use_light_mode ? GLFW_TRUE : GLFW_FALSE;
|
||||
|
||||
_glfw_free(wideTitle);
|
||||
|
||||
if (!window->win32.handle)
|
||||
|
12
src/window.c
12
src/window.c
@ -386,6 +386,9 @@ GLFWAPI void glfwWindowHint(int hint, int value)
|
||||
case GLFW_SCALE_TO_MONITOR:
|
||||
_glfw.hints.window.scaleToMonitor = value ? GLFW_TRUE : GLFW_FALSE;
|
||||
return;
|
||||
case GLFW_THEME:
|
||||
_glfw.hints.window.theme = value;
|
||||
return;
|
||||
case GLFW_CENTER_CURSOR:
|
||||
_glfw.hints.window.centerCursor = value ? GLFW_TRUE : GLFW_FALSE;
|
||||
return;
|
||||
@ -583,6 +586,15 @@ GLFWAPI void glfwSetWindowPos(GLFWwindow* handle, int xpos, int ypos)
|
||||
_glfw.platform.setWindowPos(window, xpos, ypos);
|
||||
}
|
||||
|
||||
GLFWAPI int glfwIsWindowLightTheme(GLFWwindow* handle)
|
||||
{
|
||||
_GLFWwindow* window = (_GLFWwindow*)handle;
|
||||
assert(window != NULL);
|
||||
|
||||
_GLFW_REQUIRE_INIT_OR_RETURN(0);
|
||||
return window->isLightTheme;
|
||||
}
|
||||
|
||||
GLFWAPI void glfwGetWindowSize(GLFWwindow* handle, int* width, int* height)
|
||||
{
|
||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||
|
Loading…
Reference in New Issue
Block a user