From: "U. Artie Eoff" <ullysses.a.e...@intel.com>

The available emulators are "uinput" and "notify".  To choose
which emulator to use, define the environment variable:

WESTON_WFITS_INPUT_EMULATOR

equal to the name of the desired emulator before loading the
weston-wfits.so module into Weston.

For example:

 $ export WESTON_WFITS_INPUT_EMULATOR="notify"
 $ weston --modules=weston-wfits.so

If WESTON_WFITS_INPUT_EMULATOR is not defined in the environment
and Weston is using the headless-backend then weston-wfits.so will
choose "notify" by default.  Otherwise, it chooses "uinput" by
default.

Signed-off-by: U. Artie Eoff <ullysses.a.e...@intel.com>
---
 src/extensions/weston/Makefile.am               |  1 +
 src/extensions/weston/input-emulator-notify.cpp |  2 +
 src/extensions/weston/input-emulator-notify.h   |  3 ++
 src/extensions/weston/input-emulator-uinput.cpp | 14 +++++--
 src/extensions/weston/input-emulator-uinput.h   |  2 +
 src/extensions/weston/input-emulator.cpp        | 50 +++++++++++++++++++++++++
 src/extensions/weston/input-emulator.h          | 25 +++++++++++++
 src/extensions/weston/weston-wfits-input.cpp    | 31 +++++++--------
 src/extensions/weston/weston-wfits.cpp          | 10 +++++
 9 files changed, 120 insertions(+), 18 deletions(-)
 create mode 100644 src/extensions/weston/input-emulator.cpp

diff --git a/src/extensions/weston/Makefile.am 
b/src/extensions/weston/Makefile.am
index a5447d3..9c13376 100644
--- a/src/extensions/weston/Makefile.am
+++ b/src/extensions/weston/Makefile.am
@@ -20,6 +20,7 @@ weston_wfits_la_SOURCES =                                     
        \
        weston-wfits-init.cpp                                           \
        weston-wfits-query.cpp                                          \
        weston-wfits-input.cpp                                          \
+       input-emulator.cpp                                              \
        input-emulator-uinput.cpp                                       \
        input-emulator-notify.cpp                                       \
        $(top_srcdir)/src/extensions/protocol/wayland-fits-protocol.c
diff --git a/src/extensions/weston/input-emulator-notify.cpp 
b/src/extensions/weston/input-emulator-notify.cpp
index daf9b43..24920ad 100644
--- a/src/extensions/weston/input-emulator-notify.cpp
+++ b/src/extensions/weston/input-emulator-notify.cpp
@@ -30,6 +30,8 @@
 namespace wfits {
 namespace weston {
 
+/*static*/ bool InputEmulatorNotify::registered_ = 
InputEmulatorFactory::registerEmulator("notify", Create<InputEmulatorNotify>());
+
 InputEmulatorNotify::InputEmulatorNotify()
        : InputEmulator::InputEmulator()
 {
diff --git a/src/extensions/weston/input-emulator-notify.h 
b/src/extensions/weston/input-emulator-notify.h
index d23eaac..4b13c3b 100644
--- a/src/extensions/weston/input-emulator-notify.h
+++ b/src/extensions/weston/input-emulator-notify.h
@@ -36,6 +36,9 @@ public:
 
        /*virtual*/ void movePointer(const int32_t x, const int32_t y) const;
        /*virtual*/ void keySend(const uint32_t key, const uint32_t state) 
const;
+
+private:
+       static bool registered_;
 };
 
 } // namespace weston
diff --git a/src/extensions/weston/input-emulator-uinput.cpp 
b/src/extensions/weston/input-emulator-uinput.cpp
index e6bf591..b850411 100644
--- a/src/extensions/weston/input-emulator-uinput.cpp
+++ b/src/extensions/weston/input-emulator-uinput.cpp
@@ -56,6 +56,8 @@ struct x11_output {
 namespace wfits {
 namespace weston {
 
+/*static*/ bool InputEmulatorUInput::registered_ = 
InputEmulatorFactory::registerEmulator("uinput", Create<InputEmulatorUInput>());
+
 /**
  * Get the width and height (size) of the current display output.  If Weston is
  * using the x11 backend then the result is the size of the X screen.
@@ -127,10 +129,10 @@ InputEmulatorUInput::InputEmulatorUInput()
        , fd_(-1)
 {
        struct uinput_user_dev device;
-       struct weston_output *output(Globals::output());
-       int32_t width, height;
 
-       weston_log("weston-wfits: creating uinput device\n");
+       weston_log("weston-wfits: %s\n", BOOST_CURRENT_FUNCTION);
+
+       assert(not Globals::isHeadless());
 
        fd_ = open("/dev/uinput", O_WRONLY | O_NDELAY);
        if (fd_ < 0) {
@@ -182,6 +184,7 @@ InputEmulatorUInput::InputEmulatorUInput()
        /*
        * TODO: Need to handle multidisplay, eventually.
        */
+       int32_t width, height;
        screenSize(&width, &height);
        device.absmin[ABS_X] = 0;
        device.absmax[ABS_X] = width - 1;
@@ -195,6 +198,11 @@ InputEmulatorUInput::InputEmulatorUInput()
        if (ioctl(fd_, UI_DEV_CREATE) < 0) {
                exit(EXIT_FAILURE);
        }
+
+       /* sync our input pointer device with weston */
+       wl_fixed_t cx, cy;
+       Globals::pointerXY(&cx, &cy);
+       movePointer(wl_fixed_to_int(cx), wl_fixed_to_int(cy));
 }
 
 /*virtual*/
diff --git a/src/extensions/weston/input-emulator-uinput.h 
b/src/extensions/weston/input-emulator-uinput.h
index 2d34ab6..75a78e0 100644
--- a/src/extensions/weston/input-emulator-uinput.h
+++ b/src/extensions/weston/input-emulator-uinput.h
@@ -41,6 +41,8 @@ private:
        void writeEvent(struct input_event *event) const;
 
        int fd_;
+
+       static bool registered_;
 };
 
 } // namespace weston
diff --git a/src/extensions/weston/input-emulator.cpp 
b/src/extensions/weston/input-emulator.cpp
new file mode 100644
index 0000000..8af3c45
--- /dev/null
+++ b/src/extensions/weston/input-emulator.cpp
@@ -0,0 +1,50 @@
+/*
+ * 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 "input-emulator.h"
+
+namespace wfits {
+namespace weston {
+
+/*static*/ InputEmulatorFactory::Creators InputEmulatorFactory::creators_;
+
+/*static*/ bool InputEmulatorFactory::registerEmulator(const std::string& 
name, Creator creator)
+{
+       std::pair<Creators::iterator, bool> result;
+       result = creators_.insert(std::make_pair(name, creator));
+       return result.second;
+}
+
+/*static*/ InputEmulator* InputEmulatorFactory::create(const std::string& name)
+{
+       const Creators::const_iterator creator(creators_.find(name));
+       if (creator == creators_.end())
+       {
+               weston_log("weston-wfits: warning, no input emulator named '%s' 
found\n", name.c_str());
+               return NULL;
+       }
+
+       return creator->second();
+}
+
+} // namespace weston
+} // namespace wfits
diff --git a/src/extensions/weston/input-emulator.h 
b/src/extensions/weston/input-emulator.h
index 5974f83..8ad9e2d 100644
--- a/src/extensions/weston/input-emulator.h
+++ b/src/extensions/weston/input-emulator.h
@@ -23,6 +23,8 @@
 #ifndef __INPUT_EMULATOR_H__
 #define __INPUT_EMULATOR_H__
 
+#include <map>
+#include "common/util.h"
 #include "weston-wfits.h"
 
 namespace wfits {
@@ -45,6 +47,29 @@ public:
        virtual void keySend(const uint32_t key, const uint32_t state) const = 
0;
 };
 
+class InputEmulatorFactory
+{
+public:
+       typedef boost::function<InputEmulator* (void)> Creator;
+       typedef std::map<std::string, Creator> Creators;
+
+       static bool registerEmulator(const std::string&, Creator);
+       static InputEmulator* create(const std::string&);
+
+private:
+       static Creators creators_;
+};
+
+template <class T>
+class Create
+{
+public:
+       T* operator()()
+       {
+               return new T;
+       }
+};
+
 } // namespace weston
 } // namespace wfits
 
diff --git a/src/extensions/weston/weston-wfits-input.cpp 
b/src/extensions/weston/weston-wfits-input.cpp
index c921709..90e7de0 100644
--- a/src/extensions/weston/weston-wfits-input.cpp
+++ b/src/extensions/weston/weston-wfits-input.cpp
@@ -22,9 +22,6 @@
 
 #include "common/util.h"
 #include "input-emulator.h"
-#include "input-emulator-uinput.h"
-#include "input-emulator-notify.h"
-
 #include "weston-wfits-input.h"
 
 namespace wfits {
@@ -96,20 +93,24 @@ void InputInterface::unbind(struct wl_resource *resource)
 /*static*/
 void InputInterface::initEmulator(void *data)
 {
-       if (not Globals::isHeadless()) {
-               emulator_ = new InputEmulatorUInput();
+       const char* emu(getenv("WESTON_WFITS_INPUT_EMULATOR"));
+       std::string stremu;
+
+       if (not emu) {
+               if (Globals::isHeadless()) {
+                       stremu = "notify";
+               }
+               else {
+                       stremu = "uinput";
+               }
+       }
+       else {
+               stremu = std::string(emu);
+       }
 
-               /* sync our input pointer device with weston */
-               wl_fixed_t cx, cy;
-               Globals::pointerXY(&cx, &cy);
-               InputInterface::movePointer(wl_fixed_to_int(cx), 
wl_fixed_to_int(cy));
-       } else {
-               emulator_ = new InputEmulatorNotify();
+       emulator_ = InputEmulatorFactory::create(stremu);
 
-               struct weston_seat *seat(Globals::seat());
-               weston_seat_init_pointer(seat);
-               weston_seat_init_keyboard(seat, NULL);
-       }
+       assert(emulator_);
 }
 
 void InputInterface::keySend(const uint32_t key, const uint32_t state)
diff --git a/src/extensions/weston/weston-wfits.cpp 
b/src/extensions/weston/weston-wfits.cpp
index f124e4e..aa4c74a 100644
--- a/src/extensions/weston/weston-wfits.cpp
+++ b/src/extensions/weston/weston-wfits.cpp
@@ -37,6 +37,16 @@ void Globals::init(struct weston_compositor *compositor)
 
        compositor_ = compositor;
        initialized_ = true;
+
+       struct weston_seat *seat(Globals::seat());
+
+       if (not seat->pointer) {
+               weston_seat_init_pointer(seat);
+       }
+
+       if (not seat->keyboard) {
+               weston_seat_init_keyboard(seat, NULL);
+       }
 }
 
 /*static*/
-- 
1.7.11.7

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to