--- skkinput-2.06.3/OffWin.c._orig_ 2002-12-07 00:10:16.000000000 +0900 +++ skkinput-2.06.3/OffWin.c 2004-08-22 20:00:19.000000000 +0900 @@ -59,6 +59,8 @@ * したら覚えるようにしようか? */ { XtNmwidth, XtCMwidth, XtRDimension, sizeof(Dimension), offset(minibuf_width), XtRImmediate, (XtPointer)640 }, + { XtNborderWidth, XtCBorderWidth, XtRDimension, sizeof(Dimension), + offset(modeshell_border_width), XtRImmediate, (XtPointer) 2}, /* 自分とこで作ったリソース。*/ { XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel), offset(puppixel), XtRString, XtDefaultForeground }, @@ -371,7 +373,6 @@ w->offthespotWin.modeshell_win = w->offthespotWin.canvas_win = None ; w->offthespotWin.modeshell_width = w->offthespotWin.modeshell_height = 1 ; - w->offthespotWin.modeshell_border_width = 2 ; return ; } @@ -560,6 +561,10 @@ /* Window Manager にヒントを送っている。*/ XSetWMNormalHints ( XtDisplay( gw ), XtWindow( minibuffer_popup ), &sizehints ) ; + /* Qtツールキット対策 */ + XSetTransientForHint(XtDisplay (gw), + XtWindow (minibuffer_popup), + w->offthespotWin.client_window) ; /*XFlush( XtDisplay( gw ) ) ;*/ return ; } --- skkinput-2.06.3/OnWin.c._orig_ 2002-11-18 01:28:25.000000000 +0900 +++ skkinput-2.06.3/OnWin.c 2004-08-22 19:56:39.000000000 +0900 @@ -497,6 +497,10 @@ sizehints.flags = (PBaseSize | PMinSize | PResizeInc | USSize | PWinGravity) ; /* Window Manager にヒントを送っている。*/ XSetWMNormalHints (XtDisplay (gw), XtWindow (minibuffer_popup), &sizehints) ; + /* Qtツールキット対策 */ + XSetTransientForHint(XtDisplay (gw), + XtWindow (minibuffer_popup), + w->onthespotWin.client_window) ; /*XFlush (XtDisplay (gw)) ;*/ return ; } --- skkinput-2.06.3/OverWin.c._orig_ 2002-12-07 00:10:16.000000000 +0900 +++ skkinput-2.06.3/OverWin.c 2004-08-23 23:05:41.000000000 +0900 @@ -59,6 +59,8 @@ * したら覚えるようにしようか? */ { XtNmwidth, XtCMwidth, XtRDimension, sizeof(Dimension), offset(minibuf_width), XtRImmediate, (XtPointer)640 }, + { XtNborderWidth, XtCBorderWidth, XtRDimension, sizeof(Dimension), + offset(modeshell_border_width), XtRImmediate, (XtPointer) 2}, /* 自分とこで作ったリソース。*/ { XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel), offset(puppixel), XtRString, XtDefaultForeground }, @@ -393,7 +395,6 @@ /* ヒストリの初期化をする。*/ OTSW_InitializeHistory (gnew) ; - w->overthespotWin.modeshell_border_width = 2 ; w->overthespotWin.modeshell_width = w->overthespotWin.modeshell_height = 1 ; @@ -711,6 +712,10 @@ /* Window Manager にヒントを送っている。*/ XSetWMNormalHints (XtDisplay (gw), XtWindow (minibuffer_popup), &sizehints) ; + /* Qtツールキット対策 */ + XSetTransientForHint(XtDisplay (gw), + XtWindow (minibuffer_popup), + w->overthespotWin.client_window) ; /*XFlush (XtDisplay (gw)) ;*/ return ; } @@ -1213,9 +1218,14 @@ register Widget gw, register Window focus_win) { +#if 0 register Display* pDisplay = XtDisplay (gw) ; +#endif OverthespotWinWidget w = (OverthespotWinWidget)gw ; + /* Mozilla でモードシェルが飛びまくるので無効化 */ + /* たぶん,親を変える必要はない */ +#if 0 XReparentWindow (pDisplay, w->overthespotWin.topline_win, focus_win, 0, 0) ; XReparentWindow (pDisplay, w->overthespotWin.midline_win, focus_win, 0, 0) ; XReparentWindow (pDisplay, w->overthespotWin.botline_win, focus_win, 0, 0) ; @@ -1224,9 +1234,10 @@ if (!w->overthespotWin.fixed_modeshell) XReparentWindow (pDisplay, w->overthespotWin.modeshell_win, focus_win, 0, 0) ; - w->overthespotWin.focus_window = focus_win ; OTSW_ReleaseAllGCs (gw) ; OTSW_CreateAllGCs (gw) ; +#endif + w->overthespotWin.focus_window = focus_win ; return ; } @@ -1253,9 +1264,12 @@ /* フォーカスだけを修正する。*/ OTSW_ChangeFocusWindow (gw, values->focus_window) ; +/* XReparentWindow() の無効化に伴い,ここも無効化 */ +#if 0 /* 以前のクライアントエリアに対する情報は今回においては正しく * なくなるので、破棄する。*/ w->overthespotWin.attribute_mask &= ~ (CAClientArea) ; +#endif } else { w->overthespotWin.focus_window = values->focus_window ; } @@ -1875,11 +1889,14 @@ w->overthespotWin.font_ascent ; } /* 左右に表示する場所があるかどうかを見る。*/ + /* Netscape 4.x で変になるので無効化 */ +#if 0 if (x > max_x){ x = max_x ; } else if (x < min_x){ x = min_x ; } +#endif /* そのまま表示したら画面の下に出てしまう? */ if (y > max_y && !w->overthespotWin.south_cursor){ #ifdef DEBUG @@ -1890,8 +1907,10 @@ fprintf (stderr, "client y = %d, height = %d\n", w->overthespotWin.client_area.y, w->overthespotWin.client_area.height) ; + /* fprintf (stderr, "border width = %d\n", w->overthespotWin.modeshell_popup->core.border_width) ; + */ #endif y = w->overthespotWin.spot_y - w->overthespotWin.font_ascent - @@ -1900,7 +1919,9 @@ /* 画面の上から出てしまうの? */ if (y < min_y){ y = w->overthespotWin.spot_y ; +#if 0 x = min_x ; +#endif } else { xswa.win_gravity = SouthWestGravity ; } --- skkinput-2.06.3/XIMServer.c._orig_ 2002-10-26 12:11:13.000000000 +0900 +++ skkinput-2.06.3/XIMServer.c 2004-08-23 21:59:49.000000000 +0900 @@ -53,6 +53,10 @@ XtRString, sizeof (String), offset (m_strConvStartKeys), XtRImmediate, (XtPointer) "Shiftspace,CntrlKanji,CntrlHenkan_Mode", }, + { XtNconversionEndKey, XtCConversionEndKey, + XtRString, sizeof (String), + offset (m_strConvEndKeys), XtRImmediate, + (XtPointer) "Shiftspace,CntrlKanji,CntrlHenkan_Mode", }, { XtNdestroyCallback, XtCCallback, XtRCallback, sizeof (XtCallbackList), offset (m_lstCbkDestroy), XtRCallback, (XtPointer) NULL, }, @@ -69,6 +73,7 @@ /* parseStr.c */ extern int parseXrLikeKeyStrings (unsigned char*, struct XrLikeKey*) ; +extern int parseXrLikeKeyString (unsigned char*, KeySym *, long *, long *) ; static void ximServer_onInitialize (Widget, Widget, ArgList, Cardinal*) ; static void ximServer_onRealize (Widget, XtValueMask*, XSetWindowAttributes*) ; @@ -138,7 +143,7 @@ } ; WidgetClass ximServerWidgetClass = (WidgetClass)&ximServerClassRec ; - +XIMServerPart *XimServer_ptr=NULL ; void ximServer_onInitialize ( @@ -209,6 +214,16 @@ { register XIMServerWidget wgThis = (XIMServerWidget) gw ; + if ( wgThis->ximServer.conv_end_key_list != NULL ) { + cKeyList *listelem = wgThis->ximServer.conv_end_key_list ; + while ( listelem != NULL) { + cKeyList *next_elem = listelem->next ; + XtFree( (char*)listelem ) ; + listelem = next_elem ; + } + } + XimServer_ptr=NULL; + XtCallCallbacks (gw, XtNdestroyCallback, 0) ; ximServer_destroyAllClient (gw) ; @@ -471,6 +486,47 @@ /* 登録する。*/ wgThis->ximServer.m_lstHotKeyTrigger = pStartKeys ; wgThis->ximServer.m_nHotKeyTrigger = num ; + + wgThis->ximServer.conv_end_key_list = NULL ; + XimServer_ptr=&(wgThis->ximServer) ; + + if ( wgThis->ximServer.m_strConvEndKeys != NULL ) { + char *p = wgThis->ximServer.m_strConvEndKeys ; + char *buf = NULL ; + size_t buf_size = 0 ; + cKeyList *prev_key_listelem = NULL, *new_key_listelem ; + + while ( *p != '\0' ) { + KeySym ksym ; + long mods, chk_mods ; + unsigned int comp_len ; + + comp_len = strcspn( p, ",\n" ) + 1 ; + if ( buf_size < comp_len ) { + buf = XtRealloc( buf, comp_len * sizeof(char) ) ; + buf_size = comp_len ; + } + memcpy( buf, p, comp_len ) ; + buf[comp_len - 1] = '\0' ; + + if ( parseXrLikeKeyString( buf, &ksym, &mods, &chk_mods ) ) { + new_key_listelem = (cKeyList *)XtMalloc( sizeof(cKeyList) ) ; + new_key_listelem->ksym = ksym ; + new_key_listelem->mods = mods ; + new_key_listelem->chk_mods = chk_mods ; + new_key_listelem->next = NULL ; + if ( prev_key_listelem == NULL ) { + wgThis->ximServer.conv_end_key_list = new_key_listelem ; + } else { + prev_key_listelem->next = new_key_listelem ; + } + prev_key_listelem = new_key_listelem ; + } + p += comp_len ; + } + if ( buf != NULL ) XtFree( (char *)buf ) ; + } + return ; } --- skkinput-2.06.3/XIMServerP.h._orig_ 2002-10-26 12:11:13.000000000 +0900 +++ skkinput-2.06.3/XIMServerP.h 2004-08-22 00:20:44.000000000 +0900 @@ -26,11 +26,20 @@ #include "varbuffer.h" #include +typedef struct _cKeyList { + KeySym ksym ; + long mods ; + long chk_mods ; + struct _cKeyList *next ; +} cKeyList ; + typedef struct { XtPointer m_pLispMachine ; XtCallbackList m_lstCbkDestroy ; String m_strLocales ; String m_strConvStartKeys ; + String m_strConvEndKeys ; + cKeyList *conv_end_key_list ; Atom m_atServer ; Atom m_atCompoundText ; --- skkinput-2.06.3/Ximp.c._orig_ 2002-10-26 12:11:13.000000000 +0900 +++ skkinput-2.06.3/Ximp.c 2004-08-22 20:19:01.000000000 +0900 @@ -187,10 +187,13 @@ /* parseStr.c */ extern int parseXrLikeKeyStrings ( unsigned char *string, struct XrLikeKey *keytbl ) ; +extern int parseXrLikeKeyString +(unsigned char*, KeySym *, long *, long *) ; /* * グローバル変数の宣言。 */ +XimpPart *Ximp_ptr=NULL ; #define offset(field) XtOffsetOf(XimpRec, ximp.field) #define goffset(field) XtOffsetOf(WidgetRec, core.field) @@ -220,6 +223,10 @@ { XtNconversionStartKey, XtCConversionStartKey, XtRString, sizeof( String ), offset( conversionStartKey ), XtRImmediate, ( XtPointer )"Shiftspace,CntrlKanji,CntrlHenkan_Mode" }, + /* 変換を終了するキーを登録する。*/ + { XtNconversionEndKey, XtCConversionEndKey, XtRString, + sizeof( String ), offset( conversionEndKey ), XtRImmediate, + ( XtPointer )"Shiftspace,CntrlKanji,CntrlHenkan_Mode" }, } ; #undef offset #undef goffset @@ -463,6 +470,47 @@ /* 一時的に利用していたメモリを解放する。*/ free( startkeys ) ; free( keydata ) ; + + w->ximp.conv_end_key_list = NULL ; + Ximp_ptr=&(w->ximp) ; + + if ( w->ximp.conversionEndKey != NULL ) { + char *p = w->ximp.conversionEndKey ; + char *buf = NULL ; + size_t buf_size = 0 ; + cKeyList *prev_key_listelem = NULL, *new_key_listelem ; + + while ( *p != '\0' ) { + KeySym ksym ; + long mods, chk_mods ; + unsigned int comp_len ; + + comp_len = strcspn( p, ",\n" ) + 1 ; + if ( buf_size < comp_len ) { + buf = XtRealloc( buf, comp_len * sizeof(char) ) ; + buf_size = comp_len ; + } + memcpy( buf, p, comp_len ) ; + buf[comp_len - 1] = '\0' ; + + if ( parseXrLikeKeyString( buf, &ksym, &mods, &chk_mods ) ) { + new_key_listelem = (cKeyList *)XtMalloc( sizeof(cKeyList) ) ; + new_key_listelem->ksym = ksym ; + new_key_listelem->mods = mods ; + new_key_listelem->chk_mods = chk_mods ; + new_key_listelem->next = NULL ; + if ( prev_key_listelem == NULL ) { + w->ximp.conv_end_key_list = new_key_listelem ; + } else { + prev_key_listelem->next = new_key_listelem ; + } + prev_key_listelem = new_key_listelem ; + } + p += comp_len ; + } + if ( buf != NULL ) XtFree( (char *)buf ) ; + } + return True ; } @@ -578,6 +626,16 @@ XimpWidget w = ( XimpWidget )gw ; struct XimpClient *node, *nextNode ; + if ( w->ximp.conv_end_key_list != NULL ) { + cKeyList *listelem = w->ximp.conv_end_key_list ; + while ( listelem != NULL) { + cKeyList *next_elem = listelem->next ; + XtFree( (char*)listelem ) ; + listelem = next_elem ; + } + } + Ximp_ptr=NULL; + node = w->ximp.client_list ; while( node != NULL ){ nextNode = node->next ; --- skkinput-2.06.3/XimpP.h._orig_ 2002-06-29 13:48:44.000000000 +0900 +++ skkinput-2.06.3/XimpP.h 2004-08-22 00:33:45.000000000 +0900 @@ -23,6 +23,7 @@ #include "Ximp.h" #include "attrs.h" +#include "XIMServerP.h" #include enum { @@ -41,6 +42,8 @@ String localename ; String servername ; String conversionStartKey ; /* 変換開始の引き金となるキー。*/ + String conversionEndKey ; /* 変換終了となるキー。*/ + cKeyList *conv_end_key_list ; unsigned long icid, property_id ; Boolean ximp_defaultServer ; --- skkinput-2.06.3/cstyle.c._orig_ 2002-06-29 13:48:46.000000000 +0900 +++ skkinput-2.06.3/cstyle.c 2004-08-22 15:43:42.000000000 +0900 @@ -35,6 +35,8 @@ #include "skkkey.h" #include "skkel.h" #include "MyError.h" +#include "XIMServerP.h" +#include "XimpP.h" /* * プロトタイプ宣言。 @@ -146,6 +148,24 @@ inpstr[ 0 ] = '\0' ; /* 文字列を受信。*/ XLookupString( xkev, inpstr, STRBUFSIZE, &key, NULL ) ; + { + extern XIMServerPart *XimServer_ptr ; + extern XimpPart *Ximp_ptr ; + cKeyList *conv__end_key_list=NULL ; + if ( XimServer_ptr ) conv__end_key_list=XimServer_ptr->conv_end_key_list ; + else if ( Ximp_ptr ) conv__end_key_list=Ximp_ptr->conv_end_key_list ; + if ( conv__end_key_list ) { + cKeyList *listelem ; + long msk=(ShiftMask | ControlMask | Mod1Mask) ; + for ( listelem=conv__end_key_list; listelem!=NULL; listelem=listelem->next ) { + if (key == listelem->ksym && + (xkev->state & msk) == (listelem->mods & msk) ) { + chara = CHARA_SHIFT_SPACE ; + goto quit ; + } + } + } + } if( ( chara = inpstr[ 0 ] ) == '\0' ){ switch( key ){ case XK_space : @@ -174,12 +194,16 @@ } break ; } - } else { + } +#if 0 + else { if( chara == 0x20 && ( xkev->state & ShiftMask ) && !( xkev->state & ( ~ShiftMask ) ) ){ chara = CHARA_SHIFT_SPACE ; } } +#endif + quit: return chara ; } --- skkinput-2.06.3/parseStr.c._orig_ 2002-06-29 13:48:46.000000000 +0900 +++ skkinput-2.06.3/parseStr.c 2004-08-22 15:41:13.000000000 +0900 @@ -23,6 +23,7 @@ #include #include #include +#include #include "commondef.h" #include "skkkey.h" @@ -90,15 +91,32 @@ * ても意味はない。 */ int parseXrLikeKeyString -( unsigned char *string, KeySym *r_keysym, +( unsigned char *arg_string, KeySym *r_keysym, long *r_modifiers, long *r_checkModifiers ) { static struct keyToMask key_masks[] = { { "shift", ShiftMask }, { "lock", LockMask }, { "cntrl", ControlMask }, { "mod1", Mod1Mask }, + { "ctrl", ControlMask }, { "alt", Mod1Mask }, + { "meta", Mod1Mask }, { NULL, 0L }, } ; struct keyToMask *kptr ; + unsigned char *p0,*p1,*string,*buffer=NULL ; + int result = False ; + int length = strlen( arg_string ) ; + + buffer = malloc( sizeof( unsigned char ) * ( length + 1 ) ) ; + if ( buffer == NULL ) goto quit ; + + for ( p0=arg_string,p1=buffer ; *p0!='\0' ; p0++ ) { + if ( *p0 != ' ' && *p0 != '\t' ) { + *p1=*p0 ; + p1++ ; + } + } + *p1='\0' ; + string=buffer; /* いきなりのキー指定でなく、何らかの mask が存在する場合。*/ if( *string != '<' ){ @@ -110,21 +128,27 @@ } /* もし、mask が間違っていたら。*/ if( kptr->string == NULL ) - return False ; + goto quit ; /* ここで "<" が来るまで読み飛ばす。*/ while( *string != '<' ){ if( *string == '\0' || ( *string != ' ' && *string != '\t' ) ) - return False ; + goto quit ; string ++ ; } } + else{ + *r_modifiers = *r_checkModifiers = 0 ; + } /* ここは と書かれることになっているけど、どうしようかな。きち んと見るべきかな。*/ if( !isPrefixString( string, "" ) ) - return False ; + goto quit ; /* 残りの文字列は keysym だと思う。*/ *r_keysym = XStringToKeysym( string + 5 ) ; - return True ; + result=True ; + quit: + if ( buffer ) free(buffer); + return result ; } int parseXrLikeKeyStrings @@ -148,6 +172,7 @@ goto exit_loop ; break ; case ',' : + case '\n' : /* 開始点と終了位置が同じだったら、空文字列なので無視する。*/ if( tmppoint == ptr ){ tmppoint ++ ; --- skkinput-2.06.3/resrcs.h._orig_ 2002-10-26 12:11:13.000000000 +0900 +++ skkinput-2.06.3/resrcs.h 2004-08-21 20:33:45.000000000 +0900 @@ -96,6 +96,9 @@ #define XtNconversionStartKey "conversionStartKey" #define XtCConversionStartKey "ConversionStartKey" +#define XtNconversionEndKey "conversionEndKey" +#define XtCConversionEndKey "ConversionEndKey" + #define XtNsupportedLocales "supportedLocales" #define XtCSupportedLocales "SupportedLocales" --- skkinput-2.06.3/skkel.c._orig_ 2002-08-13 01:19:57.000000000 +0900 +++ skkinput-2.06.3/skkel.c 2004-08-23 16:07:18.000000000 +0900 @@ -4604,6 +4604,9 @@ break ; /* Keyboard-Quit が入った場合の処理。*/ case 0x07 : + case 0x08 : + case 0x1b : + case 0x7f : j_keyboard_quit( gw, sbuffer, node ) ; MYCHAR_SET_END_OF_STRING( node->mtextbuffer[ 0 ] ) ; break ; @@ -4754,6 +4757,9 @@ break ; /* C-g による Quit */ case 0x07 : + case 0x08 : + case 0x1b : + case 0x7f : j_keyboard_quit( gw, buffer, node ) ; goto exit_menu ; /* 画面を表示しなおす。*/ @@ -4834,6 +4840,9 @@ break ; /* j_keyboard quit の場合の処理…。*/ case 0x07 : + case 0x08 : + case 0x1b : + case 0x7f : j_keyboard_quit( gw, sbuffer, node ) ; goto exit_menu_1 ; /* 画面を再表示する。*/