見出し画像

ChromebookのChromeで右クリックが効かない / 右ダブルクリックでコンテキストメニューが表示される

先日、はじめてChromebookを購入し、現在使ってみているが、Chromeで「なぜか右クリックが効かない」という現象にあった。
Googleで調べてもなかなか原因に行きつかなかったので、簡単にメモ。
結論だけ見たい場合には、目次から大項目「右クリックが効かない理由」を参照のこと。


状況と経緯

自分のChromebookの使い方

前述の通り、先日、はじめてChromebookを購入し使ってみている。
自分はこれまでPCとしてはWindowsしか使ったことが無かったため、しばらくはWindowsデスクトップを母艦として、リモートデスクトップでシンクライアント的に使っていたけど、Chromebook自体の使い勝手を知っておきたいという理由(と、Windowsデスクトップの電源を点けに行くのが面倒くさいという驚くべきものぐさな理由)から、インターネットで調べものや申し込みをしたりする作業について、Chromebook自身のChromeを使ってみた。

その時、最初に気づいた違和感が「なぜか右クリックが効かない」ということ。
自分は調べものをする際、気になるページをどんどん新しいタブで開き、古いページも(戻るボタンを連打することなく)素早く見返したり、一つのページから派生的にいろいろなページを見ていく調べ方をしている。
このため、右クリックでコンテキストメニューを表示し、「新しいタブで開く」を使用する頻度が非常に高い。

そのほか、似たような理由で「リンクのアドレスをコピー」したり、画像やバイナリなどを「名前を付けて保存」をすることも多く、コンテキストメニューが無いと困ってしまう。

Googleで検索してもヒントに行き当たらない

「右クリックが効かない」と思ったのは、いつもと同じように、Chrome上で右クリックを行うも、コンテキストメニューが表示されないから。
「あれ?」と思い、何度も試したり別ページを開いたり、Chromeの再起動、Chromebookの再起動や、マウスをBluetoothで接続していたためBluetoothのオンオフ、再接続、マウス側のオンオフなど、いわゆる「再起動すると治る系」は一通り試すも、改善しない。
もちろん、設定画面も見直すが、右クリックの有効/無効化のような制御に関する項目は見当たらず。

これが自分の環境固有の現象なのか、それとも不具合であるのかもわからないし、解決策を調べるためにも、Googleで検索を行うことにした。
この現象(または不具合)の専門的な呼び方とかはわからないので、直感的なワードで、まずは
「 chromebook 右クリックがきかない」
と検索。
しかし、Chromebookのタッチパッドで右クリック効果を出すための操作方法ばかり引っ掛かる。次に、接続しているマウス(Logicool の MX Ergo。厳密にはトラックボールですが。)が影響しているのかと思い、
chromebook "mx ergo" 右クリックがきかない
で検索するが、今度はそもそも右クリックに関する話題が出てこない。
念のためメーカーのページも確認するが、それっぽい情報見つけられず。
この日はここまでで時間切れで断念。

翌々日、またChromebookを使っていると、「右クリックが効かない」のではなく、「右シングルクリックでは何も起きない」「右ダブルクリックでコンテキストメニューが表示される」ことに気が付いた。
また、Chrome以外の部分では右シングルクリックでコンテキストメニューが表示されることに気が付いた。
さらに、マウスからではなく、タッチパッドから(二本指タップ)でも同様の現象が発生することが確認できた。
これらのことから、
・マウスは無関係
・OSの不具合ではない
・Chrome特有の問題である
ことがわかってきた。

これを踏まえ、
chromebookのchrome 右クリック ダブルクリック
と検索。
しかし結果は思わしくなく、以前の検索と同様にタッチパッドでの右クリックに関する話題ばかり表示される。

原因はChrome拡張機能だった

ここまで何も情報が出ないということは、この現象は広く知られた不具合というより、どちらかというと自分の環境特有の現象っぽい。
そこでふと思い当たったのが、「右クリックの制御に関係しそう、ということであれば、マウスジェスチャが怪しいのでは…?」ということ。

自分はChromebookは初心者だが、Chromeは同期機能によってWindowsで使っていた際の拡張機能が自動的にインストールされている。
(スマホやタブレットのChtomeには反映しないので、最初に拡張機能が同期されているのを見たとき、純粋に「すごいな~」と謎の感動を覚えた)
もともとWindows上のChromeでマウスジェスチャを使うために、拡張機能「simpleGestures」を入れているため、これも反映されている。

試しに「simpleGestures」をオフ(無効)にしてみたところ、右シングルクリックでコンテキストメニューが表示されるようになった!
原因はこのChrome拡張機能だった。
念のためsimpleGesturesの設定を見返してみたが、右クリックをどうこうするような設定は見当たらず、現象を回避するためにはオフにしておくしかないようだ。

右クリックが効かない理由

原因がChrome拡張機能でのマウスジェスチャである、と分かった後、せめてWindows環境での操作感は変えずにマウスジェスチャと右クリックを共存させる方法が無いか、他の拡張機能などを調べていた際、今回の問題の原因っぽい説明が書いてあるページを見つけることができた。

2014年の古い情報だが、このページの中ほどに、次のような記述がある。

では Gestures for Google Chrome か? この拡張機能はどうやらクリーンなようです。メジャーどころで探すならこれしかないでしょう。しかし、残念ながら Chromebook では動作しません。

理由は 3 つあります:

Chromebook の Chrome OS は Linux ベースの OS である
Mac/Linux 版の Chrome にはもともとマウスジェスチャに不具合がある
Gestures for Google Chrome では不具合対策がなされていない
不具合については私も詳しくないため、適当に検索してください。参考:マウスジェスチャーとかコンテキストメニューを dispatchEvent で表示させようとした調査とか - satosystemsの日記

語弊を恐れず簡単に言うと、Mac/Linux の Chrome では右ボタンのドラッグがうまく検知できずコンテキストメニューが表示されてしまう→そのためジェスチャが動作しない。ということらしいです。

CrxMouse や Smooth Gestures では「右クリックでのコンテキストメニュー表示を禁止する」という方法で Mac/Linux に対応しています(コンテキストメニューを表示したい時は右ダブルクリックします)。

Gestures for Google Chrome ではこういった対策がなされていないため、Chromebook で動かないのです。事実、ダメ元でインストールしてみましたが、やはり使い物になりませんでした。たぶん Windows では大丈夫なのでしょうが。

Chromebook のマウスジェスチャを CrxMouse から miniGestures(+α)に乗り換えた - fudebako

引用の真ん中ほどにある「右クリックでのコンテキストメニュー表示を禁止する」「コンテキストメニューを表示したい時は右ダブルクリックします」という対策が、私が使用しているマウスジェスチャの拡張機能「
simpleGestures」でも採用されているのだろう。
結果、(ChromebookのChrome上で)「右クリックが効かない」という現象が起こっているように見える、ということである。

なお、このページに行き着いた際の検索ワードは、
chromebook マウスジェスチャ
である。
最初に現象に遭遇してその原因を調べたい際に、このワードにたどり着けるかと言うと、それは無理…。
なので、このnoteが今後同じように困った人の参考となることができるよう、あえて「右クリックが効かない」というワードでこの記事を作ってみた。

なお、さらに詳細な原因については、次のページが詳しい。
(上のページでもリンクが貼られている。)

・Windows
  mousedown → mousemove → mouseup → contextmenu
・Mac / Linux
  mousedown → contextmenu → mousemove
OSによって発生するイベントと順番が異なることが問題の原因の様子。
contextmenuの時点でマウスジェスチャ関連の処理を行いたいが、Mac/Linuxでの場合、mouseupが自動的には通知されずマウスジェスチャの終端を検知できないので(本当はもうちょっと複雑な要因ですが)、これを回避するために「右ダブルクリックにコンテキストメニューを割り当てる」という回避策になるよう。

まず、Windows ではコンテキストメニューが表示されるタイミング、つまり contextmenu イベントは mouseup イベントの後に発生します。なので、mousedown → mousemove → mouseup → contextmenu という順番であるため、contextmenu イベントで、マウスジェスチャーが成立しているかどうかを判定して、コンテキストメニューを出す出さないを処理できます。

一方 Mac では mousedown → contextmenu → mousemove という順番でイベントが発生します。なんと、mouseup イベントはリスナーに通知されません。これではジェスチャーの終わりを判定できません。

contextmenu イベントで、コンテキストメニューを出さないように event.preventDefault() を行えば mouseup イベントが通知されます。じゃあ、contextmenu インベント発生時はとりあえずコンテキストメニューを表示しないように制御し、mouseup のタイミングでジェスチャーが成立していなければイベントを生成して dispatchEvent() でそのタイミングでコンテキストメニューを表示させる、という案はどうか。

これを試してみましたが、期待通りには行きません。具体的には contextmenu イベントを発生させること自体はできるのですが、コードで発生させたイベントではコンテキストメニューは現れない、ということがわかりました。

それはこういうことだと理解しました。

ボタン1をクリックするとボタン2にクリックイベントを発生させる処理があったとして、ボタン2のイベント発生時にボタンを実際にクリックしたようなへこむエフェクトが表示されるか。これは以下のコードで確認できますが、されません。
イベント自体をコードで発生させることはできるものの、GUI には影響を与えないのではないか、という結論です。

マウスジェスチャーとかコンテキストメニューを dispatchEvent で表示させようとした調査とか - satosystemsの日記

Chrome 用のマウスジェスチャーはどうしたかというと、以下を使うようにしました。

CrxMouse
これは、Gestures for Google Chrome から派生した拡張で、コンテキストメニュー表示時の mouseup イベントが通知されない問題にどのように対応しているかというと、右クリックでコンテキストメニュー表示を、右ダブルクリックでコンテキストメニュー表示に変更して対応しています。なるほど、それなら確かに干渉しないので、うまい方法だと思います。僕はこの右ダブルクリック機能を Mac であえて無効にして、Mac ではマウスジェスチャーを使用しない、という方向で落ち着きそうです。


なお、Windows は mouseup の後に contextmenu が通知されるのに対し、Mac は mouseup より前に contextmenu が通知されるのは、表示されたコンテキストメニュー上にマウスを移動し、そこでマウスを離すことで項目が選択できるという OS のポリシーです。Wiondows はドラッグした先のターゲットでコンテキストメニューの内容を変更できるので、どちらの考え方も正しくて、たまたま右クリックでマウスジェスチャーという新たな概念が Mac UI にはマッチしなかった、ということだと思います。

マウスジェスチャーとかコンテキストメニューを dispatchEvent で表示させようとした調査とか - satosystemsの日記

そういえば、ChromebookのChromeで、右クリックでコンテキストメニューを表示した際に、意図せず表示されたメニューの機能が実行される(メニューを押した挙動になる)ことがしばしばあるけど、もしかしてこの「マウスを離すことで項目が選択できる」というやつかも。
たぶん自分の右クリックの「指を離す」動作が少し遅めで、この間にマウスを少しでも動かしてしまうと「項目を選んだ」扱いになるんだろうけど、これはちょっと迷惑だなぁ。

ともあれ、Chromeでマウスジェスチャを使う限り、Chromebookでは「コンテキストメニューは右ダブルクリック」以外には回避方法がなさそうなことがわかった。
「右クリックが効かない」問題は、これでいったん解決とする。(解決はしてないけど)

いいなと思ったら応援しよう!