* Re: Switch the Windows port to using Unicode keyboard input
[not found] ` <4AC8B391.4020906@gnu.org>
@ 2009-10-04 17:41 ` Eugen Anghel
2009-10-04 19:17 ` Eli Zaretskii
0 siblings, 1 reply; 3+ messages in thread
From: Eugen Anghel @ 2009-10-04 17:41 UTC (permalink / raw
To: Jason Rumney, Lennart Borgman, Eli Zaretskii; +Cc: emacs-devel
[-- Attachment #1: Type: text/plain, Size: 841 bytes --]
2009/10/4 Jason Rumney <jasonr@gnu.org>:
> Lennart Borgman wrote:
>>
>> Isn't it possible to keep the old code and check whether to use it or
>> not in the binary?
>>
>
> It may be, but changing the window class in a backwards compatible way is
> not as straightforward as the other function calls where we have done that.
> I suspect that a better approach would be to fix all the locations where
> system calls are used to cope with both _UNICODE and non _UNICODE builds,
> and use the non-specific system functions throughout.
>
Is having two separate binaries, one for 9x/Me and one for XP/Vista an
option? because I agree, that would simplify some things.
As for loading the functions at runtime, I've attached a patch that
should work on both 9x and XP/Vista. While kind of ugly, it's
definitely a possibility.
[-- Attachment #2: patch.patch --]
[-- Type: application/octet-stream, Size: 14286 bytes --]
diff --git a/src/coding.c b/src/coding.c
index 405284f..57f3063 100644
--- a/src/coding.c
+++ b/src/coding.c
@@ -310,7 +310,7 @@ Lisp_Object Qbuffer_file_coding_system;
Lisp_Object Qpost_read_conversion, Qpre_write_conversion;
Lisp_Object Qdefault_char;
Lisp_Object Qno_conversion, Qundecided;
-Lisp_Object Qcharset, Qiso_2022, Qutf_8, Qutf_16, Qshift_jis, Qbig5;
+Lisp_Object Qcharset, Qiso_2022, Qutf_8, Qutf_16, Qutf_16le, Qutf_16be, Qutf_16_le, Qutf_16_be, Qshift_jis, Qbig5;
Lisp_Object Qbig, Qlittle;
Lisp_Object Qcoding_system_history;
Lisp_Object Qvalid_codes;
@@ -10465,6 +10465,10 @@ syms_of_coding ()
DEFSYM (Qutf_8_emacs, "utf-8-emacs");
DEFSYM (Qutf_16, "utf-16");
+ DEFSYM (Qutf_16_le, "utf-16-le");
+ DEFSYM (Qutf_16_be, "utf-16-be");
+ DEFSYM (Qutf_16le, "utf-16le");
+ DEFSYM (Qutf_16be, "utf-16be");
DEFSYM (Qbig, "big");
DEFSYM (Qlittle, "little");
diff --git a/src/coding.h b/src/coding.h
index ca8878f..f37fd73 100644
--- a/src/coding.h
+++ b/src/coding.h
@@ -757,6 +757,7 @@ extern Lisp_Object preferred_coding_system P_ (());
extern Lisp_Object Qutf_8, Qutf_8_emacs;
+extern Lisp_Object Qutf_16, Qutf_16_le, Qutf_16le, Qutf_16be, Qutf_16_be;
extern Lisp_Object Qcoding_system, Qeol_type, Qcoding_category_index;
extern Lisp_Object Qcoding_system_p;
diff --git a/src/w32fns.c b/src/w32fns.c
index 8003d79..499d585 100644
--- a/src/w32fns.c
+++ b/src/w32fns.c
@@ -247,6 +247,8 @@ struct MONITOR_INFO
DECLARE_HANDLE(HMONITOR);
#endif
+#define HAS_UNICODE_WINDOWS (create_window_ex_unicode_fn != NULL)
+
typedef BOOL (WINAPI * TrackMouseEvent_Proc)
(IN OUT LPTRACKMOUSEEVENT lpEventTrack);
typedef LONG (WINAPI * ImmGetCompositionString_Proc)
@@ -258,6 +260,15 @@ typedef HWND (WINAPI * ImmSetCompositionWindow_Proc) (IN HIMC context,
typedef HMONITOR (WINAPI * MonitorFromPoint_Proc) (IN POINT pt, IN DWORD flags);
typedef BOOL (WINAPI * GetMonitorInfo_Proc)
(IN HMONITOR monitor, OUT struct MONITOR_INFO* info);
+typedef ATOM (WINAPI * RegisterClassW_Proc) (CONST WNDCLASS *lpWndClass);
+typedef HWND (WINAPI * CreateWindowExW_Proc)
+ (DWORD dwExStyle, LPCWSTR lpClassName, LPCWSTR lpWindowName, DWORD dwStyle,
+ int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu,
+ HINSTANCE hInstance, LPVOID lpParam);
+typedef BOOL (WINAPI * SetWindowTextW_Proc) (HWND hWnd, LPCWSTR lpString);
+typedef BOOL (WINAPI * GetMessage_Proc) (LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax);
+typedef BOOL (WINAPI * MessageProc_Proc) (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
+typedef LRESULT (WINAPI * DispatchMessage_Proc) (const MSG *lpmsg);
TrackMouseEvent_Proc track_mouse_event_fn = NULL;
ClipboardSequence_Proc clipboard_sequence_fn = NULL;
@@ -267,6 +278,13 @@ ImmReleaseContext_Proc release_ime_context_fn = NULL;
ImmSetCompositionWindow_Proc set_ime_composition_window_fn = NULL;
MonitorFromPoint_Proc monitor_from_point_fn = NULL;
GetMonitorInfo_Proc get_monitor_info_fn = NULL;
+RegisterClassW_Proc register_class_unicode_fn = NULL;
+CreateWindowExW_Proc create_window_ex_unicode_fn = NULL;
+SetWindowTextW_Proc set_window_text_unicode_fn = NULL;
+GetMessage_Proc get_message_fn = NULL;
+MessageProc_Proc post_message_fn = NULL;
+MessageProc_Proc def_window_proc_fn = NULL;
+DispatchMessage_Proc dispatch_message_fn = NULL;
extern AppendMenuW_Proc unicode_append_menu;
@@ -1871,11 +1889,23 @@ x_set_name (f, name, explicit)
if (FRAME_W32_WINDOW (f))
{
- if (STRING_MULTIBYTE (name))
- name = ENCODE_SYSTEM (name);
+ /* ensure name is null-terminated */
+ if (SREF (name, SBYTES (name) - 1))
+ name = make_string (SDATA (name), SBYTES (name) + 1);
BLOCK_INPUT;
- SetWindowText (FRAME_W32_WINDOW (f), SDATA (name));
+ if (set_window_text_unicode_fn)
+ {
+ name = code_convert_string_norecord(name, Qutf_16le, 1);
+ set_window_text_unicode_fn (FRAME_W32_WINDOW (f),
+ (LPCWSTR) SDATA (name));
+ }
+ else
+ {
+ if (STRING_MULTIBYTE (name))
+ name = ENCODE_SYSTEM (name);
+ SetWindowTextA (FRAME_W32_WINDOW (f), SDATA (name));
+ }
UNBLOCK_INPUT;
}
}
@@ -1923,11 +1953,23 @@ x_set_title (f, name, old_name)
if (FRAME_W32_WINDOW (f))
{
- if (STRING_MULTIBYTE (name))
- name = ENCODE_SYSTEM (name);
+ /* ensure name is null-terminated */
+ if (SREF (name, SBYTES (name) - 1))
+ name = make_string (SDATA (name), SBYTES (name) + 1);
BLOCK_INPUT;
- SetWindowText (FRAME_W32_WINDOW (f), SDATA (name));
+ if (set_window_text_unicode_fn)
+ {
+ name = code_convert_string_norecord(name, Qutf_16le, 1);
+ set_window_text_unicode_fn (FRAME_W32_WINDOW (f),
+ (LPCWSTR) SDATA (name));
+ }
+ else
+ {
+ if (STRING_MULTIBYTE (name))
+ name = ENCODE_SYSTEM (name);
+ SetWindowTextA (FRAME_W32_WINDOW (f), SDATA (name));
+ }
UNBLOCK_INPUT;
}
}
@@ -1968,20 +2010,42 @@ static BOOL
w32_init_class (hinst)
HINSTANCE hinst;
{
- WNDCLASS wc;
-
- wc.style = CS_HREDRAW | CS_VREDRAW;
- wc.lpfnWndProc = (WNDPROC) w32_wnd_proc;
- wc.cbClsExtra = 0;
- wc.cbWndExtra = WND_EXTRA_BYTES;
- wc.hInstance = hinst;
- wc.hIcon = LoadIcon (hinst, EMACS_CLASS);
- wc.hCursor = w32_load_cursor (IDC_ARROW);
- wc.hbrBackground = NULL; /* GetStockObject (WHITE_BRUSH); */
- wc.lpszMenuName = NULL;
- wc.lpszClassName = EMACS_CLASS;
-
- return (RegisterClass (&wc));
+ if (register_class_unicode_fn)
+ {
+ WNDCLASSW wc;
+
+ wc.style = CS_HREDRAW | CS_VREDRAW;
+ wc.lpfnWndProc = (WNDPROC) w32_wnd_proc;
+ wc.cbClsExtra = 0;
+ wc.cbWndExtra = WND_EXTRA_BYTES;
+ wc.hInstance = hinst;
+ wc.hIcon = LoadIcon (hinst, EMACS_CLASS);
+ wc.hCursor = w32_load_cursor (IDC_ARROW);
+ wc.hbrBackground = NULL; /* GetStockObject (WHITE_BRUSH); */
+ wc.lpszMenuName = NULL;
+
+ Lisp_Object classStr = make_string(EMACS_CLASS, strlen(EMACS_CLASS) + 1);
+ classStr = code_convert_string_norecord(classStr, Qutf_16le, 1);
+ wc.lpszClassName = (LPWSTR) SDATA (classStr);
+ return (register_class_unicode_fn (&wc));
+ }
+ else
+ {
+ WNDCLASSA wc;
+
+ wc.style = CS_HREDRAW | CS_VREDRAW;
+ wc.lpfnWndProc = (WNDPROC) w32_wnd_proc;
+ wc.cbClsExtra = 0;
+ wc.cbWndExtra = WND_EXTRA_BYTES;
+ wc.hInstance = hinst;
+ wc.hIcon = LoadIcon (hinst, EMACS_CLASS);
+ wc.hCursor = w32_load_cursor (IDC_ARROW);
+ wc.hbrBackground = NULL; /* GetStockObject (WHITE_BRUSH); */
+ wc.lpszMenuName = NULL;
+
+ wc.lpszClassName = EMACS_CLASS;
+ return (RegisterClass (&wc));
+ }
}
static HWND
@@ -2007,10 +2071,11 @@ w32_createwindow (f)
{
HWND hwnd;
RECT rect;
+ Lisp_Object classStr = make_string (EMACS_CLASS, strlen (EMACS_CLASS) + 1);
+ Lisp_Object nameStr = make_string (f->namebuf, strlen(f->namebuf) + 1);
Lisp_Object top = Qunbound;
Lisp_Object left = Qunbound;
struct w32_display_info *dpyinfo = &one_w32_display_info;
-
rect.left = rect.top = 0;
rect.right = FRAME_PIXEL_WIDTH (f);
rect.bottom = FRAME_PIXEL_HEIGHT (f);
@@ -2038,18 +2103,40 @@ w32_createwindow (f)
top = x_get_arg (dpyinfo, Qnil, Qtop, "top", "Top", RES_TYPE_NUMBER);
}
- FRAME_W32_WINDOW (f) = hwnd
- = CreateWindow (EMACS_CLASS,
- f->namebuf,
- f->output_data.w32->dwStyle | WS_CLIPCHILDREN,
- EQ (left, Qunbound) ? CW_USEDEFAULT : XINT (left),
- EQ (top, Qunbound) ? CW_USEDEFAULT : XINT (top),
- rect.right - rect.left,
- rect.bottom - rect.top,
- NULL,
- NULL,
- hinst,
- NULL);
+ if (HAS_UNICODE_WINDOWS)
+ {
+ classStr = code_convert_string_norecord(classStr, Qutf_16le, 1);
+ nameStr = code_convert_string_norecord(nameStr, Qutf_16le, 1);
+ FRAME_W32_WINDOW (f) = hwnd
+ = create_window_ex_unicode_fn (
+ 0,
+ (LPWSTR) SDATA (classStr),
+ (LPWSTR) SDATA (nameStr),
+ f->output_data.w32->dwStyle | WS_CLIPCHILDREN,
+ EQ (left, Qunbound) ? CW_USEDEFAULT : XINT (left),
+ EQ (top, Qunbound) ? CW_USEDEFAULT : XINT (top),
+ rect.right - rect.left,
+ rect.bottom - rect.top,
+ NULL,
+ NULL,
+ hinst,
+ NULL);
+ }
+ else
+ {
+ FRAME_W32_WINDOW (f) = hwnd
+ = CreateWindowA (SDATA (classStr),
+ SDATA (nameStr),
+ f->output_data.w32->dwStyle | WS_CLIPCHILDREN,
+ EQ (left, Qunbound) ? CW_USEDEFAULT : XINT (left),
+ EQ (top, Qunbound) ? CW_USEDEFAULT : XINT (top),
+ rect.right - rect.left,
+ rect.bottom - rect.top,
+ NULL,
+ NULL,
+ hinst,
+ NULL);
+ }
if (hwnd)
{
@@ -2441,7 +2528,7 @@ w32_msg_pump (deferred_msg * msg_buf)
msh_mousewheel = RegisterWindowMessage (MSH_MOUSEWHEEL);
- while (GetMessage (&msg, NULL, 0, 0))
+ while (get_message_fn (&msg, NULL, 0, 0))
{
if (msg.hwnd == NULL)
{
@@ -2536,7 +2623,7 @@ w32_msg_pump (deferred_msg * msg_buf)
}
else
{
- DispatchMessage (&msg);
+ dispatch_message_fn (&msg);
}
/* Exit nested loop when our deferred message has completed. */
@@ -2897,7 +2984,7 @@ w32_wnd_proc (hwnd, msg, wParam, lParam)
case WM_HOTKEY:
/* Synchronize hot keys with normal input. */
- PostMessage (hwnd, WM_KEYDOWN, HIWORD (lParam), 0);
+ post_message_fn (hwnd, WM_KEYDOWN, HIWORD (lParam), 0);
return (0);
case WM_KEYUP:
@@ -3995,7 +4082,7 @@ w32_wnd_proc (hwnd, msg, wParam, lParam)
}
dflt:
- return DefWindowProc (hwnd, msg, wParam, lParam);
+ return (def_window_proc_fn (hwnd, msg, wParam, lParam));
}
@@ -4011,7 +4098,7 @@ my_create_window (f)
if (!PostThreadMessage (dwWindowsThreadId, WM_EMACS_CREATEWINDOW, (WPARAM)f, 0))
abort ();
- GetMessage (&msg, NULL, WM_EMACS_DONE, WM_EMACS_DONE);
+ get_message_fn (&msg, NULL, WM_EMACS_DONE, WM_EMACS_DONE);
}
@@ -6277,7 +6364,7 @@ If optional parameter FRAME is not specified, use selected frame. */)
CHECK_NUMBER (command);
- PostMessage (FRAME_W32_WINDOW (f), WM_SYSCOMMAND, XINT (command), 0);
+ post_message_fn (FRAME_W32_WINDOW (f), WM_SYSCOMMAND, XINT (command), 0);
return Qnil;
}
@@ -6508,7 +6595,7 @@ DEFUN ("w32-unregister-hot-key", Fw32_unregister_hot_key,
#endif
{
MSG msg;
- GetMessage (&msg, NULL, WM_EMACS_DONE, WM_EMACS_DONE);
+ get_message_fn (&msg, NULL, WM_EMACS_DONE, WM_EMACS_DONE);
}
return Qt;
}
@@ -6588,7 +6675,7 @@ is set to off if the low bit of NEW-STATE is zero, otherwise on. */)
#endif
{
MSG msg;
- GetMessage (&msg, NULL, WM_EMACS_DONE, WM_EMACS_DONE);
+ get_message_fn (&msg, NULL, WM_EMACS_DONE, WM_EMACS_DONE);
return make_number (msg.wParam);
}
return Qnil;
@@ -7312,6 +7399,20 @@ globals_of_w32fns ()
GetProcAddress (user32_lib, "MonitorFromPoint");
get_monitor_info_fn = (GetMonitorInfo_Proc)
GetProcAddress (user32_lib, "GetMonitorInfoA");
+ register_class_unicode_fn = (RegisterClassW_Proc)
+ GetProcAddress (user32_lib, "RegisterClassW");
+ create_window_ex_unicode_fn = (CreateWindowExW_Proc)
+ GetProcAddress (user32_lib, "CreateWindowExW");
+ set_window_text_unicode_fn = (SetWindowTextW_Proc)
+ GetProcAddress (user32_lib, "SetWindowTextW");
+ get_message_fn = (GetMessage_Proc)
+ GetProcAddress (user32_lib, HAS_UNICODE_WINDOWS ? "GetMessageW" : "GetMessageA");
+ post_message_fn = (MessageProc_Proc)
+ GetProcAddress (user32_lib, HAS_UNICODE_WINDOWS ? "PostMessageW" : "PostMessageA");
+ def_window_proc_fn = (MessageProc_Proc)
+ GetProcAddress (user32_lib, HAS_UNICODE_WINDOWS ? "DefWindowProcW" : "DefWindowProcA");
+ dispatch_message_fn = (DispatchMessage_Proc)
+ GetProcAddress (user32_lib, HAS_UNICODE_WINDOWS ? "DispatchMessageW" : "DispatchMessageA");
{
HMODULE imm32_lib = GetModuleHandle ("imm32.dll");
diff --git a/src/w32term.c b/src/w32term.c
index b7642b4..5f28b2b 100644
--- a/src/w32term.c
+++ b/src/w32term.c
@@ -4229,10 +4229,14 @@ w32_read_socket (sd, expected, hold_quit)
XSETFRAME (inev.frame_or_window, f);
inev.timestamp = msg.msg.time;
+
if (msg.msg.message == WM_UNICHAR)
{
inev.code = msg.msg.wParam;
}
+ else if (IsWindowUnicode (msg.msg.hwnd)) {
+ inev.code = msg.msg.wParam;
+ }
else if (msg.msg.wParam < 256)
{
wchar_t code;
@@ -4245,7 +4249,7 @@ w32_read_socket (sd, expected, hold_quit)
dbcs[0] = dbcs_lead;
dbcs_lead = 0;
if (!MultiByteToWideChar (keyboard_codepage, 0,
- dbcs, 2, &code, 1))
+ dbcs, 2, &code, 1))
{
/* Garbage */
DebPrint (("Invalid DBCS sequence: %d %d\n",
@@ -4255,7 +4259,7 @@ w32_read_socket (sd, expected, hold_quit)
}
}
else if (IsDBCSLeadByteEx (keyboard_codepage,
- (BYTE) msg.msg.wParam))
+ (BYTE) msg.msg.wParam))
{
dbcs_lead = (char) msg.msg.wParam;
inev.kind = NO_EVENT;
@@ -4264,7 +4268,7 @@ w32_read_socket (sd, expected, hold_quit)
else
{
if (!MultiByteToWideChar (keyboard_codepage, 0,
- &dbcs[1], 1, &code, 1))
+ &dbcs[1], 1, &code, 1))
{
/* What to do with garbage? */
DebPrint (("Invalid character: %d\n", dbcs[1]));
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: Switch the Windows port to using Unicode keyboard input
2009-10-04 17:41 ` Switch the Windows port to using Unicode keyboard input Eugen Anghel
@ 2009-10-04 19:17 ` Eli Zaretskii
2009-10-06 18:11 ` Eugen Anghel
0 siblings, 1 reply; 3+ messages in thread
From: Eli Zaretskii @ 2009-10-04 19:17 UTC (permalink / raw
To: Eugen Anghel; +Cc: emacs-devel, lennart.borgman, jasonr
> From: Eugen Anghel <eugen@syntactic.org>
> Date: Sun, 4 Oct 2009 20:41:53 +0300
> Cc: emacs-devel@gnu.org
>
> Is having two separate binaries, one for 9x/Me and one for XP/Vista an
> option?
That would be inconvenient (need two binaries on FTP sites, migrating
from 9x to XP needs to install a different binary, etc.). So I think
we should do this only if there's no better solution.
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: Switch the Windows port to using Unicode keyboard input
2009-10-04 19:17 ` Eli Zaretskii
@ 2009-10-06 18:11 ` Eugen Anghel
0 siblings, 0 replies; 3+ messages in thread
From: Eugen Anghel @ 2009-10-06 18:11 UTC (permalink / raw
To: Eli Zaretskii, emacs-devel; +Cc: lennart.borgman, jasonr
[-- Attachment #1: Type: text/plain, Size: 657 bytes --]
2009/10/4 Eli Zaretskii <eliz@gnu.org>:
>> From: Eugen Anghel <eugen@syntactic.org>
>> Date: Sun, 4 Oct 2009 20:41:53 +0300
>> Cc: emacs-devel@gnu.org
>>
>> Is having two separate binaries, one for 9x/Me and one for XP/Vista an
>> option?
>
> That would be inconvenient (need two binaries on FTP sites, migrating
> from 9x to XP needs to install a different binary, etc.). So I think
> we should do this only if there's no better solution.
>
Hi. I have attached another patch that should function correctly on
XP/Vista without affecting win98/me users in any way. It's working for
me on Windows 7 and I'll test it tomorrow on XP at work.
[-- Attachment #2: w32-unicode.patch --]
[-- Type: application/octet-stream, Size: 15161 bytes --]
diff --git a/src/coding.c b/src/coding.c
index 405284f..57f3063 100644
--- a/src/coding.c
+++ b/src/coding.c
@@ -310,7 +310,7 @@ Lisp_Object Qbuffer_file_coding_system;
Lisp_Object Qpost_read_conversion, Qpre_write_conversion;
Lisp_Object Qdefault_char;
Lisp_Object Qno_conversion, Qundecided;
-Lisp_Object Qcharset, Qiso_2022, Qutf_8, Qutf_16, Qshift_jis, Qbig5;
+Lisp_Object Qcharset, Qiso_2022, Qutf_8, Qutf_16, Qutf_16le, Qutf_16be, Qutf_16_le, Qutf_16_be, Qshift_jis, Qbig5;
Lisp_Object Qbig, Qlittle;
Lisp_Object Qcoding_system_history;
Lisp_Object Qvalid_codes;
@@ -10465,6 +10465,10 @@ syms_of_coding ()
DEFSYM (Qutf_8_emacs, "utf-8-emacs");
DEFSYM (Qutf_16, "utf-16");
+ DEFSYM (Qutf_16_le, "utf-16-le");
+ DEFSYM (Qutf_16_be, "utf-16-be");
+ DEFSYM (Qutf_16le, "utf-16le");
+ DEFSYM (Qutf_16be, "utf-16be");
DEFSYM (Qbig, "big");
DEFSYM (Qlittle, "little");
diff --git a/src/coding.h b/src/coding.h
index ca8878f..f37fd73 100644
--- a/src/coding.h
+++ b/src/coding.h
@@ -757,6 +757,7 @@ extern Lisp_Object preferred_coding_system P_ (());
extern Lisp_Object Qutf_8, Qutf_8_emacs;
+extern Lisp_Object Qutf_16, Qutf_16_le, Qutf_16le, Qutf_16be, Qutf_16_be;
extern Lisp_Object Qcoding_system, Qeol_type, Qcoding_category_index;
extern Lisp_Object Qcoding_system_p;
diff --git a/src/w32fns.c b/src/w32fns.c
index 8003d79..91cfa5e 100644
--- a/src/w32fns.c
+++ b/src/w32fns.c
@@ -247,6 +247,8 @@ struct MONITOR_INFO
DECLARE_HANDLE(HMONITOR);
#endif
+#define HAS_UNICODE_WINDOWS (create_window_ex_unicode_fn != NULL)
+
typedef BOOL (WINAPI * TrackMouseEvent_Proc)
(IN OUT LPTRACKMOUSEEVENT lpEventTrack);
typedef LONG (WINAPI * ImmGetCompositionString_Proc)
@@ -258,6 +260,20 @@ typedef HWND (WINAPI * ImmSetCompositionWindow_Proc) (IN HIMC context,
typedef HMONITOR (WINAPI * MonitorFromPoint_Proc) (IN POINT pt, IN DWORD flags);
typedef BOOL (WINAPI * GetMonitorInfo_Proc)
(IN HMONITOR monitor, OUT struct MONITOR_INFO* info);
+typedef ATOM (WINAPI * RegisterClassW_Proc) (CONST WNDCLASS *lpWndClass);
+typedef HWND (WINAPI * CreateWindowExW_Proc)
+ (DWORD dwExStyle, LPCWSTR lpClassName, LPCWSTR lpWindowName, DWORD dwStyle,
+ int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu,
+ HINSTANCE hInstance, LPVOID lpParam);
+typedef BOOL (WINAPI * SetWindowText_Proc) (HWND hWnd, LPCSTR lpString);
+typedef BOOL (WINAPI * GetMessage_Proc) (LPMSG lpMsg, HWND hWnd, UINT
+ wMsgFilterMin, UINT wMsgFilterMax);
+typedef BOOL (WINAPI * MessageProc_Proc) (HWND hWnd, UINT msg,
+ WPARAM wParam, LPARAM lParam);
+typedef LRESULT (WINAPI * DispatchMessage_Proc) (const MSG *lpmsg);
+typedef BOOL (WINAPI * PeekMessage_Proc)
+ (LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin,
+ UINT wMsgFilterMax, UINT wRemoveMsg);
TrackMouseEvent_Proc track_mouse_event_fn = NULL;
ClipboardSequence_Proc clipboard_sequence_fn = NULL;
@@ -267,6 +283,14 @@ ImmReleaseContext_Proc release_ime_context_fn = NULL;
ImmSetCompositionWindow_Proc set_ime_composition_window_fn = NULL;
MonitorFromPoint_Proc monitor_from_point_fn = NULL;
GetMonitorInfo_Proc get_monitor_info_fn = NULL;
+RegisterClassW_Proc register_class_unicode_fn = NULL;
+CreateWindowExW_Proc create_window_ex_unicode_fn = NULL;
+SetWindowText_Proc set_window_text_fn = NULL;
+GetMessage_Proc get_message_fn = NULL;
+MessageProc_Proc post_message_fn = NULL;
+MessageProc_Proc def_window_proc_fn = NULL;
+DispatchMessage_Proc dispatch_message_fn = NULL;
+PeekMessage_Proc peek_message_fn = NULL;
extern AppendMenuW_Proc unicode_append_menu;
@@ -1871,11 +1895,18 @@ x_set_name (f, name, explicit)
if (FRAME_W32_WINDOW (f))
{
- if (STRING_MULTIBYTE (name))
- name = ENCODE_SYSTEM (name);
+ /* ensure name is null-terminated */
+ if (SREF (name, SBYTES (name) - 1))
+ name = make_string (SDATA (name), SBYTES (name) + 1);
BLOCK_INPUT;
- SetWindowText (FRAME_W32_WINDOW (f), SDATA (name));
+ if (HAS_UNICODE_WINDOWS)
+ name = code_convert_string_norecord(name, Qutf_16le, 1);
+ else
+ if (STRING_MULTIBYTE (name))
+ name = ENCODE_SYSTEM (name);
+
+ set_window_text_fn (FRAME_W32_WINDOW (f), SDATA (name));
UNBLOCK_INPUT;
}
}
@@ -1923,11 +1954,18 @@ x_set_title (f, name, old_name)
if (FRAME_W32_WINDOW (f))
{
- if (STRING_MULTIBYTE (name))
- name = ENCODE_SYSTEM (name);
+ /* ensure name is null-terminated */
+ if (SREF (name, SBYTES (name) - 1))
+ name = make_string (SDATA (name), SBYTES (name) + 1);
BLOCK_INPUT;
- SetWindowText (FRAME_W32_WINDOW (f), SDATA (name));
+ if (HAS_UNICODE_WINDOWS)
+ name = code_convert_string_norecord(name, Qutf_16le, 1);
+ else
+ if (STRING_MULTIBYTE (name))
+ name = ENCODE_SYSTEM (name);
+
+ set_window_text_fn (FRAME_W32_WINDOW (f), SDATA (name));
UNBLOCK_INPUT;
}
}
@@ -1968,20 +2006,42 @@ static BOOL
w32_init_class (hinst)
HINSTANCE hinst;
{
- WNDCLASS wc;
-
- wc.style = CS_HREDRAW | CS_VREDRAW;
- wc.lpfnWndProc = (WNDPROC) w32_wnd_proc;
- wc.cbClsExtra = 0;
- wc.cbWndExtra = WND_EXTRA_BYTES;
- wc.hInstance = hinst;
- wc.hIcon = LoadIcon (hinst, EMACS_CLASS);
- wc.hCursor = w32_load_cursor (IDC_ARROW);
- wc.hbrBackground = NULL; /* GetStockObject (WHITE_BRUSH); */
- wc.lpszMenuName = NULL;
- wc.lpszClassName = EMACS_CLASS;
-
- return (RegisterClass (&wc));
+ if (register_class_unicode_fn)
+ {
+ WNDCLASSW wc;
+
+ wc.style = CS_HREDRAW | CS_VREDRAW;
+ wc.lpfnWndProc = (WNDPROC) w32_wnd_proc;
+ wc.cbClsExtra = 0;
+ wc.cbWndExtra = WND_EXTRA_BYTES;
+ wc.hInstance = hinst;
+ wc.hIcon = LoadIcon (hinst, EMACS_CLASS);
+ wc.hCursor = w32_load_cursor (IDC_ARROW);
+ wc.hbrBackground = NULL; /* GetStockObject (WHITE_BRUSH); */
+ wc.lpszMenuName = NULL;
+
+ Lisp_Object classStr = make_string(EMACS_CLASS, strlen(EMACS_CLASS) + 1);
+ classStr = code_convert_string_norecord(classStr, Qutf_16le, 1);
+ wc.lpszClassName = (LPWSTR) SDATA (classStr);
+ return (register_class_unicode_fn (&wc));
+ }
+ else
+ {
+ WNDCLASSA wc;
+
+ wc.style = CS_HREDRAW | CS_VREDRAW;
+ wc.lpfnWndProc = (WNDPROC) w32_wnd_proc;
+ wc.cbClsExtra = 0;
+ wc.cbWndExtra = WND_EXTRA_BYTES;
+ wc.hInstance = hinst;
+ wc.hIcon = LoadIcon (hinst, EMACS_CLASS);
+ wc.hCursor = w32_load_cursor (IDC_ARROW);
+ wc.hbrBackground = NULL; /* GetStockObject (WHITE_BRUSH); */
+ wc.lpszMenuName = NULL;
+
+ wc.lpszClassName = EMACS_CLASS;
+ return (RegisterClass (&wc));
+ }
}
static HWND
@@ -2007,10 +2067,11 @@ w32_createwindow (f)
{
HWND hwnd;
RECT rect;
+ Lisp_Object classStr = make_string (EMACS_CLASS, strlen (EMACS_CLASS) + 1);
+ Lisp_Object nameStr = make_string (f->namebuf, strlen(f->namebuf) + 1);
Lisp_Object top = Qunbound;
Lisp_Object left = Qunbound;
struct w32_display_info *dpyinfo = &one_w32_display_info;
-
rect.left = rect.top = 0;
rect.right = FRAME_PIXEL_WIDTH (f);
rect.bottom = FRAME_PIXEL_HEIGHT (f);
@@ -2038,18 +2099,40 @@ w32_createwindow (f)
top = x_get_arg (dpyinfo, Qnil, Qtop, "top", "Top", RES_TYPE_NUMBER);
}
- FRAME_W32_WINDOW (f) = hwnd
- = CreateWindow (EMACS_CLASS,
- f->namebuf,
- f->output_data.w32->dwStyle | WS_CLIPCHILDREN,
- EQ (left, Qunbound) ? CW_USEDEFAULT : XINT (left),
- EQ (top, Qunbound) ? CW_USEDEFAULT : XINT (top),
- rect.right - rect.left,
- rect.bottom - rect.top,
- NULL,
- NULL,
- hinst,
- NULL);
+ if (HAS_UNICODE_WINDOWS)
+ {
+ classStr = code_convert_string_norecord(classStr, Qutf_16le, 1);
+ nameStr = code_convert_string_norecord(nameStr, Qutf_16le, 1);
+ FRAME_W32_WINDOW (f) = hwnd
+ = create_window_ex_unicode_fn (
+ 0,
+ (LPWSTR) SDATA (classStr),
+ (LPWSTR) SDATA (nameStr),
+ f->output_data.w32->dwStyle | WS_CLIPCHILDREN,
+ EQ (left, Qunbound) ? CW_USEDEFAULT : XINT (left),
+ EQ (top, Qunbound) ? CW_USEDEFAULT : XINT (top),
+ rect.right - rect.left,
+ rect.bottom - rect.top,
+ NULL,
+ NULL,
+ hinst,
+ NULL);
+ }
+ else
+ {
+ FRAME_W32_WINDOW (f) = hwnd
+ = CreateWindowA (SDATA (classStr),
+ SDATA (nameStr),
+ f->output_data.w32->dwStyle | WS_CLIPCHILDREN,
+ EQ (left, Qunbound) ? CW_USEDEFAULT : XINT (left),
+ EQ (top, Qunbound) ? CW_USEDEFAULT : XINT (top),
+ rect.right - rect.left,
+ rect.bottom - rect.top,
+ NULL,
+ NULL,
+ hinst,
+ NULL);
+ }
if (hwnd)
{
@@ -2441,7 +2524,7 @@ w32_msg_pump (deferred_msg * msg_buf)
msh_mousewheel = RegisterWindowMessage (MSH_MOUSEWHEEL);
- while (GetMessage (&msg, NULL, 0, 0))
+ while (get_message_fn (&msg, NULL, 0, 0))
{
if (msg.hwnd == NULL)
{
@@ -2536,7 +2619,7 @@ w32_msg_pump (deferred_msg * msg_buf)
}
else
{
- DispatchMessage (&msg);
+ dispatch_message_fn (&msg);
}
/* Exit nested loop when our deferred message has completed. */
@@ -2649,7 +2732,7 @@ w32_msg_worker (void *arg)
/* Ensure our message queue is created */
- PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE);
+ peek_message_fn (&msg, NULL, 0, 0, PM_NOREMOVE);
if (!PostThreadMessage (dwMainThreadId, WM_EMACS_DONE, 0, 0))
abort ();
@@ -2897,7 +2980,7 @@ w32_wnd_proc (hwnd, msg, wParam, lParam)
case WM_HOTKEY:
/* Synchronize hot keys with normal input. */
- PostMessage (hwnd, WM_KEYDOWN, HIWORD (lParam), 0);
+ post_message_fn (hwnd, WM_KEYDOWN, HIWORD (lParam), 0);
return (0);
case WM_KEYUP:
@@ -3964,10 +4047,10 @@ w32_wnd_proc (hwnd, msg, wParam, lParam)
{
MSG amsg;
/* Eat any mouse messages during popupmenu */
- while (PeekMessage (&amsg, hwnd, WM_MOUSEFIRST, WM_MOUSELAST,
+ while (peek_message_fn (&amsg, hwnd, WM_MOUSEFIRST, WM_MOUSELAST,
PM_REMOVE));
/* Get the menu selection, if any */
- if (PeekMessage (&amsg, hwnd, WM_COMMAND, WM_COMMAND, PM_REMOVE))
+ if (peek_message_fn (&amsg, hwnd, WM_COMMAND, WM_COMMAND, PM_REMOVE))
{
retval = LOWORD (amsg.wParam);
}
@@ -3995,7 +4078,7 @@ w32_wnd_proc (hwnd, msg, wParam, lParam)
}
dflt:
- return DefWindowProc (hwnd, msg, wParam, lParam);
+ return (def_window_proc_fn (hwnd, msg, wParam, lParam));
}
@@ -4011,7 +4094,7 @@ my_create_window (f)
if (!PostThreadMessage (dwWindowsThreadId, WM_EMACS_CREATEWINDOW, (WPARAM)f, 0))
abort ();
- GetMessage (&msg, NULL, WM_EMACS_DONE, WM_EMACS_DONE);
+ get_message_fn (&msg, NULL, WM_EMACS_DONE, WM_EMACS_DONE);
}
@@ -6277,7 +6360,7 @@ If optional parameter FRAME is not specified, use selected frame. */)
CHECK_NUMBER (command);
- PostMessage (FRAME_W32_WINDOW (f), WM_SYSCOMMAND, XINT (command), 0);
+ post_message_fn (FRAME_W32_WINDOW (f), WM_SYSCOMMAND, XINT (command), 0);
return Qnil;
}
@@ -6508,7 +6591,7 @@ DEFUN ("w32-unregister-hot-key", Fw32_unregister_hot_key,
#endif
{
MSG msg;
- GetMessage (&msg, NULL, WM_EMACS_DONE, WM_EMACS_DONE);
+ get_message_fn (&msg, NULL, WM_EMACS_DONE, WM_EMACS_DONE);
}
return Qt;
}
@@ -6588,7 +6671,7 @@ is set to off if the low bit of NEW-STATE is zero, otherwise on. */)
#endif
{
MSG msg;
- GetMessage (&msg, NULL, WM_EMACS_DONE, WM_EMACS_DONE);
+ get_message_fn (&msg, NULL, WM_EMACS_DONE, WM_EMACS_DONE);
return make_number (msg.wParam);
}
return Qnil;
@@ -7312,6 +7395,22 @@ globals_of_w32fns ()
GetProcAddress (user32_lib, "MonitorFromPoint");
get_monitor_info_fn = (GetMonitorInfo_Proc)
GetProcAddress (user32_lib, "GetMonitorInfoA");
+ register_class_unicode_fn = (RegisterClassW_Proc)
+ GetProcAddress (user32_lib, "RegisterClassW");
+ create_window_ex_unicode_fn = (CreateWindowExW_Proc)
+ GetProcAddress (user32_lib, "CreateWindowExW");
+ set_window_text_fn = (SetWindowText_Proc)
+ GetProcAddress (user32_lib, HAS_UNICODE_WINDOWS ? "SetWindowTextW" : "SetWindowTextA");
+ get_message_fn = (GetMessage_Proc)
+ GetProcAddress (user32_lib, HAS_UNICODE_WINDOWS ? "GetMessageW" : "GetMessageA");
+ post_message_fn = (MessageProc_Proc)
+ GetProcAddress (user32_lib, HAS_UNICODE_WINDOWS ? "PostMessageW" : "PostMessageA");
+ def_window_proc_fn = (MessageProc_Proc)
+ GetProcAddress (user32_lib, HAS_UNICODE_WINDOWS ? "DefWindowProcW" : "DefWindowProcA");
+ dispatch_message_fn = (DispatchMessage_Proc)
+ GetProcAddress (user32_lib, HAS_UNICODE_WINDOWS ? "DispatchMessageW" : "DispatchMessageA");
+ peek_message_fn = (PeekMessage_Proc)
+ GetProcAddress (user32_lib, HAS_UNICODE_WINDOWS ? "PeekMessageW" : "PeekMessageA");
{
HMODULE imm32_lib = GetModuleHandle ("imm32.dll");
diff --git a/src/w32term.c b/src/w32term.c
index b7642b4..5f28b2b 100644
--- a/src/w32term.c
+++ b/src/w32term.c
@@ -4229,10 +4229,14 @@ w32_read_socket (sd, expected, hold_quit)
XSETFRAME (inev.frame_or_window, f);
inev.timestamp = msg.msg.time;
+
if (msg.msg.message == WM_UNICHAR)
{
inev.code = msg.msg.wParam;
}
+ else if (IsWindowUnicode (msg.msg.hwnd)) {
+ inev.code = msg.msg.wParam;
+ }
else if (msg.msg.wParam < 256)
{
wchar_t code;
@@ -4245,7 +4249,7 @@ w32_read_socket (sd, expected, hold_quit)
dbcs[0] = dbcs_lead;
dbcs_lead = 0;
if (!MultiByteToWideChar (keyboard_codepage, 0,
- dbcs, 2, &code, 1))
+ dbcs, 2, &code, 1))
{
/* Garbage */
DebPrint (("Invalid DBCS sequence: %d %d\n",
@@ -4255,7 +4259,7 @@ w32_read_socket (sd, expected, hold_quit)
}
}
else if (IsDBCSLeadByteEx (keyboard_codepage,
- (BYTE) msg.msg.wParam))
+ (BYTE) msg.msg.wParam))
{
dbcs_lead = (char) msg.msg.wParam;
inev.kind = NO_EVENT;
@@ -4264,7 +4268,7 @@ w32_read_socket (sd, expected, hold_quit)
else
{
if (!MultiByteToWideChar (keyboard_codepage, 0,
- &dbcs[1], 1, &code, 1))
+ &dbcs[1], 1, &code, 1))
{
/* What to do with garbage? */
DebPrint (("Invalid character: %d\n", dbcs[1]));
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2009-10-06 18:11 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <ffeec6560910040639o8646689qb1622d487a10c043@mail.gmail.com>
[not found] ` <83y6nrnthg.fsf@gnu.org>
[not found] ` <e01d8a50910040712v56c96b4bp64d3f1105382f527@mail.gmail.com>
[not found] ` <4AC8B391.4020906@gnu.org>
2009-10-04 17:41 ` Switch the Windows port to using Unicode keyboard input Eugen Anghel
2009-10-04 19:17 ` Eli Zaretskii
2009-10-06 18:11 ` Eugen Anghel
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.