Index: /trunk/src/VBox/Frontends/VirtualBox/src/UIVMInfoDialog.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/UIVMInfoDialog.cpp	(revision 51664)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/UIVMInfoDialog.cpp	(revision 51665)
@@ -27,4 +27,5 @@
 /* GUI includes: */
 #include "UIVMInfoDialog.h"
+#include "UIExtraDataManager.h"
 #include "UISession.h"
 #include "UIMachineLogic.h"
@@ -33,8 +34,8 @@
 #include "UIConverter.h"
 #include "UIIconPool.h"
+#include "QITabWidget.h"
+#include "QIDialogButtonBox.h"
 #include "VBoxGlobal.h"
-#include "QITabWidget.h"
 #include "VBoxUtils.h"
-#include "QIDialogButtonBox.h"
 
 /* COM includes: */
@@ -81,6 +82,4 @@
     : QIWithRetranslateUI<QMainWindow>(0)
     , m_pMachineWindow(pMachineWindow)
-    , m_fIsPolished(false)
-    , m_iWidth(0), m_iHeight(0), m_fMax(false)
     , m_pTabWidget(0)
     , m_session(pMachineWindow->session())
@@ -276,9 +275,25 @@
     switch (pEvent->type())
     {
-        /* Store window state for this VM: */
-        case QEvent::WindowStateChange:
-        {
-            if (m_fIsPolished)
-                m_fMax = isMaximized();
+        /* Handle every Resize and Move we keep track of the geometry. */
+        case QEvent::Resize:
+        {
+            if (isVisible() && (windowState() & (Qt::WindowMaximized | Qt::WindowMinimized | Qt::WindowFullScreen)) == 0)
+            {
+                QResizeEvent *pResizeEvent = static_cast<QResizeEvent*>(pEvent);
+                m_geometry.setSize(pResizeEvent->size());
+            }
+            break;
+        }
+        case QEvent::Move:
+        {
+            if (isVisible() && (windowState() & (Qt::WindowMaximized | Qt::WindowMinimized | Qt::WindowFullScreen)) == 0)
+            {
+#ifdef Q_WS_MAC
+                QMoveEvent *pMoveEvent = static_cast<QMoveEvent*>(pEvent);
+                m_geometry.moveTo(pMoveEvent->pos());
+#else /* Q_WS_MAC */
+                m_geometry.moveTo(geometry().x(), geometry().y());
+#endif /* !Q_WS_MAC */
+            }
             break;
         }
@@ -289,40 +304,4 @@
     /* Return result: */
     return fResult;
-}
-
-void UIVMInfoDialog::resizeEvent(QResizeEvent *pEvent)
-{
-    /* Pre-process through base-class: */
-    QMainWindow::resizeEvent(pEvent);
-
-    /* Store dialog size for this VM: */
-    if (m_fIsPolished && !isMaximized())
-    {
-        m_iWidth = width();
-        m_iHeight = height();
-    }
-}
-
-void UIVMInfoDialog::showEvent(QShowEvent *pEvent)
-{
-    /* One may think that QWidget::polish() is the right place to do things
-     * below, but apparently, by the time when QWidget::polish() is called,
-     * the widget style & layout are not fully done, at least the minimum
-     * size hint is not properly calculated. Since this is sometimes necessary,
-     * we provide our own "polish" implementation */
-    if (!m_fIsPolished)
-    {
-        /* Mark as polished: */
-        m_fIsPolished = true;
-
-        /* Load window size, adjust position and load window state finally: */
-        resize(m_iWidth, m_iHeight);
-        vboxGlobal().centerWidget(this, m_pMachineWindow, false);
-        if (m_fMax)
-            QTimer::singleShot(0, this, SLOT(showMaximized()));
-    }
-
-    /* Post-process through base-class: */
-    QMainWindow::showEvent(pEvent);
 }
 
@@ -486,17 +465,20 @@
 void UIVMInfoDialog::loadSettings()
 {
-    /* Load dialog geometry: */
-    QString strSize = m_session.GetMachine().GetExtraData(GUI_InfoDlgState);
-    if (strSize.isEmpty())
-    {
-        m_iWidth = 400;
-        m_iHeight = 450;
-        m_fMax = false;
-    }
-    else
-    {
-        QStringList list = strSize.split(',');
-        m_iWidth = list[0].toInt(), m_iHeight = list[1].toInt();
-        m_fMax = list[2] == "max";
+    /* Restore window geometry: */
+    {
+        /* Load geometry: */
+        m_geometry = gEDataManager->informationWindowGeometry(this, m_pMachineWindow, vboxGlobal().managedVMUuid());
+#ifdef Q_WS_MAC
+        move(m_geometry.topLeft());
+        resize(m_geometry.size());
+#else /* Q_WS_MAC */
+        setGeometry(m_geometry);
+#endif /* !Q_WS_MAC */
+        LogRel(("UIVMInfoDialog: Geometry loaded to: %dx%d @ %dx%d.\n",
+                m_geometry.x(), m_geometry.y(), m_geometry.width(), m_geometry.height()));
+
+        /* Maximize (if necessary): */
+        if (gEDataManager->isInformationWindowShouldBeMaximized(vboxGlobal().managedVMUuid()))
+            showMaximized();
     }
 }
@@ -504,8 +486,15 @@
 void UIVMInfoDialog::saveSettings()
 {
-    /* Save dialog geometry: */
-    QString strSize("%1,%2,%3");
-    m_session.GetMachine().SetExtraData(GUI_InfoDlgState,
-                                        strSize.arg(m_iWidth).arg(m_iHeight).arg(isMaximized() ? "max" : "normal"));
+    /* Save window geometry: */
+    {
+        /* Save geometry: */
+#ifdef Q_WS_MAC
+        gEDataManager->setInformationWindowGeometry(m_geometry, ::darwinIsWindowMaximized(this), vboxGlobal().managedVMUuid());
+#else /* Q_WS_MAC */
+        gEDataManager->setInformationWindowGeometry(m_geometry, isMaximized(), vboxGlobal().managedVMUuid());
+#endif /* !Q_WS_MAC */
+        LogRel(("UIVMInfoDialog: Geometry saved as: %dx%d @ %dx%d.\n",
+                m_geometry.x(), m_geometry.y(), m_geometry.width(), m_geometry.height()));
+    }
 }
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/UIVMInfoDialog.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/UIVMInfoDialog.h	(revision 51664)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/UIVMInfoDialog.h	(revision 51665)
@@ -65,8 +65,4 @@
     /** Common event-handler. */
     bool event(QEvent *pEvent);
-    /** Resize event-handler. */
-    void resizeEvent(QResizeEvent *pEvent);
-    /** Show event-handler. */
-    void showEvent(QShowEvent *pEvent);
 
 private slots:
@@ -127,16 +123,6 @@
     /** Machine-window to center dialog according. */
     UIMachineWindow       *m_pMachineWindow;
-    /** Whether dialog was polished. */
-    bool                   m_fIsPolished;
-    /** @} */
-
-    /** @name Geometry variables.
-     * @{ */
-    /** Current dialog width. */
-    int                m_iWidth;
-    /** Current dialog height. */
-    int                m_iHeight;
-    /** Whether dialog maximized. */
-    bool               m_fMax;
+    /** Current dialog geometry. */
+    QRect                  m_geometry;
     /** @} */
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataDefs.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataDefs.cpp	(revision 51664)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataDefs.cpp	(revision 51665)
@@ -83,5 +83,5 @@
 const char* UIExtraDataDefs::GUI_LastNormalWindowPosition = "GUI/LastNormalWindowPosition";
 const char* UIExtraDataDefs::GUI_LastScaleWindowPosition = "GUI/LastScaleWindowPosition";
-const char* UIExtraDataDefs::GUI_LastWindowState_Max = "max";
+const char* UIExtraDataDefs::GUI_Geometry_State_Max = "max";
 const char* UIExtraDataDefs::GUI_LastGuestSizeHint = "GUI/LastGuestSizeHint";
 const char* UIExtraDataDefs::GUI_LastGuestSizeHintWasFullscreen = "GUI/LastGuestSizeHintWasFullscreen";
@@ -125,6 +125,6 @@
 const char* UIExtraDataDefs::GUI_CloseActionHook = "GUI/CloseActionHook";
 
-/* Runtime UI: Information-dialog definitions: */
-const char* UIExtraDataDefs::GUI_InfoDlgState = "GUI/InfoDlgState";
+/* Runtime UI: Information-window definitions: */
+const char* UIExtraDataDefs::GUI_Geometry_InformationWindow = "GUI/Geometry/InformationWindow";
 
 #ifdef VBOX_WITH_DEBUGGER_GUI
Index: /trunk/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataDefs.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataDefs.h	(revision 51664)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataDefs.h	(revision 51665)
@@ -91,5 +91,5 @@
     extern const char* GUI_LastNormalWindowPosition;
     extern const char* GUI_LastScaleWindowPosition;
-    extern const char* GUI_LastWindowState_Max;
+    extern const char* GUI_Geometry_State_Max;
     extern const char* GUI_LastGuestSizeHint;
     extern const char* GUI_LastGuestSizeHintWasFullscreen;
@@ -133,6 +133,6 @@
     extern const char* GUI_CloseActionHook;
 
-    /* Runtime UI: Information-dialog declarations: */
-    extern const char* GUI_InfoDlgState;
+    /* Runtime UI: Information-window declarations: */
+    extern const char* GUI_Geometry_InformationWindow;
 
 #ifdef VBOX_WITH_DEBUGGER_GUI
Index: /trunk/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataManager.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataManager.cpp	(revision 51664)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataManager.cpp	(revision 51665)
@@ -311,5 +311,5 @@
 }
 
-QRect UIExtraDataManager::selectorWindowGeometry(QWidget *pHintWidget /* = 0 */) const
+QRect UIExtraDataManager::selectorWindowGeometry(QWidget *pWidget) const
 {
     /* Load corresponding extra-data: */
@@ -335,7 +335,7 @@
     QRect geometry = fOk ? QRect(iX, iY, iW, iH) : QRect(0, 0, 770, 550);
 
-    /* Take hint-widget into account: */
-    if (pHintWidget)
-        geometry.setSize(geometry.size().expandedTo(pHintWidget->minimumSizeHint()));
+    /* Take widget into account: */
+    if (pWidget)
+        geometry.setSize(geometry.size().expandedTo(pWidget->minimumSizeHint()));
 
     /* Get screen-geometry [of screen with point (iX, iY) if possible]: */
@@ -360,5 +360,5 @@
 
     /* Make sure 5th item has required value: */
-    return data.size() == 5 && data[4] == GUI_LastWindowState_Max;
+    return data.size() == 5 && data[4] == GUI_Geometry_State_Max;
 }
 
@@ -372,5 +372,5 @@
     data << QString::number(geometry.height());
     if (fMaximized)
-        data << GUI_LastWindowState_Max;
+        data << GUI_Geometry_State_Max;
 
     /* Re-cache corresponding extra-data: */
@@ -559,5 +559,5 @@
 
     /* Make sure 5th item has required value: */
-    return data.size() == 5 && data[4] == GUI_LastWindowState_Max;
+    return data.size() == 5 && data[4] == GUI_Geometry_State_Max;
 }
 
@@ -580,5 +580,5 @@
     data << QString::number(geometry.height());
     if (fMaximized)
-        data << GUI_LastWindowState_Max;
+        data << GUI_Geometry_State_Max;
 
     /* Re-cache corresponding extra-data: */
@@ -912,4 +912,71 @@
 }
 #endif /* !Q_WS_MAC */
+
+QRect UIExtraDataManager::informationWindowGeometry(QWidget *pWidget, QWidget *pParentWidget, const QString &strID) const
+{
+    /* Load corresponding extra-data: */
+    const QStringList data = extraDataStringList(GUI_Geometry_InformationWindow, strID);
+
+    /* Parse loaded data: */
+    int iX = 0, iY = 0, iW = 0, iH = 0;
+    bool fOk = data.size() >= 4;
+    do
+    {
+        if (!fOk) break;
+        iX = data[0].toInt(&fOk);
+        if (!fOk) break;
+        iY = data[1].toInt(&fOk);
+        if (!fOk) break;
+        iW = data[2].toInt(&fOk);
+        if (!fOk) break;
+        iH = data[3].toInt(&fOk);
+    }
+    while (0);
+
+    /* Use geometry (loaded or default): */
+    QRect geometry = fOk ? QRect(iX, iY, iW, iH) : QRect(0, 0, 600, 450);
+
+    /* Take hint-widget into account: */
+    if (pWidget)
+        geometry.setSize(geometry.size().expandedTo(pWidget->minimumSizeHint()));
+
+    /* Get screen-geometry [of screen with point (iX, iY) if possible]: */
+    const QRect screenGeometry = fOk ? QApplication::desktop()->availableGeometry(QPoint(iX, iY)) :
+                                       QApplication::desktop()->availableGeometry();
+
+    /* Make sure resulting geometry is within current bounds: */
+    geometry = geometry.intersected(screenGeometry);
+
+    /* Move default-geometry to pParentWidget' geometry center: */
+    if (!fOk && pParentWidget)
+        geometry.moveCenter(pParentWidget->geometry().center());
+
+    /* Return result: */
+    return geometry;
+}
+
+bool UIExtraDataManager::isInformationWindowShouldBeMaximized(const QString &strID) const
+{
+    /* Load corresponding extra-data: */
+    const QStringList data = extraDataStringList(GUI_Geometry_InformationWindow, strID);
+
+    /* Make sure 5th item has required value: */
+    return data.size() == 5 && data[4] == GUI_Geometry_State_Max;
+}
+
+void UIExtraDataManager::setInformationWindowGeometry(const QRect &geometry, bool fMaximized, const QString &strID)
+{
+    /* Serialize passed values: */
+    QStringList data;
+    data << QString::number(geometry.x());
+    data << QString::number(geometry.y());
+    data << QString::number(geometry.width());
+    data << QString::number(geometry.height());
+    if (fMaximized)
+        data << GUI_Geometry_State_Max;
+
+    /* Re-cache corresponding extra-data: */
+    setExtraDataStringList(GUI_Geometry_InformationWindow, data, strID);
+}
 
 GuruMeditationHandlerType UIExtraDataManager::guruMeditationHandlerType(const QString &strID) const
Index: /trunk/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataManager.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataManager.h	(revision 51664)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataManager.h	(revision 51665)
@@ -131,6 +131,6 @@
     void setModeForWizard(WizardType type, WizardMode mode);
 
-    /** Returns selector-window geometry using @a pHintWidget as the hint. */
-    QRect selectorWindowGeometry(QWidget *pHintWidget = 0) const;
+    /** Returns selector-window geometry using @a pWidget as the hint. */
+    QRect selectorWindowGeometry(QWidget *pWidget) const;
     /** Returns whether selector-window should be maximized or not. */
     bool isSelectorWindowShouldBeMaximized() const;
@@ -260,4 +260,11 @@
 #endif /* !Q_WS_MAC */
 
+    /** Returns information-window geometry using @a pWidget and @a pParentWidget as hints. */
+    QRect informationWindowGeometry(QWidget *pWidget, QWidget *pParentWidget, const QString &strID) const;
+    /** Returns whether information-window should be maximized or not. */
+    bool isInformationWindowShouldBeMaximized(const QString &strID) const;
+    /** Defines information-window geometry to passed @a geometry which is @a fMaximized. */
+    void setInformationWindowGeometry(const QRect &geometry, bool fMaximized, const QString &strID);
+
     /** Returns redefined guru-meditation handler type. */
     GuruMeditationHandlerType guruMeditationHandlerType(const QString &strID) const;
Index: /trunk/src/VBox/Frontends/VirtualBox/src/selector/UISelectorWindow.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/selector/UISelectorWindow.cpp	(revision 51664)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/selector/UISelectorWindow.cpp	(revision 51665)
@@ -972,7 +972,5 @@
     switch (pEvent->type())
     {
-        /* By handling every Resize and Move we keep track of the normal
-         * (non-minimized and non-maximized) window geometry. Shame on Qt
-         * that it doesn't provide this geometry in its public APIs. */
+        /* Handle every Resize and Move we keep track of the geometry. */
         case QEvent::Resize:
         {
@@ -980,5 +978,5 @@
             {
                 QResizeEvent *pResizeEvent = static_cast<QResizeEvent*>(pEvent);
-                m_normalGeo.setSize(pResizeEvent->size());
+                m_geometry.setSize(pResizeEvent->size());
             }
             break;
@@ -990,7 +988,7 @@
 #ifdef Q_WS_MAC
                 QMoveEvent *pMoveEvent = static_cast<QMoveEvent*>(pEvent);
-                m_normalGeo.moveTo(pMoveEvent->pos());
+                m_geometry.moveTo(pMoveEvent->pos());
 #else /* Q_WS_MAC */
-                m_normalGeo.moveTo(geometry().x(), geometry().y());
+                m_geometry.moveTo(geometry().x(), geometry().y());
 #endif /* !Q_WS_MAC */
             }
@@ -1501,16 +1499,16 @@
 void UISelectorWindow::loadSettings()
 {
-    /* Restore window position: */
+    /* Restore window geometry: */
     {
         /* Load geometry: */
-        m_normalGeo = gEDataManager->selectorWindowGeometry(this);
-#ifdef Q_WS_MAC
-        move(m_normalGeo.topLeft());
-        resize(m_normalGeo.size());
+        m_geometry = gEDataManager->selectorWindowGeometry(this);
+#ifdef Q_WS_MAC
+        move(m_geometry.topLeft());
+        resize(m_geometry.size());
 #else /* Q_WS_MAC */
-        setGeometry(m_normalGeo);
+        setGeometry(m_geometry);
 #endif /* !Q_WS_MAC */
         LogRel(("UISelectorWindow: Geometry loaded to: %dx%d @ %dx%d.\n",
-                m_normalGeo.x(), m_normalGeo.y(), m_normalGeo.width(), m_normalGeo.height()));
+                m_geometry.x(), m_geometry.y(), m_geometry.width(), m_geometry.height()));
 
         /* Maximize (if necessary): */
@@ -1562,13 +1560,13 @@
     }
 
-    /* Save window position: */
-    {
-#ifdef Q_WS_MAC
-        gEDataManager->setSelectorWindowGeometry(m_normalGeo, ::darwinIsWindowMaximized(this));
+    /* Save window geometry: */
+    {
+#ifdef Q_WS_MAC
+        gEDataManager->setSelectorWindowGeometry(m_geometry, ::darwinIsWindowMaximized(this));
 #else /* Q_WS_MAC */
-        gEDataManager->setSelectorWindowGeometry(m_normalGeo, isMaximized());
+        gEDataManager->setSelectorWindowGeometry(m_geometry, isMaximized());
 #endif /* !Q_WS_MAC */
         LogRel(("UISelectorWindow: Geometry saved as: %dx%d @ %dx%d.\n",
-                m_normalGeo.x(), m_normalGeo.y(), m_normalGeo.width(), m_normalGeo.height()));
+                m_geometry.x(), m_geometry.y(), m_geometry.width(), m_geometry.height()));
     }
 }
Index: /trunk/src/VBox/Frontends/VirtualBox/src/selector/UISelectorWindow.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/selector/UISelectorWindow.h	(revision 51664)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/selector/UISelectorWindow.h	(revision 51665)
@@ -238,5 +238,5 @@
 
     /* Other variables: */
-    QRect m_normalGeo;
+    QRect m_geometry;
 };
 
