VirtualBox

source: vbox/trunk/src/VBox/Main/include/DisplayImpl.h@ 3035

Last change on this file since 3035 was 3001, checked in by vboxsync, 18 years ago

Main/Frontends: Next step to support asynchronous USB device flow.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.7 KB
Line 
1/** @file
2 *
3 * VirtualBox COM class implementation
4 */
5
6/*
7 * Copyright (C) 2006-2007 innotek GmbH
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License as published by the Free Software Foundation,
13 * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
14 * distribution. VirtualBox OSE is distributed in the hope that it will
15 * be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * If you received this file as part of a commercial VirtualBox
18 * distribution, then only the terms of your commercial VirtualBox
19 * license agreement apply instead of the previous paragraph.
20 */
21
22#ifndef ____H_DISPLAYIMPL
23#define ____H_DISPLAYIMPL
24
25#include "VirtualBoxBase.h"
26#include <iprt/semaphore.h>
27#include <VBox/pdm.h>
28#include <VBox/VBoxGuest.h>
29
30class Console;
31
32class ATL_NO_VTABLE Display :
33 public IConsoleCallback,
34 public VirtualBoxSupportErrorInfoImpl <Display, IDisplay>,
35 public VirtualBoxSupportTranslation <Display>,
36 public VirtualBoxBase,
37 public IDisplay
38{
39
40public:
41
42 DECLARE_NOT_AGGREGATABLE(Display)
43
44 DECLARE_PROTECT_FINAL_CONSTRUCT()
45
46 BEGIN_COM_MAP(Display)
47 COM_INTERFACE_ENTRY(ISupportErrorInfo)
48 COM_INTERFACE_ENTRY(IDisplay)
49 END_COM_MAP()
50
51 NS_DECL_ISUPPORTS
52
53 HRESULT FinalConstruct();
54 void FinalRelease();
55
56 // public initializer/uninitializer for internal purposes only
57 HRESULT init (Console *parent);
58 void uninit();
59
60 // public methods only for internal purposes
61 int handleDisplayResize (uint32_t bpp, void *pvVRAM, uint32_t cbLine, int w, int h);
62 void handleDisplayUpdate (int x, int y, int cx, int cy);
63 IFramebuffer *getFramebuffer()
64 {
65 return mFramebuffer;
66 }
67
68 int VideoAccelEnable (bool fEnable, VBVAMEMORY *pVbvaMemory);
69 void VideoAccelFlush (void);
70
71 bool VideoAccelAllowed (void);
72
73#ifdef VBOX_VRDP
74#ifdef VRDP_MC
75 void VideoAccelVRDP (bool fEnable);
76#else
77 void VideoAccelVRDP (bool fEnable, uint32_t fu32SupportedOrders);
78#endif /* VRDP_MC */
79#endif /* VBOX_VRDP */
80
81 // IConsoleCallback methods
82 STDMETHOD(OnMousePointerShapeChange)(BOOL visible, BOOL alpha, ULONG xHot, ULONG yHot,
83 ULONG width, ULONG height, BYTE *shape)
84 {
85 return S_OK;
86 }
87
88 STDMETHOD(OnMouseCapabilityChange)(BOOL supportsAbsolute, BOOL needsHostCursor)
89 {
90 return S_OK;
91 }
92
93 STDMETHOD(OnStateChange)(MachineState_T machineState);
94
95 STDMETHOD(OnAdditionsStateChange)()
96 {
97 return S_OK;
98 }
99
100 STDMETHOD(OnKeyboardLedsChange)(BOOL fNumLock, BOOL fCapsLock, BOOL fScrollLock)
101 {
102 return S_OK;
103 }
104
105 STDMETHOD(OnUSBDeviceStateChange)(IUSBDevice *device, BOOL attached,
106 IVirtualBoxErrorInfo *message)
107 {
108 return S_OK;
109 }
110
111 STDMETHOD(OnRuntimeError)(BOOL fatal, INPTR BSTR id, INPTR BSTR message)
112 {
113 return S_OK;
114 }
115
116 STDMETHOD(OnCanShowWindow)(BOOL *canShow)
117 {
118 if (canShow)
119 *canShow = TRUE;
120 return S_OK;
121 }
122
123 STDMETHOD(OnShowWindow)(ULONG64 *winId)
124 {
125 if (winId)
126 *winId = 0;
127 return S_OK;
128 }
129
130 // IDisplay properties
131 STDMETHOD(COMGETTER(Width)) (ULONG *width);
132 STDMETHOD(COMGETTER(Height)) (ULONG *height);
133 STDMETHOD(COMGETTER(ColorDepth)) (ULONG *colorDepth);
134
135 // IDisplay methods
136 STDMETHOD(SetupInternalFramebuffer)(ULONG depth);
137 STDMETHOD(LockFramebuffer)(BYTE **address);
138 STDMETHOD(UnlockFramebuffer)();
139 STDMETHOD(RegisterExternalFramebuffer)(IFramebuffer *frameBuf);
140 STDMETHOD(SetVideoModeHint)(ULONG width, ULONG height, ULONG colorDepth);
141 STDMETHOD(TakeScreenShot)(BYTE *address, ULONG width, ULONG height);
142 STDMETHOD(DrawToScreen)(BYTE *address, ULONG x, ULONG y, ULONG width, ULONG height);
143 STDMETHOD(InvalidateAndUpdate)();
144 STDMETHOD(ResizeCompleted)();
145 STDMETHOD(UpdateCompleted)();
146
147 // for VirtualBoxSupportErrorInfoImpl
148 static const wchar_t *getComponentName() { return L"Display"; }
149
150 static const PDMDRVREG DrvReg;
151
152private:
153
154 void updateDisplayData (bool aCheckParams = false);
155
156 static DECLCALLBACK(int) changeFramebuffer (Display *that, IFramebuffer *aFB,
157 bool aInternal);
158
159 static DECLCALLBACK(void*) drvQueryInterface(PPDMIBASE pInterface, PDMINTERFACE enmInterface);
160 static DECLCALLBACK(int) drvConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfgHandle);
161 static DECLCALLBACK(void) drvDestruct(PPDMDRVINS pDrvIns);
162 static DECLCALLBACK(int) displayResizeCallback(PPDMIDISPLAYCONNECTOR pInterface, uint32_t bpp, void *pvVRAM, uint32_t cbLine, uint32_t cx, uint32_t cy);
163 static DECLCALLBACK(void) displayUpdateCallback(PPDMIDISPLAYCONNECTOR pInterface,
164 uint32_t x, uint32_t y, uint32_t cx, uint32_t cy);
165 static DECLCALLBACK(void) displayRefreshCallback(PPDMIDISPLAYCONNECTOR pInterface);
166 static DECLCALLBACK(void) displayResetCallback(PPDMIDISPLAYCONNECTOR pInterface);
167 static DECLCALLBACK(void) displayLFBModeChangeCallback(PPDMIDISPLAYCONNECTOR pInterface, bool fEnabled);
168
169 ComObjPtr <Console, ComWeakRef> mParent;
170 /** Pointer to the associated display driver. */
171 struct DRVMAINDISPLAY *mpDrv;
172 /** Pointer to the device instance for the VMM Device. */
173 PPDMDEVINS mpVMMDev;
174 /** Set after the first attempt to find the VMM Device. */
175 bool mfVMMDevInited;
176 bool mInternalFramebuffer;
177 ComPtr<IFramebuffer> mFramebuffer;
178 bool mFramebufferOpened;
179 /** bitmask of acceleration operations supported by current framebuffer */
180 ULONG mSupportedAccelOps;
181 RTSEMEVENTMULTI mUpdateSem;
182
183 /* arguments of the last handleDisplayResize() call */
184 void *mLastAddress;
185 uint32_t mLastLineSize;
186 uint32_t mLastColorDepth;
187 int mLastWidth;
188 int mLastHeight;
189
190 VBVAMEMORY *mpVbvaMemory;
191 bool mfVideoAccelEnabled;
192 bool mfVideoAccelVRDP;
193 uint32_t mfu32SupportedOrders;
194
195 int32_t volatile mcVideoAccelVRDPRefs;
196
197 VBVAMEMORY *mpPendingVbvaMemory;
198 bool mfPendingVideoAccelEnable;
199 bool mfMachineRunning;
200
201 uint8_t *mpu8VbvaPartial;
202 uint32_t mcbVbvaPartial;
203
204 bool vbvaFetchCmd (VBVACMDHDR **ppHdr, uint32_t *pcbCmd);
205 void vbvaReleaseCmd (VBVACMDHDR *pHdr, int32_t cbCmd);
206
207 void handleResizeCompletedEMT (void);
208 volatile uint32_t mu32ResizeStatus;
209
210 enum {
211 ResizeStatus_Void,
212 ResizeStatus_InProgress,
213 ResizeStatus_UpdateDisplayData
214 };
215};
216
217#endif // ____H_DISPLAYIMPL
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