]> Shamusworld >> Repos - virtualjaguar/blobdiff - src/gui/mainwin.cpp
Virtual Jaguar 2.0.0 release.
[virtualjaguar] / src / gui / mainwin.cpp
index 5794f2b0552ade2945e7b337f5dfe2e8b6351b84..aab146c0e479f4dcf537febca9ba5f57114d52c5 100644 (file)
 // - Add dbl click/enter to select in cart list, ESC to dimiss [DONE]
 // - Autoscan/autoload all available BIOS from 'software' folder [DONE]
 // - Add 1 key jumping in cartridge list (press 'R', jumps to carts starting with 'R', etc) [DONE]
+// - Controller configuration [DONE]
 //
 // STILL TO BE DONE:
 //
-// - Controller configuration
 // - Remove SDL dependencies (sound, mainly) from Jaguar core lib
 // - Fix inconsistency with trailing slashes in paths (eeproms needs one, software doesn't)
 //
+// SFDX CODE: 9XF9TUHFM2359
 
 // Uncomment this for debugging...
 //#define DEBUG
@@ -35,6 +36,7 @@
 #include "SDL.h"
 #include "glwidget.h"
 #include "about.h"
+#include "help.h"
 #include "settings.h"
 #include "filepicker.h"
 #include "configdialog.h"
 #include <unistd.h>
 #endif
 
-// Uncomment this to use built-in BIOS/CD-ROM BIOS
-// You'll need a copy of jagboot.h & jagcd.h for this to work...!
-// Creating those is left as an exercise for the reader. ;-)
-//#define USE_BUILT_IN_BIOS
-
-//#ifdef USE_BUILT_IN_BIOS
-//#include "jagboot.h"
-//#include "jagcd.h"
-//#endif
-
 // The way BSNES controls things is by setting a timer with a zero
 // timeout, sleeping if not emulating anything. Seems there has to be a
 // better way.
 // We'll make the VJ core modular so that it doesn't matter what GUI is in
 // use, we can drop it in anywhere and use it as-is.
 
-MainWin::MainWin(): running(false), powerButtonOn(false), showUntunedTankCircuit(true),
+MainWin::MainWin(): running(true), powerButtonOn(false), showUntunedTankCircuit(true),
        cartridgeLoaded(false), CDActive(false),//, alpineLoadSuccessful(false),
        pauseForFileSelector(false)
 {
        videoWidget = new GLWidget(this);
        setCentralWidget(videoWidget);
        setWindowIcon(QIcon(":/res/vj-icon.png"));
-//     setWindowTitle("Virtual Jaguar v2.0.0");
 
        QString title = QString(tr("Virtual Jaguar " VJ_RELEASE_VERSION ));
 
@@ -95,6 +86,7 @@ MainWin::MainWin(): running(false), powerButtonOn(false), showUntunedTankCircuit
        setWindowTitle(title);
 
        aboutWin = new AboutWindow(this);
+       helpWin = new HelpWindow(this);
        filePickWin = new FilePickerWindow(this);
 
     videoWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
@@ -113,7 +105,7 @@ MainWin::MainWin(): running(false), powerButtonOn(false), showUntunedTankCircuit
        powerAct->setStatusTip(tr("Powers Jaguar on/off"));
        powerAct->setCheckable(true);
        powerAct->setChecked(false);
-       powerAct->setDisabled(true);
+//     powerAct->setDisabled(true);
        connect(powerAct, SIGNAL(triggered()), this, SLOT(TogglePowerState()));
 
        pauseAct = new QAction(QIcon(":/res/pause.png"), tr("Pause"), this);
@@ -161,6 +153,10 @@ MainWin::MainWin(): running(false), powerButtonOn(false), showUntunedTankCircuit
        aboutAct->setStatusTip(tr("Blatant self-promotion"));
        connect(aboutAct, SIGNAL(triggered()), this, SLOT(ShowAboutWin()));
 
+       helpAct = new QAction(QIcon(":/res/vj-icon.png"), tr("&Contents..."), this);
+       helpAct->setStatusTip(tr("Help is available, if you should need it"));
+       connect(helpAct, SIGNAL(triggered()), this, SLOT(ShowHelpWin()));
+
        filePickAct = new QAction(QIcon(":/res/software.png"), tr("&Insert Cartridge..."), this);
        filePickAct->setStatusTip(tr("Insert a cartridge into Virtual Jaguar"));
        filePickAct->setShortcut(QKeySequence(tr("Ctrl+i")));
@@ -192,6 +188,7 @@ MainWin::MainWin(): running(false), powerButtonOn(false), showUntunedTankCircuit
        fileMenu->addAction(quitAppAct);
 
        helpMenu = menuBar()->addMenu(tr("&Help"));
+       helpMenu->addAction(helpAct);
        helpMenu->addAction(aboutAct);
 
        toolbar = addToolBar(tr("Stuff"));
@@ -219,7 +216,7 @@ MainWin::MainWin(): running(false), powerButtonOn(false), showUntunedTankCircuit
        x1Act->setChecked(zoomLevel == 1);
        x2Act->setChecked(zoomLevel == 2);
        x3Act->setChecked(zoomLevel == 3);
-       running = powerAct->isChecked();
+//     running = powerAct->isChecked();
        ntscAct->setChecked(vjs.hardwareTypeNTSC);
        palAct->setChecked(!vjs.hardwareTypeNTSC);
 
@@ -231,29 +228,13 @@ MainWin::MainWin(): running(false), powerButtonOn(false), showUntunedTankCircuit
        connect(timer, SIGNAL(timeout()), this, SLOT(Timer()));
        timer->start(20);
 
+       // We set this initially, to make VJ behave somewhat as it would if no
+       // cart were inserted and the BIOS was set as active...
+       jaguarCartInserted = true;
        WriteLog("Virtual Jaguar %s (Last full build was on %s %s)\n", VJ_RELEASE_VERSION, __DATE__, __TIME__);
        WriteLog("VJ: Initializing jaguar subsystem...\n");
        JaguarInit();
 
-       // Get the BIOS ROM
-#ifdef USE_BUILT_IN_BIOS
-//     WriteLog("VJ: Using built in BIOS/CD BIOS...\n");
-//     memcpy(jaguarBootROM, jagBootROM, 0x20000);
-//     memcpy(jaguarCDBootROM, jagCDROM, 0x40000);
-////   BIOSLoaded = CDBIOSLoaded = true;
-//     biosAvailable |= (BIOS_NORMAL | BIOS_CD);
-#else
-// What would be nice here would be a way to check if the BIOS was loaded so that we
-// could disable the pushbutton on the Misc Options menu... !!! FIX !!! [DONE here, but needs to be fixed in GUI as well!]
-//     WriteLog("VJ: About to attempt to load BIOSes...\n");
-//This is short-circuiting the file finding thread... ??? WHY ???
-//Not anymore. Was related to a QImage object creation/corruption bug elsewhere.
-//     BIOSLoaded = (JaguarLoadROM(jaguarBootROM, vjs.jagBootPath) == 0x20000 ? true : false);
-//     WriteLog("VJ: BIOS is %savailable...\n", (BIOSLoaded ? "" : "not "));
-//     CDBIOSLoaded = (JaguarLoadROM(jaguarCDBootROM, vjs.CDBootPath) == 0x40000 ? true : false);
-//     WriteLog("VJ: CD BIOS is %savailable...\n", (CDBIOSLoaded ? "" : "not "));
-#endif
-
        filePickWin->ScanSoftwareFolder(allowUnknownSoftware);
 
        // Load up the default ROM if in Alpine mode:
@@ -273,6 +254,7 @@ MainWin::MainWin(): running(false), powerButtonOn(false), showUntunedTankCircuit
 
                // Attempt to load/run the ABS file...
                LoadSoftware(vjs.absROMPath);
+               memcpy(jagMemSpace + 0xE00000, jaguarDevBootROM2, 0x20000);     // Use the stub BIOS
        }
        else
                memcpy(jagMemSpace + 0xE00000, jaguarBootROM, 0x20000); // Otherwise, use the stock BIOS
@@ -287,11 +269,25 @@ void MainWin::closeEvent(QCloseEvent * event)
 
 void MainWin::keyPressEvent(QKeyEvent * e)
 {
+       // We ignore the Alt key for now, since it causes problems with the GUI
+       if (e->key() == Qt::Key_Alt)
+       {
+               e->accept();
+               return;
+       }
+
        HandleKeys(e, true);
 }
 
 void MainWin::keyReleaseEvent(QKeyEvent * e)
 {
+       // We ignore the Alt key for now, since it causes problems with the GUI
+       if (e->key() == Qt::Key_Alt)
+       {
+               e->accept();
+               return;
+       }
+
        HandleKeys(e, false);
 }
 
@@ -316,13 +312,29 @@ void MainWin::HandleKeys(QKeyEvent * e, bool state)
                joypad_0_buttons[BUTTON_D] = 0;
        if (e->key() == (int)vjs.p1KeyBindings[BUTTON_D] && joypad_0_buttons[BUTTON_U])
                joypad_0_buttons[BUTTON_U] = 0;
+
+       if (e->key() == (int)vjs.p2KeyBindings[BUTTON_L] && joypad_1_buttons[BUTTON_R])
+               joypad_1_buttons[BUTTON_R] = 0;
+       if (e->key() == (int)vjs.p2KeyBindings[BUTTON_R] && joypad_1_buttons[BUTTON_L])
+               joypad_1_buttons[BUTTON_L] = 0;
+       if (e->key() == (int)vjs.p2KeyBindings[BUTTON_U] && joypad_1_buttons[BUTTON_D])
+               joypad_1_buttons[BUTTON_D] = 0;
+       if (e->key() == (int)vjs.p2KeyBindings[BUTTON_D] && joypad_1_buttons[BUTTON_U])
+               joypad_1_buttons[BUTTON_U] = 0;
 #endif
 
        // No bad combos exist, let's stuff the emulator key buffers...!
        for(int i=BUTTON_FIRST; i<=BUTTON_LAST; i++)
        {
                if (e->key() == (int)vjs.p1KeyBindings[i])
-                       joypad_0_buttons[i] = (uint8)state;
+//                     joypad_0_buttons[i] = (uint8)state;
+                       joypad_0_buttons[i] = (state ? 0x01 : 0x00);
+
+// Pad #2 is screwing up pad #1. Prolly a problem in joystick.cpp...
+// So let's try to fix it there. :-P [DONE]
+               if (e->key() == (int)vjs.p2KeyBindings[i])
+//                     joypad_1_buttons[i] = (uint8)state;
+                       joypad_1_buttons[i] = (state ? 0x01 : 0x00);
        }
 }
 
@@ -412,8 +424,8 @@ void MainWin::Timer(void)
                {
                        for(uint32_t y=0; y<videoWidget->rasterHeight; y++)
                        {
-                               videoWidget->buffer[(y * videoWidget->textureWidth) + x] = (rand() & 0xFF) << 8 | (rand() & 0xFF) << 16 | (rand() & 0xFF) << 24;// | (rand() & 0xFF);//0x000000FF;
-       //                      buffer[(y * textureWidth) + x] = x*y;
+                               videoWidget->buffer[(y * videoWidget->textureWidth) + x]
+                                       = (rand() & 0xFF) << 8 | (rand() & 0xFF) << 16 | (rand() & 0xFF) << 24;
                        }
                }
        }
@@ -421,9 +433,6 @@ void MainWin::Timer(void)
        {
                // Otherwise, run the Jaguar simulation
                JaguarExecuteNew();
-//             memcpy(videoWidget->buffer, backbuffer, videoWidget->rasterHeight * videoWidget->rasterWidth);
-               memcpy(videoWidget->buffer, backbuffer, videoWidget->rasterHeight * videoWidget->textureWidth * sizeof(uint32_t));
-//             memcpy(surface->pixels, backbuffer, TOMGetVideoModeWidth() * TOMGetVideoModeHeight() * 4);
        }
 
        videoWidget->updateGL();
@@ -432,47 +441,40 @@ void MainWin::Timer(void)
 void MainWin::TogglePowerState(void)
 {
        powerButtonOn = !powerButtonOn;
+       running = true;
 
        // With the power off, we simulate white noise on the screen. :-)
        if (!powerButtonOn)
        {
+               useCDAct->setDisabled(false);
                pauseAct->setChecked(false);
                pauseAct->setDisabled(true);
                showUntunedTankCircuit = true;
-               running = true;
                // This is just in case the ROM we were playing was in a narrow or wide field mode,
                // so the untuned tank sim doesn't look wrong. :-)
                TOMReset();
        }
        else
        {
-//NOTE: Low hanging fruit: We can simplify this a lot...
+               useCDAct->setDisabled(true);
+               pauseAct->setChecked(false);
+               pauseAct->setDisabled(false);
+               showUntunedTankCircuit = false;
+
                // Otherwise, we prepare for running regular software...
-               if (!CDActive)
-               {
-                       showUntunedTankCircuit = false;//(cartridgeLoaded ? false : true);
-                       pauseAct->setChecked(false);
-                       pauseAct->setDisabled(false);//!cartridgeLoaded);
-               }
-               // Or, set up for the Jaguar CD
-               else
+               if (CDActive)
                {
 // Should check for cartridgeLoaded here as well...!
 // We can clear it when toggling CDActive on, so that when we power cycle it does the
 // expected thing. Otherwise, if we use the file picker to insert a cart, we expect
 // to run the cart! Maybe have a RemoveCart function that only works if the CD unit
 // is active?
-                       showUntunedTankCircuit = false;
-                       pauseAct->setChecked(false);
-                       pauseAct->setDisabled(false);
-                       memcpy(jagMemSpace + 0x800000, jaguarCDBootROM, 0x40000);
                        setWindowTitle(QString("Virtual Jaguar " VJ_RELEASE_VERSION
                                " - Now playing: Jaguar CD"));
                }
 
                WriteLog("GUI: Resetting Jaguar...\n");
                JaguarReset();
-               running = true;
        }
 }
 
@@ -484,14 +486,12 @@ void MainWin::ToggleRunState(void)
        {
                for(uint32_t i=0; i<(uint32_t)(videoWidget->textureWidth * 256); i++)
                {
-                       uint32_t pixel = backbuffer[i];
+                       uint32_t pixel = videoWidget->buffer[i];
                        uint8_t r = (pixel >> 24) & 0xFF, g = (pixel >> 16) & 0xFF, b = (pixel >> 8) & 0xFF;
                        pixel = ((r + g + b) / 3) & 0x00FF;
-                       backbuffer[i] = 0x000000FF | (pixel << 16) | (pixel << 8);
+                       videoWidget->buffer[i] = 0x000000FF | (pixel << 16) | (pixel << 8);
                }
 
-               memcpy(videoWidget->buffer, backbuffer, videoWidget->rasterHeight * videoWidget->textureWidth * sizeof(uint32_t));
-
                videoWidget->updateGL();
        }
 }
@@ -536,11 +536,16 @@ void MainWin::ShowAboutWin(void)
        aboutWin->show();
 }
 
+void MainWin::ShowHelpWin(void)
+{
+       helpWin->show();
+}
+
 void MainWin::InsertCart(void)
 {
        // If the emulator is running, we pause it here and unpause it later
        // if we dismiss the file selector without choosing anything
-       if (running)
+       if (running && powerButtonOn)
        {
                ToggleRunState();
                pauseForFileSelector = true;
@@ -590,6 +595,7 @@ void MainWin::ToggleCDUsage(void)
 {
        CDActive = !CDActive;
 
+#if 0
        if (CDActive)
        {
                powerAct->setDisabled(false);
@@ -598,6 +604,13 @@ void MainWin::ToggleCDUsage(void)
        {
                powerAct->setDisabled(true);
        }
+#else
+       // Set up the Jaguar CD for execution, otherwise, clear memory
+       if (CDActive)
+               memcpy(jagMemSpace + 0x800000, jaguarCDBootROM, 0x40000);
+       else
+               memset(jagMemSpace + 0x800000, 0xFF, 0x40000);
+#endif
 }
 
 void MainWin::ResizeMainWindow(void)
@@ -623,7 +636,7 @@ void MainWin::ReadSettings(void)
        pos = settings.value("cartLoadPos", QPoint(200, 200)).toPoint();
        filePickWin->move(pos);
 
-       zoomLevel = settings.value("zoom", 1).toInt();
+       zoomLevel = settings.value("zoom", 2).toInt();
        allowUnknownSoftware = settings.value("showUnknownSoftware", false).toBool();
 
        vjs.useJoystick      = settings.value("useJoystick", false).toBool();
@@ -631,12 +644,13 @@ void MainWin::ReadSettings(void)
        vjs.hardwareTypeNTSC = settings.value("hardwareTypeNTSC", true).toBool();
        vjs.frameSkip        = settings.value("frameSkip", 0).toInt();
        vjs.useJaguarBIOS    = settings.value("useJaguarBIOS", false).toBool();
+       vjs.GPUEnabled       = settings.value("GPUEnabled", true).toBool();
        vjs.DSPEnabled       = settings.value("DSPEnabled", false).toBool();
        vjs.audioEnabled     = settings.value("audioEnabled", true).toBool();
        vjs.usePipelinedDSP  = settings.value("usePipelinedDSP", false).toBool();
        vjs.fullscreen       = settings.value("fullscreen", false).toBool();
        vjs.useOpenGL        = settings.value("useOpenGL", true).toBool();
-       vjs.glFilter         = settings.value("glFilterType", 0).toInt();
+       vjs.glFilter         = settings.value("glFilterType", 1).toInt();
        vjs.renderType       = settings.value("renderType", 0).toInt();
        vjs.allowWritesToROM = settings.value("writeROM", false).toBool();
 //     strcpy(vjs.jagBootPath, settings.value("JagBootROM", "./bios/[BIOS] Atari Jaguar (USA, Europe).zip").toString().toAscii().data());
@@ -654,15 +668,15 @@ WriteLog("AlpineROMPath = \"%s\"\n", vjs.alpineROMPath);
 WriteLog("   absROMPath = \"%s\"\n", vjs.absROMPath);
 
        // Keybindings in order of U, D, L, R, C, B, A, Op, Pa, 0-9, #, *
-       vjs.p1KeyBindings[BUTTON_U] = settings.value("p1k_up", Qt::Key_Up).toInt();
-       vjs.p1KeyBindings[BUTTON_D] = settings.value("p1k_down", Qt::Key_Down).toInt();
-       vjs.p1KeyBindings[BUTTON_L] = settings.value("p1k_left", Qt::Key_Left).toInt();
-       vjs.p1KeyBindings[BUTTON_R] = settings.value("p1k_right", Qt::Key_Right).toInt();
-       vjs.p1KeyBindings[BUTTON_C] = settings.value("p1k_c", Qt::Key_Z).toInt();
-       vjs.p1KeyBindings[BUTTON_B] = settings.value("p1k_b", Qt::Key_X).toInt();
-       vjs.p1KeyBindings[BUTTON_A] = settings.value("p1k_a", Qt::Key_C).toInt();
-       vjs.p1KeyBindings[BUTTON_OPTION] = settings.value("p1k_option", Qt::Key_Apostrophe).toInt();
-       vjs.p1KeyBindings[BUTTON_PAUSE] = settings.value("p1k_pause", Qt::Key_Return).toInt();
+       vjs.p1KeyBindings[BUTTON_U] = settings.value("p1k_up", Qt::Key_S).toInt();
+       vjs.p1KeyBindings[BUTTON_D] = settings.value("p1k_down", Qt::Key_X).toInt();
+       vjs.p1KeyBindings[BUTTON_L] = settings.value("p1k_left", Qt::Key_A).toInt();
+       vjs.p1KeyBindings[BUTTON_R] = settings.value("p1k_right", Qt::Key_D).toInt();
+       vjs.p1KeyBindings[BUTTON_C] = settings.value("p1k_c", Qt::Key_J).toInt();
+       vjs.p1KeyBindings[BUTTON_B] = settings.value("p1k_b", Qt::Key_K).toInt();
+       vjs.p1KeyBindings[BUTTON_A] = settings.value("p1k_a", Qt::Key_L).toInt();
+       vjs.p1KeyBindings[BUTTON_OPTION] = settings.value("p1k_option", Qt::Key_O).toInt();
+       vjs.p1KeyBindings[BUTTON_PAUSE] = settings.value("p1k_pause", Qt::Key_P).toInt();
        vjs.p1KeyBindings[BUTTON_0] = settings.value("p1k_0", Qt::Key_0).toInt();
        vjs.p1KeyBindings[BUTTON_1] = settings.value("p1k_1", Qt::Key_1).toInt();
        vjs.p1KeyBindings[BUTTON_2] = settings.value("p1k_2", Qt::Key_2).toInt();
@@ -673,8 +687,8 @@ WriteLog("   absROMPath = \"%s\"\n", vjs.absROMPath);
        vjs.p1KeyBindings[BUTTON_7] = settings.value("p1k_7", Qt::Key_7).toInt();
        vjs.p1KeyBindings[BUTTON_8] = settings.value("p1k_8", Qt::Key_8).toInt();
        vjs.p1KeyBindings[BUTTON_9] = settings.value("p1k_9", Qt::Key_9).toInt();
-       vjs.p1KeyBindings[BUTTON_d] = settings.value("p1k_pound", Qt::Key_Slash).toInt();
-       vjs.p1KeyBindings[BUTTON_s] = settings.value("p1k_star", Qt::Key_Asterisk).toInt();
+       vjs.p1KeyBindings[BUTTON_d] = settings.value("p1k_pound", Qt::Key_Minus).toInt();
+       vjs.p1KeyBindings[BUTTON_s] = settings.value("p1k_star", Qt::Key_Equal).toInt();
 
        vjs.p2KeyBindings[BUTTON_U] = settings.value("p2k_up", Qt::Key_Up).toInt();
        vjs.p2KeyBindings[BUTTON_D] = settings.value("p2k_down", Qt::Key_Down).toInt();
@@ -714,6 +728,7 @@ void MainWin::WriteSettings(void)
        settings.setValue("hardwareTypeNTSC", vjs.hardwareTypeNTSC);
        settings.setValue("frameSkip", vjs.frameSkip);
        settings.setValue("useJaguarBIOS", vjs.useJaguarBIOS);
+       settings.setValue("GPUEnabled", vjs.GPUEnabled);
        settings.setValue("DSPEnabled", vjs.DSPEnabled);
        settings.setValue("audioEnabled", vjs.audioEnabled);
        settings.setValue("usePipelinedDSP", vjs.usePipelinedDSP);
@@ -773,90 +788,3 @@ void MainWin::WriteSettings(void)
        settings.setValue("p2k_pound", vjs.p2KeyBindings[BUTTON_d]);
        settings.setValue("p2k_star", vjs.p2KeyBindings[BUTTON_s]);
 }
-
-// Here's how Byuu does it...
-// I think I have it working now... :-)
-#if 0
-void Utility::resizeMainWindow()
-{
-  unsigned region = config().video.context->region;
-  unsigned multiplier = config().video.context->multiplier;
-  unsigned width = 256 * multiplier;
-  unsigned height = (region == 0 ? 224 : 239) * multiplier;
-
-  if(config().video.context->correctAspectRatio)
-  {
-    if(region == 0)
-       {
-      width = (double)width * config().video.ntscAspectRatio + 0.5;  //NTSC adjust
-    }
-       else
-       {
-      width = (double)width * config().video.palAspectRatio  + 0.5;  //PAL adjust
-    }
-  }
-
-  if(config().video.isFullscreen == false)
-  {
-    //get effective desktop work area region (ignore Windows taskbar, OS X dock, etc.)
-    QRect deskRect = QApplication::desktop()->availableGeometry(mainWindow);
-
-    //ensure window size will not be larger than viewable desktop area
-    constrainSize(height, width, deskRect.height()); //- frameHeight);
-    constrainSize(width, height, deskRect.width());  //- frameWidth );
-
-    mainWindow->canvas->setFixedSize(width, height);
-    mainWindow->show();
-  }
-  else
-  {
-    for(unsigned i = 0; i < 2; i++)
-       {
-      unsigned iWidth = width, iHeight = height;
-
-      constrainSize(iHeight, iWidth, mainWindow->canvasContainer->size().height());
-      constrainSize(iWidth, iHeight, mainWindow->canvasContainer->size().width());
-
-      //center canvas onscreen; ensure it is not larger than viewable area
-      mainWindow->canvas->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
-      mainWindow->canvas->setFixedSize(iWidth, iHeight);
-      mainWindow->canvas->setMinimumSize(0, 0);
-
-      usleep(2000);
-      QApplication::processEvents();
-    }
-  }
-
-  //workaround for Qt/Xlib bug:
-  //if window resize occurs with cursor over it, Qt shows Qt::Size*DiagCursor;
-  //so force it to show Qt::ArrowCursor, as expected
-  mainWindow->setCursor(Qt::ArrowCursor);
-  mainWindow->canvasContainer->setCursor(Qt::ArrowCursor);
-  mainWindow->canvas->setCursor(Qt::ArrowCursor);
-
-  //workaround for DirectSound(?) bug:
-  //window resizing sometimes breaks audio sync, this call re-initializes it
-  updateAvSync();
-}
-
-void Utility::setScale(unsigned scale)
-{
-  config().video.context->multiplier = scale;
-  resizeMainWindow();
-  mainWindow->shrink();
-  mainWindow->syncUi();
-}
-
-void QbWindow::shrink()
-{
-  if(config().video.isFullscreen == false)
-  {
-    for(unsigned i = 0; i < 2; i++)
-       {
-      resize(0, 0);
-      usleep(2000);
-      QApplication::processEvents();
-    }
-  }
-}
-#endif