annotate src/redisplay-output.c @ 793:e38acbeb1cae

[xemacs-hg @ 2002-03-29 04:46:17 by ben] lots o' fixes etc/ChangeLog: New file. Separated out all entries for etc/ into their own ChangeLog. Includes entries for the following files: etc/BABYL, etc/BETA, etc/CHARSETS, etc/DISTRIB, etc/Emacs.ad, etc/FTP, etc/GNUS-NEWS, etc/GOATS, etc/HELLO, etc/INSTALL, etc/MACHINES, etc/MAILINGLISTS, etc/MSDOS, etc/MYTHOLOGY, etc/NEWS, etc/OXYMORONS, etc/PACKAGES, etc/README, etc/TUTORIAL, etc/TUTORIAL.de, etc/TUTORIAL.ja, etc/TUTORIAL.ko, etc/TUTORIAL.se, etc/aliases.ksh, etc/altrasoft-logo.xpm, etc/check_cygwin_setup.sh, etc/custom/example-themes/europe-theme.el, etc/custom/example-themes/ex-custom-file, etc/custom/example-themes/example-theme.el, etc/e/eterm.ti, etc/edt-user.doc, etc/enriched.doc, etc/etags.1, etc/gnuserv.1, etc/gnuserv.README, etc/package-index.LATEST.gpg, etc/package-index.LATEST.pgp, etc/photos/jan.png, etc/recycle.xpm, etc/refcard.tex, etc/sample.Xdefaults, etc/sample.emacs, etc/sgml/CATALOG, etc/sgml/HTML32.dtd, etc/skk/SKK.tut.E, etc/smilies/Face_ase.xbm, etc/smilies/Face_ase2.xbm, etc/smilies/Face_ase3.xbm, etc/smilies/Face_smile.xbm, etc/smilies/Face_weep.xbm, etc/sounds, etc/toolbar, etc/toolbar/workshop-cap-up.xpm, etc/xemacs-ja.1, etc/xemacs.1, etc/yow.lines, etc\BETA, etc\NEWS, etc\README, etc\TUTORIAL, etc\TUTORIAL.de, etc\check_cygwin_setup.sh, etc\sample.init.el, etc\unicode\README, etc\unicode\mule-ucs\*, etc\unicode\other\* unicode/unicode-consortium/8859-16.TXT: New file. mule/english.el: Define this charset now, since a bug was fixed that formerly prevented it. mule/ethio-util.el: Fix compile errors involving Unicode `characters', which should be integers. Makefile.in.in: Always include gui.c, to fix compile error when TTY-only. EmacsFrame.c, abbrev.c, alloc.c, buffer.c, buffer.h, bytecode.c, bytecode.h, callint.c, callproc.c, casetab.c, casetab.h, charset.h, chartab.c, chartab.h, cmds.c, console-msw.c, console-msw.h, console-tty.c, console-x.c, console-x.h, console.c, console.h, data.c, database.c, device-gtk.c, device-msw.c, device-x.c, device.c, device.h, dialog-msw.c, doc.c, doprnt.c, dumper.c, dynarr.c, editfns.c, eldap.c, eldap.h, elhash.c, elhash.h, emacs.c, eval.c, event-Xt.c, event-gtk.c, event-msw.c, event-stream.c, event-tty.c, event-unixoid.c, events.c, events.h, extents.c, extents.h, faces.c, faces.h, file-coding.c, file-coding.h, fileio.c, filelock.c, fns.c, frame-gtk.c, frame-msw.c, frame-tty.c, frame-x.c, frame.c, frame.h, free-hook.c, general-slots.h, glyphs-eimage.c, glyphs-gtk.c, glyphs-msw.c, glyphs-widget.c, glyphs-x.c, glyphs.c, glyphs.h, gpmevent.c, gtk-xemacs.c, gui-msw.c, gui-x.c, gui-x.h, gui.c, gui.h, gutter.c, gutter.h, indent.c, input-method-xlib.c, insdel.c, keymap.c, keymap.h, lisp-disunion.h, lisp-union.h, lisp.h, lread.c, lrecord.h, lstream.c, lstream.h, marker.c, menubar-gtk.c, menubar-msw.c, menubar-x.c, menubar.c, minibuf.c, mule-canna.c, mule-ccl.c, mule-charset.c, mule-wnnfns.c, native-gtk-toolbar.c, objects-msw.c, objects-tty.c, objects-x.c, objects.c, objects.h, opaque.c, opaque.h, postgresql.c, postgresql.h, print.c, process-unix.c, process.c, process.h, rangetab.c, rangetab.h, redisplay-gtk.c, redisplay-msw.c, redisplay-output.c, redisplay-tty.c, redisplay-x.c, redisplay.c, scrollbar-gtk.c, scrollbar-msw.c, scrollbar-x.c, scrollbar.c, scrollbar.h, search.c, select-gtk.c, select-x.c, sound.c, specifier.c, specifier.h, strftime.c, symbols.c, symeval.h, syntax.h, text.c, text.h, toolbar-common.c, toolbar-msw.c, toolbar.c, toolbar.h, tooltalk.c, tooltalk.h, ui-gtk.c, ui-gtk.h, undo.c, vm-limit.c, window.c, window.h: Eliminate XSETFOO. Replace all usages with wrap_foo(). Make symbol->name a Lisp_Object, not Lisp_String *. Eliminate nearly all uses of Lisp_String * in favor of Lisp_Object, and correct macros so most of them favor Lisp_Object. Create new error-behavior ERROR_ME_DEBUG_WARN -- output warnings, but at level `debug' (usually ignored). Use it when instantiating specifiers, so problems can be debugged. Move log-warning-minimum-level into C so that we can optimize ERROR_ME_DEBUG_WARN. Fix warning levels consistent with new definitions. Add default_ and parent fields to char table; not yet implemented. New fun Dynarr_verify(); use for further error checking on Dynarrs. Rearrange code at top of lisp.h in conjunction with dynarr changes. Fix eifree(). Use Eistrings in various places (format_event_object(), where_is_to_char(), and callers thereof) to avoid fixed-size strings buffers. New fun write_eistring(). Reindent and fix GPM code to follow standards. Set default MS Windows font to Lucida Console (same size as Courier New but less interline spacing, so more lines fit). Increase default frame size on Windows to 50 lines. (If that's too big for the workspace, the frame will be shrunk as necessary.) Fix problem with text files with no newlines (). (Change `convert-eol' coding system to use `nil' for autodetect, consistent with make-coding-system.) Correct compile warnings in vm-limit.c. Fix handling of reverse-direction charsets to avoid errors when opening (e.g.) mule-ucs/lisp/reldata/uiso8859-6.el. Recode some object printing methods to use write_fmt_string() instead of a fixed buffer and sprintf. Turn on display of png comments as warnings (level `info'), now that they're unobtrusive. Revamped the sound documentation. Fixed bug in redisplay w.r.t. hscroll/truncation/continuation glyphs causing jumping up and down of the lines, since they're bigger than the line size. (It was seen most obviously when there's a horizontal scroll bar, e.g. do C-h a glyph or something like that.) The problem was that the glyph-contrib-p setting on glyphs was ignored even if it was set properly, which it wasn't until now.
author ben
date Fri, 29 Mar 2002 04:49:13 +0000
parents fdefd0186b75
children a5954632b187
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 /* Synchronize redisplay structures and output changes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 Copyright (C) 1994, 1995 Board of Trustees, University of Illinois.
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 665
diff changeset
3 Copyright (C) 1995, 1996, 2002 Ben Wing.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4 Copyright (C) 1996 Chuck Thompson.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5 Copyright (C) 1999 Andy Piper.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 XEmacs is free software; you can redistribute it and/or modify it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 under the terms of the GNU General Public License as published by the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11 Free Software Foundation; either version 2, or (at your option) any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 XEmacs is distributed in the hope that it will be useful, but WITHOUT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 You should have received a copy of the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 along with XEmacs; see the file COPYING. If not, write to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22 Boston, MA 02111-1307, USA. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24 /* Synched up with: Not in FSF. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 /* This file has been Mule-ized. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 /* Author: Chuck Thompson */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 /* Heavily hacked for modularity, gutter and subwindow support by Andy
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 Piper. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 #include <config.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 #include "lisp.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 #include "buffer.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 #include "window.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 #include "frame.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 #include "device.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 #include "glyphs.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 #include "redisplay.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 #include "faces.h"
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
43 #include "gutter.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 static int compare_runes (struct window *w, struct rune *crb,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 struct rune *drb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 static void redraw_cursor_in_window (struct window *w,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 int run_end_begin_glyphs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 static void redisplay_output_display_block (struct window *w, struct display_line *dl,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 int block, int start, int end, int start_pixpos,
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
51 int cursor_start, int cursor_width,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 int cursor_height);
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
53 static void redisplay_normalize_display_box (struct display_box* dest,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 struct display_glyph_area* src);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 static int redisplay_display_boxes_in_window_p (struct window* w,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 struct display_box* db,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 struct display_glyph_area* dga);
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
58 static void redisplay_clear_clipped_region (Lisp_Object locale, face_index findex,
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
59 struct display_box* dest,
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
60 struct display_glyph_area* glyphsrc,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 int fullheight_p, Lisp_Object);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 /*****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 sync_rune_structs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 Synchronize the given rune blocks.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 ****************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 sync_rune_structs (struct window *w, rune_dynarr *cra, rune_dynarr *dra)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 int rune_elt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 int max_move = ((Dynarr_length (dra) > Dynarr_largest (cra))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 ? Dynarr_largest (cra)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 : Dynarr_length (dra));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 if (max_move)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 /* #### Doing this directly breaks the encapsulation. But, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 running time of this function has a measurable impact on
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 redisplay performance so avoiding all excess overhead is a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 good thing. Is all of this true? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 memcpy (cra->base, dra->base, sizeof (struct rune) * max_move);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 Dynarr_set_size (cra, max_move);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 Dynarr_reset (cra);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 for (rune_elt = max_move; rune_elt < Dynarr_length (dra); rune_elt++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 struct rune rb, *crb;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 struct rune *drb = Dynarr_atp (dra, rune_elt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 crb = &rb;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 memcpy (crb, drb, sizeof (struct rune));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 Dynarr_add (cra, *crb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 /*****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 sync_display_line_structs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 For the given LINE in window W, make the current display line equal
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 the desired display line.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 ****************************************************************************/
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
105 void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 sync_display_line_structs (struct window *w, int line, int do_blocks,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 display_line_dynarr *cdla,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 display_line_dynarr *ddla)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 int cdla_len = Dynarr_length (cdla);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 struct display_line dl, *clp, *dlp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 int db_elt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 dlp = Dynarr_atp (ddla, line);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 if (line >= Dynarr_largest (cdla))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 clp = &dl;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 clp->display_blocks = Dynarr_new (display_block);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 clp = Dynarr_atp (cdla, line);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 if (clp->display_blocks)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 Dynarr_reset (clp->display_blocks);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 if (clp->left_glyphs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 Dynarr_free (clp->left_glyphs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 clp->left_glyphs = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 if (clp->right_glyphs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 Dynarr_free (clp->right_glyphs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 clp->right_glyphs = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 display_block_dynarr *tdb = clp->display_blocks;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 memcpy (clp, dlp, sizeof (struct display_line));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 clp->display_blocks = tdb;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 clp->left_glyphs = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 clp->right_glyphs = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 if (!do_blocks && line >= cdla_len)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 Dynarr_add (cdla, *clp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 for (db_elt = 0; db_elt < Dynarr_length (dlp->display_blocks); db_elt++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 struct display_block db, *cdb;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 struct display_block *ddb = Dynarr_atp (dlp->display_blocks, db_elt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 if (db_elt >= Dynarr_largest (clp->display_blocks))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 cdb = &db;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 memcpy (cdb, ddb, sizeof (struct display_block));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 cdb->runes = Dynarr_new (rune);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 Dynarr_add (clp->display_blocks, *cdb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 rune_dynarr *tr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 cdb = Dynarr_atp (clp->display_blocks, db_elt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 tr = cdb->runes;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 memcpy (cdb, ddb, sizeof (struct display_block));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 cdb->runes = tr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 Dynarr_increment (clp->display_blocks);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 sync_rune_structs (w, cdb->runes, ddb->runes);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 if (line >= cdla_len)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 Dynarr_add (cdla, *clp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 /*****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 compare_runes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184
448
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
185 Compare two runes to see if each of their fields is equal. If so,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 return true otherwise return false.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 ****************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 compare_runes (struct window *w, struct rune *crb, struct rune *drb)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 {
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 638
diff changeset
191 /* Do not compare the values of charbpos and endpos. They do not
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 affect the display characteristics. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 /* Note: (hanoi 6) spends 95% of its time in redisplay, and about
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 30% here. Not using bitfields for rune.type alone gives a redisplay
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 speed up of 10%.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 #### In profile arcs run of a normal Gnus session this function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 is run 6.76 million times, only to return 1 in 6.73 million of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 those.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 In addition a quick look GCC sparc assembly shows that GCC is not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 doing a good job here.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 1. The function is not inlined (too complicated?)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 2. It seems to be reloading the crb and drb variables all the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 time.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 3. It doesn't seem to notice that the second half of these if's
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 are really a switch statement.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 So I (JV) conjecture
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 #### It would really be worth it to arrange for this function to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 be (almost) a single call to memcmp. */
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
214
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
215 if (crb->xpos != drb->xpos)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 else if (crb->width != drb->width)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 else if (crb->cursor_type != drb->cursor_type)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 else if (crb->type != drb->type)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 else if (crb->type == RUNE_CHAR &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 (crb->object.chr.ch != drb->object.chr.ch))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 else if (crb->type == RUNE_HLINE &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 (crb->object.hline.thickness != drb->object.hline.thickness ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 crb->object.hline.yoffset != drb->object.hline.yoffset))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 return 0;
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
230 else if (crb->type == RUNE_DGLYPH &&
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 (!EQ (crb->object.dglyph.glyph, drb->object.dglyph.glyph) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 !EQ (crb->object.dglyph.extent, drb->object.dglyph.extent) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 crb->object.dglyph.xoffset != drb->object.dglyph.xoffset))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 /* Only check dirtiness if we know something has changed. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 else if (crb->type == RUNE_DGLYPH &&
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
237 (XGLYPH_DIRTYP (crb->object.dglyph.glyph) ||
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
238 crb->findex != drb->findex))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
240 /* We need some way of telling redisplay_output_layout () that the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
241 only reason we are outputting it is because something has
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
242 changed internally. That way we can optimize whether we need
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
243 to clear the layout first and also only output the components
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
244 that have changed. The image_instance dirty flag and
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
245 display_hash are no good to us because these will invariably
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
246 have been set anyway if the layout has changed. So it looks
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
247 like we need yet another change flag that we can set here and
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
248 then clear in redisplay_output_layout (). */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
249 Lisp_Object window, image;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
250 Lisp_Image_Instance* ii;
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 665
diff changeset
251 window = wrap_window (w);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
252 image = glyph_image_instance (crb->object.dglyph.glyph,
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 665
diff changeset
253 window, ERROR_ME_DEBUG_WARN, 1);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
254
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
255 if (!IMAGE_INSTANCEP (image))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
256 return 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
257 ii = XIMAGE_INSTANCE (image);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
258
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
259 if (TEXT_IMAGE_INSTANCEP (image) &&
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
260 (crb->findex != drb->findex ||
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
261 WINDOW_FACE_CACHEL_DIRTY (w, drb->findex)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 return 0;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
263
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
264 /* It is quite common for the two glyphs to be EQ since in many
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
265 cases they will actually be the same object. This does not
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
266 mean, however, that nothing has changed. We therefore need to
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
267 check the current hash of the glyph against the last recorded
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
268 display hash and the pending display items. See
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
269 update_subwindow (). */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
270 if (image_instance_changed (image) ||
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
271 crb->findex != drb->findex ||
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
272 WINDOW_FACE_CACHEL_DIRTY (w, drb->findex))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
273 {
638
373ced43e288 [xemacs-hg @ 2001-07-26 21:10:44 by adrian]
adrian
parents: 462
diff changeset
274 /* Now we are going to re-output the glyph, but since
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
275 this is for some internal reason not related to geometry
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
276 changes, send a hint to the output routines that they can
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
277 take some short cuts. This is most useful for
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
278 layouts. This flag should get reset by the output
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
279 routines.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
280
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
281 #### It is possible for us to get here when the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
282 face_cachel is dirty. I do not know what the implications
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
283 of this are.*/
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
284 IMAGE_INSTANCE_OPTIMIZE_OUTPUT (ii) = 1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
285 return 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
286 }
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
287 else
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
290 /* We now do this last so that glyph checks can do their own thing
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
291 for face changes. Face changes quite often happen when we are
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
292 trying to output something in the gutter, this would normally
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
293 lead to a lot of flashing. The indices can quite often be
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
294 different and yet the faces are the same, we do not want to
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
295 re-output in this instance. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
296 else if (crb->findex != drb->findex ||
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
297 WINDOW_FACE_CACHEL_DIRTY (w, drb->findex))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
298 return 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 /*****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 get_next_display_block
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 Return the next display starting at or overlapping START_POS. Return
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 the start of the next region in NEXT_START.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 ****************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 get_next_display_block (layout_bounds bounds, display_block_dynarr *dba,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 int start_pos, int *next_start)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 int next_display_block = NO_BLOCK;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 int priority = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 int block;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 /* If we don't find a display block covering or starting at
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 start_pos, then we return the starting point of the next display
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 block or the next division boundary, whichever is closer to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 start_pos. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 if (next_start)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 if (start_pos >= bounds.left_out && start_pos < bounds.left_in)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 *next_start = bounds.left_in;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 else if (start_pos < bounds.left_white)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 *next_start = bounds.left_white;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 else if (start_pos < bounds.right_white)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 *next_start = bounds.right_white;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 else if (start_pos < bounds.right_in)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 *next_start = bounds.right_in;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 else if (start_pos <= bounds.right_out)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 *next_start = bounds.right_out;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 for (block = 0; block < Dynarr_length (dba); block++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 struct display_block *db = Dynarr_atp (dba, block);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 if (db->start_pos <= start_pos && db->end_pos > start_pos)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 if ((int) db->type > priority)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 priority = db->type;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 next_display_block = block;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 if (next_start)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 *next_start = db->end_pos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 else if (next_start && db->start_pos > start_pos)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 if (db->start_pos < *next_start)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 *next_start = db->start_pos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 return next_display_block;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 /*****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 get_cursor_size_and_location
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 Return the information defining the pixel location of the cursor.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 ****************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 get_cursor_size_and_location (struct window *w, struct display_block *db,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 int cursor_location,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 int *cursor_start, int *cursor_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 int *cursor_height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 struct rune *rb;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 Lisp_Object window;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 int defheight, defwidth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 if (Dynarr_length (db->runes) <= cursor_location)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 665
diff changeset
379 window = wrap_window (w);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 rb = Dynarr_atp (db->runes, cursor_location);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 *cursor_start = rb->xpos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 default_face_height_and_width (window, &defheight, &defwidth);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385 *cursor_height = defheight;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 if (rb->type == RUNE_BLANK)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 *cursor_width = defwidth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 *cursor_width = rb->width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 /*****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 compare_display_blocks
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 Given two display blocks, output only those areas where they differ.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 ****************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 compare_display_blocks (struct window *w, struct display_line *cdl,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 struct display_line *ddl, int c_block, int d_block,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 int start_pixpos, int cursor_start, int cursor_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 int cursor_height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404 struct frame *f = XFRAME (w->frame);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 struct display_block *cdb, *ddb;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406 int start_pos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 int stop_pos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 int force = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409 int block_end;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 cdb = Dynarr_atp (cdl->display_blocks, c_block);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412 ddb = Dynarr_atp (ddl->display_blocks, d_block);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 assert (cdb->type == ddb->type);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416 start_pos = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 stop_pos = min (Dynarr_length (cdb->runes), Dynarr_length (ddb->runes));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 block_end =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420 (!Dynarr_length (ddb->runes)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 ? 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 : (Dynarr_atp (ddb->runes, Dynarr_length (ddb->runes) - 1)->xpos +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 Dynarr_atp (ddb->runes, Dynarr_length (ddb->runes) - 1)->width));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425 /* If the new block type is not text and the cursor status is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 changing and it overlaps the position of this block then force a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427 full redraw of the block in order to make sure that the cursor is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 updated properly. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 if (ddb->type != TEXT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 #if 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431 /* I'm not sure exactly what this code wants to do, but it's
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 * not right--it doesn't update when cursor_elt changes from, e.g.,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433 * 0 to 8, and the new or old cursor loc overlaps this block.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434 * I've replaced it with the more conservative test below.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 * -dkindred@cs.cmu.edu 23-Mar-1997 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 && ((cdl->cursor_elt == -1 && ddl->cursor_elt != -1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437 || (cdl->cursor_elt != -1 && ddl->cursor_elt == -1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 && (ddl->cursor_elt == -1 ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 (cursor_start
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 && cursor_width
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441 && (cursor_start + cursor_width) >= start_pixpos
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 && cursor_start <= block_end))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 && (cdl->cursor_elt != ddl->cursor_elt)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 force = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449 if (f->windows_structure_changed ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 /* #### Why is this so? We have face cachels so that we don't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 have to recalculate all the display blocks when faces
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 change. I have fixed this for glyphs and am inclined to think
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 that faces should "Just Work", but I'm not feeling brave
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 today. Maybe its because the face cachels represent merged
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 faces rather than simply instantiations in a particular
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 domain. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 f->faces_changed ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 cdl->ypos != ddl->ypos ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459 cdl->ascent != ddl->ascent ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460 cdl->descent != ddl->descent ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 cdl->clip != ddl->clip ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 force)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 start_pos = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465 force = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 int elt = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 while (start_pos < 0 && elt < stop_pos)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 if (!compare_runes (w, Dynarr_atp (cdb->runes, elt),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474 Dynarr_atp (ddb->runes, elt)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476 start_pos = elt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480 elt++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 /* If nothing has changed in the area where the blocks overlap, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 there are new blocks in the desired block, then adjust the start
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 point accordingly. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 if (elt == stop_pos && stop_pos < Dynarr_length (ddb->runes))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488 start_pos = stop_pos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
491 if (start_pos >= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493 if ((Dynarr_length (ddb->runes) != Dynarr_length (cdb->runes))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
494 || force)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 stop_pos = Dynarr_length (ddb->runes);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500 /* If the lines have the same number of runes and we are not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 forcing a full redraw because the display line has
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502 changed position then we try and optimize how much of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503 line we actually redraw by scanning backwards from the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504 end for the first changed rune. This optimization is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505 almost always triggered by face changes. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507 int elt = Dynarr_length (ddb->runes) - 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 while (elt > start_pos)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511 if (!compare_runes (w, Dynarr_atp (cdb->runes, elt),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 Dynarr_atp (ddb->runes, elt)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 elt--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517 stop_pos = elt + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 redisplay_output_display_block (w, ddl, d_block, start_pos,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 stop_pos, start_pixpos,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522 cursor_start, cursor_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 cursor_height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530 /*****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531 clear_left_border
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 Clear the lefthand outside border.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 ****************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 clear_left_border (struct window *w, int y, int height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 struct frame *f = XFRAME (w->frame);
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 665
diff changeset
539 Lisp_Object window = wrap_window (w);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541 redisplay_clear_region (window, DEFAULT_INDEX,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 FRAME_LEFT_BORDER_START (f), y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543 FRAME_BORDER_WIDTH (f), height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 /*****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 clear_right_border
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 Clear the righthand outside border.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 ****************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 clear_right_border (struct window *w, int y, int height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 struct frame *f = XFRAME (w->frame);
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 665
diff changeset
555 Lisp_Object window = wrap_window (w);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557 redisplay_clear_region (window, DEFAULT_INDEX,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558 FRAME_RIGHT_BORDER_START (f),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 y, FRAME_BORDER_WIDTH (f), height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 /*****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 output_display_line
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565 Ensure that the contents of the given display line is correct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566 on-screen. The force_ parameters are used by redisplay_move_cursor
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567 to correctly update cursor locations and only cursor locations.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568 ****************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570 output_display_line (struct window *w, display_line_dynarr *cdla,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571 display_line_dynarr *ddla, int line, int force_start,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572 int force_end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575 struct frame *f = XFRAME (w->frame);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 struct buffer *b = XBUFFER (w->buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577 struct buffer *old_b = window_display_buffer (w);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578 struct display_line *cdl, *ddl;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 display_block_dynarr *cdba, *ddba;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 int start_pixpos, end_pixpos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 int cursor_start, cursor_width, cursor_height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 int force = (force_start >= 0 || force_end >= 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 int clear_border = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 int must_sync = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 if (cdla && line < Dynarr_length (cdla))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 cdl = Dynarr_atp (cdla, line);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 cdba = cdl->display_blocks;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 cdl = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595 cdba = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598 ddl = Dynarr_atp (ddla, line); /* assert line < Dynarr_length (ddla) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599 ddba = ddl->display_blocks;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601 if (force_start >= 0 && force_start >= ddl->bounds.left_out)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 start_pixpos = force_start;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604 start_pixpos = ddl->bounds.left_out;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606 if (force_end >= 0 && force_end < ddl->bounds.right_out)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 end_pixpos = force_end;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609 end_pixpos = ddl->bounds.right_out;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611 /* Get the cursor parameters. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
612 if (ddl->cursor_elt != -1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
614 struct display_block *db;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
615
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
616 /* If the lines cursor parameter is not -1 then it indicates
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
617 which rune in the TEXT block contains the cursor. This means
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618 that there must be at least one display block. The TEXT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619 block, if present, must always be the first display block. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620 assert (Dynarr_length (ddba) != 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
621
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
622 db = Dynarr_atp (ddba, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
623 assert (db->type == TEXT);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
624
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
625 get_cursor_size_and_location (w, db, ddl->cursor_elt, &cursor_start,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
626 &cursor_width, &cursor_height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
627 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
628 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
629 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
630 cursor_start = cursor_width = cursor_height = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
633 /* The modeline should only have a single block and it had better be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
634 a TEXT block. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635 if (ddl->modeline)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
637 /* The shadow thickness check is necessary if only the sign of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638 the size changed. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
639 if (cdba && !w->shadow_thickness_changed)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
640 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641 must_sync |= compare_display_blocks (w, cdl, ddl, 0, 0,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642 start_pixpos, 0, 0, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
644 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
646 redisplay_output_display_block (w, ddl, 0, 0, -1, start_pixpos,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
647 0, 0, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
648 must_sync = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
649 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
650
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
651 if (must_sync)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
652 clear_border = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
653 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
654
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
655 while (!ddl->modeline && start_pixpos < end_pixpos)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
656 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
657 int block;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
658 int next_start_pixpos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
659
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
660 block = get_next_display_block (ddl->bounds, ddba, start_pixpos,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661 &next_start_pixpos);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
663 /* If we didn't find a block then we should blank the area
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
664 between start_pos and next_start if necessary. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665 if (block == NO_BLOCK)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
667 /* We only erase those areas which were actually previously
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
668 covered by a display block unless the window structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
669 changed. In that case we clear all areas since the current
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
670 structures may actually represent a different buffer. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
671 while (start_pixpos < next_start_pixpos)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
672 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
673 int block_end;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
674 int old_block;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
675
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
676 if (cdba)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
677 old_block = get_next_display_block (ddl->bounds, cdba,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
678 start_pixpos, &block_end);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
679 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
680 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
681 old_block = NO_BLOCK;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
682 block_end = next_start_pixpos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
683 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
684
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
685 if (!cdba || old_block != NO_BLOCK || b != old_b ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
686 f->windows_structure_changed ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
687 f->faces_changed ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
688 force ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
689 (cdl && (cdl->ypos != ddl->ypos ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
690 cdl->ascent != ddl->ascent ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
691 cdl->descent != ddl->descent ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
692 cdl->top_clip != ddl->top_clip ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
693 cdl->clip != ddl->clip)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
694 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
695 int x, y, width, height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
696 face_index findex;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
697
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
698 must_sync = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
699 x = start_pixpos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
700 y = DISPLAY_LINE_YPOS (ddl);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
701 width = min (next_start_pixpos, block_end) - x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
702 height = DISPLAY_LINE_HEIGHT (ddl);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
703
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
704 if (x < ddl->bounds.left_in)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
705 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
706 findex = ddl->left_margin_findex ?
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
707 ddl->left_margin_findex
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
708 : get_builtin_face_cache_index (w, Vleft_margin_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
709 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
710 else if (x < ddl->bounds.right_in)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
711 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
712 /* no check here because DEFAULT_INDEX == 0 anyway */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
713 findex = ddl->default_findex;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
714 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
715 else if (x < ddl->bounds.right_out)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
716 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
717 findex = ddl->right_margin_findex ?
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
718 ddl->right_margin_findex
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
719 : get_builtin_face_cache_index (w, Vright_margin_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
720 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
721 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
722 findex = (face_index) -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
723
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
724 if (findex != (face_index) -1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
725 {
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 665
diff changeset
726 Lisp_Object window = wrap_window (w);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
727
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
728
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
729 /* Clear the empty area. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
730 redisplay_clear_region (window, findex, x, y, width, height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
731
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
732 /* Mark that we should clear the border. This is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
733 necessary because italic fonts may leave
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
734 droppings in the border. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
735 clear_border = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
736 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
737 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
738
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
739 start_pixpos = min (next_start_pixpos, block_end);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
740 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
741 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
742 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
743 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
744 struct display_block *cdb, *ddb;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
745 int block_end;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
746 int old_block;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
747
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
748 if (cdba)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
749 old_block = get_next_display_block (ddl->bounds, cdba,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
750 start_pixpos, &block_end);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
751 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
752 old_block = NO_BLOCK;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
753
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
754 ddb = Dynarr_atp (ddba, block);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
755 cdb = (old_block != NO_BLOCK ? Dynarr_atp (cdba, old_block) : 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
756
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
757 /* If there was formerly no block over the current
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
758 region or if it was a block of a different type, then
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
759 output the entire ddb. Otherwise, compare cdb and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
760 ddb and output only the changed region. */
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
761 if (!force && cdb && ddb->type == cdb->type
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
762 /* If there was no buffer being display before the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
763 compare anyway as we might be outputting a gutter. */
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
764 &&
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
765 (b == old_b || !old_b))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
766 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
767 must_sync |= compare_display_blocks (w, cdl, ddl, old_block,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
768 block, start_pixpos,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
769 cursor_start, cursor_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
770 cursor_height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
771 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
772 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
773 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
774 int elt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
775 int first_elt = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
776 int last_elt = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
777
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
778 for (elt = 0; elt < Dynarr_length (ddb->runes); elt++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
779 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
780 struct rune *rb = Dynarr_atp (ddb->runes, elt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
781
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
782 if (start_pixpos >= rb->xpos
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
783 && start_pixpos < rb->xpos + rb->width)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
784 first_elt = elt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
785
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
786 if (end_pixpos > rb->xpos
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
787 && end_pixpos <= rb->xpos + rb->width)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
788 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
789 last_elt = elt + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
790 if (last_elt > Dynarr_length (ddb->runes))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
791 last_elt = Dynarr_length (ddb->runes);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
792 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
793 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
794 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
795
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
796 must_sync = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
797 redisplay_output_display_block (w, ddl, block, first_elt,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
798 last_elt,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
799 start_pixpos,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
800 cursor_start, cursor_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
801 cursor_height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
802 }
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
803
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
804 start_pixpos = next_start_pixpos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
805 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
806 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
807
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
808 /* Clear the internal border if we are next to it and the window
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
809 structure or frame size has changed or if something caused
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
810 clear_border to be tripped. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
811 /* #### Doing this on f->clear sucks but is necessary because of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
812 window-local background values. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
813 if (f->windows_structure_changed || f->faces_changed || clear_border
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
814 || f->clear)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
815 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
816 int y = DISPLAY_LINE_YPOS (ddl);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
817 int height = DISPLAY_LINE_HEIGHT (ddl);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
818
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
819 /* If we are in the gutter then we musn't clear the borders. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
820 if (y >= WINDOW_TEXT_TOP (w) && (y + height) <= WINDOW_TEXT_BOTTOM (w))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
821 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
822 if (ddl->modeline)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
823 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
824 y -= MODELINE_SHADOW_THICKNESS (w);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
825 height += (2 * MODELINE_SHADOW_THICKNESS (w));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
826 }
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
827
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
828 if (window_is_leftmost (w))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
829 clear_left_border (w, y, height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
830 if (window_is_rightmost (w))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
831 clear_right_border (w, y, height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
832 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
833 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
834
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
835 if (cdla)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
836 sync_display_line_structs (w, line, must_sync, cdla, ddla);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
837 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
838
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
839 /*****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
840 redisplay_move_cursor
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
841
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
842 For the given window W, move the cursor to NEW_POINT. Returns a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
843 boolean indicating success or failure.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
844 ****************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
845
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 638
diff changeset
846 #define ADJ_CHARBPOS (rb->charbpos + dl->offset)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
847 #define ADJ_ENDPOS (rb->endpos + dl->offset)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
848
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
849 int
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 638
diff changeset
850 redisplay_move_cursor (struct window *w, Charbpos new_point, int no_output_end)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
851 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
852 struct frame *f = XFRAME (w->frame);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
853 struct device *d = XDEVICE (f->device);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
854
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
855 display_line_dynarr *cla = window_display_lines (w, CURRENT_DISP);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
856 struct display_line *dl;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
857 struct display_block *db;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
858 struct rune *rb;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
859 int x = w->last_point_x[CURRENT_DISP];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
860 int y = w->last_point_y[CURRENT_DISP];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
861
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
862 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
863 * Bail if cursor_in_echo_area is non-zero and we're fiddling with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
864 * the cursor in a non-active minibuffer window, since that is a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
865 * special case that is handled elsewhere and this function need
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
866 * not handle it. Return 1 so the caller will assume we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
867 * succeeded.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
868 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
869 if (cursor_in_echo_area && MINI_WINDOW_P (w) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
870 w != XWINDOW (FRAME_SELECTED_WINDOW (f)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
871 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
872
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
873 if (y < 0 || y >= Dynarr_length (cla))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
874 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
875
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
876 dl = Dynarr_atp (cla, y);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
877 db = get_display_block_from_line (dl, TEXT);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
878
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
879 if (x < 0 || x >= Dynarr_length (db->runes))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
880 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
881
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
882 rb = Dynarr_atp (db->runes, x);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
883
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
884 if (rb->cursor_type == CURSOR_OFF)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
885 return 0;
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 638
diff changeset
886 else if (ADJ_CHARBPOS == new_point
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 638
diff changeset
887 || (ADJ_ENDPOS && (new_point >= ADJ_CHARBPOS)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
888 && (new_point <= ADJ_ENDPOS)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
889 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
890 w->last_point_x[CURRENT_DISP] = x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
891 w->last_point_y[CURRENT_DISP] = y;
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 638
diff changeset
892 Fset_marker (w->last_point[CURRENT_DISP], make_int (ADJ_CHARBPOS),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
893 w->buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
894 dl->cursor_elt = x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
895 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
896 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
897 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
898 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
899 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
900 MAYBE_DEVMETH (d, frame_output_begin, (f));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
901 MAYBE_DEVMETH (d, window_output_begin, (w));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
902 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
903 rb->cursor_type = CURSOR_OFF;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
904 dl->cursor_elt = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
905 output_display_line (w, 0, cla, y, rb->xpos, rb->xpos + rb->width);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
906 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
907
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
908 w->last_point_x[CURRENT_DISP] = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
909 w->last_point_y[CURRENT_DISP] = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
910 Fset_marker (w->last_point[CURRENT_DISP], Qnil, w->buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
911
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
912 /* If this isn't the selected frame, then erasing the old cursor is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
913 all we actually had to do. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
914 if (w != XWINDOW (FRAME_SELECTED_WINDOW (device_selected_frame (d))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
915 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
916 if (!no_output_end)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
917 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
918 MAYBE_DEVMETH (d, window_output_end, (w));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
919 MAYBE_DEVMETH (d, frame_output_end, (f));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
920 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
921
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
922 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
923 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
924
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
925 /* This should only occur in the minibuffer. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
926 if (new_point == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
927 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
928 w->last_point_x[CURRENT_DISP] = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
929 w->last_point_y[CURRENT_DISP] = y;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
930 Fset_marker (w->last_point[CURRENT_DISP], Qzero, w->buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
931
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
932 rb = Dynarr_atp (db->runes, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
933 rb->cursor_type = CURSOR_ON;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
934 dl->cursor_elt = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
935
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
936 output_display_line (w, 0, cla, y, rb->xpos, rb->xpos + rb->width);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
937
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
938 if (!no_output_end)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
939 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
940 MAYBE_DEVMETH (d, window_output_end, (w));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
941 MAYBE_DEVMETH (d, frame_output_end, (f));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
942 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
943 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
944 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
945 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
946 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
947 int cur_rb = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
948 int first = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
949 int cur_dl, up;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
950
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 638
diff changeset
951 if (ADJ_CHARBPOS < new_point)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
952 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
953 up = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
954 cur_rb = x + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
955 cur_dl = y;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
956 }
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 638
diff changeset
957 else /* (rb->charbpos + dl->offset) > new_point */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
958 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
959 up = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
960
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
961 if (!x)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
962 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
963 cur_dl = y - 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
964 first = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
965 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
966 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
967 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
968 cur_rb = x - 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
969 cur_dl = y;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
970 first = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
971 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
972 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
973
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
974 while (up ? (cur_dl < Dynarr_length (cla)) : (cur_dl >= 0))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
975 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
976 dl = Dynarr_atp (cla, cur_dl);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
977 db = get_display_block_from_line (dl, TEXT);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
978
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
979 if (!up && !first)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
980 cur_rb = Dynarr_length (db->runes) - 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
981
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
982 while ((!scroll_on_clipped_lines || !dl->clip) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
983 (up ? (cur_rb < Dynarr_length (db->runes)) : (cur_rb >= 0)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
984 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
985 rb = Dynarr_atp (db->runes, cur_rb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
986
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
987 if (rb->cursor_type != IGNORE_CURSOR
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
988 && rb->cursor_type != NO_CURSOR &&
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 638
diff changeset
989 (ADJ_CHARBPOS == new_point
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 638
diff changeset
990 || (ADJ_ENDPOS && (new_point >= ADJ_CHARBPOS)
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 638
diff changeset
991 && (new_point <= ADJ_CHARBPOS))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
992 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
993 rb->cursor_type = CURSOR_ON;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
994 dl->cursor_elt = cur_rb;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
995
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
996
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
997 output_display_line (w, 0, cla, cur_dl, rb->xpos,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
998 rb->xpos + rb->width);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
999
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1000 w->last_point_x[CURRENT_DISP] = cur_rb;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1001 w->last_point_y[CURRENT_DISP] = cur_dl;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1002 Fset_marker (w->last_point[CURRENT_DISP],
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 638
diff changeset
1003 make_int (ADJ_CHARBPOS), w->buffer);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1004
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1005 if (!no_output_end)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1006 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1007 MAYBE_DEVMETH (d, window_output_end, (w));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1008 MAYBE_DEVMETH (d, frame_output_end, (f));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1009 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1010 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1011 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1012
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1013 (up ? cur_rb++ : cur_rb--);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1014 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1015
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1016 (up ? (cur_rb = 0) : (first = 0));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1017 (up ? cur_dl++ : cur_dl--);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1018 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1019 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1020
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1021 if (!no_output_end)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1022 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1023 MAYBE_DEVMETH (d, window_output_end, (w));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1024 MAYBE_DEVMETH (d, frame_output_end, (f));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1025 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1026 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1027 }
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 638
diff changeset
1028 #undef ADJ_CHARBPOS
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1029 #undef ADJ_ENDPOS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1030
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1031 /*****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1032 redraw_cursor_in_window
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1033
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1034 For the given window W, redraw the cursor if it is contained within
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1035 the window.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1036 ****************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1037 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1038 redraw_cursor_in_window (struct window *w, int run_end_begin_meths)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1039 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1040 struct frame *f = XFRAME (w->frame);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1041 struct device *d = XDEVICE (f->device);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1042
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1043 display_line_dynarr *dla = window_display_lines (w, CURRENT_DISP);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1044 struct display_line *dl;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1045 struct display_block *db;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1046 struct rune *rb;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1047
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1048 int x = w->last_point_x[CURRENT_DISP];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1049 int y = w->last_point_y[CURRENT_DISP];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1050
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1051 if (cursor_in_echo_area && MINI_WINDOW_P (w) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1052 !echo_area_active (f) && minibuf_level == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1053 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1054 MAYBE_DEVMETH (d, set_final_cursor_coords, (f, w->pixel_top, 0));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1055 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1056
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1057 if (y < 0 || y >= Dynarr_length (dla))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1058 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1059
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1060 if (MINI_WINDOW_P (w) && f != device_selected_frame (d) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1061 !is_surrogate_for_selected_frame (f))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1062 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1063
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1064 dl = Dynarr_atp (dla, y);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1065 db = get_display_block_from_line (dl, TEXT);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1066
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1067 if (x < 0 || x >= Dynarr_length (db->runes))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1068 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1069
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1070 rb = Dynarr_atp (db->runes, x);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1071
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1072 /* Don't call the output routine if the block isn't actually the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1073 cursor. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1074 if (rb->cursor_type == CURSOR_ON)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1075 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1076 MAYBE_DEVMETH (d, set_final_cursor_coords,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1077 (f, dl->ypos - 1, rb->xpos));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1078
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1079 if (run_end_begin_meths)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1080 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1081 MAYBE_DEVMETH (d, frame_output_begin, (f));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1082 MAYBE_DEVMETH (d, window_output_begin, (w));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1083 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1084
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1085 output_display_line (w, 0, dla, y, rb->xpos, rb->xpos + rb->width);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1086
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1087 if (run_end_begin_meths)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1088 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1089 MAYBE_DEVMETH (d, window_output_end, (w));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1090 MAYBE_DEVMETH (d, frame_output_end, (f));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1091 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1092 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1093 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1094
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1095 /*****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1096 redisplay_redraw_cursor
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1097
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1098 For the given frame F, redraw the cursor on the selected window.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1099 This is used to update the cursor after focus changes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1100 ****************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1101 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1102 redisplay_redraw_cursor (struct frame *f, int run_end_begin_meths)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1103 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1104 Lisp_Object window;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1105
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1106 if (!cursor_in_echo_area)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1107 window = FRAME_SELECTED_WINDOW (f);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1108 else if (FRAME_HAS_MINIBUF_P (f))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1109 window = FRAME_MINIBUF_WINDOW (f);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1110 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1111 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1112
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1113 redraw_cursor_in_window (XWINDOW (window), run_end_begin_meths);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1114 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1115
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1116 /****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1117 redisplay_output_display_block
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1118
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1119 Given a display line, a block number for that start line, output all
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1120 runes between start and end in the specified display block.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1121 ****************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1122 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1123 redisplay_output_display_block (struct window *w, struct display_line *dl, int block,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1124 int start, int end, int start_pixpos, int cursor_start,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1125 int cursor_width, int cursor_height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1126 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1127 struct frame *f = XFRAME (w->frame);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1128 struct device *d = XDEVICE (f->device);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1129 /* Temporarily disabled until generalization is done. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1130 #if 0
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1131 struct display_block *db = Dynarr_atp (dl->display_blocks, block);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1132 rune_dynarr *rba = db->runes;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1133 struct rune *rb;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1134 int xpos, width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1135 rb = Dynarr_atp (rba, start);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1136
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1137 if (!rb)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1138 /* Nothing to do so don't do anything. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1139 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1140
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1141 xpos = max (start_pixpos, rb->xpos);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1142
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1143 if (end < 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1144 end = Dynarr_length (rba);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1145
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1146 rb = Dynarr_atp (rba, end - 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1147 width = rb->xpos + rb->width - xpos;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1148 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1149 /* now actually output the block. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1150 DEVMETH (d, output_display_block, (w, dl, block, start,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1151 end, start_pixpos,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1152 cursor_start, cursor_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1153 cursor_height));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1154 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1155
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1156 /****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1157 redisplay_unmap_subwindows
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1158
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1159 Remove subwindows from the area in the box defined by the given
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1160 parameters.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1161 ****************************************************************************/
448
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1162 static void
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1163 redisplay_unmap_subwindows (struct frame* f, int x, int y, int width, int height,
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1164 Lisp_Object ignored_window)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1165 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1166 Lisp_Object rest;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1167
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1168 LIST_LOOP (rest, XWEAK_LIST_LIST (FRAME_SUBWINDOW_CACHE (f)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1169 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1170 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (XCAR (rest));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1171 if (IMAGE_INSTANCE_SUBWINDOW_DISPLAYEDP (ii)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1172 &&
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1173 IMAGE_INSTANCE_DISPLAY_X (ii)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1174 + IMAGE_INSTANCE_DISPLAY_WIDTH (ii) > x
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1175 &&
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1176 IMAGE_INSTANCE_DISPLAY_X (ii) < x + width
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1177 &&
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1178 IMAGE_INSTANCE_DISPLAY_Y (ii)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1179 + IMAGE_INSTANCE_DISPLAY_HEIGHT (ii) > y
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1180 &&
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1181 IMAGE_INSTANCE_DISPLAY_Y (ii) < y + height
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1182 &&
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1183 !EQ (XCAR (rest), ignored_window))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1184 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1185 unmap_subwindow (XCAR (rest));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1186 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1187 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1188 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1189
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1190 /****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1191 redisplay_unmap_subwindows_maybe
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1192
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1193 Potentially subwindows from the area in the box defined by the given
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1194 parameters.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1195 ****************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1196 void redisplay_unmap_subwindows_maybe (struct frame* f, int x, int y, int width, int height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1197 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1198 if (!NILP (XWEAK_LIST_LIST (FRAME_SUBWINDOW_CACHE (f))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1199 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1200 redisplay_unmap_subwindows (f, x, y, width, height, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1201 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1202 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1203
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1204 static void redisplay_unmap_subwindows_except_us (struct frame* f, int x, int y, int width,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1205 int height, Lisp_Object subwindow)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1206 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1207 if (!NILP (XWEAK_LIST_LIST (FRAME_SUBWINDOW_CACHE (f))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1208 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1209 redisplay_unmap_subwindows (f, x, y, width, height, subwindow);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1210 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1211 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1212
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1213 /****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1214 redisplay_output_subwindow
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1215
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1216 output a subwindow. This code borrows heavily from the pixmap stuff,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1217 although is much simpler not needing to account for partial
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1218 pixmaps, backgrounds etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1219 ****************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1220 void
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1221 redisplay_output_subwindow (struct window *w,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1222 Lisp_Object image_instance,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1223 struct display_box* db, struct display_glyph_area* dga,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1224 face_index findex, int cursor_start, int cursor_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1225 int cursor_height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1226 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1227 Lisp_Image_Instance *p = XIMAGE_INSTANCE (image_instance);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1228 Lisp_Object window;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1229 struct display_glyph_area sdga;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1230
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1231 dga->height = IMAGE_INSTANCE_HEIGHT (p);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1232 dga->width = IMAGE_INSTANCE_WIDTH (p);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1233
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1234 /* The first thing we are going to do is update the display
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1235 characteristics of the subwindow. This also clears the dirty
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1236 flags as a side effect. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1237 redisplay_subwindow (image_instance);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1238
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1239 /* This makes the glyph area fit into the display area. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1240 if (!redisplay_normalize_glyph_area (db, dga))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1241 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1242
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 665
diff changeset
1243 window = wrap_window (w);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1244
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1245 /* Clear the area the subwindow is going into. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1246 redisplay_clear_clipped_region (window, findex,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1247 db, dga, 0, image_instance);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1248
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1249 /* This shrinks the display box to exactly enclose the glyph
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1250 area. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1251 redisplay_normalize_display_box (db, dga);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1252
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1253 /* if we can't view the whole window we can't view any of it. We
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1254 have to be careful here since we may be being asked to display
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1255 part of a subwindow, the rest of which is on-screen as well. We
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1256 need to allow this case and map the entire subwindow. We also
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1257 need to be careful since the subwindow could be outside the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1258 window in the gutter or modeline - we also need to allow these
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1259 cases.*/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1260 sdga.xoffset = -dga->xoffset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1261 sdga.yoffset = -dga->yoffset;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1262 sdga.height = IMAGE_INSTANCE_HEIGHT (p);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1263 sdga.width = IMAGE_INSTANCE_WIDTH (p);
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1264
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
1265 if (redisplay_display_boxes_in_window_p (w, db, &sdga) == 0
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
1266 ||
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
1267 /* We only want to do full subwindow display for windows that
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
1268 are completely in the gutter, otherwise we must clip to be
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
1269 safe. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
1270 display_boxes_in_gutter_p (XFRAME (w->frame), db, &sdga) <= 0)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1271 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1272 map_subwindow (image_instance, db->xpos, db->ypos, dga);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1273 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1274 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1275 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1276 sdga.xoffset = sdga.yoffset = 0;
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1277 map_subwindow (image_instance, db->xpos - dga->xoffset,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1278 db->ypos - dga->yoffset, &sdga);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1279 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1280 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1281
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1282 /****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1283 redisplay_output_layout
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1284
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1285 Output a widget hierarchy. This can safely call itself recursively.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1286
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1287 The complexity of outputting layouts is deciding whether to do it or
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1288 not. Consider a layout enclosing some text, the text changes and is
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1289 marked as dirty, but the enclosing layout has not been marked as
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1290 dirty so no updates occur and the text will potentially be truncated.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1291 Alternatively we hold a back pointer in the image instance to the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1292 parent and mark the parent as dirty. But the layout code assumes that
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1293 if the layout is dirty then the whole layout should be redisplayed,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1294 so we then get lots of flashing even though only the text has changed
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1295 size. Of course if the text shrinks in size then we do actually need
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1296 to redisplay the layout to repaint the exposed area. So what happens
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1297 if we make a non-structural change like changing color? Either we
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1298 redisplay everything, or we redisplay nothing. These are exactly the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1299 issues lwlib has to grapple with. We really need to know what has
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1300 actually changed and make a layout decision based on that. We also
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1301 really need to know what has changed so that we can only make the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1302 necessary changes in update_subwindow. This has all now been
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1303 implemented, Viva la revolution!
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1304 ****************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1305 void
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1306 redisplay_output_layout (Lisp_Object domain,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1307 Lisp_Object image_instance,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1308 struct display_box* db, struct display_glyph_area* dga,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1309 face_index findex, int cursor_start, int cursor_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1310 int cursor_height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1311 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1312 Lisp_Image_Instance *p = XIMAGE_INSTANCE (image_instance);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1313 Lisp_Object rest, window = DOMAIN_WINDOW (domain);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1314 Emchar_dynarr *buf = Dynarr_new (Emchar);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1315 struct window *w = XWINDOW (window);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1316 struct device *d = DOMAIN_XDEVICE (domain);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1317 int layout_height, layout_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1318
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1319 layout_height = glyph_height (image_instance, domain);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1320 layout_width = glyph_width (image_instance, domain);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1321
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1322 dga->height = layout_height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1323 dga->width = layout_width;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1324 #ifdef DEBUG_WIDGET_OUTPUT
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1325 printf ("outputing layout glyph %p\n", p);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1326 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1327 /* This makes the glyph area fit into the display area. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1328 if (!redisplay_normalize_glyph_area (db, dga))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1329 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1330
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1331 /* Highly dodgy optimization. We want to only output the whole
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1332 layout if we really have to. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1333 if (!IMAGE_INSTANCE_OPTIMIZE_OUTPUT (p)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1334 || IMAGE_INSTANCE_LAYOUT_CHANGED (p)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1335 || IMAGE_INSTANCE_WIDGET_FACE_CHANGED (p)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1336 || IMAGE_INSTANCE_SIZE_CHANGED (p)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1337 || IMAGE_INSTANCE_WIDGET_ITEMS_CHANGED (p))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1338 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1339 /* First clear the area we are drawing into. This is the easiest
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1340 thing to do since we have many gaps that we have to make sure are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1341 filled in. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1342 redisplay_clear_clipped_region (window, findex, db, dga, 1, Qnil);
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1343
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1344 /* Output a border if required */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1345 if (!NILP (IMAGE_INSTANCE_LAYOUT_BORDER (p)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1346 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1347 int edges = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1348 enum edge_style style;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1349 int ypos = db->ypos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1350 int height = dga->height;
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1351
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1352 if (dga->xoffset >= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1353 edges |= EDGE_LEFT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1354 if (dga->width - dga->xoffset == layout_width)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1355 edges |= EDGE_RIGHT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1356 if (dga->yoffset >= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1357 edges |= EDGE_TOP;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1358 if (dga->height - dga->yoffset == layout_height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1359 edges |= EDGE_BOTTOM;
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1360
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1361 if (EQ (IMAGE_INSTANCE_LAYOUT_BORDER (p), Qetched_in))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1362 style = EDGE_ETCHED_IN;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1363 else if (EQ (IMAGE_INSTANCE_LAYOUT_BORDER (p), Qetched_out))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1364 style = EDGE_ETCHED_OUT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1365 else if (EQ (IMAGE_INSTANCE_LAYOUT_BORDER (p), Qbevel_in))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1366 style = EDGE_BEVEL_IN;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1367 else if (INTP (IMAGE_INSTANCE_LAYOUT_BORDER (p)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1368 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1369 style = EDGE_ETCHED_IN;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1370 if (edges & EDGE_TOP)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1371 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1372 ypos += XINT (IMAGE_INSTANCE_LAYOUT_BORDER (p));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1373 height -= XINT (IMAGE_INSTANCE_LAYOUT_BORDER (p));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1374 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1375 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1376 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1377 style = EDGE_BEVEL_OUT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1378
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1379 MAYBE_DEVMETH (d, bevel_area,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1380 (w, findex, db->xpos,
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1381 ypos,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1382 dga->width, height, 2, edges, style));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1383 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1384 }
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1385
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1386 /* This shrinks the display box to exactly enclose the glyph
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1387 area. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1388 redisplay_normalize_display_box (db, dga);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1389
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1390 /* Flip through the widgets in the layout displaying as necessary */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1391 LIST_LOOP (rest, IMAGE_INSTANCE_LAYOUT_CHILDREN (p))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1392 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1393 Lisp_Object child = glyph_image_instance (XCAR (rest), image_instance,
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 665
diff changeset
1394 ERROR_ME_DEBUG_WARN, 1);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1395
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1396 struct display_box cdb;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1397 /* For losing HP-UX */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1398 cdb.xpos = db->xpos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1399 cdb.ypos = db->ypos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1400 cdb.width = db->width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1401 cdb.height = db->height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1402
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1403 /* First determine if the image is visible at all */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1404 if (IMAGE_INSTANCEP (child))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1405 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1406 Lisp_Image_Instance* childii = XIMAGE_INSTANCE (child);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1407
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1408 /* The enclosing layout offsets are +ve at this point */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1409 struct display_glyph_area cdga;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1410 cdga.xoffset = IMAGE_INSTANCE_XOFFSET (childii) - dga->xoffset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1411 cdga.yoffset = IMAGE_INSTANCE_YOFFSET (childii) - dga->yoffset;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1412 cdga.width = glyph_width (child, image_instance);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1413 cdga.height = glyph_height (child, image_instance);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1414
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1415 IMAGE_INSTANCE_OPTIMIZE_OUTPUT (childii) =
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1416 IMAGE_INSTANCE_OPTIMIZE_OUTPUT (p);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1417
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1418 /* Although normalization is done by the output routines
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1419 we have to do it here so that they don't try and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1420 clear all of db. This is true below also. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1421 if (redisplay_normalize_glyph_area (&cdb, &cdga))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1422 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1423 redisplay_normalize_display_box (&cdb, &cdga);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1424 /* Since the display boxes will now be totally in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1425 window if they are visible at all we can now check this easily. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1426 if (cdb.xpos < db->xpos || cdb.ypos < db->ypos
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1427 || cdb.xpos + cdb.width > db->xpos + db->width
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1428 || cdb.ypos + cdb.height > db->ypos + db->height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1429 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1430 /* We have to invert the offset here as normalization
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1431 will have made them positive which the output
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1432 routines will treat as a truly +ve offset. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1433 cdga.xoffset = -cdga.xoffset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1434 cdga.yoffset = -cdga.yoffset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1435
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1436 switch (IMAGE_INSTANCE_TYPE (childii))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1437 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1438 case IMAGE_TEXT:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1439 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1440 /* #### This is well hacked and could use some
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1441 generalisation.*/
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1442 if (redisplay_normalize_glyph_area (&cdb, &cdga)
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1443 &&
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1444 (!IMAGE_INSTANCE_OPTIMIZE_OUTPUT (childii) ||
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1445 IMAGE_INSTANCE_DIRTYP (childii)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1446 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1447 struct display_line dl; /* this is fake */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1448 Lisp_Object string =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1449 IMAGE_INSTANCE_TEXT_STRING (childii);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1450 unsigned char charsets[NUM_LEADING_BYTES];
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1451 struct face_cachel *cachel = WINDOW_FACE_CACHEL (w, findex);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1452
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 638
diff changeset
1453 find_charsets_in_intbyte_string (charsets,
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1454 XSTRING_DATA (string),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1455 XSTRING_LENGTH (string));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1456 ensure_face_cachel_complete (cachel, window, charsets);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1457
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 638
diff changeset
1458 convert_intbyte_string_into_emchar_dynarr
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1459 (XSTRING_DATA (string), XSTRING_LENGTH (string), buf);
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1460
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1461 redisplay_normalize_display_box (&cdb, &cdga);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1462 /* Offsets are now +ve again so be careful
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1463 when fixing up the display line. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1464 xzero (dl);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1465 /* Munge boxes into display lines. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1466 dl.ypos = (cdb.ypos - cdga.yoffset)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1467 + glyph_ascent (child, image_instance);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1468 dl.ascent = glyph_ascent (child, image_instance);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1469 dl.descent = glyph_descent (child, image_instance);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1470 dl.top_clip = cdga.yoffset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1471 dl.clip = (dl.ypos + dl.descent) - (cdb.ypos + cdb.height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1472 /* output_string doesn't understand offsets in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1473 the same way as other routines - we have to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1474 add the offset to the width so that we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1475 output the full string. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1476 MAYBE_DEVMETH (d, output_string, (w, &dl, buf, cdb.xpos,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1477 cdga.xoffset, cdb.xpos,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1478 cdga.width + cdga.xoffset,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1479 findex, 0, 0, 0, 0));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1480 Dynarr_reset (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1481 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1482 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1483 break;
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1484
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1485 case IMAGE_MONO_PIXMAP:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1486 case IMAGE_COLOR_PIXMAP:
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1487 if (!IMAGE_INSTANCE_OPTIMIZE_OUTPUT (childii)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1488 || IMAGE_INSTANCE_DIRTYP (childii))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1489 redisplay_output_pixmap (w, child, &cdb, &cdga, findex,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1490 0, 0, 0, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1491 break;
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1492
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1493 case IMAGE_WIDGET:
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1494 if (EQ (IMAGE_INSTANCE_WIDGET_TYPE (childii), Qlayout))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1495 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1496 redisplay_output_layout (image_instance, child, &cdb, &cdga, findex,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1497 0, 0, 0);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1498 break;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1499 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1500 case IMAGE_SUBWINDOW:
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1501 if (!IMAGE_INSTANCE_OPTIMIZE_OUTPUT (childii) ||
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1502 IMAGE_INSTANCE_DIRTYP (childii))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1503 redisplay_output_subwindow (w, child, &cdb, &cdga, findex,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1504 0, 0, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1505 break;
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1506
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1507 case IMAGE_NOTHING:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1508 /* nothing is as nothing does */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1509 break;
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1510
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1511 case IMAGE_POINTER:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1512 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1513 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1514 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1515 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1516 IMAGE_INSTANCE_OPTIMIZE_OUTPUT (childii) = 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1517 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1518 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1519
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1520 /* Update any display properties. I'm not sure whether this actually
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1521 does anything for layouts except clear the changed flags. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1522 redisplay_subwindow (image_instance);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1523
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1524 Dynarr_free (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1525 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1526
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1527 /****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1528 redisplay_output_pixmap
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1529
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1530
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1531 output a pixmap.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1532 ****************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1533 void
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1534 redisplay_output_pixmap (struct window *w,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1535 Lisp_Object image_instance,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1536 struct display_box* db, struct display_glyph_area* dga,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1537 face_index findex, int cursor_start, int cursor_width,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1538 int cursor_height, int offset_bitmap)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1539 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1540 struct frame *f = XFRAME (w->frame);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1541 struct device *d = XDEVICE (f->device);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1542 Lisp_Image_Instance *p = XIMAGE_INSTANCE (image_instance);
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 665
diff changeset
1543 Lisp_Object window = wrap_window (w);
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 665
diff changeset
1544
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1545
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1546 dga->height = IMAGE_INSTANCE_PIXMAP_HEIGHT (p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1547 dga->width = IMAGE_INSTANCE_PIXMAP_WIDTH (p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1548
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1549 /* This makes the glyph area fit into the display area. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1550 if (!redisplay_normalize_glyph_area (db, dga))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1551 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1552
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1553 /* Clear the area the pixmap is going into. The pixmap itself will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1554 always take care of the full width. We don't want to clear where
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1555 it is going to go in order to avoid flicker. So, all we have to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1556 take care of is any area above or below the pixmap. If the pixmap
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1557 has a mask in which case we have to clear the whole damn thing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1558 since we can't yet clear just the area not included in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1559 mask. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1560 if (!offset_bitmap)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1561 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1562 redisplay_clear_clipped_region (window, findex,
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1563 db, dga,
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1564 (IMAGE_INSTANCE_PIXMAP_MASK (p) != 0),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1565 Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1566
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1567 /* This shrinks the display box to exactly enclose the glyph
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1568 area. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1569 redisplay_normalize_display_box (db, dga);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1570 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1571 assert (db->xpos >= 0 && db->ypos >= 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1572
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1573 MAYBE_DEVMETH (d, output_pixmap, (w, image_instance,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1574 db, dga,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1575 findex, cursor_start,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1576 cursor_width, cursor_height,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1577 offset_bitmap));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1578 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1579
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1580 /****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1581 redisplay_clear_region
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1582
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1583 Clear the area in the box defined by the given parameters using the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1584 given face. This has been generalised so that subwindows can be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1585 coped with effectively.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1586 ****************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1587 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1588 redisplay_clear_region (Lisp_Object locale, face_index findex, int x, int y,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1589 int width, int height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1590 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1591 struct window *w = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1592 struct frame *f = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1593 struct device *d;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1594 Lisp_Object background_pixmap = Qunbound;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1595 Lisp_Object fcolor = Qnil, bcolor = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1596
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1597 if (!width || !height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1598 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1599
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1600 if (WINDOWP (locale))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1601 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1602 w = XWINDOW (locale);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1603 f = XFRAME (w->frame);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1604 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1605 else if (FRAMEP (locale))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1606 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1607 w = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1608 f = XFRAME (locale);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1609 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1610 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1611 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1612
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1613 d = XDEVICE (f->device);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1614
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1615 /* if we have subwindows in the region we have to unmap them */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1616 redisplay_unmap_subwindows_maybe (f, x, y, width, height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1617
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1618 /* #### This isn't quite right for when this function is called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1619 from the toolbar code. */
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1620
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1621 /* Don't use a backing pixmap in the border area */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1622 if (x >= FRAME_LEFT_BORDER_END (f)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1623 && x < FRAME_RIGHT_BORDER_START (f)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1624 && y >= FRAME_TOP_BORDER_END (f)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1625 && y < FRAME_BOTTOM_BORDER_START (f))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1626 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1627 Lisp_Object temp;
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1628
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1629 if (w)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1630 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1631 temp = WINDOW_FACE_CACHEL_BACKGROUND_PIXMAP (w, findex);
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1632
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1633 if (IMAGE_INSTANCEP (temp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1634 && IMAGE_INSTANCE_PIXMAP_TYPE_P (XIMAGE_INSTANCE (temp)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1635 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1636 /* #### maybe we could implement such that a string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1637 can be a background pixmap? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1638 background_pixmap = temp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1639 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1640 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1641 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1642 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1643 temp = FACE_BACKGROUND_PIXMAP (Vdefault_face, locale);
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1644
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1645 if (IMAGE_INSTANCEP (temp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1646 && IMAGE_INSTANCE_PIXMAP_TYPE_P (XIMAGE_INSTANCE (temp)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1647 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1648 background_pixmap = temp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1649 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1650 }
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1651 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1652
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1653 if (!UNBOUNDP (background_pixmap) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1654 XIMAGE_INSTANCE_PIXMAP_DEPTH (background_pixmap) == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1655 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1656 if (w)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1657 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1658 fcolor = WINDOW_FACE_CACHEL_FOREGROUND (w, findex);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1659 bcolor = WINDOW_FACE_CACHEL_BACKGROUND (w, findex);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1660 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1661 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1662 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1663 fcolor = FACE_FOREGROUND (Vdefault_face, locale);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1664 bcolor = FACE_BACKGROUND (Vdefault_face, locale);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1665 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1666 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1667 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1668 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1669 fcolor = (w ?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1670 WINDOW_FACE_CACHEL_BACKGROUND (w, findex) :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1671 FACE_BACKGROUND (Vdefault_face, locale));
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1672
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1673 }
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1674
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1675 if (UNBOUNDP (background_pixmap))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1676 background_pixmap = Qnil;
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1677
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1678 DEVMETH (d, clear_region,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1679 (locale, d, f, findex, x, y, width, height, fcolor, bcolor, background_pixmap));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1680 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1681
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1682 /****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1683 redisplay_clear_clipped_region
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1684
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1685 Clear the area in the dest display_box not covered by the src
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1686 display_glyph_area using the given face. This is a common occurrence
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1687 for images shorter than the display line. Clipping can be played
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1688 around with by altering these. glyphsrc should be normalized.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1689 ****************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1690 static void
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1691 redisplay_clear_clipped_region (Lisp_Object window, face_index findex,
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1692 struct display_box* dest, struct display_glyph_area* glyphsrc,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1693 int fullheight_p, Lisp_Object ignored_subwindow)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1694 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1695 /* assume dest->xpos >= 0 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1696 int clear_x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1697 struct frame* f = XFRAME (XWINDOW (window)->frame);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1698
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1699 if (glyphsrc->xoffset > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1700 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1701 clear_x = dest->xpos + glyphsrc->xoffset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1702 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1703 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1704 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1705 clear_x = dest->xpos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1706 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1707
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1708 /* If we need the whole height cleared then just do it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1709 if (fullheight_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1710 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1711 redisplay_clear_region (window, findex, clear_x, dest->ypos,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1712 glyphsrc->width, dest->height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1713 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1714 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1715 {
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1716 int yoffset = (glyphsrc->yoffset > 0 ? glyphsrc->yoffset : 0);
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1717
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1718 /* We need to make sure that subwindows are unmapped from the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1719 whole area. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1720 redisplay_unmap_subwindows_except_us (f, clear_x, dest->ypos,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1721 glyphsrc->width, dest->height,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1722 ignored_subwindow);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1723 /* first the top box */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1724 if (yoffset > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1725 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1726 redisplay_clear_region (window, findex, clear_x, dest->ypos,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1727 glyphsrc->width, yoffset);
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1728
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1729 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1730 /* Then the bottom box */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1731 if (yoffset + glyphsrc->height < dest->height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1732 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1733 redisplay_clear_region (window, findex, clear_x,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1734 dest->ypos + yoffset + glyphsrc->height,
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1735 glyphsrc->width,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1736 dest->height - (yoffset + glyphsrc->height));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1737
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1738 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1739 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1740 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1741
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1742 /*****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1743 redisplay_normalize_glyph_area
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1744 redisplay_normalize_display_box
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1745
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1746 Calculate the visible box for displaying src in dest.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1747 ****************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1748 int
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1749 redisplay_normalize_glyph_area (struct display_box* dest,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1750 struct display_glyph_area* glyphsrc)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1751 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1752 if (dest->xpos + glyphsrc->xoffset > dest->xpos + dest->width
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1753 ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1754 dest->ypos + glyphsrc->yoffset > dest->ypos + dest->height
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1755 ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1756 -glyphsrc->xoffset >= glyphsrc->width
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1757 ||
448
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1758 -glyphsrc->yoffset >= glyphsrc->height
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1759 ||
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1760 /* #### Not sure why this wasn't coped with before but normalizing
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1761 to zero width or height is definitely wrong. */
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1762 (dest->xpos + glyphsrc->xoffset + glyphsrc->width > dest->xpos + dest->width
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1763 &&
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1764 dest->width - glyphsrc->xoffset <= 0)
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1765 ||
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1766 (dest->ypos + glyphsrc->yoffset + glyphsrc->height > dest->ypos + dest->height
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1767 &&
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1768 dest->height - glyphsrc->yoffset <= 0))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1769 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1770 /* It's all clipped out */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1771 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1772 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1773
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1774 /* Horizontal offsets. This works because xoffset can be -ve as well as +ve */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1775 if (dest->xpos + glyphsrc->xoffset + glyphsrc->width > dest->xpos + dest->width)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1776 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1777 if (glyphsrc->xoffset > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1778 glyphsrc->width = dest->width - glyphsrc->xoffset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1779 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1780 glyphsrc->width = dest->width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1781 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1782
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1783 if (glyphsrc->xoffset < 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1784 glyphsrc->width += glyphsrc->xoffset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1785
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1786 /* Vertical offsets. This works because yoffset can be -ve as well as +ve */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1787 if (dest->ypos + glyphsrc->yoffset + glyphsrc->height > dest->ypos + dest->height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1788 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1789 if (glyphsrc->yoffset > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1790 glyphsrc->height = dest->height - glyphsrc->yoffset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1791 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1792 glyphsrc->height = dest->height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1793 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1794
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1795 if (glyphsrc->yoffset < 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1796 glyphsrc->height += glyphsrc->yoffset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1797
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1798 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1799 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1800
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1801 static void
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1802 redisplay_normalize_display_box (struct display_box* dest,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1803 struct display_glyph_area* glyphsrc)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1804 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1805 /* Adjust the destination area. At the end of this the destination
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1806 area will exactly enclose the glyph area. The only remaining
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1807 adjustment will be offsets into the glyph area. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1808
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1809 /* Horizontal adjustment. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1810 if (glyphsrc->xoffset > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1811 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1812 dest->xpos += glyphsrc->xoffset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1813 dest->width -= glyphsrc->xoffset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1814 glyphsrc->xoffset = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1815 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1816 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1817 glyphsrc->xoffset = -glyphsrc->xoffset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1818
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1819 if (glyphsrc->width < dest->width)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1820 dest->width = glyphsrc->width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1821
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1822 /* Vertical adjustment. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1823 if (glyphsrc->yoffset > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1824 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1825 dest->ypos += glyphsrc->yoffset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1826 dest->height -= glyphsrc->yoffset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1827 glyphsrc->yoffset = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1828 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1829 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1830 glyphsrc->yoffset = -glyphsrc->yoffset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1831
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1832 if (glyphsrc->height < dest->height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1833 dest->height = glyphsrc->height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1834 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1835
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1836 /*****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1837 redisplay_display_boxes_in_window_p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1838
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
1839 Determine whether the required display_glyph_area is completely inside
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
1840 the window. -1 means the display_box is not in the window. 1 means the
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
1841 display_box and the display_glyph_area are in the window. 0 means
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1842 the display_box is in the window but the display_glyph_area is not.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1843 ****************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1844 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1845 redisplay_display_boxes_in_window_p (struct window* w,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1846 struct display_box* db,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1847 struct display_glyph_area* dga)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1848 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1849 int left = WINDOW_TEXT_LEFT (w);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1850 int right = WINDOW_TEXT_RIGHT (w);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1851 int top = WINDOW_TEXT_TOP (w);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1852 int bottom = WINDOW_TEXT_BOTTOM (w);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1853
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1854 if (db->xpos < left || db->ypos < top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1855 || db->xpos + db->width > right
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1856 || db->ypos + db->height > bottom)
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
1857 /* We are not displaying in a window at all */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
1858 return -1;
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1859
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1860 if (db->xpos + dga->xoffset >= left
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1861 &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1862 db->ypos + dga->yoffset >= top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1863 &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1864 db->xpos + dga->xoffset + dga->width <= right
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1865 &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1866 db->ypos + dga->yoffset + dga->height <= bottom)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1867 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1868
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
1869 return 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1870 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1871
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1872 /*****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1873 redisplay_calculate_display_boxes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1874
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1875 Convert from rune/display_line co-ordinates to display_box
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1876 co-ordinates.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1877 ****************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1878 int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1879 redisplay_calculate_display_boxes (struct display_line *dl, int xpos,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1880 int xoffset, int start_pixpos, int width,
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1881 struct display_box* dest,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1882 struct display_glyph_area* src)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1883 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1884 dest->xpos = xpos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1885 dest->ypos = DISPLAY_LINE_YPOS (dl);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1886 dest->width = width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1887 dest->height = DISPLAY_LINE_HEIGHT (dl);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1888
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1889 src->xoffset = -xoffset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1890 src->yoffset = -dl->top_clip;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1891 src->width = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1892 src->height = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1893
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1894 if (start_pixpos >=0 && start_pixpos > xpos)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1895 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1896 /* Oops, we're asking for a start outside of the displayable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1897 area. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1898 if (start_pixpos > xpos + width)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1899 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1900 dest->xpos = start_pixpos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1901 dest->width -= (start_pixpos - xpos);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1902 /* Offsets are -ve when we want to clip pixels off the displayed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1903 glyph. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1904 src->xoffset -= (start_pixpos - xpos);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1905 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1906
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1907 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1908 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1909
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1910 /*****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1911 redisplay_clear_top_of_window
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1912
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1913 If window is topmost, clear the internal border above it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1914 ****************************************************************************/
448
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
1915 void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1916 redisplay_clear_top_of_window (struct window *w)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1917 {
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 665
diff changeset
1918 Lisp_Object window = wrap_window (w);
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 665
diff changeset
1919
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1920
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1921 if (!NILP (Fwindow_highest_p (window)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1922 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1923 struct frame *f = XFRAME (w->frame);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1924 int x, y, width, height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1925
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1926 x = w->pixel_left;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1927 width = w->pixel_width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1928
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1929 if (window_is_leftmost (w))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1930 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1931 x -= FRAME_BORDER_WIDTH (f);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1932 width += FRAME_BORDER_WIDTH (f);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1933 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1934 if (window_is_rightmost (w))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1935 width += FRAME_BORDER_WIDTH (f);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1936
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1937 y = FRAME_TOP_BORDER_START (f) - 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1938 height = FRAME_BORDER_HEIGHT (f) + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1939
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1940 redisplay_clear_region (window, DEFAULT_INDEX, x, y, width, height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1941 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1942 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1943
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1944 /*****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1945 redisplay_clear_to_window_end
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1946
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1947 Clear the area between ypos1 and ypos2. Each margin area and the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1948 text area is handled separately since they may each have their own
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1949 background color.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1950 ****************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1951 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1952 redisplay_clear_to_window_end (struct window *w, int ypos1, int ypos2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1953 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1954 struct frame *f = XFRAME (w->frame);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1955 struct device *d = XDEVICE (f->device);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1956
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1957 if (HAS_DEVMETH_P (d, clear_to_window_end))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1958 DEVMETH (d, clear_to_window_end, (w, ypos1, ypos2));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1959 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1960 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1961 int height = ypos2 - ypos1;
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1962
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1963 if (height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1964 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1965 Lisp_Object window;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1966 int bflag = 0 ; /* (window_needs_vertical_divider (w) ? 0 : 1);*/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1967 layout_bounds bounds;
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1968
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1969 bounds = calculate_display_line_boundaries (w, bflag);
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 665
diff changeset
1970 window = wrap_window (w);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1971
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1972 if (window_is_leftmost (w))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1973 redisplay_clear_region (window, DEFAULT_INDEX, FRAME_LEFT_BORDER_START (f),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1974 ypos1, FRAME_BORDER_WIDTH (f), height);
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1975
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1976 if (bounds.left_in - bounds.left_out > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1977 redisplay_clear_region (window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1978 get_builtin_face_cache_index (w, Vleft_margin_face),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1979 bounds.left_out, ypos1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1980 bounds.left_in - bounds.left_out, height);
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1981
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1982 if (bounds.right_in - bounds.left_in > 0)
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1983 redisplay_clear_region (window,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1984 DEFAULT_INDEX,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1985 bounds.left_in, ypos1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1986 bounds.right_in - bounds.left_in, height);
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1987
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1988 if (bounds.right_out - bounds.right_in > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1989 redisplay_clear_region (window,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1990 get_builtin_face_cache_index (w, Vright_margin_face),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1991 bounds.right_in, ypos1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1992 bounds.right_out - bounds.right_in, height);
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1993
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1994 if (window_is_rightmost (w))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1995 redisplay_clear_region (window, DEFAULT_INDEX, FRAME_RIGHT_BORDER_START (f),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1996 ypos1, FRAME_BORDER_WIDTH (f), height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1997 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1998 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1999 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2000
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2001 /*****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2002 redisplay_clear_bottom_of_window
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2003
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2004 Clear window from right below the last display line to right above
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2005 the modeline. The calling function can limit the area actually
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2006 erased by setting min_start and/or max_end to positive values.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2007 ****************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2008 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2009 redisplay_clear_bottom_of_window (struct window *w, display_line_dynarr *ddla,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2010 int min_start, int max_end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2011 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2012 struct frame *f = XFRAME (w->frame);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2013 int ypos1, ypos2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2014 int ddla_len = Dynarr_length (ddla);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2015
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2016 ypos2 = WINDOW_TEXT_BOTTOM (w);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2017 #ifdef HAVE_SCROLLBARS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2018 /* This adjustment is to catch the intersection of any scrollbars. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2019 if (f->windows_structure_changed && NILP (w->scrollbar_on_top_p))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2020 ypos2 += window_scrollbar_height (w);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2021 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2022
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2023 if (ddla_len)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2024 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2025 if (ddla_len == 1 && Dynarr_atp (ddla, 0)->modeline)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2026 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2027 ypos1 = WINDOW_TEXT_TOP (w);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2028 #ifdef HAVE_SCROLLBARS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2029 /* This adjustment is to catch the intersection of any scrollbars. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2030 if (f->windows_structure_changed && !NILP (w->scrollbar_on_top_p))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2031 ypos1 -= window_scrollbar_height (w);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2032 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2033 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2034 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2035 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2036 struct display_line *dl = Dynarr_atp (ddla, ddla_len - 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2037 ypos1 = dl->ypos + dl->descent - dl->clip;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2038 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2039 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2040 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2041 ypos1 = WINDOW_TEXT_TOP (w);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2042
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2043 /* #### See if this can be made conditional on the frame
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2044 changing size. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2045 if (MINI_WINDOW_P (w))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2046 ypos2 += FRAME_BORDER_HEIGHT (f);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2047
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2048 if (min_start >= 0 && ypos1 < min_start)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2049 ypos1 = min_start;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2050 if (max_end >= 0 && ypos2 > max_end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2051 ypos2 = max_end;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2052
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2053 if (ypos2 <= ypos1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2054 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2055
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2056 redisplay_clear_to_window_end (w, ypos1, ypos2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2057 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2058
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2059 /*****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2060 redisplay_update_line
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2061
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2062 This is used during incremental updates to update a single line and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2063 correct the offsets on all lines below it. At the moment
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2064 update_values is false if we are only updating the modeline.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2065 ****************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2066 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2067 redisplay_update_line (struct window *w, int first_line, int last_line,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2068 int update_values)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2069 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2070 struct frame *f = XFRAME (w->frame);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2071 struct device *d = XDEVICE (f->device);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2072
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2073 display_line_dynarr *cdla = window_display_lines (w, CURRENT_DISP);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2074 display_line_dynarr *ddla = window_display_lines (w, DESIRED_DISP);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2075
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2076 MAYBE_DEVMETH (d, window_output_begin, (w));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2077
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2078 while (first_line <= last_line)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2079 {
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 638
diff changeset
2080 Charcount old_len = (Dynarr_atp (cdla, first_line)->end_charbpos -
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 638
diff changeset
2081 Dynarr_atp (cdla, first_line)->charbpos);
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 638
diff changeset
2082 Charcount new_len = (Dynarr_atp (ddla, first_line)->end_charbpos -
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 638
diff changeset
2083 Dynarr_atp (ddla, first_line)->charbpos);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2084
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2085 assert (Dynarr_length (cdla) == Dynarr_length (ddla));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2086
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2087 /* Output the changes. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2088 output_display_line (w, cdla, ddla, first_line, -1, -1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2089
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2090 /* Update the offsets. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2091 if (update_values)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2092 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2093 int cur_line = first_line + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2094 while (cur_line < Dynarr_length (cdla))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2095 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2096 Dynarr_atp (cdla, cur_line)->offset += (new_len - old_len);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2097 Dynarr_atp (ddla, cur_line)->offset += (new_len - old_len);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2098 cur_line++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2099 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2100 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2101
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2102 /* Update the window_end_pos and other settings. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2103 if (update_values)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2104 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2105 w->window_end_pos[CURRENT_DISP] -= (new_len - old_len);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2106
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2107 if (Dynarr_atp (ddla, first_line)->cursor_elt != -1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2108 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2109 w->last_point_x[CURRENT_DISP] = w->last_point_x[DESIRED_DISP];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2110 w->last_point_y[CURRENT_DISP] = w->last_point_y[DESIRED_DISP];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2111 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2112 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2113
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2114 first_line++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2115 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2116
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2117 /* Update the window max line length. We have to scan the entire
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2118 set of display lines otherwise we might not detect if the max is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2119 supposed to shrink. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2120 if (update_values)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2121 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2122 int line = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2123
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2124 w->max_line_len = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2125 while (line < Dynarr_length (ddla))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2126 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2127 struct display_line *dl = Dynarr_atp (ddla, line);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2128
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2129 if (!dl->modeline)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2130 w->max_line_len = max (dl->num_chars, w->max_line_len);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2131
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2132 line++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2133 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2134 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2135
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2136 w->last_modified[CURRENT_DISP] = w->last_modified[DESIRED_DISP];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2137 w->last_facechange[CURRENT_DISP] = w->last_facechange[DESIRED_DISP];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2138 Fset_marker (w->last_point[CURRENT_DISP],
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2139 Fmarker_position (w->last_point[DESIRED_DISP]), w->buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2140 Fset_marker (w->last_start[CURRENT_DISP],
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2141 Fmarker_position (w->last_start[DESIRED_DISP]), w->buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2142
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2143 /* We don't bother updating the vertical scrollbars here. This
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2144 gives us a performance increase while having minimal loss of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2145 quality to the scrollbar slider size and position since when this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2146 function is called we know that the changes to the buffer were
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2147 very localized. We have to update the horizontal scrollbars,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2148 though, because this routine could cause a change which has a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2149 larger impact on their sizing. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2150 /* #### See if we can get away with only calling this if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2151 max_line_len is greater than the window_char_width. */
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 448
diff changeset
2152 /* #### BILL!!! Should we do this for GTK as well? */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2153 #if defined(HAVE_SCROLLBARS) && defined(HAVE_X_WINDOWS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2154 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2155 extern int stupid_vertical_scrollbar_drag_hack;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2156
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2157 update_window_scrollbars (w, NULL, 1, stupid_vertical_scrollbar_drag_hack);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2158 stupid_vertical_scrollbar_drag_hack = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2159 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2160 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2161
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2162 redisplay_redraw_cursor (f, 0);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2163 MAYBE_DEVMETH (d, window_output_end, (w));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2164 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2165
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2166 /*****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2167 redisplay_output_window
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2168
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2169 For the given window W, ensure that the current display lines are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2170 equal to the desired display lines, outputing changes as necessary.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2171
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2172 #### Fuck me. This just isn't going to cut it for tty's. The output
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2173 decisions for them must be based on the contents of the entire frame
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2174 because that is how the available output capabilities think. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2175 solution is relatively simple. Create redisplay_output_frame. This
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2176 will basically merge all of the separate window display structs into
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2177 a single one for the frame. This combination structure will be able
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2178 to be passed to the same output_display_line which works for windows
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2179 on X frames and the right things will happen. It just takes time to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2180 do.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2181 ****************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2182 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2183 redisplay_output_window (struct window *w)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2184 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2185 struct frame *f = XFRAME (w->frame);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2186 struct device *d = XDEVICE (f->device);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2187
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2188 display_line_dynarr *cdla = window_display_lines (w, CURRENT_DISP);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2189 display_line_dynarr *ddla = window_display_lines (w, DESIRED_DISP);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2190
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2191 int cdla_len = Dynarr_length (cdla);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2192 int ddla_len = Dynarr_length (ddla);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2193
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2194 int line;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2195 int need_to_clear_bottom = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2196 int need_to_clear_start = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2197 int need_to_clear_end = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2198
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2199 /* Backgrounds may have changed or windows may have gone away
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2200 leaving dividers lying around. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2201 if (f->faces_changed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2202 || f->windows_structure_changed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2203 || w->shadow_thickness_changed)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2204 need_to_clear_bottom = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2205
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2206 /* The first thing we do is determine if we are going to need to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2207 clear the bottom of the window. We only need to do this if the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2208 bottom of the current display lines is below the bottom of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2209 desired display lines. Note that the number of lines is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2210 irrelevant. Only the position matters. We also clear to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2211 bottom of the window if the modeline has shifted position. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2212 /* #### We can't blindly not clear the bottom if f->clear is true
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2213 since there might be a window-local background. However, for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2214 those cases where there isn't, clearing the end of the window in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2215 this case sucks. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2216 if (!need_to_clear_bottom)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2217 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2218 struct display_line *cdl, *ddl;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2219
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2220 /* If the modeline has changed position or size, clear the bottom
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2221 of the window. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2222 if (!need_to_clear_bottom)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2223 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2224 cdl = ddl = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2225
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2226 if (cdla_len)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2227 cdl = Dynarr_atp (cdla, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2228 if (ddla_len)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2229 ddl = Dynarr_atp (ddla, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2230
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2231 if (!cdl || !ddl)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2232 need_to_clear_bottom = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2233 else if ((!cdl->modeline && ddl->modeline)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2234 || (cdl->modeline && !ddl->modeline))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2235 need_to_clear_bottom = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2236 else if (cdl->ypos != ddl->ypos ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2237 cdl->ascent != ddl->ascent ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2238 cdl->descent != ddl->descent ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2239 cdl->clip != ddl->clip)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2240 need_to_clear_bottom = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2241
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2242 /* #### This kludge is to make sure the modeline shadows get
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2243 redrawn if the modeline position shifts. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2244 if (need_to_clear_bottom)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2245 w->shadow_thickness_changed = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2246 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2247
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2248 if (!need_to_clear_bottom)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2249 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2250 cdl = ddl = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2251
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2252 if (cdla_len)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2253 cdl = Dynarr_atp (cdla, cdla_len - 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2254 if (ddla_len)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2255 ddl = Dynarr_atp (ddla, ddla_len - 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2256
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2257 if (!cdl || !ddl)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2258 need_to_clear_bottom = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2259 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2260 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2261 int cdl_bottom, ddl_bottom;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2262
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2263 cdl_bottom = cdl->ypos + cdl->descent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2264 ddl_bottom = ddl->ypos + ddl->descent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2265
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2266 if (cdl_bottom > ddl_bottom)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2267 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2268 need_to_clear_bottom = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2269 need_to_clear_start = ddl_bottom;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2270 need_to_clear_end = cdl_bottom;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2271 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2272 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2273 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2274 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2275
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2276 /* Perform any output initialization. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2277 MAYBE_DEVMETH (d, window_output_begin, (w));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2278
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2279 /* If the window's structure has changed clear the internal border
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2280 above it if it is topmost (the function will check). */
448
3078fd1074e8 Import from CVS: tag r21-2-39
cvs
parents: 446
diff changeset
2281 if (f->windows_structure_changed || f->faces_changed)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2282 redisplay_clear_top_of_window (w);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2283
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2284 /* Output each line. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2285 for (line = 0; line < Dynarr_length (ddla); line++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2286 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2287 output_display_line (w, cdla, ddla, line, -1, -1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2288 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2289
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2290 /* If the number of display lines has shrunk, adjust. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2291 if (cdla_len > ddla_len)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2292 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2293 Dynarr_length (cdla) = ddla_len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2294 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2295
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2296 /* Output a vertical divider between windows, if necessary. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2297 if (window_needs_vertical_divider (w)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2298 && (f->windows_structure_changed || f->clear))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2299 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2300 MAYBE_DEVMETH (d, output_vertical_divider, (w, f->windows_structure_changed));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2301 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2302
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2303 /* Clear the rest of the window, if necessary. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2304 if (need_to_clear_bottom)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2305 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2306 redisplay_clear_bottom_of_window (w, ddla, need_to_clear_start,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2307 need_to_clear_end);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2308 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2309
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2310 w->window_end_pos[CURRENT_DISP] = w->window_end_pos[DESIRED_DISP];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2311 Fset_marker (w->start[CURRENT_DISP],
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2312 make_int (marker_position (w->start[DESIRED_DISP])),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2313 w->buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2314 Fset_marker (w->pointm[CURRENT_DISP],
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2315 make_int (marker_position (w->pointm[DESIRED_DISP])),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2316 w->buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2317 w->last_modified[CURRENT_DISP] = w->last_modified[DESIRED_DISP];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2318 w->last_facechange[CURRENT_DISP] = w->last_facechange[DESIRED_DISP];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2319 Fset_marker (w->last_start[CURRENT_DISP],
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2320 Fmarker_position (w->last_start[DESIRED_DISP]), w->buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2321 Fset_marker (w->last_point[CURRENT_DISP],
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2322 Fmarker_position (w->last_point[DESIRED_DISP]), w->buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2323 w->last_point_x[CURRENT_DISP] = w->last_point_x[DESIRED_DISP];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2324 w->last_point_y[CURRENT_DISP] = w->last_point_y[DESIRED_DISP];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2325 w->shadow_thickness_changed = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2326
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2327 set_window_display_buffer (w, XBUFFER (w->buffer));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2328 find_window_mirror (w)->truncate_win = window_truncation_on (w);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2329
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2330 /* Overkill on invalidating the cache. It is very bad for it to not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2331 get invalidated when it should be. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2332 INVALIDATE_DEVICE_PIXEL_TO_GLYPH_CACHE (d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2333
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2334 redisplay_redraw_cursor (f, 0);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2335 MAYBE_DEVMETH (d, window_output_end, (w));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2336
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2337 #ifdef HAVE_SCROLLBARS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2338 update_window_scrollbars (w, NULL, !MINI_WINDOW_P (w), 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2339 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2340 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2341
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2342 /*****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2343 bevel_modeline
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2344
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2345 Draw a 3d border around the modeline on window W.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2346 ****************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2347 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2348 bevel_modeline (struct window *w, struct display_line *dl)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2349 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2350 struct frame *f = XFRAME (w->frame);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2351 struct device *d = XDEVICE (f->device);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2352 int x, y, width, height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2353 int shadow_thickness = MODELINE_SHADOW_THICKNESS (w);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2354 enum edge_style style;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2355
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2356 x = WINDOW_MODELINE_LEFT (w);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2357 width = WINDOW_MODELINE_RIGHT (w) - x;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2358 y = dl->ypos - dl->ascent - shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2359 height = dl->ascent + dl->descent + 2 * shadow_thickness;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2360
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2361 if (XINT (w->modeline_shadow_thickness) < 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2362 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2363 style = EDGE_BEVEL_IN;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2364 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2365 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2366 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2367 style = EDGE_BEVEL_OUT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2368 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2369
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
2370 MAYBE_DEVMETH (d, bevel_area,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2371 (w, MODELINE_INDEX, x, y, width, height, shadow_thickness,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2372 EDGE_ALL, style));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2373 }