‘Cocoa’ カテゴリーのアーカイブ

MacUIM 0.6.3-1

4月 30, 2009

久々に MacUIM をアップデートしました。uim と Anthy を入れ替えてあります。あと Leopard の Dictionary Services を利用して、語義を表示できるようにしてみました (環境設定の「単語の意味を表示」にチェックを入れると)。超手抜きなので、適当にコードや IB をいじってみてください。

【5月1日追記 】語義を引いた後に CFRelease() するのを忘れていたので、直して 0.6.3-2 として置きました。

annotation

あと、Tiger 版の 0.5.3-1 もアプレットのバグっぽい点を直してあります。

Growl support in MacUIM

3月 17, 2009

MacUIM 0.6.2-1 で Growl サポートしてみました。Growl が動いている環境なら、scheme ファイルに (uim-notify-info “hoge”) とか書いたりすると、何か画面にメッセージが出るようになってます (どんなふうに使ったら便利か、いまいちいい考えが思いつかないんですけどね)。

uim-growl

MacUIM 0.6.1

3月 9, 2009

MacUIM ですが IMK 版でのしょうもないメモリリークに気づいたので、修正して 0.6.1 としました。これで一応、安定版となればいいな…

この後は、暇を見つけて機能追加をぼちぼちしていこうかと思っています。アイデアなどあったら教えてください。

MacUIM 0.6.0-16, 0.5.2-21

3月 6, 2009

今日のアップデート分です。

  • m17n library 1.5.4 に入れ替え (サイズが少し大きくなりました)
  • IMK 版 (0.6.0) において、Camino がアクティブな状態で uim の入力方式をアプレットから切り替えた時に MacUIM がクラッシュする場合があったのを修正
  • TSM 版 (0.5.2) において、GC enabled な Cocoa アプリケーション利用時に、候補ウィンドウが表示されない問題を修正
  • uim を最新版へ入れ替え

IMK notes

2月 7, 2009

MacUIM の Input Method Kit 対応について覚え書きです。何かの参考にでもなれば。

続きを読む

MacUIM

2月 6, 2009

ということで、MacUIM を新しくしてみたところ、いくつか問題があったので整理してみます。順次追記していますが、以下解決した (?) 問題

  • Anthy がクラッシュする (0.5.2-14, 0.6.0-4 で修正)
  • パッケージングの細かい設定 (0.5.2-15, 0.6.0-5 で修正)
  • TSM 版で、ppc アプリから anthy で入力できない (0.5.2-16, 0.6.0-6 で修正)
  • TSM 版と IMK 版が共存できない? (0.6.0-7 で IMK 版の identifier を一応変更)
  • IMK 版で、ppc Carbon アプリでは入力メニューから選択できない (0.6.0-8 で TSM 版と同様のメニュー階層を導入して修正)
  • IMK 版で、Private1, Private2 キーの二度めでスペースが入力される (0.6.0-9 で修正)
  • IMK 版で、候補ウィンドウが画面の端にある場合、表示されない部分がある (0.6.0-9 で修正)
  • IMK 版で、入力メニューを MacUIM (Roman) と MacUIM (Japanese) の間で切り替えた場合、自動的に uim のモードが切り替わらない (0.6.0-10 で修正)
  • IMK/TSM 両版とも、設定パネルから uim のカスタム設定を変更した場合に libuim がクラッシュする場合あり
    • 昔から存在していたバグでした (0.5.2-17, 0.6.0-10 で修正)
  • IMK 版でアプレットで設定したデフォルト入力方式に切り替わらない可能性がある (0.6.0-10 で修正)
  • social-ime などを利用すると http 接続に失敗して落ちていた (0.5.2-18, 0.6.0-11 で uim を r5836 へ変更)
  • 設定パネルの uim 項目が一部おかしかった (0.5.2-18, 0.6.0-11 で修正)
  • 設定パネルの読み込み時間を少し改善 (0.5.2-18, 0.6.0-11 で変更)
  • TSM 版 (0.5.2-18 ) で、設定パネルから uim のカスタム設定を変更した場合に SeaMonkey がクラッシュする場合あり (0.5.2-19 で修正)
  • TSM 版 (0.5.2.18 ) で、Tiger 上においては、設定パネルの uim のカスタマイズ項目を2回展開しないとサブメニューが表示されない (0.5.2-19 で修正)
  • TSM 版 (0.5.2-18 ) で、いくつかの uim のコンポーネントが Tiger では正しくリンクされないので動かない (0.5.2-19 で修正)
  • IMK 版 (0.6.0-11) で X11 向けの uim-xim の候補パネルが表示されない (0.6.0-12 で修正)
  • IMK 版で、アプレットからではなく設定パネルから入力方式を変更すると MacUIM がクラッシュする場合がある (0.6.0-13 で修正)

といったところです (たくさんありますね)。TSM 版もメンテするのは大変なので、後々は IMK-Tiger を試してみようかとも考えてます。

Input Method Kit

2月 2, 2009

週末に MacUIM の Input Method Kit 対応にいまさらですが手をつけてみました。input method (server) を Cocoa アプリケーションとして作るだけなので、実に簡単です。NumberInput_IMKit_Sample を参考につくってみたのですが、IMKInputController が uim の API とほぼ一対一で対応しているので、数時間で uim から入力できるようになりました。クライアントへの接続コードをまったく意識しなくてよいのがよいですね。

[追記] http://macuim.googlecode.com/ にパッケージを置きました。以前からの TSM 版は 0.5.2-11 という名前、IMK 版は 0.6.0-1 という名前を付けてあります。中にはいっているライブラリですが、uim trunk r5818、Anthy 9100g G-HAL、m17n-lib 1.5.3 が 0.5.2-9 からの変更点となっています。

[追記2]
なんか調子がおかしかったので、Anthy だけ古い版にもどして 0.6.0-2, 0.5.2-12 としておきました…

[追記3]
結局 OS X 上で anthy-9100g を -O2 ではなく -O0 でコンパイルすると落ちることがわかりました (なんだこれ??)。

[追記4]
調べてみると、anthy-9100g に含まれる compund.t という辞書ファイルの改行文字に一部へんなものが混じっているために、作成されるバイナリ辞書のインデックスの整合性がおかしくなっているのが原因でした。
ということで、修正した anthy 9100g に入れ直した MacUIM 0.6.0-4, 0.5.2-14 を Google Code に置いています (あーあ、疲れましたよ…)

[追記5]
http://ekato.wordpress.com/2009/02/06/macuim-2/ へさらに続く…

NSTextInput again

11月 5, 2007

Safari, Camino や iTerm の挙動をみても、やっぱり NSTextInput は無理があるような気がする。Input Method と一緒にはアプリケーションで自由なキーバインディングを使わせないためなんだろうか?

といっても、Input Method が無ければ制限なく独自のキーバインディングを implement できるわけだし、ただ単に考えが足らなかったようにも思えるなぁ… まあ、理由はどうでもいいので、うまい方法を見つけなければ。まとまった時間が欲しいものです。

【8日追記】結局 Control-q なんかの Input Manager が扱わないキーバインディングは、とりあえず Mac の OOo では使わないということに。さすがこのあたりの判断がすばらしいな。

MacUIM dual screen

10月 14, 2007

ということで、dual screen でも候補ウィンドウが正しい位置に表示できました。

diff -r fa605af03302 Sources/CocoaWinController.m
--- a/Sources/CocoaWinController.m	Mon Jan 29 19:54:53 2007 +0900
+++ b/Sources/CocoaWinController.m	Sun Oct 14 13:37:53 2007 +0900
@@ -290,15 +290,11 @@ static CocoaWinController *sharedControl
- (void)replaceWindow:(int)replyX:(int)replyY
{
NSTableColumn *col;
-  NSSize mainSize;
NSRect rect;
float candWidth = 0.0;
float headWidth = 0.0;
-  int x, y, i;
+  int i;
NSMutableAttributedString *text;
-
-  mainSize = [[NSScreen mainScreen] frame].size;
-  rect = [panel frame];

for (i = 0; i < [candArray count]; i++) {
text = [[NSAttributedString alloc]
@@ -347,25 +343,49 @@ static CocoaWinController *sharedControl

[panel setFrame:rect display:NO];

-  x = replyX;
-  y = mainSize.height - replyY - rect.size.height;
-
-  if (x < 0)
-    x = 0;
-  if (x + rect.size.width > mainSize.width)
-    x = mainSize.width - rect.size.width;
-  if (mainSize.height - replyY - origSize.height < 0)
-    y = mainSize.height - replyY + lineHeight + 3;
-  if (y + rect.size.height > mainSize.height)
-    y = mainSize.height - rect.size.height;
+  // Get the height of screen with menubar
+  NSArray *screenArray = [NSScreen screens];
+  int nScreen = [screenArray count];
+  NSPoint point = NSMakePoint((float)replyX, (float)replyY);
+  if (nScreen > 0)
+    point.y = [[screenArray objectAtIndex:0] frame].size.height - point.y;
+
+
+  // Search a screen of the candidate window
+  NSRect f = [[NSScreen mainScreen] frame];
+  BOOL found = NO;
+  for (i = 0; i < nScreen; i++) {
+    NSRect sf = [[screenArray objectAtIndex:i] frame];
+    if (NSPointInRect(point, sf)) {
+      f = sf;
+      found = YES;
+      break;
+    }
+  }
+
+  if (found) {
+    point.y -= rect.size.height;
+    if (point.y > f.origin.y + f.size.height - rect.size.height)
+      point.y = f.origin.y + f.size.height - rect.size.height;
+    if (point.x > f.origin.x + f.size.width - rect.size.width)
+      point.x = f.origin.x + f.size.width - rect.size.width;
+    if (point.y < f.origin.y)
+      point.y =  [[screenArray objectAtIndex:0] frame].size.height - replyY + lineHeight + 3;
+    if (point.x < f.origin.x)
+      point.x = f.origin.x;
+  } else {
+    // Set candidate window position at the center of the screen
+    point.x = f.origin.x + (f.size.width - rect.size.width) / 2;
+    point.y = f.origin.y + (f.size.height - rect.size.height) / 2;
+  }

#if DEBUG_CANDIDATE_WINDOW
NSLog(@"CocoaWinController replaceWindow: x=%d y=%d origin.x=%d origin.y=%d\n",
-        x, y, (int) rect.size.width, (int) rect.size.height);
+        point.x, point.y, (int) rect.size.width, (int) rect.size.height);
#endif

-  if (x != (int) rect.origin.x || y != (int) rect.origin.y)
-    [panel setFrameOrigin:NSMakePoint(x, y)];
+  if (point.x != (int) rect.origin.x || point.y != (int) rect.origin.y)
+    [panel setFrameOrigin:point];
}

- (void)setFont:(NSString *)name size:(float)size
diff -r fa605af03302 Sources/ModeTipsController.m
--- a/Sources/ModeTipsController.m	Mon Jan 29 19:54:53 2007 +0900
+++ b/Sources/ModeTipsController.m	Sun Oct 14 13:44:44 2007 +0900
@@ -95,7 +95,8 @@ static ModeTipsController *sharedControl

[realModeTipsPanel showLabels:labels];

-  mainSize = [[NSScreen mainScreen] frame].size;
+  NSArray *screenArray = [NSScreen screens];
+  mainSize = [[screenArray objectAtIndex:0] frame].size;
rect = [realModeTipsPanel frame];

x = qdX;

ようは mainScreen を使うのではなく、メニューバーがあるスクリーンの高さによって変換すればいいみたいです。

NSTextInput

8月 7, 2007

実験的にコードを書いたりしてみたんだけど、なんでこんな使いにくいインターフェイスになってるんだろ? interpretKeyEvents が返り値を持たないのはちょっと理解にくるしむ。