web-dev-qa-db-ja.com

OSX Lion AppleScript:ミッションコントロールから現在のスペース番号を取得する方法#

#現在のスペースをミッションコントロールから取得する方法を把握しようとしています。ソースは役に立ちますが、これを自分で理解する方法についての情報が役立つでしょう。私はいくつかのapplescriptを作成しましたが、何か新しいことをする必要があるときはいつでも(辞書のドキュメントが見つからないため)、「この特定のアプリを教えます(例:「システムイベント ")この非常に具体的なこと"と私は実際にそれを理解する方法を知りません。


具体的には私がやろうとしていること:

I hate OSX 10.7の新しいミッションコントロール。ずっと使っていたので、スペースを「グリッド」に戻してほしい。私は以前、矢印キーを使用してスペース間を移動していました(例: ALT+)数秒ごと。これで、エレガントな3x3グリッドではなく、このぎこちない1x9のスペースの配列で立ち往生しています。私はすべてのスペースをテンキーを使用するように再マップしました。これは(3x3グリッドなので)問題を部分的に処理しますが、外付けキーボードが接続されている場合のみです。

基本的には使えるようにしたい ALT+ そして  ここでも、現在のスペースを検出する必要があります。たとえば、スペース5-> 2から切り替えることができます。

以下のDaveの回答は、私が予想したよりもはるかに詳細ですが、これを行うにはアプリを作成する必要があります(さらに、質問に完全に答えることはできません)。可能であれば、いくつかのキーをAppleScriptにバインドするだけです。

45
Mark Kahn

私はこれを自分で理解しようとしています。まだありませんが、正しい方向に:

  • 各Mission Controlの「スペース」には、uuidが割り当てられます...
  • ...最初のもの(AFAIK)とダッシュボードのものを除いて。

あなたはそれらをここで読むことができます:

$ 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を制御しているように見えます。次のようにしてヘッダーファイルを取得できます。

  1. 移動:/System/Library/CoreServices/Dock
  2. 右クリックしてパッケージの内容を表示
  3. ナビゲート:/Contents/MacOS/
  4. Dockバイナリをコピーしてデスクトップに貼り付けます。
  5. 実行:$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 [〜#〜] が必要になるようです。

30
Dave Gallagher

私はぶらぶらしていて、これを思いつきました: https://Gist.github.com/1129406

スペースには、非順次IDと順次インデックス(0ベース)があります。 IDは次の2つの方法で取得できます。

  • パブリックAPIから(get_space_idを参照)
  • プライベートCGS APIからCGSGetWorkspace

パブリックAPIを使用して、インデックスによって現在のスペースを設定できます(ただし、通知自体は公開されていません):set_space_by_indexを参照

プライベートCGS API CGSSetWorkspaceを使用して、IDで現在のスペースを設定できます。

現在のスペースインデックスを直接できません。ただし、常に同じ9つのスペースのセットを使用している場合は、set_space_by_indexを使用して一度にスペースをローテーションし、それらのIDを収集して、マッピングを作成できます。その後、IDから現在のインデックスを取得できます。

15
LaC

...これにも取り組んでいます:)

あなたは「現在のスペースを検出する必要がある#」と言います。これは厳密には当てはまりません。1行下に移動するには、3スペース右に移動するだけなので、原則として次のようなものをバインドできます。

tell application "System Events" to tell process "WindowServer"
    key code {124, 124, 124} using control down
end tell

alt-down( FastScriptsAlfred 、または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をいくつか入れてみましたが、あまり効果がありませんでした。暗闇の中で手探りするのはこれで終わりです。

8
Janus

私はアプリを書いた-それはあなたのために機能しますか?

Change Space.app

これを機能させるためのキーは、Ctrl-Shiftキーと矢印キーですが、ALTで立ち往生している場合は、これを修正できる場合があります。

開始する前に9つのスペース(デスクトップ)が設定されていることを確認してください。システム環境設定のデフォルトのctrl-upおよびctrl-downキーバインディングを別のものに変更する必要があります(キーボード->キーボードショートカット->ミッションコントロール) :Mission Control and Show Desktop)。

最初の実行時には、最初にスペースを変更したときに、デスクトップを循環して列挙します。

次に、3x3グリッドのようにデスクトップ間で変更できるはずです。

多少のしわがあるかもしれませんが、少なくとも私にとっては基本的に機能しています。

4
sdsykes

http://switchstep.com/ReSpaceApp

これは機能し、無料で(今のところ)、素晴らしいです。

レイアウト(設定で)が期待する数のスペースを手動で作成してください。

2
David Lio

私はマウンテンライオンを利用していますが、これでうまくいくようです。

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';'

2
patcon
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
1
Montaldo