[aquaskk-changes 143] CVS update: AquaSKK

Back to archive index

Tomotaka SUWA t-suw****@users*****
2006年 2月 19日 (日) 13:50:55 JST


Index: AquaSKK/AquaSKKServer.h
diff -u AquaSKK/AquaSKKServer.h:1.1.2.1 AquaSKK/AquaSKKServer.h:1.1.2.2
--- AquaSKK/AquaSKKServer.h:1.1.2.1	Sat Feb 18 02:20:38 2006
+++ AquaSKK/AquaSKKServer.h	Sun Feb 19 13:50:54 2006
@@ -1,5 +1,5 @@
 /*
-  $Id: AquaSKKServer.h,v 1.1.2.1 2006/02/17 17:20:38 t-suwa Exp $
+  $Id: AquaSKKServer.h,v 1.1.2.2 2006/02/19 04:50:54 t-suwa Exp $
 
   MacOS X implementation of the SKK input method.
 
@@ -26,6 +26,7 @@
 @interface AquaSKKServer: NSObject
 {
 }
++ (void)initialize;
 - (void)applicationDidFinishLaunching:(NSNotification*)aNotification;
 - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication*)sender;
 @end
Index: AquaSKK/AquaSKKServer.mm
diff -u AquaSKK/AquaSKKServer.mm:1.1.2.1 AquaSKK/AquaSKKServer.mm:1.1.2.2
--- AquaSKK/AquaSKKServer.mm:1.1.2.1	Sat Feb 18 02:20:38 2006
+++ AquaSKK/AquaSKKServer.mm	Sun Feb 19 13:50:54 2006
@@ -1,5 +1,5 @@
 /* -*- objc -*-
-  $Id: AquaSKKServer.mm,v 1.1.2.1 2006/02/17 17:20:38 t-suwa Exp $
+  $Id: AquaSKKServer.mm,v 1.1.2.2 2006/02/19 04:50:54 t-suwa Exp $
 
   MacOS X implementation of the SKK input method.
 
@@ -22,18 +22,37 @@
 */
 
 #include <AppKit/AppKit.h>
+#include "BIMClientServer.h"
 #include "AquaSKKServer.h"
-#include "PreferencesController.h"
+#include "PreferenceKeys.h"
 #include "DictionarySet.h"
-#include "BIMClientServer.h"
 #include "ServerMessageReceiver.h"
 #include "skkserv.h"
 
 @implementation AquaSKKServer
 
+// ‰Šú‰»
++ (void)initialize {
+    NSString* defaultsPlist;
+    NSDictionary* userDefaults;
+
+    // UserDefaults.plist ‚Ì“à—e‚ðƒ[ƒh‚·‚é
+    defaultsPlist = [[NSBundle mainBundle] pathForResource:@"UserDefaults" ofType:@"plist"];
+    userDefaults =[NSDictionary dictionaryWithContentsOfFile:defaultsPlist];
+
+    // ‰ŠúÝ’è‚Æ‚µ‚Ä“o˜^
+    [[NSUserDefaults standardUserDefaults] registerDefaults:userDefaults];
+
+    // ƒ†[ƒU[ƒfƒtƒHƒ‹ƒgƒRƒ“ƒgƒ[ƒ‰[‚É‚à“o˜^
+    [[NSUserDefaultsController sharedUserDefaultsController] setInitialValues:userDefaults];
+
+    // ~/Library/AquaSKK/ ‚ðì¬‚·‚é
+    [[NSFileManager defaultManager]
+	createDirectoryAtPath:[@"~/Library/AquaSKK" stringByExpandingTildeInPath] attributes:nil];
+}
+
 - (void)applicationDidFinishLaunching:(NSNotification*)aNotification {
-    // ƒvƒŠƒtƒ@ƒŒƒ“ƒX‚ðŽæ“¾
-    PreferencesController* pref = [PreferencesController sharedController];
+    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
 
     // Ž«‘ƒT[ƒo[‚ð‹N“®‚·‚é
     DictionarySet::theInstance().initialize();
@@ -42,8 +61,9 @@
     ServerMessageReceiver::start(kAquaSKKServerRunLoopMode);
 
     // skkserv ƒGƒ~ƒ…ƒŒ[ƒVƒ‡ƒ“‚Ì‹N“®
-    if([pref isSkkservEnabled]) {
-	skkserv::theInstance().start([pref skkservPort], [pref isSkkservLocalOnly]);
+    if([defaults boolForKey:KEY_skkserv_enabled]) {
+	skkserv::theInstance().start([defaults integerForKey:KEY_skkserv_port],
+				     [defaults boolForKey:KEY_skkserv_localonly]);
     }
 }
 
Index: AquaSKK/BIM.cpp
diff -u AquaSKK/BIM.cpp:1.11.2.2 AquaSKK/BIM.cpp:1.11.2.3
--- AquaSKK/BIM.cpp:1.11.2.2	Sun Jan  8 16:15:30 2006
+++ AquaSKK/BIM.cpp	Sun Feb 19 13:50:54 2006
@@ -1,5 +1,5 @@
 /*
-  $Id: BIM.cpp,v 1.11.2.2 2006/01/08 07:15:30 t-suwa Exp $
+  $Id: BIM.cpp,v 1.11.2.3 2006/02/19 04:50:54 t-suwa Exp $
 
   MacOS X implementation of the SKK input method.
 
@@ -164,9 +164,6 @@
     refNum = -1;
     
     gPencilMenu = NULL;
-
-    //  ŽI‚ª‹N“®‚µ‚Ä‚¢‚È‚©‚Á‚½‚ç‹N“®‚·‚éB
-    ServerConnectionFactory::theInstance().prepareServer();
     
     CFBundleRef	bundleRef;
     IBNibRef	nibRef;
@@ -195,6 +192,9 @@
     //  ƒƒbƒZ[ƒWŽóM‹@\‚ð‰Šú‰»
     ClientMessageReceiver::start(kAquaSKKClientRunLoopMode);
 
+    //  AquaSKKServer ‚Ì‹N“®
+    ServerConnectionFactory::theInstance().prepareServer();
+
 Finish:
 
     return result;
Index: AquaSKK/BIM.r
diff -u AquaSKK/BIM.r:1.3.4.2 AquaSKK/BIM.r:1.3.4.3
--- AquaSKK/BIM.r:1.3.4.2	Mon Jan  9 11:11:05 2006
+++ AquaSKK/BIM.r	Sun Feb 19 13:50:54 2006
@@ -1,5 +1,5 @@
 /*
-  $Id: BIM.r,v 1.3.4.2 2006/01/09 02:11:05 t-suwa Exp $
+  $Id: BIM.r,v 1.3.4.3 2006/02/19 04:50:54 t-suwa Exp $
 
   MacOS X implementation of the SKK input method.
 
@@ -60,11 +60,11 @@
 #define	kAquaSKKBaseResouceID	16384
 #define kAquaSKKComponentFlags	0x8000 + smJapanese * 0x100 + langJapanese
 
-// "org.ccm-software.AquaSKKInputMethod" ‚Ì pascal •¶Žš—ñ
+// "jp.sourceforge.AquaSKKInputMethod" ‚Ì pascal •¶Žš—ñ
 data 'cbnm' (0) {
-    $"236f 7267 2e63 636d 2d73 6f66 7477 6172"
-    $"652e 4171 7561 534b 4b49 6e70 7574 4d65"
-    $"7468 6f64"
+    $"216a 702e 736f 7572 6365 666f 7267 652e"
+    $"4171 7561 534b 4b49 6e70 7574 4d65 7468"
+    $"6f64"
 };
 
 resource 'thng' (kAquaSKKBaseResouceID) {
Index: AquaSKK/BIMClientServer.h
diff -u AquaSKK/BIMClientServer.h:1.3.2.1 AquaSKK/BIMClientServer.h:1.3.2.2
--- AquaSKK/BIMClientServer.h:1.3.2.1	Sat Jan  7 16:22:28 2006
+++ AquaSKK/BIMClientServer.h	Sun Feb 19 13:50:54 2006
@@ -1,10 +1,10 @@
 /*
-  $Id: BIMClientServer.h,v 1.3.2.1 2006/01/07 07:22:28 t-suwa Exp $
+  $Id: BIMClientServer.h,v 1.3.2.2 2006/02/19 04:50:54 t-suwa Exp $
 
   MacOS X implementation of the SKK input method.
 
   Copyright (C) 2002 phonohawk
-  Copyright (C) 2005 Tomotaka SUWA <t.suw****@mac*****>
+  Copyright (C) 2005-2006 Tomotaka SUWA <t.suw****@mac*****>
 
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -24,14 +24,14 @@
 #pragma once
 
 // IM‚̃oƒ“ƒhƒ‹–¼
-#define kIMBundleIdentifier "org.ccm-software.AquaSKKInputMethod"
+#define kIMBundleIdentifier "jp.sourceforge.AquaSKKInputMethod"
 
 // ŽI‚̃AƒvƒŠ–¼
 #define kBasicServerName "\pAquaSKKServer.app"
 #define kCSTR_SKKServerName "AquaSKKServer.app"
 
 // ŽI‚̃|[ƒg–¼
-#define kBasicServerPortName "org.ccm-software.AquaSKKServer"
+#define kBasicServerPortName "jp.sourceforge.AquaSKKServer"
 
 // ƒT[ƒo[‚Ì RunLoopMode
 #define	kAquaSKKServerRunLoopMode	CFSTR("AquaSKK::ServerRunLoopMode")
@@ -102,11 +102,14 @@
 	
     kSKKFetchCompletions = 400, // •âŠ®‚ÌŒó•â‚ðŒŸõBƒNƒGƒŠ‚ÌŒ`Ž®‚ÍUniChar‚Ì”z—ñ‚ŁA
     // —Ⴆ‚΁u‚فvBƒŒƒXƒ|ƒ“ƒX‚́u‚Ù‚© ‚Ù‚©‚ñv‚̂悤‚É”¼ŠpƒXƒy[ƒX‚Å‹æØ‚ç‚ꂽŒ©o‚µŒê‚̃ŠƒXƒgB
-};
 
-enum {
     kBasicMessageIsSkkEggLikeNewline = 500,	// 
     kBasicMessageIsNumericKeypad_HalfWidth = 501,
     kBasicMessageIsAsciiModeStartup = 502,
     kBasicMessageKbdLayoutId = 503,
 };
+
+// ƒT[ƒo[‚©‚çƒNƒ‰ƒCƒAƒ“ƒg‚Ö‚Ì’Ê’mƒƒbƒZ[ƒW
+enum {
+    kSKKClientConfigurationModified = 100,
+};
Index: AquaSKK/CandidatesFrame.h
diff -u AquaSKK/CandidatesFrame.h:1.2.2.1 AquaSKK/CandidatesFrame.h:1.2.2.2
--- AquaSKK/CandidatesFrame.h:1.2.2.1	Sat Jan 14 20:01:58 2006
+++ AquaSKK/CandidatesFrame.h	Sun Feb 19 13:50:54 2006
@@ -1,5 +1,5 @@
-/*
-  $Id: CandidatesFrame.h,v 1.2.2.1 2006/01/14 11:01:58 t-suwa Exp $
+/* -*- objc -*-
+  $Id: CandidatesFrame.h,v 1.2.2.2 2006/02/19 04:50:54 t-suwa Exp $
 
   MacOS X implementation of the SKK input method.
 
@@ -23,29 +23,51 @@
 
 #pragma once
 
-//
-//	•ÏŠ·Œó•âƒtƒŒ[ƒ€ƒCƒ“ƒ^ƒtƒF[ƒX
-//
- @ interface CandidatesFrame : NSObject {
-    NSImage* view_;		// ƒtƒŒ[ƒ€
-    NSString* caption_;		// [Žc‚è nnn]
-    NSMutableArray* candidates_; // Œó•â
-    NSDictionary* attributes_;	 // ƒtƒHƒ“ƒg‘®«
+// ƒtƒŒ[ƒ€‘®«
+ @ interface FrameAttribute : NSObject {
     NSString* labels_;		 // ƒAƒNƒZƒX•¶Žš
+    NSString* entry_;		 // ’Pˆê‚ÌŒó•â
+    NSString* caption_;		 // [Žc‚è nnn]
+    NSDictionary* attributes_;	 // ƒtƒHƒ“ƒg‘®«
 
     NSSize viewSize_;		// ƒrƒ…[‹éŒ`
     NSSize marginSize_;		// ƒ}[ƒWƒ“
-    NSSize itemAreaSize_;	// •ÏŠ·Œó•â‚̃GƒŠƒA
     NSSize itemSize_;		// ’Pˆê•ÏŠ·Œó•âƒTƒCƒY
+    NSSize itemAreaSize_;	// •ÏŠ·Œó•â‚̃GƒŠƒA
     float spaceWidth_;		// Œ„ŠÔ
+}
+
++ (id)sharedFrameAttribute;
+
+- (void)refresh;
+
+- (NSString*)labels;
+- (NSString*)caption;
+- (NSDictionary*)fontAttributes;
+- (NSSize)viewSize;
+- (NSSize)marginSize;
+- (NSSize)itemSize;
+- (NSSize)itemAreaSize;
+- (float)spaceWidth;
+- (NSRect)drawArea;
+- (NSRect)viewRect;
+
+ @ end
+
+// •ÏŠ·Œó•âƒtƒŒ[ƒ€ƒCƒ“ƒ^ƒtƒF[ƒX
+ @ interface CandidatesFrame : NSObject {
+    NSImage* view_;		// ƒtƒŒ[ƒ€
+    NSMutableArray* candidates_; // Œó•â
+
     float restWidth_;		// Žc‚蕝
 
     unsigned remainCandidates_;	// Žc‚èŒó•â”
     bool useLineBreak_;		// È—ª‚·‚é‚©H
 }
+
 - (bool)addCandidate:(NSString*)str;
 - (void)setRemain:(int)remains;
 - (unsigned)count;
 - (void)drawRect:(NSRect)rect;
-- (NSSize)size;
+
 @end
Index: AquaSKK/CandidatesFrame.m
diff -u AquaSKK/CandidatesFrame.m:1.4.2.1 AquaSKK/CandidatesFrame.m:1.4.2.2
--- AquaSKK/CandidatesFrame.m:1.4.2.1	Sat Jan 14 20:01:58 2006
+++ AquaSKK/CandidatesFrame.m	Sun Feb 19 13:50:54 2006
@@ -1,5 +1,5 @@
 /*
-  $Id: CandidatesFrame.m,v 1.4.2.1 2006/01/14 11:01:58 t-suwa Exp $
+  $Id: CandidatesFrame.m,v 1.4.2.2 2006/02/19 04:50:54 t-suwa Exp $
 
   MacOS X implementation of the SKK input method.
 
@@ -21,70 +21,144 @@
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
 
-#import <AppKit/AppKit.h>
-#import "CandidatesFrame.h"
+#include <AppKit/AppKit.h>
+#include "CandidatesFrame.h"
+#include "PreferenceKeys.h"
+
+ @ implementation FrameAttribute
 
- @ implementation CandidatesFrame
 - (id)init {
     if((self = [super init])) {
-	NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
-	NSFont *font = [NSFont fontWithName:[defaults objectForKey:@"dic.FontName.Window"]
-					size:[[defaults objectForKey:@"dic.FontSize.Window"] floatValue]];
+	// ƒ‰ƒxƒ‹
 	labels_ = @"ASDFJKL";
-	attributes_ = [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName];
-	candidates_ = [[NSMutableArray alloc] init];
 
-	// €–ڂ̃TƒCƒY‚ðŽæ“¾
+	// ’Pˆê‚̃Gƒ“ƒgƒŠ
 	char* data = " A  Š¿Žš";
 	NSData* sjis = [[NSData alloc] initWithBytes:data length:strlen(data)];
-	NSString* str = [[NSString alloc] initWithData:sjis encoding:NSShiftJISStringEncoding];
+	entry_ = [[NSString alloc] initWithData:sjis encoding:NSShiftJISStringEncoding];
 	[sjis release];
-	NSMutableAttributedString* tmp = [[NSMutableAttributedString alloc] initWithString:str attributes:attributes_];
-	itemSize_ = [tmp size];
-	[tmp release];
 
-	// [Žc‚è n] ‚̃TƒCƒY‚ðŽæ“¾
+	// [Žc‚è n]
 	data = "Žc‚è";
 	sjis = [[NSData alloc] initWithBytes:data length:strlen(data)];
 	caption_ = [[NSString alloc] initWithData:sjis encoding:NSShiftJISStringEncoding];
 	[sjis release];
 
-	tmp = [[NSMutableAttributedString alloc]
-		  initWithString:[NSString stringWithFormat:@"[%@ 000]", caption_] attributes:attributes_];
-	NSSize remainSize = [tmp size];
-	[tmp release];
-
 	// —]”’‚ðŒˆ‚ß‚é
 	marginSize_ = NSMakeSize(8, 8);
 	spaceWidth_ = marginSize_.width * 2;
 
-	// •ÏŠ·Œó•â‚ð•`‰æ‚·‚éƒGƒŠƒA‚̃TƒCƒY
-	itemAreaSize_ = NSMakeSize([labels_ length] * (itemSize_.width + spaceWidth_), itemSize_.height);
+	[self refresh];
+    }
+
+    return self;
+}
+
++ (id)sharedFrameAttribute {
+    static FrameAttribute* obj = NULL;
+
+    if(!obj) {
+	obj = [[FrameAttribute alloc] init];
+    }
+
+    return obj;
+}
+
+- (void)refresh {
+    // ƒ†[ƒU[ƒfƒtƒHƒ‹ƒg‚ðŽæ“¾‚µ’¼‚·
+    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
+    NSFont* font = [NSFont fontWithName:[defaults stringForKey:KEY_candidates_font_name]
+			   size:[defaults floatForKey:KEY_candidates_font_size]];
+    attributes_ = [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName];
+
+    // €–ڂ̃TƒCƒY‚ðŽæ“¾
+    NSMutableAttributedString* tmp = [[NSMutableAttributedString alloc] initWithString:entry_ attributes:attributes_];
+    itemSize_ = [tmp size];
+    [tmp release];
+
+    // [Žc‚è n] ‚̃TƒCƒY‚ðŽæ“¾
+    NSString* formatedStr = [NSString stringWithFormat:@"[%@ 000]", caption_];
+    tmp = [[NSMutableAttributedString alloc] initWithString:formatedStr attributes:attributes_];
+    NSSize remainSize = [tmp size];
+    [tmp release];
+
+    // •ÏŠ·Œó•â‚ð•`‰æ‚·‚éƒGƒŠƒA‚̃TƒCƒY
+    itemAreaSize_ = NSMakeSize([labels_ length] * (itemSize_.width + spaceWidth_), itemSize_.height);
+
+    // ƒrƒ…[‘S‘̂̃TƒCƒY
+    viewSize_ = NSMakeSize(marginSize_.width * 2 + itemAreaSize_.width + remainSize.width,
+			   marginSize_.height * 2 + itemAreaSize_.height);
+}
+
+- (NSString*)labels {
+    return labels_;
+}
+
+- (NSString*)caption {
+    return caption_;
+}
+
+- (NSDictionary*)fontAttributes {
+    return attributes_;
+}
 
-	// ƒrƒ…[‘S‘̂̃TƒCƒY
-	viewSize_ = NSMakeSize(marginSize_.width * 2 + itemAreaSize_.width + remainSize.width,
-			       marginSize_.height * 2 + itemAreaSize_.height);
+- (NSSize)viewSize {
+    return viewSize_;
+}
 
+- (NSSize)marginSize {
+    return marginSize_;
+}
+
+- (NSSize)itemSize {
+    return itemSize_;
+}
+
+- (NSSize)itemAreaSize {
+    return itemAreaSize_;
+}
+
+- (float)spaceWidth {
+    return spaceWidth_;
+}
+
+- (NSRect)drawArea {
+    return NSMakeRect(marginSize_.width, marginSize_.height, itemAreaSize_.width - spaceWidth_, itemAreaSize_.height);
+}
+
+- (NSRect)viewRect {
+    return NSMakeRect(0, 0, viewSize_.width, viewSize_.height);
+}
+
+ @ end
+
+ @ implementation CandidatesFrame
+- (id)init {
+    if((self = [super init])) {
+	FrameAttribute* attr = [FrameAttribute sharedFrameAttribute];
+	candidates_ = [[NSMutableArray alloc] init];
 	useLineBreak_ = false;
-	remainCandidates_ = 0;
-	restWidth_ = itemAreaSize_.width - marginSize_.width;
+	restWidth_ = [attr itemAreaSize].width - [attr marginSize].width;
     }
 
     return self;
 }
 
 - (bool)addCandidate:(NSString*)str {
+    FrameAttribute* attr = [FrameAttribute sharedFrameAttribute];
+
     // ‚±‚êˆÈã‚Í–³—H
-    if(restWidth_ < 1 || [self count] == [labels_ length]) {
+    if(restWidth_ < 1 || [self count] == [[attr labels] length]) {
 	return false;
     }
 
     // •ÏŠ·Œó•â‚Ì•¶Žš—ñ‚𐶐¬‚·‚é
-    NSString* tmpstr
-	= [NSString stringWithFormat:@" %@  %@", [labels_ substringWithRange:NSMakeRange([self count], 1)], str];
+    NSString* tmpstr = [NSString stringWithFormat:@" %@  %@",
+				 [[attr labels] substringWithRange:NSMakeRange([self count], 1)], str];
 
     // ‘®«•t‚«•¶Žš—ñ‚ðì‚é
-    NSMutableAttributedString* entry = [[NSMutableAttributedString alloc] initWithString:tmpstr attributes:attributes_];
+    NSMutableAttributedString* entry = [[NSMutableAttributedString alloc] initWithString:tmpstr
+									  attributes:[attr fontAttributes]];
 
     // ƒ‰ƒxƒ‹‚Ì•¶ŽšF‚Æ”wŒiF‚ðÝ’è
     [entry addAttribute:NSBackgroundColorAttributeName
@@ -92,22 +166,10 @@
     [entry addAttribute:NSForegroundColorAttributeName
 	   value:[NSColor selectedMenuItemTextColor] range:NSMakeRange(0, 3)];
 
-    // ƒ‰ƒxƒ‹‚̃hƒƒbƒvƒVƒƒƒhƒE‚ðÝ’è
-#if 0
-    NSShadow* shadow = [[NSShadow alloc] init];
-    //[shadow setShadowColor:[[NSColor shadowColor] shadowWithLevel:1.0]];
-    [shadow setShadowColor:[[NSColor shadowColor] colorWithAlphaComponent:1.0]];
-    [shadow setShadowBlurRadius:2];
-    [shadow setShadowOffset:NSMakeSize(0, -1)];
-    [entry addAttribute:NSShadowAttributeName
-	   value:shadow range:NSMakeRange(0, 3)];
-    [shadow release];
-#endif
-
     // •`‰æƒTƒCƒY‚ðŽæ“¾
     NSSize box = [entry size];
-    if(box.width < itemSize_.width) {
-	box.width = itemSize_.width;
+    if(box.width < [attr itemSize].width) {
+	box.width = [attr itemSize].width;
     }
 
     // •`‰æ‚µ‚«‚ê‚È‚¢H
@@ -131,7 +193,7 @@
 	// ”z—ñ‚É•¶Žš—ñ‚ð’ljÁ‚·‚é
 	[candidates_ addObject:entry];
 	[entry release];
-	restWidth_ -= (box.width + spaceWidth_);
+	restWidth_ -= (box.width + [attr spaceWidth]);
 	return true;
     }
     [entry release];
@@ -148,54 +210,48 @@
 }
 
 - (void)drawRect:(NSRect)rect {
+    FrameAttribute* attr = [FrameAttribute sharedFrameAttribute];
+
     // ‰Šú‰»‚³‚ê‚Ä‚¢‚È‚¢H
     if(!view_) {
-	view_ = [[NSImage alloc] initWithSize:viewSize_];
+	view_ = [[NSImage alloc] initWithSize:[attr viewSize]];
 	[view_ lockFocus];
 
 	// È—ª•\Ž¦‚©H
 	if(useLineBreak_) {
 	    NSAttributedString* tmp = [candidates_ objectAtIndex:0];
-	    [tmp drawInRect:NSMakeRect(marginSize_.width, marginSize_.height,
-				       itemAreaSize_.width - spaceWidth_, itemAreaSize_.height)];
+	    [tmp drawInRect:[attr drawArea]];
 	} else {
-	    NSPoint pt = NSMakePoint(marginSize_.width, marginSize_.height);
+	    NSPoint pt = NSMakePoint([attr marginSize].width, [attr marginSize].height);
 	    unsigned i;
 	    for(i = 0; i < [self count]; ++ i) {
 		NSAttributedString* tmp = [candidates_ objectAtIndex:i];
 		[tmp drawAtPoint:pt];
-		if([tmp size].width < itemSize_.width) {
-		    pt.x += (itemSize_.width + spaceWidth_);
+		if([tmp size].width < [attr itemSize].width) {
+		    pt.x += ([attr itemSize].width + [attr spaceWidth]);
 		} else {
-		    pt.x += ([tmp size].width + spaceWidth_);
+		    pt.x += ([tmp size].width + [attr spaceWidth]);
 		}
 	    }
 	}
 
 	// [Žc‚è n] ‚ð•`‰æ
-	NSAttributedString* remain
-	    = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"[%@ %d]",
-								   caption_, remainCandidates_]
-					  attributes:attributes_];
-	[remain drawAtPoint:NSMakePoint(marginSize_.width + itemAreaSize_.width, marginSize_.height)];
+	NSAttributedString* remain = [[NSAttributedString alloc]
+					 initWithString:[NSString stringWithFormat:@"[%@ %d]",
+								  [attr caption], remainCandidates_]
+					 attributes:[attr fontAttributes]];
+	[remain drawAtPoint:NSMakePoint([attr marginSize].width + [attr itemAreaSize].width, [attr marginSize].height)];
 	[remain release];
 
 	[view_ unlockFocus];
     }
 
     // ƒrƒ…[‚Ì•`‰æ
-    [view_ drawInRect:NSMakeRect(0, 0, viewSize_.width, viewSize_.height)
-	   fromRect:NSMakeRect(0, 0, viewSize_.width, viewSize_.height)
-	   operation:NSCompositeSourceOver fraction:1.0];
-}
-
-- (NSSize)size {
-    return viewSize_;
+    [view_ drawInRect:[attr viewRect] fromRect:[attr viewRect] operation:NSCompositeSourceOver fraction:1.0];
 }
 
 - (void)dealloc {
     [view_ release];
-    [caption_ release];
     [candidates_ release];
     [super dealloc];
 }
Index: AquaSKK/CandidatesView.h
diff -u AquaSKK/CandidatesView.h:1.2 AquaSKK/CandidatesView.h:1.2.2.1
--- AquaSKK/CandidatesView.h:1.2	Sat Oct  8 00:08:36 2005
+++ AquaSKK/CandidatesView.h	Sun Feb 19 13:50:54 2006
@@ -1,31 +1,32 @@
-/*
-	$Id: CandidatesView.h,v 1.2 2005/10/07 15:08:36 t-suwa Exp $
-	---------
-	
-    MacOS X implementation of the SKK input method.
-    Copyright (C) 2002 phonohawk
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+/* -*- objc -*-
+  $Id: CandidatesView.h,v 1.2.2.1 2006/02/19 04:50:54 t-suwa Exp $
+
+  MacOS X implementation of the SKK input method.
+
+  Copyright (C) 2002 phonohawk
+  Copyright (C) 2006 Tomotaka SUWA <t.suw****@mac*****>
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
 
 #pragma once
 
 @interface CandidatesView : NSView
 {
-	NSMutableArray* frames;
-	unsigned current_frame;
+    NSMutableArray* frames;
+    unsigned current_frame;
 }
 
 - (id)initWithCandidates:(NSArray*)cands;
@@ -34,4 +35,5 @@
 - (unsigned)getCandidatesPerFrame;
 - (unsigned)getNumOfFrames;
 - (void)setCurrentFrame:(unsigned)frame;
+
 @end
Index: AquaSKK/CandidatesView.mm
diff -u AquaSKK/CandidatesView.mm:1.2 AquaSKK/CandidatesView.mm:1.2.2.1
--- AquaSKK/CandidatesView.mm:1.2	Sat Oct  8 00:08:36 2005
+++ AquaSKK/CandidatesView.mm	Sun Feb 19 13:50:54 2006
@@ -1,23 +1,24 @@
-/* -*- objc -*-
-	$Id: CandidatesView.mm,v 1.2 2005/10/07 15:08:36 t-suwa Exp $
-	---------
-	
-    MacOS X implementation of the SKK input method.
-    Copyright (C) 2002 phonohawk
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+/*  -*- objc -*-
+  $Id: CandidatesView.mm,v 1.2.2.1 2006/02/19 04:50:54 t-suwa Exp $
+
+  MacOS X implementation of the SKK input method.
+
+  Copyright (C) 2002 phonohawk
+  Copyright (C) 2006 Tomotaka SUWA <t.suw****@mac*****>
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
 
 #import <AppKit/AppKit.h>
@@ -28,78 +29,81 @@
 
 - (id)initWithCandidates:(NSArray*)cands
 {
-	// ‰¼‚̃TƒCƒY‚ŏ‰Šú‰»
-	self = [super initWithFrame:NSMakeRect(0,0,100,100)];
+    // ƒtƒŒ[ƒ€‘®«‚ðƒŠƒtƒŒƒbƒVƒ…‚·‚é
+    [[FrameAttribute sharedFrameAttribute] refresh];
 
-	frames = [[NSMutableArray alloc] init];
-	CandidatesFrame* tmpFrame = [[CandidatesFrame alloc] init];
-	unsigned i;
-
-	// ‘S‚Ä‚Ì•ÏŠ·Œó•â‚©‚çA•K—v‚ȃtƒŒ[ƒ€ƒIƒuƒWƒFƒNƒg‚𐶐¬‚·‚é
-	for(i = 0; i < [cands count]; ++ i) {
-		// ‚±‚̃tƒŒ[ƒ€‚É‚±‚êˆÈã‚͒ljÁ‚Å‚«‚È‚¢H
-		if(![tmpFrame addCandidate:[cands objectAtIndex:i]]) {
-			// uŽc‚èv‚̐”‚ðƒZƒbƒg‚µ‚āA”z—ñ‚ɒljÁ
-			[tmpFrame setRemain:[cands count] - i];
-			[frames addObject:tmpFrame];
-			[tmpFrame release];
-
-			// ˆì‚ꂽ•ÏŠ·Œó•â‚ðV‹K‚̃tƒŒ[ƒ€‚ɒljÁ
-			tmpFrame = [[CandidatesFrame alloc] init];
-			[tmpFrame addCandidate:[cands objectAtIndex:i]];
-		}
-	}
+    // ‰¼‚̃TƒCƒY‚ŏ‰Šú‰»
+    self = [super initWithFrame:NSMakeRect(0,0,100,100)];
+
+    frames = [[NSMutableArray alloc] init];
 
-	// —LŒø‚ȃtƒŒ[ƒ€‚ª‚ ‚ê‚΁A”z—ñ‚ɒljÁ
-	if([tmpFrame count] > 0) {
-		[frames addObject:tmpFrame];
+    CandidatesFrame* tmpFrame = [[CandidatesFrame alloc] init];
+    unsigned i;
+
+    // ‘S‚Ä‚Ì•ÏŠ·Œó•â‚©‚çA•K—v‚ȃtƒŒ[ƒ€ƒIƒuƒWƒFƒNƒg‚𐶐¬‚·‚é
+    for(i = 0; i < [cands count]; ++ i) {
+	// ‚±‚̃tƒŒ[ƒ€‚É‚±‚êˆÈã‚͒ljÁ‚Å‚«‚È‚¢H
+	if(![tmpFrame addCandidate:[cands objectAtIndex:i]]) {
+	    // uŽc‚èv‚̐”‚ðƒZƒbƒg‚µ‚āA”z—ñ‚ɒljÁ
+	    [tmpFrame setRemain:[cands count] - i];
+	    [frames addObject:tmpFrame];
+	    [tmpFrame release];
+
+	    // ˆì‚ꂽ•ÏŠ·Œó•â‚ðV‹K‚̃tƒŒ[ƒ€‚ɒljÁ
+	    tmpFrame = [[CandidatesFrame alloc] init];
+	    [tmpFrame addCandidate:[cands objectAtIndex:i]];
 	}
-	NSSize frame_size = [tmpFrame size];
-	[tmpFrame release];
+    }
 
-	// ÅI“I‚ȃTƒCƒY‚ðŒˆ’è‚·‚é
-	[self setFrame:NSMakeRect(0, 0, frame_size.width, frame_size.height)];
-	current_frame = 0;
+    // —LŒø‚ȃtƒŒ[ƒ€‚ª‚ ‚ê‚΁A”z—ñ‚ɒljÁ
+    if([tmpFrame count] > 0) {
+	[frames addObject:tmpFrame];
+    }
+    [tmpFrame release];
+
+    // ÅI“I‚ȃTƒCƒY‚ðŒˆ’è‚·‚é
+    [self setFrame:[[FrameAttribute sharedFrameAttribute] viewRect]];
+    current_frame = 0;
 
-	return self;
+    return self;
 }
 
-- (void)drawRect:(NSRect)rect
+- (void)dealloc
 {
-	[[frames objectAtIndex:current_frame] drawRect:rect];
+    [frames release];
+    [super dealloc];
 }
 
-- (void)dealloc
+- (void)drawRect:(NSRect)rect
 {
-	[frames release];
-	[super dealloc];
+    [[frames objectAtIndex:current_frame] drawRect:rect];
 }
 
 - (void)showNextFrame
 {
-	current_frame++;
-	[self display];
+    ++ current_frame;
+    [self display];
 }
 
 - (void)showPrevFrame
 {
-	current_frame--;
-	[self display];
+    -- current_frame;
+    [self display];
 }
 
 - (unsigned)getCandidatesPerFrame
 {
-	return [[frames objectAtIndex:current_frame] count];
+    return [[frames objectAtIndex:current_frame] count];
 }
 
 - (unsigned)getNumOfFrames
 {
-	return [frames count];
+    return [frames count];
 }
 
 - (void)setCurrentFrame:(unsigned)frame
 {
-	current_frame = frame;
+    current_frame = frame;
 }
 
 @end
Index: AquaSKK/CandidatesWindowController.h
diff -u AquaSKK/CandidatesWindowController.h:1.2 AquaSKK/CandidatesWindowController.h:1.2.2.1
--- AquaSKK/CandidatesWindowController.h:1.2	Sat Oct  8 00:08:36 2005
+++ AquaSKK/CandidatesWindowController.h	Sun Feb 19 13:50:54 2006
@@ -1,32 +1,34 @@
-/*
-	$Id: CandidatesWindowController.h,v 1.2 2005/10/07 15:08:36 t-suwa Exp $
-	---------
-	
-    MacOS X implementation of the SKK input method.
-    Copyright (C) 2002 phonohawk
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+/* -*- objc -*-
+  $Id: CandidatesWindowController.h,v 1.2.2.1 2006/02/19 04:50:54 t-suwa Exp $
+
+  MacOS X implementation of the SKK input method.
+
+  Copyright (C) 2002 phonohawk
+  Copyright (C) 2006 Tomotaka SUWA <t.suw****@mac*****>
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
 
 #pragma once
 
 @interface CandidatesWindowController : NSWindowController
 {
-	NSArray *candidates;
-	CandidatesView *candidates_view;
+    NSArray *candidates;
+    CandidatesView *candidates_view;
 }
+
 - initWithCandidates:(NSArray*)cands; // <NSString>Œó•â
 - (NSArray*)getCandidates;
 
@@ -35,4 +37,5 @@
 - (unsigned)getCandidatesPerFrame;
 - (unsigned)getNumOfFrames;
 - (void)setCurrentFrame:(unsigned)frame;
+
 @end
Index: AquaSKK/CandidatesWindowController.mm
diff -u AquaSKK/CandidatesWindowController.mm:1.2.2.1 AquaSKK/CandidatesWindowController.mm:1.2.2.2
--- AquaSKK/CandidatesWindowController.mm:1.2.2.1	Sun Jan  8 16:15:30 2006
+++ AquaSKK/CandidatesWindowController.mm	Sun Feb 19 13:50:54 2006
@@ -1,5 +1,5 @@
 /* -*- objc -*-
-  $Id: CandidatesWindowController.mm,v 1.2.2.1 2006/01/08 07:15:30 t-suwa Exp $
+  $Id: CandidatesWindowController.mm,v 1.2.2.2 2006/02/19 04:50:54 t-suwa Exp $
 
   MacOS X implementation of the SKK input method.
 
@@ -21,26 +21,28 @@
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
 
-#import <AppKit/AppKit.h>
-#import "CandidatesView.h"
-#import "CandidatesWindowController.h"
-#import "PreferencesController.h"
+#include <AppKit/AppKit.h>
+#include "CandidatesView.h"
+#include "CandidatesWindowController.h"
+#include "PreferenceKeys.h"
 
 @implementation CandidatesWindowController
 
 - initWithCandidates:(NSArray*)cands {
+    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
     self = [super initWithWindowNibName:@"Candidates"];
     [self window]; // load now
 
-    self->candidates = [[NSArray alloc] initWithArray:cands];
+    candidates = [[NSArray alloc] initWithArray:cands];
 
     // ”wŒiF
-    [[self window] setBackgroundColor: [[PreferencesController sharedController] windowColor]];
+    NSColor* color = [NSUnarchiver unarchiveObjectWithData:[defaults objectForKey:KEY_candidates_window_color]];
+    [[self window] setBackgroundColor:color];
 
     // •s“§–¾“x
-    [[self window] setAlphaValue: [[PreferencesController sharedController] windowAlpha]];
+    [[self window] setAlphaValue:[defaults floatForKey:KEY_candidates_window_alpha]];
 
-    self->candidates_view = [[CandidatesView alloc] initWithCandidates:cands];
+    candidates_view = [[CandidatesView alloc] initWithCandidates:cands];
     [[self window] setContentSize:[candidates_view bounds].size];
     [[[self window] contentView] addSubview:candidates_view];
 
Index: AquaSKK/ChangeLog
diff -u AquaSKK/ChangeLog:1.20.2.5 AquaSKK/ChangeLog:1.20.2.6
--- AquaSKK/ChangeLog:1.20.2.5	Sat Feb 18 02:20:38 2006
+++ AquaSKK/ChangeLog	Sun Feb 19 13:50:54 2006
@@ -1,3 +1,28 @@
+2006-02-19  Tomotaka SUWA  <t.suw****@mac*****>
+
+	* DictArrayController.*: NSTableView ‚̃f[ƒ^ƒ\[ƒXƒƒ\ƒbƒh‚ðŽÀ‘•B
+
+	* ServerConnectionFactory.cpp: ƒT[ƒo[‚Ì‹N“®ƒ^ƒCƒ€ƒAƒEƒg‚ð 40 •b‚©
+	‚ç 10 •b‚É’ZkB‚»‚Ì‚©‚í‚èAsleep ‚Í 0.3 ¨ 2 •b‚É‚µ‚Ä‘S‘Ì“I‚ȃp
+	ƒtƒH[ƒ}ƒ“ƒX‚ðã‚°‚éB
+
+	* CandidatesFrame.*: FrameAttribute ƒNƒ‰ƒX‚ð’ljÁBŒó•âƒEƒBƒ“ƒhƒE‚Ì
+	‘®«‚ðƒVƒ“ƒOƒ‹ƒgƒ“‚ňµ‚¤‚悤‚É‚·‚éB
+
+	* BIM.r: cbnm ‚ð jp.sourceforge.AquaSKKInputMethod ‚ɕύXB
+
+	* PreferencesController.*: Cocoa Bindings ‚ðŽg‚¤‚悤‚ɏC³B
+
+	* PreferenceKeys.h: V‹K’ljÁBƒ†[ƒU[ƒfƒtƒHƒ‹ƒg—p‚̃L[‚ð’è‹`B
+
+	* Info-AquaSKKServer.plist, Info-AquaSKKInputMethod.plist: ƒoƒ“ƒhƒ‹
+	ID ‚ð•ÏXB
+
+	* DictionarySet.cpp: Ž«‘‚̃pƒX‚É "~/" ‚ªŠÜ‚Ü‚ê‚Ä‚¢‚éê‡Aƒz[ƒ€ƒfƒB
+	ƒŒƒNƒgƒŠ‚É“WŠJ‚·‚é‚悤‚ɏC³B
+
+	* AquaSKKServer.*: initialize ƒƒ\ƒbƒh‚ð’ljÁB
+
 2006-02-18  Tomotaka SUWA  <t.suw****@mac*****>
 
 	* skkserv.*: socketstream ‚ðŽg‚¤‚悤‚ɏC³B
Index: AquaSKK/ClientMessageReceiver.cpp
diff -u AquaSKK/ClientMessageReceiver.cpp:1.3.2.2 AquaSKK/ClientMessageReceiver.cpp:1.3.2.3
--- AquaSKK/ClientMessageReceiver.cpp:1.3.2.2	Sat Jan 14 20:01:58 2006
+++ AquaSKK/ClientMessageReceiver.cpp	Sun Feb 19 13:50:54 2006
@@ -1,5 +1,5 @@
 /*
-  $Id: ClientMessageReceiver.cpp,v 1.3.2.2 2006/01/14 11:01:58 t-suwa Exp $
+  $Id: ClientMessageReceiver.cpp,v 1.3.2.3 2006/02/19 04:50:54 t-suwa Exp $
 
   MacOS X implementation of the SKK input method.
 
@@ -58,10 +58,7 @@
 
 CppCFData ClientMessageReceiver::messageReceived(SInt32 msgid, const CppCFData& data) {
     switch(msgid) {
-    case kBasicMessageIsSkkEggLikeNewline:
-    case kBasicMessageIsNumericKeypad_HalfWidth:
-    case kBasicMessageIsAsciiModeStartup:
-    case kBasicMessageKbdLayoutId:
+    case kSKKClientConfigurationModified:
 	ClientConfiguration::theInstance().reloadConfiguration();
 	break;
     default:
Index: AquaSKK/DictArrayController.m
diff -u AquaSKK/DictArrayController.m:1.1.2.1 AquaSKK/DictArrayController.m:1.1.2.2
--- AquaSKK/DictArrayController.m:1.1.2.1	Wed Feb 15 00:12:44 2006
+++ AquaSKK/DictArrayController.m	Sun Feb 19 13:50:54 2006
@@ -1,5 +1,5 @@
 /* -*- objc -*-
-  $Id: DictArrayController.m,v 1.1.2.1 2006/02/14 15:12:44 t-suwa Exp $
+  $Id: DictArrayController.m,v 1.1.2.2 2006/02/19 04:50:54 t-suwa Exp $
 
   MacOS X implementation of the SKK input method.
 
@@ -167,4 +167,13 @@
     return YES;
 }
 
+- (int)numberOfRowsInTableView:(NSTableView*)tv {
+    return [[self arrangedObjects] count];
+}
+
+- (id)tableView:(NSTableView*)tv objectValueForTableColumn:(NSTableColumn*)column row:(int)row {
+    id obj = [[self arrangedObjects] objectAtIndex:row];
+    return [obj valueForKey:[column identifier]];
+}
+
 @end
Index: AquaSKK/DictionarySet.cpp
diff -u AquaSKK/DictionarySet.cpp:1.1.2.1 AquaSKK/DictionarySet.cpp:1.1.2.2
--- AquaSKK/DictionarySet.cpp:1.1.2.1	Sat Feb 18 02:20:38 2006
+++ AquaSKK/DictionarySet.cpp	Sun Feb 19 13:50:54 2006
@@ -1,5 +1,5 @@
 /*
-  $Id: DictionarySet.cpp,v 1.1.2.1 2006/02/17 17:20:38 t-suwa Exp $
+  $Id: DictionarySet.cpp,v 1.1.2.2 2006/02/19 04:50:54 t-suwa Exp $
 
   MacOS X implementation of the SKK input method.
 
@@ -23,6 +23,7 @@
 
 #include <iostream>
 #include <sstream>
+#include <set>
 #include "CppCFString.h"
 #include "OkuriganaEntry.h"
 #include "Dictionary.h"
@@ -72,6 +73,12 @@
 // ƒtƒ@ƒNƒgƒŠƒƒ\ƒbƒh
 Dictionary* DictionarySet::createDictionary(const DictionaryPref& pref) const {
     Dictionary* dict;
+    std::string path = pref.location;
+
+    // ƒpƒX‚ð“WŠJ‚·‚é
+    if(path.size() > 2 && path.find("~/") == 0) {
+	path = SkkConfig::home() + path.substr(1);
+    }
 
     // Ž«‘‚̐¶¬
     switch(pref.type) {
@@ -97,7 +104,7 @@
     }
 
     // ‰Šú‰»
-    dict->load(pref.location);
+    dict->load(path);
 
     return dict;
 }
@@ -113,7 +120,7 @@
 }
 
 void DictionarySet::load() {
-    CFArrayRef arrayRef = (CFArrayRef)CFPreferencesCopyAppValue(CFSTR("DictionaryInfo"),
+    CFArrayRef arrayRef = (CFArrayRef)CFPreferencesCopyAppValue(CFSTR("dictionary_info_array"),
 								kCFPreferencesCurrentApplication);
     if(arrayRef == NULL) {
 	return;
@@ -478,23 +485,14 @@
 }
 
 static void removeRedundantItems(std::vector<CppCFString>& candidates) {
-    // ‚±‚̏ˆ—‚Ícandidates‚̐”‚ª‘‚¦‚é‚Ù‚ÇŽžŠÔ‚ª‚©‚©‚è‚Ü‚·B
-    // Žd•û‚È‚¢‚Ì‚¾‚낤‚¯‚ǁB
-    int size = candidates.size();
-    for(int i = 0; i < size; ++ i) {
-	CppCFString& cand_i = candidates[i];
-	bool is_redundant = false;
-	for(int j = 0; j < i; ++ j) {
-	    if(cand_i == candidates[j]) {
-		is_redundant = true;
-		break;
-	    }
-	}
-		
-	if(is_redundant) {
-	    candidates.erase(candidates.begin() + i);
-	    -- i; // ˆê‚Á‚µ‚½‚̂ŁA‚»‚ÌŒã‚É‘±‚­€–Ú‚ªˆê‚‚¸‚ê‚éB
-	    -- size; // ˆê‚Á‚µ‚½‚̂ŁB
+    std::set<CppCFString> check;
+    std::vector<CppCFString> result;
+
+    for(std::vector<CppCFString>::iterator iter = candidates.begin(); iter != candidates.end(); ++ iter) {
+	if(check.find(*iter) == check.end()) {
+	    check.insert(check.lower_bound(*iter), *iter);
+	    result.push_back(*iter);
 	}
     }
+    result.swap(candidates);
 }
Index: AquaSKK/Info-AquaSKKInputMethod.plist
diff -u AquaSKK/Info-AquaSKKInputMethod.plist:1.4.2.1 AquaSKK/Info-AquaSKKInputMethod.plist:1.4.2.2
--- AquaSKK/Info-AquaSKKInputMethod.plist:1.4.2.1	Sun Jan  8 16:15:30 2006
+++ AquaSKK/Info-AquaSKKInputMethod.plist	Sun Feb 19 13:50:54 2006
@@ -11,7 +11,7 @@
 	<key>CFBundleIconFile</key>
 	<string></string>
 	<key>CFBundleIdentifier</key>
-	<string>org.ccm-software.AquaSKKInputMethod</string>
+	<string>jp.sourceforge.AquaSKKInputMethod</string>
 	<key>CFBundleInfoDictionaryVersion</key>
 	<string>6.0</string>
 	<key>CFBundleName</key>
Index: AquaSKK/Info-AquaSKKServer.plist
diff -u AquaSKK/Info-AquaSKKServer.plist:1.4 AquaSKK/Info-AquaSKKServer.plist:1.4.2.1
--- AquaSKK/Info-AquaSKKServer.plist:1.4	Mon Dec 19 23:46:44 2005
+++ AquaSKK/Info-AquaSKKServer.plist	Sun Feb 19 13:50:54 2006
@@ -11,7 +11,7 @@
 	<key>CFBundleIconFile</key>
 	<string></string>
 	<key>CFBundleIdentifier</key>
-	<string>org.ccm-software.AquaSKKServer</string>
+	<string>jp.sourceforge.AquaSKKServer</string>
 	<key>CFBundleInfoDictionaryVersion</key>
 	<string>6.0</string>
 	<key>CFBundleName</key>
Index: AquaSKK/PreferenceKeys.h
diff -u /dev/null AquaSKK/PreferenceKeys.h:1.1.2.1
--- /dev/null	Sun Feb 19 13:50:55 2006
+++ AquaSKK/PreferenceKeys.h	Sun Feb 19 13:50:54 2006
@@ -0,0 +1,45 @@
+/* -*- objc -*-
+  $Id: PreferenceKeys.h,v 1.1.2.1 2006/02/19 04:50:54 t-suwa Exp $
+
+  MacOS X implementation of the SKK input method.
+
+  Copyright (C) 2002 phonohawk
+  Copyright (C) 2005-2006 Tomotaka SUWA <t.suw****@mac*****>
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#ifndef INC__PreferenceKeys__
+#define INC__PreferenceKeys__
+
+// ƒ†[ƒU[ƒfƒtƒHƒ‹ƒg—p‚̃L[
+extern NSString* KEY_egg_like_newline;
+extern NSString* KEY_numkeypad_must_halfwidth;
+extern NSString* KEY_force_ascii_mode_startup;
+extern NSString* KEY_keyboard_layout_id;
+
+extern NSString* KEY_candidates_font_name;
+extern NSString* KEY_candidates_font_size;
+extern NSString* KEY_candidates_window_color;
+extern NSString* KEY_candidates_window_alpha;
+extern NSString* KEY_candidates_window_show_after_nth_cand;
+
+extern NSString* KEY_dictionary_info_array;
+
+extern NSString* KEY_skkserv_enabled;
+extern NSString* KEY_skkserv_port;
+extern NSString* KEY_skkserv_localonly;
+
+#endif
Index: AquaSKK/PreferencesController.h
diff -u AquaSKK/PreferencesController.h:1.6.2.4 AquaSKK/PreferencesController.h:1.6.2.5
--- AquaSKK/PreferencesController.h:1.6.2.4	Sat Feb 18 02:20:38 2006
+++ AquaSKK/PreferencesController.h	Sun Feb 19 13:50:54 2006
@@ -1,5 +1,5 @@
 /* -*- objc -*-
-  $Id: PreferencesController.h,v 1.6.2.4 2006/02/17 17:20:38 t-suwa Exp $
+  $Id: PreferencesController.h,v 1.6.2.5 2006/02/19 04:50:54 t-suwa Exp $
 
   MacOS X implementation of the SKK input method.
 
@@ -21,57 +21,19 @@
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
 
-#pragma once
-
-/*
-  ‚±‚̃Nƒ‰ƒX‚ÍSingleton‚Å‚·B
-*/
-
 @interface PreferencesController : NSWindowController {
-    // “ü—Í‘€ì
     IBOutlet NSPopUpButton* kbdLayoutPopUp;
-    IBOutlet NSButton* skkEggLikeNewlineBtn;
-    IBOutlet NSButton* NumericKeypad_HalfWidthBtn;
-    IBOutlet NSButton* AsciiModeStartupButton;
-
-    // Œó•âƒEƒBƒ“ƒhƒE
-    IBOutlet id fontBtn;
-    IBOutlet id winColor;
-    IBOutlet id winTransparent;
-
-    // skkserv
-    IBOutlet NSButton *skkserv_enabled;
-    IBOutlet NSTextField *skkserv_port;
-    IBOutlet NSButton *skkserv_local_only;
+    IBOutlet NSButton* fontButton;
 
-    NSFont *font;
+    NSFont* font;
     NSFontPanel* fontPanel;
     NSMenu* kbdLayoutMenu;
 }
-+ (PreferencesController*)sharedController;
 
-- init;
++ (PreferencesController*)sharedController;
 
 - (IBAction)showFontPanel:(id)sender;
-- (void)changeFont:(id)fontManager;
-- (void)setFontButtonTitle:(NSFont *)aFont;
-
-- (NSColor *)windowColor;
-- (float)windowAlpha;
-
-- (int)kbdLayoutId;
-- (IBAction)changeKbdLayoutId:(id)sender;
-- (BOOL)isSkkEggLikeNewline;
-- (IBAction)skkEggLikeNewline:(id)sender;
-- (BOOL)isNumericKeypad_HalfWidth;
-- (IBAction)numericKeypad_HalfWidth:(id)sender;
-- (BOOL)isAsciiModeStartup;
-- (IBAction)asciiModeStartup:(id)sender;
-
-- (IBAction)saveUserDefault:(id)sender;
-
-- (BOOL)isSkkservEnabled;
-- (unsigned short)skkservPort;
-- (BOOL)isSkkservLocalOnly;
+- (void)changeFont:(id)sender;
+- (void)setFontButtonTitle:(NSFont*)aFont;
 
 @end
Index: AquaSKK/PreferencesController.mm
diff -u AquaSKK/PreferencesController.mm:1.6.2.6 AquaSKK/PreferencesController.mm:1.6.2.7
--- AquaSKK/PreferencesController.mm:1.6.2.6	Sat Feb 18 02:20:38 2006
+++ AquaSKK/PreferencesController.mm	Sun Feb 19 13:50:54 2006
@@ -1,5 +1,5 @@
 /*  -*- objc -*-
-  $Id: PreferencesController.mm,v 1.6.2.6 2006/02/17 17:20:38 t-suwa Exp $
+  $Id: PreferencesController.mm,v 1.6.2.7 2006/02/19 04:50:54 t-suwa Exp $
 
   MacOS X implementation of the SKK input method.
 
@@ -25,32 +25,34 @@
 #include "PreferencesController.h"
 
 #include "BIMClientServer.h"
-#include "CppCFString.h"
 #include "CppCFData.h"
+#include "CppCFString.h"
 #include "DictionarySet.h"
-#include "skkserv.h"
 #include "ClientConnectionFactory.h"
+#include "skkserv.h"
 
 // ƒ†[ƒU[ƒfƒtƒHƒ‹ƒg—p
-static NSString* KbdLayoutKey = @"KeyboardLayoutIdentifier";
-static NSString* EggLikeNewLineKey = @"dic.skk-egg-like-newline.kotoeri";
-static NSString* KeypadHalfWidthKey = @"dic.NumericKeypad_HalfWidth.kotoeri";
-static NSString* AsciiStartupKey = @"ForceASCIImodeStartup";
-
-static NSString* FontNameKey = @"dic.FontName.Window";
-static NSString* FontSizeKey = @"dic.FontSize.Window";
-static NSString* WindowColorKey = @"dic.WindowColor.kotoeri";
-static NSString* WindowAlphaKey = @"dic.WindowAlpha.kotoeri";
-static NSString* ShowCandsLimitKey = @"dic.showCandsWindowAfterNthCand";
-
-static NSString* SKKServEnabledKey = @"pref.skkserv.enabled";
-static NSString* SKKServPortKey = @"pref.skkserv.port";
-static NSString* SKKServLocalOnlyKey = @"pref.skkserv.local-only";
+NSString* KEY_keyboard_layout_id = @"keyboard_layout_id";
+NSString* KEY_egg_like_newline = @"egg_like_newline";
+NSString* KEY_numkeypad_must_halfwidth = @"numkeypad_must_halfwidth";
+NSString* KEY_force_ascii_mode_startup = @"force_ascii_mode_startup";
+
+NSString* KEY_candidates_font_name = @"candidates_font_name";
+NSString* KEY_candidates_font_size = @"candidates_font_size";
+NSString* KEY_candidates_window_color = @"candidates_window_color";
+NSString* KEY_candidates_window_alpha = @"candidates_window_alpha";
+NSString* KEY_candidates_window_show_after_nth_cand = @"candidates_window_show_after_nth_cand";
+
+NSString* KEY_dictionary_info_array = @"dictionary_info_array";
+
+NSString* KEY_skkserv_enabled = @"skkserv_enabled";
+NSString* KEY_skkserv_port = @"skkserv_port";
+NSString* KEY_skkserv_localonly = @"skkserv_localonly";
 
 // ƒL[ƒ{[ƒhƒŒƒCƒAƒEƒg—p
-static NSString* KbdIdKey = @"Identifier";
-static NSString* KbdNameKey = @"LocalizedName";
-static NSString* KbdIconKey = @"Icon";
+const NSString* KbdIdKey = @"Identifier";
+const NSString* KbdNameKey = @"LocalizedName";
+const NSString* KbdIconKey = @"Icon";
 
 @implementation PreferencesController
 
@@ -120,16 +122,6 @@
     [kbdLayoutPopUp setMenu:kbdLayoutMenu];
 }
 
-- (void)setState:(SInt32)msgID state:(int)state {
-    bool boolState = state ? true : false;
-
-    CppCFData data(&boolState, sizeof(bool));
-
-    ClientConnectionFactory::theInstance().newConnection().send(msgID, data);
-
-    [self saveUserDefault:self];
-}
-
 + (PreferencesController*)sharedController {
     static PreferencesController* _shared_instance = nil;
     if(_shared_instance == nil) {
@@ -138,150 +130,24 @@
     return _shared_instance;
 }
 
-- init {
+- (id)init {
     self = [super initWithWindowNibName:@"Preferences"];
     [self window];
 
-    // ƒŒƒxƒ‹•ÏXFƒtƒ[ƒeƒBƒ“ƒO
-    //[[self window] setLevel:NSPopUpMenuWindowLevel];
-
-    // o‰×ŽžÝ’è‚̏‰Šú‰»
-    NSMutableDictionary* templateDefaults = [NSMutableDictionary dictionary];
-
-    NSColor* color = [NSColor controlColor];
-    [templateDefaults setObject:@"NO" forKey:EggLikeNewLineKey];
-    [templateDefaults setObject:@"NO" forKey:KeypadHalfWidthKey];
-    [templateDefaults setObject:@"NO" forKey:AsciiStartupKey];
-    [templateDefaults setObject:@"0" forKey:KbdLayoutKey];
-    [templateDefaults setObject:[[NSFont systemFontOfSize:0] fontName] forKey:FontNameKey];
-    [templateDefaults setObject:[NSNumber numberWithInt:0] forKey:FontSizeKey];
-    [templateDefaults setObject:[NSArchiver archivedDataWithRootObject:color] forKey:WindowColorKey];
-    [templateDefaults setObject:@"1.0" forKey:WindowAlphaKey];
-    [templateDefaults setObject:@"5" forKey:ShowCandsLimitKey];
-    [templateDefaults setObject:@"NO" forKey:SKKServEnabledKey];
-    [templateDefaults setObject:@"1178" forKey:SKKServPortKey];
-    [templateDefaults setObject:@"YES" forKey:SKKServLocalOnlyKey];
-
-    // ~/Library/AquaSKK/‚ª–³‚¯‚ê‚΍ì‚éB
-    [[NSFileManager defaultManager]
-	createDirectoryAtPath:[@"~/Library/AquaSKK" stringByExpandingTildeInPath] attributes:nil];
-
-    // defaults‚ð“Ç‚Þ
     NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
-    [defaults registerDefaults:templateDefaults];
 
-    // “ü—Í‘€ì
-    [skkEggLikeNewlineBtn setState:[defaults boolForKey:EggLikeNewLineKey]];
-    [NumericKeypad_HalfWidthBtn setState:[defaults boolForKey:KeypadHalfWidthKey]];
-    [AsciiModeStartupButton setState:[defaults boolForKey:AsciiStartupKey]];
+    // ‰Šú‰»
     [self initKbdLayoutPopUp];
-    [kbdLayoutPopUp selectItemAtIndex:[kbdLayoutPopUp indexOfItemWithTag:[defaults integerForKey:KbdLayoutKey]]];
+    int index = [kbdLayoutPopUp indexOfItemWithTag:[defaults integerForKey:KEY_keyboard_layout_id]];
+    [kbdLayoutPopUp selectItemAtIndex:index];
 
-    // Œó•âƒEƒBƒ“ƒhƒE
-    font = [[NSFont fontWithName:[defaults objectForKey:FontNameKey] size:[defaults floatForKey:FontSizeKey]] retain];
+    font = [[NSFont fontWithName:[defaults objectForKey:KEY_candidates_font_name]
+		    size:[defaults floatForKey:KEY_candidates_font_size]] retain];
     [self setFontButtonTitle:font];
-    [winColor setColor:[NSUnarchiver unarchiveObjectWithData:[defaults objectForKey:WindowColorKey]]];
-    [winTransparent setDoubleValue:[defaults floatForKey:WindowAlphaKey]];
-
-    // Ž«‘
-
-    // skkserv
-    [skkserv_enabled setState:[defaults boolForKey:SKKServEnabledKey]];
-    [skkserv_port setIntValue:[defaults integerForKey:SKKServPortKey]];
-    [skkserv_local_only setState:[defaults boolForKey:SKKServLocalOnlyKey]];
 
     return self;
 }
 
-- (IBAction)saveUserDefault:(id)sender {
-    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
-
-    // “ü—Í‘€ì
-    [defaults setBool:[skkEggLikeNewlineBtn state] forKey:EggLikeNewLineKey];
-    [defaults setBool:[NumericKeypad_HalfWidthBtn state] forKey:KeypadHalfWidthKey];
-    [defaults setBool:[AsciiModeStartupButton state] forKey:AsciiStartupKey];
-    [defaults setInteger:[[kbdLayoutPopUp selectedItem] tag] forKey:KbdLayoutKey];
-
-    // Œó•âƒEƒBƒ“ƒhƒE
-    [defaults setObject:[font fontName] forKey:FontNameKey];
-    [defaults setObject:[NSNumber numberWithFloat:[font pointSize]] forKey:FontSizeKey];
-    [defaults setObject:[NSArchiver archivedDataWithRootObject:[winColor color]] forKey:WindowColorKey];
-    [defaults setFloat:[winTransparent doubleValue] forKey:WindowAlphaKey];
-
-    // Ž«‘
-
-    // skkserv
-    [defaults setBool:[skkserv_enabled state] forKey:SKKServEnabledKey];
-    [defaults setInteger:[skkserv_port intValue] forKey:SKKServPortKey];
-    [defaults setBool:[skkserv_local_only state] forKey:SKKServLocalOnlyKey];
-
-    [defaults synchronize];
-}
-
-- (IBAction)showFontPanel:(id)sender {
-    [fontPanel release];
-    fontPanel = [[[NSFontManager sharedFontManager] fontPanel:YES] retain];
-    [fontPanel setPanelFont:font isMultiple:NO];
-    [fontPanel makeKeyAndOrderFront:self];
-}
-
-- (void)changeFont:(id)fontManager {
-    [font release];
-    font = [[fontManager convertFont:[NSFont systemFontOfSize:14]] retain];
-    [self setFontButtonTitle:font];
-    [self saveUserDefault:self];
-}
-
-- (void)setFontButtonTitle:(NSFont *)aFont {
-    [[fontBtn cell] setFont:[NSFont fontWithName:[aFont fontName] size:[aFont pointSize]]];
-    [fontBtn setTitle:[NSString stringWithFormat:@"%@ - %2.1f", [aFont displayName], [aFont pointSize]]];
-}
-
-- (NSColor *)windowColor {
-    return [winColor color];
-}
-
-- (float)windowAlpha {
-    return [winTransparent doubleValue];
-}
-
-- (int)kbdLayoutId {
-    return [[kbdLayoutPopUp selectedItem] tag];
-}
-
-- (IBAction)changeKbdLayoutId:(id)sender {
-    SInt32 kbdId = [self kbdLayoutId];
-    CppCFData data(&kbdId, sizeof(SInt32));
-
-    ClientConnectionFactory::theInstance().newConnection().send(kBasicMessageKbdLayoutId, data);
-
-    [self saveUserDefault:self];
-}
-
-- (BOOL)isSkkEggLikeNewline {
-    return [skkEggLikeNewlineBtn state];
-}
-
-- (IBAction)skkEggLikeNewline:(id)sender {
-    [self setState:kBasicMessageIsSkkEggLikeNewline state:[sender state]];
-}
-
-- (BOOL)isNumericKeypad_HalfWidth {
-    return [NumericKeypad_HalfWidthBtn state];
-}
-
-- (IBAction)numericKeypad_HalfWidth:(id)sender {	
-    [self setState:kBasicMessageIsNumericKeypad_HalfWidth state:[sender state]];
-}
-
-- (BOOL)isAsciiModeStartup {
-    return [AsciiModeStartupButton state];
-}
-
-- (IBAction)asciiModeStartup:(id)sender {	
-    [self setState:kBasicMessageIsAsciiModeStartup state:[sender state]];
-}
-
 - (IBAction)showWindow:(id)sender {
     [NSApp activateIgnoringOtherApps:YES];
     [[self window] makeKeyAndOrderFront:nil];
@@ -290,33 +156,49 @@
 }
 
 - (BOOL)windowShouldClose:(NSNotification *)aNotification {
+    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
+
+    // ƒ†[ƒU[ƒfƒtƒHƒ‹ƒg‚Ì•Û‘¶
+    [defaults synchronize];
+    [fontPanel close];
+
+    // ƒNƒ‰ƒCƒ“ƒg‚ɕύX‚ð’Ê’m‚·‚é
+    ClientConnectionFactory::theInstance().newConnection().send(kSKKClientConfigurationModified, CppCFData());
+
     // Ä“xAŽ«‘ƒT[ƒo[‚ð‰Šú‰»‚·‚é
     DictionarySet::theInstance().initialize();
 
     // skkserv ƒGƒ~ƒ…ƒŒ[ƒVƒ‡ƒ“‚̍ċN“®
     skkserv& skkserv = skkserv::theInstance();
     skkserv.stop();
-    if([self isSkkservEnabled]) {
-	skkserv.start([self skkservPort], [self isSkkservLocalOnly]);
+    if([defaults boolForKey:KEY_skkserv_enabled]) {
+	skkserv.start([defaults integerForKey:KEY_skkserv_port], [defaults boolForKey:KEY_skkserv_localonly]);
     }
 
-    [fontPanel close];
-	
-    [self saveUserDefault:self];
     return TRUE;
 }
 
-// skkserv
-- (BOOL)isSkkservEnabled {
-    return [skkserv_enabled state];
+- (IBAction)showFontPanel:(id)sender {
+    fontPanel = [NSFontPanel sharedFontPanel];
+    [fontPanel setPanelFont:font isMultiple:NO];
+    [fontPanel makeKeyAndOrderFront:self];
 }
 
-- (unsigned short)skkservPort {
-    return [skkserv_port intValue];
+- (void)changeFont:(id)sender {
+    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
+
+    [font release];
+    font = [[sender convertFont:[NSFont systemFontOfSize:14]] retain];
+
+    // Cocoa Bindings ‚É‚æ‚èAƒ{ƒ^ƒ“‚̃tƒHƒ“ƒg‘®«‚à˜A“®‚µ‚ĕύX‚³‚ê‚é
+    [defaults setObject:[font fontName] forKey:KEY_candidates_font_name];
+    [defaults setObject:[NSNumber numberWithFloat:[font pointSize]] forKey:KEY_candidates_font_size];
+
+    [self setFontButtonTitle:font];
 }
 
-- (BOOL)isSkkservLocalOnly {
-    return [skkserv_local_only state];
+- (void)setFontButtonTitle:(NSFont *)aFont {
+    [fontButton setTitle:[NSString stringWithFormat:@"%@ - %2.1f", [aFont displayName], [aFont pointSize]]];
 }
 
 @end
Index: AquaSKK/ServerConnectionFactory.cpp
diff -u AquaSKK/ServerConnectionFactory.cpp:1.2.2.1 AquaSKK/ServerConnectionFactory.cpp:1.2.2.2
--- AquaSKK/ServerConnectionFactory.cpp:1.2.2.1	Sat Jan 14 20:01:58 2006
+++ AquaSKK/ServerConnectionFactory.cpp	Sun Feb 19 13:50:54 2006
@@ -1,23 +1,24 @@
 /*
-	$Id: ServerConnectionFactory.cpp,v 1.2.2.1 2006/01/14 11:01:58 t-suwa Exp $
-	---------
-	
-    MacOS X implementation of the SKK input method.
-    Copyright (C) 2002 phonohawk
+  $Id: ServerConnectionFactory.cpp,v 1.2.2.2 2006/02/19 04:50:54 t-suwa Exp $
+
+  MacOS X implementation of the SKK input method.
+
+  Copyright (C) 2002 phonohawk
+  Copyright (C) 2006 Tomotaka SUWA <t.suw****@mac*****>
 
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
 
 #include <Carbon/Carbon.h>
@@ -30,8 +31,7 @@
 
 static ServerConnectionFactory* _shared_instance = NULL;
 
-ServerConnectionFactory& ServerConnectionFactory::theInstance()
-{
+ServerConnectionFactory& ServerConnectionFactory::theInstance() {
     if(_shared_instance == NULL) {
 	_shared_instance = new ServerConnectionFactory();
     }
@@ -39,22 +39,17 @@
     return *_shared_instance;
 }
 
-ServerConnectionFactory::ServerConnectionFactory()
-    :serverIsRunning(false)
-{
+ServerConnectionFactory::ServerConnectionFactory() :serverIsRunning(false) {
     // empty
 }
 
-void ServerConnectionFactory::waitUntilServerStarts()
-{
+void ServerConnectionFactory::waitUntilServerStarts() {
     prepareServer();
 	
     if(!serverIsRunning) {
-	// ŽI‚ªÚ‘±‰Â”\‚É‚È‚é‚܂ő҂B40•b‘Ò‚Á‚Ä‚àÚ‘±‰Â”\‚É‚È‚ç‚È‚¯‚ê
-	// ‚΃^ƒCƒ€ƒAƒEƒgB
+	// 10 •b‘Ò‚Á‚Ä‚àÚ‘±‰Â”\‚É‚È‚ç‚È‚¯‚ê‚΃^ƒCƒ€ƒAƒEƒg
 	CppCFString server_port_name(kBasicServerPortName);
-
-	unsigned long timeout = TickCount() + (40 * 60);
+	unsigned long timeout = TickCount() + (10 * 60);
 	while(true) {
 	    try {
 		ServerConnection connection(server_port_name);
@@ -62,25 +57,21 @@
 		break;
 	    } catch (std::exception& e) {
 		if(TickCount() > timeout) {
-		    fprintf(stderr,
-			    "*** Timed out. AquaSKKServer.app didn\'t get online.\n");
+		    fprintf(stderr, "*** Timed out. AquaSKKServer.app didn\'t get online.\n");
 		    break; // ƒ^ƒCƒ€ƒAƒEƒg
 		} else {
-		    // 0.3•b‘Ò‚Á‚čĐڑ±
-		    usleep(300000); // 0.3 * 1000 * 1000
+		    sleep(2);	// 2 •b‘Ò‚Á‚čĐڑ±
 		}
 	    }
 	}
     }
 }
 
-ServerConnectionFactory& ServerConnectionFactory::prepareServer()
-{
+ServerConnectionFactory& ServerConnectionFactory::prepareServer() {
     serverIsRunning = false;
 
-    // ŽI‚̃|[ƒg‚ðŠJ‚¢‚Ă݂āAŠJ‚¯‚é‚È‚çŠù‚É‹N“®‚µ‚Ä‚¢‚é‚Ì‚Å–ß‚éB
-    CFMessagePortRef port
-	= CFMessagePortCreateRemote(NULL, CFSTR(kBasicServerPortName));
+    // ƒT[ƒo[‚̃|[ƒg‚ɐڑ±‚Å‚«‚é‚©H
+    CFMessagePortRef port = CFMessagePortCreateRemote(NULL, CFSTR(kBasicServerPortName));
     if(port) {
 	serverIsRunning = true;
         CFRelease(port);
@@ -94,11 +85,10 @@
     CFURLRef sharedSupportURL = CFBundleCopySharedSupportURL(myComponentBundle);
 
     // ŽI‚ւ̃pƒX‚ðURL‚Æ‚µ‚č쐬
-    CFURLRef serverURL
-	= CFURLCreateCopyAppendingPathComponent(NULL,
-						sharedSupportURL,
-						CFSTR(kCSTR_SKKServerName),
-						FALSE);
+    CFURLRef serverURL = CFURLCreateCopyAppendingPathComponent(NULL,
+							       sharedSupportURL,
+							       CFSTR(kCSTR_SKKServerName),
+							       FALSE);
 
     // URL‚ðFSRef‚É•ÏŠ·‚µA‚»‚ê‚ðFSSpec‚É•ÏŠ·‚·‚éB
     FSRef serverFSRef;
@@ -107,15 +97,18 @@
     FSSpec serverFileSpec;
     FSGetCatalogInfo(&serverFSRef, kFSCatInfoNone, NULL,NULL, &serverFileSpec, NULL);
 
-    // ƒ‰ƒEƒ“ƒ`
-    LaunchParamBlockRec		launchParams;
+    // ‹N“®
+    LaunchParamBlockRec launchParams;
     launchParams.launchBlockID = extendedBlock;
     launchParams.launchEPBLength = extendedBlockLen;
     launchParams.launchFileFlags = 0;
     launchParams.launchControlFlags = launchNoFileFlags + launchContinue + launchDontSwitch;
     launchParams.launchAppSpec = &serverFileSpec;
     launchParams.launchAppParameters = NULL;
-    LaunchApplication(&launchParams);
+    OSErr result = LaunchApplication(&launchParams);
+    if(result != noErr) {
+	fprintf(stderr, "*** ERR ***: loading AquaSKKServer failed: %d\n", result);
+    }
 
     if(serverURL) CFRelease(serverURL);
     if(sharedSupportURL) CFRelease(sharedSupportURL);
@@ -123,8 +116,7 @@
     return *this;
 }
 
-ServerConnection ServerConnectionFactory::newConnection()
-{
+ServerConnection ServerConnectionFactory::newConnection() {
     try {
 	return ServerConnection(kBasicServerPortName);
     } catch (std::exception& e) {
Index: AquaSKK/ServerMessageReceiver.h
diff -u AquaSKK/ServerMessageReceiver.h:1.4.2.1 AquaSKK/ServerMessageReceiver.h:1.4.2.2
--- AquaSKK/ServerMessageReceiver.h:1.4.2.1	Sat Jan  7 16:22:29 2006
+++ AquaSKK/ServerMessageReceiver.h	Sun Feb 19 13:50:54 2006
@@ -1,5 +1,5 @@
 /*
-  $Id: ServerMessageReceiver.h,v 1.4.2.1 2006/01/07 07:22:29 t-suwa Exp $
+  $Id: ServerMessageReceiver.h,v 1.4.2.2 2006/02/19 04:50:54 t-suwa Exp $
 
   MacOS X implementation of the SKK input method.
 
@@ -48,10 +48,7 @@
     void showAboutBox();
     void showPreferencesBox();
     CppCFData fetchCompletions(const CppCFData& attachment);
-    CppCFData eggLikeNewline();
-    CppCFData numericKeypad_HalfWidth();
-    CppCFData asciiModeStartup();
-    CppCFData kbdLayoutId();
+    CppCFData valueForKey(NSString* key); 
 
 public:
     static void start(const CFStringRef loopMode);
Index: AquaSKK/ServerMessageReceiver.mm
diff -u AquaSKK/ServerMessageReceiver.mm:1.4.2.2 AquaSKK/ServerMessageReceiver.mm:1.4.2.3
--- AquaSKK/ServerMessageReceiver.mm:1.4.2.2	Sat Feb 18 02:20:38 2006
+++ AquaSKK/ServerMessageReceiver.mm	Sun Feb 19 13:50:54 2006
@@ -1,5 +1,5 @@
 /* -*- objc -*-
-  $Id: ServerMessageReceiver.mm,v 1.4.2.2 2006/02/17 17:20:38 t-suwa Exp $
+  $Id: ServerMessageReceiver.mm,v 1.4.2.3 2006/02/19 04:50:54 t-suwa Exp $
 
   MacOS X implementation of the SKK input method.
 
@@ -24,6 +24,7 @@
 #include <AppKit/AppKit.h>
 #include "CandidatesView.h"
 #include "CandidatesWindowController.h"
+#include "PreferenceKeys.h"
 #include "PreferencesController.h"
 #include "AboutBoxController.h"
 #include "BIMClientServer.h"
@@ -108,16 +109,16 @@
 	reply = fetchCompletions(body);
 	break;
     case kBasicMessageIsSkkEggLikeNewline:
-	reply = eggLikeNewline();
+	reply = valueForKey(KEY_egg_like_newline);
 	break;
     case kBasicMessageIsNumericKeypad_HalfWidth:
-	reply = numericKeypad_HalfWidth();
+	reply = valueForKey(KEY_numkeypad_must_halfwidth);
 	break; 
     case kBasicMessageIsAsciiModeStartup:
-	reply = asciiModeStartup();
+	reply = valueForKey(KEY_force_ascii_mode_startup);
 	break; 
     case kBasicMessageKbdLayoutId:
-	reply = kbdLayoutId();
+	reply = valueForKey(KEY_keyboard_layout_id);
 	break; 
    default:
 	break;
@@ -215,26 +216,8 @@
     return CppCFData().own(reply.toCFData());
 }
 
-CppCFData ServerMessageReceiver::eggLikeNewline() {
-    int isSkkEggLikeNewline = [[PreferencesController sharedController] isSkkEggLikeNewline];
+CppCFData ServerMessageReceiver::valueForKey(NSString* key) {
+    int result = [[NSUserDefaults standardUserDefaults] integerForKey:key];
 
-    return CppCFData(&isSkkEggLikeNewline, sizeof(isSkkEggLikeNewline));
-}
-
-CppCFData ServerMessageReceiver::numericKeypad_HalfWidth() {
-    int isNumericKeypad_HalfWidth = [[PreferencesController sharedController] isNumericKeypad_HalfWidth];
-
-    return CppCFData(&isNumericKeypad_HalfWidth, sizeof(isNumericKeypad_HalfWidth));
-}
-
-CppCFData ServerMessageReceiver::asciiModeStartup() {
-    int isAsciiModeStartup = [[PreferencesController sharedController] isAsciiModeStartup];
-
-    return CppCFData(&isAsciiModeStartup, sizeof(isAsciiModeStartup));
-}
-
-CppCFData ServerMessageReceiver::kbdLayoutId() {
-    int kbdId = [[PreferencesController sharedController] kbdLayoutId];
-
-    return CppCFData(&kbdId, sizeof(kbdId));
+    return CppCFData(&result, sizeof(result));
 }
Index: AquaSKK/UserDefaults.plist
diff -u /dev/null AquaSKK/UserDefaults.plist:1.1.2.1
--- /dev/null	Sun Feb 19 13:50:55 2006
+++ AquaSKK/UserDefaults.plist	Sun Feb 19 13:50:54 2006
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>candidates_font_name</key>
+	<string>LucidaGrande</string>
+	<key>candidates_font_size</key>
+	<integer>14</integer>
+	<key>candidates_window_alpha</key>
+	<real>1</real>
+	<key>candidates_window_color</key>
+	<data>
+	BAt0eXBlZHN0cmVhbYED6IQBQISEhAdOU0NvbG9yAISECE5TT2JqZWN0AIWEAWMGhANA
+	QECEhIQITlNTdHJpbmcBlIQBKwZTeXN0ZW2GhJaYDGNvbnRyb2xDb2xvcoaEk5UDhAJm
+	ZoM/KqqrAYaG
+	</data>
+	<key>candidates_window_show_after_nth_cand</key>
+	<integer>5</integer>
+	<key>dictionary_info_array</key>
+	<array>
+		<dict>
+			<key>active</key>
+			<true/>
+			<key>location</key>
+			<string>~/.skk-jisyo</string>
+			<key>type</key>
+			<integer>10</integer>
+		</dict>
+		<dict>
+			<key>active</key>
+			<true/>
+			<key>location</key>
+			<string>~/Library/AquaSKK/SKK-JISYO.L</string>
+			<key>type</key>
+			<integer>10</integer>
+		</dict>
+	</array>
+	<key>egg_like_new_line</key>
+	<false/>
+	<key>force_ascii_mode_startup</key>
+	<false/>
+	<key>keyboard_layout_Id</key>
+	<integer>0</integer>
+	<key>numkeypad_must_halfwidth</key>
+	<false/>
+	<key>skkserv_enabled</key>
+	<false/>
+	<key>skkserv_localonly</key>
+	<true/>
+	<key>skkserv_port</key>
+	<integer>1178</integer>
+</dict>
+</plist>


aquaskk-changes メーリングリストの案内
Back to archive index