diff options
| author | Yuan Fu | 2022-10-05 14:22:03 -0700 |
|---|---|---|
| committer | Yuan Fu | 2022-10-05 14:22:03 -0700 |
| commit | 7ebbd4efc3d45403cf845d35c36c21756baeeba8 (patch) | |
| tree | f53223ce7dbd64c079aced6e1a77964d1a8eaa3f /src | |
| parent | cb183f6467401fb5ed2b7fc98ca75be9d943cbe3 (diff) | |
| parent | 95efafb72664049f8ac825047df3645656cf76f4 (diff) | |
| download | emacs-7ebbd4efc3d45403cf845d35c36c21756baeeba8.tar.gz emacs-7ebbd4efc3d45403cf845d35c36c21756baeeba8.zip | |
Merge branch 'master' into feature/tree-sitter
Diffstat (limited to 'src')
70 files changed, 3567 insertions, 2099 deletions
diff --git a/src/alloc.c b/src/alloc.c index ced7c73cba7..a8b57add60e 100644 --- a/src/alloc.c +++ b/src/alloc.c | |||
| @@ -5388,7 +5388,7 @@ void | |||
| 5388 | check_pure_size (void) | 5388 | check_pure_size (void) |
| 5389 | { | 5389 | { |
| 5390 | if (pure_bytes_used_before_overflow) | 5390 | if (pure_bytes_used_before_overflow) |
| 5391 | message (("emacs:0:Pure Lisp storage overflow (approx. %"pI"d" | 5391 | message (("emacs:0:Pure Lisp storage overflow (approx. %jd" |
| 5392 | " bytes needed)"), | 5392 | " bytes needed)"), |
| 5393 | pure_bytes_used + pure_bytes_used_before_overflow); | 5393 | pure_bytes_used + pure_bytes_used_before_overflow); |
| 5394 | } | 5394 | } |
diff --git a/src/bytecode.c b/src/bytecode.c index d75767bb0c5..c765e1be2bc 100644 --- a/src/bytecode.c +++ b/src/bytecode.c | |||
| @@ -1431,7 +1431,7 @@ exec_byte_code (Lisp_Object fun, ptrdiff_t args_template, | |||
| 1431 | NEXT; | 1431 | NEXT; |
| 1432 | 1432 | ||
| 1433 | CASE (Binteractive_p): /* Obsolete since 24.1. */ | 1433 | CASE (Binteractive_p): /* Obsolete since 24.1. */ |
| 1434 | PUSH (call0 (intern ("interactive-p"))); | 1434 | PUSH (call0 (Qinteractive_p)); |
| 1435 | NEXT; | 1435 | NEXT; |
| 1436 | 1436 | ||
| 1437 | CASE (Bforward_char): | 1437 | CASE (Bforward_char): |
| @@ -1749,6 +1749,8 @@ get_byte_code_arity (Lisp_Object args_template) | |||
| 1749 | void | 1749 | void |
| 1750 | syms_of_bytecode (void) | 1750 | syms_of_bytecode (void) |
| 1751 | { | 1751 | { |
| 1752 | DEFSYM (Qinteractive_p, "interactive-p"); | ||
| 1753 | |||
| 1752 | defsubr (&Sbyte_code); | 1754 | defsubr (&Sbyte_code); |
| 1753 | defsubr (&Sinternal_stack_stats); | 1755 | defsubr (&Sinternal_stack_stats); |
| 1754 | 1756 | ||
diff --git a/src/character.c b/src/character.c index 968daccafa7..5df49adade9 100644 --- a/src/character.c +++ b/src/character.c | |||
| @@ -178,12 +178,16 @@ usage: (characterp OBJECT) */ | |||
| 178 | return (CHARACTERP (object) ? Qt : Qnil); | 178 | return (CHARACTERP (object) ? Qt : Qnil); |
| 179 | } | 179 | } |
| 180 | 180 | ||
| 181 | DEFUN ("max-char", Fmax_char, Smax_char, 0, 0, 0, | 181 | DEFUN ("max-char", Fmax_char, Smax_char, 0, 1, 0, |
| 182 | doc: /* Return the character of the maximum code. */ | 182 | doc: /* Return the maximum character code. |
| 183 | If UNICODE is non-nil, return the maximum character code defined | ||
| 184 | by the Unicode Standard. */ | ||
| 183 | attributes: const) | 185 | attributes: const) |
| 184 | (void) | 186 | (Lisp_Object unicode) |
| 185 | { | 187 | { |
| 186 | return make_fixnum (MAX_CHAR); | 188 | return (!NILP (unicode) |
| 189 | ? make_fixnum (MAX_UNICODE_CHAR) | ||
| 190 | : make_fixnum (MAX_CHAR)); | ||
| 187 | } | 191 | } |
| 188 | 192 | ||
| 189 | DEFUN ("unibyte-char-to-multibyte", Funibyte_char_to_multibyte, | 193 | DEFUN ("unibyte-char-to-multibyte", Funibyte_char_to_multibyte, |
diff --git a/src/coding.c b/src/coding.c index 0ae8eb3282b..ab73bda8440 100644 --- a/src/coding.c +++ b/src/coding.c | |||
| @@ -12014,9 +12014,9 @@ See also the function `find-operation-coding-system'. */); | |||
| 12014 | Vnetwork_coding_system_alist = Qnil; | 12014 | Vnetwork_coding_system_alist = Qnil; |
| 12015 | 12015 | ||
| 12016 | DEFVAR_LISP ("locale-coding-system", Vlocale_coding_system, | 12016 | DEFVAR_LISP ("locale-coding-system", Vlocale_coding_system, |
| 12017 | doc: /* Coding system to use with system messages. | 12017 | doc: /* Coding system to use with system messages. |
| 12018 | Also used for decoding keyboard input on X Window system, and for | 12018 | Potentially also used for decoding keyboard input on X Windows, and is |
| 12019 | encoding standard output and error streams. */); | 12019 | used for encoding standard output and error streams. */); |
| 12020 | Vlocale_coding_system = Qnil; | 12020 | Vlocale_coding_system = Qnil; |
| 12021 | 12021 | ||
| 12022 | /* The eol mnemonics are reset in startup.el system-dependently. */ | 12022 | /* The eol mnemonics are reset in startup.el system-dependently. */ |
diff --git a/src/comp.c b/src/comp.c index 70e7d5a8bbf..b7541c5d9f7 100644 --- a/src/comp.c +++ b/src/comp.c | |||
| @@ -68,6 +68,7 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ | |||
| 68 | #undef gcc_jit_context_get_type | 68 | #undef gcc_jit_context_get_type |
| 69 | #undef gcc_jit_context_new_array_access | 69 | #undef gcc_jit_context_new_array_access |
| 70 | #undef gcc_jit_context_new_array_type | 70 | #undef gcc_jit_context_new_array_type |
| 71 | #undef gcc_jit_context_new_bitcast | ||
| 71 | #undef gcc_jit_context_new_binary_op | 72 | #undef gcc_jit_context_new_binary_op |
| 72 | #undef gcc_jit_context_new_call | 73 | #undef gcc_jit_context_new_call |
| 73 | #undef gcc_jit_context_new_call_through_ptr | 74 | #undef gcc_jit_context_new_call_through_ptr |
| @@ -108,6 +109,7 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ | |||
| 108 | #undef gcc_jit_struct_set_fields | 109 | #undef gcc_jit_struct_set_fields |
| 109 | #undef gcc_jit_type_get_const | 110 | #undef gcc_jit_type_get_const |
| 110 | #undef gcc_jit_type_get_pointer | 111 | #undef gcc_jit_type_get_pointer |
| 112 | #undef gcc_jit_type_is_pointer | ||
| 111 | #undef gcc_jit_version_major | 113 | #undef gcc_jit_version_major |
| 112 | #undef gcc_jit_version_minor | 114 | #undef gcc_jit_version_minor |
| 113 | #undef gcc_jit_version_patchlevel | 115 | #undef gcc_jit_version_patchlevel |
| @@ -180,8 +182,13 @@ DEF_DLL_FN (gcc_jit_rvalue *, gcc_jit_context_new_call_through_ptr, | |||
| 180 | (gcc_jit_context *ctxt, gcc_jit_location *loc, | 182 | (gcc_jit_context *ctxt, gcc_jit_location *loc, |
| 181 | gcc_jit_rvalue *fn_ptr, int numargs, gcc_jit_rvalue **args)); | 183 | gcc_jit_rvalue *fn_ptr, int numargs, gcc_jit_rvalue **args)); |
| 182 | DEF_DLL_FN (gcc_jit_rvalue *, gcc_jit_context_new_cast, | 184 | DEF_DLL_FN (gcc_jit_rvalue *, gcc_jit_context_new_cast, |
| 185 | (gcc_jit_context * ctxt, gcc_jit_location *loc, | ||
| 186 | gcc_jit_rvalue *rvalue, gcc_jit_type *type)); | ||
| 187 | #ifdef LIBGCCJIT_HAVE_gcc_jit_context_new_bitcast | ||
| 188 | DEF_DLL_FN (gcc_jit_rvalue *, gcc_jit_context_new_bitcast, | ||
| 183 | (gcc_jit_context *ctxt, gcc_jit_location *loc, | 189 | (gcc_jit_context *ctxt, gcc_jit_location *loc, |
| 184 | gcc_jit_rvalue *rvalue, gcc_jit_type *type)); | 190 | gcc_jit_rvalue *rvalue, gcc_jit_type *type)); |
| 191 | #endif | ||
| 185 | DEF_DLL_FN (gcc_jit_rvalue *, gcc_jit_context_new_comparison, | 192 | DEF_DLL_FN (gcc_jit_rvalue *, gcc_jit_context_new_comparison, |
| 186 | (gcc_jit_context *ctxt, gcc_jit_location *loc, | 193 | (gcc_jit_context *ctxt, gcc_jit_location *loc, |
| 187 | enum gcc_jit_comparison op, gcc_jit_rvalue *a, gcc_jit_rvalue *b)); | 194 | enum gcc_jit_comparison op, gcc_jit_rvalue *a, gcc_jit_rvalue *b)); |
| @@ -224,6 +231,9 @@ DEF_DLL_FN (gcc_jit_type *, gcc_jit_struct_as_type, | |||
| 224 | (gcc_jit_struct *struct_type)); | 231 | (gcc_jit_struct *struct_type)); |
| 225 | DEF_DLL_FN (gcc_jit_type *, gcc_jit_type_get_const, (gcc_jit_type *type)); | 232 | DEF_DLL_FN (gcc_jit_type *, gcc_jit_type_get_const, (gcc_jit_type *type)); |
| 226 | DEF_DLL_FN (gcc_jit_type *, gcc_jit_type_get_pointer, (gcc_jit_type *type)); | 233 | DEF_DLL_FN (gcc_jit_type *, gcc_jit_type_get_pointer, (gcc_jit_type *type)); |
| 234 | #ifdef LIBGCCJIT_HAVE_REFLECTION | ||
| 235 | DEF_DLL_FN (gcc_jit_type *, gcc_jit_type_is_pointer, (gcc_jit_type *type)); | ||
| 236 | #endif | ||
| 227 | DEF_DLL_FN (void, gcc_jit_block_add_assignment, | 237 | DEF_DLL_FN (void, gcc_jit_block_add_assignment, |
| 228 | (gcc_jit_block *block, gcc_jit_location *loc, gcc_jit_lvalue *lvalue, | 238 | (gcc_jit_block *block, gcc_jit_location *loc, gcc_jit_lvalue *lvalue, |
| 229 | gcc_jit_rvalue *rvalue)); | 239 | gcc_jit_rvalue *rvalue)); |
| @@ -293,6 +303,9 @@ init_gccjit_functions (void) | |||
| 293 | LOAD_DLL_FN (library, gcc_jit_context_get_type); | 303 | LOAD_DLL_FN (library, gcc_jit_context_get_type); |
| 294 | LOAD_DLL_FN (library, gcc_jit_context_new_array_access); | 304 | LOAD_DLL_FN (library, gcc_jit_context_new_array_access); |
| 295 | LOAD_DLL_FN (library, gcc_jit_context_new_array_type); | 305 | LOAD_DLL_FN (library, gcc_jit_context_new_array_type); |
| 306 | #ifdef LIBGCCJIT_HAVE_gcc_jit_context_new_bitcast | ||
| 307 | LOAD_DLL_FN (library, gcc_jit_context_new_bitcast); | ||
| 308 | #endif | ||
| 296 | LOAD_DLL_FN (library, gcc_jit_context_new_binary_op); | 309 | LOAD_DLL_FN (library, gcc_jit_context_new_binary_op); |
| 297 | LOAD_DLL_FN (library, gcc_jit_context_new_call); | 310 | LOAD_DLL_FN (library, gcc_jit_context_new_call); |
| 298 | LOAD_DLL_FN (library, gcc_jit_context_new_call_through_ptr); | 311 | LOAD_DLL_FN (library, gcc_jit_context_new_call_through_ptr); |
| @@ -334,6 +347,9 @@ init_gccjit_functions (void) | |||
| 334 | LOAD_DLL_FN (library, gcc_jit_struct_set_fields); | 347 | LOAD_DLL_FN (library, gcc_jit_struct_set_fields); |
| 335 | LOAD_DLL_FN (library, gcc_jit_type_get_const); | 348 | LOAD_DLL_FN (library, gcc_jit_type_get_const); |
| 336 | LOAD_DLL_FN (library, gcc_jit_type_get_pointer); | 349 | LOAD_DLL_FN (library, gcc_jit_type_get_pointer); |
| 350 | #ifdef LIBGCCJIT_HAVE_REFLECTION | ||
| 351 | LOAD_DLL_FN (library, gcc_jit_type_is_pointer); | ||
| 352 | #endif | ||
| 337 | LOAD_DLL_FN_OPT (library, gcc_jit_context_add_command_line_option); | 353 | LOAD_DLL_FN_OPT (library, gcc_jit_context_add_command_line_option); |
| 338 | LOAD_DLL_FN_OPT (library, gcc_jit_context_add_driver_option); | 354 | LOAD_DLL_FN_OPT (library, gcc_jit_context_add_driver_option); |
| 339 | #if defined (LIBGCCJIT_HAVE_gcc_jit_global_set_initializer) | 355 | #if defined (LIBGCCJIT_HAVE_gcc_jit_global_set_initializer) |
| @@ -368,6 +384,9 @@ init_gccjit_functions (void) | |||
| 368 | #define gcc_jit_context_get_type fn_gcc_jit_context_get_type | 384 | #define gcc_jit_context_get_type fn_gcc_jit_context_get_type |
| 369 | #define gcc_jit_context_new_array_access fn_gcc_jit_context_new_array_access | 385 | #define gcc_jit_context_new_array_access fn_gcc_jit_context_new_array_access |
| 370 | #define gcc_jit_context_new_array_type fn_gcc_jit_context_new_array_type | 386 | #define gcc_jit_context_new_array_type fn_gcc_jit_context_new_array_type |
| 387 | #ifdef LIBGCCJIT_HAVE_gcc_jit_context_new_bitcast | ||
| 388 | # define gcc_jit_context_new_bitcast fn_gcc_jit_context_new_bitcast | ||
| 389 | #endif | ||
| 371 | #define gcc_jit_context_new_binary_op fn_gcc_jit_context_new_binary_op | 390 | #define gcc_jit_context_new_binary_op fn_gcc_jit_context_new_binary_op |
| 372 | #define gcc_jit_context_new_call fn_gcc_jit_context_new_call | 391 | #define gcc_jit_context_new_call fn_gcc_jit_context_new_call |
| 373 | #define gcc_jit_context_new_call_through_ptr fn_gcc_jit_context_new_call_through_ptr | 392 | #define gcc_jit_context_new_call_through_ptr fn_gcc_jit_context_new_call_through_ptr |
| @@ -410,6 +429,9 @@ init_gccjit_functions (void) | |||
| 410 | #define gcc_jit_rvalue_get_type fn_gcc_jit_rvalue_get_type | 429 | #define gcc_jit_rvalue_get_type fn_gcc_jit_rvalue_get_type |
| 411 | #define gcc_jit_struct_as_type fn_gcc_jit_struct_as_type | 430 | #define gcc_jit_struct_as_type fn_gcc_jit_struct_as_type |
| 412 | #define gcc_jit_struct_set_fields fn_gcc_jit_struct_set_fields | 431 | #define gcc_jit_struct_set_fields fn_gcc_jit_struct_set_fields |
| 432 | #ifdef LIBGCCJIT_HAVE_REFLECTION | ||
| 433 | # define gcc_jit_type_is_pointer fn_gcc_jit_type_is_pointer | ||
| 434 | #endif | ||
| 413 | #define gcc_jit_type_get_const fn_gcc_jit_type_get_const | 435 | #define gcc_jit_type_get_const fn_gcc_jit_type_get_const |
| 414 | #define gcc_jit_type_get_pointer fn_gcc_jit_type_get_pointer | 436 | #define gcc_jit_type_get_pointer fn_gcc_jit_type_get_pointer |
| 415 | #if defined (LIBGCCJIT_HAVE_gcc_jit_version) | 437 | #if defined (LIBGCCJIT_HAVE_gcc_jit_version) |
| @@ -518,7 +540,9 @@ typedef struct { | |||
| 518 | 540 | ||
| 519 | static f_reloc_t freloc; | 541 | static f_reloc_t freloc; |
| 520 | 542 | ||
| 521 | #define NUM_CAST_TYPES 15 | 543 | #ifndef LIBGCCJIT_HAVE_gcc_jit_context_new_bitcast |
| 544 | # define NUM_CAST_TYPES 15 | ||
| 545 | #endif | ||
| 522 | 546 | ||
| 523 | typedef struct { | 547 | typedef struct { |
| 524 | EMACS_INT len; | 548 | EMACS_INT len; |
| @@ -593,13 +617,15 @@ typedef struct { | |||
| 593 | gcc_jit_rvalue *current_thread_ref; | 617 | gcc_jit_rvalue *current_thread_ref; |
| 594 | /* Other globals. */ | 618 | /* Other globals. */ |
| 595 | gcc_jit_rvalue *pure_ptr; | 619 | gcc_jit_rvalue *pure_ptr; |
| 596 | /* libgccjit has really limited support for casting therefore this union will | 620 | #ifndef LIBGCCJIT_HAVE_gcc_jit_context_new_bitcast |
| 597 | be used for the scope. */ | 621 | /* This version of libgccjit has really limited support for casting |
| 622 | therefore this union will be used for the scope. */ | ||
| 598 | gcc_jit_type *cast_union_type; | 623 | gcc_jit_type *cast_union_type; |
| 599 | gcc_jit_function *cast_functions_from_to[NUM_CAST_TYPES][NUM_CAST_TYPES]; | 624 | gcc_jit_function *cast_functions_from_to[NUM_CAST_TYPES][NUM_CAST_TYPES]; |
| 600 | gcc_jit_function *cast_ptr_to_int; | 625 | gcc_jit_function *cast_ptr_to_int; |
| 601 | gcc_jit_function *cast_int_to_ptr; | 626 | gcc_jit_function *cast_int_to_ptr; |
| 602 | gcc_jit_type *cast_types[NUM_CAST_TYPES]; | 627 | gcc_jit_type *cast_types[NUM_CAST_TYPES]; |
| 628 | #endif | ||
| 603 | gcc_jit_function *func; /* Current function being compiled. */ | 629 | gcc_jit_function *func; /* Current function being compiled. */ |
| 604 | bool func_has_non_local; /* From comp-func has-non-local slot. */ | 630 | bool func_has_non_local; /* From comp-func has-non-local slot. */ |
| 605 | EMACS_INT func_speed; /* From comp-func speed slot. */ | 631 | EMACS_INT func_speed; /* From comp-func speed slot. */ |
| @@ -1100,6 +1126,7 @@ emit_cond_jump (gcc_jit_rvalue *test, | |||
| 1100 | 1126 | ||
| 1101 | } | 1127 | } |
| 1102 | 1128 | ||
| 1129 | #ifndef LIBGCCJIT_HAVE_gcc_jit_context_new_bitcast | ||
| 1103 | static int | 1130 | static int |
| 1104 | type_to_cast_index (gcc_jit_type * type) | 1131 | type_to_cast_index (gcc_jit_type * type) |
| 1105 | { | 1132 | { |
| @@ -1109,6 +1136,7 @@ type_to_cast_index (gcc_jit_type * type) | |||
| 1109 | 1136 | ||
| 1110 | xsignal1 (Qnative_ice, build_string ("unsupported cast")); | 1137 | xsignal1 (Qnative_ice, build_string ("unsupported cast")); |
| 1111 | } | 1138 | } |
| 1139 | #endif | ||
| 1112 | 1140 | ||
| 1113 | static gcc_jit_rvalue * | 1141 | static gcc_jit_rvalue * |
| 1114 | emit_coerce (gcc_jit_type *new_type, gcc_jit_rvalue *obj) | 1142 | emit_coerce (gcc_jit_type *new_type, gcc_jit_rvalue *obj) |
| @@ -1145,14 +1173,48 @@ emit_coerce (gcc_jit_type *new_type, gcc_jit_rvalue *obj) | |||
| 1145 | } | 1173 | } |
| 1146 | #endif | 1174 | #endif |
| 1147 | 1175 | ||
| 1176 | #ifdef LIBGCCJIT_HAVE_gcc_jit_context_new_bitcast | ||
| 1177 | bool old_is_ptr = gcc_jit_type_is_pointer (old_type) != NULL; | ||
| 1178 | bool new_is_ptr = gcc_jit_type_is_pointer (new_type) != NULL; | ||
| 1179 | |||
| 1180 | gcc_jit_rvalue *tmp = obj; | ||
| 1181 | |||
| 1182 | /* `gcc_jit_context_new_bitcast` requires that the types being converted | ||
| 1183 | between have the same layout and as such, doesn't allow converting | ||
| 1184 | between an arbitrarily sized integer/boolean and a pointer. Casting it | ||
| 1185 | to a uintptr/void* is still necessary, to ensure that it can be bitcast | ||
| 1186 | into a (void *)/uintptr respectively. */ | ||
| 1187 | if (old_is_ptr != new_is_ptr) | ||
| 1188 | { | ||
| 1189 | if (old_is_ptr) | ||
| 1190 | { | ||
| 1191 | tmp = gcc_jit_context_new_cast (comp.ctxt, NULL, tmp, | ||
| 1192 | comp.void_ptr_type); | ||
| 1193 | tmp = gcc_jit_context_new_bitcast (comp.ctxt, NULL, tmp, | ||
| 1194 | comp.uintptr_type); | ||
| 1195 | } | ||
| 1196 | else | ||
| 1197 | { | ||
| 1198 | tmp = gcc_jit_context_new_cast (comp.ctxt, NULL, tmp, | ||
| 1199 | comp.uintptr_type); | ||
| 1200 | tmp = gcc_jit_context_new_bitcast (comp.ctxt, NULL, tmp, | ||
| 1201 | comp.void_ptr_type); | ||
| 1202 | } | ||
| 1203 | } | ||
| 1204 | return gcc_jit_context_new_cast (comp.ctxt, NULL, tmp, new_type); | ||
| 1205 | |||
| 1206 | #else /* !LIBGCCJIT_HAVE_gcc_jit_context_new_bitcast */ | ||
| 1207 | |||
| 1148 | int old_index = type_to_cast_index (old_type); | 1208 | int old_index = type_to_cast_index (old_type); |
| 1149 | int new_index = type_to_cast_index (new_type); | 1209 | int new_index = type_to_cast_index (new_type); |
| 1150 | 1210 | ||
| 1151 | /* Lookup the appropriate cast function in the cast matrix. */ | 1211 | /* Lookup the appropriate cast function in the cast matrix. */ |
| 1152 | return gcc_jit_context_new_call (comp.ctxt, | 1212 | return gcc_jit_context_new_call (comp.ctxt, |
| 1153 | NULL, | 1213 | NULL, |
| 1154 | comp.cast_functions_from_to[old_index][new_index], | 1214 | comp.cast_functions_from_to |
| 1155 | 1, &obj); | 1215 | [old_index][new_index], |
| 1216 | 1, &obj); | ||
| 1217 | #endif | ||
| 1156 | } | 1218 | } |
| 1157 | 1219 | ||
| 1158 | static gcc_jit_rvalue * | 1220 | static gcc_jit_rvalue * |
| @@ -3318,6 +3380,7 @@ define_thread_state_struct (void) | |||
| 3318 | gcc_jit_type_get_pointer (gcc_jit_struct_as_type (comp.thread_state_s)); | 3380 | gcc_jit_type_get_pointer (gcc_jit_struct_as_type (comp.thread_state_s)); |
| 3319 | } | 3381 | } |
| 3320 | 3382 | ||
| 3383 | #ifndef LIBGCCJIT_HAVE_gcc_jit_context_new_bitcast | ||
| 3321 | static gcc_jit_function * | 3384 | static gcc_jit_function * |
| 3322 | define_type_punning (const char *name, | 3385 | define_type_punning (const char *name, |
| 3323 | gcc_jit_type *from, gcc_jit_field *from_field, | 3386 | gcc_jit_type *from, gcc_jit_field *from_field, |
| @@ -3451,6 +3514,7 @@ define_cast_functions (void) | |||
| 3451 | comp.void_ptr_type, | 3514 | comp.void_ptr_type, |
| 3452 | cast_union_fields[0]); | 3515 | cast_union_fields[0]); |
| 3453 | 3516 | ||
| 3517 | |||
| 3454 | for (int i = 0; i < NUM_CAST_TYPES; ++i) | 3518 | for (int i = 0; i < NUM_CAST_TYPES; ++i) |
| 3455 | comp.cast_types[i] = cast_types[i].type; | 3519 | comp.cast_types[i] = cast_types[i].type; |
| 3456 | 3520 | ||
| @@ -3460,6 +3524,7 @@ define_cast_functions (void) | |||
| 3460 | comp.cast_functions_from_to[i][j] = | 3524 | comp.cast_functions_from_to[i][j] = |
| 3461 | define_cast_from_to (cast_types[i], cast_types[j]); | 3525 | define_cast_from_to (cast_types[i], cast_types[j]); |
| 3462 | } | 3526 | } |
| 3527 | #endif /* !LIBGCCJIT_HAVE_gcc_jit_context_new_bitcast */ | ||
| 3463 | 3528 | ||
| 3464 | static void | 3529 | static void |
| 3465 | define_CHECK_TYPE (void) | 3530 | define_CHECK_TYPE (void) |
| @@ -4467,7 +4532,7 @@ the latter is supposed to be used by the Emacs build procedure. */) | |||
| 4467 | } | 4532 | } |
| 4468 | if (NILP (base_dir)) | 4533 | if (NILP (base_dir)) |
| 4469 | error ("Cannot find suitable directory for output in " | 4534 | error ("Cannot find suitable directory for output in " |
| 4470 | "`comp-native-load-path'."); | 4535 | "`native-comp-eln-load-path'."); |
| 4471 | } | 4536 | } |
| 4472 | 4537 | ||
| 4473 | if (!file_name_absolute_p (SSDATA (base_dir))) | 4538 | if (!file_name_absolute_p (SSDATA (base_dir))) |
| @@ -4660,7 +4725,9 @@ Return t on success. */) | |||
| 4660 | define_jmp_buf (); | 4725 | define_jmp_buf (); |
| 4661 | define_handler_struct (); | 4726 | define_handler_struct (); |
| 4662 | define_thread_state_struct (); | 4727 | define_thread_state_struct (); |
| 4728 | #ifndef LIBGCCJIT_HAVE_gcc_jit_context_new_bitcast | ||
| 4663 | define_cast_functions (); | 4729 | define_cast_functions (); |
| 4730 | #endif | ||
| 4664 | 4731 | ||
| 4665 | return Qt; | 4732 | return Qt; |
| 4666 | } | 4733 | } |
| @@ -5107,6 +5174,7 @@ maybe_defer_native_compilation (Lisp_Object function_name, | |||
| 5107 | return; | 5174 | return; |
| 5108 | 5175 | ||
| 5109 | if (!native_comp_deferred_compilation | 5176 | if (!native_comp_deferred_compilation |
| 5177 | || !NILP (Vinhibit_automatic_native_compilation) | ||
| 5110 | || noninteractive | 5178 | || noninteractive |
| 5111 | || !NILP (Vpurify_flag) | 5179 | || !NILP (Vpurify_flag) |
| 5112 | || !COMPILEDP (definition) | 5180 | || !COMPILEDP (definition) |
| @@ -5610,6 +5678,14 @@ For internal use. */); | |||
| 5610 | doc: /* Non-nil when comp.el can be native compiled. | 5678 | doc: /* Non-nil when comp.el can be native compiled. |
| 5611 | For internal use. */); | 5679 | For internal use. */); |
| 5612 | /* Compiler control customizes. */ | 5680 | /* Compiler control customizes. */ |
| 5681 | DEFVAR_LISP ("inhibit-automatic-native-compilation", | ||
| 5682 | Vinhibit_automatic_native_compilation, | ||
| 5683 | doc: /* If non-nil, inhibit automatic native compilation of loaded .elc files. | ||
| 5684 | |||
| 5685 | After compilation, each function definition is updated to the native | ||
| 5686 | compiled one. */); | ||
| 5687 | Vinhibit_automatic_native_compilation = Qnil; | ||
| 5688 | |||
| 5613 | DEFVAR_BOOL ("native-comp-deferred-compilation", | 5689 | DEFVAR_BOOL ("native-comp-deferred-compilation", |
| 5614 | native_comp_deferred_compilation, | 5690 | native_comp_deferred_compilation, |
| 5615 | doc: /* If non-nil compile loaded .elc files asynchronously. | 5691 | doc: /* If non-nil compile loaded .elc files asynchronously. |
diff --git a/src/composite.c b/src/composite.c index 22422cca090..6b256171ac7 100644 --- a/src/composite.c +++ b/src/composite.c | |||
| @@ -800,6 +800,53 @@ composition_gstring_width (Lisp_Object gstring, ptrdiff_t from, ptrdiff_t to, | |||
| 800 | return width; | 800 | return width; |
| 801 | } | 801 | } |
| 802 | 802 | ||
| 803 | /* Adjust the width of each grapheme cluster of GSTRING because | ||
| 804 | zero-width grapheme clusters are not displayed. If the width is | ||
| 805 | zero, then the width of the last glyph in the cluster is | ||
| 806 | incremented. */ | ||
| 807 | |||
| 808 | void | ||
| 809 | composition_gstring_adjust_zero_width (Lisp_Object gstring) | ||
| 810 | { | ||
| 811 | ptrdiff_t from = 0; | ||
| 812 | int width = 0; | ||
| 813 | |||
| 814 | for (ptrdiff_t i = 0; ; i++) | ||
| 815 | { | ||
| 816 | Lisp_Object glyph; | ||
| 817 | |||
| 818 | if (i < LGSTRING_GLYPH_LEN (gstring)) | ||
| 819 | glyph = LGSTRING_GLYPH (gstring, i); | ||
| 820 | else | ||
| 821 | glyph = Qnil; | ||
| 822 | |||
| 823 | if (NILP (glyph) || from != LGLYPH_FROM (glyph)) | ||
| 824 | { | ||
| 825 | eassert (i > 0); | ||
| 826 | Lisp_Object last = LGSTRING_GLYPH (gstring, i - 1); | ||
| 827 | |||
| 828 | if (width == 0) | ||
| 829 | { | ||
| 830 | if (NILP (LGLYPH_ADJUSTMENT (last))) | ||
| 831 | LGLYPH_SET_ADJUSTMENT (last, | ||
| 832 | CALLN (Fvector, | ||
| 833 | make_fixnum (0), make_fixnum (0), | ||
| 834 | make_fixnum (LGLYPH_WIDTH (last) | ||
| 835 | + 1))); | ||
| 836 | else | ||
| 837 | ASET (LGLYPH_ADJUSTMENT (last), 2, | ||
| 838 | make_fixnum (LGLYPH_WADJUST (last) + 1)); | ||
| 839 | } | ||
| 840 | if (NILP (glyph)) | ||
| 841 | break; | ||
| 842 | from = LGLYPH_FROM (glyph); | ||
| 843 | width = 0; | ||
| 844 | } | ||
| 845 | width += (NILP (LGLYPH_ADJUSTMENT (glyph)) | ||
| 846 | ? LGLYPH_WIDTH (glyph) : LGLYPH_WADJUST (glyph)); | ||
| 847 | } | ||
| 848 | } | ||
| 849 | |||
| 803 | 850 | ||
| 804 | static Lisp_Object gstring_work; | 851 | static Lisp_Object gstring_work; |
| 805 | static Lisp_Object gstring_work_headers; | 852 | static Lisp_Object gstring_work_headers; |
| @@ -876,7 +923,8 @@ fill_gstring_body (Lisp_Object gstring) | |||
| 876 | } | 923 | } |
| 877 | LGLYPH_SET_ADJUSTMENT (g, Qnil); | 924 | LGLYPH_SET_ADJUSTMENT (g, Qnil); |
| 878 | } | 925 | } |
| 879 | if (i < LGSTRING_GLYPH_LEN (gstring)) | 926 | len = LGSTRING_GLYPH_LEN (gstring); |
| 927 | for (; i < len; i++) | ||
| 880 | LGSTRING_SET_GLYPH (gstring, i, Qnil); | 928 | LGSTRING_SET_GLYPH (gstring, i, Qnil); |
| 881 | } | 929 | } |
| 882 | 930 | ||
diff --git a/src/composite.h b/src/composite.h index d77dd0d5062..8a6fd203d09 100644 --- a/src/composite.h +++ b/src/composite.h | |||
| @@ -340,6 +340,7 @@ extern Lisp_Object composition_gstring_from_id (ptrdiff_t); | |||
| 340 | extern bool composition_gstring_p (Lisp_Object); | 340 | extern bool composition_gstring_p (Lisp_Object); |
| 341 | extern int composition_gstring_width (Lisp_Object, ptrdiff_t, ptrdiff_t, | 341 | extern int composition_gstring_width (Lisp_Object, ptrdiff_t, ptrdiff_t, |
| 342 | struct font_metrics *); | 342 | struct font_metrics *); |
| 343 | extern void composition_gstring_adjust_zero_width (Lisp_Object); | ||
| 343 | 344 | ||
| 344 | extern bool find_automatic_composition (ptrdiff_t, ptrdiff_t, ptrdiff_t, | 345 | extern bool find_automatic_composition (ptrdiff_t, ptrdiff_t, ptrdiff_t, |
| 345 | ptrdiff_t *, ptrdiff_t *, | 346 | ptrdiff_t *, ptrdiff_t *, |
diff --git a/src/conf_post.h b/src/conf_post.h index 6ecebf36ab9..fb8d2e5d96e 100644 --- a/src/conf_post.h +++ b/src/conf_post.h | |||
| @@ -30,14 +30,10 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ | |||
| 30 | #endif | 30 | #endif |
| 31 | 31 | ||
| 32 | /* To help make dependencies clearer elsewhere, this file typically | 32 | /* To help make dependencies clearer elsewhere, this file typically |
| 33 | does not #include other files. The exceptions are stdbool.h | 33 | does not #include other files. The exception is ms-w32.h (DOS_NT |
| 34 | because it is unlikely to interfere with configuration and bool is | ||
| 35 | such a core part of the C language, and ms-w32.h (DOS_NT | ||
| 36 | only) because it historically was included here and changing that | 34 | only) because it historically was included here and changing that |
| 37 | would take some work. */ | 35 | would take some work. */ |
| 38 | 36 | ||
| 39 | #include <stdbool.h> | ||
| 40 | |||
| 41 | #if defined WINDOWSNT && !defined DEFER_MS_W32_H | 37 | #if defined WINDOWSNT && !defined DEFER_MS_W32_H |
| 42 | # include <ms-w32.h> | 38 | # include <ms-w32.h> |
| 43 | #endif | 39 | #endif |
diff --git a/src/data.c b/src/data.c index 6921232665b..c6b85e17bc2 100644 --- a/src/data.c +++ b/src/data.c | |||
| @@ -4130,6 +4130,7 @@ syms_of_data (void) | |||
| 4130 | DEFSYM (Qsymbolp, "symbolp"); | 4130 | DEFSYM (Qsymbolp, "symbolp"); |
| 4131 | DEFSYM (Qfixnump, "fixnump"); | 4131 | DEFSYM (Qfixnump, "fixnump"); |
| 4132 | DEFSYM (Qintegerp, "integerp"); | 4132 | DEFSYM (Qintegerp, "integerp"); |
| 4133 | DEFSYM (Qbooleanp, "booleanp"); | ||
| 4133 | DEFSYM (Qnatnump, "natnump"); | 4134 | DEFSYM (Qnatnump, "natnump"); |
| 4134 | DEFSYM (Qwholenump, "wholenump"); | 4135 | DEFSYM (Qwholenump, "wholenump"); |
| 4135 | DEFSYM (Qstringp, "stringp"); | 4136 | DEFSYM (Qstringp, "stringp"); |
diff --git a/src/dbusbind.c b/src/dbusbind.c index 943a4aff8e7..1c74180f15c 100644 --- a/src/dbusbind.c +++ b/src/dbusbind.c | |||
| @@ -398,7 +398,7 @@ xd_signature (char *signature, int dtype, int parent_type, Lisp_Object object) | |||
| 398 | case DBUS_TYPE_BOOLEAN: | 398 | case DBUS_TYPE_BOOLEAN: |
| 399 | /* There must be an argument. */ | 399 | /* There must be an argument. */ |
| 400 | if (EQ (QCboolean, object)) | 400 | if (EQ (QCboolean, object)) |
| 401 | wrong_type_argument (intern ("booleanp"), object); | 401 | wrong_type_argument (Qbooleanp, object); |
| 402 | sprintf (signature, "%c", dtype); | 402 | sprintf (signature, "%c", dtype); |
| 403 | break; | 403 | break; |
| 404 | 404 | ||
| @@ -649,7 +649,7 @@ xd_append_arg (int dtype, Lisp_Object object, DBusMessageIter *iter) | |||
| 649 | case DBUS_TYPE_BOOLEAN: | 649 | case DBUS_TYPE_BOOLEAN: |
| 650 | /* There must be an argument. */ | 650 | /* There must be an argument. */ |
| 651 | if (EQ (QCboolean, object)) | 651 | if (EQ (QCboolean, object)) |
| 652 | wrong_type_argument (intern ("booleanp"), object); | 652 | wrong_type_argument (Qbooleanp, object); |
| 653 | { | 653 | { |
| 654 | dbus_bool_t val = (NILP (object)) ? FALSE : TRUE; | 654 | dbus_bool_t val = (NILP (object)) ? FALSE : TRUE; |
| 655 | XD_DEBUG_MESSAGE ("%c %s", dtype, (val == FALSE) ? "false" : "true"); | 655 | XD_DEBUG_MESSAGE ("%c %s", dtype, (val == FALSE) ? "false" : "true"); |
diff --git a/src/dispnew.c b/src/dispnew.c index 53a47c4b2f2..2568ba1086a 100644 --- a/src/dispnew.c +++ b/src/dispnew.c | |||
| @@ -1810,9 +1810,12 @@ allocate_matrices_for_window_redisplay (struct window *w) | |||
| 1810 | if (w->desired_matrix == NULL) | 1810 | if (w->desired_matrix == NULL) |
| 1811 | { | 1811 | { |
| 1812 | w->desired_matrix = new_glyph_matrix (NULL); | 1812 | w->desired_matrix = new_glyph_matrix (NULL); |
| 1813 | w->current_matrix = new_glyph_matrix (NULL); | 1813 | eassert (w->current_matrix == NULL); |
| 1814 | } | 1814 | } |
| 1815 | 1815 | ||
| 1816 | if (w->current_matrix == NULL) | ||
| 1817 | w->current_matrix = new_glyph_matrix (NULL); | ||
| 1818 | |||
| 1816 | dim.width = required_matrix_width (w); | 1819 | dim.width = required_matrix_width (w); |
| 1817 | dim.height = required_matrix_height (w); | 1820 | dim.height = required_matrix_height (w); |
| 1818 | adjust_glyph_matrix (w, w->desired_matrix, 0, 0, dim); | 1821 | adjust_glyph_matrix (w, w->desired_matrix, 0, 0, dim); |
| @@ -4929,7 +4932,9 @@ update_frame_1 (struct frame *f, bool force_p, bool inhibit_id_p, | |||
| 4929 | { | 4932 | { |
| 4930 | if (MATRIX_ROW_ENABLED_P (desired_matrix, i)) | 4933 | if (MATRIX_ROW_ENABLED_P (desired_matrix, i)) |
| 4931 | { | 4934 | { |
| 4932 | if (FRAME_TERMCAP_P (f)) | 4935 | /* Note that output_buffer_size being 0 means that we want the |
| 4936 | old default behavior of flushing output every now and then. */ | ||
| 4937 | if (FRAME_TERMCAP_P (f) && FRAME_TTY (f)->output_buffer_size == 0) | ||
| 4933 | { | 4938 | { |
| 4934 | /* Flush out every so many lines. | 4939 | /* Flush out every so many lines. |
| 4935 | Also flush out if likely to have more than 1k buffered | 4940 | Also flush out if likely to have more than 1k buffered |
| @@ -6504,9 +6509,6 @@ init_display_interactive (void) | |||
| 6504 | if (!inhibit_window_system && display_arg) | 6509 | if (!inhibit_window_system && display_arg) |
| 6505 | { | 6510 | { |
| 6506 | Vinitial_window_system = Qx; | 6511 | Vinitial_window_system = Qx; |
| 6507 | #ifdef HAVE_X11 | ||
| 6508 | Vwindow_system_version = make_fixnum (11); | ||
| 6509 | #endif | ||
| 6510 | #ifdef USE_NCURSES | 6512 | #ifdef USE_NCURSES |
| 6511 | /* In some versions of ncurses, | 6513 | /* In some versions of ncurses, |
| 6512 | tputs crashes if we have not called tgetent. | 6514 | tputs crashes if we have not called tgetent. |
| @@ -6521,7 +6523,6 @@ init_display_interactive (void) | |||
| 6521 | if (!inhibit_window_system) | 6523 | if (!inhibit_window_system) |
| 6522 | { | 6524 | { |
| 6523 | Vinitial_window_system = Qw32; | 6525 | Vinitial_window_system = Qw32; |
| 6524 | Vwindow_system_version = make_fixnum (1); | ||
| 6525 | return; | 6526 | return; |
| 6526 | } | 6527 | } |
| 6527 | #endif /* HAVE_NTGUI */ | 6528 | #endif /* HAVE_NTGUI */ |
| @@ -6530,7 +6531,6 @@ init_display_interactive (void) | |||
| 6530 | if (!inhibit_window_system && !will_dump_p ()) | 6531 | if (!inhibit_window_system && !will_dump_p ()) |
| 6531 | { | 6532 | { |
| 6532 | Vinitial_window_system = Qns; | 6533 | Vinitial_window_system = Qns; |
| 6533 | Vwindow_system_version = make_fixnum (10); | ||
| 6534 | return; | 6534 | return; |
| 6535 | } | 6535 | } |
| 6536 | #endif | 6536 | #endif |
| @@ -6539,7 +6539,6 @@ init_display_interactive (void) | |||
| 6539 | if (!inhibit_window_system && !will_dump_p ()) | 6539 | if (!inhibit_window_system && !will_dump_p ()) |
| 6540 | { | 6540 | { |
| 6541 | Vinitial_window_system = Qpgtk; | 6541 | Vinitial_window_system = Qpgtk; |
| 6542 | Vwindow_system_version = make_fixnum (3); | ||
| 6543 | return; | 6542 | return; |
| 6544 | } | 6543 | } |
| 6545 | #endif | 6544 | #endif |
| @@ -6548,7 +6547,6 @@ init_display_interactive (void) | |||
| 6548 | if (!inhibit_window_system && !will_dump_p ()) | 6547 | if (!inhibit_window_system && !will_dump_p ()) |
| 6549 | { | 6548 | { |
| 6550 | Vinitial_window_system = Qhaiku; | 6549 | Vinitial_window_system = Qhaiku; |
| 6551 | Vwindow_system_version = make_fixnum (1); | ||
| 6552 | return; | 6550 | return; |
| 6553 | } | 6551 | } |
| 6554 | #endif | 6552 | #endif |
| @@ -6766,10 +6764,6 @@ Use of this variable as a boolean is deprecated. Instead, | |||
| 6766 | use `display-graphic-p' or any of the other `display-*-p' | 6764 | use `display-graphic-p' or any of the other `display-*-p' |
| 6767 | predicates which report frame's specific UI-related capabilities. */); | 6765 | predicates which report frame's specific UI-related capabilities. */); |
| 6768 | 6766 | ||
| 6769 | DEFVAR_LISP ("window-system-version", Vwindow_system_version, | ||
| 6770 | doc: /* The version number of the window system in use. | ||
| 6771 | For X windows, this is 11. */); | ||
| 6772 | |||
| 6773 | DEFVAR_BOOL ("cursor-in-echo-area", cursor_in_echo_area, | 6767 | DEFVAR_BOOL ("cursor-in-echo-area", cursor_in_echo_area, |
| 6774 | doc: /* Non-nil means put cursor in minibuffer, at end of any message there. */); | 6768 | doc: /* Non-nil means put cursor in minibuffer, at end of any message there. */); |
| 6775 | 6769 | ||
| @@ -6817,5 +6811,4 @@ static void | |||
| 6817 | syms_of_display_for_pdumper (void) | 6811 | syms_of_display_for_pdumper (void) |
| 6818 | { | 6812 | { |
| 6819 | Vinitial_window_system = Qnil; | 6813 | Vinitial_window_system = Qnil; |
| 6820 | Vwindow_system_version = Qnil; | ||
| 6821 | } | 6814 | } |
| @@ -342,7 +342,7 @@ string is passed through `substitute-command-keys'. */) | |||
| 342 | doc = module_function_documentation (XMODULE_FUNCTION (fun)); | 342 | doc = module_function_documentation (XMODULE_FUNCTION (fun)); |
| 343 | #endif | 343 | #endif |
| 344 | else | 344 | else |
| 345 | doc = call1 (intern ("function-documentation"), fun); | 345 | doc = call1 (Qfunction_documentation, fun); |
| 346 | 346 | ||
| 347 | /* If DOC is 0, it's typically because of a dumped file missing | 347 | /* If DOC is 0, it's typically because of a dumped file missing |
| 348 | from the DOC file (bug in src/Makefile.in). */ | 348 | from the DOC file (bug in src/Makefile.in). */ |
| @@ -643,7 +643,14 @@ default_to_grave_quoting_style (void) | |||
| 643 | DEFUN ("text-quoting-style", Ftext_quoting_style, | 643 | DEFUN ("text-quoting-style", Ftext_quoting_style, |
| 644 | Stext_quoting_style, 0, 0, 0, | 644 | Stext_quoting_style, 0, 0, 0, |
| 645 | doc: /* Return the current effective text quoting style. | 645 | doc: /* Return the current effective text quoting style. |
| 646 | See variable `text-quoting-style'. */) | 646 | If the variable `text-quoting-style' is `grave', `straight' or |
| 647 | `curve', just return that value. If it is nil (the default), return | ||
| 648 | `grave' if curved quotes cannot be displayed (for instance, on a | ||
| 649 | terminal with no support for these characters), otherwise return | ||
| 650 | `quote'. Any other value is treated as `grave'. | ||
| 651 | |||
| 652 | Note that in contrast to the variable `text-quoting-style', this | ||
| 653 | function will never return nil. */) | ||
| 647 | (void) | 654 | (void) |
| 648 | { | 655 | { |
| 649 | /* Use grave accent and apostrophe `like this'. */ | 656 | /* Use grave accent and apostrophe `like this'. */ |
| @@ -694,7 +701,11 @@ The value should be one of these symbols: | |||
| 694 | `grave': quote with grave accent and apostrophe \\=`like this\\='; | 701 | `grave': quote with grave accent and apostrophe \\=`like this\\='; |
| 695 | i.e., do not alter the original quote marks. | 702 | i.e., do not alter the original quote marks. |
| 696 | nil: like `curve' if curved single quotes are displayable, | 703 | nil: like `curve' if curved single quotes are displayable, |
| 697 | and like `grave' otherwise. This is the default. */); | 704 | and like `grave' otherwise. This is the default. |
| 705 | |||
| 706 | You should never read the value of this variable directly from a Lisp | ||
| 707 | program. Use the function `text-quoting-style' instead, as that will | ||
| 708 | compute the correct value for the current terminal in the nil case. */); | ||
| 698 | Vtext_quoting_style = Qnil; | 709 | Vtext_quoting_style = Qnil; |
| 699 | 710 | ||
| 700 | DEFVAR_BOOL ("internal--text-quoting-flag", text_quoting_flag, | 711 | DEFVAR_BOOL ("internal--text-quoting-flag", text_quoting_flag, |
diff --git a/src/dynlib.h b/src/dynlib.h index 03b8f983564..9a11c128981 100644 --- a/src/dynlib.h +++ b/src/dynlib.h | |||
| @@ -21,7 +21,6 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ | |||
| 21 | #define DYNLIB_H | 21 | #define DYNLIB_H |
| 22 | 22 | ||
| 23 | #include <attribute.h> | 23 | #include <attribute.h> |
| 24 | #include <stdbool.h> | ||
| 25 | 24 | ||
| 26 | typedef void *dynlib_handle_ptr; | 25 | typedef void *dynlib_handle_ptr; |
| 27 | dynlib_handle_ptr dynlib_open (const char *path); | 26 | dynlib_handle_ptr dynlib_open (const char *path); |
diff --git a/src/editfns.c b/src/editfns.c index cd5cddee79f..c1414071c79 100644 --- a/src/editfns.c +++ b/src/editfns.c | |||
| @@ -3552,7 +3552,9 @@ styled_format (ptrdiff_t nargs, Lisp_Object *args, bool message) | |||
| 3552 | || conversion == 'o' || conversion == 'x' | 3552 | || conversion == 'o' || conversion == 'x' |
| 3553 | || conversion == 'X')) | 3553 | || conversion == 'X')) |
| 3554 | error ("Invalid format operation %%%c", | 3554 | error ("Invalid format operation %%%c", |
| 3555 | STRING_CHAR ((unsigned char *) format - 1)); | 3555 | multibyte_format |
| 3556 | ? STRING_CHAR ((unsigned char *) format - 1) | ||
| 3557 | : *((unsigned char *) format - 1)); | ||
| 3556 | else if (! (FIXNUMP (arg) || ((BIGNUMP (arg) || FLOATP (arg)) | 3558 | else if (! (FIXNUMP (arg) || ((BIGNUMP (arg) || FLOATP (arg)) |
| 3557 | && conversion != 'c'))) | 3559 | && conversion != 'c'))) |
| 3558 | error ("Format specifier doesn't match argument type"); | 3560 | error ("Format specifier doesn't match argument type"); |
| @@ -4603,10 +4605,7 @@ it to be non-nil. */); | |||
| 4603 | 4605 | ||
| 4604 | DEFSYM (Qrestrictions_locked, "restrictions-locked"); | 4606 | DEFSYM (Qrestrictions_locked, "restrictions-locked"); |
| 4605 | DEFVAR_LISP ("restrictions-locked", Vrestrictions_locked, | 4607 | DEFVAR_LISP ("restrictions-locked", Vrestrictions_locked, |
| 4606 | doc: /* If non-nil, restrictions are currently locked. | 4608 | doc: /* If non-nil, restrictions are currently locked. */); |
| 4607 | |||
| 4608 | This happens when `narrow-to-region', which see, is called from Lisp | ||
| 4609 | with an optional argument LOCK non-nil. */); | ||
| 4610 | Vrestrictions_locked = Qnil; | 4609 | Vrestrictions_locked = Qnil; |
| 4611 | Funintern (Qrestrictions_locked, Qnil); | 4610 | Funintern (Qrestrictions_locked, Qnil); |
| 4612 | 4611 | ||
diff --git a/src/emacs-module.c b/src/emacs-module.c index 1c392d65df8..fcdf103c19b 100644 --- a/src/emacs-module.c +++ b/src/emacs-module.c | |||
| @@ -78,7 +78,6 @@ To add a new module function, proceed as follows: | |||
| 78 | #include "emacs-module.h" | 78 | #include "emacs-module.h" |
| 79 | 79 | ||
| 80 | #include <stdarg.h> | 80 | #include <stdarg.h> |
| 81 | #include <stdbool.h> | ||
| 82 | #include <stddef.h> | 81 | #include <stddef.h> |
| 83 | #include <stdint.h> | 82 | #include <stdint.h> |
| 84 | #include <stdlib.h> | 83 | #include <stdlib.h> |
diff --git a/src/emacs-module.h.in b/src/emacs-module.h.in index 6642b55d932..bef89b059fc 100644 --- a/src/emacs-module.h.in +++ b/src/emacs-module.h.in | |||
| @@ -30,7 +30,8 @@ information how to write modules and use this header file. | |||
| 30 | #include <stdint.h> | 30 | #include <stdint.h> |
| 31 | #include <time.h> | 31 | #include <time.h> |
| 32 | 32 | ||
| 33 | #ifndef __cplusplus | 33 | #if ((defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) < 202311 \ |
| 34 | && !defined __bool_true_false_are_defined && !defined __cplusplus) | ||
| 34 | #include <stdbool.h> | 35 | #include <stdbool.h> |
| 35 | #endif | 36 | #endif |
| 36 | 37 | ||
diff --git a/src/emacs.c b/src/emacs.c index 8f19c486553..ba8b9c651a7 100644 --- a/src/emacs.c +++ b/src/emacs.c | |||
| @@ -303,7 +303,7 @@ Initialization options:\n\ | |||
| 303 | -x to be used in #!/usr/bin/emacs -x\n\ | 303 | -x to be used in #!/usr/bin/emacs -x\n\ |
| 304 | and has approximately the same meaning\n\ | 304 | and has approximately the same meaning\n\ |
| 305 | as -Q --script\n\ | 305 | as -Q --script\n\ |
| 306 | --terminal, -t DEVICE use DEVICE for terminal I/O\n \ | 306 | --terminal, -t DEVICE use DEVICE for terminal I/O\n\ |
| 307 | --user, -u USER load ~USER/.emacs instead of your own\n\ | 307 | --user, -u USER load ~USER/.emacs instead of your own\n\ |
| 308 | \n\ | 308 | \n\ |
| 309 | ", | 309 | ", |
| @@ -895,19 +895,17 @@ load_pdump (int argc, char **argv) | |||
| 895 | } | 895 | } |
| 896 | 896 | ||
| 897 | /* Where's our executable? */ | 897 | /* Where's our executable? */ |
| 898 | ptrdiff_t bufsize; | 898 | ptrdiff_t exec_bufsize, bufsize, needed; |
| 899 | #ifndef NS_SELF_CONTAINED | 899 | emacs_executable = find_emacs_executable (argv[0], &exec_bufsize); |
| 900 | ptrdiff_t exec_bufsize; | ||
| 901 | #endif | ||
| 902 | emacs_executable = find_emacs_executable (argv[0], &bufsize); | ||
| 903 | #ifndef NS_SELF_CONTAINED | ||
| 904 | exec_bufsize = bufsize; | ||
| 905 | #endif | ||
| 906 | 900 | ||
| 907 | /* If we couldn't find our executable, go straight to looking for | 901 | /* If we couldn't find our executable, go straight to looking for |
| 908 | the dump in the hardcoded location. */ | 902 | the dump in the hardcoded location. */ |
| 909 | if (!(emacs_executable && *emacs_executable)) | 903 | if (!(emacs_executable && *emacs_executable)) |
| 910 | goto hardcoded; | 904 | { |
| 905 | bufsize = 0; | ||
| 906 | dump_file = NULL; | ||
| 907 | goto hardcoded; | ||
| 908 | } | ||
| 911 | 909 | ||
| 912 | if (dump_file) | 910 | if (dump_file) |
| 913 | { | 911 | { |
| @@ -935,8 +933,8 @@ load_pdump (int argc, char **argv) | |||
| 935 | strip_suffix_length)) | 933 | strip_suffix_length)) |
| 936 | exenamelen = prefix_length; | 934 | exenamelen = prefix_length; |
| 937 | } | 935 | } |
| 938 | ptrdiff_t needed = exenamelen + strlen (suffix) + 1; | 936 | bufsize = exenamelen + strlen (suffix) + 1; |
| 939 | dump_file = xpalloc (NULL, &bufsize, needed - bufsize, -1, 1); | 937 | dump_file = xpalloc (NULL, &bufsize, 1, -1, 1); |
| 940 | memcpy (dump_file, emacs_executable, exenamelen); | 938 | memcpy (dump_file, emacs_executable, exenamelen); |
| 941 | strcpy (dump_file + exenamelen, suffix); | 939 | strcpy (dump_file + exenamelen, suffix); |
| 942 | result = pdumper_load (dump_file, emacs_executable); | 940 | result = pdumper_load (dump_file, emacs_executable); |
diff --git a/src/eval.c b/src/eval.c index 6ea7a473f60..de9c07f1552 100644 --- a/src/eval.c +++ b/src/eval.c | |||
| @@ -211,15 +211,8 @@ backtrace_thread_next (struct thread_state *tstate, union specbinding *pdl) | |||
| 211 | void | 211 | void |
| 212 | init_eval_once (void) | 212 | init_eval_once (void) |
| 213 | { | 213 | { |
| 214 | /* Don't forget to update docs (lispref node "Local Variables"). */ | 214 | /* Don't forget to update docs (lispref node "Eval"). */ |
| 215 | #ifndef HAVE_NATIVE_COMP | ||
| 216 | max_specpdl_size = 1800; /* See bug#46818. */ | ||
| 217 | max_lisp_eval_depth = 800; | ||
| 218 | #else | ||
| 219 | /* Original values increased for comp.el. */ | ||
| 220 | max_specpdl_size = 2500; | ||
| 221 | max_lisp_eval_depth = 1600; | 215 | max_lisp_eval_depth = 1600; |
| 222 | #endif | ||
| 223 | Vrun_hooks = Qnil; | 216 | Vrun_hooks = Qnil; |
| 224 | pdumper_do_now_and_after_load (init_eval_once_for_pdumper); | 217 | pdumper_do_now_and_after_load (init_eval_once_for_pdumper); |
| 225 | } | 218 | } |
| @@ -270,8 +263,7 @@ max_ensure_room (intmax_t *m, intmax_t a, intmax_t b) | |||
| 270 | static void | 263 | static void |
| 271 | restore_stack_limits (Lisp_Object data) | 264 | restore_stack_limits (Lisp_Object data) |
| 272 | { | 265 | { |
| 273 | integer_to_intmax (XCAR (data), &max_specpdl_size); | 266 | integer_to_intmax (data, &max_lisp_eval_depth); |
| 274 | integer_to_intmax (XCDR (data), &max_lisp_eval_depth); | ||
| 275 | } | 267 | } |
| 276 | 268 | ||
| 277 | /* Call the Lisp debugger, giving it argument ARG. */ | 269 | /* Call the Lisp debugger, giving it argument ARG. */ |
| @@ -283,9 +275,6 @@ call_debugger (Lisp_Object arg) | |||
| 283 | specpdl_ref count = SPECPDL_INDEX (); | 275 | specpdl_ref count = SPECPDL_INDEX (); |
| 284 | Lisp_Object val; | 276 | Lisp_Object val; |
| 285 | intmax_t old_depth = max_lisp_eval_depth; | 277 | intmax_t old_depth = max_lisp_eval_depth; |
| 286 | /* Do not allow max_specpdl_size less than actual depth (Bug#16603). */ | ||
| 287 | ptrdiff_t counti = specpdl_ref_to_count (count); | ||
| 288 | intmax_t old_max = max (max_specpdl_size, counti); | ||
| 289 | 278 | ||
| 290 | /* The previous value of 40 is too small now that the debugger | 279 | /* The previous value of 40 is too small now that the debugger |
| 291 | prints using cl-prin1 instead of prin1. Printing lists nested 8 | 280 | prints using cl-prin1 instead of prin1. Printing lists nested 8 |
| @@ -293,20 +282,8 @@ call_debugger (Lisp_Object arg) | |||
| 293 | currently requires 77 additional frames. See bug#31919. */ | 282 | currently requires 77 additional frames. See bug#31919. */ |
| 294 | max_ensure_room (&max_lisp_eval_depth, lisp_eval_depth, 100); | 283 | max_ensure_room (&max_lisp_eval_depth, lisp_eval_depth, 100); |
| 295 | 284 | ||
| 296 | /* While debugging Bug#16603, previous value of 100 was found | ||
| 297 | too small to avoid specpdl overflow in the debugger itself. */ | ||
| 298 | max_ensure_room (&max_specpdl_size, counti, 200); | ||
| 299 | |||
| 300 | if (old_max == counti) | ||
| 301 | { | ||
| 302 | /* We can enter the debugger due to specpdl overflow (Bug#16603). */ | ||
| 303 | specpdl_ptr--; | ||
| 304 | grow_specpdl (); | ||
| 305 | } | ||
| 306 | |||
| 307 | /* Restore limits after leaving the debugger. */ | 285 | /* Restore limits after leaving the debugger. */ |
| 308 | record_unwind_protect (restore_stack_limits, | 286 | record_unwind_protect (restore_stack_limits, make_int (old_depth)); |
| 309 | Fcons (make_int (old_max), make_int (old_depth))); | ||
| 310 | 287 | ||
| 311 | #ifdef HAVE_WINDOW_SYSTEM | 288 | #ifdef HAVE_WINDOW_SYSTEM |
| 312 | if (display_hourglass_p) | 289 | if (display_hourglass_p) |
| @@ -938,12 +915,9 @@ usage: (let* VARLIST BODY...) */) | |||
| 938 | lexenv = Vinternal_interpreter_environment; | 915 | lexenv = Vinternal_interpreter_environment; |
| 939 | 916 | ||
| 940 | Lisp_Object varlist = XCAR (args); | 917 | Lisp_Object varlist = XCAR (args); |
| 941 | while (CONSP (varlist)) | 918 | FOR_EACH_TAIL (varlist) |
| 942 | { | 919 | { |
| 943 | maybe_quit (); | ||
| 944 | |||
| 945 | elt = XCAR (varlist); | 920 | elt = XCAR (varlist); |
| 946 | varlist = XCDR (varlist); | ||
| 947 | if (SYMBOLP (elt)) | 921 | if (SYMBOLP (elt)) |
| 948 | { | 922 | { |
| 949 | var = elt; | 923 | var = elt; |
| @@ -1757,8 +1731,6 @@ signal_or_quit (Lisp_Object error_symbol, Lisp_Object data, bool keyboard_quit) | |||
| 1757 | { | 1731 | { |
| 1758 | /* Edebug takes care of restoring these variables when it exits. */ | 1732 | /* Edebug takes care of restoring these variables when it exits. */ |
| 1759 | max_ensure_room (&max_lisp_eval_depth, lisp_eval_depth, 20); | 1733 | max_ensure_room (&max_lisp_eval_depth, lisp_eval_depth, 20); |
| 1760 | ptrdiff_t counti = specpdl_ref_to_count (SPECPDL_INDEX ()); | ||
| 1761 | max_ensure_room (&max_specpdl_size, counti, 40); | ||
| 1762 | 1734 | ||
| 1763 | call2 (Vsignal_hook_function, error_symbol, data); | 1735 | call2 (Vsignal_hook_function, error_symbol, data); |
| 1764 | } | 1736 | } |
| @@ -1827,8 +1799,6 @@ signal_or_quit (Lisp_Object error_symbol, Lisp_Object data, bool keyboard_quit) | |||
| 1827 | { | 1799 | { |
| 1828 | max_ensure_room (&max_lisp_eval_depth, lisp_eval_depth, 100); | 1800 | max_ensure_room (&max_lisp_eval_depth, lisp_eval_depth, 100); |
| 1829 | specpdl_ref count = SPECPDL_INDEX (); | 1801 | specpdl_ref count = SPECPDL_INDEX (); |
| 1830 | ptrdiff_t counti = specpdl_ref_to_count (count); | ||
| 1831 | max_ensure_room (&max_specpdl_size, counti, 200); | ||
| 1832 | specbind (Qdebugger, Qdebug_early); | 1802 | specbind (Qdebugger, Qdebug_early); |
| 1833 | call_debugger (list2 (Qerror, Fcons (error_symbol, data))); | 1803 | call_debugger (list2 (Qerror, Fcons (error_symbol, data))); |
| 1834 | unbind_to (count, Qnil); | 1804 | unbind_to (count, Qnil); |
| @@ -1844,12 +1814,10 @@ signal_or_quit (Lisp_Object error_symbol, Lisp_Object data, bool keyboard_quit) | |||
| 1844 | { | 1814 | { |
| 1845 | max_ensure_room (&max_lisp_eval_depth, lisp_eval_depth, 100); | 1815 | max_ensure_room (&max_lisp_eval_depth, lisp_eval_depth, 100); |
| 1846 | specpdl_ref count = SPECPDL_INDEX (); | 1816 | specpdl_ref count = SPECPDL_INDEX (); |
| 1847 | ptrdiff_t counti = specpdl_ref_to_count (count); | ||
| 1848 | AUTO_STRING (redisplay_trace, "*Redisplay_trace*"); | 1817 | AUTO_STRING (redisplay_trace, "*Redisplay_trace*"); |
| 1849 | Lisp_Object redisplay_trace_buffer; | 1818 | Lisp_Object redisplay_trace_buffer; |
| 1850 | AUTO_STRING (gap, "\n\n\n\n"); /* Separates things in *Redisplay-trace* */ | 1819 | AUTO_STRING (gap, "\n\n\n\n"); /* Separates things in *Redisplay-trace* */ |
| 1851 | Lisp_Object delayed_warning; | 1820 | Lisp_Object delayed_warning; |
| 1852 | max_ensure_room (&max_specpdl_size, counti, 200); | ||
| 1853 | redisplay_trace_buffer = Fget_buffer_create (redisplay_trace, Qnil); | 1821 | redisplay_trace_buffer = Fget_buffer_create (redisplay_trace, Qnil); |
| 1854 | current_buffer = XBUFFER (redisplay_trace_buffer); | 1822 | current_buffer = XBUFFER (redisplay_trace_buffer); |
| 1855 | if (!backtrace_yet) /* Are we on the first backtrace of the command? */ | 1823 | if (!backtrace_yet) /* Are we on the first backtrace of the command? */ |
| @@ -2394,17 +2362,12 @@ grow_specpdl_allocation (void) | |||
| 2394 | eassert (specpdl_ptr == specpdl_end); | 2362 | eassert (specpdl_ptr == specpdl_end); |
| 2395 | 2363 | ||
| 2396 | specpdl_ref count = SPECPDL_INDEX (); | 2364 | specpdl_ref count = SPECPDL_INDEX (); |
| 2397 | ptrdiff_t max_size = min (max_specpdl_size, PTRDIFF_MAX - 1000); | 2365 | ptrdiff_t max_size = PTRDIFF_MAX - 1000; |
| 2398 | union specbinding *pdlvec = specpdl - 1; | 2366 | union specbinding *pdlvec = specpdl - 1; |
| 2399 | ptrdiff_t size = specpdl_end - specpdl; | 2367 | ptrdiff_t size = specpdl_end - specpdl; |
| 2400 | ptrdiff_t pdlvecsize = size + 1; | 2368 | ptrdiff_t pdlvecsize = size + 1; |
| 2401 | if (max_size <= size) | 2369 | if (max_size <= size) |
| 2402 | { | 2370 | xsignal0 (Qexcessive_variable_binding); /* Can't happen, essentially. */ |
| 2403 | if (max_specpdl_size < 400) | ||
| 2404 | max_size = max_specpdl_size = 400; | ||
| 2405 | if (max_size <= size) | ||
| 2406 | xsignal0 (Qexcessive_variable_binding); | ||
| 2407 | } | ||
| 2408 | pdlvec = xpalloc (pdlvec, &pdlvecsize, 1, max_size + 1, sizeof *specpdl); | 2371 | pdlvec = xpalloc (pdlvec, &pdlvecsize, 1, max_size + 1, sizeof *specpdl); |
| 2409 | specpdl = pdlvec + 1; | 2372 | specpdl = pdlvec + 1; |
| 2410 | specpdl_end = specpdl + pdlvecsize - 1; | 2373 | specpdl_end = specpdl + pdlvecsize - 1; |
| @@ -4247,22 +4210,6 @@ Lisp_Object backtrace_top_function (void) | |||
| 4247 | void | 4210 | void |
| 4248 | syms_of_eval (void) | 4211 | syms_of_eval (void) |
| 4249 | { | 4212 | { |
| 4250 | DEFVAR_INT ("max-specpdl-size", max_specpdl_size, | ||
| 4251 | doc: /* Limit on number of Lisp variable bindings and `unwind-protect's. | ||
| 4252 | |||
| 4253 | If Lisp code tries to use more bindings than this amount, an error is | ||
| 4254 | signaled. | ||
| 4255 | |||
| 4256 | You can safely increase this variable substantially if the default | ||
| 4257 | value proves inconveniently small. However, if you increase it too | ||
| 4258 | much, Emacs could run out of memory trying to make the stack bigger. | ||
| 4259 | Note that this limit may be silently increased by the debugger if | ||
| 4260 | `debug-on-error' or `debug-on-quit' is set. | ||
| 4261 | |||
| 4262 | \"spec\" is short for \"special variables\", i.e., dynamically bound | ||
| 4263 | variables. \"PDL\" is short for \"push-down list\", which is an old | ||
| 4264 | term for \"stack\". */); | ||
| 4265 | |||
| 4266 | DEFVAR_INT ("max-lisp-eval-depth", max_lisp_eval_depth, | 4213 | DEFVAR_INT ("max-lisp-eval-depth", max_lisp_eval_depth, |
| 4267 | doc: /* Limit on depth in `eval', `apply' and `funcall' before error. | 4214 | doc: /* Limit on depth in `eval', `apply' and `funcall' before error. |
| 4268 | 4215 | ||
diff --git a/src/fileio.c b/src/fileio.c index 9697f6c8cf1..dd7f85ec97f 100644 --- a/src/fileio.c +++ b/src/fileio.c | |||
| @@ -3808,7 +3808,7 @@ file_offset (Lisp_Object val) | |||
| 3808 | } | 3808 | } |
| 3809 | } | 3809 | } |
| 3810 | 3810 | ||
| 3811 | wrong_type_argument (intern ("file-offset"), val); | 3811 | wrong_type_argument (Qfile_offset, val); |
| 3812 | } | 3812 | } |
| 3813 | 3813 | ||
| 3814 | /* Return a special time value indicating the error number ERRNUM. */ | 3814 | /* Return a special time value indicating the error number ERRNUM. */ |
| @@ -4875,7 +4875,7 @@ by calling `format-decode', which see. */) | |||
| 4875 | if (! NILP (insval)) | 4875 | if (! NILP (insval)) |
| 4876 | { | 4876 | { |
| 4877 | if (! RANGED_FIXNUMP (0, insval, ZV - PT)) | 4877 | if (! RANGED_FIXNUMP (0, insval, ZV - PT)) |
| 4878 | wrong_type_argument (intern ("inserted-chars"), insval); | 4878 | wrong_type_argument (Qinserted_chars, insval); |
| 4879 | inserted = XFIXNAT (insval); | 4879 | inserted = XFIXNAT (insval); |
| 4880 | } | 4880 | } |
| 4881 | } | 4881 | } |
| @@ -4898,7 +4898,7 @@ by calling `format-decode', which see. */) | |||
| 4898 | insval = call3 (Qformat_decode, | 4898 | insval = call3 (Qformat_decode, |
| 4899 | Qnil, make_fixnum (inserted), visit); | 4899 | Qnil, make_fixnum (inserted), visit); |
| 4900 | if (! RANGED_FIXNUMP (0, insval, ZV - PT)) | 4900 | if (! RANGED_FIXNUMP (0, insval, ZV - PT)) |
| 4901 | wrong_type_argument (intern ("inserted-chars"), insval); | 4901 | wrong_type_argument (Qinserted_chars, insval); |
| 4902 | inserted = XFIXNAT (insval); | 4902 | inserted = XFIXNAT (insval); |
| 4903 | } | 4903 | } |
| 4904 | else | 4904 | else |
| @@ -4921,7 +4921,7 @@ by calling `format-decode', which see. */) | |||
| 4921 | insval = call3 (Qformat_decode, | 4921 | insval = call3 (Qformat_decode, |
| 4922 | Qnil, make_fixnum (oinserted), visit); | 4922 | Qnil, make_fixnum (oinserted), visit); |
| 4923 | if (! RANGED_FIXNUMP (0, insval, ZV - PT)) | 4923 | if (! RANGED_FIXNUMP (0, insval, ZV - PT)) |
| 4924 | wrong_type_argument (intern ("inserted-chars"), insval); | 4924 | wrong_type_argument (Qinserted_chars, insval); |
| 4925 | if (ochars_modiff == CHARS_MODIFF) | 4925 | if (ochars_modiff == CHARS_MODIFF) |
| 4926 | /* format_decode didn't modify buffer's characters => move | 4926 | /* format_decode didn't modify buffer's characters => move |
| 4927 | point back to position before inserted text and leave | 4927 | point back to position before inserted text and leave |
| @@ -4944,7 +4944,7 @@ by calling `format-decode', which see. */) | |||
| 4944 | if (!NILP (insval)) | 4944 | if (!NILP (insval)) |
| 4945 | { | 4945 | { |
| 4946 | if (! RANGED_FIXNUMP (0, insval, ZV - PT)) | 4946 | if (! RANGED_FIXNUMP (0, insval, ZV - PT)) |
| 4947 | wrong_type_argument (intern ("inserted-chars"), insval); | 4947 | wrong_type_argument (Qinserted_chars, insval); |
| 4948 | inserted = XFIXNAT (insval); | 4948 | inserted = XFIXNAT (insval); |
| 4949 | } | 4949 | } |
| 4950 | } | 4950 | } |
| @@ -4962,7 +4962,7 @@ by calling `format-decode', which see. */) | |||
| 4962 | if (!NILP (insval)) | 4962 | if (!NILP (insval)) |
| 4963 | { | 4963 | { |
| 4964 | if (! RANGED_FIXNUMP (0, insval, ZV - PT)) | 4964 | if (! RANGED_FIXNUMP (0, insval, ZV - PT)) |
| 4965 | wrong_type_argument (intern ("inserted-chars"), insval); | 4965 | wrong_type_argument (Qinserted_chars, insval); |
| 4966 | if (ochars_modiff == CHARS_MODIFF) | 4966 | if (ochars_modiff == CHARS_MODIFF) |
| 4967 | /* after_insert_file_functions didn't modify | 4967 | /* after_insert_file_functions didn't modify |
| 4968 | buffer's characters => move point back to | 4968 | buffer's characters => move point back to |
| @@ -6019,11 +6019,6 @@ A non-nil CURRENT-ONLY argument means save only current buffer. */) | |||
| 6019 | bool old_message_p = 0; | 6019 | bool old_message_p = 0; |
| 6020 | struct auto_save_unwind auto_save_unwind; | 6020 | struct auto_save_unwind auto_save_unwind; |
| 6021 | 6021 | ||
| 6022 | intmax_t sum = INT_ADD_WRAPV (specpdl_end - specpdl, 40, &sum) | ||
| 6023 | ? INTMAX_MAX : sum; | ||
| 6024 | if (max_specpdl_size < sum) | ||
| 6025 | max_specpdl_size = sum; | ||
| 6026 | |||
| 6027 | if (minibuf_level) | 6022 | if (minibuf_level) |
| 6028 | no_message = Qt; | 6023 | no_message = Qt; |
| 6029 | 6024 | ||
| @@ -6431,9 +6426,11 @@ syms_of_fileio (void) | |||
| 6431 | DEFSYM (Qfile_date_error, "file-date-error"); | 6426 | DEFSYM (Qfile_date_error, "file-date-error"); |
| 6432 | DEFSYM (Qfile_missing, "file-missing"); | 6427 | DEFSYM (Qfile_missing, "file-missing"); |
| 6433 | DEFSYM (Qpermission_denied, "permission-denied"); | 6428 | DEFSYM (Qpermission_denied, "permission-denied"); |
| 6429 | DEFSYM (Qfile_offset, "file-offset"); | ||
| 6434 | DEFSYM (Qfile_notify_error, "file-notify-error"); | 6430 | DEFSYM (Qfile_notify_error, "file-notify-error"); |
| 6435 | DEFSYM (Qremote_file_error, "remote-file-error"); | 6431 | DEFSYM (Qremote_file_error, "remote-file-error"); |
| 6436 | DEFSYM (Qexcl, "excl"); | 6432 | DEFSYM (Qexcl, "excl"); |
| 6433 | DEFSYM (Qinserted_chars, "inserted-chars"); | ||
| 6437 | 6434 | ||
| 6438 | DEFVAR_LISP ("file-name-coding-system", Vfile_name_coding_system, | 6435 | DEFVAR_LISP ("file-name-coding-system", Vfile_name_coding_system, |
| 6439 | doc: /* Coding system for encoding file names. | 6436 | doc: /* Coding system for encoding file names. |
| @@ -449,25 +449,55 @@ Symbols are also allowed; their print names are used instead. */) | |||
| 449 | CHECK_STRING (string2); | 449 | CHECK_STRING (string2); |
| 450 | 450 | ||
| 451 | ptrdiff_t n = min (SCHARS (string1), SCHARS (string2)); | 451 | ptrdiff_t n = min (SCHARS (string1), SCHARS (string2)); |
| 452 | if (!STRING_MULTIBYTE (string1) && !STRING_MULTIBYTE (string2)) | 452 | |
| 453 | if ((!STRING_MULTIBYTE (string1) || SCHARS (string1) == SBYTES (string1)) | ||
| 454 | && (!STRING_MULTIBYTE (string2) || SCHARS (string2) == SBYTES (string2))) | ||
| 453 | { | 455 | { |
| 454 | /* Both arguments are unibyte (hot path). */ | 456 | /* Each argument is either unibyte or all-ASCII multibyte: |
| 457 | we can compare bytewise. | ||
| 458 | (Arbitrary multibyte strings cannot be compared bytewise because | ||
| 459 | that would give a different order for raw bytes 80..FF.) */ | ||
| 455 | int d = memcmp (SSDATA (string1), SSDATA (string2), n); | 460 | int d = memcmp (SSDATA (string1), SSDATA (string2), n); |
| 456 | return d < 0 || (d == 0 && n < SCHARS (string2)) ? Qt : Qnil; | 461 | return d < 0 || (d == 0 && n < SCHARS (string2)) ? Qt : Qnil; |
| 457 | } | 462 | } |
| 458 | 463 | else if (STRING_MULTIBYTE (string1) && STRING_MULTIBYTE (string2)) | |
| 459 | ptrdiff_t i1 = 0, i1_byte = 0, i2 = 0, i2_byte = 0; | ||
| 460 | |||
| 461 | while (i1 < n) | ||
| 462 | { | 464 | { |
| 463 | /* When we find a mismatch, we must compare the | 465 | ptrdiff_t i1 = 0, i1_byte = 0, i2 = 0, i2_byte = 0; |
| 464 | characters, not just the bytes. */ | 466 | while (i1 < n) |
| 465 | int c1 = fetch_string_char_advance (string1, &i1, &i1_byte); | 467 | { |
| 466 | int c2 = fetch_string_char_advance (string2, &i2, &i2_byte); | 468 | int c1 = fetch_string_char_advance_no_check (string1, &i1, &i1_byte); |
| 467 | if (c1 != c2) | 469 | int c2 = fetch_string_char_advance_no_check (string2, &i2, &i2_byte); |
| 468 | return c1 < c2 ? Qt : Qnil; | 470 | if (c1 != c2) |
| 471 | return c1 < c2 ? Qt : Qnil; | ||
| 472 | } | ||
| 473 | return i1 < SCHARS (string2) ? Qt : Qnil; | ||
| 474 | } | ||
| 475 | else if (STRING_MULTIBYTE (string1)) | ||
| 476 | { | ||
| 477 | /* string1 multibyte, string2 unibyte */ | ||
| 478 | ptrdiff_t i1 = 0, i1_byte = 0, i2 = 0; | ||
| 479 | while (i1 < n) | ||
| 480 | { | ||
| 481 | int c1 = fetch_string_char_advance_no_check (string1, &i1, &i1_byte); | ||
| 482 | int c2 = SREF (string2, i2++); | ||
| 483 | if (c1 != c2) | ||
| 484 | return c1 < c2 ? Qt : Qnil; | ||
| 485 | } | ||
| 486 | return i1 < SCHARS (string2) ? Qt : Qnil; | ||
| 487 | } | ||
| 488 | else | ||
| 489 | { | ||
| 490 | /* string1 unibyte, string2 multibyte */ | ||
| 491 | ptrdiff_t i1 = 0, i2 = 0, i2_byte = 0; | ||
| 492 | while (i1 < n) | ||
| 493 | { | ||
| 494 | int c1 = SREF (string1, i1++); | ||
| 495 | int c2 = fetch_string_char_advance_no_check (string2, &i2, &i2_byte); | ||
| 496 | if (c1 != c2) | ||
| 497 | return c1 < c2 ? Qt : Qnil; | ||
| 498 | } | ||
| 499 | return i1 < SCHARS (string2) ? Qt : Qnil; | ||
| 469 | } | 500 | } |
| 470 | return i1 < SCHARS (string2) ? Qt : Qnil; | ||
| 471 | } | 501 | } |
| 472 | 502 | ||
| 473 | DEFUN ("string-version-lessp", Fstring_version_lessp, | 503 | DEFUN ("string-version-lessp", Fstring_version_lessp, |
| @@ -610,7 +640,10 @@ DEFUN ("append", Fappend, Sappend, 0, MANY, 0, | |||
| 610 | doc: /* Concatenate all the arguments and make the result a list. | 640 | doc: /* Concatenate all the arguments and make the result a list. |
| 611 | The result is a list whose elements are the elements of all the arguments. | 641 | The result is a list whose elements are the elements of all the arguments. |
| 612 | Each argument may be a list, vector or string. | 642 | Each argument may be a list, vector or string. |
| 613 | The last argument is not copied, just used as the tail of the new list. | 643 | |
| 644 | All arguments except the last argument are copied. The last argument | ||
| 645 | is just used as the tail of the new list. | ||
| 646 | |||
| 614 | usage: (append &rest SEQUENCES) */) | 647 | usage: (append &rest SEQUENCES) */) |
| 615 | (ptrdiff_t nargs, Lisp_Object *args) | 648 | (ptrdiff_t nargs, Lisp_Object *args) |
| 616 | { | 649 | { |
| @@ -1412,6 +1445,7 @@ are shared, however. | |||
| 1412 | Elements of ALIST that are not conses are also shared. */) | 1445 | Elements of ALIST that are not conses are also shared. */) |
| 1413 | (Lisp_Object alist) | 1446 | (Lisp_Object alist) |
| 1414 | { | 1447 | { |
| 1448 | CHECK_LIST (alist); | ||
| 1415 | if (NILP (alist)) | 1449 | if (NILP (alist)) |
| 1416 | return alist; | 1450 | return alist; |
| 1417 | alist = Fcopy_sequence (alist); | 1451 | alist = Fcopy_sequence (alist); |
| @@ -1563,10 +1597,21 @@ If N is zero or negative, return nil. | |||
| 1563 | If N is greater or equal to the length of LIST, return LIST (or a copy). */) | 1597 | If N is greater or equal to the length of LIST, return LIST (or a copy). */) |
| 1564 | (Lisp_Object n, Lisp_Object list) | 1598 | (Lisp_Object n, Lisp_Object list) |
| 1565 | { | 1599 | { |
| 1566 | CHECK_FIXNUM (n); | 1600 | EMACS_INT m; |
| 1567 | EMACS_INT m = XFIXNUM (n); | 1601 | if (FIXNUMP (n)) |
| 1568 | if (m <= 0) | 1602 | { |
| 1569 | return Qnil; | 1603 | m = XFIXNUM (n); |
| 1604 | if (m <= 0) | ||
| 1605 | return Qnil; | ||
| 1606 | } | ||
| 1607 | else if (BIGNUMP (n)) | ||
| 1608 | { | ||
| 1609 | if (mpz_sgn (*xbignum_val (n)) < 0) | ||
| 1610 | return Qnil; | ||
| 1611 | m = MOST_POSITIVE_FIXNUM; | ||
| 1612 | } | ||
| 1613 | else | ||
| 1614 | wrong_type_argument (Qintegerp, n); | ||
| 1570 | CHECK_LIST (list); | 1615 | CHECK_LIST (list); |
| 1571 | if (NILP (list)) | 1616 | if (NILP (list)) |
| 1572 | return Qnil; | 1617 | return Qnil; |
| @@ -1594,10 +1639,21 @@ If N is greater or equal to the length of LIST, return LIST unmodified. | |||
| 1594 | Otherwise, return LIST after truncating it. */) | 1639 | Otherwise, return LIST after truncating it. */) |
| 1595 | (Lisp_Object n, Lisp_Object list) | 1640 | (Lisp_Object n, Lisp_Object list) |
| 1596 | { | 1641 | { |
| 1597 | CHECK_FIXNUM (n); | 1642 | EMACS_INT m; |
| 1598 | EMACS_INT m = XFIXNUM (n); | 1643 | if (FIXNUMP (n)) |
| 1599 | if (m <= 0) | 1644 | { |
| 1600 | return Qnil; | 1645 | m = XFIXNUM (n); |
| 1646 | if (m <= 0) | ||
| 1647 | return Qnil; | ||
| 1648 | } | ||
| 1649 | else if (BIGNUMP (n)) | ||
| 1650 | { | ||
| 1651 | if (mpz_sgn (*xbignum_val (n)) < 0) | ||
| 1652 | return Qnil; | ||
| 1653 | m = MOST_POSITIVE_FIXNUM; | ||
| 1654 | } | ||
| 1655 | else | ||
| 1656 | wrong_type_argument (Qintegerp, n); | ||
| 1601 | CHECK_LIST (list); | 1657 | CHECK_LIST (list); |
| 1602 | Lisp_Object tail = list; | 1658 | Lisp_Object tail = list; |
| 1603 | --m; | 1659 | --m; |
| @@ -2908,15 +2964,37 @@ FUNCTION must be a function of one argument, and must return a value | |||
| 2908 | return empty_unibyte_string; | 2964 | return empty_unibyte_string; |
| 2909 | Lisp_Object *args; | 2965 | Lisp_Object *args; |
| 2910 | SAFE_ALLOCA_LISP (args, args_alloc); | 2966 | SAFE_ALLOCA_LISP (args, args_alloc); |
| 2967 | if (EQ (function, Qidentity)) | ||
| 2968 | { | ||
| 2969 | /* Fast path when no function call is necessary. */ | ||
| 2970 | if (CONSP (sequence)) | ||
| 2971 | { | ||
| 2972 | Lisp_Object src = sequence; | ||
| 2973 | Lisp_Object *dst = args; | ||
| 2974 | do | ||
| 2975 | { | ||
| 2976 | *dst++ = XCAR (src); | ||
| 2977 | src = XCDR (src); | ||
| 2978 | } | ||
| 2979 | while (!NILP (src)); | ||
| 2980 | goto concat; | ||
| 2981 | } | ||
| 2982 | else if (VECTORP (sequence)) | ||
| 2983 | { | ||
| 2984 | memcpy (args, XVECTOR (sequence)->contents, leni * sizeof *args); | ||
| 2985 | goto concat; | ||
| 2986 | } | ||
| 2987 | } | ||
| 2911 | ptrdiff_t nmapped = mapcar1 (leni, args, function, sequence); | 2988 | ptrdiff_t nmapped = mapcar1 (leni, args, function, sequence); |
| 2912 | ptrdiff_t nargs = 2 * nmapped - 1; | ||
| 2913 | eassert (nmapped == leni); | 2989 | eassert (nmapped == leni); |
| 2914 | 2990 | ||
| 2991 | concat: ; | ||
| 2992 | ptrdiff_t nargs = args_alloc; | ||
| 2915 | if (NILP (separator) || (STRINGP (separator) && SCHARS (separator) == 0)) | 2993 | if (NILP (separator) || (STRINGP (separator) && SCHARS (separator) == 0)) |
| 2916 | nargs = nmapped; | 2994 | nargs = leni; |
| 2917 | else | 2995 | else |
| 2918 | { | 2996 | { |
| 2919 | for (ptrdiff_t i = nmapped - 1; i > 0; i--) | 2997 | for (ptrdiff_t i = leni - 1; i > 0; i--) |
| 2920 | args[i + i] = args[i]; | 2998 | args[i + i] = args[i]; |
| 2921 | 2999 | ||
| 2922 | for (ptrdiff_t i = 1; i < nargs; i += 2) | 3000 | for (ptrdiff_t i = 1; i < nargs; i += 2) |
diff --git a/src/font.c b/src/font.c index 8acedb9bf88..6e720bc2856 100644 --- a/src/font.c +++ b/src/font.c | |||
| @@ -1836,296 +1836,6 @@ font_parse_family_registry (Lisp_Object family, Lisp_Object registry, Lisp_Objec | |||
| 1836 | } | 1836 | } |
| 1837 | 1837 | ||
| 1838 | 1838 | ||
| 1839 | /* This part (through the next ^L) is still experimental and not | ||
| 1840 | tested much. We may drastically change codes. */ | ||
| 1841 | |||
| 1842 | /* OTF handler. */ | ||
| 1843 | |||
| 1844 | #if 0 | ||
| 1845 | |||
| 1846 | #define LGSTRING_HEADER_SIZE 6 | ||
| 1847 | #define LGSTRING_GLYPH_SIZE 8 | ||
| 1848 | |||
| 1849 | static int | ||
| 1850 | check_gstring (Lisp_Object gstring) | ||
| 1851 | { | ||
| 1852 | Lisp_Object val; | ||
| 1853 | ptrdiff_t i; | ||
| 1854 | int j; | ||
| 1855 | |||
| 1856 | CHECK_VECTOR (gstring); | ||
| 1857 | val = AREF (gstring, 0); | ||
| 1858 | CHECK_VECTOR (val); | ||
| 1859 | if (ASIZE (val) < LGSTRING_HEADER_SIZE) | ||
| 1860 | goto err; | ||
| 1861 | CHECK_FONT_OBJECT (LGSTRING_FONT (gstring)); | ||
| 1862 | if (!NILP (LGSTRING_SLOT (gstring, LGSTRING_IX_LBEARING))) | ||
| 1863 | CHECK_FIXNUM (LGSTRING_SLOT (gstring, LGSTRING_IX_LBEARING)); | ||
| 1864 | if (!NILP (LGSTRING_SLOT (gstring, LGSTRING_IX_RBEARING))) | ||
| 1865 | CHECK_FIXNUM (LGSTRING_SLOT (gstring, LGSTRING_IX_RBEARING)); | ||
| 1866 | if (!NILP (LGSTRING_SLOT (gstring, LGSTRING_IX_WIDTH))) | ||
| 1867 | CHECK_FIXNAT (LGSTRING_SLOT (gstring, LGSTRING_IX_WIDTH)); | ||
| 1868 | if (!NILP (LGSTRING_SLOT (gstring, LGSTRING_IX_ASCENT))) | ||
| 1869 | CHECK_FIXNUM (LGSTRING_SLOT (gstring, LGSTRING_IX_ASCENT)); | ||
| 1870 | if (!NILP (LGSTRING_SLOT (gstring, LGSTRING_IX_ASCENT))) | ||
| 1871 | CHECK_FIXNUM (LGSTRING_SLOT (gstring, LGSTRING_IX_ASCENT)); | ||
| 1872 | |||
| 1873 | for (i = 0; i < LGSTRING_GLYPH_LEN (gstring); i++) | ||
| 1874 | { | ||
| 1875 | val = LGSTRING_GLYPH (gstring, i); | ||
| 1876 | CHECK_VECTOR (val); | ||
| 1877 | if (ASIZE (val) < LGSTRING_GLYPH_SIZE) | ||
| 1878 | goto err; | ||
| 1879 | if (NILP (AREF (val, LGLYPH_IX_CHAR))) | ||
| 1880 | break; | ||
| 1881 | CHECK_FIXNAT (AREF (val, LGLYPH_IX_FROM)); | ||
| 1882 | CHECK_FIXNAT (AREF (val, LGLYPH_IX_TO)); | ||
| 1883 | CHECK_CHARACTER (AREF (val, LGLYPH_IX_CHAR)); | ||
| 1884 | if (!NILP (AREF (val, LGLYPH_IX_CODE))) | ||
| 1885 | CHECK_FIXNAT (AREF (val, LGLYPH_IX_CODE)); | ||
| 1886 | if (!NILP (AREF (val, LGLYPH_IX_WIDTH))) | ||
| 1887 | CHECK_FIXNAT (AREF (val, LGLYPH_IX_WIDTH)); | ||
| 1888 | if (!NILP (AREF (val, LGLYPH_IX_ADJUSTMENT))) | ||
| 1889 | { | ||
| 1890 | val = AREF (val, LGLYPH_IX_ADJUSTMENT); | ||
| 1891 | CHECK_VECTOR (val); | ||
| 1892 | if (ASIZE (val) < 3) | ||
| 1893 | goto err; | ||
| 1894 | for (j = 0; j < 3; j++) | ||
| 1895 | CHECK_FIXNUM (AREF (val, j)); | ||
| 1896 | } | ||
| 1897 | } | ||
| 1898 | return i; | ||
| 1899 | err: | ||
| 1900 | error ("Invalid glyph-string format"); | ||
| 1901 | return -1; | ||
| 1902 | } | ||
| 1903 | |||
| 1904 | static void | ||
| 1905 | check_otf_features (Lisp_Object otf_features) | ||
| 1906 | { | ||
| 1907 | Lisp_Object val; | ||
| 1908 | |||
| 1909 | CHECK_CONS (otf_features); | ||
| 1910 | CHECK_SYMBOL (XCAR (otf_features)); | ||
| 1911 | otf_features = XCDR (otf_features); | ||
| 1912 | CHECK_CONS (otf_features); | ||
| 1913 | CHECK_SYMBOL (XCAR (otf_features)); | ||
| 1914 | otf_features = XCDR (otf_features); | ||
| 1915 | for (val = Fcar (otf_features); CONSP (val); val = XCDR (val)) | ||
| 1916 | { | ||
| 1917 | CHECK_SYMBOL (XCAR (val)); | ||
| 1918 | if (SBYTES (SYMBOL_NAME (XCAR (val))) > 4) | ||
| 1919 | error ("Invalid OTF GSUB feature: %s", | ||
| 1920 | SDATA (SYMBOL_NAME (XCAR (val)))); | ||
| 1921 | } | ||
| 1922 | otf_features = XCDR (otf_features); | ||
| 1923 | for (val = Fcar (otf_features); CONSP (val); val = XCDR (val)) | ||
| 1924 | { | ||
| 1925 | CHECK_SYMBOL (XCAR (val)); | ||
| 1926 | if (SBYTES (SYMBOL_NAME (XCAR (val))) > 4) | ||
| 1927 | error ("Invalid OTF GPOS feature: %s", | ||
| 1928 | SDATA (SYMBOL_NAME (XCAR (val)))); | ||
| 1929 | } | ||
| 1930 | } | ||
| 1931 | |||
| 1932 | #ifdef HAVE_LIBOTF | ||
| 1933 | #include <otf.h> | ||
| 1934 | |||
| 1935 | Lisp_Object otf_list; | ||
| 1936 | |||
| 1937 | static Lisp_Object | ||
| 1938 | otf_tag_symbol (OTF_Tag tag) | ||
| 1939 | { | ||
| 1940 | char name[5]; | ||
| 1941 | |||
| 1942 | OTF_tag_name (tag, name); | ||
| 1943 | return Fintern (make_unibyte_string (name, 4), Qnil); | ||
| 1944 | } | ||
| 1945 | |||
| 1946 | static OTF * | ||
| 1947 | otf_open (Lisp_Object file) | ||
| 1948 | { | ||
| 1949 | Lisp_Object val = Fassoc (file, otf_list, Qnil); | ||
| 1950 | OTF *otf; | ||
| 1951 | |||
| 1952 | if (! NILP (val)) | ||
| 1953 | otf = xmint_pointer (XCDR (val)); | ||
| 1954 | else | ||
| 1955 | { | ||
| 1956 | otf = STRINGP (file) ? OTF_open (SSDATA (file)) : NULL; | ||
| 1957 | val = make_mint_ptr (otf); | ||
| 1958 | otf_list = Fcons (Fcons (file, val), otf_list); | ||
| 1959 | } | ||
| 1960 | return otf; | ||
| 1961 | } | ||
| 1962 | |||
| 1963 | |||
| 1964 | /* Return a list describing which scripts/languages FONT supports by | ||
| 1965 | which GSUB/GPOS features of OpenType tables. See the comment of | ||
| 1966 | (struct font_driver).otf_capability. */ | ||
| 1967 | |||
| 1968 | Lisp_Object | ||
| 1969 | font_otf_capability (struct font *font) | ||
| 1970 | { | ||
| 1971 | OTF *otf; | ||
| 1972 | Lisp_Object capability = Fcons (Qnil, Qnil); | ||
| 1973 | int i; | ||
| 1974 | |||
| 1975 | otf = otf_open (font->props[FONT_FILE_INDEX]); | ||
| 1976 | if (! otf) | ||
| 1977 | return Qnil; | ||
| 1978 | for (i = 0; i < 2; i++) | ||
| 1979 | { | ||
| 1980 | OTF_GSUB_GPOS *gsub_gpos; | ||
| 1981 | Lisp_Object script_list = Qnil; | ||
| 1982 | int j; | ||
| 1983 | |||
| 1984 | if (OTF_get_features (otf, i == 0) < 0) | ||
| 1985 | continue; | ||
| 1986 | gsub_gpos = i == 0 ? otf->gsub : otf->gpos; | ||
| 1987 | for (j = gsub_gpos->ScriptList.ScriptCount - 1; j >= 0; j--) | ||
| 1988 | { | ||
| 1989 | OTF_Script *script = gsub_gpos->ScriptList.Script + j; | ||
| 1990 | Lisp_Object langsys_list = Qnil; | ||
| 1991 | Lisp_Object script_tag = otf_tag_symbol (script->ScriptTag); | ||
| 1992 | int k; | ||
| 1993 | |||
| 1994 | for (k = script->LangSysCount; k >= 0; k--) | ||
| 1995 | { | ||
| 1996 | OTF_LangSys *langsys; | ||
| 1997 | Lisp_Object feature_list = Qnil; | ||
| 1998 | Lisp_Object langsys_tag; | ||
| 1999 | int l; | ||
| 2000 | |||
| 2001 | if (k == script->LangSysCount) | ||
| 2002 | { | ||
| 2003 | langsys = &script->DefaultLangSys; | ||
| 2004 | langsys_tag = Qnil; | ||
| 2005 | } | ||
| 2006 | else | ||
| 2007 | { | ||
| 2008 | langsys = script->LangSys + k; | ||
| 2009 | langsys_tag | ||
| 2010 | = otf_tag_symbol (script->LangSysRecord[k].LangSysTag); | ||
| 2011 | } | ||
| 2012 | for (l = langsys->FeatureCount - 1; l >= 0; l--) | ||
| 2013 | { | ||
| 2014 | OTF_Feature *feature | ||
| 2015 | = gsub_gpos->FeatureList.Feature + langsys->FeatureIndex[l]; | ||
| 2016 | Lisp_Object feature_tag | ||
| 2017 | = otf_tag_symbol (feature->FeatureTag); | ||
| 2018 | |||
| 2019 | feature_list = Fcons (feature_tag, feature_list); | ||
| 2020 | } | ||
| 2021 | langsys_list = Fcons (Fcons (langsys_tag, feature_list), | ||
| 2022 | langsys_list); | ||
| 2023 | } | ||
| 2024 | script_list = Fcons (Fcons (script_tag, langsys_list), | ||
| 2025 | script_list); | ||
| 2026 | } | ||
| 2027 | |||
| 2028 | if (i == 0) | ||
| 2029 | XSETCAR (capability, script_list); | ||
| 2030 | else | ||
| 2031 | XSETCDR (capability, script_list); | ||
| 2032 | } | ||
| 2033 | |||
| 2034 | return capability; | ||
| 2035 | } | ||
| 2036 | |||
| 2037 | /* Parse OTF features in SPEC and write a proper features spec string | ||
| 2038 | in FEATURES for the call of OTF_drive_gsub/gpos (of libotf). It is | ||
| 2039 | assured that the sufficient memory has already allocated for | ||
| 2040 | FEATURES. */ | ||
| 2041 | |||
| 2042 | static void | ||
| 2043 | generate_otf_features (Lisp_Object spec, char *features) | ||
| 2044 | { | ||
| 2045 | Lisp_Object val; | ||
| 2046 | char *p; | ||
| 2047 | bool asterisk; | ||
| 2048 | |||
| 2049 | p = features; | ||
| 2050 | *p = '\0'; | ||
| 2051 | for (asterisk = 0; CONSP (spec); spec = XCDR (spec)) | ||
| 2052 | { | ||
| 2053 | val = XCAR (spec); | ||
| 2054 | CHECK_SYMBOL (val); | ||
| 2055 | if (p > features) | ||
| 2056 | *p++ = ','; | ||
| 2057 | if (SREF (SYMBOL_NAME (val), 0) == '*') | ||
| 2058 | { | ||
| 2059 | asterisk = 1; | ||
| 2060 | *p++ = '*'; | ||
| 2061 | } | ||
| 2062 | else if (! asterisk) | ||
| 2063 | { | ||
| 2064 | val = SYMBOL_NAME (val); | ||
| 2065 | p += esprintf (p, "%s", SDATA (val)); | ||
| 2066 | } | ||
| 2067 | else | ||
| 2068 | { | ||
| 2069 | val = SYMBOL_NAME (val); | ||
| 2070 | p += esprintf (p, "~%s", SDATA (val)); | ||
| 2071 | } | ||
| 2072 | } | ||
| 2073 | if (CONSP (spec)) | ||
| 2074 | error ("OTF spec too long"); | ||
| 2075 | } | ||
| 2076 | |||
| 2077 | Lisp_Object | ||
| 2078 | font_otf_DeviceTable (OTF_DeviceTable *device_table) | ||
| 2079 | { | ||
| 2080 | int len = device_table->StartSize - device_table->EndSize + 1; | ||
| 2081 | |||
| 2082 | return Fcons (make_fixnum (len), | ||
| 2083 | make_unibyte_string (device_table->DeltaValue, len)); | ||
| 2084 | } | ||
| 2085 | |||
| 2086 | Lisp_Object | ||
| 2087 | font_otf_ValueRecord (int value_format, OTF_ValueRecord *value_record) | ||
| 2088 | { | ||
| 2089 | Lisp_Object val = make_nil_vector (8); | ||
| 2090 | |||
| 2091 | if (value_format & OTF_XPlacement) | ||
| 2092 | ASET (val, 0, make_fixnum (value_record->XPlacement)); | ||
| 2093 | if (value_format & OTF_YPlacement) | ||
| 2094 | ASET (val, 1, make_fixnum (value_record->YPlacement)); | ||
| 2095 | if (value_format & OTF_XAdvance) | ||
| 2096 | ASET (val, 2, make_fixnum (value_record->XAdvance)); | ||
| 2097 | if (value_format & OTF_YAdvance) | ||
| 2098 | ASET (val, 3, make_fixnum (value_record->YAdvance)); | ||
| 2099 | if (value_format & OTF_XPlaDevice) | ||
| 2100 | ASET (val, 4, font_otf_DeviceTable (&value_record->XPlaDevice)); | ||
| 2101 | if (value_format & OTF_YPlaDevice) | ||
| 2102 | ASET (val, 4, font_otf_DeviceTable (&value_record->YPlaDevice)); | ||
| 2103 | if (value_format & OTF_XAdvDevice) | ||
| 2104 | ASET (val, 4, font_otf_DeviceTable (&value_record->XAdvDevice)); | ||
| 2105 | if (value_format & OTF_YAdvDevice) | ||
| 2106 | ASET (val, 4, font_otf_DeviceTable (&value_record->YAdvDevice)); | ||
| 2107 | return val; | ||
| 2108 | } | ||
| 2109 | |||
| 2110 | Lisp_Object | ||
| 2111 | font_otf_Anchor (OTF_Anchor *anchor) | ||
| 2112 | { | ||
| 2113 | Lisp_Object val = make_nil_vector (anchor->AnchorFormat + 1); | ||
| 2114 | ASET (val, 0, make_fixnum (anchor->XCoordinate)); | ||
| 2115 | ASET (val, 1, make_fixnum (anchor->YCoordinate)); | ||
| 2116 | if (anchor->AnchorFormat == 2) | ||
| 2117 | ASET (val, 2, make_fixnum (anchor->f.f1.AnchorPoint)); | ||
| 2118 | else | ||
| 2119 | { | ||
| 2120 | ASET (val, 3, font_otf_DeviceTable (&anchor->f.f2.XDeviceTable)); | ||
| 2121 | ASET (val, 4, font_otf_DeviceTable (&anchor->f.f2.YDeviceTable)); | ||
| 2122 | } | ||
| 2123 | return val; | ||
| 2124 | } | ||
| 2125 | #endif /* HAVE_LIBOTF */ | ||
| 2126 | #endif /* 0 */ | ||
| 2127 | |||
| 2128 | |||
| 2129 | /* Font sorting. */ | 1839 | /* Font sorting. */ |
| 2130 | 1840 | ||
| 2131 | static double | 1841 | static double |
| @@ -4041,7 +3751,7 @@ which kind of font it is. It must be one of `font-spec', `font-entity', | |||
| 4041 | return (FONT_ENTITY_P (object) ? Qt : Qnil); | 3751 | return (FONT_ENTITY_P (object) ? Qt : Qnil); |
| 4042 | if (EQ (extra_type, Qfont_object)) | 3752 | if (EQ (extra_type, Qfont_object)) |
| 4043 | return (FONT_OBJECT_P (object) ? Qt : Qnil); | 3753 | return (FONT_OBJECT_P (object) ? Qt : Qnil); |
| 4044 | wrong_type_argument (intern ("font-extra-type"), extra_type); | 3754 | wrong_type_argument (Qfont_extra_type, extra_type); ; |
| 4045 | } | 3755 | } |
| 4046 | 3756 | ||
| 4047 | DEFUN ("font-spec", Ffont_spec, Sfont_spec, 0, MANY, 0, | 3757 | DEFUN ("font-spec", Ffont_spec, Sfont_spec, 0, MANY, 0, |
| @@ -4678,6 +4388,7 @@ GSTRING. */) | |||
| 4678 | from = LGLYPH_FROM (glyph); | 4388 | from = LGLYPH_FROM (glyph); |
| 4679 | to = LGLYPH_TO (glyph); | 4389 | to = LGLYPH_TO (glyph); |
| 4680 | } | 4390 | } |
| 4391 | composition_gstring_adjust_zero_width (gstring); | ||
| 4681 | return composition_gstring_put_cache (gstring, XFIXNUM (n)); | 4392 | return composition_gstring_put_cache (gstring, XFIXNUM (n)); |
| 4682 | 4393 | ||
| 4683 | shaper_error: | 4394 | shaper_error: |
| @@ -4728,7 +4439,8 @@ where | |||
| 4728 | that apply to POSITION. POSITION may be nil, in which case, | 4439 | that apply to POSITION. POSITION may be nil, in which case, |
| 4729 | FONT-SPEC is the font for displaying the character CH with the | 4440 | FONT-SPEC is the font for displaying the character CH with the |
| 4730 | default face. GLYPH-CODE is the glyph code in the font to use for | 4441 | default face. GLYPH-CODE is the glyph code in the font to use for |
| 4731 | the character, as an integer. | 4442 | the character, it is a fixnum, if it is small enough, otherwise a |
| 4443 | bignum. | ||
| 4732 | 4444 | ||
| 4733 | For a text terminal, return a nonnegative integer glyph code for | 4445 | For a text terminal, return a nonnegative integer glyph code for |
| 4734 | the character, or a negative integer if the character is not | 4446 | the character, or a negative integer if the character is not |
| @@ -4818,8 +4530,300 @@ DEFUN ("internal-char-font", Finternal_char_font, Sinternal_char_font, 1, 2, 0, | |||
| 4818 | return Fcons (font_object, INT_TO_INTEGER (code)); | 4530 | return Fcons (font_object, INT_TO_INTEGER (code)); |
| 4819 | } | 4531 | } |
| 4820 | 4532 | ||
| 4533 | |||
| 4534 | /* This part (through the next ^L) is still experimental and not | ||
| 4535 | tested much. We may drastically change codes. */ | ||
| 4536 | |||
| 4537 | /* This code implements support for extracting OTF features of a font | ||
| 4538 | and exposing them to Lisp, including application of those features | ||
| 4539 | to arbitrary stretches of text. FIXME: it would be good to finish | ||
| 4540 | this work and have this in Emacs. */ | ||
| 4541 | |||
| 4542 | /* OTF handler. */ | ||
| 4543 | |||
| 4821 | #if 0 | 4544 | #if 0 |
| 4822 | 4545 | ||
| 4546 | #define LGSTRING_HEADER_SIZE 6 | ||
| 4547 | #define LGSTRING_GLYPH_SIZE 8 | ||
| 4548 | |||
| 4549 | static int | ||
| 4550 | check_gstring (Lisp_Object gstring) | ||
| 4551 | { | ||
| 4552 | Lisp_Object val; | ||
| 4553 | ptrdiff_t i; | ||
| 4554 | int j; | ||
| 4555 | |||
| 4556 | CHECK_VECTOR (gstring); | ||
| 4557 | val = AREF (gstring, 0); | ||
| 4558 | CHECK_VECTOR (val); | ||
| 4559 | if (ASIZE (val) < LGSTRING_HEADER_SIZE) | ||
| 4560 | goto err; | ||
| 4561 | CHECK_FONT_OBJECT (LGSTRING_FONT (gstring)); | ||
| 4562 | if (!NILP (LGSTRING_SLOT (gstring, LGSTRING_IX_LBEARING))) | ||
| 4563 | CHECK_FIXNUM (LGSTRING_SLOT (gstring, LGSTRING_IX_LBEARING)); | ||
| 4564 | if (!NILP (LGSTRING_SLOT (gstring, LGSTRING_IX_RBEARING))) | ||
| 4565 | CHECK_FIXNUM (LGSTRING_SLOT (gstring, LGSTRING_IX_RBEARING)); | ||
| 4566 | if (!NILP (LGSTRING_SLOT (gstring, LGSTRING_IX_WIDTH))) | ||
| 4567 | CHECK_FIXNAT (LGSTRING_SLOT (gstring, LGSTRING_IX_WIDTH)); | ||
| 4568 | if (!NILP (LGSTRING_SLOT (gstring, LGSTRING_IX_ASCENT))) | ||
| 4569 | CHECK_FIXNUM (LGSTRING_SLOT (gstring, LGSTRING_IX_ASCENT)); | ||
| 4570 | if (!NILP (LGSTRING_SLOT (gstring, LGSTRING_IX_ASCENT))) | ||
| 4571 | CHECK_FIXNUM (LGSTRING_SLOT (gstring, LGSTRING_IX_ASCENT)); | ||
| 4572 | |||
| 4573 | for (i = 0; i < LGSTRING_GLYPH_LEN (gstring); i++) | ||
| 4574 | { | ||
| 4575 | val = LGSTRING_GLYPH (gstring, i); | ||
| 4576 | CHECK_VECTOR (val); | ||
| 4577 | if (ASIZE (val) < LGSTRING_GLYPH_SIZE) | ||
| 4578 | goto err; | ||
| 4579 | if (NILP (AREF (val, LGLYPH_IX_CHAR))) | ||
| 4580 | break; | ||
| 4581 | CHECK_FIXNAT (AREF (val, LGLYPH_IX_FROM)); | ||
| 4582 | CHECK_FIXNAT (AREF (val, LGLYPH_IX_TO)); | ||
| 4583 | CHECK_CHARACTER (AREF (val, LGLYPH_IX_CHAR)); | ||
| 4584 | if (!NILP (AREF (val, LGLYPH_IX_CODE))) | ||
| 4585 | CHECK_FIXNAT (AREF (val, LGLYPH_IX_CODE)); | ||
| 4586 | if (!NILP (AREF (val, LGLYPH_IX_WIDTH))) | ||
| 4587 | CHECK_FIXNAT (AREF (val, LGLYPH_IX_WIDTH)); | ||
| 4588 | if (!NILP (AREF (val, LGLYPH_IX_ADJUSTMENT))) | ||
| 4589 | { | ||
| 4590 | val = AREF (val, LGLYPH_IX_ADJUSTMENT); | ||
| 4591 | CHECK_VECTOR (val); | ||
| 4592 | if (ASIZE (val) < 3) | ||
| 4593 | goto err; | ||
| 4594 | for (j = 0; j < 3; j++) | ||
| 4595 | CHECK_FIXNUM (AREF (val, j)); | ||
| 4596 | } | ||
| 4597 | } | ||
| 4598 | return i; | ||
| 4599 | err: | ||
| 4600 | error ("Invalid glyph-string format"); | ||
| 4601 | return -1; | ||
| 4602 | } | ||
| 4603 | |||
| 4604 | static void | ||
| 4605 | check_otf_features (Lisp_Object otf_features) | ||
| 4606 | { | ||
| 4607 | Lisp_Object val; | ||
| 4608 | |||
| 4609 | CHECK_CONS (otf_features); | ||
| 4610 | CHECK_SYMBOL (XCAR (otf_features)); | ||
| 4611 | otf_features = XCDR (otf_features); | ||
| 4612 | CHECK_CONS (otf_features); | ||
| 4613 | CHECK_SYMBOL (XCAR (otf_features)); | ||
| 4614 | otf_features = XCDR (otf_features); | ||
| 4615 | for (val = Fcar (otf_features); CONSP (val); val = XCDR (val)) | ||
| 4616 | { | ||
| 4617 | CHECK_SYMBOL (XCAR (val)); | ||
| 4618 | if (SBYTES (SYMBOL_NAME (XCAR (val))) > 4) | ||
| 4619 | error ("Invalid OTF GSUB feature: %s", | ||
| 4620 | SDATA (SYMBOL_NAME (XCAR (val)))); | ||
| 4621 | } | ||
| 4622 | otf_features = XCDR (otf_features); | ||
| 4623 | for (val = Fcar (otf_features); CONSP (val); val = XCDR (val)) | ||
| 4624 | { | ||
| 4625 | CHECK_SYMBOL (XCAR (val)); | ||
| 4626 | if (SBYTES (SYMBOL_NAME (XCAR (val))) > 4) | ||
| 4627 | error ("Invalid OTF GPOS feature: %s", | ||
| 4628 | SDATA (SYMBOL_NAME (XCAR (val)))); | ||
| 4629 | } | ||
| 4630 | } | ||
| 4631 | |||
| 4632 | #ifdef HAVE_LIBOTF | ||
| 4633 | #include <otf.h> | ||
| 4634 | |||
| 4635 | Lisp_Object otf_list; | ||
| 4636 | |||
| 4637 | static Lisp_Object | ||
| 4638 | otf_tag_symbol (OTF_Tag tag) | ||
| 4639 | { | ||
| 4640 | char name[5]; | ||
| 4641 | |||
| 4642 | OTF_tag_name (tag, name); | ||
| 4643 | return Fintern (make_unibyte_string (name, 4), Qnil); | ||
| 4644 | } | ||
| 4645 | |||
| 4646 | static OTF * | ||
| 4647 | otf_open (Lisp_Object file) | ||
| 4648 | { | ||
| 4649 | Lisp_Object val = Fassoc (file, otf_list, Qnil); | ||
| 4650 | OTF *otf; | ||
| 4651 | |||
| 4652 | if (! NILP (val)) | ||
| 4653 | otf = xmint_pointer (XCDR (val)); | ||
| 4654 | else | ||
| 4655 | { | ||
| 4656 | otf = STRINGP (file) ? OTF_open (SSDATA (file)) : NULL; | ||
| 4657 | val = make_mint_ptr (otf); | ||
| 4658 | otf_list = Fcons (Fcons (file, val), otf_list); | ||
| 4659 | } | ||
| 4660 | return otf; | ||
| 4661 | } | ||
| 4662 | |||
| 4663 | |||
| 4664 | /* Return a list describing which scripts/languages FONT supports by | ||
| 4665 | which GSUB/GPOS features of OpenType tables. See the comment of | ||
| 4666 | (struct font_driver).otf_capability. */ | ||
| 4667 | |||
| 4668 | Lisp_Object | ||
| 4669 | font_otf_capability (struct font *font) | ||
| 4670 | { | ||
| 4671 | OTF *otf; | ||
| 4672 | Lisp_Object capability = Fcons (Qnil, Qnil); | ||
| 4673 | int i; | ||
| 4674 | |||
| 4675 | otf = otf_open (font->props[FONT_FILE_INDEX]); | ||
| 4676 | if (! otf) | ||
| 4677 | return Qnil; | ||
| 4678 | for (i = 0; i < 2; i++) | ||
| 4679 | { | ||
| 4680 | OTF_GSUB_GPOS *gsub_gpos; | ||
| 4681 | Lisp_Object script_list = Qnil; | ||
| 4682 | int j; | ||
| 4683 | |||
| 4684 | if (OTF_get_features (otf, i == 0) < 0) | ||
| 4685 | continue; | ||
| 4686 | gsub_gpos = i == 0 ? otf->gsub : otf->gpos; | ||
| 4687 | for (j = gsub_gpos->ScriptList.ScriptCount - 1; j >= 0; j--) | ||
| 4688 | { | ||
| 4689 | OTF_Script *script = gsub_gpos->ScriptList.Script + j; | ||
| 4690 | Lisp_Object langsys_list = Qnil; | ||
| 4691 | Lisp_Object script_tag = otf_tag_symbol (script->ScriptTag); | ||
| 4692 | int k; | ||
| 4693 | |||
| 4694 | for (k = script->LangSysCount; k >= 0; k--) | ||
| 4695 | { | ||
| 4696 | OTF_LangSys *langsys; | ||
| 4697 | Lisp_Object feature_list = Qnil; | ||
| 4698 | Lisp_Object langsys_tag; | ||
| 4699 | int l; | ||
| 4700 | |||
| 4701 | if (k == script->LangSysCount) | ||
| 4702 | { | ||
| 4703 | langsys = &script->DefaultLangSys; | ||
| 4704 | langsys_tag = Qnil; | ||
| 4705 | } | ||
| 4706 | else | ||
| 4707 | { | ||
| 4708 | langsys = script->LangSys + k; | ||
| 4709 | langsys_tag | ||
| 4710 | = otf_tag_symbol (script->LangSysRecord[k].LangSysTag); | ||
| 4711 | } | ||
| 4712 | for (l = langsys->FeatureCount - 1; l >= 0; l--) | ||
| 4713 | { | ||
| 4714 | OTF_Feature *feature | ||
| 4715 | = gsub_gpos->FeatureList.Feature + langsys->FeatureIndex[l]; | ||
| 4716 | Lisp_Object feature_tag | ||
| 4717 | = otf_tag_symbol (feature->FeatureTag); | ||
| 4718 | |||
| 4719 | feature_list = Fcons (feature_tag, feature_list); | ||
| 4720 | } | ||
| 4721 | langsys_list = Fcons (Fcons (langsys_tag, feature_list), | ||
| 4722 | langsys_list); | ||
| 4723 | } | ||
| 4724 | script_list = Fcons (Fcons (script_tag, langsys_list), | ||
| 4725 | script_list); | ||
| 4726 | } | ||
| 4727 | |||
| 4728 | if (i == 0) | ||
| 4729 | XSETCAR (capability, script_list); | ||
| 4730 | else | ||
| 4731 | XSETCDR (capability, script_list); | ||
| 4732 | } | ||
| 4733 | |||
| 4734 | return capability; | ||
| 4735 | } | ||
| 4736 | |||
| 4737 | /* Parse OTF features in SPEC and write a proper features spec string | ||
| 4738 | in FEATURES for the call of OTF_drive_gsub/gpos (of libotf). It is | ||
| 4739 | assured that the sufficient memory has already allocated for | ||
| 4740 | FEATURES. */ | ||
| 4741 | |||
| 4742 | static void | ||
| 4743 | generate_otf_features (Lisp_Object spec, char *features) | ||
| 4744 | { | ||
| 4745 | Lisp_Object val; | ||
| 4746 | char *p; | ||
| 4747 | bool asterisk; | ||
| 4748 | |||
| 4749 | p = features; | ||
| 4750 | *p = '\0'; | ||
| 4751 | for (asterisk = 0; CONSP (spec); spec = XCDR (spec)) | ||
| 4752 | { | ||
| 4753 | val = XCAR (spec); | ||
| 4754 | CHECK_SYMBOL (val); | ||
| 4755 | if (p > features) | ||
| 4756 | *p++ = ','; | ||
| 4757 | if (SREF (SYMBOL_NAME (val), 0) == '*') | ||
| 4758 | { | ||
| 4759 | asterisk = 1; | ||
| 4760 | *p++ = '*'; | ||
| 4761 | } | ||
| 4762 | else if (! asterisk) | ||
| 4763 | { | ||
| 4764 | val = SYMBOL_NAME (val); | ||
| 4765 | p += esprintf (p, "%s", SDATA (val)); | ||
| 4766 | } | ||
| 4767 | else | ||
| 4768 | { | ||
| 4769 | val = SYMBOL_NAME (val); | ||
| 4770 | p += esprintf (p, "~%s", SDATA (val)); | ||
| 4771 | } | ||
| 4772 | } | ||
| 4773 | if (CONSP (spec)) | ||
| 4774 | error ("OTF spec too long"); | ||
| 4775 | } | ||
| 4776 | |||
| 4777 | Lisp_Object | ||
| 4778 | font_otf_DeviceTable (OTF_DeviceTable *device_table) | ||
| 4779 | { | ||
| 4780 | int len = device_table->StartSize - device_table->EndSize + 1; | ||
| 4781 | |||
| 4782 | return Fcons (make_fixnum (len), | ||
| 4783 | make_unibyte_string (device_table->DeltaValue, len)); | ||
| 4784 | } | ||
| 4785 | |||
| 4786 | Lisp_Object | ||
| 4787 | font_otf_ValueRecord (int value_format, OTF_ValueRecord *value_record) | ||
| 4788 | { | ||
| 4789 | Lisp_Object val = make_nil_vector (8); | ||
| 4790 | |||
| 4791 | if (value_format & OTF_XPlacement) | ||
| 4792 | ASET (val, 0, make_fixnum (value_record->XPlacement)); | ||
| 4793 | if (value_format & OTF_YPlacement) | ||
| 4794 | ASET (val, 1, make_fixnum (value_record->YPlacement)); | ||
| 4795 | if (value_format & OTF_XAdvance) | ||
| 4796 | ASET (val, 2, make_fixnum (value_record->XAdvance)); | ||
| 4797 | if (value_format & OTF_YAdvance) | ||
| 4798 | ASET (val, 3, make_fixnum (value_record->YAdvance)); | ||
| 4799 | if (value_format & OTF_XPlaDevice) | ||
| 4800 | ASET (val, 4, font_otf_DeviceTable (&value_record->XPlaDevice)); | ||
| 4801 | if (value_format & OTF_YPlaDevice) | ||
| 4802 | ASET (val, 4, font_otf_DeviceTable (&value_record->YPlaDevice)); | ||
| 4803 | if (value_format & OTF_XAdvDevice) | ||
| 4804 | ASET (val, 4, font_otf_DeviceTable (&value_record->XAdvDevice)); | ||
| 4805 | if (value_format & OTF_YAdvDevice) | ||
| 4806 | ASET (val, 4, font_otf_DeviceTable (&value_record->YAdvDevice)); | ||
| 4807 | return val; | ||
| 4808 | } | ||
| 4809 | |||
| 4810 | Lisp_Object | ||
| 4811 | font_otf_Anchor (OTF_Anchor *anchor) | ||
| 4812 | { | ||
| 4813 | Lisp_Object val = make_nil_vector (anchor->AnchorFormat + 1); | ||
| 4814 | ASET (val, 0, make_fixnum (anchor->XCoordinate)); | ||
| 4815 | ASET (val, 1, make_fixnum (anchor->YCoordinate)); | ||
| 4816 | if (anchor->AnchorFormat == 2) | ||
| 4817 | ASET (val, 2, make_fixnum (anchor->f.f1.AnchorPoint)); | ||
| 4818 | else | ||
| 4819 | { | ||
| 4820 | ASET (val, 3, font_otf_DeviceTable (&anchor->f.f2.XDeviceTable)); | ||
| 4821 | ASET (val, 4, font_otf_DeviceTable (&anchor->f.f2.YDeviceTable)); | ||
| 4822 | } | ||
| 4823 | return val; | ||
| 4824 | } | ||
| 4825 | #endif /* HAVE_LIBOTF */ | ||
| 4826 | |||
| 4823 | DEFUN ("font-drive-otf", Ffont_drive_otf, Sfont_drive_otf, 6, 6, 0, | 4827 | DEFUN ("font-drive-otf", Ffont_drive_otf, Sfont_drive_otf, 6, 6, 0, |
| 4824 | doc: /* Apply OpenType features on glyph-string GSTRING-IN. | 4828 | doc: /* Apply OpenType features on glyph-string GSTRING-IN. |
| 4825 | OTF-FEATURES specifies which features to apply in this format: | 4829 | OTF-FEATURES specifies which features to apply in this format: |
| @@ -4938,6 +4942,7 @@ corresponding character. */) | |||
| 4938 | } | 4942 | } |
| 4939 | #endif /* 0 */ | 4943 | #endif /* 0 */ |
| 4940 | 4944 | ||
| 4945 | |||
| 4941 | #ifdef FONT_DEBUG | 4946 | #ifdef FONT_DEBUG |
| 4942 | 4947 | ||
| 4943 | DEFUN ("open-font", Fopen_font, Sopen_font, 1, 3, 0, | 4948 | DEFUN ("open-font", Fopen_font, Sopen_font, 1, 3, 0, |
| @@ -5555,6 +5560,10 @@ syms_of_font (void) | |||
| 5555 | 5560 | ||
| 5556 | DEFSYM (Qopentype, "opentype"); | 5561 | DEFSYM (Qopentype, "opentype"); |
| 5557 | 5562 | ||
| 5563 | /* Currently used by hbfont.c, which has no syms_of_hbfont function | ||
| 5564 | of its own. */ | ||
| 5565 | DEFSYM (Qcanonical_combining_class, "canonical-combining-class"); | ||
| 5566 | |||
| 5558 | /* Important character set symbols. */ | 5567 | /* Important character set symbols. */ |
| 5559 | DEFSYM (Qascii_0, "ascii-0"); | 5568 | DEFSYM (Qascii_0, "ascii-0"); |
| 5560 | DEFSYM (Qiso8859_1, "iso8859-1"); | 5569 | DEFSYM (Qiso8859_1, "iso8859-1"); |
| @@ -5594,6 +5603,7 @@ syms_of_font (void) | |||
| 5594 | DEFSYM (QL2R, "L2R"); | 5603 | DEFSYM (QL2R, "L2R"); |
| 5595 | DEFSYM (QR2L, "R2L"); | 5604 | DEFSYM (QR2L, "R2L"); |
| 5596 | 5605 | ||
| 5606 | DEFSYM (Qfont_extra_type, "font-extra-type"); | ||
| 5597 | DEFSYM (Qfont_driver_superseded_by, "font-driver-superseded-by"); | 5607 | DEFSYM (Qfont_driver_superseded_by, "font-driver-superseded-by"); |
| 5598 | 5608 | ||
| 5599 | scratch_font_spec = Ffont_spec (0, NULL); | 5609 | scratch_font_spec = Ffont_spec (0, NULL); |
diff --git a/src/font.h b/src/font.h index 06bd297ccb2..3475189206f 100644 --- a/src/font.h +++ b/src/font.h | |||
| @@ -660,7 +660,7 @@ struct font_driver | |||
| 660 | 660 | ||
| 661 | /* Optional. | 661 | /* Optional. |
| 662 | Draw glyphs between FROM and TO of S->char2b at (X Y) pixel | 662 | Draw glyphs between FROM and TO of S->char2b at (X Y) pixel |
| 663 | position of frame F with S->FACE and S->GC. If WITH_BACKGROUND, | 663 | position of frame S->f with S->face and S->gc. If WITH_BACKGROUND, |
| 664 | fill the background in advance. It is assured that WITH_BACKGROUND | 664 | fill the background in advance. It is assured that WITH_BACKGROUND |
| 665 | is false when (FROM > 0 || TO < S->nchars). */ | 665 | is false when (FROM > 0 || TO < S->nchars). */ |
| 666 | int (*draw) (struct glyph_string *s, int from, int to, | 666 | int (*draw) (struct glyph_string *s, int from, int to, |
diff --git a/src/fontset.c b/src/fontset.c index 1793715450e..4b91eff2ef6 100644 --- a/src/fontset.c +++ b/src/fontset.c | |||
| @@ -922,8 +922,6 @@ face_for_char (struct frame *f, struct face *face, int c, | |||
| 922 | int face_id; | 922 | int face_id; |
| 923 | int id; | 923 | int id; |
| 924 | 924 | ||
| 925 | eassert (fontset_id_valid_p (face->fontset)); | ||
| 926 | |||
| 927 | if (ASCII_CHAR_P (c) || CHAR_BYTE8_P (c)) | 925 | if (ASCII_CHAR_P (c) || CHAR_BYTE8_P (c)) |
| 928 | return face->ascii_face->id; | 926 | return face->ascii_face->id; |
| 929 | 927 | ||
| @@ -969,6 +967,7 @@ face_for_char (struct frame *f, struct face *face, int c, | |||
| 969 | #endif | 967 | #endif |
| 970 | } | 968 | } |
| 971 | 969 | ||
| 970 | eassert (fontset_id_valid_p (face->fontset)); | ||
| 972 | fontset = FONTSET_FROM_ID (face->fontset); | 971 | fontset = FONTSET_FROM_ID (face->fontset); |
| 973 | eassert (!BASE_FONTSET_P (fontset)); | 972 | eassert (!BASE_FONTSET_P (fontset)); |
| 974 | 973 | ||
diff --git a/src/frame.c b/src/frame.c index 25d71e0769f..91b9bec82c3 100644 --- a/src/frame.c +++ b/src/frame.c | |||
| @@ -6243,7 +6243,7 @@ You can also use a floating number between 0.0 and 1.0. */); | |||
| 6243 | #endif | 6243 | #endif |
| 6244 | 6244 | ||
| 6245 | DEFVAR_LISP ("default-frame-alist", Vdefault_frame_alist, | 6245 | DEFVAR_LISP ("default-frame-alist", Vdefault_frame_alist, |
| 6246 | doc: /* Alist of default values for frame creation. | 6246 | doc: /* Alist of default values of frame parameters for frame creation. |
| 6247 | These may be set in your init file, like this: | 6247 | These may be set in your init file, like this: |
| 6248 | (setq default-frame-alist \\='((width . 80) (height . 55) (menu-bar-lines . 1))) | 6248 | (setq default-frame-alist \\='((width . 80) (height . 55) (menu-bar-lines . 1))) |
| 6249 | 6249 | ||
diff --git a/src/ftcrfont.c b/src/ftcrfont.c index e089f9dea85..dc765e5aee4 100644 --- a/src/ftcrfont.c +++ b/src/ftcrfont.c | |||
| @@ -233,6 +233,7 @@ ftcrfont_open (struct frame *f, Lisp_Object entity, int pixel_size) | |||
| 233 | cairo_glyph_t stack_glyph; | 233 | cairo_glyph_t stack_glyph; |
| 234 | font->min_width = font->max_width = 0; | 234 | font->min_width = font->max_width = 0; |
| 235 | font->average_width = font->space_width = 0; | 235 | font->average_width = font->space_width = 0; |
| 236 | int n = 0; | ||
| 236 | for (char c = 32; c < 127; c++) | 237 | for (char c = 32; c < 127; c++) |
| 237 | { | 238 | { |
| 238 | cairo_glyph_t *glyphs = &stack_glyph; | 239 | cairo_glyph_t *glyphs = &stack_glyph; |
| @@ -252,17 +253,20 @@ ftcrfont_open (struct frame *f, Lisp_Object entity, int pixel_size) | |||
| 252 | stack_glyph.index = 0; | 253 | stack_glyph.index = 0; |
| 253 | } | 254 | } |
| 254 | int this_width = ftcrfont_glyph_extents (font, stack_glyph.index, NULL); | 255 | int this_width = ftcrfont_glyph_extents (font, stack_glyph.index, NULL); |
| 255 | if (this_width > 0 | 256 | if (this_width > 0) |
| 256 | && (! font->min_width | 257 | { |
| 257 | || font->min_width > this_width)) | 258 | if (! font->min_width || font->min_width > this_width) |
| 258 | font->min_width = this_width; | 259 | font->min_width = this_width; |
| 259 | if (this_width > font->max_width) | 260 | if (this_width > font->max_width) |
| 260 | font->max_width = this_width; | 261 | font->max_width = this_width; |
| 261 | if (c == 32) | 262 | if (c == 32) |
| 262 | font->space_width = this_width; | 263 | font->space_width = this_width; |
| 263 | font->average_width += this_width; | 264 | font->average_width += this_width; |
| 265 | n++; | ||
| 266 | } | ||
| 264 | } | 267 | } |
| 265 | font->average_width /= 95; | 268 | if (n) |
| 269 | font->average_width /= n; | ||
| 266 | 270 | ||
| 267 | cairo_scaled_font_extents (ftcrfont_info->cr_scaled_font, &extents); | 271 | cairo_scaled_font_extents (ftcrfont_info->cr_scaled_font, &extents); |
| 268 | font->ascent = lround (extents.ascent); | 272 | font->ascent = lround (extents.ascent); |
| @@ -679,8 +683,12 @@ ftcrhbfont_begin_hb_font (struct font *font, double *position_unit) | |||
| 679 | hb_font_t *hb_font = fthbfont_begin_hb_font (font, position_unit); | 683 | hb_font_t *hb_font = fthbfont_begin_hb_font (font, position_unit); |
| 680 | /* HarfBuzz 5 correctly scales bitmap-only fonts without position | 684 | /* HarfBuzz 5 correctly scales bitmap-only fonts without position |
| 681 | unit adjustment. | 685 | unit adjustment. |
| 682 | (https://github.com/harfbuzz/harfbuzz/issues/489) */ | 686 | (https://github.com/harfbuzz/harfbuzz/issues/489) |
| 683 | if (!hb_version_atleast (5, 0, 0) | 687 | |
| 688 | Update: HarfBuzz 5.2.0 no longer does this for an hb_font_t font | ||
| 689 | object created from a given FT_Face. | ||
| 690 | (https://github.com/harfbuzz/harfbuzz/issues/3788) */ | ||
| 691 | if ((hb_version_atleast (5, 2, 0) || !hb_version_atleast (5, 0, 0)) | ||
| 684 | && ftcrfont_info->bitmap_position_unit) | 692 | && ftcrfont_info->bitmap_position_unit) |
| 685 | *position_unit = ftcrfont_info->bitmap_position_unit; | 693 | *position_unit = ftcrfont_info->bitmap_position_unit; |
| 686 | 694 | ||
diff --git a/src/haiku_font_support.cc b/src/haiku_font_support.cc index d824cc59ae2..9a2492c9a13 100644 --- a/src/haiku_font_support.cc +++ b/src/haiku_font_support.cc | |||
| @@ -21,6 +21,14 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ | |||
| 21 | #include <Font.h> | 21 | #include <Font.h> |
| 22 | #include <Rect.h> | 22 | #include <Rect.h> |
| 23 | #include <AffineTransform.h> | 23 | #include <AffineTransform.h> |
| 24 | #include <FindDirectory.h> | ||
| 25 | #include <Path.h> | ||
| 26 | #include <File.h> | ||
| 27 | #include <Message.h> | ||
| 28 | #include <OS.h> | ||
| 29 | #include <Locker.h> | ||
| 30 | #include <NodeMonitor.h> | ||
| 31 | #include <Looper.h> | ||
| 24 | 32 | ||
| 25 | #include <cstring> | 33 | #include <cstring> |
| 26 | #include <cmath> | 34 | #include <cmath> |
| @@ -39,15 +47,57 @@ struct font_object_cache_bucket | |||
| 39 | 47 | ||
| 40 | static struct font_object_cache_bucket *font_object_cache[2048]; | 48 | static struct font_object_cache_bucket *font_object_cache[2048]; |
| 41 | 49 | ||
| 50 | /* The current global monospace family and style. */ | ||
| 51 | static char *fixed_family, *fixed_style; | ||
| 52 | |||
| 53 | /* The current global variable-width family and style. */ | ||
| 54 | static char *default_family, *default_style; | ||
| 55 | |||
| 56 | /* The sizes of each of those fonts. */ | ||
| 57 | static float default_size, fixed_size; | ||
| 58 | |||
| 59 | /* The locker controlling access to those variables. */ | ||
| 60 | static BLocker default_locker; | ||
| 61 | |||
| 42 | /* Haiku doesn't expose font language data in BFont objects. Thus, we | 62 | /* Haiku doesn't expose font language data in BFont objects. Thus, we |
| 43 | select a few representative characters for each supported `:lang' | 63 | select a few representative characters for each supported `:lang' |
| 44 | (currently Chinese, Korean and Japanese,) and test for those | 64 | (currently Chinese, Korean and Japanese,) and test for those |
| 45 | instead. */ | 65 | instead. */ |
| 46 | 66 | ||
| 47 | static int language_code_points[MAX_LANGUAGE][3] = | 67 | static int language_code_points[MAX_LANGUAGE][3] = |
| 48 | {{20154, 20754, 22996}, /* Chinese. */ | 68 | { |
| 49 | {51312, 49440, 44544}, /* Korean. */ | 69 | {20154, 20754, 22996}, /* Chinese. */ |
| 50 | {26085, 26412, 12371}, /* Japanese. */}; | 70 | {51312, 49440, 44544}, /* Korean. */ |
| 71 | {26085, 26412, 12371}, /* Japanese. */ | ||
| 72 | }; | ||
| 73 | |||
| 74 | static void be_send_font_settings (void); | ||
| 75 | |||
| 76 | /* Looper used to track changes to system-wide font settings. */ | ||
| 77 | class EmacsFontMonitorLooper : public BLooper | ||
| 78 | { | ||
| 79 | void | ||
| 80 | MessageReceived (BMessage *msg) | ||
| 81 | { | ||
| 82 | int32 opcode; | ||
| 83 | |||
| 84 | if (msg->what != B_NODE_MONITOR) | ||
| 85 | return; | ||
| 86 | |||
| 87 | if (msg->FindInt32 ("opcode", &opcode) != B_OK) | ||
| 88 | return; | ||
| 89 | |||
| 90 | if (opcode != B_STAT_CHANGED) | ||
| 91 | return; | ||
| 92 | |||
| 93 | /* Wait a little for any message to be completely written after | ||
| 94 | the file's modification time changes. */ | ||
| 95 | snooze (10000); | ||
| 96 | |||
| 97 | /* Read and apply font settings. */ | ||
| 98 | be_send_font_settings (); | ||
| 99 | } | ||
| 100 | }; | ||
| 51 | 101 | ||
| 52 | static unsigned int | 102 | static unsigned int |
| 53 | hash_string (const char *name_or_style) | 103 | hash_string (const char *name_or_style) |
| @@ -288,12 +338,15 @@ BFont_nchar_bounds (void *font, const char *mb_str, int *advance, | |||
| 288 | } | 338 | } |
| 289 | 339 | ||
| 290 | static void | 340 | static void |
| 291 | font_style_to_flags (char *st, struct haiku_font_pattern *pattern) | 341 | font_style_to_flags (const char *style_string, |
| 342 | struct haiku_font_pattern *pattern) | ||
| 292 | { | 343 | { |
| 293 | char *style = strdup (st); | 344 | char *style; |
| 294 | char *token; | 345 | char *token; |
| 295 | int tok = 0; | 346 | int tok = 0; |
| 296 | 347 | ||
| 348 | style = strdup (style_string); | ||
| 349 | |||
| 297 | if (!style) | 350 | if (!style) |
| 298 | return; | 351 | return; |
| 299 | 352 | ||
| @@ -385,7 +438,8 @@ font_style_to_flags (char *st, struct haiku_font_pattern *pattern) | |||
| 385 | pattern->specified &= ~FSPEC_WEIGHT; | 438 | pattern->specified &= ~FSPEC_WEIGHT; |
| 386 | pattern->specified &= ~FSPEC_WIDTH; | 439 | pattern->specified &= ~FSPEC_WIDTH; |
| 387 | pattern->specified |= FSPEC_STYLE; | 440 | pattern->specified |= FSPEC_STYLE; |
| 388 | std::strncpy ((char *) &pattern->style, st, | 441 | std::strncpy ((char *) &pattern->style, |
| 442 | style_string, | ||
| 389 | sizeof pattern->style - 1); | 443 | sizeof pattern->style - 1); |
| 390 | pattern->style[sizeof pattern->style - 1] = '\0'; | 444 | pattern->style[sizeof pattern->style - 1] = '\0'; |
| 391 | } | 445 | } |
| @@ -887,7 +941,7 @@ be_evict_font_cache (void) | |||
| 887 | } | 941 | } |
| 888 | 942 | ||
| 889 | void | 943 | void |
| 890 | be_font_style_to_flags (char *style, struct haiku_font_pattern *pattern) | 944 | be_font_style_to_flags (const char *style, struct haiku_font_pattern *pattern) |
| 891 | { | 945 | { |
| 892 | pattern->specified = 0; | 946 | pattern->specified = 0; |
| 893 | 947 | ||
| @@ -939,3 +993,217 @@ be_set_font_antialiasing (void *font, bool antialias_p) | |||
| 939 | ? B_FORCE_ANTIALIASING | 993 | ? B_FORCE_ANTIALIASING |
| 940 | : B_DISABLE_ANTIALIASING); | 994 | : B_DISABLE_ANTIALIASING); |
| 941 | } | 995 | } |
| 996 | |||
| 997 | static void | ||
| 998 | be_send_font_settings (void) | ||
| 999 | { | ||
| 1000 | struct haiku_font_change_event rq; | ||
| 1001 | BFile file; | ||
| 1002 | BPath path; | ||
| 1003 | status_t rc; | ||
| 1004 | BMessage message; | ||
| 1005 | font_family family; | ||
| 1006 | font_style style; | ||
| 1007 | const char *new_family, *new_style; | ||
| 1008 | float new_size; | ||
| 1009 | |||
| 1010 | rc = find_directory (B_USER_SETTINGS_DIRECTORY, &path); | ||
| 1011 | |||
| 1012 | if (rc < B_OK) | ||
| 1013 | return; | ||
| 1014 | |||
| 1015 | rc = path.Append ("system/app_server/fonts"); | ||
| 1016 | |||
| 1017 | if (rc < B_OK) | ||
| 1018 | return; | ||
| 1019 | |||
| 1020 | if (file.SetTo (path.Path (), B_READ_ONLY) != B_OK) | ||
| 1021 | return; | ||
| 1022 | |||
| 1023 | if (message.Unflatten (&file) != B_OK) | ||
| 1024 | return; | ||
| 1025 | |||
| 1026 | /* Now, populate with new values. */ | ||
| 1027 | if (!default_locker.Lock ()) | ||
| 1028 | gui_abort ("Failed to lock font data locker"); | ||
| 1029 | |||
| 1030 | /* Obtain default values. */ | ||
| 1031 | be_fixed_font->GetFamilyAndStyle (&family, &style); | ||
| 1032 | default_size = be_fixed_font->Size (); | ||
| 1033 | |||
| 1034 | /* And the new values. */ | ||
| 1035 | new_family = message.GetString ("fixed family", family); | ||
| 1036 | new_style = message.GetString ("fixed style", style); | ||
| 1037 | new_size = message.GetFloat ("fixed size", default_size); | ||
| 1038 | |||
| 1039 | /* If it turns out the fixed family changed, send the new family and | ||
| 1040 | style. */ | ||
| 1041 | |||
| 1042 | if (!fixed_family || !fixed_style | ||
| 1043 | || new_size != fixed_size | ||
| 1044 | || strcmp (new_family, fixed_family) | ||
| 1045 | || strcmp (new_style, fixed_style)) | ||
| 1046 | { | ||
| 1047 | memset (&rq, 0, sizeof rq); | ||
| 1048 | strncpy (rq.new_family, (char *) new_family, | ||
| 1049 | sizeof rq.new_family - 1); | ||
| 1050 | strncpy (rq.new_style, (char *) new_style, | ||
| 1051 | sizeof rq.new_style - 1); | ||
| 1052 | rq.new_size = new_size; | ||
| 1053 | rq.what = FIXED_FAMILY; | ||
| 1054 | |||
| 1055 | haiku_write (FONT_CHANGE_EVENT, &rq); | ||
| 1056 | } | ||
| 1057 | |||
| 1058 | if (fixed_family) | ||
| 1059 | free (fixed_family); | ||
| 1060 | |||
| 1061 | if (fixed_style) | ||
| 1062 | free (fixed_style); | ||
| 1063 | |||
| 1064 | fixed_family = strdup (new_family); | ||
| 1065 | fixed_style = strdup (new_style); | ||
| 1066 | fixed_size = new_size; | ||
| 1067 | |||
| 1068 | /* Obtain default values. */ | ||
| 1069 | be_plain_font->GetFamilyAndStyle (&family, &style); | ||
| 1070 | default_size = be_plain_font->Size (); | ||
| 1071 | |||
| 1072 | /* And the new values. */ | ||
| 1073 | new_family = message.GetString ("plain family", family); | ||
| 1074 | new_style = message.GetString ("plain style", style); | ||
| 1075 | new_size = message.GetFloat ("plain style", default_size); | ||
| 1076 | |||
| 1077 | if (!default_family || !default_style | ||
| 1078 | || new_size != default_size | ||
| 1079 | || strcmp (new_family, default_family) | ||
| 1080 | || strcmp (new_style, default_style)) | ||
| 1081 | { | ||
| 1082 | memset (&rq, 0, sizeof rq); | ||
| 1083 | strncpy (rq.new_family, (char *) new_family, | ||
| 1084 | sizeof rq.new_family - 1); | ||
| 1085 | strncpy (rq.new_style, (char *) new_style, | ||
| 1086 | sizeof rq.new_style - 1); | ||
| 1087 | rq.new_size = new_size; | ||
| 1088 | rq.what = DEFAULT_FAMILY; | ||
| 1089 | |||
| 1090 | haiku_write (FONT_CHANGE_EVENT, &rq); | ||
| 1091 | } | ||
| 1092 | |||
| 1093 | if (default_family) | ||
| 1094 | free (default_family); | ||
| 1095 | |||
| 1096 | if (default_style) | ||
| 1097 | free (default_style); | ||
| 1098 | |||
| 1099 | default_family = strdup (new_family); | ||
| 1100 | default_style = strdup (new_style); | ||
| 1101 | default_size = new_size; | ||
| 1102 | |||
| 1103 | default_locker.Unlock (); | ||
| 1104 | } | ||
| 1105 | |||
| 1106 | /* Begin listening to font settings changes, by installing a node | ||
| 1107 | watcher. This relies on the settings file already being present | ||
| 1108 | and has several inherent race conditions, but users shouldn't be | ||
| 1109 | changing font settings very quickly. */ | ||
| 1110 | |||
| 1111 | void | ||
| 1112 | be_listen_font_settings (void) | ||
| 1113 | { | ||
| 1114 | BPath path; | ||
| 1115 | status_t rc; | ||
| 1116 | BNode node; | ||
| 1117 | node_ref node_ref; | ||
| 1118 | EmacsFontMonitorLooper *looper; | ||
| 1119 | font_family family; | ||
| 1120 | font_style style; | ||
| 1121 | |||
| 1122 | /* Set up initial values. */ | ||
| 1123 | be_fixed_font->GetFamilyAndStyle (&family, &style); | ||
| 1124 | fixed_family = strdup (family); | ||
| 1125 | fixed_style = strdup (style); | ||
| 1126 | fixed_size = be_fixed_font->Size (); | ||
| 1127 | |||
| 1128 | be_plain_font->GetFamilyAndStyle (&family, &style); | ||
| 1129 | default_family = strdup (family); | ||
| 1130 | default_style = strdup (style); | ||
| 1131 | default_size = be_plain_font->Size (); | ||
| 1132 | |||
| 1133 | rc = find_directory (B_USER_SETTINGS_DIRECTORY, &path); | ||
| 1134 | |||
| 1135 | if (rc < B_OK) | ||
| 1136 | return; | ||
| 1137 | |||
| 1138 | rc = path.Append ("system/app_server/fonts"); | ||
| 1139 | |||
| 1140 | if (rc < B_OK) | ||
| 1141 | return; | ||
| 1142 | |||
| 1143 | rc = node.SetTo (path.Path ()); | ||
| 1144 | |||
| 1145 | if (rc < B_OK) | ||
| 1146 | return; | ||
| 1147 | |||
| 1148 | if (node.GetNodeRef (&node_ref) < B_OK) | ||
| 1149 | return; | ||
| 1150 | |||
| 1151 | looper = new EmacsFontMonitorLooper; | ||
| 1152 | |||
| 1153 | if (watch_node (&node_ref, B_WATCH_STAT, looper) < B_OK) | ||
| 1154 | { | ||
| 1155 | delete looper; | ||
| 1156 | return; | ||
| 1157 | } | ||
| 1158 | |||
| 1159 | looper->Run (); | ||
| 1160 | } | ||
| 1161 | |||
| 1162 | bool | ||
| 1163 | be_lock_font_defaults (void) | ||
| 1164 | { | ||
| 1165 | return default_locker.Lock (); | ||
| 1166 | } | ||
| 1167 | |||
| 1168 | void | ||
| 1169 | be_unlock_font_defaults (void) | ||
| 1170 | { | ||
| 1171 | return default_locker.Unlock (); | ||
| 1172 | } | ||
| 1173 | |||
| 1174 | const char * | ||
| 1175 | be_get_font_default (enum haiku_what_font what) | ||
| 1176 | { | ||
| 1177 | switch (what) | ||
| 1178 | { | ||
| 1179 | case FIXED_FAMILY: | ||
| 1180 | return fixed_family; | ||
| 1181 | |||
| 1182 | case FIXED_STYLE: | ||
| 1183 | return fixed_style; | ||
| 1184 | |||
| 1185 | case DEFAULT_FAMILY: | ||
| 1186 | return default_family; | ||
| 1187 | |||
| 1188 | case DEFAULT_STYLE: | ||
| 1189 | return default_style; | ||
| 1190 | } | ||
| 1191 | |||
| 1192 | return NULL; | ||
| 1193 | } | ||
| 1194 | |||
| 1195 | int | ||
| 1196 | be_get_font_size (enum haiku_what_font what) | ||
| 1197 | { | ||
| 1198 | switch (what) | ||
| 1199 | { | ||
| 1200 | case FIXED_FAMILY: | ||
| 1201 | return fixed_size; | ||
| 1202 | |||
| 1203 | case DEFAULT_FAMILY: | ||
| 1204 | return default_size; | ||
| 1205 | |||
| 1206 | default: | ||
| 1207 | return 0; | ||
| 1208 | } | ||
| 1209 | } | ||
diff --git a/src/haiku_io.c b/src/haiku_io.c index 5cc70f6f71f..6ef6f2ebd06 100644 --- a/src/haiku_io.c +++ b/src/haiku_io.c | |||
| @@ -109,6 +109,8 @@ haiku_len (enum haiku_event_type type) | |||
| 109 | return sizeof (struct haiku_screen_changed_event); | 109 | return sizeof (struct haiku_screen_changed_event); |
| 110 | case CLIPBOARD_CHANGED_EVENT: | 110 | case CLIPBOARD_CHANGED_EVENT: |
| 111 | return sizeof (struct haiku_clipboard_changed_event); | 111 | return sizeof (struct haiku_clipboard_changed_event); |
| 112 | case FONT_CHANGE_EVENT: | ||
| 113 | return sizeof (struct haiku_font_change_event); | ||
| 112 | } | 114 | } |
| 113 | 115 | ||
| 114 | emacs_abort (); | 116 | emacs_abort (); |
diff --git a/src/haiku_support.cc b/src/haiku_support.cc index 983928442a1..0f8e26d0db4 100644 --- a/src/haiku_support.cc +++ b/src/haiku_support.cc | |||
| @@ -54,12 +54,14 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ | |||
| 54 | #include <game/WindowScreen.h> | 54 | #include <game/WindowScreen.h> |
| 55 | #include <game/DirectWindow.h> | 55 | #include <game/DirectWindow.h> |
| 56 | 56 | ||
| 57 | #include <storage/FindDirectory.h> | ||
| 57 | #include <storage/Entry.h> | 58 | #include <storage/Entry.h> |
| 58 | #include <storage/Path.h> | 59 | #include <storage/Path.h> |
| 59 | #include <storage/FilePanel.h> | 60 | #include <storage/FilePanel.h> |
| 60 | #include <storage/AppFileInfo.h> | 61 | #include <storage/AppFileInfo.h> |
| 61 | #include <storage/Path.h> | 62 | #include <storage/Path.h> |
| 62 | #include <storage/PathFinder.h> | 63 | #include <storage/PathFinder.h> |
| 64 | #include <storage/Node.h> | ||
| 63 | 65 | ||
| 64 | #include <support/Beep.h> | 66 | #include <support/Beep.h> |
| 65 | #include <support/DataIO.h> | 67 | #include <support/DataIO.h> |
| @@ -5501,3 +5503,54 @@ be_set_use_frame_synchronization (void *view, bool sync) | |||
| 5501 | vw = (EmacsView *) view; | 5503 | vw = (EmacsView *) view; |
| 5502 | vw->SetFrameSynchronization (sync); | 5504 | vw->SetFrameSynchronization (sync); |
| 5503 | } | 5505 | } |
| 5506 | |||
| 5507 | status_t | ||
| 5508 | be_write_node_message (const char *path, const char *name, void *message) | ||
| 5509 | { | ||
| 5510 | BNode node (path); | ||
| 5511 | status_t rc; | ||
| 5512 | ssize_t flat, result; | ||
| 5513 | char *buffer; | ||
| 5514 | BMessage *msg; | ||
| 5515 | |||
| 5516 | rc = node.InitCheck (); | ||
| 5517 | msg = (BMessage *) message; | ||
| 5518 | |||
| 5519 | if (rc < B_OK) | ||
| 5520 | return rc; | ||
| 5521 | |||
| 5522 | flat = msg->FlattenedSize (); | ||
| 5523 | if (flat < B_OK) | ||
| 5524 | return flat; | ||
| 5525 | |||
| 5526 | buffer = new (std::nothrow) char[flat]; | ||
| 5527 | if (!buffer) | ||
| 5528 | return B_NO_MEMORY; | ||
| 5529 | |||
| 5530 | rc = msg->Flatten (buffer, flat); | ||
| 5531 | if (rc < B_OK) | ||
| 5532 | { | ||
| 5533 | delete[] buffer; | ||
| 5534 | return rc; | ||
| 5535 | } | ||
| 5536 | |||
| 5537 | result = node.WriteAttr (name, B_MIME_TYPE, 0, | ||
| 5538 | buffer, flat); | ||
| 5539 | delete[] buffer; | ||
| 5540 | |||
| 5541 | if (result < B_OK) | ||
| 5542 | return result; | ||
| 5543 | |||
| 5544 | if (result != flat) | ||
| 5545 | return B_ERROR; | ||
| 5546 | |||
| 5547 | return B_OK; | ||
| 5548 | } | ||
| 5549 | |||
| 5550 | void | ||
| 5551 | be_send_message (const char *app_id, void *message) | ||
| 5552 | { | ||
| 5553 | BMessenger messenger (app_id); | ||
| 5554 | |||
| 5555 | messenger.SendMessage ((BMessage *) message); | ||
| 5556 | } | ||
diff --git a/src/haiku_support.h b/src/haiku_support.h index ca1808556a4..e940e69bf11 100644 --- a/src/haiku_support.h +++ b/src/haiku_support.h | |||
| @@ -115,6 +115,7 @@ enum haiku_event_type | |||
| 115 | SCREEN_CHANGED_EVENT, | 115 | SCREEN_CHANGED_EVENT, |
| 116 | MENU_BAR_LEFT, | 116 | MENU_BAR_LEFT, |
| 117 | CLIPBOARD_CHANGED_EVENT, | 117 | CLIPBOARD_CHANGED_EVENT, |
| 118 | FONT_CHANGE_EVENT, | ||
| 118 | }; | 119 | }; |
| 119 | 120 | ||
| 120 | struct haiku_clipboard_changed_event | 121 | struct haiku_clipboard_changed_event |
| @@ -442,6 +443,27 @@ struct haiku_menu_bar_state_event | |||
| 442 | void *window; | 443 | void *window; |
| 443 | }; | 444 | }; |
| 444 | 445 | ||
| 446 | enum haiku_what_font | ||
| 447 | { | ||
| 448 | FIXED_FAMILY, | ||
| 449 | FIXED_STYLE, | ||
| 450 | DEFAULT_FAMILY, | ||
| 451 | DEFAULT_STYLE, | ||
| 452 | }; | ||
| 453 | |||
| 454 | struct haiku_font_change_event | ||
| 455 | { | ||
| 456 | /* New family, style and size of the font. */ | ||
| 457 | haiku_font_family_or_style new_family; | ||
| 458 | haiku_font_family_or_style new_style; | ||
| 459 | int new_size; | ||
| 460 | |||
| 461 | /* What changed. FIXED_FAMILY means this is the new fixed font. | ||
| 462 | DEFAULT_FAMILY means this is the new plain font. The other enums | ||
| 463 | have no meaning. */ | ||
| 464 | enum haiku_what_font what; | ||
| 465 | }; | ||
| 466 | |||
| 445 | struct haiku_session_manager_reply | 467 | struct haiku_session_manager_reply |
| 446 | { | 468 | { |
| 447 | bool quit_reply; | 469 | bool quit_reply; |
| @@ -697,7 +719,7 @@ extern int be_get_display_screens (void); | |||
| 697 | extern bool be_use_subpixel_antialiasing (void); | 719 | extern bool be_use_subpixel_antialiasing (void); |
| 698 | extern const char *be_find_setting (const char *); | 720 | extern const char *be_find_setting (const char *); |
| 699 | extern haiku_font_family_or_style *be_list_font_families (size_t *); | 721 | extern haiku_font_family_or_style *be_list_font_families (size_t *); |
| 700 | extern void be_font_style_to_flags (char *, struct haiku_font_pattern *); | 722 | extern void be_font_style_to_flags (const char *, struct haiku_font_pattern *); |
| 701 | extern void *be_open_font_at_index (int, int, float); | 723 | extern void *be_open_font_at_index (int, int, float); |
| 702 | extern void be_set_font_antialiasing (void *, bool); | 724 | extern void be_set_font_antialiasing (void *, bool); |
| 703 | extern int be_get_ui_color (const char *, uint32_t *); | 725 | extern int be_get_ui_color (const char *, uint32_t *); |
| @@ -724,11 +746,21 @@ extern void be_get_window_decorator_frame (void *, int *, int *, int *, int *); | |||
| 724 | extern void be_send_move_frame_event (void *); | 746 | extern void be_send_move_frame_event (void *); |
| 725 | extern void be_set_window_fullscreen_mode (void *, enum haiku_fullscreen_mode); | 747 | extern void be_set_window_fullscreen_mode (void *, enum haiku_fullscreen_mode); |
| 726 | 748 | ||
| 749 | extern status_t be_write_node_message (const char *, const char *, void *); | ||
| 750 | extern void be_send_message (const char *, void *); | ||
| 751 | |||
| 727 | extern void be_lock_window (void *); | 752 | extern void be_lock_window (void *); |
| 728 | extern void be_unlock_window (void *); | 753 | extern void be_unlock_window (void *); |
| 729 | extern bool be_get_explicit_workarea (int *, int *, int *, int *); | 754 | extern bool be_get_explicit_workarea (int *, int *, int *, int *); |
| 730 | extern void be_clear_grab_view (void); | 755 | extern void be_clear_grab_view (void); |
| 731 | extern void be_set_use_frame_synchronization (void *, bool); | 756 | extern void be_set_use_frame_synchronization (void *, bool); |
| 757 | |||
| 758 | extern void be_listen_font_settings (void); | ||
| 759 | |||
| 760 | extern bool be_lock_font_defaults (void); | ||
| 761 | extern const char *be_get_font_default (enum haiku_what_font); | ||
| 762 | extern int be_get_font_size (enum haiku_what_font); | ||
| 763 | extern void be_unlock_font_defaults (void); | ||
| 732 | #ifdef __cplusplus | 764 | #ifdef __cplusplus |
| 733 | } | 765 | } |
| 734 | 766 | ||
diff --git a/src/haikufns.c b/src/haikufns.c index aaa4e866228..711202c5df3 100644 --- a/src/haikufns.c +++ b/src/haikufns.c | |||
| @@ -2636,8 +2636,7 @@ DEFUN ("x-show-tip", Fx_show_tip, Sx_show_tip, 1, 6, 0, | |||
| 2636 | 2636 | ||
| 2637 | start_timer: | 2637 | start_timer: |
| 2638 | /* Let the tip disappear after timeout seconds. */ | 2638 | /* Let the tip disappear after timeout seconds. */ |
| 2639 | tip_timer = call3 (intern ("run-at-time"), timeout, Qnil, | 2639 | tip_timer = call3 (Qrun_at_time, timeout, Qnil, Qx_hide_tip); |
| 2640 | intern ("x-hide-tip")); | ||
| 2641 | 2640 | ||
| 2642 | return unbind_to (count, Qnil); | 2641 | return unbind_to (count, Qnil); |
| 2643 | } | 2642 | } |
| @@ -3149,6 +3148,9 @@ syms_of_haikufns (void) | |||
| 3149 | DEFSYM (Qcancel_timer, "cancel-timer"); | 3148 | DEFSYM (Qcancel_timer, "cancel-timer"); |
| 3150 | DEFSYM (Qassq_delete_all, "assq-delete-all"); | 3149 | DEFSYM (Qassq_delete_all, "assq-delete-all"); |
| 3151 | 3150 | ||
| 3151 | DEFSYM (Qrun_at_time, "run-at-time"); | ||
| 3152 | DEFSYM (Qx_hide_tip, "x-hide-tip"); | ||
| 3153 | |||
| 3152 | DEFSYM (Qalways, "always"); | 3154 | DEFSYM (Qalways, "always"); |
| 3153 | DEFSYM (Qnot_useful, "not-useful"); | 3155 | DEFSYM (Qnot_useful, "not-useful"); |
| 3154 | DEFSYM (Qwhen_mapped, "when-mapped"); | 3156 | DEFSYM (Qwhen_mapped, "when-mapped"); |
diff --git a/src/haikufont.c b/src/haikufont.c index 3e7f6f86dcb..335c312cebe 100644 --- a/src/haikufont.c +++ b/src/haikufont.c | |||
| @@ -370,7 +370,7 @@ haikufont_maybe_handle_special_family (Lisp_Object family, | |||
| 370 | BFont_populate_fixed_family (ptn); | 370 | BFont_populate_fixed_family (ptn); |
| 371 | return 1; | 371 | return 1; |
| 372 | } | 372 | } |
| 373 | else if (EQ (family, intern ("Sans Serif"))) | 373 | else if (EQ (family, QSans_Serif)) |
| 374 | { | 374 | { |
| 375 | BFont_populate_plain_family (ptn); | 375 | BFont_populate_plain_family (ptn); |
| 376 | return 1; | 376 | return 1; |
| @@ -1311,6 +1311,98 @@ in the font selection dialog. */) | |||
| 1311 | QCsize, lsize); | 1311 | QCsize, lsize); |
| 1312 | } | 1312 | } |
| 1313 | 1313 | ||
| 1314 | DEFUN ("font-get-system-normal-font", Ffont_get_system_normal_font, | ||
| 1315 | Sfont_get_system_normal_font, 0, 0, 0, | ||
| 1316 | doc: /* SKIP: real doc in xsettings.c. */) | ||
| 1317 | (void) | ||
| 1318 | { | ||
| 1319 | Lisp_Object value; | ||
| 1320 | const char *name, *style; | ||
| 1321 | struct haiku_font_pattern pattern; | ||
| 1322 | Lisp_Object lfamily, lweight, lslant, lwidth, ladstyle; | ||
| 1323 | int size; | ||
| 1324 | |||
| 1325 | if (!be_lock_font_defaults ()) | ||
| 1326 | return Qnil; | ||
| 1327 | |||
| 1328 | name = be_get_font_default (DEFAULT_FAMILY); | ||
| 1329 | style = be_get_font_default (DEFAULT_STYLE); | ||
| 1330 | size = be_get_font_size (DEFAULT_FAMILY); | ||
| 1331 | |||
| 1332 | be_font_style_to_flags (style, &pattern); | ||
| 1333 | |||
| 1334 | lfamily = build_string_from_utf8 (name); | ||
| 1335 | lweight = (pattern.specified & FSPEC_WEIGHT | ||
| 1336 | ? haikufont_weight_to_lisp (pattern.weight) : Qnil); | ||
| 1337 | lslant = (pattern.specified & FSPEC_SLANT | ||
| 1338 | ? haikufont_slant_to_lisp (pattern.slant) : Qnil); | ||
| 1339 | lwidth = (pattern.specified & FSPEC_WIDTH | ||
| 1340 | ? haikufont_width_to_lisp (pattern.width) : Qnil); | ||
| 1341 | ladstyle = (pattern.specified & FSPEC_STYLE | ||
| 1342 | ? intern (pattern.style) : Qnil); | ||
| 1343 | |||
| 1344 | value = CALLN (Ffont_spec, QCfamily, lfamily, | ||
| 1345 | QCweight, lweight, QCslant, lslant, | ||
| 1346 | QCwidth, lwidth, QCadstyle, ladstyle, | ||
| 1347 | QCsize, make_fixnum (size)); | ||
| 1348 | be_unlock_font_defaults (); | ||
| 1349 | |||
| 1350 | return value; | ||
| 1351 | } | ||
| 1352 | |||
| 1353 | DEFUN ("font-get-system-font", Ffont_get_system_font, | ||
| 1354 | Sfont_get_system_font, 0, 0, 0, | ||
| 1355 | doc: /* SKIP: real doc in xsettings.c. */) | ||
| 1356 | (void) | ||
| 1357 | { | ||
| 1358 | Lisp_Object value; | ||
| 1359 | const char *name, *style; | ||
| 1360 | struct haiku_font_pattern pattern; | ||
| 1361 | Lisp_Object lfamily, lweight, lslant, lwidth, ladstyle; | ||
| 1362 | int size; | ||
| 1363 | |||
| 1364 | if (!be_lock_font_defaults ()) | ||
| 1365 | return Qnil; | ||
| 1366 | |||
| 1367 | name = be_get_font_default (FIXED_FAMILY); | ||
| 1368 | style = be_get_font_default (FIXED_STYLE); | ||
| 1369 | size = be_get_font_size (FIXED_FAMILY); | ||
| 1370 | |||
| 1371 | be_font_style_to_flags (style, &pattern); | ||
| 1372 | |||
| 1373 | lfamily = build_string_from_utf8 (name); | ||
| 1374 | lweight = (pattern.specified & FSPEC_WEIGHT | ||
| 1375 | ? haikufont_weight_to_lisp (pattern.weight) : Qnil); | ||
| 1376 | lslant = (pattern.specified & FSPEC_SLANT | ||
| 1377 | ? haikufont_slant_to_lisp (pattern.slant) : Qnil); | ||
| 1378 | lwidth = (pattern.specified & FSPEC_WIDTH | ||
| 1379 | ? haikufont_width_to_lisp (pattern.width) : Qnil); | ||
| 1380 | ladstyle = (pattern.specified & FSPEC_STYLE | ||
| 1381 | ? intern (pattern.style) : Qnil); | ||
| 1382 | |||
| 1383 | value = CALLN (Ffont_spec, QCfamily, lfamily, | ||
| 1384 | QCweight, lweight, QCslant, lslant, | ||
| 1385 | QCwidth, lwidth, QCadstyle, ladstyle, | ||
| 1386 | QCsize, make_fixnum (size)); | ||
| 1387 | be_unlock_font_defaults (); | ||
| 1388 | |||
| 1389 | return value; | ||
| 1390 | } | ||
| 1391 | |||
| 1392 | void | ||
| 1393 | haiku_handle_font_change_event (struct haiku_font_change_event *event, | ||
| 1394 | struct input_event *ie) | ||
| 1395 | { | ||
| 1396 | ie->kind = CONFIG_CHANGED_EVENT; | ||
| 1397 | |||
| 1398 | /* This is the name of the display. */ | ||
| 1399 | ie->frame_or_window = XCAR (x_display_list->name_list_element); | ||
| 1400 | |||
| 1401 | /* And this is the font that changed. */ | ||
| 1402 | ie->arg = (event->what == FIXED_FAMILY | ||
| 1403 | ? Qmonospace_font_name : Qfont_name); | ||
| 1404 | } | ||
| 1405 | |||
| 1314 | static void | 1406 | static void |
| 1315 | syms_of_haikufont_for_pdumper (void) | 1407 | syms_of_haikufont_for_pdumper (void) |
| 1316 | { | 1408 | { |
| @@ -1320,6 +1412,7 @@ syms_of_haikufont_for_pdumper (void) | |||
| 1320 | void | 1412 | void |
| 1321 | syms_of_haikufont (void) | 1413 | syms_of_haikufont (void) |
| 1322 | { | 1414 | { |
| 1415 | DEFSYM (QSans_Serif, "Sans Serif"); | ||
| 1323 | DEFSYM (Qfontsize, "fontsize"); | 1416 | DEFSYM (Qfontsize, "fontsize"); |
| 1324 | DEFSYM (Qfixed, "fixed"); | 1417 | DEFSYM (Qfixed, "fixed"); |
| 1325 | DEFSYM (Qplain, "plain"); | 1418 | DEFSYM (Qplain, "plain"); |
| @@ -1343,6 +1436,14 @@ syms_of_haikufont (void) | |||
| 1343 | 1436 | ||
| 1344 | DEFSYM (QCindices, ":indices"); | 1437 | DEFSYM (QCindices, ":indices"); |
| 1345 | 1438 | ||
| 1439 | DEFSYM (Qmonospace_font_name, "monospace-font-name"); | ||
| 1440 | DEFSYM (Qfont_name, "font-name"); | ||
| 1441 | DEFSYM (Qdynamic_setting, "dynamic-setting"); | ||
| 1442 | |||
| 1443 | DEFVAR_BOOL ("font-use-system-font", use_system_font, | ||
| 1444 | doc: /* SKIP: real doc in xsettings.c. */); | ||
| 1445 | use_system_font = false; | ||
| 1446 | |||
| 1346 | #ifdef USE_BE_CAIRO | 1447 | #ifdef USE_BE_CAIRO |
| 1347 | Fput (Qhaiku, Qfont_driver_superseded_by, Qftcr); | 1448 | Fput (Qhaiku, Qfont_driver_superseded_by, Qftcr); |
| 1348 | #endif | 1449 | #endif |
| @@ -1352,6 +1453,12 @@ syms_of_haikufont (void) | |||
| 1352 | staticpro (&font_cache); | 1453 | staticpro (&font_cache); |
| 1353 | 1454 | ||
| 1354 | defsubr (&Sx_select_font); | 1455 | defsubr (&Sx_select_font); |
| 1456 | defsubr (&Sfont_get_system_normal_font); | ||
| 1457 | defsubr (&Sfont_get_system_font); | ||
| 1355 | 1458 | ||
| 1356 | be_init_font_data (); | 1459 | be_init_font_data (); |
| 1460 | |||
| 1461 | /* This tells loadup to load dynamic-setting.el, which handles | ||
| 1462 | config-changed events. */ | ||
| 1463 | Fprovide (Qdynamic_setting, Qnil); | ||
| 1357 | } | 1464 | } |
diff --git a/src/haikuselect.c b/src/haikuselect.c index 7eb93a2754d..bd004f4900a 100644 --- a/src/haikuselect.c +++ b/src/haikuselect.c | |||
| @@ -325,6 +325,15 @@ haiku_message_to_lisp (void *message) | |||
| 325 | t1 = make_float (*(float *) buf); | 325 | t1 = make_float (*(float *) buf); |
| 326 | break; | 326 | break; |
| 327 | 327 | ||
| 328 | case 'CSTR': | ||
| 329 | /* Is this even possible? */ | ||
| 330 | if (!buf_size) | ||
| 331 | buf_size = 1; | ||
| 332 | |||
| 333 | t1 = make_uninit_string (buf_size - 1); | ||
| 334 | memcpy (SDATA (t1), buf, buf_size - 1); | ||
| 335 | break; | ||
| 336 | |||
| 328 | default: | 337 | default: |
| 329 | t1 = make_uninit_string (buf_size); | 338 | t1 = make_uninit_string (buf_size); |
| 330 | memcpy (SDATA (t1), buf, buf_size); | 339 | memcpy (SDATA (t1), buf, buf_size); |
| @@ -747,6 +756,21 @@ haiku_lisp_to_message (Lisp_Object obj, void *message) | |||
| 747 | signal_error ("Failed to add bool", data); | 756 | signal_error ("Failed to add bool", data); |
| 748 | break; | 757 | break; |
| 749 | 758 | ||
| 759 | case 'CSTR': | ||
| 760 | /* C strings must be handled specially, since they | ||
| 761 | include a trailing NULL byte. */ | ||
| 762 | CHECK_STRING (data); | ||
| 763 | |||
| 764 | block_input (); | ||
| 765 | rc = be_add_message_data (message, SSDATA (name), | ||
| 766 | type_code, SDATA (data), | ||
| 767 | SBYTES (data) + 1); | ||
| 768 | unblock_input (); | ||
| 769 | |||
| 770 | if (rc) | ||
| 771 | signal_error ("Failed to add", data); | ||
| 772 | break; | ||
| 773 | |||
| 750 | default: | 774 | default: |
| 751 | decode_normally: | 775 | decode_normally: |
| 752 | CHECK_STRING (data); | 776 | CHECK_STRING (data); |
| @@ -779,6 +803,49 @@ haiku_unwind_drag_message (void *message) | |||
| 779 | BMessage_delete (message); | 803 | BMessage_delete (message); |
| 780 | } | 804 | } |
| 781 | 805 | ||
| 806 | static void | ||
| 807 | haiku_report_system_error (status_t code, const char *format) | ||
| 808 | { | ||
| 809 | switch (code) | ||
| 810 | { | ||
| 811 | case B_BAD_VALUE: | ||
| 812 | error (format, "Bad value"); | ||
| 813 | break; | ||
| 814 | |||
| 815 | case B_ENTRY_NOT_FOUND: | ||
| 816 | error (format, "File not found"); | ||
| 817 | break; | ||
| 818 | |||
| 819 | case B_PERMISSION_DENIED: | ||
| 820 | error (format, "Permission denied"); | ||
| 821 | break; | ||
| 822 | |||
| 823 | case B_LINK_LIMIT: | ||
| 824 | error (format, "Link limit reached"); | ||
| 825 | break; | ||
| 826 | |||
| 827 | case B_BUSY: | ||
| 828 | error (format, "Device busy"); | ||
| 829 | break; | ||
| 830 | |||
| 831 | case B_NO_MORE_FDS: | ||
| 832 | error (format, "No more file descriptors"); | ||
| 833 | break; | ||
| 834 | |||
| 835 | case B_FILE_ERROR: | ||
| 836 | error (format, "File error"); | ||
| 837 | break; | ||
| 838 | |||
| 839 | case B_NO_MEMORY: | ||
| 840 | memory_full (SIZE_MAX); | ||
| 841 | break; | ||
| 842 | |||
| 843 | default: | ||
| 844 | error (format, "Unknown error"); | ||
| 845 | break; | ||
| 846 | } | ||
| 847 | } | ||
| 848 | |||
| 782 | DEFUN ("haiku-drag-message", Fhaiku_drag_message, Shaiku_drag_message, | 849 | DEFUN ("haiku-drag-message", Fhaiku_drag_message, Shaiku_drag_message, |
| 783 | 2, 4, 0, | 850 | 2, 4, 0, |
| 784 | doc: /* Begin dragging MESSAGE from FRAME. | 851 | doc: /* Begin dragging MESSAGE from FRAME. |
| @@ -958,6 +1025,66 @@ after it starts. */) | |||
| 958 | return SAFE_FREE_UNBIND_TO (depth, Qnil); | 1025 | return SAFE_FREE_UNBIND_TO (depth, Qnil); |
| 959 | } | 1026 | } |
| 960 | 1027 | ||
| 1028 | DEFUN ("haiku-write-node-attribute", Fhaiku_write_node_attribute, | ||
| 1029 | Shaiku_write_node_attribute, 3, 3, 0, | ||
| 1030 | doc: /* Write a message as a file-system attribute of NODE. | ||
| 1031 | FILE should be a file name of a file on a Be File System volume, NAME | ||
| 1032 | should be a string describing the name of the attribute that will be | ||
| 1033 | written, and MESSAGE will be the attribute written to FILE, as a | ||
| 1034 | system message in the format accepted by `haiku-drag-message', which | ||
| 1035 | see. */) | ||
| 1036 | (Lisp_Object file, Lisp_Object name, Lisp_Object message) | ||
| 1037 | { | ||
| 1038 | void *be_message; | ||
| 1039 | status_t rc; | ||
| 1040 | specpdl_ref count; | ||
| 1041 | |||
| 1042 | CHECK_STRING (file); | ||
| 1043 | CHECK_STRING (name); | ||
| 1044 | |||
| 1045 | file = ENCODE_FILE (file); | ||
| 1046 | name = ENCODE_SYSTEM (name); | ||
| 1047 | |||
| 1048 | be_message = be_create_simple_message (); | ||
| 1049 | count = SPECPDL_INDEX (); | ||
| 1050 | |||
| 1051 | record_unwind_protect_ptr (BMessage_delete, be_message); | ||
| 1052 | haiku_lisp_to_message (message, be_message); | ||
| 1053 | rc = be_write_node_message (SSDATA (file), SSDATA (name), | ||
| 1054 | be_message); | ||
| 1055 | |||
| 1056 | if (rc < B_OK) | ||
| 1057 | haiku_report_system_error (rc, "Failed to set attribute: %s"); | ||
| 1058 | |||
| 1059 | return unbind_to (count, Qnil); | ||
| 1060 | } | ||
| 1061 | |||
| 1062 | DEFUN ("haiku-send-message", Fhaiku_send_message, Shaiku_send_message, | ||
| 1063 | 2, 2, 0, | ||
| 1064 | doc: /* Send a system message to PROGRAM. | ||
| 1065 | PROGRAM must be the name of the application to which the message will | ||
| 1066 | be sent. MESSAGE is the system message, serialized in the format | ||
| 1067 | accepted by `haiku-drag-message', that will be sent to the application | ||
| 1068 | specified by PROGRAM. There is no guarantee that the message will | ||
| 1069 | arrive after this function is called. */) | ||
| 1070 | (Lisp_Object program, Lisp_Object message) | ||
| 1071 | { | ||
| 1072 | specpdl_ref count; | ||
| 1073 | void *be_message; | ||
| 1074 | |||
| 1075 | CHECK_STRING (program); | ||
| 1076 | program = ENCODE_SYSTEM (program); | ||
| 1077 | |||
| 1078 | be_message = be_create_simple_message (); | ||
| 1079 | count = SPECPDL_INDEX (); | ||
| 1080 | |||
| 1081 | record_unwind_protect_ptr (BMessage_delete, be_message); | ||
| 1082 | haiku_lisp_to_message (message, be_message); | ||
| 1083 | be_send_message (SSDATA (program), be_message); | ||
| 1084 | |||
| 1085 | return unbind_to (count, Qnil); | ||
| 1086 | } | ||
| 1087 | |||
| 961 | static void | 1088 | static void |
| 962 | haiku_dnd_compute_tip_xy (int *root_x, int *root_y) | 1089 | haiku_dnd_compute_tip_xy (int *root_x, int *root_y) |
| 963 | { | 1090 | { |
| @@ -1191,6 +1318,8 @@ keyboard modifiers currently held down. */); | |||
| 1191 | defsubr (&Shaiku_selection_owner_p); | 1318 | defsubr (&Shaiku_selection_owner_p); |
| 1192 | defsubr (&Shaiku_drag_message); | 1319 | defsubr (&Shaiku_drag_message); |
| 1193 | defsubr (&Shaiku_roster_launch); | 1320 | defsubr (&Shaiku_roster_launch); |
| 1321 | defsubr (&Shaiku_write_node_attribute); | ||
| 1322 | defsubr (&Shaiku_send_message); | ||
| 1194 | 1323 | ||
| 1195 | haiku_dnd_frame = NULL; | 1324 | haiku_dnd_frame = NULL; |
| 1196 | } | 1325 | } |
diff --git a/src/haikuterm.c b/src/haikuterm.c index df1c39974f8..838eb128fa6 100644 --- a/src/haikuterm.c +++ b/src/haikuterm.c | |||
| @@ -2988,18 +2988,11 @@ haiku_default_font_parameter (struct frame *f, Lisp_Object parms) | |||
| 2988 | font_param = Qnil; | 2988 | font_param = Qnil; |
| 2989 | 2989 | ||
| 2990 | if (NILP (font_param)) | 2990 | if (NILP (font_param)) |
| 2991 | { | 2991 | /* System font should take precedence over X resources. We |
| 2992 | /* System font should take precedence over X resources. We suggest this | 2992 | suggest this regardless of font-use-system-font because .emacs |
| 2993 | regardless of font-use-system-font because .emacs may not have been | 2993 | may not have been read yet. Returning a font-spec is Haiku |
| 2994 | read yet. */ | 2994 | specific behavior. */ |
| 2995 | struct haiku_font_pattern ptn; | 2995 | font = font_open_by_spec (f, Ffont_get_system_font ()); |
| 2996 | ptn.specified = 0; | ||
| 2997 | |||
| 2998 | BFont_populate_fixed_family (&ptn); | ||
| 2999 | |||
| 3000 | if (ptn.specified & FSPEC_FAMILY) | ||
| 3001 | font = font_open_by_name (f, build_unibyte_string (ptn.family)); | ||
| 3002 | } | ||
| 3003 | 2996 | ||
| 3004 | if (NILP (font)) | 2997 | if (NILP (font)) |
| 3005 | font = !NILP (font_param) ? font_param | 2998 | font = !NILP (font_param) ? font_param |
| @@ -4027,6 +4020,11 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit) | |||
| 4027 | inev.kind = SAVE_SESSION_EVENT; | 4020 | inev.kind = SAVE_SESSION_EVENT; |
| 4028 | inev.arg = Qt; | 4021 | inev.arg = Qt; |
| 4029 | break; | 4022 | break; |
| 4023 | case FONT_CHANGE_EVENT: | ||
| 4024 | /* This generates CONFIG_CHANGED_EVENTs, which are then | ||
| 4025 | handled in Lisp. */ | ||
| 4026 | haiku_handle_font_change_event (buf, &inev); | ||
| 4027 | break; | ||
| 4030 | case KEY_UP: | 4028 | case KEY_UP: |
| 4031 | case DUMMY_EVENT: | 4029 | case DUMMY_EVENT: |
| 4032 | default: | 4030 | default: |
| @@ -4349,7 +4347,7 @@ haiku_term_init (void) | |||
| 4349 | emacs_abort (); | 4347 | emacs_abort (); |
| 4350 | 4348 | ||
| 4351 | color_file = Fexpand_file_name (build_string ("rgb.txt"), | 4349 | color_file = Fexpand_file_name (build_string ("rgb.txt"), |
| 4352 | Fsymbol_value (intern ("data-directory"))); | 4350 | Fsymbol_value (Qdata_directory)); |
| 4353 | color_map = Fx_load_color_file (color_file); | 4351 | color_map = Fx_load_color_file (color_file); |
| 4354 | 4352 | ||
| 4355 | if (NILP (color_map)) | 4353 | if (NILP (color_map)) |
| @@ -4417,6 +4415,9 @@ haiku_term_init (void) | |||
| 4417 | dpyinfo->default_name = build_string ("GNU Emacs"); | 4415 | dpyinfo->default_name = build_string ("GNU Emacs"); |
| 4418 | 4416 | ||
| 4419 | haiku_start_watching_selections (); | 4417 | haiku_start_watching_selections (); |
| 4418 | |||
| 4419 | /* Start listening for font configuration changes. */ | ||
| 4420 | be_listen_font_settings (); | ||
| 4420 | unblock_input (); | 4421 | unblock_input (); |
| 4421 | 4422 | ||
| 4422 | return dpyinfo; | 4423 | return dpyinfo; |
| @@ -4634,6 +4635,8 @@ syms_of_haikuterm (void) | |||
| 4634 | DEFSYM (Qoption, "option"); | 4635 | DEFSYM (Qoption, "option"); |
| 4635 | DEFSYM (Qcommand, "command"); | 4636 | DEFSYM (Qcommand, "command"); |
| 4636 | 4637 | ||
| 4638 | DEFSYM (Qdata_directory, "data-directory"); | ||
| 4639 | |||
| 4637 | DEFVAR_LISP ("haiku-meta-keysym", Vhaiku_meta_keysym, | 4640 | DEFVAR_LISP ("haiku-meta-keysym", Vhaiku_meta_keysym, |
| 4638 | doc: /* Which key Emacs uses as the meta modifier. | 4641 | doc: /* Which key Emacs uses as the meta modifier. |
| 4639 | This is either one of the symbols `shift', `control', `command', and | 4642 | This is either one of the symbols `shift', `control', `command', and |
diff --git a/src/haikuterm.h b/src/haikuterm.h index b603c0a482f..86274fd42a3 100644 --- a/src/haikuterm.h +++ b/src/haikuterm.h | |||
| @@ -34,6 +34,9 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ | |||
| 34 | 34 | ||
| 35 | #define HAVE_CHAR_CACHE_MAX 65535 | 35 | #define HAVE_CHAR_CACHE_MAX 65535 |
| 36 | 36 | ||
| 37 | /* This is really defined in haiku_support.h. */ | ||
| 38 | struct haiku_font_change_event; | ||
| 39 | |||
| 37 | extern int popup_activated_p; | 40 | extern int popup_activated_p; |
| 38 | 41 | ||
| 39 | struct haikufont_info | 42 | struct haikufont_info |
| @@ -361,4 +364,7 @@ extern void haiku_merge_cursor_foreground (struct glyph_string *, unsigned long | |||
| 361 | unsigned long *); | 364 | unsigned long *); |
| 362 | extern void haiku_handle_selection_clear (struct input_event *); | 365 | extern void haiku_handle_selection_clear (struct input_event *); |
| 363 | extern void haiku_start_watching_selections (void); | 366 | extern void haiku_start_watching_selections (void); |
| 367 | extern void haiku_handle_font_change_event (struct haiku_font_change_event *, | ||
| 368 | struct input_event *); | ||
| 369 | |||
| 364 | #endif /* _HAIKU_TERM_H_ */ | 370 | #endif /* _HAIKU_TERM_H_ */ |
diff --git a/src/hbfont.c b/src/hbfont.c index 2721a661208..476e08020e1 100644 --- a/src/hbfont.c +++ b/src/hbfont.c | |||
| @@ -249,7 +249,7 @@ uni_combining (hb_unicode_funcs_t *funcs, hb_codepoint_t ch, void *user_data) | |||
| 249 | if (!combining_class_loaded) | 249 | if (!combining_class_loaded) |
| 250 | { | 250 | { |
| 251 | canonical_combining_class_table = | 251 | canonical_combining_class_table = |
| 252 | uniprop_table (intern ("canonical-combining-class")); | 252 | uniprop_table (Qcanonical_combining_class); |
| 253 | if (NILP (canonical_combining_class_table)) | 253 | if (NILP (canonical_combining_class_table)) |
| 254 | emacs_abort (); | 254 | emacs_abort (); |
| 255 | staticpro (&canonical_combining_class_table); | 255 | staticpro (&canonical_combining_class_table); |
diff --git a/src/image.c b/src/image.c index f5004c2c4c7..1e323ba66a0 100644 --- a/src/image.c +++ b/src/image.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* Functions for image support on window system. | 1 | /* Functions for image support on window system. |
| 2 | 2 | ||
| 3 | Copyright (C) 1989, 1992-2022 Free Software Foundation, Inc. | 3 | Copyright (C) 1989-2022 Free Software Foundation, Inc. |
| 4 | 4 | ||
| 5 | This file is part of GNU Emacs. | 5 | This file is part of GNU Emacs. |
| 6 | 6 | ||
| @@ -10907,7 +10907,7 @@ DEF_DLL_FN (int, gdk_pixbuf_get_bits_per_sample, (const GdkPixbuf *)); | |||
| 10907 | DEF_DLL_FN (void, g_type_init, (void)); | 10907 | DEF_DLL_FN (void, g_type_init, (void)); |
| 10908 | # endif | 10908 | # endif |
| 10909 | DEF_DLL_FN (void, g_object_unref, (gpointer)); | 10909 | DEF_DLL_FN (void, g_object_unref, (gpointer)); |
| 10910 | DEF_DLL_FN (void, g_clear_error, (GError **)); | 10910 | DEF_DLL_FN (void, g_error_free, (GError *)); |
| 10911 | 10911 | ||
| 10912 | static bool | 10912 | static bool |
| 10913 | init_svg_functions (void) | 10913 | init_svg_functions (void) |
| @@ -10967,7 +10967,7 @@ init_svg_functions (void) | |||
| 10967 | LOAD_DLL_FN (gobject, g_type_init); | 10967 | LOAD_DLL_FN (gobject, g_type_init); |
| 10968 | # endif | 10968 | # endif |
| 10969 | LOAD_DLL_FN (gobject, g_object_unref); | 10969 | LOAD_DLL_FN (gobject, g_object_unref); |
| 10970 | LOAD_DLL_FN (glib, g_clear_error); | 10970 | LOAD_DLL_FN (glib, g_error_free); |
| 10971 | 10971 | ||
| 10972 | return 1; | 10972 | return 1; |
| 10973 | } | 10973 | } |
| @@ -10983,7 +10983,7 @@ init_svg_functions (void) | |||
| 10983 | # undef gdk_pixbuf_get_pixels | 10983 | # undef gdk_pixbuf_get_pixels |
| 10984 | # undef gdk_pixbuf_get_rowstride | 10984 | # undef gdk_pixbuf_get_rowstride |
| 10985 | # undef gdk_pixbuf_get_width | 10985 | # undef gdk_pixbuf_get_width |
| 10986 | # undef g_clear_error | 10986 | # undef g_error_free |
| 10987 | # undef g_object_unref | 10987 | # undef g_object_unref |
| 10988 | # undef g_type_init | 10988 | # undef g_type_init |
| 10989 | # if LIBRSVG_CHECK_VERSION (2, 52, 1) | 10989 | # if LIBRSVG_CHECK_VERSION (2, 52, 1) |
| @@ -11019,7 +11019,7 @@ init_svg_functions (void) | |||
| 11019 | # define gdk_pixbuf_get_pixels fn_gdk_pixbuf_get_pixels | 11019 | # define gdk_pixbuf_get_pixels fn_gdk_pixbuf_get_pixels |
| 11020 | # define gdk_pixbuf_get_rowstride fn_gdk_pixbuf_get_rowstride | 11020 | # define gdk_pixbuf_get_rowstride fn_gdk_pixbuf_get_rowstride |
| 11021 | # define gdk_pixbuf_get_width fn_gdk_pixbuf_get_width | 11021 | # define gdk_pixbuf_get_width fn_gdk_pixbuf_get_width |
| 11022 | # define g_clear_error fn_g_clear_error | 11022 | # define g_error_free fn_g_error_free |
| 11023 | # define g_object_unref fn_g_object_unref | 11023 | # define g_object_unref fn_g_object_unref |
| 11024 | # if ! GLIB_CHECK_VERSION (2, 36, 0) | 11024 | # if ! GLIB_CHECK_VERSION (2, 36, 0) |
| 11025 | # define g_type_init fn_g_type_init | 11025 | # define g_type_init fn_g_type_init |
| @@ -11183,6 +11183,10 @@ svg_load_image (struct frame *f, struct image *img, char *contents, | |||
| 11183 | char *wrapped_contents = NULL; | 11183 | char *wrapped_contents = NULL; |
| 11184 | ptrdiff_t wrapped_size; | 11184 | ptrdiff_t wrapped_size; |
| 11185 | 11185 | ||
| 11186 | bool empty_errmsg = true; | ||
| 11187 | const char *errmsg = ""; | ||
| 11188 | ptrdiff_t errlen = 0; | ||
| 11189 | |||
| 11186 | #if LIBRSVG_CHECK_VERSION (2, 48, 0) | 11190 | #if LIBRSVG_CHECK_VERSION (2, 48, 0) |
| 11187 | char *css = NULL; | 11191 | char *css = NULL; |
| 11188 | #endif | 11192 | #endif |
| @@ -11353,7 +11357,7 @@ svg_load_image (struct frame *f, struct image *img, char *contents, | |||
| 11353 | if (! check_image_size (f, width, height)) | 11357 | if (! check_image_size (f, width, height)) |
| 11354 | { | 11358 | { |
| 11355 | image_size_error (); | 11359 | image_size_error (); |
| 11356 | goto rsvg_error; | 11360 | goto done_error; |
| 11357 | } | 11361 | } |
| 11358 | 11362 | ||
| 11359 | /* We are now done with the unmodified data. */ | 11363 | /* We are now done with the unmodified data. */ |
| @@ -11491,7 +11495,7 @@ svg_load_image (struct frame *f, struct image *img, char *contents, | |||
| 11491 | if (!image_create_x_image_and_pixmap (f, img, width, height, 0, &ximg, 0)) | 11495 | if (!image_create_x_image_and_pixmap (f, img, width, height, 0, &ximg, 0)) |
| 11492 | { | 11496 | { |
| 11493 | g_object_unref (pixbuf); | 11497 | g_object_unref (pixbuf); |
| 11494 | return 0; | 11498 | return false; |
| 11495 | } | 11499 | } |
| 11496 | 11500 | ||
| 11497 | init_color_table (); | 11501 | init_color_table (); |
| @@ -11536,9 +11540,30 @@ svg_load_image (struct frame *f, struct image *img, char *contents, | |||
| 11536 | image_put_x_image (f, img, ximg, 0); | 11540 | image_put_x_image (f, img, ximg, 0); |
| 11537 | } | 11541 | } |
| 11538 | 11542 | ||
| 11539 | return 1; | 11543 | eassume (err == NULL); |
| 11544 | return true; | ||
| 11540 | 11545 | ||
| 11541 | rsvg_error: | 11546 | rsvg_error: |
| 11547 | if (err && err->message[0]) | ||
| 11548 | { | ||
| 11549 | errmsg = err->message; | ||
| 11550 | errlen = strlen (errmsg); | ||
| 11551 | /* Remove trailing whitespace from the error message text. It | ||
| 11552 | has a newline at the end, and perhaps more whitespace. */ | ||
| 11553 | while (errlen && c_isspace (errmsg[errlen - 1])) | ||
| 11554 | errlen--; | ||
| 11555 | empty_errmsg = errlen == 0; | ||
| 11556 | } | ||
| 11557 | |||
| 11558 | if (empty_errmsg) | ||
| 11559 | image_error ("Error parsing SVG image"); | ||
| 11560 | else | ||
| 11561 | image_error ("Error parsing SVG image: %s", make_string (errmsg, errlen)); | ||
| 11562 | |||
| 11563 | if (err) | ||
| 11564 | g_error_free (err); | ||
| 11565 | |||
| 11566 | done_error: | ||
| 11542 | if (rsvg_handle) | 11567 | if (rsvg_handle) |
| 11543 | g_object_unref (rsvg_handle); | 11568 | g_object_unref (rsvg_handle); |
| 11544 | if (wrapped_contents) | 11569 | if (wrapped_contents) |
| @@ -11547,11 +11572,7 @@ svg_load_image (struct frame *f, struct image *img, char *contents, | |||
| 11547 | if (css && !STRINGP (lcss)) | 11572 | if (css && !STRINGP (lcss)) |
| 11548 | xfree (css); | 11573 | xfree (css); |
| 11549 | #endif | 11574 | #endif |
| 11550 | /* FIXME: Use error->message so the user knows what is the actual | 11575 | return false; |
| 11551 | problem with the image. */ | ||
| 11552 | image_error ("Error parsing SVG image"); | ||
| 11553 | g_clear_error (&err); | ||
| 11554 | return 0; | ||
| 11555 | } | 11576 | } |
| 11556 | 11577 | ||
| 11557 | #endif /* defined (HAVE_RSVG) */ | 11578 | #endif /* defined (HAVE_RSVG) */ |
| @@ -11817,9 +11838,6 @@ x_kill_gs_process (Pixmap pixmap, struct frame *f) | |||
| 11817 | /*********************************************************************** | 11838 | /*********************************************************************** |
| 11818 | Tests | 11839 | Tests |
| 11819 | ***********************************************************************/ | 11840 | ***********************************************************************/ |
| 11820 | |||
| 11821 | #ifdef GLYPH_DEBUG | ||
| 11822 | |||
| 11823 | DEFUN ("imagep", Fimagep, Simagep, 1, 1, 0, | 11841 | DEFUN ("imagep", Fimagep, Simagep, 1, 1, 0, |
| 11824 | doc: /* Value is non-nil if SPEC is a valid image specification. */) | 11842 | doc: /* Value is non-nil if SPEC is a valid image specification. */) |
| 11825 | (Lisp_Object spec) | 11843 | (Lisp_Object spec) |
| @@ -11827,6 +11845,7 @@ DEFUN ("imagep", Fimagep, Simagep, 1, 1, 0, | |||
| 11827 | return valid_image_p (spec) ? Qt : Qnil; | 11845 | return valid_image_p (spec) ? Qt : Qnil; |
| 11828 | } | 11846 | } |
| 11829 | 11847 | ||
| 11848 | #ifdef GLYPH_DEBUG | ||
| 11830 | 11849 | ||
| 11831 | DEFUN ("lookup-image", Flookup_image, Slookup_image, 1, 1, 0, | 11850 | DEFUN ("lookup-image", Flookup_image, Slookup_image, 1, 1, 0, |
| 11832 | doc: /* */) | 11851 | doc: /* */) |
| @@ -12219,9 +12238,9 @@ non-numeric, there is no explicit limit on the size of images. */); | |||
| 12219 | defsubr (&Simage_mask_p); | 12238 | defsubr (&Simage_mask_p); |
| 12220 | defsubr (&Simage_metadata); | 12239 | defsubr (&Simage_metadata); |
| 12221 | defsubr (&Simage_cache_size); | 12240 | defsubr (&Simage_cache_size); |
| 12241 | defsubr (&Simagep); | ||
| 12222 | 12242 | ||
| 12223 | #ifdef GLYPH_DEBUG | 12243 | #ifdef GLYPH_DEBUG |
| 12224 | defsubr (&Simagep); | ||
| 12225 | defsubr (&Slookup_image); | 12244 | defsubr (&Slookup_image); |
| 12226 | #endif | 12245 | #endif |
| 12227 | 12246 | ||
| @@ -12264,5 +12283,4 @@ The options are: | |||
| 12264 | /* MagickExportImagePixels is in 6.4.6-9, but not 6.4.4-10. */ | 12283 | /* MagickExportImagePixels is in 6.4.6-9, but not 6.4.4-10. */ |
| 12265 | imagemagick_render_type = 0; | 12284 | imagemagick_render_type = 0; |
| 12266 | #endif | 12285 | #endif |
| 12267 | |||
| 12268 | } | 12286 | } |
diff --git a/src/intervals.c b/src/intervals.c index 85152c58a5d..7f119815570 100644 --- a/src/intervals.c +++ b/src/intervals.c | |||
| @@ -2171,8 +2171,8 @@ get_property_and_range (ptrdiff_t pos, Lisp_Object prop, Lisp_Object *val, | |||
| 2171 | 2171 | ||
| 2172 | /* Return the proper local keymap TYPE for position POSITION in | 2172 | /* Return the proper local keymap TYPE for position POSITION in |
| 2173 | BUFFER; TYPE should be one of `keymap' or `local-map'. Use the map | 2173 | BUFFER; TYPE should be one of `keymap' or `local-map'. Use the map |
| 2174 | specified by the PROP property, if any. Otherwise, if TYPE is | 2174 | specified by the TYPE property, if any. Otherwise, if TYPE is |
| 2175 | `local-map' use BUFFER's local map. */ | 2175 | `local-map', use BUFFER's local map. */ |
| 2176 | 2176 | ||
| 2177 | Lisp_Object | 2177 | Lisp_Object |
| 2178 | get_local_map (ptrdiff_t position, struct buffer *buffer, Lisp_Object type) | 2178 | get_local_map (ptrdiff_t position, struct buffer *buffer, Lisp_Object type) |
diff --git a/src/keyboard.c b/src/keyboard.c index 1d7125a0a3e..8ab4a451b45 100644 --- a/src/keyboard.c +++ b/src/keyboard.c | |||
| @@ -499,27 +499,18 @@ echo_add_key (Lisp_Object c) | |||
| 499 | STRING_MULTIBYTE (name), 1); | 499 | STRING_MULTIBYTE (name), 1); |
| 500 | } | 500 | } |
| 501 | 501 | ||
| 502 | Lisp_Object new_string = make_string (buffer, ptr - buffer); | ||
| 502 | if ((NILP (echo_string) || SCHARS (echo_string) == 0) | 503 | if ((NILP (echo_string) || SCHARS (echo_string) == 0) |
| 503 | && help_char_p (c)) | 504 | && help_char_p (c)) |
| 504 | { | 505 | { |
| 505 | static const char text[] = " (Type ? for further options)"; | 506 | AUTO_STRING (str, " (Type ? for further options)"); |
| 506 | int len = sizeof text - 1; | 507 | AUTO_LIST2 (props, Qface, Qhelp_key_binding); |
| 507 | 508 | Fadd_text_properties (make_fixnum (7), make_fixnum (8), props, str); | |
| 508 | if (size - (ptr - buffer) < len) | 509 | new_string = concat2 (new_string, str); |
| 509 | { | ||
| 510 | ptrdiff_t offset = ptr - buffer; | ||
| 511 | size += len; | ||
| 512 | buffer = SAFE_ALLOCA (size); | ||
| 513 | ptr = buffer + offset; | ||
| 514 | } | ||
| 515 | |||
| 516 | memcpy (ptr, text, len); | ||
| 517 | ptr += len; | ||
| 518 | } | 510 | } |
| 519 | 511 | ||
| 520 | kset_echo_string | 512 | kset_echo_string (current_kboard, |
| 521 | (current_kboard, | 513 | concat2 (echo_string, new_string)); |
| 522 | concat2 (echo_string, make_string (buffer, ptr - buffer))); | ||
| 523 | SAFE_FREE (); | 514 | SAFE_FREE (); |
| 524 | } | 515 | } |
| 525 | 516 | ||
| @@ -1827,21 +1818,15 @@ adjust_point_for_property (ptrdiff_t last_pt, bool modified) | |||
| 1827 | } | 1818 | } |
| 1828 | } | 1819 | } |
| 1829 | 1820 | ||
| 1830 | /* Subroutine for safe_run_hooks: run the hook, which is ARGS[1]. */ | 1821 | /* Subroutine for safe_run_hooks: run the hook's function. |
| 1822 | ARGS[0] holds the name of the hook, which we don't need here (we only use | ||
| 1823 | it in the failure case of the internal_condition_case_n). */ | ||
| 1831 | 1824 | ||
| 1832 | static Lisp_Object | 1825 | static Lisp_Object |
| 1833 | safe_run_hooks_1 (ptrdiff_t nargs, Lisp_Object *args) | 1826 | safe_run_hooks_1 (ptrdiff_t nargs, Lisp_Object *args) |
| 1834 | { | 1827 | { |
| 1835 | eassert (nargs >= 2 && nargs <= 4); | 1828 | eassert (nargs >= 2); |
| 1836 | switch (nargs) | 1829 | return Ffuncall (nargs - 1, args + 1); |
| 1837 | { | ||
| 1838 | case 2: | ||
| 1839 | return call0 (args[1]); | ||
| 1840 | case 3: | ||
| 1841 | return call1 (args[1], args[2]); | ||
| 1842 | default: | ||
| 1843 | return call2 (args[1], args[2], args[3]); | ||
| 1844 | } | ||
| 1845 | } | 1830 | } |
| 1846 | 1831 | ||
| 1847 | /* Subroutine for safe_run_hooks: handle an error by clearing out the function | 1832 | /* Subroutine for safe_run_hooks: handle an error by clearing out the function |
| @@ -1850,7 +1835,7 @@ safe_run_hooks_1 (ptrdiff_t nargs, Lisp_Object *args) | |||
| 1850 | static Lisp_Object | 1835 | static Lisp_Object |
| 1851 | safe_run_hooks_error (Lisp_Object error, ptrdiff_t nargs, Lisp_Object *args) | 1836 | safe_run_hooks_error (Lisp_Object error, ptrdiff_t nargs, Lisp_Object *args) |
| 1852 | { | 1837 | { |
| 1853 | eassert (nargs >= 2 && nargs <= 4); | 1838 | eassert (nargs >= 2); |
| 1854 | AUTO_STRING (format, "Error in %s (%S): %S"); | 1839 | AUTO_STRING (format, "Error in %s (%S): %S"); |
| 1855 | Lisp_Object hook = args[0]; | 1840 | Lisp_Object hook = args[0]; |
| 1856 | Lisp_Object fun = args[1]; | 1841 | Lisp_Object fun = args[1]; |
| @@ -1886,27 +1871,22 @@ safe_run_hooks_error (Lisp_Object error, ptrdiff_t nargs, Lisp_Object *args) | |||
| 1886 | static Lisp_Object | 1871 | static Lisp_Object |
| 1887 | safe_run_hook_funcall (ptrdiff_t nargs, Lisp_Object *args) | 1872 | safe_run_hook_funcall (ptrdiff_t nargs, Lisp_Object *args) |
| 1888 | { | 1873 | { |
| 1889 | eassert (nargs >= 2 && nargs <= 4); | 1874 | /* We need to swap args[0] and args[1] here or in `safe_run_hooks_1`. |
| 1890 | /* Yes, run_hook_with_args works with args in the other order. */ | 1875 | It's more convenient to do it here. */ |
| 1891 | switch (nargs) | 1876 | eassert (nargs >= 2); |
| 1892 | { | 1877 | Lisp_Object fun = args[0], hook = args[1]; |
| 1893 | case 2: | 1878 | /* The `nargs` array cannot be mutated safely here because it is |
| 1894 | internal_condition_case_n (safe_run_hooks_1, | 1879 | reused by our caller `run_hook_with_args`. |
| 1895 | 2, ((Lisp_Object []) {args[1], args[0]}), | 1880 | We could arguably change it temporarily if we set it back |
| 1896 | Qt, safe_run_hooks_error); | 1881 | to its original state before returning, but it's too ugly. */ |
| 1897 | break; | 1882 | USE_SAFE_ALLOCA; |
| 1898 | case 3: | 1883 | Lisp_Object *newargs; |
| 1899 | internal_condition_case_n (safe_run_hooks_1, | 1884 | SAFE_ALLOCA_LISP (newargs, nargs); |
| 1900 | 3, ((Lisp_Object []) {args[1], args[0], args[2]}), | 1885 | newargs[0] = hook, newargs[1] = fun; |
| 1901 | Qt, safe_run_hooks_error); | 1886 | memcpy (newargs + 2, args + 2, (nargs - 2) * word_size); |
| 1902 | break; | 1887 | internal_condition_case_n (safe_run_hooks_1, nargs, newargs, |
| 1903 | default: | 1888 | Qt, safe_run_hooks_error); |
| 1904 | internal_condition_case_n (safe_run_hooks_1, | 1889 | SAFE_FREE (); |
| 1905 | 4, ((Lisp_Object []) | ||
| 1906 | {args[1], args[0], args[2], args[3]}), | ||
| 1907 | Qt, safe_run_hooks_error); | ||
| 1908 | break; | ||
| 1909 | } | ||
| 1910 | return Qnil; | 1890 | return Qnil; |
| 1911 | } | 1891 | } |
| 1912 | 1892 | ||
| @@ -1920,7 +1900,8 @@ safe_run_hooks (Lisp_Object hook) | |||
| 1920 | specpdl_ref count = SPECPDL_INDEX (); | 1900 | specpdl_ref count = SPECPDL_INDEX (); |
| 1921 | 1901 | ||
| 1922 | specbind (Qinhibit_quit, Qt); | 1902 | specbind (Qinhibit_quit, Qt); |
| 1923 | run_hook_with_args (2, ((Lisp_Object []) {hook, hook}), safe_run_hook_funcall); | 1903 | run_hook_with_args (2, ((Lisp_Object []) {hook, hook}), |
| 1904 | safe_run_hook_funcall); | ||
| 1924 | unbind_to (count, Qnil); | 1905 | unbind_to (count, Qnil); |
| 1925 | } | 1906 | } |
| 1926 | 1907 | ||
| @@ -1936,7 +1917,8 @@ safe_run_hooks_maybe_narrowed (Lisp_Object hook, struct window *w) | |||
| 1936 | make_fixnum (get_narrowed_zv (w, PT)), | 1917 | make_fixnum (get_narrowed_zv (w, PT)), |
| 1937 | true); | 1918 | true); |
| 1938 | 1919 | ||
| 1939 | run_hook_with_args (2, ((Lisp_Object []) {hook, hook}), safe_run_hook_funcall); | 1920 | run_hook_with_args (2, ((Lisp_Object []) {hook, hook}), |
| 1921 | safe_run_hook_funcall); | ||
| 1940 | unbind_to (count, Qnil); | 1922 | unbind_to (count, Qnil); |
| 1941 | } | 1923 | } |
| 1942 | 1924 | ||
| @@ -11806,6 +11788,9 @@ DEFUN ("posn-at-point", Fposn_at_point, Sposn_at_point, 0, 2, 0, | |||
| 11806 | doc: /* Return position information for buffer position POS in WINDOW. | 11788 | doc: /* Return position information for buffer position POS in WINDOW. |
| 11807 | POS defaults to point in WINDOW; WINDOW defaults to the selected window. | 11789 | POS defaults to point in WINDOW; WINDOW defaults to the selected window. |
| 11808 | 11790 | ||
| 11791 | If POS is in invisible text or is hidden by `display' properties, | ||
| 11792 | this function may report on buffer positions before or after POS. | ||
| 11793 | |||
| 11809 | Return nil if POS is not visible in WINDOW. Otherwise, | 11794 | Return nil if POS is not visible in WINDOW. Otherwise, |
| 11810 | the return value is similar to that returned by `event-start' for | 11795 | the return value is similar to that returned by `event-start' for |
| 11811 | a mouse click at the upper left corner of the glyph corresponding | 11796 | a mouse click at the upper left corner of the glyph corresponding |
| @@ -12258,6 +12243,8 @@ syms_of_keyboard (void) | |||
| 12258 | 12243 | ||
| 12259 | DEFSYM (Qhelp_form_show, "help-form-show"); | 12244 | DEFSYM (Qhelp_form_show, "help-form-show"); |
| 12260 | 12245 | ||
| 12246 | DEFSYM (Qhelp_key_binding, "help-key-binding"); | ||
| 12247 | |||
| 12261 | DEFSYM (Qecho_keystrokes, "echo-keystrokes"); | 12248 | DEFSYM (Qecho_keystrokes, "echo-keystrokes"); |
| 12262 | 12249 | ||
| 12263 | Fset (Qinput_method_exit_on_first_char, Qnil); | 12250 | Fset (Qinput_method_exit_on_first_char, Qnil); |
diff --git a/src/lisp.h b/src/lisp.h index 0281c483e32..1e41e2064c9 100644 --- a/src/lisp.h +++ b/src/lisp.h | |||
| @@ -245,7 +245,8 @@ DEFINE_GDB_SYMBOL_BEGIN (EMACS_INT, VALMASK) | |||
| 245 | DEFINE_GDB_SYMBOL_END (VALMASK) | 245 | DEFINE_GDB_SYMBOL_END (VALMASK) |
| 246 | 246 | ||
| 247 | /* Ignore 'alignas' on compilers lacking it. */ | 247 | /* Ignore 'alignas' on compilers lacking it. */ |
| 248 | #if !defined alignas && !defined __alignas_is_defined | 248 | #if (!defined alignas && !defined __alignas_is_defined \ |
| 249 | && __STDC_VERSION__ < 202311 && __cplusplus < 201103) | ||
| 249 | # define alignas(a) | 250 | # define alignas(a) |
| 250 | #endif | 251 | #endif |
| 251 | 252 | ||
diff --git a/src/lread.c b/src/lread.c index 06fac7185bb..37ee3a00ecc 100644 --- a/src/lread.c +++ b/src/lread.c | |||
| @@ -1423,6 +1423,7 @@ Return t if the file exists and loads successfully. */) | |||
| 1423 | struct stat s1, s2; | 1423 | struct stat s1, s2; |
| 1424 | int result; | 1424 | int result; |
| 1425 | 1425 | ||
| 1426 | struct timespec epoch_timespec = {(time_t)0, 0}; /* 1970-01-01T00:00 UTC */ | ||
| 1426 | if (version < 0 && !(version = safe_to_load_version (file, fd))) | 1427 | if (version < 0 && !(version = safe_to_load_version (file, fd))) |
| 1427 | error ("File `%s' was not compiled in Emacs", SDATA (found)); | 1428 | error ("File `%s' was not compiled in Emacs", SDATA (found)); |
| 1428 | 1429 | ||
| @@ -1451,7 +1452,12 @@ Return t if the file exists and loads successfully. */) | |||
| 1451 | newer = 1; | 1452 | newer = 1; |
| 1452 | 1453 | ||
| 1453 | /* If we won't print another message, mention this anyway. */ | 1454 | /* If we won't print another message, mention this anyway. */ |
| 1454 | if (!NILP (nomessage) && !force_load_messages) | 1455 | if (!NILP (nomessage) && !force_load_messages |
| 1456 | /* We don't want this message during | ||
| 1457 | bootstrapping for the "compile-first" .elc | ||
| 1458 | files, which have had their timestamps set to | ||
| 1459 | the epoch. See bug #58224. */ | ||
| 1460 | && timespec_cmp (get_stat_mtime (&s1), epoch_timespec)) | ||
| 1455 | { | 1461 | { |
| 1456 | Lisp_Object msg_file; | 1462 | Lisp_Object msg_file; |
| 1457 | msg_file = Fsubstring (found, make_fixnum (0), make_fixnum (-1)); | 1463 | msg_file = Fsubstring (found, make_fixnum (0), make_fixnum (-1)); |
| @@ -2905,31 +2911,26 @@ digit_to_number (int character, int base) | |||
| 2905 | return digit < base ? digit : -1; | 2911 | return digit < base ? digit : -1; |
| 2906 | } | 2912 | } |
| 2907 | 2913 | ||
| 2908 | /* Size of the fixed-size buffer used during reading. | ||
| 2909 | It should be at least big enough for `invalid_radix_integer' but | ||
| 2910 | can usefully be much bigger than that. */ | ||
| 2911 | enum { stackbufsize = 1024 }; | ||
| 2912 | |||
| 2913 | static void | 2914 | static void |
| 2914 | invalid_radix_integer (EMACS_INT radix, char stackbuf[VLA_ELEMS (stackbufsize)], | 2915 | invalid_radix_integer (EMACS_INT radix, Lisp_Object readcharfun) |
| 2915 | Lisp_Object readcharfun) | ||
| 2916 | { | 2916 | { |
| 2917 | int n = snprintf (stackbuf, stackbufsize, "integer, radix %"pI"d", radix); | 2917 | char buf[64]; |
| 2918 | eassert (n < stackbufsize); | 2918 | int n = snprintf (buf, sizeof buf, "integer, radix %"pI"d", radix); |
| 2919 | invalid_syntax (stackbuf, readcharfun); | 2919 | eassert (n < sizeof buf); |
| 2920 | invalid_syntax (buf, readcharfun); | ||
| 2920 | } | 2921 | } |
| 2921 | 2922 | ||
| 2922 | /* Read an integer in radix RADIX using READCHARFUN to read | 2923 | /* Read an integer in radix RADIX using READCHARFUN to read |
| 2923 | characters. RADIX must be in the interval [2..36]. Use STACKBUF | 2924 | characters. RADIX must be in the interval [2..36]. |
| 2924 | for temporary storage as needed. Value is the integer read. | 2925 | Value is the integer read. |
| 2925 | Signal an error if encountering invalid read syntax. */ | 2926 | Signal an error if encountering invalid read syntax. */ |
| 2926 | 2927 | ||
| 2927 | static Lisp_Object | 2928 | static Lisp_Object |
| 2928 | read_integer (Lisp_Object readcharfun, int radix, | 2929 | read_integer (Lisp_Object readcharfun, int radix) |
| 2929 | char stackbuf[VLA_ELEMS (stackbufsize)]) | ||
| 2930 | { | 2930 | { |
| 2931 | char stackbuf[20]; | ||
| 2931 | char *read_buffer = stackbuf; | 2932 | char *read_buffer = stackbuf; |
| 2932 | ptrdiff_t read_buffer_size = stackbufsize; | 2933 | ptrdiff_t read_buffer_size = sizeof stackbuf; |
| 2933 | char *p = read_buffer; | 2934 | char *p = read_buffer; |
| 2934 | char *heapbuf = NULL; | 2935 | char *heapbuf = NULL; |
| 2935 | int valid = -1; /* 1 if valid, 0 if not, -1 if incomplete. */ | 2936 | int valid = -1; /* 1 if valid, 0 if not, -1 if incomplete. */ |
| @@ -2976,7 +2977,7 @@ read_integer (Lisp_Object readcharfun, int radix, | |||
| 2976 | UNREAD (c); | 2977 | UNREAD (c); |
| 2977 | 2978 | ||
| 2978 | if (valid != 1) | 2979 | if (valid != 1) |
| 2979 | invalid_radix_integer (radix, stackbuf, readcharfun); | 2980 | invalid_radix_integer (radix, readcharfun); |
| 2980 | 2981 | ||
| 2981 | *p = '\0'; | 2982 | *p = '\0'; |
| 2982 | return unbind_to (count, string_to_number (read_buffer, radix, NULL)); | 2983 | return unbind_to (count, string_to_number (read_buffer, radix, NULL)); |
| @@ -3030,11 +3031,11 @@ read_char_literal (Lisp_Object readcharfun) | |||
| 3030 | 3031 | ||
| 3031 | /* Read a string literal (preceded by '"'). */ | 3032 | /* Read a string literal (preceded by '"'). */ |
| 3032 | static Lisp_Object | 3033 | static Lisp_Object |
| 3033 | read_string_literal (char stackbuf[VLA_ELEMS (stackbufsize)], | 3034 | read_string_literal (Lisp_Object readcharfun) |
| 3034 | Lisp_Object readcharfun) | ||
| 3035 | { | 3035 | { |
| 3036 | char stackbuf[1024]; | ||
| 3036 | char *read_buffer = stackbuf; | 3037 | char *read_buffer = stackbuf; |
| 3037 | ptrdiff_t read_buffer_size = stackbufsize; | 3038 | ptrdiff_t read_buffer_size = sizeof stackbuf; |
| 3038 | specpdl_ref count = SPECPDL_INDEX (); | 3039 | specpdl_ref count = SPECPDL_INDEX (); |
| 3039 | char *heapbuf = NULL; | 3040 | char *heapbuf = NULL; |
| 3040 | char *p = read_buffer; | 3041 | char *p = read_buffer; |
| @@ -3357,8 +3358,7 @@ string_props_from_rev_list (Lisp_Object elems, Lisp_Object readcharfun) | |||
| 3357 | 3358 | ||
| 3358 | /* Read a bool vector (preceded by "#&"). */ | 3359 | /* Read a bool vector (preceded by "#&"). */ |
| 3359 | static Lisp_Object | 3360 | static Lisp_Object |
| 3360 | read_bool_vector (char stackbuf[VLA_ELEMS (stackbufsize)], | 3361 | read_bool_vector (Lisp_Object readcharfun) |
| 3361 | Lisp_Object readcharfun) | ||
| 3362 | { | 3362 | { |
| 3363 | ptrdiff_t length = 0; | 3363 | ptrdiff_t length = 0; |
| 3364 | for (;;) | 3364 | for (;;) |
| @@ -3376,7 +3376,7 @@ read_bool_vector (char stackbuf[VLA_ELEMS (stackbufsize)], | |||
| 3376 | } | 3376 | } |
| 3377 | 3377 | ||
| 3378 | ptrdiff_t size_in_chars = bool_vector_bytes (length); | 3378 | ptrdiff_t size_in_chars = bool_vector_bytes (length); |
| 3379 | Lisp_Object str = read_string_literal (stackbuf, readcharfun); | 3379 | Lisp_Object str = read_string_literal (readcharfun); |
| 3380 | if (STRING_MULTIBYTE (str) | 3380 | if (STRING_MULTIBYTE (str) |
| 3381 | || !(size_in_chars == SCHARS (str) | 3381 | || !(size_in_chars == SCHARS (str) |
| 3382 | /* We used to print 1 char too many when the number of bits | 3382 | /* We used to print 1 char too many when the number of bits |
| @@ -3686,19 +3686,28 @@ read_stack_push (struct read_stack_entry e) | |||
| 3686 | rdstack.stack[rdstack.sp++] = e; | 3686 | rdstack.stack[rdstack.sp++] = e; |
| 3687 | } | 3687 | } |
| 3688 | 3688 | ||
| 3689 | static void | ||
| 3690 | read_stack_reset (intmax_t sp) | ||
| 3691 | { | ||
| 3692 | eassert (sp <= rdstack.sp); | ||
| 3693 | rdstack.sp = sp; | ||
| 3694 | } | ||
| 3689 | 3695 | ||
| 3690 | /* Read a Lisp object. | 3696 | /* Read a Lisp object. |
| 3691 | If LOCATE_SYMS is true, symbols are read with position. */ | 3697 | If LOCATE_SYMS is true, symbols are read with position. */ |
| 3692 | static Lisp_Object | 3698 | static Lisp_Object |
| 3693 | read0 (Lisp_Object readcharfun, bool locate_syms) | 3699 | read0 (Lisp_Object readcharfun, bool locate_syms) |
| 3694 | { | 3700 | { |
| 3695 | char stackbuf[stackbufsize]; | 3701 | char stackbuf[64]; |
| 3696 | char *read_buffer = stackbuf; | 3702 | char *read_buffer = stackbuf; |
| 3697 | ptrdiff_t read_buffer_size = sizeof stackbuf; | 3703 | ptrdiff_t read_buffer_size = sizeof stackbuf; |
| 3698 | char *heapbuf = NULL; | 3704 | char *heapbuf = NULL; |
| 3699 | specpdl_ref count = SPECPDL_INDEX (); | ||
| 3700 | 3705 | ||
| 3706 | specpdl_ref base_pdl = SPECPDL_INDEX (); | ||
| 3701 | ptrdiff_t base_sp = rdstack.sp; | 3707 | ptrdiff_t base_sp = rdstack.sp; |
| 3708 | record_unwind_protect_intmax (read_stack_reset, base_sp); | ||
| 3709 | |||
| 3710 | specpdl_ref count = SPECPDL_INDEX (); | ||
| 3702 | 3711 | ||
| 3703 | bool uninterned_symbol; | 3712 | bool uninterned_symbol; |
| 3704 | bool skip_shorthand; | 3713 | bool skip_shorthand; |
| @@ -3886,7 +3895,7 @@ read0 (Lisp_Object readcharfun, bool locate_syms) | |||
| 3886 | 3895 | ||
| 3887 | case '&': | 3896 | case '&': |
| 3888 | /* #&N"..." -- bool-vector */ | 3897 | /* #&N"..." -- bool-vector */ |
| 3889 | obj = read_bool_vector (stackbuf, readcharfun); | 3898 | obj = read_bool_vector (readcharfun); |
| 3890 | break; | 3899 | break; |
| 3891 | 3900 | ||
| 3892 | case '!': | 3901 | case '!': |
| @@ -3902,17 +3911,17 @@ read0 (Lisp_Object readcharfun, bool locate_syms) | |||
| 3902 | 3911 | ||
| 3903 | case 'x': | 3912 | case 'x': |
| 3904 | case 'X': | 3913 | case 'X': |
| 3905 | obj = read_integer (readcharfun, 16, stackbuf); | 3914 | obj = read_integer (readcharfun, 16); |
| 3906 | break; | 3915 | break; |
| 3907 | 3916 | ||
| 3908 | case 'o': | 3917 | case 'o': |
| 3909 | case 'O': | 3918 | case 'O': |
| 3910 | obj = read_integer (readcharfun, 8, stackbuf); | 3919 | obj = read_integer (readcharfun, 8); |
| 3911 | break; | 3920 | break; |
| 3912 | 3921 | ||
| 3913 | case 'b': | 3922 | case 'b': |
| 3914 | case 'B': | 3923 | case 'B': |
| 3915 | obj = read_integer (readcharfun, 2, stackbuf); | 3924 | obj = read_integer (readcharfun, 2); |
| 3916 | break; | 3925 | break; |
| 3917 | 3926 | ||
| 3918 | case '@': | 3927 | case '@': |
| @@ -3980,8 +3989,8 @@ read0 (Lisp_Object readcharfun, bool locate_syms) | |||
| 3980 | { | 3989 | { |
| 3981 | /* #NrDIGITS -- radix-N number */ | 3990 | /* #NrDIGITS -- radix-N number */ |
| 3982 | if (n < 0 || n > 36) | 3991 | if (n < 0 || n > 36) |
| 3983 | invalid_radix_integer (n, stackbuf, readcharfun); | 3992 | invalid_radix_integer (n, readcharfun); |
| 3984 | obj = read_integer (readcharfun, n, stackbuf); | 3993 | obj = read_integer (readcharfun, n); |
| 3985 | break; | 3994 | break; |
| 3986 | } | 3995 | } |
| 3987 | else if (n <= MOST_POSITIVE_FIXNUM && !NILP (Vread_circle)) | 3996 | else if (n <= MOST_POSITIVE_FIXNUM && !NILP (Vread_circle)) |
| @@ -4036,7 +4045,7 @@ read0 (Lisp_Object readcharfun, bool locate_syms) | |||
| 4036 | break; | 4045 | break; |
| 4037 | 4046 | ||
| 4038 | case '"': | 4047 | case '"': |
| 4039 | obj = read_string_literal (stackbuf, readcharfun); | 4048 | obj = read_string_literal (readcharfun); |
| 4040 | break; | 4049 | break; |
| 4041 | 4050 | ||
| 4042 | case '\'': | 4051 | case '\'': |
| @@ -4347,7 +4356,7 @@ read0 (Lisp_Object readcharfun, bool locate_syms) | |||
| 4347 | } | 4356 | } |
| 4348 | } | 4357 | } |
| 4349 | 4358 | ||
| 4350 | return unbind_to (count, obj); | 4359 | return unbind_to (base_pdl, obj); |
| 4351 | } | 4360 | } |
| 4352 | 4361 | ||
| 4353 | 4362 | ||
diff --git a/src/macuvs.h b/src/macuvs.h index 4c084156981..7b8c77f0179 100644 --- a/src/macuvs.h +++ b/src/macuvs.h | |||
| @@ -8,29 +8,29 @@ | |||
| 8 | 8 | ||
| 9 | static const unsigned char mac_uvs_table_adobe_japan1_bytes[] = | 9 | static const unsigned char mac_uvs_table_adobe_japan1_bytes[] = |
| 10 | { | 10 | { |
| 11 | 0x00, 0x0e, 0x00, 0x01, 0x1f, 0xb2, 0x00, 0x00, | 11 | 0x00, 0x0e, 0x00, 0x01, 0x1f, 0xb7, 0x00, 0x00, |
| 12 | 0x00, 0x0f, 0x0e, 0x01, 0x00, 0x00, 0x00, 0x00, | 12 | 0x00, 0x0f, 0x0e, 0x01, 0x00, 0x00, 0x00, 0x00, |
| 13 | 0x00, 0x00, 0x00, 0x00, 0xaf, 0x0e, 0x01, 0x01, | 13 | 0x00, 0x00, 0x00, 0x00, 0xaf, 0x0e, 0x01, 0x01, |
| 14 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0xae, | 14 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0xb3, |
| 15 | 0x0e, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, | 15 | 0x0e, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 16 | 0x01, 0x1c, 0x45, 0x0e, 0x01, 0x03, 0x00, 0x00, | 16 | 0x01, 0x1c, 0x4a, 0x0e, 0x01, 0x03, 0x00, 0x00, |
| 17 | 0x00, 0x00, 0x00, 0x01, 0x1e, 0xc4, 0x0e, 0x01, | 17 | 0x00, 0x00, 0x00, 0x01, 0x1e, 0xc9, 0x0e, 0x01, |
| 18 | 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1f, | 18 | 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1f, |
| 19 | 0x1d, 0x0e, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, | 19 | 0x22, 0x0e, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, |
| 20 | 0x00, 0x01, 0x1f, 0x3f, 0x0e, 0x01, 0x06, 0x00, | 20 | 0x00, 0x01, 0x1f, 0x44, 0x0e, 0x01, 0x06, 0x00, |
| 21 | 0x00, 0x00, 0x00, 0x00, 0x01, 0x1f, 0x57, 0x0e, | 21 | 0x00, 0x00, 0x00, 0x00, 0x01, 0x1f, 0x5c, 0x0e, |
| 22 | 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, | 22 | 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, |
| 23 | 0x1f, 0x65, 0x0e, 0x01, 0x08, 0x00, 0x00, 0x00, | 23 | 0x1f, 0x6a, 0x0e, 0x01, 0x08, 0x00, 0x00, 0x00, |
| 24 | 0x00, 0x00, 0x01, 0x1f, 0x73, 0x0e, 0x01, 0x09, | 24 | 0x00, 0x00, 0x01, 0x1f, 0x78, 0x0e, 0x01, 0x09, |
| 25 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1f, 0x7c, | 25 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1f, 0x81, |
| 26 | 0x0e, 0x01, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, | 26 | 0x0e, 0x01, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 27 | 0x01, 0x1f, 0x85, 0x0e, 0x01, 0x0b, 0x00, 0x00, | 27 | 0x01, 0x1f, 0x8a, 0x0e, 0x01, 0x0b, 0x00, 0x00, |
| 28 | 0x00, 0x00, 0x00, 0x01, 0x1f, 0x8e, 0x0e, 0x01, | 28 | 0x00, 0x00, 0x00, 0x01, 0x1f, 0x93, 0x0e, 0x01, |
| 29 | 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1f, | 29 | 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1f, |
| 30 | 0x97, 0x0e, 0x01, 0x0d, 0x00, 0x00, 0x00, 0x00, | 30 | 0x9c, 0x0e, 0x01, 0x0d, 0x00, 0x00, 0x00, 0x00, |
| 31 | 0x00, 0x01, 0x1f, 0xa0, 0x0e, 0x01, 0x0e, 0x00, | 31 | 0x00, 0x01, 0x1f, 0xa5, 0x0e, 0x01, 0x0e, 0x00, |
| 32 | 0x00, 0x00, 0x00, 0x00, 0x01, 0x1f, 0xa9, 0x00, | 32 | 0x00, 0x00, 0x00, 0x00, 0x01, 0x1f, 0xae, 0x00, |
| 33 | 0x00, 0x33, 0xff, 0x00, 0x34, 0x02, 0x35, 0x82, | 33 | 0x00, 0x34, 0x00, 0x00, 0x34, 0x02, 0x35, 0x82, |
| 34 | 0x00, 0x34, 0x05, 0x3c, 0x1b, 0x00, 0x34, 0x06, | 34 | 0x00, 0x34, 0x05, 0x3c, 0x1b, 0x00, 0x34, 0x06, |
| 35 | 0x43, 0x5a, 0x00, 0x34, 0x27, 0x36, 0x56, 0x00, | 35 | 0x43, 0x5a, 0x00, 0x34, 0x27, 0x36, 0x56, 0x00, |
| 36 | 0x34, 0x2c, 0x43, 0x5e, 0x00, 0x34, 0x2e, 0x37, | 36 | 0x34, 0x2c, 0x43, 0x5e, 0x00, 0x34, 0x2e, 0x37, |
| @@ -8349,870 +8349,870 @@ static const unsigned char mac_uvs_table_adobe_japan1_bytes[] = | |||
| 8349 | 0x02, 0xb8, 0x17, 0x4f, 0x24, 0x02, 0xb8, 0x1a, | 8349 | 0x02, 0xb8, 0x17, 0x4f, 0x24, 0x02, 0xb8, 0x1a, |
| 8350 | 0x37, 0xc6, 0x02, 0xd5, 0x44, 0x36, 0x0a, 0x02, | 8350 | 0x37, 0xc6, 0x02, 0xd5, 0x44, 0x36, 0x0a, 0x02, |
| 8351 | 0xe2, 0x78, 0x37, 0x6b, 0x02, 0xe5, 0x69, 0x36, | 8351 | 0xe2, 0x78, 0x37, 0x6b, 0x02, 0xe5, 0x69, 0x36, |
| 8352 | 0x27, 0x02, 0xe6, 0xea, 0x37, 0x92, 0x00, 0x00, | 8352 | 0x27, 0x02, 0xe6, 0xea, 0x37, 0x92, 0x03, 0x13, |
| 8353 | 0x04, 0xb7, 0x00, 0x34, 0x02, 0x35, 0x81, 0x00, | 8353 | 0x50, 0x4a, 0xba, 0x00, 0x00, 0x04, 0xb7, 0x00, |
| 8354 | 0x4e, 0x08, 0x34, 0x97, 0x00, 0x4e, 0x0e, 0x4e, | 8354 | 0x34, 0x02, 0x35, 0x81, 0x00, 0x4e, 0x08, 0x34, |
| 8355 | 0x69, 0x00, 0x4e, 0x19, 0x36, 0xb9, 0x00, 0x4e, | 8355 | 0x97, 0x00, 0x4e, 0x0e, 0x4e, 0x69, 0x00, 0x4e, |
| 8356 | 0x26, 0x4e, 0x6a, 0x00, 0x4e, 0x30, 0x3c, 0x1a, | 8356 | 0x19, 0x36, 0xb9, 0x00, 0x4e, 0x26, 0x4e, 0x6a, |
| 8357 | 0x00, 0x4e, 0x39, 0x36, 0x5a, 0x00, 0x4e, 0x3b, | 8357 | 0x00, 0x4e, 0x30, 0x3c, 0x1a, 0x00, 0x4e, 0x39, |
| 8358 | 0x35, 0xf4, 0x00, 0x4e, 0x73, 0x36, 0x90, 0x00, | 8358 | 0x36, 0x5a, 0x00, 0x4e, 0x3b, 0x35, 0xf4, 0x00, |
| 8359 | 0x4e, 0xa1, 0x36, 0xcf, 0x00, 0x4e, 0xa4, 0x34, | 8359 | 0x4e, 0x73, 0x36, 0x90, 0x00, 0x4e, 0xa1, 0x36, |
| 8360 | 0x7f, 0x00, 0x4e, 0xca, 0x35, 0xd4, 0x00, 0x4f, | 8360 | 0xcf, 0x00, 0x4e, 0xa4, 0x34, 0x7f, 0x00, 0x4e, |
| 8361 | 0x34, 0x36, 0xa0, 0x00, 0x4f, 0x4f, 0x35, 0xfc, | 8361 | 0xca, 0x35, 0xd4, 0x00, 0x4f, 0x34, 0x36, 0xa0, |
| 8362 | 0x00, 0x4f, 0x60, 0x3c, 0x1c, 0x00, 0x4f, 0x73, | 8362 | 0x00, 0x4f, 0x4f, 0x35, 0xfc, 0x00, 0x4f, 0x60, |
| 8363 | 0x4e, 0x6c, 0x00, 0x4f, 0x75, 0x34, 0x47, 0x00, | 8363 | 0x3c, 0x1c, 0x00, 0x4f, 0x73, 0x4e, 0x6c, 0x00, |
| 8364 | 0x4f, 0x7f, 0x34, 0x8a, 0x00, 0x4f, 0xae, 0x34, | 8364 | 0x4f, 0x75, 0x34, 0x47, 0x00, 0x4f, 0x7f, 0x34, |
| 8365 | 0x46, 0x00, 0x4f, 0xb5, 0x36, 0x1b, 0x00, 0x4f, | 8365 | 0x8a, 0x00, 0x4f, 0xae, 0x34, 0x46, 0x00, 0x4f, |
| 8366 | 0xbf, 0x34, 0xc2, 0x00, 0x50, 0x24, 0x36, 0x5f, | 8366 | 0xb5, 0x36, 0x1b, 0x00, 0x4f, 0xbf, 0x34, 0xc2, |
| 8367 | 0x00, 0x50, 0x26, 0x1d, 0xfa, 0x00, 0x50, 0x49, | 8367 | 0x00, 0x50, 0x24, 0x36, 0x5f, 0x00, 0x50, 0x26, |
| 8368 | 0x34, 0x61, 0x00, 0x50, 0x4f, 0x36, 0xbe, 0x00, | 8368 | 0x1d, 0xfa, 0x00, 0x50, 0x49, 0x34, 0x61, 0x00, |
| 8369 | 0x50, 0x56, 0x4e, 0x6d, 0x00, 0x50, 0x65, 0x34, | 8369 | 0x50, 0x4f, 0x36, 0xbe, 0x00, 0x50, 0x56, 0x4e, |
| 8370 | 0x7b, 0x00, 0x50, 0x85, 0x34, 0xd0, 0x00, 0x50, | 8370 | 0x6d, 0x00, 0x50, 0x65, 0x34, 0x7b, 0x00, 0x50, |
| 8371 | 0x91, 0x34, 0x79, 0x00, 0x50, 0xc5, 0x1d, 0xee, | 8371 | 0x85, 0x34, 0xd0, 0x00, 0x50, 0x91, 0x34, 0x79, |
| 8372 | 0x00, 0x50, 0xca, 0x1f, 0x2e, 0x00, 0x50, 0xcf, | 8372 | 0x00, 0x50, 0xc5, 0x1d, 0xee, 0x00, 0x50, 0xca, |
| 8373 | 0x34, 0xa2, 0x00, 0x50, 0xe7, 0x34, 0x30, 0x00, | 8373 | 0x1f, 0x2e, 0x00, 0x50, 0xcf, 0x34, 0xa2, 0x00, |
| 8374 | 0x50, 0xed, 0x4e, 0x6e, 0x00, 0x50, 0xf2, 0x52, | 8374 | 0x50, 0xe7, 0x34, 0x30, 0x00, 0x50, 0xed, 0x4e, |
| 8375 | 0xac, 0x00, 0x51, 0x1a, 0x37, 0x16, 0x00, 0x51, | 8375 | 0x6e, 0x00, 0x50, 0xf2, 0x52, 0xac, 0x00, 0x51, |
| 8376 | 0x32, 0x1e, 0x76, 0x00, 0x51, 0x46, 0x34, 0xa5, | 8376 | 0x1a, 0x37, 0x16, 0x00, 0x51, 0x32, 0x1e, 0x76, |
| 8377 | 0x00, 0x51, 0x4d, 0x34, 0x4d, 0x00, 0x51, 0x4e, | 8377 | 0x00, 0x51, 0x46, 0x34, 0xa5, 0x00, 0x51, 0x4d, |
| 8378 | 0x36, 0x7d, 0x00, 0x51, 0x54, 0x10, 0x74, 0x00, | 8378 | 0x34, 0x4d, 0x00, 0x51, 0x4e, 0x36, 0x7d, 0x00, |
| 8379 | 0x51, 0x68, 0x36, 0x42, 0x00, 0x51, 0x6b, 0x4e, | 8379 | 0x51, 0x54, 0x10, 0x74, 0x00, 0x51, 0x68, 0x36, |
| 8380 | 0x6f, 0x00, 0x51, 0x6c, 0x34, 0x80, 0x00, 0x51, | 8380 | 0x42, 0x00, 0x51, 0x6b, 0x4e, 0x6f, 0x00, 0x51, |
| 8381 | 0x77, 0x35, 0xa5, 0x00, 0x51, 0x7c, 0x35, 0xb4, | 8381 | 0x6c, 0x34, 0x80, 0x00, 0x51, 0x77, 0x35, 0xa5, |
| 8382 | 0x00, 0x51, 0x89, 0x1e, 0x87, 0x00, 0x51, 0x8d, | 8382 | 0x00, 0x51, 0x7c, 0x35, 0xb4, 0x00, 0x51, 0x89, |
| 8383 | 0x08, 0x36, 0x00, 0x51, 0x92, 0x36, 0xd6, 0x00, | 8383 | 0x1e, 0x87, 0x00, 0x51, 0x8d, 0x08, 0x36, 0x00, |
| 8384 | 0x51, 0x93, 0x34, 0xd1, 0x00, 0x51, 0x95, 0x10, | 8384 | 0x51, 0x92, 0x36, 0xd6, 0x00, 0x51, 0x93, 0x34, |
| 8385 | 0x82, 0x00, 0x51, 0xa4, 0x1e, 0x89, 0x00, 0x51, | 8385 | 0xd1, 0x00, 0x51, 0x95, 0x10, 0x82, 0x00, 0x51, |
| 8386 | 0xac, 0x0c, 0x59, 0x00, 0x51, 0xb4, 0x34, 0x5c, | 8386 | 0xa4, 0x1e, 0x89, 0x00, 0x51, 0xac, 0x0c, 0x59, |
| 8387 | 0x00, 0x51, 0xcb, 0x1e, 0x3e, 0x00, 0x51, 0xdb, | 8387 | 0x00, 0x51, 0xb4, 0x34, 0x5c, 0x00, 0x51, 0xcb, |
| 8388 | 0x34, 0xd2, 0x00, 0x51, 0xde, 0x4f, 0x53, 0x00, | 8388 | 0x1e, 0x3e, 0x00, 0x51, 0xdb, 0x34, 0xd2, 0x00, |
| 8389 | 0x51, 0xe1, 0x36, 0xd9, 0x00, 0x51, 0xfd, 0x4e, | 8389 | 0x51, 0xde, 0x4f, 0x53, 0x00, 0x51, 0xe1, 0x36, |
| 8390 | 0x72, 0x00, 0x52, 0x03, 0x36, 0x22, 0x00, 0x52, | 8390 | 0xd9, 0x00, 0x51, 0xfd, 0x4e, 0x72, 0x00, 0x52, |
| 8391 | 0x06, 0x34, 0xbb, 0x00, 0x52, 0x24, 0x36, 0xa1, | 8391 | 0x03, 0x36, 0x22, 0x00, 0x52, 0x06, 0x34, 0xbb, |
| 8392 | 0x00, 0x52, 0x38, 0x35, 0xb5, 0x00, 0x52, 0x4a, | 8392 | 0x00, 0x52, 0x24, 0x36, 0xa1, 0x00, 0x52, 0x38, |
| 8393 | 0x35, 0xdd, 0x00, 0x52, 0x4d, 0x36, 0x41, 0x00, | 8393 | 0x35, 0xb5, 0x00, 0x52, 0x4a, 0x35, 0xdd, 0x00, |
| 8394 | 0x52, 0x64, 0x4e, 0x74, 0x00, 0x52, 0x71, 0x4e, | 8394 | 0x52, 0x4d, 0x36, 0x41, 0x00, 0x52, 0x64, 0x4e, |
| 8395 | 0x75, 0x00, 0x52, 0x72, 0x05, 0xc2, 0x00, 0x52, | 8395 | 0x74, 0x00, 0x52, 0x71, 0x4e, 0x75, 0x00, 0x52, |
| 8396 | 0x75, 0x1e, 0x2b, 0x00, 0x52, 0x8d, 0x37, 0x1a, | 8396 | 0x72, 0x05, 0xc2, 0x00, 0x52, 0x75, 0x1e, 0x2b, |
| 8397 | 0x00, 0x52, 0xc7, 0x36, 0xf6, 0x00, 0x52, 0xc9, | 8397 | 0x00, 0x52, 0x8d, 0x37, 0x1a, 0x00, 0x52, 0xc7, |
| 8398 | 0x0e, 0x29, 0x00, 0x52, 0xd7, 0x37, 0x1b, 0x00, | 8398 | 0x36, 0xf6, 0x00, 0x52, 0xc9, 0x0e, 0x29, 0x00, |
| 8399 | 0x52, 0xdd, 0x36, 0x05, 0x00, 0x52, 0xe2, 0x36, | 8399 | 0x52, 0xd7, 0x37, 0x1b, 0x00, 0x52, 0xdd, 0x36, |
| 8400 | 0x2a, 0x00, 0x52, 0xe4, 0x34, 0x1a, 0x00, 0x52, | 8400 | 0x05, 0x00, 0x52, 0xe2, 0x36, 0x2a, 0x00, 0x52, |
| 8401 | 0xfa, 0x09, 0x07, 0x00, 0x53, 0x00, 0x37, 0xcf, | 8401 | 0xe4, 0x34, 0x1a, 0x00, 0x52, 0xfa, 0x09, 0x07, |
| 8402 | 0x00, 0x53, 0x05, 0x36, 0xc3, 0x00, 0x53, 0x07, | 8402 | 0x00, 0x53, 0x00, 0x37, 0xcf, 0x00, 0x53, 0x05, |
| 8403 | 0x20, 0xd4, 0x00, 0x53, 0x15, 0x1f, 0x2f, 0x00, | 8403 | 0x36, 0xc3, 0x00, 0x53, 0x07, 0x20, 0xd4, 0x00, |
| 8404 | 0x53, 0x16, 0x35, 0x61, 0x00, 0x53, 0x39, 0x36, | 8404 | 0x53, 0x15, 0x1f, 0x2f, 0x00, 0x53, 0x16, 0x35, |
| 8405 | 0xaa, 0x00, 0x53, 0x3f, 0x4e, 0x77, 0x00, 0x53, | 8405 | 0x61, 0x00, 0x53, 0x39, 0x36, 0xaa, 0x00, 0x53, |
| 8406 | 0x40, 0x34, 0xd4, 0x00, 0x53, 0x4a, 0x36, 0xa2, | 8406 | 0x3f, 0x4e, 0x77, 0x00, 0x53, 0x40, 0x34, 0xd4, |
| 8407 | 0x00, 0x53, 0x51, 0x0d, 0x70, 0x00, 0x53, 0x5a, | 8407 | 0x00, 0x53, 0x4a, 0x36, 0xa2, 0x00, 0x53, 0x51, |
| 8408 | 0x36, 0x98, 0x00, 0x53, 0x65, 0x52, 0xf3, 0x00, | 8408 | 0x0d, 0x70, 0x00, 0x53, 0x5a, 0x36, 0x98, 0x00, |
| 8409 | 0x53, 0x71, 0x35, 0x80, 0x00, 0x53, 0x78, 0x35, | 8409 | 0x53, 0x65, 0x52, 0xf3, 0x00, 0x53, 0x71, 0x35, |
| 8410 | 0x5f, 0x00, 0x53, 0x7f, 0x06, 0xa2, 0x00, 0x53, | 8410 | 0x80, 0x00, 0x53, 0x78, 0x35, 0x5f, 0x00, 0x53, |
| 8411 | 0xa9, 0x1d, 0xd8, 0x00, 0x53, 0xc9, 0x4f, 0x39, | 8411 | 0x7f, 0x06, 0xa2, 0x00, 0x53, 0xa9, 0x1d, 0xd8, |
| 8412 | 0x00, 0x53, 0xca, 0x35, 0x8e, 0x00, 0x53, 0xce, | 8412 | 0x00, 0x53, 0xc9, 0x4f, 0x39, 0x00, 0x53, 0xca, |
| 8413 | 0x34, 0x8f, 0x00, 0x53, 0xd7, 0x35, 0xf5, 0x00, | 8413 | 0x35, 0x8e, 0x00, 0x53, 0xce, 0x34, 0x8f, 0x00, |
| 8414 | 0x53, 0xdb, 0x1f, 0x2a, 0x00, 0x53, 0xdf, 0x37, | 8414 | 0x53, 0xd7, 0x35, 0xf5, 0x00, 0x53, 0xdb, 0x1f, |
| 8415 | 0x1f, 0x00, 0x53, 0xe0, 0x53, 0x00, 0x00, 0x53, | 8415 | 0x2a, 0x00, 0x53, 0xdf, 0x37, 0x1f, 0x00, 0x53, |
| 8416 | 0xf1, 0x1e, 0x0c, 0x00, 0x53, 0xf2, 0x34, 0x8b, | 8416 | 0xe0, 0x53, 0x00, 0x00, 0x53, 0xf1, 0x1e, 0x0c, |
| 8417 | 0x00, 0x54, 0x0f, 0x34, 0xc9, 0x00, 0x54, 0x38, | 8417 | 0x00, 0x53, 0xf2, 0x34, 0x8b, 0x00, 0x54, 0x0f, |
| 8418 | 0x35, 0x8f, 0x00, 0x54, 0x40, 0x4e, 0x79, 0x00, | 8418 | 0x34, 0xc9, 0x00, 0x54, 0x38, 0x35, 0x8f, 0x00, |
| 8419 | 0x54, 0x48, 0x36, 0x76, 0x00, 0x54, 0x68, 0x09, | 8419 | 0x54, 0x40, 0x4e, 0x79, 0x00, 0x54, 0x48, 0x36, |
| 8420 | 0x2a, 0x00, 0x54, 0xac, 0x4f, 0x35, 0x00, 0x54, | 8420 | 0x76, 0x00, 0x54, 0x68, 0x09, 0x2a, 0x00, 0x54, |
| 8421 | 0xb2, 0x35, 0xdc, 0x00, 0x54, 0xe8, 0x1e, 0x17, | 8421 | 0xac, 0x4f, 0x35, 0x00, 0x54, 0xb2, 0x35, 0xdc, |
| 8422 | 0x00, 0x55, 0x10, 0x36, 0x83, 0x00, 0x55, 0x33, | 8422 | 0x00, 0x54, 0xe8, 0x1e, 0x17, 0x00, 0x55, 0x10, |
| 8423 | 0x1e, 0x8b, 0x00, 0x55, 0x39, 0x1e, 0x8a, 0x00, | 8423 | 0x36, 0x83, 0x00, 0x55, 0x33, 0x1e, 0x8b, 0x00, |
| 8424 | 0x55, 0x44, 0x1e, 0x32, 0x00, 0x55, 0x46, 0x36, | 8424 | 0x55, 0x39, 0x1e, 0x8a, 0x00, 0x55, 0x44, 0x1e, |
| 8425 | 0x06, 0x00, 0x55, 0x53, 0x35, 0xaa, 0x00, 0x55, | 8425 | 0x32, 0x00, 0x55, 0x46, 0x36, 0x06, 0x00, 0x55, |
| 8426 | 0x61, 0x38, 0x39, 0x00, 0x55, 0x84, 0x4e, 0x5e, | 8426 | 0x53, 0x35, 0xaa, 0x00, 0x55, 0x61, 0x38, 0x39, |
| 8427 | 0x00, 0x55, 0x9c, 0x4e, 0x7b, 0x00, 0x55, 0x9d, | 8427 | 0x00, 0x55, 0x84, 0x4e, 0x5e, 0x00, 0x55, 0x9c, |
| 8428 | 0x1d, 0xe3, 0x00, 0x55, 0xa9, 0x1f, 0x30, 0x00, | 8428 | 0x4e, 0x7b, 0x00, 0x55, 0x9d, 0x1d, 0xe3, 0x00, |
| 8429 | 0x55, 0xab, 0x35, 0x8b, 0x00, 0x55, 0xb0, 0x1d, | 8429 | 0x55, 0xa9, 0x1f, 0x30, 0x00, 0x55, 0xab, 0x35, |
| 8430 | 0xf0, 0x00, 0x55, 0xe4, 0x1e, 0x8c, 0x00, 0x56, | 8430 | 0x8b, 0x00, 0x55, 0xb0, 0x1d, 0xf0, 0x00, 0x55, |
| 8431 | 0x05, 0x53, 0x2d, 0x00, 0x56, 0x06, 0x0b, 0x70, | 8431 | 0xe4, 0x1e, 0x8c, 0x00, 0x56, 0x05, 0x53, 0x2d, |
| 8432 | 0x00, 0x56, 0x09, 0x4e, 0x7d, 0x00, 0x56, 0x32, | 8432 | 0x00, 0x56, 0x06, 0x0b, 0x70, 0x00, 0x56, 0x09, |
| 8433 | 0x1e, 0x8d, 0x00, 0x56, 0x42, 0x1d, 0xda, 0x00, | 8433 | 0x4e, 0x7d, 0x00, 0x56, 0x32, 0x1e, 0x8d, 0x00, |
| 8434 | 0x56, 0x4c, 0x1e, 0x29, 0x00, 0x56, 0x68, 0x34, | 8434 | 0x56, 0x42, 0x1d, 0xda, 0x00, 0x56, 0x4c, 0x1e, |
| 8435 | 0x15, 0x00, 0x56, 0x74, 0x34, 0xbc, 0x00, 0x56, | 8435 | 0x29, 0x00, 0x56, 0x68, 0x34, 0x15, 0x00, 0x56, |
| 8436 | 0x78, 0x1e, 0x52, 0x00, 0x56, 0xa5, 0x1e, 0x8e, | 8436 | 0x74, 0x34, 0xbc, 0x00, 0x56, 0x78, 0x1e, 0x52, |
| 8437 | 0x00, 0x56, 0xae, 0x1f, 0x31, 0x00, 0x56, 0xc0, | 8437 | 0x00, 0x56, 0xa5, 0x1e, 0x8e, 0x00, 0x56, 0xae, |
| 8438 | 0x37, 0x24, 0x00, 0x56, 0xc1, 0x34, 0xd7, 0x00, | 8438 | 0x1f, 0x31, 0x00, 0x56, 0xc0, 0x37, 0x24, 0x00, |
| 8439 | 0x56, 0xce, 0x4e, 0x82, 0x00, 0x56, 0xee, 0x4e, | 8439 | 0x56, 0xc1, 0x34, 0xd7, 0x00, 0x56, 0xce, 0x4e, |
| 8440 | 0x83, 0x00, 0x57, 0x0d, 0x34, 0xd8, 0x00, 0x57, | 8440 | 0x82, 0x00, 0x56, 0xee, 0x4e, 0x83, 0x00, 0x57, |
| 8441 | 0x47, 0x34, 0x78, 0x00, 0x57, 0x6a, 0x36, 0x74, | 8441 | 0x0d, 0x34, 0xd8, 0x00, 0x57, 0x47, 0x34, 0x78, |
| 8442 | 0x00, 0x57, 0xce, 0x09, 0xd3, 0x00, 0x57, 0xd6, | 8442 | 0x00, 0x57, 0x6a, 0x36, 0x74, 0x00, 0x57, 0xce, |
| 8443 | 0x4e, 0x84, 0x00, 0x57, 0xf4, 0x34, 0x98, 0x00, | 8443 | 0x09, 0xd3, 0x00, 0x57, 0xd6, 0x4e, 0x84, 0x00, |
| 8444 | 0x58, 0x0b, 0x1e, 0x8f, 0x00, 0x58, 0x19, 0x1f, | 8444 | 0x57, 0xf4, 0x34, 0x98, 0x00, 0x58, 0x0b, 0x1e, |
| 8445 | 0x32, 0x00, 0x58, 0x35, 0x1e, 0x49, 0x00, 0x58, | 8445 | 0x8f, 0x00, 0x58, 0x19, 0x1f, 0x32, 0x00, 0x58, |
| 8446 | 0x3d, 0x4e, 0x85, 0x00, 0x58, 0x40, 0x34, 0x48, | 8446 | 0x35, 0x1e, 0x49, 0x00, 0x58, 0x3d, 0x4e, 0x85, |
| 8447 | 0x00, 0x58, 0x58, 0x1e, 0x4d, 0x00, 0x58, 0x59, | 8447 | 0x00, 0x58, 0x40, 0x34, 0x48, 0x00, 0x58, 0x58, |
| 8448 | 0x4e, 0x86, 0x00, 0x58, 0x5a, 0x1e, 0x42, 0x00, | 8448 | 0x1e, 0x4d, 0x00, 0x58, 0x59, 0x4e, 0x86, 0x00, |
| 8449 | 0x58, 0x9c, 0x36, 0x71, 0x00, 0x58, 0xa8, 0x0e, | 8449 | 0x58, 0x5a, 0x1e, 0x42, 0x00, 0x58, 0x9c, 0x36, |
| 8450 | 0x7d, 0x00, 0x58, 0xab, 0x34, 0xd9, 0x00, 0x59, | 8450 | 0x71, 0x00, 0x58, 0xa8, 0x0e, 0x7d, 0x00, 0x58, |
| 8451 | 0x06, 0x53, 0x7b, 0x00, 0x59, 0x1b, 0x1f, 0x33, | 8451 | 0xab, 0x34, 0xd9, 0x00, 0x59, 0x06, 0x53, 0x7b, |
| 8452 | 0x00, 0x59, 0x27, 0x36, 0x55, 0x00, 0x59, 0x4f, | 8452 | 0x00, 0x59, 0x1b, 0x1f, 0x33, 0x00, 0x59, 0x27, |
| 8453 | 0x4e, 0x87, 0x00, 0x59, 0x51, 0x35, 0xab, 0x00, | 8453 | 0x36, 0x55, 0x00, 0x59, 0x4f, 0x4e, 0x87, 0x00, |
| 8454 | 0x59, 0x53, 0x37, 0xd1, 0x00, 0x59, 0x60, 0x4e, | 8454 | 0x59, 0x51, 0x35, 0xab, 0x00, 0x59, 0x53, 0x37, |
| 8455 | 0x89, 0x00, 0x59, 0x62, 0x4e, 0x8a, 0x00, 0x59, | 8455 | 0xd1, 0x00, 0x59, 0x60, 0x4e, 0x89, 0x00, 0x59, |
| 8456 | 0x73, 0x36, 0x04, 0x00, 0x59, 0x84, 0x36, 0xe7, | 8456 | 0x62, 0x4e, 0x8a, 0x00, 0x59, 0x73, 0x36, 0x04, |
| 8457 | 0x00, 0x59, 0xa5, 0x36, 0x4f, 0x00, 0x59, 0xc9, | 8457 | 0x00, 0x59, 0x84, 0x36, 0xe7, 0x00, 0x59, 0xa5, |
| 8458 | 0x34, 0x8c, 0x00, 0x59, 0xda, 0x34, 0xda, 0x00, | 8458 | 0x36, 0x4f, 0x00, 0x59, 0xc9, 0x34, 0x8c, 0x00, |
| 8459 | 0x59, 0xec, 0x36, 0xae, 0x00, 0x59, 0xff, 0x35, | 8459 | 0x59, 0xda, 0x34, 0xda, 0x00, 0x59, 0xec, 0x36, |
| 8460 | 0xe0, 0x00, 0x5a, 0x1c, 0x37, 0x26, 0x00, 0x5a, | 8460 | 0xae, 0x00, 0x59, 0xff, 0x35, 0xe0, 0x00, 0x5a, |
| 8461 | 0x29, 0x1e, 0x6f, 0x00, 0x5a, 0x36, 0x34, 0xdb, | 8461 | 0x1c, 0x37, 0x26, 0x00, 0x5a, 0x29, 0x1e, 0x6f, |
| 8462 | 0x00, 0x5a, 0x66, 0x36, 0xb2, 0x00, 0x5a, 0x9b, | 8462 | 0x00, 0x5a, 0x36, 0x34, 0xdb, 0x00, 0x5a, 0x66, |
| 8463 | 0x1e, 0x68, 0x00, 0x5a, 0xbe, 0x1e, 0x90, 0x00, | 8463 | 0x36, 0xb2, 0x00, 0x5a, 0x9b, 0x1e, 0x68, 0x00, |
| 8464 | 0x5a, 0xc2, 0x37, 0x27, 0x00, 0x5a, 0xcc, 0x1d, | 8464 | 0x5a, 0xbe, 0x1e, 0x90, 0x00, 0x5a, 0xc2, 0x37, |
| 8465 | 0xfb, 0x00, 0x5a, 0xda, 0x4e, 0x8b, 0x00, 0x5b, | 8465 | 0x27, 0x00, 0x5a, 0xcc, 0x1d, 0xfb, 0x00, 0x5a, |
| 8466 | 0x5a, 0x4e, 0x8c, 0x00, 0x5b, 0x73, 0x4e, 0x8d, | 8466 | 0xda, 0x4e, 0x8b, 0x00, 0x5b, 0x5a, 0x4e, 0x8c, |
| 8467 | 0x00, 0x5b, 0x7c, 0x4e, 0x8e, 0x00, 0x5b, 0xb3, | 8467 | 0x00, 0x5b, 0x73, 0x4e, 0x8d, 0x00, 0x5b, 0x7c, |
| 8468 | 0x34, 0x6d, 0x00, 0x5b, 0xb5, 0x36, 0x07, 0x00, | 8468 | 0x4e, 0x8e, 0x00, 0x5b, 0xb3, 0x34, 0x6d, 0x00, |
| 8469 | 0x5b, 0xc3, 0x37, 0x29, 0x00, 0x5b, 0xd2, 0x35, | 8469 | 0x5b, 0xb5, 0x36, 0x07, 0x00, 0x5b, 0xc3, 0x37, |
| 8470 | 0x78, 0x00, 0x5b, 0xdb, 0x20, 0xf4, 0x00, 0x5b, | 8470 | 0x29, 0x00, 0x5b, 0xd2, 0x35, 0x78, 0x00, 0x5b, |
| 8471 | 0xe7, 0x0c, 0xe1, 0x00, 0x5b, 0xe8, 0x37, 0x42, | 8471 | 0xdb, 0x20, 0xf4, 0x00, 0x5b, 0xe7, 0x0c, 0xe1, |
| 8472 | 0x00, 0x5c, 0x06, 0x09, 0x95, 0x00, 0x5c, 0x0a, | 8472 | 0x00, 0x5b, 0xe8, 0x37, 0x42, 0x00, 0x5c, 0x06, |
| 8473 | 0x36, 0x4d, 0x00, 0x5c, 0x0b, 0x36, 0x23, 0x00, | 8473 | 0x09, 0x95, 0x00, 0x5c, 0x0a, 0x36, 0x4d, 0x00, |
| 8474 | 0x5c, 0x0e, 0x36, 0x8a, 0x00, 0x5c, 0x0f, 0x36, | 8474 | 0x5c, 0x0b, 0x36, 0x23, 0x00, 0x5c, 0x0e, 0x36, |
| 8475 | 0x09, 0x00, 0x5c, 0x28, 0x1f, 0x34, 0x00, 0x5c, | 8475 | 0x8a, 0x00, 0x5c, 0x0f, 0x36, 0x09, 0x00, 0x5c, |
| 8476 | 0x51, 0x1d, 0xf2, 0x00, 0x5c, 0x60, 0x1e, 0x4a, | 8476 | 0x28, 0x1f, 0x34, 0x00, 0x5c, 0x51, 0x1d, 0xf2, |
| 8477 | 0x00, 0x5c, 0x64, 0x34, 0x31, 0x00, 0x5c, 0x6e, | 8477 | 0x00, 0x5c, 0x60, 0x1e, 0x4a, 0x00, 0x5c, 0x64, |
| 8478 | 0x12, 0x32, 0x00, 0x5d, 0x29, 0x36, 0xc4, 0x00, | 8478 | 0x34, 0x31, 0x00, 0x5c, 0x6e, 0x12, 0x32, 0x00, |
| 8479 | 0x5d, 0x4e, 0x34, 0xdd, 0x00, 0x5d, 0x87, 0x34, | 8479 | 0x5d, 0x29, 0x36, 0xc4, 0x00, 0x5d, 0x4e, 0x34, |
| 8480 | 0xde, 0x00, 0x5d, 0xb2, 0x3c, 0x2d, 0x00, 0x5d, | 8480 | 0xdd, 0x00, 0x5d, 0x87, 0x34, 0xde, 0x00, 0x5d, |
| 8481 | 0xc9, 0x34, 0xdf, 0x00, 0x5d, 0xcc, 0x34, 0x73, | 8481 | 0xb2, 0x3c, 0x2d, 0x00, 0x5d, 0xc9, 0x34, 0xdf, |
| 8482 | 0x00, 0x5d, 0xd3, 0x34, 0xe0, 0x00, 0x5d, 0xe1, | 8482 | 0x00, 0x5d, 0xcc, 0x34, 0x73, 0x00, 0x5d, 0xd3, |
| 8483 | 0x35, 0xff, 0x00, 0x5d, 0xe5, 0x35, 0xc3, 0x00, | 8483 | 0x34, 0xe0, 0x00, 0x5d, 0xe1, 0x35, 0xff, 0x00, |
| 8484 | 0x5d, 0xe8, 0x35, 0x92, 0x00, 0x5d, 0xf7, 0x1d, | 8484 | 0x5d, 0xe5, 0x35, 0xc3, 0x00, 0x5d, 0xe8, 0x35, |
| 8485 | 0xff, 0x00, 0x5d, 0xfd, 0x0b, 0x65, 0x00, 0x5e, | 8485 | 0x92, 0x00, 0x5d, 0xf7, 0x1d, 0xff, 0x00, 0x5d, |
| 8486 | 0x06, 0x36, 0xa3, 0x00, 0x5e, 0x1d, 0x36, 0x77, | 8486 | 0xfd, 0x0b, 0x65, 0x00, 0x5e, 0x06, 0x36, 0xa3, |
| 8487 | 0x00, 0x5e, 0x30, 0x34, 0x75, 0x00, 0x5e, 0x3d, | 8487 | 0x00, 0x5e, 0x1d, 0x36, 0x77, 0x00, 0x5e, 0x30, |
| 8488 | 0x36, 0xd0, 0x00, 0x5e, 0x43, 0x4e, 0x91, 0x00, | 8488 | 0x34, 0x75, 0x00, 0x5e, 0x3d, 0x36, 0xd0, 0x00, |
| 8489 | 0x5e, 0x54, 0x37, 0x2d, 0x00, 0x5e, 0x63, 0x36, | 8489 | 0x5e, 0x43, 0x4e, 0x91, 0x00, 0x5e, 0x54, 0x37, |
| 8490 | 0xba, 0x00, 0x5e, 0x64, 0x1e, 0x93, 0x00, 0x5e, | 8490 | 0x2d, 0x00, 0x5e, 0x63, 0x36, 0xba, 0x00, 0x5e, |
| 8491 | 0x73, 0x36, 0xbb, 0x00, 0x5e, 0x7e, 0x35, 0x84, | 8491 | 0x64, 0x1e, 0x93, 0x00, 0x5e, 0x73, 0x36, 0xbb, |
| 8492 | 0x00, 0x5e, 0x96, 0x1e, 0x70, 0x00, 0x5e, 0xa7, | 8492 | 0x00, 0x5e, 0x7e, 0x35, 0x84, 0x00, 0x5e, 0x96, |
| 8493 | 0x4e, 0x92, 0x00, 0x5e, 0xad, 0x34, 0xa9, 0x00, | 8493 | 0x1e, 0x70, 0x00, 0x5e, 0xa7, 0x4e, 0x92, 0x00, |
| 8494 | 0x5e, 0xc9, 0x0f, 0xbf, 0x00, 0x5e, 0xca, 0x4f, | 8494 | 0x5e, 0xad, 0x34, 0xa9, 0x00, 0x5e, 0xc9, 0x0f, |
| 8495 | 0x4f, 0x00, 0x5e, 0xcb, 0x38, 0xae, 0x00, 0x5e, | 8495 | 0xbf, 0x00, 0x5e, 0xca, 0x4f, 0x4f, 0x00, 0x5e, |
| 8496 | 0xcf, 0x1f, 0x36, 0x00, 0x5e, 0xd0, 0x1f, 0x35, | 8496 | 0xcb, 0x38, 0xae, 0x00, 0x5e, 0xcf, 0x1f, 0x36, |
| 8497 | 0x00, 0x5e, 0xdf, 0x1e, 0x6a, 0x00, 0x5e, 0xe0, | 8497 | 0x00, 0x5e, 0xd0, 0x1f, 0x35, 0x00, 0x5e, 0xdf, |
| 8498 | 0x1e, 0x18, 0x00, 0x5e, 0xe3, 0x37, 0x2f, 0x00, | 8498 | 0x1e, 0x6a, 0x00, 0x5e, 0xe0, 0x1e, 0x18, 0x00, |
| 8499 | 0x5e, 0xf6, 0x34, 0x67, 0x00, 0x5e, 0xf7, 0x34, | 8499 | 0x5e, 0xe3, 0x37, 0x2f, 0x00, 0x5e, 0xf6, 0x34, |
| 8500 | 0xaa, 0x00, 0x5e, 0xfa, 0x34, 0x7c, 0x00, 0x5e, | 8500 | 0x67, 0x00, 0x5e, 0xf7, 0x34, 0xaa, 0x00, 0x5e, |
| 8501 | 0xfb, 0x35, 0x69, 0x00, 0x5f, 0x0a, 0x36, 0xbc, | 8501 | 0xfa, 0x34, 0x7c, 0x00, 0x5e, 0xfb, 0x35, 0x69, |
| 8502 | 0x00, 0x5f, 0x2d, 0x34, 0xe1, 0x00, 0x5f, 0x31, | 8502 | 0x00, 0x5f, 0x0a, 0x36, 0xbc, 0x00, 0x5f, 0x2d, |
| 8503 | 0x35, 0xf3, 0x00, 0x5f, 0x38, 0x4e, 0x94, 0x00, | 8503 | 0x34, 0xe1, 0x00, 0x5f, 0x31, 0x35, 0xf3, 0x00, |
| 8504 | 0x5f, 0x45, 0x37, 0xce, 0x00, 0x5f, 0x50, 0x3c, | 8504 | 0x5f, 0x38, 0x4e, 0x94, 0x00, 0x5f, 0x45, 0x37, |
| 8505 | 0x1f, 0x00, 0x5f, 0x62, 0x4e, 0x5f, 0x00, 0x5f, | 8505 | 0xce, 0x00, 0x5f, 0x50, 0x3c, 0x1f, 0x00, 0x5f, |
| 8506 | 0x69, 0x35, 0xd7, 0x00, 0x5f, 0x6b, 0x36, 0x68, | 8506 | 0x62, 0x4e, 0x5f, 0x00, 0x5f, 0x69, 0x35, 0xd7, |
| 8507 | 0x00, 0x5f, 0x80, 0x35, 0x5d, 0x00, 0x5f, 0x98, | 8507 | 0x00, 0x5f, 0x6b, 0x36, 0x68, 0x00, 0x5f, 0x80, |
| 8508 | 0x34, 0xe2, 0x00, 0x5f, 0xa1, 0x4e, 0x95, 0x00, | 8508 | 0x35, 0x5d, 0x00, 0x5f, 0x98, 0x34, 0xe2, 0x00, |
| 8509 | 0x5f, 0xae, 0x36, 0xa8, 0x00, 0x5f, 0xb5, 0x36, | 8509 | 0x5f, 0xa1, 0x4e, 0x95, 0x00, 0x5f, 0xae, 0x36, |
| 8510 | 0x69, 0x00, 0x5f, 0xbd, 0x1d, 0xea, 0x00, 0x5f, | 8510 | 0xa8, 0x00, 0x5f, 0xb5, 0x36, 0x69, 0x00, 0x5f, |
| 8511 | 0xcd, 0x36, 0x91, 0x00, 0x5f, 0xd8, 0x36, 0xd1, | 8511 | 0xbd, 0x1d, 0xea, 0x00, 0x5f, 0xcd, 0x36, 0x91, |
| 8512 | 0x00, 0x5f, 0xd9, 0x36, 0xd2, 0x00, 0x5f, 0xdd, | 8512 | 0x00, 0x5f, 0xd8, 0x36, 0xd1, 0x00, 0x5f, 0xd9, |
| 8513 | 0x4e, 0x96, 0x00, 0x60, 0x25, 0x35, 0x90, 0x00, | 8513 | 0x36, 0xd2, 0x00, 0x5f, 0xdd, 0x4e, 0x96, 0x00, |
| 8514 | 0x60, 0x50, 0x35, 0x99, 0x00, 0x60, 0x62, 0x1d, | 8514 | 0x60, 0x25, 0x35, 0x90, 0x00, 0x60, 0x50, 0x35, |
| 8515 | 0xe0, 0x00, 0x60, 0x65, 0x34, 0xa4, 0x00, 0x60, | 8515 | 0x99, 0x00, 0x60, 0x62, 0x1d, 0xe0, 0x00, 0x60, |
| 8516 | 0x75, 0x35, 0xac, 0x00, 0x60, 0x94, 0x05, 0x79, | 8516 | 0x65, 0x34, 0xa4, 0x00, 0x60, 0x75, 0x35, 0xac, |
| 8517 | 0x00, 0x60, 0x97, 0x1e, 0x94, 0x00, 0x60, 0x9e, | 8517 | 0x00, 0x60, 0x94, 0x05, 0x79, 0x00, 0x60, 0x97, |
| 8518 | 0x54, 0x36, 0x00, 0x60, 0xa4, 0x3c, 0x20, 0x00, | 8518 | 0x1e, 0x94, 0x00, 0x60, 0x9e, 0x54, 0x36, 0x00, |
| 8519 | 0x60, 0xb2, 0x34, 0xb3, 0x00, 0x60, 0xc5, 0x36, | 8519 | 0x60, 0xa4, 0x3c, 0x20, 0x00, 0x60, 0xb2, 0x34, |
| 8520 | 0x12, 0x00, 0x60, 0xd8, 0x34, 0xe3, 0x00, 0x61, | 8520 | 0xb3, 0x00, 0x60, 0xc5, 0x36, 0x12, 0x00, 0x60, |
| 8521 | 0x08, 0x1e, 0x7a, 0x00, 0x61, 0x09, 0x36, 0xf3, | 8521 | 0xd8, 0x34, 0xe3, 0x00, 0x61, 0x08, 0x1e, 0x7a, |
| 8522 | 0x00, 0x61, 0x0f, 0x35, 0x47, 0x00, 0x61, 0x3d, | 8522 | 0x00, 0x61, 0x09, 0x36, 0xf3, 0x00, 0x61, 0x0f, |
| 8523 | 0x34, 0xe4, 0x00, 0x61, 0x48, 0x4e, 0x60, 0x00, | 8523 | 0x35, 0x47, 0x00, 0x61, 0x3d, 0x34, 0xe4, 0x00, |
| 8524 | 0x61, 0x4c, 0x35, 0xc4, 0x00, 0x61, 0x4e, 0x34, | 8524 | 0x61, 0x48, 0x4e, 0x60, 0x00, 0x61, 0x4c, 0x35, |
| 8525 | 0x2c, 0x00, 0x61, 0x62, 0x4e, 0x97, 0x00, 0x61, | 8525 | 0xc4, 0x00, 0x61, 0x4e, 0x34, 0x2c, 0x00, 0x61, |
| 8526 | 0x67, 0x1d, 0xf5, 0x00, 0x61, 0x68, 0x34, 0x10, | 8526 | 0x62, 0x4e, 0x97, 0x00, 0x61, 0x67, 0x1d, 0xf5, |
| 8527 | 0x00, 0x61, 0x8e, 0x0b, 0x00, 0x00, 0x61, 0x90, | 8527 | 0x00, 0x61, 0x68, 0x34, 0x10, 0x00, 0x61, 0x8e, |
| 8528 | 0x37, 0x10, 0x00, 0x61, 0xa4, 0x34, 0xbd, 0x00, | 8528 | 0x0b, 0x00, 0x00, 0x61, 0x90, 0x37, 0x10, 0x00, |
| 8529 | 0x61, 0xb2, 0x35, 0xb6, 0x00, 0x61, 0xf2, 0x34, | 8529 | 0x61, 0xa4, 0x34, 0xbd, 0x00, 0x61, 0xb2, 0x35, |
| 8530 | 0x39, 0x00, 0x61, 0xf8, 0x4e, 0x99, 0x00, 0x61, | 8530 | 0xb6, 0x00, 0x61, 0xf2, 0x34, 0x39, 0x00, 0x61, |
| 8531 | 0xfe, 0x34, 0xe5, 0x00, 0x62, 0x10, 0x36, 0x2b, | 8531 | 0xf8, 0x4e, 0x99, 0x00, 0x61, 0xfe, 0x34, 0xe5, |
| 8532 | 0x00, 0x62, 0x3b, 0x36, 0xeb, 0x00, 0x62, 0x3f, | 8532 | 0x00, 0x62, 0x10, 0x36, 0x2b, 0x00, 0x62, 0x3b, |
| 8533 | 0x36, 0xd3, 0x00, 0x62, 0x40, 0x36, 0x02, 0x00, | 8533 | 0x36, 0xeb, 0x00, 0x62, 0x3f, 0x36, 0xd3, 0x00, |
| 8534 | 0x62, 0x41, 0x1f, 0x37, 0x00, 0x62, 0x47, 0x36, | 8534 | 0x62, 0x40, 0x36, 0x02, 0x00, 0x62, 0x41, 0x1f, |
| 8535 | 0x3b, 0x00, 0x62, 0x48, 0x1e, 0xc2, 0x00, 0x62, | 8535 | 0x37, 0x00, 0x62, 0x47, 0x36, 0x3b, 0x00, 0x62, |
| 8536 | 0x49, 0x1e, 0x63, 0x00, 0x62, 0x68, 0x34, 0xe6, | 8536 | 0x48, 0x1e, 0xc2, 0x00, 0x62, 0x49, 0x1e, 0x63, |
| 8537 | 0x00, 0x62, 0x71, 0x35, 0x45, 0x00, 0x62, 0xb1, | 8537 | 0x00, 0x62, 0x68, 0x34, 0xe6, 0x00, 0x62, 0x71, |
| 8538 | 0x36, 0xc5, 0x00, 0x62, 0xcc, 0x37, 0x32, 0x00, | 8538 | 0x35, 0x45, 0x00, 0x62, 0xb1, 0x36, 0xc5, 0x00, |
| 8539 | 0x62, 0xcf, 0x34, 0xe7, 0x00, 0x62, 0xd0, 0x1d, | 8539 | 0x62, 0xcc, 0x37, 0x32, 0x00, 0x62, 0xcf, 0x34, |
| 8540 | 0xe1, 0x00, 0x62, 0xd2, 0x35, 0x93, 0x00, 0x62, | 8540 | 0xe7, 0x00, 0x62, 0xd0, 0x1d, 0xe1, 0x00, 0x62, |
| 8541 | 0xd4, 0x13, 0x5d, 0x00, 0x62, 0xf3, 0x1f, 0x21, | 8541 | 0xd2, 0x35, 0x93, 0x00, 0x62, 0xd4, 0x13, 0x5d, |
| 8542 | 0x00, 0x62, 0xf7, 0x34, 0x88, 0x00, 0x63, 0x3a, | 8542 | 0x00, 0x62, 0xf3, 0x1f, 0x21, 0x00, 0x62, 0xf7, |
| 8543 | 0x4f, 0x3e, 0x00, 0x63, 0x3d, 0x1e, 0x62, 0x00, | 8543 | 0x34, 0x88, 0x00, 0x63, 0x3a, 0x4f, 0x3e, 0x00, |
| 8544 | 0x63, 0x4c, 0x34, 0x5d, 0x00, 0x63, 0x57, 0x1e, | 8544 | 0x63, 0x3d, 0x1e, 0x62, 0x00, 0x63, 0x4c, 0x34, |
| 8545 | 0x3f, 0x00, 0x63, 0x67, 0x34, 0xc3, 0x00, 0x63, | 8545 | 0x5d, 0x00, 0x63, 0x57, 0x1e, 0x3f, 0x00, 0x63, |
| 8546 | 0x68, 0x35, 0xec, 0x00, 0x63, 0x69, 0x1e, 0x95, | 8546 | 0x67, 0x34, 0xc3, 0x00, 0x63, 0x68, 0x35, 0xec, |
| 8547 | 0x00, 0x63, 0x6e, 0x34, 0x9d, 0x00, 0x63, 0x72, | 8547 | 0x00, 0x63, 0x69, 0x1e, 0x95, 0x00, 0x63, 0x6e, |
| 8548 | 0x1d, 0xfc, 0x00, 0x63, 0x83, 0x36, 0x43, 0x00, | 8548 | 0x34, 0x9d, 0x00, 0x63, 0x72, 0x1d, 0xfc, 0x00, |
| 8549 | 0x63, 0x88, 0x35, 0xf6, 0x00, 0x63, 0x92, 0x34, | 8549 | 0x63, 0x83, 0x36, 0x43, 0x00, 0x63, 0x88, 0x35, |
| 8550 | 0xaf, 0x00, 0x63, 0xa1, 0x35, 0xd8, 0x00, 0x63, | 8550 | 0xf6, 0x00, 0x63, 0x92, 0x34, 0xaf, 0x00, 0x63, |
| 8551 | 0xa7, 0x35, 0xc6, 0x00, 0x63, 0xc3, 0x1f, 0x27, | 8551 | 0xa1, 0x35, 0xd8, 0x00, 0x63, 0xa7, 0x35, 0xc6, |
| 8552 | 0x00, 0x63, 0xc6, 0x37, 0x34, 0x00, 0x63, 0xf4, | 8552 | 0x00, 0x63, 0xc3, 0x1f, 0x27, 0x00, 0x63, 0xc6, |
| 8553 | 0x35, 0x57, 0x00, 0x64, 0x06, 0x1e, 0x96, 0x00, | 8553 | 0x37, 0x34, 0x00, 0x63, 0xf4, 0x35, 0x57, 0x00, |
| 8554 | 0x64, 0x0f, 0x34, 0xe9, 0x00, 0x64, 0x1c, 0x37, | 8554 | 0x64, 0x06, 0x1e, 0x96, 0x00, 0x64, 0x0f, 0x34, |
| 8555 | 0x33, 0x00, 0x64, 0x28, 0x37, 0x35, 0x00, 0x64, | 8555 | 0xe9, 0x00, 0x64, 0x1c, 0x37, 0x33, 0x00, 0x64, |
| 8556 | 0x42, 0x34, 0x9e, 0x00, 0x64, 0x69, 0x36, 0xd7, | 8556 | 0x28, 0x37, 0x35, 0x00, 0x64, 0x42, 0x34, 0x9e, |
| 8557 | 0x00, 0x64, 0x6f, 0x4f, 0x28, 0x00, 0x64, 0x7a, | 8557 | 0x00, 0x64, 0x69, 0x36, 0xd7, 0x00, 0x64, 0x6f, |
| 8558 | 0x1e, 0x21, 0x00, 0x64, 0xb0, 0x1e, 0x24, 0x00, | 8558 | 0x4f, 0x28, 0x00, 0x64, 0x7a, 0x1e, 0x21, 0x00, |
| 8559 | 0x64, 0xe2, 0x1e, 0x45, 0x00, 0x64, 0xf2, 0x34, | 8559 | 0x64, 0xb0, 0x1e, 0x24, 0x00, 0x64, 0xe2, 0x1e, |
| 8560 | 0xea, 0x00, 0x64, 0xf6, 0x4e, 0x9e, 0x00, 0x65, | 8560 | 0x45, 0x00, 0x64, 0xf2, 0x34, 0xea, 0x00, 0x64, |
| 8561 | 0x1d, 0x34, 0xe8, 0x00, 0x65, 0x4f, 0x0d, 0xc4, | 8561 | 0xf6, 0x4e, 0x9e, 0x00, 0x65, 0x1d, 0x34, 0xe8, |
| 8562 | 0x00, 0x65, 0x5d, 0x34, 0xeb, 0x00, 0x65, 0x5e, | 8562 | 0x00, 0x65, 0x4f, 0x0d, 0xc4, 0x00, 0x65, 0x5d, |
| 8563 | 0x4e, 0xa1, 0x00, 0x65, 0x62, 0x34, 0x71, 0x00, | 8563 | 0x34, 0xeb, 0x00, 0x65, 0x5e, 0x4e, 0xa1, 0x00, |
| 8564 | 0x65, 0x77, 0x36, 0xb3, 0x00, 0x65, 0x83, 0x1e, | 8564 | 0x65, 0x62, 0x34, 0x71, 0x00, 0x65, 0x77, 0x36, |
| 8565 | 0x98, 0x00, 0x65, 0x87, 0x4e, 0xa3, 0x00, 0x65, | 8565 | 0xb3, 0x00, 0x65, 0x83, 0x1e, 0x98, 0x00, 0x65, |
| 8566 | 0x89, 0x4e, 0xa4, 0x00, 0x65, 0x8e, 0x4e, 0xa6, | 8566 | 0x87, 0x4e, 0xa3, 0x00, 0x65, 0x89, 0x4e, 0xa4, |
| 8567 | 0x00, 0x65, 0x90, 0x34, 0xb5, 0x00, 0x65, 0x9c, | 8567 | 0x00, 0x65, 0x8e, 0x4e, 0xa6, 0x00, 0x65, 0x90, |
| 8568 | 0x35, 0xed, 0x00, 0x65, 0xa7, 0x4f, 0x41, 0x00, | 8568 | 0x34, 0xb5, 0x00, 0x65, 0x9c, 0x35, 0xed, 0x00, |
| 8569 | 0x65, 0xbc, 0x35, 0x5c, 0x00, 0x65, 0xc5, 0x37, | 8569 | 0x65, 0xa7, 0x4f, 0x41, 0x00, 0x65, 0xbc, 0x35, |
| 8570 | 0x08, 0x00, 0x65, 0xdf, 0x54, 0xbe, 0x00, 0x65, | 8570 | 0x5c, 0x00, 0x65, 0xc5, 0x37, 0x08, 0x00, 0x65, |
| 8571 | 0xe1, 0x4e, 0xa9, 0x00, 0x65, 0xe2, 0x06, 0x37, | 8571 | 0xdf, 0x54, 0xbe, 0x00, 0x65, 0xe1, 0x4e, 0xa9, |
| 8572 | 0x00, 0x66, 0x0e, 0x36, 0xe4, 0x00, 0x66, 0x1e, | 8572 | 0x00, 0x65, 0xe2, 0x06, 0x37, 0x00, 0x66, 0x0e, |
| 8573 | 0x21, 0x1c, 0x00, 0x66, 0x5f, 0x34, 0xec, 0x00, | 8573 | 0x36, 0xe4, 0x00, 0x66, 0x1e, 0x21, 0x1c, 0x00, |
| 8574 | 0x66, 0x66, 0x1d, 0xe2, 0x00, 0x66, 0x67, 0x4e, | 8574 | 0x66, 0x5f, 0x34, 0xec, 0x00, 0x66, 0x66, 0x1d, |
| 8575 | 0xaa, 0x00, 0x66, 0x69, 0x36, 0xa5, 0x00, 0x66, | 8575 | 0xe2, 0x00, 0x66, 0x67, 0x4e, 0xaa, 0x00, 0x66, |
| 8576 | 0x6e, 0x4e, 0xab, 0x00, 0x66, 0x74, 0x0a, 0x56, | 8576 | 0x69, 0x36, 0xa5, 0x00, 0x66, 0x6e, 0x4e, 0xab, |
| 8577 | 0x00, 0x66, 0x77, 0x39, 0x11, 0x00, 0x66, 0x81, | 8577 | 0x00, 0x66, 0x74, 0x0a, 0x56, 0x00, 0x66, 0x77, |
| 8578 | 0x35, 0xa0, 0x00, 0x66, 0x91, 0x34, 0x28, 0x00, | 8578 | 0x39, 0x11, 0x00, 0x66, 0x81, 0x35, 0xa0, 0x00, |
| 8579 | 0x66, 0x96, 0x36, 0x5e, 0x00, 0x66, 0x97, 0x35, | 8579 | 0x66, 0x91, 0x34, 0x28, 0x00, 0x66, 0x96, 0x36, |
| 8580 | 0x46, 0x00, 0x66, 0xb5, 0x54, 0xda, 0x00, 0x66, | 8580 | 0x5e, 0x00, 0x66, 0x97, 0x35, 0x46, 0x00, 0x66, |
| 8581 | 0xc1, 0x1f, 0x38, 0x00, 0x66, 0xd9, 0x1e, 0x13, | 8581 | 0xb5, 0x54, 0xda, 0x00, 0x66, 0xc1, 0x1f, 0x38, |
| 8582 | 0x00, 0x66, 0xdc, 0x36, 0xfd, 0x00, 0x66, 0xf4, | 8582 | 0x00, 0x66, 0xd9, 0x1e, 0x13, 0x00, 0x66, 0xdc, |
| 8583 | 0x34, 0x81, 0x00, 0x66, 0xf5, 0x37, 0x3b, 0x00, | 8583 | 0x36, 0xfd, 0x00, 0x66, 0xf4, 0x34, 0x81, 0x00, |
| 8584 | 0x66, 0xf8, 0x36, 0x03, 0x00, 0x66, 0xfb, 0x37, | 8584 | 0x66, 0xf5, 0x37, 0x3b, 0x00, 0x66, 0xf8, 0x36, |
| 8585 | 0xcd, 0x00, 0x66, 0xfc, 0x37, 0x20, 0x00, 0x67, | 8585 | 0x03, 0x00, 0x66, 0xfb, 0x37, 0xcd, 0x00, 0x66, |
| 8586 | 0x00, 0x4e, 0xaf, 0x00, 0x67, 0x08, 0x35, 0xb2, | 8586 | 0xfc, 0x37, 0x20, 0x00, 0x67, 0x00, 0x4e, 0xaf, |
| 8587 | 0x00, 0x67, 0x09, 0x36, 0xf7, 0x00, 0x67, 0x0b, | 8587 | 0x00, 0x67, 0x08, 0x35, 0xb2, 0x00, 0x67, 0x09, |
| 8588 | 0x36, 0xc6, 0x00, 0x67, 0x0d, 0x36, 0xb7, 0x00, | 8588 | 0x36, 0xf7, 0x00, 0x67, 0x0b, 0x36, 0xc6, 0x00, |
| 8589 | 0x67, 0x15, 0x36, 0x6f, 0x00, 0x67, 0x17, 0x0f, | 8589 | 0x67, 0x0d, 0x36, 0xb7, 0x00, 0x67, 0x15, 0x36, |
| 8590 | 0xd5, 0x00, 0x67, 0x1b, 0x36, 0xd4, 0x00, 0x67, | 8590 | 0x6f, 0x00, 0x67, 0x17, 0x0f, 0xd5, 0x00, 0x67, |
| 8591 | 0x1d, 0x36, 0x6b, 0x00, 0x67, 0x1f, 0x35, 0x86, | 8591 | 0x1b, 0x36, 0xd4, 0x00, 0x67, 0x1d, 0x36, 0x6b, |
| 8592 | 0x00, 0x67, 0x53, 0x1e, 0x0f, 0x00, 0x67, 0x56, | 8592 | 0x00, 0x67, 0x1f, 0x35, 0x86, 0x00, 0x67, 0x53, |
| 8593 | 0x4f, 0x3a, 0x00, 0x67, 0x5e, 0x37, 0x3c, 0x00, | 8593 | 0x1e, 0x0f, 0x00, 0x67, 0x56, 0x4f, 0x3a, 0x00, |
| 8594 | 0x67, 0x61, 0x4e, 0xb0, 0x00, 0x67, 0x7e, 0x34, | 8594 | 0x67, 0x5e, 0x37, 0x3c, 0x00, 0x67, 0x61, 0x4e, |
| 8595 | 0x95, 0x00, 0x67, 0xa6, 0x1e, 0x99, 0x00, 0x67, | 8595 | 0xb0, 0x00, 0x67, 0x7e, 0x34, 0x95, 0x00, 0x67, |
| 8596 | 0xa9, 0x34, 0xed, 0x00, 0x67, 0xc4, 0x4e, 0xb1, | 8596 | 0xa6, 0x1e, 0x99, 0x00, 0x67, 0xa9, 0x34, 0xed, |
| 8597 | 0x00, 0x67, 0xca, 0x1e, 0x65, 0x00, 0x67, 0xd4, | 8597 | 0x00, 0x67, 0xc4, 0x4e, 0xb1, 0x00, 0x67, 0xca, |
| 8598 | 0x34, 0x91, 0x00, 0x67, 0xe7, 0x34, 0xee, 0x00, | 8598 | 0x1e, 0x65, 0x00, 0x67, 0xd4, 0x34, 0x91, 0x00, |
| 8599 | 0x67, 0xf1, 0x36, 0x65, 0x00, 0x68, 0x01, 0x21, | 8599 | 0x67, 0xe7, 0x34, 0xee, 0x00, 0x67, 0xf1, 0x36, |
| 8600 | 0x2e, 0x00, 0x68, 0x02, 0x4e, 0xb2, 0x00, 0x68, | 8600 | 0x65, 0x00, 0x68, 0x01, 0x21, 0x2e, 0x00, 0x68, |
| 8601 | 0x13, 0x1e, 0x25, 0x00, 0x68, 0x1f, 0x4e, 0x61, | 8601 | 0x02, 0x4e, 0xb2, 0x00, 0x68, 0x13, 0x1e, 0x25, |
| 8602 | 0x00, 0x68, 0x21, 0x34, 0x82, 0x00, 0x68, 0x43, | 8602 | 0x00, 0x68, 0x1f, 0x4e, 0x61, 0x00, 0x68, 0x21, |
| 8603 | 0x34, 0xac, 0x00, 0x68, 0x52, 0x21, 0x2c, 0x00, | 8603 | 0x34, 0x82, 0x00, 0x68, 0x43, 0x34, 0xac, 0x00, |
| 8604 | 0x68, 0x5d, 0x34, 0xc5, 0x00, 0x68, 0x7a, 0x36, | 8604 | 0x68, 0x52, 0x21, 0x2c, 0x00, 0x68, 0x5d, 0x34, |
| 8605 | 0xf0, 0x00, 0x68, 0x81, 0x37, 0x09, 0x00, 0x68, | 8605 | 0xc5, 0x00, 0x68, 0x7a, 0x36, 0xf0, 0x00, 0x68, |
| 8606 | 0x85, 0x0d, 0x15, 0x00, 0x68, 0x8d, 0x37, 0x3e, | 8606 | 0x81, 0x37, 0x09, 0x00, 0x68, 0x85, 0x0d, 0x15, |
| 8607 | 0x00, 0x68, 0x97, 0x4f, 0x37, 0x00, 0x68, 0x9b, | 8607 | 0x00, 0x68, 0x8d, 0x37, 0x3e, 0x00, 0x68, 0x97, |
| 8608 | 0x1e, 0x9b, 0x00, 0x68, 0x9d, 0x37, 0x3d, 0x00, | 8608 | 0x4f, 0x37, 0x00, 0x68, 0x9b, 0x1e, 0x9b, 0x00, |
| 8609 | 0x68, 0xa2, 0x1e, 0x19, 0x00, 0x68, 0xc8, 0x37, | 8609 | 0x68, 0x9d, 0x37, 0x3d, 0x00, 0x68, 0xa2, 0x1e, |
| 8610 | 0xcc, 0x00, 0x68, 0xda, 0x1e, 0x38, 0x00, 0x69, | 8610 | 0x19, 0x00, 0x68, 0xc8, 0x37, 0xcc, 0x00, 0x68, |
| 8611 | 0x0d, 0x34, 0x99, 0x00, 0x69, 0x30, 0x34, 0xf0, | 8611 | 0xda, 0x1e, 0x38, 0x00, 0x69, 0x0d, 0x34, 0x99, |
| 8612 | 0x00, 0x69, 0x3d, 0x4e, 0xb3, 0x00, 0x69, 0x5e, | 8612 | 0x00, 0x69, 0x30, 0x34, 0xf0, 0x00, 0x69, 0x3d, |
| 8613 | 0x4e, 0xb4, 0x00, 0x69, 0x62, 0x1e, 0x58, 0x00, | 8613 | 0x4e, 0xb3, 0x00, 0x69, 0x5e, 0x4e, 0xb4, 0x00, |
| 8614 | 0x69, 0x6b, 0x34, 0xef, 0x00, 0x69, 0x6f, 0x34, | 8614 | 0x69, 0x62, 0x1e, 0x58, 0x00, 0x69, 0x6b, 0x34, |
| 8615 | 0x94, 0x00, 0x69, 0x82, 0x34, 0x5b, 0x00, 0x69, | 8615 | 0xef, 0x00, 0x69, 0x6f, 0x34, 0x94, 0x00, 0x69, |
| 8616 | 0x8a, 0x1e, 0x06, 0x00, 0x69, 0x94, 0x1e, 0x84, | 8616 | 0x82, 0x34, 0x5b, 0x00, 0x69, 0x8a, 0x1e, 0x06, |
| 8617 | 0x00, 0x69, 0xa7, 0x34, 0xf1, 0x00, 0x69, 0xbb, | 8617 | 0x00, 0x69, 0x94, 0x1e, 0x84, 0x00, 0x69, 0xa7, |
| 8618 | 0x37, 0x43, 0x00, 0x69, 0xc1, 0x35, 0x9a, 0x00, | 8618 | 0x34, 0xf1, 0x00, 0x69, 0xbb, 0x37, 0x43, 0x00, |
| 8619 | 0x69, 0xcb, 0x35, 0xc7, 0x00, 0x69, 0xcc, 0x1e, | 8619 | 0x69, 0xc1, 0x35, 0x9a, 0x00, 0x69, 0xcb, 0x35, |
| 8620 | 0x40, 0x00, 0x69, 0xd9, 0x36, 0xdd, 0x00, 0x69, | 8620 | 0xc7, 0x00, 0x69, 0xcc, 0x1e, 0x40, 0x00, 0x69, |
| 8621 | 0xea, 0x35, 0x6f, 0x00, 0x69, 0xfe, 0x55, 0x1f, | 8621 | 0xd9, 0x36, 0xdd, 0x00, 0x69, 0xea, 0x35, 0x6f, |
| 8622 | 0x00, 0x6a, 0x0b, 0x1e, 0x64, 0x00, 0x6a, 0x3d, | 8622 | 0x00, 0x69, 0xfe, 0x55, 0x1f, 0x00, 0x6a, 0x0b, |
| 8623 | 0x1e, 0x3a, 0x00, 0x6a, 0x44, 0x34, 0xf2, 0x00, | 8623 | 0x1e, 0x64, 0x00, 0x6a, 0x3d, 0x1e, 0x3a, 0x00, |
| 8624 | 0x6a, 0x55, 0x55, 0x25, 0x00, 0x6a, 0x5f, 0x35, | 8624 | 0x6a, 0x44, 0x34, 0xf2, 0x00, 0x6a, 0x55, 0x55, |
| 8625 | 0x87, 0x00, 0x6a, 0x73, 0x37, 0xd4, 0x00, 0x6a, | 8625 | 0x25, 0x00, 0x6a, 0x5f, 0x35, 0x87, 0x00, 0x6a, |
| 8626 | 0x8e, 0x34, 0x7e, 0x00, 0x6a, 0x90, 0x34, 0xf3, | 8626 | 0x73, 0x37, 0xd4, 0x00, 0x6a, 0x8e, 0x34, 0x7e, |
| 8627 | 0x00, 0x6a, 0x9c, 0x4e, 0xb6, 0x00, 0x6a, 0xdb, | 8627 | 0x00, 0x6a, 0x90, 0x34, 0xf3, 0x00, 0x6a, 0x9c, |
| 8628 | 0x06, 0xf3, 0x00, 0x6b, 0x04, 0x0f, 0x5d, 0x00, | 8628 | 0x4e, 0xb6, 0x00, 0x6a, 0xdb, 0x06, 0xf3, 0x00, |
| 8629 | 0x6b, 0x1d, 0x1d, 0xd7, 0x00, 0x6b, 0x21, 0x35, | 8629 | 0x6b, 0x04, 0x0f, 0x5d, 0x00, 0x6b, 0x1d, 0x1d, |
| 8630 | 0xe7, 0x00, 0x6b, 0x24, 0x3c, 0x22, 0x00, 0x6b, | 8630 | 0xd7, 0x00, 0x6b, 0x21, 0x35, 0xe7, 0x00, 0x6b, |
| 8631 | 0x4e, 0x36, 0x5b, 0x00, 0x6b, 0x96, 0x36, 0x16, | 8631 | 0x24, 0x3c, 0x22, 0x00, 0x6b, 0x4e, 0x36, 0x5b, |
| 8632 | 0x00, 0x6b, 0xba, 0x08, 0x74, 0x00, 0x6b, 0xbb, | 8632 | 0x00, 0x6b, 0x96, 0x36, 0x16, 0x00, 0x6b, 0xba, |
| 8633 | 0x34, 0x70, 0x00, 0x6c, 0x08, 0x1f, 0x39, 0x00, | 8633 | 0x08, 0x74, 0x00, 0x6b, 0xbb, 0x34, 0x70, 0x00, |
| 8634 | 0x6c, 0x13, 0x34, 0xf5, 0x00, 0x6c, 0x38, 0x4e, | 8634 | 0x6c, 0x08, 0x1f, 0x39, 0x00, 0x6c, 0x13, 0x34, |
| 8635 | 0xba, 0x00, 0x6c, 0x3a, 0x39, 0x62, 0x00, 0x6c, | 8635 | 0xf5, 0x00, 0x6c, 0x38, 0x4e, 0xba, 0x00, 0x6c, |
| 8636 | 0x72, 0x1f, 0x1e, 0x00, 0x6c, 0xaa, 0x37, 0x48, | 8636 | 0x3a, 0x39, 0x62, 0x00, 0x6c, 0x72, 0x1f, 0x1e, |
| 8637 | 0x00, 0x6c, 0xbf, 0x05, 0x0a, 0x00, 0x6c, 0xe1, | 8637 | 0x00, 0x6c, 0xaa, 0x37, 0x48, 0x00, 0x6c, 0xbf, |
| 8638 | 0x1e, 0x71, 0x00, 0x6c, 0xe8, 0x36, 0x66, 0x00, | 8638 | 0x05, 0x0a, 0x00, 0x6c, 0xe1, 0x1e, 0x71, 0x00, |
| 8639 | 0x6d, 0x3e, 0x34, 0xae, 0x00, 0x6d, 0x69, 0x35, | 8639 | 0x6c, 0xe8, 0x36, 0x66, 0x00, 0x6d, 0x3e, 0x34, |
| 8640 | 0xc8, 0x00, 0x6d, 0x6e, 0x36, 0xb4, 0x00, 0x6d, | 8640 | 0xae, 0x00, 0x6d, 0x69, 0x35, 0xc8, 0x00, 0x6d, |
| 8641 | 0x77, 0x05, 0x82, 0x00, 0x6d, 0x78, 0x36, 0x1d, | 8641 | 0x6e, 0x36, 0xb4, 0x00, 0x6d, 0x77, 0x05, 0x82, |
| 8642 | 0x00, 0x6d, 0x88, 0x36, 0x0c, 0x00, 0x6d, 0xe4, | 8642 | 0x00, 0x6d, 0x78, 0x36, 0x1d, 0x00, 0x6d, 0x88, |
| 8643 | 0x4e, 0xbd, 0x00, 0x6d, 0xeb, 0x1d, 0xd5, 0x00, | 8643 | 0x36, 0x0c, 0x00, 0x6d, 0xe4, 0x4e, 0xbd, 0x00, |
| 8644 | 0x6d, 0xfb, 0x36, 0x7c, 0x00, 0x6e, 0x08, 0x4e, | 8644 | 0x6d, 0xeb, 0x1d, 0xd5, 0x00, 0x6d, 0xfb, 0x36, |
| 8645 | 0xbf, 0x00, 0x6e, 0x1a, 0x09, 0x77, 0x00, 0x6e, | 8645 | 0x7c, 0x00, 0x6e, 0x08, 0x4e, 0xbf, 0x00, 0x6e, |
| 8646 | 0x23, 0x1f, 0x3a, 0x00, 0x6e, 0x2f, 0x35, 0xc9, | 8646 | 0x1a, 0x09, 0x77, 0x00, 0x6e, 0x23, 0x1f, 0x3a, |
| 8647 | 0x00, 0x6e, 0x6e, 0x1e, 0x9d, 0x00, 0x6e, 0x72, | 8647 | 0x00, 0x6e, 0x2f, 0x35, 0xc9, 0x00, 0x6e, 0x6e, |
| 8648 | 0x4e, 0xc0, 0x00, 0x6e, 0x7e, 0x34, 0xcf, 0x00, | 8648 | 0x1e, 0x9d, 0x00, 0x6e, 0x72, 0x4e, 0xc0, 0x00, |
| 8649 | 0x6e, 0x9d, 0x1e, 0x01, 0x00, 0x6e, 0xa2, 0x1d, | 8649 | 0x6e, 0x7e, 0x34, 0xcf, 0x00, 0x6e, 0x9d, 0x1e, |
| 8650 | 0xd3, 0x00, 0x6e, 0xba, 0x1e, 0x46, 0x00, 0x6e, | 8650 | 0x01, 0x00, 0x6e, 0xa2, 0x1d, 0xd3, 0x00, 0x6e, |
| 8651 | 0xcb, 0x35, 0xe9, 0x00, 0x6e, 0xd5, 0x4e, 0xc2, | 8651 | 0xba, 0x1e, 0x46, 0x00, 0x6e, 0xcb, 0x35, 0xe9, |
| 8652 | 0x00, 0x6e, 0xdb, 0x4e, 0xc3, 0x00, 0x6e, 0xec, | 8652 | 0x00, 0x6e, 0xd5, 0x4e, 0xc2, 0x00, 0x6e, 0xdb, |
| 8653 | 0x1f, 0x3b, 0x00, 0x6e, 0xfe, 0x34, 0xf8, 0x00, | 8653 | 0x4e, 0xc3, 0x00, 0x6e, 0xec, 0x1f, 0x3b, 0x00, |
| 8654 | 0x6f, 0x11, 0x34, 0xf7, 0x00, 0x6f, 0x22, 0x34, | 8654 | 0x6e, 0xfe, 0x34, 0xf8, 0x00, 0x6f, 0x11, 0x34, |
| 8655 | 0x14, 0x00, 0x6f, 0x23, 0x0f, 0xc2, 0x00, 0x6f, | 8655 | 0xf7, 0x00, 0x6f, 0x22, 0x34, 0x14, 0x00, 0x6f, |
| 8656 | 0x3e, 0x34, 0xf9, 0x00, 0x6f, 0x51, 0x36, 0x9e, | 8656 | 0x23, 0x0f, 0xc2, 0x00, 0x6f, 0x3e, 0x34, 0xf9, |
| 8657 | 0x00, 0x6f, 0x54, 0x35, 0xb0, 0x00, 0x6f, 0x5b, | 8657 | 0x00, 0x6f, 0x51, 0x36, 0x9e, 0x00, 0x6f, 0x54, |
| 8658 | 0x4e, 0xc4, 0x00, 0x6f, 0x64, 0x4e, 0xc6, 0x00, | 8658 | 0x35, 0xb0, 0x00, 0x6f, 0x5b, 0x4e, 0xc4, 0x00, |
| 8659 | 0x6f, 0x6e, 0x0b, 0xc8, 0x00, 0x6f, 0x74, 0x4e, | 8659 | 0x6f, 0x64, 0x4e, 0xc6, 0x00, 0x6f, 0x6e, 0x0b, |
| 8660 | 0xc7, 0x00, 0x6f, 0x98, 0x37, 0x47, 0x00, 0x6f, | 8660 | 0xc8, 0x00, 0x6f, 0x74, 0x4e, 0xc7, 0x00, 0x6f, |
| 8661 | 0xef, 0x1e, 0x33, 0x00, 0x6f, 0xf9, 0x39, 0x95, | 8661 | 0x98, 0x37, 0x47, 0x00, 0x6f, 0xef, 0x1e, 0x33, |
| 8662 | 0x00, 0x70, 0x15, 0x1e, 0x6b, 0x00, 0x70, 0x1b, | 8662 | 0x00, 0x6f, 0xf9, 0x39, 0x95, 0x00, 0x70, 0x15, |
| 8663 | 0x37, 0x4a, 0x00, 0x70, 0x1e, 0x1e, 0x51, 0x00, | 8663 | 0x1e, 0x6b, 0x00, 0x70, 0x1b, 0x37, 0x4a, 0x00, |
| 8664 | 0x70, 0x26, 0x1e, 0x3d, 0x00, 0x70, 0x27, 0x36, | 8664 | 0x70, 0x1e, 0x1e, 0x51, 0x00, 0x70, 0x26, 0x1e, |
| 8665 | 0x57, 0x00, 0x70, 0x4a, 0x39, 0x98, 0x00, 0x70, | 8665 | 0x3d, 0x00, 0x70, 0x27, 0x36, 0x57, 0x00, 0x70, |
| 8666 | 0x58, 0x1e, 0x57, 0x00, 0x70, 0x70, 0x35, 0x6a, | 8666 | 0x4a, 0x39, 0x98, 0x00, 0x70, 0x58, 0x1e, 0x57, |
| 8667 | 0x00, 0x70, 0x78, 0x4f, 0x2e, 0x00, 0x70, 0x7c, | 8667 | 0x00, 0x70, 0x70, 0x35, 0x6a, 0x00, 0x70, 0x78, |
| 8668 | 0x1e, 0x10, 0x00, 0x70, 0xad, 0x36, 0x5c, 0x00, | 8668 | 0x4f, 0x2e, 0x00, 0x70, 0x7c, 0x1e, 0x10, 0x00, |
| 8669 | 0x71, 0x49, 0x0f, 0xc3, 0x00, 0x71, 0x4e, 0x1e, | 8669 | 0x70, 0xad, 0x36, 0x5c, 0x00, 0x71, 0x49, 0x0f, |
| 8670 | 0x26, 0x00, 0x71, 0x52, 0x55, 0xad, 0x00, 0x71, | 8670 | 0xc3, 0x00, 0x71, 0x4e, 0x1e, 0x26, 0x00, 0x71, |
| 8671 | 0x59, 0x35, 0x59, 0x00, 0x71, 0x62, 0x37, 0x4b, | 8671 | 0x52, 0x55, 0xad, 0x00, 0x71, 0x59, 0x35, 0x59, |
| 8672 | 0x00, 0x71, 0x6e, 0x08, 0xfd, 0x00, 0x71, 0x7d, | 8672 | 0x00, 0x71, 0x62, 0x37, 0x4b, 0x00, 0x71, 0x6e, |
| 8673 | 0x1e, 0x27, 0x00, 0x71, 0x94, 0x1e, 0x7d, 0x00, | 8673 | 0x08, 0xfd, 0x00, 0x71, 0x7d, 0x1e, 0x27, 0x00, |
| 8674 | 0x71, 0xb3, 0x39, 0xae, 0x00, 0x71, 0xd0, 0x37, | 8674 | 0x71, 0x94, 0x1e, 0x7d, 0x00, 0x71, 0xb3, 0x39, |
| 8675 | 0x0a, 0x00, 0x71, 0xff, 0x34, 0xfa, 0x00, 0x72, | 8675 | 0xae, 0x00, 0x71, 0xd0, 0x37, 0x0a, 0x00, 0x71, |
| 8676 | 0x28, 0x15, 0xdf, 0x00, 0x72, 0x2b, 0x3c, 0x26, | 8676 | 0xff, 0x34, 0xfa, 0x00, 0x72, 0x28, 0x15, 0xdf, |
| 8677 | 0x00, 0x72, 0x35, 0x09, 0x0b, 0x00, 0x72, 0x36, | 8677 | 0x00, 0x72, 0x2b, 0x3c, 0x26, 0x00, 0x72, 0x35, |
| 8678 | 0x34, 0xb9, 0x00, 0x72, 0x3a, 0x4f, 0x46, 0x00, | 8678 | 0x09, 0x0b, 0x00, 0x72, 0x36, 0x34, 0xb9, 0x00, |
| 8679 | 0x72, 0x3b, 0x37, 0x4c, 0x00, 0x72, 0x3e, 0x4e, | 8679 | 0x72, 0x3a, 0x4f, 0x46, 0x00, 0x72, 0x3b, 0x37, |
| 8680 | 0xc9, 0x00, 0x72, 0x4c, 0x1e, 0x5b, 0x00, 0x72, | 8680 | 0x4c, 0x00, 0x72, 0x3e, 0x4e, 0xc9, 0x00, 0x72, |
| 8681 | 0x59, 0x1f, 0x1d, 0x00, 0x72, 0xe1, 0x4f, 0x36, | 8681 | 0x4c, 0x1e, 0x5b, 0x00, 0x72, 0x59, 0x1f, 0x1d, |
| 8682 | 0x00, 0x73, 0x1c, 0x37, 0x4e, 0x00, 0x73, 0x2a, | 8682 | 0x00, 0x72, 0xe1, 0x4f, 0x36, 0x00, 0x73, 0x1c, |
| 8683 | 0x0b, 0xb4, 0x00, 0x73, 0x36, 0x36, 0xf8, 0x00, | 8683 | 0x37, 0x4e, 0x00, 0x73, 0x2a, 0x0b, 0xb4, 0x00, |
| 8684 | 0x73, 0x37, 0x1e, 0x7c, 0x00, 0x73, 0x87, 0x37, | 8684 | 0x73, 0x36, 0x36, 0xf8, 0x00, 0x73, 0x37, 0x1e, |
| 8685 | 0x05, 0x00, 0x73, 0x8b, 0x35, 0xa1, 0x00, 0x73, | 8685 | 0x7c, 0x00, 0x73, 0x87, 0x37, 0x05, 0x00, 0x73, |
| 8686 | 0xca, 0x1e, 0x0b, 0x00, 0x73, 0xce, 0x1e, 0xa0, | 8686 | 0x8b, 0x35, 0xa1, 0x00, 0x73, 0xca, 0x1e, 0x0b, |
| 8687 | 0x00, 0x73, 0xe5, 0x34, 0xfb, 0x00, 0x73, 0xed, | 8687 | 0x00, 0x73, 0xce, 0x1e, 0xa0, 0x00, 0x73, 0xe5, |
| 8688 | 0x34, 0xb1, 0x00, 0x74, 0x22, 0x0b, 0x56, 0x00, | 8688 | 0x34, 0xfb, 0x00, 0x73, 0xed, 0x34, 0xb1, 0x00, |
| 8689 | 0x74, 0x32, 0x34, 0xfc, 0x00, 0x74, 0x5f, 0x34, | 8689 | 0x74, 0x22, 0x0b, 0x56, 0x00, 0x74, 0x32, 0x34, |
| 8690 | 0xfd, 0x00, 0x74, 0x62, 0x21, 0x71, 0x00, 0x74, | 8690 | 0xfc, 0x00, 0x74, 0x5f, 0x34, 0xfd, 0x00, 0x74, |
| 8691 | 0xb0, 0x35, 0x79, 0x00, 0x74, 0xbd, 0x4e, 0xcd, | 8691 | 0x62, 0x21, 0x71, 0x00, 0x74, 0xb0, 0x35, 0x79, |
| 8692 | 0x00, 0x74, 0xca, 0x37, 0x4f, 0x00, 0x74, 0xd8, | 8692 | 0x00, 0x74, 0xbd, 0x4e, 0xcd, 0x00, 0x74, 0xca, |
| 8693 | 0x55, 0xf6, 0x00, 0x74, 0xdc, 0x35, 0x50, 0x00, | 8693 | 0x37, 0x4f, 0x00, 0x74, 0xd8, 0x55, 0xf6, 0x00, |
| 8694 | 0x74, 0xe0, 0x34, 0xfe, 0x00, 0x74, 0xef, 0x55, | 8694 | 0x74, 0xdc, 0x35, 0x50, 0x00, 0x74, 0xe0, 0x34, |
| 8695 | 0xfa, 0x00, 0x75, 0x04, 0x1e, 0xa1, 0x00, 0x75, | 8695 | 0xfe, 0x00, 0x74, 0xef, 0x55, 0xfa, 0x00, 0x75, |
| 8696 | 0x0c, 0x34, 0xff, 0x00, 0x75, 0x0d, 0x1e, 0xa2, | 8696 | 0x04, 0x1e, 0xa1, 0x00, 0x75, 0x0c, 0x34, 0xff, |
| 8697 | 0x00, 0x75, 0x11, 0x1e, 0x04, 0x00, 0x75, 0x15, | 8697 | 0x00, 0x75, 0x0d, 0x1e, 0xa2, 0x00, 0x75, 0x11, |
| 8698 | 0x1e, 0xa3, 0x00, 0x75, 0x26, 0x4f, 0x3b, 0x00, | 8698 | 0x1e, 0x04, 0x00, 0x75, 0x15, 0x1e, 0xa3, 0x00, |
| 8699 | 0x75, 0x54, 0x36, 0xa4, 0x00, 0x75, 0x5d, 0x4e, | 8699 | 0x75, 0x26, 0x4f, 0x3b, 0x00, 0x75, 0x54, 0x36, |
| 8700 | 0xce, 0x00, 0x75, 0xbc, 0x4e, 0xcf, 0x00, 0x75, | 8700 | 0xa4, 0x00, 0x75, 0x5d, 0x4e, 0xce, 0x00, 0x75, |
| 8701 | 0xc5, 0x36, 0xb1, 0x00, 0x76, 0x08, 0x4e, 0xd1, | 8701 | 0xbc, 0x4e, 0xcf, 0x00, 0x75, 0xc5, 0x36, 0xb1, |
| 8702 | 0x00, 0x76, 0x26, 0x1e, 0x2d, 0x00, 0x76, 0x52, | 8702 | 0x00, 0x76, 0x08, 0x4e, 0xd1, 0x00, 0x76, 0x26, |
| 8703 | 0x1e, 0x7b, 0x00, 0x76, 0x64, 0x4e, 0xd2, 0x00, | 8703 | 0x1e, 0x2d, 0x00, 0x76, 0x52, 0x1e, 0x7b, 0x00, |
| 8704 | 0x76, 0x69, 0x4e, 0xd3, 0x00, 0x76, 0x72, 0x35, | 8704 | 0x76, 0x64, 0x4e, 0xd2, 0x00, 0x76, 0x69, 0x4e, |
| 8705 | 0x00, 0x00, 0x76, 0x84, 0x36, 0x79, 0x00, 0x76, | 8705 | 0xd3, 0x00, 0x76, 0x72, 0x35, 0x00, 0x00, 0x76, |
| 8706 | 0x93, 0x1e, 0xa4, 0x00, 0x76, 0xc6, 0x34, 0xc4, | 8706 | 0x84, 0x36, 0x79, 0x00, 0x76, 0x93, 0x1e, 0xa4, |
| 8707 | 0x00, 0x76, 0xca, 0x21, 0x7b, 0x00, 0x76, 0xd4, | 8707 | 0x00, 0x76, 0xc6, 0x34, 0xc4, 0x00, 0x76, 0xca, |
| 8708 | 0x56, 0x1d, 0x00, 0x76, 0xdb, 0x36, 0x2c, 0x00, | 8708 | 0x21, 0x7b, 0x00, 0x76, 0xd4, 0x56, 0x1d, 0x00, |
| 8709 | 0x76, 0xdf, 0x36, 0xe5, 0x00, 0x76, 0xf2, 0x36, | 8709 | 0x76, 0xdb, 0x36, 0x2c, 0x00, 0x76, 0xdf, 0x36, |
| 8710 | 0xe9, 0x00, 0x76, 0xf4, 0x36, 0x6e, 0x00, 0x77, | 8710 | 0xe5, 0x00, 0x76, 0xf2, 0x36, 0xe9, 0x00, 0x76, |
| 8711 | 0x1e, 0x16, 0xb8, 0x00, 0x77, 0x1f, 0x36, 0x1e, | 8711 | 0xf4, 0x36, 0x6e, 0x00, 0x77, 0x1e, 0x16, 0xb8, |
| 8712 | 0x00, 0x77, 0x37, 0x4e, 0xd5, 0x00, 0x77, 0x3a, | 8712 | 0x00, 0x77, 0x1f, 0x36, 0x1e, 0x00, 0x77, 0x37, |
| 8713 | 0x34, 0xa6, 0x00, 0x77, 0x7e, 0x4e, 0xd6, 0x00, | 8713 | 0x4e, 0xd5, 0x00, 0x77, 0x3a, 0x34, 0xa6, 0x00, |
| 8714 | 0x77, 0x8d, 0x56, 0x2e, 0x00, 0x77, 0xa2, 0x56, | 8714 | 0x77, 0x7e, 0x4e, 0xd6, 0x00, 0x77, 0x8d, 0x56, |
| 8715 | 0x2f, 0x00, 0x77, 0xa5, 0x1e, 0x6e, 0x00, 0x77, | 8715 | 0x2e, 0x00, 0x77, 0xa2, 0x56, 0x2f, 0x00, 0x77, |
| 8716 | 0xac, 0x34, 0x92, 0x00, 0x77, 0xe9, 0x35, 0xa4, | 8716 | 0xa5, 0x1e, 0x6e, 0x00, 0x77, 0xac, 0x34, 0x92, |
| 8717 | 0x00, 0x78, 0x32, 0x36, 0xc7, 0x00, 0x78, 0x3a, | 8717 | 0x00, 0x77, 0xe9, 0x35, 0xa4, 0x00, 0x78, 0x32, |
| 8718 | 0x36, 0x7f, 0x00, 0x78, 0x5d, 0x36, 0x0d, 0x00, | 8718 | 0x36, 0xc7, 0x00, 0x78, 0x3a, 0x36, 0x7f, 0x00, |
| 8719 | 0x78, 0x6c, 0x34, 0x83, 0x00, 0x78, 0x7c, 0x1e, | 8719 | 0x78, 0x5d, 0x36, 0x0d, 0x00, 0x78, 0x6c, 0x34, |
| 8720 | 0xa5, 0x00, 0x78, 0x91, 0x0d, 0x7e, 0x00, 0x78, | 8720 | 0x83, 0x00, 0x78, 0x7c, 0x1e, 0xa5, 0x00, 0x78, |
| 8721 | 0xd4, 0x35, 0x02, 0x00, 0x78, 0xe8, 0x36, 0xda, | 8721 | 0x91, 0x0d, 0x7e, 0x00, 0x78, 0xd4, 0x35, 0x02, |
| 8722 | 0x00, 0x78, 0xef, 0x35, 0x4b, 0x00, 0x79, 0x2a, | 8722 | 0x00, 0x78, 0xe8, 0x36, 0xda, 0x00, 0x78, 0xef, |
| 8723 | 0x35, 0x01, 0x00, 0x79, 0x34, 0x3a, 0x38, 0x00, | 8723 | 0x35, 0x4b, 0x00, 0x79, 0x2a, 0x35, 0x01, 0x00, |
| 8724 | 0x79, 0x3a, 0x08, 0xd4, 0x00, 0x79, 0x3c, 0x21, | 8724 | 0x79, 0x34, 0x3a, 0x38, 0x00, 0x79, 0x3a, 0x08, |
| 8725 | 0x83, 0x00, 0x79, 0x3e, 0x34, 0x24, 0x00, 0x79, | 8725 | 0xd4, 0x00, 0x79, 0x3c, 0x21, 0x83, 0x00, 0x79, |
| 8726 | 0x40, 0x37, 0x57, 0x00, 0x79, 0x41, 0x1d, 0xf4, | 8726 | 0x3e, 0x34, 0x24, 0x00, 0x79, 0x40, 0x37, 0x57, |
| 8727 | 0x00, 0x79, 0x47, 0x1d, 0xeb, 0x00, 0x79, 0x48, | 8727 | 0x00, 0x79, 0x41, 0x1d, 0xf4, 0x00, 0x79, 0x47, |
| 8728 | 0x06, 0x41, 0x00, 0x79, 0x49, 0x34, 0x21, 0x00, | 8728 | 0x1d, 0xeb, 0x00, 0x79, 0x48, 0x06, 0x41, 0x00, |
| 8729 | 0x79, 0x50, 0x0f, 0x1e, 0x00, 0x79, 0x53, 0x37, | 8729 | 0x79, 0x49, 0x34, 0x21, 0x00, 0x79, 0x50, 0x0f, |
| 8730 | 0x58, 0x00, 0x79, 0x56, 0x34, 0x2f, 0x00, 0x79, | 8730 | 0x1e, 0x00, 0x79, 0x53, 0x37, 0x58, 0x00, 0x79, |
| 8731 | 0x5d, 0x09, 0x55, 0x00, 0x79, 0x5e, 0x0a, 0x06, | 8731 | 0x56, 0x34, 0x2f, 0x00, 0x79, 0x5d, 0x09, 0x55, |
| 8732 | 0x00, 0x79, 0x62, 0x1f, 0x29, 0x00, 0x79, 0x65, | 8732 | 0x00, 0x79, 0x5e, 0x0a, 0x06, 0x00, 0x79, 0x62, |
| 8733 | 0x09, 0xb5, 0x00, 0x79, 0x8d, 0x05, 0x52, 0x00, | 8733 | 0x1f, 0x29, 0x00, 0x79, 0x65, 0x09, 0xb5, 0x00, |
| 8734 | 0x79, 0x8e, 0x34, 0x3b, 0x00, 0x79, 0x8f, 0x21, | 8734 | 0x79, 0x8d, 0x05, 0x52, 0x00, 0x79, 0x8e, 0x34, |
| 8735 | 0x87, 0x00, 0x79, 0xa7, 0x4e, 0xd7, 0x00, 0x79, | 8735 | 0x3b, 0x00, 0x79, 0x8f, 0x21, 0x87, 0x00, 0x79, |
| 8736 | 0xae, 0x37, 0x5b, 0x00, 0x79, 0xb0, 0x1e, 0x59, | 8736 | 0xa7, 0x4e, 0xd7, 0x00, 0x79, 0xae, 0x37, 0x5b, |
| 8737 | 0x00, 0x79, 0xb1, 0x4e, 0xd8, 0x00, 0x79, 0xba, | 8737 | 0x00, 0x79, 0xb0, 0x1e, 0x59, 0x00, 0x79, 0xb1, |
| 8738 | 0x35, 0x03, 0x00, 0x79, 0xe4, 0x1e, 0x5d, 0x00, | 8738 | 0x4e, 0xd8, 0x00, 0x79, 0xba, 0x35, 0x03, 0x00, |
| 8739 | 0x7a, 0x0b, 0x36, 0x78, 0x00, 0x7a, 0x17, 0x1e, | 8739 | 0x79, 0xe4, 0x1e, 0x5d, 0x00, 0x7a, 0x0b, 0x36, |
| 8740 | 0x66, 0x00, 0x7a, 0x19, 0x35, 0x04, 0x00, 0x7a, | 8740 | 0x78, 0x00, 0x7a, 0x17, 0x1e, 0x66, 0x00, 0x7a, |
| 8741 | 0x31, 0x1e, 0xa6, 0x00, 0x7a, 0x40, 0x08, 0x04, | 8741 | 0x19, 0x35, 0x04, 0x00, 0x7a, 0x31, 0x1e, 0xa6, |
| 8742 | 0x00, 0x7a, 0x60, 0x3a, 0x4e, 0x00, 0x7a, 0x74, | 8742 | 0x00, 0x7a, 0x40, 0x08, 0x04, 0x00, 0x7a, 0x60, |
| 8743 | 0x34, 0x7a, 0x00, 0x7a, 0x7a, 0x35, 0xa7, 0x00, | 8743 | 0x3a, 0x4e, 0x00, 0x7a, 0x74, 0x34, 0x7a, 0x00, |
| 8744 | 0x7a, 0x7f, 0x1f, 0x25, 0x00, 0x7a, 0x81, 0x34, | 8744 | 0x7a, 0x7a, 0x35, 0xa7, 0x00, 0x7a, 0x7f, 0x1f, |
| 8745 | 0x3d, 0x00, 0x7a, 0x95, 0x35, 0x05, 0x00, 0x7a, | 8745 | 0x25, 0x00, 0x7a, 0x81, 0x34, 0x3d, 0x00, 0x7a, |
| 8746 | 0x97, 0x1f, 0x3c, 0x00, 0x7a, 0xae, 0x34, 0x77, | 8746 | 0x95, 0x35, 0x05, 0x00, 0x7a, 0x97, 0x1f, 0x3c, |
| 8747 | 0x00, 0x7a, 0xbe, 0x4e, 0xd9, 0x00, 0x7a, 0xc6, | 8747 | 0x00, 0x7a, 0xae, 0x34, 0x77, 0x00, 0x7a, 0xbe, |
| 8748 | 0x3c, 0x27, 0x00, 0x7a, 0xc8, 0x4f, 0x3d, 0x00, | 8748 | 0x4e, 0xd9, 0x00, 0x7a, 0xc6, 0x3c, 0x27, 0x00, |
| 8749 | 0x7b, 0x08, 0x1f, 0x1f, 0x00, 0x7b, 0x51, 0x36, | 8749 | 0x7a, 0xc8, 0x4f, 0x3d, 0x00, 0x7b, 0x08, 0x1f, |
| 8750 | 0x63, 0x00, 0x7b, 0x75, 0x4f, 0x2a, 0x00, 0x7b, | 8750 | 0x1f, 0x00, 0x7b, 0x51, 0x36, 0x63, 0x00, 0x7b, |
| 8751 | 0x99, 0x1e, 0xa8, 0x00, 0x7b, 0xad, 0x1f, 0x26, | 8751 | 0x75, 0x4f, 0x2a, 0x00, 0x7b, 0x99, 0x1e, 0xa8, |
| 8752 | 0x00, 0x7b, 0xb8, 0x1e, 0x5f, 0x00, 0x7b, 0xc0, | 8752 | 0x00, 0x7b, 0xad, 0x1f, 0x26, 0x00, 0x7b, 0xb8, |
| 8753 | 0x34, 0x2e, 0x00, 0x7b, 0xc7, 0x1f, 0x2b, 0x00, | 8753 | 0x1e, 0x5f, 0x00, 0x7b, 0xc0, 0x34, 0x2e, 0x00, |
| 8754 | 0x7b, 0xc9, 0x36, 0x61, 0x00, 0x7b, 0xdd, 0x1f, | 8754 | 0x7b, 0xc7, 0x1f, 0x2b, 0x00, 0x7b, 0xc9, 0x36, |
| 8755 | 0x3d, 0x00, 0x7b, 0xe0, 0x4e, 0xda, 0x00, 0x7c, | 8755 | 0x61, 0x00, 0x7b, 0xdd, 0x1f, 0x3d, 0x00, 0x7b, |
| 8756 | 0x14, 0x37, 0x5f, 0x00, 0x7c, 0x3e, 0x1f, 0x2d, | 8756 | 0xe0, 0x4e, 0xda, 0x00, 0x7c, 0x14, 0x37, 0x5f, |
| 8757 | 0x00, 0x7c, 0x3f, 0x36, 0xc2, 0x00, 0x7c, 0x4d, | 8757 | 0x00, 0x7c, 0x3e, 0x1f, 0x2d, 0x00, 0x7c, 0x3f, |
| 8758 | 0x36, 0x36, 0x00, 0x7c, 0x50, 0x37, 0x61, 0x00, | 8758 | 0x36, 0xc2, 0x00, 0x7c, 0x4d, 0x36, 0x36, 0x00, |
| 8759 | 0x7c, 0x58, 0x37, 0x62, 0x00, 0x7c, 0x69, 0x56, | 8759 | 0x7c, 0x50, 0x37, 0x61, 0x00, 0x7c, 0x58, 0x37, |
| 8760 | 0xaa, 0x00, 0x7c, 0x7e, 0x1e, 0x78, 0x00, 0x7c, | 8760 | 0x62, 0x00, 0x7c, 0x69, 0x56, 0xaa, 0x00, 0x7c, |
| 8761 | 0x82, 0x4f, 0x30, 0x00, 0x7c, 0x89, 0x34, 0xbe, | 8761 | 0x7e, 0x1e, 0x78, 0x00, 0x7c, 0x82, 0x4f, 0x30, |
| 8762 | 0x00, 0x7c, 0x90, 0x1e, 0xa9, 0x00, 0x7c, 0xae, | 8762 | 0x00, 0x7c, 0x89, 0x34, 0xbe, 0x00, 0x7c, 0x90, |
| 8763 | 0x1e, 0xaa, 0x00, 0x7c, 0xbe, 0x0a, 0x5e, 0x00, | 8763 | 0x1e, 0xa9, 0x00, 0x7c, 0xae, 0x1e, 0xaa, 0x00, |
| 8764 | 0x7c, 0xd6, 0x0c, 0x76, 0x00, 0x7c, 0xf2, 0x35, | 8764 | 0x7c, 0xbe, 0x0a, 0x5e, 0x00, 0x7c, 0xd6, 0x0c, |
| 8765 | 0x06, 0x00, 0x7d, 0x04, 0x36, 0xee, 0x00, 0x7d, | 8765 | 0x76, 0x00, 0x7c, 0xf2, 0x35, 0x06, 0x00, 0x7d, |
| 8766 | 0x09, 0x4e, 0xdc, 0x00, 0x7d, 0x0b, 0x36, 0xec, | 8766 | 0x04, 0x36, 0xee, 0x00, 0x7d, 0x09, 0x4e, 0xdc, |
| 8767 | 0x00, 0x7d, 0x0d, 0x36, 0x94, 0x00, 0x7d, 0x1a, | 8767 | 0x00, 0x7d, 0x0b, 0x36, 0xec, 0x00, 0x7d, 0x0d, |
| 8768 | 0x35, 0x91, 0x00, 0x7d, 0x1b, 0x34, 0xbf, 0x00, | 8768 | 0x36, 0x94, 0x00, 0x7d, 0x1a, 0x35, 0x91, 0x00, |
| 8769 | 0x7d, 0x42, 0x35, 0xf8, 0x00, 0x7d, 0x46, 0x37, | 8769 | 0x7d, 0x1b, 0x34, 0xbf, 0x00, 0x7d, 0x42, 0x35, |
| 8770 | 0x63, 0x00, 0x7d, 0x5c, 0x21, 0x90, 0x00, 0x7d, | 8770 | 0xf8, 0x00, 0x7d, 0x46, 0x37, 0x63, 0x00, 0x7d, |
| 8771 | 0x5e, 0x34, 0x84, 0x00, 0x7d, 0x63, 0x37, 0x64, | 8771 | 0x5c, 0x21, 0x90, 0x00, 0x7d, 0x5e, 0x34, 0x84, |
| 8772 | 0x00, 0x7d, 0x73, 0x35, 0x07, 0x00, 0x7d, 0x9b, | 8772 | 0x00, 0x7d, 0x63, 0x37, 0x64, 0x00, 0x7d, 0x73, |
| 8773 | 0x1e, 0xab, 0x00, 0x7d, 0x9f, 0x1e, 0xad, 0x00, | 8773 | 0x35, 0x07, 0x00, 0x7d, 0x9b, 0x1e, 0xab, 0x00, |
| 8774 | 0x7d, 0xae, 0x1e, 0xac, 0x00, 0x7d, 0xb2, 0x4e, | 8774 | 0x7d, 0x9f, 0x1e, 0xad, 0x00, 0x7d, 0xae, 0x1e, |
| 8775 | 0xdd, 0x00, 0x7d, 0xcb, 0x34, 0xb6, 0x00, 0x7d, | 8775 | 0xac, 0x00, 0x7d, 0xb2, 0x4e, 0xdd, 0x00, 0x7d, |
| 8776 | 0xcf, 0x34, 0xa0, 0x00, 0x7d, 0xdd, 0x35, 0x08, | 8776 | 0xcb, 0x34, 0xb6, 0x00, 0x7d, 0xcf, 0x34, 0xa0, |
| 8777 | 0x00, 0x7d, 0xe8, 0x36, 0xbf, 0x00, 0x7d, 0xe9, | 8777 | 0x00, 0x7d, 0xdd, 0x35, 0x08, 0x00, 0x7d, 0xe8, |
| 8778 | 0x35, 0x7a, 0x00, 0x7d, 0xef, 0x34, 0x62, 0x00, | 8778 | 0x36, 0xbf, 0x00, 0x7d, 0xe9, 0x35, 0x7a, 0x00, |
| 8779 | 0x7d, 0xf4, 0x0f, 0xc5, 0x00, 0x7e, 0x09, 0x47, | 8779 | 0x7d, 0xef, 0x34, 0x62, 0x00, 0x7d, 0xf4, 0x0f, |
| 8780 | 0xbe, 0x00, 0x7e, 0x1b, 0x36, 0x9b, 0x00, 0x7e, | 8780 | 0xc5, 0x00, 0x7e, 0x09, 0x47, 0xbe, 0x00, 0x7e, |
| 8781 | 0x22, 0x37, 0x65, 0x00, 0x7e, 0x2b, 0x36, 0xc8, | 8781 | 0x1b, 0x36, 0x9b, 0x00, 0x7e, 0x22, 0x37, 0x65, |
| 8782 | 0x00, 0x7e, 0x35, 0x35, 0x09, 0x00, 0x7e, 0x41, | 8782 | 0x00, 0x7e, 0x2b, 0x36, 0xc8, 0x00, 0x7e, 0x35, |
| 8783 | 0x34, 0x40, 0x00, 0x7e, 0x43, 0x37, 0x69, 0x00, | 8783 | 0x35, 0x09, 0x00, 0x7e, 0x41, 0x34, 0x40, 0x00, |
| 8784 | 0x7e, 0x6d, 0x36, 0xe1, 0x00, 0x7e, 0x8c, 0x37, | 8784 | 0x7e, 0x43, 0x37, 0x69, 0x00, 0x7e, 0x6d, 0x36, |
| 8785 | 0x6a, 0x00, 0x7f, 0x3e, 0x4e, 0xdf, 0x00, 0x7f, | 8785 | 0xe1, 0x00, 0x7e, 0x8c, 0x37, 0x6a, 0x00, 0x7f, |
| 8786 | 0x50, 0x37, 0x6b, 0x00, 0x7f, 0x61, 0x3c, 0x28, | 8786 | 0x3e, 0x4e, 0xdf, 0x00, 0x7f, 0x50, 0x37, 0x6b, |
| 8787 | 0x00, 0x7f, 0x6a, 0x34, 0x89, 0x00, 0x7f, 0x6e, | 8787 | 0x00, 0x7f, 0x61, 0x3c, 0x28, 0x00, 0x7f, 0x6a, |
| 8788 | 0x36, 0x60, 0x00, 0x7f, 0x72, 0x09, 0x7a, 0x00, | 8788 | 0x34, 0x89, 0x00, 0x7f, 0x6e, 0x36, 0x60, 0x00, |
| 8789 | 0x7f, 0x80, 0x56, 0xda, 0x00, 0x7f, 0x8a, 0x0f, | 8789 | 0x7f, 0x72, 0x09, 0x7a, 0x00, 0x7f, 0x80, 0x56, |
| 8790 | 0x3d, 0x00, 0x7f, 0xa1, 0x36, 0x3d, 0x00, 0x7f, | 8790 | 0xda, 0x00, 0x7f, 0x8a, 0x0f, 0x3d, 0x00, 0x7f, |
| 8791 | 0xae, 0x35, 0x0a, 0x00, 0x7f, 0xbd, 0x04, 0xcb, | 8791 | 0xa1, 0x36, 0x3d, 0x00, 0x7f, 0xae, 0x35, 0x0a, |
| 8792 | 0x00, 0x7f, 0xc1, 0x34, 0x6a, 0x00, 0x7f, 0xc5, | 8792 | 0x00, 0x7f, 0xbd, 0x04, 0xcb, 0x00, 0x7f, 0xc1, |
| 8793 | 0x37, 0x6f, 0x00, 0x7f, 0xc6, 0x37, 0x70, 0x00, | 8793 | 0x34, 0x6a, 0x00, 0x7f, 0xc5, 0x37, 0x6f, 0x00, |
| 8794 | 0x7f, 0xcc, 0x37, 0x01, 0x00, 0x7f, 0xd2, 0x35, | 8794 | 0x7f, 0xc6, 0x37, 0x70, 0x00, 0x7f, 0xcc, 0x37, |
| 8795 | 0xf9, 0x00, 0x7f, 0xd4, 0x1e, 0xae, 0x00, 0x7f, | 8795 | 0x01, 0x00, 0x7f, 0xd2, 0x35, 0xf9, 0x00, 0x7f, |
| 8796 | 0xe0, 0x1e, 0x20, 0x00, 0x7f, 0xe1, 0x35, 0x0b, | 8796 | 0xd4, 0x1e, 0xae, 0x00, 0x7f, 0xe0, 0x1e, 0x20, |
| 8797 | 0x00, 0x7f, 0xe9, 0x1f, 0x3e, 0x00, 0x7f, 0xeb, | 8797 | 0x00, 0x7f, 0xe1, 0x35, 0x0b, 0x00, 0x7f, 0xe9, |
| 8798 | 0x1d, 0xe9, 0x00, 0x7f, 0xf0, 0x1d, 0xe8, 0x00, | 8798 | 0x1f, 0x3e, 0x00, 0x7f, 0xeb, 0x1d, 0xe9, 0x00, |
| 8799 | 0x7f, 0xfb, 0x36, 0xd8, 0x00, 0x7f, 0xfc, 0x34, | 8799 | 0x7f, 0xf0, 0x1d, 0xe8, 0x00, 0x7f, 0xfb, 0x36, |
| 8800 | 0xc8, 0x00, 0x80, 0x00, 0x1e, 0x7e, 0x00, 0x80, | 8800 | 0xd8, 0x00, 0x7f, 0xfc, 0x34, 0xc8, 0x00, 0x80, |
| 8801 | 0x03, 0x34, 0x85, 0x00, 0x80, 0x05, 0x34, 0x25, | 8801 | 0x00, 0x1e, 0x7e, 0x00, 0x80, 0x03, 0x34, 0x85, |
| 8802 | 0x00, 0x80, 0x12, 0x4e, 0xe1, 0x00, 0x80, 0x15, | 8802 | 0x00, 0x80, 0x05, 0x34, 0x25, 0x00, 0x80, 0x12, |
| 8803 | 0x35, 0xca, 0x00, 0x80, 0x17, 0x36, 0xea, 0x00, | 8803 | 0x4e, 0xe1, 0x00, 0x80, 0x15, 0x35, 0xca, 0x00, |
| 8804 | 0x80, 0x36, 0x34, 0xc7, 0x00, 0x80, 0x56, 0x36, | 8804 | 0x80, 0x17, 0x36, 0xea, 0x00, 0x80, 0x36, 0x34, |
| 8805 | 0x2d, 0x00, 0x80, 0x5a, 0x35, 0x0c, 0x00, 0x80, | 8805 | 0xc7, 0x00, 0x80, 0x56, 0x36, 0x2d, 0x00, 0x80, |
| 8806 | 0x5f, 0x35, 0x0d, 0x00, 0x80, 0x61, 0x34, 0xa1, | 8806 | 0x5a, 0x35, 0x0c, 0x00, 0x80, 0x5f, 0x35, 0x0d, |
| 8807 | 0x00, 0x80, 0x6f, 0x34, 0xcd, 0x00, 0x80, 0x70, | 8807 | 0x00, 0x80, 0x61, 0x34, 0xa1, 0x00, 0x80, 0x6f, |
| 8808 | 0x35, 0x0f, 0x00, 0x80, 0x71, 0x3c, 0x29, 0x00, | 8808 | 0x34, 0xcd, 0x00, 0x80, 0x70, 0x35, 0x0f, 0x00, |
| 8809 | 0x80, 0x73, 0x35, 0x0e, 0x00, 0x80, 0x74, 0x34, | 8809 | 0x80, 0x71, 0x3c, 0x29, 0x00, 0x80, 0x73, 0x35, |
| 8810 | 0xa7, 0x00, 0x80, 0x76, 0x35, 0x10, 0x00, 0x80, | 8810 | 0x0e, 0x00, 0x80, 0x74, 0x34, 0xa7, 0x00, 0x80, |
| 8811 | 0x77, 0x34, 0x9a, 0x00, 0x80, 0x7e, 0x34, 0xce, | 8811 | 0x76, 0x35, 0x10, 0x00, 0x80, 0x77, 0x34, 0x9a, |
| 8812 | 0x00, 0x80, 0x87, 0x36, 0x9c, 0x00, 0x80, 0x89, | 8812 | 0x00, 0x80, 0x7e, 0x34, 0xce, 0x00, 0x80, 0x87, |
| 8813 | 0x36, 0x8f, 0x00, 0x80, 0x96, 0x36, 0x0e, 0x00, | 8813 | 0x36, 0x9c, 0x00, 0x80, 0x89, 0x36, 0x8f, 0x00, |
| 8814 | 0x80, 0x9e, 0x3c, 0x2a, 0x00, 0x80, 0xa9, 0x35, | 8814 | 0x80, 0x96, 0x36, 0x0e, 0x00, 0x80, 0x9e, 0x3c, |
| 8815 | 0xb8, 0x00, 0x80, 0xba, 0x36, 0x97, 0x00, 0x80, | 8815 | 0x2a, 0x00, 0x80, 0xa9, 0x35, 0xb8, 0x00, 0x80, |
| 8816 | 0xd6, 0x4e, 0xe3, 0x00, 0x80, 0xde, 0x36, 0xc9, | 8816 | 0xba, 0x36, 0x97, 0x00, 0x80, 0xd6, 0x4e, 0xe3, |
| 8817 | 0x00, 0x81, 0x06, 0x36, 0x34, 0x00, 0x81, 0x08, | 8817 | 0x00, 0x80, 0xde, 0x36, 0xc9, 0x00, 0x81, 0x06, |
| 8818 | 0x34, 0xc6, 0x00, 0x81, 0x09, 0x4e, 0xe4, 0x00, | 8818 | 0x36, 0x34, 0x00, 0x81, 0x08, 0x34, 0xc6, 0x00, |
| 8819 | 0x81, 0x29, 0x4e, 0xe5, 0x00, 0x81, 0x53, 0x35, | 8819 | 0x81, 0x09, 0x4e, 0xe4, 0x00, 0x81, 0x29, 0x4e, |
| 8820 | 0x11, 0x00, 0x81, 0x54, 0x35, 0xcb, 0x00, 0x81, | 8820 | 0xe5, 0x00, 0x81, 0x53, 0x35, 0x11, 0x00, 0x81, |
| 8821 | 0x70, 0x35, 0xd1, 0x00, 0x81, 0x71, 0x4f, 0x33, | 8821 | 0x54, 0x35, 0xcb, 0x00, 0x81, 0x70, 0x35, 0xd1, |
| 8822 | 0x00, 0x81, 0x7f, 0x1e, 0x30, 0x00, 0x81, 0x8a, | 8822 | 0x00, 0x81, 0x71, 0x4f, 0x33, 0x00, 0x81, 0x7f, |
| 8823 | 0x35, 0x12, 0x00, 0x81, 0xb5, 0x35, 0x13, 0x00, | 8823 | 0x1e, 0x30, 0x00, 0x81, 0x8a, 0x35, 0x12, 0x00, |
| 8824 | 0x81, 0xcd, 0x35, 0x14, 0x00, 0x81, 0xed, 0x34, | 8824 | 0x81, 0xb5, 0x35, 0x13, 0x00, 0x81, 0xcd, 0x35, |
| 8825 | 0x26, 0x00, 0x82, 0x00, 0x57, 0x0f, 0x00, 0x82, | 8825 | 0x14, 0x00, 0x81, 0xed, 0x34, 0x26, 0x00, 0x82, |
| 8826 | 0x0c, 0x4e, 0xe6, 0x00, 0x82, 0x18, 0x35, 0x7f, | 8826 | 0x00, 0x57, 0x0f, 0x00, 0x82, 0x0c, 0x4e, 0xe6, |
| 8827 | 0x00, 0x82, 0x1b, 0x4e, 0xe7, 0x00, 0x82, 0x1c, | 8827 | 0x00, 0x82, 0x18, 0x35, 0x7f, 0x00, 0x82, 0x1b, |
| 8828 | 0x34, 0x93, 0x00, 0x82, 0x1f, 0x35, 0xb3, 0x00, | 8828 | 0x4e, 0xe7, 0x00, 0x82, 0x1c, 0x34, 0x93, 0x00, |
| 8829 | 0x82, 0x2e, 0x1e, 0xaf, 0x00, 0x82, 0x39, 0x34, | 8829 | 0x82, 0x1f, 0x35, 0xb3, 0x00, 0x82, 0x2e, 0x1e, |
| 8830 | 0x9f, 0x00, 0x82, 0x40, 0x4e, 0xe8, 0x00, 0x82, | 8830 | 0xaf, 0x00, 0x82, 0x39, 0x34, 0x9f, 0x00, 0x82, |
| 8831 | 0x47, 0x34, 0xab, 0x00, 0x82, 0x58, 0x37, 0x74, | 8831 | 0x40, 0x4e, 0xe8, 0x00, 0x82, 0x47, 0x34, 0xab, |
| 8832 | 0x00, 0x82, 0x79, 0x37, 0x77, 0x00, 0x82, 0x8d, | 8832 | 0x00, 0x82, 0x58, 0x37, 0x74, 0x00, 0x82, 0x79, |
| 8833 | 0x1e, 0xb0, 0x00, 0x82, 0x92, 0x4f, 0x44, 0x00, | 8833 | 0x37, 0x77, 0x00, 0x82, 0x8d, 0x1e, 0xb0, 0x00, |
| 8834 | 0x82, 0xa6, 0x1f, 0x19, 0x00, 0x82, 0xb1, 0x35, | 8834 | 0x82, 0x92, 0x4f, 0x44, 0x00, 0x82, 0xa6, 0x1f, |
| 8835 | 0x62, 0x00, 0x82, 0xbd, 0x05, 0x6a, 0x00, 0x82, | 8835 | 0x19, 0x00, 0x82, 0xb1, 0x35, 0x62, 0x00, 0x82, |
| 8836 | 0xc5, 0x35, 0x77, 0x00, 0x82, 0xd2, 0x1e, 0xb1, | 8836 | 0xbd, 0x05, 0x6a, 0x00, 0x82, 0xc5, 0x35, 0x77, |
| 8837 | 0x00, 0x82, 0xe3, 0x37, 0x78, 0x00, 0x83, 0x23, | 8837 | 0x00, 0x82, 0xd2, 0x1e, 0xb1, 0x00, 0x82, 0xe3, |
| 8838 | 0x1e, 0xb2, 0x00, 0x83, 0x28, 0x1f, 0x1a, 0x00, | 8838 | 0x37, 0x78, 0x00, 0x83, 0x23, 0x1e, 0xb2, 0x00, |
| 8839 | 0x83, 0x52, 0x35, 0xcc, 0x00, 0x83, 0x75, 0x1e, | 8839 | 0x83, 0x28, 0x1f, 0x1a, 0x00, 0x83, 0x52, 0x35, |
| 8840 | 0xb3, 0x00, 0x83, 0xbd, 0x37, 0x7c, 0x00, 0x83, | 8840 | 0xcc, 0x00, 0x83, 0x75, 0x1e, 0xb3, 0x00, 0x83, |
| 8841 | 0xd3, 0x35, 0x63, 0x00, 0x83, 0xd4, 0x4e, 0xea, | 8841 | 0xbd, 0x37, 0x7c, 0x00, 0x83, 0xd3, 0x35, 0x63, |
| 8842 | 0x00, 0x83, 0xdc, 0x35, 0xda, 0x00, 0x83, 0xdf, | 8842 | 0x00, 0x83, 0xd4, 0x4e, 0xea, 0x00, 0x83, 0xdc, |
| 8843 | 0x1e, 0x4b, 0x00, 0x83, 0xf2, 0x35, 0x15, 0x00, | 8843 | 0x35, 0xda, 0x00, 0x83, 0xdf, 0x1e, 0x4b, 0x00, |
| 8844 | 0x84, 0x0c, 0x36, 0xca, 0x00, 0x84, 0x0f, 0x4e, | 8844 | 0x83, 0xf2, 0x35, 0x15, 0x00, 0x84, 0x0c, 0x36, |
| 8845 | 0xeb, 0x00, 0x84, 0x20, 0x37, 0x7b, 0x00, 0x84, | 8845 | 0xca, 0x00, 0x84, 0x0f, 0x4e, 0xeb, 0x00, 0x84, |
| 8846 | 0x22, 0x1f, 0x3f, 0x00, 0x84, 0x57, 0x34, 0x37, | 8846 | 0x20, 0x37, 0x7b, 0x00, 0x84, 0x22, 0x1f, 0x3f, |
| 8847 | 0x00, 0x84, 0x5b, 0x1d, 0xe4, 0x00, 0x84, 0x5c, | 8847 | 0x00, 0x84, 0x57, 0x34, 0x37, 0x00, 0x84, 0x5b, |
| 8848 | 0x57, 0x45, 0x00, 0x84, 0x7a, 0x34, 0xba, 0x00, | 8848 | 0x1d, 0xe4, 0x00, 0x84, 0x5c, 0x57, 0x45, 0x00, |
| 8849 | 0x84, 0xea, 0x4e, 0xed, 0x00, 0x84, 0xec, 0x1e, | 8849 | 0x84, 0x7a, 0x34, 0xba, 0x00, 0x84, 0xea, 0x4e, |
| 8850 | 0x72, 0x00, 0x84, 0xee, 0x0f, 0xc7, 0x00, 0x84, | 8850 | 0xed, 0x00, 0x84, 0xec, 0x1e, 0x72, 0x00, 0x84, |
| 8851 | 0xf4, 0x37, 0x7d, 0x00, 0x85, 0x11, 0x36, 0xbd, | 8851 | 0xee, 0x0f, 0xc7, 0x00, 0x84, 0xf4, 0x37, 0x7d, |
| 8852 | 0x00, 0x85, 0x17, 0x1e, 0xb4, 0x00, 0x85, 0x3d, | 8852 | 0x00, 0x85, 0x11, 0x36, 0xbd, 0x00, 0x85, 0x17, |
| 8853 | 0x1e, 0x6d, 0x00, 0x85, 0x43, 0x36, 0xa6, 0x00, | 8853 | 0x1e, 0xb4, 0x00, 0x85, 0x3d, 0x1e, 0x6d, 0x00, |
| 8854 | 0x85, 0x51, 0x4e, 0xef, 0x00, 0x85, 0x55, 0x35, | 8854 | 0x85, 0x43, 0x36, 0xa6, 0x00, 0x85, 0x51, 0x4e, |
| 8855 | 0x16, 0x00, 0x85, 0x5d, 0x57, 0x64, 0x00, 0x85, | 8855 | 0xef, 0x00, 0x85, 0x55, 0x35, 0x16, 0x00, 0x85, |
| 8856 | 0x63, 0x4e, 0xf0, 0x00, 0x85, 0x84, 0x36, 0x99, | 8856 | 0x5d, 0x57, 0x64, 0x00, 0x85, 0x63, 0x4e, 0xf0, |
| 8857 | 0x00, 0x85, 0x87, 0x37, 0x7f, 0x00, 0x85, 0xa9, | 8857 | 0x00, 0x85, 0x84, 0x36, 0x99, 0x00, 0x85, 0x87, |
| 8858 | 0x1e, 0x08, 0x00, 0x85, 0xaf, 0x1e, 0x15, 0x00, | 8858 | 0x37, 0x7f, 0x00, 0x85, 0xa9, 0x1e, 0x08, 0x00, |
| 8859 | 0x85, 0xcf, 0x4e, 0xf1, 0x00, 0x85, 0xd5, 0x35, | 8859 | 0x85, 0xaf, 0x1e, 0x15, 0x00, 0x85, 0xcf, 0x4e, |
| 8860 | 0x17, 0x00, 0x85, 0xe4, 0x36, 0x85, 0x00, 0x85, | 8860 | 0xf1, 0x00, 0x85, 0xd5, 0x35, 0x17, 0x00, 0x85, |
| 8861 | 0xf7, 0x1e, 0x16, 0x00, 0x86, 0x12, 0x21, 0xa4, | 8861 | 0xe4, 0x36, 0x85, 0x00, 0x85, 0xf7, 0x1e, 0x16, |
| 8862 | 0x00, 0x86, 0x2d, 0x37, 0x04, 0x00, 0x86, 0x4e, | 8862 | 0x00, 0x86, 0x12, 0x21, 0xa4, 0x00, 0x86, 0x2d, |
| 8863 | 0x4e, 0xf2, 0x00, 0x86, 0x50, 0x35, 0x8c, 0x00, | 8863 | 0x37, 0x04, 0x00, 0x86, 0x4e, 0x4e, 0xf2, 0x00, |
| 8864 | 0x86, 0x54, 0x4f, 0x32, 0x00, 0x86, 0x5c, 0x0f, | 8864 | 0x86, 0x50, 0x35, 0x8c, 0x00, 0x86, 0x54, 0x4f, |
| 8865 | 0x82, 0x00, 0x86, 0x5e, 0x35, 0xa6, 0x00, 0x86, | 8865 | 0x32, 0x00, 0x86, 0x5c, 0x0f, 0x82, 0x00, 0x86, |
| 8866 | 0x62, 0x4e, 0xf3, 0x00, 0x86, 0x8a, 0x4e, 0xf4, | 8866 | 0x5e, 0x35, 0xa6, 0x00, 0x86, 0x62, 0x4e, 0xf3, |
| 8867 | 0x00, 0x86, 0xdb, 0x34, 0x5e, 0x00, 0x86, 0xf8, | 8867 | 0x00, 0x86, 0x8a, 0x4e, 0xf4, 0x00, 0x86, 0xdb, |
| 8868 | 0x1e, 0x35, 0x00, 0x87, 0x03, 0x4f, 0x48, 0x00, | 8868 | 0x34, 0x5e, 0x00, 0x86, 0xf8, 0x1e, 0x35, 0x00, |
| 8869 | 0x87, 0x1a, 0x35, 0x18, 0x00, 0x87, 0x37, 0x37, | 8869 | 0x87, 0x03, 0x4f, 0x48, 0x00, 0x87, 0x1a, 0x35, |
| 8870 | 0x82, 0x00, 0x87, 0x3b, 0x37, 0x83, 0x00, 0x87, | 8870 | 0x18, 0x00, 0x87, 0x37, 0x37, 0x82, 0x00, 0x87, |
| 8871 | 0x55, 0x1e, 0x1d, 0x00, 0x87, 0x59, 0x1f, 0x40, | 8871 | 0x3b, 0x37, 0x83, 0x00, 0x87, 0x55, 0x1e, 0x1d, |
| 8872 | 0x00, 0x87, 0x82, 0x1e, 0xb6, 0x00, 0x87, 0xa3, | 8872 | 0x00, 0x87, 0x59, 0x1f, 0x40, 0x00, 0x87, 0x82, |
| 8873 | 0x57, 0xaa, 0x00, 0x87, 0xbd, 0x37, 0x85, 0x00, | 8873 | 0x1e, 0xb6, 0x00, 0x87, 0xa3, 0x57, 0xaa, 0x00, |
| 8874 | 0x87, 0xd2, 0x1e, 0xb7, 0x00, 0x88, 0x03, 0x3b, | 8874 | 0x87, 0xbd, 0x37, 0x85, 0x00, 0x87, 0xd2, 0x1e, |
| 8875 | 0x03, 0x00, 0x88, 0x05, 0x37, 0x84, 0x00, 0x88, | 8875 | 0xb7, 0x00, 0x88, 0x03, 0x3b, 0x03, 0x00, 0x88, |
| 8876 | 0x0e, 0x1f, 0x41, 0x00, 0x88, 0x36, 0x35, 0x19, | 8876 | 0x05, 0x37, 0x84, 0x00, 0x88, 0x0e, 0x1f, 0x41, |
| 8877 | 0x00, 0x88, 0x42, 0x4e, 0xf5, 0x00, 0x88, 0x46, | 8877 | 0x00, 0x88, 0x36, 0x35, 0x19, 0x00, 0x88, 0x42, |
| 8878 | 0x35, 0xfa, 0x00, 0x88, 0x4b, 0x57, 0xc3, 0x00, | 8878 | 0x4e, 0xf5, 0x00, 0x88, 0x46, 0x35, 0xfa, 0x00, |
| 8879 | 0x88, 0x53, 0x35, 0xfd, 0x00, 0x88, 0x5b, 0x34, | 8879 | 0x88, 0x4b, 0x57, 0xc3, 0x00, 0x88, 0x53, 0x35, |
| 8880 | 0x66, 0x00, 0x88, 0x5e, 0x35, 0x53, 0x00, 0x88, | 8880 | 0xfd, 0x00, 0x88, 0x5b, 0x34, 0x66, 0x00, 0x88, |
| 8881 | 0x63, 0x35, 0x48, 0x00, 0x88, 0x70, 0x36, 0x27, | 8881 | 0x5e, 0x35, 0x53, 0x00, 0x88, 0x63, 0x35, 0x48, |
| 8882 | 0x00, 0x88, 0x77, 0x4e, 0xf6, 0x00, 0x88, 0x9e, | 8882 | 0x00, 0x88, 0x70, 0x36, 0x27, 0x00, 0x88, 0x77, |
| 8883 | 0x35, 0x1a, 0x00, 0x88, 0xd8, 0x35, 0x1b, 0x00, | 8883 | 0x4e, 0xf6, 0x00, 0x88, 0x9e, 0x35, 0x1a, 0x00, |
| 8884 | 0x88, 0xf4, 0x35, 0x1c, 0x00, 0x89, 0x0a, 0x1e, | 8884 | 0x88, 0xd8, 0x35, 0x1b, 0x00, 0x88, 0xf4, 0x35, |
| 8885 | 0xb8, 0x00, 0x89, 0x10, 0x34, 0x13, 0x00, 0x89, | 8885 | 0x1c, 0x00, 0x89, 0x0a, 0x1e, 0xb8, 0x00, 0x89, |
| 8886 | 0x1c, 0x37, 0xcb, 0x00, 0x89, 0x2b, 0x35, 0x1d, | 8886 | 0x10, 0x34, 0x13, 0x00, 0x89, 0x1c, 0x37, 0xcb, |
| 8887 | 0x00, 0x89, 0x3b, 0x35, 0x1e, 0x00, 0x89, 0x41, | 8887 | 0x00, 0x89, 0x2b, 0x35, 0x1d, 0x00, 0x89, 0x3b, |
| 8888 | 0x4e, 0xf7, 0x00, 0x89, 0x56, 0x1d, 0xdd, 0x00, | 8888 | 0x35, 0x1e, 0x00, 0x89, 0x41, 0x4e, 0xf7, 0x00, |
| 8889 | 0x89, 0x6a, 0x35, 0x1f, 0x00, 0x89, 0x6f, 0x35, | 8889 | 0x89, 0x56, 0x1d, 0xdd, 0x00, 0x89, 0x6a, 0x35, |
| 8890 | 0x20, 0x00, 0x89, 0x81, 0x36, 0xff, 0x00, 0x89, | 8890 | 0x1f, 0x00, 0x89, 0x6f, 0x35, 0x20, 0x00, 0x89, |
| 8891 | 0x86, 0x36, 0xb8, 0x00, 0x89, 0x87, 0x36, 0x95, | 8891 | 0x81, 0x36, 0xff, 0x00, 0x89, 0x86, 0x36, 0xb8, |
| 8892 | 0x00, 0x89, 0x96, 0x34, 0x22, 0x00, 0x89, 0xaa, | 8892 | 0x00, 0x89, 0x87, 0x36, 0x95, 0x00, 0x89, 0x96, |
| 8893 | 0x34, 0x9b, 0x00, 0x89, 0xaf, 0x1e, 0xb9, 0x00, | 8893 | 0x34, 0x22, 0x00, 0x89, 0xaa, 0x34, 0x9b, 0x00, |
| 8894 | 0x89, 0xbd, 0x37, 0x8a, 0x00, 0x89, 0xd2, 0x05, | 8894 | 0x89, 0xaf, 0x1e, 0xb9, 0x00, 0x89, 0xbd, 0x37, |
| 8895 | 0xaf, 0x00, 0x8a, 0x0a, 0x36, 0x24, 0x00, 0x8a, | 8895 | 0x8a, 0x00, 0x89, 0xd2, 0x05, 0xaf, 0x00, 0x8a, |
| 8896 | 0x12, 0x37, 0xd7, 0x00, 0x8a, 0x1d, 0x35, 0x21, | 8896 | 0x0a, 0x36, 0x24, 0x00, 0x8a, 0x12, 0x37, 0xd7, |
| 8897 | 0x00, 0x8a, 0x1f, 0x34, 0x96, 0x00, 0x8a, 0x3b, | 8897 | 0x00, 0x8a, 0x1d, 0x35, 0x21, 0x00, 0x8a, 0x1f, |
| 8898 | 0x1e, 0x3c, 0x00, 0x8a, 0x55, 0x36, 0xaf, 0x00, | 8898 | 0x34, 0x96, 0x00, 0x8a, 0x3b, 0x1e, 0x3c, 0x00, |
| 8899 | 0x8a, 0x6e, 0x1e, 0x28, 0x00, 0x8a, 0x8d, 0x36, | 8899 | 0x8a, 0x55, 0x36, 0xaf, 0x00, 0x8a, 0x6e, 0x1e, |
| 8900 | 0x92, 0x00, 0x8a, 0x95, 0x34, 0xa3, 0x00, 0x8a, | 8900 | 0x28, 0x00, 0x8a, 0x8d, 0x36, 0x92, 0x00, 0x8a, |
| 8901 | 0xa0, 0x36, 0x2f, 0x00, 0x8a, 0xa4, 0x35, 0xc2, | 8901 | 0x95, 0x34, 0xa3, 0x00, 0x8a, 0xa0, 0x36, 0x2f, |
| 8902 | 0x00, 0x8a, 0xb9, 0x34, 0xb7, 0x00, 0x8a, 0xbf, | 8902 | 0x00, 0x8a, 0xa4, 0x35, 0xc2, 0x00, 0x8a, 0xb9, |
| 8903 | 0x36, 0x6d, 0x00, 0x8a, 0xcb, 0x36, 0x30, 0x00, | 8903 | 0x34, 0xb7, 0x00, 0x8a, 0xbf, 0x36, 0x6d, 0x00, |
| 8904 | 0x8a, 0xdb, 0x37, 0x8b, 0x00, 0x8a, 0xde, 0x1e, | 8904 | 0x8a, 0xcb, 0x36, 0x30, 0x00, 0x8a, 0xdb, 0x37, |
| 8905 | 0xba, 0x00, 0x8a, 0xed, 0x0f, 0x0b, 0x00, 0x8a, | 8905 | 0x8b, 0x00, 0x8a, 0xde, 0x1e, 0xba, 0x00, 0x8a, |
| 8906 | 0xee, 0x35, 0xe3, 0x00, 0x8a, 0xf8, 0x09, 0x7e, | 8906 | 0xed, 0x0f, 0x0b, 0x00, 0x8a, 0xee, 0x35, 0xe3, |
| 8907 | 0x00, 0x8a, 0xfa, 0x1d, 0xfe, 0x00, 0x8b, 0x01, | 8907 | 0x00, 0x8a, 0xf8, 0x09, 0x7e, 0x00, 0x8a, 0xfa, |
| 8908 | 0x04, 0xfc, 0x00, 0x8b, 0x04, 0x36, 0x86, 0x00, | 8908 | 0x1d, 0xfe, 0x00, 0x8b, 0x01, 0x04, 0xfc, 0x00, |
| 8909 | 0x8b, 0x0e, 0x1e, 0x56, 0x00, 0x8b, 0x19, 0x35, | 8909 | 0x8b, 0x04, 0x36, 0x86, 0x00, 0x8b, 0x0e, 0x1e, |
| 8910 | 0xb9, 0x00, 0x8b, 0x1b, 0x35, 0xcd, 0x00, 0x8b, | 8910 | 0x56, 0x00, 0x8b, 0x19, 0x35, 0xb9, 0x00, 0x8b, |
| 8911 | 0x1d, 0x34, 0x8d, 0x00, 0x8b, 0x2c, 0x1e, 0x69, | 8911 | 0x1b, 0x35, 0xcd, 0x00, 0x8b, 0x1d, 0x34, 0x8d, |
| 8912 | 0x00, 0x8b, 0x39, 0x06, 0xd8, 0x00, 0x8b, 0x3e, | 8912 | 0x00, 0x8b, 0x2c, 0x1e, 0x69, 0x00, 0x8b, 0x39, |
| 8913 | 0x37, 0x8c, 0x00, 0x8b, 0x41, 0x1e, 0xbb, 0x00, | 8913 | 0x06, 0xd8, 0x00, 0x8b, 0x3e, 0x37, 0x8c, 0x00, |
| 8914 | 0x8b, 0x56, 0x4e, 0xf8, 0x00, 0x8b, 0x5a, 0x37, | 8914 | 0x8b, 0x41, 0x1e, 0xbb, 0x00, 0x8b, 0x56, 0x4e, |
| 8915 | 0x8d, 0x00, 0x8b, 0x5c, 0x4e, 0xfa, 0x00, 0x8b, | 8915 | 0xf8, 0x00, 0x8b, 0x5a, 0x37, 0x8d, 0x00, 0x8b, |
| 8916 | 0x7f, 0x52, 0x52, 0x00, 0x8c, 0x6a, 0x4e, 0xfd, | 8916 | 0x5c, 0x4e, 0xfa, 0x00, 0x8b, 0x7f, 0x52, 0x52, |
| 8917 | 0x00, 0x8c, 0x79, 0x4e, 0xfe, 0x00, 0x8c, 0x9b, | 8917 | 0x00, 0x8c, 0x6a, 0x4e, 0xfd, 0x00, 0x8c, 0x79, |
| 8918 | 0x58, 0x37, 0x00, 0x8c, 0xa0, 0x36, 0xb5, 0x00, | 8918 | 0x4e, 0xfe, 0x00, 0x8c, 0x9b, 0x58, 0x37, 0x00, |
| 8919 | 0x8c, 0xa7, 0x34, 0xb8, 0x00, 0x8c, 0xa8, 0x35, | 8919 | 0x8c, 0xa0, 0x36, 0xb5, 0x00, 0x8c, 0xa7, 0x34, |
| 8920 | 0x64, 0x00, 0x8c, 0xab, 0x34, 0x72, 0x00, 0x8c, | 8920 | 0xb8, 0x00, 0x8c, 0xa8, 0x35, 0x64, 0x00, 0x8c, |
| 8921 | 0xc7, 0x35, 0xe5, 0x00, 0x8c, 0xca, 0x36, 0x4c, | 8921 | 0xab, 0x34, 0x72, 0x00, 0x8c, 0xc7, 0x35, 0xe5, |
| 8922 | 0x00, 0x8c, 0xd3, 0x0d, 0xc2, 0x00, 0x8c, 0xed, | 8922 | 0x00, 0x8c, 0xca, 0x36, 0x4c, 0x00, 0x8c, 0xd3, |
| 8923 | 0x1e, 0x4c, 0x00, 0x8c, 0xfc, 0x34, 0x86, 0x00, | 8923 | 0x0d, 0xc2, 0x00, 0x8c, 0xed, 0x1e, 0x4c, 0x00, |
| 8924 | 0x8d, 0x05, 0x35, 0x22, 0x00, 0x8d, 0x08, 0x34, | 8924 | 0x8c, 0xfc, 0x34, 0x86, 0x00, 0x8d, 0x05, 0x35, |
| 8925 | 0x34, 0x00, 0x8d, 0x0f, 0x35, 0x23, 0x00, 0x8d, | 8925 | 0x22, 0x00, 0x8d, 0x08, 0x34, 0x34, 0x00, 0x8d, |
| 8926 | 0x67, 0x4f, 0x00, 0x00, 0x8d, 0x70, 0x36, 0x46, | 8926 | 0x0f, 0x35, 0x23, 0x00, 0x8d, 0x67, 0x4f, 0x00, |
| 8927 | 0x00, 0x8d, 0x73, 0x37, 0x8e, 0x00, 0x8d, 0x77, | 8927 | 0x00, 0x8d, 0x70, 0x36, 0x46, 0x00, 0x8d, 0x73, |
| 8928 | 0x35, 0x88, 0x00, 0x8d, 0x99, 0x37, 0x8f, 0x00, | 8928 | 0x37, 0x8e, 0x00, 0x8d, 0x77, 0x35, 0x88, 0x00, |
| 8929 | 0x8d, 0xda, 0x1e, 0xbc, 0x00, 0x8d, 0xdd, 0x35, | 8929 | 0x8d, 0x99, 0x37, 0x8f, 0x00, 0x8d, 0xda, 0x1e, |
| 8930 | 0x94, 0x00, 0x8d, 0xf3, 0x34, 0xa8, 0x00, 0x8e, | 8930 | 0xbc, 0x00, 0x8d, 0xdd, 0x35, 0x94, 0x00, 0x8d, |
| 8931 | 0x09, 0x1e, 0xbd, 0x00, 0x8e, 0x34, 0x37, 0x91, | 8931 | 0xf3, 0x34, 0xa8, 0x00, 0x8e, 0x09, 0x1e, 0xbd, |
| 8932 | 0x00, 0x8e, 0x4a, 0x37, 0x92, 0x00, 0x8e, 0x8d, | 8932 | 0x00, 0x8e, 0x34, 0x37, 0x91, 0x00, 0x8e, 0x4a, |
| 8933 | 0x36, 0xef, 0x00, 0x8e, 0x91, 0x35, 0x25, 0x00, | 8933 | 0x37, 0x92, 0x00, 0x8e, 0x8d, 0x36, 0xef, 0x00, |
| 8934 | 0x8e, 0xa1, 0x35, 0x26, 0x00, 0x8e, 0xcc, 0x34, | 8934 | 0x8e, 0x91, 0x35, 0x25, 0x00, 0x8e, 0xa1, 0x35, |
| 8935 | 0x76, 0x00, 0x8e, 0xd4, 0x3b, 0x4a, 0x00, 0x8f, | 8935 | 0x26, 0x00, 0x8e, 0xcc, 0x34, 0x76, 0x00, 0x8e, |
| 8936 | 0x03, 0x4f, 0x02, 0x00, 0x8f, 0x13, 0x1e, 0xbe, | 8936 | 0xd4, 0x3b, 0x4a, 0x00, 0x8f, 0x03, 0x4f, 0x02, |
| 8937 | 0x00, 0x8f, 0x29, 0x34, 0xb0, 0x00, 0x8f, 0x2f, | 8937 | 0x00, 0x8f, 0x13, 0x1e, 0xbe, 0x00, 0x8f, 0x29, |
| 8938 | 0x34, 0x90, 0x00, 0x8f, 0x38, 0x36, 0xf5, 0x00, | 8938 | 0x34, 0xb0, 0x00, 0x8f, 0x2f, 0x34, 0x90, 0x00, |
| 8939 | 0x8f, 0x44, 0x35, 0x75, 0x00, 0x8f, 0xb6, 0x3c, | 8939 | 0x8f, 0x38, 0x36, 0xf5, 0x00, 0x8f, 0x44, 0x35, |
| 8940 | 0x2b, 0x00, 0x8f, 0xbb, 0x20, 0x4b, 0x00, 0x8f, | 8940 | 0x75, 0x00, 0x8f, 0xb6, 0x3c, 0x2b, 0x00, 0x8f, |
| 8941 | 0xbc, 0x35, 0xd3, 0x00, 0x8f, 0xbf, 0x1e, 0x37, | 8941 | 0xbb, 0x20, 0x4b, 0x00, 0x8f, 0xbc, 0x35, 0xd3, |
| 8942 | 0x00, 0x8f, 0xc2, 0x1d, 0xd6, 0x00, 0x8f, 0xc4, | 8942 | 0x00, 0x8f, 0xbf, 0x1e, 0x37, 0x00, 0x8f, 0xc2, |
| 8943 | 0x1f, 0x2c, 0x00, 0x8f, 0xc5, 0x36, 0x26, 0x00, | 8943 | 0x1d, 0xd6, 0x00, 0x8f, 0xc4, 0x1f, 0x2c, 0x00, |
| 8944 | 0x8f, 0xc6, 0x3b, 0x51, 0x00, 0x8f, 0xce, 0x35, | 8944 | 0x8f, 0xc5, 0x36, 0x26, 0x00, 0x8f, 0xc6, 0x3b, |
| 8945 | 0xae, 0x00, 0x8f, 0xd1, 0x35, 0xa2, 0x00, 0x8f, | 8945 | 0x51, 0x00, 0x8f, 0xce, 0x35, 0xae, 0x00, 0x8f, |
| 8946 | 0xd4, 0x36, 0xc0, 0x00, 0x8f, 0xe6, 0x1d, 0xdf, | 8946 | 0xd1, 0x35, 0xa2, 0x00, 0x8f, 0xd4, 0x36, 0xc0, |
| 8947 | 0x00, 0x8f, 0xe9, 0x1e, 0xc0, 0x00, 0x8f, 0xea, | 8947 | 0x00, 0x8f, 0xe6, 0x1d, 0xdf, 0x00, 0x8f, 0xe9, |
| 8948 | 0x1e, 0xbf, 0x00, 0x8f, 0xeb, 0x36, 0x9a, 0x00, | 8948 | 0x1e, 0xc0, 0x00, 0x8f, 0xea, 0x1e, 0xbf, 0x00, |
| 8949 | 0x8f, 0xed, 0x36, 0x7b, 0x00, 0x8f, 0xef, 0x37, | 8949 | 0x8f, 0xeb, 0x36, 0x9a, 0x00, 0x8f, 0xed, 0x36, |
| 8950 | 0x93, 0x00, 0x8f, 0xf0, 0x35, 0xfe, 0x00, 0x8f, | 8950 | 0x7b, 0x00, 0x8f, 0xef, 0x37, 0x93, 0x00, 0x8f, |
| 8951 | 0xf6, 0x4f, 0x06, 0x00, 0x8f, 0xf7, 0x36, 0xe6, | 8951 | 0xf0, 0x35, 0xfe, 0x00, 0x8f, 0xf6, 0x4f, 0x06, |
| 8952 | 0x00, 0x8f, 0xfa, 0x37, 0x95, 0x00, 0x8f, 0xfd, | 8952 | 0x00, 0x8f, 0xf7, 0x36, 0xe6, 0x00, 0x8f, 0xfa, |
| 8953 | 0x36, 0x72, 0x00, 0x90, 0x00, 0x36, 0x51, 0x00, | 8953 | 0x37, 0x95, 0x00, 0x8f, 0xfd, 0x36, 0x72, 0x00, |
| 8954 | 0x90, 0x01, 0x36, 0x47, 0x00, 0x90, 0x03, 0x34, | 8954 | 0x90, 0x00, 0x36, 0x51, 0x00, 0x90, 0x01, 0x36, |
| 8955 | 0xad, 0x00, 0x90, 0x06, 0x35, 0x8d, 0x00, 0x90, | 8955 | 0x47, 0x00, 0x90, 0x03, 0x34, 0xad, 0x00, 0x90, |
| 8956 | 0x0e, 0x35, 0x28, 0x00, 0x90, 0x0f, 0x36, 0x88, | 8956 | 0x06, 0x35, 0x8d, 0x00, 0x90, 0x0e, 0x35, 0x28, |
| 8957 | 0x00, 0x90, 0x10, 0x36, 0x64, 0x00, 0x90, 0x14, | 8957 | 0x00, 0x90, 0x0f, 0x36, 0x88, 0x00, 0x90, 0x10, |
| 8958 | 0x36, 0x7e, 0x00, 0x90, 0x17, 0x1e, 0x1f, 0x00, | 8958 | 0x36, 0x64, 0x00, 0x90, 0x14, 0x36, 0x7e, 0x00, |
| 8959 | 0x90, 0x19, 0x1e, 0x5c, 0x00, 0x90, 0x1a, 0x36, | 8959 | 0x90, 0x17, 0x1e, 0x1f, 0x00, 0x90, 0x19, 0x1e, |
| 8960 | 0x73, 0x00, 0x90, 0x1d, 0x1e, 0x22, 0x00, 0x90, | 8960 | 0x5c, 0x00, 0x90, 0x1a, 0x36, 0x73, 0x00, 0x90, |
| 8961 | 0x1e, 0x37, 0x96, 0x00, 0x90, 0x1f, 0x36, 0x4b, | 8961 | 0x1d, 0x1e, 0x22, 0x00, 0x90, 0x1e, 0x37, 0x96, |
| 8962 | 0x00, 0x90, 0x20, 0x36, 0x49, 0x00, 0x90, 0x22, | 8962 | 0x00, 0x90, 0x1f, 0x36, 0x4b, 0x00, 0x90, 0x20, |
| 8963 | 0x20, 0x4a, 0x00, 0x90, 0x23, 0x0f, 0xc8, 0x00, | 8963 | 0x36, 0x49, 0x00, 0x90, 0x22, 0x20, 0x4a, 0x00, |
| 8964 | 0x90, 0x2e, 0x36, 0x52, 0x00, 0x90, 0x31, 0x35, | 8964 | 0x90, 0x23, 0x0f, 0xc8, 0x00, 0x90, 0x2e, 0x36, |
| 8965 | 0xfb, 0x00, 0x90, 0x32, 0x36, 0x1f, 0x00, 0x90, | 8965 | 0x52, 0x00, 0x90, 0x31, 0x35, 0xfb, 0x00, 0x90, |
| 8966 | 0x35, 0x37, 0x97, 0x00, 0x90, 0x38, 0x34, 0x08, | 8966 | 0x32, 0x36, 0x1f, 0x00, 0x90, 0x35, 0x37, 0x97, |
| 8967 | 0x00, 0x90, 0x39, 0x36, 0x58, 0x00, 0x90, 0x3c, | 8967 | 0x00, 0x90, 0x38, 0x34, 0x08, 0x00, 0x90, 0x39, |
| 8968 | 0x1e, 0x67, 0x00, 0x90, 0x41, 0x1e, 0x53, 0x00, | 8968 | 0x36, 0x58, 0x00, 0x90, 0x3c, 0x1e, 0x67, 0x00, |
| 8969 | 0x90, 0x42, 0x34, 0x9c, 0x00, 0x90, 0x47, 0x35, | 8969 | 0x90, 0x41, 0x1e, 0x53, 0x00, 0x90, 0x42, 0x34, |
| 8970 | 0xa8, 0x00, 0x90, 0x4a, 0x36, 0xfc, 0x00, 0x90, | 8970 | 0x9c, 0x00, 0x90, 0x47, 0x35, 0xa8, 0x00, 0x90, |
| 8971 | 0x4b, 0x35, 0x51, 0x00, 0x90, 0x4d, 0x36, 0xc1, | 8971 | 0x4a, 0x36, 0xfc, 0x00, 0x90, 0x4b, 0x35, 0x51, |
| 8972 | 0x00, 0x90, 0x4e, 0x35, 0x65, 0x00, 0x90, 0x50, | 8972 | 0x00, 0x90, 0x4d, 0x36, 0xc1, 0x00, 0x90, 0x4e, |
| 8973 | 0x37, 0x98, 0x00, 0x90, 0x52, 0x35, 0x27, 0x00, | 8973 | 0x35, 0x65, 0x00, 0x90, 0x50, 0x37, 0x98, 0x00, |
| 8974 | 0x90, 0x53, 0x36, 0x8b, 0x00, 0x90, 0x54, 0x36, | 8974 | 0x90, 0x52, 0x35, 0x27, 0x00, 0x90, 0x53, 0x36, |
| 8975 | 0x58, 0x00, 0x90, 0x55, 0x34, 0x63, 0x00, 0x90, | 8975 | 0x8b, 0x00, 0x90, 0x54, 0x36, 0x58, 0x00, 0x90, |
| 8976 | 0x58, 0x1e, 0xc1, 0x00, 0x90, 0x5c, 0x1e, 0x2e, | 8976 | 0x55, 0x34, 0x63, 0x00, 0x90, 0x58, 0x1e, 0xc1, |
| 8977 | 0x00, 0x90, 0x60, 0x35, 0x5a, 0x00, 0x90, 0x61, | 8977 | 0x00, 0x90, 0x5c, 0x1e, 0x2e, 0x00, 0x90, 0x60, |
| 8978 | 0x1e, 0x2a, 0x00, 0x90, 0x63, 0x35, 0xba, 0x00, | 8978 | 0x35, 0x5a, 0x00, 0x90, 0x61, 0x1e, 0x2a, 0x00, |
| 8979 | 0x90, 0x69, 0x36, 0x7a, 0x00, 0x90, 0x6d, 0x36, | 8979 | 0x90, 0x63, 0x35, 0xba, 0x00, 0x90, 0x69, 0x36, |
| 8980 | 0x48, 0x00, 0x90, 0x6e, 0x1e, 0x0e, 0x00, 0x90, | 8980 | 0x7a, 0x00, 0x90, 0x6d, 0x36, 0x48, 0x00, 0x90, |
| 8981 | 0x75, 0x36, 0x00, 0x00, 0x90, 0x77, 0x36, 0x40, | 8981 | 0x6e, 0x1e, 0x0e, 0x00, 0x90, 0x75, 0x36, 0x00, |
| 8982 | 0x00, 0x90, 0x78, 0x36, 0x3f, 0x00, 0x90, 0x7a, | 8982 | 0x00, 0x90, 0x77, 0x36, 0x40, 0x00, 0x90, 0x78, |
| 8983 | 0x35, 0x4a, 0x00, 0x90, 0x7c, 0x1e, 0x80, 0x00, | 8983 | 0x36, 0x3f, 0x00, 0x90, 0x7a, 0x35, 0x4a, 0x00, |
| 8984 | 0x90, 0x7f, 0x36, 0xa7, 0x00, 0x90, 0x81, 0x37, | 8984 | 0x90, 0x7c, 0x1e, 0x80, 0x00, 0x90, 0x7f, 0x36, |
| 8985 | 0x9a, 0x00, 0x90, 0x83, 0x37, 0x5c, 0x00, 0x90, | 8985 | 0xa7, 0x00, 0x90, 0x81, 0x37, 0x9a, 0x00, 0x90, |
| 8986 | 0x84, 0x35, 0x7c, 0x00, 0x90, 0x87, 0x37, 0x94, | 8986 | 0x83, 0x37, 0x5c, 0x00, 0x90, 0x84, 0x35, 0x7c, |
| 8987 | 0x00, 0x90, 0x89, 0x34, 0x5f, 0x00, 0x90, 0x8a, | 8987 | 0x00, 0x90, 0x87, 0x37, 0x94, 0x00, 0x90, 0x89, |
| 8988 | 0x37, 0x9b, 0x00, 0x90, 0xa3, 0x1e, 0x55, 0x00, | 8988 | 0x34, 0x5f, 0x00, 0x90, 0x8a, 0x37, 0x9b, 0x00, |
| 8989 | 0x90, 0xa6, 0x36, 0xcb, 0x00, 0x90, 0xa8, 0x4f, | 8989 | 0x90, 0xa3, 0x1e, 0x55, 0x00, 0x90, 0xa6, 0x36, |
| 8990 | 0x0b, 0x00, 0x90, 0xaa, 0x34, 0x8e, 0x00, 0x90, | 8990 | 0xcb, 0x00, 0x90, 0xa8, 0x4f, 0x0b, 0x00, 0x90, |
| 8991 | 0xf7, 0x35, 0x9d, 0x00, 0x90, 0xfd, 0x0c, 0x4e, | 8991 | 0xaa, 0x34, 0x8e, 0x00, 0x90, 0xf7, 0x35, 0x9d, |
| 8992 | 0x00, 0x91, 0x2d, 0x1e, 0x44, 0x00, 0x91, 0x30, | 8992 | 0x00, 0x90, 0xfd, 0x0c, 0x4e, 0x00, 0x91, 0x2d, |
| 8993 | 0x35, 0x29, 0x00, 0x91, 0x4b, 0x1e, 0x12, 0x00, | 8993 | 0x1e, 0x44, 0x00, 0x91, 0x30, 0x35, 0x29, 0x00, |
| 8994 | 0x91, 0x4c, 0x35, 0xf2, 0x00, 0x91, 0x4d, 0x4f, | 8994 | 0x91, 0x4b, 0x1e, 0x12, 0x00, 0x91, 0x4c, 0x35, |
| 8995 | 0x0c, 0x00, 0x91, 0x56, 0x35, 0x2a, 0x00, 0x91, | 8995 | 0xf2, 0x00, 0x91, 0x4d, 0x4f, 0x0c, 0x00, 0x91, |
| 8996 | 0x58, 0x35, 0x2b, 0x00, 0x91, 0x65, 0x35, 0x2c, | 8996 | 0x56, 0x35, 0x2a, 0x00, 0x91, 0x58, 0x35, 0x2b, |
| 8997 | 0x00, 0x91, 0x72, 0x35, 0x2e, 0x00, 0x91, 0x73, | 8997 | 0x00, 0x91, 0x65, 0x35, 0x2c, 0x00, 0x91, 0x72, |
| 8998 | 0x35, 0x2d, 0x00, 0x91, 0x77, 0x35, 0xd0, 0x00, | 8998 | 0x35, 0x2e, 0x00, 0x91, 0x73, 0x35, 0x2d, 0x00, |
| 8999 | 0x91, 0xa2, 0x35, 0x2f, 0x00, 0x91, 0xaa, 0x35, | 8999 | 0x91, 0x77, 0x35, 0xd0, 0x00, 0x91, 0xa2, 0x35, |
| 9000 | 0x31, 0x00, 0x91, 0xaf, 0x35, 0x30, 0x00, 0x91, | 9000 | 0x2f, 0x00, 0x91, 0xaa, 0x35, 0x31, 0x00, 0x91, |
| 9001 | 0xb1, 0x36, 0x9f, 0x00, 0x91, 0xb4, 0x35, 0x32, | 9001 | 0xaf, 0x35, 0x30, 0x00, 0x91, 0xb1, 0x36, 0x9f, |
| 9002 | 0x00, 0x91, 0xba, 0x35, 0x33, 0x00, 0x91, 0xc1, | 9002 | 0x00, 0x91, 0xb4, 0x35, 0x32, 0x00, 0x91, 0xba, |
| 9003 | 0x1e, 0xc3, 0x00, 0x91, 0xc7, 0x1e, 0x05, 0x00, | 9003 | 0x35, 0x33, 0x00, 0x91, 0xc1, 0x1e, 0xc3, 0x00, |
| 9004 | 0x91, 0xdc, 0x4f, 0x42, 0x00, 0x91, 0xe3, 0x36, | 9004 | 0x91, 0xc7, 0x1e, 0x05, 0x00, 0x91, 0xdc, 0x4f, |
| 9005 | 0x75, 0x00, 0x91, 0xfc, 0x3c, 0x2c, 0x00, 0x92, | 9005 | 0x42, 0x00, 0x91, 0xe3, 0x36, 0x75, 0x00, 0x91, |
| 9006 | 0x37, 0x34, 0x7d, 0x00, 0x92, 0x5b, 0x34, 0x69, | 9006 | 0xfc, 0x3c, 0x2c, 0x00, 0x92, 0x37, 0x34, 0x7d, |
| 9007 | 0x00, 0x92, 0xe9, 0x4f, 0x0d, 0x00, 0x93, 0x06, | 9007 | 0x00, 0x92, 0x5b, 0x34, 0x69, 0x00, 0x92, 0xe9, |
| 9008 | 0x1e, 0x0a, 0x00, 0x93, 0x35, 0x4f, 0x0e, 0x00, | 9008 | 0x4f, 0x0d, 0x00, 0x93, 0x06, 0x1e, 0x0a, 0x00, |
| 9009 | 0x93, 0x65, 0x3b, 0x86, 0x00, 0x93, 0x75, 0x4f, | 9009 | 0x93, 0x35, 0x4f, 0x0e, 0x00, 0x93, 0x65, 0x3b, |
| 9010 | 0x34, 0x00, 0x93, 0x8b, 0x4f, 0x0f, 0x00, 0x93, | 9010 | 0x86, 0x00, 0x93, 0x75, 0x4f, 0x34, 0x00, 0x93, |
| 9011 | 0x8c, 0x35, 0x76, 0x00, 0x93, 0x96, 0x35, 0xd5, | 9011 | 0x8b, 0x4f, 0x0f, 0x00, 0x93, 0x8c, 0x35, 0x76, |
| 9012 | 0x00, 0x93, 0x9a, 0x1e, 0x41, 0x00, 0x93, 0xa1, | 9012 | 0x00, 0x93, 0x96, 0x35, 0xd5, 0x00, 0x93, 0x9a, |
| 9013 | 0x59, 0x04, 0x00, 0x93, 0xae, 0x34, 0x3a, 0x00, | 9013 | 0x1e, 0x41, 0x00, 0x93, 0xa1, 0x59, 0x04, 0x00, |
| 9014 | 0x93, 0xdd, 0x37, 0xae, 0x00, 0x94, 0x3a, 0x4f, | 9014 | 0x93, 0xae, 0x34, 0x3a, 0x00, 0x93, 0xdd, 0x37, |
| 9015 | 0x10, 0x00, 0x94, 0x53, 0x1e, 0x79, 0x00, 0x94, | 9015 | 0xae, 0x00, 0x94, 0x3a, 0x4f, 0x10, 0x00, 0x94, |
| 9016 | 0x77, 0x35, 0x34, 0x00, 0x95, 0x92, 0x35, 0x7d, | 9016 | 0x53, 0x1e, 0x79, 0x00, 0x94, 0x77, 0x35, 0x34, |
| 9017 | 0x00, 0x95, 0xab, 0x3b, 0x9a, 0x00, 0x95, 0xbb, | 9017 | 0x00, 0x95, 0x92, 0x35, 0x7d, 0x00, 0x95, 0xab, |
| 9018 | 0x1e, 0xc4, 0x00, 0x95, 0xbc, 0x37, 0xaf, 0x00, | 9018 | 0x3b, 0x9a, 0x00, 0x95, 0xbb, 0x1e, 0xc4, 0x00, |
| 9019 | 0x95, 0xcd, 0x4f, 0x11, 0x00, 0x96, 0x2a, 0x4f, | 9019 | 0x95, 0xbc, 0x37, 0xaf, 0x00, 0x95, 0xcd, 0x4f, |
| 9020 | 0x12, 0x00, 0x96, 0x4d, 0x34, 0x87, 0x00, 0x96, | 9020 | 0x11, 0x00, 0x96, 0x2a, 0x4f, 0x12, 0x00, 0x96, |
| 9021 | 0x86, 0x34, 0x51, 0x00, 0x96, 0x8a, 0x36, 0x53, | 9021 | 0x4d, 0x34, 0x87, 0x00, 0x96, 0x86, 0x34, 0x51, |
| 9022 | 0x00, 0x96, 0x94, 0x35, 0x73, 0x00, 0x96, 0x98, | 9022 | 0x00, 0x96, 0x8a, 0x36, 0x53, 0x00, 0x96, 0x94, |
| 9023 | 0x35, 0x35, 0x00, 0x96, 0x99, 0x4f, 0x31, 0x00, | 9023 | 0x35, 0x73, 0x00, 0x96, 0x98, 0x35, 0x35, 0x00, |
| 9024 | 0x96, 0xa3, 0x34, 0xca, 0x00, 0x96, 0xa7, 0x4f, | 9024 | 0x96, 0x99, 0x4f, 0x31, 0x00, 0x96, 0xa3, 0x34, |
| 9025 | 0x14, 0x00, 0x96, 0xb2, 0x37, 0xb1, 0x00, 0x96, | 9025 | 0xca, 0x00, 0x96, 0xa7, 0x4f, 0x14, 0x00, 0x96, |
| 9026 | 0xbb, 0x36, 0x35, 0x00, 0x96, 0xc5, 0x34, 0x6c, | 9026 | 0xb2, 0x37, 0xb1, 0x00, 0x96, 0xbb, 0x36, 0x35, |
| 9027 | 0x00, 0x96, 0xc7, 0x35, 0xbe, 0x00, 0x96, 0xd9, | 9027 | 0x00, 0x96, 0xc5, 0x34, 0x6c, 0x00, 0x96, 0xc7, |
| 9028 | 0x34, 0xd5, 0x00, 0x96, 0xda, 0x59, 0x3b, 0x00, | 9028 | 0x35, 0xbe, 0x00, 0x96, 0xd9, 0x34, 0xd5, 0x00, |
| 9029 | 0x96, 0xe3, 0x0c, 0xc9, 0x00, 0x96, 0xe8, 0x35, | 9029 | 0x96, 0xda, 0x59, 0x3b, 0x00, 0x96, 0xe3, 0x0c, |
| 9030 | 0x4d, 0x00, 0x96, 0xea, 0x36, 0x39, 0x00, 0x96, | 9030 | 0xc9, 0x00, 0x96, 0xe8, 0x35, 0x4d, 0x00, 0x96, |
| 9031 | 0xf0, 0x34, 0xc0, 0x00, 0x97, 0x21, 0x59, 0x41, | 9031 | 0xea, 0x36, 0x39, 0x00, 0x96, 0xf0, 0x34, 0xc0, |
| 9032 | 0x00, 0x97, 0x24, 0x1e, 0xc6, 0x00, 0x97, 0x3d, | 9032 | 0x00, 0x97, 0x21, 0x59, 0x41, 0x00, 0x97, 0x24, |
| 9033 | 0x35, 0x36, 0x00, 0x97, 0x55, 0x21, 0xf8, 0x00, | 9033 | 0x1e, 0xc6, 0x00, 0x97, 0x3d, 0x35, 0x36, 0x00, |
| 9034 | 0x97, 0x56, 0x21, 0x8b, 0x00, 0x97, 0x59, 0x37, | 9034 | 0x97, 0x55, 0x21, 0xf8, 0x00, 0x97, 0x56, 0x21, |
| 9035 | 0xb2, 0x00, 0x97, 0x5c, 0x36, 0x31, 0x00, 0x97, | 9035 | 0x8b, 0x00, 0x97, 0x59, 0x37, 0xb2, 0x00, 0x97, |
| 9036 | 0x60, 0x1e, 0xc7, 0x00, 0x97, 0x6d, 0x1e, 0xc8, | 9036 | 0x5c, 0x36, 0x31, 0x00, 0x97, 0x60, 0x1e, 0xc7, |
| 9037 | 0x00, 0x97, 0x71, 0x1e, 0x1e, 0x00, 0x97, 0x74, | 9037 | 0x00, 0x97, 0x6d, 0x1e, 0xc8, 0x00, 0x97, 0x71, |
| 9038 | 0x1d, 0xf3, 0x00, 0x97, 0x84, 0x1d, 0xe5, 0x00, | 9038 | 0x1e, 0x1e, 0x00, 0x97, 0x74, 0x1d, 0xf3, 0x00, |
| 9039 | 0x97, 0x98, 0x1e, 0x1c, 0x00, 0x97, 0xad, 0x4f, | 9039 | 0x97, 0x84, 0x1d, 0xe5, 0x00, 0x97, 0x98, 0x1e, |
| 9040 | 0x43, 0x00, 0x97, 0xd3, 0x35, 0x7e, 0x00, 0x97, | 9040 | 0x1c, 0x00, 0x97, 0xad, 0x4f, 0x43, 0x00, 0x97, |
| 9041 | 0xde, 0x3c, 0x2e, 0x00, 0x97, 0xf3, 0x35, 0x60, | 9041 | 0xd3, 0x35, 0x7e, 0x00, 0x97, 0xde, 0x3c, 0x2e, |
| 9042 | 0x00, 0x97, 0xff, 0x34, 0x19, 0x00, 0x98, 0x0c, | 9042 | 0x00, 0x97, 0xf3, 0x35, 0x60, 0x00, 0x97, 0xff, |
| 9043 | 0x35, 0x39, 0x00, 0x98, 0x11, 0x34, 0x74, 0x00, | 9043 | 0x34, 0x19, 0x00, 0x98, 0x0c, 0x35, 0x39, 0x00, |
| 9044 | 0x98, 0x12, 0x34, 0xb2, 0x00, 0x98, 0x13, 0x1e, | 9044 | 0x98, 0x11, 0x34, 0x74, 0x00, 0x98, 0x12, 0x34, |
| 9045 | 0x54, 0x00, 0x98, 0x24, 0x1e, 0xc9, 0x00, 0x98, | 9045 | 0xb2, 0x00, 0x98, 0x13, 0x1e, 0x54, 0x00, 0x98, |
| 9046 | 0x3b, 0x0d, 0xc3, 0x00, 0x98, 0x5e, 0x0f, 0xa8, | 9046 | 0x24, 0x1e, 0xc9, 0x00, 0x98, 0x3b, 0x0d, 0xc3, |
| 9047 | 0x00, 0x98, 0x67, 0x35, 0xbf, 0x00, 0x98, 0x73, | 9047 | 0x00, 0x98, 0x5e, 0x0f, 0xa8, 0x00, 0x98, 0x67, |
| 9048 | 0x35, 0x3a, 0x00, 0x98, 0xc3, 0x35, 0x3b, 0x00, | 9048 | 0x35, 0xbf, 0x00, 0x98, 0x73, 0x35, 0x3a, 0x00, |
| 9049 | 0x98, 0xdf, 0x36, 0x17, 0x00, 0x98, 0xe2, 0x35, | 9049 | 0x98, 0xc3, 0x35, 0x3b, 0x00, 0x98, 0xdf, 0x36, |
| 9050 | 0x89, 0x00, 0x98, 0xeb, 0x37, 0xb4, 0x00, 0x98, | 9050 | 0x17, 0x00, 0x98, 0xe2, 0x35, 0x89, 0x00, 0x98, |
| 9051 | 0xef, 0x0d, 0x67, 0x00, 0x98, 0xf4, 0x1d, 0xd2, | 9051 | 0xeb, 0x37, 0xb4, 0x00, 0x98, 0xef, 0x0d, 0x67, |
| 9052 | 0x00, 0x98, 0xfc, 0x21, 0xfc, 0x00, 0x98, 0xfd, | 9052 | 0x00, 0x98, 0xf4, 0x1d, 0xd2, 0x00, 0x98, 0xfc, |
| 9053 | 0x36, 0xcd, 0x00, 0x98, 0xfe, 0x36, 0x14, 0x00, | 9053 | 0x21, 0xfc, 0x00, 0x98, 0xfd, 0x36, 0xcd, 0x00, |
| 9054 | 0x99, 0x03, 0x37, 0xb5, 0x00, 0x99, 0x05, 0x1e, | 9054 | 0x98, 0xfe, 0x36, 0x14, 0x00, 0x99, 0x03, 0x37, |
| 9055 | 0x77, 0x00, 0x99, 0x09, 0x37, 0xb6, 0x00, 0x99, | 9055 | 0xb5, 0x00, 0x99, 0x05, 0x1e, 0x77, 0x00, 0x99, |
| 9056 | 0x0a, 0x37, 0x00, 0x00, 0x99, 0x0c, 0x1d, 0xdb, | 9056 | 0x09, 0x37, 0xb6, 0x00, 0x99, 0x0a, 0x37, 0x00, |
| 9057 | 0x00, 0x99, 0x10, 0x1f, 0x22, 0x00, 0x99, 0x13, | 9057 | 0x00, 0x99, 0x0c, 0x1d, 0xdb, 0x00, 0x99, 0x10, |
| 9058 | 0x35, 0x68, 0x00, 0x99, 0x21, 0x4f, 0x18, 0x00, | 9058 | 0x1f, 0x22, 0x00, 0x99, 0x13, 0x35, 0x68, 0x00, |
| 9059 | 0x99, 0x28, 0x21, 0xfe, 0x00, 0x99, 0x45, 0x37, | 9059 | 0x99, 0x21, 0x4f, 0x18, 0x00, 0x99, 0x28, 0x21, |
| 9060 | 0xb7, 0x00, 0x99, 0x4b, 0x37, 0xb9, 0x00, 0x99, | 9060 | 0xfe, 0x00, 0x99, 0x45, 0x37, 0xb7, 0x00, 0x99, |
| 9061 | 0x57, 0x1f, 0x20, 0x00, 0x99, 0xc1, 0x4f, 0x40, | 9061 | 0x4b, 0x37, 0xb9, 0x00, 0x99, 0x57, 0x1f, 0x20, |
| 9062 | 0x00, 0x99, 0xd0, 0x36, 0x67, 0x00, 0x9a, 0x19, | 9062 | 0x00, 0x99, 0xc1, 0x4f, 0x40, 0x00, 0x99, 0xd0, |
| 9063 | 0x1f, 0x43, 0x00, 0x9a, 0x30, 0x36, 0x89, 0x00, | 9063 | 0x36, 0x67, 0x00, 0x9a, 0x19, 0x1f, 0x43, 0x00, |
| 9064 | 0x9a, 0x45, 0x35, 0x3c, 0x00, 0x9a, 0x4a, 0x59, | 9064 | 0x9a, 0x30, 0x36, 0x89, 0x00, 0x9a, 0x45, 0x35, |
| 9065 | 0x88, 0x00, 0x9a, 0x5f, 0x37, 0xbb, 0x00, 0x9a, | 9065 | 0x3c, 0x00, 0x9a, 0x4a, 0x59, 0x88, 0x00, 0x9a, |
| 9066 | 0x65, 0x37, 0xbc, 0x00, 0x9a, 0xef, 0x37, 0xbd, | 9066 | 0x5f, 0x37, 0xbb, 0x00, 0x9a, 0x65, 0x37, 0xbc, |
| 9067 | 0x00, 0x9b, 0x18, 0x37, 0xbe, 0x00, 0x9b, 0x2d, | 9067 | 0x00, 0x9a, 0xef, 0x37, 0xbd, 0x00, 0x9b, 0x18, |
| 9068 | 0x34, 0x3c, 0x00, 0x9b, 0x2e, 0x1e, 0xca, 0x00, | 9068 | 0x37, 0xbe, 0x00, 0x9b, 0x2d, 0x34, 0x3c, 0x00, |
| 9069 | 0x9b, 0x35, 0x59, 0xa4, 0x00, 0x9b, 0x4d, 0x35, | 9069 | 0x9b, 0x2e, 0x1e, 0xca, 0x00, 0x9b, 0x35, 0x59, |
| 9070 | 0x3d, 0x00, 0x9b, 0x54, 0x36, 0xdb, 0x00, 0x9b, | 9070 | 0xa4, 0x00, 0x9b, 0x4d, 0x35, 0x3d, 0x00, 0x9b, |
| 9071 | 0x58, 0x35, 0x3e, 0x00, 0x9b, 0x97, 0x1e, 0xcb, | 9071 | 0x54, 0x36, 0xdb, 0x00, 0x9b, 0x58, 0x35, 0x3e, |
| 9072 | 0x00, 0x9b, 0xa8, 0x4f, 0x1a, 0x00, 0x9b, 0xab, | 9072 | 0x00, 0x9b, 0x97, 0x1e, 0xcb, 0x00, 0x9b, 0xa8, |
| 9073 | 0x4f, 0x38, 0x00, 0x9b, 0xae, 0x4f, 0x1b, 0x00, | 9073 | 0x4f, 0x1a, 0x00, 0x9b, 0xab, 0x4f, 0x38, 0x00, |
| 9074 | 0x9b, 0xb9, 0x4f, 0x1c, 0x00, 0x9b, 0xc6, 0x35, | 9074 | 0x9b, 0xae, 0x4f, 0x1b, 0x00, 0x9b, 0xb9, 0x4f, |
| 9075 | 0x3f, 0x00, 0x9b, 0xd6, 0x1e, 0x09, 0x00, 0x9b, | 9075 | 0x1c, 0x00, 0x9b, 0xc6, 0x35, 0x3f, 0x00, 0x9b, |
| 9076 | 0xdb, 0x36, 0x54, 0x00, 0x9b, 0xe1, 0x35, 0x40, | 9076 | 0xd6, 0x1e, 0x09, 0x00, 0x9b, 0xdb, 0x36, 0x54, |
| 9077 | 0x00, 0x9b, 0xf1, 0x35, 0x41, 0x00, 0x9b, 0xf2, | 9077 | 0x00, 0x9b, 0xe1, 0x35, 0x40, 0x00, 0x9b, 0xf1, |
| 9078 | 0x1e, 0xcc, 0x00, 0x9c, 0x08, 0x4f, 0x1d, 0x00, | 9078 | 0x35, 0x41, 0x00, 0x9b, 0xf2, 0x1e, 0xcc, 0x00, |
| 9079 | 0x9c, 0x24, 0x4f, 0x1e, 0x00, 0x9c, 0x2f, 0x1d, | 9079 | 0x9c, 0x08, 0x4f, 0x1d, 0x00, 0x9c, 0x24, 0x4f, |
| 9080 | 0xd4, 0x00, 0x9c, 0x3b, 0x4f, 0x1f, 0x00, 0x9c, | 9080 | 0x1e, 0x00, 0x9c, 0x2f, 0x1d, 0xd4, 0x00, 0x9c, |
| 9081 | 0x48, 0x1e, 0x39, 0x00, 0x9c, 0x52, 0x1e, 0x74, | 9081 | 0x3b, 0x4f, 0x1f, 0x00, 0x9c, 0x48, 0x1e, 0x39, |
| 9082 | 0x00, 0x9c, 0x57, 0x37, 0x0c, 0x00, 0x9c, 0xe6, | 9082 | 0x00, 0x9c, 0x52, 0x1e, 0x74, 0x00, 0x9c, 0x57, |
| 9083 | 0x4f, 0x21, 0x00, 0x9d, 0x07, 0x1e, 0x4f, 0x00, | 9083 | 0x37, 0x0c, 0x00, 0x9c, 0xe6, 0x4f, 0x21, 0x00, |
| 9084 | 0x9d, 0x08, 0x37, 0xc1, 0x00, 0x9d, 0x09, 0x37, | 9084 | 0x9d, 0x07, 0x1e, 0x4f, 0x00, 0x9d, 0x08, 0x37, |
| 9085 | 0xc0, 0x00, 0x9d, 0x48, 0x35, 0x42, 0x00, 0x9d, | 9085 | 0xc1, 0x00, 0x9d, 0x09, 0x37, 0xc0, 0x00, 0x9d, |
| 9086 | 0x60, 0x1e, 0x03, 0x00, 0x9d, 0x6c, 0x36, 0xce, | 9086 | 0x48, 0x35, 0x42, 0x00, 0x9d, 0x60, 0x1e, 0x03, |
| 9087 | 0x00, 0x9d, 0xb4, 0x0b, 0xfd, 0x00, 0x9d, 0xbf, | 9087 | 0x00, 0x9d, 0x6c, 0x36, 0xce, 0x00, 0x9d, 0xb4, |
| 9088 | 0x59, 0xde, 0x00, 0x9d, 0xc0, 0x4f, 0x22, 0x00, | 9088 | 0x0b, 0xfd, 0x00, 0x9d, 0xbf, 0x59, 0xde, 0x00, |
| 9089 | 0x9d, 0xc2, 0x4f, 0x23, 0x00, 0x9d, 0xcf, 0x35, | 9089 | 0x9d, 0xc0, 0x4f, 0x22, 0x00, 0x9d, 0xc2, 0x4f, |
| 9090 | 0x43, 0x00, 0x9e, 0x97, 0x34, 0xcc, 0x00, 0x9e, | 9090 | 0x23, 0x00, 0x9d, 0xcf, 0x35, 0x43, 0x00, 0x9e, |
| 9091 | 0x9f, 0x34, 0xcb, 0x00, 0x9e, 0xa5, 0x37, 0xc2, | 9091 | 0x97, 0x34, 0xcc, 0x00, 0x9e, 0x9f, 0x34, 0xcb, |
| 9092 | 0x00, 0x9e, 0xaa, 0x1e, 0xcd, 0x00, 0x9e, 0xad, | 9092 | 0x00, 0x9e, 0xa5, 0x37, 0xc2, 0x00, 0x9e, 0xaa, |
| 9093 | 0x1f, 0x44, 0x00, 0x9e, 0xbb, 0x36, 0xdc, 0x00, | 9093 | 0x1e, 0xcd, 0x00, 0x9e, 0xad, 0x1f, 0x44, 0x00, |
| 9094 | 0x9e, 0xbf, 0x36, 0xe2, 0x00, 0x9e, 0xcc, 0x37, | 9094 | 0x9e, 0xbb, 0x36, 0xdc, 0x00, 0x9e, 0xbf, 0x36, |
| 9095 | 0xc3, 0x00, 0x9e, 0xdb, 0x1e, 0x31, 0x00, 0x9f, | 9095 | 0xe2, 0x00, 0x9e, 0xcc, 0x37, 0xc3, 0x00, 0x9e, |
| 9096 | 0x08, 0x35, 0x44, 0x00, 0x9f, 0x3b, 0x36, 0xa9, | 9096 | 0xdb, 0x1e, 0x31, 0x00, 0x9f, 0x08, 0x35, 0x44, |
| 9097 | 0x00, 0x9f, 0x4a, 0x37, 0xc5, 0x00, 0x9f, 0x4b, | 9097 | 0x00, 0x9f, 0x3b, 0x36, 0xa9, 0x00, 0x9f, 0x4a, |
| 9098 | 0x37, 0x5a, 0x00, 0x9f, 0x4e, 0x35, 0x24, 0x00, | 9098 | 0x37, 0xc5, 0x00, 0x9f, 0x4b, 0x37, 0x5a, 0x00, |
| 9099 | 0x9f, 0x67, 0x37, 0xc7, 0x00, 0x9f, 0x8d, 0x37, | 9099 | 0x9f, 0x4e, 0x35, 0x24, 0x00, 0x9f, 0x67, 0x37, |
| 9100 | 0x06, 0x00, 0x9f, 0x9c, 0x1e, 0xce, 0x00, 0x9f, | 9100 | 0xc7, 0x00, 0x9f, 0x8d, 0x37, 0x06, 0x00, 0x9f, |
| 9101 | 0x9d, 0x1e, 0xa7, 0x00, 0xfa, 0x11, 0x20, 0xfb, | 9101 | 0x9c, 0x1e, 0xce, 0x00, 0x9f, 0x9d, 0x1e, 0xa7, |
| 9102 | 0x00, 0xfa, 0x24, 0x21, 0xb8, 0x02, 0x35, 0xc4, | 9102 | 0x00, 0xfa, 0x11, 0x20, 0xfb, 0x00, 0xfa, 0x24, |
| 9103 | 0x3c, 0x44, 0x02, 0x36, 0x3a, 0x35, 0x9b, 0x02, | 9103 | 0x21, 0xb8, 0x02, 0x35, 0xc4, 0x3c, 0x44, 0x02, |
| 9104 | 0x38, 0x3d, 0x4f, 0x26, 0x02, 0x42, 0xee, 0x37, | 9104 | 0x36, 0x3a, 0x35, 0x9b, 0x02, 0x38, 0x3d, 0x4f, |
| 9105 | 0xc9, 0x02, 0x62, 0x70, 0x37, 0x6e, 0x02, 0x9d, | 9105 | 0x26, 0x02, 0x42, 0xee, 0x37, 0xc9, 0x02, 0x62, |
| 9106 | 0x4b, 0x35, 0x96, 0x02, 0x9e, 0x3d, 0x3c, 0x4d, | 9106 | 0x70, 0x37, 0x6e, 0x02, 0x9d, 0x4b, 0x35, 0x96, |
| 9107 | 0x02, 0xa6, 0x1a, 0x37, 0xc8, 0x00, 0x00, 0x00, | 9107 | 0x02, 0x9e, 0x3d, 0x3c, 0x4d, 0x02, 0xa6, 0x1a, |
| 9108 | 0x7f, 0x00, 0x34, 0x02, 0x35, 0x83, 0x00, 0x50, | 9108 | 0x37, 0xc8, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x34, |
| 9109 | 0x91, 0x35, 0xaf, 0x00, 0x50, 0xca, 0x37, 0x15, | 9109 | 0x02, 0x35, 0x83, 0x00, 0x50, 0x91, 0x35, 0xaf, |
| 9110 | 0x00, 0x51, 0x54, 0x37, 0x17, 0x00, 0x51, 0x95, | 9110 | 0x00, 0x50, 0xca, 0x37, 0x15, 0x00, 0x51, 0x54, |
| 9111 | 0x37, 0x18, 0x00, 0x51, 0xb4, 0x35, 0xdb, 0x00, | 9111 | 0x37, 0x17, 0x00, 0x51, 0x95, 0x37, 0x18, 0x00, |
| 9112 | 0x51, 0xde, 0x38, 0x10, 0x00, 0x52, 0x72, 0x4e, | 9112 | 0x51, 0xb4, 0x35, 0xdb, 0x00, 0x51, 0xde, 0x38, |
| 9113 | 0x76, 0x00, 0x53, 0x7f, 0x1d, 0xed, 0x00, 0x53, | 9113 | 0x10, 0x00, 0x52, 0x72, 0x4e, 0x76, 0x00, 0x53, |
| 9114 | 0xa9, 0x1f, 0x1c, 0x00, 0x55, 0x33, 0x37, 0x21, | 9114 | 0x7f, 0x1d, 0xed, 0x00, 0x53, 0xa9, 0x1f, 0x1c, |
| 9115 | 0x00, 0x55, 0xa9, 0x34, 0xd6, 0x00, 0x55, 0xab, | 9115 | 0x00, 0x55, 0x33, 0x37, 0x21, 0x00, 0x55, 0xa9, |
| 9116 | 0x4e, 0x7c, 0x00, 0x55, 0xe4, 0x37, 0x22, 0x00, | 9116 | 0x34, 0xd6, 0x00, 0x55, 0xab, 0x4e, 0x7c, 0x00, |
| 9117 | 0x56, 0xae, 0x4e, 0x7e, 0x00, 0x57, 0xf4, 0x36, | 9117 | 0x55, 0xe4, 0x37, 0x22, 0x00, 0x56, 0xae, 0x4e, |
| 9118 | 0x13, 0x00, 0x58, 0x5a, 0x20, 0xe6, 0x00, 0x59, | 9118 | 0x7e, 0x00, 0x57, 0xf4, 0x36, 0x13, 0x00, 0x58, |
| 9119 | 0x51, 0x4e, 0x88, 0x00, 0x59, 0xff, 0x35, 0xe1, | 9119 | 0x5a, 0x20, 0xe6, 0x00, 0x59, 0x51, 0x4e, 0x88, |
| 9120 | 0x00, 0x5a, 0xbe, 0x34, 0xdc, 0x00, 0x5b, 0xb3, | 9120 | 0x00, 0x59, 0xff, 0x35, 0xe1, 0x00, 0x5a, 0xbe, |
| 9121 | 0x35, 0x6b, 0x00, 0x5c, 0x0a, 0x36, 0x4e, 0x00, | 9121 | 0x34, 0xdc, 0x00, 0x5b, 0xb3, 0x35, 0x6b, 0x00, |
| 9122 | 0x5c, 0x0f, 0x36, 0x0a, 0x00, 0x5e, 0xca, 0x34, | 9122 | 0x5c, 0x0a, 0x36, 0x4e, 0x00, 0x5c, 0x0f, 0x36, |
| 9123 | 0x59, 0x00, 0x5e, 0xe3, 0x4e, 0x93, 0x00, 0x5e, | 9123 | 0x0a, 0x00, 0x5e, 0xca, 0x34, 0x59, 0x00, 0x5e, |
| 9124 | 0xf6, 0x35, 0x56, 0x00, 0x60, 0x62, 0x4f, 0x2d, | 9124 | 0xe3, 0x4e, 0x93, 0x00, 0x5e, 0xf6, 0x35, 0x56, |
| 9125 | 0x00, 0x60, 0x97, 0x37, 0x30, 0x00, 0x61, 0x67, | 9125 | 0x00, 0x60, 0x62, 0x4f, 0x2d, 0x00, 0x60, 0x97, |
| 9126 | 0x35, 0xad, 0x00, 0x61, 0x68, 0x34, 0x6e, 0x00, | 9126 | 0x37, 0x30, 0x00, 0x61, 0x67, 0x35, 0xad, 0x00, |
| 9127 | 0x61, 0xb2, 0x4e, 0x98, 0x00, 0x61, 0xf2, 0x36, | 9127 | 0x61, 0x68, 0x34, 0x6e, 0x00, 0x61, 0xb2, 0x4e, |
| 9128 | 0x6a, 0x00, 0x62, 0x49, 0x34, 0xb4, 0x00, 0x66, | 9128 | 0x98, 0x00, 0x61, 0xf2, 0x36, 0x6a, 0x00, 0x62, |
| 9129 | 0x5f, 0x37, 0x38, 0x00, 0x66, 0xc1, 0x4e, 0xac, | 9129 | 0x49, 0x34, 0xb4, 0x00, 0x66, 0x5f, 0x37, 0x38, |
| 9130 | 0x00, 0x67, 0x15, 0x36, 0x70, 0x00, 0x67, 0x17, | 9130 | 0x00, 0x66, 0xc1, 0x4e, 0xac, 0x00, 0x67, 0x15, |
| 9131 | 0x21, 0x29, 0x00, 0x67, 0x1b, 0x36, 0xd5, 0x00, | 9131 | 0x36, 0x70, 0x00, 0x67, 0x17, 0x21, 0x29, 0x00, |
| 9132 | 0x68, 0x5d, 0x36, 0xde, 0x00, 0x68, 0x7a, 0x36, | 9132 | 0x67, 0x1b, 0x36, 0xd5, 0x00, 0x68, 0x5d, 0x36, |
| 9133 | 0xf1, 0x00, 0x69, 0x0d, 0x36, 0x15, 0x00, 0x69, | 9133 | 0xde, 0x00, 0x68, 0x7a, 0x36, 0xf1, 0x00, 0x69, |
| 9134 | 0x82, 0x34, 0x6f, 0x00, 0x6a, 0xdb, 0x35, 0xa9, | 9134 | 0x0d, 0x36, 0x15, 0x00, 0x69, 0x82, 0x34, 0x6f, |
| 9135 | 0x00, 0x6b, 0x21, 0x35, 0xe8, 0x00, 0x6c, 0x08, | 9135 | 0x00, 0x6a, 0xdb, 0x35, 0xa9, 0x00, 0x6b, 0x21, |
| 9136 | 0x34, 0xf4, 0x00, 0x6c, 0xaa, 0x4e, 0xbb, 0x00, | 9136 | 0x35, 0xe8, 0x00, 0x6c, 0x08, 0x34, 0xf4, 0x00, |
| 9137 | 0x6c, 0xbf, 0x34, 0x68, 0x00, 0x6c, 0xe8, 0x32, | 9137 | 0x6c, 0xaa, 0x4e, 0xbb, 0x00, 0x6c, 0xbf, 0x34, |
| 9138 | 0x45, 0x00, 0x6d, 0x3e, 0x36, 0x96, 0x00, 0x6e, | 9138 | 0x68, 0x00, 0x6c, 0xe8, 0x32, 0x45, 0x00, 0x6d, |
| 9139 | 0x23, 0x34, 0xf6, 0x00, 0x6e, 0xa2, 0x52, 0x4f, | 9139 | 0x3e, 0x36, 0x96, 0x00, 0x6e, 0x23, 0x34, 0xf6, |
| 9140 | 0x00, 0x6e, 0xcb, 0x4e, 0xc1, 0x00, 0x6f, 0x11, | 9140 | 0x00, 0x6e, 0xa2, 0x52, 0x4f, 0x00, 0x6e, 0xcb, |
| 9141 | 0x37, 0x45, 0x00, 0x6f, 0x5b, 0x4e, 0xc5, 0x00, | 9141 | 0x4e, 0xc1, 0x00, 0x6f, 0x11, 0x37, 0x45, 0x00, |
| 9142 | 0x71, 0x7d, 0x1f, 0x24, 0x00, 0x72, 0x35, 0x35, | 9142 | 0x6f, 0x5b, 0x4e, 0xc5, 0x00, 0x71, 0x7d, 0x1f, |
| 9143 | 0xf0, 0x00, 0x73, 0x36, 0x36, 0xf9, 0x00, 0x73, | 9143 | 0x24, 0x00, 0x72, 0x35, 0x35, 0xf0, 0x00, 0x73, |
| 9144 | 0x37, 0x36, 0xfa, 0x00, 0x73, 0xca, 0x4e, 0xcc, | 9144 | 0x36, 0x36, 0xf9, 0x00, 0x73, 0x37, 0x36, 0xfa, |
| 9145 | 0x00, 0x75, 0x11, 0x35, 0xd2, 0x00, 0x75, 0x15, | 9145 | 0x00, 0x73, 0xca, 0x4e, 0xcc, 0x00, 0x75, 0x11, |
| 9146 | 0x4f, 0x2b, 0x00, 0x79, 0x53, 0x37, 0x59, 0x00, | 9146 | 0x35, 0xd2, 0x00, 0x75, 0x15, 0x4f, 0x2b, 0x00, |
| 9147 | 0x7a, 0x74, 0x35, 0xb1, 0x00, 0x7b, 0x08, 0x4f, | 9147 | 0x79, 0x53, 0x37, 0x59, 0x00, 0x7a, 0x74, 0x35, |
| 9148 | 0x27, 0x00, 0x7b, 0xc0, 0x36, 0x37, 0x00, 0x7c, | 9148 | 0xb1, 0x00, 0x7b, 0x08, 0x4f, 0x27, 0x00, 0x7b, |
| 9149 | 0x3e, 0x4f, 0x29, 0x00, 0x7c, 0x50, 0x4e, 0xdb, | 9149 | 0xc0, 0x36, 0x37, 0x00, 0x7c, 0x3e, 0x4f, 0x29, |
| 9150 | 0x00, 0x7c, 0x7e, 0x4f, 0x45, 0x00, 0x7d, 0xb2, | 9150 | 0x00, 0x7c, 0x50, 0x4e, 0xdb, 0x00, 0x7c, 0x7e, |
| 9151 | 0x4e, 0xde, 0x00, 0x7e, 0x22, 0x37, 0x66, 0x00, | 9151 | 0x4f, 0x45, 0x00, 0x7d, 0xb2, 0x4e, 0xde, 0x00, |
| 9152 | 0x7e, 0x35, 0x37, 0x68, 0x00, 0x7f, 0xc1, 0x35, | 9152 | 0x7e, 0x22, 0x37, 0x66, 0x00, 0x7e, 0x35, 0x37, |
| 9153 | 0x5e, 0x00, 0x7f, 0xe1, 0x4e, 0xe0, 0x00, 0x7f, | 9153 | 0x68, 0x00, 0x7f, 0xc1, 0x35, 0x5e, 0x00, 0x7f, |
| 9154 | 0xe9, 0x37, 0x71, 0x00, 0x7f, 0xfc, 0x37, 0x02, | 9154 | 0xe1, 0x4e, 0xe0, 0x00, 0x7f, 0xe9, 0x37, 0x71, |
| 9155 | 0x00, 0x81, 0x08, 0x36, 0xe3, 0x00, 0x82, 0x39, | 9155 | 0x00, 0x7f, 0xfc, 0x37, 0x02, 0x00, 0x81, 0x08, |
| 9156 | 0x36, 0x3e, 0x00, 0x82, 0x79, 0x37, 0x76, 0x00, | 9156 | 0x36, 0xe3, 0x00, 0x82, 0x39, 0x36, 0x3e, 0x00, |
| 9157 | 0x82, 0xbd, 0x34, 0x6b, 0x00, 0x83, 0xdf, 0x1f, | 9157 | 0x82, 0x79, 0x37, 0x76, 0x00, 0x82, 0xbd, 0x34, |
| 9158 | 0x28, 0x00, 0x85, 0x3d, 0x34, 0xc1, 0x00, 0x86, | 9158 | 0x6b, 0x00, 0x83, 0xdf, 0x1f, 0x28, 0x00, 0x85, |
| 9159 | 0x12, 0x52, 0x51, 0x00, 0x87, 0xd2, 0x1f, 0x42, | 9159 | 0x3d, 0x34, 0xc1, 0x00, 0x86, 0x12, 0x52, 0x51, |
| 9160 | 0x00, 0x88, 0x05, 0x4f, 0x47, 0x00, 0x88, 0x36, | 9160 | 0x00, 0x87, 0xd2, 0x1f, 0x42, 0x00, 0x88, 0x05, |
| 9161 | 0x37, 0x87, 0x00, 0x8a, 0x0a, 0x36, 0x25, 0x00, | 9161 | 0x4f, 0x47, 0x00, 0x88, 0x36, 0x37, 0x87, 0x00, |
| 9162 | 0x8a, 0x1d, 0x4f, 0x2c, 0x00, 0x8a, 0x95, 0x36, | 9162 | 0x8a, 0x0a, 0x36, 0x25, 0x00, 0x8a, 0x1d, 0x4f, |
| 9163 | 0x5d, 0x00, 0x8a, 0xee, 0x35, 0xe4, 0x00, 0x8b, | 9163 | 0x2c, 0x00, 0x8a, 0x95, 0x36, 0x5d, 0x00, 0x8a, |
| 9164 | 0x56, 0x4e, 0xf9, 0x00, 0x8c, 0xa0, 0x36, 0xb6, | 9164 | 0xee, 0x35, 0xe4, 0x00, 0x8b, 0x56, 0x4e, 0xf9, |
| 9165 | 0x00, 0x8c, 0xc7, 0x35, 0xe6, 0x00, 0x8c, 0xca, | 9165 | 0x00, 0x8c, 0xa0, 0x36, 0xb6, 0x00, 0x8c, 0xc7, |
| 9166 | 0x4e, 0xff, 0x00, 0x8c, 0xfc, 0x35, 0xce, 0x00, | 9166 | 0x35, 0xe6, 0x00, 0x8c, 0xca, 0x4e, 0xff, 0x00, |
| 9167 | 0x8f, 0x44, 0x4f, 0x03, 0x00, 0x8f, 0xc5, 0x4f, | 9167 | 0x8c, 0xfc, 0x35, 0xce, 0x00, 0x8f, 0x44, 0x4f, |
| 9168 | 0x04, 0x00, 0x8f, 0xd4, 0x4f, 0x05, 0x00, 0x90, | 9168 | 0x03, 0x00, 0x8f, 0xc5, 0x4f, 0x04, 0x00, 0x8f, |
| 9169 | 0x03, 0x36, 0x87, 0x00, 0x90, 0x22, 0x34, 0x60, | 9169 | 0xd4, 0x4f, 0x05, 0x00, 0x90, 0x03, 0x36, 0x87, |
| 9170 | 0x00, 0x90, 0x38, 0x21, 0xb9, 0x00, 0x90, 0x41, | 9170 | 0x00, 0x90, 0x22, 0x34, 0x60, 0x00, 0x90, 0x38, |
| 9171 | 0x4f, 0x3f, 0x00, 0x90, 0x42, 0x36, 0x28, 0x00, | 9171 | 0x21, 0xb9, 0x00, 0x90, 0x41, 0x4f, 0x3f, 0x00, |
| 9172 | 0x90, 0x55, 0x35, 0x49, 0x00, 0x90, 0x75, 0x36, | 9172 | 0x90, 0x42, 0x36, 0x28, 0x00, 0x90, 0x55, 0x35, |
| 9173 | 0x01, 0x00, 0x90, 0x77, 0x4f, 0x07, 0x00, 0x90, | 9173 | 0x49, 0x00, 0x90, 0x75, 0x36, 0x01, 0x00, 0x90, |
| 9174 | 0x89, 0x37, 0xa1, 0x00, 0x90, 0x8a, 0x37, 0x9c, | 9174 | 0x77, 0x4f, 0x07, 0x00, 0x90, 0x89, 0x37, 0xa1, |
| 9175 | 0x00, 0x90, 0xa6, 0x36, 0xcc, 0x00, 0x90, 0xaa, | 9175 | 0x00, 0x90, 0x8a, 0x37, 0x9c, 0x00, 0x90, 0xa6, |
| 9176 | 0x35, 0xee, 0x00, 0x92, 0x5b, 0x35, 0x5b, 0x00, | 9176 | 0x36, 0xcc, 0x00, 0x90, 0xaa, 0x35, 0xee, 0x00, |
| 9177 | 0x96, 0x86, 0x21, 0xee, 0x00, 0x96, 0x98, 0x4f, | 9177 | 0x92, 0x5b, 0x35, 0x5b, 0x00, 0x96, 0x86, 0x21, |
| 9178 | 0x13, 0x00, 0x96, 0xa3, 0x37, 0x0b, 0x00, 0x96, | 9178 | 0xee, 0x00, 0x96, 0x98, 0x4f, 0x13, 0x00, 0x96, |
| 9179 | 0xc5, 0x35, 0x67, 0x00, 0x97, 0x5c, 0x36, 0x32, | 9179 | 0xa3, 0x37, 0x0b, 0x00, 0x96, 0xc5, 0x35, 0x67, |
| 9180 | 0x00, 0x97, 0x60, 0x35, 0x37, 0x00, 0x97, 0x6d, | 9180 | 0x00, 0x97, 0x5c, 0x36, 0x32, 0x00, 0x97, 0x60, |
| 9181 | 0x1f, 0x23, 0x00, 0x97, 0x71, 0x35, 0x38, 0x00, | 9181 | 0x35, 0x37, 0x00, 0x97, 0x6d, 0x1f, 0x23, 0x00, |
| 9182 | 0x97, 0xff, 0x35, 0x9e, 0x00, 0x98, 0xef, 0x4f, | 9182 | 0x97, 0x71, 0x35, 0x38, 0x00, 0x97, 0xff, 0x35, |
| 9183 | 0x25, 0x00, 0x99, 0x0c, 0x34, 0x65, 0x00, 0x99, | 9183 | 0x9e, 0x00, 0x98, 0xef, 0x4f, 0x25, 0x00, 0x99, |
| 9184 | 0x45, 0x37, 0xb8, 0x00, 0x99, 0x57, 0x35, 0x9f, | 9184 | 0x0c, 0x34, 0x65, 0x00, 0x99, 0x45, 0x37, 0xb8, |
| 9185 | 0x00, 0x9e, 0x9f, 0x37, 0x0d, 0x00, 0x9f, 0x08, | 9185 | 0x00, 0x99, 0x57, 0x35, 0x9f, 0x00, 0x9e, 0x9f, |
| 9186 | 0x37, 0xc4, 0x00, 0x9f, 0x8d, 0x37, 0x07, 0x02, | 9186 | 0x37, 0x0d, 0x00, 0x9f, 0x08, 0x37, 0xc4, 0x00, |
| 9187 | 0x36, 0x3a, 0x35, 0x9c, 0x00, 0x00, 0x00, 0x11, | 9187 | 0x9f, 0x8d, 0x37, 0x07, 0x02, 0x36, 0x3a, 0x35, |
| 9188 | 0x00, 0x51, 0xde, 0x4e, 0x71, 0x00, 0x53, 0xa9, | 9188 | 0x9c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x51, 0xde, |
| 9189 | 0x34, 0x64, 0x00, 0x56, 0xae, 0x4e, 0x7f, 0x00, | 9189 | 0x4e, 0x71, 0x00, 0x53, 0xa9, 0x34, 0x64, 0x00, |
| 9190 | 0x5b, 0xb3, 0x4e, 0x8f, 0x00, 0x61, 0x68, 0x35, | 9190 | 0x56, 0xae, 0x4e, 0x7f, 0x00, 0x5b, 0xb3, 0x4e, |
| 9191 | 0x6c, 0x00, 0x61, 0xf2, 0x52, 0x50, 0x00, 0x66, | 9191 | 0x8f, 0x00, 0x61, 0x68, 0x35, 0x6c, 0x00, 0x61, |
| 9192 | 0x5f, 0x37, 0x39, 0x00, 0x67, 0x17, 0x37, 0x12, | 9192 | 0xf2, 0x52, 0x50, 0x00, 0x66, 0x5f, 0x37, 0x39, |
| 9193 | 0x00, 0x69, 0x82, 0x35, 0x70, 0x00, 0x75, 0x11, | 9193 | 0x00, 0x67, 0x17, 0x37, 0x12, 0x00, 0x69, 0x82, |
| 9194 | 0x4f, 0x3c, 0x00, 0x83, 0xdf, 0x4e, 0xe9, 0x00, | 9194 | 0x35, 0x70, 0x00, 0x75, 0x11, 0x4f, 0x3c, 0x00, |
| 9195 | 0x90, 0x77, 0x4f, 0x08, 0x00, 0x90, 0x89, 0x37, | 9195 | 0x83, 0xdf, 0x4e, 0xe9, 0x00, 0x90, 0x77, 0x4f, |
| 9196 | 0xa2, 0x00, 0x90, 0x8a, 0x37, 0x9d, 0x00, 0x97, | 9196 | 0x08, 0x00, 0x90, 0x89, 0x37, 0xa2, 0x00, 0x90, |
| 9197 | 0xff, 0x4f, 0x15, 0x00, 0x99, 0x0c, 0x35, 0x52, | 9197 | 0x8a, 0x37, 0x9d, 0x00, 0x97, 0xff, 0x4f, 0x15, |
| 9198 | 0x00, 0x99, 0x57, 0x4f, 0x19, 0x00, 0x00, 0x00, | 9198 | 0x00, 0x99, 0x0c, 0x35, 0x52, 0x00, 0x99, 0x57, |
| 9199 | 0x06, 0x00, 0x51, 0xde, 0x21, 0x5e, 0x00, 0x53, | 9199 | 0x4f, 0x19, 0x00, 0x00, 0x00, 0x06, 0x00, 0x51, |
| 9200 | 0xa9, 0x35, 0x4f, 0x00, 0x61, 0x68, 0x35, 0x6d, | 9200 | 0xde, 0x21, 0x5e, 0x00, 0x53, 0xa9, 0x35, 0x4f, |
| 9201 | 0x00, 0x90, 0x89, 0x37, 0xa3, 0x00, 0x90, 0x8a, | 9201 | 0x00, 0x61, 0x68, 0x35, 0x6d, 0x00, 0x90, 0x89, |
| 9202 | 0x37, 0x9e, 0x00, 0x97, 0xff, 0x4f, 0x16, 0x00, | 9202 | 0x37, 0xa3, 0x00, 0x90, 0x8a, 0x37, 0x9e, 0x00, |
| 9203 | 0x00, 0x00, 0x04, 0x00, 0x53, 0xa9, 0x4f, 0x2f, | 9203 | 0x97, 0xff, 0x4f, 0x16, 0x00, 0x00, 0x00, 0x04, |
| 9204 | 0x00, 0x61, 0x68, 0x35, 0x6e, 0x00, 0x90, 0x89, | 9204 | 0x00, 0x53, 0xa9, 0x4f, 0x2f, 0x00, 0x61, 0x68, |
| 9205 | 0x37, 0xa4, 0x00, 0x90, 0x8a, 0x37, 0x9f, 0x00, | 9205 | 0x35, 0x6e, 0x00, 0x90, 0x89, 0x37, 0xa4, 0x00, |
| 9206 | 0x00, 0x00, 0x02, 0x00, 0x90, 0x89, 0x37, 0xa5, | 9206 | 0x90, 0x8a, 0x37, 0x9f, 0x00, 0x00, 0x00, 0x02, |
| 9207 | 0x00, 0x90, 0x8a, 0x37, 0xa0, 0x00, 0x00, 0x00, | 9207 | 0x00, 0x90, 0x89, 0x37, 0xa5, 0x00, 0x90, 0x8a, |
| 9208 | 0x02, 0x00, 0x90, 0x89, 0x37, 0xa6, 0x00, 0x90, | 9208 | 0x37, 0xa0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x90, |
| 9209 | 0x8a, 0x4f, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, | 9209 | 0x89, 0x37, 0xa6, 0x00, 0x90, 0x8a, 0x4f, 0x0a, |
| 9210 | 0x90, 0x89, 0x37, 0xa7, 0x00, 0x00, 0x00, 0x01, | ||
| 9211 | 0x00, 0x90, 0x89, 0x37, 0xa8, 0x00, 0x00, 0x00, | ||
| 9212 | 0x01, 0x00, 0x90, 0x89, 0x37, 0xa9, 0x00, 0x00, | ||
| 9213 | 0x00, 0x01, 0x00, 0x90, 0x89, 0x37, 0xaa, 0x00, | ||
| 9214 | 0x00, 0x00, 0x01, 0x00, 0x90, 0x89, 0x37, 0xab, | ||
| 9215 | 0x00, 0x00, 0x00, 0x01, 0x00, 0x90, 0x89, 0x37, | 9210 | 0x00, 0x00, 0x00, 0x01, 0x00, 0x90, 0x89, 0x37, |
| 9216 | 0xac, 0x00, 0x00, 0x00, 0x01, 0x00, 0x90, 0x89, | 9211 | 0xa7, 0x00, 0x00, 0x00, 0x01, 0x00, 0x90, 0x89, |
| 9217 | 0x4f, 0x09 | 9212 | 0x37, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x00, 0x90, |
| 9213 | 0x89, 0x37, 0xa9, 0x00, 0x00, 0x00, 0x01, 0x00, | ||
| 9214 | 0x90, 0x89, 0x37, 0xaa, 0x00, 0x00, 0x00, 0x01, | ||
| 9215 | 0x00, 0x90, 0x89, 0x37, 0xab, 0x00, 0x00, 0x00, | ||
| 9216 | 0x01, 0x00, 0x90, 0x89, 0x37, 0xac, 0x00, 0x00, | ||
| 9217 | 0x00, 0x01, 0x00, 0x90, 0x89, 0x4f, 0x09 | ||
| 9218 | }; | 9218 | }; |
diff --git a/src/marker.c b/src/marker.c index 9727586f424..0ed1e55ddc9 100644 --- a/src/marker.c +++ b/src/marker.c | |||
| @@ -759,23 +759,6 @@ If TYPE is nil, it means the marker stays behind when you insert text at it. */ | |||
| 759 | return type; | 759 | return type; |
| 760 | } | 760 | } |
| 761 | 761 | ||
| 762 | DEFUN ("buffer-has-markers-at", Fbuffer_has_markers_at, Sbuffer_has_markers_at, | ||
| 763 | 1, 1, 0, | ||
| 764 | doc: /* Return t if there are markers pointing at POSITION in the current buffer. */) | ||
| 765 | (Lisp_Object position) | ||
| 766 | { | ||
| 767 | register struct Lisp_Marker *tail; | ||
| 768 | register ptrdiff_t charpos; | ||
| 769 | |||
| 770 | charpos = clip_to_bounds (BEG, XFIXNUM (position), Z); | ||
| 771 | |||
| 772 | for (tail = BUF_MARKERS (current_buffer); tail; tail = tail->next) | ||
| 773 | if (tail->charpos == charpos) | ||
| 774 | return Qt; | ||
| 775 | |||
| 776 | return Qnil; | ||
| 777 | } | ||
| 778 | |||
| 779 | #ifdef MARKER_DEBUG | 762 | #ifdef MARKER_DEBUG |
| 780 | 763 | ||
| 781 | /* For debugging -- count the markers in buffer BUF. */ | 764 | /* For debugging -- count the markers in buffer BUF. */ |
| @@ -821,5 +804,4 @@ syms_of_marker (void) | |||
| 821 | defsubr (&Scopy_marker); | 804 | defsubr (&Scopy_marker); |
| 822 | defsubr (&Smarker_insertion_type); | 805 | defsubr (&Smarker_insertion_type); |
| 823 | defsubr (&Sset_marker_insertion_type); | 806 | defsubr (&Sset_marker_insertion_type); |
| 824 | defsubr (&Sbuffer_has_markers_at); | ||
| 825 | } | 807 | } |
diff --git a/src/menu.c b/src/menu.c index eeb0c9a7e5b..c52e9258a15 100644 --- a/src/menu.c +++ b/src/menu.c | |||
| @@ -32,10 +32,6 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ | |||
| 32 | #include "blockinput.h" | 32 | #include "blockinput.h" |
| 33 | #include "buffer.h" | 33 | #include "buffer.h" |
| 34 | 34 | ||
| 35 | #ifdef USE_X_TOOLKIT | ||
| 36 | #include "../lwlib/lwlib.h" | ||
| 37 | #endif | ||
| 38 | |||
| 39 | #ifdef HAVE_WINDOW_SYSTEM | 35 | #ifdef HAVE_WINDOW_SYSTEM |
| 40 | #include TERM_HEADER | 36 | #include TERM_HEADER |
| 41 | #endif /* HAVE_WINDOW_SYSTEM */ | 37 | #endif /* HAVE_WINDOW_SYSTEM */ |
diff --git a/src/msdos.c b/src/msdos.c index 1608245904c..1d3fdd528d7 100644 --- a/src/msdos.c +++ b/src/msdos.c | |||
| @@ -1794,7 +1794,6 @@ internal_terminal_init (void) | |||
| 1794 | } | 1794 | } |
| 1795 | 1795 | ||
| 1796 | Vinitial_window_system = Qpc; | 1796 | Vinitial_window_system = Qpc; |
| 1797 | Vwindow_system_version = make_fixnum (29); /* RE Emacs version */ | ||
| 1798 | tty->terminal->type = output_msdos_raw; | 1797 | tty->terminal->type = output_msdos_raw; |
| 1799 | 1798 | ||
| 1800 | /* If Emacs was dumped on DOS/V machine, forget the stale VRAM | 1799 | /* If Emacs was dumped on DOS/V machine, forget the stale VRAM |
diff --git a/src/nsfont.m b/src/nsfont.m index b54118afe5d..d072b5ce779 100644 --- a/src/nsfont.m +++ b/src/nsfont.m | |||
| @@ -324,106 +324,98 @@ ns_get_family (Lisp_Object font_spec) | |||
| 324 | static NSFontDescriptor * | 324 | static NSFontDescriptor * |
| 325 | ns_spec_to_descriptor (Lisp_Object font_spec) | 325 | ns_spec_to_descriptor (Lisp_Object font_spec) |
| 326 | { | 326 | { |
| 327 | NSFontDescriptor *fdesc; | 327 | NSFontDescriptor *fdesc; |
| 328 | NSMutableDictionary *fdAttrs = [NSMutableDictionary new]; | 328 | NSMutableDictionary *fdAttrs = [NSMutableDictionary new]; |
| 329 | NSString *family = ns_get_family (font_spec); | 329 | NSString *family = ns_get_family (font_spec); |
| 330 | NSMutableDictionary *tdict = [NSMutableDictionary new]; | 330 | NSMutableDictionary *tdict = [NSMutableDictionary new]; |
| 331 | 331 | ||
| 332 | Lisp_Object tem; | 332 | Lisp_Object tem; |
| 333 | 333 | ||
| 334 | tem = FONT_SLANT_SYMBOLIC (font_spec); | 334 | tem = FONT_SLANT_SYMBOLIC (font_spec); |
| 335 | if (!NILP (tem)) | 335 | if (!NILP (tem)) |
| 336 | { | 336 | { |
| 337 | if (EQ (tem, Qitalic) || EQ (tem, Qoblique)) | 337 | if (EQ (tem, Qitalic) || EQ (tem, Qoblique)) |
| 338 | [tdict setObject: [NSNumber numberWithFloat: 1.0] | 338 | [tdict setObject: [NSNumber numberWithFloat: 1.0] |
| 339 | forKey: NSFontSlantTrait]; | 339 | forKey: NSFontSlantTrait]; |
| 340 | else if (EQ (tem, intern ("reverse-italic")) || | 340 | else if (EQ (tem, intern ("reverse-italic")) |
| 341 | EQ (tem, intern ("reverse-oblique"))) | 341 | || EQ (tem, intern ("reverse-oblique"))) |
| 342 | [tdict setObject: [NSNumber numberWithFloat: -1.0] | 342 | [tdict setObject: [NSNumber numberWithFloat: -1.0] |
| 343 | forKey: NSFontSlantTrait]; | 343 | forKey: NSFontSlantTrait]; |
| 344 | else | 344 | else |
| 345 | [tdict setObject: [NSNumber numberWithFloat: 0.0] | 345 | [tdict setObject: [NSNumber numberWithFloat: 0.0] |
| 346 | forKey: NSFontSlantTrait]; | 346 | forKey: NSFontSlantTrait]; |
| 347 | } | 347 | } |
| 348 | 348 | ||
| 349 | tem = FONT_WIDTH_SYMBOLIC (font_spec); | 349 | tem = FONT_WIDTH_SYMBOLIC (font_spec); |
| 350 | if (!NILP (tem)) | 350 | if (!NILP (tem)) |
| 351 | { | 351 | { |
| 352 | if (EQ (tem, Qcondensed)) | 352 | if (EQ (tem, Qcondensed)) |
| 353 | [tdict setObject: [NSNumber numberWithFloat: -1.0] | 353 | [tdict setObject: [NSNumber numberWithFloat: -1.0] |
| 354 | forKey: NSFontWidthTrait]; | 354 | forKey: NSFontWidthTrait]; |
| 355 | else if (EQ (tem, Qexpanded)) | 355 | else if (EQ (tem, Qexpanded)) |
| 356 | [tdict setObject: [NSNumber numberWithFloat: 1.0] | 356 | [tdict setObject: [NSNumber numberWithFloat: 1.0] |
| 357 | forKey: NSFontWidthTrait]; | 357 | forKey: NSFontWidthTrait]; |
| 358 | else | 358 | else |
| 359 | [tdict setObject: [NSNumber numberWithFloat: 0.0] | 359 | [tdict setObject: [NSNumber numberWithFloat: 0.0] |
| 360 | forKey: NSFontWidthTrait]; | 360 | forKey: NSFontWidthTrait]; |
| 361 | } | 361 | } |
| 362 | 362 | ||
| 363 | tem = FONT_WEIGHT_SYMBOLIC (font_spec); | 363 | tem = FONT_WEIGHT_SYMBOLIC (font_spec); |
| 364 | 364 | ||
| 365 | if (!NILP (tem)) | 365 | if (!NILP (tem)) |
| 366 | { | 366 | { |
| 367 | if (EQ (tem, Qbold)) | 367 | if (EQ (tem, Qbold)) |
| 368 | { | 368 | { |
| 369 | [tdict setObject: [NSNumber numberWithFloat: 1.0] | 369 | [tdict setObject: [NSNumber numberWithFloat: 1.0] |
| 370 | forKey: NSFontWeightTrait]; | 370 | forKey: NSFontWeightTrait]; |
| 371 | } | 371 | } |
| 372 | else if (EQ (tem, Qlight)) | 372 | else if (EQ (tem, Qlight)) |
| 373 | { | 373 | { |
| 374 | [tdict setObject: [NSNumber numberWithFloat: -1.0] | 374 | [tdict setObject: [NSNumber numberWithFloat: -1.0] |
| 375 | forKey: NSFontWeightTrait]; | 375 | forKey: NSFontWeightTrait]; |
| 376 | } | 376 | } |
| 377 | else | 377 | else |
| 378 | { | 378 | { |
| 379 | [tdict setObject: [NSNumber numberWithFloat: 0.0] | 379 | [tdict setObject: [NSNumber numberWithFloat: 0.0] |
| 380 | forKey: NSFontWeightTrait]; | 380 | forKey: NSFontWeightTrait]; |
| 381 | } | 381 | } |
| 382 | } | 382 | } |
| 383 | 383 | ||
| 384 | tem = AREF (font_spec, FONT_SPACING_INDEX); | 384 | tem = AREF (font_spec, FONT_SPACING_INDEX); |
| 385 | 385 | ||
| 386 | if (family != nil) | 386 | if (family != nil) |
| 387 | { | 387 | [fdAttrs setObject: family |
| 388 | [fdAttrs setObject: family | 388 | forKey: NSFontFamilyAttribute]; |
| 389 | forKey: NSFontFamilyAttribute]; | ||
| 390 | } | ||
| 391 | 389 | ||
| 392 | if (FIXNUMP (tem)) | 390 | if (FIXNUMP (tem)) |
| 393 | { | 391 | { |
| 394 | if (XFIXNUM (tem) != FONT_SPACING_PROPORTIONAL) | 392 | if (XFIXNUM (tem) != FONT_SPACING_PROPORTIONAL) |
| 395 | { | 393 | [fdAttrs setObject: [NSNumber numberWithBool: YES] |
| 396 | [fdAttrs setObject: [NSNumber numberWithBool:YES] | 394 | forKey: NSFontFixedAdvanceAttribute]; |
| 397 | forKey: NSFontFixedAdvanceAttribute]; | 395 | else |
| 398 | } | 396 | [fdAttrs setObject: [NSNumber numberWithBool: NO] |
| 399 | else | 397 | forKey: NSFontFixedAdvanceAttribute]; |
| 400 | { | 398 | } |
| 401 | [fdAttrs setObject: [NSNumber numberWithBool:NO] | ||
| 402 | forKey: NSFontFixedAdvanceAttribute]; | ||
| 403 | } | ||
| 404 | } | ||
| 405 | 399 | ||
| 406 | /* Handle special families such as ``fixed'' or ``Sans Serif''. */ | 400 | /* Handle special families such as ``fixed'', ``monospace'' or |
| 401 | ``Sans Serif''. */ | ||
| 407 | 402 | ||
| 408 | if ([family isEqualToString: @"fixed"]) | 403 | if ([family isEqualToString: @"fixed"] |
| 409 | { | 404 | || [family isEqualToString: @"monospace"]) |
| 410 | [fdAttrs setObject: [[NSFont userFixedPitchFontOfSize: 0] familyName] | 405 | [fdAttrs setObject: [[NSFont userFixedPitchFontOfSize: 0] familyName] |
| 411 | forKey: NSFontFamilyAttribute]; | 406 | forKey: NSFontFamilyAttribute]; |
| 412 | } | 407 | else if ([family isEqualToString: @"Sans Serif"]) |
| 413 | else if ([family isEqualToString: @"Sans Serif"]) | 408 | [fdAttrs setObject: [[NSFont userFontOfSize: 0] familyName] |
| 414 | { | 409 | forKey: NSFontFamilyAttribute]; |
| 415 | [fdAttrs setObject: [[NSFont userFontOfSize: 0] familyName] | ||
| 416 | forKey: NSFontFamilyAttribute]; | ||
| 417 | } | ||
| 418 | 410 | ||
| 419 | [fdAttrs setObject: tdict forKey: NSFontTraitsAttribute]; | 411 | [fdAttrs setObject: tdict forKey: NSFontTraitsAttribute]; |
| 420 | 412 | ||
| 421 | fdesc = [[[NSFontDescriptor fontDescriptorWithFontAttributes: fdAttrs] | 413 | fdesc = [[[NSFontDescriptor fontDescriptorWithFontAttributes: fdAttrs] |
| 422 | retain] autorelease]; | 414 | retain] autorelease]; |
| 423 | 415 | ||
| 424 | [tdict release]; | 416 | [tdict release]; |
| 425 | [fdAttrs release]; | 417 | [fdAttrs release]; |
| 426 | return fdesc; | 418 | return fdesc; |
| 427 | } | 419 | } |
| 428 | 420 | ||
| 429 | 421 | ||
| @@ -477,7 +469,7 @@ ns_descriptor_to_entity (NSFontDescriptor *desc, | |||
| 477 | ASET (font_entity, FONT_SIZE_INDEX, make_fixnum (0)); | 469 | ASET (font_entity, FONT_SIZE_INDEX, make_fixnum (0)); |
| 478 | ASET (font_entity, FONT_AVGWIDTH_INDEX, make_fixnum (0)); | 470 | ASET (font_entity, FONT_AVGWIDTH_INDEX, make_fixnum (0)); |
| 479 | ASET (font_entity, FONT_SPACING_INDEX, | 471 | ASET (font_entity, FONT_SPACING_INDEX, |
| 480 | make_fixnum ((data.specified & GS_SPECIFIED_WIDTH && data.monospace_p) | 472 | make_fixnum ((data.specified & GS_SPECIFIED_SPACING && data.monospace_p) |
| 481 | ? FONT_SPACING_MONO : FONT_SPACING_PROPORTIONAL)); | 473 | ? FONT_SPACING_MONO : FONT_SPACING_PROPORTIONAL)); |
| 482 | 474 | ||
| 483 | ASET (font_entity, FONT_EXTRA_INDEX, extra); | 475 | ASET (font_entity, FONT_EXTRA_INDEX, extra); |
| @@ -792,53 +784,53 @@ static NSSet | |||
| 792 | static Lisp_Object | 784 | static Lisp_Object |
| 793 | ns_findfonts (Lisp_Object font_spec, BOOL isMatch) | 785 | ns_findfonts (Lisp_Object font_spec, BOOL isMatch) |
| 794 | { | 786 | { |
| 795 | Lisp_Object tem, list = Qnil; | 787 | Lisp_Object tem, list = Qnil; |
| 796 | NSFontDescriptor *fdesc; | 788 | NSFontDescriptor *fdesc; |
| 797 | NSArray *all_descs; | 789 | NSArray *all_descs; |
| 798 | GSFontEnumerator *enumerator = [GSFontEnumerator sharedEnumerator]; | 790 | GSFontEnumerator *enumerator = [GSFontEnumerator sharedEnumerator]; |
| 799 | 791 | ||
| 800 | NSSet *cFamilies; | 792 | NSSet *cFamilies; |
| 801 | 793 | ||
| 802 | block_input (); | 794 | block_input (); |
| 803 | if (NSFONT_TRACE) | 795 | if (NSFONT_TRACE) |
| 804 | { | 796 | { |
| 805 | fprintf (stderr, "nsfont: %s for fontspec:\n ", | 797 | fprintf (stderr, "nsfont: %s for fontspec:\n ", |
| 806 | (isMatch ? "match" : "list")); | 798 | (isMatch ? "match" : "list")); |
| 807 | debug_print (font_spec); | 799 | debug_print (font_spec); |
| 808 | } | 800 | } |
| 809 | 801 | ||
| 810 | cFamilies = ns_get_covering_families (ns_get_req_script (font_spec), 0.90); | 802 | cFamilies = ns_get_covering_families (ns_get_req_script (font_spec), 0.90); |
| 811 | 803 | ||
| 812 | fdesc = ns_spec_to_descriptor (font_spec); | 804 | fdesc = ns_spec_to_descriptor (font_spec); |
| 813 | all_descs = [enumerator availableFontDescriptors]; | 805 | all_descs = [enumerator availableFontDescriptors]; |
| 814 | 806 | ||
| 815 | for (NSFontDescriptor *desc in all_descs) | 807 | for (NSFontDescriptor *desc in all_descs) |
| 816 | { | 808 | { |
| 817 | if (![cFamilies containsObject: | 809 | if (![cFamilies containsObject: |
| 818 | [desc objectForKey: NSFontFamilyAttribute]]) | 810 | [desc objectForKey: NSFontFamilyAttribute]]) |
| 819 | continue; | 811 | continue; |
| 820 | if (!ns_font_descs_match_p (fdesc, desc)) | 812 | if (!ns_font_descs_match_p (fdesc, desc)) |
| 821 | continue; | 813 | continue; |
| 822 | 814 | ||
| 823 | tem = ns_descriptor_to_entity (desc, | 815 | tem = ns_descriptor_to_entity (desc, |
| 824 | AREF (font_spec, FONT_EXTRA_INDEX), | 816 | AREF (font_spec, FONT_EXTRA_INDEX), |
| 825 | NULL); | 817 | NULL); |
| 826 | if (isMatch) | 818 | if (isMatch) |
| 827 | return tem; | 819 | return tem; |
| 828 | list = Fcons (tem, list); | 820 | list = Fcons (tem, list); |
| 829 | } | 821 | } |
| 830 | 822 | ||
| 831 | unblock_input (); | 823 | unblock_input (); |
| 832 | 824 | ||
| 833 | /* Return something if was a match and nothing found. */ | 825 | /* Return something if was a match and nothing found. */ |
| 834 | if (isMatch) | 826 | if (isMatch) |
| 835 | return ns_fallback_entity (); | 827 | return ns_fallback_entity (); |
| 836 | 828 | ||
| 837 | if (NSFONT_TRACE) | 829 | if (NSFONT_TRACE) |
| 838 | fprintf (stderr, " Returning %"pD"d entities.\n", | 830 | fprintf (stderr, " Returning %"pD"d entities.\n", |
| 839 | list_length (list)); | 831 | list_length (list)); |
| 840 | 832 | ||
| 841 | return list; | 833 | return list; |
| 842 | } | 834 | } |
| 843 | 835 | ||
| 844 | 836 | ||
diff --git a/src/nsterm.m b/src/nsterm.m index 6c6151701b8..82fe58e90ec 100644 --- a/src/nsterm.m +++ b/src/nsterm.m | |||
| @@ -37,7 +37,6 @@ GNUstep port and post-20 update by Adrian Robert (arobert@cogsci.ucsd.edu) | |||
| 37 | #include <time.h> | 37 | #include <time.h> |
| 38 | #include <signal.h> | 38 | #include <signal.h> |
| 39 | #include <unistd.h> | 39 | #include <unistd.h> |
| 40 | #include <stdbool.h> | ||
| 41 | 40 | ||
| 42 | #include <c-ctype.h> | 41 | #include <c-ctype.h> |
| 43 | #include <c-strcase.h> | 42 | #include <c-strcase.h> |
| @@ -3996,6 +3995,7 @@ static void | |||
| 3996 | ns_draw_stretch_glyph_string (struct glyph_string *s) | 3995 | ns_draw_stretch_glyph_string (struct glyph_string *s) |
| 3997 | { | 3996 | { |
| 3998 | struct face *face; | 3997 | struct face *face; |
| 3998 | NSColor *fg_color; | ||
| 3999 | 3999 | ||
| 4000 | if (s->hl == DRAW_CURSOR | 4000 | if (s->hl == DRAW_CURSOR |
| 4001 | && !x_stretch_cursor_p) | 4001 | && !x_stretch_cursor_p) |
| @@ -4092,8 +4092,20 @@ ns_draw_stretch_glyph_string (struct glyph_string *s) | |||
| 4092 | NSRectFill (NSMakeRect (x, s->y, background_width, s->height)); | 4092 | NSRectFill (NSMakeRect (x, s->y, background_width, s->height)); |
| 4093 | } | 4093 | } |
| 4094 | } | 4094 | } |
| 4095 | } | ||
| 4096 | 4095 | ||
| 4096 | /* Draw overlining, etc. on the stretch glyph (or the part of the | ||
| 4097 | stretch glyph after the cursor). If the glyph has a box, then | ||
| 4098 | decorations will be drawn after drawing the box in | ||
| 4099 | ns_draw_glyph_string, in order to prevent them from being | ||
| 4100 | overwritten by the box. */ | ||
| 4101 | if (s->face->box == FACE_NO_BOX) | ||
| 4102 | { | ||
| 4103 | fg_color = [NSColor colorWithUnsignedLong: | ||
| 4104 | NS_FACE_FOREGROUND (s->face)]; | ||
| 4105 | ns_draw_text_decoration (s, s->face, fg_color, | ||
| 4106 | s->background_width, s->x); | ||
| 4107 | } | ||
| 4108 | } | ||
| 4097 | 4109 | ||
| 4098 | static void | 4110 | static void |
| 4099 | ns_draw_glyph_string_foreground (struct glyph_string *s) | 4111 | ns_draw_glyph_string_foreground (struct glyph_string *s) |
| @@ -4411,7 +4423,8 @@ ns_draw_glyph_string (struct glyph_string *s) | |||
| 4411 | { | 4423 | { |
| 4412 | NSColor *fg_color; | 4424 | NSColor *fg_color; |
| 4413 | 4425 | ||
| 4414 | fg_color = [NSColor colorWithUnsignedLong:NS_FACE_FOREGROUND (s->face)]; | 4426 | fg_color = [NSColor colorWithUnsignedLong: NS_FACE_FOREGROUND (s->face)]; |
| 4427 | |||
| 4415 | ns_draw_text_decoration (s, s->face, fg_color, | 4428 | ns_draw_text_decoration (s, s->face, fg_color, |
| 4416 | s->background_width, s->x); | 4429 | s->background_width, s->x); |
| 4417 | } | 4430 | } |
| @@ -5607,17 +5620,6 @@ ns_term_init (Lisp_Object display_name) | |||
| 5607 | 5620 | ||
| 5608 | NSTRACE_MSG ("Versions"); | 5621 | NSTRACE_MSG ("Versions"); |
| 5609 | 5622 | ||
| 5610 | { | ||
| 5611 | #ifdef NS_IMPL_GNUSTEP | ||
| 5612 | Vwindow_system_version = build_string (gnustep_base_version); | ||
| 5613 | #else | ||
| 5614 | /* PSnextrelease (128, c); */ | ||
| 5615 | char c[DBL_BUFSIZE_BOUND]; | ||
| 5616 | int len = dtoastr (c, sizeof c, 0, 0, NSAppKitVersionNumber); | ||
| 5617 | Vwindow_system_version = make_unibyte_string (c, len); | ||
| 5618 | #endif | ||
| 5619 | } | ||
| 5620 | |||
| 5621 | delete_keyboard_wait_descriptor (0); | 5623 | delete_keyboard_wait_descriptor (0); |
| 5622 | 5624 | ||
| 5623 | ns_app_name = [[NSProcessInfo processInfo] processName]; | 5625 | ns_app_name = [[NSProcessInfo processInfo] processName]; |
| @@ -7917,17 +7919,24 @@ ns_create_font_panel_buttons (id target, SEL select, SEL cancel_action) | |||
| 7917 | 7919 | ||
| 7918 | if (!emacsframe->output_data.ns) | 7920 | if (!emacsframe->output_data.ns) |
| 7919 | return; | 7921 | return; |
| 7922 | |||
| 7920 | if (screen != nil) | 7923 | if (screen != nil) |
| 7921 | { | 7924 | { |
| 7922 | emacsframe->left_pos = NSMinX (r) - NS_PARENT_WINDOW_LEFT_POS (emacsframe); | 7925 | emacsframe->left_pos = (NSMinX (r) |
| 7923 | emacsframe->top_pos = NS_PARENT_WINDOW_TOP_POS (emacsframe) - NSMaxY (r); | 7926 | - NS_PARENT_WINDOW_LEFT_POS (emacsframe)); |
| 7927 | emacsframe->top_pos = (NS_PARENT_WINDOW_TOP_POS (emacsframe) | ||
| 7928 | - NSMaxY (r)); | ||
| 7924 | 7929 | ||
| 7925 | // FIXME: after event part below didExitFullScreen is not received | 7930 | if (emacs_event) |
| 7926 | // if (emacs_event) | 7931 | { |
| 7927 | // { | 7932 | struct input_event ie; |
| 7928 | // emacs_event->kind = MOVE_FRAME_EVENT; | 7933 | EVENT_INIT (ie); |
| 7929 | // EV_TRAILER ((id)nil); | 7934 | ie.kind = MOVE_FRAME_EVENT; |
| 7930 | // } | 7935 | XSETFRAME (ie.frame_or_window, emacsframe); |
| 7936 | XSETINT (ie.x, emacsframe->left_pos); | ||
| 7937 | XSETINT (ie.y, emacsframe->top_pos); | ||
| 7938 | kbd_buffer_store_event (&ie); | ||
| 7939 | } | ||
| 7931 | } | 7940 | } |
| 7932 | } | 7941 | } |
| 7933 | 7942 | ||
diff --git a/src/pgtkfns.c b/src/pgtkfns.c index beaf28f69d9..9473e14f5cf 100644 --- a/src/pgtkfns.c +++ b/src/pgtkfns.c | |||
| @@ -164,8 +164,6 @@ pgtk_display_info_for_name (Lisp_Object name) | |||
| 164 | if (dpyinfo == 0) | 164 | if (dpyinfo == 0) |
| 165 | error ("Cannot connect to display server %s", SDATA (name)); | 165 | error ("Cannot connect to display server %s", SDATA (name)); |
| 166 | 166 | ||
| 167 | XSETFASTINT (Vwindow_system_version, 11); | ||
| 168 | |||
| 169 | return dpyinfo; | 167 | return dpyinfo; |
| 170 | } | 168 | } |
| 171 | 169 | ||
diff --git a/src/process.c b/src/process.c index 7a133cda00f..358899cdede 100644 --- a/src/process.c +++ b/src/process.c | |||
| @@ -7391,7 +7391,8 @@ child_signal_notify (void) | |||
| 7391 | } | 7391 | } |
| 7392 | 7392 | ||
| 7393 | /* LIB_CHILD_HANDLER is a SIGCHLD handler that Emacs calls while doing | 7393 | /* LIB_CHILD_HANDLER is a SIGCHLD handler that Emacs calls while doing |
| 7394 | its own SIGCHLD handling. On POSIXish systems, glib needs this to | 7394 | its own SIGCHLD handling. On POSIXish systems lacking |
| 7395 | pidfd_open+waitid or using Glib 2.73.1-, Glib needs this to | ||
| 7395 | keep track of its own children. GNUstep is similar. */ | 7396 | keep track of its own children. GNUstep is similar. */ |
| 7396 | 7397 | ||
| 7397 | static void dummy_handler (int sig) {} | 7398 | static void dummy_handler (int sig) {} |
| @@ -8358,7 +8359,7 @@ DEFUN ("signal-names", Fsignal_names, Ssignal_names, 0, 0, 0, | |||
| 8358 | 8359 | ||
| 8359 | #ifdef subprocesses | 8360 | #ifdef subprocesses |
| 8360 | /* Arrange to catch SIGCHLD if this hasn't already been arranged. | 8361 | /* Arrange to catch SIGCHLD if this hasn't already been arranged. |
| 8361 | Invoke this after init_process_emacs, and after glib and/or GNUstep | 8362 | Invoke this after init_process_emacs, and after Glib and/or GNUstep |
| 8362 | futz with the SIGCHLD handler, but before Emacs forks any children. | 8363 | futz with the SIGCHLD handler, but before Emacs forks any children. |
| 8363 | This function's caller should block SIGCHLD. */ | 8364 | This function's caller should block SIGCHLD. */ |
| 8364 | 8365 | ||
| @@ -8423,26 +8424,35 @@ init_process_emacs (int sockfd) | |||
| 8423 | if (!will_dump_with_unexec_p ()) | 8424 | if (!will_dump_with_unexec_p ()) |
| 8424 | { | 8425 | { |
| 8425 | #if defined HAVE_GLIB && !defined WINDOWSNT | 8426 | #if defined HAVE_GLIB && !defined WINDOWSNT |
| 8426 | /* Tickle glib's child-handling code. Ask glib to install a | 8427 | /* Tickle Glib's child-handling code. Ask Glib to install a |
| 8427 | watch source for Emacs itself which will initialize glib's | 8428 | watch source for Emacs itself which will initialize glib's |
| 8428 | private SIGCHLD handler, allowing catch_child_signal to copy | 8429 | private SIGCHLD handler, allowing catch_child_signal to copy |
| 8429 | it into lib_child_handler. | 8430 | it into lib_child_handler. This is a hacky workaround to get |
| 8431 | glib's g_unix_signal_handler into lib_child_handler. | ||
| 8430 | 8432 | ||
| 8431 | Unfortunately in glib commit 2e471acf, the behavior changed to | 8433 | In Glib 2.37.5 (2013), commit 2e471acf changed Glib to |
| 8432 | always install a signal handler when g_child_watch_source_new | 8434 | always install a signal handler when g_child_watch_source_new |
| 8433 | is called and not just the first time it's called. Glib also | 8435 | is called and not just the first time it's called, and to |
| 8434 | now resets signal handlers to SIG_DFL when it no longer has a | 8436 | reset signal handlers to SIG_DFL when it no longer has a |
| 8435 | watcher on that signal. This is a hackey work around to get | 8437 | watcher on that signal. Arrange for Emacs's signal handler |
| 8436 | glib's g_unix_signal_handler into lib_child_handler. */ | 8438 | to be reinstalled even if this happens. |
| 8439 | |||
| 8440 | In Glib 2.73.2 (2022), commit f615eef4 changed Glib again, | ||
| 8441 | to not install a signal handler if the system supports | ||
| 8442 | pidfd_open and waitid (as in Linux kernel 5.3+). The hacky | ||
| 8443 | workaround is not needed in this case. */ | ||
| 8437 | GSource *source = g_child_watch_source_new (getpid ()); | 8444 | GSource *source = g_child_watch_source_new (getpid ()); |
| 8438 | catch_child_signal (); | 8445 | catch_child_signal (); |
| 8439 | g_source_unref (source); | 8446 | g_source_unref (source); |
| 8440 | 8447 | ||
| 8441 | eassert (lib_child_handler != dummy_handler); | 8448 | if (lib_child_handler != dummy_handler) |
| 8442 | signal_handler_t lib_child_handler_glib = lib_child_handler; | 8449 | { |
| 8443 | catch_child_signal (); | 8450 | /* The hacky workaround is needed on this platform. */ |
| 8444 | eassert (lib_child_handler == dummy_handler); | 8451 | signal_handler_t lib_child_handler_glib = lib_child_handler; |
| 8445 | lib_child_handler = lib_child_handler_glib; | 8452 | catch_child_signal (); |
| 8453 | eassert (lib_child_handler == dummy_handler); | ||
| 8454 | lib_child_handler = lib_child_handler_glib; | ||
| 8455 | } | ||
| 8446 | #else | 8456 | #else |
| 8447 | catch_child_signal (); | 8457 | catch_child_signal (); |
| 8448 | #endif | 8458 | #endif |
diff --git a/src/sysdep.c b/src/sysdep.c index efd9638b07a..abb385d1388 100644 --- a/src/sysdep.c +++ b/src/sysdep.c | |||
| @@ -1304,7 +1304,10 @@ init_sys_modes (struct tty_display_info *tty_out) | |||
| 1304 | } | 1304 | } |
| 1305 | #endif /* F_GETOWN */ | 1305 | #endif /* F_GETOWN */ |
| 1306 | 1306 | ||
| 1307 | setvbuf (tty_out->output, NULL, _IOFBF, BUFSIZ); | 1307 | const size_t buffer_size = (tty_out->output_buffer_size |
| 1308 | ? tty_out->output_buffer_size | ||
| 1309 | : BUFSIZ); | ||
| 1310 | setvbuf (tty_out->output, NULL, _IOFBF, buffer_size); | ||
| 1308 | 1311 | ||
| 1309 | if (tty_out->terminal->set_terminal_modes_hook) | 1312 | if (tty_out->terminal->set_terminal_modes_hook) |
| 1310 | tty_out->terminal->set_terminal_modes_hook (tty_out->terminal); | 1313 | tty_out->terminal->set_terminal_modes_hook (tty_out->terminal); |
diff --git a/src/systhread.h b/src/systhread.h index bf4e0306cdc..10d6237f275 100644 --- a/src/systhread.h +++ b/src/systhread.h | |||
| @@ -19,8 +19,6 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ | |||
| 19 | #ifndef SYSTHREAD_H | 19 | #ifndef SYSTHREAD_H |
| 20 | #define SYSTHREAD_H | 20 | #define SYSTHREAD_H |
| 21 | 21 | ||
| 22 | #include <stdbool.h> | ||
| 23 | |||
| 24 | #include <attribute.h> | 22 | #include <attribute.h> |
| 25 | 23 | ||
| 26 | #ifdef THREADS_ENABLED | 24 | #ifdef THREADS_ENABLED |
diff --git a/src/term.c b/src/term.c index 2e43d89232f..f8104e0304e 100644 --- a/src/term.c +++ b/src/term.c | |||
| @@ -2400,6 +2400,44 @@ frame's terminal). */) | |||
| 2400 | return Qnil; | 2400 | return Qnil; |
| 2401 | } | 2401 | } |
| 2402 | 2402 | ||
| 2403 | DEFUN ("tty--set-output-buffer-size", Ftty__set_output_buffer_size, | ||
| 2404 | Stty__set_output_buffer_size, 1, 2, 0, doc: | ||
| 2405 | /* Set the output buffer size for a TTY. | ||
| 2406 | |||
| 2407 | SIZE zero means use the system's default value. If SIZE is | ||
| 2408 | non-zero, this also avoids flushing the output stream. | ||
| 2409 | |||
| 2410 | TTY may be a terminal object, a frame, or nil (meaning the selected | ||
| 2411 | frame's terminal). | ||
| 2412 | |||
| 2413 | This function temporarily suspends and resumes the terminal | ||
| 2414 | device. */) | ||
| 2415 | (Lisp_Object size, Lisp_Object tty) | ||
| 2416 | { | ||
| 2417 | if (!TYPE_RANGED_FIXNUMP (size_t, size)) | ||
| 2418 | error ("Invalid output buffer size"); | ||
| 2419 | Fsuspend_tty (tty); | ||
| 2420 | struct terminal *terminal = decode_tty_terminal (tty); | ||
| 2421 | terminal->display_info.tty->output_buffer_size = XFIXNUM (size); | ||
| 2422 | return Fresume_tty (tty); | ||
| 2423 | } | ||
| 2424 | |||
| 2425 | DEFUN ("tty--output-buffer-size", Ftty__output_buffer_size, | ||
| 2426 | Stty__output_buffer_size, 0, 1, 0, doc: | ||
| 2427 | /* Return the output buffer size of TTY. | ||
| 2428 | |||
| 2429 | TTY may be a terminal object, a frame, or nil (meaning the selected | ||
| 2430 | frame's terminal). | ||
| 2431 | |||
| 2432 | A value of zero means TTY uses the system's default value. */) | ||
| 2433 | (Lisp_Object tty) | ||
| 2434 | { | ||
| 2435 | struct terminal *terminal = decode_tty_terminal (tty); | ||
| 2436 | if (terminal) | ||
| 2437 | return make_fixnum (terminal->display_info.tty->output_buffer_size); | ||
| 2438 | error ("Not a tty terminal"); | ||
| 2439 | } | ||
| 2440 | |||
| 2403 | 2441 | ||
| 2404 | /*********************************************************************** | 2442 | /*********************************************************************** |
| 2405 | Mouse | 2443 | Mouse |
| @@ -4556,6 +4594,8 @@ trigger redisplay. */); | |||
| 4556 | defsubr (&Stty_top_frame); | 4594 | defsubr (&Stty_top_frame); |
| 4557 | defsubr (&Ssuspend_tty); | 4595 | defsubr (&Ssuspend_tty); |
| 4558 | defsubr (&Sresume_tty); | 4596 | defsubr (&Sresume_tty); |
| 4597 | defsubr (&Stty__set_output_buffer_size); | ||
| 4598 | defsubr (&Stty__output_buffer_size); | ||
| 4559 | #ifdef HAVE_GPM | 4599 | #ifdef HAVE_GPM |
| 4560 | defsubr (&Sgpm_mouse_start); | 4600 | defsubr (&Sgpm_mouse_start); |
| 4561 | defsubr (&Sgpm_mouse_stop); | 4601 | defsubr (&Sgpm_mouse_stop); |
diff --git a/src/termchar.h b/src/termchar.h index 49560dbc2ad..0f172464113 100644 --- a/src/termchar.h +++ b/src/termchar.h | |||
| @@ -53,6 +53,11 @@ struct tty_display_info | |||
| 53 | FILE *output; /* The stream to be used for terminal output. | 53 | FILE *output; /* The stream to be used for terminal output. |
| 54 | NULL if the terminal is suspended. */ | 54 | NULL if the terminal is suspended. */ |
| 55 | 55 | ||
| 56 | /* Size of output buffer. A value of zero means use the default of | ||
| 57 | BUFIZE. If non-zero, also minimize writes to the tty by avoiding | ||
| 58 | calls to flush. */ | ||
| 59 | size_t output_buffer_size; | ||
| 60 | |||
| 56 | FILE *termscript; /* If nonzero, send all terminal output | 61 | FILE *termscript; /* If nonzero, send all terminal output |
| 57 | characters to this stream also. */ | 62 | characters to this stream also. */ |
| 58 | 63 | ||
| @@ -6480,6 +6480,17 @@ chase_symlinks (const char *file) | |||
| 6480 | return target; | 6480 | return target; |
| 6481 | } | 6481 | } |
| 6482 | 6482 | ||
| 6483 | /* Return non-zero if FILE's filesystem supports symlinks. */ | ||
| 6484 | bool | ||
| 6485 | symlinks_supported (const char *file) | ||
| 6486 | { | ||
| 6487 | if (is_windows_9x () != TRUE | ||
| 6488 | && get_volume_info (file, NULL) | ||
| 6489 | && (volume_info.flags & FILE_SUPPORTS_REPARSE_POINTS) != 0) | ||
| 6490 | return true; | ||
| 6491 | return false; | ||
| 6492 | } | ||
| 6493 | |||
| 6483 | 6494 | ||
| 6484 | /* Posix ACL emulation. */ | 6495 | /* Posix ACL emulation. */ |
| 6485 | 6496 | ||
| @@ -228,6 +228,8 @@ extern int sys_link (const char *, const char *); | |||
| 228 | extern int openat (int, const char *, int, int); | 228 | extern int openat (int, const char *, int, int); |
| 229 | extern int fchmodat (int, char const *, mode_t, int); | 229 | extern int fchmodat (int, char const *, mode_t, int); |
| 230 | extern int lchmod (char const *, mode_t); | 230 | extern int lchmod (char const *, mode_t); |
| 231 | extern bool symlinks_supported (const char *); | ||
| 232 | |||
| 231 | 233 | ||
| 232 | /* Return total and free memory info. */ | 234 | /* Return total and free memory info. */ |
| 233 | extern int w32_memory_info (unsigned long long *, unsigned long long *, | 235 | extern int w32_memory_info (unsigned long long *, unsigned long long *, |
diff --git a/src/w32fns.c b/src/w32fns.c index 28d13a68d45..5f652ae9e46 100644 --- a/src/w32fns.c +++ b/src/w32fns.c | |||
| @@ -6699,8 +6699,6 @@ w32_display_info_for_name (Lisp_Object name) | |||
| 6699 | if (dpyinfo == 0) | 6699 | if (dpyinfo == 0) |
| 6700 | error ("Cannot connect to server %s", SDATA (name)); | 6700 | error ("Cannot connect to server %s", SDATA (name)); |
| 6701 | 6701 | ||
| 6702 | XSETFASTINT (Vwindow_system_version, w32_major_version); | ||
| 6703 | |||
| 6704 | return dpyinfo; | 6702 | return dpyinfo; |
| 6705 | } | 6703 | } |
| 6706 | 6704 | ||
| @@ -6781,7 +6779,6 @@ DEFUN ("x-open-connection", Fx_open_connection, Sx_open_connection, | |||
| 6781 | error ("Cannot connect to server %s", SDATA (display)); | 6779 | error ("Cannot connect to server %s", SDATA (display)); |
| 6782 | } | 6780 | } |
| 6783 | 6781 | ||
| 6784 | XSETFASTINT (Vwindow_system_version, w32_major_version); | ||
| 6785 | return Qnil; | 6782 | return Qnil; |
| 6786 | } | 6783 | } |
| 6787 | 6784 | ||
| @@ -10450,6 +10447,66 @@ w32_get_resource (const char *key, const char *name, LPDWORD lpdwtype) | |||
| 10450 | return (NULL); | 10447 | return (NULL); |
| 10451 | } | 10448 | } |
| 10452 | 10449 | ||
| 10450 | #ifdef WINDOWSNT | ||
| 10451 | |||
| 10452 | /*********************************************************************** | ||
| 10453 | Wallpaper | ||
| 10454 | ***********************************************************************/ | ||
| 10455 | |||
| 10456 | typedef BOOL (WINAPI * SystemParametersInfoW_Proc) (UINT,UINT,PVOID,UINT); | ||
| 10457 | SystemParametersInfoW_Proc system_parameters_info_w_fn = NULL; | ||
| 10458 | |||
| 10459 | DEFUN ("w32-set-wallpaper", Fw32_set_wallpaper, Sw32_set_wallpaper, 1, 1, 0, | ||
| 10460 | doc: /* Set the desktop wallpaper image to IMAGE-FILE. */) | ||
| 10461 | (Lisp_Object image_file) | ||
| 10462 | { | ||
| 10463 | Lisp_Object encoded = ENCODE_FILE (Fexpand_file_name (image_file, Qnil)); | ||
| 10464 | char *fname = SSDATA (encoded); | ||
| 10465 | BOOL result = false; | ||
| 10466 | DWORD err = 0; | ||
| 10467 | |||
| 10468 | /* UNICOWS.DLL seems to have SystemParametersInfoW, but it doesn't | ||
| 10469 | seem to be worth the hassle to support that on Windows 9X for the | ||
| 10470 | benefit of this minor feature. Let them use on Windows 9X only | ||
| 10471 | image file names that can be encoded by the system codepage. */ | ||
| 10472 | if (w32_unicode_filenames && system_parameters_info_w_fn) | ||
| 10473 | { | ||
| 10474 | wchar_t fname_w[MAX_PATH]; | ||
| 10475 | |||
| 10476 | if (filename_to_utf16 (fname, fname_w) != 0) | ||
| 10477 | err = ERROR_FILE_NOT_FOUND; | ||
| 10478 | else | ||
| 10479 | result = SystemParametersInfoW (SPI_SETDESKWALLPAPER, 0, fname_w, | ||
| 10480 | SPIF_SENDCHANGE); | ||
| 10481 | } | ||
| 10482 | else | ||
| 10483 | { | ||
| 10484 | char fname_a[MAX_PATH]; | ||
| 10485 | |||
| 10486 | if (filename_to_ansi (fname, fname_a) != 0) | ||
| 10487 | err = ERROR_FILE_NOT_FOUND; | ||
| 10488 | else | ||
| 10489 | result = SystemParametersInfoA (SPI_SETDESKWALLPAPER, 0, fname_a, | ||
| 10490 | SPIF_SENDCHANGE); | ||
| 10491 | } | ||
| 10492 | if (!result) | ||
| 10493 | { | ||
| 10494 | if (err == ERROR_FILE_NOT_FOUND) | ||
| 10495 | error ("Wallpaper file %s does not exist or cannot be accessed", fname); | ||
| 10496 | else | ||
| 10497 | { | ||
| 10498 | err = GetLastError (); | ||
| 10499 | if (err) | ||
| 10500 | error ("Could not set desktop wallpaper: %s", w32_strerror (err)); | ||
| 10501 | else | ||
| 10502 | error ("Could not set desktop wallpaper (wrong image type?)"); | ||
| 10503 | } | ||
| 10504 | } | ||
| 10505 | |||
| 10506 | return Qnil; | ||
| 10507 | } | ||
| 10508 | #endif | ||
| 10509 | |||
| 10453 | /*********************************************************************** | 10510 | /*********************************************************************** |
| 10454 | Initialization | 10511 | Initialization |
| 10455 | ***********************************************************************/ | 10512 | ***********************************************************************/ |
| @@ -10929,6 +10986,7 @@ keys when IME input is received. */); | |||
| 10929 | defsubr (&Sx_file_dialog); | 10986 | defsubr (&Sx_file_dialog); |
| 10930 | #ifdef WINDOWSNT | 10987 | #ifdef WINDOWSNT |
| 10931 | defsubr (&Ssystem_move_file_to_trash); | 10988 | defsubr (&Ssystem_move_file_to_trash); |
| 10989 | defsubr (&Sw32_set_wallpaper); | ||
| 10932 | #endif | 10990 | #endif |
| 10933 | } | 10991 | } |
| 10934 | 10992 | ||
| @@ -11182,6 +11240,10 @@ globals_of_w32fns (void) | |||
| 11182 | get_proc_addr (user32_lib, "EnumDisplayMonitors"); | 11240 | get_proc_addr (user32_lib, "EnumDisplayMonitors"); |
| 11183 | get_title_bar_info_fn = (GetTitleBarInfo_Proc) | 11241 | get_title_bar_info_fn = (GetTitleBarInfo_Proc) |
| 11184 | get_proc_addr (user32_lib, "GetTitleBarInfo"); | 11242 | get_proc_addr (user32_lib, "GetTitleBarInfo"); |
| 11243 | #ifndef CYGWIN | ||
| 11244 | system_parameters_info_w_fn = (SystemParametersInfoW_Proc) | ||
| 11245 | get_proc_addr (user32_lib, "SystemParametersInfoW"); | ||
| 11246 | #endif | ||
| 11185 | 11247 | ||
| 11186 | { | 11248 | { |
| 11187 | HMODULE imm32_lib = GetModuleHandle ("imm32.dll"); | 11249 | HMODULE imm32_lib = GetModuleHandle ("imm32.dll"); |
diff --git a/src/w32image.c b/src/w32image.c index da748b8dab4..af10d2bd265 100644 --- a/src/w32image.c +++ b/src/w32image.c | |||
| @@ -256,7 +256,7 @@ w32_can_use_native_image_api (Lisp_Object type) | |||
| 256 | || EQ (type, Qbmp) | 256 | || EQ (type, Qbmp) |
| 257 | || EQ (type, Qnative_image))) | 257 | || EQ (type, Qnative_image))) |
| 258 | { | 258 | { |
| 259 | /* GDI+ can also display BMP, Exif, ICON, WMF, and EMF images. | 259 | /* GDI+ can also display Exif, ICON, WMF, and EMF images. |
| 260 | But we don't yet support these in image.c. */ | 260 | But we don't yet support these in image.c. */ |
| 261 | return false; | 261 | return false; |
| 262 | } | 262 | } |
diff --git a/src/w32notify.c b/src/w32notify.c index 72e634f77c7..6b5fce9f927 100644 --- a/src/w32notify.c +++ b/src/w32notify.c | |||
| @@ -367,6 +367,12 @@ add_watch (const char *parent_dir, const char *file, BOOL subdirs, DWORD flags) | |||
| 367 | if (!file) | 367 | if (!file) |
| 368 | return NULL; | 368 | return NULL; |
| 369 | 369 | ||
| 370 | /* Do not follow symlinks, so that the caller could watch symlink | ||
| 371 | files. */ | ||
| 372 | DWORD crflags = FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED; | ||
| 373 | if (symlinks_supported (parent_dir)) | ||
| 374 | crflags |= FILE_FLAG_OPEN_REPARSE_POINT; | ||
| 375 | |||
| 370 | if (w32_unicode_filenames) | 376 | if (w32_unicode_filenames) |
| 371 | { | 377 | { |
| 372 | wchar_t dir_w[MAX_PATH], file_w[MAX_PATH]; | 378 | wchar_t dir_w[MAX_PATH], file_w[MAX_PATH]; |
| @@ -383,8 +389,7 @@ add_watch (const char *parent_dir, const char *file, BOOL subdirs, DWORD flags) | |||
| 383 | processes from deleting files inside | 389 | processes from deleting files inside |
| 384 | parent_dir. */ | 390 | parent_dir. */ |
| 385 | FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, | 391 | FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, |
| 386 | NULL, OPEN_EXISTING, | 392 | NULL, OPEN_EXISTING, crflags, |
| 387 | FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, | ||
| 388 | NULL); | 393 | NULL); |
| 389 | } | 394 | } |
| 390 | else | 395 | else |
| @@ -400,8 +405,7 @@ add_watch (const char *parent_dir, const char *file, BOOL subdirs, DWORD flags) | |||
| 400 | hdir = CreateFileA (dir_a, | 405 | hdir = CreateFileA (dir_a, |
| 401 | FILE_LIST_DIRECTORY, | 406 | FILE_LIST_DIRECTORY, |
| 402 | FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, | 407 | FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, |
| 403 | NULL, OPEN_EXISTING, | 408 | NULL, OPEN_EXISTING, crflags, |
| 404 | FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, | ||
| 405 | NULL); | 409 | NULL); |
| 406 | } | 410 | } |
| 407 | if (hdir == INVALID_HANDLE_VALUE) | 411 | if (hdir == INVALID_HANDLE_VALUE) |
diff --git a/src/widget.c b/src/widget.c index b125b4caeed..5a75cdaca8e 100644 --- a/src/widget.c +++ b/src/widget.c | |||
| @@ -292,18 +292,20 @@ update_wm_hints (Widget wmshell, EmacsFrame ew) | |||
| 292 | base_height = (wmshell->core.height - ew->core.height | 292 | base_height = (wmshell->core.height - ew->core.height |
| 293 | + (rounded_height - (char_height * ch))); | 293 | + (rounded_height - (char_height * ch))); |
| 294 | 294 | ||
| 295 | /* This is kind of sleazy, but I can't see how else to tell it to | 295 | /* Ensure that Xt actually sets window manager hint flags specified |
| 296 | make it mark the WM_SIZE_HINTS size as user specified. | 296 | by the caller by making sure XtNminWidth (a relatively harmless |
| 297 | */ | 297 | resource) always changes each time this function is invoked. */ |
| 298 | /* ((WMShellWidget) wmshell)->wm.size_hints.flags |= USSize;*/ | 298 | ew->emacs_frame.size_switch = !ew->emacs_frame.size_switch; |
| 299 | 299 | ||
| 300 | XtVaSetValues (wmshell, | 300 | XtVaSetValues (wmshell, |
| 301 | XtNbaseWidth, (XtArgVal) base_width, | 301 | XtNbaseWidth, (XtArgVal) base_width, |
| 302 | XtNbaseHeight, (XtArgVal) base_height, | 302 | XtNbaseHeight, (XtArgVal) base_height, |
| 303 | XtNwidthInc, (XtArgVal) (frame_resize_pixelwise ? 1 : cw), | 303 | XtNwidthInc, (XtArgVal) (frame_resize_pixelwise ? 1 : cw), |
| 304 | XtNheightInc, (XtArgVal) (frame_resize_pixelwise ? 1 : ch), | 304 | XtNheightInc, (XtArgVal) (frame_resize_pixelwise ? 1 : ch), |
| 305 | XtNminWidth, (XtArgVal) base_width, | 305 | XtNminWidth, (XtArgVal) (base_width |
| 306 | XtNminHeight, (XtArgVal) base_height, | 306 | + ew->emacs_frame.size_switch), |
| 307 | XtNminHeight, (XtArgVal) (base_height | ||
| 308 | + ew->emacs_frame.size_switch), | ||
| 307 | NULL); | 309 | NULL); |
| 308 | } | 310 | } |
| 309 | 311 | ||
| @@ -355,6 +357,8 @@ EmacsFrameInitialize (Widget request, Widget new, | |||
| 355 | exit (1); | 357 | exit (1); |
| 356 | } | 358 | } |
| 357 | 359 | ||
| 360 | ew->emacs_frame.size_switch = 1; | ||
| 361 | |||
| 358 | update_from_various_frame_slots (ew); | 362 | update_from_various_frame_slots (ew); |
| 359 | set_frame_size (ew); | 363 | set_frame_size (ew); |
| 360 | } | 364 | } |
diff --git a/src/widgetprv.h b/src/widgetprv.h index 960f814e16f..fe960326b03 100644 --- a/src/widgetprv.h +++ b/src/widgetprv.h | |||
| @@ -49,6 +49,8 @@ typedef struct { | |||
| 49 | 49 | ||
| 50 | Boolean visual_bell; /* flash instead of beep */ | 50 | Boolean visual_bell; /* flash instead of beep */ |
| 51 | int bell_volume; /* how loud is beep */ | 51 | int bell_volume; /* how loud is beep */ |
| 52 | int size_switch; /* hack to make setting size | ||
| 53 | hints work correctly */ | ||
| 52 | 54 | ||
| 53 | /* private state */ | 55 | /* private state */ |
| 54 | 56 | ||
diff --git a/src/window.c b/src/window.c index 2bce4c9723d..12a212a85ac 100644 --- a/src/window.c +++ b/src/window.c | |||
| @@ -8363,7 +8363,8 @@ on their symbols to be controlled by this variable. */); | |||
| 8363 | Vscroll_preserve_screen_position = Qnil; | 8363 | Vscroll_preserve_screen_position = Qnil; |
| 8364 | 8364 | ||
| 8365 | DEFVAR_LISP ("window-point-insertion-type", Vwindow_point_insertion_type, | 8365 | DEFVAR_LISP ("window-point-insertion-type", Vwindow_point_insertion_type, |
| 8366 | doc: /* Type of marker to use for `window-point'. */); | 8366 | doc: /* Insertion type of marker to use for `window-point'. |
| 8367 | See `marker-insertion-type' for the meaning of the possible values. */); | ||
| 8367 | Vwindow_point_insertion_type = Qnil; | 8368 | Vwindow_point_insertion_type = Qnil; |
| 8368 | DEFSYM (Qwindow_point_insertion_type, "window-point-insertion-type"); | 8369 | DEFSYM (Qwindow_point_insertion_type, "window-point-insertion-type"); |
| 8369 | 8370 | ||
diff --git a/src/xdisp.c b/src/xdisp.c index 70f6936dd0b..9534e27843e 100644 --- a/src/xdisp.c +++ b/src/xdisp.c | |||
| @@ -1960,15 +1960,18 @@ pos_visible_p (struct window *w, ptrdiff_t charpos, int *x, int *y, | |||
| 1960 | int top_x_before_string = it3.current_x; | 1960 | int top_x_before_string = it3.current_x; |
| 1961 | /* Finally, advance the iterator until we hit the | 1961 | /* Finally, advance the iterator until we hit the |
| 1962 | first display element whose character position is | 1962 | first display element whose character position is |
| 1963 | CHARPOS, or until the first newline from the | 1963 | at or beyond CHARPOS, or until the first newline |
| 1964 | display string, which signals the end of the | 1964 | from the display string, which signals the end of |
| 1965 | display line. */ | 1965 | the display line. */ |
| 1966 | while (get_next_display_element (&it3)) | 1966 | while (get_next_display_element (&it3)) |
| 1967 | { | 1967 | { |
| 1968 | if (!EQ (it3.object, string)) | 1968 | if (!EQ (it3.object, string)) |
| 1969 | top_x_before_string = it3.current_x; | 1969 | top_x_before_string = it3.current_x; |
| 1970 | PRODUCE_GLYPHS (&it3); | 1970 | PRODUCE_GLYPHS (&it3); |
| 1971 | if (IT_CHARPOS (it3) == charpos | 1971 | if ((it3.bidi_it.scan_dir == 1 |
| 1972 | && IT_CHARPOS (it3) >= charpos) | ||
| 1973 | || (it3.bidi_it.scan_dir == -1 | ||
| 1974 | && IT_CHARPOS (it3) <= charpos) | ||
| 1972 | || ITERATOR_AT_END_OF_LINE_P (&it3)) | 1975 | || ITERATOR_AT_END_OF_LINE_P (&it3)) |
| 1973 | break; | 1976 | break; |
| 1974 | it3_moved = true; | 1977 | it3_moved = true; |
| @@ -6309,7 +6312,10 @@ handle_composition_prop (struct it *it) | |||
| 6309 | pos_byte = IT_STRING_BYTEPOS (*it); | 6312 | pos_byte = IT_STRING_BYTEPOS (*it); |
| 6310 | string = it->string; | 6313 | string = it->string; |
| 6311 | s = SDATA (string) + pos_byte; | 6314 | s = SDATA (string) + pos_byte; |
| 6312 | it->c = STRING_CHAR (s); | 6315 | if (STRING_MULTIBYTE (string)) |
| 6316 | it->c = STRING_CHAR (s); | ||
| 6317 | else | ||
| 6318 | it->c = *s; | ||
| 6313 | } | 6319 | } |
| 6314 | else | 6320 | else |
| 6315 | { | 6321 | { |
| @@ -7040,7 +7046,14 @@ pop_it (struct it *it) | |||
| 7040 | || (STRINGP (it->object) | 7046 | || (STRINGP (it->object) |
| 7041 | && IT_STRING_CHARPOS (*it) == it->bidi_it.charpos | 7047 | && IT_STRING_CHARPOS (*it) == it->bidi_it.charpos |
| 7042 | && IT_STRING_BYTEPOS (*it) == it->bidi_it.bytepos) | 7048 | && IT_STRING_BYTEPOS (*it) == it->bidi_it.bytepos) |
| 7043 | || (CONSP (it->object) && it->method == GET_FROM_STRETCH)); | 7049 | || (CONSP (it->object) && it->method == GET_FROM_STRETCH) |
| 7050 | /* We could be in the middle of handling a list or a | ||
| 7051 | vector of several 'display' properties, in which | ||
| 7052 | case we should only verify the above conditions when | ||
| 7053 | we pop the iterator stack the last time, because | ||
| 7054 | higher stack levels cannot "iterate out of the | ||
| 7055 | display property". */ | ||
| 7056 | || it->sp > 0); | ||
| 7044 | } | 7057 | } |
| 7045 | /* If we move the iterator over text covered by a display property | 7058 | /* If we move the iterator over text covered by a display property |
| 7046 | to a new buffer position, any info about previously seen overlays | 7059 | to a new buffer position, any info about previously seen overlays |
| @@ -10710,11 +10723,6 @@ move_it_vertically_backward (struct it *it, int dy) | |||
| 10710 | while (nlines-- && IT_CHARPOS (*it) > pos_limit) | 10723 | while (nlines-- && IT_CHARPOS (*it) > pos_limit) |
| 10711 | back_to_previous_visible_line_start (it); | 10724 | back_to_previous_visible_line_start (it); |
| 10712 | 10725 | ||
| 10713 | /* Move one line more back, for the (rare) situation where we have | ||
| 10714 | bidi-reordered continued lines, and we start from the top-most | ||
| 10715 | screen line, which is the last in logical order. */ | ||
| 10716 | if (it->bidi_p && dy == 0) | ||
| 10717 | back_to_previous_visible_line_start (it); | ||
| 10718 | /* Reseat the iterator here. When moving backward, we don't want | 10726 | /* Reseat the iterator here. When moving backward, we don't want |
| 10719 | reseat to skip forward over invisible text, set up the iterator | 10727 | reseat to skip forward over invisible text, set up the iterator |
| 10720 | to deliver from overlay strings at the new position etc. So, | 10728 | to deliver from overlay strings at the new position etc. So, |
| @@ -10956,7 +10964,7 @@ move_it_by_lines (struct it *it, ptrdiff_t dvpos) | |||
| 10956 | { | 10964 | { |
| 10957 | struct it it2; | 10965 | struct it it2; |
| 10958 | void *it2data = NULL; | 10966 | void *it2data = NULL; |
| 10959 | ptrdiff_t start_charpos, i; | 10967 | ptrdiff_t start_charpos, orig_charpos, i; |
| 10960 | int nchars_per_row | 10968 | int nchars_per_row |
| 10961 | = (it->last_visible_x - it->first_visible_x) / FRAME_COLUMN_WIDTH (it->f); | 10969 | = (it->last_visible_x - it->first_visible_x) / FRAME_COLUMN_WIDTH (it->f); |
| 10962 | bool hit_pos_limit = false; | 10970 | bool hit_pos_limit = false; |
| @@ -10966,7 +10974,7 @@ move_it_by_lines (struct it *it, ptrdiff_t dvpos) | |||
| 10966 | position. This may actually move vertically backwards, | 10974 | position. This may actually move vertically backwards, |
| 10967 | in case of overlays, so adjust dvpos accordingly. */ | 10975 | in case of overlays, so adjust dvpos accordingly. */ |
| 10968 | dvpos += it->vpos; | 10976 | dvpos += it->vpos; |
| 10969 | start_charpos = IT_CHARPOS (*it); | 10977 | orig_charpos = IT_CHARPOS (*it); |
| 10970 | move_it_vertically_backward (it, 0); | 10978 | move_it_vertically_backward (it, 0); |
| 10971 | dvpos -= it->vpos; | 10979 | dvpos -= it->vpos; |
| 10972 | 10980 | ||
| @@ -11019,8 +11027,9 @@ move_it_by_lines (struct it *it, ptrdiff_t dvpos) | |||
| 11019 | RESTORE_IT (&it2, &it2, it2data); | 11027 | RESTORE_IT (&it2, &it2, it2data); |
| 11020 | SAVE_IT (it2, *it, it2data); | 11028 | SAVE_IT (it2, *it, it2data); |
| 11021 | move_it_to (it, -1, -1, -1, it->vpos + delta, MOVE_TO_VPOS); | 11029 | move_it_to (it, -1, -1, -1, it->vpos + delta, MOVE_TO_VPOS); |
| 11022 | /* Move back again if we got too far ahead. */ | 11030 | /* Move back again if we got too far ahead, |
| 11023 | if (it->vpos - it2.vpos > delta) | 11031 | or didn't move at all. */ |
| 11032 | if (it->vpos - it2.vpos > delta || IT_CHARPOS (*it) == orig_charpos) | ||
| 11024 | RESTORE_IT (it, &it2, it2data); | 11033 | RESTORE_IT (it, &it2, it2data); |
| 11025 | else | 11034 | else |
| 11026 | bidi_unshelve_cache (it2data, true); | 11035 | bidi_unshelve_cache (it2data, true); |
| @@ -31773,9 +31782,9 @@ gui_produce_glyphs (struct it *it) | |||
| 31773 | /* When no suitable font is found, display this character by | 31782 | /* When no suitable font is found, display this character by |
| 31774 | the method specified in the first extra slot of | 31783 | the method specified in the first extra slot of |
| 31775 | Vglyphless_char_display. */ | 31784 | Vglyphless_char_display. */ |
| 31776 | Lisp_Object acronym = lookup_glyphless_char_display (-1, it); | 31785 | Lisp_Object acronym = lookup_glyphless_char_display (-1, it); |
| 31777 | 31786 | ||
| 31778 | eassert (it->what == IT_GLYPHLESS); | 31787 | eassert (it->what == IT_GLYPHLESS); |
| 31779 | produce_glyphless_glyph (it, true, | 31788 | produce_glyphless_glyph (it, true, |
| 31780 | STRINGP (acronym) ? acronym : Qnil); | 31789 | STRINGP (acronym) ? acronym : Qnil); |
| 31781 | goto done; | 31790 | goto done; |
| @@ -37109,16 +37118,20 @@ Each element, if non-nil, should be one of the following: | |||
| 37109 | `empty-box': display as an empty box | 37118 | `empty-box': display as an empty box |
| 37110 | `thin-space': display as 1-pixel width space | 37119 | `thin-space': display as 1-pixel width space |
| 37111 | `zero-width': don't display | 37120 | `zero-width': don't display |
| 37121 | Any other value is interpreted as `empty-box'. | ||
| 37112 | An element may also be a cons cell (GRAPHICAL . TEXT), which specifies the | 37122 | An element may also be a cons cell (GRAPHICAL . TEXT), which specifies the |
| 37113 | display method for graphical terminals and text terminals respectively. | 37123 | display method for graphical terminals and text terminals respectively. |
| 37114 | GRAPHICAL and TEXT should each have one of the values listed above. | 37124 | GRAPHICAL and TEXT should each have one of the values listed above. |
| 37115 | 37125 | ||
| 37116 | The char-table has one extra slot to control the display of a character for | 37126 | The char-table has one extra slot to control the display of characters |
| 37117 | which no font is found. This slot only takes effect on graphical terminals. | 37127 | for which no font is found on graphical terminals, and characters that |
| 37118 | Its value should be an ASCII acronym string, `hex-code', `empty-box', or | 37128 | cannot be displayed by text-mode terminals. Its value should be an |
| 37119 | `thin-space'. It could also be a cons cell of any two of these, to specify | 37129 | ASCII acronym string, `hex-code', `empty-box', or `thin-space'. It |
| 37120 | separate values for graphical and text terminals. | 37130 | could also be a cons cell of any two of these, to specify separate |
| 37121 | The default is `empty-box'. | 37131 | values for graphical and text terminals. The default is `empty-box'. |
| 37132 | |||
| 37133 | With the obvious exception of `zero-width', all the other representations | ||
| 37134 | are displayed using the face `glyphless-char'. | ||
| 37122 | 37135 | ||
| 37123 | If a character has a non-nil entry in an active display table, the | 37136 | If a character has a non-nil entry in an active display table, the |
| 37124 | display table takes effect; in this case, Emacs does not consult | 37137 | display table takes effect; in this case, Emacs does not consult |
diff --git a/src/xfaces.c b/src/xfaces.c index 70d5cbeb4c7..5e3a47d7f8b 100644 --- a/src/xfaces.c +++ b/src/xfaces.c | |||
| @@ -3052,6 +3052,15 @@ The value is TO. */) | |||
| 3052 | } | 3052 | } |
| 3053 | 3053 | ||
| 3054 | 3054 | ||
| 3055 | #define HANDLE_INVALID_NIL_VALUE(A,F) \ | ||
| 3056 | if (NILP (value)) \ | ||
| 3057 | { \ | ||
| 3058 | add_to_log ("Warning: setting attribute `%s' of face `%s': nil " \ | ||
| 3059 | "value is invalid, use `unspecified' instead.", A, F); \ | ||
| 3060 | /* Compatibility with 20.x. */ \ | ||
| 3061 | value = Qunspecified; \ | ||
| 3062 | } | ||
| 3063 | |||
| 3055 | DEFUN ("internal-set-lisp-face-attribute", Finternal_set_lisp_face_attribute, | 3064 | DEFUN ("internal-set-lisp-face-attribute", Finternal_set_lisp_face_attribute, |
| 3056 | Sinternal_set_lisp_face_attribute, 3, 4, 0, | 3065 | Sinternal_set_lisp_face_attribute, 3, 4, 0, |
| 3057 | doc: /* Set attribute ATTR of FACE to VALUE. | 3066 | doc: /* Set attribute ATTR of FACE to VALUE. |
| @@ -3390,9 +3399,7 @@ FRAME 0 means change the face on all frames, and change the default | |||
| 3390 | } | 3399 | } |
| 3391 | else if (EQ (attr, QCforeground)) | 3400 | else if (EQ (attr, QCforeground)) |
| 3392 | { | 3401 | { |
| 3393 | /* Compatibility with 20.x. */ | 3402 | HANDLE_INVALID_NIL_VALUE (QCforeground, face); |
| 3394 | if (NILP (value)) | ||
| 3395 | value = Qunspecified; | ||
| 3396 | if (!UNSPECIFIEDP (value) | 3403 | if (!UNSPECIFIEDP (value) |
| 3397 | && !IGNORE_DEFFACE_P (value) | 3404 | && !IGNORE_DEFFACE_P (value) |
| 3398 | && !RESET_P (value)) | 3405 | && !RESET_P (value)) |
| @@ -3409,9 +3416,7 @@ FRAME 0 means change the face on all frames, and change the default | |||
| 3409 | } | 3416 | } |
| 3410 | else if (EQ (attr, QCdistant_foreground)) | 3417 | else if (EQ (attr, QCdistant_foreground)) |
| 3411 | { | 3418 | { |
| 3412 | /* Compatibility with 20.x. */ | 3419 | HANDLE_INVALID_NIL_VALUE (QCdistant_foreground, face); |
| 3413 | if (NILP (value)) | ||
| 3414 | value = Qunspecified; | ||
| 3415 | if (!UNSPECIFIEDP (value) | 3420 | if (!UNSPECIFIEDP (value) |
| 3416 | && !IGNORE_DEFFACE_P (value) | 3421 | && !IGNORE_DEFFACE_P (value) |
| 3417 | && !RESET_P (value)) | 3422 | && !RESET_P (value)) |
| @@ -3428,9 +3433,7 @@ FRAME 0 means change the face on all frames, and change the default | |||
| 3428 | } | 3433 | } |
| 3429 | else if (EQ (attr, QCbackground)) | 3434 | else if (EQ (attr, QCbackground)) |
| 3430 | { | 3435 | { |
| 3431 | /* Compatibility with 20.x. */ | 3436 | HANDLE_INVALID_NIL_VALUE (QCbackground, face); |
| 3432 | if (NILP (value)) | ||
| 3433 | value = Qunspecified; | ||
| 3434 | if (!UNSPECIFIEDP (value) | 3437 | if (!UNSPECIFIEDP (value) |
| 3435 | && !IGNORE_DEFFACE_P (value) | 3438 | && !IGNORE_DEFFACE_P (value) |
| 3436 | && !RESET_P (value)) | 3439 | && !RESET_P (value)) |
diff --git a/src/xfns.c b/src/xfns.c index 0b1f707e9fc..8cea93c6698 100644 --- a/src/xfns.c +++ b/src/xfns.c | |||
| @@ -2423,14 +2423,33 @@ x_set_use_frame_synchronization (struct frame *f, Lisp_Object arg, | |||
| 2423 | { | 2423 | { |
| 2424 | #if defined HAVE_XSYNC && !defined USE_GTK && defined HAVE_CLOCK_GETTIME | 2424 | #if defined HAVE_XSYNC && !defined USE_GTK && defined HAVE_CLOCK_GETTIME |
| 2425 | struct x_display_info *dpyinfo; | 2425 | struct x_display_info *dpyinfo; |
| 2426 | unsigned long bypass_compositor; | ||
| 2426 | 2427 | ||
| 2427 | dpyinfo = FRAME_DISPLAY_INFO (f); | 2428 | dpyinfo = FRAME_DISPLAY_INFO (f); |
| 2428 | 2429 | ||
| 2429 | if (!NILP (arg) && FRAME_X_EXTENDED_COUNTER (f)) | 2430 | if (!NILP (arg) && FRAME_X_EXTENDED_COUNTER (f)) |
| 2430 | FRAME_X_OUTPUT (f)->use_vsync_p | 2431 | { |
| 2431 | = x_wm_supports (f, dpyinfo->Xatom_net_wm_frame_drawn); | 2432 | FRAME_X_OUTPUT (f)->use_vsync_p |
| 2433 | = x_wm_supports (f, dpyinfo->Xatom_net_wm_frame_drawn); | ||
| 2434 | |||
| 2435 | /* At the same time, write the bypass compositor property to the | ||
| 2436 | outer window. 2 means to never bypass the compositor, as we | ||
| 2437 | need its cooperation for frame synchronization. */ | ||
| 2438 | bypass_compositor = 2; | ||
| 2439 | XChangeProperty (dpyinfo->display, FRAME_OUTER_WINDOW (f), | ||
| 2440 | dpyinfo->Xatom_net_wm_bypass_compositor, | ||
| 2441 | XA_CARDINAL, 32, PropModeReplace, | ||
| 2442 | (unsigned char *) &bypass_compositor, 1); | ||
| 2443 | } | ||
| 2432 | else | 2444 | else |
| 2433 | FRAME_X_OUTPUT (f)->use_vsync_p = false; | 2445 | { |
| 2446 | FRAME_X_OUTPUT (f)->use_vsync_p = false; | ||
| 2447 | |||
| 2448 | /* Remove the compositor bypass property from the outer | ||
| 2449 | window. */ | ||
| 2450 | XDeleteProperty (dpyinfo->display, FRAME_OUTER_WINDOW (f), | ||
| 2451 | dpyinfo->Xatom_net_wm_bypass_compositor); | ||
| 2452 | } | ||
| 2434 | 2453 | ||
| 2435 | store_frame_param (f, Quse_frame_synchronization, | 2454 | store_frame_param (f, Quse_frame_synchronization, |
| 2436 | FRAME_X_OUTPUT (f)->use_vsync_p ? Qt : Qnil); | 2455 | FRAME_X_OUTPUT (f)->use_vsync_p ? Qt : Qnil); |
| @@ -3335,22 +3354,30 @@ struct x_xim_text_conversion_data | |||
| 3335 | { | 3354 | { |
| 3336 | struct coding_system *coding; | 3355 | struct coding_system *coding; |
| 3337 | char *source; | 3356 | char *source; |
| 3357 | struct x_display_info *dpyinfo; | ||
| 3338 | }; | 3358 | }; |
| 3339 | 3359 | ||
| 3340 | static Lisp_Object | 3360 | static Lisp_Object |
| 3341 | x_xim_text_to_utf8_unix_1 (ptrdiff_t nargs, | 3361 | x_xim_text_to_utf8_unix_1 (ptrdiff_t nargs, Lisp_Object *args) |
| 3342 | Lisp_Object *args) | ||
| 3343 | { | 3362 | { |
| 3344 | struct x_xim_text_conversion_data *data; | 3363 | struct x_xim_text_conversion_data *data; |
| 3345 | ptrdiff_t nbytes; | 3364 | ptrdiff_t nbytes; |
| 3365 | Lisp_Object coding_system; | ||
| 3346 | 3366 | ||
| 3347 | data = xmint_pointer (args[0]); | 3367 | data = xmint_pointer (args[0]); |
| 3368 | |||
| 3369 | if (SYMBOLP (Vx_input_coding_system)) | ||
| 3370 | coding_system = Vx_input_coding_system; | ||
| 3371 | else if (!NILP (data->dpyinfo->xim_coding)) | ||
| 3372 | coding_system = data->dpyinfo->xim_coding; | ||
| 3373 | else | ||
| 3374 | coding_system = Vlocale_coding_system; | ||
| 3375 | |||
| 3348 | nbytes = strlen (data->source); | 3376 | nbytes = strlen (data->source); |
| 3349 | 3377 | ||
| 3350 | data->coding->destination = NULL; | 3378 | data->coding->destination = NULL; |
| 3351 | 3379 | ||
| 3352 | setup_coding_system (Vlocale_coding_system, | 3380 | setup_coding_system (coding_system, data->coding); |
| 3353 | data->coding); | ||
| 3354 | data->coding->mode |= (CODING_MODE_LAST_BLOCK | 3381 | data->coding->mode |= (CODING_MODE_LAST_BLOCK |
| 3355 | | CODING_MODE_SAFE_ENCODING); | 3382 | | CODING_MODE_SAFE_ENCODING); |
| 3356 | data->coding->source = (const unsigned char *) data->source; | 3383 | data->coding->source = (const unsigned char *) data->source; |
| @@ -3363,8 +3390,7 @@ x_xim_text_to_utf8_unix_1 (ptrdiff_t nargs, | |||
| 3363 | } | 3390 | } |
| 3364 | 3391 | ||
| 3365 | static Lisp_Object | 3392 | static Lisp_Object |
| 3366 | x_xim_text_to_utf8_unix_2 (Lisp_Object val, | 3393 | x_xim_text_to_utf8_unix_2 (Lisp_Object val, ptrdiff_t nargs, |
| 3367 | ptrdiff_t nargs, | ||
| 3368 | Lisp_Object *args) | 3394 | Lisp_Object *args) |
| 3369 | { | 3395 | { |
| 3370 | struct x_xim_text_conversion_data *data; | 3396 | struct x_xim_text_conversion_data *data; |
| @@ -3381,7 +3407,8 @@ x_xim_text_to_utf8_unix_2 (Lisp_Object val, | |||
| 3381 | 3407 | ||
| 3382 | /* The string returned is not null-terminated. */ | 3408 | /* The string returned is not null-terminated. */ |
| 3383 | static char * | 3409 | static char * |
| 3384 | x_xim_text_to_utf8_unix (XIMText *text, ptrdiff_t *length) | 3410 | x_xim_text_to_utf8_unix (struct x_display_info *dpyinfo, |
| 3411 | XIMText *text, ptrdiff_t *length) | ||
| 3385 | { | 3412 | { |
| 3386 | unsigned char *wchar_buf; | 3413 | unsigned char *wchar_buf; |
| 3387 | ptrdiff_t wchar_actual_length, i; | 3414 | ptrdiff_t wchar_actual_length, i; |
| @@ -3405,6 +3432,7 @@ x_xim_text_to_utf8_unix (XIMText *text, ptrdiff_t *length) | |||
| 3405 | 3432 | ||
| 3406 | data.coding = &coding; | 3433 | data.coding = &coding; |
| 3407 | data.source = text->string.multi_byte; | 3434 | data.source = text->string.multi_byte; |
| 3435 | data.dpyinfo = dpyinfo; | ||
| 3408 | 3436 | ||
| 3409 | was_waiting_for_input_p = waiting_for_input; | 3437 | was_waiting_for_input_p = waiting_for_input; |
| 3410 | /* Otherwise Fsignal will crash. */ | 3438 | /* Otherwise Fsignal will crash. */ |
| @@ -3422,18 +3450,21 @@ static void | |||
| 3422 | xic_preedit_draw_callback (XIC xic, XPointer client_data, | 3450 | xic_preedit_draw_callback (XIC xic, XPointer client_data, |
| 3423 | XIMPreeditDrawCallbackStruct *call_data) | 3451 | XIMPreeditDrawCallbackStruct *call_data) |
| 3424 | { | 3452 | { |
| 3425 | struct frame *f = x_xic_to_frame (xic); | 3453 | struct frame *f; |
| 3426 | struct x_output *output; | 3454 | struct x_output *output; |
| 3427 | ptrdiff_t text_length = 0; | 3455 | ptrdiff_t text_length; |
| 3428 | ptrdiff_t charpos; | 3456 | ptrdiff_t charpos; |
| 3429 | ptrdiff_t original_size; | 3457 | ptrdiff_t original_size; |
| 3430 | char *text; | 3458 | char *text; |
| 3431 | char *chg_start, *chg_end; | 3459 | char *chg_start, *chg_end; |
| 3432 | struct input_event ie; | 3460 | struct input_event ie; |
| 3461 | |||
| 3462 | f = x_xic_to_frame (xic); | ||
| 3433 | EVENT_INIT (ie); | 3463 | EVENT_INIT (ie); |
| 3434 | 3464 | ||
| 3435 | if (f) | 3465 | if (f) |
| 3436 | { | 3466 | { |
| 3467 | text_length = 0; | ||
| 3437 | output = FRAME_X_OUTPUT (f); | 3468 | output = FRAME_X_OUTPUT (f); |
| 3438 | 3469 | ||
| 3439 | if (!output->preedit_active) | 3470 | if (!output->preedit_active) |
| @@ -3441,7 +3472,8 @@ xic_preedit_draw_callback (XIC xic, XPointer client_data, | |||
| 3441 | 3472 | ||
| 3442 | if (call_data->text) | 3473 | if (call_data->text) |
| 3443 | { | 3474 | { |
| 3444 | text = x_xim_text_to_utf8_unix (call_data->text, &text_length); | 3475 | text = x_xim_text_to_utf8_unix (FRAME_DISPLAY_INFO (f), |
| 3476 | call_data->text, &text_length); | ||
| 3445 | 3477 | ||
| 3446 | if (!text) | 3478 | if (!text) |
| 3447 | /* Decoding the IM text failed. */ | 3479 | /* Decoding the IM text failed. */ |
| @@ -3955,10 +3987,6 @@ x_window (struct frame *f, long window_prompting) | |||
| 3955 | XtManageChild (pane_widget); | 3987 | XtManageChild (pane_widget); |
| 3956 | XtRealizeWidget (shell_widget); | 3988 | XtRealizeWidget (shell_widget); |
| 3957 | 3989 | ||
| 3958 | if (FRAME_X_EMBEDDED_P (f)) | ||
| 3959 | XReparentWindow (FRAME_X_DISPLAY (f), XtWindow (shell_widget), | ||
| 3960 | f->output_data.x->parent_desc, 0, 0); | ||
| 3961 | |||
| 3962 | FRAME_X_WINDOW (f) = XtWindow (frame_widget); | 3990 | FRAME_X_WINDOW (f) = XtWindow (frame_widget); |
| 3963 | initial_set_up_x_back_buffer (f); | 3991 | initial_set_up_x_back_buffer (f); |
| 3964 | validate_x_resource_name (); | 3992 | validate_x_resource_name (); |
| @@ -4132,7 +4160,7 @@ x_window (struct frame *f) | |||
| 4132 | block_input (); | 4160 | block_input (); |
| 4133 | FRAME_X_WINDOW (f) | 4161 | FRAME_X_WINDOW (f) |
| 4134 | = XCreateWindow (FRAME_X_DISPLAY (f), | 4162 | = XCreateWindow (FRAME_X_DISPLAY (f), |
| 4135 | f->output_data.x->parent_desc, | 4163 | FRAME_DISPLAY_INFO (f)->root_window, |
| 4136 | f->left_pos, | 4164 | f->left_pos, |
| 4137 | f->top_pos, | 4165 | f->top_pos, |
| 4138 | FRAME_PIXEL_WIDTH (f), FRAME_PIXEL_HEIGHT (f), | 4166 | FRAME_PIXEL_WIDTH (f), FRAME_PIXEL_HEIGHT (f), |
| @@ -4958,6 +4986,12 @@ This function is an internal primitive--use `make-frame' instead. */) | |||
| 4958 | x_window (f); | 4986 | x_window (f); |
| 4959 | #endif | 4987 | #endif |
| 4960 | 4988 | ||
| 4989 | #ifndef USE_GTK | ||
| 4990 | if (FRAME_X_EMBEDDED_P (f) | ||
| 4991 | && !x_embed_frame (dpyinfo, f)) | ||
| 4992 | error ("The frame could not be embedded; does the embedder exist?"); | ||
| 4993 | #endif | ||
| 4994 | |||
| 4961 | x_icon (f, parms); | 4995 | x_icon (f, parms); |
| 4962 | x_make_gc (f); | 4996 | x_make_gc (f); |
| 4963 | 4997 | ||
| @@ -5519,15 +5553,15 @@ On MS Windows, this returns nothing useful. */) | |||
| 5519 | switch (DoesBackingStore (dpyinfo->screen)) | 5553 | switch (DoesBackingStore (dpyinfo->screen)) |
| 5520 | { | 5554 | { |
| 5521 | case Always: | 5555 | case Always: |
| 5522 | result = intern ("always"); | 5556 | result = Qalways; |
| 5523 | break; | 5557 | break; |
| 5524 | 5558 | ||
| 5525 | case WhenMapped: | 5559 | case WhenMapped: |
| 5526 | result = intern ("when-mapped"); | 5560 | result = Qwhen_mapped; |
| 5527 | break; | 5561 | break; |
| 5528 | 5562 | ||
| 5529 | case NotUseful: | 5563 | case NotUseful: |
| 5530 | result = intern ("not-useful"); | 5564 | result = Qnot_useful; |
| 5531 | break; | 5565 | break; |
| 5532 | 5566 | ||
| 5533 | default: | 5567 | default: |
| @@ -5556,22 +5590,22 @@ If omitted or nil, that stands for the selected frame's display. | |||
| 5556 | switch (dpyinfo->visual_info.class) | 5590 | switch (dpyinfo->visual_info.class) |
| 5557 | { | 5591 | { |
| 5558 | case StaticGray: | 5592 | case StaticGray: |
| 5559 | result = intern ("static-gray"); | 5593 | result = Qstatic_gray; |
| 5560 | break; | 5594 | break; |
| 5561 | case GrayScale: | 5595 | case GrayScale: |
| 5562 | result = intern ("gray-scale"); | 5596 | result = Qgray_scale; |
| 5563 | break; | 5597 | break; |
| 5564 | case StaticColor: | 5598 | case StaticColor: |
| 5565 | result = intern ("static-color"); | 5599 | result = Qstatic_color; |
| 5566 | break; | 5600 | break; |
| 5567 | case PseudoColor: | 5601 | case PseudoColor: |
| 5568 | result = intern ("pseudo-color"); | 5602 | result = Qpseudo_color; |
| 5569 | break; | 5603 | break; |
| 5570 | case TrueColor: | 5604 | case TrueColor: |
| 5571 | result = intern ("true-color"); | 5605 | result = Qtrue_color; |
| 5572 | break; | 5606 | break; |
| 5573 | case DirectColor: | 5607 | case DirectColor: |
| 5574 | result = intern ("direct-color"); | 5608 | result = Qdirect_color; |
| 5575 | break; | 5609 | break; |
| 5576 | default: | 5610 | default: |
| 5577 | error ("Display has an unknown visual class"); | 5611 | error ("Display has an unknown visual class"); |
| @@ -6223,8 +6257,8 @@ In addition to the standard attribute keys listed in | |||
| 6223 | the attributes: | 6257 | the attributes: |
| 6224 | 6258 | ||
| 6225 | source -- String describing the source from which multi-monitor | 6259 | source -- String describing the source from which multi-monitor |
| 6226 | information is obtained, one of \"Gdk\", \"XRandr\", | 6260 | information is obtained, one of \"Gdk\", \"XRandR 1.5\", |
| 6227 | \"Xinerama\", or \"fallback\" | 6261 | \"XRandr\", \"Xinerama\", or \"fallback\" |
| 6228 | 6262 | ||
| 6229 | Internal use only, use `display-monitor-attributes-list' instead. */) | 6263 | Internal use only, use `display-monitor-attributes-list' instead. */) |
| 6230 | (Lisp_Object terminal) | 6264 | (Lisp_Object terminal) |
| @@ -7229,8 +7263,6 @@ x_display_info_for_name (Lisp_Object name) | |||
| 7229 | if (dpyinfo == 0) | 7263 | if (dpyinfo == 0) |
| 7230 | error ("Cannot connect to X server %s", SDATA (name)); | 7264 | error ("Cannot connect to X server %s", SDATA (name)); |
| 7231 | 7265 | ||
| 7232 | XSETFASTINT (Vwindow_system_version, 11); | ||
| 7233 | |||
| 7234 | return dpyinfo; | 7266 | return dpyinfo; |
| 7235 | } | 7267 | } |
| 7236 | 7268 | ||
| @@ -7274,7 +7306,6 @@ An insecure way to solve the problem may be to use `xhost'.\n", | |||
| 7274 | error ("Cannot connect to X server %s", SDATA (display)); | 7306 | error ("Cannot connect to X server %s", SDATA (display)); |
| 7275 | } | 7307 | } |
| 7276 | 7308 | ||
| 7277 | XSETFASTINT (Vwindow_system_version, 11); | ||
| 7278 | return Qnil; | 7309 | return Qnil; |
| 7279 | } | 7310 | } |
| 7280 | 7311 | ||
| @@ -7693,17 +7724,40 @@ DEFUN ("x-window-property", Fx_window_property, Sx_window_property, | |||
| 7693 | doc: /* Value is the value of window property PROP on FRAME. | 7724 | doc: /* Value is the value of window property PROP on FRAME. |
| 7694 | If FRAME is nil or omitted, use the selected frame. | 7725 | If FRAME is nil or omitted, use the selected frame. |
| 7695 | 7726 | ||
| 7696 | On X Windows, the following optional arguments are also accepted: | 7727 | On X Windows, the following optional arguments are also accepted: If |
| 7697 | If TYPE is nil or omitted, get the property as a string. | 7728 | TYPE is nil or omitted, get the property as a string. Otherwise TYPE |
| 7698 | Otherwise TYPE is the name of the atom that denotes the expected type. | 7729 | is the name of the atom that denotes the expected type. |
| 7730 | |||
| 7731 | If TYPE is the string "AnyPropertyType", decode and return the data | ||
| 7732 | regardless of what the type really is. | ||
| 7733 | |||
| 7734 | The format of the data returned is the same as a selection conversion | ||
| 7735 | to the given type. For example, if `x-get-selection-internal' returns | ||
| 7736 | an integer when the selection data is a given type, | ||
| 7737 | `x-window-property' will do the same for that type. | ||
| 7738 | |||
| 7699 | If WINDOW-ID is non-nil, get the property of that window instead of | 7739 | If WINDOW-ID is non-nil, get the property of that window instead of |
| 7700 | FRAME's X window; the number 0 denotes the root window. This argument | 7740 | FRAME's X window; the number 0 denotes the root window. This argument |
| 7701 | is separate from FRAME because window IDs are not unique across X | 7741 | is separate from FRAME because window IDs are not unique across X |
| 7702 | displays or screens on the same display, so FRAME provides context | 7742 | displays, so FRAME provides context for the window ID. |
| 7703 | for the window ID. | 7743 | |
| 7704 | If DELETE-P is non-nil, delete the property after retrieving it. | 7744 | If DELETE-P is non-nil, delete the property after retrieving it. |
| 7705 | If VECTOR-RET-P is non-nil, return a vector of values instead of a string. | 7745 | If VECTOR-RET-P is non-nil, return a vector of values instead of a string. |
| 7706 | 7746 | ||
| 7747 | X allows an arbitrary number of properties to be set on any window. | ||
| 7748 | However, properties are most often set by the window manager or other | ||
| 7749 | programs on the root window or FRAME's X window in order to | ||
| 7750 | communicate information to Emacs and other programs. Most of these | ||
| 7751 | properties are specified as part of the Extended Window Manager Hints | ||
| 7752 | and the Inter-Client Communication Conventions Manual, which are | ||
| 7753 | located here: | ||
| 7754 | |||
| 7755 | https://specifications.freedesktop.org/wm-spec/wm-spec-latest.html | ||
| 7756 | |||
| 7757 | and | ||
| 7758 | |||
| 7759 | https://x.org/releases/X11R7.6/doc/xorg-docs/specs/ICCCM/icccm.html | ||
| 7760 | |||
| 7707 | Return value is nil if FRAME doesn't have a property with name PROP or | 7761 | Return value is nil if FRAME doesn't have a property with name PROP or |
| 7708 | if PROP has no value of TYPE (always a string in the MS Windows case). */) | 7762 | if PROP has no value of TYPE (always a string in the MS Windows case). */) |
| 7709 | (Lisp_Object prop, Lisp_Object frame, Lisp_Object type, | 7763 | (Lisp_Object prop, Lisp_Object frame, Lisp_Object type, |
| @@ -8291,9 +8345,9 @@ x_create_tip_frame (struct x_display_info *dpyinfo, Lisp_Object parms) | |||
| 8291 | disptype = Qmono; | 8345 | disptype = Qmono; |
| 8292 | else if (FRAME_X_VISUAL_INFO (f)->class == GrayScale | 8346 | else if (FRAME_X_VISUAL_INFO (f)->class == GrayScale |
| 8293 | || FRAME_X_VISUAL_INFO (f)->class == StaticGray) | 8347 | || FRAME_X_VISUAL_INFO (f)->class == StaticGray) |
| 8294 | disptype = intern ("grayscale"); | 8348 | disptype = Qgrayscale; |
| 8295 | else | 8349 | else |
| 8296 | disptype = intern ("color"); | 8350 | disptype = Qcolor; |
| 8297 | 8351 | ||
| 8298 | if (NILP (Fframe_parameter (frame, Qdisplay_type))) | 8352 | if (NILP (Fframe_parameter (frame, Qdisplay_type))) |
| 8299 | { | 8353 | { |
| @@ -8955,8 +9009,8 @@ Text larger than the specified size is clipped. */) | |||
| 8955 | 9009 | ||
| 8956 | start_timer: | 9010 | start_timer: |
| 8957 | /* Let the tip disappear after timeout seconds. */ | 9011 | /* Let the tip disappear after timeout seconds. */ |
| 8958 | tip_timer = call3 (intern ("run-at-time"), timeout, Qnil, | 9012 | tip_timer = call3 (Qrun_at_time, timeout, Qnil, |
| 8959 | intern ("x-hide-tip")); | 9013 | Qx_hide_tip); |
| 8960 | 9014 | ||
| 8961 | return unbind_to (count, Qnil); | 9015 | return unbind_to (count, Qnil); |
| 8962 | } | 9016 | } |
| @@ -10054,6 +10108,23 @@ eliminated in future versions of Emacs. */); | |||
| 10054 | /* Tell Emacs about this window system. */ | 10108 | /* Tell Emacs about this window system. */ |
| 10055 | Fprovide (Qx, Qnil); | 10109 | Fprovide (Qx, Qnil); |
| 10056 | 10110 | ||
| 10111 | /* Used by Fx_show_tip. */ | ||
| 10112 | DEFSYM (Qrun_at_time, "run-at-time"); | ||
| 10113 | DEFSYM (Qx_hide_tip, "x-hide-tip"); | ||
| 10114 | |||
| 10115 | /* Used by display class and backing store reporting functions. */ | ||
| 10116 | DEFSYM (Qalways, "always"); | ||
| 10117 | DEFSYM (Qwhen_mapped, "when-mapped"); | ||
| 10118 | DEFSYM (Qnot_useful, "not-useful"); | ||
| 10119 | DEFSYM (Qstatic_gray, "static-gray"); | ||
| 10120 | DEFSYM (Qgray_scale, "gray-scale"); | ||
| 10121 | DEFSYM (Qstatic_color, "static-color"); | ||
| 10122 | DEFSYM (Qpseudo_color, "pseudo-color"); | ||
| 10123 | DEFSYM (Qtrue_color, "true-color"); | ||
| 10124 | DEFSYM (Qdirect_color, "direct-color"); | ||
| 10125 | DEFSYM (Qgrayscale, "grayscale"); | ||
| 10126 | DEFSYM (Qcolor, "color"); | ||
| 10127 | |||
| 10057 | #ifdef HAVE_XINPUT2 | 10128 | #ifdef HAVE_XINPUT2 |
| 10058 | DEFSYM (Qxinput2, "xinput2"); | 10129 | DEFSYM (Qxinput2, "xinput2"); |
| 10059 | 10130 | ||
diff --git a/src/xfont.c b/src/xfont.c index 74237e8aa88..951446b44d2 100644 --- a/src/xfont.c +++ b/src/xfont.c | |||
| @@ -253,9 +253,9 @@ xfont_supported_scripts (Display *display, char *fontname, Lisp_Object props, | |||
| 253 | 253 | ||
| 254 | /* Two special cases to avoid opening rather big fonts. */ | 254 | /* Two special cases to avoid opening rather big fonts. */ |
| 255 | if (EQ (AREF (props, 2), Qja)) | 255 | if (EQ (AREF (props, 2), Qja)) |
| 256 | return list2 (intern ("kana"), intern ("han")); | 256 | return list2 (Qkana, Qhan); |
| 257 | if (EQ (AREF (props, 2), Qko)) | 257 | if (EQ (AREF (props, 2), Qko)) |
| 258 | return list1 (intern ("hangul")); | 258 | return list1 (Qhangul); |
| 259 | scripts = Fgethash (props, xfont_scripts_cache, Qt); | 259 | scripts = Fgethash (props, xfont_scripts_cache, Qt); |
| 260 | if (EQ (scripts, Qt)) | 260 | if (EQ (scripts, Qt)) |
| 261 | { | 261 | { |
| @@ -1130,19 +1130,19 @@ static void syms_of_xfont_for_pdumper (void); | |||
| 1130 | 1130 | ||
| 1131 | struct font_driver const xfont_driver = | 1131 | struct font_driver const xfont_driver = |
| 1132 | { | 1132 | { |
| 1133 | .type = LISPSYM_INITIALLY (Qx), | 1133 | .type = LISPSYM_INITIALLY (Qx), |
| 1134 | .get_cache = xfont_get_cache, | 1134 | .get_cache = xfont_get_cache, |
| 1135 | .list = xfont_list, | 1135 | .list = xfont_list, |
| 1136 | .match = xfont_match, | 1136 | .match = xfont_match, |
| 1137 | .list_family = xfont_list_family, | 1137 | .list_family = xfont_list_family, |
| 1138 | .open_font = xfont_open, | 1138 | .open_font = xfont_open, |
| 1139 | .close_font = xfont_close, | 1139 | .close_font = xfont_close, |
| 1140 | .prepare_face = xfont_prepare_face, | 1140 | .prepare_face = xfont_prepare_face, |
| 1141 | .has_char = xfont_has_char, | 1141 | .has_char = xfont_has_char, |
| 1142 | .encode_char = xfont_encode_char, | 1142 | .encode_char = xfont_encode_char, |
| 1143 | .text_extents = xfont_text_extents, | 1143 | .text_extents = xfont_text_extents, |
| 1144 | .draw = xfont_draw, | 1144 | .draw = xfont_draw, |
| 1145 | .check = xfont_check, | 1145 | .check = xfont_check, |
| 1146 | }; | 1146 | }; |
| 1147 | 1147 | ||
| 1148 | void | 1148 | void |
| @@ -1153,6 +1153,10 @@ syms_of_xfont (void) | |||
| 1153 | staticpro (&xfont_scratch_props); | 1153 | staticpro (&xfont_scratch_props); |
| 1154 | xfont_scratch_props = make_nil_vector (8); | 1154 | xfont_scratch_props = make_nil_vector (8); |
| 1155 | pdumper_do_now_and_after_load (syms_of_xfont_for_pdumper); | 1155 | pdumper_do_now_and_after_load (syms_of_xfont_for_pdumper); |
| 1156 | |||
| 1157 | DEFSYM (Qkana, "kana"); | ||
| 1158 | DEFSYM (Qhan, "han"); | ||
| 1159 | DEFSYM (Qhangul, "hangul"); | ||
| 1156 | } | 1160 | } |
| 1157 | 1161 | ||
| 1158 | static void | 1162 | static void |
diff --git a/src/xrdb.c b/src/xrdb.c index faeea04a539..01c9ff5558a 100644 --- a/src/xrdb.c +++ b/src/xrdb.c | |||
| @@ -511,107 +511,3 @@ x_get_string_resource (void *v_rdb, const char *name, const char *class) | |||
| 511 | 511 | ||
| 512 | return NULL; | 512 | return NULL; |
| 513 | } | 513 | } |
| 514 | |||
| 515 | /* Stand-alone test facilities. */ | ||
| 516 | |||
| 517 | #ifdef TESTRM | ||
| 518 | |||
| 519 | typedef char **List; | ||
| 520 | #define arg_listify(len, list) (list) | ||
| 521 | #define car(list) (*(list)) | ||
| 522 | #define cdr(list) (list + 1) | ||
| 523 | #define NIL(list) (! *(list)) | ||
| 524 | #define free_arglist(list) | ||
| 525 | |||
| 526 | static List | ||
| 527 | member (char *elt, List list) | ||
| 528 | { | ||
| 529 | List p; | ||
| 530 | |||
| 531 | for (p = list; ! NIL (p); p = cdr (p)) | ||
| 532 | if (! strcmp (elt, car (p))) | ||
| 533 | return p; | ||
| 534 | |||
| 535 | return p; | ||
| 536 | } | ||
| 537 | |||
| 538 | static void | ||
| 539 | fatal (char *msg, char *prog) | ||
| 540 | { | ||
| 541 | fprintf (stderr, msg, prog); | ||
| 542 | exit (1); | ||
| 543 | } | ||
| 544 | |||
| 545 | int | ||
| 546 | main (int argc, char **argv) | ||
| 547 | { | ||
| 548 | Display *display; | ||
| 549 | char *displayname, *resource_string, *class, *name; | ||
| 550 | XrmDatabase xdb; | ||
| 551 | List arg_list, lp; | ||
| 552 | |||
| 553 | arg_list = arg_listify (argc, argv); | ||
| 554 | |||
| 555 | lp = member ("-d", arg_list); | ||
| 556 | if (!NIL (lp)) | ||
| 557 | displayname = car (cdr (lp)); | ||
| 558 | else | ||
| 559 | displayname = "localhost:0.0"; | ||
| 560 | |||
| 561 | lp = member ("-xrm", arg_list); | ||
| 562 | resource_string = NIL (lp) ? 0 : car (cdr (lp)); | ||
| 563 | |||
| 564 | lp = member ("-c", arg_list); | ||
| 565 | if (! NIL (lp)) | ||
| 566 | class = car (cdr (lp)); | ||
| 567 | else | ||
| 568 | class = "Emacs"; | ||
| 569 | |||
| 570 | lp = member ("-n", arg_list); | ||
| 571 | if (! NIL (lp)) | ||
| 572 | name = car (cdr (lp)); | ||
| 573 | else | ||
| 574 | name = "emacs"; | ||
| 575 | |||
| 576 | free_arglist (arg_list); | ||
| 577 | |||
| 578 | if (!(display = XOpenDisplay (displayname))) | ||
| 579 | fatal ("Can't open display '%s'\n", XDisplayName (displayname)); | ||
| 580 | |||
| 581 | xdb = x_load_resources (display, resource_string, name, class); | ||
| 582 | |||
| 583 | /* In a real program, you'd want to also do this: */ | ||
| 584 | display->db = xdb; | ||
| 585 | |||
| 586 | while (true) | ||
| 587 | { | ||
| 588 | char query_name[90]; | ||
| 589 | char query_class[90]; | ||
| 590 | |||
| 591 | printf ("Name: "); | ||
| 592 | gets (query_name); | ||
| 593 | |||
| 594 | if (strlen (query_name)) | ||
| 595 | { | ||
| 596 | char *value; | ||
| 597 | |||
| 598 | printf ("Class: "); | ||
| 599 | gets (query_class); | ||
| 600 | |||
| 601 | value = x_get_string_resource (&xdb, query_name, query_class); | ||
| 602 | |||
| 603 | if (value != NULL) | ||
| 604 | printf ("\t%s(%s): %s\n\n", query_name, query_class, value); | ||
| 605 | else | ||
| 606 | printf ("\tNo Value.\n\n"); | ||
| 607 | } | ||
| 608 | else | ||
| 609 | break; | ||
| 610 | } | ||
| 611 | printf ("\tExit.\n\n"); | ||
| 612 | |||
| 613 | XCloseDisplay (display); | ||
| 614 | |||
| 615 | return 0; | ||
| 616 | } | ||
| 617 | #endif /* TESTRM */ | ||
diff --git a/src/xselect.c b/src/xselect.c index bab0400540e..66782d41723 100644 --- a/src/xselect.c +++ b/src/xselect.c | |||
| @@ -1567,7 +1567,8 @@ receive_incremental_selection (struct x_display_info *dpyinfo, | |||
| 1567 | unsigned char **data_ret, | 1567 | unsigned char **data_ret, |
| 1568 | ptrdiff_t *size_bytes_ret, | 1568 | ptrdiff_t *size_bytes_ret, |
| 1569 | Atom *type_ret, int *format_ret, | 1569 | Atom *type_ret, int *format_ret, |
| 1570 | unsigned long *size_ret) | 1570 | unsigned long *size_ret, |
| 1571 | ptrdiff_t *real_bytes_ret) | ||
| 1571 | { | 1572 | { |
| 1572 | ptrdiff_t offset = 0; | 1573 | ptrdiff_t offset = 0; |
| 1573 | struct prop_location *wait_object; | 1574 | struct prop_location *wait_object; |
| @@ -1622,7 +1623,8 @@ receive_incremental_selection (struct x_display_info *dpyinfo, | |||
| 1622 | 1623 | ||
| 1623 | if (tmp_size_bytes == 0) /* we're done */ | 1624 | if (tmp_size_bytes == 0) /* we're done */ |
| 1624 | { | 1625 | { |
| 1625 | TRACE0 ("Done reading incrementally"); | 1626 | TRACE1 ("Done reading incrementally; total bytes: %"pD"d", |
| 1627 | *size_bytes_ret); | ||
| 1626 | 1628 | ||
| 1627 | if (! waiting_for_other_props_on_window (display, window)) | 1629 | if (! waiting_for_other_props_on_window (display, window)) |
| 1628 | XSelectInput (display, window, STANDARD_EVENT_SET); | 1630 | XSelectInput (display, window, STANDARD_EVENT_SET); |
| @@ -1652,6 +1654,19 @@ receive_incremental_selection (struct x_display_info *dpyinfo, | |||
| 1652 | memcpy ((*data_ret) + offset, tmp_data, tmp_size_bytes); | 1654 | memcpy ((*data_ret) + offset, tmp_data, tmp_size_bytes); |
| 1653 | offset += tmp_size_bytes; | 1655 | offset += tmp_size_bytes; |
| 1654 | 1656 | ||
| 1657 | /* *size_bytes_ret is not really the size of the data inside the | ||
| 1658 | buffer; it is the size of the buffer allocated by xpalloc. | ||
| 1659 | |||
| 1660 | This matters when the cardinal specified in the INCR property | ||
| 1661 | (a _lower bound_ on the size of the selection data) is | ||
| 1662 | smaller than the actual selection contents, which can happen | ||
| 1663 | when programs are streaming selection data from a file | ||
| 1664 | descriptor. In that case, we used to return junk if xpalloc | ||
| 1665 | decided to grow the buffer by more than the provided | ||
| 1666 | increment; to avoid that, store the actual size of the | ||
| 1667 | selection data in *real_bytes_ret. */ | ||
| 1668 | *real_bytes_ret += tmp_size_bytes; | ||
| 1669 | |||
| 1655 | /* Use xfree, not XFree, because x_get_window_property | 1670 | /* Use xfree, not XFree, because x_get_window_property |
| 1656 | calls xmalloc itself. */ | 1671 | calls xmalloc itself. */ |
| 1657 | xfree (tmp_data); | 1672 | xfree (tmp_data); |
| @@ -1674,10 +1689,14 @@ x_get_window_property_as_lisp_data (struct x_display_info *dpyinfo, | |||
| 1674 | int actual_format; | 1689 | int actual_format; |
| 1675 | unsigned long actual_size; | 1690 | unsigned long actual_size; |
| 1676 | unsigned char *data = 0; | 1691 | unsigned char *data = 0; |
| 1677 | ptrdiff_t bytes = 0; | 1692 | ptrdiff_t bytes = 0, array_bytes; |
| 1678 | Lisp_Object val; | 1693 | Lisp_Object val; |
| 1679 | Display *display = dpyinfo->display; | 1694 | Display *display = dpyinfo->display; |
| 1680 | 1695 | ||
| 1696 | /* array_bytes is only used as an argument to xpalloc. The actual | ||
| 1697 | size of the data inside the buffer is inside bytes. */ | ||
| 1698 | array_bytes = 0; | ||
| 1699 | |||
| 1681 | TRACE0 ("Reading selection data"); | 1700 | TRACE0 ("Reading selection data"); |
| 1682 | 1701 | ||
| 1683 | x_get_window_property (display, window, property, &data, &bytes, | 1702 | x_get_window_property (display, window, property, &data, &bytes, |
| @@ -1718,10 +1737,15 @@ x_get_window_property_as_lisp_data (struct x_display_info *dpyinfo, | |||
| 1718 | calls xmalloc itself. */ | 1737 | calls xmalloc itself. */ |
| 1719 | xfree (data); | 1738 | xfree (data); |
| 1720 | unblock_input (); | 1739 | unblock_input (); |
| 1740 | |||
| 1741 | /* Clear bytes again. Previously, receive_incremental_selection | ||
| 1742 | would set this to min_size_bytes, but that is now done to | ||
| 1743 | array_bytes instead. */ | ||
| 1744 | bytes = 0; | ||
| 1721 | receive_incremental_selection (dpyinfo, window, property, target_type, | 1745 | receive_incremental_selection (dpyinfo, window, property, target_type, |
| 1722 | min_size_bytes, &data, &bytes, | 1746 | min_size_bytes, &data, &array_bytes, |
| 1723 | &actual_type, &actual_format, | 1747 | &actual_type, &actual_format, |
| 1724 | &actual_size); | 1748 | &actual_size, &bytes); |
| 1725 | } | 1749 | } |
| 1726 | 1750 | ||
| 1727 | if (!for_multiple) | 1751 | if (!for_multiple) |
| @@ -1993,7 +2017,17 @@ lisp_data_to_selection_data (struct x_display_info *dpyinfo, | |||
| 1993 | ptrdiff_t i; | 2017 | ptrdiff_t i; |
| 1994 | ptrdiff_t size = ASIZE (obj); | 2018 | ptrdiff_t size = ASIZE (obj); |
| 1995 | 2019 | ||
| 1996 | if (SYMBOLP (AREF (obj, 0))) | 2020 | if (!size) |
| 2021 | { | ||
| 2022 | /* This vector is empty and of unknown type. Assume that it | ||
| 2023 | is a vector of integers. */ | ||
| 2024 | |||
| 2025 | cs->data = NULL; | ||
| 2026 | cs->format = 32; | ||
| 2027 | cs->size = 0; | ||
| 2028 | type = QINTEGER; | ||
| 2029 | } | ||
| 2030 | else if (SYMBOLP (AREF (obj, 0))) | ||
| 1997 | /* This vector is an ATOM set */ | 2031 | /* This vector is an ATOM set */ |
| 1998 | { | 2032 | { |
| 1999 | void *data; | 2033 | void *data; |
diff --git a/src/xsettings.c b/src/xsettings.c index 9c60ff825a4..e4a9865d686 100644 --- a/src/xsettings.c +++ b/src/xsettings.c | |||
| @@ -1225,7 +1225,8 @@ xsettings_get_font_options (void) | |||
| 1225 | DEFUN ("font-get-system-normal-font", Ffont_get_system_normal_font, | 1225 | DEFUN ("font-get-system-normal-font", Ffont_get_system_normal_font, |
| 1226 | Sfont_get_system_normal_font, | 1226 | Sfont_get_system_normal_font, |
| 1227 | 0, 0, 0, | 1227 | 0, 0, 0, |
| 1228 | doc: /* Get the system default application font. */) | 1228 | doc: /* Get the system default application font. |
| 1229 | The font is returned as either a font-spec or font name. */) | ||
| 1229 | (void) | 1230 | (void) |
| 1230 | { | 1231 | { |
| 1231 | return current_font ? build_string (current_font) : Qnil; | 1232 | return current_font ? build_string (current_font) : Qnil; |
| @@ -1233,7 +1234,8 @@ DEFUN ("font-get-system-normal-font", Ffont_get_system_normal_font, | |||
| 1233 | 1234 | ||
| 1234 | DEFUN ("font-get-system-font", Ffont_get_system_font, Sfont_get_system_font, | 1235 | DEFUN ("font-get-system-font", Ffont_get_system_font, Sfont_get_system_font, |
| 1235 | 0, 0, 0, | 1236 | 0, 0, 0, |
| 1236 | doc: /* Get the system default fixed width font. */) | 1237 | doc: /* Get the system default fixed width font. |
| 1238 | The font is returned as either a font-spec or font name. */) | ||
| 1237 | (void) | 1239 | (void) |
| 1238 | { | 1240 | { |
| 1239 | return current_mono_font ? build_string (current_mono_font) : Qnil; | 1241 | return current_mono_font ? build_string (current_mono_font) : Qnil; |
| @@ -1282,6 +1284,10 @@ syms_of_xsettings (void) | |||
| 1282 | DEFSYM (Qmonospace_font_name, "monospace-font-name"); | 1284 | DEFSYM (Qmonospace_font_name, "monospace-font-name"); |
| 1283 | DEFSYM (Qfont_name, "font-name"); | 1285 | DEFSYM (Qfont_name, "font-name"); |
| 1284 | DEFSYM (Qfont_render, "font-render"); | 1286 | DEFSYM (Qfont_render, "font-render"); |
| 1287 | DEFSYM (Qdynamic_setting, "dynamic-setting"); | ||
| 1288 | DEFSYM (Qfont_render_setting, "font-render-setting"); | ||
| 1289 | DEFSYM (Qsystem_font_setting, "system-font-setting"); | ||
| 1290 | |||
| 1285 | defsubr (&Sfont_get_system_font); | 1291 | defsubr (&Sfont_get_system_font); |
| 1286 | defsubr (&Sfont_get_system_normal_font); | 1292 | defsubr (&Sfont_get_system_normal_font); |
| 1287 | 1293 | ||
| @@ -1297,9 +1303,9 @@ If this variable is nil, Emacs ignores system font changes. */); | |||
| 1297 | Vxft_settings = empty_unibyte_string; | 1303 | Vxft_settings = empty_unibyte_string; |
| 1298 | 1304 | ||
| 1299 | #if defined USE_CAIRO || defined HAVE_XFT | 1305 | #if defined USE_CAIRO || defined HAVE_XFT |
| 1300 | Fprovide (intern_c_string ("font-render-setting"), Qnil); | 1306 | Fprovide (Qfont_render_setting, Qnil); |
| 1301 | #if defined (HAVE_GCONF) || defined (HAVE_GSETTINGS) | 1307 | #if defined (HAVE_GCONF) || defined (HAVE_GSETTINGS) |
| 1302 | Fprovide (intern_c_string ("system-font-setting"), Qnil); | 1308 | Fprovide (Qsystem_font_setting, Qnil); |
| 1303 | #endif | 1309 | #endif |
| 1304 | #endif | 1310 | #endif |
| 1305 | 1311 | ||
| @@ -1307,5 +1313,5 @@ If this variable is nil, Emacs ignores system font changes. */); | |||
| 1307 | DEFSYM (Qtool_bar_style, "tool-bar-style"); | 1313 | DEFSYM (Qtool_bar_style, "tool-bar-style"); |
| 1308 | defsubr (&Stool_bar_get_system_style); | 1314 | defsubr (&Stool_bar_get_system_style); |
| 1309 | 1315 | ||
| 1310 | Fprovide (intern_c_string ("dynamic-setting"), Qnil); | 1316 | Fprovide (Qdynamic_setting, Qnil); |
| 1311 | } | 1317 | } |
diff --git a/src/xsmfns.c b/src/xsmfns.c index 7015a8eb633..7a17e6dbd86 100644 --- a/src/xsmfns.c +++ b/src/xsmfns.c | |||
| @@ -511,7 +511,7 @@ Do not call this function yourself. */) | |||
| 511 | this at the wrong time. */ | 511 | this at the wrong time. */ |
| 512 | if (doing_interact && ! kill_emacs) | 512 | if (doing_interact && ! kill_emacs) |
| 513 | { | 513 | { |
| 514 | bool cancel_shutdown = ! NILP (call0 (intern ("emacs-session-save"))); | 514 | bool cancel_shutdown = ! NILP (call0 (Qemacs_session_save)); |
| 515 | 515 | ||
| 516 | SmcInteractDone (smc_conn, cancel_shutdown); | 516 | SmcInteractDone (smc_conn, cancel_shutdown); |
| 517 | SmcSaveYourselfDone (smc_conn, True); | 517 | SmcSaveYourselfDone (smc_conn, True); |
| @@ -542,6 +542,8 @@ Do not call this function yourself. */) | |||
| 542 | void | 542 | void |
| 543 | syms_of_xsmfns (void) | 543 | syms_of_xsmfns (void) |
| 544 | { | 544 | { |
| 545 | DEFSYM (Qemacs_session_save, "emacs-session-save"); | ||
| 546 | |||
| 545 | DEFVAR_LISP ("x-session-id", Vx_session_id, | 547 | DEFVAR_LISP ("x-session-id", Vx_session_id, |
| 546 | doc: /* The session id Emacs got from the session manager for this session. | 548 | doc: /* The session id Emacs got from the session manager for this session. |
| 547 | Changing the value does not change the session id used by Emacs. | 549 | Changing the value does not change the session id used by Emacs. |
diff --git a/src/xterm.c b/src/xterm.c index 7a0a21b1369..f3bfae457ba 100644 --- a/src/xterm.c +++ b/src/xterm.c | |||
| @@ -970,8 +970,8 @@ static const struct x_atom_ref x_atom_refs[] = | |||
| 970 | /* Ghostscript support. */ | 970 | /* Ghostscript support. */ |
| 971 | ATOM_REFS_INIT ("DONE", Xatom_DONE) | 971 | ATOM_REFS_INIT ("DONE", Xatom_DONE) |
| 972 | ATOM_REFS_INIT ("PAGE", Xatom_PAGE) | 972 | ATOM_REFS_INIT ("PAGE", Xatom_PAGE) |
| 973 | ATOM_REFS_INIT ("SCROLLBAR", Xatom_Scrollbar) | 973 | ATOM_REFS_INIT ("_EMACS_SCROLLBAR", Xatom_Scrollbar) |
| 974 | ATOM_REFS_INIT ("HORIZONTAL_SCROLLBAR", Xatom_Horizontal_Scrollbar) | 974 | ATOM_REFS_INIT ("_EMACS_HORIZONTAL_SCROLLBAR", Xatom_Horizontal_Scrollbar) |
| 975 | ATOM_REFS_INIT ("_XEMBED", Xatom_XEMBED) | 975 | ATOM_REFS_INIT ("_XEMBED", Xatom_XEMBED) |
| 976 | /* EWMH */ | 976 | /* EWMH */ |
| 977 | ATOM_REFS_INIT ("_NET_WM_STATE", Xatom_net_wm_state) | 977 | ATOM_REFS_INIT ("_NET_WM_STATE", Xatom_net_wm_state) |
| @@ -998,6 +998,7 @@ static const struct x_atom_ref x_atom_refs[] = | |||
| 998 | ATOM_REFS_INIT ("_NET_WM_SYNC_REQUEST", Xatom_net_wm_sync_request) | 998 | ATOM_REFS_INIT ("_NET_WM_SYNC_REQUEST", Xatom_net_wm_sync_request) |
| 999 | ATOM_REFS_INIT ("_NET_WM_SYNC_REQUEST_COUNTER", Xatom_net_wm_sync_request_counter) | 999 | ATOM_REFS_INIT ("_NET_WM_SYNC_REQUEST_COUNTER", Xatom_net_wm_sync_request_counter) |
| 1000 | ATOM_REFS_INIT ("_NET_WM_SYNC_FENCES", Xatom_net_wm_sync_fences) | 1000 | ATOM_REFS_INIT ("_NET_WM_SYNC_FENCES", Xatom_net_wm_sync_fences) |
| 1001 | ATOM_REFS_INIT ("_NET_WM_BYPASS_COMPOSITOR", Xatom_net_wm_bypass_compositor) | ||
| 1001 | ATOM_REFS_INIT ("_NET_WM_FRAME_DRAWN", Xatom_net_wm_frame_drawn) | 1002 | ATOM_REFS_INIT ("_NET_WM_FRAME_DRAWN", Xatom_net_wm_frame_drawn) |
| 1002 | ATOM_REFS_INIT ("_NET_WM_FRAME_TIMINGS", Xatom_net_wm_frame_timings) | 1003 | ATOM_REFS_INIT ("_NET_WM_FRAME_TIMINGS", Xatom_net_wm_frame_timings) |
| 1003 | ATOM_REFS_INIT ("_NET_WM_USER_TIME", Xatom_net_wm_user_time) | 1004 | ATOM_REFS_INIT ("_NET_WM_USER_TIME", Xatom_net_wm_user_time) |
| @@ -1142,6 +1143,7 @@ static Window x_get_window_below (Display *, Window, int, int, int *, int *); | |||
| 1142 | #ifndef USE_TOOLKIT_SCROLL_BARS | 1143 | #ifndef USE_TOOLKIT_SCROLL_BARS |
| 1143 | static void x_scroll_bar_redraw (struct scroll_bar *); | 1144 | static void x_scroll_bar_redraw (struct scroll_bar *); |
| 1144 | #endif | 1145 | #endif |
| 1146 | static void x_translate_coordinates (struct frame *, int, int, int *, int *); | ||
| 1145 | 1147 | ||
| 1146 | /* Global state maintained during a drag-and-drop operation. */ | 1148 | /* Global state maintained during a drag-and-drop operation. */ |
| 1147 | 1149 | ||
| @@ -1970,6 +1972,10 @@ xm_get_drag_window_1 (struct x_display_info *dpyinfo) | |||
| 1970 | && tmp_data) | 1972 | && tmp_data) |
| 1971 | { | 1973 | { |
| 1972 | drag_window = *(Window *) tmp_data; | 1974 | drag_window = *(Window *) tmp_data; |
| 1975 | |||
| 1976 | /* This has the side effect of selecting for | ||
| 1977 | StructureNotifyMask, meaning that we will get notifications | ||
| 1978 | once it is deleted. */ | ||
| 1973 | rc = x_special_window_exists_p (dpyinfo, drag_window); | 1979 | rc = x_special_window_exists_p (dpyinfo, drag_window); |
| 1974 | 1980 | ||
| 1975 | if (!rc) | 1981 | if (!rc) |
| @@ -3977,12 +3983,10 @@ x_dnd_do_unsupported_drop (struct x_display_info *dpyinfo, | |||
| 3977 | x_ignore_errors_for_next_request (dpyinfo); | 3983 | x_ignore_errors_for_next_request (dpyinfo); |
| 3978 | XSendEvent (dpyinfo->display, child, | 3984 | XSendEvent (dpyinfo->display, child, |
| 3979 | True, ButtonPressMask, &event); | 3985 | True, ButtonPressMask, &event); |
| 3980 | x_stop_ignoring_errors (dpyinfo); | ||
| 3981 | 3986 | ||
| 3982 | event.xbutton.type = ButtonRelease; | 3987 | event.xbutton.type = ButtonRelease; |
| 3983 | event.xbutton.time = before + 2; | 3988 | event.xbutton.time = before + 2; |
| 3984 | 3989 | ||
| 3985 | x_ignore_errors_for_next_request (dpyinfo); | ||
| 3986 | XSendEvent (dpyinfo->display, child, | 3990 | XSendEvent (dpyinfo->display, child, |
| 3987 | True, ButtonReleaseMask, &event); | 3991 | True, ButtonReleaseMask, &event); |
| 3988 | x_stop_ignoring_errors (dpyinfo); | 3992 | x_stop_ignoring_errors (dpyinfo); |
| @@ -4456,7 +4460,8 @@ x_dnd_get_window_proto (struct x_display_info *dpyinfo, Window wdesc) | |||
| 4456 | } | 4460 | } |
| 4457 | 4461 | ||
| 4458 | static void | 4462 | static void |
| 4459 | x_dnd_send_enter (struct frame *f, Window target, int supported) | 4463 | x_dnd_send_enter (struct frame *f, Window target, Window toplevel, |
| 4464 | int supported) | ||
| 4460 | { | 4465 | { |
| 4461 | struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); | 4466 | struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); |
| 4462 | int i; | 4467 | int i; |
| @@ -4465,7 +4470,7 @@ x_dnd_send_enter (struct frame *f, Window target, int supported) | |||
| 4465 | msg.xclient.type = ClientMessage; | 4470 | msg.xclient.type = ClientMessage; |
| 4466 | msg.xclient.message_type = dpyinfo->Xatom_XdndEnter; | 4471 | msg.xclient.message_type = dpyinfo->Xatom_XdndEnter; |
| 4467 | msg.xclient.format = 32; | 4472 | msg.xclient.format = 32; |
| 4468 | msg.xclient.window = target; | 4473 | msg.xclient.window = toplevel; |
| 4469 | msg.xclient.data.l[0] = FRAME_X_WINDOW (f); | 4474 | msg.xclient.data.l[0] = FRAME_X_WINDOW (f); |
| 4470 | msg.xclient.data.l[1] = (((unsigned int) min (X_DND_SUPPORTED_VERSION, | 4475 | msg.xclient.data.l[1] = (((unsigned int) min (X_DND_SUPPORTED_VERSION, |
| 4471 | supported) << 24) | 4476 | supported) << 24) |
| @@ -4493,10 +4498,10 @@ x_dnd_send_enter (struct frame *f, Window target, int supported) | |||
| 4493 | } | 4498 | } |
| 4494 | 4499 | ||
| 4495 | static void | 4500 | static void |
| 4496 | x_dnd_send_position (struct frame *f, Window target, int supported, | 4501 | x_dnd_send_position (struct frame *f, Window target, Window toplevel, |
| 4497 | unsigned short root_x, unsigned short root_y, | 4502 | int supported, unsigned short root_x, |
| 4498 | Time timestamp, Atom action, int button, | 4503 | unsigned short root_y, Time timestamp, Atom action, |
| 4499 | unsigned state) | 4504 | int button, unsigned state) |
| 4500 | { | 4505 | { |
| 4501 | struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); | 4506 | struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); |
| 4502 | XEvent msg; | 4507 | XEvent msg; |
| @@ -4504,7 +4509,7 @@ x_dnd_send_position (struct frame *f, Window target, int supported, | |||
| 4504 | msg.xclient.type = ClientMessage; | 4509 | msg.xclient.type = ClientMessage; |
| 4505 | msg.xclient.message_type = dpyinfo->Xatom_XdndPosition; | 4510 | msg.xclient.message_type = dpyinfo->Xatom_XdndPosition; |
| 4506 | msg.xclient.format = 32; | 4511 | msg.xclient.format = 32; |
| 4507 | msg.xclient.window = target; | 4512 | msg.xclient.window = toplevel; |
| 4508 | msg.xclient.data.l[0] = FRAME_X_WINDOW (f); | 4513 | msg.xclient.data.l[0] = FRAME_X_WINDOW (f); |
| 4509 | msg.xclient.data.l[1] = 0; | 4514 | msg.xclient.data.l[1] = 0; |
| 4510 | 4515 | ||
| @@ -4568,7 +4573,7 @@ x_dnd_send_position (struct frame *f, Window target, int supported, | |||
| 4568 | } | 4573 | } |
| 4569 | 4574 | ||
| 4570 | static void | 4575 | static void |
| 4571 | x_dnd_send_leave (struct frame *f, Window target) | 4576 | x_dnd_send_leave (struct frame *f, Window target, Window toplevel) |
| 4572 | { | 4577 | { |
| 4573 | struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); | 4578 | struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); |
| 4574 | XEvent msg; | 4579 | XEvent msg; |
| @@ -4576,7 +4581,7 @@ x_dnd_send_leave (struct frame *f, Window target) | |||
| 4576 | msg.xclient.type = ClientMessage; | 4581 | msg.xclient.type = ClientMessage; |
| 4577 | msg.xclient.message_type = dpyinfo->Xatom_XdndLeave; | 4582 | msg.xclient.message_type = dpyinfo->Xatom_XdndLeave; |
| 4578 | msg.xclient.format = 32; | 4583 | msg.xclient.format = 32; |
| 4579 | msg.xclient.window = target; | 4584 | msg.xclient.window = toplevel; |
| 4580 | msg.xclient.data.l[0] = FRAME_X_WINDOW (f); | 4585 | msg.xclient.data.l[0] = FRAME_X_WINDOW (f); |
| 4581 | msg.xclient.data.l[1] = 0; | 4586 | msg.xclient.data.l[1] = 0; |
| 4582 | msg.xclient.data.l[2] = 0; | 4587 | msg.xclient.data.l[2] = 0; |
| @@ -4592,15 +4597,15 @@ x_dnd_send_leave (struct frame *f, Window target) | |||
| 4592 | } | 4597 | } |
| 4593 | 4598 | ||
| 4594 | static bool | 4599 | static bool |
| 4595 | x_dnd_send_drop (struct frame *f, Window target, Time timestamp, | 4600 | x_dnd_send_drop (struct frame *f, Window target, Window toplevel, |
| 4596 | int supported) | 4601 | Time timestamp, int supported) |
| 4597 | { | 4602 | { |
| 4598 | struct x_display_info *dpyinfo; | 4603 | struct x_display_info *dpyinfo; |
| 4599 | XEvent msg; | 4604 | XEvent msg; |
| 4600 | 4605 | ||
| 4601 | if (x_dnd_action == None) | 4606 | if (x_dnd_action == None) |
| 4602 | { | 4607 | { |
| 4603 | x_dnd_send_leave (f, target); | 4608 | x_dnd_send_leave (f, target, toplevel); |
| 4604 | return false; | 4609 | return false; |
| 4605 | } | 4610 | } |
| 4606 | 4611 | ||
| @@ -4609,7 +4614,7 @@ x_dnd_send_drop (struct frame *f, Window target, Time timestamp, | |||
| 4609 | msg.xclient.type = ClientMessage; | 4614 | msg.xclient.type = ClientMessage; |
| 4610 | msg.xclient.message_type = dpyinfo->Xatom_XdndDrop; | 4615 | msg.xclient.message_type = dpyinfo->Xatom_XdndDrop; |
| 4611 | msg.xclient.format = 32; | 4616 | msg.xclient.format = 32; |
| 4612 | msg.xclient.window = target; | 4617 | msg.xclient.window = toplevel; |
| 4613 | msg.xclient.data.l[0] = FRAME_X_WINDOW (f); | 4618 | msg.xclient.data.l[0] = FRAME_X_WINDOW (f); |
| 4614 | msg.xclient.data.l[1] = 0; | 4619 | msg.xclient.data.l[1] = 0; |
| 4615 | msg.xclient.data.l[2] = 0; | 4620 | msg.xclient.data.l[2] = 0; |
| @@ -4626,10 +4631,10 @@ x_dnd_send_drop (struct frame *f, Window target, Time timestamp, | |||
| 4626 | } | 4631 | } |
| 4627 | 4632 | ||
| 4628 | static bool | 4633 | static bool |
| 4629 | x_dnd_do_drop (Window target, int supported) | 4634 | x_dnd_do_drop (Window target, Window toplevel, int supported) |
| 4630 | { | 4635 | { |
| 4631 | if (x_dnd_waiting_for_status_window != target) | 4636 | if (x_dnd_waiting_for_status_window != target) |
| 4632 | return x_dnd_send_drop (x_dnd_frame, target, | 4637 | return x_dnd_send_drop (x_dnd_frame, target, toplevel, |
| 4633 | x_dnd_selection_timestamp, supported); | 4638 | x_dnd_selection_timestamp, supported); |
| 4634 | 4639 | ||
| 4635 | x_dnd_need_send_drop = true; | 4640 | x_dnd_need_send_drop = true; |
| @@ -4734,7 +4739,8 @@ x_dnd_cancel_dnd_early (void) | |||
| 4734 | if (x_dnd_last_seen_window != None | 4739 | if (x_dnd_last_seen_window != None |
| 4735 | && x_dnd_last_protocol_version != -1) | 4740 | && x_dnd_last_protocol_version != -1) |
| 4736 | x_dnd_send_leave (x_dnd_frame, | 4741 | x_dnd_send_leave (x_dnd_frame, |
| 4737 | x_dnd_last_seen_window); | 4742 | x_dnd_last_seen_window, |
| 4743 | x_dnd_last_seen_toplevel); | ||
| 4738 | else if (x_dnd_last_seen_window != None | 4744 | else if (x_dnd_last_seen_window != None |
| 4739 | && !XM_DRAG_STYLE_IS_DROP_ONLY (x_dnd_last_motif_style) | 4745 | && !XM_DRAG_STYLE_IS_DROP_ONLY (x_dnd_last_motif_style) |
| 4740 | && x_dnd_last_motif_style != XM_DRAG_STYLE_NONE | 4746 | && x_dnd_last_motif_style != XM_DRAG_STYLE_NONE |
| @@ -4792,7 +4798,8 @@ x_dnd_cleanup_drag_and_drop (void *frame) | |||
| 4792 | if (x_dnd_last_seen_window != None | 4798 | if (x_dnd_last_seen_window != None |
| 4793 | && x_dnd_last_protocol_version != -1) | 4799 | && x_dnd_last_protocol_version != -1) |
| 4794 | x_dnd_send_leave (x_dnd_frame, | 4800 | x_dnd_send_leave (x_dnd_frame, |
| 4795 | x_dnd_last_seen_window); | 4801 | x_dnd_last_seen_window, |
| 4802 | x_dnd_last_seen_toplevel); | ||
| 4796 | else if (x_dnd_last_seen_window != None | 4803 | else if (x_dnd_last_seen_window != None |
| 4797 | && !XM_DRAG_STYLE_IS_DROP_ONLY (x_dnd_last_motif_style) | 4804 | && !XM_DRAG_STYLE_IS_DROP_ONLY (x_dnd_last_motif_style) |
| 4798 | && x_dnd_last_motif_style != XM_DRAG_STYLE_NONE | 4805 | && x_dnd_last_motif_style != XM_DRAG_STYLE_NONE |
| @@ -4846,16 +4853,13 @@ x_dnd_note_self_position (struct x_display_info *dpyinfo, Window target, | |||
| 4846 | { | 4853 | { |
| 4847 | struct frame *f; | 4854 | struct frame *f; |
| 4848 | int dest_x, dest_y; | 4855 | int dest_x, dest_y; |
| 4849 | Window child_return; | ||
| 4850 | 4856 | ||
| 4851 | f = x_top_window_to_frame (dpyinfo, target); | 4857 | f = x_top_window_to_frame (dpyinfo, target); |
| 4852 | 4858 | ||
| 4853 | if (f && XTranslateCoordinates (dpyinfo->display, | 4859 | if (f) |
| 4854 | dpyinfo->root_window, | ||
| 4855 | FRAME_X_WINDOW (f), | ||
| 4856 | root_x, root_y, &dest_x, | ||
| 4857 | &dest_y, &child_return)) | ||
| 4858 | { | 4860 | { |
| 4861 | x_translate_coordinates (f, root_x, root_y, &dest_x, &dest_y); | ||
| 4862 | |||
| 4859 | x_dnd_movement_frame = f; | 4863 | x_dnd_movement_frame = f; |
| 4860 | x_dnd_movement_x = dest_x; | 4864 | x_dnd_movement_x = dest_x; |
| 4861 | x_dnd_movement_y = dest_y; | 4865 | x_dnd_movement_y = dest_y; |
| @@ -4871,19 +4875,16 @@ x_dnd_note_self_wheel (struct x_display_info *dpyinfo, Window target, | |||
| 4871 | { | 4875 | { |
| 4872 | struct frame *f; | 4876 | struct frame *f; |
| 4873 | int dest_x, dest_y; | 4877 | int dest_x, dest_y; |
| 4874 | Window child_return; | ||
| 4875 | 4878 | ||
| 4876 | if (button < 4 || button > 7) | 4879 | if (button < 4 || button > 7) |
| 4877 | return; | 4880 | return; |
| 4878 | 4881 | ||
| 4879 | f = x_top_window_to_frame (dpyinfo, target); | 4882 | f = x_top_window_to_frame (dpyinfo, target); |
| 4880 | 4883 | ||
| 4881 | if (f && XTranslateCoordinates (dpyinfo->display, | 4884 | if (f) |
| 4882 | dpyinfo->root_window, | ||
| 4883 | FRAME_X_WINDOW (f), | ||
| 4884 | root_x, root_y, &dest_x, | ||
| 4885 | &dest_y, &child_return)) | ||
| 4886 | { | 4885 | { |
| 4886 | x_translate_coordinates (f, root_x, root_y, &dest_x, &dest_y); | ||
| 4887 | |||
| 4887 | x_dnd_wheel_frame = f; | 4888 | x_dnd_wheel_frame = f; |
| 4888 | x_dnd_wheel_x = dest_x; | 4889 | x_dnd_wheel_x = dest_x; |
| 4889 | x_dnd_wheel_y = dest_y; | 4890 | x_dnd_wheel_y = dest_y; |
| @@ -4906,7 +4907,6 @@ x_dnd_note_self_drop (struct x_display_info *dpyinfo, Window target, | |||
| 4906 | char **atom_names; | 4907 | char **atom_names; |
| 4907 | char *name; | 4908 | char *name; |
| 4908 | int win_x, win_y, i; | 4909 | int win_x, win_y, i; |
| 4909 | Window dummy; | ||
| 4910 | 4910 | ||
| 4911 | if (!x_dnd_allow_current_frame | 4911 | if (!x_dnd_allow_current_frame |
| 4912 | && (FRAME_OUTER_WINDOW (x_dnd_frame) | 4912 | && (FRAME_OUTER_WINDOW (x_dnd_frame) |
| @@ -4921,10 +4921,7 @@ x_dnd_note_self_drop (struct x_display_info *dpyinfo, Window target, | |||
| 4921 | if (NILP (Vx_dnd_native_test_function)) | 4921 | if (NILP (Vx_dnd_native_test_function)) |
| 4922 | return; | 4922 | return; |
| 4923 | 4923 | ||
| 4924 | if (!XTranslateCoordinates (dpyinfo->display, dpyinfo->root_window, | 4924 | x_translate_coordinates (f, root_x, root_y, &win_x, &win_y); |
| 4925 | FRAME_X_WINDOW (f), root_x, root_y, | ||
| 4926 | &win_x, &win_y, &dummy)) | ||
| 4927 | return; | ||
| 4928 | 4925 | ||
| 4929 | /* Emacs can't respond to DND events inside the nested event loop, | 4926 | /* Emacs can't respond to DND events inside the nested event loop, |
| 4930 | so when dragging items to itself, call the test function | 4927 | so when dragging items to itself, call the test function |
| @@ -6125,7 +6122,7 @@ x_cr_export_frames (Lisp_Object frames, cairo_surface_type_t surface_type) | |||
| 6125 | 6122 | ||
| 6126 | unbind_to (count, Qnil); | 6123 | unbind_to (count, Qnil); |
| 6127 | 6124 | ||
| 6128 | return CALLN (Fapply, intern ("concat"), Fnreverse (acc)); | 6125 | return CALLN (Fapply, Qconcat, Fnreverse (acc)); |
| 6129 | } | 6126 | } |
| 6130 | 6127 | ||
| 6131 | #endif /* USE_CAIRO */ | 6128 | #endif /* USE_CAIRO */ |
| @@ -6629,22 +6626,21 @@ x_set_frame_alpha (struct frame *f) | |||
| 6629 | Do this unconditionally as this function is called on reparent when | 6626 | Do this unconditionally as this function is called on reparent when |
| 6630 | alpha has not changed on the frame. */ | 6627 | alpha has not changed on the frame. */ |
| 6631 | 6628 | ||
| 6629 | x_ignore_errors_for_next_request (dpyinfo); | ||
| 6630 | |||
| 6632 | if (!FRAME_PARENT_FRAME (f)) | 6631 | if (!FRAME_PARENT_FRAME (f)) |
| 6633 | { | 6632 | { |
| 6634 | parent = x_find_topmost_parent (f); | 6633 | parent = x_find_topmost_parent (f); |
| 6635 | 6634 | ||
| 6636 | if (parent != None) | 6635 | if (parent != None) |
| 6637 | { | 6636 | { |
| 6638 | x_ignore_errors_for_next_request (dpyinfo); | ||
| 6639 | XChangeProperty (dpy, parent, | 6637 | XChangeProperty (dpy, parent, |
| 6640 | dpyinfo->Xatom_net_wm_window_opacity, | 6638 | dpyinfo->Xatom_net_wm_window_opacity, |
| 6641 | XA_CARDINAL, 32, PropModeReplace, | 6639 | XA_CARDINAL, 32, PropModeReplace, |
| 6642 | (unsigned char *) &opac, 1); | 6640 | (unsigned char *) &opac, 1); |
| 6643 | x_stop_ignoring_errors (dpyinfo); | ||
| 6644 | } | 6641 | } |
| 6645 | } | 6642 | } |
| 6646 | 6643 | ||
| 6647 | x_ignore_errors_for_next_request (dpyinfo); | ||
| 6648 | XChangeProperty (dpy, win, dpyinfo->Xatom_net_wm_window_opacity, | 6644 | XChangeProperty (dpy, win, dpyinfo->Xatom_net_wm_window_opacity, |
| 6649 | XA_CARDINAL, 32, PropModeReplace, | 6645 | XA_CARDINAL, 32, PropModeReplace, |
| 6650 | (unsigned char *) &opac, 1); | 6646 | (unsigned char *) &opac, 1); |
| @@ -7611,6 +7607,11 @@ static void | |||
| 7611 | x_display_set_last_user_time (struct x_display_info *dpyinfo, Time time, | 7607 | x_display_set_last_user_time (struct x_display_info *dpyinfo, Time time, |
| 7612 | bool send_event) | 7608 | bool send_event) |
| 7613 | { | 7609 | { |
| 7610 | #if defined HAVE_XSYNC && !defined USE_GTK && defined HAVE_CLOCK_GETTIME | ||
| 7611 | uint_fast64_t monotonic_time; | ||
| 7612 | uint_fast64_t monotonic_ms; | ||
| 7613 | int_fast64_t diff_ms; | ||
| 7614 | #endif | ||
| 7614 | #ifndef USE_GTK | 7615 | #ifndef USE_GTK |
| 7615 | struct frame *focus_frame; | 7616 | struct frame *focus_frame; |
| 7616 | Time old_time; | 7617 | Time old_time; |
| @@ -7631,9 +7632,8 @@ x_display_set_last_user_time (struct x_display_info *dpyinfo, Time time, | |||
| 7631 | { | 7632 | { |
| 7632 | /* See if the current CLOCK_MONOTONIC time is reasonably close | 7633 | /* See if the current CLOCK_MONOTONIC time is reasonably close |
| 7633 | to the X server time. */ | 7634 | to the X server time. */ |
| 7634 | uint_fast64_t monotonic_time = x_sync_current_monotonic_time (); | 7635 | monotonic_time = x_sync_current_monotonic_time (); |
| 7635 | uint_fast64_t monotonic_ms = monotonic_time / 1000; | 7636 | monotonic_ms = monotonic_time / 1000; |
| 7636 | int_fast64_t diff_ms; | ||
| 7637 | 7637 | ||
| 7638 | dpyinfo->server_time_monotonic_p | 7638 | dpyinfo->server_time_monotonic_p |
| 7639 | = (monotonic_time != 0 | 7639 | = (monotonic_time != 0 |
| @@ -7651,6 +7651,27 @@ x_display_set_last_user_time (struct x_display_info *dpyinfo, Time time, | |||
| 7651 | monotonic_time, | 7651 | monotonic_time, |
| 7652 | &dpyinfo->server_time_offset)) | 7652 | &dpyinfo->server_time_offset)) |
| 7653 | dpyinfo->server_time_offset = 0; | 7653 | dpyinfo->server_time_offset = 0; |
| 7654 | |||
| 7655 | /* If the server time is reasonably close to the monotonic | ||
| 7656 | time after the latter is truncated to CARD32, simply make | ||
| 7657 | the offset that between the server time in ms and the | ||
| 7658 | actual time in ms. */ | ||
| 7659 | |||
| 7660 | monotonic_ms = monotonic_ms & 0xffffffff; | ||
| 7661 | if (!INT_SUBTRACT_WRAPV (time, monotonic_ms, &diff_ms) | ||
| 7662 | && -500 < diff_ms && diff_ms < 500) | ||
| 7663 | { | ||
| 7664 | /* The server timestamp overflowed. Make the time | ||
| 7665 | offset exactly how much it overflowed by. */ | ||
| 7666 | |||
| 7667 | if (INT_SUBTRACT_WRAPV (monotonic_time / 1000, monotonic_ms, | ||
| 7668 | &dpyinfo->server_time_offset) | ||
| 7669 | || INT_MULTIPLY_WRAPV (dpyinfo->server_time_offset, | ||
| 7670 | 1000, &dpyinfo->server_time_offset) | ||
| 7671 | || INT_SUBTRACT_WRAPV (0, dpyinfo->server_time_offset, | ||
| 7672 | &dpyinfo->server_time_offset)) | ||
| 7673 | dpyinfo->server_time_offset = 0; | ||
| 7674 | } | ||
| 7654 | } | 7675 | } |
| 7655 | } | 7676 | } |
| 7656 | #endif | 7677 | #endif |
| @@ -11914,7 +11935,8 @@ x_dnd_process_quit (struct frame *f, Time timestamp) | |||
| 11914 | { | 11935 | { |
| 11915 | if (x_dnd_last_seen_window != None | 11936 | if (x_dnd_last_seen_window != None |
| 11916 | && x_dnd_last_protocol_version != -1) | 11937 | && x_dnd_last_protocol_version != -1) |
| 11917 | x_dnd_send_leave (f, x_dnd_last_seen_window); | 11938 | x_dnd_send_leave (f, x_dnd_last_seen_window, |
| 11939 | x_dnd_last_seen_toplevel); | ||
| 11918 | else if (x_dnd_last_seen_window != None | 11940 | else if (x_dnd_last_seen_window != None |
| 11919 | && !XM_DRAG_STYLE_IS_DROP_ONLY (x_dnd_last_motif_style) | 11941 | && !XM_DRAG_STYLE_IS_DROP_ONLY (x_dnd_last_motif_style) |
| 11920 | && x_dnd_last_motif_style != XM_DRAG_STYLE_NONE | 11942 | && x_dnd_last_motif_style != XM_DRAG_STYLE_NONE |
| @@ -12641,9 +12663,11 @@ xi_handle_focus_change (struct x_display_info *dpyinfo) | |||
| 12641 | else | 12663 | else |
| 12642 | dpyinfo->client_pointer_device = device->device_id; | 12664 | dpyinfo->client_pointer_device = device->device_id; |
| 12643 | } | 12665 | } |
| 12644 | 12666 | /* Even if the implicit focus was set after the explicit focus | |
| 12645 | if (device->focus_implicit_frame | 12667 | on this specific device, the explicit focus is what really |
| 12646 | && device->focus_implicit_time > time) | 12668 | matters. So use it instead. */ |
| 12669 | else if (device->focus_implicit_frame | ||
| 12670 | && device->focus_implicit_time > time) | ||
| 12647 | { | 12671 | { |
| 12648 | new = device->focus_implicit_frame; | 12672 | new = device->focus_implicit_frame; |
| 12649 | time = device->focus_implicit_time; | 12673 | time = device->focus_implicit_time; |
| @@ -12740,6 +12764,25 @@ xi_focus_handle_for_device (struct x_display_info *dpyinfo, | |||
| 12740 | 12764 | ||
| 12741 | case XI_FocusOut: | 12765 | case XI_FocusOut: |
| 12742 | device->focus_frame = NULL; | 12766 | device->focus_frame = NULL; |
| 12767 | |||
| 12768 | /* So, unfortunately, the X Input Extension is implemented such | ||
| 12769 | that means XI_Leave events will not have their focus field | ||
| 12770 | set if the core focus is transferred to another window after | ||
| 12771 | an entry event that pretends to (or really does) set the | ||
| 12772 | implicit focus. In addition, if the core focus is set, but | ||
| 12773 | the extension focus on the client pointer is not, all | ||
| 12774 | XI_Enter events will have their focus fields set, despite not | ||
| 12775 | actually changing the effective focus window. Combined with | ||
| 12776 | almost all window managers not setting the focus on input | ||
| 12777 | extension devices, this means that Emacs will continue to | ||
| 12778 | think the implicit focus is set on one of its frames if the | ||
| 12779 | actual (core) focus is transferred to another window while | ||
| 12780 | the pointer remains inside a frame. The only workaround in | ||
| 12781 | this case is to clear the implicit focus along with | ||
| 12782 | XI_FocusOut events, which is not correct at all, but better | ||
| 12783 | than leaving frames in an incorrectly-focused state. | ||
| 12784 | (bug#57468) */ | ||
| 12785 | device->focus_implicit_frame = NULL; | ||
| 12743 | break; | 12786 | break; |
| 12744 | 12787 | ||
| 12745 | case XI_Enter: | 12788 | case XI_Enter: |
| @@ -13155,7 +13198,12 @@ x_detect_focus_change (struct x_display_info *dpyinfo, struct frame *frame, | |||
| 13155 | void | 13198 | void |
| 13156 | x_mouse_leave (struct x_display_info *dpyinfo) | 13199 | x_mouse_leave (struct x_display_info *dpyinfo) |
| 13157 | { | 13200 | { |
| 13158 | Mouse_HLInfo *hlinfo = &dpyinfo->mouse_highlight; | 13201 | #if defined HAVE_XINPUT2 && !defined USE_X_TOOLKIT |
| 13202 | struct xi_device_t *device; | ||
| 13203 | #endif | ||
| 13204 | Mouse_HLInfo *hlinfo; | ||
| 13205 | |||
| 13206 | hlinfo = &dpyinfo->mouse_highlight; | ||
| 13159 | 13207 | ||
| 13160 | if (hlinfo->mouse_face_mouse_frame) | 13208 | if (hlinfo->mouse_face_mouse_frame) |
| 13161 | { | 13209 | { |
| @@ -13163,7 +13211,35 @@ x_mouse_leave (struct x_display_info *dpyinfo) | |||
| 13163 | hlinfo->mouse_face_mouse_frame = NULL; | 13211 | hlinfo->mouse_face_mouse_frame = NULL; |
| 13164 | } | 13212 | } |
| 13165 | 13213 | ||
| 13166 | x_new_focus_frame (dpyinfo, dpyinfo->x_focus_event_frame); | 13214 | #if defined HAVE_XINPUT2 && !defined USE_X_TOOLKIT |
| 13215 | if (!dpyinfo->supports_xi2) | ||
| 13216 | /* The call below is supposed to reset the implicit focus and | ||
| 13217 | revert the focus back to the last explicitly focused frame. It | ||
| 13218 | doesn't work on input extension builds because focus tracking | ||
| 13219 | does not set x_focus_event_frame, and proceeds on a per-device | ||
| 13220 | basis. On such builds, clear the implicit focus of the client | ||
| 13221 | pointer instead. */ | ||
| 13222 | #endif | ||
| 13223 | x_new_focus_frame (dpyinfo, dpyinfo->x_focus_event_frame); | ||
| 13224 | #if defined HAVE_XINPUT2 && !defined USE_X_TOOLKIT | ||
| 13225 | else | ||
| 13226 | { | ||
| 13227 | if (dpyinfo->client_pointer_device == -1) | ||
| 13228 | /* If there's no client pointer device, then no implicit focus | ||
| 13229 | is currently set. */ | ||
| 13230 | return; | ||
| 13231 | |||
| 13232 | device = xi_device_from_id (dpyinfo, dpyinfo->client_pointer_device); | ||
| 13233 | |||
| 13234 | if (device && device->focus_implicit_frame) | ||
| 13235 | { | ||
| 13236 | device->focus_implicit_frame = NULL; | ||
| 13237 | |||
| 13238 | /* The focus might have changed; compute the new focus. */ | ||
| 13239 | xi_handle_focus_change (dpyinfo); | ||
| 13240 | } | ||
| 13241 | } | ||
| 13242 | #endif | ||
| 13167 | } | 13243 | } |
| 13168 | #endif | 13244 | #endif |
| 13169 | 13245 | ||
| @@ -13463,6 +13539,98 @@ get_keysym_name (int keysym) | |||
| 13463 | return value; | 13539 | return value; |
| 13464 | } | 13540 | } |
| 13465 | 13541 | ||
| 13542 | /* Given the root and event coordinates of an X event destined for F's | ||
| 13543 | edit window, compute the offset between that window and F's root | ||
| 13544 | window. This information is then used as an optimization to avoid | ||
| 13545 | synchronizing when converting coordinates from some other event to | ||
| 13546 | F's edit window. */ | ||
| 13547 | |||
| 13548 | static void | ||
| 13549 | x_compute_root_window_offset (struct frame *f, int root_x, int root_y, | ||
| 13550 | int event_x, int event_y) | ||
| 13551 | { | ||
| 13552 | FRAME_X_OUTPUT (f)->window_offset_certain_p = true; | ||
| 13553 | FRAME_X_OUTPUT (f)->root_x = root_x - event_x; | ||
| 13554 | FRAME_X_OUTPUT (f)->root_y = root_y - event_y; | ||
| 13555 | } | ||
| 13556 | |||
| 13557 | /* Translate the given coordinates from the root window to the edit | ||
| 13558 | window of FRAME, taking into account any cached root window | ||
| 13559 | offsets. This allows Emacs to avoid excessive calls to _XReply in | ||
| 13560 | many cases while handling events, which would otherwise result in | ||
| 13561 | slowdowns over slow network connections. */ | ||
| 13562 | |||
| 13563 | static void | ||
| 13564 | x_translate_coordinates (struct frame *f, int root_x, int root_y, | ||
| 13565 | int *x_out, int *y_out) | ||
| 13566 | { | ||
| 13567 | struct x_output *output; | ||
| 13568 | Window dummy; | ||
| 13569 | |||
| 13570 | output = FRAME_X_OUTPUT (f); | ||
| 13571 | |||
| 13572 | if (output->window_offset_certain_p) | ||
| 13573 | { | ||
| 13574 | /* Use the cached root window offset. */ | ||
| 13575 | *x_out = root_x - output->root_x; | ||
| 13576 | *y_out = root_y - output->root_y; | ||
| 13577 | |||
| 13578 | return; | ||
| 13579 | } | ||
| 13580 | |||
| 13581 | /* Otherwise, do the transformation manually. Then, cache the root | ||
| 13582 | window position. */ | ||
| 13583 | if (!XTranslateCoordinates (FRAME_X_DISPLAY (f), | ||
| 13584 | FRAME_DISPLAY_INFO (f)->root_window, | ||
| 13585 | FRAME_X_WINDOW (f), root_x, root_y, | ||
| 13586 | x_out, y_out, &dummy)) | ||
| 13587 | /* Use some dummy values. This is not supposed to be called with | ||
| 13588 | coordinates out of the screen. */ | ||
| 13589 | *x_out = 0, *y_out = 0; | ||
| 13590 | else | ||
| 13591 | { | ||
| 13592 | /* Cache the root window offset of the edit window. */ | ||
| 13593 | output->window_offset_certain_p = true; | ||
| 13594 | output->root_x = root_x - *x_out; | ||
| 13595 | output->root_y = root_y - *y_out; | ||
| 13596 | } | ||
| 13597 | } | ||
| 13598 | |||
| 13599 | /* The same, but for an XIDeviceEvent. */ | ||
| 13600 | |||
| 13601 | #ifdef HAVE_XINPUT2 | ||
| 13602 | |||
| 13603 | static void | ||
| 13604 | xi_compute_root_window_offset (struct frame *f, XIDeviceEvent *xev) | ||
| 13605 | { | ||
| 13606 | /* Truncate coordinates instead of rounding them, because that is | ||
| 13607 | how the X server handles window hierarchy. */ | ||
| 13608 | x_compute_root_window_offset (f, xev->root_x, xev->root_y, | ||
| 13609 | xev->event_x, xev->event_y); | ||
| 13610 | } | ||
| 13611 | |||
| 13612 | static void | ||
| 13613 | xi_compute_root_window_offset_enter (struct frame *f, XIEnterEvent *enter) | ||
| 13614 | { | ||
| 13615 | x_compute_root_window_offset (f, enter->root_x, enter->root_y, | ||
| 13616 | enter->event_x, enter->event_y); | ||
| 13617 | } | ||
| 13618 | |||
| 13619 | #ifdef HAVE_XINPUT2_4 | ||
| 13620 | |||
| 13621 | static void | ||
| 13622 | xi_compute_root_window_offset_pinch (struct frame *f, XIGesturePinchEvent *pev) | ||
| 13623 | { | ||
| 13624 | /* Truncate coordinates instead of rounding them, because that is | ||
| 13625 | how the X server handles window hierarchy. */ | ||
| 13626 | x_compute_root_window_offset (f, pev->root_x, pev->root_y, | ||
| 13627 | pev->event_x, pev->event_y); | ||
| 13628 | } | ||
| 13629 | |||
| 13630 | #endif | ||
| 13631 | |||
| 13632 | #endif | ||
| 13633 | |||
| 13466 | static Bool | 13634 | static Bool |
| 13467 | x_query_pointer_1 (struct x_display_info *dpyinfo, | 13635 | x_query_pointer_1 (struct x_display_info *dpyinfo, |
| 13468 | int client_pointer_device, Window w, | 13636 | int client_pointer_device, Window w, |
| @@ -13591,10 +13759,10 @@ x_query_pointer (Display *dpy, Window w, Window *root_return, | |||
| 13591 | X server, and instead be artificially constructed from input | 13759 | X server, and instead be artificially constructed from input |
| 13592 | extension events. In these special events, the only fields that | 13760 | extension events. In these special events, the only fields that |
| 13593 | are initialized are `time', `button', `state', `type', `window' and | 13761 | are initialized are `time', `button', `state', `type', `window' and |
| 13594 | `x' and `y'. This function should not access any other fields in | 13762 | `x', `y', `x_root' and `y_root'. This function should not access |
| 13595 | EVENT without also initializing the corresponding fields in `bv' | 13763 | any other fields in EVENT without also initializing the |
| 13596 | under the XI_ButtonPress and XI_ButtonRelease labels inside | 13764 | corresponding fields in `bv' under the XI_ButtonPress and |
| 13597 | `handle_one_xevent'. */ | 13765 | XI_ButtonRelease labels inside `handle_one_xevent'. */ |
| 13598 | 13766 | ||
| 13599 | static Lisp_Object | 13767 | static Lisp_Object |
| 13600 | x_construct_mouse_click (struct input_event *result, | 13768 | x_construct_mouse_click (struct input_event *result, |
| @@ -13603,7 +13771,6 @@ x_construct_mouse_click (struct input_event *result, | |||
| 13603 | { | 13771 | { |
| 13604 | int x = event->x; | 13772 | int x = event->x; |
| 13605 | int y = event->y; | 13773 | int y = event->y; |
| 13606 | Window dummy; | ||
| 13607 | 13774 | ||
| 13608 | /* Make the event type NO_EVENT; we'll change that when we decide | 13775 | /* Make the event type NO_EVENT; we'll change that when we decide |
| 13609 | otherwise. */ | 13776 | otherwise. */ |
| @@ -13620,9 +13787,8 @@ x_construct_mouse_click (struct input_event *result, | |||
| 13620 | happen with GTK+ scroll bars, for example), translate the | 13787 | happen with GTK+ scroll bars, for example), translate the |
| 13621 | coordinates so they appear at the correct position. */ | 13788 | coordinates so they appear at the correct position. */ |
| 13622 | if (event->window != FRAME_X_WINDOW (f)) | 13789 | if (event->window != FRAME_X_WINDOW (f)) |
| 13623 | XTranslateCoordinates (FRAME_X_DISPLAY (f), | 13790 | x_translate_coordinates (f, event->x_root, event->y_root, |
| 13624 | event->window, FRAME_X_WINDOW (f), | 13791 | &x, &y); |
| 13625 | x, y, &x, &y, &dummy); | ||
| 13626 | 13792 | ||
| 13627 | XSETINT (result->x, x); | 13793 | XSETINT (result->x, x); |
| 13628 | XSETINT (result->y, y); | 13794 | XSETINT (result->y, y); |
| @@ -14325,17 +14491,23 @@ x_protect_window_for_callback (struct x_display_info *dpyinfo, | |||
| 14325 | return true; | 14491 | return true; |
| 14326 | } | 14492 | } |
| 14327 | 14493 | ||
| 14328 | static void | 14494 | static Lisp_Object |
| 14329 | x_unprotect_window_for_callback (struct x_display_info *dpyinfo) | 14495 | x_unprotect_window_for_callback (struct x_display_info *dpyinfo) |
| 14330 | { | 14496 | { |
| 14497 | Lisp_Object window; | ||
| 14498 | |||
| 14331 | if (!dpyinfo->n_protected_windows) | 14499 | if (!dpyinfo->n_protected_windows) |
| 14332 | emacs_abort (); | 14500 | return Qnil; |
| 14501 | |||
| 14502 | window = dpyinfo->protected_windows[0]; | ||
| 14333 | 14503 | ||
| 14334 | dpyinfo->n_protected_windows--; | 14504 | dpyinfo->n_protected_windows--; |
| 14335 | 14505 | ||
| 14336 | if (dpyinfo->n_protected_windows) | 14506 | if (dpyinfo->n_protected_windows) |
| 14337 | memmove (dpyinfo->protected_windows, &dpyinfo->protected_windows[1], | 14507 | memmove (dpyinfo->protected_windows, &dpyinfo->protected_windows[1], |
| 14338 | sizeof (Lisp_Object) * dpyinfo->n_protected_windows); | 14508 | sizeof (Lisp_Object) * dpyinfo->n_protected_windows); |
| 14509 | |||
| 14510 | return window; | ||
| 14339 | } | 14511 | } |
| 14340 | 14512 | ||
| 14341 | /* Send a client message with message type Xatom_Scrollbar for a | 14513 | /* Send a client message with message type Xatom_Scrollbar for a |
| @@ -14402,30 +14574,34 @@ x_send_scroll_bar_event (Lisp_Object window, enum scroll_bar_part part, | |||
| 14402 | in *IEVENT. */ | 14574 | in *IEVENT. */ |
| 14403 | 14575 | ||
| 14404 | static void | 14576 | static void |
| 14405 | x_scroll_bar_to_input_event (const XEvent *event, | 14577 | x_scroll_bar_to_input_event (struct x_display_info *dpyinfo, |
| 14578 | const XEvent *event, | ||
| 14406 | struct input_event *ievent) | 14579 | struct input_event *ievent) |
| 14407 | { | 14580 | { |
| 14408 | const XClientMessageEvent *ev = &event->xclient; | ||
| 14409 | Lisp_Object window; | 14581 | Lisp_Object window; |
| 14410 | struct window *w; | ||
| 14411 | 14582 | ||
| 14412 | /* See the comment in the function above. */ | 14583 | /* Every time a scroll bar ClientMessage event is sent, the window |
| 14413 | intptr_t iw0 = ev->data.l[0]; | 14584 | is pushed onto a queue that is traced for garbage collection. |
| 14414 | intptr_t iw1 = ev->data.l[1]; | 14585 | Every time we need a window for a read scroll bar event, we |
| 14415 | intptr_t iw = (iw0 << 31 << 1) + (iw1 & 0xffffffffu); | 14586 | simply read from the other side of the queue. */ |
| 14416 | w = (struct window *) iw; | 14587 | window = x_unprotect_window_for_callback (dpyinfo); |
| 14417 | 14588 | ||
| 14418 | XSETWINDOW (window, w); | 14589 | if (NILP (window)) |
| 14590 | { | ||
| 14591 | /* This means we are getting extra scroll bar events for some | ||
| 14592 | reason, and shouldn't be possible in practice. */ | ||
| 14593 | EVENT_INIT (*ievent); | ||
| 14594 | return; | ||
| 14595 | } | ||
| 14419 | 14596 | ||
| 14420 | ievent->kind = SCROLL_BAR_CLICK_EVENT; | 14597 | ievent->kind = SCROLL_BAR_CLICK_EVENT; |
| 14421 | ievent->frame_or_window = window; | 14598 | ievent->frame_or_window = window; |
| 14422 | ievent->arg = Qnil; | 14599 | ievent->arg = Qnil; |
| 14423 | ievent->timestamp | 14600 | ievent->timestamp = x_get_last_toolkit_time (dpyinfo); |
| 14424 | = x_get_last_toolkit_time (FRAME_DISPLAY_INFO (XFRAME (w->frame))); | ||
| 14425 | ievent->code = 0; | 14601 | ievent->code = 0; |
| 14426 | ievent->part = ev->data.l[2]; | 14602 | ievent->part = event->xclient.data.l[2]; |
| 14427 | ievent->x = make_fixnum (ev->data.l[3]); | 14603 | ievent->x = make_fixnum (event->xclient.data.l[3]); |
| 14428 | ievent->y = make_fixnum (ev->data.l[4]); | 14604 | ievent->y = make_fixnum (event->xclient.data.l[4]); |
| 14429 | ievent->modifiers = 0; | 14605 | ievent->modifiers = 0; |
| 14430 | } | 14606 | } |
| 14431 | 14607 | ||
| @@ -14433,30 +14609,34 @@ x_scroll_bar_to_input_event (const XEvent *event, | |||
| 14433 | input event in *IEVENT. */ | 14609 | input event in *IEVENT. */ |
| 14434 | 14610 | ||
| 14435 | static void | 14611 | static void |
| 14436 | x_horizontal_scroll_bar_to_input_event (const XEvent *event, | 14612 | x_horizontal_scroll_bar_to_input_event (struct x_display_info *dpyinfo, |
| 14613 | const XEvent *event, | ||
| 14437 | struct input_event *ievent) | 14614 | struct input_event *ievent) |
| 14438 | { | 14615 | { |
| 14439 | const XClientMessageEvent *ev = &event->xclient; | ||
| 14440 | Lisp_Object window; | 14616 | Lisp_Object window; |
| 14441 | struct window *w; | ||
| 14442 | 14617 | ||
| 14443 | /* See the comment in the function above. */ | 14618 | /* Every time a scroll bar ClientMessage event is sent, the window |
| 14444 | intptr_t iw0 = ev->data.l[0]; | 14619 | is pushed onto a queue that is traced for garbage collection. |
| 14445 | intptr_t iw1 = ev->data.l[1]; | 14620 | Every time we need a window for a read scroll bar event, we |
| 14446 | intptr_t iw = (iw0 << 31 << 1) + (iw1 & 0xffffffffu); | 14621 | simply read from the other side of the queue. */ |
| 14447 | w = (struct window *) iw; | 14622 | window = x_unprotect_window_for_callback (dpyinfo); |
| 14448 | 14623 | ||
| 14449 | XSETWINDOW (window, w); | 14624 | if (NILP (window)) |
| 14625 | { | ||
| 14626 | /* This means we are getting extra scroll bar events for some | ||
| 14627 | reason, and shouldn't be possible in practice. */ | ||
| 14628 | EVENT_INIT (*ievent); | ||
| 14629 | return; | ||
| 14630 | } | ||
| 14450 | 14631 | ||
| 14451 | ievent->kind = HORIZONTAL_SCROLL_BAR_CLICK_EVENT; | 14632 | ievent->kind = HORIZONTAL_SCROLL_BAR_CLICK_EVENT; |
| 14452 | ievent->frame_or_window = window; | 14633 | ievent->frame_or_window = window; |
| 14453 | ievent->arg = Qnil; | 14634 | ievent->arg = Qnil; |
| 14454 | ievent->timestamp | 14635 | ievent->timestamp = x_get_last_toolkit_time (dpyinfo); |
| 14455 | = x_get_last_toolkit_time (FRAME_DISPLAY_INFO (XFRAME (w->frame))); | ||
| 14456 | ievent->code = 0; | 14636 | ievent->code = 0; |
| 14457 | ievent->part = ev->data.l[2]; | 14637 | ievent->part = event->xclient.data.l[2]; |
| 14458 | ievent->x = make_fixnum (ev->data.l[3]); | 14638 | ievent->x = make_fixnum (event->xclient.data.l[3]); |
| 14459 | ievent->y = make_fixnum (ev->data.l[4]); | 14639 | ievent->y = make_fixnum (event->xclient.data.l[4]); |
| 14460 | ievent->modifiers = 0; | 14640 | ievent->modifiers = 0; |
| 14461 | } | 14641 | } |
| 14462 | 14642 | ||
| @@ -17062,7 +17242,8 @@ x_dnd_update_state (struct x_display_info *dpyinfo, Time timestamp) | |||
| 17062 | if (x_dnd_last_seen_window != None | 17242 | if (x_dnd_last_seen_window != None |
| 17063 | && x_dnd_last_protocol_version != -1 | 17243 | && x_dnd_last_protocol_version != -1 |
| 17064 | && x_dnd_last_seen_window != FRAME_OUTER_WINDOW (x_dnd_frame)) | 17244 | && x_dnd_last_seen_window != FRAME_OUTER_WINDOW (x_dnd_frame)) |
| 17065 | x_dnd_send_leave (x_dnd_frame, x_dnd_last_seen_window); | 17245 | x_dnd_send_leave (x_dnd_frame, x_dnd_last_seen_window, |
| 17246 | x_dnd_last_seen_toplevel); | ||
| 17066 | else if (x_dnd_last_seen_window != None | 17247 | else if (x_dnd_last_seen_window != None |
| 17067 | && XM_DRAG_STYLE_IS_DYNAMIC (x_dnd_last_motif_style) | 17248 | && XM_DRAG_STYLE_IS_DYNAMIC (x_dnd_last_motif_style) |
| 17068 | && !x_dnd_disable_motif_drag | 17249 | && !x_dnd_disable_motif_drag |
| @@ -17093,8 +17274,6 @@ x_dnd_update_state (struct x_display_info *dpyinfo, Time timestamp) | |||
| 17093 | x_dnd_waiting_for_finish = false; | 17274 | x_dnd_waiting_for_finish = false; |
| 17094 | target = None; | 17275 | target = None; |
| 17095 | } | 17276 | } |
| 17096 | |||
| 17097 | x_dnd_last_seen_toplevel = toplevel; | ||
| 17098 | } | 17277 | } |
| 17099 | 17278 | ||
| 17100 | if (target != x_dnd_last_seen_window) | 17279 | if (target != x_dnd_last_seen_window) |
| @@ -17102,7 +17281,8 @@ x_dnd_update_state (struct x_display_info *dpyinfo, Time timestamp) | |||
| 17102 | if (x_dnd_last_seen_window != None | 17281 | if (x_dnd_last_seen_window != None |
| 17103 | && x_dnd_last_protocol_version != -1 | 17282 | && x_dnd_last_protocol_version != -1 |
| 17104 | && x_dnd_last_seen_window != FRAME_OUTER_WINDOW (x_dnd_frame)) | 17283 | && x_dnd_last_seen_window != FRAME_OUTER_WINDOW (x_dnd_frame)) |
| 17105 | x_dnd_send_leave (x_dnd_frame, x_dnd_last_seen_window); | 17284 | x_dnd_send_leave (x_dnd_frame, x_dnd_last_seen_window, |
| 17285 | x_dnd_last_seen_toplevel); | ||
| 17106 | else if (x_dnd_last_seen_window != None | 17286 | else if (x_dnd_last_seen_window != None |
| 17107 | && XM_DRAG_STYLE_IS_DYNAMIC (x_dnd_last_motif_style) | 17287 | && XM_DRAG_STYLE_IS_DYNAMIC (x_dnd_last_motif_style) |
| 17108 | && !x_dnd_disable_motif_drag | 17288 | && !x_dnd_disable_motif_drag |
| @@ -17124,13 +17304,14 @@ x_dnd_update_state (struct x_display_info *dpyinfo, Time timestamp) | |||
| 17124 | } | 17304 | } |
| 17125 | 17305 | ||
| 17126 | x_dnd_action = None; | 17306 | x_dnd_action = None; |
| 17307 | x_dnd_last_seen_toplevel = toplevel; | ||
| 17127 | x_dnd_last_seen_window = target; | 17308 | x_dnd_last_seen_window = target; |
| 17128 | x_dnd_last_protocol_version = target_proto; | 17309 | x_dnd_last_protocol_version = target_proto; |
| 17129 | x_dnd_last_motif_style = motif_style; | 17310 | x_dnd_last_motif_style = motif_style; |
| 17130 | x_dnd_last_window_is_frame = was_frame; | 17311 | x_dnd_last_window_is_frame = was_frame; |
| 17131 | 17312 | ||
| 17132 | if (target != None && x_dnd_last_protocol_version != -1) | 17313 | if (target != None && x_dnd_last_protocol_version != -1) |
| 17133 | x_dnd_send_enter (x_dnd_frame, target, | 17314 | x_dnd_send_enter (x_dnd_frame, target, x_dnd_last_seen_toplevel, |
| 17134 | x_dnd_last_protocol_version); | 17315 | x_dnd_last_protocol_version); |
| 17135 | else if (target != None && XM_DRAG_STYLE_IS_DYNAMIC (x_dnd_last_motif_style) | 17316 | else if (target != None && XM_DRAG_STYLE_IS_DYNAMIC (x_dnd_last_motif_style) |
| 17136 | && !x_dnd_disable_motif_drag) | 17317 | && !x_dnd_disable_motif_drag) |
| @@ -17151,11 +17332,14 @@ x_dnd_update_state (struct x_display_info *dpyinfo, Time timestamp) | |||
| 17151 | target, &emsg); | 17332 | target, &emsg); |
| 17152 | } | 17333 | } |
| 17153 | } | 17334 | } |
| 17335 | else | ||
| 17336 | x_dnd_last_seen_toplevel = toplevel; | ||
| 17154 | 17337 | ||
| 17155 | if (x_dnd_last_window_is_frame && target != None) | 17338 | if (x_dnd_last_window_is_frame && target != None) |
| 17156 | x_dnd_note_self_position (dpyinfo, target, root_x, root_y); | 17339 | x_dnd_note_self_position (dpyinfo, target, root_x, root_y); |
| 17157 | else if (x_dnd_last_protocol_version != -1 && target != None) | 17340 | else if (x_dnd_last_protocol_version != -1 && target != None) |
| 17158 | x_dnd_send_position (x_dnd_frame, target, | 17341 | x_dnd_send_position (x_dnd_frame, target, |
| 17342 | x_dnd_last_seen_toplevel, | ||
| 17159 | x_dnd_last_protocol_version, | 17343 | x_dnd_last_protocol_version, |
| 17160 | root_x, root_y, | 17344 | root_x, root_y, |
| 17161 | x_dnd_selection_timestamp, | 17345 | x_dnd_selection_timestamp, |
| @@ -17199,7 +17383,8 @@ x_dnd_update_state (struct x_display_info *dpyinfo, Time timestamp) | |||
| 17199 | if (x_dnd_last_seen_window != None | 17383 | if (x_dnd_last_seen_window != None |
| 17200 | && x_dnd_last_protocol_version != -1) | 17384 | && x_dnd_last_protocol_version != -1) |
| 17201 | x_dnd_send_leave (x_dnd_frame, | 17385 | x_dnd_send_leave (x_dnd_frame, |
| 17202 | x_dnd_last_seen_window); | 17386 | x_dnd_last_seen_window, |
| 17387 | x_dnd_last_seen_toplevel); | ||
| 17203 | else if (x_dnd_last_seen_window != None | 17388 | else if (x_dnd_last_seen_window != None |
| 17204 | && !XM_DRAG_STYLE_IS_DROP_ONLY (x_dnd_last_motif_style) | 17389 | && !XM_DRAG_STYLE_IS_DROP_ONLY (x_dnd_last_motif_style) |
| 17205 | && x_dnd_last_motif_style != XM_DRAG_STYLE_NONE | 17390 | && x_dnd_last_motif_style != XM_DRAG_STYLE_NONE |
| @@ -17516,6 +17701,53 @@ x_coords_from_dnd_message (struct x_display_info *dpyinfo, | |||
| 17516 | return false; | 17701 | return false; |
| 17517 | } | 17702 | } |
| 17518 | 17703 | ||
| 17704 | static void | ||
| 17705 | x_handle_wm_state (struct frame *f, struct input_event *ie) | ||
| 17706 | { | ||
| 17707 | Atom type; | ||
| 17708 | int format; | ||
| 17709 | unsigned long nitems, bytes_after; | ||
| 17710 | unsigned char *data; | ||
| 17711 | unsigned long *state; | ||
| 17712 | |||
| 17713 | data = NULL; | ||
| 17714 | |||
| 17715 | if (XGetWindowProperty (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), | ||
| 17716 | FRAME_DISPLAY_INFO (f)->Xatom_wm_state, 0, 2, | ||
| 17717 | False, AnyPropertyType, &type, &format, &nitems, | ||
| 17718 | &bytes_after, &data) != Success) | ||
| 17719 | return; | ||
| 17720 | |||
| 17721 | if (!data || nitems != 2 || format != 32) | ||
| 17722 | { | ||
| 17723 | if (data) | ||
| 17724 | XFree (data); | ||
| 17725 | |||
| 17726 | return; | ||
| 17727 | } | ||
| 17728 | |||
| 17729 | state = (unsigned long *) data; | ||
| 17730 | |||
| 17731 | if (state[0] == NormalState && FRAME_ICONIFIED_P (f)) | ||
| 17732 | { | ||
| 17733 | /* The frame has been deiconified. It has not been withdrawn | ||
| 17734 | and is now visible. */ | ||
| 17735 | SET_FRAME_VISIBLE (f, 1); | ||
| 17736 | SET_FRAME_ICONIFIED (f, false); | ||
| 17737 | f->output_data.x->has_been_visible = true; | ||
| 17738 | |||
| 17739 | ie->kind = DEICONIFY_EVENT; | ||
| 17740 | XSETFRAME (ie->frame_or_window, f); | ||
| 17741 | } | ||
| 17742 | |||
| 17743 | /* state[0] can also be WithdrawnState, meaning that the window has | ||
| 17744 | been withdrawn and is no longer iconified. However, Emacs sets | ||
| 17745 | the correct flags upon withdrawing the window, so there is no | ||
| 17746 | need to do anything here. */ | ||
| 17747 | |||
| 17748 | XFree (data); | ||
| 17749 | } | ||
| 17750 | |||
| 17519 | /* Handles the XEvent EVENT on display DPYINFO. | 17751 | /* Handles the XEvent EVENT on display DPYINFO. |
| 17520 | 17752 | ||
| 17521 | *FINISH is X_EVENT_GOTO_OUT if caller should stop reading events. | 17753 | *FINISH is X_EVENT_GOTO_OUT if caller should stop reading events. |
| @@ -17539,7 +17771,7 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 17539 | int do_help = 0; | 17771 | int do_help = 0; |
| 17540 | #ifdef HAVE_XINPUT2 | 17772 | #ifdef HAVE_XINPUT2 |
| 17541 | struct xi_device_t *gen_help_device; | 17773 | struct xi_device_t *gen_help_device; |
| 17542 | Time gen_help_time; | 17774 | Time gen_help_time UNINIT; |
| 17543 | #endif | 17775 | #endif |
| 17544 | ptrdiff_t nbytes = 0; | 17776 | ptrdiff_t nbytes = 0; |
| 17545 | struct frame *any, *f = NULL; | 17777 | struct frame *any, *f = NULL; |
| @@ -17565,6 +17797,12 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 17565 | int dx, dy; | 17797 | int dx, dy; |
| 17566 | USE_SAFE_ALLOCA; | 17798 | USE_SAFE_ALLOCA; |
| 17567 | 17799 | ||
| 17800 | /* This function is not reentrant, so input should be blocked before | ||
| 17801 | it is called. */ | ||
| 17802 | |||
| 17803 | if (!input_blocked_p ()) | ||
| 17804 | emacs_abort (); | ||
| 17805 | |||
| 17568 | *finish = X_EVENT_NORMAL; | 17806 | *finish = X_EVENT_NORMAL; |
| 17569 | 17807 | ||
| 17570 | EVENT_INIT (inev.ie); | 17808 | EVENT_INIT (inev.ie); |
| @@ -17614,7 +17852,7 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 17614 | 17852 | ||
| 17615 | if (x_dnd_last_protocol_version != -1 | 17853 | if (x_dnd_last_protocol_version != -1 |
| 17616 | && x_dnd_in_progress | 17854 | && x_dnd_in_progress |
| 17617 | && target == x_dnd_last_seen_window | 17855 | && target == x_dnd_last_seen_toplevel |
| 17618 | /* The XDND documentation is not very clearly worded. | 17856 | /* The XDND documentation is not very clearly worded. |
| 17619 | But this should be the correct behavior, since | 17857 | But this should be the correct behavior, since |
| 17620 | "kDNDStatusSendHereFlag" in the reference | 17858 | "kDNDStatusSendHereFlag" in the reference |
| @@ -17711,7 +17949,9 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 17711 | 17949 | ||
| 17712 | x_dnd_waiting_for_finish | 17950 | x_dnd_waiting_for_finish |
| 17713 | = x_dnd_send_drop (x_dnd_finish_frame, | 17951 | = x_dnd_send_drop (x_dnd_finish_frame, |
| 17714 | target, x_dnd_selection_timestamp, | 17952 | target, |
| 17953 | x_dnd_last_seen_toplevel, | ||
| 17954 | x_dnd_selection_timestamp, | ||
| 17715 | x_dnd_send_drop_proto); | 17955 | x_dnd_send_drop_proto); |
| 17716 | } | 17956 | } |
| 17717 | } | 17957 | } |
| @@ -18031,13 +18271,22 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 18031 | we construct an input_event. */ | 18271 | we construct an input_event. */ |
| 18032 | if (event->xclient.message_type == dpyinfo->Xatom_Scrollbar) | 18272 | if (event->xclient.message_type == dpyinfo->Xatom_Scrollbar) |
| 18033 | { | 18273 | { |
| 18034 | x_scroll_bar_to_input_event (event, &inev.ie); | 18274 | /* Convert the scroll bar event to an input event using |
| 18275 | the first window entered into the scroll bar event | ||
| 18276 | queue. */ | ||
| 18277 | x_scroll_bar_to_input_event (dpyinfo, event, &inev.ie); | ||
| 18278 | |||
| 18035 | *finish = X_EVENT_GOTO_OUT; | 18279 | *finish = X_EVENT_GOTO_OUT; |
| 18036 | goto done; | 18280 | goto done; |
| 18037 | } | 18281 | } |
| 18038 | else if (event->xclient.message_type == dpyinfo->Xatom_Horizontal_Scrollbar) | 18282 | else if (event->xclient.message_type == dpyinfo->Xatom_Horizontal_Scrollbar) |
| 18039 | { | 18283 | { |
| 18040 | x_horizontal_scroll_bar_to_input_event (event, &inev.ie); | 18284 | /* Convert the horizontal scroll bar event to an input |
| 18285 | event using the first window entered into the scroll | ||
| 18286 | bar event queue. */ | ||
| 18287 | x_horizontal_scroll_bar_to_input_event (dpyinfo, event, | ||
| 18288 | &inev.ie); | ||
| 18289 | |||
| 18041 | *finish = X_EVENT_GOTO_OUT; | 18290 | *finish = X_EVENT_GOTO_OUT; |
| 18042 | goto done; | 18291 | goto done; |
| 18043 | } | 18292 | } |
| @@ -18287,6 +18536,19 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 18287 | } | 18536 | } |
| 18288 | } | 18537 | } |
| 18289 | 18538 | ||
| 18539 | if (f && event->xproperty.atom == dpyinfo->Xatom_wm_state | ||
| 18540 | && !FRAME_X_EMBEDDED_P (f) && !FRAME_PARENT_FRAME (f)) | ||
| 18541 | /* Handle WM_STATE. We use this to clear the iconified flag | ||
| 18542 | on a frame if it is set. | ||
| 18543 | |||
| 18544 | GTK builds ignore deiconifying frames on FocusIn or Expose | ||
| 18545 | by default, and cannot wait for the window manager to | ||
| 18546 | remove _NET_WM_STATE_HIDDEN, as it is ambiguous when not | ||
| 18547 | set. Handling UnmapNotify also checks for | ||
| 18548 | _NET_WM_STATE_HIDDEN, and thus suffers from the same | ||
| 18549 | problem. */ | ||
| 18550 | x_handle_wm_state (f, &inev.ie); | ||
| 18551 | |||
| 18290 | if (f && FRAME_X_OUTPUT (f)->alpha_identical_p | 18552 | if (f && FRAME_X_OUTPUT (f)->alpha_identical_p |
| 18291 | && (event->xproperty.atom | 18553 | && (event->xproperty.atom |
| 18292 | == dpyinfo->Xatom_net_wm_window_opacity)) | 18554 | == dpyinfo->Xatom_net_wm_window_opacity)) |
| @@ -18416,6 +18678,24 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 18416 | f = x_top_window_to_frame (dpyinfo, event->xreparent.window); | 18678 | f = x_top_window_to_frame (dpyinfo, event->xreparent.window); |
| 18417 | if (f) | 18679 | if (f) |
| 18418 | { | 18680 | { |
| 18681 | #ifndef USE_GTK | ||
| 18682 | if (FRAME_OUTPUT_DATA (f)->parent_desc | ||
| 18683 | && FRAME_X_EMBEDDED_P (f)) | ||
| 18684 | { | ||
| 18685 | /* The frame's embedder was destroyed; mark the frame as | ||
| 18686 | no longer embedded, and map the frame. An | ||
| 18687 | UnmapNotify event must have previously been received | ||
| 18688 | during the start of save-set processing. */ | ||
| 18689 | |||
| 18690 | FRAME_X_OUTPUT (f)->explicit_parent = false; | ||
| 18691 | |||
| 18692 | /* Remove the leftover XEMBED_INFO property. */ | ||
| 18693 | XDeleteProperty (dpyinfo->display, FRAME_OUTER_WINDOW (f), | ||
| 18694 | dpyinfo->Xatom_XEMBED_INFO); | ||
| 18695 | x_make_frame_visible (f); | ||
| 18696 | } | ||
| 18697 | #endif | ||
| 18698 | |||
| 18419 | /* Maybe we shouldn't set this for child frames ?? */ | 18699 | /* Maybe we shouldn't set this for child frames ?? */ |
| 18420 | f->output_data.x->parent_desc = event->xreparent.parent; | 18700 | f->output_data.x->parent_desc = event->xreparent.parent; |
| 18421 | 18701 | ||
| @@ -18443,11 +18723,9 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 18443 | Window root; | 18723 | Window root; |
| 18444 | unsigned int dummy_uint; | 18724 | unsigned int dummy_uint; |
| 18445 | 18725 | ||
| 18446 | block_input (); | ||
| 18447 | XGetGeometry (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), | 18726 | XGetGeometry (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), |
| 18448 | &root, &f->left_pos, &f->top_pos, | 18727 | &root, &f->left_pos, &f->top_pos, |
| 18449 | &dummy_uint, &dummy_uint, &dummy_uint, &dummy_uint); | 18728 | &dummy_uint, &dummy_uint, &dummy_uint, &dummy_uint); |
| 18450 | unblock_input (); | ||
| 18451 | } | 18729 | } |
| 18452 | 18730 | ||
| 18453 | x_set_frame_alpha (f); | 18731 | x_set_frame_alpha (f); |
| @@ -18472,7 +18750,6 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 18472 | { | 18750 | { |
| 18473 | if (!FRAME_VISIBLE_P (f)) | 18751 | if (!FRAME_VISIBLE_P (f)) |
| 18474 | { | 18752 | { |
| 18475 | block_input (); | ||
| 18476 | /* By default, do not set the frame's visibility here, see | 18753 | /* By default, do not set the frame's visibility here, see |
| 18477 | https://lists.gnu.org/archive/html/emacs-devel/2017-02/msg00133.html. | 18754 | https://lists.gnu.org/archive/html/emacs-devel/2017-02/msg00133.html. |
| 18478 | The default behavior can be overridden by setting | 18755 | The default behavior can be overridden by setting |
| @@ -18491,7 +18768,6 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 18491 | #endif | 18768 | #endif |
| 18492 | f->output_data.x->has_been_visible = true; | 18769 | f->output_data.x->has_been_visible = true; |
| 18493 | SET_FRAME_GARBAGED (f); | 18770 | SET_FRAME_GARBAGED (f); |
| 18494 | unblock_input (); | ||
| 18495 | } | 18771 | } |
| 18496 | else if (FRAME_GARBAGED_P (f)) | 18772 | else if (FRAME_GARBAGED_P (f)) |
| 18497 | { | 18773 | { |
| @@ -18858,6 +19134,13 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 18858 | `event' itself. */ | 19134 | `event' itself. */ |
| 18859 | XKeyEvent xkey = event->xkey; | 19135 | XKeyEvent xkey = event->xkey; |
| 18860 | 19136 | ||
| 19137 | if (event->xkey.window == FRAME_X_WINDOW (f)) | ||
| 19138 | /* See the comment above x_compute_root_window_offset for | ||
| 19139 | why this optimization is performed. */ | ||
| 19140 | x_compute_root_window_offset (f, event->xkey.x_root, | ||
| 19141 | event->xkey.y_root, | ||
| 19142 | event->xkey.x, event->xkey.y); | ||
| 19143 | |||
| 18861 | #ifdef HAVE_XINPUT2 | 19144 | #ifdef HAVE_XINPUT2 |
| 18862 | Time pending_keystroke_time; | 19145 | Time pending_keystroke_time; |
| 18863 | struct xi_device_t *source; | 19146 | struct xi_device_t *source; |
| @@ -18916,7 +19199,7 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 18916 | &xkey, (char *) copy_bufptr, | 19199 | &xkey, (char *) copy_bufptr, |
| 18917 | copy_bufsiz, &keysym, | 19200 | copy_bufsiz, &keysym, |
| 18918 | &status_return); | 19201 | &status_return); |
| 18919 | coding = Qnil; | 19202 | coding = FRAME_X_XIM_CODING (f); |
| 18920 | if (status_return == XBufferOverflow) | 19203 | if (status_return == XBufferOverflow) |
| 18921 | { | 19204 | { |
| 18922 | copy_bufsiz = nbytes + 1; | 19205 | copy_bufsiz = nbytes + 1; |
| @@ -19262,6 +19545,18 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 19262 | x_display_set_last_user_time (dpyinfo, event->xcrossing.time, | 19545 | x_display_set_last_user_time (dpyinfo, event->xcrossing.time, |
| 19263 | event->xcrossing.send_event); | 19546 | event->xcrossing.send_event); |
| 19264 | 19547 | ||
| 19548 | #ifdef HAVE_XINPUT2 | ||
| 19549 | /* For whatever reason, the X server continues to deliver | ||
| 19550 | EnterNotify and LeaveNotify events despite us selecting for | ||
| 19551 | related XI_Enter and XI_Leave events. It's not just our | ||
| 19552 | problem, since windows created by "xinput test-xi2" suffer | ||
| 19553 | from the same defect. Simply ignore all such events while | ||
| 19554 | the input extension is enabled. (bug#57468) */ | ||
| 19555 | |||
| 19556 | if (dpyinfo->supports_xi2) | ||
| 19557 | goto OTHER; | ||
| 19558 | #endif | ||
| 19559 | |||
| 19265 | if (x_top_window_to_frame (dpyinfo, event->xcrossing.window)) | 19560 | if (x_top_window_to_frame (dpyinfo, event->xcrossing.window)) |
| 19266 | x_detect_focus_change (dpyinfo, any, event, &inev.ie); | 19561 | x_detect_focus_change (dpyinfo, any, event, &inev.ie); |
| 19267 | 19562 | ||
| @@ -19292,6 +19587,16 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 19292 | 19587 | ||
| 19293 | f = any; | 19588 | f = any; |
| 19294 | 19589 | ||
| 19590 | if (f && event->xcrossing.window == FRAME_X_WINDOW (f)) | ||
| 19591 | x_compute_root_window_offset (f, event->xcrossing.x_root, | ||
| 19592 | event->xcrossing.y_root, | ||
| 19593 | event->xcrossing.x, | ||
| 19594 | event->xcrossing.y); | ||
| 19595 | |||
| 19596 | /* The code below relies on the first several fields of | ||
| 19597 | XCrossingEvent being laid out the same way as | ||
| 19598 | XMotionEvent. */ | ||
| 19599 | |||
| 19295 | if (f && x_mouse_click_focus_ignore_position) | 19600 | if (f && x_mouse_click_focus_ignore_position) |
| 19296 | { | 19601 | { |
| 19297 | ignore_next_mouse_click_timeout = (event->xmotion.time | 19602 | ignore_next_mouse_click_timeout = (event->xmotion.time |
| @@ -19363,6 +19668,18 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 19363 | x_display_set_last_user_time (dpyinfo, event->xcrossing.time, | 19668 | x_display_set_last_user_time (dpyinfo, event->xcrossing.time, |
| 19364 | event->xcrossing.send_event); | 19669 | event->xcrossing.send_event); |
| 19365 | 19670 | ||
| 19671 | #ifdef HAVE_XINPUT2 | ||
| 19672 | /* For whatever reason, the X server continues to deliver | ||
| 19673 | EnterNotify and LeaveNotify events despite us selecting for | ||
| 19674 | related XI_Enter and XI_Leave events. It's not just our | ||
| 19675 | problem, since windows created by "xinput test-xi2" suffer | ||
| 19676 | from the same defect. Simply ignore all such events while | ||
| 19677 | the input extension is enabled. (bug#57468) */ | ||
| 19678 | |||
| 19679 | if (dpyinfo->supports_xi2) | ||
| 19680 | goto OTHER; | ||
| 19681 | #endif | ||
| 19682 | |||
| 19366 | #ifdef HAVE_XWIDGETS | 19683 | #ifdef HAVE_XWIDGETS |
| 19367 | { | 19684 | { |
| 19368 | struct xwidget_view *xvw = xwidget_view_from_window (event->xcrossing.window); | 19685 | struct xwidget_view *xvw = xwidget_view_from_window (event->xcrossing.window); |
| @@ -19388,14 +19705,7 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 19388 | #else | 19705 | #else |
| 19389 | f = x_top_window_to_frame (dpyinfo, event->xcrossing.window); | 19706 | f = x_top_window_to_frame (dpyinfo, event->xcrossing.window); |
| 19390 | #endif | 19707 | #endif |
| 19391 | #if defined USE_X_TOOLKIT && defined HAVE_XINPUT2 && !defined USE_MOTIF | 19708 | |
| 19392 | /* The XI2 event mask is set on the frame widget, so this event | ||
| 19393 | likely originates from the shell widget, which we aren't | ||
| 19394 | interested in. (But don't ignore this on Motif, since we | ||
| 19395 | want to clear the mouse face when a popup is active.) */ | ||
| 19396 | if (dpyinfo->supports_xi2) | ||
| 19397 | f = NULL; | ||
| 19398 | #endif | ||
| 19399 | if (f) | 19709 | if (f) |
| 19400 | { | 19710 | { |
| 19401 | /* Now clear dpyinfo->last_mouse_motion_frame, or | 19711 | /* Now clear dpyinfo->last_mouse_motion_frame, or |
| @@ -19431,6 +19741,13 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 19431 | || EQ (track_mouse, Qdropping)) | 19741 | || EQ (track_mouse, Qdropping)) |
| 19432 | && gui_mouse_grabbed (dpyinfo))) | 19742 | && gui_mouse_grabbed (dpyinfo))) |
| 19433 | do_help = -1; | 19743 | do_help = -1; |
| 19744 | |||
| 19745 | if (event->xcrossing.window == FRAME_X_WINDOW (f)) | ||
| 19746 | x_compute_root_window_offset (f, event->xcrossing.x_root, | ||
| 19747 | event->xcrossing.y_root, | ||
| 19748 | event->xcrossing.x, | ||
| 19749 | event->xcrossing.y); | ||
| 19750 | |||
| 19434 | } | 19751 | } |
| 19435 | #ifdef USE_GTK | 19752 | #ifdef USE_GTK |
| 19436 | /* See comment in EnterNotify above */ | 19753 | /* See comment in EnterNotify above */ |
| @@ -19474,6 +19791,14 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 19474 | 19791 | ||
| 19475 | f = mouse_or_wdesc_frame (dpyinfo, event->xmotion.window); | 19792 | f = mouse_or_wdesc_frame (dpyinfo, event->xmotion.window); |
| 19476 | 19793 | ||
| 19794 | if (f && event->xmotion.window == FRAME_X_WINDOW (f)) | ||
| 19795 | /* See the comment above x_compute_root_window_offset for | ||
| 19796 | why this optimization is performed. */ | ||
| 19797 | x_compute_root_window_offset (f, event->xmotion.x_root, | ||
| 19798 | event->xmotion.y_root, | ||
| 19799 | event->xmotion.x, | ||
| 19800 | event->xmotion.y); | ||
| 19801 | |||
| 19477 | if (x_dnd_in_progress | 19802 | if (x_dnd_in_progress |
| 19478 | /* Handle these events normally if the recursion | 19803 | /* Handle these events normally if the recursion |
| 19479 | level is higher than when the drag-and-drop | 19804 | level is higher than when the drag-and-drop |
| @@ -19548,7 +19873,8 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 19548 | if (x_dnd_last_seen_window != None | 19873 | if (x_dnd_last_seen_window != None |
| 19549 | && x_dnd_last_protocol_version != -1 | 19874 | && x_dnd_last_protocol_version != -1 |
| 19550 | && x_dnd_last_seen_window != FRAME_OUTER_WINDOW (x_dnd_frame)) | 19875 | && x_dnd_last_seen_window != FRAME_OUTER_WINDOW (x_dnd_frame)) |
| 19551 | x_dnd_send_leave (x_dnd_frame, x_dnd_last_seen_window); | 19876 | x_dnd_send_leave (x_dnd_frame, x_dnd_last_seen_window, |
| 19877 | x_dnd_last_seen_toplevel); | ||
| 19552 | else if (x_dnd_last_seen_window != None | 19878 | else if (x_dnd_last_seen_window != None |
| 19553 | && XM_DRAG_STYLE_IS_DYNAMIC (x_dnd_last_motif_style) | 19879 | && XM_DRAG_STYLE_IS_DYNAMIC (x_dnd_last_motif_style) |
| 19554 | && !x_dnd_disable_motif_drag | 19880 | && !x_dnd_disable_motif_drag |
| @@ -19579,8 +19905,6 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 19579 | x_dnd_waiting_for_finish = false; | 19905 | x_dnd_waiting_for_finish = false; |
| 19580 | target = None; | 19906 | target = None; |
| 19581 | } | 19907 | } |
| 19582 | |||
| 19583 | x_dnd_last_seen_toplevel = toplevel; | ||
| 19584 | } | 19908 | } |
| 19585 | 19909 | ||
| 19586 | if (target != x_dnd_last_seen_window) | 19910 | if (target != x_dnd_last_seen_window) |
| @@ -19588,7 +19912,8 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 19588 | if (x_dnd_last_seen_window != None | 19912 | if (x_dnd_last_seen_window != None |
| 19589 | && x_dnd_last_protocol_version != -1 | 19913 | && x_dnd_last_protocol_version != -1 |
| 19590 | && x_dnd_last_seen_window != FRAME_OUTER_WINDOW (x_dnd_frame)) | 19914 | && x_dnd_last_seen_window != FRAME_OUTER_WINDOW (x_dnd_frame)) |
| 19591 | x_dnd_send_leave (x_dnd_frame, x_dnd_last_seen_window); | 19915 | x_dnd_send_leave (x_dnd_frame, x_dnd_last_seen_window, |
| 19916 | x_dnd_last_seen_toplevel); | ||
| 19592 | else if (x_dnd_last_seen_window != None | 19917 | else if (x_dnd_last_seen_window != None |
| 19593 | && XM_DRAG_STYLE_IS_DYNAMIC (x_dnd_last_motif_style) | 19918 | && XM_DRAG_STYLE_IS_DYNAMIC (x_dnd_last_motif_style) |
| 19594 | && x_dnd_disable_motif_drag | 19919 | && x_dnd_disable_motif_drag |
| @@ -19631,6 +19956,7 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 19631 | } | 19956 | } |
| 19632 | 19957 | ||
| 19633 | x_dnd_action = None; | 19958 | x_dnd_action = None; |
| 19959 | x_dnd_last_seen_toplevel = toplevel; | ||
| 19634 | x_dnd_last_seen_window = target; | 19960 | x_dnd_last_seen_window = target; |
| 19635 | x_dnd_last_protocol_version = target_proto; | 19961 | x_dnd_last_protocol_version = target_proto; |
| 19636 | x_dnd_last_motif_style = motif_style; | 19962 | x_dnd_last_motif_style = motif_style; |
| @@ -19638,6 +19964,7 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 19638 | 19964 | ||
| 19639 | if (target != None && x_dnd_last_protocol_version != -1) | 19965 | if (target != None && x_dnd_last_protocol_version != -1) |
| 19640 | x_dnd_send_enter (x_dnd_frame, target, | 19966 | x_dnd_send_enter (x_dnd_frame, target, |
| 19967 | x_dnd_last_seen_toplevel, | ||
| 19641 | x_dnd_last_protocol_version); | 19968 | x_dnd_last_protocol_version); |
| 19642 | else if (target != None && XM_DRAG_STYLE_IS_DYNAMIC (x_dnd_last_motif_style) | 19969 | else if (target != None && XM_DRAG_STYLE_IS_DYNAMIC (x_dnd_last_motif_style) |
| 19643 | && !x_dnd_disable_motif_drag) | 19970 | && !x_dnd_disable_motif_drag) |
| @@ -19658,6 +19985,8 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 19658 | target, &emsg); | 19985 | target, &emsg); |
| 19659 | } | 19986 | } |
| 19660 | } | 19987 | } |
| 19988 | else | ||
| 19989 | x_dnd_last_seen_toplevel = toplevel; | ||
| 19661 | 19990 | ||
| 19662 | if (x_dnd_last_window_is_frame && target != None) | 19991 | if (x_dnd_last_window_is_frame && target != None) |
| 19663 | x_dnd_note_self_position (dpyinfo, target, | 19992 | x_dnd_note_self_position (dpyinfo, target, |
| @@ -19665,6 +19994,7 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 19665 | event->xbutton.y_root); | 19994 | event->xbutton.y_root); |
| 19666 | else if (x_dnd_last_protocol_version != -1 && target != None) | 19995 | else if (x_dnd_last_protocol_version != -1 && target != None) |
| 19667 | x_dnd_send_position (x_dnd_frame, target, | 19996 | x_dnd_send_position (x_dnd_frame, target, |
| 19997 | x_dnd_last_seen_toplevel, | ||
| 19668 | x_dnd_last_protocol_version, | 19998 | x_dnd_last_protocol_version, |
| 19669 | event->xmotion.x_root, | 19999 | event->xmotion.x_root, |
| 19670 | event->xmotion.y_root, | 20000 | event->xmotion.y_root, |
| @@ -19733,10 +20063,8 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 19733 | 20063 | ||
| 19734 | if (xmotion.window != FRAME_X_WINDOW (f)) | 20064 | if (xmotion.window != FRAME_X_WINDOW (f)) |
| 19735 | { | 20065 | { |
| 19736 | XTranslateCoordinates (FRAME_X_DISPLAY (f), | 20066 | x_translate_coordinates (f, xmotion.x_root, xmotion.y_root, |
| 19737 | xmotion.window, FRAME_X_WINDOW (f), | 20067 | &xmotion.x, &xmotion.y); |
| 19738 | xmotion.x, xmotion.y, &xmotion.x, | ||
| 19739 | &xmotion.y, &xmotion.subwindow); | ||
| 19740 | xmotion.window = FRAME_X_WINDOW (f); | 20068 | xmotion.window = FRAME_X_WINDOW (f); |
| 19741 | } | 20069 | } |
| 19742 | 20070 | ||
| @@ -19959,17 +20287,21 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 19959 | #endif | 20287 | #endif |
| 19960 | 20288 | ||
| 19961 | f = x_top_window_to_frame (dpyinfo, configureEvent.xconfigure.window); | 20289 | f = x_top_window_to_frame (dpyinfo, configureEvent.xconfigure.window); |
| 20290 | |||
| 20291 | /* This means we can no longer be certain of the root window | ||
| 20292 | coordinates of any's edit window. */ | ||
| 20293 | if (any) | ||
| 20294 | FRAME_X_OUTPUT (any)->window_offset_certain_p = false; | ||
| 20295 | |||
| 19962 | /* Unfortunately, we need to call x_drop_xrender_surfaces for | 20296 | /* Unfortunately, we need to call x_drop_xrender_surfaces for |
| 19963 | _all_ ConfigureNotify events, otherwise we miss some and | 20297 | _all_ ConfigureNotify events, otherwise we miss some and |
| 19964 | flicker. Don't try to optimize these calls by looking only | 20298 | flicker. Don't try to optimize these calls by looking only |
| 19965 | for size changes: that's not sufficient. We miss some | 20299 | for size changes: that's not sufficient. We miss some |
| 19966 | surface invalidations and flicker. */ | 20300 | surface invalidations and flicker. */ |
| 19967 | block_input (); | ||
| 19968 | #ifdef HAVE_XDBE | 20301 | #ifdef HAVE_XDBE |
| 19969 | if (f && FRAME_X_DOUBLE_BUFFERED_P (f)) | 20302 | if (f && FRAME_X_DOUBLE_BUFFERED_P (f)) |
| 19970 | x_drop_xrender_surfaces (f); | 20303 | x_drop_xrender_surfaces (f); |
| 19971 | #endif | 20304 | #endif |
| 19972 | unblock_input (); | ||
| 19973 | #if defined USE_CAIRO && !defined USE_GTK | 20305 | #if defined USE_CAIRO && !defined USE_GTK |
| 19974 | if (f) | 20306 | if (f) |
| 19975 | x_cr_update_surface_desired_size (f, configureEvent.xconfigure.width, | 20307 | x_cr_update_surface_desired_size (f, configureEvent.xconfigure.width, |
| @@ -19999,10 +20331,8 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 19999 | f->new_width, f->new_height); | 20331 | f->new_width, f->new_height); |
| 20000 | 20332 | ||
| 20001 | #ifdef HAVE_XDBE | 20333 | #ifdef HAVE_XDBE |
| 20002 | block_input (); | ||
| 20003 | if (FRAME_X_DOUBLE_BUFFERED_P (f)) | 20334 | if (FRAME_X_DOUBLE_BUFFERED_P (f)) |
| 20004 | x_drop_xrender_surfaces (f); | 20335 | x_drop_xrender_surfaces (f); |
| 20005 | unblock_input (); | ||
| 20006 | #endif | 20336 | #endif |
| 20007 | xg_frame_resized (f, configureEvent.xconfigure.width, | 20337 | xg_frame_resized (f, configureEvent.xconfigure.width, |
| 20008 | configureEvent.xconfigure.height); | 20338 | configureEvent.xconfigure.height); |
| @@ -20092,11 +20422,9 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 20092 | Window root; | 20422 | Window root; |
| 20093 | unsigned int dummy_uint; | 20423 | unsigned int dummy_uint; |
| 20094 | 20424 | ||
| 20095 | block_input (); | ||
| 20096 | XGetGeometry (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), | 20425 | XGetGeometry (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), |
| 20097 | &root, &f->left_pos, &f->top_pos, | 20426 | &root, &f->left_pos, &f->top_pos, |
| 20098 | &dummy_uint, &dummy_uint, &dummy_uint, &dummy_uint); | 20427 | &dummy_uint, &dummy_uint, &dummy_uint, &dummy_uint); |
| 20099 | unblock_input (); | ||
| 20100 | } | 20428 | } |
| 20101 | 20429 | ||
| 20102 | if (!FRAME_TOOLTIP_P (f) | 20430 | if (!FRAME_TOOLTIP_P (f) |
| @@ -20194,6 +20522,14 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 20194 | { | 20522 | { |
| 20195 | f = mouse_or_wdesc_frame (dpyinfo, event->xbutton.window); | 20523 | f = mouse_or_wdesc_frame (dpyinfo, event->xbutton.window); |
| 20196 | 20524 | ||
| 20525 | if (f && event->xbutton.window == FRAME_X_WINDOW (f)) | ||
| 20526 | /* See the comment above x_compute_root_window_offset | ||
| 20527 | for why this optimization is performed. */ | ||
| 20528 | x_compute_root_window_offset (f, event->xbutton.x_root, | ||
| 20529 | event->xbutton.y_root, | ||
| 20530 | event->xbutton.x, | ||
| 20531 | event->xbutton.y); | ||
| 20532 | |||
| 20197 | if (event->type == ButtonPress) | 20533 | if (event->type == ButtonPress) |
| 20198 | { | 20534 | { |
| 20199 | x_display_set_last_user_time (dpyinfo, event->xbutton.time, | 20535 | x_display_set_last_user_time (dpyinfo, event->xbutton.time, |
| @@ -20226,6 +20562,7 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 20226 | else if (x_dnd_last_protocol_version != -1) | 20562 | else if (x_dnd_last_protocol_version != -1) |
| 20227 | x_dnd_send_position (x_dnd_frame, | 20563 | x_dnd_send_position (x_dnd_frame, |
| 20228 | x_dnd_last_seen_window, | 20564 | x_dnd_last_seen_window, |
| 20565 | x_dnd_last_seen_toplevel, | ||
| 20229 | x_dnd_last_protocol_version, | 20566 | x_dnd_last_protocol_version, |
| 20230 | event->xbutton.x_root, | 20567 | event->xbutton.x_root, |
| 20231 | event->xbutton.y_root, | 20568 | event->xbutton.y_root, |
| @@ -20273,11 +20610,12 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 20273 | else if (x_dnd_last_seen_window != None | 20610 | else if (x_dnd_last_seen_window != None |
| 20274 | && x_dnd_last_protocol_version != -1) | 20611 | && x_dnd_last_protocol_version != -1) |
| 20275 | { | 20612 | { |
| 20276 | x_dnd_pending_finish_target = x_dnd_last_seen_window; | 20613 | x_dnd_pending_finish_target = x_dnd_last_seen_toplevel; |
| 20277 | x_dnd_waiting_for_finish_proto = x_dnd_last_protocol_version; | 20614 | x_dnd_waiting_for_finish_proto = x_dnd_last_protocol_version; |
| 20278 | 20615 | ||
| 20279 | x_dnd_waiting_for_finish | 20616 | x_dnd_waiting_for_finish |
| 20280 | = x_dnd_do_drop (x_dnd_last_seen_window, | 20617 | = x_dnd_do_drop (x_dnd_last_seen_window, |
| 20618 | x_dnd_last_seen_toplevel, | ||
| 20281 | x_dnd_last_protocol_version); | 20619 | x_dnd_last_protocol_version); |
| 20282 | x_dnd_finish_display = dpyinfo->display; | 20620 | x_dnd_finish_display = dpyinfo->display; |
| 20283 | } | 20621 | } |
| @@ -20365,6 +20703,15 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 20365 | dpyinfo->last_mouse_glyph_frame = NULL; | 20703 | dpyinfo->last_mouse_glyph_frame = NULL; |
| 20366 | 20704 | ||
| 20367 | f = mouse_or_wdesc_frame (dpyinfo, event->xbutton.window); | 20705 | f = mouse_or_wdesc_frame (dpyinfo, event->xbutton.window); |
| 20706 | |||
| 20707 | if (f && event->xbutton.window == FRAME_X_WINDOW (f)) | ||
| 20708 | /* See the comment above x_compute_root_window_offset | ||
| 20709 | for why this optimization is performed. */ | ||
| 20710 | x_compute_root_window_offset (f, event->xbutton.x_root, | ||
| 20711 | event->xbutton.y_root, | ||
| 20712 | event->xbutton.x, | ||
| 20713 | event->xbutton.y); | ||
| 20714 | |||
| 20368 | if (f && event->xbutton.type == ButtonPress | 20715 | if (f && event->xbutton.type == ButtonPress |
| 20369 | && !popup_activated () | 20716 | && !popup_activated () |
| 20370 | && !x_window_to_scroll_bar (event->xbutton.display, | 20717 | && !x_window_to_scroll_bar (event->xbutton.display, |
| @@ -20379,12 +20726,10 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 20379 | 20726 | ||
| 20380 | if (FRAME_PARENT_FRAME (f) || (hf && frame_ancestor_p (f, hf))) | 20727 | if (FRAME_PARENT_FRAME (f) || (hf && frame_ancestor_p (f, hf))) |
| 20381 | { | 20728 | { |
| 20382 | block_input (); | ||
| 20383 | XSetInputFocus (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), | 20729 | XSetInputFocus (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), |
| 20384 | RevertToParent, event->xbutton.time); | 20730 | RevertToParent, event->xbutton.time); |
| 20385 | if (FRAME_PARENT_FRAME (f)) | 20731 | if (FRAME_PARENT_FRAME (f)) |
| 20386 | XRaiseWindow (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f)); | 20732 | XRaiseWindow (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f)); |
| 20387 | unblock_input (); | ||
| 20388 | } | 20733 | } |
| 20389 | } | 20734 | } |
| 20390 | 20735 | ||
| @@ -20615,6 +20960,15 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 20615 | == dpyinfo->net_supported_window) | 20960 | == dpyinfo->net_supported_window) |
| 20616 | dpyinfo->net_supported_window = None; | 20961 | dpyinfo->net_supported_window = None; |
| 20617 | 20962 | ||
| 20963 | if (event->xdestroywindow.window | ||
| 20964 | == dpyinfo->motif_drag_window) | ||
| 20965 | /* We get DestroyNotify events for the drag window because | ||
| 20966 | x_special_window_exists_p selects for structure | ||
| 20967 | notification. The drag window is not supposed to go away | ||
| 20968 | but not all clients obey that requirement when setting the | ||
| 20969 | drag window property. */ | ||
| 20970 | dpyinfo->motif_drag_window = None; | ||
| 20971 | |||
| 20618 | xft_settings_event (dpyinfo, event); | 20972 | xft_settings_event (dpyinfo, event); |
| 20619 | break; | 20973 | break; |
| 20620 | 20974 | ||
| @@ -20771,8 +21125,20 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 20771 | any = x_any_window_to_frame (dpyinfo, enter->event); | 21125 | any = x_any_window_to_frame (dpyinfo, enter->event); |
| 20772 | 21126 | ||
| 20773 | #ifdef HAVE_XINPUT2_1 | 21127 | #ifdef HAVE_XINPUT2_1 |
| 20774 | xi_reset_scroll_valuators_for_device_id (dpyinfo, enter->deviceid, | 21128 | /* xfwm4 selects for button events on the frame window, |
| 20775 | true); | 21129 | resulting in passive grabs being generated along with |
| 21130 | the delivery of emulated button events; this then | ||
| 21131 | interferes with scrolling, since device valuators | ||
| 21132 | will constantly be reset as the crossing events | ||
| 21133 | related to those grabs arrive. The only way to | ||
| 21134 | remedy this is to never reset scroll valuators on a | ||
| 21135 | grab-related crossing event. (bug#57476) */ | ||
| 21136 | if (enter->mode != XINotifyUngrab | ||
| 21137 | && enter->mode != XINotifyGrab | ||
| 21138 | && enter->mode != XINotifyPassiveGrab | ||
| 21139 | && enter->mode != XINotifyPassiveUngrab) | ||
| 21140 | xi_reset_scroll_valuators_for_device_id (dpyinfo, enter->deviceid, | ||
| 21141 | true); | ||
| 20776 | #endif | 21142 | #endif |
| 20777 | 21143 | ||
| 20778 | { | 21144 | { |
| @@ -20792,6 +21158,9 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 20792 | 21158 | ||
| 20793 | f = any; | 21159 | f = any; |
| 20794 | 21160 | ||
| 21161 | if (f && enter->event == FRAME_X_WINDOW (f)) | ||
| 21162 | xi_compute_root_window_offset_enter (f, enter); | ||
| 21163 | |||
| 20795 | if (f && x_mouse_click_focus_ignore_position) | 21164 | if (f && x_mouse_click_focus_ignore_position) |
| 20796 | { | 21165 | { |
| 20797 | ignore_next_mouse_click_timeout = (enter->time | 21166 | ignore_next_mouse_click_timeout = (enter->time |
| @@ -20888,7 +21257,20 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 20888 | moves out of a frame (and not into one of its | 21257 | moves out of a frame (and not into one of its |
| 20889 | children, which we know about). */ | 21258 | children, which we know about). */ |
| 20890 | #ifdef HAVE_XINPUT2_1 | 21259 | #ifdef HAVE_XINPUT2_1 |
| 20891 | if (leave->detail != XINotifyInferior && any) | 21260 | if (leave->detail != XINotifyInferior && any |
| 21261 | /* xfwm4 selects for button events on the frame | ||
| 21262 | window, resulting in passive grabs being | ||
| 21263 | generated along with the delivery of emulated | ||
| 21264 | button events; this then interferes with | ||
| 21265 | scrolling, since device valuators will constantly | ||
| 21266 | be reset as the crossing events related to those | ||
| 21267 | grabs arrive. The only way to remedy this is to | ||
| 21268 | never reset scroll valuators on a grab-related | ||
| 21269 | crossing event. (bug#57476) */ | ||
| 21270 | && leave->mode != XINotifyUngrab | ||
| 21271 | && leave->mode != XINotifyGrab | ||
| 21272 | && leave->mode != XINotifyPassiveUngrab | ||
| 21273 | && leave->mode != XINotifyPassiveGrab) | ||
| 20892 | xi_reset_scroll_valuators_for_device_id (dpyinfo, | 21274 | xi_reset_scroll_valuators_for_device_id (dpyinfo, |
| 20893 | leave->deviceid, false); | 21275 | leave->deviceid, false); |
| 20894 | #endif | 21276 | #endif |
| @@ -20926,7 +21308,11 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 20926 | just looks up a top window on Xt builds. */ | 21308 | just looks up a top window on Xt builds. */ |
| 20927 | 21309 | ||
| 20928 | #ifdef HAVE_XINPUT2_1 | 21310 | #ifdef HAVE_XINPUT2_1 |
| 20929 | if (leave->detail != XINotifyInferior && f) | 21311 | if (leave->detail != XINotifyInferior && f |
| 21312 | && leave->mode != XINotifyUngrab | ||
| 21313 | && leave->mode != XINotifyGrab | ||
| 21314 | && leave->mode != XINotifyPassiveUngrab | ||
| 21315 | && leave->mode != XINotifyPassiveGrab) | ||
| 20930 | xi_reset_scroll_valuators_for_device_id (dpyinfo, | 21316 | xi_reset_scroll_valuators_for_device_id (dpyinfo, |
| 20931 | leave->deviceid, false); | 21317 | leave->deviceid, false); |
| 20932 | #endif | 21318 | #endif |
| @@ -20971,6 +21357,9 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 20971 | || EQ (track_mouse, Qdropping)) | 21357 | || EQ (track_mouse, Qdropping)) |
| 20972 | && gui_mouse_grabbed (dpyinfo))) | 21358 | && gui_mouse_grabbed (dpyinfo))) |
| 20973 | do_help = -1; | 21359 | do_help = -1; |
| 21360 | |||
| 21361 | if (f && leave->event == FRAME_X_WINDOW (f)) | ||
| 21362 | xi_compute_root_window_offset_enter (f, leave); | ||
| 20974 | } | 21363 | } |
| 20975 | #ifdef USE_GTK | 21364 | #ifdef USE_GTK |
| 20976 | /* See comment in EnterNotify above */ | 21365 | /* See comment in EnterNotify above */ |
| @@ -21014,8 +21403,6 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 21014 | goto XI_OTHER; | 21403 | goto XI_OTHER; |
| 21015 | #endif | 21404 | #endif |
| 21016 | 21405 | ||
| 21017 | Window dummy; | ||
| 21018 | |||
| 21019 | #ifdef HAVE_XINPUT2_1 | 21406 | #ifdef HAVE_XINPUT2_1 |
| 21020 | #ifdef HAVE_XWIDGETS | 21407 | #ifdef HAVE_XWIDGETS |
| 21021 | struct xwidget_view *xv = xwidget_view_from_window (xev->event); | 21408 | struct xwidget_view *xv = xwidget_view_from_window (xev->event); |
| @@ -21093,11 +21480,10 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 21093 | real_y = lrint (xev->event_y + bar->top); | 21480 | real_y = lrint (xev->event_y + bar->top); |
| 21094 | } | 21481 | } |
| 21095 | else | 21482 | else |
| 21096 | XTranslateCoordinates (dpyinfo->display, | 21483 | x_translate_coordinates (f, |
| 21097 | xev->event, FRAME_X_WINDOW (f), | 21484 | lrint (xev->root_x), |
| 21098 | lrint (xev->event_x), | 21485 | lrint (xev->root_y), |
| 21099 | lrint (xev->event_y), | 21486 | &real_x, &real_y); |
| 21100 | &real_x, &real_y, &dummy); | ||
| 21101 | } | 21487 | } |
| 21102 | else | 21488 | else |
| 21103 | { | 21489 | { |
| @@ -21299,6 +21685,11 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 21299 | 21685 | ||
| 21300 | f = mouse_or_wdesc_frame (dpyinfo, xev->event); | 21686 | f = mouse_or_wdesc_frame (dpyinfo, xev->event); |
| 21301 | 21687 | ||
| 21688 | if (f && xev->event == FRAME_X_WINDOW (f)) | ||
| 21689 | /* See the comment above x_compute_root_window_offset | ||
| 21690 | for why this optimization is performed. */ | ||
| 21691 | xi_compute_root_window_offset (f, xev); | ||
| 21692 | |||
| 21302 | if (x_dnd_in_progress | 21693 | if (x_dnd_in_progress |
| 21303 | /* Handle these events normally if the recursion | 21694 | /* Handle these events normally if the recursion |
| 21304 | level is higher than when the drag-and-drop | 21695 | level is higher than when the drag-and-drop |
| @@ -21333,26 +21724,26 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 21333 | /* Also remember the mouse glyph and set | 21724 | /* Also remember the mouse glyph and set |
| 21334 | mouse_moved. */ | 21725 | mouse_moved. */ |
| 21335 | if (f != dpyinfo->last_mouse_glyph_frame | 21726 | if (f != dpyinfo->last_mouse_glyph_frame |
| 21336 | || xev->event_x < r->x | 21727 | || lrint (xev->event_x) < r->x |
| 21337 | || xev->event_x >= r->x + r->width | 21728 | || lrint (xev->event_x) >= r->x + r->width |
| 21338 | || xev->event_y < r->y | 21729 | || lrint (xev->event_y) < r->y |
| 21339 | || xev->event_y >= r->y + r->height) | 21730 | || lrint (xev->event_y) >= r->y + r->height) |
| 21340 | { | 21731 | { |
| 21341 | f->mouse_moved = true; | 21732 | f->mouse_moved = true; |
| 21342 | f->last_mouse_device = (source ? source->name | 21733 | f->last_mouse_device = (source ? source->name |
| 21343 | : Qnil); | 21734 | : Qnil); |
| 21344 | dpyinfo->last_mouse_scroll_bar = NULL; | 21735 | dpyinfo->last_mouse_scroll_bar = NULL; |
| 21345 | 21736 | ||
| 21346 | remember_mouse_glyph (f, xev->event_x, | 21737 | remember_mouse_glyph (f, lrint (xev->event_x), |
| 21347 | xev->event_y, r); | 21738 | lrint (xev->event_y), r); |
| 21348 | dpyinfo->last_mouse_glyph_frame = f; | 21739 | dpyinfo->last_mouse_glyph_frame = f; |
| 21349 | } | 21740 | } |
| 21350 | } | 21741 | } |
| 21351 | 21742 | ||
| 21352 | if (xev->root == dpyinfo->root_window) | 21743 | if (xev->root == dpyinfo->root_window) |
| 21353 | target = x_dnd_get_target_window (dpyinfo, | 21744 | target = x_dnd_get_target_window (dpyinfo, |
| 21354 | xev->root_x, | 21745 | lrint (xev->root_x), |
| 21355 | xev->root_y, | 21746 | lrint (xev->root_y), |
| 21356 | &target_proto, | 21747 | &target_proto, |
| 21357 | &motif_style, | 21748 | &motif_style, |
| 21358 | &toplevel, | 21749 | &toplevel, |
| @@ -21375,7 +21766,8 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 21375 | if (x_dnd_last_seen_window != None | 21766 | if (x_dnd_last_seen_window != None |
| 21376 | && x_dnd_last_protocol_version != -1 | 21767 | && x_dnd_last_protocol_version != -1 |
| 21377 | && x_dnd_last_seen_window != FRAME_OUTER_WINDOW (x_dnd_frame)) | 21768 | && x_dnd_last_seen_window != FRAME_OUTER_WINDOW (x_dnd_frame)) |
| 21378 | x_dnd_send_leave (x_dnd_frame, x_dnd_last_seen_window); | 21769 | x_dnd_send_leave (x_dnd_frame, x_dnd_last_seen_window, |
| 21770 | x_dnd_last_seen_toplevel); | ||
| 21379 | else if (x_dnd_last_seen_window != None | 21771 | else if (x_dnd_last_seen_window != None |
| 21380 | && XM_DRAG_STYLE_IS_DYNAMIC (x_dnd_last_motif_style) | 21772 | && XM_DRAG_STYLE_IS_DYNAMIC (x_dnd_last_motif_style) |
| 21381 | && !x_dnd_disable_motif_drag | 21773 | && !x_dnd_disable_motif_drag |
| @@ -21406,8 +21798,6 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 21406 | x_dnd_waiting_for_finish = false; | 21798 | x_dnd_waiting_for_finish = false; |
| 21407 | target = None; | 21799 | target = None; |
| 21408 | } | 21800 | } |
| 21409 | |||
| 21410 | x_dnd_last_seen_toplevel = toplevel; | ||
| 21411 | } | 21801 | } |
| 21412 | 21802 | ||
| 21413 | if (target != x_dnd_last_seen_window) | 21803 | if (target != x_dnd_last_seen_window) |
| @@ -21415,7 +21805,8 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 21415 | if (x_dnd_last_seen_window != None | 21805 | if (x_dnd_last_seen_window != None |
| 21416 | && x_dnd_last_protocol_version != -1 | 21806 | && x_dnd_last_protocol_version != -1 |
| 21417 | && x_dnd_last_seen_window != FRAME_OUTER_WINDOW (x_dnd_frame)) | 21807 | && x_dnd_last_seen_window != FRAME_OUTER_WINDOW (x_dnd_frame)) |
| 21418 | x_dnd_send_leave (x_dnd_frame, x_dnd_last_seen_window); | 21808 | x_dnd_send_leave (x_dnd_frame, x_dnd_last_seen_window, |
| 21809 | x_dnd_last_seen_toplevel); | ||
| 21419 | else if (x_dnd_last_seen_window != None | 21810 | else if (x_dnd_last_seen_window != None |
| 21420 | && XM_DRAG_STYLE_IS_DYNAMIC (x_dnd_last_motif_style) | 21811 | && XM_DRAG_STYLE_IS_DYNAMIC (x_dnd_last_motif_style) |
| 21421 | && !x_dnd_disable_motif_drag | 21812 | && !x_dnd_disable_motif_drag |
| @@ -21460,6 +21851,7 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 21460 | } | 21851 | } |
| 21461 | 21852 | ||
| 21462 | x_dnd_action = None; | 21853 | x_dnd_action = None; |
| 21854 | x_dnd_last_seen_toplevel = toplevel; | ||
| 21463 | x_dnd_last_seen_window = target; | 21855 | x_dnd_last_seen_window = target; |
| 21464 | x_dnd_last_protocol_version = target_proto; | 21856 | x_dnd_last_protocol_version = target_proto; |
| 21465 | x_dnd_last_motif_style = motif_style; | 21857 | x_dnd_last_motif_style = motif_style; |
| @@ -21467,6 +21859,7 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 21467 | 21859 | ||
| 21468 | if (target != None && x_dnd_last_protocol_version != -1) | 21860 | if (target != None && x_dnd_last_protocol_version != -1) |
| 21469 | x_dnd_send_enter (x_dnd_frame, target, | 21861 | x_dnd_send_enter (x_dnd_frame, target, |
| 21862 | x_dnd_last_seen_toplevel, | ||
| 21470 | x_dnd_last_protocol_version); | 21863 | x_dnd_last_protocol_version); |
| 21471 | else if (target != None && XM_DRAG_STYLE_IS_DYNAMIC (x_dnd_last_motif_style) | 21864 | else if (target != None && XM_DRAG_STYLE_IS_DYNAMIC (x_dnd_last_motif_style) |
| 21472 | && !x_dnd_disable_motif_drag) | 21865 | && !x_dnd_disable_motif_drag) |
| @@ -21487,17 +21880,22 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 21487 | target, &emsg); | 21880 | target, &emsg); |
| 21488 | } | 21881 | } |
| 21489 | } | 21882 | } |
| 21883 | else | ||
| 21884 | x_dnd_last_seen_toplevel = toplevel; | ||
| 21490 | 21885 | ||
| 21491 | if (x_dnd_last_window_is_frame && target != None) | 21886 | if (x_dnd_last_window_is_frame && target != None) |
| 21492 | x_dnd_note_self_position (dpyinfo, target, | 21887 | x_dnd_note_self_position (dpyinfo, target, |
| 21493 | xev->root_x, xev->root_y); | 21888 | lrint (xev->root_x), |
| 21889 | lrint (xev->root_y)); | ||
| 21494 | else if (x_dnd_last_protocol_version != -1 && target != None) | 21890 | else if (x_dnd_last_protocol_version != -1 && target != None) |
| 21495 | { | 21891 | { |
| 21496 | dnd_state = xi_convert_event_state (xev); | 21892 | dnd_state = xi_convert_event_state (xev); |
| 21497 | 21893 | ||
| 21498 | x_dnd_send_position (x_dnd_frame, target, | 21894 | x_dnd_send_position (x_dnd_frame, target, |
| 21895 | x_dnd_last_seen_toplevel, | ||
| 21499 | x_dnd_last_protocol_version, | 21896 | x_dnd_last_protocol_version, |
| 21500 | xev->root_x, xev->root_y, | 21897 | lrint (xev->root_x), |
| 21898 | lrint (xev->root_y), | ||
| 21501 | x_dnd_selection_timestamp, | 21899 | x_dnd_selection_timestamp, |
| 21502 | x_dnd_wanted_action, 0, | 21900 | x_dnd_wanted_action, 0, |
| 21503 | dnd_state); | 21901 | dnd_state); |
| @@ -21540,9 +21938,9 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 21540 | { | 21938 | { |
| 21541 | if (xev->event != FRAME_X_WINDOW (f)) | 21939 | if (xev->event != FRAME_X_WINDOW (f)) |
| 21542 | { | 21940 | { |
| 21543 | XTranslateCoordinates (FRAME_X_DISPLAY (f), | 21941 | x_translate_coordinates (f, lrint (xev->root_x), |
| 21544 | xev->event, FRAME_X_WINDOW (f), | 21942 | lrint (xev->root_y), |
| 21545 | ev.x, ev.y, &ev.x, &ev.y, &dummy); | 21943 | &ev.x, &ev.y); |
| 21546 | ev.window = FRAME_X_WINDOW (f); | 21944 | ev.window = FRAME_X_WINDOW (f); |
| 21547 | } | 21945 | } |
| 21548 | 21946 | ||
| @@ -21648,6 +22046,12 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 21648 | f = mouse_or_wdesc_frame (dpyinfo, xev->event); | 22046 | f = mouse_or_wdesc_frame (dpyinfo, xev->event); |
| 21649 | device = xi_device_from_id (dpyinfo, xev->deviceid); | 22047 | device = xi_device_from_id (dpyinfo, xev->deviceid); |
| 21650 | 22048 | ||
| 22049 | if (f && xev->event == FRAME_X_WINDOW (f)) | ||
| 22050 | /* See the comment above | ||
| 22051 | x_compute_root_window_offset for why this | ||
| 22052 | optimization is performed. */ | ||
| 22053 | xi_compute_root_window_offset (f, xev); | ||
| 22054 | |||
| 21651 | /* Don't track grab status for emulated pointer | 22055 | /* Don't track grab status for emulated pointer |
| 21652 | events, because they are ignored by the regular | 22056 | events, because they are ignored by the regular |
| 21653 | mouse click processing code. */ | 22057 | mouse click processing code. */ |
| @@ -21705,15 +22109,18 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 21705 | #endif | 22109 | #endif |
| 21706 | x_dnd_note_self_wheel (dpyinfo, | 22110 | x_dnd_note_self_wheel (dpyinfo, |
| 21707 | x_dnd_last_seen_window, | 22111 | x_dnd_last_seen_window, |
| 21708 | xev->root_x, xev->root_y, | 22112 | lrint (xev->root_x), |
| 22113 | lrint (xev->root_y), | ||
| 21709 | xev->detail, dnd_state, | 22114 | xev->detail, dnd_state, |
| 21710 | xev->time); | 22115 | xev->time); |
| 21711 | } | 22116 | } |
| 21712 | else | 22117 | else |
| 21713 | x_dnd_send_position (x_dnd_frame, | 22118 | x_dnd_send_position (x_dnd_frame, |
| 21714 | x_dnd_last_seen_window, | 22119 | x_dnd_last_seen_window, |
| 22120 | x_dnd_last_seen_toplevel, | ||
| 21715 | x_dnd_last_protocol_version, | 22121 | x_dnd_last_protocol_version, |
| 21716 | xev->root_x, xev->root_y, | 22122 | lrint (xev->root_x), |
| 22123 | lrint (xev->root_y), | ||
| 21717 | xev->time, x_dnd_wanted_action, | 22124 | xev->time, x_dnd_wanted_action, |
| 21718 | xev->detail, dnd_state); | 22125 | xev->detail, dnd_state); |
| 21719 | 22126 | ||
| @@ -21756,16 +22163,18 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 21756 | { | 22163 | { |
| 21757 | x_dnd_waiting_for_finish = false; | 22164 | x_dnd_waiting_for_finish = false; |
| 21758 | x_dnd_note_self_drop (dpyinfo, x_dnd_last_seen_window, | 22165 | x_dnd_note_self_drop (dpyinfo, x_dnd_last_seen_window, |
| 21759 | xev->root_x, xev->root_y, xev->time); | 22166 | lrint (xev->root_x), |
| 22167 | lrint (xev->root_y), xev->time); | ||
| 21760 | } | 22168 | } |
| 21761 | else if (x_dnd_last_seen_window != None | 22169 | else if (x_dnd_last_seen_window != None |
| 21762 | && x_dnd_last_protocol_version != -1) | 22170 | && x_dnd_last_protocol_version != -1) |
| 21763 | { | 22171 | { |
| 21764 | x_dnd_pending_finish_target = x_dnd_last_seen_window; | 22172 | x_dnd_pending_finish_target = x_dnd_last_seen_toplevel; |
| 21765 | x_dnd_waiting_for_finish_proto = x_dnd_last_protocol_version; | 22173 | x_dnd_waiting_for_finish_proto = x_dnd_last_protocol_version; |
| 21766 | 22174 | ||
| 21767 | x_dnd_waiting_for_finish | 22175 | x_dnd_waiting_for_finish |
| 21768 | = x_dnd_do_drop (x_dnd_last_seen_window, | 22176 | = x_dnd_do_drop (x_dnd_last_seen_window, |
| 22177 | x_dnd_last_seen_toplevel, | ||
| 21769 | x_dnd_last_protocol_version); | 22178 | x_dnd_last_protocol_version); |
| 21770 | x_dnd_finish_display = dpyinfo->display; | 22179 | x_dnd_finish_display = dpyinfo->display; |
| 21771 | } | 22180 | } |
| @@ -21831,12 +22240,14 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 21831 | x_dnd_send_unsupported_drop (dpyinfo, (x_dnd_last_seen_toplevel != None | 22240 | x_dnd_send_unsupported_drop (dpyinfo, (x_dnd_last_seen_toplevel != None |
| 21832 | ? x_dnd_last_seen_toplevel | 22241 | ? x_dnd_last_seen_toplevel |
| 21833 | : x_dnd_last_seen_window), | 22242 | : x_dnd_last_seen_window), |
| 21834 | xev->root_x, xev->root_y, xev->time); | 22243 | lrint (xev->root_x), |
| 22244 | lrint (xev->root_y), xev->time); | ||
| 21835 | } | 22245 | } |
| 21836 | else if (x_dnd_last_seen_toplevel != None) | 22246 | else if (x_dnd_last_seen_toplevel != None) |
| 21837 | x_dnd_send_unsupported_drop (dpyinfo, | 22247 | x_dnd_send_unsupported_drop (dpyinfo, |
| 21838 | x_dnd_last_seen_toplevel, | 22248 | x_dnd_last_seen_toplevel, |
| 21839 | xev->root_x, xev->root_y, | 22249 | lrint (xev->root_x), |
| 22250 | lrint (xev->root_y), | ||
| 21840 | xev->time); | 22251 | xev->time); |
| 21841 | 22252 | ||
| 21842 | x_dnd_last_protocol_version = -1; | 22253 | x_dnd_last_protocol_version = -1; |
| @@ -21972,6 +22383,8 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 21972 | bv.type = xev->evtype == XI_ButtonPress ? ButtonPress : ButtonRelease; | 22383 | bv.type = xev->evtype == XI_ButtonPress ? ButtonPress : ButtonRelease; |
| 21973 | bv.x = lrint (xev->event_x); | 22384 | bv.x = lrint (xev->event_x); |
| 21974 | bv.y = lrint (xev->event_y); | 22385 | bv.y = lrint (xev->event_y); |
| 22386 | bv.x_root = lrint (xev->root_x); | ||
| 22387 | bv.y_root = lrint (xev->root_y); | ||
| 21975 | bv.window = xev->event; | 22388 | bv.window = xev->event; |
| 21976 | bv.state = xi_convert_event_state (xev); | 22389 | bv.state = xi_convert_event_state (xev); |
| 21977 | bv.time = xev->time; | 22390 | bv.time = xev->time; |
| @@ -21980,6 +22393,11 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 21980 | 22393 | ||
| 21981 | f = mouse_or_wdesc_frame (dpyinfo, xev->event); | 22394 | f = mouse_or_wdesc_frame (dpyinfo, xev->event); |
| 21982 | 22395 | ||
| 22396 | if (f && xev->event == FRAME_X_WINDOW (f)) | ||
| 22397 | /* See the comment above x_compute_root_window_offset | ||
| 22398 | for why this optimization is performed. */ | ||
| 22399 | xi_compute_root_window_offset (f, xev); | ||
| 22400 | |||
| 21983 | if (f && xev->evtype == XI_ButtonPress | 22401 | if (f && xev->evtype == XI_ButtonPress |
| 21984 | && !popup_activated () | 22402 | && !popup_activated () |
| 21985 | && !x_window_to_scroll_bar (dpyinfo->display, xev->event, 2) | 22403 | && !x_window_to_scroll_bar (dpyinfo->display, xev->event, 2) |
| @@ -21993,7 +22411,6 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 21993 | 22411 | ||
| 21994 | if (FRAME_PARENT_FRAME (f) || (hf && frame_ancestor_p (f, hf))) | 22412 | if (FRAME_PARENT_FRAME (f) || (hf && frame_ancestor_p (f, hf))) |
| 21995 | { | 22413 | { |
| 21996 | block_input (); | ||
| 21997 | #if defined HAVE_GTK3 || (!defined USE_GTK && !defined USE_X_TOOLKIT) | 22414 | #if defined HAVE_GTK3 || (!defined USE_GTK && !defined USE_X_TOOLKIT) |
| 21998 | if (device) | 22415 | if (device) |
| 21999 | { | 22416 | { |
| @@ -22016,7 +22433,6 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 22016 | #endif | 22433 | #endif |
| 22017 | if (FRAME_PARENT_FRAME (f)) | 22434 | if (FRAME_PARENT_FRAME (f)) |
| 22018 | XRaiseWindow (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f)); | 22435 | XRaiseWindow (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f)); |
| 22019 | unblock_input (); | ||
| 22020 | } | 22436 | } |
| 22021 | } | 22437 | } |
| 22022 | 22438 | ||
| @@ -22033,9 +22449,8 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 22033 | #ifdef USE_GTK | 22449 | #ifdef USE_GTK |
| 22034 | if (!f) | 22450 | if (!f) |
| 22035 | { | 22451 | { |
| 22036 | int real_x = lrint (xev->event_x); | 22452 | int real_x = lrint (xev->root_x); |
| 22037 | int real_y = lrint (xev->event_y); | 22453 | int real_y = lrint (xev->root_y); |
| 22038 | Window child; | ||
| 22039 | 22454 | ||
| 22040 | f = x_any_window_to_frame (dpyinfo, xev->event); | 22455 | f = x_any_window_to_frame (dpyinfo, xev->event); |
| 22041 | 22456 | ||
| @@ -22044,9 +22459,8 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 22044 | if (xev->evtype == XI_ButtonRelease) | 22459 | if (xev->evtype == XI_ButtonRelease) |
| 22045 | { | 22460 | { |
| 22046 | if (FRAME_X_WINDOW (f) != xev->event) | 22461 | if (FRAME_X_WINDOW (f) != xev->event) |
| 22047 | XTranslateCoordinates (dpyinfo->display, xev->event, | 22462 | x_translate_coordinates (f, real_x, real_y, |
| 22048 | FRAME_X_WINDOW (f), real_x, | 22463 | &real_x, &real_y); |
| 22049 | real_y, &real_x, &real_y, &child); | ||
| 22050 | 22464 | ||
| 22051 | if (xev->detail <= 5) | 22465 | if (xev->detail <= 5) |
| 22052 | inev.ie.kind = WHEEL_EVENT; | 22466 | inev.ie.kind = WHEEL_EVENT; |
| @@ -22311,6 +22725,11 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 22311 | 22725 | ||
| 22312 | f = x_any_window_to_frame (dpyinfo, xev->event); | 22726 | f = x_any_window_to_frame (dpyinfo, xev->event); |
| 22313 | 22727 | ||
| 22728 | if (f && xev->event == FRAME_X_WINDOW (f)) | ||
| 22729 | /* See the comment above x_compute_root_window_offset | ||
| 22730 | for why this optimization is performed. */ | ||
| 22731 | xi_compute_root_window_offset (f, xev); | ||
| 22732 | |||
| 22314 | /* GTK handles TAB events in an undesirable manner, so | 22733 | /* GTK handles TAB events in an undesirable manner, so |
| 22315 | keyboard events are always dropped. But as a side | 22734 | keyboard events are always dropped. But as a side |
| 22316 | effect, the user time will no longer be set by GDK, | 22735 | effect, the user time will no longer be set by GDK, |
| @@ -22469,7 +22888,7 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 22469 | &xkey, (char *) copy_bufptr, | 22888 | &xkey, (char *) copy_bufptr, |
| 22470 | copy_bufsiz, &keysym, | 22889 | copy_bufsiz, &keysym, |
| 22471 | &status_return); | 22890 | &status_return); |
| 22472 | coding = Qnil; | 22891 | coding = FRAME_X_XIM_CODING (f); |
| 22473 | 22892 | ||
| 22474 | if (status_return == XBufferOverflow) | 22893 | if (status_return == XBufferOverflow) |
| 22475 | { | 22894 | { |
| @@ -22835,24 +23254,36 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 22835 | any_changed = true; | 23254 | any_changed = true; |
| 22836 | } | 23255 | } |
| 22837 | 23256 | ||
| 22838 | x_catch_errors (dpyinfo->display); | 23257 | /* Under unknown circumstances, multiple |
| 22839 | info = XIQueryDevice (dpyinfo->display, hev->info[i].deviceid, | 23258 | XIDeviceEnabled events are sent at once, |
| 22840 | &ndevices); | 23259 | causing the device to be duplicated. Check |
| 22841 | x_uncatch_errors (); | 23260 | that the device doesn't exist before adding |
| 23261 | it. */ | ||
| 22842 | 23262 | ||
| 22843 | if (info && info->enabled) | 23263 | if (!xi_device_from_id (dpyinfo, |
| 23264 | hev->info[i].deviceid)) | ||
| 22844 | { | 23265 | { |
| 22845 | dpyinfo->devices | 23266 | x_catch_errors (dpyinfo->display); |
| 22846 | = xrealloc (dpyinfo->devices, (sizeof *dpyinfo->devices | 23267 | info = XIQueryDevice (dpyinfo->display, |
| 22847 | * ++dpyinfo->num_devices)); | 23268 | hev->info[i].deviceid, |
| 22848 | memset (dpyinfo->devices + dpyinfo->num_devices - 1, | 23269 | &ndevices); |
| 22849 | 0, sizeof *dpyinfo->devices); | 23270 | x_uncatch_errors (); |
| 22850 | device = &dpyinfo->devices[dpyinfo->num_devices - 1]; | ||
| 22851 | xi_populate_device_from_info (device, info); | ||
| 22852 | } | ||
| 22853 | 23271 | ||
| 22854 | if (info) | 23272 | if (info && info->enabled) |
| 22855 | XIFreeDeviceInfo (info); | 23273 | { |
| 23274 | dpyinfo->devices | ||
| 23275 | = xrealloc (dpyinfo->devices, | ||
| 23276 | (sizeof *dpyinfo->devices | ||
| 23277 | * ++dpyinfo->num_devices)); | ||
| 23278 | memset (dpyinfo->devices + dpyinfo->num_devices - 1, | ||
| 23279 | 0, sizeof *dpyinfo->devices); | ||
| 23280 | device = &dpyinfo->devices[dpyinfo->num_devices - 1]; | ||
| 23281 | xi_populate_device_from_info (device, info); | ||
| 23282 | } | ||
| 23283 | |||
| 23284 | if (info) | ||
| 23285 | XIFreeDeviceInfo (info); | ||
| 23286 | } | ||
| 22856 | } | 23287 | } |
| 22857 | else if (hev->info[i].flags & XIDeviceDisabled) | 23288 | else if (hev->info[i].flags & XIDeviceDisabled) |
| 22858 | disabled[n_disabled++] = hev->info[i].deviceid; | 23289 | disabled[n_disabled++] = hev->info[i].deviceid; |
| @@ -22938,6 +23369,11 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 22938 | 23369 | ||
| 22939 | f = x_window_to_frame (dpyinfo, xev->event); | 23370 | f = x_window_to_frame (dpyinfo, xev->event); |
| 22940 | 23371 | ||
| 23372 | if (f) | ||
| 23373 | /* See the comment above x_compute_root_window_offset | ||
| 23374 | for why this optimization is performed. */ | ||
| 23375 | xi_compute_root_window_offset (f, xev); | ||
| 23376 | |||
| 22941 | #ifdef HAVE_GTK3 | 23377 | #ifdef HAVE_GTK3 |
| 22942 | menu_bar_p = (f && FRAME_X_OUTPUT (f)->menubar_widget | 23378 | menu_bar_p = (f && FRAME_X_OUTPUT (f)->menubar_widget |
| 22943 | && xg_event_is_for_menubar (f, event)); | 23379 | && xg_event_is_for_menubar (f, event)); |
| @@ -23126,8 +23562,12 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 23126 | #endif | 23562 | #endif |
| 23127 | 23563 | ||
| 23128 | any = x_window_to_frame (dpyinfo, pev->event); | 23564 | any = x_window_to_frame (dpyinfo, pev->event); |
| 23565 | |||
| 23129 | if (any) | 23566 | if (any) |
| 23130 | { | 23567 | { |
| 23568 | if (pev->event == FRAME_X_WINDOW (any)) | ||
| 23569 | xi_compute_root_window_offset_pinch (any, pev); | ||
| 23570 | |||
| 23131 | inev.ie.kind = PINCH_EVENT; | 23571 | inev.ie.kind = PINCH_EVENT; |
| 23132 | inev.ie.modifiers = x_x_to_emacs_modifiers (FRAME_DISPLAY_INFO (any), | 23572 | inev.ie.modifiers = x_x_to_emacs_modifiers (FRAME_DISPLAY_INFO (any), |
| 23133 | pev->mods.effective); | 23573 | pev->mods.effective); |
| @@ -23521,7 +23961,6 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 23521 | #endif | 23961 | #endif |
| 23522 | OTHER: | 23962 | OTHER: |
| 23523 | #ifdef USE_X_TOOLKIT | 23963 | #ifdef USE_X_TOOLKIT |
| 23524 | block_input (); | ||
| 23525 | if (*finish != X_EVENT_DROP) | 23964 | if (*finish != X_EVENT_DROP) |
| 23526 | { | 23965 | { |
| 23527 | /* Ignore some obviously bogus ConfigureNotify events that | 23966 | /* Ignore some obviously bogus ConfigureNotify events that |
| @@ -23538,7 +23977,6 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 23538 | #endif | 23977 | #endif |
| 23539 | } | 23978 | } |
| 23540 | } | 23979 | } |
| 23541 | unblock_input (); | ||
| 23542 | #endif /* USE_X_TOOLKIT */ | 23980 | #endif /* USE_X_TOOLKIT */ |
| 23543 | #if defined USE_GTK && !defined HAVE_GTK3 && defined HAVE_XINPUT2 | 23981 | #if defined USE_GTK && !defined HAVE_GTK3 && defined HAVE_XINPUT2 |
| 23544 | if (*finish != X_EVENT_DROP && copy) | 23982 | if (*finish != X_EVENT_DROP && copy) |
| @@ -23560,12 +23998,6 @@ handle_one_xevent (struct x_display_info *dpyinfo, | |||
| 23560 | count++; | 23998 | count++; |
| 23561 | } | 23999 | } |
| 23562 | 24000 | ||
| 23563 | #ifdef USE_TOOLKIT_SCROLL_BARS | ||
| 23564 | if (event->xany.type == ClientMessage | ||
| 23565 | && inev.ie.kind == SCROLL_BAR_CLICK_EVENT) | ||
| 23566 | x_unprotect_window_for_callback (dpyinfo); | ||
| 23567 | #endif | ||
| 23568 | |||
| 23569 | if (do_help | 24001 | if (do_help |
| 23570 | && !(hold_quit && hold_quit->kind != NO_EVENT)) | 24002 | && !(hold_quit && hold_quit->kind != NO_EVENT)) |
| 23571 | { | 24003 | { |
| @@ -24705,7 +25137,8 @@ x_connection_closed (Display *dpy, const char *error_message, bool ioerror) | |||
| 24705 | if (x_dnd_last_seen_window != None | 25137 | if (x_dnd_last_seen_window != None |
| 24706 | && x_dnd_last_protocol_version != -1) | 25138 | && x_dnd_last_protocol_version != -1) |
| 24707 | x_dnd_send_leave (x_dnd_frame, | 25139 | x_dnd_send_leave (x_dnd_frame, |
| 24708 | x_dnd_last_seen_window); | 25140 | x_dnd_last_seen_window, |
| 25141 | x_dnd_last_seen_toplevel); | ||
| 24709 | else if (x_dnd_last_seen_window != None | 25142 | else if (x_dnd_last_seen_window != None |
| 24710 | && !XM_DRAG_STYLE_IS_DROP_ONLY (x_dnd_last_motif_style) | 25143 | && !XM_DRAG_STYLE_IS_DROP_ONLY (x_dnd_last_motif_style) |
| 24711 | && x_dnd_last_motif_style != XM_DRAG_STYLE_NONE | 25144 | && x_dnd_last_motif_style != XM_DRAG_STYLE_NONE |
| @@ -25115,9 +25548,10 @@ xim_destroy_callback (XIM xim, XPointer client_data, XPointer call_data) | |||
| 25115 | static void | 25548 | static void |
| 25116 | xim_open_dpy (struct x_display_info *dpyinfo, char *resource_name) | 25549 | xim_open_dpy (struct x_display_info *dpyinfo, char *resource_name) |
| 25117 | { | 25550 | { |
| 25551 | #ifdef HAVE_XIM | ||
| 25118 | XIM xim; | 25552 | XIM xim; |
| 25553 | const char *locale; | ||
| 25119 | 25554 | ||
| 25120 | #ifdef HAVE_XIM | ||
| 25121 | if (use_xim) | 25555 | if (use_xim) |
| 25122 | { | 25556 | { |
| 25123 | if (dpyinfo->xim) | 25557 | if (dpyinfo->xim) |
| @@ -25140,6 +25574,14 @@ xim_open_dpy (struct x_display_info *dpyinfo, char *resource_name) | |||
| 25140 | destroy.client_data = (XPointer)dpyinfo; | 25574 | destroy.client_data = (XPointer)dpyinfo; |
| 25141 | XSetIMValues (xim, XNDestroyCallback, &destroy, NULL); | 25575 | XSetIMValues (xim, XNDestroyCallback, &destroy, NULL); |
| 25142 | #endif | 25576 | #endif |
| 25577 | |||
| 25578 | locale = XLocaleOfIM (xim); | ||
| 25579 | |||
| 25580 | /* Now try to determine the coding system that should be | ||
| 25581 | used. locale is in Host Portable Character Encoding, and | ||
| 25582 | as such can be passed to build_string as is. */ | ||
| 25583 | dpyinfo->xim_coding = safe_call1 (Vx_input_coding_function, | ||
| 25584 | build_string (locale)); | ||
| 25143 | } | 25585 | } |
| 25144 | } | 25586 | } |
| 25145 | 25587 | ||
| @@ -26469,8 +26911,7 @@ x_ewmh_activate_frame (struct frame *f) | |||
| 26469 | 26911 | ||
| 26470 | dpyinfo = FRAME_DISPLAY_INFO (f); | 26912 | dpyinfo = FRAME_DISPLAY_INFO (f); |
| 26471 | 26913 | ||
| 26472 | if (FRAME_VISIBLE_P (f) | 26914 | if (FRAME_VISIBLE_P (f)) |
| 26473 | && x_wm_supports (f, dpyinfo->Xatom_net_active_window)) | ||
| 26474 | { | 26915 | { |
| 26475 | /* See the documentation at | 26916 | /* See the documentation at |
| 26476 | https://specifications.freedesktop.org/wm-spec/wm-spec-latest.html | 26917 | https://specifications.freedesktop.org/wm-spec/wm-spec-latest.html |
| @@ -26530,14 +26971,23 @@ x_focus_frame (struct frame *f, bool noactivate) | |||
| 26530 | xembed_request_focus (f); | 26971 | xembed_request_focus (f); |
| 26531 | else | 26972 | else |
| 26532 | { | 26973 | { |
| 26974 | if (!noactivate | ||
| 26975 | && x_wm_supports (f, dpyinfo->Xatom_net_active_window)) | ||
| 26976 | { | ||
| 26977 | /* When window manager activation is possible, use it | ||
| 26978 | instead. The window manager is expected to perform any | ||
| 26979 | necessary actions such as raising the frame, moving it to | ||
| 26980 | the current workspace, and mapping it, etc, before moving | ||
| 26981 | input focus to the frame. */ | ||
| 26982 | x_ewmh_activate_frame (f); | ||
| 26983 | return; | ||
| 26984 | } | ||
| 26985 | |||
| 26533 | /* Ignore any BadMatch error this request might result in. */ | 26986 | /* Ignore any BadMatch error this request might result in. */ |
| 26534 | x_ignore_errors_for_next_request (dpyinfo); | 26987 | x_ignore_errors_for_next_request (dpyinfo); |
| 26535 | XSetInputFocus (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), | 26988 | XSetInputFocus (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), |
| 26536 | RevertToParent, CurrentTime); | 26989 | RevertToParent, CurrentTime); |
| 26537 | x_stop_ignoring_errors (dpyinfo); | 26990 | x_stop_ignoring_errors (dpyinfo); |
| 26538 | |||
| 26539 | if (!noactivate) | ||
| 26540 | x_ewmh_activate_frame (f); | ||
| 26541 | } | 26991 | } |
| 26542 | } | 26992 | } |
| 26543 | 26993 | ||
| @@ -27169,6 +27619,13 @@ x_free_frame_resources (struct frame *f) | |||
| 27169 | #if defined HAVE_XSYNCTRIGGERFENCE && !defined USE_GTK && defined HAVE_CLOCK_GETTIME | 27619 | #if defined HAVE_XSYNCTRIGGERFENCE && !defined USE_GTK && defined HAVE_CLOCK_GETTIME |
| 27170 | x_sync_free_fences (f); | 27620 | x_sync_free_fences (f); |
| 27171 | #endif | 27621 | #endif |
| 27622 | |||
| 27623 | #ifdef USE_TOOLKIT_SCROLL_BARS | ||
| 27624 | /* Since the frame was destroyed, we can no longer guarantee | ||
| 27625 | that scroll bar events will be received. Clear | ||
| 27626 | protected_windows. */ | ||
| 27627 | dpyinfo->n_protected_windows = 0; | ||
| 27628 | #endif | ||
| 27172 | } | 27629 | } |
| 27173 | 27630 | ||
| 27174 | #ifdef HAVE_GTK3 | 27631 | #ifdef HAVE_GTK3 |
| @@ -27194,6 +27651,16 @@ x_free_frame_resources (struct frame *f) | |||
| 27194 | if (f == hlinfo->mouse_face_mouse_frame) | 27651 | if (f == hlinfo->mouse_face_mouse_frame) |
| 27195 | reset_mouse_highlight (hlinfo); | 27652 | reset_mouse_highlight (hlinfo); |
| 27196 | 27653 | ||
| 27654 | #ifdef HAVE_XINPUT2 | ||
| 27655 | /* Consider a frame being unfocused with no following FocusIn event | ||
| 27656 | while an older focus from another seat exists. The client | ||
| 27657 | pointer should then revert to the other seat, so handle potential | ||
| 27658 | focus changes. */ | ||
| 27659 | |||
| 27660 | if (dpyinfo->supports_xi2) | ||
| 27661 | xi_handle_focus_change (dpyinfo); | ||
| 27662 | #endif | ||
| 27663 | |||
| 27197 | unblock_input (); | 27664 | unblock_input (); |
| 27198 | } | 27665 | } |
| 27199 | 27666 | ||
| @@ -27420,6 +27887,31 @@ x_get_atom_name (struct x_display_info *dpyinfo, Atom atom, | |||
| 27420 | return value; | 27887 | return value; |
| 27421 | } | 27888 | } |
| 27422 | 27889 | ||
| 27890 | #ifndef USE_GTK | ||
| 27891 | |||
| 27892 | /* Set up XEmbed for F, and change its save set to handle the parent | ||
| 27893 | being destroyed. */ | ||
| 27894 | |||
| 27895 | bool | ||
| 27896 | x_embed_frame (struct x_display_info *dpyinfo, struct frame *f) | ||
| 27897 | { | ||
| 27898 | bool rc; | ||
| 27899 | |||
| 27900 | x_catch_errors (dpyinfo->display); | ||
| 27901 | /* Catch errors; the target window might no longer exist. */ | ||
| 27902 | XReparentWindow (dpyinfo->display, FRAME_OUTER_WINDOW (f), | ||
| 27903 | FRAME_OUTPUT_DATA (f)->parent_desc, 0, 0); | ||
| 27904 | rc = x_had_errors_p (dpyinfo->display); | ||
| 27905 | x_uncatch_errors_after_check (); | ||
| 27906 | |||
| 27907 | if (rc) | ||
| 27908 | return false; | ||
| 27909 | |||
| 27910 | return true; | ||
| 27911 | } | ||
| 27912 | |||
| 27913 | #endif | ||
| 27914 | |||
| 27423 | 27915 | ||
| 27424 | /* Setting window manager hints. */ | 27916 | /* Setting window manager hints. */ |
| 27425 | 27917 | ||
| @@ -27452,8 +27944,11 @@ x_wm_set_size_hint (struct frame *f, long flags, bool user_position) | |||
| 27452 | eassert (XtIsWMShell (f->output_data.x->widget)); | 27944 | eassert (XtIsWMShell (f->output_data.x->widget)); |
| 27453 | shell = (WMShellWidget) f->output_data.x->widget; | 27945 | shell = (WMShellWidget) f->output_data.x->widget; |
| 27454 | 27946 | ||
| 27455 | shell->wm.size_hints.flags &= ~(PPosition | USPosition); | 27947 | if (flags) |
| 27456 | shell->wm.size_hints.flags |= flags & (PPosition | USPosition); | 27948 | { |
| 27949 | shell->wm.size_hints.flags &= ~(PPosition | USPosition); | ||
| 27950 | shell->wm.size_hints.flags |= flags & (PPosition | USPosition); | ||
| 27951 | } | ||
| 27457 | 27952 | ||
| 27458 | if (user_position) | 27953 | if (user_position) |
| 27459 | { | 27954 | { |
| @@ -27885,7 +28380,7 @@ xi_select_hierarchy_events (struct x_display_info *dpyinfo) | |||
| 27885 | extension. | 28380 | extension. |
| 27886 | 28381 | ||
| 27887 | Value is 0 if GTK was not built with the input extension, or if it | 28382 | Value is 0 if GTK was not built with the input extension, or if it |
| 27888 | was explictly disabled, 1 if GTK enabled the input extension and | 28383 | was explicitly disabled, 1 if GTK enabled the input extension and |
| 27889 | the version was successfully determined, and 2 if that information | 28384 | the version was successfully determined, and 2 if that information |
| 27890 | could not be determined. */ | 28385 | could not be determined. */ |
| 27891 | 28386 | ||
| @@ -28599,10 +29094,13 @@ x_term_init (Lisp_Object display_name, char *xrm_option, char *resource_name) | |||
| 28599 | (RRScreenChangeNotifyMask | 29094 | (RRScreenChangeNotifyMask |
| 28600 | | RRCrtcChangeNotifyMask | 29095 | | RRCrtcChangeNotifyMask |
| 28601 | | RROutputChangeNotifyMask | 29096 | | RROutputChangeNotifyMask |
| 28602 | /* Emacs doesn't actually need this, but GTK | 29097 | #ifdef USE_GTK |
| 28603 | selects for it when the display is | 29098 | /* Emacs doesn't actually need this, but |
| 29099 | GTK selects for it when the display is | ||
| 28604 | initialized. */ | 29100 | initialized. */ |
| 28605 | | RROutputPropertyNotifyMask)); | 29101 | | RROutputPropertyNotifyMask |
| 29102 | #endif | ||
| 29103 | )); | ||
| 28606 | 29104 | ||
| 28607 | dpyinfo->last_monitor_attributes_list | 29105 | dpyinfo->last_monitor_attributes_list |
| 28608 | = Fx_display_monitor_attributes_list (term); | 29106 | = Fx_display_monitor_attributes_list (term); |
| @@ -29414,7 +29912,7 @@ mark_xterm (void) | |||
| 29414 | } | 29912 | } |
| 29415 | 29913 | ||
| 29416 | #if defined HAVE_XINPUT2 || defined USE_TOOLKIT_SCROLL_BARS \ | 29914 | #if defined HAVE_XINPUT2 || defined USE_TOOLKIT_SCROLL_BARS \ |
| 29417 | || defined HAVE_XRANDR || defined USE_GTK | 29915 | || defined HAVE_XRANDR || defined USE_GTK || defined HAVE_X_I18N |
| 29418 | for (dpyinfo = x_display_list; dpyinfo; dpyinfo = dpyinfo->next) | 29916 | for (dpyinfo = x_display_list; dpyinfo; dpyinfo = dpyinfo->next) |
| 29419 | { | 29917 | { |
| 29420 | #ifdef HAVE_XINPUT2 | 29918 | #ifdef HAVE_XINPUT2 |
| @@ -29428,6 +29926,9 @@ mark_xterm (void) | |||
| 29428 | #if defined HAVE_XRANDR || defined USE_GTK | 29926 | #if defined HAVE_XRANDR || defined USE_GTK |
| 29429 | mark_object (dpyinfo->last_monitor_attributes_list); | 29927 | mark_object (dpyinfo->last_monitor_attributes_list); |
| 29430 | #endif | 29928 | #endif |
| 29929 | #if defined HAVE_X_I18N | ||
| 29930 | mark_object (dpyinfo->xim_coding); | ||
| 29931 | #endif | ||
| 29431 | } | 29932 | } |
| 29432 | #endif | 29933 | #endif |
| 29433 | } | 29934 | } |
| @@ -29637,6 +30138,9 @@ syms_of_xterm (void) | |||
| 29637 | x_dnd_unsupported_drop_data = Qnil; | 30138 | x_dnd_unsupported_drop_data = Qnil; |
| 29638 | staticpro (&x_dnd_unsupported_drop_data); | 30139 | staticpro (&x_dnd_unsupported_drop_data); |
| 29639 | 30140 | ||
| 30141 | /* Used by x_cr_export_frames. */ | ||
| 30142 | DEFSYM (Qconcat, "concat"); | ||
| 30143 | |||
| 29640 | DEFSYM (Qvendor_specific_keysyms, "vendor-specific-keysyms"); | 30144 | DEFSYM (Qvendor_specific_keysyms, "vendor-specific-keysyms"); |
| 29641 | DEFSYM (Qlatin_1, "latin-1"); | 30145 | DEFSYM (Qlatin_1, "latin-1"); |
| 29642 | DEFSYM (Qnow, "now"); | 30146 | DEFSYM (Qnow, "now"); |
| @@ -29953,4 +30457,18 @@ on the same display. | |||
| 29953 | In addition, when this variable is a list, only preserve the | 30457 | In addition, when this variable is a list, only preserve the |
| 29954 | selections whose names are contained within. */); | 30458 | selections whose names are contained within. */); |
| 29955 | Vx_auto_preserve_selections = list2 (QCLIPBOARD, QPRIMARY); | 30459 | Vx_auto_preserve_selections = list2 (QCLIPBOARD, QPRIMARY); |
| 30460 | |||
| 30461 | DEFVAR_LISP ("x-input-coding-system", Vx_input_coding_system, | ||
| 30462 | doc: /* Coding system used for input from X input methods. | ||
| 30463 | If a symbol and non-nil, this is the coding system that will be used | ||
| 30464 | to decode input from X input methods. It does not affect input from | ||
| 30465 | GTK native input methods enabled through `x-gtk-use-native-input'. */); | ||
| 30466 | Vx_input_coding_system = Qnil; | ||
| 30467 | |||
| 30468 | DEFVAR_LISP ("x-input-coding-function", Vx_input_coding_function, | ||
| 30469 | doc: /* Function used to determine the coding system used by input methods. | ||
| 30470 | It should accept a single argument, a string describing the locale of | ||
| 30471 | the input method, and return a coding system that can decode keyboard | ||
| 30472 | input generated by said input method. */); | ||
| 30473 | Vx_input_coding_function = Qnil; | ||
| 29956 | } | 30474 | } |
diff --git a/src/xterm.h b/src/xterm.h index a0ae3a330a9..b68a234faa5 100644 --- a/src/xterm.h +++ b/src/xterm.h | |||
| @@ -580,6 +580,9 @@ struct x_display_info | |||
| 580 | XIMStyles *xim_styles; | 580 | XIMStyles *xim_styles; |
| 581 | struct xim_inst_t *xim_callback_data; | 581 | struct xim_inst_t *xim_callback_data; |
| 582 | XIMStyle preferred_xim_style; | 582 | XIMStyle preferred_xim_style; |
| 583 | |||
| 584 | /* The named coding system to use for this input method. */ | ||
| 585 | Lisp_Object xim_coding; | ||
| 583 | #endif | 586 | #endif |
| 584 | 587 | ||
| 585 | /* A cache mapping color names to RGB values. */ | 588 | /* A cache mapping color names to RGB values. */ |
| @@ -656,7 +659,8 @@ struct x_display_info | |||
| 656 | Xatom_net_wm_sync_request, Xatom_net_wm_sync_request_counter, | 659 | Xatom_net_wm_sync_request, Xatom_net_wm_sync_request_counter, |
| 657 | Xatom_net_wm_sync_fences, Xatom_net_wm_frame_drawn, Xatom_net_wm_frame_timings, | 660 | Xatom_net_wm_sync_fences, Xatom_net_wm_frame_drawn, Xatom_net_wm_frame_timings, |
| 658 | Xatom_net_wm_user_time, Xatom_net_wm_user_time_window, | 661 | Xatom_net_wm_user_time, Xatom_net_wm_user_time_window, |
| 659 | Xatom_net_client_list_stacking, Xatom_net_wm_pid; | 662 | Xatom_net_client_list_stacking, Xatom_net_wm_pid, |
| 663 | Xatom_net_wm_bypass_compositor; | ||
| 660 | 664 | ||
| 661 | /* XSettings atoms and windows. */ | 665 | /* XSettings atoms and windows. */ |
| 662 | Atom Xatom_xsettings_sel, Xatom_xsettings_prop, Xatom_xsettings_mgr; | 666 | Atom Xatom_xsettings_sel, Xatom_xsettings_prop, Xatom_xsettings_mgr; |
| @@ -1195,6 +1199,15 @@ struct x_output | |||
| 1195 | XIEventMask *xi_masks; | 1199 | XIEventMask *xi_masks; |
| 1196 | int num_xi_masks; | 1200 | int num_xi_masks; |
| 1197 | #endif | 1201 | #endif |
| 1202 | |||
| 1203 | /* Whether or not we are certain we know the offset from the root | ||
| 1204 | window to this frame. */ | ||
| 1205 | bool window_offset_certain_p; | ||
| 1206 | |||
| 1207 | /* The offset of the edit window from the root window. This is | ||
| 1208 | strictly an optimization to avoid extraneous synchronizing in | ||
| 1209 | some cases. */ | ||
| 1210 | int root_x, root_y; | ||
| 1198 | }; | 1211 | }; |
| 1199 | 1212 | ||
| 1200 | enum | 1213 | enum |
| @@ -1209,7 +1222,6 @@ enum | |||
| 1209 | FOCUS_EXPLICIT = 2 | 1222 | FOCUS_EXPLICIT = 2 |
| 1210 | }; | 1223 | }; |
| 1211 | 1224 | ||
| 1212 | |||
| 1213 | /* Return the X output data for frame F. */ | 1225 | /* Return the X output data for frame F. */ |
| 1214 | #define FRAME_X_OUTPUT(f) ((f)->output_data.x) | 1226 | #define FRAME_X_OUTPUT(f) ((f)->output_data.x) |
| 1215 | #define FRAME_OUTPUT_DATA(f) FRAME_X_OUTPUT (f) | 1227 | #define FRAME_OUTPUT_DATA(f) FRAME_X_OUTPUT (f) |
| @@ -1339,6 +1351,12 @@ extern void x_mark_frame_dirty (struct frame *f); | |||
| 1339 | #define FRAME_X_XIM_STYLES(f) (FRAME_DISPLAY_INFO (f)->xim_styles) | 1351 | #define FRAME_X_XIM_STYLES(f) (FRAME_DISPLAY_INFO (f)->xim_styles) |
| 1340 | #define FRAME_XIC_STYLE(f) ((f)->output_data.x->xic_style) | 1352 | #define FRAME_XIC_STYLE(f) ((f)->output_data.x->xic_style) |
| 1341 | #define FRAME_XIC_FONTSET(f) ((f)->output_data.x->xic_xfs) | 1353 | #define FRAME_XIC_FONTSET(f) ((f)->output_data.x->xic_xfs) |
| 1354 | #define FRAME_X_XIM_CODING(f) \ | ||
| 1355 | (SYMBOLP (Vx_input_coding_system) \ | ||
| 1356 | ? Vx_input_coding_system \ | ||
| 1357 | : (!NILP (FRAME_DISPLAY_INFO (f)->xim_coding) \ | ||
| 1358 | ? FRAME_DISPLAY_INFO(f)->xim_coding \ | ||
| 1359 | : Vlocale_coding_system)) | ||
| 1342 | 1360 | ||
| 1343 | /* X-specific scroll bar stuff. */ | 1361 | /* X-specific scroll bar stuff. */ |
| 1344 | 1362 | ||
| @@ -1588,6 +1606,7 @@ extern void x_wm_set_size_hint (struct frame *, long, bool); | |||
| 1588 | && defined HAVE_CLOCK_GETTIME | 1606 | && defined HAVE_CLOCK_GETTIME |
| 1589 | extern void x_sync_init_fences (struct frame *); | 1607 | extern void x_sync_init_fences (struct frame *); |
| 1590 | #endif | 1608 | #endif |
| 1609 | extern bool x_embed_frame (struct x_display_info *, struct frame *); | ||
| 1591 | 1610 | ||
| 1592 | extern void x_delete_terminal (struct terminal *); | 1611 | extern void x_delete_terminal (struct terminal *); |
| 1593 | extern Cursor x_create_font_cursor (struct x_display_info *, int); | 1612 | extern Cursor x_create_font_cursor (struct x_display_info *, int); |
| @@ -1827,7 +1846,7 @@ extern void mark_xterm (void); | |||
| 1827 | 1846 | ||
| 1828 | /* Is the frame embedded into another application? */ | 1847 | /* Is the frame embedded into another application? */ |
| 1829 | 1848 | ||
| 1830 | #define FRAME_X_EMBEDDED_P(f) (FRAME_X_OUTPUT(f)->explicit_parent != 0) | 1849 | #define FRAME_X_EMBEDDED_P(f) (FRAME_X_OUTPUT (f)->explicit_parent != 0) |
| 1831 | 1850 | ||
| 1832 | #define STORE_NATIVE_RECT(nr,rx,ry,rwidth,rheight) \ | 1851 | #define STORE_NATIVE_RECT(nr,rx,ry,rwidth,rheight) \ |
| 1833 | ((nr).x = (rx), \ | 1852 | ((nr).x = (rx), \ |