2009年 04月 06日

iTerm Cmd+で Window 切り替え、あるいは tab sucks

iTerm で Cmd-[0-9] 押したときに (sendEvent を監視してキーイベントをとっているせいで)、ベルが鳴ってしまうんだけど、どうやったら消せるんだろう…… なんかもっとセオリーがあるんだろうか

http://subtech.g.hatena.ne.jp/cho45/20080703/1215016330 このパッチの変わりに

diff --git a/iTermApplicationDelegate.m b/iTermApplicationDelegate.m
index 5bb6f4c..14fda77 100644
--- a/iTermApplicationDelegate.m
+++ b/iTermApplicationDelegate.m
@@ -247,6 +247,23 @@ static BOOL usingAutoLaunchScript = NO;
     [super dealloc];
 }
 
+- (void) setWindowMenuKeyBind
+{
+    NSMenu *windowMenu = [[[NSApp menu] itemWithTitle: @"Window"] submenu];
+    // NSLog(@"windowmenu: %@", [windowMenu title]);
+
+    // XXX
+    int MAGIC_WINDOW_MENU_POSITION = 15;
+
+    int i, c;
+    for (i = 0, c = [windowMenu numberOfItems]; i < c; i++) {
+        if (i < MAGIC_WINDOW_MENU_POSITION) continue; // XXX: magic number
+        // NSLog(@"window menu: %d: %@", i, [[windowMenu itemAtIndex: i] title]);
+        [[windowMenu itemAtIndex: i] setKeyEquivalent: [NSString stringWithFormat: @"%d", i - MAGIC_WINDOW_MENU_POSITION + 1]];
+    }
+}
+
+
 // Action methods
 - (IBAction)newWindow:(id)sender
 {
@@ -255,6 +272,9 @@ static BOOL usingAutoLaunchScript = NO;
 		[[[iTermController sharedInstance] fullScreenTerminal] toggleFullScreen:nil];
 	
     [[iTermController sharedInstance] newWindow:sender];
+    // NSLog(@"newWindow");
+
+   [self setWindowMenuKeyBind]; 
 }
 
 - (IBAction)newSession:(id)sender

で、とりあえず Cmd-[0-9] 切り替えがいい感じにできるように

うーん。これだと不十分だ。閉じたり開いたりするとズレてしまう。

でもいい方法がおもいつかない。単に Terminal.app と同じ挙動にしたいだけなんだけど……

なんで Cocoa の Window Menu に関するドキュメントが全然ないんだろうか…… このメニューって誰が、いつ自動生成してるんだろう? なんのコードも書かずに実装されているから全く意味がわからないことになってる。クソだ

リサイズとかでこの Window Menu のリストの並びが変わってしまうので、このコードは全くダメだ。つかえない

というか、当初の目的の「音をならさない」は、もっと簡単に解決できた。

diff --git a/PTYWindow.m b/PTYWindow.m
index 8207d01..1dc45c3 100644
--- a/PTYWindow.m
+++ b/PTYWindow.m
@@ -130,7 +130,7 @@
                                {
                                        // [[iTermController sharedInstance] terminalWindows]
                                        [[[windows objectAtIndex: i - 1] window] makeKeyAndOrderFront: self];
-                                       break;
+                                       return;
                                }
                        }
                }

というふうにして、このあとにひかえている

if (super) [super sendEvent:event];

を呼ばないようにすればよかった