49

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


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

OSX 10.7 の新しいミッション コントロールが嫌いです。いつも使っていたので、スペースを「グリッド」に戻したいです。以前は矢印キーを使用してスペース間を移動していました (例: ALT+↑</kbd>) every few seconds. Now I'm stuck with this clunky 1x9 array of spaces instead of an elegant 3x3 grid. I've re-mapped all my spaces to use the number pad, which partially takes care of the problem (since it is a 3x3 grid), but only when I have an external keyboard attached.

ALT基本的に+を使えるようにしたい↑</kbd> and ↓</kbd> again, but to do so I need to detect the current space # so that I can switch from space 5-->2, for example.

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

4

8 に答える 8

34

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

  • 各ミッションコントロールの「スペース」が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";
        }
    );
}

スペースを削除すると、そのエントリはファイルから削除されます。スペースを追加すると、エントリが追加されます。繰り返しになりますが、Desktop1またはDashboardのエントリはありません。

uuidディスプレイに表示されているスペースを把握するためのパブリックAPIがあるかどうかはわかりません。uuidディスプレイ1を意味するものはなく、ディスプレイ1+nを意味するものはないと思います。

AppleScriptエディタライブラリ(ウィンドウ--->ライブラリ)をざっと見てみましたが、のシステムイベントの下にエントリが表示されませんでしたspaces。これはおそらくCocoaで、おそらくプライベートAPIを介して実行できることですが、AppleScriptについてはよくわかりません。


更新-2011年7月23日

DockがMissionControlを制御しているようです。次のようにヘッダーファイルを取得できます。

  1. 移動:/System/Library/CoreServices/Dock
  2. 右クリックしてパッケージの内容を表示
  3. ナビゲート:/Contents/MacOS/
  4. バイナリをコピーDockしてデスクトップに貼り付けます。
  5. 走る:$class-dump ~/Desktop/Dock

これにより、すべてのヘッダーファイルが吐き出されます(長い、約7,500行)。spaceUUIDそこに文字列が表示されているのがわかります。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???

WVSpaces秘訣は、 Dock内に埋められたプライベートクラスにアクセスする方法です。NSMutableArray *_spaces;おそらくすべてのスペースがリストされている属性があるため、シングルトンだと思います。WVSpaces一度に表示されるスペースは1つだけです(これは、複数のモニターを使用している場合に当てはまります。スペースは両方にまたがっています)。したがって、インスタンスを1つだけにするのが理にかなっています。

したがって、にアクセスするには、DockのSIMBLハッキングが必要になるようWVSpacesです。

于 2011-07-21T22:38:05.217 に答える
16

私はいろいろ調べていて、これを思いつきました: https://gist.github.com/1129406

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

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

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

private の CGS API を使用して、ID で現在のスペースを設定できますCGSSetWorkspace

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

于 2011-08-06T14:59:50.330 に答える
8

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

あなたは「現在のスペースを検出する必要がある」と言います。これは厳密には正しくありません: 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: 現在のアプリケーション ウィンドウを表示

からUUIDをいくつか入れてみましたdefaults read com.apple.spacesが、あまり効果がありませんでした。暗闇の中で手探りするのはこれで終わりです。

于 2011-08-05T08:33:39.370 に答える
5

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

Space.appを変更します

それを機能させるためのキーは、Ctrl-Shiftキーと矢印キーですが、ALTに固執している場合は、これを修正できる可能性があります。

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

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

そうすれば、3x3グリッドのようにデスクトップを切り替えることができるはずです。

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

于 2011-08-30T13:36:41.540 に答える
3

http://switchstep.com/ReSpaceApp

これは動作し、無料 (現在) であり、素晴らしいものです。

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

于 2012-03-22T06:49:02.400 に答える
2

私はマウンテンライオンにいます、そしてこれは私のために働くようです。

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

于 2012-12-07T04:49:38.710 に答える
2
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
于 2015-03-20T21:23:49.627 に答える