[ Home | Programming Tips | Mail ]

Idle Time


Userが何もしていない時間を知るためには

 Screen Saverの類を作る際には Userが Mouseや Key Boardを触らずに何もしていない Idle Timeを検出する必要があります。これが一定時間を越えたら何かの Actionを起こすわけです。

 Extensionで Trap Patchを使用する場合は GNEFilterを使用して Eventの発生を監視するのが定跡ですが、普通の Applicationで Idle Timeを知りたい場合があります。その場合に使える方法を紹介します。

  CandleLightはこの方法を使っています。

//--------------------------------------------------------------------------
//  Undocumentな Low Memory Globalを参照していますが、このあたりは次期
//  Systemでも互換性のため見ても大丈夫なようにすると思います。
//--------------------------------------------------------------------------
const unsigned long *LM_KeyTime = (unsigned long *)0x0186;
const unsigned long *LM_MBTicks = (unsigned long *)0x016e;
const long          *LM_KeyMap  = (long *)0x0174;
 
//==========================================================================
//    HasUserAction()
//==========================================================================
Boolean   HasUserAction(Point globMousePt)
{
Boolean   result;
long      modKeys;
 
static  unsigned long sLastKeyTime;
static  unsigned long sLastMBTicks;
static  Point         sLastMouse;
static  long          sLastCapsLock;
 
const long  kModKeysMask  = 0x0000800d;
const long  kCapsLockMask = 0x00000002;
 
  result = true;
 
  //----------------------------------------------------------------
  //    キー入力があったか調べる
  //----------------------------------------------------------------
  if (sLastKeyTime != *LM_KeyTime)  goto rtn;
 
  //----------------------------------------------------------------
  //    Mouse Clickがあったか調べる
  //----------------------------------------------------------------
  if (sLastMBTicks != *LM_MBTicks)  goto rtn;
 
  //----------------------------------------------------------------
  //    Mouseが動いたか調べる
  //----------------------------------------------------------------
  if (*(long *)&globMousePt != *(long *)&sLastMouse)  goto rtn;
 
  //----------------------------------------------------------------
  //    Shift / Command / Option / Controlが押されているか調べる。
  //----------------------------------------------------------------
  modKeys = LM_KeyMap[1];
  if ((modKeys & kModKeysMask) != 0L)  goto rtn;
 
  //----------------------------------------------------------------
  //    Caps Lockの状態に変化があるか調べる。
  //----------------------------------------------------------------
  if ((modKeys & kCapsLockMask) != (sLastCapsLock & kCapsLockMask)) goto rtn;
 
  result = false;
rtn:
  sLastKeyTime  = *LM_KeyTime;
  sLastMBTicks  = *LM_MBTicks;
  sLastMouse    = globMousePt;
  sLastCapsLock = modKeys;
  return(result);
}


この Pageは MacOS X + Radio UserLand で作っています。