diff options
| author | Jason Rumney | 2008-01-17 11:38:45 +0000 |
|---|---|---|
| committer | Jason Rumney | 2008-01-17 11:38:45 +0000 |
| commit | 602e142f5cddd7b199abb16ee9db1aeaa6e01ea6 (patch) | |
| tree | 28713adfefb8158eec4b71b90a789292b0a299d4 | |
| parent | eddedb1594409e2eb4dc42840a72023190d0e716 (diff) | |
| download | emacs-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/ChangeLog | 7 | ||||
| -rw-r--r-- | src/w32term.c | 86 |
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 @@ | |||
| 1 | 2008-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 | |||
| 1 | 2008-01-17 Glenn Morris <rgm@gnu.org> | 8 | 2008-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 | ||