YACReader をカスタマイズする

2019年12月15日

macOS 14 Mojave にアップデートして cooViewer を起動すると、「32 bit はもうアカン」というような警告が、ときどき表示されるようになった。

そうこうしているうちに geocities が閉鎖されることになり、cooViewer のダウンロードも出来なくなってしまった。cooViewer は Homebrew cask でもインストール出来たのだが、これもまたデリートされてしまっている。

すごく、いいビューアだった。機能のすべてを使用したわけではないものの、正直、いまだに頭ひとつ抜け出ているのではないか。という印象がある。

Mac を使っていると、この手の寂しい別れをよく味わうはめになる。
 cooViewer の作者さんには、心からの感謝を捧げたい。

YACReader を使ってみる

cooViewer の代替をググってみたら、YACReader というアプリを紹介する記事と出会った。YACReader は 64 bit で動作するらしく、しばらくは安泰だろう。

🔗 YACReader

「The best way for reading your comics」などとあり、期待が高まる。
 Windows、macOS、iOS、Linux にもインストールできるようだ。

macOS の場合、Homebrew cask でも YACReader をインストールできるので、Homebrew を使っているひとにはおすすめだ。

brew cask install yacreader

起動すると、縦に長いウィンドウがあらわれる。
 zip ファイルや pdf などをウィンドウにドロップすると内容が表示される。ただし、画像の入ったフォルダはドロップできない。コマンド + o でフォルダを選択することは出来る。

これを出来るだけ、cooViewer で自分が使っていたように使ってみたい。

操作をカスタマイズする

YACReader のキーボードショートカットは、window メニューの「Show keyboard shortcuts」で一覧できる。ショートカットの部分をダブルクリックすれば、自分用に設定することも可能だ。

わたしの場合、どのように cooViewer を使っていたか思い出してみる。
 zip ファイルなどを cooViewer にドロップすると、フルスクリーンで表示してくれていた。YACReader の場合は f キーを押すとフルスクリーン/ウィンドウ表示のトグルで、一度フルスクリーンにすれば、次回の起動の時も設定を覚えていてくれる。
 また、少々邪魔なツールバーは h キーで表示/隠すを操作でき、これも次回の起動に反映される。

両開きの表示は d キー。
 ページ送りの方向は j キーで切り替える。
 これらも一度設定すれば、次回起動時に適用される。
 矢印ボタンによるページ送りは、キーボードショートカットの設定画面でイジれる。
 スペースキーで次ページという設定は、デフォルトでそのようになっている。

これでだいたい、わたしの使い方は再現できたと思う。
 ひとつだけ、cooViewer は左のページをクリックすると、次ページへ、右のページをクリックすると前のページに戻ってくれた。これを再現する方法がちょっとわからない。

クリックによるページ送り

仕方がないので、Hammerspoon のコードを書いてみた。

🔗 Hammerspoon

一応下に掲載してみるものの、あまり出来のよろしくないコードで、フルスクリーンだと、メニューの操作に支障が出てくる。
 ちなみにわたしは、左キーで次ページ、右キーで前ページへ移動するようカスタマイズしている。

🧟 追記 19.12.15
 前のコードはあまりにヒドかったので、さすがに修正しました。

  • ダブルクリックでフルスクリーンになるのを抑制した。ただ、完全には抑制できてない。
  • メニューを多少、いじれるようになった。
  • プリファレンスのウィンドウを触れるようになった。
  • フルスクリーンでも多少はメニューをいじれるようになった、と思う。環境によるかもしれない。
  • ウィンドウの縁 30px 分はクリックしても反応しないようにした。ウィンドウの大きさを変える場合にそなえて。
  • というか前のコードだと数字のウィンドウの数値の取り方がめちゃくちゃだったのでそれを修正した。

📝 init.lua

local menuClick = 'off'
local function mousePress(event)
    if event:getButtonState(0) and menuClick == 'off' then
        menuClick = 'off'
        local win = hs.window.focusedWindow()
        local frame = win:frame()
        local y = (frame.y + 30)
        local x = (frame.x + 30)
        local w = (frame.w + x - 60)
        local h = (frame.h + y - 60)
        local size = (frame.w / 2 + x - 30)
        local loc = hs.mouse.getRelativePosition()
        local state = win:isStandard()
        
        if (y < loc["y"]) and (x < loc["x"]) and (h > loc["y"]) and (w > loc["x"])  and state then
        
            if (size >= loc["x"]) then
                hs.eventtap.keyStroke({}, "left", 0)
            else
                hs.eventtap.keyStroke({}, "right", 0)
            end

            if event:getProperty(event.properties.mouseEventClickState) == 2 then
                event:setProperty(event.properties.mouseEventClickState, 1)
            end
        else
            menuClick = 'on'
        end
    else
        menuClick = 'off'
    end
    return false
end

yac = hs.eventtap.new({hs.eventtap.event.types.leftMouseDown}, mousePress)

local function yacmouse(name, event, app)
  if event == hs.application.watcher.activated then
    if name == 'YACReader' then
        yac:start()
    else
        yac:stop()
    end
  end
end

yacWatcher = hs.application.watcher.new(yacmouse)
yacWatcher:start()

getButtonState(0)
 クリックを検知して bool 値を返す。0 は左クリックをあらわす。

hs.window.focusedWindow
 フォーカスされたウィンドウを取得する。YACReader のウィンドウの、左右どちら側をクリックしたのかを確認するため、サイズを知りたいのである。

frame()
 取得したウィンドウの幅、高さ、x、yの位置を hs.geometry という形式で返してくれる。
 変数.w や、変数.h で、幅や高さの数字を取り出せる。

hs.mouse.getRelativePosition
 マウスの位置をテーブルで返してくれる。テーブル[“x”]、テーブル[“y”] などとやると、数字を取り出せる。

hs.application.watcher
 後半は、application.watcher でアプリを監視し、アプリが YACReader に切り替わった時だけ、マウスイベントをスタートするようにした。

これでだいたい、満足のいくカスタマイズが出来たと思う。
 けどやっぱり、まったく同じようにはいかない。
 cooViewer は左上に残りページを示すゲージみたいなのがあって便利だった。それと cooViewer はアプリを終了しても、前に開いた zip などを覚えていてくれており、これも地味に便利だった。
 とはいえ、泣いたって cooViewer は帰ってこない。開発終了は寂しい話だが、われわれは前に進むべき時なんだろう。