VirtualBox

source: vbox/trunk/src/VBox/Debugger/VBoxDbgBase.cpp@ 44393

Last change on this file since 44393 was 44393, checked in by vboxsync, 12 years ago

VM,++: Changed the VM callbacks (at error, at runtime error, at state change) to use PUVM instead of PVM.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.3 KB
Line 
1/* $Id: VBoxDbgBase.cpp 44393 2013-01-25 21:21:05Z vboxsync $ */
2/** @file
3 * VBox Debugger GUI - Base classes.
4 */
5
6/*
7 * Copyright (C) 2006-2010 Oracle Corporation
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 (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18/*******************************************************************************
19* Header Files *
20*******************************************************************************/
21#define LOG_GROUP LOG_GROUP_DBGG
22#include <VBox/err.h>
23#include <iprt/asm.h>
24#include <iprt/assert.h>
25#include <limits.h>
26#include "VBoxDbgBase.h"
27#include "VBoxDbgGui.h"
28
29#include <QApplication>
30#include <QWidgetList>
31
32
33
34VBoxDbgBase::VBoxDbgBase(VBoxDbgGui *a_pDbgGui)
35 : m_pDbgGui(a_pDbgGui), m_pUVM(NULL), m_hGUIThread(RTThreadNativeSelf())
36{
37 /*
38 * Register
39 */
40 m_pUVM = a_pDbgGui->getUvmHandle();
41 if (m_pUVM)
42 {
43 VMR3RetainUVM(m_pUVM);
44
45 int rc = VMR3AtStateRegister(m_pUVM, atStateChange, this);
46 AssertRC(rc);
47 }
48}
49
50
51VBoxDbgBase::~VBoxDbgBase()
52{
53 /*
54 * If the VM is still around.
55 */
56 /** @todo need to do some locking here? */
57 PUVM pUVM = ASMAtomicXchgPtrT(&m_pUVM, NULL, PUVM);
58 if (pUVM)
59 {
60 int rc = VMR3AtStateDeregister(pUVM, atStateChange, this);
61 AssertRC(rc);
62
63 VMR3ReleaseUVM(pUVM);
64 }
65}
66
67
68int
69VBoxDbgBase::stamReset(const QString &rPat)
70{
71 QByteArray Utf8Array = rPat.toUtf8();
72 const char *pszPat = !rPat.isEmpty() ? Utf8Array.constData() : NULL;
73 PUVM pUVM = m_pUVM;
74 if ( pUVM
75 && VMR3GetStateU(pUVM) < VMSTATE_DESTROYING)
76 return STAMR3Reset(pUVM, pszPat);
77 return VERR_INVALID_HANDLE;
78}
79
80
81int
82VBoxDbgBase::stamEnum(const QString &rPat, PFNSTAMR3ENUM pfnEnum, void *pvUser)
83{
84 QByteArray Utf8Array = rPat.toUtf8();
85 const char *pszPat = !rPat.isEmpty() ? Utf8Array.constData() : NULL;
86 PUVM pUVM = m_pUVM;
87 if ( pUVM
88 && VMR3GetStateU(pUVM) < VMSTATE_DESTROYING)
89 return STAMR3Enum(pUVM, pszPat, pfnEnum, pvUser);
90 return VERR_INVALID_HANDLE;
91}
92
93
94int
95VBoxDbgBase::dbgcCreate(PDBGCBACK pBack, unsigned fFlags)
96{
97 PUVM pUVM = m_pUVM;
98 if ( pUVM
99 && VMR3GetStateU(pUVM) < VMSTATE_DESTROYING)
100 return DBGCCreate(VMR3GetVM(pUVM), pBack, fFlags);
101 return VERR_INVALID_HANDLE;
102}
103
104
105/*static*/ DECLCALLBACK(void)
106VBoxDbgBase::atStateChange(PUVM pUVM, VMSTATE enmState, VMSTATE /*enmOldState*/, void *pvUser)
107{
108 VBoxDbgBase *pThis = (VBoxDbgBase *)pvUser; NOREF(pUVM);
109 switch (enmState)
110 {
111 case VMSTATE_TERMINATED:
112 {
113 /** @todo need to do some locking here? */
114 PUVM pUVM2 = ASMAtomicXchgPtrT(&pThis->m_pUVM, NULL, PUVM);
115 if (pUVM2)
116 {
117 Assert(pUVM2 == pUVM);
118 pThis->sigTerminated();
119 VMR3ReleaseUVM(pUVM2);
120 }
121 break;
122 }
123
124 case VMSTATE_DESTROYING:
125 pThis->sigDestroying();
126 break;
127
128 default:
129 break;
130 }
131}
132
133
134void
135VBoxDbgBase::sigDestroying()
136{
137}
138
139
140void
141VBoxDbgBase::sigTerminated()
142{
143}
144
145
146
147
148//
149//
150//
151// V B o x D b g B a s e W i n d o w
152// V B o x D b g B a s e W i n d o w
153// V B o x D b g B a s e W i n d o w
154//
155//
156//
157
158unsigned VBoxDbgBaseWindow::m_cxBorder = 0;
159unsigned VBoxDbgBaseWindow::m_cyBorder = 0;
160
161
162VBoxDbgBaseWindow::VBoxDbgBaseWindow(VBoxDbgGui *a_pDbgGui, QWidget *a_pParent)
163 : QWidget(a_pParent, Qt::Window), VBoxDbgBase(a_pDbgGui), m_fPolished(false),
164 m_x(INT_MAX), m_y(INT_MAX), m_cx(0), m_cy(0)
165{
166}
167
168
169VBoxDbgBaseWindow::~VBoxDbgBaseWindow()
170{
171
172}
173
174
175void
176VBoxDbgBaseWindow::vShow()
177{
178 show();
179 /** @todo this ain't working right. HELP! */
180 setWindowState(windowState() & ~Qt::WindowMinimized);
181 //activateWindow();
182 //setFocus();
183 vPolishSizeAndPos();
184}
185
186
187void
188VBoxDbgBaseWindow::vReposition(int a_x, int a_y, unsigned a_cx, unsigned a_cy, bool a_fResize)
189{
190 if (a_fResize)
191 {
192 m_cx = a_cx;
193 m_cy = a_cy;
194
195 QSize BorderSize = frameSize() - size();
196 if (BorderSize == QSize(0,0))
197 BorderSize = vGuessBorderSizes();
198
199 resize(a_cx - BorderSize.width(), a_cy - BorderSize.height());
200 }
201
202 m_x = a_x;
203 m_y = a_y;
204 move(a_x, a_y);
205}
206
207
208bool
209VBoxDbgBaseWindow::event(QEvent *a_pEvt)
210{
211 bool fRc = QWidget::event(a_pEvt);
212 vPolishSizeAndPos();
213 return fRc;
214}
215
216
217void
218VBoxDbgBaseWindow::vPolishSizeAndPos()
219{
220 /* Ignore if already done or no size set. */
221 if ( m_fPolished
222 || (m_x == INT_MAX && m_y == INT_MAX))
223 return;
224
225 QSize BorderSize = frameSize() - size();
226 if (BorderSize != QSize(0,0))
227 m_fPolished = true;
228
229 vReposition(m_x, m_y, m_cx, m_cy, m_cx || m_cy);
230}
231
232
233QSize
234VBoxDbgBaseWindow::vGuessBorderSizes()
235{
236#ifdef Q_WS_X11 /* (from the qt gui) */
237 /* only once. */
238 if (!m_cxBorder && !m_cyBorder)
239 {
240
241 /* On X11, there is no way to determine frame geometry (including WM
242 * decorations) before the widget is shown for the first time. Stupidly
243 * enumerate other top level widgets to find the thickest frame. The code
244 * is based on the idea taken from QDialog::adjustPositionInternal(). */
245
246 int extraw = 0, extrah = 0;
247
248 QWidgetList list = QApplication::topLevelWidgets();
249 QListIterator<QWidget*> it (list);
250 while ((extraw == 0 || extrah == 0) && it.hasNext())
251 {
252 int framew, frameh;
253 QWidget *current = it.next();
254 if (!current->isVisible())
255 continue;
256
257 framew = current->frameGeometry().width() - current->width();
258 frameh = current->frameGeometry().height() - current->height();
259
260 extraw = qMax (extraw, framew);
261 extrah = qMax (extrah, frameh);
262 }
263
264 if (extraw || extrah)
265 {
266 m_cxBorder = extraw;
267 m_cyBorder = extrah;
268 }
269 }
270#endif /* X11 */
271 return QSize(m_cxBorder, m_cyBorder);
272}
273
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