aboutsummaryrefslogtreecommitdiffstats
path: root/bijin_clock.js
blob: c6a068a73e206d1caba4dc5893957c05aad40d1f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/*
 * http://www.bijint.com/
 *
 * == Start ==
 * js plugins.bijin_clock.start(min)
 *    min: interval minutes (default: 1)
 *
 * == Stop ==
 * js plugins.bijin_clock.stop()
 */
let PLUGIN_INFO =
<VimperatorPlugin>
<name>{NAME}</name>
<description>Bijin Clock - http://www.bijint.com</description>
<version>0.1</version>
</VimperatorPlugin>;

liberator.plugins.bijin_clock = (function(){
const BASE_URL = 'http://www.bijint.com/jp/img/photo/';
const TITLE = fromUTF8Octets("美人時計");
const NAME = "Bijin Clock";
let interval = null;
function getTimeString(date){
  let time = date.toTimeString();
  return time.substr(0,2) + time.substr(3,2);
}
function fromUTF8Octets(octets){
    return decodeURIComponent(octets.replace(/[%\x80-\xFF]/g, function(c){
        return '%' + c.charCodeAt(0).toString(16);
    }));
}
function showBijinClock(){
  let date = new Date;
  let image_src = BASE_URL + getTimeString(date) + ".jpg";
  liberator.echomsg(date.toLocaleString(), 0);
  openDialog('data:application/vnd.mozilla.xul+xml;charset=utf-8,' +
    <><?xml-stylesheet type="text/css" href="chrome://global/skin/"?>
    <?xml-stylesheet type="text/css" href="chrome://browser/skin/browser.css"?>
    <window title={TITLE}
            windowtype="alert:clock"
            style="background-color:transparent;"
            xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
      <script type="application/javascript"><![CDATA[
      var image;
      var interval;
      var opacity = 1;
      function init(){
        image = document.getElementById('contents');
        var x = screen.availLeft + screen.availWidth - outerWidth;
        var y = screen.availTop  + screen.availHeight - outerHeight;
        window.moveTo(x, y);
        image.style.backgroundColor = "-moz-dialog";
        setTimeout(function(){
          interval = window.setInterval(setOpacity, 200);
        }, 5 * 1000);
      }
      function setOpacity(){
        if (opacity < 0.2){
          stopAndClose();
        }
        opacity -= 0.1;
        image.style.opacity = opacity;
      }
      function stopAndClose(){
        clearInterval(interval);
        window.close();
      }
      ]]></script>
      <vbox id="contents" flex="1"
            style="border:thin solid black;">
        <hbox flex="1">
          <label value={TITLE + "-" + date.toLocaleString()} flex="1"/>
          <toolbarbutton label="X" oncommand="stopAndClose()" style="padding:0;margin:0;"/>
        </hbox>
        <image id="img" src={image_src} onload="init()" onerror="window.close()"/>
      </vbox>
    </window></>.toXMLString(),
    TITLE,
    'chrome,dialog=yes,titlebar=no,popup=yes');
}
let self = {
  start: function(){
    showBijinClock();
    if (interval) this.stop();
    interval = window.setInterval(showBijinClock, 60 * 1000);
    return interval;
  },
  stop: function(){
    if (interval){
      window.clearInterval(interval);
    }
    let w = Cc["@mozilla.org/appshell/window-mediator;1"]
      .getService(Ci.nsIWindowMediator)
      .getMostRecentWindow("alert:clock")
    if (w) w.close();
  },
};
setTimeout(function(){showBijinClock();}, 0);
setTimeout(function(){self.start();}, 60 * 1000 - Date.now() % (60*1000));

return self;
})();
// vim:sw=2 ts=2 et:
lass="err">。 ロッカージェスチャはL>R(右クリック), L<R(左クリック)で指定可能 ホイールジェスチャは W-(回転), W+(上回転)で指定可能 - Description コマンドの説明文 - Command ジェスチャーが実施された際に実行するコマンドを指定します 以下の3通りの指定が可能です - '#id' document.getElementById(id).doCommand() を実行します - function() { ... } 記述された関数を実行します - ':[command]' Vimperatorのユーザコマンド [command]を実行します - '[key]' キーを送ります - noremap flag キーを送るかつそのキーコードを noremap で処理を行いたい場合true を指定してください ]]></detail> </VimperatorPlugin> liberator.plugins.MouseGestures = (function() { const Ci = Components.interfaces; var global = liberator.globalVariables; if (typeof global.mousegesture_list == 'undefined') return; if (liberator.plugins.MouseGestures) liberator.plugins.MouseGestures.registerEvents('remove'); var Class = function() function() {this.initialize.apply(this, arguments);}; var MouseGestures = new Class(); var doCommandByID = function(id) { if (document.getElementById(id)) document.getElementById(id).doCommand(); }; MouseGestures.prototype = { initialize: function() { this.parseSetting(); var self = this; this.registerEvents('add'); window.addEventListener('unload', function() { self.registerEvents('remove'); }, false); }, parseSetting: function() { var gestures = {}; var self = this; this._showstatus = global.mousegesture_showmsg || true; this._enableRocker = global.mousegesture_rocker || false; this._enableWheel = global.mousegesture_wheel || false; if (this._enableRocker) this.captureEvents.push('draggesture'); if (this._enableWheel) this.captureEvents.push('DOMMouseScroll'); global.mousegesture_list.forEach(function( [gesture, desc, action, noremap] ) { action = action || desc; noremap = noremap || false; if (typeof action == 'string') { let str = action; if (str.charAt(0) == ':') action = function() liberator.execute(str.substr(1)); else if (str.charAt(0) == '#') action = function() doCommandByID(str.substr(1)); else action = function() modules.events.feedkeys(str, noremap); } gestures[gesture] = [desc, action]; }); this.GESTURES = gestures; }, captureEvents : ['mousedown', 'mousemove', 'mouseup', 'contextmenu'], registerEvents: function(action) { var self = this; this.captureEvents.forEach( function(type) { getBrowser().mPanelContainer[action + 'EventListener'](type, self, type == 'contextmenu' || type == 'draggesture'); }); }, set status(msg) { if (this._showstatus) commandline.echo(msg, null, commandline.FORCE_SINGLELINE); }, handleEvent: function(event) { switch(event.type) { case 'mousedown': if (event.button == 2) { this._isMouseDownR = true; this._suppressContext = false; this.startGesture(event); if (this._enableRocker && this._isMouseDownL) { this._isMouseDownR = false; this._suppressContext = true; this._gesture = 'L>R'; this.stopGesture(event); } } else if (this._enableRocker && event.button == 0) { this._isMouseDownL = true; if (this._isMouseDownR) { this._isMouseDownL = false; this._suppressContext = true; this._gesture = 'L<R'; this.stopGesture(event); } } break; case 'mousemove': if (this._isMouseDownR) this.progressGesture(event); break; case 'mouseup': if (this._isMouseDownR && event.button == 2) { this._isMouseDownR = false; this._suppressContext = !!this._gesture; if (this._enableWheel && this._gesture && this._gesture.charAt(0) == 'W') this._gesture = ''; this.stopGesture(event); if (this._shouldFireContext) { // for Linux & Mac this._shouldFireContext = false; let mEvent = event.originalTarget.ownerDocument.createEvent('MouseEvents'); mEvent.initMouseEvent('contextmenu', true, true, aEvent.originalTarget.defaultView, 0, event.screenX, event.screenY, event.clientX, event.clientY, false, false, false, false, 2, null); event.originalTarget.dispatchEvent(mEvent); } } else if (this._isMouseDownL && event.button == 0) this._isMouseDownL = false; break; case 'contextmenu': if (this._suppressContext || this._isMouseDownR) { this._suppressContext = false; this._shouldFireContext = this._isMouseDownR; event.preventDefault(); event.stopPropagation(); } break; case 'DOMMouseScroll': if (this._enableWheel && this._isMouseDownR) { event.preventDefault(); event.stopPropagation(); this._suppressContext = true; this._gesture = 'W' + (event.detail > 0 ? '+' : '-'); this.stopGesture( event, false ); } break; case 'draggesture': this._isMouseDownL = false; break; } }, startGesture: function(event) { this._gesture = ''; this._x = event.screenX; this._y = event.screenY; this._origDoc = event.originalTarget.ownerDocument; this._links = []; }, progressGesture: function(event) { if (!this._origDoc) return; for (let node = event.originalTarget; node; node = node.parentNode) { if (node instanceof Ci.nsIDOMHTMLAnchorElement) { if (this._links.indexOf(node.href) == -1) this._links.push(node.href); break; } } this.timerGesture(); var x = event.screenX, y = event.screenY; var distX = Math.abs(x-this._x), distY = Math.abs(y-this._y); var threshold = 15/ (gBrowser.selectedBrowser.markupDocumentViewer.fullZoom || 1.0); if (distX < threshold && distY < threshold) return; var dir = distX > distY ? (x<this._x ? 'L' : 'R') : (y<this._y ? 'U': 'D'); if (dir != this._gesture.slice(-1)) { this._gesture += dir; this.status = 'Gesture: ' + this._gesture + (this.GESTURES[this._gesture] ? ' (' + this.GESTURES[this._gesture][0] + ')' : ''); } this._x = x; this._y = y; }, timerGesture: function(isClear) { if (this._timer) clearTimeout(this._timer); this._timer = setTimeout( !isClear ? function(self) self.stopGesture({}, true) : function(self) self._timer = self.status = '', 1500, this); }, stopGesture: function(event, cancel) { if (this._gesture) { try { if (cancel) throw 'Gesture Canceled'; let cmd = this.GESTURES[this._gesture] || null; /* if ( !cmd && this.GESTURES['*'] ) { for (let key in this.GESTURES['*']) { if (this.GESTURES['*'][key].test(this._gesture)) { cmd = this.GESTURES[key]; break; } } } */ if (!cmd) throw 'Unknown Gesture: ' + this._gesture; cmd[1].call(this); this.status = 'Gesture: ' + cmd[0]; } catch (exp) { this.status = exp; } this.timerGesture(true); } this._origDoc = this._links = null; } }; return new MouseGestures(); })();