[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