2010-02-22 8 views
13

Si plusieurs fenêtres OS.X Terminal.app sont ouvertes, comment puis-je déplacer une fenêtre Terminal vers un autre espace?Comment puis-je déplacer une fenêtre Terminal.app par programme vers un autre espace?

Je suis heureux d'utiliser n'importe quel script ou langage de programmation pour y parvenir, mais je préférerais AppleScript ou les appels aux frameworks standards.

(Notez que c'est de déplacer une seule fenêtre d'une application not all windows.)

+0

salut, avez-vous y parvenir ???? J'essaie aussi de faire ceci – flow

+0

malheureusement, non - je mettrai à jour cette question si jamais je trouve un moyen. –

Répondre

7

L'utilisation des appels privés à Objective-C/C, la liste non officielle here

#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; 
} 

avertissements standard s'appliquent sur les API non documentées: ils sont sujets à la rupture.

+0

Fonctionne très bien - merci! –

+1

Note sur 64bit, les int sont maintenant –

+0

Quelqu'un peut-il donner quelques instructions de base/étapes sur la façon de mettre en œuvre réellement cela? –

1

Sur la base de la réponse de cobbal, le code porté à 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); 
+0

Sur 64bits, changez le "I" -> "L" et "IIiII" en "LLlLL" –

+0

J'ai essayé d'employer ce manuscrit de ruby, mais j'obtiens un message d'erreur que dl.sym prend seulement un argument. Je cours Mac OS X 10.6.6 (64bit). Comment dois-je exécuter votre script ruby? Ne devrais-je pas simplement créer un fichier contenant le code, puis exécuter ruby ​​* myfile *? Toute aide est très appréciée. –

+0

Assurez-vous que vous utilisez/usr/bin/ruby ​​- pas un nouveau: $/usr/bin/ruby ​​-v ruby ​​1.8.7 (2009-06-12 patchlevel 174) [universal-darwin10.0] –