OSX Lion AppleScript:如何从任务控制中获得当前空间#

我试图弄清楚如何从任务控制中获得当前的空间。 来源将是有益的,但更多的帮助将是如何自己解决这个问题的信息。 我已经写了几个applescripts,但更多的时候,似乎任何时候我需要做一些新的(我无法find字典文档)它属于“告诉这个特定的应用程序(例如”系统事件“)这个非常具体的事情”,我不知道如何才能真正解决这个问题。


具体是我想做的事情:

讨厌 OSX 10.7中的新任务控制。 自从我一直使用它,我想要我的空间“网格”。 我曾经每隔几秒使用箭头键(例如ALT + )在空格之间导航。 现在我坚持这个笨重的1x9arrays的空间,而不是一个优雅的3×3网格。 我已经重新映射了所有的空间来使用数字键盘,这部分地处理了问题(因为它是一个3×3网格),但只有当我有一个外部键盘连接。

基本上,我希望能够再次使用ALT + ,但是要做到这一点,我需要检测当前空间#,以便我可以从空间5 – > 2,例如,切换。

戴夫的答案虽然比我预想的要详细得多,但要求编写一个应用程序来做到这一点(加上它仍然不能完全回答这个问题)。 如果可以的话,我宁愿把几个键绑定到一个applescript上。

我试图自己弄清楚这一点。 还没有,但在正确的方向:

  • 每个任务控制“空间”得到一个uuid分配给它…
  • …除了第一个(AFAIK)和仪表板之外。

你可以在这里阅读:

 $ defaults read com.apple.spaces $ defaults read com.apple.desktop 

文件位置:

 ~/Library/Preferences/com.apple.spaces.plist ~/Library/Preferences/com.apple.desktop.plist 

这是我的。 我有四个空格启用,并显示三个条目:

 $ 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或仪表板的条目。

我不确定是否有一个公共的API来找出显示器上显示的uuid空间。 我假设没有uuid意味着显示1,其他人的意思是显示1 + n。

我快速浏览了AppleScript编辑器库(Window —> Library),并没有看到系统事件下的任何spaces条目。 这可能是可以用Cocoa完成的,也许是通过私有API,但我不确定AppleScript。


更新 – 2011年7月23日

它看起来像Dock控制任务控制。 你可以像这样获取它的头文件:

  1. 转到: /System/Library/CoreServices/Dock
  2. 右键单击并显示包装内容
  3. 导航: /Contents/MacOS/
  4. Dock二进制文件复制并粘贴到桌面上。
  5. 运行: $class-dump ~/Desktop/Dock

这将会吐出所有的头文件(很长,几乎7,500行)。 你可以看到spaceUUIDstring出现在那里。 有一个叫做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类? 我假设它是Singleton,因为它有一个NSMutableArray *_spaces; 属性,可能与其中列出的每个空间。 一次只显示一个空间(如果您使用多个监视器,则空间跨越两个空间),所以只有一个WVSpaces实例是WVSpaces

所以它看起来像需要一些SIMBL黑客的Dock来访问WVSpaces

我一直在探索,我想出了这个: https : //gist.github.com/1129406

空格有一个不连续的ID和一个顺序索引(从0开始)。 您可以通过两种方式获得ID:

  • 来自公共API(请参阅get_space_id
  • 来自私人CGS API CGSGetWorkspace

您可以通过使用公共API的索引设置当前空间(尽pipe通知本身没有公开logging):请参阅set_space_by_index

您可以使用专用的CGS API CGSSetWorkspace来设置当前空间。

不能直接获取当前的空间索引。 但是,如果您始终使用同一组九个空格,则可以使用set_space_by_index轮换一次,收集其ID并构build一个映射。 那么你将能够从ID中获得当前索引。

…也一直在这个:)

你说你“需要检测当前空间#”。 这是不正确的:向下移动一行,你只需要移动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方法起作用。

警告 :这不起作用。 当我启动上面的脚本时,我很好地跳了三个空格。 问题是之后我的键盘没有响应:似乎只有窗口pipe理器正在接收事件:我可以closures窗口和切换空间,但是我无法与任何应用程序交互。
我的理论是,当跳转导致当前应用程序在脚本执行过程中发生变化时,会发生这种情况 – 但我不知道如何解决这个问题。

一个相关的观察: Mission Control (即/Applications/Mission Control.app/Contents/MacOS/Mission\ Control )似乎对一些命令行参数作出反应:

  • Mission\ Control :显示任务控制
  • Mission\ Control 1 :显示桌面
  • Mission\ Control 2 :显示当前的应用程序窗口

我试着把一些UUID从defaults read com.apple.spaces ,但那并没有太大的作用。 非常适合在黑暗中摸索。

我写了一个应用程序 – 它适合你吗?

更改Space.app

使它工作的关键是控制转换和箭头键,虽然这可能是固定的,如果你坚持ALT。

确保在开始之前设置了9个空格(桌面),并且需要将系统偏好设置中的默认ctrl-up和ctrl-down键绑定更改为其他内容(在键盘 – >键盘快捷键 – >任务控制:任务控制和显示桌面)。

在第一次运行时,它将循环遍历桌面,以便在首次更改空间时枚举它们。

那么你应该可以在桌面之间切换,比如3×3的网格。

可能有一些皱纹,但它基本上是function性的,至less对我来说。

我在山狮,这似乎为我工作。

defaults read com.apple.spaces

寻找“当前空间”。 你会注意到用不同的活动空格运行这个命令不会改变当前的空间,但是如果你在“系统偏好设置”中选中并取消选中一个checkboxbutton并再次运行它,你会看到它被更新。

希望这可以帮助别人!

编辑:这是丑陋的,但我用这个:

killall Dock && sleep 0.2 && defaults read com.apple.spaces | grep -A1 "Current Space" | tail -1 | awk '{print $NF }' | cut -f1 -d';'

http://switchstep.com/ReSpaceApp

这工作,是免费的(现在),真棒。

只要确保手动创build尽可能多的空间作为您的布局(在首选项)所期待的。

 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 
Interesting Posts