Mercurial > emacs
annotate src/dispnew.c @ 106768:21fd634f447a
Make line<->pixel_y conversion macros aware of native menu/tool bars.
They are placed above the internal border. This supersedes special
treatment of native tool bars in the display code.
This fixes wrong display position of native menu bars and bogus mouse
highlighting of native tool bars, both of which can be found when
internal border width is large. Also it fixes wrong flashed part on
visible bell with native menu bars.
* frame.h (FRAME_TOP_MARGIN_HEIGHT): New macro.
(FRAME_LINE_TO_PIXEL_Y, FRAME_PIXEL_Y_TO_LINE): Take account of pseudo
windows above internal border.
* window.h (WINDOW_MENU_BAR_P, WINDOW_TOOL_BAR_P): New macros.
(WINDOW_TOP_EDGE_Y, WINDOW_BOTTOM_EDGE_Y): Take account of pseudo
windows above internal border.
* xdisp.c (get_glyph_string_clip_rects, init_glyph_string): Don't treat
tool bar windows specially.
* xfns.c (x_set_tool_bar_lines): Take account of menu bar height.
* xterm.c (x_after_update_window_line): Don't treat tool bar windows
specially.
(XTflash): Take account of menu bar height.
* w32term.c (x_after_update_window_line): Don't treat tool bar windows
specially.
author | YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> |
---|---|
date | Sat, 09 Jan 2010 13:16:32 +0900 |
parents | 0c270bc7ceff |
children | 1d1d5d9bd884 886b2b7fcdba |
rev | line source |
---|---|
314 | 1 /* Updating of data structures for redisplay. |
64770
a0d1312ede66
Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
64084
diff
changeset
|
2 Copyright (C) 1985, 1986, 1987, 1988, 1993, 1994, 1995, |
a0d1312ede66
Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
64084
diff
changeset
|
3 1997, 1998, 1999, 2000, 2001, 2002, 2003, |
100951 | 4 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. |
314 | 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:
94946
diff
changeset
|
8 GNU Emacs is free software: you can redistribute it and/or modify |
314 | 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:
94946
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:
94946
diff
changeset
|
11 (at your option) any later version. |
314 | 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:
94946
diff
changeset
|
19 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ |
314 | 20 |
26088
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents:
25781
diff
changeset
|
21 #include <config.h> |
314 | 22 #include <signal.h> |
7900
60795e826dad
Put stdio.h after config.h.
Richard M. Stallman <rms@gnu.org>
parents:
7814
diff
changeset
|
23 #include <stdio.h> |
314 | 24 #include <ctype.h> |
105669
68dd71358159
* alloc.c: Do not define struct catchtag.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
104957
diff
changeset
|
25 #include <setjmp.h> |
314 | 26 |
21514 | 27 #ifdef HAVE_UNISTD_H |
28 #include <unistd.h> | |
29 #endif | |
30 | |
3525
58e789baa27a
Include lisp.h earlier (before termhooks.h).
Richard M. Stallman <rms@gnu.org>
parents:
3517
diff
changeset
|
31 #include "lisp.h" |
314 | 32 #include "termchar.h" |
33 #include "termopts.h" | |
13526
34382f4e23cb
Always include dispextern.h before cm.h.
Richard M. Stallman <rms@gnu.org>
parents:
13448
diff
changeset
|
34 /* cm.h must come after dispextern.h on Windows. */ |
13408
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
35 #include "dispextern.h" |
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
36 #include "cm.h" |
314 | 37 #include "buffer.h" |
88351
aac41b50c875
Include "character.h" instead of "charset.h".
Kenichi Handa <handa@m17n.org>
parents:
42835
diff
changeset
|
38 #include "character.h" |
31093
6da961dff718
Include keyboard.h before frame.h.
Andrew Innes <andrewi@gnu.org>
parents:
30720
diff
changeset
|
39 #include "keyboard.h" |
764 | 40 #include "frame.h" |
83004
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
82995
diff
changeset
|
41 #include "termhooks.h" |
314 | 42 #include "window.h" |
43 #include "commands.h" | |
44 #include "disptab.h" | |
45 #include "indent.h" | |
4384
98605d0ea3cf
(direct_output_for_insert): Fail if character
Richard M. Stallman <rms@gnu.org>
parents:
4290
diff
changeset
|
46 #include "intervals.h" |
15065 | 47 #include "blockinput.h" |
21514 | 48 #include "process.h" |
314 | 49 |
17015
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
50 /* I don't know why DEC Alpha OSF1 fail to compile this file if we |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
51 include the following file. */ |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
52 /* #include "systty.h" */ |
12917 | 53 #include "syssignal.h" |
554 | 54 |
314 | 55 #ifdef HAVE_X_WINDOWS |
56 #include "xterm.h" | |
25012 | 57 #endif /* HAVE_X_WINDOWS */ |
314 | 58 |
13408
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
59 #ifdef HAVE_NTGUI |
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
60 #include "w32term.h" |
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
61 #endif /* HAVE_NTGUI */ |
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
62 |
96675
d45acf0c8d23
merging Emacs.app (NeXTstep port)
Adrian Robert <Adrian.B.Robert@gmail.com>
parents:
96236
diff
changeset
|
63 #ifdef HAVE_NS |
d45acf0c8d23
merging Emacs.app (NeXTstep port)
Adrian Robert <Adrian.B.Robert@gmail.com>
parents:
96236
diff
changeset
|
64 #include "nsterm.h" |
d45acf0c8d23
merging Emacs.app (NeXTstep port)
Adrian Robert <Adrian.B.Robert@gmail.com>
parents:
96236
diff
changeset
|
65 #endif |
d45acf0c8d23
merging Emacs.app (NeXTstep port)
Adrian Robert <Adrian.B.Robert@gmail.com>
parents:
96236
diff
changeset
|
66 |
25012 | 67 /* Include systime.h after xterm.h to avoid double inclusion of time.h. */ |
68 | |
7808
52e2eb6245d4
Include systime.h after xterm.h.
Richard M. Stallman <rms@gnu.org>
parents:
7648
diff
changeset
|
69 #include "systime.h" |
7558
8497bcb9fb8e
(PENDING_OUTPUT_COUNT): If __GNU_LIBRARY__,
Richard M. Stallman <rms@gnu.org>
parents:
7530
diff
changeset
|
70 #include <errno.h> |
8497bcb9fb8e
(PENDING_OUTPUT_COUNT): If __GNU_LIBRARY__,
Richard M. Stallman <rms@gnu.org>
parents:
7530
diff
changeset
|
71 |
25012 | 72 /* To get the prototype for `sleep'. */ |
73 | |
74 #ifdef HAVE_UNISTD_H | |
75 #include <unistd.h> | |
76 #endif | |
77 | |
314 | 78 /* Get number of chars of output now in the buffer of a stdio stream. |
25012 | 79 This ought to be built in in stdio, but it isn't. Some s- files |
80 override this because their stdio internals differ. */ | |
81 | |
5214
c4bf07b226be
(PENDING_OUTPUT_COUNT) [__GNU_LIBRARY__]: Alternate definition for the GNU
Roland McGrath <roland@gnu.org>
parents:
5083
diff
changeset
|
82 #ifdef __GNU_LIBRARY__ |
25012 | 83 |
84 /* The s- file might have overridden the definition with one that | |
85 works for the system's C library. But we are using the GNU C | |
86 library, so this is the right definition for every system. */ | |
87 | |
7558
8497bcb9fb8e
(PENDING_OUTPUT_COUNT): If __GNU_LIBRARY__,
Richard M. Stallman <rms@gnu.org>
parents:
7530
diff
changeset
|
88 #ifdef GNU_LIBRARY_PENDING_OUTPUT_COUNT |
8497bcb9fb8e
(PENDING_OUTPUT_COUNT): If __GNU_LIBRARY__,
Richard M. Stallman <rms@gnu.org>
parents:
7530
diff
changeset
|
89 #define PENDING_OUTPUT_COUNT GNU_LIBRARY_PENDING_OUTPUT_COUNT |
8497bcb9fb8e
(PENDING_OUTPUT_COUNT): If __GNU_LIBRARY__,
Richard M. Stallman <rms@gnu.org>
parents:
7530
diff
changeset
|
90 #else |
7443
a9cb818e5316
[__GNU_LIBRARY__]: Redefine PENDING_OUTPUT_COUNT even if already defined.
Roland McGrath <roland@gnu.org>
parents:
7247
diff
changeset
|
91 #undef PENDING_OUTPUT_COUNT |
5214
c4bf07b226be
(PENDING_OUTPUT_COUNT) [__GNU_LIBRARY__]: Alternate definition for the GNU
Roland McGrath <roland@gnu.org>
parents:
5083
diff
changeset
|
92 #define PENDING_OUTPUT_COUNT(FILE) ((FILE)->__bufp - (FILE)->__buffer) |
7558
8497bcb9fb8e
(PENDING_OUTPUT_COUNT): If __GNU_LIBRARY__,
Richard M. Stallman <rms@gnu.org>
parents:
7530
diff
changeset
|
93 #endif |
8497bcb9fb8e
(PENDING_OUTPUT_COUNT): If __GNU_LIBRARY__,
Richard M. Stallman <rms@gnu.org>
parents:
7530
diff
changeset
|
94 #else /* not __GNU_LIBRARY__ */ |
26088
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents:
25781
diff
changeset
|
95 #if !defined (PENDING_OUTPUT_COUNT) && HAVE_STDIO_EXT_H && HAVE___FPENDING |
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents:
25781
diff
changeset
|
96 #include <stdio_ext.h> |
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents:
25781
diff
changeset
|
97 #define PENDING_OUTPUT_COUNT(FILE) __fpending (FILE) |
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents:
25781
diff
changeset
|
98 #endif |
7443
a9cb818e5316
[__GNU_LIBRARY__]: Redefine PENDING_OUTPUT_COUNT even if already defined.
Roland McGrath <roland@gnu.org>
parents:
7247
diff
changeset
|
99 #ifndef PENDING_OUTPUT_COUNT |
314 | 100 #define PENDING_OUTPUT_COUNT(FILE) ((FILE)->_ptr - (FILE)->_base) |
101 #endif | |
25012 | 102 #endif /* not __GNU_LIBRARY__ */ |
103 | |
41969
e669966d496e
Test GNU_LINUX, not LINUX.
Richard M. Stallman <rms@gnu.org>
parents:
41120
diff
changeset
|
104 #if defined(HAVE_TERM_H) && defined (GNU_LINUX) && defined (HAVE_LIBNCURSES) |
29437 | 105 #include <term.h> /* for tgetent */ |
106 #endif | |
25012 | 107 |
108 /* Structure to pass dimensions around. Used for character bounding | |
109 boxes, glyph matrix dimensions and alike. */ | |
110 | |
111 struct dim | |
112 { | |
113 int width; | |
114 int height; | |
115 }; | |
116 | |
117 | |
118 /* Function prototypes. */ | |
119 | |
35307
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
120 static struct glyph_matrix *save_current_matrix P_ ((struct frame *)); |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
121 static void restore_current_matrix P_ ((struct frame *, struct glyph_matrix *)); |
77267
7f8bdfdc0227
(adjust_frame_glyphs_for_frame_redisplay): Set garbaged flag in
Chong Yidong <cyd@stupidchicken.com>
parents:
76621
diff
changeset
|
122 static int showing_window_margins_p P_ ((struct window *)); |
34736
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
123 static void fake_current_matrices P_ ((Lisp_Object)); |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
124 static void redraw_overlapping_rows P_ ((struct window *, int)); |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
125 static void redraw_overlapped_rows P_ ((struct window *, int)); |
25012 | 126 static int count_blanks P_ ((struct glyph *, int)); |
127 static int count_match P_ ((struct glyph *, struct glyph *, | |
128 struct glyph *, struct glyph *)); | |
129 static unsigned line_draw_cost P_ ((struct glyph_matrix *, int)); | |
130 static void update_frame_line P_ ((struct frame *, int)); | |
131 static struct dim allocate_matrices_for_frame_redisplay | |
39448
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
132 P_ ((Lisp_Object, int, int, int, int *)); |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
133 static void allocate_matrices_for_window_redisplay P_ ((struct window *)); |
25012 | 134 static int realloc_glyph_pool P_ ((struct glyph_pool *, struct dim)); |
135 static void adjust_frame_glyphs P_ ((struct frame *)); | |
136 struct glyph_matrix *new_glyph_matrix P_ ((struct glyph_pool *)); | |
137 static void free_glyph_matrix P_ ((struct glyph_matrix *)); | |
138 static void adjust_glyph_matrix P_ ((struct window *, struct glyph_matrix *, | |
139 int, int, struct dim)); | |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
140 static void change_frame_size_1 P_ ((struct frame *, int, int, int, int, int)); |
25012 | 141 static void swap_glyph_pointers P_ ((struct glyph_row *, struct glyph_row *)); |
34895
53e52b3525bf
Use #if GLYPH_DEBUG instead of #ifdef GLYPH_DEBUG.
Gerd Moellmann <gerd@gnu.org>
parents:
34893
diff
changeset
|
142 #if GLYPH_DEBUG |
25012 | 143 static int glyph_row_slice_p P_ ((struct glyph_row *, struct glyph_row *)); |
30323
4cd1b8fe118c
(direct_output_for_insert): Remove confusing
Gerd Moellmann <gerd@gnu.org>
parents:
30307
diff
changeset
|
144 #endif |
25012 | 145 static void fill_up_frame_row_with_spaces P_ ((struct glyph_row *, int)); |
146 static void build_frame_matrix_from_window_tree P_ ((struct glyph_matrix *, | |
147 struct window *)); | |
148 static void build_frame_matrix_from_leaf_window P_ ((struct glyph_matrix *, | |
149 struct window *)); | |
150 static struct glyph_pool *new_glyph_pool P_ ((void)); | |
151 static void free_glyph_pool P_ ((struct glyph_pool *)); | |
152 static void adjust_frame_glyphs_initially P_ ((void)); | |
153 static void adjust_frame_message_buffer P_ ((struct frame *)); | |
154 static void adjust_decode_mode_spec_buffer P_ ((struct frame *)); | |
155 static void fill_up_glyph_row_with_spaces P_ ((struct glyph_row *)); | |
156 static void build_frame_matrix P_ ((struct frame *)); | |
157 void clear_current_matrices P_ ((struct frame *)); | |
158 void scroll_glyph_matrix_range P_ ((struct glyph_matrix *, int, int, | |
159 int, int)); | |
160 static void clear_window_matrices P_ ((struct window *, int)); | |
161 static void fill_up_glyph_row_area_with_spaces P_ ((struct glyph_row *, int)); | |
162 static int scrolling_window P_ ((struct window *, int)); | |
30161
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
163 static int update_window_line P_ ((struct window *, int, int *)); |
25012 | 164 static void update_marginal_area P_ ((struct window *, int, int)); |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
165 static int update_text_area P_ ((struct window *, int)); |
25012 | 166 static void make_current P_ ((struct glyph_matrix *, struct glyph_matrix *, |
167 int)); | |
168 static void mirror_make_current P_ ((struct window *, int)); | |
169 void check_window_matrix_pointers P_ ((struct window *)); | |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
170 #if GLYPH_DEBUG |
25012 | 171 static void check_matrix_pointers P_ ((struct glyph_matrix *, |
172 struct glyph_matrix *)); | |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
173 #endif |
25012 | 174 static void mirror_line_dance P_ ((struct window *, int, int, int *, char *)); |
175 static int update_window_tree P_ ((struct window *, int)); | |
176 static int update_window P_ ((struct window *, int)); | |
177 static int update_frame_1 P_ ((struct frame *, int, int)); | |
178 static void set_window_cursor_after_update P_ ((struct window *)); | |
179 static int row_equal_p P_ ((struct window *, struct glyph_row *, | |
30152
f6270e5282da
(direct_output_forward_char): Give up if currently
Gerd Moellmann <gerd@gnu.org>
parents:
30041
diff
changeset
|
180 struct glyph_row *, int)); |
25012 | 181 static void adjust_frame_glyphs_for_window_redisplay P_ ((struct frame *)); |
182 static void adjust_frame_glyphs_for_frame_redisplay P_ ((struct frame *)); | |
183 static void reverse_rows P_ ((struct glyph_matrix *, int, int)); | |
184 static int margin_glyphs_to_reserve P_ ((struct window *, int, Lisp_Object)); | |
27855
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
185 static void sync_window_with_frame_matrix_rows P_ ((struct window *)); |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
186 struct window *frame_row_to_window P_ ((struct window *, int)); |
25012 | 187 |
188 | |
189 /* Non-zero means don't pause redisplay for pending input. (This is | |
190 for debugging and for a future implementation of EDT-like | |
191 scrolling. */ | |
192 | |
193 int redisplay_dont_pause; | |
10770
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
194 |
71323
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
195 /* Define PERIODIC_PREEMPTION_CHECKING to 1, if micro-second timers |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
196 are supported, so we can check for input during redisplay at |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
197 regular intervals. */ |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
198 #ifdef EMACS_HAS_USECS |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
199 #define PERIODIC_PREEMPTION_CHECKING 1 |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
200 #else |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
201 #define PERIODIC_PREEMPTION_CHECKING 0 |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
202 #endif |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
203 |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
204 #if PERIODIC_PREEMPTION_CHECKING |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
205 |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
206 /* If a number (float), check for user input every N seconds. */ |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
207 |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
208 Lisp_Object Vredisplay_preemption_period; |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
209 |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
210 /* Redisplay preemption timers. */ |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
211 |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
212 static EMACS_TIME preemption_period; |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
213 static EMACS_TIME preemption_next_check; |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
214 |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
215 #endif |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
216 |
554 | 217 /* Nonzero upon entry to redisplay means do not assume anything about |
764 | 218 current contents of actual terminal frame; clear and redraw it. */ |
314 | 219 |
764 | 220 int frame_garbaged; |
314 | 221 |
25012 | 222 /* Nonzero means last display completed. Zero means it was preempted. */ |
314 | 223 |
224 int display_completed; | |
225 | |
25012 | 226 /* Lisp variable visible-bell; enables use of screen-flash instead of |
227 audible bell. */ | |
314 | 228 |
229 int visible_bell; | |
230 | |
764 | 231 /* Invert the color of the whole frame, at a low level. */ |
314 | 232 |
233 int inverse_video; | |
234 | |
235 /* Line speed of the terminal. */ | |
236 | |
43713
f92c4d87863a
Change defvar_int def and vars to use EMACS_INT instead of just int.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
42835
diff
changeset
|
237 EMACS_INT baud_rate; |
314 | 238 |
25012 | 239 /* Either nil or a symbol naming the window system under which Emacs |
83014
f5cadabb36dd
Support for opening X frames from a tty session.
Karoly Lorentey <lorentey@elte.hu>
parents:
83010
diff
changeset
|
240 creates the first frame. */ |
f5cadabb36dd
Support for opening X frames from a tty session.
Karoly Lorentey <lorentey@elte.hu>
parents:
83010
diff
changeset
|
241 |
f5cadabb36dd
Support for opening X frames from a tty session.
Karoly Lorentey <lorentey@elte.hu>
parents:
83010
diff
changeset
|
242 Lisp_Object Vinitial_window_system; |
314 | 243 |
244 /* Version number of X windows: 10, 11 or nil. */ | |
25012 | 245 |
314 | 246 Lisp_Object Vwindow_system_version; |
247 | |
25012 | 248 /* Vector of glyph definitions. Indexed by glyph number, the contents |
249 are a string which is how to output the glyph. | |
314 | 250 |
251 If Vglyph_table is nil, a glyph is output by using its low 8 bits | |
25012 | 252 as a character code. |
253 | |
254 This is an obsolete feature that is no longer used. The variable | |
255 is retained for compatibility. */ | |
314 | 256 |
257 Lisp_Object Vglyph_table; | |
258 | |
259 /* Display table to use for vectors that don't specify their own. */ | |
260 | |
261 Lisp_Object Vstandard_display_table; | |
262 | |
25012 | 263 /* Nonzero means reading single-character input with prompt so put |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
264 cursor on mini-buffer after the prompt. Positive means at end of |
25012 | 265 text in echo area; negative means at beginning of line. */ |
266 | |
314 | 267 int cursor_in_echo_area; |
13220
2e9014617492
(Qdisplay_table): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13105
diff
changeset
|
268 |
30720
64f3338f72d8
(Qredisplay_dont_pause): New variable.
Gerd Moellmann <gerd@gnu.org>
parents:
30713
diff
changeset
|
269 Lisp_Object Qdisplay_table, Qredisplay_dont_pause; |
25012 | 270 |
314 | 271 |
25012 | 272 /* The currently selected frame. In a single-frame version, this |
25666
063da8f6a487
(selected_frame): Make it a Lisp_Object.
Gerd Moellmann <gerd@gnu.org>
parents:
25546
diff
changeset
|
273 variable always equals the_only_frame. */ |
063da8f6a487
(selected_frame): Make it a Lisp_Object.
Gerd Moellmann <gerd@gnu.org>
parents:
25546
diff
changeset
|
274 |
063da8f6a487
(selected_frame): Make it a Lisp_Object.
Gerd Moellmann <gerd@gnu.org>
parents:
25546
diff
changeset
|
275 Lisp_Object selected_frame; |
25012 | 276 |
277 /* A frame which is not just a mini-buffer, or 0 if there are no such | |
764 | 278 frames. This is usually the most recent such frame that was |
9572 | 279 selected. In a single-frame version, this variable always holds |
280 the address of the_only_frame. */ | |
25012 | 281 |
282 struct frame *last_nonminibuf_frame; | |
283 | |
284 /* 1 means SIGWINCH happened when not safe. */ | |
285 | |
286 int delayed_size_change; | |
287 | |
288 /* 1 means glyph initialization has been completed at startup. */ | |
289 | |
290 static int glyphs_initialized_initially_p; | |
291 | |
292 /* Updated window if != 0. Set by update_window. */ | |
293 | |
294 struct window *updated_window; | |
295 | |
296 /* Glyph row updated in update_window_line, and area that is updated. */ | |
297 | |
298 struct glyph_row *updated_row; | |
299 int updated_area; | |
300 | |
301 /* A glyph for a space. */ | |
302 | |
303 struct glyph space_glyph; | |
304 | |
305 /* Non-zero means update has been performed directly, so that there's | |
306 no need for redisplay_internal to do much work. Set by | |
307 direct_output_for_insert. */ | |
308 | |
309 int redisplay_performed_directly_p; | |
310 | |
311 /* Counts of allocated structures. These counts serve to diagnose | |
312 memory leaks and double frees. */ | |
313 | |
314 int glyph_matrix_count; | |
315 int glyph_pool_count; | |
316 | |
317 /* If non-null, the frame whose frame matrices are manipulated. If | |
318 null, window matrices are worked on. */ | |
319 | |
320 static struct frame *frame_matrix_frame; | |
321 | |
322 /* Non-zero means that fonts have been loaded since the last glyph | |
323 matrix adjustments. Redisplay must stop, and glyph matrices must | |
324 be adjusted when this flag becomes non-zero during display. The | |
325 reason fonts can be loaded so late is that fonts of fontsets are | |
94946
6009a07ef854
(fonts_changed_p): Comment improved.
Kenichi Handa <handa@m17n.org>
parents:
94909
diff
changeset
|
326 loaded on demand. Another reason is that a line contains many |
6009a07ef854
(fonts_changed_p): Comment improved.
Kenichi Handa <handa@m17n.org>
parents:
94909
diff
changeset
|
327 characters displayed by zero width or very narrow glyphs of |
6009a07ef854
(fonts_changed_p): Comment improved.
Kenichi Handa <handa@m17n.org>
parents:
94909
diff
changeset
|
328 variable-width fonts. */ |
25012 | 329 |
330 int fonts_changed_p; | |
331 | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
332 /* Convert vpos and hpos from frame to window and vice versa. |
25012 | 333 This may only be used for terminal frames. */ |
334 | |
335 #if GLYPH_DEBUG | |
336 | |
337 static int window_to_frame_vpos P_ ((struct window *, int)); | |
338 static int window_to_frame_hpos P_ ((struct window *, int)); | |
339 #define WINDOW_TO_FRAME_VPOS(W, VPOS) window_to_frame_vpos ((W), (VPOS)) | |
340 #define WINDOW_TO_FRAME_HPOS(W, HPOS) window_to_frame_hpos ((W), (HPOS)) | |
341 | |
34866
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
342 /* One element of the ring buffer containing redisplay history |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
343 information. */ |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
344 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
345 struct redisplay_history |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
346 { |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
347 char trace[512 + 100]; |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
348 }; |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
349 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
350 /* The size of the history buffer. */ |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
351 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
352 #define REDISPLAY_HISTORY_SIZE 30 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
353 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
354 /* The redisplay history buffer. */ |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
355 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
356 static struct redisplay_history redisplay_history[REDISPLAY_HISTORY_SIZE]; |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
357 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
358 /* Next free entry in redisplay_history. */ |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
359 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
360 static int history_idx; |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
361 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
362 /* A tick that's incremented each time something is added to the |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
363 history. */ |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
364 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
365 static unsigned history_tick; |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
366 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
367 static void add_frame_display_history P_ ((struct frame *, int)); |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
368 static void add_window_display_history P_ ((struct window *, char *, int)); |
71141 | 369 |
34866
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
370 /* Add to the redisplay history how window W has been displayed. |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
371 MSG is a trace containing the information how W's glyph matrix |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
372 has been constructed. PAUSED_P non-zero means that the update |
34866
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
373 has been interrupted for pending input. */ |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
374 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
375 static void |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
376 add_window_display_history (w, msg, paused_p) |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
377 struct window *w; |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
378 char *msg; |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
379 int paused_p; |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
380 { |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
381 char *buf; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
382 |
34866
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
383 if (history_idx >= REDISPLAY_HISTORY_SIZE) |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
384 history_idx = 0; |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
385 buf = redisplay_history[history_idx].trace; |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
386 ++history_idx; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
387 |
34866
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
388 sprintf (buf, "%d: window %p (`%s')%s\n", |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
389 history_tick++, |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
390 w, |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
391 ((BUFFERP (w->buffer) |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
392 && STRINGP (XBUFFER (w->buffer)->name)) |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
393 ? (char *) SDATA (XBUFFER (w->buffer)->name) |
34866
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
394 : "???"), |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
395 paused_p ? " ***paused***" : ""); |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
396 strcat (buf, msg); |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
397 } |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
398 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
399 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
400 /* Add to the redisplay history that frame F has been displayed. |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
401 PAUSED_P non-zero means that the update has been interrupted for |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
402 pending input. */ |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
403 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
404 static void |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
405 add_frame_display_history (f, paused_p) |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
406 struct frame *f; |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
407 int paused_p; |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
408 { |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
409 char *buf; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
410 |
34866
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
411 if (history_idx >= REDISPLAY_HISTORY_SIZE) |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
412 history_idx = 0; |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
413 buf = redisplay_history[history_idx].trace; |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
414 ++history_idx; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
415 |
34866
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
416 sprintf (buf, "%d: update frame %p%s", |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
417 history_tick++, |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
418 f, paused_p ? " ***paused***" : ""); |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
419 } |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
420 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
421 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
422 DEFUN ("dump-redisplay-history", Fdump_redisplay_history, |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
423 Sdump_redisplay_history, 0, 0, "", |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
424 doc: /* Dump redisplay history to stderr. */) |
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
425 () |
34866
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
426 { |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
427 int i; |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
428 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
429 for (i = history_idx - 1; i != history_idx; --i) |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
430 { |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
431 if (i < 0) |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
432 i = REDISPLAY_HISTORY_SIZE - 1; |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
433 fprintf (stderr, "%s\n", redisplay_history[i].trace); |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
434 } |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
435 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
436 return Qnil; |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
437 } |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
438 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
439 |
25012 | 440 #else /* GLYPH_DEBUG == 0 */ |
441 | |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
442 #define WINDOW_TO_FRAME_VPOS(W, VPOS) ((VPOS) + WINDOW_TOP_EDGE_LINE (W)) |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
443 #define WINDOW_TO_FRAME_HPOS(W, HPOS) ((HPOS) + WINDOW_LEFT_EDGE_COL (W)) |
25012 | 444 |
445 #endif /* GLYPH_DEBUG == 0 */ | |
446 | |
447 | |
448 /* Like bcopy except never gets confused by overlap. Let this be the | |
449 first function defined in this file, or change emacs.c where the | |
450 address of this function is used. */ | |
314 | 451 |
452 void | |
453 safe_bcopy (from, to, size) | |
46551
227785e3e29f
(safe_bcopy): Source pointer now points to const.
Ken Raeburn <raeburn@raeburn.org>
parents:
46370
diff
changeset
|
454 const char *from; |
227785e3e29f
(safe_bcopy): Source pointer now points to const.
Ken Raeburn <raeburn@raeburn.org>
parents:
46370
diff
changeset
|
455 char *to; |
314 | 456 int size; |
457 { | |
1588
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
458 if (size <= 0 || from == to) |
314 | 459 return; |
460 | |
1588
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
461 /* If the source and destination don't overlap, then bcopy can |
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
462 handle it. If they do overlap, but the destination is lower in |
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
463 memory than the source, we'll assume bcopy can handle that. */ |
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
464 if (to < from || from + size <= to) |
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
465 bcopy (from, to, size); |
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
466 |
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
467 /* Otherwise, we'll copy from the end. */ |
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
468 else |
314 | 469 { |
46551
227785e3e29f
(safe_bcopy): Source pointer now points to const.
Ken Raeburn <raeburn@raeburn.org>
parents:
46370
diff
changeset
|
470 register const char *endf = from + size; |
1588
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
471 register char *endt = to + size; |
314 | 472 |
473 /* If TO - FROM is large, then we should break the copy into | |
474 nonoverlapping chunks of TO - FROM bytes each. However, if | |
475 TO - FROM is small, then the bcopy function call overhead | |
476 makes this not worth it. The crossover point could be about | |
1588
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
477 anywhere. Since I don't think the obvious copy loop is too |
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
478 bad, I'm trying to err in its favor. */ |
314 | 479 if (to - from < 64) |
480 { | |
481 do | |
482 *--endt = *--endf; | |
483 while (endf != from); | |
484 } | |
485 else | |
486 { | |
1588
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
487 for (;;) |
314 | 488 { |
489 endt -= (to - from); | |
490 endf -= (to - from); | |
491 | |
1588
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
492 if (endt < to) |
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
493 break; |
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
494 |
314 | 495 bcopy (endf, endt, to - from); |
496 } | |
1588
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
497 |
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
498 /* If SIZE wasn't a multiple of TO - FROM, there will be a |
25012 | 499 little left over. The amount left over is (endt + (to - |
500 from)) - to, which is endt - from. */ | |
314 | 501 bcopy (from, to, endt - from); |
502 } | |
503 } | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
504 } |
314 | 505 |
25012 | 506 |
507 | |
508 /*********************************************************************** | |
509 Glyph Matrices | |
510 ***********************************************************************/ | |
511 | |
512 /* Allocate and return a glyph_matrix structure. POOL is the glyph | |
513 pool from which memory for the matrix should be allocated, or null | |
514 for window-based redisplay where no glyph pools are used. The | |
515 member `pool' of the glyph matrix structure returned is set to | |
516 POOL, the structure is otherwise zeroed. */ | |
517 | |
518 struct glyph_matrix * | |
519 new_glyph_matrix (pool) | |
520 struct glyph_pool *pool; | |
521 { | |
522 struct glyph_matrix *result; | |
523 | |
524 /* Allocate and clear. */ | |
525 result = (struct glyph_matrix *) xmalloc (sizeof *result); | |
526 bzero (result, sizeof *result); | |
527 | |
528 /* Increment number of allocated matrices. This count is used | |
529 to detect memory leaks. */ | |
530 ++glyph_matrix_count; | |
531 | |
532 /* Set pool and return. */ | |
533 result->pool = pool; | |
534 return result; | |
535 } | |
536 | |
537 | |
538 /* Free glyph matrix MATRIX. Passing in a null MATRIX is allowed. | |
539 | |
540 The global counter glyph_matrix_count is decremented when a matrix | |
541 is freed. If the count gets negative, more structures were freed | |
542 than allocated, i.e. one matrix was freed more than once or a bogus | |
543 pointer was passed to this function. | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
544 |
25012 | 545 If MATRIX->pool is null, this means that the matrix manages its own |
546 glyph memory---this is done for matrices on X frames. Freeing the | |
547 matrix also frees the glyph memory in this case. */ | |
548 | |
549 static void | |
550 free_glyph_matrix (matrix) | |
551 struct glyph_matrix *matrix; | |
552 { | |
553 if (matrix) | |
554 { | |
555 int i; | |
556 | |
557 /* Detect the case that more matrices are freed than were | |
558 allocated. */ | |
559 if (--glyph_matrix_count < 0) | |
560 abort (); | |
561 | |
562 /* Free glyph memory if MATRIX owns it. */ | |
563 if (matrix->pool == NULL) | |
564 for (i = 0; i < matrix->rows_allocated; ++i) | |
565 xfree (matrix->rows[i].glyphs[LEFT_MARGIN_AREA]); | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
566 |
25012 | 567 /* Free row structures and the matrix itself. */ |
568 xfree (matrix->rows); | |
569 xfree (matrix); | |
570 } | |
571 } | |
572 | |
573 | |
574 /* Return the number of glyphs to reserve for a marginal area of | |
575 window W. TOTAL_GLYPHS is the number of glyphs in a complete | |
576 display line of window W. MARGIN gives the width of the marginal | |
577 area in canonical character units. MARGIN should be an integer | |
578 or a float. */ | |
579 | |
580 static int | |
581 margin_glyphs_to_reserve (w, total_glyphs, margin) | |
582 struct window *w; | |
583 int total_glyphs; | |
584 Lisp_Object margin; | |
585 { | |
586 int n; | |
587 | |
588 if (NUMBERP (margin)) | |
589 { | |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
590 int width = XFASTINT (w->total_cols); |
25012 | 591 double d = max (0, XFLOATINT (margin)); |
592 d = min (width / 2 - 1, d); | |
57808
a1c4ff636947
(margin_glyphs_to_reserve): Don't use ncols_scale_factor.
Kim F. Storm <storm@cua.dk>
parents:
56727
diff
changeset
|
593 n = (int) ((double) total_glyphs / width * d); |
25012 | 594 } |
595 else | |
596 n = 0; | |
597 | |
598 return n; | |
599 } | |
600 | |
601 | |
602 /* Adjust glyph matrix MATRIX on window W or on a frame to changed | |
603 window sizes. | |
604 | |
605 W is null if the function is called for a frame glyph matrix. | |
606 Otherwise it is the window MATRIX is a member of. X and Y are the | |
607 indices of the first column and row of MATRIX within the frame | |
608 matrix, if such a matrix exists. They are zero for purely | |
609 window-based redisplay. DIM is the needed size of the matrix. | |
610 | |
611 In window-based redisplay, where no frame matrices exist, glyph | |
612 matrices manage their own glyph storage. Otherwise, they allocate | |
613 storage from a common frame glyph pool which can be found in | |
614 MATRIX->pool. | |
615 | |
616 The reason for this memory management strategy is to avoid complete | |
617 frame redraws if possible. When we allocate from a common pool, a | |
618 change of the location or size of a sub-matrix within the pool | |
619 requires a complete redisplay of the frame because we cannot easily | |
620 make sure that the current matrices of all windows still agree with | |
621 what is displayed on the screen. While this is usually fast, it | |
622 leads to screen flickering. */ | |
623 | |
624 static void | |
625 adjust_glyph_matrix (w, matrix, x, y, dim) | |
626 struct window *w; | |
627 struct glyph_matrix *matrix; | |
628 int x, y; | |
629 struct dim dim; | |
630 { | |
631 int i; | |
632 int new_rows; | |
633 int marginal_areas_changed_p = 0; | |
25546 | 634 int header_line_changed_p = 0; |
635 int header_line_p = 0; | |
25012 | 636 int left = -1, right = -1; |
80274
b818bce5757f
(adjust_glyph_matrix): Initialize window_height.
Jason Rumney <jasonr@gnu.org>
parents:
79759
diff
changeset
|
637 int window_width = -1, window_height = -1; |
25012 | 638 |
52377
a90dea69e764
(adjust_glyph_matrix): Call window_box whenever W is nonzero.
Richard M. Stallman <rms@gnu.org>
parents:
51413
diff
changeset
|
639 /* See if W had a header line that has disappeared now, or vice versa. |
a90dea69e764
(adjust_glyph_matrix): Call window_box whenever W is nonzero.
Richard M. Stallman <rms@gnu.org>
parents:
51413
diff
changeset
|
640 Get W's size. */ |
25012 | 641 if (w) |
642 { | |
52377
a90dea69e764
(adjust_glyph_matrix): Call window_box whenever W is nonzero.
Richard M. Stallman <rms@gnu.org>
parents:
51413
diff
changeset
|
643 window_box (w, -1, 0, 0, &window_width, &window_height); |
a90dea69e764
(adjust_glyph_matrix): Call window_box whenever W is nonzero.
Richard M. Stallman <rms@gnu.org>
parents:
51413
diff
changeset
|
644 |
25546 | 645 header_line_p = WINDOW_WANTS_HEADER_LINE_P (w); |
646 header_line_changed_p = header_line_p != matrix->header_line_p; | |
25012 | 647 } |
25546 | 648 matrix->header_line_p = header_line_p; |
25012 | 649 |
52377
a90dea69e764
(adjust_glyph_matrix): Call window_box whenever W is nonzero.
Richard M. Stallman <rms@gnu.org>
parents:
51413
diff
changeset
|
650 /* If POOL is null, MATRIX is a window matrix for window-based redisplay. |
a90dea69e764
(adjust_glyph_matrix): Call window_box whenever W is nonzero.
Richard M. Stallman <rms@gnu.org>
parents:
51413
diff
changeset
|
651 Do nothing if MATRIX' size, position, vscroll, and marginal areas |
25012 | 652 haven't changed. This optimization is important because preserving |
653 the matrix means preventing redisplay. */ | |
654 if (matrix->pool == NULL) | |
655 { | |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
656 left = margin_glyphs_to_reserve (w, dim.width, w->left_margin_cols); |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
657 right = margin_glyphs_to_reserve (w, dim.width, w->right_margin_cols); |
25012 | 658 xassert (left >= 0 && right >= 0); |
659 marginal_areas_changed_p = (left != matrix->left_margin_glyphs | |
660 || right != matrix->right_margin_glyphs); | |
661 | |
662 if (!marginal_areas_changed_p | |
663 && !fonts_changed_p | |
25546 | 664 && !header_line_changed_p |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
665 && matrix->window_left_col == WINDOW_LEFT_EDGE_COL (w) |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
666 && matrix->window_top_line == WINDOW_TOP_EDGE_LINE (w) |
25012 | 667 && matrix->window_height == window_height |
668 && matrix->window_vscroll == w->vscroll | |
669 && matrix->window_width == window_width) | |
670 return; | |
671 } | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
672 |
25012 | 673 /* Enlarge MATRIX->rows if necessary. New rows are cleared. */ |
674 if (matrix->rows_allocated < dim.height) | |
675 { | |
676 int size = dim.height * sizeof (struct glyph_row); | |
677 new_rows = dim.height - matrix->rows_allocated; | |
678 matrix->rows = (struct glyph_row *) xrealloc (matrix->rows, size); | |
679 bzero (matrix->rows + matrix->rows_allocated, | |
680 new_rows * sizeof *matrix->rows); | |
681 matrix->rows_allocated = dim.height; | |
682 } | |
683 else | |
684 new_rows = 0; | |
685 | |
686 /* If POOL is not null, MATRIX is a frame matrix or a window matrix | |
687 on a frame not using window-based redisplay. Set up pointers for | |
688 each row into the glyph pool. */ | |
689 if (matrix->pool) | |
690 { | |
691 xassert (matrix->pool->glyphs); | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
692 |
25012 | 693 if (w) |
694 { | |
695 left = margin_glyphs_to_reserve (w, dim.width, | |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
696 w->left_margin_cols); |
25012 | 697 right = margin_glyphs_to_reserve (w, dim.width, |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
698 w->right_margin_cols); |
25012 | 699 } |
700 else | |
701 left = right = 0; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
702 |
25012 | 703 for (i = 0; i < dim.height; ++i) |
704 { | |
705 struct glyph_row *row = &matrix->rows[i]; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
706 |
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
707 row->glyphs[LEFT_MARGIN_AREA] |
25012 | 708 = (matrix->pool->glyphs |
709 + (y + i) * matrix->pool->ncolumns | |
710 + x); | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
711 |
25012 | 712 if (w == NULL |
713 || row == matrix->rows + dim.height - 1 | |
25546 | 714 || (row == matrix->rows && matrix->header_line_p)) |
25012 | 715 { |
716 row->glyphs[TEXT_AREA] | |
717 = row->glyphs[LEFT_MARGIN_AREA]; | |
718 row->glyphs[RIGHT_MARGIN_AREA] | |
719 = row->glyphs[TEXT_AREA] + dim.width; | |
720 row->glyphs[LAST_AREA] | |
721 = row->glyphs[RIGHT_MARGIN_AREA]; | |
722 } | |
723 else | |
724 { | |
725 row->glyphs[TEXT_AREA] | |
726 = row->glyphs[LEFT_MARGIN_AREA] + left; | |
727 row->glyphs[RIGHT_MARGIN_AREA] | |
728 = row->glyphs[TEXT_AREA] + dim.width - left - right; | |
729 row->glyphs[LAST_AREA] | |
730 = row->glyphs[LEFT_MARGIN_AREA] + dim.width; | |
731 } | |
732 } | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
733 |
25012 | 734 matrix->left_margin_glyphs = left; |
735 matrix->right_margin_glyphs = right; | |
736 } | |
737 else | |
738 { | |
739 /* If MATRIX->pool is null, MATRIX is responsible for managing | |
52377
a90dea69e764
(adjust_glyph_matrix): Call window_box whenever W is nonzero.
Richard M. Stallman <rms@gnu.org>
parents:
51413
diff
changeset
|
740 its own memory. It is a window matrix for window-based redisplay. |
a90dea69e764
(adjust_glyph_matrix): Call window_box whenever W is nonzero.
Richard M. Stallman <rms@gnu.org>
parents:
51413
diff
changeset
|
741 Allocate glyph memory from the heap. */ |
25012 | 742 if (dim.width > matrix->matrix_w |
743 || new_rows | |
25546 | 744 || header_line_changed_p |
25012 | 745 || marginal_areas_changed_p) |
746 { | |
747 struct glyph_row *row = matrix->rows; | |
748 struct glyph_row *end = row + matrix->rows_allocated; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
749 |
25012 | 750 while (row < end) |
751 { | |
752 row->glyphs[LEFT_MARGIN_AREA] | |
753 = (struct glyph *) xrealloc (row->glyphs[LEFT_MARGIN_AREA], | |
754 (dim.width | |
755 * sizeof (struct glyph))); | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
756 |
25012 | 757 /* The mode line never has marginal areas. */ |
758 if (row == matrix->rows + dim.height - 1 | |
25546 | 759 || (row == matrix->rows && matrix->header_line_p)) |
25012 | 760 { |
761 row->glyphs[TEXT_AREA] | |
762 = row->glyphs[LEFT_MARGIN_AREA]; | |
763 row->glyphs[RIGHT_MARGIN_AREA] | |
764 = row->glyphs[TEXT_AREA] + dim.width; | |
765 row->glyphs[LAST_AREA] | |
766 = row->glyphs[RIGHT_MARGIN_AREA]; | |
767 } | |
768 else | |
769 { | |
770 row->glyphs[TEXT_AREA] | |
771 = row->glyphs[LEFT_MARGIN_AREA] + left; | |
772 row->glyphs[RIGHT_MARGIN_AREA] | |
773 = row->glyphs[TEXT_AREA] + dim.width - left - right; | |
774 row->glyphs[LAST_AREA] | |
775 = row->glyphs[LEFT_MARGIN_AREA] + dim.width; | |
776 } | |
777 ++row; | |
778 } | |
779 } | |
780 | |
781 xassert (left >= 0 && right >= 0); | |
782 matrix->left_margin_glyphs = left; | |
783 matrix->right_margin_glyphs = right; | |
784 } | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
785 |
25012 | 786 /* Number of rows to be used by MATRIX. */ |
787 matrix->nrows = dim.height; | |
31932
081edde76197
(adjust_glyph_matrix, enable_glyph_matrix_rows):
Gerd Moellmann <gerd@gnu.org>
parents:
31850
diff
changeset
|
788 xassert (matrix->nrows >= 0); |
25012 | 789 |
35609
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
790 if (w) |
25012 | 791 { |
35609
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
792 if (matrix == w->current_matrix) |
25012 | 793 { |
35609
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
794 /* Mark rows in a current matrix of a window as not having |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
795 valid contents. It's important to not do this for |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
796 desired matrices. When Emacs starts, it may already be |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
797 building desired matrices when this function runs. */ |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
798 if (window_width < 0) |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
799 window_width = window_box_width (w, -1); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
800 |
35609
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
801 /* Optimize the case that only the height has changed (C-x 2, |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
802 upper window). Invalidate all rows that are no longer part |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
803 of the window. */ |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
804 if (!marginal_areas_changed_p |
37098
e293840c7332
(adjust_glyph_matrix): Don't try to reuse the current
Gerd Moellmann <gerd@gnu.org>
parents:
36697
diff
changeset
|
805 && !header_line_changed_p |
e293840c7332
(adjust_glyph_matrix): Don't try to reuse the current
Gerd Moellmann <gerd@gnu.org>
parents:
36697
diff
changeset
|
806 && new_rows == 0 |
e293840c7332
(adjust_glyph_matrix): Don't try to reuse the current
Gerd Moellmann <gerd@gnu.org>
parents:
36697
diff
changeset
|
807 && dim.width == matrix->matrix_w |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
808 && matrix->window_left_col == WINDOW_LEFT_EDGE_COL (w) |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
809 && matrix->window_top_line == WINDOW_TOP_EDGE_LINE (w) |
37098
e293840c7332
(adjust_glyph_matrix): Don't try to reuse the current
Gerd Moellmann <gerd@gnu.org>
parents:
36697
diff
changeset
|
810 && matrix->window_width == window_width) |
35609
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
811 { |
38528
c867615c6a26
(adjust_glyph_matrix): In the optimization for
Gerd Moellmann <gerd@gnu.org>
parents:
38489
diff
changeset
|
812 /* Find the last row in the window. */ |
c867615c6a26
(adjust_glyph_matrix): In the optimization for
Gerd Moellmann <gerd@gnu.org>
parents:
38489
diff
changeset
|
813 for (i = 0; i < matrix->nrows && matrix->rows[i].enabled_p; ++i) |
c867615c6a26
(adjust_glyph_matrix): In the optimization for
Gerd Moellmann <gerd@gnu.org>
parents:
38489
diff
changeset
|
814 if (MATRIX_ROW_BOTTOM_Y (matrix->rows + i) >= window_height) |
c867615c6a26
(adjust_glyph_matrix): In the optimization for
Gerd Moellmann <gerd@gnu.org>
parents:
38489
diff
changeset
|
815 { |
38748
bb32ae33769e
(adjust_glyph_matrix): Undo last change.
Gerd Moellmann <gerd@gnu.org>
parents:
38734
diff
changeset
|
816 ++i; |
38528
c867615c6a26
(adjust_glyph_matrix): In the optimization for
Gerd Moellmann <gerd@gnu.org>
parents:
38489
diff
changeset
|
817 break; |
c867615c6a26
(adjust_glyph_matrix): In the optimization for
Gerd Moellmann <gerd@gnu.org>
parents:
38489
diff
changeset
|
818 } |
35609
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
819 |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
820 /* Window end is invalid, if inside of the rows that |
38528
c867615c6a26
(adjust_glyph_matrix): In the optimization for
Gerd Moellmann <gerd@gnu.org>
parents:
38489
diff
changeset
|
821 are invalidated below. */ |
35609
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
822 if (INTEGERP (w->window_end_vpos) |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
823 && XFASTINT (w->window_end_vpos) >= i) |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
824 w->window_end_valid = Qnil; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
825 |
35609
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
826 while (i < matrix->nrows) |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
827 matrix->rows[i++].enabled_p = 0; |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
828 } |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
829 else |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
830 { |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
831 for (i = 0; i < matrix->nrows; ++i) |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
832 matrix->rows[i].enabled_p = 0; |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
833 } |
25012 | 834 } |
35609
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
835 else if (matrix == w->desired_matrix) |
25012 | 836 { |
35609
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
837 /* Rows in desired matrices always have to be cleared; |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
838 redisplay expects this is the case when it runs, so it |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
839 had better be the case when we adjust matrices between |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
840 redisplays. */ |
25012 | 841 for (i = 0; i < matrix->nrows; ++i) |
842 matrix->rows[i].enabled_p = 0; | |
843 } | |
844 } | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
845 |
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
846 |
25012 | 847 /* Remember last values to be able to optimize frame redraws. */ |
848 matrix->matrix_x = x; | |
849 matrix->matrix_y = y; | |
850 matrix->matrix_w = dim.width; | |
851 matrix->matrix_h = dim.height; | |
852 | |
853 /* Record the top y location and height of W at the time the matrix | |
854 was last adjusted. This is used to optimize redisplay above. */ | |
855 if (w) | |
856 { | |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
857 matrix->window_left_col = WINDOW_LEFT_EDGE_COL (w); |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
858 matrix->window_top_line = WINDOW_TOP_EDGE_LINE (w); |
25012 | 859 matrix->window_height = window_height; |
860 matrix->window_width = window_width; | |
861 matrix->window_vscroll = w->vscroll; | |
862 } | |
863 } | |
864 | |
865 | |
866 /* Reverse the contents of rows in MATRIX between START and END. The | |
867 contents of the row at END - 1 end up at START, END - 2 at START + | |
868 1 etc. This is part of the implementation of rotate_matrix (see | |
869 below). */ | |
314 | 870 |
871 static void | |
25012 | 872 reverse_rows (matrix, start, end) |
873 struct glyph_matrix *matrix; | |
874 int start, end; | |
314 | 875 { |
25012 | 876 int i, j; |
877 | |
878 for (i = start, j = end - 1; i < j; ++i, --j) | |
879 { | |
880 /* Non-ISO HP/UX compiler doesn't like auto struct | |
881 initialization. */ | |
882 struct glyph_row temp; | |
883 temp = matrix->rows[i]; | |
884 matrix->rows[i] = matrix->rows[j]; | |
885 matrix->rows[j] = temp; | |
886 } | |
314 | 887 } |
888 | |
25012 | 889 |
890 /* Rotate the contents of rows in MATRIX in the range FIRST .. LAST - | |
891 1 by BY positions. BY < 0 means rotate left, i.e. towards lower | |
892 indices. (Note: this does not copy glyphs, only glyph pointers in | |
893 row structures are moved around). | |
894 | |
895 The algorithm used for rotating the vector was, I believe, first | |
896 described by Kernighan. See the vector R as consisting of two | |
897 sub-vectors AB, where A has length BY for BY >= 0. The result | |
898 after rotating is then BA. Reverse both sub-vectors to get ArBr | |
899 and reverse the result to get (ArBr)r which is BA. Similar for | |
900 rotating right. */ | |
901 | |
902 void | |
903 rotate_matrix (matrix, first, last, by) | |
904 struct glyph_matrix *matrix; | |
905 int first, last, by; | |
314 | 906 { |
25012 | 907 if (by < 0) |
908 { | |
909 /* Up (rotate left, i.e. towards lower indices). */ | |
910 by = -by; | |
911 reverse_rows (matrix, first, first + by); | |
912 reverse_rows (matrix, first + by, last); | |
913 reverse_rows (matrix, first, last); | |
914 } | |
915 else if (by > 0) | |
314 | 916 { |
25012 | 917 /* Down (rotate right, i.e. towards higher indices). */ |
918 reverse_rows (matrix, last - by, last); | |
919 reverse_rows (matrix, first, last - by); | |
920 reverse_rows (matrix, first, last); | |
314 | 921 } |
25012 | 922 } |
923 | |
924 | |
925 /* Increment buffer positions in glyph rows of MATRIX. Do it for rows | |
926 with indices START <= index < END. Increment positions by DELTA/ | |
927 DELTA_BYTES. */ | |
928 | |
929 void | |
28708
4e2497e6757e
(increment_matrix_positions): Renamed from
Gerd Moellmann <gerd@gnu.org>
parents:
28682
diff
changeset
|
930 increment_matrix_positions (matrix, start, end, delta, delta_bytes) |
25012 | 931 struct glyph_matrix *matrix; |
932 int start, end, delta, delta_bytes; | |
933 { | |
934 /* Check that START and END are reasonable values. */ | |
935 xassert (start >= 0 && start <= matrix->nrows); | |
936 xassert (end >= 0 && end <= matrix->nrows); | |
937 xassert (start <= end); | |
938 | |
939 for (; start < end; ++start) | |
28708
4e2497e6757e
(increment_matrix_positions): Renamed from
Gerd Moellmann <gerd@gnu.org>
parents:
28682
diff
changeset
|
940 increment_row_positions (matrix->rows + start, delta, delta_bytes); |
25012 | 941 } |
942 | |
943 | |
944 /* Enable a range of rows in glyph matrix MATRIX. START and END are | |
945 the row indices of the first and last + 1 row to enable. If | |
946 ENABLED_P is non-zero, enabled_p flags in rows will be set to 1. */ | |
947 | |
948 void | |
949 enable_glyph_matrix_rows (matrix, start, end, enabled_p) | |
950 struct glyph_matrix *matrix; | |
951 int start, end; | |
952 int enabled_p; | |
953 { | |
31932
081edde76197
(adjust_glyph_matrix, enable_glyph_matrix_rows):
Gerd Moellmann <gerd@gnu.org>
parents:
31850
diff
changeset
|
954 xassert (start <= end); |
081edde76197
(adjust_glyph_matrix, enable_glyph_matrix_rows):
Gerd Moellmann <gerd@gnu.org>
parents:
31850
diff
changeset
|
955 xassert (start >= 0 && start < matrix->nrows); |
081edde76197
(adjust_glyph_matrix, enable_glyph_matrix_rows):
Gerd Moellmann <gerd@gnu.org>
parents:
31850
diff
changeset
|
956 xassert (end >= 0 && end <= matrix->nrows); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
957 |
25012 | 958 for (; start < end; ++start) |
959 matrix->rows[start].enabled_p = enabled_p != 0; | |
960 } | |
961 | |
962 | |
963 /* Clear MATRIX. | |
964 | |
965 This empties all rows in MATRIX by setting the enabled_p flag for | |
966 all rows of the matrix to zero. The function prepare_desired_row | |
967 will eventually really clear a row when it sees one with a zero | |
968 enabled_p flag. | |
969 | |
970 Resets update hints to defaults value. The only update hint | |
971 currently present is the flag MATRIX->no_scrolling_p. */ | |
972 | |
973 void | |
974 clear_glyph_matrix (matrix) | |
975 struct glyph_matrix *matrix; | |
976 { | |
977 if (matrix) | |
314 | 978 { |
25012 | 979 enable_glyph_matrix_rows (matrix, 0, matrix->nrows, 0); |
980 matrix->no_scrolling_p = 0; | |
314 | 981 } |
982 } | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
983 |
25012 | 984 |
985 /* Shift part of the glyph matrix MATRIX of window W up or down. | |
986 Increment y-positions in glyph rows between START and END by DY, | |
987 and recompute their visible height. */ | |
988 | |
989 void | |
990 shift_glyph_matrix (w, matrix, start, end, dy) | |
991 struct window *w; | |
992 struct glyph_matrix *matrix; | |
993 int start, end, dy; | |
994 { | |
995 int min_y, max_y; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
996 |
25012 | 997 xassert (start <= end); |
998 xassert (start >= 0 && start < matrix->nrows); | |
999 xassert (end >= 0 && end <= matrix->nrows); | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1000 |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
1001 min_y = WINDOW_HEADER_LINE_HEIGHT (w); |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
1002 max_y = WINDOW_BOX_HEIGHT_NO_MODE_LINE (w); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1003 |
25012 | 1004 for (; start < end; ++start) |
1005 { | |
1006 struct glyph_row *row = &matrix->rows[start]; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1007 |
25012 | 1008 row->y += dy; |
38587
42e75caf68ff
(shift_glyph_matrix, blank_row): Fix computation
Gerd Moellmann <gerd@gnu.org>
parents:
38528
diff
changeset
|
1009 row->visible_height = row->height; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1010 |
25012 | 1011 if (row->y < min_y) |
38587
42e75caf68ff
(shift_glyph_matrix, blank_row): Fix computation
Gerd Moellmann <gerd@gnu.org>
parents:
38528
diff
changeset
|
1012 row->visible_height -= min_y - row->y; |
42e75caf68ff
(shift_glyph_matrix, blank_row): Fix computation
Gerd Moellmann <gerd@gnu.org>
parents:
38528
diff
changeset
|
1013 if (row->y + row->height > max_y) |
42e75caf68ff
(shift_glyph_matrix, blank_row): Fix computation
Gerd Moellmann <gerd@gnu.org>
parents:
38528
diff
changeset
|
1014 row->visible_height -= row->y + row->height - max_y; |
25012 | 1015 } |
1016 } | |
1017 | |
1018 | |
1019 /* Mark all rows in current matrices of frame F as invalid. Marking | |
1020 invalid is done by setting enabled_p to zero for all rows in a | |
1021 current matrix. */ | |
1022 | |
1023 void | |
1024 clear_current_matrices (f) | |
1025 register struct frame *f; | |
1026 { | |
1027 /* Clear frame current matrix, if we have one. */ | |
1028 if (f->current_matrix) | |
1029 clear_glyph_matrix (f->current_matrix); | |
1030 | |
1031 /* Clear the matrix of the menu bar window, if such a window exists. | |
1032 The menu bar window is currently used to display menus on X when | |
1033 no toolkit support is compiled in. */ | |
1034 if (WINDOWP (f->menu_bar_window)) | |
1035 clear_glyph_matrix (XWINDOW (f->menu_bar_window)->current_matrix); | |
1036 | |
25544
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
1037 /* Clear the matrix of the tool-bar window, if any. */ |
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
1038 if (WINDOWP (f->tool_bar_window)) |
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
1039 clear_glyph_matrix (XWINDOW (f->tool_bar_window)->current_matrix); |
25012 | 1040 |
1041 /* Clear current window matrices. */ | |
1042 xassert (WINDOWP (FRAME_ROOT_WINDOW (f))); | |
1043 clear_window_matrices (XWINDOW (FRAME_ROOT_WINDOW (f)), 0); | |
1044 } | |
1045 | |
1046 | |
1047 /* Clear out all display lines of F for a coming redisplay. */ | |
314 | 1048 |
21514 | 1049 void |
25012 | 1050 clear_desired_matrices (f) |
1051 register struct frame *f; | |
314 | 1052 { |
25012 | 1053 if (f->desired_matrix) |
1054 clear_glyph_matrix (f->desired_matrix); | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1055 |
25012 | 1056 if (WINDOWP (f->menu_bar_window)) |
1057 clear_glyph_matrix (XWINDOW (f->menu_bar_window)->desired_matrix); | |
1058 | |
25544
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
1059 if (WINDOWP (f->tool_bar_window)) |
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
1060 clear_glyph_matrix (XWINDOW (f->tool_bar_window)->desired_matrix); |
25012 | 1061 |
1062 /* Do it for window matrices. */ | |
1063 xassert (WINDOWP (FRAME_ROOT_WINDOW (f))); | |
1064 clear_window_matrices (XWINDOW (FRAME_ROOT_WINDOW (f)), 1); | |
1065 } | |
1066 | |
1067 | |
1068 /* Clear matrices in window tree rooted in W. If DESIRED_P is | |
1069 non-zero clear desired matrices, otherwise clear current matrices. */ | |
1070 | |
1071 static void | |
1072 clear_window_matrices (w, desired_p) | |
1073 struct window *w; | |
1074 int desired_p; | |
1075 { | |
1076 while (w) | |
314 | 1077 { |
25012 | 1078 if (!NILP (w->hchild)) |
1079 { | |
1080 xassert (WINDOWP (w->hchild)); | |
1081 clear_window_matrices (XWINDOW (w->hchild), desired_p); | |
1082 } | |
1083 else if (!NILP (w->vchild)) | |
314 | 1084 { |
25012 | 1085 xassert (WINDOWP (w->vchild)); |
1086 clear_window_matrices (XWINDOW (w->vchild), desired_p); | |
1087 } | |
1088 else | |
1089 { | |
1090 if (desired_p) | |
1091 clear_glyph_matrix (w->desired_matrix); | |
1092 else | |
314 | 1093 { |
25012 | 1094 clear_glyph_matrix (w->current_matrix); |
1095 w->window_end_valid = Qnil; | |
314 | 1096 } |
25012 | 1097 } |
1098 | |
1099 w = NILP (w->next) ? 0 : XWINDOW (w->next); | |
1100 } | |
1101 } | |
1102 | |
1103 | |
1104 | |
1105 /*********************************************************************** | |
1106 Glyph Rows | |
1107 | |
1108 See dispextern.h for an overall explanation of glyph rows. | |
1109 ***********************************************************************/ | |
1110 | |
1111 /* Clear glyph row ROW. Do it in a way that makes it robust against | |
1112 changes in the glyph_row structure, i.e. addition or removal of | |
1113 structure members. */ | |
1114 | |
33527
c4c7abc48752
(null_row): New gloval static variable.
Kenichi Handa <handa@m17n.org>
parents:
33101
diff
changeset
|
1115 static struct glyph_row null_row; |
c4c7abc48752
(null_row): New gloval static variable.
Kenichi Handa <handa@m17n.org>
parents:
33101
diff
changeset
|
1116 |
25012 | 1117 void |
1118 clear_glyph_row (row) | |
1119 struct glyph_row *row; | |
1120 { | |
1121 struct glyph *p[1 + LAST_AREA]; | |
1122 | |
1123 /* Save pointers. */ | |
1124 p[LEFT_MARGIN_AREA] = row->glyphs[LEFT_MARGIN_AREA]; | |
1125 p[TEXT_AREA] = row->glyphs[TEXT_AREA]; | |
1126 p[RIGHT_MARGIN_AREA] = row->glyphs[RIGHT_MARGIN_AREA]; | |
1127 p[LAST_AREA] = row->glyphs[LAST_AREA]; | |
1128 | |
1129 /* Clear. */ | |
1130 *row = null_row; | |
1131 | |
1132 /* Restore pointers. */ | |
1133 row->glyphs[LEFT_MARGIN_AREA] = p[LEFT_MARGIN_AREA]; | |
1134 row->glyphs[TEXT_AREA] = p[TEXT_AREA]; | |
1135 row->glyphs[RIGHT_MARGIN_AREA] = p[RIGHT_MARGIN_AREA]; | |
1136 row->glyphs[LAST_AREA] = p[LAST_AREA]; | |
30041
b20d72b7aa4b
(clear_glyph_row): Add debug code in #if 0.
Gerd Moellmann <gerd@gnu.org>
parents:
29980
diff
changeset
|
1137 |
b20d72b7aa4b
(clear_glyph_row): Add debug code in #if 0.
Gerd Moellmann <gerd@gnu.org>
parents:
29980
diff
changeset
|
1138 #if 0 /* At some point, some bit-fields of struct glyph were not set, |
b20d72b7aa4b
(clear_glyph_row): Add debug code in #if 0.
Gerd Moellmann <gerd@gnu.org>
parents:
29980
diff
changeset
|
1139 which made glyphs unequal when compared with GLYPH_EQUAL_P. |
b20d72b7aa4b
(clear_glyph_row): Add debug code in #if 0.
Gerd Moellmann <gerd@gnu.org>
parents:
29980
diff
changeset
|
1140 Redisplay outputs such glyphs, and flickering effects were |
b20d72b7aa4b
(clear_glyph_row): Add debug code in #if 0.
Gerd Moellmann <gerd@gnu.org>
parents:
29980
diff
changeset
|
1141 the result. This also depended on the contents of memory |
b20d72b7aa4b
(clear_glyph_row): Add debug code in #if 0.
Gerd Moellmann <gerd@gnu.org>
parents:
29980
diff
changeset
|
1142 returned by xmalloc. If flickering happens again, activate |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
1143 the code below. If the flickering is gone with that, chances |
30041
b20d72b7aa4b
(clear_glyph_row): Add debug code in #if 0.
Gerd Moellmann <gerd@gnu.org>
parents:
29980
diff
changeset
|
1144 are that the flickering has the same reason as here. */ |
b20d72b7aa4b
(clear_glyph_row): Add debug code in #if 0.
Gerd Moellmann <gerd@gnu.org>
parents:
29980
diff
changeset
|
1145 bzero (p[0], (char *) p[LAST_AREA] - (char *) p[0]); |
b20d72b7aa4b
(clear_glyph_row): Add debug code in #if 0.
Gerd Moellmann <gerd@gnu.org>
parents:
29980
diff
changeset
|
1146 #endif |
25012 | 1147 } |
1148 | |
1149 | |
1150 /* Make ROW an empty, enabled row of canonical character height, | |
1151 in window W starting at y-position Y. */ | |
1152 | |
1153 void | |
1154 blank_row (w, row, y) | |
1155 struct window *w; | |
1156 struct glyph_row *row; | |
1157 int y; | |
1158 { | |
1159 int min_y, max_y; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1160 |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
1161 min_y = WINDOW_HEADER_LINE_HEIGHT (w); |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
1162 max_y = WINDOW_BOX_HEIGHT_NO_MODE_LINE (w); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1163 |
25012 | 1164 clear_glyph_row (row); |
1165 row->y = y; | |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
1166 row->ascent = row->phys_ascent = 0; |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
1167 row->height = row->phys_height = FRAME_LINE_HEIGHT (XFRAME (w->frame)); |
38587
42e75caf68ff
(shift_glyph_matrix, blank_row): Fix computation
Gerd Moellmann <gerd@gnu.org>
parents:
38528
diff
changeset
|
1168 row->visible_height = row->height; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1169 |
25012 | 1170 if (row->y < min_y) |
38587
42e75caf68ff
(shift_glyph_matrix, blank_row): Fix computation
Gerd Moellmann <gerd@gnu.org>
parents:
38528
diff
changeset
|
1171 row->visible_height -= min_y - row->y; |
42e75caf68ff
(shift_glyph_matrix, blank_row): Fix computation
Gerd Moellmann <gerd@gnu.org>
parents:
38528
diff
changeset
|
1172 if (row->y + row->height > max_y) |
42e75caf68ff
(shift_glyph_matrix, blank_row): Fix computation
Gerd Moellmann <gerd@gnu.org>
parents:
38528
diff
changeset
|
1173 row->visible_height -= row->y + row->height - max_y; |
25012 | 1174 |
1175 row->enabled_p = 1; | |
1176 } | |
1177 | |
1178 | |
1179 /* Increment buffer positions in glyph row ROW. DELTA and DELTA_BYTES | |
1180 are the amounts by which to change positions. Note that the first | |
1181 glyph of the text area of a row can have a buffer position even if | |
1182 the used count of the text area is zero. Such rows display line | |
1183 ends. */ | |
1184 | |
1185 void | |
28708
4e2497e6757e
(increment_matrix_positions): Renamed from
Gerd Moellmann <gerd@gnu.org>
parents:
28682
diff
changeset
|
1186 increment_row_positions (row, delta, delta_bytes) |
25012 | 1187 struct glyph_row *row; |
1188 int delta, delta_bytes; | |
1189 { | |
1190 int area, i; | |
1191 | |
1192 /* Increment start and end positions. */ | |
1193 MATRIX_ROW_START_CHARPOS (row) += delta; | |
1194 MATRIX_ROW_START_BYTEPOS (row) += delta_bytes; | |
1195 MATRIX_ROW_END_CHARPOS (row) += delta; | |
1196 MATRIX_ROW_END_BYTEPOS (row) += delta_bytes; | |
1197 | |
65003
74ab28cf1192
(increment_row_positions): Skip non-enabled rows.
Kim F. Storm <storm@cua.dk>
parents:
64776
diff
changeset
|
1198 if (!row->enabled_p) |
74ab28cf1192
(increment_row_positions): Skip non-enabled rows.
Kim F. Storm <storm@cua.dk>
parents:
64776
diff
changeset
|
1199 return; |
74ab28cf1192
(increment_row_positions): Skip non-enabled rows.
Kim F. Storm <storm@cua.dk>
parents:
64776
diff
changeset
|
1200 |
25012 | 1201 /* Increment positions in glyphs. */ |
1202 for (area = 0; area < LAST_AREA; ++area) | |
1203 for (i = 0; i < row->used[area]; ++i) | |
1204 if (BUFFERP (row->glyphs[area][i].object) | |
1205 && row->glyphs[area][i].charpos > 0) | |
1206 row->glyphs[area][i].charpos += delta; | |
1207 | |
1208 /* Capture the case of rows displaying a line end. */ | |
1209 if (row->used[TEXT_AREA] == 0 | |
1210 && MATRIX_ROW_DISPLAYS_TEXT_P (row)) | |
1211 row->glyphs[TEXT_AREA]->charpos += delta; | |
1212 } | |
1213 | |
1214 | |
29336
5ccfe8a1638f
(find_glyph_row_slice, swap_glyphs_in_rows): Put in #if 0.
Gerd Moellmann <gerd@gnu.org>
parents:
28708
diff
changeset
|
1215 #if 0 |
25012 | 1216 /* Swap glyphs between two glyph rows A and B. This exchanges glyph |
1217 contents, i.e. glyph structure contents are exchanged between A and | |
1218 B without changing glyph pointers in A and B. */ | |
1219 | |
1220 static void | |
1221 swap_glyphs_in_rows (a, b) | |
1222 struct glyph_row *a, *b; | |
1223 { | |
1224 int area; | |
1225 | |
1226 for (area = 0; area < LAST_AREA; ++area) | |
1227 { | |
1228 /* Number of glyphs to swap. */ | |
1229 int max_used = max (a->used[area], b->used[area]); | |
1230 | |
1231 /* Start of glyphs in area of row A. */ | |
1232 struct glyph *glyph_a = a->glyphs[area]; | |
1233 | |
1234 /* End + 1 of glyphs in area of row A. */ | |
1235 struct glyph *glyph_a_end = a->glyphs[max_used]; | |
1236 | |
1237 /* Start of glyphs in area of row B. */ | |
1238 struct glyph *glyph_b = b->glyphs[area]; | |
1239 | |
1240 while (glyph_a < glyph_a_end) | |
1241 { | |
1242 /* Non-ISO HP/UX compiler doesn't like auto struct | |
1243 initialization. */ | |
1244 struct glyph temp; | |
1245 temp = *glyph_a; | |
1246 *glyph_a = *glyph_b; | |
1247 *glyph_b = temp; | |
1248 ++glyph_a; | |
1249 ++glyph_b; | |
314 | 1250 } |
1251 } | |
1252 } | |
25012 | 1253 |
29336
5ccfe8a1638f
(find_glyph_row_slice, swap_glyphs_in_rows): Put in #if 0.
Gerd Moellmann <gerd@gnu.org>
parents:
28708
diff
changeset
|
1254 #endif /* 0 */ |
25012 | 1255 |
1256 /* Exchange pointers to glyph memory between glyph rows A and B. */ | |
1257 | |
1258 static INLINE void | |
1259 swap_glyph_pointers (a, b) | |
1260 struct glyph_row *a, *b; | |
1261 { | |
1262 int i; | |
1263 for (i = 0; i < LAST_AREA + 1; ++i) | |
1264 { | |
1265 struct glyph *temp = a->glyphs[i]; | |
1266 a->glyphs[i] = b->glyphs[i]; | |
1267 b->glyphs[i] = temp; | |
1268 } | |
1269 } | |
1270 | |
1271 | |
1272 /* Copy glyph row structure FROM to glyph row structure TO, except | |
1273 that glyph pointers in the structures are left unchanged. */ | |
1274 | |
1275 INLINE void | |
1276 copy_row_except_pointers (to, from) | |
1277 struct glyph_row *to, *from; | |
1278 { | |
1279 struct glyph *pointers[1 + LAST_AREA]; | |
1280 | |
1281 /* Save glyph pointers of TO. */ | |
1282 bcopy (to->glyphs, pointers, sizeof to->glyphs); | |
1283 | |
1284 /* Do a structure assignment. */ | |
1285 *to = *from; | |
1286 | |
1287 /* Restore original pointers of TO. */ | |
1288 bcopy (pointers, to->glyphs, sizeof to->glyphs); | |
1289 } | |
1290 | |
1291 | |
1292 /* Copy contents of glyph row FROM to glyph row TO. Glyph pointers in | |
1293 TO and FROM are left unchanged. Glyph contents are copied from the | |
1294 glyph memory of FROM to the glyph memory of TO. Increment buffer | |
1295 positions in row TO by DELTA/ DELTA_BYTES. */ | |
1296 | |
1297 void | |
1298 copy_glyph_row_contents (to, from, delta, delta_bytes) | |
1299 struct glyph_row *to, *from; | |
1300 int delta, delta_bytes; | |
1301 { | |
1302 int area; | |
1303 | |
1304 /* This is like a structure assignment TO = FROM, except that | |
1305 glyph pointers in the rows are left unchanged. */ | |
1306 copy_row_except_pointers (to, from); | |
1307 | |
1308 /* Copy glyphs from FROM to TO. */ | |
1309 for (area = 0; area < LAST_AREA; ++area) | |
1310 if (from->used[area]) | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1311 bcopy (from->glyphs[area], to->glyphs[area], |
25012 | 1312 from->used[area] * sizeof (struct glyph)); |
1313 | |
1314 /* Increment buffer positions in TO by DELTA. */ | |
28708
4e2497e6757e
(increment_matrix_positions): Renamed from
Gerd Moellmann <gerd@gnu.org>
parents:
28682
diff
changeset
|
1315 increment_row_positions (to, delta, delta_bytes); |
25012 | 1316 } |
1317 | |
1318 | |
1319 /* Assign glyph row FROM to glyph row TO. This works like a structure | |
1320 assignment TO = FROM, except that glyph pointers are not copied but | |
1321 exchanged between TO and FROM. Pointers must be exchanged to avoid | |
1322 a memory leak. */ | |
1323 | |
1324 static INLINE void | |
1325 assign_row (to, from) | |
1326 struct glyph_row *to, *from; | |
1327 { | |
1328 swap_glyph_pointers (to, from); | |
1329 copy_row_except_pointers (to, from); | |
1330 } | |
1331 | |
1332 | |
1333 /* Test whether the glyph memory of the glyph row WINDOW_ROW, which is | |
1334 a row in a window matrix, is a slice of the glyph memory of the | |
1335 glyph row FRAME_ROW which is a row in a frame glyph matrix. Value | |
1336 is non-zero if the glyph memory of WINDOW_ROW is part of the glyph | |
1337 memory of FRAME_ROW. */ | |
1338 | |
34893
779bd3fa820e
Use #if GLYPH_DEBUG instead of #ifdef GLYPH_DEBUG.
Gerd Moellmann <gerd@gnu.org>
parents:
34866
diff
changeset
|
1339 #if GLYPH_DEBUG |
30323
4cd1b8fe118c
(direct_output_for_insert): Remove confusing
Gerd Moellmann <gerd@gnu.org>
parents:
30307
diff
changeset
|
1340 |
25012 | 1341 static int |
1342 glyph_row_slice_p (window_row, frame_row) | |
1343 struct glyph_row *window_row, *frame_row; | |
1344 { | |
1345 struct glyph *window_glyph_start = window_row->glyphs[0]; | |
1346 struct glyph *frame_glyph_start = frame_row->glyphs[0]; | |
1347 struct glyph *frame_glyph_end = frame_row->glyphs[LAST_AREA]; | |
1348 | |
1349 return (frame_glyph_start <= window_glyph_start | |
1350 && window_glyph_start < frame_glyph_end); | |
1351 } | |
1352 | |
30323
4cd1b8fe118c
(direct_output_for_insert): Remove confusing
Gerd Moellmann <gerd@gnu.org>
parents:
30307
diff
changeset
|
1353 #endif /* GLYPH_DEBUG */ |
25012 | 1354 |
29336
5ccfe8a1638f
(find_glyph_row_slice, swap_glyphs_in_rows): Put in #if 0.
Gerd Moellmann <gerd@gnu.org>
parents:
28708
diff
changeset
|
1355 #if 0 |
5ccfe8a1638f
(find_glyph_row_slice, swap_glyphs_in_rows): Put in #if 0.
Gerd Moellmann <gerd@gnu.org>
parents:
28708
diff
changeset
|
1356 |
25012 | 1357 /* Find the row in the window glyph matrix WINDOW_MATRIX being a slice |
1358 of ROW in the frame matrix FRAME_MATRIX. Value is null if no row | |
1359 in WINDOW_MATRIX is found satisfying the condition. */ | |
1360 | |
1361 static struct glyph_row * | |
1362 find_glyph_row_slice (window_matrix, frame_matrix, row) | |
1363 struct glyph_matrix *window_matrix, *frame_matrix; | |
1364 int row; | |
1365 { | |
1366 int i; | |
1367 | |
1368 xassert (row >= 0 && row < frame_matrix->nrows); | |
1369 | |
1370 for (i = 0; i < window_matrix->nrows; ++i) | |
1371 if (glyph_row_slice_p (window_matrix->rows + i, | |
1372 frame_matrix->rows + row)) | |
1373 break; | |
1374 | |
1375 return i < window_matrix->nrows ? window_matrix->rows + i : 0; | |
1376 } | |
1377 | |
29336
5ccfe8a1638f
(find_glyph_row_slice, swap_glyphs_in_rows): Put in #if 0.
Gerd Moellmann <gerd@gnu.org>
parents:
28708
diff
changeset
|
1378 #endif /* 0 */ |
25012 | 1379 |
1380 /* Prepare ROW for display. Desired rows are cleared lazily, | |
1381 i.e. they are only marked as to be cleared by setting their | |
1382 enabled_p flag to zero. When a row is to be displayed, a prior | |
1383 call to this function really clears it. */ | |
1384 | |
1385 void | |
1386 prepare_desired_row (row) | |
1387 struct glyph_row *row; | |
1388 { | |
1389 if (!row->enabled_p) | |
1390 { | |
1391 clear_glyph_row (row); | |
1392 row->enabled_p = 1; | |
1393 } | |
1394 } | |
1395 | |
1396 | |
1397 /* Return a hash code for glyph row ROW. */ | |
1398 | |
1399 int | |
1400 line_hash_code (row) | |
1401 struct glyph_row *row; | |
1402 { | |
1403 int hash = 0; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1404 |
25012 | 1405 if (row->enabled_p) |
1406 { | |
40075
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
1407 struct glyph *glyph = row->glyphs[TEXT_AREA]; |
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
1408 struct glyph *end = glyph + row->used[TEXT_AREA]; |
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
1409 |
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
1410 while (glyph < end) |
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
1411 { |
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
1412 int c = glyph->u.ch; |
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
1413 int face_id = glyph->face_id; |
82990
2ecd1f669db9
Fixed X support, preliminary support for X-tty combo sessions.
Karoly Lorentey <lorentey@elte.hu>
parents:
82989
diff
changeset
|
1414 if (FRAME_MUST_WRITE_SPACES (SELECTED_FRAME ())) /* XXX Is SELECTED_FRAME OK here? */ |
40075
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
1415 c -= SPACEGLYPH; |
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
1416 hash = (((hash << 4) + (hash >> 24)) & 0x0fffffff) + c; |
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
1417 hash = (((hash << 4) + (hash >> 24)) & 0x0fffffff) + face_id; |
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
1418 ++glyph; |
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
1419 } |
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
1420 |
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
1421 if (hash == 0) |
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
1422 hash = 1; |
25012 | 1423 } |
1424 | |
1425 return hash; | |
1426 } | |
1427 | |
1428 | |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
1429 /* Return the cost of drawing line VPOS in MATRIX. The cost equals |
25012 | 1430 the number of characters in the line. If must_write_spaces is |
1431 zero, leading and trailing spaces are ignored. */ | |
1432 | |
1433 static unsigned int | |
1434 line_draw_cost (matrix, vpos) | |
1435 struct glyph_matrix *matrix; | |
1436 int vpos; | |
1437 { | |
1438 struct glyph_row *row = matrix->rows + vpos; | |
1439 struct glyph *beg = row->glyphs[TEXT_AREA]; | |
1440 struct glyph *end = beg + row->used[TEXT_AREA]; | |
1441 int len; | |
1442 Lisp_Object *glyph_table_base = GLYPH_TABLE_BASE; | |
1443 int glyph_table_len = GLYPH_TABLE_LENGTH; | |
1444 | |
1445 /* Ignore trailing and leading spaces if we can. */ | |
82990
2ecd1f669db9
Fixed X support, preliminary support for X-tty combo sessions.
Karoly Lorentey <lorentey@elte.hu>
parents:
82989
diff
changeset
|
1446 if (!FRAME_MUST_WRITE_SPACES (SELECTED_FRAME ())) /* XXX Is SELECTED_FRAME OK here? */ |
25012 | 1447 { |
1448 /* Skip from the end over trailing spaces. */ | |
34203
e55480843a8e
(scrolling_window): Fix code inserting runs in list of all runs.
Gerd Moellmann <gerd@gnu.org>
parents:
33763
diff
changeset
|
1449 while (end > beg && CHAR_GLYPH_SPACE_P (*(end - 1))) |
25012 | 1450 --end; |
1451 | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1452 /* All blank line. */ |
25012 | 1453 if (end == beg) |
1454 return 0; | |
1455 | |
1456 /* Skip over leading spaces. */ | |
1457 while (CHAR_GLYPH_SPACE_P (*beg)) | |
1458 ++beg; | |
1459 } | |
1460 | |
1461 /* If we don't have a glyph-table, each glyph is one character, | |
1462 so return the number of glyphs. */ | |
1463 if (glyph_table_base == 0) | |
1464 len = end - beg; | |
1465 else | |
1466 { | |
1467 /* Otherwise, scan the glyphs and accumulate their total length | |
1468 in LEN. */ | |
1469 len = 0; | |
1470 while (beg < end) | |
1471 { | |
92276
1dc7b04a4d95
(line_draw_cost): Adapt to new glyph type.
Kim F. Storm <storm@cua.dk>
parents:
91367
diff
changeset
|
1472 GLYPH g; |
1dc7b04a4d95
(line_draw_cost): Adapt to new glyph type.
Kim F. Storm <storm@cua.dk>
parents:
91367
diff
changeset
|
1473 |
1dc7b04a4d95
(line_draw_cost): Adapt to new glyph type.
Kim F. Storm <storm@cua.dk>
parents:
91367
diff
changeset
|
1474 SET_GLYPH_FROM_CHAR_GLYPH (g, *beg); |
1dc7b04a4d95
(line_draw_cost): Adapt to new glyph type.
Kim F. Storm <storm@cua.dk>
parents:
91367
diff
changeset
|
1475 |
92387
41d029d73eac
(line_draw_cost): Fix invalid glyph check.
Kim F. Storm <storm@cua.dk>
parents:
92276
diff
changeset
|
1476 if (GLYPH_INVALID_P (g) |
26998
02e902f732d1
(line_hash_code) (direct_output_for_insert): Adjusted
Kenichi Handa <handa@m17n.org>
parents:
26902
diff
changeset
|
1477 || GLYPH_SIMPLE_P (glyph_table_base, glyph_table_len, g)) |
25012 | 1478 len += 1; |
1479 else | |
1480 len += GLYPH_LENGTH (glyph_table_base, g); | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1481 |
25012 | 1482 ++beg; |
1483 } | |
1484 } | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1485 |
25012 | 1486 return len; |
1487 } | |
1488 | |
1489 | |
1490 /* Test two glyph rows A and B for equality. Value is non-zero if A | |
1491 and B have equal contents. W is the window to which the glyphs | |
1492 rows A and B belong. It is needed here to test for partial row | |
30152
f6270e5282da
(direct_output_forward_char): Give up if currently
Gerd Moellmann <gerd@gnu.org>
parents:
30041
diff
changeset
|
1493 visibility. MOUSE_FACE_P non-zero means compare the mouse_face_p |
f6270e5282da
(direct_output_forward_char): Give up if currently
Gerd Moellmann <gerd@gnu.org>
parents:
30041
diff
changeset
|
1494 flags of A and B, too. */ |
25012 | 1495 |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1496 static INLINE int |
30152
f6270e5282da
(direct_output_forward_char): Give up if currently
Gerd Moellmann <gerd@gnu.org>
parents:
30041
diff
changeset
|
1497 row_equal_p (w, a, b, mouse_face_p) |
25012 | 1498 struct window *w; |
1499 struct glyph_row *a, *b; | |
30152
f6270e5282da
(direct_output_forward_char): Give up if currently
Gerd Moellmann <gerd@gnu.org>
parents:
30041
diff
changeset
|
1500 int mouse_face_p; |
25012 | 1501 { |
1502 if (a == b) | |
1503 return 1; | |
1504 else if (a->hash != b->hash) | |
1505 return 0; | |
1506 else | |
1507 { | |
1508 struct glyph *a_glyph, *b_glyph, *a_end; | |
1509 int area; | |
1510 | |
30152
f6270e5282da
(direct_output_forward_char): Give up if currently
Gerd Moellmann <gerd@gnu.org>
parents:
30041
diff
changeset
|
1511 if (mouse_face_p && a->mouse_face_p != b->mouse_face_p) |
f6270e5282da
(direct_output_forward_char): Give up if currently
Gerd Moellmann <gerd@gnu.org>
parents:
30041
diff
changeset
|
1512 return 0; |
f6270e5282da
(direct_output_forward_char): Give up if currently
Gerd Moellmann <gerd@gnu.org>
parents:
30041
diff
changeset
|
1513 |
25012 | 1514 /* Compare glyphs. */ |
1515 for (area = LEFT_MARGIN_AREA; area < LAST_AREA; ++area) | |
1516 { | |
1517 if (a->used[area] != b->used[area]) | |
1518 return 0; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1519 |
25012 | 1520 a_glyph = a->glyphs[area]; |
1521 a_end = a_glyph + a->used[area]; | |
1522 b_glyph = b->glyphs[area]; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1523 |
25012 | 1524 while (a_glyph < a_end |
1525 && GLYPH_EQUAL_P (a_glyph, b_glyph)) | |
1526 ++a_glyph, ++b_glyph; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1527 |
25012 | 1528 if (a_glyph != a_end) |
1529 return 0; | |
1530 } | |
1531 | |
53605
7dfd96e25ec6
(row_equal_p, update_window_line): Compare fringe bitmaps
Kim F. Storm <storm@cua.dk>
parents:
53514
diff
changeset
|
1532 if (a->fill_line_p != b->fill_line_p |
7dfd96e25ec6
(row_equal_p, update_window_line): Compare fringe bitmaps
Kim F. Storm <storm@cua.dk>
parents:
53514
diff
changeset
|
1533 || a->cursor_in_fringe_p != b->cursor_in_fringe_p |
7dfd96e25ec6
(row_equal_p, update_window_line): Compare fringe bitmaps
Kim F. Storm <storm@cua.dk>
parents:
53514
diff
changeset
|
1534 || a->left_fringe_bitmap != b->left_fringe_bitmap |
53881
ccacbf7f76b2
(row_equal_p): Compare fringe bitmap faces and overlay
Kim F. Storm <storm@cua.dk>
parents:
53612
diff
changeset
|
1535 || a->left_fringe_face_id != b->left_fringe_face_id |
53605
7dfd96e25ec6
(row_equal_p, update_window_line): Compare fringe bitmaps
Kim F. Storm <storm@cua.dk>
parents:
53514
diff
changeset
|
1536 || a->right_fringe_bitmap != b->right_fringe_bitmap |
53881
ccacbf7f76b2
(row_equal_p): Compare fringe bitmap faces and overlay
Kim F. Storm <storm@cua.dk>
parents:
53612
diff
changeset
|
1537 || a->right_fringe_face_id != b->right_fringe_face_id |
61633
a76a30ee7c89
(row_equal_p, update_window_line, scrolling_window):
Kim F. Storm <storm@cua.dk>
parents:
61416
diff
changeset
|
1538 || a->overlay_arrow_bitmap != b->overlay_arrow_bitmap |
53605
7dfd96e25ec6
(row_equal_p, update_window_line): Compare fringe bitmaps
Kim F. Storm <storm@cua.dk>
parents:
53514
diff
changeset
|
1539 || a->exact_window_width_line_p != b->exact_window_width_line_p |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
1540 || a->overlapped_p != b->overlapped_p |
25012 | 1541 || (MATRIX_ROW_CONTINUATION_LINE_P (a) |
1542 != MATRIX_ROW_CONTINUATION_LINE_P (b)) | |
1543 /* Different partially visible characters on left margin. */ | |
1544 || a->x != b->x | |
1545 /* Different height. */ | |
1546 || a->ascent != b->ascent | |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
1547 || a->phys_ascent != b->phys_ascent |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
1548 || a->phys_height != b->phys_height |
25012 | 1549 || a->visible_height != b->visible_height) |
1550 return 0; | |
1551 } | |
1552 | |
1553 return 1; | |
1554 } | |
1555 | |
1556 | |
314 | 1557 |
25012 | 1558 /*********************************************************************** |
1559 Glyph Pool | |
1560 | |
1561 See dispextern.h for an overall explanation of glyph pools. | |
1562 ***********************************************************************/ | |
1563 | |
1564 /* Allocate a glyph_pool structure. The structure returned is | |
1565 initialized with zeros. The global variable glyph_pool_count is | |
1566 incremented for each pool allocated. */ | |
1567 | |
1568 static struct glyph_pool * | |
1569 new_glyph_pool () | |
1570 { | |
1571 struct glyph_pool *result; | |
1572 | |
1573 /* Allocate a new glyph_pool and clear it. */ | |
1574 result = (struct glyph_pool *) xmalloc (sizeof *result); | |
1575 bzero (result, sizeof *result); | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1576 |
25012 | 1577 /* For memory leak and double deletion checking. */ |
1578 ++glyph_pool_count; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1579 |
25012 | 1580 return result; |
1581 } | |
1582 | |
1583 | |
1584 /* Free a glyph_pool structure POOL. The function may be called with | |
1585 a null POOL pointer. The global variable glyph_pool_count is | |
1586 decremented with every pool structure freed. If this count gets | |
1587 negative, more structures were freed than allocated, i.e. one | |
1588 structure must have been freed more than once or a bogus pointer | |
1589 was passed to free_glyph_pool. */ | |
1590 | |
1591 static void | |
1592 free_glyph_pool (pool) | |
1593 struct glyph_pool *pool; | |
1594 { | |
1595 if (pool) | |
1596 { | |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
1597 /* More freed than allocated? */ |
25012 | 1598 --glyph_pool_count; |
1599 xassert (glyph_pool_count >= 0); | |
1600 | |
1601 xfree (pool->glyphs); | |
1602 xfree (pool); | |
1603 } | |
1604 } | |
1605 | |
1606 | |
1607 /* Enlarge a glyph pool POOL. MATRIX_DIM gives the number of rows and | |
1608 columns we need. This function never shrinks a pool. The only | |
1609 case in which this would make sense, would be when a frame's size | |
1610 is changed from a large value to a smaller one. But, if someone | |
1611 does it once, we can expect that he will do it again. | |
1612 | |
1613 Value is non-zero if the pool changed in a way which makes | |
1614 re-adjusting window glyph matrices necessary. */ | |
1615 | |
1616 static int | |
1617 realloc_glyph_pool (pool, matrix_dim) | |
1618 struct glyph_pool *pool; | |
1619 struct dim matrix_dim; | |
1620 { | |
1621 int needed; | |
1622 int changed_p; | |
1623 | |
1624 changed_p = (pool->glyphs == 0 | |
1625 || matrix_dim.height != pool->nrows | |
1626 || matrix_dim.width != pool->ncolumns); | |
1627 | |
1628 /* Enlarge the glyph pool. */ | |
1629 needed = matrix_dim.width * matrix_dim.height; | |
1630 if (needed > pool->nglyphs) | |
1631 { | |
1632 int size = needed * sizeof (struct glyph); | |
1633 | |
1634 if (pool->glyphs) | |
1635 pool->glyphs = (struct glyph *) xrealloc (pool->glyphs, size); | |
1636 else | |
1637 { | |
1638 pool->glyphs = (struct glyph *) xmalloc (size); | |
1639 bzero (pool->glyphs, size); | |
1640 } | |
1641 | |
1642 pool->nglyphs = needed; | |
1643 } | |
1644 | |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
1645 /* Remember the number of rows and columns because (a) we use them |
25012 | 1646 to do sanity checks, and (b) the number of columns determines |
1647 where rows in the frame matrix start---this must be available to | |
1648 determine pointers to rows of window sub-matrices. */ | |
1649 pool->nrows = matrix_dim.height; | |
1650 pool->ncolumns = matrix_dim.width; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1651 |
25012 | 1652 return changed_p; |
1653 } | |
1654 | |
1655 | |
1656 | |
1657 /*********************************************************************** | |
1658 Debug Code | |
1659 ***********************************************************************/ | |
1660 | |
1661 #if GLYPH_DEBUG | |
1662 | |
27855
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1663 |
53226
dd3018b4785b
Implemented multiple tty support.
Karoly Lorentey <lorentey@elte.hu>
parents:
53225
diff
changeset
|
1664 /* Flush standard output. This is sometimes useful to call from the debugger. |
dd3018b4785b
Implemented multiple tty support.
Karoly Lorentey <lorentey@elte.hu>
parents:
53225
diff
changeset
|
1665 XXX Maybe this should be changed to flush the current terminal instead of |
dd3018b4785b
Implemented multiple tty support.
Karoly Lorentey <lorentey@elte.hu>
parents:
53225
diff
changeset
|
1666 stdout. |
dd3018b4785b
Implemented multiple tty support.
Karoly Lorentey <lorentey@elte.hu>
parents:
53225
diff
changeset
|
1667 */ |
27855
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1668 |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1669 void |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1670 flush_stdout () |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1671 { |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1672 fflush (stdout); |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1673 } |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1674 |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1675 |
25012 | 1676 /* Check that no glyph pointers have been lost in MATRIX. If a |
1677 pointer has been lost, e.g. by using a structure assignment between | |
1678 rows, at least one pointer must occur more than once in the rows of | |
1679 MATRIX. */ | |
1680 | |
1681 void | |
1682 check_matrix_pointer_lossage (matrix) | |
1683 struct glyph_matrix *matrix; | |
1684 { | |
1685 int i, j; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1686 |
25012 | 1687 for (i = 0; i < matrix->nrows; ++i) |
1688 for (j = 0; j < matrix->nrows; ++j) | |
1689 xassert (i == j | |
1690 || (matrix->rows[i].glyphs[TEXT_AREA] | |
1691 != matrix->rows[j].glyphs[TEXT_AREA])); | |
1692 } | |
1693 | |
1694 | |
1695 /* Get a pointer to glyph row ROW in MATRIX, with bounds checks. */ | |
1696 | |
1697 struct glyph_row * | |
1698 matrix_row (matrix, row) | |
1699 struct glyph_matrix *matrix; | |
1700 int row; | |
1701 { | |
1702 xassert (matrix && matrix->rows); | |
1703 xassert (row >= 0 && row < matrix->nrows); | |
1704 | |
1705 /* That's really too slow for normal testing because this function | |
1706 is called almost everywhere. Although---it's still astonishingly | |
1707 fast, so it is valuable to have for debugging purposes. */ | |
314 | 1708 #if 0 |
25012 | 1709 check_matrix_pointer_lossage (matrix); |
1710 #endif | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1711 |
25012 | 1712 return matrix->rows + row; |
1713 } | |
1714 | |
1715 | |
1716 #if 0 /* This function makes invalid assumptions when text is | |
1717 partially invisible. But it might come handy for debugging | |
1718 nevertheless. */ | |
1719 | |
1720 /* Check invariants that must hold for an up to date current matrix of | |
1721 window W. */ | |
1722 | |
1723 static void | |
1724 check_matrix_invariants (w) | |
314 | 1725 struct window *w; |
1726 { | |
25012 | 1727 struct glyph_matrix *matrix = w->current_matrix; |
1728 int yb = window_text_bottom_y (w); | |
1729 struct glyph_row *row = matrix->rows; | |
1730 struct glyph_row *last_text_row = NULL; | |
1731 struct buffer *saved = current_buffer; | |
1732 struct buffer *buffer = XBUFFER (w->buffer); | |
1733 int c; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1734 |
25012 | 1735 /* This can sometimes happen for a fresh window. */ |
1736 if (matrix->nrows < 2) | |
1737 return; | |
1738 | |
1739 set_buffer_temp (buffer); | |
1740 | |
1741 /* Note: last row is always reserved for the mode line. */ | |
1742 while (MATRIX_ROW_DISPLAYS_TEXT_P (row) | |
1743 && MATRIX_ROW_BOTTOM_Y (row) < yb) | |
1744 { | |
1745 struct glyph_row *next = row + 1; | |
1746 | |
1747 if (MATRIX_ROW_DISPLAYS_TEXT_P (row)) | |
1748 last_text_row = row; | |
1749 | |
1750 /* Check that character and byte positions are in sync. */ | |
1751 xassert (MATRIX_ROW_START_BYTEPOS (row) | |
1752 == CHAR_TO_BYTE (MATRIX_ROW_START_CHARPOS (row))); | |
1753 | |
1754 /* CHAR_TO_BYTE aborts when invoked for a position > Z. We can | |
1755 have such a position temporarily in case of a minibuffer | |
1756 displaying something like `[Sole completion]' at its end. */ | |
1757 if (MATRIX_ROW_END_CHARPOS (row) < BUF_ZV (current_buffer)) | |
1758 xassert (MATRIX_ROW_END_BYTEPOS (row) | |
1759 == CHAR_TO_BYTE (MATRIX_ROW_END_CHARPOS (row))); | |
1760 | |
1761 /* Check that end position of `row' is equal to start position | |
1762 of next row. */ | |
1763 if (next->enabled_p && MATRIX_ROW_DISPLAYS_TEXT_P (next)) | |
1764 { | |
1765 xassert (MATRIX_ROW_END_CHARPOS (row) | |
1766 == MATRIX_ROW_START_CHARPOS (next)); | |
1767 xassert (MATRIX_ROW_END_BYTEPOS (row) | |
1768 == MATRIX_ROW_START_BYTEPOS (next)); | |
1769 } | |
1770 row = next; | |
1771 } | |
1772 | |
1773 xassert (w->current_matrix->nrows == w->desired_matrix->nrows); | |
1774 xassert (w->desired_matrix->rows != NULL); | |
1775 set_buffer_temp (saved); | |
1776 } | |
1777 | |
1778 #endif /* 0 */ | |
1779 | |
1780 #endif /* GLYPH_DEBUG != 0 */ | |
1781 | |
1782 | |
1783 | |
1784 /********************************************************************** | |
1785 Allocating/ Adjusting Glyph Matrices | |
1786 **********************************************************************/ | |
1787 | |
1788 /* Allocate glyph matrices over a window tree for a frame-based | |
1789 redisplay | |
1790 | |
1791 X and Y are column/row within the frame glyph matrix where | |
1792 sub-matrices for the window tree rooted at WINDOW must be | |
73383
015a870c0c9a
(adjust_frame_glyphs_for_frame_redisplay): Remove unused variable ch_dim.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
73318
diff
changeset
|
1793 allocated. DIM_ONLY_P non-zero means that the caller of this |
015a870c0c9a
(adjust_frame_glyphs_for_frame_redisplay): Remove unused variable ch_dim.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
73318
diff
changeset
|
1794 function is only interested in the result matrix dimension, and |
015a870c0c9a
(adjust_frame_glyphs_for_frame_redisplay): Remove unused variable ch_dim.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
73318
diff
changeset
|
1795 matrix adjustments should not be performed. |
25012 | 1796 |
1797 The function returns the total width/height of the sub-matrices of | |
1798 the window tree. If called on a frame root window, the computation | |
1799 will take the mini-buffer window into account. | |
1800 | |
1801 *WINDOW_CHANGE_FLAGS is set to a bit mask with bits | |
1802 | |
1803 NEW_LEAF_MATRIX set if any window in the tree did not have a | |
1804 glyph matrices yet, and | |
1805 | |
1806 CHANGED_LEAF_MATRIX set if the dimension or location of a matrix of | |
1807 any window in the tree will be changed or have been changed (see | |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
1808 DIM_ONLY_P) |
25012 | 1809 |
1810 *WINDOW_CHANGE_FLAGS must be initialized by the caller of this | |
1811 function. | |
1812 | |
1813 Windows are arranged into chains of windows on the same level | |
1814 through the next fields of window structures. Such a level can be | |
1815 either a sequence of horizontally adjacent windows from left to | |
1816 right, or a sequence of vertically adjacent windows from top to | |
1817 bottom. Each window in a horizontal sequence can be either a leaf | |
1818 window or a vertical sequence; a window in a vertical sequence can | |
1819 be either a leaf or a horizontal sequence. All windows in a | |
1820 horizontal sequence have the same height, and all windows in a | |
1821 vertical sequence have the same width. | |
1822 | |
1823 This function uses, for historical reasons, a more general | |
1824 algorithm to determine glyph matrix dimensions that would be | |
1825 necessary. | |
1826 | |
1827 The matrix height of a horizontal sequence is determined by the | |
1828 maximum height of any matrix in the sequence. The matrix width of | |
1829 a horizontal sequence is computed by adding up matrix widths of | |
1830 windows in the sequence. | |
1831 | |
1832 |<------- result width ------->| | |
1833 +---------+----------+---------+ --- | |
1834 | | | | | | |
1835 | | | | | |
1836 +---------+ | | result height | |
1837 | +---------+ | |
1838 | | | | |
1839 +----------+ --- | |
1840 | |
1841 The matrix width of a vertical sequence is the maximum matrix width | |
1842 of any window in the sequence. Its height is computed by adding up | |
1843 matrix heights of windows in the sequence. | |
1844 | |
1845 |<---- result width -->| | |
1846 +---------+ --- | |
1847 | | | | |
1848 | | | | |
1849 +---------+--+ | | |
1850 | | | | |
1851 | | result height | |
1852 | | | |
1853 +------------+---------+ | | |
1854 | | | | |
1855 | | | | |
1856 +------------+---------+ --- */ | |
1857 | |
1858 /* Bit indicating that a new matrix will be allocated or has been | |
1859 allocated. */ | |
1860 | |
1861 #define NEW_LEAF_MATRIX (1 << 0) | |
1862 | |
1863 /* Bit indicating that a matrix will or has changed its location or | |
1864 size. */ | |
1865 | |
1866 #define CHANGED_LEAF_MATRIX (1 << 1) | |
1867 | |
1868 static struct dim | |
39448
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1869 allocate_matrices_for_frame_redisplay (window, x, y, dim_only_p, |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1870 window_change_flags) |
25012 | 1871 Lisp_Object window; |
1872 int x, y; | |
1873 int dim_only_p; | |
1874 int *window_change_flags; | |
1875 { | |
1876 struct frame *f = XFRAME (WINDOW_FRAME (XWINDOW (window))); | |
1877 int x0 = x, y0 = y; | |
1878 int wmax = 0, hmax = 0; | |
1879 struct dim total; | |
1880 struct dim dim; | |
1881 struct window *w; | |
1882 int in_horz_combination_p; | |
1883 | |
1884 /* What combination is WINDOW part of? Compute this once since the | |
1885 result is the same for all windows in the `next' chain. The | |
1886 special case of a root window (parent equal to nil) is treated | |
1887 like a vertical combination because a root window's `next' | |
1888 points to the mini-buffer window, if any, which is arranged | |
1889 vertically below other windows. */ | |
1890 in_horz_combination_p | |
1891 = (!NILP (XWINDOW (window)->parent) | |
1892 && !NILP (XWINDOW (XWINDOW (window)->parent)->hchild)); | |
1893 | |
1894 /* For WINDOW and all windows on the same level. */ | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1895 do |
25012 | 1896 { |
1897 w = XWINDOW (window); | |
1898 | |
1899 /* Get the dimension of the window sub-matrix for W, depending | |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
1900 on whether this is a combination or a leaf window. */ |
25012 | 1901 if (!NILP (w->hchild)) |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1902 dim = allocate_matrices_for_frame_redisplay (w->hchild, x, y, |
25012 | 1903 dim_only_p, |
1904 window_change_flags); | |
1905 else if (!NILP (w->vchild)) | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1906 dim = allocate_matrices_for_frame_redisplay (w->vchild, x, y, |
25012 | 1907 dim_only_p, |
1908 window_change_flags); | |
1909 else | |
1910 { | |
1911 /* If not already done, allocate sub-matrix structures. */ | |
1912 if (w->desired_matrix == NULL) | |
1913 { | |
1914 w->desired_matrix = new_glyph_matrix (f->desired_pool); | |
1915 w->current_matrix = new_glyph_matrix (f->current_pool); | |
1916 *window_change_flags |= NEW_LEAF_MATRIX; | |
1917 } | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1918 |
25012 | 1919 /* Width and height MUST be chosen so that there are no |
1920 holes in the frame matrix. */ | |
39448
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1921 dim.width = required_matrix_width (w); |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1922 dim.height = required_matrix_height (w); |
25012 | 1923 |
1924 /* Will matrix be re-allocated? */ | |
1925 if (x != w->desired_matrix->matrix_x | |
1926 || y != w->desired_matrix->matrix_y | |
1927 || dim.width != w->desired_matrix->matrix_w | |
1928 || dim.height != w->desired_matrix->matrix_h | |
1929 || (margin_glyphs_to_reserve (w, dim.width, | |
56496
069e4841ceb2
(margin_glyphs_to_reserve): Apply ncols_scale_factor.
Kim F. Storm <storm@cua.dk>
parents:
55021
diff
changeset
|
1930 w->left_margin_cols) |
25012 | 1931 != w->desired_matrix->left_margin_glyphs) |
1932 || (margin_glyphs_to_reserve (w, dim.width, | |
56496
069e4841ceb2
(margin_glyphs_to_reserve): Apply ncols_scale_factor.
Kim F. Storm <storm@cua.dk>
parents:
55021
diff
changeset
|
1933 w->right_margin_cols) |
25012 | 1934 != w->desired_matrix->right_margin_glyphs)) |
1935 *window_change_flags |= CHANGED_LEAF_MATRIX; | |
1936 | |
1937 /* Actually change matrices, if allowed. Do not consider | |
1938 CHANGED_LEAF_MATRIX computed above here because the pool | |
1939 may have been changed which we don't now here. We trust | |
1940 that we only will be called with DIM_ONLY_P != 0 when | |
1941 necessary. */ | |
1942 if (!dim_only_p) | |
1943 { | |
1944 adjust_glyph_matrix (w, w->desired_matrix, x, y, dim); | |
1945 adjust_glyph_matrix (w, w->current_matrix, x, y, dim); | |
1946 } | |
1947 } | |
1948 | |
1949 /* If we are part of a horizontal combination, advance x for | |
1950 windows to the right of W; otherwise advance y for windows | |
1951 below W. */ | |
1952 if (in_horz_combination_p) | |
1953 x += dim.width; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1954 else |
25012 | 1955 y += dim.height; |
1956 | |
1957 /* Remember maximum glyph matrix dimensions. */ | |
1958 wmax = max (wmax, dim.width); | |
1959 hmax = max (hmax, dim.height); | |
1960 | |
1961 /* Next window on same level. */ | |
1962 window = w->next; | |
1963 } | |
1964 while (!NILP (window)); | |
1965 | |
1966 /* Set `total' to the total glyph matrix dimension of this window | |
1967 level. In a vertical combination, the width is the width of the | |
1968 widest window; the height is the y we finally reached, corrected | |
1969 by the y we started with. In a horizontal combination, the total | |
1970 height is the height of the tallest window, and the width is the | |
1971 x we finally reached, corrected by the x we started with. */ | |
1972 if (in_horz_combination_p) | |
1973 { | |
1974 total.width = x - x0; | |
1975 total.height = hmax; | |
1976 } | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1977 else |
25012 | 1978 { |
1979 total.width = wmax; | |
1980 total.height = y - y0; | |
1981 } | |
1982 | |
1983 return total; | |
1984 } | |
1985 | |
1986 | |
39448
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1987 /* Return the required height of glyph matrices for window W. */ |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1988 |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1989 int |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1990 required_matrix_height (w) |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1991 struct window *w; |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1992 { |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1993 #ifdef HAVE_WINDOW_SYSTEM |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1994 struct frame *f = XFRAME (w->frame); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1995 |
39448
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1996 if (FRAME_WINDOW_P (f)) |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1997 { |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1998 int ch_height = FRAME_SMALLEST_FONT_HEIGHT (f); |
85252 | 1999 int window_pixel_height = window_box_height (w) + eabs (w->vscroll); |
39448
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2000 return (((window_pixel_height + ch_height - 1) |
56496
069e4841ceb2
(margin_glyphs_to_reserve): Apply ncols_scale_factor.
Kim F. Storm <storm@cua.dk>
parents:
55021
diff
changeset
|
2001 / ch_height) * w->nrows_scale_factor |
39448
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2002 /* One partially visible line at the top and |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2003 bottom of the window. */ |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2004 + 2 |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
2005 /* 2 for header and mode line. */ |
39448
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2006 + 2); |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2007 } |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2008 #endif /* HAVE_WINDOW_SYSTEM */ |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2009 |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
2010 return WINDOW_TOTAL_LINES (w); |
39448
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2011 } |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2012 |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2013 |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2014 /* Return the required width of glyph matrices for window W. */ |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2015 |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2016 int |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2017 required_matrix_width (w) |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2018 struct window *w; |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2019 { |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2020 #ifdef HAVE_WINDOW_SYSTEM |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2021 struct frame *f = XFRAME (w->frame); |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2022 if (FRAME_WINDOW_P (f)) |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2023 { |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2024 int ch_width = FRAME_SMALLEST_CHAR_WIDTH (f); |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
2025 int window_pixel_width = WINDOW_TOTAL_WIDTH (w); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2026 |
39448
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2027 /* Compute number of glyphs needed in a glyph row. */ |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2028 return (((window_pixel_width + ch_width - 1) |
56496
069e4841ceb2
(margin_glyphs_to_reserve): Apply ncols_scale_factor.
Kim F. Storm <storm@cua.dk>
parents:
55021
diff
changeset
|
2029 / ch_width) * w->ncols_scale_factor |
39448
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2030 /* 2 partially visible columns in the text area. */ |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2031 + 2 |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2032 /* One partially visible column at the right |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2033 edge of each marginal area. */ |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2034 + 1 + 1); |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2035 } |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2036 #endif /* HAVE_WINDOW_SYSTEM */ |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2037 |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
2038 return XINT (w->total_cols); |
39448
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2039 } |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2040 |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2041 |
25012 | 2042 /* Allocate window matrices for window-based redisplay. W is the |
73383
015a870c0c9a
(adjust_frame_glyphs_for_frame_redisplay): Remove unused variable ch_dim.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
73318
diff
changeset
|
2043 window whose matrices must be allocated/reallocated. */ |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2044 |
25012 | 2045 static void |
39448
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2046 allocate_matrices_for_window_redisplay (w) |
25012 | 2047 struct window *w; |
2048 { | |
2049 while (w) | |
314 | 2050 { |
25012 | 2051 if (!NILP (w->vchild)) |
39448
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2052 allocate_matrices_for_window_redisplay (XWINDOW (w->vchild)); |
25012 | 2053 else if (!NILP (w->hchild)) |
39448
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2054 allocate_matrices_for_window_redisplay (XWINDOW (w->hchild)); |
25012 | 2055 else |
314 | 2056 { |
25012 | 2057 /* W is a leaf window. */ |
2058 struct dim dim; | |
2059 | |
2060 /* If matrices are not yet allocated, allocate them now. */ | |
2061 if (w->desired_matrix == NULL) | |
314 | 2062 { |
25012 | 2063 w->desired_matrix = new_glyph_matrix (NULL); |
2064 w->current_matrix = new_glyph_matrix (NULL); | |
314 | 2065 } |
25012 | 2066 |
39448
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2067 dim.width = required_matrix_width (w); |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2068 dim.height = required_matrix_height (w); |
25012 | 2069 adjust_glyph_matrix (w, w->desired_matrix, 0, 0, dim); |
2070 adjust_glyph_matrix (w, w->current_matrix, 0, 0, dim); | |
2071 } | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2072 |
25012 | 2073 w = NILP (w->next) ? NULL : XWINDOW (w->next); |
2074 } | |
2075 } | |
2076 | |
2077 | |
2078 /* Re-allocate/ re-compute glyph matrices on frame F. If F is null, | |
2079 do it for all frames; otherwise do it just for the given frame. | |
2080 This function must be called when a new frame is created, its size | |
2081 changes, or its window configuration changes. */ | |
2082 | |
2083 void | |
2084 adjust_glyphs (f) | |
2085 struct frame *f; | |
2086 { | |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
2087 /* Block input so that expose events and other events that access |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
2088 glyph matrices are not processed while we are changing them. */ |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
2089 BLOCK_INPUT; |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
2090 |
25012 | 2091 if (f) |
2092 adjust_frame_glyphs (f); | |
2093 else | |
2094 { | |
2095 Lisp_Object tail, lisp_frame; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2096 |
25012 | 2097 FOR_EACH_FRAME (tail, lisp_frame) |
2098 adjust_frame_glyphs (XFRAME (lisp_frame)); | |
2099 } | |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
2100 |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
2101 UNBLOCK_INPUT; |
25012 | 2102 } |
2103 | |
2104 | |
2105 /* Adjust frame glyphs when Emacs is initialized. | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2106 |
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2107 To be called from init_display. |
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2108 |
25012 | 2109 We need a glyph matrix because redraw will happen soon. |
2110 Unfortunately, window sizes on selected_frame are not yet set to | |
2111 meaningful values. I believe we can assume that there are only two | |
2112 windows on the frame---the mini-buffer and the root window. Frame | |
2113 height and width seem to be correct so far. So, set the sizes of | |
2114 windows to estimated values. */ | |
2115 | |
2116 static void | |
2117 adjust_frame_glyphs_initially () | |
2118 { | |
25666
063da8f6a487
(selected_frame): Make it a Lisp_Object.
Gerd Moellmann <gerd@gnu.org>
parents:
25546
diff
changeset
|
2119 struct frame *sf = SELECTED_FRAME (); |
063da8f6a487
(selected_frame): Make it a Lisp_Object.
Gerd Moellmann <gerd@gnu.org>
parents:
25546
diff
changeset
|
2120 struct window *root = XWINDOW (sf->root_window); |
25012 | 2121 struct window *mini = XWINDOW (root->next); |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
2122 int frame_lines = FRAME_LINES (sf); |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
2123 int frame_cols = FRAME_COLS (sf); |
25666
063da8f6a487
(selected_frame): Make it a Lisp_Object.
Gerd Moellmann <gerd@gnu.org>
parents:
25546
diff
changeset
|
2124 int top_margin = FRAME_TOP_MARGIN (sf); |
25012 | 2125 |
2126 /* Do it for the root window. */ | |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
2127 XSETFASTINT (root->top_line, top_margin); |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
2128 XSETFASTINT (root->total_cols, frame_cols); |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
2129 set_window_height (sf->root_window, frame_lines - 1 - top_margin, 0); |
25012 | 2130 |
2131 /* Do it for the mini-buffer window. */ | |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
2132 XSETFASTINT (mini->top_line, frame_lines - 1); |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
2133 XSETFASTINT (mini->total_cols, frame_cols); |
25012 | 2134 set_window_height (root->next, 1, 0); |
2135 | |
25666
063da8f6a487
(selected_frame): Make it a Lisp_Object.
Gerd Moellmann <gerd@gnu.org>
parents:
25546
diff
changeset
|
2136 adjust_frame_glyphs (sf); |
25012 | 2137 glyphs_initialized_initially_p = 1; |
2138 } | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2139 |
25012 | 2140 |
2141 /* Allocate/reallocate glyph matrices of a single frame F. */ | |
2142 | |
2143 static void | |
2144 adjust_frame_glyphs (f) | |
2145 struct frame *f; | |
2146 { | |
2147 if (FRAME_WINDOW_P (f)) | |
2148 adjust_frame_glyphs_for_window_redisplay (f); | |
2149 else | |
2150 adjust_frame_glyphs_for_frame_redisplay (f); | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2151 |
25012 | 2152 /* Don't forget the message buffer and the buffer for |
2153 decode_mode_spec. */ | |
2154 adjust_frame_message_buffer (f); | |
2155 adjust_decode_mode_spec_buffer (f); | |
2156 | |
2157 f->glyphs_initialized_p = 1; | |
2158 } | |
2159 | |
77267
7f8bdfdc0227
(adjust_frame_glyphs_for_frame_redisplay): Set garbaged flag in
Chong Yidong <cyd@stupidchicken.com>
parents:
76621
diff
changeset
|
2160 /* Return 1 if any window in the tree has nonzero window margins. See |
7f8bdfdc0227
(adjust_frame_glyphs_for_frame_redisplay): Set garbaged flag in
Chong Yidong <cyd@stupidchicken.com>
parents:
76621
diff
changeset
|
2161 the hack at the end of adjust_frame_glyphs_for_frame_redisplay. */ |
7f8bdfdc0227
(adjust_frame_glyphs_for_frame_redisplay): Set garbaged flag in
Chong Yidong <cyd@stupidchicken.com>
parents:
76621
diff
changeset
|
2162 static int |
7f8bdfdc0227
(adjust_frame_glyphs_for_frame_redisplay): Set garbaged flag in
Chong Yidong <cyd@stupidchicken.com>
parents:
76621
diff
changeset
|
2163 showing_window_margins_p (w) |
7f8bdfdc0227
(adjust_frame_glyphs_for_frame_redisplay): Set garbaged flag in
Chong Yidong <cyd@stupidchicken.com>
parents:
76621
diff
changeset
|
2164 struct window *w; |
7f8bdfdc0227
(adjust_frame_glyphs_for_frame_redisplay): Set garbaged flag in
Chong Yidong <cyd@stupidchicken.com>
parents:
76621
diff
changeset
|
2165 { |
7f8bdfdc0227
(adjust_frame_glyphs_for_frame_redisplay): Set garbaged flag in
Chong Yidong <cyd@stupidchicken.com>
parents:
76621
diff
changeset
|
2166 while (w) |
7f8bdfdc0227
(adjust_frame_glyphs_for_frame_redisplay): Set garbaged flag in
Chong Yidong <cyd@stupidchicken.com>
parents:
76621
diff
changeset
|
2167 { |
7f8bdfdc0227
(adjust_frame_glyphs_for_frame_redisplay): Set garbaged flag in
Chong Yidong <cyd@stupidchicken.com>
parents:
76621
diff
changeset
|
2168 if (!NILP (w->hchild)) |
7f8bdfdc0227
(adjust_frame_glyphs_for_frame_redisplay): Set garbaged flag in
Chong Yidong <cyd@stupidchicken.com>
parents:
76621
diff
changeset
|
2169 { |
7f8bdfdc0227
(adjust_frame_glyphs_for_frame_redisplay): Set garbaged flag in
Chong Yidong <cyd@stupidchicken.com>
parents:
76621
diff
changeset
|
2170 if (showing_window_margins_p (XWINDOW (w->hchild))) |
7f8bdfdc0227
(adjust_frame_glyphs_for_frame_redisplay): Set garbaged flag in
Chong Yidong <cyd@stupidchicken.com>
parents:
76621
diff
changeset
|
2171 return 1; |
7f8bdfdc0227
(adjust_frame_glyphs_for_frame_redisplay): Set garbaged flag in
Chong Yidong <cyd@stupidchicken.com>
parents:
76621
diff
changeset
|
2172 } |
7f8bdfdc0227
(adjust_frame_glyphs_for_frame_redisplay): Set garbaged flag in
Chong Yidong <cyd@stupidchicken.com>
parents:
76621
diff
changeset
|
2173 else if (!NILP (w->vchild)) |
7f8bdfdc0227
(adjust_frame_glyphs_for_frame_redisplay): Set garbaged flag in
Chong Yidong <cyd@stupidchicken.com>
parents:
76621
diff
changeset
|
2174 { |
7f8bdfdc0227
(adjust_frame_glyphs_for_frame_redisplay): Set garbaged flag in
Chong Yidong <cyd@stupidchicken.com>
parents:
76621
diff
changeset
|
2175 if (showing_window_margins_p (XWINDOW (w->vchild))) |
7f8bdfdc0227
(adjust_frame_glyphs_for_frame_redisplay): Set garbaged flag in
Chong Yidong <cyd@stupidchicken.com>
parents:
76621
diff
changeset
|
2176 return 1; |
7f8bdfdc0227
(adjust_frame_glyphs_for_frame_redisplay): Set garbaged flag in
Chong Yidong <cyd@stupidchicken.com>
parents:
76621
diff
changeset
|
2177 } |
7f8bdfdc0227
(adjust_frame_glyphs_for_frame_redisplay): Set garbaged flag in
Chong Yidong <cyd@stupidchicken.com>
parents:
76621
diff
changeset
|
2178 else if (!NILP (w->left_margin_cols) |
7f8bdfdc0227
(adjust_frame_glyphs_for_frame_redisplay): Set garbaged flag in
Chong Yidong <cyd@stupidchicken.com>
parents:
76621
diff
changeset
|
2179 || !NILP (w->right_margin_cols)) |
7f8bdfdc0227
(adjust_frame_glyphs_for_frame_redisplay): Set garbaged flag in
Chong Yidong <cyd@stupidchicken.com>
parents:
76621
diff
changeset
|
2180 return 1; |
92276
1dc7b04a4d95
(line_draw_cost): Adapt to new glyph type.
Kim F. Storm <storm@cua.dk>
parents:
91367
diff
changeset
|
2181 |
77267
7f8bdfdc0227
(adjust_frame_glyphs_for_frame_redisplay): Set garbaged flag in
Chong Yidong <cyd@stupidchicken.com>
parents:
76621
diff
changeset
|
2182 w = NILP (w->next) ? 0 : XWINDOW (w->next); |
7f8bdfdc0227
(adjust_frame_glyphs_for_frame_redisplay): Set garbaged flag in
Chong Yidong <cyd@stupidchicken.com>
parents:
76621
diff
changeset
|
2183 } |
7f8bdfdc0227
(adjust_frame_glyphs_for_frame_redisplay): Set garbaged flag in
Chong Yidong <cyd@stupidchicken.com>
parents:
76621
diff
changeset
|
2184 return 0; |
7f8bdfdc0227
(adjust_frame_glyphs_for_frame_redisplay): Set garbaged flag in
Chong Yidong <cyd@stupidchicken.com>
parents:
76621
diff
changeset
|
2185 } |
7f8bdfdc0227
(adjust_frame_glyphs_for_frame_redisplay): Set garbaged flag in
Chong Yidong <cyd@stupidchicken.com>
parents:
76621
diff
changeset
|
2186 |
25012 | 2187 |
34736
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2188 /* In the window tree with root W, build current matrices of leaf |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2189 windows from the frame's current matrix. */ |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2190 |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2191 static void |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2192 fake_current_matrices (window) |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2193 Lisp_Object window; |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2194 { |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2195 struct window *w; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2196 |
34736
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2197 for (; !NILP (window); window = w->next) |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2198 { |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2199 w = XWINDOW (window); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2200 |
34736
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2201 if (!NILP (w->hchild)) |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2202 fake_current_matrices (w->hchild); |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2203 else if (!NILP (w->vchild)) |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2204 fake_current_matrices (w->vchild); |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2205 else |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2206 { |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2207 int i; |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2208 struct frame *f = XFRAME (w->frame); |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2209 struct glyph_matrix *m = w->current_matrix; |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2210 struct glyph_matrix *fm = f->current_matrix; |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2211 |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
2212 xassert (m->matrix_h == WINDOW_TOTAL_LINES (w)); |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
2213 xassert (m->matrix_w == WINDOW_TOTAL_COLS (w)); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2214 |
34736
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2215 for (i = 0; i < m->matrix_h; ++i) |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2216 { |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2217 struct glyph_row *r = m->rows + i; |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
2218 struct glyph_row *fr = fm->rows + i + WINDOW_TOP_EDGE_LINE (w); |
34736
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2219 |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2220 xassert (r->glyphs[TEXT_AREA] >= fr->glyphs[TEXT_AREA] |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2221 && r->glyphs[LAST_AREA] <= fr->glyphs[LAST_AREA]); |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2222 |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2223 r->enabled_p = fr->enabled_p; |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2224 if (r->enabled_p) |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2225 { |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2226 r->used[LEFT_MARGIN_AREA] = m->left_margin_glyphs; |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2227 r->used[RIGHT_MARGIN_AREA] = m->right_margin_glyphs; |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2228 r->used[TEXT_AREA] = (m->matrix_w |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2229 - r->used[LEFT_MARGIN_AREA] |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2230 - r->used[RIGHT_MARGIN_AREA]); |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2231 r->mode_line_p = 0; |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2232 } |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2233 } |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2234 } |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2235 } |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2236 } |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2237 |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2238 |
35307
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2239 /* Save away the contents of frame F's current frame matrix. Value is |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
2240 a glyph matrix holding the contents of F's current frame matrix. */ |
35307
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2241 |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2242 static struct glyph_matrix * |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2243 save_current_matrix (f) |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2244 struct frame *f; |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2245 { |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2246 int i; |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2247 struct glyph_matrix *saved; |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2248 |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2249 saved = (struct glyph_matrix *) xmalloc (sizeof *saved); |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2250 bzero (saved, sizeof *saved); |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2251 saved->nrows = f->current_matrix->nrows; |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2252 saved->rows = (struct glyph_row *) xmalloc (saved->nrows |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2253 * sizeof *saved->rows); |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2254 bzero (saved->rows, saved->nrows * sizeof *saved->rows); |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2255 |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2256 for (i = 0; i < saved->nrows; ++i) |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2257 { |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2258 struct glyph_row *from = f->current_matrix->rows + i; |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2259 struct glyph_row *to = saved->rows + i; |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2260 size_t nbytes = from->used[TEXT_AREA] * sizeof (struct glyph); |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2261 to->glyphs[TEXT_AREA] = (struct glyph *) xmalloc (nbytes); |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2262 bcopy (from->glyphs[TEXT_AREA], to->glyphs[TEXT_AREA], nbytes); |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2263 to->used[TEXT_AREA] = from->used[TEXT_AREA]; |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2264 } |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2265 |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2266 return saved; |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2267 } |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2268 |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2269 |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2270 /* Restore the contents of frame F's current frame matrix from SAVED, |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2271 and free memory associated with SAVED. */ |
34849
eac70be4cb58
(save_frame_matrix, restore_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34788
diff
changeset
|
2272 |
eac70be4cb58
(save_frame_matrix, restore_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34788
diff
changeset
|
2273 static void |
35307
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2274 restore_current_matrix (f, saved) |
34849
eac70be4cb58
(save_frame_matrix, restore_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34788
diff
changeset
|
2275 struct frame *f; |
35307
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2276 struct glyph_matrix *saved; |
34736
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2277 { |
35307
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2278 int i; |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2279 |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2280 for (i = 0; i < saved->nrows; ++i) |
34788
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2281 { |
35307
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2282 struct glyph_row *from = saved->rows + i; |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2283 struct glyph_row *to = f->current_matrix->rows + i; |
34788
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2284 size_t nbytes = from->used[TEXT_AREA] * sizeof (struct glyph); |
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2285 bcopy (from->glyphs[TEXT_AREA], to->glyphs[TEXT_AREA], nbytes); |
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2286 to->used[TEXT_AREA] = from->used[TEXT_AREA]; |
35307
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2287 xfree (from->glyphs[TEXT_AREA]); |
34788
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2288 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2289 |
35307
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2290 xfree (saved->rows); |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2291 xfree (saved); |
34736
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2292 } |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2293 |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2294 |
35307
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2295 |
25012 | 2296 /* Allocate/reallocate glyph matrices of a single frame F for |
2297 frame-based redisplay. */ | |
2298 | |
2299 static void | |
2300 adjust_frame_glyphs_for_frame_redisplay (f) | |
2301 struct frame *f; | |
2302 { | |
2303 struct dim matrix_dim; | |
2304 int pool_changed_p; | |
2305 int window_change_flags; | |
2306 int top_window_y; | |
2307 | |
2308 if (!FRAME_LIVE_P (f)) | |
2309 return; | |
2310 | |
2311 top_window_y = FRAME_TOP_MARGIN (f); | |
2312 | |
2313 /* Allocate glyph pool structures if not already done. */ | |
2314 if (f->desired_pool == NULL) | |
2315 { | |
2316 f->desired_pool = new_glyph_pool (); | |
2317 f->current_pool = new_glyph_pool (); | |
2318 } | |
2319 | |
2320 /* Allocate frames matrix structures if needed. */ | |
2321 if (f->desired_matrix == NULL) | |
2322 { | |
2323 f->desired_matrix = new_glyph_matrix (f->desired_pool); | |
2324 f->current_matrix = new_glyph_matrix (f->current_pool); | |
2325 } | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2326 |
25012 | 2327 /* Compute window glyph matrices. (This takes the mini-buffer |
2328 window into account). The result is the size of the frame glyph | |
2329 matrix needed. The variable window_change_flags is set to a bit | |
2330 mask indicating whether new matrices will be allocated or | |
2331 existing matrices change their size or location within the frame | |
2332 matrix. */ | |
2333 window_change_flags = 0; | |
2334 matrix_dim | |
2335 = allocate_matrices_for_frame_redisplay (FRAME_ROOT_WINDOW (f), | |
2336 0, top_window_y, | |
39448
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2337 1, |
25012 | 2338 &window_change_flags); |
2339 | |
2340 /* Add in menu bar lines, if any. */ | |
2341 matrix_dim.height += top_window_y; | |
2342 | |
2343 /* Enlarge pools as necessary. */ | |
2344 pool_changed_p = realloc_glyph_pool (f->desired_pool, matrix_dim); | |
2345 realloc_glyph_pool (f->current_pool, matrix_dim); | |
2346 | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2347 /* Set up glyph pointers within window matrices. Do this only if |
25012 | 2348 absolutely necessary since it requires a frame redraw. */ |
2349 if (pool_changed_p || window_change_flags) | |
2350 { | |
2351 /* Do it for window matrices. */ | |
2352 allocate_matrices_for_frame_redisplay (FRAME_ROOT_WINDOW (f), | |
39448
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2353 0, top_window_y, 0, |
25012 | 2354 &window_change_flags); |
2355 | |
2356 /* Size of frame matrices must equal size of frame. Note | |
2357 that we are called for X frames with window widths NOT equal | |
2358 to the frame width (from CHANGE_FRAME_SIZE_1). */ | |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
2359 xassert (matrix_dim.width == FRAME_COLS (f) |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
2360 && matrix_dim.height == FRAME_LINES (f)); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2361 |
34788
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2362 /* Pointers to glyph memory in glyph rows are exchanged during |
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2363 the update phase of redisplay, which means in general that a |
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2364 frame's current matrix consists of pointers into both the |
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2365 desired and current glyph pool of the frame. Adjusting a |
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2366 matrix sets the frame matrix up so that pointers are all into |
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2367 the same pool. If we want to preserve glyph contents of the |
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2368 current matrix over a call to adjust_glyph_matrix, we must |
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2369 make a copy of the current glyphs, and restore the current |
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2370 matrix' contents from that copy. */ |
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2371 if (display_completed |
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2372 && !FRAME_GARBAGED_P (f) |
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2373 && matrix_dim.width == f->current_matrix->matrix_w |
77267
7f8bdfdc0227
(adjust_frame_glyphs_for_frame_redisplay): Set garbaged flag in
Chong Yidong <cyd@stupidchicken.com>
parents:
76621
diff
changeset
|
2374 && matrix_dim.height == f->current_matrix->matrix_h |
7f8bdfdc0227
(adjust_frame_glyphs_for_frame_redisplay): Set garbaged flag in
Chong Yidong <cyd@stupidchicken.com>
parents:
76621
diff
changeset
|
2375 /* For some reason, the frame glyph matrix gets corrupted if |
7f8bdfdc0227
(adjust_frame_glyphs_for_frame_redisplay): Set garbaged flag in
Chong Yidong <cyd@stupidchicken.com>
parents:
76621
diff
changeset
|
2376 any of the windows contain margins. I haven't been able |
7f8bdfdc0227
(adjust_frame_glyphs_for_frame_redisplay): Set garbaged flag in
Chong Yidong <cyd@stupidchicken.com>
parents:
76621
diff
changeset
|
2377 to hunt down the reason, but for the moment this prevents |
7f8bdfdc0227
(adjust_frame_glyphs_for_frame_redisplay): Set garbaged flag in
Chong Yidong <cyd@stupidchicken.com>
parents:
76621
diff
changeset
|
2378 the problem from manifesting. -- cyd */ |
7f8bdfdc0227
(adjust_frame_glyphs_for_frame_redisplay): Set garbaged flag in
Chong Yidong <cyd@stupidchicken.com>
parents:
76621
diff
changeset
|
2379 && !showing_window_margins_p (XWINDOW (FRAME_ROOT_WINDOW (f)))) |
34788
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2380 { |
35307
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2381 struct glyph_matrix *copy = save_current_matrix (f); |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2382 adjust_glyph_matrix (NULL, f->desired_matrix, 0, 0, matrix_dim); |
34788
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2383 adjust_glyph_matrix (NULL, f->current_matrix, 0, 0, matrix_dim); |
35307
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2384 restore_current_matrix (f, copy); |
34788
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2385 fake_current_matrices (FRAME_ROOT_WINDOW (f)); |
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2386 } |
34736
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2387 else |
34788
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2388 { |
35307
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2389 adjust_glyph_matrix (NULL, f->desired_matrix, 0, 0, matrix_dim); |
34788
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2390 adjust_glyph_matrix (NULL, f->current_matrix, 0, 0, matrix_dim); |
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2391 SET_FRAME_GARBAGED (f); |
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2392 } |
25012 | 2393 } |
2394 } | |
2395 | |
2396 | |
2397 /* Allocate/reallocate glyph matrices of a single frame F for | |
2398 window-based redisplay. */ | |
2399 | |
2400 static void | |
2401 adjust_frame_glyphs_for_window_redisplay (f) | |
2402 struct frame *f; | |
2403 { | |
2404 struct window *w; | |
2405 | |
2406 xassert (FRAME_WINDOW_P (f) && FRAME_LIVE_P (f)); | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2407 |
25012 | 2408 /* Allocate/reallocate window matrices. */ |
39448
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2409 allocate_matrices_for_window_redisplay (XWINDOW (FRAME_ROOT_WINDOW (f))); |
25012 | 2410 |
73383
015a870c0c9a
(adjust_frame_glyphs_for_frame_redisplay): Remove unused variable ch_dim.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
73318
diff
changeset
|
2411 #ifdef HAVE_X_WINDOWS |
25012 | 2412 /* Allocate/ reallocate matrices of the dummy window used to display |
2413 the menu bar under X when no X toolkit support is available. */ | |
49322 | 2414 #if ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK) |
25012 | 2415 { |
2416 /* Allocate a dummy window if not already done. */ | |
2417 if (NILP (f->menu_bar_window)) | |
2418 { | |
2419 f->menu_bar_window = make_window (); | |
2420 w = XWINDOW (f->menu_bar_window); | |
2421 XSETFRAME (w->frame, f); | |
2422 w->pseudo_window_p = 1; | |
2423 } | |
2424 else | |
2425 w = XWINDOW (f->menu_bar_window); | |
2426 | |
2427 /* Set window dimensions to frame dimensions and allocate or | |
2428 adjust glyph matrices of W. */ | |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
2429 XSETFASTINT (w->top_line, 0); |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
2430 XSETFASTINT (w->left_col, 0); |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
2431 XSETFASTINT (w->total_lines, FRAME_MENU_BAR_LINES (f)); |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
2432 XSETFASTINT (w->total_cols, FRAME_TOTAL_COLS (f)); |
39448
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2433 allocate_matrices_for_window_redisplay (w); |
25012 | 2434 } |
73402
c76709b3cbc0
(adjust_frame_glyphs_for_window_redisplay): Fix #endif comments.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
73383
diff
changeset
|
2435 #endif /* not USE_X_TOOLKIT && not USE_GTK */ |
c76709b3cbc0
(adjust_frame_glyphs_for_window_redisplay): Fix #endif comments.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
73383
diff
changeset
|
2436 #endif /* HAVE_X_WINDOWS */ |
25012 | 2437 |
49322 | 2438 #ifndef USE_GTK |
25544
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
2439 /* Allocate/ reallocate matrices of the tool bar window. If we |
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
2440 don't have a tool bar window yet, make one. */ |
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
2441 if (NILP (f->tool_bar_window)) |
25012 | 2442 { |
25544
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
2443 f->tool_bar_window = make_window (); |
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
2444 w = XWINDOW (f->tool_bar_window); |
25012 | 2445 XSETFRAME (w->frame, f); |
2446 w->pseudo_window_p = 1; | |
2447 } | |
2448 else | |
25544
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
2449 w = XWINDOW (f->tool_bar_window); |
25012 | 2450 |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
2451 XSETFASTINT (w->top_line, FRAME_MENU_BAR_LINES (f)); |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
2452 XSETFASTINT (w->left_col, 0); |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
2453 XSETFASTINT (w->total_lines, FRAME_TOOL_BAR_LINES (f)); |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
2454 XSETFASTINT (w->total_cols, FRAME_TOTAL_COLS (f)); |
39448
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2455 allocate_matrices_for_window_redisplay (w); |
49322 | 2456 #endif |
25012 | 2457 } |
2458 | |
2459 | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2460 /* Adjust/ allocate message buffer of frame F. |
25012 | 2461 |
2462 Note that the message buffer is never freed. Since I could not | |
2463 find a free in 19.34, I assume that freeing it would be | |
2464 problematic in some way and don't do it either. | |
2465 | |
2466 (Implementation note: It should be checked if we can free it | |
2467 eventually without causing trouble). */ | |
2468 | |
2469 static void | |
2470 adjust_frame_message_buffer (f) | |
2471 struct frame *f; | |
2472 { | |
2473 int size = FRAME_MESSAGE_BUF_SIZE (f) + 1; | |
2474 | |
2475 if (FRAME_MESSAGE_BUF (f)) | |
2476 { | |
2477 char *buffer = FRAME_MESSAGE_BUF (f); | |
2478 char *new_buffer = (char *) xrealloc (buffer, size); | |
2479 FRAME_MESSAGE_BUF (f) = new_buffer; | |
2480 } | |
2481 else | |
2482 FRAME_MESSAGE_BUF (f) = (char *) xmalloc (size); | |
2483 } | |
2484 | |
2485 | |
2486 /* Re-allocate buffer for decode_mode_spec on frame F. */ | |
2487 | |
2488 static void | |
2489 adjust_decode_mode_spec_buffer (f) | |
2490 struct frame *f; | |
2491 { | |
2492 f->decode_mode_spec_buffer | |
2493 = (char *) xrealloc (f->decode_mode_spec_buffer, | |
2494 FRAME_MESSAGE_BUF_SIZE (f) + 1); | |
2495 } | |
2496 | |
2497 | |
2498 | |
2499 /********************************************************************** | |
2500 Freeing Glyph Matrices | |
2501 **********************************************************************/ | |
2502 | |
2503 /* Free glyph memory for a frame F. F may be null. This function can | |
2504 be called for the same frame more than once. The root window of | |
2505 F may be nil when this function is called. This is the case when | |
2506 the function is called when F is destroyed. */ | |
2507 | |
2508 void | |
2509 free_glyphs (f) | |
2510 struct frame *f; | |
2511 { | |
2512 if (f && f->glyphs_initialized_p) | |
2513 { | |
27968
7634011b93f3
(free_glyphs): Block input while freeing matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
27855
diff
changeset
|
2514 /* Block interrupt input so that we don't get surprised by an X |
7634011b93f3
(free_glyphs): Block input while freeing matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
27855
diff
changeset
|
2515 event while we're in an inconsistent state. */ |
7634011b93f3
(free_glyphs): Block input while freeing matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
27855
diff
changeset
|
2516 BLOCK_INPUT; |
25012 | 2517 f->glyphs_initialized_p = 0; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2518 |
25012 | 2519 /* Release window sub-matrices. */ |
2520 if (!NILP (f->root_window)) | |
2521 free_window_matrices (XWINDOW (f->root_window)); | |
2522 | |
2523 /* Free the dummy window for menu bars without X toolkit and its | |
2524 glyph matrices. */ | |
2525 if (!NILP (f->menu_bar_window)) | |
2526 { | |
2527 struct window *w = XWINDOW (f->menu_bar_window); | |
2528 free_glyph_matrix (w->desired_matrix); | |
2529 free_glyph_matrix (w->current_matrix); | |
2530 w->desired_matrix = w->current_matrix = NULL; | |
2531 f->menu_bar_window = Qnil; | |
2532 } | |
2533 | |
25544
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
2534 /* Free the tool bar window and its glyph matrices. */ |
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
2535 if (!NILP (f->tool_bar_window)) |
25012 | 2536 { |
25544
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
2537 struct window *w = XWINDOW (f->tool_bar_window); |
25012 | 2538 free_glyph_matrix (w->desired_matrix); |
2539 free_glyph_matrix (w->current_matrix); | |
2540 w->desired_matrix = w->current_matrix = NULL; | |
25544
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
2541 f->tool_bar_window = Qnil; |
25012 | 2542 } |
2543 | |
2544 /* Release frame glyph matrices. Reset fields to zero in | |
2545 case we are called a second time. */ | |
2546 if (f->desired_matrix) | |
2547 { | |
2548 free_glyph_matrix (f->desired_matrix); | |
2549 free_glyph_matrix (f->current_matrix); | |
2550 f->desired_matrix = f->current_matrix = NULL; | |
2551 } | |
2552 | |
2553 /* Release glyph pools. */ | |
2554 if (f->desired_pool) | |
2555 { | |
2556 free_glyph_pool (f->desired_pool); | |
2557 free_glyph_pool (f->current_pool); | |
2558 f->desired_pool = f->current_pool = NULL; | |
314 | 2559 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2560 |
27968
7634011b93f3
(free_glyphs): Block input while freeing matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
27855
diff
changeset
|
2561 UNBLOCK_INPUT; |
314 | 2562 } |
2563 } | |
2564 | |
25012 | 2565 |
2566 /* Free glyph sub-matrices in the window tree rooted at W. This | |
2567 function may be called with a null pointer, and it may be called on | |
2568 the same tree more than once. */ | |
2569 | |
2570 void | |
2571 free_window_matrices (w) | |
2572 struct window *w; | |
2573 { | |
2574 while (w) | |
2575 { | |
2576 if (!NILP (w->hchild)) | |
2577 free_window_matrices (XWINDOW (w->hchild)); | |
2578 else if (!NILP (w->vchild)) | |
2579 free_window_matrices (XWINDOW (w->vchild)); | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2580 else |
25012 | 2581 { |
2582 /* This is a leaf window. Free its memory and reset fields | |
2583 to zero in case this function is called a second time for | |
2584 W. */ | |
2585 free_glyph_matrix (w->current_matrix); | |
2586 free_glyph_matrix (w->desired_matrix); | |
2587 w->current_matrix = w->desired_matrix = NULL; | |
2588 } | |
2589 | |
2590 /* Next window on same level. */ | |
2591 w = NILP (w->next) ? 0 : XWINDOW (w->next); | |
2592 } | |
2593 } | |
2594 | |
2595 | |
2596 /* Check glyph memory leaks. This function is called from | |
2597 shut_down_emacs. Note that frames are not destroyed when Emacs | |
2598 exits. We therefore free all glyph memory for all active frames | |
2599 explicitly and check that nothing is left allocated. */ | |
6620
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
2600 |
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
2601 void |
25012 | 2602 check_glyph_memory () |
6620
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
2603 { |
25012 | 2604 Lisp_Object tail, frame; |
2605 | |
2606 /* Free glyph memory for all frames. */ | |
2607 FOR_EACH_FRAME (tail, frame) | |
2608 free_glyphs (XFRAME (frame)); | |
2609 | |
2610 /* Check that nothing is left allocated. */ | |
2611 if (glyph_matrix_count) | |
2612 abort (); | |
2613 if (glyph_pool_count) | |
2614 abort (); | |
2615 } | |
2616 | |
2617 | |
2618 | |
2619 /********************************************************************** | |
2620 Building a Frame Matrix | |
2621 **********************************************************************/ | |
2622 | |
2623 /* Most of the redisplay code works on glyph matrices attached to | |
2624 windows. This is a good solution most of the time, but it is not | |
2625 suitable for terminal code. Terminal output functions cannot rely | |
2626 on being able to set an arbitrary terminal window. Instead they | |
2627 must be provided with a view of the whole frame, i.e. the whole | |
2628 screen. We build such a view by constructing a frame matrix from | |
2629 window matrices in this section. | |
2630 | |
2631 Windows that must be updated have their must_be_update_p flag set. | |
2632 For all such windows, their desired matrix is made part of the | |
2633 desired frame matrix. For other windows, their current matrix is | |
2634 made part of the desired frame matrix. | |
2635 | |
2636 +-----------------+----------------+ | |
2637 | desired | desired | | |
2638 | | | | |
2639 +-----------------+----------------+ | |
2640 | current | | |
2641 | | | |
2642 +----------------------------------+ | |
2643 | |
2644 Desired window matrices can be made part of the frame matrix in a | |
2645 cheap way: We exploit the fact that the desired frame matrix and | |
2646 desired window matrices share their glyph memory. This is not | |
2647 possible for current window matrices. Their glyphs are copied to | |
2648 the desired frame matrix. The latter is equivalent to | |
2649 preserve_other_columns in the old redisplay. | |
2650 | |
2651 Used glyphs counters for frame matrix rows are the result of adding | |
2652 up glyph lengths of the window matrices. A line in the frame | |
2653 matrix is enabled, if a corresponding line in a window matrix is | |
2654 enabled. | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2655 |
25012 | 2656 After building the desired frame matrix, it will be passed to |
2657 terminal code, which will manipulate both the desired and current | |
2658 frame matrix. Changes applied to the frame's current matrix have | |
2659 to be visible in current window matrices afterwards, of course. | |
2660 | |
2661 This problem is solved like this: | |
2662 | |
2663 1. Window and frame matrices share glyphs. Window matrices are | |
2664 constructed in a way that their glyph contents ARE the glyph | |
2665 contents needed in a frame matrix. Thus, any modification of | |
2666 glyphs done in terminal code will be reflected in window matrices | |
2667 automatically. | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2668 |
25012 | 2669 2. Exchanges of rows in a frame matrix done by terminal code are |
2670 intercepted by hook functions so that corresponding row operations | |
2671 on window matrices can be performed. This is necessary because we | |
2672 use pointers to glyphs in glyph row structures. To satisfy the | |
2673 assumption of point 1 above that glyphs are updated implicitly in | |
2674 window matrices when they are manipulated via the frame matrix, | |
2675 window and frame matrix must of course agree where to find the | |
2676 glyphs for their rows. Possible manipulations that must be | |
2677 mirrored are assignments of rows of the desired frame matrix to the | |
2678 current frame matrix and scrolling the current frame matrix. */ | |
2679 | |
2680 /* Build frame F's desired matrix from window matrices. Only windows | |
2681 which have the flag must_be_updated_p set have to be updated. Menu | |
2682 bar lines of a frame are not covered by window matrices, so make | |
2683 sure not to touch them in this function. */ | |
2684 | |
2685 static void | |
2686 build_frame_matrix (f) | |
2687 struct frame *f; | |
2688 { | |
6620
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
2689 int i; |
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
2690 |
25012 | 2691 /* F must have a frame matrix when this function is called. */ |
2692 xassert (!FRAME_WINDOW_P (f)); | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2693 |
25012 | 2694 /* Clear all rows in the frame matrix covered by window matrices. |
2695 Menu bar lines are not covered by windows. */ | |
2696 for (i = FRAME_TOP_MARGIN (f); i < f->desired_matrix->nrows; ++i) | |
2697 clear_glyph_row (MATRIX_ROW (f->desired_matrix, i)); | |
2698 | |
2699 /* Build the matrix by walking the window tree. */ | |
2700 build_frame_matrix_from_window_tree (f->desired_matrix, | |
2701 XWINDOW (FRAME_ROOT_WINDOW (f))); | |
2702 } | |
2703 | |
2704 | |
2705 /* Walk a window tree, building a frame matrix MATRIX from window | |
2706 matrices. W is the root of a window tree. */ | |
2707 | |
2708 static void | |
2709 build_frame_matrix_from_window_tree (matrix, w) | |
2710 struct glyph_matrix *matrix; | |
2711 struct window *w; | |
2712 { | |
2713 while (w) | |
6620
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
2714 { |
25012 | 2715 if (!NILP (w->hchild)) |
2716 build_frame_matrix_from_window_tree (matrix, XWINDOW (w->hchild)); | |
2717 else if (!NILP (w->vchild)) | |
2718 build_frame_matrix_from_window_tree (matrix, XWINDOW (w->vchild)); | |
2719 else | |
2720 build_frame_matrix_from_leaf_window (matrix, w); | |
2721 | |
2722 w = NILP (w->next) ? 0 : XWINDOW (w->next); | |
6620
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
2723 } |
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
2724 } |
6642
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
2725 |
25012 | 2726 |
2727 /* Add a window's matrix to a frame matrix. FRAME_MATRIX is the | |
2728 desired frame matrix built. W is a leaf window whose desired or | |
2729 current matrix is to be added to FRAME_MATRIX. W's flag | |
2730 must_be_updated_p determines which matrix it contributes to | |
2731 FRAME_MATRIX. If must_be_updated_p is non-zero, W's desired matrix | |
2732 is added to FRAME_MATRIX, otherwise W's current matrix is added. | |
2733 Adding a desired matrix means setting up used counters and such in | |
2734 frame rows, while adding a current window matrix to FRAME_MATRIX | |
2735 means copying glyphs. The latter case corresponds to | |
2736 preserve_other_columns in the old redisplay. */ | |
2737 | |
2738 static void | |
2739 build_frame_matrix_from_leaf_window (frame_matrix, w) | |
2740 struct glyph_matrix *frame_matrix; | |
6642
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
2741 struct window *w; |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
2742 { |
25012 | 2743 struct glyph_matrix *window_matrix; |
2744 int window_y, frame_y; | |
2745 /* If non-zero, a glyph to insert at the right border of W. */ | |
92276
1dc7b04a4d95
(line_draw_cost): Adapt to new glyph type.
Kim F. Storm <storm@cua.dk>
parents:
91367
diff
changeset
|
2746 GLYPH right_border_glyph; |
1dc7b04a4d95
(line_draw_cost): Adapt to new glyph type.
Kim F. Storm <storm@cua.dk>
parents:
91367
diff
changeset
|
2747 |
1dc7b04a4d95
(line_draw_cost): Adapt to new glyph type.
Kim F. Storm <storm@cua.dk>
parents:
91367
diff
changeset
|
2748 SET_GLYPH_FROM_CHAR (right_border_glyph, 0); |
25012 | 2749 |
2750 /* Set window_matrix to the matrix we have to add to FRAME_MATRIX. */ | |
2751 if (w->must_be_updated_p) | |
2752 { | |
2753 window_matrix = w->desired_matrix; | |
2754 | |
2755 /* Decide whether we want to add a vertical border glyph. */ | |
2756 if (!WINDOW_RIGHTMOST_P (w)) | |
2757 { | |
2758 struct Lisp_Char_Table *dp = window_display_table (w); | |
92276
1dc7b04a4d95
(line_draw_cost): Adapt to new glyph type.
Kim F. Storm <storm@cua.dk>
parents:
91367
diff
changeset
|
2759 Lisp_Object gc; |
1dc7b04a4d95
(line_draw_cost): Adapt to new glyph type.
Kim F. Storm <storm@cua.dk>
parents:
91367
diff
changeset
|
2760 |
1dc7b04a4d95
(line_draw_cost): Adapt to new glyph type.
Kim F. Storm <storm@cua.dk>
parents:
91367
diff
changeset
|
2761 SET_GLYPH_FROM_CHAR (right_border_glyph, '|'); |
1dc7b04a4d95
(line_draw_cost): Adapt to new glyph type.
Kim F. Storm <storm@cua.dk>
parents:
91367
diff
changeset
|
2762 if (dp |
1dc7b04a4d95
(line_draw_cost): Adapt to new glyph type.
Kim F. Storm <storm@cua.dk>
parents:
91367
diff
changeset
|
2763 && (gc = DISP_BORDER_GLYPH (dp), GLYPH_CODE_P (gc)) |
1dc7b04a4d95
(line_draw_cost): Adapt to new glyph type.
Kim F. Storm <storm@cua.dk>
parents:
91367
diff
changeset
|
2764 && GLYPH_CODE_CHAR_VALID_P (gc)) |
1dc7b04a4d95
(line_draw_cost): Adapt to new glyph type.
Kim F. Storm <storm@cua.dk>
parents:
91367
diff
changeset
|
2765 { |
1dc7b04a4d95
(line_draw_cost): Adapt to new glyph type.
Kim F. Storm <storm@cua.dk>
parents:
91367
diff
changeset
|
2766 SET_GLYPH_FROM_GLYPH_CODE (right_border_glyph, gc); |
1dc7b04a4d95
(line_draw_cost): Adapt to new glyph type.
Kim F. Storm <storm@cua.dk>
parents:
91367
diff
changeset
|
2767 spec_glyph_lookup_face (w, &right_border_glyph); |
1dc7b04a4d95
(line_draw_cost): Adapt to new glyph type.
Kim F. Storm <storm@cua.dk>
parents:
91367
diff
changeset
|
2768 } |
1dc7b04a4d95
(line_draw_cost): Adapt to new glyph type.
Kim F. Storm <storm@cua.dk>
parents:
91367
diff
changeset
|
2769 |
1dc7b04a4d95
(line_draw_cost): Adapt to new glyph type.
Kim F. Storm <storm@cua.dk>
parents:
91367
diff
changeset
|
2770 if (GLYPH_FACE (right_border_glyph) <= 0) |
1dc7b04a4d95
(line_draw_cost): Adapt to new glyph type.
Kim F. Storm <storm@cua.dk>
parents:
91367
diff
changeset
|
2771 SET_GLYPH_FACE (right_border_glyph, VERTICAL_BORDER_FACE_ID); |
25012 | 2772 } |
2773 } | |
2774 else | |
2775 window_matrix = w->current_matrix; | |
2776 | |
2777 /* For all rows in the window matrix and corresponding rows in the | |
2778 frame matrix. */ | |
2779 window_y = 0; | |
2780 frame_y = window_matrix->matrix_y; | |
2781 while (window_y < window_matrix->nrows) | |
6642
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
2782 { |
25012 | 2783 struct glyph_row *frame_row = frame_matrix->rows + frame_y; |
2784 struct glyph_row *window_row = window_matrix->rows + window_y; | |
31271
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
2785 int current_row_p = window_matrix == w->current_matrix; |
25012 | 2786 |
2787 /* Fill up the frame row with spaces up to the left margin of the | |
2788 window row. */ | |
2789 fill_up_frame_row_with_spaces (frame_row, window_matrix->matrix_x); | |
2790 | |
2791 /* Fill up areas in the window matrix row with spaces. */ | |
2792 fill_up_glyph_row_with_spaces (window_row); | |
31271
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
2793 |
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
2794 /* If only part of W's desired matrix has been built, and |
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
2795 window_row wasn't displayed, use the corresponding current |
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
2796 row instead. */ |
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
2797 if (window_matrix == w->desired_matrix |
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
2798 && !window_row->enabled_p) |
6682
16ab14205588
(verify_charstarts): Handle truncation of lines.
Richard M. Stallman <rms@gnu.org>
parents:
6648
diff
changeset
|
2799 { |
31271
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
2800 window_row = w->current_matrix->rows + window_y; |
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
2801 current_row_p = 1; |
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
2802 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2803 |
31271
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
2804 if (current_row_p) |
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
2805 { |
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
2806 /* Copy window row to frame row. */ |
25012 | 2807 bcopy (window_row->glyphs[0], |
2808 frame_row->glyphs[TEXT_AREA] + window_matrix->matrix_x, | |
2809 window_matrix->matrix_w * sizeof (struct glyph)); | |
2810 } | |
2811 else | |
2812 { | |
31271
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
2813 xassert (window_row->enabled_p); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2814 |
31271
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
2815 /* Only when a desired row has been displayed, we want |
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
2816 the corresponding frame row to be updated. */ |
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
2817 frame_row->enabled_p = 1; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2818 |
25012 | 2819 /* Maybe insert a vertical border between horizontally adjacent |
2820 windows. */ | |
92276
1dc7b04a4d95
(line_draw_cost): Adapt to new glyph type.
Kim F. Storm <storm@cua.dk>
parents:
91367
diff
changeset
|
2821 if (GLYPH_CHAR (right_border_glyph) != 0) |
25012 | 2822 { |
2823 struct glyph *border = window_row->glyphs[LAST_AREA] - 1; | |
2824 SET_CHAR_GLYPH_FROM_GLYPH (*border, right_border_glyph); | |
2825 } | |
2826 | |
59902
4a0a167cb6c4
(build_frame_matrix_from_leaf_window)
Kim F. Storm <storm@cua.dk>
parents:
59879
diff
changeset
|
2827 #if GLYPH_DEBUG |
27855
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2828 /* Window row window_y must be a slice of frame row |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2829 frame_y. */ |
25012 | 2830 xassert (glyph_row_slice_p (window_row, frame_row)); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2831 |
25012 | 2832 /* If rows are in sync, we don't have to copy glyphs because |
2833 frame and window share glyphs. */ | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2834 |
25241
35674d7c4136
(mirror_make_current): If desired row isn't enabled,
Gerd Moellmann <gerd@gnu.org>
parents:
25190
diff
changeset
|
2835 strcpy (w->current_matrix->method, w->desired_matrix->method); |
34866
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
2836 add_window_display_history (w, w->current_matrix->method, 0); |
25241
35674d7c4136
(mirror_make_current): If desired row isn't enabled,
Gerd Moellmann <gerd@gnu.org>
parents:
25190
diff
changeset
|
2837 #endif |
25012 | 2838 } |
2839 | |
2840 /* Set number of used glyphs in the frame matrix. Since we fill | |
2841 up with spaces, and visit leaf windows from left to right it | |
2842 can be done simply. */ | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2843 frame_row->used[TEXT_AREA] |
25012 | 2844 = window_matrix->matrix_x + window_matrix->matrix_w; |
2845 | |
2846 /* Next row. */ | |
2847 ++window_y; | |
2848 ++frame_y; | |
2849 } | |
2850 } | |
2851 | |
63547
cbb687cf8169
(spec_glyph_lookup_face): New function.
Richard M. Stallman <rms@gnu.org>
parents:
61989
diff
changeset
|
2852 /* Given a user-specified glyph, possibly including a Lisp-level face |
cbb687cf8169
(spec_glyph_lookup_face): New function.
Richard M. Stallman <rms@gnu.org>
parents:
61989
diff
changeset
|
2853 ID, return a glyph that has a realized face ID. |
cbb687cf8169
(spec_glyph_lookup_face): New function.
Richard M. Stallman <rms@gnu.org>
parents:
61989
diff
changeset
|
2854 This is used for glyphs displayed specially and not part of the text; |
cbb687cf8169
(spec_glyph_lookup_face): New function.
Richard M. Stallman <rms@gnu.org>
parents:
61989
diff
changeset
|
2855 for instance, vertical separators, truncation markers, etc. */ |
cbb687cf8169
(spec_glyph_lookup_face): New function.
Richard M. Stallman <rms@gnu.org>
parents:
61989
diff
changeset
|
2856 |
92276
1dc7b04a4d95
(line_draw_cost): Adapt to new glyph type.
Kim F. Storm <storm@cua.dk>
parents:
91367
diff
changeset
|
2857 void |
63547
cbb687cf8169
(spec_glyph_lookup_face): New function.
Richard M. Stallman <rms@gnu.org>
parents:
61989
diff
changeset
|
2858 spec_glyph_lookup_face (w, glyph) |
cbb687cf8169
(spec_glyph_lookup_face): New function.
Richard M. Stallman <rms@gnu.org>
parents:
61989
diff
changeset
|
2859 struct window *w; |
92276
1dc7b04a4d95
(line_draw_cost): Adapt to new glyph type.
Kim F. Storm <storm@cua.dk>
parents:
91367
diff
changeset
|
2860 GLYPH *glyph; |
63547
cbb687cf8169
(spec_glyph_lookup_face): New function.
Richard M. Stallman <rms@gnu.org>
parents:
61989
diff
changeset
|
2861 { |
92276
1dc7b04a4d95
(line_draw_cost): Adapt to new glyph type.
Kim F. Storm <storm@cua.dk>
parents:
91367
diff
changeset
|
2862 int lface_id = GLYPH_FACE (*glyph); |
63547
cbb687cf8169
(spec_glyph_lookup_face): New function.
Richard M. Stallman <rms@gnu.org>
parents:
61989
diff
changeset
|
2863 /* Convert the glyph's specified face to a realized (cache) face. */ |
cbb687cf8169
(spec_glyph_lookup_face): New function.
Richard M. Stallman <rms@gnu.org>
parents:
61989
diff
changeset
|
2864 if (lface_id > 0) |
cbb687cf8169
(spec_glyph_lookup_face): New function.
Richard M. Stallman <rms@gnu.org>
parents:
61989
diff
changeset
|
2865 { |
cbb687cf8169
(spec_glyph_lookup_face): New function.
Richard M. Stallman <rms@gnu.org>
parents:
61989
diff
changeset
|
2866 int face_id = merge_faces (XFRAME (w->frame), |
cbb687cf8169
(spec_glyph_lookup_face): New function.
Richard M. Stallman <rms@gnu.org>
parents:
61989
diff
changeset
|
2867 Qt, lface_id, DEFAULT_FACE_ID); |
92276
1dc7b04a4d95
(line_draw_cost): Adapt to new glyph type.
Kim F. Storm <storm@cua.dk>
parents:
91367
diff
changeset
|
2868 SET_GLYPH_FACE (*glyph, face_id); |
1dc7b04a4d95
(line_draw_cost): Adapt to new glyph type.
Kim F. Storm <storm@cua.dk>
parents:
91367
diff
changeset
|
2869 } |
63547
cbb687cf8169
(spec_glyph_lookup_face): New function.
Richard M. Stallman <rms@gnu.org>
parents:
61989
diff
changeset
|
2870 } |
25012 | 2871 |
2872 /* Add spaces to a glyph row ROW in a window matrix. | |
2873 | |
2874 Each row has the form: | |
2875 | |
2876 +---------+-----------------------------+------------+ | |
2877 | left | text | right | | |
2878 +---------+-----------------------------+------------+ | |
2879 | |
2880 Left and right marginal areas are optional. This function adds | |
2881 spaces to areas so that there are no empty holes between areas. | |
2882 In other words: If the right area is not empty, the text area | |
2883 is filled up with spaces up to the right area. If the text area | |
2884 is not empty, the left area is filled up. | |
2885 | |
2886 To be called for frame-based redisplay, only. */ | |
2887 | |
2888 static void | |
2889 fill_up_glyph_row_with_spaces (row) | |
2890 struct glyph_row *row; | |
2891 { | |
2892 fill_up_glyph_row_area_with_spaces (row, LEFT_MARGIN_AREA); | |
2893 fill_up_glyph_row_area_with_spaces (row, TEXT_AREA); | |
2894 fill_up_glyph_row_area_with_spaces (row, RIGHT_MARGIN_AREA); | |
2895 } | |
2896 | |
2897 | |
2898 /* Fill area AREA of glyph row ROW with spaces. To be called for | |
2899 frame-based redisplay only. */ | |
2900 | |
2901 static void | |
2902 fill_up_glyph_row_area_with_spaces (row, area) | |
2903 struct glyph_row *row; | |
2904 int area; | |
2905 { | |
2906 if (row->glyphs[area] < row->glyphs[area + 1]) | |
2907 { | |
2908 struct glyph *end = row->glyphs[area + 1]; | |
2909 struct glyph *text = row->glyphs[area] + row->used[area]; | |
2910 | |
2911 while (text < end) | |
2912 *text++ = space_glyph; | |
2913 row->used[area] = text - row->glyphs[area]; | |
2914 } | |
2915 } | |
2916 | |
2917 | |
2918 /* Add spaces to the end of ROW in a frame matrix until index UPTO is | |
2919 reached. In frame matrices only one area, TEXT_AREA, is used. */ | |
2920 | |
2921 static void | |
2922 fill_up_frame_row_with_spaces (row, upto) | |
2923 struct glyph_row *row; | |
2924 int upto; | |
2925 { | |
2926 int i = row->used[TEXT_AREA]; | |
2927 struct glyph *glyph = row->glyphs[TEXT_AREA]; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2928 |
25012 | 2929 while (i < upto) |
2930 glyph[i++] = space_glyph; | |
2931 | |
2932 row->used[TEXT_AREA] = i; | |
2933 } | |
2934 | |
2935 | |
2936 | |
2937 /********************************************************************** | |
2938 Mirroring operations on frame matrices in window matrices | |
2939 **********************************************************************/ | |
2940 | |
2941 /* Set frame being updated via frame-based redisplay to F. This | |
2942 function must be called before updates to make explicit that we are | |
2943 working on frame matrices or not. */ | |
2944 | |
2945 static INLINE void | |
2946 set_frame_matrix_frame (f) | |
2947 struct frame *f; | |
2948 { | |
2949 frame_matrix_frame = f; | |
2950 } | |
2951 | |
2952 | |
2953 /* Make sure glyph row ROW in CURRENT_MATRIX is up to date. | |
2954 DESIRED_MATRIX is the desired matrix corresponding to | |
2955 CURRENT_MATRIX. The update is done by exchanging glyph pointers | |
2956 between rows in CURRENT_MATRIX and DESIRED_MATRIX. If | |
2957 frame_matrix_frame is non-null, this indicates that the exchange is | |
2958 done in frame matrices, and that we have to perform analogous | |
2959 operations in window matrices of frame_matrix_frame. */ | |
2960 | |
2961 static INLINE void | |
2962 make_current (desired_matrix, current_matrix, row) | |
2963 struct glyph_matrix *desired_matrix, *current_matrix; | |
2964 int row; | |
2965 { | |
2966 struct glyph_row *current_row = MATRIX_ROW (current_matrix, row); | |
2967 struct glyph_row *desired_row = MATRIX_ROW (desired_matrix, row); | |
30161
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
2968 int mouse_face_p = current_row->mouse_face_p; |
25012 | 2969 |
2970 /* Do current_row = desired_row. This exchanges glyph pointers | |
2971 between both rows, and does a structure assignment otherwise. */ | |
2972 assign_row (current_row, desired_row); | |
2973 | |
2974 /* Enable current_row to mark it as valid. */ | |
2975 current_row->enabled_p = 1; | |
30161
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
2976 current_row->mouse_face_p = mouse_face_p; |
25012 | 2977 |
2978 /* If we are called on frame matrices, perform analogous operations | |
2979 for window matrices. */ | |
2980 if (frame_matrix_frame) | |
2981 mirror_make_current (XWINDOW (frame_matrix_frame->root_window), row); | |
2982 } | |
2983 | |
2984 | |
2985 /* W is the root of a window tree. FRAME_ROW is the index of a row in | |
2986 W's frame which has been made current (by swapping pointers between | |
2987 current and desired matrix). Perform analogous operations in the | |
2988 matrices of leaf windows in the window tree rooted at W. */ | |
2989 | |
2990 static void | |
2991 mirror_make_current (w, frame_row) | |
2992 struct window *w; | |
2993 int frame_row; | |
2994 { | |
2995 while (w) | |
2996 { | |
2997 if (!NILP (w->hchild)) | |
2998 mirror_make_current (XWINDOW (w->hchild), frame_row); | |
2999 else if (!NILP (w->vchild)) | |
3000 mirror_make_current (XWINDOW (w->vchild), frame_row); | |
3001 else | |
3002 { | |
3003 /* Row relative to window W. Don't use FRAME_TO_WINDOW_VPOS | |
3004 here because the checks performed in debug mode there | |
3005 will not allow the conversion. */ | |
3006 int row = frame_row - w->desired_matrix->matrix_y; | |
3007 | |
3008 /* If FRAME_ROW is within W, assign the desired row to the | |
3009 current row (exchanging glyph pointers). */ | |
3010 if (row >= 0 && row < w->desired_matrix->matrix_h) | |
6682
16ab14205588
(verify_charstarts): Handle truncation of lines.
Richard M. Stallman <rms@gnu.org>
parents:
6648
diff
changeset
|
3011 { |
25012 | 3012 struct glyph_row *current_row |
3013 = MATRIX_ROW (w->current_matrix, row); | |
3014 struct glyph_row *desired_row | |
3015 = MATRIX_ROW (w->desired_matrix, row); | |
25241
35674d7c4136
(mirror_make_current): If desired row isn't enabled,
Gerd Moellmann <gerd@gnu.org>
parents:
25190
diff
changeset
|
3016 |
35674d7c4136
(mirror_make_current): If desired row isn't enabled,
Gerd Moellmann <gerd@gnu.org>
parents:
25190
diff
changeset
|
3017 if (desired_row->enabled_p) |
35674d7c4136
(mirror_make_current): If desired row isn't enabled,
Gerd Moellmann <gerd@gnu.org>
parents:
25190
diff
changeset
|
3018 assign_row (current_row, desired_row); |
35674d7c4136
(mirror_make_current): If desired row isn't enabled,
Gerd Moellmann <gerd@gnu.org>
parents:
25190
diff
changeset
|
3019 else |
35674d7c4136
(mirror_make_current): If desired row isn't enabled,
Gerd Moellmann <gerd@gnu.org>
parents:
25190
diff
changeset
|
3020 swap_glyph_pointers (desired_row, current_row); |
25012 | 3021 current_row->enabled_p = 1; |
6682
16ab14205588
(verify_charstarts): Handle truncation of lines.
Richard M. Stallman <rms@gnu.org>
parents:
6648
diff
changeset
|
3022 } |
16ab14205588
(verify_charstarts): Handle truncation of lines.
Richard M. Stallman <rms@gnu.org>
parents:
6648
diff
changeset
|
3023 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3024 |
25012 | 3025 w = NILP (w->next) ? 0 : XWINDOW (w->next); |
6642
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
3026 } |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
3027 } |
25012 | 3028 |
3029 | |
3030 /* Perform row dance after scrolling. We are working on the range of | |
3031 lines UNCHANGED_AT_TOP + 1 to UNCHANGED_AT_TOP + NLINES (not | |
3032 including) in MATRIX. COPY_FROM is a vector containing, for each | |
3033 row I in the range 0 <= I < NLINES, the index of the original line | |
3034 to move to I. This index is relative to the row range, i.e. 0 <= | |
3035 index < NLINES. RETAINED_P is a vector containing zero for each | |
3036 row 0 <= I < NLINES which is empty. | |
3037 | |
3038 This function is called from do_scrolling and do_direct_scrolling. */ | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3039 |
25012 | 3040 void |
3041 mirrored_line_dance (matrix, unchanged_at_top, nlines, copy_from, | |
3042 retained_p) | |
3043 struct glyph_matrix *matrix; | |
3044 int unchanged_at_top, nlines; | |
3045 int *copy_from; | |
3046 char *retained_p; | |
3047 { | |
3048 /* A copy of original rows. */ | |
3049 struct glyph_row *old_rows; | |
3050 | |
3051 /* Rows to assign to. */ | |
3052 struct glyph_row *new_rows = MATRIX_ROW (matrix, unchanged_at_top); | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3053 |
25012 | 3054 int i; |
3055 | |
3056 /* Make a copy of the original rows. */ | |
3057 old_rows = (struct glyph_row *) alloca (nlines * sizeof *old_rows); | |
3058 bcopy (new_rows, old_rows, nlines * sizeof *old_rows); | |
3059 | |
3060 /* Assign new rows, maybe clear lines. */ | |
3061 for (i = 0; i < nlines; ++i) | |
3062 { | |
3063 int enabled_before_p = new_rows[i].enabled_p; | |
3064 | |
3065 xassert (i + unchanged_at_top < matrix->nrows); | |
3066 xassert (unchanged_at_top + copy_from[i] < matrix->nrows); | |
3067 new_rows[i] = old_rows[copy_from[i]]; | |
3068 new_rows[i].enabled_p = enabled_before_p; | |
3069 | |
3070 /* RETAINED_P is zero for empty lines. */ | |
3071 if (!retained_p[copy_from[i]]) | |
3072 new_rows[i].enabled_p = 0; | |
3073 } | |
3074 | |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
3075 /* Do the same for window matrices, if MATRIX is a frame matrix. */ |
25012 | 3076 if (frame_matrix_frame) |
3077 mirror_line_dance (XWINDOW (frame_matrix_frame->root_window), | |
3078 unchanged_at_top, nlines, copy_from, retained_p); | |
3079 } | |
3080 | |
3081 | |
27855
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3082 /* Synchronize glyph pointers in the current matrix of window W with |
40214
a87bf217f5a6
(sync_window_with_frame_matrix_rows): Fix
Gerd Moellmann <gerd@gnu.org>
parents:
40075
diff
changeset
|
3083 the current frame matrix. */ |
27855
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3084 |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3085 static void |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3086 sync_window_with_frame_matrix_rows (w) |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3087 struct window *w; |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3088 { |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3089 struct frame *f = XFRAME (w->frame); |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3090 struct glyph_row *window_row, *window_row_end, *frame_row; |
40271
ae4848857075
(sync_window_with_frame_matrix_rows): Remove unused variable `area'.
Pavel Janík <Pavel@Janik.cz>
parents:
40214
diff
changeset
|
3091 int left, right, x, width; |
40214
a87bf217f5a6
(sync_window_with_frame_matrix_rows): Fix
Gerd Moellmann <gerd@gnu.org>
parents:
40075
diff
changeset
|
3092 |
a87bf217f5a6
(sync_window_with_frame_matrix_rows): Fix
Gerd Moellmann <gerd@gnu.org>
parents:
40075
diff
changeset
|
3093 /* Preconditions: W must be a leaf window on a tty frame. */ |
27855
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3094 xassert (NILP (w->hchild) && NILP (w->vchild)); |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3095 xassert (!FRAME_WINDOW_P (f)); |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3096 |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
3097 left = margin_glyphs_to_reserve (w, 1, w->left_margin_cols); |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
3098 right = margin_glyphs_to_reserve (w, 1, w->right_margin_cols); |
40214
a87bf217f5a6
(sync_window_with_frame_matrix_rows): Fix
Gerd Moellmann <gerd@gnu.org>
parents:
40075
diff
changeset
|
3099 x = w->current_matrix->matrix_x; |
a87bf217f5a6
(sync_window_with_frame_matrix_rows): Fix
Gerd Moellmann <gerd@gnu.org>
parents:
40075
diff
changeset
|
3100 width = w->current_matrix->matrix_w; |
a87bf217f5a6
(sync_window_with_frame_matrix_rows): Fix
Gerd Moellmann <gerd@gnu.org>
parents:
40075
diff
changeset
|
3101 |
27855
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3102 window_row = w->current_matrix->rows; |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3103 window_row_end = window_row + w->current_matrix->nrows; |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
3104 frame_row = f->current_matrix->rows + WINDOW_TOP_EDGE_LINE (w); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3105 |
40214
a87bf217f5a6
(sync_window_with_frame_matrix_rows): Fix
Gerd Moellmann <gerd@gnu.org>
parents:
40075
diff
changeset
|
3106 for (; window_row < window_row_end; ++window_row, ++frame_row) |
27855
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3107 { |
40214
a87bf217f5a6
(sync_window_with_frame_matrix_rows): Fix
Gerd Moellmann <gerd@gnu.org>
parents:
40075
diff
changeset
|
3108 window_row->glyphs[LEFT_MARGIN_AREA] |
a87bf217f5a6
(sync_window_with_frame_matrix_rows): Fix
Gerd Moellmann <gerd@gnu.org>
parents:
40075
diff
changeset
|
3109 = frame_row->glyphs[0] + x; |
a87bf217f5a6
(sync_window_with_frame_matrix_rows): Fix
Gerd Moellmann <gerd@gnu.org>
parents:
40075
diff
changeset
|
3110 window_row->glyphs[TEXT_AREA] |
a87bf217f5a6
(sync_window_with_frame_matrix_rows): Fix
Gerd Moellmann <gerd@gnu.org>
parents:
40075
diff
changeset
|
3111 = window_row->glyphs[LEFT_MARGIN_AREA] + left; |
a87bf217f5a6
(sync_window_with_frame_matrix_rows): Fix
Gerd Moellmann <gerd@gnu.org>
parents:
40075
diff
changeset
|
3112 window_row->glyphs[LAST_AREA] |
a87bf217f5a6
(sync_window_with_frame_matrix_rows): Fix
Gerd Moellmann <gerd@gnu.org>
parents:
40075
diff
changeset
|
3113 = window_row->glyphs[LEFT_MARGIN_AREA] + width; |
a87bf217f5a6
(sync_window_with_frame_matrix_rows): Fix
Gerd Moellmann <gerd@gnu.org>
parents:
40075
diff
changeset
|
3114 window_row->glyphs[RIGHT_MARGIN_AREA] |
a87bf217f5a6
(sync_window_with_frame_matrix_rows): Fix
Gerd Moellmann <gerd@gnu.org>
parents:
40075
diff
changeset
|
3115 = window_row->glyphs[LAST_AREA] - right; |
27855
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3116 } |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3117 } |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3118 |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3119 |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3120 /* Return the window in the window tree rooted in W containing frame |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3121 row ROW. Value is null if none is found. */ |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3122 |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3123 struct window * |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3124 frame_row_to_window (w, row) |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3125 struct window *w; |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3126 int row; |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3127 { |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3128 struct window *found = NULL; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3129 |
27855
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3130 while (w && !found) |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3131 { |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3132 if (!NILP (w->hchild)) |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3133 found = frame_row_to_window (XWINDOW (w->hchild), row); |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3134 else if (!NILP (w->vchild)) |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3135 found = frame_row_to_window (XWINDOW (w->vchild), row); |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
3136 else if (row >= WINDOW_TOP_EDGE_LINE (w) |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
3137 && row < WINDOW_BOTTOM_EDGE_LINE (w)) |
27855
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3138 found = w; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3139 |
27855
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3140 w = NILP (w->next) ? 0 : XWINDOW (w->next); |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3141 } |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3142 |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3143 return found; |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3144 } |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3145 |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3146 |
25012 | 3147 /* Perform a line dance in the window tree rooted at W, after |
3148 scrolling a frame matrix in mirrored_line_dance. | |
3149 | |
3150 We are working on the range of lines UNCHANGED_AT_TOP + 1 to | |
3151 UNCHANGED_AT_TOP + NLINES (not including) in W's frame matrix. | |
3152 COPY_FROM is a vector containing, for each row I in the range 0 <= | |
3153 I < NLINES, the index of the original line to move to I. This | |
3154 index is relative to the row range, i.e. 0 <= index < NLINES. | |
3155 RETAINED_P is a vector containing zero for each row 0 <= I < NLINES | |
3156 which is empty. */ | |
3157 | |
3158 static void | |
3159 mirror_line_dance (w, unchanged_at_top, nlines, copy_from, retained_p) | |
3160 struct window *w; | |
3161 int unchanged_at_top, nlines; | |
3162 int *copy_from; | |
3163 char *retained_p; | |
3164 { | |
3165 while (w) | |
3166 { | |
3167 if (!NILP (w->hchild)) | |
3168 mirror_line_dance (XWINDOW (w->hchild), unchanged_at_top, | |
3169 nlines, copy_from, retained_p); | |
3170 else if (!NILP (w->vchild)) | |
3171 mirror_line_dance (XWINDOW (w->vchild), unchanged_at_top, | |
3172 nlines, copy_from, retained_p); | |
3173 else | |
3174 { | |
3175 /* W is a leaf window, and we are working on its current | |
3176 matrix m. */ | |
3177 struct glyph_matrix *m = w->current_matrix; | |
27855
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3178 int i, sync_p = 0; |
25012 | 3179 struct glyph_row *old_rows; |
3180 | |
3181 /* Make a copy of the original rows of matrix m. */ | |
3182 old_rows = (struct glyph_row *) alloca (m->nrows * sizeof *old_rows); | |
3183 bcopy (m->rows, old_rows, m->nrows * sizeof *old_rows); | |
3184 | |
3185 for (i = 0; i < nlines; ++i) | |
3186 { | |
3187 /* Frame relative line assigned to. */ | |
3188 int frame_to = i + unchanged_at_top; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3189 |
25012 | 3190 /* Frame relative line assigned. */ |
3191 int frame_from = copy_from[i] + unchanged_at_top; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3192 |
25012 | 3193 /* Window relative line assigned to. */ |
3194 int window_to = frame_to - m->matrix_y; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3195 |
25012 | 3196 /* Window relative line assigned. */ |
3197 int window_from = frame_from - m->matrix_y; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3198 |
25012 | 3199 /* Is assigned line inside window? */ |
3200 int from_inside_window_p | |
3201 = window_from >= 0 && window_from < m->matrix_h; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3202 |
27855
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3203 /* Is assigned to line inside window? */ |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3204 int to_inside_window_p |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3205 = window_to >= 0 && window_to < m->matrix_h; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3206 |
27855
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3207 if (from_inside_window_p && to_inside_window_p) |
25012 | 3208 { |
3209 /* Enabled setting before assignment. */ | |
3210 int enabled_before_p; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3211 |
25012 | 3212 /* Do the assignment. The enabled_p flag is saved |
3213 over the assignment because the old redisplay did | |
3214 that. */ | |
3215 enabled_before_p = m->rows[window_to].enabled_p; | |
3216 m->rows[window_to] = old_rows[window_from]; | |
3217 m->rows[window_to].enabled_p = enabled_before_p; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3218 |
25012 | 3219 /* If frame line is empty, window line is empty, too. */ |
3220 if (!retained_p[copy_from[i]]) | |
3221 m->rows[window_to].enabled_p = 0; | |
3222 } | |
27855
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3223 else if (to_inside_window_p) |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3224 { |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3225 /* A copy between windows. This is an infrequent |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3226 case not worth optimizing. */ |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3227 struct frame *f = XFRAME (w->frame); |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3228 struct window *root = XWINDOW (FRAME_ROOT_WINDOW (f)); |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3229 struct window *w2; |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3230 struct glyph_matrix *m2; |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3231 int m2_from; |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3232 |
60684
18bf961ed63a
(mirror_line_dance): Set W2 according to FRAME_FROM.
Richard M. Stallman <rms@gnu.org>
parents:
59905
diff
changeset
|
3233 w2 = frame_row_to_window (root, frame_from); |
61416
89b8166ef056
(mirror_line_dance): Avoid crash if W2 is null.
Richard M. Stallman <rms@gnu.org>
parents:
60684
diff
changeset
|
3234 /* ttn@surf.glug.org: when enabling menu bar using `emacs |
89b8166ef056
(mirror_line_dance): Avoid crash if W2 is null.
Richard M. Stallman <rms@gnu.org>
parents:
60684
diff
changeset
|
3235 -nw', FROM_FRAME sometimes has no associated window. |
89b8166ef056
(mirror_line_dance): Avoid crash if W2 is null.
Richard M. Stallman <rms@gnu.org>
parents:
60684
diff
changeset
|
3236 This check avoids a segfault if W2 is null. */ |
89b8166ef056
(mirror_line_dance): Avoid crash if W2 is null.
Richard M. Stallman <rms@gnu.org>
parents:
60684
diff
changeset
|
3237 if (w2) |
89b8166ef056
(mirror_line_dance): Avoid crash if W2 is null.
Richard M. Stallman <rms@gnu.org>
parents:
60684
diff
changeset
|
3238 { |
89b8166ef056
(mirror_line_dance): Avoid crash if W2 is null.
Richard M. Stallman <rms@gnu.org>
parents:
60684
diff
changeset
|
3239 m2 = w2->current_matrix; |
89b8166ef056
(mirror_line_dance): Avoid crash if W2 is null.
Richard M. Stallman <rms@gnu.org>
parents:
60684
diff
changeset
|
3240 m2_from = frame_from - m2->matrix_y; |
89b8166ef056
(mirror_line_dance): Avoid crash if W2 is null.
Richard M. Stallman <rms@gnu.org>
parents:
60684
diff
changeset
|
3241 copy_row_except_pointers (m->rows + window_to, |
89b8166ef056
(mirror_line_dance): Avoid crash if W2 is null.
Richard M. Stallman <rms@gnu.org>
parents:
60684
diff
changeset
|
3242 m2->rows + m2_from); |
89b8166ef056
(mirror_line_dance): Avoid crash if W2 is null.
Richard M. Stallman <rms@gnu.org>
parents:
60684
diff
changeset
|
3243 |
89b8166ef056
(mirror_line_dance): Avoid crash if W2 is null.
Richard M. Stallman <rms@gnu.org>
parents:
60684
diff
changeset
|
3244 /* If frame line is empty, window line is empty, too. */ |
89b8166ef056
(mirror_line_dance): Avoid crash if W2 is null.
Richard M. Stallman <rms@gnu.org>
parents:
60684
diff
changeset
|
3245 if (!retained_p[copy_from[i]]) |
89b8166ef056
(mirror_line_dance): Avoid crash if W2 is null.
Richard M. Stallman <rms@gnu.org>
parents:
60684
diff
changeset
|
3246 m->rows[window_to].enabled_p = 0; |
89b8166ef056
(mirror_line_dance): Avoid crash if W2 is null.
Richard M. Stallman <rms@gnu.org>
parents:
60684
diff
changeset
|
3247 } |
27855
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3248 sync_p = 1; |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3249 } |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3250 else if (from_inside_window_p) |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3251 sync_p = 1; |
25012 | 3252 } |
27855
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3253 |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3254 /* If there was a copy between windows, make sure glyph |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3255 pointers are in sync with the frame matrix. */ |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3256 if (sync_p) |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3257 sync_window_with_frame_matrix_rows (w); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3258 |
25012 | 3259 /* Check that no pointers are lost. */ |
3260 CHECK_MATRIX (m); | |
3261 } | |
3262 | |
3263 /* Next window on same level. */ | |
3264 w = NILP (w->next) ? 0 : XWINDOW (w->next); | |
3265 } | |
3266 } | |
3267 | |
3268 | |
3269 #if GLYPH_DEBUG | |
3270 | |
3271 /* Check that window and frame matrices agree about their | |
3272 understanding where glyphs of the rows are to find. For each | |
3273 window in the window tree rooted at W, check that rows in the | |
3274 matrices of leaf window agree with their frame matrices about | |
3275 glyph pointers. */ | |
314 | 3276 |
21514 | 3277 void |
25012 | 3278 check_window_matrix_pointers (w) |
314 | 3279 struct window *w; |
3280 { | |
25012 | 3281 while (w) |
3282 { | |
3283 if (!NILP (w->hchild)) | |
3284 check_window_matrix_pointers (XWINDOW (w->hchild)); | |
3285 else if (!NILP (w->vchild)) | |
3286 check_window_matrix_pointers (XWINDOW (w->vchild)); | |
3287 else | |
3288 { | |
3289 struct frame *f = XFRAME (w->frame); | |
3290 check_matrix_pointers (w->desired_matrix, f->desired_matrix); | |
3291 check_matrix_pointers (w->current_matrix, f->current_matrix); | |
3292 } | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3293 |
25012 | 3294 w = NILP (w->next) ? 0 : XWINDOW (w->next); |
3295 } | |
3296 } | |
3297 | |
3298 | |
3299 /* Check that window rows are slices of frame rows. WINDOW_MATRIX is | |
3300 a window and FRAME_MATRIX is the corresponding frame matrix. For | |
3301 each row in WINDOW_MATRIX check that it's a slice of the | |
3302 corresponding frame row. If it isn't, abort. */ | |
3303 | |
3304 static void | |
3305 check_matrix_pointers (window_matrix, frame_matrix) | |
3306 struct glyph_matrix *window_matrix, *frame_matrix; | |
3307 { | |
3308 /* Row number in WINDOW_MATRIX. */ | |
3309 int i = 0; | |
3310 | |
3311 /* Row number corresponding to I in FRAME_MATRIX. */ | |
3312 int j = window_matrix->matrix_y; | |
3313 | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3314 /* For all rows check that the row in the window matrix is a |
25012 | 3315 slice of the row in the frame matrix. If it isn't we didn't |
3316 mirror an operation on the frame matrix correctly. */ | |
3317 while (i < window_matrix->nrows) | |
3318 { | |
3319 if (!glyph_row_slice_p (window_matrix->rows + i, | |
3320 frame_matrix->rows + j)) | |
3321 abort (); | |
3322 ++i, ++j; | |
3323 } | |
3324 } | |
3325 | |
3326 #endif /* GLYPH_DEBUG != 0 */ | |
3327 | |
3328 | |
3329 | |
3330 /********************************************************************** | |
3331 VPOS and HPOS translations | |
3332 **********************************************************************/ | |
3333 | |
3334 #if GLYPH_DEBUG | |
3335 | |
3336 /* Translate vertical position VPOS which is relative to window W to a | |
3337 vertical position relative to W's frame. */ | |
3338 | |
3339 static int | |
3340 window_to_frame_vpos (w, vpos) | |
3341 struct window *w; | |
3342 int vpos; | |
3343 { | |
3344 struct frame *f = XFRAME (w->frame); | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3345 |
25012 | 3346 xassert (!FRAME_WINDOW_P (f)); |
3347 xassert (vpos >= 0 && vpos <= w->desired_matrix->nrows); | |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
3348 vpos += WINDOW_TOP_EDGE_LINE (w); |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
3349 xassert (vpos >= 0 && vpos <= FRAME_LINES (f)); |
25012 | 3350 return vpos; |
3351 } | |
3352 | |
3353 | |
3354 /* Translate horizontal position HPOS which is relative to window W to | |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
3355 a horizontal position relative to W's frame. */ |
25012 | 3356 |
3357 static int | |
3358 window_to_frame_hpos (w, hpos) | |
3359 struct window *w; | |
3360 int hpos; | |
3361 { | |
65308
7b2a711dc863
(window_to_frame_hpos, update_window):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
65016
diff
changeset
|
3362 xassert (!FRAME_WINDOW_P (XFRAME (w->frame))); |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
3363 hpos += WINDOW_LEFT_EDGE_COL (w); |
25012 | 3364 return hpos; |
314 | 3365 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3366 |
25012 | 3367 #endif /* GLYPH_DEBUG */ |
3368 | |
3369 | |
314 | 3370 |
25012 | 3371 /********************************************************************** |
3372 Redrawing Frames | |
3373 **********************************************************************/ | |
3374 | |
3375 DEFUN ("redraw-frame", Fredraw_frame, Sredraw_frame, 1, 1, 0, | |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
3376 doc: /* Clear frame FRAME and output again what is supposed to appear on it. */) |
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
3377 (frame) |
25012 | 3378 Lisp_Object frame; |
3379 { | |
3380 struct frame *f; | |
3381 | |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40512
diff
changeset
|
3382 CHECK_LIVE_FRAME (frame); |
25012 | 3383 f = XFRAME (frame); |
3384 | |
3385 /* Ignore redraw requests, if frame has no glyphs yet. | |
3386 (Implementation note: It still has to be checked why we are | |
3387 called so early here). */ | |
3388 if (!glyphs_initialized_initially_p) | |
3389 return Qnil; | |
3390 | |
3391 update_begin (f); | |
83008
040dd41ed7d0
Hookified termcap devices, added bootstrap display device, plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
83004
diff
changeset
|
3392 #ifdef MSDOS |
35445
9af454aee182
(Fredraw_frame): Remove reference to
Andrew Innes <andrewi@gnu.org>
parents:
35374
diff
changeset
|
3393 if (FRAME_MSDOS_P (f)) |
97646
fab72f02d115
(init_display): Remove MS-DOS specific conditions for calling
Eli Zaretskii <eliz@gnu.org>
parents:
97142
diff
changeset
|
3394 FRAME_TERMINAL (f)->set_terminal_modes_hook (FRAME_TERMINAL (f)); |
83008
040dd41ed7d0
Hookified termcap devices, added bootstrap display device, plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
83004
diff
changeset
|
3395 #endif |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83098
diff
changeset
|
3396 clear_frame (f); |
25012 | 3397 clear_current_matrices (f); |
3398 update_end (f); | |
82990
2ecd1f669db9
Fixed X support, preliminary support for X-tty combo sessions.
Karoly Lorentey <lorentey@elte.hu>
parents:
82989
diff
changeset
|
3399 if (FRAME_TERMCAP_P (f)) |
83065
a871be7b26a5
Implemented suspending of emacsclient frames.
Karoly Lorentey <lorentey@elte.hu>
parents:
83037
diff
changeset
|
3400 fflush (FRAME_TTY (f)->output); |
25012 | 3401 windows_or_buffers_changed++; |
3402 /* Mark all windows as inaccurate, so that every window will have | |
3403 its redisplay done. */ | |
3404 mark_window_display_accurate (FRAME_ROOT_WINDOW (f), 0); | |
3405 set_window_update_flags (XWINDOW (FRAME_ROOT_WINDOW (f)), 1); | |
3406 f->garbaged = 0; | |
3407 return Qnil; | |
3408 } | |
3409 | |
3410 | |
3411 /* Redraw frame F. This is nothing more than a call to the Lisp | |
3412 function redraw-frame. */ | |
3413 | |
3414 void | |
3415 redraw_frame (f) | |
3416 struct frame *f; | |
3417 { | |
3418 Lisp_Object frame; | |
3419 XSETFRAME (frame, f); | |
3420 Fredraw_frame (frame); | |
3421 } | |
3422 | |
3423 | |
3424 DEFUN ("redraw-display", Fredraw_display, Sredraw_display, 0, 0, "", | |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
3425 doc: /* Clear and redisplay all visible frames. */) |
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
3426 () |
25012 | 3427 { |
3428 Lisp_Object tail, frame; | |
3429 | |
3430 FOR_EACH_FRAME (tail, frame) | |
3431 if (FRAME_VISIBLE_P (XFRAME (frame))) | |
3432 Fredraw_frame (frame); | |
3433 | |
3434 return Qnil; | |
3435 } | |
3436 | |
3437 | |
3438 /* This is used when frame_garbaged is set. Call Fredraw_frame on all | |
3439 visible frames marked as garbaged. */ | |
3440 | |
3441 void | |
3442 redraw_garbaged_frames () | |
3443 { | |
3444 Lisp_Object tail, frame; | |
3445 | |
3446 FOR_EACH_FRAME (tail, frame) | |
3447 if (FRAME_VISIBLE_P (XFRAME (frame)) | |
3448 && FRAME_GARBAGED_P (XFRAME (frame))) | |
3449 Fredraw_frame (frame); | |
3450 } | |
3451 | |
3452 | |
3453 | |
3454 /*********************************************************************** | |
3455 Direct Operations | |
3456 ***********************************************************************/ | |
3457 | |
3458 /* Try to update display and current glyph matrix directly. | |
3459 | |
3460 This function is called after a character G has been inserted into | |
3461 current_buffer. It tries to update the current glyph matrix and | |
3462 perform appropriate screen output to reflect the insertion. If it | |
3463 succeeds, the global flag redisplay_performed_directly_p will be | |
3464 set to 1, and thereby prevent the more costly general redisplay | |
3465 from running (see redisplay_internal). | |
3466 | |
3467 This function is not called for `hairy' character insertions. | |
3468 In particular, it is not called when after or before change | |
3469 functions exist, like they are used by font-lock. See keyboard.c | |
3470 for details where this function is called. */ | |
314 | 3471 |
3472 int | |
3473 direct_output_for_insert (g) | |
3474 int g; | |
3475 { | |
25666
063da8f6a487
(selected_frame): Make it a Lisp_Object.
Gerd Moellmann <gerd@gnu.org>
parents:
25546
diff
changeset
|
3476 register struct frame *f = SELECTED_FRAME (); |
25012 | 3477 struct window *w = XWINDOW (selected_window); |
3478 struct it it, it2; | |
3479 struct glyph_row *glyph_row; | |
3480 struct glyph *glyphs, *glyph, *end; | |
3481 int n; | |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
3482 /* Non-null means that redisplay of W is based on window matrices. */ |
25012 | 3483 int window_redisplay_p = FRAME_WINDOW_P (f); |
3484 /* Non-null means we are in overwrite mode. */ | |
3485 int overwrite_p = !NILP (current_buffer->overwrite_mode); | |
3486 int added_width; | |
3487 struct text_pos pos; | |
3488 int delta, delta_bytes; | |
3489 | |
3490 /* Not done directly. */ | |
3491 redisplay_performed_directly_p = 0; | |
3492 | |
3493 /* Quickly give up for some common cases. */ | |
3494 if (cursor_in_echo_area | |
3495 /* Give up if fonts have changed. */ | |
3496 || fonts_changed_p | |
3497 /* Give up if face attributes have been changed. */ | |
3498 || face_change_count | |
3499 /* Give up if cursor position not really known. */ | |
314 | 3500 || !display_completed |
25012 | 3501 /* Give up if buffer appears in two places. */ |
314 | 3502 || buffer_shared > 1 |
34715
fc3693bea815
(direct_output_for_insert): Fix check for mini-window
Gerd Moellmann <gerd@gnu.org>
parents:
34622
diff
changeset
|
3503 /* Give up if currently displaying a message instead of the |
fc3693bea815
(direct_output_for_insert): Fix check for mini-window
Gerd Moellmann <gerd@gnu.org>
parents:
34622
diff
changeset
|
3504 minibuffer contents. */ |
fc3693bea815
(direct_output_for_insert): Fix check for mini-window
Gerd Moellmann <gerd@gnu.org>
parents:
34622
diff
changeset
|
3505 || (EQ (selected_window, minibuf_window) |
fc3693bea815
(direct_output_for_insert): Fix check for mini-window
Gerd Moellmann <gerd@gnu.org>
parents:
34622
diff
changeset
|
3506 && EQ (minibuf_window, echo_area_window)) |
25012 | 3507 /* Give up for hscrolled mini-buffer because display of the prompt |
3508 is handled specially there (see display_line). */ | |
3509 || (MINI_WINDOW_P (w) && XFASTINT (w->hscroll)) | |
3510 /* Give up if overwriting in the middle of a line. */ | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3511 || (overwrite_p |
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3512 && PT != ZV |
25012 | 3513 && FETCH_BYTE (PT) != '\n') |
3514 /* Give up for tabs and line ends. */ | |
3515 || g == '\t' | |
3516 || g == '\n' | |
3517 || g == '\r' | |
96236
8a7483c32b73
(direct_output_for_insert): Avoid direct output when inserting a space
Chong Yidong <cyd@stupidchicken.com>
parents:
95639
diff
changeset
|
3518 || (g == ' ' && !NILP (current_buffer->word_wrap)) |
25012 | 3519 /* Give up if unable to display the cursor in the window. */ |
3520 || w->cursor.vpos < 0 | |
36279
1e3dc8692936
(direct_output_for_insert): Give up if we are showing
Gerd Moellmann <gerd@gnu.org>
parents:
36115
diff
changeset
|
3521 /* Give up if we are showing a message or just cleared the message |
1e3dc8692936
(direct_output_for_insert): Give up if we are showing
Gerd Moellmann <gerd@gnu.org>
parents:
36115
diff
changeset
|
3522 because we might need to resize the echo area window. */ |
1e3dc8692936
(direct_output_for_insert): Give up if we are showing
Gerd Moellmann <gerd@gnu.org>
parents:
36115
diff
changeset
|
3523 || !NILP (echo_area_buffer[0]) |
1e3dc8692936
(direct_output_for_insert): Give up if we are showing
Gerd Moellmann <gerd@gnu.org>
parents:
36115
diff
changeset
|
3524 || !NILP (echo_area_buffer[1]) |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3525 || (glyph_row = MATRIX_ROW (w->current_matrix, w->cursor.vpos), |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3526 /* Can't do it in a continued line because continuation |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3527 lines would change. */ |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3528 (glyph_row->continued_p |
53605
7dfd96e25ec6
(row_equal_p, update_window_line): Compare fringe bitmaps
Kim F. Storm <storm@cua.dk>
parents:
53514
diff
changeset
|
3529 || glyph_row->exact_window_width_line_p |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3530 /* Can't use this method if the line overlaps others or is |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3531 overlapped by others because these other lines would |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3532 have to be redisplayed. */ |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3533 || glyph_row->overlapping_p |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3534 || glyph_row->overlapped_p)) |
25012 | 3535 /* Can't do it for partial width windows on terminal frames |
3536 because we can't clear to eol in such a window. */ | |
3537 || (!window_redisplay_p && !WINDOW_FULL_WIDTH_P (w))) | |
3538 return 0; | |
3539 | |
35374
3fc8f4c6ed56
(direct_output_for_insert): If char_ins_del_ok is
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
3540 /* If we can't insert glyphs, we can use this method only |
3fc8f4c6ed56
(direct_output_for_insert): If char_ins_del_ok is
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
3541 at the end of a line. */ |
82990
2ecd1f669db9
Fixed X support, preliminary support for X-tty combo sessions.
Karoly Lorentey <lorentey@elte.hu>
parents:
82989
diff
changeset
|
3542 if (!FRAME_CHAR_INS_DEL_OK (f)) |
35374
3fc8f4c6ed56
(direct_output_for_insert): If char_ins_del_ok is
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
3543 if (PT != ZV && FETCH_BYTE (PT_BYTE) != '\n') |
3fc8f4c6ed56
(direct_output_for_insert): If char_ins_del_ok is
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
3544 return 0; |
3fc8f4c6ed56
(direct_output_for_insert): If char_ins_del_ok is
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
3545 |
25012 | 3546 /* Set up a display iterator structure for W. Glyphs will be |
3547 produced in scratch_glyph_row. Current position is W's cursor | |
3548 position. */ | |
3549 clear_glyph_row (&scratch_glyph_row); | |
3550 SET_TEXT_POS (pos, PT, PT_BYTE); | |
28361
eccb57c44da5
(direct_output_for_insert): Use DEC_TEXT_POS
Gerd Moellmann <gerd@gnu.org>
parents:
27968
diff
changeset
|
3551 DEC_TEXT_POS (pos, !NILP (current_buffer->enable_multibyte_characters)); |
25012 | 3552 init_iterator (&it, w, CHARPOS (pos), BYTEPOS (pos), &scratch_glyph_row, |
3553 DEFAULT_FACE_ID); | |
3554 | |
3555 glyph_row = MATRIX_ROW (w->current_matrix, w->cursor.vpos); | |
30161
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
3556 if (glyph_row->mouse_face_p) |
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
3557 return 0; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3558 |
25012 | 3559 /* Give up if highlighting trailing whitespace and we have trailing |
3560 whitespace in glyph_row. We would have to remove the trailing | |
3561 whitespace face in that case. */ | |
25304
4b75c26bd356
(direct_output_for_insert): Use
Gerd Moellmann <gerd@gnu.org>
parents:
25241
diff
changeset
|
3562 if (!NILP (Vshow_trailing_whitespace) |
25012 | 3563 && glyph_row->used[TEXT_AREA]) |
3564 { | |
3565 struct glyph *last; | |
3566 | |
3567 last = glyph_row->glyphs[TEXT_AREA] + glyph_row->used[TEXT_AREA] - 1; | |
3568 if (last->type == STRETCH_GLYPH | |
3569 || (last->type == CHAR_GLYPH | |
26998
02e902f732d1
(line_hash_code) (direct_output_for_insert): Adjusted
Kenichi Handa <handa@m17n.org>
parents:
26902
diff
changeset
|
3570 && last->u.ch == ' ')) |
25012 | 3571 return 0; |
3572 } | |
3573 | |
3574 /* Give up if there are overlay strings at pos. This would fail | |
3575 if the overlay string has newlines in it. */ | |
3576 if (STRINGP (it.string)) | |
3577 return 0; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3578 |
25012 | 3579 it.hpos = w->cursor.hpos; |
3580 it.vpos = w->cursor.vpos; | |
3581 it.current_x = w->cursor.x + it.first_visible_x; | |
3582 it.current_y = w->cursor.y; | |
3583 it.end_charpos = PT; | |
3584 it.stop_charpos = min (PT, it.stop_charpos); | |
39226
d86fe98ee7d5
(direct_output_for_insert): Don't change IT's
Gerd Moellmann <gerd@gnu.org>
parents:
38988
diff
changeset
|
3585 it.stop_charpos = max (IT_CHARPOS (it), it.stop_charpos); |
25012 | 3586 |
3587 /* More than one display element may be returned for PT - 1 if | |
3588 (i) it's a control character which is translated into `\003' or | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3589 `^C', or (ii) it has a display table entry, or (iii) it's a |
25012 | 3590 combination of both. */ |
3591 delta = delta_bytes = 0; | |
3592 while (get_next_display_element (&it)) | |
3593 { | |
3594 PRODUCE_GLYPHS (&it); | |
3595 | |
3596 /* Give up if glyph doesn't fit completely on the line. */ | |
3597 if (it.current_x >= it.last_visible_x) | |
3598 return 0; | |
3599 | |
3600 /* Give up if new glyph has different ascent or descent than | |
3601 the original row, or if it is not a character glyph. */ | |
3602 if (glyph_row->ascent != it.ascent | |
3603 || glyph_row->height != it.ascent + it.descent | |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3604 || glyph_row->phys_ascent != it.phys_ascent |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3605 || glyph_row->phys_height != it.phys_ascent + it.phys_descent |
25012 | 3606 || it.what != IT_CHARACTER) |
3607 return 0; | |
3608 | |
3609 delta += 1; | |
3610 delta_bytes += it.len; | |
32468
20788c8274cd
(direct_output_for_insert): Call set_iterator_to_next
Gerd Moellmann <gerd@gnu.org>
parents:
31932
diff
changeset
|
3611 set_iterator_to_next (&it, 1); |
25012 | 3612 } |
3613 | |
3614 /* Give up if we hit the right edge of the window. We would have | |
3615 to insert truncation or continuation glyphs. */ | |
3616 added_width = it.current_x - (w->cursor.x + it.first_visible_x); | |
3617 if (glyph_row->pixel_width + added_width >= it.last_visible_x) | |
314 | 3618 return 0; |
3619 | |
25012 | 3620 /* Give up if there is a \t following in the line. */ |
3621 it2 = it; | |
3622 it2.end_charpos = ZV; | |
3623 it2.stop_charpos = min (it2.stop_charpos, ZV); | |
3624 while (get_next_display_element (&it2) | |
3625 && !ITERATOR_AT_END_OF_LINE_P (&it2)) | |
3626 { | |
3627 if (it2.c == '\t') | |
3628 return 0; | |
32468
20788c8274cd
(direct_output_for_insert): Call set_iterator_to_next
Gerd Moellmann <gerd@gnu.org>
parents:
31932
diff
changeset
|
3629 set_iterator_to_next (&it2, 1); |
25012 | 3630 } |
3631 | |
3632 /* Number of new glyphs produced. */ | |
3633 n = it.glyph_row->used[TEXT_AREA]; | |
3634 | |
3635 /* Start and end of glyphs in original row. */ | |
3636 glyphs = glyph_row->glyphs[TEXT_AREA] + w->cursor.hpos; | |
3637 end = glyph_row->glyphs[1 + TEXT_AREA]; | |
3638 | |
3639 /* Make room for new glyphs, then insert them. */ | |
3640 xassert (end - glyphs - n >= 0); | |
25781
e5579bc77d9e
(direct_output_for_insert): Cast arguments to
Gerd Moellmann <gerd@gnu.org>
parents:
25735
diff
changeset
|
3641 safe_bcopy ((char *) glyphs, (char *) (glyphs + n), |
e5579bc77d9e
(direct_output_for_insert): Cast arguments to
Gerd Moellmann <gerd@gnu.org>
parents:
25735
diff
changeset
|
3642 (end - glyphs - n) * sizeof (*end)); |
25012 | 3643 bcopy (it.glyph_row->glyphs[TEXT_AREA], glyphs, n * sizeof *glyphs); |
3644 glyph_row->used[TEXT_AREA] = min (glyph_row->used[TEXT_AREA] + n, | |
3645 end - glyph_row->glyphs[TEXT_AREA]); | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3646 |
25012 | 3647 /* Compute new line width. */ |
3648 glyph = glyph_row->glyphs[TEXT_AREA]; | |
3649 end = glyph + glyph_row->used[TEXT_AREA]; | |
3650 glyph_row->pixel_width = glyph_row->x; | |
3651 while (glyph < end) | |
3652 { | |
3653 glyph_row->pixel_width += glyph->pixel_width; | |
3654 ++glyph; | |
3655 } | |
3656 | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3657 /* Increment buffer positions for glyphs following the newly |
25012 | 3658 inserted ones. */ |
3659 for (glyph = glyphs + n; glyph < end; ++glyph) | |
26546
0f43cc91d6a5
(direct_output_for_insert): Increment glyph positions
Gerd Moellmann <gerd@gnu.org>
parents:
26499
diff
changeset
|
3660 if (glyph->charpos > 0 && BUFFERP (glyph->object)) |
25012 | 3661 glyph->charpos += delta; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3662 |
25012 | 3663 if (MATRIX_ROW_END_CHARPOS (glyph_row) > 0) |
3664 { | |
3665 MATRIX_ROW_END_CHARPOS (glyph_row) += delta; | |
3666 MATRIX_ROW_END_BYTEPOS (glyph_row) += delta_bytes; | |
3667 } | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3668 |
25012 | 3669 /* Adjust positions in lines following the one we are in. */ |
28708
4e2497e6757e
(increment_matrix_positions): Renamed from
Gerd Moellmann <gerd@gnu.org>
parents:
28682
diff
changeset
|
3670 increment_matrix_positions (w->current_matrix, |
4e2497e6757e
(increment_matrix_positions): Renamed from
Gerd Moellmann <gerd@gnu.org>
parents:
28682
diff
changeset
|
3671 w->cursor.vpos + 1, |
4e2497e6757e
(increment_matrix_positions): Renamed from
Gerd Moellmann <gerd@gnu.org>
parents:
28682
diff
changeset
|
3672 w->current_matrix->nrows, |
4e2497e6757e
(increment_matrix_positions): Renamed from
Gerd Moellmann <gerd@gnu.org>
parents:
28682
diff
changeset
|
3673 delta, delta_bytes); |
25012 | 3674 |
3675 glyph_row->contains_overlapping_glyphs_p | |
3676 |= it.glyph_row->contains_overlapping_glyphs_p; | |
3677 | |
26591
f7c7ef351f04
(direct_output_for_insert): Set glyph row's
Gerd Moellmann <gerd@gnu.org>
parents:
26546
diff
changeset
|
3678 glyph_row->displays_text_p = 1; |
f7c7ef351f04
(direct_output_for_insert): Set glyph row's
Gerd Moellmann <gerd@gnu.org>
parents:
26546
diff
changeset
|
3679 w->window_end_vpos = make_number (max (w->cursor.vpos, |
f7c7ef351f04
(direct_output_for_insert): Set glyph row's
Gerd Moellmann <gerd@gnu.org>
parents:
26546
diff
changeset
|
3680 XFASTINT (w->window_end_vpos))); |
f7c7ef351f04
(direct_output_for_insert): Set glyph row's
Gerd Moellmann <gerd@gnu.org>
parents:
26546
diff
changeset
|
3681 |
25304
4b75c26bd356
(direct_output_for_insert): Use
Gerd Moellmann <gerd@gnu.org>
parents:
25241
diff
changeset
|
3682 if (!NILP (Vshow_trailing_whitespace)) |
25012 | 3683 highlight_trailing_whitespace (it.f, glyph_row); |
3684 | |
3685 /* Write glyphs. If at end of row, we can simply call write_glyphs. | |
3686 In the middle, we have to insert glyphs. Note that this is now | |
3687 implemented for X frames. The implementation uses updated_window | |
3688 and updated_row. */ | |
3689 updated_row = glyph_row; | |
38988
53ae5a92e2fc
(direct_output_for_insert): Set updated_area
Gerd Moellmann <gerd@gnu.org>
parents:
38748
diff
changeset
|
3690 updated_area = TEXT_AREA; |
25012 | 3691 update_begin (f); |
82992
5de4189e659d
Got rid of the rif (window-based redisplay interface) global variable.
Karoly Lorentey <lorentey@elte.hu>
parents:
82990
diff
changeset
|
3692 if (FRAME_RIF (f)) |
25012 | 3693 { |
82992
5de4189e659d
Got rid of the rif (window-based redisplay interface) global variable.
Karoly Lorentey <lorentey@elte.hu>
parents:
82990
diff
changeset
|
3694 FRAME_RIF (f)->update_window_begin_hook (w); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3695 |
36115
c0fac212cfcc
(direct_output_for_insert): Recognize more cases where
Gerd Moellmann <gerd@gnu.org>
parents:
36097
diff
changeset
|
3696 if (glyphs == end - n |
c0fac212cfcc
(direct_output_for_insert): Recognize more cases where
Gerd Moellmann <gerd@gnu.org>
parents:
36097
diff
changeset
|
3697 /* In front of a space added by append_space. */ |
c0fac212cfcc
(direct_output_for_insert): Recognize more cases where
Gerd Moellmann <gerd@gnu.org>
parents:
36097
diff
changeset
|
3698 || (glyphs == end - n - 1 |
c0fac212cfcc
(direct_output_for_insert): Recognize more cases where
Gerd Moellmann <gerd@gnu.org>
parents:
36097
diff
changeset
|
3699 && (end - n)->charpos <= 0)) |
82992
5de4189e659d
Got rid of the rif (window-based redisplay interface) global variable.
Karoly Lorentey <lorentey@elte.hu>
parents:
82990
diff
changeset
|
3700 FRAME_RIF (f)->write_glyphs (glyphs, n); |
25012 | 3701 else |
82992
5de4189e659d
Got rid of the rif (window-based redisplay interface) global variable.
Karoly Lorentey <lorentey@elte.hu>
parents:
82990
diff
changeset
|
3702 FRAME_RIF (f)->insert_glyphs (glyphs, n); |
25012 | 3703 } |
3704 else | |
3705 { | |
3706 if (glyphs == end - n) | |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83098
diff
changeset
|
3707 write_glyphs (f, glyphs, n); |
25012 | 3708 else |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83098
diff
changeset
|
3709 insert_glyphs (f, glyphs, n); |
25012 | 3710 } |
3711 | |
3712 w->cursor.hpos += n; | |
3713 w->cursor.x = it.current_x - it.first_visible_x; | |
3714 xassert (w->cursor.hpos >= 0 | |
3715 && w->cursor.hpos < w->desired_matrix->matrix_w); | |
3716 | |
3717 /* How to set the cursor differs depending on whether we are | |
3718 using a frame matrix or a window matrix. Note that when | |
3719 a frame matrix is used, cursor_to expects frame coordinates, | |
3720 and the X and Y parameters are not used. */ | |
3721 if (window_redisplay_p) | |
82992
5de4189e659d
Got rid of the rif (window-based redisplay interface) global variable.
Karoly Lorentey <lorentey@elte.hu>
parents:
82990
diff
changeset
|
3722 FRAME_RIF (f)->cursor_to (w->cursor.vpos, w->cursor.hpos, |
5de4189e659d
Got rid of the rif (window-based redisplay interface) global variable.
Karoly Lorentey <lorentey@elte.hu>
parents:
82990
diff
changeset
|
3723 w->cursor.y, w->cursor.x); |
25012 | 3724 else |
3725 { | |
3726 int x, y; | |
3727 x = (WINDOW_TO_FRAME_HPOS (w, w->cursor.hpos) | |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
3728 + (INTEGERP (w->left_margin_cols) |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
3729 ? XFASTINT (w->left_margin_cols) |
25012 | 3730 : 0)); |
3731 y = WINDOW_TO_FRAME_VPOS (w, w->cursor.vpos); | |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83098
diff
changeset
|
3732 cursor_to (f, y, x); |
25012 | 3733 } |
3734 | |
53612
2ddd2a0d047a
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-41
Miles Bader <miles@gnu.org>
parents:
53605
diff
changeset
|
3735 #ifdef HAVE_WINDOW_SYSTEM |
53605
7dfd96e25ec6
(row_equal_p, update_window_line): Compare fringe bitmaps
Kim F. Storm <storm@cua.dk>
parents:
53514
diff
changeset
|
3736 update_window_fringes (w, 0); |
53612
2ddd2a0d047a
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-41
Miles Bader <miles@gnu.org>
parents:
53605
diff
changeset
|
3737 #endif |
53605
7dfd96e25ec6
(row_equal_p, update_window_line): Compare fringe bitmaps
Kim F. Storm <storm@cua.dk>
parents:
53514
diff
changeset
|
3738 |
82992
5de4189e659d
Got rid of the rif (window-based redisplay interface) global variable.
Karoly Lorentey <lorentey@elte.hu>
parents:
82990
diff
changeset
|
3739 if (FRAME_RIF (f)) |
5de4189e659d
Got rid of the rif (window-based redisplay interface) global variable.
Karoly Lorentey <lorentey@elte.hu>
parents:
82990
diff
changeset
|
3740 FRAME_RIF (f)->update_window_end_hook (w, 1, 0); |
25012 | 3741 update_end (f); |
3742 updated_row = NULL; | |
82990
2ecd1f669db9
Fixed X support, preliminary support for X-tty combo sessions.
Karoly Lorentey <lorentey@elte.hu>
parents:
82989
diff
changeset
|
3743 if (FRAME_TERMCAP_P (f)) |
83065
a871be7b26a5
Implemented suspending of emacsclient frames.
Karoly Lorentey <lorentey@elte.hu>
parents:
83037
diff
changeset
|
3744 fflush (FRAME_TTY (f)->output); |
25012 | 3745 |
3746 TRACE ((stderr, "direct output for insert\n")); | |
44260
64c67a3eebb2
(direct_output_for_insert): Call
Gerd Moellmann <gerd@gnu.org>
parents:
43729
diff
changeset
|
3747 mark_window_display_accurate (it.window, 1); |
25012 | 3748 redisplay_performed_directly_p = 1; |
314 | 3749 return 1; |
3750 } | |
3751 | |
25012 | 3752 |
3753 /* Perform a direct display update for moving PT by N positions | |
3754 left or right. N < 0 means a movement backwards. This function | |
3755 is currently only called for N == 1 or N == -1. */ | |
3756 | |
314 | 3757 int |
3758 direct_output_forward_char (n) | |
3759 int n; | |
3760 { | |
25666
063da8f6a487
(selected_frame): Make it a Lisp_Object.
Gerd Moellmann <gerd@gnu.org>
parents:
25546
diff
changeset
|
3761 struct frame *f = SELECTED_FRAME (); |
25012 | 3762 struct window *w = XWINDOW (selected_window); |
3763 struct glyph_row *row; | |
3764 | |
26851
2513566d55fd
(direct_output_forward_char): Check point moving into
Kenichi Handa <handa@m17n.org>
parents:
26729
diff
changeset
|
3765 /* Give up if point moved out of or into a composition. */ |
28507
b6f06a755c7d
make_number/XINT/XUINT conversions; EQ/== fixes; ==Qnil -> NILP
Ken Raeburn <raeburn@raeburn.org>
parents:
28361
diff
changeset
|
3766 if (check_point_in_composition (current_buffer, XINT (w->last_point), |
26851
2513566d55fd
(direct_output_forward_char): Check point moving into
Kenichi Handa <handa@m17n.org>
parents:
26729
diff
changeset
|
3767 current_buffer, PT)) |
2513566d55fd
(direct_output_forward_char): Check point moving into
Kenichi Handa <handa@m17n.org>
parents:
26729
diff
changeset
|
3768 return 0; |
2513566d55fd
(direct_output_forward_char): Check point moving into
Kenichi Handa <handa@m17n.org>
parents:
26729
diff
changeset
|
3769 |
25012 | 3770 /* Give up if face attributes have been changed. */ |
3771 if (face_change_count) | |
17015
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
3772 return 0; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3773 |
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3774 /* Give up if current matrix is not up to date or we are |
25012 | 3775 displaying a message. */ |
3776 if (!display_completed || cursor_in_echo_area) | |
3777 return 0; | |
3778 | |
3779 /* Give up if the buffer's direction is reversed. */ | |
3780 if (!NILP (XBUFFER (w->buffer)->direction_reversed)) | |
314 | 3781 return 0; |
11096
cac0367b1794
(direct_output_forward_char): Don't use direct output at an overlay boundary.
Karl Heuer <kwzh@gnu.org>
parents:
10770
diff
changeset
|
3782 |
2794
9163e4e4752c
(direct_output_forward_char): Just give up
Richard M. Stallman <rms@gnu.org>
parents:
2778
diff
changeset
|
3783 /* Can't use direct output if highlighting a region. */ |
9163e4e4752c
(direct_output_forward_char): Just give up
Richard M. Stallman <rms@gnu.org>
parents:
2778
diff
changeset
|
3784 if (!NILP (Vtransient_mark_mode) && !NILP (current_buffer->mark_active)) |
9163e4e4752c
(direct_output_forward_char): Just give up
Richard M. Stallman <rms@gnu.org>
parents:
2778
diff
changeset
|
3785 return 0; |
9163e4e4752c
(direct_output_forward_char): Just give up
Richard M. Stallman <rms@gnu.org>
parents:
2778
diff
changeset
|
3786 |
25304
4b75c26bd356
(direct_output_for_insert): Use
Gerd Moellmann <gerd@gnu.org>
parents:
25241
diff
changeset
|
3787 /* Can't use direct output if highlighting trailing whitespace. */ |
4b75c26bd356
(direct_output_for_insert): Use
Gerd Moellmann <gerd@gnu.org>
parents:
25241
diff
changeset
|
3788 if (!NILP (Vshow_trailing_whitespace)) |
4b75c26bd356
(direct_output_for_insert): Use
Gerd Moellmann <gerd@gnu.org>
parents:
25241
diff
changeset
|
3789 return 0; |
4b75c26bd356
(direct_output_for_insert): Use
Gerd Moellmann <gerd@gnu.org>
parents:
25241
diff
changeset
|
3790 |
25735
fcb92c26acf2
(direct_output_forward_char): Don't use this method
Gerd Moellmann <gerd@gnu.org>
parents:
25725
diff
changeset
|
3791 /* Give up if we are showing a message or just cleared the message |
fcb92c26acf2
(direct_output_forward_char): Don't use this method
Gerd Moellmann <gerd@gnu.org>
parents:
25725
diff
changeset
|
3792 because we might need to resize the echo area window. */ |
fcb92c26acf2
(direct_output_forward_char): Don't use this method
Gerd Moellmann <gerd@gnu.org>
parents:
25725
diff
changeset
|
3793 if (!NILP (echo_area_buffer[0]) || !NILP (echo_area_buffer[1])) |
fcb92c26acf2
(direct_output_forward_char): Don't use this method
Gerd Moellmann <gerd@gnu.org>
parents:
25725
diff
changeset
|
3794 return 0; |
fcb92c26acf2
(direct_output_forward_char): Don't use this method
Gerd Moellmann <gerd@gnu.org>
parents:
25725
diff
changeset
|
3795 |
30152
f6270e5282da
(direct_output_forward_char): Give up if currently
Gerd Moellmann <gerd@gnu.org>
parents:
30041
diff
changeset
|
3796 /* Give up if currently displaying a message instead of the |
f6270e5282da
(direct_output_forward_char): Give up if currently
Gerd Moellmann <gerd@gnu.org>
parents:
30041
diff
changeset
|
3797 minibuffer contents. */ |
f6270e5282da
(direct_output_forward_char): Give up if currently
Gerd Moellmann <gerd@gnu.org>
parents:
30041
diff
changeset
|
3798 if (XWINDOW (minibuf_window) == w |
f6270e5282da
(direct_output_forward_char): Give up if currently
Gerd Moellmann <gerd@gnu.org>
parents:
30041
diff
changeset
|
3799 && EQ (minibuf_window, echo_area_window)) |
f6270e5282da
(direct_output_forward_char): Give up if currently
Gerd Moellmann <gerd@gnu.org>
parents:
30041
diff
changeset
|
3800 return 0; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3801 |
25735
fcb92c26acf2
(direct_output_forward_char): Don't use this method
Gerd Moellmann <gerd@gnu.org>
parents:
25725
diff
changeset
|
3802 /* Give up if we don't know where the cursor is. */ |
fcb92c26acf2
(direct_output_forward_char): Don't use this method
Gerd Moellmann <gerd@gnu.org>
parents:
25725
diff
changeset
|
3803 if (w->cursor.vpos < 0) |
fcb92c26acf2
(direct_output_forward_char): Don't use this method
Gerd Moellmann <gerd@gnu.org>
parents:
25725
diff
changeset
|
3804 return 0; |
fcb92c26acf2
(direct_output_forward_char): Don't use this method
Gerd Moellmann <gerd@gnu.org>
parents:
25725
diff
changeset
|
3805 |
25012 | 3806 row = MATRIX_ROW (w->current_matrix, w->cursor.vpos); |
3807 | |
31271
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
3808 /* Give up if PT is outside of the last known cursor row. */ |
41069
818a84568f83
(direct_output_forward_char): Fix character/byte
Gerd Moellmann <gerd@gnu.org>
parents:
41025
diff
changeset
|
3809 if (PT <= MATRIX_ROW_START_CHARPOS (row) |
818a84568f83
(direct_output_forward_char): Fix character/byte
Gerd Moellmann <gerd@gnu.org>
parents:
41025
diff
changeset
|
3810 || PT >= MATRIX_ROW_END_CHARPOS (row)) |
6069
07045ca8ff19
(direct_output_forward_char): Use Fget_char_property to test for invisibility.
Karl Heuer <kwzh@gnu.org>
parents:
6068
diff
changeset
|
3811 return 0; |
4384
98605d0ea3cf
(direct_output_for_insert): Fail if character
Richard M. Stallman <rms@gnu.org>
parents:
4290
diff
changeset
|
3812 |
25012 | 3813 set_cursor_from_row (w, row, w->current_matrix, 0, 0, 0, 0); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3814 |
25012 | 3815 w->last_cursor = w->cursor; |
16039
855c8d8ba0f0
Change all references from point to PT.
Karl Heuer <kwzh@gnu.org>
parents:
15896
diff
changeset
|
3816 XSETFASTINT (w->last_point, PT); |
25012 | 3817 |
3818 xassert (w->cursor.hpos >= 0 | |
3819 && w->cursor.hpos < w->desired_matrix->matrix_w); | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3820 |
25012 | 3821 if (FRAME_WINDOW_P (f)) |
82992
5de4189e659d
Got rid of the rif (window-based redisplay interface) global variable.
Karoly Lorentey <lorentey@elte.hu>
parents:
82990
diff
changeset
|
3822 FRAME_RIF (f)->cursor_to (w->cursor.vpos, w->cursor.hpos, |
5de4189e659d
Got rid of the rif (window-based redisplay interface) global variable.
Karoly Lorentey <lorentey@elte.hu>
parents:
82990
diff
changeset
|
3823 w->cursor.y, w->cursor.x); |
25012 | 3824 else |
3825 { | |
3826 int x, y; | |
3827 x = (WINDOW_TO_FRAME_HPOS (w, w->cursor.hpos) | |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
3828 + (INTEGERP (w->left_margin_cols) |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
3829 ? XFASTINT (w->left_margin_cols) |
25012 | 3830 : 0)); |
3831 y = WINDOW_TO_FRAME_VPOS (w, w->cursor.vpos); | |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83098
diff
changeset
|
3832 cursor_to (f, y, x); |
25012 | 3833 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3834 |
82990
2ecd1f669db9
Fixed X support, preliminary support for X-tty combo sessions.
Karoly Lorentey <lorentey@elte.hu>
parents:
82989
diff
changeset
|
3835 if (FRAME_TERMCAP_P (f)) |
83065
a871be7b26a5
Implemented suspending of emacsclient frames.
Karoly Lorentey <lorentey@elte.hu>
parents:
83037
diff
changeset
|
3836 fflush (FRAME_TTY (f)->output); |
25012 | 3837 redisplay_performed_directly_p = 1; |
314 | 3838 return 1; |
3839 } | |
25012 | 3840 |
3841 | |
314 | 3842 |
25012 | 3843 /*********************************************************************** |
3844 Frame Update | |
3845 ***********************************************************************/ | |
3846 | |
3847 /* Update frame F based on the data in desired matrices. | |
3848 | |
3849 If FORCE_P is non-zero, don't let redisplay be stopped by detecting | |
3850 pending input. If INHIBIT_HAIRY_ID_P is non-zero, don't try | |
3851 scrolling. | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3852 |
25012 | 3853 Value is non-zero if redisplay was stopped due to pending input. */ |
314 | 3854 |
3855 int | |
25012 | 3856 update_frame (f, force_p, inhibit_hairy_id_p) |
3857 struct frame *f; | |
3858 int force_p; | |
3859 int inhibit_hairy_id_p; | |
3860 { | |
3861 /* 1 means display has been paused because of pending input. */ | |
3862 int paused_p; | |
3863 struct window *root_window = XWINDOW (f->root_window); | |
3864 | |
76065
2001cae9df4e
(update_frame, update_single_window): Set force_p here if
Kim F. Storm <storm@cua.dk>
parents:
75371
diff
changeset
|
3865 if (redisplay_dont_pause) |
2001cae9df4e
(update_frame, update_single_window): Set force_p here if
Kim F. Storm <storm@cua.dk>
parents:
75371
diff
changeset
|
3866 force_p = 1; |
71323
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
3867 #if PERIODIC_PREEMPTION_CHECKING |
76065
2001cae9df4e
(update_frame, update_single_window): Set force_p here if
Kim F. Storm <storm@cua.dk>
parents:
75371
diff
changeset
|
3868 else if (NILP (Vredisplay_preemption_period)) |
2001cae9df4e
(update_frame, update_single_window): Set force_p here if
Kim F. Storm <storm@cua.dk>
parents:
75371
diff
changeset
|
3869 force_p = 1; |
2001cae9df4e
(update_frame, update_single_window): Set force_p here if
Kim F. Storm <storm@cua.dk>
parents:
75371
diff
changeset
|
3870 else if (!force_p && NUMBERP (Vredisplay_preemption_period)) |
71323
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
3871 { |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
3872 EMACS_TIME tm; |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
3873 double p = XFLOATINT (Vredisplay_preemption_period); |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
3874 int sec, usec; |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
3875 |
71378
1b442e9d8373
(update_frame): Check for input pending on entry.
Kim F. Storm <storm@cua.dk>
parents:
71333
diff
changeset
|
3876 if (detect_input_pending_ignore_squeezables ()) |
1b442e9d8373
(update_frame): Check for input pending on entry.
Kim F. Storm <storm@cua.dk>
parents:
71333
diff
changeset
|
3877 { |
1b442e9d8373
(update_frame): Check for input pending on entry.
Kim F. Storm <storm@cua.dk>
parents:
71333
diff
changeset
|
3878 paused_p = 1; |
1b442e9d8373
(update_frame): Check for input pending on entry.
Kim F. Storm <storm@cua.dk>
parents:
71333
diff
changeset
|
3879 goto do_pause; |
1b442e9d8373
(update_frame): Check for input pending on entry.
Kim F. Storm <storm@cua.dk>
parents:
71333
diff
changeset
|
3880 } |
1b442e9d8373
(update_frame): Check for input pending on entry.
Kim F. Storm <storm@cua.dk>
parents:
71333
diff
changeset
|
3881 |
71323
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
3882 sec = (int) p; |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
3883 usec = (p - sec) * 1000000; |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
3884 |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
3885 EMACS_GET_TIME (tm); |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
3886 EMACS_SET_SECS_USECS (preemption_period, sec, usec); |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
3887 EMACS_ADD_TIME (preemption_next_check, tm, preemption_period); |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
3888 } |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
3889 #endif |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
3890 |
25012 | 3891 if (FRAME_WINDOW_P (f)) |
3892 { | |
3893 /* We are working on window matrix basis. All windows whose | |
3894 flag must_be_updated_p is set have to be updated. */ | |
3895 | |
3896 /* Record that we are not working on frame matrices. */ | |
3897 set_frame_matrix_frame (NULL); | |
3898 | |
3899 /* Update all windows in the window tree of F, maybe stopping | |
3900 when pending input is detected. */ | |
3901 update_begin (f); | |
3902 | |
3903 /* Update the menu bar on X frames that don't have toolkit | |
3904 support. */ | |
3905 if (WINDOWP (f->menu_bar_window)) | |
3906 update_window (XWINDOW (f->menu_bar_window), 1); | |
3907 | |
3908 /* Update the tool-bar window, if present. */ | |
25544
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
3909 if (WINDOWP (f->tool_bar_window)) |
25012 | 3910 { |
25544
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
3911 struct window *w = XWINDOW (f->tool_bar_window); |
25012 | 3912 |
3913 /* Update tool-bar window. */ | |
3914 if (w->must_be_updated_p) | |
3915 { | |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
3916 Lisp_Object tem; |
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
3917 |
25012 | 3918 update_window (w, 1); |
3919 w->must_be_updated_p = 0; | |
3920 | |
3921 /* Swap tool-bar strings. We swap because we want to | |
3922 reuse strings. */ | |
25544
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
3923 tem = f->current_tool_bar_string; |
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
3924 f->current_tool_bar_string = f->desired_tool_bar_string; |
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
3925 f->desired_tool_bar_string = tem; |
25012 | 3926 } |
3927 } | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3928 |
25012 | 3929 |
3930 /* Update windows. */ | |
3931 paused_p = update_window_tree (root_window, force_p); | |
3932 update_end (f); | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3933 |
53881
ccacbf7f76b2
(row_equal_p): Compare fringe bitmap faces and overlay
Kim F. Storm <storm@cua.dk>
parents:
53612
diff
changeset
|
3934 /* This flush is a performance bottleneck under X, |
83037 | 3935 and it doesn't seem to be necessary anyway (in general). |
53881
ccacbf7f76b2
(row_equal_p): Compare fringe bitmap faces and overlay
Kim F. Storm <storm@cua.dk>
parents:
53612
diff
changeset
|
3936 It is necessary when resizing the window with the mouse, or |
83037 | 3937 at least the fringes are not redrawn in a timely manner. ++kfs */ |
53881
ccacbf7f76b2
(row_equal_p): Compare fringe bitmap faces and overlay
Kim F. Storm <storm@cua.dk>
parents:
53612
diff
changeset
|
3938 if (f->force_flush_display_p) |
83037 | 3939 { |
3940 FRAME_RIF (f)->flush_display (f); | |
3941 f->force_flush_display_p = 0; | |
3942 } | |
25012 | 3943 } |
3944 else | |
3945 { | |
3946 /* We are working on frame matrix basis. Set the frame on whose | |
3947 frame matrix we operate. */ | |
3948 set_frame_matrix_frame (f); | |
3949 | |
31295
d4f918f0b184
(update_frame): Only set display_completed here; use
Gerd Moellmann <gerd@gnu.org>
parents:
31271
diff
changeset
|
3950 /* Build F's desired matrix from window matrices. */ |
25012 | 3951 build_frame_matrix (f); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3952 |
31295
d4f918f0b184
(update_frame): Only set display_completed here; use
Gerd Moellmann <gerd@gnu.org>
parents:
31271
diff
changeset
|
3953 /* Update the display */ |
d4f918f0b184
(update_frame): Only set display_completed here; use
Gerd Moellmann <gerd@gnu.org>
parents:
31271
diff
changeset
|
3954 update_begin (f); |
25012 | 3955 paused_p = update_frame_1 (f, force_p, inhibit_hairy_id_p); |
31295
d4f918f0b184
(update_frame): Only set display_completed here; use
Gerd Moellmann <gerd@gnu.org>
parents:
31271
diff
changeset
|
3956 update_end (f); |
d4f918f0b184
(update_frame): Only set display_completed here; use
Gerd Moellmann <gerd@gnu.org>
parents:
31271
diff
changeset
|
3957 |
98508
c370f470d5ba
(update_frame): Flush termscript for MSDOS frames as well as for TTY.
Eli Zaretskii <eliz@gnu.org>
parents:
98497
diff
changeset
|
3958 if (FRAME_TERMCAP_P (f) || FRAME_MSDOS_P (f)) |
83008
040dd41ed7d0
Hookified termcap devices, added bootstrap display device, plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
83004
diff
changeset
|
3959 { |
83065
a871be7b26a5
Implemented suspending of emacsclient frames.
Karoly Lorentey <lorentey@elte.hu>
parents:
83037
diff
changeset
|
3960 if (FRAME_TTY (f)->termscript) |
a871be7b26a5
Implemented suspending of emacsclient frames.
Karoly Lorentey <lorentey@elte.hu>
parents:
83037
diff
changeset
|
3961 fflush (FRAME_TTY (f)->termscript); |
98508
c370f470d5ba
(update_frame): Flush termscript for MSDOS frames as well as for TTY.
Eli Zaretskii <eliz@gnu.org>
parents:
98497
diff
changeset
|
3962 if (FRAME_TERMCAP_P (f)) |
c370f470d5ba
(update_frame): Flush termscript for MSDOS frames as well as for TTY.
Eli Zaretskii <eliz@gnu.org>
parents:
98497
diff
changeset
|
3963 fflush (FRAME_TTY (f)->output); |
83008
040dd41ed7d0
Hookified termcap devices, added bootstrap display device, plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
83004
diff
changeset
|
3964 } |
31295
d4f918f0b184
(update_frame): Only set display_completed here; use
Gerd Moellmann <gerd@gnu.org>
parents:
31271
diff
changeset
|
3965 |
25012 | 3966 /* Check window matrices for lost pointers. */ |
34893
779bd3fa820e
Use #if GLYPH_DEBUG instead of #ifdef GLYPH_DEBUG.
Gerd Moellmann <gerd@gnu.org>
parents:
34866
diff
changeset
|
3967 #if GLYPH_DEBUG |
34866
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
3968 check_window_matrix_pointers (root_window); |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
3969 add_frame_display_history (f, paused_p); |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
3970 #endif |
25012 | 3971 } |
3972 | |
71378
1b442e9d8373
(update_frame): Check for input pending on entry.
Kim F. Storm <storm@cua.dk>
parents:
71333
diff
changeset
|
3973 do_pause: |
25012 | 3974 /* Reset flags indicating that a window should be updated. */ |
3975 set_window_update_flags (root_window, 0); | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3976 |
31295
d4f918f0b184
(update_frame): Only set display_completed here; use
Gerd Moellmann <gerd@gnu.org>
parents:
31271
diff
changeset
|
3977 display_completed = !paused_p; |
25012 | 3978 return paused_p; |
3979 } | |
3980 | |
3981 | |
3982 | |
3983 /************************************************************************ | |
3984 Window-based updates | |
3985 ************************************************************************/ | |
3986 | |
3987 /* Perform updates in window tree rooted at W. FORCE_P non-zero means | |
3988 don't stop updating when input is pending. */ | |
3989 | |
3990 static int | |
3991 update_window_tree (w, force_p) | |
3992 struct window *w; | |
3993 int force_p; | |
3994 { | |
3995 int paused_p = 0; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3996 |
25012 | 3997 while (w && !paused_p) |
3998 { | |
3999 if (!NILP (w->hchild)) | |
4000 paused_p |= update_window_tree (XWINDOW (w->hchild), force_p); | |
4001 else if (!NILP (w->vchild)) | |
4002 paused_p |= update_window_tree (XWINDOW (w->vchild), force_p); | |
4003 else if (w->must_be_updated_p) | |
4004 paused_p |= update_window (w, force_p); | |
4005 | |
4006 w = NILP (w->next) ? 0 : XWINDOW (w->next); | |
4007 } | |
4008 | |
4009 return paused_p; | |
4010 } | |
4011 | |
4012 | |
4013 /* Update window W if its flag must_be_updated_p is non-zero. If | |
4014 FORCE_P is non-zero, don't stop updating if input is pending. */ | |
4015 | |
4016 void | |
4017 update_single_window (w, force_p) | |
4018 struct window *w; | |
4019 int force_p; | |
4020 { | |
4021 if (w->must_be_updated_p) | |
4022 { | |
4023 struct frame *f = XFRAME (WINDOW_FRAME (w)); | |
4024 | |
4025 /* Record that this is not a frame-based redisplay. */ | |
4026 set_frame_matrix_frame (NULL); | |
4027 | |
76065
2001cae9df4e
(update_frame, update_single_window): Set force_p here if
Kim F. Storm <storm@cua.dk>
parents:
75371
diff
changeset
|
4028 if (redisplay_dont_pause) |
2001cae9df4e
(update_frame, update_single_window): Set force_p here if
Kim F. Storm <storm@cua.dk>
parents:
75371
diff
changeset
|
4029 force_p = 1; |
71323
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
4030 #if PERIODIC_PREEMPTION_CHECKING |
76065
2001cae9df4e
(update_frame, update_single_window): Set force_p here if
Kim F. Storm <storm@cua.dk>
parents:
75371
diff
changeset
|
4031 else if (NILP (Vredisplay_preemption_period)) |
2001cae9df4e
(update_frame, update_single_window): Set force_p here if
Kim F. Storm <storm@cua.dk>
parents:
75371
diff
changeset
|
4032 force_p = 1; |
2001cae9df4e
(update_frame, update_single_window): Set force_p here if
Kim F. Storm <storm@cua.dk>
parents:
75371
diff
changeset
|
4033 else if (!force_p && NUMBERP (Vredisplay_preemption_period)) |
71323
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
4034 { |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
4035 EMACS_TIME tm; |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
4036 double p = XFLOATINT (Vredisplay_preemption_period); |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
4037 int sec, usec; |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
4038 |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
4039 sec = (int) p; |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
4040 usec = (p - sec) * 1000000; |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
4041 |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
4042 EMACS_GET_TIME (tm); |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
4043 EMACS_SET_SECS_USECS (preemption_period, sec, usec); |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
4044 EMACS_ADD_TIME (preemption_next_check, tm, preemption_period); |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
4045 } |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
4046 #endif |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
4047 |
25012 | 4048 /* Update W. */ |
4049 update_begin (f); | |
4050 update_window (w, force_p); | |
4051 update_end (f); | |
4052 | |
4053 /* Reset flag in W. */ | |
4054 w->must_be_updated_p = 0; | |
4055 } | |
4056 } | |
4057 | |
65905
a82ae68a578e
(redraw_overlapped_rows, redraw_overlapping_rows)
Kim F. Storm <storm@cua.dk>
parents:
65890
diff
changeset
|
4058 #ifdef HAVE_WINDOW_SYSTEM |
25012 | 4059 |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4060 /* Redraw lines from the current matrix of window W that are |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4061 overlapped by other rows. YB is bottom-most y-position in W. */ |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4062 |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4063 static void |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4064 redraw_overlapped_rows (w, yb) |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4065 struct window *w; |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4066 int yb; |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4067 { |
30165
d7ec5b3caccc
(redraw_overlapped_rows): Add missing local.
Gerd Moellmann <gerd@gnu.org>
parents:
30161
diff
changeset
|
4068 int i; |
82992
5de4189e659d
Got rid of the rif (window-based redisplay interface) global variable.
Karoly Lorentey <lorentey@elte.hu>
parents:
82990
diff
changeset
|
4069 struct frame *f = XFRAME (WINDOW_FRAME (w)); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4070 |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4071 /* If rows overlapping others have been changed, the rows being |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4072 overlapped have to be redrawn. This won't draw lines that have |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4073 already been drawn in update_window_line because overlapped_p in |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4074 desired rows is 0, so after row assignment overlapped_p in |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4075 current rows is 0. */ |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4076 for (i = 0; i < w->current_matrix->nrows; ++i) |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4077 { |
30161
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
4078 struct glyph_row *row = w->current_matrix->rows + i; |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4079 |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4080 if (!row->enabled_p) |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4081 break; |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4082 else if (row->mode_line_p) |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4083 continue; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4084 |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4085 if (row->overlapped_p) |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4086 { |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4087 enum glyph_row_area area; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4088 |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4089 for (area = LEFT_MARGIN_AREA; area < LAST_AREA; ++area) |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4090 { |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4091 updated_row = row; |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4092 updated_area = area; |
82992
5de4189e659d
Got rid of the rif (window-based redisplay interface) global variable.
Karoly Lorentey <lorentey@elte.hu>
parents:
82990
diff
changeset
|
4093 FRAME_RIF (f)->cursor_to (i, 0, row->y, |
5de4189e659d
Got rid of the rif (window-based redisplay interface) global variable.
Karoly Lorentey <lorentey@elte.hu>
parents:
82990
diff
changeset
|
4094 area == TEXT_AREA ? row->x : 0); |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4095 if (row->used[area]) |
82992
5de4189e659d
Got rid of the rif (window-based redisplay interface) global variable.
Karoly Lorentey <lorentey@elte.hu>
parents:
82990
diff
changeset
|
4096 FRAME_RIF (f)->write_glyphs (row->glyphs[area], |
5de4189e659d
Got rid of the rif (window-based redisplay interface) global variable.
Karoly Lorentey <lorentey@elte.hu>
parents:
82990
diff
changeset
|
4097 row->used[area]); |
5de4189e659d
Got rid of the rif (window-based redisplay interface) global variable.
Karoly Lorentey <lorentey@elte.hu>
parents:
82990
diff
changeset
|
4098 FRAME_RIF (f)->clear_end_of_line (-1); |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4099 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4100 |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4101 row->overlapped_p = 0; |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4102 } |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4103 |
30161
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
4104 if (MATRIX_ROW_BOTTOM_Y (row) >= yb) |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4105 break; |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4106 } |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4107 } |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4108 |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4109 |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4110 /* Redraw lines from the current matrix of window W that overlap |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4111 others. YB is bottom-most y-position in W. */ |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4112 |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4113 static void |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4114 redraw_overlapping_rows (w, yb) |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4115 struct window *w; |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4116 int yb; |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4117 { |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4118 int i, bottom_y; |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4119 struct glyph_row *row; |
82992
5de4189e659d
Got rid of the rif (window-based redisplay interface) global variable.
Karoly Lorentey <lorentey@elte.hu>
parents:
82990
diff
changeset
|
4120 struct redisplay_interface *rif = FRAME_RIF (XFRAME (WINDOW_FRAME (w))); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4121 |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4122 for (i = 0; i < w->current_matrix->nrows; ++i) |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4123 { |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4124 row = w->current_matrix->rows + i; |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4125 |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4126 if (!row->enabled_p) |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4127 break; |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4128 else if (row->mode_line_p) |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4129 continue; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4130 |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4131 bottom_y = MATRIX_ROW_BOTTOM_Y (row); |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4132 |
102882
40a6ace09cb5
(redraw_overlapping_rows): Fix detection of
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
101690
diff
changeset
|
4133 if (row->overlapping_p) |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4134 { |
65890
1a7a619caf97
(redraw_overlapping_rows): Call rif->fix_overlapping_area with new
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
65308
diff
changeset
|
4135 int overlaps = 0; |
1a7a619caf97
(redraw_overlapping_rows): Call rif->fix_overlapping_area with new
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
65308
diff
changeset
|
4136 |
102882
40a6ace09cb5
(redraw_overlapping_rows): Fix detection of
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
101690
diff
changeset
|
4137 if (MATRIX_ROW_OVERLAPS_PRED_P (row) && i > 0 |
65890
1a7a619caf97
(redraw_overlapping_rows): Call rif->fix_overlapping_area with new
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
65308
diff
changeset
|
4138 && !MATRIX_ROW (w->current_matrix, i - 1)->overlapped_p) |
1a7a619caf97
(redraw_overlapping_rows): Call rif->fix_overlapping_area with new
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
65308
diff
changeset
|
4139 overlaps |= OVERLAPS_PRED; |
102882
40a6ace09cb5
(redraw_overlapping_rows): Fix detection of
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
101690
diff
changeset
|
4140 if (MATRIX_ROW_OVERLAPS_SUCC_P (row) && bottom_y < yb |
65890
1a7a619caf97
(redraw_overlapping_rows): Call rif->fix_overlapping_area with new
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
65308
diff
changeset
|
4141 && !MATRIX_ROW (w->current_matrix, i + 1)->overlapped_p) |
1a7a619caf97
(redraw_overlapping_rows): Call rif->fix_overlapping_area with new
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
65308
diff
changeset
|
4142 overlaps |= OVERLAPS_SUCC; |
1a7a619caf97
(redraw_overlapping_rows): Call rif->fix_overlapping_area with new
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
65308
diff
changeset
|
4143 |
1a7a619caf97
(redraw_overlapping_rows): Call rif->fix_overlapping_area with new
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
65308
diff
changeset
|
4144 if (overlaps) |
1a7a619caf97
(redraw_overlapping_rows): Call rif->fix_overlapping_area with new
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
65308
diff
changeset
|
4145 { |
1a7a619caf97
(redraw_overlapping_rows): Call rif->fix_overlapping_area with new
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
65308
diff
changeset
|
4146 if (row->used[LEFT_MARGIN_AREA]) |
1a7a619caf97
(redraw_overlapping_rows): Call rif->fix_overlapping_area with new
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
65308
diff
changeset
|
4147 rif->fix_overlapping_area (w, row, LEFT_MARGIN_AREA, overlaps); |
1a7a619caf97
(redraw_overlapping_rows): Call rif->fix_overlapping_area with new
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
65308
diff
changeset
|
4148 |
1a7a619caf97
(redraw_overlapping_rows): Call rif->fix_overlapping_area with new
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
65308
diff
changeset
|
4149 if (row->used[TEXT_AREA]) |
1a7a619caf97
(redraw_overlapping_rows): Call rif->fix_overlapping_area with new
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
65308
diff
changeset
|
4150 rif->fix_overlapping_area (w, row, TEXT_AREA, overlaps); |
1a7a619caf97
(redraw_overlapping_rows): Call rif->fix_overlapping_area with new
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
65308
diff
changeset
|
4151 |
1a7a619caf97
(redraw_overlapping_rows): Call rif->fix_overlapping_area with new
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
65308
diff
changeset
|
4152 if (row->used[RIGHT_MARGIN_AREA]) |
1a7a619caf97
(redraw_overlapping_rows): Call rif->fix_overlapping_area with new
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
65308
diff
changeset
|
4153 rif->fix_overlapping_area (w, row, RIGHT_MARGIN_AREA, overlaps); |
1a7a619caf97
(redraw_overlapping_rows): Call rif->fix_overlapping_area with new
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
65308
diff
changeset
|
4154 |
1a7a619caf97
(redraw_overlapping_rows): Call rif->fix_overlapping_area with new
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
65308
diff
changeset
|
4155 /* Record in neighbour rows that ROW overwrites part of |
1a7a619caf97
(redraw_overlapping_rows): Call rif->fix_overlapping_area with new
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
65308
diff
changeset
|
4156 their display. */ |
1a7a619caf97
(redraw_overlapping_rows): Call rif->fix_overlapping_area with new
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
65308
diff
changeset
|
4157 if (overlaps & OVERLAPS_PRED) |
1a7a619caf97
(redraw_overlapping_rows): Call rif->fix_overlapping_area with new
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
65308
diff
changeset
|
4158 MATRIX_ROW (w->current_matrix, i - 1)->overlapped_p = 1; |
1a7a619caf97
(redraw_overlapping_rows): Call rif->fix_overlapping_area with new
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
65308
diff
changeset
|
4159 if (overlaps & OVERLAPS_SUCC) |
1a7a619caf97
(redraw_overlapping_rows): Call rif->fix_overlapping_area with new
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
65308
diff
changeset
|
4160 MATRIX_ROW (w->current_matrix, i + 1)->overlapped_p = 1; |
1a7a619caf97
(redraw_overlapping_rows): Call rif->fix_overlapping_area with new
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
65308
diff
changeset
|
4161 } |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4162 } |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4163 |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4164 if (bottom_y >= yb) |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4165 break; |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4166 } |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4167 } |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4168 |
65905
a82ae68a578e
(redraw_overlapped_rows, redraw_overlapping_rows)
Kim F. Storm <storm@cua.dk>
parents:
65890
diff
changeset
|
4169 #endif /* HAVE_WINDOW_SYSTEM */ |
a82ae68a578e
(redraw_overlapped_rows, redraw_overlapping_rows)
Kim F. Storm <storm@cua.dk>
parents:
65890
diff
changeset
|
4170 |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4171 |
34929
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4172 #ifdef GLYPH_DEBUG |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4173 |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4174 /* Check that no row in the current matrix of window W is enabled |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4175 which is below what's displayed in the window. */ |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4176 |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4177 void |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4178 check_current_matrix_flags (w) |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4179 struct window *w; |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4180 { |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4181 int last_seen_p = 0; |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4182 int i, yb = window_text_bottom_y (w); |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4183 |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4184 for (i = 0; i < w->current_matrix->nrows - 1; ++i) |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4185 { |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4186 struct glyph_row *row = MATRIX_ROW (w->current_matrix, i); |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4187 if (!last_seen_p && MATRIX_ROW_BOTTOM_Y (row) >= yb) |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4188 last_seen_p = 1; |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4189 else if (last_seen_p && row->enabled_p) |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4190 abort (); |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4191 } |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4192 } |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4193 |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4194 #endif /* GLYPH_DEBUG */ |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4195 |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4196 |
25012 | 4197 /* Update display of window W. FORCE_P non-zero means that we should |
4198 not stop when detecting pending input. */ | |
4199 | |
4200 static int | |
4201 update_window (w, force_p) | |
4202 struct window *w; | |
4203 int force_p; | |
4204 { | |
4205 struct glyph_matrix *desired_matrix = w->desired_matrix; | |
4206 int paused_p; | |
71323
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
4207 #if !PERIODIC_PREEMPTION_CHECKING |
25012 | 4208 int preempt_count = baud_rate / 2400 + 1; |
71323
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
4209 #endif |
25012 | 4210 extern int input_pending; |
34517
7c8d2cec3d08
(update_window): If do_mouse_tracking is non-nil,
Gerd Moellmann <gerd@gnu.org>
parents:
34279
diff
changeset
|
4211 extern Lisp_Object do_mouse_tracking; |
83241
3dcba0bc766b
Merged in changes from CVS trunk. (Long time no see!) :-)
Karoly Lorentey <lorentey@elte.hu>
diff
changeset
|
4212 struct redisplay_interface *rif = FRAME_RIF (XFRAME (WINDOW_FRAME (w))); |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
4213 #if GLYPH_DEBUG |
25012 | 4214 /* Check that W's frame doesn't have glyph matrices. */ |
65308
7b2a711dc863
(window_to_frame_hpos, update_window):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
65016
diff
changeset
|
4215 xassert (FRAME_WINDOW_P (XFRAME (WINDOW_FRAME (w)))); |
59879
aaf00c303308
* dispnew.c (update_window): Fixing compile error due to
Steven Tamm <steventamm@mac.com>
parents:
59592
diff
changeset
|
4216 #endif |
25012 | 4217 |
4218 /* Check pending input the first time so that we can quickly return. */ | |
76065
2001cae9df4e
(update_frame, update_single_window): Set force_p here if
Kim F. Storm <storm@cua.dk>
parents:
75371
diff
changeset
|
4219 #if !PERIODIC_PREEMPTION_CHECKING |
2001cae9df4e
(update_frame, update_single_window): Set force_p here if
Kim F. Storm <storm@cua.dk>
parents:
75371
diff
changeset
|
4220 if (!force_p) |
59580
f43d0816e9c3
* keyboard.c (READABLE_EVENTS_DO_TIMERS_NOW)
Jan Djärv <jan.h.d@swipnet.se>
parents:
58986
diff
changeset
|
4221 detect_input_pending_ignore_squeezables (); |
71323
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
4222 #endif |
25012 | 4223 |
4224 /* If forced to complete the update, or if no input is pending, do | |
4225 the update. */ | |
34517
7c8d2cec3d08
(update_window): If do_mouse_tracking is non-nil,
Gerd Moellmann <gerd@gnu.org>
parents:
34279
diff
changeset
|
4226 if (force_p || !input_pending || !NILP (do_mouse_tracking)) |
25012 | 4227 { |
4228 struct glyph_row *row, *end; | |
4229 struct glyph_row *mode_line_row; | |
38489
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4230 struct glyph_row *header_line_row; |
34622
877ed6cab304
(update_window): Detect pending input every nth line
Gerd Moellmann <gerd@gnu.org>
parents:
34517
diff
changeset
|
4231 int yb, changed_p = 0, mouse_face_overwritten_p = 0, n_updated; |
25012 | 4232 |
4233 rif->update_window_begin_hook (w); | |
4234 yb = window_text_bottom_y (w); | |
4235 | |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
4236 /* If window has a header line, update it before everything else. |
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
4237 Adjust y-positions of other rows by the header line height. */ |
25012 | 4238 row = desired_matrix->rows; |
4239 end = row + desired_matrix->nrows - 1; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4240 |
25012 | 4241 if (row->mode_line_p) |
38489
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4242 { |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4243 header_line_row = row; |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4244 ++row; |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4245 } |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4246 else |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4247 header_line_row = NULL; |
25012 | 4248 |
4249 /* Update the mode line, if necessary. */ | |
4250 mode_line_row = MATRIX_MODE_LINE_ROW (desired_matrix); | |
4251 if (mode_line_row->mode_line_p && mode_line_row->enabled_p) | |
4252 { | |
4253 mode_line_row->y = yb; | |
4254 update_window_line (w, MATRIX_ROW_VPOS (mode_line_row, | |
30161
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
4255 desired_matrix), |
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
4256 &mouse_face_overwritten_p); |
25012 | 4257 } |
4258 | |
4259 /* Find first enabled row. Optimizations in redisplay_internal | |
4260 may lead to an update with only one row enabled. There may | |
4261 be also completely empty matrices. */ | |
4262 while (row < end && !row->enabled_p) | |
4263 ++row; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4264 |
31825
62830644b967
(scrolling_window): Compare y-positions of rows
Gerd Moellmann <gerd@gnu.org>
parents:
31726
diff
changeset
|
4265 /* Try reusing part of the display by copying. */ |
25012 | 4266 if (row < end && !desired_matrix->no_scrolling_p) |
38489
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4267 { |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4268 int rc = scrolling_window (w, header_line_row != NULL); |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4269 if (rc < 0) |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4270 { |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4271 /* All rows were found to be equal. */ |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4272 paused_p = 0; |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4273 goto set_cursor; |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4274 } |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4275 else if (rc > 0) |
54847
5acc1d864551
(update_window): Only set changed_p if
Kim F. Storm <storm@cua.dk>
parents:
54176
diff
changeset
|
4276 { |
5acc1d864551
(update_window): Only set changed_p if
Kim F. Storm <storm@cua.dk>
parents:
54176
diff
changeset
|
4277 /* We've scrolled the display. */ |
5acc1d864551
(update_window): Only set changed_p if
Kim F. Storm <storm@cua.dk>
parents:
54176
diff
changeset
|
4278 force_p = 1; |
5acc1d864551
(update_window): Only set changed_p if
Kim F. Storm <storm@cua.dk>
parents:
54176
diff
changeset
|
4279 changed_p = 1; |
5acc1d864551
(update_window): Only set changed_p if
Kim F. Storm <storm@cua.dk>
parents:
54176
diff
changeset
|
4280 } |
38489
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4281 } |
25012 | 4282 |
4283 /* Update the rest of the lines. */ | |
34622
877ed6cab304
(update_window): Detect pending input every nth line
Gerd Moellmann <gerd@gnu.org>
parents:
34517
diff
changeset
|
4284 for (n_updated = 0; row < end && (force_p || !input_pending); ++row) |
31653
2554afbeb88d
(update_window): Make sure to make desired rows
Gerd Moellmann <gerd@gnu.org>
parents:
31295
diff
changeset
|
4285 if (row->enabled_p) |
25012 | 4286 { |
4287 int vpos = MATRIX_ROW_VPOS (row, desired_matrix); | |
4288 int i; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4289 |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
4290 /* We'll have to play a little bit with when to |
25012 | 4291 detect_input_pending. If it's done too often, |
4292 scrolling large windows with repeated scroll-up | |
4293 commands will too quickly pause redisplay. */ | |
71323
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
4294 #if PERIODIC_PREEMPTION_CHECKING |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
4295 if (!force_p) |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
4296 { |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
4297 EMACS_TIME tm, dif; |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
4298 EMACS_GET_TIME (tm); |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
4299 EMACS_SUB_TIME (dif, preemption_next_check, tm); |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
4300 if (EMACS_TIME_NEG_P (dif)) |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
4301 { |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
4302 EMACS_ADD_TIME (preemption_next_check, tm, preemption_period); |
71378
1b442e9d8373
(update_frame): Check for input pending on entry.
Kim F. Storm <storm@cua.dk>
parents:
71333
diff
changeset
|
4303 if (detect_input_pending_ignore_squeezables ()) |
1b442e9d8373
(update_frame): Check for input pending on entry.
Kim F. Storm <storm@cua.dk>
parents:
71333
diff
changeset
|
4304 break; |
71323
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
4305 } |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
4306 } |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
4307 #else |
34622
877ed6cab304
(update_window): Detect pending input every nth line
Gerd Moellmann <gerd@gnu.org>
parents:
34517
diff
changeset
|
4308 if (!force_p && ++n_updated % preempt_count == 0) |
59580
f43d0816e9c3
* keyboard.c (READABLE_EVENTS_DO_TIMERS_NOW)
Jan Djärv <jan.h.d@swipnet.se>
parents:
58986
diff
changeset
|
4309 detect_input_pending_ignore_squeezables (); |
71323
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
4310 #endif |
30161
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
4311 changed_p |= update_window_line (w, vpos, |
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
4312 &mouse_face_overwritten_p); |
25012 | 4313 |
4314 /* Mark all rows below the last visible one in the current | |
4315 matrix as invalid. This is necessary because of | |
4316 variable line heights. Consider the case of three | |
4317 successive redisplays, where the first displays 5 | |
4318 lines, the second 3 lines, and the third 5 lines again. | |
4319 If the second redisplay wouldn't mark rows in the | |
4320 current matrix invalid, the third redisplay might be | |
4321 tempted to optimize redisplay based on lines displayed | |
4322 in the first redisplay. */ | |
4323 if (MATRIX_ROW_BOTTOM_Y (row) >= yb) | |
4324 for (i = vpos + 1; i < w->current_matrix->nrows - 1; ++i) | |
4325 MATRIX_ROW (w->current_matrix, i)->enabled_p = 0; | |
4326 } | |
4327 | |
4328 /* Was display preempted? */ | |
4329 paused_p = row < end; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4330 |
38489
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4331 set_cursor: |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4332 |
54176
d1e478a807f4
(update_window): Update header line also if there are
Kim F. Storm <storm@cua.dk>
parents:
53881
diff
changeset
|
4333 /* Update the header line after scrolling because a new header |
d1e478a807f4
(update_window): Update header line also if there are
Kim F. Storm <storm@cua.dk>
parents:
53881
diff
changeset
|
4334 line would otherwise overwrite lines at the top of the window |
d1e478a807f4
(update_window): Update header line also if there are
Kim F. Storm <storm@cua.dk>
parents:
53881
diff
changeset
|
4335 that can be scrolled. */ |
d1e478a807f4
(update_window): Update header line also if there are
Kim F. Storm <storm@cua.dk>
parents:
53881
diff
changeset
|
4336 if (header_line_row && header_line_row->enabled_p) |
d1e478a807f4
(update_window): Update header line also if there are
Kim F. Storm <storm@cua.dk>
parents:
53881
diff
changeset
|
4337 { |
d1e478a807f4
(update_window): Update header line also if there are
Kim F. Storm <storm@cua.dk>
parents:
53881
diff
changeset
|
4338 header_line_row->y = 0; |
d1e478a807f4
(update_window): Update header line also if there are
Kim F. Storm <storm@cua.dk>
parents:
53881
diff
changeset
|
4339 update_window_line (w, 0, &mouse_face_overwritten_p); |
d1e478a807f4
(update_window): Update header line also if there are
Kim F. Storm <storm@cua.dk>
parents:
53881
diff
changeset
|
4340 } |
d1e478a807f4
(update_window): Update header line also if there are
Kim F. Storm <storm@cua.dk>
parents:
53881
diff
changeset
|
4341 |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
4342 /* Fix the appearance of overlapping/overlapped rows. */ |
25012 | 4343 if (!paused_p && !w->pseudo_window_p) |
4344 { | |
65905
a82ae68a578e
(redraw_overlapped_rows, redraw_overlapping_rows)
Kim F. Storm <storm@cua.dk>
parents:
65890
diff
changeset
|
4345 #ifdef HAVE_WINDOW_SYSTEM |
30161
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
4346 if (changed_p && rif->fix_overlapping_area) |
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
4347 { |
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
4348 redraw_overlapped_rows (w, yb); |
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
4349 redraw_overlapping_rows (w, yb); |
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
4350 } |
65905
a82ae68a578e
(redraw_overlapped_rows, redraw_overlapping_rows)
Kim F. Storm <storm@cua.dk>
parents:
65890
diff
changeset
|
4351 #endif |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4352 |
25012 | 4353 /* Make cursor visible at cursor position of W. */ |
4354 set_window_cursor_after_update (w); | |
4355 | |
30161
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
4356 #if 0 /* Check that current matrix invariants are satisfied. This is |
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
4357 for debugging only. See the comment of check_matrix_invariants. */ |
25012 | 4358 IF_DEBUG (check_matrix_invariants (w)); |
4359 #endif | |
4360 } | |
4361 | |
4362 #if GLYPH_DEBUG | |
4363 /* Remember the redisplay method used to display the matrix. */ | |
4364 strcpy (w->current_matrix->method, w->desired_matrix->method); | |
4365 #endif | |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4366 |
53612
2ddd2a0d047a
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-41
Miles Bader <miles@gnu.org>
parents:
53605
diff
changeset
|
4367 #ifdef HAVE_WINDOW_SYSTEM |
53605
7dfd96e25ec6
(row_equal_p, update_window_line): Compare fringe bitmaps
Kim F. Storm <storm@cua.dk>
parents:
53514
diff
changeset
|
4368 update_window_fringes (w, 0); |
53612
2ddd2a0d047a
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-41
Miles Bader <miles@gnu.org>
parents:
53605
diff
changeset
|
4369 #endif |
53605
7dfd96e25ec6
(row_equal_p, update_window_line): Compare fringe bitmaps
Kim F. Storm <storm@cua.dk>
parents:
53514
diff
changeset
|
4370 |
38489
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4371 /* End the update of window W. Don't set the cursor if we |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4372 paused updating the display because in this case, |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4373 set_window_cursor_after_update hasn't been called, and |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4374 output_cursor doesn't contain the cursor location. */ |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4375 rif->update_window_end_hook (w, !paused_p, mouse_face_overwritten_p); |
25012 | 4376 } |
4377 else | |
4378 paused_p = 1; | |
4379 | |
34893
779bd3fa820e
Use #if GLYPH_DEBUG instead of #ifdef GLYPH_DEBUG.
Gerd Moellmann <gerd@gnu.org>
parents:
34866
diff
changeset
|
4380 #if GLYPH_DEBUG |
34944
4fc804373f2a
(update_window): Don't check_current_matrix_flags.
Gerd Moellmann <gerd@gnu.org>
parents:
34929
diff
changeset
|
4381 /* check_current_matrix_flags (w); */ |
34866
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
4382 add_window_display_history (w, w->current_matrix->method, paused_p); |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
4383 #endif |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4384 |
25012 | 4385 clear_glyph_matrix (desired_matrix); |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4386 |
25012 | 4387 return paused_p; |
4388 } | |
4389 | |
4390 | |
4391 /* Update the display of area AREA in window W, row number VPOS. | |
4392 AREA can be either LEFT_MARGIN_AREA or RIGHT_MARGIN_AREA. */ | |
4393 | |
4394 static void | |
4395 update_marginal_area (w, area, vpos) | |
4396 struct window *w; | |
4397 int area, vpos; | |
4398 { | |
4399 struct glyph_row *desired_row = MATRIX_ROW (w->desired_matrix, vpos); | |
82992
5de4189e659d
Got rid of the rif (window-based redisplay interface) global variable.
Karoly Lorentey <lorentey@elte.hu>
parents:
82990
diff
changeset
|
4400 struct redisplay_interface *rif = FRAME_RIF (XFRAME (WINDOW_FRAME (w))); |
25012 | 4401 |
4402 /* Let functions in xterm.c know what area subsequent X positions | |
4403 will be relative to. */ | |
4404 updated_area = area; | |
4405 | |
4406 /* Set cursor to start of glyphs, write them, and clear to the end | |
4407 of the area. I don't think that something more sophisticated is | |
4408 necessary here, since marginal areas will not be the default. */ | |
4409 rif->cursor_to (vpos, 0, desired_row->y, 0); | |
4410 if (desired_row->used[area]) | |
4411 rif->write_glyphs (desired_row->glyphs[area], desired_row->used[area]); | |
4412 rif->clear_end_of_line (-1); | |
4413 } | |
4414 | |
4415 | |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4416 /* Update the display of the text area of row VPOS in window W. |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4417 Value is non-zero if display has changed. */ |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4418 |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4419 static int |
25012 | 4420 update_text_area (w, vpos) |
4421 struct window *w; | |
4422 int vpos; | |
314 | 4423 { |
25012 | 4424 struct glyph_row *current_row = MATRIX_ROW (w->current_matrix, vpos); |
4425 struct glyph_row *desired_row = MATRIX_ROW (w->desired_matrix, vpos); | |
82992
5de4189e659d
Got rid of the rif (window-based redisplay interface) global variable.
Karoly Lorentey <lorentey@elte.hu>
parents:
82990
diff
changeset
|
4426 struct redisplay_interface *rif = FRAME_RIF (XFRAME (WINDOW_FRAME (w))); |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4427 int changed_p = 0; |
25012 | 4428 |
4429 /* Let functions in xterm.c know what area subsequent X positions | |
4430 will be relative to. */ | |
4431 updated_area = TEXT_AREA; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4432 |
25012 | 4433 /* If rows are at different X or Y, or rows have different height, |
4434 or the current row is marked invalid, write the entire line. */ | |
4435 if (!current_row->enabled_p | |
4436 || desired_row->y != current_row->y | |
4437 || desired_row->ascent != current_row->ascent | |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4438 || desired_row->phys_ascent != current_row->phys_ascent |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4439 || desired_row->phys_height != current_row->phys_height |
25012 | 4440 || desired_row->visible_height != current_row->visible_height |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4441 || current_row->overlapped_p |
75371
7267980a2f42
* dispnew.c (update_text_area): Revert 2006-09-17 change.
Chong Yidong <cyd@stupidchicken.com>
parents:
75348
diff
changeset
|
4442 /* This next line is necessary for correctly redrawing |
7267980a2f42
* dispnew.c (update_text_area): Revert 2006-09-17 change.
Chong Yidong <cyd@stupidchicken.com>
parents:
75348
diff
changeset
|
4443 mouse-face areas after scrolling and other operations. |
7267980a2f42
* dispnew.c (update_text_area): Revert 2006-09-17 change.
Chong Yidong <cyd@stupidchicken.com>
parents:
75348
diff
changeset
|
4444 However, it causes excessive flickering when mouse is moved |
7267980a2f42
* dispnew.c (update_text_area): Revert 2006-09-17 change.
Chong Yidong <cyd@stupidchicken.com>
parents:
75348
diff
changeset
|
4445 across the mode line. Luckily, turning it off for the mode |
76069
898ccefda9ce
(update_text_area): Clear mouse face on header lines.
Kim F. Storm <storm@cua.dk>
parents:
76065
diff
changeset
|
4446 line doesn't seem to hurt anything. -- cyd. |
898ccefda9ce
(update_text_area): Clear mouse face on header lines.
Kim F. Storm <storm@cua.dk>
parents:
76065
diff
changeset
|
4447 But it is still needed for the header line. -- kfs. */ |
898ccefda9ce
(update_text_area): Clear mouse face on header lines.
Kim F. Storm <storm@cua.dk>
parents:
76065
diff
changeset
|
4448 || (current_row->mouse_face_p |
898ccefda9ce
(update_text_area): Clear mouse face on header lines.
Kim F. Storm <storm@cua.dk>
parents:
76065
diff
changeset
|
4449 && !(current_row->mode_line_p && vpos > 0)) |
25012 | 4450 || current_row->x != desired_row->x) |
4451 { | |
4452 rif->cursor_to (vpos, 0, desired_row->y, desired_row->x); | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4453 |
25012 | 4454 if (desired_row->used[TEXT_AREA]) |
4455 rif->write_glyphs (desired_row->glyphs[TEXT_AREA], | |
4456 desired_row->used[TEXT_AREA]); | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4457 |
25012 | 4458 /* Clear to end of window. */ |
4459 rif->clear_end_of_line (-1); | |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4460 changed_p = 1; |
44815
cf2454d3a103
(update_text_area): Set phys_cursor_on_p to 0 in the
Gerd Moellmann <gerd@gnu.org>
parents:
44580
diff
changeset
|
4461 |
cf2454d3a103
(update_text_area): Set phys_cursor_on_p to 0 in the
Gerd Moellmann <gerd@gnu.org>
parents:
44580
diff
changeset
|
4462 /* This erases the cursor. We do this here because |
cf2454d3a103
(update_text_area): Set phys_cursor_on_p to 0 in the
Gerd Moellmann <gerd@gnu.org>
parents:
44580
diff
changeset
|
4463 notice_overwritten_cursor cannot easily check this, which |
cf2454d3a103
(update_text_area): Set phys_cursor_on_p to 0 in the
Gerd Moellmann <gerd@gnu.org>
parents:
44580
diff
changeset
|
4464 might indicate that the whole functionality of |
cf2454d3a103
(update_text_area): Set phys_cursor_on_p to 0 in the
Gerd Moellmann <gerd@gnu.org>
parents:
44580
diff
changeset
|
4465 notice_overwritten_cursor would better be implemented here. |
cf2454d3a103
(update_text_area): Set phys_cursor_on_p to 0 in the
Gerd Moellmann <gerd@gnu.org>
parents:
44580
diff
changeset
|
4466 On the other hand, we need notice_overwritten_cursor as long |
cf2454d3a103
(update_text_area): Set phys_cursor_on_p to 0 in the
Gerd Moellmann <gerd@gnu.org>
parents:
44580
diff
changeset
|
4467 as mouse highlighting is done asynchronously outside of |
cf2454d3a103
(update_text_area): Set phys_cursor_on_p to 0 in the
Gerd Moellmann <gerd@gnu.org>
parents:
44580
diff
changeset
|
4468 redisplay. */ |
cf2454d3a103
(update_text_area): Set phys_cursor_on_p to 0 in the
Gerd Moellmann <gerd@gnu.org>
parents:
44580
diff
changeset
|
4469 if (vpos == w->phys_cursor.vpos) |
cf2454d3a103
(update_text_area): Set phys_cursor_on_p to 0 in the
Gerd Moellmann <gerd@gnu.org>
parents:
44580
diff
changeset
|
4470 w->phys_cursor_on_p = 0; |
25012 | 4471 } |
4472 else | |
4473 { | |
4474 int stop, i, x; | |
4475 struct glyph *current_glyph = current_row->glyphs[TEXT_AREA]; | |
4476 struct glyph *desired_glyph = desired_row->glyphs[TEXT_AREA]; | |
33596
680ddd4ab1f9
(update_text_area): Don't skip over equal glyphs
Gerd Moellmann <gerd@gnu.org>
parents:
33527
diff
changeset
|
4477 int overlapping_glyphs_p = current_row->contains_overlapping_glyphs_p; |
35268
d93bf580d166
(update_text_area): Put code which decrements the
Gerd Moellmann <gerd@gnu.org>
parents:
35006
diff
changeset
|
4478 int desired_stop_pos = desired_row->used[TEXT_AREA]; |
98589
b4502c55e86b
(update_text_area): Avoid looping due to large glyph
Chong Yidong <cyd@stupidchicken.com>
parents:
98508
diff
changeset
|
4479 int abort_skipping = 0; |
35268
d93bf580d166
(update_text_area): Put code which decrements the
Gerd Moellmann <gerd@gnu.org>
parents:
35006
diff
changeset
|
4480 |
69110
9d86d35acf33
(update_text_area): Avoid needless redraw of rightmost
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
68651
diff
changeset
|
4481 /* If the desired row extends its face to the text area end, and |
9d86d35acf33
(update_text_area): Avoid needless redraw of rightmost
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
68651
diff
changeset
|
4482 unless the current row also does so at the same position, |
25012 | 4483 make sure we write at least one glyph, so that the face |
4484 extension actually takes place. */ | |
69110
9d86d35acf33
(update_text_area): Avoid needless redraw of rightmost
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
68651
diff
changeset
|
4485 if (MATRIX_ROW_EXTENDS_FACE_P (desired_row) |
9d86d35acf33
(update_text_area): Avoid needless redraw of rightmost
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
68651
diff
changeset
|
4486 && (desired_stop_pos < current_row->used[TEXT_AREA] |
9d86d35acf33
(update_text_area): Avoid needless redraw of rightmost
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
68651
diff
changeset
|
4487 || (desired_stop_pos == current_row->used[TEXT_AREA] |
9d86d35acf33
(update_text_area): Avoid needless redraw of rightmost
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
68651
diff
changeset
|
4488 && !MATRIX_ROW_EXTENDS_FACE_P (current_row)))) |
35268
d93bf580d166
(update_text_area): Put code which decrements the
Gerd Moellmann <gerd@gnu.org>
parents:
35006
diff
changeset
|
4489 --desired_stop_pos; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4490 |
25012 | 4491 stop = min (current_row->used[TEXT_AREA], desired_stop_pos); |
4492 i = 0; | |
4493 x = desired_row->x; | |
36097
1dfaaf6d6166
(update_text_area): Undo change of 2001-01-12.
Gerd Moellmann <gerd@gnu.org>
parents:
35924
diff
changeset
|
4494 |
1dfaaf6d6166
(update_text_area): Undo change of 2001-01-12.
Gerd Moellmann <gerd@gnu.org>
parents:
35924
diff
changeset
|
4495 /* Loop over glyphs that current and desired row may have |
1dfaaf6d6166
(update_text_area): Undo change of 2001-01-12.
Gerd Moellmann <gerd@gnu.org>
parents:
35924
diff
changeset
|
4496 in common. */ |
25012 | 4497 while (i < stop) |
4498 { | |
98589
b4502c55e86b
(update_text_area): Avoid looping due to large glyph
Chong Yidong <cyd@stupidchicken.com>
parents:
98508
diff
changeset
|
4499 int can_skip_p = !abort_skipping; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4500 |
25012 | 4501 /* Skip over glyphs that both rows have in common. These |
33596
680ddd4ab1f9
(update_text_area): Don't skip over equal glyphs
Gerd Moellmann <gerd@gnu.org>
parents:
33527
diff
changeset
|
4502 don't have to be written. We can't skip if the last |
680ddd4ab1f9
(update_text_area): Don't skip over equal glyphs
Gerd Moellmann <gerd@gnu.org>
parents:
33527
diff
changeset
|
4503 current glyph overlaps the glyph to its right. For |
680ddd4ab1f9
(update_text_area): Don't skip over equal glyphs
Gerd Moellmann <gerd@gnu.org>
parents:
33527
diff
changeset
|
4504 example, consider a current row of `if ' with the `f' in |
680ddd4ab1f9
(update_text_area): Don't skip over equal glyphs
Gerd Moellmann <gerd@gnu.org>
parents:
33527
diff
changeset
|
4505 Courier bold so that it overlaps the ` ' to its right. |
680ddd4ab1f9
(update_text_area): Don't skip over equal glyphs
Gerd Moellmann <gerd@gnu.org>
parents:
33527
diff
changeset
|
4506 If the desired row is ` ', we would skip over the space |
680ddd4ab1f9
(update_text_area): Don't skip over equal glyphs
Gerd Moellmann <gerd@gnu.org>
parents:
33527
diff
changeset
|
4507 after the `if' and there would remain a pixel from the |
680ddd4ab1f9
(update_text_area): Don't skip over equal glyphs
Gerd Moellmann <gerd@gnu.org>
parents:
33527
diff
changeset
|
4508 `f' on the screen. */ |
680ddd4ab1f9
(update_text_area): Don't skip over equal glyphs
Gerd Moellmann <gerd@gnu.org>
parents:
33527
diff
changeset
|
4509 if (overlapping_glyphs_p && i > 0) |
25012 | 4510 { |
33596
680ddd4ab1f9
(update_text_area): Don't skip over equal glyphs
Gerd Moellmann <gerd@gnu.org>
parents:
33527
diff
changeset
|
4511 struct glyph *glyph = ¤t_row->glyphs[TEXT_AREA][i - 1]; |
680ddd4ab1f9
(update_text_area): Don't skip over equal glyphs
Gerd Moellmann <gerd@gnu.org>
parents:
33527
diff
changeset
|
4512 int left, right; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4513 |
33596
680ddd4ab1f9
(update_text_area): Don't skip over equal glyphs
Gerd Moellmann <gerd@gnu.org>
parents:
33527
diff
changeset
|
4514 rif->get_glyph_overhangs (glyph, XFRAME (w->frame), |
680ddd4ab1f9
(update_text_area): Don't skip over equal glyphs
Gerd Moellmann <gerd@gnu.org>
parents:
33527
diff
changeset
|
4515 &left, &right); |
98589
b4502c55e86b
(update_text_area): Avoid looping due to large glyph
Chong Yidong <cyd@stupidchicken.com>
parents:
98508
diff
changeset
|
4516 can_skip_p = (right == 0 && !abort_skipping); |
25012 | 4517 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4518 |
33603
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4519 if (can_skip_p) |
25012 | 4520 { |
98589
b4502c55e86b
(update_text_area): Avoid looping due to large glyph
Chong Yidong <cyd@stupidchicken.com>
parents:
98508
diff
changeset
|
4521 int start_hpos = i; |
b4502c55e86b
(update_text_area): Avoid looping due to large glyph
Chong Yidong <cyd@stupidchicken.com>
parents:
98508
diff
changeset
|
4522 |
33603
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4523 while (i < stop |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4524 && GLYPH_EQUAL_P (desired_glyph, current_glyph)) |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4525 { |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4526 x += desired_glyph->pixel_width; |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4527 ++desired_glyph, ++current_glyph, ++i; |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4528 } |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4529 |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4530 /* Consider the case that the current row contains "xxx |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4531 ppp ggg" in italic Courier font, and the desired row |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4532 is "xxx ggg". The character `p' has lbearing, `g' |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4533 has not. The loop above will stop in front of the |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4534 first `p' in the current row. If we would start |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4535 writing glyphs there, we wouldn't erase the lbearing |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4536 of the `p'. The rest of the lbearing problem is then |
50218
06f75553f0a4
(mode_line_string, marginal_area_string): Use enum
Kim F. Storm <storm@cua.dk>
parents:
49600
diff
changeset
|
4537 taken care of by draw_glyphs. */ |
33603
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4538 if (overlapping_glyphs_p |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4539 && i > 0 |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4540 && i < current_row->used[TEXT_AREA] |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4541 && (current_row->used[TEXT_AREA] |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4542 != desired_row->used[TEXT_AREA])) |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4543 { |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4544 int left, right; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4545 |
33603
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4546 rif->get_glyph_overhangs (current_glyph, XFRAME (w->frame), |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4547 &left, &right); |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4548 while (left > 0 && i > 0) |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4549 { |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4550 --i, --desired_glyph, --current_glyph; |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4551 x -= desired_glyph->pixel_width; |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4552 left -= desired_glyph->pixel_width; |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4553 } |
98589
b4502c55e86b
(update_text_area): Avoid looping due to large glyph
Chong Yidong <cyd@stupidchicken.com>
parents:
98508
diff
changeset
|
4554 |
b4502c55e86b
(update_text_area): Avoid looping due to large glyph
Chong Yidong <cyd@stupidchicken.com>
parents:
98508
diff
changeset
|
4555 /* Abort the skipping algorithm if we end up before |
b4502c55e86b
(update_text_area): Avoid looping due to large glyph
Chong Yidong <cyd@stupidchicken.com>
parents:
98508
diff
changeset
|
4556 our starting point, to avoid looping (bug#1070). |
b4502c55e86b
(update_text_area): Avoid looping due to large glyph
Chong Yidong <cyd@stupidchicken.com>
parents:
98508
diff
changeset
|
4557 This can happen when the lbearing is larger than |
b4502c55e86b
(update_text_area): Avoid looping due to large glyph
Chong Yidong <cyd@stupidchicken.com>
parents:
98508
diff
changeset
|
4558 the pixel width. */ |
b4502c55e86b
(update_text_area): Avoid looping due to large glyph
Chong Yidong <cyd@stupidchicken.com>
parents:
98508
diff
changeset
|
4559 abort_skipping = (i < start_hpos); |
25012 | 4560 } |
4561 } | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4562 |
25012 | 4563 /* Try to avoid writing the entire rest of the desired row |
4564 by looking for a resync point. This mainly prevents | |
4565 mode line flickering in the case the mode line is in | |
4566 fixed-pitch font, which it usually will be. */ | |
4567 if (i < desired_row->used[TEXT_AREA]) | |
4568 { | |
4569 int start_x = x, start_hpos = i; | |
4570 struct glyph *start = desired_glyph; | |
4571 int current_x = x; | |
33603
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4572 int skip_first_p = !can_skip_p; |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4573 |
25012 | 4574 /* Find the next glyph that's equal again. */ |
4575 while (i < stop | |
33603
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4576 && (skip_first_p |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4577 || !GLYPH_EQUAL_P (desired_glyph, current_glyph)) |
25012 | 4578 && x == current_x) |
4579 { | |
4580 x += desired_glyph->pixel_width; | |
4581 current_x += current_glyph->pixel_width; | |
4582 ++desired_glyph, ++current_glyph, ++i; | |
33603
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4583 skip_first_p = 0; |
25012 | 4584 } |
4585 | |
4586 if (i == start_hpos || x != current_x) | |
4587 { | |
4588 i = start_hpos; | |
4589 x = start_x; | |
4590 desired_glyph = start; | |
4591 break; | |
4592 } | |
33596
680ddd4ab1f9
(update_text_area): Don't skip over equal glyphs
Gerd Moellmann <gerd@gnu.org>
parents:
33527
diff
changeset
|
4593 |
25012 | 4594 rif->cursor_to (vpos, start_hpos, desired_row->y, start_x); |
4595 rif->write_glyphs (start, i - start_hpos); | |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4596 changed_p = 1; |
25012 | 4597 } |
4598 } | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4599 |
25012 | 4600 /* Write the rest. */ |
4601 if (i < desired_row->used[TEXT_AREA]) | |
4602 { | |
4603 rif->cursor_to (vpos, i, desired_row->y, x); | |
4604 rif->write_glyphs (desired_glyph, desired_row->used[TEXT_AREA] - i); | |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4605 changed_p = 1; |
25012 | 4606 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4607 |
25012 | 4608 /* Maybe clear to end of line. */ |
4609 if (MATRIX_ROW_EXTENDS_FACE_P (desired_row)) | |
4610 { | |
4611 /* If new row extends to the end of the text area, nothing | |
4612 has to be cleared, if and only if we did a write_glyphs | |
4613 above. This is made sure by setting desired_stop_pos | |
4614 appropriately above. */ | |
69110
9d86d35acf33
(update_text_area): Avoid needless redraw of rightmost
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
68651
diff
changeset
|
4615 xassert (i < desired_row->used[TEXT_AREA] |
9d86d35acf33
(update_text_area): Avoid needless redraw of rightmost
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
68651
diff
changeset
|
4616 || ((desired_row->used[TEXT_AREA] |
9d86d35acf33
(update_text_area): Avoid needless redraw of rightmost
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
68651
diff
changeset
|
4617 == current_row->used[TEXT_AREA]) |
9d86d35acf33
(update_text_area): Avoid needless redraw of rightmost
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
68651
diff
changeset
|
4618 && MATRIX_ROW_EXTENDS_FACE_P (current_row))); |
25012 | 4619 } |
4620 else if (MATRIX_ROW_EXTENDS_FACE_P (current_row)) | |
4621 { | |
4622 /* If old row extends to the end of the text area, clear. */ | |
4623 if (i >= desired_row->used[TEXT_AREA]) | |
4624 rif->cursor_to (vpos, i, desired_row->y, | |
53055
4cb0d5b004e9
(update_text_area): Fix redisplay error when hscroll
Kim F. Storm <storm@cua.dk>
parents:
52401
diff
changeset
|
4625 desired_row->pixel_width); |
25012 | 4626 rif->clear_end_of_line (-1); |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4627 changed_p = 1; |
25012 | 4628 } |
4629 else if (desired_row->pixel_width < current_row->pixel_width) | |
4630 { | |
4631 /* Otherwise clear to the end of the old row. Everything | |
4632 after that position should be clear already. */ | |
4633 int x; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4634 |
25012 | 4635 if (i >= desired_row->used[TEXT_AREA]) |
4636 rif->cursor_to (vpos, i, desired_row->y, | |
53055
4cb0d5b004e9
(update_text_area): Fix redisplay error when hscroll
Kim F. Storm <storm@cua.dk>
parents:
52401
diff
changeset
|
4637 desired_row->pixel_width); |
25012 | 4638 |
4639 /* If cursor is displayed at the end of the line, make sure | |
4640 it's cleared. Nowadays we don't have a phys_cursor_glyph | |
4641 with which to erase the cursor (because this method | |
4642 doesn't work with lbearing/rbearing), so we must do it | |
4643 this way. */ | |
4644 if (vpos == w->phys_cursor.vpos | |
4645 && w->phys_cursor.hpos >= desired_row->used[TEXT_AREA]) | |
4646 { | |
4647 w->phys_cursor_on_p = 0; | |
4648 x = -1; | |
4649 } | |
4650 else | |
53055
4cb0d5b004e9
(update_text_area): Fix redisplay error when hscroll
Kim F. Storm <storm@cua.dk>
parents:
52401
diff
changeset
|
4651 x = current_row->pixel_width; |
25012 | 4652 rif->clear_end_of_line (x); |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4653 changed_p = 1; |
25012 | 4654 } |
4655 } | |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4656 |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4657 return changed_p; |
25012 | 4658 } |
4659 | |
4660 | |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4661 /* Update row VPOS in window W. Value is non-zero if display has been |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4662 changed. */ |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4663 |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4664 static int |
30161
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
4665 update_window_line (w, vpos, mouse_face_overwritten_p) |
25012 | 4666 struct window *w; |
30161
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
4667 int vpos, *mouse_face_overwritten_p; |
25012 | 4668 { |
4669 struct glyph_row *current_row = MATRIX_ROW (w->current_matrix, vpos); | |
4670 struct glyph_row *desired_row = MATRIX_ROW (w->desired_matrix, vpos); | |
82992
5de4189e659d
Got rid of the rif (window-based redisplay interface) global variable.
Karoly Lorentey <lorentey@elte.hu>
parents:
82990
diff
changeset
|
4671 struct redisplay_interface *rif = FRAME_RIF (XFRAME (WINDOW_FRAME (w))); |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4672 int changed_p = 0; |
25012 | 4673 |
4674 /* Set the row being updated. This is important to let xterm.c | |
4675 know what line height values are in effect. */ | |
4676 updated_row = desired_row; | |
4677 | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4678 /* A row can be completely invisible in case a desired matrix was |
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4679 built with a vscroll and then make_cursor_line_fully_visible shifts |
31690
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4680 the matrix. Make sure to make such rows current anyway, since |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4681 we need the correct y-position, for example, in the current matrix. */ |
31726
59b455472b56
(update_window_line): Make sure to always draw
Gerd Moellmann <gerd@gnu.org>
parents:
31690
diff
changeset
|
4682 if (desired_row->mode_line_p |
59b455472b56
(update_window_line): Make sure to always draw
Gerd Moellmann <gerd@gnu.org>
parents:
31690
diff
changeset
|
4683 || desired_row->visible_height > 0) |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4684 { |
31690
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4685 xassert (desired_row->enabled_p); |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4686 |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4687 /* Update display of the left margin area, if there is one. */ |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4688 if (!desired_row->full_width_p |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
4689 && !NILP (w->left_margin_cols)) |
31690
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4690 { |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4691 changed_p = 1; |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4692 update_marginal_area (w, LEFT_MARGIN_AREA, vpos); |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4693 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4694 |
31690
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4695 /* Update the display of the text area. */ |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4696 if (update_text_area (w, vpos)) |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4697 { |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4698 changed_p = 1; |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4699 if (current_row->mouse_face_p) |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4700 *mouse_face_overwritten_p = 1; |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4701 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4702 |
31690
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4703 /* Update display of the right margin area, if there is one. */ |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4704 if (!desired_row->full_width_p |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
4705 && !NILP (w->right_margin_cols)) |
31690
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4706 { |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4707 changed_p = 1; |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4708 update_marginal_area (w, RIGHT_MARGIN_AREA, vpos); |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4709 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4710 |
31690
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4711 /* Draw truncation marks etc. */ |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4712 if (!current_row->enabled_p |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4713 || desired_row->y != current_row->y |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4714 || desired_row->visible_height != current_row->visible_height |
53605
7dfd96e25ec6
(row_equal_p, update_window_line): Compare fringe bitmaps
Kim F. Storm <storm@cua.dk>
parents:
53514
diff
changeset
|
4715 || desired_row->cursor_in_fringe_p != current_row->cursor_in_fringe_p |
61633
a76a30ee7c89
(row_equal_p, update_window_line, scrolling_window):
Kim F. Storm <storm@cua.dk>
parents:
61416
diff
changeset
|
4716 || desired_row->overlay_arrow_bitmap != current_row->overlay_arrow_bitmap |
53605
7dfd96e25ec6
(row_equal_p, update_window_line): Compare fringe bitmaps
Kim F. Storm <storm@cua.dk>
parents:
53514
diff
changeset
|
4717 || current_row->redraw_fringe_bitmaps_p |
31690
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4718 || desired_row->mode_line_p != current_row->mode_line_p |
53605
7dfd96e25ec6
(row_equal_p, update_window_line): Compare fringe bitmaps
Kim F. Storm <storm@cua.dk>
parents:
53514
diff
changeset
|
4719 || desired_row->exact_window_width_line_p != current_row->exact_window_width_line_p |
31690
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4720 || (MATRIX_ROW_CONTINUATION_LINE_P (desired_row) |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4721 != MATRIX_ROW_CONTINUATION_LINE_P (current_row))) |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4722 rif->after_update_window_line_hook (desired_row); |
30161
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
4723 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4724 |
25012 | 4725 /* Update current_row from desired_row. */ |
4726 make_current (w->desired_matrix, w->current_matrix, vpos); | |
4727 updated_row = NULL; | |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4728 return changed_p; |
25012 | 4729 } |
4730 | |
4731 | |
4732 /* Set the cursor after an update of window W. This function may only | |
4733 be called from update_window. */ | |
4734 | |
4735 static void | |
4736 set_window_cursor_after_update (w) | |
4737 struct window *w; | |
4738 { | |
4739 struct frame *f = XFRAME (w->frame); | |
82992
5de4189e659d
Got rid of the rif (window-based redisplay interface) global variable.
Karoly Lorentey <lorentey@elte.hu>
parents:
82990
diff
changeset
|
4740 struct redisplay_interface *rif = FRAME_RIF (f); |
25012 | 4741 int cx, cy, vpos, hpos; |
4742 | |
4743 /* Not intended for frame matrix updates. */ | |
4744 xassert (FRAME_WINDOW_P (f)); | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4745 |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
4746 if (cursor_in_echo_area |
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
4747 && !NILP (echo_area_buffer[0]) |
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
4748 /* If we are showing a message instead of the mini-buffer, |
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
4749 show the cursor for the message instead. */ |
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
4750 && XWINDOW (minibuf_window) == w |
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
4751 && EQ (minibuf_window, echo_area_window) |
25012 | 4752 /* These cases apply only to the frame that contains |
4753 the active mini-buffer window. */ | |
4754 && FRAME_HAS_MINIBUF_P (f) | |
4755 && EQ (FRAME_MINIBUF_WINDOW (f), echo_area_window)) | |
4756 { | |
4757 cx = cy = vpos = hpos = 0; | |
4758 | |
4759 if (cursor_in_echo_area >= 0) | |
4760 { | |
4761 /* If the mini-buffer is several lines high, find the last | |
4762 line that has any text on it. Note: either all lines | |
4763 are enabled or none. Otherwise we wouldn't be able to | |
4764 determine Y. */ | |
25190
a14edd4a5f4a
(set_window_cursor_after_update): Correct cursor
Gerd Moellmann <gerd@gnu.org>
parents:
25186
diff
changeset
|
4765 struct glyph_row *row, *last_row; |
a14edd4a5f4a
(set_window_cursor_after_update): Correct cursor
Gerd Moellmann <gerd@gnu.org>
parents:
25186
diff
changeset
|
4766 struct glyph *glyph; |
a14edd4a5f4a
(set_window_cursor_after_update): Correct cursor
Gerd Moellmann <gerd@gnu.org>
parents:
25186
diff
changeset
|
4767 int yb = window_text_bottom_y (w); |
a14edd4a5f4a
(set_window_cursor_after_update): Correct cursor
Gerd Moellmann <gerd@gnu.org>
parents:
25186
diff
changeset
|
4768 |
a14edd4a5f4a
(set_window_cursor_after_update): Correct cursor
Gerd Moellmann <gerd@gnu.org>
parents:
25186
diff
changeset
|
4769 last_row = NULL; |
39254
73dd40615520
(set_window_cursor_after_update): Fix code
Gerd Moellmann <gerd@gnu.org>
parents:
39226
diff
changeset
|
4770 row = w->current_matrix->rows; |
73dd40615520
(set_window_cursor_after_update): Fix code
Gerd Moellmann <gerd@gnu.org>
parents:
39226
diff
changeset
|
4771 while (row->enabled_p |
73dd40615520
(set_window_cursor_after_update): Fix code
Gerd Moellmann <gerd@gnu.org>
parents:
39226
diff
changeset
|
4772 && (last_row == NULL |
73dd40615520
(set_window_cursor_after_update): Fix code
Gerd Moellmann <gerd@gnu.org>
parents:
39226
diff
changeset
|
4773 || MATRIX_ROW_BOTTOM_Y (row) <= yb)) |
25012 | 4774 { |
25190
a14edd4a5f4a
(set_window_cursor_after_update): Correct cursor
Gerd Moellmann <gerd@gnu.org>
parents:
25186
diff
changeset
|
4775 if (row->used[TEXT_AREA] |
a14edd4a5f4a
(set_window_cursor_after_update): Correct cursor
Gerd Moellmann <gerd@gnu.org>
parents:
25186
diff
changeset
|
4776 && row->glyphs[TEXT_AREA][0].charpos >= 0) |
a14edd4a5f4a
(set_window_cursor_after_update): Correct cursor
Gerd Moellmann <gerd@gnu.org>
parents:
25186
diff
changeset
|
4777 last_row = row; |
39254
73dd40615520
(set_window_cursor_after_update): Fix code
Gerd Moellmann <gerd@gnu.org>
parents:
39226
diff
changeset
|
4778 ++row; |
25012 | 4779 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4780 |
25012 | 4781 if (last_row) |
4782 { | |
39254
73dd40615520
(set_window_cursor_after_update): Fix code
Gerd Moellmann <gerd@gnu.org>
parents:
39226
diff
changeset
|
4783 struct glyph *start = last_row->glyphs[TEXT_AREA]; |
73dd40615520
(set_window_cursor_after_update): Fix code
Gerd Moellmann <gerd@gnu.org>
parents:
39226
diff
changeset
|
4784 struct glyph *last = start + last_row->used[TEXT_AREA] - 1; |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
4785 |
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
4786 while (last > start && last->charpos < 0) |
25190
a14edd4a5f4a
(set_window_cursor_after_update): Correct cursor
Gerd Moellmann <gerd@gnu.org>
parents:
25186
diff
changeset
|
4787 --last; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4788 |
25190
a14edd4a5f4a
(set_window_cursor_after_update): Correct cursor
Gerd Moellmann <gerd@gnu.org>
parents:
25186
diff
changeset
|
4789 for (glyph = start; glyph < last; ++glyph) |
a14edd4a5f4a
(set_window_cursor_after_update): Correct cursor
Gerd Moellmann <gerd@gnu.org>
parents:
25186
diff
changeset
|
4790 { |
a14edd4a5f4a
(set_window_cursor_after_update): Correct cursor
Gerd Moellmann <gerd@gnu.org>
parents:
25186
diff
changeset
|
4791 cx += glyph->pixel_width; |
a14edd4a5f4a
(set_window_cursor_after_update): Correct cursor
Gerd Moellmann <gerd@gnu.org>
parents:
25186
diff
changeset
|
4792 ++hpos; |
a14edd4a5f4a
(set_window_cursor_after_update): Correct cursor
Gerd Moellmann <gerd@gnu.org>
parents:
25186
diff
changeset
|
4793 } |
a14edd4a5f4a
(set_window_cursor_after_update): Correct cursor
Gerd Moellmann <gerd@gnu.org>
parents:
25186
diff
changeset
|
4794 |
25012 | 4795 cy = last_row->y; |
25190
a14edd4a5f4a
(set_window_cursor_after_update): Correct cursor
Gerd Moellmann <gerd@gnu.org>
parents:
25186
diff
changeset
|
4796 vpos = MATRIX_ROW_VPOS (last_row, w->current_matrix); |
25012 | 4797 } |
4798 } | |
4799 } | |
4800 else | |
4801 { | |
4802 cx = w->cursor.x; | |
4803 cy = w->cursor.y; | |
4804 hpos = w->cursor.hpos; | |
4805 vpos = w->cursor.vpos; | |
4806 } | |
4807 | |
4808 /* Window cursor can be out of sync for horizontally split windows. */ | |
4809 hpos = max (0, hpos); | |
4810 hpos = min (w->current_matrix->matrix_w - 1, hpos); | |
4811 vpos = max (0, vpos); | |
4812 vpos = min (w->current_matrix->nrows - 1, vpos); | |
4813 rif->cursor_to (vpos, hpos, cy, cx); | |
4814 } | |
4815 | |
4816 | |
29980
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4817 /* Set WINDOW->must_be_updated_p to ON_P for all windows in the window |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4818 tree rooted at W. */ |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4819 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4820 void |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4821 set_window_update_flags (w, on_p) |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4822 struct window *w; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4823 int on_p; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4824 { |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4825 while (w) |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4826 { |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4827 if (!NILP (w->hchild)) |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4828 set_window_update_flags (XWINDOW (w->hchild), on_p); |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4829 else if (!NILP (w->vchild)) |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4830 set_window_update_flags (XWINDOW (w->vchild), on_p); |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4831 else |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4832 w->must_be_updated_p = on_p; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4833 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4834 w = NILP (w->next) ? 0 : XWINDOW (w->next); |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4835 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4836 } |
29980
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4837 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4838 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4839 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4840 /*********************************************************************** |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4841 Window-Based Scrolling |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4842 ***********************************************************************/ |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4843 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4844 /* Structure describing rows in scrolling_window. */ |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4845 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4846 struct row_entry |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4847 { |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4848 /* Number of occurrences of this row in desired and current matrix. */ |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4849 int old_uses, new_uses; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4850 |
29980
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4851 /* Vpos of row in new matrix. */ |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4852 int new_line_number; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4853 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4854 /* Bucket index of this row_entry in the hash table row_table. */ |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4855 int bucket; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4856 |
29980
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4857 /* The row described by this entry. */ |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4858 struct glyph_row *row; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4859 |
29980
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4860 /* Hash collision chain. */ |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4861 struct row_entry *next; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4862 }; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4863 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4864 /* A pool to allocate row_entry structures from, and the size of the |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4865 pool. The pool is reallocated in scrolling_window when we find |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4866 that we need a larger one. */ |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4867 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4868 static struct row_entry *row_entry_pool; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4869 static int row_entry_pool_size; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4870 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4871 /* Index of next free entry in row_entry_pool. */ |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4872 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4873 static int row_entry_idx; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4874 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4875 /* The hash table used during scrolling, and the table's size. This |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4876 table is used to quickly identify equal rows in the desired and |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4877 current matrix. */ |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4878 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4879 static struct row_entry **row_table; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4880 static int row_table_size; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4881 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4882 /* Vectors of pointers to row_entry structures belonging to the |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4883 current and desired matrix, and the size of the vectors. */ |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4884 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4885 static struct row_entry **old_lines, **new_lines; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4886 static int old_lines_size, new_lines_size; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4887 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4888 /* A pool to allocate run structures from, and its size. */ |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4889 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4890 static struct run *run_pool; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4891 static int runs_size; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4892 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4893 /* A vector of runs of lines found during scrolling. */ |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4894 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4895 static struct run **runs; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4896 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4897 /* Add glyph row ROW to the scrolling hash table during the scrolling |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4898 of window W. */ |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4899 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4900 static INLINE struct row_entry * |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4901 add_row_entry (w, row) |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4902 struct window *w; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4903 struct glyph_row *row; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4904 { |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4905 struct row_entry *entry; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4906 int i = row->hash % row_table_size; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4907 |
29980
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4908 entry = row_table[i]; |
30152
f6270e5282da
(direct_output_forward_char): Give up if currently
Gerd Moellmann <gerd@gnu.org>
parents:
30041
diff
changeset
|
4909 while (entry && !row_equal_p (w, entry->row, row, 1)) |
29980
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4910 entry = entry->next; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4911 |
29980
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4912 if (entry == NULL) |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4913 { |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4914 entry = row_entry_pool + row_entry_idx++; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4915 entry->row = row; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4916 entry->old_uses = entry->new_uses = 0; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4917 entry->new_line_number = 0; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4918 entry->bucket = i; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4919 entry->next = row_table[i]; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4920 row_table[i] = entry; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4921 } |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4922 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4923 return entry; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4924 } |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4925 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4926 |
25012 | 4927 /* Try to reuse part of the current display of W by scrolling lines. |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
4928 HEADER_LINE_P non-zero means W has a header line. |
25012 | 4929 |
4930 The algorithm is taken from Communications of the ACM, Apr78 "A | |
4931 Technique for Isolating Differences Between Files." It should take | |
4932 O(N) time. | |
4933 | |
4934 A short outline of the steps of the algorithm | |
4935 | |
4936 1. Skip lines equal at the start and end of both matrices. | |
4937 | |
4938 2. Enter rows in the current and desired matrix into a symbol | |
4939 table, counting how often they appear in both matrices. | |
4940 | |
4941 3. Rows that appear exactly once in both matrices serve as anchors, | |
4942 i.e. we assume that such lines are likely to have been moved. | |
4943 | |
4944 4. Starting from anchor lines, extend regions to be scrolled both | |
4945 forward and backward. | |
4946 | |
4947 Value is | |
4948 | |
4949 -1 if all rows were found to be equal. | |
4950 0 to indicate that we did not scroll the display, or | |
4951 1 if we did scroll. */ | |
4952 | |
4953 static int | |
25546 | 4954 scrolling_window (w, header_line_p) |
25012 | 4955 struct window *w; |
25546 | 4956 int header_line_p; |
25012 | 4957 { |
4958 struct glyph_matrix *desired_matrix = w->desired_matrix; | |
4959 struct glyph_matrix *current_matrix = w->current_matrix; | |
4960 int yb = window_text_bottom_y (w); | |
29980
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4961 int i, j, first_old, first_new, last_old, last_new; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4962 int nruns, nbytes, n, run_idx; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4963 struct row_entry *entry; |
82992
5de4189e659d
Got rid of the rif (window-based redisplay interface) global variable.
Karoly Lorentey <lorentey@elte.hu>
parents:
82990
diff
changeset
|
4964 struct redisplay_interface *rif = FRAME_RIF (XFRAME (WINDOW_FRAME (w))); |
25012 | 4965 |
4966 /* Skip over rows equal at the start. */ | |
31825
62830644b967
(scrolling_window): Compare y-positions of rows
Gerd Moellmann <gerd@gnu.org>
parents:
31726
diff
changeset
|
4967 for (i = header_line_p ? 1 : 0; i < current_matrix->nrows - 1; ++i) |
25012 | 4968 { |
31825
62830644b967
(scrolling_window): Compare y-positions of rows
Gerd Moellmann <gerd@gnu.org>
parents:
31726
diff
changeset
|
4969 struct glyph_row *d = MATRIX_ROW (desired_matrix, i); |
62830644b967
(scrolling_window): Compare y-positions of rows
Gerd Moellmann <gerd@gnu.org>
parents:
31726
diff
changeset
|
4970 struct glyph_row *c = MATRIX_ROW (current_matrix, i); |
62830644b967
(scrolling_window): Compare y-positions of rows
Gerd Moellmann <gerd@gnu.org>
parents:
31726
diff
changeset
|
4971 |
62830644b967
(scrolling_window): Compare y-positions of rows
Gerd Moellmann <gerd@gnu.org>
parents:
31726
diff
changeset
|
4972 if (c->enabled_p |
62830644b967
(scrolling_window): Compare y-positions of rows
Gerd Moellmann <gerd@gnu.org>
parents:
31726
diff
changeset
|
4973 && d->enabled_p |
53605
7dfd96e25ec6
(row_equal_p, update_window_line): Compare fringe bitmaps
Kim F. Storm <storm@cua.dk>
parents:
53514
diff
changeset
|
4974 && !d->redraw_fringe_bitmaps_p |
31825
62830644b967
(scrolling_window): Compare y-positions of rows
Gerd Moellmann <gerd@gnu.org>
parents:
31726
diff
changeset
|
4975 && c->y == d->y |
62830644b967
(scrolling_window): Compare y-positions of rows
Gerd Moellmann <gerd@gnu.org>
parents:
31726
diff
changeset
|
4976 && MATRIX_ROW_BOTTOM_Y (c) <= yb |
62830644b967
(scrolling_window): Compare y-positions of rows
Gerd Moellmann <gerd@gnu.org>
parents:
31726
diff
changeset
|
4977 && MATRIX_ROW_BOTTOM_Y (d) <= yb |
62830644b967
(scrolling_window): Compare y-positions of rows
Gerd Moellmann <gerd@gnu.org>
parents:
31726
diff
changeset
|
4978 && row_equal_p (w, c, d, 1)) |
62830644b967
(scrolling_window): Compare y-positions of rows
Gerd Moellmann <gerd@gnu.org>
parents:
31726
diff
changeset
|
4979 { |
62830644b967
(scrolling_window): Compare y-positions of rows
Gerd Moellmann <gerd@gnu.org>
parents:
31726
diff
changeset
|
4980 assign_row (c, d); |
62830644b967
(scrolling_window): Compare y-positions of rows
Gerd Moellmann <gerd@gnu.org>
parents:
31726
diff
changeset
|
4981 d->enabled_p = 0; |
62830644b967
(scrolling_window): Compare y-positions of rows
Gerd Moellmann <gerd@gnu.org>
parents:
31726
diff
changeset
|
4982 } |
62830644b967
(scrolling_window): Compare y-positions of rows
Gerd Moellmann <gerd@gnu.org>
parents:
31726
diff
changeset
|
4983 else |
62830644b967
(scrolling_window): Compare y-positions of rows
Gerd Moellmann <gerd@gnu.org>
parents:
31726
diff
changeset
|
4984 break; |
25012 | 4985 } |
4986 | |
4987 /* Give up if some rows in the desired matrix are not enabled. */ | |
4988 if (!MATRIX_ROW (desired_matrix, i)->enabled_p) | |
4989 return -1; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
4990 |
25012 | 4991 first_old = first_new = i; |
4992 | |
4993 /* Set last_new to the index + 1 of the last enabled row in the | |
4994 desired matrix. */ | |
4995 i = first_new + 1; | |
4996 while (i < desired_matrix->nrows - 1 | |
4997 && MATRIX_ROW (desired_matrix, i)->enabled_p | |
29980
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4998 && MATRIX_ROW_BOTTOM_Y (MATRIX_ROW (desired_matrix, i)) <= yb) |
25012 | 4999 ++i; |
5000 | |
5001 if (!MATRIX_ROW (desired_matrix, i)->enabled_p) | |
5002 return 0; | |
5003 | |
5004 last_new = i; | |
5005 | |
5006 /* Set last_old to the index + 1 of the last enabled row in the | |
5007 current matrix. We don't look at the enabled flag here because | |
5008 we plan to reuse part of the display even if other parts are | |
5009 disabled. */ | |
5010 i = first_old + 1; | |
34929
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
5011 while (i < current_matrix->nrows - 1) |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
5012 { |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
5013 int bottom = MATRIX_ROW_BOTTOM_Y (MATRIX_ROW (current_matrix, i)); |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
5014 if (bottom <= yb) |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
5015 ++i; |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
5016 if (bottom >= yb) |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
5017 break; |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
5018 } |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
5019 |
25012 | 5020 last_old = i; |
5021 | |
5022 /* Skip over rows equal at the bottom. */ | |
5023 i = last_new; | |
5024 j = last_old; | |
5025 while (i - 1 > first_new | |
5026 && j - 1 > first_old | |
5027 && MATRIX_ROW (current_matrix, i - 1)->enabled_p | |
5028 && (MATRIX_ROW (current_matrix, i - 1)->y | |
5029 == MATRIX_ROW (desired_matrix, j - 1)->y) | |
53605
7dfd96e25ec6
(row_equal_p, update_window_line): Compare fringe bitmaps
Kim F. Storm <storm@cua.dk>
parents:
53514
diff
changeset
|
5030 && !MATRIX_ROW (desired_matrix, j - 1)->redraw_fringe_bitmaps_p |
25012 | 5031 && row_equal_p (w, |
5032 MATRIX_ROW (desired_matrix, i - 1), | |
30152
f6270e5282da
(direct_output_forward_char): Give up if currently
Gerd Moellmann <gerd@gnu.org>
parents:
30041
diff
changeset
|
5033 MATRIX_ROW (current_matrix, j - 1), 1)) |
25012 | 5034 --i, --j; |
5035 last_new = i; | |
5036 last_old = j; | |
5037 | |
5038 /* Nothing to do if all rows are equal. */ | |
5039 if (last_new == first_new) | |
5040 return 0; | |
5041 | |
29980
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5042 /* Reallocate vectors, tables etc. if necessary. */ |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
5043 |
29980
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5044 if (current_matrix->nrows > old_lines_size) |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5045 { |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5046 old_lines_size = current_matrix->nrows; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5047 nbytes = old_lines_size * sizeof *old_lines; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5048 old_lines = (struct row_entry **) xrealloc (old_lines, nbytes); |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5049 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
5050 |
29980
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5051 if (desired_matrix->nrows > new_lines_size) |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5052 { |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5053 new_lines_size = desired_matrix->nrows; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5054 nbytes = new_lines_size * sizeof *new_lines; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5055 new_lines = (struct row_entry **) xrealloc (new_lines, nbytes); |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5056 } |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5057 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5058 n = desired_matrix->nrows + current_matrix->nrows; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5059 if (3 * n > row_table_size) |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5060 { |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5061 row_table_size = next_almost_prime (3 * n); |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5062 nbytes = row_table_size * sizeof *row_table; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5063 row_table = (struct row_entry **) xrealloc (row_table, nbytes); |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5064 bzero (row_table, nbytes); |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5065 } |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5066 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5067 if (n > row_entry_pool_size) |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5068 { |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5069 row_entry_pool_size = n; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5070 nbytes = row_entry_pool_size * sizeof *row_entry_pool; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5071 row_entry_pool = (struct row_entry *) xrealloc (row_entry_pool, nbytes); |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5072 } |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5073 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5074 if (desired_matrix->nrows > runs_size) |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5075 { |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5076 runs_size = desired_matrix->nrows; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5077 nbytes = runs_size * sizeof *runs; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5078 runs = (struct run **) xrealloc (runs, nbytes); |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5079 nbytes = runs_size * sizeof *run_pool; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5080 run_pool = (struct run *) xrealloc (run_pool, nbytes); |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5081 } |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5082 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5083 nruns = run_idx = 0; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5084 row_entry_idx = 0; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5085 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5086 /* Add rows from the current and desired matrix to the hash table |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5087 row_hash_table to be able to find equal ones quickly. */ |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
5088 |
25012 | 5089 for (i = first_old; i < last_old; ++i) |
5090 { | |
5091 if (MATRIX_ROW (current_matrix, i)->enabled_p) | |
5092 { | |
29980
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5093 entry = add_row_entry (w, MATRIX_ROW (current_matrix, i)); |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5094 old_lines[i] = entry; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5095 ++entry->old_uses; |
25012 | 5096 } |
5097 else | |
29980
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5098 old_lines[i] = NULL; |
25012 | 5099 } |
5100 | |
5101 for (i = first_new; i < last_new; ++i) | |
5102 { | |
5103 xassert (MATRIX_ROW_ENABLED_P (desired_matrix, i)); | |
29980
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5104 entry = add_row_entry (w, MATRIX_ROW (desired_matrix, i)); |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5105 ++entry->new_uses; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5106 entry->new_line_number = i; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5107 new_lines[i] = entry; |
25012 | 5108 } |
5109 | |
5110 /* Identify moves based on lines that are unique and equal | |
5111 in both matrices. */ | |
5112 for (i = first_old; i < last_old;) | |
29980
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5113 if (old_lines[i] |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5114 && old_lines[i]->old_uses == 1 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5115 && old_lines[i]->new_uses == 1) |
25012 | 5116 { |
5117 int j, k; | |
29980
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5118 int new_line = old_lines[i]->new_line_number; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5119 struct run *run = run_pool + run_idx++; |
25012 | 5120 |
5121 /* Record move. */ | |
5122 run->current_vpos = i; | |
5123 run->current_y = MATRIX_ROW (current_matrix, i)->y; | |
5124 run->desired_vpos = new_line; | |
5125 run->desired_y = MATRIX_ROW (desired_matrix, new_line)->y; | |
5126 run->nrows = 1; | |
5127 run->height = MATRIX_ROW (current_matrix, i)->height; | |
5128 | |
5129 /* Extend backward. */ | |
5130 j = i - 1; | |
5131 k = new_line - 1; | |
5132 while (j > first_old | |
5133 && k > first_new | |
29980
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5134 && old_lines[j] == new_lines[k]) |
25012 | 5135 { |
5136 int h = MATRIX_ROW (current_matrix, j)->height; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
5137 --run->current_vpos; |
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
5138 --run->desired_vpos; |
25012 | 5139 ++run->nrows; |
5140 run->height += h; | |
5141 run->desired_y -= h; | |
5142 run->current_y -= h; | |
5143 --j, --k; | |
5144 } | |
5145 | |
5146 /* Extend forward. */ | |
5147 j = i + 1; | |
5148 k = new_line + 1; | |
5149 while (j < last_old | |
5150 && k < last_new | |
29980
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5151 && old_lines[j] == new_lines[k]) |
25012 | 5152 { |
5153 int h = MATRIX_ROW (current_matrix, j)->height; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
5154 ++run->nrows; |
25012 | 5155 run->height += h; |
5156 ++j, ++k; | |
5157 } | |
5158 | |
5159 /* Insert run into list of all runs. Order runs by copied | |
5160 pixel lines. Note that we record runs that don't have to | |
5161 be copied because they are already in place. This is done | |
5162 because we can avoid calling update_window_line in this | |
5163 case. */ | |
5164 for (j = 0; j < nruns && runs[j]->height > run->height; ++j) | |
5165 ; | |
34203
e55480843a8e
(scrolling_window): Fix code inserting runs in list of all runs.
Gerd Moellmann <gerd@gnu.org>
parents:
33763
diff
changeset
|
5166 for (k = nruns; k > j; --k) |
25012 | 5167 runs[k] = runs[k - 1]; |
5168 runs[j] = run; | |
5169 ++nruns; | |
5170 | |
5171 i += run->nrows; | |
5172 } | |
5173 else | |
5174 ++i; | |
5175 | |
5176 /* Do the moves. Do it in a way that we don't overwrite something | |
5177 we want to copy later on. This is not solvable in general | |
5178 because there is only one display and we don't have a way to | |
5179 exchange areas on this display. Example: | |
5180 | |
5181 +-----------+ +-----------+ | |
5182 | A | | B | | |
5183 +-----------+ --> +-----------+ | |
5184 | B | | A | | |
5185 +-----------+ +-----------+ | |
5186 | |
5187 Instead, prefer bigger moves, and invalidate moves that would | |
5188 copy from where we copied to. */ | |
5189 | |
5190 for (i = 0; i < nruns; ++i) | |
5191 if (runs[i]->nrows > 0) | |
5192 { | |
5193 struct run *r = runs[i]; | |
5194 | |
5195 /* Copy on the display. */ | |
5196 if (r->current_y != r->desired_y) | |
5197 { | |
5198 rif->scroll_run_hook (w, r); | |
5199 | |
5200 /* Invalidate runs that copy from where we copied to. */ | |
5201 for (j = i + 1; j < nruns; ++j) | |
5202 { | |
5203 struct run *p = runs[j]; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
5204 |
25012 | 5205 if ((p->current_y >= r->desired_y |
5206 && p->current_y < r->desired_y + r->height) | |
5207 || (p->current_y + p->height >= r->desired_y | |
5208 && (p->current_y + p->height | |
5209 < r->desired_y + r->height))) | |
5210 p->nrows = 0; | |
5211 } | |
5212 } | |
5213 | |
5214 /* Assign matrix rows. */ | |
5215 for (j = 0; j < r->nrows; ++j) | |
5216 { | |
5217 struct glyph_row *from, *to; | |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
5218 int to_overlapped_p; |
30161
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
5219 |
25012 | 5220 to = MATRIX_ROW (current_matrix, r->desired_vpos + j); |
30161
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
5221 from = MATRIX_ROW (desired_matrix, r->desired_vpos + j); |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
5222 to_overlapped_p = to->overlapped_p; |
53605
7dfd96e25ec6
(row_equal_p, update_window_line): Compare fringe bitmaps
Kim F. Storm <storm@cua.dk>
parents:
53514
diff
changeset
|
5223 if (!from->mode_line_p && !w->pseudo_window_p |
7dfd96e25ec6
(row_equal_p, update_window_line): Compare fringe bitmaps
Kim F. Storm <storm@cua.dk>
parents:
53514
diff
changeset
|
5224 && (to->left_fringe_bitmap != from->left_fringe_bitmap |
53881
ccacbf7f76b2
(row_equal_p): Compare fringe bitmap faces and overlay
Kim F. Storm <storm@cua.dk>
parents:
53612
diff
changeset
|
5225 || to->right_fringe_bitmap != from->right_fringe_bitmap |
ccacbf7f76b2
(row_equal_p): Compare fringe bitmap faces and overlay
Kim F. Storm <storm@cua.dk>
parents:
53612
diff
changeset
|
5226 || to->left_fringe_face_id != from->left_fringe_face_id |
ccacbf7f76b2
(row_equal_p): Compare fringe bitmap faces and overlay
Kim F. Storm <storm@cua.dk>
parents:
53612
diff
changeset
|
5227 || to->right_fringe_face_id != from->right_fringe_face_id |
61633
a76a30ee7c89
(row_equal_p, update_window_line, scrolling_window):
Kim F. Storm <storm@cua.dk>
parents:
61416
diff
changeset
|
5228 || to->overlay_arrow_bitmap != from->overlay_arrow_bitmap)) |
53605
7dfd96e25ec6
(row_equal_p, update_window_line): Compare fringe bitmaps
Kim F. Storm <storm@cua.dk>
parents:
53514
diff
changeset
|
5229 from->redraw_fringe_bitmaps_p = 1; |
25012 | 5230 assign_row (to, from); |
5231 to->enabled_p = 1, from->enabled_p = 0; | |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
5232 to->overlapped_p = to_overlapped_p; |
25012 | 5233 } |
5234 } | |
5235 | |
29980
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5236 /* Clear the hash table, for the next time. */ |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5237 for (i = 0; i < row_entry_idx; ++i) |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5238 row_table[row_entry_pool[i].bucket] = NULL; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5239 |
54847
5acc1d864551
(update_window): Only set changed_p if
Kim F. Storm <storm@cua.dk>
parents:
54176
diff
changeset
|
5240 /* Value is > 0 to indicate that we scrolled the display. */ |
5acc1d864551
(update_window): Only set changed_p if
Kim F. Storm <storm@cua.dk>
parents:
54176
diff
changeset
|
5241 return nruns; |
25012 | 5242 } |
5243 | |
5244 | |
5245 | |
5246 /************************************************************************ | |
5247 Frame-Based Updates | |
5248 ************************************************************************/ | |
5249 | |
5250 /* Update the desired frame matrix of frame F. | |
5251 | |
5252 FORCE_P non-zero means that the update should not be stopped by | |
5253 pending input. INHIBIT_HAIRY_ID_P non-zero means that scrolling | |
5254 should not be tried. | |
5255 | |
5256 Value is non-zero if update was stopped due to pending input. */ | |
5257 | |
5258 static int | |
5259 update_frame_1 (f, force_p, inhibit_id_p) | |
5260 struct frame *f; | |
5261 int force_p; | |
5262 int inhibit_id_p; | |
5263 { | |
5264 /* Frame matrices to work on. */ | |
5265 struct glyph_matrix *current_matrix = f->current_matrix; | |
5266 struct glyph_matrix *desired_matrix = f->desired_matrix; | |
5267 int i; | |
314 | 5268 int pause; |
5269 int preempt_count = baud_rate / 2400 + 1; | |
21514 | 5270 extern int input_pending; |
25012 | 5271 |
5272 xassert (current_matrix && desired_matrix); | |
314 | 5273 |
10122
3de6776ae141
(update_frame): Call calculate_costs if baud_rate changed.
Richard M. Stallman <rms@gnu.org>
parents:
9963
diff
changeset
|
5274 if (baud_rate != FRAME_COST_BAUD_RATE (f)) |
3de6776ae141
(update_frame): Call calculate_costs if baud_rate changed.
Richard M. Stallman <rms@gnu.org>
parents:
9963
diff
changeset
|
5275 calculate_costs (f); |
3de6776ae141
(update_frame): Call calculate_costs if baud_rate changed.
Richard M. Stallman <rms@gnu.org>
parents:
9963
diff
changeset
|
5276 |
3357
d9523a958b3c
(update_frame): Make preempt_count positive.
Richard M. Stallman <rms@gnu.org>
parents:
3317
diff
changeset
|
5277 if (preempt_count <= 0) |
d9523a958b3c
(update_frame): Make preempt_count positive.
Richard M. Stallman <rms@gnu.org>
parents:
3317
diff
changeset
|
5278 preempt_count = 1; |
d9523a958b3c
(update_frame): Make preempt_count positive.
Richard M. Stallman <rms@gnu.org>
parents:
3317
diff
changeset
|
5279 |
76065
2001cae9df4e
(update_frame, update_single_window): Set force_p here if
Kim F. Storm <storm@cua.dk>
parents:
75371
diff
changeset
|
5280 #if !PERIODIC_PREEMPTION_CHECKING |
2001cae9df4e
(update_frame, update_single_window): Set force_p here if
Kim F. Storm <storm@cua.dk>
parents:
75371
diff
changeset
|
5281 if (!force_p && detect_input_pending_ignore_squeezables ()) |
314 | 5282 { |
5283 pause = 1; | |
5284 goto do_pause; | |
5285 } | |
71323
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
5286 #endif |
314 | 5287 |
25012 | 5288 /* If we cannot insert/delete lines, it's no use trying it. */ |
82990
2ecd1f669db9
Fixed X support, preliminary support for X-tty combo sessions.
Karoly Lorentey <lorentey@elte.hu>
parents:
82989
diff
changeset
|
5289 if (!FRAME_LINE_INS_DEL_OK (f)) |
25012 | 5290 inhibit_id_p = 1; |
7188
7da4ad9a2a8f
(update_frame): Move those assignments even farther down.
Richard M. Stallman <rms@gnu.org>
parents:
7179
diff
changeset
|
5291 |
493 | 5292 /* See if any of the desired lines are enabled; don't compute for |
25012 | 5293 i/d line if just want cursor motion. */ |
5294 for (i = 0; i < desired_matrix->nrows; i++) | |
5295 if (MATRIX_ROW_ENABLED_P (desired_matrix, i)) | |
314 | 5296 break; |
5297 | |
5298 /* Try doing i/d line, if not yet inhibited. */ | |
25012 | 5299 if (!inhibit_id_p && i < desired_matrix->nrows) |
5300 force_p |= scrolling (f); | |
314 | 5301 |
5302 /* Update the individual lines as needed. Do bottom line first. */ | |
25012 | 5303 if (MATRIX_ROW_ENABLED_P (desired_matrix, desired_matrix->nrows - 1)) |
5304 update_frame_line (f, desired_matrix->nrows - 1); | |
5305 | |
5306 /* Now update the rest of the lines. */ | |
5307 for (i = 0; i < desired_matrix->nrows - 1 && (force_p || !input_pending); i++) | |
314 | 5308 { |
25012 | 5309 if (MATRIX_ROW_ENABLED_P (desired_matrix, i)) |
314 | 5310 { |
960
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
5311 if (FRAME_TERMCAP_P (f)) |
314 | 5312 { |
5313 /* Flush out every so many lines. | |
5314 Also flush out if likely to have more than 1k buffered | |
5315 otherwise. I'm told that some telnet connections get | |
5316 really screwed by more than 1k output at once. */ | |
94909
11f28d8c2c22
(update_frame_1): Check if tty output is still valid before flushing
Chong Yidong <cyd@stupidchicken.com>
parents:
94513
diff
changeset
|
5317 FILE *display_output = FRAME_TTY (f)->output; |
11f28d8c2c22
(update_frame_1): Check if tty output is still valid before flushing
Chong Yidong <cyd@stupidchicken.com>
parents:
94513
diff
changeset
|
5318 if (display_output) |
314 | 5319 { |
94909
11f28d8c2c22
(update_frame_1): Check if tty output is still valid before flushing
Chong Yidong <cyd@stupidchicken.com>
parents:
94513
diff
changeset
|
5320 int outq = PENDING_OUTPUT_COUNT (display_output); |
11f28d8c2c22
(update_frame_1): Check if tty output is still valid before flushing
Chong Yidong <cyd@stupidchicken.com>
parents:
94513
diff
changeset
|
5321 if (outq > 900 |
11f28d8c2c22
(update_frame_1): Check if tty output is still valid before flushing
Chong Yidong <cyd@stupidchicken.com>
parents:
94513
diff
changeset
|
5322 || (outq > 20 && ((i - 1) % preempt_count == 0))) |
314 | 5323 { |
94909
11f28d8c2c22
(update_frame_1): Check if tty output is still valid before flushing
Chong Yidong <cyd@stupidchicken.com>
parents:
94513
diff
changeset
|
5324 fflush (display_output); |
11f28d8c2c22
(update_frame_1): Check if tty output is still valid before flushing
Chong Yidong <cyd@stupidchicken.com>
parents:
94513
diff
changeset
|
5325 if (preempt_count == 1) |
11f28d8c2c22
(update_frame_1): Check if tty output is still valid before flushing
Chong Yidong <cyd@stupidchicken.com>
parents:
94513
diff
changeset
|
5326 { |
554 | 5327 #ifdef EMACS_OUTQSIZE |
94909
11f28d8c2c22
(update_frame_1): Check if tty output is still valid before flushing
Chong Yidong <cyd@stupidchicken.com>
parents:
94513
diff
changeset
|
5328 if (EMACS_OUTQSIZE (0, &outq) < 0) |
11f28d8c2c22
(update_frame_1): Check if tty output is still valid before flushing
Chong Yidong <cyd@stupidchicken.com>
parents:
94513
diff
changeset
|
5329 /* Probably not a tty. Ignore the error and reset |
11f28d8c2c22
(update_frame_1): Check if tty output is still valid before flushing
Chong Yidong <cyd@stupidchicken.com>
parents:
94513
diff
changeset
|
5330 the outq count. */ |
11f28d8c2c22
(update_frame_1): Check if tty output is still valid before flushing
Chong Yidong <cyd@stupidchicken.com>
parents:
94513
diff
changeset
|
5331 outq = PENDING_OUTPUT_COUNT (FRAME_TTY (f->output)); |
314 | 5332 #endif |
94909
11f28d8c2c22
(update_frame_1): Check if tty output is still valid before flushing
Chong Yidong <cyd@stupidchicken.com>
parents:
94513
diff
changeset
|
5333 outq *= 10; |
11f28d8c2c22
(update_frame_1): Check if tty output is still valid before flushing
Chong Yidong <cyd@stupidchicken.com>
parents:
94513
diff
changeset
|
5334 if (baud_rate <= outq && baud_rate > 0) |
11f28d8c2c22
(update_frame_1): Check if tty output is still valid before flushing
Chong Yidong <cyd@stupidchicken.com>
parents:
94513
diff
changeset
|
5335 sleep (outq / baud_rate); |
11f28d8c2c22
(update_frame_1): Check if tty output is still valid before flushing
Chong Yidong <cyd@stupidchicken.com>
parents:
94513
diff
changeset
|
5336 } |
314 | 5337 } |
5338 } | |
5339 } | |
5340 | |
71323
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
5341 #if PERIODIC_PREEMPTION_CHECKING |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
5342 if (!force_p) |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
5343 { |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
5344 EMACS_TIME tm, dif; |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
5345 EMACS_GET_TIME (tm); |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
5346 EMACS_SUB_TIME (dif, preemption_next_check, tm); |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
5347 if (EMACS_TIME_NEG_P (dif)) |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
5348 { |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
5349 EMACS_ADD_TIME (preemption_next_check, tm, preemption_period); |
71378
1b442e9d8373
(update_frame): Check for input pending on entry.
Kim F. Storm <storm@cua.dk>
parents:
71333
diff
changeset
|
5350 if (detect_input_pending_ignore_squeezables ()) |
1b442e9d8373
(update_frame): Check for input pending on entry.
Kim F. Storm <storm@cua.dk>
parents:
71333
diff
changeset
|
5351 break; |
71323
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
5352 } |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
5353 } |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
5354 #else |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
5355 if (!force_p && (i - 1) % preempt_count == 0) |
59580
f43d0816e9c3
* keyboard.c (READABLE_EVENTS_DO_TIMERS_NOW)
Jan Djärv <jan.h.d@swipnet.se>
parents:
58986
diff
changeset
|
5356 detect_input_pending_ignore_squeezables (); |
71323
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
5357 #endif |
16822
483e137d5384
(update_frame): Call detect_input_pending
Richard M. Stallman <rms@gnu.org>
parents:
16589
diff
changeset
|
5358 |
25012 | 5359 update_frame_line (f, i); |
314 | 5360 } |
5361 } | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
5362 |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
5363 pause = (i < FRAME_LINES (f) - 1) ? i : 0; |
314 | 5364 |
5365 /* Now just clean up termcap drivers and set cursor, etc. */ | |
5366 if (!pause) | |
5367 { | |
12409
6e374b28ecc3
(update_frame): Pretend cursor is in echo area
Richard M. Stallman <rms@gnu.org>
parents:
12193
diff
changeset
|
5368 if ((cursor_in_echo_area |
25012 | 5369 /* If we are showing a message instead of the mini-buffer, |
12627
c7bc7a24b1ff
(update_frame): Check that the echo area is in the frame being displayed.
Richard M. Stallman <rms@gnu.org>
parents:
12532
diff
changeset
|
5370 show the cursor for the message instead of for the |
25012 | 5371 (now hidden) mini-buffer contents. */ |
12627
c7bc7a24b1ff
(update_frame): Check that the echo area is in the frame being displayed.
Richard M. Stallman <rms@gnu.org>
parents:
12532
diff
changeset
|
5372 || (EQ (minibuf_window, selected_window) |
c7bc7a24b1ff
(update_frame): Check that the echo area is in the frame being displayed.
Richard M. Stallman <rms@gnu.org>
parents:
12532
diff
changeset
|
5373 && EQ (minibuf_window, echo_area_window) |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
5374 && !NILP (echo_area_buffer[0]))) |
12627
c7bc7a24b1ff
(update_frame): Check that the echo area is in the frame being displayed.
Richard M. Stallman <rms@gnu.org>
parents:
12532
diff
changeset
|
5375 /* These cases apply only to the frame that contains |
25012 | 5376 the active mini-buffer window. */ |
12627
c7bc7a24b1ff
(update_frame): Check that the echo area is in the frame being displayed.
Richard M. Stallman <rms@gnu.org>
parents:
12532
diff
changeset
|
5377 && FRAME_HAS_MINIBUF_P (f) |
14459
c1d25453a95f
(update_frame): Compare FRAME_MINIBUF_WINDOW(f)
Richard M. Stallman <rms@gnu.org>
parents:
14286
diff
changeset
|
5378 && EQ (FRAME_MINIBUF_WINDOW (f), echo_area_window)) |
708 | 5379 { |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
5380 int top = WINDOW_TOP_EDGE_LINE (XWINDOW (FRAME_MINIBUF_WINDOW (f))); |
1042
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
5381 int row, col; |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
5382 |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
5383 if (cursor_in_echo_area < 0) |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
5384 { |
25012 | 5385 /* Negative value of cursor_in_echo_area means put |
5386 cursor at beginning of line. */ | |
1042
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
5387 row = top; |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
5388 col = 0; |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
5389 } |
708 | 5390 else |
1042
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
5391 { |
25012 | 5392 /* Positive value of cursor_in_echo_area means put |
5393 cursor at the end of the prompt. If the mini-buffer | |
5394 is several lines high, find the last line that has | |
5395 any text on it. */ | |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
5396 row = FRAME_LINES (f); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
5397 do |
1042
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
5398 { |
25012 | 5399 --row; |
5400 col = 0; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
5401 |
25012 | 5402 if (MATRIX_ROW_ENABLED_P (current_matrix, row)) |
5403 { | |
5404 /* Frame rows are filled up with spaces that | |
5405 must be ignored here. */ | |
5406 struct glyph_row *r = MATRIX_ROW (current_matrix, | |
5407 row); | |
5408 struct glyph *start = r->glyphs[TEXT_AREA]; | |
5409 struct glyph *last = start + r->used[TEXT_AREA]; | |
5410 | |
5411 while (last > start | |
5412 && (last - 1)->charpos < 0) | |
5413 --last; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
5414 |
25012 | 5415 col = last - start; |
5416 } | |
1042
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
5417 } |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
5418 while (row > top && col == 0); |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
5419 |
21757
629f6df4a329
(update_frame): Move echo area cursor into range.
Richard M. Stallman <rms@gnu.org>
parents:
21514
diff
changeset
|
5420 /* Make sure COL is not out of range. */ |
21763
b685f9451792
(change_frame_size_1): Use FRAME_CURSOR_X_LIMIT.
Richard M. Stallman <rms@gnu.org>
parents:
21757
diff
changeset
|
5421 if (col >= FRAME_CURSOR_X_LIMIT (f)) |
1042
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
5422 { |
21757
629f6df4a329
(update_frame): Move echo area cursor into range.
Richard M. Stallman <rms@gnu.org>
parents:
21514
diff
changeset
|
5423 /* If we have another row, advance cursor into it. */ |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
5424 if (row < FRAME_LINES (f) - 1) |
21757
629f6df4a329
(update_frame): Move echo area cursor into range.
Richard M. Stallman <rms@gnu.org>
parents:
21514
diff
changeset
|
5425 { |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
5426 col = FRAME_LEFT_SCROLL_BAR_COLS (f); |
21757
629f6df4a329
(update_frame): Move echo area cursor into range.
Richard M. Stallman <rms@gnu.org>
parents:
21514
diff
changeset
|
5427 row++; |
629f6df4a329
(update_frame): Move echo area cursor into range.
Richard M. Stallman <rms@gnu.org>
parents:
21514
diff
changeset
|
5428 } |
629f6df4a329
(update_frame): Move echo area cursor into range.
Richard M. Stallman <rms@gnu.org>
parents:
21514
diff
changeset
|
5429 /* Otherwise move it back in range. */ |
629f6df4a329
(update_frame): Move echo area cursor into range.
Richard M. Stallman <rms@gnu.org>
parents:
21514
diff
changeset
|
5430 else |
21763
b685f9451792
(change_frame_size_1): Use FRAME_CURSOR_X_LIMIT.
Richard M. Stallman <rms@gnu.org>
parents:
21757
diff
changeset
|
5431 col = FRAME_CURSOR_X_LIMIT (f) - 1; |
1042
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
5432 } |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
5433 } |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
5434 |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83098
diff
changeset
|
5435 cursor_to (f, row, col); |
708 | 5436 } |
314 | 5437 else |
25012 | 5438 { |
5439 /* We have only one cursor on terminal frames. Use it to | |
5440 display the cursor of the selected window. */ | |
5441 struct window *w = XWINDOW (FRAME_SELECTED_WINDOW (f)); | |
29687
5d67ef29764b
(update_frame_1): Handle case that cursor vpos is
Gerd Moellmann <gerd@gnu.org>
parents:
29437
diff
changeset
|
5442 if (w->cursor.vpos >= 0 |
5d67ef29764b
(update_frame_1): Handle case that cursor vpos is
Gerd Moellmann <gerd@gnu.org>
parents:
29437
diff
changeset
|
5443 /* The cursor vpos may be temporarily out of bounds |
5d67ef29764b
(update_frame_1): Handle case that cursor vpos is
Gerd Moellmann <gerd@gnu.org>
parents:
29437
diff
changeset
|
5444 in the following situation: There is one window, |
5d67ef29764b
(update_frame_1): Handle case that cursor vpos is
Gerd Moellmann <gerd@gnu.org>
parents:
29437
diff
changeset
|
5445 with the cursor in the lower half of it. The window |
5d67ef29764b
(update_frame_1): Handle case that cursor vpos is
Gerd Moellmann <gerd@gnu.org>
parents:
29437
diff
changeset
|
5446 is split, and a message causes a redisplay before |
5d67ef29764b
(update_frame_1): Handle case that cursor vpos is
Gerd Moellmann <gerd@gnu.org>
parents:
29437
diff
changeset
|
5447 a new cursor position has been computed. */ |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
5448 && w->cursor.vpos < WINDOW_TOTAL_LINES (w)) |
25012 | 5449 { |
5450 int x = WINDOW_TO_FRAME_HPOS (w, w->cursor.hpos); | |
5451 int y = WINDOW_TO_FRAME_VPOS (w, w->cursor.vpos); | |
5452 | |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
5453 if (INTEGERP (w->left_margin_cols)) |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
5454 x += XFASTINT (w->left_margin_cols); |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
5455 |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
5456 /* x = max (min (x, FRAME_TOTAL_COLS (f) - 1), 0); */ |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83098
diff
changeset
|
5457 cursor_to (f, y, x); |
25012 | 5458 } |
5459 } | |
314 | 5460 } |
5461 | |
5462 do_pause: | |
5463 | |
25012 | 5464 clear_desired_matrices (f); |
314 | 5465 return pause; |
5466 } | |
5467 | |
25012 | 5468 |
5469 /* Do line insertions/deletions on frame F for frame-based redisplay. */ | |
314 | 5470 |
21514 | 5471 int |
764 | 5472 scrolling (frame) |
25012 | 5473 struct frame *frame; |
314 | 5474 { |
5475 int unchanged_at_top, unchanged_at_bottom; | |
5476 int window_size; | |
5477 int changed_lines; | |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
5478 int *old_hash = (int *) alloca (FRAME_LINES (frame) * sizeof (int)); |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
5479 int *new_hash = (int *) alloca (FRAME_LINES (frame) * sizeof (int)); |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
5480 int *draw_cost = (int *) alloca (FRAME_LINES (frame) * sizeof (int)); |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
5481 int *old_draw_cost = (int *) alloca (FRAME_LINES (frame) * sizeof (int)); |
314 | 5482 register int i; |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
5483 int free_at_end_vpos = FRAME_LINES (frame); |
25012 | 5484 struct glyph_matrix *current_matrix = frame->current_matrix; |
5485 struct glyph_matrix *desired_matrix = frame->desired_matrix; | |
5486 | |
5487 if (!current_matrix) | |
5488 abort (); | |
5489 | |
5490 /* Compute hash codes of all the lines. Also calculate number of | |
5491 changed lines, number of unchanged lines at the beginning, and | |
5492 number of unchanged lines at the end. */ | |
314 | 5493 changed_lines = 0; |
5494 unchanged_at_top = 0; | |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
5495 unchanged_at_bottom = FRAME_LINES (frame); |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
5496 for (i = 0; i < FRAME_LINES (frame); i++) |
314 | 5497 { |
5498 /* Give up on this scrolling if some old lines are not enabled. */ | |
25012 | 5499 if (!MATRIX_ROW_ENABLED_P (current_matrix, i)) |
314 | 5500 return 0; |
25012 | 5501 old_hash[i] = line_hash_code (MATRIX_ROW (current_matrix, i)); |
5502 if (! MATRIX_ROW_ENABLED_P (desired_matrix, i)) | |
18015
934a44a3b34f
(scrolling): If a line is not enabled,
Richard M. Stallman <rms@gnu.org>
parents:
17961
diff
changeset
|
5503 { |
934a44a3b34f
(scrolling): If a line is not enabled,
Richard M. Stallman <rms@gnu.org>
parents:
17961
diff
changeset
|
5504 /* This line cannot be redrawn, so don't let scrolling mess it. */ |
934a44a3b34f
(scrolling): If a line is not enabled,
Richard M. Stallman <rms@gnu.org>
parents:
17961
diff
changeset
|
5505 new_hash[i] = old_hash[i]; |
934a44a3b34f
(scrolling): If a line is not enabled,
Richard M. Stallman <rms@gnu.org>
parents:
17961
diff
changeset
|
5506 #define INFINITY 1000000 /* Taken from scroll.c */ |
934a44a3b34f
(scrolling): If a line is not enabled,
Richard M. Stallman <rms@gnu.org>
parents:
17961
diff
changeset
|
5507 draw_cost[i] = INFINITY; |
934a44a3b34f
(scrolling): If a line is not enabled,
Richard M. Stallman <rms@gnu.org>
parents:
17961
diff
changeset
|
5508 } |
314 | 5509 else |
18015
934a44a3b34f
(scrolling): If a line is not enabled,
Richard M. Stallman <rms@gnu.org>
parents:
17961
diff
changeset
|
5510 { |
25012 | 5511 new_hash[i] = line_hash_code (MATRIX_ROW (desired_matrix, i)); |
5512 draw_cost[i] = line_draw_cost (desired_matrix, i); | |
18015
934a44a3b34f
(scrolling): If a line is not enabled,
Richard M. Stallman <rms@gnu.org>
parents:
17961
diff
changeset
|
5513 } |
314 | 5514 |
5515 if (old_hash[i] != new_hash[i]) | |
5516 { | |
5517 changed_lines++; | |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
5518 unchanged_at_bottom = FRAME_LINES (frame) - i - 1; |
314 | 5519 } |
5520 else if (i == unchanged_at_top) | |
5521 unchanged_at_top++; | |
25012 | 5522 old_draw_cost[i] = line_draw_cost (current_matrix, i); |
314 | 5523 } |
5524 | |
5525 /* If changed lines are few, don't allow preemption, don't scroll. */ | |
82990
2ecd1f669db9
Fixed X support, preliminary support for X-tty combo sessions.
Karoly Lorentey <lorentey@elte.hu>
parents:
82989
diff
changeset
|
5526 if ((!FRAME_SCROLL_REGION_OK (frame) |
53225
4250e7e26247
Add a level of indirection to terminal characteristics.
Karoly Lorentey <lorentey@elte.hu>
parents:
53190
diff
changeset
|
5527 && changed_lines < baud_rate / 2400) |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
5528 || unchanged_at_bottom == FRAME_LINES (frame)) |
314 | 5529 return 1; |
5530 | |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
5531 window_size = (FRAME_LINES (frame) - unchanged_at_top |
314 | 5532 - unchanged_at_bottom); |
5533 | |
82990
2ecd1f669db9
Fixed X support, preliminary support for X-tty combo sessions.
Karoly Lorentey <lorentey@elte.hu>
parents:
82989
diff
changeset
|
5534 if (FRAME_SCROLL_REGION_OK (frame)) |
314 | 5535 free_at_end_vpos -= unchanged_at_bottom; |
82990
2ecd1f669db9
Fixed X support, preliminary support for X-tty combo sessions.
Karoly Lorentey <lorentey@elte.hu>
parents:
82989
diff
changeset
|
5536 else if (FRAME_MEMORY_BELOW_FRAME (frame)) |
314 | 5537 free_at_end_vpos = -1; |
5538 | |
5539 /* If large window, fast terminal and few lines in common between | |
25012 | 5540 current frame and desired frame, don't bother with i/d calc. */ |
82990
2ecd1f669db9
Fixed X support, preliminary support for X-tty combo sessions.
Karoly Lorentey <lorentey@elte.hu>
parents:
82989
diff
changeset
|
5541 if (!FRAME_SCROLL_REGION_OK (frame) |
53225
4250e7e26247
Add a level of indirection to terminal characteristics.
Karoly Lorentey <lorentey@elte.hu>
parents:
53190
diff
changeset
|
5542 && window_size >= 18 && baud_rate > 2400 |
314 | 5543 && (window_size >= |
5544 10 * scrolling_max_lines_saved (unchanged_at_top, | |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
5545 FRAME_LINES (frame) - unchanged_at_bottom, |
314 | 5546 old_hash, new_hash, draw_cost))) |
5547 return 0; | |
5548 | |
25012 | 5549 if (window_size < 2) |
5550 return 0; | |
5551 | |
764 | 5552 scrolling_1 (frame, window_size, unchanged_at_top, unchanged_at_bottom, |
314 | 5553 draw_cost + unchanged_at_top - 1, |
10259
48e4dfc6bb43
(scrolling): Fewer restrictions if scroll_region_ok is
Richard M. Stallman <rms@gnu.org>
parents:
10122
diff
changeset
|
5554 old_draw_cost + unchanged_at_top - 1, |
314 | 5555 old_hash + unchanged_at_top - 1, |
5556 new_hash + unchanged_at_top - 1, | |
5557 free_at_end_vpos - unchanged_at_top); | |
5558 | |
5559 return 0; | |
5560 } | |
25012 | 5561 |
5562 | |
5563 /* Count the number of blanks at the start of the vector of glyphs R | |
5564 which is LEN glyphs long. */ | |
5565 | |
5566 static int | |
5567 count_blanks (r, len) | |
5568 struct glyph *r; | |
5569 int len; | |
314 | 5570 { |
25012 | 5571 int i; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
5572 |
25012 | 5573 for (i = 0; i < len; ++i) |
5574 if (!CHAR_GLYPH_SPACE_P (r[i])) | |
5575 break; | |
5576 | |
5577 return i; | |
314 | 5578 } |
25012 | 5579 |
5580 | |
5581 /* Count the number of glyphs in common at the start of the glyph | |
5582 vectors STR1 and STR2. END1 is the end of STR1 and END2 is the end | |
5583 of STR2. Value is the number of equal glyphs equal at the start. */ | |
314 | 5584 |
5585 static int | |
25012 | 5586 count_match (str1, end1, str2, end2) |
5587 struct glyph *str1, *end1, *str2, *end2; | |
314 | 5588 { |
25012 | 5589 struct glyph *p1 = str1; |
5590 struct glyph *p2 = str2; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
5591 |
25012 | 5592 while (p1 < end1 |
5593 && p2 < end2 | |
26998
02e902f732d1
(line_hash_code) (direct_output_for_insert): Adjusted
Kenichi Handa <handa@m17n.org>
parents:
26902
diff
changeset
|
5594 && GLYPH_CHAR_AND_FACE_EQUAL_P (p1, p2)) |
25012 | 5595 ++p1, ++p2; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
5596 |
25012 | 5597 return p1 - str1; |
314 | 5598 } |
5599 | |
25012 | 5600 |
314 | 5601 /* Char insertion/deletion cost vector, from term.c */ |
25012 | 5602 |
314 | 5603 extern int *char_ins_del_vector; |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
5604 #define char_ins_del_cost(f) (&char_ins_del_vector[FRAME_TOTAL_COLS((f))]) |
314 | 5605 |
25012 | 5606 |
5607 /* Perform a frame-based update on line VPOS in frame FRAME. */ | |
5608 | |
314 | 5609 static void |
35924
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5610 update_frame_line (f, vpos) |
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5611 struct frame *f; |
314 | 5612 int vpos; |
5613 { | |
25012 | 5614 struct glyph *obody, *nbody, *op1, *op2, *np1, *nend; |
314 | 5615 int tem; |
5616 int osp, nsp, begmatch, endmatch, olen, nlen; | |
35924
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5617 struct glyph_matrix *current_matrix = f->current_matrix; |
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5618 struct glyph_matrix *desired_matrix = f->desired_matrix; |
25012 | 5619 struct glyph_row *current_row = MATRIX_ROW (current_matrix, vpos); |
5620 struct glyph_row *desired_row = MATRIX_ROW (desired_matrix, vpos); | |
5621 int must_write_whole_line_p; | |
82990
2ecd1f669db9
Fixed X support, preliminary support for X-tty combo sessions.
Karoly Lorentey <lorentey@elte.hu>
parents:
82989
diff
changeset
|
5622 int write_spaces_p = FRAME_MUST_WRITE_SPACES (f); |
35924
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5623 int colored_spaces_p = (FACE_FROM_ID (f, DEFAULT_FACE_ID)->background |
33101
39cd5f99c67d
(update_frame_line): Handle case where spaces in
Gerd Moellmann <gerd@gnu.org>
parents:
32752
diff
changeset
|
5624 != FACE_TTY_DEFAULT_BG_COLOR); |
39cd5f99c67d
(update_frame_line): Handle case where spaces in
Gerd Moellmann <gerd@gnu.org>
parents:
32752
diff
changeset
|
5625 |
39cd5f99c67d
(update_frame_line): Handle case where spaces in
Gerd Moellmann <gerd@gnu.org>
parents:
32752
diff
changeset
|
5626 if (colored_spaces_p) |
39cd5f99c67d
(update_frame_line): Handle case where spaces in
Gerd Moellmann <gerd@gnu.org>
parents:
32752
diff
changeset
|
5627 write_spaces_p = 1; |
25012 | 5628 |
25725
b7468dc89ccb
(update_frame_line): If writing whole desired line,
Gerd Moellmann <gerd@gnu.org>
parents:
25666
diff
changeset
|
5629 /* Current row not enabled means it has unknown contents. We must |
b7468dc89ccb
(update_frame_line): If writing whole desired line,
Gerd Moellmann <gerd@gnu.org>
parents:
25666
diff
changeset
|
5630 write the whole desired line in that case. */ |
25012 | 5631 must_write_whole_line_p = !current_row->enabled_p; |
5632 if (must_write_whole_line_p) | |
314 | 5633 { |
25012 | 5634 obody = 0; |
314 | 5635 olen = 0; |
5636 } | |
5637 else | |
5638 { | |
25012 | 5639 obody = MATRIX_ROW_GLYPH_START (current_matrix, vpos); |
5640 olen = current_row->used[TEXT_AREA]; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
5641 |
40075
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
5642 /* Ignore trailing spaces, if we can. */ |
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
5643 if (!write_spaces_p) |
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
5644 while (olen > 0 && CHAR_GLYPH_SPACE_P (obody[olen-1])) |
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
5645 olen--; |
314 | 5646 } |
5647 | |
25012 | 5648 current_row->enabled_p = 1; |
5649 current_row->used[TEXT_AREA] = desired_row->used[TEXT_AREA]; | |
5650 | |
5651 /* If desired line is empty, just clear the line. */ | |
5652 if (!desired_row->enabled_p) | |
314 | 5653 { |
5654 nlen = 0; | |
5655 goto just_erase; | |
5656 } | |
5657 | |
25012 | 5658 nbody = desired_row->glyphs[TEXT_AREA]; |
5659 nlen = desired_row->used[TEXT_AREA]; | |
5660 nend = nbody + nlen; | |
5661 | |
5662 /* If display line has unknown contents, write the whole line. */ | |
5663 if (must_write_whole_line_p) | |
5664 { | |
25725
b7468dc89ccb
(update_frame_line): If writing whole desired line,
Gerd Moellmann <gerd@gnu.org>
parents:
25666
diff
changeset
|
5665 /* Ignore spaces at the end, if we can. */ |
33101
39cd5f99c67d
(update_frame_line): Handle case where spaces in
Gerd Moellmann <gerd@gnu.org>
parents:
32752
diff
changeset
|
5666 if (!write_spaces_p) |
25313
6b4475fbef86
(update_frame_line): If writing whole line,
Gerd Moellmann <gerd@gnu.org>
parents:
25304
diff
changeset
|
5667 while (nlen > 0 && CHAR_GLYPH_SPACE_P (nbody[nlen - 1])) |
6b4475fbef86
(update_frame_line): If writing whole line,
Gerd Moellmann <gerd@gnu.org>
parents:
25304
diff
changeset
|
5668 --nlen; |
6b4475fbef86
(update_frame_line): If writing whole line,
Gerd Moellmann <gerd@gnu.org>
parents:
25304
diff
changeset
|
5669 |
25725
b7468dc89ccb
(update_frame_line): If writing whole desired line,
Gerd Moellmann <gerd@gnu.org>
parents:
25666
diff
changeset
|
5670 /* Write the contents of the desired line. */ |
25313
6b4475fbef86
(update_frame_line): If writing whole line,
Gerd Moellmann <gerd@gnu.org>
parents:
25304
diff
changeset
|
5671 if (nlen) |
25725
b7468dc89ccb
(update_frame_line): If writing whole desired line,
Gerd Moellmann <gerd@gnu.org>
parents:
25666
diff
changeset
|
5672 { |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83098
diff
changeset
|
5673 cursor_to (f, vpos, 0); |
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83098
diff
changeset
|
5674 write_glyphs (f, nbody, nlen); |
25725
b7468dc89ccb
(update_frame_line): If writing whole desired line,
Gerd Moellmann <gerd@gnu.org>
parents:
25666
diff
changeset
|
5675 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
5676 |
25725
b7468dc89ccb
(update_frame_line): If writing whole desired line,
Gerd Moellmann <gerd@gnu.org>
parents:
25666
diff
changeset
|
5677 /* Don't call clear_end_of_line if we already wrote the whole |
b7468dc89ccb
(update_frame_line): If writing whole desired line,
Gerd Moellmann <gerd@gnu.org>
parents:
25666
diff
changeset
|
5678 line. The cursor will not be at the right margin in that |
b7468dc89ccb
(update_frame_line): If writing whole desired line,
Gerd Moellmann <gerd@gnu.org>
parents:
25666
diff
changeset
|
5679 case but in the line below. */ |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
5680 if (nlen < FRAME_TOTAL_COLS (f)) |
25725
b7468dc89ccb
(update_frame_line): If writing whole desired line,
Gerd Moellmann <gerd@gnu.org>
parents:
25666
diff
changeset
|
5681 { |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83098
diff
changeset
|
5682 cursor_to (f, vpos, nlen); |
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83098
diff
changeset
|
5683 clear_end_of_line (f, FRAME_TOTAL_COLS (f)); |
25725
b7468dc89ccb
(update_frame_line): If writing whole desired line,
Gerd Moellmann <gerd@gnu.org>
parents:
25666
diff
changeset
|
5684 } |
28682
f05d48759416
(update_frame_line): When writing a whole line, make
Gerd Moellmann <gerd@gnu.org>
parents:
28507
diff
changeset
|
5685 else |
f05d48759416
(update_frame_line): When writing a whole line, make
Gerd Moellmann <gerd@gnu.org>
parents:
28507
diff
changeset
|
5686 /* Make sure we are in the right row, otherwise cursor movement |
f05d48759416
(update_frame_line): When writing a whole line, make
Gerd Moellmann <gerd@gnu.org>
parents:
28507
diff
changeset
|
5687 with cmgoto might use `ch' in the wrong row. */ |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83098
diff
changeset
|
5688 cursor_to (f, vpos, 0); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
5689 |
25012 | 5690 make_current (desired_matrix, current_matrix, vpos); |
5691 return; | |
5692 } | |
314 | 5693 |
5694 /* Pretend trailing spaces are not there at all, | |
5695 unless for one reason or another we must write all spaces. */ | |
40075
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
5696 if (!write_spaces_p) |
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
5697 while (nlen > 0 && CHAR_GLYPH_SPACE_P (nbody[nlen - 1])) |
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
5698 nlen--; |
314 | 5699 |
5700 /* If there's no i/d char, quickly do the best we can without it. */ | |
82990
2ecd1f669db9
Fixed X support, preliminary support for X-tty combo sessions.
Karoly Lorentey <lorentey@elte.hu>
parents:
82989
diff
changeset
|
5701 if (!FRAME_CHAR_INS_DEL_OK (f)) |
314 | 5702 { |
25012 | 5703 int i, j; |
5704 | |
5705 /* Find the first glyph in desired row that doesn't agree with | |
5706 a glyph in the current row, and write the rest from there on. */ | |
314 | 5707 for (i = 0; i < nlen; i++) |
5708 { | |
25012 | 5709 if (i >= olen || !GLYPH_EQUAL_P (nbody + i, obody + i)) |
314 | 5710 { |
25012 | 5711 /* Find the end of the run of different glyphs. */ |
5712 j = i + 1; | |
5713 while (j < nlen | |
5714 && (j >= olen | |
5715 || !GLYPH_EQUAL_P (nbody + j, obody + j) | |
5716 || CHAR_GLYPH_PADDING_P (nbody[j]))) | |
5717 ++j; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
5718 |
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
5719 /* Output this run of non-matching chars. */ |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83098
diff
changeset
|
5720 cursor_to (f, vpos, i); |
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83098
diff
changeset
|
5721 write_glyphs (f, nbody + i, j - i); |
25012 | 5722 i = j - 1; |
314 | 5723 |
5724 /* Now find the next non-match. */ | |
5725 } | |
5726 } | |
5727 | |
5728 /* Clear the rest of the line, or the non-clear part of it. */ | |
5729 if (olen > nlen) | |
5730 { | |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83098
diff
changeset
|
5731 cursor_to (f, vpos, nlen); |
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83098
diff
changeset
|
5732 clear_end_of_line (f, olen); |
314 | 5733 } |
5734 | |
25012 | 5735 /* Make current row = desired row. */ |
5736 make_current (desired_matrix, current_matrix, vpos); | |
314 | 5737 return; |
5738 } | |
5739 | |
25012 | 5740 /* Here when CHAR_INS_DEL_OK != 0, i.e. we can insert or delete |
5741 characters in a row. */ | |
5742 | |
314 | 5743 if (!olen) |
5744 { | |
25012 | 5745 /* If current line is blank, skip over initial spaces, if |
5746 possible, and write the rest. */ | |
40075
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
5747 if (write_spaces_p) |
25012 | 5748 nsp = 0; |
5749 else | |
5750 nsp = count_blanks (nbody, nlen); | |
5751 | |
314 | 5752 if (nlen > nsp) |
5753 { | |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83098
diff
changeset
|
5754 cursor_to (f, vpos, nsp); |
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83098
diff
changeset
|
5755 write_glyphs (f, nbody + nsp, nlen - nsp); |
314 | 5756 } |
5757 | |
764 | 5758 /* Exchange contents between current_frame and new_frame. */ |
25012 | 5759 make_current (desired_matrix, current_matrix, vpos); |
314 | 5760 return; |
5761 } | |
5762 | |
5763 /* Compute number of leading blanks in old and new contents. */ | |
25012 | 5764 osp = count_blanks (obody, olen); |
40075
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
5765 nsp = (colored_spaces_p ? 0 : count_blanks (nbody, nlen)); |
25012 | 5766 |
5767 /* Compute number of matching chars starting with first non-blank. */ | |
5768 begmatch = count_match (obody + osp, obody + olen, | |
5769 nbody + nsp, nbody + nlen); | |
314 | 5770 |
5771 /* Spaces in new match implicit space past the end of old. */ | |
5772 /* A bug causing this to be a no-op was fixed in 18.29. */ | |
33101
39cd5f99c67d
(update_frame_line): Handle case where spaces in
Gerd Moellmann <gerd@gnu.org>
parents:
32752
diff
changeset
|
5773 if (!write_spaces_p && osp + begmatch == olen) |
314 | 5774 { |
5775 np1 = nbody + nsp; | |
25012 | 5776 while (np1 + begmatch < nend && CHAR_GLYPH_SPACE_P (np1[begmatch])) |
5777 ++begmatch; | |
314 | 5778 } |
5779 | |
5780 /* Avoid doing insert/delete char | |
5781 just cause number of leading spaces differs | |
25012 | 5782 when the following text does not match. */ |
314 | 5783 if (begmatch == 0 && osp != nsp) |
5784 osp = nsp = min (osp, nsp); | |
5785 | |
5786 /* Find matching characters at end of line */ | |
5787 op1 = obody + olen; | |
5788 np1 = nbody + nlen; | |
5789 op2 = op1 + begmatch - min (olen - osp, nlen - nsp); | |
25012 | 5790 while (op1 > op2 |
5791 && GLYPH_EQUAL_P (op1 - 1, np1 - 1)) | |
314 | 5792 { |
5793 op1--; | |
5794 np1--; | |
5795 } | |
5796 endmatch = obody + olen - op1; | |
5797 | |
5798 /* tem gets the distance to insert or delete. | |
5799 endmatch is how many characters we save by doing so. | |
5800 Is it worth it? */ | |
5801 | |
5802 tem = (nlen - nsp) - (olen - osp); | |
5803 if (endmatch && tem | |
82990
2ecd1f669db9
Fixed X support, preliminary support for X-tty combo sessions.
Karoly Lorentey <lorentey@elte.hu>
parents:
82989
diff
changeset
|
5804 && (!FRAME_CHAR_INS_DEL_OK (f) |
53225
4250e7e26247
Add a level of indirection to terminal characteristics.
Karoly Lorentey <lorentey@elte.hu>
parents:
53190
diff
changeset
|
5805 || endmatch <= char_ins_del_cost (f)[tem])) |
314 | 5806 endmatch = 0; |
5807 | |
5808 /* nsp - osp is the distance to insert or delete. | |
5809 If that is nonzero, begmatch is known to be nonzero also. | |
5810 begmatch + endmatch is how much we save by doing the ins/del. | |
5811 Is it worth it? */ | |
5812 | |
5813 if (nsp != osp | |
82990
2ecd1f669db9
Fixed X support, preliminary support for X-tty combo sessions.
Karoly Lorentey <lorentey@elte.hu>
parents:
82989
diff
changeset
|
5814 && (!FRAME_CHAR_INS_DEL_OK (f) |
35924
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5815 || begmatch + endmatch <= char_ins_del_cost (f)[nsp - osp])) |
314 | 5816 { |
5817 begmatch = 0; | |
5818 endmatch = 0; | |
5819 osp = nsp = min (osp, nsp); | |
5820 } | |
5821 | |
5822 /* Now go through the line, inserting, writing and | |
5823 deleting as appropriate. */ | |
5824 | |
5825 if (osp > nsp) | |
5826 { | |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83098
diff
changeset
|
5827 cursor_to (f, vpos, nsp); |
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83098
diff
changeset
|
5828 delete_glyphs (f, osp - nsp); |
314 | 5829 } |
5830 else if (nsp > osp) | |
5831 { | |
5832 /* If going to delete chars later in line | |
5833 and insert earlier in the line, | |
5834 must delete first to avoid losing data in the insert */ | |
5835 if (endmatch && nlen < olen + nsp - osp) | |
5836 { | |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83098
diff
changeset
|
5837 cursor_to (f, vpos, nlen - endmatch + osp - nsp); |
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83098
diff
changeset
|
5838 delete_glyphs (f, olen + nsp - osp - nlen); |
314 | 5839 olen = nlen - (nsp - osp); |
5840 } | |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83098
diff
changeset
|
5841 cursor_to (f, vpos, osp); |
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83098
diff
changeset
|
5842 insert_glyphs (f, 0, nsp - osp); |
314 | 5843 } |
5844 olen += nsp - osp; | |
5845 | |
5846 tem = nsp + begmatch + endmatch; | |
5847 if (nlen != tem || olen != tem) | |
5848 { | |
5849 if (!endmatch || nlen == olen) | |
5850 { | |
35924
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5851 /* If new text being written reaches right margin, there is |
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5852 no need to do clear-to-eol at the end of this function |
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5853 (and it would not be safe, since cursor is not going to |
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5854 be "at the margin" after the text is done). */ |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
5855 if (nlen == FRAME_TOTAL_COLS (f)) |
314 | 5856 olen = 0; |
35924
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5857 |
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5858 /* Function write_glyphs is prepared to do nothing |
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5859 if passed a length <= 0. Check it here to avoid |
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5860 unnecessary cursor movement. */ |
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5861 if (nlen - tem > 0) |
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5862 { |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83098
diff
changeset
|
5863 cursor_to (f, vpos, nsp + begmatch); |
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83098
diff
changeset
|
5864 write_glyphs (f, nbody + nsp + begmatch, nlen - tem); |
35924
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5865 } |
314 | 5866 } |
5867 else if (nlen > olen) | |
5868 { | |
17015
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
5869 /* Here, we used to have the following simple code: |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
5870 ---------------------------------------- |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
5871 write_glyphs (nbody + nsp + begmatch, olen - tem); |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
5872 insert_glyphs (nbody + nsp + begmatch + olen - tem, nlen - olen); |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
5873 ---------------------------------------- |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
5874 but it doesn't work if nbody[nsp + begmatch + olen - tem] |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
5875 is a padding glyph. */ |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
5876 int out = olen - tem; /* Columns to be overwritten originally. */ |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
5877 int del; |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
5878 |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83098
diff
changeset
|
5879 cursor_to (f, vpos, nsp + begmatch); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
5880 |
17015
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
5881 /* Calculate columns we can actually overwrite. */ |
35924
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5882 while (CHAR_GLYPH_PADDING_P (nbody[nsp + begmatch + out])) |
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5883 out--; |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83098
diff
changeset
|
5884 write_glyphs (f, nbody + nsp + begmatch, out); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
5885 |
25012 | 5886 /* If we left columns to be overwritten, we must delete them. */ |
17015
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
5887 del = olen - tem - out; |
35924
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5888 if (del > 0) |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83098
diff
changeset
|
5889 delete_glyphs (f, del); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
5890 |
17015
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
5891 /* At last, we insert columns not yet written out. */ |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83098
diff
changeset
|
5892 insert_glyphs (f, nbody + nsp + begmatch + out, nlen - olen + del); |
314 | 5893 olen = nlen; |
5894 } | |
5895 else if (olen > nlen) | |
5896 { | |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83098
diff
changeset
|
5897 cursor_to (f, vpos, nsp + begmatch); |
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83098
diff
changeset
|
5898 write_glyphs (f, nbody + nsp + begmatch, nlen - tem); |
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83098
diff
changeset
|
5899 delete_glyphs (f, olen - nlen); |
314 | 5900 olen = nlen; |
5901 } | |
5902 } | |
5903 | |
5904 just_erase: | |
5905 /* If any unerased characters remain after the new line, erase them. */ | |
5906 if (olen > nlen) | |
5907 { | |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83098
diff
changeset
|
5908 cursor_to (f, vpos, nlen); |
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83098
diff
changeset
|
5909 clear_end_of_line (f, olen); |
314 | 5910 } |
5911 | |
764 | 5912 /* Exchange contents between current_frame and new_frame. */ |
25012 | 5913 make_current (desired_matrix, current_matrix, vpos); |
314 | 5914 } |
25012 | 5915 |
5916 | |
314 | 5917 |
25012 | 5918 /*********************************************************************** |
5919 X/Y Position -> Buffer Position | |
5920 ***********************************************************************/ | |
5921 | |
36697
7526acd3385c
(buffer_posn_from_coords): Add parameters OBJECT and
Gerd Moellmann <gerd@gnu.org>
parents:
36590
diff
changeset
|
5922 /* Determine what's under window-relative pixel position (*X, *Y). |
53514
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
5923 Return the object (string or buffer) that's there. |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
5924 Return in *POS the position in that object. |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
5925 Adjust *X and *Y to character positions. */ |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
5926 |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
5927 Lisp_Object |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
5928 buffer_posn_from_coords (w, x, y, pos, object, dx, dy, width, height) |
25012 | 5929 struct window *w; |
5930 int *x, *y; | |
53514
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
5931 struct display_pos *pos; |
36697
7526acd3385c
(buffer_posn_from_coords): Add parameters OBJECT and
Gerd Moellmann <gerd@gnu.org>
parents:
36590
diff
changeset
|
5932 Lisp_Object *object; |
53514
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
5933 int *dx, *dy; |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
5934 int *width, *height; |
7810
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
5935 { |
25012 | 5936 struct it it; |
101464
f34b82b3a6e0
(buffer_posn_from_coords): Use Fset_buffer instead of setting
Chong Yidong <cyd@stupidchicken.com>
parents:
100951
diff
changeset
|
5937 Lisp_Object old_current_buffer = Fcurrent_buffer (); |
25012 | 5938 struct text_pos startp; |
53514
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
5939 Lisp_Object string; |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
5940 struct glyph_row *row; |
55021
78fbab658433
(buffer_posn_from_coords): Return full image width
Kim F. Storm <storm@cua.dk>
parents:
54847
diff
changeset
|
5941 #ifdef HAVE_WINDOW_SYSTEM |
78fbab658433
(buffer_posn_from_coords): Return full image width
Kim F. Storm <storm@cua.dk>
parents:
54847
diff
changeset
|
5942 struct image *img = 0; |
78fbab658433
(buffer_posn_from_coords): Return full image width
Kim F. Storm <storm@cua.dk>
parents:
54847
diff
changeset
|
5943 #endif |
53127
bc14fd4782c3
(buffer_posn_from_coords): Return actual row/column
Kim F. Storm <storm@cua.dk>
parents:
53055
diff
changeset
|
5944 int x0, x1; |
25012 | 5945 |
101464
f34b82b3a6e0
(buffer_posn_from_coords): Use Fset_buffer instead of setting
Chong Yidong <cyd@stupidchicken.com>
parents:
100951
diff
changeset
|
5946 /* We used to set current_buffer directly here, but that does the |
f34b82b3a6e0
(buffer_posn_from_coords): Use Fset_buffer instead of setting
Chong Yidong <cyd@stupidchicken.com>
parents:
100951
diff
changeset
|
5947 wrong thing with `face-remapping-alist' (bug#2044). */ |
f34b82b3a6e0
(buffer_posn_from_coords): Use Fset_buffer instead of setting
Chong Yidong <cyd@stupidchicken.com>
parents:
100951
diff
changeset
|
5948 Fset_buffer (w->buffer); |
25012 | 5949 SET_TEXT_POS_FROM_MARKER (startp, w->start); |
5950 CHARPOS (startp) = min (ZV, max (BEGV, CHARPOS (startp))); | |
5951 BYTEPOS (startp) = min (ZV_BYTE, max (BEGV_BYTE, BYTEPOS (startp))); | |
5952 start_display (&it, w, startp); | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
5953 |
53127
bc14fd4782c3
(buffer_posn_from_coords): Return actual row/column
Kim F. Storm <storm@cua.dk>
parents:
53055
diff
changeset
|
5954 x0 = *x - WINDOW_LEFT_MARGIN_WIDTH (w); |
bc14fd4782c3
(buffer_posn_from_coords): Return actual row/column
Kim F. Storm <storm@cua.dk>
parents:
53055
diff
changeset
|
5955 move_it_to (&it, -1, x0 + it.first_visible_x, *y, -1, |
25012 | 5956 MOVE_TO_X | MOVE_TO_Y); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
5957 |
101464
f34b82b3a6e0
(buffer_posn_from_coords): Use Fset_buffer instead of setting
Chong Yidong <cyd@stupidchicken.com>
parents:
100951
diff
changeset
|
5958 Fset_buffer (old_current_buffer); |
36697
7526acd3385c
(buffer_posn_from_coords): Add parameters OBJECT and
Gerd Moellmann <gerd@gnu.org>
parents:
36590
diff
changeset
|
5959 |
53176
b246aabe1c49
(buffer_posn_from_coords): Calculate and return pixel
Kim F. Storm <storm@cua.dk>
parents:
53127
diff
changeset
|
5960 *dx = x0 + it.first_visible_x - it.current_x; |
b246aabe1c49
(buffer_posn_from_coords): Calculate and return pixel
Kim F. Storm <storm@cua.dk>
parents:
53127
diff
changeset
|
5961 *dy = *y - it.current_y; |
b246aabe1c49
(buffer_posn_from_coords): Calculate and return pixel
Kim F. Storm <storm@cua.dk>
parents:
53127
diff
changeset
|
5962 |
53514
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
5963 string = w->buffer; |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
5964 if (STRINGP (it.string)) |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
5965 string = it.string; |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
5966 *pos = it.current; |
53329
9c540a878edf
(buffer_posn_from_coords): Fix calculation of dy for
Kim F. Storm <storm@cua.dk>
parents:
53190
diff
changeset
|
5967 |
53190
053a4dfb6bd4
* dispnew.c (buffer_posn_from_coords): Add ifdef HAVE_WINDOW_SYSTEM
Jan Djärv <jan.h.d@swipnet.se>
parents:
53176
diff
changeset
|
5968 #ifdef HAVE_WINDOW_SYSTEM |
53329
9c540a878edf
(buffer_posn_from_coords): Fix calculation of dy for
Kim F. Storm <storm@cua.dk>
parents:
53190
diff
changeset
|
5969 if (it.what == IT_IMAGE) |
9c540a878edf
(buffer_posn_from_coords): Fix calculation of dy for
Kim F. Storm <storm@cua.dk>
parents:
53190
diff
changeset
|
5970 { |
9c540a878edf
(buffer_posn_from_coords): Fix calculation of dy for
Kim F. Storm <storm@cua.dk>
parents:
53190
diff
changeset
|
5971 if ((img = IMAGE_FROM_ID (it.f, it.image_id)) != NULL |
9c540a878edf
(buffer_posn_from_coords): Fix calculation of dy for
Kim F. Storm <storm@cua.dk>
parents:
53190
diff
changeset
|
5972 && !NILP (img->spec)) |
53514
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
5973 *object = img->spec; |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
5974 } |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
5975 #endif |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
5976 |
65016
2b179104bc17
(buffer_posn_from_coords): Check that target row is
Kim F. Storm <storm@cua.dk>
parents:
65003
diff
changeset
|
5977 if (it.vpos < w->current_matrix->nrows |
2b179104bc17
(buffer_posn_from_coords): Check that target row is
Kim F. Storm <storm@cua.dk>
parents:
65003
diff
changeset
|
5978 && (row = MATRIX_ROW (w->current_matrix, it.vpos), |
2b179104bc17
(buffer_posn_from_coords): Check that target row is
Kim F. Storm <storm@cua.dk>
parents:
65003
diff
changeset
|
5979 row->enabled_p)) |
53514
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
5980 { |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
5981 if (it.hpos < row->used[TEXT_AREA]) |
53329
9c540a878edf
(buffer_posn_from_coords): Fix calculation of dy for
Kim F. Storm <storm@cua.dk>
parents:
53190
diff
changeset
|
5982 { |
53514
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
5983 struct glyph *glyph = row->glyphs[TEXT_AREA] + it.hpos; |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
5984 #ifdef HAVE_WINDOW_SYSTEM |
55021
78fbab658433
(buffer_posn_from_coords): Return full image width
Kim F. Storm <storm@cua.dk>
parents:
54847
diff
changeset
|
5985 if (img) |
78fbab658433
(buffer_posn_from_coords): Return full image width
Kim F. Storm <storm@cua.dk>
parents:
54847
diff
changeset
|
5986 { |
78fbab658433
(buffer_posn_from_coords): Return full image width
Kim F. Storm <storm@cua.dk>
parents:
54847
diff
changeset
|
5987 *dy -= row->ascent - glyph->ascent; |
78fbab658433
(buffer_posn_from_coords): Return full image width
Kim F. Storm <storm@cua.dk>
parents:
54847
diff
changeset
|
5988 *dx += glyph->slice.x; |
78fbab658433
(buffer_posn_from_coords): Return full image width
Kim F. Storm <storm@cua.dk>
parents:
54847
diff
changeset
|
5989 *dy += glyph->slice.y; |
78fbab658433
(buffer_posn_from_coords): Return full image width
Kim F. Storm <storm@cua.dk>
parents:
54847
diff
changeset
|
5990 /* Image slices positions are still relative to the entire image */ |
78fbab658433
(buffer_posn_from_coords): Return full image width
Kim F. Storm <storm@cua.dk>
parents:
54847
diff
changeset
|
5991 *width = img->width; |
78fbab658433
(buffer_posn_from_coords): Return full image width
Kim F. Storm <storm@cua.dk>
parents:
54847
diff
changeset
|
5992 *height = img->height; |
78fbab658433
(buffer_posn_from_coords): Return full image width
Kim F. Storm <storm@cua.dk>
parents:
54847
diff
changeset
|
5993 } |
78fbab658433
(buffer_posn_from_coords): Return full image width
Kim F. Storm <storm@cua.dk>
parents:
54847
diff
changeset
|
5994 else |
53514
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
5995 #endif |
55021
78fbab658433
(buffer_posn_from_coords): Return full image width
Kim F. Storm <storm@cua.dk>
parents:
54847
diff
changeset
|
5996 { |
78fbab658433
(buffer_posn_from_coords): Return full image width
Kim F. Storm <storm@cua.dk>
parents:
54847
diff
changeset
|
5997 *width = glyph->pixel_width; |
78fbab658433
(buffer_posn_from_coords): Return full image width
Kim F. Storm <storm@cua.dk>
parents:
54847
diff
changeset
|
5998 *height = glyph->ascent + glyph->descent; |
78fbab658433
(buffer_posn_from_coords): Return full image width
Kim F. Storm <storm@cua.dk>
parents:
54847
diff
changeset
|
5999 } |
53514
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6000 } |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6001 else |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6002 { |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6003 *width = 0; |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6004 *height = row->height; |
53329
9c540a878edf
(buffer_posn_from_coords): Fix calculation of dy for
Kim F. Storm <storm@cua.dk>
parents:
53190
diff
changeset
|
6005 } |
9c540a878edf
(buffer_posn_from_coords): Fix calculation of dy for
Kim F. Storm <storm@cua.dk>
parents:
53190
diff
changeset
|
6006 } |
53176
b246aabe1c49
(buffer_posn_from_coords): Calculate and return pixel
Kim F. Storm <storm@cua.dk>
parents:
53127
diff
changeset
|
6007 else |
53514
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6008 { |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6009 *width = *height = 0; |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6010 } |
53329
9c540a878edf
(buffer_posn_from_coords): Fix calculation of dy for
Kim F. Storm <storm@cua.dk>
parents:
53190
diff
changeset
|
6011 |
9c540a878edf
(buffer_posn_from_coords): Fix calculation of dy for
Kim F. Storm <storm@cua.dk>
parents:
53190
diff
changeset
|
6012 /* Add extra (default width) columns if clicked after EOL. */ |
9c540a878edf
(buffer_posn_from_coords): Fix calculation of dy for
Kim F. Storm <storm@cua.dk>
parents:
53190
diff
changeset
|
6013 x1 = max(0, it.current_x + it.pixel_width - it.first_visible_x); |
9c540a878edf
(buffer_posn_from_coords): Fix calculation of dy for
Kim F. Storm <storm@cua.dk>
parents:
53190
diff
changeset
|
6014 if (x0 > x1) |
9c540a878edf
(buffer_posn_from_coords): Fix calculation of dy for
Kim F. Storm <storm@cua.dk>
parents:
53190
diff
changeset
|
6015 it.hpos += (x0 - x1) / WINDOW_FRAME_COLUMN_WIDTH (w); |
9c540a878edf
(buffer_posn_from_coords): Fix calculation of dy for
Kim F. Storm <storm@cua.dk>
parents:
53190
diff
changeset
|
6016 |
53127
bc14fd4782c3
(buffer_posn_from_coords): Return actual row/column
Kim F. Storm <storm@cua.dk>
parents:
53055
diff
changeset
|
6017 *x = it.hpos; |
bc14fd4782c3
(buffer_posn_from_coords): Return actual row/column
Kim F. Storm <storm@cua.dk>
parents:
53055
diff
changeset
|
6018 *y = it.vpos; |
53514
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6019 |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6020 return string; |
25012 | 6021 } |
6022 | |
6023 | |
6024 /* Value is the string under window-relative coordinates X/Y in the | |
53514
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6025 mode line or header line (PART says which) of window W, or nil if none. |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6026 *CHARPOS is set to the position in the string returned. */ |
25012 | 6027 |
6028 Lisp_Object | |
53514
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6029 mode_line_string (w, part, x, y, charpos, object, dx, dy, width, height) |
25012 | 6030 struct window *w; |
53514
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6031 enum window_part part; |
53127
bc14fd4782c3
(buffer_posn_from_coords): Return actual row/column
Kim F. Storm <storm@cua.dk>
parents:
53055
diff
changeset
|
6032 int *x, *y; |
53514
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6033 int *charpos; |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6034 Lisp_Object *object; |
53176
b246aabe1c49
(buffer_posn_from_coords): Calculate and return pixel
Kim F. Storm <storm@cua.dk>
parents:
53127
diff
changeset
|
6035 int *dx, *dy; |
53514
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6036 int *width, *height; |
25012 | 6037 { |
6038 struct glyph_row *row; | |
6039 struct glyph *glyph, *end; | |
53176
b246aabe1c49
(buffer_posn_from_coords): Calculate and return pixel
Kim F. Storm <storm@cua.dk>
parents:
53127
diff
changeset
|
6040 int x0, y0; |
25012 | 6041 Lisp_Object string = Qnil; |
6042 | |
50218
06f75553f0a4
(mode_line_string, marginal_area_string): Use enum
Kim F. Storm <storm@cua.dk>
parents:
49600
diff
changeset
|
6043 if (part == ON_MODE_LINE) |
25012 | 6044 row = MATRIX_MODE_LINE_ROW (w->current_matrix); |
6045 else | |
25546 | 6046 row = MATRIX_HEADER_LINE_ROW (w->current_matrix); |
53176
b246aabe1c49
(buffer_posn_from_coords): Calculate and return pixel
Kim F. Storm <storm@cua.dk>
parents:
53127
diff
changeset
|
6047 y0 = *y - row->y; |
53127
bc14fd4782c3
(buffer_posn_from_coords): Return actual row/column
Kim F. Storm <storm@cua.dk>
parents:
53055
diff
changeset
|
6048 *y = row - MATRIX_FIRST_TEXT_ROW (w->current_matrix); |
bc14fd4782c3
(buffer_posn_from_coords): Return actual row/column
Kim F. Storm <storm@cua.dk>
parents:
53055
diff
changeset
|
6049 |
25012 | 6050 if (row->mode_line_p && row->enabled_p) |
11919
31cb053405f2
(Fframe_or_buffer_changed_p): Record frame names
Karl Heuer <kwzh@gnu.org>
parents:
11914
diff
changeset
|
6051 { |
25012 | 6052 /* Find the glyph under X. If we find one with a string object, |
6053 it's the one we were looking for. */ | |
6054 glyph = row->glyphs[TEXT_AREA]; | |
6055 end = glyph + row->used[TEXT_AREA]; | |
59592
c0533d2d03af
(mode_line_string, marginal_area_string): Fix
Kim F. Storm <storm@cua.dk>
parents:
59580
diff
changeset
|
6056 for (x0 = *x; glyph < end && x0 >= glyph->pixel_width; ++glyph) |
53127
bc14fd4782c3
(buffer_posn_from_coords): Return actual row/column
Kim F. Storm <storm@cua.dk>
parents:
53055
diff
changeset
|
6057 x0 -= glyph->pixel_width; |
bc14fd4782c3
(buffer_posn_from_coords): Return actual row/column
Kim F. Storm <storm@cua.dk>
parents:
53055
diff
changeset
|
6058 *x = glyph - row->glyphs[TEXT_AREA]; |
bc14fd4782c3
(buffer_posn_from_coords): Return actual row/column
Kim F. Storm <storm@cua.dk>
parents:
53055
diff
changeset
|
6059 if (glyph < end) |
bc14fd4782c3
(buffer_posn_from_coords): Return actual row/column
Kim F. Storm <storm@cua.dk>
parents:
53055
diff
changeset
|
6060 { |
bc14fd4782c3
(buffer_posn_from_coords): Return actual row/column
Kim F. Storm <storm@cua.dk>
parents:
53055
diff
changeset
|
6061 string = glyph->object; |
bc14fd4782c3
(buffer_posn_from_coords): Return actual row/column
Kim F. Storm <storm@cua.dk>
parents:
53055
diff
changeset
|
6062 *charpos = glyph->charpos; |
53514
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6063 *width = glyph->pixel_width; |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6064 *height = glyph->ascent + glyph->descent; |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6065 #ifdef HAVE_WINDOW_SYSTEM |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6066 if (glyph->type == IMAGE_GLYPH) |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6067 { |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6068 struct image *img; |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6069 img = IMAGE_FROM_ID (WINDOW_XFRAME (w), glyph->u.img_id); |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6070 if (img != NULL) |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6071 *object = img->spec; |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6072 y0 -= row->ascent - glyph->ascent; |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6073 } |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6074 #endif |
53127
bc14fd4782c3
(buffer_posn_from_coords): Return actual row/column
Kim F. Storm <storm@cua.dk>
parents:
53055
diff
changeset
|
6075 } |
bc14fd4782c3
(buffer_posn_from_coords): Return actual row/column
Kim F. Storm <storm@cua.dk>
parents:
53055
diff
changeset
|
6076 else |
53514
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6077 { |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6078 /* Add extra (default width) columns if clicked after EOL. */ |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6079 *x += x0 / WINDOW_FRAME_COLUMN_WIDTH (w); |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6080 *width = 0; |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6081 *height = row->height; |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6082 } |
7810
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
6083 } |
53127
bc14fd4782c3
(buffer_posn_from_coords): Return actual row/column
Kim F. Storm <storm@cua.dk>
parents:
53055
diff
changeset
|
6084 else |
53176
b246aabe1c49
(buffer_posn_from_coords): Calculate and return pixel
Kim F. Storm <storm@cua.dk>
parents:
53127
diff
changeset
|
6085 { |
b246aabe1c49
(buffer_posn_from_coords): Calculate and return pixel
Kim F. Storm <storm@cua.dk>
parents:
53127
diff
changeset
|
6086 *x = 0; |
b246aabe1c49
(buffer_posn_from_coords): Calculate and return pixel
Kim F. Storm <storm@cua.dk>
parents:
53127
diff
changeset
|
6087 x0 = 0; |
53514
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6088 *width = *height = 0; |
53176
b246aabe1c49
(buffer_posn_from_coords): Calculate and return pixel
Kim F. Storm <storm@cua.dk>
parents:
53127
diff
changeset
|
6089 } |
b246aabe1c49
(buffer_posn_from_coords): Calculate and return pixel
Kim F. Storm <storm@cua.dk>
parents:
53127
diff
changeset
|
6090 |
53514
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6091 *dx = x0; |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6092 *dy = y0; |
25012 | 6093 |
6094 return string; | |
7810
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
6095 } |
25012 | 6096 |
6097 | |
44536
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
6098 /* Value is the string under window-relative coordinates X/Y in either |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
6099 marginal area, or nil if none. *CHARPOS is set to the position in |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
6100 the string returned. */ |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
6101 |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
6102 Lisp_Object |
53514
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6103 marginal_area_string (w, part, x, y, charpos, object, dx, dy, width, height) |
44536
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
6104 struct window *w; |
53514
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6105 enum window_part part; |
53127
bc14fd4782c3
(buffer_posn_from_coords): Return actual row/column
Kim F. Storm <storm@cua.dk>
parents:
53055
diff
changeset
|
6106 int *x, *y; |
53514
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6107 int *charpos; |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6108 Lisp_Object *object; |
53176
b246aabe1c49
(buffer_posn_from_coords): Calculate and return pixel
Kim F. Storm <storm@cua.dk>
parents:
53127
diff
changeset
|
6109 int *dx, *dy; |
53514
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6110 int *width, *height; |
44536
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
6111 { |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
6112 struct glyph_row *row = w->current_matrix->rows; |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
6113 struct glyph *glyph, *end; |
53176
b246aabe1c49
(buffer_posn_from_coords): Calculate and return pixel
Kim F. Storm <storm@cua.dk>
parents:
53127
diff
changeset
|
6114 int x0, y0, i, wy = *y; |
50218
06f75553f0a4
(mode_line_string, marginal_area_string): Use enum
Kim F. Storm <storm@cua.dk>
parents:
49600
diff
changeset
|
6115 int area; |
44536
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
6116 Lisp_Object string = Qnil; |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
6117 |
50218
06f75553f0a4
(mode_line_string, marginal_area_string): Use enum
Kim F. Storm <storm@cua.dk>
parents:
49600
diff
changeset
|
6118 if (part == ON_LEFT_MARGIN) |
44536
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
6119 area = LEFT_MARGIN_AREA; |
50218
06f75553f0a4
(mode_line_string, marginal_area_string): Use enum
Kim F. Storm <storm@cua.dk>
parents:
49600
diff
changeset
|
6120 else if (part == ON_RIGHT_MARGIN) |
44536
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
6121 area = RIGHT_MARGIN_AREA; |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
6122 else |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
6123 abort (); |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
6124 |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
6125 for (i = 0; row->enabled_p && i < w->current_matrix->nrows; ++i, ++row) |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
6126 if (wy >= row->y && wy < MATRIX_ROW_BOTTOM_Y (row)) |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
6127 break; |
53176
b246aabe1c49
(buffer_posn_from_coords): Calculate and return pixel
Kim F. Storm <storm@cua.dk>
parents:
53127
diff
changeset
|
6128 y0 = *y - row->y; |
53127
bc14fd4782c3
(buffer_posn_from_coords): Return actual row/column
Kim F. Storm <storm@cua.dk>
parents:
53055
diff
changeset
|
6129 *y = row - MATRIX_FIRST_TEXT_ROW (w->current_matrix); |
44536
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
6130 |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
6131 if (row->enabled_p) |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
6132 { |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
6133 /* Find the glyph under X. If we find one with a string object, |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
6134 it's the one we were looking for. */ |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
6135 if (area == RIGHT_MARGIN_AREA) |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
6136 x0 = ((WINDOW_HAS_FRINGES_OUTSIDE_MARGINS (w) |
54847
5acc1d864551
(update_window): Only set changed_p if
Kim F. Storm <storm@cua.dk>
parents:
54176
diff
changeset
|
6137 ? WINDOW_LEFT_FRINGE_WIDTH (w) |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
6138 : WINDOW_TOTAL_FRINGE_WIDTH (w)) |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
6139 + window_box_width (w, LEFT_MARGIN_AREA) |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
6140 + window_box_width (w, TEXT_AREA)); |
44536
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
6141 else |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
6142 x0 = (WINDOW_HAS_FRINGES_OUTSIDE_MARGINS (w) |
54847
5acc1d864551
(update_window): Only set changed_p if
Kim F. Storm <storm@cua.dk>
parents:
54176
diff
changeset
|
6143 ? WINDOW_LEFT_FRINGE_WIDTH (w) |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
6144 : 0); |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
6145 |
53127
bc14fd4782c3
(buffer_posn_from_coords): Return actual row/column
Kim F. Storm <storm@cua.dk>
parents:
53055
diff
changeset
|
6146 glyph = row->glyphs[area]; |
bc14fd4782c3
(buffer_posn_from_coords): Return actual row/column
Kim F. Storm <storm@cua.dk>
parents:
53055
diff
changeset
|
6147 end = glyph + row->used[area]; |
59592
c0533d2d03af
(mode_line_string, marginal_area_string): Fix
Kim F. Storm <storm@cua.dk>
parents:
59580
diff
changeset
|
6148 for (x0 = *x - x0; glyph < end && x0 >= glyph->pixel_width; ++glyph) |
53127
bc14fd4782c3
(buffer_posn_from_coords): Return actual row/column
Kim F. Storm <storm@cua.dk>
parents:
53055
diff
changeset
|
6149 x0 -= glyph->pixel_width; |
bc14fd4782c3
(buffer_posn_from_coords): Return actual row/column
Kim F. Storm <storm@cua.dk>
parents:
53055
diff
changeset
|
6150 *x = glyph - row->glyphs[area]; |
bc14fd4782c3
(buffer_posn_from_coords): Return actual row/column
Kim F. Storm <storm@cua.dk>
parents:
53055
diff
changeset
|
6151 if (glyph < end) |
bc14fd4782c3
(buffer_posn_from_coords): Return actual row/column
Kim F. Storm <storm@cua.dk>
parents:
53055
diff
changeset
|
6152 { |
bc14fd4782c3
(buffer_posn_from_coords): Return actual row/column
Kim F. Storm <storm@cua.dk>
parents:
53055
diff
changeset
|
6153 string = glyph->object; |
bc14fd4782c3
(buffer_posn_from_coords): Return actual row/column
Kim F. Storm <storm@cua.dk>
parents:
53055
diff
changeset
|
6154 *charpos = glyph->charpos; |
53514
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6155 *width = glyph->pixel_width; |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6156 *height = glyph->ascent + glyph->descent; |
53329
9c540a878edf
(buffer_posn_from_coords): Fix calculation of dy for
Kim F. Storm <storm@cua.dk>
parents:
53190
diff
changeset
|
6157 #ifdef HAVE_WINDOW_SYSTEM |
9c540a878edf
(buffer_posn_from_coords): Fix calculation of dy for
Kim F. Storm <storm@cua.dk>
parents:
53190
diff
changeset
|
6158 if (glyph->type == IMAGE_GLYPH) |
9c540a878edf
(buffer_posn_from_coords): Fix calculation of dy for
Kim F. Storm <storm@cua.dk>
parents:
53190
diff
changeset
|
6159 { |
9c540a878edf
(buffer_posn_from_coords): Fix calculation of dy for
Kim F. Storm <storm@cua.dk>
parents:
53190
diff
changeset
|
6160 struct image *img; |
9c540a878edf
(buffer_posn_from_coords): Fix calculation of dy for
Kim F. Storm <storm@cua.dk>
parents:
53190
diff
changeset
|
6161 img = IMAGE_FROM_ID (WINDOW_XFRAME (w), glyph->u.img_id); |
9c540a878edf
(buffer_posn_from_coords): Fix calculation of dy for
Kim F. Storm <storm@cua.dk>
parents:
53190
diff
changeset
|
6162 if (img != NULL) |
53514
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6163 *object = img->spec; |
53329
9c540a878edf
(buffer_posn_from_coords): Fix calculation of dy for
Kim F. Storm <storm@cua.dk>
parents:
53190
diff
changeset
|
6164 y0 -= row->ascent - glyph->ascent; |
55021
78fbab658433
(buffer_posn_from_coords): Return full image width
Kim F. Storm <storm@cua.dk>
parents:
54847
diff
changeset
|
6165 x0 += glyph->slice.x; |
78fbab658433
(buffer_posn_from_coords): Return full image width
Kim F. Storm <storm@cua.dk>
parents:
54847
diff
changeset
|
6166 y0 += glyph->slice.y; |
53329
9c540a878edf
(buffer_posn_from_coords): Fix calculation of dy for
Kim F. Storm <storm@cua.dk>
parents:
53190
diff
changeset
|
6167 } |
9c540a878edf
(buffer_posn_from_coords): Fix calculation of dy for
Kim F. Storm <storm@cua.dk>
parents:
53190
diff
changeset
|
6168 #endif |
53127
bc14fd4782c3
(buffer_posn_from_coords): Return actual row/column
Kim F. Storm <storm@cua.dk>
parents:
53055
diff
changeset
|
6169 } |
bc14fd4782c3
(buffer_posn_from_coords): Return actual row/column
Kim F. Storm <storm@cua.dk>
parents:
53055
diff
changeset
|
6170 else |
53514
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6171 { |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6172 /* Add extra (default width) columns if clicked after EOL. */ |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6173 *x += x0 / WINDOW_FRAME_COLUMN_WIDTH (w); |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6174 *width = 0; |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6175 *height = row->height; |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6176 } |
44536
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
6177 } |
53127
bc14fd4782c3
(buffer_posn_from_coords): Return actual row/column
Kim F. Storm <storm@cua.dk>
parents:
53055
diff
changeset
|
6178 else |
53176
b246aabe1c49
(buffer_posn_from_coords): Calculate and return pixel
Kim F. Storm <storm@cua.dk>
parents:
53127
diff
changeset
|
6179 { |
b246aabe1c49
(buffer_posn_from_coords): Calculate and return pixel
Kim F. Storm <storm@cua.dk>
parents:
53127
diff
changeset
|
6180 x0 = 0; |
b246aabe1c49
(buffer_posn_from_coords): Calculate and return pixel
Kim F. Storm <storm@cua.dk>
parents:
53127
diff
changeset
|
6181 *x = 0; |
53514
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6182 *width = *height = 0; |
53176
b246aabe1c49
(buffer_posn_from_coords): Calculate and return pixel
Kim F. Storm <storm@cua.dk>
parents:
53127
diff
changeset
|
6183 } |
b246aabe1c49
(buffer_posn_from_coords): Calculate and return pixel
Kim F. Storm <storm@cua.dk>
parents:
53127
diff
changeset
|
6184 |
53514
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6185 *dx = x0; |
db81ac8829b6
(buffer_posn_from_coords): Return both buffer/string
Kim F. Storm <storm@cua.dk>
parents:
53329
diff
changeset
|
6186 *dy = y0; |
44536
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
6187 |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
6188 return string; |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
6189 } |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
6190 |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
6191 |
25012 | 6192 /*********************************************************************** |
6193 Changing Frame Sizes | |
6194 ***********************************************************************/ | |
314 | 6195 |
6196 #ifdef SIGWINCH | |
25012 | 6197 |
493 | 6198 SIGTYPE |
10745
a553a08f5785
(window_change_signal): Add ignored argument.
Richard M. Stallman <rms@gnu.org>
parents:
10259
diff
changeset
|
6199 window_change_signal (signalnum) /* If we don't have an argument, */ |
25012 | 6200 int signalnum; /* some compilers complain in signal calls. */ |
314 | 6201 { |
6202 int width, height; | |
31093
6da961dff718
Include keyboard.h before frame.h.
Andrew Innes <andrewi@gnu.org>
parents:
30720
diff
changeset
|
6203 #ifndef USE_CRT_DLL |
314 | 6204 extern int errno; |
31093
6da961dff718
Include keyboard.h before frame.h.
Andrew Innes <andrewi@gnu.org>
parents:
30720
diff
changeset
|
6205 #endif |
314 | 6206 int old_errno = errno; |
6207 | |
82989
f3845715a5f6
Separate frame-local, tty-dependent parameters from tty-local parameters.
Karoly Lorentey <lorentey@elte.hu>
parents:
82987
diff
changeset
|
6208 struct tty_display_info *tty; |
82995
039bd6989d29
Portability fixes (now it compiles & runs fine on Solaris).
Karoly Lorentey <lorentey@elte.hu>
parents:
82992
diff
changeset
|
6209 |
58986
59945307b86b
* syssignal.h: Declare main_thread.
Jan Djärv <jan.h.d@swipnet.se>
parents:
57808
diff
changeset
|
6210 signal (SIGWINCH, window_change_signal); |
59945307b86b
* syssignal.h: Declare main_thread.
Jan Djärv <jan.h.d@swipnet.se>
parents:
57808
diff
changeset
|
6211 SIGNAL_THREAD_CHECK (signalnum); |
59945307b86b
* syssignal.h: Declare main_thread.
Jan Djärv <jan.h.d@swipnet.se>
parents:
57808
diff
changeset
|
6212 |
53229
33c3c7c16e13
lib-src/emacsclient.c: Implemented --here option (open a new Emacs tty). Needs more work.
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
6213 /* The frame size change obviously applies to a single |
33c3c7c16e13
lib-src/emacsclient.c: Implemented --here option (open a new Emacs tty). Needs more work.
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
6214 termcap-controlled terminal, but we can't decide which. |
33c3c7c16e13
lib-src/emacsclient.c: Implemented --here option (open a new Emacs tty). Needs more work.
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
6215 Therefore, we resize the frames corresponding to each tty. |
33c3c7c16e13
lib-src/emacsclient.c: Implemented --here option (open a new Emacs tty). Needs more work.
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
6216 */ |
33c3c7c16e13
lib-src/emacsclient.c: Implemented --here option (open a new Emacs tty). Needs more work.
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
6217 for (tty = tty_list; tty; tty = tty->next) { |
33c3c7c16e13
lib-src/emacsclient.c: Implemented --here option (open a new Emacs tty). Needs more work.
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
6218 |
53341 | 6219 if (! tty->term_initted) |
6220 continue; | |
82995
039bd6989d29
Portability fixes (now it compiles & runs fine on Solaris).
Karoly Lorentey <lorentey@elte.hu>
parents:
82992
diff
changeset
|
6221 |
101690
1009d5607716
* dispnew.c (window_change_signal): Don't try to get the size of a
Dan Nicolaescu <dann@ics.uci.edu>
parents:
101464
diff
changeset
|
6222 /* Suspended tty frames have tty->input == NULL avoid trying to |
1009d5607716
* dispnew.c (window_change_signal): Don't try to get the size of a
Dan Nicolaescu <dann@ics.uci.edu>
parents:
101464
diff
changeset
|
6223 use it. */ |
1009d5607716
* dispnew.c (window_change_signal): Don't try to get the size of a
Dan Nicolaescu <dann@ics.uci.edu>
parents:
101464
diff
changeset
|
6224 if (!tty->input) |
1009d5607716
* dispnew.c (window_change_signal): Don't try to get the size of a
Dan Nicolaescu <dann@ics.uci.edu>
parents:
101464
diff
changeset
|
6225 continue; |
1009d5607716
* dispnew.c (window_change_signal): Don't try to get the size of a
Dan Nicolaescu <dann@ics.uci.edu>
parents:
101464
diff
changeset
|
6226 |
83065
a871be7b26a5
Implemented suspending of emacsclient frames.
Karoly Lorentey <lorentey@elte.hu>
parents:
83037
diff
changeset
|
6227 get_tty_size (fileno (tty->input), &width, &height); |
92276
1dc7b04a4d95
(line_draw_cost): Adapt to new glyph type.
Kim F. Storm <storm@cua.dk>
parents:
91367
diff
changeset
|
6228 |
83412
573105015a96
Work around Emacs crash on Konsole detach. (Tom Schutzer-Weissmann)
Karoly Lorentey <lorentey@elte.hu>
parents:
83384
diff
changeset
|
6229 if (width > 5 && height > 2) { |
53229
33c3c7c16e13
lib-src/emacsclient.c: Implemented --here option (open a new Emacs tty). Needs more work.
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
6230 Lisp_Object tail, frame; |
92276
1dc7b04a4d95
(line_draw_cost): Adapt to new glyph type.
Kim F. Storm <storm@cua.dk>
parents:
91367
diff
changeset
|
6231 |
53229
33c3c7c16e13
lib-src/emacsclient.c: Implemented --here option (open a new Emacs tty). Needs more work.
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
6232 FOR_EACH_FRAME (tail, frame) |
82995
039bd6989d29
Portability fixes (now it compiles & runs fine on Solaris).
Karoly Lorentey <lorentey@elte.hu>
parents:
82992
diff
changeset
|
6233 if (FRAME_TERMCAP_P (XFRAME (frame)) && FRAME_TTY (XFRAME (frame)) == tty) |
039bd6989d29
Portability fixes (now it compiles & runs fine on Solaris).
Karoly Lorentey <lorentey@elte.hu>
parents:
82992
diff
changeset
|
6234 /* Record the new sizes, but don't reallocate the data |
039bd6989d29
Portability fixes (now it compiles & runs fine on Solaris).
Karoly Lorentey <lorentey@elte.hu>
parents:
82992
diff
changeset
|
6235 structures now. Let that be done later outside of the |
039bd6989d29
Portability fixes (now it compiles & runs fine on Solaris).
Karoly Lorentey <lorentey@elte.hu>
parents:
82992
diff
changeset
|
6236 signal handler. */ |
039bd6989d29
Portability fixes (now it compiles & runs fine on Solaris).
Karoly Lorentey <lorentey@elte.hu>
parents:
82992
diff
changeset
|
6237 change_frame_size (XFRAME (frame), height, width, 0, 1, 0); |
53229
33c3c7c16e13
lib-src/emacsclient.c: Implemented --here option (open a new Emacs tty). Needs more work.
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
6238 } |
314 | 6239 } |
6240 | |
6241 errno = old_errno; | |
6242 } | |
6243 #endif /* SIGWINCH */ | |
6244 | |
6245 | |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
6246 /* Do any change in frame size that was requested by a signal. SAFE |
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
6247 non-zero means this function is called from a place where it is |
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
6248 safe to change frame sizes while a redisplay is in progress. */ |
314 | 6249 |
21514 | 6250 void |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
6251 do_pending_window_change (safe) |
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
6252 int safe; |
314 | 6253 { |
6254 /* If window_change_signal should have run before, run it now. */ | |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
6255 if (redisplaying_p && !safe) |
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
6256 return; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
6257 |
314 | 6258 while (delayed_size_change) |
6259 { | |
2252
9793d8654e23
* frame.h (FOR_EACH_FRAME): Change the definition so that
Jim Blandy <jimb@redhat.com>
parents:
2198
diff
changeset
|
6260 Lisp_Object tail, frame; |
314 | 6261 |
6262 delayed_size_change = 0; | |
6263 | |
2252
9793d8654e23
* frame.h (FOR_EACH_FRAME): Change the definition so that
Jim Blandy <jimb@redhat.com>
parents:
2198
diff
changeset
|
6264 FOR_EACH_FRAME (tail, frame) |
314 | 6265 { |
25012 | 6266 struct frame *f = XFRAME (frame); |
2252
9793d8654e23
* frame.h (FOR_EACH_FRAME): Change the definition so that
Jim Blandy <jimb@redhat.com>
parents:
2198
diff
changeset
|
6267 |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
6268 if (f->new_text_lines != 0 || f->new_text_cols != 0) |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
6269 change_frame_size (f, f->new_text_lines, f->new_text_cols, |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
6270 0, 0, safe); |
314 | 6271 } |
6272 } | |
6273 } | |
6274 | |
6275 | |
764 | 6276 /* Change the frame height and/or width. Values may be given as zero to |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
6277 indicate no change is to take place. |
314 | 6278 |
960
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
6279 If DELAY is non-zero, then assume we're being called from a signal |
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
6280 handler, and queue the change for later - perhaps the next |
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
6281 redisplay. Since this tries to resize windows, we can't call it |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
6282 from a signal handler. |
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
6283 |
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
6284 SAFE non-zero means this function is called from a place where it's |
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
6285 safe to change frame sizes while a redisplay is in progress. */ |
960
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
6286 |
21514 | 6287 void |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
6288 change_frame_size (f, newheight, newwidth, pretend, delay, safe) |
25012 | 6289 register struct frame *f; |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
6290 int newheight, newwidth, pretend, delay, safe; |
10770
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
6291 { |
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
6292 Lisp_Object tail, frame; |
16881
245ba9f2781a
(change_frame_size_1): Reject new sizes if they cause overflow.
Richard M. Stallman <rms@gnu.org>
parents:
16822
diff
changeset
|
6293 |
53229
33c3c7c16e13
lib-src/emacsclient.c: Implemented --here option (open a new Emacs tty). Needs more work.
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
6294 if (FRAME_MSDOS_P (f)) |
10770
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
6295 { |
53229
33c3c7c16e13
lib-src/emacsclient.c: Implemented --here option (open a new Emacs tty). Needs more work.
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
6296 /* On MS-DOS, all frames use the same screen, so a change in |
33c3c7c16e13
lib-src/emacsclient.c: Implemented --here option (open a new Emacs tty). Needs more work.
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
6297 size affects all frames. Termcap now supports multiple |
33c3c7c16e13
lib-src/emacsclient.c: Implemented --here option (open a new Emacs tty). Needs more work.
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
6298 ttys. */ |
10770
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
6299 FOR_EACH_FRAME (tail, frame) |
15395
b584c2db055f
(change_frame_size, remake_frame_glyphs): Use FRAME_WINDOW_P.
Richard M. Stallman <rms@gnu.org>
parents:
15394
diff
changeset
|
6300 if (! FRAME_WINDOW_P (XFRAME (frame))) |
10770
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
6301 change_frame_size_1 (XFRAME (frame), newheight, newwidth, |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
6302 pretend, delay, safe); |
10770
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
6303 } |
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
6304 else |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
6305 change_frame_size_1 (f, newheight, newwidth, pretend, delay, safe); |
10770
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
6306 } |
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
6307 |
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
6308 static void |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
6309 change_frame_size_1 (f, newheight, newwidth, pretend, delay, safe) |
25012 | 6310 register struct frame *f; |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
6311 int newheight, newwidth, pretend, delay, safe; |
314 | 6312 { |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
6313 int new_frame_total_cols; |
46293
1fb8f75062c6
Use macro SPECPDL_INDEX.
Juanma Barranquero <lekktu@gmail.com>
parents:
44890
diff
changeset
|
6314 int count = SPECPDL_INDEX (); |
16881
245ba9f2781a
(change_frame_size_1): Reject new sizes if they cause overflow.
Richard M. Stallman <rms@gnu.org>
parents:
16822
diff
changeset
|
6315 |
314 | 6316 /* If we can't deal with the change now, queue it for later. */ |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
6317 if (delay || (redisplaying_p && !safe)) |
314 | 6318 { |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
6319 f->new_text_lines = newheight; |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
6320 f->new_text_cols = newwidth; |
314 | 6321 delayed_size_change = 1; |
6322 return; | |
6323 } | |
6324 | |
764 | 6325 /* This size-change overrides any pending one for this frame. */ |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
6326 f->new_text_lines = 0; |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
6327 f->new_text_cols = 0; |
960
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
6328 |
3449
ad455da9b789
(do_pending_window_change): No need to clear
Richard M. Stallman <rms@gnu.org>
parents:
3357
diff
changeset
|
6329 /* If an argument is zero, set it to the current value. */ |
15896
3a3c30116313
(change_frame_size_1): Clean up conditional.
Erik Naggum <erik@naggum.no>
parents:
15687
diff
changeset
|
6330 if (newheight == 0) |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
6331 newheight = FRAME_LINES (f); |
15896
3a3c30116313
(change_frame_size_1): Clean up conditional.
Erik Naggum <erik@naggum.no>
parents:
15687
diff
changeset
|
6332 if (newwidth == 0) |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
6333 newwidth = FRAME_COLS (f); |
25012 | 6334 |
6335 /* Compute width of windows in F. | |
6336 This is the width of the frame without vertical scroll bars. */ | |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
6337 new_frame_total_cols = FRAME_TOTAL_COLS_ARG (f, newwidth); |
16881
245ba9f2781a
(change_frame_size_1): Reject new sizes if they cause overflow.
Richard M. Stallman <rms@gnu.org>
parents:
16822
diff
changeset
|
6338 |
960
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
6339 /* Round up to the smallest acceptable size. */ |
25012 | 6340 check_frame_size (f, &newheight, &newwidth); |
960
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
6341 |
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
6342 /* If we're not changing the frame size, quit now. */ |
106765
0c270bc7ceff
Frame width was not updated in fullscreen when scroll bars where removed/added.
Jan D. <jan.h.d@swipnet.se>
parents:
105877
diff
changeset
|
6343 /* Frame width may be unchanged but the text portion may change, for example, |
0c270bc7ceff
Frame width was not updated in fullscreen when scroll bars where removed/added.
Jan D. <jan.h.d@swipnet.se>
parents:
105877
diff
changeset
|
6344 fullscreen and remove/add scroll bar. */ |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
6345 if (newheight == FRAME_LINES (f) |
106765
0c270bc7ceff
Frame width was not updated in fullscreen when scroll bars where removed/added.
Jan D. <jan.h.d@swipnet.se>
parents:
105877
diff
changeset
|
6346 && newwidth == FRAME_COLS (f) // text portion unchanged |
0c270bc7ceff
Frame width was not updated in fullscreen when scroll bars where removed/added.
Jan D. <jan.h.d@swipnet.se>
parents:
105877
diff
changeset
|
6347 && new_frame_total_cols == FRAME_TOTAL_COLS (f)) // frame width unchanged |
314 | 6348 return; |
6349 | |
15078 | 6350 BLOCK_INPUT; |
6351 | |
14286
5d42664b4e74
(change_frame_size_1) [MSDOS]: Support frame size
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
6352 #ifdef MSDOS |
5d42664b4e74
(change_frame_size_1) [MSDOS]: Support frame size
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
6353 /* We only can set screen dimensions to certain values supported |
5d42664b4e74
(change_frame_size_1) [MSDOS]: Support frame size
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
6354 by our video hardware. Try to find the smallest size greater |
5d42664b4e74
(change_frame_size_1) [MSDOS]: Support frame size
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
6355 or equal to the requested dimensions. */ |
5d42664b4e74
(change_frame_size_1) [MSDOS]: Support frame size
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
6356 dos_set_window_size (&newheight, &newwidth); |
5d42664b4e74
(change_frame_size_1) [MSDOS]: Support frame size
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
6357 #endif |
5d42664b4e74
(change_frame_size_1) [MSDOS]: Support frame size
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
6358 |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
6359 if (newheight != FRAME_LINES (f)) |
314 | 6360 { |
25012 | 6361 if (FRAME_HAS_MINIBUF_P (f) && !FRAME_MINIBUF_ONLY_P (f)) |
314 | 6362 { |
25012 | 6363 /* Frame has both root and mini-buffer. */ |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
6364 XSETFASTINT (XWINDOW (FRAME_ROOT_WINDOW (f))->top_line, |
25012 | 6365 FRAME_TOP_MARGIN (f)); |
6366 set_window_height (FRAME_ROOT_WINDOW (f), | |
6367 (newheight | |
6368 - 1 | |
6369 - FRAME_TOP_MARGIN (f)), | |
94513
5b9bb0c0273a
(change_frame_size_1): Preserve small windows when shrinking
Martin Rudalics <rudalics@gmx.at>
parents:
92692
diff
changeset
|
6370 2); |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
6371 XSETFASTINT (XWINDOW (FRAME_MINIBUF_WINDOW (f))->top_line, |
9303
3115ae493c30
(direct_output_for_insert, direct_output_forward_char, change_frame_size,
Karl Heuer <kwzh@gnu.org>
parents:
9264
diff
changeset
|
6372 newheight - 1); |
25012 | 6373 set_window_height (FRAME_MINIBUF_WINDOW (f), 1, 0); |
314 | 6374 } |
6375 else | |
764 | 6376 /* Frame has just one top-level window. */ |
25012 | 6377 set_window_height (FRAME_ROOT_WINDOW (f), |
94513
5b9bb0c0273a
(change_frame_size_1): Preserve small windows when shrinking
Martin Rudalics <rudalics@gmx.at>
parents:
92692
diff
changeset
|
6378 newheight - FRAME_TOP_MARGIN (f), 2); |
25012 | 6379 |
98497
6fa56eeb247c
(change_frame_size_1): Set FrameRows and FrameCols for MSDOS frames as well.
Eli Zaretskii <eliz@gnu.org>
parents:
98438
diff
changeset
|
6380 /* MSDOS frames cannot PRETEND, as they change frame size by |
6fa56eeb247c
(change_frame_size_1): Set FrameRows and FrameCols for MSDOS frames as well.
Eli Zaretskii <eliz@gnu.org>
parents:
98438
diff
changeset
|
6381 manipulating video hardware. */ |
6fa56eeb247c
(change_frame_size_1): Set FrameRows and FrameCols for MSDOS frames as well.
Eli Zaretskii <eliz@gnu.org>
parents:
98438
diff
changeset
|
6382 if ((FRAME_TERMCAP_P (f) && !pretend) || FRAME_MSDOS_P (f)) |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53231
diff
changeset
|
6383 FrameRows (FRAME_TTY (f)) = newheight; |
314 | 6384 } |
6385 | |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
6386 if (new_frame_total_cols != FRAME_TOTAL_COLS (f)) |
314 | 6387 { |
94513
5b9bb0c0273a
(change_frame_size_1): Preserve small windows when shrinking
Martin Rudalics <rudalics@gmx.at>
parents:
92692
diff
changeset
|
6388 set_window_width (FRAME_ROOT_WINDOW (f), new_frame_total_cols, 2); |
25012 | 6389 if (FRAME_HAS_MINIBUF_P (f)) |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
6390 set_window_width (FRAME_MINIBUF_WINDOW (f), new_frame_total_cols, 0); |
25012 | 6391 |
98497
6fa56eeb247c
(change_frame_size_1): Set FrameRows and FrameCols for MSDOS frames as well.
Eli Zaretskii <eliz@gnu.org>
parents:
98438
diff
changeset
|
6392 /* MSDOS frames cannot PRETEND, as they change frame size by |
6fa56eeb247c
(change_frame_size_1): Set FrameRows and FrameCols for MSDOS frames as well.
Eli Zaretskii <eliz@gnu.org>
parents:
98438
diff
changeset
|
6393 manipulating video hardware. */ |
6fa56eeb247c
(change_frame_size_1): Set FrameRows and FrameCols for MSDOS frames as well.
Eli Zaretskii <eliz@gnu.org>
parents:
98438
diff
changeset
|
6394 if ((FRAME_TERMCAP_P (f) && !pretend) || FRAME_MSDOS_P (f)) |
53232
22aaf1e5fbe6
Full support for multiple terminal I/O (with some rough edges).
Karoly Lorentey <lorentey@elte.hu>
parents:
53231
diff
changeset
|
6395 FrameCols (FRAME_TTY (f)) = newwidth; |
25012 | 6396 |
25544
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
6397 if (WINDOWP (f->tool_bar_window)) |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
6398 XSETFASTINT (XWINDOW (f->tool_bar_window)->total_cols, newwidth); |
314 | 6399 } |
6400 | |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
6401 FRAME_LINES (f) = newheight; |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
6402 SET_FRAME_COLS (f, newwidth); |
25012 | 6403 |
6404 { | |
6405 struct window *w = XWINDOW (FRAME_SELECTED_WINDOW (f)); | |
6406 int text_area_x, text_area_y, text_area_width, text_area_height; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
6407 |
25012 | 6408 window_box (w, TEXT_AREA, &text_area_x, &text_area_y, &text_area_width, |
6409 &text_area_height); | |
6410 if (w->cursor.x >= text_area_x + text_area_width) | |
6411 w->cursor.hpos = w->cursor.x = 0; | |
6412 if (w->cursor.y >= text_area_y + text_area_height) | |
6413 w->cursor.vpos = w->cursor.y = 0; | |
6414 } | |
6415 | |
6416 adjust_glyphs (f); | |
40512
d256f6fc9c05
(change_frame_size_1): Set frame's resized_p.
Gerd Moellmann <gerd@gnu.org>
parents:
40334
diff
changeset
|
6417 calculate_costs (f); |
25012 | 6418 SET_FRAME_GARBAGED (f); |
40512
d256f6fc9c05
(change_frame_size_1): Set frame's resized_p.
Gerd Moellmann <gerd@gnu.org>
parents:
40334
diff
changeset
|
6419 f->resized_p = 1; |
15065 | 6420 |
6421 UNBLOCK_INPUT; | |
17282
5023bea28298
(change_frame_size_1): Call Fset_window_buffer,
Richard M. Stallman <rms@gnu.org>
parents:
17015
diff
changeset
|
6422 |
19627
c6343f7a9c6c
(change_frame_size_1): Save current buffer
Richard M. Stallman <rms@gnu.org>
parents:
19063
diff
changeset
|
6423 record_unwind_protect (Fset_buffer, Fcurrent_buffer ()); |
c6343f7a9c6c
(change_frame_size_1): Save current buffer
Richard M. Stallman <rms@gnu.org>
parents:
19063
diff
changeset
|
6424 |
88050
449ffc76e463
* window.c (run_window_configuration_change_hook): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87649
diff
changeset
|
6425 run_window_configuration_change_hook (f); |
19627
c6343f7a9c6c
(change_frame_size_1): Save current buffer
Richard M. Stallman <rms@gnu.org>
parents:
19063
diff
changeset
|
6426 |
c6343f7a9c6c
(change_frame_size_1): Save current buffer
Richard M. Stallman <rms@gnu.org>
parents:
19063
diff
changeset
|
6427 unbind_to (count, Qnil); |
314 | 6428 } |
25012 | 6429 |
6430 | |
314 | 6431 |
25012 | 6432 /*********************************************************************** |
6433 Terminal Related Lisp Functions | |
6434 ***********************************************************************/ | |
6435 | |
6436 DEFUN ("open-termscript", Fopen_termscript, Sopen_termscript, | |
39914
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6437 1, 1, "FOpen termscript file: ", |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6438 doc: /* Start writing all terminal output to FILE as well as the terminal. |
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6439 FILE = nil means just close any termscript file currently open. */) |
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6440 (file) |
25012 | 6441 Lisp_Object file; |
6442 { | |
83065
a871be7b26a5
Implemented suspending of emacsclient frames.
Karoly Lorentey <lorentey@elte.hu>
parents:
83037
diff
changeset
|
6443 struct tty_display_info *tty; |
a871be7b26a5
Implemented suspending of emacsclient frames.
Karoly Lorentey <lorentey@elte.hu>
parents:
83037
diff
changeset
|
6444 |
98508
c370f470d5ba
(update_frame): Flush termscript for MSDOS frames as well as for TTY.
Eli Zaretskii <eliz@gnu.org>
parents:
98497
diff
changeset
|
6445 if (! FRAME_TERMCAP_P (SELECTED_FRAME ()) |
c370f470d5ba
(update_frame): Flush termscript for MSDOS frames as well as for TTY.
Eli Zaretskii <eliz@gnu.org>
parents:
98497
diff
changeset
|
6446 && ! FRAME_MSDOS_P (SELECTED_FRAME ())) |
83065
a871be7b26a5
Implemented suspending of emacsclient frames.
Karoly Lorentey <lorentey@elte.hu>
parents:
83037
diff
changeset
|
6447 error ("Current frame is not on a tty device"); |
a871be7b26a5
Implemented suspending of emacsclient frames.
Karoly Lorentey <lorentey@elte.hu>
parents:
83037
diff
changeset
|
6448 |
a871be7b26a5
Implemented suspending of emacsclient frames.
Karoly Lorentey <lorentey@elte.hu>
parents:
83037
diff
changeset
|
6449 tty = CURTTY (); |
a871be7b26a5
Implemented suspending of emacsclient frames.
Karoly Lorentey <lorentey@elte.hu>
parents:
83037
diff
changeset
|
6450 |
a871be7b26a5
Implemented suspending of emacsclient frames.
Karoly Lorentey <lorentey@elte.hu>
parents:
83037
diff
changeset
|
6451 if (tty->termscript != 0) |
83560 | 6452 { |
6453 BLOCK_INPUT; | |
83065
a871be7b26a5
Implemented suspending of emacsclient frames.
Karoly Lorentey <lorentey@elte.hu>
parents:
83037
diff
changeset
|
6454 fclose (tty->termscript); |
83560 | 6455 UNBLOCK_INPUT; |
6456 } | |
83065
a871be7b26a5
Implemented suspending of emacsclient frames.
Karoly Lorentey <lorentey@elte.hu>
parents:
83037
diff
changeset
|
6457 tty->termscript = 0; |
25012 | 6458 |
6459 if (! NILP (file)) | |
6460 { | |
6461 file = Fexpand_file_name (file, Qnil); | |
83065
a871be7b26a5
Implemented suspending of emacsclient frames.
Karoly Lorentey <lorentey@elte.hu>
parents:
83037
diff
changeset
|
6462 tty->termscript = fopen (SDATA (file), "w"); |
a871be7b26a5
Implemented suspending of emacsclient frames.
Karoly Lorentey <lorentey@elte.hu>
parents:
83037
diff
changeset
|
6463 if (tty->termscript == 0) |
25012 | 6464 report_file_error ("Opening termscript", Fcons (file, Qnil)); |
6465 } | |
6466 return Qnil; | |
6467 } | |
6468 | |
6469 | |
314 | 6470 DEFUN ("send-string-to-terminal", Fsend_string_to_terminal, |
83370
5272862a4865
Fix crashes in xdialog_show (and other places) with xterm-mouse-mode.
Karoly Lorentey <lorentey@elte.hu>
parents:
83362
diff
changeset
|
6471 Ssend_string_to_terminal, 1, 2, 0, |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6472 doc: /* Send STRING to the terminal without alteration. |
83370
5272862a4865
Fix crashes in xdialog_show (and other places) with xterm-mouse-mode.
Karoly Lorentey <lorentey@elte.hu>
parents:
83362
diff
changeset
|
6473 Control characters in STRING will have terminal-dependent effects. |
5272862a4865
Fix crashes in xdialog_show (and other places) with xterm-mouse-mode.
Karoly Lorentey <lorentey@elte.hu>
parents:
83362
diff
changeset
|
6474 |
83431
76396de7f50a
Rename `struct device' to `struct terminal'. Rename some terminal-related functions similarly.
Karoly Lorentey <lorentey@elte.hu>
parents:
83413
diff
changeset
|
6475 Optional parameter TERMINAL specifies the tty terminal device to use. |
104957
81757111b576
(Fsend_string_to_terminal): Amend doc string to cover batch mode.
Alan Mackenzie <acm@muc.de>
parents:
104816
diff
changeset
|
6476 It may be a terminal object, a frame, or nil for the terminal used by |
81757111b576
(Fsend_string_to_terminal): Amend doc string to cover batch mode.
Alan Mackenzie <acm@muc.de>
parents:
104816
diff
changeset
|
6477 the currently selected frame. In batch mode, STRING is sent to stdout |
81757111b576
(Fsend_string_to_terminal): Amend doc string to cover batch mode.
Alan Mackenzie <acm@muc.de>
parents:
104816
diff
changeset
|
6478 when TERMINAL is nil. */) |
83431
76396de7f50a
Rename `struct device' to `struct terminal'. Rename some terminal-related functions similarly.
Karoly Lorentey <lorentey@elte.hu>
parents:
83413
diff
changeset
|
6479 (string, terminal) |
14068
a3c83dde295e
(Fsend_string_to_terminal, Fsit_for): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13526
diff
changeset
|
6480 Lisp_Object string; |
83431
76396de7f50a
Rename `struct device' to `struct terminal'. Rename some terminal-related functions similarly.
Karoly Lorentey <lorentey@elte.hu>
parents:
83413
diff
changeset
|
6481 Lisp_Object terminal; |
314 | 6482 { |
104816
4129eea9d003
(Fsend_string_to_terminal): Make it work again on the initial terminal as well.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104077
diff
changeset
|
6483 struct terminal *t = get_terminal (terminal, 1); |
4129eea9d003
(Fsend_string_to_terminal): Make it work again on the initial terminal as well.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104077
diff
changeset
|
6484 FILE *out; |
83065
a871be7b26a5
Implemented suspending of emacsclient frames.
Karoly Lorentey <lorentey@elte.hu>
parents:
83037
diff
changeset
|
6485 |
20618
d5acac3af6e3
(Fsend_string_to_terminal): Use size_byte.
Richard M. Stallman <rms@gnu.org>
parents:
19627
diff
changeset
|
6486 /* ??? Perhaps we should do something special for multibyte strings here. */ |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40512
diff
changeset
|
6487 CHECK_STRING (string); |
76621
685fa6c9ae44
(Fopen_termscript): Add BLOCK_INPUT around fclose.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
76069
diff
changeset
|
6488 BLOCK_INPUT; |
83065
a871be7b26a5
Implemented suspending of emacsclient frames.
Karoly Lorentey <lorentey@elte.hu>
parents:
83037
diff
changeset
|
6489 |
83431
76396de7f50a
Rename `struct device' to `struct terminal'. Rename some terminal-related functions similarly.
Karoly Lorentey <lorentey@elte.hu>
parents:
83413
diff
changeset
|
6490 if (!t) |
76396de7f50a
Rename `struct device' to `struct terminal'. Rename some terminal-related functions similarly.
Karoly Lorentey <lorentey@elte.hu>
parents:
83413
diff
changeset
|
6491 error ("Unknown terminal device"); |
76396de7f50a
Rename `struct device' to `struct terminal'. Rename some terminal-related functions similarly.
Karoly Lorentey <lorentey@elte.hu>
parents:
83413
diff
changeset
|
6492 |
104816
4129eea9d003
(Fsend_string_to_terminal): Make it work again on the initial terminal as well.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104077
diff
changeset
|
6493 if (t->type == output_initial) |
4129eea9d003
(Fsend_string_to_terminal): Make it work again on the initial terminal as well.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104077
diff
changeset
|
6494 out = stdout; |
4129eea9d003
(Fsend_string_to_terminal): Make it work again on the initial terminal as well.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104077
diff
changeset
|
6495 else if (t->type != output_termcap && t->type != output_msdos_raw) |
4129eea9d003
(Fsend_string_to_terminal): Make it work again on the initial terminal as well.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104077
diff
changeset
|
6496 error ("Device %d is not a termcap terminal device", t->id); |
4129eea9d003
(Fsend_string_to_terminal): Make it work again on the initial terminal as well.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104077
diff
changeset
|
6497 else |
4129eea9d003
(Fsend_string_to_terminal): Make it work again on the initial terminal as well.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104077
diff
changeset
|
6498 { |
4129eea9d003
(Fsend_string_to_terminal): Make it work again on the initial terminal as well.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104077
diff
changeset
|
6499 struct tty_display_info *tty = t->display_info.tty; |
4129eea9d003
(Fsend_string_to_terminal): Make it work again on the initial terminal as well.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104077
diff
changeset
|
6500 |
4129eea9d003
(Fsend_string_to_terminal): Make it work again on the initial terminal as well.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104077
diff
changeset
|
6501 if (! tty->output) |
4129eea9d003
(Fsend_string_to_terminal): Make it work again on the initial terminal as well.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104077
diff
changeset
|
6502 error ("Terminal is currently suspended"); |
4129eea9d003
(Fsend_string_to_terminal): Make it work again on the initial terminal as well.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104077
diff
changeset
|
6503 |
4129eea9d003
(Fsend_string_to_terminal): Make it work again on the initial terminal as well.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104077
diff
changeset
|
6504 if (tty->termscript) |
4129eea9d003
(Fsend_string_to_terminal): Make it work again on the initial terminal as well.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104077
diff
changeset
|
6505 { |
4129eea9d003
(Fsend_string_to_terminal): Make it work again on the initial terminal as well.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104077
diff
changeset
|
6506 fwrite (SDATA (string), 1, SBYTES (string), tty->termscript); |
4129eea9d003
(Fsend_string_to_terminal): Make it work again on the initial terminal as well.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104077
diff
changeset
|
6507 fflush (tty->termscript); |
4129eea9d003
(Fsend_string_to_terminal): Make it work again on the initial terminal as well.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104077
diff
changeset
|
6508 } |
4129eea9d003
(Fsend_string_to_terminal): Make it work again on the initial terminal as well.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104077
diff
changeset
|
6509 out = tty->output; |
4129eea9d003
(Fsend_string_to_terminal): Make it work again on the initial terminal as well.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104077
diff
changeset
|
6510 } |
4129eea9d003
(Fsend_string_to_terminal): Make it work again on the initial terminal as well.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104077
diff
changeset
|
6511 fwrite (SDATA (string), 1, SBYTES (string), out); |
4129eea9d003
(Fsend_string_to_terminal): Make it work again on the initial terminal as well.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104077
diff
changeset
|
6512 fflush (out); |
76621
685fa6c9ae44
(Fopen_termscript): Add BLOCK_INPUT around fclose.
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
76069
diff
changeset
|
6513 UNBLOCK_INPUT; |
314 | 6514 return Qnil; |
6515 } | |
6516 | |
25012 | 6517 |
314 | 6518 DEFUN ("ding", Fding, Sding, 0, 1, 0, |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6519 doc: /* Beep, or flash the screen. |
39914
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6520 Also, unless an argument is given, |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6521 terminate any keyboard macro currently executing. */) |
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6522 (arg) |
314 | 6523 Lisp_Object arg; |
6524 { | |
493 | 6525 if (!NILP (arg)) |
314 | 6526 { |
649
61deba7b73b6
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
587
diff
changeset
|
6527 if (noninteractive) |
61deba7b73b6
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
587
diff
changeset
|
6528 putchar (07); |
61deba7b73b6
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
587
diff
changeset
|
6529 else |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83098
diff
changeset
|
6530 ring_bell (XFRAME (selected_frame)); |
314 | 6531 } |
6532 else | |
6533 bitch_at_user (); | |
6534 | |
6535 return Qnil; | |
6536 } | |
6537 | |
21514 | 6538 void |
314 | 6539 bitch_at_user () |
6540 { | |
6541 if (noninteractive) | |
6542 putchar (07); | |
25012 | 6543 else if (!INTERACTIVE) /* Stop executing a keyboard macro. */ |
314 | 6544 error ("Keyboard macro terminated by a command ringing the bell"); |
6545 else | |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83098
diff
changeset
|
6546 ring_bell (XFRAME (selected_frame)); |
314 | 6547 } |
6548 | |
25012 | 6549 |
6550 | |
6551 /*********************************************************************** | |
6552 Sleeping, Waiting | |
6553 ***********************************************************************/ | |
6554 | |
314 | 6555 DEFUN ("sleep-for", Fsleep_for, Ssleep_for, 1, 2, 0, |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6556 doc: /* Pause, without updating display, for SECONDS seconds. |
39914
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6557 SECONDS may be a floating-point value, meaning that you can wait for a |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6558 fraction of a second. Optional second arg MILLISECONDS specifies an |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6559 additional wait period, in milliseconds; this may be useful if your |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6560 Emacs was built without floating point support. |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6561 \(Not all operating systems support waiting for a fraction of a second.) */) |
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6562 (seconds, milliseconds) |
2291
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6563 Lisp_Object seconds, milliseconds; |
314 | 6564 { |
2291
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6565 int sec, usec; |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6566 |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6567 if (NILP (milliseconds)) |
9264
9338a124ea84
(redraw_frame, Fsleep_for, sit_for, Fsit_for): Use new accessor macros instead
Karl Heuer <kwzh@gnu.org>
parents:
8903
diff
changeset
|
6568 XSETINT (milliseconds, 0); |
2291
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6569 else |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40512
diff
changeset
|
6570 CHECK_NUMBER (milliseconds); |
2648 | 6571 usec = XINT (milliseconds) * 1000; |
6572 | |
6573 { | |
6574 double duration = extract_float (seconds); | |
6575 sec = (int) duration; | |
6576 usec += (duration - sec) * 1000000; | |
6577 } | |
314 | 6578 |
2291
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6579 #ifndef EMACS_HAS_USECS |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6580 if (sec == 0 && usec != 0) |
63695
98563021d2e3
(Fsleep_for, Fsit_for): Follow error conventions.
Juanma Barranquero <lekktu@gmail.com>
parents:
63649
diff
changeset
|
6581 error ("Millisecond `sleep-for' not supported on %s", SYSTEM_TYPE); |
2291
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6582 #endif |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6583 |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6584 /* Assure that 0 <= usec < 1000000. */ |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6585 if (usec < 0) |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6586 { |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
6587 /* We can't rely on the rounding being correct if usec is negative. */ |
2291
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6588 if (-1000000 < usec) |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6589 sec--, usec += 1000000; |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6590 else |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6591 sec -= -usec / 1000000, usec = 1000000 - (-usec % 1000000); |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6592 } |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6593 else |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6594 sec += usec / 1000000, usec %= 1000000; |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6595 |
14646
68fe10d1abd0
(Fsleep_for): Accept sub-second intervals.
Erik Naggum <erik@naggum.no>
parents:
14459
diff
changeset
|
6596 if (sec < 0 || (sec == 0 && usec == 0)) |
314 | 6597 return Qnil; |
6598 | |
56727
6b028bf60b4e
(Fsleep_for): Remove obsolete code.
Kim F. Storm <storm@cua.dk>
parents:
56717
diff
changeset
|
6599 wait_reading_process_output (sec, usec, 0, 0, Qnil, NULL, 0); |
314 | 6600 |
6601 return Qnil; | |
6602 } | |
6603 | |
25012 | 6604 |
56727
6b028bf60b4e
(Fsleep_for): Remove obsolete code.
Kim F. Storm <storm@cua.dk>
parents:
56717
diff
changeset
|
6605 /* This is just like wait_reading_process_output, except that |
71794
d76f16a63bf2
(sit_for): Reduce number of args from 5 to 3.
Kim F. Storm <storm@cua.dk>
parents:
71773
diff
changeset
|
6606 it does redisplay. |
d76f16a63bf2
(sit_for): Reduce number of args from 5 to 3.
Kim F. Storm <storm@cua.dk>
parents:
71773
diff
changeset
|
6607 |
73318
e876a1f62fec
* dispnew.c (sit_for): Sit forever if TIMEOUT is t.
Chong Yidong <cyd@stupidchicken.com>
parents:
72949
diff
changeset
|
6608 TIMEOUT is number of seconds to wait (float or integer), |
e876a1f62fec
* dispnew.c (sit_for): Sit forever if TIMEOUT is t.
Chong Yidong <cyd@stupidchicken.com>
parents:
72949
diff
changeset
|
6609 or t to wait forever. |
71794
d76f16a63bf2
(sit_for): Reduce number of args from 5 to 3.
Kim F. Storm <storm@cua.dk>
parents:
71773
diff
changeset
|
6610 READING is 1 if reading input. |
d76f16a63bf2
(sit_for): Reduce number of args from 5 to 3.
Kim F. Storm <storm@cua.dk>
parents:
71773
diff
changeset
|
6611 If DO_DISPLAY is >0 display process output while waiting. |
d76f16a63bf2
(sit_for): Reduce number of args from 5 to 3.
Kim F. Storm <storm@cua.dk>
parents:
71773
diff
changeset
|
6612 If DO_DISPLAY is >1 perform an initial redisplay before waiting. |
d76f16a63bf2
(sit_for): Reduce number of args from 5 to 3.
Kim F. Storm <storm@cua.dk>
parents:
71773
diff
changeset
|
6613 */ |
650 | 6614 |
6615 Lisp_Object | |
71794
d76f16a63bf2
(sit_for): Reduce number of args from 5 to 3.
Kim F. Storm <storm@cua.dk>
parents:
71773
diff
changeset
|
6616 sit_for (timeout, reading, do_display) |
d76f16a63bf2
(sit_for): Reduce number of args from 5 to 3.
Kim F. Storm <storm@cua.dk>
parents:
71773
diff
changeset
|
6617 Lisp_Object timeout; |
d76f16a63bf2
(sit_for): Reduce number of args from 5 to 3.
Kim F. Storm <storm@cua.dk>
parents:
71773
diff
changeset
|
6618 int reading, do_display; |
314 | 6619 { |
71794
d76f16a63bf2
(sit_for): Reduce number of args from 5 to 3.
Kim F. Storm <storm@cua.dk>
parents:
71773
diff
changeset
|
6620 int sec, usec; |
d76f16a63bf2
(sit_for): Reduce number of args from 5 to 3.
Kim F. Storm <storm@cua.dk>
parents:
71773
diff
changeset
|
6621 |
d76f16a63bf2
(sit_for): Reduce number of args from 5 to 3.
Kim F. Storm <storm@cua.dk>
parents:
71773
diff
changeset
|
6622 swallow_events (do_display); |
d76f16a63bf2
(sit_for): Reduce number of args from 5 to 3.
Kim F. Storm <storm@cua.dk>
parents:
71773
diff
changeset
|
6623 |
d76f16a63bf2
(sit_for): Reduce number of args from 5 to 3.
Kim F. Storm <storm@cua.dk>
parents:
71773
diff
changeset
|
6624 if ((detect_input_pending_run_timers (do_display)) |
71138
5cf77229c85d
(sit_for): Perform redisplay even if input is pending
Kim F. Storm <storm@cua.dk>
parents:
70300
diff
changeset
|
6625 || !NILP (Vexecuting_kbd_macro)) |
314 | 6626 return Qnil; |
650 | 6627 |
71794
d76f16a63bf2
(sit_for): Reduce number of args from 5 to 3.
Kim F. Storm <storm@cua.dk>
parents:
71773
diff
changeset
|
6628 if (do_display >= 2) |
d76f16a63bf2
(sit_for): Reduce number of args from 5 to 3.
Kim F. Storm <storm@cua.dk>
parents:
71773
diff
changeset
|
6629 redisplay_preserve_echo_area (2); |
d76f16a63bf2
(sit_for): Reduce number of args from 5 to 3.
Kim F. Storm <storm@cua.dk>
parents:
71773
diff
changeset
|
6630 |
71804
1a7b37f82a06
(sit_for): Signal error if TIMEOUT is not a number in case arg comes
Kim F. Storm <storm@cua.dk>
parents:
71794
diff
changeset
|
6631 if (INTEGERP (timeout)) |
71333
a8cbcce39bd0
(sit_for): Undo 2006-06-01 change. Instead, a
Kim F. Storm <storm@cua.dk>
parents:
71323
diff
changeset
|
6632 { |
71810 | 6633 sec = XINT (timeout); |
71804
1a7b37f82a06
(sit_for): Signal error if TIMEOUT is not a number in case arg comes
Kim F. Storm <storm@cua.dk>
parents:
71794
diff
changeset
|
6634 usec = 0; |
1a7b37f82a06
(sit_for): Signal error if TIMEOUT is not a number in case arg comes
Kim F. Storm <storm@cua.dk>
parents:
71794
diff
changeset
|
6635 } |
1a7b37f82a06
(sit_for): Signal error if TIMEOUT is not a number in case arg comes
Kim F. Storm <storm@cua.dk>
parents:
71794
diff
changeset
|
6636 else if (FLOATP (timeout)) |
1a7b37f82a06
(sit_for): Signal error if TIMEOUT is not a number in case arg comes
Kim F. Storm <storm@cua.dk>
parents:
71794
diff
changeset
|
6637 { |
71831
347f809d2edb
(sit_for): Tiny simplification.
Kim F. Storm <storm@cua.dk>
parents:
71810
diff
changeset
|
6638 double seconds = XFLOAT_DATA (timeout); |
71794
d76f16a63bf2
(sit_for): Reduce number of args from 5 to 3.
Kim F. Storm <storm@cua.dk>
parents:
71773
diff
changeset
|
6639 sec = (int) seconds; |
d76f16a63bf2
(sit_for): Reduce number of args from 5 to 3.
Kim F. Storm <storm@cua.dk>
parents:
71773
diff
changeset
|
6640 usec = (int) ((seconds - sec) * 1000000); |
d76f16a63bf2
(sit_for): Reduce number of args from 5 to 3.
Kim F. Storm <storm@cua.dk>
parents:
71773
diff
changeset
|
6641 } |
73318
e876a1f62fec
* dispnew.c (sit_for): Sit forever if TIMEOUT is t.
Chong Yidong <cyd@stupidchicken.com>
parents:
72949
diff
changeset
|
6642 else if (EQ (timeout, Qt)) |
e876a1f62fec
* dispnew.c (sit_for): Sit forever if TIMEOUT is t.
Chong Yidong <cyd@stupidchicken.com>
parents:
72949
diff
changeset
|
6643 { |
e876a1f62fec
* dispnew.c (sit_for): Sit forever if TIMEOUT is t.
Chong Yidong <cyd@stupidchicken.com>
parents:
72949
diff
changeset
|
6644 sec = 0; |
e876a1f62fec
* dispnew.c (sit_for): Sit forever if TIMEOUT is t.
Chong Yidong <cyd@stupidchicken.com>
parents:
72949
diff
changeset
|
6645 usec = 0; |
e876a1f62fec
* dispnew.c (sit_for): Sit forever if TIMEOUT is t.
Chong Yidong <cyd@stupidchicken.com>
parents:
72949
diff
changeset
|
6646 } |
71794
d76f16a63bf2
(sit_for): Reduce number of args from 5 to 3.
Kim F. Storm <storm@cua.dk>
parents:
71773
diff
changeset
|
6647 else |
71804
1a7b37f82a06
(sit_for): Signal error if TIMEOUT is not a number in case arg comes
Kim F. Storm <storm@cua.dk>
parents:
71794
diff
changeset
|
6648 wrong_type_argument (Qnumberp, timeout); |
314 | 6649 |
73318
e876a1f62fec
* dispnew.c (sit_for): Sit forever if TIMEOUT is t.
Chong Yidong <cyd@stupidchicken.com>
parents:
72949
diff
changeset
|
6650 if (sec == 0 && usec == 0 && !EQ (timeout, Qt)) |
673 | 6651 return Qt; |
6652 | |
314 | 6653 #ifdef SIGIO |
1915
98ecf99d7b1a
* dispnew.c (sit_for): Pass the correct number of arguments to
Jim Blandy <jimb@redhat.com>
parents:
1872
diff
changeset
|
6654 gobble_input (0); |
650 | 6655 #endif |
6656 | |
71794
d76f16a63bf2
(sit_for): Reduce number of args from 5 to 3.
Kim F. Storm <storm@cua.dk>
parents:
71773
diff
changeset
|
6657 wait_reading_process_output (sec, usec, reading ? -1 : 1, do_display, |
56727
6b028bf60b4e
(Fsleep_for): Remove obsolete code.
Kim F. Storm <storm@cua.dk>
parents:
56717
diff
changeset
|
6658 Qnil, NULL, 0); |
650 | 6659 |
314 | 6660 return detect_input_pending () ? Qnil : Qt; |
6661 } | |
6662 | |
25012 | 6663 |
71771
c6e0c9217129
(Fredisplay): Add FORCE argument to force redisplay when
Kim F. Storm <storm@cua.dk>
parents:
71761
diff
changeset
|
6664 DEFUN ("redisplay", Fredisplay, Sredisplay, 0, 1, 0, |
c6e0c9217129
(Fredisplay): Add FORCE argument to force redisplay when
Kim F. Storm <storm@cua.dk>
parents:
71761
diff
changeset
|
6665 doc: /* Perform redisplay if no input is available. |
71773 | 6666 If optional arg FORCE is non-nil or `redisplay-dont-pause' is non-nil, |
72788
102f29870373
(Fredisplay): Document return value.
Kim F. Storm <storm@cua.dk>
parents:
71946
diff
changeset
|
6667 perform a full redisplay even if input is available. |
102f29870373
(Fredisplay): Document return value.
Kim F. Storm <storm@cua.dk>
parents:
71946
diff
changeset
|
6668 Return t if redisplay was performed, nil otherwise. */) |
71771
c6e0c9217129
(Fredisplay): Add FORCE argument to force redisplay when
Kim F. Storm <storm@cua.dk>
parents:
71761
diff
changeset
|
6669 (force) |
c6e0c9217129
(Fredisplay): Add FORCE argument to force redisplay when
Kim F. Storm <storm@cua.dk>
parents:
71761
diff
changeset
|
6670 Lisp_Object force; |
650 | 6671 { |
71771
c6e0c9217129
(Fredisplay): Add FORCE argument to force redisplay when
Kim F. Storm <storm@cua.dk>
parents:
71761
diff
changeset
|
6672 int count; |
c6e0c9217129
(Fredisplay): Add FORCE argument to force redisplay when
Kim F. Storm <storm@cua.dk>
parents:
71761
diff
changeset
|
6673 |
71794
d76f16a63bf2
(sit_for): Reduce number of args from 5 to 3.
Kim F. Storm <storm@cua.dk>
parents:
71773
diff
changeset
|
6674 swallow_events (1); |
d76f16a63bf2
(sit_for): Reduce number of args from 5 to 3.
Kim F. Storm <storm@cua.dk>
parents:
71773
diff
changeset
|
6675 if ((detect_input_pending_run_timers (1) |
71771
c6e0c9217129
(Fredisplay): Add FORCE argument to force redisplay when
Kim F. Storm <storm@cua.dk>
parents:
71761
diff
changeset
|
6676 && NILP (force) && !redisplay_dont_pause) |
71761
1055c0769159
* puresize.h (BASE_PURESIZE): Increment to 1211000.
Chong Yidong <cyd@stupidchicken.com>
parents:
71573
diff
changeset
|
6677 || !NILP (Vexecuting_kbd_macro)) |
1055c0769159
* puresize.h (BASE_PURESIZE): Increment to 1211000.
Chong Yidong <cyd@stupidchicken.com>
parents:
71573
diff
changeset
|
6678 return Qnil; |
1055c0769159
* puresize.h (BASE_PURESIZE): Increment to 1211000.
Chong Yidong <cyd@stupidchicken.com>
parents:
71573
diff
changeset
|
6679 |
71771
c6e0c9217129
(Fredisplay): Add FORCE argument to force redisplay when
Kim F. Storm <storm@cua.dk>
parents:
71761
diff
changeset
|
6680 count = SPECPDL_INDEX (); |
c6e0c9217129
(Fredisplay): Add FORCE argument to force redisplay when
Kim F. Storm <storm@cua.dk>
parents:
71761
diff
changeset
|
6681 if (!NILP (force) && !redisplay_dont_pause) |
c6e0c9217129
(Fredisplay): Add FORCE argument to force redisplay when
Kim F. Storm <storm@cua.dk>
parents:
71761
diff
changeset
|
6682 specbind (Qredisplay_dont_pause, Qt); |
71761
1055c0769159
* puresize.h (BASE_PURESIZE): Increment to 1211000.
Chong Yidong <cyd@stupidchicken.com>
parents:
71573
diff
changeset
|
6683 redisplay_preserve_echo_area (2); |
71771
c6e0c9217129
(Fredisplay): Add FORCE argument to force redisplay when
Kim F. Storm <storm@cua.dk>
parents:
71761
diff
changeset
|
6684 unbind_to (count, Qnil); |
71761
1055c0769159
* puresize.h (BASE_PURESIZE): Increment to 1211000.
Chong Yidong <cyd@stupidchicken.com>
parents:
71573
diff
changeset
|
6685 return Qt; |
650 | 6686 } |
25012 | 6687 |
6688 | |
314 | 6689 |
25012 | 6690 /*********************************************************************** |
6691 Other Lisp Functions | |
6692 ***********************************************************************/ | |
6693 | |
6694 /* A vector of size >= 2 * NFRAMES + 3 * NBUFFERS + 1, containing the | |
6695 session's frames, frame names, buffers, buffer-read-only flags, and | |
64776
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6696 buffer-modified-flags. */ |
25012 | 6697 |
6698 static Lisp_Object frame_and_buffer_state; | |
6699 | |
6700 | |
6701 DEFUN ("frame-or-buffer-changed-p", Fframe_or_buffer_changed_p, | |
64776
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6702 Sframe_or_buffer_changed_p, 0, 1, 0, |
40979 | 6703 doc: /* Return non-nil if the frame and buffer state appears to have changed. |
64776
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6704 VARIABLE is a variable name whose value is either nil or a state vector |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6705 that will be updated to contain all frames and buffers, |
39914
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6706 aside from buffers whose names start with space, |
64776
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6707 along with the buffers' read-only and modified flags. This allows a fast |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6708 check to see whether buffer menus might need to be recomputed. |
39914
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6709 If this function returns non-nil, it updates the internal vector to reflect |
64776
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6710 the current state. |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6711 |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6712 If VARIABLE is nil, an internal variable is used. Users should not |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6713 pass nil for VARIABLE. */) |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6714 (variable) |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6715 Lisp_Object variable; |
25012 | 6716 { |
64776
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6717 Lisp_Object state, tail, frame, buf; |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6718 Lisp_Object *vecp, *end; |
25012 | 6719 int n; |
6720 | |
64776
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6721 if (! NILP (variable)) |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6722 { |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6723 CHECK_SYMBOL (variable); |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6724 state = Fsymbol_value (variable); |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6725 if (! VECTORP (state)) |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6726 goto changed; |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6727 } |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6728 else |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6729 state = frame_and_buffer_state; |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6730 |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6731 vecp = XVECTOR (state)->contents; |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6732 end = vecp + XVECTOR (state)->size; |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6733 |
25012 | 6734 FOR_EACH_FRAME (tail, frame) |
6735 { | |
64776
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6736 if (vecp == end) |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6737 goto changed; |
25012 | 6738 if (!EQ (*vecp++, frame)) |
6739 goto changed; | |
64776
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6740 if (vecp == end) |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6741 goto changed; |
25012 | 6742 if (!EQ (*vecp++, XFRAME (frame)->name)) |
6743 goto changed; | |
6744 } | |
64776
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6745 /* Check that the buffer info matches. */ |
26164
d39ec0a27081
more XCAR/XCDR/XFLOAT_DATA uses, to help isolete lisp engine
Ken Raeburn <raeburn@raeburn.org>
parents:
26088
diff
changeset
|
6746 for (tail = Vbuffer_alist; CONSP (tail); tail = XCDR (tail)) |
25012 | 6747 { |
26164
d39ec0a27081
more XCAR/XCDR/XFLOAT_DATA uses, to help isolete lisp engine
Ken Raeburn <raeburn@raeburn.org>
parents:
26088
diff
changeset
|
6748 buf = XCDR (XCAR (tail)); |
25012 | 6749 /* Ignore buffers that aren't included in buffer lists. */ |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
6750 if (SREF (XBUFFER (buf)->name, 0) == ' ') |
25012 | 6751 continue; |
64776
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6752 if (vecp == end) |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6753 goto changed; |
25012 | 6754 if (!EQ (*vecp++, buf)) |
6755 goto changed; | |
64776
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6756 if (vecp == end) |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6757 goto changed; |
25012 | 6758 if (!EQ (*vecp++, XBUFFER (buf)->read_only)) |
6759 goto changed; | |
64776
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6760 if (vecp == end) |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6761 goto changed; |
25012 | 6762 if (!EQ (*vecp++, Fbuffer_modified_p (buf))) |
6763 goto changed; | |
6764 } | |
64776
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6765 if (vecp == end) |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6766 goto changed; |
25012 | 6767 /* Detect deletion of a buffer at the end of the list. */ |
6768 if (EQ (*vecp, Qlambda)) | |
6769 return Qnil; | |
64776
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6770 |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6771 /* Come here if we decide the data has changed. */ |
25012 | 6772 changed: |
64776
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6773 /* Count the size we will need. |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6774 Start with 1 so there is room for at least one lambda at the end. */ |
25012 | 6775 n = 1; |
6776 FOR_EACH_FRAME (tail, frame) | |
6777 n += 2; | |
26164
d39ec0a27081
more XCAR/XCDR/XFLOAT_DATA uses, to help isolete lisp engine
Ken Raeburn <raeburn@raeburn.org>
parents:
26088
diff
changeset
|
6778 for (tail = Vbuffer_alist; CONSP (tail); tail = XCDR (tail)) |
25012 | 6779 n += 3; |
64776
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6780 /* Reallocate the vector if data has grown to need it, |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6781 or if it has shrunk a lot. */ |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6782 if (! VECTORP (state) |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6783 || n > XVECTOR (state)->size |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6784 || n + 20 < XVECTOR (state)->size / 2) |
25012 | 6785 /* Add 20 extra so we grow it less often. */ |
64776
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6786 { |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6787 state = Fmake_vector (make_number (n + 20), Qlambda); |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6788 if (! NILP (variable)) |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6789 Fset (variable, state); |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6790 else |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6791 frame_and_buffer_state = state; |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6792 } |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6793 |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6794 /* Record the new data in the (possibly reallocated) vector. */ |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6795 vecp = XVECTOR (state)->contents; |
25012 | 6796 FOR_EACH_FRAME (tail, frame) |
6797 { | |
6798 *vecp++ = frame; | |
6799 *vecp++ = XFRAME (frame)->name; | |
6800 } | |
26164
d39ec0a27081
more XCAR/XCDR/XFLOAT_DATA uses, to help isolete lisp engine
Ken Raeburn <raeburn@raeburn.org>
parents:
26088
diff
changeset
|
6801 for (tail = Vbuffer_alist; CONSP (tail); tail = XCDR (tail)) |
25012 | 6802 { |
26164
d39ec0a27081
more XCAR/XCDR/XFLOAT_DATA uses, to help isolete lisp engine
Ken Raeburn <raeburn@raeburn.org>
parents:
26088
diff
changeset
|
6803 buf = XCDR (XCAR (tail)); |
25012 | 6804 /* Ignore buffers that aren't included in buffer lists. */ |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
6805 if (SREF (XBUFFER (buf)->name, 0) == ' ') |
25012 | 6806 continue; |
6807 *vecp++ = buf; | |
6808 *vecp++ = XBUFFER (buf)->read_only; | |
6809 *vecp++ = Fbuffer_modified_p (buf); | |
6810 } | |
6811 /* Fill up the vector with lambdas (always at least one). */ | |
6812 *vecp++ = Qlambda; | |
64776
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6813 while (vecp - XVECTOR (state)->contents |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6814 < XVECTOR (state)->size) |
25012 | 6815 *vecp++ = Qlambda; |
6816 /* Make sure we didn't overflow the vector. */ | |
64776
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6817 if (vecp - XVECTOR (state)->contents |
42f593faa113
(Fframe_or_buffer_changed_p): Take an arg
Richard M. Stallman <rms@gnu.org>
parents:
64770
diff
changeset
|
6818 > XVECTOR (state)->size) |
25012 | 6819 abort (); |
6820 return Qt; | |
6821 } | |
6822 | |
6823 | |
6824 | |
6825 /*********************************************************************** | |
6826 Initialization | |
6827 ***********************************************************************/ | |
6828 | |
6829 /* Initialization done when Emacs fork is started, before doing stty. | |
6830 Determine terminal type and set terminal_driver. Then invoke its | |
6831 decoding routine to set up variables in the terminal package. */ | |
314 | 6832 |
21514 | 6833 void |
314 | 6834 init_display () |
6835 { | |
53226
dd3018b4785b
Implemented multiple tty support.
Karoly Lorentey <lorentey@elte.hu>
parents:
53225
diff
changeset
|
6836 char *terminal_type; |
dd3018b4785b
Implemented multiple tty support.
Karoly Lorentey <lorentey@elte.hu>
parents:
53225
diff
changeset
|
6837 |
314 | 6838 #ifdef HAVE_X_WINDOWS |
6839 extern int display_arg; | |
6840 #endif | |
6841 | |
25012 | 6842 /* Construct the space glyph. */ |
6843 space_glyph.type = CHAR_GLYPH; | |
92276
1dc7b04a4d95
(line_draw_cost): Adapt to new glyph type.
Kim F. Storm <storm@cua.dk>
parents:
91367
diff
changeset
|
6844 SET_CHAR_GLYPH (space_glyph, ' ', DEFAULT_FACE_ID, 0); |
25012 | 6845 space_glyph.charpos = -1; |
6846 | |
314 | 6847 inverse_video = 0; |
6848 cursor_in_echo_area = 0; | |
6849 terminal_type = (char *) 0; | |
6850 | |
2339
a302de11debf
* dispnew.c (init_display): Initialize Vwindow_system.
Jim Blandy <jimb@redhat.com>
parents:
2292
diff
changeset
|
6851 /* Now is the time to initialize this; it's used by init_sys_modes |
a302de11debf
* dispnew.c (init_display): Initialize Vwindow_system.
Jim Blandy <jimb@redhat.com>
parents:
2292
diff
changeset
|
6852 during startup. */ |
83014
f5cadabb36dd
Support for opening X frames from a tty session.
Karoly Lorentey <lorentey@elte.hu>
parents:
83010
diff
changeset
|
6853 Vinitial_window_system = Qnil; |
314 | 6854 |
83146
3708519cf113
Make sure the SIGWINCH handler is always set (rep. by Yoshiaki Kasahara).
Karoly Lorentey <lorentey@elte.hu>
parents:
83112
diff
changeset
|
6855 /* SIGWINCH needs to be handled no matter what display we start |
3708519cf113
Make sure the SIGWINCH handler is always set (rep. by Yoshiaki Kasahara).
Karoly Lorentey <lorentey@elte.hu>
parents:
83112
diff
changeset
|
6856 with. Otherwise newly opened tty frames will not resize |
3708519cf113
Make sure the SIGWINCH handler is always set (rep. by Yoshiaki Kasahara).
Karoly Lorentey <lorentey@elte.hu>
parents:
83112
diff
changeset
|
6857 automatically. */ |
3708519cf113
Make sure the SIGWINCH handler is always set (rep. by Yoshiaki Kasahara).
Karoly Lorentey <lorentey@elte.hu>
parents:
83112
diff
changeset
|
6858 #ifdef SIGWINCH |
3708519cf113
Make sure the SIGWINCH handler is always set (rep. by Yoshiaki Kasahara).
Karoly Lorentey <lorentey@elte.hu>
parents:
83112
diff
changeset
|
6859 #ifndef CANNOT_DUMP |
3708519cf113
Make sure the SIGWINCH handler is always set (rep. by Yoshiaki Kasahara).
Karoly Lorentey <lorentey@elte.hu>
parents:
83112
diff
changeset
|
6860 if (initialized) |
3708519cf113
Make sure the SIGWINCH handler is always set (rep. by Yoshiaki Kasahara).
Karoly Lorentey <lorentey@elte.hu>
parents:
83112
diff
changeset
|
6861 #endif /* CANNOT_DUMP */ |
3708519cf113
Make sure the SIGWINCH handler is always set (rep. by Yoshiaki Kasahara).
Karoly Lorentey <lorentey@elte.hu>
parents:
83112
diff
changeset
|
6862 signal (SIGWINCH, window_change_signal); |
3708519cf113
Make sure the SIGWINCH handler is always set (rep. by Yoshiaki Kasahara).
Karoly Lorentey <lorentey@elte.hu>
parents:
83112
diff
changeset
|
6863 #endif /* SIGWINCH */ |
314 | 6864 |
98379
7424f5df0da7
(init_display): Return earlier when running as a
Dan Nicolaescu <dann@ics.uci.edu>
parents:
98327
diff
changeset
|
6865 /* If running as a daemon, no need to initialize any frames/terminal. */ |
99182
c1511154e8c2
* emacs.c (daemon_pipe): Make non-static.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
98589
diff
changeset
|
6866 if (IS_DAEMON) |
c1511154e8c2
* emacs.c (daemon_pipe): Make non-static.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
98589
diff
changeset
|
6867 return; |
98379
7424f5df0da7
(init_display): Return earlier when running as a
Dan Nicolaescu <dann@ics.uci.edu>
parents:
98327
diff
changeset
|
6868 |
2339
a302de11debf
* dispnew.c (init_display): Initialize Vwindow_system.
Jim Blandy <jimb@redhat.com>
parents:
2292
diff
changeset
|
6869 /* If the user wants to use a window system, we shouldn't bother |
a302de11debf
* dispnew.c (init_display): Initialize Vwindow_system.
Jim Blandy <jimb@redhat.com>
parents:
2292
diff
changeset
|
6870 initializing the terminal. This is especially important when the |
a302de11debf
* dispnew.c (init_display): Initialize Vwindow_system.
Jim Blandy <jimb@redhat.com>
parents:
2292
diff
changeset
|
6871 terminal is so dumb that emacs gives up before and doesn't bother |
a302de11debf
* dispnew.c (init_display): Initialize Vwindow_system.
Jim Blandy <jimb@redhat.com>
parents:
2292
diff
changeset
|
6872 using the window system. |
a302de11debf
* dispnew.c (init_display): Initialize Vwindow_system.
Jim Blandy <jimb@redhat.com>
parents:
2292
diff
changeset
|
6873 |
14125
2f222e8b06f5
(init_display): Treat null string DISPLAY var like not set.
Karl Heuer <kwzh@gnu.org>
parents:
14068
diff
changeset
|
6874 If the DISPLAY environment variable is set and nonempty, |
2f222e8b06f5
(init_display): Treat null string DISPLAY var like not set.
Karl Heuer <kwzh@gnu.org>
parents:
14068
diff
changeset
|
6875 try to use X, and die with an error message if that doesn't work. */ |
314 | 6876 |
6877 #ifdef HAVE_X_WINDOWS | |
69952
b9da898695a5
* dispnew.c (init_display): Don't init X display if the user asked
Jan Djärv <jan.h.d@swipnet.se>
parents:
69607
diff
changeset
|
6878 if (! inhibit_window_system && ! display_arg) |
2359
90a5f91329f3
* dispnew.c (init_display): Get display name from environment
Jim Blandy <jimb@redhat.com>
parents:
2339
diff
changeset
|
6879 { |
14125
2f222e8b06f5
(init_display): Treat null string DISPLAY var like not set.
Karl Heuer <kwzh@gnu.org>
parents:
14068
diff
changeset
|
6880 char *display; |
2f222e8b06f5
(init_display): Treat null string DISPLAY var like not set.
Karl Heuer <kwzh@gnu.org>
parents:
14068
diff
changeset
|
6881 display = getenv ("DISPLAY"); |
2f222e8b06f5
(init_display): Treat null string DISPLAY var like not set.
Karl Heuer <kwzh@gnu.org>
parents:
14068
diff
changeset
|
6882 display_arg = (display != 0 && *display != 0); |
69607
761eaec1aae4
* dispnew.c (init_display): Check DISPLAY here.
Andreas Schwab <schwab@suse.de>
parents:
69110
diff
changeset
|
6883 |
761eaec1aae4
* dispnew.c (init_display): Check DISPLAY here.
Andreas Schwab <schwab@suse.de>
parents:
69110
diff
changeset
|
6884 if (display_arg && !x_display_ok (display)) |
761eaec1aae4
* dispnew.c (init_display): Check DISPLAY here.
Andreas Schwab <schwab@suse.de>
parents:
69110
diff
changeset
|
6885 { |
761eaec1aae4
* dispnew.c (init_display): Check DISPLAY here.
Andreas Schwab <schwab@suse.de>
parents:
69110
diff
changeset
|
6886 fprintf (stderr, "Display %s unavailable, simulating -nw\n", |
761eaec1aae4
* dispnew.c (init_display): Check DISPLAY here.
Andreas Schwab <schwab@suse.de>
parents:
69110
diff
changeset
|
6887 display); |
761eaec1aae4
* dispnew.c (init_display): Check DISPLAY here.
Andreas Schwab <schwab@suse.de>
parents:
69110
diff
changeset
|
6888 inhibit_window_system = 1; |
761eaec1aae4
* dispnew.c (init_display): Check DISPLAY here.
Andreas Schwab <schwab@suse.de>
parents:
69110
diff
changeset
|
6889 } |
2364 | 6890 } |
2359
90a5f91329f3
* dispnew.c (init_display): Get display name from environment
Jim Blandy <jimb@redhat.com>
parents:
2339
diff
changeset
|
6891 |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
6892 if (!inhibit_window_system && display_arg |
18774
95b4ac950a5d
(init_display): Go ahead and prepare for
Richard M. Stallman <rms@gnu.org>
parents:
18015
diff
changeset
|
6893 #ifndef CANNOT_DUMP |
95b4ac950a5d
(init_display): Go ahead and prepare for
Richard M. Stallman <rms@gnu.org>
parents:
18015
diff
changeset
|
6894 && initialized |
95b4ac950a5d
(init_display): Go ahead and prepare for
Richard M. Stallman <rms@gnu.org>
parents:
18015
diff
changeset
|
6895 #endif |
95b4ac950a5d
(init_display): Go ahead and prepare for
Richard M. Stallman <rms@gnu.org>
parents:
18015
diff
changeset
|
6896 ) |
314 | 6897 { |
104077
3abca9a8122f
* dispnew.c (init_display): Use Qx, Qw32, and Qns.
Chong Yidong <cyd@stupidchicken.com>
parents:
103052
diff
changeset
|
6898 Vinitial_window_system = Qx; |
314 | 6899 #ifdef HAVE_X11 |
6900 Vwindow_system_version = make_number (11); | |
6901 #endif | |
41969
e669966d496e
Test GNU_LINUX, not LINUX.
Richard M. Stallman <rms@gnu.org>
parents:
41120
diff
changeset
|
6902 #if defined (GNU_LINUX) && defined (HAVE_LIBNCURSES) |
15273
db889dd732a1
(init_display) [HAVE_LIBNCURSES]: If X, call tgetent.
Karl Heuer <kwzh@gnu.org>
parents:
15078
diff
changeset
|
6903 /* In some versions of ncurses, |
15282 | 6904 tputs crashes if we have not called tgetent. |
15273
db889dd732a1
(init_display) [HAVE_LIBNCURSES]: If X, call tgetent.
Karl Heuer <kwzh@gnu.org>
parents:
15078
diff
changeset
|
6905 So call tgetent. */ |
db889dd732a1
(init_display) [HAVE_LIBNCURSES]: If X, call tgetent.
Karl Heuer <kwzh@gnu.org>
parents:
15078
diff
changeset
|
6906 { char b[2044]; tgetent (b, "xterm");} |
db889dd732a1
(init_display) [HAVE_LIBNCURSES]: If X, call tgetent.
Karl Heuer <kwzh@gnu.org>
parents:
15078
diff
changeset
|
6907 #endif |
25012 | 6908 adjust_frame_glyphs_initially (); |
314 | 6909 return; |
6910 } | |
6911 #endif /* HAVE_X_WINDOWS */ | |
6912 | |
13408
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
6913 #ifdef HAVE_NTGUI |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
6914 if (!inhibit_window_system) |
13408
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
6915 { |
104077
3abca9a8122f
* dispnew.c (init_display): Use Qx, Qw32, and Qns.
Chong Yidong <cyd@stupidchicken.com>
parents:
103052
diff
changeset
|
6916 Vinitial_window_system = Qw32; |
13408
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
6917 Vwindow_system_version = make_number (1); |
25012 | 6918 adjust_frame_glyphs_initially (); |
13408
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
6919 return; |
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
6920 } |
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
6921 #endif /* HAVE_NTGUI */ |
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
6922 |
96675
d45acf0c8d23
merging Emacs.app (NeXTstep port)
Adrian Robert <Adrian.B.Robert@gmail.com>
parents:
96236
diff
changeset
|
6923 #ifdef HAVE_NS |
d45acf0c8d23
merging Emacs.app (NeXTstep port)
Adrian Robert <Adrian.B.Robert@gmail.com>
parents:
96236
diff
changeset
|
6924 if (!inhibit_window_system |
d45acf0c8d23
merging Emacs.app (NeXTstep port)
Adrian Robert <Adrian.B.Robert@gmail.com>
parents:
96236
diff
changeset
|
6925 #ifndef CANNOT_DUMP |
d45acf0c8d23
merging Emacs.app (NeXTstep port)
Adrian Robert <Adrian.B.Robert@gmail.com>
parents:
96236
diff
changeset
|
6926 && initialized |
d45acf0c8d23
merging Emacs.app (NeXTstep port)
Adrian Robert <Adrian.B.Robert@gmail.com>
parents:
96236
diff
changeset
|
6927 #endif |
d45acf0c8d23
merging Emacs.app (NeXTstep port)
Adrian Robert <Adrian.B.Robert@gmail.com>
parents:
96236
diff
changeset
|
6928 ) |
d45acf0c8d23
merging Emacs.app (NeXTstep port)
Adrian Robert <Adrian.B.Robert@gmail.com>
parents:
96236
diff
changeset
|
6929 { |
104077
3abca9a8122f
* dispnew.c (init_display): Use Qx, Qw32, and Qns.
Chong Yidong <cyd@stupidchicken.com>
parents:
103052
diff
changeset
|
6930 Vinitial_window_system = Qns; |
96675
d45acf0c8d23
merging Emacs.app (NeXTstep port)
Adrian Robert <Adrian.B.Robert@gmail.com>
parents:
96236
diff
changeset
|
6931 Vwindow_system_version = make_number(10); |
d45acf0c8d23
merging Emacs.app (NeXTstep port)
Adrian Robert <Adrian.B.Robert@gmail.com>
parents:
96236
diff
changeset
|
6932 adjust_frame_glyphs_initially (); |
d45acf0c8d23
merging Emacs.app (NeXTstep port)
Adrian Robert <Adrian.B.Robert@gmail.com>
parents:
96236
diff
changeset
|
6933 return; |
d45acf0c8d23
merging Emacs.app (NeXTstep port)
Adrian Robert <Adrian.B.Robert@gmail.com>
parents:
96236
diff
changeset
|
6934 } |
d45acf0c8d23
merging Emacs.app (NeXTstep port)
Adrian Robert <Adrian.B.Robert@gmail.com>
parents:
96236
diff
changeset
|
6935 #endif |
d45acf0c8d23
merging Emacs.app (NeXTstep port)
Adrian Robert <Adrian.B.Robert@gmail.com>
parents:
96236
diff
changeset
|
6936 |
314 | 6937 /* If no window system has been specified, try to use the terminal. */ |
6938 if (! isatty (0)) | |
6939 { | |
16896
b2c51d6de440
(init_display): Use `fatal'.
Richard M. Stallman <rms@gnu.org>
parents:
16891
diff
changeset
|
6940 fatal ("standard input is not a tty"); |
314 | 6941 exit (1); |
6942 } | |
6943 | |
86273
77b991c8303d
(init_display) [WINDOWSNT]: Hardcode terminal_type.
Jason Rumney <jasonr@gnu.org>
parents:
85826
diff
changeset
|
6944 #ifdef WINDOWSNT |
77b991c8303d
(init_display) [WINDOWSNT]: Hardcode terminal_type.
Jason Rumney <jasonr@gnu.org>
parents:
85826
diff
changeset
|
6945 terminal_type = "w32console"; |
77b991c8303d
(init_display) [WINDOWSNT]: Hardcode terminal_type.
Jason Rumney <jasonr@gnu.org>
parents:
85826
diff
changeset
|
6946 #else |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
6947 /* Look at the TERM variable. */ |
314 | 6948 terminal_type = (char *) getenv ("TERM"); |
86273
77b991c8303d
(init_display) [WINDOWSNT]: Hardcode terminal_type.
Jason Rumney <jasonr@gnu.org>
parents:
85826
diff
changeset
|
6949 #endif |
314 | 6950 if (!terminal_type) |
6951 { | |
71946 | 6952 #ifdef HAVE_WINDOW_SYSTEM |
71945 | 6953 if (! inhibit_window_system) |
6954 fprintf (stderr, "Please set the environment variable DISPLAY or TERM (see `tset').\n"); | |
71944
270a672fc28c
(init_display): Mention DISPLAY as well as TERM in err msg.
Richard M. Stallman <rms@gnu.org>
parents:
71831
diff
changeset
|
6955 else |
270a672fc28c
(init_display): Mention DISPLAY as well as TERM in err msg.
Richard M. Stallman <rms@gnu.org>
parents:
71831
diff
changeset
|
6956 #endif /* HAVE_WINDOW_SYSTEM */ |
71945 | 6957 fprintf (stderr, "Please set the environment variable TERM; see `tset'.\n"); |
314 | 6958 exit (1); |
6959 } | |
6960 | |
53341 | 6961 { |
83431
76396de7f50a
Rename `struct device' to `struct terminal'. Rename some terminal-related functions similarly.
Karoly Lorentey <lorentey@elte.hu>
parents:
83413
diff
changeset
|
6962 struct terminal *t; |
83008
040dd41ed7d0
Hookified termcap devices, added bootstrap display device, plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
83004
diff
changeset
|
6963 struct frame *f = XFRAME (selected_frame); |
040dd41ed7d0
Hookified termcap devices, added bootstrap display device, plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
83004
diff
changeset
|
6964 |
040dd41ed7d0
Hookified termcap devices, added bootstrap display device, plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
83004
diff
changeset
|
6965 /* Open a display on the controlling tty. */ |
83431
76396de7f50a
Rename `struct device' to `struct terminal'. Rename some terminal-related functions similarly.
Karoly Lorentey <lorentey@elte.hu>
parents:
83413
diff
changeset
|
6966 t = init_tty (0, terminal_type, 1); /* Errors are fatal. */ |
83008
040dd41ed7d0
Hookified termcap devices, added bootstrap display device, plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
83004
diff
changeset
|
6967 |
040dd41ed7d0
Hookified termcap devices, added bootstrap display device, plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
83004
diff
changeset
|
6968 /* Convert the initial frame to use the new display. */ |
83090
72c2a3eb27da
Trivial cosmetic change in dispnew.c.
Karoly Lorentey <lorentey@elte.hu>
parents:
83074
diff
changeset
|
6969 if (f->output_method != output_initial) |
83008
040dd41ed7d0
Hookified termcap devices, added bootstrap display device, plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
83004
diff
changeset
|
6970 abort (); |
83431
76396de7f50a
Rename `struct device' to `struct terminal'. Rename some terminal-related functions similarly.
Karoly Lorentey <lorentey@elte.hu>
parents:
83413
diff
changeset
|
6971 f->output_method = t->type; |
76396de7f50a
Rename `struct device' to `struct terminal'. Rename some terminal-related functions similarly.
Karoly Lorentey <lorentey@elte.hu>
parents:
83413
diff
changeset
|
6972 f->terminal = t; |
76396de7f50a
Rename `struct device' to `struct terminal'. Rename some terminal-related functions similarly.
Karoly Lorentey <lorentey@elte.hu>
parents:
83413
diff
changeset
|
6973 |
76396de7f50a
Rename `struct device' to `struct terminal'. Rename some terminal-related functions similarly.
Karoly Lorentey <lorentey@elte.hu>
parents:
83413
diff
changeset
|
6974 t->reference_count++; |
76396de7f50a
Rename `struct device' to `struct terminal'. Rename some terminal-related functions similarly.
Karoly Lorentey <lorentey@elte.hu>
parents:
83413
diff
changeset
|
6975 t->display_info.tty->top_frame = selected_frame; |
83362
c3dd82172ed1
Enforce the presence of `window-system' and `tty-type' frame parameters in all frames.
Karoly Lorentey <lorentey@elte.hu>
parents:
83353
diff
changeset
|
6976 change_frame_size (XFRAME (selected_frame), |
83431
76396de7f50a
Rename `struct device' to `struct terminal'. Rename some terminal-related functions similarly.
Karoly Lorentey <lorentey@elte.hu>
parents:
83413
diff
changeset
|
6977 FrameRows (t->display_info.tty), |
76396de7f50a
Rename `struct device' to `struct terminal'. Rename some terminal-related functions similarly.
Karoly Lorentey <lorentey@elte.hu>
parents:
83413
diff
changeset
|
6978 FrameCols (t->display_info.tty), 0, 0, 1); |
76396de7f50a
Rename `struct device' to `struct terminal'. Rename some terminal-related functions similarly.
Karoly Lorentey <lorentey@elte.hu>
parents:
83413
diff
changeset
|
6979 |
76396de7f50a
Rename `struct device' to `struct terminal'. Rename some terminal-related functions similarly.
Karoly Lorentey <lorentey@elte.hu>
parents:
83413
diff
changeset
|
6980 /* Delete the initial terminal. */ |
76396de7f50a
Rename `struct device' to `struct terminal'. Rename some terminal-related functions similarly.
Karoly Lorentey <lorentey@elte.hu>
parents:
83413
diff
changeset
|
6981 if (--initial_terminal->reference_count == 0 |
76396de7f50a
Rename `struct device' to `struct terminal'. Rename some terminal-related functions similarly.
Karoly Lorentey <lorentey@elte.hu>
parents:
83413
diff
changeset
|
6982 && initial_terminal->delete_terminal_hook) |
76396de7f50a
Rename `struct device' to `struct terminal'. Rename some terminal-related functions similarly.
Karoly Lorentey <lorentey@elte.hu>
parents:
83413
diff
changeset
|
6983 (*initial_terminal->delete_terminal_hook) (initial_terminal); |
83074
34a7a8f40548
Fix background-mode on terminal frames (Dan Nicolaescu).
Karoly Lorentey <lorentey@elte.hu>
parents:
83067
diff
changeset
|
6984 |
34a7a8f40548
Fix background-mode on terminal frames (Dan Nicolaescu).
Karoly Lorentey <lorentey@elte.hu>
parents:
83067
diff
changeset
|
6985 /* Update frame parameters to reflect the new type. */ |
34a7a8f40548
Fix background-mode on terminal frames (Dan Nicolaescu).
Karoly Lorentey <lorentey@elte.hu>
parents:
83067
diff
changeset
|
6986 Fmodify_frame_parameters |
34a7a8f40548
Fix background-mode on terminal frames (Dan Nicolaescu).
Karoly Lorentey <lorentey@elte.hu>
parents:
83067
diff
changeset
|
6987 (selected_frame, Fcons (Fcons (Qtty_type, |
83431
76396de7f50a
Rename `struct device' to `struct terminal'. Rename some terminal-related functions similarly.
Karoly Lorentey <lorentey@elte.hu>
parents:
83413
diff
changeset
|
6988 Ftty_type (selected_frame)), Qnil)); |
97867
2aa441279c89
(init_display): Set `tty's association in frame's parameters alist to the name
Eli Zaretskii <eliz@gnu.org>
parents:
97646
diff
changeset
|
6989 if (t->display_info.tty->name) |
2aa441279c89
(init_display): Set `tty's association in frame's parameters alist to the name
Eli Zaretskii <eliz@gnu.org>
parents:
97646
diff
changeset
|
6990 Fmodify_frame_parameters (selected_frame, |
2aa441279c89
(init_display): Set `tty's association in frame's parameters alist to the name
Eli Zaretskii <eliz@gnu.org>
parents:
97646
diff
changeset
|
6991 Fcons (Fcons (Qtty, build_string (t->display_info.tty->name)), |
2aa441279c89
(init_display): Set `tty's association in frame's parameters alist to the name
Eli Zaretskii <eliz@gnu.org>
parents:
97646
diff
changeset
|
6992 Qnil)); |
2aa441279c89
(init_display): Set `tty's association in frame's parameters alist to the name
Eli Zaretskii <eliz@gnu.org>
parents:
97646
diff
changeset
|
6993 else |
2aa441279c89
(init_display): Set `tty's association in frame's parameters alist to the name
Eli Zaretskii <eliz@gnu.org>
parents:
97646
diff
changeset
|
6994 Fmodify_frame_parameters (selected_frame, Fcons (Fcons (Qtty, Qnil), |
2aa441279c89
(init_display): Set `tty's association in frame's parameters alist to the name
Eli Zaretskii <eliz@gnu.org>
parents:
97646
diff
changeset
|
6995 Qnil)); |
53341 | 6996 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
6997 |
16891
989845750a4d
(init_display): Check for overflow in screen size.
Richard M. Stallman <rms@gnu.org>
parents:
16881
diff
changeset
|
6998 { |
25666
063da8f6a487
(selected_frame): Make it a Lisp_Object.
Gerd Moellmann <gerd@gnu.org>
parents:
25546
diff
changeset
|
6999 struct frame *sf = SELECTED_FRAME (); |
51193
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
7000 int width = FRAME_TOTAL_COLS (sf); |
d47b56221a15
Make (many) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50589
diff
changeset
|
7001 int height = FRAME_LINES (sf); |
16891
989845750a4d
(init_display): Check for overflow in screen size.
Richard M. Stallman <rms@gnu.org>
parents:
16881
diff
changeset
|
7002 |
25012 | 7003 unsigned int total_glyphs = height * (width + 2) * sizeof (struct glyph); |
7004 | |
7005 /* If these sizes are so big they cause overflow, just ignore the | |
7006 change. It's not clear what better we could do. */ | |
7007 if (total_glyphs / sizeof (struct glyph) / height != width + 2) | |
16896
b2c51d6de440
(init_display): Use `fatal'.
Richard M. Stallman <rms@gnu.org>
parents:
16891
diff
changeset
|
7008 fatal ("screen size %dx%d too big", width, height); |
16891
989845750a4d
(init_display): Check for overflow in screen size.
Richard M. Stallman <rms@gnu.org>
parents:
16881
diff
changeset
|
7009 } |
989845750a4d
(init_display): Check for overflow in screen size.
Richard M. Stallman <rms@gnu.org>
parents:
16881
diff
changeset
|
7010 |
25012 | 7011 adjust_frame_glyphs_initially (); |
25666
063da8f6a487
(selected_frame): Make it a Lisp_Object.
Gerd Moellmann <gerd@gnu.org>
parents:
25546
diff
changeset
|
7012 calculate_costs (XFRAME (selected_frame)); |
314 | 7013 |
25012 | 7014 /* Set up faces of the initial terminal frame of a dumped Emacs. */ |
7015 if (initialized | |
7016 && !noninteractive | |
83014
f5cadabb36dd
Support for opening X frames from a tty session.
Karoly Lorentey <lorentey@elte.hu>
parents:
83010
diff
changeset
|
7017 && NILP (Vinitial_window_system)) |
26729
f5dded41adcc
Changes for automatic remapping of X colors on terminal frames:
Eli Zaretskii <eliz@gnu.org>
parents:
26591
diff
changeset
|
7018 { |
f5dded41adcc
Changes for automatic remapping of X colors on terminal frames:
Eli Zaretskii <eliz@gnu.org>
parents:
26591
diff
changeset
|
7019 /* For the initial frame, we don't have any way of knowing what |
f5dded41adcc
Changes for automatic remapping of X colors on terminal frames:
Eli Zaretskii <eliz@gnu.org>
parents:
26591
diff
changeset
|
7020 are the foreground and background colors of the terminal. */ |
f5dded41adcc
Changes for automatic remapping of X colors on terminal frames:
Eli Zaretskii <eliz@gnu.org>
parents:
26591
diff
changeset
|
7021 struct frame *sf = SELECTED_FRAME(); |
f5dded41adcc
Changes for automatic remapping of X colors on terminal frames:
Eli Zaretskii <eliz@gnu.org>
parents:
26591
diff
changeset
|
7022 |
26902
264b83a3a688
Changes for separate unspecified foreground and background colors
Eli Zaretskii <eliz@gnu.org>
parents:
26851
diff
changeset
|
7023 FRAME_FOREGROUND_PIXEL (sf) = FACE_TTY_DEFAULT_FG_COLOR; |
264b83a3a688
Changes for separate unspecified foreground and background colors
Eli Zaretskii <eliz@gnu.org>
parents:
26851
diff
changeset
|
7024 FRAME_BACKGROUND_PIXEL (sf) = FACE_TTY_DEFAULT_BG_COLOR; |
26729
f5dded41adcc
Changes for automatic remapping of X colors on terminal frames:
Eli Zaretskii <eliz@gnu.org>
parents:
26591
diff
changeset
|
7025 call0 (intern ("tty-set-up-initial-frame-faces")); |
f5dded41adcc
Changes for automatic remapping of X colors on terminal frames:
Eli Zaretskii <eliz@gnu.org>
parents:
26591
diff
changeset
|
7026 } |
314 | 7027 } |
25012 | 7028 |
7029 | |
314 | 7030 |
25012 | 7031 /*********************************************************************** |
7032 Blinking cursor | |
7033 ***********************************************************************/ | |
7034 | |
26280
083835afced5
(Finternal_show_cursor): Renamed from Fshow_cursor.
Gerd Moellmann <gerd@gnu.org>
parents:
26164
diff
changeset
|
7035 DEFUN ("internal-show-cursor", Finternal_show_cursor, |
26334
e3a9ceb7a557
(Finternal_show_cursor): Change it to set the
Gerd Moellmann <gerd@gnu.org>
parents:
26280
diff
changeset
|
7036 Sinternal_show_cursor, 2, 2, 0, |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
7037 doc: /* Set the cursor-visibility flag of WINDOW to SHOW. |
39914
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
7038 WINDOW nil means use the selected window. SHOW non-nil means |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
7039 show a cursor in WINDOW in the next redisplay. SHOW nil means |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
7040 don't show a cursor. */) |
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
7041 (window, show) |
26334
e3a9ceb7a557
(Finternal_show_cursor): Change it to set the
Gerd Moellmann <gerd@gnu.org>
parents:
26280
diff
changeset
|
7042 Lisp_Object window, show; |
25012 | 7043 { |
7044 /* Don't change cursor state while redisplaying. This could confuse | |
7045 output routines. */ | |
7046 if (!redisplaying_p) | |
7047 { | |
7048 if (NILP (window)) | |
7049 window = selected_window; | |
7050 else | |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40512
diff
changeset
|
7051 CHECK_WINDOW (window); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
7052 |
26334
e3a9ceb7a557
(Finternal_show_cursor): Change it to set the
Gerd Moellmann <gerd@gnu.org>
parents:
26280
diff
changeset
|
7053 XWINDOW (window)->cursor_off_p = NILP (show); |
25012 | 7054 } |
7055 | |
7056 return Qnil; | |
7057 } | |
7058 | |
7059 | |
26334
e3a9ceb7a557
(Finternal_show_cursor): Change it to set the
Gerd Moellmann <gerd@gnu.org>
parents:
26280
diff
changeset
|
7060 DEFUN ("internal-show-cursor-p", Finternal_show_cursor_p, |
e3a9ceb7a557
(Finternal_show_cursor): Change it to set the
Gerd Moellmann <gerd@gnu.org>
parents:
26280
diff
changeset
|
7061 Sinternal_show_cursor_p, 0, 1, 0, |
40979 | 7062 doc: /* Value is non-nil if next redisplay will display a cursor in WINDOW. |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
7063 WINDOW nil or omitted means report on the selected window. */) |
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
7064 (window) |
26334
e3a9ceb7a557
(Finternal_show_cursor): Change it to set the
Gerd Moellmann <gerd@gnu.org>
parents:
26280
diff
changeset
|
7065 Lisp_Object window; |
e3a9ceb7a557
(Finternal_show_cursor): Change it to set the
Gerd Moellmann <gerd@gnu.org>
parents:
26280
diff
changeset
|
7066 { |
e3a9ceb7a557
(Finternal_show_cursor): Change it to set the
Gerd Moellmann <gerd@gnu.org>
parents:
26280
diff
changeset
|
7067 struct window *w; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
7068 |
26334
e3a9ceb7a557
(Finternal_show_cursor): Change it to set the
Gerd Moellmann <gerd@gnu.org>
parents:
26280
diff
changeset
|
7069 if (NILP (window)) |
e3a9ceb7a557
(Finternal_show_cursor): Change it to set the
Gerd Moellmann <gerd@gnu.org>
parents:
26280
diff
changeset
|
7070 window = selected_window; |
e3a9ceb7a557
(Finternal_show_cursor): Change it to set the
Gerd Moellmann <gerd@gnu.org>
parents:
26280
diff
changeset
|
7071 else |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40512
diff
changeset
|
7072 CHECK_WINDOW (window); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
7073 |
26334
e3a9ceb7a557
(Finternal_show_cursor): Change it to set the
Gerd Moellmann <gerd@gnu.org>
parents:
26280
diff
changeset
|
7074 w = XWINDOW (window); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
7075 return w->cursor_off_p ? Qnil : Qt; |
26334
e3a9ceb7a557
(Finternal_show_cursor): Change it to set the
Gerd Moellmann <gerd@gnu.org>
parents:
26280
diff
changeset
|
7076 } |
e3a9ceb7a557
(Finternal_show_cursor): Change it to set the
Gerd Moellmann <gerd@gnu.org>
parents:
26280
diff
changeset
|
7077 |
95590
9a4b27c8feec
* window.el (display-buffer-function, special-display-p)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94963
diff
changeset
|
7078 DEFUN ("last-nonminibuffer-frame", Flast_nonminibuf_frame, |
9a4b27c8feec
* window.el (display-buffer-function, special-display-p)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94963
diff
changeset
|
7079 Slast_nonminibuf_frame, 0, 0, 0, |
9a4b27c8feec
* window.el (display-buffer-function, special-display-p)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94963
diff
changeset
|
7080 doc: /* Value is last nonminibuffer frame. */) |
9a4b27c8feec
* window.el (display-buffer-function, special-display-p)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94963
diff
changeset
|
7081 () |
9a4b27c8feec
* window.el (display-buffer-function, special-display-p)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94963
diff
changeset
|
7082 { |
95639
2c12b44a3dfc
(Flast_nonminibuf_frame): Handle the NULL case.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95590
diff
changeset
|
7083 Lisp_Object frame = Qnil; |
2c12b44a3dfc
(Flast_nonminibuf_frame): Handle the NULL case.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95590
diff
changeset
|
7084 |
2c12b44a3dfc
(Flast_nonminibuf_frame): Handle the NULL case.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95590
diff
changeset
|
7085 if (last_nonminibuf_frame) |
2c12b44a3dfc
(Flast_nonminibuf_frame): Handle the NULL case.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95590
diff
changeset
|
7086 XSETFRAME (frame, last_nonminibuf_frame); |
95590
9a4b27c8feec
* window.el (display-buffer-function, special-display-p)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94963
diff
changeset
|
7087 |
9a4b27c8feec
* window.el (display-buffer-function, special-display-p)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94963
diff
changeset
|
7088 return frame; |
9a4b27c8feec
* window.el (display-buffer-function, special-display-p)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94963
diff
changeset
|
7089 } |
25012 | 7090 |
7091 /*********************************************************************** | |
7092 Initialization | |
7093 ***********************************************************************/ | |
7094 | |
21514 | 7095 void |
314 | 7096 syms_of_display () |
7097 { | |
764 | 7098 defsubr (&Sredraw_frame); |
314 | 7099 defsubr (&Sredraw_display); |
7810
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
7100 defsubr (&Sframe_or_buffer_changed_p); |
314 | 7101 defsubr (&Sopen_termscript); |
7102 defsubr (&Sding); | |
71761
1055c0769159
* puresize.h (BASE_PURESIZE): Increment to 1211000.
Chong Yidong <cyd@stupidchicken.com>
parents:
71573
diff
changeset
|
7103 defsubr (&Sredisplay); |
314 | 7104 defsubr (&Ssleep_for); |
7105 defsubr (&Ssend_string_to_terminal); | |
26280
083835afced5
(Finternal_show_cursor): Renamed from Fshow_cursor.
Gerd Moellmann <gerd@gnu.org>
parents:
26164
diff
changeset
|
7106 defsubr (&Sinternal_show_cursor); |
26334
e3a9ceb7a557
(Finternal_show_cursor): Change it to set the
Gerd Moellmann <gerd@gnu.org>
parents:
26280
diff
changeset
|
7107 defsubr (&Sinternal_show_cursor_p); |
95590
9a4b27c8feec
* window.el (display-buffer-function, special-display-p)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94963
diff
changeset
|
7108 defsubr (&Slast_nonminibuf_frame); |
314 | 7109 |
34893
779bd3fa820e
Use #if GLYPH_DEBUG instead of #ifdef GLYPH_DEBUG.
Gerd Moellmann <gerd@gnu.org>
parents:
34866
diff
changeset
|
7110 #if GLYPH_DEBUG |
34866
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
7111 defsubr (&Sdump_redisplay_history); |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
7112 #endif |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
7113 |
12186
6811992e871c
(Fframe_or_buffer_changed_p): Calculate vector size right.
Karl Heuer <kwzh@gnu.org>
parents:
11919
diff
changeset
|
7114 frame_and_buffer_state = Fmake_vector (make_number (20), Qlambda); |
7810
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
7115 staticpro (&frame_and_buffer_state); |
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
7116 |
105877
21bdda3ded62
* xterm.c (syms_of_xterm):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
105669
diff
changeset
|
7117 Qdisplay_table = intern_c_string ("display-table"); |
13220
2e9014617492
(Qdisplay_table): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13105
diff
changeset
|
7118 staticpro (&Qdisplay_table); |
105877
21bdda3ded62
* xterm.c (syms_of_xterm):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
105669
diff
changeset
|
7119 Qredisplay_dont_pause = intern_c_string ("redisplay-dont-pause"); |
30720
64f3338f72d8
(Qredisplay_dont_pause): New variable.
Gerd Moellmann <gerd@gnu.org>
parents:
30713
diff
changeset
|
7120 staticpro (&Qredisplay_dont_pause); |
13220
2e9014617492
(Qdisplay_table): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13105
diff
changeset
|
7121 |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
7122 DEFVAR_INT ("baud-rate", &baud_rate, |
40979 | 7123 doc: /* *The output baud rate of the terminal. |
39914
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
7124 On most systems, changing this value will affect the amount of padding |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
7125 and the other strategic decisions made during redisplay. */); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
7126 |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
7127 DEFVAR_BOOL ("inverse-video", &inverse_video, |
40979 | 7128 doc: /* *Non-nil means invert the entire frame display. |
39914
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
7129 This means everything is in inverse video which otherwise would not be. */); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
7130 |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
7131 DEFVAR_BOOL ("visible-bell", &visible_bell, |
40979 | 7132 doc: /* *Non-nil means try to flash the frame to represent a bell. |
40334
bee6cc2e8a90
(syms_of_display) <visible-bell>: Add a reference to
Eli Zaretskii <eliz@gnu.org>
parents:
40271
diff
changeset
|
7133 |
bee6cc2e8a90
(syms_of_display) <visible-bell>: Add a reference to
Eli Zaretskii <eliz@gnu.org>
parents:
40271
diff
changeset
|
7134 See also `ring-bell-function'. */); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
7135 |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
7136 DEFVAR_BOOL ("no-redraw-on-reenter", &no_redraw_on_reenter, |
40979 | 7137 doc: /* *Non-nil means no need to redraw entire frame after suspending. |
39914
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
7138 A non-nil value is useful if the terminal can automatically preserve |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
7139 Emacs's frame display when you reenter Emacs. |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
7140 It is up to you to set this variable if your terminal can do that. */); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
7141 |
83014
f5cadabb36dd
Support for opening X frames from a tty session.
Karoly Lorentey <lorentey@elte.hu>
parents:
83010
diff
changeset
|
7142 DEFVAR_LISP ("initial-window-system", &Vinitial_window_system, |
f5cadabb36dd
Support for opening X frames from a tty session.
Karoly Lorentey <lorentey@elte.hu>
parents:
83010
diff
changeset
|
7143 doc: /* Name of the window system that Emacs uses for the first frame. |
41025
4feeae90afa4
(syms_of_display): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
40979
diff
changeset
|
7144 The value is a symbol--for instance, `x' for X windows. |
4feeae90afa4
(syms_of_display): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
40979
diff
changeset
|
7145 The value is nil if Emacs is using a text-only terminal. */); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
7146 |
85614
9f3a25157e4f
Make `window-system' into a keyboard-local variable (rather than
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
85252
diff
changeset
|
7147 DEFVAR_KBOARD ("window-system", Vwindow_system, |
9f3a25157e4f
Make `window-system' into a keyboard-local variable (rather than
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
85252
diff
changeset
|
7148 doc: /* Name of window system through which the selected frame is displayed. |
9f3a25157e4f
Make `window-system' into a keyboard-local variable (rather than
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
85252
diff
changeset
|
7149 The value is a symbol--for instance, `x' for X windows. |
9f3a25157e4f
Make `window-system' into a keyboard-local variable (rather than
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
85252
diff
changeset
|
7150 The value is nil if the selected frame is on a text-only-terminal. */); |
9f3a25157e4f
Make `window-system' into a keyboard-local variable (rather than
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
85252
diff
changeset
|
7151 |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
7152 DEFVAR_LISP ("window-system-version", &Vwindow_system_version, |
40979 | 7153 doc: /* The version number of the window system in use. |
85826 | 7154 For X windows, this is 11. */); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
7155 |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
7156 DEFVAR_BOOL ("cursor-in-echo-area", &cursor_in_echo_area, |
40979 | 7157 doc: /* Non-nil means put cursor in minibuffer, at end of any message there. */); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
7158 |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
7159 DEFVAR_LISP ("glyph-table", &Vglyph_table, |
40979 | 7160 doc: /* Table defining how to output a glyph code to the frame. |
39914
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
7161 If not nil, this is a vector indexed by glyph code to define the glyph. |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
7162 Each element can be: |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
7163 integer: a glyph code which this glyph is an alias for. |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
7164 string: output this glyph using that string (not impl. in X windows). |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
7165 nil: this glyph mod 524288 is the code of a character to output, |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
7166 and this glyph / 524288 is the face number (see `face-id') to use |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
7167 while outputting it. */); |
314 | 7168 Vglyph_table = Qnil; |
7169 | |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
7170 DEFVAR_LISP ("standard-display-table", &Vstandard_display_table, |
40979 | 7171 doc: /* Display table to use for buffers that specify none. |
39914
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
7172 See `buffer-display-table' for more information. */); |
314 | 7173 Vstandard_display_table = Qnil; |
7174 | |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
7175 DEFVAR_BOOL ("redisplay-dont-pause", &redisplay_dont_pause, |
40979 | 7176 doc: /* *Non-nil means update isn't paused when input is detected. */); |
25012 | 7177 redisplay_dont_pause = 0; |
7178 | |
71323
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
7179 #if PERIODIC_PREEMPTION_CHECKING |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
7180 DEFVAR_LISP ("redisplay-preemption-period", &Vredisplay_preemption_period, |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
7181 doc: /* *The period in seconds between checking for input during redisplay. |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
7182 If input is detected, redisplay is pre-empted, and the input is processed. |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
7183 If nil, never pre-empt redisplay. */); |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
7184 Vredisplay_preemption_period = make_float (0.10); |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
7185 #endif |
e882f189c3af
Modify preemptive redisplay to be based on periodic checks for input.
Kim F. Storm <storm@cua.dk>
parents:
71211
diff
changeset
|
7186 |
314 | 7187 #ifdef CANNOT_DUMP |
7188 if (noninteractive) | |
7189 #endif | |
7190 { | |
83014
f5cadabb36dd
Support for opening X frames from a tty session.
Karoly Lorentey <lorentey@elte.hu>
parents:
83010
diff
changeset
|
7191 Vinitial_window_system = Qnil; |
314 | 7192 Vwindow_system_version = Qnil; |
7193 } | |
7194 } | |
52401 | 7195 |
7196 /* arch-tag: 8d812b1f-04a2-4195-a9c4-381f8457a413 | |
7197 (do not change this comment) */ |