WebOS Goodies

WebOS の未来を模索する、ゲームプログラマあがりの Web 開発者のブログ。

WebOS Goodies へようこそ! WebOS はインターネットの未来形。あらゆる Web サイトが繋がり、共有し、協力して創り上げる、ひとつの巨大な情報システムです。そこでは、あらゆる情報がネットワーク上に蓄積され、我々はいつでも、どこからでも、多彩なデバイスを使ってそれらにアクセスできます。 WebOS Goodies は、さまざまな情報提供やツール開発を通して、そんな世界の実現に少しでも貢献するべく活動していきます。
Subscribe       

Mac 版 Opera の Ctrl-H 等が二重入力される現象を修正するエクステンション

本日は、 Opera 11.10 公開記念もあわせて Mac 派で Opera 派というマイナー路線をひた走る方々に向けてのネタです。それ以外の方々にはまったく意味がないものですので、華麗にスルーしてください :)

マイノリティである我々 Opera for Mac 市民を苦しめる非道な政策(バグ)のひとつに、 Ctrl がらみのキーシーケンスが二重に入力されてしまうというものがあります。

(Mac・10.62) HTMLフォーム内で、Ctrl-fやCtrl-hなどが二重に入力されてしまう
http://my.opera.com/japanese/forums/topic.dml?id=7...

Opera 11.00 でいったん修正されたものの、 Opera 11.01 で再発し、公開されたばかりの Opera 11.10 にいたるまでずっと放置状態。なんという仕打ちでしょう。

我々はひとつの希望を失った。しかし、これは敗北を意味するのか?否!始まりなのだ!
我らは襟を正し、この戦局を打開しなければならぬ。

悲しみを怒りに変えて、立てよ!国民!

・・・というわけで、勢いにまかせてこの現象を修正する Opera エクステンションを作ってみました。 Opera Extensions に登録しようかとも思ったのですが、まずはベータ版として有志の方にテストしていただきたく、ブログで公開しますOpera Extensions にて公開しました。 Mac で Opera をお使いの方々、ぜひインストールして効果の有無や不具合などをご報告いただけると助かります。

それではインストール方法ですが、以下のページから普通にインストールするだけです。

https://addons.opera.com/addons/extensions/details...

正式な配布サイトではないので警告が表示されますが、 OK をクリックして先に進んでください。とくに設定などはないので、インストールするだけで Ctrl シーケンスが正しく動くようになります。アンインストールはメニューの [ツール]-[エクステンション]-[エクステンションの管理] から行えます。一時的に機能を無効にすることも可能です。

ちなみに、エクステンションでやっていることはごく単純で、以下のような User JavaScript をすべてのサイトで実行しているだけです。

(function() {
  var repeatFlags = {};

  function onEvent(e) {
    if(e.metaKey) {
      if((65 <= e.keyCode && e.keyCode <= 90) ||
         (97 <= e.keyCode && e.keyCode <= 122)) {
        e.preventDefault();
        e.stopPropagation();
        if(e.type == 'keypress') {
          repeatFlags[e.keyCode & 0x1f] = false;
        }
      } else if(e.type == 'keypress' &&
                1 <= e.keyCode && e.keyCode <= 26) {
        if(repeatFlags[e.keyCode]) {
          e.preventDefault();
          e.stopPropagation();
        }
        repeatFlags[e.keyCode] = !repeatFlags[e.keyCode];
      }
    }
  }

  if(/^mac/i.test(window.navigator.platform)) {
    document.addEventListener('keypress', onEvent, true);
    document.addEventListener('keydown', onEvent, true);
    document.addEventListener('keyup', onEvent, true);
  }
})();

ソースコードはこちらで公開しています。

http://code.google.com/p/fix-mac-opera/

私がよく使うサイトで試した限りですが、通常のテキストエリアとリッチテキストエディタの両方で Ctrl のシーケンスが正しく動くことを確認しています。もし不具合を見つけた場合は、この記事のコメントや @webos_goodies で教えていただければ、できる限り対処したいと思います。報告前にエクステンションを無効にして、エクステンション自体の不具合であることを確認してもらえると助かります。

ところで、この現象に関する英語の情報がほとんどないんですが、日本語環境でしか起こらないんですかね。 IME がらみかなぁ…。このあたりの情報も募集中です。英語環境でも発生するそうです(@edvakfさん、ありがとうございます!)。

それでは、 Happy opera life! :)


2011/4/13 キーリピートへの対応ができていなかったので修正しました。
2011/4/14 Opera Extensions の公式サイトにて公開しました。

関連記事

この記事にコメントする

Recommendations
Books
「Closure Library」の入門書です。
詳しくはこちらの記事をどうぞ!
Categories
Recent Articles