[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    branches/work/soc-plasma-sff/kdebase/workspace/plasma/plasma
From:       Marijn Kruisselbrink <m.kruisselbrink () student ! tue ! nl>
Date:       2008-06-29 19:38:31
Message-ID: 1214768311.743309.6100.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 826078 by mkruisselbrink:

initial implementation of an event filter that makes accessing context menus with \
just a left mouse button possible; a real implementation should probably go into \
KApplication to benefit all kde applications (and be a bit more configurable), but \
for quick testing this is an easier place


 M  +83 -1     plasmaapp.cpp  
 M  +12 -0     plasmaapp.h  


--- branches/work/soc-plasma-sff/kdebase/workspace/plasma/plasma/plasmaapp.cpp \
#826077:826078 @@ -42,6 +42,7 @@
 #include <QPixmapCache>
 #include <QTimer>
 #include <QtDBus/QtDBus>
+#include <QMouseEvent>
 
 #include <KCrash>
 #include <KDebug>
@@ -115,7 +116,8 @@
 PlasmaApp::PlasmaApp(Display* display, Qt::HANDLE visual, Qt::HANDLE colormap)
     : KUniqueApplication(display, visual, colormap),
       m_corona(0),
-      m_appletBrowser(0)
+      m_appletBrowser(0),
+      m_rightClickTimer(this)
 {
     KGlobal::locale()->insertCatalog("libplasma");
 
@@ -215,8 +217,88 @@
     notifyStartup(true);
 
     connect(this, SIGNAL(aboutToQuit()), this, SLOT(cleanup()));
+
+    savedEvent = 0; eventTarget = 0;
+    kapp->installEventFilter(this);
+    m_rightClickTimer.setSingleShot(true);
+    connect(&m_rightClickTimer, SIGNAL(timeout()), this, SLOT(rightClickTimer()));
 }
 
+bool PlasmaApp::eventFilter(QObject *obj, QEvent *ev)
+{
+    if (ev->spontaneous() && (ev->type() == QEvent::MouseButtonPress || ev->type() \
== QEvent::MouseButtonRelease)) { +        QMouseEvent *event = \
static_cast<QMouseEvent*>(ev); +        if (savedEvent && eventTarget) {
+            m_rightClickTimer.stop();
+            kDebug() << "releasing saved mouse press event:" << \
savedEvent->button(); +            sendEvent(eventTarget, savedEvent);
+            m_ignoreNextRelease = false;
+            delete savedEvent;
+            savedEvent = 0; eventTarget = 0;
+        }
+
+        if (ev->type() == QEvent::MouseButtonPress) {
+            if (event->button() == Qt::LeftButton) {
+                kDebug() << "eating mouse press:" << event->button() << \
event->buttons(); +                savedEvent = new QMouseEvent(event->type(), \
event->pos(), event->globalPos(), event->button(), event->buttons(), \
event->modifiers()); +                eventTarget = obj;
+                // start timer
+                m_ignoreNextRelease = false;
+                m_rightClickTimer.start(500);
+                return true;
+            } else {
+                return false;
+            }
+        } else {
+            kDebug() << "mouse release:" << event->button() << event->buttons();
+            if (m_ignoreNextRelease && event->button() == Qt::LeftButton) {
+                kDebug() << "ignoring release";
+                m_ignoreNextRelease = false;
+                return true;
+            }
+            return false;
+        }
+    } else if (ev->type() == QEvent::MouseMove) {
+        if (savedEvent && eventTarget) {
+            // check for distance moved
+            QMouseEvent *event = static_cast<QMouseEvent*>(ev);
+            QPoint dist = savedEvent->globalPos() - event->globalPos();
+            if (dist.manhattanLength() > 50) {
+                // moved far enough, release saved mouse press event
+                m_rightClickTimer.stop();
+                kDebug() << "releasing saved mouse press event thru movement:" << \
savedEvent->button(); +                sendEvent(eventTarget, savedEvent);
+                m_ignoreNextRelease = false;
+                delete savedEvent;
+                savedEvent = 0; eventTarget = 0;
+                return false;
+            } else {
+                // not moved far enough, ignore move
+                return true;
+            }
+        } else {
+            // don't eat event
+            return false;
+        }
+    } else if (ev->type() == QEvent::ToolTip) {
+        return true;
+    } else {
+        return KUniqueApplication::eventFilter(obj, ev);
+    }
+}
+
+void PlasmaApp::rightClickTimer() {
+    if (savedEvent) {
+        kDebug() << "timer fired, sending context menu event instead";
+        QContextMenuEvent cme(QContextMenuEvent::Mouse, savedEvent->pos(), \
savedEvent->globalPos(), savedEvent->modifiers()); +        delete savedEvent;
+        savedEvent = 0;
+        sendEvent(eventTarget, &cme);
+        eventTarget = 0;
+        m_ignoreNextRelease = true;
+    }
+}
+
 PlasmaApp::~PlasmaApp()
 {
     delete m_appletBrowser;
--- branches/work/soc-plasma-sff/kdebase/workspace/plasma/plasma/plasmaapp.h \
#826077:826078 @@ -21,6 +21,9 @@
 #define PLASMA_APP_H
 
 #include <QList>
+#include <QQueue>
+#include <QTimer>
+#include <QMouseEvent>
 
 #include <KUniqueApplication>
 
@@ -34,6 +37,7 @@
 class RootWidget;
 class PanelView;
 class DesktopView;
+class QMouseEvent;
 
 class PlasmaApp : public KUniqueApplication
 {
@@ -89,6 +93,9 @@
     void panelRemoved(QObject* panel);
     void adjustSize(int screen);
 
+    void rightClickTimer();
+protected:
+    virtual bool eventFilter(QObject *obj, QEvent *ev);
 private:
     PlasmaApp(Display* display, Qt::HANDLE visual, Qt::HANDLE colormap);
     static void crashHandler(int signal);
@@ -99,6 +106,11 @@
     Plasma::AppletBrowser *m_appletBrowser;
     QList<DesktopView*> m_desktops;
     bool m_isDesktop;
+
+    QMouseEvent *savedEvent;
+    QObject* eventTarget;
+    QTimer m_rightClickTimer;
+    bool m_ignoreNextRelease;
 };
 
 #endif // multiple inclusion guard


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic