Ticket #8883: mousepad-like-options.diff

File mousepad-like-options.diff, 15.9 KB (added by SF/xanathar, 12 years ago)

Patch for files under backends/platform/ds/arm9/source/

  • backends/platform/ds/arm9/source/dsmain.cpp

     
    197197int touchScX, touchScY, touchX, touchY;
    198198int mouseHotspotX, mouseHotspotY;
    199199bool cursorEnable = false;
    200 bool mouseCursorVisible = true;
     200bool mouseCursorVisibleMain = true;
     201bool mouseCursorVisibleAux = true;
     202bool forceHoverMode = false;
    201203bool rightButtonDown = false;
    202204
    203205// Dragging
     
    213215int gameHeight = 200;
    214216
    215217// Scale
    216 bool twoHundredPercentFixedScale = false;
     218scaleSize fixedScaleSize = SCALESIZE_DYNAMIC;
    217219bool cpuScalerEnable = false;
    218220#define NUM_SUPPORTED_GAMES 20
    219221
     
    286288void triggerIcon(int imageNum);
    287289void setIcon(int num, int x, int y, int imageNum, int flags, bool enable);
    288290void setIconMain(int num, int x, int y, int imageNum, int flags, bool enable);
     291void setIconAux(int num, int x, int y, int imageNum, int flags, bool enable);
    289292void uploadSpriteGfx();
    290293
    291294TransferSound soundControl;
     
    481484        touchYOffset = y;
    482485}
    483486
    484 void set200PercentFixedScale(bool on) {
    485         twoHundredPercentFixedScale = on;
     487void setForcedHoverMode(bool fhm)
     488{
     489        forceHoverMode = fhm;
     490}
     491
     492void setScaleSize(scaleSize size) {
     493        fixedScaleSize = size;
    486494}
    487495
    488496void setUnscaledMode(bool enable) {
     
    637645        {
    638646                if (cursorEnable) {
    639647                        sprites[1].attribute[0] = ATTR0_BMP | 150;
     648                        spritesMain[1].attribute[0] = ATTR0_BMP | 150;
    640649                } else {
    641650                        sprites[1].attribute[0] = ATTR0_DISABLED;
     651                        spritesMain[1].attribute[0] = ATTR0_DISABLED;
    642652                }
    643653
    644654        }
     
    646656        cursorEnable = enable;
    647657}
    648658
    649 void setMouseCursorVisible(bool enable)
     659void setMouseCursorVisibleMain(bool enable)
     660{
     661        mouseCursorVisibleMain = enable;
     662}
     663
     664void setMouseCursorVisibleAux(bool enable)
    650665{
    651         mouseCursorVisible = enable;
     666        mouseCursorVisibleAux = enable;
    652667}
    653668
    654669void setCursorIcon(const u8* icon, uint w, uint h, byte keycolor, int hotspotX, int hotspotY) {
     
    730745                sprites[1].attribute[0] = ATTR0_BMP | 150;
    731746                sprites[1].attribute[1] = ATTR1_SIZE_64 | pos;
    732747                sprites[1].attribute[2] = ATTR2_ALPHA(1) | 176;
     748                spritesMain[1].attribute[0] = ATTR0_BMP | 150;
     749                spritesMain[1].attribute[1] = ATTR1_SIZE_64 | pos;
     750                spritesMain[1].attribute[2] = ATTR2_ALPHA(1) | 176;
    733751        } else {
    734752                sprites[1].attribute[0] = ATTR0_DISABLED | 150;
    735753                sprites[1].attribute[1] = ATTR1_SIZE_64 | pos;
    736754                sprites[1].attribute[2] = ATTR2_ALPHA(1) | 176;
     755                spritesMain[1].attribute[0] = ATTR0_DISABLED | 150;
     756                spritesMain[1].attribute[1] = ATTR1_SIZE_64 | pos;
     757                spritesMain[1].attribute[2] = ATTR2_ALPHA(1) | 176;
    737758        }
    738759}
    739760
     
    12951316       
    12961317                                if (!getPenHeld() || (mouseMode != MOUSE_HOVER)) {
    12971318                                        if (getKeysDown() & KEY_LEFT) {
    1298                                                 mouseMode = MOUSE_LEFT;
     1319                                                mouseMode = forceHoverMode ? MOUSE_HOVER : MOUSE_LEFT;
    12991320                                        }
    13001321
    13011322                                        if (rightButtonDown)
     
    13101331
    13111332                                        if (getKeysDown() & KEY_RIGHT) {
    13121333                                                if ((currentGame->control != CONT_SCUMM_SAMNMAX) && (currentGame->control != CONT_FUTURE_WARS) && (currentGame->control != CONT_GOBLINS)) {
    1313                                                         mouseMode = MOUSE_RIGHT;
     1334                                                        mouseMode = forceHoverMode ? MOUSE_HOVER : MOUSE_RIGHT;
    13141335                                                } else {
    13151336                                                        // If we're playing sam and max, click and release the right mouse
    13161337                                                        // button to change verb
     
    15491570        sprites[num].attribute[2] = ATTR2_ALPHA(1)| (imageNum * 16);
    15501571}
    15511572
     1573void setIconAux(int num, int x, int y, int imageNum, int flags, bool enable) {
     1574        sprites[num].attribute[0] = ATTR0_BMP | (y & 0xFF) | (!enable? ATTR0_DISABLED: 0);
     1575        sprites[num].attribute[1] = ATTR1_SIZE_32 | (x & 0x1FF) | flags;
     1576        sprites[num].attribute[2] = ATTR2_ALPHA(1)| (imageNum * 16);
     1577}
     1578
    15521579void setIconMain(int num, int x, int y, int imageNum, int flags, bool enable) {
    15531580        spritesMain[num].attribute[0] = ATTR0_BMP | (y & 0xFF) | (!enable? ATTR0_DISABLED: 0);
    15541581        spritesMain[num].attribute[1] = ATTR1_SIZE_32 | (x & 0x1FF) | flags;
     
    15791606                        }
    15801607                }
    15811608       
    1582                 setIcon(0, 208, 150, offs, 0, true);
     1609                if (!forceHoverMode)
     1610                {
     1611                        setIcon(0, 208, 150, offs, 0, true);
     1612                }
     1613                else
     1614                {
     1615                        setIcon(0, 0, 0, 0, 0, false);
     1616                }
    15831617       
    15841618                if (indyFightState) {
    15851619                        setIcon(1, (190 - 32), 150, 3, (indyFightRight? 0: ATTR1_FLIP_X), true);
     
    15991633                setIcon(0, 0, 0, 0, 0, false);
    16001634                setIcon(1, 0, 0, 0, 0, false);
    16011635                setIcon(2, 0, 0, 0, 0, false);
    1602                 setIcon(3, 0, 0, 0, 0, false);
    16031636                setIcon(4, 0, 0, 0, 0, false);
    16041637        }
    16051638
     
    17191752void VBlankHandler(void) __attribute__ ((no_instrument_function));
    17201753#endif
    17211754
     1755bool getMouseCoords(bool auxscreen, int& X, int& Y)
     1756{
     1757        if (auxscreen && gameScreenSwap)
     1758        {
     1759                if (isCpuScalerEnabled())
     1760                {
     1761                        X = (getPenX() << 8) / 320;
     1762                        Y = getPenY();
     1763                        return Y <= 192;
     1764                }
     1765                else
     1766                {
     1767                        return false;
     1768                }
     1769        }
     1770        else if (auxscreen)
     1771        {
     1772                X = getPenX();
     1773                Y = getPenY();
     1774                int ssX = subScTargetX >> 8;
     1775                int ssY = subScTargetY >> 8;
     1776
     1777                if ((ssX <= X)&&(ssY <= Y)&&(X <= ssX + subScreenWidth)&&(Y <= ssY + subScreenHeight))
     1778                {
     1779                        X = (((X - ssX)*256) / subScreenWidth) - mouseHotspotX;
     1780                        Y = (((Y - ssY)*192) / subScreenHeight) - mouseHotspotY;
     1781                        return true;
     1782                }               
     1783                else
     1784                {
     1785                        return false;
     1786                }
     1787        }
     1788        else
     1789        {
     1790                X = storedMouseX - mouseHotspotX;
     1791                Y = storedMouseY - mouseHotspotY;
     1792                return true;
     1793        }
     1794}
     1795
     1796
    17221797void VBlankHandler(void) {
    17231798//      BG_PALETTE[0] = RGB15(31, 31, 31);
    17241799//      if (*((int *) (0x023FFF00)) != 0xBEEFCAFE) {
     
    17641839
    17651840        frameCount++;
    17661841       
    1767         if ((cursorEnable) && (mouseCursorVisible))
     1842        int X, Y;
     1843       
     1844        if ((cursorEnable) && (mouseCursorVisibleMain))
    17681845        {
    17691846                if (!keyboardEnable) {
    17701847                        storedMouseX = penX;
    17711848                        storedMouseY = penY;
    17721849                }
    1773 
    1774                 setIconMain(3, storedMouseX - mouseHotspotX, storedMouseY - mouseHotspotY, 8, 0, true);
     1850               
     1851                if (getMouseCoords(false, X, Y))
     1852                {
     1853                        setIconMain(3, X, Y, 8, 0, true);
     1854                }
     1855                else
     1856                {
     1857                        setIconMain(3, 0, 0, 0, 0, false);
     1858                }
    17751859        }
    17761860        else
    17771861        {
    17781862                setIconMain(3, 0, 0, 0, 0, false);
    17791863        }
     1864       
     1865        if ((cursorEnable) && (mouseCursorVisibleAux))
     1866        {
     1867                if (!keyboardEnable) {
     1868                        storedMouseX = penX;
     1869                        storedMouseY = penY;
     1870                }
     1871               
     1872                if (getMouseCoords(true, X, Y))
     1873                {
     1874                        setIconAux(3, X, Y, 8, 0, true);
     1875                }
     1876                else
     1877                {
     1878                        setIconAux(3, 0, 0, 0, 0, false);
     1879                }
     1880        }
     1881        else
     1882        {
     1883                setIconAux(3, 0, 0, 0, 0, false);
     1884        }
    17801885
    17811886
    17821887        if (callback) {
     
    18541959        int yCenter = subScTargetY + ((subScreenHeight >> 1) << 8);
    18551960
    18561961       
    1857         if (twoHundredPercentFixedScale) {
     1962        if (fixedScaleSize == SCALESIZE_FIXED100) {
     1963                subScreenWidth = 256;
     1964                subScreenHeight = 192;
     1965        } else if (fixedScaleSize == SCALESIZE_FIXED200) {
    18581966                subScreenWidth = 256 >> 1;
    18591967                subScreenHeight = 192 >> 1;
    18601968        } else {
     
    21872295        // This is a bodge to get around the fact that the cursor is turned on before it's image is set
    21882296        // during startup in Sam & Max.  This bodge moves the cursor offscreen so it is not seen.
    21892297        sprites[1].attribute[1] = ATTR1_SIZE_64 | 192;
     2298        spritesMain[1].attribute[1] = ATTR1_SIZE_64 | 192;
    21902299
    21912300}
    21922301
     
    26412750       
    26422751
    26432752        lastEventFrame = 0;
    2644         mouseMode = MOUSE_LEFT;
     2753        mouseMode = MOUSE_HOVER;
    26452754       
    26462755
    26472756/*
     
    26922801        consolePrintf("The Legend of Kyrandia (KYRA)\n");
    26932802        consolePrintf("-------------------------------\n");
    26942803#elif defined(DS_BUILD_G)
    2695         consolePrintf("build F\n");
     2804        consolePrintf("build G\n");
    26962805        consolePrintf("Lure of the Temptress (LURE)\n");
    26972806        consolePrintf("-------------------------------\n");
    26982807#endif
  • backends/platform/ds/arm9/source/dsmain.h

     
    3030
    3131namespace DS {
    3232
     33enum scaleSize {
     34        SCALESIZE_DYNAMIC = 0, SCALESIZE_FIXED100, SCALESIZE_FIXED200, SCALESIZE_NUM_MODES
     35};
    3336
    3437enum controlType {
    3538        CONT_SCUMM_ORIGINAL,
     
    8083
    8184void    setTalkPos(int x, int y);
    8285void    setTopScreenTarget(int x, int y);
    83 void    set200PercentFixedScale(bool on);
     86void    setScaleSize(scaleSize size);
    8487
    8588// Timers
    8689void    setTimerCallback(OSystem_DS::TimerProc proc, int interval);             // Setup a callback function at a regular interval
     
    102105void    setGameID(int id);
    103106void    setCursorIcon(const u8* icon, uint w, uint h, byte keycolor, int hotspotX, int hotspotY);
    104107void    setShowCursor(bool enable);
    105 void    setMouseCursorVisible(bool visible);
     108
     109
     110// options
     111void    setMouseCursorVisibleMain(bool visible);
     112void    setMouseCursorVisibleAux(bool visible);
     113void    setForcedHoverMode(bool fhm);
    106114
    107115// Shake
    108116void    setShakePos(int shakePos);
  • backends/platform/ds/arm9/source/dsoptions.cpp

     
    5454
    5555        new GUI::StaticTextWidget(this, 90, 10, 130, 15, "ScummVM DS Options", GUI::kTextAlignCenter);
    5656
    57         _leftHandedCheckbox = new GUI::CheckboxWidget(this, 5, 70, 130, 20, "Left handed mode", 0, 'L');
     57        _leftHandedCheckbox = new GUI::CheckboxWidget(this, 5, 85, 130, 20, "Left handed mode", 0, 'L');
    5858        _indyFightCheckbox = new GUI::CheckboxWidget(this, 5, 40, 200, 20, "Indy fighting controls", 0, 'I');
    59         _twoHundredPercentCheckbox = new GUI::CheckboxWidget(this, 5, 55, 230, 20, "Zoomed screen at fixed 200% zoom", 0, 'T');
     59
     60        _dynamicZoomCheckbox = new GUI::CheckboxWidget(this, 5, 55, 100, 20, "Dynamic Zoom", 0x20000003, 'T');
     61        _oneHundredPercentCheckbox = new GUI::CheckboxWidget(this, 105, 55, 90, 20, "Zoom 100%", 0x20000001, 'T');
     62        _twoHundredPercentCheckbox = new GUI::CheckboxWidget(this, 195, 55, 90, 20, "Zoom 200%", 0x20000002, 'T');
     63
    6064        _highQualityAudioCheckbox = new GUI::CheckboxWidget(this, 5, 25, 250, 20, "High quality audio (slower) (reboot)", 0, 'T');
    61         _disablePowerOff = new GUI::CheckboxWidget(this, 5, 85, 130, 20, "Disable power off", 0, 'T');
    62         _showCursorCheckbox = new GUI::CheckboxWidget(this, 5, 100, 130, 20, "Show mouse cursor", 0, 'T');
     65        _disablePowerOff = new GUI::CheckboxWidget(this, 5, 100, 130, 20, "Disable power off", 0, 'T');
     66        _showCursorMainCheckbox = new GUI::CheckboxWidget(this, 5, 130, 130, 20, "Show mouse cursor", 0, 'T');
     67        _showCursorAuxCheckbox = new GUI::CheckboxWidget(this, 140, 130, 170, 20, "Show mouse cursor (aux)", 0, 'T');
     68        _forceHoverMouseCheckbox = new GUI::CheckboxWidget(this, 5, 70, 130, 20, "Force hover mode", 0, 'T');
    6369
    6470//#ifdef ALLOW_CPU_SCALER
    6571//      _cpuScaler = new GUI::CheckboxWidget(this, 160, 115, 90, 20, "CPU scaler", 0, 'T');
     
    107113#endif
    108114        }
    109115
    110         if (ConfMan.hasKey("showcursor", "ds")) {
    111                 _showCursorCheckbox->setState(ConfMan.getBool("showcursor", "ds"));
     116        if (ConfMan.hasKey("showcursorMain", "ds")) {
     117                _showCursorMainCheckbox->setState(ConfMan.getBool("showcursorMain", "ds"));
     118        } else {
     119                _showCursorMainCheckbox->setState(true);
     120        }
     121
     122        if (ConfMan.hasKey("showcursorAux", "ds")) {
     123                _showCursorAuxCheckbox->setState(ConfMan.getBool("showcursorAux", "ds"));
    112124        } else {
    113                 _showCursorCheckbox->setState(true);
     125                _showCursorAuxCheckbox->setState(true);
     126        }
     127
     128        if (ConfMan.hasKey("forceHover", "ds")) {
     129                _forceHoverMouseCheckbox->setState(ConfMan.getBool("forceHover", "ds"));
     130        } else {
     131                _forceHoverMouseCheckbox->setState(false);
    114132        }
    115133
    116134        if (ConfMan.hasKey("lefthanded", "ds")) {
     
    125143                _unscaledCheckbox->setState(false);
    126144        }
    127145
    128         if (ConfMan.hasKey("twohundredpercent", "ds")) {
    129                 _twoHundredPercentCheckbox->setState(ConfMan.getBool("twohundredpercent", "ds"));
     146        if (ConfMan.hasKey("scalesize", "ds")) {
     147                int scalesize = ConfMan.getInt("scalesize", "ds");
     148                _twoHundredPercentCheckbox->setState(scalesize == (int)SCALESIZE_FIXED200);
     149                _oneHundredPercentCheckbox->setState(scalesize == (int)SCALESIZE_FIXED100);
     150                _dynamicZoomCheckbox->setState((scalesize != (int)SCALESIZE_FIXED100)&&(scalesize != (int)SCALESIZE_FIXED200));
    130151        } else {
    131152                _twoHundredPercentCheckbox->setState(false);
     153                _oneHundredPercentCheckbox->setState(false);
     154                _dynamicZoomCheckbox->setState(true);
    132155        }
    133156
    134157        if (ConfMan.hasKey("22khzaudio", "ds")) {
     
    180203void DSOptionsDialog::updateConfigManager() {
    181204        ConfMan.setBool("lefthanded", _leftHandedCheckbox->getState(), "ds");
    182205        ConfMan.setBool("unscaled", _unscaledCheckbox->getState(), "ds");
    183         ConfMan.setBool("twohundredpercent", _twoHundredPercentCheckbox->getState(), "ds");
     206
     207        if (_twoHundredPercentCheckbox->getState()) {
     208                ConfMan.setInt("scalesize", (int)SCALESIZE_FIXED200, "ds");
     209        } else if (_oneHundredPercentCheckbox->getState()) {
     210                ConfMan.setInt("scalesize", (int)SCALESIZE_FIXED100, "ds");
     211        } else {
     212                ConfMan.setInt("scalesize", (int)SCALESIZE_DYNAMIC, "ds");
     213        }
     214
    184215        ConfMan.setBool("22khzaudio", _highQualityAudioCheckbox->getState(), "ds");
    185216        ConfMan.setBool("disablepoweroff", _disablePowerOff->getState(), "ds");
    186217#ifdef ALLOW_CPU_SCALER
     
    188219#endif
    189220        ConfMan.setInt("xoffset", _touchX->getValue(), "ds");
    190221        ConfMan.setInt("yoffset", _touchY->getValue(), "ds");
    191         ConfMan.setBool("showcursor", _showCursorCheckbox->getState(), "ds");
     222        ConfMan.setBool("showcursorMain", _showCursorMainCheckbox->getState(), "ds");
     223        ConfMan.setBool("showcursorAux", _showCursorAuxCheckbox->getState(), "ds");
     224        ConfMan.setBool("forceHover", _forceHoverMouseCheckbox->getState(), "ds");
    192225        ConfMan.setBool("snaptoborder", _snapToBorderCheckbox->getState(), "ds");
    193226        DS::setOptions();
    194227}
     
    222255                                _unscaledCheckbox->setState(true);
    223256                        }
    224257                }
     258                else if ((cmd & 0xFF000000) == 0x20000000)
     259                {
     260                        _dynamicZoomCheckbox->setState((sender == _dynamicZoomCheckbox) && (cmd == 0x20000003));
     261                        _oneHundredPercentCheckbox->setState((sender == _oneHundredPercentCheckbox) && (cmd == 0x20000001));
     262                        _twoHundredPercentCheckbox->setState((sender == _twoHundredPercentCheckbox) && (cmd == 0x20000002));
     263                }
    225264
    226265                guard = false;
    227266
     
    305344                DS::setLeftHanded(false);
    306345        }
    307346
    308         if (ConfMan.hasKey("showcursor", "ds")) {
    309                 DS::setMouseCursorVisible(ConfMan.getBool("showcursor", "ds"));
     347        if (ConfMan.hasKey("showcursorMain", "ds")) {
     348                DS::setMouseCursorVisibleMain(ConfMan.getBool("showcursorMain", "ds"));
     349        } else {
     350                DS::setMouseCursorVisibleMain(true);
     351        }
     352
     353        if (ConfMan.hasKey("showcursorAux", "ds")) {
     354                DS::setMouseCursorVisibleAux(ConfMan.getBool("showcursorAux", "ds"));
    310355        } else {
    311                 DS::setMouseCursorVisible(true);
     356                DS::setMouseCursorVisibleAux(true);
    312357        }
    313358
     359        if (ConfMan.hasKey("forceHover", "ds")) {
     360                DS::setForcedHoverMode(ConfMan.getBool("forceHover", "ds"));
     361        } else {
     362                DS::setForcedHoverMode(false);
     363        }
     364       
    314365        if (ConfMan.hasKey("snaptoborder", "ds")) {
    315366                DS::setSnapToBorder(ConfMan.getBool("snaptoborder", "ds"));
    316367        } else {
     
    327378                DS::setUnscaledMode(false);
    328379        }
    329380
    330         if (ConfMan.hasKey("twohundredpercent", "ds")) {
    331                 DS::set200PercentFixedScale(ConfMan.getBool("twohundredpercent", "ds"));
     381        if (ConfMan.hasKey("scalesize", "ds")) {
     382                DS::setScaleSize((scaleSize)ConfMan.getInt("scalesize", "ds"));
    332383        } else {
    333                 DS::set200PercentFixedScale(false);
     384                DS::setScaleSize(SCALESIZE_DYNAMIC);
    334385        }
    335386
    336387        if (ConfMan.hasKey("xoffset", "ds")) {
  • backends/platform/ds/arm9/source/dsoptions.h

     
    5050        GUI::CheckboxWidget* _leftHandedCheckbox;
    5151        GUI::CheckboxWidget* _unscaledCheckbox;
    5252        GUI::CheckboxWidget* _twoHundredPercentCheckbox;
     53        GUI::CheckboxWidget* _oneHundredPercentCheckbox;
     54        GUI::CheckboxWidget* _dynamicZoomCheckbox;
    5355        GUI::CheckboxWidget* _indyFightCheckbox;
    5456        GUI::CheckboxWidget* _highQualityAudioCheckbox;
    5557        GUI::CheckboxWidget* _disablePowerOff;
    56         GUI::CheckboxWidget* _showCursorCheckbox;
     58        GUI::CheckboxWidget* _showCursorMainCheckbox;
     59        GUI::CheckboxWidget* _showCursorAuxCheckbox;
     60        GUI::CheckboxWidget* _forceHoverMouseCheckbox;
    5761        GUI::CheckboxWidget* _snapToBorderCheckbox;
    5862
    5963        GUI::CheckboxWidget* _hardScaler;