[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: C equivalent for: (face-attribute 'region :background (selected-fram
From: |
YAMAMOTO Mitsuharu |
Subject: |
Re: C equivalent for: (face-attribute 'region :background (selected-frame) 'default) |
Date: |
Wed, 27 Sep 2017 08:19:29 +0900 |
User-agent: |
Wanderlust/2.14.0 (Africa) SEMI/1.14.6 (Maruoka) FLIM/1.14.8 (Shijō) APEL/10.6 Emacs/22.3 (sparc-sun-solaris2.8) MULE/5.0 (SAKAKI) |
>>>>> On Mon, 25 Sep 2017 21:38:07 -0700, Keith David Bershatsky
>>>>> <address@hidden> said:
> I am working on implementing my own feature requests to draw crosshairs
> (#17684) using multiple fake cursors (#22873), and I am trying to quickly
> convert (in C) the :background of the region face into a string -- e.g.,
> "blue" or "#0000FF". My goal is to do all of this in C, and I would like to
> avoid porting (rewriting) several Lisp functions to give me the result of:
> (face-attribute 'region :background (selected-frame) 'default)
> Is there anything built-in into the Emacs C code base that already does this,
> or *almost* does this ...?
> BACKGROUND: I already have a function written in C that converts a color
> string (e.g., "blue" or "#0000FF") into an LSL color vector, which is used by
> the new multiple fake cursors (#22873) feature. I erase glyphless (floating)
> fake cursors by drawing new ones that match the background face. When a
> region is active, I need the LSL color vector of the region :background.
Do you need xterm.c-level drawing functions? Then perhaps you want
GCs rather than the color strings. In the Mac port, I use the
following function.
/* Return GC for the face with FACE_ID on frame F. If the face is not
available, return DEFAULT_GC. */
GC
mac_gc_for_face_id (struct frame *f, int face_id, GC default_gc)
{
struct face *face = FACE_FROM_ID_OR_NULL (f, face_id);
if (face)
{
prepare_face_for_display (f, face);
return face->gc;
}
else
return default_gc;
}
Here's an example:
/* Draw a window divider from (x0,y0) to (x1,y1) */
static void
mac_draw_window_divider (struct window *w, int x0, int x1, int y0, int y1)
{
struct frame *f = XFRAME (WINDOW_FRAME (w));
GC gc = mac_gc_for_face_id (f, WINDOW_DIVIDER_FACE_ID,
f->output_data.mac->normal_gc);
if ((y1 - y0 > x1 - x0 && x1 - x0 > 2)
|| (x1 - x0 > y1 - y0 && y1 - y0 > 3))
{
GC gc_first = mac_gc_for_face_id (f, WINDOW_DIVIDER_FIRST_PIXEL_FACE_ID,
f->output_data.mac->normal_gc);
GC gc_last = mac_gc_for_face_id (f, WINDOW_DIVIDER_LAST_PIXEL_FACE_ID,
f->output_data.mac->normal_gc);
if (y1 - y0 > x1 - x0)
/* Vertical. */
{
mac_fill_rectangle (f, gc_first, x0, y0, 1, y1 - y0);
mac_fill_rectangle (f, gc, x0 + 1, y0, x1 - x0 - 2, y1 - y0);
mac_fill_rectangle (f, gc_last, x1 - 1, y0, 1, y1 - y0);
}
else
/* Horizontal. */
{
mac_fill_rectangle (f, gc_first, x0, y0, x1 - x0, 1);
mac_fill_rectangle (f, gc, x0, y0 + 1, x1 - x0, y1 - y0 - 2);
mac_fill_rectangle (f, gc_last, x0, y1 - 1, x1 - x0, 1);
}
}
else
mac_fill_rectangle (f, gc, x0, y0, x1 - x0, y1 - y0);
}
YAMAMOTO Mitsuharu
address@hidden