bug#68339: [patch] Set the IME window font to an appropriate size

dANiuu zHaO <[email protected]> Sun, 2 Aug 2026 11:50:27 +0800
Newsgroups gmane.emacs.bugs
Message-ID <CAEOE9jeoXVRaYerZw-WJGn6mE3GdtTB1+hoFm_KwvyHBod9YPQ@mail.gmail.com>
--00000000000047e502065808535b
Content-Type: multipart/alternative; boundary="00000000000047e5010658085359"

--00000000000047e5010658085359
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

I implemented the fix for this issue based on Vim's approach. I tried using
the ImmGetCompositionFont API =E2=80=94 it works. I have a simple example t=
hat can
be used for testing:
https://github.com/zHaOdANiuu/emacs-w32-draw-preedit.patch/blob/main/exampl=
e/ime-get.cpp
However, it only works in a simple w32 window. It has no effect inside
Emacs.
I don't know why it doesn't work in Emacs. Apparently, Vim's Windows
developers must have also encountered this problem =E2=80=94 they store a f=
ont
object of type HFONT globally, retrieve the data via the GetObject
function, and then set it with ImmSetCompositionFont.
This approach does work in Emacs. I obtained the font object via FRAME_FONT
(f) and got the HFONT handle using the FONT_HANDLE macro from w32font.h,
then set the font size =E2=80=94 and it works.
However, there is a problem: when zooming the UI in Emacs by holding Ctrl +
mouse wheel (C-mouse-wheel-text-scale), the font is zoomed, but the IME
window font does not zoom along with it. Similarly, I found that the
w32_system_caret_x and w32_system_caret_y variables are probably not
updated during UI scaling either, which causes the IME window to be offset
when the UI is zoomed significantly. Someone has told me that the same
issue exists on macOS.

When using this patch, to quickly see the effect, you can do the following:
```
runemacs.exe -Q --eval "(set-face-attribute 'default nil :height 200)"
--eval "(load-theme 'tango-dark t)"
```

--00000000000047e5010658085359
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div><span style=3D"background-color:transparent">I implem=
ented the fix for this issue based on Vim&#39;s approach. I tried using the=
 ImmGetCompositionFont API =E2=80=94 it works. I have a simple example that=
 can be used for testing:</span></div><div><a href=3D"https://github.com/zH=
aOdANiuu/emacs-w32-draw-preedit.patch/blob/main/example/ime-get.cpp">https:=
//github.com/zHaOdANiuu/emacs-w32-draw-preedit.patch/blob/main/example/ime-=
get.cpp</a><br>However, it only works in a simple w32 window. It has no eff=
ect inside Emacs.<br>I don&#39;t know why it doesn&#39;t work in Emacs. App=
arently, Vim&#39;s Windows developers must have also encountered this probl=
em =E2=80=94 they store a font object of type HFONT globally, retrieve the =
data via the GetObject function, and then set it with ImmSetCompositionFont=
.<br>This approach does work in Emacs. I obtained the font object via FRAME=
_FONT (f) and got the HFONT handle using the FONT_HANDLE macro from w32font=
.h, then set the font size =E2=80=94 and it works.<br>However, there is a p=
roblem: when zooming the UI in Emacs by holding Ctrl + mouse wheel (C-mouse=
-wheel-text-scale), the font is zoomed, but the IME window font does not zo=
om along with it. Similarly, I found that the w32_system_caret_x and w32_sy=
stem_caret_y variables are probably not updated during UI scaling either, w=
hich causes the IME window to be offset when the UI is zoomed significantly=
. Someone has told me that the same issue exists on macOS.<span style=3D"ba=
ckground-color:transparent"></span></div><div><span style=3D"background-col=
or:transparent"><br></span></div><div>When using this patch, to quickly see=
 the effect, you can do the following:</div><div><span style=3D"background-=
color:transparent">```</span></div><div>runemacs.exe -Q --eval &quot;(set-f=
ace-attribute &#39;default nil :height 200)&quot; --eval &quot;(load-theme =
&#39;tango-dark t)&quot;<span style=3D"background-color:transparent"></span=
></div><div>```</div></div>

--00000000000047e5010658085359--

--00000000000047e502065808535b
Content-Type: application/octet-stream; 
	name="0001-Set-the-IME-window-font-to-an-appropriate-size.patch"
Content-Disposition: attachment; 
	filename="0001-Set-the-IME-window-font-to-an-appropriate-size.patch"
Content-Transfer-Encoding: base64
Content-ID: <f_msb8mbbr0>
X-Attachment-Id: f_msb8mbbr0

RnJvbSAxNmM1Y2M4ODY2ZmJjOGFkNWE5MDY1NThlNzkxNjBiNTM3NmI1N2I5IE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiB6ZG4gPHpoYW9kYW5pdTFAZ21haWwuY29tPgpEYXRlOiBTdW4s
IDIgQXVnIDIwMjYgMTE6MDU6MDIgKzA4MDAKU3ViamVjdDogW1BBVENIXSBTZXQgdGhlIElNRSB3
aW5kb3cgZm9udCB0byBhbiBhcHByb3ByaWF0ZSBzaXplLgoKKiBzcmMvdzMyZm5zLmMgKHczMl93
bmRfcHJvYyk6IE9idGFpbiB0aGUgZm9udCBzdHJ1Y3QgdmlhIHRoZQpGUkFNRV9GT05UIG1hY3Jv
LCB0aGVuIGNvbnZlcnQgaXQgdG8gYW4gSEZPTlQgdmlhIEZPTlRfSEFORExFCnRvIHJldHJpZXZl
IHRoZSBmb250IGluZm9ybWF0aW9uIGFuZCBzZXQgdGhlIGZvbnQgYWNjb3JkaW5nbHkuCi0tLQog
c3JjL3czMmZucy5jIHwgMTMgKysrKysrKysrKysrKwogMSBmaWxlIGNoYW5nZWQsIDEzIGluc2Vy
dGlvbnMoKykKCmRpZmYgLS1naXQgYS9zcmMvdzMyZm5zLmMgYi9zcmMvdzMyZm5zLmMKaW5kZXgg
NzI2ZmU1Mi4uZDE3NWU1MyAxMDA2NDQKLS0tIGEvc3JjL3czMmZucy5jCisrKyBiL3NyYy93MzJm
bnMuYwpAQCAtNDcsNiArNDcsNyBAQCAjZGVmaW5lIENPQkpNQUNST1MgLyogQXNrIGZvciBDIGRl
ZmluaXRpb25zIGZvciBDT00uICAqLwogCiAjaW5jbHVkZSAibGlzcC5oIgogI2luY2x1ZGUgIncz
MnRlcm0uaCIKKyNpbmNsdWRlICJ3MzJmb250LmgiCiAjaW5jbHVkZSAiZnJhbWUuaCIKICNpbmNs
dWRlICJ3aW5kb3cuaCIKICNpbmNsdWRlICJidWZmZXIuaCIKQEAgLTIwMCw2ICsyMDEsOSBAQCAj
ZGVmaW5lIENDSERFVklDRU5BTUUgMzIKIHR5cGVkZWYgQk9PTCAoV0lOQVBJICogSW1tR2V0T3Bl
blN0YXR1c19Qcm9jKSAoSU4gSElNQyk7CiB0eXBlZGVmIEJPT0wgKFdJTkFQSSAqIEltbVNldE9w
ZW5TdGF0dXNfUHJvYykgKElOIEhJTUMsIElOIEJPT0wpOwogCisvKiBTZXQgSU1FIGZvbnQuICAq
LwordHlwZWRlZiBCT09MIChXSU5BUEkgKiBJbW1TZXRDb21wb3NpdGlvbkZvbnRfUHJvYykgKElO
IEhJTUMsIExQTE9HRk9OVFcgbHBsZik7CisKIHR5cGVkZWYgSE1PTklUT1IgKFdJTkFQSSAqIE1v
bml0b3JGcm9tUG9pbnRfUHJvYykgKElOIFBPSU5UIHB0LCBJTiBEV09SRCBmbGFncyk7CiB0eXBl
ZGVmIEJPT0wgKFdJTkFQSSAqIEdldE1vbml0b3JJbmZvX1Byb2MpCiAgIChJTiBITU9OSVRPUiBt
b25pdG9yLCBPVVQgc3RydWN0IE1PTklUT1JfSU5GTyogaW5mbyk7CkBAIC0yNDcsNiArMjUxLDcg
QEAgI2RlZmluZSBDQ0hERVZJQ0VOQU1FIDMyCiBzdGF0aWMgSW1tR2V0Q29udGV4dF9Qcm9jIGdl
dF9pbWVfY29udGV4dF9mbiA9IE5VTEw7CiBzdGF0aWMgSW1tR2V0T3BlblN0YXR1c19Qcm9jIGdl
dF9pbWVfb3Blbl9zdGF0dXNfZm4gPSBOVUxMOwogc3RhdGljIEltbVNldE9wZW5TdGF0dXNfUHJv
YyBzZXRfaW1lX29wZW5fc3RhdHVzX2ZuID0gTlVMTDsKK3N0YXRpYyBJbW1TZXRDb21wb3NpdGlv
bkZvbnRfUHJvYyBzZXRfaW1lX2NvbXBvc2l0aW9uX2ZvbnRfZm4gPSBOVUxMOwogc3RhdGljIElt
bVJlbGVhc2VDb250ZXh0X1Byb2MgcmVsZWFzZV9pbWVfY29udGV4dF9mbiA9IE5VTEw7CiBzdGF0
aWMgSW1tU2V0Q29tcG9zaXRpb25XaW5kb3dfUHJvYyBzZXRfaW1lX2NvbXBvc2l0aW9uX3dpbmRv
d19mbiA9IE5VTEw7CiBzdGF0aWMgTW9uaXRvckZyb21Qb2ludF9Qcm9jIG1vbml0b3JfZnJvbV9w
b2ludF9mbiA9IE5VTEw7CkBAIC01MDMyLDggKzUwMzcsMTAgQEAgdzMyX3duZF9wcm9jIChIV05E
IGh3bmQsIFVJTlQgbXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogICAgICAgZWxz
ZQogCXsKIAkgIENPTVBPU0lUSU9ORk9STSBmb3JtOworCSAgTE9HRk9OVFcgbGY7CiAJICBISU1D
IGNvbnRleHQ7CiAJICBzdHJ1Y3Qgd2luZG93ICp3OworCSAgc3RydWN0IGZvbnQgKmZvbnQ7CiAK
IAkgIC8qIEltcGxlbWVudGF0aW9uIG5vdGU6IFRoZSBjb2RlIGJlbG93IGRvZXMgc29tZXRoaW5n
IHRoYXQKIAkgICAgIG9uZSBzaG91bGRuJ3QgZG86IGl0IGFjY2Vzc2VzIHRoZSB3aW5kb3cgb2Jq
ZWN0IGZyb20gYQpAQCAtNTA3Nyw2ICs1MDg0LDkgQEAgdzMyX3duZF9wcm9jIChIV05EIGh3bmQs
IFVJTlQgbXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogCSAgaWYgKCFjb250ZXh0
KQogCSAgICBnb3RvIGRmbHQ7CiAKKwkgIGZvbnQgPSBGUkFNRV9GT05UIChmKTsKKwkgIEdldE9i
amVjdFcgKEZPTlRfSEFORExFIChmb250KSwgc2l6ZW9mIChsZiksICZsZik7CisJICBzZXRfaW1l
X2NvbXBvc2l0aW9uX2ZvbnRfZm4gKGNvbnRleHQsICZsZik7CiAJICBzZXRfaW1lX2NvbXBvc2l0
aW9uX3dpbmRvd19mbiAoY29udGV4dCwgJmZvcm0pOwogCSAgcmVsZWFzZV9pbWVfY29udGV4dF9m
biAoaHduZCwgY29udGV4dCk7CiAJfQpAQCAtMTIzMzIsNiArMTIzNDIsOSBAQCBnbG9iYWxzX29m
X3czMmZucyAodm9pZCkKICAgICAgIGdldF9wcm9jX2FkZHIgKGltbTMyX2xpYiwgIkltbUdldE9w
ZW5TdGF0dXMiKTsKICAgICBzZXRfaW1lX29wZW5fc3RhdHVzX2ZuID0gKEltbVNldE9wZW5TdGF0
dXNfUHJvYykKICAgICAgIGdldF9wcm9jX2FkZHIgKGltbTMyX2xpYiwgIkltbVNldE9wZW5TdGF0
dXMiKTsKKworICAgIHNldF9pbWVfY29tcG9zaXRpb25fZm9udF9mbiA9IChJbW1TZXRDb21wb3Np
dGlvbkZvbnRfUHJvYykKKyAgICAgIGdldF9wcm9jX2FkZHIgKGltbTMyX2xpYiwgIkltbVNldENv
bXBvc2l0aW9uRm9udFciKTsKICAgfQogCiAgIEhNT0RVTEUgaG1fa2VybmVsMzIgPSBHZXRNb2R1
bGVIYW5kbGUgKCJrZXJuZWwzMi5kbGwiKTsKLS0gCjIuNTQuMAoK
--00000000000047e502065808535b--