[Top][All Lists]

[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.  */

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;
    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,

  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,
      GC gc_last = mac_gc_for_face_id (f, WINDOW_DIVIDER_LAST_PIXEL_FACE_ID,

      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);
        /* 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);
    mac_fill_rectangle (f, gc, x0, y0, x1 - x0, y1 - y0);

                                     YAMAMOTO Mitsuharu

reply via email to

[Prev in Thread] Current Thread [Next in Thread]