blob: 880acc212c2dd7f5e0992cabf5aea852a9c1c2fd [file] [log] [blame]
/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved.
*
* This 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.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this software; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
* USA.
*/
//
// XserverDesktop.h
//
#ifndef __XSERVERDESKTOP_H__
#define __XSERVERDESKTOP_H__
#include <rfb/SDesktop.h>
#include <rfb/HTTPServer.h>
#include <rfb/PixelBuffer.h>
#include <rfb/Configuration.h>
#include <rfb/VNCServerST.h>
#include <rdr/SubstitutingInStream.h>
extern "C" {
#define class c_class;
#include <scrnintstr.h>
#include <os.h>
#undef class
}
namespace rfb {
class VNCServerST;
}
namespace network { class TcpListener; class Socket; }
class XserverDesktop : public rfb::SDesktop, public rfb::FullFramePixelBuffer,
public rfb::ColourMap, public rdr::Substitutor,
public rfb::VNCServerST::QueryConnectionHandler {
public:
XserverDesktop(ScreenPtr pScreen, network::TcpListener* listener,
network::TcpListener* httpListener_,
const char* name, void* fbptr);
virtual ~XserverDesktop();
// methods called from X server code
void serverReset(ScreenPtr pScreen);
void setColormap(ColormapPtr cmap);
void setColourMapEntries(ColormapPtr pColormap, int ndef, xColorItem* pdef);
void bell();
void serverCutText(const char* str, int len);
void setCursor(CursorPtr cursor);
void add_changed(RegionPtr reg);
void add_copied(RegionPtr dst, int dx, int dy);
void positionCursor();
void ignoreHooks(bool b) { ignoreHooks_ = b; }
void blockHandler(fd_set* fds);
void wakeupHandler(fd_set* fds, int nfds);
void addClient(network::Socket* sock, bool reverse);
void disconnectClients();
// QueryConnect methods called from X server code
// getQueryTimeout()
// Returns the timeout associated with a particular
// connection, identified by an opaque Id passed to the
// X code earlier. Also optionally gets the address and
// name associated with that connection.
// Returns zero if the Id is not recognised.
int getQueryTimeout(void* opaqueId,
const char** address=0,
const char** username=0);
// approveConnection()
// Used by X server code to supply the result of a query.
void approveConnection(void* opaqueId, bool accept,
const char* rejectMsg=0);
// rfb::SDesktop callbacks
virtual void pointerEvent(const rfb::Point& pos, int buttonMask);
virtual void keyEvent(rdr::U32 key, bool down);
virtual void clientCutText(const char* str, int len);
virtual rfb::Point getFbSize() { return rfb::Point(width(), height()); }
// rfb::PixelBuffer callbacks
virtual void grabRegion(const rfb::Region& r);
// rfb::ColourMap callbacks
virtual void lookup(int index, int* r, int* g, int* b);
// rdr::Substitutor callback
virtual char* substitute(const char* varName);
// rfb::VNCServerST::QueryConnectionHandler callback
virtual rfb::VNCServerST::queryResult queryConnection(network::Socket* sock,
const char* userName,
char** reason);
private:
void setColourMapEntries(int firstColour, int nColours);
static CARD32 deferredUpdateTimerCallback(OsTimerPtr timer, CARD32 now,
pointer arg);
void deferUpdate();
ScreenPtr pScreen;
OsTimerPtr deferredUpdateTimer, dummyTimer;
rfb::VNCServerST* server;
rfb::HTTPServer* httpServer;
network::TcpListener* listener;
network::TcpListener* httpListener;
ColormapPtr cmap;
bool deferredUpdateTimerSet;
bool grabbing;
bool ignoreHooks_;
bool directFbptr;
int oldButtonMask;
rfb::Point cursorPos, oldCursorPos;
void* queryConnectId;
rfb::CharArray queryConnectAddress;
rfb::CharArray queryConnectUsername;
};
#endif