fruitriin / taskbar

aim to make taskbar for use mac
13 stars 2 forks source link

特定のウィンドウを指定してアクティブにしたい #8

Closed fruitriin closed 1 year ago

fruitriin commented 1 year ago

私がやりたいことは、Object-Cのコードが必要なようです。 エントリポイントはswiftのCLIツールで、内部的にobject-cを呼び出すようなコードについて教えてください

fruitriin commented 1 year ago

理解しました。SwiftのCLIツールからObjective-Cのコードを呼び出すためには、いくつかのステップを踏む必要があります。以下に手順を示します:

  1. Objective-Cのコードを含むObjective-Cのソースファイル(.m拡張子)を作成します。

  2. Objective-Cのコードで使用するクラスや関数がある場合は、Objective-Cのヘッダーファイル(.h拡張子)を作成し、必要なインターフェースを定義します。

  3. Objective-CのソースファイルとヘッダーファイルをSwiftのCLIツールのプロジェクトに追加します。これにより、Objective-Cのコードがビルド対象として認識されます。

  4. SwiftのコードからObjective-Cのコードを使用するために、Objective-Cのコードをインポートします。例えば、#import "MyObjectiveCClass.h"のようにしてヘッダーファイルをインポートします。

  5. Objective-Cのクラスや関数をSwiftから呼び出すことができます。Objective-Cのクラスや関数の使い方は、通常のObjective-Cのコードと同様です。

以下は、Objective-Cのコードを含むプロジェクトの雛形例です:

Objective-Cのコード(MyObjectiveCClass.h):

#import <Foundation/Foundation.h>

@interface MyObjectiveCClass : NSObject

- (void)doSomething;

@end

Objective-Cのコード(MyObjectiveCClass.m):

#import "MyObjectiveCClass.h"

@implementation MyObjectiveCClass

- (void)doSomething {
    NSLog(@"Objective-Cのコードが呼び出されました");
}

@end

Swiftのコード(main.swift):

import Foundation

// Objective-Cのヘッダーファイルをインポート
#import "MyObjectiveCClass.h"

// Objective-Cのクラスを使用
let objectiveCInstance = MyObjectiveCClass()
objectiveCInstance.doSomething()

この例では、Objective-CのクラスMyObjectiveCClassがSwiftのコードから呼び出されています。Objective-Cのコードを含むファイルをプロジェクトに追加し、Swiftのコードで適切にインポートして使用することで、Objective-CのコードをSwiftのCLIツールから呼び出すことができます。

プロジェクトの構成やファイルの追加方法は、使用している開発環境やビルドシステムによって異なる場合がありますので、具体的な環境に合わせて手順を進めてください。

fruitriin commented 1 year ago

ビルドのためにswiftcを使っています。何か特別な手順は必要ですか?

fruitriin commented 1 year ago

swiftcを使用してSwiftのCLIツールをビルドする場合でも、Objective-Cのコードを組み込むためのいくつかの特別な手順が必要です。

  1. Objective-Cのソースファイル(.m拡張子)をSwiftのビルドターゲットに追加します。これにより、Objective-Cのコードがビルドプロセスに含まれるようになります。

  2. Objective-Cのヘッダーファイル(.h拡張子)をSwiftのコードから使用する場合は、Objective-Cのコード内でインターフェースを定義し、ヘッダーファイルをインポートして使用することができます。

  3. ビルド時にObjective-Cのフレームワークやライブラリをリンクする必要がある場合は、ビルドコマンドにそれらのフレームワークやライブラリを追加します。

以下は、swiftcを使用してObjective-Cのコードを含むSwiftのCLIツールをビルドするための例です:

swiftc main.swift MyObjectiveCClass.m -o MyCLIApp

この例では、main.swiftMyObjectiveCClass.mの2つのファイルをビルドに含め、MyCLIAppという名前の実行可能ファイルを生成しています。Objective-CのソースファイルをSwiftのコードと一緒にビルドコマンドに指定することで、Objective-Cのコードがビルドプロセスに含まれるようになります。

必要に応じて、ビルド時にObjective-Cのフレームワークやライブラリをリンクする場合は、-frameworkフラグや-lフラグを使用してリンクするフレームワークやライブラリを指定します。

これらの手順に従ってビルドコマンドを構成し、Objective-Cのコードを含むSwiftのCLIツールをビルドすることができます。

fruitriin commented 1 year ago

Objective-CでMac用のCLIツールを作成し、指定されたウィンドウをアクティブにするためには、以下の手順を実行できます。

  1. Objective-Cのソースファイル(.m拡張子)を作成します。

  2. Objective-Cのソースファイル内で、指定されたウィンドウをアクティブにするためのコードを追加します。この場合、NSRunningApplicationクラスとNSWindowクラスを使用します。

  3. 引数のparentOwnerIdとwindowIdを受け取り、それらの値を使用して指定されたウィンドウを特定します。

  4. 指定されたウィンドウをアクティブにするために、makeKeyAndOrderFront:メソッドを使用します。

以下は、Objective-Cで指定されたウィンドウをアクティブにするCLIツールの例です:

#import <Foundation/Foundation.h>
#import <AppKit/AppKit.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // 引数からparentOwnerIdとwindowIdを取得
        if (argc < 3) {
            NSLog(@"引数が足りません");
            return 1;
        }

        NSString *parentOwnerId = [NSString stringWithUTF8String:argv[1]];
        NSString *windowId = [NSString stringWithUTF8String:argv[2]];

        // parentOwnerIdを使用してNSRunningApplicationを特定
        NSRunningApplication *parentApp = [NSRunningApplication runningApplicationWithProcessIdentifier:[parentOwnerId intValue]];

        if (parentApp) {
            // parentApp内のウィンドウからwindowIdを使用してNSWindowを特定
            NSWindow *window = nil;
            for (NSWindow *appWindow in parentApp.windows) {
                if ([appWindow.windowNumber isEqualTo:windowId]) {
                    window = appWindow;
                    break;
                }
            }

            if (window) {
                // ウィンドウをアクティブにする
                [window makeKeyAndOrderFront:nil];
                [parentApp activateWithOptions:NSApplicationActivateIgnoringOtherApps];
                NSLog(@"指定されたウィンドウをアクティブにしました");
            } else {
                NSLog(@"指定されたウィンドウが見つかりません");
                return 1;
            }
        } else {
            NSLog(@"指定されたプロセスが見つかりません");
            return 1;
        }
    }
    return 0;
}

この例では、NSRunningApplicationクラスとNSWindowクラスを使用して、指定されたウィンドウをアクティブにするObjective-Cのコードを記述しています。

このコードをコンパイルして実行可能ファイルを生成し、コマンドラインから引数として親プロセスのプロセスID(parentOwnerId)とウィンドウID(windowId)を渡すことで、指定されたウィンドウをアクティブにすることがで