a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/* $Id$ */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/** @file
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * VBox Debugger GUI - Base classes.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*
c58f1213e628a545081c70e26c6b67a841cff880vboxsync * Copyright (C) 2006-2013 Oracle Corporation
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * available from http://www.virtualbox.org. This file is free software;
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * you can redistribute it and/or modify it under the terms of the GNU
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * General Public License (GPL) as published by the Free Software
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*******************************************************************************
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync* Header Files *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync*******************************************************************************/
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#define LOG_GROUP LOG_GROUP_DBGG
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <VBox/err.h>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <iprt/asm.h>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <iprt/assert.h>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <limits.h>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include "VBoxDbgBase.h"
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include "VBoxDbgGui.h"
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <QApplication>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <QWidgetList>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgBase::VBoxDbgBase(VBoxDbgGui *a_pDbgGui)
021c939a9e3f688c0c3bbd759354be906bb2dcabvboxsync : m_pDbgGui(a_pDbgGui), m_pUVM(NULL), m_hGUIThread(RTThreadNativeSelf())
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Register
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
021c939a9e3f688c0c3bbd759354be906bb2dcabvboxsync m_pUVM = a_pDbgGui->getUvmHandle();
021c939a9e3f688c0c3bbd759354be906bb2dcabvboxsync if (m_pUVM)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
021c939a9e3f688c0c3bbd759354be906bb2dcabvboxsync VMR3RetainUVM(m_pUVM);
021c939a9e3f688c0c3bbd759354be906bb2dcabvboxsync
021c939a9e3f688c0c3bbd759354be906bb2dcabvboxsync int rc = VMR3AtStateRegister(m_pUVM, atStateChange, this);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertRC(rc);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgBase::~VBoxDbgBase()
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * If the VM is still around.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** @todo need to do some locking here? */
021c939a9e3f688c0c3bbd759354be906bb2dcabvboxsync PUVM pUVM = ASMAtomicXchgPtrT(&m_pUVM, NULL, PUVM);
021c939a9e3f688c0c3bbd759354be906bb2dcabvboxsync if (pUVM)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
021c939a9e3f688c0c3bbd759354be906bb2dcabvboxsync int rc = VMR3AtStateDeregister(pUVM, atStateChange, this);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertRC(rc);
021c939a9e3f688c0c3bbd759354be906bb2dcabvboxsync
021c939a9e3f688c0c3bbd759354be906bb2dcabvboxsync VMR3ReleaseUVM(pUVM);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncint
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgBase::stamReset(const QString &rPat)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QByteArray Utf8Array = rPat.toUtf8();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync const char *pszPat = !rPat.isEmpty() ? Utf8Array.constData() : NULL;
021c939a9e3f688c0c3bbd759354be906bb2dcabvboxsync PUVM pUVM = m_pUVM;
021c939a9e3f688c0c3bbd759354be906bb2dcabvboxsync if ( pUVM
021c939a9e3f688c0c3bbd759354be906bb2dcabvboxsync && VMR3GetStateU(pUVM) < VMSTATE_DESTROYING)
9463a771c826d5b93c993eb36baaabf59be55f5evboxsync return STAMR3Reset(pUVM, pszPat);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return VERR_INVALID_HANDLE;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncint
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgBase::stamEnum(const QString &rPat, PFNSTAMR3ENUM pfnEnum, void *pvUser)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QByteArray Utf8Array = rPat.toUtf8();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync const char *pszPat = !rPat.isEmpty() ? Utf8Array.constData() : NULL;
021c939a9e3f688c0c3bbd759354be906bb2dcabvboxsync PUVM pUVM = m_pUVM;
021c939a9e3f688c0c3bbd759354be906bb2dcabvboxsync if ( pUVM
021c939a9e3f688c0c3bbd759354be906bb2dcabvboxsync && VMR3GetStateU(pUVM) < VMSTATE_DESTROYING)
a04100f955c08c93b063cf3d9c4f963637996f3cvboxsync return STAMR3Enum(pUVM, pszPat, pfnEnum, pvUser);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return VERR_INVALID_HANDLE;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncint
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgBase::dbgcCreate(PDBGCBACK pBack, unsigned fFlags)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
021c939a9e3f688c0c3bbd759354be906bb2dcabvboxsync PUVM pUVM = m_pUVM;
021c939a9e3f688c0c3bbd759354be906bb2dcabvboxsync if ( pUVM
021c939a9e3f688c0c3bbd759354be906bb2dcabvboxsync && VMR3GetStateU(pUVM) < VMSTATE_DESTROYING)
98427c0ab08697e468c26dc33ee9571308577867vboxsync return DBGCCreate(pUVM, pBack, fFlags);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return VERR_INVALID_HANDLE;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*static*/ DECLCALLBACK(void)
0f81043c307886fc3e8d0479c4e4120b35c6d0b9vboxsyncVBoxDbgBase::atStateChange(PUVM pUVM, VMSTATE enmState, VMSTATE /*enmOldState*/, void *pvUser)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
0f81043c307886fc3e8d0479c4e4120b35c6d0b9vboxsync VBoxDbgBase *pThis = (VBoxDbgBase *)pvUser; NOREF(pUVM);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync switch (enmState)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case VMSTATE_TERMINATED:
021c939a9e3f688c0c3bbd759354be906bb2dcabvboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** @todo need to do some locking here? */
0f81043c307886fc3e8d0479c4e4120b35c6d0b9vboxsync PUVM pUVM2 = ASMAtomicXchgPtrT(&pThis->m_pUVM, NULL, PUVM);
0f81043c307886fc3e8d0479c4e4120b35c6d0b9vboxsync if (pUVM2)
021c939a9e3f688c0c3bbd759354be906bb2dcabvboxsync {
0f81043c307886fc3e8d0479c4e4120b35c6d0b9vboxsync Assert(pUVM2 == pUVM);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pThis->sigTerminated();
0f81043c307886fc3e8d0479c4e4120b35c6d0b9vboxsync VMR3ReleaseUVM(pUVM2);
021c939a9e3f688c0c3bbd759354be906bb2dcabvboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
021c939a9e3f688c0c3bbd759354be906bb2dcabvboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case VMSTATE_DESTROYING:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pThis->sigDestroying();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync default:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgBase::sigDestroying()
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgBase::sigTerminated()
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync//
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync//
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync//
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync// V B o x D b g B a s e W i n d o w
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync// V B o x D b g B a s e W i n d o w
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync// V B o x D b g B a s e W i n d o w
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync//
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync//
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync//
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncunsigned VBoxDbgBaseWindow::m_cxBorder = 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncunsigned VBoxDbgBaseWindow::m_cyBorder = 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgBaseWindow::VBoxDbgBaseWindow(VBoxDbgGui *a_pDbgGui, QWidget *a_pParent)
19d2bd74156f55ea7fd654c35cc421abb0dc55cfvboxsync : QWidget(a_pParent, Qt::Window), VBoxDbgBase(a_pDbgGui), m_fPolished(false),
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_x(INT_MAX), m_y(INT_MAX), m_cx(0), m_cy(0)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgBaseWindow::~VBoxDbgBaseWindow()
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgBaseWindow::vShow()
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync show();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** @todo this ain't working right. HELP! */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync setWindowState(windowState() & ~Qt::WindowMinimized);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync //activateWindow();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync //setFocus();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync vPolishSizeAndPos();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgBaseWindow::vReposition(int a_x, int a_y, unsigned a_cx, unsigned a_cy, bool a_fResize)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (a_fResize)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_cx = a_cx;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_cy = a_cy;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QSize BorderSize = frameSize() - size();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (BorderSize == QSize(0,0))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync BorderSize = vGuessBorderSizes();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync resize(a_cx - BorderSize.width(), a_cy - BorderSize.height());
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_x = a_x;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_y = a_y;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync move(a_x, a_y);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncbool
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgBaseWindow::event(QEvent *a_pEvt)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync bool fRc = QWidget::event(a_pEvt);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync vPolishSizeAndPos();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return fRc;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgBaseWindow::vPolishSizeAndPos()
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* Ignore if already done or no size set. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if ( m_fPolished
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || (m_x == INT_MAX && m_y == INT_MAX))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QSize BorderSize = frameSize() - size();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (BorderSize != QSize(0,0))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_fPolished = true;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync vReposition(m_x, m_y, m_cx, m_cy, m_cx || m_cy);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncQSize
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgBaseWindow::vGuessBorderSizes()
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#ifdef Q_WS_X11 /* (from the qt gui) */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* only once. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!m_cxBorder && !m_cyBorder)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* On X11, there is no way to determine frame geometry (including WM
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * decorations) before the widget is shown for the first time. Stupidly
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * enumerate other top level widgets to find the thickest frame. The code
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * is based on the idea taken from QDialog::adjustPositionInternal(). */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int extraw = 0, extrah = 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QWidgetList list = QApplication::topLevelWidgets();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QListIterator<QWidget*> it (list);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync while ((extraw == 0 || extrah == 0) && it.hasNext())
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int framew, frameh;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QWidget *current = it.next();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!current->isVisible())
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync continue;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync framew = current->frameGeometry().width() - current->width();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync frameh = current->frameGeometry().height() - current->height();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync extraw = qMax (extraw, framew);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync extrah = qMax (extrah, frameh);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (extraw || extrah)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_cxBorder = extraw;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_cyBorder = extrah;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#endif /* X11 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return QSize(m_cxBorder, m_cyBorder);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync