diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index f2b2c976..f1b615b2 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -61,15 +61,16 @@ pointer precision. #### Integer macros +`MAKEWPARAM`: this new macro makes a WPARAM value by using four bytes. +On the contrary, `FIRSTBYTE`, `SECONDBYTE`, `THIRDBYTE`, and `FOURTH` +macros get the four bytes from a `WPARAM` or a `Uint32` value. + `MAKEWORD16`: this new macro makes a 16-bit word by using two bytes. Meanwhile, `MAKEWORD` makes a 16-bit word on 32-bit platform, and a 32-bit word on 64-bit platform. -`LOBYTE_WORD16` and `HIBYTE_WORD16`: these two new macros get the low byte -and the high byte in a 16-bit word respectively. - Note that `MAKELONG` macro always makes a `DWORD` integer, which has pointer -precision. +precision. Meanwhile, `MAKELONG32` macro makes a `Uint32` integer. Note that `MakeRGB` and `MakeRGBA` macros always make `DWORD32` integers. In contract, `GetRValue`, `GetRValue`, `GetBValue`, `GetAValue` always @@ -115,16 +116,16 @@ to _IMPORTANT NOTE_ -For best portability, you should use `LOBYTE_WORD16` and `HIBYTE_WORD16` +For best portability, you should use `FIRSTBYTE` to `FOURTHBYTE` macros to get the bytes of a character when you extract the bytes from `WPARAM` parameter of a `MSG_CHAR` message: MSG_CHAR - WORD16 ch = (WORD16)wParam; - DWORD key_flags = (DWORD)lParam; - byte0 = LOBYTE_WORD16 (ch); - byte1 = HIBYTE_WORD16 (ch); - + unsigned char ch_buff [4]; + unsigned char ch_buff [0] = FIRSTBYTE(wParam); + unsigned char ch_buff [1] = SECONDBYTE(wParam); + unsigned char ch_buff [2] = THIRDBYTE(wParam); + unsigned char ch_buff [3] = FOURTHBYTE(wParam); ##### Window callback procedure diff --git a/include/common.h b/include/common.h index fcd06a9e..5f3e9a4a 100644 --- a/include/common.h +++ b/include/common.h @@ -436,11 +436,11 @@ typedef signed char SBYTE; #endif #if SIZEOF_PTR == 8 -# define NR_BITS_BYTE (16) +# define NR_BITS_BYTE (8) # define NR_BITS_WORD (32) # define NR_BITS_DWORD (64) -# define BITMASK_BYTE (0xFFFF) +# define BITMASK_BYTE (0xFF) # define BITMASK_WORD (0xFFFFFFFF) # define BITMASK_DWORD (0xFFFFFFFFFFFFFFFF) @@ -661,34 +661,64 @@ typedef UINT_PTR LPARAM; * \def MAKEWORD(low, high) * \brief Makes a word from \a low byte and \a high byte. * - * \sa MAKEWORD16 + * \sa LOBYTE, HIBYTE */ #define MAKEWORD(low, high) ((WORD)(((BYTE)(low)) | (((WORD)((BYTE)(high))) << NR_BITS_BYTE))) -/** - * \def LOBYTE_WORD16(w) - * \brief Returns the low byte of the 16-bit word \a w. - * - * \sa MAKEWORD16 - */ -#define LOBYTE_WORD16(w) ((BYTE)(w)) - -/** - * \def HIBYTE_WORD16(w) - * \brief Returns the high byte of the 16-bit word \a w. - * - * \sa MAKEWORD16 - */ -#define HIBYTE_WORD16(w) ((BYTE)(((WORD16)(w) >> 8) & 0xFF)) - /** * \def MAKEWORD16(low, high) * \brief Makes a 16-bit word from \a low byte and \a high byte. * - * \sa MAKEWORD + * \sa LOBYTE, HIBYTE */ #define MAKEWORD16(low, high) ((WORD16)(((BYTE)(low)) | (((WORD16)((BYTE)(high))) << 8))) +/** + * \def MAKEWPARAM(first, second, third, fourth) + * \brief Makes a WPARAM value with four bytes. + * + * \sa MAKEWORD, FIRSTBYTE, SECONDBYTE, THIRDBYTE, FOURTHBYTE + */ +#define MAKEWPARAM(first, second, third, fourth) \ + ((WPARAM)( \ + ((BYTE)(first)) | \ + (((WPARAM)((BYTE)(second))) << 8) | \ + (((WPARAM)((BYTE)(third))) << 16) | \ + (((WPARAM)((BYTE)(fourth))) << 24) \ + )) + +/** + * \def FIRSTBYTE(w) + * \brief Returns the first byte of the WPARAM \a w. + * + * \sa MAKEWPARAM + */ +#define FIRSTBYTE(w) ((BYTE)(w)) + +/** + * \def SECONDBYTE(w) + * \brief Returns the second byte of the WPARAM \a w. + * + * \sa MAKEWPARAM + */ +#define SECONDBYTE(w) ((BYTE)(((DWORD32)(w)) >> 8)) + +/** + * \def THIRDBYTE(w) + * \brief Returns the third byte of the WPARAM \a w. + * + * \sa MAKEWPARAM + */ +#define THIRDBYTE(w) ((BYTE)(((DWORD32)(w)) >> 16)) + +/** + * \def FOURTHBYTE(w) + * \brief Returns the fourth byte of the WPARAM \a w. + * + * \sa MAKEWPARAM + */ +#define FOURTHBYTE(w) ((BYTE)(((DWORD32)(w)) >> 24)) + /** * \def LOWORD(l) * \brief Returns the low word of the double word \a l diff --git a/include/window.h b/include/window.h index 71842bcd..c1c63cdd 100644 --- a/include/window.h +++ b/include/window.h @@ -420,15 +420,20 @@ extern "C" { * * \code * MSG_CHAR - * WORD16 ch = (WORD16)wParam; + * unsigned char ch_buff [4]; + * unsigned char ch_buff [0] = FIRSTBYTE(wParam); + * unsigned char ch_buff [1] = SECONDBYTE(wParam); + * unsigned char ch_buff [2] = THIRDBYTE(wParam); + * unsigned char ch_buff [3] = FOURTHBYTE(wParam); * DWORD key_flags = (DWORD)lParam; * \endcode * - * \param ch The EUC code of the pressed key. + * \param ch_buff The buffer to store the bytes of the character. * \param key_flags The shift key status when this message occurred. * - * \note Please use \a LOBYTE_WORD16 and \a HIBYTE_WORD16 to get the bytes - * if the character is a two-byte character. + * \note Please use \a FIRSTBYTE ~ \a FOURTHBYTE to get the bytes + * if the character is a multi-byte character. Use MSG_UTF8CHAR + * to handle the characters encoded in UTF-8. * * \sa MSG_SYSCHAR, TranslateMessage, key_defs */ @@ -560,7 +565,31 @@ extern "C" { * * \sa MSG_SYSCHAR, TranslateMessage, key_defs */ -#define MSG_KEYSYM 0x0018 +#define MSG_KEYSYM 0x0018 + +/** + * \def MSG_UTF8CHAR + * \brief A character translated from MSG_KEYDOWN message. + * + * This message generally sent by a IME window to the current active window. + * The chararcter will be encoded in UTF-8. + * + * \code + * MSG_UTF8CHAR + * unsigned char ch_utf8 [6]; + * unsigned char ch_utf8 [0] = FIRSTBYTE(wParam); + * unsigned char ch_utf8 [1] = SECONDBYTE(wParam); + * unsigned char ch_utf8 [2] = THIRDBYTE(wParam); + * unsigned char ch_utf8 [3] = FOURTHBYTE(wParam); + * unsigned char ch_utf8 [4] = FIRSTBYTE(lParam); + * unsigned char ch_utf8 [5] = SECONDBYTE(lParam); + * \endcode + * + * \param ch_utf8 The buffer to save the character in UTF-8. + * + * \sa MSG_CHAR, key_defs + */ +#define MSG_UTF8CHAR 0x0019 /** * \def DEF_LPRESS_TIME diff --git a/src/control/bidiedit.c b/src/control/bidiedit.c index 64fda4ec..b2046475 100644 --- a/src/control/bidiedit.c +++ b/src/control/bidiedit.c @@ -2463,30 +2463,34 @@ SLEditCtrlProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) case MSG_CHAR: { - unsigned char charBuffer [3]; + unsigned char charBuffer [4]; int chars; _MG_PRINTF("get char-----------------char----%p\n", (PVOID)wParam); - if (wParam == 127) // BS - wParam = '\b'; - if (dwStyle & ES_READONLY) return 0; - - charBuffer [0] = LOBYTE_WORD16 (wParam); - charBuffer [1] = HIBYTE_WORD16 (wParam); - charBuffer [2] = (0x00ff0000 & wParam) >> 16; - if (charBuffer [2]) { + charBuffer [0] = FIRSTBYTE (wParam); + charBuffer [1] = SECONDBYTE (wParam); + charBuffer [2] = THIRDBYTE (wParam); + charBuffer [3] = FOURTHBYTE (wParam); + + if (charBuffer [3]) { + chars = 4; + } + else if (charBuffer [2]) { chars = 3; } - else if (HIBYTE_WORD16 (wParam)) { + else if (charBuffer [1]) { chars = 2; } else { chars = 1; + if (charBuffer [0] == 127) // BS + charBuffer [0] = '\b'; + if (dwStyle & ES_UPPERCASE) { charBuffer [0] = toupper (charBuffer[0]); } diff --git a/src/control/button.c b/src/control/button.c index 65744456..6ac04144 100644 --- a/src/control/button.c +++ b/src/control/button.c @@ -816,12 +816,12 @@ static LRESULT ButtonCtrlProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPara break; case MSG_CHAR: - if (HIBYTE_WORD16 (wParam)==0 && BUTTON_IS_CHECKBTN (pctrl)) { + if (HIBYTE (wParam)==0 && BUTTON_IS_CHECKBTN (pctrl)) { int old_check = BUTTON_GET_CHECK(pctrl); - if (LOBYTE_WORD16(wParam) == '+' || LOBYTE_WORD16(wParam) == '=') + if (LOBYTE(wParam) == '+' || LOBYTE(wParam) == '=') BUTTON_SET_CHECK(pctrl, BST_CHECKED); - else if (LOBYTE_WORD16(wParam) == '-') + else if (LOBYTE(wParam) == '-') BUTTON_SET_CHECK(pctrl, BST_UNCHECKED); if (old_check != BUTTON_GET_CHECK(pctrl)) diff --git a/src/control/edit.c b/src/control/edit.c index 00487a75..058f3fb9 100644 --- a/src/control/edit.c +++ b/src/control/edit.c @@ -2070,30 +2070,38 @@ SLEditCtrlProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) return sleKeyDown (hWnd, wParam, lParam); } + case MSG_UTF8CHAR: + _ERR_PRINTF ("CONTROL>EDIT: MSG_UTF8CHAR is not implemented.\n"); + break; + case MSG_CHAR: { - unsigned char charBuffer [3]; + unsigned char charBuffer [4]; int chars; - if (wParam == 127) // BS - wParam = '\b'; - if (dwStyle & ES_READONLY) return 0; - charBuffer [0] = LOBYTE_WORD16 (wParam); - charBuffer [1] = HIBYTE_WORD16 (wParam); - charBuffer [2] = (0x00ff0000 & wParam) >> 16; + charBuffer [0] = FIRSTBYTE (wParam); + charBuffer [1] = SECONDBYTE (wParam); + charBuffer [2] = THIRDBYTE (wParam); + charBuffer [3] = FOURTHBYTE (wParam); - if (charBuffer [2]) { + if (charBuffer [3]) { + chars = 4; + } + else if (charBuffer [2]) { chars = 3; } - else if (HIBYTE_WORD16 (wParam)) { + else if (charBuffer [1]) { chars = 2; } else { chars = 1; + if (charBuffer [0] == 127) // BS + charBuffer [0] = '\b'; + if (dwStyle & ES_UPPERCASE) { charBuffer [0] = toupper (charBuffer[0]); } diff --git a/src/control/listbox.c b/src/control/listbox.c index da807646..e8f44d73 100644 --- a/src/control/listbox.c +++ b/src/control/listbox.c @@ -1885,10 +1885,10 @@ static LRESULT ListboxCtrlProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM l int newTop; PLISTBOXITEM plbi; - if (HIBYTE_WORD16 (wParam)) + if (HIBYTE (wParam)) break; - head [0] = LOBYTE_WORD16 (wParam); + head [0] = LOBYTE (wParam); head [1] = '\0'; pData = (PLISTBOXDATA)pCtrl->dwAddData2; diff --git a/src/control/textedit.c b/src/control/textedit.c index 2a00cc4d..951c970b 100644 --- a/src/control/textedit.c +++ b/src/control/textedit.c @@ -1990,7 +1990,7 @@ static void teSetCaretPosOnChar (HWND hWnd, PTEDATA ptedata, int old_caret_pos) static void teOnChar (HWND hWnd, PTEDATA ptedata, WPARAM wParam) { int chlen; - unsigned char ch[3]; + unsigned char ch[4]; TextNode *node; TextMark *mark; TextDoc *txtdoc; @@ -2004,11 +2004,15 @@ static void teOnChar (HWND hWnd, PTEDATA ptedata, WPARAM wParam) return; } - ch [0] = LOBYTE_WORD16 (wParam); - ch [1] = HIBYTE_WORD16 (wParam); - ch [2] = (0x0ff0000 & wParam) >> 16; + ch [0] = FIRSTBYTE (wParam); + ch [1] = SECONDBYTE (wParam); + ch [2] = THIRDBYTE (wParam); + ch [3] = FOURTHBYTE (wParam); - if (ch[2]) { + if (ch[3]) { + chlen = 4; + } + else if (ch[2]) { chlen = 3; } else if (ch[1]) { @@ -3214,6 +3218,10 @@ static LRESULT TextEditCtrlProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM break; } + case MSG_UTF8CHAR: + _ERR_PRINTF ("CONTROL>EDIT: MSG_UTF8CHAR is not implemented.\n"); + break; + case MSG_CHAR: if (wParam == 127) /* BS */ wParam = '\b'; diff --git a/src/font/charset.c b/src/font/charset.c index 930f0dc2..35833938 100644 --- a/src/font/charset.c +++ b/src/font/charset.c @@ -3718,8 +3718,8 @@ static int utf16le_conv_from_uc32 (UChar32 wc, unsigned char* mchar) } if (wc < 0x10000) { - mchar [0] = LOBYTE_WORD16 (wc); - mchar [1] = HIBYTE_WORD16 (wc); + mchar [0] = LOBYTE (wc); + mchar [1] = HIBYTE (wc); return 2; } @@ -3730,10 +3730,10 @@ static int utf16le_conv_from_uc32 (UChar32 wc, unsigned char* mchar) w1 |= (wc >> 10); w2 |= (wc & 0x03FF); - mchar [0] = LOBYTE_WORD16 (w1); - mchar [1] = HIBYTE_WORD16 (w1); - mchar [2] = LOBYTE_WORD16 (w2); - mchar [3] = HIBYTE_WORD16 (w2); + mchar [0] = LOBYTE (w1); + mchar [1] = HIBYTE (w1); + mchar [2] = LOBYTE (w2); + mchar [3] = HIBYTE (w2); return 4; } @@ -3944,8 +3944,8 @@ static int utf16be_conv_from_uc32 (UChar32 wc, unsigned char* mchar) } if (wc < 0x10000) { - mchar [1] = LOBYTE_WORD16 (wc); - mchar [0] = HIBYTE_WORD16 (wc); + mchar [1] = LOBYTE (wc); + mchar [0] = HIBYTE (wc); return 2; } @@ -3956,10 +3956,10 @@ static int utf16be_conv_from_uc32 (UChar32 wc, unsigned char* mchar) w1 |= (wc >> 10); w2 |= (wc & 0x03FF); - mchar [1] = LOBYTE_WORD16 (w1); - mchar [0] = HIBYTE_WORD16 (w1); - mchar [3] = LOBYTE_WORD16 (w2); - mchar [2] = HIBYTE_WORD16 (w2); + mchar [1] = LOBYTE (w1); + mchar [0] = HIBYTE (w1); + mchar [3] = LOBYTE (w2); + mchar [2] = HIBYTE (w2); return 4; } diff --git a/src/gui/dialog.c b/src/gui/dialog.c index b72931cb..d5db4d5e 100644 --- a/src/gui/dialog.c +++ b/src/gui/dialog.c @@ -816,9 +816,9 @@ static LRESULT MsgBoxProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam { int id = 0; - if (HIBYTE_WORD16 (wParam)) + if (HIBYTE (wParam)) break; - switch (LOBYTE_WORD16 (wParam)) { + switch (LOBYTE (wParam)) { case 'Y': case 'y': id = IDYES; diff --git a/src/gui/keyboard.c b/src/gui/keyboard.c index aeae6014..e4b921d9 100644 --- a/src/gui/keyboard.c +++ b/src/gui/keyboard.c @@ -396,7 +396,7 @@ static void handle_scancode_on_keydown (int scancode, key_info* kinfo) key_map = __mg_key_maps [shift_final]; if (key_map != NULL) { keysym = key_map [scancode]; - kinfo->type = HIBYTE_WORD16 (keysym); + kinfo->type = HIBYTE (keysym); if (kinfo->type >= 0xf0) { kinfo->type -= 0xf0; @@ -406,7 +406,7 @@ static void handle_scancode_on_keydown (int scancode, key_info* kinfo) if (key_map) keysym = key_map [scancode]; - kinfo->type = HIBYTE_WORD16 (keysym); + kinfo->type = HIBYTE (keysym); /*Now, the kinfo->type maybe changed to KT_ARABIC_COMPOSE. * So we have to deal with this situation */ if(kinfo->type >= 0xf0){ @@ -423,7 +423,7 @@ static void handle_scancode_on_keydown (int scancode, key_info* kinfo) key_map = __mg_key_maps[shift_final ^(1<type = HIBYTE_WORD16 (keysym); + kinfo->type = HIBYTE (keysym); if(kinfo->type >= 0xf0){ kinfo->type -= 0xf0; @@ -457,7 +457,7 @@ static void handle_scancode_on_keyup (int scancode, key_info* kinfo) key_map = __mg_key_maps [shift_final]; if (key_map != NULL) { keysym = key_map [scancode]; - kinfo->type = HIBYTE_WORD16 (keysym); + kinfo->type = HIBYTE (keysym); if (kinfo->type >= 0xf0) { kinfo->type -= 0xf0; @@ -559,19 +559,19 @@ BOOL GUIAPI TranslateMessage (PMSG pMsg) SendNotifyMessage (pMsg->hwnd, MSG_CHAR, __mg_kinfo.buff[0], pMsg->lParam); } else if (__mg_kinfo.pos == 2 && arabic_compose_flag) { - /* +#if 0 SendNotifyMessage (pMsg->hwnd, MSG_CHAR, - MAKEWORD16 (__mg_kinfo.buff[0], __mg_kinfo.buff[1]), - pMsg->lParam); - */ + MAKEWPARAM (__mg_kinfo.buff[0], __mg_kinfo.buff[1], 0, 0), pMsg->lParam); +#else SendNotifyMessage (pMsg->hwnd, MSG_CHAR, __mg_kinfo.buff[0], pMsg->lParam); SendNotifyMessage (pMsg->hwnd, MSG_CHAR, __mg_kinfo.buff[1], pMsg->lParam); +#endif arabic_compose_flag =0; } else { for (i = 0; i < __mg_kinfo.pos; i++) SendNotifyMessage (pMsg->hwnd, MSG_KEYSYM, - MAKEWORD16 (__mg_kinfo.buff[i], i), pMsg->lParam); + MAKEWORD (__mg_kinfo.buff[i], i), pMsg->lParam); } return FALSE; @@ -610,13 +610,13 @@ BOOL GUIAPI TranslateMessage (PMSG pMsg) SendNotifyMessage (pMsg->hwnd, MSG_CHAR, kinfo.buff[0], pMsg->lParam); } else if (kinfo.pos == 2 && arabic_compose_flag) { - /* +#if 0 SendNotifyMessage (pMsg->hwnd, MSG_CHAR, - MAKEWORD16 (__mg_kinfo.buff[0], __mg_kinfo.buff[1]), - pMsg->lParam); - */ + MAKEWPARAM (__mg_kinfo.buff[0], __mg_kinfo.buff[1], 0, 0), pMsg->lParam); +#else SendNotifyMessage (pMsg->hwnd, MSG_CHAR, kinfo.buff[0], pMsg->lParam); SendNotifyMessage (pMsg->hwnd, MSG_CHAR, kinfo.buff[1], pMsg->lParam); +#endif arabic_compose_flag =0; } else { diff --git a/src/ial/pcxvfbial.c b/src/ial/pcxvfbial.c index 91ce37cb..0e6d620b 100644 --- a/src/ial/pcxvfbial.c +++ b/src/ial/pcxvfbial.c @@ -138,7 +138,7 @@ void VFBSetCaption(const char* caption) /*one XVFBCaptionEventData struct costs 8 bytes, * change that '8' below if the struct is changed*/ if (mg_writesocket(__mg_pcxvfb_client_sockfd, ced, 8+len) < (8+len)) { - _MG_PRINTF ("IAL>PCXVFB: error occurred when calling VFBSetCaption.\n"); + _ERR_PRINTF ("IAL>PCXVFB: error occurred when calling VFBSetCaption.\n"); } } @@ -153,7 +153,7 @@ void VFBOpenIME(int bOpen) return; if (mg_writesocket(__mg_pcxvfb_client_sockfd, &ime, sizeof(ime)) < sizeof(ime)) { - _MG_PRINTF ("IAL>PCXVFB: error occurred when calling VFBOpenIME.\n"); + _ERR_PRINTF ("IAL>PCXVFB: error occurred when calling VFBOpenIME.\n"); } } @@ -167,7 +167,7 @@ void VFBShowWindow(int show) return; if (mg_writesocket(__mg_pcxvfb_client_sockfd, info, sizeof(info)) < sizeof(info)) { - _MG_PRINTF ("IAL>PCXVFB: error occurred when calling VFBShowWindow.\n"); + _ERR_PRINTF ("IAL>PCXVFB: error occurred when calling VFBShowWindow.\n"); } } @@ -267,7 +267,7 @@ static void write_rec (const void* buf, size_t n) /* TODO: */ #else if (write(record_fd, buf, n) < n) { - _MG_PRINTF ("IAL>PCXVFB: error occurred when calling write_rec.\n"); + _ERR_PRINTF ("IAL>PCXVFB: error occurred when calling write_rec.\n"); } #endif } @@ -346,7 +346,7 @@ static void mouse_setxy (int x, int y) return; if (mg_writesocket (__mg_pcxvfb_client_sockfd, &mouse_event, sizeof(XVFBEVENT)) < sizeof(XVFBEVENT)) { - _MG_PRINTF ("IAL>PCXVFB: error occurred when setting mouse position.\n"); + _ERR_PRINTF ("IAL>PCXVFB: error occurred when setting mouse position.\n"); } } @@ -423,7 +423,7 @@ static int keyboard_update (void) } else { scancode = unicode; - _MG_PRINTF ("IAL>PCXVFB: get a key state change (%s): scancode = %d\n", + _DBG_PRINTF ("IAL>PCXVFB: get a key state change (%s): scancode = %d\n", press?"pressed":"released", scancode); kbd_state [scancode] = press; if (press) diff --git a/src/include/msgstr.h b/src/include/msgstr.h index ff5cbd09..adc3bab6 100644 --- a/src/include/msgstr.h +++ b/src/include/msgstr.h @@ -38,7 +38,7 @@ const char *__mg_msgstr1 [] = "MSG_KEYLONGPRESS ", // 0x0016 "MSG_KEYALWAYSPRESS ", // 0x0017 "MSG_KEYSYM ", // 0x0018 - "", // 0x0019 + "MSG_UTF8CHAR ", // 0x0019 "", // 0x001A "", // 0x001B "", // 0x001C diff --git a/src/sysres/resmgr.c b/src/sysres/resmgr.c index 7655052f..d09680f2 100644 --- a/src/sysres/resmgr.c +++ b/src/sysres/resmgr.c @@ -830,7 +830,7 @@ RES_KEY Str2Key (const char* str) l = (strlen(str)+1) / 2; for (i=0; i> 16; - if (ch[2]) { + ch [0] = FIRSTBYTE (eucCode); + ch [1] = SECONDBYTE (eucCode); + ch [2] = THIRDBYTE (eucCode); + ch [3] = FOURTHBYTE (eucCode); + if (ch[3]) { + chlen = 4; + } + else if (ch[2]) { chlen = 3; } else if (ch[1]) { @@ -4369,10 +4372,10 @@ static int mTextEditor_onChar(mTextEditor *self, int asciiCode, DWORD keyFlags) if (chlen == 1) { if (GetWindowStyle(self->hwnd) & NCSS_TE_UPPERCASE) { - asciiCode = toupper(asciiCode); + eucCode = toupper(eucCode); } else if (GetWindowStyle(self->hwnd) & NCSS_TE_LOWERCASE) { - asciiCode = tolower(asciiCode); + eucCode = tolower(eucCode); } } @@ -4386,7 +4389,7 @@ static int mTextEditor_onChar(mTextEditor *self, int asciiCode, DWORD keyFlags) _c(self->textBuffer)->replace(self->textBuffer, - selBegin, selEnd - selBegin, (char*)&asciiCode, -1); + selBegin, selEnd - selBegin, (char*)&eucCode, -1); ncsNotifyParent (self, NCSN_TE_CHANGE); _set_cont_changed(self, TRUE); @@ -6380,6 +6383,10 @@ static int mTextEditor_wndProc(mTextEditor *self, int message, WPARAM wParam, LP case MSG_CHAR: return _c(self)->onChar(self, wParam, lParam); + case MSG_UTF8CHAR: + _ERR_PRINTF ("CONTROL>EDIT: MSG_UTF8CHAR is not implemented.\n"); + break; + case MSG_FONTCHANGED: _c(self)->onFontChanged(self); return 0;