[ Home | Programming Tips | Mail ]
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 で作っています。