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
|
- [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
|
||||||
|
- [X11] Bugfix: Floating windows silently became non-floating when hidden (#2276)
|
||||||
- [Linux] Bugfix: The header for `ioctl` was only implicitly included (#2778)
|
- [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`
|
||||||
|
|||||||
@ -51,7 +51,7 @@
|
|||||||
static void handleKeyEvent(_GLFWjoystick* js, int code, int value)
|
static void handleKeyEvent(_GLFWjoystick* js, int code, int value)
|
||||||
{
|
{
|
||||||
_glfwInputJoystickButton(js,
|
_glfwInputJoystickButton(js,
|
||||||
js->linjs.keyMap[code - BTN_MISC],
|
js->linjs.keyMap[code],
|
||||||
value ? GLFW_PRESS : GLFW_RELEASE);
|
value ? GLFW_PRESS : GLFW_RELEASE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -191,12 +191,28 @@ static GLFWbool openJoystickDevice(const char* path)
|
|||||||
|
|
||||||
int axisCount = 0, buttonCount = 0, hatCount = 0;
|
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))
|
if (!isBitSet(code, keyBits))
|
||||||
continue;
|
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++;
|
buttonCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -37,7 +37,7 @@ typedef struct _GLFWjoystickLinux
|
|||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
char path[PATH_MAX];
|
char path[PATH_MAX];
|
||||||
int keyMap[KEY_CNT - BTN_MISC];
|
int keyMap[KEY_CNT];
|
||||||
int absMap[ABS_CNT];
|
int absMap[ABS_CNT];
|
||||||
struct input_absinfo absInfo[ABS_CNT];
|
struct input_absinfo absInfo[ABS_CNT];
|
||||||
int hats[4][2];
|
int hats[4][2];
|
||||||
|
|||||||
@ -2438,6 +2438,38 @@ void _glfwShowWindowX11(_GLFWwindow* window)
|
|||||||
if (_glfwWindowVisibleX11(window))
|
if (_glfwWindowVisibleX11(window))
|
||||||
return;
|
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);
|
XMapWindow(_glfw.x11.display, window->x11.handle);
|
||||||
waitForVisibilityNotify(window);
|
waitForVisibilityNotify(window);
|
||||||
}
|
}
|
||||||
@ -2667,6 +2699,10 @@ void _glfwSetWindowFloatingX11(_GLFWwindow* window, GLFWbool enabled)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// NOTE: _NET_WM_STATE_ABOVE is added when the window is shown
|
||||||
|
if (enabled)
|
||||||
|
return;
|
||||||
|
|
||||||
Atom* states = NULL;
|
Atom* states = NULL;
|
||||||
const unsigned long count =
|
const unsigned long count =
|
||||||
_glfwGetWindowPropertyX11(window->x11.handle,
|
_glfwGetWindowPropertyX11(window->x11.handle,
|
||||||
@ -2677,38 +2713,20 @@ void _glfwSetWindowFloatingX11(_GLFWwindow* window, GLFWbool enabled)
|
|||||||
// NOTE: We don't check for failure as this property may not exist yet
|
// 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)
|
// and that's fine (and we'll create it implicitly with append)
|
||||||
|
|
||||||
if (enabled)
|
unsigned long i;
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
unsigned long i;
|
if (states[i] == _glfw.x11.NET_WM_STATE_ABOVE)
|
||||||
|
break;
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (states)
|
|
||||||
|
if (i < count)
|
||||||
{
|
{
|
||||||
for (unsigned long i = 0; i < count; i++)
|
states[i] = states[count - 1];
|
||||||
{
|
XChangeProperty(_glfw.x11.display, window->x11.handle,
|
||||||
if (states[i] == _glfw.x11.NET_WM_STATE_ABOVE)
|
_glfw.x11.NET_WM_STATE, XA_ATOM, 32,
|
||||||
{
|
PropModeReplace, (unsigned char*) states, count - 1);
|
||||||
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)
|
if (states)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user