mirror of
https://github.com/glfw/glfw.git
synced 2025-12-19 13:41:54 +00:00
Compare commits
8 Commits
fa25c4151e
...
52d622c150
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
52d622c150 | ||
|
|
dbadda2683 | ||
|
|
08449b7183 | ||
|
|
1ce855b0b1 | ||
|
|
ebff6606ee | ||
|
|
162896e5b9 | ||
|
|
c8bb716886 | ||
|
|
127ae123fe |
@ -38,11 +38,7 @@ set(GLFW_LIBRARY_TYPE "${GLFW_LIBRARY_TYPE}" CACHE STRING
|
|||||||
"Library type override for GLFW (SHARED, STATIC, OBJECT, or empty to follow BUILD_SHARED_LIBS)")
|
"Library type override for GLFW (SHARED, STATIC, OBJECT, or empty to follow BUILD_SHARED_LIBS)")
|
||||||
|
|
||||||
if (GLFW_LIBRARY_TYPE)
|
if (GLFW_LIBRARY_TYPE)
|
||||||
if (GLFW_LIBRARY_TYPE STREQUAL "SHARED")
|
string(COMPARE EQUAL "${GLFW_LIBRARY_TYPE}" "SHARED" GLFW_BUILD_SHARED_LIBRARY)
|
||||||
set(GLFW_BUILD_SHARED_LIBRARY TRUE)
|
|
||||||
else()
|
|
||||||
set(GLFW_BUILD_SHARED_LIBRARY FALSE)
|
|
||||||
endif()
|
|
||||||
else()
|
else()
|
||||||
set(GLFW_BUILD_SHARED_LIBRARY ${BUILD_SHARED_LIBS})
|
set(GLFW_BUILD_SHARED_LIBRARY ${BUILD_SHARED_LIBS})
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@ -162,6 +162,7 @@ video tutorials.
|
|||||||
- Marcel Metz
|
- Marcel Metz
|
||||||
- Liam Middlebrook
|
- Liam Middlebrook
|
||||||
- mightgoyardstill
|
- mightgoyardstill
|
||||||
|
- Mihail
|
||||||
- Ave Milia
|
- Ave Milia
|
||||||
- Icyllis Milica
|
- Icyllis Milica
|
||||||
- Jonathan Miller
|
- Jonathan Miller
|
||||||
|
|||||||
@ -144,11 +144,16 @@ information on what to include when reporting a bug.
|
|||||||
a modal to a fallback decoration
|
a modal to a fallback decoration
|
||||||
- [Wayland] Bugfix: The cursor position was not updated when clicking through
|
- [Wayland] Bugfix: The cursor position was not updated when clicking through
|
||||||
from a modal to the content area
|
from a modal to the content area
|
||||||
|
- [Wayland] Bugfix: free modules at end of terminate function to resolve
|
||||||
|
potential segmentation fault (#2744)
|
||||||
|
- [Wayland] Bugfix: Confining or disabling the cursor could segfault on
|
||||||
|
compositors without `pointer-constraints-unstable-v1`
|
||||||
- [X11] Bugfix: Running without a WM could trigger an assert (#2593,#2601,#2631)
|
- [X11] Bugfix: Running without a WM could trigger an assert (#2593,#2601,#2631)
|
||||||
- [X11] Bugfix: Occasional crash when an idle display awakes (#2766)
|
- [X11] Bugfix: Occasional crash when an idle display awakes (#2766)
|
||||||
- [X11] Bugfix: Prevent BadWindow when creating small windows with a content scale
|
- [X11] Bugfix: Prevent BadWindow when creating small windows with a content scale
|
||||||
less than 1 (#2754)
|
less than 1 (#2754)
|
||||||
- [X11] Bugfix: Clamp width and height to >= 1 to prevent BadValue error and app exit
|
- [X11] Bugfix: Clamp width and height to >= 1 to prevent BadValue error and app exit
|
||||||
|
- [Linux] Bugfix: The header for `ioctl` was only implicitly included (#2778)
|
||||||
- [Null] Added Vulkan 'window' surface creation via `VK_EXT_headless_surface`
|
- [Null] Added Vulkan 'window' surface creation via `VK_EXT_headless_surface`
|
||||||
- [Null] Added EGL context creation on Mesa via `EGL_MESA_platform_surfaceless`
|
- [Null] Added EGL context creation on Mesa via `EGL_MESA_platform_surfaceless`
|
||||||
- [EGL] Allowed native access on Wayland with `GLFW_CONTEXT_CREATION_API` set to
|
- [EGL] Allowed native access on Wayland with `GLFW_CONTEXT_CREATION_API` set to
|
||||||
|
|||||||
@ -262,6 +262,11 @@ This is the new name, introduced in GLFW 3.4. The older
|
|||||||
`GLFW_COCOA_RETINA_FRAMEBUFFER` name is also available for compatibility. Both
|
`GLFW_COCOA_RETINA_FRAMEBUFFER` name is also available for compatibility. Both
|
||||||
names modify the same hint value.
|
names modify the same hint value.
|
||||||
|
|
||||||
|
@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
|
@anchor GLFW_MOUSE_PASSTHROUGH_hint
|
||||||
__GLFW_MOUSE_PASSTHROUGH__ specifies whether the window is transparent to mouse
|
__GLFW_MOUSE_PASSTHROUGH__ specifies whether the window is transparent to mouse
|
||||||
input, letting any mouse events pass through to whatever window is behind it.
|
input, letting any mouse events pass through to whatever window is behind it.
|
||||||
|
|||||||
@ -1108,6 +1108,11 @@ extern "C" {
|
|||||||
* [GLFW_SCALE_FRAMEBUFFER](@ref GLFW_SCALE_FRAMEBUFFER_hint) window hint for
|
* [GLFW_SCALE_FRAMEBUFFER](@ref GLFW_SCALE_FRAMEBUFFER_hint) window hint for
|
||||||
* compatibility with earlier versions.
|
* compatibility with earlier versions.
|
||||||
*/
|
*/
|
||||||
|
#define GLFW_THEME 0x0002200E
|
||||||
|
/*! @brief windows specific
|
||||||
|
*
|
||||||
|
* Allows specifying whether light or dark theme should be used.
|
||||||
|
*/
|
||||||
#define GLFW_COCOA_RETINA_FRAMEBUFFER 0x00023001
|
#define GLFW_COCOA_RETINA_FRAMEBUFFER 0x00023001
|
||||||
/*! @brief macOS specific
|
/*! @brief macOS specific
|
||||||
* [window hint](@ref GLFW_COCOA_FRAME_NAME_hint).
|
* [window hint](@ref GLFW_COCOA_FRAME_NAME_hint).
|
||||||
@ -1182,6 +1187,10 @@ extern "C" {
|
|||||||
|
|
||||||
#define GLFW_ANY_POSITION 0x80000000
|
#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
|
/*! @defgroup shapes Standard cursor shapes
|
||||||
* @brief Standard system cursor shapes.
|
* @brief Standard system cursor shapes.
|
||||||
*
|
*
|
||||||
@ -3480,6 +3489,8 @@ GLFWAPI void glfwGetWindowPos(GLFWwindow* window, int* xpos, int* ypos);
|
|||||||
*/
|
*/
|
||||||
GLFWAPI void glfwSetWindowPos(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.
|
/*! @brief Retrieves the size of the content area of the specified window.
|
||||||
*
|
*
|
||||||
* This function retrieves the size, in screen coordinates, of the content area
|
* This function retrieves the size, in screen coordinates, of the content area
|
||||||
|
|||||||
107
premake5.lua
Normal file
107
premake5.lua
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
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/posix_poll.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"
|
||||||
@ -555,7 +555,8 @@ void _glfwTerminateEGL(void)
|
|||||||
_glfw.egl.display = EGL_NO_DISPLAY;
|
_glfw.egl.display = EGL_NO_DISPLAY;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_glfw.egl.handle)
|
// Free modules only after all wayland termination functions are called
|
||||||
|
if (_glfw.egl.handle && _glfw.platform.platformID != GLFW_PLATFORM_WAYLAND)
|
||||||
{
|
{
|
||||||
_glfwPlatformFreeModule(_glfw.egl.handle);
|
_glfwPlatformFreeModule(_glfw.egl.handle);
|
||||||
_glfw.egl.handle = NULL;
|
_glfw.egl.handle = NULL;
|
||||||
|
|||||||
@ -414,6 +414,7 @@ struct _GLFWwndconfig
|
|||||||
GLFWbool mousePassthrough;
|
GLFWbool mousePassthrough;
|
||||||
GLFWbool scaleToMonitor;
|
GLFWbool scaleToMonitor;
|
||||||
GLFWbool scaleFramebuffer;
|
GLFWbool scaleFramebuffer;
|
||||||
|
int theme;
|
||||||
struct {
|
struct {
|
||||||
char frameName[256];
|
char frameName[256];
|
||||||
} ns;
|
} ns;
|
||||||
@ -538,6 +539,7 @@ struct _GLFWwindow
|
|||||||
GLFWbool focusOnShow;
|
GLFWbool focusOnShow;
|
||||||
GLFWbool mousePassthrough;
|
GLFWbool mousePassthrough;
|
||||||
GLFWbool shouldClose;
|
GLFWbool shouldClose;
|
||||||
|
GLFWbool isLightTheme;
|
||||||
void* userPointer;
|
void* userPointer;
|
||||||
GLFWbool doublebuffer;
|
GLFWbool doublebuffer;
|
||||||
GLFWvidmode videoMode;
|
GLFWvidmode videoMode;
|
||||||
|
|||||||
@ -32,6 +32,7 @@
|
|||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/inotify.h>
|
#include <sys/inotify.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
|
|||||||
@ -145,6 +145,8 @@ static GLFWbool loadLibraries(void)
|
|||||||
_glfwPlatformGetModuleSymbol(_glfw.win32.dwmapi.instance, "DwmEnableBlurBehindWindow");
|
_glfwPlatformGetModuleSymbol(_glfw.win32.dwmapi.instance, "DwmEnableBlurBehindWindow");
|
||||||
_glfw.win32.dwmapi.GetColorizationColor = (PFN_DwmGetColorizationColor)
|
_glfw.win32.dwmapi.GetColorizationColor = (PFN_DwmGetColorizationColor)
|
||||||
_glfwPlatformGetModuleSymbol(_glfw.win32.dwmapi.instance, "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");
|
_glfw.win32.shcore.instance = _glfwPlatformLoadModule("shcore.dll");
|
||||||
@ -528,7 +530,8 @@ void _glfwUpdateKeyNamesWin32(void)
|
|||||||
|
|
||||||
if (key >= GLFW_KEY_KP_0 && key <= GLFW_KEY_KP_ADD)
|
if (key >= GLFW_KEY_KP_0 && key <= GLFW_KEY_KP_ADD)
|
||||||
{
|
{
|
||||||
const UINT vks[] = {
|
const UINT vks[] =
|
||||||
|
{
|
||||||
VK_NUMPAD0, VK_NUMPAD1, VK_NUMPAD2, VK_NUMPAD3,
|
VK_NUMPAD0, VK_NUMPAD1, VK_NUMPAD2, VK_NUMPAD3,
|
||||||
VK_NUMPAD4, VK_NUMPAD5, VK_NUMPAD6, VK_NUMPAD7,
|
VK_NUMPAD4, VK_NUMPAD5, VK_NUMPAD6, VK_NUMPAD7,
|
||||||
VK_NUMPAD8, VK_NUMPAD9, VK_DECIMAL, VK_DIVIDE,
|
VK_NUMPAD8, VK_NUMPAD9, VK_DECIMAL, VK_DIVIDE,
|
||||||
@ -563,6 +566,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
|
// Replacement for IsWindowsVersionOrGreater, as we cannot rely on the
|
||||||
// application having a correct embedded manifest
|
// application having a correct embedded manifest
|
||||||
//
|
//
|
||||||
|
|||||||
@ -243,6 +243,7 @@ typedef HRESULT (WINAPI * PFN_DwmIsCompositionEnabled)(BOOL*);
|
|||||||
typedef HRESULT (WINAPI * PFN_DwmFlush)(VOID);
|
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_DwmGetColorizationColor)(DWORD*,BOOL*);
|
||||||
|
typedef HRESULT (WINAPI * PFN_DwmSetWindowAttribute)(HWND, DWORD, LPCVOID, DWORD);
|
||||||
#define DwmIsCompositionEnabled _glfw.win32.dwmapi.IsCompositionEnabled
|
#define DwmIsCompositionEnabled _glfw.win32.dwmapi.IsCompositionEnabled
|
||||||
#define DwmFlush _glfw.win32.dwmapi.Flush
|
#define DwmFlush _glfw.win32.dwmapi.Flush
|
||||||
#define DwmEnableBlurBehindWindow _glfw.win32.dwmapi.EnableBlurBehindWindow
|
#define DwmEnableBlurBehindWindow _glfw.win32.dwmapi.EnableBlurBehindWindow
|
||||||
@ -430,6 +431,7 @@ typedef struct _GLFWlibraryWin32
|
|||||||
PFN_DwmFlush Flush;
|
PFN_DwmFlush Flush;
|
||||||
PFN_DwmEnableBlurBehindWindow EnableBlurBehindWindow;
|
PFN_DwmEnableBlurBehindWindow EnableBlurBehindWindow;
|
||||||
PFN_DwmGetColorizationColor GetColorizationColor;
|
PFN_DwmGetColorizationColor GetColorizationColor;
|
||||||
|
PFN_DwmSetWindowAttribute DwmSetWindowAttribute;
|
||||||
} dwmapi;
|
} dwmapi;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
@ -476,6 +478,7 @@ BOOL _glfwIsWindowsVersionOrGreaterWin32(WORD major, WORD minor, WORD sp);
|
|||||||
BOOL _glfwIsWindows10BuildOrGreaterWin32(WORD build);
|
BOOL _glfwIsWindows10BuildOrGreaterWin32(WORD build);
|
||||||
void _glfwInputErrorWin32(int error, const char* description);
|
void _glfwInputErrorWin32(int error, const char* description);
|
||||||
void _glfwUpdateKeyNamesWin32(void);
|
void _glfwUpdateKeyNamesWin32(void);
|
||||||
|
void _glfwSetWindowTheme(BOOL dark, HWND hwnd);
|
||||||
|
|
||||||
void _glfwPollMonitorsWin32(void);
|
void _glfwPollMonitorsWin32(void);
|
||||||
void _glfwSetVideoModeWin32(_GLFWmonitor* monitor, const GLFWvidmode* desired);
|
void _glfwSetVideoModeWin32(_GLFWmonitor* monitor, const GLFWvidmode* desired);
|
||||||
|
|||||||
@ -1392,6 +1392,36 @@ static int createNativeWindow(_GLFWwindow* window,
|
|||||||
_glfw.win32.instance,
|
_glfw.win32.instance,
|
||||||
(LPVOID) wndconfig);
|
(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);
|
_glfw_free(wideTitle);
|
||||||
|
|
||||||
if (!window->win32.handle)
|
if (!window->win32.handle)
|
||||||
|
|||||||
11
src/window.c
11
src/window.c
@ -387,6 +387,8 @@ GLFWAPI void glfwWindowHint(int hint, int value)
|
|||||||
case GLFW_SCALE_FRAMEBUFFER:
|
case GLFW_SCALE_FRAMEBUFFER:
|
||||||
case GLFW_COCOA_RETINA_FRAMEBUFFER:
|
case GLFW_COCOA_RETINA_FRAMEBUFFER:
|
||||||
_glfw.hints.window.scaleFramebuffer = value ? GLFW_TRUE : GLFW_FALSE;
|
_glfw.hints.window.scaleFramebuffer = value ? GLFW_TRUE : GLFW_FALSE;
|
||||||
|
case GLFW_THEME:
|
||||||
|
_glfw.hints.window.theme = value;
|
||||||
return;
|
return;
|
||||||
case GLFW_CENTER_CURSOR:
|
case GLFW_CENTER_CURSOR:
|
||||||
_glfw.hints.window.centerCursor = value ? GLFW_TRUE : GLFW_FALSE;
|
_glfw.hints.window.centerCursor = value ? GLFW_TRUE : GLFW_FALSE;
|
||||||
@ -606,6 +608,15 @@ GLFWAPI void glfwSetWindowPos(GLFWwindow* handle, int xpos, int ypos)
|
|||||||
_glfw.platform.setWindowPos(window, xpos, 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)
|
GLFWAPI void glfwGetWindowSize(GLFWwindow* handle, int* width, int* height)
|
||||||
{
|
{
|
||||||
if (width)
|
if (width)
|
||||||
|
|||||||
@ -907,18 +907,6 @@ void _glfwTerminateWayland(void)
|
|||||||
libdecor_unref(_glfw.wl.libdecor.context);
|
libdecor_unref(_glfw.wl.libdecor.context);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_glfw.wl.libdecor.handle)
|
|
||||||
{
|
|
||||||
_glfwPlatformFreeModule(_glfw.wl.libdecor.handle);
|
|
||||||
_glfw.wl.libdecor.handle = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_glfw.wl.egl.handle)
|
|
||||||
{
|
|
||||||
_glfwPlatformFreeModule(_glfw.wl.egl.handle);
|
|
||||||
_glfw.wl.egl.handle = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_glfw.wl.xkb.composeState)
|
if (_glfw.wl.xkb.composeState)
|
||||||
xkb_compose_state_unref(_glfw.wl.xkb.composeState);
|
xkb_compose_state_unref(_glfw.wl.xkb.composeState);
|
||||||
if (_glfw.wl.xkb.keymap)
|
if (_glfw.wl.xkb.keymap)
|
||||||
@ -927,21 +915,11 @@ void _glfwTerminateWayland(void)
|
|||||||
xkb_state_unref(_glfw.wl.xkb.state);
|
xkb_state_unref(_glfw.wl.xkb.state);
|
||||||
if (_glfw.wl.xkb.context)
|
if (_glfw.wl.xkb.context)
|
||||||
xkb_context_unref(_glfw.wl.xkb.context);
|
xkb_context_unref(_glfw.wl.xkb.context);
|
||||||
if (_glfw.wl.xkb.handle)
|
|
||||||
{
|
|
||||||
_glfwPlatformFreeModule(_glfw.wl.xkb.handle);
|
|
||||||
_glfw.wl.xkb.handle = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_glfw.wl.cursorTheme)
|
if (_glfw.wl.cursorTheme)
|
||||||
wl_cursor_theme_destroy(_glfw.wl.cursorTheme);
|
wl_cursor_theme_destroy(_glfw.wl.cursorTheme);
|
||||||
if (_glfw.wl.cursorThemeHiDPI)
|
if (_glfw.wl.cursorThemeHiDPI)
|
||||||
wl_cursor_theme_destroy(_glfw.wl.cursorThemeHiDPI);
|
wl_cursor_theme_destroy(_glfw.wl.cursorThemeHiDPI);
|
||||||
if (_glfw.wl.cursor.handle)
|
|
||||||
{
|
|
||||||
_glfwPlatformFreeModule(_glfw.wl.cursor.handle);
|
|
||||||
_glfw.wl.cursor.handle = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (unsigned int i = 0; i < _glfw.wl.offerCount; i++)
|
for (unsigned int i = 0; i < _glfw.wl.offerCount; i++)
|
||||||
wl_data_offer_destroy(_glfw.wl.offers[i].offer);
|
wl_data_offer_destroy(_glfw.wl.offers[i].offer);
|
||||||
@ -1001,6 +979,38 @@ void _glfwTerminateWayland(void)
|
|||||||
if (_glfw.wl.cursorTimerfd >= 0)
|
if (_glfw.wl.cursorTimerfd >= 0)
|
||||||
close(_glfw.wl.cursorTimerfd);
|
close(_glfw.wl.cursorTimerfd);
|
||||||
|
|
||||||
|
// Free modules only after all Wayland termination functions are called
|
||||||
|
|
||||||
|
if (_glfw.egl.handle)
|
||||||
|
{
|
||||||
|
_glfwPlatformFreeModule(_glfw.egl.handle);
|
||||||
|
_glfw.egl.handle = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_glfw.wl.libdecor.handle)
|
||||||
|
{
|
||||||
|
_glfwPlatformFreeModule(_glfw.wl.libdecor.handle);
|
||||||
|
_glfw.wl.libdecor.handle = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_glfw.wl.egl.handle)
|
||||||
|
{
|
||||||
|
_glfwPlatformFreeModule(_glfw.wl.egl.handle);
|
||||||
|
_glfw.wl.egl.handle = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_glfw.wl.xkb.handle)
|
||||||
|
{
|
||||||
|
_glfwPlatformFreeModule(_glfw.wl.xkb.handle);
|
||||||
|
_glfw.wl.xkb.handle = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_glfw.wl.cursor.handle)
|
||||||
|
{
|
||||||
|
_glfwPlatformFreeModule(_glfw.wl.cursor.handle);
|
||||||
|
_glfw.wl.cursor.handle = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
_glfw_free(_glfw.wl.clipboardString);
|
_glfw_free(_glfw.wl.clipboardString);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -136,18 +136,22 @@ struct wl_output;
|
|||||||
#define GLFW_WAYLAND_MONITOR_STATE _GLFWmonitorWayland wl;
|
#define GLFW_WAYLAND_MONITOR_STATE _GLFWmonitorWayland wl;
|
||||||
#define GLFW_WAYLAND_CURSOR_STATE _GLFWcursorWayland wl;
|
#define GLFW_WAYLAND_CURSOR_STATE _GLFWcursorWayland wl;
|
||||||
|
|
||||||
struct wl_cursor_image {
|
struct wl_cursor_image
|
||||||
|
{
|
||||||
uint32_t width;
|
uint32_t width;
|
||||||
uint32_t height;
|
uint32_t height;
|
||||||
uint32_t hotspot_x;
|
uint32_t hotspot_x;
|
||||||
uint32_t hotspot_y;
|
uint32_t hotspot_y;
|
||||||
uint32_t delay;
|
uint32_t delay;
|
||||||
};
|
};
|
||||||
struct wl_cursor {
|
|
||||||
|
struct wl_cursor
|
||||||
|
{
|
||||||
unsigned int image_count;
|
unsigned int image_count;
|
||||||
struct wl_cursor_image** images;
|
struct wl_cursor_image** images;
|
||||||
char* name;
|
char* name;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct wl_cursor_theme* (* PFN_wl_cursor_theme_load)(const char*, int, struct wl_shm*);
|
typedef struct wl_cursor_theme* (* PFN_wl_cursor_theme_load)(const char*, int, struct wl_shm*);
|
||||||
typedef void (* PFN_wl_cursor_theme_destroy)(struct wl_cursor_theme*);
|
typedef void (* PFN_wl_cursor_theme_destroy)(struct wl_cursor_theme*);
|
||||||
typedef struct wl_cursor* (* PFN_wl_cursor_theme_get_cursor)(struct wl_cursor_theme*, const char*);
|
typedef struct wl_cursor* (* PFN_wl_cursor_theme_get_cursor)(struct wl_cursor_theme*, const char*);
|
||||||
|
|||||||
@ -1692,7 +1692,8 @@ static void keyboardHandleKeymap(void* userData,
|
|||||||
}
|
}
|
||||||
|
|
||||||
mapStr = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0);
|
mapStr = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0);
|
||||||
if (mapStr == MAP_FAILED) {
|
if (mapStr == MAP_FAILED)
|
||||||
|
{
|
||||||
close(fd);
|
close(fd);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1838,7 +1839,9 @@ static void keyboardHandleKey(void* userData,
|
|||||||
timer.it_value.tv_nsec = (_glfw.wl.keyRepeatDelay % 1000) * 1000000;
|
timer.it_value.tv_nsec = (_glfw.wl.keyRepeatDelay % 1000) * 1000000;
|
||||||
timerfd_settime(_glfw.wl.keyRepeatTimerfd, 0, &timer, NULL);
|
timerfd_settime(_glfw.wl.keyRepeatTimerfd, 0, &timer, NULL);
|
||||||
}
|
}
|
||||||
} else if (scancode == _glfw.wl.keyRepeatScancode) {
|
}
|
||||||
|
else if (scancode == _glfw.wl.keyRepeatScancode)
|
||||||
|
{
|
||||||
timerfd_settime(_glfw.wl.keyRepeatTimerfd, 0, &timer, NULL);
|
timerfd_settime(_glfw.wl.keyRepeatTimerfd, 0, &timer, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2974,10 +2977,16 @@ static void lockPointer(_GLFWwindow* window)
|
|||||||
if (!_glfw.wl.relativePointerManager)
|
if (!_glfw.wl.relativePointerManager)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_FEATURE_UNAVAILABLE,
|
_glfwInputError(GLFW_FEATURE_UNAVAILABLE,
|
||||||
"Wayland: The compositor does not support pointer locking");
|
"Wayland: The compositor does not support relative pointer motion");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!_glfw.wl.pointerConstraints)
|
||||||
|
{
|
||||||
|
_glfwInputError(GLFW_FEATURE_UNAVAILABLE,
|
||||||
|
"Wayland: The compositor does not support locking the pointer");
|
||||||
|
}
|
||||||
|
|
||||||
window->wl.relativePointer =
|
window->wl.relativePointer =
|
||||||
zwp_relative_pointer_manager_v1_get_relative_pointer(
|
zwp_relative_pointer_manager_v1_get_relative_pointer(
|
||||||
_glfw.wl.relativePointerManager,
|
_glfw.wl.relativePointerManager,
|
||||||
@ -3025,6 +3034,12 @@ static const struct zwp_confined_pointer_v1_listener confinedPointerListener =
|
|||||||
|
|
||||||
static void confinePointer(_GLFWwindow* window)
|
static void confinePointer(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
|
if (!_glfw.wl.pointerConstraints)
|
||||||
|
{
|
||||||
|
_glfwInputError(GLFW_FEATURE_UNAVAILABLE,
|
||||||
|
"Wayland: The compositor does not support confining the pointer");
|
||||||
|
}
|
||||||
|
|
||||||
window->wl.confinedPointer =
|
window->wl.confinedPointer =
|
||||||
zwp_pointer_constraints_v1_confine_pointer(
|
zwp_pointer_constraints_v1_confine_pointer(
|
||||||
_glfw.wl.pointerConstraints,
|
_glfw.wl.pointerConstraints,
|
||||||
|
|||||||
@ -151,7 +151,8 @@ void _glfwPollMonitorsX11(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
XRRCrtcInfo* ci = XRRGetCrtcInfo(_glfw.x11.display, sr, oi->crtc);
|
XRRCrtcInfo* ci = XRRGetCrtcInfo(_glfw.x11.display, sr, oi->crtc);
|
||||||
if (!ci) {
|
if (!ci)
|
||||||
|
{
|
||||||
XRRFreeOutputInfo(oi);
|
XRRFreeOutputInfo(oi);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2207,7 +2207,7 @@ void _glfwGetWindowSizeX11(_GLFWwindow* window, int* width, int* height)
|
|||||||
|
|
||||||
void _glfwSetWindowSizeX11(_GLFWwindow* window, int width, int height)
|
void _glfwSetWindowSizeX11(_GLFWwindow* window, int width, int height)
|
||||||
{
|
{
|
||||||
// The dimensions must be nonzero, or a BadValue error results.
|
// The dimensions must be nonzero, or a BadValue error results
|
||||||
width = _glfw_max(1, width);
|
width = _glfw_max(1, width);
|
||||||
height = _glfw_max(1, height);
|
height = _glfw_max(1, height);
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user