diff options
| author | Yuuki Harano <masm+github@masm11.me> | 2021-01-10 18:49:51 +0900 |
|---|---|---|
| committer | Yuuki Harano <masm+github@masm11.me> | 2021-01-10 18:49:51 +0900 |
| commit | aac33a8074c41354ffdb1236a342da16dca4a1bc (patch) | |
| tree | 3a99478549f66d3f93a282e29d2c302995a86a49 /src | |
| parent | 78fd106653a9e4fa7c9c3c9788540e2e15552254 (diff) | |
| parent | 690cf6b8d8b8827f046bc1e24b2e556afeff976c (diff) | |
Merge branch 'master' of git.sv.gnu.org:/srv/git/emacs into feature/pgtk
Diffstat (limited to 'src')
| -rw-r--r-- | src/buffer.c | 12 | ||||
| -rw-r--r-- | src/callproc.c | 31 | ||||
| -rw-r--r-- | src/casefiddle.c | 13 | ||||
| -rw-r--r-- | src/cmds.c | 21 | ||||
| -rw-r--r-- | src/commands.h | 8 | ||||
| -rw-r--r-- | src/emacs.c | 5 | ||||
| -rw-r--r-- | src/keyboard.c | 8 | ||||
| -rw-r--r-- | src/keyboard.h | 2 | ||||
| -rw-r--r-- | src/keymap.c | 93 | ||||
| -rw-r--r-- | src/keymap.h | 2 | ||||
| -rw-r--r-- | src/lisp.h | 11 | ||||
| -rw-r--r-- | src/minibuf.c | 3 | ||||
| -rw-r--r-- | src/nsfns.m | 14 | ||||
| -rw-r--r-- | src/nsmenu.m | 21 | ||||
| -rw-r--r-- | src/nsterm.h | 1 | ||||
| -rw-r--r-- | src/nsterm.m | 106 | ||||
| -rw-r--r-- | src/pdumper.c | 2 | ||||
| -rw-r--r-- | src/print.c | 3 | ||||
| -rw-r--r-- | src/process.c | 13 | ||||
| -rw-r--r-- | src/terminfo.c | 6 | ||||
| -rw-r--r-- | src/window.c | 24 | ||||
| -rw-r--r-- | src/window.h | 1 | ||||
| -rw-r--r-- | src/xdisp.c | 16 | ||||
| -rw-r--r-- | src/xterm.c | 8 |
24 files changed, 217 insertions, 207 deletions
diff --git a/src/buffer.c b/src/buffer.c index 81f7d922fdb..71ad5edd527 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -2602,8 +2602,6 @@ current buffer is cleared. */) p += bytes, pos += bytes; } } - if (narrowed) - Fnarrow_to_region (make_fixnum (begv), make_fixnum (zv)); } else { @@ -2682,9 +2680,6 @@ current buffer is cleared. */) if (pt != PT) TEMP_SET_PT (pt); - if (narrowed) - Fnarrow_to_region (make_fixnum (begv), make_fixnum (zv)); - /* Do this first, so that chars_in_text asks the right question. set_intervals_multibyte needs it too. */ bset_enable_multibyte_characters (current_buffer, Qt); @@ -6385,10 +6380,3 @@ nil NORECORD argument since it may lead to infinite recursion. */); Fput (intern_c_string ("erase-buffer"), Qdisabled, Qt); } - -void -keys_of_buffer (void) -{ - initial_define_key (control_x_map, 'b', "switch-to-buffer"); - initial_define_key (control_x_map, 'k', "kill-buffer"); -} diff --git a/src/callproc.c b/src/callproc.c index 8d2a5619eb8..1da315bef18 100644 --- a/src/callproc.c +++ b/src/callproc.c @@ -314,6 +314,7 @@ call_process (ptrdiff_t nargs, Lisp_Object *args, int filefd, #ifdef MSDOS /* Demacs 1.1.1 91/10/16 HIRANO Satoshi */ char *tempfile = NULL; #else + sigset_t oldset; pid_t pid = -1; #endif int child_errno; @@ -601,9 +602,12 @@ call_process (ptrdiff_t nargs, Lisp_Object *args, int filefd, #ifndef MSDOS + block_input (); + block_child_signal (&oldset); + child_errno = emacs_spawn (&pid, filefd, fd_output, fd_error, new_argv, env, - SSDATA (current_dir), NULL); + SSDATA (current_dir), NULL, &oldset); eassert ((child_errno == 0) == (0 < pid)); if (pid > 0) @@ -624,6 +628,9 @@ call_process (ptrdiff_t nargs, Lisp_Object *args, int filefd, } } + unblock_child_signal (&oldset); + unblock_input (); + if (pid < 0) report_file_errno (CHILD_SETUP_ERROR_DESC, Qnil, child_errno); @@ -1227,17 +1234,21 @@ child_setup (int in, int out, int err, char **new_argv, char **env, process image file ARGV[0]. Use ENVP for the environment block for the new process. Use CWD as working directory for the new process. If PTY is not NULL, it must be a pseudoterminal device. If PTY is - NULL, don't perform any terminal setup. */ + NULL, don't perform any terminal setup. OLDSET must be a pointer + to a signal set initialized by `block_child_signal'. Before + calling this function, call `block_input' and `block_child_signal'; + afterwards, call `unblock_input' and `unblock_child_signal'. Be + sure to call `unblock_child_signal' only after registering NEWPID + in a list where `handle_child_signal' can find it! */ int emacs_spawn (pid_t *newpid, int std_in, int std_out, int std_err, - char **argv, char **envp, const char *cwd, const char *pty) + char **argv, char **envp, const char *cwd, + const char *pty, const sigset_t *oldset) { - sigset_t oldset; int pid; - block_input (); - block_child_signal (&oldset); + eassert (input_blocked_p ()); #ifndef WINDOWSNT /* vfork, and prevent local vars from being clobbered by the vfork. */ @@ -1249,6 +1260,7 @@ emacs_spawn (pid_t *newpid, int std_in, int std_out, int std_err, int volatile stdout_volatile = std_out; int volatile stderr_volatile = std_err; char **volatile envp_volatile = envp; + const sigset_t *volatile oldset_volatile = oldset; #ifdef DARWIN_OS /* Darwin doesn't let us run setsid after a vfork, so use fork when @@ -1270,6 +1282,7 @@ emacs_spawn (pid_t *newpid, int std_in, int std_out, int std_err, std_out = stdout_volatile; std_err = stderr_volatile; envp = envp_volatile; + oldset = oldset_volatile; if (pid == 0) #endif /* not WINDOWSNT */ @@ -1364,7 +1377,7 @@ emacs_spawn (pid_t *newpid, int std_in, int std_out, int std_err, #endif /* Stop blocking SIGCHLD in the child. */ - unblock_child_signal (&oldset); + unblock_child_signal (oldset); if (pty_flag) child_setup_tty (std_out); @@ -1382,10 +1395,6 @@ emacs_spawn (pid_t *newpid, int std_in, int std_out, int std_err, int vfork_error = pid < 0 ? errno : 0; - /* Stop blocking in the parent. */ - unblock_child_signal (&oldset); - unblock_input (); - if (pid < 0) { eassert (0 < vfork_error); diff --git a/src/casefiddle.c b/src/casefiddle.c index a948bb3bc88..a7a25414909 100644 --- a/src/casefiddle.c +++ b/src/casefiddle.c @@ -682,16 +682,3 @@ Called with one argument METHOD which can be: defsubr (&Sdowncase_word); defsubr (&Scapitalize_word); } - -void -keys_of_casefiddle (void) -{ - initial_define_key (control_x_map, Ctl ('U'), "upcase-region"); - Fput (intern ("upcase-region"), Qdisabled, Qt); - initial_define_key (control_x_map, Ctl ('L'), "downcase-region"); - Fput (intern ("downcase-region"), Qdisabled, Qt); - - initial_define_key (meta_map, 'u', "upcase-word"); - initial_define_key (meta_map, 'l', "downcase-word"); - initial_define_key (meta_map, 'c', "capitalize-word"); -} diff --git a/src/cmds.c b/src/cmds.c index 798fd68a920..1547db80e88 100644 --- a/src/cmds.c +++ b/src/cmds.c @@ -529,24 +529,3 @@ This is run after inserting the character. */); defsubr (&Sdelete_char); defsubr (&Sself_insert_command); } - -void -keys_of_cmds (void) -{ - int n; - - initial_define_key (global_map, Ctl ('I'), "self-insert-command"); - for (n = 040; n < 0177; n++) - initial_define_key (global_map, n, "self-insert-command"); -#ifdef MSDOS - for (n = 0200; n < 0240; n++) - initial_define_key (global_map, n, "self-insert-command"); -#endif - for (n = 0240; n < 0400; n++) - initial_define_key (global_map, n, "self-insert-command"); - - initial_define_key (global_map, Ctl ('A'), "beginning-of-line"); - initial_define_key (global_map, Ctl ('B'), "backward-char"); - initial_define_key (global_map, Ctl ('E'), "end-of-line"); - initial_define_key (global_map, Ctl ('F'), "forward-char"); -} diff --git a/src/commands.h b/src/commands.h index a09858d050d..2205ebf7d39 100644 --- a/src/commands.h +++ b/src/commands.h @@ -23,14 +23,6 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ #define Ctl(c) ((c)&037) -/* Define the names of keymaps, just so people can refer to them in - calls to initial_define_key. These should *not* be used after - initialization; use-global-map doesn't affect these; it sets - current_global_map instead. */ -extern Lisp_Object global_map; -extern Lisp_Object meta_map; -extern Lisp_Object control_x_map; - /* If not Qnil, this is a switch-frame event which we decided to put off until the end of a key sequence. This should be read as the next command input, after any Vunread_command_events. diff --git a/src/emacs.c b/src/emacs.c index 61d2023b4da..461d1b72e4c 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -1969,12 +1969,7 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem syms_of_json (); #endif - keys_of_casefiddle (); - keys_of_cmds (); - keys_of_buffer (); keys_of_keyboard (); - keys_of_keymap (); - keys_of_window (); } else { diff --git a/src/keyboard.c b/src/keyboard.c index 2446f078fde..4540b3179b5 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -285,7 +285,7 @@ bool input_pending; with the input rate, but if it can keep up just enough that there's no input_pending when we begin the command, then redisplay is not skipped which results in better feedback to the user. */ -static bool input_was_pending; +bool input_was_pending; /* Circular buffer for pre-read keyboard input. */ @@ -12396,12 +12396,6 @@ syms_of_keyboard_for_pdumper (void) void keys_of_keyboard (void) { - initial_define_key (global_map, Ctl ('Z'), "suspend-emacs"); - initial_define_key (control_x_map, Ctl ('Z'), "suspend-emacs"); - initial_define_key (meta_map, Ctl ('C'), "exit-recursive-edit"); - initial_define_key (global_map, Ctl (']'), "abort-recursive-edit"); - initial_define_key (meta_map, 'x', "execute-extended-command"); - initial_define_lispy_key (Vspecial_event_map, "delete-frame", "handle-delete-frame"); #ifdef HAVE_NTGUI diff --git a/src/keyboard.h b/src/keyboard.h index 91c6f4604f9..8bdffaa2bff 100644 --- a/src/keyboard.h +++ b/src/keyboard.h @@ -432,7 +432,7 @@ extern int parse_solitary_modifier (Lisp_Object symbol); extern Lisp_Object real_this_command; extern int quit_char; - +extern bool input_was_pending; extern unsigned int timers_run; extern bool menu_separator_name_p (const char *); diff --git a/src/keymap.c b/src/keymap.c index 1eeea81f627..1197f6fd4a5 100644 --- a/src/keymap.c +++ b/src/keymap.c @@ -59,22 +59,6 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ Lisp_Object current_global_map; /* Current global keymap. */ -Lisp_Object global_map; /* Default global key bindings. */ - -Lisp_Object meta_map; /* The keymap used for globally bound - ESC-prefixed default commands. */ - -Lisp_Object control_x_map; /* The keymap used for globally bound - C-x-prefixed default commands. */ - - /* The keymap used by the minibuf for local - bindings when spaces are allowed in the - minibuf. */ - - /* The keymap used by the minibuf for local - bindings when spaces are not encouraged - in the minibuf. */ - /* Alist of elements like (DEL . "\d"). */ static Lisp_Object exclude_keys; @@ -140,19 +124,6 @@ in case you use it as a menu with `x-popup-menu'. */) return list1 (Qkeymap); } -/* This function is used for installing the standard key bindings - at initialization time. - - For example: - - initial_define_key (control_x_map, Ctl('X'), "exchange-point-and-mark"); */ - -void -initial_define_key (Lisp_Object keymap, int key, const char *defname) -{ - store_in_keymap (keymap, make_fixnum (key), intern_c_string (defname)); -} - void initial_define_lispy_key (Lisp_Object keymap, const char *keyname, const char *defname) { @@ -1741,28 +1712,6 @@ bindings; see the description of `lookup-key' for more details about this. */) return Flist (j, maps); } -DEFUN ("define-prefix-command", Fdefine_prefix_command, Sdefine_prefix_command, 1, 3, 0, - doc: /* Define COMMAND as a prefix command. COMMAND should be a symbol. -A new sparse keymap is stored as COMMAND's function definition and its -value. -This prepares COMMAND for use as a prefix key's binding. -If a second optional argument MAPVAR is given, it should be a symbol. -The map is then stored as MAPVAR's value instead of as COMMAND's -value; but COMMAND is still defined as a function. -The third optional argument NAME, if given, supplies a menu name -string for the map. This is required to use the keymap as a menu. -This function returns COMMAND. */) - (Lisp_Object command, Lisp_Object mapvar, Lisp_Object name) -{ - Lisp_Object map = Fmake_sparse_keymap (name); - Ffset (command, map); - if (!NILP (mapvar)) - Fset (mapvar, map); - else - Fset (command, map); - return command; -} - DEFUN ("use-global-map", Fuse_global_map, Suse_global_map, 1, 1, 0, doc: /* Select KEYMAP as the global keymap. */) (Lisp_Object keymap) @@ -2217,11 +2166,21 @@ See `text-char-description' for describing character codes. */) { if (NILP (no_angles)) { - Lisp_Object result; - char *buffer = SAFE_ALLOCA (sizeof "<>" - + SBYTES (SYMBOL_NAME (key))); - esprintf (buffer, "<%s>", SDATA (SYMBOL_NAME (key))); - result = build_string (buffer); + Lisp_Object namestr = SYMBOL_NAME (key); + const char *sym = SSDATA (namestr); + ptrdiff_t len = SBYTES (namestr); + /* Find the extent of the modifier prefix, like "C-M-". */ + int i = 0; + while (i < len - 3 && sym[i + 1] == '-' && strchr ("CMSsHA", sym[i])) + i += 2; + /* First I bytes of SYM are modifiers; put <> around the rest. */ + char *buffer = SAFE_ALLOCA (len + 3); + memcpy (buffer, sym, i); + buffer[i] = '<'; + memcpy (buffer + i + 1, sym + i, len - i); + buffer [len + 1] = '>'; + buffer [len + 2] = '\0'; + Lisp_Object result = build_string (buffer); SAFE_FREE (); return result; } @@ -3195,21 +3154,9 @@ syms_of_keymap (void) Each one is the value of a Lisp variable, and is also pointed to by a C variable */ - global_map = Fmake_keymap (Qnil); - Fset (intern_c_string ("global-map"), global_map); - - current_global_map = global_map; - staticpro (&global_map); + current_global_map = Qnil; staticpro (¤t_global_map); - meta_map = Fmake_keymap (Qnil); - Fset (intern_c_string ("esc-map"), meta_map); - Ffset (intern_c_string ("ESC-prefix"), meta_map); - - control_x_map = Fmake_keymap (Qnil); - Fset (intern_c_string ("ctl-x-map"), control_x_map); - Ffset (intern_c_string ("Control-X-prefix"), control_x_map); - exclude_keys = pure_list (pure_cons (build_pure_c_string ("DEL"), build_pure_c_string ("\\d")), pure_cons (build_pure_c_string ("TAB"), build_pure_c_string ("\\t")), @@ -3311,7 +3258,6 @@ be preferred. */); defsubr (&Sminor_mode_key_binding); defsubr (&Sdefine_key); defsubr (&Slookup_key); - defsubr (&Sdefine_prefix_command); defsubr (&Suse_global_map); defsubr (&Suse_local_map); defsubr (&Scurrent_local_map); @@ -3328,10 +3274,3 @@ be preferred. */); defsubr (&Swhere_is_internal); defsubr (&Sdescribe_buffer_bindings); } - -void -keys_of_keymap (void) -{ - initial_define_key (global_map, 033, "ESC-prefix"); - initial_define_key (global_map, Ctl ('X'), "Control-X-prefix"); -} diff --git a/src/keymap.h b/src/keymap.h index 072c09348e2..f417301c8f2 100644 --- a/src/keymap.h +++ b/src/keymap.h @@ -37,10 +37,8 @@ extern char *push_key_description (EMACS_INT, char *); extern Lisp_Object access_keymap (Lisp_Object, Lisp_Object, bool, bool, bool); extern Lisp_Object get_keymap (Lisp_Object, bool, bool); extern ptrdiff_t current_minor_maps (Lisp_Object **, Lisp_Object **); -extern void initial_define_key (Lisp_Object, int, const char *); extern void initial_define_lispy_key (Lisp_Object, const char *, const char *); extern void syms_of_keymap (void); -extern void keys_of_keymap (void); typedef void (*map_keymap_function_t) (Lisp_Object key, Lisp_Object val, Lisp_Object args, void *data); diff --git a/src/lisp.h b/src/lisp.h index 0ad788cff84..d139df93424 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -1478,8 +1478,8 @@ struct Lisp_String { struct { - ptrdiff_t size; - ptrdiff_t size_byte; + ptrdiff_t size; /* MSB is used as the markbit. */ + ptrdiff_t size_byte; /* Set to -1 for unibyte strings. */ INTERVAL intervals; /* Text properties in this string. */ unsigned char *data; } s; @@ -3561,7 +3561,6 @@ extern void swap_in_global_binding (struct Lisp_Symbol *); /* Defined in cmds.c */ extern void syms_of_cmds (void); -extern void keys_of_cmds (void); /* Defined in coding.c. */ extern Lisp_Object detect_coding_system (const unsigned char *, ptrdiff_t, @@ -4262,7 +4261,6 @@ extern Lisp_Object get_truename_buffer (Lisp_Object); extern void init_buffer_once (void); extern void init_buffer (void); extern void syms_of_buffer (void); -extern void keys_of_buffer (void); /* Defined in marker.c. */ @@ -4359,7 +4357,6 @@ extern void syms_of_callint (void); /* Defined in casefiddle.c. */ extern void syms_of_casefiddle (void); -extern void keys_of_casefiddle (void); /* Defined in casetab.c. */ @@ -4498,8 +4495,8 @@ extern void setup_process_coding_systems (Lisp_Object); # define CHILD_SETUP_ERROR_DESC "Doing vfork" #endif -extern int emacs_spawn (pid_t *, int, int, int, char **, char **, const char *, - const char *); +extern int emacs_spawn (pid_t *, int, int, int, char **, char **, + const char *, const char *, const sigset_t *); extern char **make_environment_block (Lisp_Object); extern void init_callproc_1 (void); extern void init_callproc (void); diff --git a/src/minibuf.c b/src/minibuf.c index 8b235690199..5ee440f6622 100644 --- a/src/minibuf.c +++ b/src/minibuf.c @@ -2013,9 +2013,6 @@ syms_of_minibuf (void) DEFSYM (Qminibuffer_setup_hook, "minibuffer-setup-hook"); DEFSYM (Qminibuffer_exit_hook, "minibuffer-exit-hook"); - /* The maximum length of a minibuffer history. */ - DEFSYM (Qhistory_length, "history-length"); - DEFSYM (Qcurrent_input_method, "current-input-method"); DEFSYM (Qactivate_input_method, "activate-input-method"); DEFSYM (Qcase_fold_search, "case-fold-search"); diff --git a/src/nsfns.m b/src/nsfns.m index ee2daea0723..ae114f83e4d 100644 --- a/src/nsfns.m +++ b/src/nsfns.m @@ -1485,14 +1485,14 @@ Some window managers may refuse to restack windows. */) if (FRAME_NS_VIEW (f1) && FRAME_NS_VIEW (f2)) { - NSWindow *window = [FRAME_NS_VIEW (f1) window]; - NSInteger window2 = [[FRAME_NS_VIEW (f2) window] windowNumber]; - NSWindowOrderingMode flag = NILP (above) ? NSWindowBelow : NSWindowAbove; + EmacsWindow *window = (EmacsWindow *)[FRAME_NS_VIEW (f1) window]; + NSWindow *window2 = [FRAME_NS_VIEW (f2) window]; + BOOL flag = !NILP (above); - [window orderWindow: flag - relativeTo: window2]; - - return Qt; + if ([window restackWindow:window2 above:!NILP (above)]) + return Qt; + else + return Qnil; } else { diff --git a/src/nsmenu.m b/src/nsmenu.m index 9b56958100a..8086f56854e 100644 --- a/src/nsmenu.m +++ b/src/nsmenu.m @@ -145,6 +145,10 @@ ns_update_menubar (struct frame *f, bool deep_p) t = -(1000*tb.time+tb.millitm); #endif +#ifdef NS_IMPL_GNUSTEP + deep_p = 1; /* See comment in menuNeedsUpdate. */ +#endif + if (deep_p) { /* Make a widget-value tree representing the entire menu trees. */ @@ -433,21 +437,22 @@ set_frame_menubar (struct frame *f, bool first_time, bool deep_p) } -/* Delegate method called when a submenu is being opened: run a 'deep' call - to set_frame_menubar. */ - -/* TODO: GNUstep calls this method when the menu is still being built - which throws it into an infinite loop. One possible solution is to - use menuWillOpen instead, but the Apple docs explicitly warn - against changing the contents of the menu in it. I don't know what - the right thing to do for GNUstep is. */ +/* Delegate method called when a submenu is being opened: run a 'deep' + call to ns_update_menubar. */ - (void)menuNeedsUpdate: (NSMenu *)menu { if (!FRAME_LIVE_P (SELECTED_FRAME ())) return; +#ifdef NS_IMPL_COCOA +/* TODO: GNUstep calls this method when the menu is still being built + which results in a recursive stack overflow. One possible solution + is to use menuWillOpen instead, but the Apple docs explicitly warn + against changing the contents of the menu in it. I don't know what + the right thing to do for GNUstep is. */ if (needsUpdate) ns_update_menubar (SELECTED_FRAME (), true); +#endif } diff --git a/src/nsterm.h b/src/nsterm.h index 3fb64494f76..2c9d8e85ba9 100644 --- a/src/nsterm.h +++ b/src/nsterm.h @@ -498,6 +498,7 @@ typedef id instancetype; NSPoint grabOffset; } +- (BOOL)restackWindow:(NSWindow *)win above:(BOOL)above; - (void)setAppearance; @end diff --git a/src/nsterm.m b/src/nsterm.m index 27310639508..2defb9e2eec 100644 --- a/src/nsterm.m +++ b/src/nsterm.m @@ -8693,6 +8693,112 @@ not_in_argv (NSString *arg) @implementation EmacsWindow +/* It seems the only way to reorder child frames is by removing them + from the parent and then reattaching them in the correct order. */ + +- (void)orderFront:(id)sender +{ + NSTRACE ("[EmacsWindow orderFront:]"); + + NSWindow *parent = [self parentWindow]; + if (parent) + { + [parent removeChildWindow:self]; + [parent addChildWindow:self ordered:NSWindowAbove]; + } + else + [super orderFront:sender]; +} + +- (void)makeKeyAndOrderFront:(id)sender +{ + NSTRACE ("[EmacsWindow makeKeyAndOrderFront:]"); + + if ([self parentWindow]) + { + [self orderFront:sender]; + [self makeKeyWindow]; + } + else + [super makeKeyAndOrderFront:sender]; +} + + +/* The array returned by [NSWindow parentWindow] may already be + sorted, but the documentation doesn't tell us whether or not it is, + so to be safe we'll sort it. */ +NSInteger nswindow_orderedIndex_sort (id w1, id w2, void *c) +{ + NSInteger i1 = [w1 orderedIndex]; + NSInteger i2 = [w2 orderedIndex]; + + if (i1 > i2) + return NSOrderedAscending; + if (i1 < i2) + return NSOrderedDescending; + + return NSOrderedSame; +} + +- (void)orderBack:(id)sender +{ + NSTRACE ("[EmacsWindow orderBack:]"); + + NSWindow *parent = [self parentWindow]; + if (parent) + { + NSArray *children = [[parent childWindows] + sortedArrayUsingFunction:nswindow_orderedIndex_sort + context:nil]; + [parent removeChildWindow:self]; + [parent addChildWindow:self ordered:NSWindowAbove]; + + for (NSWindow *win in children) + { + if (win != self) + { + [parent removeChildWindow:win]; + [parent addChildWindow:win ordered:NSWindowAbove]; + } + } + } + else + [super orderBack:sender]; +} + +- (BOOL)restackWindow:(NSWindow *)win above:(BOOL)above +{ + NSTRACE ("[EmacsWindow restackWindow:above:]"); + + /* If parent windows don't match we can't restack these frames + without changing the parents. */ + if ([self parentWindow] != [win parentWindow]) + return NO; + else if (![self parentWindow]) + [self orderWindow:(above ? NSWindowAbove : NSWindowBelow) + relativeTo:[win windowNumber]]; + else + { + NSInteger index; + NSWindow *parent = [self parentWindow]; + NSMutableArray *children = [[[parent childWindows] + sortedArrayUsingFunction:nswindow_orderedIndex_sort + context:nil] + mutableCopy]; + [children removeObject:self]; + index = [children indexOfObject:win]; + [children insertObject:self atIndex:(above ? index+1 : index)]; + + for (NSWindow *w in children) + { + [parent removeChildWindow:w]; + [parent addChildWindow:w ordered:NSWindowAbove]; + } + } + + return YES; +} + #ifdef NS_IMPL_COCOA - (id)accessibilityAttributeValue:(NSString *)attribute { diff --git a/src/pdumper.c b/src/pdumper.c index 6956ee36829..116cc28dbba 100644 --- a/src/pdumper.c +++ b/src/pdumper.c @@ -2058,7 +2058,7 @@ dump_interval_tree (struct dump_context *ctx, static dump_off dump_string (struct dump_context *ctx, const struct Lisp_String *string) { -#if CHECK_STRUCTS && !defined (HASH_Lisp_String_86FEA6EC7C) +#if CHECK_STRUCTS && !defined (HASH_Lisp_String_348C2B2FDB) # error "Lisp_String changed. See CHECK_STRUCTS comment in config.h." #endif /* If we have text properties, write them _after_ the string so that diff --git a/src/print.c b/src/print.c index 94a8bcbf882..14af9195475 100644 --- a/src/print.c +++ b/src/print.c @@ -1557,7 +1557,8 @@ print_vectorlike (Lisp_Object obj, Lisp_Object printcharfun, bool escapeflag, /* Implement a readable output, e.g.: #s(hash-table size 2 test equal data (k1 v1 k2 v2)) */ /* Always print the size. */ - int len = sprintf (buf, "#s(hash-table size %"pD"d", ASIZE (h->next)); + int len = sprintf (buf, "#s(hash-table size %"pD"d", + HASH_TABLE_SIZE (h)); strout (buf, len, len, printcharfun); if (!NILP (h->test.name)) diff --git a/src/process.c b/src/process.c index 3550f623c6a..25883f911f1 100644 --- a/src/process.c +++ b/src/process.c @@ -692,8 +692,7 @@ status_convert (int w) if (WIFSTOPPED (w)) return Fcons (Qstop, Fcons (make_fixnum (WSTOPSIG (w)), Qnil)); else if (WIFEXITED (w)) - return Fcons (Qexit, Fcons (make_fixnum (WEXITSTATUS (w)), - WCOREDUMP (w) ? Qt : Qnil)); + return Fcons (Qexit, Fcons (make_fixnum (WEXITSTATUS (w)), Qnil)); else if (WIFSIGNALED (w)) return Fcons (Qsignal, Fcons (make_fixnum (WTERMSIG (w)), WCOREDUMP (w) ? Qt : Qnil)); @@ -2059,6 +2058,7 @@ create_process (Lisp_Object process, char **new_argv, Lisp_Object current_dir) bool pty_flag = 0; char pty_name[PTY_NAME_SIZE]; Lisp_Object lisp_pty_name = Qnil; + sigset_t oldset; inchannel = outchannel = -1; @@ -2139,13 +2139,16 @@ create_process (Lisp_Object process, char **new_argv, Lisp_Object current_dir) setup_process_coding_systems (process); char **env = make_environment_block (current_dir); + block_input (); + block_child_signal (&oldset); + pty_flag = p->pty_flag; eassert (pty_flag == ! NILP (lisp_pty_name)); vfork_errno = emacs_spawn (&pid, forkin, forkout, forkerr, new_argv, env, SSDATA (current_dir), - pty_flag ? SSDATA (lisp_pty_name) : NULL); + pty_flag ? SSDATA (lisp_pty_name) : NULL, &oldset); eassert ((vfork_errno == 0) == (0 < pid)); @@ -2153,6 +2156,10 @@ create_process (Lisp_Object process, char **new_argv, Lisp_Object current_dir) if (pid >= 0) p->alive = 1; + /* Stop blocking in the parent. */ + unblock_child_signal (&oldset); + unblock_input (); + /* Environment block no longer needed. */ unbind_to (count, Qnil); diff --git a/src/terminfo.c b/src/terminfo.c index 15aff317f15..a9c9572bbb2 100644 --- a/src/terminfo.c +++ b/src/terminfo.c @@ -23,10 +23,10 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ /* Define these variables that serve as global parameters to termcap, so that we do not need to conditionalize the places in Emacs - that set them. But don't do that for terminfo, as that could - cause link errors when using -fno-common. */ + that set them. But don't do that if terminfo defines them, as that + could cause link errors when using -fno-common. */ -#if !TERMINFO +#ifndef TERMINFO_DEFINES_BC char *UP, *BC, PC; #endif diff --git a/src/window.c b/src/window.c index ba8682eed7c..5e78aa400b5 100644 --- a/src/window.c +++ b/src/window.c @@ -8100,6 +8100,18 @@ and scrolling positions. */) return Qt; return Qnil; } + +DEFUN ("window-bump-use-time", Fwindow_bump_use_time, + Swindow_bump_use_time, 1, 1, 0, + doc: /* Mark WINDOW as having been recently used. */) + (Lisp_Object window) +{ + struct window *w = decode_valid_window (window); + + w->use_time = ++window_select_count; + return Qnil; +} + static void init_window_once_for_pdumper (void); @@ -8573,6 +8585,7 @@ displayed after a scrolling operation to be somewhat inaccurate. */); defsubr (&Swindow_vscroll); defsubr (&Sset_window_vscroll); defsubr (&Scompare_window_configurations); + defsubr (&Swindow_bump_use_time); defsubr (&Swindow_list); defsubr (&Swindow_list_1); defsubr (&Swindow_prev_buffers); @@ -8583,14 +8596,3 @@ displayed after a scrolling operation to be somewhat inaccurate. */); defsubr (&Swindow_parameter); defsubr (&Sset_window_parameter); } - -void -keys_of_window (void) -{ - initial_define_key (control_x_map, '<', "scroll-left"); - initial_define_key (control_x_map, '>', "scroll-right"); - - initial_define_key (global_map, Ctl ('V'), "scroll-up-command"); - initial_define_key (meta_map, Ctl ('V'), "scroll-other-window"); - initial_define_key (meta_map, 'v', "scroll-down-command"); -} diff --git a/src/window.h b/src/window.h index fba98f438c4..fbdec0df997 100644 --- a/src/window.h +++ b/src/window.h @@ -1202,7 +1202,6 @@ extern bool window_outdated (struct window *); extern void init_window_once (void); extern void init_window (void); extern void syms_of_window (void); -extern void keys_of_window (void); /* Move cursor to row/column position VPOS/HPOS, pixel coordinates Y/X. HPOS/VPOS are window-relative row and column numbers and X/Y are window-relative pixel positions. This is always done during diff --git a/src/xdisp.c b/src/xdisp.c index b0f218dcb35..d070c5ae5cd 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -4262,6 +4262,7 @@ handle_fontified_prop (struct it *it) if (!STRINGP (it->string) && it->s == NULL && !NILP (Vfontification_functions) + && !(input_was_pending && redisplay_skip_fontification_on_input) && !NILP (Vrun_hooks) && (pos = make_fixnum (IT_CHARPOS (*it)), prop = Fget_char_property (pos, Qfontified, Qnil), @@ -25508,7 +25509,7 @@ display_mode_line (struct window *w, enum face_id face_id, Lisp_Object format) if (start < i) display_string (NULL, Fsubstring (mode_string, make_fixnum (start), - make_fixnum (i - 1)), + make_fixnum (i)), Qnil, 0, 0, &it, 0, 0, 0, STRING_MULTIBYTE (mode_string)); } @@ -35613,6 +35614,19 @@ best except in special circumstances such as running redisplay tests in batch mode. */); redisplay_skip_initial_frame = true; + DEFVAR_BOOL ("redisplay-skip-fontification-on-input", + redisplay_skip_fontification_on_input, + doc: /* Skip `fontification_functions` when there is input pending. +If non-nil and there was input pending at the beginning of the command, +the `fontification_functions` hook is not run. This usually does not +affect the display because redisplay is completely skipped anyway if input +was pending, but it can make scrolling smoother by avoiding +unnecessary fontification. +It is similar to `fast-but-imprecise-scrolling' with similar tradeoffs, +but with the advantage that it should only affect the behavior when Emacs +has trouble keeping up with the incoming input rate. */); + redisplay_skip_fontification_on_input = false; + DEFVAR_BOOL ("redisplay-adhoc-scroll-in-resize-mini-windows", redisplay_adhoc_scroll_in_resize_mini_windows, doc: /* If nil always use normal scrolling in minibuffer windows. diff --git a/src/xterm.c b/src/xterm.c index 0a86738cc20..b8374fed8b1 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -13035,13 +13035,13 @@ x_term_init (Lisp_Object display_name, char *xrm_option, char *resource_name) or larger than other for other applications, even if it is the same font name (monospace-10 for example). */ +# ifdef HAVE_XRENDER int event_base, error_base; - char *v; - double d; - XRenderQueryExtension (dpyinfo->display, &event_base, &error_base); +# endif - v = XGetDefault (dpyinfo->display, "Xft", "dpi"); + char *v = XGetDefault (dpyinfo->display, "Xft", "dpi"); + double d; if (v != NULL && sscanf (v, "%lf", &d) == 1) dpyinfo->resy = dpyinfo->resx = d; } |
