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控制任务控制。 你可以像这样获取它的头文件:
- 转到:
/System/Library/CoreServices/Dock
- 右键单击并显示包装内容
- 导航:
/Contents/MacOS/
- 将
Dock
二进制文件复制并粘贴到桌面上。 - 运行:
$class-dump ~/Desktop/Dock
这将会吐出所有的头文件(很长,几乎7,500行)。 你可以看到spaceUUID
string出现在那里。 有一个叫做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';'
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