VirtualBox

source: vbox/trunk/src/VBox/Frontends/VirtualBox/include/VBoxConsoleView.h@ 6467

Last change on this file since 6467 was 6467, checked in by vboxsync, 17 years ago

FE/Qt: OS/2: Added low level keyboard hook to intercept keys like Alt+F4 when the VM window is in foreground.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.5 KB
Line 
1/** @file
2 *
3 * VBox frontends: Qt GUI ("VirtualBox"):
4 * VBoxConsoleView class declaration
5 */
6
7/*
8 * Copyright (C) 2006-2007 innotek GmbH
9 *
10 * This file is part of VirtualBox Open Source Edition (OSE), as
11 * available from http://www.virtualbox.org. This file is free software;
12 * you can redistribute it and/or modify it under the terms of the GNU
13 * General Public License (GPL) as published by the Free Software
14 * Foundation, in version 2 as it comes in the "COPYING" file of the
15 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
16 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
17 */
18
19#ifndef __VBoxConsoleView_h__
20#define __VBoxConsoleView_h__
21
22#include "COMDefs.h"
23
24#include "VBoxDefs.h"
25#include "VBoxGlobalSettings.h"
26
27#include <qdatetime.h>
28#include <qscrollview.h>
29#include <qpixmap.h>
30#include <qimage.h>
31
32#include <qkeysequence.h>
33
34#if defined (Q_WS_PM)
35#include "src/os2/VBoxHlp.h"
36#endif
37
38#if defined (Q_WS_MAC)
39# include <Carbon/Carbon.h>
40# include "DarwinCursor.h"
41/** @todo remove this hack when somebody get around fixing the conflicting typedef/enum OSType. */
42# define OSType VBoxOSType
43#endif
44
45class VBoxConsoleWnd;
46class MousePointerChangeEvent;
47class VBoxFrameBuffer;
48
49class QPainter;
50class QLabel;
51class QMenuData;
52
53class VBoxConsoleView : public QScrollView
54{
55 Q_OBJECT
56
57public:
58
59 enum {
60 MouseCaptured = 0x01,
61 MouseAbsolute = 0x02,
62 MouseAbsoluteDisabled = 0x04,
63 MouseNeedsHostCursor = 0x08,
64 KeyboardCaptured = 0x01,
65 HostKeyPressed = 0x02,
66 };
67
68 VBoxConsoleView (VBoxConsoleWnd *mainWnd,
69 const CConsole &console,
70 VBoxDefs::RenderMode rm,
71 QWidget *parent = 0, const char *name = 0, WFlags f = 0);
72 ~VBoxConsoleView();
73
74 QSize sizeHint() const;
75
76 void attach();
77 void detach();
78 void refresh() { doRefresh(); }
79 void normalizeGeometry (bool adjustPosition = false);
80
81 CConsole &console() { return mConsole; }
82
83 bool pause (bool on);
84
85 void setMouseIntegrationEnabled (bool enabled);
86
87 bool isMouseAbsolute() const { return mMouseAbsolute; }
88
89 void setAutoresizeGuest (bool on);
90
91 void onFullscreenChange (bool on);
92
93 void onViewOpened();
94
95 void fixModifierState (LONG *codes, uint *count);
96
97 void toggleFSMode();
98
99 void setIgnoreMainwndResize (bool aYes) { mIgnoreMainwndResize = aYes; }
100
101signals:
102
103 void keyboardStateChanged (int state);
104 void mouseStateChanged (int state);
105 void machineStateChanged (CEnums::MachineState state);
106 void additionsStateChanged (const QString &, bool, bool);
107 void mediaChanged (VBoxDefs::DiskType aType);
108 void networkStateChange();
109 void usbStateChange();
110 void sharedFoldersChanged();
111 void resizeHintDone();
112
113protected:
114
115 // events
116 bool event (QEvent *e);
117 bool eventFilter (QObject *watched, QEvent *e);
118
119#if defined(Q_WS_WIN32)
120 bool winLowKeyboardEvent (UINT msg, const KBDLLHOOKSTRUCT &event);
121 bool winEvent (MSG *msg);
122#elif defined(Q_WS_PM)
123 bool pmEvent (QMSG *aMsg);
124#elif defined(Q_WS_X11)
125 bool x11Event (XEvent *event);
126#elif defined(Q_WS_MAC)
127 bool darwinKeyboardEvent (EventRef inEvent);
128 void darwinGrabKeyboardEvents (bool fGrab);
129#endif
130
131private:
132
133 /** Flags for keyEvent(). */
134 enum {
135 KeyExtended = 0x01,
136 KeyPressed = 0x02,
137 KeyPause = 0x04,
138 KeyPrint = 0x08,
139 };
140
141 void focusEvent (bool aHasFocus, bool aReleaseHostKey = true);
142 bool keyEvent (int aKey, uint8_t aScan, int aFlags,
143 wchar_t *aUniKey = NULL);
144 bool mouseEvent (int aType, const QPoint &aPos, const QPoint &aGlobalPos,
145 ButtonState aButton,
146 ButtonState aState, ButtonState aStateAfter,
147 int aWheelDelta, Orientation aWheelDir);
148
149 void emitKeyboardStateChanged()
150 {
151 emit keyboardStateChanged (
152 (mKbdCaptured ? KeyboardCaptured : 0) |
153 (mIsHostkeyPressed ? HostKeyPressed : 0));
154 }
155
156 void emitMouseStateChanged() {
157 emit mouseStateChanged ((mMouseCaptured ? MouseCaptured : 0) |
158 (mMouseAbsolute ? MouseAbsolute : 0) |
159 (!mMouseIntegration ? MouseAbsoluteDisabled : 0));
160 }
161
162 // IConsoleCallback event handlers
163 void onStateChange (CEnums::MachineState state);
164
165 void doRefresh();
166
167 void viewportPaintEvent( QPaintEvent * );
168#ifdef VBOX_GUI_USE_REFRESH_TIMER
169 void timerEvent( QTimerEvent * );
170#endif
171
172 void captureKbd (bool aCapture, bool aEmitSignal = true);
173 void captureMouse (bool aCapture, bool aEmitSignal = true);
174
175 bool processHotKey (const QKeySequence &key, QMenuData *data);
176 void updateModifiers (bool fNumLock, bool fCapsLock, bool fScrollLock);
177
178 void releaseAllPressedKeys (bool aReleaseHostKey = true);
179 void saveKeyStates();
180 void sendChangedKeyStates();
181 void updateMouseClipping();
182
183 void setPointerShape (MousePointerChangeEvent *me);
184
185 bool isPaused() { return mLastState == CEnums::Paused; }
186 bool isRunning() { return mLastState == CEnums::Running; }
187
188 static void dimImage (QImage &img);
189
190private slots:
191
192 void doResizeHint (const QSize &aSize = QSize());
193
194private:
195
196 void maybeRestrictMinimumSize();
197
198 VBoxConsoleWnd *mMainWnd;
199
200 CConsole mConsole;
201
202 const VBoxGlobalSettings &gs;
203
204 CEnums::MachineState mLastState;
205
206 bool mAttached : 1;
207 bool mKbdCaptured : 1;
208 bool mMouseCaptured : 1;
209 bool mMouseAbsolute : 1;
210 bool mMouseIntegration : 1;
211 QPoint mLastPos;
212 QPoint mCapturedPos;
213
214 bool mDisableAutoCapture : 1;
215
216 enum { IsKeyPressed = 0x01, IsExtKeyPressed = 0x02, IsKbdCaptured = 0x80 };
217 uint8_t mPressedKeys [128];
218 uint8_t mPressedKeysCopy [128];
219
220 bool mIsHostkeyPressed : 1;
221 bool mIsHostkeyAlone : 1;
222
223 /** mKbdCaptured value during the the last host key press or release */
224 bool hostkey_in_capture : 1;
225
226 bool mIgnoreMainwndResize : 1;
227 bool mAutoresizeGuest : 1;
228
229 bool mIsAdditionsActive : 1;
230
231 bool mNumLock : 1;
232 bool mScrollLock : 1;
233 bool mCapsLock : 1;
234 long muNumLockAdaptionCnt;
235 long muCapsLockAdaptionCnt;
236
237 QTimer *resize_hint_timer;
238 QTimer *mToggleFSModeTimer;
239
240 VBoxDefs::RenderMode mode;
241
242 QRegion mLastVisibleRegion;
243 QSize mNormalSize;
244
245#if defined(Q_WS_WIN)
246 HCURSOR mAlphaCursor;
247#endif
248
249#if defined(Q_WS_MAC)
250# ifndef VBOX_WITH_HACKED_QT
251 /** Event handler reference. NULL if the handler isn't installed. */
252 EventHandlerRef mDarwinEventHandlerRef;
253# endif
254 /** The current modifier key mask. Used to figure out which modifier
255 * key was pressed when we get a kEventRawKeyModifiersChanged event. */
256 UInt32 mDarwinKeyModifiers;
257 /** The darwin cursor handle (see DarwinCursor.h/.cpp). */
258 DARWINCURSOR mDarwinCursor;
259#endif
260
261#if defined (VBOX_GUI_USE_REFRESH_TIMER)
262 QPixmap pm;
263 int tid; /**< Timer id */
264#endif
265
266 VBoxFrameBuffer *mFrameBuf;
267 CConsoleCallback mCallback;
268
269 friend class VBoxConsoleCallback;
270
271#if defined (Q_WS_WIN32)
272 static LRESULT CALLBACK lowLevelKeyboardProc (int nCode,
273 WPARAM wParam, LPARAM lParam);
274#elif defined (Q_WS_MAC)
275# ifndef VBOX_WITH_HACKED_QT
276 static pascal OSStatus darwinEventHandlerProc (EventHandlerCallRef inHandlerCallRef,
277 EventRef inEvent, void *inUserData);
278# else /* VBOX_WITH_HACKED_QT */
279 static bool macEventFilter (EventRef inEvent, void *inUserData);
280# endif /* VBOX_WITH_HACKED_QT */
281#endif
282
283 QPixmap mPausedShot;
284};
285
286#endif // __VBoxConsoleView_h__
287
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette