[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [patch] add "underwave" face attribute
From: |
Aurélien Aptel |
Subject: |
Re: [patch] add "underwave" face attribute |
Date: |
Wed, 1 Feb 2012 00:38:40 +0100 |
Ok so I've taken into account what has been said on the list. Here's
another attempt.
For a quick glance at the result, apply my patch, compile and run.
$ ./emacs -Q --eval "(set-face-attribute 'default nil :underline
'(:color \"red\" :style wave))
It works on X11, see below for the rest.
Summary of the changes
======================
The :underline attribute has now a new way to be set:
(:color color :style style)
If `color' is a string, underline in it.
If `color' is `foreground-color', underline with the
foreground color of the face.
If `style' is `wave' underline with a wave.
If `style' is `line' underline with a line.
If the attribute :color is omited, underline with the
foreground color of the face.
If the attribute :style is omited, underline with a line.
All the previous ways to set :underline behave the same.
Customize menu
--------------
The customize menu now looks like this:
Underline: [Off/On]
Color: [Foreground color/...]
Style: [Line/Wave]
Implementation
--------------
-- src/dispextern.h --
Add a new enum for the underlining type.
enum face_underline_type {
FACE_UNDER_LINE,
FACE_UNDER_WAVE,
};
And a new field in struct face.
struct face {
...
enum face_underline_type underline_type;
...
};
-- src/xterm.c --
Update X11 backend.
Add x_draw_underwave()
The code seems to use unsigned long for pixel offsets so that's what I used.
The wave is drown correctly now. No more wave breaks in C-h h.
static void
x_draw_underwave (Display *dpy, Window win, GC gc,
unsigned long x0, unsigned long y0,
unsigned long width,
unsigned long wave_height, unsigned long wave_length)
Add a new codepath in x_draw_glyph_string() to handle the new style.
/* Draw underline. */
if (s->face->underline_p)
{
if (s->face->underline_type == FACE_UNDER_WAVE)
{
...new code...
}
else if (s->face->underline_type == FACE_UNDER_LINE)
{
...re-indented old code...
}
-- src/w32term.m --
-- src/nsterm.c --
================================================================
I do not have access to a Window/Mac OSX system.
Someone needs to test and complete this.
I don't event know if it compiles.
================================================================
First attempt at porting to Windows and Mac OSX.
Same change made to src/xterm.c, basically.
Just replaced line drawing primitive by the system one.
-- src/xfaces.c --
Add List_Object for symbol `line' and `wave'.
Reuse Qforeground_color, QCstyle, QCcolor.
Change checks made to :underline value to accept CONS construct.
Handle CONS construct when updating struct face attribute.
-- lisp/faces.el --
-- doc/lispref/display.texi --
Update :underline documentation
-- lisp/cus-face.el --
Update customize menu for :underline.
(:underline
(choice :tag "Underline"
:help-echo "Control text underlining."
(const :tag "Off" nil)
(list :tag "On"
(const :format "" :value :color)
(choice :tag "Color" (const :tag "Foreground Color"
foreground-color) color)
(const :format "" :value :style)
(choice :tag "Style"
(const :tag "Line" line)
(const :tag "Wave" wave)))))
underwave.patch
Description: Text Data