summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorYuan Fu <casouri@gmail.com>2022-10-05 14:22:03 -0700
committerYuan Fu <casouri@gmail.com>2022-10-05 14:22:03 -0700
commit7ebbd4efc3d45403cf845d35c36c21756baeeba8 (patch)
treef53223ce7dbd64c079aced6e1a77964d1a8eaa3f /src
parentcb183f6467401fb5ed2b7fc98ca75be9d943cbe3 (diff)
parent95efafb72664049f8ac825047df3645656cf76f4 (diff)
downloademacs-7ebbd4efc3d45403cf845d35c36c21756baeeba8.tar.gz
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
check_pure_size (void)
{
if (pure_bytes_used_before_overflow)
- message (("emacs:0:Pure Lisp storage overflow (approx. %"pI"d"
+ message (("emacs:0:Pure Lisp storage overflow (approx. %jd"
" bytes needed)"),
pure_bytes_used + pure_bytes_used_before_overflow);
}
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,
NEXT;
CASE (Binteractive_p): /* Obsolete since 24.1. */
- PUSH (call0 (intern ("interactive-p")));
+ PUSH (call0 (Qinteractive_p));
NEXT;
CASE (Bforward_char):
@@ -1749,6 +1749,8 @@ get_byte_code_arity (Lisp_Object args_template)
void
syms_of_bytecode (void)
{
+ DEFSYM (Qinteractive_p, "interactive-p");
+
defsubr (&Sbyte_code);
defsubr (&Sinternal_stack_stats);
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) */
return (CHARACTERP (object) ? Qt : Qnil);
}
-DEFUN ("max-char", Fmax_char, Smax_char, 0, 0, 0,
- doc: /* Return the character of the maximum code. */
+DEFUN ("max-char", Fmax_char, Smax_char, 0, 1, 0,
+ doc: /* Return the maximum character code.
+If UNICODE is non-nil, return the maximum character code defined
+by the Unicode Standard. */
attributes: const)
- (void)
+ (Lisp_Object unicode)
{
- return make_fixnum (MAX_CHAR);
+ return (!NILP (unicode)
+ ? make_fixnum (MAX_UNICODE_CHAR)
+ : make_fixnum (MAX_CHAR));
}
DEFUN ("unibyte-char-to-multibyte", Funibyte_char_to_multibyte,
diff --git a/src/coding.c b/src/coding.c
index 0ae8eb3282b..ab73bda8440 100644
--- a/src/coding.c
+++ b/src/coding.c
@@ -12014,9 +12014,9 @@ See also the function `find-operation-coding-system'. */);
Vnetwork_coding_system_alist = Qnil;
DEFVAR_LISP ("locale-coding-system", Vlocale_coding_system,
- doc: /* Coding system to use with system messages.
-Also used for decoding keyboard input on X Window system, and for
-encoding standard output and error streams. */);
+ doc: /* Coding system to use with system messages.
+Potentially also used for decoding keyboard input on X Windows, and is
+used for encoding standard output and error streams. */);
Vlocale_coding_system = Qnil;
/* 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/>. */
#undef gcc_jit_context_get_type
#undef gcc_jit_context_new_array_access
#undef gcc_jit_context_new_array_type
+#undef gcc_jit_context_new_bitcast
#undef gcc_jit_context_new_binary_op
#undef gcc_jit_context_new_call
#undef gcc_jit_context_new_call_through_ptr
@@ -108,6 +109,7 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
#undef gcc_jit_struct_set_fields
#undef gcc_jit_type_get_const
#undef gcc_jit_type_get_pointer
+#undef gcc_jit_type_is_pointer
#undef gcc_jit_version_major
#undef gcc_jit_version_minor
#undef gcc_jit_version_patchlevel
@@ -180,8 +182,13 @@ DEF_DLL_FN (gcc_jit_rvalue *, gcc_jit_context_new_call_through_ptr,
(gcc_jit_context *ctxt, gcc_jit_location *loc,
gcc_jit_rvalue *fn_ptr, int numargs, gcc_jit_rvalue **args));
DEF_DLL_FN (gcc_jit_rvalue *, gcc_jit_context_new_cast,
+ (gcc_jit_context * ctxt, gcc_jit_location *loc,
+ gcc_jit_rvalue *rvalue, gcc_jit_type *type));
+#ifdef LIBGCCJIT_HAVE_gcc_jit_context_new_bitcast
+DEF_DLL_FN (gcc_jit_rvalue *, gcc_jit_context_new_bitcast,
(gcc_jit_context *ctxt, gcc_jit_location *loc,
gcc_jit_rvalue *rvalue, gcc_jit_type *type));
+#endif
DEF_DLL_FN (gcc_jit_rvalue *, gcc_jit_context_new_comparison,
(gcc_jit_context *ctxt, gcc_jit_location *loc,
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,
(gcc_jit_struct *struct_type));
DEF_DLL_FN (gcc_jit_type *, gcc_jit_type_get_const, (gcc_jit_type *type));
DEF_DLL_FN (gcc_jit_type *, gcc_jit_type_get_pointer, (gcc_jit_type *type));
+#ifdef LIBGCCJIT_HAVE_REFLECTION
+DEF_DLL_FN (gcc_jit_type *, gcc_jit_type_is_pointer, (gcc_jit_type *type));
+#endif
DEF_DLL_FN (void, gcc_jit_block_add_assignment,
(gcc_jit_block *block, gcc_jit_location *loc, gcc_jit_lvalue *lvalue,
gcc_jit_rvalue *rvalue));
@@ -293,6 +303,9 @@ init_gccjit_functions (void)
LOAD_DLL_FN (library, gcc_jit_context_get_type);
LOAD_DLL_FN (library, gcc_jit_context_new_array_access);
LOAD_DLL_FN (library, gcc_jit_context_new_array_type);
+#ifdef LIBGCCJIT_HAVE_gcc_jit_context_new_bitcast
+ LOAD_DLL_FN (library, gcc_jit_context_new_bitcast);
+#endif
LOAD_DLL_FN (library, gcc_jit_context_new_binary_op);
LOAD_DLL_FN (library, gcc_jit_context_new_call);
LOAD_DLL_FN (library, gcc_jit_context_new_call_through_ptr);
@@ -334,6 +347,9 @@ init_gccjit_functions (void)
LOAD_DLL_FN (library, gcc_jit_struct_set_fields);
LOAD_DLL_FN (library, gcc_jit_type_get_const);
LOAD_DLL_FN (library, gcc_jit_type_get_pointer);
+#ifdef LIBGCCJIT_HAVE_REFLECTION
+ LOAD_DLL_FN (library, gcc_jit_type_is_pointer);
+#endif
LOAD_DLL_FN_OPT (library, gcc_jit_context_add_command_line_option);
LOAD_DLL_FN_OPT (library, gcc_jit_context_add_driver_option);
#if defined (LIBGCCJIT_HAVE_gcc_jit_global_set_initializer)
@@ -368,6 +384,9 @@ init_gccjit_functions (void)
#define gcc_jit_context_get_type fn_gcc_jit_context_get_type
#define gcc_jit_context_new_array_access fn_gcc_jit_context_new_array_access
#define gcc_jit_context_new_array_type fn_gcc_jit_context_new_array_type
+#ifdef LIBGCCJIT_HAVE_gcc_jit_context_new_bitcast
+# define gcc_jit_context_new_bitcast fn_gcc_jit_context_new_bitcast
+#endif
#define gcc_jit_context_new_binary_op fn_gcc_jit_context_new_binary_op
#define gcc_jit_context_new_call fn_gcc_jit_context_new_call
#define gcc_jit_context_new_call_through_ptr fn_gcc_jit_context_new_call_through_ptr
@@ -410,6 +429,9 @@ init_gccjit_functions (void)
#define gcc_jit_rvalue_get_type fn_gcc_jit_rvalue_get_type
#define gcc_jit_struct_as_type fn_gcc_jit_struct_as_type
#define gcc_jit_struct_set_fields fn_gcc_jit_struct_set_fields
+#ifdef LIBGCCJIT_HAVE_REFLECTION
+# define gcc_jit_type_is_pointer fn_gcc_jit_type_is_pointer
+#endif
#define gcc_jit_type_get_const fn_gcc_jit_type_get_const
#define gcc_jit_type_get_pointer fn_gcc_jit_type_get_pointer
#if defined (LIBGCCJIT_HAVE_gcc_jit_version)
@@ -518,7 +540,9 @@ typedef struct {
static f_reloc_t freloc;
-#define NUM_CAST_TYPES 15
+#ifndef LIBGCCJIT_HAVE_gcc_jit_context_new_bitcast
+# define NUM_CAST_TYPES 15
+#endif
typedef struct {
EMACS_INT len;
@@ -593,13 +617,15 @@ typedef struct {
gcc_jit_rvalue *current_thread_ref;
/* Other globals. */
gcc_jit_rvalue *pure_ptr;
- /* libgccjit has really limited support for casting therefore this union will
- be used for the scope. */
+#ifndef LIBGCCJIT_HAVE_gcc_jit_context_new_bitcast
+ /* This version of libgccjit has really limited support for casting
+ therefore this union will be used for the scope. */
gcc_jit_type *cast_union_type;
gcc_jit_function *cast_functions_from_to[NUM_CAST_TYPES][NUM_CAST_TYPES];
gcc_jit_function *cast_ptr_to_int;
gcc_jit_function *cast_int_to_ptr;
gcc_jit_type *cast_types[NUM_CAST_TYPES];
+#endif
gcc_jit_function *func; /* Current function being compiled. */
bool func_has_non_local; /* From comp-func has-non-local slot. */
EMACS_INT func_speed; /* From comp-func speed slot. */
@@ -1100,6 +1126,7 @@ emit_cond_jump (gcc_jit_rvalue *test,
}
+#ifndef LIBGCCJIT_HAVE_gcc_jit_context_new_bitcast
static int
type_to_cast_index (gcc_jit_type * type)
{
@@ -1109,6 +1136,7 @@ type_to_cast_index (gcc_jit_type * type)
xsignal1 (Qnative_ice, build_string ("unsupported cast"));
}
+#endif
static gcc_jit_rvalue *
emit_coerce (gcc_jit_type *new_type, gcc_jit_rvalue *obj)
@@ -1145,14 +1173,48 @@ emit_coerce (gcc_jit_type *new_type, gcc_jit_rvalue *obj)
}
#endif
+#ifdef LIBGCCJIT_HAVE_gcc_jit_context_new_bitcast
+ bool old_is_ptr = gcc_jit_type_is_pointer (old_type) != NULL;
+ bool new_is_ptr = gcc_jit_type_is_pointer (new_type) != NULL;
+
+ gcc_jit_rvalue *tmp = obj;
+
+ /* `gcc_jit_context_new_bitcast` requires that the types being converted
+ between have the same layout and as such, doesn't allow converting
+ between an arbitrarily sized integer/boolean and a pointer. Casting it
+ to a uintptr/void* is still necessary, to ensure that it can be bitcast
+ into a (void *)/uintptr respectively. */
+ if (old_is_ptr != new_is_ptr)
+ {
+ if (old_is_ptr)
+ {
+ tmp = gcc_jit_context_new_cast (comp.ctxt, NULL, tmp,
+ comp.void_ptr_type);
+ tmp = gcc_jit_context_new_bitcast (comp.ctxt, NULL, tmp,
+ comp.uintptr_type);
+ }
+ else
+ {
+ tmp = gcc_jit_context_new_cast (comp.ctxt, NULL, tmp,
+ comp.uintptr_type);
+ tmp = gcc_jit_context_new_bitcast (comp.ctxt, NULL, tmp,
+ comp.void_ptr_type);
+ }
+ }
+ return gcc_jit_context_new_cast (comp.ctxt, NULL, tmp, new_type);
+
+#else /* !LIBGCCJIT_HAVE_gcc_jit_context_new_bitcast */
+
int old_index = type_to_cast_index (old_type);
int new_index = type_to_cast_index (new_type);
/* Lookup the appropriate cast function in the cast matrix. */
return gcc_jit_context_new_call (comp.ctxt,
- NULL,
- comp.cast_functions_from_to[old_index][new_index],
- 1, &obj);
+ NULL,
+ comp.cast_functions_from_to
+ [old_index][new_index],
+ 1, &obj);
+#endif
}
static gcc_jit_rvalue *
@@ -3318,6 +3380,7 @@ define_thread_state_struct (void)
gcc_jit_type_get_pointer (gcc_jit_struct_as_type (comp.thread_state_s));
}
+#ifndef LIBGCCJIT_HAVE_gcc_jit_context_new_bitcast
static gcc_jit_function *
define_type_punning (const char *name,
gcc_jit_type *from, gcc_jit_field *from_field,
@@ -3451,6 +3514,7 @@ define_cast_functions (void)
comp.void_ptr_type,
cast_union_fields[0]);
+
for (int i = 0; i < NUM_CAST_TYPES; ++i)
comp.cast_types[i] = cast_types[i].type;
@@ -3460,6 +3524,7 @@ define_cast_functions (void)
comp.cast_functions_from_to[i][j] =
define_cast_from_to (cast_types[i], cast_types[j]);
}
+#endif /* !LIBGCCJIT_HAVE_gcc_jit_context_new_bitcast */
static void
define_CHECK_TYPE (void)
@@ -4467,7 +4532,7 @@ the latter is supposed to be used by the Emacs build procedure. */)
}
if (NILP (base_dir))
error ("Cannot find suitable directory for output in "
- "`comp-native-load-path'.");
+ "`native-comp-eln-load-path'.");
}
if (!file_name_absolute_p (SSDATA (base_dir)))
@@ -4660,7 +4725,9 @@ Return t on success. */)
define_jmp_buf ();
define_handler_struct ();
define_thread_state_struct ();
+#ifndef LIBGCCJIT_HAVE_gcc_jit_context_new_bitcast
define_cast_functions ();
+#endif
return Qt;
}
@@ -5107,6 +5174,7 @@ maybe_defer_native_compilation (Lisp_Object function_name,
return;
if (!native_comp_deferred_compilation
+ || !NILP (Vinhibit_automatic_native_compilation)
|| noninteractive
|| !NILP (Vpurify_flag)
|| !COMPILEDP (definition)
@@ -5610,6 +5678,14 @@ For internal use. */);
doc: /* Non-nil when comp.el can be native compiled.
For internal use. */);
/* Compiler control customizes. */
+ DEFVAR_LISP ("inhibit-automatic-native-compilation",
+ Vinhibit_automatic_native_compilation,
+ doc: /* If non-nil, inhibit automatic native compilation of loaded .elc files.
+
+After compilation, each function definition is updated to the native
+compiled one. */);
+ Vinhibit_automatic_native_compilation = Qnil;
+
DEFVAR_BOOL ("native-comp-deferred-compilation",
native_comp_deferred_compilation,
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,
return width;
}
+/* Adjust the width of each grapheme cluster of GSTRING because
+ zero-width grapheme clusters are not displayed. If the width is
+ zero, then the width of the last glyph in the cluster is
+ incremented. */
+
+void
+composition_gstring_adjust_zero_width (Lisp_Object gstring)
+{
+ ptrdiff_t from = 0;
+ int width = 0;
+
+ for (ptrdiff_t i = 0; ; i++)
+ {
+ Lisp_Object glyph;
+
+ if (i < LGSTRING_GLYPH_LEN (gstring))
+ glyph = LGSTRING_GLYPH (gstring, i);
+ else
+ glyph = Qnil;
+
+ if (NILP (glyph) || from != LGLYPH_FROM (glyph))
+ {
+ eassert (i > 0);
+ Lisp_Object last = LGSTRING_GLYPH (gstring, i - 1);
+
+ if (width == 0)
+ {
+ if (NILP (LGLYPH_ADJUSTMENT (last)))
+ LGLYPH_SET_ADJUSTMENT (last,
+ CALLN (Fvector,
+ make_fixnum (0), make_fixnum (0),
+ make_fixnum (LGLYPH_WIDTH (last)
+ + 1)));
+ else
+ ASET (LGLYPH_ADJUSTMENT (last), 2,
+ make_fixnum (LGLYPH_WADJUST (last) + 1));
+ }
+ if (NILP (glyph))
+ break;
+ from = LGLYPH_FROM (glyph);
+ width = 0;
+ }
+ width += (NILP (LGLYPH_ADJUSTMENT (glyph))
+ ? LGLYPH_WIDTH (glyph) : LGLYPH_WADJUST (glyph));
+ }
+}
+
static Lisp_Object gstring_work;
static Lisp_Object gstring_work_headers;
@@ -876,7 +923,8 @@ fill_gstring_body (Lisp_Object gstring)
}
LGLYPH_SET_ADJUSTMENT (g, Qnil);
}
- if (i < LGSTRING_GLYPH_LEN (gstring))
+ len = LGSTRING_GLYPH_LEN (gstring);
+ for (; i < len; i++)
LGSTRING_SET_GLYPH (gstring, i, Qnil);
}
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);
extern bool composition_gstring_p (Lisp_Object);
extern int composition_gstring_width (Lisp_Object, ptrdiff_t, ptrdiff_t,
struct font_metrics *);
+extern void composition_gstring_adjust_zero_width (Lisp_Object);
extern bool find_automatic_composition (ptrdiff_t, ptrdiff_t, ptrdiff_t,
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/>. */
#endif
/* To help make dependencies clearer elsewhere, this file typically
- does not #include other files. The exceptions are stdbool.h
- because it is unlikely to interfere with configuration and bool is
- such a core part of the C language, and ms-w32.h (DOS_NT
+ does not #include other files. The exception is ms-w32.h (DOS_NT
only) because it historically was included here and changing that
would take some work. */
-#include <stdbool.h>
-
#if defined WINDOWSNT && !defined DEFER_MS_W32_H
# include <ms-w32.h>
#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)
DEFSYM (Qsymbolp, "symbolp");
DEFSYM (Qfixnump, "fixnump");
DEFSYM (Qintegerp, "integerp");
+ DEFSYM (Qbooleanp, "booleanp");
DEFSYM (Qnatnump, "natnump");
DEFSYM (Qwholenump, "wholenump");
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)
case DBUS_TYPE_BOOLEAN:
/* There must be an argument. */
if (EQ (QCboolean, object))
- wrong_type_argument (intern ("booleanp"), object);
+ wrong_type_argument (Qbooleanp, object);
sprintf (signature, "%c", dtype);
break;
@@ -649,7 +649,7 @@ xd_append_arg (int dtype, Lisp_Object object, DBusMessageIter *iter)
case DBUS_TYPE_BOOLEAN:
/* There must be an argument. */
if (EQ (QCboolean, object))
- wrong_type_argument (intern ("booleanp"), object);
+ wrong_type_argument (Qbooleanp, object);
{
dbus_bool_t val = (NILP (object)) ? FALSE : TRUE;
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)
if (w->desired_matrix == NULL)
{
w->desired_matrix = new_glyph_matrix (NULL);
- w->current_matrix = new_glyph_matrix (NULL);
+ eassert (w->current_matrix == NULL);
}
+ if (w->current_matrix == NULL)
+ w->current_matrix = new_glyph_matrix (NULL);
+
dim.width = required_matrix_width (w);
dim.height = required_matrix_height (w);
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,
{
if (MATRIX_ROW_ENABLED_P (desired_matrix, i))
{
- if (FRAME_TERMCAP_P (f))
+ /* Note that output_buffer_size being 0 means that we want the
+ old default behavior of flushing output every now and then. */
+ if (FRAME_TERMCAP_P (f) && FRAME_TTY (f)->output_buffer_size == 0)
{
/* Flush out every so many lines.
Also flush out if likely to have more than 1k buffered
@@ -6504,9 +6509,6 @@ init_display_interactive (void)
if (!inhibit_window_system && display_arg)
{
Vinitial_window_system = Qx;
-#ifdef HAVE_X11
- Vwindow_system_version = make_fixnum (11);
-#endif
#ifdef USE_NCURSES
/* In some versions of ncurses,
tputs crashes if we have not called tgetent.
@@ -6521,7 +6523,6 @@ init_display_interactive (void)
if (!inhibit_window_system)
{
Vinitial_window_system = Qw32;
- Vwindow_system_version = make_fixnum (1);
return;
}
#endif /* HAVE_NTGUI */
@@ -6530,7 +6531,6 @@ init_display_interactive (void)
if (!inhibit_window_system && !will_dump_p ())
{
Vinitial_window_system = Qns;
- Vwindow_system_version = make_fixnum (10);
return;
}
#endif
@@ -6539,7 +6539,6 @@ init_display_interactive (void)
if (!inhibit_window_system && !will_dump_p ())
{
Vinitial_window_system = Qpgtk;
- Vwindow_system_version = make_fixnum (3);
return;
}
#endif
@@ -6548,7 +6547,6 @@ init_display_interactive (void)
if (!inhibit_window_system && !will_dump_p ())
{
Vinitial_window_system = Qhaiku;
- Vwindow_system_version = make_fixnum (1);
return;
}
#endif
@@ -6766,10 +6764,6 @@ Use of this variable as a boolean is deprecated. Instead,
use `display-graphic-p' or any of the other `display-*-p'
predicates which report frame's specific UI-related capabilities. */);
- DEFVAR_LISP ("window-system-version", Vwindow_system_version,
- doc: /* The version number of the window system in use.
-For X windows, this is 11. */);
-
DEFVAR_BOOL ("cursor-in-echo-area", cursor_in_echo_area,
doc: /* Non-nil means put cursor in minibuffer, at end of any message there. */);
@@ -6817,5 +6811,4 @@ static void
syms_of_display_for_pdumper (void)
{
Vinitial_window_system = Qnil;
- Vwindow_system_version = Qnil;
}
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'. */)
doc = module_function_documentation (XMODULE_FUNCTION (fun));
#endif
else
- doc = call1 (intern ("function-documentation"), fun);
+ doc = call1 (Qfunction_documentation, fun);
/* If DOC is 0, it's typically because of a dumped file missing
from the DOC file (bug in src/Makefile.in). */
@@ -643,7 +643,14 @@ default_to_grave_quoting_style (void)
DEFUN ("text-quoting-style", Ftext_quoting_style,
Stext_quoting_style, 0, 0, 0,
doc: /* Return the current effective text quoting style.
-See variable `text-quoting-style'. */)
+If the variable `text-quoting-style' is `grave', `straight' or
+`curve', just return that value. If it is nil (the default), return
+`grave' if curved quotes cannot be displayed (for instance, on a
+terminal with no support for these characters), otherwise return
+`quote'. Any other value is treated as `grave'.
+
+Note that in contrast to the variable `text-quoting-style', this
+function will never return nil. */)
(void)
{
/* Use grave accent and apostrophe `like this'. */
@@ -694,7 +701,11 @@ The value should be one of these symbols:
`grave': quote with grave accent and apostrophe \\=`like this\\=';
i.e., do not alter the original quote marks.
nil: like `curve' if curved single quotes are displayable,
- and like `grave' otherwise. This is the default. */);
+ and like `grave' otherwise. This is the default.
+
+You should never read the value of this variable directly from a Lisp
+program. Use the function `text-quoting-style' instead, as that will
+compute the correct value for the current terminal in the nil case. */);
Vtext_quoting_style = Qnil;
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/>. */
#define DYNLIB_H
#include <attribute.h>
-#include <stdbool.h>
typedef void *dynlib_handle_ptr;
dynlib_handle_ptr dynlib_open (const char *path);
diff --git a/src/editfns.c b/src/editfns.c
index cd5cddee79f..c1414071c79 100644
--- a/src/editfns.c
+++ b/src/editfns.c
@@ -3552,7 +3552,9 @@ styled_format (ptrdiff_t nargs, Lisp_Object *args, bool message)
|| conversion == 'o' || conversion == 'x'
|| conversion == 'X'))
error ("Invalid format operation %%%c",
- STRING_CHAR ((unsigned char *) format - 1));
+ multibyte_format
+ ? STRING_CHAR ((unsigned char *) format - 1)
+ : *((unsigned char *) format - 1));
else if (! (FIXNUMP (arg) || ((BIGNUMP (arg) || FLOATP (arg))
&& conversion != 'c')))
error ("Format specifier doesn't match argument type");
@@ -4603,10 +4605,7 @@ it to be non-nil. */);
DEFSYM (Qrestrictions_locked, "restrictions-locked");
DEFVAR_LISP ("restrictions-locked", Vrestrictions_locked,
- doc: /* If non-nil, restrictions are currently locked.
-
-This happens when `narrow-to-region', which see, is called from Lisp
-with an optional argument LOCK non-nil. */);
+ doc: /* If non-nil, restrictions are currently locked. */);
Vrestrictions_locked = Qnil;
Funintern (Qrestrictions_locked, Qnil);
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:
#include "emacs-module.h"
#include <stdarg.h>
-#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#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.
#include <stdint.h>
#include <time.h>
-#ifndef __cplusplus
+#if ((defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) < 202311 \
+ && !defined __bool_true_false_are_defined && !defined __cplusplus)
#include <stdbool.h>
#endif
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\
-x to be used in #!/usr/bin/emacs -x\n\
and has approximately the same meaning\n\
as -Q --script\n\
---terminal, -t DEVICE use DEVICE for terminal I/O\n \
+--terminal, -t DEVICE use DEVICE for terminal I/O\n\
--user, -u USER load ~USER/.emacs instead of your own\n\
\n\
",
@@ -895,19 +895,17 @@ load_pdump (int argc, char **argv)
}
/* Where's our executable? */
- ptrdiff_t bufsize;
-#ifndef NS_SELF_CONTAINED
- ptrdiff_t exec_bufsize;
-#endif
- emacs_executable = find_emacs_executable (argv[0], &bufsize);
-#ifndef NS_SELF_CONTAINED
- exec_bufsize = bufsize;
-#endif
+ ptrdiff_t exec_bufsize, bufsize, needed;
+ emacs_executable = find_emacs_executable (argv[0], &exec_bufsize);
/* If we couldn't find our executable, go straight to looking for
the dump in the hardcoded location. */
if (!(emacs_executable && *emacs_executable))
- goto hardcoded;
+ {
+ bufsize = 0;
+ dump_file = NULL;
+ goto hardcoded;
+ }
if (dump_file)
{
@@ -935,8 +933,8 @@ load_pdump (int argc, char **argv)
strip_suffix_length))
exenamelen = prefix_length;
}
- ptrdiff_t needed = exenamelen + strlen (suffix) + 1;
- dump_file = xpalloc (NULL, &bufsize, needed - bufsize, -1, 1);
+ bufsize = exenamelen + strlen (suffix) + 1;
+ dump_file = xpalloc (NULL, &bufsize, 1, -1, 1);
memcpy (dump_file, emacs_executable, exenamelen);
strcpy (dump_file + exenamelen, suffix);
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)
void
init_eval_once (void)
{
- /* Don't forget to update docs (lispref node "Local Variables"). */
-#ifndef HAVE_NATIVE_COMP
- max_specpdl_size = 1800; /* See bug#46818. */
- max_lisp_eval_depth = 800;
-#else
- /* Original values increased for comp.el. */
- max_specpdl_size = 2500;
+ /* Don't forget to update docs (lispref node "Eval"). */
max_lisp_eval_depth = 1600;
-#endif
Vrun_hooks = Qnil;
pdumper_do_now_and_after_load (init_eval_once_for_pdumper);
}
@@ -270,8 +263,7 @@ max_ensure_room (intmax_t *m, intmax_t a, intmax_t b)
static void
restore_stack_limits (Lisp_Object data)
{
- integer_to_intmax (XCAR (data), &max_specpdl_size);
- integer_to_intmax (XCDR (data), &max_lisp_eval_depth);
+ integer_to_intmax (data, &max_lisp_eval_depth);
}
/* Call the Lisp debugger, giving it argument ARG. */
@@ -283,9 +275,6 @@ call_debugger (Lisp_Object arg)
specpdl_ref count = SPECPDL_INDEX ();
Lisp_Object val;
intmax_t old_depth = max_lisp_eval_depth;
- /* Do not allow max_specpdl_size less than actual depth (Bug#16603). */
- ptrdiff_t counti = specpdl_ref_to_count (count);
- intmax_t old_max = max (max_specpdl_size, counti);
/* The previous value of 40 is too small now that the debugger
prints using cl-prin1 instead of prin1. Printing lists nested 8
@@ -293,20 +282,8 @@ call_debugger (Lisp_Object arg)
currently requires 77 additional frames. See bug#31919. */
max_ensure_room (&max_lisp_eval_depth, lisp_eval_depth, 100);
- /* While debugging Bug#16603, previous value of 100 was found
- too small to avoid specpdl overflow in the debugger itself. */
- max_ensure_room (&max_specpdl_size, counti, 200);
-
- if (old_max == counti)
- {
- /* We can enter the debugger due to specpdl overflow (Bug#16603). */
- specpdl_ptr--;
- grow_specpdl ();
- }
-
/* Restore limits after leaving the debugger. */
- record_unwind_protect (restore_stack_limits,
- Fcons (make_int (old_max), make_int (old_depth)));
+ record_unwind_protect (restore_stack_limits, make_int (old_depth));
#ifdef HAVE_WINDOW_SYSTEM
if (display_hourglass_p)
@@ -938,12 +915,9 @@ usage: (let* VARLIST BODY...) */)
lexenv = Vinternal_interpreter_environment;
Lisp_Object varlist = XCAR (args);
- while (CONSP (varlist))
+ FOR_EACH_TAIL (varlist)
{
- maybe_quit ();
-
elt = XCAR (varlist);
- varlist = XCDR (varlist);
if (SYMBOLP (elt))
{
var = elt;
@@ -1757,8 +1731,6 @@ signal_or_quit (Lisp_Object error_symbol, Lisp_Object data, bool keyboard_quit)
{
/* Edebug takes care of restoring these variables when it exits. */
max_ensure_room (&max_lisp_eval_depth, lisp_eval_depth, 20);
- ptrdiff_t counti = specpdl_ref_to_count (SPECPDL_INDEX ());
- max_ensure_room (&max_specpdl_size, counti, 40);
call2 (Vsignal_hook_function, error_symbol, data);
}
@@ -1827,8 +1799,6 @@ signal_or_quit (Lisp_Object error_symbol, Lisp_Object data, bool keyboard_quit)
{
max_ensure_room (&max_lisp_eval_depth, lisp_eval_depth, 100);
specpdl_ref count = SPECPDL_INDEX ();
- ptrdiff_t counti = specpdl_ref_to_count (count);
- max_ensure_room (&max_specpdl_size, counti, 200);
specbind (Qdebugger, Qdebug_early);
call_debugger (list2 (Qerror, Fcons (error_symbol, data)));
unbind_to (count, Qnil);
@@ -1844,12 +1814,10 @@ signal_or_quit (Lisp_Object error_symbol, Lisp_Object data, bool keyboard_quit)
{
max_ensure_room (&max_lisp_eval_depth, lisp_eval_depth, 100);
specpdl_ref count = SPECPDL_INDEX ();
- ptrdiff_t counti = specpdl_ref_to_count (count);
AUTO_STRING (redisplay_trace, "*Redisplay_trace*");
Lisp_Object redisplay_trace_buffer;
AUTO_STRING (gap, "\n\n\n\n"); /* Separates things in *Redisplay-trace* */
Lisp_Object delayed_warning;
- max_ensure_room (&max_specpdl_size, counti, 200);
redisplay_trace_buffer = Fget_buffer_create (redisplay_trace, Qnil);
current_buffer = XBUFFER (redisplay_trace_buffer);
if (!backtrace_yet) /* Are we on the first backtrace of the command? */
@@ -2394,17 +2362,12 @@ grow_specpdl_allocation (void)
eassert (specpdl_ptr == specpdl_end);
specpdl_ref count = SPECPDL_INDEX ();
- ptrdiff_t max_size = min (max_specpdl_size, PTRDIFF_MAX - 1000);
+ ptrdiff_t max_size = PTRDIFF_MAX - 1000;
union specbinding *pdlvec = specpdl - 1;
ptrdiff_t size = specpdl_end - specpdl;
ptrdiff_t pdlvecsize = size + 1;
if (max_size <= size)
- {
- if (max_specpdl_size < 400)
- max_size = max_specpdl_size = 400;
- if (max_size <= size)
- xsignal0 (Qexcessive_variable_binding);
- }
+ xsignal0 (Qexcessive_variable_binding); /* Can't happen, essentially. */
pdlvec = xpalloc (pdlvec, &pdlvecsize, 1, max_size + 1, sizeof *specpdl);
specpdl = pdlvec + 1;
specpdl_end = specpdl + pdlvecsize - 1;
@@ -4247,22 +4210,6 @@ Lisp_Object backtrace_top_function (void)
void
syms_of_eval (void)
{
- DEFVAR_INT ("max-specpdl-size", max_specpdl_size,
- doc: /* Limit on number of Lisp variable bindings and `unwind-protect's.
-
-If Lisp code tries to use more bindings than this amount, an error is
-signaled.
-
-You can safely increase this variable substantially if the default
-value proves inconveniently small. However, if you increase it too
-much, Emacs could run out of memory trying to make the stack bigger.
-Note that this limit may be silently increased by the debugger if
-`debug-on-error' or `debug-on-quit' is set.
-
-\"spec\" is short for \"special variables\", i.e., dynamically bound
-variables. \"PDL\" is short for \"push-down list\", which is an old
-term for \"stack\". */);
-
DEFVAR_INT ("max-lisp-eval-depth", max_lisp_eval_depth,
doc: /* Limit on depth in `eval', `apply' and `funcall' before error.
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)
}
}
- wrong_type_argument (intern ("file-offset"), val);
+ wrong_type_argument (Qfile_offset, val);
}
/* Return a special time value indicating the error number ERRNUM. */
@@ -4875,7 +4875,7 @@ by calling `format-decode', which see. */)
if (! NILP (insval))
{
if (! RANGED_FIXNUMP (0, insval, ZV - PT))
- wrong_type_argument (intern ("inserted-chars"), insval);
+ wrong_type_argument (Qinserted_chars, insval);
inserted = XFIXNAT (insval);
}
}
@@ -4898,7 +4898,7 @@ by calling `format-decode', which see. */)
insval = call3 (Qformat_decode,
Qnil, make_fixnum (inserted), visit);
if (! RANGED_FIXNUMP (0, insval, ZV - PT))
- wrong_type_argument (intern ("inserted-chars"), insval);
+ wrong_type_argument (Qinserted_chars, insval);
inserted = XFIXNAT (insval);
}
else
@@ -4921,7 +4921,7 @@ by calling `format-decode', which see. */)
insval = call3 (Qformat_decode,
Qnil, make_fixnum (oinserted), visit);
if (! RANGED_FIXNUMP (0, insval, ZV - PT))
- wrong_type_argument (intern ("inserted-chars"), insval);
+ wrong_type_argument (Qinserted_chars, insval);
if (ochars_modiff == CHARS_MODIFF)
/* format_decode didn't modify buffer's characters => move
point back to position before inserted text and leave
@@ -4944,7 +4944,7 @@ by calling `format-decode', which see. */)
if (!NILP (insval))
{
if (! RANGED_FIXNUMP (0, insval, ZV - PT))
- wrong_type_argument (intern ("inserted-chars"), insval);
+ wrong_type_argument (Qinserted_chars, insval);
inserted = XFIXNAT (insval);
}
}
@@ -4962,7 +4962,7 @@ by calling `format-decode', which see. */)
if (!NILP (insval))
{
if (! RANGED_FIXNUMP (0, insval, ZV - PT))
- wrong_type_argument (intern ("inserted-chars"), insval);
+ wrong_type_argument (Qinserted_chars, insval);
if (ochars_modiff == CHARS_MODIFF)
/* after_insert_file_functions didn't modify
buffer's characters => move point back to
@@ -6019,11 +6019,6 @@ A non-nil CURRENT-ONLY argument means save only current buffer. */)
bool old_message_p = 0;
struct auto_save_unwind auto_save_unwind;
- intmax_t sum = INT_ADD_WRAPV (specpdl_end - specpdl, 40, &sum)
- ? INTMAX_MAX : sum;
- if (max_specpdl_size < sum)
- max_specpdl_size = sum;
-
if (minibuf_level)
no_message = Qt;
@@ -6431,9 +6426,11 @@ syms_of_fileio (void)
DEFSYM (Qfile_date_error, "file-date-error");
DEFSYM (Qfile_missing, "file-missing");
DEFSYM (Qpermission_denied, "permission-denied");
+ DEFSYM (Qfile_offset, "file-offset");
DEFSYM (Qfile_notify_error, "file-notify-error");
DEFSYM (Qremote_file_error, "remote-file-error");
DEFSYM (Qexcl, "excl");
+ DEFSYM (Qinserted_chars, "inserted-chars");
DEFVAR_LISP ("file-name-coding-system", Vfile_name_coding_system,
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. */)
CHECK_STRING (string2);
ptrdiff_t n = min (SCHARS (string1), SCHARS (string2));
- if (!STRING_MULTIBYTE (string1) && !STRING_MULTIBYTE (string2))
+
+ if ((!STRING_MULTIBYTE (string1) || SCHARS (string1) == SBYTES (string1))
+ && (!STRING_MULTIBYTE (string2) || SCHARS (string2) == SBYTES (string2)))
{
- /* Both arguments are unibyte (hot path). */
+ /* Each argument is either unibyte or all-ASCII multibyte:
+ we can compare bytewise.
+ (Arbitrary multibyte strings cannot be compared bytewise because
+ that would give a different order for raw bytes 80..FF.) */
int d = memcmp (SSDATA (string1), SSDATA (string2), n);
return d < 0 || (d == 0 && n < SCHARS (string2)) ? Qt : Qnil;
}
-
- ptrdiff_t i1 = 0, i1_byte = 0, i2 = 0, i2_byte = 0;
-
- while (i1 < n)
+ else if (STRING_MULTIBYTE (string1) && STRING_MULTIBYTE (string2))
{
- /* When we find a mismatch, we must compare the
- characters, not just the bytes. */
- int c1 = fetch_string_char_advance (string1, &i1, &i1_byte);
- int c2 = fetch_string_char_advance (string2, &i2, &i2_byte);
- if (c1 != c2)
- return c1 < c2 ? Qt : Qnil;
+ ptrdiff_t i1 = 0, i1_byte = 0, i2 = 0, i2_byte = 0;
+ while (i1 < n)
+ {
+ int c1 = fetch_string_char_advance_no_check (string1, &i1, &i1_byte);
+ int c2 = fetch_string_char_advance_no_check (string2, &i2, &i2_byte);
+ if (c1 != c2)
+ return c1 < c2 ? Qt : Qnil;
+ }
+ return i1 < SCHARS (string2) ? Qt : Qnil;
+ }
+ else if (STRING_MULTIBYTE (string1))
+ {
+ /* string1 multibyte, string2 unibyte */
+ ptrdiff_t i1 = 0, i1_byte = 0, i2 = 0;
+ while (i1 < n)
+ {
+ int c1 = fetch_string_char_advance_no_check (string1, &i1, &i1_byte);
+ int c2 = SREF (string2, i2++);
+ if (c1 != c2)
+ return c1 < c2 ? Qt : Qnil;
+ }
+ return i1 < SCHARS (string2) ? Qt : Qnil;
+ }
+ else
+ {
+ /* string1 unibyte, string2 multibyte */
+ ptrdiff_t i1 = 0, i2 = 0, i2_byte = 0;
+ while (i1 < n)
+ {
+ int c1 = SREF (string1, i1++);
+ int c2 = fetch_string_char_advance_no_check (string2, &i2, &i2_byte);
+ if (c1 != c2)
+ return c1 < c2 ? Qt : Qnil;
+ }
+ return i1 < SCHARS (string2) ? Qt : Qnil;
}
- return i1 < SCHARS (string2) ? Qt : Qnil;
}
DEFUN ("string-version-lessp", Fstring_version_lessp,
@@ -610,7 +640,10 @@ DEFUN ("append", Fappend, Sappend, 0, MANY, 0,
doc: /* Concatenate all the arguments and make the result a list.
The result is a list whose elements are the elements of all the arguments.
Each argument may be a list, vector or string.
-The last argument is not copied, just used as the tail of the new list.
+
+All arguments except the last argument are copied. The last argument
+is just used as the tail of the new list.
+
usage: (append &rest SEQUENCES) */)
(ptrdiff_t nargs, Lisp_Object *args)
{
@@ -1412,6 +1445,7 @@ are shared, however.
Elements of ALIST that are not conses are also shared. */)
(Lisp_Object alist)
{
+ CHECK_LIST (alist);
if (NILP (alist))
return alist;
alist = Fcopy_sequence (alist);
@@ -1563,10 +1597,21 @@ If N is zero or negative, return nil.
If N is greater or equal to the length of LIST, return LIST (or a copy). */)
(Lisp_Object n, Lisp_Object list)
{
- CHECK_FIXNUM (n);
- EMACS_INT m = XFIXNUM (n);
- if (m <= 0)
- return Qnil;
+ EMACS_INT m;
+ if (FIXNUMP (n))
+ {
+ m = XFIXNUM (n);
+ if (m <= 0)
+ return Qnil;
+ }
+ else if (BIGNUMP (n))
+ {
+ if (mpz_sgn (*xbignum_val (n)) < 0)
+ return Qnil;
+ m = MOST_POSITIVE_FIXNUM;
+ }
+ else
+ wrong_type_argument (Qintegerp, n);
CHECK_LIST (list);
if (NILP (list))
return Qnil;
@@ -1594,10 +1639,21 @@ If N is greater or equal to the length of LIST, return LIST unmodified.
Otherwise, return LIST after truncating it. */)
(Lisp_Object n, Lisp_Object list)
{
- CHECK_FIXNUM (n);
- EMACS_INT m = XFIXNUM (n);
- if (m <= 0)
- return Qnil;
+ EMACS_INT m;
+ if (FIXNUMP (n))
+ {
+ m = XFIXNUM (n);
+ if (m <= 0)
+ return Qnil;
+ }
+ else if (BIGNUMP (n))
+ {
+ if (mpz_sgn (*xbignum_val (n)) < 0)
+ return Qnil;
+ m = MOST_POSITIVE_FIXNUM;
+ }
+ else
+ wrong_type_argument (Qintegerp, n);
CHECK_LIST (list);
Lisp_Object tail = list;
--m;
@@ -2908,15 +2964,37 @@ FUNCTION must be a function of one argument, and must return a value
return empty_unibyte_string;
Lisp_Object *args;
SAFE_ALLOCA_LISP (args, args_alloc);
+ if (EQ (function, Qidentity))
+ {
+ /* Fast path when no function call is necessary. */
+ if (CONSP (sequence))
+ {
+ Lisp_Object src = sequence;
+ Lisp_Object *dst = args;
+ do
+ {
+ *dst++ = XCAR (src);
+ src = XCDR (src);
+ }
+ while (!NILP (src));
+ goto concat;
+ }
+ else if (VECTORP (sequence))
+ {
+ memcpy (args, XVECTOR (sequence)->contents, leni * sizeof *args);
+ goto concat;
+ }
+ }
ptrdiff_t nmapped = mapcar1 (leni, args, function, sequence);
- ptrdiff_t nargs = 2 * nmapped - 1;
eassert (nmapped == leni);
+ concat: ;
+ ptrdiff_t nargs = args_alloc;
if (NILP (separator) || (STRINGP (separator) && SCHARS (separator) == 0))
- nargs = nmapped;
+ nargs = leni;
else
{
- for (ptrdiff_t i = nmapped - 1; i > 0; i--)
+ for (ptrdiff_t i = leni - 1; i > 0; i--)
args[i + i] = args[i];
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
}
-/* This part (through the next ^L) is still experimental and not
- tested much. We may drastically change codes. */
-
-/* OTF handler. */
-
-#if 0
-
-#define LGSTRING_HEADER_SIZE 6
-#define LGSTRING_GLYPH_SIZE 8
-
-static int
-check_gstring (Lisp_Object gstring)
-{
- Lisp_Object val;
- ptrdiff_t i;
- int j;
-
- CHECK_VECTOR (gstring);
- val = AREF (gstring, 0);
- CHECK_VECTOR (val);
- if (ASIZE (val) < LGSTRING_HEADER_SIZE)
- goto err;
- CHECK_FONT_OBJECT (LGSTRING_FONT (gstring));
- if (!NILP (LGSTRING_SLOT (gstring, LGSTRING_IX_LBEARING)))
- CHECK_FIXNUM (LGSTRING_SLOT (gstring, LGSTRING_IX_LBEARING));
- if (!NILP (LGSTRING_SLOT (gstring, LGSTRING_IX_RBEARING)))
- CHECK_FIXNUM (LGSTRING_SLOT (gstring, LGSTRING_IX_RBEARING));
- if (!NILP (LGSTRING_SLOT (gstring, LGSTRING_IX_WIDTH)))
- CHECK_FIXNAT (LGSTRING_SLOT (gstring, LGSTRING_IX_WIDTH));
- if (!NILP (LGSTRING_SLOT (gstring, LGSTRING_IX_ASCENT)))
- CHECK_FIXNUM (LGSTRING_SLOT (gstring, LGSTRING_IX_ASCENT));
- if (!NILP (LGSTRING_SLOT (gstring, LGSTRING_IX_ASCENT)))
- CHECK_FIXNUM (LGSTRING_SLOT (gstring, LGSTRING_IX_ASCENT));
-
- for (i = 0; i < LGSTRING_GLYPH_LEN (gstring); i++)
- {
- val = LGSTRING_GLYPH (gstring, i);
- CHECK_VECTOR (val);
- if (ASIZE (val) < LGSTRING_GLYPH_SIZE)
- goto err;
- if (NILP (AREF (val, LGLYPH_IX_CHAR)))
- break;
- CHECK_FIXNAT (AREF (val, LGLYPH_IX_FROM));
- CHECK_FIXNAT (AREF (val, LGLYPH_IX_TO));
- CHECK_CHARACTER (AREF (val, LGLYPH_IX_CHAR));
- if (!NILP (AREF (val, LGLYPH_IX_CODE)))
- CHECK_FIXNAT (AREF (val, LGLYPH_IX_CODE));
- if (!NILP (AREF (val, LGLYPH_IX_WIDTH)))
- CHECK_FIXNAT (AREF (val, LGLYPH_IX_WIDTH));
- if (!NILP (AREF (val, LGLYPH_IX_ADJUSTMENT)))
- {
- val = AREF (val, LGLYPH_IX_ADJUSTMENT);
- CHECK_VECTOR (val);
- if (ASIZE (val) < 3)
- goto err;
- for (j = 0; j < 3; j++)
- CHECK_FIXNUM (AREF (val, j));
- }
- }
- return i;
- err:
- error ("Invalid glyph-string format");
- return -1;
-}
-
-static void
-check_otf_features (Lisp_Object otf_features)
-{
- Lisp_Object val;
-
- CHECK_CONS (otf_features);
- CHECK_SYMBOL (XCAR (otf_features));
- otf_features = XCDR (otf_features);
- CHECK_CONS (otf_features);
- CHECK_SYMBOL (XCAR (otf_features));
- otf_features = XCDR (otf_features);
- for (val = Fcar (otf_features); CONSP (val); val = XCDR (val))
- {
- CHECK_SYMBOL (XCAR (val));
- if (SBYTES (SYMBOL_NAME (XCAR (val))) > 4)
- error ("Invalid OTF GSUB feature: %s",
- SDATA (SYMBOL_NAME (XCAR (val))));
- }
- otf_features = XCDR (otf_features);
- for (val = Fcar (otf_features); CONSP (val); val = XCDR (val))
- {
- CHECK_SYMBOL (XCAR (val));
- if (SBYTES (SYMBOL_NAME (XCAR (val))) > 4)
- error ("Invalid OTF GPOS feature: %s",
- SDATA (SYMBOL_NAME (XCAR (val))));
- }
-}
-
-#ifdef HAVE_LIBOTF
-#include <otf.h>
-
-Lisp_Object otf_list;
-
-static Lisp_Object
-otf_tag_symbol (OTF_Tag tag)
-{
- char name[5];
-
- OTF_tag_name (tag, name);
- return Fintern (make_unibyte_string (name, 4), Qnil);
-}
-
-static OTF *
-otf_open (Lisp_Object file)
-{
- Lisp_Object val = Fassoc (file, otf_list, Qnil);
- OTF *otf;
-
- if (! NILP (val))
- otf = xmint_pointer (XCDR (val));
- else
- {
- otf = STRINGP (file) ? OTF_open (SSDATA (file)) : NULL;
- val = make_mint_ptr (otf);
- otf_list = Fcons (Fcons (file, val), otf_list);
- }
- return otf;
-}
-
-
-/* Return a list describing which scripts/languages FONT supports by
- which GSUB/GPOS features of OpenType tables. See the comment of
- (struct font_driver).otf_capability. */
-
-Lisp_Object
-font_otf_capability (struct font *font)
-{
- OTF *otf;
- Lisp_Object capability = Fcons (Qnil, Qnil);
- int i;
-
- otf = otf_open (font->props[FONT_FILE_INDEX]);
- if (! otf)
- return Qnil;
- for (i = 0; i < 2; i++)
- {
- OTF_GSUB_GPOS *gsub_gpos;
- Lisp_Object script_list = Qnil;
- int j;
-
- if (OTF_get_features (otf, i == 0) < 0)
- continue;
- gsub_gpos = i == 0 ? otf->gsub : otf->gpos;
- for (j = gsub_gpos->ScriptList.ScriptCount - 1; j >= 0; j--)
- {
- OTF_Script *script = gsub_gpos->ScriptList.Script + j;
- Lisp_Object langsys_list = Qnil;
- Lisp_Object script_tag = otf_tag_symbol (script->ScriptTag);
- int k;
-
- for (k = script->LangSysCount; k >= 0; k--)
- {
- OTF_LangSys *langsys;
- Lisp_Object feature_list = Qnil;
- Lisp_Object langsys_tag;
- int l;
-
- if (k == script->LangSysCount)
- {
- langsys = &script->DefaultLangSys;
- langsys_tag = Qnil;
- }
- else
- {
- langsys = script->LangSys + k;
- langsys_tag
- = otf_tag_symbol (script->LangSysRecord[k].LangSysTag);
- }
- for (l = langsys->FeatureCount - 1; l >= 0; l--)
- {
- OTF_Feature *feature
- = gsub_gpos->FeatureList.Feature + langsys->FeatureIndex[l];
- Lisp_Object feature_tag
- = otf_tag_symbol (feature->FeatureTag);
-
- feature_list = Fcons (feature_tag, feature_list);
- }
- langsys_list = Fcons (Fcons (langsys_tag, feature_list),
- langsys_list);
- }
- script_list = Fcons (Fcons (script_tag, langsys_list),
- script_list);
- }
-
- if (i == 0)
- XSETCAR (capability, script_list);
- else
- XSETCDR (capability, script_list);
- }
-
- return capability;
-}
-
-/* Parse OTF features in SPEC and write a proper features spec string
- in FEATURES for the call of OTF_drive_gsub/gpos (of libotf). It is
- assured that the sufficient memory has already allocated for
- FEATURES. */
-
-static void
-generate_otf_features (Lisp_Object spec, char *features)
-{
- Lisp_Object val;
- char *p;
- bool asterisk;
-
- p = features;
- *p = '\0';
- for (asterisk = 0; CONSP (spec); spec = XCDR (spec))
- {
- val = XCAR (spec);
- CHECK_SYMBOL (val);
- if (p > features)
- *p++ = ',';
- if (SREF (SYMBOL_NAME (val), 0) == '*')
- {
- asterisk = 1;
- *p++ = '*';
- }
- else if (! asterisk)
- {
- val = SYMBOL_NAME (val);
- p += esprintf (p, "%s", SDATA (val));
- }
- else
- {
- val = SYMBOL_NAME (val);
- p += esprintf (p, "~%s", SDATA (val));
- }
- }
- if (CONSP (spec))
- error ("OTF spec too long");
-}
-
-Lisp_Object
-font_otf_DeviceTable (OTF_DeviceTable *device_table)
-{
- int len = device_table->StartSize - device_table->EndSize + 1;
-
- return Fcons (make_fixnum (len),
- make_unibyte_string (device_table->DeltaValue, len));
-}
-
-Lisp_Object
-font_otf_ValueRecord (int value_format, OTF_ValueRecord *value_record)
-{
- Lisp_Object val = make_nil_vector (8);
-
- if (value_format & OTF_XPlacement)
- ASET (val, 0, make_fixnum (value_record->XPlacement));
- if (value_format & OTF_YPlacement)
- ASET (val, 1, make_fixnum (value_record->YPlacement));
- if (value_format & OTF_XAdvance)
- ASET (val, 2, make_fixnum (value_record->XAdvance));
- if (value_format & OTF_YAdvance)
- ASET (val, 3, make_fixnum (value_record->YAdvance));
- if (value_format & OTF_XPlaDevice)
- ASET (val, 4, font_otf_DeviceTable (&value_record->XPlaDevice));
- if (value_format & OTF_YPlaDevice)
- ASET (val, 4, font_otf_DeviceTable (&value_record->YPlaDevice));
- if (value_format & OTF_XAdvDevice)
- ASET (val, 4, font_otf_DeviceTable (&value_record->XAdvDevice));
- if (value_format & OTF_YAdvDevice)
- ASET (val, 4, font_otf_DeviceTable (&value_record->YAdvDevice));
- return val;
-}
-
-Lisp_Object
-font_otf_Anchor (OTF_Anchor *anchor)
-{
- Lisp_Object val = make_nil_vector (anchor->AnchorFormat + 1);
- ASET (val, 0, make_fixnum (anchor->XCoordinate));
- ASET (val, 1, make_fixnum (anchor->YCoordinate));
- if (anchor->AnchorFormat == 2)
- ASET (val, 2, make_fixnum (anchor->f.f1.AnchorPoint));
- else
- {
- ASET (val, 3, font_otf_DeviceTable (&anchor->f.f2.XDeviceTable));
- ASET (val, 4, font_otf_DeviceTable (&anchor->f.f2.YDeviceTable));
- }
- return val;
-}
-#endif /* HAVE_LIBOTF */
-#endif /* 0 */
-
-
/* Font sorting. */
static double
@@ -4041,7 +3751,7 @@ which kind of font it is. It must be one of `font-spec', `font-entity',
return (FONT_ENTITY_P (object) ? Qt : Qnil);
if (EQ (extra_type, Qfont_object))
return (FONT_OBJECT_P (object) ? Qt : Qnil);
- wrong_type_argument (intern ("font-extra-type"), extra_type);
+ wrong_type_argument (Qfont_extra_type, extra_type); ;
}
DEFUN ("font-spec", Ffont_spec, Sfont_spec, 0, MANY, 0,
@@ -4678,6 +4388,7 @@ GSTRING. */)
from = LGLYPH_FROM (glyph);
to = LGLYPH_TO (glyph);
}
+ composition_gstring_adjust_zero_width (gstring);
return composition_gstring_put_cache (gstring, XFIXNUM (n));
shaper_error:
@@ -4728,7 +4439,8 @@ where
that apply to POSITION. POSITION may be nil, in which case,
FONT-SPEC is the font for displaying the character CH with the
default face. GLYPH-CODE is the glyph code in the font to use for
- the character, as an integer.
+ the character, it is a fixnum, if it is small enough, otherwise a
+ bignum.
For a text terminal, return a nonnegative integer glyph code for
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,
return Fcons (font_object, INT_TO_INTEGER (code));
}
+
+/* This part (through the next ^L) is still experimental and not
+ tested much. We may drastically change codes. */
+
+/* This code implements support for extracting OTF features of a font
+ and exposing them to Lisp, including application of those features
+ to arbitrary stretches of text. FIXME: it would be good to finish
+ this work and have this in Emacs. */
+
+/* OTF handler. */
+
#if 0
+#define LGSTRING_HEADER_SIZE 6
+#define LGSTRING_GLYPH_SIZE 8
+
+static int
+check_gstring (Lisp_Object gstring)
+{
+ Lisp_Object val;
+ ptrdiff_t i;
+ int j;
+
+ CHECK_VECTOR (gstring);
+ val = AREF (gstring, 0);
+ CHECK_VECTOR (val);
+ if (ASIZE (val) < LGSTRING_HEADER_SIZE)
+ goto err;
+ CHECK_FONT_OBJECT (LGSTRING_FONT (gstring));
+ if (!NILP (LGSTRING_SLOT (gstring, LGSTRING_IX_LBEARING)))
+ CHECK_FIXNUM (LGSTRING_SLOT (gstring, LGSTRING_IX_LBEARING));
+ if (!NILP (LGSTRING_SLOT (gstring, LGSTRING_IX_RBEARING)))
+ CHECK_FIXNUM (LGSTRING_SLOT (gstring, LGSTRING_IX_RBEARING));
+ if (!NILP (LGSTRING_SLOT (gstring, LGSTRING_IX_WIDTH)))
+ CHECK_FIXNAT (LGSTRING_SLOT (gstring, LGSTRING_IX_WIDTH));
+ if (!NILP (LGSTRING_SLOT (gstring, LGSTRING_IX_ASCENT)))
+ CHECK_FIXNUM (LGSTRING_SLOT (gstring, LGSTRING_IX_ASCENT));
+ if (!NILP (LGSTRING_SLOT (gstring, LGSTRING_IX_ASCENT)))
+ CHECK_FIXNUM (LGSTRING_SLOT (gstring, LGSTRING_IX_ASCENT));
+
+ for (i = 0; i < LGSTRING_GLYPH_LEN (gstring); i++)
+ {
+ val = LGSTRING_GLYPH (gstring, i);
+ CHECK_VECTOR (val);
+ if (ASIZE (val) < LGSTRING_GLYPH_SIZE)
+ goto err;
+ if (NILP (AREF (val, LGLYPH_IX_CHAR)))
+ break;
+ CHECK_FIXNAT (AREF (val, LGLYPH_IX_FROM));
+ CHECK_FIXNAT (AREF (val, LGLYPH_IX_TO));
+ CHECK_CHARACTER (AREF (val, LGLYPH_IX_CHAR));
+ if (!NILP (AREF (val, LGLYPH_IX_CODE)))
+ CHECK_FIXNAT (AREF (val, LGLYPH_IX_CODE));
+ if (!NILP (AREF (val, LGLYPH_IX_WIDTH)))
+ CHECK_FIXNAT (AREF (val, LGLYPH_IX_WIDTH));
+ if (!NILP (AREF (val, LGLYPH_IX_ADJUSTMENT)))
+ {
+ val = AREF (val, LGLYPH_IX_ADJUSTMENT);
+ CHECK_VECTOR (val);
+ if (ASIZE (val) < 3)
+ goto err;
+ for (j = 0; j < 3; j++)
+ CHECK_FIXNUM (AREF (val, j));
+ }
+ }
+ return i;
+ err:
+ error ("Invalid glyph-string format");
+ return -1;
+}
+
+static void
+check_otf_features (Lisp_Object otf_features)
+{
+ Lisp_Object val;
+
+ CHECK_CONS (otf_features);
+ CHECK_SYMBOL (XCAR (otf_features));
+ otf_features = XCDR (otf_features);
+ CHECK_CONS (otf_features);
+ CHECK_SYMBOL (XCAR (otf_features));
+ otf_features = XCDR (otf_features);
+ for (val = Fcar (otf_features); CONSP (val); val = XCDR (val))
+ {
+ CHECK_SYMBOL (XCAR (val));
+ if (SBYTES (SYMBOL_NAME (XCAR (val))) > 4)
+ error ("Invalid OTF GSUB feature: %s",
+ SDATA (SYMBOL_NAME (XCAR (val))));
+ }
+ otf_features = XCDR (otf_features);
+ for (val = Fcar (otf_features); CONSP (val); val = XCDR (val))
+ {
+ CHECK_SYMBOL (XCAR (val));
+ if (SBYTES (SYMBOL_NAME (XCAR (val))) > 4)
+ error ("Invalid OTF GPOS feature: %s",
+ SDATA (SYMBOL_NAME (XCAR (val))));
+ }
+}
+
+#ifdef HAVE_LIBOTF
+#include <otf.h>
+
+Lisp_Object otf_list;
+
+static Lisp_Object
+otf_tag_symbol (OTF_Tag tag)
+{
+ char name[5];
+
+ OTF_tag_name (tag, name);
+ return Fintern (make_unibyte_string (name, 4), Qnil);
+}
+
+static OTF *
+otf_open (Lisp_Object file)
+{
+ Lisp_Object val = Fassoc (file, otf_list, Qnil);
+ OTF *otf;
+
+ if (! NILP (val))
+ otf = xmint_pointer (XCDR (val));
+ else
+ {
+ otf = STRINGP (file) ? OTF_open (SSDATA (file)) : NULL;
+ val = make_mint_ptr (otf);
+ otf_list = Fcons (Fcons (file, val), otf_list);
+ }
+ return otf;
+}
+
+
+/* Return a list describing which scripts/languages FONT supports by
+ which GSUB/GPOS features of OpenType tables. See the comment of
+ (struct font_driver).otf_capability. */
+
+Lisp_Object
+font_otf_capability (struct font *font)
+{
+ OTF *otf;
+ Lisp_Object capability = Fcons (Qnil, Qnil);
+ int i;
+
+ otf = otf_open (font->props[FONT_FILE_INDEX]);
+ if (! otf)
+ return Qnil;
+ for (i = 0; i < 2; i++)
+ {
+ OTF_GSUB_GPOS *gsub_gpos;
+ Lisp_Object script_list = Qnil;
+ int j;
+
+ if (OTF_get_features (otf, i == 0) < 0)
+ continue;
+ gsub_gpos = i == 0 ? otf->gsub : otf->gpos;
+ for (j = gsub_gpos->ScriptList.ScriptCount - 1; j >= 0; j--)
+ {
+ OTF_Script *script = gsub_gpos->ScriptList.Script + j;
+ Lisp_Object langsys_list = Qnil;
+ Lisp_Object script_tag = otf_tag_symbol (script->ScriptTag);
+ int k;
+
+ for (k = script->LangSysCount; k >= 0; k--)
+ {
+ OTF_LangSys *langsys;
+ Lisp_Object feature_list = Qnil;
+ Lisp_Object langsys_tag;
+ int l;
+
+ if (k == script->LangSysCount)
+ {
+ langsys = &script->DefaultLangSys;
+ langsys_tag = Qnil;
+ }
+ else
+ {
+ langsys = script->LangSys + k;
+ langsys_tag
+ = otf_tag_symbol (script->LangSysRecord[k].LangSysTag);
+ }
+ for (l = langsys->FeatureCount - 1; l >= 0; l--)
+ {
+ OTF_Feature *feature
+ = gsub_gpos->FeatureList.Feature + langsys->FeatureIndex[l];
+ Lisp_Object feature_tag
+ = otf_tag_symbol (feature->FeatureTag);
+
+ feature_list = Fcons (feature_tag, feature_list);
+ }
+ langsys_list = Fcons (Fcons (langsys_tag, feature_list),
+ langsys_list);
+ }
+ script_list = Fcons (Fcons (script_tag, langsys_list),
+ script_list);
+ }
+
+ if (i == 0)
+ XSETCAR (capability, script_list);
+ else
+ XSETCDR (capability, script_list);
+ }
+
+ return capability;
+}
+
+/* Parse OTF features in SPEC and write a proper features spec string
+ in FEATURES for the call of OTF_drive_gsub/gpos (of libotf). It is
+ assured that the sufficient memory has already allocated for
+ FEATURES. */
+
+static void
+generate_otf_features (Lisp_Object spec, char *features)
+{
+ Lisp_Object val;
+ char *p;
+ bool asterisk;
+
+ p = features;
+ *p = '\0';
+ for (asterisk = 0; CONSP (spec); spec = XCDR (spec))
+ {
+ val = XCAR (spec);
+ CHECK_SYMBOL (val);
+ if (p > features)
+ *p++ = ',';
+ if (SREF (SYMBOL_NAME (val), 0) == '*')
+ {
+ asterisk = 1;
+ *p++ = '*';
+ }
+ else if (! asterisk)
+ {
+ val = SYMBOL_NAME (val);
+ p += esprintf (p, "%s", SDATA (val));
+ }
+ else
+ {
+ val = SYMBOL_NAME (val);
+ p += esprintf (p, "~%s", SDATA (val));
+ }
+ }
+ if (CONSP (spec))
+ error ("OTF spec too long");
+}
+
+Lisp_Object
+font_otf_DeviceTable (OTF_DeviceTable *device_table)
+{
+ int len = device_table->StartSize - device_table->EndSize + 1;
+
+ return Fcons (make_fixnum (len),
+ make_unibyte_string (device_table->DeltaValue, len));
+}
+
+Lisp_Object
+font_otf_ValueRecord (int value_format, OTF_ValueRecord *value_record)
+{
+ Lisp_Object val = make_nil_vector (8);
+
+ if (value_format & OTF_XPlacement)
+ ASET (val, 0, make_fixnum (value_record->XPlacement));
+ if (value_format & OTF_YPlacement)
+ ASET (val, 1, make_fixnum (value_record->YPlacement));
+ if (value_format & OTF_XAdvance)
+ ASET (val, 2, make_fixnum (value_record->XAdvance));
+ if (value_format & OTF_YAdvance)
+ ASET (val, 3, make_fixnum (value_record->YAdvance));
+ if (value_format & OTF_XPlaDevice)
+ ASET (val, 4, font_otf_DeviceTable (&value_record->XPlaDevice));
+ if (value_format & OTF_YPlaDevice)
+ ASET (val, 4, font_otf_DeviceTable (&value_record->YPlaDevice));
+ if (value_format & OTF_XAdvDevice)
+ ASET (val, 4, font_otf_DeviceTable (&value_record->XAdvDevice));
+ if (value_format & OTF_YAdvDevice)
+ ASET (val, 4, font_otf_DeviceTable (&value_record->YAdvDevice));
+ return val;
+}
+
+Lisp_Object
+font_otf_Anchor (OTF_Anchor *anchor)
+{
+ Lisp_Object val = make_nil_vector (anchor->AnchorFormat + 1);
+ ASET (val, 0, make_fixnum (anchor->XCoordinate));
+ ASET (val, 1, make_fixnum (anchor->YCoordinate));
+ if (anchor->AnchorFormat == 2)
+ ASET (val, 2, make_fixnum (anchor->f.f1.AnchorPoint));
+ else
+ {
+ ASET (val, 3, font_otf_DeviceTable (&anchor->f.f2.XDeviceTable));
+ ASET (val, 4, font_otf_DeviceTable (&anchor->f.f2.YDeviceTable));
+ }
+ return val;
+}
+#endif /* HAVE_LIBOTF */
+
DEFUN ("font-drive-otf", Ffont_drive_otf, Sfont_drive_otf, 6, 6, 0,
doc: /* Apply OpenType features on glyph-string GSTRING-IN.
OTF-FEATURES specifies which features to apply in this format:
@@ -4938,6 +4942,7 @@ corresponding character. */)
}
#endif /* 0 */
+
#ifdef FONT_DEBUG
DEFUN ("open-font", Fopen_font, Sopen_font, 1, 3, 0,
@@ -5555,6 +5560,10 @@ syms_of_font (void)
DEFSYM (Qopentype, "opentype");
+ /* Currently used by hbfont.c, which has no syms_of_hbfont function
+ of its own. */
+ DEFSYM (Qcanonical_combining_class, "canonical-combining-class");
+
/* Important character set symbols. */
DEFSYM (Qascii_0, "ascii-0");
DEFSYM (Qiso8859_1, "iso8859-1");
@@ -5594,6 +5603,7 @@ syms_of_font (void)
DEFSYM (QL2R, "L2R");
DEFSYM (QR2L, "R2L");
+ DEFSYM (Qfont_extra_type, "font-extra-type");
DEFSYM (Qfont_driver_superseded_by, "font-driver-superseded-by");
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
/* Optional.
Draw glyphs between FROM and TO of S->char2b at (X Y) pixel
- position of frame F with S->FACE and S->GC. If WITH_BACKGROUND,
+ position of frame S->f with S->face and S->gc. If WITH_BACKGROUND,
fill the background in advance. It is assured that WITH_BACKGROUND
is false when (FROM > 0 || TO < S->nchars). */
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,
int face_id;
int id;
- eassert (fontset_id_valid_p (face->fontset));
-
if (ASCII_CHAR_P (c) || CHAR_BYTE8_P (c))
return face->ascii_face->id;
@@ -969,6 +967,7 @@ face_for_char (struct frame *f, struct face *face, int c,
#endif
}
+ eassert (fontset_id_valid_p (face->fontset));
fontset = FONTSET_FROM_ID (face->fontset);
eassert (!BASE_FONTSET_P (fontset));
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. */);
#endif
DEFVAR_LISP ("default-frame-alist", Vdefault_frame_alist,
- doc: /* Alist of default values for frame creation.
+ doc: /* Alist of default values of frame parameters for frame creation.
These may be set in your init file, like this:
(setq default-frame-alist \\='((width . 80) (height . 55) (menu-bar-lines . 1)))
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)
cairo_glyph_t stack_glyph;
font->min_width = font->max_width = 0;
font->average_width = font->space_width = 0;
+ int n = 0;
for (char c = 32; c < 127; c++)
{
cairo_glyph_t *glyphs = &stack_glyph;
@@ -252,17 +253,20 @@ ftcrfont_open (struct frame *f, Lisp_Object entity, int pixel_size)
stack_glyph.index = 0;
}
int this_width = ftcrfont_glyph_extents (font, stack_glyph.index, NULL);
- if (this_width > 0
- && (! font->min_width
- || font->min_width > this_width))
- font->min_width = this_width;
- if (this_width > font->max_width)
- font->max_width = this_width;
- if (c == 32)
- font->space_width = this_width;
- font->average_width += this_width;
+ if (this_width > 0)
+ {
+ if (! font->min_width || font->min_width > this_width)
+ font->min_width = this_width;
+ if (this_width > font->max_width)
+ font->max_width = this_width;
+ if (c == 32)
+ font->space_width = this_width;
+ font->average_width += this_width;
+ n++;
+ }
}
- font->average_width /= 95;
+ if (n)
+ font->average_width /= n;
cairo_scaled_font_extents (ftcrfont_info->cr_scaled_font, &extents);
font->ascent = lround (extents.ascent);
@@ -679,8 +683,12 @@ ftcrhbfont_begin_hb_font (struct font *font, double *position_unit)
hb_font_t *hb_font = fthbfont_begin_hb_font (font, position_unit);
/* HarfBuzz 5 correctly scales bitmap-only fonts without position
unit adjustment.
- (https://github.com/harfbuzz/harfbuzz/issues/489) */
- if (!hb_version_atleast (5, 0, 0)
+ (https://github.com/harfbuzz/harfbuzz/issues/489)
+
+ Update: HarfBuzz 5.2.0 no longer does this for an hb_font_t font
+ object created from a given FT_Face.
+ (https://github.com/harfbuzz/harfbuzz/issues/3788) */
+ if ((hb_version_atleast (5, 2, 0) || !hb_version_atleast (5, 0, 0))
&& ftcrfont_info->bitmap_position_unit)
*position_unit = ftcrfont_info->bitmap_position_unit;
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/>. */
#include <Font.h>
#include <Rect.h>
#include <AffineTransform.h>
+#include <FindDirectory.h>
+#include <Path.h>
+#include <File.h>
+#include <Message.h>
+#include <OS.h>
+#include <Locker.h>
+#include <NodeMonitor.h>
+#include <Looper.h>
#include <cstring>
#include <cmath>
@@ -39,15 +47,57 @@ struct font_object_cache_bucket
static struct font_object_cache_bucket *font_object_cache[2048];
+/* The current global monospace family and style. */
+static char *fixed_family, *fixed_style;
+
+/* The current global variable-width family and style. */
+static char *default_family, *default_style;
+
+/* The sizes of each of those fonts. */
+static float default_size, fixed_size;
+
+/* The locker controlling access to those variables. */
+static BLocker default_locker;
+
/* Haiku doesn't expose font language data in BFont objects. Thus, we
select a few representative characters for each supported `:lang'
(currently Chinese, Korean and Japanese,) and test for those
instead. */
static int language_code_points[MAX_LANGUAGE][3] =
- {{20154, 20754, 22996}, /* Chinese. */
- {51312, 49440, 44544}, /* Korean. */
- {26085, 26412, 12371}, /* Japanese. */};
+ {
+ {20154, 20754, 22996}, /* Chinese. */
+ {51312, 49440, 44544}, /* Korean. */
+ {26085, 26412, 12371}, /* Japanese. */
+ };
+
+static void be_send_font_settings (void);
+
+/* Looper used to track changes to system-wide font settings. */
+class EmacsFontMonitorLooper : public BLooper
+{
+ void
+ MessageReceived (BMessage *msg)
+ {
+ int32 opcode;
+
+ if (msg->what != B_NODE_MONITOR)
+ return;
+
+ if (msg->FindInt32 ("opcode", &opcode) != B_OK)
+ return;
+
+ if (opcode != B_STAT_CHANGED)
+ return;
+
+ /* Wait a little for any message to be completely written after
+ the file's modification time changes. */
+ snooze (10000);
+
+ /* Read and apply font settings. */
+ be_send_font_settings ();
+ }
+};
static unsigned int
hash_string (const char *name_or_style)
@@ -288,12 +338,15 @@ BFont_nchar_bounds (void *font, const char *mb_str, int *advance,
}
static void
-font_style_to_flags (char *st, struct haiku_font_pattern *pattern)
+font_style_to_flags (const char *style_string,
+ struct haiku_font_pattern *pattern)
{
- char *style = strdup (st);
+ char *style;
char *token;
int tok = 0;
+ style = strdup (style_string);
+
if (!style)
return;
@@ -385,7 +438,8 @@ font_style_to_flags (char *st, struct haiku_font_pattern *pattern)
pattern->specified &= ~FSPEC_WEIGHT;
pattern->specified &= ~FSPEC_WIDTH;
pattern->specified |= FSPEC_STYLE;
- std::strncpy ((char *) &pattern->style, st,
+ std::strncpy ((char *) &pattern->style,
+ style_string,
sizeof pattern->style - 1);
pattern->style[sizeof pattern->style - 1] = '\0';
}
@@ -887,7 +941,7 @@ be_evict_font_cache (void)
}
void
-be_font_style_to_flags (char *style, struct haiku_font_pattern *pattern)
+be_font_style_to_flags (const char *style, struct haiku_font_pattern *pattern)
{
pattern->specified = 0;
@@ -939,3 +993,217 @@ be_set_font_antialiasing (void *font, bool antialias_p)
? B_FORCE_ANTIALIASING
: B_DISABLE_ANTIALIASING);
}
+
+static void
+be_send_font_settings (void)
+{
+ struct haiku_font_change_event rq;
+ BFile file;
+ BPath path;
+ status_t rc;
+ BMessage message;
+ font_family family;
+ font_style style;
+ const char *new_family, *new_style;
+ float new_size;
+
+ rc = find_directory (B_USER_SETTINGS_DIRECTORY, &path);
+
+ if (rc < B_OK)
+ return;
+
+ rc = path.Append ("system/app_server/fonts");
+
+ if (rc < B_OK)
+ return;
+
+ if (file.SetTo (path.Path (), B_READ_ONLY) != B_OK)
+ return;
+
+ if (message.Unflatten (&file) != B_OK)
+ return;
+
+ /* Now, populate with new values. */
+ if (!default_locker.Lock ())
+ gui_abort ("Failed to lock font data locker");
+
+ /* Obtain default values. */
+ be_fixed_font->GetFamilyAndStyle (&family, &style);
+ default_size = be_fixed_font->Size ();
+
+ /* And the new values. */
+ new_family = message.GetString ("fixed family", family);
+ new_style = message.GetString ("fixed style", style);
+ new_size = message.GetFloat ("fixed size", default_size);
+
+ /* If it turns out the fixed family changed, send the new family and
+ style. */
+
+ if (!fixed_family || !fixed_style
+ || new_size != fixed_size
+ || strcmp (new_family, fixed_family)
+ || strcmp (new_style, fixed_style))
+ {
+ memset (&rq, 0, sizeof rq);
+ strncpy (rq.new_family, (char *) new_family,
+ sizeof rq.new_family - 1);
+ strncpy (rq.new_style, (char *) new_style,
+ sizeof rq.new_style - 1);
+ rq.new_size = new_size;
+ rq.what = FIXED_FAMILY;
+
+ haiku_write (FONT_CHANGE_EVENT, &rq);
+ }
+
+ if (fixed_family)
+ free (fixed_family);
+
+ if (fixed_style)
+ free (fixed_style);
+
+ fixed_family = strdup (new_family);
+ fixed_style = strdup (new_style);
+ fixed_size = new_size;
+
+ /* Obtain default values. */
+ be_plain_font->GetFamilyAndStyle (&family, &style);
+ default_size = be_plain_font->Size ();
+
+ /* And the new values. */
+ new_family = message.GetString ("plain family", family);
+ new_style = message.GetString ("plain style", style);
+ new_size = message.GetFloat ("plain style", default_size);
+
+ if (!default_family || !default_style
+ || new_size != default_size
+ || strcmp (new_family, default_family)
+ || strcmp (new_style, default_style))
+ {
+ memset (&rq, 0, sizeof rq);
+ strncpy (rq.new_family, (char *) new_family,
+ sizeof rq.new_family - 1);
+ strncpy (rq.new_style, (char *) new_style,
+ sizeof rq.new_style - 1);
+ rq.new_size = new_size;
+ rq.what = DEFAULT_FAMILY;
+
+ haiku_write (FONT_CHANGE_EVENT, &rq);
+ }
+
+ if (default_family)
+ free (default_family);
+
+ if (default_style)
+ free (default_style);
+
+ default_family = strdup (new_family);
+ default_style = strdup (new_style);
+ default_size = new_size;
+
+ default_locker.Unlock ();
+}
+
+/* Begin listening to font settings changes, by installing a node
+ watcher. This relies on the settings file already being present
+ and has several inherent race conditions, but users shouldn't be
+ changing font settings very quickly. */
+
+void
+be_listen_font_settings (void)
+{
+ BPath path;
+ status_t rc;
+ BNode node;
+ node_ref node_ref;
+ EmacsFontMonitorLooper *looper;
+ font_family family;
+ font_style style;
+
+ /* Set up initial values. */
+ be_fixed_font->GetFamilyAndStyle (&family, &style);
+ fixed_family = strdup (family);
+ fixed_style = strdup (style);
+ fixed_size = be_fixed_font->Size ();
+
+ be_plain_font->GetFamilyAndStyle (&family, &style);
+ default_family = strdup (family);
+ default_style = strdup (style);
+ default_size = be_plain_font->Size ();
+
+ rc = find_directory (B_USER_SETTINGS_DIRECTORY, &path);
+
+ if (rc < B_OK)
+ return;
+
+ rc = path.Append ("system/app_server/fonts");
+
+ if (rc < B_OK)
+ return;
+
+ rc = node.SetTo (path.Path ());
+
+ if (rc < B_OK)
+ return;
+
+ if (node.GetNodeRef (&node_ref) < B_OK)
+ return;
+
+ looper = new EmacsFontMonitorLooper;
+
+ if (watch_node (&node_ref, B_WATCH_STAT, looper) < B_OK)
+ {
+ delete looper;
+ return;
+ }
+
+ looper->Run ();
+}
+
+bool
+be_lock_font_defaults (void)
+{
+ return default_locker.Lock ();
+}
+
+void
+be_unlock_font_defaults (void)
+{
+ return default_locker.Unlock ();
+}
+
+const char *
+be_get_font_default (enum haiku_what_font what)
+{
+ switch (what)
+ {
+ case FIXED_FAMILY:
+ return fixed_family;
+
+ case FIXED_STYLE:
+ return fixed_style;
+
+ case DEFAULT_FAMILY:
+ return default_family;
+
+ case DEFAULT_STYLE:
+ return default_style;
+ }
+
+ return NULL;
+}
+
+int
+be_get_font_size (enum haiku_what_font what)
+{
+ switch (what)
+ {
+ case FIXED_FAMILY:
+ return fixed_size;
+
+ case DEFAULT_FAMILY:
+ return default_size;
+
+ default:
+ return 0;
+ }
+}
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)
return sizeof (struct haiku_screen_changed_event);
case CLIPBOARD_CHANGED_EVENT:
return sizeof (struct haiku_clipboard_changed_event);
+ case FONT_CHANGE_EVENT:
+ return sizeof (struct haiku_font_change_event);
}
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/>. */
#include <game/WindowScreen.h>
#include <game/DirectWindow.h>
+#include <storage/FindDirectory.h>
#include <storage/Entry.h>
#include <storage/Path.h>
#include <storage/FilePanel.h>
#include <storage/AppFileInfo.h>
#include <storage/Path.h>
#include <storage/PathFinder.h>
+#include <storage/Node.h>
#include <support/Beep.h>
#include <support/DataIO.h>
@@ -5501,3 +5503,54 @@ be_set_use_frame_synchronization (void *view, bool sync)
vw = (EmacsView *) view;
vw->SetFrameSynchronization (sync);
}
+
+status_t
+be_write_node_message (const char *path, const char *name, void *message)
+{
+ BNode node (path);
+ status_t rc;
+ ssize_t flat, result;
+ char *buffer;
+ BMessage *msg;
+
+ rc = node.InitCheck ();
+ msg = (BMessage *) message;
+
+ if (rc < B_OK)
+ return rc;
+
+ flat = msg->FlattenedSize ();
+ if (flat < B_OK)
+ return flat;
+
+ buffer = new (std::nothrow) char[flat];
+ if (!buffer)
+ return B_NO_MEMORY;
+
+ rc = msg->Flatten (buffer, flat);
+ if (rc < B_OK)
+ {
+ delete[] buffer;
+ return rc;
+ }
+
+ result = node.WriteAttr (name, B_MIME_TYPE, 0,
+ buffer, flat);
+ delete[] buffer;
+
+ if (result < B_OK)
+ return result;
+
+ if (result != flat)
+ return B_ERROR;
+
+ return B_OK;
+}
+
+void
+be_send_message (const char *app_id, void *message)
+{
+ BMessenger messenger (app_id);
+
+ messenger.SendMessage ((BMessage *) message);
+}
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
SCREEN_CHANGED_EVENT,
MENU_BAR_LEFT,
CLIPBOARD_CHANGED_EVENT,
+ FONT_CHANGE_EVENT,
};
struct haiku_clipboard_changed_event
@@ -442,6 +443,27 @@ struct haiku_menu_bar_state_event
void *window;
};
+enum haiku_what_font
+ {
+ FIXED_FAMILY,
+ FIXED_STYLE,
+ DEFAULT_FAMILY,
+ DEFAULT_STYLE,
+ };
+
+struct haiku_font_change_event
+{
+ /* New family, style and size of the font. */
+ haiku_font_family_or_style new_family;
+ haiku_font_family_or_style new_style;
+ int new_size;
+
+ /* What changed. FIXED_FAMILY means this is the new fixed font.
+ DEFAULT_FAMILY means this is the new plain font. The other enums
+ have no meaning. */
+ enum haiku_what_font what;
+};
+
struct haiku_session_manager_reply
{
bool quit_reply;
@@ -697,7 +719,7 @@ extern int be_get_display_screens (void);
extern bool be_use_subpixel_antialiasing (void);
extern const char *be_find_setting (const char *);
extern haiku_font_family_or_style *be_list_font_families (size_t *);
-extern void be_font_style_to_flags (char *, struct haiku_font_pattern *);
+extern void be_font_style_to_flags (const char *, struct haiku_font_pattern *);
extern void *be_open_font_at_index (int, int, float);
extern void be_set_font_antialiasing (void *, bool);
extern int be_get_ui_color (const char *, uint32_t *);
@@ -724,11 +746,21 @@ extern void be_get_window_decorator_frame (void *, int *, int *, int *, int *);
extern void be_send_move_frame_event (void *);
extern void be_set_window_fullscreen_mode (void *, enum haiku_fullscreen_mode);
+extern status_t be_write_node_message (const char *, const char *, void *);
+extern void be_send_message (const char *, void *);
+
extern void be_lock_window (void *);
extern void be_unlock_window (void *);
extern bool be_get_explicit_workarea (int *, int *, int *, int *);
extern void be_clear_grab_view (void);
extern void be_set_use_frame_synchronization (void *, bool);
+
+extern void be_listen_font_settings (void);
+
+extern bool be_lock_font_defaults (void);
+extern const char *be_get_font_default (enum haiku_what_font);
+extern int be_get_font_size (enum haiku_what_font);
+extern void be_unlock_font_defaults (void);
#ifdef __cplusplus
}
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,
start_timer:
/* Let the tip disappear after timeout seconds. */
- tip_timer = call3 (intern ("run-at-time"), timeout, Qnil,
- intern ("x-hide-tip"));
+ tip_timer = call3 (Qrun_at_time, timeout, Qnil, Qx_hide_tip);
return unbind_to (count, Qnil);
}
@@ -3149,6 +3148,9 @@ syms_of_haikufns (void)
DEFSYM (Qcancel_timer, "cancel-timer");
DEFSYM (Qassq_delete_all, "assq-delete-all");
+ DEFSYM (Qrun_at_time, "run-at-time");
+ DEFSYM (Qx_hide_tip, "x-hide-tip");
+
DEFSYM (Qalways, "always");
DEFSYM (Qnot_useful, "not-useful");
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,
BFont_populate_fixed_family (ptn);
return 1;
}
- else if (EQ (family, intern ("Sans Serif")))
+ else if (EQ (family, QSans_Serif))
{
BFont_populate_plain_family (ptn);
return 1;
@@ -1311,6 +1311,98 @@ in the font selection dialog. */)
QCsize, lsize);
}
+DEFUN ("font-get-system-normal-font", Ffont_get_system_normal_font,
+ Sfont_get_system_normal_font, 0, 0, 0,
+ doc: /* SKIP: real doc in xsettings.c. */)
+ (void)
+{
+ Lisp_Object value;
+ const char *name, *style;
+ struct haiku_font_pattern pattern;
+ Lisp_Object lfamily, lweight, lslant, lwidth, ladstyle;
+ int size;
+
+ if (!be_lock_font_defaults ())
+ return Qnil;
+
+ name = be_get_font_default (DEFAULT_FAMILY);
+ style = be_get_font_default (DEFAULT_STYLE);
+ size = be_get_font_size (DEFAULT_FAMILY);
+
+ be_font_style_to_flags (style, &pattern);
+
+ lfamily = build_string_from_utf8 (name);
+ lweight = (pattern.specified & FSPEC_WEIGHT
+ ? haikufont_weight_to_lisp (pattern.weight) : Qnil);
+ lslant = (pattern.specified & FSPEC_SLANT
+ ? haikufont_slant_to_lisp (pattern.slant) : Qnil);
+ lwidth = (pattern.specified & FSPEC_WIDTH
+ ? haikufont_width_to_lisp (pattern.width) : Qnil);
+ ladstyle = (pattern.specified & FSPEC_STYLE
+ ? intern (pattern.style) : Qnil);
+
+ value = CALLN (Ffont_spec, QCfamily, lfamily,
+ QCweight, lweight, QCslant, lslant,
+ QCwidth, lwidth, QCadstyle, ladstyle,
+ QCsize, make_fixnum (size));
+ be_unlock_font_defaults ();
+
+ return value;
+}
+
+DEFUN ("font-get-system-font", Ffont_get_system_font,
+ Sfont_get_system_font, 0, 0, 0,
+ doc: /* SKIP: real doc in xsettings.c. */)
+ (void)
+{
+ Lisp_Object value;
+ const char *name, *style;
+ struct haiku_font_pattern pattern;
+ Lisp_Object lfamily, lweight, lslant, lwidth, ladstyle;
+ int size;
+
+ if (!be_lock_font_defaults ())
+ return Qnil;
+
+ name = be_get_font_default (FIXED_FAMILY);
+ style = be_get_font_default (FIXED_STYLE);
+ size = be_get_font_size (FIXED_FAMILY);
+
+ be_font_style_to_flags (style, &pattern);
+
+ lfamily = build_string_from_utf8 (name);
+ lweight = (pattern.specified & FSPEC_WEIGHT
+ ? haikufont_weight_to_lisp (pattern.weight) : Qnil);
+ lslant = (pattern.specified & FSPEC_SLANT
+ ? haikufont_slant_to_lisp (pattern.slant) : Qnil);
+ lwidth = (pattern.specified & FSPEC_WIDTH
+ ? haikufont_width_to_lisp (pattern.width) : Qnil);
+ ladstyle = (pattern.specified & FSPEC_STYLE
+ ? intern (pattern.style) : Qnil);
+
+ value = CALLN (Ffont_spec, QCfamily, lfamily,
+ QCweight, lweight, QCslant, lslant,
+ QCwidth, lwidth, QCadstyle, ladstyle,
+ QCsize, make_fixnum (size));
+ be_unlock_font_defaults ();
+
+ return value;
+}
+
+void
+haiku_handle_font_change_event (struct haiku_font_change_event *event,
+ struct input_event *ie)
+{
+ ie->kind = CONFIG_CHANGED_EVENT;
+
+ /* This is the name of the display. */
+ ie->frame_or_window = XCAR (x_display_list->name_list_element);
+
+ /* And this is the font that changed. */
+ ie->arg = (event->what == FIXED_FAMILY
+ ? Qmonospace_font_name : Qfont_name);
+}
+
static void
syms_of_haikufont_for_pdumper (void)
{
@@ -1320,6 +1412,7 @@ syms_of_haikufont_for_pdumper (void)
void
syms_of_haikufont (void)
{
+ DEFSYM (QSans_Serif, "Sans Serif");
DEFSYM (Qfontsize, "fontsize");
DEFSYM (Qfixed, "fixed");
DEFSYM (Qplain, "plain");
@@ -1343,6 +1436,14 @@ syms_of_haikufont (void)
DEFSYM (QCindices, ":indices");
+ DEFSYM (Qmonospace_font_name, "monospace-font-name");
+ DEFSYM (Qfont_name, "font-name");
+ DEFSYM (Qdynamic_setting, "dynamic-setting");
+
+ DEFVAR_BOOL ("font-use-system-font", use_system_font,
+ doc: /* SKIP: real doc in xsettings.c. */);
+ use_system_font = false;
+
#ifdef USE_BE_CAIRO
Fput (Qhaiku, Qfont_driver_superseded_by, Qftcr);
#endif
@@ -1352,6 +1453,12 @@ syms_of_haikufont (void)
staticpro (&font_cache);
defsubr (&Sx_select_font);
+ defsubr (&Sfont_get_system_normal_font);
+ defsubr (&Sfont_get_system_font);
be_init_font_data ();
+
+ /* This tells loadup to load dynamic-setting.el, which handles
+ config-changed events. */
+ Fprovide (Qdynamic_setting, Qnil);
}
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)
t1 = make_float (*(float *) buf);
break;
+ case 'CSTR':
+ /* Is this even possible? */
+ if (!buf_size)
+ buf_size = 1;
+
+ t1 = make_uninit_string (buf_size - 1);
+ memcpy (SDATA (t1), buf, buf_size - 1);
+ break;
+
default:
t1 = make_uninit_string (buf_size);
memcpy (SDATA (t1), buf, buf_size);
@@ -747,6 +756,21 @@ haiku_lisp_to_message (Lisp_Object obj, void *message)
signal_error ("Failed to add bool", data);
break;
+ case 'CSTR':
+ /* C strings must be handled specially, since they
+ include a trailing NULL byte. */
+ CHECK_STRING (data);
+
+ block_input ();
+ rc = be_add_message_data (message, SSDATA (name),
+ type_code, SDATA (data),
+ SBYTES (data) + 1);
+ unblock_input ();
+
+ if (rc)
+ signal_error ("Failed to add", data);
+ break;
+
default:
decode_normally:
CHECK_STRING (data);
@@ -779,6 +803,49 @@ haiku_unwind_drag_message (void *message)
BMessage_delete (message);
}
+static void
+haiku_report_system_error (status_t code, const char *format)
+{
+ switch (code)
+ {
+ case B_BAD_VALUE:
+ error (format, "Bad value");
+ break;
+
+ case B_ENTRY_NOT_FOUND:
+ error (format, "File not found");
+ break;
+
+ case B_PERMISSION_DENIED:
+ error (format, "Permission denied");
+ break;
+
+ case B_LINK_LIMIT:
+ error (format, "Link limit reached");
+ break;
+
+ case B_BUSY:
+ error (format, "Device busy");
+ break;
+
+ case B_NO_MORE_FDS:
+ error (format, "No more file descriptors");
+ break;
+
+ case B_FILE_ERROR:
+ error (format, "File error");
+ break;
+
+ case B_NO_MEMORY:
+ memory_full (SIZE_MAX);
+ break;
+
+ default:
+ error (format, "Unknown error");
+ break;
+ }
+}
+
DEFUN ("haiku-drag-message", Fhaiku_drag_message, Shaiku_drag_message,
2, 4, 0,
doc: /* Begin dragging MESSAGE from FRAME.
@@ -958,6 +1025,66 @@ after it starts. */)
return SAFE_FREE_UNBIND_TO (depth, Qnil);
}
+DEFUN ("haiku-write-node-attribute", Fhaiku_write_node_attribute,
+ Shaiku_write_node_attribute, 3, 3, 0,
+ doc: /* Write a message as a file-system attribute of NODE.
+FILE should be a file name of a file on a Be File System volume, NAME
+should be a string describing the name of the attribute that will be
+written, and MESSAGE will be the attribute written to FILE, as a
+system message in the format accepted by `haiku-drag-message', which
+see. */)
+ (Lisp_Object file, Lisp_Object name, Lisp_Object message)
+{
+ void *be_message;
+ status_t rc;
+ specpdl_ref count;
+
+ CHECK_STRING (file);
+ CHECK_STRING (name);
+
+ file = ENCODE_FILE (file);
+ name = ENCODE_SYSTEM (name);
+
+ be_message = be_create_simple_message ();
+ count = SPECPDL_INDEX ();
+
+ record_unwind_protect_ptr (BMessage_delete, be_message);
+ haiku_lisp_to_message (message, be_message);
+ rc = be_write_node_message (SSDATA (file), SSDATA (name),
+ be_message);
+
+ if (rc < B_OK)
+ haiku_report_system_error (rc, "Failed to set attribute: %s");
+
+ return unbind_to (count, Qnil);
+}
+
+DEFUN ("haiku-send-message", Fhaiku_send_message, Shaiku_send_message,
+ 2, 2, 0,
+ doc: /* Send a system message to PROGRAM.
+PROGRAM must be the name of the application to which the message will
+be sent. MESSAGE is the system message, serialized in the format
+accepted by `haiku-drag-message', that will be sent to the application
+specified by PROGRAM. There is no guarantee that the message will
+arrive after this function is called. */)
+ (Lisp_Object program, Lisp_Object message)
+{
+ specpdl_ref count;
+ void *be_message;
+
+ CHECK_STRING (program);
+ program = ENCODE_SYSTEM (program);
+
+ be_message = be_create_simple_message ();
+ count = SPECPDL_INDEX ();
+
+ record_unwind_protect_ptr (BMessage_delete, be_message);
+ haiku_lisp_to_message (message, be_message);
+ be_send_message (SSDATA (program), be_message);
+
+ return unbind_to (count, Qnil);
+}
+
static void
haiku_dnd_compute_tip_xy (int *root_x, int *root_y)
{
@@ -1191,6 +1318,8 @@ keyboard modifiers currently held down. */);
defsubr (&Shaiku_selection_owner_p);
defsubr (&Shaiku_drag_message);
defsubr (&Shaiku_roster_launch);
+ defsubr (&Shaiku_write_node_attribute);
+ defsubr (&Shaiku_send_message);
haiku_dnd_frame = NULL;
}
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)
font_param = Qnil;
if (NILP (font_param))
- {
- /* System font should take precedence over X resources. We suggest this
- regardless of font-use-system-font because .emacs may not have been
- read yet. */
- struct haiku_font_pattern ptn;
- ptn.specified = 0;
-
- BFont_populate_fixed_family (&ptn);
-
- if (ptn.specified & FSPEC_FAMILY)
- font = font_open_by_name (f, build_unibyte_string (ptn.family));
- }
+ /* System font should take precedence over X resources. We
+ suggest this regardless of font-use-system-font because .emacs
+ may not have been read yet. Returning a font-spec is Haiku
+ specific behavior. */
+ font = font_open_by_spec (f, Ffont_get_system_font ());
if (NILP (font))
font = !NILP (font_param) ? font_param
@@ -4027,6 +4020,11 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit)
inev.kind = SAVE_SESSION_EVENT;
inev.arg = Qt;
break;
+ case FONT_CHANGE_EVENT:
+ /* This generates CONFIG_CHANGED_EVENTs, which are then
+ handled in Lisp. */
+ haiku_handle_font_change_event (buf, &inev);
+ break;
case KEY_UP:
case DUMMY_EVENT:
default:
@@ -4349,7 +4347,7 @@ haiku_term_init (void)
emacs_abort ();
color_file = Fexpand_file_name (build_string ("rgb.txt"),
- Fsymbol_value (intern ("data-directory")));
+ Fsymbol_value (Qdata_directory));
color_map = Fx_load_color_file (color_file);
if (NILP (color_map))
@@ -4417,6 +4415,9 @@ haiku_term_init (void)
dpyinfo->default_name = build_string ("GNU Emacs");
haiku_start_watching_selections ();
+
+ /* Start listening for font configuration changes. */
+ be_listen_font_settings ();
unblock_input ();
return dpyinfo;
@@ -4634,6 +4635,8 @@ syms_of_haikuterm (void)
DEFSYM (Qoption, "option");
DEFSYM (Qcommand, "command");
+ DEFSYM (Qdata_directory, "data-directory");
+
DEFVAR_LISP ("haiku-meta-keysym", Vhaiku_meta_keysym,
doc: /* Which key Emacs uses as the meta modifier.
This is either one of the symbols `shift', `control', `command', and
diff --git a/src/haikuterm.h b/src/haikuterm.h
index b603c0a482f..86274fd42a3 100644
--- a/src/haikuterm.h
+++ b/src/haikuterm.h
@@ -34,6 +34,9 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
#define HAVE_CHAR_CACHE_MAX 65535
+/* This is really defined in haiku_support.h. */
+struct haiku_font_change_event;
+
extern int popup_activated_p;
struct haikufont_info
@@ -361,4 +364,7 @@ extern void haiku_merge_cursor_foreground (struct glyph_string *, unsigned long
unsigned long *);
extern void haiku_handle_selection_clear (struct input_event *);
extern void haiku_start_watching_selections (void);
+extern void haiku_handle_font_change_event (struct haiku_font_change_event *,
+ struct input_event *);
+
#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)
if (!combining_class_loaded)
{
canonical_combining_class_table =
- uniprop_table (intern ("canonical-combining-class"));
+ uniprop_table (Qcanonical_combining_class);
if (NILP (canonical_combining_class_table))
emacs_abort ();
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 @@
/* Functions for image support on window system.
-Copyright (C) 1989, 1992-2022 Free Software Foundation, Inc.
+Copyright (C) 1989-2022 Free Software Foundation, Inc.
This file is part of GNU Emacs.
@@ -10907,7 +10907,7 @@ DEF_DLL_FN (int, gdk_pixbuf_get_bits_per_sample, (const GdkPixbuf *));
DEF_DLL_FN (void, g_type_init, (void));
# endif
DEF_DLL_FN (void, g_object_unref, (gpointer));
-DEF_DLL_FN (void, g_clear_error, (GError **));
+DEF_DLL_FN (void, g_error_free, (GError *));
static bool
init_svg_functions (void)
@@ -10967,7 +10967,7 @@ init_svg_functions (void)
LOAD_DLL_FN (gobject, g_type_init);
# endif
LOAD_DLL_FN (gobject, g_object_unref);
- LOAD_DLL_FN (glib, g_clear_error);
+ LOAD_DLL_FN (glib, g_error_free);
return 1;
}
@@ -10983,7 +10983,7 @@ init_svg_functions (void)
# undef gdk_pixbuf_get_pixels
# undef gdk_pixbuf_get_rowstride
# undef gdk_pixbuf_get_width
-# undef g_clear_error
+# undef g_error_free
# undef g_object_unref
# undef g_type_init
# if LIBRSVG_CHECK_VERSION (2, 52, 1)
@@ -11019,7 +11019,7 @@ init_svg_functions (void)
# define gdk_pixbuf_get_pixels fn_gdk_pixbuf_get_pixels
# define gdk_pixbuf_get_rowstride fn_gdk_pixbuf_get_rowstride
# define gdk_pixbuf_get_width fn_gdk_pixbuf_get_width
-# define g_clear_error fn_g_clear_error
+# define g_error_free fn_g_error_free
# define g_object_unref fn_g_object_unref
# if ! GLIB_CHECK_VERSION (2, 36, 0)
# define g_type_init fn_g_type_init
@@ -11183,6 +11183,10 @@ svg_load_image (struct frame *f, struct image *img, char *contents,
char *wrapped_contents = NULL;
ptrdiff_t wrapped_size;
+ bool empty_errmsg = true;
+ const char *errmsg = "";
+ ptrdiff_t errlen = 0;
+
#if LIBRSVG_CHECK_VERSION (2, 48, 0)
char *css = NULL;
#endif
@@ -11353,7 +11357,7 @@ svg_load_image (struct frame *f, struct image *img, char *contents,
if (! check_image_size (f, width, height))
{
image_size_error ();
- goto rsvg_error;
+ goto done_error;
}
/* We are now done with the unmodified data. */
@@ -11491,7 +11495,7 @@ svg_load_image (struct frame *f, struct image *img, char *contents,
if (!image_create_x_image_and_pixmap (f, img, width, height, 0, &ximg, 0))
{
g_object_unref (pixbuf);
- return 0;
+ return false;
}
init_color_table ();
@@ -11536,9 +11540,30 @@ svg_load_image (struct frame *f, struct image *img, char *contents,
image_put_x_image (f, img, ximg, 0);
}
- return 1;
+ eassume (err == NULL);
+ return true;
rsvg_error:
+ if (err && err->message[0])
+ {
+ errmsg = err->message;
+ errlen = strlen (errmsg);
+ /* Remove trailing whitespace from the error message text. It
+ has a newline at the end, and perhaps more whitespace. */
+ while (errlen && c_isspace (errmsg[errlen - 1]))
+ errlen--;
+ empty_errmsg = errlen == 0;
+ }
+
+ if (empty_errmsg)
+ image_error ("Error parsing SVG image");
+ else
+ image_error ("Error parsing SVG image: %s", make_string (errmsg, errlen));
+
+ if (err)
+ g_error_free (err);
+
+ done_error:
if (rsvg_handle)
g_object_unref (rsvg_handle);
if (wrapped_contents)
@@ -11547,11 +11572,7 @@ svg_load_image (struct frame *f, struct image *img, char *contents,
if (css && !STRINGP (lcss))
xfree (css);
#endif
- /* FIXME: Use error->message so the user knows what is the actual
- problem with the image. */
- image_error ("Error parsing SVG image");
- g_clear_error (&err);
- return 0;
+ return false;
}
#endif /* defined (HAVE_RSVG) */
@@ -11817,9 +11838,6 @@ x_kill_gs_process (Pixmap pixmap, struct frame *f)
/***********************************************************************
Tests
***********************************************************************/
-
-#ifdef GLYPH_DEBUG
-
DEFUN ("imagep", Fimagep, Simagep, 1, 1, 0,
doc: /* Value is non-nil if SPEC is a valid image specification. */)
(Lisp_Object spec)
@@ -11827,6 +11845,7 @@ DEFUN ("imagep", Fimagep, Simagep, 1, 1, 0,
return valid_image_p (spec) ? Qt : Qnil;
}
+#ifdef GLYPH_DEBUG
DEFUN ("lookup-image", Flookup_image, Slookup_image, 1, 1, 0,
doc: /* */)
@@ -12219,9 +12238,9 @@ non-numeric, there is no explicit limit on the size of images. */);
defsubr (&Simage_mask_p);
defsubr (&Simage_metadata);
defsubr (&Simage_cache_size);
+ defsubr (&Simagep);
#ifdef GLYPH_DEBUG
- defsubr (&Simagep);
defsubr (&Slookup_image);
#endif
@@ -12264,5 +12283,4 @@ The options are:
/* MagickExportImagePixels is in 6.4.6-9, but not 6.4.4-10. */
imagemagick_render_type = 0;
#endif
-
}
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,
/* Return the proper local keymap TYPE for position POSITION in
BUFFER; TYPE should be one of `keymap' or `local-map'. Use the map
- specified by the PROP property, if any. Otherwise, if TYPE is
- `local-map' use BUFFER's local map. */
+ specified by the TYPE property, if any. Otherwise, if TYPE is
+ `local-map', use BUFFER's local map. */
Lisp_Object
get_local_map (ptrdiff_t position, struct buffer *buffer, Lisp_Object type)
diff --git a/src/keyboard.c b/src/keyboard.c
index 1d7125a0a3e..8ab4a451b45 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -499,27 +499,18 @@ echo_add_key (Lisp_Object c)
STRING_MULTIBYTE (name), 1);
}
+ Lisp_Object new_string = make_string (buffer, ptr - buffer);
if ((NILP (echo_string) || SCHARS (echo_string) == 0)
&& help_char_p (c))
{
- static const char text[] = " (Type ? for further options)";
- int len = sizeof text - 1;
-
- if (size - (ptr - buffer) < len)
- {
- ptrdiff_t offset = ptr - buffer;
- size += len;
- buffer = SAFE_ALLOCA (size);
- ptr = buffer + offset;
- }
-
- memcpy (ptr, text, len);
- ptr += len;
+ AUTO_STRING (str, " (Type ? for further options)");
+ AUTO_LIST2 (props, Qface, Qhelp_key_binding);
+ Fadd_text_properties (make_fixnum (7), make_fixnum (8), props, str);
+ new_string = concat2 (new_string, str);
}
- kset_echo_string
- (current_kboard,
- concat2 (echo_string, make_string (buffer, ptr - buffer)));
+ kset_echo_string (current_kboard,
+ concat2 (echo_string, new_string));
SAFE_FREE ();
}
@@ -1827,21 +1818,15 @@ adjust_point_for_property (ptrdiff_t last_pt, bool modified)
}
}
-/* Subroutine for safe_run_hooks: run the hook, which is ARGS[1]. */
+/* Subroutine for safe_run_hooks: run the hook's function.
+ ARGS[0] holds the name of the hook, which we don't need here (we only use
+ it in the failure case of the internal_condition_case_n). */
static Lisp_Object
safe_run_hooks_1 (ptrdiff_t nargs, Lisp_Object *args)
{
- eassert (nargs >= 2 && nargs <= 4);
- switch (nargs)
- {
- case 2:
- return call0 (args[1]);
- case 3:
- return call1 (args[1], args[2]);
- default:
- return call2 (args[1], args[2], args[3]);
- }
+ eassert (nargs >= 2);
+ return Ffuncall (nargs - 1, args + 1);
}
/* 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)
static Lisp_Object
safe_run_hooks_error (Lisp_Object error, ptrdiff_t nargs, Lisp_Object *args)
{
- eassert (nargs >= 2 && nargs <= 4);
+ eassert (nargs >= 2);
AUTO_STRING (format, "Error in %s (%S): %S");
Lisp_Object hook = args[0];
Lisp_Object fun = args[1];
@@ -1886,27 +1871,22 @@ safe_run_hooks_error (Lisp_Object error, ptrdiff_t nargs, Lisp_Object *args)
static Lisp_Object
safe_run_hook_funcall (ptrdiff_t nargs, Lisp_Object *args)
{
- eassert (nargs >= 2 && nargs <= 4);
- /* Yes, run_hook_with_args works with args in the other order. */
- switch (nargs)
- {
- case 2:
- internal_condition_case_n (safe_run_hooks_1,
- 2, ((Lisp_Object []) {args[1], args[0]}),
- Qt, safe_run_hooks_error);
- break;
- case 3:
- internal_condition_case_n (safe_run_hooks_1,
- 3, ((Lisp_Object []) {args[1], args[0], args[2]}),
- Qt, safe_run_hooks_error);
- break;
- default:
- internal_condition_case_n (safe_run_hooks_1,
- 4, ((Lisp_Object [])
- {args[1], args[0], args[2], args[3]}),
- Qt, safe_run_hooks_error);
- break;
- }
+ /* We need to swap args[0] and args[1] here or in `safe_run_hooks_1`.
+ It's more convenient to do it here. */
+ eassert (nargs >= 2);
+ Lisp_Object fun = args[0], hook = args[1];
+ /* The `nargs` array cannot be mutated safely here because it is
+ reused by our caller `run_hook_with_args`.
+ We could arguably change it temporarily if we set it back
+ to its original state before returning, but it's too ugly. */
+ USE_SAFE_ALLOCA;
+ Lisp_Object *newargs;
+ SAFE_ALLOCA_LISP (newargs, nargs);
+ newargs[0] = hook, newargs[1] = fun;
+ memcpy (newargs + 2, args + 2, (nargs - 2) * word_size);
+ internal_condition_case_n (safe_run_hooks_1, nargs, newargs,
+ Qt, safe_run_hooks_error);
+ SAFE_FREE ();
return Qnil;
}
@@ -1920,7 +1900,8 @@ safe_run_hooks (Lisp_Object hook)
specpdl_ref count = SPECPDL_INDEX ();
specbind (Qinhibit_quit, Qt);
- run_hook_with_args (2, ((Lisp_Object []) {hook, hook}), safe_run_hook_funcall);
+ run_hook_with_args (2, ((Lisp_Object []) {hook, hook}),
+ safe_run_hook_funcall);
unbind_to (count, Qnil);
}
@@ -1936,7 +1917,8 @@ safe_run_hooks_maybe_narrowed (Lisp_Object hook, struct window *w)
make_fixnum (get_narrowed_zv (w, PT)),
true);
- run_hook_with_args (2, ((Lisp_Object []) {hook, hook}), safe_run_hook_funcall);
+ run_hook_with_args (2, ((Lisp_Object []) {hook, hook}),
+ safe_run_hook_funcall);
unbind_to (count, Qnil);
}
@@ -11806,6 +11788,9 @@ DEFUN ("posn-at-point", Fposn_at_point, Sposn_at_point, 0, 2, 0,
doc: /* Return position information for buffer position POS in WINDOW.
POS defaults to point in WINDOW; WINDOW defaults to the selected window.
+If POS is in invisible text or is hidden by `display' properties,
+this function may report on buffer positions before or after POS.
+
Return nil if POS is not visible in WINDOW. Otherwise,
the return value is similar to that returned by `event-start' for
a mouse click at the upper left corner of the glyph corresponding
@@ -12258,6 +12243,8 @@ syms_of_keyboard (void)
DEFSYM (Qhelp_form_show, "help-form-show");
+ DEFSYM (Qhelp_key_binding, "help-key-binding");
+
DEFSYM (Qecho_keystrokes, "echo-keystrokes");
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)
DEFINE_GDB_SYMBOL_END (VALMASK)
/* Ignore 'alignas' on compilers lacking it. */
-#if !defined alignas && !defined __alignas_is_defined
+#if (!defined alignas && !defined __alignas_is_defined \
+ && __STDC_VERSION__ < 202311 && __cplusplus < 201103)
# define alignas(a)
#endif
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. */)
struct stat s1, s2;
int result;
+ struct timespec epoch_timespec = {(time_t)0, 0}; /* 1970-01-01T00:00 UTC */
if (version < 0 && !(version = safe_to_load_version (file, fd)))
error ("File `%s' was not compiled in Emacs", SDATA (found));
@@ -1451,7 +1452,12 @@ Return t if the file exists and loads successfully. */)
newer = 1;
/* If we won't print another message, mention this anyway. */
- if (!NILP (nomessage) && !force_load_messages)
+ if (!NILP (nomessage) && !force_load_messages
+ /* We don't want this message during
+ bootstrapping for the "compile-first" .elc
+ files, which have had their timestamps set to
+ the epoch. See bug #58224. */
+ && timespec_cmp (get_stat_mtime (&s1), epoch_timespec))
{
Lisp_Object msg_file;
msg_file = Fsubstring (found, make_fixnum (0), make_fixnum (-1));
@@ -2905,31 +2911,26 @@ digit_to_number (int character, int base)
return digit < base ? digit : -1;
}
-/* Size of the fixed-size buffer used during reading.
- It should be at least big enough for `invalid_radix_integer' but
- can usefully be much bigger than that. */
-enum { stackbufsize = 1024 };
-
static void
-invalid_radix_integer (EMACS_INT radix, char stackbuf[VLA_ELEMS (stackbufsize)],
- Lisp_Object readcharfun)
+invalid_radix_integer (EMACS_INT radix, Lisp_Object readcharfun)
{
- int n = snprintf (stackbuf, stackbufsize, "integer, radix %"pI"d", radix);
- eassert (n < stackbufsize);
- invalid_syntax (stackbuf, readcharfun);
+ char buf[64];
+ int n = snprintf (buf, sizeof buf, "integer, radix %"pI"d", radix);
+ eassert (n < sizeof buf);
+ invalid_syntax (buf, readcharfun);
}
/* Read an integer in radix RADIX using READCHARFUN to read
- characters. RADIX must be in the interval [2..36]. Use STACKBUF
- for temporary storage as needed. Value is the integer read.
+ characters. RADIX must be in the interval [2..36].
+ Value is the integer read.
Signal an error if encountering invalid read syntax. */
static Lisp_Object
-read_integer (Lisp_Object readcharfun, int radix,
- char stackbuf[VLA_ELEMS (stackbufsize)])
+read_integer (Lisp_Object readcharfun, int radix)
{
+ char stackbuf[20];
char *read_buffer = stackbuf;
- ptrdiff_t read_buffer_size = stackbufsize;
+ ptrdiff_t read_buffer_size = sizeof stackbuf;
char *p = read_buffer;
char *heapbuf = NULL;
int valid = -1; /* 1 if valid, 0 if not, -1 if incomplete. */
@@ -2976,7 +2977,7 @@ read_integer (Lisp_Object readcharfun, int radix,
UNREAD (c);
if (valid != 1)
- invalid_radix_integer (radix, stackbuf, readcharfun);
+ invalid_radix_integer (radix, readcharfun);
*p = '\0';
return unbind_to (count, string_to_number (read_buffer, radix, NULL));
@@ -3030,11 +3031,11 @@ read_char_literal (Lisp_Object readcharfun)
/* Read a string literal (preceded by '"'). */
static Lisp_Object
-read_string_literal (char stackbuf[VLA_ELEMS (stackbufsize)],
- Lisp_Object readcharfun)
+read_string_literal (Lisp_Object readcharfun)
{
+ char stackbuf[1024];
char *read_buffer = stackbuf;
- ptrdiff_t read_buffer_size = stackbufsize;
+ ptrdiff_t read_buffer_size = sizeof stackbuf;
specpdl_ref count = SPECPDL_INDEX ();
char *heapbuf = NULL;
char *p = read_buffer;
@@ -3357,8 +3358,7 @@ string_props_from_rev_list (Lisp_Object elems, Lisp_Object readcharfun)
/* Read a bool vector (preceded by "#&"). */
static Lisp_Object
-read_bool_vector (char stackbuf[VLA_ELEMS (stackbufsize)],
- Lisp_Object readcharfun)
+read_bool_vector (Lisp_Object readcharfun)
{
ptrdiff_t length = 0;
for (;;)
@@ -3376,7 +3376,7 @@ read_bool_vector (char stackbuf[VLA_ELEMS (stackbufsize)],
}
ptrdiff_t size_in_chars = bool_vector_bytes (length);
- Lisp_Object str = read_string_literal (stackbuf, readcharfun);
+ Lisp_Object str = read_string_literal (readcharfun);
if (STRING_MULTIBYTE (str)
|| !(size_in_chars == SCHARS (str)
/* 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)
rdstack.stack[rdstack.sp++] = e;
}
+static void
+read_stack_reset (intmax_t sp)
+{
+ eassert (sp <= rdstack.sp);
+ rdstack.sp = sp;
+}
/* Read a Lisp object.
If LOCATE_SYMS is true, symbols are read with position. */
static Lisp_Object
read0 (Lisp_Object readcharfun, bool locate_syms)
{
- char stackbuf[stackbufsize];
+ char stackbuf[64];
char *read_buffer = stackbuf;
ptrdiff_t read_buffer_size = sizeof stackbuf;
char *heapbuf = NULL;
- specpdl_ref count = SPECPDL_INDEX ();
+ specpdl_ref base_pdl = SPECPDL_INDEX ();
ptrdiff_t base_sp = rdstack.sp;
+ record_unwind_protect_intmax (read_stack_reset, base_sp);
+
+ specpdl_ref count = SPECPDL_INDEX ();
bool uninterned_symbol;
bool skip_shorthand;
@@ -3886,7 +3895,7 @@ read0 (Lisp_Object readcharfun, bool locate_syms)
case '&':
/* #&N"..." -- bool-vector */
- obj = read_bool_vector (stackbuf, readcharfun);
+ obj = read_bool_vector (readcharfun);
break;
case '!':
@@ -3902,17 +3911,17 @@ read0 (Lisp_Object readcharfun, bool locate_syms)
case 'x':
case 'X':
- obj = read_integer (readcharfun, 16, stackbuf);
+ obj = read_integer (readcharfun, 16);
break;
case 'o':
case 'O':
- obj = read_integer (readcharfun, 8, stackbuf);
+ obj = read_integer (readcharfun, 8);
break;
case 'b':
case 'B':
- obj = read_integer (readcharfun, 2, stackbuf);
+ obj = read_integer (readcharfun, 2);
break;
case '@':
@@ -3980,8 +3989,8 @@ read0 (Lisp_Object readcharfun, bool locate_syms)
{
/* #NrDIGITS -- radix-N number */
if (n < 0 || n > 36)
- invalid_radix_integer (n, stackbuf, readcharfun);
- obj = read_integer (readcharfun, n, stackbuf);
+ invalid_radix_integer (n, readcharfun);
+ obj = read_integer (readcharfun, n);
break;
}
else if (n <= MOST_POSITIVE_FIXNUM && !NILP (Vread_circle))
@@ -4036,7 +4045,7 @@ read0 (Lisp_Object readcharfun, bool locate_syms)
break;
case '"':
- obj = read_string_literal (stackbuf, readcharfun);
+ obj = read_string_literal (readcharfun);
break;
case '\'':
@@ -4347,7 +4356,7 @@ read0 (Lisp_Object readcharfun, bool locate_syms)
}
}
- return unbind_to (count, obj);
+ return unbind_to (base_pdl, obj);
}
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 @@
static const unsigned char mac_uvs_table_adobe_japan1_bytes[] =
{
- 0x00, 0x0e, 0x00, 0x01, 0x1f, 0xb2, 0x00, 0x00,
+ 0x00, 0x0e, 0x00, 0x01, 0x1f, 0xb7, 0x00, 0x00,
0x00, 0x0f, 0x0e, 0x01, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xaf, 0x0e, 0x01, 0x01,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0xae,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0xb3,
0x0e, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x01, 0x1c, 0x45, 0x0e, 0x01, 0x03, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x01, 0x1e, 0xc4, 0x0e, 0x01,
+ 0x01, 0x1c, 0x4a, 0x0e, 0x01, 0x03, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x1e, 0xc9, 0x0e, 0x01,
0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1f,
- 0x1d, 0x0e, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x01, 0x1f, 0x3f, 0x0e, 0x01, 0x06, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x01, 0x1f, 0x57, 0x0e,
+ 0x22, 0x0e, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x1f, 0x44, 0x0e, 0x01, 0x06, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x1f, 0x5c, 0x0e,
0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
- 0x1f, 0x65, 0x0e, 0x01, 0x08, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x01, 0x1f, 0x73, 0x0e, 0x01, 0x09,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1f, 0x7c,
+ 0x1f, 0x6a, 0x0e, 0x01, 0x08, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x1f, 0x78, 0x0e, 0x01, 0x09,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1f, 0x81,
0x0e, 0x01, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x01, 0x1f, 0x85, 0x0e, 0x01, 0x0b, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x01, 0x1f, 0x8e, 0x0e, 0x01,
+ 0x01, 0x1f, 0x8a, 0x0e, 0x01, 0x0b, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x1f, 0x93, 0x0e, 0x01,
0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1f,
- 0x97, 0x0e, 0x01, 0x0d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x01, 0x1f, 0xa0, 0x0e, 0x01, 0x0e, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x01, 0x1f, 0xa9, 0x00,
- 0x00, 0x33, 0xff, 0x00, 0x34, 0x02, 0x35, 0x82,
+ 0x9c, 0x0e, 0x01, 0x0d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x1f, 0xa5, 0x0e, 0x01, 0x0e, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x1f, 0xae, 0x00,
+ 0x00, 0x34, 0x00, 0x00, 0x34, 0x02, 0x35, 0x82,
0x00, 0x34, 0x05, 0x3c, 0x1b, 0x00, 0x34, 0x06,
0x43, 0x5a, 0x00, 0x34, 0x27, 0x36, 0x56, 0x00,
0x34, 0x2c, 0x43, 0x5e, 0x00, 0x34, 0x2e, 0x37,
@@ -8349,870 +8349,870 @@ static const unsigned char mac_uvs_table_adobe_japan1_bytes[] =
0x02, 0xb8, 0x17, 0x4f, 0x24, 0x02, 0xb8, 0x1a,
0x37, 0xc6, 0x02, 0xd5, 0x44, 0x36, 0x0a, 0x02,
0xe2, 0x78, 0x37, 0x6b, 0x02, 0xe5, 0x69, 0x36,
- 0x27, 0x02, 0xe6, 0xea, 0x37, 0x92, 0x00, 0x00,
- 0x04, 0xb7, 0x00, 0x34, 0x02, 0x35, 0x81, 0x00,
- 0x4e, 0x08, 0x34, 0x97, 0x00, 0x4e, 0x0e, 0x4e,
- 0x69, 0x00, 0x4e, 0x19, 0x36, 0xb9, 0x00, 0x4e,
- 0x26, 0x4e, 0x6a, 0x00, 0x4e, 0x30, 0x3c, 0x1a,
- 0x00, 0x4e, 0x39, 0x36, 0x5a, 0x00, 0x4e, 0x3b,
- 0x35, 0xf4, 0x00, 0x4e, 0x73, 0x36, 0x90, 0x00,
- 0x4e, 0xa1, 0x36, 0xcf, 0x00, 0x4e, 0xa4, 0x34,
- 0x7f, 0x00, 0x4e, 0xca, 0x35, 0xd4, 0x00, 0x4f,
- 0x34, 0x36, 0xa0, 0x00, 0x4f, 0x4f, 0x35, 0xfc,
- 0x00, 0x4f, 0x60, 0x3c, 0x1c, 0x00, 0x4f, 0x73,
- 0x4e, 0x6c, 0x00, 0x4f, 0x75, 0x34, 0x47, 0x00,
- 0x4f, 0x7f, 0x34, 0x8a, 0x00, 0x4f, 0xae, 0x34,
- 0x46, 0x00, 0x4f, 0xb5, 0x36, 0x1b, 0x00, 0x4f,
- 0xbf, 0x34, 0xc2, 0x00, 0x50, 0x24, 0x36, 0x5f,
- 0x00, 0x50, 0x26, 0x1d, 0xfa, 0x00, 0x50, 0x49,
- 0x34, 0x61, 0x00, 0x50, 0x4f, 0x36, 0xbe, 0x00,
- 0x50, 0x56, 0x4e, 0x6d, 0x00, 0x50, 0x65, 0x34,
- 0x7b, 0x00, 0x50, 0x85, 0x34, 0xd0, 0x00, 0x50,
- 0x91, 0x34, 0x79, 0x00, 0x50, 0xc5, 0x1d, 0xee,
- 0x00, 0x50, 0xca, 0x1f, 0x2e, 0x00, 0x50, 0xcf,
- 0x34, 0xa2, 0x00, 0x50, 0xe7, 0x34, 0x30, 0x00,
- 0x50, 0xed, 0x4e, 0x6e, 0x00, 0x50, 0xf2, 0x52,
- 0xac, 0x00, 0x51, 0x1a, 0x37, 0x16, 0x00, 0x51,
- 0x32, 0x1e, 0x76, 0x00, 0x51, 0x46, 0x34, 0xa5,
- 0x00, 0x51, 0x4d, 0x34, 0x4d, 0x00, 0x51, 0x4e,
- 0x36, 0x7d, 0x00, 0x51, 0x54, 0x10, 0x74, 0x00,
- 0x51, 0x68, 0x36, 0x42, 0x00, 0x51, 0x6b, 0x4e,
- 0x6f, 0x00, 0x51, 0x6c, 0x34, 0x80, 0x00, 0x51,
- 0x77, 0x35, 0xa5, 0x00, 0x51, 0x7c, 0x35, 0xb4,
- 0x00, 0x51, 0x89, 0x1e, 0x87, 0x00, 0x51, 0x8d,
- 0x08, 0x36, 0x00, 0x51, 0x92, 0x36, 0xd6, 0x00,
- 0x51, 0x93, 0x34, 0xd1, 0x00, 0x51, 0x95, 0x10,
- 0x82, 0x00, 0x51, 0xa4, 0x1e, 0x89, 0x00, 0x51,
- 0xac, 0x0c, 0x59, 0x00, 0x51, 0xb4, 0x34, 0x5c,
- 0x00, 0x51, 0xcb, 0x1e, 0x3e, 0x00, 0x51, 0xdb,
- 0x34, 0xd2, 0x00, 0x51, 0xde, 0x4f, 0x53, 0x00,
- 0x51, 0xe1, 0x36, 0xd9, 0x00, 0x51, 0xfd, 0x4e,
- 0x72, 0x00, 0x52, 0x03, 0x36, 0x22, 0x00, 0x52,
- 0x06, 0x34, 0xbb, 0x00, 0x52, 0x24, 0x36, 0xa1,
- 0x00, 0x52, 0x38, 0x35, 0xb5, 0x00, 0x52, 0x4a,
- 0x35, 0xdd, 0x00, 0x52, 0x4d, 0x36, 0x41, 0x00,
- 0x52, 0x64, 0x4e, 0x74, 0x00, 0x52, 0x71, 0x4e,
- 0x75, 0x00, 0x52, 0x72, 0x05, 0xc2, 0x00, 0x52,
- 0x75, 0x1e, 0x2b, 0x00, 0x52, 0x8d, 0x37, 0x1a,
- 0x00, 0x52, 0xc7, 0x36, 0xf6, 0x00, 0x52, 0xc9,
- 0x0e, 0x29, 0x00, 0x52, 0xd7, 0x37, 0x1b, 0x00,
- 0x52, 0xdd, 0x36, 0x05, 0x00, 0x52, 0xe2, 0x36,
- 0x2a, 0x00, 0x52, 0xe4, 0x34, 0x1a, 0x00, 0x52,
- 0xfa, 0x09, 0x07, 0x00, 0x53, 0x00, 0x37, 0xcf,
- 0x00, 0x53, 0x05, 0x36, 0xc3, 0x00, 0x53, 0x07,
- 0x20, 0xd4, 0x00, 0x53, 0x15, 0x1f, 0x2f, 0x00,
- 0x53, 0x16, 0x35, 0x61, 0x00, 0x53, 0x39, 0x36,
- 0xaa, 0x00, 0x53, 0x3f, 0x4e, 0x77, 0x00, 0x53,
- 0x40, 0x34, 0xd4, 0x00, 0x53, 0x4a, 0x36, 0xa2,
- 0x00, 0x53, 0x51, 0x0d, 0x70, 0x00, 0x53, 0x5a,
- 0x36, 0x98, 0x00, 0x53, 0x65, 0x52, 0xf3, 0x00,
- 0x53, 0x71, 0x35, 0x80, 0x00, 0x53, 0x78, 0x35,
- 0x5f, 0x00, 0x53, 0x7f, 0x06, 0xa2, 0x00, 0x53,
- 0xa9, 0x1d, 0xd8, 0x00, 0x53, 0xc9, 0x4f, 0x39,
- 0x00, 0x53, 0xca, 0x35, 0x8e, 0x00, 0x53, 0xce,
- 0x34, 0x8f, 0x00, 0x53, 0xd7, 0x35, 0xf5, 0x00,
- 0x53, 0xdb, 0x1f, 0x2a, 0x00, 0x53, 0xdf, 0x37,
- 0x1f, 0x00, 0x53, 0xe0, 0x53, 0x00, 0x00, 0x53,
- 0xf1, 0x1e, 0x0c, 0x00, 0x53, 0xf2, 0x34, 0x8b,
- 0x00, 0x54, 0x0f, 0x34, 0xc9, 0x00, 0x54, 0x38,
- 0x35, 0x8f, 0x00, 0x54, 0x40, 0x4e, 0x79, 0x00,
- 0x54, 0x48, 0x36, 0x76, 0x00, 0x54, 0x68, 0x09,
- 0x2a, 0x00, 0x54, 0xac, 0x4f, 0x35, 0x00, 0x54,
- 0xb2, 0x35, 0xdc, 0x00, 0x54, 0xe8, 0x1e, 0x17,
- 0x00, 0x55, 0x10, 0x36, 0x83, 0x00, 0x55, 0x33,
- 0x1e, 0x8b, 0x00, 0x55, 0x39, 0x1e, 0x8a, 0x00,
- 0x55, 0x44, 0x1e, 0x32, 0x00, 0x55, 0x46, 0x36,
- 0x06, 0x00, 0x55, 0x53, 0x35, 0xaa, 0x00, 0x55,
- 0x61, 0x38, 0x39, 0x00, 0x55, 0x84, 0x4e, 0x5e,
- 0x00, 0x55, 0x9c, 0x4e, 0x7b, 0x00, 0x55, 0x9d,
- 0x1d, 0xe3, 0x00, 0x55, 0xa9, 0x1f, 0x30, 0x00,
- 0x55, 0xab, 0x35, 0x8b, 0x00, 0x55, 0xb0, 0x1d,
- 0xf0, 0x00, 0x55, 0xe4, 0x1e, 0x8c, 0x00, 0x56,
- 0x05, 0x53, 0x2d, 0x00, 0x56, 0x06, 0x0b, 0x70,
- 0x00, 0x56, 0x09, 0x4e, 0x7d, 0x00, 0x56, 0x32,
- 0x1e, 0x8d, 0x00, 0x56, 0x42, 0x1d, 0xda, 0x00,
- 0x56, 0x4c, 0x1e, 0x29, 0x00, 0x56, 0x68, 0x34,
- 0x15, 0x00, 0x56, 0x74, 0x34, 0xbc, 0x00, 0x56,
- 0x78, 0x1e, 0x52, 0x00, 0x56, 0xa5, 0x1e, 0x8e,
- 0x00, 0x56, 0xae, 0x1f, 0x31, 0x00, 0x56, 0xc0,
- 0x37, 0x24, 0x00, 0x56, 0xc1, 0x34, 0xd7, 0x00,
- 0x56, 0xce, 0x4e, 0x82, 0x00, 0x56, 0xee, 0x4e,
- 0x83, 0x00, 0x57, 0x0d, 0x34, 0xd8, 0x00, 0x57,
- 0x47, 0x34, 0x78, 0x00, 0x57, 0x6a, 0x36, 0x74,
- 0x00, 0x57, 0xce, 0x09, 0xd3, 0x00, 0x57, 0xd6,
- 0x4e, 0x84, 0x00, 0x57, 0xf4, 0x34, 0x98, 0x00,
- 0x58, 0x0b, 0x1e, 0x8f, 0x00, 0x58, 0x19, 0x1f,
- 0x32, 0x00, 0x58, 0x35, 0x1e, 0x49, 0x00, 0x58,
- 0x3d, 0x4e, 0x85, 0x00, 0x58, 0x40, 0x34, 0x48,
- 0x00, 0x58, 0x58, 0x1e, 0x4d, 0x00, 0x58, 0x59,
- 0x4e, 0x86, 0x00, 0x58, 0x5a, 0x1e, 0x42, 0x00,
- 0x58, 0x9c, 0x36, 0x71, 0x00, 0x58, 0xa8, 0x0e,
- 0x7d, 0x00, 0x58, 0xab, 0x34, 0xd9, 0x00, 0x59,
- 0x06, 0x53, 0x7b, 0x00, 0x59, 0x1b, 0x1f, 0x33,
- 0x00, 0x59, 0x27, 0x36, 0x55, 0x00, 0x59, 0x4f,
- 0x4e, 0x87, 0x00, 0x59, 0x51, 0x35, 0xab, 0x00,
- 0x59, 0x53, 0x37, 0xd1, 0x00, 0x59, 0x60, 0x4e,
- 0x89, 0x00, 0x59, 0x62, 0x4e, 0x8a, 0x00, 0x59,
- 0x73, 0x36, 0x04, 0x00, 0x59, 0x84, 0x36, 0xe7,
- 0x00, 0x59, 0xa5, 0x36, 0x4f, 0x00, 0x59, 0xc9,
- 0x34, 0x8c, 0x00, 0x59, 0xda, 0x34, 0xda, 0x00,
- 0x59, 0xec, 0x36, 0xae, 0x00, 0x59, 0xff, 0x35,
- 0xe0, 0x00, 0x5a, 0x1c, 0x37, 0x26, 0x00, 0x5a,
- 0x29, 0x1e, 0x6f, 0x00, 0x5a, 0x36, 0x34, 0xdb,
- 0x00, 0x5a, 0x66, 0x36, 0xb2, 0x00, 0x5a, 0x9b,
- 0x1e, 0x68, 0x00, 0x5a, 0xbe, 0x1e, 0x90, 0x00,
- 0x5a, 0xc2, 0x37, 0x27, 0x00, 0x5a, 0xcc, 0x1d,
- 0xfb, 0x00, 0x5a, 0xda, 0x4e, 0x8b, 0x00, 0x5b,
- 0x5a, 0x4e, 0x8c, 0x00, 0x5b, 0x73, 0x4e, 0x8d,
- 0x00, 0x5b, 0x7c, 0x4e, 0x8e, 0x00, 0x5b, 0xb3,
- 0x34, 0x6d, 0x00, 0x5b, 0xb5, 0x36, 0x07, 0x00,
- 0x5b, 0xc3, 0x37, 0x29, 0x00, 0x5b, 0xd2, 0x35,
- 0x78, 0x00, 0x5b, 0xdb, 0x20, 0xf4, 0x00, 0x5b,
- 0xe7, 0x0c, 0xe1, 0x00, 0x5b, 0xe8, 0x37, 0x42,
- 0x00, 0x5c, 0x06, 0x09, 0x95, 0x00, 0x5c, 0x0a,
- 0x36, 0x4d, 0x00, 0x5c, 0x0b, 0x36, 0x23, 0x00,
- 0x5c, 0x0e, 0x36, 0x8a, 0x00, 0x5c, 0x0f, 0x36,
- 0x09, 0x00, 0x5c, 0x28, 0x1f, 0x34, 0x00, 0x5c,
- 0x51, 0x1d, 0xf2, 0x00, 0x5c, 0x60, 0x1e, 0x4a,
- 0x00, 0x5c, 0x64, 0x34, 0x31, 0x00, 0x5c, 0x6e,
- 0x12, 0x32, 0x00, 0x5d, 0x29, 0x36, 0xc4, 0x00,
- 0x5d, 0x4e, 0x34, 0xdd, 0x00, 0x5d, 0x87, 0x34,
- 0xde, 0x00, 0x5d, 0xb2, 0x3c, 0x2d, 0x00, 0x5d,
- 0xc9, 0x34, 0xdf, 0x00, 0x5d, 0xcc, 0x34, 0x73,
- 0x00, 0x5d, 0xd3, 0x34, 0xe0, 0x00, 0x5d, 0xe1,
- 0x35, 0xff, 0x00, 0x5d, 0xe5, 0x35, 0xc3, 0x00,
- 0x5d, 0xe8, 0x35, 0x92, 0x00, 0x5d, 0xf7, 0x1d,
- 0xff, 0x00, 0x5d, 0xfd, 0x0b, 0x65, 0x00, 0x5e,
- 0x06, 0x36, 0xa3, 0x00, 0x5e, 0x1d, 0x36, 0x77,
- 0x00, 0x5e, 0x30, 0x34, 0x75, 0x00, 0x5e, 0x3d,
- 0x36, 0xd0, 0x00, 0x5e, 0x43, 0x4e, 0x91, 0x00,
- 0x5e, 0x54, 0x37, 0x2d, 0x00, 0x5e, 0x63, 0x36,
- 0xba, 0x00, 0x5e, 0x64, 0x1e, 0x93, 0x00, 0x5e,
- 0x73, 0x36, 0xbb, 0x00, 0x5e, 0x7e, 0x35, 0x84,
- 0x00, 0x5e, 0x96, 0x1e, 0x70, 0x00, 0x5e, 0xa7,
- 0x4e, 0x92, 0x00, 0x5e, 0xad, 0x34, 0xa9, 0x00,
- 0x5e, 0xc9, 0x0f, 0xbf, 0x00, 0x5e, 0xca, 0x4f,
- 0x4f, 0x00, 0x5e, 0xcb, 0x38, 0xae, 0x00, 0x5e,
- 0xcf, 0x1f, 0x36, 0x00, 0x5e, 0xd0, 0x1f, 0x35,
- 0x00, 0x5e, 0xdf, 0x1e, 0x6a, 0x00, 0x5e, 0xe0,
- 0x1e, 0x18, 0x00, 0x5e, 0xe3, 0x37, 0x2f, 0x00,
- 0x5e, 0xf6, 0x34, 0x67, 0x00, 0x5e, 0xf7, 0x34,
- 0xaa, 0x00, 0x5e, 0xfa, 0x34, 0x7c, 0x00, 0x5e,
- 0xfb, 0x35, 0x69, 0x00, 0x5f, 0x0a, 0x36, 0xbc,
- 0x00, 0x5f, 0x2d, 0x34, 0xe1, 0x00, 0x5f, 0x31,
- 0x35, 0xf3, 0x00, 0x5f, 0x38, 0x4e, 0x94, 0x00,
- 0x5f, 0x45, 0x37, 0xce, 0x00, 0x5f, 0x50, 0x3c,
- 0x1f, 0x00, 0x5f, 0x62, 0x4e, 0x5f, 0x00, 0x5f,
- 0x69, 0x35, 0xd7, 0x00, 0x5f, 0x6b, 0x36, 0x68,
- 0x00, 0x5f, 0x80, 0x35, 0x5d, 0x00, 0x5f, 0x98,
- 0x34, 0xe2, 0x00, 0x5f, 0xa1, 0x4e, 0x95, 0x00,
- 0x5f, 0xae, 0x36, 0xa8, 0x00, 0x5f, 0xb5, 0x36,
- 0x69, 0x00, 0x5f, 0xbd, 0x1d, 0xea, 0x00, 0x5f,
- 0xcd, 0x36, 0x91, 0x00, 0x5f, 0xd8, 0x36, 0xd1,
- 0x00, 0x5f, 0xd9, 0x36, 0xd2, 0x00, 0x5f, 0xdd,
- 0x4e, 0x96, 0x00, 0x60, 0x25, 0x35, 0x90, 0x00,
- 0x60, 0x50, 0x35, 0x99, 0x00, 0x60, 0x62, 0x1d,
- 0xe0, 0x00, 0x60, 0x65, 0x34, 0xa4, 0x00, 0x60,
- 0x75, 0x35, 0xac, 0x00, 0x60, 0x94, 0x05, 0x79,
- 0x00, 0x60, 0x97, 0x1e, 0x94, 0x00, 0x60, 0x9e,
- 0x54, 0x36, 0x00, 0x60, 0xa4, 0x3c, 0x20, 0x00,
- 0x60, 0xb2, 0x34, 0xb3, 0x00, 0x60, 0xc5, 0x36,
- 0x12, 0x00, 0x60, 0xd8, 0x34, 0xe3, 0x00, 0x61,
- 0x08, 0x1e, 0x7a, 0x00, 0x61, 0x09, 0x36, 0xf3,
- 0x00, 0x61, 0x0f, 0x35, 0x47, 0x00, 0x61, 0x3d,
- 0x34, 0xe4, 0x00, 0x61, 0x48, 0x4e, 0x60, 0x00,
- 0x61, 0x4c, 0x35, 0xc4, 0x00, 0x61, 0x4e, 0x34,
- 0x2c, 0x00, 0x61, 0x62, 0x4e, 0x97, 0x00, 0x61,
- 0x67, 0x1d, 0xf5, 0x00, 0x61, 0x68, 0x34, 0x10,
- 0x00, 0x61, 0x8e, 0x0b, 0x00, 0x00, 0x61, 0x90,
- 0x37, 0x10, 0x00, 0x61, 0xa4, 0x34, 0xbd, 0x00,
- 0x61, 0xb2, 0x35, 0xb6, 0x00, 0x61, 0xf2, 0x34,
- 0x39, 0x00, 0x61, 0xf8, 0x4e, 0x99, 0x00, 0x61,
- 0xfe, 0x34, 0xe5, 0x00, 0x62, 0x10, 0x36, 0x2b,
- 0x00, 0x62, 0x3b, 0x36, 0xeb, 0x00, 0x62, 0x3f,
- 0x36, 0xd3, 0x00, 0x62, 0x40, 0x36, 0x02, 0x00,
- 0x62, 0x41, 0x1f, 0x37, 0x00, 0x62, 0x47, 0x36,
- 0x3b, 0x00, 0x62, 0x48, 0x1e, 0xc2, 0x00, 0x62,
- 0x49, 0x1e, 0x63, 0x00, 0x62, 0x68, 0x34, 0xe6,
- 0x00, 0x62, 0x71, 0x35, 0x45, 0x00, 0x62, 0xb1,
- 0x36, 0xc5, 0x00, 0x62, 0xcc, 0x37, 0x32, 0x00,
- 0x62, 0xcf, 0x34, 0xe7, 0x00, 0x62, 0xd0, 0x1d,
- 0xe1, 0x00, 0x62, 0xd2, 0x35, 0x93, 0x00, 0x62,
- 0xd4, 0x13, 0x5d, 0x00, 0x62, 0xf3, 0x1f, 0x21,
- 0x00, 0x62, 0xf7, 0x34, 0x88, 0x00, 0x63, 0x3a,
- 0x4f, 0x3e, 0x00, 0x63, 0x3d, 0x1e, 0x62, 0x00,
- 0x63, 0x4c, 0x34, 0x5d, 0x00, 0x63, 0x57, 0x1e,
- 0x3f, 0x00, 0x63, 0x67, 0x34, 0xc3, 0x00, 0x63,
- 0x68, 0x35, 0xec, 0x00, 0x63, 0x69, 0x1e, 0x95,
- 0x00, 0x63, 0x6e, 0x34, 0x9d, 0x00, 0x63, 0x72,
- 0x1d, 0xfc, 0x00, 0x63, 0x83, 0x36, 0x43, 0x00,
- 0x63, 0x88, 0x35, 0xf6, 0x00, 0x63, 0x92, 0x34,
- 0xaf, 0x00, 0x63, 0xa1, 0x35, 0xd8, 0x00, 0x63,
- 0xa7, 0x35, 0xc6, 0x00, 0x63, 0xc3, 0x1f, 0x27,
- 0x00, 0x63, 0xc6, 0x37, 0x34, 0x00, 0x63, 0xf4,
- 0x35, 0x57, 0x00, 0x64, 0x06, 0x1e, 0x96, 0x00,
- 0x64, 0x0f, 0x34, 0xe9, 0x00, 0x64, 0x1c, 0x37,
- 0x33, 0x00, 0x64, 0x28, 0x37, 0x35, 0x00, 0x64,
- 0x42, 0x34, 0x9e, 0x00, 0x64, 0x69, 0x36, 0xd7,
- 0x00, 0x64, 0x6f, 0x4f, 0x28, 0x00, 0x64, 0x7a,
- 0x1e, 0x21, 0x00, 0x64, 0xb0, 0x1e, 0x24, 0x00,
- 0x64, 0xe2, 0x1e, 0x45, 0x00, 0x64, 0xf2, 0x34,
- 0xea, 0x00, 0x64, 0xf6, 0x4e, 0x9e, 0x00, 0x65,
- 0x1d, 0x34, 0xe8, 0x00, 0x65, 0x4f, 0x0d, 0xc4,
- 0x00, 0x65, 0x5d, 0x34, 0xeb, 0x00, 0x65, 0x5e,
- 0x4e, 0xa1, 0x00, 0x65, 0x62, 0x34, 0x71, 0x00,
- 0x65, 0x77, 0x36, 0xb3, 0x00, 0x65, 0x83, 0x1e,
- 0x98, 0x00, 0x65, 0x87, 0x4e, 0xa3, 0x00, 0x65,
- 0x89, 0x4e, 0xa4, 0x00, 0x65, 0x8e, 0x4e, 0xa6,
- 0x00, 0x65, 0x90, 0x34, 0xb5, 0x00, 0x65, 0x9c,
- 0x35, 0xed, 0x00, 0x65, 0xa7, 0x4f, 0x41, 0x00,
- 0x65, 0xbc, 0x35, 0x5c, 0x00, 0x65, 0xc5, 0x37,
- 0x08, 0x00, 0x65, 0xdf, 0x54, 0xbe, 0x00, 0x65,
- 0xe1, 0x4e, 0xa9, 0x00, 0x65, 0xe2, 0x06, 0x37,
- 0x00, 0x66, 0x0e, 0x36, 0xe4, 0x00, 0x66, 0x1e,
- 0x21, 0x1c, 0x00, 0x66, 0x5f, 0x34, 0xec, 0x00,
- 0x66, 0x66, 0x1d, 0xe2, 0x00, 0x66, 0x67, 0x4e,
- 0xaa, 0x00, 0x66, 0x69, 0x36, 0xa5, 0x00, 0x66,
- 0x6e, 0x4e, 0xab, 0x00, 0x66, 0x74, 0x0a, 0x56,
- 0x00, 0x66, 0x77, 0x39, 0x11, 0x00, 0x66, 0x81,
- 0x35, 0xa0, 0x00, 0x66, 0x91, 0x34, 0x28, 0x00,
- 0x66, 0x96, 0x36, 0x5e, 0x00, 0x66, 0x97, 0x35,
- 0x46, 0x00, 0x66, 0xb5, 0x54, 0xda, 0x00, 0x66,
- 0xc1, 0x1f, 0x38, 0x00, 0x66, 0xd9, 0x1e, 0x13,
- 0x00, 0x66, 0xdc, 0x36, 0xfd, 0x00, 0x66, 0xf4,
- 0x34, 0x81, 0x00, 0x66, 0xf5, 0x37, 0x3b, 0x00,
- 0x66, 0xf8, 0x36, 0x03, 0x00, 0x66, 0xfb, 0x37,
- 0xcd, 0x00, 0x66, 0xfc, 0x37, 0x20, 0x00, 0x67,
- 0x00, 0x4e, 0xaf, 0x00, 0x67, 0x08, 0x35, 0xb2,
- 0x00, 0x67, 0x09, 0x36, 0xf7, 0x00, 0x67, 0x0b,
- 0x36, 0xc6, 0x00, 0x67, 0x0d, 0x36, 0xb7, 0x00,
- 0x67, 0x15, 0x36, 0x6f, 0x00, 0x67, 0x17, 0x0f,
- 0xd5, 0x00, 0x67, 0x1b, 0x36, 0xd4, 0x00, 0x67,
- 0x1d, 0x36, 0x6b, 0x00, 0x67, 0x1f, 0x35, 0x86,
- 0x00, 0x67, 0x53, 0x1e, 0x0f, 0x00, 0x67, 0x56,
- 0x4f, 0x3a, 0x00, 0x67, 0x5e, 0x37, 0x3c, 0x00,
- 0x67, 0x61, 0x4e, 0xb0, 0x00, 0x67, 0x7e, 0x34,
- 0x95, 0x00, 0x67, 0xa6, 0x1e, 0x99, 0x00, 0x67,
- 0xa9, 0x34, 0xed, 0x00, 0x67, 0xc4, 0x4e, 0xb1,
- 0x00, 0x67, 0xca, 0x1e, 0x65, 0x00, 0x67, 0xd4,
- 0x34, 0x91, 0x00, 0x67, 0xe7, 0x34, 0xee, 0x00,
- 0x67, 0xf1, 0x36, 0x65, 0x00, 0x68, 0x01, 0x21,
- 0x2e, 0x00, 0x68, 0x02, 0x4e, 0xb2, 0x00, 0x68,
- 0x13, 0x1e, 0x25, 0x00, 0x68, 0x1f, 0x4e, 0x61,
- 0x00, 0x68, 0x21, 0x34, 0x82, 0x00, 0x68, 0x43,
- 0x34, 0xac, 0x00, 0x68, 0x52, 0x21, 0x2c, 0x00,
- 0x68, 0x5d, 0x34, 0xc5, 0x00, 0x68, 0x7a, 0x36,
- 0xf0, 0x00, 0x68, 0x81, 0x37, 0x09, 0x00, 0x68,
- 0x85, 0x0d, 0x15, 0x00, 0x68, 0x8d, 0x37, 0x3e,
- 0x00, 0x68, 0x97, 0x4f, 0x37, 0x00, 0x68, 0x9b,
- 0x1e, 0x9b, 0x00, 0x68, 0x9d, 0x37, 0x3d, 0x00,
- 0x68, 0xa2, 0x1e, 0x19, 0x00, 0x68, 0xc8, 0x37,
- 0xcc, 0x00, 0x68, 0xda, 0x1e, 0x38, 0x00, 0x69,
- 0x0d, 0x34, 0x99, 0x00, 0x69, 0x30, 0x34, 0xf0,
- 0x00, 0x69, 0x3d, 0x4e, 0xb3, 0x00, 0x69, 0x5e,
- 0x4e, 0xb4, 0x00, 0x69, 0x62, 0x1e, 0x58, 0x00,
- 0x69, 0x6b, 0x34, 0xef, 0x00, 0x69, 0x6f, 0x34,
- 0x94, 0x00, 0x69, 0x82, 0x34, 0x5b, 0x00, 0x69,
- 0x8a, 0x1e, 0x06, 0x00, 0x69, 0x94, 0x1e, 0x84,
- 0x00, 0x69, 0xa7, 0x34, 0xf1, 0x00, 0x69, 0xbb,
- 0x37, 0x43, 0x00, 0x69, 0xc1, 0x35, 0x9a, 0x00,
- 0x69, 0xcb, 0x35, 0xc7, 0x00, 0x69, 0xcc, 0x1e,
- 0x40, 0x00, 0x69, 0xd9, 0x36, 0xdd, 0x00, 0x69,
- 0xea, 0x35, 0x6f, 0x00, 0x69, 0xfe, 0x55, 0x1f,
- 0x00, 0x6a, 0x0b, 0x1e, 0x64, 0x00, 0x6a, 0x3d,
- 0x1e, 0x3a, 0x00, 0x6a, 0x44, 0x34, 0xf2, 0x00,
- 0x6a, 0x55, 0x55, 0x25, 0x00, 0x6a, 0x5f, 0x35,
- 0x87, 0x00, 0x6a, 0x73, 0x37, 0xd4, 0x00, 0x6a,
- 0x8e, 0x34, 0x7e, 0x00, 0x6a, 0x90, 0x34, 0xf3,
- 0x00, 0x6a, 0x9c, 0x4e, 0xb6, 0x00, 0x6a, 0xdb,
- 0x06, 0xf3, 0x00, 0x6b, 0x04, 0x0f, 0x5d, 0x00,
- 0x6b, 0x1d, 0x1d, 0xd7, 0x00, 0x6b, 0x21, 0x35,
- 0xe7, 0x00, 0x6b, 0x24, 0x3c, 0x22, 0x00, 0x6b,
- 0x4e, 0x36, 0x5b, 0x00, 0x6b, 0x96, 0x36, 0x16,
- 0x00, 0x6b, 0xba, 0x08, 0x74, 0x00, 0x6b, 0xbb,
- 0x34, 0x70, 0x00, 0x6c, 0x08, 0x1f, 0x39, 0x00,
- 0x6c, 0x13, 0x34, 0xf5, 0x00, 0x6c, 0x38, 0x4e,
- 0xba, 0x00, 0x6c, 0x3a, 0x39, 0x62, 0x00, 0x6c,
- 0x72, 0x1f, 0x1e, 0x00, 0x6c, 0xaa, 0x37, 0x48,
- 0x00, 0x6c, 0xbf, 0x05, 0x0a, 0x00, 0x6c, 0xe1,
- 0x1e, 0x71, 0x00, 0x6c, 0xe8, 0x36, 0x66, 0x00,
- 0x6d, 0x3e, 0x34, 0xae, 0x00, 0x6d, 0x69, 0x35,
- 0xc8, 0x00, 0x6d, 0x6e, 0x36, 0xb4, 0x00, 0x6d,
- 0x77, 0x05, 0x82, 0x00, 0x6d, 0x78, 0x36, 0x1d,
- 0x00, 0x6d, 0x88, 0x36, 0x0c, 0x00, 0x6d, 0xe4,
- 0x4e, 0xbd, 0x00, 0x6d, 0xeb, 0x1d, 0xd5, 0x00,
- 0x6d, 0xfb, 0x36, 0x7c, 0x00, 0x6e, 0x08, 0x4e,
- 0xbf, 0x00, 0x6e, 0x1a, 0x09, 0x77, 0x00, 0x6e,
- 0x23, 0x1f, 0x3a, 0x00, 0x6e, 0x2f, 0x35, 0xc9,
- 0x00, 0x6e, 0x6e, 0x1e, 0x9d, 0x00, 0x6e, 0x72,
- 0x4e, 0xc0, 0x00, 0x6e, 0x7e, 0x34, 0xcf, 0x00,
- 0x6e, 0x9d, 0x1e, 0x01, 0x00, 0x6e, 0xa2, 0x1d,
- 0xd3, 0x00, 0x6e, 0xba, 0x1e, 0x46, 0x00, 0x6e,
- 0xcb, 0x35, 0xe9, 0x00, 0x6e, 0xd5, 0x4e, 0xc2,
- 0x00, 0x6e, 0xdb, 0x4e, 0xc3, 0x00, 0x6e, 0xec,
- 0x1f, 0x3b, 0x00, 0x6e, 0xfe, 0x34, 0xf8, 0x00,
- 0x6f, 0x11, 0x34, 0xf7, 0x00, 0x6f, 0x22, 0x34,
- 0x14, 0x00, 0x6f, 0x23, 0x0f, 0xc2, 0x00, 0x6f,
- 0x3e, 0x34, 0xf9, 0x00, 0x6f, 0x51, 0x36, 0x9e,
- 0x00, 0x6f, 0x54, 0x35, 0xb0, 0x00, 0x6f, 0x5b,
- 0x4e, 0xc4, 0x00, 0x6f, 0x64, 0x4e, 0xc6, 0x00,
- 0x6f, 0x6e, 0x0b, 0xc8, 0x00, 0x6f, 0x74, 0x4e,
- 0xc7, 0x00, 0x6f, 0x98, 0x37, 0x47, 0x00, 0x6f,
- 0xef, 0x1e, 0x33, 0x00, 0x6f, 0xf9, 0x39, 0x95,
- 0x00, 0x70, 0x15, 0x1e, 0x6b, 0x00, 0x70, 0x1b,
- 0x37, 0x4a, 0x00, 0x70, 0x1e, 0x1e, 0x51, 0x00,
- 0x70, 0x26, 0x1e, 0x3d, 0x00, 0x70, 0x27, 0x36,
- 0x57, 0x00, 0x70, 0x4a, 0x39, 0x98, 0x00, 0x70,
- 0x58, 0x1e, 0x57, 0x00, 0x70, 0x70, 0x35, 0x6a,
- 0x00, 0x70, 0x78, 0x4f, 0x2e, 0x00, 0x70, 0x7c,
- 0x1e, 0x10, 0x00, 0x70, 0xad, 0x36, 0x5c, 0x00,
- 0x71, 0x49, 0x0f, 0xc3, 0x00, 0x71, 0x4e, 0x1e,
- 0x26, 0x00, 0x71, 0x52, 0x55, 0xad, 0x00, 0x71,
- 0x59, 0x35, 0x59, 0x00, 0x71, 0x62, 0x37, 0x4b,
- 0x00, 0x71, 0x6e, 0x08, 0xfd, 0x00, 0x71, 0x7d,
- 0x1e, 0x27, 0x00, 0x71, 0x94, 0x1e, 0x7d, 0x00,
- 0x71, 0xb3, 0x39, 0xae, 0x00, 0x71, 0xd0, 0x37,
- 0x0a, 0x00, 0x71, 0xff, 0x34, 0xfa, 0x00, 0x72,
- 0x28, 0x15, 0xdf, 0x00, 0x72, 0x2b, 0x3c, 0x26,
- 0x00, 0x72, 0x35, 0x09, 0x0b, 0x00, 0x72, 0x36,
- 0x34, 0xb9, 0x00, 0x72, 0x3a, 0x4f, 0x46, 0x00,
- 0x72, 0x3b, 0x37, 0x4c, 0x00, 0x72, 0x3e, 0x4e,
- 0xc9, 0x00, 0x72, 0x4c, 0x1e, 0x5b, 0x00, 0x72,
- 0x59, 0x1f, 0x1d, 0x00, 0x72, 0xe1, 0x4f, 0x36,
- 0x00, 0x73, 0x1c, 0x37, 0x4e, 0x00, 0x73, 0x2a,
- 0x0b, 0xb4, 0x00, 0x73, 0x36, 0x36, 0xf8, 0x00,
- 0x73, 0x37, 0x1e, 0x7c, 0x00, 0x73, 0x87, 0x37,
- 0x05, 0x00, 0x73, 0x8b, 0x35, 0xa1, 0x00, 0x73,
- 0xca, 0x1e, 0x0b, 0x00, 0x73, 0xce, 0x1e, 0xa0,
- 0x00, 0x73, 0xe5, 0x34, 0xfb, 0x00, 0x73, 0xed,
- 0x34, 0xb1, 0x00, 0x74, 0x22, 0x0b, 0x56, 0x00,
- 0x74, 0x32, 0x34, 0xfc, 0x00, 0x74, 0x5f, 0x34,
- 0xfd, 0x00, 0x74, 0x62, 0x21, 0x71, 0x00, 0x74,
- 0xb0, 0x35, 0x79, 0x00, 0x74, 0xbd, 0x4e, 0xcd,
- 0x00, 0x74, 0xca, 0x37, 0x4f, 0x00, 0x74, 0xd8,
- 0x55, 0xf6, 0x00, 0x74, 0xdc, 0x35, 0x50, 0x00,
- 0x74, 0xe0, 0x34, 0xfe, 0x00, 0x74, 0xef, 0x55,
- 0xfa, 0x00, 0x75, 0x04, 0x1e, 0xa1, 0x00, 0x75,
- 0x0c, 0x34, 0xff, 0x00, 0x75, 0x0d, 0x1e, 0xa2,
- 0x00, 0x75, 0x11, 0x1e, 0x04, 0x00, 0x75, 0x15,
- 0x1e, 0xa3, 0x00, 0x75, 0x26, 0x4f, 0x3b, 0x00,
- 0x75, 0x54, 0x36, 0xa4, 0x00, 0x75, 0x5d, 0x4e,
- 0xce, 0x00, 0x75, 0xbc, 0x4e, 0xcf, 0x00, 0x75,
- 0xc5, 0x36, 0xb1, 0x00, 0x76, 0x08, 0x4e, 0xd1,
- 0x00, 0x76, 0x26, 0x1e, 0x2d, 0x00, 0x76, 0x52,
- 0x1e, 0x7b, 0x00, 0x76, 0x64, 0x4e, 0xd2, 0x00,
- 0x76, 0x69, 0x4e, 0xd3, 0x00, 0x76, 0x72, 0x35,
- 0x00, 0x00, 0x76, 0x84, 0x36, 0x79, 0x00, 0x76,
- 0x93, 0x1e, 0xa4, 0x00, 0x76, 0xc6, 0x34, 0xc4,
- 0x00, 0x76, 0xca, 0x21, 0x7b, 0x00, 0x76, 0xd4,
- 0x56, 0x1d, 0x00, 0x76, 0xdb, 0x36, 0x2c, 0x00,
- 0x76, 0xdf, 0x36, 0xe5, 0x00, 0x76, 0xf2, 0x36,
- 0xe9, 0x00, 0x76, 0xf4, 0x36, 0x6e, 0x00, 0x77,
- 0x1e, 0x16, 0xb8, 0x00, 0x77, 0x1f, 0x36, 0x1e,
- 0x00, 0x77, 0x37, 0x4e, 0xd5, 0x00, 0x77, 0x3a,
- 0x34, 0xa6, 0x00, 0x77, 0x7e, 0x4e, 0xd6, 0x00,
- 0x77, 0x8d, 0x56, 0x2e, 0x00, 0x77, 0xa2, 0x56,
- 0x2f, 0x00, 0x77, 0xa5, 0x1e, 0x6e, 0x00, 0x77,
- 0xac, 0x34, 0x92, 0x00, 0x77, 0xe9, 0x35, 0xa4,
- 0x00, 0x78, 0x32, 0x36, 0xc7, 0x00, 0x78, 0x3a,
- 0x36, 0x7f, 0x00, 0x78, 0x5d, 0x36, 0x0d, 0x00,
- 0x78, 0x6c, 0x34, 0x83, 0x00, 0x78, 0x7c, 0x1e,
- 0xa5, 0x00, 0x78, 0x91, 0x0d, 0x7e, 0x00, 0x78,
- 0xd4, 0x35, 0x02, 0x00, 0x78, 0xe8, 0x36, 0xda,
- 0x00, 0x78, 0xef, 0x35, 0x4b, 0x00, 0x79, 0x2a,
- 0x35, 0x01, 0x00, 0x79, 0x34, 0x3a, 0x38, 0x00,
- 0x79, 0x3a, 0x08, 0xd4, 0x00, 0x79, 0x3c, 0x21,
- 0x83, 0x00, 0x79, 0x3e, 0x34, 0x24, 0x00, 0x79,
- 0x40, 0x37, 0x57, 0x00, 0x79, 0x41, 0x1d, 0xf4,
- 0x00, 0x79, 0x47, 0x1d, 0xeb, 0x00, 0x79, 0x48,
- 0x06, 0x41, 0x00, 0x79, 0x49, 0x34, 0x21, 0x00,
- 0x79, 0x50, 0x0f, 0x1e, 0x00, 0x79, 0x53, 0x37,
- 0x58, 0x00, 0x79, 0x56, 0x34, 0x2f, 0x00, 0x79,
- 0x5d, 0x09, 0x55, 0x00, 0x79, 0x5e, 0x0a, 0x06,
- 0x00, 0x79, 0x62, 0x1f, 0x29, 0x00, 0x79, 0x65,
- 0x09, 0xb5, 0x00, 0x79, 0x8d, 0x05, 0x52, 0x00,
- 0x79, 0x8e, 0x34, 0x3b, 0x00, 0x79, 0x8f, 0x21,
- 0x87, 0x00, 0x79, 0xa7, 0x4e, 0xd7, 0x00, 0x79,
- 0xae, 0x37, 0x5b, 0x00, 0x79, 0xb0, 0x1e, 0x59,
- 0x00, 0x79, 0xb1, 0x4e, 0xd8, 0x00, 0x79, 0xba,
- 0x35, 0x03, 0x00, 0x79, 0xe4, 0x1e, 0x5d, 0x00,
- 0x7a, 0x0b, 0x36, 0x78, 0x00, 0x7a, 0x17, 0x1e,
- 0x66, 0x00, 0x7a, 0x19, 0x35, 0x04, 0x00, 0x7a,
- 0x31, 0x1e, 0xa6, 0x00, 0x7a, 0x40, 0x08, 0x04,
- 0x00, 0x7a, 0x60, 0x3a, 0x4e, 0x00, 0x7a, 0x74,
- 0x34, 0x7a, 0x00, 0x7a, 0x7a, 0x35, 0xa7, 0x00,
- 0x7a, 0x7f, 0x1f, 0x25, 0x00, 0x7a, 0x81, 0x34,
- 0x3d, 0x00, 0x7a, 0x95, 0x35, 0x05, 0x00, 0x7a,
- 0x97, 0x1f, 0x3c, 0x00, 0x7a, 0xae, 0x34, 0x77,
- 0x00, 0x7a, 0xbe, 0x4e, 0xd9, 0x00, 0x7a, 0xc6,
- 0x3c, 0x27, 0x00, 0x7a, 0xc8, 0x4f, 0x3d, 0x00,
- 0x7b, 0x08, 0x1f, 0x1f, 0x00, 0x7b, 0x51, 0x36,
- 0x63, 0x00, 0x7b, 0x75, 0x4f, 0x2a, 0x00, 0x7b,
- 0x99, 0x1e, 0xa8, 0x00, 0x7b, 0xad, 0x1f, 0x26,
- 0x00, 0x7b, 0xb8, 0x1e, 0x5f, 0x00, 0x7b, 0xc0,
- 0x34, 0x2e, 0x00, 0x7b, 0xc7, 0x1f, 0x2b, 0x00,
- 0x7b, 0xc9, 0x36, 0x61, 0x00, 0x7b, 0xdd, 0x1f,
- 0x3d, 0x00, 0x7b, 0xe0, 0x4e, 0xda, 0x00, 0x7c,
- 0x14, 0x37, 0x5f, 0x00, 0x7c, 0x3e, 0x1f, 0x2d,
- 0x00, 0x7c, 0x3f, 0x36, 0xc2, 0x00, 0x7c, 0x4d,
- 0x36, 0x36, 0x00, 0x7c, 0x50, 0x37, 0x61, 0x00,
- 0x7c, 0x58, 0x37, 0x62, 0x00, 0x7c, 0x69, 0x56,
- 0xaa, 0x00, 0x7c, 0x7e, 0x1e, 0x78, 0x00, 0x7c,
- 0x82, 0x4f, 0x30, 0x00, 0x7c, 0x89, 0x34, 0xbe,
- 0x00, 0x7c, 0x90, 0x1e, 0xa9, 0x00, 0x7c, 0xae,
- 0x1e, 0xaa, 0x00, 0x7c, 0xbe, 0x0a, 0x5e, 0x00,
- 0x7c, 0xd6, 0x0c, 0x76, 0x00, 0x7c, 0xf2, 0x35,
- 0x06, 0x00, 0x7d, 0x04, 0x36, 0xee, 0x00, 0x7d,
- 0x09, 0x4e, 0xdc, 0x00, 0x7d, 0x0b, 0x36, 0xec,
- 0x00, 0x7d, 0x0d, 0x36, 0x94, 0x00, 0x7d, 0x1a,
- 0x35, 0x91, 0x00, 0x7d, 0x1b, 0x34, 0xbf, 0x00,
- 0x7d, 0x42, 0x35, 0xf8, 0x00, 0x7d, 0x46, 0x37,
- 0x63, 0x00, 0x7d, 0x5c, 0x21, 0x90, 0x00, 0x7d,
- 0x5e, 0x34, 0x84, 0x00, 0x7d, 0x63, 0x37, 0x64,
- 0x00, 0x7d, 0x73, 0x35, 0x07, 0x00, 0x7d, 0x9b,
- 0x1e, 0xab, 0x00, 0x7d, 0x9f, 0x1e, 0xad, 0x00,
- 0x7d, 0xae, 0x1e, 0xac, 0x00, 0x7d, 0xb2, 0x4e,
- 0xdd, 0x00, 0x7d, 0xcb, 0x34, 0xb6, 0x00, 0x7d,
- 0xcf, 0x34, 0xa0, 0x00, 0x7d, 0xdd, 0x35, 0x08,
- 0x00, 0x7d, 0xe8, 0x36, 0xbf, 0x00, 0x7d, 0xe9,
- 0x35, 0x7a, 0x00, 0x7d, 0xef, 0x34, 0x62, 0x00,
- 0x7d, 0xf4, 0x0f, 0xc5, 0x00, 0x7e, 0x09, 0x47,
- 0xbe, 0x00, 0x7e, 0x1b, 0x36, 0x9b, 0x00, 0x7e,
- 0x22, 0x37, 0x65, 0x00, 0x7e, 0x2b, 0x36, 0xc8,
- 0x00, 0x7e, 0x35, 0x35, 0x09, 0x00, 0x7e, 0x41,
- 0x34, 0x40, 0x00, 0x7e, 0x43, 0x37, 0x69, 0x00,
- 0x7e, 0x6d, 0x36, 0xe1, 0x00, 0x7e, 0x8c, 0x37,
- 0x6a, 0x00, 0x7f, 0x3e, 0x4e, 0xdf, 0x00, 0x7f,
- 0x50, 0x37, 0x6b, 0x00, 0x7f, 0x61, 0x3c, 0x28,
- 0x00, 0x7f, 0x6a, 0x34, 0x89, 0x00, 0x7f, 0x6e,
- 0x36, 0x60, 0x00, 0x7f, 0x72, 0x09, 0x7a, 0x00,
- 0x7f, 0x80, 0x56, 0xda, 0x00, 0x7f, 0x8a, 0x0f,
- 0x3d, 0x00, 0x7f, 0xa1, 0x36, 0x3d, 0x00, 0x7f,
- 0xae, 0x35, 0x0a, 0x00, 0x7f, 0xbd, 0x04, 0xcb,
- 0x00, 0x7f, 0xc1, 0x34, 0x6a, 0x00, 0x7f, 0xc5,
- 0x37, 0x6f, 0x00, 0x7f, 0xc6, 0x37, 0x70, 0x00,
- 0x7f, 0xcc, 0x37, 0x01, 0x00, 0x7f, 0xd2, 0x35,
- 0xf9, 0x00, 0x7f, 0xd4, 0x1e, 0xae, 0x00, 0x7f,
- 0xe0, 0x1e, 0x20, 0x00, 0x7f, 0xe1, 0x35, 0x0b,
- 0x00, 0x7f, 0xe9, 0x1f, 0x3e, 0x00, 0x7f, 0xeb,
- 0x1d, 0xe9, 0x00, 0x7f, 0xf0, 0x1d, 0xe8, 0x00,
- 0x7f, 0xfb, 0x36, 0xd8, 0x00, 0x7f, 0xfc, 0x34,
- 0xc8, 0x00, 0x80, 0x00, 0x1e, 0x7e, 0x00, 0x80,
- 0x03, 0x34, 0x85, 0x00, 0x80, 0x05, 0x34, 0x25,
- 0x00, 0x80, 0x12, 0x4e, 0xe1, 0x00, 0x80, 0x15,
- 0x35, 0xca, 0x00, 0x80, 0x17, 0x36, 0xea, 0x00,
- 0x80, 0x36, 0x34, 0xc7, 0x00, 0x80, 0x56, 0x36,
- 0x2d, 0x00, 0x80, 0x5a, 0x35, 0x0c, 0x00, 0x80,
- 0x5f, 0x35, 0x0d, 0x00, 0x80, 0x61, 0x34, 0xa1,
- 0x00, 0x80, 0x6f, 0x34, 0xcd, 0x00, 0x80, 0x70,
- 0x35, 0x0f, 0x00, 0x80, 0x71, 0x3c, 0x29, 0x00,
- 0x80, 0x73, 0x35, 0x0e, 0x00, 0x80, 0x74, 0x34,
- 0xa7, 0x00, 0x80, 0x76, 0x35, 0x10, 0x00, 0x80,
- 0x77, 0x34, 0x9a, 0x00, 0x80, 0x7e, 0x34, 0xce,
- 0x00, 0x80, 0x87, 0x36, 0x9c, 0x00, 0x80, 0x89,
- 0x36, 0x8f, 0x00, 0x80, 0x96, 0x36, 0x0e, 0x00,
- 0x80, 0x9e, 0x3c, 0x2a, 0x00, 0x80, 0xa9, 0x35,
- 0xb8, 0x00, 0x80, 0xba, 0x36, 0x97, 0x00, 0x80,
- 0xd6, 0x4e, 0xe3, 0x00, 0x80, 0xde, 0x36, 0xc9,
- 0x00, 0x81, 0x06, 0x36, 0x34, 0x00, 0x81, 0x08,
- 0x34, 0xc6, 0x00, 0x81, 0x09, 0x4e, 0xe4, 0x00,
- 0x81, 0x29, 0x4e, 0xe5, 0x00, 0x81, 0x53, 0x35,
- 0x11, 0x00, 0x81, 0x54, 0x35, 0xcb, 0x00, 0x81,
- 0x70, 0x35, 0xd1, 0x00, 0x81, 0x71, 0x4f, 0x33,
- 0x00, 0x81, 0x7f, 0x1e, 0x30, 0x00, 0x81, 0x8a,
- 0x35, 0x12, 0x00, 0x81, 0xb5, 0x35, 0x13, 0x00,
- 0x81, 0xcd, 0x35, 0x14, 0x00, 0x81, 0xed, 0x34,
- 0x26, 0x00, 0x82, 0x00, 0x57, 0x0f, 0x00, 0x82,
- 0x0c, 0x4e, 0xe6, 0x00, 0x82, 0x18, 0x35, 0x7f,
- 0x00, 0x82, 0x1b, 0x4e, 0xe7, 0x00, 0x82, 0x1c,
- 0x34, 0x93, 0x00, 0x82, 0x1f, 0x35, 0xb3, 0x00,
- 0x82, 0x2e, 0x1e, 0xaf, 0x00, 0x82, 0x39, 0x34,
- 0x9f, 0x00, 0x82, 0x40, 0x4e, 0xe8, 0x00, 0x82,
- 0x47, 0x34, 0xab, 0x00, 0x82, 0x58, 0x37, 0x74,
- 0x00, 0x82, 0x79, 0x37, 0x77, 0x00, 0x82, 0x8d,
- 0x1e, 0xb0, 0x00, 0x82, 0x92, 0x4f, 0x44, 0x00,
- 0x82, 0xa6, 0x1f, 0x19, 0x00, 0x82, 0xb1, 0x35,
- 0x62, 0x00, 0x82, 0xbd, 0x05, 0x6a, 0x00, 0x82,
- 0xc5, 0x35, 0x77, 0x00, 0x82, 0xd2, 0x1e, 0xb1,
- 0x00, 0x82, 0xe3, 0x37, 0x78, 0x00, 0x83, 0x23,
- 0x1e, 0xb2, 0x00, 0x83, 0x28, 0x1f, 0x1a, 0x00,
- 0x83, 0x52, 0x35, 0xcc, 0x00, 0x83, 0x75, 0x1e,
- 0xb3, 0x00, 0x83, 0xbd, 0x37, 0x7c, 0x00, 0x83,
- 0xd3, 0x35, 0x63, 0x00, 0x83, 0xd4, 0x4e, 0xea,
- 0x00, 0x83, 0xdc, 0x35, 0xda, 0x00, 0x83, 0xdf,
- 0x1e, 0x4b, 0x00, 0x83, 0xf2, 0x35, 0x15, 0x00,
- 0x84, 0x0c, 0x36, 0xca, 0x00, 0x84, 0x0f, 0x4e,
- 0xeb, 0x00, 0x84, 0x20, 0x37, 0x7b, 0x00, 0x84,
- 0x22, 0x1f, 0x3f, 0x00, 0x84, 0x57, 0x34, 0x37,
- 0x00, 0x84, 0x5b, 0x1d, 0xe4, 0x00, 0x84, 0x5c,
- 0x57, 0x45, 0x00, 0x84, 0x7a, 0x34, 0xba, 0x00,
- 0x84, 0xea, 0x4e, 0xed, 0x00, 0x84, 0xec, 0x1e,
- 0x72, 0x00, 0x84, 0xee, 0x0f, 0xc7, 0x00, 0x84,
- 0xf4, 0x37, 0x7d, 0x00, 0x85, 0x11, 0x36, 0xbd,
- 0x00, 0x85, 0x17, 0x1e, 0xb4, 0x00, 0x85, 0x3d,
- 0x1e, 0x6d, 0x00, 0x85, 0x43, 0x36, 0xa6, 0x00,
- 0x85, 0x51, 0x4e, 0xef, 0x00, 0x85, 0x55, 0x35,
- 0x16, 0x00, 0x85, 0x5d, 0x57, 0x64, 0x00, 0x85,
- 0x63, 0x4e, 0xf0, 0x00, 0x85, 0x84, 0x36, 0x99,
- 0x00, 0x85, 0x87, 0x37, 0x7f, 0x00, 0x85, 0xa9,
- 0x1e, 0x08, 0x00, 0x85, 0xaf, 0x1e, 0x15, 0x00,
- 0x85, 0xcf, 0x4e, 0xf1, 0x00, 0x85, 0xd5, 0x35,
- 0x17, 0x00, 0x85, 0xe4, 0x36, 0x85, 0x00, 0x85,
- 0xf7, 0x1e, 0x16, 0x00, 0x86, 0x12, 0x21, 0xa4,
- 0x00, 0x86, 0x2d, 0x37, 0x04, 0x00, 0x86, 0x4e,
- 0x4e, 0xf2, 0x00, 0x86, 0x50, 0x35, 0x8c, 0x00,
- 0x86, 0x54, 0x4f, 0x32, 0x00, 0x86, 0x5c, 0x0f,
- 0x82, 0x00, 0x86, 0x5e, 0x35, 0xa6, 0x00, 0x86,
- 0x62, 0x4e, 0xf3, 0x00, 0x86, 0x8a, 0x4e, 0xf4,
- 0x00, 0x86, 0xdb, 0x34, 0x5e, 0x00, 0x86, 0xf8,
- 0x1e, 0x35, 0x00, 0x87, 0x03, 0x4f, 0x48, 0x00,
- 0x87, 0x1a, 0x35, 0x18, 0x00, 0x87, 0x37, 0x37,
- 0x82, 0x00, 0x87, 0x3b, 0x37, 0x83, 0x00, 0x87,
- 0x55, 0x1e, 0x1d, 0x00, 0x87, 0x59, 0x1f, 0x40,
- 0x00, 0x87, 0x82, 0x1e, 0xb6, 0x00, 0x87, 0xa3,
- 0x57, 0xaa, 0x00, 0x87, 0xbd, 0x37, 0x85, 0x00,
- 0x87, 0xd2, 0x1e, 0xb7, 0x00, 0x88, 0x03, 0x3b,
- 0x03, 0x00, 0x88, 0x05, 0x37, 0x84, 0x00, 0x88,
- 0x0e, 0x1f, 0x41, 0x00, 0x88, 0x36, 0x35, 0x19,
- 0x00, 0x88, 0x42, 0x4e, 0xf5, 0x00, 0x88, 0x46,
- 0x35, 0xfa, 0x00, 0x88, 0x4b, 0x57, 0xc3, 0x00,
- 0x88, 0x53, 0x35, 0xfd, 0x00, 0x88, 0x5b, 0x34,
- 0x66, 0x00, 0x88, 0x5e, 0x35, 0x53, 0x00, 0x88,
- 0x63, 0x35, 0x48, 0x00, 0x88, 0x70, 0x36, 0x27,
- 0x00, 0x88, 0x77, 0x4e, 0xf6, 0x00, 0x88, 0x9e,
- 0x35, 0x1a, 0x00, 0x88, 0xd8, 0x35, 0x1b, 0x00,
- 0x88, 0xf4, 0x35, 0x1c, 0x00, 0x89, 0x0a, 0x1e,
- 0xb8, 0x00, 0x89, 0x10, 0x34, 0x13, 0x00, 0x89,
- 0x1c, 0x37, 0xcb, 0x00, 0x89, 0x2b, 0x35, 0x1d,
- 0x00, 0x89, 0x3b, 0x35, 0x1e, 0x00, 0x89, 0x41,
- 0x4e, 0xf7, 0x00, 0x89, 0x56, 0x1d, 0xdd, 0x00,
- 0x89, 0x6a, 0x35, 0x1f, 0x00, 0x89, 0x6f, 0x35,
- 0x20, 0x00, 0x89, 0x81, 0x36, 0xff, 0x00, 0x89,
- 0x86, 0x36, 0xb8, 0x00, 0x89, 0x87, 0x36, 0x95,
- 0x00, 0x89, 0x96, 0x34, 0x22, 0x00, 0x89, 0xaa,
- 0x34, 0x9b, 0x00, 0x89, 0xaf, 0x1e, 0xb9, 0x00,
- 0x89, 0xbd, 0x37, 0x8a, 0x00, 0x89, 0xd2, 0x05,
- 0xaf, 0x00, 0x8a, 0x0a, 0x36, 0x24, 0x00, 0x8a,
- 0x12, 0x37, 0xd7, 0x00, 0x8a, 0x1d, 0x35, 0x21,
- 0x00, 0x8a, 0x1f, 0x34, 0x96, 0x00, 0x8a, 0x3b,
- 0x1e, 0x3c, 0x00, 0x8a, 0x55, 0x36, 0xaf, 0x00,
- 0x8a, 0x6e, 0x1e, 0x28, 0x00, 0x8a, 0x8d, 0x36,
- 0x92, 0x00, 0x8a, 0x95, 0x34, 0xa3, 0x00, 0x8a,
- 0xa0, 0x36, 0x2f, 0x00, 0x8a, 0xa4, 0x35, 0xc2,
- 0x00, 0x8a, 0xb9, 0x34, 0xb7, 0x00, 0x8a, 0xbf,
- 0x36, 0x6d, 0x00, 0x8a, 0xcb, 0x36, 0x30, 0x00,
- 0x8a, 0xdb, 0x37, 0x8b, 0x00, 0x8a, 0xde, 0x1e,
- 0xba, 0x00, 0x8a, 0xed, 0x0f, 0x0b, 0x00, 0x8a,
- 0xee, 0x35, 0xe3, 0x00, 0x8a, 0xf8, 0x09, 0x7e,
- 0x00, 0x8a, 0xfa, 0x1d, 0xfe, 0x00, 0x8b, 0x01,
- 0x04, 0xfc, 0x00, 0x8b, 0x04, 0x36, 0x86, 0x00,
- 0x8b, 0x0e, 0x1e, 0x56, 0x00, 0x8b, 0x19, 0x35,
- 0xb9, 0x00, 0x8b, 0x1b, 0x35, 0xcd, 0x00, 0x8b,
- 0x1d, 0x34, 0x8d, 0x00, 0x8b, 0x2c, 0x1e, 0x69,
- 0x00, 0x8b, 0x39, 0x06, 0xd8, 0x00, 0x8b, 0x3e,
- 0x37, 0x8c, 0x00, 0x8b, 0x41, 0x1e, 0xbb, 0x00,
- 0x8b, 0x56, 0x4e, 0xf8, 0x00, 0x8b, 0x5a, 0x37,
- 0x8d, 0x00, 0x8b, 0x5c, 0x4e, 0xfa, 0x00, 0x8b,
- 0x7f, 0x52, 0x52, 0x00, 0x8c, 0x6a, 0x4e, 0xfd,
- 0x00, 0x8c, 0x79, 0x4e, 0xfe, 0x00, 0x8c, 0x9b,
- 0x58, 0x37, 0x00, 0x8c, 0xa0, 0x36, 0xb5, 0x00,
- 0x8c, 0xa7, 0x34, 0xb8, 0x00, 0x8c, 0xa8, 0x35,
- 0x64, 0x00, 0x8c, 0xab, 0x34, 0x72, 0x00, 0x8c,
- 0xc7, 0x35, 0xe5, 0x00, 0x8c, 0xca, 0x36, 0x4c,
- 0x00, 0x8c, 0xd3, 0x0d, 0xc2, 0x00, 0x8c, 0xed,
- 0x1e, 0x4c, 0x00, 0x8c, 0xfc, 0x34, 0x86, 0x00,
- 0x8d, 0x05, 0x35, 0x22, 0x00, 0x8d, 0x08, 0x34,
- 0x34, 0x00, 0x8d, 0x0f, 0x35, 0x23, 0x00, 0x8d,
- 0x67, 0x4f, 0x00, 0x00, 0x8d, 0x70, 0x36, 0x46,
- 0x00, 0x8d, 0x73, 0x37, 0x8e, 0x00, 0x8d, 0x77,
- 0x35, 0x88, 0x00, 0x8d, 0x99, 0x37, 0x8f, 0x00,
- 0x8d, 0xda, 0x1e, 0xbc, 0x00, 0x8d, 0xdd, 0x35,
- 0x94, 0x00, 0x8d, 0xf3, 0x34, 0xa8, 0x00, 0x8e,
- 0x09, 0x1e, 0xbd, 0x00, 0x8e, 0x34, 0x37, 0x91,
- 0x00, 0x8e, 0x4a, 0x37, 0x92, 0x00, 0x8e, 0x8d,
- 0x36, 0xef, 0x00, 0x8e, 0x91, 0x35, 0x25, 0x00,
- 0x8e, 0xa1, 0x35, 0x26, 0x00, 0x8e, 0xcc, 0x34,
- 0x76, 0x00, 0x8e, 0xd4, 0x3b, 0x4a, 0x00, 0x8f,
- 0x03, 0x4f, 0x02, 0x00, 0x8f, 0x13, 0x1e, 0xbe,
- 0x00, 0x8f, 0x29, 0x34, 0xb0, 0x00, 0x8f, 0x2f,
- 0x34, 0x90, 0x00, 0x8f, 0x38, 0x36, 0xf5, 0x00,
- 0x8f, 0x44, 0x35, 0x75, 0x00, 0x8f, 0xb6, 0x3c,
- 0x2b, 0x00, 0x8f, 0xbb, 0x20, 0x4b, 0x00, 0x8f,
- 0xbc, 0x35, 0xd3, 0x00, 0x8f, 0xbf, 0x1e, 0x37,
- 0x00, 0x8f, 0xc2, 0x1d, 0xd6, 0x00, 0x8f, 0xc4,
- 0x1f, 0x2c, 0x00, 0x8f, 0xc5, 0x36, 0x26, 0x00,
- 0x8f, 0xc6, 0x3b, 0x51, 0x00, 0x8f, 0xce, 0x35,
- 0xae, 0x00, 0x8f, 0xd1, 0x35, 0xa2, 0x00, 0x8f,
- 0xd4, 0x36, 0xc0, 0x00, 0x8f, 0xe6, 0x1d, 0xdf,
- 0x00, 0x8f, 0xe9, 0x1e, 0xc0, 0x00, 0x8f, 0xea,
- 0x1e, 0xbf, 0x00, 0x8f, 0xeb, 0x36, 0x9a, 0x00,
- 0x8f, 0xed, 0x36, 0x7b, 0x00, 0x8f, 0xef, 0x37,
- 0x93, 0x00, 0x8f, 0xf0, 0x35, 0xfe, 0x00, 0x8f,
- 0xf6, 0x4f, 0x06, 0x00, 0x8f, 0xf7, 0x36, 0xe6,
- 0x00, 0x8f, 0xfa, 0x37, 0x95, 0x00, 0x8f, 0xfd,
- 0x36, 0x72, 0x00, 0x90, 0x00, 0x36, 0x51, 0x00,
- 0x90, 0x01, 0x36, 0x47, 0x00, 0x90, 0x03, 0x34,
- 0xad, 0x00, 0x90, 0x06, 0x35, 0x8d, 0x00, 0x90,
- 0x0e, 0x35, 0x28, 0x00, 0x90, 0x0f, 0x36, 0x88,
- 0x00, 0x90, 0x10, 0x36, 0x64, 0x00, 0x90, 0x14,
- 0x36, 0x7e, 0x00, 0x90, 0x17, 0x1e, 0x1f, 0x00,
- 0x90, 0x19, 0x1e, 0x5c, 0x00, 0x90, 0x1a, 0x36,
- 0x73, 0x00, 0x90, 0x1d, 0x1e, 0x22, 0x00, 0x90,
- 0x1e, 0x37, 0x96, 0x00, 0x90, 0x1f, 0x36, 0x4b,
- 0x00, 0x90, 0x20, 0x36, 0x49, 0x00, 0x90, 0x22,
- 0x20, 0x4a, 0x00, 0x90, 0x23, 0x0f, 0xc8, 0x00,
- 0x90, 0x2e, 0x36, 0x52, 0x00, 0x90, 0x31, 0x35,
- 0xfb, 0x00, 0x90, 0x32, 0x36, 0x1f, 0x00, 0x90,
- 0x35, 0x37, 0x97, 0x00, 0x90, 0x38, 0x34, 0x08,
- 0x00, 0x90, 0x39, 0x36, 0x58, 0x00, 0x90, 0x3c,
- 0x1e, 0x67, 0x00, 0x90, 0x41, 0x1e, 0x53, 0x00,
- 0x90, 0x42, 0x34, 0x9c, 0x00, 0x90, 0x47, 0x35,
- 0xa8, 0x00, 0x90, 0x4a, 0x36, 0xfc, 0x00, 0x90,
- 0x4b, 0x35, 0x51, 0x00, 0x90, 0x4d, 0x36, 0xc1,
- 0x00, 0x90, 0x4e, 0x35, 0x65, 0x00, 0x90, 0x50,
- 0x37, 0x98, 0x00, 0x90, 0x52, 0x35, 0x27, 0x00,
- 0x90, 0x53, 0x36, 0x8b, 0x00, 0x90, 0x54, 0x36,
- 0x58, 0x00, 0x90, 0x55, 0x34, 0x63, 0x00, 0x90,
- 0x58, 0x1e, 0xc1, 0x00, 0x90, 0x5c, 0x1e, 0x2e,
- 0x00, 0x90, 0x60, 0x35, 0x5a, 0x00, 0x90, 0x61,
- 0x1e, 0x2a, 0x00, 0x90, 0x63, 0x35, 0xba, 0x00,
- 0x90, 0x69, 0x36, 0x7a, 0x00, 0x90, 0x6d, 0x36,
- 0x48, 0x00, 0x90, 0x6e, 0x1e, 0x0e, 0x00, 0x90,
- 0x75, 0x36, 0x00, 0x00, 0x90, 0x77, 0x36, 0x40,
- 0x00, 0x90, 0x78, 0x36, 0x3f, 0x00, 0x90, 0x7a,
- 0x35, 0x4a, 0x00, 0x90, 0x7c, 0x1e, 0x80, 0x00,
- 0x90, 0x7f, 0x36, 0xa7, 0x00, 0x90, 0x81, 0x37,
- 0x9a, 0x00, 0x90, 0x83, 0x37, 0x5c, 0x00, 0x90,
- 0x84, 0x35, 0x7c, 0x00, 0x90, 0x87, 0x37, 0x94,
- 0x00, 0x90, 0x89, 0x34, 0x5f, 0x00, 0x90, 0x8a,
- 0x37, 0x9b, 0x00, 0x90, 0xa3, 0x1e, 0x55, 0x00,
- 0x90, 0xa6, 0x36, 0xcb, 0x00, 0x90, 0xa8, 0x4f,
- 0x0b, 0x00, 0x90, 0xaa, 0x34, 0x8e, 0x00, 0x90,
- 0xf7, 0x35, 0x9d, 0x00, 0x90, 0xfd, 0x0c, 0x4e,
- 0x00, 0x91, 0x2d, 0x1e, 0x44, 0x00, 0x91, 0x30,
- 0x35, 0x29, 0x00, 0x91, 0x4b, 0x1e, 0x12, 0x00,
- 0x91, 0x4c, 0x35, 0xf2, 0x00, 0x91, 0x4d, 0x4f,
- 0x0c, 0x00, 0x91, 0x56, 0x35, 0x2a, 0x00, 0x91,
- 0x58, 0x35, 0x2b, 0x00, 0x91, 0x65, 0x35, 0x2c,
- 0x00, 0x91, 0x72, 0x35, 0x2e, 0x00, 0x91, 0x73,
- 0x35, 0x2d, 0x00, 0x91, 0x77, 0x35, 0xd0, 0x00,
- 0x91, 0xa2, 0x35, 0x2f, 0x00, 0x91, 0xaa, 0x35,
- 0x31, 0x00, 0x91, 0xaf, 0x35, 0x30, 0x00, 0x91,
- 0xb1, 0x36, 0x9f, 0x00, 0x91, 0xb4, 0x35, 0x32,
- 0x00, 0x91, 0xba, 0x35, 0x33, 0x00, 0x91, 0xc1,
- 0x1e, 0xc3, 0x00, 0x91, 0xc7, 0x1e, 0x05, 0x00,
- 0x91, 0xdc, 0x4f, 0x42, 0x00, 0x91, 0xe3, 0x36,
- 0x75, 0x00, 0x91, 0xfc, 0x3c, 0x2c, 0x00, 0x92,
- 0x37, 0x34, 0x7d, 0x00, 0x92, 0x5b, 0x34, 0x69,
- 0x00, 0x92, 0xe9, 0x4f, 0x0d, 0x00, 0x93, 0x06,
- 0x1e, 0x0a, 0x00, 0x93, 0x35, 0x4f, 0x0e, 0x00,
- 0x93, 0x65, 0x3b, 0x86, 0x00, 0x93, 0x75, 0x4f,
- 0x34, 0x00, 0x93, 0x8b, 0x4f, 0x0f, 0x00, 0x93,
- 0x8c, 0x35, 0x76, 0x00, 0x93, 0x96, 0x35, 0xd5,
- 0x00, 0x93, 0x9a, 0x1e, 0x41, 0x00, 0x93, 0xa1,
- 0x59, 0x04, 0x00, 0x93, 0xae, 0x34, 0x3a, 0x00,
- 0x93, 0xdd, 0x37, 0xae, 0x00, 0x94, 0x3a, 0x4f,
- 0x10, 0x00, 0x94, 0x53, 0x1e, 0x79, 0x00, 0x94,
- 0x77, 0x35, 0x34, 0x00, 0x95, 0x92, 0x35, 0x7d,
- 0x00, 0x95, 0xab, 0x3b, 0x9a, 0x00, 0x95, 0xbb,
- 0x1e, 0xc4, 0x00, 0x95, 0xbc, 0x37, 0xaf, 0x00,
- 0x95, 0xcd, 0x4f, 0x11, 0x00, 0x96, 0x2a, 0x4f,
- 0x12, 0x00, 0x96, 0x4d, 0x34, 0x87, 0x00, 0x96,
- 0x86, 0x34, 0x51, 0x00, 0x96, 0x8a, 0x36, 0x53,
- 0x00, 0x96, 0x94, 0x35, 0x73, 0x00, 0x96, 0x98,
- 0x35, 0x35, 0x00, 0x96, 0x99, 0x4f, 0x31, 0x00,
- 0x96, 0xa3, 0x34, 0xca, 0x00, 0x96, 0xa7, 0x4f,
- 0x14, 0x00, 0x96, 0xb2, 0x37, 0xb1, 0x00, 0x96,
- 0xbb, 0x36, 0x35, 0x00, 0x96, 0xc5, 0x34, 0x6c,
- 0x00, 0x96, 0xc7, 0x35, 0xbe, 0x00, 0x96, 0xd9,
- 0x34, 0xd5, 0x00, 0x96, 0xda, 0x59, 0x3b, 0x00,
- 0x96, 0xe3, 0x0c, 0xc9, 0x00, 0x96, 0xe8, 0x35,
- 0x4d, 0x00, 0x96, 0xea, 0x36, 0x39, 0x00, 0x96,
- 0xf0, 0x34, 0xc0, 0x00, 0x97, 0x21, 0x59, 0x41,
- 0x00, 0x97, 0x24, 0x1e, 0xc6, 0x00, 0x97, 0x3d,
- 0x35, 0x36, 0x00, 0x97, 0x55, 0x21, 0xf8, 0x00,
- 0x97, 0x56, 0x21, 0x8b, 0x00, 0x97, 0x59, 0x37,
- 0xb2, 0x00, 0x97, 0x5c, 0x36, 0x31, 0x00, 0x97,
- 0x60, 0x1e, 0xc7, 0x00, 0x97, 0x6d, 0x1e, 0xc8,
- 0x00, 0x97, 0x71, 0x1e, 0x1e, 0x00, 0x97, 0x74,
- 0x1d, 0xf3, 0x00, 0x97, 0x84, 0x1d, 0xe5, 0x00,
- 0x97, 0x98, 0x1e, 0x1c, 0x00, 0x97, 0xad, 0x4f,
- 0x43, 0x00, 0x97, 0xd3, 0x35, 0x7e, 0x00, 0x97,
- 0xde, 0x3c, 0x2e, 0x00, 0x97, 0xf3, 0x35, 0x60,
- 0x00, 0x97, 0xff, 0x34, 0x19, 0x00, 0x98, 0x0c,
- 0x35, 0x39, 0x00, 0x98, 0x11, 0x34, 0x74, 0x00,
- 0x98, 0x12, 0x34, 0xb2, 0x00, 0x98, 0x13, 0x1e,
- 0x54, 0x00, 0x98, 0x24, 0x1e, 0xc9, 0x00, 0x98,
- 0x3b, 0x0d, 0xc3, 0x00, 0x98, 0x5e, 0x0f, 0xa8,
- 0x00, 0x98, 0x67, 0x35, 0xbf, 0x00, 0x98, 0x73,
- 0x35, 0x3a, 0x00, 0x98, 0xc3, 0x35, 0x3b, 0x00,
- 0x98, 0xdf, 0x36, 0x17, 0x00, 0x98, 0xe2, 0x35,
- 0x89, 0x00, 0x98, 0xeb, 0x37, 0xb4, 0x00, 0x98,
- 0xef, 0x0d, 0x67, 0x00, 0x98, 0xf4, 0x1d, 0xd2,
- 0x00, 0x98, 0xfc, 0x21, 0xfc, 0x00, 0x98, 0xfd,
- 0x36, 0xcd, 0x00, 0x98, 0xfe, 0x36, 0x14, 0x00,
- 0x99, 0x03, 0x37, 0xb5, 0x00, 0x99, 0x05, 0x1e,
- 0x77, 0x00, 0x99, 0x09, 0x37, 0xb6, 0x00, 0x99,
- 0x0a, 0x37, 0x00, 0x00, 0x99, 0x0c, 0x1d, 0xdb,
- 0x00, 0x99, 0x10, 0x1f, 0x22, 0x00, 0x99, 0x13,
- 0x35, 0x68, 0x00, 0x99, 0x21, 0x4f, 0x18, 0x00,
- 0x99, 0x28, 0x21, 0xfe, 0x00, 0x99, 0x45, 0x37,
- 0xb7, 0x00, 0x99, 0x4b, 0x37, 0xb9, 0x00, 0x99,
- 0x57, 0x1f, 0x20, 0x00, 0x99, 0xc1, 0x4f, 0x40,
- 0x00, 0x99, 0xd0, 0x36, 0x67, 0x00, 0x9a, 0x19,
- 0x1f, 0x43, 0x00, 0x9a, 0x30, 0x36, 0x89, 0x00,
- 0x9a, 0x45, 0x35, 0x3c, 0x00, 0x9a, 0x4a, 0x59,
- 0x88, 0x00, 0x9a, 0x5f, 0x37, 0xbb, 0x00, 0x9a,
- 0x65, 0x37, 0xbc, 0x00, 0x9a, 0xef, 0x37, 0xbd,
- 0x00, 0x9b, 0x18, 0x37, 0xbe, 0x00, 0x9b, 0x2d,
- 0x34, 0x3c, 0x00, 0x9b, 0x2e, 0x1e, 0xca, 0x00,
- 0x9b, 0x35, 0x59, 0xa4, 0x00, 0x9b, 0x4d, 0x35,
- 0x3d, 0x00, 0x9b, 0x54, 0x36, 0xdb, 0x00, 0x9b,
- 0x58, 0x35, 0x3e, 0x00, 0x9b, 0x97, 0x1e, 0xcb,
- 0x00, 0x9b, 0xa8, 0x4f, 0x1a, 0x00, 0x9b, 0xab,
- 0x4f, 0x38, 0x00, 0x9b, 0xae, 0x4f, 0x1b, 0x00,
- 0x9b, 0xb9, 0x4f, 0x1c, 0x00, 0x9b, 0xc6, 0x35,
- 0x3f, 0x00, 0x9b, 0xd6, 0x1e, 0x09, 0x00, 0x9b,
- 0xdb, 0x36, 0x54, 0x00, 0x9b, 0xe1, 0x35, 0x40,
- 0x00, 0x9b, 0xf1, 0x35, 0x41, 0x00, 0x9b, 0xf2,
- 0x1e, 0xcc, 0x00, 0x9c, 0x08, 0x4f, 0x1d, 0x00,
- 0x9c, 0x24, 0x4f, 0x1e, 0x00, 0x9c, 0x2f, 0x1d,
- 0xd4, 0x00, 0x9c, 0x3b, 0x4f, 0x1f, 0x00, 0x9c,
- 0x48, 0x1e, 0x39, 0x00, 0x9c, 0x52, 0x1e, 0x74,
- 0x00, 0x9c, 0x57, 0x37, 0x0c, 0x00, 0x9c, 0xe6,
- 0x4f, 0x21, 0x00, 0x9d, 0x07, 0x1e, 0x4f, 0x00,
- 0x9d, 0x08, 0x37, 0xc1, 0x00, 0x9d, 0x09, 0x37,
- 0xc0, 0x00, 0x9d, 0x48, 0x35, 0x42, 0x00, 0x9d,
- 0x60, 0x1e, 0x03, 0x00, 0x9d, 0x6c, 0x36, 0xce,
- 0x00, 0x9d, 0xb4, 0x0b, 0xfd, 0x00, 0x9d, 0xbf,
- 0x59, 0xde, 0x00, 0x9d, 0xc0, 0x4f, 0x22, 0x00,
- 0x9d, 0xc2, 0x4f, 0x23, 0x00, 0x9d, 0xcf, 0x35,
- 0x43, 0x00, 0x9e, 0x97, 0x34, 0xcc, 0x00, 0x9e,
- 0x9f, 0x34, 0xcb, 0x00, 0x9e, 0xa5, 0x37, 0xc2,
- 0x00, 0x9e, 0xaa, 0x1e, 0xcd, 0x00, 0x9e, 0xad,
- 0x1f, 0x44, 0x00, 0x9e, 0xbb, 0x36, 0xdc, 0x00,
- 0x9e, 0xbf, 0x36, 0xe2, 0x00, 0x9e, 0xcc, 0x37,
- 0xc3, 0x00, 0x9e, 0xdb, 0x1e, 0x31, 0x00, 0x9f,
- 0x08, 0x35, 0x44, 0x00, 0x9f, 0x3b, 0x36, 0xa9,
- 0x00, 0x9f, 0x4a, 0x37, 0xc5, 0x00, 0x9f, 0x4b,
- 0x37, 0x5a, 0x00, 0x9f, 0x4e, 0x35, 0x24, 0x00,
- 0x9f, 0x67, 0x37, 0xc7, 0x00, 0x9f, 0x8d, 0x37,
- 0x06, 0x00, 0x9f, 0x9c, 0x1e, 0xce, 0x00, 0x9f,
- 0x9d, 0x1e, 0xa7, 0x00, 0xfa, 0x11, 0x20, 0xfb,
- 0x00, 0xfa, 0x24, 0x21, 0xb8, 0x02, 0x35, 0xc4,
- 0x3c, 0x44, 0x02, 0x36, 0x3a, 0x35, 0x9b, 0x02,
- 0x38, 0x3d, 0x4f, 0x26, 0x02, 0x42, 0xee, 0x37,
- 0xc9, 0x02, 0x62, 0x70, 0x37, 0x6e, 0x02, 0x9d,
- 0x4b, 0x35, 0x96, 0x02, 0x9e, 0x3d, 0x3c, 0x4d,
- 0x02, 0xa6, 0x1a, 0x37, 0xc8, 0x00, 0x00, 0x00,
- 0x7f, 0x00, 0x34, 0x02, 0x35, 0x83, 0x00, 0x50,
- 0x91, 0x35, 0xaf, 0x00, 0x50, 0xca, 0x37, 0x15,
- 0x00, 0x51, 0x54, 0x37, 0x17, 0x00, 0x51, 0x95,
- 0x37, 0x18, 0x00, 0x51, 0xb4, 0x35, 0xdb, 0x00,
- 0x51, 0xde, 0x38, 0x10, 0x00, 0x52, 0x72, 0x4e,
- 0x76, 0x00, 0x53, 0x7f, 0x1d, 0xed, 0x00, 0x53,
- 0xa9, 0x1f, 0x1c, 0x00, 0x55, 0x33, 0x37, 0x21,
- 0x00, 0x55, 0xa9, 0x34, 0xd6, 0x00, 0x55, 0xab,
- 0x4e, 0x7c, 0x00, 0x55, 0xe4, 0x37, 0x22, 0x00,
- 0x56, 0xae, 0x4e, 0x7e, 0x00, 0x57, 0xf4, 0x36,
- 0x13, 0x00, 0x58, 0x5a, 0x20, 0xe6, 0x00, 0x59,
- 0x51, 0x4e, 0x88, 0x00, 0x59, 0xff, 0x35, 0xe1,
- 0x00, 0x5a, 0xbe, 0x34, 0xdc, 0x00, 0x5b, 0xb3,
- 0x35, 0x6b, 0x00, 0x5c, 0x0a, 0x36, 0x4e, 0x00,
- 0x5c, 0x0f, 0x36, 0x0a, 0x00, 0x5e, 0xca, 0x34,
- 0x59, 0x00, 0x5e, 0xe3, 0x4e, 0x93, 0x00, 0x5e,
- 0xf6, 0x35, 0x56, 0x00, 0x60, 0x62, 0x4f, 0x2d,
- 0x00, 0x60, 0x97, 0x37, 0x30, 0x00, 0x61, 0x67,
- 0x35, 0xad, 0x00, 0x61, 0x68, 0x34, 0x6e, 0x00,
- 0x61, 0xb2, 0x4e, 0x98, 0x00, 0x61, 0xf2, 0x36,
- 0x6a, 0x00, 0x62, 0x49, 0x34, 0xb4, 0x00, 0x66,
- 0x5f, 0x37, 0x38, 0x00, 0x66, 0xc1, 0x4e, 0xac,
- 0x00, 0x67, 0x15, 0x36, 0x70, 0x00, 0x67, 0x17,
- 0x21, 0x29, 0x00, 0x67, 0x1b, 0x36, 0xd5, 0x00,
- 0x68, 0x5d, 0x36, 0xde, 0x00, 0x68, 0x7a, 0x36,
- 0xf1, 0x00, 0x69, 0x0d, 0x36, 0x15, 0x00, 0x69,
- 0x82, 0x34, 0x6f, 0x00, 0x6a, 0xdb, 0x35, 0xa9,
- 0x00, 0x6b, 0x21, 0x35, 0xe8, 0x00, 0x6c, 0x08,
- 0x34, 0xf4, 0x00, 0x6c, 0xaa, 0x4e, 0xbb, 0x00,
- 0x6c, 0xbf, 0x34, 0x68, 0x00, 0x6c, 0xe8, 0x32,
- 0x45, 0x00, 0x6d, 0x3e, 0x36, 0x96, 0x00, 0x6e,
- 0x23, 0x34, 0xf6, 0x00, 0x6e, 0xa2, 0x52, 0x4f,
- 0x00, 0x6e, 0xcb, 0x4e, 0xc1, 0x00, 0x6f, 0x11,
- 0x37, 0x45, 0x00, 0x6f, 0x5b, 0x4e, 0xc5, 0x00,
- 0x71, 0x7d, 0x1f, 0x24, 0x00, 0x72, 0x35, 0x35,
- 0xf0, 0x00, 0x73, 0x36, 0x36, 0xf9, 0x00, 0x73,
- 0x37, 0x36, 0xfa, 0x00, 0x73, 0xca, 0x4e, 0xcc,
- 0x00, 0x75, 0x11, 0x35, 0xd2, 0x00, 0x75, 0x15,
- 0x4f, 0x2b, 0x00, 0x79, 0x53, 0x37, 0x59, 0x00,
- 0x7a, 0x74, 0x35, 0xb1, 0x00, 0x7b, 0x08, 0x4f,
- 0x27, 0x00, 0x7b, 0xc0, 0x36, 0x37, 0x00, 0x7c,
- 0x3e, 0x4f, 0x29, 0x00, 0x7c, 0x50, 0x4e, 0xdb,
- 0x00, 0x7c, 0x7e, 0x4f, 0x45, 0x00, 0x7d, 0xb2,
- 0x4e, 0xde, 0x00, 0x7e, 0x22, 0x37, 0x66, 0x00,
- 0x7e, 0x35, 0x37, 0x68, 0x00, 0x7f, 0xc1, 0x35,
- 0x5e, 0x00, 0x7f, 0xe1, 0x4e, 0xe0, 0x00, 0x7f,
- 0xe9, 0x37, 0x71, 0x00, 0x7f, 0xfc, 0x37, 0x02,
- 0x00, 0x81, 0x08, 0x36, 0xe3, 0x00, 0x82, 0x39,
- 0x36, 0x3e, 0x00, 0x82, 0x79, 0x37, 0x76, 0x00,
- 0x82, 0xbd, 0x34, 0x6b, 0x00, 0x83, 0xdf, 0x1f,
- 0x28, 0x00, 0x85, 0x3d, 0x34, 0xc1, 0x00, 0x86,
- 0x12, 0x52, 0x51, 0x00, 0x87, 0xd2, 0x1f, 0x42,
- 0x00, 0x88, 0x05, 0x4f, 0x47, 0x00, 0x88, 0x36,
- 0x37, 0x87, 0x00, 0x8a, 0x0a, 0x36, 0x25, 0x00,
- 0x8a, 0x1d, 0x4f, 0x2c, 0x00, 0x8a, 0x95, 0x36,
- 0x5d, 0x00, 0x8a, 0xee, 0x35, 0xe4, 0x00, 0x8b,
- 0x56, 0x4e, 0xf9, 0x00, 0x8c, 0xa0, 0x36, 0xb6,
- 0x00, 0x8c, 0xc7, 0x35, 0xe6, 0x00, 0x8c, 0xca,
- 0x4e, 0xff, 0x00, 0x8c, 0xfc, 0x35, 0xce, 0x00,
- 0x8f, 0x44, 0x4f, 0x03, 0x00, 0x8f, 0xc5, 0x4f,
- 0x04, 0x00, 0x8f, 0xd4, 0x4f, 0x05, 0x00, 0x90,
- 0x03, 0x36, 0x87, 0x00, 0x90, 0x22, 0x34, 0x60,
- 0x00, 0x90, 0x38, 0x21, 0xb9, 0x00, 0x90, 0x41,
- 0x4f, 0x3f, 0x00, 0x90, 0x42, 0x36, 0x28, 0x00,
- 0x90, 0x55, 0x35, 0x49, 0x00, 0x90, 0x75, 0x36,
- 0x01, 0x00, 0x90, 0x77, 0x4f, 0x07, 0x00, 0x90,
- 0x89, 0x37, 0xa1, 0x00, 0x90, 0x8a, 0x37, 0x9c,
- 0x00, 0x90, 0xa6, 0x36, 0xcc, 0x00, 0x90, 0xaa,
- 0x35, 0xee, 0x00, 0x92, 0x5b, 0x35, 0x5b, 0x00,
- 0x96, 0x86, 0x21, 0xee, 0x00, 0x96, 0x98, 0x4f,
- 0x13, 0x00, 0x96, 0xa3, 0x37, 0x0b, 0x00, 0x96,
- 0xc5, 0x35, 0x67, 0x00, 0x97, 0x5c, 0x36, 0x32,
- 0x00, 0x97, 0x60, 0x35, 0x37, 0x00, 0x97, 0x6d,
- 0x1f, 0x23, 0x00, 0x97, 0x71, 0x35, 0x38, 0x00,
- 0x97, 0xff, 0x35, 0x9e, 0x00, 0x98, 0xef, 0x4f,
- 0x25, 0x00, 0x99, 0x0c, 0x34, 0x65, 0x00, 0x99,
- 0x45, 0x37, 0xb8, 0x00, 0x99, 0x57, 0x35, 0x9f,
- 0x00, 0x9e, 0x9f, 0x37, 0x0d, 0x00, 0x9f, 0x08,
- 0x37, 0xc4, 0x00, 0x9f, 0x8d, 0x37, 0x07, 0x02,
- 0x36, 0x3a, 0x35, 0x9c, 0x00, 0x00, 0x00, 0x11,
- 0x00, 0x51, 0xde, 0x4e, 0x71, 0x00, 0x53, 0xa9,
- 0x34, 0x64, 0x00, 0x56, 0xae, 0x4e, 0x7f, 0x00,
- 0x5b, 0xb3, 0x4e, 0x8f, 0x00, 0x61, 0x68, 0x35,
- 0x6c, 0x00, 0x61, 0xf2, 0x52, 0x50, 0x00, 0x66,
- 0x5f, 0x37, 0x39, 0x00, 0x67, 0x17, 0x37, 0x12,
- 0x00, 0x69, 0x82, 0x35, 0x70, 0x00, 0x75, 0x11,
- 0x4f, 0x3c, 0x00, 0x83, 0xdf, 0x4e, 0xe9, 0x00,
- 0x90, 0x77, 0x4f, 0x08, 0x00, 0x90, 0x89, 0x37,
- 0xa2, 0x00, 0x90, 0x8a, 0x37, 0x9d, 0x00, 0x97,
- 0xff, 0x4f, 0x15, 0x00, 0x99, 0x0c, 0x35, 0x52,
- 0x00, 0x99, 0x57, 0x4f, 0x19, 0x00, 0x00, 0x00,
- 0x06, 0x00, 0x51, 0xde, 0x21, 0x5e, 0x00, 0x53,
- 0xa9, 0x35, 0x4f, 0x00, 0x61, 0x68, 0x35, 0x6d,
- 0x00, 0x90, 0x89, 0x37, 0xa3, 0x00, 0x90, 0x8a,
- 0x37, 0x9e, 0x00, 0x97, 0xff, 0x4f, 0x16, 0x00,
- 0x00, 0x00, 0x04, 0x00, 0x53, 0xa9, 0x4f, 0x2f,
- 0x00, 0x61, 0x68, 0x35, 0x6e, 0x00, 0x90, 0x89,
- 0x37, 0xa4, 0x00, 0x90, 0x8a, 0x37, 0x9f, 0x00,
- 0x00, 0x00, 0x02, 0x00, 0x90, 0x89, 0x37, 0xa5,
- 0x00, 0x90, 0x8a, 0x37, 0xa0, 0x00, 0x00, 0x00,
- 0x02, 0x00, 0x90, 0x89, 0x37, 0xa6, 0x00, 0x90,
- 0x8a, 0x4f, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00,
- 0x90, 0x89, 0x37, 0xa7, 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x90, 0x89, 0x37, 0xa8, 0x00, 0x00, 0x00,
- 0x01, 0x00, 0x90, 0x89, 0x37, 0xa9, 0x00, 0x00,
- 0x00, 0x01, 0x00, 0x90, 0x89, 0x37, 0xaa, 0x00,
- 0x00, 0x00, 0x01, 0x00, 0x90, 0x89, 0x37, 0xab,
+ 0x27, 0x02, 0xe6, 0xea, 0x37, 0x92, 0x03, 0x13,
+ 0x50, 0x4a, 0xba, 0x00, 0x00, 0x04, 0xb7, 0x00,
+ 0x34, 0x02, 0x35, 0x81, 0x00, 0x4e, 0x08, 0x34,
+ 0x97, 0x00, 0x4e, 0x0e, 0x4e, 0x69, 0x00, 0x4e,
+ 0x19, 0x36, 0xb9, 0x00, 0x4e, 0x26, 0x4e, 0x6a,
+ 0x00, 0x4e, 0x30, 0x3c, 0x1a, 0x00, 0x4e, 0x39,
+ 0x36, 0x5a, 0x00, 0x4e, 0x3b, 0x35, 0xf4, 0x00,
+ 0x4e, 0x73, 0x36, 0x90, 0x00, 0x4e, 0xa1, 0x36,
+ 0xcf, 0x00, 0x4e, 0xa4, 0x34, 0x7f, 0x00, 0x4e,
+ 0xca, 0x35, 0xd4, 0x00, 0x4f, 0x34, 0x36, 0xa0,
+ 0x00, 0x4f, 0x4f, 0x35, 0xfc, 0x00, 0x4f, 0x60,
+ 0x3c, 0x1c, 0x00, 0x4f, 0x73, 0x4e, 0x6c, 0x00,
+ 0x4f, 0x75, 0x34, 0x47, 0x00, 0x4f, 0x7f, 0x34,
+ 0x8a, 0x00, 0x4f, 0xae, 0x34, 0x46, 0x00, 0x4f,
+ 0xb5, 0x36, 0x1b, 0x00, 0x4f, 0xbf, 0x34, 0xc2,
+ 0x00, 0x50, 0x24, 0x36, 0x5f, 0x00, 0x50, 0x26,
+ 0x1d, 0xfa, 0x00, 0x50, 0x49, 0x34, 0x61, 0x00,
+ 0x50, 0x4f, 0x36, 0xbe, 0x00, 0x50, 0x56, 0x4e,
+ 0x6d, 0x00, 0x50, 0x65, 0x34, 0x7b, 0x00, 0x50,
+ 0x85, 0x34, 0xd0, 0x00, 0x50, 0x91, 0x34, 0x79,
+ 0x00, 0x50, 0xc5, 0x1d, 0xee, 0x00, 0x50, 0xca,
+ 0x1f, 0x2e, 0x00, 0x50, 0xcf, 0x34, 0xa2, 0x00,
+ 0x50, 0xe7, 0x34, 0x30, 0x00, 0x50, 0xed, 0x4e,
+ 0x6e, 0x00, 0x50, 0xf2, 0x52, 0xac, 0x00, 0x51,
+ 0x1a, 0x37, 0x16, 0x00, 0x51, 0x32, 0x1e, 0x76,
+ 0x00, 0x51, 0x46, 0x34, 0xa5, 0x00, 0x51, 0x4d,
+ 0x34, 0x4d, 0x00, 0x51, 0x4e, 0x36, 0x7d, 0x00,
+ 0x51, 0x54, 0x10, 0x74, 0x00, 0x51, 0x68, 0x36,
+ 0x42, 0x00, 0x51, 0x6b, 0x4e, 0x6f, 0x00, 0x51,
+ 0x6c, 0x34, 0x80, 0x00, 0x51, 0x77, 0x35, 0xa5,
+ 0x00, 0x51, 0x7c, 0x35, 0xb4, 0x00, 0x51, 0x89,
+ 0x1e, 0x87, 0x00, 0x51, 0x8d, 0x08, 0x36, 0x00,
+ 0x51, 0x92, 0x36, 0xd6, 0x00, 0x51, 0x93, 0x34,
+ 0xd1, 0x00, 0x51, 0x95, 0x10, 0x82, 0x00, 0x51,
+ 0xa4, 0x1e, 0x89, 0x00, 0x51, 0xac, 0x0c, 0x59,
+ 0x00, 0x51, 0xb4, 0x34, 0x5c, 0x00, 0x51, 0xcb,
+ 0x1e, 0x3e, 0x00, 0x51, 0xdb, 0x34, 0xd2, 0x00,
+ 0x51, 0xde, 0x4f, 0x53, 0x00, 0x51, 0xe1, 0x36,
+ 0xd9, 0x00, 0x51, 0xfd, 0x4e, 0x72, 0x00, 0x52,
+ 0x03, 0x36, 0x22, 0x00, 0x52, 0x06, 0x34, 0xbb,
+ 0x00, 0x52, 0x24, 0x36, 0xa1, 0x00, 0x52, 0x38,
+ 0x35, 0xb5, 0x00, 0x52, 0x4a, 0x35, 0xdd, 0x00,
+ 0x52, 0x4d, 0x36, 0x41, 0x00, 0x52, 0x64, 0x4e,
+ 0x74, 0x00, 0x52, 0x71, 0x4e, 0x75, 0x00, 0x52,
+ 0x72, 0x05, 0xc2, 0x00, 0x52, 0x75, 0x1e, 0x2b,
+ 0x00, 0x52, 0x8d, 0x37, 0x1a, 0x00, 0x52, 0xc7,
+ 0x36, 0xf6, 0x00, 0x52, 0xc9, 0x0e, 0x29, 0x00,
+ 0x52, 0xd7, 0x37, 0x1b, 0x00, 0x52, 0xdd, 0x36,
+ 0x05, 0x00, 0x52, 0xe2, 0x36, 0x2a, 0x00, 0x52,
+ 0xe4, 0x34, 0x1a, 0x00, 0x52, 0xfa, 0x09, 0x07,
+ 0x00, 0x53, 0x00, 0x37, 0xcf, 0x00, 0x53, 0x05,
+ 0x36, 0xc3, 0x00, 0x53, 0x07, 0x20, 0xd4, 0x00,
+ 0x53, 0x15, 0x1f, 0x2f, 0x00, 0x53, 0x16, 0x35,
+ 0x61, 0x00, 0x53, 0x39, 0x36, 0xaa, 0x00, 0x53,
+ 0x3f, 0x4e, 0x77, 0x00, 0x53, 0x40, 0x34, 0xd4,
+ 0x00, 0x53, 0x4a, 0x36, 0xa2, 0x00, 0x53, 0x51,
+ 0x0d, 0x70, 0x00, 0x53, 0x5a, 0x36, 0x98, 0x00,
+ 0x53, 0x65, 0x52, 0xf3, 0x00, 0x53, 0x71, 0x35,
+ 0x80, 0x00, 0x53, 0x78, 0x35, 0x5f, 0x00, 0x53,
+ 0x7f, 0x06, 0xa2, 0x00, 0x53, 0xa9, 0x1d, 0xd8,
+ 0x00, 0x53, 0xc9, 0x4f, 0x39, 0x00, 0x53, 0xca,
+ 0x35, 0x8e, 0x00, 0x53, 0xce, 0x34, 0x8f, 0x00,
+ 0x53, 0xd7, 0x35, 0xf5, 0x00, 0x53, 0xdb, 0x1f,
+ 0x2a, 0x00, 0x53, 0xdf, 0x37, 0x1f, 0x00, 0x53,
+ 0xe0, 0x53, 0x00, 0x00, 0x53, 0xf1, 0x1e, 0x0c,
+ 0x00, 0x53, 0xf2, 0x34, 0x8b, 0x00, 0x54, 0x0f,
+ 0x34, 0xc9, 0x00, 0x54, 0x38, 0x35, 0x8f, 0x00,
+ 0x54, 0x40, 0x4e, 0x79, 0x00, 0x54, 0x48, 0x36,
+ 0x76, 0x00, 0x54, 0x68, 0x09, 0x2a, 0x00, 0x54,
+ 0xac, 0x4f, 0x35, 0x00, 0x54, 0xb2, 0x35, 0xdc,
+ 0x00, 0x54, 0xe8, 0x1e, 0x17, 0x00, 0x55, 0x10,
+ 0x36, 0x83, 0x00, 0x55, 0x33, 0x1e, 0x8b, 0x00,
+ 0x55, 0x39, 0x1e, 0x8a, 0x00, 0x55, 0x44, 0x1e,
+ 0x32, 0x00, 0x55, 0x46, 0x36, 0x06, 0x00, 0x55,
+ 0x53, 0x35, 0xaa, 0x00, 0x55, 0x61, 0x38, 0x39,
+ 0x00, 0x55, 0x84, 0x4e, 0x5e, 0x00, 0x55, 0x9c,
+ 0x4e, 0x7b, 0x00, 0x55, 0x9d, 0x1d, 0xe3, 0x00,
+ 0x55, 0xa9, 0x1f, 0x30, 0x00, 0x55, 0xab, 0x35,
+ 0x8b, 0x00, 0x55, 0xb0, 0x1d, 0xf0, 0x00, 0x55,
+ 0xe4, 0x1e, 0x8c, 0x00, 0x56, 0x05, 0x53, 0x2d,
+ 0x00, 0x56, 0x06, 0x0b, 0x70, 0x00, 0x56, 0x09,
+ 0x4e, 0x7d, 0x00, 0x56, 0x32, 0x1e, 0x8d, 0x00,
+ 0x56, 0x42, 0x1d, 0xda, 0x00, 0x56, 0x4c, 0x1e,
+ 0x29, 0x00, 0x56, 0x68, 0x34, 0x15, 0x00, 0x56,
+ 0x74, 0x34, 0xbc, 0x00, 0x56, 0x78, 0x1e, 0x52,
+ 0x00, 0x56, 0xa5, 0x1e, 0x8e, 0x00, 0x56, 0xae,
+ 0x1f, 0x31, 0x00, 0x56, 0xc0, 0x37, 0x24, 0x00,
+ 0x56, 0xc1, 0x34, 0xd7, 0x00, 0x56, 0xce, 0x4e,
+ 0x82, 0x00, 0x56, 0xee, 0x4e, 0x83, 0x00, 0x57,
+ 0x0d, 0x34, 0xd8, 0x00, 0x57, 0x47, 0x34, 0x78,
+ 0x00, 0x57, 0x6a, 0x36, 0x74, 0x00, 0x57, 0xce,
+ 0x09, 0xd3, 0x00, 0x57, 0xd6, 0x4e, 0x84, 0x00,
+ 0x57, 0xf4, 0x34, 0x98, 0x00, 0x58, 0x0b, 0x1e,
+ 0x8f, 0x00, 0x58, 0x19, 0x1f, 0x32, 0x00, 0x58,
+ 0x35, 0x1e, 0x49, 0x00, 0x58, 0x3d, 0x4e, 0x85,
+ 0x00, 0x58, 0x40, 0x34, 0x48, 0x00, 0x58, 0x58,
+ 0x1e, 0x4d, 0x00, 0x58, 0x59, 0x4e, 0x86, 0x00,
+ 0x58, 0x5a, 0x1e, 0x42, 0x00, 0x58, 0x9c, 0x36,
+ 0x71, 0x00, 0x58, 0xa8, 0x0e, 0x7d, 0x00, 0x58,
+ 0xab, 0x34, 0xd9, 0x00, 0x59, 0x06, 0x53, 0x7b,
+ 0x00, 0x59, 0x1b, 0x1f, 0x33, 0x00, 0x59, 0x27,
+ 0x36, 0x55, 0x00, 0x59, 0x4f, 0x4e, 0x87, 0x00,
+ 0x59, 0x51, 0x35, 0xab, 0x00, 0x59, 0x53, 0x37,
+ 0xd1, 0x00, 0x59, 0x60, 0x4e, 0x89, 0x00, 0x59,
+ 0x62, 0x4e, 0x8a, 0x00, 0x59, 0x73, 0x36, 0x04,
+ 0x00, 0x59, 0x84, 0x36, 0xe7, 0x00, 0x59, 0xa5,
+ 0x36, 0x4f, 0x00, 0x59, 0xc9, 0x34, 0x8c, 0x00,
+ 0x59, 0xda, 0x34, 0xda, 0x00, 0x59, 0xec, 0x36,
+ 0xae, 0x00, 0x59, 0xff, 0x35, 0xe0, 0x00, 0x5a,
+ 0x1c, 0x37, 0x26, 0x00, 0x5a, 0x29, 0x1e, 0x6f,
+ 0x00, 0x5a, 0x36, 0x34, 0xdb, 0x00, 0x5a, 0x66,
+ 0x36, 0xb2, 0x00, 0x5a, 0x9b, 0x1e, 0x68, 0x00,
+ 0x5a, 0xbe, 0x1e, 0x90, 0x00, 0x5a, 0xc2, 0x37,
+ 0x27, 0x00, 0x5a, 0xcc, 0x1d, 0xfb, 0x00, 0x5a,
+ 0xda, 0x4e, 0x8b, 0x00, 0x5b, 0x5a, 0x4e, 0x8c,
+ 0x00, 0x5b, 0x73, 0x4e, 0x8d, 0x00, 0x5b, 0x7c,
+ 0x4e, 0x8e, 0x00, 0x5b, 0xb3, 0x34, 0x6d, 0x00,
+ 0x5b, 0xb5, 0x36, 0x07, 0x00, 0x5b, 0xc3, 0x37,
+ 0x29, 0x00, 0x5b, 0xd2, 0x35, 0x78, 0x00, 0x5b,
+ 0xdb, 0x20, 0xf4, 0x00, 0x5b, 0xe7, 0x0c, 0xe1,
+ 0x00, 0x5b, 0xe8, 0x37, 0x42, 0x00, 0x5c, 0x06,
+ 0x09, 0x95, 0x00, 0x5c, 0x0a, 0x36, 0x4d, 0x00,
+ 0x5c, 0x0b, 0x36, 0x23, 0x00, 0x5c, 0x0e, 0x36,
+ 0x8a, 0x00, 0x5c, 0x0f, 0x36, 0x09, 0x00, 0x5c,
+ 0x28, 0x1f, 0x34, 0x00, 0x5c, 0x51, 0x1d, 0xf2,
+ 0x00, 0x5c, 0x60, 0x1e, 0x4a, 0x00, 0x5c, 0x64,
+ 0x34, 0x31, 0x00, 0x5c, 0x6e, 0x12, 0x32, 0x00,
+ 0x5d, 0x29, 0x36, 0xc4, 0x00, 0x5d, 0x4e, 0x34,
+ 0xdd, 0x00, 0x5d, 0x87, 0x34, 0xde, 0x00, 0x5d,
+ 0xb2, 0x3c, 0x2d, 0x00, 0x5d, 0xc9, 0x34, 0xdf,
+ 0x00, 0x5d, 0xcc, 0x34, 0x73, 0x00, 0x5d, 0xd3,
+ 0x34, 0xe0, 0x00, 0x5d, 0xe1, 0x35, 0xff, 0x00,
+ 0x5d, 0xe5, 0x35, 0xc3, 0x00, 0x5d, 0xe8, 0x35,
+ 0x92, 0x00, 0x5d, 0xf7, 0x1d, 0xff, 0x00, 0x5d,
+ 0xfd, 0x0b, 0x65, 0x00, 0x5e, 0x06, 0x36, 0xa3,
+ 0x00, 0x5e, 0x1d, 0x36, 0x77, 0x00, 0x5e, 0x30,
+ 0x34, 0x75, 0x00, 0x5e, 0x3d, 0x36, 0xd0, 0x00,
+ 0x5e, 0x43, 0x4e, 0x91, 0x00, 0x5e, 0x54, 0x37,
+ 0x2d, 0x00, 0x5e, 0x63, 0x36, 0xba, 0x00, 0x5e,
+ 0x64, 0x1e, 0x93, 0x00, 0x5e, 0x73, 0x36, 0xbb,
+ 0x00, 0x5e, 0x7e, 0x35, 0x84, 0x00, 0x5e, 0x96,
+ 0x1e, 0x70, 0x00, 0x5e, 0xa7, 0x4e, 0x92, 0x00,
+ 0x5e, 0xad, 0x34, 0xa9, 0x00, 0x5e, 0xc9, 0x0f,
+ 0xbf, 0x00, 0x5e, 0xca, 0x4f, 0x4f, 0x00, 0x5e,
+ 0xcb, 0x38, 0xae, 0x00, 0x5e, 0xcf, 0x1f, 0x36,
+ 0x00, 0x5e, 0xd0, 0x1f, 0x35, 0x00, 0x5e, 0xdf,
+ 0x1e, 0x6a, 0x00, 0x5e, 0xe0, 0x1e, 0x18, 0x00,
+ 0x5e, 0xe3, 0x37, 0x2f, 0x00, 0x5e, 0xf6, 0x34,
+ 0x67, 0x00, 0x5e, 0xf7, 0x34, 0xaa, 0x00, 0x5e,
+ 0xfa, 0x34, 0x7c, 0x00, 0x5e, 0xfb, 0x35, 0x69,
+ 0x00, 0x5f, 0x0a, 0x36, 0xbc, 0x00, 0x5f, 0x2d,
+ 0x34, 0xe1, 0x00, 0x5f, 0x31, 0x35, 0xf3, 0x00,
+ 0x5f, 0x38, 0x4e, 0x94, 0x00, 0x5f, 0x45, 0x37,
+ 0xce, 0x00, 0x5f, 0x50, 0x3c, 0x1f, 0x00, 0x5f,
+ 0x62, 0x4e, 0x5f, 0x00, 0x5f, 0x69, 0x35, 0xd7,
+ 0x00, 0x5f, 0x6b, 0x36, 0x68, 0x00, 0x5f, 0x80,
+ 0x35, 0x5d, 0x00, 0x5f, 0x98, 0x34, 0xe2, 0x00,
+ 0x5f, 0xa1, 0x4e, 0x95, 0x00, 0x5f, 0xae, 0x36,
+ 0xa8, 0x00, 0x5f, 0xb5, 0x36, 0x69, 0x00, 0x5f,
+ 0xbd, 0x1d, 0xea, 0x00, 0x5f, 0xcd, 0x36, 0x91,
+ 0x00, 0x5f, 0xd8, 0x36, 0xd1, 0x00, 0x5f, 0xd9,
+ 0x36, 0xd2, 0x00, 0x5f, 0xdd, 0x4e, 0x96, 0x00,
+ 0x60, 0x25, 0x35, 0x90, 0x00, 0x60, 0x50, 0x35,
+ 0x99, 0x00, 0x60, 0x62, 0x1d, 0xe0, 0x00, 0x60,
+ 0x65, 0x34, 0xa4, 0x00, 0x60, 0x75, 0x35, 0xac,
+ 0x00, 0x60, 0x94, 0x05, 0x79, 0x00, 0x60, 0x97,
+ 0x1e, 0x94, 0x00, 0x60, 0x9e, 0x54, 0x36, 0x00,
+ 0x60, 0xa4, 0x3c, 0x20, 0x00, 0x60, 0xb2, 0x34,
+ 0xb3, 0x00, 0x60, 0xc5, 0x36, 0x12, 0x00, 0x60,
+ 0xd8, 0x34, 0xe3, 0x00, 0x61, 0x08, 0x1e, 0x7a,
+ 0x00, 0x61, 0x09, 0x36, 0xf3, 0x00, 0x61, 0x0f,
+ 0x35, 0x47, 0x00, 0x61, 0x3d, 0x34, 0xe4, 0x00,
+ 0x61, 0x48, 0x4e, 0x60, 0x00, 0x61, 0x4c, 0x35,
+ 0xc4, 0x00, 0x61, 0x4e, 0x34, 0x2c, 0x00, 0x61,
+ 0x62, 0x4e, 0x97, 0x00, 0x61, 0x67, 0x1d, 0xf5,
+ 0x00, 0x61, 0x68, 0x34, 0x10, 0x00, 0x61, 0x8e,
+ 0x0b, 0x00, 0x00, 0x61, 0x90, 0x37, 0x10, 0x00,
+ 0x61, 0xa4, 0x34, 0xbd, 0x00, 0x61, 0xb2, 0x35,
+ 0xb6, 0x00, 0x61, 0xf2, 0x34, 0x39, 0x00, 0x61,
+ 0xf8, 0x4e, 0x99, 0x00, 0x61, 0xfe, 0x34, 0xe5,
+ 0x00, 0x62, 0x10, 0x36, 0x2b, 0x00, 0x62, 0x3b,
+ 0x36, 0xeb, 0x00, 0x62, 0x3f, 0x36, 0xd3, 0x00,
+ 0x62, 0x40, 0x36, 0x02, 0x00, 0x62, 0x41, 0x1f,
+ 0x37, 0x00, 0x62, 0x47, 0x36, 0x3b, 0x00, 0x62,
+ 0x48, 0x1e, 0xc2, 0x00, 0x62, 0x49, 0x1e, 0x63,
+ 0x00, 0x62, 0x68, 0x34, 0xe6, 0x00, 0x62, 0x71,
+ 0x35, 0x45, 0x00, 0x62, 0xb1, 0x36, 0xc5, 0x00,
+ 0x62, 0xcc, 0x37, 0x32, 0x00, 0x62, 0xcf, 0x34,
+ 0xe7, 0x00, 0x62, 0xd0, 0x1d, 0xe1, 0x00, 0x62,
+ 0xd2, 0x35, 0x93, 0x00, 0x62, 0xd4, 0x13, 0x5d,
+ 0x00, 0x62, 0xf3, 0x1f, 0x21, 0x00, 0x62, 0xf7,
+ 0x34, 0x88, 0x00, 0x63, 0x3a, 0x4f, 0x3e, 0x00,
+ 0x63, 0x3d, 0x1e, 0x62, 0x00, 0x63, 0x4c, 0x34,
+ 0x5d, 0x00, 0x63, 0x57, 0x1e, 0x3f, 0x00, 0x63,
+ 0x67, 0x34, 0xc3, 0x00, 0x63, 0x68, 0x35, 0xec,
+ 0x00, 0x63, 0x69, 0x1e, 0x95, 0x00, 0x63, 0x6e,
+ 0x34, 0x9d, 0x00, 0x63, 0x72, 0x1d, 0xfc, 0x00,
+ 0x63, 0x83, 0x36, 0x43, 0x00, 0x63, 0x88, 0x35,
+ 0xf6, 0x00, 0x63, 0x92, 0x34, 0xaf, 0x00, 0x63,
+ 0xa1, 0x35, 0xd8, 0x00, 0x63, 0xa7, 0x35, 0xc6,
+ 0x00, 0x63, 0xc3, 0x1f, 0x27, 0x00, 0x63, 0xc6,
+ 0x37, 0x34, 0x00, 0x63, 0xf4, 0x35, 0x57, 0x00,
+ 0x64, 0x06, 0x1e, 0x96, 0x00, 0x64, 0x0f, 0x34,
+ 0xe9, 0x00, 0x64, 0x1c, 0x37, 0x33, 0x00, 0x64,
+ 0x28, 0x37, 0x35, 0x00, 0x64, 0x42, 0x34, 0x9e,
+ 0x00, 0x64, 0x69, 0x36, 0xd7, 0x00, 0x64, 0x6f,
+ 0x4f, 0x28, 0x00, 0x64, 0x7a, 0x1e, 0x21, 0x00,
+ 0x64, 0xb0, 0x1e, 0x24, 0x00, 0x64, 0xe2, 0x1e,
+ 0x45, 0x00, 0x64, 0xf2, 0x34, 0xea, 0x00, 0x64,
+ 0xf6, 0x4e, 0x9e, 0x00, 0x65, 0x1d, 0x34, 0xe8,
+ 0x00, 0x65, 0x4f, 0x0d, 0xc4, 0x00, 0x65, 0x5d,
+ 0x34, 0xeb, 0x00, 0x65, 0x5e, 0x4e, 0xa1, 0x00,
+ 0x65, 0x62, 0x34, 0x71, 0x00, 0x65, 0x77, 0x36,
+ 0xb3, 0x00, 0x65, 0x83, 0x1e, 0x98, 0x00, 0x65,
+ 0x87, 0x4e, 0xa3, 0x00, 0x65, 0x89, 0x4e, 0xa4,
+ 0x00, 0x65, 0x8e, 0x4e, 0xa6, 0x00, 0x65, 0x90,
+ 0x34, 0xb5, 0x00, 0x65, 0x9c, 0x35, 0xed, 0x00,
+ 0x65, 0xa7, 0x4f, 0x41, 0x00, 0x65, 0xbc, 0x35,
+ 0x5c, 0x00, 0x65, 0xc5, 0x37, 0x08, 0x00, 0x65,
+ 0xdf, 0x54, 0xbe, 0x00, 0x65, 0xe1, 0x4e, 0xa9,
+ 0x00, 0x65, 0xe2, 0x06, 0x37, 0x00, 0x66, 0x0e,
+ 0x36, 0xe4, 0x00, 0x66, 0x1e, 0x21, 0x1c, 0x00,
+ 0x66, 0x5f, 0x34, 0xec, 0x00, 0x66, 0x66, 0x1d,
+ 0xe2, 0x00, 0x66, 0x67, 0x4e, 0xaa, 0x00, 0x66,
+ 0x69, 0x36, 0xa5, 0x00, 0x66, 0x6e, 0x4e, 0xab,
+ 0x00, 0x66, 0x74, 0x0a, 0x56, 0x00, 0x66, 0x77,
+ 0x39, 0x11, 0x00, 0x66, 0x81, 0x35, 0xa0, 0x00,
+ 0x66, 0x91, 0x34, 0x28, 0x00, 0x66, 0x96, 0x36,
+ 0x5e, 0x00, 0x66, 0x97, 0x35, 0x46, 0x00, 0x66,
+ 0xb5, 0x54, 0xda, 0x00, 0x66, 0xc1, 0x1f, 0x38,
+ 0x00, 0x66, 0xd9, 0x1e, 0x13, 0x00, 0x66, 0xdc,
+ 0x36, 0xfd, 0x00, 0x66, 0xf4, 0x34, 0x81, 0x00,
+ 0x66, 0xf5, 0x37, 0x3b, 0x00, 0x66, 0xf8, 0x36,
+ 0x03, 0x00, 0x66, 0xfb, 0x37, 0xcd, 0x00, 0x66,
+ 0xfc, 0x37, 0x20, 0x00, 0x67, 0x00, 0x4e, 0xaf,
+ 0x00, 0x67, 0x08, 0x35, 0xb2, 0x00, 0x67, 0x09,
+ 0x36, 0xf7, 0x00, 0x67, 0x0b, 0x36, 0xc6, 0x00,
+ 0x67, 0x0d, 0x36, 0xb7, 0x00, 0x67, 0x15, 0x36,
+ 0x6f, 0x00, 0x67, 0x17, 0x0f, 0xd5, 0x00, 0x67,
+ 0x1b, 0x36, 0xd4, 0x00, 0x67, 0x1d, 0x36, 0x6b,
+ 0x00, 0x67, 0x1f, 0x35, 0x86, 0x00, 0x67, 0x53,
+ 0x1e, 0x0f, 0x00, 0x67, 0x56, 0x4f, 0x3a, 0x00,
+ 0x67, 0x5e, 0x37, 0x3c, 0x00, 0x67, 0x61, 0x4e,
+ 0xb0, 0x00, 0x67, 0x7e, 0x34, 0x95, 0x00, 0x67,
+ 0xa6, 0x1e, 0x99, 0x00, 0x67, 0xa9, 0x34, 0xed,
+ 0x00, 0x67, 0xc4, 0x4e, 0xb1, 0x00, 0x67, 0xca,
+ 0x1e, 0x65, 0x00, 0x67, 0xd4, 0x34, 0x91, 0x00,
+ 0x67, 0xe7, 0x34, 0xee, 0x00, 0x67, 0xf1, 0x36,
+ 0x65, 0x00, 0x68, 0x01, 0x21, 0x2e, 0x00, 0x68,
+ 0x02, 0x4e, 0xb2, 0x00, 0x68, 0x13, 0x1e, 0x25,
+ 0x00, 0x68, 0x1f, 0x4e, 0x61, 0x00, 0x68, 0x21,
+ 0x34, 0x82, 0x00, 0x68, 0x43, 0x34, 0xac, 0x00,
+ 0x68, 0x52, 0x21, 0x2c, 0x00, 0x68, 0x5d, 0x34,
+ 0xc5, 0x00, 0x68, 0x7a, 0x36, 0xf0, 0x00, 0x68,
+ 0x81, 0x37, 0x09, 0x00, 0x68, 0x85, 0x0d, 0x15,
+ 0x00, 0x68, 0x8d, 0x37, 0x3e, 0x00, 0x68, 0x97,
+ 0x4f, 0x37, 0x00, 0x68, 0x9b, 0x1e, 0x9b, 0x00,
+ 0x68, 0x9d, 0x37, 0x3d, 0x00, 0x68, 0xa2, 0x1e,
+ 0x19, 0x00, 0x68, 0xc8, 0x37, 0xcc, 0x00, 0x68,
+ 0xda, 0x1e, 0x38, 0x00, 0x69, 0x0d, 0x34, 0x99,
+ 0x00, 0x69, 0x30, 0x34, 0xf0, 0x00, 0x69, 0x3d,
+ 0x4e, 0xb3, 0x00, 0x69, 0x5e, 0x4e, 0xb4, 0x00,
+ 0x69, 0x62, 0x1e, 0x58, 0x00, 0x69, 0x6b, 0x34,
+ 0xef, 0x00, 0x69, 0x6f, 0x34, 0x94, 0x00, 0x69,
+ 0x82, 0x34, 0x5b, 0x00, 0x69, 0x8a, 0x1e, 0x06,
+ 0x00, 0x69, 0x94, 0x1e, 0x84, 0x00, 0x69, 0xa7,
+ 0x34, 0xf1, 0x00, 0x69, 0xbb, 0x37, 0x43, 0x00,
+ 0x69, 0xc1, 0x35, 0x9a, 0x00, 0x69, 0xcb, 0x35,
+ 0xc7, 0x00, 0x69, 0xcc, 0x1e, 0x40, 0x00, 0x69,
+ 0xd9, 0x36, 0xdd, 0x00, 0x69, 0xea, 0x35, 0x6f,
+ 0x00, 0x69, 0xfe, 0x55, 0x1f, 0x00, 0x6a, 0x0b,
+ 0x1e, 0x64, 0x00, 0x6a, 0x3d, 0x1e, 0x3a, 0x00,
+ 0x6a, 0x44, 0x34, 0xf2, 0x00, 0x6a, 0x55, 0x55,
+ 0x25, 0x00, 0x6a, 0x5f, 0x35, 0x87, 0x00, 0x6a,
+ 0x73, 0x37, 0xd4, 0x00, 0x6a, 0x8e, 0x34, 0x7e,
+ 0x00, 0x6a, 0x90, 0x34, 0xf3, 0x00, 0x6a, 0x9c,
+ 0x4e, 0xb6, 0x00, 0x6a, 0xdb, 0x06, 0xf3, 0x00,
+ 0x6b, 0x04, 0x0f, 0x5d, 0x00, 0x6b, 0x1d, 0x1d,
+ 0xd7, 0x00, 0x6b, 0x21, 0x35, 0xe7, 0x00, 0x6b,
+ 0x24, 0x3c, 0x22, 0x00, 0x6b, 0x4e, 0x36, 0x5b,
+ 0x00, 0x6b, 0x96, 0x36, 0x16, 0x00, 0x6b, 0xba,
+ 0x08, 0x74, 0x00, 0x6b, 0xbb, 0x34, 0x70, 0x00,
+ 0x6c, 0x08, 0x1f, 0x39, 0x00, 0x6c, 0x13, 0x34,
+ 0xf5, 0x00, 0x6c, 0x38, 0x4e, 0xba, 0x00, 0x6c,
+ 0x3a, 0x39, 0x62, 0x00, 0x6c, 0x72, 0x1f, 0x1e,
+ 0x00, 0x6c, 0xaa, 0x37, 0x48, 0x00, 0x6c, 0xbf,
+ 0x05, 0x0a, 0x00, 0x6c, 0xe1, 0x1e, 0x71, 0x00,
+ 0x6c, 0xe8, 0x36, 0x66, 0x00, 0x6d, 0x3e, 0x34,
+ 0xae, 0x00, 0x6d, 0x69, 0x35, 0xc8, 0x00, 0x6d,
+ 0x6e, 0x36, 0xb4, 0x00, 0x6d, 0x77, 0x05, 0x82,
+ 0x00, 0x6d, 0x78, 0x36, 0x1d, 0x00, 0x6d, 0x88,
+ 0x36, 0x0c, 0x00, 0x6d, 0xe4, 0x4e, 0xbd, 0x00,
+ 0x6d, 0xeb, 0x1d, 0xd5, 0x00, 0x6d, 0xfb, 0x36,
+ 0x7c, 0x00, 0x6e, 0x08, 0x4e, 0xbf, 0x00, 0x6e,
+ 0x1a, 0x09, 0x77, 0x00, 0x6e, 0x23, 0x1f, 0x3a,
+ 0x00, 0x6e, 0x2f, 0x35, 0xc9, 0x00, 0x6e, 0x6e,
+ 0x1e, 0x9d, 0x00, 0x6e, 0x72, 0x4e, 0xc0, 0x00,
+ 0x6e, 0x7e, 0x34, 0xcf, 0x00, 0x6e, 0x9d, 0x1e,
+ 0x01, 0x00, 0x6e, 0xa2, 0x1d, 0xd3, 0x00, 0x6e,
+ 0xba, 0x1e, 0x46, 0x00, 0x6e, 0xcb, 0x35, 0xe9,
+ 0x00, 0x6e, 0xd5, 0x4e, 0xc2, 0x00, 0x6e, 0xdb,
+ 0x4e, 0xc3, 0x00, 0x6e, 0xec, 0x1f, 0x3b, 0x00,
+ 0x6e, 0xfe, 0x34, 0xf8, 0x00, 0x6f, 0x11, 0x34,
+ 0xf7, 0x00, 0x6f, 0x22, 0x34, 0x14, 0x00, 0x6f,
+ 0x23, 0x0f, 0xc2, 0x00, 0x6f, 0x3e, 0x34, 0xf9,
+ 0x00, 0x6f, 0x51, 0x36, 0x9e, 0x00, 0x6f, 0x54,
+ 0x35, 0xb0, 0x00, 0x6f, 0x5b, 0x4e, 0xc4, 0x00,
+ 0x6f, 0x64, 0x4e, 0xc6, 0x00, 0x6f, 0x6e, 0x0b,
+ 0xc8, 0x00, 0x6f, 0x74, 0x4e, 0xc7, 0x00, 0x6f,
+ 0x98, 0x37, 0x47, 0x00, 0x6f, 0xef, 0x1e, 0x33,
+ 0x00, 0x6f, 0xf9, 0x39, 0x95, 0x00, 0x70, 0x15,
+ 0x1e, 0x6b, 0x00, 0x70, 0x1b, 0x37, 0x4a, 0x00,
+ 0x70, 0x1e, 0x1e, 0x51, 0x00, 0x70, 0x26, 0x1e,
+ 0x3d, 0x00, 0x70, 0x27, 0x36, 0x57, 0x00, 0x70,
+ 0x4a, 0x39, 0x98, 0x00, 0x70, 0x58, 0x1e, 0x57,
+ 0x00, 0x70, 0x70, 0x35, 0x6a, 0x00, 0x70, 0x78,
+ 0x4f, 0x2e, 0x00, 0x70, 0x7c, 0x1e, 0x10, 0x00,
+ 0x70, 0xad, 0x36, 0x5c, 0x00, 0x71, 0x49, 0x0f,
+ 0xc3, 0x00, 0x71, 0x4e, 0x1e, 0x26, 0x00, 0x71,
+ 0x52, 0x55, 0xad, 0x00, 0x71, 0x59, 0x35, 0x59,
+ 0x00, 0x71, 0x62, 0x37, 0x4b, 0x00, 0x71, 0x6e,
+ 0x08, 0xfd, 0x00, 0x71, 0x7d, 0x1e, 0x27, 0x00,
+ 0x71, 0x94, 0x1e, 0x7d, 0x00, 0x71, 0xb3, 0x39,
+ 0xae, 0x00, 0x71, 0xd0, 0x37, 0x0a, 0x00, 0x71,
+ 0xff, 0x34, 0xfa, 0x00, 0x72, 0x28, 0x15, 0xdf,
+ 0x00, 0x72, 0x2b, 0x3c, 0x26, 0x00, 0x72, 0x35,
+ 0x09, 0x0b, 0x00, 0x72, 0x36, 0x34, 0xb9, 0x00,
+ 0x72, 0x3a, 0x4f, 0x46, 0x00, 0x72, 0x3b, 0x37,
+ 0x4c, 0x00, 0x72, 0x3e, 0x4e, 0xc9, 0x00, 0x72,
+ 0x4c, 0x1e, 0x5b, 0x00, 0x72, 0x59, 0x1f, 0x1d,
+ 0x00, 0x72, 0xe1, 0x4f, 0x36, 0x00, 0x73, 0x1c,
+ 0x37, 0x4e, 0x00, 0x73, 0x2a, 0x0b, 0xb4, 0x00,
+ 0x73, 0x36, 0x36, 0xf8, 0x00, 0x73, 0x37, 0x1e,
+ 0x7c, 0x00, 0x73, 0x87, 0x37, 0x05, 0x00, 0x73,
+ 0x8b, 0x35, 0xa1, 0x00, 0x73, 0xca, 0x1e, 0x0b,
+ 0x00, 0x73, 0xce, 0x1e, 0xa0, 0x00, 0x73, 0xe5,
+ 0x34, 0xfb, 0x00, 0x73, 0xed, 0x34, 0xb1, 0x00,
+ 0x74, 0x22, 0x0b, 0x56, 0x00, 0x74, 0x32, 0x34,
+ 0xfc, 0x00, 0x74, 0x5f, 0x34, 0xfd, 0x00, 0x74,
+ 0x62, 0x21, 0x71, 0x00, 0x74, 0xb0, 0x35, 0x79,
+ 0x00, 0x74, 0xbd, 0x4e, 0xcd, 0x00, 0x74, 0xca,
+ 0x37, 0x4f, 0x00, 0x74, 0xd8, 0x55, 0xf6, 0x00,
+ 0x74, 0xdc, 0x35, 0x50, 0x00, 0x74, 0xe0, 0x34,
+ 0xfe, 0x00, 0x74, 0xef, 0x55, 0xfa, 0x00, 0x75,
+ 0x04, 0x1e, 0xa1, 0x00, 0x75, 0x0c, 0x34, 0xff,
+ 0x00, 0x75, 0x0d, 0x1e, 0xa2, 0x00, 0x75, 0x11,
+ 0x1e, 0x04, 0x00, 0x75, 0x15, 0x1e, 0xa3, 0x00,
+ 0x75, 0x26, 0x4f, 0x3b, 0x00, 0x75, 0x54, 0x36,
+ 0xa4, 0x00, 0x75, 0x5d, 0x4e, 0xce, 0x00, 0x75,
+ 0xbc, 0x4e, 0xcf, 0x00, 0x75, 0xc5, 0x36, 0xb1,
+ 0x00, 0x76, 0x08, 0x4e, 0xd1, 0x00, 0x76, 0x26,
+ 0x1e, 0x2d, 0x00, 0x76, 0x52, 0x1e, 0x7b, 0x00,
+ 0x76, 0x64, 0x4e, 0xd2, 0x00, 0x76, 0x69, 0x4e,
+ 0xd3, 0x00, 0x76, 0x72, 0x35, 0x00, 0x00, 0x76,
+ 0x84, 0x36, 0x79, 0x00, 0x76, 0x93, 0x1e, 0xa4,
+ 0x00, 0x76, 0xc6, 0x34, 0xc4, 0x00, 0x76, 0xca,
+ 0x21, 0x7b, 0x00, 0x76, 0xd4, 0x56, 0x1d, 0x00,
+ 0x76, 0xdb, 0x36, 0x2c, 0x00, 0x76, 0xdf, 0x36,
+ 0xe5, 0x00, 0x76, 0xf2, 0x36, 0xe9, 0x00, 0x76,
+ 0xf4, 0x36, 0x6e, 0x00, 0x77, 0x1e, 0x16, 0xb8,
+ 0x00, 0x77, 0x1f, 0x36, 0x1e, 0x00, 0x77, 0x37,
+ 0x4e, 0xd5, 0x00, 0x77, 0x3a, 0x34, 0xa6, 0x00,
+ 0x77, 0x7e, 0x4e, 0xd6, 0x00, 0x77, 0x8d, 0x56,
+ 0x2e, 0x00, 0x77, 0xa2, 0x56, 0x2f, 0x00, 0x77,
+ 0xa5, 0x1e, 0x6e, 0x00, 0x77, 0xac, 0x34, 0x92,
+ 0x00, 0x77, 0xe9, 0x35, 0xa4, 0x00, 0x78, 0x32,
+ 0x36, 0xc7, 0x00, 0x78, 0x3a, 0x36, 0x7f, 0x00,
+ 0x78, 0x5d, 0x36, 0x0d, 0x00, 0x78, 0x6c, 0x34,
+ 0x83, 0x00, 0x78, 0x7c, 0x1e, 0xa5, 0x00, 0x78,
+ 0x91, 0x0d, 0x7e, 0x00, 0x78, 0xd4, 0x35, 0x02,
+ 0x00, 0x78, 0xe8, 0x36, 0xda, 0x00, 0x78, 0xef,
+ 0x35, 0x4b, 0x00, 0x79, 0x2a, 0x35, 0x01, 0x00,
+ 0x79, 0x34, 0x3a, 0x38, 0x00, 0x79, 0x3a, 0x08,
+ 0xd4, 0x00, 0x79, 0x3c, 0x21, 0x83, 0x00, 0x79,
+ 0x3e, 0x34, 0x24, 0x00, 0x79, 0x40, 0x37, 0x57,
+ 0x00, 0x79, 0x41, 0x1d, 0xf4, 0x00, 0x79, 0x47,
+ 0x1d, 0xeb, 0x00, 0x79, 0x48, 0x06, 0x41, 0x00,
+ 0x79, 0x49, 0x34, 0x21, 0x00, 0x79, 0x50, 0x0f,
+ 0x1e, 0x00, 0x79, 0x53, 0x37, 0x58, 0x00, 0x79,
+ 0x56, 0x34, 0x2f, 0x00, 0x79, 0x5d, 0x09, 0x55,
+ 0x00, 0x79, 0x5e, 0x0a, 0x06, 0x00, 0x79, 0x62,
+ 0x1f, 0x29, 0x00, 0x79, 0x65, 0x09, 0xb5, 0x00,
+ 0x79, 0x8d, 0x05, 0x52, 0x00, 0x79, 0x8e, 0x34,
+ 0x3b, 0x00, 0x79, 0x8f, 0x21, 0x87, 0x00, 0x79,
+ 0xa7, 0x4e, 0xd7, 0x00, 0x79, 0xae, 0x37, 0x5b,
+ 0x00, 0x79, 0xb0, 0x1e, 0x59, 0x00, 0x79, 0xb1,
+ 0x4e, 0xd8, 0x00, 0x79, 0xba, 0x35, 0x03, 0x00,
+ 0x79, 0xe4, 0x1e, 0x5d, 0x00, 0x7a, 0x0b, 0x36,
+ 0x78, 0x00, 0x7a, 0x17, 0x1e, 0x66, 0x00, 0x7a,
+ 0x19, 0x35, 0x04, 0x00, 0x7a, 0x31, 0x1e, 0xa6,
+ 0x00, 0x7a, 0x40, 0x08, 0x04, 0x00, 0x7a, 0x60,
+ 0x3a, 0x4e, 0x00, 0x7a, 0x74, 0x34, 0x7a, 0x00,
+ 0x7a, 0x7a, 0x35, 0xa7, 0x00, 0x7a, 0x7f, 0x1f,
+ 0x25, 0x00, 0x7a, 0x81, 0x34, 0x3d, 0x00, 0x7a,
+ 0x95, 0x35, 0x05, 0x00, 0x7a, 0x97, 0x1f, 0x3c,
+ 0x00, 0x7a, 0xae, 0x34, 0x77, 0x00, 0x7a, 0xbe,
+ 0x4e, 0xd9, 0x00, 0x7a, 0xc6, 0x3c, 0x27, 0x00,
+ 0x7a, 0xc8, 0x4f, 0x3d, 0x00, 0x7b, 0x08, 0x1f,
+ 0x1f, 0x00, 0x7b, 0x51, 0x36, 0x63, 0x00, 0x7b,
+ 0x75, 0x4f, 0x2a, 0x00, 0x7b, 0x99, 0x1e, 0xa8,
+ 0x00, 0x7b, 0xad, 0x1f, 0x26, 0x00, 0x7b, 0xb8,
+ 0x1e, 0x5f, 0x00, 0x7b, 0xc0, 0x34, 0x2e, 0x00,
+ 0x7b, 0xc7, 0x1f, 0x2b, 0x00, 0x7b, 0xc9, 0x36,
+ 0x61, 0x00, 0x7b, 0xdd, 0x1f, 0x3d, 0x00, 0x7b,
+ 0xe0, 0x4e, 0xda, 0x00, 0x7c, 0x14, 0x37, 0x5f,
+ 0x00, 0x7c, 0x3e, 0x1f, 0x2d, 0x00, 0x7c, 0x3f,
+ 0x36, 0xc2, 0x00, 0x7c, 0x4d, 0x36, 0x36, 0x00,
+ 0x7c, 0x50, 0x37, 0x61, 0x00, 0x7c, 0x58, 0x37,
+ 0x62, 0x00, 0x7c, 0x69, 0x56, 0xaa, 0x00, 0x7c,
+ 0x7e, 0x1e, 0x78, 0x00, 0x7c, 0x82, 0x4f, 0x30,
+ 0x00, 0x7c, 0x89, 0x34, 0xbe, 0x00, 0x7c, 0x90,
+ 0x1e, 0xa9, 0x00, 0x7c, 0xae, 0x1e, 0xaa, 0x00,
+ 0x7c, 0xbe, 0x0a, 0x5e, 0x00, 0x7c, 0xd6, 0x0c,
+ 0x76, 0x00, 0x7c, 0xf2, 0x35, 0x06, 0x00, 0x7d,
+ 0x04, 0x36, 0xee, 0x00, 0x7d, 0x09, 0x4e, 0xdc,
+ 0x00, 0x7d, 0x0b, 0x36, 0xec, 0x00, 0x7d, 0x0d,
+ 0x36, 0x94, 0x00, 0x7d, 0x1a, 0x35, 0x91, 0x00,
+ 0x7d, 0x1b, 0x34, 0xbf, 0x00, 0x7d, 0x42, 0x35,
+ 0xf8, 0x00, 0x7d, 0x46, 0x37, 0x63, 0x00, 0x7d,
+ 0x5c, 0x21, 0x90, 0x00, 0x7d, 0x5e, 0x34, 0x84,
+ 0x00, 0x7d, 0x63, 0x37, 0x64, 0x00, 0x7d, 0x73,
+ 0x35, 0x07, 0x00, 0x7d, 0x9b, 0x1e, 0xab, 0x00,
+ 0x7d, 0x9f, 0x1e, 0xad, 0x00, 0x7d, 0xae, 0x1e,
+ 0xac, 0x00, 0x7d, 0xb2, 0x4e, 0xdd, 0x00, 0x7d,
+ 0xcb, 0x34, 0xb6, 0x00, 0x7d, 0xcf, 0x34, 0xa0,
+ 0x00, 0x7d, 0xdd, 0x35, 0x08, 0x00, 0x7d, 0xe8,
+ 0x36, 0xbf, 0x00, 0x7d, 0xe9, 0x35, 0x7a, 0x00,
+ 0x7d, 0xef, 0x34, 0x62, 0x00, 0x7d, 0xf4, 0x0f,
+ 0xc5, 0x00, 0x7e, 0x09, 0x47, 0xbe, 0x00, 0x7e,
+ 0x1b, 0x36, 0x9b, 0x00, 0x7e, 0x22, 0x37, 0x65,
+ 0x00, 0x7e, 0x2b, 0x36, 0xc8, 0x00, 0x7e, 0x35,
+ 0x35, 0x09, 0x00, 0x7e, 0x41, 0x34, 0x40, 0x00,
+ 0x7e, 0x43, 0x37, 0x69, 0x00, 0x7e, 0x6d, 0x36,
+ 0xe1, 0x00, 0x7e, 0x8c, 0x37, 0x6a, 0x00, 0x7f,
+ 0x3e, 0x4e, 0xdf, 0x00, 0x7f, 0x50, 0x37, 0x6b,
+ 0x00, 0x7f, 0x61, 0x3c, 0x28, 0x00, 0x7f, 0x6a,
+ 0x34, 0x89, 0x00, 0x7f, 0x6e, 0x36, 0x60, 0x00,
+ 0x7f, 0x72, 0x09, 0x7a, 0x00, 0x7f, 0x80, 0x56,
+ 0xda, 0x00, 0x7f, 0x8a, 0x0f, 0x3d, 0x00, 0x7f,
+ 0xa1, 0x36, 0x3d, 0x00, 0x7f, 0xae, 0x35, 0x0a,
+ 0x00, 0x7f, 0xbd, 0x04, 0xcb, 0x00, 0x7f, 0xc1,
+ 0x34, 0x6a, 0x00, 0x7f, 0xc5, 0x37, 0x6f, 0x00,
+ 0x7f, 0xc6, 0x37, 0x70, 0x00, 0x7f, 0xcc, 0x37,
+ 0x01, 0x00, 0x7f, 0xd2, 0x35, 0xf9, 0x00, 0x7f,
+ 0xd4, 0x1e, 0xae, 0x00, 0x7f, 0xe0, 0x1e, 0x20,
+ 0x00, 0x7f, 0xe1, 0x35, 0x0b, 0x00, 0x7f, 0xe9,
+ 0x1f, 0x3e, 0x00, 0x7f, 0xeb, 0x1d, 0xe9, 0x00,
+ 0x7f, 0xf0, 0x1d, 0xe8, 0x00, 0x7f, 0xfb, 0x36,
+ 0xd8, 0x00, 0x7f, 0xfc, 0x34, 0xc8, 0x00, 0x80,
+ 0x00, 0x1e, 0x7e, 0x00, 0x80, 0x03, 0x34, 0x85,
+ 0x00, 0x80, 0x05, 0x34, 0x25, 0x00, 0x80, 0x12,
+ 0x4e, 0xe1, 0x00, 0x80, 0x15, 0x35, 0xca, 0x00,
+ 0x80, 0x17, 0x36, 0xea, 0x00, 0x80, 0x36, 0x34,
+ 0xc7, 0x00, 0x80, 0x56, 0x36, 0x2d, 0x00, 0x80,
+ 0x5a, 0x35, 0x0c, 0x00, 0x80, 0x5f, 0x35, 0x0d,
+ 0x00, 0x80, 0x61, 0x34, 0xa1, 0x00, 0x80, 0x6f,
+ 0x34, 0xcd, 0x00, 0x80, 0x70, 0x35, 0x0f, 0x00,
+ 0x80, 0x71, 0x3c, 0x29, 0x00, 0x80, 0x73, 0x35,
+ 0x0e, 0x00, 0x80, 0x74, 0x34, 0xa7, 0x00, 0x80,
+ 0x76, 0x35, 0x10, 0x00, 0x80, 0x77, 0x34, 0x9a,
+ 0x00, 0x80, 0x7e, 0x34, 0xce, 0x00, 0x80, 0x87,
+ 0x36, 0x9c, 0x00, 0x80, 0x89, 0x36, 0x8f, 0x00,
+ 0x80, 0x96, 0x36, 0x0e, 0x00, 0x80, 0x9e, 0x3c,
+ 0x2a, 0x00, 0x80, 0xa9, 0x35, 0xb8, 0x00, 0x80,
+ 0xba, 0x36, 0x97, 0x00, 0x80, 0xd6, 0x4e, 0xe3,
+ 0x00, 0x80, 0xde, 0x36, 0xc9, 0x00, 0x81, 0x06,
+ 0x36, 0x34, 0x00, 0x81, 0x08, 0x34, 0xc6, 0x00,
+ 0x81, 0x09, 0x4e, 0xe4, 0x00, 0x81, 0x29, 0x4e,
+ 0xe5, 0x00, 0x81, 0x53, 0x35, 0x11, 0x00, 0x81,
+ 0x54, 0x35, 0xcb, 0x00, 0x81, 0x70, 0x35, 0xd1,
+ 0x00, 0x81, 0x71, 0x4f, 0x33, 0x00, 0x81, 0x7f,
+ 0x1e, 0x30, 0x00, 0x81, 0x8a, 0x35, 0x12, 0x00,
+ 0x81, 0xb5, 0x35, 0x13, 0x00, 0x81, 0xcd, 0x35,
+ 0x14, 0x00, 0x81, 0xed, 0x34, 0x26, 0x00, 0x82,
+ 0x00, 0x57, 0x0f, 0x00, 0x82, 0x0c, 0x4e, 0xe6,
+ 0x00, 0x82, 0x18, 0x35, 0x7f, 0x00, 0x82, 0x1b,
+ 0x4e, 0xe7, 0x00, 0x82, 0x1c, 0x34, 0x93, 0x00,
+ 0x82, 0x1f, 0x35, 0xb3, 0x00, 0x82, 0x2e, 0x1e,
+ 0xaf, 0x00, 0x82, 0x39, 0x34, 0x9f, 0x00, 0x82,
+ 0x40, 0x4e, 0xe8, 0x00, 0x82, 0x47, 0x34, 0xab,
+ 0x00, 0x82, 0x58, 0x37, 0x74, 0x00, 0x82, 0x79,
+ 0x37, 0x77, 0x00, 0x82, 0x8d, 0x1e, 0xb0, 0x00,
+ 0x82, 0x92, 0x4f, 0x44, 0x00, 0x82, 0xa6, 0x1f,
+ 0x19, 0x00, 0x82, 0xb1, 0x35, 0x62, 0x00, 0x82,
+ 0xbd, 0x05, 0x6a, 0x00, 0x82, 0xc5, 0x35, 0x77,
+ 0x00, 0x82, 0xd2, 0x1e, 0xb1, 0x00, 0x82, 0xe3,
+ 0x37, 0x78, 0x00, 0x83, 0x23, 0x1e, 0xb2, 0x00,
+ 0x83, 0x28, 0x1f, 0x1a, 0x00, 0x83, 0x52, 0x35,
+ 0xcc, 0x00, 0x83, 0x75, 0x1e, 0xb3, 0x00, 0x83,
+ 0xbd, 0x37, 0x7c, 0x00, 0x83, 0xd3, 0x35, 0x63,
+ 0x00, 0x83, 0xd4, 0x4e, 0xea, 0x00, 0x83, 0xdc,
+ 0x35, 0xda, 0x00, 0x83, 0xdf, 0x1e, 0x4b, 0x00,
+ 0x83, 0xf2, 0x35, 0x15, 0x00, 0x84, 0x0c, 0x36,
+ 0xca, 0x00, 0x84, 0x0f, 0x4e, 0xeb, 0x00, 0x84,
+ 0x20, 0x37, 0x7b, 0x00, 0x84, 0x22, 0x1f, 0x3f,
+ 0x00, 0x84, 0x57, 0x34, 0x37, 0x00, 0x84, 0x5b,
+ 0x1d, 0xe4, 0x00, 0x84, 0x5c, 0x57, 0x45, 0x00,
+ 0x84, 0x7a, 0x34, 0xba, 0x00, 0x84, 0xea, 0x4e,
+ 0xed, 0x00, 0x84, 0xec, 0x1e, 0x72, 0x00, 0x84,
+ 0xee, 0x0f, 0xc7, 0x00, 0x84, 0xf4, 0x37, 0x7d,
+ 0x00, 0x85, 0x11, 0x36, 0xbd, 0x00, 0x85, 0x17,
+ 0x1e, 0xb4, 0x00, 0x85, 0x3d, 0x1e, 0x6d, 0x00,
+ 0x85, 0x43, 0x36, 0xa6, 0x00, 0x85, 0x51, 0x4e,
+ 0xef, 0x00, 0x85, 0x55, 0x35, 0x16, 0x00, 0x85,
+ 0x5d, 0x57, 0x64, 0x00, 0x85, 0x63, 0x4e, 0xf0,
+ 0x00, 0x85, 0x84, 0x36, 0x99, 0x00, 0x85, 0x87,
+ 0x37, 0x7f, 0x00, 0x85, 0xa9, 0x1e, 0x08, 0x00,
+ 0x85, 0xaf, 0x1e, 0x15, 0x00, 0x85, 0xcf, 0x4e,
+ 0xf1, 0x00, 0x85, 0xd5, 0x35, 0x17, 0x00, 0x85,
+ 0xe4, 0x36, 0x85, 0x00, 0x85, 0xf7, 0x1e, 0x16,
+ 0x00, 0x86, 0x12, 0x21, 0xa4, 0x00, 0x86, 0x2d,
+ 0x37, 0x04, 0x00, 0x86, 0x4e, 0x4e, 0xf2, 0x00,
+ 0x86, 0x50, 0x35, 0x8c, 0x00, 0x86, 0x54, 0x4f,
+ 0x32, 0x00, 0x86, 0x5c, 0x0f, 0x82, 0x00, 0x86,
+ 0x5e, 0x35, 0xa6, 0x00, 0x86, 0x62, 0x4e, 0xf3,
+ 0x00, 0x86, 0x8a, 0x4e, 0xf4, 0x00, 0x86, 0xdb,
+ 0x34, 0x5e, 0x00, 0x86, 0xf8, 0x1e, 0x35, 0x00,
+ 0x87, 0x03, 0x4f, 0x48, 0x00, 0x87, 0x1a, 0x35,
+ 0x18, 0x00, 0x87, 0x37, 0x37, 0x82, 0x00, 0x87,
+ 0x3b, 0x37, 0x83, 0x00, 0x87, 0x55, 0x1e, 0x1d,
+ 0x00, 0x87, 0x59, 0x1f, 0x40, 0x00, 0x87, 0x82,
+ 0x1e, 0xb6, 0x00, 0x87, 0xa3, 0x57, 0xaa, 0x00,
+ 0x87, 0xbd, 0x37, 0x85, 0x00, 0x87, 0xd2, 0x1e,
+ 0xb7, 0x00, 0x88, 0x03, 0x3b, 0x03, 0x00, 0x88,
+ 0x05, 0x37, 0x84, 0x00, 0x88, 0x0e, 0x1f, 0x41,
+ 0x00, 0x88, 0x36, 0x35, 0x19, 0x00, 0x88, 0x42,
+ 0x4e, 0xf5, 0x00, 0x88, 0x46, 0x35, 0xfa, 0x00,
+ 0x88, 0x4b, 0x57, 0xc3, 0x00, 0x88, 0x53, 0x35,
+ 0xfd, 0x00, 0x88, 0x5b, 0x34, 0x66, 0x00, 0x88,
+ 0x5e, 0x35, 0x53, 0x00, 0x88, 0x63, 0x35, 0x48,
+ 0x00, 0x88, 0x70, 0x36, 0x27, 0x00, 0x88, 0x77,
+ 0x4e, 0xf6, 0x00, 0x88, 0x9e, 0x35, 0x1a, 0x00,
+ 0x88, 0xd8, 0x35, 0x1b, 0x00, 0x88, 0xf4, 0x35,
+ 0x1c, 0x00, 0x89, 0x0a, 0x1e, 0xb8, 0x00, 0x89,
+ 0x10, 0x34, 0x13, 0x00, 0x89, 0x1c, 0x37, 0xcb,
+ 0x00, 0x89, 0x2b, 0x35, 0x1d, 0x00, 0x89, 0x3b,
+ 0x35, 0x1e, 0x00, 0x89, 0x41, 0x4e, 0xf7, 0x00,
+ 0x89, 0x56, 0x1d, 0xdd, 0x00, 0x89, 0x6a, 0x35,
+ 0x1f, 0x00, 0x89, 0x6f, 0x35, 0x20, 0x00, 0x89,
+ 0x81, 0x36, 0xff, 0x00, 0x89, 0x86, 0x36, 0xb8,
+ 0x00, 0x89, 0x87, 0x36, 0x95, 0x00, 0x89, 0x96,
+ 0x34, 0x22, 0x00, 0x89, 0xaa, 0x34, 0x9b, 0x00,
+ 0x89, 0xaf, 0x1e, 0xb9, 0x00, 0x89, 0xbd, 0x37,
+ 0x8a, 0x00, 0x89, 0xd2, 0x05, 0xaf, 0x00, 0x8a,
+ 0x0a, 0x36, 0x24, 0x00, 0x8a, 0x12, 0x37, 0xd7,
+ 0x00, 0x8a, 0x1d, 0x35, 0x21, 0x00, 0x8a, 0x1f,
+ 0x34, 0x96, 0x00, 0x8a, 0x3b, 0x1e, 0x3c, 0x00,
+ 0x8a, 0x55, 0x36, 0xaf, 0x00, 0x8a, 0x6e, 0x1e,
+ 0x28, 0x00, 0x8a, 0x8d, 0x36, 0x92, 0x00, 0x8a,
+ 0x95, 0x34, 0xa3, 0x00, 0x8a, 0xa0, 0x36, 0x2f,
+ 0x00, 0x8a, 0xa4, 0x35, 0xc2, 0x00, 0x8a, 0xb9,
+ 0x34, 0xb7, 0x00, 0x8a, 0xbf, 0x36, 0x6d, 0x00,
+ 0x8a, 0xcb, 0x36, 0x30, 0x00, 0x8a, 0xdb, 0x37,
+ 0x8b, 0x00, 0x8a, 0xde, 0x1e, 0xba, 0x00, 0x8a,
+ 0xed, 0x0f, 0x0b, 0x00, 0x8a, 0xee, 0x35, 0xe3,
+ 0x00, 0x8a, 0xf8, 0x09, 0x7e, 0x00, 0x8a, 0xfa,
+ 0x1d, 0xfe, 0x00, 0x8b, 0x01, 0x04, 0xfc, 0x00,
+ 0x8b, 0x04, 0x36, 0x86, 0x00, 0x8b, 0x0e, 0x1e,
+ 0x56, 0x00, 0x8b, 0x19, 0x35, 0xb9, 0x00, 0x8b,
+ 0x1b, 0x35, 0xcd, 0x00, 0x8b, 0x1d, 0x34, 0x8d,
+ 0x00, 0x8b, 0x2c, 0x1e, 0x69, 0x00, 0x8b, 0x39,
+ 0x06, 0xd8, 0x00, 0x8b, 0x3e, 0x37, 0x8c, 0x00,
+ 0x8b, 0x41, 0x1e, 0xbb, 0x00, 0x8b, 0x56, 0x4e,
+ 0xf8, 0x00, 0x8b, 0x5a, 0x37, 0x8d, 0x00, 0x8b,
+ 0x5c, 0x4e, 0xfa, 0x00, 0x8b, 0x7f, 0x52, 0x52,
+ 0x00, 0x8c, 0x6a, 0x4e, 0xfd, 0x00, 0x8c, 0x79,
+ 0x4e, 0xfe, 0x00, 0x8c, 0x9b, 0x58, 0x37, 0x00,
+ 0x8c, 0xa0, 0x36, 0xb5, 0x00, 0x8c, 0xa7, 0x34,
+ 0xb8, 0x00, 0x8c, 0xa8, 0x35, 0x64, 0x00, 0x8c,
+ 0xab, 0x34, 0x72, 0x00, 0x8c, 0xc7, 0x35, 0xe5,
+ 0x00, 0x8c, 0xca, 0x36, 0x4c, 0x00, 0x8c, 0xd3,
+ 0x0d, 0xc2, 0x00, 0x8c, 0xed, 0x1e, 0x4c, 0x00,
+ 0x8c, 0xfc, 0x34, 0x86, 0x00, 0x8d, 0x05, 0x35,
+ 0x22, 0x00, 0x8d, 0x08, 0x34, 0x34, 0x00, 0x8d,
+ 0x0f, 0x35, 0x23, 0x00, 0x8d, 0x67, 0x4f, 0x00,
+ 0x00, 0x8d, 0x70, 0x36, 0x46, 0x00, 0x8d, 0x73,
+ 0x37, 0x8e, 0x00, 0x8d, 0x77, 0x35, 0x88, 0x00,
+ 0x8d, 0x99, 0x37, 0x8f, 0x00, 0x8d, 0xda, 0x1e,
+ 0xbc, 0x00, 0x8d, 0xdd, 0x35, 0x94, 0x00, 0x8d,
+ 0xf3, 0x34, 0xa8, 0x00, 0x8e, 0x09, 0x1e, 0xbd,
+ 0x00, 0x8e, 0x34, 0x37, 0x91, 0x00, 0x8e, 0x4a,
+ 0x37, 0x92, 0x00, 0x8e, 0x8d, 0x36, 0xef, 0x00,
+ 0x8e, 0x91, 0x35, 0x25, 0x00, 0x8e, 0xa1, 0x35,
+ 0x26, 0x00, 0x8e, 0xcc, 0x34, 0x76, 0x00, 0x8e,
+ 0xd4, 0x3b, 0x4a, 0x00, 0x8f, 0x03, 0x4f, 0x02,
+ 0x00, 0x8f, 0x13, 0x1e, 0xbe, 0x00, 0x8f, 0x29,
+ 0x34, 0xb0, 0x00, 0x8f, 0x2f, 0x34, 0x90, 0x00,
+ 0x8f, 0x38, 0x36, 0xf5, 0x00, 0x8f, 0x44, 0x35,
+ 0x75, 0x00, 0x8f, 0xb6, 0x3c, 0x2b, 0x00, 0x8f,
+ 0xbb, 0x20, 0x4b, 0x00, 0x8f, 0xbc, 0x35, 0xd3,
+ 0x00, 0x8f, 0xbf, 0x1e, 0x37, 0x00, 0x8f, 0xc2,
+ 0x1d, 0xd6, 0x00, 0x8f, 0xc4, 0x1f, 0x2c, 0x00,
+ 0x8f, 0xc5, 0x36, 0x26, 0x00, 0x8f, 0xc6, 0x3b,
+ 0x51, 0x00, 0x8f, 0xce, 0x35, 0xae, 0x00, 0x8f,
+ 0xd1, 0x35, 0xa2, 0x00, 0x8f, 0xd4, 0x36, 0xc0,
+ 0x00, 0x8f, 0xe6, 0x1d, 0xdf, 0x00, 0x8f, 0xe9,
+ 0x1e, 0xc0, 0x00, 0x8f, 0xea, 0x1e, 0xbf, 0x00,
+ 0x8f, 0xeb, 0x36, 0x9a, 0x00, 0x8f, 0xed, 0x36,
+ 0x7b, 0x00, 0x8f, 0xef, 0x37, 0x93, 0x00, 0x8f,
+ 0xf0, 0x35, 0xfe, 0x00, 0x8f, 0xf6, 0x4f, 0x06,
+ 0x00, 0x8f, 0xf7, 0x36, 0xe6, 0x00, 0x8f, 0xfa,
+ 0x37, 0x95, 0x00, 0x8f, 0xfd, 0x36, 0x72, 0x00,
+ 0x90, 0x00, 0x36, 0x51, 0x00, 0x90, 0x01, 0x36,
+ 0x47, 0x00, 0x90, 0x03, 0x34, 0xad, 0x00, 0x90,
+ 0x06, 0x35, 0x8d, 0x00, 0x90, 0x0e, 0x35, 0x28,
+ 0x00, 0x90, 0x0f, 0x36, 0x88, 0x00, 0x90, 0x10,
+ 0x36, 0x64, 0x00, 0x90, 0x14, 0x36, 0x7e, 0x00,
+ 0x90, 0x17, 0x1e, 0x1f, 0x00, 0x90, 0x19, 0x1e,
+ 0x5c, 0x00, 0x90, 0x1a, 0x36, 0x73, 0x00, 0x90,
+ 0x1d, 0x1e, 0x22, 0x00, 0x90, 0x1e, 0x37, 0x96,
+ 0x00, 0x90, 0x1f, 0x36, 0x4b, 0x00, 0x90, 0x20,
+ 0x36, 0x49, 0x00, 0x90, 0x22, 0x20, 0x4a, 0x00,
+ 0x90, 0x23, 0x0f, 0xc8, 0x00, 0x90, 0x2e, 0x36,
+ 0x52, 0x00, 0x90, 0x31, 0x35, 0xfb, 0x00, 0x90,
+ 0x32, 0x36, 0x1f, 0x00, 0x90, 0x35, 0x37, 0x97,
+ 0x00, 0x90, 0x38, 0x34, 0x08, 0x00, 0x90, 0x39,
+ 0x36, 0x58, 0x00, 0x90, 0x3c, 0x1e, 0x67, 0x00,
+ 0x90, 0x41, 0x1e, 0x53, 0x00, 0x90, 0x42, 0x34,
+ 0x9c, 0x00, 0x90, 0x47, 0x35, 0xa8, 0x00, 0x90,
+ 0x4a, 0x36, 0xfc, 0x00, 0x90, 0x4b, 0x35, 0x51,
+ 0x00, 0x90, 0x4d, 0x36, 0xc1, 0x00, 0x90, 0x4e,
+ 0x35, 0x65, 0x00, 0x90, 0x50, 0x37, 0x98, 0x00,
+ 0x90, 0x52, 0x35, 0x27, 0x00, 0x90, 0x53, 0x36,
+ 0x8b, 0x00, 0x90, 0x54, 0x36, 0x58, 0x00, 0x90,
+ 0x55, 0x34, 0x63, 0x00, 0x90, 0x58, 0x1e, 0xc1,
+ 0x00, 0x90, 0x5c, 0x1e, 0x2e, 0x00, 0x90, 0x60,
+ 0x35, 0x5a, 0x00, 0x90, 0x61, 0x1e, 0x2a, 0x00,
+ 0x90, 0x63, 0x35, 0xba, 0x00, 0x90, 0x69, 0x36,
+ 0x7a, 0x00, 0x90, 0x6d, 0x36, 0x48, 0x00, 0x90,
+ 0x6e, 0x1e, 0x0e, 0x00, 0x90, 0x75, 0x36, 0x00,
+ 0x00, 0x90, 0x77, 0x36, 0x40, 0x00, 0x90, 0x78,
+ 0x36, 0x3f, 0x00, 0x90, 0x7a, 0x35, 0x4a, 0x00,
+ 0x90, 0x7c, 0x1e, 0x80, 0x00, 0x90, 0x7f, 0x36,
+ 0xa7, 0x00, 0x90, 0x81, 0x37, 0x9a, 0x00, 0x90,
+ 0x83, 0x37, 0x5c, 0x00, 0x90, 0x84, 0x35, 0x7c,
+ 0x00, 0x90, 0x87, 0x37, 0x94, 0x00, 0x90, 0x89,
+ 0x34, 0x5f, 0x00, 0x90, 0x8a, 0x37, 0x9b, 0x00,
+ 0x90, 0xa3, 0x1e, 0x55, 0x00, 0x90, 0xa6, 0x36,
+ 0xcb, 0x00, 0x90, 0xa8, 0x4f, 0x0b, 0x00, 0x90,
+ 0xaa, 0x34, 0x8e, 0x00, 0x90, 0xf7, 0x35, 0x9d,
+ 0x00, 0x90, 0xfd, 0x0c, 0x4e, 0x00, 0x91, 0x2d,
+ 0x1e, 0x44, 0x00, 0x91, 0x30, 0x35, 0x29, 0x00,
+ 0x91, 0x4b, 0x1e, 0x12, 0x00, 0x91, 0x4c, 0x35,
+ 0xf2, 0x00, 0x91, 0x4d, 0x4f, 0x0c, 0x00, 0x91,
+ 0x56, 0x35, 0x2a, 0x00, 0x91, 0x58, 0x35, 0x2b,
+ 0x00, 0x91, 0x65, 0x35, 0x2c, 0x00, 0x91, 0x72,
+ 0x35, 0x2e, 0x00, 0x91, 0x73, 0x35, 0x2d, 0x00,
+ 0x91, 0x77, 0x35, 0xd0, 0x00, 0x91, 0xa2, 0x35,
+ 0x2f, 0x00, 0x91, 0xaa, 0x35, 0x31, 0x00, 0x91,
+ 0xaf, 0x35, 0x30, 0x00, 0x91, 0xb1, 0x36, 0x9f,
+ 0x00, 0x91, 0xb4, 0x35, 0x32, 0x00, 0x91, 0xba,
+ 0x35, 0x33, 0x00, 0x91, 0xc1, 0x1e, 0xc3, 0x00,
+ 0x91, 0xc7, 0x1e, 0x05, 0x00, 0x91, 0xdc, 0x4f,
+ 0x42, 0x00, 0x91, 0xe3, 0x36, 0x75, 0x00, 0x91,
+ 0xfc, 0x3c, 0x2c, 0x00, 0x92, 0x37, 0x34, 0x7d,
+ 0x00, 0x92, 0x5b, 0x34, 0x69, 0x00, 0x92, 0xe9,
+ 0x4f, 0x0d, 0x00, 0x93, 0x06, 0x1e, 0x0a, 0x00,
+ 0x93, 0x35, 0x4f, 0x0e, 0x00, 0x93, 0x65, 0x3b,
+ 0x86, 0x00, 0x93, 0x75, 0x4f, 0x34, 0x00, 0x93,
+ 0x8b, 0x4f, 0x0f, 0x00, 0x93, 0x8c, 0x35, 0x76,
+ 0x00, 0x93, 0x96, 0x35, 0xd5, 0x00, 0x93, 0x9a,
+ 0x1e, 0x41, 0x00, 0x93, 0xa1, 0x59, 0x04, 0x00,
+ 0x93, 0xae, 0x34, 0x3a, 0x00, 0x93, 0xdd, 0x37,
+ 0xae, 0x00, 0x94, 0x3a, 0x4f, 0x10, 0x00, 0x94,
+ 0x53, 0x1e, 0x79, 0x00, 0x94, 0x77, 0x35, 0x34,
+ 0x00, 0x95, 0x92, 0x35, 0x7d, 0x00, 0x95, 0xab,
+ 0x3b, 0x9a, 0x00, 0x95, 0xbb, 0x1e, 0xc4, 0x00,
+ 0x95, 0xbc, 0x37, 0xaf, 0x00, 0x95, 0xcd, 0x4f,
+ 0x11, 0x00, 0x96, 0x2a, 0x4f, 0x12, 0x00, 0x96,
+ 0x4d, 0x34, 0x87, 0x00, 0x96, 0x86, 0x34, 0x51,
+ 0x00, 0x96, 0x8a, 0x36, 0x53, 0x00, 0x96, 0x94,
+ 0x35, 0x73, 0x00, 0x96, 0x98, 0x35, 0x35, 0x00,
+ 0x96, 0x99, 0x4f, 0x31, 0x00, 0x96, 0xa3, 0x34,
+ 0xca, 0x00, 0x96, 0xa7, 0x4f, 0x14, 0x00, 0x96,
+ 0xb2, 0x37, 0xb1, 0x00, 0x96, 0xbb, 0x36, 0x35,
+ 0x00, 0x96, 0xc5, 0x34, 0x6c, 0x00, 0x96, 0xc7,
+ 0x35, 0xbe, 0x00, 0x96, 0xd9, 0x34, 0xd5, 0x00,
+ 0x96, 0xda, 0x59, 0x3b, 0x00, 0x96, 0xe3, 0x0c,
+ 0xc9, 0x00, 0x96, 0xe8, 0x35, 0x4d, 0x00, 0x96,
+ 0xea, 0x36, 0x39, 0x00, 0x96, 0xf0, 0x34, 0xc0,
+ 0x00, 0x97, 0x21, 0x59, 0x41, 0x00, 0x97, 0x24,
+ 0x1e, 0xc6, 0x00, 0x97, 0x3d, 0x35, 0x36, 0x00,
+ 0x97, 0x55, 0x21, 0xf8, 0x00, 0x97, 0x56, 0x21,
+ 0x8b, 0x00, 0x97, 0x59, 0x37, 0xb2, 0x00, 0x97,
+ 0x5c, 0x36, 0x31, 0x00, 0x97, 0x60, 0x1e, 0xc7,
+ 0x00, 0x97, 0x6d, 0x1e, 0xc8, 0x00, 0x97, 0x71,
+ 0x1e, 0x1e, 0x00, 0x97, 0x74, 0x1d, 0xf3, 0x00,
+ 0x97, 0x84, 0x1d, 0xe5, 0x00, 0x97, 0x98, 0x1e,
+ 0x1c, 0x00, 0x97, 0xad, 0x4f, 0x43, 0x00, 0x97,
+ 0xd3, 0x35, 0x7e, 0x00, 0x97, 0xde, 0x3c, 0x2e,
+ 0x00, 0x97, 0xf3, 0x35, 0x60, 0x00, 0x97, 0xff,
+ 0x34, 0x19, 0x00, 0x98, 0x0c, 0x35, 0x39, 0x00,
+ 0x98, 0x11, 0x34, 0x74, 0x00, 0x98, 0x12, 0x34,
+ 0xb2, 0x00, 0x98, 0x13, 0x1e, 0x54, 0x00, 0x98,
+ 0x24, 0x1e, 0xc9, 0x00, 0x98, 0x3b, 0x0d, 0xc3,
+ 0x00, 0x98, 0x5e, 0x0f, 0xa8, 0x00, 0x98, 0x67,
+ 0x35, 0xbf, 0x00, 0x98, 0x73, 0x35, 0x3a, 0x00,
+ 0x98, 0xc3, 0x35, 0x3b, 0x00, 0x98, 0xdf, 0x36,
+ 0x17, 0x00, 0x98, 0xe2, 0x35, 0x89, 0x00, 0x98,
+ 0xeb, 0x37, 0xb4, 0x00, 0x98, 0xef, 0x0d, 0x67,
+ 0x00, 0x98, 0xf4, 0x1d, 0xd2, 0x00, 0x98, 0xfc,
+ 0x21, 0xfc, 0x00, 0x98, 0xfd, 0x36, 0xcd, 0x00,
+ 0x98, 0xfe, 0x36, 0x14, 0x00, 0x99, 0x03, 0x37,
+ 0xb5, 0x00, 0x99, 0x05, 0x1e, 0x77, 0x00, 0x99,
+ 0x09, 0x37, 0xb6, 0x00, 0x99, 0x0a, 0x37, 0x00,
+ 0x00, 0x99, 0x0c, 0x1d, 0xdb, 0x00, 0x99, 0x10,
+ 0x1f, 0x22, 0x00, 0x99, 0x13, 0x35, 0x68, 0x00,
+ 0x99, 0x21, 0x4f, 0x18, 0x00, 0x99, 0x28, 0x21,
+ 0xfe, 0x00, 0x99, 0x45, 0x37, 0xb7, 0x00, 0x99,
+ 0x4b, 0x37, 0xb9, 0x00, 0x99, 0x57, 0x1f, 0x20,
+ 0x00, 0x99, 0xc1, 0x4f, 0x40, 0x00, 0x99, 0xd0,
+ 0x36, 0x67, 0x00, 0x9a, 0x19, 0x1f, 0x43, 0x00,
+ 0x9a, 0x30, 0x36, 0x89, 0x00, 0x9a, 0x45, 0x35,
+ 0x3c, 0x00, 0x9a, 0x4a, 0x59, 0x88, 0x00, 0x9a,
+ 0x5f, 0x37, 0xbb, 0x00, 0x9a, 0x65, 0x37, 0xbc,
+ 0x00, 0x9a, 0xef, 0x37, 0xbd, 0x00, 0x9b, 0x18,
+ 0x37, 0xbe, 0x00, 0x9b, 0x2d, 0x34, 0x3c, 0x00,
+ 0x9b, 0x2e, 0x1e, 0xca, 0x00, 0x9b, 0x35, 0x59,
+ 0xa4, 0x00, 0x9b, 0x4d, 0x35, 0x3d, 0x00, 0x9b,
+ 0x54, 0x36, 0xdb, 0x00, 0x9b, 0x58, 0x35, 0x3e,
+ 0x00, 0x9b, 0x97, 0x1e, 0xcb, 0x00, 0x9b, 0xa8,
+ 0x4f, 0x1a, 0x00, 0x9b, 0xab, 0x4f, 0x38, 0x00,
+ 0x9b, 0xae, 0x4f, 0x1b, 0x00, 0x9b, 0xb9, 0x4f,
+ 0x1c, 0x00, 0x9b, 0xc6, 0x35, 0x3f, 0x00, 0x9b,
+ 0xd6, 0x1e, 0x09, 0x00, 0x9b, 0xdb, 0x36, 0x54,
+ 0x00, 0x9b, 0xe1, 0x35, 0x40, 0x00, 0x9b, 0xf1,
+ 0x35, 0x41, 0x00, 0x9b, 0xf2, 0x1e, 0xcc, 0x00,
+ 0x9c, 0x08, 0x4f, 0x1d, 0x00, 0x9c, 0x24, 0x4f,
+ 0x1e, 0x00, 0x9c, 0x2f, 0x1d, 0xd4, 0x00, 0x9c,
+ 0x3b, 0x4f, 0x1f, 0x00, 0x9c, 0x48, 0x1e, 0x39,
+ 0x00, 0x9c, 0x52, 0x1e, 0x74, 0x00, 0x9c, 0x57,
+ 0x37, 0x0c, 0x00, 0x9c, 0xe6, 0x4f, 0x21, 0x00,
+ 0x9d, 0x07, 0x1e, 0x4f, 0x00, 0x9d, 0x08, 0x37,
+ 0xc1, 0x00, 0x9d, 0x09, 0x37, 0xc0, 0x00, 0x9d,
+ 0x48, 0x35, 0x42, 0x00, 0x9d, 0x60, 0x1e, 0x03,
+ 0x00, 0x9d, 0x6c, 0x36, 0xce, 0x00, 0x9d, 0xb4,
+ 0x0b, 0xfd, 0x00, 0x9d, 0xbf, 0x59, 0xde, 0x00,
+ 0x9d, 0xc0, 0x4f, 0x22, 0x00, 0x9d, 0xc2, 0x4f,
+ 0x23, 0x00, 0x9d, 0xcf, 0x35, 0x43, 0x00, 0x9e,
+ 0x97, 0x34, 0xcc, 0x00, 0x9e, 0x9f, 0x34, 0xcb,
+ 0x00, 0x9e, 0xa5, 0x37, 0xc2, 0x00, 0x9e, 0xaa,
+ 0x1e, 0xcd, 0x00, 0x9e, 0xad, 0x1f, 0x44, 0x00,
+ 0x9e, 0xbb, 0x36, 0xdc, 0x00, 0x9e, 0xbf, 0x36,
+ 0xe2, 0x00, 0x9e, 0xcc, 0x37, 0xc3, 0x00, 0x9e,
+ 0xdb, 0x1e, 0x31, 0x00, 0x9f, 0x08, 0x35, 0x44,
+ 0x00, 0x9f, 0x3b, 0x36, 0xa9, 0x00, 0x9f, 0x4a,
+ 0x37, 0xc5, 0x00, 0x9f, 0x4b, 0x37, 0x5a, 0x00,
+ 0x9f, 0x4e, 0x35, 0x24, 0x00, 0x9f, 0x67, 0x37,
+ 0xc7, 0x00, 0x9f, 0x8d, 0x37, 0x06, 0x00, 0x9f,
+ 0x9c, 0x1e, 0xce, 0x00, 0x9f, 0x9d, 0x1e, 0xa7,
+ 0x00, 0xfa, 0x11, 0x20, 0xfb, 0x00, 0xfa, 0x24,
+ 0x21, 0xb8, 0x02, 0x35, 0xc4, 0x3c, 0x44, 0x02,
+ 0x36, 0x3a, 0x35, 0x9b, 0x02, 0x38, 0x3d, 0x4f,
+ 0x26, 0x02, 0x42, 0xee, 0x37, 0xc9, 0x02, 0x62,
+ 0x70, 0x37, 0x6e, 0x02, 0x9d, 0x4b, 0x35, 0x96,
+ 0x02, 0x9e, 0x3d, 0x3c, 0x4d, 0x02, 0xa6, 0x1a,
+ 0x37, 0xc8, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x34,
+ 0x02, 0x35, 0x83, 0x00, 0x50, 0x91, 0x35, 0xaf,
+ 0x00, 0x50, 0xca, 0x37, 0x15, 0x00, 0x51, 0x54,
+ 0x37, 0x17, 0x00, 0x51, 0x95, 0x37, 0x18, 0x00,
+ 0x51, 0xb4, 0x35, 0xdb, 0x00, 0x51, 0xde, 0x38,
+ 0x10, 0x00, 0x52, 0x72, 0x4e, 0x76, 0x00, 0x53,
+ 0x7f, 0x1d, 0xed, 0x00, 0x53, 0xa9, 0x1f, 0x1c,
+ 0x00, 0x55, 0x33, 0x37, 0x21, 0x00, 0x55, 0xa9,
+ 0x34, 0xd6, 0x00, 0x55, 0xab, 0x4e, 0x7c, 0x00,
+ 0x55, 0xe4, 0x37, 0x22, 0x00, 0x56, 0xae, 0x4e,
+ 0x7e, 0x00, 0x57, 0xf4, 0x36, 0x13, 0x00, 0x58,
+ 0x5a, 0x20, 0xe6, 0x00, 0x59, 0x51, 0x4e, 0x88,
+ 0x00, 0x59, 0xff, 0x35, 0xe1, 0x00, 0x5a, 0xbe,
+ 0x34, 0xdc, 0x00, 0x5b, 0xb3, 0x35, 0x6b, 0x00,
+ 0x5c, 0x0a, 0x36, 0x4e, 0x00, 0x5c, 0x0f, 0x36,
+ 0x0a, 0x00, 0x5e, 0xca, 0x34, 0x59, 0x00, 0x5e,
+ 0xe3, 0x4e, 0x93, 0x00, 0x5e, 0xf6, 0x35, 0x56,
+ 0x00, 0x60, 0x62, 0x4f, 0x2d, 0x00, 0x60, 0x97,
+ 0x37, 0x30, 0x00, 0x61, 0x67, 0x35, 0xad, 0x00,
+ 0x61, 0x68, 0x34, 0x6e, 0x00, 0x61, 0xb2, 0x4e,
+ 0x98, 0x00, 0x61, 0xf2, 0x36, 0x6a, 0x00, 0x62,
+ 0x49, 0x34, 0xb4, 0x00, 0x66, 0x5f, 0x37, 0x38,
+ 0x00, 0x66, 0xc1, 0x4e, 0xac, 0x00, 0x67, 0x15,
+ 0x36, 0x70, 0x00, 0x67, 0x17, 0x21, 0x29, 0x00,
+ 0x67, 0x1b, 0x36, 0xd5, 0x00, 0x68, 0x5d, 0x36,
+ 0xde, 0x00, 0x68, 0x7a, 0x36, 0xf1, 0x00, 0x69,
+ 0x0d, 0x36, 0x15, 0x00, 0x69, 0x82, 0x34, 0x6f,
+ 0x00, 0x6a, 0xdb, 0x35, 0xa9, 0x00, 0x6b, 0x21,
+ 0x35, 0xe8, 0x00, 0x6c, 0x08, 0x34, 0xf4, 0x00,
+ 0x6c, 0xaa, 0x4e, 0xbb, 0x00, 0x6c, 0xbf, 0x34,
+ 0x68, 0x00, 0x6c, 0xe8, 0x32, 0x45, 0x00, 0x6d,
+ 0x3e, 0x36, 0x96, 0x00, 0x6e, 0x23, 0x34, 0xf6,
+ 0x00, 0x6e, 0xa2, 0x52, 0x4f, 0x00, 0x6e, 0xcb,
+ 0x4e, 0xc1, 0x00, 0x6f, 0x11, 0x37, 0x45, 0x00,
+ 0x6f, 0x5b, 0x4e, 0xc5, 0x00, 0x71, 0x7d, 0x1f,
+ 0x24, 0x00, 0x72, 0x35, 0x35, 0xf0, 0x00, 0x73,
+ 0x36, 0x36, 0xf9, 0x00, 0x73, 0x37, 0x36, 0xfa,
+ 0x00, 0x73, 0xca, 0x4e, 0xcc, 0x00, 0x75, 0x11,
+ 0x35, 0xd2, 0x00, 0x75, 0x15, 0x4f, 0x2b, 0x00,
+ 0x79, 0x53, 0x37, 0x59, 0x00, 0x7a, 0x74, 0x35,
+ 0xb1, 0x00, 0x7b, 0x08, 0x4f, 0x27, 0x00, 0x7b,
+ 0xc0, 0x36, 0x37, 0x00, 0x7c, 0x3e, 0x4f, 0x29,
+ 0x00, 0x7c, 0x50, 0x4e, 0xdb, 0x00, 0x7c, 0x7e,
+ 0x4f, 0x45, 0x00, 0x7d, 0xb2, 0x4e, 0xde, 0x00,
+ 0x7e, 0x22, 0x37, 0x66, 0x00, 0x7e, 0x35, 0x37,
+ 0x68, 0x00, 0x7f, 0xc1, 0x35, 0x5e, 0x00, 0x7f,
+ 0xe1, 0x4e, 0xe0, 0x00, 0x7f, 0xe9, 0x37, 0x71,
+ 0x00, 0x7f, 0xfc, 0x37, 0x02, 0x00, 0x81, 0x08,
+ 0x36, 0xe3, 0x00, 0x82, 0x39, 0x36, 0x3e, 0x00,
+ 0x82, 0x79, 0x37, 0x76, 0x00, 0x82, 0xbd, 0x34,
+ 0x6b, 0x00, 0x83, 0xdf, 0x1f, 0x28, 0x00, 0x85,
+ 0x3d, 0x34, 0xc1, 0x00, 0x86, 0x12, 0x52, 0x51,
+ 0x00, 0x87, 0xd2, 0x1f, 0x42, 0x00, 0x88, 0x05,
+ 0x4f, 0x47, 0x00, 0x88, 0x36, 0x37, 0x87, 0x00,
+ 0x8a, 0x0a, 0x36, 0x25, 0x00, 0x8a, 0x1d, 0x4f,
+ 0x2c, 0x00, 0x8a, 0x95, 0x36, 0x5d, 0x00, 0x8a,
+ 0xee, 0x35, 0xe4, 0x00, 0x8b, 0x56, 0x4e, 0xf9,
+ 0x00, 0x8c, 0xa0, 0x36, 0xb6, 0x00, 0x8c, 0xc7,
+ 0x35, 0xe6, 0x00, 0x8c, 0xca, 0x4e, 0xff, 0x00,
+ 0x8c, 0xfc, 0x35, 0xce, 0x00, 0x8f, 0x44, 0x4f,
+ 0x03, 0x00, 0x8f, 0xc5, 0x4f, 0x04, 0x00, 0x8f,
+ 0xd4, 0x4f, 0x05, 0x00, 0x90, 0x03, 0x36, 0x87,
+ 0x00, 0x90, 0x22, 0x34, 0x60, 0x00, 0x90, 0x38,
+ 0x21, 0xb9, 0x00, 0x90, 0x41, 0x4f, 0x3f, 0x00,
+ 0x90, 0x42, 0x36, 0x28, 0x00, 0x90, 0x55, 0x35,
+ 0x49, 0x00, 0x90, 0x75, 0x36, 0x01, 0x00, 0x90,
+ 0x77, 0x4f, 0x07, 0x00, 0x90, 0x89, 0x37, 0xa1,
+ 0x00, 0x90, 0x8a, 0x37, 0x9c, 0x00, 0x90, 0xa6,
+ 0x36, 0xcc, 0x00, 0x90, 0xaa, 0x35, 0xee, 0x00,
+ 0x92, 0x5b, 0x35, 0x5b, 0x00, 0x96, 0x86, 0x21,
+ 0xee, 0x00, 0x96, 0x98, 0x4f, 0x13, 0x00, 0x96,
+ 0xa3, 0x37, 0x0b, 0x00, 0x96, 0xc5, 0x35, 0x67,
+ 0x00, 0x97, 0x5c, 0x36, 0x32, 0x00, 0x97, 0x60,
+ 0x35, 0x37, 0x00, 0x97, 0x6d, 0x1f, 0x23, 0x00,
+ 0x97, 0x71, 0x35, 0x38, 0x00, 0x97, 0xff, 0x35,
+ 0x9e, 0x00, 0x98, 0xef, 0x4f, 0x25, 0x00, 0x99,
+ 0x0c, 0x34, 0x65, 0x00, 0x99, 0x45, 0x37, 0xb8,
+ 0x00, 0x99, 0x57, 0x35, 0x9f, 0x00, 0x9e, 0x9f,
+ 0x37, 0x0d, 0x00, 0x9f, 0x08, 0x37, 0xc4, 0x00,
+ 0x9f, 0x8d, 0x37, 0x07, 0x02, 0x36, 0x3a, 0x35,
+ 0x9c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x51, 0xde,
+ 0x4e, 0x71, 0x00, 0x53, 0xa9, 0x34, 0x64, 0x00,
+ 0x56, 0xae, 0x4e, 0x7f, 0x00, 0x5b, 0xb3, 0x4e,
+ 0x8f, 0x00, 0x61, 0x68, 0x35, 0x6c, 0x00, 0x61,
+ 0xf2, 0x52, 0x50, 0x00, 0x66, 0x5f, 0x37, 0x39,
+ 0x00, 0x67, 0x17, 0x37, 0x12, 0x00, 0x69, 0x82,
+ 0x35, 0x70, 0x00, 0x75, 0x11, 0x4f, 0x3c, 0x00,
+ 0x83, 0xdf, 0x4e, 0xe9, 0x00, 0x90, 0x77, 0x4f,
+ 0x08, 0x00, 0x90, 0x89, 0x37, 0xa2, 0x00, 0x90,
+ 0x8a, 0x37, 0x9d, 0x00, 0x97, 0xff, 0x4f, 0x15,
+ 0x00, 0x99, 0x0c, 0x35, 0x52, 0x00, 0x99, 0x57,
+ 0x4f, 0x19, 0x00, 0x00, 0x00, 0x06, 0x00, 0x51,
+ 0xde, 0x21, 0x5e, 0x00, 0x53, 0xa9, 0x35, 0x4f,
+ 0x00, 0x61, 0x68, 0x35, 0x6d, 0x00, 0x90, 0x89,
+ 0x37, 0xa3, 0x00, 0x90, 0x8a, 0x37, 0x9e, 0x00,
+ 0x97, 0xff, 0x4f, 0x16, 0x00, 0x00, 0x00, 0x04,
+ 0x00, 0x53, 0xa9, 0x4f, 0x2f, 0x00, 0x61, 0x68,
+ 0x35, 0x6e, 0x00, 0x90, 0x89, 0x37, 0xa4, 0x00,
+ 0x90, 0x8a, 0x37, 0x9f, 0x00, 0x00, 0x00, 0x02,
+ 0x00, 0x90, 0x89, 0x37, 0xa5, 0x00, 0x90, 0x8a,
+ 0x37, 0xa0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x90,
+ 0x89, 0x37, 0xa6, 0x00, 0x90, 0x8a, 0x4f, 0x0a,
0x00, 0x00, 0x00, 0x01, 0x00, 0x90, 0x89, 0x37,
- 0xac, 0x00, 0x00, 0x00, 0x01, 0x00, 0x90, 0x89,
- 0x4f, 0x09
+ 0xa7, 0x00, 0x00, 0x00, 0x01, 0x00, 0x90, 0x89,
+ 0x37, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x00, 0x90,
+ 0x89, 0x37, 0xa9, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0x90, 0x89, 0x37, 0xaa, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x90, 0x89, 0x37, 0xab, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x90, 0x89, 0x37, 0xac, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x90, 0x89, 0x4f, 0x09
};
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. */
return type;
}
-DEFUN ("buffer-has-markers-at", Fbuffer_has_markers_at, Sbuffer_has_markers_at,
- 1, 1, 0,
- doc: /* Return t if there are markers pointing at POSITION in the current buffer. */)
- (Lisp_Object position)
-{
- register struct Lisp_Marker *tail;
- register ptrdiff_t charpos;
-
- charpos = clip_to_bounds (BEG, XFIXNUM (position), Z);
-
- for (tail = BUF_MARKERS (current_buffer); tail; tail = tail->next)
- if (tail->charpos == charpos)
- return Qt;
-
- return Qnil;
-}
-
#ifdef MARKER_DEBUG
/* For debugging -- count the markers in buffer BUF. */
@@ -821,5 +804,4 @@ syms_of_marker (void)
defsubr (&Scopy_marker);
defsubr (&Smarker_insertion_type);
defsubr (&Sset_marker_insertion_type);
- defsubr (&Sbuffer_has_markers_at);
}
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/>. */
#include "blockinput.h"
#include "buffer.h"
-#ifdef USE_X_TOOLKIT
-#include "../lwlib/lwlib.h"
-#endif
-
#ifdef HAVE_WINDOW_SYSTEM
#include TERM_HEADER
#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)
}
Vinitial_window_system = Qpc;
- Vwindow_system_version = make_fixnum (29); /* RE Emacs version */
tty->terminal->type = output_msdos_raw;
/* 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)
static NSFontDescriptor *
ns_spec_to_descriptor (Lisp_Object font_spec)
{
- NSFontDescriptor *fdesc;
- NSMutableDictionary *fdAttrs = [NSMutableDictionary new];
- NSString *family = ns_get_family (font_spec);
- NSMutableDictionary *tdict = [NSMutableDictionary new];
+ NSFontDescriptor *fdesc;
+ NSMutableDictionary *fdAttrs = [NSMutableDictionary new];
+ NSString *family = ns_get_family (font_spec);
+ NSMutableDictionary *tdict = [NSMutableDictionary new];
- Lisp_Object tem;
+ Lisp_Object tem;
- tem = FONT_SLANT_SYMBOLIC (font_spec);
- if (!NILP (tem))
- {
- if (EQ (tem, Qitalic) || EQ (tem, Qoblique))
- [tdict setObject: [NSNumber numberWithFloat: 1.0]
- forKey: NSFontSlantTrait];
- else if (EQ (tem, intern ("reverse-italic")) ||
- EQ (tem, intern ("reverse-oblique")))
- [tdict setObject: [NSNumber numberWithFloat: -1.0]
- forKey: NSFontSlantTrait];
- else
- [tdict setObject: [NSNumber numberWithFloat: 0.0]
- forKey: NSFontSlantTrait];
- }
+ tem = FONT_SLANT_SYMBOLIC (font_spec);
+ if (!NILP (tem))
+ {
+ if (EQ (tem, Qitalic) || EQ (tem, Qoblique))
+ [tdict setObject: [NSNumber numberWithFloat: 1.0]
+ forKey: NSFontSlantTrait];
+ else if (EQ (tem, intern ("reverse-italic"))
+ || EQ (tem, intern ("reverse-oblique")))
+ [tdict setObject: [NSNumber numberWithFloat: -1.0]
+ forKey: NSFontSlantTrait];
+ else
+ [tdict setObject: [NSNumber numberWithFloat: 0.0]
+ forKey: NSFontSlantTrait];
+ }
- tem = FONT_WIDTH_SYMBOLIC (font_spec);
- if (!NILP (tem))
- {
- if (EQ (tem, Qcondensed))
- [tdict setObject: [NSNumber numberWithFloat: -1.0]
- forKey: NSFontWidthTrait];
- else if (EQ (tem, Qexpanded))
- [tdict setObject: [NSNumber numberWithFloat: 1.0]
- forKey: NSFontWidthTrait];
- else
- [tdict setObject: [NSNumber numberWithFloat: 0.0]
- forKey: NSFontWidthTrait];
- }
+ tem = FONT_WIDTH_SYMBOLIC (font_spec);
+ if (!NILP (tem))
+ {
+ if (EQ (tem, Qcondensed))
+ [tdict setObject: [NSNumber numberWithFloat: -1.0]
+ forKey: NSFontWidthTrait];
+ else if (EQ (tem, Qexpanded))
+ [tdict setObject: [NSNumber numberWithFloat: 1.0]
+ forKey: NSFontWidthTrait];
+ else
+ [tdict setObject: [NSNumber numberWithFloat: 0.0]
+ forKey: NSFontWidthTrait];
+ }
- tem = FONT_WEIGHT_SYMBOLIC (font_spec);
+ tem = FONT_WEIGHT_SYMBOLIC (font_spec);
- if (!NILP (tem))
- {
- if (EQ (tem, Qbold))
- {
- [tdict setObject: [NSNumber numberWithFloat: 1.0]
- forKey: NSFontWeightTrait];
- }
- else if (EQ (tem, Qlight))
- {
- [tdict setObject: [NSNumber numberWithFloat: -1.0]
- forKey: NSFontWeightTrait];
- }
- else
- {
- [tdict setObject: [NSNumber numberWithFloat: 0.0]
- forKey: NSFontWeightTrait];
- }
- }
+ if (!NILP (tem))
+ {
+ if (EQ (tem, Qbold))
+ {
+ [tdict setObject: [NSNumber numberWithFloat: 1.0]
+ forKey: NSFontWeightTrait];
+ }
+ else if (EQ (tem, Qlight))
+ {
+ [tdict setObject: [NSNumber numberWithFloat: -1.0]
+ forKey: NSFontWeightTrait];
+ }
+ else
+ {
+ [tdict setObject: [NSNumber numberWithFloat: 0.0]
+ forKey: NSFontWeightTrait];
+ }
+ }
- tem = AREF (font_spec, FONT_SPACING_INDEX);
+ tem = AREF (font_spec, FONT_SPACING_INDEX);
- if (family != nil)
- {
- [fdAttrs setObject: family
- forKey: NSFontFamilyAttribute];
- }
+ if (family != nil)
+ [fdAttrs setObject: family
+ forKey: NSFontFamilyAttribute];
- if (FIXNUMP (tem))
- {
- if (XFIXNUM (tem) != FONT_SPACING_PROPORTIONAL)
- {
- [fdAttrs setObject: [NSNumber numberWithBool:YES]
- forKey: NSFontFixedAdvanceAttribute];
- }
- else
- {
- [fdAttrs setObject: [NSNumber numberWithBool:NO]
- forKey: NSFontFixedAdvanceAttribute];
- }
- }
+ if (FIXNUMP (tem))
+ {
+ if (XFIXNUM (tem) != FONT_SPACING_PROPORTIONAL)
+ [fdAttrs setObject: [NSNumber numberWithBool: YES]
+ forKey: NSFontFixedAdvanceAttribute];
+ else
+ [fdAttrs setObject: [NSNumber numberWithBool: NO]
+ forKey: NSFontFixedAdvanceAttribute];
+ }
- /* Handle special families such as ``fixed'' or ``Sans Serif''. */
+ /* Handle special families such as ``fixed'', ``monospace'' or
+ ``Sans Serif''. */
- if ([family isEqualToString: @"fixed"])
- {
- [fdAttrs setObject: [[NSFont userFixedPitchFontOfSize: 0] familyName]
- forKey: NSFontFamilyAttribute];
- }
- else if ([family isEqualToString: @"Sans Serif"])
- {
- [fdAttrs setObject: [[NSFont userFontOfSize: 0] familyName]
- forKey: NSFontFamilyAttribute];
- }
+ if ([family isEqualToString: @"fixed"]
+ || [family isEqualToString: @"monospace"])
+ [fdAttrs setObject: [[NSFont userFixedPitchFontOfSize: 0] familyName]
+ forKey: NSFontFamilyAttribute];
+ else if ([family isEqualToString: @"Sans Serif"])
+ [fdAttrs setObject: [[NSFont userFontOfSize: 0] familyName]
+ forKey: NSFontFamilyAttribute];
- [fdAttrs setObject: tdict forKey: NSFontTraitsAttribute];
+ [fdAttrs setObject: tdict forKey: NSFontTraitsAttribute];
- fdesc = [[[NSFontDescriptor fontDescriptorWithFontAttributes: fdAttrs]
- retain] autorelease];
+ fdesc = [[[NSFontDescriptor fontDescriptorWithFontAttributes: fdAttrs]
+ retain] autorelease];
- [tdict release];
- [fdAttrs release];
- return fdesc;
+ [tdict release];
+ [fdAttrs release];
+ return fdesc;
}
@@ -477,7 +469,7 @@ ns_descriptor_to_entity (NSFontDescriptor *desc,
ASET (font_entity, FONT_SIZE_INDEX, make_fixnum (0));
ASET (font_entity, FONT_AVGWIDTH_INDEX, make_fixnum (0));
ASET (font_entity, FONT_SPACING_INDEX,
- make_fixnum ((data.specified & GS_SPECIFIED_WIDTH && data.monospace_p)
+ make_fixnum ((data.specified & GS_SPECIFIED_SPACING && data.monospace_p)
? FONT_SPACING_MONO : FONT_SPACING_PROPORTIONAL));
ASET (font_entity, FONT_EXTRA_INDEX, extra);
@@ -792,53 +784,53 @@ static NSSet
static Lisp_Object
ns_findfonts (Lisp_Object font_spec, BOOL isMatch)
{
- Lisp_Object tem, list = Qnil;
- NSFontDescriptor *fdesc;
- NSArray *all_descs;
- GSFontEnumerator *enumerator = [GSFontEnumerator sharedEnumerator];
+ Lisp_Object tem, list = Qnil;
+ NSFontDescriptor *fdesc;
+ NSArray *all_descs;
+ GSFontEnumerator *enumerator = [GSFontEnumerator sharedEnumerator];
- NSSet *cFamilies;
+ NSSet *cFamilies;
- block_input ();
- if (NSFONT_TRACE)
- {
- fprintf (stderr, "nsfont: %s for fontspec:\n ",
- (isMatch ? "match" : "list"));
- debug_print (font_spec);
- }
+ block_input ();
+ if (NSFONT_TRACE)
+ {
+ fprintf (stderr, "nsfont: %s for fontspec:\n ",
+ (isMatch ? "match" : "list"));
+ debug_print (font_spec);
+ }
- cFamilies = ns_get_covering_families (ns_get_req_script (font_spec), 0.90);
+ cFamilies = ns_get_covering_families (ns_get_req_script (font_spec), 0.90);
- fdesc = ns_spec_to_descriptor (font_spec);
- all_descs = [enumerator availableFontDescriptors];
+ fdesc = ns_spec_to_descriptor (font_spec);
+ all_descs = [enumerator availableFontDescriptors];
- for (NSFontDescriptor *desc in all_descs)
- {
- if (![cFamilies containsObject:
- [desc objectForKey: NSFontFamilyAttribute]])
- continue;
- if (!ns_font_descs_match_p (fdesc, desc))
- continue;
-
- tem = ns_descriptor_to_entity (desc,
- AREF (font_spec, FONT_EXTRA_INDEX),
- NULL);
- if (isMatch)
- return tem;
- list = Fcons (tem, list);
- }
+ for (NSFontDescriptor *desc in all_descs)
+ {
+ if (![cFamilies containsObject:
+ [desc objectForKey: NSFontFamilyAttribute]])
+ continue;
+ if (!ns_font_descs_match_p (fdesc, desc))
+ continue;
+
+ tem = ns_descriptor_to_entity (desc,
+ AREF (font_spec, FONT_EXTRA_INDEX),
+ NULL);
+ if (isMatch)
+ return tem;
+ list = Fcons (tem, list);
+ }
- unblock_input ();
+ unblock_input ();
- /* Return something if was a match and nothing found. */
- if (isMatch)
- return ns_fallback_entity ();
+ /* Return something if was a match and nothing found. */
+ if (isMatch)
+ return ns_fallback_entity ();
- if (NSFONT_TRACE)
- fprintf (stderr, " Returning %"pD"d entities.\n",
- list_length (list));
+ if (NSFONT_TRACE)
+ fprintf (stderr, " Returning %"pD"d entities.\n",
+ list_length (list));
- return list;
+ return list;
}
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)
#include <time.h>
#include <signal.h>
#include <unistd.h>
-#include <stdbool.h>
#include <c-ctype.h>
#include <c-strcase.h>
@@ -3996,6 +3995,7 @@ static void
ns_draw_stretch_glyph_string (struct glyph_string *s)
{
struct face *face;
+ NSColor *fg_color;
if (s->hl == DRAW_CURSOR
&& !x_stretch_cursor_p)
@@ -4092,8 +4092,20 @@ ns_draw_stretch_glyph_string (struct glyph_string *s)
NSRectFill (NSMakeRect (x, s->y, background_width, s->height));
}
}
-}
+ /* Draw overlining, etc. on the stretch glyph (or the part of the
+ stretch glyph after the cursor). If the glyph has a box, then
+ decorations will be drawn after drawing the box in
+ ns_draw_glyph_string, in order to prevent them from being
+ overwritten by the box. */
+ if (s->face->box == FACE_NO_BOX)
+ {
+ fg_color = [NSColor colorWithUnsignedLong:
+ NS_FACE_FOREGROUND (s->face)];
+ ns_draw_text_decoration (s, s->face, fg_color,
+ s->background_width, s->x);
+ }
+}
static void
ns_draw_glyph_string_foreground (struct glyph_string *s)
@@ -4411,7 +4423,8 @@ ns_draw_glyph_string (struct glyph_string *s)
{
NSColor *fg_color;
- fg_color = [NSColor colorWithUnsignedLong:NS_FACE_FOREGROUND (s->face)];
+ fg_color = [NSColor colorWithUnsignedLong: NS_FACE_FOREGROUND (s->face)];
+
ns_draw_text_decoration (s, s->face, fg_color,
s->background_width, s->x);
}
@@ -5607,17 +5620,6 @@ ns_term_init (Lisp_Object display_name)
NSTRACE_MSG ("Versions");
- {
-#ifdef NS_IMPL_GNUSTEP
- Vwindow_system_version = build_string (gnustep_base_version);
-#else
- /* PSnextrelease (128, c); */
- char c[DBL_BUFSIZE_BOUND];
- int len = dtoastr (c, sizeof c, 0, 0, NSAppKitVersionNumber);
- Vwindow_system_version = make_unibyte_string (c, len);
-#endif
- }
-
delete_keyboard_wait_descriptor (0);
ns_app_name = [[NSProcessInfo processInfo] processName];
@@ -7917,17 +7919,24 @@ ns_create_font_panel_buttons (id target, SEL select, SEL cancel_action)
if (!emacsframe->output_data.ns)
return;
+
if (screen != nil)
{
- emacsframe->left_pos = NSMinX (r) - NS_PARENT_WINDOW_LEFT_POS (emacsframe);
- emacsframe->top_pos = NS_PARENT_WINDOW_TOP_POS (emacsframe) - NSMaxY (r);
+ emacsframe->left_pos = (NSMinX (r)
+ - NS_PARENT_WINDOW_LEFT_POS (emacsframe));
+ emacsframe->top_pos = (NS_PARENT_WINDOW_TOP_POS (emacsframe)
+ - NSMaxY (r));
- // FIXME: after event part below didExitFullScreen is not received
- // if (emacs_event)
- // {
- // emacs_event->kind = MOVE_FRAME_EVENT;
- // EV_TRAILER ((id)nil);
- // }
+ if (emacs_event)
+ {
+ struct input_event ie;
+ EVENT_INIT (ie);
+ ie.kind = MOVE_FRAME_EVENT;
+ XSETFRAME (ie.frame_or_window, emacsframe);
+ XSETINT (ie.x, emacsframe->left_pos);
+ XSETINT (ie.y, emacsframe->top_pos);
+ kbd_buffer_store_event (&ie);
+ }
}
}
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)
if (dpyinfo == 0)
error ("Cannot connect to display server %s", SDATA (name));
- XSETFASTINT (Vwindow_system_version, 11);
-
return dpyinfo;
}
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)
}
/* LIB_CHILD_HANDLER is a SIGCHLD handler that Emacs calls while doing
- its own SIGCHLD handling. On POSIXish systems, glib needs this to
+ its own SIGCHLD handling. On POSIXish systems lacking
+ pidfd_open+waitid or using Glib 2.73.1-, Glib needs this to
keep track of its own children. GNUstep is similar. */
static void dummy_handler (int sig) {}
@@ -8358,7 +8359,7 @@ DEFUN ("signal-names", Fsignal_names, Ssignal_names, 0, 0, 0,
#ifdef subprocesses
/* Arrange to catch SIGCHLD if this hasn't already been arranged.
- Invoke this after init_process_emacs, and after glib and/or GNUstep
+ Invoke this after init_process_emacs, and after Glib and/or GNUstep
futz with the SIGCHLD handler, but before Emacs forks any children.
This function's caller should block SIGCHLD. */
@@ -8423,26 +8424,35 @@ init_process_emacs (int sockfd)
if (!will_dump_with_unexec_p ())
{
#if defined HAVE_GLIB && !defined WINDOWSNT
- /* Tickle glib's child-handling code. Ask glib to install a
+ /* Tickle Glib's child-handling code. Ask Glib to install a
watch source for Emacs itself which will initialize glib's
private SIGCHLD handler, allowing catch_child_signal to copy
- it into lib_child_handler.
+ it into lib_child_handler. This is a hacky workaround to get
+ glib's g_unix_signal_handler into lib_child_handler.
- Unfortunately in glib commit 2e471acf, the behavior changed to
+ In Glib 2.37.5 (2013), commit 2e471acf changed Glib to
always install a signal handler when g_child_watch_source_new
- is called and not just the first time it's called. Glib also
- now resets signal handlers to SIG_DFL when it no longer has a
- watcher on that signal. This is a hackey work around to get
- glib's g_unix_signal_handler into lib_child_handler. */
+ is called and not just the first time it's called, and to
+ reset signal handlers to SIG_DFL when it no longer has a
+ watcher on that signal. Arrange for Emacs's signal handler
+ to be reinstalled even if this happens.
+
+ In Glib 2.73.2 (2022), commit f615eef4 changed Glib again,
+ to not install a signal handler if the system supports
+ pidfd_open and waitid (as in Linux kernel 5.3+). The hacky
+ workaround is not needed in this case. */
GSource *source = g_child_watch_source_new (getpid ());
catch_child_signal ();
g_source_unref (source);
- eassert (lib_child_handler != dummy_handler);
- signal_handler_t lib_child_handler_glib = lib_child_handler;
- catch_child_signal ();
- eassert (lib_child_handler == dummy_handler);
- lib_child_handler = lib_child_handler_glib;
+ if (lib_child_handler != dummy_handler)
+ {
+ /* The hacky workaround is needed on this platform. */
+ signal_handler_t lib_child_handler_glib = lib_child_handler;
+ catch_child_signal ();
+ eassert (lib_child_handler == dummy_handler);
+ lib_child_handler = lib_child_handler_glib;
+ }
#else
catch_child_signal ();
#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)
}
#endif /* F_GETOWN */
- setvbuf (tty_out->output, NULL, _IOFBF, BUFSIZ);
+ const size_t buffer_size = (tty_out->output_buffer_size
+ ? tty_out->output_buffer_size
+ : BUFSIZ);
+ setvbuf (tty_out->output, NULL, _IOFBF, buffer_size);
if (tty_out->terminal->set_terminal_modes_hook)
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/>. */
#ifndef SYSTHREAD_H
#define SYSTHREAD_H
-#include <stdbool.h>
-
#include <attribute.h>
#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). */)
return Qnil;
}
+DEFUN ("tty--set-output-buffer-size", Ftty__set_output_buffer_size,
+ Stty__set_output_buffer_size, 1, 2, 0, doc:
+ /* Set the output buffer size for a TTY.
+
+SIZE zero means use the system's default value. If SIZE is
+non-zero, this also avoids flushing the output stream.
+
+TTY may be a terminal object, a frame, or nil (meaning the selected
+frame's terminal).
+
+This function temporarily suspends and resumes the terminal
+device. */)
+ (Lisp_Object size, Lisp_Object tty)
+{
+ if (!TYPE_RANGED_FIXNUMP (size_t, size))
+ error ("Invalid output buffer size");
+ Fsuspend_tty (tty);
+ struct terminal *terminal = decode_tty_terminal (tty);
+ terminal->display_info.tty->output_buffer_size = XFIXNUM (size);
+ return Fresume_tty (tty);
+}
+
+DEFUN ("tty--output-buffer-size", Ftty__output_buffer_size,
+ Stty__output_buffer_size, 0, 1, 0, doc:
+ /* Return the output buffer size of TTY.
+
+TTY may be a terminal object, a frame, or nil (meaning the selected
+frame's terminal).
+
+A value of zero means TTY uses the system's default value. */)
+ (Lisp_Object tty)
+{
+ struct terminal *terminal = decode_tty_terminal (tty);
+ if (terminal)
+ return make_fixnum (terminal->display_info.tty->output_buffer_size);
+ error ("Not a tty terminal");
+}
+
/***********************************************************************
Mouse
@@ -4556,6 +4594,8 @@ trigger redisplay. */);
defsubr (&Stty_top_frame);
defsubr (&Ssuspend_tty);
defsubr (&Sresume_tty);
+ defsubr (&Stty__set_output_buffer_size);
+ defsubr (&Stty__output_buffer_size);
#ifdef HAVE_GPM
defsubr (&Sgpm_mouse_start);
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
FILE *output; /* The stream to be used for terminal output.
NULL if the terminal is suspended. */
+ /* Size of output buffer. A value of zero means use the default of
+ BUFIZE. If non-zero, also minimize writes to the tty by avoiding
+ calls to flush. */
+ size_t output_buffer_size;
+
FILE *termscript; /* If nonzero, send all terminal output
characters to this stream also. */
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)
return target;
}
+/* Return non-zero if FILE's filesystem supports symlinks. */
+bool
+symlinks_supported (const char *file)
+{
+ if (is_windows_9x () != TRUE
+ && get_volume_info (file, NULL)
+ && (volume_info.flags & FILE_SUPPORTS_REPARSE_POINTS) != 0)
+ return true;
+ return false;
+}
+
/* Posix ACL emulation. */
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 *);
extern int openat (int, const char *, int, int);
extern int fchmodat (int, char const *, mode_t, int);
extern int lchmod (char const *, mode_t);
+extern bool symlinks_supported (const char *);
+
/* Return total and free memory info. */
extern int w32_memory_info (unsigned long long *, unsigned long long *,
diff --git a/src/w32fns.c b/src/w32fns.c
index 28d13a68d45..5f652ae9e46 100644
--- a/src/w32fns.c
+++ b/src/w32fns.c
@@ -6699,8 +6699,6 @@ w32_display_info_for_name (Lisp_Object name)
if (dpyinfo == 0)
error ("Cannot connect to server %s", SDATA (name));
- XSETFASTINT (Vwindow_system_version, w32_major_version);
-
return dpyinfo;
}
@@ -6781,7 +6779,6 @@ DEFUN ("x-open-connection", Fx_open_connection, Sx_open_connection,
error ("Cannot connect to server %s", SDATA (display));
}
- XSETFASTINT (Vwindow_system_version, w32_major_version);
return Qnil;
}
@@ -10450,6 +10447,66 @@ w32_get_resource (const char *key, const char *name, LPDWORD lpdwtype)
return (NULL);
}
+#ifdef WINDOWSNT
+
+/***********************************************************************
+ Wallpaper
+ ***********************************************************************/
+
+typedef BOOL (WINAPI * SystemParametersInfoW_Proc) (UINT,UINT,PVOID,UINT);
+SystemParametersInfoW_Proc system_parameters_info_w_fn = NULL;
+
+DEFUN ("w32-set-wallpaper", Fw32_set_wallpaper, Sw32_set_wallpaper, 1, 1, 0,
+ doc: /* Set the desktop wallpaper image to IMAGE-FILE. */)
+ (Lisp_Object image_file)
+{
+ Lisp_Object encoded = ENCODE_FILE (Fexpand_file_name (image_file, Qnil));
+ char *fname = SSDATA (encoded);
+ BOOL result = false;
+ DWORD err = 0;
+
+ /* UNICOWS.DLL seems to have SystemParametersInfoW, but it doesn't
+ seem to be worth the hassle to support that on Windows 9X for the
+ benefit of this minor feature. Let them use on Windows 9X only
+ image file names that can be encoded by the system codepage. */
+ if (w32_unicode_filenames && system_parameters_info_w_fn)
+ {
+ wchar_t fname_w[MAX_PATH];
+
+ if (filename_to_utf16 (fname, fname_w) != 0)
+ err = ERROR_FILE_NOT_FOUND;
+ else
+ result = SystemParametersInfoW (SPI_SETDESKWALLPAPER, 0, fname_w,
+ SPIF_SENDCHANGE);
+ }
+ else
+ {
+ char fname_a[MAX_PATH];
+
+ if (filename_to_ansi (fname, fname_a) != 0)
+ err = ERROR_FILE_NOT_FOUND;
+ else
+ result = SystemParametersInfoA (SPI_SETDESKWALLPAPER, 0, fname_a,
+ SPIF_SENDCHANGE);
+ }
+ if (!result)
+ {
+ if (err == ERROR_FILE_NOT_FOUND)
+ error ("Wallpaper file %s does not exist or cannot be accessed", fname);
+ else
+ {
+ err = GetLastError ();
+ if (err)
+ error ("Could not set desktop wallpaper: %s", w32_strerror (err));
+ else
+ error ("Could not set desktop wallpaper (wrong image type?)");
+ }
+ }
+
+ return Qnil;
+}
+#endif
+
/***********************************************************************
Initialization
***********************************************************************/
@@ -10929,6 +10986,7 @@ keys when IME input is received. */);
defsubr (&Sx_file_dialog);
#ifdef WINDOWSNT
defsubr (&Ssystem_move_file_to_trash);
+ defsubr (&Sw32_set_wallpaper);
#endif
}
@@ -11182,6 +11240,10 @@ globals_of_w32fns (void)
get_proc_addr (user32_lib, "EnumDisplayMonitors");
get_title_bar_info_fn = (GetTitleBarInfo_Proc)
get_proc_addr (user32_lib, "GetTitleBarInfo");
+#ifndef CYGWIN
+ system_parameters_info_w_fn = (SystemParametersInfoW_Proc)
+ get_proc_addr (user32_lib, "SystemParametersInfoW");
+#endif
{
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)
|| EQ (type, Qbmp)
|| EQ (type, Qnative_image)))
{
- /* GDI+ can also display BMP, Exif, ICON, WMF, and EMF images.
+ /* GDI+ can also display Exif, ICON, WMF, and EMF images.
But we don't yet support these in image.c. */
return false;
}
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)
if (!file)
return NULL;
+ /* Do not follow symlinks, so that the caller could watch symlink
+ files. */
+ DWORD crflags = FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED;
+ if (symlinks_supported (parent_dir))
+ crflags |= FILE_FLAG_OPEN_REPARSE_POINT;
+
if (w32_unicode_filenames)
{
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)
processes from deleting files inside
parent_dir. */
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
- NULL, OPEN_EXISTING,
- FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED,
+ NULL, OPEN_EXISTING, crflags,
NULL);
}
else
@@ -400,8 +405,7 @@ add_watch (const char *parent_dir, const char *file, BOOL subdirs, DWORD flags)
hdir = CreateFileA (dir_a,
FILE_LIST_DIRECTORY,
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
- NULL, OPEN_EXISTING,
- FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED,
+ NULL, OPEN_EXISTING, crflags,
NULL);
}
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)
base_height = (wmshell->core.height - ew->core.height
+ (rounded_height - (char_height * ch)));
- /* This is kind of sleazy, but I can't see how else to tell it to
- make it mark the WM_SIZE_HINTS size as user specified.
- */
-/* ((WMShellWidget) wmshell)->wm.size_hints.flags |= USSize;*/
+ /* Ensure that Xt actually sets window manager hint flags specified
+ by the caller by making sure XtNminWidth (a relatively harmless
+ resource) always changes each time this function is invoked. */
+ ew->emacs_frame.size_switch = !ew->emacs_frame.size_switch;
XtVaSetValues (wmshell,
XtNbaseWidth, (XtArgVal) base_width,
XtNbaseHeight, (XtArgVal) base_height,
XtNwidthInc, (XtArgVal) (frame_resize_pixelwise ? 1 : cw),
XtNheightInc, (XtArgVal) (frame_resize_pixelwise ? 1 : ch),
- XtNminWidth, (XtArgVal) base_width,
- XtNminHeight, (XtArgVal) base_height,
+ XtNminWidth, (XtArgVal) (base_width
+ + ew->emacs_frame.size_switch),
+ XtNminHeight, (XtArgVal) (base_height
+ + ew->emacs_frame.size_switch),
NULL);
}
@@ -355,6 +357,8 @@ EmacsFrameInitialize (Widget request, Widget new,
exit (1);
}
+ ew->emacs_frame.size_switch = 1;
+
update_from_various_frame_slots (ew);
set_frame_size (ew);
}
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 {
Boolean visual_bell; /* flash instead of beep */
int bell_volume; /* how loud is beep */
+ int size_switch; /* hack to make setting size
+ hints work correctly */
/* private state */
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. */);
Vscroll_preserve_screen_position = Qnil;
DEFVAR_LISP ("window-point-insertion-type", Vwindow_point_insertion_type,
- doc: /* Type of marker to use for `window-point'. */);
+ doc: /* Insertion type of marker to use for `window-point'.
+See `marker-insertion-type' for the meaning of the possible values. */);
Vwindow_point_insertion_type = Qnil;
DEFSYM (Qwindow_point_insertion_type, "window-point-insertion-type");
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,
int top_x_before_string = it3.current_x;
/* Finally, advance the iterator until we hit the
first display element whose character position is
- CHARPOS, or until the first newline from the
- display string, which signals the end of the
- display line. */
+ at or beyond CHARPOS, or until the first newline
+ from the display string, which signals the end of
+ the display line. */
while (get_next_display_element (&it3))
{
if (!EQ (it3.object, string))
top_x_before_string = it3.current_x;
PRODUCE_GLYPHS (&it3);
- if (IT_CHARPOS (it3) == charpos
+ if ((it3.bidi_it.scan_dir == 1
+ && IT_CHARPOS (it3) >= charpos)
+ || (it3.bidi_it.scan_dir == -1
+ && IT_CHARPOS (it3) <= charpos)
|| ITERATOR_AT_END_OF_LINE_P (&it3))
break;
it3_moved = true;
@@ -6309,7 +6312,10 @@ handle_composition_prop (struct it *it)
pos_byte = IT_STRING_BYTEPOS (*it);
string = it->string;
s = SDATA (string) + pos_byte;
- it->c = STRING_CHAR (s);
+ if (STRING_MULTIBYTE (string))
+ it->c = STRING_CHAR (s);
+ else
+ it->c = *s;
}
else
{
@@ -7040,7 +7046,14 @@ pop_it (struct it *it)
|| (STRINGP (it->object)
&& IT_STRING_CHARPOS (*it) == it->bidi_it.charpos
&& IT_STRING_BYTEPOS (*it) == it->bidi_it.bytepos)
- || (CONSP (it->object) && it->method == GET_FROM_STRETCH));
+ || (CONSP (it->object) && it->method == GET_FROM_STRETCH)
+ /* We could be in the middle of handling a list or a
+ vector of several 'display' properties, in which
+ case we should only verify the above conditions when
+ we pop the iterator stack the last time, because
+ higher stack levels cannot "iterate out of the
+ display property". */
+ || it->sp > 0);
}
/* If we move the iterator over text covered by a display property
to a new buffer position, any info about previously seen overlays
@@ -10710,11 +10723,6 @@ move_it_vertically_backward (struct it *it, int dy)
while (nlines-- && IT_CHARPOS (*it) > pos_limit)
back_to_previous_visible_line_start (it);
- /* Move one line more back, for the (rare) situation where we have
- bidi-reordered continued lines, and we start from the top-most
- screen line, which is the last in logical order. */
- if (it->bidi_p && dy == 0)
- back_to_previous_visible_line_start (it);
/* Reseat the iterator here. When moving backward, we don't want
reseat to skip forward over invisible text, set up the iterator
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)
{
struct it it2;
void *it2data = NULL;
- ptrdiff_t start_charpos, i;
+ ptrdiff_t start_charpos, orig_charpos, i;
int nchars_per_row
= (it->last_visible_x - it->first_visible_x) / FRAME_COLUMN_WIDTH (it->f);
bool hit_pos_limit = false;
@@ -10966,7 +10974,7 @@ move_it_by_lines (struct it *it, ptrdiff_t dvpos)
position. This may actually move vertically backwards,
in case of overlays, so adjust dvpos accordingly. */
dvpos += it->vpos;
- start_charpos = IT_CHARPOS (*it);
+ orig_charpos = IT_CHARPOS (*it);
move_it_vertically_backward (it, 0);
dvpos -= it->vpos;
@@ -11019,8 +11027,9 @@ move_it_by_lines (struct it *it, ptrdiff_t dvpos)
RESTORE_IT (&it2, &it2, it2data);
SAVE_IT (it2, *it, it2data);
move_it_to (it, -1, -1, -1, it->vpos + delta, MOVE_TO_VPOS);
- /* Move back again if we got too far ahead. */
- if (it->vpos - it2.vpos > delta)
+ /* Move back again if we got too far ahead,
+ or didn't move at all. */
+ if (it->vpos - it2.vpos > delta || IT_CHARPOS (*it) == orig_charpos)
RESTORE_IT (it, &it2, it2data);
else
bidi_unshelve_cache (it2data, true);
@@ -31773,9 +31782,9 @@ gui_produce_glyphs (struct it *it)
/* When no suitable font is found, display this character by
the method specified in the first extra slot of
Vglyphless_char_display. */
- Lisp_Object acronym = lookup_glyphless_char_display (-1, it);
+ Lisp_Object acronym = lookup_glyphless_char_display (-1, it);
- eassert (it->what == IT_GLYPHLESS);
+ eassert (it->what == IT_GLYPHLESS);
produce_glyphless_glyph (it, true,
STRINGP (acronym) ? acronym : Qnil);
goto done;
@@ -37109,16 +37118,20 @@ Each element, if non-nil, should be one of the following:
`empty-box': display as an empty box
`thin-space': display as 1-pixel width space
`zero-width': don't display
+Any other value is interpreted as `empty-box'.
An element may also be a cons cell (GRAPHICAL . TEXT), which specifies the
display method for graphical terminals and text terminals respectively.
GRAPHICAL and TEXT should each have one of the values listed above.
-The char-table has one extra slot to control the display of a character for
-which no font is found. This slot only takes effect on graphical terminals.
-Its value should be an ASCII acronym string, `hex-code', `empty-box', or
-`thin-space'. It could also be a cons cell of any two of these, to specify
-separate values for graphical and text terminals.
-The default is `empty-box'.
+The char-table has one extra slot to control the display of characters
+for which no font is found on graphical terminals, and characters that
+cannot be displayed by text-mode terminals. Its value should be an
+ASCII acronym string, `hex-code', `empty-box', or `thin-space'. It
+could also be a cons cell of any two of these, to specify separate
+values for graphical and text terminals. The default is `empty-box'.
+
+With the obvious exception of `zero-width', all the other representations
+are displayed using the face `glyphless-char'.
If a character has a non-nil entry in an active display table, the
display table takes effect; in this case, Emacs does not consult
diff --git a/src/xfaces.c b/src/xfaces.c
index 70d5cbeb4c7..5e3a47d7f8b 100644
--- a/src/xfaces.c
+++ b/src/xfaces.c
@@ -3052,6 +3052,15 @@ The value is TO. */)
}
+#define HANDLE_INVALID_NIL_VALUE(A,F) \
+ if (NILP (value)) \
+ { \
+ add_to_log ("Warning: setting attribute `%s' of face `%s': nil " \
+ "value is invalid, use `unspecified' instead.", A, F); \
+ /* Compatibility with 20.x. */ \
+ value = Qunspecified; \
+ }
+
DEFUN ("internal-set-lisp-face-attribute", Finternal_set_lisp_face_attribute,
Sinternal_set_lisp_face_attribute, 3, 4, 0,
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
}
else if (EQ (attr, QCforeground))
{
- /* Compatibility with 20.x. */
- if (NILP (value))
- value = Qunspecified;
+ HANDLE_INVALID_NIL_VALUE (QCforeground, face);
if (!UNSPECIFIEDP (value)
&& !IGNORE_DEFFACE_P (value)
&& !RESET_P (value))
@@ -3409,9 +3416,7 @@ FRAME 0 means change the face on all frames, and change the default
}
else if (EQ (attr, QCdistant_foreground))
{
- /* Compatibility with 20.x. */
- if (NILP (value))
- value = Qunspecified;
+ HANDLE_INVALID_NIL_VALUE (QCdistant_foreground, face);
if (!UNSPECIFIEDP (value)
&& !IGNORE_DEFFACE_P (value)
&& !RESET_P (value))
@@ -3428,9 +3433,7 @@ FRAME 0 means change the face on all frames, and change the default
}
else if (EQ (attr, QCbackground))
{
- /* Compatibility with 20.x. */
- if (NILP (value))
- value = Qunspecified;
+ HANDLE_INVALID_NIL_VALUE (QCbackground, face);
if (!UNSPECIFIEDP (value)
&& !IGNORE_DEFFACE_P (value)
&& !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,
{
#if defined HAVE_XSYNC && !defined USE_GTK && defined HAVE_CLOCK_GETTIME
struct x_display_info *dpyinfo;
+ unsigned long bypass_compositor;
dpyinfo = FRAME_DISPLAY_INFO (f);
if (!NILP (arg) && FRAME_X_EXTENDED_COUNTER (f))
- FRAME_X_OUTPUT (f)->use_vsync_p
- = x_wm_supports (f, dpyinfo->Xatom_net_wm_frame_drawn);
+ {
+ FRAME_X_OUTPUT (f)->use_vsync_p
+ = x_wm_supports (f, dpyinfo->Xatom_net_wm_frame_drawn);
+
+ /* At the same time, write the bypass compositor property to the
+ outer window. 2 means to never bypass the compositor, as we
+ need its cooperation for frame synchronization. */
+ bypass_compositor = 2;
+ XChangeProperty (dpyinfo->display, FRAME_OUTER_WINDOW (f),
+ dpyinfo->Xatom_net_wm_bypass_compositor,
+ XA_CARDINAL, 32, PropModeReplace,
+ (unsigned char *) &bypass_compositor, 1);
+ }
else
- FRAME_X_OUTPUT (f)->use_vsync_p = false;
+ {
+ FRAME_X_OUTPUT (f)->use_vsync_p = false;
+
+ /* Remove the compositor bypass property from the outer
+ window. */
+ XDeleteProperty (dpyinfo->display, FRAME_OUTER_WINDOW (f),
+ dpyinfo->Xatom_net_wm_bypass_compositor);
+ }
store_frame_param (f, Quse_frame_synchronization,
FRAME_X_OUTPUT (f)->use_vsync_p ? Qt : Qnil);
@@ -3335,22 +3354,30 @@ struct x_xim_text_conversion_data
{
struct coding_system *coding;
char *source;
+ struct x_display_info *dpyinfo;
};
static Lisp_Object
-x_xim_text_to_utf8_unix_1 (ptrdiff_t nargs,
- Lisp_Object *args)
+x_xim_text_to_utf8_unix_1 (ptrdiff_t nargs, Lisp_Object *args)
{
struct x_xim_text_conversion_data *data;
ptrdiff_t nbytes;
+ Lisp_Object coding_system;
data = xmint_pointer (args[0]);
+
+ if (SYMBOLP (Vx_input_coding_system))
+ coding_system = Vx_input_coding_system;
+ else if (!NILP (data->dpyinfo->xim_coding))
+ coding_system = data->dpyinfo->xim_coding;
+ else
+ coding_system = Vlocale_coding_system;
+
nbytes = strlen (data->source);
data->coding->destination = NULL;
- setup_coding_system (Vlocale_coding_system,
- data->coding);
+ setup_coding_system (coding_system, data->coding);
data->coding->mode |= (CODING_MODE_LAST_BLOCK
| CODING_MODE_SAFE_ENCODING);
data->coding->source = (const unsigned char *) data->source;
@@ -3363,8 +3390,7 @@ x_xim_text_to_utf8_unix_1 (ptrdiff_t nargs,
}
static Lisp_Object
-x_xim_text_to_utf8_unix_2 (Lisp_Object val,
- ptrdiff_t nargs,
+x_xim_text_to_utf8_unix_2 (Lisp_Object val, ptrdiff_t nargs,
Lisp_Object *args)
{
struct x_xim_text_conversion_data *data;
@@ -3381,7 +3407,8 @@ x_xim_text_to_utf8_unix_2 (Lisp_Object val,
/* The string returned is not null-terminated. */
static char *
-x_xim_text_to_utf8_unix (XIMText *text, ptrdiff_t *length)
+x_xim_text_to_utf8_unix (struct x_display_info *dpyinfo,
+ XIMText *text, ptrdiff_t *length)
{
unsigned char *wchar_buf;
ptrdiff_t wchar_actual_length, i;
@@ -3405,6 +3432,7 @@ x_xim_text_to_utf8_unix (XIMText *text, ptrdiff_t *length)
data.coding = &coding;
data.source = text->string.multi_byte;
+ data.dpyinfo = dpyinfo;
was_waiting_for_input_p = waiting_for_input;
/* Otherwise Fsignal will crash. */
@@ -3422,18 +3450,21 @@ static void
xic_preedit_draw_callback (XIC xic, XPointer client_data,
XIMPreeditDrawCallbackStruct *call_data)
{
- struct frame *f = x_xic_to_frame (xic);
+ struct frame *f;
struct x_output *output;
- ptrdiff_t text_length = 0;
+ ptrdiff_t text_length;
ptrdiff_t charpos;
ptrdiff_t original_size;
char *text;
char *chg_start, *chg_end;
struct input_event ie;
+
+ f = x_xic_to_frame (xic);
EVENT_INIT (ie);
if (f)
{
+ text_length = 0;
output = FRAME_X_OUTPUT (f);
if (!output->preedit_active)
@@ -3441,7 +3472,8 @@ xic_preedit_draw_callback (XIC xic, XPointer client_data,
if (call_data->text)
{
- text = x_xim_text_to_utf8_unix (call_data->text, &text_length);
+ text = x_xim_text_to_utf8_unix (FRAME_DISPLAY_INFO (f),
+ call_data->text, &text_length);
if (!text)
/* Decoding the IM text failed. */
@@ -3955,10 +3987,6 @@ x_window (struct frame *f, long window_prompting)
XtManageChild (pane_widget);
XtRealizeWidget (shell_widget);
- if (FRAME_X_EMBEDDED_P (f))
- XReparentWindow (FRAME_X_DISPLAY (f), XtWindow (shell_widget),
- f->output_data.x->parent_desc, 0, 0);
-
FRAME_X_WINDOW (f) = XtWindow (frame_widget);
initial_set_up_x_back_buffer (f);
validate_x_resource_name ();
@@ -4132,7 +4160,7 @@ x_window (struct frame *f)
block_input ();
FRAME_X_WINDOW (f)
= XCreateWindow (FRAME_X_DISPLAY (f),
- f->output_data.x->parent_desc,
+ FRAME_DISPLAY_INFO (f)->root_window,
f->left_pos,
f->top_pos,
FRAME_PIXEL_WIDTH (f), FRAME_PIXEL_HEIGHT (f),
@@ -4958,6 +4986,12 @@ This function is an internal primitive--use `make-frame' instead. */)
x_window (f);
#endif
+#ifndef USE_GTK
+ if (FRAME_X_EMBEDDED_P (f)
+ && !x_embed_frame (dpyinfo, f))
+ error ("The frame could not be embedded; does the embedder exist?");
+#endif
+
x_icon (f, parms);
x_make_gc (f);
@@ -5519,15 +5553,15 @@ On MS Windows, this returns nothing useful. */)
switch (DoesBackingStore (dpyinfo->screen))
{
case Always:
- result = intern ("always");
+ result = Qalways;
break;
case WhenMapped:
- result = intern ("when-mapped");
+ result = Qwhen_mapped;
break;
case NotUseful:
- result = intern ("not-useful");
+ result = Qnot_useful;
break;
default:
@@ -5556,22 +5590,22 @@ If omitted or nil, that stands for the selected frame's display.
switch (dpyinfo->visual_info.class)
{
case StaticGray:
- result = intern ("static-gray");
+ result = Qstatic_gray;
break;
case GrayScale:
- result = intern ("gray-scale");
+ result = Qgray_scale;
break;
case StaticColor:
- result = intern ("static-color");
+ result = Qstatic_color;
break;
case PseudoColor:
- result = intern ("pseudo-color");
+ result = Qpseudo_color;
break;
case TrueColor:
- result = intern ("true-color");
+ result = Qtrue_color;
break;
case DirectColor:
- result = intern ("direct-color");
+ result = Qdirect_color;
break;
default:
error ("Display has an unknown visual class");
@@ -6223,8 +6257,8 @@ In addition to the standard attribute keys listed in
the attributes:
source -- String describing the source from which multi-monitor
- information is obtained, one of \"Gdk\", \"XRandr\",
- \"Xinerama\", or \"fallback\"
+ information is obtained, one of \"Gdk\", \"XRandR 1.5\",
+ \"XRandr\", \"Xinerama\", or \"fallback\"
Internal use only, use `display-monitor-attributes-list' instead. */)
(Lisp_Object terminal)
@@ -7229,8 +7263,6 @@ x_display_info_for_name (Lisp_Object name)
if (dpyinfo == 0)
error ("Cannot connect to X server %s", SDATA (name));
- XSETFASTINT (Vwindow_system_version, 11);
-
return dpyinfo;
}
@@ -7274,7 +7306,6 @@ An insecure way to solve the problem may be to use `xhost'.\n",
error ("Cannot connect to X server %s", SDATA (display));
}
- XSETFASTINT (Vwindow_system_version, 11);
return Qnil;
}
@@ -7693,17 +7724,40 @@ DEFUN ("x-window-property", Fx_window_property, Sx_window_property,
doc: /* Value is the value of window property PROP on FRAME.
If FRAME is nil or omitted, use the selected frame.
-On X Windows, the following optional arguments are also accepted:
-If TYPE is nil or omitted, get the property as a string.
- Otherwise TYPE is the name of the atom that denotes the expected type.
+On X Windows, the following optional arguments are also accepted: If
+TYPE is nil or omitted, get the property as a string. Otherwise TYPE
+is the name of the atom that denotes the expected type.
+
+If TYPE is the string "AnyPropertyType", decode and return the data
+regardless of what the type really is.
+
+The format of the data returned is the same as a selection conversion
+to the given type. For example, if `x-get-selection-internal' returns
+an integer when the selection data is a given type,
+`x-window-property' will do the same for that type.
+
If WINDOW-ID is non-nil, get the property of that window instead of
- FRAME's X window; the number 0 denotes the root window. This argument
- is separate from FRAME because window IDs are not unique across X
- displays or screens on the same display, so FRAME provides context
- for the window ID.
+FRAME's X window; the number 0 denotes the root window. This argument
+is separate from FRAME because window IDs are not unique across X
+displays, so FRAME provides context for the window ID.
+
If DELETE-P is non-nil, delete the property after retrieving it.
If VECTOR-RET-P is non-nil, return a vector of values instead of a string.
+X allows an arbitrary number of properties to be set on any window.
+However, properties are most often set by the window manager or other
+programs on the root window or FRAME's X window in order to
+communicate information to Emacs and other programs. Most of these
+properties are specified as part of the Extended Window Manager Hints
+and the Inter-Client Communication Conventions Manual, which are
+located here:
+
+ https://specifications.freedesktop.org/wm-spec/wm-spec-latest.html
+
+and
+
+ https://x.org/releases/X11R7.6/doc/xorg-docs/specs/ICCCM/icccm.html
+
Return value is nil if FRAME doesn't have a property with name PROP or
if PROP has no value of TYPE (always a string in the MS Windows case). */)
(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)
disptype = Qmono;
else if (FRAME_X_VISUAL_INFO (f)->class == GrayScale
|| FRAME_X_VISUAL_INFO (f)->class == StaticGray)
- disptype = intern ("grayscale");
+ disptype = Qgrayscale;
else
- disptype = intern ("color");
+ disptype = Qcolor;
if (NILP (Fframe_parameter (frame, Qdisplay_type)))
{
@@ -8955,8 +9009,8 @@ Text larger than the specified size is clipped. */)
start_timer:
/* Let the tip disappear after timeout seconds. */
- tip_timer = call3 (intern ("run-at-time"), timeout, Qnil,
- intern ("x-hide-tip"));
+ tip_timer = call3 (Qrun_at_time, timeout, Qnil,
+ Qx_hide_tip);
return unbind_to (count, Qnil);
}
@@ -10054,6 +10108,23 @@ eliminated in future versions of Emacs. */);
/* Tell Emacs about this window system. */
Fprovide (Qx, Qnil);
+ /* Used by Fx_show_tip. */
+ DEFSYM (Qrun_at_time, "run-at-time");
+ DEFSYM (Qx_hide_tip, "x-hide-tip");
+
+ /* Used by display class and backing store reporting functions. */
+ DEFSYM (Qalways, "always");
+ DEFSYM (Qwhen_mapped, "when-mapped");
+ DEFSYM (Qnot_useful, "not-useful");
+ DEFSYM (Qstatic_gray, "static-gray");
+ DEFSYM (Qgray_scale, "gray-scale");
+ DEFSYM (Qstatic_color, "static-color");
+ DEFSYM (Qpseudo_color, "pseudo-color");
+ DEFSYM (Qtrue_color, "true-color");
+ DEFSYM (Qdirect_color, "direct-color");
+ DEFSYM (Qgrayscale, "grayscale");
+ DEFSYM (Qcolor, "color");
+
#ifdef HAVE_XINPUT2
DEFSYM (Qxinput2, "xinput2");
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,
/* Two special cases to avoid opening rather big fonts. */
if (EQ (AREF (props, 2), Qja))
- return list2 (intern ("kana"), intern ("han"));
+ return list2 (Qkana, Qhan);
if (EQ (AREF (props, 2), Qko))
- return list1 (intern ("hangul"));
+ return list1 (Qhangul);
scripts = Fgethash (props, xfont_scripts_cache, Qt);
if (EQ (scripts, Qt))
{
@@ -1130,19 +1130,19 @@ static void syms_of_xfont_for_pdumper (void);
struct font_driver const xfont_driver =
{
- .type = LISPSYM_INITIALLY (Qx),
- .get_cache = xfont_get_cache,
- .list = xfont_list,
- .match = xfont_match,
- .list_family = xfont_list_family,
- .open_font = xfont_open,
- .close_font = xfont_close,
- .prepare_face = xfont_prepare_face,
- .has_char = xfont_has_char,
- .encode_char = xfont_encode_char,
- .text_extents = xfont_text_extents,
- .draw = xfont_draw,
- .check = xfont_check,
+ .type = LISPSYM_INITIALLY (Qx),
+ .get_cache = xfont_get_cache,
+ .list = xfont_list,
+ .match = xfont_match,
+ .list_family = xfont_list_family,
+ .open_font = xfont_open,
+ .close_font = xfont_close,
+ .prepare_face = xfont_prepare_face,
+ .has_char = xfont_has_char,
+ .encode_char = xfont_encode_char,
+ .text_extents = xfont_text_extents,
+ .draw = xfont_draw,
+ .check = xfont_check,
};
void
@@ -1153,6 +1153,10 @@ syms_of_xfont (void)
staticpro (&xfont_scratch_props);
xfont_scratch_props = make_nil_vector (8);
pdumper_do_now_and_after_load (syms_of_xfont_for_pdumper);
+
+ DEFSYM (Qkana, "kana");
+ DEFSYM (Qhan, "han");
+ DEFSYM (Qhangul, "hangul");
}
static void
diff --git a/src/xrdb.c b/src/xrdb.c
index faeea04a539..01c9ff5558a 100644
--- a/src/xrdb.c
+++ b/src/xrdb.c
@@ -511,107 +511,3 @@ x_get_string_resource (void *v_rdb, const char *name, const char *class)
return NULL;
}
-
-/* Stand-alone test facilities. */
-
-#ifdef TESTRM
-
-typedef char **List;
-#define arg_listify(len, list) (list)
-#define car(list) (*(list))
-#define cdr(list) (list + 1)
-#define NIL(list) (! *(list))
-#define free_arglist(list)
-
-static List
-member (char *elt, List list)
-{
- List p;
-
- for (p = list; ! NIL (p); p = cdr (p))
- if (! strcmp (elt, car (p)))
- return p;
-
- return p;
-}
-
-static void
-fatal (char *msg, char *prog)
-{
- fprintf (stderr, msg, prog);
- exit (1);
-}
-
-int
-main (int argc, char **argv)
-{
- Display *display;
- char *displayname, *resource_string, *class, *name;
- XrmDatabase xdb;
- List arg_list, lp;
-
- arg_list = arg_listify (argc, argv);
-
- lp = member ("-d", arg_list);
- if (!NIL (lp))
- displayname = car (cdr (lp));
- else
- displayname = "localhost:0.0";
-
- lp = member ("-xrm", arg_list);
- resource_string = NIL (lp) ? 0 : car (cdr (lp));
-
- lp = member ("-c", arg_list);
- if (! NIL (lp))
- class = car (cdr (lp));
- else
- class = "Emacs";
-
- lp = member ("-n", arg_list);
- if (! NIL (lp))
- name = car (cdr (lp));
- else
- name = "emacs";
-
- free_arglist (arg_list);
-
- if (!(display = XOpenDisplay (displayname)))
- fatal ("Can't open display '%s'\n", XDisplayName (displayname));
-
- xdb = x_load_resources (display, resource_string, name, class);
-
- /* In a real program, you'd want to also do this: */
- display->db = xdb;
-
- while (true)
- {
- char query_name[90];
- char query_class[90];
-
- printf ("Name: ");
- gets (query_name);
-
- if (strlen (query_name))
- {
- char *value;
-
- printf ("Class: ");
- gets (query_class);
-
- value = x_get_string_resource (&xdb, query_name, query_class);
-
- if (value != NULL)
- printf ("\t%s(%s): %s\n\n", query_name, query_class, value);
- else
- printf ("\tNo Value.\n\n");
- }
- else
- break;
- }
- printf ("\tExit.\n\n");
-
- XCloseDisplay (display);
-
- return 0;
-}
-#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,
unsigned char **data_ret,
ptrdiff_t *size_bytes_ret,
Atom *type_ret, int *format_ret,
- unsigned long *size_ret)
+ unsigned long *size_ret,
+ ptrdiff_t *real_bytes_ret)
{
ptrdiff_t offset = 0;
struct prop_location *wait_object;
@@ -1622,7 +1623,8 @@ receive_incremental_selection (struct x_display_info *dpyinfo,
if (tmp_size_bytes == 0) /* we're done */
{
- TRACE0 ("Done reading incrementally");
+ TRACE1 ("Done reading incrementally; total bytes: %"pD"d",
+ *size_bytes_ret);
if (! waiting_for_other_props_on_window (display, window))
XSelectInput (display, window, STANDARD_EVENT_SET);
@@ -1652,6 +1654,19 @@ receive_incremental_selection (struct x_display_info *dpyinfo,
memcpy ((*data_ret) + offset, tmp_data, tmp_size_bytes);
offset += tmp_size_bytes;
+ /* *size_bytes_ret is not really the size of the data inside the
+ buffer; it is the size of the buffer allocated by xpalloc.
+
+ This matters when the cardinal specified in the INCR property
+ (a _lower bound_ on the size of the selection data) is
+ smaller than the actual selection contents, which can happen
+ when programs are streaming selection data from a file
+ descriptor. In that case, we used to return junk if xpalloc
+ decided to grow the buffer by more than the provided
+ increment; to avoid that, store the actual size of the
+ selection data in *real_bytes_ret. */
+ *real_bytes_ret += tmp_size_bytes;
+
/* Use xfree, not XFree, because x_get_window_property
calls xmalloc itself. */
xfree (tmp_data);
@@ -1674,10 +1689,14 @@ x_get_window_property_as_lisp_data (struct x_display_info *dpyinfo,
int actual_format;
unsigned long actual_size;
unsigned char *data = 0;
- ptrdiff_t bytes = 0;
+ ptrdiff_t bytes = 0, array_bytes;
Lisp_Object val;
Display *display = dpyinfo->display;
+ /* array_bytes is only used as an argument to xpalloc. The actual
+ size of the data inside the buffer is inside bytes. */
+ array_bytes = 0;
+
TRACE0 ("Reading selection data");
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,
calls xmalloc itself. */
xfree (data);
unblock_input ();
+
+ /* Clear bytes again. Previously, receive_incremental_selection
+ would set this to min_size_bytes, but that is now done to
+ array_bytes instead. */
+ bytes = 0;
receive_incremental_selection (dpyinfo, window, property, target_type,
- min_size_bytes, &data, &bytes,
+ min_size_bytes, &data, &array_bytes,
&actual_type, &actual_format,
- &actual_size);
+ &actual_size, &bytes);
}
if (!for_multiple)
@@ -1993,7 +2017,17 @@ lisp_data_to_selection_data (struct x_display_info *dpyinfo,
ptrdiff_t i;
ptrdiff_t size = ASIZE (obj);
- if (SYMBOLP (AREF (obj, 0)))
+ if (!size)
+ {
+ /* This vector is empty and of unknown type. Assume that it
+ is a vector of integers. */
+
+ cs->data = NULL;
+ cs->format = 32;
+ cs->size = 0;
+ type = QINTEGER;
+ }
+ else if (SYMBOLP (AREF (obj, 0)))
/* This vector is an ATOM set */
{
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)
DEFUN ("font-get-system-normal-font", Ffont_get_system_normal_font,
Sfont_get_system_normal_font,
0, 0, 0,
- doc: /* Get the system default application font. */)
+ doc: /* Get the system default application font.
+The font is returned as either a font-spec or font name. */)
(void)
{
return current_font ? build_string (current_font) : Qnil;
@@ -1233,7 +1234,8 @@ DEFUN ("font-get-system-normal-font", Ffont_get_system_normal_font,
DEFUN ("font-get-system-font", Ffont_get_system_font, Sfont_get_system_font,
0, 0, 0,
- doc: /* Get the system default fixed width font. */)
+ doc: /* Get the system default fixed width font.
+The font is returned as either a font-spec or font name. */)
(void)
{
return current_mono_font ? build_string (current_mono_font) : Qnil;
@@ -1282,6 +1284,10 @@ syms_of_xsettings (void)
DEFSYM (Qmonospace_font_name, "monospace-font-name");
DEFSYM (Qfont_name, "font-name");
DEFSYM (Qfont_render, "font-render");
+ DEFSYM (Qdynamic_setting, "dynamic-setting");
+ DEFSYM (Qfont_render_setting, "font-render-setting");
+ DEFSYM (Qsystem_font_setting, "system-font-setting");
+
defsubr (&Sfont_get_system_font);
defsubr (&Sfont_get_system_normal_font);
@@ -1297,9 +1303,9 @@ If this variable is nil, Emacs ignores system font changes. */);
Vxft_settings = empty_unibyte_string;
#if defined USE_CAIRO || defined HAVE_XFT
- Fprovide (intern_c_string ("font-render-setting"), Qnil);
+ Fprovide (Qfont_render_setting, Qnil);
#if defined (HAVE_GCONF) || defined (HAVE_GSETTINGS)
- Fprovide (intern_c_string ("system-font-setting"), Qnil);
+ Fprovide (Qsystem_font_setting, Qnil);
#endif
#endif
@@ -1307,5 +1313,5 @@ If this variable is nil, Emacs ignores system font changes. */);
DEFSYM (Qtool_bar_style, "tool-bar-style");
defsubr (&Stool_bar_get_system_style);
- Fprovide (intern_c_string ("dynamic-setting"), Qnil);
+ Fprovide (Qdynamic_setting, Qnil);
}
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. */)
this at the wrong time. */
if (doing_interact && ! kill_emacs)
{
- bool cancel_shutdown = ! NILP (call0 (intern ("emacs-session-save")));
+ bool cancel_shutdown = ! NILP (call0 (Qemacs_session_save));
SmcInteractDone (smc_conn, cancel_shutdown);
SmcSaveYourselfDone (smc_conn, True);
@@ -542,6 +542,8 @@ Do not call this function yourself. */)
void
syms_of_xsmfns (void)
{
+ DEFSYM (Qemacs_session_save, "emacs-session-save");
+
DEFVAR_LISP ("x-session-id", Vx_session_id,
doc: /* The session id Emacs got from the session manager for this session.
Changing the value does not change the session id used by Emacs.
diff --git a/src/xterm.c b/src/xterm.c
index 7a0a21b1369..f3bfae457ba 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -970,8 +970,8 @@ static const struct x_atom_ref x_atom_refs[] =
/* Ghostscript support. */
ATOM_REFS_INIT ("DONE", Xatom_DONE)
ATOM_REFS_INIT ("PAGE", Xatom_PAGE)
- ATOM_REFS_INIT ("SCROLLBAR", Xatom_Scrollbar)
- ATOM_REFS_INIT ("HORIZONTAL_SCROLLBAR", Xatom_Horizontal_Scrollbar)
+ ATOM_REFS_INIT ("_EMACS_SCROLLBAR", Xatom_Scrollbar)
+ ATOM_REFS_INIT ("_EMACS_HORIZONTAL_SCROLLBAR", Xatom_Horizontal_Scrollbar)
ATOM_REFS_INIT ("_XEMBED", Xatom_XEMBED)
/* EWMH */
ATOM_REFS_INIT ("_NET_WM_STATE", Xatom_net_wm_state)
@@ -998,6 +998,7 @@ static const struct x_atom_ref x_atom_refs[] =
ATOM_REFS_INIT ("_NET_WM_SYNC_REQUEST", Xatom_net_wm_sync_request)
ATOM_REFS_INIT ("_NET_WM_SYNC_REQUEST_COUNTER", Xatom_net_wm_sync_request_counter)
ATOM_REFS_INIT ("_NET_WM_SYNC_FENCES", Xatom_net_wm_sync_fences)
+ ATOM_REFS_INIT ("_NET_WM_BYPASS_COMPOSITOR", Xatom_net_wm_bypass_compositor)
ATOM_REFS_INIT ("_NET_WM_FRAME_DRAWN", Xatom_net_wm_frame_drawn)
ATOM_REFS_INIT ("_NET_WM_FRAME_TIMINGS", Xatom_net_wm_frame_timings)
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 *);
#ifndef USE_TOOLKIT_SCROLL_BARS
static void x_scroll_bar_redraw (struct scroll_bar *);
#endif
+static void x_translate_coordinates (struct frame *, int, int, int *, int *);
/* Global state maintained during a drag-and-drop operation. */
@@ -1970,6 +1972,10 @@ xm_get_drag_window_1 (struct x_display_info *dpyinfo)
&& tmp_data)
{
drag_window = *(Window *) tmp_data;
+
+ /* This has the side effect of selecting for
+ StructureNotifyMask, meaning that we will get notifications
+ once it is deleted. */
rc = x_special_window_exists_p (dpyinfo, drag_window);
if (!rc)
@@ -3977,12 +3983,10 @@ x_dnd_do_unsupported_drop (struct x_display_info *dpyinfo,
x_ignore_errors_for_next_request (dpyinfo);
XSendEvent (dpyinfo->display, child,
True, ButtonPressMask, &event);
- x_stop_ignoring_errors (dpyinfo);
event.xbutton.type = ButtonRelease;
event.xbutton.time = before + 2;
- x_ignore_errors_for_next_request (dpyinfo);
XSendEvent (dpyinfo->display, child,
True, ButtonReleaseMask, &event);
x_stop_ignoring_errors (dpyinfo);
@@ -4456,7 +4460,8 @@ x_dnd_get_window_proto (struct x_display_info *dpyinfo, Window wdesc)
}
static void
-x_dnd_send_enter (struct frame *f, Window target, int supported)
+x_dnd_send_enter (struct frame *f, Window target, Window toplevel,
+ int supported)
{
struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f);
int i;
@@ -4465,7 +4470,7 @@ x_dnd_send_enter (struct frame *f, Window target, int supported)
msg.xclient.type = ClientMessage;
msg.xclient.message_type = dpyinfo->Xatom_XdndEnter;
msg.xclient.format = 32;
- msg.xclient.window = target;
+ msg.xclient.window = toplevel;
msg.xclient.data.l[0] = FRAME_X_WINDOW (f);
msg.xclient.data.l[1] = (((unsigned int) min (X_DND_SUPPORTED_VERSION,
supported) << 24)
@@ -4493,10 +4498,10 @@ x_dnd_send_enter (struct frame *f, Window target, int supported)
}
static void
-x_dnd_send_position (struct frame *f, Window target, int supported,
- unsigned short root_x, unsigned short root_y,
- Time timestamp, Atom action, int button,
- unsigned state)
+x_dnd_send_position (struct frame *f, Window target, Window toplevel,
+ int supported, unsigned short root_x,
+ unsigned short root_y, Time timestamp, Atom action,
+ int button, unsigned state)
{
struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f);
XEvent msg;
@@ -4504,7 +4509,7 @@ x_dnd_send_position (struct frame *f, Window target, int supported,
msg.xclient.type = ClientMessage;
msg.xclient.message_type = dpyinfo->Xatom_XdndPosition;
msg.xclient.format = 32;
- msg.xclient.window = target;
+ msg.xclient.window = toplevel;
msg.xclient.data.l[0] = FRAME_X_WINDOW (f);
msg.xclient.data.l[1] = 0;
@@ -4568,7 +4573,7 @@ x_dnd_send_position (struct frame *f, Window target, int supported,
}
static void
-x_dnd_send_leave (struct frame *f, Window target)
+x_dnd_send_leave (struct frame *f, Window target, Window toplevel)
{
struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f);
XEvent msg;
@@ -4576,7 +4581,7 @@ x_dnd_send_leave (struct frame *f, Window target)
msg.xclient.type = ClientMessage;
msg.xclient.message_type = dpyinfo->Xatom_XdndLeave;
msg.xclient.format = 32;
- msg.xclient.window = target;
+ msg.xclient.window = toplevel;
msg.xclient.data.l[0] = FRAME_X_WINDOW (f);
msg.xclient.data.l[1] = 0;
msg.xclient.data.l[2] = 0;
@@ -4592,15 +4597,15 @@ x_dnd_send_leave (struct frame *f, Window target)
}
static bool
-x_dnd_send_drop (struct frame *f, Window target, Time timestamp,
- int supported)
+x_dnd_send_drop (struct frame *f, Window target, Window toplevel,
+ Time timestamp, int supported)
{
struct x_display_info *dpyinfo;
XEvent msg;
if (x_dnd_action == None)
{
- x_dnd_send_leave (f, target);
+ x_dnd_send_leave (f, target, toplevel);
return false;
}
@@ -4609,7 +4614,7 @@ x_dnd_send_drop (struct frame *f, Window target, Time timestamp,
msg.xclient.type = ClientMessage;
msg.xclient.message_type = dpyinfo->Xatom_XdndDrop;
msg.xclient.format = 32;
- msg.xclient.window = target;
+ msg.xclient.window = toplevel;
msg.xclient.data.l[0] = FRAME_X_WINDOW (f);
msg.xclient.data.l[1] = 0;
msg.xclient.data.l[2] = 0;
@@ -4626,10 +4631,10 @@ x_dnd_send_drop (struct frame *f, Window target, Time timestamp,
}
static bool
-x_dnd_do_drop (Window target, int supported)
+x_dnd_do_drop (Window target, Window toplevel, int supported)
{
if (x_dnd_waiting_for_status_window != target)
- return x_dnd_send_drop (x_dnd_frame, target,
+ return x_dnd_send_drop (x_dnd_frame, target, toplevel,
x_dnd_selection_timestamp, supported);
x_dnd_need_send_drop = true;
@@ -4734,7 +4739,8 @@ x_dnd_cancel_dnd_early (void)
if (x_dnd_last_seen_window != None
&& x_dnd_last_protocol_version != -1)
x_dnd_send_leave (x_dnd_frame,
- x_dnd_last_seen_window);
+ x_dnd_last_seen_window,
+ x_dnd_last_seen_toplevel);
else if (x_dnd_last_seen_window != None
&& !XM_DRAG_STYLE_IS_DROP_ONLY (x_dnd_last_motif_style)
&& x_dnd_last_motif_style != XM_DRAG_STYLE_NONE
@@ -4792,7 +4798,8 @@ x_dnd_cleanup_drag_and_drop (void *frame)
if (x_dnd_last_seen_window != None
&& x_dnd_last_protocol_version != -1)
x_dnd_send_leave (x_dnd_frame,
- x_dnd_last_seen_window);
+ x_dnd_last_seen_window,
+ x_dnd_last_seen_toplevel);
else if (x_dnd_last_seen_window != None
&& !XM_DRAG_STYLE_IS_DROP_ONLY (x_dnd_last_motif_style)
&& 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,
{
struct frame *f;
int dest_x, dest_y;
- Window child_return;
f = x_top_window_to_frame (dpyinfo, target);
- if (f && XTranslateCoordinates (dpyinfo->display,
- dpyinfo->root_window,
- FRAME_X_WINDOW (f),
- root_x, root_y, &dest_x,
- &dest_y, &child_return))
+ if (f)
{
+ x_translate_coordinates (f, root_x, root_y, &dest_x, &dest_y);
+
x_dnd_movement_frame = f;
x_dnd_movement_x = dest_x;
x_dnd_movement_y = dest_y;
@@ -4871,19 +4875,16 @@ x_dnd_note_self_wheel (struct x_display_info *dpyinfo, Window target,
{
struct frame *f;
int dest_x, dest_y;
- Window child_return;
if (button < 4 || button > 7)
return;
f = x_top_window_to_frame (dpyinfo, target);
- if (f && XTranslateCoordinates (dpyinfo->display,
- dpyinfo->root_window,
- FRAME_X_WINDOW (f),
- root_x, root_y, &dest_x,
- &dest_y, &child_return))
+ if (f)
{
+ x_translate_coordinates (f, root_x, root_y, &dest_x, &dest_y);
+
x_dnd_wheel_frame = f;
x_dnd_wheel_x = dest_x;
x_dnd_wheel_y = dest_y;
@@ -4906,7 +4907,6 @@ x_dnd_note_self_drop (struct x_display_info *dpyinfo, Window target,
char **atom_names;
char *name;
int win_x, win_y, i;
- Window dummy;
if (!x_dnd_allow_current_frame
&& (FRAME_OUTER_WINDOW (x_dnd_frame)
@@ -4921,10 +4921,7 @@ x_dnd_note_self_drop (struct x_display_info *dpyinfo, Window target,
if (NILP (Vx_dnd_native_test_function))
return;
- if (!XTranslateCoordinates (dpyinfo->display, dpyinfo->root_window,
- FRAME_X_WINDOW (f), root_x, root_y,
- &win_x, &win_y, &dummy))
- return;
+ x_translate_coordinates (f, root_x, root_y, &win_x, &win_y);
/* Emacs can't respond to DND events inside the nested event loop,
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)
unbind_to (count, Qnil);
- return CALLN (Fapply, intern ("concat"), Fnreverse (acc));
+ return CALLN (Fapply, Qconcat, Fnreverse (acc));
}
#endif /* USE_CAIRO */
@@ -6629,22 +6626,21 @@ x_set_frame_alpha (struct frame *f)
Do this unconditionally as this function is called on reparent when
alpha has not changed on the frame. */
+ x_ignore_errors_for_next_request (dpyinfo);
+
if (!FRAME_PARENT_FRAME (f))
{
parent = x_find_topmost_parent (f);
if (parent != None)
{
- x_ignore_errors_for_next_request (dpyinfo);
XChangeProperty (dpy, parent,
dpyinfo->Xatom_net_wm_window_opacity,
XA_CARDINAL, 32, PropModeReplace,
(unsigned char *) &opac, 1);
- x_stop_ignoring_errors (dpyinfo);
}
}
- x_ignore_errors_for_next_request (dpyinfo);
XChangeProperty (dpy, win, dpyinfo->Xatom_net_wm_window_opacity,
XA_CARDINAL, 32, PropModeReplace,
(unsigned char *) &opac, 1);
@@ -7611,6 +7607,11 @@ static void
x_display_set_last_user_time (struct x_display_info *dpyinfo, Time time,
bool send_event)
{
+#if defined HAVE_XSYNC && !defined USE_GTK && defined HAVE_CLOCK_GETTIME
+ uint_fast64_t monotonic_time;
+ uint_fast64_t monotonic_ms;
+ int_fast64_t diff_ms;
+#endif
#ifndef USE_GTK
struct frame *focus_frame;
Time old_time;
@@ -7631,9 +7632,8 @@ x_display_set_last_user_time (struct x_display_info *dpyinfo, Time time,
{
/* See if the current CLOCK_MONOTONIC time is reasonably close
to the X server time. */
- uint_fast64_t monotonic_time = x_sync_current_monotonic_time ();
- uint_fast64_t monotonic_ms = monotonic_time / 1000;
- int_fast64_t diff_ms;
+ monotonic_time = x_sync_current_monotonic_time ();
+ monotonic_ms = monotonic_time / 1000;
dpyinfo->server_time_monotonic_p
= (monotonic_time != 0
@@ -7651,6 +7651,27 @@ x_display_set_last_user_time (struct x_display_info *dpyinfo, Time time,
monotonic_time,
&dpyinfo->server_time_offset))
dpyinfo->server_time_offset = 0;
+
+ /* If the server time is reasonably close to the monotonic
+ time after the latter is truncated to CARD32, simply make
+ the offset that between the server time in ms and the
+ actual time in ms. */
+
+ monotonic_ms = monotonic_ms & 0xffffffff;
+ if (!INT_SUBTRACT_WRAPV (time, monotonic_ms, &diff_ms)
+ && -500 < diff_ms && diff_ms < 500)
+ {
+ /* The server timestamp overflowed. Make the time
+ offset exactly how much it overflowed by. */
+
+ if (INT_SUBTRACT_WRAPV (monotonic_time / 1000, monotonic_ms,
+ &dpyinfo->server_time_offset)
+ || INT_MULTIPLY_WRAPV (dpyinfo->server_time_offset,
+ 1000, &dpyinfo->server_time_offset)
+ || INT_SUBTRACT_WRAPV (0, dpyinfo->server_time_offset,
+ &dpyinfo->server_time_offset))
+ dpyinfo->server_time_offset = 0;
+ }
}
}
#endif
@@ -11914,7 +11935,8 @@ x_dnd_process_quit (struct frame *f, Time timestamp)
{
if (x_dnd_last_seen_window != None
&& x_dnd_last_protocol_version != -1)
- x_dnd_send_leave (f, x_dnd_last_seen_window);
+ x_dnd_send_leave (f, x_dnd_last_seen_window,
+ x_dnd_last_seen_toplevel);
else if (x_dnd_last_seen_window != None
&& !XM_DRAG_STYLE_IS_DROP_ONLY (x_dnd_last_motif_style)
&& x_dnd_last_motif_style != XM_DRAG_STYLE_NONE
@@ -12641,9 +12663,11 @@ xi_handle_focus_change (struct x_display_info *dpyinfo)
else
dpyinfo->client_pointer_device = device->device_id;
}
-
- if (device->focus_implicit_frame
- && device->focus_implicit_time > time)
+ /* Even if the implicit focus was set after the explicit focus
+ on this specific device, the explicit focus is what really
+ matters. So use it instead. */
+ else if (device->focus_implicit_frame
+ && device->focus_implicit_time > time)
{
new = device->focus_implicit_frame;
time = device->focus_implicit_time;
@@ -12740,6 +12764,25 @@ xi_focus_handle_for_device (struct x_display_info *dpyinfo,
case XI_FocusOut:
device->focus_frame = NULL;
+
+ /* So, unfortunately, the X Input Extension is implemented such
+ that means XI_Leave events will not have their focus field
+ set if the core focus is transferred to another window after
+ an entry event that pretends to (or really does) set the
+ implicit focus. In addition, if the core focus is set, but
+ the extension focus on the client pointer is not, all
+ XI_Enter events will have their focus fields set, despite not
+ actually changing the effective focus window. Combined with
+ almost all window managers not setting the focus on input
+ extension devices, this means that Emacs will continue to
+ think the implicit focus is set on one of its frames if the
+ actual (core) focus is transferred to another window while
+ the pointer remains inside a frame. The only workaround in
+ this case is to clear the implicit focus along with
+ XI_FocusOut events, which is not correct at all, but better
+ than leaving frames in an incorrectly-focused state.
+ (bug#57468) */
+ device->focus_implicit_frame = NULL;
break;
case XI_Enter:
@@ -13155,7 +13198,12 @@ x_detect_focus_change (struct x_display_info *dpyinfo, struct frame *frame,
void
x_mouse_leave (struct x_display_info *dpyinfo)
{
- Mouse_HLInfo *hlinfo = &dpyinfo->mouse_highlight;
+#if defined HAVE_XINPUT2 && !defined USE_X_TOOLKIT
+ struct xi_device_t *device;
+#endif
+ Mouse_HLInfo *hlinfo;
+
+ hlinfo = &dpyinfo->mouse_highlight;
if (hlinfo->mouse_face_mouse_frame)
{
@@ -13163,7 +13211,35 @@ x_mouse_leave (struct x_display_info *dpyinfo)
hlinfo->mouse_face_mouse_frame = NULL;
}
- x_new_focus_frame (dpyinfo, dpyinfo->x_focus_event_frame);
+#if defined HAVE_XINPUT2 && !defined USE_X_TOOLKIT
+ if (!dpyinfo->supports_xi2)
+ /* The call below is supposed to reset the implicit focus and
+ revert the focus back to the last explicitly focused frame. It
+ doesn't work on input extension builds because focus tracking
+ does not set x_focus_event_frame, and proceeds on a per-device
+ basis. On such builds, clear the implicit focus of the client
+ pointer instead. */
+#endif
+ x_new_focus_frame (dpyinfo, dpyinfo->x_focus_event_frame);
+#if defined HAVE_XINPUT2 && !defined USE_X_TOOLKIT
+ else
+ {
+ if (dpyinfo->client_pointer_device == -1)
+ /* If there's no client pointer device, then no implicit focus
+ is currently set. */
+ return;
+
+ device = xi_device_from_id (dpyinfo, dpyinfo->client_pointer_device);
+
+ if (device && device->focus_implicit_frame)
+ {
+ device->focus_implicit_frame = NULL;
+
+ /* The focus might have changed; compute the new focus. */
+ xi_handle_focus_change (dpyinfo);
+ }
+ }
+#endif
}
#endif
@@ -13463,6 +13539,98 @@ get_keysym_name (int keysym)
return value;
}
+/* Given the root and event coordinates of an X event destined for F's
+ edit window, compute the offset between that window and F's root
+ window. This information is then used as an optimization to avoid
+ synchronizing when converting coordinates from some other event to
+ F's edit window. */
+
+static void
+x_compute_root_window_offset (struct frame *f, int root_x, int root_y,
+ int event_x, int event_y)
+{
+ FRAME_X_OUTPUT (f)->window_offset_certain_p = true;
+ FRAME_X_OUTPUT (f)->root_x = root_x - event_x;
+ FRAME_X_OUTPUT (f)->root_y = root_y - event_y;
+}
+
+/* Translate the given coordinates from the root window to the edit
+ window of FRAME, taking into account any cached root window
+ offsets. This allows Emacs to avoid excessive calls to _XReply in
+ many cases while handling events, which would otherwise result in
+ slowdowns over slow network connections. */
+
+static void
+x_translate_coordinates (struct frame *f, int root_x, int root_y,
+ int *x_out, int *y_out)
+{
+ struct x_output *output;
+ Window dummy;
+
+ output = FRAME_X_OUTPUT (f);
+
+ if (output->window_offset_certain_p)
+ {
+ /* Use the cached root window offset. */
+ *x_out = root_x - output->root_x;
+ *y_out = root_y - output->root_y;
+
+ return;
+ }
+
+ /* Otherwise, do the transformation manually. Then, cache the root
+ window position. */
+ if (!XTranslateCoordinates (FRAME_X_DISPLAY (f),
+ FRAME_DISPLAY_INFO (f)->root_window,
+ FRAME_X_WINDOW (f), root_x, root_y,
+ x_out, y_out, &dummy))
+ /* Use some dummy values. This is not supposed to be called with
+ coordinates out of the screen. */
+ *x_out = 0, *y_out = 0;
+ else
+ {
+ /* Cache the root window offset of the edit window. */
+ output->window_offset_certain_p = true;
+ output->root_x = root_x - *x_out;
+ output->root_y = root_y - *y_out;
+ }
+}
+
+/* The same, but for an XIDeviceEvent. */
+
+#ifdef HAVE_XINPUT2
+
+static void
+xi_compute_root_window_offset (struct frame *f, XIDeviceEvent *xev)
+{
+ /* Truncate coordinates instead of rounding them, because that is
+ how the X server handles window hierarchy. */
+ x_compute_root_window_offset (f, xev->root_x, xev->root_y,
+ xev->event_x, xev->event_y);
+}
+
+static void
+xi_compute_root_window_offset_enter (struct frame *f, XIEnterEvent *enter)
+{
+ x_compute_root_window_offset (f, enter->root_x, enter->root_y,
+ enter->event_x, enter->event_y);
+}
+
+#ifdef HAVE_XINPUT2_4
+
+static void
+xi_compute_root_window_offset_pinch (struct frame *f, XIGesturePinchEvent *pev)
+{
+ /* Truncate coordinates instead of rounding them, because that is
+ how the X server handles window hierarchy. */
+ x_compute_root_window_offset (f, pev->root_x, pev->root_y,
+ pev->event_x, pev->event_y);
+}
+
+#endif
+
+#endif
+
static Bool
x_query_pointer_1 (struct x_display_info *dpyinfo,
int client_pointer_device, Window w,
@@ -13591,10 +13759,10 @@ x_query_pointer (Display *dpy, Window w, Window *root_return,
X server, and instead be artificially constructed from input
extension events. In these special events, the only fields that
are initialized are `time', `button', `state', `type', `window' and
- `x' and `y'. This function should not access any other fields in
- EVENT without also initializing the corresponding fields in `bv'
- under the XI_ButtonPress and XI_ButtonRelease labels inside
- `handle_one_xevent'. */
+ `x', `y', `x_root' and `y_root'. This function should not access
+ any other fields in EVENT without also initializing the
+ corresponding fields in `bv' under the XI_ButtonPress and
+ XI_ButtonRelease labels inside `handle_one_xevent'. */
static Lisp_Object
x_construct_mouse_click (struct input_event *result,
@@ -13603,7 +13771,6 @@ x_construct_mouse_click (struct input_event *result,
{
int x = event->x;
int y = event->y;
- Window dummy;
/* Make the event type NO_EVENT; we'll change that when we decide
otherwise. */
@@ -13620,9 +13787,8 @@ x_construct_mouse_click (struct input_event *result,
happen with GTK+ scroll bars, for example), translate the
coordinates so they appear at the correct position. */
if (event->window != FRAME_X_WINDOW (f))
- XTranslateCoordinates (FRAME_X_DISPLAY (f),
- event->window, FRAME_X_WINDOW (f),
- x, y, &x, &y, &dummy);
+ x_translate_coordinates (f, event->x_root, event->y_root,
+ &x, &y);
XSETINT (result->x, x);
XSETINT (result->y, y);
@@ -14325,17 +14491,23 @@ x_protect_window_for_callback (struct x_display_info *dpyinfo,
return true;
}
-static void
+static Lisp_Object
x_unprotect_window_for_callback (struct x_display_info *dpyinfo)
{
+ Lisp_Object window;
+
if (!dpyinfo->n_protected_windows)
- emacs_abort ();
+ return Qnil;
+
+ window = dpyinfo->protected_windows[0];
dpyinfo->n_protected_windows--;
if (dpyinfo->n_protected_windows)
memmove (dpyinfo->protected_windows, &dpyinfo->protected_windows[1],
sizeof (Lisp_Object) * dpyinfo->n_protected_windows);
+
+ return window;
}
/* 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,
in *IEVENT. */
static void
-x_scroll_bar_to_input_event (const XEvent *event,
+x_scroll_bar_to_input_event (struct x_display_info *dpyinfo,
+ const XEvent *event,
struct input_event *ievent)
{
- const XClientMessageEvent *ev = &event->xclient;
Lisp_Object window;
- struct window *w;
- /* See the comment in the function above. */
- intptr_t iw0 = ev->data.l[0];
- intptr_t iw1 = ev->data.l[1];
- intptr_t iw = (iw0 << 31 << 1) + (iw1 & 0xffffffffu);
- w = (struct window *) iw;
+ /* Every time a scroll bar ClientMessage event is sent, the window
+ is pushed onto a queue that is traced for garbage collection.
+ Every time we need a window for a read scroll bar event, we
+ simply read from the other side of the queue. */
+ window = x_unprotect_window_for_callback (dpyinfo);
- XSETWINDOW (window, w);
+ if (NILP (window))
+ {
+ /* This means we are getting extra scroll bar events for some
+ reason, and shouldn't be possible in practice. */
+ EVENT_INIT (*ievent);
+ return;
+ }
ievent->kind = SCROLL_BAR_CLICK_EVENT;
ievent->frame_or_window = window;
ievent->arg = Qnil;
- ievent->timestamp
- = x_get_last_toolkit_time (FRAME_DISPLAY_INFO (XFRAME (w->frame)));
+ ievent->timestamp = x_get_last_toolkit_time (dpyinfo);
ievent->code = 0;
- ievent->part = ev->data.l[2];
- ievent->x = make_fixnum (ev->data.l[3]);
- ievent->y = make_fixnum (ev->data.l[4]);
+ ievent->part = event->xclient.data.l[2];
+ ievent->x = make_fixnum (event->xclient.data.l[3]);
+ ievent->y = make_fixnum (event->xclient.data.l[4]);
ievent->modifiers = 0;
}
@@ -14433,30 +14609,34 @@ x_scroll_bar_to_input_event (const XEvent *event,
input event in *IEVENT. */
static void
-x_horizontal_scroll_bar_to_input_event (const XEvent *event,
+x_horizontal_scroll_bar_to_input_event (struct x_display_info *dpyinfo,
+ const XEvent *event,
struct input_event *ievent)
{
- const XClientMessageEvent *ev = &event->xclient;
Lisp_Object window;
- struct window *w;
- /* See the comment in the function above. */
- intptr_t iw0 = ev->data.l[0];
- intptr_t iw1 = ev->data.l[1];
- intptr_t iw = (iw0 << 31 << 1) + (iw1 & 0xffffffffu);
- w = (struct window *) iw;
+ /* Every time a scroll bar ClientMessage event is sent, the window
+ is pushed onto a queue that is traced for garbage collection.
+ Every time we need a window for a read scroll bar event, we
+ simply read from the other side of the queue. */
+ window = x_unprotect_window_for_callback (dpyinfo);
- XSETWINDOW (window, w);
+ if (NILP (window))
+ {
+ /* This means we are getting extra scroll bar events for some
+ reason, and shouldn't be possible in practice. */
+ EVENT_INIT (*ievent);
+ return;
+ }
ievent->kind = HORIZONTAL_SCROLL_BAR_CLICK_EVENT;
ievent->frame_or_window = window;
ievent->arg = Qnil;
- ievent->timestamp
- = x_get_last_toolkit_time (FRAME_DISPLAY_INFO (XFRAME (w->frame)));
+ ievent->timestamp = x_get_last_toolkit_time (dpyinfo);
ievent->code = 0;
- ievent->part = ev->data.l[2];
- ievent->x = make_fixnum (ev->data.l[3]);
- ievent->y = make_fixnum (ev->data.l[4]);
+ ievent->part = event->xclient.data.l[2];
+ ievent->x = make_fixnum (event->xclient.data.l[3]);
+ ievent->y = make_fixnum (event->xclient.data.l[4]);
ievent->modifiers = 0;
}
@@ -17062,7 +17242,8 @@ x_dnd_update_state (struct x_display_info *dpyinfo, Time timestamp)
if (x_dnd_last_seen_window != None
&& x_dnd_last_protocol_version != -1
&& x_dnd_last_seen_window != FRAME_OUTER_WINDOW (x_dnd_frame))
- x_dnd_send_leave (x_dnd_frame, x_dnd_last_seen_window);
+ x_dnd_send_leave (x_dnd_frame, x_dnd_last_seen_window,
+ x_dnd_last_seen_toplevel);
else if (x_dnd_last_seen_window != None
&& XM_DRAG_STYLE_IS_DYNAMIC (x_dnd_last_motif_style)
&& !x_dnd_disable_motif_drag
@@ -17093,8 +17274,6 @@ x_dnd_update_state (struct x_display_info *dpyinfo, Time timestamp)
x_dnd_waiting_for_finish = false;
target = None;
}
-
- x_dnd_last_seen_toplevel = toplevel;
}
if (target != x_dnd_last_seen_window)
@@ -17102,7 +17281,8 @@ x_dnd_update_state (struct x_display_info *dpyinfo, Time timestamp)
if (x_dnd_last_seen_window != None
&& x_dnd_last_protocol_version != -1
&& x_dnd_last_seen_window != FRAME_OUTER_WINDOW (x_dnd_frame))
- x_dnd_send_leave (x_dnd_frame, x_dnd_last_seen_window);
+ x_dnd_send_leave (x_dnd_frame, x_dnd_last_seen_window,
+ x_dnd_last_seen_toplevel);
else if (x_dnd_last_seen_window != None
&& XM_DRAG_STYLE_IS_DYNAMIC (x_dnd_last_motif_style)
&& !x_dnd_disable_motif_drag
@@ -17124,13 +17304,14 @@ x_dnd_update_state (struct x_display_info *dpyinfo, Time timestamp)
}
x_dnd_action = None;
+ x_dnd_last_seen_toplevel = toplevel;
x_dnd_last_seen_window = target;
x_dnd_last_protocol_version = target_proto;
x_dnd_last_motif_style = motif_style;
x_dnd_last_window_is_frame = was_frame;
if (target != None && x_dnd_last_protocol_version != -1)
- x_dnd_send_enter (x_dnd_frame, target,
+ x_dnd_send_enter (x_dnd_frame, target, x_dnd_last_seen_toplevel,
x_dnd_last_protocol_version);
else if (target != None && XM_DRAG_STYLE_IS_DYNAMIC (x_dnd_last_motif_style)
&& !x_dnd_disable_motif_drag)
@@ -17151,11 +17332,14 @@ x_dnd_update_state (struct x_display_info *dpyinfo, Time timestamp)
target, &emsg);
}
}
+ else
+ x_dnd_last_seen_toplevel = toplevel;
if (x_dnd_last_window_is_frame && target != None)
x_dnd_note_self_position (dpyinfo, target, root_x, root_y);
else if (x_dnd_last_protocol_version != -1 && target != None)
x_dnd_send_position (x_dnd_frame, target,
+ x_dnd_last_seen_toplevel,
x_dnd_last_protocol_version,
root_x, root_y,
x_dnd_selection_timestamp,
@@ -17199,7 +17383,8 @@ x_dnd_update_state (struct x_display_info *dpyinfo, Time timestamp)
if (x_dnd_last_seen_window != None
&& x_dnd_last_protocol_version != -1)
x_dnd_send_leave (x_dnd_frame,
- x_dnd_last_seen_window);
+ x_dnd_last_seen_window,
+ x_dnd_last_seen_toplevel);
else if (x_dnd_last_seen_window != None
&& !XM_DRAG_STYLE_IS_DROP_ONLY (x_dnd_last_motif_style)
&& x_dnd_last_motif_style != XM_DRAG_STYLE_NONE
@@ -17516,6 +17701,53 @@ x_coords_from_dnd_message (struct x_display_info *dpyinfo,
return false;
}
+static void
+x_handle_wm_state (struct frame *f, struct input_event *ie)
+{
+ Atom type;
+ int format;
+ unsigned long nitems, bytes_after;
+ unsigned char *data;
+ unsigned long *state;
+
+ data = NULL;
+
+ if (XGetWindowProperty (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f),
+ FRAME_DISPLAY_INFO (f)->Xatom_wm_state, 0, 2,
+ False, AnyPropertyType, &type, &format, &nitems,
+ &bytes_after, &data) != Success)
+ return;
+
+ if (!data || nitems != 2 || format != 32)
+ {
+ if (data)
+ XFree (data);
+
+ return;
+ }
+
+ state = (unsigned long *) data;
+
+ if (state[0] == NormalState && FRAME_ICONIFIED_P (f))
+ {
+ /* The frame has been deiconified. It has not been withdrawn
+ and is now visible. */
+ SET_FRAME_VISIBLE (f, 1);
+ SET_FRAME_ICONIFIED (f, false);
+ f->output_data.x->has_been_visible = true;
+
+ ie->kind = DEICONIFY_EVENT;
+ XSETFRAME (ie->frame_or_window, f);
+ }
+
+ /* state[0] can also be WithdrawnState, meaning that the window has
+ been withdrawn and is no longer iconified. However, Emacs sets
+ the correct flags upon withdrawing the window, so there is no
+ need to do anything here. */
+
+ XFree (data);
+}
+
/* Handles the XEvent EVENT on display DPYINFO.
*FINISH is X_EVENT_GOTO_OUT if caller should stop reading events.
@@ -17539,7 +17771,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
int do_help = 0;
#ifdef HAVE_XINPUT2
struct xi_device_t *gen_help_device;
- Time gen_help_time;
+ Time gen_help_time UNINIT;
#endif
ptrdiff_t nbytes = 0;
struct frame *any, *f = NULL;
@@ -17565,6 +17797,12 @@ handle_one_xevent (struct x_display_info *dpyinfo,
int dx, dy;
USE_SAFE_ALLOCA;
+ /* This function is not reentrant, so input should be blocked before
+ it is called. */
+
+ if (!input_blocked_p ())
+ emacs_abort ();
+
*finish = X_EVENT_NORMAL;
EVENT_INIT (inev.ie);
@@ -17614,7 +17852,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
if (x_dnd_last_protocol_version != -1
&& x_dnd_in_progress
- && target == x_dnd_last_seen_window
+ && target == x_dnd_last_seen_toplevel
/* The XDND documentation is not very clearly worded.
But this should be the correct behavior, since
"kDNDStatusSendHereFlag" in the reference
@@ -17711,7 +17949,9 @@ handle_one_xevent (struct x_display_info *dpyinfo,
x_dnd_waiting_for_finish
= x_dnd_send_drop (x_dnd_finish_frame,
- target, x_dnd_selection_timestamp,
+ target,
+ x_dnd_last_seen_toplevel,
+ x_dnd_selection_timestamp,
x_dnd_send_drop_proto);
}
}
@@ -18031,13 +18271,22 @@ handle_one_xevent (struct x_display_info *dpyinfo,
we construct an input_event. */
if (event->xclient.message_type == dpyinfo->Xatom_Scrollbar)
{
- x_scroll_bar_to_input_event (event, &inev.ie);
+ /* Convert the scroll bar event to an input event using
+ the first window entered into the scroll bar event
+ queue. */
+ x_scroll_bar_to_input_event (dpyinfo, event, &inev.ie);
+
*finish = X_EVENT_GOTO_OUT;
goto done;
}
else if (event->xclient.message_type == dpyinfo->Xatom_Horizontal_Scrollbar)
{
- x_horizontal_scroll_bar_to_input_event (event, &inev.ie);
+ /* Convert the horizontal scroll bar event to an input
+ event using the first window entered into the scroll
+ bar event queue. */
+ x_horizontal_scroll_bar_to_input_event (dpyinfo, event,
+ &inev.ie);
+
*finish = X_EVENT_GOTO_OUT;
goto done;
}
@@ -18287,6 +18536,19 @@ handle_one_xevent (struct x_display_info *dpyinfo,
}
}
+ if (f && event->xproperty.atom == dpyinfo->Xatom_wm_state
+ && !FRAME_X_EMBEDDED_P (f) && !FRAME_PARENT_FRAME (f))
+ /* Handle WM_STATE. We use this to clear the iconified flag
+ on a frame if it is set.
+
+ GTK builds ignore deiconifying frames on FocusIn or Expose
+ by default, and cannot wait for the window manager to
+ remove _NET_WM_STATE_HIDDEN, as it is ambiguous when not
+ set. Handling UnmapNotify also checks for
+ _NET_WM_STATE_HIDDEN, and thus suffers from the same
+ problem. */
+ x_handle_wm_state (f, &inev.ie);
+
if (f && FRAME_X_OUTPUT (f)->alpha_identical_p
&& (event->xproperty.atom
== dpyinfo->Xatom_net_wm_window_opacity))
@@ -18416,6 +18678,24 @@ handle_one_xevent (struct x_display_info *dpyinfo,
f = x_top_window_to_frame (dpyinfo, event->xreparent.window);
if (f)
{
+#ifndef USE_GTK
+ if (FRAME_OUTPUT_DATA (f)->parent_desc
+ && FRAME_X_EMBEDDED_P (f))
+ {
+ /* The frame's embedder was destroyed; mark the frame as
+ no longer embedded, and map the frame. An
+ UnmapNotify event must have previously been received
+ during the start of save-set processing. */
+
+ FRAME_X_OUTPUT (f)->explicit_parent = false;
+
+ /* Remove the leftover XEMBED_INFO property. */
+ XDeleteProperty (dpyinfo->display, FRAME_OUTER_WINDOW (f),
+ dpyinfo->Xatom_XEMBED_INFO);
+ x_make_frame_visible (f);
+ }
+#endif
+
/* Maybe we shouldn't set this for child frames ?? */
f->output_data.x->parent_desc = event->xreparent.parent;
@@ -18443,11 +18723,9 @@ handle_one_xevent (struct x_display_info *dpyinfo,
Window root;
unsigned int dummy_uint;
- block_input ();
XGetGeometry (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f),
&root, &f->left_pos, &f->top_pos,
&dummy_uint, &dummy_uint, &dummy_uint, &dummy_uint);
- unblock_input ();
}
x_set_frame_alpha (f);
@@ -18472,7 +18750,6 @@ handle_one_xevent (struct x_display_info *dpyinfo,
{
if (!FRAME_VISIBLE_P (f))
{
- block_input ();
/* By default, do not set the frame's visibility here, see
https://lists.gnu.org/archive/html/emacs-devel/2017-02/msg00133.html.
The default behavior can be overridden by setting
@@ -18491,7 +18768,6 @@ handle_one_xevent (struct x_display_info *dpyinfo,
#endif
f->output_data.x->has_been_visible = true;
SET_FRAME_GARBAGED (f);
- unblock_input ();
}
else if (FRAME_GARBAGED_P (f))
{
@@ -18858,6 +19134,13 @@ handle_one_xevent (struct x_display_info *dpyinfo,
`event' itself. */
XKeyEvent xkey = event->xkey;
+ if (event->xkey.window == FRAME_X_WINDOW (f))
+ /* See the comment above x_compute_root_window_offset for
+ why this optimization is performed. */
+ x_compute_root_window_offset (f, event->xkey.x_root,
+ event->xkey.y_root,
+ event->xkey.x, event->xkey.y);
+
#ifdef HAVE_XINPUT2
Time pending_keystroke_time;
struct xi_device_t *source;
@@ -18916,7 +19199,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
&xkey, (char *) copy_bufptr,
copy_bufsiz, &keysym,
&status_return);
- coding = Qnil;
+ coding = FRAME_X_XIM_CODING (f);
if (status_return == XBufferOverflow)
{
copy_bufsiz = nbytes + 1;
@@ -19262,6 +19545,18 @@ handle_one_xevent (struct x_display_info *dpyinfo,
x_display_set_last_user_time (dpyinfo, event->xcrossing.time,
event->xcrossing.send_event);
+#ifdef HAVE_XINPUT2
+ /* For whatever reason, the X server continues to deliver
+ EnterNotify and LeaveNotify events despite us selecting for
+ related XI_Enter and XI_Leave events. It's not just our
+ problem, since windows created by "xinput test-xi2" suffer
+ from the same defect. Simply ignore all such events while
+ the input extension is enabled. (bug#57468) */
+
+ if (dpyinfo->supports_xi2)
+ goto OTHER;
+#endif
+
if (x_top_window_to_frame (dpyinfo, event->xcrossing.window))
x_detect_focus_change (dpyinfo, any, event, &inev.ie);
@@ -19292,6 +19587,16 @@ handle_one_xevent (struct x_display_info *dpyinfo,
f = any;
+ if (f && event->xcrossing.window == FRAME_X_WINDOW (f))
+ x_compute_root_window_offset (f, event->xcrossing.x_root,
+ event->xcrossing.y_root,
+ event->xcrossing.x,
+ event->xcrossing.y);
+
+ /* The code below relies on the first several fields of
+ XCrossingEvent being laid out the same way as
+ XMotionEvent. */
+
if (f && x_mouse_click_focus_ignore_position)
{
ignore_next_mouse_click_timeout = (event->xmotion.time
@@ -19363,6 +19668,18 @@ handle_one_xevent (struct x_display_info *dpyinfo,
x_display_set_last_user_time (dpyinfo, event->xcrossing.time,
event->xcrossing.send_event);
+#ifdef HAVE_XINPUT2
+ /* For whatever reason, the X server continues to deliver
+ EnterNotify and LeaveNotify events despite us selecting for
+ related XI_Enter and XI_Leave events. It's not just our
+ problem, since windows created by "xinput test-xi2" suffer
+ from the same defect. Simply ignore all such events while
+ the input extension is enabled. (bug#57468) */
+
+ if (dpyinfo->supports_xi2)
+ goto OTHER;
+#endif
+
#ifdef HAVE_XWIDGETS
{
struct xwidget_view *xvw = xwidget_view_from_window (event->xcrossing.window);
@@ -19388,14 +19705,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
#else
f = x_top_window_to_frame (dpyinfo, event->xcrossing.window);
#endif
-#if defined USE_X_TOOLKIT && defined HAVE_XINPUT2 && !defined USE_MOTIF
- /* The XI2 event mask is set on the frame widget, so this event
- likely originates from the shell widget, which we aren't
- interested in. (But don't ignore this on Motif, since we
- want to clear the mouse face when a popup is active.) */
- if (dpyinfo->supports_xi2)
- f = NULL;
-#endif
+
if (f)
{
/* Now clear dpyinfo->last_mouse_motion_frame, or
@@ -19431,6 +19741,13 @@ handle_one_xevent (struct x_display_info *dpyinfo,
|| EQ (track_mouse, Qdropping))
&& gui_mouse_grabbed (dpyinfo)))
do_help = -1;
+
+ if (event->xcrossing.window == FRAME_X_WINDOW (f))
+ x_compute_root_window_offset (f, event->xcrossing.x_root,
+ event->xcrossing.y_root,
+ event->xcrossing.x,
+ event->xcrossing.y);
+
}
#ifdef USE_GTK
/* See comment in EnterNotify above */
@@ -19474,6 +19791,14 @@ handle_one_xevent (struct x_display_info *dpyinfo,
f = mouse_or_wdesc_frame (dpyinfo, event->xmotion.window);
+ if (f && event->xmotion.window == FRAME_X_WINDOW (f))
+ /* See the comment above x_compute_root_window_offset for
+ why this optimization is performed. */
+ x_compute_root_window_offset (f, event->xmotion.x_root,
+ event->xmotion.y_root,
+ event->xmotion.x,
+ event->xmotion.y);
+
if (x_dnd_in_progress
/* Handle these events normally if the recursion
level is higher than when the drag-and-drop
@@ -19548,7 +19873,8 @@ handle_one_xevent (struct x_display_info *dpyinfo,
if (x_dnd_last_seen_window != None
&& x_dnd_last_protocol_version != -1
&& x_dnd_last_seen_window != FRAME_OUTER_WINDOW (x_dnd_frame))
- x_dnd_send_leave (x_dnd_frame, x_dnd_last_seen_window);
+ x_dnd_send_leave (x_dnd_frame, x_dnd_last_seen_window,
+ x_dnd_last_seen_toplevel);
else if (x_dnd_last_seen_window != None
&& XM_DRAG_STYLE_IS_DYNAMIC (x_dnd_last_motif_style)
&& !x_dnd_disable_motif_drag
@@ -19579,8 +19905,6 @@ handle_one_xevent (struct x_display_info *dpyinfo,
x_dnd_waiting_for_finish = false;
target = None;
}
-
- x_dnd_last_seen_toplevel = toplevel;
}
if (target != x_dnd_last_seen_window)
@@ -19588,7 +19912,8 @@ handle_one_xevent (struct x_display_info *dpyinfo,
if (x_dnd_last_seen_window != None
&& x_dnd_last_protocol_version != -1
&& x_dnd_last_seen_window != FRAME_OUTER_WINDOW (x_dnd_frame))
- x_dnd_send_leave (x_dnd_frame, x_dnd_last_seen_window);
+ x_dnd_send_leave (x_dnd_frame, x_dnd_last_seen_window,
+ x_dnd_last_seen_toplevel);
else if (x_dnd_last_seen_window != None
&& XM_DRAG_STYLE_IS_DYNAMIC (x_dnd_last_motif_style)
&& x_dnd_disable_motif_drag
@@ -19631,6 +19956,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
}
x_dnd_action = None;
+ x_dnd_last_seen_toplevel = toplevel;
x_dnd_last_seen_window = target;
x_dnd_last_protocol_version = target_proto;
x_dnd_last_motif_style = motif_style;
@@ -19638,6 +19964,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
if (target != None && x_dnd_last_protocol_version != -1)
x_dnd_send_enter (x_dnd_frame, target,
+ x_dnd_last_seen_toplevel,
x_dnd_last_protocol_version);
else if (target != None && XM_DRAG_STYLE_IS_DYNAMIC (x_dnd_last_motif_style)
&& !x_dnd_disable_motif_drag)
@@ -19658,6 +19985,8 @@ handle_one_xevent (struct x_display_info *dpyinfo,
target, &emsg);
}
}
+ else
+ x_dnd_last_seen_toplevel = toplevel;
if (x_dnd_last_window_is_frame && target != None)
x_dnd_note_self_position (dpyinfo, target,
@@ -19665,6 +19994,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
event->xbutton.y_root);
else if (x_dnd_last_protocol_version != -1 && target != None)
x_dnd_send_position (x_dnd_frame, target,
+ x_dnd_last_seen_toplevel,
x_dnd_last_protocol_version,
event->xmotion.x_root,
event->xmotion.y_root,
@@ -19733,10 +20063,8 @@ handle_one_xevent (struct x_display_info *dpyinfo,
if (xmotion.window != FRAME_X_WINDOW (f))
{
- XTranslateCoordinates (FRAME_X_DISPLAY (f),
- xmotion.window, FRAME_X_WINDOW (f),
- xmotion.x, xmotion.y, &xmotion.x,
- &xmotion.y, &xmotion.subwindow);
+ x_translate_coordinates (f, xmotion.x_root, xmotion.y_root,
+ &xmotion.x, &xmotion.y);
xmotion.window = FRAME_X_WINDOW (f);
}
@@ -19959,17 +20287,21 @@ handle_one_xevent (struct x_display_info *dpyinfo,
#endif
f = x_top_window_to_frame (dpyinfo, configureEvent.xconfigure.window);
+
+ /* This means we can no longer be certain of the root window
+ coordinates of any's edit window. */
+ if (any)
+ FRAME_X_OUTPUT (any)->window_offset_certain_p = false;
+
/* Unfortunately, we need to call x_drop_xrender_surfaces for
_all_ ConfigureNotify events, otherwise we miss some and
flicker. Don't try to optimize these calls by looking only
for size changes: that's not sufficient. We miss some
surface invalidations and flicker. */
- block_input ();
#ifdef HAVE_XDBE
if (f && FRAME_X_DOUBLE_BUFFERED_P (f))
x_drop_xrender_surfaces (f);
#endif
- unblock_input ();
#if defined USE_CAIRO && !defined USE_GTK
if (f)
x_cr_update_surface_desired_size (f, configureEvent.xconfigure.width,
@@ -19999,10 +20331,8 @@ handle_one_xevent (struct x_display_info *dpyinfo,
f->new_width, f->new_height);
#ifdef HAVE_XDBE
- block_input ();
if (FRAME_X_DOUBLE_BUFFERED_P (f))
x_drop_xrender_surfaces (f);
- unblock_input ();
#endif
xg_frame_resized (f, configureEvent.xconfigure.width,
configureEvent.xconfigure.height);
@@ -20092,11 +20422,9 @@ handle_one_xevent (struct x_display_info *dpyinfo,
Window root;
unsigned int dummy_uint;
- block_input ();
XGetGeometry (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f),
&root, &f->left_pos, &f->top_pos,
&dummy_uint, &dummy_uint, &dummy_uint, &dummy_uint);
- unblock_input ();
}
if (!FRAME_TOOLTIP_P (f)
@@ -20194,6 +20522,14 @@ handle_one_xevent (struct x_display_info *dpyinfo,
{
f = mouse_or_wdesc_frame (dpyinfo, event->xbutton.window);
+ if (f && event->xbutton.window == FRAME_X_WINDOW (f))
+ /* See the comment above x_compute_root_window_offset
+ for why this optimization is performed. */
+ x_compute_root_window_offset (f, event->xbutton.x_root,
+ event->xbutton.y_root,
+ event->xbutton.x,
+ event->xbutton.y);
+
if (event->type == ButtonPress)
{
x_display_set_last_user_time (dpyinfo, event->xbutton.time,
@@ -20226,6 +20562,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
else if (x_dnd_last_protocol_version != -1)
x_dnd_send_position (x_dnd_frame,
x_dnd_last_seen_window,
+ x_dnd_last_seen_toplevel,
x_dnd_last_protocol_version,
event->xbutton.x_root,
event->xbutton.y_root,
@@ -20273,11 +20610,12 @@ handle_one_xevent (struct x_display_info *dpyinfo,
else if (x_dnd_last_seen_window != None
&& x_dnd_last_protocol_version != -1)
{
- x_dnd_pending_finish_target = x_dnd_last_seen_window;
+ x_dnd_pending_finish_target = x_dnd_last_seen_toplevel;
x_dnd_waiting_for_finish_proto = x_dnd_last_protocol_version;
x_dnd_waiting_for_finish
= x_dnd_do_drop (x_dnd_last_seen_window,
+ x_dnd_last_seen_toplevel,
x_dnd_last_protocol_version);
x_dnd_finish_display = dpyinfo->display;
}
@@ -20365,6 +20703,15 @@ handle_one_xevent (struct x_display_info *dpyinfo,
dpyinfo->last_mouse_glyph_frame = NULL;
f = mouse_or_wdesc_frame (dpyinfo, event->xbutton.window);
+
+ if (f && event->xbutton.window == FRAME_X_WINDOW (f))
+ /* See the comment above x_compute_root_window_offset
+ for why this optimization is performed. */
+ x_compute_root_window_offset (f, event->xbutton.x_root,
+ event->xbutton.y_root,
+ event->xbutton.x,
+ event->xbutton.y);
+
if (f && event->xbutton.type == ButtonPress
&& !popup_activated ()
&& !x_window_to_scroll_bar (event->xbutton.display,
@@ -20379,12 +20726,10 @@ handle_one_xevent (struct x_display_info *dpyinfo,
if (FRAME_PARENT_FRAME (f) || (hf && frame_ancestor_p (f, hf)))
{
- block_input ();
XSetInputFocus (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f),
RevertToParent, event->xbutton.time);
if (FRAME_PARENT_FRAME (f))
XRaiseWindow (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f));
- unblock_input ();
}
}
@@ -20615,6 +20960,15 @@ handle_one_xevent (struct x_display_info *dpyinfo,
== dpyinfo->net_supported_window)
dpyinfo->net_supported_window = None;
+ if (event->xdestroywindow.window
+ == dpyinfo->motif_drag_window)
+ /* We get DestroyNotify events for the drag window because
+ x_special_window_exists_p selects for structure
+ notification. The drag window is not supposed to go away
+ but not all clients obey that requirement when setting the
+ drag window property. */
+ dpyinfo->motif_drag_window = None;
+
xft_settings_event (dpyinfo, event);
break;
@@ -20771,8 +21125,20 @@ handle_one_xevent (struct x_display_info *dpyinfo,
any = x_any_window_to_frame (dpyinfo, enter->event);
#ifdef HAVE_XINPUT2_1
- xi_reset_scroll_valuators_for_device_id (dpyinfo, enter->deviceid,
- true);
+ /* xfwm4 selects for button events on the frame window,
+ resulting in passive grabs being generated along with
+ the delivery of emulated button events; this then
+ interferes with scrolling, since device valuators
+ will constantly be reset as the crossing events
+ related to those grabs arrive. The only way to
+ remedy this is to never reset scroll valuators on a
+ grab-related crossing event. (bug#57476) */
+ if (enter->mode != XINotifyUngrab
+ && enter->mode != XINotifyGrab
+ && enter->mode != XINotifyPassiveGrab
+ && enter->mode != XINotifyPassiveUngrab)
+ xi_reset_scroll_valuators_for_device_id (dpyinfo, enter->deviceid,
+ true);
#endif
{
@@ -20792,6 +21158,9 @@ handle_one_xevent (struct x_display_info *dpyinfo,
f = any;
+ if (f && enter->event == FRAME_X_WINDOW (f))
+ xi_compute_root_window_offset_enter (f, enter);
+
if (f && x_mouse_click_focus_ignore_position)
{
ignore_next_mouse_click_timeout = (enter->time
@@ -20888,7 +21257,20 @@ handle_one_xevent (struct x_display_info *dpyinfo,
moves out of a frame (and not into one of its
children, which we know about). */
#ifdef HAVE_XINPUT2_1
- if (leave->detail != XINotifyInferior && any)
+ if (leave->detail != XINotifyInferior && any
+ /* xfwm4 selects for button events on the frame
+ window, resulting in passive grabs being
+ generated along with the delivery of emulated
+ button events; this then interferes with
+ scrolling, since device valuators will constantly
+ be reset as the crossing events related to those
+ grabs arrive. The only way to remedy this is to
+ never reset scroll valuators on a grab-related
+ crossing event. (bug#57476) */
+ && leave->mode != XINotifyUngrab
+ && leave->mode != XINotifyGrab
+ && leave->mode != XINotifyPassiveUngrab
+ && leave->mode != XINotifyPassiveGrab)
xi_reset_scroll_valuators_for_device_id (dpyinfo,
leave->deviceid, false);
#endif
@@ -20926,7 +21308,11 @@ handle_one_xevent (struct x_display_info *dpyinfo,
just looks up a top window on Xt builds. */
#ifdef HAVE_XINPUT2_1
- if (leave->detail != XINotifyInferior && f)
+ if (leave->detail != XINotifyInferior && f
+ && leave->mode != XINotifyUngrab
+ && leave->mode != XINotifyGrab
+ && leave->mode != XINotifyPassiveUngrab
+ && leave->mode != XINotifyPassiveGrab)
xi_reset_scroll_valuators_for_device_id (dpyinfo,
leave->deviceid, false);
#endif
@@ -20971,6 +21357,9 @@ handle_one_xevent (struct x_display_info *dpyinfo,
|| EQ (track_mouse, Qdropping))
&& gui_mouse_grabbed (dpyinfo)))
do_help = -1;
+
+ if (f && leave->event == FRAME_X_WINDOW (f))
+ xi_compute_root_window_offset_enter (f, leave);
}
#ifdef USE_GTK
/* See comment in EnterNotify above */
@@ -21014,8 +21403,6 @@ handle_one_xevent (struct x_display_info *dpyinfo,
goto XI_OTHER;
#endif
- Window dummy;
-
#ifdef HAVE_XINPUT2_1
#ifdef HAVE_XWIDGETS
struct xwidget_view *xv = xwidget_view_from_window (xev->event);
@@ -21093,11 +21480,10 @@ handle_one_xevent (struct x_display_info *dpyinfo,
real_y = lrint (xev->event_y + bar->top);
}
else
- XTranslateCoordinates (dpyinfo->display,
- xev->event, FRAME_X_WINDOW (f),
- lrint (xev->event_x),
- lrint (xev->event_y),
- &real_x, &real_y, &dummy);
+ x_translate_coordinates (f,
+ lrint (xev->root_x),
+ lrint (xev->root_y),
+ &real_x, &real_y);
}
else
{
@@ -21299,6 +21685,11 @@ handle_one_xevent (struct x_display_info *dpyinfo,
f = mouse_or_wdesc_frame (dpyinfo, xev->event);
+ if (f && xev->event == FRAME_X_WINDOW (f))
+ /* See the comment above x_compute_root_window_offset
+ for why this optimization is performed. */
+ xi_compute_root_window_offset (f, xev);
+
if (x_dnd_in_progress
/* Handle these events normally if the recursion
level is higher than when the drag-and-drop
@@ -21333,26 +21724,26 @@ handle_one_xevent (struct x_display_info *dpyinfo,
/* Also remember the mouse glyph and set
mouse_moved. */
if (f != dpyinfo->last_mouse_glyph_frame
- || xev->event_x < r->x
- || xev->event_x >= r->x + r->width
- || xev->event_y < r->y
- || xev->event_y >= r->y + r->height)
+ || lrint (xev->event_x) < r->x
+ || lrint (xev->event_x) >= r->x + r->width
+ || lrint (xev->event_y) < r->y
+ || lrint (xev->event_y) >= r->y + r->height)
{
f->mouse_moved = true;
f->last_mouse_device = (source ? source->name
: Qnil);
dpyinfo->last_mouse_scroll_bar = NULL;
- remember_mouse_glyph (f, xev->event_x,
- xev->event_y, r);
+ remember_mouse_glyph (f, lrint (xev->event_x),
+ lrint (xev->event_y), r);
dpyinfo->last_mouse_glyph_frame = f;
}
}
if (xev->root == dpyinfo->root_window)
target = x_dnd_get_target_window (dpyinfo,
- xev->root_x,
- xev->root_y,
+ lrint (xev->root_x),
+ lrint (xev->root_y),
&target_proto,
&motif_style,
&toplevel,
@@ -21375,7 +21766,8 @@ handle_one_xevent (struct x_display_info *dpyinfo,
if (x_dnd_last_seen_window != None
&& x_dnd_last_protocol_version != -1
&& x_dnd_last_seen_window != FRAME_OUTER_WINDOW (x_dnd_frame))
- x_dnd_send_leave (x_dnd_frame, x_dnd_last_seen_window);
+ x_dnd_send_leave (x_dnd_frame, x_dnd_last_seen_window,
+ x_dnd_last_seen_toplevel);
else if (x_dnd_last_seen_window != None
&& XM_DRAG_STYLE_IS_DYNAMIC (x_dnd_last_motif_style)
&& !x_dnd_disable_motif_drag
@@ -21406,8 +21798,6 @@ handle_one_xevent (struct x_display_info *dpyinfo,
x_dnd_waiting_for_finish = false;
target = None;
}
-
- x_dnd_last_seen_toplevel = toplevel;
}
if (target != x_dnd_last_seen_window)
@@ -21415,7 +21805,8 @@ handle_one_xevent (struct x_display_info *dpyinfo,
if (x_dnd_last_seen_window != None
&& x_dnd_last_protocol_version != -1
&& x_dnd_last_seen_window != FRAME_OUTER_WINDOW (x_dnd_frame))
- x_dnd_send_leave (x_dnd_frame, x_dnd_last_seen_window);
+ x_dnd_send_leave (x_dnd_frame, x_dnd_last_seen_window,
+ x_dnd_last_seen_toplevel);
else if (x_dnd_last_seen_window != None
&& XM_DRAG_STYLE_IS_DYNAMIC (x_dnd_last_motif_style)
&& !x_dnd_disable_motif_drag
@@ -21460,6 +21851,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
}
x_dnd_action = None;
+ x_dnd_last_seen_toplevel = toplevel;
x_dnd_last_seen_window = target;
x_dnd_last_protocol_version = target_proto;
x_dnd_last_motif_style = motif_style;
@@ -21467,6 +21859,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
if (target != None && x_dnd_last_protocol_version != -1)
x_dnd_send_enter (x_dnd_frame, target,
+ x_dnd_last_seen_toplevel,
x_dnd_last_protocol_version);
else if (target != None && XM_DRAG_STYLE_IS_DYNAMIC (x_dnd_last_motif_style)
&& !x_dnd_disable_motif_drag)
@@ -21487,17 +21880,22 @@ handle_one_xevent (struct x_display_info *dpyinfo,
target, &emsg);
}
}
+ else
+ x_dnd_last_seen_toplevel = toplevel;
if (x_dnd_last_window_is_frame && target != None)
x_dnd_note_self_position (dpyinfo, target,
- xev->root_x, xev->root_y);
+ lrint (xev->root_x),
+ lrint (xev->root_y));
else if (x_dnd_last_protocol_version != -1 && target != None)
{
dnd_state = xi_convert_event_state (xev);
x_dnd_send_position (x_dnd_frame, target,
+ x_dnd_last_seen_toplevel,
x_dnd_last_protocol_version,
- xev->root_x, xev->root_y,
+ lrint (xev->root_x),
+ lrint (xev->root_y),
x_dnd_selection_timestamp,
x_dnd_wanted_action, 0,
dnd_state);
@@ -21540,9 +21938,9 @@ handle_one_xevent (struct x_display_info *dpyinfo,
{
if (xev->event != FRAME_X_WINDOW (f))
{
- XTranslateCoordinates (FRAME_X_DISPLAY (f),
- xev->event, FRAME_X_WINDOW (f),
- ev.x, ev.y, &ev.x, &ev.y, &dummy);
+ x_translate_coordinates (f, lrint (xev->root_x),
+ lrint (xev->root_y),
+ &ev.x, &ev.y);
ev.window = FRAME_X_WINDOW (f);
}
@@ -21648,6 +22046,12 @@ handle_one_xevent (struct x_display_info *dpyinfo,
f = mouse_or_wdesc_frame (dpyinfo, xev->event);
device = xi_device_from_id (dpyinfo, xev->deviceid);
+ if (f && xev->event == FRAME_X_WINDOW (f))
+ /* See the comment above
+ x_compute_root_window_offset for why this
+ optimization is performed. */
+ xi_compute_root_window_offset (f, xev);
+
/* Don't track grab status for emulated pointer
events, because they are ignored by the regular
mouse click processing code. */
@@ -21705,15 +22109,18 @@ handle_one_xevent (struct x_display_info *dpyinfo,
#endif
x_dnd_note_self_wheel (dpyinfo,
x_dnd_last_seen_window,
- xev->root_x, xev->root_y,
+ lrint (xev->root_x),
+ lrint (xev->root_y),
xev->detail, dnd_state,
xev->time);
}
else
x_dnd_send_position (x_dnd_frame,
x_dnd_last_seen_window,
+ x_dnd_last_seen_toplevel,
x_dnd_last_protocol_version,
- xev->root_x, xev->root_y,
+ lrint (xev->root_x),
+ lrint (xev->root_y),
xev->time, x_dnd_wanted_action,
xev->detail, dnd_state);
@@ -21756,16 +22163,18 @@ handle_one_xevent (struct x_display_info *dpyinfo,
{
x_dnd_waiting_for_finish = false;
x_dnd_note_self_drop (dpyinfo, x_dnd_last_seen_window,
- xev->root_x, xev->root_y, xev->time);
+ lrint (xev->root_x),
+ lrint (xev->root_y), xev->time);
}
else if (x_dnd_last_seen_window != None
&& x_dnd_last_protocol_version != -1)
{
- x_dnd_pending_finish_target = x_dnd_last_seen_window;
+ x_dnd_pending_finish_target = x_dnd_last_seen_toplevel;
x_dnd_waiting_for_finish_proto = x_dnd_last_protocol_version;
x_dnd_waiting_for_finish
= x_dnd_do_drop (x_dnd_last_seen_window,
+ x_dnd_last_seen_toplevel,
x_dnd_last_protocol_version);
x_dnd_finish_display = dpyinfo->display;
}
@@ -21831,12 +22240,14 @@ handle_one_xevent (struct x_display_info *dpyinfo,
x_dnd_send_unsupported_drop (dpyinfo, (x_dnd_last_seen_toplevel != None
? x_dnd_last_seen_toplevel
: x_dnd_last_seen_window),
- xev->root_x, xev->root_y, xev->time);
+ lrint (xev->root_x),
+ lrint (xev->root_y), xev->time);
}
else if (x_dnd_last_seen_toplevel != None)
x_dnd_send_unsupported_drop (dpyinfo,
x_dnd_last_seen_toplevel,
- xev->root_x, xev->root_y,
+ lrint (xev->root_x),
+ lrint (xev->root_y),
xev->time);
x_dnd_last_protocol_version = -1;
@@ -21972,6 +22383,8 @@ handle_one_xevent (struct x_display_info *dpyinfo,
bv.type = xev->evtype == XI_ButtonPress ? ButtonPress : ButtonRelease;
bv.x = lrint (xev->event_x);
bv.y = lrint (xev->event_y);
+ bv.x_root = lrint (xev->root_x);
+ bv.y_root = lrint (xev->root_y);
bv.window = xev->event;
bv.state = xi_convert_event_state (xev);
bv.time = xev->time;
@@ -21980,6 +22393,11 @@ handle_one_xevent (struct x_display_info *dpyinfo,
f = mouse_or_wdesc_frame (dpyinfo, xev->event);
+ if (f && xev->event == FRAME_X_WINDOW (f))
+ /* See the comment above x_compute_root_window_offset
+ for why this optimization is performed. */
+ xi_compute_root_window_offset (f, xev);
+
if (f && xev->evtype == XI_ButtonPress
&& !popup_activated ()
&& !x_window_to_scroll_bar (dpyinfo->display, xev->event, 2)
@@ -21993,7 +22411,6 @@ handle_one_xevent (struct x_display_info *dpyinfo,
if (FRAME_PARENT_FRAME (f) || (hf && frame_ancestor_p (f, hf)))
{
- block_input ();
#if defined HAVE_GTK3 || (!defined USE_GTK && !defined USE_X_TOOLKIT)
if (device)
{
@@ -22016,7 +22433,6 @@ handle_one_xevent (struct x_display_info *dpyinfo,
#endif
if (FRAME_PARENT_FRAME (f))
XRaiseWindow (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f));
- unblock_input ();
}
}
@@ -22033,9 +22449,8 @@ handle_one_xevent (struct x_display_info *dpyinfo,
#ifdef USE_GTK
if (!f)
{
- int real_x = lrint (xev->event_x);
- int real_y = lrint (xev->event_y);
- Window child;
+ int real_x = lrint (xev->root_x);
+ int real_y = lrint (xev->root_y);
f = x_any_window_to_frame (dpyinfo, xev->event);
@@ -22044,9 +22459,8 @@ handle_one_xevent (struct x_display_info *dpyinfo,
if (xev->evtype == XI_ButtonRelease)
{
if (FRAME_X_WINDOW (f) != xev->event)
- XTranslateCoordinates (dpyinfo->display, xev->event,
- FRAME_X_WINDOW (f), real_x,
- real_y, &real_x, &real_y, &child);
+ x_translate_coordinates (f, real_x, real_y,
+ &real_x, &real_y);
if (xev->detail <= 5)
inev.ie.kind = WHEEL_EVENT;
@@ -22311,6 +22725,11 @@ handle_one_xevent (struct x_display_info *dpyinfo,
f = x_any_window_to_frame (dpyinfo, xev->event);
+ if (f && xev->event == FRAME_X_WINDOW (f))
+ /* See the comment above x_compute_root_window_offset
+ for why this optimization is performed. */
+ xi_compute_root_window_offset (f, xev);
+
/* GTK handles TAB events in an undesirable manner, so
keyboard events are always dropped. But as a side
effect, the user time will no longer be set by GDK,
@@ -22469,7 +22888,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
&xkey, (char *) copy_bufptr,
copy_bufsiz, &keysym,
&status_return);
- coding = Qnil;
+ coding = FRAME_X_XIM_CODING (f);
if (status_return == XBufferOverflow)
{
@@ -22835,24 +23254,36 @@ handle_one_xevent (struct x_display_info *dpyinfo,
any_changed = true;
}
- x_catch_errors (dpyinfo->display);
- info = XIQueryDevice (dpyinfo->display, hev->info[i].deviceid,
- &ndevices);
- x_uncatch_errors ();
+ /* Under unknown circumstances, multiple
+ XIDeviceEnabled events are sent at once,
+ causing the device to be duplicated. Check
+ that the device doesn't exist before adding
+ it. */
- if (info && info->enabled)
+ if (!xi_device_from_id (dpyinfo,
+ hev->info[i].deviceid))
{
- dpyinfo->devices
- = xrealloc (dpyinfo->devices, (sizeof *dpyinfo->devices
- * ++dpyinfo->num_devices));
- memset (dpyinfo->devices + dpyinfo->num_devices - 1,
- 0, sizeof *dpyinfo->devices);
- device = &dpyinfo->devices[dpyinfo->num_devices - 1];
- xi_populate_device_from_info (device, info);
- }
+ x_catch_errors (dpyinfo->display);
+ info = XIQueryDevice (dpyinfo->display,
+ hev->info[i].deviceid,
+ &ndevices);
+ x_uncatch_errors ();
- if (info)
- XIFreeDeviceInfo (info);
+ if (info && info->enabled)
+ {
+ dpyinfo->devices
+ = xrealloc (dpyinfo->devices,
+ (sizeof *dpyinfo->devices
+ * ++dpyinfo->num_devices));
+ memset (dpyinfo->devices + dpyinfo->num_devices - 1,
+ 0, sizeof *dpyinfo->devices);
+ device = &dpyinfo->devices[dpyinfo->num_devices - 1];
+ xi_populate_device_from_info (device, info);
+ }
+
+ if (info)
+ XIFreeDeviceInfo (info);
+ }
}
else if (hev->info[i].flags & XIDeviceDisabled)
disabled[n_disabled++] = hev->info[i].deviceid;
@@ -22938,6 +23369,11 @@ handle_one_xevent (struct x_display_info *dpyinfo,
f = x_window_to_frame (dpyinfo, xev->event);
+ if (f)
+ /* See the comment above x_compute_root_window_offset
+ for why this optimization is performed. */
+ xi_compute_root_window_offset (f, xev);
+
#ifdef HAVE_GTK3
menu_bar_p = (f && FRAME_X_OUTPUT (f)->menubar_widget
&& xg_event_is_for_menubar (f, event));
@@ -23126,8 +23562,12 @@ handle_one_xevent (struct x_display_info *dpyinfo,
#endif
any = x_window_to_frame (dpyinfo, pev->event);
+
if (any)
{
+ if (pev->event == FRAME_X_WINDOW (any))
+ xi_compute_root_window_offset_pinch (any, pev);
+
inev.ie.kind = PINCH_EVENT;
inev.ie.modifiers = x_x_to_emacs_modifiers (FRAME_DISPLAY_INFO (any),
pev->mods.effective);
@@ -23521,7 +23961,6 @@ handle_one_xevent (struct x_display_info *dpyinfo,
#endif
OTHER:
#ifdef USE_X_TOOLKIT
- block_input ();
if (*finish != X_EVENT_DROP)
{
/* Ignore some obviously bogus ConfigureNotify events that
@@ -23538,7 +23977,6 @@ handle_one_xevent (struct x_display_info *dpyinfo,
#endif
}
}
- unblock_input ();
#endif /* USE_X_TOOLKIT */
#if defined USE_GTK && !defined HAVE_GTK3 && defined HAVE_XINPUT2
if (*finish != X_EVENT_DROP && copy)
@@ -23560,12 +23998,6 @@ handle_one_xevent (struct x_display_info *dpyinfo,
count++;
}
-#ifdef USE_TOOLKIT_SCROLL_BARS
- if (event->xany.type == ClientMessage
- && inev.ie.kind == SCROLL_BAR_CLICK_EVENT)
- x_unprotect_window_for_callback (dpyinfo);
-#endif
-
if (do_help
&& !(hold_quit && hold_quit->kind != NO_EVENT))
{
@@ -24705,7 +25137,8 @@ x_connection_closed (Display *dpy, const char *error_message, bool ioerror)
if (x_dnd_last_seen_window != None
&& x_dnd_last_protocol_version != -1)
x_dnd_send_leave (x_dnd_frame,
- x_dnd_last_seen_window);
+ x_dnd_last_seen_window,
+ x_dnd_last_seen_toplevel);
else if (x_dnd_last_seen_window != None
&& !XM_DRAG_STYLE_IS_DROP_ONLY (x_dnd_last_motif_style)
&& x_dnd_last_motif_style != XM_DRAG_STYLE_NONE
@@ -25115,9 +25548,10 @@ xim_destroy_callback (XIM xim, XPointer client_data, XPointer call_data)
static void
xim_open_dpy (struct x_display_info *dpyinfo, char *resource_name)
{
+#ifdef HAVE_XIM
XIM xim;
+ const char *locale;
-#ifdef HAVE_XIM
if (use_xim)
{
if (dpyinfo->xim)
@@ -25140,6 +25574,14 @@ xim_open_dpy (struct x_display_info *dpyinfo, char *resource_name)
destroy.client_data = (XPointer)dpyinfo;
XSetIMValues (xim, XNDestroyCallback, &destroy, NULL);
#endif
+
+ locale = XLocaleOfIM (xim);
+
+ /* Now try to determine the coding system that should be
+ used. locale is in Host Portable Character Encoding, and
+ as such can be passed to build_string as is. */
+ dpyinfo->xim_coding = safe_call1 (Vx_input_coding_function,
+ build_string (locale));
}
}
@@ -26469,8 +26911,7 @@ x_ewmh_activate_frame (struct frame *f)
dpyinfo = FRAME_DISPLAY_INFO (f);
- if (FRAME_VISIBLE_P (f)
- && x_wm_supports (f, dpyinfo->Xatom_net_active_window))
+ if (FRAME_VISIBLE_P (f))
{
/* See the documentation at
https://specifications.freedesktop.org/wm-spec/wm-spec-latest.html
@@ -26530,14 +26971,23 @@ x_focus_frame (struct frame *f, bool noactivate)
xembed_request_focus (f);
else
{
+ if (!noactivate
+ && x_wm_supports (f, dpyinfo->Xatom_net_active_window))
+ {
+ /* When window manager activation is possible, use it
+ instead. The window manager is expected to perform any
+ necessary actions such as raising the frame, moving it to
+ the current workspace, and mapping it, etc, before moving
+ input focus to the frame. */
+ x_ewmh_activate_frame (f);
+ return;
+ }
+
/* Ignore any BadMatch error this request might result in. */
x_ignore_errors_for_next_request (dpyinfo);
XSetInputFocus (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f),
RevertToParent, CurrentTime);
x_stop_ignoring_errors (dpyinfo);
-
- if (!noactivate)
- x_ewmh_activate_frame (f);
}
}
@@ -27169,6 +27619,13 @@ x_free_frame_resources (struct frame *f)
#if defined HAVE_XSYNCTRIGGERFENCE && !defined USE_GTK && defined HAVE_CLOCK_GETTIME
x_sync_free_fences (f);
#endif
+
+#ifdef USE_TOOLKIT_SCROLL_BARS
+ /* Since the frame was destroyed, we can no longer guarantee
+ that scroll bar events will be received. Clear
+ protected_windows. */
+ dpyinfo->n_protected_windows = 0;
+#endif
}
#ifdef HAVE_GTK3
@@ -27194,6 +27651,16 @@ x_free_frame_resources (struct frame *f)
if (f == hlinfo->mouse_face_mouse_frame)
reset_mouse_highlight (hlinfo);
+#ifdef HAVE_XINPUT2
+ /* Consider a frame being unfocused with no following FocusIn event
+ while an older focus from another seat exists. The client
+ pointer should then revert to the other seat, so handle potential
+ focus changes. */
+
+ if (dpyinfo->supports_xi2)
+ xi_handle_focus_change (dpyinfo);
+#endif
+
unblock_input ();
}
@@ -27420,6 +27887,31 @@ x_get_atom_name (struct x_display_info *dpyinfo, Atom atom,
return value;
}
+#ifndef USE_GTK
+
+/* Set up XEmbed for F, and change its save set to handle the parent
+ being destroyed. */
+
+bool
+x_embed_frame (struct x_display_info *dpyinfo, struct frame *f)
+{
+ bool rc;
+
+ x_catch_errors (dpyinfo->display);
+ /* Catch errors; the target window might no longer exist. */
+ XReparentWindow (dpyinfo->display, FRAME_OUTER_WINDOW (f),
+ FRAME_OUTPUT_DATA (f)->parent_desc, 0, 0);
+ rc = x_had_errors_p (dpyinfo->display);
+ x_uncatch_errors_after_check ();
+
+ if (rc)
+ return false;
+
+ return true;
+}
+
+#endif
+
/* Setting window manager hints. */
@@ -27452,8 +27944,11 @@ x_wm_set_size_hint (struct frame *f, long flags, bool user_position)
eassert (XtIsWMShell (f->output_data.x->widget));
shell = (WMShellWidget) f->output_data.x->widget;
- shell->wm.size_hints.flags &= ~(PPosition | USPosition);
- shell->wm.size_hints.flags |= flags & (PPosition | USPosition);
+ if (flags)
+ {
+ shell->wm.size_hints.flags &= ~(PPosition | USPosition);
+ shell->wm.size_hints.flags |= flags & (PPosition | USPosition);
+ }
if (user_position)
{
@@ -27885,7 +28380,7 @@ xi_select_hierarchy_events (struct x_display_info *dpyinfo)
extension.
Value is 0 if GTK was not built with the input extension, or if it
- was explictly disabled, 1 if GTK enabled the input extension and
+ was explicitly disabled, 1 if GTK enabled the input extension and
the version was successfully determined, and 2 if that information
could not be determined. */
@@ -28599,10 +29094,13 @@ x_term_init (Lisp_Object display_name, char *xrm_option, char *resource_name)
(RRScreenChangeNotifyMask
| RRCrtcChangeNotifyMask
| RROutputChangeNotifyMask
- /* Emacs doesn't actually need this, but GTK
- selects for it when the display is
+#ifdef USE_GTK
+ /* Emacs doesn't actually need this, but
+ GTK selects for it when the display is
initialized. */
- | RROutputPropertyNotifyMask));
+ | RROutputPropertyNotifyMask
+#endif
+ ));
dpyinfo->last_monitor_attributes_list
= Fx_display_monitor_attributes_list (term);
@@ -29414,7 +29912,7 @@ mark_xterm (void)
}
#if defined HAVE_XINPUT2 || defined USE_TOOLKIT_SCROLL_BARS \
- || defined HAVE_XRANDR || defined USE_GTK
+ || defined HAVE_XRANDR || defined USE_GTK || defined HAVE_X_I18N
for (dpyinfo = x_display_list; dpyinfo; dpyinfo = dpyinfo->next)
{
#ifdef HAVE_XINPUT2
@@ -29428,6 +29926,9 @@ mark_xterm (void)
#if defined HAVE_XRANDR || defined USE_GTK
mark_object (dpyinfo->last_monitor_attributes_list);
#endif
+#if defined HAVE_X_I18N
+ mark_object (dpyinfo->xim_coding);
+#endif
}
#endif
}
@@ -29637,6 +30138,9 @@ syms_of_xterm (void)
x_dnd_unsupported_drop_data = Qnil;
staticpro (&x_dnd_unsupported_drop_data);
+ /* Used by x_cr_export_frames. */
+ DEFSYM (Qconcat, "concat");
+
DEFSYM (Qvendor_specific_keysyms, "vendor-specific-keysyms");
DEFSYM (Qlatin_1, "latin-1");
DEFSYM (Qnow, "now");
@@ -29953,4 +30457,18 @@ on the same display.
In addition, when this variable is a list, only preserve the
selections whose names are contained within. */);
Vx_auto_preserve_selections = list2 (QCLIPBOARD, QPRIMARY);
+
+ DEFVAR_LISP ("x-input-coding-system", Vx_input_coding_system,
+ doc: /* Coding system used for input from X input methods.
+If a symbol and non-nil, this is the coding system that will be used
+to decode input from X input methods. It does not affect input from
+GTK native input methods enabled through `x-gtk-use-native-input'. */);
+ Vx_input_coding_system = Qnil;
+
+ DEFVAR_LISP ("x-input-coding-function", Vx_input_coding_function,
+ doc: /* Function used to determine the coding system used by input methods.
+It should accept a single argument, a string describing the locale of
+the input method, and return a coding system that can decode keyboard
+input generated by said input method. */);
+ Vx_input_coding_function = Qnil;
}
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
XIMStyles *xim_styles;
struct xim_inst_t *xim_callback_data;
XIMStyle preferred_xim_style;
+
+ /* The named coding system to use for this input method. */
+ Lisp_Object xim_coding;
#endif
/* A cache mapping color names to RGB values. */
@@ -656,7 +659,8 @@ struct x_display_info
Xatom_net_wm_sync_request, Xatom_net_wm_sync_request_counter,
Xatom_net_wm_sync_fences, Xatom_net_wm_frame_drawn, Xatom_net_wm_frame_timings,
Xatom_net_wm_user_time, Xatom_net_wm_user_time_window,
- Xatom_net_client_list_stacking, Xatom_net_wm_pid;
+ Xatom_net_client_list_stacking, Xatom_net_wm_pid,
+ Xatom_net_wm_bypass_compositor;
/* XSettings atoms and windows. */
Atom Xatom_xsettings_sel, Xatom_xsettings_prop, Xatom_xsettings_mgr;
@@ -1195,6 +1199,15 @@ struct x_output
XIEventMask *xi_masks;
int num_xi_masks;
#endif
+
+ /* Whether or not we are certain we know the offset from the root
+ window to this frame. */
+ bool window_offset_certain_p;
+
+ /* The offset of the edit window from the root window. This is
+ strictly an optimization to avoid extraneous synchronizing in
+ some cases. */
+ int root_x, root_y;
};
enum
@@ -1209,7 +1222,6 @@ enum
FOCUS_EXPLICIT = 2
};
-
/* Return the X output data for frame F. */
#define FRAME_X_OUTPUT(f) ((f)->output_data.x)
#define FRAME_OUTPUT_DATA(f) FRAME_X_OUTPUT (f)
@@ -1339,6 +1351,12 @@ extern void x_mark_frame_dirty (struct frame *f);
#define FRAME_X_XIM_STYLES(f) (FRAME_DISPLAY_INFO (f)->xim_styles)
#define FRAME_XIC_STYLE(f) ((f)->output_data.x->xic_style)
#define FRAME_XIC_FONTSET(f) ((f)->output_data.x->xic_xfs)
+#define FRAME_X_XIM_CODING(f) \
+ (SYMBOLP (Vx_input_coding_system) \
+ ? Vx_input_coding_system \
+ : (!NILP (FRAME_DISPLAY_INFO (f)->xim_coding) \
+ ? FRAME_DISPLAY_INFO(f)->xim_coding \
+ : Vlocale_coding_system))
/* X-specific scroll bar stuff. */
@@ -1588,6 +1606,7 @@ extern void x_wm_set_size_hint (struct frame *, long, bool);
&& defined HAVE_CLOCK_GETTIME
extern void x_sync_init_fences (struct frame *);
#endif
+extern bool x_embed_frame (struct x_display_info *, struct frame *);
extern void x_delete_terminal (struct terminal *);
extern Cursor x_create_font_cursor (struct x_display_info *, int);
@@ -1827,7 +1846,7 @@ extern void mark_xterm (void);
/* Is the frame embedded into another application? */
-#define FRAME_X_EMBEDDED_P(f) (FRAME_X_OUTPUT(f)->explicit_parent != 0)
+#define FRAME_X_EMBEDDED_P(f) (FRAME_X_OUTPUT (f)->explicit_parent != 0)
#define STORE_NATIVE_RECT(nr,rx,ry,rwidth,rheight) \
((nr).x = (rx), \