diff options
author | Laszlo Agocs <laszlo.agocs@theqtcompany.com> | 2015-10-27 18:03:44 +0100 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@theqtcompany.com> | 2015-10-27 18:31:47 +0100 |
commit | 8cac11fd8398b91300af6b40d16fcfebafade622 (patch) | |
tree | 556717d1c8624fd691d52c441ff11bdda7cea731 /src/compositor/compositor_api/qwaylandkeyboard.cpp | |
parent | 699c44e3dc2d7099fdd87060c39309e318c55616 (diff) | |
parent | f242587cbf3ee8ade683414aaa95158a1149db4c (diff) |
Merge branch '5.6' into wip-compositor-api
qwindow-compositor changes from 5.6 will be adapted separately.
The traditional wayland-egl path is tested and is functional like before.
The EGLStream support will be verified separately once the qwindow-compositor
changes are ready.
Conflicts:
examples/wayland/qwindow-compositor/qwindowcompositor.cpp
examples/wayland/qwindow-compositor/textureblitter.cpp
examples/wayland/qwindow-compositor/textureblitter.h
examples/wayland/server-buffer/client/client.pro
examples/wayland/server-buffer/compositor/compositor.pro
src/compositor/compositor_api/qwaylandbufferref.cpp
src/compositor/compositor_api/qwaylandbufferref.h
src/compositor/hardware_integration/qwlclientbufferintegration_p.h
src/compositor/wayland_wrapper/qwlkeyboard.cpp
src/compositor/wayland_wrapper/qwlkeyboard_p.h
src/compositor/wayland_wrapper/qwlsurfacebuffer.cpp
src/compositor/wayland_wrapper/qwlsurfacebuffer_p.h
src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp
src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.h
src/plugins/hardwareintegration/compositor/wayland-egl/wayland-egl.pro
Change-Id: Ic2e3a6e8f74606c35b1e27cd4016fa133527d7ba
Diffstat (limited to 'src/compositor/compositor_api/qwaylandkeyboard.cpp')
-rw-r--r-- | src/compositor/compositor_api/qwaylandkeyboard.cpp | 55 |
1 files changed, 40 insertions, 15 deletions
diff --git a/src/compositor/compositor_api/qwaylandkeyboard.cpp b/src/compositor/compositor_api/qwaylandkeyboard.cpp index d7aa76e60..238a059a5 100644 --- a/src/compositor/compositor_api/qwaylandkeyboard.cpp +++ b/src/compositor/compositor_api/qwaylandkeyboard.cpp @@ -94,24 +94,47 @@ QWaylandKeyboardPrivate *QWaylandKeyboardPrivate::get(QWaylandKeyboard *keyboard return keyboard->d_func(); } +void QWaylandKeyboardPrivate::checkFocusResource(Resource *keyboardResource) +{ + if (!keyboardResource || !focus) + return; + + // this is already the current resource, do no send enter twice + if (focusResource == keyboardResource) + return; + + // check if new wl_keyboard resource is from the client owning the focus surface + if (focus->resource()->client == keyboardResource->client()) { + sendEnter(focus, keyboardResource); + focusResource = keyboardResource; + } +} + +void QWaylandKeyboardPrivate::sendEnter(QWaylandSurface *surface, Resource *keyboardResource) +{ + uint32_t serial = compositor()->nextSerial(); + send_modifiers(keyboardResource->handle, serial, modsDepressed, modsLatched, modsLocked, group); + send_enter(keyboardResource->handle, serial, surface->resource(), QByteArray::fromRawData((char *)keys.data(), keys.size() * sizeof(uint32_t))); +} + void QWaylandKeyboardPrivate::focused(QWaylandSurface *surface) { if (surface && surface->isCursorSurface()) surface = Q_NULLPTR; - if (focusResource && focus != surface) { - uint32_t serial = compositor()->nextSerial(); - send_leave(focusResource->handle, serial, focus->resource()); + if (focus != surface) { + if (focusResource) { + uint32_t serial = compositor()->nextSerial(); + send_leave(focusResource->handle, serial, focus->resource()); + } focusDestroyListener.reset(); + if (surface) + focusDestroyListener.listenForDestruction(surface->resource()); } Resource *resource = surface ? resourceMap().value(surface->waylandClient()) : 0; - if (resource && (focus != surface || focusResource != resource)) { - uint32_t serial = compositor()->nextSerial(); - send_modifiers(resource->handle, serial, modsDepressed, modsLatched, modsLocked, group); - send_enter(resource->handle, serial, surface->resource(), QByteArray::fromRawData((char *)keys.data(), keys.size() * sizeof(uint32_t))); - focusDestroyListener.listenForDestruction(surface->resource()); - } + if (resource && (focus != surface || focusResource != resource)) + sendEnter(surface, resource); focusResource = resource; focus = surface; @@ -125,13 +148,15 @@ void QWaylandKeyboardPrivate::keyboard_bind_resource(wl_keyboard::Resource *reso if (xkb_context) { send_keymap(resource->handle, WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1, keymap_fd, keymap_size); - return; - } + } else #endif - int null_fd = open("/dev/null", O_RDONLY); - send_keymap(resource->handle, 0 /* WL_KEYBOARD_KEYMAP_FORMAT_NO_KEYMAP */, - null_fd, 0); - close(null_fd); + { + int null_fd = open("/dev/null", O_RDONLY); + send_keymap(resource->handle, 0 /* WL_KEYBOARD_KEYMAP_FORMAT_NO_KEYMAP */, + null_fd, 0); + close(null_fd); + } + checkFocusResource(resource); } void QWaylandKeyboardPrivate::keyboard_destroy_resource(wl_keyboard::Resource *resource) |