[SCM] kdeconnect packaging branch, master, updated. debian/0.9g-1-1183-g9d69498

Maximiliano Curia maxy at moszumanska.debian.org
Fri Oct 14 14:27:52 UTC 2016


Gitweb-URL: http://git.debian.org/?p=pkg-kde/kde-extras/kdeconnect.git;a=commitdiff;h=ea5d9c8

The following commit has been merged in the master branch:
commit ea5d9c8ecaba083803bf6e89e99c97cc2d704fe0
Author: Albert Vaca <albertvaka at gmail.com>
Date:   Thu Aug 14 17:49:14 2014 +0200

    MousePad: Added support for any UTF character and more special keys.
    I've also removed modifiers like Shift and Ctrl by now.
    
    LibFakeKey is now a dependency of this plugin, as it allows us to send UTF
    characters as X11 keys in a simple and convenient way. Internally it uses a
    convention in Xlib, that allows to pass UTF characters as keycodes just by
    adding 0x01000000 to the keycode number.
    
    CCMAIL: saiarcot895 at gmail.com
---
 plugins/mousepad/CMakeLists.txt     |   7 +-
 plugins/mousepad/mousepadplugin.cpp | 187 ++++++++++++++++++------------------
 plugins/mousepad/mousepadplugin.h   |  25 +----
 3 files changed, 103 insertions(+), 116 deletions(-)

diff --git a/plugins/mousepad/CMakeLists.txt b/plugins/mousepad/CMakeLists.txt
index 848b76e..b04d0ef 100644
--- a/plugins/mousepad/CMakeLists.txt
+++ b/plugins/mousepad/CMakeLists.txt
@@ -9,7 +9,12 @@ kde4_add_plugin(kdeconnect_mousepad ${kdeconnect_mousepad_SRCS})
 
 include_directories(${XTEST_INCLUDE_DIRS} ${X11_INCLUDE_DIR})
 
-target_link_libraries(kdeconnect_mousepad kdeconnectcore ${QT_QTGUI_LIBRARY} ${X11_LIBRARIES} ${XTEST_LIBRARIES})
+target_link_libraries(kdeconnect_mousepad kdeconnectcore
+    ${QT_QTGUI_LIBRARY}
+    ${X11_LIBRARIES}
+    ${XTEST_LIBRARIES}
+    fakekey
+)
 
 install(TARGETS kdeconnect_mousepad DESTINATION ${PLUGIN_INSTALL_DIR} )
 install(FILES kdeconnect_mousepad.desktop DESTINATION ${SERVICES_INSTALL_DIR} )
diff --git a/plugins/mousepad/mousepadplugin.cpp b/plugins/mousepad/mousepadplugin.cpp
index 1431ea0..7273c92 100644
--- a/plugins/mousepad/mousepadplugin.cpp
+++ b/plugins/mousepad/mousepadplugin.cpp
@@ -23,14 +23,43 @@
 #include <core/networkpackage.h>
 #include <X11/extensions/XTest.h>
 #include <X11/keysym.h>
+#include <fakekey/fakekey.h>
 
 K_PLUGIN_FACTORY( KdeConnectPluginFactory, registerPlugin< MousepadPlugin >(); )
 K_EXPORT_PLUGIN( KdeConnectPluginFactory("kdeconnect_mousepad", "kdeconnect-plugins") )
 
-// Source: http://bharathisubramanian.wordpress.com/2010/04/01/x11-fake-mouse-events-generation-using-xtest/
+enum MouseButtons {
+    LeftMouseButton = 1,
+    MiddleMouseButton = 2,
+    RightMouseButton = 3,
+    MouseWheelUp = 4,
+    MouseWheelDown = 5
+};
+
+//Translation table to keep in sync within all the implementations
+int SpecialKeysMap[] = {
+    0,              // Invalid
+    XK_BackSpace,   // 1
+    XK_Tab,         // 2
+    XK_Linefeed,    // 3
+    XK_Left,        // 4
+    XK_Up,          // 5
+    XK_Right,       // 6
+    XK_Down,        // 7
+    XK_Page_Up,     // 8
+    XK_Page_Down,   // 9
+    XK_Home,        // 10
+    XK_End,         // 11
+    XK_Return,      // 12
+    XK_Delete,      // 13
+    XK_Escape,      // 14
+};
+
+template <typename T, size_t N>
+size_t arraySize(T(&arr)[N]) { (void)arr; return N; }
 
 MousepadPlugin::MousepadPlugin(QObject* parent, const QVariantList& args)
-    : KdeConnectPlugin(parent, args), m_display(0)
+    : KdeConnectPlugin(parent, args), m_display(0), m_fakekey(0)
 {
 
 }
@@ -41,37 +70,16 @@ MousepadPlugin::~MousepadPlugin()
         XCloseDisplay(m_display);
         m_display = 0;
     }
-}
-
-XKeyEvent MousepadPlugin::createKeyEvent(Display *display, Window &win, Window &winRoot, bool press, KeyCode keycode, int modifiers)
-{
-       // http://www.doctort.org/adam/nerd-notes/x11-fake-keypress-event.html
-       XKeyEvent event;
-
-       event.display = display;
-       event.window = win;
-       event.root = winRoot;
-       event.subwindow = None;
-       event.time = CurrentTime;
-       event.x = 1;
-       event.y = 1;
-       event.x_root = 1;
-       event.y_root = 1;
-       event.same_screen = true;
-       event.keycode = keycode;
-       event.state = modifiers;
-
-       if (press) {
-           event.type = KeyPress;
-       } else {
-           event.type = KeyRelease;
-       }
-
-       return event;
+    if (m_fakekey) {
+        free(m_fakekey);
+        m_fakekey = 0;
+    }
 }
 
 bool MousepadPlugin::receivePackage(const NetworkPackage& np)
 {
+    //TODO: Split in several package types to avoid big if statements: mouse move, mouse click and keyboard events
+
     float dx = np.get<float>("dx", 0);
     float dy = np.get<float>("dy", 0);
 
@@ -81,82 +89,73 @@ bool MousepadPlugin::receivePackage(const NetworkPackage& np)
     bool isRightClick = np.get<bool>("rightclick", false);
     bool isScroll = np.get<bool>("scroll", false);
     QString key = np.get<QString>("key", "");
-    int modifiers = np.get<int>("modifiers", 0);
+    int specialKey = np.get<int>("specialKey", 0);
+
+    if (isSingleClick || isDoubleClick || isMiddleClick || isRightClick || isScroll || !key.isEmpty() || specialKey) {
 
-    if (isSingleClick || isDoubleClick || isMiddleClick || isRightClick || isScroll || !key.isEmpty() || modifiers) {
         if(!m_display) {
             m_display = XOpenDisplay(NULL);
+            if(!m_display) {
+                kDebug(debugArea()) << "Failed to open X11 display";
+                return false;
+            }
         }
 
-        if(m_display) {
-            if (isSingleClick) {
-                XTestFakeButtonEvent(m_display, LeftMouseButton, true, CurrentTime);
-                XTestFakeButtonEvent(m_display, LeftMouseButton, false, CurrentTime);
-            } else if (isDoubleClick) {
-                XTestFakeButtonEvent(m_display, LeftMouseButton, true, CurrentTime);
-                XTestFakeButtonEvent(m_display, LeftMouseButton, false, CurrentTime);
-                XTestFakeButtonEvent(m_display, LeftMouseButton, true, CurrentTime);
-                XTestFakeButtonEvent(m_display, LeftMouseButton, false, CurrentTime);
-            } else if (isMiddleClick) {
-                XTestFakeButtonEvent(m_display, MiddleMouseButton, true, CurrentTime);
-                XTestFakeButtonEvent(m_display, MiddleMouseButton, false, CurrentTime);
-            } else if (isRightClick) {
-                XTestFakeButtonEvent(m_display, RightMouseButton, true, CurrentTime);
-                XTestFakeButtonEvent(m_display, RightMouseButton, false, CurrentTime);
-            } else if( isScroll ) {
-                if (dy < 0) {
-                    XTestFakeButtonEvent(m_display, MouseWheelDown, true, CurrentTime);
-                    XTestFakeButtonEvent(m_display, MouseWheelDown, false, CurrentTime);
-                } else if (dy > 0) {
-                    XTestFakeButtonEvent(m_display, MouseWheelUp, true, CurrentTime);
-                    XTestFakeButtonEvent(m_display, MouseWheelUp, false, CurrentTime);
-                }
-            } else if (!key.isEmpty() || modifiers) {
-                Window winRoot = XDefaultRootWindow(m_display);
-
-                Window winFocus;
-                int revert;
-                XGetInputFocus(m_display, &winFocus, &revert);
-
-                KeyCode keycode = 0;
-                int xModifier = 0;
-                if (!key.isEmpty()) {
-                    if (key == QLatin1String(".")) {
-                        keycode = XKeysymToKeycode(m_display, XK_period);
-                    } else if (key == QLatin1String(",")) {
-                        keycode = XKeysymToKeycode(m_display, XK_comma);
-                    } else {
-                        QByteArray keyByteArray = key.toLocal8Bit();
-                        KeySym keysym = XStringToKeysym(keyByteArray.constData());
-                        keycode = XKeysymToKeycode(m_display, keysym);
-                    }
-                } else {
-                    // It's a special key
-                    if ((modifiers & FunctionalKeys) == Backspace) {
-                        keycode = XKeysymToKeycode(m_display, XK_BackSpace);
-                    } else if ((modifiers & FunctionalKeys) == Enter) {
-                        keycode = XKeysymToKeycode(m_display, XK_Linefeed);
-                    } else if ((modifiers & FunctionalKeys) == Tab) {
-                        keycode = XKeysymToKeycode(m_display, XK_Tab);
-                    }
-                }
+        if (isSingleClick) {
+            XTestFakeButtonEvent(m_display, LeftMouseButton, True, 0);
+            XTestFakeButtonEvent(m_display, LeftMouseButton, False, 0);
+        } else if (isDoubleClick) {
+            XTestFakeButtonEvent(m_display, LeftMouseButton, True, 0);
+            XTestFakeButtonEvent(m_display, LeftMouseButton, False, 0);
+            XTestFakeButtonEvent(m_display, LeftMouseButton, True, 0);
+            XTestFakeButtonEvent(m_display, LeftMouseButton, False, 0);
+        } else if (isMiddleClick) {
+            XTestFakeButtonEvent(m_display, MiddleMouseButton, True, 0);
+            XTestFakeButtonEvent(m_display, MiddleMouseButton, False, 0);
+        } else if (isRightClick) {
+            XTestFakeButtonEvent(m_display, RightMouseButton, True, 0);
+            XTestFakeButtonEvent(m_display, RightMouseButton, False, 0);
+        } else if( isScroll ) {
+            if (dy < 0) {
+                XTestFakeButtonEvent(m_display, MouseWheelDown, True, 0);
+                XTestFakeButtonEvent(m_display, MouseWheelDown, False, 0);
+            } else if (dy > 0) {
+                XTestFakeButtonEvent(m_display, MouseWheelUp, True, 0);
+                XTestFakeButtonEvent(m_display, MouseWheelUp, False, 0);
+            }
+        } else if (!key.isEmpty() || specialKey) {
 
-                if (modifiers & Shift) {
-                    xModifier |= ShiftMask;
-                }
-                if (modifiers & Control) {
-                    xModifier |= ControlMask;
+            if (specialKey)
+            {
+                if (specialKey > (int)arraySize(SpecialKeysMap)) {
+                    kDebug(debugArea()) << "Unsupported special key identifier";
+                    return false;
                 }
 
-                XKeyEvent event = createKeyEvent(m_display, winFocus, winRoot, true, keycode, xModifier);
-                XSendEvent(event.display, event.window, true, KeyPressMask, (XEvent*)&event);
+                int keycode = XKeysymToKeycode(m_display, SpecialKeysMap[specialKey]);
+                XTestFakeKeyEvent (m_display, keycode, True, 0);
+                XTestFakeKeyEvent (m_display, keycode, False, 0);
+
+            } else {
+
+                if (!m_fakekey) {
+                    m_fakekey = fakekey_init(m_display);
+                    if (!m_fakekey) {
+                        kDebug(debugArea()) << "Failed to initialize libfakekey";
+                        return false;
+                    }
+                }
 
-                event = createKeyEvent(m_display, winFocus, winRoot, false, keycode, xModifier);
-                XSendEvent(event.display, event.window, true, KeyPressMask, (XEvent*)&event);
+                //We use fakekey here instead of XTest (above) because it can handle utf characters instead of keycodes.
+                fakekey_press(m_fakekey, (const unsigned char*)key.toUtf8().constData(), -1, 0);
+                fakekey_release(m_fakekey);
             }
-            XFlush(m_display);
+
         }
-    } else {
+
+        XFlush(m_display);
+
+    } else { //Is a mouse move event
         QPoint point = QCursor::pos();
         QCursor::setPos(point.x() + (int)dx, point.y() + (int)dy);
     }
diff --git a/plugins/mousepad/mousepadplugin.h b/plugins/mousepad/mousepadplugin.h
index 3525155..2135123 100644
--- a/plugins/mousepad/mousepadplugin.h
+++ b/plugins/mousepad/mousepadplugin.h
@@ -29,30 +29,13 @@
 
 #define PACKAGE_TYPE_MOUSEPAD QLatin1String("kdeconnect.mousepad")
 
+struct FakeKey;
+
 class MousepadPlugin
     : public KdeConnectPlugin
 {
     Q_OBJECT
 
-    enum MouseButtons {
-        LeftMouseButton = 1,
-        MiddleMouseButton = 2,
-        RightMouseButton = 3,
-        MouseWheelUp = 4,
-        MouseWheelDown = 5
-    };
-
-    enum SpecialKeys {
-        Backspace = 1,
-        Enter = 1 << 1,
-        Tab = 1 << 1 | 1,
-        // Placeholder for other keys
-        FunctionalKeys = 1 << 2 | 1 << 1 | 1,
-
-        Shift = 1 << 3,
-        Control = 1 << 4
-    };
-
 public:
     explicit MousepadPlugin(QObject *parent, const QVariantList &args);
     virtual ~MousepadPlugin();
@@ -62,9 +45,9 @@ public Q_SLOTS:
     virtual void connected() { }
 
 private:
-    XKeyEvent createKeyEvent(Display *display, Window &win, Window &winRoot, bool press, KeyCode keycode, int modifiers);
-
     Display *m_display;
+    FakeKey* m_fakekey;
+
 };
 
 #endif

-- 
kdeconnect packaging



More information about the pkg-kde-commits mailing list