summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.multi-tty108
-rw-r--r--lib-src/emacsclient.c29
-rw-r--r--lisp/server.el6
-rw-r--r--src/cm.c141
-rw-r--r--src/cm.h109
-rw-r--r--src/dispextern.h6
-rw-r--r--src/dispnew.c8
-rw-r--r--src/frame.c2
-rw-r--r--src/frame.h14
-rw-r--r--src/keyboard.c22
-rw-r--r--src/lisp.h1
-rw-r--r--src/sysdep.c48
-rw-r--r--src/term.c378
-rw-r--r--src/termchar.h4
-rw-r--r--src/xdisp.c6
15 files changed, 489 insertions, 393 deletions
diff --git a/README.multi-tty b/README.multi-tty
index c8cd7279adf..ed2fb17770f 100644
--- a/README.multi-tty
+++ b/README.multi-tty
@@ -13,7 +13,7 @@ I'm Károly Lőrentey. My address: lorentey@elte.hu.
Patches or suggestions are welcome!
-Retrieving the branch:
+Retrieving the latest version of the branch:
tla register-archive lorentey@elte.hu--2004 http://lorentey.web.elte.hu/arch/2004/
tla get lorentey@elte.hu--2004/emacs--multi-tty--0 <directory>
@@ -24,21 +24,24 @@ Retrieving the branch:
STATUS
------
-We can create frames on new tty devices, but there are problems with
-redisplay. Input is read from all terminals (NOT via MULTIKBOARD!).
-At the moment, the type of the new terminals must be the same as the
-initial terminal. Emacsclient is extended to support opening a new
-terminal frame.
+Basic support is there; there are some rough edges, but it already
+seems to be usable. Input is read from all terminals (NOT via
+MULTIKBOARD!). At the moment, the type of the new terminals must be
+the same as the initial terminal. Emacsclient was extended to support
+opening a new terminal frame.
To try it out, start up the emacs server (M-x server-start), and then
-start emacsclient with
+(from a shell prompt on another terminal) start emacsclient with
emacsclient -h
-If you exit emacs, both terminals are restored to their previous
+You'll have two fully working frames on separate terminals. If you
+exit emacs, both terminals should be restored to their previous
states.
-X, Mac, Windows and DOS support is broken.
+X, Mac, Windows and DOS support is broken at the moment.
+
+Tested under GNU/Linux only.
NEWS
----
@@ -47,7 +50,19 @@ For the NEWS file:
** Support for multiple terminal devices has been added. You can
specify a terminal device (`tty' parameter) and a terminal type
- (`tty-type' parameter) to `make-terminal-frame'.
+ (`tty-type' parameter) to `make-terminal-frame'. `tty' must be a
+ terminal device created by the new emacsclient, or there will be
+ problems with terminal input and window resizes. (The kernel
+ notifies processes about pending input or terminal resizes only on
+ the controlling terminal, so we need emacsclient to sit on the real
+ terminal device, create SIGIO signals upon terminal input, and
+ forward SIGWINCH signals to us.)
+
+ You can test for the presence of multiple terminal support by
+ testing for the `multi-tty' feature.
+
+** A make-frame-on-tty function has been added to make it easier to
+ create frames on new terminals.
** Emacsclient has been extended to support opening a new terminal
frame.
@@ -58,8 +73,10 @@ CHANGELOG
See arch logs.
-THINGS THAT ARE DONE
---------------------
+DIARY OF CHANGES
+----------------
+
+(ex-TODO items with explanations.)
-- Introduce a new abstraction for terminal devices.
@@ -80,12 +97,13 @@ THINGS THAT ARE DONE
-- Implement support for reading from multiple terminals.
(Done, read_avail_input tries to read from each terminal, until one
- succeeds.)
+ succeeds. MULTIKBOARD is not used. Secondary terminals don't send
+ SIGIO!)
-- other-frame should cycle through the frames on the `current'
- terminal.
+ terminal only.
- (Done. A little fragile, but seems to work.)
+ (Done, by trivially modifiying next_frame and prev_frame.)
-- Support different terminal sizes.
@@ -94,7 +112,8 @@ THINGS THAT ARE DONE
-- Make sure terminal resizes are handled gracefully. (Could be
problematic.)
- (Done. We don't get SIGWINCH for additional ttys, though.)
+ (Done. We don't get automatic SIGWINCH for additional ttys,
+ though.)
-- Extend emacsclient to automatically open a new tty when it connects
to Emacs.
@@ -106,46 +125,71 @@ THINGS THAT ARE DONE
(Done, but introduced ugly redisplay problems. Ugh.)
+-- Fix redisplay problems.
+
+ (Done, it turned out that the entire Wcm structure must be moved
+ inside tty_output. Why was it so hard for me to find this out?)
+
+-- Provide a way for emacsclient to tell Emacs that the tty has been
+ resized.
+
+ (Done, simply forward the SIGWINCH signal.)
+
+-- Each keypress should automatically select the frame corresponding
+ to the terminal that it was coming from. This means that Emacs
+ must know from which terminal the last keyboard event came from.
+ (Multikeyboard support may help with this.)
+
+ (Done, it was quite simple.)
+
+-- Fix SIGIO issue with secondary terminals.
+
+ (Done, emacsclient signals Emacs after writing to the proxy pseudo
+ terminal. This means that multi-tty does not work with raw ttys!)
THINGS TO DO
------------
-** Fix redisplay problems.
+** Implement sane error handling after initialization. (Currently
+ emacs exits if you specify a bad terminal type.) The helpful error
+ messages must still be provided when Emacs starts.
+
+** C-g should work on secondary terminals.
** Make make-terminal-frame look up the tty and tty-type parameters
from the currently selected terminal before the global default.
** Move optimalization parameters (costs) from union output_data to
- struct frame.
+ a backend-neutral per-device structure.
-** Provide a way for emacsclient to tell Emacs that the tty has been
- resized.
+** Implement terminal deletion, i.e., deleting local frames, closing
+ the tty device and restoring its previous state without exiting
+ Emacs. This should be exported to the Lisp environment.
-** Implement terminal deletion, i.e., closing the tty device and
- restoring its previous state without exiting Emacs. This should be
- exported to the Lisp interpreter.
-
-** Implement automatic deletion of terminals, when the last frame on
+** Implement automatic deletion of terminals when the last frame on
that terminal is closed.
** Put all cached terminal escape sequences into struct tty_output.
Currently, they are still stored in global variables, so we don't
really support multiple terminal types.
-
-** Each keypress should automatically select the frame corresponding
- to the terminal that it was coming from. This means that Emacs
- must know from which terminal the last keyboard event came from.
- (Multikeyboard support may help with this.)
-
-** Make struct tty_output available from Lisp.
+** Make parts of struct tty_output accessible from Lisp. The device
+ name and the type is sufficient.
** Implement support for starting an interactive Emacs session without
an initial frame. (The user would connect to it and open frames
later, with emacsclient.) Not necessary a good idea.
+** Support raw secondary terminals. (This one is tricky, SIGIO works
+ only on the controlling terminal.)
+
+** What does interrupt_input do? I tried to disable it for raw
+ secondary tty support, but it seems not to do anything useful.
+
** Fix X support.
+** Do tty output through term_hooks, too.
+
** Allow simultaneous X and tty frames.
** Fix Mac support (I can't do this myself).
diff --git a/lib-src/emacsclient.c b/lib-src/emacsclient.c
index 2f0f45e1f59..14da37b1bb8 100644
--- a/lib-src/emacsclient.c
+++ b/lib-src/emacsclient.c
@@ -380,6 +380,7 @@ int tty_erase_char;
int flow_control = 0;
int meta_key = 0;
char _sobuf[BUFSIZ];
+int emacs_pid;
/* Adapted from init_sys_modes() in sysdep.c. */
int
@@ -548,7 +549,7 @@ init_tty ()
void
window_change ()
{
- int width, height;
+ int width = 0, height = 0;
#ifdef TIOCGWINSZ
{
@@ -601,6 +602,9 @@ window_change ()
}
#endif /* not SunOS-style */
#endif /* not BSD-style */
+
+ if (width != 0 && height != 0)
+ kill (emacs_pid, SIGWINCH);
}
int in_conversation = 0;
@@ -696,7 +700,7 @@ init_pty ()
}
int
-copy_from_to (int in, int out)
+copy_from_to (int in, int out, int sigio)
{
static char buf[BUFSIZ];
int nread = read (in, &buf, BUFSIZ);
@@ -716,6 +720,11 @@ copy_from_to (int in, int out)
if (r < 0)
return 0; /* Error */
+
+ if (sigio)
+ {
+ kill (emacs_pid, SIGIO);
+ }
}
return 1;
}
@@ -744,13 +753,13 @@ pty_conversation ()
if (FD_ISSET (master, &set))
{
/* Copy Emacs output to stdout. */
- if (! copy_from_to (master, 0))
+ if (! copy_from_to (master, 0, 0))
return 1;
}
if (FD_ISSET (1, &set))
{
/* Forward user input to Emacs. */
- if (! copy_from_to (1, master))
+ if (! copy_from_to (1, master, 1))
return 1;
}
}
@@ -1078,6 +1087,18 @@ To start the server in Emacs, type \"M-x server-start\".\n",
if (here)
{
+ /* First of all, get the pid of the Emacs process.
+ XXX Is there is some nifty libc/kernel feature for doing this?
+ */
+ str = fgets (string, BUFSIZ, in);
+ emacs_pid = atoi (str);
+ if (emacs_pid == 0)
+ {
+ reset_tty ();
+ fprintf (stderr, "%s: Could not get process id of Emacs\n", argv[0]);
+ fail (argc, argv);
+ }
+
if (! pty_conversation ())
{
reset_tty ();
diff --git a/lisp/server.el b/lisp/server.el
index 37b8eeb7574..f2c1fc9ce2a 100644
--- a/lisp/server.el
+++ b/lisp/server.el
@@ -319,13 +319,15 @@ PROC is the server process. Format of STRING is \"PATH PATH PATH... \\n\"."
(server-select-display display)
(error (process-send-string proc (nth 1 err))
(setq request "")))))
- ;; Open a new tty at the client.
+ ;; Open a new frame at the client. ARG is the name of the pseudo tty.
((and (equal "-pty" arg) (string-match "\\([^ ]*\\) \\([^ ]*\\) " request))
(let ((pty (server-unquote-arg (match-string 1 request)))
(type (server-unquote-arg (match-string 2 request))))
(setq request (substring request (match-end 0)))
(condition-case err
- (make-terminal-frame `((tty . ,pty) (tty-type . ,type)))
+ (progn
+ (make-terminal-frame `((tty . ,pty) (tty-type . ,type)))
+ (process-send-string proc (concat (number-to-string (emacs-pid)) "\n")))
(error (process-send-string proc (nth 1 err))
(setq request "")))))
;; ARG is a line number option.
diff --git a/src/cm.c b/src/cm.c
index 508729eeadb..31972b5d9f7 100644
--- a/src/cm.c
+++ b/src/cm.c
@@ -137,9 +137,9 @@ void
cmcheckmagic (tty)
struct tty_output *tty;
{
- if (curX == FrameCols)
+ if (curX (tty) == FrameCols (tty))
{
- if (!MagicWrap || curY >= FrameRows - 1)
+ if (!MagicWrap (tty) || curY (tty) >= FrameRows (tty) - 1)
abort ();
if (TTY_TERMSCRIPT (tty))
putc ('\r', TTY_TERMSCRIPT (tty));
@@ -147,8 +147,8 @@ cmcheckmagic (tty)
if (TTY_TERMSCRIPT (tty))
putc ('\n', TTY_TERMSCRIPT (tty));
putc ('\n', TTY_OUTPUT (tty));
- curX = 0;
- curY++;
+ curX (tty) = 0;
+ curY (tty)++;
}
}
@@ -160,21 +160,21 @@ cmcheckmagic (tty)
*/
void
-cmcostinit ()
+cmcostinit (struct tty_output *tty)
{
char *p;
#define COST(x,e) (x ? (cost = 0, tputs (x, 1, e), cost) : BIG)
#define CMCOST(x,e) ((x == 0) ? BIG : (p = tgoto(x, 0, 0), COST(p ,e)))
- Wcm.cc_up = COST (Wcm.cm_up, evalcost);
- Wcm.cc_down = COST (Wcm.cm_down, evalcost);
- Wcm.cc_left = COST (Wcm.cm_left, evalcost);
- Wcm.cc_right = COST (Wcm.cm_right, evalcost);
- Wcm.cc_home = COST (Wcm.cm_home, evalcost);
- Wcm.cc_cr = COST (Wcm.cm_cr, evalcost);
- Wcm.cc_ll = COST (Wcm.cm_ll, evalcost);
- Wcm.cc_tab = Wcm.cm_tabwidth ? COST (Wcm.cm_tab, evalcost) : BIG;
+ tty->Wcm->cc_up = COST (tty->Wcm->cm_up, evalcost);
+ tty->Wcm->cc_down = COST (tty->Wcm->cm_down, evalcost);
+ tty->Wcm->cc_left = COST (tty->Wcm->cm_left, evalcost);
+ tty->Wcm->cc_right = COST (tty->Wcm->cm_right, evalcost);
+ tty->Wcm->cc_home = COST (tty->Wcm->cm_home, evalcost);
+ tty->Wcm->cc_cr = COST (tty->Wcm->cm_cr, evalcost);
+ tty->Wcm->cc_ll = COST (tty->Wcm->cm_ll, evalcost);
+ tty->Wcm->cc_tab = tty->Wcm->cm_tabwidth ? COST (tty->Wcm->cm_tab, evalcost) : BIG;
/*
* These last three are actually minimum costs. When (if) they are
@@ -185,9 +185,9 @@ cmcostinit ()
* cursor motion seem to take straight numeric values. --ACT)
*/
- Wcm.cc_abs = CMCOST (Wcm.cm_abs, evalcost);
- Wcm.cc_habs = CMCOST (Wcm.cm_habs, evalcost);
- Wcm.cc_vabs = CMCOST (Wcm.cm_vabs, evalcost);
+ tty->Wcm->cc_abs = CMCOST (tty->Wcm->cm_abs, evalcost);
+ tty->Wcm->cc_habs = CMCOST (tty->Wcm->cm_habs, evalcost);
+ tty->Wcm->cc_vabs = CMCOST (tty->Wcm->cm_vabs, evalcost);
#undef CMCOST
#undef COST
@@ -217,16 +217,16 @@ calccost (struct tty_output *tty, int srcy, int srcx, int dsty, int dstx, int do
don't believe the cursor position: give up here
and force use of absolute positioning. */
- if (curX == Wcm.cm_cols)
+ if (curX (tty) == tty->Wcm->cm_cols)
goto fail;
totalcost = 0;
if ((deltay = dsty - srcy) == 0)
goto x;
if (deltay < 0)
- p = Wcm.cm_up, c = Wcm.cc_up, deltay = -deltay;
+ p = tty->Wcm->cm_up, c = tty->Wcm->cc_up, deltay = -deltay;
else
- p = Wcm.cm_down, c = Wcm.cc_down;
+ p = tty->Wcm->cm_down, c = tty->Wcm->cc_down;
if (c == BIG) { /* caint get thar from here */
if (doit)
printf ("OOPS");
@@ -240,11 +240,11 @@ x:
if ((deltax = dstx - srcx) == 0)
goto done;
if (deltax < 0) {
- p = Wcm.cm_left, c = Wcm.cc_left, deltax = -deltax;
+ p = tty->Wcm->cm_left, c = tty->Wcm->cc_left, deltax = -deltax;
goto dodelta; /* skip all the tab junk */
}
/* Tabs (the toughie) */
- if (Wcm.cc_tab >= BIG || !Wcm.cm_usetabs)
+ if (tty->Wcm->cc_tab >= BIG || !tty->Wcm->cm_usetabs)
goto olddelta; /* forget it! */
/*
@@ -255,12 +255,12 @@ x:
* we will put into tabx (for ntabs) and tab2x (for n2tabs)).
*/
- ntabs = (deltax + srcx % Wcm.cm_tabwidth) / Wcm.cm_tabwidth;
+ ntabs = (deltax + srcx % tty->Wcm->cm_tabwidth) / tty->Wcm->cm_tabwidth;
n2tabs = ntabs + 1;
- tabx = (srcx / Wcm.cm_tabwidth + ntabs) * Wcm.cm_tabwidth;
- tab2x = tabx + Wcm.cm_tabwidth;
+ tabx = (srcx / tty->Wcm->cm_tabwidth + ntabs) * tty->Wcm->cm_tabwidth;
+ tab2x = tabx + tty->Wcm->cm_tabwidth;
- if (tab2x >= Wcm.cm_cols) /* too far (past edge) */
+ if (tab2x >= tty->Wcm->cm_cols) /* too far (past edge) */
n2tabs = 0;
/*
@@ -269,11 +269,11 @@ x:
*/
/* cost for ntabs + cost for right motion */
- tabcost = ntabs ? ntabs * Wcm.cc_tab + (dstx - tabx) * Wcm.cc_right
+ tabcost = ntabs ? ntabs * tty->Wcm->cc_tab + (dstx - tabx) * tty->Wcm->cc_right
: BIG;
/* cost for n2tabs + cost for left motion */
- c = n2tabs ? n2tabs * Wcm.cc_tab + (tab2x - dstx) * Wcm.cc_left
+ c = n2tabs ? n2tabs * tty->Wcm->cc_tab + (tab2x - dstx) * tty->Wcm->cc_left
: BIG;
if (c < tabcost) /* then cheaper to overshoot & back up */
@@ -286,11 +286,11 @@ x:
* See if tabcost is less than just moving right
*/
- if (tabcost < (deltax * Wcm.cc_right)) {
+ if (tabcost < (deltax * tty->Wcm->cc_right)) {
totalcost += tabcost; /* use the tabs */
if (doit)
while (--ntabs >= 0)
- emacs_tputs (tty, Wcm.cm_tab, 1, cmputc);
+ emacs_tputs (tty, tty->Wcm->cm_tab, 1, cmputc);
srcx = tabx;
}
@@ -303,9 +303,9 @@ newdelta:
goto done;
olddelta:
if (deltax > 0)
- p = Wcm.cm_right, c = Wcm.cc_right;
+ p = tty->Wcm->cm_right, c = tty->Wcm->cc_right;
else
- p = Wcm.cm_left, c = Wcm.cc_left, deltax = -deltax;
+ p = tty->Wcm->cm_left, c = tty->Wcm->cc_left, deltax = -deltax;
dodelta:
if (c == BIG) { /* caint get thar from here */
@@ -349,47 +349,47 @@ cmgoto (tty, row, col)
*dcm;
/* First the degenerate case */
- if (row == curY && col == curX) /* already there */
+ if (row == curY (tty) && col == curX (tty)) /* already there */
return;
- if (curY >= 0 && curX >= 0)
+ if (curY (tty) >= 0 && curX (tty) >= 0)
{
/* We may have quick ways to go to the upper-left, bottom-left,
* start-of-line, or start-of-next-line. Or it might be best to
* start where we are. Examine the options, and pick the cheapest.
*/
- relcost = calccost (tty, curY, curX, row, col, 0);
+ relcost = calccost (tty, curY (tty), curX (tty), row, col, 0);
use = USEREL;
- if ((homecost = Wcm.cc_home) < BIG)
+ if ((homecost = tty->Wcm->cc_home) < BIG)
homecost += calccost (tty, 0, 0, row, col, 0);
if (homecost < relcost)
relcost = homecost, use = USEHOME;
- if ((llcost = Wcm.cc_ll) < BIG)
- llcost += calccost (tty, Wcm.cm_rows - 1, 0, row, col, 0);
+ if ((llcost = tty->Wcm->cc_ll) < BIG)
+ llcost += calccost (tty, tty->Wcm->cm_rows - 1, 0, row, col, 0);
if (llcost < relcost)
relcost = llcost, use = USELL;
- if ((crcost = Wcm.cc_cr) < BIG) {
- if (Wcm.cm_autolf)
- if (curY + 1 >= Wcm.cm_rows)
- crcost = BIG;
+ if ((crcost = tty->Wcm->cc_cr) < BIG) {
+ if (tty->Wcm->cm_autolf)
+ if (curY (tty) + 1 >= tty->Wcm->cm_rows)
+ crcost = BIG;
else
- crcost += calccost (tty, curY + 1, 0, row, col, 0);
+ crcost += calccost (tty, curY (tty) + 1, 0, row, col, 0);
else
- crcost += calccost (tty, curY, 0, row, col, 0);
+ crcost += calccost (tty, curY (tty), 0, row, col, 0);
}
if (crcost < relcost)
relcost = crcost, use = USECR;
- directcost = Wcm.cc_abs, dcm = Wcm.cm_abs;
- if (row == curY && Wcm.cc_habs < BIG)
- directcost = Wcm.cc_habs, dcm = Wcm.cm_habs;
- else if (col == curX && Wcm.cc_vabs < BIG)
- directcost = Wcm.cc_vabs, dcm = Wcm.cm_vabs;
+ directcost = tty->Wcm->cc_abs, dcm = tty->Wcm->cm_abs;
+ if (row == curY (tty) && tty->Wcm->cc_habs < BIG)
+ directcost = tty->Wcm->cc_habs, dcm = tty->Wcm->cm_habs;
+ else if (col == curX (tty) && tty->Wcm->cc_vabs < BIG)
+ directcost = tty->Wcm->cc_vabs, dcm = tty->Wcm->cm_vabs;
}
else
{
directcost = 0, relcost = 100000;
- dcm = Wcm.cm_abs;
+ dcm = tty->Wcm->cm_abs;
}
/*
@@ -400,13 +400,14 @@ cmgoto (tty, row, col)
{
/* compute REAL direct cost */
cost = 0;
- p = dcm == Wcm.cm_habs ? tgoto (dcm, row, col) :
- tgoto (dcm, col, row);
+ p = dcm == tty->Wcm->cm_habs
+ ? tgoto (dcm, row, col)
+ : tgoto (dcm, col, row);
emacs_tputs (tty, p, 1, evalcost);
if (cost <= relcost)
{ /* really is cheaper */
emacs_tputs (tty, p, 1, cmputc);
- curY = row, curX = col;
+ curY (tty) = row, curX (tty) = col;
return;
}
}
@@ -414,25 +415,25 @@ cmgoto (tty, row, col)
switch (use)
{
case USEHOME:
- emacs_tputs (tty, Wcm.cm_home, 1, cmputc);
- curY = 0, curX = 0;
+ emacs_tputs (tty, tty->Wcm->cm_home, 1, cmputc);
+ curY (tty) = 0, curX (tty) = 0;
break;
case USELL:
- emacs_tputs (tty, Wcm.cm_ll, 1, cmputc);
- curY = Wcm.cm_rows - 1, curX = 0;
+ emacs_tputs (tty, tty->Wcm->cm_ll, 1, cmputc);
+ curY (tty) = tty->Wcm->cm_rows - 1, curX (tty) = 0;
break;
case USECR:
- emacs_tputs (tty, Wcm.cm_cr, 1, cmputc);
- if (Wcm.cm_autolf)
- curY++;
- curX = 0;
+ emacs_tputs (tty, tty->Wcm->cm_cr, 1, cmputc);
+ if (tty->Wcm->cm_autolf)
+ curY (tty)++;
+ curX (tty) = 0;
break;
}
- (void) calccost (tty, curY, curX, row, col, 1);
- curY = row, curX = col;
+ (void) calccost (tty, curY (tty), curX (tty), row, col, 1);
+ curY (tty) = row, curX (tty) = col;
}
/* Clear out all terminal info.
@@ -440,9 +441,9 @@ cmgoto (tty, row, col)
*/
void
-Wcm_clear ()
+Wcm_clear (struct tty_output *tty)
{
- bzero (&Wcm, sizeof Wcm);
+ bzero (tty->Wcm, sizeof (struct cm));
UP = 0;
BC = 0;
}
@@ -455,21 +456,21 @@ Wcm_clear ()
*/
int
-Wcm_init ()
+Wcm_init (struct tty_output *tty)
{
#if 0
- if (Wcm.cm_abs && !Wcm.cm_ds)
+ if (tty->Wcm->cm_abs && !tty->Wcm->cm_ds)
return 0;
#endif
- if (Wcm.cm_abs)
+ if (tty->Wcm->cm_abs)
return 0;
/* Require up and left, and, if no absolute, down and right */
- if (!Wcm.cm_up || !Wcm.cm_left)
+ if (!tty->Wcm->cm_up || !tty->Wcm->cm_left)
return - 1;
- if (!Wcm.cm_abs && (!Wcm.cm_down || !Wcm.cm_right))
+ if (!tty->Wcm->cm_abs && (!tty->Wcm->cm_down || !tty->Wcm->cm_right))
return - 1;
/* Check that we know the size of the screen.... */
- if (Wcm.cm_rows <= 0 || Wcm.cm_cols <= 0)
+ if (tty->Wcm->cm_rows <= 0 || tty->Wcm->cm_cols <= 0)
return - 2;
return 0;
}
diff --git a/src/cm.h b/src/cm.h
index 18d82c3748a..de78ed2ef88 100644
--- a/src/cm.h
+++ b/src/cm.h
@@ -98,66 +98,65 @@ struct cm
int cc_vabs;
};
-extern struct cm Wcm; /* Terminal capabilities */
extern char PC; /* Pad character */
/* Shorthand */
#ifndef NoCMShortHand
-#define curY Wcm.cm_curY
-#define curX Wcm.cm_curX
-#define Up Wcm.cm_up
-#define Down Wcm.cm_down
-#define Left Wcm.cm_left
-#define Right Wcm.cm_right
-#define Tab Wcm.cm_tab
-#define BackTab Wcm.cm_backtab
-#define TabWidth Wcm.cm_tabwidth
-#define CR Wcm.cm_cr
-#define Home Wcm.cm_home
-#define LastLine Wcm.cm_ll
-#define AbsPosition Wcm.cm_abs
-#define ColPosition Wcm.cm_habs
-#define RowPosition Wcm.cm_vabs
-#define MultiUp Wcm.cm_multiup
-#define MultiDown Wcm.cm_multidown
-#define MultiLeft Wcm.cm_multileft
-#define MultiRight Wcm.cm_multiright
-#define AutoWrap Wcm.cm_autowrap
-#define MagicWrap Wcm.cm_magicwrap
-#define UseTabs Wcm.cm_usetabs
-#define FrameRows Wcm.cm_rows
-#define FrameCols Wcm.cm_cols
-
-#define UpCost Wcm.cc_up
-#define DownCost Wcm.cc_down
-#define LeftCost Wcm.cc_left
-#define RightCost Wcm.cc_right
-#define HomeCost Wcm.cc_home
-#define CRCost Wcm.cc_cr
-#define LastLineCost Wcm.cc_ll
-#define TabCost Wcm.cc_tab
-#define BackTabCost Wcm.cc_backtab
-#define AbsPositionCost Wcm.cc_abs
-#define ColPositionCost Wcm.cc_habs
-#define RowPositionCost Wcm.cc_vabs
-#define MultiUpCost Wcm.cc_multiup
-#define MultiDownCost Wcm.cc_multidown
-#define MultiLeftCost Wcm.cc_multileft
-#define MultiRightCost Wcm.cc_multiright
+#define curY(tty) (tty)->Wcm->cm_curY
+#define curX(tty) (tty)->Wcm->cm_curX
+#define Up(tty) (tty)->Wcm->cm_up
+#define Down(tty) (tty)->Wcm->cm_down
+#define Left(tty) (tty)->Wcm->cm_left
+#define Right(tty) (tty)->Wcm->cm_right
+#define Tab(tty) (tty)->Wcm->cm_tab
+#define BackTab(tty) (tty)->Wcm->cm_backtab
+#define TabWidth(tty) (tty)->Wcm->cm_tabwidth
+#define CR(tty) (tty)->Wcm->cm_cr
+#define Home(tty) (tty)->Wcm->cm_home
+#define LastLine(tty) (tty)->Wcm->cm_ll
+#define AbsPosition(tty) (tty)->Wcm->cm_abs
+#define ColPosition(tty) (tty)->Wcm->cm_habs
+#define RowPosition(tty) (tty)->Wcm->cm_vabs
+#define MultiUp(tty) (tty)->Wcm->cm_multiup
+#define MultiDown(tty) (tty)->Wcm->cm_multidown
+#define MultiLeft(tty) (tty)->Wcm->cm_multileft
+#define MultiRight(tty) (tty)->Wcm->cm_multiright
+#define AutoWrap(tty) (tty)->Wcm->cm_autowrap
+#define MagicWrap(tty) (tty)->Wcm->cm_magicwrap
+#define UseTabs(tty) (tty)->Wcm->cm_usetabs
+#define FrameRows(tty) (tty)->Wcm->cm_rows
+#define FrameCols(tty) (tty)->Wcm->cm_cols
+
+#define UpCost(tty) (tty)->Wcm->cc_up
+#define DownCost(tty) (tty)->Wcm->cc_down
+#define LeftCost(tty) (tty)->Wcm->cc_left
+#define RightCost(tty) (tty)->Wcm->cc_right
+#define HomeCost(tty) (tty)->Wcm->cc_home
+#define CRCost(tty) (tty)->Wcm->cc_cr
+#define LastLineCost(tty) (tty)->Wcm->cc_ll
+#define TabCost(tty) (tty)->Wcm->cc_tab
+#define BackTabCost(tty) (tty)->Wcm->cc_backtab
+#define AbsPositionCost(tty) (tty)->Wcm->cc_abs
+#define ColPositionCost(tty) (tty)->Wcm->cc_habs
+#define RowPositionCost(tty) (tty)->Wcm->cc_vabs
+#define MultiUpCost(tty) (tty)->Wcm->cc_multiup
+#define MultiDownCost(tty) (tty)->Wcm->cc_multidown
+#define MultiLeftCost(tty) (tty)->Wcm->cc_multileft
+#define MultiRightCost(tty) (tty)->Wcm->cc_multiright
#endif
-#define cmat(row,col) (curY = (row), curX = (col))
-#define cmplus(n) \
- { \
- if ((curX += (n)) >= FrameCols && !MagicWrap) \
- { \
- if (Wcm.cm_losewrap) losecursor (); \
- else if (AutoWrap) curX = 0, curY++; \
- else curX--; \
- } \
+#define cmat(tty,row,col) (curY(tty) = (row), curX(tty) = (col))
+#define cmplus(tty,n) \
+ { \
+ if ((curX (tty) += (n)) >= FrameCols (tty) && !MagicWrap (tty)) \
+ { \
+ if ((tty)->Wcm->cm_losewrap) losecursor (tty); \
+ else if (AutoWrap (tty)) curX (tty) = 0, curY (tty)++; \
+ else curX (tty)--; \
+ } \
}
-#define losecursor() (curX = -1, curY = -1)
+#define losecursor(tty) (curX(tty) = -1, curY(tty) = -1)
extern int cost;
extern int evalcost ();
@@ -167,10 +166,10 @@ extern int evalcost ();
extern struct tty_output *current_tty;
extern void cmcheckmagic P_ ((struct tty_output *));
extern int cmputc P_ ((int));
-extern void cmcostinit ();
+extern void cmcostinit P_ ((struct tty_output *tty));
extern void cmgoto P_ ((struct tty_output *, int, int));
-extern void Wcm_clear ();
-extern int Wcm_init ();
+extern void Wcm_clear P_ ((struct tty_output *tty));
+extern int Wcm_init P_ ((struct tty_output *tty));
/* arch-tag: acc1535a-7136-49d6-b22d-9bc85702251b
(do not change this comment) */
diff --git a/src/dispextern.h b/src/dispextern.h
index 0d127ba778d..195d080ca92 100644
--- a/src/dispextern.h
+++ b/src/dispextern.h
@@ -2558,7 +2558,7 @@ extern int x_intersect_rectangles P_ ((XRectangle *, XRectangle *,
void get_tty_size P_ ((struct tty_output *, int *, int *));
void request_sigio P_ ((void));
void unrequest_sigio P_ ((void));
-int tabs_safe_p P_ ((void));
+int tabs_safe_p P_ ((struct tty_output *));
void init_baud_rate P_ ((void));
void init_sigio P_ ((int));
@@ -2724,8 +2724,8 @@ extern Lisp_Object Qredisplay_dont_pause;
/* Defined in term.c */
extern void ring_bell P_ ((void));
-extern void set_terminal_modes P_ ((struct tty_output *));
-extern void reset_terminal_modes P_ ((struct tty_output *));
+extern void set_terminal_modes P_ (());
+extern void reset_terminal_modes P_ (());
extern void update_begin P_ ((struct frame *));
extern void update_end P_ ((struct frame *));
extern void set_terminal_window P_ ((int));
diff --git a/src/dispnew.c b/src/dispnew.c
index b25b31b3aab..9d7281f32d4 100644
--- a/src/dispnew.c
+++ b/src/dispnew.c
@@ -259,10 +259,6 @@ Lisp_Object selected_frame;
struct frame *last_nonminibuf_frame;
-/* Structure for info on cursor positioning. */
-
-struct cm Wcm;
-
/* 1 means SIGWINCH happened when not safe. */
int delayed_size_change;
@@ -6059,7 +6055,7 @@ change_frame_size_1 (f, newheight, newwidth, pretend, delay, safe)
newheight - FRAME_TOP_MARGIN (f), 0);
if (FRAME_TERMCAP_P (f) && !pretend)
- FrameRows = newheight;
+ FrameRows (FRAME_TTY (f)) = newheight;
}
if (new_frame_total_cols != FRAME_TOTAL_COLS (f))
@@ -6069,7 +6065,7 @@ change_frame_size_1 (f, newheight, newwidth, pretend, delay, safe)
set_window_width (FRAME_MINIBUF_WINDOW (f), new_frame_total_cols, 0);
if (FRAME_TERMCAP_P (f) && !pretend)
- FrameCols = newwidth;
+ FrameCols (FRAME_TTY (f)) = newwidth;
if (WINDOWP (f->tool_bar_window))
XSETFASTINT (XWINDOW (f->tool_bar_window)->total_cols, newwidth);
diff --git a/src/frame.c b/src/frame.c
index 7945ba0454b..158aa1058fc 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -752,7 +752,7 @@ do_switch_frame (frame, track, for_deletion)
&& FRAME_TERMCAP_P (XFRAME (frame))
&& FRAME_TTY (XFRAME (selected_frame)) == FRAME_TTY (XFRAME (frame)))
{
- XFRAME (selected_frame)->async_visible = 0;
+ XFRAME (selected_frame)->async_visible = 2; /* obscured */
XFRAME (frame)->async_visible = 1;
FRAME_TTY (XFRAME (frame))->top_frame = frame;
}
diff --git a/src/frame.h b/src/frame.h
index 8b081e881a9..06af557f3ee 100644
--- a/src/frame.h
+++ b/src/frame.h
@@ -341,13 +341,13 @@ struct frame
frame becomes visible again, it must be marked as garbaged. The
FRAME_SAMPLE_VISIBILITY macro takes care of this.
- On Windows NT/9X, to avoid wasting effort updating visible frames
- that are actually completely obscured by other windows on the
- display, we bend the meaning of visible slightly: if greater than
- 1, then the frame is obscured - we still consider it to be
- "visible" as seen from lisp, but we don't bother updating it. We
- must take care to garbage the frame when it ceaces to be obscured
- though. Note that these semantics are only used on NT/9X.
+ On ttys and on Windows NT/9X, to avoid wasting effort updating
+ visible frames that are actually completely obscured by other
+ windows on the display, we bend the meaning of visible slightly:
+ if greater than 1, then the frame is obscured - we still consider
+ it to be "visible" as seen from lisp, but we don't bother
+ updating it. We must take care to garbage the frame when it
+ ceaces to be obscured though.
iconified is nonzero if the frame is currently iconified.
diff --git a/src/keyboard.c b/src/keyboard.c
index 069c605dc6a..810cf682b18 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -6460,7 +6460,7 @@ get_filtered_input_pending (addr, do_timers_now, filter_events)
/* If input is being read as it arrives, and we have none, there is none. */
if (*addr > 0 || (interrupt_input && ! interrupts_deferred))
return;
-
+
/* Try to read some input and see how much we get. */
gobble_input (0);
*addr = (!NILP (Vquit_flag)
@@ -6579,7 +6579,7 @@ read_avail_input (expected)
struct input_event buf[KBD_BUFFER_SIZE];
register int i;
int nread;
-
+
for (i = 0; i < KBD_BUFFER_SIZE; i++)
EVENT_INIT (buf[i]);
@@ -6611,8 +6611,8 @@ read_avail_input (expected)
nread = 0;
/* Try to read from each available tty, until one succeeds. */
- for (tty = tty_list; tty && !nread; tty = tty->next) {
-
+ for (tty = tty_list; tty; tty = tty->next) {
+
/* Determine how many characters we should *try* to read. */
#ifdef FIONREAD
/* Find out how much input is available. */
@@ -6624,6 +6624,7 @@ read_avail_input (expected)
/* ??? Is it really right to send the signal just to this process
rather than to the whole process group?
Perhaps on systems with FIONREAD Emacs is alone in its group. */
+ /* It appears to be the case, see narrow_foreground_group. */
if (! noninteractive)
{
if (! tty_list->next)
@@ -6706,15 +6707,20 @@ read_avail_input (expected)
#endif /* USG or DGUX or CYGWIN */
#endif /* no FIONREAD */
+ if (nread > 0)
+ break;
} /* for each tty */
- if (! nread)
+ if (nread <= 0)
return 0;
#endif /* not MSDOS */
#endif /* not WINDOWSNT */
- /* XXX Select frame corresponding to the tty. */
+ /* Select frame corresponding to the active tty. Note that the
+ value of selected_frame is not reliable here, redisplay tends
+ to temporarily change it. But tty should always be non-NULL. */
+ Lisp_Object frame = (tty ? tty->top_frame : selected_frame);
for (i = 0; i < nread; i++)
{
@@ -6725,8 +6731,8 @@ read_avail_input (expected)
if (meta_key != 2)
cbuf[i] &= ~0x80;
- buf[i].code = cbuf[i];
- buf[i].frame_or_window = selected_frame;
+ buf[i].code = cbuf[i];
+ buf[i].frame_or_window = frame;
buf[i].arg = Qnil;
}
}
diff --git a/src/lisp.h b/src/lisp.h
index c2df96fe82d..de71cf7f7c9 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -2952,7 +2952,6 @@ extern void child_setup_tty P_ ((int));
extern void setup_pty P_ ((int));
extern int set_window_size P_ ((int, int, int));
extern void create_process P_ ((Lisp_Object, char **, Lisp_Object));
-extern int tabs_safe_p P_ ((void));
extern void init_baud_rate P_ ((void));
extern int emacs_open P_ ((const char *, int, int));
extern int emacs_close P_ ((int));
diff --git a/src/sysdep.c b/src/sysdep.c
index 68cef5b7bd2..946e2c1384a 100644
--- a/src/sysdep.c
+++ b/src/sysdep.c
@@ -249,8 +249,8 @@ int emacs_ospeed;
void croak P_ ((char *));
#ifdef AIXHFT
-void hft_init ();
-void hft_reset ();
+void hft_init P_ ((struct tty_output *));
+void hft_reset P_ ((struct tty_output *));
#endif
/* Temporary used by `sigblock' when defined in terms of signprocmask. */
@@ -282,8 +282,12 @@ discard_tty_input ()
#else /* not VMS */
#ifdef APOLLO
{
- int zero = 0;
- ioctl (fileno (TTY_INPUT (CURTTY())), TIOCFLUSH, &zero);
+ struct tty_output *tty;
+ for (tty = tty_list; tty; tty = tty->next)
+ {
+ int zero = 0;
+ ioctl (fileno (TTY_INPUT (tty)), TIOCFLUSH, &zero);
+ }
}
#else /* not Apollo */
#ifdef MSDOS /* Demacs 1.1.1 91/10/16 HIRANO Satoshi */
@@ -310,12 +314,7 @@ discard_tty_input ()
the terminal. */
void
-#ifdef PROTOTYPES
stuff_char (char c)
-#else
-stuff_char (c)
- char c;
-#endif
{
if (read_socket_hook)
return;
@@ -1074,22 +1073,23 @@ int inherited_pgroup;
group, redirect the TTY to point to our own process group. We need
to be in our own process group to receive SIGIO properly. */
void
-narrow_foreground_group ()
+narrow_foreground_group (struct tty_output *tty)
{
int me = getpid ();
setpgrp (0, inherited_pgroup);
+ /* XXX This only works on the controlling tty. */
if (inherited_pgroup != me)
- EMACS_SET_TTY_PGRP (fileno (stdin), &me); /* stdin is intentional here */
+ EMACS_SET_TTY_PGRP (fileno (TTY_INPUT (tty)), &me);
setpgrp (0, me);
}
/* Set the tty to our original foreground group. */
void
-widen_foreground_group ()
+widen_foreground_group (struct tty_output *tty)
{
if (inherited_pgroup != getpid ())
- EMACS_SET_TTY_PGRP (fileno (stdin), &inherited_pgroup); /* stdin is intentional here */
+ EMACS_SET_TTY_PGRP (fileno (TTY_INPUT (tty)), &inherited_pgroup);
setpgrp (0, inherited_pgroup);
}
@@ -1353,7 +1353,7 @@ nil means don't delete them until `list-processes' is run. */);
#ifdef BSD_PGRPS
if (! read_socket_hook && EQ (Vwindow_system, Qnil))
- narrow_foreground_group ();
+ narrow_foreground_group (tty_out);
#endif
#ifdef HAVE_WINDOW_SYSTEM
@@ -1578,7 +1578,7 @@ nil means don't delete them until `list-processes' is run. */);
#endif
#ifdef AIXHFT
- hft_init ();
+ hft_init (tty_out);
#ifdef IBMR2AIX
{
/* IBM's HFT device usually thinks a ^J should be LF/CR. We need it
@@ -1678,12 +1678,12 @@ nil means don't delete them until `list-processes' is run. */);
At the time this is called, init_sys_modes has not been done yet. */
int
-tabs_safe_p ()
+tabs_safe_p (struct tty_output *tty)
{
- struct emacs_tty tty;
+ struct emacs_tty etty;
- EMACS_GET_TTY (fileno (TTY_INPUT (CURTTY())), &tty);
- return EMACS_TTY_TABS_OK (&tty);
+ EMACS_GET_TTY (fileno (TTY_INPUT (tty)), &etty);
+ return EMACS_TTY_TABS_OK (&etty);
}
/* Get terminal size from system.
@@ -1888,7 +1888,7 @@ reset_sys_modes (tty_out)
#endif
#ifdef BSD_PGRPS
- widen_foreground_group ();
+ widen_foreground_group (tty_out);
#endif
}
@@ -5098,7 +5098,7 @@ srandom (seed)
/* Called from init_sys_modes. */
void
-hft_init ()
+hft_init (struct tty_output *tty_out)
{
int junk;
@@ -5146,14 +5146,14 @@ hft_init ()
}
/* The HFT system on AIX doesn't optimize for scrolling, so it's really ugly
at times. */
- TTY_LINE_INS_DEL_OK (CURTTY ()) = 0;
- TTY_CHAR_INS_DEL_OK (CURTTY ()) = 0;
+ TTY_LINE_INS_DEL_OK (tty_out) = 0;
+ TTY_CHAR_INS_DEL_OK (tty_out) = 0;
}
/* Reset the rubout key to backspace. */
void
-hft_reset ()
+hft_reset (struct tty_output *tty_out)
{
struct hfbuf buf;
struct hfkeymap keymap;
diff --git a/src/term.c b/src/term.c
index 1df6e67a353..80e5e437e43 100644
--- a/src/term.c
+++ b/src/term.c
@@ -72,17 +72,23 @@ static void turn_off_face P_ ((struct frame *, int face_id));
static void tty_show_cursor P_ ((void));
static void tty_hide_cursor P_ ((void));
-#define OUTPUT(tty, a) \
- emacs_tputs ((tty), a, (int) (FRAME_LINES (XFRAME (selected_frame)) - curY), cmputc)
+#define OUTPUT(tty, a) \
+ emacs_tputs ((tty), a, \
+ (int) (FRAME_LINES (XFRAME (selected_frame)) \
+ - curY (tty)), \
+ cmputc)
+
#define OUTPUT1(tty, a) emacs_tputs ((tty), a, 1, cmputc)
#define OUTPUTL(tty, a, lines) emacs_tputs ((tty), a, lines, cmputc)
#define OUTPUT_IF(tty, a) \
- do { \
- if (a) \
- emacs_tputs ((tty), a, (int) (FRAME_LINES (XFRAME (selected_frame)) \
- - curY), cmputc); \
- } while (0)
+ do { \
+ if (a) \
+ emacs_tputs ((tty), a, \
+ (int) (FRAME_LINES (XFRAME (selected_frame)) \
+ - curY (tty) ), \
+ cmputc); \
+ } while (0)
#define OUTPUT1_IF(tty, a) do { if (a) emacs_tputs ((tty), a, 1, cmputc); } while (0)
@@ -407,6 +413,8 @@ extern char *tgetstr ();
void
ring_bell ()
{
+ struct frame *f = (updating_frame ? updating_frame : XFRAME (selected_frame));
+
if (!NILP (Vring_bell_function))
{
Lisp_Object function;
@@ -426,32 +434,37 @@ ring_bell ()
Vring_bell_function = function;
}
- else if (!FRAME_TERMCAP_P (XFRAME (selected_frame)))
+ else if (!FRAME_TERMCAP_P (f))
(*ring_bell_hook) ();
else {
- OUTPUT (CURTTY (), TS_visible_bell && visible_bell ? TS_visible_bell : TS_bell);
+ struct tty_output *tty = FRAME_TTY (f);
+ OUTPUT (tty, TS_visible_bell && visible_bell ? TS_visible_bell : TS_bell);
}
}
void
-set_terminal_modes (struct tty_output *tty)
+set_terminal_modes ()
{
- if (FRAME_TERMCAP_P (XFRAME (selected_frame)))
+ struct frame *f = (updating_frame ? updating_frame : XFRAME (selected_frame));
+ if (FRAME_TERMCAP_P (f))
{
+ struct tty_output *tty = FRAME_TTY (f);
OUTPUT_IF (tty, TS_termcap_modes);
OUTPUT_IF (tty, TS_cursor_visible);
OUTPUT_IF (tty, TS_keypad_mode);
- losecursor ();
+ losecursor (tty);
}
else
(*set_terminal_modes_hook) ();
}
void
-reset_terminal_modes (struct tty_output *tty)
+reset_terminal_modes ()
{
- if (FRAME_TERMCAP_P (XFRAME (selected_frame)))
+ struct frame *f = (updating_frame ? updating_frame : XFRAME (selected_frame));
+ if (FRAME_TERMCAP_P (f))
{
+ struct tty_output *tty = FRAME_TTY (f);
turn_off_highlight ();
turn_off_insert ();
OUTPUT_IF (tty, TS_end_keypad_mode);
@@ -496,10 +509,12 @@ void
set_terminal_window (size)
int size;
{
- if (FRAME_TERMCAP_P (updating_frame))
+ struct frame *f = (updating_frame ? updating_frame : XFRAME (selected_frame));
+ if (FRAME_TERMCAP_P (f))
{
- specified_window = size ? size : FRAME_LINES (updating_frame);
- if (TTY_SCROLL_REGION_OK (FRAME_TTY (updating_frame)))
+ struct tty_output *tty = FRAME_TTY (f);
+ specified_window = size ? size : FRAME_LINES (f);
+ if (TTY_SCROLL_REGION_OK (tty))
set_scroll_region (0, specified_window);
}
else
@@ -511,9 +526,8 @@ set_scroll_region (start, stop)
int start, stop;
{
char *buf;
- struct frame *f = (updating_frame
- ? updating_frame
- : XFRAME (selected_frame));
+ struct frame *f = (updating_frame ? updating_frame : XFRAME (selected_frame));
+ struct tty_output *tty = FRAME_TTY (f);
if (TS_set_scroll_region)
buf = tparam (TS_set_scroll_region, 0, 0, start, stop - 1);
@@ -525,31 +539,29 @@ set_scroll_region (start, stop)
else
buf = tparam (TS_set_window, 0, 0, start, 0, stop, FRAME_COLS (f));
- OUTPUT (FRAME_TTY (f), buf);
+ OUTPUT (tty, buf);
xfree (buf);
- losecursor ();
+ losecursor (tty);
}
static void
turn_on_insert ()
{
- struct frame *f = (updating_frame
- ? updating_frame
- : XFRAME (selected_frame));
+ struct frame *f = (updating_frame ? updating_frame : XFRAME (selected_frame));
+ struct tty_output *tty = FRAME_TTY (f);
if (!insert_mode)
- OUTPUT (FRAME_TTY (f), TS_insert_mode);
+ OUTPUT (tty, TS_insert_mode);
insert_mode = 1;
}
void
turn_off_insert ()
{
- struct frame *f = (updating_frame
- ? updating_frame
- : XFRAME (selected_frame));
+ struct frame *f = (updating_frame ? updating_frame : XFRAME (selected_frame));
+ struct tty_output *tty = FRAME_TTY (f);
if (insert_mode)
- OUTPUT (FRAME_TTY (f), TS_end_insert_mode);
+ OUTPUT (tty, TS_end_insert_mode);
insert_mode = 0;
}
@@ -558,22 +570,20 @@ turn_off_insert ()
void
turn_off_highlight ()
{
- struct frame *f = (updating_frame
- ? updating_frame
- : XFRAME (selected_frame));
+ struct frame *f = (updating_frame ? updating_frame : XFRAME (selected_frame));
+ struct tty_output *tty = FRAME_TTY (f);
if (standout_mode)
- OUTPUT_IF (FRAME_TTY (f), TS_end_standout_mode);
+ OUTPUT_IF (tty, TS_end_standout_mode);
standout_mode = 0;
}
static void
turn_on_highlight ()
{
- struct frame *f = (updating_frame
- ? updating_frame
- : XFRAME (selected_frame));
+ struct frame *f = (updating_frame ? updating_frame : XFRAME (selected_frame));
+ struct tty_output *tty = FRAME_TTY (f);
if (!standout_mode)
- OUTPUT_IF (FRAME_TTY (f), TS_standout_mode);
+ OUTPUT_IF (tty, TS_standout_mode);
standout_mode = 1;
}
@@ -592,14 +602,12 @@ toggle_highlight ()
static void
tty_hide_cursor ()
{
- struct frame *f = (updating_frame
- ? updating_frame
- : XFRAME (selected_frame));
-
+ struct frame *f = (updating_frame ? updating_frame : XFRAME (selected_frame));
+ struct tty_output *tty = FRAME_TTY (f);
if (tty_cursor_hidden == 0)
{
tty_cursor_hidden = 1;
- OUTPUT_IF (FRAME_TTY (f), TS_cursor_invisible);
+ OUTPUT_IF (tty, TS_cursor_invisible);
}
}
@@ -609,15 +617,14 @@ tty_hide_cursor ()
static void
tty_show_cursor ()
{
- struct frame *f = (updating_frame
- ? updating_frame
- : XFRAME (selected_frame));
+ struct frame *f = (updating_frame ? updating_frame : XFRAME (selected_frame));
+ struct tty_output *tty = FRAME_TTY (f);
if (tty_cursor_hidden)
{
tty_cursor_hidden = 0;
- OUTPUT_IF (FRAME_TTY (f), TS_cursor_normal);
- OUTPUT_IF (FRAME_TTY (f), TS_cursor_visible);
+ OUTPUT_IF (tty, TS_cursor_normal);
+ OUTPUT_IF (tty, TS_cursor_visible);
}
}
@@ -654,7 +661,7 @@ void
cursor_to (vpos, hpos)
int vpos, hpos;
{
- struct frame *f = updating_frame ? updating_frame : XFRAME (selected_frame);
+ struct frame *f = (updating_frame ? updating_frame : XFRAME (selected_frame));
if (! FRAME_TERMCAP_P (f) && cursor_to_hook)
{
@@ -662,18 +669,21 @@ cursor_to (vpos, hpos)
return;
}
+ struct tty_output *tty = FRAME_TTY (f);
+
/* Detect the case where we are called from reset_sys_modes
and the costs have never been calculated. Do nothing. */
if (! costs_set)
return;
- if (curY == vpos && curX == hpos)
+ if (curY (tty) == vpos
+ && curX (tty) == hpos)
return;
if (!TF_standout_motion)
background_highlight ();
if (!TF_insmode_motion)
turn_off_insert ();
- cmgoto (FRAME_TTY (f), vpos, hpos);
+ cmgoto (tty, vpos, hpos);
}
/* Similar but don't take any account of the wasted characters. */
@@ -688,13 +698,15 @@ raw_cursor_to (row, col)
(*raw_cursor_to_hook) (row, col);
return;
}
- if (curY == row && curX == col)
+ struct tty_output *tty = FRAME_TTY (f);
+ if (curY (tty) == row
+ && curX (tty) == col)
return;
if (!TF_standout_motion)
background_highlight ();
if (!TF_insmode_motion)
turn_off_insert ();
- cmgoto (FRAME_TTY (f), row, col);
+ cmgoto (tty, row, col);
}
/* Erase operations */
@@ -705,23 +717,22 @@ clear_to_end ()
{
register int i;
- struct frame *f = (updating_frame
- ? updating_frame
- : XFRAME (selected_frame));
+ struct frame *f = (updating_frame ? updating_frame : XFRAME (selected_frame));
if (clear_to_end_hook && ! FRAME_TERMCAP_P (f))
{
(*clear_to_end_hook) ();
return;
}
+ struct tty_output *tty = FRAME_TTY (f);
if (TS_clr_to_bottom)
{
background_highlight ();
- OUTPUT (FRAME_TTY (f), TS_clr_to_bottom);
+ OUTPUT (tty, TS_clr_to_bottom);
}
else
{
- for (i = curY; i < FRAME_LINES (f); i++)
+ for (i = curY (tty); i < FRAME_LINES (f); i++)
{
cursor_to (i, 0);
clear_end_of_line (FRAME_COLS (f));
@@ -734,20 +745,19 @@ clear_to_end ()
void
clear_frame ()
{
- struct frame *f = (updating_frame
- ? updating_frame
- : XFRAME (selected_frame));
+ struct frame *f = (updating_frame ? updating_frame : XFRAME (selected_frame));
if (clear_frame_hook && ! FRAME_TERMCAP_P (f))
{
(*clear_frame_hook) ();
return;
}
+ struct tty_output *tty = FRAME_TTY (f);
if (TS_clr_frame)
{
background_highlight ();
- OUTPUT (FRAME_TTY (f), TS_clr_frame);
- cmat (0, 0);
+ OUTPUT (tty, TS_clr_frame);
+ cmat (tty, 0, 0);
}
else
{
@@ -767,9 +777,7 @@ clear_end_of_line (first_unused_hpos)
{
register int i;
- struct frame *f = (updating_frame
- ? updating_frame
- : XFRAME (selected_frame));
+ struct frame *f = (updating_frame ? updating_frame : XFRAME (selected_frame));
if (clear_end_of_line_hook
&& ! FRAME_TERMCAP_P (f))
@@ -778,34 +786,37 @@ clear_end_of_line (first_unused_hpos)
return;
}
+ struct tty_output *tty = FRAME_TTY (f);
+
/* Detect the case where we are called from reset_sys_modes
and the costs have never been calculated. Do nothing. */
if (! costs_set)
return;
- if (curX >= first_unused_hpos)
+ if (curX (tty) >= first_unused_hpos)
return;
background_highlight ();
if (TS_clr_line)
{
- OUTPUT1 (FRAME_TTY (f), TS_clr_line);
+ OUTPUT1 (tty, TS_clr_line);
}
else
{ /* have to do it the hard way */
turn_off_insert ();
/* Do not write in last row last col with Auto-wrap on. */
- if (AutoWrap && curY == FRAME_LINES (f) - 1
+ if (AutoWrap (tty)
+ && curY (tty) == FRAME_LINES (f) - 1
&& first_unused_hpos == FRAME_COLS (f))
first_unused_hpos--;
- for (i = curX; i < first_unused_hpos; i++)
+ for (i = curX (tty); i < first_unused_hpos; i++)
{
- if (TTY_TERMSCRIPT (FRAME_TTY (f)))
- fputc (' ', TTY_TERMSCRIPT (FRAME_TTY (f)));
- fputc (' ', TTY_OUTPUT (FRAME_TTY (f)));
+ if (TTY_TERMSCRIPT (tty))
+ fputc (' ', TTY_TERMSCRIPT (tty));
+ fputc (' ', TTY_OUTPUT (tty));
}
- cmplus (first_unused_hpos - curX);
+ cmplus (tty, first_unused_hpos - curX (tty));
}
}
@@ -935,20 +946,22 @@ write_glyphs (string, len)
return;
}
+ struct tty_output *tty = FRAME_TTY (f);
+
turn_off_insert ();
tty_hide_cursor ();
/* Don't dare write in last column of bottom line, if Auto-Wrap,
since that would scroll the whole frame on some terminals. */
- if (AutoWrap
- && curY + 1 == FRAME_LINES (f)
- && (curX + len) == FRAME_COLS (f))
+ if (AutoWrap (tty)
+ && curY (tty) + 1 == FRAME_LINES (f)
+ && (curX (tty) + len) == FRAME_COLS (f))
len --;
if (len <= 0)
return;
- cmplus (len);
+ cmplus (tty, len);
/* The mode bit CODING_MODE_LAST_BLOCK should be set to 1 only at
the tail. */
@@ -979,12 +992,12 @@ write_glyphs (string, len)
if (produced > 0)
{
fwrite (conversion_buffer, 1, produced,
- TTY_OUTPUT (FRAME_TTY (f)));
- if (ferror (TTY_OUTPUT (FRAME_TTY (f))))
- clearerr (TTY_OUTPUT (FRAME_TTY (f)));
- if (TTY_TERMSCRIPT (FRAME_TTY (f)))
+ TTY_OUTPUT (tty));
+ if (ferror (TTY_OUTPUT (tty)))
+ clearerr (TTY_OUTPUT (tty));
+ if (TTY_TERMSCRIPT (tty))
fwrite (conversion_buffer, 1, produced,
- TTY_TERMSCRIPT (FRAME_TTY (f)));
+ TTY_TERMSCRIPT (tty));
}
len -= consumed;
n -= consumed;
@@ -1005,16 +1018,16 @@ write_glyphs (string, len)
if (terminal_coding.produced > 0)
{
fwrite (conversion_buffer, 1, terminal_coding.produced,
- TTY_OUTPUT (FRAME_TTY (f)));
- if (ferror (TTY_OUTPUT (FRAME_TTY (f))))
- clearerr (TTY_OUTPUT (FRAME_TTY (f)));
- if (TTY_TERMSCRIPT (FRAME_TTY (f)))
+ TTY_OUTPUT (tty));
+ if (ferror (TTY_OUTPUT (tty)))
+ clearerr (TTY_OUTPUT (tty));
+ if (TTY_TERMSCRIPT (tty))
fwrite (conversion_buffer, 1, terminal_coding.produced,
- TTY_TERMSCRIPT (FRAME_TTY (f)));
+ TTY_TERMSCRIPT (tty));
}
}
- cmcheckmagic (FRAME_TTY (f));
+ cmcheckmagic (tty);
}
/* If start is zero, insert blanks instead of a string at start */
@@ -1026,23 +1039,23 @@ insert_glyphs (start, len)
{
char *buf;
struct glyph *glyph = NULL;
- struct frame *f;
+ struct frame *f = (updating_frame ? updating_frame : XFRAME (selected_frame));
if (len <= 0)
return;
- if (insert_glyphs_hook)
+ if (insert_glyphs_hook && ! FRAME_TERMCAP_P (f))
{
(*insert_glyphs_hook) (start, len);
return;
}
- f = updating_frame ? updating_frame : XFRAME (selected_frame);
+ struct tty_output *tty = FRAME_TTY (f);
if (TS_ins_multi_chars)
{
buf = tparam (TS_ins_multi_chars, 0, 0, len);
- OUTPUT1 (FRAME_TTY (f), buf);
+ OUTPUT1 (tty, buf);
xfree (buf);
if (start)
write_glyphs (start, len);
@@ -1050,7 +1063,7 @@ insert_glyphs (start, len)
}
turn_on_insert ();
- cmplus (len);
+ cmplus (tty, len);
/* The bit CODING_MODE_LAST_BLOCK should be set to 1 only at the tail. */
terminal_coding.mode &= ~CODING_MODE_LAST_BLOCK;
while (len-- > 0)
@@ -1059,7 +1072,7 @@ insert_glyphs (start, len)
unsigned char conversion_buffer[1024];
int conversion_buffer_size = sizeof conversion_buffer;
- OUTPUT1_IF (FRAME_TTY (f), TS_ins_char);
+ OUTPUT1_IF (tty, TS_ins_char);
if (!start)
{
conversion_buffer[0] = SPACEGLYPH;
@@ -1075,7 +1088,7 @@ insert_glyphs (start, len)
occupies more than one column. */
while (len && CHAR_GLYPH_PADDING_P (*start))
{
- OUTPUT1_IF (FRAME_TTY (f), TS_ins_char);
+ OUTPUT1_IF (tty, TS_ins_char);
start++, len--;
}
@@ -1092,15 +1105,15 @@ insert_glyphs (start, len)
if (produced > 0)
{
fwrite (conversion_buffer, 1, produced,
- TTY_OUTPUT (FRAME_TTY (f)));
- if (ferror (TTY_OUTPUT (FRAME_TTY (f))))
- clearerr (TTY_OUTPUT (FRAME_TTY (f)));
- if (TTY_TERMSCRIPT (FRAME_TTY (f)))
+ TTY_OUTPUT (tty));
+ if (ferror (TTY_OUTPUT (tty)))
+ clearerr (TTY_OUTPUT (tty));
+ if (TTY_TERMSCRIPT (tty))
fwrite (conversion_buffer, 1, produced,
- TTY_TERMSCRIPT (FRAME_TTY (f)));
+ TTY_TERMSCRIPT (tty));
}
- OUTPUT1_IF (FRAME_TTY (f), TS_pad_inserted_char);
+ OUTPUT1_IF (tty, TS_pad_inserted_char);
if (start)
{
turn_off_face (f, glyph->face_id);
@@ -1108,7 +1121,7 @@ insert_glyphs (start, len)
}
}
- cmcheckmagic (FRAME_TTY (f));
+ cmcheckmagic (tty);
}
void
@@ -1117,13 +1130,16 @@ delete_glyphs (n)
{
char *buf;
register int i;
+ struct frame *f = (updating_frame ? updating_frame : XFRAME (selected_frame));
+ struct tty_output *tty = FRAME_TTY (f);
- if (delete_glyphs_hook && ! FRAME_TERMCAP_P (updating_frame))
+ if (delete_glyphs_hook && ! FRAME_TERMCAP_P (f))
{
(*delete_glyphs_hook) (n);
return;
}
+
if (delete_in_insert_mode)
{
turn_on_insert ();
@@ -1131,20 +1147,20 @@ delete_glyphs (n)
else
{
turn_off_insert ();
- OUTPUT_IF (FRAME_TTY (updating_frame), TS_delete_mode);
+ OUTPUT_IF (tty, TS_delete_mode);
}
-
+
if (TS_del_multi_chars)
{
buf = tparam (TS_del_multi_chars, 0, 0, n);
- OUTPUT1 (FRAME_TTY (updating_frame), buf);
+ OUTPUT1 (tty, buf);
xfree (buf);
}
else
for (i = 0; i < n; i++)
- OUTPUT1 (FRAME_TTY (updating_frame), TS_del_char);
+ OUTPUT1 (tty, TS_del_char);
if (!delete_in_insert_mode)
- OUTPUT_IF (FRAME_TTY (updating_frame), TS_end_delete_mode);
+ OUTPUT_IF (tty, TS_end_delete_mode);
}
/* Insert N lines at vpos VPOS. If N is negative, delete -N lines. */
@@ -1156,18 +1172,18 @@ ins_del_lines (vpos, n)
char *multi = n > 0 ? TS_ins_multi_lines : TS_del_multi_lines;
char *single = n > 0 ? TS_ins_line : TS_del_line;
char *scroll = n > 0 ? TS_rev_scroll : TS_fwd_scroll;
- struct frame *f;
+ struct frame *f = (updating_frame ? updating_frame : XFRAME (selected_frame));
register int i = n > 0 ? n : -n;
register char *buf;
- if (ins_del_lines_hook && ! FRAME_TERMCAP_P (updating_frame))
+ if (ins_del_lines_hook && ! FRAME_TERMCAP_P (f))
{
(*ins_del_lines_hook) (vpos, n);
return;
}
- f = (updating_frame ? updating_frame : XFRAME (selected_frame));
+ struct tty_output *tty = FRAME_TTY (f);
/* If the lines below the insertion are being pushed
into the end of the window, this is the same as clearing;
@@ -1176,10 +1192,10 @@ ins_del_lines (vpos, n)
/* If the lines below the deletion are blank lines coming
out of the end of the window, don't bother,
as there will be a matching inslines later that will flush them. */
- if (TTY_SCROLL_REGION_OK (FRAME_TTY (f))
+ if (TTY_SCROLL_REGION_OK (tty)
&& vpos + i >= specified_window)
return;
- if (!TTY_MEMORY_BELOW_FRAME (FRAME_TTY (f))
+ if (!TTY_MEMORY_BELOW_FRAME (tty)
&& vpos + i >= FRAME_LINES (f))
return;
@@ -1188,7 +1204,7 @@ ins_del_lines (vpos, n)
raw_cursor_to (vpos, 0);
background_highlight ();
buf = tparam (multi, 0, 0, i);
- OUTPUT (FRAME_TTY (f), buf);
+ OUTPUT (tty, buf);
xfree (buf);
}
else if (single)
@@ -1196,9 +1212,9 @@ ins_del_lines (vpos, n)
raw_cursor_to (vpos, 0);
background_highlight ();
while (--i >= 0)
- OUTPUT (FRAME_TTY (f), single);
+ OUTPUT (tty, single);
if (TF_teleray)
- curX = 0;
+ curX (tty) = 0;
}
else
{
@@ -1209,12 +1225,12 @@ ins_del_lines (vpos, n)
raw_cursor_to (vpos, 0);
background_highlight ();
while (--i >= 0)
- OUTPUTL (FRAME_TTY (f), scroll, specified_window - vpos);
+ OUTPUTL (tty, scroll, specified_window - vpos);
set_scroll_region (0, specified_window);
}
- if (!TTY_SCROLL_REGION_OK (FRAME_TTY (f))
- && TTY_MEMORY_BELOW_FRAME (FRAME_TTY (f))
+ if (!TTY_SCROLL_REGION_OK (tty)
+ && TTY_MEMORY_BELOW_FRAME (tty)
&& n < 0)
{
cursor_to (FRAME_LINES (f) + n, 0);
@@ -1392,7 +1408,7 @@ calculate_costs (frame)
else
RPov = FRAME_COLS (frame) * 2;
- cmcostinit (); /* set up cursor motion costs */
+ cmcostinit (FRAME_TTY (frame)); /* set up cursor motion costs */
}
struct fkey_table {
@@ -1857,6 +1873,7 @@ turn_on_face (f, face_id)
struct face *face = FACE_FROM_ID (f, face_id);
long fg = face->foreground;
long bg = face->background;
+ struct tty_output *tty = FRAME_TTY (f);
/* Do this first because TS_end_standout_mode may be the same
as TS_exit_attribute_mode, which turns all appearances off. */
@@ -1907,23 +1924,23 @@ turn_on_face (f, face_id)
if (face->tty_bold_p)
{
if (MAY_USE_WITH_COLORS_P (NC_BOLD))
- OUTPUT1_IF (FRAME_TTY (f), TS_enter_bold_mode);
+ OUTPUT1_IF (tty, TS_enter_bold_mode);
}
else if (face->tty_dim_p)
if (MAY_USE_WITH_COLORS_P (NC_DIM))
- OUTPUT1_IF (FRAME_TTY (f), TS_enter_dim_mode);
+ OUTPUT1_IF (tty, TS_enter_dim_mode);
/* Alternate charset and blinking not yet used. */
if (face->tty_alt_charset_p
&& MAY_USE_WITH_COLORS_P (NC_ALT_CHARSET))
- OUTPUT1_IF (FRAME_TTY (f), TS_enter_alt_charset_mode);
+ OUTPUT1_IF (tty, TS_enter_alt_charset_mode);
if (face->tty_blinking_p
&& MAY_USE_WITH_COLORS_P (NC_BLINK))
- OUTPUT1_IF (FRAME_TTY (f), TS_enter_blink_mode);
+ OUTPUT1_IF (tty, TS_enter_blink_mode);
if (face->tty_underline_p && MAY_USE_WITH_COLORS_P (NC_UNDERLINE))
- OUTPUT1_IF (FRAME_TTY (f), TS_enter_underline_mode);
+ OUTPUT1_IF (tty, TS_enter_underline_mode);
if (TN_max_colors > 0)
{
@@ -1932,14 +1949,14 @@ turn_on_face (f, face_id)
if (fg >= 0 && TS_set_foreground)
{
p = tparam (TS_set_foreground, NULL, 0, (int) fg);
- OUTPUT (FRAME_TTY (f), p);
+ OUTPUT (tty, p);
xfree (p);
}
if (bg >= 0 && TS_set_background)
{
p = tparam (TS_set_background, NULL, 0, (int) bg);
- OUTPUT (FRAME_TTY (f), p);
+ OUTPUT (tty, p);
xfree (p);
}
}
@@ -1954,6 +1971,7 @@ turn_off_face (f, face_id)
int face_id;
{
struct face *face = FACE_FROM_ID (f, face_id);
+ struct tty_output *tty = FRAME_TTY (f);
xassert (face != NULL);
@@ -1969,23 +1987,23 @@ turn_off_face (f, face_id)
|| face->tty_blinking_p
|| face->tty_underline_p)
{
- OUTPUT1_IF (FRAME_TTY (f), TS_exit_attribute_mode);
+ OUTPUT1_IF (tty, TS_exit_attribute_mode);
if (strcmp (TS_exit_attribute_mode, TS_end_standout_mode) == 0)
standout_mode = 0;
}
if (face->tty_alt_charset_p)
- OUTPUT_IF (FRAME_TTY (f), TS_exit_alt_charset_mode);
+ OUTPUT_IF (tty, TS_exit_alt_charset_mode);
}
else
{
/* If we don't have "me" we can only have those appearances
that have exit sequences defined. */
if (face->tty_alt_charset_p)
- OUTPUT_IF (FRAME_TTY (f), TS_exit_alt_charset_mode);
+ OUTPUT_IF (tty, TS_exit_alt_charset_mode);
if (face->tty_underline_p)
- OUTPUT_IF (FRAME_TTY (f), TS_exit_underline_mode);
+ OUTPUT_IF (tty, TS_exit_underline_mode);
}
/* Switch back to default colors. */
@@ -1994,7 +2012,7 @@ turn_off_face (f, face_id)
&& face->foreground != FACE_TTY_DEFAULT_FG_COLOR)
|| (face->background != FACE_TTY_DEFAULT_COLOR
&& face->background != FACE_TTY_DEFAULT_BG_COLOR)))
- OUTPUT1_IF (FRAME_TTY (f), TS_orig_pair);
+ OUTPUT1_IF (tty, TS_orig_pair);
}
@@ -2256,6 +2274,10 @@ term_init (name, terminal_type)
tty_list = tty;
}
+ if (tty->Wcm)
+ xfree (tty->Wcm);
+ tty->Wcm = (struct cm *) xmalloc (sizeof (struct cm));
+
if (name)
{
int fd;
@@ -2314,7 +2336,7 @@ term_init (name, terminal_type)
return tty;
#else /* not WINDOWSNT */
- Wcm_clear ();
+ Wcm_clear (tty);
TTY_TYPE (tty) = xstrdup (terminal_type);
@@ -2357,16 +2379,16 @@ to do `unset TERMCAP' (C-shell: `unsetenv TERMCAP') as well.",
TS_ins_line = tgetstr ("al", address);
TS_ins_multi_lines = tgetstr ("AL", address);
TS_bell = tgetstr ("bl", address);
- BackTab = tgetstr ("bt", address);
+ BackTab (tty) = tgetstr ("bt", address);
TS_clr_to_bottom = tgetstr ("cd", address);
TS_clr_line = tgetstr ("ce", address);
TS_clr_frame = tgetstr ("cl", address);
- ColPosition = NULL; /* tgetstr ("ch", address); */
- AbsPosition = tgetstr ("cm", address);
- CR = tgetstr ("cr", address);
+ ColPosition (tty) = NULL; /* tgetstr ("ch", address); */
+ AbsPosition (tty) = tgetstr ("cm", address);
+ CR (tty) = tgetstr ("cr", address);
TS_set_scroll_region = tgetstr ("cs", address);
TS_set_scroll_region_1 = tgetstr ("cS", address);
- RowPosition = tgetstr ("cv", address);
+ RowPosition (tty) = tgetstr ("cv", address);
TS_del_char = tgetstr ("dc", address);
TS_del_multi_chars = tgetstr ("DC", address);
TS_del_line = tgetstr ("dl", address);
@@ -2374,40 +2396,40 @@ to do `unset TERMCAP' (C-shell: `unsetenv TERMCAP') as well.",
TS_delete_mode = tgetstr ("dm", address);
TS_end_delete_mode = tgetstr ("ed", address);
TS_end_insert_mode = tgetstr ("ei", address);
- Home = tgetstr ("ho", address);
+ Home (tty) = tgetstr ("ho", address);
TS_ins_char = tgetstr ("ic", address);
TS_ins_multi_chars = tgetstr ("IC", address);
TS_insert_mode = tgetstr ("im", address);
TS_pad_inserted_char = tgetstr ("ip", address);
TS_end_keypad_mode = tgetstr ("ke", address);
TS_keypad_mode = tgetstr ("ks", address);
- LastLine = tgetstr ("ll", address);
- Right = tgetstr ("nd", address);
- Down = tgetstr ("do", address);
- if (!Down)
- Down = tgetstr ("nl", address); /* Obsolete name for "do" */
+ LastLine (tty) = tgetstr ("ll", address);
+ Right (tty) = tgetstr ("nd", address);
+ Down (tty) = tgetstr ("do", address);
+ if (!Down (tty))
+ Down (tty) = tgetstr ("nl", address); /* Obsolete name for "do" */
#ifdef VMS
/* VMS puts a carriage return before each linefeed,
so it is not safe to use linefeeds. */
- if (Down && Down[0] == '\n' && Down[1] == '\0')
- Down = 0;
+ if (Down (tty) && Down (tty)[0] == '\n' && Down (tty)[1] == '\0')
+ Down (tty) = 0;
#endif /* VMS */
if (tgetflag ("bs"))
- Left = "\b"; /* can't possibly be longer! */
+ Left (tty) = "\b"; /* can't possibly be longer! */
else /* (Actually, "bs" is obsolete...) */
- Left = tgetstr ("le", address);
- if (!Left)
- Left = tgetstr ("bc", address); /* Obsolete name for "le" */
+ Left (tty) = tgetstr ("le", address);
+ if (!Left (tty))
+ Left (tty) = tgetstr ("bc", address); /* Obsolete name for "le" */
TS_pad_char = tgetstr ("pc", address);
TS_repeat = tgetstr ("rp", address);
TS_end_standout_mode = tgetstr ("se", address);
TS_fwd_scroll = tgetstr ("sf", address);
TS_standout_mode = tgetstr ("so", address);
TS_rev_scroll = tgetstr ("sr", address);
- Wcm.cm_tab = tgetstr ("ta", address);
+ tty->Wcm->cm_tab = tgetstr ("ta", address);
TS_end_termcap_modes = tgetstr ("te", address);
TS_termcap_modes = tgetstr ("ti", address);
- Up = tgetstr ("up", address);
+ Up (tty) = tgetstr ("up", address);
TS_visible_bell = tgetstr ("vb", address);
TS_cursor_normal = tgetstr ("ve", address);
TS_cursor_visible = tgetstr ("vs", address);
@@ -2424,10 +2446,10 @@ to do `unset TERMCAP' (C-shell: `unsetenv TERMCAP') as well.",
TS_exit_alt_charset_mode = tgetstr ("ae", address);
TS_exit_attribute_mode = tgetstr ("me", address);
- MultiUp = tgetstr ("UP", address);
- MultiDown = tgetstr ("DO", address);
- MultiLeft = tgetstr ("LE", address);
- MultiRight = tgetstr ("RI", address);
+ MultiUp (tty) = tgetstr ("UP", address);
+ MultiDown (tty) = tgetstr ("DO", address);
+ MultiLeft (tty) = tgetstr ("LE", address);
+ MultiRight (tty) = tgetstr ("RI", address);
/* SVr4/ANSI color suppert. If "op" isn't available, don't support
color because we can't switch back to the default foreground and
@@ -2454,10 +2476,10 @@ to do `unset TERMCAP' (C-shell: `unsetenv TERMCAP') as well.",
tty_default_color_capabilities (1);
- MagicWrap = tgetflag ("xn");
+ MagicWrap (tty) = tgetflag ("xn");
/* Since we make MagicWrap terminals look like AutoWrap, we need to have
the former flag imply the latter. */
- AutoWrap = MagicWrap || tgetflag ("am");
+ AutoWrap (tty) = MagicWrap (tty) || tgetflag ("am");
TTY_MEMORY_BELOW_FRAME (tty) = tgetflag ("db");
TF_hazeltine = tgetflag ("hz");
TTY_MUST_WRITE_SPACES (tty) = tgetflag ("in");
@@ -2493,32 +2515,32 @@ to do `unset TERMCAP' (C-shell: `unsetenv TERMCAP') as well.",
TTY_MIN_PADDING_SPEED (tty) = tgetnum ("pb");
#endif
- TabWidth = tgetnum ("tw");
+ TabWidth (tty) = tgetnum ("tw");
#ifdef VMS
/* These capabilities commonly use ^J.
I don't know why, but sending them on VMS does not work;
it causes following spaces to be lost, sometimes.
For now, the simplest fix is to avoid using these capabilities ever. */
- if (Down && Down[0] == '\n')
- Down = 0;
+ if (Down (tty) && Down (tty)[0] == '\n')
+ Down (tty) = 0;
#endif /* VMS */
if (!TS_bell)
TS_bell = "\07";
if (!TS_fwd_scroll)
- TS_fwd_scroll = Down;
+ TS_fwd_scroll = Down (tty);
PC = TS_pad_char ? *TS_pad_char : 0;
- if (TabWidth < 0)
- TabWidth = 8;
+ if (TabWidth (tty) < 0)
+ TabWidth (tty) = 8;
/* Turned off since /etc/termcap seems to have :ta= for most terminals
and newer termcap doc does not seem to say there is a default.
- if (!Wcm.cm_tab)
- Wcm.cm_tab = "\t";
+ if (!tty->Wcm->cm_tab)
+ tty->Wcm->cm_tab = "\t";
*/
/* We don't support standout modes that use `magic cookies', so
@@ -2554,14 +2576,14 @@ to do `unset TERMCAP' (C-shell: `unsetenv TERMCAP') as well.",
if (TF_teleray)
{
- Wcm.cm_tab = 0;
+ tty->Wcm->cm_tab = 0;
/* We can't support standout mode, because it uses magic cookies. */
TS_standout_mode = 0;
/* But that means we cannot rely on ^M to go to column zero! */
- CR = 0;
+ CR (tty) = 0;
/* LF can't be trusted either -- can alter hpos */
/* if move at column 0 thru a line with TS_standout_mode */
- Down = 0;
+ Down (tty) = 0;
}
/* Special handling for certain terminal types known to need it */
@@ -2569,7 +2591,7 @@ to do `unset TERMCAP' (C-shell: `unsetenv TERMCAP') as well.",
if (!strcmp (terminal_type, "supdup"))
{
TTY_MEMORY_BELOW_FRAME (tty) = 1;
- Wcm.cm_losewrap = 1;
+ tty->Wcm->cm_losewrap = 1;
}
if (!strncmp (terminal_type, "c10", 3)
|| !strcmp (terminal_type, "perq"))
@@ -2602,7 +2624,7 @@ to do `unset TERMCAP' (C-shell: `unsetenv TERMCAP') as well.",
strcat (area, "\033\007!");
TS_termcap_modes = area;
area += strlen (area) + 1;
- p = AbsPosition;
+ p = AbsPosition (tty);
/* Change all %+ parameters to %C, to handle
values above 96 correctly for the C100. */
while (*p)
@@ -2613,11 +2635,11 @@ to do `unset TERMCAP' (C-shell: `unsetenv TERMCAP') as well.",
}
}
- FrameRows = FRAME_LINES (sf);
- FrameCols = FRAME_COLS (sf);
+ FrameRows (tty) = FRAME_LINES (sf);
+ FrameCols (tty) = FRAME_COLS (sf);
specified_window = FRAME_LINES (sf);
- if (Wcm_init () == -1) /* can't do cursor motion */
+ if (Wcm_init (tty) == -1) /* can't do cursor motion */
#ifdef VMS
fatal ("Terminal type \"%s\" is not powerful enough to run Emacs.\n\
It lacks the ability to position the cursor.\n\
@@ -2656,10 +2678,10 @@ to do `unset TERMCAP' (C-shell: `unsetenv TERMCAP') as well.",
&& TS_end_standout_mode
&& !strcmp (TS_standout_mode, TS_end_standout_mode));
- UseTabs = tabs_safe_p () && TabWidth == 8;
+ UseTabs (tty) = tabs_safe_p (tty) && TabWidth (tty) == 8;
TTY_SCROLL_REGION_OK (tty)
- = (Wcm.cm_abs
+ = (tty->Wcm->cm_abs
&& (TS_set_window || TS_set_scroll_region || TS_set_scroll_region_1));
TTY_LINE_INS_DEL_OK (tty)
@@ -2720,6 +2742,8 @@ The function should accept no arguments. */);
defsubr (&Stty_display_color_p);
defsubr (&Stty_display_color_cells);
+
+ Fprovide (intern ("multi-tty"), Qnil);
}
struct tty_output *
diff --git a/src/termchar.h b/src/termchar.h
index a58dbc62125..33170d5a78e 100644
--- a/src/termchar.h
+++ b/src/termchar.h
@@ -41,6 +41,10 @@ struct tty_output
int old_tty_valid; /* 1 if outer tty status has been recorded. */
+ /* Structure for info on cursor positioning. */
+
+ struct cm *Wcm;
+
/* Redisplay. */
/* XXX This may cause problems with GC. */
diff --git a/src/xdisp.c b/src/xdisp.c
index 79630ebab22..020f5736d31 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -9567,7 +9567,7 @@ select_frame_for_redisplay (frame)
{
Lisp_Object tail, sym, val;
Lisp_Object old = selected_frame;
-
+
selected_frame = frame;
for (tail = XFRAME (frame)->param_alist; CONSP (tail); tail = XCDR (tail))
@@ -13319,7 +13319,7 @@ try_window_id (w)
/* On dumb terminals delete dvpos lines at the end
before inserting dvpos empty lines. */
- if (!TTY_SCROLL_REGION_OK (CURTTY ()))
+ if (!TTY_SCROLL_REGION_OK (FRAME_TTY (f)))
ins_del_lines (end - dvpos, -dvpos);
/* Insert dvpos empty lines in front of
@@ -13340,7 +13340,7 @@ try_window_id (w)
/* On a dumb terminal insert dvpos empty lines at the
end. */
- if (!TTY_SCROLL_REGION_OK (CURTTY ()))
+ if (!TTY_SCROLL_REGION_OK (FRAME_TTY (f)))
ins_del_lines (end + dvpos, -dvpos);
}