blob: f471fccb57127775f779893a89fdbba91f35c328 [file] [log] [blame]
Constantin Kaplinsky729598c2006-05-25 05:12:25 +00001/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved.
2 *
3 * This is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This software is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this software; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
16 * USA.
17 */
18
19// -=- DesktopWindow.h
20
21// Each VNC connection instance (CConn) creates a DesktopWindow the
22// server initialisation message has been received. The CConn is
23// responsible for all RFB-specific and network issues. The
24// DesktopWindow is responsible for all GUI management issues.
25//
26// DesktopWindow provides a FullFramePixelBuffer interface for the
27// CConn to render updates into. It also requires a callback object
28// to be supplied, which will be notified when various events occur.
29
30#ifndef __RFB_WIN32_DESKTOP_WINDOW_H__
31#define __RFB_WIN32_DESKTOP_WINDOW_H__
32
33#include <rfb/Cursor.h>
34#include <rfb_win32/CKeyboard.h>
35#include <rfb_win32/CPointer.h>
36#include <rfb_win32/Clipboard.h>
37#include <rfb_win32/ScaledDIBSectionBuffer.h>
38#include <rfb_win32/LogicalPalette.h>
39#include <vncviewer/ViewerToolBar.h>
40
41
42namespace rfb {
43
44 namespace win32 {
45
46 class DesktopWindow : rfb::win32::Clipboard::Notifier {
47 public:
48 class Callback;
49
50 DesktopWindow(Callback* cb_);
51 ~DesktopWindow();
52
53 // - Window message handling procedure
54 LRESULT processMessage(UINT msg, WPARAM wParam, LPARAM lParam);
55
56 // - Window message handling procedure for the framebuffer window
57 LRESULT processFrameMessage(UINT msg, WPARAM wParam, LPARAM lParam);
58
59 // - Determine the native pixel format of the window
60 // This can (and often will) differ from the PixelBuffer format
61 PixelFormat getNativePF() const;
62
63 // - Get the underlying window handle
64 // This is used by F8Menu to modify the window's menu
65 HWND getHandle() const {return handle;}
66
67 // - Get the framebuffer window handle
68 HWND getFrameHandle() const {return frameHandle;}
69
70 // - Set the window title
71 void setName(const char* name);
72
73 // - Set the key that causes the system/F8 menu to be displayed
74 void setMenuKey(rdr::U8 key) { menuKey = key; }
75
76 // - Pointer event handling
77 void setEmulate3(bool em3) { ptr.enableEmulate3(em3); }
78 void setPointerEventInterval(int interval) { ptr.enableInterval(interval); }
79
80 // - Set the pixel format, size etc of the underlying PixelBuffer
81 void setPF(const PixelFormat& pf);
82 PixelFormat getPF() const { return buffer->getPF(); }
83 void setSize(int w, int h);
84 void setColour(int i, int r, int g, int b) {buffer->setColour(i, r, g, b);}
george8204a77712006-05-29 14:18:14 +000085 void setDesktopScale(int scale);
Constantin Kaplinsky729598c2006-05-25 05:12:25 +000086
87 // - Set the cursor to render when the pointer is within the desktop buffer
88 void setCursor(int w, int h, const Point& hotspot, void* data, void* mask);
89 void showCursor() { showLocalCursor(); }
90
91 // - Set the window fullscreen / determine whether it is fullscreen
92 void setFullscreen(bool fs);
93 bool isFullscreen() { return fullscreenActive; }
94
95 // - Set/get the toolbar's state
96 void setShowToolbar(bool st);
97 bool isToolbarEnabled() { return showToolbar; }
98
99 // - Set whether to disable special Windows keys & pass them straight to server
100 void setDisableWinKeys(bool dwk);
101
102 // - Set/get which monitor the window should be displayed on
103 void setMonitor(const char* monitor);
104 char* getMonitor() const;
105
106 // - Set the local clipboard
107 void serverCutText(const char* str, int len);
108
109 // - Draw into the desktop buffer & update the window
110 void fillRect(const Rect& r, Pixel pix);
111 void imageRect(const Rect& r, void* pixels);
112 void copyRect(const Rect& r, int srcX, int srcY);
113
114 void invertRect(const Rect& r);
115
116 // - Update the window palette if the display is palette-based.
117 // Colours are pulled from the desktop buffer's ColourMap.
118 // Only the specified range of indexes is dealt with.
119 // After the update, the entire window is redrawn.
120 void refreshWindowPalette(int start, int count);
121
122 // Clipboard::Notifier interface
123 void notifyClipboardChanged(const char* text, int len);
124
125 // DesktopWindow Callback interface
126 class Callback : public InputHandler {
127 public:
128 virtual ~Callback() {}
129 virtual void displayChanged() = 0;
130 virtual void paintCompleted() = 0;
131 virtual bool sysCommand(WPARAM wParam, LPARAM lParam) = 0;
132 virtual void closeWindow() = 0;
133 virtual void refreshMenu(bool enableSysItems) = 0;
134 };
135
george82fd334ad2006-05-29 14:05:20 +0000136 Callback *getCallback() const { return callback; }
137
Constantin Kaplinsky729598c2006-05-25 05:12:25 +0000138 // Currently accessible so that the CConn can releaseAllKeys & check
139 // whether Ctrl and Alt are down...
140 rfb::win32::CKeyboard kbd;
141
142 protected:
143 // Routines to convert between Desktop and client (window) coordinates
144 Point desktopToClient(const Point& p) {
145 Point pos = p;
146 if (client_size.width() > buffer->width())
147 pos.x += (client_size.width() - buffer->width()) / 2;
148 else if (client_size.width() < buffer->width())
149 pos.x -= scrolloffset.x;
150 if (client_size.height() > buffer->height())
151 pos.y += (client_size.height() - buffer->height()) / 2;
152 else if (client_size.height() < buffer->height())
153 pos.y -= scrolloffset.y;
154 return pos;
155 }
156 Rect desktopToClient(const Rect& r) {
157 return Rect(desktopToClient(r.tl), desktopToClient(r.br));
158 }
159 Point clientToDesktop(const Point& p) {
160 Point pos = p;
161 if (client_size.width() > buffer->width())
162 pos.x -= (client_size.width() - buffer->width()) / 2;
163 else if (client_size.width() < buffer->width())
164 pos.x += scrolloffset.x;
165 if (client_size.height() > buffer->height())
166 pos.y -= (client_size.height() - buffer->height()) / 2;
167 else if (client_size.height() < buffer->height())
168 pos.y += scrolloffset.y;
169 return pos;
170 }
171 Rect clientToDesktop(const Rect& r) {
172 return Rect(clientToDesktop(r.tl), clientToDesktop(r.br));
173 }
174
175 // Internal routine used by the scrollbars & bump scroller to select
176 // the portion of the Desktop to display
177 bool setViewportOffset(const Point& tl);
178
179 // Bump scroll handling. Bump scrolling is used if the window is
180 // in fullscreen mode and the Desktop is larger than the window
181 bool processBumpScroll(const Point& cursorPos);
182 void setBumpScroll(bool on);
183 bool bumpScroll;
184 Point bumpScrollDelta;
185 IntervalTimer bumpScrollTimer;
186
187 // Locally-rendered VNC cursor
188 void hideLocalCursor();
189 void showLocalCursor();
190 void renderLocalCursor();
191
192 // The system-rendered cursor
193 void hideSystemCursor();
194 void showSystemCursor();
195
196 // cursorOutsideBuffer() is called whenever we detect that the mouse has
197 // moved outside the desktop. It restores the system arrow cursor.
198 void cursorOutsideBuffer();
199
200 // Returns true if part of the supplied rect is visible, false otherwise
201 bool invalidateDesktopRect(const Rect& crect, bool scaling=true);
202
203 // Determine whether or not we need to enable/disable scrollbars and set the
204 // window style accordingly
205 void calculateScrollBars();
206
207 // Win32-specific input handling
208 rfb::win32::CPointer ptr;
209 Point oldpos;
210 rfb::win32::Clipboard clipboard;
211
212 // Palette handling
213 LogicalPalette windowPalette;
214 bool palette_changed;
215
216 // - Full-screen mode
217 RECT fullscreenOldRect;
218 DWORD fullscreenOldFlags;
219 bool fullscreenActive;
220 bool fullscreenRestore;
221
222 // Cursor handling
223 Cursor cursor;
224 bool systemCursorVisible; // Should system-cursor be drawn?
225 bool trackingMouseLeave;
226 bool cursorInBuffer; // Is cursor position within server buffer? (ONLY for LocalCursor)
227 bool cursorVisible; // Is cursor currently rendered?
228 bool cursorAvailable; // Is cursor available for rendering?
229 Point cursorPos;
230 ManagedPixelBuffer cursorBacking;
231 Rect cursorBackingRect;
232
233 // ToolBar handling
234 ViewerToolBar tb;
235 bool showToolbar;
236
237 // Local window state
238 win32::ScaledDIBSectionBuffer* buffer;
239 bool has_focus;
240 Rect window_size;
241 Rect client_size;
242 Point scrolloffset;
243 Point maxscrolloffset;
244 HWND handle;
245 HWND frameHandle;
246 rdr::U8 menuKey;
247
248 Callback* callback;
249 };
250
251 };
252
253};
254
255#endif // __RFB_WIN32_DESKTOP_WINDOW_H__
256
257