annotate src/faces.c @ 665:fdefd0186b75

[xemacs-hg @ 2001-09-20 06:28:42 by ben] The great integral types renaming. The purpose of this is to rationalize the names used for various integral types, so that they match their intended uses and follow consist conventions, and eliminate types that were not semantically different from each other. The conventions are: -- All integral types that measure quantities of anything are signed. Some people disagree vociferously with this, but their arguments are mostly theoretical, and are vastly outweighed by the practical headaches of mixing signed and unsigned values, and more importantly by the far increased likelihood of inadvertent bugs: Because of the broken "viral" nature of unsigned quantities in C (operations involving mixed signed/unsigned are done unsigned, when exactly the opposite is nearly always wanted), even a single error in declaring a quantity unsigned that should be signed, or even the even more subtle error of comparing signed and unsigned values and forgetting the necessary cast, can be catastrophic, as comparisons will yield wrong results. -Wsign-compare is turned on specifically to catch this, but this tends to result in a great number of warnings when mixing signed and unsigned, and the casts are annoying. More has been written on this elsewhere. -- All such quantity types just mentioned boil down to EMACS_INT, which is 32 bits on 32-bit machines and 64 bits on 64-bit machines. This is guaranteed to be the same size as Lisp objects of type `int', and (as far as I can tell) of size_t (unsigned!) and ssize_t. The only type below that is not an EMACS_INT is Hashcode, which is an unsigned value of the same size as EMACS_INT. -- Type names should be relatively short (no more than 10 characters or so), with the first letter capitalized and no underscores if they can at all be avoided. -- "count" == a zero-based measurement of some quantity. Includes sizes, offsets, and indexes. -- "bpos" == a one-based measurement of a position in a buffer. "Charbpos" and "Bytebpos" count text in the buffer, rather than bytes in memory; thus Bytebpos does not directly correspond to the memory representation. Use "Membpos" for this. -- "Char" refers to internal-format characters, not to the C type "char", which is really a byte. -- For the actual name changes, see the script below. I ran the following script to do the conversion. (NOTE: This script is idempotent. You can safely run it multiple times and it will not screw up previous results -- in fact, it will do nothing if nothing has changed. Thus, it can be run repeatedly as necessary to handle patches coming in from old workspaces, or old branches.) There are two tags, just before and just after the change: `pre-integral-type-rename' and `post-integral-type-rename'. When merging code from the main trunk into a branch, the best thing to do is first merge up to `pre-integral-type-rename', then apply the script and associated changes, then merge from `post-integral-type-change' to the present. (Alternatively, just do the merging in one operation; but you may then have a lot of conflicts needing to be resolved by hand.) Script `fixtypes.sh' follows: ----------------------------------- cut ------------------------------------ files="*.[ch] s/*.h m/*.h config.h.in ../configure.in Makefile.in.in ../lib-src/*.[ch] ../lwlib/*.[ch]" gr Memory_Count Bytecount $files gr Lstream_Data_Count Bytecount $files gr Element_Count Elemcount $files gr Hash_Code Hashcode $files gr extcount bytecount $files gr bufpos charbpos $files gr bytind bytebpos $files gr memind membpos $files gr bufbyte intbyte $files gr Extcount Bytecount $files gr Bufpos Charbpos $files gr Bytind Bytebpos $files gr Memind Membpos $files gr Bufbyte Intbyte $files gr EXTCOUNT BYTECOUNT $files gr BUFPOS CHARBPOS $files gr BYTIND BYTEBPOS $files gr MEMIND MEMBPOS $files gr BUFBYTE INTBYTE $files gr MEMORY_COUNT BYTECOUNT $files gr LSTREAM_DATA_COUNT BYTECOUNT $files gr ELEMENT_COUNT ELEMCOUNT $files gr HASH_CODE HASHCODE $files ----------------------------------- cut ------------------------------------ `fixtypes.sh' is a Bourne-shell script; it uses 'gr': ----------------------------------- cut ------------------------------------ #!/bin/sh # Usage is like this: # gr FROM TO FILES ... # globally replace FROM with TO in FILES. FROM and TO are regular expressions. # backup files are stored in the `backup' directory. from="$1" to="$2" shift 2 echo ${1+"$@"} | xargs global-replace "s/$from/$to/g" ----------------------------------- cut ------------------------------------ `gr' in turn uses a Perl script to do its real work, `global-replace', which follows: ----------------------------------- cut ------------------------------------ : #-*- Perl -*- ### global-modify --- modify the contents of a file by a Perl expression ## Copyright (C) 1999 Martin Buchholz. ## Copyright (C) 2001 Ben Wing. ## Authors: Martin Buchholz <martin@xemacs.org>, Ben Wing <ben@xemacs.org> ## Maintainer: Ben Wing <ben@xemacs.org> ## Current Version: 1.0, May 5, 2001 # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with XEmacs; see the file COPYING. If not, write to the Free # Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. eval 'exec perl -w -S $0 ${1+"$@"}' if 0; use strict; use FileHandle; use Carp; use Getopt::Long; use File::Basename; (my $myName = $0) =~ s@.*/@@; my $usage=" Usage: $myName [--help] [--backup-dir=DIR] [--line-mode] [--hunk-mode] PERLEXPR FILE ... Globally modify a file, either line by line or in one big hunk. Typical usage is like this: [with GNU print, GNU xargs: guaranteed to handle spaces, quotes, etc. in file names] find . -name '*.[ch]' -print0 | xargs -0 $0 's/\bCONST\b/const/g'\n [with non-GNU print, xargs] find . -name '*.[ch]' -print | xargs $0 's/\bCONST\b/const/g'\n The file is read in, either line by line (with --line-mode specified) or in one big hunk (with --hunk-mode specified; it's the default), and the Perl expression is then evalled with \$_ set to the line or hunk of text, including the terminating newline if there is one. It should destructively modify the value there, storing the changed result in \$_. Files in which any modifications are made are backed up to the directory specified using --backup-dir, or to `backup' by default. To disable this, use --backup-dir= with no argument. Hunk mode is the default because it is MUCH MUCH faster than line-by-line. Use line-by-line only when it matters, e.g. you want to do a replacement only once per line (the default without the `g' argument). Conversely, when using hunk mode, *ALWAYS* use `g'; otherwise, you will only make one replacement in the entire file! "; my %options = (); $Getopt::Long::ignorecase = 0; &GetOptions ( \%options, 'help', 'backup-dir=s', 'line-mode', 'hunk-mode', ); die $usage if $options{"help"} or @ARGV <= 1; my $code = shift; die $usage if grep (-d || ! -w, @ARGV); sub SafeOpen { open ((my $fh = new FileHandle), $_[0]); confess "Can't open $_[0]: $!" if ! defined $fh; return $fh; } sub SafeClose { close $_[0] or confess "Can't close $_[0]: $!"; } sub FileContents { my $fh = SafeOpen ("< $_[0]"); my $olddollarslash = $/; local $/ = undef; my $contents = <$fh>; $/ = $olddollarslash; return $contents; } sub WriteStringToFile { my $fh = SafeOpen ("> $_[0]"); binmode $fh; print $fh $_[1] or confess "$_[0]: $!\n"; SafeClose $fh; } foreach my $file (@ARGV) { my $changed_p = 0; my $new_contents = ""; if ($options{"line-mode"}) { my $fh = SafeOpen $file; while (<$fh>) { my $save_line = $_; eval $code; $changed_p = 1 if $save_line ne $_; $new_contents .= $_; } } else { my $orig_contents = $_ = FileContents $file; eval $code; if ($_ ne $orig_contents) { $changed_p = 1; $new_contents = $_; } } if ($changed_p) { my $backdir = $options{"backup-dir"}; $backdir = "backup" if !defined ($backdir); if ($backdir) { my ($name, $path, $suffix) = fileparse ($file, ""); my $backfulldir = $path . $backdir; my $backfile = "$backfulldir/$name"; mkdir $backfulldir, 0755 unless -d $backfulldir; print "modifying $file (original saved in $backfile)\n"; rename $file, $backfile; } WriteStringToFile ($file, $new_contents); } } ----------------------------------- cut ------------------------------------ In addition to those programs, I needed to fix up a few other things, particularly relating to the duplicate definitions of types, now that some types merged with others. Specifically: 1. in lisp.h, removed duplicate declarations of Bytecount. The changed code should now look like this: (In each code snippet below, the first and last lines are the same as the original, as are all lines outside of those lines. That allows you to locate the section to be replaced, and replace the stuff in that section, verifying that there isn't anything new added that would need to be kept.) --------------------------------- snip ------------------------------------- /* Counts of bytes or chars */ typedef EMACS_INT Bytecount; typedef EMACS_INT Charcount; /* Counts of elements */ typedef EMACS_INT Elemcount; /* Hash codes */ typedef unsigned long Hashcode; /* ------------------------ dynamic arrays ------------------- */ --------------------------------- snip ------------------------------------- 2. in lstream.h, removed duplicate declaration of Bytecount. Rewrote the comment about this type. The changed code should now look like this: --------------------------------- snip ------------------------------------- #endif /* The have been some arguments over the what the type should be that specifies a count of bytes in a data block to be written out or read in, using Lstream_read(), Lstream_write(), and related functions. Originally it was long, which worked fine; Martin "corrected" these to size_t and ssize_t on the grounds that this is theoretically cleaner and is in keeping with the C standards. Unfortunately, this practice is horribly error-prone due to design flaws in the way that mixed signed/unsigned arithmetic happens. In fact, by doing this change, Martin introduced a subtle but fatal error that caused the operation of sending large mail messages to the SMTP server under Windows to fail. By putting all values back to be signed, avoiding any signed/unsigned mixing, the bug immediately went away. The type then in use was Lstream_Data_Count, so that it be reverted cleanly if a vote came to that. Now it is Bytecount. Some earlier comments about why the type must be signed: This MUST BE SIGNED, since it also is used in functions that return the number of bytes actually read to or written from in an operation, and these functions can return -1 to signal error. Note that the standard Unix read() and write() functions define the count going in as a size_t, which is UNSIGNED, and the count going out as an ssize_t, which is SIGNED. This is a horrible design flaw. Not only is it highly likely to lead to logic errors when a -1 gets interpreted as a large positive number, but operations are bound to fail in all sorts of horrible ways when a number in the upper-half of the size_t range is passed in -- this number is unrepresentable as an ssize_t, so code that checks to see how many bytes are actually written (which is mandatory if you are dealing with certain types of devices) will get completely screwed up. --ben */ typedef enum lstream_buffering --------------------------------- snip ------------------------------------- 3. in dumper.c, there are four places, all inside of switch() statements, where XD_BYTECOUNT appears twice as a case tag. In each case, the two case blocks contain identical code, and you should *REMOVE THE SECOND* and leave the first.
author ben
date Thu, 20 Sep 2001 06:31:11 +0000
parents b39c14581166
children 943eaba38521
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 /* "Face" primitives
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 Copyright (C) 1994 Free Software Foundation, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3 Copyright (C) 1995 Board of Trustees, University of Illinois.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4 Copyright (C) 1995, 1996 Ben Wing.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5 Copyright (C) 1995 Sun Microsystems, Inc.
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 /* Written by Chuck Thompson and Ben Wing,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 based loosely on old face code by Jamie Zawinski. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 #include <config.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 #include "lisp.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 #include "buffer.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 #include "device.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 #include "elhash.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 #include "extents.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 #include "faces.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 #include "frame.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 #include "glyphs.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 #include "objects.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 #include "specifier.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 #include "window.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 Lisp_Object Qfacep;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 Lisp_Object Qforeground, Qbackground, Qdisplay_table;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 Lisp_Object Qbackground_pixmap, Qunderline, Qdim;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 Lisp_Object Qblinking, Qstrikethru;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 Lisp_Object Qinit_face_from_resources;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 Lisp_Object Qinit_frame_faces;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 Lisp_Object Qinit_device_faces;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 Lisp_Object Qinit_global_faces;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 /* These faces are used directly internally. We use these variables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 to be able to reference them directly and save the overhead of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 calling Ffind_face. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 Lisp_Object Vdefault_face, Vmodeline_face, Vgui_element_face;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 Lisp_Object Vleft_margin_face, Vright_margin_face, Vtext_cursor_face;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 Lisp_Object Vpointer_face, Vvertical_divider_face, Vtoolbar_face, Vwidget_face;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
60 /* Qdefault, Qhighlight, Qleft_margin, Qright_margin defined in general.c */
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
61 Lisp_Object Qmodeline, Qgui_element, Qtext_cursor, Qvertical_divider;
428
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 /* In the old implementation Vface_list was a list of the face names,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 not the faces themselves. We now distinguish between permanent and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 temporary faces. Permanent faces are kept in a regular hash table,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 temporary faces in a weak hash table. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 Lisp_Object Vpermanent_faces_cache;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 Lisp_Object Vtemporary_faces_cache;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 Lisp_Object Vbuilt_in_face_specifiers;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 mark_face (Lisp_Object obj)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
77 Lisp_Face *face = XFACE (obj);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 mark_object (face->name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 mark_object (face->doc_string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 mark_object (face->foreground);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 mark_object (face->background);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 mark_object (face->font);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 mark_object (face->display_table);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 mark_object (face->background_pixmap);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 mark_object (face->underline);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 mark_object (face->strikethru);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 mark_object (face->highlight);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 mark_object (face->dim);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 mark_object (face->blinking);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 mark_object (face->reverse);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 mark_object (face->charsets_warned_about);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 return face->plist;
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 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 print_face (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
102 Lisp_Face *face = XFACE (obj);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 if (print_readably)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 write_c_string ("#s(face name ", printcharfun);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 print_internal (face->name, printcharfun, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 write_c_string (")", printcharfun);
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 else
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 write_c_string ("#<face ", printcharfun);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 print_internal (face->name, printcharfun, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 if (!NILP (face->doc_string))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 write_c_string (" ", printcharfun);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117 print_internal (face->doc_string, printcharfun, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 write_c_string (">", printcharfun);
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 }
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 /* Faces are equal if all of their display attributes are equal. We
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 don't compare names or doc-strings, because that would make equal
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 be eq.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 This isn't concerned with "unspecified" attributes, that's what
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 #'face-differs-from-default-p is for. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 face_equal (Lisp_Object obj1, Lisp_Object obj2, int depth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
132 Lisp_Face *f1 = XFACE (obj1);
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
133 Lisp_Face *f2 = XFACE (obj2);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 depth++;
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 return
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 (internal_equal (f1->foreground, f2->foreground, depth) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 internal_equal (f1->background, f2->background, depth) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 internal_equal (f1->font, f2->font, depth) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 internal_equal (f1->display_table, f2->display_table, depth) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 internal_equal (f1->background_pixmap, f2->background_pixmap, depth) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 internal_equal (f1->underline, f2->underline, depth) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 internal_equal (f1->strikethru, f2->strikethru, depth) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 internal_equal (f1->highlight, f2->highlight, depth) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 internal_equal (f1->dim, f2->dim, depth) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 internal_equal (f1->blinking, f2->blinking, depth) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 internal_equal (f1->reverse, f2->reverse, depth) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 ! plists_differ (f1->plist, f2->plist, 0, 0, depth + 1));
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
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
153 static Hashcode
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 face_hash (Lisp_Object obj, int depth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
156 Lisp_Face *f = XFACE (obj);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 depth++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 /* No need to hash all of the elements; that would take too long.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 Just hash the most common ones. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 return HASH3 (internal_hash (f->foreground, depth),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 internal_hash (f->background, depth),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 internal_hash (f->font, depth));
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 face_getprop (Lisp_Object obj, Lisp_Object prop)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
170 Lisp_Face *f = XFACE (obj);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 return
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 (EQ (prop, Qforeground) ? f->foreground :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 EQ (prop, Qbackground) ? f->background :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 EQ (prop, Qfont) ? f->font :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 EQ (prop, Qdisplay_table) ? f->display_table :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 EQ (prop, Qbackground_pixmap) ? f->background_pixmap :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 EQ (prop, Qunderline) ? f->underline :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 EQ (prop, Qstrikethru) ? f->strikethru :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 EQ (prop, Qhighlight) ? f->highlight :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 EQ (prop, Qdim) ? f->dim :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 EQ (prop, Qblinking) ? f->blinking :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 EQ (prop, Qreverse) ? f->reverse :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 EQ (prop, Qdoc_string) ? f->doc_string :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 external_plist_get (&f->plist, prop, 0, ERROR_ME));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 }
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 face_putprop (Lisp_Object obj, Lisp_Object prop, Lisp_Object value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
191 Lisp_Face *f = XFACE (obj);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 if (EQ (prop, Qforeground) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 EQ (prop, Qbackground) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 EQ (prop, Qfont) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 EQ (prop, Qdisplay_table) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 EQ (prop, Qbackground_pixmap) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 EQ (prop, Qunderline) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 EQ (prop, Qstrikethru) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 EQ (prop, Qhighlight) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 EQ (prop, Qdim) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 EQ (prop, Qblinking) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 EQ (prop, Qreverse))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 if (EQ (prop, Qdoc_string))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 if (!NILP (value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 CHECK_STRING (value);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 f->doc_string = value;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 external_plist_put (&f->plist, prop, value, 0, ERROR_ME);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 face_remprop (Lisp_Object obj, Lisp_Object prop)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
221 Lisp_Face *f = XFACE (obj);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 if (EQ (prop, Qforeground) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 EQ (prop, Qbackground) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 EQ (prop, Qfont) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 EQ (prop, Qdisplay_table) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 EQ (prop, Qbackground_pixmap) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 EQ (prop, Qunderline) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 EQ (prop, Qstrikethru) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 EQ (prop, Qhighlight) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 EQ (prop, Qdim) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 EQ (prop, Qblinking) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 EQ (prop, Qreverse))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 return -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 if (EQ (prop, Qdoc_string))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 f->doc_string = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 return external_remprop (&f->plist, prop, 0, ERROR_ME);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 face_plist (Lisp_Object obj)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
248 Lisp_Face *face = XFACE (obj);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 Lisp_Object result = face->plist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 result = cons3 (Qreverse, face->reverse, result);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 result = cons3 (Qblinking, face->blinking, result);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 result = cons3 (Qdim, face->dim, result);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 result = cons3 (Qhighlight, face->highlight, result);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 result = cons3 (Qstrikethru, face->strikethru, result);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 result = cons3 (Qunderline, face->underline, result);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 result = cons3 (Qbackground_pixmap, face->background_pixmap, result);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 result = cons3 (Qdisplay_table, face->display_table, result);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 result = cons3 (Qfont, face->font, result);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 result = cons3 (Qbackground, face->background, result);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 result = cons3 (Qforeground, face->foreground, result);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 return result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 static const struct lrecord_description face_description[] = {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
267 { XD_LISP_OBJECT, offsetof (Lisp_Face, name) },
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
268 { XD_LISP_OBJECT, offsetof (Lisp_Face, doc_string) },
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
269 { XD_LISP_OBJECT, offsetof (Lisp_Face, foreground) },
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
270 { XD_LISP_OBJECT, offsetof (Lisp_Face, background) },
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
271 { XD_LISP_OBJECT, offsetof (Lisp_Face, font) },
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
272 { XD_LISP_OBJECT, offsetof (Lisp_Face, display_table) },
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
273 { XD_LISP_OBJECT, offsetof (Lisp_Face, background_pixmap) },
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
274 { XD_LISP_OBJECT, offsetof (Lisp_Face, underline) },
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
275 { XD_LISP_OBJECT, offsetof (Lisp_Face, strikethru) },
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
276 { XD_LISP_OBJECT, offsetof (Lisp_Face, highlight) },
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
277 { XD_LISP_OBJECT, offsetof (Lisp_Face, dim) },
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
278 { XD_LISP_OBJECT, offsetof (Lisp_Face, blinking) },
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
279 { XD_LISP_OBJECT, offsetof (Lisp_Face, reverse) },
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
280 { XD_LISP_OBJECT, offsetof (Lisp_Face, plist) },
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
281 { XD_LISP_OBJECT, offsetof (Lisp_Face, charsets_warned_about) },
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 { XD_END }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 DEFINE_LRECORD_IMPLEMENTATION_WITH_PROPS ("face", face,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 mark_face, print_face, 0, face_equal,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 face_hash, face_description, face_getprop,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 face_putprop, face_remprop,
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
289 face_plist, Lisp_Face);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 /* face read syntax */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 face_name_validate (Lisp_Object keyword, Lisp_Object value,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
297 Error_Behavior errb)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 if (ERRB_EQ (errb, ERROR_ME))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 CHECK_SYMBOL (value);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 return 1;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 return SYMBOLP (value);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 static int
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
309 face_validate (Lisp_Object data, Error_Behavior errb)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 int name_seen = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 Lisp_Object valw = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 data = Fcdr (data); /* skip over Qface */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 while (!NILP (data))
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 Lisp_Object keyw = Fcar (data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 data = Fcdr (data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 valw = Fcar (data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 data = Fcdr (data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 if (EQ (keyw, Qname))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 name_seen = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 if (!name_seen)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
330 maybe_sferror ("No face name given", Qunbound, Qface, errb);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 if (NILP (Ffind_face (valw)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
336 maybe_invalid_argument ("No such face", valw, Qface, errb);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 return 0;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 }
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 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 face_instantiate (Lisp_Object data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 return Fget_face (Fcar (Fcdr (data)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348
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 * utility functions *
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 static void
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
355 reset_face (Lisp_Face *f)
428
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 f->name = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 f->doc_string = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 f->dirty = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 f->foreground = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 f->background = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 f->font = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 f->display_table = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 f->background_pixmap = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 f->underline = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 f->strikethru = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 f->highlight = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 f->dim = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 f->blinking = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 f->reverse = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 f->plist = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 f->charsets_warned_about = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
375 static Lisp_Face *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 allocate_face (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
378 Lisp_Face *result = alloc_lcrecord_type (Lisp_Face, &lrecord_face);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 reset_face (result);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 return result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 }
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385 /* We store the faces in hash tables with the names as the key and the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 actual face object as the value. Occasionally we need to use them
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 in a list format. These routines provide us with that. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 struct face_list_closure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 Lisp_Object *face_list;
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 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 add_face_to_list_mapper (Lisp_Object key, Lisp_Object value,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 void *face_list_closure)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 struct face_list_closure *fcl =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 (struct face_list_closure *) face_list_closure;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 *(fcl->face_list) = Fcons (XFACE (value)->name, (*fcl->face_list));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 return 0;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406 faces_list_internal (Lisp_Object list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 Lisp_Object face_list = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 struct face_list_closure face_list_closure;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412 GCPRO1 (face_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 face_list_closure.face_list = &face_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 elisp_maphash (add_face_to_list_mapper, list, &face_list_closure);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 return face_list;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 permanent_faces_list (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 return faces_list_internal (Vpermanent_faces_cache);
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427 temporary_faces_list (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 return faces_list_internal (Vtemporary_faces_cache);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434 mark_face_as_clean_mapper (Lisp_Object key, Lisp_Object value,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 void *flag_closure)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 int *flag = (int *) flag_closure;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 XFACE (value)->dirty = *flag;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 mark_all_faces_internal (int flag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 elisp_maphash (mark_face_as_clean_mapper, Vpermanent_faces_cache, &flag);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 elisp_maphash (mark_face_as_clean_mapper, Vtemporary_faces_cache, &flag);
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 mark_all_faces_as_clean (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 mark_all_faces_internal (0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 /* Currently unused (see the comment in face_property_was_changed()). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 #if 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 /* #### OBSOLETE ME, PLEASE. Maybe. Maybe this is just as good as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459 any other solution. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460 struct face_inheritance_closure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 Lisp_Object face;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 Lisp_Object property;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 update_inheritance_mapper_internal (Lisp_Object cur_face,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 Lisp_Object inh_face,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 Lisp_Object property)
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 /* #### fix this function */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 Lisp_Object elt = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 GCPRO1 (elt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 for (elt = FACE_PROPERTY_SPEC_LIST (cur_face, property, Qall);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 !NILP (elt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479 elt = XCDR (elt))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481 Lisp_Object values = XCDR (XCAR (elt));
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 for (; !NILP (values); values = XCDR (values))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 Lisp_Object value = XCDR (XCAR (values));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 if (VECTORP (value) && XVECTOR_LENGTH (value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488 if (EQ (Ffind_face (XVECTOR_DATA (value)[0]), inh_face))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489 Fset_specifier_dirty_flag
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490 (FACE_PROPERTY_SPECIFIER (inh_face, property));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
491 }
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 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
494
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 }
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 static int
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
499 update_face_inheritance_mapper (const void *hash_key, void *hash_contents,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500 void *face_inheritance_closure)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502 Lisp_Object key, contents;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503 struct face_inheritance_closure *fcl =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504 (struct face_inheritance_closure *) face_inheritance_closure;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506 CVOID_TO_LISP (key, hash_key);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507 VOID_TO_LISP (contents, hash_contents);
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 if (EQ (fcl->property, Qfont))
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 update_inheritance_mapper_internal (contents, fcl->face, Qfont);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 else if (EQ (fcl->property, Qforeground) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 EQ (fcl->property, Qbackground))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 update_inheritance_mapper_internal (contents, fcl->face, Qforeground);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517 update_inheritance_mapper_internal (contents, fcl->face, Qbackground);
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 else if (EQ (fcl->property, Qunderline) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 EQ (fcl->property, Qstrikethru) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 EQ (fcl->property, Qhighlight) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522 EQ (fcl->property, Qdim) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 EQ (fcl->property, Qblinking) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524 EQ (fcl->property, Qreverse))
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 update_inheritance_mapper_internal (contents, fcl->face, Qunderline);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527 update_inheritance_mapper_internal (contents, fcl->face, Qstrikethru);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528 update_inheritance_mapper_internal (contents, fcl->face, Qhighlight);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 update_inheritance_mapper_internal (contents, fcl->face, Qdim);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530 update_inheritance_mapper_internal (contents, fcl->face, Qblinking);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531 update_inheritance_mapper_internal (contents, fcl->face, Qreverse);
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 return 0;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 update_faces_inheritance (Lisp_Object face, Lisp_Object property)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539 struct face_inheritance_closure face_inheritance_closure;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540 struct gcpro gcpro1, gcpro2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 GCPRO2 (face, property);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543 face_inheritance_closure.face = face;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 face_inheritance_closure.property = property;
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 elisp_maphash (update_face_inheritance_mapper, Vpermanent_faces_cache,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 &face_inheritance_closure);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 elisp_maphash (update_face_inheritance_mapper, Vtemporary_faces_cache,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 &face_inheritance_closure);
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 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 #endif /* 0 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 face_property_matching_instance (Lisp_Object face, Lisp_Object property,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557 Lisp_Object charset, Lisp_Object domain,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
558 Error_Behavior errb, int no_fallback,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 Lisp_Object depth)
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 Lisp_Object retval =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 specifier_instance_no_quit (Fget (face, property, Qnil), charset,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 domain, errb, no_fallback, depth);
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 if (UNBOUNDP (retval) && !no_fallback)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567 if (EQ (property, Qfont))
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 if (NILP (memq_no_quit (charset,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570 XFACE (face)->charsets_warned_about)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572 #ifdef MULE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573 if (! UNBOUNDP (charset))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574 warn_when_safe
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575 (Qfont, Qwarning,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 "Unable to instantiate font for face %s, charset %s",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577 string_data (symbol_name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578 (XSYMBOL (XFACE (face)->name))),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 string_data (symbol_name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 (XSYMBOL (XCHARSET_NAME (charset)))));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 warn_when_safe (Qfont, Qwarning,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 "Unable to instantiate font for face %s",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 string_data (symbol_name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 (XSYMBOL (XFACE (face)->name))));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 XFACE (face)->charsets_warned_about =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 Fcons (charset, XFACE (face)->charsets_warned_about);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 retval = Vthe_null_font_instance;
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 }
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 return retval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595 }
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 DEFUN ("facep", Ffacep, 1, 1, 0, /*
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
599 Return t if OBJECT is a face.
428
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 (object))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603 return FACEP (object) ? Qt : Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604 }
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 DEFUN ("find-face", Ffind_face, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 Retrieve the face of the given name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608 If FACE-OR-NAME is a face object, it is simply returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609 Otherwise, FACE-OR-NAME should be a symbol. If there is no such face,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610 nil is returned. Otherwise the associated face object is returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
612 (face_or_name))
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 Lisp_Object retval;
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 (FACEP (face_or_name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
617 return face_or_name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618 CHECK_SYMBOL (face_or_name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620 /* Check if the name represents a permanent face. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
621 retval = Fgethash (face_or_name, Vpermanent_faces_cache, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
622 if (!NILP (retval))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
623 return retval;
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 /* Check if the name represents a temporary face. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
626 return Fgethash (face_or_name, Vtemporary_faces_cache, Qnil);
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
629 DEFUN ("get-face", Fget_face, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
630 Retrieve the face of the given name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631 Same as `find-face' except an error is signalled if there is no such
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632 face instead of returning nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
633 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
634 (name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636 Lisp_Object face = Ffind_face (name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
637
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638 if (NILP (face))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
639 invalid_argument ("No such face", name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
640 return face;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643 DEFUN ("face-name", Fface_name, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
644 Return the name of the given face.
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 (face))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
647 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
648 return XFACE (Fget_face (face))->name;
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 DEFUN ("built-in-face-specifiers", Fbuilt_in_face_specifiers, 0, 0, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
652 Return a list of all built-in face specifier properties.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
653 Don't modify this list!
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 ())
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 return Vbuilt_in_face_specifiers;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
658 }
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 /* These values are retrieved so often that we make a special
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661 function.
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
664 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665 default_face_font_info (Lisp_Object domain, int *ascent, int *descent,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666 int *height, int *width, int *proportional_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
667 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
668 Lisp_Object font_instance;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
669
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
670 if (noninteractive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
671 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
672 if (ascent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
673 *ascent = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
674 if (descent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
675 *descent = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
676 if (height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
677 *height = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
678 if (width)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
679 *width = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
680 if (proportional_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
681 *proportional_p = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
682 return;
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 /* We use ASCII here. This is probably reasonable because the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
686 people calling this function are using the resulting values to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
687 come up with overall sizes for windows and frames. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
688 if (WINDOWP (domain))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
689 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
690 struct face_cachel *cachel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
691 struct window *w = XWINDOW (domain);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
692
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
693 /* #### It's possible for this function to get called when the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
694 face cachels have not been initialized. I don't know why. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
695 if (!Dynarr_length (w->face_cachels))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
696 reset_face_cachels (w);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
697 cachel = WINDOW_FACE_CACHEL (w, DEFAULT_INDEX);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
698 font_instance = FACE_CACHEL_FONT (cachel, Vcharset_ascii);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
699 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
700 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
701 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
702 font_instance = FACE_FONT (Vdefault_face, domain, Vcharset_ascii);
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
705 if (height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
706 *height = XFONT_INSTANCE (font_instance)->height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
707 if (width)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
708 *width = XFONT_INSTANCE (font_instance)->width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
709 if (ascent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
710 *ascent = XFONT_INSTANCE (font_instance)->ascent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
711 if (descent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
712 *descent = XFONT_INSTANCE (font_instance)->descent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
713 if (proportional_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
714 *proportional_p = XFONT_INSTANCE (font_instance)->proportional_p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
715 }
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 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
718 default_face_height_and_width (Lisp_Object domain,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
719 int *height, int *width)
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 default_face_font_info (domain, 0, 0, height, width, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
722 }
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 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
725 default_face_height_and_width_1 (Lisp_Object domain,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
726 int *height, int *width)
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 if (window_system_pixelated_geometry (domain))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
729 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
730 if (height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
731 *height = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
732 if (width)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
733 *width = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
734 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
735 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
736 default_face_height_and_width (domain, height, width);
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 DEFUN ("face-list", Fface_list, 0, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
740 Return a list of the names of all defined faces.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
741 If TEMPORARY is nil, only the permanent faces are included.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
742 If it is t, only the temporary faces are included. If it is any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
743 other non-nil value both permanent and temporary are included.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
744 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
745 (temporary))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
746 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
747 Lisp_Object face_list = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
748
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
749 /* Added the permanent faces, if requested. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
750 if (NILP (temporary) || !EQ (Qt, temporary))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
751 face_list = permanent_faces_list ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
752
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
753 if (!NILP (temporary))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
754 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
755 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
756 GCPRO1 (face_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
757 face_list = nconc2 (face_list, temporary_faces_list ());
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
758 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
759 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
760
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
761 return face_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
762 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
763
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
764 DEFUN ("make-face", Fmake_face, 1, 3, 0, /*
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
765 Define a new face with name NAME (a symbol), described by DOC-STRING.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
766 You can modify the font, color, etc. of a face with the set-face-* functions.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
767 If the face already exists, it is unmodified.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
768 If TEMPORARY is non-nil, this face will cease to exist if not in use.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
769 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
770 (name, doc_string, temporary))
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 /* This function can GC if initialized is non-zero */
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
773 Lisp_Face *f;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
774 Lisp_Object face;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
775
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
776 CHECK_SYMBOL (name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
777 if (!NILP (doc_string))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
778 CHECK_STRING (doc_string);
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 face = Ffind_face (name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
781 if (!NILP (face))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
782 return face;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
783
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
784 f = allocate_face ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
785 XSETFACE (face, f);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
786
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
787 f->name = name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
788 f->doc_string = doc_string;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
789 f->foreground = Fmake_specifier (Qcolor);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
790 set_color_attached_to (f->foreground, face, Qforeground);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
791 f->background = Fmake_specifier (Qcolor);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
792 set_color_attached_to (f->background, face, Qbackground);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
793 f->font = Fmake_specifier (Qfont);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
794 set_font_attached_to (f->font, face, Qfont);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
795 f->background_pixmap = Fmake_specifier (Qimage);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
796 set_image_attached_to (f->background_pixmap, face, Qbackground_pixmap);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
797 f->display_table = Fmake_specifier (Qdisplay_table);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
798 f->underline = Fmake_specifier (Qface_boolean);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
799 set_face_boolean_attached_to (f->underline, face, Qunderline);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
800 f->strikethru = Fmake_specifier (Qface_boolean);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
801 set_face_boolean_attached_to (f->strikethru, face, Qstrikethru);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
802 f->highlight = Fmake_specifier (Qface_boolean);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
803 set_face_boolean_attached_to (f->highlight, face, Qhighlight);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
804 f->dim = Fmake_specifier (Qface_boolean);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
805 set_face_boolean_attached_to (f->dim, face, Qdim);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
806 f->blinking = Fmake_specifier (Qface_boolean);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
807 set_face_boolean_attached_to (f->blinking, face, Qblinking);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
808 f->reverse = Fmake_specifier (Qface_boolean);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
809 set_face_boolean_attached_to (f->reverse, face, Qreverse);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
810 if (!NILP (Vdefault_face))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
811 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
812 /* If the default face has already been created, set it as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
813 the default fallback specifier for all the specifiers we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
814 just created. This implements the standard "all faces
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
815 inherit from default" behavior. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
816 set_specifier_fallback (f->foreground,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
817 Fget (Vdefault_face, Qforeground, Qunbound));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
818 set_specifier_fallback (f->background,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
819 Fget (Vdefault_face, Qbackground, Qunbound));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
820 set_specifier_fallback (f->font,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
821 Fget (Vdefault_face, Qfont, Qunbound));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
822 set_specifier_fallback (f->background_pixmap,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
823 Fget (Vdefault_face, Qbackground_pixmap,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
824 Qunbound));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
825 set_specifier_fallback (f->display_table,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
826 Fget (Vdefault_face, Qdisplay_table, Qunbound));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
827 set_specifier_fallback (f->underline,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
828 Fget (Vdefault_face, Qunderline, Qunbound));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
829 set_specifier_fallback (f->strikethru,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
830 Fget (Vdefault_face, Qstrikethru, Qunbound));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
831 set_specifier_fallback (f->highlight,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
832 Fget (Vdefault_face, Qhighlight, Qunbound));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
833 set_specifier_fallback (f->dim,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
834 Fget (Vdefault_face, Qdim, Qunbound));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
835 set_specifier_fallback (f->blinking,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
836 Fget (Vdefault_face, Qblinking, Qunbound));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
837 set_specifier_fallback (f->reverse,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
838 Fget (Vdefault_face, Qreverse, Qunbound));
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
841 /* Add the face to the appropriate list. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
842 if (NILP (temporary))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
843 Fputhash (name, face, Vpermanent_faces_cache);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
844 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
845 Fputhash (name, face, Vtemporary_faces_cache);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
846
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
847 /* Note that it's OK if we dump faces.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
848 When we start up again when we're not noninteractive,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
849 `init-global-faces' is called and it resources all
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
850 existing faces. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
851 if (initialized && !noninteractive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
852 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
853 struct gcpro gcpro1, gcpro2;
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 GCPRO2 (name, face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
856 call1 (Qinit_face_from_resources, name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
857 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
858 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
859
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
860 return face;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
864 /*****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
865 initialization code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
866 ****************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
867
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
868 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
869 init_global_faces (struct device *d)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
870 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
871 /* When making the initial terminal device, there is no Lisp code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
872 loaded, so we can't do this. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
873 if (initialized && !noninteractive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
874 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
875 call_critical_lisp_code (d, Qinit_global_faces, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
876 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
877 }
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 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
880 init_device_faces (struct device *d)
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 /* This function can call lisp */
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 /* When making the initial terminal device, there is no Lisp code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
885 loaded, so we can't do this. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
886 if (initialized)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
887 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
888 Lisp_Object tdevice;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
889 XSETDEVICE (tdevice, d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
890 call_critical_lisp_code (d, Qinit_device_faces, tdevice);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
891 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
892 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
893
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
894 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
895 init_frame_faces (struct frame *frm)
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 /* When making the initial terminal device, there is no Lisp code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
898 loaded, so we can't do this. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
899 if (initialized)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
900 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
901 Lisp_Object tframe;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
902 XSETFRAME (tframe, frm);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
903
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
904 /* DO NOT change the selected frame here. If the debugger goes off
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
905 it will try and display on the frame being created, but it is not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
906 ready for that yet and a horrible death will occur. Any random
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
907 code depending on the selected-frame as an implicit arg should be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
908 tracked down and shot. For the benefit of the one known,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
909 xpm-color-symbols, make-frame sets the variable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
910 Vframe_being_created to the frame it is making and sets it to nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
911 when done. Internal functions that this could trigger which are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
912 currently depending on selected-frame should use this instead. It
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
913 is not currently visible at the lisp level. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
914 call_critical_lisp_code (XDEVICE (FRAME_DEVICE (frm)),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
915 Qinit_frame_faces, tframe);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
916 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
917 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
918
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
919
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
920 /****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
921 * face cache element functions *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
922 ****************************************************************************/
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
926 #### Here is a description of how the face cache elements ought
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
927 to be redone. It is *NOT* how they work currently:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
928
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
929 However, when I started to go about implementing this, I realized
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
930 that there are all sorts of subtle problems with cache coherency
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
931 that are coming up. As it turns out, these problems don't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
932 manifest themselves now due to the brute-force "kill 'em all"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
933 approach to cache invalidation when faces change; but if this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
934 is ever made smarter, these problems are going to come up, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
935 some of them are very non-obvious.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
936
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
937 I'm thinking of redoing the cache code a bit to avoid these
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
938 coherency problems. The bulk of the problems will arise because
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
939 the current display structures have simple indices into the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
940 face cache, but the cache can be changed at various times,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
941 which could make the current display structures incorrect.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
942 I guess the dirty and updated flags are an attempt to fix
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
943 this, but this approach doesn't really work.
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 Here's an approach that should keep things clean and unconfused:
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 1) Imagine a "virtual face cache" that can grow arbitrarily
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
948 big and for which the only thing allowed is to add new
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
949 elements. Existing elements cannot be removed or changed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
950 This way, any pointers in the existing redisplay structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
951 into the cache never get screwed up. (This is important
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
952 because even if a cache element is out of date, if there's
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
953 a pointer to it then its contents still accurately describe
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
954 the way the text currently looks on the screen.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
955 2) Each element in the virtual cache either describes exactly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
956 one face, or describes the merger of a number of faces
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
957 by some process. In order to simplify things, for mergers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
958 we do not record which faces or ordering was used, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
959 simply that this cache element is the result of merging.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
960 Unlike the current implementation, it's important that a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
961 single cache element not be used to both describe a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
962 single face and describe a merger, even if all the property
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
963 values are the same.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
964 3) Each cache element can be clean or dirty. "Dirty" means
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
965 that the face that the element points to has been changed;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
966 this gets set at the time the face is changed. This
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
967 way, when looking up a value in the cache, you can determine
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
968 whether it's out of date or not. For merged faces it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
969 does not matter -- we don't record the faces or priority
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
970 used to create the merger, so it's impossible to look up
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
971 one of these faces. We have to recompute it each time.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
972 Luckily, this is fine -- doing the merge is much
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
973 less expensive than recomputing the properties of a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
974 single face.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
975 4) For each cache element, we keep a hash value. (In order
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
976 to hash the boolean properties, we convert each of them
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
977 into a different large prime number so that the hashing works
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
978 well.) This allows us, when comparing runes, to properly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
979 determine whether the face for that rune has changed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
980 This will be especially important for TTY's, where there
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
981 aren't that many faces and minimizing redraw is very
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
982 important.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
983 5) We can't actually keep an infinite cache, but that doesn't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
984 really matter that much. The only elements we care about
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
985 are those that are used by either the current or desired
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
986 display structs. Therefore, we keep a per-window
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
987 redisplay iteration number, and mark each element with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
988 that number as we use it. Just after outputting the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
989 window and synching the redisplay structs, we go through
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
990 the cache and invalidate all elements that are not clean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
991 elements referring to a particular face and that do not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
992 have an iteration number equal to the current one. We
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
993 keep them in a chain, and use them to allocate new
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
994 elements when possible instead of increasing the Dynarr.
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
998 /* mark for GC a dynarr of face cachels. */
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 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1001 mark_face_cachels (face_cachel_dynarr *elements)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1002 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1003 int elt;
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 (!elements)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1006 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1007
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1008 for (elt = 0; elt < Dynarr_length (elements); elt++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1009 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1010 struct face_cachel *cachel = Dynarr_atp (elements, elt);
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 int i;
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 for (i = 0; i < NUM_LEADING_BYTES; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1016 if (!NILP (cachel->font[i]) && !UNBOUNDP (cachel->font[i]))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1017 mark_object (cachel->font[i]);
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 mark_object (cachel->face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1020 mark_object (cachel->foreground);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1021 mark_object (cachel->background);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1022 mark_object (cachel->display_table);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1023 mark_object (cachel->background_pixmap);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1024 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1025 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1026
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1027 /* ensure that the given cachel contains an updated font value for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1028 the given charset. Return the updated font value. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1029
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1030 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1031 ensure_face_cachel_contains_charset (struct face_cachel *cachel,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1032 Lisp_Object domain, Lisp_Object charset)
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 Lisp_Object new_val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1035 Lisp_Object face = cachel->face;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1036 int bound = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1037 int offs = XCHARSET_LEADING_BYTE (charset) - MIN_LEADING_BYTE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1038
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1039 if (!UNBOUNDP (cachel->font[offs])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1040 && cachel->font_updated[offs])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1041 return cachel->font[offs];
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 if (UNBOUNDP (face))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1044 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1045 /* a merged face. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1046 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1047 struct window *w = XWINDOW (domain);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1048
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1049 new_val = Qunbound;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1050 cachel->font_specified[offs] = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1051 for (i = 0; i < cachel->nfaces; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1052 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1053 struct face_cachel *oth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1054
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1055 oth = Dynarr_atp (w->face_cachels,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1056 FACE_CACHEL_FINDEX_UNSAFE (cachel, i));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1057 /* Tout le monde aime la recursion */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1058 ensure_face_cachel_contains_charset (oth, domain, charset);
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 (oth->font_specified[offs])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1061 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1062 new_val = oth->font[offs];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1063 cachel->font_specified[offs] = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1064 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1065 }
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1068 if (!cachel->font_specified[offs])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1069 /* need to do the default face. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1070 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1071 struct face_cachel *oth =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1072 Dynarr_atp (w->face_cachels, DEFAULT_INDEX);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1073 ensure_face_cachel_contains_charset (oth, domain, charset);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1074
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1075 new_val = oth->font[offs];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1076 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1077
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1078 if (!UNBOUNDP (cachel->font[offs]) && !EQ (cachel->font[offs], new_val))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1079 cachel->dirty = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1080 cachel->font_updated[offs] = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1081 cachel->font[offs] = new_val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1082 return new_val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1083 }
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 new_val = face_property_matching_instance (face, Qfont, charset, domain,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1086 /* #### look into ERROR_ME_NOT */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1087 ERROR_ME_NOT, 1, Qzero);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1088 if (UNBOUNDP (new_val))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1089 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1090 bound = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1091 new_val = face_property_matching_instance (face, Qfont,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1092 charset, domain,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1093 /* #### look into
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1094 ERROR_ME_NOT */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1095 ERROR_ME_NOT, 0, Qzero);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1096 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1097 if (!UNBOUNDP (cachel->font[offs]) && !EQ (new_val, cachel->font[offs]))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1098 cachel->dirty = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1099 cachel->font_updated[offs] = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1100 cachel->font[offs] = new_val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1101 cachel->font_specified[offs] = (bound || EQ (face, Vdefault_face));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1102 return new_val;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1105 /* Ensure that the given cachel contains updated fonts for all
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1106 the charsets specified. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1107
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1108 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1109 ensure_face_cachel_complete (struct face_cachel *cachel,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1110 Lisp_Object domain, unsigned char *charsets)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1111 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1112 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1113
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1114 for (i = 0; i < NUM_LEADING_BYTES; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1115 if (charsets[i])
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 Lisp_Object charset = CHARSET_BY_LEADING_BYTE (i + MIN_LEADING_BYTE);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1118 assert (CHARSETP (charset));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1119 ensure_face_cachel_contains_charset (cachel, domain, charset);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1120 }
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1123 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1124 face_cachel_charset_font_metric_info (struct face_cachel *cachel,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1125 unsigned char *charsets,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1126 struct font_metric_info *fm)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1127 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1128 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1129
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1130 fm->width = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1131 fm->height = fm->ascent = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1132 fm->descent = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1133 fm->proportional_p = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1134
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1135 for (i = 0; i < NUM_LEADING_BYTES; i++)
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 (charsets[i])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1138 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1139 Lisp_Object charset = CHARSET_BY_LEADING_BYTE (i + MIN_LEADING_BYTE);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1140 Lisp_Object font_instance = FACE_CACHEL_FONT (cachel, charset);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
1141 Lisp_Font_Instance *fi = XFONT_INSTANCE (font_instance);
428
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 assert (CHARSETP (charset));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1144 assert (FONT_INSTANCEP (font_instance));
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 if (fm->ascent < (int) fi->ascent) fm->ascent = (int) fi->ascent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1147 if (fm->descent < (int) fi->descent) fm->descent = (int) fi->descent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1148 fm->height = fm->ascent + fm->descent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1149 if (fi->proportional_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1150 fm->proportional_p = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1151 if (EQ (charset, Vcharset_ascii))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1152 fm->width = fi->width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1153 }
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 #define FROB(field) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1158 do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1159 Lisp_Object new_val = \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1160 FACE_PROPERTY_INSTANCE (face, Q##field, domain, 1, Qzero); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1161 int bound = 1; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1162 if (UNBOUNDP (new_val)) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1163 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1164 bound = 0; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1165 new_val = FACE_PROPERTY_INSTANCE (face, Q##field, domain, 0, Qzero); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1166 } \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1167 if (!EQ (new_val, cachel->field)) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1168 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1169 cachel->field = new_val; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1170 cachel->dirty = 1; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1171 } \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1172 cachel->field##_specified = (bound || default_face); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1173 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1174
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1175 /*
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1176 * A face's background pixmap will override the face's
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1177 * background color. But the background pixmap of the
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1178 * default face should not override the background color of
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1179 * a face if the background color has been specified or
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1180 * inherited.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1181 *
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1182 * To accomplish this we remove the background pixmap of the
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1183 * cachel and mark it as having been specified so that cachel
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1184 * merging won't override it later.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1185 */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1186 #define MAYBE_UNFROB_BACKGROUND_PIXMAP \
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1187 do \
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1188 { \
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1189 if (! default_face \
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1190 && cachel->background_specified \
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1191 && ! cachel->background_pixmap_specified) \
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1192 { \
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1193 cachel->background_pixmap = Qunbound; \
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1194 cachel->background_pixmap_specified = 1; \
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1195 } \
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1196 } while (0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1197
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1198
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1199 /* Add a cachel for the given face to the given window's cache. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1200
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1201 static void
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1202 add_face_cachel (struct window *w, Lisp_Object face)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1203 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1204 int must_finish_frobbing = ! WINDOW_FACE_CACHEL (w, DEFAULT_INDEX);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1205 struct face_cachel new_cachel;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1206 Lisp_Object domain;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1207
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1208 reset_face_cachel (&new_cachel);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1209 XSETWINDOW (domain, w);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1210 update_face_cachel_data (&new_cachel, domain, face);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1211 Dynarr_add (w->face_cachels, new_cachel);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1212
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1213 /* The face's background pixmap have not yet been frobbed (see comment
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1214 int update_face_cachel_data), so we have to do it now */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1215 if (must_finish_frobbing)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1216 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1217 int default_face = EQ (face, Vdefault_face);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1218 struct face_cachel *cachel
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1219 = Dynarr_atp (w->face_cachels, Dynarr_length (w->face_cachels) - 1);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1220
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1221 FROB (background_pixmap);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1222 MAYBE_UNFROB_BACKGROUND_PIXMAP;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1223 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1224 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1225
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1226 /* Called when the updated flag has been cleared on a cachel.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1227 This function returns 1 if the caller must finish the update (see comment
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1228 below), 0 otherwise.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1229 */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1230
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1231 void
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1232 update_face_cachel_data (struct face_cachel *cachel,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1233 Lisp_Object domain,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1234 Lisp_Object face)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1235 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1236 if (XFACE (face)->dirty || UNBOUNDP (cachel->face))
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1237 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1238 int default_face = EQ (face, Vdefault_face);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1239 cachel->face = face;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1240
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1241 /* We normally only set the _specified flags if the value was
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1242 actually bound. The exception is for the default face where
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1243 we always set it since it is the ultimate fallback. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1244
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1245 FROB (foreground);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1246 FROB (background);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1247 FROB (display_table);
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1248
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1249 /* #### WARNING: the background pixmap property of faces is currently
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1250 the only one dealing with images. The problem we have here is that
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1251 frobbing the background pixmap might lead to image instantiation
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1252 which in turn might require that the cache we're building be up to
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1253 date, hence a crash. Here's a typical scenario of this:
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1254
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1255 - a new window is created and it's face cache elements are
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1256 initialized through a call to reset_face_cachels[1]. At that point,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1257 the cache for the default and modeline faces (normaly taken care of
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1258 by redisplay itself) are null.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1259 - the default face has a background pixmap which needs to be
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1260 instantiated right here, as a consequence of cache initialization.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1261 - the background pixmap image happens to be instantiated as a string
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1262 (this happens on tty's for instance).
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1263 - In order to do this, we need to compute the string geometry.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1264 - In order to do this, we might have to access the window's default
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1265 face cache. But this is the cache we're building right now, it is
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1266 null.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1267 - BARF !!!!!
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1268
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1269 To sum up, this means that it is in general unsafe to instantiate
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1270 images before face cache updating is complete (appart from image
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1271 related face attributes). The solution we use below is to actually
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1272 detect whether we're building the window's face_cachels for the first
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1273 time, and simply NOT frob the background pixmap in that case. If
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1274 other image-related face attributes are ever implemented, they should
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1275 be protected the same way right here.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1276
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1277 One note:
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1278 * See comment in `default_face_font_info' in face.c. Who wrote it ?
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1279 Maybe we have the begining of an answer here ?
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1280
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1281 Footnotes:
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1282 [1] See comment at the top of `allocate_window' in window.c.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1283
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1284 -- didier
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1285 */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1286 if (! WINDOWP (domain)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1287 || WINDOW_FACE_CACHEL (DOMAIN_XWINDOW (domain), DEFAULT_INDEX))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1288 {
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1289 FROB (background_pixmap);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1290 MAYBE_UNFROB_BACKGROUND_PIXMAP;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1291 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1292 #undef FROB
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1293 #undef MAYBE_UNFROB_BACKGROUND_PIXMAP
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1294
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1295 ensure_face_cachel_contains_charset (cachel, domain, Vcharset_ascii);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1296
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1297 #define FROB(field) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1298 do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1299 Lisp_Object new_val = \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1300 FACE_PROPERTY_INSTANCE (face, Q##field, domain, 1, Qzero); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1301 int bound = 1; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1302 unsigned int new_val_int; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1303 if (UNBOUNDP (new_val)) \
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 bound = 0; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1306 new_val = FACE_PROPERTY_INSTANCE (face, Q##field, domain, 0, Qzero); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1307 } \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1308 new_val_int = EQ (new_val, Qt); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1309 if (cachel->field != new_val_int) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1310 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1311 cachel->field = new_val_int; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1312 cachel->dirty = 1; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1313 } \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1314 cachel->field##_specified = bound; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1315 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1316
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1317 FROB (underline);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1318 FROB (strikethru);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1319 FROB (highlight);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1320 FROB (dim);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1321 FROB (reverse);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1322 FROB (blinking);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1323 #undef FROB
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1324 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1325
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1326 cachel->updated = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1327 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1328
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1329 /* Merge the cachel identified by FINDEX in window W into the given
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1330 cachel. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1331
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1332 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1333 merge_face_cachel_data (struct window *w, face_index findex,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1334 struct face_cachel *cachel)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1335 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1336 #define FINDEX_FIELD(field) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1337 Dynarr_atp (w->face_cachels, findex)->field
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 #define FROB(field) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1340 do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1341 if (!cachel->field##_specified && FINDEX_FIELD (field##_specified)) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1342 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1343 cachel->field = FINDEX_FIELD (field); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1344 cachel->field##_specified = 1; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1345 cachel->dirty = 1; \
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 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1348
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1349 FROB (foreground);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1350 FROB (background);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1351 FROB (display_table);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1352 FROB (background_pixmap);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1353 FROB (underline);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1354 FROB (strikethru);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1355 FROB (highlight);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1356 FROB (dim);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1357 FROB (reverse);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1358 FROB (blinking);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1359 /* And do ASCII, of course. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1360 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1361 int offs = LEADING_BYTE_ASCII - MIN_LEADING_BYTE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1362
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1363 if (!cachel->font_specified[offs] && FINDEX_FIELD (font_specified[offs]))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1364 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1365 cachel->font[offs] = FINDEX_FIELD (font[offs]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1366 cachel->font_specified[offs] = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1367 cachel->dirty = 1;
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 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1370
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1371 #undef FROB
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1372 #undef FINDEX_FIELD
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1373
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1374 cachel->updated = 1;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1377 /* Initialize a cachel. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1378
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1379 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1380 reset_face_cachel (struct face_cachel *cachel)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1381 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1382 xzero (*cachel);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1383 cachel->face = Qunbound;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1384 cachel->nfaces = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1385 cachel->merged_faces = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1386 cachel->foreground = Qunbound;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1387 cachel->background = Qunbound;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1388 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1389 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1390
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1391 for (i = 0; i < NUM_LEADING_BYTES; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1392 cachel->font[i] = Qunbound;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1393 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1394 cachel->display_table = Qunbound;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1395 cachel->background_pixmap = Qunbound;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1396 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1397
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1398 /* Retrieve the index to a cachel for window W that corresponds to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1399 the specified face. If necessary, add a new element to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1400 cache. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1401
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1402 face_index
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1403 get_builtin_face_cache_index (struct window *w, Lisp_Object face)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1404 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1405 int elt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1406
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1407 if (noninteractive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1408 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1409
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1410 for (elt = 0; elt < Dynarr_length (w->face_cachels); elt++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1411 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1412 struct face_cachel *cachel = WINDOW_FACE_CACHEL (w, elt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1413
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1414 if (EQ (cachel->face, face))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1415 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1416 Lisp_Object window;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1417 XSETWINDOW (window, w);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1418 if (!cachel->updated)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1419 update_face_cachel_data (cachel, window, face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1420 return elt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1421 }
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1424 /* If we didn't find the face, add it and then return its index. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1425 add_face_cachel (w, face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1426 return elt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1427 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1429 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1430 reset_face_cachels (struct window *w)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1431 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1432 /* #### Not initialized in batch mode for the stream device. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1433 if (w->face_cachels)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1434 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1435 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1436
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1437 for (i = 0; i < Dynarr_length (w->face_cachels); i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1438 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1439 struct face_cachel *cachel = Dynarr_atp (w->face_cachels, i);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1440 if (cachel->merged_faces)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1441 Dynarr_free (cachel->merged_faces);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1442 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1443 Dynarr_reset (w->face_cachels);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1444 get_builtin_face_cache_index (w, Vdefault_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1445 get_builtin_face_cache_index (w, Vmodeline_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1446 XFRAME (w->frame)->window_face_cache_reset = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1447 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1448 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1449
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1450 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1451 mark_face_cachels_as_clean (struct window *w)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1452 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1453 int elt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1454
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1455 for (elt = 0; elt < Dynarr_length (w->face_cachels); elt++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1456 Dynarr_atp (w->face_cachels, elt)->dirty = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1457 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1458
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1459 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1460 mark_face_cachels_as_not_updated (struct window *w)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1461 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1462 int elt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1463
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1464 for (elt = 0; elt < Dynarr_length (w->face_cachels); elt++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1465 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1466 struct face_cachel *cachel = Dynarr_atp (w->face_cachels, elt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1467 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1468
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1469 cachel->updated = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1470 for (i = 0; i < NUM_LEADING_BYTES; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1471 cachel->font_updated[i] = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1472 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1473 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1474
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1475 #ifdef MEMORY_USAGE_STATS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1476
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1477 int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1478 compute_face_cachel_usage (face_cachel_dynarr *face_cachels,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1479 struct overhead_stats *ovstats)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1480 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1481 int total = 0;
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 if (face_cachels)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1484 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1485 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1486
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1487 total += Dynarr_memory_usage (face_cachels, ovstats);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1488 for (i = 0; i < Dynarr_length (face_cachels); i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1489 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1490 int_dynarr *merged = Dynarr_at (face_cachels, i).merged_faces;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1491 if (merged)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1492 total += Dynarr_memory_usage (merged, ovstats);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1493 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1494 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1495
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1496 return total;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1497 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1498
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1499 #endif /* MEMORY_USAGE_STATS */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1500
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1501
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1502 /*****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1503 * merged face functions *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1504 *****************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1505
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1506 /* Compare two merged face cachels to determine whether we have to add
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1507 a new entry to the face cache.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1508
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1509 Note that we do not compare the attributes, but just the faces the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1510 cachels are based on. If they are the same, then the cachels certainly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1511 ought to have the same attributes, except in the case where fonts
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1512 for different charsets have been determined in the two -- and in that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1513 case this difference is fine. */
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 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1516 compare_merged_face_cachels (struct face_cachel *cachel1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1517 struct face_cachel *cachel2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1518 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1519 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1520
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1521 if (!EQ (cachel1->face, cachel2->face)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1522 || cachel1->nfaces != cachel2->nfaces)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1523 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1524
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1525 for (i = 0; i < cachel1->nfaces; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1526 if (FACE_CACHEL_FINDEX_UNSAFE (cachel1, i)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1527 != FACE_CACHEL_FINDEX_UNSAFE (cachel2, i))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1528 return 0;
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 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1531 }
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 /* Retrieve the index to a cachel for window W that corresponds to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1534 the specified cachel. If necessary, add a new element to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1535 cache. This is similar to get_builtin_face_cache_index() but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1536 is intended for merged cachels rather than for cachels representing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1537 just a face.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1538
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1539 Note that a merged cachel for just one face is not the same as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1540 the simple cachel for that face, because it is also merged with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1541 the default face. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1542
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1543 static face_index
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1544 get_merged_face_cache_index (struct window *w,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1545 struct face_cachel *merged_cachel)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1546 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1547 int elt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1548 int cache_size = Dynarr_length (w->face_cachels);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1549
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1550 for (elt = 0; elt < cache_size; elt++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1551 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1552 struct face_cachel *cachel =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1553 Dynarr_atp (w->face_cachels, elt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1554
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1555 if (compare_merged_face_cachels (cachel, merged_cachel))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1556 return elt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1557 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1558
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1559 /* We didn't find it so add this instance to the cache. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1560 merged_cachel->updated = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1561 merged_cachel->dirty = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1562 Dynarr_add (w->face_cachels, *merged_cachel);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1563 return cache_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1564 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1565
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1566 face_index
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1567 get_extent_fragment_face_cache_index (struct window *w,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1568 struct extent_fragment *ef)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1569 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1570 struct face_cachel cachel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1571 int len = Dynarr_length (ef->extents);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1572 face_index findex = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1573 Lisp_Object window;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1574 XSETWINDOW (window, w);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1575
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1576 /* Optimize the default case. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1577 if (len == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1578 return DEFAULT_INDEX;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1579 else
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 int i;
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 /* Merge the faces of the extents together in order. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1584
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1585 reset_face_cachel (&cachel);
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 for (i = len - 1; i >= 0; i--)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1588 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1589 EXTENT current = Dynarr_at (ef->extents, i);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1590 int has_findex = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1591 Lisp_Object face = extent_face (current);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1592
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1593 if (FACEP (face))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1594 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1595 findex = get_builtin_face_cache_index (w, face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1596 has_findex = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1597 merge_face_cachel_data (w, findex, &cachel);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1598 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1599 /* remember, we're called from within redisplay
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1600 so we can't error. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1601 else while (CONSP (face))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1602 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1603 Lisp_Object one_face = XCAR (face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1604 if (FACEP (one_face))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1605 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1606 findex = get_builtin_face_cache_index (w, one_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1607 merge_face_cachel_data (w, findex, &cachel);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1608
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1609 /* code duplication here but there's no clean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1610 way to avoid it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1611 if (cachel.nfaces >= NUM_STATIC_CACHEL_FACES)
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 if (!cachel.merged_faces)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1614 cachel.merged_faces = Dynarr_new (int);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1615 Dynarr_add (cachel.merged_faces, findex);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1616 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1617 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1618 cachel.merged_faces_static[cachel.nfaces] = findex;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1619 cachel.nfaces++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1620 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1621 face = XCDR (face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1622 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1623
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1624 if (has_findex)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1625 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1626 if (cachel.nfaces >= NUM_STATIC_CACHEL_FACES)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1627 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1628 if (!cachel.merged_faces)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1629 cachel.merged_faces = Dynarr_new (int);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1630 Dynarr_add (cachel.merged_faces, findex);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1631 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1632 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1633 cachel.merged_faces_static[cachel.nfaces] = findex;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1634 cachel.nfaces++;
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 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1637
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1638 /* Now finally merge in the default face. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1639 findex = get_builtin_face_cache_index (w, Vdefault_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1640 merge_face_cachel_data (w, findex, &cachel);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1641
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1642 findex = get_merged_face_cache_index (w, &cachel);
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1643 if (cachel.merged_faces &&
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1644 /* merged_faces did not get stored and available via return value */
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1645 Dynarr_at (w->face_cachels, findex).merged_faces !=
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1646 cachel.merged_faces)
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1647 {
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1648 Dynarr_free (cachel.merged_faces);
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1649 cachel.merged_faces = 0;
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1650 }
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1651 return findex;
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 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1654
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 /*****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1657 interface functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1658 ****************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1659
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1660 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1661 update_EmacsFrame (Lisp_Object frame, Lisp_Object name)
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 struct frame *frm = XFRAME (frame);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1664
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1665 if (EQ (name, Qfont))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1666 MARK_FRAME_SIZE_SLIPPED (frm);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1667
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1668 MAYBE_FRAMEMETH (frm, update_frame_external_traits, (frm, name));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1669 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1670
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1671 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1672 update_EmacsFrames (Lisp_Object locale, Lisp_Object name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1673 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1674 if (FRAMEP (locale))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1675 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1676 update_EmacsFrame (locale, name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1677 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1678 else if (DEVICEP (locale))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1679 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1680 Lisp_Object frmcons;
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 DEVICE_FRAME_LOOP (frmcons, XDEVICE (locale))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1683 update_EmacsFrame (XCAR (frmcons), name);
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 else if (EQ (locale, Qglobal) || EQ (locale, Qfallback))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1686 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1687 Lisp_Object frmcons, devcons, concons;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1688
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1689 FRAME_LOOP_NO_BREAK (frmcons, devcons, concons)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1690 update_EmacsFrame (XCAR (frmcons), name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1691 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1692 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1693
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1694 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1695 update_frame_face_values (struct frame *f)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1696 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1697 Lisp_Object frm;
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 XSETFRAME (frm, f);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1700 update_EmacsFrame (frm, Qforeground);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1701 update_EmacsFrame (frm, Qbackground);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1702 update_EmacsFrame (frm, Qfont);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1703 }
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 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1706 face_property_was_changed (Lisp_Object face, Lisp_Object property,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1707 Lisp_Object locale)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1708 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1709 int default_face = EQ (face, Vdefault_face);
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 /* If the locale could affect the frame value, then call
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1712 update_EmacsFrames just in case. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1713 if (default_face &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1714 (EQ (property, Qforeground) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1715 EQ (property, Qbackground) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1716 EQ (property, Qfont)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1717 update_EmacsFrames (locale, property);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1718
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1719 if (WINDOWP (locale))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1720 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1721 MARK_FRAME_FACES_CHANGED (XFRAME (XWINDOW (locale)->frame));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1722 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1723 else if (FRAMEP (locale))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1724 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1725 MARK_FRAME_FACES_CHANGED (XFRAME (locale));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1726 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1727 else if (DEVICEP (locale))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1728 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1729 MARK_DEVICE_FRAMES_FACES_CHANGED (XDEVICE (locale));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1730 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1731 else
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 Lisp_Object devcons, concons;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1734 DEVICE_LOOP_NO_BREAK (devcons, concons)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1735 MARK_DEVICE_FRAMES_FACES_CHANGED (XDEVICE (XCAR (devcons)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1736 }
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 * This call to update_faces_inheritance isn't needed and makes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1740 * creating and modifying faces _very_ slow. The point of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1741 * update_face_inheritances is to find all faces that inherit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1742 * directly from this face property and set the specifier "dirty"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1743 * flag on the corresponding specifier. This forces recaching of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1744 * cached specifier values in frame and window struct slots. But
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1745 * currently no face properties are cached in frame and window
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1746 * struct slots, so calling this function does nothing useful!
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 * Further, since update_faces_inheritance maps over the whole
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1749 * face table every time it is called, it gets terribly slow when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1750 * there are many faces. Creating 500 faces on a 50Mhz 486 took
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1751 * 433 seconds when update_faces_inheritance was called. With the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1752 * call commented out, creating those same 500 faces took 0.72
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1753 * seconds.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1754 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1755 /* update_faces_inheritance (face, property);*/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1756 XFACE (face)->dirty = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1757 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1758
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1759 DEFUN ("copy-face", Fcopy_face, 2, 6, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1760 Define and return a new face which is a copy of an existing one,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1761 or makes an already-existing face be exactly like another.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1762 LOCALE, TAG-SET, EXACT-P, and HOW-TO-ADD are as in `copy-specifier'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1763 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1764 (old_face, new_name, locale, tag_set, exact_p, how_to_add))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1765 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
1766 Lisp_Face *fold, *fnew;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1767 Lisp_Object new_face = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1768 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
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 old_face = Fget_face (old_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1771
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1772 /* We GCPRO old_face because it might be temporary, and GCing could
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1773 occur in various places below. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1774 GCPRO4 (tag_set, locale, old_face, new_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1775 /* check validity of how_to_add now. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1776 decode_how_to_add_specification (how_to_add);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1777 /* and of tag_set. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1778 tag_set = decode_specifier_tag_set (tag_set);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1779 /* and of locale. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1780 locale = decode_locale_list (locale);
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 new_face = Ffind_face (new_name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1783 if (NILP (new_face))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1784 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1785 Lisp_Object temp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1786
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1787 CHECK_SYMBOL (new_name);
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 /* Create the new face with the same status as the old face. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1790 temp = (NILP (Fgethash (old_face, Vtemporary_faces_cache, Qnil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1791 ? Qnil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1792 : Qt);
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 new_face = Fmake_face (new_name, Qnil, temp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1795 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1796
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1797 fold = XFACE (old_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1798 fnew = XFACE (new_face);
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 #define COPY_PROPERTY(property) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1801 Fcopy_specifier (fold->property, fnew->property, \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1802 locale, tag_set, exact_p, how_to_add);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1803
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1804 COPY_PROPERTY (foreground);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1805 COPY_PROPERTY (background);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1806 COPY_PROPERTY (font);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1807 COPY_PROPERTY (display_table);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1808 COPY_PROPERTY (background_pixmap);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1809 COPY_PROPERTY (underline);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1810 COPY_PROPERTY (strikethru);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1811 COPY_PROPERTY (highlight);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1812 COPY_PROPERTY (dim);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1813 COPY_PROPERTY (blinking);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1814 COPY_PROPERTY (reverse);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1815 #undef COPY_PROPERTY
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1816 /* #### should it copy the individual specifiers, if they exist? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1817 fnew->plist = Fcopy_sequence (fold->plist);
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 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1820
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1821 return new_name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1822 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1823
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 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1826 syms_of_faces (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1827 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1828 INIT_LRECORD_IMPLEMENTATION (face);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1829
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
1830 /* Qdefault, Qwidget, Qleft_margin, Qright_margin defined in general.c */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
1831 DEFSYMBOL (Qmodeline);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
1832 DEFSYMBOL (Qgui_element);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
1833 DEFSYMBOL (Qtext_cursor);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
1834 DEFSYMBOL (Qvertical_divider);
428
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 DEFSUBR (Ffacep);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1837 DEFSUBR (Ffind_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1838 DEFSUBR (Fget_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1839 DEFSUBR (Fface_name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1840 DEFSUBR (Fbuilt_in_face_specifiers);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1841 DEFSUBR (Fface_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1842 DEFSUBR (Fmake_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1843 DEFSUBR (Fcopy_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1844
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
1845 DEFSYMBOL (Qfacep);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
1846 DEFSYMBOL (Qforeground);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
1847 DEFSYMBOL (Qbackground);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1848 /* Qfont defined in general.c */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
1849 DEFSYMBOL (Qdisplay_table);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
1850 DEFSYMBOL (Qbackground_pixmap);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
1851 DEFSYMBOL (Qunderline);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
1852 DEFSYMBOL (Qstrikethru);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1853 /* Qhighlight, Qreverse defined in general.c */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
1854 DEFSYMBOL (Qdim);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
1855 DEFSYMBOL (Qblinking);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1856
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
1857 DEFSYMBOL (Qinit_face_from_resources);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
1858 DEFSYMBOL (Qinit_global_faces);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
1859 DEFSYMBOL (Qinit_device_faces);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
1860 DEFSYMBOL (Qinit_frame_faces);
428
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1863 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1864 structure_type_create_faces (void)
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 struct structure_type *st;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1867
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1868 st = define_structure_type (Qface, face_validate, face_instantiate);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1869
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1870 define_structure_type_keyword (st, Qname, face_name_validate);
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 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1874 vars_of_faces (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1875 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1876 staticpro (&Vpermanent_faces_cache);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1877 Vpermanent_faces_cache = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1878 staticpro (&Vtemporary_faces_cache);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1879 Vtemporary_faces_cache = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1880
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1881 staticpro (&Vdefault_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1882 Vdefault_face = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1883 staticpro (&Vgui_element_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1884 Vgui_element_face = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1885 staticpro (&Vwidget_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1886 Vwidget_face = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1887 staticpro (&Vmodeline_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1888 Vmodeline_face = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1889 staticpro (&Vtoolbar_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1890 Vtoolbar_face = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1891
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1892 staticpro (&Vvertical_divider_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1893 Vvertical_divider_face = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1894 staticpro (&Vleft_margin_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1895 Vleft_margin_face = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1896 staticpro (&Vright_margin_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1897 Vright_margin_face = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1898 staticpro (&Vtext_cursor_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1899 Vtext_cursor_face = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1900 staticpro (&Vpointer_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1901 Vpointer_face = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1902
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1903 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1904 Lisp_Object syms[20];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1905 int n = 0;
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 syms[n++] = Qforeground;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1908 syms[n++] = Qbackground;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1909 syms[n++] = Qfont;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1910 syms[n++] = Qdisplay_table;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1911 syms[n++] = Qbackground_pixmap;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1912 syms[n++] = Qunderline;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1913 syms[n++] = Qstrikethru;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1914 syms[n++] = Qhighlight;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1915 syms[n++] = Qdim;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1916 syms[n++] = Qblinking;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1917 syms[n++] = Qreverse;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1918
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1919 Vbuilt_in_face_specifiers = Flist (n, syms);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1920 staticpro (&Vbuilt_in_face_specifiers);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1921 }
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1924 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1925 complex_vars_of_faces (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1926 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1927 Vpermanent_faces_cache =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1928 make_lisp_hash_table (10, HASH_TABLE_NON_WEAK, HASH_TABLE_EQ);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1929 Vtemporary_faces_cache =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1930 make_lisp_hash_table (0, HASH_TABLE_WEAK, HASH_TABLE_EQ);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1931
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1932 /* Create the default face now so we know what it is immediately. */
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 Vdefault_face = Qnil; /* so that Fmake_face() doesn't set up a bogus
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1935 default value */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1936 Vdefault_face = Fmake_face (Qdefault, build_string ("default face"),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1937 Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1938
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1939 /* Provide some last-resort fallbacks to avoid utter fuckage if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1940 someone provides invalid values for the global specifications. */
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 Lisp_Object fg_fb = Qnil, bg_fb = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1944
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
1945 #ifdef HAVE_GTK
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
1946 fg_fb = acons (list1 (Qgtk), build_string ("black"), fg_fb);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
1947 bg_fb = acons (list1 (Qgtk), build_string ("white"), bg_fb);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
1948 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1949 #ifdef HAVE_X_WINDOWS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1950 fg_fb = acons (list1 (Qx), build_string ("black"), fg_fb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1951 bg_fb = acons (list1 (Qx), build_string ("white"), bg_fb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1952 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1953 #ifdef HAVE_TTY
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1954 fg_fb = acons (list1 (Qtty), Fvector (0, 0), fg_fb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1955 bg_fb = acons (list1 (Qtty), Fvector (0, 0), bg_fb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1956 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1957 #ifdef HAVE_MS_WINDOWS
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
1958 fg_fb = acons (list1 (Qmsprinter), build_string ("black"), fg_fb);
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
1959 bg_fb = acons (list1 (Qmsprinter), build_string ("white"), bg_fb);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1960 fg_fb = acons (list1 (Qmswindows), build_string ("black"), fg_fb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1961 bg_fb = acons (list1 (Qmswindows), build_string ("white"), bg_fb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1962 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1963 set_specifier_fallback (Fget (Vdefault_face, Qforeground, Qnil), fg_fb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1964 set_specifier_fallback (Fget (Vdefault_face, Qbackground, Qnil), bg_fb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1965 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1966
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1967 /* #### We may want to have different fallback values if NeXTstep
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1968 support is compiled in. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1969 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1970 Lisp_Object inst_list = Qnil;
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
1971
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
1972 #if defined(HAVE_X_WINDOWS) || defined(HAVE_GTK)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
1973 /* This is kind of ugly because stephen wanted this to be CPP
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
1974 ** identical to the old version, at least for the initial
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
1975 ** checkin
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
1976 **
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
1977 ** WMP March 9, 2001
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
1978 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
1979
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1980 /* The same gory list from x-faces.el.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1981 (#### Perhaps we should remove the stuff from x-faces.el
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1982 and only depend on this stuff here? That should work.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1983 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1984 const char *fonts[] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1985 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1986 "-*-courier-medium-r-*-*-*-120-*-*-*-*-iso8859-*",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1987 "-*-courier-medium-r-*-*-*-120-*-*-*-*-iso8859-*",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1988 "-*-courier-*-r-*-*-*-120-*-*-*-*-iso8859-*",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1989 "-*-*-medium-r-*-*-*-120-*-*-m-*-iso8859-*",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1990 "-*-*-medium-r-*-*-*-120-*-*-c-*-iso8859-*",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1991 "-*-*-*-r-*-*-*-120-*-*-m-*-iso8859-*",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1992 "-*-*-*-r-*-*-*-120-*-*-c-*-iso8859-*",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1993 "-*-*-*-r-*-*-*-120-*-*-*-*-iso8859-*",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1994 "-*-*-medium-r-*-*-*-120-*-*-m-*-*-*",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1995 "-*-*-medium-r-*-*-*-120-*-*-c-*-*-*",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1996 "-*-*-*-r-*-*-*-120-*-*-m-*-*-*",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1997 "-*-*-*-r-*-*-*-120-*-*-c-*-*-*",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1998 "-*-*-*-r-*-*-*-120-*-*-*-*-*-*",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1999 "-*-*-*-*-*-*-*-120-*-*-*-*-*-*",
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 };
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2002 const char **fontptr;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2003
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
2004 #ifdef HAVE_X_WINDOWS
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2005 for (fontptr = fonts + countof(fonts) - 1; fontptr >= fonts; fontptr--)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2006 inst_list = Fcons (Fcons (list1 (Qx), build_string (*fontptr)),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2007 inst_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2008 #endif /* HAVE_X_WINDOWS */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2009
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
2010 #ifdef HAVE_GTK
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
2011 for (fontptr = fonts + countof(fonts) - 1; fontptr >= fonts; fontptr--)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
2012 inst_list = Fcons (Fcons (list1 (Qgtk), build_string (*fontptr)),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
2013 inst_list);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
2014 #endif /* HAVE_GTK */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
2015 #endif /* HAVE_X_WINDOWS || HAVE_GTK */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
2016
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
2017
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2018 #ifdef HAVE_TTY
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2019 inst_list = Fcons (Fcons (list1 (Qtty), build_string ("normal")),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2020 inst_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2021 #endif /* HAVE_TTY */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2022 #ifdef HAVE_MS_WINDOWS
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
2023 /* Fixedsys does not exist for printers */
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
2024 inst_list = Fcons (Fcons (list1 (Qmsprinter),
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
2025 build_string ("Courier:Regular:10::Western")), inst_list);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
2026 inst_list = Fcons (Fcons (list1 (Qmsprinter),
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
2027 build_string ("Courier New:Regular:10::Western")), inst_list);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
2028
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2029 inst_list = Fcons (Fcons (list1 (Qmswindows),
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
2030 build_string ("Fixedsys:Regular:9::Western")), inst_list);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2031 inst_list = Fcons (Fcons (list1 (Qmswindows),
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
2032 build_string ("Courier:Regular:10::Western")), inst_list);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2033 inst_list = Fcons (Fcons (list1 (Qmswindows),
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
2034 build_string ("Courier New:Regular:10::Western")), inst_list);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2035 #endif /* HAVE_MS_WINDOWS */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2036 set_specifier_fallback (Fget (Vdefault_face, Qfont, Qnil), inst_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2037 }
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 set_specifier_fallback (Fget (Vdefault_face, Qunderline, Qnil),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2040 list1 (Fcons (Qnil, Qnil)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2041 set_specifier_fallback (Fget (Vdefault_face, Qstrikethru, Qnil),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2042 list1 (Fcons (Qnil, Qnil)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2043 set_specifier_fallback (Fget (Vdefault_face, Qhighlight, Qnil),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2044 list1 (Fcons (Qnil, Qnil)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2045 set_specifier_fallback (Fget (Vdefault_face, Qdim, Qnil),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2046 list1 (Fcons (Qnil, Qnil)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2047 set_specifier_fallback (Fget (Vdefault_face, Qblinking, Qnil),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2048 list1 (Fcons (Qnil, Qnil)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2049 set_specifier_fallback (Fget (Vdefault_face, Qreverse, Qnil),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2050 list1 (Fcons (Qnil, Qnil)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2051
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2052 /* gui-element is the parent face of all gui elements such as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2053 modeline, vertical divider and toolbar. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2054 Vgui_element_face = Fmake_face (Qgui_element,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2055 build_string ("gui element face"),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2056 Qnil);
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 /* Provide some last-resort fallbacks for gui-element face which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2059 mustn't default to default. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2060 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2061 Lisp_Object fg_fb = Qnil, bg_fb = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2062
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
2063 #ifdef HAVE_GTK
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
2064 /* We need to put something in there, or error checking gets
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
2065 #%!@#ed up before the styles are set, which override the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
2066 fallbacks. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
2067 fg_fb = acons (list1 (Qgtk), build_string ("black"), fg_fb);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
2068 bg_fb = acons (list1 (Qgtk), build_string ("Gray80"), bg_fb);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
2069 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2070 #ifdef HAVE_X_WINDOWS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2071 fg_fb = acons (list1 (Qx), build_string ("black"), fg_fb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2072 bg_fb = acons (list1 (Qx), build_string ("Gray80"), bg_fb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2073 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2074 #ifdef HAVE_TTY
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2075 fg_fb = acons (list1 (Qtty), Fvector (0, 0), fg_fb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2076 bg_fb = acons (list1 (Qtty), Fvector (0, 0), bg_fb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2077 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2078 #ifdef HAVE_MS_WINDOWS
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
2079 fg_fb = acons (list1 (Qmsprinter), build_string ("black"), fg_fb);
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
2080 bg_fb = acons (list1 (Qmsprinter), build_string ("white"), bg_fb);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2081 fg_fb = acons (list1 (Qmswindows), build_string ("black"), fg_fb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2082 bg_fb = acons (list1 (Qmswindows), build_string ("Gray75"), bg_fb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2083 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2084 set_specifier_fallback (Fget (Vgui_element_face, Qforeground, Qnil), fg_fb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2085 set_specifier_fallback (Fget (Vgui_element_face, Qbackground, Qnil), bg_fb);
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2088 /* Now create the other faces that redisplay needs to refer to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2089 directly. We could create them in Lisp but it's simpler this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2090 way since we need to get them anyway. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2091
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2092 /* modeline is gui element. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2093 Vmodeline_face = Fmake_face (Qmodeline, build_string ("modeline face"),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2094 Qnil);
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 set_specifier_fallback (Fget (Vmodeline_face, Qforeground, Qunbound),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2097 Fget (Vgui_element_face, Qforeground, Qunbound));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2098 set_specifier_fallback (Fget (Vmodeline_face, Qbackground, Qunbound),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2099 Fget (Vgui_element_face, Qbackground, Qunbound));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2100 set_specifier_fallback (Fget (Vmodeline_face, Qbackground_pixmap, Qnil),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2101 Fget (Vgui_element_face, Qbackground_pixmap,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2102 Qunbound));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2103
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2104 /* toolbar is another gui element */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2105 Vtoolbar_face = Fmake_face (Qtoolbar,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2106 build_string ("toolbar face"),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2107 Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2108 set_specifier_fallback (Fget (Vtoolbar_face, Qforeground, Qunbound),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2109 Fget (Vgui_element_face, Qforeground, Qunbound));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2110 set_specifier_fallback (Fget (Vtoolbar_face, Qbackground, Qunbound),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2111 Fget (Vgui_element_face, Qbackground, Qunbound));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2112 set_specifier_fallback (Fget (Vtoolbar_face, Qbackground_pixmap, Qnil),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2113 Fget (Vgui_element_face, Qbackground_pixmap,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2114 Qunbound));
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 /* vertical divider is another gui element */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2117 Vvertical_divider_face = Fmake_face (Qvertical_divider,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2118 build_string ("vertical divider face"),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2119 Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2120
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2121 set_specifier_fallback (Fget (Vvertical_divider_face, Qforeground, Qunbound),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2122 Fget (Vgui_element_face, Qforeground, Qunbound));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2123 set_specifier_fallback (Fget (Vvertical_divider_face, Qbackground, Qunbound),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2124 Fget (Vgui_element_face, Qbackground, Qunbound));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2125 set_specifier_fallback (Fget (Vvertical_divider_face, Qbackground_pixmap,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2126 Qunbound),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2127 Fget (Vgui_element_face, Qbackground_pixmap,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2128 Qunbound));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2129
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2130 /* widget is another gui element */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2131 Vwidget_face = Fmake_face (Qwidget,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2132 build_string ("widget face"),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2133 Qnil);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2134 set_specifier_fallback (Fget (Vwidget_face, Qfont, Qunbound),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2135 Fget (Vgui_element_face, Qfont, Qunbound));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2136 set_specifier_fallback (Fget (Vwidget_face, Qforeground, Qunbound),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2137 Fget (Vgui_element_face, Qforeground, Qunbound));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2138 set_specifier_fallback (Fget (Vwidget_face, Qbackground, Qunbound),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2139 Fget (Vgui_element_face, Qbackground, Qunbound));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2140 /* We don't want widgets to have a default background pixmap. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2141
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2142 Vleft_margin_face = Fmake_face (Qleft_margin,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2143 build_string ("left margin face"),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2144 Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2145 Vright_margin_face = Fmake_face (Qright_margin,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2146 build_string ("right margin face"),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2147 Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2148 Vtext_cursor_face = Fmake_face (Qtext_cursor,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2149 build_string ("face for text cursor"),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2150 Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2151 Vpointer_face =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2152 Fmake_face (Qpointer,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2153 build_string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2154 ("face for foreground/background colors of mouse pointer"),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2155 Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2156 }