Если у меня есть несколько открытых окон OS-X Terminal.app, как я могу переместить одно Окно терминала в другое пространство?
Я рад использовать любой язык сценариев или язык программирования для достижения этого, но предпочел бы AppleScript или вызовы к стандартным платформам.
(Обратите внимание, что это должно переместить только одно окно приложения не все окна.)
Использование частных вызовов в Objective-C/C, неофициально перечисленных здесь
#import <Foundation/Foundation.h>
typedef int CGSConnection;
typedef int CGSWindow;
extern OSStatus CGSMoveWorkspaceWindowList(const CGSConnection connection,
CGSWindow *wids,
int count,
int toWorkspace);
extern CGSConnection _CGSDefaultConnection(void);
int main(int argc, char **argv) {
CGSConnection con = _CGSDefaultConnection();
// replace 2004 with window number
// see link for details on obtaining this number
// 2004 just happened to be a window I had open to test with
CGSWindow wids[] = {2004};
// replace 4 with number of destination space
CGSMoveWorkspaceWindowList(con, wids, 1, 4);
return 0;
}
В отношении недокументированных API действуют стандартные предупреждения: они могут быть взломаны.
На основании ответа cobbal, код перенесен на ruby:
require 'dl';
wid = 2004
dl = DL::dlopen('/System/Library/Frameworks/ApplicationServices.framework/ApplicationServices')
_CGSDefaultConnection = dl.sym("_CGSDefaultConnection", 'I');
CGSMoveWorkspaceWindowList = dl.sym("CGSMoveWorkspaceWindowList", 'IIiII');
con = _CGSDefaultConnection.call();
CGSMoveWorkspaceWindowList.call(con[0], wid, 1, 4);