diff options
Diffstat (limited to 'krfb/krfb/rfbcontroller.h')
-rw-r--r-- | krfb/krfb/rfbcontroller.h | 221 |
1 files changed, 221 insertions, 0 deletions
diff --git a/krfb/krfb/rfbcontroller.h b/krfb/krfb/rfbcontroller.h new file mode 100644 index 00000000..948456f2 --- /dev/null +++ b/krfb/krfb/rfbcontroller.h @@ -0,0 +1,221 @@ +/*************************************************************************** + rfbcontroller.h + ------------------- + begin : Sun Dec 9 2001 + copyright : (C) 2001 by Tim Jansen + email : tim@tjansen.de + ***************************************************************************/ + +/*************************************************************************** + * Contains portions & concept from rfb's x0rfbserver.cc + * Copyright (C) 2000 heXoNet Support GmbH, D-66424 Homburg. + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef RFBCONTROLLER_H +#define RFBCONTROLLER_H + +#include "configuration.h" +#include "connectiondialog.h" +#include "xupdatescanner.h" +#include <ksock.h> +#include <qobject.h> +#include <qtimer.h> +#include <qmutex.h> + +#define HAVE_PTHREADS +#include "rfb.h" + +#include <X11/Xlib.h> + + + +class QCloseEvent; +class QClipboard; +class RFBController; + +typedef enum { + RFB_STOPPED, + RFB_WAITING, + RFB_CONNECTING, + RFB_CONNECTED +} RFBState; + +class VNCEvent { +public: + virtual void exec() = 0; + virtual ~VNCEvent(); +}; + + +class KeyboardEvent : public VNCEvent { + bool down; + KeySym keySym; + + static Display *dpy; + static signed char modifiers[0x100]; + static KeyCode keycodes[0x100], leftShiftCode, rightShiftCode, altGrCode; + static const int LEFTSHIFT; + static const int RIGHTSHIFT; + static const int ALTGR; + static char ModifierState; + + static void tweakModifiers(signed char mod, bool down); +public: + static void initKeycodes(); + + KeyboardEvent(bool d, KeySym k); + virtual void exec(); +}; + +class PointerEvent : public VNCEvent { + int button_mask, x, y; + + static bool initialized; + static Display *dpy; + static int buttonMask; +public: + PointerEvent(int b, int _x, int _y); + virtual void exec(); +}; + +class ClipboardEvent : public VNCEvent { + RFBController *controller; + QString text; +public: + ClipboardEvent(RFBController *c, const QString &text); + virtual void exec(); +}; + +class KNotifyEvent : public VNCEvent { + QString name; + QString desc; +public: + KNotifyEvent(const QString &n, const QString &d); + virtual ~KNotifyEvent(); + virtual void exec(); +}; + +class SessionEstablishedEvent : public VNCEvent { + RFBController *controller; +public: + SessionEstablishedEvent(RFBController *c); + virtual void exec(); +}; + +/** + * Manages sockets, drives the RGBConnection and triggers the connection + * dialog. + * The controller has three states: 'waiting for connection', + * 'waiting for confirmation' and 'connected'. In the first state socket and + * connection are null, in the second socket is set and in the last both are + * set. + * @author Tim Jansen + */ +class RFBController : public QObject { + Q_OBJECT + + friend class SessionEstablishedEvent; + friend class ClipboardEvent; +public: + RFBController(Configuration *c); + virtual ~RFBController(); + + RFBState state; + + void acceptConnection(bool allowRemoteConnection); + void connectionAccepted(bool allowRemoteConnection); + void refuseConnection(); + void connectionClosed(); + bool handleCheckPassword(rfbClientPtr, const char *, int); + void handleKeyEvent(bool down, KeySym keySym); + void handlePointerEvent(int button_mask, int x, int y); + enum rfbNewClientAction handleNewClient(rfbClientPtr cl); + void clipboardToServer(const QString &text); + void handleClientGone(); + void handleNegotiationFinished(rfbClientPtr cl); + int getPort(); + void startServer(int inetdFd = -1, bool xtestGrab = true); + + static bool checkX11Capabilities(); + +public slots: + void passwordChanged(); + void closeConnection(); + void enableDesktopControl(bool c); + +signals: + void sessionEstablished(QString host); + void sessionFinished(); + void sessionRefused(); + void quitApp(); + void desktopControlSettingChanged(bool); + +private: + void stopServer(bool xtestUngrab = true); + void sendKNotifyEvent(const QString &name, const QString &desc); + void sendSessionEstablished(); + void disableBackground(bool state); + + QString remoteIp; + volatile bool allowDesktopControl; + + QTimer initIdleTimer; + QTimer idleTimer; + + enum { + LAST_SYNC_TO_SERVER, + LAST_SYNC_TO_CLIENT + } lastClipboardDirection; + QString lastClipboardText; + QClipboard *clipboard; + + Configuration *configuration; + XUpdateScanner *scanner; + ConnectionDialog dialog; + + QString desktopName; + + rfbScreenInfoPtr server; + + XImage *framebufferImage; + + QMutex asyncMutex; + QPtrList<VNCEvent> asyncQueue; + + bool disableBackgroundPending; // background, as desired by libvncserver + bool disableBackgroundState; // real background state + bool closePending; // set when libvncserver detected close + bool forcedClose; // set when user closed connection +private slots: + bool checkAsyncEvents(); + void idleSlot(); + void dialogAccepted(); + void dialogRefused(); + void selectionChanged(); + void clipboardChanged(); +}; + +/* + * Class to call XTestDiscard at idle time (because otherwise + * it will not work with QT) + */ +class XTestDisabler : public QObject { + Q_OBJECT +public: + XTestDisabler(); + bool disable; + Display *dpy; +public slots: + void exec(); +}; + +#endif |