aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Rumney2008-01-17 11:38:45 +0000
committerJason Rumney2008-01-17 11:38:45 +0000
commit602e142f5cddd7b199abb16ee9db1aeaa6e01ea6 (patch)
tree28713adfefb8158eec4b71b90a789292b0a299d4
parenteddedb1594409e2eb4dc42840a72023190d0e716 (diff)
downloademacs-602e142f5cddd7b199abb16ee9db1aeaa6e01ea6.tar.gz
emacs-602e142f5cddd7b199abb16ee9db1aeaa6e01ea6.zip
(w32_read_socket) <WM_CHAR>: Decode characters outside
the unicode range available in MULE by locale-coding-system. Improve dbcs lead byte detection. Set event timestamp and modifiers earlier.
-rw-r--r--src/ChangeLog7
-rw-r--r--src/w32term.c86
2 files changed, 75 insertions, 18 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index ceea594199e..a2cb8c490a6 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,10 @@
12008-01-17 Jason Rumney <jasonr@gnu.org>
2
3 * w32term.c (w32_read_socket) <WM_CHAR>: Decode characters outside
4 the unicode range available in MULE by locale-coding-system.
5 Improve dbcs lead byte detection. Set event timestamp and modifiers
6 earlier.
7
12008-01-17 Glenn Morris <rgm@gnu.org> 82008-01-17 Glenn Morris <rgm@gnu.org>
2 9
3 * m/ibms390x.h (START_FILES, LIB_STANDARD): Adjust value according 10 * m/ibms390x.h (START_FILES, LIB_STANDARD): Adjust value according
diff --git a/src/w32term.c b/src/w32term.c
index a85715dbfb9..23b79008402 100644
--- a/src/w32term.c
+++ b/src/w32term.c
@@ -4290,6 +4290,10 @@ w32_read_socket (sd, expected, hold_quit)
4290 temp_index = 0; 4290 temp_index = 0;
4291 temp_buffer[temp_index++] = msg.msg.wParam; 4291 temp_buffer[temp_index++] = msg.msg.wParam;
4292 4292
4293 inev.modifiers = msg.dwModifiers;
4294 XSETFRAME (inev.frame_or_window, f);
4295 inev.timestamp = msg.msg.time;
4296
4293 if (msg.msg.wParam < 128 && !dbcs_lead) 4297 if (msg.msg.wParam < 128 && !dbcs_lead)
4294 { 4298 {
4295 inev.kind = ASCII_KEYSTROKE_EVENT; 4299 inev.kind = ASCII_KEYSTROKE_EVENT;
@@ -4298,20 +4302,14 @@ w32_read_socket (sd, expected, hold_quit)
4298 else if (msg.msg.wParam < 256) 4302 else if (msg.msg.wParam < 256)
4299 { 4303 {
4300 wchar_t code; 4304 wchar_t code;
4301 4305 char dbcs[2];
4302 inev.kind = MULTIBYTE_CHAR_KEYSTROKE_EVENT; 4306 inev.kind = MULTIBYTE_CHAR_KEYSTROKE_EVENT;
4307 dbcs[0] = 0;
4308 dbcs[1] = (char) msg.msg.wParam;
4303 4309
4304 if (IsDBCSLeadByteEx(CP_ACP, (BYTE) msg.msg.wParam)) 4310 if (dbcs_lead)
4305 {
4306 dbcs_lead = (char) msg.msg.wParam;
4307 inev.kind = NO_EVENT;
4308 break;
4309 }
4310 else if (dbcs_lead)
4311 { 4311 {
4312 char dbcs[2];
4313 dbcs[0] = dbcs_lead; 4312 dbcs[0] = dbcs_lead;
4314 dbcs[1] = (char) msg.msg.wParam;
4315 dbcs_lead = 0; 4313 dbcs_lead = 0;
4316 if (!MultiByteToWideChar(CP_ACP, 0, dbcs, 2, &code, 1)) 4314 if (!MultiByteToWideChar(CP_ACP, 0, dbcs, 2, &code, 1))
4317 { 4315 {
@@ -4322,14 +4320,19 @@ w32_read_socket (sd, expected, hold_quit)
4322 break; 4320 break;
4323 } 4321 }
4324 } 4322 }
4323 else if (IsDBCSLeadByteEx(CP_ACP, (BYTE) msg.msg.wParam))
4324 {
4325 dbcs_lead = (char) msg.msg.wParam;
4326 inev.kind = NO_EVENT;
4327 break;
4328 }
4325 else 4329 else
4326 { 4330 {
4327 char single_byte = (char) msg.msg.wParam; 4331 if (!MultiByteToWideChar(CP_ACP, 0, &dbcs[1], 1,
4328 if (!MultiByteToWideChar(CP_ACP, 0, &single_byte, 1,
4329 &code, 1)) 4332 &code, 1))
4330 { 4333 {
4331 /* What to do with garbage? */ 4334 /* What to do with garbage? */
4332 DebPrint (("Invalid character: %d\n", single_byte)); 4335 DebPrint (("Invalid character: %d\n", dbcs[1]));
4333 inev.kind = NO_EVENT; 4336 inev.kind = NO_EVENT;
4334 break; 4337 break;
4335 } 4338 }
@@ -4355,17 +4358,67 @@ w32_read_socket (sd, expected, hold_quit)
4355 charset_id = charset_mule_unicode_0100_24ff; 4358 charset_id = charset_mule_unicode_0100_24ff;
4356 code -= 0x100; 4359 code -= 0x100;
4357 } 4360 }
4358 else if (code < 0xE000) 4361 else if (code < 0x3400)
4359 { 4362 {
4360 charset_id = charset_mule_unicode_2500_33ff; 4363 charset_id = charset_mule_unicode_2500_33ff;
4361 code -= 0x2500; 4364 code -= 0x2500;
4362 } 4365 }
4363 else 4366 else if (code >= 0xE000)
4364 { 4367 {
4365 charset_id = charset_mule_unicode_e000_ffff; 4368 charset_id = charset_mule_unicode_e000_ffff;
4366 code -= 0xE000; 4369 code -= 0xE000;
4367 } 4370 }
4371 else
4372 {
4373 /* Not in the unicode range that we can handle in
4374 Emacs-22, so decode the original character
4375 using the locale */
4376 int nbytes, nchars, require, i, len;
4377 unsigned char *dest;
4378 struct coding_system coding;
4379
4380 if (dbcs[0] == 0)
4381 {
4382 nbytes = 1;
4383 dbcs[0] = dbcs[1];
4384 }
4385 else
4386 nbytes = 2;
4387
4388 setup_coding_system (Vlocale_coding_system, &coding);
4389 coding.src_multibyte = 0;
4390 coding.dst_multibyte = 1;
4391 coding.composing = COMPOSITION_DISABLED;
4392 require = decoding_buffer_size (&coding, nbytes);
4393 dest = (unsigned char *) alloca (require);
4394 coding.mode |= CODING_MODE_LAST_BLOCK;
4395
4396 decode_coding (&coding, dbcs, dest, nbytes, require);
4397 nbytes = coding.produced;
4398 nchars = coding.produced_char;
4399
4400 for (i = 0; i < nbytes; i += len)
4401 {
4402 if (nchars == nbytes)
4403 {
4404 inev.code = dest[i];
4405 len = 1;
4406 }
4407 else
4408 inev.code = STRING_CHAR_AND_LENGTH (dest + i,
4409 nbytes - 1,
4410 len);
4411 inev.kind = (SINGLE_BYTE_CHAR_P (inev.code)
4412 ? ASCII_KEYSTROKE_EVENT
4413 : MULTIBYTE_CHAR_KEYSTROKE_EVENT);
4414 kbd_buffer_store_event_hold (&inev, hold_quit);
4415 count++;
4416 }
4417 inev.kind = NO_EVENT; /* Already handled */
4418 break;
4419 }
4368 4420
4421 /* Unicode characters from above. */
4369 c1 = (code / 96) + 32; 4422 c1 = (code / 96) + 32;
4370 c2 = (code % 96) + 32; 4423 c2 = (code % 96) + 32;
4371 inev.code = MAKE_CHAR (charset_id, c1, c2); 4424 inev.code = MAKE_CHAR (charset_id, c1, c2);
@@ -4379,9 +4432,6 @@ w32_read_socket (sd, expected, hold_quit)
4379 inev.kind = NO_EVENT; 4432 inev.kind = NO_EVENT;
4380 break; 4433 break;
4381 } 4434 }
4382 inev.modifiers = msg.dwModifiers;
4383 XSETFRAME (inev.frame_or_window, f);
4384 inev.timestamp = msg.msg.time;
4385 } 4435 }
4386 break; 4436 break;
4387 4437