diff options
| author | pekepeke | 2008-12-28 08:34:42 +0000 | 
|---|---|---|
| committer | pekepeke | 2008-12-28 08:34:42 +0000 | 
| commit | da461d13a4de4db7c1423bd2ef1d9fd39f5cca87 (patch) | |
| tree | bc6fc65358b0fd49b6c9ec6f0e6fddc5887d23fb | |
| parent | 17e603ef270cc86581f1b3c02ee25f5862e07c19 (diff) | |
| download | vimperator-plugins-da461d13a4de4db7c1423bd2ef1d9fd39f5cca87.tar.bz2 | |
新規追加
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@27514 d0d07461-0603-4401-acd4-de1884942a52
| -rw-r--r-- | mouse_gestures.js | 249 | ||||
| -rw-r--r-- | uaSwitchLite.js | 141 | 
2 files changed, 390 insertions, 0 deletions
| diff --git a/mouse_gestures.js b/mouse_gestures.js new file mode 100644 index 0000000..48c2d00 --- /dev/null +++ b/mouse_gestures.js @@ -0,0 +1,249 @@ +var PLUGIN_INFO = +<VimperatorPlugin> +  <name>Mouse Gestures</name> +  <name lang='ja'>マウスジェスチャー</name> +  <description>mouse gestures</description> +  <description lang='ja'>マウスジェスチャー</description> +  <version>0.10</version> +  <author>pekepeke</author> +  <minVersion>2.0pre</minVersion> +  <maxVersion>2.0pre</maxVersion> +  <updateURL>http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/mouse_gestures.js</updateURL> +  <detail lang='ja'><![CDATA[ +  == .vimperatorrc example == +  js <<EOM +  liberator.globalVariables.mousegesture_showmsg = true;  // default is true +  liberator.globalVariables.mousegesture_rocker = true;  // default is false +  liberator.globalVariables.mousegesture_wheel = true;  // default is false +  liberator.globalVariables.mousegesture_list = [ +    //['UDLR', 'Description', '#id or function or :vimp command or vimp_key', noremap flag] +    ['L'  , 'Back', '#Browser:Back'], +    ['R'  , 'Forward', '#Browser:Forward'], +    ['RLR', 'Close Tab Or Window', '#cmd_close'], +    ['LD' , 'Stop Loading Page', '#Browser:Stop'], +    ['LR' , 'Undo Close Tab', '#History:UndoCloseTab'], +    ['UL' , 'Select Previous Tab' ,'gT', true], +    ['UR' , 'Select Next Tab' ,'gt', true], +    ['LU' , 'Scroll To Top', function() goDoCommand('cmd_scrollTop')], +    ['LD' , 'Scroll To Bottom', function() goDoCommand('cmd_scrollBottom')], +    ['UDR', 'Add Bookmark', ':dialog addbookmark'], +    ['L>R'  , 'Forward', '#Browser:Forward'], +    ['L<R'  , 'Back', '#Browser:Back'], +    ['W-' , 'Select Previous Tab' , function() gBrowser.tabContainer.advanceSelectedTab(-1, true) ], +    ['W+' , 'Select Next Tab' , function() gBrowser.tabContainer.advanceSelectedTab(+1, true) ], +  ]; +  EOM +  == liberator.globalVariables == +  - mousegesture_showmsg +    ジェスチャー情報を表示するかどうか(デフォルト=true:表示する) +  - mousegesture_rocker +    ロッカージェスチャを有効にするかどうか(デフォルト=false:無効) +  - mousegesture_wheel +    ホイールジェスチャを有効にするかどうか(デフォルト=false:無効) +  - mousegesture_list +    ジェスチャー設定。2次元配列で指定してください。 +    [ <UDLR>, <Description>, <Command>, <noremap flag> ] +    -- UDLR +      ジェスチャーを指定します。 +      UDLRの文字列を指定してください。 +      それぞれ、マウスジェスチャーの↑、↓、←, →に対応しています。 +      一応、ロッカージェスチャー・ホイールジェスチャー等にも暫定で対応しています(別途、オプションを有効にする必要がある)。 +      ロッカージェスチャは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; +            var 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'; +           +          var cmd = this.GESTURES[this._gesture] || null; +/* +          if ( !cmd && this.GESTURES['*'] ) { +            for (var 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(); +})(); diff --git a/uaSwitchLite.js b/uaSwitchLite.js new file mode 100644 index 0000000..f56cbee --- /dev/null +++ b/uaSwitchLite.js @@ -0,0 +1,141 @@ +var PLUGIN_INFO = +<VimperatorPlugin> +  <name>UserAgentSwitcherLite</name> +  <description>switch user agent</description> +  <description lang='ja'>user agent ւ</description> +  <version>0.1.0</version> +  <author homepage='http://d.hatena.ne.jp/pekepekesamurai/'>pekepeke</author> +  <minVersion>2.0pre</minVersion> +  <maxVersion>2.0pre</maxVersion> +  <detail lang='ja'><![CDATA[ + == Commands +  :ua [uaname]       - User Agent ւ܂B +  :ua                - User Agent \܂B + + == .vimperatorrrc +javascript <<EOM +liberator.globalVariables.useragent_list = [ +{ +  description: 'Internet Explorer 7 (Windows Vista)', +  useragent: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)', +  appname: 'Microsoft Internet Explorer', +  appversion: '4.0 (compatible; MSIE 7.0; Windows NT 6.0)', +  platform: 'Win32', +}, { +  description: 'Netscape 4.8 (Windows Vista)', +  useragent: 'Mozilla/4.8 [en] (Windows NT 6.0; U)', +  appname: 'Netscape', +  appversion: '4.8 [en] (Windows NT 6.0; U)', +  platform: 'Win32', +}, { +  description: 'Google', +  useragent: 'Googlebot/2.1 (+http://www.google.com/bot.html)', +}]; +EOM +  ]]></detail> +</VimperatorPlugin>; + + +liberator.plugins.UserAgentSwitcherLite = (function(){ + +const USER_AGENT = 'general.useragent.override'; +const APP_NAME = 'general.appname.override'; +const APP_VERSION = 'general.appversion.override'; +const PLATFORM = 'general.platform.override'; +const VENDOR = 'general.useragent.vendor'; +const VENDOR_SUB = 'general.useragent.vendorSub'; +const DEFAULT = 'Default'; + +var global = liberator.globalVariables; +global.useragent_list = global.useragent_list ? global.useragent_list : [ +  { +    description: 'Internet Explorer 7 (Windows Vista)', +    useragent: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)', +    appname: 'Microsoft Internet Explorer', +    appversion: '4.0 (compatible; MSIE 7.0; Windows NT 6.0)', +    platform: 'Win32', +    vendor: '', +    vendorSub: '' +  }, { +    description: 'Netscape 4.8 (Windows Vista)', +    useragent: 'Mozilla/4.8 [en] (Windows NT 6.0; U)', +    appname: 'Netscape', +    appversion: '4.8 [en] (Windows NT 6.0; U)', +    platform: 'Win32', +    vendor: '', +    vendorSub: '' +  }, { +    description: 'Opera 9.25 (Windows Vista)', +    useragent: 'Opera/9.25 (Windows NT 6.0; U; en)', +    appname: 'Opera', +    appversion: '9.25 (Windows NT 6.0; U; en)', +    platform: 'Win32', +  } +]; + +var Class = function(){ return function(){ this.initialize.apply(this, arguments); }}; + +var UASwitcherLite = new Class(); +UASwitcherLite.prototype = { +  initialize: function(){ +    // init +    this.completer = []; +    this.switcher = { +      __noSuchMethod__: function(arg) liberator.echoerr('cannot switch useragent "'+arg+'"'), +      '':function(){ +        var ua = options.getPref(USER_AGENT); +        liberator.echo('Current User Agent : ' + (ua ? ua : DEFAULT) ); +      } +    }; +    var self = this; + +    // default values +    this.completer.push([DEFAULT , '']); +    this.switcher[DEFAULT] = function() self.switch(); +     +    // expand setting +    global.useragent_list.forEach( function(item){ +      let desc = item.description; +      let userAgent = item.useragent; +      let appName = item.appname; +      let appVersion = item.appversion; +      let platform = item.platform; +      let vendor = item.vendor; +      let vendorSub = item.vendorSub; +      self.completer.push([desc, userAgent]); +      self.switcher[desc] = function() self.switch(appName, appVersion, platform, userAgent, vendor, vendorSub); +    }); +    this.registerCommand(); +  }, +  switch: function(appName, appVersion, platform, userAgent, vendor, vendorSub){ +    if (!userAgent && !options.getPref(USER_AGENT)) return; +    let setter = userAgent ? options.setPref : options.resetPref; +    setter(APP_NAME, decodeURIComponent(appName || '')); +    setter(APP_VERSION, decodeURIComponent(appVersion || '')); +    setter(PLATFORM, decodeURIComponent(platform || '')); +    setter(USER_AGENT, decodeURIComponent(userAgent || '')); +    setter(VENDOR, decodeURIComponent(vendor || '')); +    setter(VENDOR_SUB, decodeURIComponent(vendorSub || '')); + +  }, +  registerCommand: function(){ +    var self = this; +    commands.addUserCommand(['ua'], 'Switch User Agent', +      function(arg)  +        self.switcher[ arg.string ? arg.string.replace(/\\/g,''): (arg+'').replace(/\\/g,'') ](), +      { +        completer: function(context, args, special){ +          let filter = context.filter; +          context.title = ['Description', 'User Agent']; +          if (!filter) { +            context.completions = self.completer; +            return; +          } +          filter = filter.toLowerCase(); +          context.completions = self.completer.filter( function(el) el[0].toLowerCase().indexOf(filter) == 0 ); +        } +    } ); +  } +}; +return new UASwitcherLite(); +})(); | 
