268 lines
7.4 KiB
C++
268 lines
7.4 KiB
C++
// Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved.
|
|
//
|
|
// This file is part of the VNC system.
|
|
//
|
|
// The VNC system 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 program 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 program; if not, write to the Free Software
|
|
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
|
// USA.
|
|
//
|
|
// TightVNC distribution homepage on the Web: http://www.tightvnc.com/
|
|
//
|
|
// If the source code for the VNC system is not available from the place
|
|
// whence you received this file, check http://www.uk.research.att.com/vnc or contact
|
|
// the authors on vnc@uk.research.att.com for information on obtaining it.
|
|
|
|
|
|
// vncDesktop object
|
|
|
|
// The vncDesktop object handles retrieval of data from the
|
|
// display buffer. It also uses the RFBLib DLL to supply
|
|
// information on mouse movements and screen updates to
|
|
// the server
|
|
|
|
class vncDesktop;
|
|
|
|
#if !defined(_WINVNC_VNCDESKTOP)
|
|
#define _WINVNC_VNCDESKTOP
|
|
#pragma once
|
|
|
|
// Include files
|
|
#include "stdhdrs.h"
|
|
|
|
#include "vncServer.h"
|
|
#include "vncRegion.h"
|
|
#include "RectList.h"
|
|
#include "translate.h"
|
|
#include <omnithread.h>
|
|
#include "VideoDriver.h"
|
|
|
|
// Constants
|
|
extern const UINT RFB_SCREEN_UPDATE;
|
|
extern const UINT RFB_COPYRECT_UPDATE;
|
|
extern const UINT RFB_MOUSE_UPDATE;
|
|
extern const char szDesktopSink[];
|
|
|
|
#define MAX_REG_ENTRY_LEN (80)
|
|
|
|
// Class definition
|
|
|
|
class vncDesktop
|
|
{
|
|
|
|
// Fields
|
|
public:
|
|
|
|
// Methods
|
|
public:
|
|
// Make the desktop thread & window proc friends
|
|
friend class vncDesktopThread;
|
|
friend LRESULT CALLBACK DesktopWndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);
|
|
|
|
// Create/Destroy methods
|
|
vncDesktop();
|
|
~vncDesktop();
|
|
|
|
BOOL Init(vncServer *pSrv);
|
|
|
|
// Hooking stuff
|
|
void TryActivateHooks();
|
|
BOOL DriverActive() { return m_videodriver != NULL; }
|
|
|
|
// Routine to signal a vncServer to trigger an update
|
|
void RequestUpdate();
|
|
|
|
// Screen translation, capture, info
|
|
void FillDisplayInfo(rfbServerInitMsg *scrInfo);
|
|
void SetLocalInputDisableHook(BOOL enable);
|
|
void SetLocalInputPriorityHook(BOOL enable);
|
|
void CaptureScreen(RECT &UpdateArea, BYTE *scrBuff);
|
|
void CaptureScreenFromAdapterGeneral(RECT UpdateArea, BYTE *scrBuff);
|
|
void CaptureScreenFromMirage(RECT UpdateArea, BYTE *scrBuff);
|
|
int ScreenBuffSize();
|
|
HWND Window() { return m_hwnd; }
|
|
|
|
// Mouse related
|
|
void CaptureMouse(BYTE *scrBuff, UINT scrBuffSize);
|
|
|
|
void CaptureMouseRect();
|
|
BOOL GetRichCursorData(BYTE *databuf, HCURSOR hcursor, int width, int height);
|
|
RECT MouseRect();
|
|
void SetCursor(HCURSOR cursor);
|
|
HCURSOR GetCursor() { return m_hcursor; }
|
|
|
|
// created for debug purposes. not used in normal builds.
|
|
bool bDbgDumpSurfBuffers(const RECT &rcl);
|
|
|
|
// Clipboard manipulation
|
|
static void ConvertClipText(char *dst, const char *src);
|
|
void SetClipText(LPSTR text);
|
|
|
|
// Method to obtain the DIBsection buffer if fast blits are enabled
|
|
// If they're disabled, it'll return NULL
|
|
inline BYTE *MainBuffer() { return m_mainbuff; }
|
|
inline RECT MainBufferRect() { return m_bmrect; }
|
|
void CopyRect(const RECT &dest, const POINT &source);
|
|
|
|
BOOL m_initialClipBoardSeen;
|
|
|
|
// Implementation
|
|
protected:
|
|
|
|
// Routines to hook and unhook us
|
|
BOOL Startup();
|
|
BOOL Shutdown();
|
|
void ActivateHooks();
|
|
void ShutdownHooks();
|
|
|
|
// Init routines called by the child thread
|
|
BOOL InitDesktop();
|
|
void KillScreenSaver();
|
|
|
|
RECT GetSourceRect();
|
|
BOOL GetSourceDisplayRect(RECT &rdisp_rect);
|
|
static BOOL IsMultiMonDesktop();
|
|
|
|
void ChangeResNow();
|
|
void SetupDisplayForConnection();
|
|
void ResetDisplayToNormal();
|
|
|
|
BOOL InitBitmap();
|
|
BOOL InitWindow();
|
|
BOOL ThunkBitmapInfo();
|
|
BOOL SetPixFormat();
|
|
BOOL SetPixShifts();
|
|
BOOL InitHooks();
|
|
BOOL SetPalette();
|
|
|
|
void CopyToBuffer(RECT rect, BYTE *scrBuff);
|
|
void CopyToBuffer(RECT rect, BYTE *scrBuff, const BYTE *SourceBuff);
|
|
void CopyRectToBuffer(const RECT &dest, const POINT &source);
|
|
void CalcCopyRects();
|
|
|
|
// Routine to attempt enabling optimised DIBsection blits
|
|
BOOL CreateBuffers();
|
|
|
|
// Convert a bit mask eg. 00111000 to max=7, shift=3
|
|
static void MaskToMaxAndShift(DWORD mask, CARD16 &max, CARD8 &shift);
|
|
|
|
// Enabling & disabling clipboard handling
|
|
void SetClipboardActive(BOOL active) {m_clipboard_active = active;};
|
|
|
|
// Detecting updates
|
|
BOOL CheckUpdates();
|
|
void SetPollingTimer();
|
|
void SetPollingFlag(BOOL set) { m_polling_flag = set; }
|
|
BOOL GetPollingFlag() { return m_polling_flag; }
|
|
void PerformPolling();
|
|
void PollWindow(HWND hwnd);
|
|
void PollArea(const RECT &rect);
|
|
void CheckRects(vncRegion &rgn, rectlist &rects);
|
|
void GetChangedRegion(vncRegion &rgn, const RECT &rect);
|
|
|
|
void UpdateChangedRect(vncRegion &rgn, const RECT &rect);
|
|
void UpdateChangedSubRect(vncRegion &rgn, const RECT &rect);
|
|
|
|
// Blank screen feature
|
|
void UpdateBlankScreenTimer();
|
|
void BlankScreen(BOOL set);
|
|
|
|
// Timer identifiers (the third one is not used in any real timer)
|
|
enum TimerID {
|
|
TIMER_POLL = 1,
|
|
TIMER_BLANK_SCREEN = 2,
|
|
TIMER_RESTORE_SCREEN = 3
|
|
};
|
|
|
|
// Video driver stuff
|
|
BOOL InitVideoDriver();
|
|
void ShutdownVideoDriver();
|
|
|
|
// DATA
|
|
|
|
// Generally useful stuff
|
|
vncServer *m_server;
|
|
omni_thread *m_thread;
|
|
HWND m_hwnd;
|
|
BOOL m_polling_flag;
|
|
UINT m_timer_polling;
|
|
UINT m_timer_blank_screen;
|
|
HWND m_hnextviewer;
|
|
BOOL m_clipboard_active;
|
|
BOOL m_hooks_active;
|
|
BOOL m_hooks_may_change;
|
|
|
|
// Video driver stuff
|
|
vncVideoDriver *m_videodriver;
|
|
|
|
// device contexts for memory and the screen
|
|
HDC m_hmemdc;
|
|
HDC m_hrootdc;
|
|
|
|
// New and old bitmaps
|
|
HBITMAP m_membitmap;
|
|
omni_mutex m_bitbltlock;
|
|
|
|
// frame buffer relative to the entire (virtual) desktop.
|
|
// NOTE: non-zero offsets possible
|
|
RECT m_bmrect;
|
|
|
|
struct _BMInfo {
|
|
BOOL truecolour;
|
|
BITMAPINFO bmi;
|
|
// Colormap info - comes straight after BITMAPINFO - **HACK**
|
|
RGBQUAD cmap[256];
|
|
} m_bminfo;
|
|
|
|
// Screen info
|
|
rfbServerInitMsg m_scrinfo;
|
|
|
|
// These are the red, green & blue masks for a pixel
|
|
DWORD m_rMask, m_gMask, m_bMask;
|
|
|
|
// This is always handy to have
|
|
int m_bytesPerRow;
|
|
|
|
// Handle of the default cursor
|
|
HCURSOR m_hcursor;
|
|
// Handle of the basic arrow cursor
|
|
HCURSOR m_hdefcursor;
|
|
// The current mouse position
|
|
RECT m_cursorpos;
|
|
|
|
// Boolean flag to indicate when the display resolution has changed
|
|
BOOL m_displaychanged;
|
|
|
|
// Extra vars used for the DIBsection optimisation
|
|
VOID *m_DIBbits;
|
|
BYTE *m_mainbuff;
|
|
BYTE *m_backbuff;
|
|
BOOL m_freemainbuff;
|
|
BOOL m_formatmunged;
|
|
|
|
// DevMode alteration
|
|
DEVMODE *m_lpAlternateDevMode; // *** used for res changes - Jeremy Peaks
|
|
long origPelsWidth; // *** To set the original resolution
|
|
long origPelsHeight; // *** - Jeremy Peaks
|
|
|
|
vncRegion m_changed_rgn;
|
|
BOOL m_copyrect_set;
|
|
RECT m_copyrect_rect;
|
|
POINT m_copyrect_src;
|
|
|
|
static const int m_pollingOrder[32];
|
|
static int m_pollingStep;
|
|
};
|
|
|
|
#endif // _WINVNC_VNCDESKTOP
|