Thanks Driven Life

日々是感謝

Tython で PDF を操作する

アクション PDF の操作
左ジャブ 左へ(ページ戻る)
右ストレート 右へ(ページ進む)
⊂二二二( ^ω^)二⊃ フルスクリーン化(Control + Command + f) OS X のプレビュー.app のスライドショー開始
\(^o^)/ フルスクリーン終了(ESC)

特に大掛かりなことをしているわけではなく、
ソースコード入力の処理を、CGEventCreateKeyboardEvent から CGEventPost につなげるだけ。簡単!

Detector とかはそのまま使う感じで、InputMethod と Controller は以下のようになりました。

#include <ApplicationServices/ApplicationServices.h> 

DefaultInputMethod::DefaultInputMethod(User* _user)
{
    inputList.insert(std::make_pair(123, new LeftJabCommandDetector(_user)));
    inputList.insert(std::make_pair(124, new RightStraightCommandDetector(_user)));
    inputList.insert(std::make_pair(kCGEventFlagMaskShift + kCGEventFlagMaskCommand + 3, new BoonPoseDetector(_user)));
    inputList.insert(std::make_pair(53,  new OwataPoseDetector(_user)));
}
#include <ApplicationServices/ApplicationServices.h> 

void Controller::main(void)
{
    CGEventRef eventRef; 
    IMmap inputList = im->input();
    int keymask = 0x7f;
    int keycode = 0;
    int keyflag = 0;

    while(true) {
        for (IMmap::iterator it = inputList.begin(); it != inputList.end(); ++it) {
            if (it->second->detect()) {
                keycode = (it->first) & keymask;
                keyflag = (it->first) & ~keymask;
                eventRef = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)keycode, true);
                CGEventSetFlags(eventRef, keyflag);
                CGEventPost(kCGSessionEventTap, eventRef);
            }
        }

        ctxGlobal.WaitAndUpdateAll();
    }
}

こんな感じですね。
Shift や Command キーは CGEventSetFlags でやるのがいい感じらしいんですが、
inputList に3つどうやって持たせようかなーって考えるのめんどくさかったんで
mask でどうにかとってます。まあ動いてるからいいじゃないか。
ちなみに Tython を流用して作ったので、CGEvent とか初見調査の時間も含めて 20 分でできた。さすが Tython !!!

上記で書いた場所だけはなくて、地味に他のところもちょくちょく変えてます。
それはこちらでご参照ください GitHub - gongo/Tython at presentation

参考