Date: Tuesday, September 29, 2015 @ 05:06:05
  Author: fyan
Revision: 142175

upgpkg: deepin-menu 2.3.0-2

Add a patch to fix mouse event missing issue. 
(https://github.com/felixonmars/archlinux-community/pull/1)

Added:
  deepin-menu/trunk/fix-mouse-event-issue.patch
Modified:
  deepin-menu/trunk/PKGBUILD

-----------------------------+
 PKGBUILD                    |    9 +
 fix-mouse-event-issue.patch |  205 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 211 insertions(+), 3 deletions(-)

Modified: PKGBUILD
===================================================================
--- PKGBUILD    2015-09-29 03:05:19 UTC (rev 142174)
+++ PKGBUILD    2015-09-29 03:06:05 UTC (rev 142175)
@@ -5,7 +5,7 @@
 
 pkgname=deepin-menu
 pkgver=2.3.0
-pkgrel=1
+pkgrel=2
 pkgdesc="Deepin menu service for building beautiful menus"
 arch=('i686' 'x86_64')
 url="https://gitcafe.com/Deepin/deepin-menu";
@@ -13,12 +13,15 @@
 depends=('python2-pyqt5' 'qt5-x11extras')
 makedepends=('python2-setuptools' 'qt5-declarative' 'git')
 groups=('deepin')
-source=("git+https://github.com/linuxdeepin/deepin-menu.git#tag=$pkgver";)
-sha256sums=('SKIP')
+source=("git+https://github.com/linuxdeepin/deepin-menu.git#tag=$pkgver";
+        "fix-mouse-event-issue.patch")
+sha256sums=('SKIP' 'SKIP')
 
 prepare() {
   cd deepin-menu
 
+  patch -p1 -i ../fix-mouse-event-issue.patch
+
   # fix python version
   find -iname "*.py" | xargs sed -i 's=\(^#! */usr/bin.*\)python *$=\1python2='
 }

Added: fix-mouse-event-issue.patch
===================================================================
--- fix-mouse-event-issue.patch                         (rev 0)
+++ fix-mouse-event-issue.patch 2015-09-29 03:06:05 UTC (rev 142175)
@@ -0,0 +1,205 @@
+commit f15fc5c0c8f1d74d66b4a5067567e21d56c9786f
+Author: Xu Fasheng <fasheng...@gmail.com>
+Date:   2015-09-28 14:01:22 +0800
+
+    fix issue that could not receive XCB_BUTTON* message
+    
+    If Qt configured with "-xinput2", the original code will not catch the
+    core X11 events like XCB_BUTTON*, instead, we should dispatch mouse and
+    button events from xinput2 specially.
+    
+    https://bugreports.qt.io/browse/QTBUG-48472
+    
+    Change-Id: I4011c47d904a08d7c92d3c0cc9fb6436e86b064c
+
+diff --git a/deepin-menu.pro b/deepin-menu.pro
+index 6b21a54..9257ff2 100644
+--- a/deepin-menu.pro
++++ b/deepin-menu.pro
+@@ -37,7 +37,7 @@ HEADERS  += \
+     ddockmenu.h \
+     dmenuapplication.h
+ 
+-LIBS += -lxcb
++LIBS += -lxcb -lX11
+ 
+ RESOURCES += \
+     images.qrc
+diff --git a/dmenubase.cpp b/dmenubase.cpp
+index ce9a1c0..9469dd5 100644
+--- a/dmenubase.cpp
++++ b/dmenubase.cpp
+@@ -12,9 +12,10 @@
+ #include <QTimer>
+ #include <QTime>
+ #include <QDebug>
++#include <QX11Info>
+ 
+-#include <xcb/xcb.h>
+ #include <xcb/xproto.h>
++#include <X11/Xlib.h>
+ 
+ #include "dmenubase.h"
+ #include "dmenucontent.h"
+@@ -30,6 +31,8 @@ DMenuBase::DMenuBase(QWidget *parent) :
+ {
+     this->setAttribute(Qt::WA_TranslucentBackground);
+ 
++    queryXIExtension();
++
+     _dropShadow = new QGraphicsDropShadowEffect(this);
+     _dropShadow->setBlurRadius(0);
+     _dropShadow->setColor(Qt::black);
+@@ -334,7 +337,7 @@ bool DMenuBase::nativeEvent(const QByteArray &eventType, 
void *message, long *)
+         switch (responseType) {
+         case XCB_BUTTON_PRESS: {
+             xcb_button_press_event_t *ev = 
reinterpret_cast<xcb_button_press_event_t*>(event);
+-            qDebug() << "nativeEvent" <<  responseType <<
++            qDebug() << "nativeEvent XCB_BUTTON_PRESS" <<  responseType <<
+                         ev->detail << ev->child << ev->root_x << ev->root_y;
+             if (!this->menuUnderPoint(QPoint(ev->root_x, ev->root_y))) {
+                 this->destroyAll();
+@@ -343,7 +346,7 @@ bool DMenuBase::nativeEvent(const QByteArray &eventType, 
void *message, long *)
+         }
+         case XCB_BUTTON_RELEASE: {
+             xcb_button_release_event_t *ev = 
reinterpret_cast<xcb_button_release_event_t*>(event);
+-            qDebug() << "nativeEvent" <<  responseType <<
++            qDebug() << "nativeEvent XCB_BUTTON_RELEASE" <<  responseType <<
+                         ev->detail << ev->child << ev->root_x << ev->root_y;
+ 
+             if (this->menuUnderPoint(QPoint(ev->root_x, ev->root_y)) && 
_menuContent){
+@@ -353,7 +356,7 @@ bool DMenuBase::nativeEvent(const QByteArray &eventType, 
void *message, long *)
+         }
+         case XCB_MOTION_NOTIFY: {
+             xcb_motion_notify_event_t *ev = 
reinterpret_cast<xcb_motion_notify_event_t*>(event);
+-            qDebug() << "nativeEvent" <<  responseType <<
++            qDebug() << "nativeEvent XCB_MOTION_NOTIFY" <<  responseType <<
+                         ev->detail << ev->child << ev->root_x << ev->root_y;
+             DMenuBase *menuUnderPoint = 
this->menuUnderPoint(QPoint(ev->root_x, ev->root_y));
+             if (menuUnderPoint &&
+@@ -363,11 +366,66 @@ bool DMenuBase::nativeEvent(const QByteArray &eventType, 
void *message, long *)
+             }
+             break;
+         }
++        default:
++            if (isXIType(event, xiOpCode, XI_ButtonPress)) {
++                xXIDeviceEvent *ev = reinterpret_cast<xXIDeviceEvent*>(event);
++                qDebug() << "nativeEvent XI_ButtonPress" << 
fixed1616ToReal(ev->root_x) <<
++                    fixed1616ToReal(ev->root_y);
++                if (!this->menuUnderPoint(QPoint(fixed1616ToReal(ev->root_x),
++                                                 
fixed1616ToReal(ev->root_y)))) {
++                    this->destroyAll();
++                }
++            } else if (isXIType(event, xiOpCode, XI_ButtonRelease)) {
++                xXIDeviceEvent *ev = reinterpret_cast<xXIDeviceEvent*>(event);
++                qDebug() << "nativeEvent XI_ButtonRelease" << 
fixed1616ToReal(ev->root_x) <<
++                    fixed1616ToReal(ev->root_y);
++                if (this->menuUnderPoint(QPoint(fixed1616ToReal(ev->root_x),
++                                                fixed1616ToReal(ev->root_y))) 
&& _menuContent){
++                    _menuContent->doCurrentAction();
++                }
++            } else if (isXIType(event, xiOpCode, XI_Motion)) {
++                xXIDeviceEvent *ev = reinterpret_cast<xXIDeviceEvent*>(event);
++                qDebug() << "nativeEvent XI_Motion" << 
fixed1616ToReal(ev->root_x) <<
++                    fixed1616ToReal(ev->root_y);
++                DMenuBase *menuUnderPoint = this->menuUnderPoint(
++                    QPoint(fixed1616ToReal(ev->root_x), 
fixed1616ToReal(ev->root_y)));
++                if (menuUnderPoint &&
++                    (this->mouseGrabber() != menuUnderPoint
++                     || this->keyboardGrabber() != menuUnderPoint)) {
++                    menuUnderPoint->grabFocus();
++                }
++            }
++            break;
+         }
+     }
+     return false;
+ }
+ 
++void DMenuBase::queryXIExtension()
++{
++    XQueryExtension((Display *)QX11Info::display(), "XInputExtension", 
&xiOpCode, &xiEventBase, &xiErrorBase);
++    qDebug() << "xiOpCode: " << xiOpCode;
++}
++
++bool DMenuBase::isXIEvent(xcb_generic_event_t *event, int opCode)
++{
++    qt_xcb_ge_event_t *e = (qt_xcb_ge_event_t *)event;
++    return e->extension == opCode;
++}
++
++bool DMenuBase::isXIType(xcb_generic_event_t *event, int opCode, uint16_t 
type)
++{
++    if (!isXIEvent(event, opCode))
++        return false;
++
++    xXIGenericDeviceEvent *xiEvent = reinterpret_cast<xXIGenericDeviceEvent 
*>(event);
++    return xiEvent->evtype == type;
++}
++
++qreal DMenuBase::fixed1616ToReal(FP1616 val)
++{
++    return (qreal(val >> 16)) + (val & 0xFFFF) / (qreal)0xFFFF;
++}
+ 
+ // private methods
+ void DMenuBase::updateAll()
+diff --git a/dmenubase.h b/dmenubase.h
+index 2fa2559..59805a1 100644
+--- a/dmenubase.h
++++ b/dmenubase.h
+@@ -1,10 +1,31 @@
+ #ifndef DMENUBASE_H
+ #define DMENUBASE_H
+ 
++// this event type was added in libxcb 1.10,
++// but we support also older version
++#ifndef XCB_GE_GENERIC
++#define XCB_GE_GENERIC 35
++#endif
++
+ #include <QWidget>
+ #include <QSharedPointer>
+ #include <QGraphicsDropShadowEffect>
+ 
++#include <xcb/xcb.h>
++#include <X11/extensions/XI2proto.h>
++
++// Starting from the xcb version 1.9.3 struct xcb_ge_event_t has changed:
++// - "pad0" became "extension"
++// - "pad1" and "pad" became "pad0"
++// New and old version of this struct share the following fields:
++typedef struct qt_xcb_ge_event_t {
++    uint8_t  response_type;
++    uint8_t  extension;
++    uint16_t sequence;
++    uint32_t length;
++    uint16_t event_type;
++} qt_xcb_ge_event_t;
++
+ class QColor;
+ class QTimer;
+ class QMargins;
+@@ -94,6 +115,10 @@ private slots:
+     void grabFocusSlot();
+ 
+ private:
++    int xiErrorBase;
++    int xiEventBase;
++    int xiOpCode;
++
+     int _radius;
+     QMargins _shadowMargins;
+     QMargins _menuContentMargins;
+@@ -106,6 +131,11 @@ private:
+     QGraphicsDropShadowEffect *_dropShadow;
+     QTimer *_grabFocusTimer;
+ 
++    void queryXIExtension();
++    bool isXIEvent(xcb_generic_event_t *event, int opCode);
++    bool isXIType(xcb_generic_event_t *event, int opCode, uint16_t type);
++    qreal fixed1616ToReal(FP1616 val);
++
+     bool grabFocusInternal(int);
+     void updateAll();
+ };

Reply via email to