unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Can we use FRAME_RIF to return a Lisp_Object result?
@ 2017-10-31 18:44 Keith David Bershatsky
  2017-10-31 19:38 ` Eli Zaretskii
  0 siblings, 1 reply; 4+ messages in thread
From: Keith David Bershatsky @ 2017-10-31 18:44 UTC (permalink / raw)
  To: Emacs Devel

As part of the multiple fake cursors (22873) and crosshairs (17684) features that I am working on, I am obtaining the red / green / blue values for the buffer default background face by using platform specific functions within nsterm.m, xterm.c, and w32term.c.

I would like `FRAME_RIF (f)->calc_lsl_default_bg (w)` to return a Lisp_Object in the form of a vector consisting of 3 doubles.

All of the examples in redisplay_interface are void, which makes me think that a Lisp_Object result may not be supported.

I have been using window pointers to store the values for red, green and blue.  However, I would like to eliminate the need to use those window pointers in favor of FRAME_RIF returning a Lisp_Object result.  Is this okay to do, or is there a more appropriate way to get the result of those platform specific functions?


/* window.h */
/* Suffixes for the `mc` window pointer prefix. */
struct multiple_cursors
{
  * * *

  /* Values for the background color that are used to erase a glyphless cursor. */
  double bg_red, bg_green, bg_blue;

  * * *
};


/* nsterm.m */
static void
ns_calc_lsl_default_bg (struct window *w)
{
  struct frame *f = XFRAME (WINDOW_FRAME (w));
  /* The default face, possibly remapped. */
  struct face *default_face = FACE_FROM_ID (f, lookup_basic_face (f, DEFAULT_FACE_ID));
  NSColor *background_color = ns_lookup_indexed_color (default_face->background, f);
  EmacsCGFloat red, green, blue;
  * * *
  w->mc.bg_red = red;
  w->mc.bg_green = green;
  w->mc.bg_blue = blue;
  * * *
}


/* dispextern.h */

struct redisplay_interface
{
  /* Handlers for setting frame parameters.  */
  frame_parm_handler *frame_parm_handlers;

  * * * 

  void (*calc_lsl_default_bg) (struct window *w);

  * * *
};

Thanks,

Keith



^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Can we use FRAME_RIF to return a Lisp_Object result?
  2017-10-31 18:44 Keith David Bershatsky
@ 2017-10-31 19:38 ` Eli Zaretskii
  0 siblings, 0 replies; 4+ messages in thread
From: Eli Zaretskii @ 2017-10-31 19:38 UTC (permalink / raw)
  To: Keith David Bershatsky; +Cc: emacs-devel

> Date: Tue, 31 Oct 2017 11:44:02 -0700
> From: Keith David Bershatsky <esq@lawlist.com>
> 
> As part of the multiple fake cursors (22873) and crosshairs (17684) features that I am working on, I am obtaining the red / green / blue values for the buffer default background face by using platform specific functions within nsterm.m, xterm.c, and w32term.c.
> 
> I would like `FRAME_RIF (f)->calc_lsl_default_bg (w)` to return a Lisp_Object in the form of a vector consisting of 3 doubles.
> 
> All of the examples in redisplay_interface are void, which makes me think that a Lisp_Object result may not be supported.
> 
> I have been using window pointers to store the values for red, green and blue.  However, I would like to eliminate the need to use those window pointers in favor of FRAME_RIF returning a Lisp_Object result.  Is this okay to do, or is there a more appropriate way to get the result of those platform specific functions?
> 
> 
> /* window.h */
> /* Suffixes for the `mc` window pointer prefix. */
> struct multiple_cursors
> {
>   * * *
> 
>   /* Values for the background color that are used to erase a glyphless cursor. */
>   double bg_red, bg_green, bg_blue;
> 
>   * * *
> };
> 
> 
> /* nsterm.m */
> static void
> ns_calc_lsl_default_bg (struct window *w)
> {
>   struct frame *f = XFRAME (WINDOW_FRAME (w));
>   /* The default face, possibly remapped. */
>   struct face *default_face = FACE_FROM_ID (f, lookup_basic_face (f, DEFAULT_FACE_ID));
>   NSColor *background_color = ns_lookup_indexed_color (default_face->background, f);
>   EmacsCGFloat red, green, blue;
>   * * *
>   w->mc.bg_red = red;
>   w->mc.bg_green = green;
>   w->mc.bg_blue = blue;
>   * * *
> }

I don't understand why you need a platform-dependent implementation
for this.  Given the face (obtained using FACE_FROM_ID as above), you
have its Lisp attributes in face->lface, and the foreground and
background pixels are then at lface[LFACE_FOREGROUND_INDEX] and
lface[LFACE_BACKGROUND_INDEX] respectively.  These are XColor values,
so getting the RGB components from them is trivial.

For frame's default face, you can do this even simpler: by using
FRAME_FOREGROUND_PIXEL and FRAME_BACKGROUND_PIXEL.

Am I missing something?



^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Can we use FRAME_RIF to return a Lisp_Object result?
@ 2017-10-31 19:59 Keith David Bershatsky
  2017-10-31 20:19 ` Eli Zaretskii
  0 siblings, 1 reply; 4+ messages in thread
From: Keith David Bershatsky @ 2017-10-31 19:59 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

Thank you, Eli.

Prior to just a few minutes ago when I read your comments, I had been unaware that it was possible to obtain the RGB for the default foreground/background (which might be remapped on a buffer local basis) from within xdisp.c absent using platform-dependent functions.  That misunderstanding was based (in large part) upon a layman's reading of the code looking for keywords such as "red", "green", "blue", and "RGB".  Because I found keywords of that nature in the platform-dependent areas of the code (nsterm.m, w32term.c, and xterm.c), I made the erroneous assumption mentioned above.

I look forward to using your examples and eliminating the erroneous platform-dependent implementations.

As always, your help is greatly appreciated!

Keith

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

DATE:  [10-31-2017 12:38:01] <31 Oct 2017 21:38:01 +0200>
FROM:  Eli Zaretskii <eliz@gnu.org>
> 
> * * *
> 
> I don't understand why you need a platform-dependent implementation
> for this.  Given the face (obtained using FACE_FROM_ID as above), you
> have its Lisp attributes in face->lface, and the foreground and
> background pixels are then at lface[LFACE_FOREGROUND_INDEX] and
> lface[LFACE_BACKGROUND_INDEX] respectively.  These are XColor values,
> so getting the RGB components from them is trivial.
> 
> For frame's default face, you can do this even simpler: by using
> FRAME_FOREGROUND_PIXEL and FRAME_BACKGROUND_PIXEL.
> 
> Am I missing something?



^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Can we use FRAME_RIF to return a Lisp_Object result?
  2017-10-31 19:59 Can we use FRAME_RIF to return a Lisp_Object result? Keith David Bershatsky
@ 2017-10-31 20:19 ` Eli Zaretskii
  0 siblings, 0 replies; 4+ messages in thread
From: Eli Zaretskii @ 2017-10-31 20:19 UTC (permalink / raw)
  To: Keith David Bershatsky; +Cc: emacs-devel

> Date: Tue, 31 Oct 2017 12:59:02 -0700
> From: Keith David Bershatsky <esq@lawlist.com>
> Cc: emacs-devel@gnu.org
> 
> Prior to just a few minutes ago when I read your comments, I had been unaware that it was possible to obtain the RGB for the default foreground/background (which might be remapped on a buffer local basis) from within xdisp.c absent using platform-dependent functions.  That misunderstanding was based (in large part) upon a layman's reading of the code looking for keywords such as "red", "green", "blue", and "RGB".  Because I found keywords of that nature in the platform-dependent areas of the code (nsterm.m, w32term.c, and xterm.c), I made the erroneous assumption mentioned above.

If you want to understand how face colors are being managed and
manipulated in Emacs, you should read xfaces.c, not the other source
files.



^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2017-10-31 20:19 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-10-31 19:59 Can we use FRAME_RIF to return a Lisp_Object result? Keith David Bershatsky
2017-10-31 20:19 ` Eli Zaretskii
  -- strict thread matches above, loose matches on Subject: below --
2017-10-31 18:44 Keith David Bershatsky
2017-10-31 19:38 ` Eli Zaretskii

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).