actually save zoom button settings
[presencevnc] / src / vncview.cpp
index 6d63cf0..24e02fd 100644 (file)
@@ -34,6 +34,7 @@ critical(parent, caption, message)
 #include <QPainter>
 #include <QMouseEvent>
 #include <QEvent>
+#include <QSettings>
 #include <QTime>
 #include <QTimer>
 
@@ -73,6 +74,8 @@ VncView::VncView(QWidget *parent, const KUrl &url, RemoteView::Quality quality)
     m_clipboard = QApplication::clipboard();
     connect(m_clipboard, SIGNAL(selectionChanged()), this, SLOT(clipboardSelectionChanged()));
     connect(m_clipboard, SIGNAL(dataChanged()), this, SLOT(clipboardDataChanged()));
+
+    reloadSettings();
 }
 
 VncView::~VncView()
@@ -454,7 +457,9 @@ void VncView::mouseEventHandler(QMouseEvent *e)
        static bool tap_drag_detected = false;
        static QTime press_time;
        static QTime up_time; //used for double clicks/tap&drag, for time after first tap
-static QTime foo;
+
+       const int TAP_PRESS_TIME = 200;
+       const int DOUBLE_TAP_UP_TIME = 500;
 
        if(!e) { //flush held taps
                if(tap_detected) {
@@ -463,10 +468,9 @@ static QTime foo;
                        m_buttonMask &= 0xfe;
                        vncThread.mouseEvent(cursor_x, cursor_y, m_buttonMask);
                        tap_detected = false;
-               } else if(double_tap_detected and press_time.elapsed() > 200) { //got tap + another press -> tap & drag
+               } else if(double_tap_detected and press_time.elapsed() > TAP_PRESS_TIME) { //got tap + another press -> tap & drag
                        m_buttonMask |= 0x01;
                        vncThread.mouseEvent(cursor_x, cursor_y, m_buttonMask);
-                       foo.start();
                        double_tap_detected = false;
                        tap_drag_detected = true;
                }
@@ -485,11 +489,11 @@ static QTime foo;
 
        if(e->type() == QEvent::MouseButtonPress or e->type() == QEvent::MouseButtonDblClick) {
                press_time.start();
-               if(tap_detected and up_time.elapsed() < 500) {
+               if(tap_detected and up_time.elapsed() < DOUBLE_TAP_UP_TIME) {
                        tap_detected = false;
                        double_tap_detected = true;
 
-                       QTimer::singleShot(200, this, SLOT(mouseEventHandler()));
+                       QTimer::singleShot(TAP_PRESS_TIME, this, SLOT(mouseEventHandler()));
                }
        } else if(e->type() == QEvent::MouseButtonRelease) {
                if(tap_drag_detected) {
@@ -507,10 +511,10 @@ static QTime foo;
                        vncThread.mouseEvent(cursor_x, cursor_y, m_buttonMask);
                        m_buttonMask &= 0xfe;
                        vncThread.mouseEvent(cursor_x, cursor_y, m_buttonMask);
-               } else if(press_time.elapsed() < 200) { //tap
+               } else if(press_time.elapsed() < TAP_PRESS_TIME) { //tap
                        up_time.start();
                        tap_detected = true;
-                       QTimer::singleShot(500, this, SLOT(mouseEventHandler()));
+                       QTimer::singleShot(DOUBLE_TAP_UP_TIME, this, SLOT(mouseEventHandler()));
                }
 
        }
@@ -579,22 +583,43 @@ void VncView::keyEventHandler(QKeyEvent *e)
     }
 
 
-    //handle clicks via zoom buttons
-    if(e->key() == Qt::Key_F8) {
-       if(pressed)
-               m_buttonMask |= 0x01;
-       else
-               m_buttonMask &= 0xfe;
-       vncThread.mouseEvent(cursor_x, cursor_y, m_buttonMask);
-    } else if(e->key() == Qt::Key_F7) {
-       if(pressed)
-               m_buttonMask |= 0x04;
-       else
-               m_buttonMask &= 0xfb;
-       vncThread.mouseEvent(cursor_x, cursor_y, m_buttonMask);
-    } else if (k) {
-        vncThread.keyEvent(k, pressed);
-    }
+       int current_zoom = -1;
+       if(e->key() == Qt::Key_F8)
+               current_zoom = left_zoom;
+       else if(e->key() == Qt::Key_F7)
+               current_zoom = right_zoom;
+       else if (k)
+               vncThread.keyEvent(k, pressed);
+       
+       if(current_zoom == -1)
+               return;
+
+       //handle zoom buttons
+       if(current_zoom == 0) { //left click
+               if(pressed)
+                       m_buttonMask |= 0x01;
+               else
+                       m_buttonMask &= 0xfe;
+               vncThread.mouseEvent(cursor_x, cursor_y, m_buttonMask);
+       } else if(current_zoom == 1) { //right click
+               if(pressed)
+                       m_buttonMask |= 0x04;
+               else
+                       m_buttonMask &= 0xfb;
+               vncThread.mouseEvent(cursor_x, cursor_y, m_buttonMask);
+       } else if(current_zoom == 2) { //wheel up
+               int eb = 0x10;
+               vncThread.mouseEvent(cursor_x, cursor_y, eb | m_buttonMask);
+               vncThread.mouseEvent(cursor_x, cursor_y, m_buttonMask);
+       } else if(current_zoom == 3) { //wheel down
+               int eb = 0x8;
+               vncThread.mouseEvent(cursor_x, cursor_y, eb | m_buttonMask);
+               vncThread.mouseEvent(cursor_x, cursor_y, m_buttonMask);
+       } else if(current_zoom == 4) { //page up
+               vncThread.keyEvent(0xff55, pressed);
+       } else if(current_zoom == 5) { //page down
+               vncThread.keyEvent(0xff56, pressed);
+       }
 }
 
 void VncView::unpressModifiers()
@@ -655,13 +680,36 @@ void VncView::sendKey(Qt::Key key)
        case Qt::Key_PageDown:
                k = 0xff56;
                break;
+       case Qt::Key_Meta: //TODO: test this.
+               k = XK_Super_L;
+               break;
+       case Qt::Key_Alt:
+               k = XK_Alt_L;
+               break;
        default:
                kDebug(5011) << "unhandled Qt::Key value " << key;
                return;
        }
 
-        vncThread.keyEvent(k, true);
-        vncThread.keyEvent(k, false);
+       if (k == XK_Shift_L || k == XK_Control_L || k == XK_Meta_L || k == XK_Alt_L || k == XK_Super_L) {
+               if (m_mods.contains(k)) { //release
+                       m_mods.remove(k);
+                       vncThread.keyEvent(k, false);
+               } else { //press
+                       m_mods[k] = true;
+                       vncThread.keyEvent(k, true);
+               }
+       } else { //normal key
+               vncThread.keyEvent(k, true);
+               vncThread.keyEvent(k, false);
+       }
+}
+
+void VncView::reloadSettings()
+{
+       QSettings settings;
+       left_zoom = settings.value("left_zoom", 0).toInt();
+       right_zoom = settings.value("right_zoom", 1).toInt();
 }
 
 #include "moc_vncview.cpp"