#現在のスペースをミッションコントロールから取得する方法を把握しようとしています。ソースは役に立ちますが、これを自分で理解する方法についての情報が役立つでしょう。私はいくつかのapplescriptを作成しましたが、何か新しいことをする必要があるときはいつでも(辞書のドキュメントが見つからないため)、「この特定のアプリを教えます(例:「システムイベント ")この非常に具体的なこと"と私は実際にそれを理解する方法を知りません。
具体的には私がやろうとしていること:
I hate OSX 10.7の新しいミッションコントロール。ずっと使っていたので、スペースを「グリッド」に戻してほしい。私は以前、矢印キーを使用してスペース間を移動していました(例: ALT+↑)数秒ごと。これで、エレガントな3x3グリッドではなく、このぎこちない1x9のスペースの配列で立ち往生しています。私はすべてのスペースをテンキーを使用するように再マップしました。これは(3x3グリッドなので)問題を部分的に処理しますが、外付けキーボードが接続されている場合のみです。
基本的には使えるようにしたい ALT+↑ そして ↓ ここでも、現在のスペースを検出する必要があります。たとえば、スペース5-> 2から切り替えることができます。
以下のDaveの回答は、私が予想したよりもはるかに詳細ですが、これを行うにはアプリを作成する必要があります(さらに、質問に完全に答えることはできません)。可能であれば、いくつかのキーをAppleScriptにバインドするだけです。
私はこれを自分で理解しようとしています。まだありませんが、正しい方向に:
uuid
が割り当てられます...あなたはそれらをここで読むことができます:
$ defaults read com.Apple.spaces
$ defaults read com.Apple.desktop
ファイルの場所:
~/Library/Preferences/com.Apple.spaces.plist
~/Library/Preferences/com.Apple.desktop.plist
こちらが私のものです。 4つのスペースが有効になっていて、3つのエントリが表示されます。
$ defaults read com.Apple.spaces
{
spaces = (
{
type = 0;
uuid = "9F552977-3DB0-43E5-8753-E45AC4C61973";
},
{
type = 0;
uuid = "44C8072A-7DC9-4E83-94DD-BDEAF333C924";
},
{
type = 0;
uuid = "6FADBDFE-4CE8-4FC9-B535-40D7CC3C4C58";
}
);
}
スペースを削除すると、そのエントリはファイルから削除されます。スペースを追加すると、エントリが追加されます。この場合も、デスクトップ1またはダッシュボードのエントリはありません。
ディスプレイに表示されているuuid
のスペースを把握するためのパブリックAPIがあるかどうかはわかりません。私は、uuid
がディスプレイ1を意味するものではなく、他のユーザーがディスプレイ1 + nを意味すると仮定します。
AppleScriptエディタライブラリ(ウィンドウ--->ライブラリ)をざっと見て、システムイベントの下にspaces
のエントリが表示されませんでした。これはおそらく、おそらくプライベートAPIを介してCocoaで実行できるものですが、AppleScriptについてはわかりません。
更新-2011年7月23日
DockがMission Controlを制御しているように見えます。次のようにしてヘッダーファイルを取得できます。
/System/Library/CoreServices/Dock
/Contents/MacOS/
Dock
バイナリをコピーしてデスクトップに貼り付けます。$class-dump ~/Desktop/Dock
これにより、すべてのヘッダーファイルが出力されます(これは長く、ほぼ7,500行です)。そこにspaceUUID
文字列が表示されます。 Mission Controlで単一のスペースを表すように見えるWVSpace
というクラスと、他の多くのWV *クラスがあります。
明日も見ていきます。疲れすぎた。 :)
更新-2011年7月24日
Dockの内部には、WVSpaces
というクラスがあります。これには、次のような多くの属性があります。
WVSpace *currentSpace;
unsigned int currentWorkspace;
WVSpace *nextSpace; // Space on the right???
WVSpace *previousSpace; // Space on the left???
BOOL currentSpaceIsDashboard;
BOOL dashboardIsCurrent;
...lots more...
各WVSpace
クラスにはNSString *_uuid;
属性があり、これはおそらくSpaceUUIDです。したがって、理論的には次のように現在のスペース番号を取得できます。
WVSpace *currentSpace = [[WVSpaces sharedInstance] currentSpace];
NSString *currentSpaceUUID = [currentSpace _uuid]; // Empty string if main space???
コツは、Dock内に埋め込まれたプライベートWVSpaces
クラスにアクセスする方法です。おそらくすべてのスペースがリストされているNSMutableArray *_spaces;
属性があるため、これはシングルトンであると想定しています。一度に表示されるスペースは1つだけです(これは、複数のモニターを使用している場合にも当てはまります。スペースは両方のモニターにまたがっています)。したがって、WVSpaces
インスタンスを1つだけ持つことは理にかなっています。
したがって、WVSpaces
にアクセスするには、Dockのハッキング [〜#〜] simbl [〜#〜] が必要になるようです。
私はぶらぶらしていて、これを思いつきました: https://Gist.github.com/1129406
スペースには、非順次IDと順次インデックス(0ベース)があります。 IDは次の2つの方法で取得できます。
get_space_id
を参照)CGSGetWorkspace
パブリックAPIを使用して、インデックスによって現在のスペースを設定できます(ただし、通知自体は公開されていません):set_space_by_index
を参照
プライベートCGS API CGSSetWorkspace
を使用して、IDで現在のスペースを設定できます。
現在のスペースインデックスを直接できません。ただし、常に同じ9つのスペースのセットを使用している場合は、set_space_by_index
を使用して一度にスペースをローテーションし、それらのIDを収集して、マッピングを作成できます。その後、IDから現在のインデックスを取得できます。
...これにも取り組んでいます:)
あなたは「現在のスペースを検出する必要がある#」と言います。これは厳密には当てはまりません。1行下に移動するには、3スペース右に移動するだけなので、原則として次のようなものをバインドできます。
tell application "System Events" to tell process "WindowServer"
key code {124, 124, 124} using control down
end tell
alt-down( FastScripts 、 Alfred 、またはAutomatorのオーバーヘッドを回避するその他の高速なメソッドを使用)。もちろん、下の行にヒットした場合、このアプローチは失敗します-しかし、本当にハードワイヤードである場合は、決して行いません:)key code
アプローチを機能させるには、[ユニバーサルアクセス]設定ペインで[支援デバイスのアクセスを有効にする]が必要です。
警告:これは機能しません。上記のスクリプトを起動すると、3つのスペースにうまくジャンプします。問題は、その後キーボードが応答しなくなることです。ウィンドウマネージャーのみがイベントを受信しているようです。ウィンドウを閉じてスペースを切り替えることはできますが、アプリケーションと対話できません。
私の理論では、ジャンプが原因でスクリプトの実行中に現在のアプリケーションが変更されたときにこれが発生しますが、これを修正する方法がわかりません。
関連する所見:Mission Control
(つまり、/Applications/Mission Control.app/Contents/MacOS/Mission\ Control
)は、いくつかのコマンドライン引数に反応するようです:
Mission\ Control
:ミッションコントロールを表示Mission\ Control 1
:デスクトップを表示Mission\ Control 2
:現在のアプリケーションウィンドウを表示defaults read com.Apple.spaces
のUUIDをいくつか入れてみましたが、あまり効果がありませんでした。暗闇の中で手探りするのはこれで終わりです。
私はアプリを書いた-それはあなたのために機能しますか?
これを機能させるためのキーは、Ctrl-Shiftキーと矢印キーですが、ALTで立ち往生している場合は、これを修正できる場合があります。
開始する前に9つのスペース(デスクトップ)が設定されていることを確認してください。システム環境設定のデフォルトのctrl-upおよびctrl-downキーバインディングを別のものに変更する必要があります(キーボード->キーボードショートカット->ミッションコントロール) :Mission Control and Show Desktop)。
最初の実行時には、最初にスペースを変更したときに、デスクトップを循環して列挙します。
次に、3x3グリッドのようにデスクトップ間で変更できるはずです。
多少のしわがあるかもしれませんが、少なくとも私にとっては基本的に機能しています。
私はマウンテンライオンを利用していますが、これでうまくいくようです。
defaults read com.Apple.spaces
「現在のスペース」を探してください。別のアクティブなスペースでこのコマンドを実行しても現在のスペースは変更されないことに気づくでしょう。しかし、[システム環境設定]のチェックボックスボタンをオン/オフにして再度実行すると、更新されたことがわかります。
うまくいけば、これは他の誰かを助けるでしょう!
編集:それは醜いですが、私はこれを使用しています:
killall Dock && sleep 0.2 && defaults read com.Apple.spaces | grep -A1 "Current Space" | tail -1 | awk '{print $NF }' | cut -f1 -d';'
on openNewSpace()
tell application "System Events"
—start mission control
do Shell script "/Applications/Mission\\ Control.app/Contents/MacOS/Mission\\ Control"
tell process "Dock"
set countSpaces to count buttons of list 1 of group 1
--new space
click button 1 of group 1
--switch to new space
repeat until (count buttons of list 1 of group 1) = (countSpaces + 1)
end repeat
click button (countSpaces + 1) of list 1 of group 1
end tell
end tell
end openNewSpace