home *** CD-ROM | disk | FTP | other *** search
/ ftp.wwiv.com / ftp.wwiv.com.zip / ftp.wwiv.com / pub / MISC / LSW270SR.ZIP / settings.c < prev    next >
Text File  |  2004-04-11  |  37KB  |  1,002 lines

  1. /*
  2.  *      Copyright (C) 1997-2004 Andrei Los.
  3.  *      This file is part of the lSwitcher source package.
  4.  *      lSwitcher is free software; you can redistribute it and/or modify
  5.  *      it under the terms of the GNU General Public License as published
  6.  *      by the Free Software Foundation, in version 2 as it comes in the
  7.  *      "COPYING" file of the lSwitcher main distribution.
  8.  *      This program is distributed in the hope that it will be useful,
  9.  *      but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.  *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.  *      GNU General Public License for more details.
  12.  */
  13.  
  14. #include <string.h>
  15. #include <stdio.h>
  16. #include "prmdlg.h"
  17. #include "settings.h"
  18. #include "lswitch.h"
  19. #include "msg.h"
  20. #include "common.h"
  21. #include "taskbar.h"
  22.  
  23. #define BKM_SETNOTEBOOKBUTTONS   0x0375  /* Set common pushbuttons    */
  24. #define STRLISTDIVIDER "}{!@$#%^&*]["
  25.  
  26.  
  27. VOID GetIniFileName(UCHAR *ucFName,USHORT usLen)
  28. { PPIB ppib;
  29.   PTIB ptib;
  30.   UCHAR *p;
  31.   SHORT k;
  32.  
  33. #ifndef XWORKPLACE
  34.   DosGetInfoBlocks(&ptib,&ppib);
  35.  
  36.   if ((p=strstr(&ppib->pib_pchcmd[strlen(ppib->pib_pchcmd)+1],"/i"))!=NULL ||
  37.       (p=strstr(&ppib->pib_pchcmd[strlen(ppib->pib_pchcmd)+1],"/I"))!=NULL) {
  38.     GetStartupDir(ucFName,usLen);
  39.     for (k = 2; k < strlen(p) && p[k]==' '; k++); // get rid of leading spaces
  40.     strncat(ucFName,&p[k],usLen-strlen(ucFName)-1);
  41.   } else
  42.     strncpy(ucFName,"",usLen);
  43. #else
  44.   GetStartupDir(ucFName,usLen);
  45.   strncat(ucFName,DEFINIFNAME,usLen-strlen(ucFName)-1);
  46. #endif
  47. }
  48.  
  49.  
  50. BOOL CheckSettings(LSWSETTINGS *pSettings)
  51. {
  52.   return (pSettings->ucVerMajor >= LASTINIVERMAJOROK &&
  53.           pSettings->ucVerMinor >= LASTINIVERMINOROK &&
  54.           pSettings->ucRevision >= LASTINIREVISIONOK);
  55. }
  56.  
  57.  
  58. VOID InitSettings(LSWSETTINGS *pSettings)
  59. {
  60.   memset(pSettings, 0, sizeof(LSWSETTINGS));
  61.   pSettings->ucVerMajor = VERSIONMAJOR;
  62.   pSettings->ucVerMinor = VERSIONMINOR;
  63.   pSettings->ucRevision = REVISION;
  64.   pSettings->bShowHidden = pSettings->bShowHiddenTskBar = TRUE;
  65.   pSettings->bShowViewer = pSettings->bShowViewerTskBar = TRUE;
  66.   pSettings->bPMSwitcher = TRUE;
  67.   pSettings->bShowInWinList = TRUE;
  68.   pSettings->bShowHints = TRUE;
  69.   pSettings->lBackColor = DEFBACKRGBCOLOR;
  70.   pSettings->lRaisedFrameColor = DEFRAISEDFRAMECOLOR;
  71.   pSettings->lSunkenFrameColor = DEFSUNKENFRAMECOLOR;
  72.   pSettings->lTitleRGBCol = DEFTITLERGBCOLOR;
  73.   pSettings->lHintsRGBCol = DEFHINTSRGBCOLOR;
  74.   pSettings->lBubbleRGBCol = RGB_WHITE;
  75.   pSettings->lBubbleTextRGBCol = RGB_BLUE/2; //dark blue
  76.   pSettings->bTaskBarOn = TRUE;
  77.   pSettings->bTaskBarAlwaysVisible = TRUE;
  78.   pSettings->bReduceDsk = TRUE;
  79.   pSettings->bFlatButtons = TRUE;
  80.   pSettings->bAllowResize = TRUE;
  81.   pSettings->b3DTaskBar = TRUE;
  82.  
  83.   pSettings->lTskBarRGBCol3D = DEFTSKBARRGBCOL3D;
  84.   pSettings->lNormalBtnRGBCol3D = pSettings->lNormalHiddenBtnRGBCol3D = NORMALBTNRGBCOL3D;
  85.   pSettings->lActiveBtnRGBCol3D = pSettings->lActiveHiddenBtnRGBCol3D = ACTIVEBTNRGBCOL3D;
  86.   pSettings->lNormalBtnTitleRGBCol3D = NORMALBTNTITLERGBCOL3D;
  87.   pSettings->lActiveBtnTitleRGBCol3D = ACTIVEBTNTITLERGBCOL3D;
  88.   pSettings->lNormalHiddenBtnTitleRGBCol3D = pSettings->lActiveHiddenBtnTitleRGBCol3D = HIDDENBTNTITLERGBCOL3D;
  89.  
  90.   pSettings->lTskBarRGBCol = DEFTSKBARRGBCOL;
  91.   pSettings->lNormalBtnRGBCol = pSettings->lNormalHiddenBtnRGBCol = NORMALBTNRGBCOL;
  92.   pSettings->lActiveBtnRGBCol = pSettings->lActiveHiddenBtnRGBCol = ACTIVEBTNRGBCOL;
  93.   pSettings->lNormalBtnTitleRGBCol = NORMALBTNTITLERGBCOL;
  94.   pSettings->lActiveBtnTitleRGBCol = ACTIVEBTNTITLERGBCOL;
  95.   pSettings->lNormalHiddenBtnTitleRGBCol = pSettings->lActiveHiddenBtnTitleRGBCol = HIDDENBTNTITLERGBCOL;
  96.  
  97.   pSettings->sTskBarX = pSettings->sTskBarY = -TSKBARFRAMEWIDTH;
  98.   pSettings->sTskBarCX = WinQuerySysValue(HWND_DESKTOP,SV_CXSCREEN)+2*TSKBARFRAMEWIDTH;
  99.   pSettings->sTskBarCY = WinQuerySysValue(HWND_DESKTOP,SV_CYICON)/2+4+2*BUTTONBORDERWIDTH+2+2*TSKBARFRAMEWIDTH;
  100.   pSettings->usMaxBtnWid = MAXBUTTONWIDTH;
  101.  
  102.   pSettings->ucSettingsKey = 'S';   pSettings->ucSettingsScan = SCAN_SETTINGS;
  103.   pSettings->usSwitchMEvent = WM_BUTTON1CLICK;
  104.   pSettings->usMinMEvent = WM_BUTTON1CLICK;
  105.   pSettings->usCloseMEvent = WM_CHORD;
  106.   pSettings->usScrollDiv = 1;
  107.  
  108.   pSettings->ucLanguage = ENGLISH;
  109.  
  110.   strncpy(pSettings->ucTitleFont,DEFTITLEFONT3,sizeof(pSettings->ucTitleFont));
  111.   strncpy(pSettings->ucHintsFont,DEFHINTSFONT,sizeof(pSettings->ucHintsFont));
  112.   strncpy(pSettings->ucButtonFont,DEFTITLEFONT3,sizeof(pSettings->ucButtonFont));
  113. }
  114.  
  115. USHORT LoadSettings(HAB hab,PSZ pszFName,LSWSETTINGS *pSettings)
  116. { ULONG ulCbBuf,k,ulIndex;
  117.   HINI hini;
  118.   BOOL rc;
  119.   UCHAR *pBuf;
  120.   ENTRYNAME SkipStr;
  121.   SKIPLIST *pSkipList;
  122.  
  123.   if (strlen(pszFName) != 0) {
  124.     if ((hini=PrfOpenProfile(hab,pszFName))==NULLHANDLE) {
  125.       return 1;
  126.     }
  127.   } else
  128.     hini=HINI_USERPROFILE;
  129.  
  130.   ulCbBuf = sizeof(LSWSETTINGS)+2*MAXITEMS*sizeof(ENTRYNAME)+sizeof(STRLISTDIVIDER);
  131.   if ((pBuf = calloc(1,ulCbBuf))==NULL) return 3;
  132.  
  133.   rc = PrfQueryProfileData(hini, PRF_APPNAME, PRF_SETTINGS, pBuf, &ulCbBuf);
  134.   if (pszFName != NULL) PrfCloseProfile(hini);
  135.   if (!rc) return 2;
  136.  
  137.   ulIndex = sizeof(LSWSETTINGS)-2*sizeof(pSettings->SkipListPopup);
  138.  
  139.   memcpy(pSettings,pBuf,ulIndex);
  140.  
  141.   k=0; pSkipList = &pSettings->SkipListPopup;
  142.  
  143.   while (ulIndex < ulCbBuf) {
  144.     if (sscanf(&pBuf[ulIndex],"%[^\0]",SkipStr)!=1 || strlen(SkipStr)==0) break;
  145.  
  146.     ulIndex += strlen(SkipStr)+1;
  147.  
  148.     if (strcmp(SkipStr,STRLISTDIVIDER)==0) {
  149.       k = 0; pSkipList = &pSettings->SkipListTskBar;
  150.       continue;
  151.     }
  152.     (*pSkipList)[k++] = strdup(SkipStr);
  153.   }
  154.  
  155.   free(pBuf);
  156.  
  157.   return 0;
  158. }
  159.  
  160.  
  161. USHORT SaveSettings(HAB hab,PSZ pszFName,LSWSETTINGS *pSettings)
  162. { USHORT k;
  163.   HINI hini;
  164.   BOOL rc;
  165.   UCHAR *pBuf;
  166.   ULONG ulCbBuf,ulIndex;
  167.  
  168.   if (strlen(pszFName) != 0) {
  169.     if ((hini=PrfOpenProfile(hab,pszFName))==NULLHANDLE)
  170.       return 1;
  171.   } else
  172.     hini=HINI_USERPROFILE;
  173.  
  174.   ulCbBuf = sizeof(LSWSETTINGS)+2*MAXITEMS*sizeof(ENTRYNAME)+sizeof(STRLISTDIVIDER);
  175.   if ((pBuf = calloc(1,ulCbBuf))==NULL) return 3;
  176.  
  177.   ulIndex = sizeof(LSWSETTINGS)-2*sizeof(pSettings->SkipListPopup);
  178.   memcpy(pBuf,pSettings,ulIndex);
  179.  
  180.   for (k=0; pSettings->SkipListPopup[k]!=NULL && k<MAXITEMS; k++) {
  181.     strcat(&pBuf[ulIndex],pSettings->SkipListPopup[k]);
  182.     ulIndex += strlen(pSettings->SkipListPopup[k])+1;
  183.   }
  184.  
  185.   if (pSettings->SkipListTskBar[0]!=NULL) {
  186.     strcat(&pBuf[ulIndex],STRLISTDIVIDER);
  187.     ulIndex += strlen(STRLISTDIVIDER)+1;
  188.     for (k=0; pSettings->SkipListTskBar[k]!=NULL && k < MAXITEMS; k++) {
  189.       strcat(&pBuf[ulIndex],pSettings->SkipListTskBar[k]);
  190.       ulIndex += strlen(pSettings->SkipListTskBar[k])+1;
  191.     }
  192.   }
  193.  
  194.   rc = PrfWriteProfileData(hini, PRF_APPNAME, PRF_SETTINGS, pBuf, ulIndex);
  195.  
  196.   if (pszFName != NULL)
  197.     PrfCloseProfile(hini);
  198.  
  199.   free(pBuf);
  200.  
  201.   if (rc)
  202.     return 0;
  203.   else
  204.     return 2;
  205. }
  206.  
  207.  
  208. USHORT DeleteSettings(HAB hab,PSZ pszFName)
  209. { HINI hini;
  210.  
  211.   if (strlen(pszFName) != 0) {
  212.     if ((hini=PrfOpenProfile(hab,pszFName))==NULLHANDLE)
  213.       return 1;
  214.   } else
  215.     hini = HINI_USERPROFILE;
  216.  
  217.   PrfWriteProfileData(hini, PRF_APPNAME, NULL, NULL, 0);
  218.  
  219.   if (pszFName != NULL)
  220.     PrfCloseProfile(hini);
  221.  
  222.   return 0;
  223. }
  224.  
  225.  
  226. VOID EditSettings(LSWDATA *plswData)
  227. {
  228.   if (!plswData->bSettingsDlgOn)
  229.     plswData->hwndParamDlg = WinLoadDlg(HWND_DESKTOP, NULLHANDLE, ParmDlgProc,
  230.                               plswData->hmodRes, DLG_PARAMS, plswData);
  231.  
  232.   if (plswData->hwndParamDlg != NULLHANDLE)
  233.     WinSetWindowPos(plswData->hwndParamDlg,HWND_TOP,0,0,0,0,SWP_SHOW | SWP_ZORDER | SWP_ACTIVATE);
  234. }
  235.  
  236.  
  237. MRESULT EXPENTRY PopupDlgProc(HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)
  238. { static BOOL bInit = FALSE;
  239.   LSWDATA *plswData;
  240.  
  241.   plswData = WinQueryWindowPtr(hwnd,0);
  242.  
  243.   switch (msg) {
  244.   case WM_INITDLG: {
  245.     bInit = TRUE;
  246.     SetControlsFont(hwnd,FALSE);
  247.     DosGetNamedSharedMem((PVOID*)&plswData,SHAREMEM_NAME,PAG_READ | PAG_WRITE);
  248.     WinSetWindowPtr(hwnd,0,plswData);
  249.     DosFreeMem(plswData);
  250.  
  251.     WinCheckButton(hwnd, plswData->Settings.ucPopupHotKey==0?RAD_ALTTAB:
  252.                    plswData->Settings.ucPopupHotKey==1?RAD_CTRLTAB:RAD_WINTAB, TRUE);
  253.     WinCheckButton(hwnd, CHK_PMSWITCHER, plswData->Settings.bPMSwitcher);
  254.     WinCheckButton(hwnd, CHK_PMPOPUPINFS, plswData->Settings.bPMPopupInFS);
  255.     WinCheckButton(hwnd, CHK_SCROLL, plswData->Settings.bScrollItems);
  256.     WinCheckButton(hwnd, CHK_HINTS, plswData->Settings.bShowHints);
  257.     WinCheckButton(hwnd, CHK_STICKY, plswData->Settings.bStickyPopup);
  258.  
  259.     WinEnableControl(hwnd, CHK_PMSWITCHER,(plswData->Settings.ucPopupHotKey==0));
  260.     WinEnableControl(hwnd, CHK_SCROLL,!plswData->Settings.bOldPopup);
  261.  
  262.     WinSendDlgItemMsg(hwnd,SPIN_SCROLLDIV,SPBM_SETLIMITS,MPFROMLONG(9),MPFROMLONG(1));
  263.     WinSendDlgItemMsg(hwnd,SPIN_SCROLLDIV,SPBM_SETTEXTLIMIT,MPFROMSHORT(1),0);
  264.     WinSendDlgItemMsg(hwnd,SPIN_SCROLLDIV,SPBM_SETCURRENTVALUE,MPFROMLONG(plswData->Settings.usScrollDiv),0);
  265.  
  266.     bInit = FALSE;
  267.     return (MRESULT)TRUE;
  268.   }
  269.  
  270.   case WM_CONTROL: {
  271.     BOOL bValue;
  272.  
  273.     if (bInit) break;
  274.     bValue = WinQueryButtonCheckstate(hwnd, SHORT1FROMMP(mp1));
  275.  
  276.     switch (SHORT1FROMMP(mp1)) {
  277.       case SPIN_SCROLLDIV:
  278.         if (SHORT2FROMMP(mp1)==SPBN_CHANGE) {
  279.           LONG ulScrollDiv;
  280.  
  281.           WinSendDlgItemMsg(hwnd,SPIN_SCROLLDIV,SPBM_QUERYVALUE,MPFROMP(&ulScrollDiv),MPFROM2SHORT(0,SPBQ_ALWAYSUPDATE));
  282.           plswData->Settings.usScrollDiv=(USHORT)ulScrollDiv;
  283.         }
  284.         break;
  285.  
  286.       case RAD_ALTTAB:
  287.       case RAD_CTRLTAB:
  288.       case RAD_WINTAB: {
  289.         ULONG ulPostCount;
  290.  
  291.         if      (WinQueryButtonCheckstate(hwnd, RAD_ALTTAB)) plswData->Settings.ucPopupHotKey=0;
  292.         else if (WinQueryButtonCheckstate(hwnd, RAD_CTRLTAB)) plswData->Settings.ucPopupHotKey=1;
  293.         else    plswData->Settings.ucPopupHotKey=2;
  294.         WinEnableControl(hwnd,CHK_PMSWITCHER,(plswData->Settings.ucPopupHotKey==0));
  295.  
  296.         if (plswData->Settings.ucPopupHotKey==0) {
  297.           DosResetEventSem(plswData->hevCtrlTab,&ulPostCount);
  298.           DosResetEventSem(plswData->hevCtrlTab,&ulPostCount);
  299.         } else if (plswData->Settings.ucPopupHotKey==1) {
  300.           DosPostEventSem(plswData->hevCtrlTab);
  301.           DosResetEventSem(plswData->hevWinTab,&ulPostCount);
  302.         } else {
  303.           DosPostEventSem(plswData->hevWinTab);
  304.           DosResetEventSem(plswData->hevCtrlTab,&ulPostCount);
  305.         }
  306.         break;
  307.       }
  308.       case CHK_PMSWITCHER: plswData->Settings.bPMSwitcher = bValue; break;
  309.       case CHK_SCROLL: plswData->Settings.bScrollItems = bValue; break;
  310.       case CHK_HINTS: plswData->Settings.bShowHints = bValue; break;
  311.       case CHK_SWDESKTOP: plswData->Settings.bDesktopMinimizes = bValue; break;
  312.       case CHK_PMPOPUPINFS: plswData->Settings.bPMPopupInFS = bValue; break;
  313.       case CHK_STICKY: plswData->Settings.bStickyPopup = bValue; break;
  314.     }
  315.  
  316.     break;
  317.   }
  318.   default:
  319.     return WinDefDlgProc(hwnd, msg, mp1, mp2);
  320.   }
  321.   return 0;
  322. }
  323.  
  324. MRESULT EXPENTRY ListDlgProc(HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)
  325. { static BOOL bTskBar, bInit=FALSE;
  326.   LSWDATA *plswData;
  327.  
  328.   bTskBar = (WinQueryWindowUShort(hwnd,QWS_ID)==DLG_EXCLUDETSKBAR);
  329.   plswData = WinQueryWindowPtr(hwnd,0);
  330.  
  331.   switch (msg) {
  332.   case WM_INITDLG: {
  333.     PSWBLOCK pswblk;
  334.     ULONG ulItems,k;
  335.     SKIPLIST *pSkipList;
  336.  
  337.     bInit = TRUE;
  338.     SetControlsFont(hwnd,FALSE);
  339.     DosGetNamedSharedMem((PVOID*)&plswData,SHAREMEM_NAME,PAG_READ | PAG_WRITE);
  340.     WinSetWindowPtr(hwnd,0,plswData);
  341.     DosFreeMem(plswData);
  342.  
  343.     bTskBar = PVOIDFROMMP(mp2)!=NULL;
  344.     pSkipList = bTskBar?&plswData->Settings.SkipListTskBar:&plswData->Settings.SkipListPopup;
  345.  
  346.     if (bTskBar) {
  347.       WinDestroyWindow(WinWindowFromID(hwnd, CHK_SHOWVIEWER));
  348.       WinDestroyWindow(WinWindowFromID(hwnd, CHK_SHOWHIDDEN));
  349.       WinDestroyWindow(WinWindowFromID(hwnd, GRP_MINHIDE));
  350.     } else {
  351.       WinCheckButton(hwnd, CHK_SHOWVIEWER, bTskBar?!plswData->Settings.bShowViewerTskBar:!plswData->Settings.bShowViewer);
  352.       WinCheckButton(hwnd, CHK_SHOWHIDDEN, bTskBar?!plswData->Settings.bShowHiddenTskBar:!plswData->Settings.bShowHidden);
  353.     }
  354.  
  355.     for (k = 0; (*pSkipList)[k] != NULL; k++)
  356.       WinSendDlgItemMsg(hwnd,LB_REMOVED,LM_INSERTITEM,MPFROMSHORT(LIT_END), MPFROMP((*pSkipList)[k]));
  357.  
  358.     if ((pswblk=GetSwitchList(WinQueryAnchorBlock(hwnd),TRUE,&ulItems))!=NULL) {
  359.       for (k = 0; k < ulItems; k++)
  360.         if (pswblk->aswentry[k].swctl.uchVisibility==SWL_VISIBLE &&
  361.             !IsInSkipList(&plswData->Settings,pswblk->aswentry[k].swctl.szSwtitle,bTskBar))
  362.           WinSendDlgItemMsg(hwnd,LB_ADDED,LM_INSERTITEM,MPFROMSHORT(LIT_END),
  363.                             MPFROMP(pswblk->aswentry[k].swctl.szSwtitle));
  364.  
  365.       GetSwitchList(0,FALSE,NULL);
  366.     }
  367.     bInit = FALSE;
  368.     return (MRESULT)TRUE;
  369.   }
  370.  
  371.   case WM_COMMAND: {
  372.     switch (SHORT1FROMMP(mp1)) {
  373.     case PB_REMOVE: {
  374.       UCHAR ucName[NAMELEN];
  375.       SHORT iIndex,k;
  376.       PSWBLOCK pswblk;
  377.       ULONG ulItems;
  378.  
  379.       if ((pswblk=GetSwitchList(WinQueryAnchorBlock(hwnd),TRUE,&ulItems))==NULL) break;
  380.  
  381.       while ((iIndex = (SHORT)WinSendDlgItemMsg(hwnd,LB_REMOVED,LM_QUERYSELECTION,MPFROMSHORT(LIT_FIRST),0)) != LIT_NONE) {
  382.         WinSendDlgItemMsg(hwnd,LB_REMOVED,LM_QUERYITEMTEXT,MPFROM2SHORT(iIndex,NAMELEN),MPFROMP(ucName));
  383.         WinSendDlgItemMsg(hwnd,LB_REMOVED,LM_DELETEITEM,MPFROMSHORT(iIndex),0);
  384.  
  385.         for (k = 0; k < ulItems; k++)
  386.           if (strcmpi(ucName,pswblk->aswentry[k].swctl.szSwtitle)==0 &&
  387.               pswblk->aswentry[k].swctl.uchVisibility==SWL_VISIBLE) {
  388.  
  389.             WinSendDlgItemMsg(hwnd,LB_ADDED,LM_INSERTITEM,MPFROMSHORT(LIT_END),MPFROMP(pswblk->aswentry[k].swctl.szSwtitle));
  390.             break;
  391.           }
  392.         RemoveFilter(&plswData->Settings,ucName,bTskBar);
  393.       }
  394.       GetSwitchList(0,FALSE,NULL);
  395.       if (bTskBar && plswData->Settings.bTaskBarOn)
  396.         WinPostMsg(plswData->hwndTaskBarClient,LSWM_INITBUTTONS,0,0);
  397.  
  398.       break;
  399.     }
  400.  
  401.     case PB_ADD: {
  402.       UCHAR ucName[NAMELEN];
  403.       SHORT iIndex;
  404.  
  405.       WinQueryDlgItemText(hwnd,LB_ADDED,sizeof(ucName),MPFROMP(ucName));
  406.       WinSetDlgItemText(hwnd,LB_ADDED,NULL);
  407.  
  408.       if (!AddFilter(&plswData->Settings,ucName,bTskBar)) break;
  409.  
  410.       iIndex = (SHORT)WinSendDlgItemMsg(hwnd,LB_ADDED,LM_SEARCHSTRING,MPFROM2SHORT(0,LIT_FIRST),MPFROMP(ucName));
  411.       if (iIndex!=LIT_NONE && iIndex!=LIT_ERROR)
  412.         WinSendDlgItemMsg(hwnd,LB_ADDED,LM_DELETEITEM,MPFROMSHORT(iIndex),0);
  413.       WinSendDlgItemMsg(hwnd,LB_REMOVED,LM_INSERTITEM,MPFROMSHORT(LIT_END),MPFROMP(ucName));
  414.  
  415.       if (bTskBar && plswData->Settings.bTaskBarOn)
  416.         WinPostMsg(plswData->hwndTaskBarClient,LSWM_INITBUTTONS,0,0);
  417.  
  418.       break;
  419.     }
  420.  
  421.     case PB_REFRESH: {
  422.       PSWBLOCK pswblk;
  423.       ULONG ulItems,k;
  424.  
  425.       WinSendDlgItemMsg(hwnd,LB_ADDED,LM_DELETEALL,0,0);
  426.  
  427.       if ((pswblk=GetSwitchList(WinQueryAnchorBlock(hwnd),TRUE,&ulItems))!=NULL) {
  428.         for (k = 0; k < ulItems; k++)
  429.           if (pswblk->aswentry[k].swctl.uchVisibility==SWL_VISIBLE &&
  430.               !IsInSkipList(&plswData->Settings,pswblk->aswentry[k].swctl.szSwtitle,bTskBar))
  431.             WinSendDlgItemMsg(hwnd,LB_ADDED,LM_INSERTITEM,MPFROMSHORT(LIT_END),
  432.                               MPFROMP(pswblk->aswentry[k].swctl.szSwtitle));
  433.  
  434.         GetSwitchList(0,FALSE,NULL);
  435.       }
  436.  
  437.       break;
  438.     }
  439.     }
  440.     break;
  441.   }
  442.  
  443.   case WM_CONTROL: {
  444.     BOOL bValue;
  445.  
  446.     switch (SHORT1FROMMP(mp1)) {
  447.     case CHK_SHOWVIEWER:
  448.     case CHK_SHOWHIDDEN:
  449.       if (bInit) break;
  450.  
  451.       bValue = !WinQueryButtonCheckstate(hwnd, CHK_SHOWVIEWER);
  452.       if (bTskBar) plswData->Settings.bShowViewerTskBar = bValue; else plswData->Settings.bShowViewer = bValue;
  453.       bValue = !WinQueryButtonCheckstate(hwnd, CHK_SHOWHIDDEN);
  454.       if (bTskBar) plswData->Settings.bShowHiddenTskBar = bValue; else plswData->Settings.bShowHidden = bValue;
  455.  
  456.       if (bTskBar && plswData->Settings.bTaskBarOn)
  457.         WinPostMsg(plswData->hwndTaskBarClient,LSWM_INITBUTTONS,0,0);
  458.  
  459.       break;
  460.  
  461.     case LB_ADDED:
  462.       if (SHORT2FROMMP(mp1) == CBN_ENTER)
  463.         WinPostMsg(hwnd, WM_COMMAND, (MPARAM)PB_ADD, MPFROM2SHORT(CMDSRC_OTHER, FALSE));
  464.       break;
  465.     }
  466.  
  467.     break;
  468.   }
  469.   default:
  470.     return WinDefDlgProc(hwnd, msg, mp1, mp2);
  471.   }
  472.  
  473.   return (MRESULT)0;
  474. }
  475.  
  476.  
  477. MRESULT EXPENTRY TaskBarDlgProc(HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)
  478. { static BOOL bInit = FALSE;
  479.   LSWDATA *plswData;
  480.  
  481.   plswData = WinQueryWindowPtr(hwnd,0);
  482.  
  483.   switch (msg) {
  484.   case WM_INITDLG: {
  485.     ULONG ulMenuEvent;
  486.     USHORT usEvent;
  487.  
  488.     bInit = TRUE;
  489.     SetControlsFont(hwnd,FALSE);
  490.  
  491.     DosGetNamedSharedMem((PVOID*)&plswData,SHAREMEM_NAME,PAG_READ | PAG_WRITE);
  492.     WinSetWindowPtr(hwnd,0,plswData);
  493.     DosFreeMem(plswData);
  494.  
  495. #ifndef XWORKPLACE
  496.     WinCheckButton(hwnd, CHK_TASKBARON, plswData->Settings.bTaskBarOn);
  497.     WinCheckButton(hwnd, CHK_TASKBARALWAYSVISIBLE, !plswData->Settings.bTaskBarAlwaysVisible);
  498.     WinCheckButton(hwnd, plswData->Settings.bTaskBarTopScr?RAD_TOP:RAD_BOTTOM, TRUE);
  499.     WinCheckButton(hwnd, CHK_REDUCEDSK, plswData->Settings.bReduceDsk);
  500.     WinEnableControl(hwnd, CHK_REDUCEDSK, plswData->Settings.bTaskBarAlwaysVisible);
  501.     WinCheckButton(hwnd, CHK_FLATBTN, plswData->Settings.bFlatButtons);
  502.     WinCheckButton(hwnd, CHK_ALLOWRESIZE, plswData->Settings.bAllowResize);
  503.     WinEnableControl(hwnd, CHK_TSKBARGROW,plswData->Settings.bIconsOnlyInTskBar);
  504.     WinCheckButton(hwnd, CHK_TSKBARGROW, plswData->Settings.bTskBarGrow);
  505. #else
  506.     WinEnableControl(hwnd, CHK_TASKBARON,FALSE);
  507.     WinEnableControl(hwnd, CHK_TASKBARALWAYSVISIBLE,FALSE);
  508.     WinEnableControl(hwnd, RAD_TOP,FALSE);
  509.     WinEnableControl(hwnd, RAD_BOTTOM,FALSE);
  510.     WinEnableControl(hwnd, CHK_REDUCEDSK,FALSE);
  511.     WinEnableControl(hwnd, CHK_FLATBTN,FALSE);
  512.     WinEnableControl(hwnd, CHK_ALLOWRESIZE,FALSE);
  513.     WinEnableControl(hwnd, CHK_TSKBARGROW,FALSE);
  514. #endif
  515.  
  516.     WinEnableControl(hwnd, SPIN_BTNWID,!plswData->Settings.bIconsOnlyInTskBar);
  517.  
  518.     WinCheckButton(hwnd, CHK_ICONSONLYTSKBAR, plswData->Settings.bIconsOnlyInTskBar);
  519.     WinCheckButton(hwnd, CHK_GROUPITEMS, plswData->Settings.bGroupItems);
  520.     WinCheckButton(hwnd, CHK_3DTASKBAR, plswData->Settings.b3DTaskBar);
  521.  
  522.     WinSendDlgItemMsg(hwnd,SPIN_BTNWID,SPBM_SETLIMITS,MPFROMLONG(WinQuerySysValue(HWND_DESKTOP,SV_CXSCREEN)),MPFROMLONG(WinQuerySysValue(HWND_DESKTOP,SV_CYICON)/2+2*BUTTONBORDERWIDTH+2+2*TSKBARFRAMEWIDTH));
  523.     WinSendDlgItemMsg(hwnd,SPIN_BTNWID,SPBM_SETTEXTLIMIT,MPFROMSHORT(4),0);
  524.     WinSendDlgItemMsg(hwnd,SPIN_BTNWID,SPBM_SETCURRENTVALUE,MPFROMLONG(plswData->Settings.usMaxBtnWid),0);
  525.  
  526.     usEvent=plswData->Settings.usSwitchMEvent;
  527.     WinCheckButton(hwnd, usEvent==WM_BUTTON1CLICK?RAD_SWMBTN1:
  528.                          usEvent==WM_BUTTON2CLICK?RAD_SWMBTN2:
  529.                          usEvent==WM_BUTTON3CLICK?RAD_SWMBTN3:RAD_SWMBTN12, TRUE);
  530.  
  531.     usEvent=plswData->Settings.usMinMEvent;
  532.     WinCheckButton(hwnd, usEvent==WM_BUTTON1CLICK?RAD_MINMBTN1:
  533.                          usEvent==WM_BUTTON2CLICK?RAD_MINMBTN2:
  534.                          usEvent==WM_BUTTON3CLICK?RAD_MINMBTN3:RAD_MINMBTN12, TRUE);
  535.  
  536.     usEvent=plswData->Settings.usCloseMEvent;
  537.     WinCheckButton(hwnd, usEvent==WM_BUTTON1CLICK?RAD_CLOSEMBTN1:
  538.                          usEvent==WM_BUTTON2CLICK?RAD_CLOSEMBTN2:
  539.                          usEvent==WM_BUTTON3CLICK?RAD_CLOSEMBTN3:RAD_CLOSEMBTN12, TRUE);
  540.  
  541.     if (WinQuerySysValue(HWND_DESKTOP,SV_CMOUSEBUTTONS)<3) {
  542.       WinEnableControl(hwnd, RAD_SWMBTN3,FALSE);
  543.       WinEnableControl(hwnd, RAD_MINMBTN3,FALSE);
  544.       WinEnableControl(hwnd, RAD_CLOSEMBTN3,FALSE);
  545.     }
  546.     ulMenuEvent = WinQuerySysValue(HWND_DESKTOP,SV_CONTEXTMENU);
  547.     if (LOUSHORT(ulMenuEvent)==WM_BUTTON1CLICK && HIUSHORT(ulMenuEvent)==0) {
  548.       WinEnableControl(hwnd, RAD_SWMBTN1,FALSE);
  549.       WinEnableControl(hwnd, RAD_MINMBTN1,FALSE);
  550.       WinEnableControl(hwnd, RAD_CLOSEMBTN1,FALSE);
  551.     } else if (LOUSHORT(ulMenuEvent)==WM_BUTTON2CLICK && HIUSHORT(ulMenuEvent)==0) {
  552.       WinEnableControl(hwnd, RAD_SWMBTN2,FALSE);
  553.       WinEnableControl(hwnd, RAD_MINMBTN2,FALSE);
  554.       WinEnableControl(hwnd, RAD_CLOSEMBTN2,FALSE);
  555.     }
  556.  
  557.     bInit = FALSE;
  558.  
  559.     return (MRESULT)TRUE;
  560.   }
  561.   case WM_CONTROL: {
  562.     BOOL bValue;
  563.  
  564.     if (bInit) break;
  565.     bValue = WinQueryButtonCheckstate(hwnd,SHORT1FROMMP(mp1));
  566.  
  567.     switch (SHORT1FROMMP(mp1)) {
  568.       case SPIN_BTNWID:
  569.         if (SHORT2FROMMP(mp1)==SPBN_CHANGE) {
  570.           ULONG ulBtnWid;
  571.           SWP swp;
  572.  
  573.           WinSendDlgItemMsg(hwnd,SPIN_BTNWID,SPBM_QUERYVALUE,MPFROMP(&ulBtnWid),MPFROM2SHORT(0,SPBQ_ALWAYSUPDATE));
  574.           plswData->Settings.usMaxBtnWid=(USHORT)ulBtnWid;
  575.           WinQueryWindowPos(plswData->hwndTaskBarClient,&swp);
  576.           WinPostMsg(plswData->hwndTaskBarClient,WM_SIZE,MPFROM2SHORT(swp.cx,swp.cy),MPFROM2SHORT(swp.cx,swp.cy));
  577.         }
  578.         break;
  579.  
  580.       case CHK_TASKBARON:
  581.         plswData->Settings.bTaskBarOn = bValue;
  582.         if (bValue) InitTaskBar(plswData,NULL,0); else DoneTaskBar(plswData);
  583.         break;
  584.  
  585.       case CHK_TASKBARALWAYSVISIBLE:
  586.         plswData->Settings.bTaskBarAlwaysVisible = !bValue;
  587.         WinEnableControl(hwnd, CHK_REDUCEDSK, plswData->Settings.bTaskBarAlwaysVisible);
  588.         WinShowWindow(plswData->hwndTaskBar,!bValue);
  589.         break;
  590.  
  591.       case CHK_ICONSONLYTSKBAR: {
  592.         SWP swp;
  593.         plswData->Settings.bIconsOnlyInTskBar = bValue;
  594.         WinQueryWindowPos(plswData->hwndTaskBarClient,&swp);
  595.         WinPostMsg(plswData->hwndTaskBarClient,WM_SIZE,MPFROM2SHORT(swp.cx,swp.cy),MPFROM2SHORT(swp.cx,swp.cy));
  596.         WinEnableControl(hwnd, SPIN_BTNWID,!bValue);
  597. #ifndef XWORKPLACE
  598.         if (!bValue && plswData->Settings.bTskBarGrow) {
  599.           plswData->Settings.bTskBarGrow=FALSE;
  600.           WinSetWindowPos(plswData->hwndTaskBar,0,0,0,
  601.                           WinQuerySysValue(HWND_DESKTOP,SV_CXSCREEN)+2*TSKBARFRAMEWIDTH,
  602.                           plswData->Settings.sTskBarCY,SWP_SIZE);
  603.           WinCheckButton(hwnd,CHK_TSKBARGROW,FALSE);
  604.         }
  605.         WinEnableControl(hwnd, CHK_TSKBARGROW,bValue);
  606. #endif
  607.         break;
  608.       }
  609.       case CHK_REDUCEDSK:
  610.         plswData->Settings.bReduceDsk = bValue;
  611.         break;
  612.  
  613.       case CHK_FLATBTN:
  614.         plswData->Settings.bFlatButtons = bValue;
  615.         WinInvalidateRect(plswData->hwndTaskBar,NULL,TRUE);
  616.         break;
  617.  
  618.       case CHK_3DTASKBAR:
  619.         plswData->Settings.b3DTaskBar = bValue;
  620.         WinInvalidateRect(plswData->hwndTaskBarClient,NULL,TRUE);
  621.         break;
  622.  
  623.       case CHK_GROUPITEMS:
  624.         plswData->Settings.bGroupItems = bValue;
  625.         WinPostMsg(plswData->hwndTaskBarClient,LSWM_INITBUTTONS,0,0);
  626.         break;
  627.  
  628.       case CHK_ALLOWRESIZE: {
  629.         ULONG flFrameFlags=WinQueryWindowULong(plswData->hwndTaskBar,QWL_STYLE);
  630.  
  631.         plswData->Settings.bAllowResize = bValue;
  632.         if (bValue) {
  633.           flFrameFlags&=~FS_BORDER; flFrameFlags|=FS_SIZEBORDER;
  634.         } else {
  635.           flFrameFlags&=~FS_SIZEBORDER; flFrameFlags|=FS_BORDER;
  636.         }
  637.         WinSetWindowULong(plswData->hwndTaskBar,QWL_STYLE,flFrameFlags);
  638.         break;
  639.       }
  640.       case CHK_TSKBARGROW: {
  641.         ULONG flFrameFlags=WinQueryWindowULong(plswData->hwndTaskBar,QWL_STYLE);
  642.  
  643.         plswData->Settings.bTskBarGrow = bValue;
  644.         WinEnableControl(hwnd, CHK_ALLOWRESIZE, !bValue);
  645.  
  646.         if (!bValue) {
  647.           flFrameFlags&=~FS_BORDER; flFrameFlags|=FS_SIZEBORDER;
  648.         } else {
  649.           flFrameFlags&=~FS_SIZEBORDER; flFrameFlags|=FS_BORDER;
  650.         }
  651.         WinSetWindowULong(plswData->hwndTaskBar,QWL_STYLE,flFrameFlags);
  652.  
  653.         if (bValue) {
  654.           HENUM henum;
  655.           HWND hwndNext;
  656.           USHORT usButtons;
  657.  
  658.           henum = WinBeginEnumWindows(plswData->hwndTaskBarClient); usButtons = 0;
  659.           while ((hwndNext=WinGetNextWindow(henum))!=NULLHANDLE) {
  660.             if (IsWindowClass(hwndNext,"#3"))
  661.               usButtons++;
  662.           }
  663.           WinEndEnumWindows(henum);
  664.  
  665.           WinSetWindowPos(plswData->hwndTaskBar,0,0,0,
  666.                           (WinQuerySysValue(HWND_DESKTOP,SV_CXICON)/2+2*BUTTONBORDERWIDTH+2)*usButtons+2*TSKBARFRAMEWIDTH,
  667.                           plswData->Settings.sTskBarCY,SWP_SIZE);
  668.         } else
  669.           WinSetWindowPos(plswData->hwndTaskBar,0,0,0,
  670.                           WinQuerySysValue(HWND_DESKTOP,SV_CXSCREEN)+2*TSKBARFRAMEWIDTH,
  671.                           plswData->Settings.sTskBarCY,SWP_SIZE);
  672.  
  673.         break;
  674.       }
  675.       case RAD_TOP:
  676.       case RAD_BOTTOM:
  677.         plswData->Settings.bTaskBarTopScr = WinQueryButtonCheckstate(hwnd, RAD_TOP);
  678.         if (plswData->Settings.bTaskBarTopScr)
  679.           plswData->Settings.sTskBarY = WinQuerySysValue(HWND_DESKTOP,SV_CYSCREEN)-plswData->Settings.sTskBarCY+TSKBARFRAMEWIDTH;
  680.         else
  681.           plswData->Settings.sTskBarY = -TSKBARFRAMEWIDTH;
  682.  
  683.         WinSetWindowPos(plswData->hwndTaskBar,0 ,
  684.                         plswData->Settings.sTskBarX,plswData->Settings.sTskBarY,
  685.                         plswData->Settings.sTskBarCX,plswData->Settings.sTskBarCY,
  686.                         SWP_MOVE);
  687.         break;
  688.  
  689.       case RAD_SWMBTN1:
  690.       case RAD_SWMBTN2:
  691.       case RAD_SWMBTN3:
  692.       case RAD_SWMBTN12:
  693.         plswData->Settings.usSwitchMEvent =
  694.           (WinQueryButtonCheckstate(hwnd,RAD_SWMBTN1)?WM_BUTTON1CLICK:
  695.            WinQueryButtonCheckstate(hwnd,RAD_SWMBTN2)?WM_BUTTON2CLICK:
  696.            WinQueryButtonCheckstate(hwnd,RAD_SWMBTN3)?WM_BUTTON3CLICK:WM_CHORD);
  697.         break;
  698.  
  699.       case RAD_MINMBTN1:
  700.       case RAD_MINMBTN2:
  701.       case RAD_MINMBTN3:
  702.       case RAD_MINMBTN12:
  703.         plswData->Settings.usMinMEvent =
  704.           (WinQueryButtonCheckstate(hwnd,RAD_MINMBTN1)?WM_BUTTON1CLICK:
  705.            WinQueryButtonCheckstate(hwnd,RAD_MINMBTN2)?WM_BUTTON2CLICK:
  706.            WinQueryButtonCheckstate(hwnd,RAD_MINMBTN3)?WM_BUTTON3CLICK:WM_CHORD);
  707.         break;
  708.  
  709.       case RAD_CLOSEMBTN1:
  710.       case RAD_CLOSEMBTN2:
  711.       case RAD_CLOSEMBTN3:
  712.       case RAD_CLOSEMBTN12:
  713.         plswData->Settings.usCloseMEvent =
  714.           (WinQueryButtonCheckstate(hwnd,RAD_CLOSEMBTN1)?WM_BUTTON1CLICK:
  715.            WinQueryButtonCheckstate(hwnd,RAD_CLOSEMBTN2)?WM_BUTTON2CLICK:
  716.            WinQueryButtonCheckstate(hwnd,RAD_CLOSEMBTN3)?WM_BUTTON3CLICK:WM_CHORD);
  717.         break;
  718.     }
  719.  
  720.     break;
  721.   }
  722.   default:
  723.     return WinDefDlgProc(hwnd, msg, mp1, mp2);
  724.   }
  725.   return 0;
  726. }
  727.  
  728. MRESULT EXPENTRY HotkeyWndProc(HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)
  729. {
  730.   switch (msg) {
  731.   case WM_CHAR:
  732.     if (SHORT1FROMMP(mp1) & KC_CHAR)
  733.     WinSendMsg(WinQueryWindow(hwnd,QW_OWNER),WM_CONTROL,
  734.       MPFROM2SHORT(WinQueryWindowUShort(hwnd,QWS_ID),EN_SCANCODE),MPFROMCHAR(CHAR4FROMMP(mp1)));
  735.   default:
  736.     return (((PFNWP)WinQueryWindowPtr(hwnd,0))(hwnd,msg,mp1,mp2));
  737.   }
  738. }
  739.  
  740. MRESULT EXPENTRY MiscDlgProc(HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)
  741. { static BOOL bInit;
  742.   LSWDATA *plswData;
  743.   static UCHAR ucLangArr[128];
  744.  
  745.   plswData = WinQueryWindowPtr(hwnd,0);
  746.  
  747.   switch (msg) {
  748.   case WM_INITDLG: {
  749.     static UCHAR ucDllName[_MAX_PATH], ucLangStr[32], ucLang;
  750.  
  751.     bInit = TRUE;
  752.     SetControlsFont(hwnd,FALSE);
  753.     DosGetNamedSharedMem((PVOID*)&plswData,SHAREMEM_NAME,PAG_READ | PAG_WRITE);
  754.     WinSetWindowPtr(hwnd,0,plswData);
  755.     DosFreeMem(plswData);
  756.  
  757.     WinCheckButton(hwnd, CHK_SWDESKTOP, plswData->Settings.bDesktopMinimizes);
  758. #ifndef XWORKPLACE
  759.     WinCheckButton(hwnd, CHK_SHOWINWINLIST, plswData->Settings.bShowInWinList);
  760. #else
  761.     WinEnableControl(hwnd,CHK_SHOWINWINLIST,FALSE);
  762. #endif
  763.     WinCheckButton(hwnd, CHK_ZORDER, plswData->Settings.bChangeZOrder);
  764.  
  765.     WinSendDlgItemMsg(hwnd,EF_HOTKEY,EM_SETTEXTLIMIT,MPFROMSHORT(1),0);
  766.     WinSetDlgItemText(hwnd,EF_HOTKEY,&plswData->Settings.ucSettingsKey);
  767.  
  768.     WinSetWindowPtr(WinWindowFromID(hwnd,EF_HOTKEY),0,
  769.                    (VOID *)WinSubclassWindow(WinWindowFromID(hwnd,EF_HOTKEY),HotkeyWndProc));
  770.  
  771.     while (FindResDll(ucDllName, sizeof(ucDllName), &ucLang, ucLangStr, sizeof(ucLangStr)))
  772.       if (ucLang!=0) {
  773.         SHORT sIndex;
  774.  
  775.         sIndex = (SHORT)WinSendDlgItemMsg(hwnd,COMBO_LANG,LM_INSERTITEM,MPFROMSHORT(LIT_END), MPFROMP(ucLangStr));
  776.         if (sIndex!=LIT_ERROR) {
  777.           ucLangArr[sIndex]=ucLang;
  778.           if (ucLang == plswData->Settings.ucLanguage)
  779.             WinSendDlgItemMsg(hwnd,COMBO_LANG,LM_SELECTITEM,MPFROMSHORT(sIndex), MPFROMSHORT(TRUE));
  780.         }
  781.       }
  782.  
  783.     bInit = FALSE;
  784.     return (MRESULT)TRUE;
  785.   }
  786.  
  787.   case WM_CONTROL:
  788.     if (bInit) break;
  789.  
  790.     switch (SHORT1FROMMP(mp1)) {
  791.       case COMBO_LANG:
  792.         if (SHORT2FROMMP(mp1)==CBN_EFCHANGE) {
  793.           SHORT sIndex;
  794.  
  795.           sIndex = (SHORT)WinSendDlgItemMsg(hwnd,COMBO_LANG,LM_QUERYSELECTION,MPFROMSHORT(LIT_FIRST), 0);
  796.           if (sIndex>=0 && ucLangArr[sIndex]!=plswData->Settings.ucLanguage) {
  797.             WinDestroyAccelTable(plswData->haccAlt);
  798.             WinDestroyAccelTable(plswData->haccCtrl);
  799.             WinDestroyAccelTable(plswData->haccNoAlt);
  800.             DosFreeModule(plswData->hmodRes);
  801.  
  802.             if ((plswData->hmodRes = LoadResource(ucLangArr[sIndex],plswData,FALSE))==0) {
  803.               plswData->hmodRes = LoadResource(plswData->Settings.ucLanguage,plswData,TRUE);
  804.               WinMessageBox(HWND_DESKTOP,HWND_DESKTOP,"Could not find resource DLL or resource DLL invalid",PGMNAME,0,MB_ERROR | MB_CANCEL);
  805.             }
  806.           }
  807.         }
  808.         break;
  809.  
  810.       case EF_HOTKEY:
  811.         if (SHORT2FROMMP(mp1)==EN_CHANGE) {
  812.           UCHAR buf[3];
  813.  
  814.           WinQueryDlgItemText(hwnd,EF_HOTKEY,sizeof(buf),buf);
  815.           plswData->Settings.ucSettingsKey=buf[0];
  816.         } else if (SHORT2FROMMP(mp1)==EN_SCANCODE) {
  817.           plswData->Settings.ucSettingsScan = CHAR1FROMMP(mp2);
  818.         }
  819.         break;
  820.  
  821.       case CHK_ZORDER:
  822.         plswData->Settings.bChangeZOrder = WinQueryButtonCheckstate(hwnd, CHK_ZORDER);
  823.         break;
  824.  
  825.       case CHK_SWDESKTOP:
  826.         plswData->Settings.bDesktopMinimizes = WinQueryButtonCheckstate(hwnd, CHK_SWDESKTOP);
  827.         break;
  828.  
  829.       case CHK_SHOWINWINLIST: {
  830.         SHORT iIndex;
  831.         SWCNTRL swctl;
  832.         PID pidPid; TID tidTid;
  833.  
  834.         WinQueryWindowProcess(hwnd,&pidPid,&tidTid);
  835.         WinQuerySwitchEntry(WinQuerySwitchHandle(0,pidPid),&swctl);
  836.  
  837.         plswData->Settings.bShowInWinList = WinQueryButtonCheckstate(hwnd, CHK_SHOWINWINLIST);
  838.         WinQuerySwitchEntry(plswData->hswitch, &swctl);
  839.         swctl.uchVisibility = plswData->Settings.bShowInWinList ? SWL_VISIBLE : SWL_INVISIBLE;
  840.         WinChangeSwitchEntry(plswData->hswitch, &swctl);
  841.  
  842.         if ((SHORT)(WinSendDlgItemMsg(hwnd,LB_REMOVED,LM_SEARCHSTRING,
  843.                                       MPFROM2SHORT(LSS_CASESENSITIVE,LIT_FIRST),
  844.                                       MPFROMP(swctl.szSwtitle)))==LIT_NONE) {
  845.           iIndex = (SHORT)(WinSendDlgItemMsg(hwnd,LB_ADDED,LM_SEARCHSTRING,
  846.                                            MPFROM2SHORT(LSS_CASESENSITIVE,LIT_FIRST),
  847.                                            MPFROMP(swctl.szSwtitle)));
  848.           if (plswData->Settings.bShowInWinList && iIndex==LIT_NONE)
  849.             WinSendDlgItemMsg(hwnd,LB_ADDED,LM_INSERTITEM,MPFROMSHORT(LIT_END),MPFROMP(swctl.szSwtitle));
  850.           else if (!plswData->Settings.bShowInWinList && iIndex!=LIT_ERROR && iIndex!=LIT_NONE)
  851.             WinSendDlgItemMsg(hwnd,LB_ADDED,LM_DELETEITEM,MPFROMSHORT(iIndex),0);
  852.         }
  853.         break;
  854.       }
  855.     }
  856.     break;
  857.  
  858.   default:
  859.     return WinDefDlgProc(hwnd, msg, mp1, mp2);
  860.   }
  861.   return 0;
  862. }
  863.  
  864. MRESULT EXPENTRY ParmDlgProc(HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)
  865. { static ULONG ulPopupFiltID, ulTskBarFiltID;
  866.   LSWDATA *plswData;
  867.  
  868.   plswData = WinQueryWindowPtr(hwnd,0);
  869.  
  870.   switch (msg) {
  871.   case WM_INITDLG: {
  872.     HWND  hwndPage, hwndNB;
  873.     ULONG ulPageId;
  874.     RECTL rcl;
  875.     UCHAR ucBuf[64],ucBuf1[64];
  876.     SWP swp;
  877.     USHORT usDlgID,k,usNameID;
  878.     PFNWP pfnDlg;
  879.  
  880.     plswData = (PLSWDATA)PVOIDFROMMP(mp2);
  881.     WinSetWindowPtr(hwnd,0,plswData);
  882.     SetControlsFont(hwnd,FALSE);
  883.  
  884.     hwndNB = WinWindowFromID(hwnd,NB_PARAMS);
  885.  
  886.     WinSendMsg(hwndNB, BKM_SETNOTEBOOKCOLORS, MPFROMLONG(SYSCLR_FIELDBACKGROUND),
  887.       MPFROMSHORT(BKA_BACKGROUNDPAGECOLORINDEX));
  888.  
  889.     for (k = 0; k < 5; k++) {
  890.       switch (k) {
  891.       case 0: usDlgID = usNameID = DLG_POPUP;   pfnDlg = PopupDlgProc; break;
  892.       case 1: usDlgID = DLG_EXCLUDE; usNameID = DLG_POPUP; pfnDlg = ListDlgProc;  break;
  893.       case 2: usDlgID = usNameID = DLG_TASKBAR; pfnDlg = TaskBarDlgProc; break;
  894.       case 3: usDlgID = DLG_EXCLUDE; usNameID = DLG_TASKBAR; pfnDlg = ListDlgProc;  break;
  895.       case 4: usDlgID = usNameID = DLG_MISC;    pfnDlg = MiscDlgProc; break;
  896.       }
  897.  
  898.       ulPageId = (LONG)WinSendMsg(hwndNB, BKM_INSERTPAGE, 0,
  899.                  MPFROM2SHORT(BKA_AUTOPAGESIZE | (usDlgID==DLG_EXCLUDE?0:BKA_MAJOR) | BKA_STATUSTEXTON, BKA_LAST));
  900.       hwndPage = WinLoadDlg(hwndNB, hwndNB, pfnDlg, plswData->hmodRes, usDlgID, k==3?plswData:NULL);
  901.       WinSendMsg(hwndNB, BKM_SETPAGEWINDOWHWND, MPFROMLONG(ulPageId), MPFROMHWND(hwndPage));
  902.  
  903.       WinLoadString(WinQueryAnchorBlock(hwnd), plswData->hmodRes,usNameID,sizeof(ucBuf),ucBuf);
  904.       WinSendMsg(hwndNB, BKM_SETTABTEXT, MPFROMLONG(ulPageId), MPFROMP(ucBuf));
  905.  
  906.       if (k==1) {
  907.         WinQueryWindowRect(hwndPage,&rcl);
  908.         WinSendMsg(hwndNB, BKM_CALCPAGERECT, MPFROMP(&rcl), MPFROMSHORT(FALSE));
  909.         WinQueryWindowPos(WinWindowFromID(hwnd,PB_SAVE),&swp);
  910.         WinSetWindowPos(hwnd,0,0,0,rcl.xRight-rcl.xLeft+8, rcl.yTop-rcl.yBottom+swp.y+
  911.                         swp.cy+swp.cy/2+2*WinQuerySysValue(HWND_DESKTOP,SV_CYTITLEBAR), SWP_SIZE);
  912.         ulPopupFiltID = ulPageId;
  913.       }
  914.  
  915.       if (k==3) {
  916.         WinSetWindowUShort(hwndPage,QWS_ID,DLG_EXCLUDETSKBAR);
  917.         ulTskBarFiltID = ulPageId;
  918.       }
  919.  
  920.       if (k < 4) {
  921.         WinLoadString(WinQueryAnchorBlock(hwnd), plswData->hmodRes, STR_DLGPAGE,sizeof(ucBuf1),ucBuf1);
  922.         sprintf(ucBuf,ucBuf1,(k+1)%2==0?2:1,2);
  923.         WinSendMsg(hwndNB,BKM_SETSTATUSLINETEXT,MPFROMLONG(ulPageId),MPFROMP(ucBuf));
  924.       }
  925.     }
  926.  
  927. #ifdef XWORKPLACE
  928.     WinDestroyWindow(WinWindowFromID(hwnd,PB_EXIT));
  929. #endif
  930.     WinSetFocus(HWND_DESKTOP, hwndNB);
  931.  
  932.     plswData->bSettingsDlgOn = TRUE;
  933.  
  934.     return (MRESULT)TRUE;
  935.   }
  936.  
  937.   case WM_ADJUSTWINDOWPOS: {
  938.     PSWP pswp;
  939.     SWP swp;
  940.  
  941.     pswp=PVOIDFROMMP(mp1);
  942.     if (pswp->fl & SWP_SIZE) {
  943.       WinQueryWindowPos(WinWindowFromID(hwnd,PB_SAVE),&swp);
  944.       WinSetWindowPos(WinWindowFromID(hwnd,NB_PARAMS),0,4,swp.y+swp.cy+swp.cy/2, pswp->cx-8,
  945.                       pswp->cy-swp.y-swp.cy-swp.cy/2-
  946.                       2*WinQuerySysValue(HWND_DESKTOP,SV_CYTITLEBAR),SWP_SIZE|SWP_MOVE);
  947.     }
  948.     return (WinDefDlgProc(hwnd,msg,mp1,mp2));
  949.   }
  950.   case WM_CLOSE:
  951.     plswData->bSettingsDlgOn = FALSE;
  952.     plswData->hwndParamDlg = NULLHANDLE;
  953.     WinDestroyWindow(hwnd);
  954.     break;
  955.  
  956.   case WM_COMMAND:
  957.     switch (SHORT1FROMMP(mp1)) {
  958.     case PB_EXIT:
  959.       WinPostMsg(hwnd, WM_QUIT, 0, 0);
  960.       break;
  961.     case PB_HIDE:
  962.       WinPostMsg(hwnd,WM_CLOSE,0,0);
  963.       break;
  964.     case PB_SAVE: {
  965.       USHORT rc;
  966.       static UCHAR ucErrMsg[100],ucFName[CCHMAXPATH],ucBuf[100+CCHMAXPATH];
  967.  
  968.       GetIniFileName(ucFName,sizeof(ucFName));
  969.  
  970.       if ((rc=SaveSettings(WinQueryAnchorBlock(hwnd),ucFName,&plswData->Settings))!=0) {
  971.         WinLoadString(WinQueryAnchorBlock(hwnd),NULLHANDLE,rc==1?MSG_CANTOPEN:MSG_CANTSAVE,sizeof(ucErrMsg),ucErrMsg);
  972.         sprintf(ucBuf,ucErrMsg,ucFName);
  973.         WinAlarm(HWND_DESKTOP,WA_ERROR);
  974.         WinMessageBox(HWND_DESKTOP,hwnd,ucBuf,PGMNAME,0,MB_ERROR | MB_CANCEL);
  975.       }
  976.       break;
  977.     }
  978.  
  979.     }
  980.     break;
  981.  
  982.   case WM_CONTROL: {
  983.     HWND hwndPage;
  984.     ULONG ulPageId;
  985.  
  986.     if (SHORT1FROMMP(mp1)==NB_PARAMS && SHORT2FROMMP(mp1) == BKN_PAGESELECTED) {
  987.       ulPageId = ((PPAGESELECTNOTIFY)PVOIDFROMMP(mp2))->ulPageIdNew;
  988.       if (ulPageId == ulPopupFiltID || ulPageId == ulTskBarFiltID) {
  989.         hwndPage=LONGFROMMP(WinSendMsg(WinWindowFromID(hwnd,NB_PARAMS),BKM_QUERYPAGEWINDOWHWND,MPFROMLONG(ulPageId),0));
  990.         WinPostMsg(hwndPage,WM_COMMAND,MPFROMSHORT(PB_REFRESH),MPFROM2SHORT(CMDSRC_OTHER,FALSE));
  991.       }
  992.     }
  993.     break;
  994.   }
  995.   default:
  996.     return (WinDefDlgProc(hwnd,msg,mp1,mp2));
  997.   }
  998.   return 0;
  999. }
  1000.  
  1001.  
  1002.