fix map-function in keymap% to handle non-ASCII characters in the mapping

svn: r5952
This commit is contained in:
Matthew Flatt 2007-04-16 09:18:34 +00:00
parent 0b8a403f6f
commit fdee9e7af9
6 changed files with 51 additions and 23 deletions

View File

@ -446,11 +446,23 @@ wxKeycode *wxKeymap::MapFunction(long code, int shift, int ctrl,
return newkey; return newkey;
} }
static long GetCode(unsigned char *keyseq, int *_kp, int *fullset) static int wx_c_strcmp(wxchar *keyseq, char *s)
{
int i = 0;
while (keyseq[i] && s[i]) {
if ((int)keyseq[i] != (int)s[i])
return 1;
i++;
}
return keyseq[i] || s[i];
}
static long GetCode(wxchar *keyseq, int *_kp, int *fullset)
{ {
long i, code, kp; long i, code, kp;
#define MAX_BUF 256 #define MAX_BUF 256
unsigned char buffer[MAX_BUF], first; wxchar buffer[MAX_BUF], first;
kp = *_kp; kp = *_kp;
@ -468,11 +480,11 @@ static long GetCode(unsigned char *keyseq, int *_kp, int *fullset)
if (buffer[0] < 128) if (buffer[0] < 128)
buffer[0] = tolower(buffer[0]); buffer[0] = tolower(buffer[0]);
for (i = 0; keylist[i].str; i++) { for (i = 0; keylist[i].str; i++) {
if (!strcmp((char *)buffer, keylist[i].str)) { if (!wx_c_strcmp(buffer, keylist[i].str)) {
code = keylist[i].code; code = keylist[i].code;
if (!strcmp((char *)buffer, "leftbuttonseq") if (!wx_c_strcmp(buffer, "leftbuttonseq")
|| !strcmp((char *)buffer, "middlebuttonseq") || !wx_c_strcmp(buffer, "middlebuttonseq")
|| !strcmp((char *)buffer, "rightbuttonseq")) || !wx_c_strcmp(buffer, "rightbuttonseq"))
*fullset = 1; *fullset = 1;
break; break;
} }
@ -485,9 +497,9 @@ static long GetCode(unsigned char *keyseq, int *_kp, int *fullset)
return code; return code;
} }
void wxKeymap::MapFunction(char *keys, char *fname) void wxKeymap::MapFunction(wxchar *keys, char *fname)
{ {
char *keyseq = keys; wxchar *keyseq = keys;
int num_keys, num_new_keys, kp, start_keys; int num_keys, num_new_keys, kp, start_keys;
wxKeycode **key, **new_key; wxKeycode **key, **new_key;
int shift, ctrl, alt, meta, mod, checkOther; int shift, ctrl, alt, meta, mod, checkOther;
@ -522,11 +534,11 @@ void wxKeymap::MapFunction(char *keys, char *fname)
kp++; kp++;
goto do_mod; goto do_mod;
} }
} else if (isspace(keyseq[kp])) { } else if (keyseq[kp] < 128 && isspace(keyseq[kp])) {
kp++; kp++;
} else if (keyseq[kp + 1] == ':') { } else if (keyseq[kp + 1] == ':') {
do_mod: do_mod:
unsigned char mch; wxchar mch;
mch = keyseq[kp]; mch = keyseq[kp];
if (mch < 128) if (mch < 128)
mch = tolower(mch); mch = tolower(mch);
@ -572,7 +584,7 @@ void wxKeymap::MapFunction(char *keys, char *fname)
kp += 2; kp += 2;
} else { } else {
do_char: do_char:
code = GetCode((unsigned char *)keyseq, &kp, &fullset); code = GetCode(keyseq, &kp, &fullset);
if (!code) { if (!code) {
errstr = "bad keyname"; errstr = "bad keyname";
goto key_error; goto key_error;
@ -625,9 +637,24 @@ void wxKeymap::MapFunction(char *keys, char *fname)
return; return;
key_error: key_error:
sprintf(buffer, "keymap: %s in keystring: \"%.100s\", part %d", {
errstr, keys, part); long l;
wxsKeymapError(buffer); char *r = NULL;
wxme_utf8_encode(keys, wxstrlen(keys), &r, &l);
sprintf(buffer, "keymap: %s in keystring: \"%.100s\", part %d",
errstr, r, part);
wxsKeymapError(buffer);
}
}
void wxKeymap::MapFunction(char *keys, char *fname)
{
wxchar *us;
long ulen;
wxme_utf8_decode(keys, strlen(keys), &us, &ulen);
MapFunction(us, fname);
} }
int wxKeymap::HandleEvent(long code, long other_code, long alt_code, long other_alt_code, int wxKeymap::HandleEvent(long code, long other_code, long alt_code, long other_alt_code,

View File

@ -5,6 +5,11 @@
#include "wx_stdev.h" #include "wx_stdev.h"
#include "wx_hash.h" #include "wx_hash.h"
typedef unsigned int wxchar;
extern int wxstrlen(wxchar *s);
void wxme_utf8_decode(char *str, long len, wxchar **us, long *ulen);
void wxme_utf8_encode(wxchar *us, long ulen, char **s, long *len);
#define UNKNOWN_OBJ void* #define UNKNOWN_OBJ void*
typedef Bool (*wxKMFunction)(UNKNOWN_OBJ media, wxEvent *event, void *data); typedef Bool (*wxKMFunction)(UNKNOWN_OBJ media, wxEvent *event, void *data);
@ -108,6 +113,7 @@ class wxKeymap : public wxObject
int alt, int meta, int check_alt, int alt, int meta, int check_alt,
char *fname, class wxKeycode *prevkey=NULL, char *fname, class wxKeycode *prevkey=NULL,
int keytype = wxKEY_FINAL); int keytype = wxKEY_FINAL);
void MapFunction(wxchar *keyname, char *fname);
void MapFunction(char *keyname, char *fname); void MapFunction(char *keyname, char *fname);
void AddFunction(char *name, wxKMFunction func, void *data); void AddFunction(char *name, wxKMFunction func, void *data);

View File

@ -18,13 +18,8 @@ class wxMediaEdit;
class wxClickback; class wxClickback;
class wxClipboard; class wxClipboard;
typedef unsigned int wxchar;
extern int wxstrlen(wxchar *s);
extern wxchar wx_empty_wxstr[1]; extern wxchar wx_empty_wxstr[1];
void wxme_utf8_decode(char *str, long len, wxchar **us, long *ulen);
void wxme_utf8_encode(wxchar *us, long ulen, char **s, long *len);
#define wxFOCUS_IMMEDIATE 0 #define wxFOCUS_IMMEDIATE 0
#define wxFOCUS_DISPLAY 1 #define wxFOCUS_DISPLAY 1
#define wxFOCUS_GLOBAL 2 #define wxFOCUS_GLOBAL 2

View File

@ -4870,7 +4870,7 @@ static Scheme_Object *os_wxKeymapMapFunction(int n, Scheme_Object *p[])
WXS_USE_ARGUMENT(n) WXS_USE_ARGUMENT(p) WXS_USE_ARGUMENT(n) WXS_USE_ARGUMENT(p)
REMEMBER_VAR_STACK(); REMEMBER_VAR_STACK();
objscheme_check_valid(os_wxKeymap_class, "map-function in keymap%", n, p); objscheme_check_valid(os_wxKeymap_class, "map-function in keymap%", n, p);
string x0 INIT_NULLED_OUT; mzstring x0 INIT_NULLED_OUT;
string x1 INIT_NULLED_OUT; string x1 INIT_NULLED_OUT;
SETUP_VAR_STACK_REMEMBERED(3); SETUP_VAR_STACK_REMEMBERED(3);
@ -4879,7 +4879,7 @@ static Scheme_Object *os_wxKeymapMapFunction(int n, Scheme_Object *p[])
VAR_STACK_PUSH(2, x1); VAR_STACK_PUSH(2, x1);
x0 = (string)WITH_VAR_STACK(objscheme_unbundle_string(p[POFFSET+0], "map-function in keymap%")); x0 = (mzstring)WITH_VAR_STACK(objscheme_unbundle_mzstring(p[POFFSET+0], "map-function in keymap%"));
x1 = (string)WITH_VAR_STACK(objscheme_unbundle_string(p[POFFSET+1], "map-function in keymap%")); x1 = (string)WITH_VAR_STACK(objscheme_unbundle_string(p[POFFSET+1], "map-function in keymap%"));

View File

@ -226,7 +226,7 @@ static void BreakSequenceCallbackToScheme(KeymapCallbackToSchemeRec *data);
@ v "handle-key-event" : bool HandleKeyEvent(UNKNOWN_OBJ/bAnythingFromVoid/ubAnythingToVoid/cAnything///push,wxKeyEvent!); @ v "handle-key-event" : bool HandleKeyEvent(UNKNOWN_OBJ/bAnythingFromVoid/ubAnythingToVoid/cAnything///push,wxKeyEvent!);
@ v "handle-mouse-event" : bool HandleMouseEvent(UNKNOWN_OBJ/bAnythingFromVoid/ubAnythingToVoid/cAnything///push,wxMouseEvent!); @ v "handle-mouse-event" : bool HandleMouseEvent(UNKNOWN_OBJ/bAnythingFromVoid/ubAnythingToVoid/cAnything///push,wxMouseEvent!);
@ "break-sequence" : void BreakSequence(); @ "break-sequence" : void BreakSequence();
@ "map-function" : void MapFunction(string,string); @ "map-function" : void MapFunction(mzstring,string);
@ "add-function" : void AddFunction(string,wxKMFunction/bCallback/ubCallbackKM/cCallback//spCallbackKM/nopush,-unknown#void*=NULL); : : ubSetup / ubSetData[1.2] @ "add-function" : void AddFunction(string,wxKMFunction/bCallback/ubCallbackKM/cCallback//spCallbackKM/nopush,-unknown#void*=NULL); : : ubSetup / ubSetData[1.2]
@ "set-grab-key-function" : void SetGrabKeyFunction(wxGrabKeyFunction/bCallback/ubCallbackGrabKey/cCallback//spCallbackGrabKey/nopush,-unknown#void*=NULL); : : ubSetup / ubSetData[0.1] @ "set-grab-key-function" : void SetGrabKeyFunction(wxGrabKeyFunction/bCallback/ubCallbackGrabKey/cCallback//spCallbackGrabKey/nopush,-unknown#void*=NULL); : : ubSetup / ubSetData[0.1]
@ "remove-grab-key-function" : void RemoveGrabKeyFunction() @ "remove-grab-key-function" : void RemoveGrabKeyFunction()

View File

@ -904,7 +904,7 @@ static Scheme_Object *wxSchemeGetFontFromUser(int argc, Scheme_Object **argv)
lf->lfPitchAndFamily |= FF_DECORATIVE; lf->lfPitchAndFamily |= FF_DECORATIVE;
break; break;
case wxMODERN: case wxMODERN:
lf->lfPitchAndFamily = FIXED_PITCH | FF_MODERN; Lf->lfPitchAndFamily = FIXED_PITCH | FF_MODERN;
break; break;
case wxROMAN: case wxROMAN:
lf->lfPitchAndFamily |= FF_ROMAN; lf->lfPitchAndFamily |= FF_ROMAN;