Ignore:
Timestamp:
Apr 14, 2010, 10:02:07 PM (12 years ago)
Author:
dmik
Message:

Properly save fullscreen and max view state and restore it at next startup.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Lucide/gui/lucide.cpp

    r391 r392  
    8282const char *appVersion = VERSION;
    8383const char *appDate = VERSIONDATE;
    84 const char *fwp        = "FrameWindowPos";
    85 const char *lvd        = "LastViewedDir";
    86 const char *splpos     = "SplitterPos";
    87 const char *showind    = "ShowIndex";
     84const char *prfFwp     = "FrameWindowPos";
     85const char *prfLvd     = "LastViewedDir";
     86const char *prfSplpos  = "SplitterPos";
     87const char *prfShowind = "ShowIndex";
     88const char *prfMaxView = "MaxView";
     89const char *prfFs      = "FullScreen";
    8890
    8991HWND createToolbar( HWND hwnd );
     
    175177}
    176178#endif
     179
     180
     181// stolen from xWorkplace sources
     182static
     183APIRET my_DosQueryProcAddr(PCSZ pcszModuleName, ULONG ulOrdinal, PFN *ppfn)
     184{
     185    HMODULE hmod = NULL;
     186    APIRET rc = 0;
     187    if (!(rc = DosQueryModuleHandle( (PSZ)pcszModuleName, &hmod))) {
     188        if ((rc = DosQueryProcAddr( hmod, ulOrdinal, NULL, ppfn))) {
     189            // the CP programming guide and reference says use
     190            // DosLoadModule if DosQueryProcAddr fails with this error
     191            if (rc == ERROR_INVALID_HANDLE) {
     192                if (!(rc = DosLoadModule(NULL, 0, (PSZ) pcszModuleName,
     193                                         &hmod))) {
     194                    rc = DosQueryProcAddr(hmod, ulOrdinal, NULL, ppfn);
     195                }
     196            }
     197        }
     198    }
     199    return rc;
     200}
    177201
    178202
     
    637661    fd->cbSize = sizeof( FILEDLG );
    638662    fd->fl = FDS_CENTER | FDS_OPEN_DIALOG;
    639     PrfQueryProfileString( HINI_USERPROFILE, appName, lvd, "",
     663    PrfQueryProfileString( HINI_USERPROFILE, appName, prfLvd, "",
    640664                           fd->szFullFile, sizeof( fd->szFullFile ) );
    641665    LcdFileDlg( HWND_DESKTOP, hWndFrame, fd );
     
    647671        _splitpath( fd->szFullFile, drv, dir, NULL, NULL );
    648672        _makepath( buf, drv, dir, NULL, NULL );
    649         PrfWriteProfileString( HINI_USERPROFILE, appName, lvd, buf );
     673        PrfWriteProfileString( HINI_USERPROFILE, appName, prfLvd, buf );
    650674
    651675        loadDocument( fd->szFullFile );
     
    663687    fd->cbSize = sizeof( FILEDLG );
    664688    fd->fl = FDS_CENTER | FDS_SAVEAS_DIALOG;
    665     PrfQueryProfileString( HINI_USERPROFILE, appName, lvd, "",
     689    PrfQueryProfileString( HINI_USERPROFILE, appName, prfLvd, "",
    666690                           dirbuf, sizeof( dirbuf ) );
    667691    char fil[ _MAX_FNAME ] = "";
     
    835859        WinSetWindowPos( hWndFrame, NULLHANDLE,
    836860                         winPos.Swp.x, winPos.Swp.y, winPos.Swp.cx, winPos.Swp.cy,
    837                          SWP_MOVE | SWP_SIZE | SWP_SHOW );
     861                         SWP_SIZE | SWP_MOVE | SWP_SHOW );
    838862    }
    839863    else if ( maxviewState == On )
    840864    {
    841         WinSetWindowPos( hWndFrame, HWND_TOP, 0, 0,
     865        WinSetWindowPos( hWndFrame, NULLHANDLE, 0, 0,
    842866                         WinQuerySysValue( HWND_DESKTOP, SV_CXSCREEN ),
    843867                         WinQuerySysValue( HWND_DESKTOP, SV_CYSCREEN ),
    844                          SWP_SIZE | SWP_MOVE | SWP_ZORDER );
     868                         SWP_SIZE | SWP_MOVE | SWP_SHOW );
    845869    }
    846870}
     
    9951019}
    9961020
     1021void Lucide::savePosition()
     1022{
     1023    if ( !WinIsWindow( hab, hWndFrame ) )
     1024        return;
     1025
     1026    char valbuf[ 3 ] = "";
     1027    PrfWriteProfileString( HINI_USERPROFILE, appName, prfSplpos,
     1028                           itoa( Lucide::splitterPos, valbuf, 10 ) );
     1029    PrfWriteProfileString( HINI_USERPROFILE, appName, prfShowind,
     1030                           itoa( Lucide::showIndex, valbuf, 10 ) );
     1031
     1032    if ( isMaxview )
     1033        PrfWriteProfileString( HINI_USERPROFILE, appName, prfMaxView, "1" );
     1034    else
     1035        PrfWriteProfileString( HINI_USERPROFILE, appName, prfMaxView, NULL );
     1036
     1037    if ( isFullscreen )
     1038        PrfWriteProfileString( HINI_USERPROFILE, appName, prfFs, "1" );
     1039    else
     1040        PrfWriteProfileString( HINI_USERPROFILE, appName, prfFs, NULL );
     1041
     1042    if ( !isMaxview && !isFullscreen ) {
     1043        WinQueryWindowPos( hWndFrame, &winPos.Swp );
     1044        winPos.XRestore  = WinQueryWindowUShort( hWndFrame, QWS_XRESTORE );
     1045        winPos.YRestore  = WinQueryWindowUShort( hWndFrame, QWS_YRESTORE );
     1046        winPos.CXRestore = WinQueryWindowUShort( hWndFrame, QWS_CXRESTORE );
     1047        winPos.CYRestore = WinQueryWindowUShort( hWndFrame, QWS_CYRESTORE );
     1048        winPos.XMinimize = WinQueryWindowUShort( hWndFrame, QWS_XMINIMIZE );
     1049        winPos.YMinimize = WinQueryWindowUShort( hWndFrame, QWS_YMINIMIZE );
     1050    }
     1051
     1052    PrfWriteProfileData( HINI_USERPROFILE, appName, prfFwp, &winPos, sizeof( winPos ) );
     1053}
     1054
     1055void Lucide::restorePosition()
     1056{
     1057    splitterPos = PrfQueryProfileInt( HINI_USERPROFILE, appName, prfSplpos,
     1058                                      Lucide::splitterPos );
     1059    showIndex = PrfQueryProfileInt( HINI_USERPROFILE, appName, prfShowind,
     1060                                    Lucide::showIndex );
     1061
     1062    WinSendMsg( hVertSplitter, SBM_SETSPLITTERPOS,
     1063                MPFROMSHORT( showIndex ? splitterPos : 0 ), MPVOID );
     1064
     1065    bool maxview = PrfQueryProfileInt( HINI_USERPROFILE, appName, prfMaxView, 0 ) == 1;
     1066    bool fullscreen = PrfQueryProfileInt( HINI_USERPROFILE, appName, prfFs, 0 ) == 1;
     1067
     1068    LONG sx, sy;
     1069    sx = WinQuerySysValue( HWND_DESKTOP, SV_CXSCREEN );
     1070    sy = WinQuerySysValue( HWND_DESKTOP, SV_CYSCREEN );
     1071
     1072    ULONG SwpOptions = SWP_MOVE | SWP_SIZE | SWP_ACTIVATE;
     1073    if ( !maxview && !fullscreen )
     1074        SwpOptions |= SWP_SHOW;
     1075
     1076    ULONG ulWpSize = sizeof( winPos );
     1077    if ( PrfQueryProfileData( HINI_USERPROFILE, appName, prfFwp, &winPos, &ulWpSize ) )
     1078    {
     1079
     1080        if ( winPos.Swp.fl & SWP_MAXIMIZE ) {
     1081            SwpOptions |= SWP_MAXIMIZE;
     1082        }
     1083        else if ( winPos.Swp.fl & SWP_MINIMIZE ) {
     1084            SwpOptions |= SWP_MINIMIZE;
     1085        }
     1086
     1087        LONG sx, sy;
     1088        sx = WinQuerySysValue( HWND_DESKTOP, SV_CXSCREEN );
     1089        sy = WinQuerySysValue( HWND_DESKTOP, SV_CYSCREEN );
     1090
     1091        if ( winPos.Swp.x > sx ) {
     1092            winPos.Swp.x = sx - winPos.Swp.cx;
     1093        }
     1094        if ( winPos.Swp.y > sy ) {
     1095            winPos.Swp.y = sy - winPos.Swp.cy;
     1096        }
     1097
     1098        if ( !isMaxview && !isFullscreen ) {
     1099            WinSetWindowPos( hWndFrame, NULLHANDLE,
     1100                             winPos.Swp.x, winPos.Swp.y, winPos.Swp.cx, winPos.Swp.cy,
     1101                             SwpOptions );
     1102        }
     1103
     1104        WinSetWindowUShort( hWndFrame, QWS_XRESTORE,  winPos.XRestore );
     1105        WinSetWindowUShort( hWndFrame, QWS_YRESTORE,  winPos.YRestore );
     1106        WinSetWindowUShort( hWndFrame, QWS_CXRESTORE, winPos.CXRestore );
     1107        WinSetWindowUShort( hWndFrame, QWS_CYRESTORE, winPos.CYRestore );
     1108        WinSetWindowUShort( hWndFrame, QWS_XMINIMIZE, winPos.XMinimize );
     1109        WinSetWindowUShort( hWndFrame, QWS_YMINIMIZE, winPos.YMinimize );
     1110
     1111        // we don't the app to be minimized at startup
     1112        if ( SwpOptions & SWP_MINIMIZE )
     1113            WinSetWindowPos( hWndFrame, NULLHANDLE, 0, 0, 0, 0, SWP_RESTORE );
     1114    }
     1115    else
     1116    {
     1117        typedef
     1118        BOOL ( APIENTRY *WinQueryDesktopWorkArea_T ) ( HWND hwndDesktop,
     1119                                                       PRECTL pwrcWorkArea );
     1120        static WinQueryDesktopWorkArea_T WinQueryDesktopWorkArea =
     1121            (WinQueryDesktopWorkArea_T) ~0;
     1122
     1123        if ( (ULONG) WinQueryDesktopWorkArea == (ULONG) ~0 ) {
     1124            if ( my_DosQueryProcAddr( "PMMERGE", 5469,
     1125                                      (PFN *) &WinQueryDesktopWorkArea ) )
     1126                WinQueryDesktopWorkArea = NULL;
     1127        }
     1128
     1129        SWP swp;
     1130        RECTL rcl;
     1131        if ( WinQueryDesktopWorkArea &&
     1132             WinQueryDesktopWorkArea( HWND_DESKTOP, &rcl ) ) {
     1133            swp.x = rcl.xLeft;
     1134            swp.y = rcl.yBottom;
     1135            swp.cx = rcl.xRight - rcl.xLeft;
     1136            swp.cy = rcl.yTop - rcl.yBottom;
     1137        } else {
     1138            swp.x = 0;
     1139            swp.y = 0;
     1140            swp.cx = sx;
     1141            swp.cy = sy;
     1142        }
     1143
     1144        swp.x += 16;
     1145        swp.y += 16;
     1146        swp.cx -= 32;
     1147        swp.cy -= 32;
     1148
     1149        WinSetWindowPos( hWndFrame, NULLHANDLE, swp.x, swp.y, swp.cx, swp.cy,
     1150                         SwpOptions );
     1151    }
     1152
     1153    if ( fullscreen )
     1154    {
     1155        toggleFullscreen();
     1156        isMaxview = maxview;
     1157    }
     1158    else if ( maxview )
     1159    {
     1160        toggleMaxview();
     1161    }
     1162}
     1163
    9971164static MRESULT EXPENTRY frameProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 )
    9981165{
     
    13361503    WinSendMsg( hVertSplitter, SBM_SETWINDOWS,
    13371504                MPFROMHWND( indexWin->getHWND() ), MPFROMHWND( docViewer->getFrameHWND() ) );
    1338     Lucide::splitterPos = PrfQueryProfileInt( HINI_USERPROFILE, appName, splpos, Lucide::splitterPos );
    1339     Lucide::showIndex = PrfQueryProfileInt( HINI_USERPROFILE, appName, showind, Lucide::showIndex );
    1340     WinSendMsg( hVertSplitter, SBM_SETSPLITTERPOS,
    1341                 MPFROMSHORT( Lucide::showIndex ? Lucide::splitterPos : 0 ), MPVOID );
    13421505
    13431506    // Horizontal splitter and its windows - Toolbar and Vertical splitter
     
    13641527    recent  = new RecentFiles( hWndMenu );
    13651528
    1366     // ᅵᅵᅵᅵᅵᅵᅵᅵ ᅵᅵᅵᅵ ᅵணࠬᅵᅵ
    1367     if ( !PMRestoreWindowPos( NULL, appName, fwp, hWndFrame,
    1368                               TRUE, TRUE, FALSE, FALSE, FALSE ) ) {
    1369         WinSetWindowPos( hWndFrame, HWND_TOP, 100, 100, 630, 400,
    1370                          SWP_SIZE | SWP_MOVE | SWP_SHOW | SWP_ACTIVATE );
    1371     }
     1529    Lucide::restorePosition();
    13721530
    13731531    Lucide::focusDocview();
     
    13851543    }
    13861544
    1387     if ( WinIsWindow( hab, hWndFrame ) )
    1388     {
    1389         char valbuf[ 3 ] = "";
    1390         PrfWriteProfileString( HINI_USERPROFILE, appName, splpos,
    1391                                itoa( Lucide::splitterPos, valbuf, 10 ) );
    1392         PrfWriteProfileString( HINI_USERPROFILE, appName, showind,
    1393                                itoa( Lucide::showIndex, valbuf, 10 ) );
    1394         PMStoreWindowPos( NULL, appName, fwp, hWndFrame );
    1395     }
     1545    Lucide::savePosition();
    13961546
    13971547    WinDestroyWindow( hWndFrame );
Note: See TracChangeset for help on using the changeset viewer.