UIMachineLogic.cpp revision cf421b81bccd8d2b7a49de6b88ac40da8ab4acc6
/* $Id$ */
/** @file
*
* VBox frontends: Qt GUI ("VirtualBox"):
* UIMachineLogic class implementation
*/
/*
* Copyright (C) 2010 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*/
/* Local includes */
#include "COMDefs.h"
#include "QIFileDialog.h"
#include "UIActionsPool.h"
#include "UIDownloaderAdditions.h"
#include "UIIconPool.h"
#include "UIKeyboardHandler.h"
#include "UIMouseHandler.h"
#include "UIMachineLogic.h"
#include "UIMachineLogicFullscreen.h"
#include "UIMachineLogicNormal.h"
#include "UIMachineLogicSeamless.h"
#include "UIMachineLogicScale.h"
#include "UIMachineView.h"
#include "UIMachineWindow.h"
#include "UISession.h"
#include "VBoxMediaManagerDlg.h"
#include "VBoxProblemReporter.h"
#include "VBoxTakeSnapshotDlg.h"
#include "VBoxVMInformationDlg.h"
#include "VBoxVMSettingsNetwork.h"
#include "VBoxVMSettingsSF.h"
#ifdef Q_WS_MAC
# include "DockIconPreview.h"
# include "UIExtraDataEventHandler.h"
#endif /* Q_WS_MAC */
/* Global includes */
#ifdef VBOX_WITH_DEBUGGER_GUI
#endif /* VBOX_WITH_DEBUGGER_GUI */
#ifdef Q_WS_X11
# include <XKeyboard.h>
# include <QX11Info>
#endif /* Q_WS_X11 */
#include <QDir>
#include <QFileInfo>
#include <QDesktopWidget>
#include <QTimer>
struct MediumTarget
{
MediumTarget() : name(QString("")), port(0), device(0), id(QString()), type(VBoxDefs::MediumType_Invalid) {}
};
struct USBTarget
{
bool attach;
};
{
public:
, m_pSettings(0)
{
/* Setup Dialog's options */
setModal(true);
setSizeGripEnabled(true);
/* Setup main dialog's layout */
/* Setup settings layout */
m_pSettings = new VBoxVMSettingsNetworkPage(true);
m_pSettings->setOrderAfter(this);
/* Setup button's layout */
QIDialogButtonBox *pButtonBox = new QIDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel | QDialogButtonBox::Help);
}
protected:
void retranslateUi()
{
}
protected slots:
virtual void accept()
{
m_pSettings->putBackTo();
}
protected:
{
setMinimumWidth(400);
}
private:
};
{
public:
, m_pSettings(0)
{
/* Setup Dialog's options */
setModal(true);
setSizeGripEnabled(true);
/* Setup main dialog's layout */
/* Setup settings layout */
/* Setup button's layout */
QIDialogButtonBox *pButtonBox = new QIDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel | QDialogButtonBox::Help);
}
protected:
void retranslateUi()
{
}
protected slots:
virtual void accept()
{
}
protected:
{
setMinimumWidth(400);
}
private:
};
{
UIMachineLogic *logic = 0;
switch (visualStateType)
{
case UIVisualStateType_Normal:
break;
break;
break;
case UIVisualStateType_Scale:
break;
}
return logic;
}
bool UIMachineLogic::checkAvailability()
{
return true;
}
{
/* Return null if windows are not created yet: */
if (!isMachineWindowsCreated())
return 0;
return machineWindows()[0];
}
{
/* Return null if windows are not created yet: */
if (!isMachineWindowsCreated())
return 0;
/* Select main machine window by default: */
/* Check if there is active window present: */
{
{
break;
}
}
/* Return default machine window: */
return pWindowToPropose;
}
#ifdef Q_WS_MAC
void UIMachineLogic::updateDockIcon()
{
if (!isMachineWindowsCreated())
return;
if ( m_fIsDockIconEnabled
{
}
}
{
if (!isMachineWindowsCreated())
return;
if ( m_fIsDockIconEnabled
&& m_DockIconPreviewMonitor == screenId)
}
{
if ( m_fIsDockIconEnabled
return 0;
}
#endif /* Q_WS_MAC */
, m_pMouseHandler(0)
, m_pRunningActions(0)
, m_fIsWindowsCreated(false)
, m_fIsPreventAutoClose(false)
#ifdef VBOX_WITH_DEBUGGER_GUI
, m_pDbgGui(0)
, m_pDbgGuiVT(0)
#endif /* VBOX_WITH_DEBUGGER_GUI */
#ifdef Q_WS_MAC
, m_fIsDockIconEnabled(true)
, m_pDockIconPreview(0)
#endif /* Q_WS_MAC */
{
}
{
#ifdef VBOX_WITH_DEBUGGER_GUI
/* Close debugger: */
dbgDestroy();
#endif /* VBOX_WITH_DEBUGGER_GUI */
}
{
}
{
}
{
}
{
}
void UIMachineLogic::retranslateUi()
{
#ifdef Q_WS_MAC
{
{
pAction->setText(QApplication::translate("UIMachineLogic", "Preview Monitor %1").arg(pAction->data().toInt() + 1));
}
}
#endif /* Q_WS_MAC */
}
#ifdef Q_WS_MAC
void UIMachineLogic::updateDockOverlay()
{
/* Only to an update to the realtime preview if this is enabled by the user
* & we are in an state where the framebuffer is likely valid. Otherwise to
* the overlay stuff only. */
if (m_fIsDockIconEnabled &&
(state == KMachineState_Running ||
state == KMachineState_Paused ||
state == KMachineState_Restoring ||
state == KMachineState_Saving ||
else if (m_pDockIconPreview)
}
#endif /* Q_WS_MAC */
{
/* Machine power-up notifier: */
/* Machine state-change updater: */
/* Guest additions state-change updater: */
/* Mouse capability state-change updater: */
/* USB devices state-change updater: */
connect(uisession(), SIGNAL(sigUSBDeviceStateChange(const CUSBDevice &, bool, const CVirtualBoxErrorInfo &)),
/* Runtime errors notifier: */
#ifdef Q_WS_MAC
/* Show windows: */
this, SLOT(sltShowWindows()));
#endif /* Q_WS_MAC */
}
{
/* "Machine" actions connections: */
this, SLOT(sltToggleGuestAutoresize(bool)));
this, SLOT(sltAdjustWindow()));
this, SLOT(sltToggleMouseIntegration(bool)));
this, SLOT(sltTypeCAD()));
#ifdef Q_WS_X11
this, SLOT(sltTypeCABS()));
#endif
this, SLOT(sltTakeSnapshot()));
this, SLOT(sltShowInformationDialog()));
this, SLOT(sltACPIShutdown()));
/* "Devices" actions connections: */
this, SLOT(sltPrepareStorageMenu()));
this, SLOT(sltPrepareStorageMenu()));
this, SLOT(sltPrepareUSBMenu()));
this, SLOT(sltOpenNetworkAdaptersDialog()));
this, SLOT(sltOpenSharedFoldersDialog()));
this, SLOT(sltSwitchVrdp(bool)));
this, SLOT(sltInstallGuestAdditions()));
#ifdef VBOX_WITH_DEBUGGER_GUI
/* "Debug" actions connections: */
this, SLOT(sltPrepareDebugMenu()));
this, SLOT(sltShowDebugStatistics()));
this, SLOT(sltShowDebugCommandLine()));
this, SLOT(sltLoggingToggled(bool)));
#endif
}
void UIMachineLogic::prepareActionGroups()
{
#ifdef Q_WS_MAC
/* On Mac OS X, all QMenu's are consumed by Qt after they are added to
* another QMenu or a QMenuBar. This means we have to recreate all QMenus
* when creating a new QMenuBar. */
#endif /* Q_WS_MAC */
/* Create group for all actions that are enabled only when the VM is running.
* Note that only actions whose enabled state depends exclusively on the
* execution state of the VM are added to this group. */
m_pRunningActions = new QActionGroup(this);
m_pRunningActions->setExclusive(false);
/* Create group for all actions that are enabled when the VM is running or paused.
* Note that only actions whose enabled state depends exclusively on the
* execution state of the VM are added to this group. */
m_pRunningOrPausedActions = new QActionGroup(this);
m_pRunningOrPausedActions->setExclusive(false);
/* Move actions into running actions group: */
#ifdef Q_WS_X11
#endif
/* Move actions into running-n-paused actions group: */
m_pRunningOrPausedActions->addAction(actionsPool()->action(UIActionIndex_Simple_InformationDialog));
m_pRunningOrPausedActions->addAction(actionsPool()->action(UIActionIndex_Simple_NetworkAdaptersDialog));
m_pRunningOrPausedActions->addAction(actionsPool()->action(UIActionIndex_Simple_SharedFoldersDialog));
m_pRunningOrPausedActions->addAction(actionsPool()->action(UIActionIndex_Simple_InstallGuestTools));
}
void UIMachineLogic::prepareHandlers()
{
/* Create keyboard-handler: */
/* Create mouse-handler: */
}
#ifdef Q_WS_MAC
void UIMachineLogic::prepareDock()
{
/* Add all VM menu entries to the dock menu. Leave out close and stuff like
* this. */
QAction *pDockEnablePreviewMonitor = actionsPool()->action(UIActionIndex_Toggle_DockPreviewMonitor);
this, SLOT(sltChangeDockIconUpdate(bool)));
/* Monitor selection if there are more than one monitor */
if (cGuestScreens > 1)
{
m_DockIconPreviewMonitor = qMin(session().GetMachine().GetExtraData(VBoxDefs::GUI_RealtimeDockIconUpdateMonitor).toInt(), cGuestScreens - 1);
m_pDockPreviewSelectMonitorGroup = new QActionGroup(this);
for (int i = 0; i < cGuestScreens; ++i)
{
pAction->setCheckable(true);
if (m_DockIconPreviewMonitor == i)
pAction->setChecked(true);
}
}
/* Add it to the dock. */
/* Now the dock icon preview */
QString strTest = session().GetMachine().GetExtraData(VBoxDefs::GUI_RealtimeDockIconUpdateEnabled).toLower();
/* Default to true if it is an empty value */
if (f)
pDockEnablePreviewMonitor->setChecked(true);
else
{
pDockDisablePreview->setChecked(true);
}
/* Default to true if it is an empty value */
}
#endif /* Q_WS_MAC */
{
#ifdef Q_WS_MAC
# ifdef VBOX_WITH_ICHAT_THEATER
/* Init shared AV manager: */
# endif
#endif
}
#ifdef VBOX_WITH_DEBUGGER_GUI
void UIMachineLogic::prepareDebugger()
{
if (vboxGlobal().isDebuggerAutoShowEnabled())
{
/* console in upper left corner of the desktop. */
// QRect rct (0, 0, 0, 0);
// QDesktopWidget *desktop = QApplication::desktop();
// if (desktop)
// rct = desktop->availableGeometry(pos());
// move (QPoint (rct.x(), rct.y()));
if (!vboxGlobal().isStartPausedEnabled())
sltPause(false);
}
}
#endif /* VBOX_WITH_DEBUGGER_GUI */
#ifdef Q_WS_MAC
void UIMachineLogic::cleanupDock()
{
if (m_pDockIconPreview)
{
delete m_pDockIconPreview;
m_pDockIconPreview = 0;
}
}
#endif /* Q_WS_MAC */
void UIMachineLogic::cleanupHandlers()
{
/* Cleanup mouse-handler: */
/* Cleanup keyboard-handler: */
}
void UIMachineLogic::sltMachineStateChanged()
{
/* Get machine state: */
/* Update action groups: */
switch (state)
{
case KMachineState_Stuck: // TODO: Test it!
{
/* Prevent machine view from resizing: */
uisession()->setGuestResizeIgnored(true);
/* Get console: */
/* Take the screenshot for debugging purposes and save it. */
for (int i=0; i < cGuestScreens; ++i)
{
if (i == 0)
else
}
/* Warn the user about GURU: */
{
}
break;
}
case KMachineState_Paused:
{
if (!pPauseAction->isChecked())
{
/* Was paused from CSession side: */
pPauseAction->blockSignals(true);
pPauseAction->setChecked(true);
pPauseAction->blockSignals(false);
}
break;
}
case KMachineState_Running:
{
if (pPauseAction->isChecked())
{
/* Was resumed from CSession side: */
pPauseAction->blockSignals(true);
pPauseAction->setChecked(false);
pPauseAction->blockSignals(false);
}
break;
}
case KMachineState_PoweredOff:
case KMachineState_Saved:
case KMachineState_Teleported:
case KMachineState_Aborted:
{
/* Close VM if it was turned off and closure allowed: */
if (!isPreventAutoClose())
{
/* VM has been powered off, saved or aborted, no matter
* internally or externally. We must *safely* close VM window(s): */
}
break;
}
#ifdef Q_WS_X11
case KMachineState_Starting:
case KMachineState_Restoring:
{
/* The keyboard handler may wish to do some release logging on startup.
* Tell it that the logger is now active. */
break;
}
#endif
default:
break;
}
#ifdef Q_WS_MAC
/* Update Dock Overlay: */
#endif /* Q_WS_MAC */
}
{
/* Variable falgs: */
/* Update action states: */
/* Check if we should enter some extended mode: */
/* A check whether the installed Guest Additions on the guest are up-to-date is now
* performed by the Guest Additions itself (via VBoxTray/VBoxClient), so no need to
* do something here anymore. */
}
{
/* Variable falgs: */
/* Update action state: */
pAction->setEnabled(fIsMouseSupportsAbsolute && fIsMouseSupportsRelative && !fIsMouseHostCursorNeeded);
pAction->setChecked(false);
}
void UIMachineLogic::sltUSBDeviceStateChange(const CUSBDevice &device, bool fIsAttached, const CVirtualBoxErrorInfo &error)
{
if (!fSuccess)
{
if (fIsAttached)
else
}
}
void UIMachineLogic::sltRuntimeError(bool fIsFatal, const QString &strErrorId, const QString &strMessage)
{
}
#ifdef Q_WS_MAC
void UIMachineLogic::sltShowWindows()
{
for (int i=0; i < m_machineWindowsList.size(); ++i)
{
/* Dunno what Qt thinks a window that has minimized to the dock
* should be - it is not hidden, neither is it minimized. OTOH it is
* marked shown and visible, but not activated. This latter isn't of
* much help though, since at this point nothing is marked activated.
* I might have overlooked something, but I'm buggered what if I know
* what. So, I'll just always show & activate the stupid window to
* make it get out of the dock when the user wishes to show a VM. */
}
}
#endif /* Q_WS_MAC */
void UIMachineLogic::sltCheckRequestedModes()
{
/* Do not try to enter extended mode if machine was not started yet: */
return;
/* If seamless mode is requested, supported and we are NOT currently in seamless mode: */
if (uisession()->isSeamlessModeRequested() &&
uisession()->isGuestSupportsSeamless() &&
{
uisession()->setSeamlessModeRequested(false);
AssertMsg(!pSeamlessModeAction->isChecked(), ("Seamless action should not be triggered before us!\n"));
}
/* If seamless mode is NOT requested, NOT supported and we are currently in seamless mode: */
else if (!uisession()->isSeamlessModeRequested() &&
!uisession()->isGuestSupportsSeamless() &&
{
uisession()->setSeamlessModeRequested(true);
AssertMsg(pSeamlessModeAction->isChecked(), ("Seamless action should not be triggered before us!\n"));
}
}
{
/* Do not process if window(s) missed! */
if (!isMachineWindowsCreated())
return;
/* Toggle guest-autoresize feature for all view(s)! */
}
void UIMachineLogic::sltAdjustWindow()
{
/* Do not process if window(s) missed! */
if (!isMachineWindowsCreated())
return;
/* Adjust all window(s)! */
{
/* Exit maximized window state if actual: */
/* Normalize view's geometry: */
}
}
{
/* Do not process if window(s) missed! */
if (!isMachineWindowsCreated())
return;
}
void UIMachineLogic::sltTypeCAD()
{
}
#ifdef Q_WS_X11
void UIMachineLogic::sltTypeCABS()
{
}
#endif
void UIMachineLogic::sltTakeSnapshot()
{
/* Do not process if window(s) missed! */
if (!isMachineWindowsCreated())
return;
/* Remember the paused state. */
if (!fWasPaused)
{
/* Suspend the VM and ignore the close event if failed to do so.
* pause() will show the error message to the user. */
return;
}
/* Search for the max available filter index. */
int iMaxSnapshotIndex = searchMaxSnapshotIndex(machine, machine.GetSnapshot(QString()), strNameTemplate);
{
CProgress progress = console.TakeSnapshot(dlg.mLeName->text().trimmed(), dlg.mTeDescription->toPlainText());
{
/* Show the "Taking Snapshot" progress dialog */
if (progress.GetResultCode() != 0)
}
else
}
/* Restore the running state if needed. */
if (!fWasPaused)
{
/* Make sure machine-state-change callback is processed: */
/* Unpause VM: */
}
}
{
/* Do not process if window(s) missed! */
if (!isMachineWindowsCreated())
return;
}
void UIMachineLogic::sltReset()
{
if (vboxProblem().confirmVMReset(0))
/* TODO_NEW_CORE: On reset the additional screens didn't get a display
update. Emulate this for now until it get fixed. */
}
{
}
void UIMachineLogic::sltACPIShutdown()
{
/* Get console: */
/* Warn the user about ACPI is not available if so: */
if (!console.GetGuestEnteredACPIMode())
return vboxProblem().cannotSendACPIToMachine();
/* Send ACPI shutdown signal, warn if failed: */
}
void UIMachineLogic::sltClose()
{
/* Do not process if window(s) missed! */
if (!isMachineWindowsCreated())
return;
/* Propose to close default machine window: */
}
void UIMachineLogic::sltPrepareStorageMenu()
{
/* Get the sender() menu: */
/* Short way to common storage menus: */
/* Determine device type: */
/* Determine medium type: */
/* Fill attachments menu: */
{
{
/* Attachment menu item: */
QMenu *pAttachmentMenu = 0;
{
attachment.GetDevice()))));
switch (controller.GetBus())
{
case KStorageBus_IDE:
case KStorageBus_SATA:
case KStorageBus_SCSI:
case KStorageBus_Floppy:
default:
break;
}
}
else pAttachmentMenu = pMenu;
/* Mount Medium actions: */
switch (mediumType)
{
case VBoxDefs::MediumType_DVD:
break;
case VBoxDefs::MediumType_Floppy:
break;
default:
break;
}
/* Mediums to be shown: */
int mediumsToBeShown = 0;
const int maxMediumsToBeShown = 5;
bool fCurrentUsed = false;
{
bool isMediumUsed = false;
{
if (otherAttachment != attachment)
{
{
isMediumUsed = true;
break;
}
}
}
if (!isMediumUsed)
{
fCurrentUsed = true;
mountMediumAction->setCheckable(true);
++ mediumsToBeShown;
if (mediumsToBeShown == maxMediumsToBeShown)
break;
}
}
/* Virtual Media Manager action: */
mediumType)));
/* Insert separator: */
/* Unmount Medium action: */
attachment.GetDevice())));
switch (mediumType)
{
case VBoxDefs::MediumType_DVD:
":/cd_unmount_dis_16px.png"));
break;
case VBoxDefs::MediumType_Floppy:
":/fd_unmount_dis_16px.png"));
break;
default:
break;
}
}
}
{
/* Empty menu item */
pEmptyMenuAction->setEnabled(false);
switch (mediumType)
{
case VBoxDefs::MediumType_DVD:
pEmptyMenuAction->setToolTip(QApplication::translate("UIMachineLogic", "No CD/DVD devices attached to that VM"));
break;
case VBoxDefs::MediumType_Floppy:
pEmptyMenuAction->setToolTip(QApplication::translate("UIMachineLogic", "No floppy devices attached to that VM"));
break;
default:
break;
}
}
}
void UIMachineLogic::sltMountStorageMedium()
{
/* Get sender action: */
/* Get current machine: */
/* Get mount-target: */
/* Current mount-target attributes: */
CMediumAttachment currentAttachment = machine.GetMediumAttachment(target.name, target.port, target.device);
/* New mount-target attributes: */
/* Open Virtual Media Manager to select image id: */
{
/* Search for already used images: */
{
}
/* Open VMM Dialog: */
dlg.setup(target.type, true /* select? */, true /* refresh? */, machine, currentId, true, usedImages);
else return;
}
/* Use medium which was sent: */
bool fWasMounted = false;
fWasMounted = true;
else
{
/* Ask for force remounting: */
if (vboxProblem().cannotRemountMedium(0, machine, vboxGlobal().findMedium (fMount ? newId : currentId), fMount, true /* retry? */) == QIMessageBox::Ok)
{
fWasMounted = true;
else
vboxProblem().cannotRemountMedium(0, machine, vboxGlobal().findMedium (fMount ? newId : currentId), fMount, false /* retry? */);
}
}
/* Save medium mounted at runtime */
{
}
}
void UIMachineLogic::sltPrepareUSBMenu()
{
/* Get the sender() menu: */
#ifdef RT_STRICT
#endif
/* Get HOST: */
/* Get USB devices list: */
/* Fill USB devices menu: */
if (fIsUSBListEmpty)
{
/* Fill USB devices menu: */
pEmptyMenuAction->setEnabled(false);
pEmptyMenuAction->setToolTip(QApplication::translate("UIMachineLogic", "No supported devices connected to the host PC"));
}
else
{
{
/* Get common USB device: */
/* Create USB device action: */
attachUSBAction->setCheckable(true);
/* Check if that USB device was alread attached to this session: */
/* Set USB attach data: */
attachUSBAction->setData(QVariant::fromValue(USBTarget(!attachUSBAction->isChecked(), device.GetId())));
}
}
}
void UIMachineLogic::sltAttachUSBDevice()
{
/* Get sender action: */
/* Get current console: */
/* Get USB target: */
/* Attach USB device: */
{
}
else
{
}
}
{
/* Do not process if window(s) missed! */
if (!isMachineWindowsCreated())
return;
/* Show network settings dialog: */
}
{
/* Do not process if window(s) missed! */
if (!isMachineWindowsCreated())
return;
/* Show shared folders settings dialog: */
if (!uisession()->isGuestAdditionsActive())
}
{
/* Enable VRDP server if possible: */
}
{
/* Do not process if window(s) missed! */
if (!isMachineWindowsCreated())
return;
char strAppPrivPath[RTPATH_MAX];
/* Check the standard image locations */
/* Check for the already registered image */
{
/* Compare the name part ignoring the file case */
}
/* Download the required image */
int result = vboxProblem().cannotFindGuestAdditions(QDir::toNativeSeparators(strSrc1), QDir::toNativeSeparators(strSrc2));
{
QString source = QString("http://download.virtualbox.org/virtualbox/%1/").arg(vbox.GetVersion().remove("_OSE")) + name;
/* Configure the additions downloader. */
/* After the download is finished the user may like to install the
* additions.*/
/* Some of the modes may show additional info of the download progress: */
/* Start the download: */
pDl->startDownload();
}
}
#ifdef VBOX_WITH_DEBUGGER_GUI
void UIMachineLogic::sltPrepareDebugMenu()
{
/* The "Logging" item. */
bool fEnabled = false;
bool fChecked = false;
{
{
fEnabled = true;
}
}
}
void UIMachineLogic::sltShowDebugStatistics()
{
if (dbgCreated())
}
{
if (dbgCreated())
}
{
{
}
}
#endif
#ifdef Q_WS_MAC
{
{
bool fEnabled = true;
fEnabled = false;
}
}
{
{
}
}
{
if (isMachineWindowsCreated())
{
{
m_DockIconPreviewMonitor = qMin(machine.GetExtraData(VBoxDefs::GUI_RealtimeDockIconUpdateMonitor).toInt(), (int)machine.GetMonitorCount() - 1);
}
/* Resize the dock icon in the case the preview monitor has changed. */
}
}
#endif /* Q_WS_MAC */
const QString &strNameTemplate)
{
int iMaxIndex = 0;
{
/* Check the current snapshot name */
if (iPos != -1)
/* Traversing all the snapshot children */
{
}
}
return iMaxIndex;
}
#ifdef VBOX_WITH_DEBUGGER_GUI
bool UIMachineLogic::dbgCreated()
{
if (m_pDbgGui)
return true;
if (hLdrMod == NIL_RTLDRMOD)
return false;
if (RT_SUCCESS(rc))
{
if (RT_SUCCESS(rc))
{
{
return true;
}
LogRel(("DBGGuiCreate failed, incompatible versions (loaded %#x/%#x, expected %#x)\n",
}
else
}
else
m_pDbgGui = 0;
m_pDbgGuiVT = 0;
return false;
}
void UIMachineLogic::dbgDestroy()
{
if (m_pDbgGui)
{
m_pDbgGui = 0;
m_pDbgGuiVT = 0;
}
}
void UIMachineLogic::dbgAdjustRelativePos()
{
if (m_pDbgGui)
{
}
}
#endif
#include "UIMachineLogic.moc"