Mercurial > emacs
annotate src/cm.c @ 98007:883843ca3292
* verilog-mode.el (verilog-library-extensions): Enable .sv
filename extensions to call verilog-mode.
(verilog-auto, verilog-auto-inst, verilog-faq)
(verilog-submit-bug-report): Update author support URLs.
(verilog-delete-auto, verilog-auto-inout-module)
(verilog-auto-inout-comp, verilog-auto): Add AUTOINOUTCOMP for
creating complemented testbench modules. Suggested by Yishay
Belkind.
(verilog-auto-inst-port, verilog-simplify-range-expression): When
verilog-auto-inst-param-value is set, don't require a
AUTO_TEMPLATE to expand parameter substitutions. Suggested by
Yishay Belkind.
(verilog-auto-inst-param-value): Add safe variable.
(verilog-re-search-forward, verilog-re-search-backward): Fix
returning wrong search results on Emacs 22.1.
(verilog-modi-cache-results, verilog-auto): Fix warning message
about "toggling font-lock-mode."
(verilog-auto): Fix loosing font-lock on errors.
(verilog-auto-inst-param-value, verilog-mode-version)
(verilog-mode-version-date, verilog-read-inst-param-value)
(verilog-auto-inst, verilog-auto-inst-param)
(verilog-auto-inst-port, verilog-simplify-range-expression): Allow
parameters to be replaced with their values, on the expansion of
an AUTOINST with Verilog 2001 style parameter settings. Suggested
by David Rogoff.
* verilog-mode.el (verilog-beg-block-re-ordered, verilog-calc-1):
Better support for the property statement. Sometimes this keyword
introduces a statement which requires an endproperty keyword, and
sometimes it doesn't, dependening on the work before the property
word. If property is prefixed with assert, assume or cover
keyword, then the statement is ended with a ';' Otherwise,
property is like task or specify, and is followed by some number
of statements, which are ended with an endproperty keyword.
(electric-verilog-tab): Support Emacs 22.2 style handling of tab
in a highlighted region: indent each line in region according to
mode. Supply this so it works in XEmacs and older Emacs.
author | Dan Nicolaescu <dann@ics.uci.edu> |
---|---|
date | Fri, 05 Sep 2008 22:13:55 +0000 |
parents | 8971ddf55736 |
children | e038c1a8307c |
rev | line source |
---|---|
484 | 1 /* Cursor motion subroutines for GNU Emacs. |
75227
e90d04cd455a
Update copyright for years from Emacs 21 to present (mainly adding
Glenn Morris <rgm@gnu.org>
parents:
68651
diff
changeset
|
2 Copyright (C) 1985, 1995, 2001, 2002, 2003, 2004, |
79759 | 3 2005, 2006, 2007, 2008 Free Software Foundation, Inc. |
484 | 4 based primarily on public domain code written by Chris Torek |
5 | |
6 This file is part of GNU Emacs. | |
7 | |
94963
8971ddf55736
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
87649
diff
changeset
|
8 GNU Emacs is free software: you can redistribute it and/or modify |
484 | 9 it under the terms of the GNU General Public License as published by |
94963
8971ddf55736
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
87649
diff
changeset
|
10 the Free Software Foundation, either version 3 of the License, or |
8971ddf55736
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
87649
diff
changeset
|
11 (at your option) any later version. |
484 | 12 |
13 GNU Emacs is distributed in the hope that it will be useful, | |
14 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 GNU General Public License for more details. | |
17 | |
18 You should have received a copy of the GNU General Public License | |
94963
8971ddf55736
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
87649
diff
changeset
|
19 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ |
484 | 20 |
21 | |
4696
1fc792473491
Include <config.h> instead of "config.h".
Roland McGrath <roland@gnu.org>
parents:
484
diff
changeset
|
22 #include <config.h> |
484 | 23 #include <stdio.h> |
53226
dd3018b4785b
Implemented multiple tty support.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
24 |
dd3018b4785b
Implemented multiple tty support.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
25 #include "lisp.h" |
dd3018b4785b
Implemented multiple tty support.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
26 #include "frame.h" |
484 | 27 #include "cm.h" |
28 #include "termhooks.h" | |
53226
dd3018b4785b
Implemented multiple tty support.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
29 #include "termchar.h" |
dd3018b4785b
Implemented multiple tty support.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
30 |
484 | 31 |
33672
a94852aef620
Don't try to include termcap.h; see comment there.
Gerd Moellmann <gerd@gnu.org>
parents:
30915
diff
changeset
|
32 /* For now, don't try to include termcap.h. On some systems, |
a94852aef620
Don't try to include termcap.h; see comment there.
Gerd Moellmann <gerd@gnu.org>
parents:
30915
diff
changeset
|
33 configure finds a non-standard termcap.h that the main build |
a94852aef620
Don't try to include termcap.h; see comment there.
Gerd Moellmann <gerd@gnu.org>
parents:
30915
diff
changeset
|
34 won't find. */ |
a94852aef620
Don't try to include termcap.h; see comment there.
Gerd Moellmann <gerd@gnu.org>
parents:
30915
diff
changeset
|
35 |
a94852aef620
Don't try to include termcap.h; see comment there.
Gerd Moellmann <gerd@gnu.org>
parents:
30915
diff
changeset
|
36 #if defined HAVE_TERMCAP_H && 0 |
25734
0242362bb1fe
(toplevel) [HAVE_TERMCAP_H]: Include termcap.h.
Gerd Moellmann <gerd@gnu.org>
parents:
25333
diff
changeset
|
37 #include <termcap.h> |
30915
10dd42348df3
[HAVE_TERMCAP_H]: Include <termcap.h>.
Dave Love <fx@gnu.org>
parents:
29909
diff
changeset
|
38 #else |
10dd42348df3
[HAVE_TERMCAP_H]: Include <termcap.h>.
Dave Love <fx@gnu.org>
parents:
29909
diff
changeset
|
39 extern void tputs P_ ((const char *, int, int (*)(int))); |
10dd42348df3
[HAVE_TERMCAP_H]: Include <termcap.h>.
Dave Love <fx@gnu.org>
parents:
29909
diff
changeset
|
40 extern char *tgoto P_ ((const char *, int, int)); |
25734
0242362bb1fe
(toplevel) [HAVE_TERMCAP_H]: Include termcap.h.
Gerd Moellmann <gerd@gnu.org>
parents:
25333
diff
changeset
|
41 #endif |
0242362bb1fe
(toplevel) [HAVE_TERMCAP_H]: Include termcap.h.
Gerd Moellmann <gerd@gnu.org>
parents:
25333
diff
changeset
|
42 |
484 | 43 #define BIG 9999 /* 9999 good on VAXen. For 16 bit machines |
44 use about 2000.... */ | |
45 | |
46 extern char *BC, *UP; | |
47 | |
48 int cost; /* sums up costs */ | |
49 | |
50 /* ARGSUSED */ | |
21514 | 51 int |
484 | 52 evalcost (c) |
53 char c; | |
54 { | |
55 cost++; | |
8985
2825665b8352
(evalcost, cmputc): They now return their arguments.
Richard M. Stallman <rms@gnu.org>
parents:
7107
diff
changeset
|
56 return c; |
484 | 57 } |
58 | |
53226
dd3018b4785b
Implemented multiple tty support.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
59 /* The terminal to use for low-level output. */ |
82989
f3845715a5f6
Separate frame-local, tty-dependent parameters from tty-local parameters.
Karoly Lorentey <lorentey@elte.hu>
parents:
53343
diff
changeset
|
60 struct tty_display_info *current_tty; |
53226
dd3018b4785b
Implemented multiple tty support.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
61 |
21514 | 62 int |
484 | 63 cmputc (c) |
64 char c; | |
65 { | |
83065
a871be7b26a5
Implemented suspending of emacsclient frames.
Karoly Lorentey <lorentey@elte.hu>
parents:
83027
diff
changeset
|
66 if (current_tty->termscript) |
a871be7b26a5
Implemented suspending of emacsclient frames.
Karoly Lorentey <lorentey@elte.hu>
parents:
83027
diff
changeset
|
67 putc (c & 0177, current_tty->termscript); |
a871be7b26a5
Implemented suspending of emacsclient frames.
Karoly Lorentey <lorentey@elte.hu>
parents:
83027
diff
changeset
|
68 putc (c & 0177, current_tty->output); |
8985
2825665b8352
(evalcost, cmputc): They now return their arguments.
Richard M. Stallman <rms@gnu.org>
parents:
7107
diff
changeset
|
69 return c; |
484 | 70 } |
71 | |
72 /* NEXT TWO ARE DONE WITH MACROS */ | |
73 #if 0 | |
74 /* | |
75 * Assume the cursor is at row row, column col. Normally used only after | |
76 * clearing the screen, when the cursor is at (0, 0), but what the heck, | |
77 * let's let the guy put it anywhere. | |
78 */ | |
79 | |
80 static | |
53233
fe9b37bee5f7
Fully eliminated global tty state variables.
Karoly Lorentey <lorentey@elte.hu>
parents:
53232
diff
changeset
|
81 at (tty, row, col) { |
fe9b37bee5f7
Fully eliminated global tty state variables.
Karoly Lorentey <lorentey@elte.hu>
parents:
53232
diff
changeset
|
82 curY (tty) = row; |
fe9b37bee5f7
Fully eliminated global tty state variables.
Karoly Lorentey <lorentey@elte.hu>
parents:
53232
diff
changeset
|
83 curX (tty) = col; |
484 | 84 } |
85 | |
86 /* | |
87 * Add n columns to the current cursor position. | |
88 */ | |
89 | |
90 static | |
53233
fe9b37bee5f7
Fully eliminated global tty state variables.
Karoly Lorentey <lorentey@elte.hu>
parents:
53232
diff
changeset
|
91 addcol (tty, n) { |
fe9b37bee5f7
Fully eliminated global tty state variables.
Karoly Lorentey <lorentey@elte.hu>
parents:
53232
diff
changeset
|
92 curX (tty) += n; |
484 | 93 |
94 /* | |
95 * If cursor hit edge of screen, what happened? | |
96 * N.B.: DO NOT!! write past edge of screen. If you do, you | |
97 * deserve what you get. Furthermore, on terminals with | |
98 * autowrap (but not magicwrap), don't write in the last column | |
99 * of the last line. | |
100 */ | |
101 | |
53233
fe9b37bee5f7
Fully eliminated global tty state variables.
Karoly Lorentey <lorentey@elte.hu>
parents:
53232
diff
changeset
|
102 if (curX (tty) == tty->Wcm->cm_cols) { |
484 | 103 /* |
104 * Well, if magicwrap, still there, past the edge of the | |
105 * screen (!). If autowrap, on the col 0 of the next line. | |
106 * Otherwise on last column. | |
107 */ | |
108 | |
53233
fe9b37bee5f7
Fully eliminated global tty state variables.
Karoly Lorentey <lorentey@elte.hu>
parents:
53232
diff
changeset
|
109 if (tty->Wcm->cm_magicwrap) |
484 | 110 ; /* "limbo" */ |
53233
fe9b37bee5f7
Fully eliminated global tty state variables.
Karoly Lorentey <lorentey@elte.hu>
parents:
53232
diff
changeset
|
111 else if (tty->Wcm->cm_autowrap) { |
fe9b37bee5f7
Fully eliminated global tty state variables.
Karoly Lorentey <lorentey@elte.hu>
parents:
53232
diff
changeset
|
112 curX (tty) = 0; |
fe9b37bee5f7
Fully eliminated global tty state variables.
Karoly Lorentey <lorentey@elte.hu>
parents:
53232
diff
changeset
|
113 curY (tty) ++; /* Beware end of screen! */ |
484 | 114 } |
115 else | |
53233
fe9b37bee5f7
Fully eliminated global tty state variables.
Karoly Lorentey <lorentey@elte.hu>
parents:
53232
diff
changeset
|
116 curX (tty)--; |
484 | 117 } |
118 } | |
119 #endif | |
120 | |
121 /* | |
10437 | 122 * Terminals with magicwrap (xn) don't all behave identically. |
123 * The VT100 leaves the cursor in the last column but will wrap before | |
124 * printing the next character. I hear that the Concept terminal does | |
125 * the wrap immediately but ignores the next newline it sees. And some | |
126 * terminals just have buggy firmware, and think that the cursor is still | |
127 * in limbo if we use direct cursor addressing from the phantom column. | |
128 * The only guaranteed safe thing to do is to emit a CRLF immediately | |
129 * after we reach the last column; this takes us to a known state. | |
130 */ | |
131 void | |
82989
f3845715a5f6
Separate frame-local, tty-dependent parameters from tty-local parameters.
Karoly Lorentey <lorentey@elte.hu>
parents:
53343
diff
changeset
|
132 cmcheckmagic (struct tty_display_info *tty) |
10437 | 133 { |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
134 if (curX (tty) == FrameCols (tty)) |
10437 | 135 { |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
136 if (!MagicWrap (tty) || curY (tty) >= FrameRows (tty) - 1) |
10437 | 137 abort (); |
83065
a871be7b26a5
Implemented suspending of emacsclient frames.
Karoly Lorentey <lorentey@elte.hu>
parents:
83027
diff
changeset
|
138 if (tty->termscript) |
a871be7b26a5
Implemented suspending of emacsclient frames.
Karoly Lorentey <lorentey@elte.hu>
parents:
83027
diff
changeset
|
139 putc ('\r', tty->termscript); |
a871be7b26a5
Implemented suspending of emacsclient frames.
Karoly Lorentey <lorentey@elte.hu>
parents:
83027
diff
changeset
|
140 putc ('\r', tty->output); |
a871be7b26a5
Implemented suspending of emacsclient frames.
Karoly Lorentey <lorentey@elte.hu>
parents:
83027
diff
changeset
|
141 if (tty->termscript) |
a871be7b26a5
Implemented suspending of emacsclient frames.
Karoly Lorentey <lorentey@elte.hu>
parents:
83027
diff
changeset
|
142 putc ('\n', tty->termscript); |
a871be7b26a5
Implemented suspending of emacsclient frames.
Karoly Lorentey <lorentey@elte.hu>
parents:
83027
diff
changeset
|
143 putc ('\n', tty->output); |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
144 curX (tty) = 0; |
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
145 curY (tty)++; |
10437 | 146 } |
147 } | |
148 | |
149 | |
150 /* | |
484 | 151 * (Re)Initialize the cost factors, given the output speed of the terminal |
152 * in the variable ospeed. (Note: this holds B300, B9600, etc -- ie stuff | |
153 * out of <sgtty.h>.) | |
154 */ | |
155 | |
21514 | 156 void |
82989
f3845715a5f6
Separate frame-local, tty-dependent parameters from tty-local parameters.
Karoly Lorentey <lorentey@elte.hu>
parents:
53343
diff
changeset
|
157 cmcostinit (struct tty_display_info *tty) |
484 | 158 { |
159 char *p; | |
160 | |
161 #define COST(x,e) (x ? (cost = 0, tputs (x, 1, e), cost) : BIG) | |
162 #define CMCOST(x,e) ((x == 0) ? BIG : (p = tgoto(x, 0, 0), COST(p ,e))) | |
163 | |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
164 tty->Wcm->cc_up = COST (tty->Wcm->cm_up, evalcost); |
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
165 tty->Wcm->cc_down = COST (tty->Wcm->cm_down, evalcost); |
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
166 tty->Wcm->cc_left = COST (tty->Wcm->cm_left, evalcost); |
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
167 tty->Wcm->cc_right = COST (tty->Wcm->cm_right, evalcost); |
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
168 tty->Wcm->cc_home = COST (tty->Wcm->cm_home, evalcost); |
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
169 tty->Wcm->cc_cr = COST (tty->Wcm->cm_cr, evalcost); |
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
170 tty->Wcm->cc_ll = COST (tty->Wcm->cm_ll, evalcost); |
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
171 tty->Wcm->cc_tab = tty->Wcm->cm_tabwidth ? COST (tty->Wcm->cm_tab, evalcost) : BIG; |
484 | 172 |
173 /* | |
174 * These last three are actually minimum costs. When (if) they are | |
175 * candidates for the least-cost motion, the real cost is computed. | |
176 * (Note that "0" is the assumed to generate the minimum cost. | |
177 * While this is not necessarily true, I have yet to see a terminal | |
178 * for which is not; all the terminals that have variable-cost | |
179 * cursor motion seem to take straight numeric values. --ACT) | |
180 */ | |
181 | |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
182 tty->Wcm->cc_abs = CMCOST (tty->Wcm->cm_abs, evalcost); |
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
183 tty->Wcm->cc_habs = CMCOST (tty->Wcm->cm_habs, evalcost); |
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
184 tty->Wcm->cc_vabs = CMCOST (tty->Wcm->cm_vabs, evalcost); |
484 | 185 |
186 #undef CMCOST | |
187 #undef COST | |
188 } | |
189 | |
190 /* | |
191 * Calculate the cost to move from (srcy, srcx) to (dsty, dstx) using | |
192 * up and down, and left and right, motions, and tabs. If doit is set | |
193 * actually perform the motion. | |
194 */ | |
195 | |
21514 | 196 static int |
82989
f3845715a5f6
Separate frame-local, tty-dependent parameters from tty-local parameters.
Karoly Lorentey <lorentey@elte.hu>
parents:
53343
diff
changeset
|
197 calccost (struct tty_display_info *tty, |
f3845715a5f6
Separate frame-local, tty-dependent parameters from tty-local parameters.
Karoly Lorentey <lorentey@elte.hu>
parents:
53343
diff
changeset
|
198 int srcy, int srcx, int dsty, int dstx, int doit) |
484 | 199 { |
200 register int deltay, | |
201 deltax, | |
202 c, | |
203 totalcost; | |
204 int ntabs, | |
205 n2tabs, | |
206 tabx, | |
207 tab2x, | |
208 tabcost; | |
209 register char *p; | |
210 | |
211 /* If have just wrapped on a terminal with xn, | |
212 don't believe the cursor position: give up here | |
213 and force use of absolute positioning. */ | |
214 | |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
215 if (curX (tty) == tty->Wcm->cm_cols) |
484 | 216 goto fail; |
217 | |
218 totalcost = 0; | |
219 if ((deltay = dsty - srcy) == 0) | |
220 goto x; | |
221 if (deltay < 0) | |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
222 p = tty->Wcm->cm_up, c = tty->Wcm->cc_up, deltay = -deltay; |
484 | 223 else |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
224 p = tty->Wcm->cm_down, c = tty->Wcm->cc_down; |
484 | 225 if (c == BIG) { /* caint get thar from here */ |
226 if (doit) | |
227 printf ("OOPS"); | |
228 return c; | |
229 } | |
230 totalcost = c * deltay; | |
231 if (doit) | |
232 while (--deltay >= 0) | |
53226
dd3018b4785b
Implemented multiple tty support.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
233 emacs_tputs (tty, p, 1, cmputc); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
48318
diff
changeset
|
234 x: |
484 | 235 if ((deltax = dstx - srcx) == 0) |
236 goto done; | |
237 if (deltax < 0) { | |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
238 p = tty->Wcm->cm_left, c = tty->Wcm->cc_left, deltax = -deltax; |
484 | 239 goto dodelta; /* skip all the tab junk */ |
240 } | |
241 /* Tabs (the toughie) */ | |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
242 if (tty->Wcm->cc_tab >= BIG || !tty->Wcm->cm_usetabs) |
484 | 243 goto olddelta; /* forget it! */ |
244 | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
48318
diff
changeset
|
245 /* |
484 | 246 * ntabs is # tabs towards but not past dstx; n2tabs is one more |
247 * (ie past dstx), but this is only valid if that is not past the | |
248 * right edge of the screen. We can check that at the same time | |
249 * as we figure out where we would be if we use the tabs (which | |
250 * we will put into tabx (for ntabs) and tab2x (for n2tabs)). | |
251 */ | |
252 | |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
253 ntabs = (deltax + srcx % tty->Wcm->cm_tabwidth) / tty->Wcm->cm_tabwidth; |
484 | 254 n2tabs = ntabs + 1; |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
255 tabx = (srcx / tty->Wcm->cm_tabwidth + ntabs) * tty->Wcm->cm_tabwidth; |
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
256 tab2x = tabx + tty->Wcm->cm_tabwidth; |
484 | 257 |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
258 if (tab2x >= tty->Wcm->cm_cols) /* too far (past edge) */ |
484 | 259 n2tabs = 0; |
260 | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
48318
diff
changeset
|
261 /* |
484 | 262 * Now set tabcost to the cost for using ntabs, and c to the cost |
263 * for using n2tabs, then pick the minimum. | |
264 */ | |
265 | |
83027 | 266 /* cost for ntabs + cost for right motion */ |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
267 tabcost = ntabs ? ntabs * tty->Wcm->cc_tab + (dstx - tabx) * tty->Wcm->cc_right |
484 | 268 : BIG; |
269 | |
83027 | 270 /* cost for n2tabs + cost for left motion */ |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
271 c = n2tabs ? n2tabs * tty->Wcm->cc_tab + (tab2x - dstx) * tty->Wcm->cc_left |
484 | 272 : BIG; |
273 | |
274 if (c < tabcost) /* then cheaper to overshoot & back up */ | |
275 ntabs = n2tabs, tabcost = c, tabx = tab2x; | |
276 | |
277 if (tabcost >= BIG) /* caint use tabs */ | |
278 goto newdelta; | |
279 | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
48318
diff
changeset
|
280 /* |
484 | 281 * See if tabcost is less than just moving right |
282 */ | |
283 | |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
284 if (tabcost < (deltax * tty->Wcm->cc_right)) { |
484 | 285 totalcost += tabcost; /* use the tabs */ |
286 if (doit) | |
287 while (--ntabs >= 0) | |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
288 emacs_tputs (tty, tty->Wcm->cm_tab, 1, cmputc); |
484 | 289 srcx = tabx; |
290 } | |
291 | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
48318
diff
changeset
|
292 /* |
484 | 293 * Now might as well just recompute the delta. |
294 */ | |
295 | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
48318
diff
changeset
|
296 newdelta: |
484 | 297 if ((deltax = dstx - srcx) == 0) |
298 goto done; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
48318
diff
changeset
|
299 olddelta: |
484 | 300 if (deltax > 0) |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
301 p = tty->Wcm->cm_right, c = tty->Wcm->cc_right; |
484 | 302 else |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
303 p = tty->Wcm->cm_left, c = tty->Wcm->cc_left, deltax = -deltax; |
484 | 304 |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
48318
diff
changeset
|
305 dodelta: |
484 | 306 if (c == BIG) { /* caint get thar from here */ |
307 fail: | |
308 if (doit) | |
309 printf ("OOPS"); | |
310 return BIG; | |
311 } | |
312 totalcost += c * deltax; | |
313 if (doit) | |
314 while (--deltax >= 0) | |
53226
dd3018b4785b
Implemented multiple tty support.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
315 emacs_tputs (tty, p, 1, cmputc); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
48318
diff
changeset
|
316 done: |
484 | 317 return totalcost; |
318 } | |
319 | |
320 #if 0 | |
321 losecursor () | |
322 { | |
323 curY = -1; | |
324 } | |
325 #endif | |
326 | |
327 #define USEREL 0 | |
328 #define USEHOME 1 | |
329 #define USELL 2 | |
330 #define USECR 3 | |
331 | |
21514 | 332 void |
53226
dd3018b4785b
Implemented multiple tty support.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
333 cmgoto (tty, row, col) |
82989
f3845715a5f6
Separate frame-local, tty-dependent parameters from tty-local parameters.
Karoly Lorentey <lorentey@elte.hu>
parents:
53343
diff
changeset
|
334 struct tty_display_info *tty; |
48318
5c1be14cbcac
(calccost, cmgoto): Declare all args (per C99).
Dave Love <fx@gnu.org>
parents:
33672
diff
changeset
|
335 int row, col; |
484 | 336 { |
337 int homecost, | |
338 crcost, | |
339 llcost, | |
340 relcost, | |
341 directcost; | |
342 int use; | |
343 char *p, | |
344 *dcm; | |
345 | |
346 /* First the degenerate case */ | |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
347 if (row == curY (tty) && col == curX (tty)) /* already there */ |
484 | 348 return; |
349 | |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
350 if (curY (tty) >= 0 && curX (tty) >= 0) |
484 | 351 { |
352 /* We may have quick ways to go to the upper-left, bottom-left, | |
353 * start-of-line, or start-of-next-line. Or it might be best to | |
354 * start where we are. Examine the options, and pick the cheapest. | |
355 */ | |
356 | |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
357 relcost = calccost (tty, curY (tty), curX (tty), row, col, 0); |
484 | 358 use = USEREL; |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
359 if ((homecost = tty->Wcm->cc_home) < BIG) |
53226
dd3018b4785b
Implemented multiple tty support.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
360 homecost += calccost (tty, 0, 0, row, col, 0); |
484 | 361 if (homecost < relcost) |
53226
dd3018b4785b
Implemented multiple tty support.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
362 relcost = homecost, use = USEHOME; |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
363 if ((llcost = tty->Wcm->cc_ll) < BIG) |
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
364 llcost += calccost (tty, tty->Wcm->cm_rows - 1, 0, row, col, 0); |
484 | 365 if (llcost < relcost) |
53226
dd3018b4785b
Implemented multiple tty support.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
366 relcost = llcost, use = USELL; |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
367 if ((crcost = tty->Wcm->cc_cr) < BIG) { |
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
368 if (tty->Wcm->cm_autolf) |
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
369 if (curY (tty) + 1 >= tty->Wcm->cm_rows) |
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
370 crcost = BIG; |
484 | 371 else |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
372 crcost += calccost (tty, curY (tty) + 1, 0, row, col, 0); |
484 | 373 else |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
374 crcost += calccost (tty, curY (tty), 0, row, col, 0); |
484 | 375 } |
376 if (crcost < relcost) | |
377 relcost = crcost, use = USECR; | |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
378 directcost = tty->Wcm->cc_abs, dcm = tty->Wcm->cm_abs; |
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
379 if (row == curY (tty) && tty->Wcm->cc_habs < BIG) |
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
380 directcost = tty->Wcm->cc_habs, dcm = tty->Wcm->cm_habs; |
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
381 else if (col == curX (tty) && tty->Wcm->cc_vabs < BIG) |
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
382 directcost = tty->Wcm->cc_vabs, dcm = tty->Wcm->cm_vabs; |
484 | 383 } |
384 else | |
385 { | |
386 directcost = 0, relcost = 100000; | |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
387 dcm = tty->Wcm->cm_abs; |
484 | 388 } |
389 | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
48318
diff
changeset
|
390 /* |
484 | 391 * In the following comparison, the = in <= is because when the costs |
392 * are the same, it looks nicer (I think) to move directly there. | |
393 */ | |
394 if (directcost <= relcost) | |
395 { | |
396 /* compute REAL direct cost */ | |
397 cost = 0; | |
83027 | 398 p = (dcm == tty->Wcm->cm_habs |
399 ? tgoto (dcm, row, col) | |
400 : tgoto (dcm, col, row)); | |
53226
dd3018b4785b
Implemented multiple tty support.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
401 emacs_tputs (tty, p, 1, evalcost); |
484 | 402 if (cost <= relcost) |
403 { /* really is cheaper */ | |
53226
dd3018b4785b
Implemented multiple tty support.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
404 emacs_tputs (tty, p, 1, cmputc); |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
405 curY (tty) = row, curX (tty) = col; |
484 | 406 return; |
407 } | |
408 } | |
409 | |
410 switch (use) | |
411 { | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
48318
diff
changeset
|
412 case USEHOME: |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
413 emacs_tputs (tty, tty->Wcm->cm_home, 1, cmputc); |
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
414 curY (tty) = 0, curX (tty) = 0; |
484 | 415 break; |
416 | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
48318
diff
changeset
|
417 case USELL: |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
418 emacs_tputs (tty, tty->Wcm->cm_ll, 1, cmputc); |
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
419 curY (tty) = tty->Wcm->cm_rows - 1, curX (tty) = 0; |
484 | 420 break; |
421 | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
48318
diff
changeset
|
422 case USECR: |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
423 emacs_tputs (tty, tty->Wcm->cm_cr, 1, cmputc); |
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
424 if (tty->Wcm->cm_autolf) |
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
425 curY (tty)++; |
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
426 curX (tty) = 0; |
484 | 427 break; |
428 } | |
429 | |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
430 (void) calccost (tty, curY (tty), curX (tty), row, col, 1); |
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
431 curY (tty) = row, curX (tty) = col; |
484 | 432 } |
433 | |
434 /* Clear out all terminal info. | |
435 Used before copying into it the info on the actual terminal. | |
436 */ | |
437 | |
21514 | 438 void |
82989
f3845715a5f6
Separate frame-local, tty-dependent parameters from tty-local parameters.
Karoly Lorentey <lorentey@elte.hu>
parents:
53343
diff
changeset
|
439 Wcm_clear (struct tty_display_info *tty) |
484 | 440 { |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
441 bzero (tty->Wcm, sizeof (struct cm)); |
484 | 442 UP = 0; |
443 BC = 0; | |
444 } | |
445 | |
446 /* | |
447 * Initialized stuff | |
448 * Return 0 if can do CM. | |
449 * Return -1 if cannot. | |
450 * Return -2 if size not specified. | |
451 */ | |
452 | |
21514 | 453 int |
82989
f3845715a5f6
Separate frame-local, tty-dependent parameters from tty-local parameters.
Karoly Lorentey <lorentey@elte.hu>
parents:
53343
diff
changeset
|
454 Wcm_init (struct tty_display_info *tty) |
484 | 455 { |
456 #if 0 | |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
457 if (tty->Wcm->cm_abs && !tty->Wcm->cm_ds) |
484 | 458 return 0; |
459 #endif | |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
460 if (tty->Wcm->cm_abs) |
484 | 461 return 0; |
462 /* Require up and left, and, if no absolute, down and right */ | |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
463 if (!tty->Wcm->cm_up || !tty->Wcm->cm_left) |
484 | 464 return - 1; |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
465 if (!tty->Wcm->cm_abs && (!tty->Wcm->cm_down || !tty->Wcm->cm_right)) |
484 | 466 return - 1; |
467 /* Check that we know the size of the screen.... */ | |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
468 if (tty->Wcm->cm_rows <= 0 || tty->Wcm->cm_cols <= 0) |
484 | 469 return - 2; |
470 return 0; | |
471 } | |
52401 | 472 |
473 /* arch-tag: bcf64c02-00f6-44ef-94b6-c56eab5b3dc4 | |
474 (do not change this comment) */ |