home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast.iso / pcmag / vol11n15.zip / CLIPSRV1.C < prev    next >
C/C++ Source or Header  |  1992-05-19  |  3KB  |  125 lines

  1. /* CLIPSRV1.C -- first version of clipboard server */
  2.  
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <malloc.h>
  6. #include "windows.h"
  7. #include "objwnd.h"
  8.  
  9. #define WM_CLIPCMD      (WM_USER+1)
  10.  
  11. extern BOOL FAR PASCAL IsWinOldApTask(HANDLE);  /* undocumented */
  12.  
  13. HWND this_hwnd, hwndNextViewer;
  14.  
  15. void do_run(HWND hwnd, char far *cmd)
  16. {
  17.     WinExec(cmd, SW_NORMAL);
  18. }
  19.  
  20. void do_settitle(HWND hwnd, char far *cmd)
  21. {
  22.     SendMessage(hwnd, WM_SETTEXT, 0, cmd);
  23. }
  24.  
  25. #pragma argsused
  26. long clipcmd(HWND hwnd, unsigned msg, WORD wparam, LONG lparam)
  27. {
  28.     HWND owner = wparam;    // HWND of clipboard owner
  29.     char far *s = (char far *) lparam;
  30.     char far *cmd = _fstrtok(s, " \t");
  31.     char far *param = s + _fstrlen(cmd) + 1;
  32.     if (_fstrcmp(cmd, "RUN") == 0)
  33.         do_run(owner, param);
  34.     else if (_fstrcmp(cmd, "SETTITLE") == 0)
  35.         do_settitle(owner, param);
  36.     else if (_fstrcmp(cmd, "EXIT") == 0)
  37.         SendMessage(hwnd, WM_DESTROY, 0, 0L);
  38.     _ffree((char far *) lparam);
  39.     return 0;
  40. }
  41.  
  42. long check_clipboard(HWND hwnd, unsigned msg, WORD wparam, LONG lparam)
  43. {
  44.     char far *fp = 0;
  45.     HWND owner;
  46.     
  47.     if (hwndNextViewer)
  48.         SendMessage(hwndNextViewer, msg, wparam, lparam);
  49.     
  50.     /* only process CMDCLIP requests from OLDAPs */
  51.     owner = GetClipboardOwner();
  52.     if (IsWinOldApTask(GetWindowTask(owner)))
  53.     {
  54.         HANDLE hGMem;
  55.         if (! OpenClipboard(hwnd))
  56.             return 0;
  57.         if (hGMem = GetClipboardData(CF_TEXT))
  58.         {
  59.             LPSTR lp = GlobalLock(hGMem);
  60.             if (_fstrncmp(lp, "CMDCLIP ", 8) == 0)
  61.             {
  62.                 int len = _fstrlen(lp);
  63.                 if ((lp[len-1] == '\n') || (lp[len-1] == '\r'))
  64.                     lp[len-1] = '\0';   // remove CRLF
  65.                 if ((fp = _fmalloc(len+1)) != 0)
  66.                 {
  67.                     char far *fp1 = fp;
  68.                     char far *fp2 = &lp[8];     // remove "CMDCLIP "
  69.                     while (*fp1++ = *fp2++)
  70.                         ;
  71.                 }
  72.                 else
  73.                     ;   /* insufficient memory */
  74.             }
  75.             GlobalUnlock(hGMem);
  76.         }
  77.         CloseClipboard();
  78.     }
  79.     // don't send message until clipboard closed
  80.     if (fp)
  81.         SendMessage(hwnd, WM_CLIPCMD, owner, fp);
  82.     return 0;
  83. }
  84.  
  85. long changecbchain(HWND hwnd, unsigned msg, WORD wparam, LONG lparam)
  86. {
  87.     /* maintain linked list of clipboard viewers */
  88.     if (wparam == hwndNextViewer)
  89.         hwndNextViewer = LOWORD(lparam);
  90.     else if (hwndNextViewer)
  91.         SendMessage(hwndNextViewer, msg, wparam, lparam);
  92.     return 0;
  93. }
  94.  
  95. #pragma argsused
  96. long destroy(HWND hwnd, unsigned msg, WORD wparam, LONG lparam)
  97. {
  98.     ChangeClipboardChain(this_hwnd, hwndNextViewer);
  99.     PostQuitMessage(0);
  100.     return 0;
  101. }
  102.  
  103. #pragma argsused
  104. int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance, 
  105.     LPSTR lpCmdLine, int nCmdShow)
  106. {
  107.     if (hPrevInstance)
  108.     {
  109.         MessageBox(NULL, "CLIPSERV already installed", "CLIPSERV", MB_OK);
  110.         return 1;       // only one instance allowed
  111.     }
  112.     
  113.     objwnd_init();
  114.     this_hwnd = objwnd(hPrevInstance, hInstance, "clipserv");
  115.     hwndNextViewer = SetClipboardViewer(this_hwnd);
  116.     
  117.     on(WM_CHANGECBCHAIN, changecbchain);
  118.     on(WM_DRAWCLIPBOARD, check_clipboard);
  119.     on(WM_DESTROY, destroy);
  120.     on(WM_CLIPCMD, clipcmd);     /* user-defined message */
  121.     
  122.     return mainloop();    /* go resident */
  123. }
  124.  
  125.