mirror of
https://github.com/glfw/glfw.git
synced 2026-01-15 02:25:31 +00:00
Compare commits
6 Commits
68c40c5b1f
...
753029b3ad
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
753029b3ad | ||
|
|
9352d8fe93 | ||
|
|
a228a8b447 | ||
|
|
9ae058b208 | ||
|
|
6836e650bc | ||
|
|
5e1ec2444f |
@ -153,6 +153,7 @@ information on what to include when reporting a bug.
|
||||
- [X11] Bugfix: Prevent BadWindow when creating small windows with a content scale
|
||||
less than 1 (#2754)
|
||||
- [X11] Bugfix: Clamp width and height to >= 1 to prevent BadValue error and app exit
|
||||
- [X11] Bugfix: Floating windows silently became non-floating when hidden (#2276)
|
||||
- [Linux] Bugfix: The header for `ioctl` was only implicitly included (#2778)
|
||||
- [Null] Added Vulkan 'window' surface creation via `VK_EXT_headless_surface`
|
||||
- [Null] Added EGL context creation on Mesa via `EGL_MESA_platform_surfaceless`
|
||||
|
||||
@ -51,7 +51,7 @@
|
||||
static void handleKeyEvent(_GLFWjoystick* js, int code, int value)
|
||||
{
|
||||
_glfwInputJoystickButton(js,
|
||||
js->linjs.keyMap[code - BTN_MISC],
|
||||
js->linjs.keyMap[code],
|
||||
value ? GLFW_PRESS : GLFW_RELEASE);
|
||||
}
|
||||
|
||||
@ -191,12 +191,28 @@ static GLFWbool openJoystickDevice(const char* path)
|
||||
|
||||
int axisCount = 0, buttonCount = 0, hatCount = 0;
|
||||
|
||||
for (int code = BTN_MISC; code < KEY_CNT; code++)
|
||||
// This loop should stop at KEY_CNT instead of KEY_MAX. However, we are
|
||||
// terminating the loop one iteration early to maintain compatibility with
|
||||
// the SDL gamepad mappings.
|
||||
for (int code = BTN_JOYSTICK; code < KEY_MAX; code++)
|
||||
{
|
||||
if (!isBitSet(code, keyBits))
|
||||
continue;
|
||||
|
||||
linjs.keyMap[code - BTN_MISC] = buttonCount;
|
||||
linjs.keyMap[code] = buttonCount;
|
||||
buttonCount++;
|
||||
}
|
||||
|
||||
// Originally, this range was not mapped, but some controllers now output
|
||||
// these values. Appending them to the end of the list maintains both
|
||||
// backwards compatibility with older versions of GLFW, and with the SDL
|
||||
// gamepad mappings.
|
||||
for (int code = 0; code < BTN_JOYSTICK; code++)
|
||||
{
|
||||
if (!isBitSet(code, keyBits))
|
||||
continue;
|
||||
|
||||
linjs.keyMap[code] = buttonCount;
|
||||
buttonCount++;
|
||||
}
|
||||
|
||||
|
||||
@ -37,7 +37,7 @@ typedef struct _GLFWjoystickLinux
|
||||
{
|
||||
int fd;
|
||||
char path[PATH_MAX];
|
||||
int keyMap[KEY_CNT - BTN_MISC];
|
||||
int keyMap[KEY_CNT];
|
||||
int absMap[ABS_CNT];
|
||||
struct input_absinfo absInfo[ABS_CNT];
|
||||
int hats[4][2];
|
||||
|
||||
@ -2438,6 +2438,38 @@ void _glfwShowWindowX11(_GLFWwindow* window)
|
||||
if (_glfwWindowVisibleX11(window))
|
||||
return;
|
||||
|
||||
if (window->floating && _glfw.x11.NET_WM_STATE && _glfw.x11.NET_WM_STATE_ABOVE)
|
||||
{
|
||||
Atom* states = NULL;
|
||||
const unsigned long count =
|
||||
_glfwGetWindowPropertyX11(window->x11.handle,
|
||||
_glfw.x11.NET_WM_STATE,
|
||||
XA_ATOM, (unsigned char**) &states);
|
||||
|
||||
// NOTE: We don't check for failure as this property may not exist yet
|
||||
// and that's fine (and we'll create it implicitly with append)
|
||||
|
||||
unsigned long i;
|
||||
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
if (states[i] == _glfw.x11.NET_WM_STATE_ABOVE)
|
||||
break;
|
||||
}
|
||||
|
||||
if (i == count)
|
||||
{
|
||||
XChangeProperty(_glfw.x11.display, window->x11.handle,
|
||||
_glfw.x11.NET_WM_STATE, XA_ATOM, 32,
|
||||
PropModeAppend,
|
||||
(unsigned char*) &_glfw.x11.NET_WM_STATE_ABOVE,
|
||||
1);
|
||||
}
|
||||
|
||||
if (states)
|
||||
XFree(states);
|
||||
}
|
||||
|
||||
XMapWindow(_glfw.x11.display, window->x11.handle);
|
||||
waitForVisibilityNotify(window);
|
||||
}
|
||||
@ -2667,6 +2699,10 @@ void _glfwSetWindowFloatingX11(_GLFWwindow* window, GLFWbool enabled)
|
||||
}
|
||||
else
|
||||
{
|
||||
// NOTE: _NET_WM_STATE_ABOVE is added when the window is shown
|
||||
if (enabled)
|
||||
return;
|
||||
|
||||
Atom* states = NULL;
|
||||
const unsigned long count =
|
||||
_glfwGetWindowPropertyX11(window->x11.handle,
|
||||
@ -2677,8 +2713,6 @@ void _glfwSetWindowFloatingX11(_GLFWwindow* window, GLFWbool enabled)
|
||||
// NOTE: We don't check for failure as this property may not exist yet
|
||||
// and that's fine (and we'll create it implicitly with append)
|
||||
|
||||
if (enabled)
|
||||
{
|
||||
unsigned long i;
|
||||
|
||||
for (i = 0; i < count; i++)
|
||||
@ -2687,28 +2721,12 @@ void _glfwSetWindowFloatingX11(_GLFWwindow* window, GLFWbool enabled)
|
||||
break;
|
||||
}
|
||||
|
||||
if (i == count)
|
||||
{
|
||||
XChangeProperty(_glfw.x11.display, window->x11.handle,
|
||||
_glfw.x11.NET_WM_STATE, XA_ATOM, 32,
|
||||
PropModeAppend,
|
||||
(unsigned char*) &_glfw.x11.NET_WM_STATE_ABOVE,
|
||||
1);
|
||||
}
|
||||
}
|
||||
else if (states)
|
||||
{
|
||||
for (unsigned long i = 0; i < count; i++)
|
||||
{
|
||||
if (states[i] == _glfw.x11.NET_WM_STATE_ABOVE)
|
||||
if (i < count)
|
||||
{
|
||||
states[i] = states[count - 1];
|
||||
XChangeProperty(_glfw.x11.display, window->x11.handle,
|
||||
_glfw.x11.NET_WM_STATE, XA_ATOM, 32,
|
||||
PropModeReplace, (unsigned char*) states, count - 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (states)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user