home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Guide / c-cplusplus-interactive-guide.iso / c_ref / csource1 / cenvew / idletime.cmm < prev    next >
Text File  |  1993-11-03  |  4KB  |  115 lines

  1. /**********************************************************************
  2.  *** IdleTime - CEnvi program to start a maximized clock after the  ***
  3.  ***            mouse and keyboard buttons have been idle, and then ***
  4.  ***            terminate the clock when the buttons are active     ***
  5.  ***            again.  This code checks for keyboard or mouse      ***
  6.  ***            activity by periodically checking the global        ***
  7.  ***            keyboard table and checking the mouse position      ***
  8.  **********************************************************************/
  9.  
  10.  
  11. #define  DELAY_WHILE_WAITING     5
  12.    // Delay, in seconds, between each check for activity, while waiting
  13.    // for inactivity
  14. #define  INACTIVE_PERIOD         1
  15.    // How many minutes of keyboard inactivity will start the program
  16. #define  DELAY_WHILE_EXECUTING   750
  17.    // Delay, in milliseconds (1000 = 1 second), while waiting for
  18.    // keyboard or mouse activity to start again
  19.  
  20.  
  21. main()   // this is where the program begins. This will loop forever
  22. {
  23.    // Uncomment ("remove "//") from following line to hide CEnvi icon
  24.    // HideThisCEnviProgram(); // make CEnvi icon invisible
  25.    while(TRUE) {
  26.       WaitForInactivity();    // wait for period of inactivity
  27.       window = StartProgram();// start program, and get handle
  28.       if ( window ) {
  29.          WaitForActivity();      // wait for a keyboard or mouse press
  30.          EndProgram(window);
  31.       }
  32.    }
  33. }
  34.  
  35.  
  36. StartProgram() // Start the clock program, maximize it and return
  37. {              // a handle, or return 0 if cannot start it
  38.    window = spawn(P_NOWAIT,"CLOCK.EXE");
  39.    if ( !window  ||  -1 == window )
  40.       return(0);
  41.    MaximizeWindow(window);
  42.    return(window);
  43. }
  44.  
  45.  
  46. EndProgram(handle)   // terminate this program handle by sending
  47. {                    // it a WM_CLOSE message
  48.    #define WM_CLOSE  0x0010
  49.    DynamicLink("USER","POSTMESSAGE",SWORD16,PASCAL,
  50.                handle,WM_CLOSE,0,0,0);
  51. }
  52.  
  53.  
  54. WaitForInactivity() // check every once in a while, and return after a
  55. {                   // long period of inactivity
  56.    // check at every interval and set keyboard if it is not already set
  57.    PrevTable = GetGlobalKeyboardTable();
  58.    PrevPos = CursorPosition();
  59.    EndTime = time() + (INACTIVE_PERIOD * 60);
  60.    // stay in this block until period of inactivity has occurred
  61.    do {
  62.       suspend(DELAY_WHILE_WAITING * 1000); // wait a while
  63.       CurrentTable = GetGlobalKeyboardTable();
  64.       CurrentPos = CursorPosition();
  65.       if ( memcmp(CurrentTable,PrevTable,256) || CurrentPos != PrevPos ) {
  66.          // table has changed; reset EndTime and remember table
  67.          EndTime = time() + (INACTIVE_PERIOD * 60);
  68.          PrevTable = CurrentTable;
  69.          PrevPos = CurrentPos;
  70.       }
  71.    } while ( time() < EndTime );
  72. }
  73.  
  74.  
  75. WaitForActivity() // check every once in a while, and return after a
  76. {                 // change in the keyboard or mouse
  77.    PreviousTable = GetGlobalKeyboardTable();
  78.    PrevPos = CursorPosition();
  79.    while( !memcmp(PreviousTable,GetGlobalKeyboardTable(),256)
  80.        && PrevPos == CursorPosition() ) {
  81.       suspend(DELAY_WHILE_EXECUTING);
  82.    }
  83. }
  84.  
  85.  
  86. GetGlobalKeyboardTable()   // return 256 byte buffer for current
  87. {                          // keyboard state
  88.    keyBuf[255] = '\0'; // initialize a 256-byte array
  89.    DynamicLink("USER","GETKEYBOARDSTATE",SWORD16,PASCAL,keyBuf);
  90.    return(keyBuf);
  91. }
  92.  
  93.  
  94. HideThisCEnviProgram()  // hide the CEnvi window icon
  95. {
  96.    #define SW_HIDE   0
  97.    DynamicLink("USER","SHOWWINDOW",SWORD16,PASCAL,ScreenHandle(),SW_HIDE);
  98. }
  99.  
  100. MaximizeWindow(handle)
  101. {
  102.    #define SW_SHOWMAXIMIZED   3
  103.    DynamicLink("USER","SHOWWINDOW",SWORD16,PASCAL,handle,SW_SHOWMAXIMIZED);
  104. }
  105.  
  106. CursorPosition()  // return current cursor position in screen coordinates
  107. {                 // structure elements returned are .col and .row
  108.    BLObSize(point,4);
  109.    DynamicLink("USER","GETCURSORPOS",SWORD16,PASCAL,point);
  110.    position.col = BLObGet(point,0,SWORD16);
  111.    position.row = BLObGet(point,2,SWORD16);
  112.    return(position);
  113. }
  114.  
  115.