Compare commits

...

11 Commits

Author SHA1 Message Date
Minterl
00679ca5fc
Merge c371f4cb7d into feb2a6b728 2025-07-18 15:43:26 +08:00
Doug Binks
feb2a6b728 Wayland: Reset key repeat timer on window destruction
Windows with keyboard focus may have an active key repeat timer.
This should be reset when the window is closed, or key repeat events
could be sent to a NULL window were it not for the quickfix in PR #2732.

Fixes #2741
Probably the source of #2727
2025-07-17 17:24:19 +02:00
Mike Interlandi
c371f4cb7d null platform fallback for other platform implementations 2025-02-03 13:35:35 -05:00
Mike Interlandi
845f0bd901 declare function in other platform headers 2025-02-03 13:23:00 -05:00
Mike Interlandi
955e8b0fa4 validate nItems & prop in _glfwGetWindowIsFullscreenX11 2025-02-03 13:06:41 -05:00
Mike Interlandi
8c3f416c3b remove .cache from .gitignore 2025-02-03 12:56:53 -05:00
Mike Interlandi
77fae536a9 move fullscreen check in tests/window with other glfwGetWindowAttrib 2025-02-03 12:11:02 -05:00
Mike Interlandi
1b5c120205 cleanup 2025-02-03 12:04:35 -05:00
Mike Interlandi
bb4ba846da integrate _glfwGetWindowIsFullscreenX11 with platform idiom 2025-02-03 11:57:46 -05:00
Mike Interlandi
618532218e GLFW_FULLSCREEN window attrib (x11) 2025-02-02 17:07:38 -05:00
Mike Interlandi
98019fbe98 add clangd .cache to gitignore 2025-02-01 18:11:04 -05:00
17 changed files with 71 additions and 0 deletions

View File

@ -132,6 +132,7 @@ information on what to include when reporting a bug.
- [Wayland] Bugfix: `glfwInit` would segfault on compositor with no seat (#2517)
- [Wayland] Bugfix: A drag entering a non-GLFW surface could cause a segfault
- [Wayland] Bugfix: Ignore key repeat events when no window has keyboard focus (#2727)
- [Wayland] Bugfix: Reset key repeat timer when window destroyed (#2741,#2727)
- [X11] Bugfix: Running without a WM could trigger an assert (#2593,#2601,#2631)
- [Null] Added Vulkan 'window' surface creation via `VK_EXT_headless_surface`
- [Null] Added EGL context creation on Mesa via `EGL_MESA_platform_surfaceless`

View File

@ -1102,6 +1102,7 @@ extern "C" {
* [window hint](@ref GLFW_SCALE_FRAMEBUFFER_hint).
*/
#define GLFW_SCALE_FRAMEBUFFER 0x0002200D
#define GLFW_FULLSCREEN 0x0002200E
/*! @brief Legacy name for compatibility.
*
* This is an alias for the

View File

@ -555,6 +555,7 @@ GLFWbool _glfwConnectCocoa(int platformID, _GLFWplatform* platform)
.setWindowFloating = _glfwSetWindowFloatingCocoa,
.setWindowOpacity = _glfwSetWindowOpacityCocoa,
.setWindowMousePassthrough = _glfwSetWindowMousePassthroughCocoa,
.getWindowIsFullscreen = _glfwGetWindowIsFullscreenNull,
.pollEvents = _glfwPollEventsCocoa,
.waitEvents = _glfwWaitEventsCocoa,
.waitEventsTimeout = _glfwWaitEventsTimeoutCocoa,

View File

@ -247,6 +247,7 @@ void _glfwSetWindowFloatingCocoa(_GLFWwindow* window, GLFWbool enabled);
float _glfwGetWindowOpacityCocoa(_GLFWwindow* window);
void _glfwSetWindowOpacityCocoa(_GLFWwindow* window, float opacity);
void _glfwSetWindowMousePassthroughCocoa(_GLFWwindow* window, GLFWbool enabled);
GLFWbool _glfwGetWindowIsFullscreenCocoa(_GLFWwindow* window);
void _glfwSetRawMouseMotionCocoa(_GLFWwindow *window, GLFWbool enabled);
GLFWbool _glfwRawMouseMotionSupportedCocoa(void);

View File

@ -747,6 +747,7 @@ struct _GLFWplatform
void (*setWindowFloating)(_GLFWwindow*,GLFWbool);
void (*setWindowOpacity)(_GLFWwindow*,float);
void (*setWindowMousePassthrough)(_GLFWwindow*,GLFWbool);
GLFWbool (*getWindowIsFullscreen) (_GLFWwindow*);
void (*pollEvents)(void);
void (*waitEvents)(void);
void (*waitEventsTimeout)(double);

View File

@ -243,6 +243,8 @@ void _glfwSetWindowResizableNull(_GLFWwindow* window, GLFWbool enabled);
void _glfwSetWindowDecoratedNull(_GLFWwindow* window, GLFWbool enabled);
void _glfwSetWindowFloatingNull(_GLFWwindow* window, GLFWbool enabled);
void _glfwSetWindowMousePassthroughNull(_GLFWwindow* window, GLFWbool enabled);
GLFWbool _glfwGetWindowIsFullscreenNull(_GLFWwindow* window);
float _glfwGetWindowOpacityNull(_GLFWwindow* window);
void _glfwSetWindowOpacityNull(_GLFWwindow* window, float opacity);
void _glfwSetRawMouseMotionNull(_GLFWwindow *window, GLFWbool enabled);

View File

@ -408,6 +408,11 @@ void _glfwSetWindowMousePassthroughNull(_GLFWwindow* window, GLFWbool enabled)
{
}
GLFWbool _glfwGetWindowIsFullscreenNull(_GLFWwindow* window)
{
return 0;
}
float _glfwGetWindowOpacityNull(_GLFWwindow* window)
{
return window->null.opacity;

View File

@ -660,6 +660,7 @@ GLFWbool _glfwConnectWin32(int platformID, _GLFWplatform* platform)
.setWindowFloating = _glfwSetWindowFloatingWin32,
.setWindowOpacity = _glfwSetWindowOpacityWin32,
.setWindowMousePassthrough = _glfwSetWindowMousePassthroughWin32,
.getWindowIsFullscreen = _glfwGetWindowIsFullscreenNull,
.pollEvents = _glfwPollEventsWin32,
.waitEvents = _glfwWaitEventsWin32,
.waitEventsTimeout = _glfwWaitEventsTimeoutWin32,

View File

@ -513,6 +513,7 @@ void _glfwSetWindowResizableWin32(_GLFWwindow* window, GLFWbool enabled);
void _glfwSetWindowDecoratedWin32(_GLFWwindow* window, GLFWbool enabled);
void _glfwSetWindowFloatingWin32(_GLFWwindow* window, GLFWbool enabled);
void _glfwSetWindowMousePassthroughWin32(_GLFWwindow* window, GLFWbool enabled);
GLFWbool _glfwGetWindowIsFullscreenWin32(_GLFWwindow* window);
float _glfwGetWindowOpacityWin32(_GLFWwindow* window);
void _glfwSetWindowOpacityWin32(_GLFWwindow* window, float opacity);

View File

@ -900,6 +900,8 @@ GLFWAPI int glfwGetWindowAttrib(GLFWwindow* handle, int attrib)
return window->focusOnShow;
case GLFW_MOUSE_PASSTHROUGH:
return window->mousePassthrough;
case GLFW_FULLSCREEN:
return _glfw.platform.getWindowIsFullscreen(window);
case GLFW_TRANSPARENT_FRAMEBUFFER:
return _glfw.platform.framebufferTransparent(window);
case GLFW_RESIZABLE:

View File

@ -506,6 +506,7 @@ GLFWbool _glfwConnectWayland(int platformID, _GLFWplatform* platform)
.setWindowFloating = _glfwSetWindowFloatingWayland,
.setWindowOpacity = _glfwSetWindowOpacityWayland,
.setWindowMousePassthrough = _glfwSetWindowMousePassthroughWayland,
.getWindowIsFullscreen = _glfwGetWindowIsFullscreenNull,
.pollEvents = _glfwPollEventsWayland,
.waitEvents = _glfwWaitEventsWayland,
.waitEventsTimeout = _glfwWaitEventsTimeoutWayland,

View File

@ -648,6 +648,7 @@ void _glfwSetWindowFloatingWayland(_GLFWwindow* window, GLFWbool enabled);
float _glfwGetWindowOpacityWayland(_GLFWwindow* window);
void _glfwSetWindowOpacityWayland(_GLFWwindow* window, float opacity);
void _glfwSetWindowMousePassthroughWayland(_GLFWwindow* window, GLFWbool enabled);
GLFWbool _glfwGetWindowIsFullscreenWayland(_GLFWwindow* window);
void _glfwSetRawMouseMotionWayland(_GLFWwindow* window, GLFWbool enabled);
GLFWbool _glfwRawMouseMotionSupportedWayland(void);

View File

@ -2187,7 +2187,12 @@ void _glfwDestroyWindowWayland(_GLFWwindow* window)
_glfw.wl.pointerFocus = NULL;
if (window == _glfw.wl.keyboardFocus)
{
struct itimerspec timer = {0};
timerfd_settime(_glfw.wl.keyRepeatTimerfd, 0, &timer, NULL);
_glfw.wl.keyboardFocus = NULL;
}
if (window->wl.fractionalScale)
wp_fractional_scale_v1_destroy(window->wl.fractionalScale);

View File

@ -1237,6 +1237,7 @@ GLFWbool _glfwConnectX11(int platformID, _GLFWplatform* platform)
.setWindowFloating = _glfwSetWindowFloatingX11,
.setWindowOpacity = _glfwSetWindowOpacityX11,
.setWindowMousePassthrough = _glfwSetWindowMousePassthroughX11,
.getWindowIsFullscreen = _glfwGetWindowIsFullscreenX11,
.pollEvents = _glfwPollEventsX11,
.waitEvents = _glfwWaitEventsX11,
.waitEventsTimeout = _glfwWaitEventsTimeoutX11,

View File

@ -934,6 +934,7 @@ void _glfwSetWindowFloatingX11(_GLFWwindow* window, GLFWbool enabled);
float _glfwGetWindowOpacityX11(_GLFWwindow* window);
void _glfwSetWindowOpacityX11(_GLFWwindow* window, float opacity);
void _glfwSetWindowMousePassthroughX11(_GLFWwindow* window, GLFWbool enabled);
GLFWbool _glfwGetWindowIsFullscreenX11(_GLFWwindow* window);
void _glfwSetRawMouseMotionX11(_GLFWwindow *window, GLFWbool enabled);
GLFWbool _glfwRawMouseMotionSupportedX11(void);

View File

@ -2729,6 +2729,51 @@ void _glfwSetWindowMousePassthroughX11(_GLFWwindow* window, GLFWbool enabled)
}
}
GLFWbool _glfwGetWindowIsFullscreenX11(_GLFWwindow* window)
{
Atom wm_state = XInternAtom(_glfw.x11.display, "_NET_WM_STATE", True);
Atom wm_state_fullscreen = XInternAtom(_glfw.x11.display, "_NET_WM_STATE_FULLSCREEN", True);
Atom type = XA_ATOM;
int format;
size_t nItems;
size_t bytesAfterReturn;
Atom* prop;
int result = XGetWindowProperty(
_glfw.x11.display,
window->x11.handle,
wm_state,
0,
~0L,
False,
AnyPropertyType,
&type,
&format,
&nItems,
&bytesAfterReturn,
(unsigned char**)&prop
);
assert(result == Success);
assert(nItems > 0);
if (!prop) {
return 0;
}
GLFWbool isFullscreen = 0;
for (int i = 0; i < nItems; i++) {
if (prop[i] == wm_state_fullscreen) {
isFullscreen = 1;
}
}
XFree(prop);
return isFullscreen;
}
float _glfwGetWindowOpacityX11(_GLFWwindow* window)
{
float opacity = 1.f;

View File

@ -441,6 +441,7 @@ int main(int argc, char** argv)
nk_value_bool(nk, "Visible", glfwGetWindowAttrib(window, GLFW_VISIBLE));
nk_value_bool(nk, "Iconified", glfwGetWindowAttrib(window, GLFW_ICONIFIED));
nk_value_bool(nk, "Maximized", glfwGetWindowAttrib(window, GLFW_MAXIMIZED));
nk_value_bool(nk, "Fullscreen", glfwGetWindowAttrib(window, GLFW_FULLSCREEN));
}
nk_end(nk);