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