Compare commits

...

12 Commits

Author SHA1 Message Date
Tianlan Zhou
364ace463a
Merge 1bd20df533 into 7ef6efeb66 2025-08-19 06:14:11 +03:00
Camilla Löwy
7ef6efeb66 Wayland: Fix cursor position after a modal
If a modal surface like the window menu was active, clicking on the GLFW
window content area to close it would correctly emit the cursor enter
event but would not propagate the cursor position from the event.
2025-08-18 20:58:12 +02:00
Camilla Löwy
3cf9f6726d Wayland: Fix fallback decoration cursor updating
When a click through to the fallback decorations caused the end of
a modal like the window menu, the cursor shape would not be updated
until the next time the cursor moved.

This commit adds an update of the cursor for the pointer enter event for
fallback decoration surfaces, in addition to the updates at pointer
motion events.
2025-08-18 18:06:46 +02:00
Camilla Löwy
bfa1c424e5 Wayland: Fix fallback decoration menu placement
The fallback decorations would place the menu at the wrong position, by
not translating the last decoration surface position into toplevel
surface coordinates.

This also limits the menu to the caption area of the top decoration
surface, similar to how other toolkits work.
2025-08-18 18:06:46 +02:00
SuperSodaSea
1bd20df533
Merge branch 'master' into feature/acceleration 2024-05-24 20:49:57 +08:00
Tianlan Zhou
475ba17351
Merge branch 'master' into feature/acceleration 2024-02-21 22:10:58 +08:00
SuperSodaSea
cac3fd18a0
Update context.c 2024-02-20 23:14:21 +08:00
SuperSodaSea
2c28530875
Update context.c & glfwinfo.c 2024-02-20 22:59:54 +08:00
SuperSodaSea
dc7c52ed31
Update CONTRIBUTORS.md 2024-02-20 22:25:45 +08:00
SuperSodaSea
456bb88748
Update win32_platform.h 2024-02-20 22:14:20 +08:00
SuperSodaSea
f447b250bf
Update README.md 2024-02-20 22:11:23 +08:00
SuperSodaSea
49d8b1ff11
Added GLFW_ACCELERATION window hint for hardware acceleration 2024-02-20 22:04:14 +08:00
12 changed files with 115 additions and 30 deletions

View File

@ -291,6 +291,7 @@ video tutorials.
- Ryogo Yoshimura
- Lukas Zanner
- Andrey Zholos
- Tianlan Zhou
- Aihui Zhu
- Santi Zupancic
- Jonas Ådahl

View File

@ -139,11 +139,17 @@ information on what to include when reporting a bug.
fallback decorations
- [Wayland] Bugfix: Fallback decorations would report scroll events
- [Wayland] Bugfix: Keyboard repeat events halted when any key is released (#2568)
- [Wayland] Bugfix: Fallback decorations would show menu at wrong position
- [Wayland] Bugfix: The cursor was not updated when clicking through from
a modal to a fallback decoration
- [Wayland] Bugfix: The cursor position was not updated when clicking through
from a modal to the content area
- [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`
- [EGL] Allowed native access on Wayland with `GLFW_CONTEXT_CREATION_API` set to
`GLFW_NATIVE_CONTEXT_API` (#2518)
- Added `GLFW_ACCELERATION` window hint for hardware acceleration (#2491)
## Contact

View File

@ -14,8 +14,25 @@ values over 8. For compatibility with older versions, the
@ref GLFW_UNLIMITED_MOUSE_BUTTONS input mode needs to be set to make use of
this.
### Window hint for hardware acceleration {#acceleration}
You can use window hint [GLFW_ACCELERATION](@ref GLFW_ACCELERATION_hint) to
specify whether hardware acceleration is preferred or not. The default value
is to prefer hardware acceleration. You can get whether hardware acceleration
is enabled with the window attribute
[GLFW_ACCELERATION](@ref GLFW_ACCELERATION_attrib). This feature is only
available on WGL currently.
## Caveats {#caveats}
### Microsoft GDI software OpenGL ICD support {#gdi_opengl_icd}
GLFW now supports creating window when the Microsoft GDI software OpenGL ICD is
the only available implementation.
See [GLFW_ACCELERATION](@ref GLFW_ACCELERATION_hint) for more details.
## Deprecations {#deprecations}
## Removals {#removals}
@ -52,4 +69,3 @@ actively maintained and available on many platforms.
- [Release notes for 3.2](https://www.glfw.org/docs/3.2/news.html)
- [Release notes for 3.1](https://www.glfw.org/docs/3.1/news.html)
- [Release notes for 3.0](https://www.glfw.org/docs/3.0/news.html)

View File

@ -336,6 +336,15 @@ __GLFW_DOUBLEBUFFER__ specifies whether the framebuffer should be double
buffered. You nearly always want to use double buffering. This is a hard
constraint. Possible values are `GLFW_TRUE` and `GLFW_FALSE`.
@anchor GLFW_ACCELERATION
@anchor GLFW_ACCELERATION_hint
__GLFW_ACCELERATION__ specifies whether the hardware acceleration should be
preferred. By default, hardware acceleration is preferred, and will fallback
to no acceleration if hardware acceleration is unavailable. Possible values
are `GLFW_TRUE` and `GLFW_FALSE`.
This hint only has an effect on WGL.
#### Monitor related hints {#window_hints_mtr}
@ -1487,6 +1496,11 @@ __GLFW_DOUBLEBUFFER__ indicates whether the specified window is double-buffered
when rendering with OpenGL or OpenGL ES. This can be set before creation with
the [GLFW_DOUBLEBUFFER](@ref GLFW_DOUBLEBUFFER_hint) window hint.
@anchor GLFW_ACCELERATION_attrib
__GLFW_ACCELERATION__ indicates whether the specified window is hardware
accelerated when rendering with OpenGL or OpenGL ES. This can be set before
creation with the [GLFW_ACCELERATION](@ref GLFW_ACCELERATION_hint) window hint.
## Buffer swapping {#buffer_swap}

View File

@ -1022,6 +1022,14 @@ extern "C" {
* [attribute](@ref GLFW_DOUBLEBUFFER_attrib).
*/
#define GLFW_DOUBLEBUFFER 0x00021010
/*! @brief Hardware acceleration hint.
*
* Hardware acceleration [hint](@ref GLFW_ACCELERATION_hint) and
* [attribute](@ref GLFW_ACCELERATION_attrib).
*
* @since Added in version 3.4.
*/
#define GLFW_ACCELERATION 0x00021011
/*! @brief Context client API hint and attribute.
*
@ -3159,9 +3167,6 @@ GLFWAPI void glfwWindowHintString(int hint, const char* value);
* GLFW_VERSION_UNAVAILABLE, @ref GLFW_FORMAT_UNAVAILABLE, @ref
* GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_ERROR.
*
* @remark @win32 Window creation will fail if the Microsoft GDI software
* OpenGL implementation is the only one available.
*
* @remark @win32 If the executable has an icon resource named `GLFW_ICON,` it
* will be set as the initial icon for the window. If no such icon is present,
* the `IDI_APPLICATION` icon will be used instead. To set a different icon,

View File

@ -28,10 +28,10 @@
#include "internal.h"
#include <assert.h>
#include <limits.h>
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#include <limits.h>
#include <stdio.h>
//////////////////////////////////////////////////////////////////////////
@ -185,6 +185,7 @@ const _GLFWfbconfig* _glfwChooseFBConfig(const _GLFWfbconfig* desired,
unsigned int count)
{
unsigned int i;
bool accelerationMatch, closestAccelerationMatch = false;
unsigned int missing, leastMissing = UINT_MAX;
unsigned int colorDiff, leastColorDiff = UINT_MAX;
unsigned int extraDiff, leastExtraDiff = UINT_MAX;
@ -201,6 +202,8 @@ const _GLFWfbconfig* _glfwChooseFBConfig(const _GLFWfbconfig* desired,
continue;
}
accelerationMatch = desired->acceleration == current->acceleration;
// Count number of missing buffers
{
missing = 0;
@ -318,19 +321,25 @@ const _GLFWfbconfig* _glfwChooseFBConfig(const _GLFWfbconfig* desired,
// Least number of missing buffers is the most important heuristic,
// then color buffer size match and lastly size match for other buffers
if (missing < leastMissing)
if (accelerationMatch && !closestAccelerationMatch)
closest = current;
else if (missing == leastMissing)
else if (accelerationMatch == closestAccelerationMatch)
{
if ((colorDiff < leastColorDiff) ||
(colorDiff == leastColorDiff && extraDiff < leastExtraDiff))
{
if (missing < leastMissing)
closest = current;
else if (missing == leastMissing)
{
if ((colorDiff < leastColorDiff) ||
(colorDiff == leastColorDiff && extraDiff < leastExtraDiff))
{
closest = current;
}
}
}
if (current == closest)
{
closestAccelerationMatch = accelerationMatch;
leastMissing = missing;
leastColorDiff = colorDiff;
leastExtraDiff = extraDiff;

View File

@ -481,6 +481,7 @@ struct _GLFWfbconfig
GLFWbool sRGB;
GLFWbool doublebuffer;
GLFWbool transparent;
GLFWbool acceleration;
uintptr_t handle;
};
@ -541,6 +542,7 @@ struct _GLFWwindow
GLFWbool shouldClose;
void* userPointer;
GLFWbool doublebuffer;
GLFWbool acceleration;
GLFWvidmode videoMode;
_GLFWmonitor* monitor;
_GLFWcursor* cursor;

View File

@ -145,6 +145,8 @@ static int choosePixelFormatWGL(_GLFWwindow* window,
{
// Get pixel format attributes through "modern" extension
int acceleration;
if (!wglGetPixelFormatAttribivARB(window->context.wgl.dc,
pixelFormat, 0,
attribCount,
@ -166,12 +168,11 @@ static int choosePixelFormatWGL(_GLFWwindow* window,
if (FIND_ATTRIB_VALUE(WGL_PIXEL_TYPE_ARB) != WGL_TYPE_RGBA_ARB)
continue;
if (FIND_ATTRIB_VALUE(WGL_ACCELERATION_ARB) == WGL_NO_ACCELERATION_ARB)
continue;
if (FIND_ATTRIB_VALUE(WGL_DOUBLE_BUFFER_ARB) != fbconfig->doublebuffer)
continue;
acceleration = FIND_ATTRIB_VALUE(WGL_ACCELERATION_ARB);
u->redBits = FIND_ATTRIB_VALUE(WGL_RED_BITS_ARB);
u->greenBits = FIND_ATTRIB_VALUE(WGL_GREEN_BITS_ARB);
u->blueBits = FIND_ATTRIB_VALUE(WGL_BLUE_BITS_ARB);
@ -210,6 +211,10 @@ static int choosePixelFormatWGL(_GLFWwindow* window,
u->sRGB = GLFW_TRUE;
}
}
u->acceleration =
acceleration == WGL_GENERIC_ACCELERATION_ARB ||
acceleration == WGL_FULL_ACCELERATION_ARB;
}
else
{
@ -235,12 +240,6 @@ static int choosePixelFormatWGL(_GLFWwindow* window,
continue;
}
if (!(pfd.dwFlags & PFD_GENERIC_ACCELERATED) &&
(pfd.dwFlags & PFD_GENERIC_FORMAT))
{
continue;
}
if (pfd.iPixelType != PFD_TYPE_RGBA)
continue;
@ -264,6 +263,10 @@ static int choosePixelFormatWGL(_GLFWwindow* window,
if (pfd.dwFlags & PFD_STEREO)
u->stereo = GLFW_TRUE;
u->acceleration =
(pfd.dwFlags & PFD_GENERIC_ACCELERATED) ||
!(pfd.dwFlags & PFD_GENERIC_FORMAT);
}
u->handle = pixelFormat;
@ -437,8 +440,6 @@ GLFWbool _glfwInitWGL(void)
// NOTE: A dummy context has to be created for opengl32.dll to load the
// OpenGL ICD, from which we can then query WGL extensions
// NOTE: This code will accept the Microsoft GDI ICD; accelerated context
// creation failure occurs during manual pixel format enumeration
dc = GetDC(_glfw.win32.helperWindowHandle);

View File

@ -172,6 +172,8 @@ typedef enum
#define WGL_TYPE_RGBA_ARB 0x202b
#define WGL_ACCELERATION_ARB 0x2003
#define WGL_NO_ACCELERATION_ARB 0x2025
#define WGL_GENERIC_ACCELERATION_ARB 0x2026
#define WGL_FULL_ACCELERATION_ARB 0x2027
#define WGL_RED_BITS_ARB 0x2015
#define WGL_RED_SHIFT_ARB 0x2016
#define WGL_GREEN_BITS_ARB 0x2017

View File

@ -235,6 +235,7 @@ GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height,
window->cursorMode = GLFW_CURSOR_NORMAL;
window->doublebuffer = fbconfig.doublebuffer;
window->acceleration = fbconfig.acceleration;
window->minwidth = GLFW_DONT_CARE;
window->minheight = GLFW_DONT_CARE;
@ -287,6 +288,7 @@ void glfwDefaultWindowHints(void)
_glfw.hints.framebuffer.depthBits = 24;
_glfw.hints.framebuffer.stencilBits = 8;
_glfw.hints.framebuffer.doublebuffer = GLFW_TRUE;
_glfw.hints.framebuffer.acceleration = GLFW_TRUE;
// The default is to select the highest available refresh rate
_glfw.hints.refreshRate = GLFW_DONT_CARE;
@ -346,6 +348,9 @@ GLFWAPI void glfwWindowHint(int hint, int value)
case GLFW_SRGB_CAPABLE:
_glfw.hints.framebuffer.sRGB = value ? GLFW_TRUE : GLFW_FALSE;
return;
case GLFW_ACCELERATION:
_glfw.hints.framebuffer.acceleration = value ? GLFW_TRUE : GLFW_FALSE;
return;
case GLFW_RESIZABLE:
_glfw.hints.window.resizable = value ? GLFW_TRUE : GLFW_FALSE;
return;
@ -912,6 +917,8 @@ GLFWAPI int glfwGetWindowAttrib(GLFWwindow* handle, int attrib)
return window->autoIconify;
case GLFW_DOUBLEBUFFER:
return window->doublebuffer;
case GLFW_ACCELERATION:
return window->acceleration;
case GLFW_CLIENT_API:
return window->context.client;
case GLFW_CONTEXT_CREATION_API:

View File

@ -405,13 +405,19 @@ static void handleFallbackDecorationButton(_GLFWwindow* window,
}
else if (button == BTN_RIGHT)
{
if (window->wl.xdg.toplevel)
{
xdg_toplevel_show_window_menu(window->wl.xdg.toplevel,
_glfw.wl.seat, serial,
window->wl.cursorPosX,
window->wl.cursorPosY);
}
if (!window->wl.xdg.toplevel)
return;
if (window->wl.fallback.focus != window->wl.fallback.top.surface)
return;
if (ypos < GLFW_BORDER_SIZE)
return;
xdg_toplevel_show_window_menu(window->wl.xdg.toplevel,
_glfw.wl.seat, serial,
xpos,
ypos - GLFW_CAPTION_HEIGHT - GLFW_BORDER_SIZE);
}
}
@ -1532,11 +1538,21 @@ static void pointerHandleEnter(void* userData,
window->wl.hovered = GLFW_TRUE;
_glfwSetCursorWayland(window, window->wl.currentCursor);
_glfwInputCursorEnter(window, GLFW_TRUE);
if (window->cursorMode != GLFW_CURSOR_DISABLED)
{
window->wl.cursorPosX = wl_fixed_to_double(sx);
window->wl.cursorPosY = wl_fixed_to_double(sy);
_glfwInputCursorPos(window, window->wl.cursorPosX, window->wl.cursorPosY);
}
}
else
{
if (window->wl.fallback.decorations)
{
window->wl.fallback.focus = surface;
updateFallbackDecorationCursor(window, sx, sy);
}
}
}

View File

@ -383,6 +383,7 @@ int main(int argc, char** argv)
int angle_type = GLFW_ANGLE_PLATFORM_TYPE_NONE;
bool cocoa_graphics_switching = false;
bool disable_xcb_surface = false;
bool acceleration = true;
enum { PLATFORM, CLIENT, CONTEXT, BEHAVIOR, DEBUG_CONTEXT, FORWARD, HELP,
EXTENSIONS, LAYERS,
@ -390,7 +391,7 @@ int main(int argc, char** argv)
REDBITS, GREENBITS, BLUEBITS, ALPHABITS, DEPTHBITS, STENCILBITS,
ACCUMREDBITS, ACCUMGREENBITS, ACCUMBLUEBITS, ACCUMALPHABITS,
AUXBUFFERS, SAMPLES, STEREO, SRGB, SINGLEBUFFER, NOERROR_SRSLY,
ANGLE_TYPE, GRAPHICS_SWITCHING, XCB_SURFACE };
ANGLE_TYPE, GRAPHICS_SWITCHING, XCB_SURFACE, NO_ACCELERATION };
const struct option options[] =
{
{ "platform", 1, NULL, PLATFORM },
@ -426,6 +427,7 @@ int main(int argc, char** argv)
{ "angle-type", 1, NULL, ANGLE_TYPE },
{ "graphics-switching", 0, NULL, GRAPHICS_SWITCHING },
{ "vk-xcb-surface", 0, NULL, XCB_SURFACE },
{ "no-acceleration", 0, NULL, NO_ACCELERATION },
{ NULL, 0, NULL, 0 }
};
@ -654,6 +656,9 @@ int main(int argc, char** argv)
case XCB_SURFACE:
disable_xcb_surface = true;
break;
case NO_ACCELERATION:
acceleration = false;
break;
default:
usage();
exit(EXIT_FAILURE);
@ -708,6 +713,7 @@ int main(int argc, char** argv)
glfwWindowHint(GLFW_STEREO, fb_stereo);
glfwWindowHint(GLFW_SRGB_CAPABLE, fb_srgb);
glfwWindowHint(GLFW_DOUBLEBUFFER, fb_doublebuffer);
glfwWindowHint(GLFW_ACCELERATION, acceleration);
glfwWindowHint(GLFW_COCOA_GRAPHICS_SWITCHING, cocoa_graphics_switching);