[ Home | Programming Tips | Mail ]

Clipboard Implementation


Clipboardの仕組みに対する誤解

 MacOSの Clipboardの仕組みについて誤解している人が多い様ですので、実装がどうなっているかを含めて解説してみます。
 まず第一に

Clipboardは System Wide Globalではありません。
 これが誤解の根本なのですが Scrapは Process毎に存在します。これを Front Processが切り替わる Timing(Major Switchと言います)で Frontに出てくる Processに順番に Copyして受け渡していくことで System Wide Globalな Clipboardが存在するかの様に見せているのです。

 Process毎の Scrapとは Private Scrapのことか、と言う人がいるでしょうが違います。Backgroundにいる Processで PutScrap()した場合を想定してみてください。Process毎に Scrapが分離されていないと、これだけで即他の Processの Scrap内容が変更(破壊)されてしまいます。現在の MacOSでは Scrap内容の変更を想定しているのは Processが Suspend / Resumeする際だけですので、突然 Scrapの内容が変わられても対応できません。
 従って次の事が導き出されます。

Backgroundにいる Processから「GetScrap()/PutScrap()」しても Clipboard(の様に見えている物)の内容は「得られない/変わらない」。「得られる/変わる」のは Process Localな Scrap内容だけ
 次に
確実に Scrap内容を得る(変更を反映させる)には実際に Processの Major Switchを起こすしかない。
 Front Applicationの選択範囲の内容や Clipboardの内容を得て加工したりする FKEY/Extensionがいくつかありますが、これらの Softwareが必ず目的の Dataを得られるとは限らない、ということです。
 これらの Softwareが選択範囲や Clipboard内容を得るためには、Front Processに Scrap内容(Private Scrapを含めて)の変更を直ちに PutScrap()で Process Localな Scrapに反映させる、という事が必要だからです。もちろんこれらの Softwareは 偽の Copy Menu選択や Resume Eventを Postして強制的に PutScrap()をさせるように仕向けていますが、これらが有効に動作する保証はどこにもありません。
 傾向としては Data / Event管理をしっかり行っている Applicationほどこういった Hacking的な動作に惑わされないため Private Scrap内容を得たりするのが難しいです。

 最後に

 確実な動作を望むなら Clipboardの内容(の取得)に依存する様な Software / Script etcは書かない。
 確実な動作を望むなら Apple Event Object Modelに基づいた GetData Apple Eventを使う。また Application側も積極的にこれを Supportする様に努力する。
と言う言葉を結びにしたいと思います。


この Pageは MacOS X + Radio UserLand で作っています。