From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Joakim =?UTF-8?Q?H=C3=A5rsman?= Newsgroups: gmane.emacs.bugs Subject: bug#10299: Emacs doesn't handle Unicode characters in keyboard layout on MS Windows Date: Tue, 24 Jan 2012 21:42:46 +0100 Message-ID: References: <8739clgapc.fsf@gnu.org> <83zket20xw.fsf@gnu.org> <83vcph0w9t.fsf@gnu.org> <83obv821wv.fsf@gnu.org> <831us31atj.fsf@gnu.org> <83pqflzr1d.fsf@gnu.org> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Trace: dough.gmane.org 1327437836 13261 80.91.229.12 (24 Jan 2012 20:43:56 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Tue, 24 Jan 2012 20:43:56 +0000 (UTC) Cc: Andreas Schwab , 10299@debbugs.gnu.org To: Juanma Barranquero Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Tue Jan 24 21:43:52 2012 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([140.186.70.17]) by lo.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1RpnDa-0002we-LM for geb-bug-gnu-emacs@m.gmane.org; Tue, 24 Jan 2012 21:43:50 +0100 Original-Received: from localhost ([::1]:44395 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RpnDa-0003Yi-AF for geb-bug-gnu-emacs@m.gmane.org; Tue, 24 Jan 2012 15:43:50 -0500 Original-Received: from eggs.gnu.org ([140.186.70.92]:55857) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RpnDR-0003Vq-RA for bug-gnu-emacs@gnu.org; Tue, 24 Jan 2012 15:43:47 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RpnDQ-0006SW-03 for bug-gnu-emacs@gnu.org; Tue, 24 Jan 2012 15:43:41 -0500 Original-Received: from debbugs.gnu.org ([140.186.70.43]:36745) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RpnDP-0006SL-Ss for bug-gnu-emacs@gnu.org; Tue, 24 Jan 2012 15:43:39 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.72) (envelope-from ) id 1RpnDl-0002ml-Ms for bug-gnu-emacs@gnu.org; Tue, 24 Jan 2012 15:44:01 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Joakim =?UTF-8?Q?H=C3=A5rsman?= Original-Sender: debbugs-submit-bounces@debbugs.gnu.org Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 24 Jan 2012 20:44:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 10299 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 10299-submit@debbugs.gnu.org id=B10299.132743779910647 (code B ref 10299); Tue, 24 Jan 2012 20:44:01 +0000 Original-Received: (at 10299) by debbugs.gnu.org; 24 Jan 2012 20:43:19 +0000 Original-Received: from localhost ([127.0.0.1]:42132 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1RpnD4-0002le-AT for submit@debbugs.gnu.org; Tue, 24 Jan 2012 15:43:18 -0500 Original-Received: from mail-bk0-f44.google.com ([209.85.214.44]:55108) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1RpnD0-0002lR-Sp for 10299@debbugs.gnu.org; Tue, 24 Jan 2012 15:43:16 -0500 Original-Received: by bkbzt4 with SMTP id zt4so1807414bkb.3 for <10299@debbugs.gnu.org>; Tue, 24 Jan 2012 12:42:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type:content-transfer-encoding; bh=3vvwvcAzhJGG+0pM0S6fw1hJO1fIVy+a72sMEHi2je8=; b=Fn+R0qXUyUWDlt4B88oQVDqpBhhUyLDPbrucgSjVykdsk+I7UzC5IGt85kt0+MeCoD 2Ps7a7uW0QxXV51CDT/JsFmUzjhSZlz1yX01zCE9ILquNlC7fyEAgaCmkwdN/jukYsFl erCTMZbMfDJzDoB4xItQL8Eo15tdzUJm/trBo= Original-Received: by 10.205.131.13 with SMTP id ho13mr4087913bkc.58.1327437766937; Tue, 24 Jan 2012 12:42:46 -0800 (PST) Original-Received: by 10.205.128.17 with HTTP; Tue, 24 Jan 2012 12:42:46 -0800 (PST) In-Reply-To: X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) X-Received-From: 140.186.70.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:55959 Archived-At: GetMessage is a macro, many Windows API functions are, and switches between GetMessageA and GetMessageW based on whether UNICODE is defined. I really should explicitly use GetMessageA, I just missed it. I switched to Stefan's suggestion, but with explicit use of GetMessageA. Note that this makes that line longer than 80 chars. Here's an amended patch that also moves the definition of the INIT_WINDOW_CLASS macro to just before use, and makes w32_set_frame_text static. =3D=3D=3D modified file 'src/w32fns.c' --- src/w32fns.c 2011-12-04 08:02:42 +0000 +++ src/w32fns.c 2012-01-24 20:22:52 +0000 @@ -1641,6 +1641,20 @@ } +/* Set text of w32 frame with handle HWND to TEXT. + + We explicitly switch between the Unicode and ANSI version of + SetWindowText because Emacs isn't compiled with UNICODE defined to + retain compatibility with Windows 95. */ + +static void +w32_set_frame_text (HWND hwnd, LPCSTR text) +{ + if (os_subtype =3D=3D OS_NT) + SetWindowTextW (hwnd, (LPCWSTR)text); + else + SetWindowTextA (hwnd, text); +} /* Change the name of frame F to NAME. If NAME is nil, set F's name to w32_id_name. @@ -1697,10 +1711,10 @@ if (FRAME_W32_WINDOW (f)) { if (STRING_MULTIBYTE (name)) - name =3D ENCODE_SYSTEM (name); - + name =3D ENCODE_SYSTEM (name); + BLOCK_INPUT; - SetWindowText (FRAME_W32_WINDOW (f), SDATA (name)); + w32_set_frame_text(FRAME_W32_WINDOW (f), SDATA (name)); UNBLOCK_INPUT; } } @@ -1746,7 +1760,7 @@ name =3D ENCODE_SYSTEM (name); BLOCK_INPUT; - SetWindowText (FRAME_W32_WINDOW (f), SDATA (name)); + w32_set_frame_text(FRAME_W32_WINDOW (f), SDATA (name)); UNBLOCK_INPUT; } } @@ -1782,23 +1796,37 @@ static LRESULT CALLBACK w32_wnd_proc (HWND, UINT, WPARAM, LPARAM); +#define INIT_WINDOW_CLASS(wc) \ + wc.style =3D CS_HREDRAW | CS_VREDRAW; \ + wc.lpfnWndProc =3D (WNDPROC) w32_wnd_proc; \ + wc.cbClsExtra =3D 0; \ + wc.cbWndExtra =3D WND_EXTRA_BYTES; \ + wc.hInstance =3D hinst; \ + wc.hIcon =3D LoadIcon (hinst, EMACS_CLASS); \ + wc.hCursor =3D w32_load_cursor (IDC_ARROW); \ + wc.hbrBackground =3D NULL; \ + wc.lpszMenuName =3D NULL; \ + static BOOL w32_init_class (HINSTANCE hinst) { - WNDCLASS wc; - - wc.style =3D CS_HREDRAW | CS_VREDRAW; - wc.lpfnWndProc =3D (WNDPROC) w32_wnd_proc; - wc.cbClsExtra =3D 0; - wc.cbWndExtra =3D WND_EXTRA_BYTES; - wc.hInstance =3D hinst; - wc.hIcon =3D LoadIcon (hinst, EMACS_CLASS); - wc.hCursor =3D w32_load_cursor (IDC_ARROW); - wc.hbrBackground =3D NULL; /* GetStockObject (WHITE_BRUSH); */ - wc.lpszMenuName =3D NULL; - wc.lpszClassName =3D EMACS_CLASS; - - return (RegisterClass (&wc)); + + if (os_subtype =3D=3D OS_NT) + { + WNDCLASSW uwc; + INIT_WINDOW_CLASS(uwc); + uwc.lpszClassName =3D L"Emacs"; + + return (RegisterClassW (&uwc)); + } + else + { + WNDCLASS wc; + INIT_WINDOW_CLASS(wc); + wc.lpszClassName =3D EMACS_CLASS; + + return (RegisterClassA (&wc)); + } } static HWND @@ -2248,8 +2276,13 @@ msh_mousewheel =3D RegisterWindowMessage (MSH_MOUSEWHEEL); - while (GetMessage (&msg, NULL, 0, 0)) + while (1) { + result =3D (os_subtype =3D=3D OS_NT ? GetMessageW : GetMessageA) (&msg, NULL, 0, 0); + + if (!result) + break; + if (msg.hwnd =3D=3D NULL) { switch (msg.message) @@ -2915,8 +2948,21 @@ case WM_SYSCHAR: case WM_CHAR: - post_character_message (hwnd, msg, wParam, lParam, - w32_get_key_modifiers (wParam, lParam)); + if (wParam > 255 ) + { + unsigned short lo =3D wParam & 0x0000FFFF; + unsigned short hi =3D (wParam & 0xFFFF0000) >> 8; + wParam =3D hi | lo; + + W32Msg wmsg; + wmsg.dwModifiers =3D w32_get_key_modifiers (wParam, lParam); + signal_user_input (); + my_post_msg (&wmsg, hwnd, WM_UNICHAR, wParam, lParam); + + } + else + post_character_message (hwnd, msg, wParam, lParam, + w32_get_key_modifiers (wParam, lParam)); break; case WM_UNICHAR: On 24 January 2012 13:03, Juanma Barranquero wrote: > On Tue, Jan 24, 2012 at 10:40, Andreas Schwab wro= te: > >>> =A0 result =3D (os_subtype =3D=3D OS_NT ? GetMessageW : GetMessage) (&m= sg, NULL, 0, 0); >> >> That can fail if either of the functions is defined only as a >> function-like macro. > > OTOH, if the patch explicitly references W functions, it should be > using RegisterClassA and GetMessageA for the explicit A versions. > > =A0 =A0 Juanma