aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorYuan Fu2022-10-05 14:22:03 -0700
committerYuan Fu2022-10-05 14:22:03 -0700
commit7ebbd4efc3d45403cf845d35c36c21756baeeba8 (patch)
treef53223ce7dbd64c079aced6e1a77964d1a8eaa3f /src
parentcb183f6467401fb5ed2b7fc98ca75be9d943cbe3 (diff)
parent95efafb72664049f8ac825047df3645656cf76f4 (diff)
downloademacs-7ebbd4efc3d45403cf845d35c36c21756baeeba8.tar.gz
emacs-7ebbd4efc3d45403cf845d35c36c21756baeeba8.zip
Merge branch 'master' into feature/tree-sitter
Diffstat (limited to 'src')
-rw-r--r--src/alloc.c2
-rw-r--r--src/bytecode.c4
-rw-r--r--src/character.c12
-rw-r--r--src/coding.c6
-rw-r--r--src/comp.c90
-rw-r--r--src/composite.c50
-rw-r--r--src/composite.h1
-rw-r--r--src/conf_post.h6
-rw-r--r--src/data.c1
-rw-r--r--src/dbusbind.c4
-rw-r--r--src/dispnew.c21
-rw-r--r--src/doc.c17
-rw-r--r--src/dynlib.h1
-rw-r--r--src/editfns.c9
-rw-r--r--src/emacs-module.c1
-rw-r--r--src/emacs-module.h.in3
-rw-r--r--src/emacs.c22
-rw-r--r--src/eval.c65
-rw-r--r--src/fileio.c19
-rw-r--r--src/fns.c128
-rw-r--r--src/font.c594
-rw-r--r--src/font.h2
-rw-r--r--src/fontset.c3
-rw-r--r--src/frame.c2
-rw-r--r--src/ftcrfont.c32
-rw-r--r--src/haiku_font_support.cc282
-rw-r--r--src/haiku_io.c2
-rw-r--r--src/haiku_support.cc53
-rw-r--r--src/haiku_support.h34
-rw-r--r--src/haikufns.c6
-rw-r--r--src/haikufont.c109
-rw-r--r--src/haikuselect.c129
-rw-r--r--src/haikuterm.c29
-rw-r--r--src/haikuterm.h6
-rw-r--r--src/hbfont.c2
-rw-r--r--src/image.c54
-rw-r--r--src/intervals.c4
-rw-r--r--src/keyboard.c89
-rw-r--r--src/lisp.h3
-rw-r--r--src/lread.c75
-rw-r--r--src/macuvs.h1762
-rw-r--r--src/marker.c18
-rw-r--r--src/menu.c4
-rw-r--r--src/msdos.c1
-rw-r--r--src/nsfont.m244
-rw-r--r--src/nsterm.m53
-rw-r--r--src/pgtkfns.c2
-rw-r--r--src/process.c38
-rw-r--r--src/sysdep.c5
-rw-r--r--src/systhread.h2
-rw-r--r--src/term.c40
-rw-r--r--src/termchar.h5
-rw-r--r--src/w32.c11
-rw-r--r--src/w32.h2
-rw-r--r--src/w32fns.c68
-rw-r--r--src/w32image.c2
-rw-r--r--src/w32notify.c12
-rw-r--r--src/widget.c16
-rw-r--r--src/widgetprv.h2
-rw-r--r--src/window.c3
-rw-r--r--src/xdisp.c59
-rw-r--r--src/xfaces.c21
-rw-r--r--src/xfns.c157
-rw-r--r--src/xfont.c34
-rw-r--r--src/xrdb.c104
-rw-r--r--src/xselect.c46
-rw-r--r--src/xsettings.c16
-rw-r--r--src/xsmfns.c4
-rw-r--r--src/xterm.c938
-rw-r--r--src/xterm.h25
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
5388check_pure_size (void) 5388check_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)
1749void 1749void
1750syms_of_bytecode (void) 1750syms_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
181DEFUN ("max-char", Fmax_char, Smax_char, 0, 0, 0, 181DEFUN ("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.
183If UNICODE is non-nil, return the maximum character code defined
184by 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
189DEFUN ("unibyte-char-to-multibyte", Funibyte_char_to_multibyte, 193DEFUN ("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.
12018Also used for decoding keyboard input on X Window system, and for 12018Potentially also used for decoding keyboard input on X Windows, and is
12019encoding standard output and error streams. */); 12019used 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));
182DEF_DLL_FN (gcc_jit_rvalue *, gcc_jit_context_new_cast, 184DEF_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
188DEF_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
185DEF_DLL_FN (gcc_jit_rvalue *, gcc_jit_context_new_comparison, 192DEF_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));
225DEF_DLL_FN (gcc_jit_type *, gcc_jit_type_get_const, (gcc_jit_type *type)); 232DEF_DLL_FN (gcc_jit_type *, gcc_jit_type_get_const, (gcc_jit_type *type));
226DEF_DLL_FN (gcc_jit_type *, gcc_jit_type_get_pointer, (gcc_jit_type *type)); 233DEF_DLL_FN (gcc_jit_type *, gcc_jit_type_get_pointer, (gcc_jit_type *type));
234#ifdef LIBGCCJIT_HAVE_REFLECTION
235DEF_DLL_FN (gcc_jit_type *, gcc_jit_type_is_pointer, (gcc_jit_type *type));
236#endif
227DEF_DLL_FN (void, gcc_jit_block_add_assignment, 237DEF_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
519static f_reloc_t freloc; 541static 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
523typedef struct { 547typedef 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
1103static int 1130static int
1104type_to_cast_index (gcc_jit_type * type) 1131type_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
1113static gcc_jit_rvalue * 1141static gcc_jit_rvalue *
1114emit_coerce (gcc_jit_type *new_type, gcc_jit_rvalue *obj) 1142emit_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
1158static gcc_jit_rvalue * 1220static 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
3321static gcc_jit_function * 3384static gcc_jit_function *
3322define_type_punning (const char *name, 3385define_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
3464static void 3529static void
3465define_CHECK_TYPE (void) 3530define_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.
5611For internal use. */); 5679For 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
5685After compilation, each function definition is updated to the native
5686compiled 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
808void
809composition_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
804static Lisp_Object gstring_work; 851static Lisp_Object gstring_work;
805static Lisp_Object gstring_work_headers; 852static 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);
340extern bool composition_gstring_p (Lisp_Object); 340extern bool composition_gstring_p (Lisp_Object);
341extern int composition_gstring_width (Lisp_Object, ptrdiff_t, ptrdiff_t, 341extern int composition_gstring_width (Lisp_Object, ptrdiff_t, ptrdiff_t,
342 struct font_metrics *); 342 struct font_metrics *);
343extern void composition_gstring_adjust_zero_width (Lisp_Object);
343 344
344extern bool find_automatic_composition (ptrdiff_t, ptrdiff_t, ptrdiff_t, 345extern 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,
6766use `display-graphic-p' or any of the other `display-*-p' 6764use `display-graphic-p' or any of the other `display-*-p'
6767predicates which report frame's specific UI-related capabilities. */); 6765predicates 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.
6771For 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
6817syms_of_display_for_pdumper (void) 6811syms_of_display_for_pdumper (void)
6818{ 6812{
6819 Vinitial_window_system = Qnil; 6813 Vinitial_window_system = Qnil;
6820 Vwindow_system_version = Qnil;
6821} 6814}
diff --git a/src/doc.c b/src/doc.c
index 34b80d03aa9..67a5f845b93 100644
--- a/src/doc.c
+++ b/src/doc.c
@@ -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)
643DEFUN ("text-quoting-style", Ftext_quoting_style, 643DEFUN ("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.
646See variable `text-quoting-style'. */) 646If 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
649terminal with no support for these characters), otherwise return
650`quote'. Any other value is treated as `grave'.
651
652Note that in contrast to the variable `text-quoting-style', this
653function 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
706You should never read the value of this variable directly from a Lisp
707program. Use the function `text-quoting-style' instead, as that will
708compute 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
26typedef void *dynlib_handle_ptr; 25typedef void *dynlib_handle_ptr;
27dynlib_handle_ptr dynlib_open (const char *path); 26dynlib_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
4608This happens when `narrow-to-region', which see, is called from Lisp
4609with 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)
211void 211void
212init_eval_once (void) 212init_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)
270static void 263static void
271restore_stack_limits (Lisp_Object data) 264restore_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)
4247void 4210void
4248syms_of_eval (void) 4211syms_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
4253If Lisp code tries to use more bindings than this amount, an error is
4254signaled.
4255
4256You can safely increase this variable substantially if the default
4257value proves inconveniently small. However, if you increase it too
4258much, Emacs could run out of memory trying to make the stack bigger.
4259Note 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
4263variables. \"PDL\" is short for \"push-down list\", which is an old
4264term 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.
diff --git a/src/fns.c b/src/fns.c
index 7e78bba3a04..22e66d3653d 100644
--- a/src/fns.c
+++ b/src/fns.c
@@ -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
473DEFUN ("string-version-lessp", Fstring_version_lessp, 503DEFUN ("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.
611The result is a list whose elements are the elements of all the arguments. 641The result is a list whose elements are the elements of all the arguments.
612Each argument may be a list, vector or string. 642Each argument may be a list, vector or string.
613The last argument is not copied, just used as the tail of the new list. 643
644All arguments except the last argument are copied. The last argument
645is just used as the tail of the new list.
646
614usage: (append &rest SEQUENCES) */) 647usage: (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.
1412Elements of ALIST that are not conses are also shared. */) 1445Elements 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.
1563If N is greater or equal to the length of LIST, return LIST (or a copy). */) 1597If 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.
1594Otherwise, return LIST after truncating it. */) 1639Otherwise, 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
1849static int
1850check_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
1904static void
1905check_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
1935Lisp_Object otf_list;
1936
1937static Lisp_Object
1938otf_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
1946static OTF *
1947otf_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
1968Lisp_Object
1969font_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
2042static void
2043generate_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
2077Lisp_Object
2078font_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
2086Lisp_Object
2087font_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
2110Lisp_Object
2111font_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
2131static double 1841static 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
4047DEFUN ("font-spec", Ffont_spec, Sfont_spec, 0, MANY, 0, 3757DEFUN ("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
4549static int
4550check_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
4604static void
4605check_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
4635Lisp_Object otf_list;
4636
4637static Lisp_Object
4638otf_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
4646static OTF *
4647otf_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
4668Lisp_Object
4669font_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
4742static void
4743generate_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
4777Lisp_Object
4778font_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
4786Lisp_Object
4787font_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
4810Lisp_Object
4811font_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
4823DEFUN ("font-drive-otf", Ffont_drive_otf, Sfont_drive_otf, 6, 6, 0, 4827DEFUN ("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.
4825OTF-FEATURES specifies which features to apply in this format: 4829OTF-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
4943DEFUN ("open-font", Fopen_font, Sopen_font, 1, 3, 0, 4948DEFUN ("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.
6247These may be set in your init file, like this: 6247These 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
40static struct font_object_cache_bucket *font_object_cache[2048]; 48static struct font_object_cache_bucket *font_object_cache[2048];
41 49
50/* The current global monospace family and style. */
51static char *fixed_family, *fixed_style;
52
53/* The current global variable-width family and style. */
54static char *default_family, *default_style;
55
56/* The sizes of each of those fonts. */
57static float default_size, fixed_size;
58
59/* The locker controlling access to those variables. */
60static 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
47static int language_code_points[MAX_LANGUAGE][3] = 67static 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
74static void be_send_font_settings (void);
75
76/* Looper used to track changes to system-wide font settings. */
77class 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
52static unsigned int 102static unsigned int
53hash_string (const char *name_or_style) 103hash_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
290static void 340static void
291font_style_to_flags (char *st, struct haiku_font_pattern *pattern) 341font_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
889void 943void
890be_font_style_to_flags (char *style, struct haiku_font_pattern *pattern) 944be_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
997static void
998be_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
1111void
1112be_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
1162bool
1163be_lock_font_defaults (void)
1164{
1165 return default_locker.Lock ();
1166}
1167
1168void
1169be_unlock_font_defaults (void)
1170{
1171 return default_locker.Unlock ();
1172}
1173
1174const char *
1175be_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
1195int
1196be_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
5507status_t
5508be_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
5550void
5551be_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
120struct haiku_clipboard_changed_event 121struct haiku_clipboard_changed_event
@@ -442,6 +443,27 @@ struct haiku_menu_bar_state_event
442 void *window; 443 void *window;
443}; 444};
444 445
446enum haiku_what_font
447 {
448 FIXED_FAMILY,
449 FIXED_STYLE,
450 DEFAULT_FAMILY,
451 DEFAULT_STYLE,
452 };
453
454struct 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
445struct haiku_session_manager_reply 467struct 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);
697extern bool be_use_subpixel_antialiasing (void); 719extern bool be_use_subpixel_antialiasing (void);
698extern const char *be_find_setting (const char *); 720extern const char *be_find_setting (const char *);
699extern haiku_font_family_or_style *be_list_font_families (size_t *); 721extern haiku_font_family_or_style *be_list_font_families (size_t *);
700extern void be_font_style_to_flags (char *, struct haiku_font_pattern *); 722extern void be_font_style_to_flags (const char *, struct haiku_font_pattern *);
701extern void *be_open_font_at_index (int, int, float); 723extern void *be_open_font_at_index (int, int, float);
702extern void be_set_font_antialiasing (void *, bool); 724extern void be_set_font_antialiasing (void *, bool);
703extern int be_get_ui_color (const char *, uint32_t *); 725extern 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 *);
724extern void be_send_move_frame_event (void *); 746extern void be_send_move_frame_event (void *);
725extern void be_set_window_fullscreen_mode (void *, enum haiku_fullscreen_mode); 747extern void be_set_window_fullscreen_mode (void *, enum haiku_fullscreen_mode);
726 748
749extern status_t be_write_node_message (const char *, const char *, void *);
750extern void be_send_message (const char *, void *);
751
727extern void be_lock_window (void *); 752extern void be_lock_window (void *);
728extern void be_unlock_window (void *); 753extern void be_unlock_window (void *);
729extern bool be_get_explicit_workarea (int *, int *, int *, int *); 754extern bool be_get_explicit_workarea (int *, int *, int *, int *);
730extern void be_clear_grab_view (void); 755extern void be_clear_grab_view (void);
731extern void be_set_use_frame_synchronization (void *, bool); 756extern void be_set_use_frame_synchronization (void *, bool);
757
758extern void be_listen_font_settings (void);
759
760extern bool be_lock_font_defaults (void);
761extern const char *be_get_font_default (enum haiku_what_font);
762extern int be_get_font_size (enum haiku_what_font);
763extern 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
1314DEFUN ("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
1353DEFUN ("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
1392void
1393haiku_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
1314static void 1406static void
1315syms_of_haikufont_for_pdumper (void) 1407syms_of_haikufont_for_pdumper (void)
1316{ 1408{
@@ -1320,6 +1412,7 @@ syms_of_haikufont_for_pdumper (void)
1320void 1412void
1321syms_of_haikufont (void) 1413syms_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
806static void
807haiku_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
782DEFUN ("haiku-drag-message", Fhaiku_drag_message, Shaiku_drag_message, 849DEFUN ("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
1028DEFUN ("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.
1031FILE should be a file name of a file on a Be File System volume, NAME
1032should be a string describing the name of the attribute that will be
1033written, and MESSAGE will be the attribute written to FILE, as a
1034system message in the format accepted by `haiku-drag-message', which
1035see. */)
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
1062DEFUN ("haiku-send-message", Fhaiku_send_message, Shaiku_send_message,
1063 2, 2, 0,
1064 doc: /* Send a system message to PROGRAM.
1065PROGRAM must be the name of the application to which the message will
1066be sent. MESSAGE is the system message, serialized in the format
1067accepted by `haiku-drag-message', that will be sent to the application
1068specified by PROGRAM. There is no guarantee that the message will
1069arrive 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
961static void 1088static void
962haiku_dnd_compute_tip_xy (int *root_x, int *root_y) 1089haiku_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.
4639This is either one of the symbols `shift', `control', `command', and 4642This 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. */
38struct haiku_font_change_event;
39
37extern int popup_activated_p; 40extern int popup_activated_p;
38 41
39struct haikufont_info 42struct haikufont_info
@@ -361,4 +364,7 @@ extern void haiku_merge_cursor_foreground (struct glyph_string *, unsigned long
361 unsigned long *); 364 unsigned long *);
362extern void haiku_handle_selection_clear (struct input_event *); 365extern void haiku_handle_selection_clear (struct input_event *);
363extern void haiku_start_watching_selections (void); 366extern void haiku_start_watching_selections (void);
367extern 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
3Copyright (C) 1989, 1992-2022 Free Software Foundation, Inc. 3Copyright (C) 1989-2022 Free Software Foundation, Inc.
4 4
5This file is part of GNU Emacs. 5This file is part of GNU Emacs.
6 6
@@ -10907,7 +10907,7 @@ DEF_DLL_FN (int, gdk_pixbuf_get_bits_per_sample, (const GdkPixbuf *));
10907DEF_DLL_FN (void, g_type_init, (void)); 10907DEF_DLL_FN (void, g_type_init, (void));
10908# endif 10908# endif
10909DEF_DLL_FN (void, g_object_unref, (gpointer)); 10909DEF_DLL_FN (void, g_object_unref, (gpointer));
10910DEF_DLL_FN (void, g_clear_error, (GError **)); 10910DEF_DLL_FN (void, g_error_free, (GError *));
10911 10911
10912static bool 10912static bool
10913init_svg_functions (void) 10913init_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
11823DEFUN ("imagep", Fimagep, Simagep, 1, 1, 0, 11841DEFUN ("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
11831DEFUN ("lookup-image", Flookup_image, Slookup_image, 1, 1, 0, 11850DEFUN ("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
2177Lisp_Object 2177Lisp_Object
2178get_local_map (ptrdiff_t position, struct buffer *buffer, Lisp_Object type) 2178get_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
1832static Lisp_Object 1825static Lisp_Object
1833safe_run_hooks_1 (ptrdiff_t nargs, Lisp_Object *args) 1826safe_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)
1850static Lisp_Object 1835static Lisp_Object
1851safe_run_hooks_error (Lisp_Object error, ptrdiff_t nargs, Lisp_Object *args) 1836safe_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)
1886static Lisp_Object 1871static Lisp_Object
1887safe_run_hook_funcall (ptrdiff_t nargs, Lisp_Object *args) 1872safe_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.
11807POS defaults to point in WINDOW; WINDOW defaults to the selected window. 11789POS defaults to point in WINDOW; WINDOW defaults to the selected window.
11808 11790
11791If POS is in invisible text or is hidden by `display' properties,
11792this function may report on buffer positions before or after POS.
11793
11809Return nil if POS is not visible in WINDOW. Otherwise, 11794Return nil if POS is not visible in WINDOW. Otherwise,
11810the return value is similar to that returned by `event-start' for 11795the return value is similar to that returned by `event-start' for
11811a mouse click at the upper left corner of the glyph corresponding 11796a 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)
245DEFINE_GDB_SYMBOL_END (VALMASK) 245DEFINE_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. */
2911enum { stackbufsize = 1024 };
2912
2913static void 2914static void
2914invalid_radix_integer (EMACS_INT radix, char stackbuf[VLA_ELEMS (stackbufsize)], 2915invalid_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
2927static Lisp_Object 2928static Lisp_Object
2928read_integer (Lisp_Object readcharfun, int radix, 2929read_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 '"'). */
3032static Lisp_Object 3033static Lisp_Object
3033read_string_literal (char stackbuf[VLA_ELEMS (stackbufsize)], 3034read_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 "#&"). */
3359static Lisp_Object 3360static Lisp_Object
3360read_bool_vector (char stackbuf[VLA_ELEMS (stackbufsize)], 3361read_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
3689static void
3690read_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. */
3692static Lisp_Object 3698static Lisp_Object
3693read0 (Lisp_Object readcharfun, bool locate_syms) 3699read0 (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
9static const unsigned char mac_uvs_table_adobe_japan1_bytes[] = 9static 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
762DEFUN ("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)
324static NSFontDescriptor * 324static NSFontDescriptor *
325ns_spec_to_descriptor (Lisp_Object font_spec) 325ns_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
792static Lisp_Object 784static Lisp_Object
793ns_findfonts (Lisp_Object font_spec, BOOL isMatch) 785ns_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
3996ns_draw_stretch_glyph_string (struct glyph_string *s) 3995ns_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
4098static void 4110static void
4099ns_draw_glyph_string_foreground (struct glyph_string *s) 4111ns_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
7397static void dummy_handler (int sig) {} 7398static 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
2403DEFUN ("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
2407SIZE zero means use the system's default value. If SIZE is
2408non-zero, this also avoids flushing the output stream.
2409
2410TTY may be a terminal object, a frame, or nil (meaning the selected
2411frame's terminal).
2412
2413This function temporarily suspends and resumes the terminal
2414device. */)
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
2425DEFUN ("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
2429TTY may be a terminal object, a frame, or nil (meaning the selected
2430frame's terminal).
2431
2432A 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
diff --git a/src/w32.c b/src/w32.c
index 44c279602cf..9c7d536adad 100644
--- a/src/w32.c
+++ b/src/w32.c
@@ -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. */
6484bool
6485symlinks_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
diff --git a/src/w32.h b/src/w32.h
index dc91c595c43..b914aa9bafa 100644
--- a/src/w32.h
+++ b/src/w32.h
@@ -228,6 +228,8 @@ extern int sys_link (const char *, const char *);
228extern int openat (int, const char *, int, int); 228extern int openat (int, const char *, int, int);
229extern int fchmodat (int, char const *, mode_t, int); 229extern int fchmodat (int, char const *, mode_t, int);
230extern int lchmod (char const *, mode_t); 230extern int lchmod (char const *, mode_t);
231extern bool symlinks_supported (const char *);
232
231 233
232/* Return total and free memory info. */ 234/* Return total and free memory info. */
233extern int w32_memory_info (unsigned long long *, unsigned long long *, 235extern 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
10456typedef BOOL (WINAPI * SystemParametersInfoW_Proc) (UINT,UINT,PVOID,UINT);
10457SystemParametersInfoW_Proc system_parameters_info_w_fn = NULL;
10458
10459DEFUN ("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'.
8367See `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
37121Any other value is interpreted as `empty-box'.
37112An element may also be a cons cell (GRAPHICAL . TEXT), which specifies the 37122An element may also be a cons cell (GRAPHICAL . TEXT), which specifies the
37113display method for graphical terminals and text terminals respectively. 37123display method for graphical terminals and text terminals respectively.
37114GRAPHICAL and TEXT should each have one of the values listed above. 37124GRAPHICAL and TEXT should each have one of the values listed above.
37115 37125
37116The char-table has one extra slot to control the display of a character for 37126The char-table has one extra slot to control the display of characters
37117which no font is found. This slot only takes effect on graphical terminals. 37127for which no font is found on graphical terminals, and characters that
37118Its value should be an ASCII acronym string, `hex-code', `empty-box', or 37128cannot 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 37129ASCII acronym string, `hex-code', `empty-box', or `thin-space'. It
37120separate values for graphical and text terminals. 37130could also be a cons cell of any two of these, to specify separate
37121The default is `empty-box'. 37131values for graphical and text terminals. The default is `empty-box'.
37132
37133With the obvious exception of `zero-width', all the other representations
37134are displayed using the face `glyphless-char'.
37122 37135
37123If a character has a non-nil entry in an active display table, the 37136If a character has a non-nil entry in an active display table, the
37124display table takes effect; in this case, Emacs does not consult 37137display 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
3055DEFUN ("internal-set-lisp-face-attribute", Finternal_set_lisp_face_attribute, 3064DEFUN ("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
3340static Lisp_Object 3360static Lisp_Object
3341x_xim_text_to_utf8_unix_1 (ptrdiff_t nargs, 3361x_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
3365static Lisp_Object 3392static Lisp_Object
3366x_xim_text_to_utf8_unix_2 (Lisp_Object val, 3393x_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. */
3383static char * 3409static char *
3384x_xim_text_to_utf8_unix (XIMText *text, ptrdiff_t *length) 3410x_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
3422xic_preedit_draw_callback (XIC xic, XPointer client_data, 3450xic_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
6223the attributes: 6257the 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
6229Internal use only, use `display-monitor-attributes-list' instead. */) 6263Internal 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.
7694If FRAME is nil or omitted, use the selected frame. 7725If FRAME is nil or omitted, use the selected frame.
7695 7726
7696On X Windows, the following optional arguments are also accepted: 7727On X Windows, the following optional arguments are also accepted: If
7697If TYPE is nil or omitted, get the property as a string. 7728TYPE 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. 7729is the name of the atom that denotes the expected type.
7730
7731If TYPE is the string "AnyPropertyType", decode and return the data
7732regardless of what the type really is.
7733
7734The format of the data returned is the same as a selection conversion
7735to the given type. For example, if `x-get-selection-internal' returns
7736an integer when the selection data is a given type,
7737`x-window-property' will do the same for that type.
7738
7699If WINDOW-ID is non-nil, get the property of that window instead of 7739If 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 7740FRAME'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 7741is separate from FRAME because window IDs are not unique across X
7702 displays or screens on the same display, so FRAME provides context 7742displays, so FRAME provides context for the window ID.
7703 for the window ID. 7743
7704If DELETE-P is non-nil, delete the property after retrieving it. 7744If DELETE-P is non-nil, delete the property after retrieving it.
7705If VECTOR-RET-P is non-nil, return a vector of values instead of a string. 7745If VECTOR-RET-P is non-nil, return a vector of values instead of a string.
7706 7746
7747X allows an arbitrary number of properties to be set on any window.
7748However, properties are most often set by the window manager or other
7749programs on the root window or FRAME's X window in order to
7750communicate information to Emacs and other programs. Most of these
7751properties are specified as part of the Extended Window Manager Hints
7752and the Inter-Client Communication Conventions Manual, which are
7753located here:
7754
7755 https://specifications.freedesktop.org/wm-spec/wm-spec-latest.html
7756
7757and
7758
7759 https://x.org/releases/X11R7.6/doc/xorg-docs/specs/ICCCM/icccm.html
7760
7707Return value is nil if FRAME doesn't have a property with name PROP or 7761Return value is nil if FRAME doesn't have a property with name PROP or
7708if PROP has no value of TYPE (always a string in the MS Windows case). */) 7762if 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
1131struct font_driver const xfont_driver = 1131struct 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
1148void 1148void
@@ -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
1158static void 1162static 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
519typedef 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
526static List
527member (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
538static void
539fatal (char *msg, char *prog)
540{
541 fprintf (stderr, msg, prog);
542 exit (1);
543}
544
545int
546main (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)
1225DEFUN ("font-get-system-normal-font", Ffont_get_system_normal_font, 1225DEFUN ("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.
1229The 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
1234DEFUN ("font-get-system-font", Ffont_get_system_font, Sfont_get_system_font, 1235DEFUN ("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.
1238The 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. */)
542void 542void
543syms_of_xsmfns (void) 543syms_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.
547Changing the value does not change the session id used by Emacs. 549Changing 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
1143static void x_scroll_bar_redraw (struct scroll_bar *); 1144static void x_scroll_bar_redraw (struct scroll_bar *);
1144#endif 1145#endif
1146static 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
4458static void 4462static void
4459x_dnd_send_enter (struct frame *f, Window target, int supported) 4463x_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
4495static void 4500static void
4496x_dnd_send_position (struct frame *f, Window target, int supported, 4501x_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
4570static void 4575static void
4571x_dnd_send_leave (struct frame *f, Window target) 4576x_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
4594static bool 4599static bool
4595x_dnd_send_drop (struct frame *f, Window target, Time timestamp, 4600x_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
4628static bool 4633static bool
4629x_dnd_do_drop (Window target, int supported) 4634x_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
7611x_display_set_last_user_time (struct x_display_info *dpyinfo, Time time, 7607x_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,
13155void 13198void
13156x_mouse_leave (struct x_display_info *dpyinfo) 13199x_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
13548static void
13549x_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
13563static void
13564x_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
13603static void
13604xi_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
13612static void
13613xi_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
13621static void
13622xi_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
13466static Bool 13634static Bool
13467x_query_pointer_1 (struct x_display_info *dpyinfo, 13635x_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
13599static Lisp_Object 13767static Lisp_Object
13600x_construct_mouse_click (struct input_event *result, 13768x_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
14328static void 14494static Lisp_Object
14329x_unprotect_window_for_callback (struct x_display_info *dpyinfo) 14495x_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
14404static void 14576static void
14405x_scroll_bar_to_input_event (const XEvent *event, 14577x_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
14435static void 14611static void
14436x_horizontal_scroll_bar_to_input_event (const XEvent *event, 14612x_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
17704static void
17705x_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)
25115static void 25548static void
25116xim_open_dpy (struct x_display_info *dpyinfo, char *resource_name) 25549xim_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
27895bool
27896x_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.
29953In addition, when this variable is a list, only preserve the 30457In addition, when this variable is a list, only preserve the
29954selections whose names are contained within. */); 30458selections 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.
30463If a symbol and non-nil, this is the coding system that will be used
30464to decode input from X input methods. It does not affect input from
30465GTK 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.
30470It should accept a single argument, a string describing the locale of
30471the input method, and return a coding system that can decode keyboard
30472input 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
1200enum 1213enum
@@ -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
1589extern void x_sync_init_fences (struct frame *); 1607extern void x_sync_init_fences (struct frame *);
1590#endif 1608#endif
1609extern bool x_embed_frame (struct x_display_info *, struct frame *);
1591 1610
1592extern void x_delete_terminal (struct terminal *); 1611extern void x_delete_terminal (struct terminal *);
1593extern Cursor x_create_font_cursor (struct x_display_info *, int); 1612extern 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), \