wayland: Release input focus when window is destroyed

This fixes a seg. fault on the reopen test because events might occur
after the window is destroyed (for example leave events).
This commit is contained in:
Ricardo Vieira 2014-07-26 21:55:43 +01:00
parent c39ebfe1b8
commit a7c9ca3b43
2 changed files with 30 additions and 2 deletions

View File

@ -33,7 +33,6 @@
#include <sys/mman.h> #include <sys/mman.h>
#include <unistd.h> #include <unistd.h>
#include <wayland-client.h> #include <wayland-client.h>
#include <wayland-client-protocol.h>
#include <wayland-cursor.h> #include <wayland-cursor.h>
#include "xkb_unicode.h" #include "xkb_unicode.h"
@ -56,7 +55,10 @@ static void pointerHandleLeave(void* data,
uint32_t serial, uint32_t serial,
struct wl_surface* surface) struct wl_surface* surface)
{ {
_GLFWwindow* window = wl_surface_get_user_data(surface); _GLFWwindow* window = _glfw.wl.pointerFocus;
if (!window)
return;
_glfw.wl.pointerFocus = NULL; _glfw.wl.pointerFocus = NULL;
_glfwInputCursorEnter(window, GL_FALSE); _glfwInputCursorEnter(window, GL_FALSE);
@ -70,6 +72,9 @@ static void pointerHandleMotion(void* data,
{ {
_GLFWwindow* window = _glfw.wl.pointerFocus; _GLFWwindow* window = _glfw.wl.pointerFocus;
if (!window)
return;
if (window->cursorMode == GLFW_CURSOR_DISABLED) if (window->cursorMode == GLFW_CURSOR_DISABLED)
{ {
/* TODO */ /* TODO */
@ -93,6 +98,9 @@ static void pointerHandleButton(void* data,
_GLFWwindow* window = _glfw.wl.pointerFocus; _GLFWwindow* window = _glfw.wl.pointerFocus;
int glfwButton; int glfwButton;
if (!window)
return;
/* Makes left, right and middle 0, 1 and 2. Overall order follows evdev /* Makes left, right and middle 0, 1 and 2. Overall order follows evdev
* codes. */ * codes. */
glfwButton = button - BTN_LEFT; glfwButton = button - BTN_LEFT;
@ -115,6 +123,9 @@ static void pointerHandleAxis(void* data,
double scroll_factor; double scroll_factor;
double x, y; double x, y;
if (!window)
return;
/* Wayland scroll events are in pointer motion coordinate space (think /* Wayland scroll events are in pointer motion coordinate space (think
* two finger scroll). The factor 10 is commonly used to convert to * two finger scroll). The factor 10 is commonly used to convert to
* "scroll step means 1.0. */ * "scroll step means 1.0. */
@ -224,6 +235,9 @@ static void keyboardHandleLeave(void* data,
{ {
_GLFWwindow* window = _glfw.wl.keyboardFocus; _GLFWwindow* window = _glfw.wl.keyboardFocus;
if (!window)
return;
_glfw.wl.keyboardFocus = NULL; _glfw.wl.keyboardFocus = NULL;
_glfwInputWindowFocus(window, GL_FALSE); _glfwInputWindowFocus(window, GL_FALSE);
} }
@ -366,6 +380,9 @@ static void keyboardHandleKey(void* data,
const xkb_keysym_t *syms; const xkb_keysym_t *syms;
_GLFWwindow* window = _glfw.wl.keyboardFocus; _GLFWwindow* window = _glfw.wl.keyboardFocus;
if (!window)
return;
keyCode = toGLFWKeyCode(key); keyCode = toGLFWKeyCode(key);
action = state == WL_KEYBOARD_KEY_STATE_PRESSED action = state == WL_KEYBOARD_KEY_STATE_PRESSED
? GLFW_PRESS : GLFW_RELEASE; ? GLFW_PRESS : GLFW_RELEASE;

View File

@ -127,6 +127,17 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window,
void _glfwPlatformDestroyWindow(_GLFWwindow* window) void _glfwPlatformDestroyWindow(_GLFWwindow* window)
{ {
if (window == _glfw.wl.pointerFocus)
{
_glfw.wl.pointerFocus = NULL;
_glfwInputCursorEnter(window, GL_FALSE);
}
if (window == _glfw.wl.keyboardFocus)
{
_glfw.wl.keyboardFocus = NULL;
_glfwInputWindowFocus(window, GL_FALSE);
}
_glfwDestroyContext(window); _glfwDestroyContext(window);
if (window->wl.native) if (window->wl.native)