[PATCH 3/3 wayland-fits] core: Add a test for multiple pointer and keyboard resources
Eoff, Ullysses A
ullysses.a.eoff at intel.com
Thu Sep 26 12:30:15 PDT 2013
Series applied. The client keyboard stuff is something I've been
wanting to add for a while. Thanks Neil! I like more tests :-)
----
U. Artie Eoff
> -----Original Message-----
> From: wayland-devel-bounces+ullysses.a.eoff=intel.com at lists.freedesktop.org [mailto:wayland-devel-
> bounces+ullysses.a.eoff=intel.com at lists.freedesktop.org] On Behalf Of Neil Roberts
> Sent: Wednesday, September 25, 2013 11:07 AM
> To: wayland-devel at lists.freedesktop.org
> Subject: [PATCH 3/3 wayland-fits] core: Add a test for multiple pointer and keyboard resources
>
> This adds a test which creates multiple pointer and keyboard resources
> for the same client and verifies that they all receive events. It also
> tests various combiniations of pointer and keyboard focus and ensures
> that for example a keyboard created while the surface already has
> focus will correctly get updated about the state.
> ---
> src/test/core/Makefile.am | 1 +
> src/test/core/test_multi_resource.cpp | 259 ++++++++++++++++++++++++++++++++++
> 2 files changed, 260 insertions(+)
> create mode 100644 src/test/core/test_multi_resource.cpp
>
> diff --git a/src/test/core/Makefile.am b/src/test/core/Makefile.am
> index 3a93a67..ec7901b 100644
> --- a/src/test/core/Makefile.am
> +++ b/src/test/core/Makefile.am
> @@ -19,6 +19,7 @@ libwfits_core_la_SOURCES = \
> test_bind_interface.cpp \
> test_cursor.cpp \
> test_data.cpp \
> + test_multi_resource.cpp \
> test_surface.cpp \
> test_dnd.cpp
>
> diff --git a/src/test/core/test_multi_resource.cpp b/src/test/core/test_multi_resource.cpp
> new file mode 100644
> index 0000000..d3fb003
> --- /dev/null
> +++ b/src/test/core/test_multi_resource.cpp
> @@ -0,0 +1,259 @@
> +/*
> + * Copyright © 2013 Intel Corporation
> + *
> + * Permission to use, copy, modify, distribute, and sell this software and
> + * its documentation for any purpose is hereby granted without fee, provided
> + * that the above copyright notice appear in all copies and that both that
> + * copyright notice and this permission notice appear in supporting
> + * documentation, and that the name of the copyright holders not be used in
> + * advertising or publicity pertaining to distribution of the software
> + * without specific, written prior permission. The copyright holders make
> + * no representations about the suitability of this software for any
> + * purpose. It is provided "as is" without express or implied warranty.
> + *
> + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
> + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
> + * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
> + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
> + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
> + * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
> + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
> + */
> +
> +#include "harness.h"
> +#include "compositor.h"
> +#include "pointer.h"
> +#include "keyboard.h"
> +#include "seat.h"
> +#include "surface.h"
> +#include "shell.h"
> +#include "shell_surface.h"
> +#include "shm.h"
> +
> +namespace wfits {
> +namespace test {
> +namespace core {
> +namespace input {
> +
> +class DummyClient
> +{
> +public:
> + DummyClient()
> + : display_()
> + , compositor_(display_)
> + , shell_(display_)
> + , seat_(display_)
> + , surface_(compositor_)
> + , shellSurface_(shell_, surface_)
> + , shm_(display_)
> + , buffer_(shm_, 128, 128)
> + {
> + wl_surface_attach(surface_, buffer_, 0, 0);
> + wl_surface_damage(surface_, 0, 0,
> + buffer_.width(), buffer_.height());
> + surface_.commit();
> + }
> +
> +private:
> + Display display_;
> + Compositor compositor_;
> + Shell shell_;
> + Seat seat_;
> + Surface surface_;
> + ShellSurface shellSurface_;
> + SharedMemory shm_;
> + SharedMemoryBuffer buffer_;
> +};
> +
> +class MultiResourceTest : public Harness
> +{
> +public:
> + MultiResourceTest()
> + : Harness::Harness()
> + , compositor_(display())
> + , shell_(display())
> + , seat_(display())
> + , surface_(compositor_)
> + , shellSurface_(shell_, surface_)
> + , shm_(display())
> + , buffer_(shm_, 128, 128)
> + {
> + }
> +
> + void setup();
> + void testPointer();
> + void testKeyboard();
> +
> + void movePointer(const int32_t x, const int32_t y)
> + {
> + Geometry geometry(getSurfaceGeometry(surface_));
> + setGlobalPointerPosition(geometry.x + x, geometry.y + y);
> + }
> +
> + void checkPointer(Pointer *pointer, const int32_t x, const int32_t y)
> + {
> + YIELD_UNTIL(pointer->x() == x and pointer->y() == y);
> + }
> +
> +private:
> + Compositor compositor_;
> + Shell shell_;
> + Seat seat_;
> + Surface surface_;
> + ShellSurface shellSurface_;
> + SharedMemory shm_;
> + SharedMemoryBuffer buffer_;
> +};
> +
> +void MultiResourceTest::setup()
> +{
> + wl_surface_attach(surface_, buffer_, 0, 0);
> + wl_surface_damage(surface_, 0, 0, buffer_.width(), buffer_.height());
> + surface_.commit();
> +
> + queueStep(boost::bind(&MultiResourceTest::testPointer, boost::ref(*this)));
> + queueStep(boost::bind(&MultiResourceTest::testKeyboard, boost::ref(*this)));
> +}
> +
> +void MultiResourceTest::testPointer()
> +{
> + Pointer *pointer_a = new Pointer(seat_);
> + Pointer *pointer_b = new Pointer(seat_);
> +
> + movePointer(42, 120);
> +
> + /* Verify that both pointers received the new position */
> + YIELD_UNTIL(pointer_a->hasFocus(surface_));
> + YIELD_UNTIL(pointer_b->hasFocus(surface_));
> + checkPointer(pointer_a, 42, 120);
> + checkPointer(pointer_b, 42, 120);
> +
> + /* Move the pointer outside of the surface */
> + movePointer(130, 130);
> + YIELD_UNTIL(!pointer_a->hasFocus(surface_));
> + YIELD_UNTIL(!pointer_b->hasFocus(surface_));
> +
> + /* Move the pointer back inside the surface while we only have
> + * one pointer */
> + delete pointer_b;
> + yield();
> + movePointer(42, 120);
> + YIELD_UNTIL(pointer_a->hasFocus(surface_));
> + checkPointer(pointer_a, 42, 120);
> +
> + /* Verify that the second pointer gets the updated position
> + * even if it is created later */
> + pointer_b = new Pointer(seat_);
> + YIELD_UNTIL(pointer_b->hasFocus(surface_));
> + checkPointer(pointer_b, 42, 120);
> +
> + /* Both pointers should have the same focus serial or one of
> + * them would fail to set the cursor */
> + ASSERT(pointer_a->focusSerial() == pointer_b->focusSerial());
> +
> + delete pointer_a;
> + delete pointer_b;
> +}
> +
> +void MultiResourceTest::testKeyboard()
> +{
> + Keyboard *keyboard_a = new Keyboard(seat_);
> + Keyboard *keyboard_b = new Keyboard(seat_);
> +
> + /* Both keyboards should initially have focus */
> + YIELD_UNTIL(keyboard_a->hasFocus(surface_));
> + YIELD_UNTIL(keyboard_b->hasFocus(surface_));
> +
> + xkb_mod_index_t shiftMod =
> + xkb_keymap_mod_get_index(keyboard_a->keymap(),
> + XKB_MOD_NAME_SHIFT);
> + ASSERT(shiftMod != XKB_MOD_INVALID);
> +
> + inputKeySend(KEY_LEFTSHIFT, 1);
> + inputKeySend(KEY_A, 1);
> +
> + /* Both keyboards should get key events */
> + YIELD_UNTIL(keyboard_a->keyPressed(KEY_LEFTSHIFT) and
> + keyboard_b->keyPressed(KEY_LEFTSHIFT) and
> + keyboard_a->keyPressed(KEY_A) and
> + keyboard_b->keyPressed(KEY_A) and
> + (keyboard_a->modsDepressed() & (1 << shiftMod)) != 0 and
> + (keyboard_b->modsDepressed() & (1 << shiftMod)) != 0);
> +
> + inputKeySend(KEY_LEFTSHIFT, 0);
> + inputKeySend(KEY_A, 0);
> +
> + YIELD_UNTIL(!keyboard_a->keyPressed(KEY_LEFTSHIFT) and
> + !keyboard_b->keyPressed(KEY_LEFTSHIFT) and
> + !keyboard_a->keyPressed(KEY_A) and
> + !keyboard_b->keyPressed(KEY_A) and
> + (keyboard_a->modsDepressed() & (1 << shiftMod)) == 0 and
> + (keyboard_b->modsDepressed() & (1 << shiftMod)) == 0);
> +
> + /* Create another surface with a dummy display so that we can
> + * be sure this client doesn't have focus */
> + DummyClient dummyClient;
> +
> + /* Give the old surface pointer focus but not keyboard focus */
> + movePointer(5, 5);
> + {
> + Pointer pointer(seat_);
> + YIELD_UNTIL(!keyboard_a->hasFocus(surface_) and
> + pointer.hasFocus(surface_));
> + }
> +
> + /* We should still be able to see the modifiers even though we
> + * don't have a pointer resource and the surface doesn't have
> + * keyboard focus */
> + inputKeySend(KEY_LEFTSHIFT, 1);
> + YIELD_UNTIL((keyboard_a->modsDepressed() & (1 << shiftMod)) and
> + (keyboard_b->modsDepressed() & (1 << shiftMod)));
> + inputKeySend(KEY_LEFTSHIFT, 0);
> + YIELD_UNTIL((keyboard_a->modsDepressed() & (1 << shiftMod)) == 0 and
> + (keyboard_b->modsDepressed() & (1 << shiftMod)) == 0);
> +
> + delete keyboard_b;
> +
> + inputKeySend(KEY_A, 1);
> + yield();
> +
> + /* This client doesn't have focus so we shouldn't be able to
> + * see the key press */
> + YIELD_UNTIL(!keyboard_a->keyPressed(KEY_A));
> +
> + /* Give the surface focus by clicking on it */
> + inputKeySend(BTN_LEFT, 1);
> + yield();
> + inputKeySend(BTN_LEFT, 0);
> + yield();
> +
> + /* The surface should now be told about the keypresses in the
> + * enter event */
> + YIELD_UNTIL(keyboard_a->hasFocus(surface_) and
> + keyboard_a->keyPressed(KEY_A));
> +
> + inputKeySend(KEY_LEFTSHIFT, 1);
> + YIELD_UNTIL(keyboard_a->keyPressed(KEY_LEFTSHIFT) and
> + (keyboard_a->modsDepressed() & (1 << shiftMod)));
> +
> + /* If we later create another keyboard resource it should be
> + * told about the modifiers and key presses on creation */
> + keyboard_b = new Keyboard(seat_);
> + YIELD_UNTIL(keyboard_b->hasFocus(surface_) and
> + keyboard_b->keyPressed(KEY_A) and
> + keyboard_b->keyPressed(KEY_LEFTSHIFT) and
> + (keyboard_b->modsDepressed() & (1 << shiftMod)));
> +
> + inputKeySend(KEY_A, 0);
> + inputKeySend(KEY_LEFTSHIFT, 0);
> +
> + delete keyboard_a;
> + delete keyboard_b;
> +}
> +
> +WFITS_CORE_HARNESS_TEST_CASE(MultiResourceTest);
> +
> +} // namespace input
> +} // namespace core
> +} // namespace test
> +} // namespace wfits
> --
> 1.8.3.1
>
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
More information about the wayland-devel
mailing list