diff options
| author | Jimmy Aguilar Mena | 2019-09-04 17:27:28 +0200 |
|---|---|---|
| committer | Jimmy Aguilar Mena | 2019-10-14 14:18:39 +0200 |
| commit | bc8db39775eb3af36a45d51130cd4dbd3b3e7210 (patch) | |
| tree | 9d7d643568943137bc436a7ecd021b2e07245e0e /src | |
| parent | f9206f34d63104c50659a15d3615646a09df87bf (diff) | |
| download | emacs-bc8db39775eb3af36a45d51130cd4dbd3b3e7210.tar.gz emacs-bc8db39775eb3af36a45d51130cd4dbd3b3e7210.zip | |
Added face parameter :extend.
This is an initial change to add a parameter :extend that will be used
in the display engine later.
Diffstat (limited to 'src')
| -rw-r--r-- | src/dispextern.h | 16 | ||||
| -rw-r--r-- | src/xfaces.c | 40 |
2 files changed, 48 insertions, 8 deletions
diff --git a/src/dispextern.h b/src/dispextern.h index 57400ae047a..519cc36345c 100644 --- a/src/dispextern.h +++ b/src/dispextern.h | |||
| @@ -1677,11 +1677,9 @@ struct face | |||
| 1677 | /* Pixel value or color index of background color. */ | 1677 | /* Pixel value or color index of background color. */ |
| 1678 | unsigned long background; | 1678 | unsigned long background; |
| 1679 | 1679 | ||
| 1680 | /* Pixel value or color index of underline color. */ | 1680 | /* Pixel value or color index of underline, overlined, |
| 1681 | strike-through, or box color. */ | ||
| 1681 | unsigned long underline_color; | 1682 | unsigned long underline_color; |
| 1682 | |||
| 1683 | /* Pixel value or color index of overlined, strike-through, or box | ||
| 1684 | color. */ | ||
| 1685 | unsigned long overline_color; | 1683 | unsigned long overline_color; |
| 1686 | unsigned long strike_through_color; | 1684 | unsigned long strike_through_color; |
| 1687 | unsigned long box_color; | 1685 | unsigned long box_color; |
| @@ -1864,6 +1862,9 @@ struct face_cache | |||
| 1864 | ? FRAME_FACE_CACHE (F)->faces_by_id[ID] \ | 1862 | ? FRAME_FACE_CACHE (F)->faces_by_id[ID] \ |
| 1865 | : NULL) | 1863 | : NULL) |
| 1866 | 1864 | ||
| 1865 | #define FACE_EXTENSIBLE_P(F) \ | ||
| 1866 | (!NILP (F->lface[LFACE_EXTEND_INDEX])) | ||
| 1867 | |||
| 1867 | /* True if FACE is suitable for displaying ASCII characters. */ | 1868 | /* True if FACE is suitable for displaying ASCII characters. */ |
| 1868 | INLINE bool | 1869 | INLINE bool |
| 1869 | FACE_SUITABLE_FOR_ASCII_CHAR_P (struct face *face) | 1870 | FACE_SUITABLE_FOR_ASCII_CHAR_P (struct face *face) |
| @@ -2373,7 +2374,7 @@ struct it | |||
| 2373 | /* Face id of the iterator saved in case a glyph from dpvec contains | 2374 | /* Face id of the iterator saved in case a glyph from dpvec contains |
| 2374 | a face. The face is restored when all glyphs from dpvec have | 2375 | a face. The face is restored when all glyphs from dpvec have |
| 2375 | been delivered. */ | 2376 | been delivered. */ |
| 2376 | int saved_face_id; | 2377 | int saved_face_id, saved_extend_face_id; |
| 2377 | 2378 | ||
| 2378 | /* Vector of glyphs for control character translation. The pointer | 2379 | /* Vector of glyphs for control character translation. The pointer |
| 2379 | dpvec is set to ctl_chars when a control character is translated. | 2380 | dpvec is set to ctl_chars when a control character is translated. |
| @@ -2435,7 +2436,7 @@ struct it | |||
| 2435 | ptrdiff_t prev_stop; | 2436 | ptrdiff_t prev_stop; |
| 2436 | ptrdiff_t base_level_stop; | 2437 | ptrdiff_t base_level_stop; |
| 2437 | struct composition_it cmp_it; | 2438 | struct composition_it cmp_it; |
| 2438 | int face_id; | 2439 | int face_id, extend_face_id; |
| 2439 | 2440 | ||
| 2440 | /* Save values specific to a given method. */ | 2441 | /* Save values specific to a given method. */ |
| 2441 | union { | 2442 | union { |
| @@ -2493,6 +2494,9 @@ struct it | |||
| 2493 | /* Face to use. */ | 2494 | /* Face to use. */ |
| 2494 | int face_id; | 2495 | int face_id; |
| 2495 | 2496 | ||
| 2497 | /* Face to extend at EOL/ */ | ||
| 2498 | int extend_face_id; | ||
| 2499 | |||
| 2496 | /* Setting of buffer-local variable selective-display-ellipses. */ | 2500 | /* Setting of buffer-local variable selective-display-ellipses. */ |
| 2497 | bool_bf selective_display_ellipsis_p : 1; | 2501 | bool_bf selective_display_ellipsis_p : 1; |
| 2498 | 2502 | ||
diff --git a/src/xfaces.c b/src/xfaces.c index c7d6990f505..889bf83561c 100644 --- a/src/xfaces.c +++ b/src/xfaces.c | |||
| @@ -1590,6 +1590,7 @@ the WIDTH times as wide as FACE on FRAME. */) | |||
| 1590 | #define LFACE_FONT(LFACE) AREF ((LFACE), LFACE_FONT_INDEX) | 1590 | #define LFACE_FONT(LFACE) AREF ((LFACE), LFACE_FONT_INDEX) |
| 1591 | #define LFACE_INHERIT(LFACE) AREF ((LFACE), LFACE_INHERIT_INDEX) | 1591 | #define LFACE_INHERIT(LFACE) AREF ((LFACE), LFACE_INHERIT_INDEX) |
| 1592 | #define LFACE_FONTSET(LFACE) AREF ((LFACE), LFACE_FONTSET_INDEX) | 1592 | #define LFACE_FONTSET(LFACE) AREF ((LFACE), LFACE_FONTSET_INDEX) |
| 1593 | #define LFACE_EXTEND(LFACE) AREF ((LFACE), LFACE_EXTEND_INDEX) | ||
| 1593 | #define LFACE_DISTANT_FOREGROUND(LFACE) \ | 1594 | #define LFACE_DISTANT_FOREGROUND(LFACE) \ |
| 1594 | AREF ((LFACE), LFACE_DISTANT_FOREGROUND_INDEX) | 1595 | AREF ((LFACE), LFACE_DISTANT_FOREGROUND_INDEX) |
| 1595 | 1596 | ||
| @@ -1633,6 +1634,10 @@ check_lface_attrs (Lisp_Object attrs[LFACE_VECTOR_SIZE]) | |||
| 1633 | || SYMBOLP (attrs[LFACE_UNDERLINE_INDEX]) | 1634 | || SYMBOLP (attrs[LFACE_UNDERLINE_INDEX]) |
| 1634 | || STRINGP (attrs[LFACE_UNDERLINE_INDEX]) | 1635 | || STRINGP (attrs[LFACE_UNDERLINE_INDEX]) |
| 1635 | || CONSP (attrs[LFACE_UNDERLINE_INDEX])); | 1636 | || CONSP (attrs[LFACE_UNDERLINE_INDEX])); |
| 1637 | eassert (UNSPECIFIEDP (attrs[LFACE_EXTEND_INDEX]) | ||
| 1638 | || IGNORE_DEFFACE_P (attrs[LFACE_EXTEND_INDEX]) | ||
| 1639 | || SYMBOLP (attrs[LFACE_EXTEND_INDEX]) | ||
| 1640 | || STRINGP (attrs[LFACE_EXTEND_INDEX])); | ||
| 1636 | eassert (UNSPECIFIEDP (attrs[LFACE_OVERLINE_INDEX]) | 1641 | eassert (UNSPECIFIEDP (attrs[LFACE_OVERLINE_INDEX]) |
| 1637 | || IGNORE_DEFFACE_P (attrs[LFACE_OVERLINE_INDEX]) | 1642 | || IGNORE_DEFFACE_P (attrs[LFACE_OVERLINE_INDEX]) |
| 1638 | || SYMBOLP (attrs[LFACE_OVERLINE_INDEX]) | 1643 | || SYMBOLP (attrs[LFACE_OVERLINE_INDEX]) |
| @@ -2512,6 +2517,13 @@ merge_face_ref (struct window *w, | |||
| 2512 | err_msgs, named_merge_points)) | 2517 | err_msgs, named_merge_points)) |
| 2513 | err = true; | 2518 | err = true; |
| 2514 | } | 2519 | } |
| 2520 | else if (EQ (keyword, QCextend)) | ||
| 2521 | { | ||
| 2522 | if (EQ (value, Qt) || NILP (value)) | ||
| 2523 | to[LFACE_EXTEND_INDEX] = value; | ||
| 2524 | else | ||
| 2525 | err = true; | ||
| 2526 | } | ||
| 2515 | else | 2527 | else |
| 2516 | err = true; | 2528 | err = true; |
| 2517 | 2529 | ||
| @@ -3030,6 +3042,17 @@ FRAME 0 means change the face on all frames, and change the default | |||
| 3030 | old_value = LFACE_INVERSE (lface); | 3042 | old_value = LFACE_INVERSE (lface); |
| 3031 | ASET (lface, LFACE_INVERSE_INDEX, value); | 3043 | ASET (lface, LFACE_INVERSE_INDEX, value); |
| 3032 | } | 3044 | } |
| 3045 | else if (EQ (attr, QCextend)) | ||
| 3046 | { | ||
| 3047 | if (!UNSPECIFIEDP (value) && !IGNORE_DEFFACE_P (value)) | ||
| 3048 | { | ||
| 3049 | CHECK_SYMBOL (value); | ||
| 3050 | if (!EQ (value, Qt) && !NILP (value)) | ||
| 3051 | signal_error ("Invalid extend face attribute value", value); | ||
| 3052 | } | ||
| 3053 | old_value = LFACE_EXTEND (lface); | ||
| 3054 | ASET (lface, LFACE_EXTEND_INDEX, value); | ||
| 3055 | } | ||
| 3033 | else if (EQ (attr, QCforeground)) | 3056 | else if (EQ (attr, QCforeground)) |
| 3034 | { | 3057 | { |
| 3035 | /* Compatibility with 20.x. */ | 3058 | /* Compatibility with 20.x. */ |
| @@ -3503,7 +3526,9 @@ DEFUN ("internal-set-lisp-face-attribute-from-resource", | |||
| 3503 | value = face_boolean_x_resource_value (value, true); | 3526 | value = face_boolean_x_resource_value (value, true); |
| 3504 | else if (EQ (attr, QCweight) || EQ (attr, QCslant) || EQ (attr, QCwidth)) | 3527 | else if (EQ (attr, QCweight) || EQ (attr, QCslant) || EQ (attr, QCwidth)) |
| 3505 | value = intern (SSDATA (value)); | 3528 | value = intern (SSDATA (value)); |
| 3506 | else if (EQ (attr, QCreverse_video) || EQ (attr, QCinverse_video)) | 3529 | else if (EQ (attr, QCreverse_video) |
| 3530 | || EQ (attr, QCinverse_video) | ||
| 3531 | || EQ (attr, QCextend)) | ||
| 3507 | value = face_boolean_x_resource_value (value, true); | 3532 | value = face_boolean_x_resource_value (value, true); |
| 3508 | else if (EQ (attr, QCunderline) | 3533 | else if (EQ (attr, QCunderline) |
| 3509 | || EQ (attr, QCoverline) | 3534 | || EQ (attr, QCoverline) |
| @@ -3727,6 +3752,8 @@ frames). If FRAME is omitted or nil, use the selected frame. */) | |||
| 3727 | value = LFACE_SWIDTH (lface); | 3752 | value = LFACE_SWIDTH (lface); |
| 3728 | else if (EQ (keyword, QCinherit)) | 3753 | else if (EQ (keyword, QCinherit)) |
| 3729 | value = LFACE_INHERIT (lface); | 3754 | value = LFACE_INHERIT (lface); |
| 3755 | else if (EQ (keyword, QCextend)) | ||
| 3756 | value = LFACE_EXTEND (lface); | ||
| 3730 | else if (EQ (keyword, QCfont)) | 3757 | else if (EQ (keyword, QCfont)) |
| 3731 | value = LFACE_FONT (lface); | 3758 | value = LFACE_FONT (lface); |
| 3732 | else if (EQ (keyword, QCfontset)) | 3759 | else if (EQ (keyword, QCfontset)) |
| @@ -3754,7 +3781,9 @@ Value is nil if ATTR doesn't have a discrete set of valid values. */) | |||
| 3754 | 3781 | ||
| 3755 | if (EQ (attr, QCunderline) || EQ (attr, QCoverline) | 3782 | if (EQ (attr, QCunderline) || EQ (attr, QCoverline) |
| 3756 | || EQ (attr, QCstrike_through) | 3783 | || EQ (attr, QCstrike_through) |
| 3757 | || EQ (attr, QCinverse_video) || EQ (attr, QCreverse_video)) | 3784 | || EQ (attr, QCinverse_video) |
| 3785 | || EQ (attr, QCreverse_video) | ||
| 3786 | || EQ (attr, QCextend)) | ||
| 3758 | result = list2 (Qt, Qnil); | 3787 | result = list2 (Qt, Qnil); |
| 3759 | 3788 | ||
| 3760 | return result; | 3789 | return result; |
| @@ -4784,6 +4813,9 @@ gui_supports_face_attributes_p (struct frame *f, | |||
| 4784 | || (!UNSPECIFIEDP (attrs[LFACE_INVERSE_INDEX]) | 4813 | || (!UNSPECIFIEDP (attrs[LFACE_INVERSE_INDEX]) |
| 4785 | && face_attr_equal_p (attrs[LFACE_INVERSE_INDEX], | 4814 | && face_attr_equal_p (attrs[LFACE_INVERSE_INDEX], |
| 4786 | def_attrs[LFACE_INVERSE_INDEX])) | 4815 | def_attrs[LFACE_INVERSE_INDEX])) |
| 4816 | || (!UNSPECIFIEDP (attrs[LFACE_EXTEND_INDEX]) | ||
| 4817 | && face_attr_equal_p (attrs[LFACE_EXTEND_INDEX], | ||
| 4818 | def_attrs[LFACE_EXTEND_INDEX])) | ||
| 4787 | || (!UNSPECIFIEDP (attrs[LFACE_FOREGROUND_INDEX]) | 4819 | || (!UNSPECIFIEDP (attrs[LFACE_FOREGROUND_INDEX]) |
| 4788 | && face_attr_equal_p (attrs[LFACE_FOREGROUND_INDEX], | 4820 | && face_attr_equal_p (attrs[LFACE_FOREGROUND_INDEX], |
| 4789 | def_attrs[LFACE_FOREGROUND_INDEX])) | 4821 | def_attrs[LFACE_FOREGROUND_INDEX])) |
| @@ -5362,6 +5394,9 @@ realize_default_face (struct frame *f) | |||
| 5362 | ASET (lface, LFACE_FONTSET_INDEX, Qnil); | 5394 | ASET (lface, LFACE_FONTSET_INDEX, Qnil); |
| 5363 | } | 5395 | } |
| 5364 | 5396 | ||
| 5397 | if (UNSPECIFIEDP (LFACE_EXTEND (lface))) | ||
| 5398 | ASET (lface, LFACE_EXTEND_INDEX, Qnil); | ||
| 5399 | |||
| 5365 | if (UNSPECIFIEDP (LFACE_UNDERLINE (lface))) | 5400 | if (UNSPECIFIEDP (LFACE_UNDERLINE (lface))) |
| 5366 | ASET (lface, LFACE_UNDERLINE_INDEX, Qnil); | 5401 | ASET (lface, LFACE_UNDERLINE_INDEX, Qnil); |
| 5367 | 5402 | ||
| @@ -6539,6 +6574,7 @@ syms_of_xfaces (void) | |||
| 6539 | DEFSYM (QCstrike_through, ":strike-through"); | 6574 | DEFSYM (QCstrike_through, ":strike-through"); |
| 6540 | DEFSYM (QCbox, ":box"); | 6575 | DEFSYM (QCbox, ":box"); |
| 6541 | DEFSYM (QCinherit, ":inherit"); | 6576 | DEFSYM (QCinherit, ":inherit"); |
| 6577 | DEFSYM (QCextend, ":extend"); | ||
| 6542 | 6578 | ||
| 6543 | /* Symbols used for Lisp face attribute values. */ | 6579 | /* Symbols used for Lisp face attribute values. */ |
| 6544 | DEFSYM (QCcolor, ":color"); | 6580 | DEFSYM (QCcolor, ":color"); |