home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 11 Util / 11-Util.zip / fw100a.zip / CLOCK.C < prev    next >
Text File  |  1995-12-11  |  15KB  |  368 lines

  1. /*******************************************************************************
  2.     Clock
  3.     (c) 1995 P.Koller
  4. *******************************************************************************/
  5.  
  6. #define INCL_WIN
  7. #define INCL_DOS
  8. #define INCL_GPI
  9. #include <os2.h>
  10.  
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <string.h>
  14. #include "clock.h"
  15.  
  16. /**** Function prototypes ****/
  17. int main(void);
  18. MRESULT EXPENTRY    SysMenuProc (HWND hWnd, ULONG msg, MPARAM mp1, MPARAM mp2);
  19. MRESULT EXPENTRY    TitleBarProc(HWND hWnd, ULONG msg, MPARAM mp1, MPARAM mp2);
  20. MRESULT EXPENTRY    MainDlgProc (HWND,ULONG,MPARAM,MPARAM);
  21. void                ClockSetDateString(PDATETIME dt);
  22.  
  23. /**** Profile Strings ****/
  24. char                pAppname[] = "Yes - It's a clock";
  25. char                pKeyname[] = "screenposn";
  26. DATETIME            datetime[2] = {0};
  27. ULONG               timerID = 0;
  28.  
  29. /**** OS2 API ****/
  30. HAB                 hab;
  31. HWND                hWndFrame;
  32. PFNWP               TitleDefProc;
  33. PFNWP               SysMenuDefProc;
  34. POINTERINFO         PointerInfo;
  35. HPOINTER            SysMenuButton;
  36.  
  37. /**** String buffers ****/
  38. CHAR                szTitle[30];
  39. CHAR                szHours[10];
  40. CHAR                szSecs[5];
  41.  
  42. /**** Update Flag ****/
  43. BOOL                UPDATE_HOURS;
  44. BOOL                UPDATE_DATE;
  45. BOOL                DTSWITCH;
  46.  
  47. /****************************************************************************
  48.    Main Program start
  49. *****************************************************************************/
  50. int main()
  51. {
  52.     HMQ   hmq;
  53.     QMSG  qmsg;
  54.  
  55.     hab = WinInitialize (0);
  56.     hmq = WinCreateMsgQueue (hab, 0);
  57.  
  58.     hWndFrame = WinLoadDlg (HWND_DESKTOP, HWND_DESKTOP,
  59.         MainDlgProc, 0, IDD_CLOCK,NULL);
  60.     TitleDefProc = WinSubclassWindow(WinWindowFromID(hWndFrame, FID_TITLEBAR),
  61.                    (PFNWP)TitleBarProc );
  62.     SysMenuDefProc = WinSubclassWindow(WinWindowFromID(hWndFrame, FID_SYSMENU),
  63.                    (PFNWP)SysMenuProc );
  64.  
  65.     SysMenuButton = WinLoadPointer (HWND_DESKTOP, 0, IDD_CLOCK);
  66.     WinQueryPointerInfo(SysMenuButton,&PointerInfo);
  67.     WinSendMsg (hWndFrame, WM_SETICON, (MPARAM)SysMenuButton, NULL);
  68.  
  69.  
  70.     while (WinGetMsg (hab, &qmsg, 0, 0, 0))
  71.         WinDispatchMsg (hab, &qmsg);
  72.  
  73.     WinDestroyWindow (hWndFrame);
  74.     WinDestroyMsgQueue (hmq);
  75.     WinTerminate (hab);
  76.     return (0);
  77. }
  78. /****************************************************************************
  79.    SysMenu Dialog Procedure
  80. *****************************************************************************/
  81. MRESULT EXPENTRY SysMenuProc (HWND hWnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  82.     {
  83.         BOOL    Handled = TRUE;
  84.         MRESULT mReturn  = 0;
  85.         RECTL   Rectl;
  86.         POINTL  Pointl;
  87.         ULONG   temp;
  88.         HPS     hps;
  89.         HBITMAP hbm;
  90.  
  91.         switch (msg)
  92.             {
  93.                 case    WM_PAINT:
  94.                     hps = WinBeginPaint(hWnd, 0, 0);
  95.                     WinQueryWindowRect(hWnd,&Rectl);
  96.                     WinFillRect(hps, &Rectl, CLR_BLACK);
  97.                     hbm = PointerInfo.hbmMiniColor;
  98.                     WinInflateRect(hab, &Rectl, -1L, -1L);
  99.                     WinDrawBitmap(hps, hbm, NULL, (PPOINTL)&Rectl, 0L, 0L, DBM_NORMAL);
  100.                     WinEndPaint(hps);
  101.                     break;
  102.                 case WM_ERASEBACKGROUND:
  103.                     WinFillRect((HPS)LONGFROMMP(mp1),PVOIDFROMMP(mp2),CLR_BLACK);
  104.                     mReturn = MRFROMLONG(1L);
  105.                     break;
  106.                 default:
  107.                     Handled = FALSE;
  108.                     break;
  109.             }
  110.         if (!Handled) mReturn =  (*SysMenuDefProc)(hWnd, msg, mp1, mp2);
  111.         return (mReturn);
  112.     }
  113.  
  114. /****************************************************************************
  115.    Titlebar Dialog Procedure
  116. *****************************************************************************/
  117. MRESULT EXPENTRY TitleBarProc (HWND hWnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  118.     {
  119.         BOOL    Handled = TRUE;
  120.         MRESULT mReturn  = 0;
  121.         RECTL   Rectl;
  122.         POINTL  Pointl;
  123.         
  124.         CHARBUNDLE cb;
  125.         FONTMETRICS Fontsz;
  126.         PSZ     TitleText = szTitle;
  127.         ULONG   temp;
  128.         HPS     hps;
  129.  
  130.         switch (msg)
  131.             {
  132.                 case    WM_SETWINDOWPARAMS:
  133.                     if( ((WNDPARAMS*)mp1)->fsStatus & WPM_TEXT )
  134.                         {
  135.                             TitleText = ((WNDPARAMS*)mp1)->pszText;
  136.                         }
  137.                     Handled = FALSE;
  138.                     break;
  139.                 case    TBM_SETHILITE:
  140.                     mReturn = (MRESULT)TRUE;
  141.                     hps = WinGetPS(hWnd);
  142.                     WinQueryWindowRect(hWnd,&Rectl);
  143.                     WinFillRect(hps, &Rectl, CLR_BLACK);
  144.                     GpiQueryFontMetrics(hps,sizeof(FONTMETRICS),(PFONTMETRICS)&Fontsz);
  145.                     Pointl.x = 10;
  146.                     Pointl.y = (Rectl.yTop - Fontsz.lMaxAscender) / 2;
  147.                     cb.lColor = CLR_GREEN;
  148.                     cb.lBackColor = CLR_BLACK;
  149.                     cb.usMixMode = BM_OVERPAINT;
  150.                     cb.usBackMixMode = BM_OVERPAINT;
  151.                     GpiSetAttrs(hps,PRIM_CHAR, CBB_COLOR | CBB_BACK_COLOR 
  152.                        | CBB_MIX_MODE | CBB_BACK_MIX_MODE, 0,(PBUNDLE)&cb);
  153.                     GpiCharStringAt(hps, &Pointl, strlen(TitleText), TitleText);
  154.                     WinEndPaint(hps);
  155.                     WinReleasePS(hps);
  156.                     break;
  157.                 case    WM_PAINT:
  158.                     hps = WinBeginPaint(hWnd, 0, 0);
  159.                     WinQueryWindowRect(hWnd,&Rectl);
  160.                     WinFillRect(hps, &Rectl, CLR_BLACK);
  161.                     GpiQueryFontMetrics(hps,sizeof(FONTMETRICS),(PFONTMETRICS)&Fontsz);
  162.                     Pointl.x = 10;
  163.                     Pointl.y = (Rectl.yTop - Fontsz.lMaxAscender) / 2;
  164.                     cb.lColor = CLR_GREEN;
  165.                     cb.lBackColor = CLR_BLACK;
  166.                     cb.usMixMode = BM_OVERPAINT;
  167.                     cb.usBackMixMode = BM_OVERPAINT;
  168.                     GpiSetAttrs(hps,PRIM_CHAR, CBB_COLOR | CBB_BACK_COLOR 
  169.                        | CBB_MIX_MODE | CBB_BACK_MIX_MODE, 0,(PBUNDLE)&cb);
  170.                     GpiCharStringAt(hps, &Pointl, strlen(TitleText), TitleText);
  171.                     WinEndPaint(hps);
  172.                     break;
  173.                 default:
  174.                     Handled = FALSE;
  175.                     break;
  176.             }
  177.         if (!Handled) mReturn =  (*TitleDefProc)(hWnd, msg, mp1, mp2);
  178.         return (mReturn);
  179.     }
  180.  
  181. /****************************************************************************
  182.    Main Message Cue Dialog Procedure
  183. *****************************************************************************/
  184. MRESULT EXPENTRY MainDlgProc (HWND hWnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  185.     {
  186.         BOOL    Handled = TRUE;
  187.         MRESULT mReturn  = 0;
  188.         RECTL   Rectl;
  189.         POINTL  Pointl;
  190.         HINI    hini;
  191.         ULONG   temp;
  192.  
  193.         switch (msg)
  194.             {
  195.  
  196.                 /* Called on startup */
  197.                 case WM_INITDLG:
  198.                     UPDATE_HOURS = TRUE;
  199.                     UPDATE_DATE = TRUE;
  200.                     DTSWITCH = FALSE;
  201.                     hini = HINI_USERPROFILE;
  202.                     Pointl.x = Pointl.y = 10;
  203.                     if(PrfQueryProfileSize(hini,pAppname,pKeyname,(PULONG)&temp) &&temp)
  204.                         { 
  205.                             if(temp == sizeof(POINTL)) PrfQueryProfileData(hini, pAppname,
  206.                                                        pKeyname, &Pointl, (PULONG)&temp);
  207.                         }
  208.                     WinQueryWindowRect (hWnd, &Rectl);
  209.                     WinSetWindowPos (hWnd, HWND_TOP, Pointl.x,
  210.                             Pointl.y, 0, 0, SWP_SHOW | SWP_MOVE | SWP_ACTIVATE);
  211.                     /* A neat little trick to float the window on top... */
  212.                     WinFocusChange(HWND_DESKTOP,HWND_TOP,0);
  213.                     timerID = WinStartTimer(hab, hWnd, 1, 1000L);
  214.                     break;
  215.                 case WM_TIMER:
  216.                     if(SHORT1FROMMP(mp1) == timerID)
  217.                         {
  218.                             while(DosGetDateTime( &(datetime[DTSWITCH?1:0]) ));
  219.                             UPDATE_HOURS = (    (datetime[DTSWITCH?1:0].minutes != datetime[DTSWITCH?0:1].minutes)
  220.                                              || (datetime[DTSWITCH?1:0].hours != datetime[DTSWITCH?0:1].hours) );
  221.                             UPDATE_DATE  = (    (datetime[DTSWITCH?1:0].day != datetime[DTSWITCH?0:1].day)
  222.                                              || (datetime[DTSWITCH?1:0].weekday != datetime[DTSWITCH?0:1].weekday)
  223.                                              || (datetime[DTSWITCH?1:0].month != datetime[DTSWITCH?0:1].month)
  224.                                              || (datetime[DTSWITCH?1:0].year != datetime[DTSWITCH?0:1].year) );
  225.                             ClockSetDateString( &(datetime[DTSWITCH?1:0]));
  226.                             DTSWITCH = !DTSWITCH;
  227.                             if(UPDATE_HOURS)
  228.                                 {
  229.                                     WinSetDlgItemText (hWnd, IDD_TIME, szHours);
  230.                                     if(UPDATE_DATE)
  231.                                         { 
  232.                                             WinSetWindowText(hWndFrame,(PSZ)szTitle);
  233.                                             UPDATE_DATE = FALSE;
  234.                                         }
  235.                                             UPDATE_HOURS = FALSE;
  236.                                 }
  237.                             WinSetDlgItemText (hWnd, IDD_SEC, szSecs);
  238.                         }
  239.                     Handled = FALSE;
  240.                     break;
  241.                 case WM_SYSCOMMAND:
  242.                 case WM_COMMAND:
  243.                     switch (LOUSHORT(mp1))
  244.                       {
  245.                             case SC_CLOSE:
  246.                                 hini = HINI_USERPROFILE;
  247.                                 WinStopTimer(hab, hWnd, timerID);
  248.                                 Pointl.x = Pointl.y = 0;
  249.                                 WinMapWindowPoints(hWnd, HWND_DESKTOP, &Pointl, 1);
  250.                                 temp = sizeof(POINTL);
  251.                                 PrfWriteProfileData(hini, pAppname, pKeyname, &Pointl, temp);
  252.                                 WinPostMsg(hWnd, WM_QUIT, 0L, 0L);
  253.                                 break;
  254.                             default:
  255.                                 Handled = (msg == WM_COMMAND);
  256.                                 break;
  257.                         }
  258.                     break; // forget this break and you are in dead trouble !!!
  259.                 default:
  260.                     Handled = FALSE;
  261.                     break;
  262.             }
  263.         if (!Handled) mReturn = WinDefDlgProc (hWnd, msg, mp1, mp2);
  264.         return (mReturn);
  265.     }
  266.  
  267. void ClockSetDateString(PDATETIME dt)
  268.     {
  269.         ULONG   x;
  270.         char    temp[10];
  271.  
  272.         sprintf(szSecs, "%.2d", dt->seconds);
  273.         if(UPDATE_HOURS)
  274.         {
  275.         sprintf(szHours, "%.2d : %.2d", dt->hours, dt->minutes);
  276.             if(UPDATE_DATE)
  277.             {
  278.             switch(dt->weekday)
  279.                 {
  280.                     case 0:
  281.                         strcat(szTitle,"Sun ");
  282.                         break;
  283.                     case 1:
  284.                         strcat(szTitle,"Mon ");
  285.                         break;
  286.                     case 2:
  287.                         strcat(szTitle,"Tue ");
  288.                         break;
  289.                     case 3:
  290.                         strcat(szTitle,"Wed ");
  291.                         break;
  292.                     case 4:
  293.                         strcat(szTitle,"Thu ");
  294.                         break;
  295.                     case 5:
  296.                         strcat(szTitle,"Fri ");
  297.                         break;
  298.                     case 6:
  299.                         strcat(szTitle,"Sat ");
  300.                         break;
  301.                 }
  302.             _itoa(dt->day, szTitle + 4, 10);
  303.             switch(dt->day)
  304.                 {
  305.                     case 1:
  306.                     case 21:
  307.                     case 31:
  308.                         strcat(szTitle,"st ");
  309.                         break;
  310.                     case 2:
  311.                     case 22:
  312.                         strcat(szTitle,"nd ");
  313.                         break;
  314.                     case 3:
  315.                     case 23:
  316.                         strcat(szTitle,"rd ");
  317.                         break;
  318.                     default:
  319.                         strcat(szTitle,"th ");
  320.                         break;
  321.     
  322.                 }
  323.             switch(dt->month)
  324.                 {
  325.                     case 1:
  326.                         strcat(szTitle,"Jan ");
  327.                         break;
  328.                     case 2:
  329.                         strcat(szTitle,"Feb ");
  330.                         break;
  331.                     case 3:
  332.                         strcat(szTitle,"Mar ");
  333.                         break;
  334.                     case 4:
  335.                         strcat(szTitle,"Apr ");
  336.                         break;
  337.                     case 5:
  338.                         strcat(szTitle,"May ");
  339.                         break;
  340.                     case 6:
  341.                         strcat(szTitle,"Jun ");
  342.                         break;
  343.                     case 7:
  344.                         strcat(szTitle,"Jul ");
  345.                         break;
  346.                     case 8:
  347.                         strcat(szTitle,"Aug ");
  348.                         break;
  349.                     case 9:
  350.                         strcat(szTitle,"Sep ");
  351.                         break;
  352.                     case 10:
  353.                         strcat(szTitle,"Oct ");
  354.                         break;
  355.                     case 11:
  356.                         strcat(szTitle,"Nov ");
  357.                         break;
  358.                     case 12:
  359.                     default:
  360.                         strcat(szTitle,"Dec ");
  361.                         break;
  362.                 }
  363.             _itoa(dt->year, temp, 10);
  364.             strcat(szTitle, temp);
  365.             }
  366.         }
  367.     }
  368.