diff options
-rw-r--r-- | src/ChangeLog | 33 | ||||
-rw-r--r-- | src/coding.c | 8 | ||||
-rw-r--r-- | src/composite.c | 2 | ||||
-rw-r--r-- | src/dispextern.h | 1 | ||||
-rw-r--r-- | src/dispnew.c | 5 | ||||
-rw-r--r-- | src/frame.c | 2 | ||||
-rw-r--r-- | src/keyboard.c | 18 | ||||
-rw-r--r-- | src/nsfns.m | 4 | ||||
-rw-r--r-- | src/term.c | 98 | ||||
-rw-r--r-- | src/termhooks.h | 4 | ||||
-rw-r--r-- | src/terminal.c | 95 | ||||
-rw-r--r-- | src/w32fns.c | 2 | ||||
-rw-r--r-- | src/xfns.c | 2 | ||||
-rw-r--r-- | src/xselect.c | 2 |
14 files changed, 135 insertions, 141 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index 3200a315daa..c1b7c6cc8c3 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,36 @@ +2014-10-14 Dmitry Antipov <dmantipov@yandex.ru> + + Cleanup terminal handling code. + * dispextern.h (get_named_tty): Remove prototype but... + * termhooks.h (get_named_terminal): ...resurrect it under + more meaningful name. + (get_terminal): Likewise, but with... + (decode_live_terminal): ...this name. + (decode_tty_terminal): Add prototype. + * term.c (get_tty_terminal): Remove. + (get_named_tty): Remove. + (Ftty_display_color_p, Ftty_display_color_cells, Ftty_type) + (Fcontrolling_tty_p, Fsuspend_tty, Fresume_tty): + Use decode_tty_terminal. + (Ftty_no_underline, Ftty_top_frame): Use decode_live_terminal. + * terminal.c (get_terminal): Refactor to... + (decode_terminal, decode_live_terminal): ...new functions. + (decode_tty_terminal): Replacement for get_tty_terminal. + (get_named_terminal): Likewise for get_named_tty. + * coding.c (Fset_terminal_coding_system_internal) + (Fterminal_coding_system, Fset_keyboard_coding_system_internal): + (Fkeyboard_coding_system): + * composite.c (Fcomposition_get_gstring): + * dispnew.c (Fsend_string_to_terminal): + * frame.c (Fmake_terminal_frame): + * nsfns.m (check_ns_display_info): + * w32fns.c, xfns.c (check_x_display_info): + * xselect.c (frame_for_x_selection): Use decode_live_terminal. + * keyboard.c (handle_interrupt_signal, handle_interrupt) + (Fset_quit_char): Use get_named_terminal. + (Fset_output_flow_control, Fset_input_meta_mode): + Use decode_tty_terminal. + 2014-10-13 Eli Zaretskii <eliz@gnu.org> * w32term.h (ALIGN_STACK): Use _WIN64, not _W64, to distinguish diff --git a/src/coding.c b/src/coding.c index f63d710ce9a..e4b52f6db48 100644 --- a/src/coding.c +++ b/src/coding.c @@ -9759,7 +9759,7 @@ DEFUN ("set-terminal-coding-system-internal", Fset_terminal_coding_system_intern doc: /* Internal use only. */) (Lisp_Object coding_system, Lisp_Object terminal) { - struct terminal *term = get_terminal (terminal, 1); + struct terminal *term = decode_live_terminal (terminal); struct coding_system *terminal_coding = TERMINAL_TERMINAL_CODING (term); CHECK_SYMBOL (coding_system); setup_coding_system (Fcheck_coding_system (coding_system), terminal_coding); @@ -9800,7 +9800,7 @@ frame's terminal device. */) (Lisp_Object terminal) { struct coding_system *terminal_coding - = TERMINAL_TERMINAL_CODING (get_terminal (terminal, 1)); + = TERMINAL_TERMINAL_CODING (decode_live_terminal (terminal)); Lisp_Object coding_system = CODING_ID_NAME (terminal_coding->id); /* For backward compatibility, return nil if it is `undecided'. */ @@ -9812,7 +9812,7 @@ DEFUN ("set-keyboard-coding-system-internal", Fset_keyboard_coding_system_intern doc: /* Internal use only. */) (Lisp_Object coding_system, Lisp_Object terminal) { - struct terminal *t = get_terminal (terminal, 1); + struct terminal *t = decode_live_terminal (terminal); CHECK_SYMBOL (coding_system); if (NILP (coding_system)) coding_system = Qno_conversion; @@ -9831,7 +9831,7 @@ DEFUN ("keyboard-coding-system", (Lisp_Object terminal) { return CODING_ID_NAME (TERMINAL_KEYBOARD_CODING - (get_terminal (terminal, 1))->id); + (decode_live_terminal (terminal))->id); } diff --git a/src/composite.c b/src/composite.c index 1b1960d1c4d..8982c904096 100644 --- a/src/composite.c +++ b/src/composite.c @@ -1719,7 +1719,7 @@ should be ignored. */) if (! FONT_OBJECT_P (font_object)) { struct coding_system *coding; - struct terminal *terminal = get_terminal (font_object, 1); + struct terminal *terminal = decode_live_terminal (font_object); coding = ((TERMINAL_TERMINAL_CODING (terminal)->common_flags & CODING_REQUIRE_ENCODING_MASK) diff --git a/src/dispextern.h b/src/dispextern.h index 81e36d7b3c6..228502ca06a 100644 --- a/src/dispextern.h +++ b/src/dispextern.h @@ -3500,7 +3500,6 @@ extern void calculate_costs (struct frame *); extern void produce_glyphs (struct it *); extern bool tty_capable_p (struct tty_display_info *, unsigned); extern void set_tty_color_mode (struct tty_display_info *, struct frame *); -extern struct terminal *get_named_tty (const char *); extern void create_tty_output (struct frame *); extern struct terminal *init_tty (const char *, const char *, bool); extern void tty_append_glyph (struct it *); diff --git a/src/dispnew.c b/src/dispnew.c index fbad0edc018..3ab8bcf3e64 100644 --- a/src/dispnew.c +++ b/src/dispnew.c @@ -5611,16 +5611,13 @@ the currently selected frame. In batch mode, STRING is sent to stdout when TERMINAL is nil. */) (Lisp_Object string, Lisp_Object terminal) { - struct terminal *t = get_terminal (terminal, 1); + struct terminal *t = decode_live_terminal (terminal); FILE *out; /* ??? Perhaps we should do something special for multibyte strings here. */ CHECK_STRING (string); block_input (); - if (!t) - error ("Unknown terminal device"); - if (t->type == output_initial) out = stdout; else if (t->type != output_termcap && t->type != output_msdos_raw) diff --git a/src/frame.c b/src/frame.c index a3139173655..8fac06e2af7 100644 --- a/src/frame.c +++ b/src/frame.c @@ -964,7 +964,7 @@ affects all frames on the same terminal device. */) if (CONSP (terminal)) { terminal = XCDR (terminal); - t = get_terminal (terminal, 1); + t = decode_live_terminal (terminal); } #ifdef MSDOS if (t && t != the_only_display_info.terminal) diff --git a/src/keyboard.c b/src/keyboard.c index 6730536dc1d..e8143f26681 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -10349,7 +10349,7 @@ static void handle_interrupt_signal (int sig) { /* See if we have an active terminal on our controlling tty. */ - struct terminal *terminal = get_named_tty ("/dev/tty"); + struct terminal *terminal = get_named_terminal ("/dev/tty"); if (!terminal) { /* If there are no frames there, let's pretend that we are a @@ -10403,7 +10403,7 @@ handle_interrupt (bool in_signal_handler) cancel_echoing (); /* XXX This code needs to be revised for multi-tty support. */ - if (!NILP (Vquit_flag) && get_named_tty ("/dev/tty")) + if (!NILP (Vquit_flag) && get_named_terminal ("/dev/tty")) { if (! in_signal_handler) { @@ -10615,9 +10615,10 @@ Emacs reads input in CBREAK mode; see `set-input-interrupt-mode'. See also `current-input-mode'. */) (Lisp_Object flow, Lisp_Object terminal) { - struct terminal *t = get_terminal (terminal, 1); + struct terminal *t = decode_tty_terminal (terminal); struct tty_display_info *tty; - if (t == NULL || (t->type != output_termcap && t->type != output_msdos_raw)) + + if (!t) return Qnil; tty = t->display_info.tty; @@ -10657,11 +10658,11 @@ the currently selected frame. See also `current-input-mode'. */) (Lisp_Object meta, Lisp_Object terminal) { - struct terminal *t = get_terminal (terminal, 1); + struct terminal *t = decode_tty_terminal (terminal); struct tty_display_info *tty; int new_meta; - if (t == NULL || (t->type != output_termcap && t->type != output_msdos_raw)) + if (!t) return Qnil; tty = t->display_info.tty; @@ -10698,9 +10699,10 @@ process. See also `current-input-mode'. */) (Lisp_Object quit) { - struct terminal *t = get_named_tty ("/dev/tty"); + struct terminal *t = get_named_terminal ("/dev/tty"); struct tty_display_info *tty; - if (t == NULL || (t->type != output_termcap && t->type != output_msdos_raw)) + + if (!t) return Qnil; tty = t->display_info.tty; diff --git a/src/nsfns.m b/src/nsfns.m index 5cf8387123e..a93b2724403 100644 --- a/src/nsfns.m +++ b/src/nsfns.m @@ -133,7 +133,7 @@ check_ns_display_info (Lisp_Object object) } else if (TERMINALP (object)) { - struct terminal *t = get_terminal (object, 1); + struct terminal *t = decode_live_terminal (object); if (t->type != output_ns) error ("Terminal %d is not a Nextstep display", t->id); @@ -2541,7 +2541,7 @@ the attributes: Internal use only, use `display-monitor-attributes-list' instead. */) (Lisp_Object terminal) { - struct terminal *term = get_terminal (terminal, 1); + struct terminal *term = decode_live_terminal (terminal); NSArray *screens; NSUInteger i, n_monitors; struct MonitorInfo *monitors; diff --git a/src/term.c b/src/term.c index 572435bdd1a..0c36469f655 100644 --- a/src/term.c +++ b/src/term.c @@ -77,7 +77,6 @@ static void tty_turn_off_highlight (struct tty_display_info *); static void tty_show_cursor (struct tty_display_info *); static void tty_hide_cursor (struct tty_display_info *); static void tty_background_highlight (struct tty_display_info *tty); -static struct terminal *get_tty_terminal (Lisp_Object, bool); static void clear_tty_hooks (struct terminal *terminal); static void set_tty_hooks (struct terminal *terminal); static void dissociate_if_controlling_tty (int fd); @@ -2032,11 +2031,9 @@ selected frame's terminal). This function always returns nil if TERMINAL does not refer to a text terminal. */) (Lisp_Object terminal) { - struct terminal *t = get_tty_terminal (terminal, 0); - if (!t) - return Qnil; - else - return t->display_info.tty->TN_max_colors > 0 ? Qt : Qnil; + struct terminal *t = decode_tty_terminal (terminal); + + return (t && t->display_info.tty->TN_max_colors > 0) ? Qt : Qnil; } /* Return the number of supported colors. */ @@ -2049,11 +2046,9 @@ selected frame's terminal). This function always returns 0 if TERMINAL does not refer to a text terminal. */) (Lisp_Object terminal) { - struct terminal *t = get_tty_terminal (terminal, 0); - if (!t) - return make_number (0); - else - return make_number (t->display_info.tty->TN_max_colors); + struct terminal *t = decode_tty_terminal (terminal); + + return make_number (t ? t->display_info.tty->TN_max_colors : 0); } #ifndef DOS_NT @@ -2168,52 +2163,6 @@ set_tty_color_mode (struct tty_display_info *tty, struct frame *f) #endif /* !DOS_NT */ - - -/* Return the tty display object specified by TERMINAL. */ - -static struct terminal * -get_tty_terminal (Lisp_Object terminal, bool throw) -{ - struct terminal *t = get_terminal (terminal, throw); - - if (t && t->type != output_termcap && t->type != output_msdos_raw) - { - if (throw) - error ("Device %d is not a termcap terminal device", t->id); - else - return NULL; - } - - return t; -} - -/* Return an active termcap device that uses the tty device with the - given name. - - This function ignores suspended devices. - - Returns NULL if the named terminal device is not opened. */ - -struct terminal * -get_named_tty (const char *name) -{ - struct terminal *t; - - eassert (name); - - for (t = terminal_list; t; t = t->next_terminal) - { - if ((t->type == output_termcap || t->type == output_msdos_raw) - && !strcmp (t->display_info.tty->name, name) - && TERMINAL_ACTIVE_P (t)) - return t; - } - - return 0; -} - - DEFUN ("tty-type", Ftty_type, Stty_type, 0, 1, 0, doc: /* Return the type of the tty device that TERMINAL uses. Returns nil if TERMINAL is not on a tty device. @@ -2222,15 +2171,10 @@ TERMINAL can be a terminal object, a frame, or nil (meaning the selected frame's terminal). */) (Lisp_Object terminal) { - struct terminal *t = get_terminal (terminal, 1); - - if (t->type != output_termcap && t->type != output_msdos_raw) - return Qnil; + struct terminal *t = decode_tty_terminal (terminal); - if (t->display_info.tty->type) - return build_string (t->display_info.tty->type); - else - return Qnil; + return (t && t->display_info.tty->type + ? build_string (t->display_info.tty->type) : Qnil); } DEFUN ("controlling-tty-p", Fcontrolling_tty_p, Scontrolling_tty_p, 0, 1, 0, @@ -2241,13 +2185,9 @@ selected frame's terminal). This function always returns nil if TERMINAL is not on a tty device. */) (Lisp_Object terminal) { - struct terminal *t = get_terminal (terminal, 1); + struct terminal *t = decode_tty_terminal (terminal); - if ((t->type != output_termcap && t->type != output_msdos_raw) - || strcmp (t->display_info.tty->name, DEV_TTY) != 0) - return Qnil; - else - return Qt; + return (t && !strcmp (t->display_info.tty->name, DEV_TTY) ? Qt : Qnil); } DEFUN ("tty-no-underline", Ftty_no_underline, Stty_no_underline, 0, 1, 0, @@ -2261,7 +2201,7 @@ selected frame's terminal). This function always returns nil if TERMINAL does not refer to a text terminal. */) (Lisp_Object terminal) { - struct terminal *t = get_terminal (terminal, 1); + struct terminal *t = decode_live_terminal (terminal); if (t->type == output_termcap) t->display_info.tty->TS_enter_underline_mode = 0; @@ -2276,7 +2216,7 @@ does not refer to a text terminal. Otherwise, it returns the top-most frame on the text terminal. */) (Lisp_Object terminal) { - struct terminal *t = get_terminal (terminal, 1); + struct terminal *t = decode_live_terminal (terminal); if (t->type == output_termcap) return t->display_info.tty->top_frame; @@ -2306,11 +2246,11 @@ suspended. A suspended tty may be resumed by calling `resume-tty' on it. */) (Lisp_Object tty) { - struct terminal *t = get_tty_terminal (tty, 1); + struct terminal *t = decode_tty_terminal (tty); FILE *f; if (!t) - error ("Unknown tty device"); + error ("Attempt to suspend a non-text terminal device"); f = t->display_info.tty->input; @@ -2366,15 +2306,15 @@ TTY may be a terminal object, a frame, or nil (meaning the selected frame's terminal). */) (Lisp_Object tty) { - struct terminal *t = get_tty_terminal (tty, 1); + struct terminal *t = decode_tty_terminal (tty); int fd; if (!t) - error ("Unknown tty device"); + error ("Attempt to resume a non-text terminal device"); if (!t->display_info.tty->input) { - if (get_named_tty (t->display_info.tty->name)) + if (get_named_terminal (t->display_info.tty->name)) error ("Cannot resume display while another display is active on the same device"); #ifdef MSDOS @@ -4007,7 +3947,7 @@ init_tty (const char *name, const char *terminal_type, bool must_succeed) /* XXX Perhaps this should be made explicit by having init_tty always create a new terminal and separating terminal and frame creation on Lisp level. */ - terminal = get_named_tty (name); + terminal = get_named_terminal (name); if (terminal) return terminal; diff --git a/src/termhooks.h b/src/termhooks.h index 8d85fba8af8..9cab853ed3d 100644 --- a/src/termhooks.h +++ b/src/termhooks.h @@ -681,7 +681,9 @@ extern struct terminal *terminal_list; (t->type == output_ns ? t->display_info.ns->name_list_element : Qnil) #endif -extern struct terminal *get_terminal (Lisp_Object terminal, bool); +extern struct terminal *decode_live_terminal (Lisp_Object); +extern struct terminal *decode_tty_terminal (Lisp_Object); +extern struct terminal *get_named_terminal (const char *); extern struct terminal *create_terminal (enum output_method, struct redisplay_interface *); extern void delete_terminal (struct terminal *); diff --git a/src/terminal.c b/src/terminal.c index a827677a58d..0cd6a0bf602 100644 --- a/src/terminal.c +++ b/src/terminal.c @@ -37,7 +37,9 @@ static int next_terminal_id; /* The initial terminal device, created by initial_term_init. */ struct terminal *initial_terminal; +Lisp_Object Qrun_hook_with_args; static Lisp_Object Qterminal_live_p; +static Lisp_Object Qdelete_terminal_functions; static void delete_initial_terminal (struct terminal *); @@ -194,34 +196,66 @@ ins_del_lines (struct frame *f, int vpos, int n) (*FRAME_TERMINAL (f)->ins_del_lines_hook) (f, vpos, n); } +/* Return the terminal object specified by TERMINAL. TERMINAL may + be a terminal object, a frame, or nil for the terminal device of + the current frame. If TERMINAL is neither from the above or the + resulting terminal object is deleted, return NULL. */ - - -/* Return the terminal object specified by TERMINAL. TERMINAL may be - a terminal object, a frame, or nil for the terminal device of the - current frame. If THROW is false, return NULL for failure, - otherwise throw an error. */ - -struct terminal * -get_terminal (Lisp_Object terminal, bool throw) +static struct terminal * +decode_terminal (Lisp_Object terminal) { - struct terminal *result = NULL; + struct terminal *t; if (NILP (terminal)) terminal = selected_frame; + t = (TERMINALP (terminal) + ? XTERMINAL (terminal) + : FRAMEP (terminal) ? FRAME_TERMINAL (XFRAME (terminal)) : NULL); + return t && t->name ? t : NULL; +} - if (TERMINALP (terminal)) - result = XTERMINAL (terminal); - else if (FRAMEP (terminal)) - result = FRAME_TERMINAL (XFRAME (terminal)); +/* Like above, but throw an error if TERMINAL is not valid or deleted. */ - if (result && !result->name) - result = NULL; +struct terminal * +decode_live_terminal (Lisp_Object terminal) +{ + struct terminal *t = decode_terminal (terminal); - if (result == NULL && throw) + if (!t) wrong_type_argument (Qterminal_live_p, terminal); + return t; +} + +/* Like decode_terminal, but ensure that the resulting terminal object refers + to a text-based terminal device. */ + +struct terminal * +decode_tty_terminal (Lisp_Object terminal) +{ + struct terminal *t = decode_live_terminal (terminal); - return result; + return (t->type == output_termcap || t->type == output_msdos_raw) ? t : NULL; +} + +/* Return an active (not suspended) text-based terminal device that uses + the tty device with the given NAME, or NULL if the named terminal device + is not opened. */ + +struct terminal * +get_named_terminal (const char *name) +{ + struct terminal *t; + + eassert (name); + + for (t = terminal_list; t; t = t->next_terminal) + { + if ((t->type == output_termcap || t->type == output_msdos_raw) + && !strcmp (t->display_info.tty->name, name) + && TERMINAL_ACTIVE_P (t)) + return t; + } + return NULL; } /* Create a new terminal object of TYPE and add it to the terminal list. RIF @@ -308,8 +342,6 @@ delete_terminal (struct terminal *terminal) } } -Lisp_Object Qrun_hook_with_args; -static Lisp_Object Qdelete_terminal_functions; DEFUN ("delete-terminal", Fdelete_terminal, Sdelete_terminal, 0, 2, 0, doc: /* Delete TERMINAL by deleting all frames on it and closing the terminal. TERMINAL may be a terminal object, a frame, or nil (meaning the @@ -319,7 +351,7 @@ Normally, you may not delete a display if all other displays are suspended, but if the second argument FORCE is non-nil, you may do so. */) (Lisp_Object terminal, Lisp_Object force) { - struct terminal *t = get_terminal (terminal, 0); + struct terminal *t = decode_terminal (terminal); if (!t) return Qnil; @@ -380,9 +412,7 @@ sort of output terminal it uses. See the documentation of `framep' for possible return values. */) (Lisp_Object object) { - struct terminal *t; - - t = get_terminal (object, 0); + struct terminal *t = decode_terminal (object); if (!t) return Qnil; @@ -429,8 +459,7 @@ TERMINAL may be a terminal object, a frame, or nil (meaning the selected frame's terminal). */) (Lisp_Object terminal) { - struct terminal *t - = TERMINALP (terminal) ? XTERMINAL (terminal) : get_terminal (terminal, 1); + struct terminal *t = decode_live_terminal (terminal); return t->name ? build_string (t->name) : Qnil; } @@ -467,9 +496,7 @@ TERMINAL can be a terminal object, a frame, or nil (meaning the selected frame's terminal). */) (Lisp_Object terminal) { - struct terminal *t - = TERMINALP (terminal) ? XTERMINAL (terminal) : get_terminal (terminal, 1); - return Fcopy_alist (t->param_alist); + return Fcopy_alist (decode_live_terminal (terminal)->param_alist); } DEFUN ("terminal-parameter", Fterminal_parameter, Sterminal_parameter, 2, 2, 0, @@ -478,12 +505,8 @@ TERMINAL can be a terminal object, a frame, or nil (meaning the selected frame's terminal). */) (Lisp_Object terminal, Lisp_Object parameter) { - Lisp_Object value; - struct terminal *t - = TERMINALP (terminal) ? XTERMINAL (terminal) : get_terminal (terminal, 1); CHECK_SYMBOL (parameter); - value = Fcdr (Fassq (parameter, t->param_alist)); - return value; + return Fcdr (Fassq (parameter, decode_live_terminal (terminal)->param_alist)); } DEFUN ("set-terminal-parameter", Fset_terminal_parameter, @@ -495,9 +518,7 @@ TERMINAL can be a terminal object, a frame or nil (meaning the selected frame's terminal). */) (Lisp_Object terminal, Lisp_Object parameter, Lisp_Object value) { - struct terminal *t - = TERMINALP (terminal) ? XTERMINAL (terminal) : get_terminal (terminal, 1); - return store_terminal_param (t, parameter, value); + return store_terminal_param (decode_live_terminal (terminal), parameter, value); } /* Initial frame has no device-dependent output data, but has diff --git a/src/w32fns.c b/src/w32fns.c index bfa69fb61cd..05da2a5c1d1 100644 --- a/src/w32fns.c +++ b/src/w32fns.c @@ -276,7 +276,7 @@ check_x_display_info (Lisp_Object object) } else if (TERMINALP (object)) { - struct terminal *t = get_terminal (object, 1); + struct terminal *t = decode_live_terminal (object); if (t->type != output_w32) error ("Terminal %d is not a W32 display", t->id); diff --git a/src/xfns.c b/src/xfns.c index 7fd6d9070b2..5edb635b182 100644 --- a/src/xfns.c +++ b/src/xfns.c @@ -159,7 +159,7 @@ check_x_display_info (Lisp_Object object) } else if (TERMINALP (object)) { - struct terminal *t = get_terminal (object, 1); + struct terminal *t = decode_live_terminal (object); if (t->type != output_x_window) error ("Terminal %d is not an X display", t->id); diff --git a/src/xselect.c b/src/xselect.c index 9b57a95b26b..92e89822293 100644 --- a/src/xselect.c +++ b/src/xselect.c @@ -1901,7 +1901,7 @@ frame_for_x_selection (Lisp_Object object) } else if (TERMINALP (object)) { - struct terminal *t = get_terminal (object, 1); + struct terminal *t = decode_live_terminal (object); if (t->type == output_x_window) FOR_EACH_FRAME (tail, frame) |