Handle pointer events.
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4346 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/vncviewer/DesktopWindow.cxx b/vncviewer/DesktopWindow.cxx
index 28f6c09..5daac0a 100644
--- a/vncviewer/DesktopWindow.cxx
+++ b/vncviewer/DesktopWindow.cxx
@@ -40,7 +40,8 @@
DesktopWindow::DesktopWindow(int w, int h, const char *name,
const rfb::PixelFormat& serverPF,
CConn* cc_)
- : Fl_Window(w, h), cc(cc_), frameBuffer(NULL), pixelTrans(NULL)
+ : Fl_Window(w, h), cc(cc_), frameBuffer(NULL), pixelTrans(NULL),
+ lastPointerPos(0, 0), lastButtonMask(0)
{
callback(handleClose, this);
@@ -158,6 +159,44 @@
}
+int DesktopWindow::handle(int event)
+{
+ int buttonMask, wheelMask;
+
+ switch (event) {
+ case FL_PUSH:
+ case FL_RELEASE:
+ case FL_DRAG:
+ case FL_MOVE:
+ case FL_MOUSEWHEEL:
+ buttonMask = 0;
+ if (Fl::event_button1())
+ buttonMask |= 1;
+ if (Fl::event_button2())
+ buttonMask |= 2;
+ if (Fl::event_button3())
+ buttonMask |= 4;
+
+ if (event == FL_MOUSEWHEEL) {
+ if (Fl::event_dy() < 0)
+ wheelMask = 8;
+ else
+ wheelMask = 16;
+
+ // A quick press of the wheel "button", followed by a immediate
+ // release below
+ handlePointerEvent(Point(Fl::event_x(), Fl::event_y()),
+ buttonMask | wheelMask);
+ }
+
+ handlePointerEvent(Point(Fl::event_x(), Fl::event_y()), buttonMask);
+ return 1;
+ }
+
+ return Fl_Window::handle(event);
+}
+
+
void DesktopWindow::handleUpdateTimeout(void *data)
{
DesktopWindow *self = (DesktopWindow *)data;
@@ -184,3 +223,28 @@
{
exit_vncviewer();
}
+
+
+void DesktopWindow::handlePointerEvent(const rfb::Point& pos, int buttonMask)
+{
+ if (!viewOnly) {
+ if (pointerEventInterval == 0 || buttonMask != lastButtonMask) {
+ cc->writer()->pointerEvent(pos, buttonMask);
+ } else {
+ if (!Fl::has_timeout(handlePointerTimeout, this))
+ Fl::add_timeout((double)pointerEventInterval/1000.0,
+ handlePointerTimeout, this);
+ }
+ lastPointerPos = pos;
+ lastButtonMask = buttonMask;
+ }
+}
+
+
+void DesktopWindow::handlePointerTimeout(void *data)
+{
+ DesktopWindow *self = (DesktopWindow *)data;
+
+ assert(self);
+
+}
diff --git a/vncviewer/DesktopWindow.h b/vncviewer/DesktopWindow.h
index de85add..ba308c0 100644
--- a/vncviewer/DesktopWindow.h
+++ b/vncviewer/DesktopWindow.h
@@ -82,6 +82,7 @@
// Fl_Window callback methods
void draw();
+ int handle(int event);
private:
@@ -96,6 +97,9 @@
static void handleClose(Fl_Widget *wnd, void *data);
+ void handlePointerEvent(const rfb::Point& pos, int buttonMask);
+ static void handlePointerTimeout(void *data);
+
private:
CConn* cc;
@@ -105,6 +109,9 @@
rfb::SimpleColourMap colourMap;
rfb::Region damage;
+
+ rfb::Point lastPointerPos;
+ int lastButtonMask;
};
#endif