Mercurial > kinput2.yaz
changeset 17:688ac5040e7d
imported patch 20_kinput2-v3.1-canna-keybind2.patch
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Mon, 08 Mar 2010 20:38:17 +0900 |
parents | 598fcbe482b5 |
children | 07a41a882b14 |
files | include/Canna.h include/CannaP.h lib/Canna.c |
diffstat | 3 files changed, 87 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/include/Canna.h Mon Mar 08 20:38:17 2010 +0900 +++ b/include/Canna.h Mon Mar 08 20:38:17 2010 +0900 @@ -63,6 +63,10 @@ #define XtCCannafile "Cannafile" #define XtNsendReturnByString "sendReturnByString" #define XtCSendReturnByString "SendReturnByString" +#define XtNkeyBackslashAlwaysShifted "keyBackslashAlwaysShifted" +#define XtCKeyBackslashAlwaysShifted "KeyBackslashAlwaysShifted" +#define XtNconversionEndKeys "conversionEndKeys" +#define XtCConversionEndKeys "ConversionEndKeys" typedef struct _CannaClassRec *CannaObjectClass; typedef struct _CannaRec *CannaObject;
--- a/include/CannaP.h Mon Mar 08 20:38:17 2010 +0900 +++ b/include/CannaP.h Mon Mar 08 20:38:17 2010 +0900 @@ -82,12 +82,22 @@ #define CANNA_GLINE_End 2 #define CANNA_GLINE_Change 3 +typedef struct _cKeyList { + KeySym ksym; + long mods; + long chk_mods; + struct _cKeyList *next; +} cKeyList; + typedef struct { /* resources */ String cannahost; String cannafile; Boolean sendReturnByString; + Boolean keyBackslashAlwaysShifted; + String conversion_end_keys; /* private data */ + cKeyList *conv_end_key_list; iBuf *ibuf; Boolean textchanged; /* $BJQ49%F%-%9%H$,JQ$o$C$?$+(B */ Boolean selectionending;/* $BA*Br%b!<%I$r=*N;$7$h$&$H$7$F$$$k$+(B */
--- a/lib/Canna.c Mon Mar 08 20:38:17 2010 +0900 +++ b/lib/Canna.c Mon Mar 08 20:38:17 2010 +0900 @@ -59,6 +59,7 @@ #include <X11/Xfuncs.h> #endif #include "CannaP.h" +#include "ParseKey.h" #include "DebugPrint.h" /* Canna 3.7$B0J9_$O$3$N$h$&$KDj5A$9$k(B */ @@ -79,6 +80,11 @@ { XtNsendReturnByString, XtCSendReturnByString, XtRBoolean, sizeof(Boolean), offset(sendReturnByString), XtRBoolean, False }, + { XtNkeyBackslashAlwaysShifted, XtCKeyBackslashAlwaysShifted, + XtRBoolean, sizeof(Boolean), + offset(keyBackslashAlwaysShifted), XtRBoolean, False }, + { XtNconversionEndKeys, XtCConversionEndKeys, XtRString, sizeof(String), + offset(conversion_end_keys), XtRImmediate, NULL } #undef offset }; @@ -211,16 +217,23 @@ static int XKanaLookup(event_struct, buffer_return, bytes_buffer, - keysym, status_return) + keysym, status_return, bs_flag) XKeyEvent *event_struct; char *buffer_return; int bytes_buffer; KeySym *keysym; XComposeStatus *status_return; +int bs_flag; { int res; res = XLookupString(event_struct, buffer_return, bytes_buffer, keysym, status_return); + if ( res == 1 && bs_flag ) { + /* $B$+$JF~NO$G!V!<!W$,F~NO$G$-$k$h$&$K(B */ + if ( *keysym == XK_backslash && event_struct->keycode == 123 ) { + buffer_return[0] = '_'; + } + } if (!res && XK_overline <= *keysym && *keysym <= XK_semivoicedsound) { buffer_return[0] = (unsigned long)(*keysym) & 0xff; res = 1; @@ -248,11 +261,22 @@ /* $B<h$j$"$($:J8;z$KD>$7$F$7$^$&(B */ kanabuf[0] = '\0'; - nbytes = XKanaLookup(event, kanabuf, 20, &ks, &compose_status); + nbytes = XKanaLookup(event, kanabuf, 20, &ks, &compose_status, + obj->canna.keyBackslashAlwaysShifted); buf[0] = (wchar)kanabuf[0]; /* $B$-$?$J$$(B */ - if (ks == XK_space && (event->xkey.state & ShiftMask)) { + if ( obj->canna.conv_end_key_list != NULL ) { + cKeyList *listelem; + for ( listelem=obj->canna.conv_end_key_list; listelem!=NULL; listelem=listelem->next ) { + if (ks == listelem->ksym && event->xkey.state == listelem->mods) { + void convend(); + + convend(obj); + return 0; + } + } + } else if (ks == XK_space && (event->xkey.state & ShiftMask)) { void convend(); convend(obj); @@ -621,6 +645,44 @@ obj->canna.candlistsize = 0; obj->canna.numcand = 0; obj->canna.lastTextLengthIsZero = False; + obj->canna.conv_end_key_list = NULL; + + if ( obj->canna.conversion_end_keys != NULL ) { + char *p = obj->canna.conversion_end_keys; + 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 ( ParseKeyEvent( 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 ) { + obj->canna.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 ); + } ibufInitialize(obj); @@ -717,6 +779,14 @@ int i; /* $B%P%C%U%!$N2rJ|(B */ + if ( obj->canna.conv_end_key_list != NULL ) { + cKeyList *listelem = obj->canna.conv_end_key_list; + while ( listelem != NULL) { + cKeyList *next_elem = listelem->next; + XtFree( (char*)listelem ); + listelem = next_elem; + } + } freeIBuf(obj->canna.ibuf);