diff --git a/src/mred/wxme/wx_keym.cxx b/src/mred/wxme/wx_keym.cxx index f9c78848b5..76ae9917e3 100644 --- a/src/mred/wxme/wx_keym.cxx +++ b/src/mred/wxme/wx_keym.cxx @@ -446,11 +446,23 @@ wxKeycode *wxKeymap::MapFunction(long code, int shift, int ctrl, 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; #define MAX_BUF 256 - unsigned char buffer[MAX_BUF], first; + wxchar buffer[MAX_BUF], first; kp = *_kp; @@ -468,11 +480,11 @@ static long GetCode(unsigned char *keyseq, int *_kp, int *fullset) if (buffer[0] < 128) buffer[0] = tolower(buffer[0]); 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; - if (!strcmp((char *)buffer, "leftbuttonseq") - || !strcmp((char *)buffer, "middlebuttonseq") - || !strcmp((char *)buffer, "rightbuttonseq")) + if (!wx_c_strcmp(buffer, "leftbuttonseq") + || !wx_c_strcmp(buffer, "middlebuttonseq") + || !wx_c_strcmp(buffer, "rightbuttonseq")) *fullset = 1; break; } @@ -485,9 +497,9 @@ static long GetCode(unsigned char *keyseq, int *_kp, int *fullset) 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; wxKeycode **key, **new_key; int shift, ctrl, alt, meta, mod, checkOther; @@ -522,11 +534,11 @@ void wxKeymap::MapFunction(char *keys, char *fname) kp++; goto do_mod; } - } else if (isspace(keyseq[kp])) { + } else if (keyseq[kp] < 128 && isspace(keyseq[kp])) { kp++; } else if (keyseq[kp + 1] == ':') { do_mod: - unsigned char mch; + wxchar mch; mch = keyseq[kp]; if (mch < 128) mch = tolower(mch); @@ -572,7 +584,7 @@ void wxKeymap::MapFunction(char *keys, char *fname) kp += 2; } else { do_char: - code = GetCode((unsigned char *)keyseq, &kp, &fullset); + code = GetCode(keyseq, &kp, &fullset); if (!code) { errstr = "bad keyname"; goto key_error; @@ -625,9 +637,24 @@ void wxKeymap::MapFunction(char *keys, char *fname) return; key_error: - sprintf(buffer, "keymap: %s in keystring: \"%.100s\", part %d", - errstr, keys, part); - wxsKeymapError(buffer); + { + long l; + 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, diff --git a/src/mred/wxme/wx_keym.h b/src/mred/wxme/wx_keym.h index 6b7734585f..5300993b88 100644 --- a/src/mred/wxme/wx_keym.h +++ b/src/mred/wxme/wx_keym.h @@ -5,6 +5,11 @@ #include "wx_stdev.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* 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, char *fname, class wxKeycode *prevkey=NULL, int keytype = wxKEY_FINAL); + void MapFunction(wxchar *keyname, char *fname); void MapFunction(char *keyname, char *fname); void AddFunction(char *name, wxKMFunction func, void *data); diff --git a/src/mred/wxme/wx_media.h b/src/mred/wxme/wx_media.h index 238e110cd9..48a249fef7 100644 --- a/src/mred/wxme/wx_media.h +++ b/src/mred/wxme/wx_media.h @@ -18,13 +18,8 @@ class wxMediaEdit; class wxClickback; class wxClipboard; -typedef unsigned int wxchar; -extern int wxstrlen(wxchar *s); 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_DISPLAY 1 #define wxFOCUS_GLOBAL 2 diff --git a/src/mred/wxs/wxs_madm.cxx b/src/mred/wxs/wxs_madm.cxx index 247091901b..93efc89a0b 100644 --- a/src/mred/wxs/wxs_madm.cxx +++ b/src/mred/wxs/wxs_madm.cxx @@ -4870,7 +4870,7 @@ static Scheme_Object *os_wxKeymapMapFunction(int n, Scheme_Object *p[]) WXS_USE_ARGUMENT(n) WXS_USE_ARGUMENT(p) REMEMBER_VAR_STACK(); 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; SETUP_VAR_STACK_REMEMBERED(3); @@ -4879,7 +4879,7 @@ static Scheme_Object *os_wxKeymapMapFunction(int n, Scheme_Object *p[]) 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%")); diff --git a/src/mred/wxs/wxs_madm.xc b/src/mred/wxs/wxs_madm.xc index c904cc0d21..ed92d361c0 100644 --- a/src/mred/wxs/wxs_madm.xc +++ b/src/mred/wxs/wxs_madm.xc @@ -226,7 +226,7 @@ static void BreakSequenceCallbackToScheme(KeymapCallbackToSchemeRec *data); @ 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!); @ "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] @ "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() diff --git a/src/mred/wxs/wxscheme.cxx b/src/mred/wxs/wxscheme.cxx index 4525a0bb40..0010c35993 100644 --- a/src/mred/wxs/wxscheme.cxx +++ b/src/mred/wxs/wxscheme.cxx @@ -904,7 +904,7 @@ static Scheme_Object *wxSchemeGetFontFromUser(int argc, Scheme_Object **argv) lf->lfPitchAndFamily |= FF_DECORATIVE; break; case wxMODERN: - lf->lfPitchAndFamily = FIXED_PITCH | FF_MODERN; + Lf->lfPitchAndFamily = FIXED_PITCH | FF_MODERN; break; case wxROMAN: lf->lfPitchAndFamily |= FF_ROMAN;