2009-04-08

MacVim Dockアイコン跳ね続け問題解決

http://fifnel.com/2009/04/07/2300/
> 最初はMacVimなどを使っていたのですが、他のはiminsert=0が使えませんでした。


MacVimで :set noimdisable すると、Dockでアイコンがはね続けちゃいますからね...


MacVimから呼び出される方のVimでCarbonのKeyScriptを呼び出しているのが原因なのですが、CarbonのAPIを呼び出したくせにGUI的なイベントをハンドルしてないから、とかでしょうか。


#include <Carbon/Carbon.h>
int main() {KeyScript(smKeySysScript); for(;;){sleep(1);} return 0;}


gcc a.c -framework Carbon

./a.out とかやってもアイコン跳ねたりしませんが、./a.outをapplication bundleに突っ込んでダブルクリックしたら、見事に跳ね続けました。


ということで、MacVim側でKeyScriptを実行するようにしてみました。アイコン跳ねません!

MacVim-Kaoriyaのソース、バイナリは後ほど更新します。MacVim MLにもパッチ送っておきます。


KeyScriptとか10.5でdeprecatedですけどね。


diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m
index 2e3738f..f2b40db 100644
--- a/src/MacVim/MMVimController.m
+++ b/src/MacVim/MMVimController.m
@@ -981,6 +981,10 @@ static BOOL isUnsafeMessage(int msgid);
showWithText:[dict objectForKey:@"text"]
flags:[[dict objectForKey:@"flags"] intValue]];
}
+ } else if (ActivateKeyScriptID == msgid) {
+ KeyScript(smKeySysScript);
+ } else if (DeactivateKeyScriptID == msgid) {
+ KeyScript(smKeyRoman);
// IMPORTANT: When adding a new message, make sure to update
// isUnsafeMessage() if necessary!
} else {
diff --git a/src/MacVim/MacVim.h b/src/MacVim/MacVim.h
index 2f52306..de68bf1 100644
--- a/src/MacVim/MacVim.h
+++ b/src/MacVim/MacVim.h
@@ -177,6 +177,8 @@ enum {
SetFullscreenColorMsgID,
ShowFindReplaceDialogMsgID,
FindReplaceMsgID,
+ ActivateKeyScriptID,
+ DeactivateKeyScriptID,
};


diff --git a/src/MacVim/MacVim.m b/src/MacVim/MacVim.m
index d94c825..17f4e01 100644
--- a/src/MacVim/MacVim.m
+++ b/src/MacVim/MacVim.m
@@ -84,6 +84,8 @@ char *MessageStrings[] =
"SetFullscreenColorMsgID",
"ShowFindReplaceDialogMsgID",
"FindReplaceMsgID",
+ "ActivateKeyScriptID",
+ "DeactivateKeyScriptID",
};


diff --git a/src/MacVim/gui_macvim.m b/src/MacVim/gui_macvim.m
index 2e53a92..e0f5d9d 100644
--- a/src/MacVim/gui_macvim.m
+++ b/src/MacVim/gui_macvim.m
@@ -1270,7 +1270,8 @@ im_set_active(int active)
SInt32 systemScript = GetScriptManagerVariable(smSysScript);

if (!p_imdisable && smRoman != systemScript)
- KeyScript(active ? smKeySysScript : smKeyRoman);
+ [[MMBackend sharedInstance] queueMessage:
+ (active ? ActivateKeyScriptID : DeactivateKeyScriptID) data:nil];
}