macOS Big Sur 11.2.1

M1 Mac の Big Sur を 11.2.1 にアップデート。
やっぱりか、また Command Line Tools が削除されてしまった。

Command Line Tools reinstall | Paepoi Blog

dmg を残しておいて良かった。
多分 Xcode のほうに入っている奴しか見ていないんだろうな。
JXA の NSMakeRect バグについてはもうあきらめているよ。

Clang を再びインストールした所で、前回の続き。

起動すると林檎メニューにもアクセスできないじゃん。
多分 activateIgnoringOtherApps がずっと働いているっぽい。
PyObjC はインタプリタのおかげでメソッドを抜けているのかな。
main 関数内じゃだめだ、デリゲートのハンドラ内に移動する。

#import <Cocoa/Cocoa.h>

// clang app.m -framework Cocoa

@interface AppMenu : NSMenu
@end

@interface AppDelegate : NSObject<NSApplicationDelegate>
@end

@implementation AppDelegate
- (id) init {
    [super init];
    return self;
}
- (void) applicationDidFinishLaunching:(NSNotification *)aNotification{
    NSLog(@"applicationDidFinishLaunching");
    id window = [[[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 200, 200)
        styleMask:NSWindowStyleMaskTitled
        backing:NSBackingStoreBuffered
        defer:NO] autorelease];
    [window cascadeTopLeftFromPoint:NSMakePoint(20,20)];
    [window setTitle:@"日本語"];
    [window makeKeyAndOrderFront:nil];
    //
    // App Active
    //
    [NSApp activateIgnoringOtherApps:YES];
}
@end

@implementation AppMenu
- (id) init {
    [super init];
    id item_app = [[NSMenuItem new] autorelease];
    [self addItem:item_app];
    id menu_app = [[NSMenu new] autorelease];
    [item_app setSubmenu:menu_app];
    id item_quit = [[NSMenuItem new] autorelease];
    [item_quit initWithTitle:@"Quit App" action:@selector(terminate:) keyEquivalent:@"q"];
    [menu_app addItem:item_quit];
    return self;
}
@end

int main(int argc, char *argv[]) {
    // ガベージコレクションではないのでコレを利用
    [NSAutoreleasePool new];
    // NSApp を作る
    [NSApplication sharedApplication];
    // C ではコレが必須だった
    [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
    // command+Q で終了するメニューを入れる
    id main_menu = [[AppMenu new] autorelease];
    [NSApp setMainMenu:main_menu];
    // Delegate に activateIgnoringOtherApps を移動
    id delegate = [[AppDelegate new] autorelease];
    [NSApp setDelegate:delegate];
    // No!!!
    //[NSApp activateIgnoringOtherApps:YES];
    // メインループを回す
    [NSApp run];
    //
    return 0;
}

app

上手くいったのでウインドウも追加。
前回みたいなコードは世界中で見つかるけど誰もこのこと書いていない。

それにしても。
PyObjC や PyGObject って本当に簡単だなって。