home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: Graphics / Graphics.zip / gotch175.zip / src / settings.cpp < prev    next >
C/C++ Source or Header  |  2003-01-08  |  44KB  |  1,201 lines

  1. /***
  2.  This file belongs to the Gotcha! distribution.
  3.  Copyright (C) 1998-2002 Thorsten Thielen <thth@gmx.net>
  4.  
  5.  This program is free software; you can redistribute it and/or modify
  6.  it under the terms of the GNU General Public License as published by
  7.  the Free Software Foundation; either version 2 of the License, or
  8.  (at your option) any later version.
  9.  
  10.  This program is distributed in the hope that it will be useful,
  11.  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  GNU General Public License for more details.
  14.  
  15.  You should have received a copy of the GNU General Public License
  16.  along with this program; if not, write to the Free Software
  17.  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18.  ***/
  19.  
  20. #include "settings.h"
  21. #include "ctype.h"
  22.  
  23. #include "../../z-stuff/settings/thth_settings.cpp"
  24.  
  25. PSZ SETTINGS::pszPageTab[COUNT_PAGES]; /* = {
  26.     "Saving", "Snapshot window", "Misc", "Language" };
  27.     // FIXME nls*/
  28.  
  29. SWP swpDef = { 0,0,0, 98,66, 0,0,0,0 };
  30. SWP swpDefSSW = { 0,0,0, 10,10, 0,0,0,0 };
  31. USHORT ausDef[7] = { 0 };
  32. USHORT ausDefSSW[7] = { 0 };
  33.  
  34. ImageFormatInfo Settings::ifi[BMF_INVALID] =
  35. {
  36.     { TRUE,  BMF_12,   0L, "Bitmap 1.2 (Saved using Gotcha! internal routine)", "bmp", "Bitmap" },
  37.     { TRUE,  BMF_16,   0L, "Bitmap 1.6 (Saved using Gotcha! internal routine)", "bmp", "Bitmap" },
  38.     { TRUE,  BMF_20,   0L, "Bitmap 2.0 (Saved using Gotcha! internal routine)", "bmp", "Bitmap" },
  39.     { FALSE, BMF_OS13, mmioFOURCC( 'O','S','1','3' ), "Bitmap 1.3 (Saved using OS/2 Multimedia)", "bmp", "Bitmap" },
  40.     { FALSE, BMF_OS20, mmioFOURCC( 'O','S','2','0' ), "Bitmap 2.0 (Saved using OS/2 Multimedia)", "bmp", "Bitmap" },
  41.     { FALSE, BMF_TIF,  mmioFOURCC( 'T','F','M','C' ), "TIFF compressed", "tif", "TIFF" },
  42.     { FALSE, BMF_TIFU, mmioFOURCC( 'T','F','M','U' ), "TIFF uncompressed", "tif", "TIFF" },
  43.     { FALSE, BMF_TGA,  mmioFOURCC( 'T','G','A','C' ), "TGA", "tga", "Targa" },
  44.     { FALSE, BMF_PCX,  mmioFOURCC( 'P','C','X','C' ), "PCX", "pcx", "PCX" },
  45.     { FALSE, BMF_GIF,  mmioFOURCC( 'G','I','F','C' ), "GIF", "gif", "GIF" },
  46.     { FALSE, BMF_JPG,  mmioFOURCC( 'J','P','E','G' ), "Jpeg (Probably won't work, reason unknown)", "jpg", "JPG" },
  47.     { FALSE, BMF_DIB,  mmioFOURCC( 'R','D','I','B' ), "DIB (Device Independent Bitmap)", "dib", "DIB" }
  48. };
  49.  
  50. PTHTH_SE apse[] = /*fold00*/
  51. {
  52.     new THTH_SES (SEI_SAVEFILE, "Save", "Filename", "gotcha.bmp"),
  53.     new THTH_SES (SEI_FORCESAVEFILE, "Save", "ForceSaveFilename", "force.bmp"),
  54.     new THTH_SEL (SEI_SAVESTYLE, "Save", "Style", SAVESTYLE_CLIPBOARD),
  55.     new THTH_SEL (SEI_FILEFORMAT, "Save", "FileFormat", BMF_16),
  56.     new THTH_SEL (SEI_FILESAVESTYLE, "Save", "FileSaveStyle", FSS_PROMPT),
  57.  
  58.     new THTH_SES (SEI_NUMSAVEDIR, "Save", "NumSaveDir", ""),
  59.     new THTH_SEF (SEI_HIDEWINDOW, "Extras", "HideWindow", TRUE),
  60.     new THTH_SEF (SEI_AUTOADDEXTENSION, "Extras", "AutoaddExtension", TRUE),
  61.     new THTH_SEF (SEI_CONFIRMOVERWRITE, "Extras", "ConfirmOverwrite", TRUE),
  62.     new THTH_SEF (SEI_DOSOUND, "Extras", "DoSound", TRUE),
  63.  
  64.     new THTH_SEF (SEI_DELAYEDCAPTURE, "Extras", "DelayedCapture", FALSE),
  65.     new THTH_SEF (SEI_DELAYCOUNTDOWN, "Extras", "DelayCountdown", FALSE),
  66.     new THTH_SEL (SEI_DELAYTIME, "Extras", "DelayTime", 5),
  67.     new THTH_SEF (SEI_SERIALCAPTURE, "Extras", "SerialCapture", FALSE),
  68.     new THTH_SEL (SEI_SERIALTIME, "Extras", "SerialTime", 10),
  69.  
  70.     new THTH_SEF (SEI_SNAPSHOTWINDOW, "Snapshot", "Enable", FALSE),
  71.     new THTH_SEL (SEI_SSWCAPTURETYPE, "Snapshot", "CaptureType", CAP_SCREEN),
  72.     new THTH_SEF (SEI_SSWHIDE, "Snapshot", "Hide", TRUE),
  73.     new THTH_SEF (SEI_SSWALWAYSONTOP, "Snapshot", "AlwaysOnTop", TRUE),
  74.  
  75.     new THTH_SEF (SEI_IDLEPRIORITY, "Extras", "IdlePriority", FALSE),
  76.  
  77.     new THTH_SEB (SEI_SWP, "Window", "SWP", &swpDef, sizeof (swpDef)),
  78.     new THTH_SEB (SEI_US, "Window", "US", &ausDef, sizeof (ausDef)),
  79.  
  80.     new THTH_SEB (SEI_SWPSSW, "Snapshot", "SWP", &swpDefSSW, sizeof (swpDefSSW)),
  81.     new THTH_SEB (SEI_USSSW, "Snapshot", "US", &ausDefSSW, sizeof (ausDefSSW)),
  82.  
  83.     new THTH_SES (SEI_LANGUAGE,     "Language", "Program", PSZ_DEFAULTLANGUAGE),
  84.     new THTH_SES (SEI_LANGUAGEHELP, "Language", "Help", PSZ_DEFAULTLANGUAGEHELP),
  85.  
  86.     NULL,
  87. };
  88.  
  89. // ** Settings ************************************************************ /*fold00*/
  90.  
  91. Settings :: Settings (VOID) :
  92. ththSettings(apse, "gotcha.ini", L_PROFILEVERSION)
  93. {
  94.     // to get the error msgs in default language
  95.     ReloadResources (QueryString(SEI_LANGUAGE));
  96.  
  97.     if (Error () == 1)
  98.     {
  99.         FileNotOpenError ();
  100.         ReloadResources (QueryString(SEI_LANGUAGE));
  101.     }
  102.     else if (Error () == 2)
  103.     {
  104.         VersionError ();
  105.         ReloadResources (QueryString(SEI_LANGUAGE));
  106.     }
  107.  
  108.     // See if we can use OS/2 Multimedia:
  109.     mmio = new thth_MMIO();
  110.     if( ! mmio->IsValid() ) {
  111.         delete mmio;
  112.         mmio = NULL;
  113.         if( mmio->step > 0 )
  114.             DisplayError( "MMIO-Error",
  115.                           "Could not load Multimedia IO extension. (rc=%d, step=%d)", mmio->rc, mmio->step );
  116.     } else {
  117.         MMFORMATINFO  mmfi;
  118.         ULONG lNumFormats = 30;
  119.         LONG lReturned;
  120.         PMMFORMATINFO pv = PMMFORMATINFO( malloc( sizeof( MMFORMATINFO ) * lNumFormats ) );
  121.         memset( &mmfi, 0, sizeof( MMFORMATINFO ) );
  122.         mmfi.ulMediaType = MMIO_MEDIATYPE_IMAGE;
  123.  
  124.         if( pv ) {
  125.             if( mmio->pfmmioGetFormats( &mmfi, lNumFormats, pv, &lReturned, 0, 0 )
  126.                 != MMIO_SUCCESS ) {
  127.                 DisplayError( "MMIO-Error",
  128.                               "Could not get Multimedia-IO-Format information." );
  129.             } else {
  130.                 /*            DisplayError( "MMIO-Error",
  131.                  "'%d' formats returned", lReturned ); */
  132.                 for( int i = 0; i < lReturned; i++ ) {
  133.                     for( int j = 0; j < BMF_INVALID; j++ ) {
  134.                         if( ifi[j].fourcc == pv[i].fccIOProc )
  135.                         {
  136.                             ifi[j].available = TRUE;
  137.                             break;
  138.                         }
  139.                     }
  140.                 }
  141.             }
  142.         } else {
  143.             DisplayError( "MMIO-Error",
  144.                           "Could not get Multimedia-IO-Format information (no memory)." );
  145.         }
  146.     }
  147. }
  148.  
  149. // ** VersionError ******************************************************** /*fold00*/
  150.  
  151. USHORT SETTINGS :: VersionError (VOID)
  152. {
  153.     DisplayError (RSTR(IDS_HEADER_WARNING), RSTR(IDS_ERROR_INIFILEWRONGVERSION),
  154.                   QueryProfileName ());
  155.     SelectLanguage();
  156.     return 0;
  157. }
  158.  
  159. // ** FileNotOpenError **************************************************** /*fold00*/
  160.  
  161. USHORT SETTINGS :: FileNotOpenError (VOID)
  162. {
  163.     DisplayError (RSTR(IDS_HEADER_ERROR), RSTR(IDS_ERROR_INIFILENOTOPEN),
  164.                   QueryProfileName ());
  165.     SelectLanguage();
  166.     return 0;
  167. }
  168.  
  169. // ** Dialog ************************************************************** /*FOLD00*/
  170.  
  171. // FIXME YUKKI! YUKKI!! YUKKI!!! But I'm too lazy to do it better now :-)
  172. HWND g_hwndSettingsDialog = NULL;
  173.  
  174. BOOL SETTINGS :: Dialog (BOOL fOnlyLanguage)
  175. {
  176. #ifdef _DOLOGDEBUG_
  177.     LogDebug( "Dialog: checkpoint 1" );
  178. #endif
  179.     fAutoLanguage = fOnlyLanguage;
  180.  
  181.     // load the main dialog window
  182.     hwndDlg = WinLoadDlg (HWND_DESKTOP, hwndFrame, PFNWP (DialogProcedure),
  183.                           GETMODULE, ID_DLG_SETTINGS, this);
  184.     // FIXME YUKKI! YUKKI!! YUKKI!!! But I'm too lazy to do it better now :-)
  185.     g_hwndSettingsDialog = hwndDlg;
  186. #ifdef _DOLOGDEBUG_
  187.     LogDebug( "Dialog: checkpoint 2" );
  188. #endif
  189.  
  190.     // disable this two buttons if only language select
  191.     if (fAutoLanguage)
  192.     {
  193.         WinEnableWindow (WinWindowFromID (hwndDlg, WID_PB_HELP), FALSE);
  194.         WinEnableWindow (WinWindowFromID (hwndDlg, WID_PB_UNDO), FALSE);
  195.     }
  196.  
  197.     HWND   hwndNB = WinWindowFromID (hwndDlg, WID_NB_SETTINGS);
  198. #ifdef _DOLOGDEBUG_
  199.     LogDebug( "Dialog: checkpoint 3" );
  200. #endif
  201.  
  202.     // set notebook background color
  203.     WinSendMsg (hwndNB, BKM_SETNOTEBOOKCOLORS,
  204.                 MPFROMLONG (SYSCLR_DIALOGBACKGROUND),
  205.                 MPFROMSHORT (BKA_BACKGROUNDPAGECOLORINDEX));
  206.  
  207.     // set tab dimensions
  208.     WinSendMsg (hwndNB, BKM_SETDIMENSIONS,
  209.                 MPFROM2SHORT (80, 25), MPFROMSHORT (BKA_MAJORTAB));
  210. #ifdef _DOLOGDEBUG_
  211.     LogDebug( "Dialog: checkpoint 4" );
  212. #endif
  213.  
  214.     ULONG   idPage[COUNT_PAGES];
  215.     USHORT  i, cPages;
  216.  
  217.     if (fOnlyLanguage)
  218.     {
  219.         cPages = 1;
  220.  
  221.         idPage[0] = (ULONG)
  222.             WinSendMsg (hwndNB, BKM_INSERTPAGE, 0L,
  223.                         MPFROM2SHORT (BKA_MAJOR | BKA_AUTOPAGESIZE,
  224.                                       BKA_LAST));
  225.         WinSendMsg (hwndNB, BKM_SETTABTEXT, MPFROMLONG (idPage[0]),
  226.                     MPFROMP (pszPageTab[COUNT_PAGES-1]));
  227.         hwndPage[0] = WinLoadDlg (hwndNB, hwndNB, (PFNWP) Page4Procedure,
  228.                                   GETMODULE, ID_DLG_SETTINGSPAGE4, this);
  229.     }
  230.     else
  231.     {
  232.         cPages = COUNT_PAGES;
  233.  
  234.         // insert empty pages
  235.         for (i = 0; i < cPages; i++)
  236.         {
  237.             idPage[i] = (ULONG)
  238.                 WinSendMsg (hwndNB, BKM_INSERTPAGE, 0L,
  239.                             MPFROM2SHORT (BKA_MAJOR | BKA_AUTOPAGESIZE,
  240.                                           BKA_LAST));
  241.             WinSendMsg (hwndNB, BKM_SETTABTEXT,
  242.                         MPFROMLONG (idPage[i]), MPFROMP (pszPageTab[i]));
  243.         }
  244.  
  245.         // open and assign dialogs to pages
  246.         hwndPage[0] = WinLoadDlg (hwndNB, hwndNB, (PFNWP) Page1Procedure,
  247.                                   GETMODULE, ID_DLG_SETTINGSPAGE1, this);
  248.         hwndPage[1] = WinLoadDlg (hwndNB, hwndNB, (PFNWP) Page2Procedure,
  249.                                   GETMODULE, ID_DLG_SETTINGSPAGE2, this);
  250.         hwndPage[2] = WinLoadDlg (hwndNB, hwndNB, (PFNWP) Page3Procedure,
  251.                                   GETMODULE, ID_DLG_SETTINGSPAGE3, this);
  252.         hwndPage[3] = WinLoadDlg (hwndNB, hwndNB, (PFNWP) Page4Procedure,
  253.                                   GETMODULE, ID_DLG_SETTINGSPAGE4, this);
  254.     }
  255. #ifdef _DOLOGDEBUG_
  256.     LogDebug( "Dialog: checkpoint 5" );
  257. #endif
  258.  
  259.     // combine dlg-handle and page ids
  260.     for (i = 0; i < cPages; i++)
  261.         WinSendMsg (hwndNB, BKM_SETPAGEWINDOWHWND,
  262.                     MPFROMLONG (idPage[i]), MPFROMHWND (hwndPage[i]));
  263.  
  264. /*    if (fAutoLanguage)
  265.         WinSendMsg (hwndNB, BKM_TURNTOPAGE, MPFROMLONG (idPage[0]), 0L);
  266. #if (COUNT_PAGES != 4)
  267. #warning FIXME settings.cpp 264 or so ...
  268. #endif */
  269.     for (i = 0; i < cPages; i++)
  270.         WinSendMsg (hwndPage[i], UM_SETTINGS2DIALOG, 0,0);
  271. #ifdef _DOLOGDEBUG_
  272.     LogDebug( "Dialog: checkpoint 6" );
  273. #endif
  274.  
  275.     //WinSetFocus (WinWindowFromID (hwndDlg, WID_PB_OK), TRUE);
  276.     //WinSetFocus( hwndPage[0], TRUE );
  277.     WinSetActiveWindow( HWND_DESKTOP, hwndPage[0] );
  278. #ifdef _DOLOGDEBUG_
  279.     LogDebug( "Dialog: checkpoint 7" );
  280. #endif
  281.  
  282.     WinProcessDlg (hwndDlg);
  283. #ifdef _DOLOGDEBUG_
  284.     LogDebug( "Dialog: checkpoint 7.5" );
  285. #endif
  286.     WinDestroyWindow (hwndDlg);
  287. #ifdef _DOLOGDEBUG_
  288.     LogDebug( "Dialog: checkpoint 8" );
  289. #endif
  290.  
  291.     // it ain't the best way to do it, but ...
  292.     SetIdlePriority(QueryFlag(SEI_IDLEPRIORITY));
  293.  
  294.     for (i = 0; i < COUNT_PAGES; i++)
  295.         hwndPage[i] = NULL;
  296.  
  297.     hwndDlg = NULLHANDLE;
  298. #ifdef _DOLOGDEBUG_
  299.     LogDebug( "Dialog: checkpoint 9" );
  300. #endif
  301.     return TRUE;
  302. }
  303.  
  304. // ** DialogProcedure ***************************************************** /*FOLD00*/
  305.  
  306. MRESULT EXPENTRY
  307. SETTINGS :: DialogProcedure (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  308. {
  309.     static PSETTINGS   pset = NULL;
  310.  
  311. #ifdef _DOLOGDEBUG_
  312.     LogDebug( "DialogProcedure:Message 0x%04x", msg );
  313. #endif
  314.  
  315.     switch (msg)
  316.     {
  317.     case WM_INITDLG:
  318. #ifdef _DOLOGDEBUG_
  319.         LogDebug( "DialogProcedure: start WM_INITDLG" );
  320. #endif
  321.         pset = PSETTINGS (mp2);
  322. #ifdef _DOLOGDEBUG_
  323.         LogDebug( "DialogProcedure: end WM_INITDLG" );
  324. #endif
  325.         return MRESULT (FALSE);
  326.  
  327.     case WM_COMMAND:
  328.         switch (SHORT1FROMMP (mp1))
  329.         {
  330.         case WID_PB_OK:
  331. #ifdef _DOLOGDEBUG_
  332.             LogDebug( "DialogProcedure: start WID_PB_OK" );
  333. #endif
  334.             WinSendMsg (hwnd, WM_CLOSE, 0,0);
  335. #ifdef _DOLOGDEBUG_
  336.             LogDebug( "DialogProcedure: end WID_PB_OK" );
  337. #endif
  338.             break;
  339.             
  340.         case WID_PB_UNDO:
  341.             {
  342.                 ULONG  id = (ULONG)
  343.                     WinSendDlgItemMsg (hwnd, WID_NB_SETTINGS,
  344.                                        BKM_QUERYPAGEID, 0,
  345.                                        MPFROM2SHORT (BKA_TOP, 0));
  346.                 if (id)
  347.                 {
  348.                     HWND   hwndPage = (HWND)
  349.                         WinSendDlgItemMsg (hwnd, WID_NB_SETTINGS,
  350.                                            BKM_QUERYPAGEWINDOWHWND,
  351.                                            MPFROMLONG (id), 0);
  352.                     WinSendMsg (hwndPage, UM_SETTINGS2DIALOG, 0,0);
  353.                 }
  354.             }
  355.             break;
  356.  
  357.         case DID_CANCEL:
  358.             {
  359.                 // Undo stuff on all notebook pages:
  360.                 HWND hwndPage;
  361.  
  362.                 // Get ID of first notebook page.
  363.                 ULONG id =
  364.                     ULONG( WinSendDlgItemMsg( hwnd, WID_NB_SETTINGS,
  365.                                               BKM_QUERYPAGEID, 0,
  366.                                               MPFROM2SHORT( BKA_FIRST, 0 ) ) );
  367.                 if( id ) {
  368.                     hwndPage =
  369.                         HWND( WinSendDlgItemMsg( hwnd, WID_NB_SETTINGS,
  370.                                                  BKM_QUERYPAGEWINDOWHWND,
  371.                                                  MPFROMLONG( id ), 0 ) );
  372.                     WinSendMsg( hwndPage, UM_SETTINGS2DIALOG, 0,0 );
  373.                 }
  374.  
  375.                 while( id ) {
  376.                     // Get ID of next notebook page.
  377.                     if( ( id =
  378.                           ULONG( WinSendDlgItemMsg( hwnd, WID_NB_SETTINGS,
  379.                                                     BKM_QUERYPAGEID,
  380.                                                     MPFROMLONG( id ),
  381.                                                     MPFROM2SHORT( BKA_NEXT, 0 )
  382.                                                   ) ) ) ) {
  383.                         hwndPage =
  384.                             HWND( WinSendDlgItemMsg( hwnd, WID_NB_SETTINGS,
  385.                                                      BKM_QUERYPAGEWINDOWHWND,
  386.                                                      MPFROMLONG( id ), 0 ) );
  387.                         WinSendMsg( hwndPage, UM_SETTINGS2DIALOG, 0,0 );
  388.                     }
  389.                 }
  390.                 WinSendMsg( hwnd, WM_CLOSE, 0,0 );
  391.             }
  392.             break;
  393.         }
  394.         return MRESULT (FALSE);
  395.  
  396. #ifdef _DOLOGDEBUG_
  397.     case WM_DESTROY:
  398.         LogDebug( "DialogProcedure: WM_DESTROY" );
  399.         return MRESULT (FALSE);
  400. #endif
  401.  
  402.     case WM_CLOSE:
  403. #ifdef _DOLOGDEBUG_
  404.         LogDebug( "DialogProcedure: WM_CLOSE" );
  405. #endif
  406.     case WM_QUIT:
  407. #ifdef _DOLOGDEBUG_
  408.         LogDebug( "DialogProcedure: WM_QUIT" );
  409. #endif
  410.     case WM_SAVEAPPLICATION:
  411. #ifdef _DOLOGDEBUG_
  412.         LogDebug( "DialogProcedure: WM_SAVEAPPLICATION" );
  413. #endif
  414. #ifdef _DOLOGDEBUG_
  415.         LogDebug( "DialogProcedure: start WM_CLOSE (or WM_QUIT, WM_SAVEAPPLICATION)" );
  416. #endif
  417.         for (USHORT i = 0; i < COUNT_PAGES; i++)
  418.             WinSendMsg (pset->hwndPage[i], UM_ADJUST, 0,0);
  419. #ifdef _DOLOGDEBUG_
  420.         LogDebug( "DialogProcedure: end WM_CLOSE (or WM_QUIT, WM_SAVEAPPLICATION)" );
  421. #endif
  422.         WinDismissDlg( hwnd, 0L );
  423.         return MRESULT (FALSE);
  424.     }
  425.  
  426. #ifdef _DOLOGDEBUG_
  427.     LogDebug( "DialogProcedure:WinDefDlgProc->0x%04x", msg );
  428. #endif
  429.     return WinDefDlgProc (hwnd, msg, mp1, mp2);
  430. }
  431.  
  432. // ** Page1Procedure ****************************************************** /*fold00*/
  433.  
  434. MRESULT EXPENTRY
  435. SETTINGS :: Page1Procedure (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  436. {
  437.     static PSETTINGS   pset = NULL;
  438.  
  439.     switch (msg)
  440.     {
  441.     case WM_INITDLG: {
  442. #ifdef _DOLOGDEBUG_
  443.         LogDebug( "Page1Procedure: start WM_INITDLG" );
  444. #endif
  445.         ULONG ul;
  446.         pset = PSETTINGS (mp2);
  447.         for( int i = 0; i < BMF_INVALID; i++ ) {
  448.             if( pset->ifi[ i ].available ) {
  449.                 ul = WinInsertLboxItem( WinWindowFromID( hwnd, WID_LB_FILEFORMAT ),
  450.                                         LIT_END, pset->ifi[ i ].label );
  451.                 WinSendMsg( WinWindowFromID( hwnd, WID_LB_FILEFORMAT ),
  452.                             LM_SETITEMHANDLE, MPFROMLONG(ul), MPFROMP( i ) );
  453.             }
  454.         }
  455. #ifdef _DOLOGDEBUG_
  456.         LogDebug( "Page1Procedure: end WM_INITDLG" );
  457. #endif
  458.         return MRESULT (FALSE);
  459.     }
  460.  
  461.     case WM_COMMAND:
  462.         if( SHORT1FROMMP( mp1 ) == DID_CANCEL )
  463.             WinPostMsg( g_hwndSettingsDialog, msg, mp1, mp2 );
  464.         return MRESULT( FALSE );
  465.  
  466.     case UM_SETTINGS2DIALOG: {
  467. #ifdef _DOLOGDEBUG_
  468.         LogDebug( "Page1Procedure: start UM_SETTINGS2DIALOG" );
  469. #endif
  470.         // set num save dir name
  471.         WinSendDlgItemMsg (hwnd, WID_E_NUMSAVEDIR, EM_SETTEXTLIMIT,
  472.                            MPARAM (_MAX_PATH-1), (MPARAM)0);
  473.         WinSetDlgItemText (hwnd, WID_E_NUMSAVEDIR,
  474.                            pset->QueryNumSaveDir ());
  475.         WinSendDlgItemMsg (hwnd, WID_E_NUMSAVEDIR, EM_SETSEL,
  476.                            MPFROM2SHORT (0, _MAX_PATH), (MPARAM)0);
  477.  
  478.         // set force file name
  479.         WinSendDlgItemMsg (hwnd, WID_E_FORCESAVEFILE, EM_SETTEXTLIMIT,
  480.                            MPARAM (_MAX_PATH-1), (MPARAM)0);
  481.         WinSetDlgItemText (hwnd, WID_E_FORCESAVEFILE,
  482.                            pset->QueryForceSaveFile ());
  483.         WinSendDlgItemMsg (hwnd, WID_E_FORCESAVEFILE, EM_SETSEL,
  484.                            MPFROM2SHORT (0, _MAX_PATH), (MPARAM)0);
  485.  
  486. /*        switch (pset->QueryFileFormat ())
  487.         {
  488.         case BMF_20:
  489.             WinSendDlgItemMsg (hwnd, WID_RB_BMF20, BM_CLICK,
  490.                                MPFROMSHORT(TRUE), 0);
  491.             break;
  492.         case BMF_12:
  493.             WinSendDlgItemMsg (hwnd, WID_RB_BMF12, BM_CLICK,
  494.                                MPFROMSHORT(TRUE), 0);
  495.             break;
  496.         default:
  497.             WinSendDlgItemMsg (hwnd, WID_RB_BMF16, BM_CLICK,
  498.                                MPFROMSHORT(TRUE), 0);
  499.             break;
  500.         } */
  501.  
  502.         // Select the appropriate entry in the fileformat-listbox.
  503.         HWND     hwndLB = WinWindowFromID( hwnd, WID_LB_FILEFORMAT );
  504.         ULONG    c, i;
  505.  
  506.         c = WinQueryLboxCount( hwndLB );
  507.         for( i = 0; i < c; i++ )
  508.         {
  509.             ULONG type = ULONG( WinSendDlgItemMsg( hwnd, WID_LB_FILEFORMAT,
  510.                                                    LM_QUERYITEMHANDLE,
  511.                                                    MPFROMLONG(i), NULL ) );
  512.             if( type == ULONG( pset->QueryFileFormat() ) )
  513.                 break;
  514.         }
  515.         if( i < c )
  516.             WinSendDlgItemMsg( hwnd, WID_LB_FILEFORMAT, LM_SELECTITEM,
  517.                                MPFROMSHORT(i), MPFROMSHORT(TRUE) );
  518.         else
  519.             WinSendDlgItemMsg( hwnd, WID_LB_FILEFORMAT, LM_SELECTITEM,
  520.                                MPFROMSHORT(0), MPFROMSHORT(TRUE) );
  521.  
  522.         // Select appropriate radiobutton for save style.
  523.         switch (pset->QueryFileSaveStyle ())
  524.         {
  525.         case FSS_NUMFILES:
  526.             WinSendDlgItemMsg (hwnd, WID_RB_FSSNUMFILES, BM_CLICK,
  527.                                MPFROMSHORT(TRUE), 0);
  528.             AdjustSaveTypeButtons (FALSE);
  529.             break;
  530.  
  531.         case FSS_FORCEFILE:
  532.             WinSendDlgItemMsg (hwnd, WID_RB_FSSFORCEFILE, BM_CLICK,
  533.                                MPFROMSHORT(TRUE), 0);
  534.             AdjustSaveTypeButtons (TRUE);
  535.             break;
  536.  
  537.         default:
  538.             WinSendDlgItemMsg (hwnd, WID_RB_FSSPROMPT, BM_CLICK,
  539.                                MPFROMSHORT(TRUE), 0);
  540.             AdjustSaveTypeButtons (FALSE);
  541.             break;
  542.         }
  543. #ifdef _DOLOGDEBUG_
  544.         LogDebug( "Page1Procedure: end UM_SETTINGS2DIALOG" );
  545. #endif
  546.         return MRESULT (FALSE);
  547.     }
  548.  
  549.     case UM_ADJUST:
  550.         {
  551. #ifdef _DOLOGDEBUG_
  552.             LogDebug( "Page1Procedure: start UM_ADJUST" );
  553. #endif
  554.             // get file save style
  555.             if (WinSendMsg (WinWindowFromID (hwnd, WID_RB_FSSNUMFILES),
  556.                             BM_QUERYCHECK, 0,0))
  557.                 pset->SetFileSaveStyle (FSS_NUMFILES);
  558.             else if (WinSendMsg (WinWindowFromID (hwnd, WID_RB_FSSFORCEFILE),
  559.                                  BM_QUERYCHECK, 0,0))
  560.                 pset->SetFileSaveStyle (FSS_FORCEFILE);
  561.             else
  562.                 pset->SetFileSaveStyle (FSS_PROMPT);
  563. #ifdef _DOLOGDEBUG_
  564.             LogDebug( "Page1Procedure: checkpoint 1" );
  565. #endif
  566.  
  567.             // Get file format.
  568.             ULONG ul = USHORT( WinSendDlgItemMsg( hwnd, WID_LB_FILEFORMAT,
  569.                                                   LM_QUERYSELECTION,
  570.                                                   MPFROMLONG( LIT_FIRST ),
  571.                                                   0L ) );
  572.             ul = ULONG( WinSendDlgItemMsg( hwnd, WID_LB_FILEFORMAT,
  573.                                            LM_QUERYITEMHANDLE,
  574.                                            MPFROMLONG( ul ), NULL ) );
  575.             pset->SetFileFormat( SHORT( ul ) );
  576. /*            if (WinSendMsg (WinWindowFromID (hwnd, WID_RB_BMF12),
  577.                             BM_QUERYCHECK, 0,0))
  578.                 pset->SetFileFormat (BMF_12);
  579.             else if (WinSendMsg (WinWindowFromID (hwnd, WID_RB_BMF20),
  580.                                  BM_QUERYCHECK, 0,0))
  581.                 pset->SetFileFormat (BMF_20);
  582.             else
  583.                 pset->SetFileFormat (BMF_16); */
  584. #ifdef _DOLOGDEBUG_
  585.             LogDebug( "Page1Procedure: checkpoint 2" );
  586. #endif
  587.  
  588.             // num save dir file name
  589.             CHAR   psz[_MAX_PATH];
  590.             WinQueryDlgItemText (hwnd, WID_E_NUMSAVEDIR, _MAX_PATH, psz);
  591.             pset->SetNumSaveDir (psz);
  592.  
  593.             // force file name
  594.             WinQueryDlgItemText (hwnd, WID_E_FORCESAVEFILE, _MAX_PATH, psz);
  595.             pset->SetForceSaveFile (psz);
  596.  
  597.             AdjustSaveTypeButtons
  598.                 (BOOL (pset->QueryFileSaveStyle () == FSS_FORCEFILE));
  599. #ifdef _DOLOGDEBUG_
  600.             LogDebug( "Page1Procedure: end UM_ADJUST" );
  601. #endif
  602.         }
  603.         break;
  604.  
  605.     case WM_CONTROL:
  606.         switch (SHORT1FROMMP (mp1))
  607.         {
  608.         case WID_RB_FSSFORCEFILE:
  609.             AdjustSaveTypeButtons (TRUE);
  610.             break;
  611.  
  612.         case WID_RB_FSSPROMPT:
  613.         case WID_RB_FSSNUMFILES:
  614.             AdjustSaveTypeButtons (FALSE);
  615.             break;
  616.         }
  617.         return MRESULT (FALSE);
  618.     }
  619.  
  620.     return WinDefDlgProc (hwnd, msg, mp1, mp2);
  621. }
  622.  
  623. // ** Page2Procedure ****************************************************** /*fold00*/
  624.  
  625. MRESULT EXPENTRY
  626. SETTINGS :: Page2Procedure (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  627. {
  628.     static PSETTINGS   pset = NULL;
  629.  
  630.     switch (msg)
  631.     {
  632.     case WM_INITDLG:
  633. #ifdef _DOLOGDEBUG_
  634.         LogDebug( "Page1Procedure: start WM_INITDLG" );
  635. #endif
  636.         pset = PSETTINGS (mp2);
  637. #ifdef _DOLOGDEBUG_
  638.         LogDebug( "Page1Procedure: end WM_INITDLG" );
  639. #endif
  640.         return MRESULT (FALSE);
  641.  
  642.     case WM_COMMAND:
  643.         if( SHORT1FROMMP( mp1 ) == DID_CANCEL )
  644.             WinPostMsg( g_hwndSettingsDialog, msg, mp1, mp2 );
  645.         return MRESULT( FALSE );
  646.  
  647.     case UM_SETTINGS2DIALOG:
  648. #ifdef _DOLOGDEBUG_
  649.         LogDebug( "Page2Procedure: start UM_SETTINGS2DIALOG" );
  650. #endif
  651.         // set state of checkbuttons
  652.         pset->AdjustButton (hwnd, WID_CB_SSWENABLE,
  653.                             pset->SnapshotWindow ());
  654.         pset->AdjustButton (hwnd, WID_CB_SSWHIDE,
  655.                             pset->SSWHide ());
  656.         pset->AdjustButton (hwnd, WID_CB_SSWALWAYSONTOP,
  657.                             pset->SSWAlwaysOnTop ());
  658.  
  659.         switch (pset->QuerySSWCaptureType ())
  660.         {
  661.         case CAP_WINDOWINT:
  662.             WinSendDlgItemMsg (hwnd, WID_SSWWINDOWINT, BM_CLICK,
  663.                                MPFROMSHORT(TRUE), 0);
  664.             break;
  665.         case CAP_SCREENREGION:
  666.             WinSendDlgItemMsg (hwnd, WID_SSWSCREENREGION, BM_CLICK,
  667.                                MPFROMSHORT(TRUE), 0);
  668.             break;
  669.         case CAP_WINDOW:
  670.             WinSendDlgItemMsg (hwnd, WID_SSWWINDOW, BM_CLICK,
  671.                                MPFROMSHORT(TRUE), 0);
  672.             break;
  673.         default:
  674.             WinSendDlgItemMsg (hwnd, WID_SSWSCREEN, BM_CLICK,
  675.                                MPFROMSHORT(TRUE), 0);
  676.             break;
  677.         }
  678.  
  679.         // show or hide snapshot window
  680.         if (! WinSendDlgItemMsg (hwnd, WID_CB_SSWENABLE,
  681.                                  BM_QUERYCHECK, 0, 0))
  682.             WinShowWindow (hwndSnapshot, FALSE);
  683.         else
  684.             WinShowWindow (hwndSnapshot, TRUE);
  685.  
  686. #ifdef _DOLOGDEBUG_
  687.         LogDebug( "Page1Procedure: end UM_SETTINGS2DIALOG" );
  688. #endif
  689.         return MRESULT (FALSE);
  690.  
  691.     case UM_ADJUST:
  692. #ifdef _DOLOGDEBUG_
  693.             LogDebug( "Page2Procedure: start UM_ADJUST" );
  694. #endif
  695.         // query state of checkbuttons and set flags
  696.         pset->SSWHide(WinQueryButtonCheckstate(hwnd, WID_CB_SSWHIDE));
  697. #ifdef _DOLOGDEBUG_
  698.             LogDebug( "Page2Procedure: checkpoint 1" );
  699. #endif
  700.         pset->SnapshotWindow(WinQueryButtonCheckstate(hwnd, WID_CB_SSWENABLE));
  701.         pset->SSWAlwaysOnTop(WinQueryButtonCheckstate(hwnd,
  702.                                                       WID_CB_SSWALWAYSONTOP));
  703. #ifdef _DOLOGDEBUG_
  704.             LogDebug( "Page2Procedure: checkpoint 2" );
  705. #endif
  706.  
  707.         // get ssw capture type
  708.         if (WinSendMsg (WinWindowFromID (hwnd, WID_SSWSCREENREGION),
  709.                         BM_QUERYCHECK, 0,0))
  710.             pset->SetSSWCaptureType (CAP_SCREENREGION);
  711.         else if (WinSendMsg (WinWindowFromID (hwnd, WID_SSWWINDOW),
  712.                              BM_QUERYCHECK, 0,0))
  713.             pset->SetSSWCaptureType (CAP_WINDOW);
  714.         else if (WinSendMsg (WinWindowFromID (hwnd, WID_SSWWINDOWINT),
  715.                              BM_QUERYCHECK, 0,0))
  716.             pset->SetSSWCaptureType (CAP_WINDOWINT);
  717.         else
  718.             pset->SetSSWCaptureType (CAP_SCREEN);
  719. #ifdef _DOLOGDEBUG_
  720.         LogDebug( "Page2Procedure: end UM_ADJUST" );
  721. #endif
  722.         break;
  723.  
  724.     case WM_CONTROL:
  725.         switch (SHORT1FROMMP (mp1))
  726.         {
  727.         case WID_CB_SSWENABLE:
  728.             if (! WinSendDlgItemMsg (hwnd, WID_CB_SSWENABLE,
  729.                                      BM_QUERYCHECK, 0, 0))
  730.                 WinShowWindow (hwndSnapshot, FALSE);
  731.             else
  732.                 WinShowWindow (hwndSnapshot, TRUE);
  733.             break;
  734.         }
  735.         return MRESULT (FALSE);
  736.     }
  737.  
  738.     return WinDefDlgProc (hwnd, msg, mp1, mp2);
  739. }
  740.  
  741. // ** Page3Procedure ****************************************************** /*FOLD00*/
  742.  
  743. MRESULT EXPENTRY
  744. SETTINGS :: Page3Procedure (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  745. {
  746.     static PSETTINGS   pset = NULL;
  747.  
  748.     switch (msg)
  749.     {
  750.     case WM_INITDLG:
  751. #ifdef _DOLOGDEBUG_
  752.         LogDebug( "Page3Procedure: start WM_INITDLG" );
  753. #endif
  754.         pset = PSETTINGS (mp2);
  755. #ifdef _DOLOGDEBUG_
  756.         LogDebug( "Page3Procedure: end WM_INITDLG" );
  757. #endif
  758.         return MRESULT (FALSE);
  759.  
  760.     case WM_COMMAND:
  761.         if( SHORT1FROMMP( mp1 ) == DID_CANCEL )
  762.             WinPostMsg( g_hwndSettingsDialog, msg, mp1, mp2 );
  763.         return MRESULT( FALSE );
  764.  
  765.     case UM_SETTINGS2DIALOG:
  766. #ifdef _DOLOGDEBUG_
  767.         LogDebug( "Page3Procedure: start UM_SETTINGS2DIALOG" );
  768. #endif
  769.         // set state of checkbuttons
  770.         pset->AdjustButton (hwnd, WID_CB_SERIALCAPTURE,
  771.                             pset->SerialCapture ());
  772.         pset->AdjustButton (hwnd, WID_CB_DELAYCOUNTDOWN,
  773.                             pset->DelayCountdown ());
  774.         pset->AdjustButton (hwnd, WID_CB_DOSOUND,
  775.                             pset->DoSound ());
  776.         pset->AdjustButton (hwnd, WID_CB_IDLEPRIORITY,
  777.                             pset->QueryFlag(SEI_IDLEPRIORITY));
  778.  
  779.         // init delay time sb
  780.         WinSendDlgItemMsg (hwnd, WID_SB_DELAYTIME, SPBM_SETLIMITS,
  781.                            MPFROMLONG (65536), MPFROMLONG (1));
  782.         WinSendDlgItemMsg (hwnd, WID_SB_DELAYTIME, SPBM_SETCURRENTVALUE,
  783.                            MPFROMLONG (pset->QueryDelayTime ()), 0);
  784.  
  785.         // init serial time sb
  786.         WinSendDlgItemMsg (hwnd, WID_SB_SERIALTIME, SPBM_SETLIMITS,
  787.                            MPFROMLONG (65536), MPFROMLONG (1));
  788.         WinSendDlgItemMsg (hwnd, WID_SB_SERIALTIME, SPBM_SETCURRENTVALUE,
  789.                            MPFROMLONG (pset->QuerySerialTime ()), 0);
  790. #ifdef _DOLOGDEBUG_
  791.         LogDebug( "Page3Procedure: end UM_SETTINGS2DIALOG" );
  792. #endif
  793.         return MRESULT (FALSE);
  794.  
  795.     case UM_ADJUST:
  796.         {
  797. #ifdef _DOLOGDEBUG_
  798.             LogDebug( "Page3Procedure: start UM_ADJUST" );
  799. #endif
  800.             // query state of checkbuttons and set flags
  801.             pset->SerialCapture(WinQueryButtonCheckstate
  802.                                 (hwnd, WID_CB_SERIALCAPTURE));
  803. #ifdef _DOLOGDEBUG_
  804.             LogDebug( "Page3Procedure: checkpoint 1" );
  805. #endif
  806.             pset->DelayCountdown(WinQueryButtonCheckstate
  807.                                  (hwnd, WID_CB_DELAYCOUNTDOWN));
  808.             pset->DoSound(WinQueryButtonCheckstate
  809.                           (hwnd, WID_CB_DOSOUND));
  810.             pset->SetFlag(SEI_IDLEPRIORITY, WinQueryButtonCheckstate
  811.                           (hwnd, WID_CB_IDLEPRIORITY));
  812. #ifdef _DOLOGDEBUG_
  813.             LogDebug( "Page3Procedure: checkpoint 2" );
  814. #endif
  815.  
  816.             // delay time
  817.             ULONG   ul;
  818.             if (! BOOL (WinSendDlgItemMsg (hwnd, WID_SB_DELAYTIME,
  819.                                            SPBM_QUERYVALUE,
  820.                                            MPFROMP (&ul),
  821.                                            MPFROM2SHORT (0, 0))))
  822.                 ul = 5L;
  823.             pset->SetDelayTime (ul);
  824. #ifdef _DOLOGDEBUG_
  825.             LogDebug( "Page3Procedure: checkpoint 3" );
  826. #endif
  827.  
  828.             // serial time
  829.             if (! BOOL (WinSendDlgItemMsg (hwnd, WID_SB_SERIALTIME,
  830.                                            SPBM_QUERYVALUE,
  831.                                            MPFROMP (&ul),
  832.                                            MPFROM2SHORT (0, 0))))
  833.                 ul = 10L;
  834.             pset->SetSerialTime (ul);
  835. #ifdef _DOLOGDEBUG_
  836.             LogDebug( "Page3Procedure: end UM_ADJUST" );
  837. #endif
  838.         }
  839.         break;
  840.  
  841.     case WM_CONTROL:
  842.         switch (SHORT1FROMMP (mp1))
  843.         {
  844.         case WID_CB_SERIALCAPTURE:
  845.             {
  846.                 HWND hwndButton =
  847.                     WinWindowFromID (WinWindowFromID (hwndFrame, FID_CLIENT),
  848.                                      WID_CB_DELAYEDCAPTURE);
  849.                 if (! WinSendDlgItemMsg (hwnd, WID_CB_SERIALCAPTURE,
  850.                                          BM_QUERYCHECK, 0, 0))
  851.                     WinEnableWindow (hwndButton, TRUE);
  852.                 else
  853.                     WinEnableWindow (hwndButton, FALSE);
  854.             }
  855.             break;
  856.         }
  857.         return MRESULT (FALSE);
  858.     }
  859.  
  860.     return WinDefDlgProc (hwnd, msg, mp1, mp2);
  861. }
  862.  
  863. // ** Page4Procedure ****************************************************** /*FOLD00*/
  864.  
  865. MRESULT EXPENTRY
  866. SETTINGS :: Page4Procedure (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  867. {
  868.     static PSETTINGS   pset = NULL;
  869.  
  870.     switch (msg)
  871.     {
  872.     case WM_INITDLG:
  873.         {
  874. #ifdef _DOLOGDEBUG_
  875.             LogDebug( "Page4Procedure: start WM_INITDLG" );
  876. #endif
  877.             pset = PSETTINGS (mp2);
  878.  
  879.             pset->GetLanguages(WinWindowFromID (hwnd, WID_LB_LANGUAGES));
  880.  
  881. #ifdef _DOLOGDEBUG_
  882.             LogDebug( "Page4Procedure: WM_INITDLG: after GetLanguages()" );
  883. #endif
  884.             HDIR          hdir;
  885.             ULONG         c, fl;
  886.             FILEFINDBUF3  findbuf;
  887.             APIRET        rc;
  888.             PSZ           psz;
  889.  
  890.             // find all hlps and add the names to the language list
  891.             fl   = FILE_NORMAL;
  892.             hdir = HDIR_CREATE;
  893.             c    = 1;
  894.             rc   = DosFindFirst ("*.hlp", &hdir, fl, &findbuf,
  895.                                  sizeof (findbuf), &c, FIL_STANDARD);
  896. #ifdef _DOLOGDEBUG_
  897.             LogDebug( "Page4Procedure: WM_INITDLG: Entering help file loop ..." );
  898. #endif
  899.             while (!rc)
  900.             {
  901. #ifdef _DOLOGDEBUG_
  902.                 LogDebug( "Page4Procedure: WM_INITDLG: Doing '%s' ...", findbuf.achName );
  903. #endif
  904.                 if ((psz = _getext (findbuf.achName)))
  905.                     *psz = '\0';
  906.                 findbuf.achName[0] = toupper (findbuf.achName[0]);
  907.                 WinInsertLboxItem (WinWindowFromID (hwnd, WID_LB_LANGUAGESHELP),
  908.                                    LIT_END, findbuf.achName);
  909.                 c = 1;
  910.                 rc = DosFindNext (hdir, &findbuf, sizeof (findbuf), &c);
  911.             }
  912.             DosFindClose (hdir);
  913. #ifdef _DOLOGDEBUG_
  914.             LogDebug( "Page4Procedure: WM_INITDLG: help file loop done." );
  915. #endif
  916.  
  917.             WinSendMsg (hwnd, UM_SETTINGS2DIALOG, 0,0);
  918.  
  919.             if (pset->fAutoLanguage)
  920.                 WinEnableWindow (WinWindowFromID (hwnd, WID_ST_LANGNOTE),
  921.                                  FALSE);
  922. #ifdef _DOLOGDEBUG_
  923.             LogDebug( "Page4Procedure: end WM_INITDLG" );
  924. #endif
  925.         }
  926.         return MRESULT (FALSE);
  927.  
  928.     case WM_COMMAND:
  929.         if( SHORT1FROMMP( mp1 ) == DID_CANCEL )
  930.             WinPostMsg( g_hwndSettingsDialog, msg, mp1, mp2 );
  931.         return MRESULT( FALSE );
  932.  
  933.     case UM_SETTINGS2DIALOG:
  934.         {
  935.  
  936. #ifdef _DOLOGDEBUG_
  937.             LogDebug( "Page4Procedure: start UM_SETTINGS2DIALOG" );
  938. #endif
  939.             // select the appropriate entry in the language-listbox
  940.             CHAR     ach[_MAX_FNAME];
  941.             HWND     hwndLB = WinWindowFromID (hwnd, WID_LB_LANGUAGES);
  942.             ULONG    c, i;
  943.  
  944.             c = WinQueryLboxCount (hwndLB);
  945.  
  946.             for (i = 0; i < c; i++)
  947.             {
  948. #ifdef _DOLOGDEBUG_
  949.                 LogDebug( "Page4Procedure: UM_SETTINGS2DIALOG: i.1 = %d", i );
  950. #endif
  951.                 PSZ psz = PSZ(WinSendDlgItemMsg (hwnd, WID_LB_LANGUAGES,
  952.                                                  LM_QUERYITEMHANDLE,
  953.                                                  MPFROMLONG(i), NULL));
  954. //                WinQueryLboxItemText (hwndLB, i, ach, sizeof (ach));
  955.                 if (stricmp (pset->QueryString(SEI_LANGUAGE), psz) == 0)
  956.                     break;
  957.             }
  958. #ifdef _DOLOGDEBUG_
  959.             LogDebug( "Page4Procedure: UM_SETTINGS2DIALOG: after loop 1" );
  960. #endif
  961.             if (i < c)
  962.                 WinSendDlgItemMsg (hwnd, WID_LB_LANGUAGES, LM_SELECTITEM,
  963.                                    MPFROMSHORT (i), MPFROMSHORT (TRUE));
  964.             else
  965.                 WinSendDlgItemMsg (hwnd, WID_LB_LANGUAGES, LM_SELECTITEM,
  966.                                    MPFROMSHORT (0), MPFROMSHORT (TRUE));
  967.             hwndLB = WinWindowFromID (hwnd, WID_LB_LANGUAGESHELP);
  968.             c = WinQueryLboxCount (hwndLB);
  969.  
  970.             for (i = 0; i < c; i++)
  971.             {
  972. #ifdef _DOLOGDEBUG_
  973.                 LogDebug( "Page4Procedure: UM_SETTINGS2DIALOG: i.2 = %d", i );
  974. #endif
  975.                 WinQueryLboxItemText (hwndLB, i, ach, sizeof (ach));
  976.                 if (stricmp (pset->QueryString (SEI_LANGUAGEHELP), ach) == 0)
  977.                     break;
  978.             }
  979. #ifdef _DOLOGDEBUG_
  980.             LogDebug( "Page4Procedure: UM_SETTINGS2DIALOG: after loop 2" );
  981. #endif
  982.             if (i < c)
  983.                 WinSendDlgItemMsg (hwnd, WID_LB_LANGUAGESHELP, LM_SELECTITEM,
  984.                                    MPFROMSHORT (i), MPFROMSHORT (TRUE));
  985.             else
  986.                 WinSendDlgItemMsg (hwnd, WID_LB_LANGUAGESHELP, LM_SELECTITEM,
  987.                                    MPFROMSHORT (0), MPFROMSHORT (TRUE));
  988. #ifdef _DOLOGDEBUG_
  989.             LogDebug( "Page4Procedure: end UM_SETTINGS2DIALOG" );
  990. #endif
  991.         }
  992.         return MRESULT (FALSE);
  993.  
  994.     case WM_DESTROY:
  995.         {
  996.             CHAR   ach[_MAX_FNAME];
  997.  
  998.             ULONG ul = USHORT (WinSendDlgItemMsg (hwnd, WID_LB_LANGUAGES,
  999.                                                   LM_QUERYSELECTION,
  1000.                                                   MPFROMLONG (LIT_FIRST), 0L));
  1001.             PSZ psz = PSZ(WinSendDlgItemMsg (hwnd, WID_LB_LANGUAGES,
  1002.                                              LM_QUERYITEMHANDLE,
  1003.                                              MPFROMLONG(ul), NULL));
  1004.             pset->SetString(SEI_LANGUAGE, psz);
  1005.  
  1006.             ul = USHORT (WinSendDlgItemMsg (hwnd, WID_LB_LANGUAGESHELP,
  1007.                                             LM_QUERYSELECTION,
  1008.                                             MPFROMLONG (LIT_FIRST), 0L));
  1009.             WinSendDlgItemMsg (hwnd, WID_LB_LANGUAGESHELP, LM_QUERYITEMTEXT,
  1010.                                MPFROM2SHORT (ul, sizeof (ach)), MPFROMP (ach));
  1011.             pset->SetString (SEI_LANGUAGEHELP, ach);
  1012.         }
  1013.         return MRESULT (FALSE);
  1014.     }
  1015.  
  1016.     return WinDefDlgProc (hwnd, msg, mp1, mp2);
  1017. }
  1018.  
  1019. // ** AdjustSaveTypeButtons *********************************************** /*fold00*/
  1020.  
  1021. VOID AdjustSaveTypeButtons (BOOL f)
  1022. {
  1023.     HWND   hwndClient = WinWindowFromID (hwndFrame, FID_CLIENT);
  1024.  
  1025.     // FIXME um, em, global variables :-$
  1026.     WinEnableWindow (WinWindowFromID (hwndClient, WID_RB_CLIPBOARD), !f);
  1027.     WinEnableWindow (WinWindowFromID (hwndClient, WID_RB_FILE), !f);
  1028. }
  1029.  
  1030. // ** QueryWindowData ***************************************************** /*fold00*/
  1031.  
  1032. VOID SETTINGS :: QueryWindowData (SWP *pswp, USHORT us[7], BOOL f)
  1033. {
  1034.     // FIXME puke, yukk, choke! get this flag thing away! do it better!
  1035.     // FIXME what is with US?
  1036.     if (f)
  1037.         memcpy (pswp, QueryBinary(SEI_SWPSSW), sizeof (SWP));
  1038.     else
  1039.         memcpy (pswp, QueryBinary(SEI_SWP), sizeof (SWP));
  1040.  
  1041.     LONG  cx, cy;
  1042.     cx = WinQuerySysValue (HWND_DESKTOP, SV_CXSCREEN);
  1043.     cy = WinQuerySysValue (HWND_DESKTOP, SV_CYSCREEN);
  1044.  
  1045.     if (pswp->cx < 32)
  1046.         pswp->cx = 32;
  1047.     // bigger than screen?
  1048.     if (pswp->cx > cx)
  1049.         pswp->cx = cx;
  1050.     // partly outside of screen?
  1051.     if (pswp->x+pswp->cx >= cx)
  1052.         pswp->x = cx-pswp->cx;
  1053.     if (pswp->cy < 32)
  1054.         pswp->cy = 32;
  1055.     // bigger than screen?
  1056.     if (pswp->cy > cy)
  1057.         pswp->cy = cy;
  1058.     // partly outside of screen?
  1059.     if (pswp->y+pswp->cy >= cy)
  1060.         pswp->y = cy-pswp->cy;
  1061. }
  1062.  
  1063. // ** ReloadResources ***************************************************** /*fold00*/
  1064.  
  1065. BOOL Settings :: ReloadResources (PSZ psz)
  1066. {
  1067.     if (g_hmod)
  1068.         DosFreeModule(g_hmod);
  1069.  
  1070.     APIRET  rc;
  1071.  
  1072.     if ((rc = DosLoadModule(PSZ(NULL), 0, psz, &g_hmod)))
  1073.     {
  1074.         DisplayError("ERROR", "Could not (re)load Gotcha! resource module "
  1075.                      "'%s' (DosLoadModule() return code %d). First make sure the DLL is in the LIBPATH. If this is the case, try to delete "
  1076.                      "GOTCHA.INI and start Gotcha! again. If it does not work "
  1077.                      "then, contact the author (thth@gmx.net).", psz, rc);
  1078.         exit(1);
  1079.     }
  1080.  
  1081.     ResourceString::Module(g_hmod);
  1082.  
  1083.     pszPageTab[0] = RSTR (IDS_PAGESAVE);
  1084.     pszPageTab[1] = RSTR (IDS_PAGESNAPSHOT);
  1085.     pszPageTab[2] = RSTR (IDS_PAGEMISC);
  1086.     pszPageTab[3] = RSTR (IDS_PAGELANGUAGE);
  1087.  
  1088.     for( int i = 0; i < BMF_INVALID; i++ ) {
  1089.         ifi[ i ].label = RSTR ( IDS_BITMAP12INTERNAL+i ); }
  1090.  
  1091.     return TRUE;
  1092. }
  1093.  
  1094. // ** SelectLanguage ****************************************************** /*fold00*/
  1095.  
  1096. VOID Settings :: SelectLanguage (VOID)
  1097. {
  1098.     // set this to some default, as we must open the settings dialog for
  1099.     // selecting a language
  1100.     pszPageTab[0] = RSTR (IDS_PAGESAVE);
  1101.     pszPageTab[1] = RSTR (IDS_PAGESNAPSHOT);
  1102.     pszPageTab[2] = RSTR (IDS_PAGEMISC);
  1103.     pszPageTab[3] = RSTR (IDS_PAGELANGUAGE);
  1104.  
  1105.     // bring up the "select language" settings page
  1106.     Dialog (TRUE);
  1107. }
  1108.  
  1109. // ** GetLanguages ******************************************************** /*fold00*/
  1110.  
  1111. USHORT Settings :: GetLanguages (HWND hwnd)
  1112. {
  1113.     // find all dlls and add the names to the language list
  1114.     HDIR          hdir;
  1115.     ULONG         c, fl, ul;
  1116.     FILEFINDBUF3  findbuf;
  1117.     APIRET        rc;
  1118.     PSZ           psz;
  1119.     HMODULE       hmod;
  1120.  
  1121.     fl   = FILE_NORMAL;
  1122.     hdir = HDIR_CREATE;
  1123.     c    = 1;
  1124.     rc   = DosFindFirst ("*.dll", &hdir, fl, &findbuf,
  1125.                          sizeof (findbuf), &c, FIL_STANDARD);
  1126.     while (!rc)
  1127.     {
  1128.         // we don't want the extension
  1129.         if ((psz = _getext (findbuf.achName)))
  1130.             *psz = '\0';
  1131.         // try opening the dll and read the version etc. data
  1132.         if ((rc = DosLoadModule(PSZ(NULL), 0, findbuf.achName, &hmod)) == NO_ERROR) {
  1133.             PVOID pv;
  1134.             if (DosGetResource(hmod, RT_RCDATA, DLL_ID, &pv) == NO_ERROR) {
  1135.                 if (strcmp(PSZ(pv), "Gotcha!") == 0) {
  1136.                     psz = PSZ(pv)+strlen(PSZ(pv))+3;
  1137.                     ul = WinInsertLboxItem (hwnd, LIT_END, psz);
  1138.                     WinSendMsg(hwnd, LM_SETITEMHANDLE, MPFROMLONG(ul),
  1139.                                MPFROMP (strdup(findbuf.achName)));
  1140.                 }
  1141.                 DosFreeResource(pv);
  1142.             }
  1143.             DosFreeModule(hmod);
  1144.         }
  1145.         c = 1;
  1146.         rc = DosFindNext (hdir, &findbuf, sizeof (findbuf), &c);
  1147.     }
  1148.     DosFindClose (hdir);
  1149.  
  1150.     return 1;
  1151. }
  1152.  
  1153. // ** GetFileExtension **************************************************** /*fold00*/
  1154.  
  1155. PSZ Settings :: GetFileExtension( SHORT type = BMF_INVALID )
  1156. {
  1157.     if( type == BMF_INVALID )
  1158.         type = SHORT( QueryFileFormat() );
  1159.     if( ( type >= BMF_12 ) && ( type < BMF_INVALID ) )
  1160.         return ifi[ type ].extension;
  1161.     return "";
  1162. }
  1163.  
  1164. // ** GetFOURCC *********************************************************** /*fold00*/
  1165.  
  1166. FOURCC Settings :: GetFOURCC( SHORT type = BMF_INVALID )
  1167. {
  1168.     if( type == BMF_INVALID )
  1169.         type = SHORT( QueryFileFormat() );
  1170.     if( ( type >= BMF_12 ) && ( type < BMF_INVALID ) )
  1171.         return ifi[ type ].fourcc;
  1172.     return 0L;
  1173. }
  1174.  
  1175. // ** GetFileEAType ******************************************************* /*fold00*/
  1176.  
  1177. PSZ Settings :: GetFileEAType( SHORT type = BMF_INVALID )
  1178. {
  1179.     if( type == BMF_INVALID )
  1180.         type = SHORT( QueryFileFormat() );
  1181.     if( ( type >= BMF_12 ) && ( type < BMF_INVALID ) )
  1182.         return ifi[ type ].eaType;
  1183.     return "";
  1184. }
  1185.  
  1186. // ************************************************************************
  1187.  
  1188. PSZ Settings :: QueryNumSaveDir( VOID )
  1189. {
  1190.     // Using a static buffer here is not really good, but good enough
  1191.     // currently as we know there will be no concurrent access.
  1192.     static CHAR ach[_MAX_PATH];
  1193.  
  1194.     if( strspn( QueryString( SEI_NUMSAVEDIR ), " \t\n\r" ) ==
  1195.         strlen( QueryString( SEI_NUMSAVEDIR ) ) )
  1196.         return getcwd( ach, _MAX_PATH );
  1197.     return QueryString( SEI_NUMSAVEDIR );
  1198. }
  1199.  
  1200. // ************************************************************************
  1201.