Now browsing the archives for 2月, 2007.

ユーザのアイドル時間を測定する nsIIdleService

Firefox 3 (Minefield) 以降限定だが、 nsIIdleService を使ってユーザのアイドル時間を測定したり、ユーザが一定時間何も操作しなかったことを検知したり、さらにその状態から操作を開始したことを検知することができる。言わずもがな、メッセンジャーのようなアプリケーションでユーザが退席中かオンラインかを見分ける用途などに最適だ。

nsIIdleService

まずXPCOMサービスを取得する。

gIdleService = Components.classes["@mozilla.org/widget/idleservice;1"]
               .getService(Components.interfaces.nsIIdleService);

現在のアイドル時間を取得するなら、 idleTime プロパティを調べるだけ。単位はミリ秒である。

setInterval(function() {
    document.getElementById("idleTime").value = Math.round(gIdleService.idleTime / 1000) + " 秒";
}, 1000);

ユーザが○○分間何もしなかった(マウスを動かしたりキーボードに触れたりしなかった)ことを検知して何らかの処理を実行するためには、 nsIObserver インタフェースを実装したオブザーバを作る。 observe メソッドへ渡される引数は…

aSubject nsIIdleService 自身
aTopic 指定時間が経過してアイドル状態に突入した場合は「idle」
アイドル状態から通常状態へと戻った場合は「back」
aData 現在のアイドル時間
gIdleObserver = {
    observe: function(aSubject, aTopic, aData) {
        var status;
        switch (aTopic) {
            case "idle": status = " 退席中..."; break;
            case "back": status = " 戻りました"; break;
        }
        document.getElementById("log").value += new Date().toLocaleTimeString() + status + "
";
    }
};

オブザーバを addIdleObserver メソッドで登録する。第2引数はアイドル状態になるまでの時間(単位は分)である。

gIdleService.addIdleObserver(gIdleObserver, 1);

上記サンプルでは、1分間(厳密には+5秒のディレイあり)何も操作しないと「退席中…」が表示され、その後何か操作をすると「戻りました」が表示される。

用が済んだら removeIdleObserver でオブザーバを解除するのをお忘れなく。

gIdleService.removeIdleObserver(gIdleObserver, 1);

» mozilla/widget/public/nsIIdleService.idl

TOP

xul:datepicker と xul:timepicker

日付や時刻を入力するための XUL ウィジェットが実装された(Trunk ビルド限定)。

xul:timepicker

datepicker の方は、 type=”popup” でポップアップ式のカレンダー、 type=”grid” とすることで埋め込み式のカレンダーから入力させることも可能。

xul:datepicker

詳しくは以下の Wiki のページかXBLのソースを参照
XUL:Specs:DateTimePickers – MozillaWiki
chrome://global/content/bindings/datetimepicker.xml

TOP

xul:scale

いつのまにか scale という新しい XUL のウィジェットが実装されていた(Trunk ビルド限定)。
max, min 属性で最小値と最大値、 increment 属性でつまみを動かしたときのステップ数を指定し、値のセット/ゲットは value プロパティ(または属性)を通じて行う。
また、 onchange イベントハンドラにより変化に応じた処理が可能である。

<label value="やる気:" />
<scale value="0"
       min="-100"
       max="+100"
       increment="10"
       onchange="this.nextSibling.value = this.value;" />
<textbox />

orient 属性を vertical とすることで、縦方向のスライダも可能。

xul:slider

詳しくは以下の Wiki のページかXBLのソースを参照
XUL:Slider Tag – MozillaWiki
chrome://global/content/bindings/scale.xml

TOP