home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 11 Util / 11-Util.zip / sysptr10.zip / source.zip / source / sysptr.cpp < prev    next >
C/C++ Source or Header  |  1994-05-11  |  7KB  |  341 lines

  1. // **********************************
  2. //
  3. // SysPointers 1.0 by Enrico Demarin
  4. // (mccoy@maya.dei.unipd.it)
  5. //
  6. // **********************************
  7.  
  8. #define INCL_WIN
  9. #define INCL_GPICONTROL
  10. #define INCL_PM
  11. #define INCL_GPI
  12. #define INCL_DOS
  13.  
  14. #include <os2.h>
  15. #include <stdio.h>
  16. #include <string.h>
  17. #include "sysptr.h"
  18. #include "dialog.h"
  19.  
  20.  
  21. #define PTRKEY "PM_SysPointer"
  22.  
  23. // strings
  24.  
  25. CHAR *ST_PINSTALLED = "Custom Pointer installed -> %s";
  26. CHAR *ST_PNOTINSTALLED = "Using default system pointer.";
  27. CHAR *ST_FINDFILE = "Find pointer...";
  28. CHAR *ST_CANTCHANGE = "Failed to change pointer.";
  29. CHAR *ST_CANTDELETE = "Failed to delete pointer.";
  30. CHAR *ST_SHUTDOWN = "You need to perform a shutdown to restore default pointers.";
  31. CHAR *ST_REMOVE = "Custom pointer removed.";
  32.  
  33.  
  34. typedef struct NODE
  35. {
  36.     ULONG active;
  37.     CHAR name[CCHMAXPATH];
  38. }   PTRNODE;
  39.  
  40.  
  41. // functions prototypes
  42.  
  43. int main(void);
  44. MRESULT EXPENTRY MyDlgWndProc(HWND, ULONG, MPARAM, MPARAM);
  45. void updatedialog(HWND);
  46. BOOL choosepointer(HWND);
  47. BOOL deletecurrent(HWND);
  48. void togglepointer(void);
  49.  
  50.  
  51. #define DPOINTERS 19 // # of pointers
  52.  
  53. // descriptions
  54.  
  55. char *pszDescr[DPOINTERS] = {
  56.     "Arrow pointer",
  57.     "Text insertion pointer",
  58.     "Hourglass pointer",
  59.     "Sizing pointer",
  60.     "Move pointer",
  61.     "Resize NW-SE",
  62.     "Resize NE-SW",
  63.     "Resize W-E",
  64.     "Resize N-S",
  65.     "Application icon",
  66.     "Information icon",
  67.     "Question icon",
  68.     "Error icon",
  69.     "Warning icon",
  70.     "'Illegal' pointer",
  71.     "File icon",
  72.     "Folder icon",
  73.     "Multiple file selection",
  74.         "Program icon"};
  75.  
  76. // pointer # identifiers
  77.  
  78. int iIndex[DPOINTERS] = {
  79.     SPTR_ARROW, SPTR_TEXT, SPTR_WAIT, SPTR_SIZE,
  80.     SPTR_MOVE, SPTR_SIZENWSE, SPTR_SIZENESW,
  81.     SPTR_SIZEWE, SPTR_SIZENS, SPTR_APPICON,
  82.     SPTR_ICONINFORMATION, SPTR_ICONQUESTION, SPTR_ICONERROR,
  83.     SPTR_ICONWARNING, SPTR_ILLEGAL, SPTR_FILE,
  84.     SPTR_FOLDER, SPTR_MULTFILE, SPTR_PROGRAM};
  85.  
  86. // global vars
  87. LONG ScreenSizeX = WinQuerySysValue(HWND_DESKTOP, SV_CXSCREEN) + 2;
  88.     LONG ScreenSizeY = WinQuerySysValue(HWND_DESKTOP, SV_CYSCREEN);
  89.  
  90.  
  91. int main(void)
  92. {
  93.     HAB hab;
  94.     HMQ hmq;
  95.     QMSG qmsg;
  96.  
  97.     // in...
  98.  
  99.     hab = WinInitialize(0);
  100.     hmq = WinCreateMsgQueue(hab, 0L);
  101.  
  102.  
  103.     // popup dialog...
  104.  
  105.     WinDlgBox(HWND_DESKTOP, NULLHANDLE, (PFNWP) MyDlgWndProc, 0, MAINDIALOG, NULL);
  106.  
  107.     // ...out
  108.  
  109.     WinDestroyMsgQueue(hmq);
  110.     WinTerminate(hab);
  111.  
  112.     return 0;
  113. }
  114.  
  115.  
  116.  
  117. // choose a pointer (file dialog)
  118.  
  119. BOOL choosepointer(HWND hwnd)
  120. {
  121.     HWND hwndDialog;
  122.     FILEDLG fileDlgInfo;
  123.     USHORT index;
  124.     CHAR pszTmp1[32];
  125.     PTRNODE ptrNode;
  126.     ULONG size=sizeof(ULONG);
  127.     ICONINFO iconinfo;
  128.  
  129.      memset(&iconinfo,0,sizeof(ICONINFO));
  130.  
  131.     iconinfo.cb=sizeof(ICONINFO);
  132.     iconinfo.fFormat=ICON_FILE;
  133.      
  134.  
  135.     ptrNode.active = TRUE;
  136.  
  137.     index = SHORT1FROMMP(WinSendDlgItemMsg(hwnd, MYLBOX, LM_QUERYSELECTION, MPFROMLONG(0L), MPFROMLONG(0L)));
  138.         index = iIndex[index];
  139.  
  140.     sprintf(pszTmp1, "%u", index);
  141.  
  142.     memset(&fileDlgInfo, 0, sizeof(FILEDLG));
  143.     fileDlgInfo.cbSize = sizeof(fileDlgInfo);
  144.  
  145.  
  146.     fileDlgInfo.fl = FDS_OPEN_DIALOG | FDS_CENTER;
  147.     fileDlgInfo.pszTitle = ST_FINDFILE;
  148.     strcpy(fileDlgInfo.szFullFile, "*.PTR");
  149.     hwndDialog = WinFileDlg(HWND_DESKTOP, hwnd, &fileDlgInfo);
  150.  
  151.     if (hwndDialog && (fileDlgInfo.lReturn == DID_OK))
  152.     {
  153.         strcpy(ptrNode.name, fileDlgInfo.szFullFile);
  154.         size+=strlen(ptrNode.name)+1;
  155.     
  156.         iconinfo.pszFileName=ptrNode.name;
  157.         WinSetSysPointerData(HWND_DESKTOP,index,&iconinfo);
  158.         togglepointer();
  159.         return PrfWriteProfileData(HINI_USERPROFILE, (PSZ) PTRKEY,
  160.                            (PSZ) pszTmp1, (PVOID) & ptrNode, size);
  161.  
  162.  
  163.     }
  164.     else
  165.         return FALSE;
  166. }
  167.  
  168. // delete pointer definition from OS2.INI
  169.  
  170. BOOL deletecurrent(HWND hwnd)
  171. {
  172.     USHORT index;
  173.     CHAR pszTmp1[32];
  174.     BOOL res;
  175.  
  176.     index = SHORT1FROMMP(WinSendDlgItemMsg(hwnd, MYLBOX, LM_QUERYSELECTION, MPFROMLONG(0L), MPFROMLONG(0L)));
  177.  
  178.     sprintf(pszTmp1, "%u", iIndex[index]);
  179.     res= (BOOL) PrfWriteProfileString(HINI_USERPROFILE, (PSZ) PTRKEY, (PSZ) pszTmp1, NULL);
  180.  
  181.     
  182.     WinSetSysPointerData(HWND_DESKTOP,index,NULL);
  183.      
  184.     togglepointer();
  185.  
  186.         
  187.     // Delete key
  188.  
  189.     return res;
  190. }
  191.  
  192. // update dialog box
  193.  
  194. void updatedialog(HWND hwnd)
  195. {
  196.     USHORT index;
  197.     CHAR pszTmp1[32];
  198.     CHAR pszTmp2[CCHMAXPATH];
  199.     CHAR pszTmp3[CCHMAXPATH + 32];
  200.     BOOL res;
  201.     HPOINTER hptrCurrent=NULL;
  202.     PTRNODE ptrNode;
  203.     ULONG buflen = sizeof(PTRNODE);
  204.     
  205.     index = SHORT1FROMMP(WinSendDlgItemMsg(hwnd, MYLBOX, LM_QUERYSELECTION, MPFROMLONG(0L), MPFROMLONG(0L)));
  206.     index = iIndex[index];
  207.     sprintf(pszTmp1, "%u", index);
  208.  
  209.     res = PrfQueryProfileData(HINI_USERPROFILE, (PSZ) PTRKEY, (PSZ) pszTmp1, (PVOID) & ptrNode, &buflen);
  210.  
  211.  
  212.     if (ptrNode.name[0] == 0)
  213.         res = FALSE;
  214.  
  215.     WinEnableControl(hwnd, UNINSTALL, res);
  216.  
  217.     if (res)
  218.         sprintf(pszTmp3, ST_PINSTALLED, ptrNode.name);
  219.     else
  220.         strcpy(pszTmp3, ST_PNOTINSTALLED);
  221.  
  222.     WinSetDlgItemText(hwnd, INFOS, pszTmp3);
  223.  
  224.     
  225.  
  226.     hptrCurrent = WinQuerySysPointer(HWND_DESKTOP, index,FALSE);
  227.                        
  228.     WinSendDlgItemMsg(hwnd, CURRSHAPE, VM_SETITEM, MPFROM2SHORT(1, 1), MPFROMLONG(hptrCurrent));
  229.     
  230.     
  231. }
  232.  
  233.  
  234. // dialog box window procedure
  235.  
  236. MRESULT EXPENTRY MyDlgWndProc(HWND hwnd,
  237.                                   ULONG msg,
  238.                                   MPARAM mp1,
  239.                                   MPARAM mp2)
  240. {
  241.     switch (msg)
  242.     {
  243.         case WM_INITDLG:
  244.         {
  245.  
  246.             SWP swp;
  247.  
  248.             // center dialog
  249.  
  250.             WinQueryWindowPos(hwnd, (PSWP) & swp);
  251.             WinSetWindowPos(hwnd, (HWND) 0,
  252.                             ((SHORT) ((ScreenSizeX - swp.cx) / 2)),
  253.                             ((SHORT) ((ScreenSizeY - swp.cy) / 2)),
  254.                             0, 0, SWP_MOVE);
  255.  
  256.             // fill listbox
  257.  
  258.             WinSendDlgItemMsg(hwnd, MYLBOX, LM_DELETEALL, NULLHANDLE, NULLHANDLE);
  259.             for (int i = 0; i < DPOINTERS; i++)
  260.                 WinSendDlgItemMsg(hwnd, MYLBOX, LM_INSERTITEM, MPFROMSHORT(LIT_END),
  261.                                   MPFROMP(pszDescr[i]));
  262.             // Select first
  263.  
  264.             WinSendDlgItemMsg(hwnd, MYLBOX, LM_SELECTITEM, MPFROMSHORT(0), MPFROMSHORT(TRUE));
  265.  
  266.             // update
  267.  
  268.             updatedialog(hwnd);
  269.         } break;
  270.  
  271.     case WM_CONTROL:
  272.         if (SHORT1FROMMP(mp1) == MYLBOX)
  273.             switch (SHORT2FROMMP(mp1))
  274.             {
  275.             case LN_ENTER:        // enter or double-click on lb item
  276.                 if (choosepointer(hwnd))
  277.                     updatedialog(hwnd);
  278.                 return 0;
  279.                 break;
  280.             case LN_SELECT:    // user selected another lb item
  281.                 updatedialog(hwnd);
  282.                 return 0;
  283.                 break;
  284.             
  285.             }
  286.         break;
  287.  
  288.     case WM_COMMAND:
  289.         switch (SHORT1FROMMP(mp1))
  290.         {
  291.         case SELECTFILE:        // install push button pressed
  292.  
  293.             if (choosepointer(hwnd))
  294.             {
  295.                 updatedialog(hwnd);
  296.             }
  297.  
  298.             else
  299.                 WinSetDlgItemText(hwnd, INFOS, ST_CANTCHANGE);
  300.             return 0;
  301.             break;
  302.         case UNINSTALL:        // uninstall push button pressed
  303.             if (deletecurrent(hwnd))
  304.             {
  305.                 WinMessageBox(HWND_DESKTOP, hwnd, 
  306.                     ST_SHUTDOWN,
  307.                     ST_REMOVE, 0,
  308.                     MB_MOVEABLE | MB_INFORMATION | MB_OK);
  309.                     
  310.                 updatedialog(hwnd);
  311.             }
  312.  
  313.             else
  314.                 WinSetDlgItemText(hwnd, INFOS, ST_CANTDELETE);
  315.             return 0;
  316.             break;
  317.  
  318.         case DISMISS:            // ok push button pressed
  319.             WinDismissDlg(hwnd, TRUE);
  320.             return 0;
  321.         } break;
  322.  
  323.  
  324.     }
  325.     // default processing
  326.     return WinDefDlgProc(hwnd, msg, mp1, mp2);
  327. }
  328.  
  329. // enable new pointer
  330.  
  331. void togglepointer(void)
  332. {
  333.  HPOINTER hptrCurrent;
  334.  
  335.  
  336.  hptrCurrent=WinQuerySysPointer(HWND_DESKTOP,SPTR_WAIT,FALSE);
  337.  WinSetPointer(HWND_DESKTOP,hptrCurrent);
  338.  hptrCurrent=WinQuerySysPointer(HWND_DESKTOP,SPTR_ARROW,FALSE);
  339.  WinSetPointer(HWND_DESKTOP,hptrCurrent);
  340. }    
  341.