Commit 6a3808cc authored by Jimmy Aguilar Mena's avatar Jimmy Aguilar Mena

Added face parameter :extend.

This is an initial change to add a parameter :extend that will be used
in the display engine later.
parent 523aeb6c
...@@ -233,7 +233,11 @@ ...@@ -233,7 +233,11 @@
(file :tag "File" (file :tag "File"
:help-echo "Name of bitmap file." :help-echo "Name of bitmap file."
:must-match t))) :must-match t)))
(:extend
(choice :tag "Extend"
:help-echo "Control whether attributes should be extended after EOL."
(const :tag "Off" nil)
(const :tag "On" t)))
(:inherit (:inherit
(repeat :tag "Inherit" (repeat :tag "Inherit"
:help-echo "List of faces to inherit attributes from." :help-echo "List of faces to inherit attributes from."
......
...@@ -342,6 +342,7 @@ is either `foreground-color', `background-color', or a keyword." ...@@ -342,6 +342,7 @@ is either `foreground-color', `background-color', or a keyword."
(:box (".attributeBox" . "Face.AttributeBox")) (:box (".attributeBox" . "Face.AttributeBox"))
(:underline (".attributeUnderline" . "Face.AttributeUnderline")) (:underline (".attributeUnderline" . "Face.AttributeUnderline"))
(:inverse-video (".attributeInverse" . "Face.AttributeInverse")) (:inverse-video (".attributeInverse" . "Face.AttributeInverse"))
(:extend (".attributeExtend" . "Face.AttributeExtend"))
(:stipple (:stipple
(".attributeStipple" . "Face.AttributeStipple") (".attributeStipple" . "Face.AttributeStipple")
(".attributeBackgroundPixmap" . "Face.AttributeBackgroundPixmap")) (".attributeBackgroundPixmap" . "Face.AttributeBackgroundPixmap"))
...@@ -594,6 +595,13 @@ Use `face-attribute' for finer control." ...@@ -594,6 +595,13 @@ Use `face-attribute' for finer control."
(let ((italic (face-attribute face :slant frame inherit))) (let ((italic (face-attribute face :slant frame inherit)))
(memq italic '(italic oblique)))) (memq italic '(italic oblique))))
(defun face-extend-p (face &optional frame inherit)
"Return non-nil if FACE specifies a non-nil extend.
If the optional argument FRAME is given, report on face FACE in that frame.
If FRAME is t, report on the defaults for face FACE (for new frames).
If FRAME is omitted or nil, use the selected frame.
Optional argument INHERIT is passed to `face-attribute'."
(eq (face-attribute face :extend frame inherit) t))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
...@@ -760,6 +768,11 @@ For convenience, attributes `:family', `:foundry', `:width', ...@@ -760,6 +768,11 @@ For convenience, attributes `:family', `:foundry', `:width',
`:height', `:weight', and `:slant' may also be set in one step `:height', `:weight', and `:slant' may also be set in one step
from an X font name: from an X font name:
`:extend'
VALUE specifies whether the FACE should be extended after EOL.
VALUE must be one of t or nil.
`:font' `:font'
Set font-related face attributes from VALUE. Set font-related face attributes from VALUE.
...@@ -979,6 +992,18 @@ Use `set-face-attribute' or `modify-face' for finer control." ...@@ -979,6 +992,18 @@ Use `set-face-attribute' or `modify-face' for finer control."
(define-obsolete-function-alias 'set-face-italic-p 'set-face-italic "24.4") (define-obsolete-function-alias 'set-face-italic-p 'set-face-italic "24.4")
(defun set-face-extend (face extend-p &optional frame)
"Specify whether face FACE should be extended.
EXTEND-P nil means FACE explicitly doesn't extend after EOL.
EXTEND-P t means FACE extends after EOL.
FRAME nil or not specified means change face on all frames.
Use `set-face-attribute' to \"unspecify\" underlining."
(interactive
(let ((list (read-face-and-attribute :extend)))
(list (car list) (if (cadr list) t))))
(set-face-attribute face frame :extend extend-p))
(defalias 'set-face-background-pixmap 'set-face-stipple) (defalias 'set-face-background-pixmap 'set-face-stipple)
...@@ -1102,7 +1127,7 @@ an integer value." ...@@ -1102,7 +1127,7 @@ an integer value."
(:slant (:slant
(mapcar #'(lambda (x) (cons (symbol-name (aref x 1)) (aref x 1))) (mapcar #'(lambda (x) (cons (symbol-name (aref x 1)) (aref x 1)))
font-slant-table)) font-slant-table))
(:inverse-video ((or :inverse-video :extend)
(mapcar #'(lambda (x) (cons (symbol-name x) x)) (mapcar #'(lambda (x) (cons (symbol-name x) x))
(internal-lisp-face-attribute-values attribute))) (internal-lisp-face-attribute-values attribute)))
((or :underline :overline :strike-through :box) ((or :underline :overline :strike-through :box)
...@@ -1147,6 +1172,7 @@ an integer value." ...@@ -1147,6 +1172,7 @@ an integer value."
(:slant . "slant") (:slant . "slant")
(:underline . "underline") (:underline . "underline")
(:overline . "overline") (:overline . "overline")
(:extend . "extend")
(:strike-through . "strike-through") (:strike-through . "strike-through")
(:box . "box") (:box . "box")
(:inverse-video . "inverse-video display") (:inverse-video . "inverse-video display")
...@@ -1549,7 +1575,8 @@ is given, in which case return its value instead." ...@@ -1549,7 +1575,8 @@ is given, in which case return its value instead."
;; (see also realize_default_face in xfaces.c). ;; (see also realize_default_face in xfaces.c).
(append (append
'(:underline nil :overline nil :strike-through nil '(:underline nil :overline nil :strike-through nil
:box nil :inverse-video nil :stipple nil :inherit nil) :box nil :inverse-video nil :stipple nil :inherit nil
:extend nil)
;; `display-graphic-p' is unavailable when running ;; `display-graphic-p' is unavailable when running
;; temacs, prior to loading frame.el. ;; temacs, prior to loading frame.el.
(when (fboundp 'display-graphic-p) (when (fboundp 'display-graphic-p)
...@@ -2314,24 +2341,24 @@ If you set `term-file-prefix' to nil, this function does nothing." ...@@ -2314,24 +2341,24 @@ If you set `term-file-prefix' to nil, this function does nothing."
;; if background is light. ;; if background is light.
(defface region (defface region
'((((class color) (min-colors 88) (background dark)) '((((class color) (min-colors 88) (background dark))
:background "blue3") :background "blue3" :extend t)
(((class color) (min-colors 88) (background light) (type gtk)) (((class color) (min-colors 88) (background light) (type gtk))
:distant-foreground "gtk_selection_fg_color" :distant-foreground "gtk_selection_fg_color"
:background "gtk_selection_bg_color") :background "gtk_selection_bg_color" :extend t)
(((class color) (min-colors 88) (background light) (type ns)) (((class color) (min-colors 88) (background light) (type ns))
:distant-foreground "ns_selection_fg_color" :distant-foreground "ns_selection_fg_color"
:background "ns_selection_bg_color") :background "ns_selection_bg_color" :extend t)
(((class color) (min-colors 88) (background light)) (((class color) (min-colors 88) (background light))
:background "lightgoldenrod2") :background "lightgoldenrod2" :extend t)
(((class color) (min-colors 16) (background dark)) (((class color) (min-colors 16) (background dark))
:background "blue3") :background "blue3" :extend t)
(((class color) (min-colors 16) (background light)) (((class color) (min-colors 16) (background light))
:background "lightgoldenrod2") :background "lightgoldenrod2" :extend t)
(((class color) (min-colors 8)) (((class color) (min-colors 8))
:background "blue" :foreground "white") :background "blue" :foreground "white" :extend t)
(((type tty) (class mono)) (((type tty) (class mono))
:inverse-video t) :inverse-video t)
(t :background "gray")) (t :background "gray" :extend t))
"Basic face for highlighting the region." "Basic face for highlighting the region."
:version "21.1" :version "21.1"
:group 'basic-faces) :group 'basic-faces)
......
...@@ -1352,6 +1352,7 @@ If FRAME is omitted or nil, use the selected frame." ...@@ -1352,6 +1352,7 @@ If FRAME is omitted or nil, use the selected frame."
(:stipple . "Stipple") (:stipple . "Stipple")
(:font . "Font") (:font . "Font")
(:fontset . "Fontset") (:fontset . "Fontset")
(:extend . "Extend")
(:inherit . "Inherit"))) (:inherit . "Inherit")))
(max-width (apply #'max (mapcar #'(lambda (x) (length (cdr x))) (max-width (apply #'max (mapcar #'(lambda (x) (length (cdr x)))
attrs)))) attrs))))
......
...@@ -1634,11 +1634,9 @@ struct face ...@@ -1634,11 +1634,9 @@ struct face
/* Pixel value or color index of background color. */ /* Pixel value or color index of background color. */
unsigned long background; unsigned long background;
/* Pixel value or color index of underline color. */ /* Pixel value or color index of underline, overlined,
strike-through, or box color. */
unsigned long underline_color; unsigned long underline_color;
/* Pixel value or color index of overlined, strike-through, or box
color. */
unsigned long overline_color; unsigned long overline_color;
unsigned long strike_through_color; unsigned long strike_through_color;
unsigned long box_color; unsigned long box_color;
...@@ -1819,6 +1817,9 @@ struct face_cache ...@@ -1819,6 +1817,9 @@ struct face_cache
? FRAME_FACE_CACHE (F)->faces_by_id[ID] \ ? FRAME_FACE_CACHE (F)->faces_by_id[ID] \
: NULL) : NULL)
#define FACE_EXTENSIBLE_P(F) \
(!NILP (F->lface[LFACE_EXTEND_INDEX]))
/* True if FACE is suitable for displaying ASCII characters. */ /* True if FACE is suitable for displaying ASCII characters. */
INLINE bool INLINE bool
FACE_SUITABLE_FOR_ASCII_CHAR_P (struct face *face) FACE_SUITABLE_FOR_ASCII_CHAR_P (struct face *face)
...@@ -2325,7 +2326,7 @@ struct it ...@@ -2325,7 +2326,7 @@ struct it
/* Face id of the iterator saved in case a glyph from dpvec contains /* Face id of the iterator saved in case a glyph from dpvec contains
a face. The face is restored when all glyphs from dpvec have a face. The face is restored when all glyphs from dpvec have
been delivered. */ been delivered. */
int saved_face_id; int saved_face_id, saved_extend_face_id;
/* Vector of glyphs for control character translation. The pointer /* Vector of glyphs for control character translation. The pointer
dpvec is set to ctl_chars when a control character is translated. dpvec is set to ctl_chars when a control character is translated.
...@@ -2387,7 +2388,7 @@ struct it ...@@ -2387,7 +2388,7 @@ struct it
ptrdiff_t prev_stop; ptrdiff_t prev_stop;
ptrdiff_t base_level_stop; ptrdiff_t base_level_stop;
struct composition_it cmp_it; struct composition_it cmp_it;
int face_id; int face_id, extend_face_id;
/* Save values specific to a given method. */ /* Save values specific to a given method. */
union { union {
...@@ -2445,6 +2446,9 @@ struct it ...@@ -2445,6 +2446,9 @@ struct it
/* Face to use. */ /* Face to use. */
int face_id; int face_id;
/* Face to extend at EOL/ */
int extend_face_id;
/* Setting of buffer-local variable selective-display-ellipses. */ /* Setting of buffer-local variable selective-display-ellipses. */
bool_bf selective_display_ellipsis_p : 1; bool_bf selective_display_ellipsis_p : 1;
......
...@@ -1590,6 +1590,7 @@ the WIDTH times as wide as FACE on FRAME. */) ...@@ -1590,6 +1590,7 @@ the WIDTH times as wide as FACE on FRAME. */)
#define LFACE_FONT(LFACE) AREF ((LFACE), LFACE_FONT_INDEX) #define LFACE_FONT(LFACE) AREF ((LFACE), LFACE_FONT_INDEX)
#define LFACE_INHERIT(LFACE) AREF ((LFACE), LFACE_INHERIT_INDEX) #define LFACE_INHERIT(LFACE) AREF ((LFACE), LFACE_INHERIT_INDEX)
#define LFACE_FONTSET(LFACE) AREF ((LFACE), LFACE_FONTSET_INDEX) #define LFACE_FONTSET(LFACE) AREF ((LFACE), LFACE_FONTSET_INDEX)
#define LFACE_EXTEND(LFACE) AREF ((LFACE), LFACE_EXTEND_INDEX)
#define LFACE_DISTANT_FOREGROUND(LFACE) \ #define LFACE_DISTANT_FOREGROUND(LFACE) \
AREF ((LFACE), LFACE_DISTANT_FOREGROUND_INDEX) AREF ((LFACE), LFACE_DISTANT_FOREGROUND_INDEX)
...@@ -1633,6 +1634,10 @@ check_lface_attrs (Lisp_Object attrs[LFACE_VECTOR_SIZE]) ...@@ -1633,6 +1634,10 @@ check_lface_attrs (Lisp_Object attrs[LFACE_VECTOR_SIZE])
|| SYMBOLP (attrs[LFACE_UNDERLINE_INDEX]) || SYMBOLP (attrs[LFACE_UNDERLINE_INDEX])
|| STRINGP (attrs[LFACE_UNDERLINE_INDEX]) || STRINGP (attrs[LFACE_UNDERLINE_INDEX])
|| CONSP (attrs[LFACE_UNDERLINE_INDEX])); || CONSP (attrs[LFACE_UNDERLINE_INDEX]));
eassert (UNSPECIFIEDP (attrs[LFACE_EXTEND_INDEX])
|| IGNORE_DEFFACE_P (attrs[LFACE_EXTEND_INDEX])
|| SYMBOLP (attrs[LFACE_EXTEND_INDEX])
|| STRINGP (attrs[LFACE_EXTEND_INDEX]));
eassert (UNSPECIFIEDP (attrs[LFACE_OVERLINE_INDEX]) eassert (UNSPECIFIEDP (attrs[LFACE_OVERLINE_INDEX])
|| IGNORE_DEFFACE_P (attrs[LFACE_OVERLINE_INDEX]) || IGNORE_DEFFACE_P (attrs[LFACE_OVERLINE_INDEX])
|| SYMBOLP (attrs[LFACE_OVERLINE_INDEX]) || SYMBOLP (attrs[LFACE_OVERLINE_INDEX])
...@@ -2512,6 +2517,13 @@ merge_face_ref (struct window *w, ...@@ -2512,6 +2517,13 @@ merge_face_ref (struct window *w,
err_msgs, named_merge_points)) err_msgs, named_merge_points))
err = true; err = true;
} }
else if (EQ (keyword, QCextend))
{
if (EQ (value, Qt) || NILP (value))
to[LFACE_EXTEND_INDEX] = value;
else
err = true;
}
else else
err = true; err = true;
...@@ -3030,6 +3042,17 @@ FRAME 0 means change the face on all frames, and change the default ...@@ -3030,6 +3042,17 @@ FRAME 0 means change the face on all frames, and change the default
old_value = LFACE_INVERSE (lface); old_value = LFACE_INVERSE (lface);
ASET (lface, LFACE_INVERSE_INDEX, value); ASET (lface, LFACE_INVERSE_INDEX, value);
} }
else if (EQ (attr, QCextend))
{
if (!UNSPECIFIEDP (value) && !IGNORE_DEFFACE_P (value))
{
CHECK_SYMBOL (value);
if (!EQ (value, Qt) && !NILP (value))
signal_error ("Invalid extend face attribute value", value);
}
old_value = LFACE_EXTEND (lface);
ASET (lface, LFACE_EXTEND_INDEX, value);
}
else if (EQ (attr, QCforeground)) else if (EQ (attr, QCforeground))
{ {
/* Compatibility with 20.x. */ /* Compatibility with 20.x. */
...@@ -3503,7 +3526,9 @@ DEFUN ("internal-set-lisp-face-attribute-from-resource", ...@@ -3503,7 +3526,9 @@ DEFUN ("internal-set-lisp-face-attribute-from-resource",
value = face_boolean_x_resource_value (value, true); value = face_boolean_x_resource_value (value, true);
else if (EQ (attr, QCweight) || EQ (attr, QCslant) || EQ (attr, QCwidth)) else if (EQ (attr, QCweight) || EQ (attr, QCslant) || EQ (attr, QCwidth))
value = intern (SSDATA (value)); value = intern (SSDATA (value));
else if (EQ (attr, QCreverse_video) || EQ (attr, QCinverse_video)) else if (EQ (attr, QCreverse_video)
|| EQ (attr, QCinverse_video)
|| EQ (attr, QCextend))
value = face_boolean_x_resource_value (value, true); value = face_boolean_x_resource_value (value, true);
else if (EQ (attr, QCunderline) else if (EQ (attr, QCunderline)
|| EQ (attr, QCoverline) || EQ (attr, QCoverline)
...@@ -3727,6 +3752,8 @@ frames). If FRAME is omitted or nil, use the selected frame. */) ...@@ -3727,6 +3752,8 @@ frames). If FRAME is omitted or nil, use the selected frame. */)
value = LFACE_SWIDTH (lface); value = LFACE_SWIDTH (lface);
else if (EQ (keyword, QCinherit)) else if (EQ (keyword, QCinherit))
value = LFACE_INHERIT (lface); value = LFACE_INHERIT (lface);
else if (EQ (keyword, QCextend))
value = LFACE_EXTEND (lface);
else if (EQ (keyword, QCfont)) else if (EQ (keyword, QCfont))
value = LFACE_FONT (lface); value = LFACE_FONT (lface);
else if (EQ (keyword, QCfontset)) else if (EQ (keyword, QCfontset))
...@@ -3754,7 +3781,9 @@ Value is nil if ATTR doesn't have a discrete set of valid values. */) ...@@ -3754,7 +3781,9 @@ Value is nil if ATTR doesn't have a discrete set of valid values. */)
if (EQ (attr, QCunderline) || EQ (attr, QCoverline) if (EQ (attr, QCunderline) || EQ (attr, QCoverline)
|| EQ (attr, QCstrike_through) || EQ (attr, QCstrike_through)
|| EQ (attr, QCinverse_video) || EQ (attr, QCreverse_video)) || EQ (attr, QCinverse_video)
|| EQ (attr, QCreverse_video)
|| EQ (attr, QCextend))
result = list2 (Qt, Qnil); result = list2 (Qt, Qnil);
return result; return result;
...@@ -4782,6 +4811,9 @@ gui_supports_face_attributes_p (struct frame *f, ...@@ -4782,6 +4811,9 @@ gui_supports_face_attributes_p (struct frame *f,
|| (!UNSPECIFIEDP (attrs[LFACE_INVERSE_INDEX]) || (!UNSPECIFIEDP (attrs[LFACE_INVERSE_INDEX])
&& face_attr_equal_p (attrs[LFACE_INVERSE_INDEX], && face_attr_equal_p (attrs[LFACE_INVERSE_INDEX],
def_attrs[LFACE_INVERSE_INDEX])) def_attrs[LFACE_INVERSE_INDEX]))
|| (!UNSPECIFIEDP (attrs[LFACE_EXTEND_INDEX])
&& face_attr_equal_p (attrs[LFACE_EXTEND_INDEX],
def_attrs[LFACE_EXTEND_INDEX]))
|| (!UNSPECIFIEDP (attrs[LFACE_FOREGROUND_INDEX]) || (!UNSPECIFIEDP (attrs[LFACE_FOREGROUND_INDEX])
&& face_attr_equal_p (attrs[LFACE_FOREGROUND_INDEX], && face_attr_equal_p (attrs[LFACE_FOREGROUND_INDEX],
def_attrs[LFACE_FOREGROUND_INDEX])) def_attrs[LFACE_FOREGROUND_INDEX]))
...@@ -5358,6 +5390,9 @@ realize_default_face (struct frame *f) ...@@ -5358,6 +5390,9 @@ realize_default_face (struct frame *f)
ASET (lface, LFACE_FONTSET_INDEX, Qnil); ASET (lface, LFACE_FONTSET_INDEX, Qnil);
} }
if (UNSPECIFIEDP (LFACE_EXTEND (lface)))
ASET (lface, LFACE_EXTEND_INDEX, Qnil);
if (UNSPECIFIEDP (LFACE_UNDERLINE (lface))) if (UNSPECIFIEDP (LFACE_UNDERLINE (lface)))
ASET (lface, LFACE_UNDERLINE_INDEX, Qnil); ASET (lface, LFACE_UNDERLINE_INDEX, Qnil);
...@@ -6535,6 +6570,7 @@ syms_of_xfaces (void) ...@@ -6535,6 +6570,7 @@ syms_of_xfaces (void)
DEFSYM (QCstrike_through, ":strike-through"); DEFSYM (QCstrike_through, ":strike-through");
DEFSYM (QCbox, ":box"); DEFSYM (QCbox, ":box");
DEFSYM (QCinherit, ":inherit"); DEFSYM (QCinherit, ":inherit");
DEFSYM (QCextend, ":extend");
/* Symbols used for Lisp face attribute values. */ /* Symbols used for Lisp face attribute values. */
DEFSYM (QCcolor, ":color"); DEFSYM (QCcolor, ":color");
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment