2010-02-22 14 views
13

Nếu tôi mở nhiều cửa sổ OS. X Terminal.app, làm cách nào để di chuyển một cửa sổ Terminal sang một không gian khác?Làm thế nào tôi có thể di chuyển một cửa sổ Terminal.app bằng cách lập trình sang một không gian khác?

Tôi rất vui khi sử dụng bất kỳ ngôn ngữ lập trình hoặc tập lệnh nào để đạt được điều này, nhưng sẽ thích AppleScript hoặc các cuộc gọi đến các khung tiêu chuẩn.

(Lưu ý đây là để di chuyển chỉ có một cửa sổ của một ứng dụng not all windows.)

+0

hi, anh có đạt được nó ???? Tôi cũng đang cố gắng làm điều này – flow

+0

thật đáng buồn, không - tôi sẽ cập nhật câu hỏi này nếu tôi tìm cách. –

Trả lời

7

Sử dụng cuộc gọi tư nhân trong Objective-C/C, không chính thức niêm yết 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; 
} 

cảnh báo tiêu chuẩn áp dụng về API không có giấy tờ: chúng có thể bị phá vỡ.

+0

Hoạt động tuyệt vời - cảm ơn! –

+1

Lưu ý trên 64bit, int hiện tại có độ dài –

+0

Bất kỳ ai cũng có thể đưa ra một số hướng dẫn/bước cơ bản về cách thực hiện điều này không? –

1

Dựa trên câu trả lời của cobbal, mã chuyển đến 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

Trên 64bit, thay đổi "I" -> "L" và "IIiII" thành "LLlLL" –

+0

Tôi đã thử sử dụng tập lệnh ruby ​​này, nhưng tôi nhận được thông báo lỗi rằng dl.sym chỉ nhận một đối số. Tôi đang chạy Mac OS X 10.6.6 (64bit). Làm thế nào tôi nên thực thi kịch bản ruby ​​của bạn? Tôi không nên đơn giản tạo một tệp chứa mã và sau đó chạy ruby ​​* myfile *? Bất kỳ sự giúp đỡ nào cũng được đánh giá cao. –

+0

Hãy chắc chắn rằng bạn đang sử dụng/usr/bin/ruby ​​- không phải một số mới hơn: $/usr/bin/ruby ​​-v ruby ​​1.8.7 (2009-06-12 patchlevel 174) [universal-darwin10.0] –