From 21e7bf3b7579c4d9a5cf747ddd64f2fcfa2bf6bb Mon Sep 17 00:00:00 2001 From: Sebastien Braun Date: Tue, 5 Oct 2010 15:32:11 +0200 Subject: Implement context menu in pvsmgr[touch] by pressing the Menu key for 5 seconds. --- src/gui/frame.cpp | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 62 insertions(+), 5 deletions(-) (limited to 'src/gui/frame.cpp') diff --git a/src/gui/frame.cpp b/src/gui/frame.cpp index 32257ec..ccc49cb 100644 --- a/src/gui/frame.cpp +++ b/src/gui/frame.cpp @@ -19,12 +19,14 @@ */ #include +#include #include "frame.h" #include #include #include #define MOUSE_MOTION_SEND_INTERVAL 100 /* msecs */ +#define SPECIAL_EVENT_WAIT_TIME 5000 /* msecs */ Frame::Frame(const QString & text, QWidget * parent) : QLabel(parent), _clientVNCThread(0) @@ -73,6 +75,11 @@ Frame::Frame(const QString & text, QWidget * parent) : _mousePositionChanged = true; + _specialEventTimer = new QTimer(this); + _specialEventTimer->setInterval(SPECIAL_EVENT_WAIT_TIME); + _specialEventTimer->setSingleShot(true); + connect(_specialEventTimer, SIGNAL(timeout()), this, SLOT(showSpecialEventMenu())); + } Frame::~Frame() @@ -499,9 +506,18 @@ void Frame::keyPressEvent(QKeyEvent* event) { if(_remoteControlEnabled) { - // The action of the keyboard may depend on the position of the pointer - sendMouseMotionEvent(); - sendInputEvent(InputEvent::keyboardPress(event->key(), event->modifiers())); + if(event->key() == Qt::Key_Menu) + { + qDebug("Menu has been pressed"); + if(!event->isAutoRepeat()) + _specialEventTimer->start(); + } + else + { + // The action of the keyboard may depend on the position of the pointer + sendMouseMotionEvent(); + sendInputEvent(InputEvent::keyboardPress(event->key(), event->modifiers())); + } } else { @@ -513,9 +529,27 @@ void Frame::keyReleaseEvent(QKeyEvent* event) { if(_remoteControlEnabled) { - // The action of the keyboard may depend on the position of the pointer sendMouseMotionEvent(); - sendInputEvent(InputEvent::keyboardRelease(event->key(), event->modifiers())); + if(event->key() == Qt::Key_Menu) + { + if(!event->isAutoRepeat()) + { + qDebug("Menu has been released"); + if(_specialEventTimer->isActive()) + { + qDebug("Pressing key on client"); + // Pressing the key has been deferred, so do it now: + sendInputEvent(InputEvent::keyboardPress(event->key(), event->modifiers())); + } + sendInputEvent(InputEvent::keyboardRelease(event->key(), event->modifiers())); + _specialEventTimer->stop(); + } + } + else + { + // The action of the keyboard may depend on the position of the pointer + sendInputEvent(InputEvent::keyboardRelease(event->key(), event->modifiers())); + } } else { @@ -550,3 +584,26 @@ bool Frame::event(QEvent* event) } return QLabel::event(event); } + +void Frame::showSpecialEventMenu() +{ + qDebug("Trying to show menu..."); + QMenu* menu = new QMenu(this); + QList specialEvents = privileged_handler_chain::describe(); + QList::iterator iter; + int i; + for(i = 0, iter = specialEvents.begin(); + iter != specialEvents.end(); + iter++, i++) + { + QAction* act = menu->addAction((*iter).descriptionString); + act->setData(i); + } + QAction* selected = menu->exec(QCursor::pos()); + if(selected) + { + int index = selected->data().toInt(); + sendInputEvent(specialEvents.at(index).toEvent()); + } + delete menu; +} -- cgit v1.2.3-55-g7522