emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Adding new variable for face-list in internal-make-lisp-face.


From: Keith David Bershatsky
Subject: Re: Adding new variable for face-list in internal-make-lisp-face.
Date: Fri, 03 Nov 2017 15:01:34 -0700

Thank you, Eli, for reading this particular thread.

I have a tab buffer-display-table entry that looks like:

[(187 . 120) (9 . 121)]

Your suggestion to use GLYPH_FACE would be more efficient than my using the C 
equivalent of:

(aref buffer-display-table ?\t)

... and then iterating over the vector elements looking for a cons cell 
containing the number 9.

I will work on incorporating GLYPH_FACE into my code, instead of using the 
above iteration.  Thank you for the suggestion.

Once the face id is obtained, I have been using C implementations of the 
following:

;;; Example assumes that 121 is a valid Lisp face id.
(let* ((tab-cons-cell (cons 9 121))
       (face (glyph-face tab-cons-cell))
       (bg-color (mc-face-attribute
                   face
                   :background
                   (selected-frame)
                   'default)))
  bg-color)

The function `glyph-face' calls the function `face-list' which is too slow.  I 
saw no improvement in speed when calling Fmapcar (Qcar, 
Vface_new_frame_defaults) from C, versus the same thing in Lisp.

In a nutshell, I am looking for that background color and trying to implement a 
faster way of getting the result for (mapcar #'car face-new-frame-defaults).  
That need for speed is what inspired me to think about creating a new 
Vface_list variable and populating it inside of internal-make-lisp-face at the 
same time that Vface_new_frame_defaults gets populated.  [xfaces.c]  The 
Vface_list variable would be (when implemented correctly) identical to the 
result returned by the Lisp function `face-list'.

I am unaware of another way to quickly get the background color for the 
above-situation, but would be open to new ideas of how to achieve that goal.

Keith

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

DATE:  [11-03-2017 03:17:05] <03 Nov 2017 12:17:05 +0200>
FROM:  Eli Zaretskii <address@hidden>
> 
> > Date: Thu, 02 Nov 2017 20:50:47 -0700
> > From: Keith David Bershatsky <address@hidden>
> > 
> > In implementing feature requests crosshairs (17684) and multiple fake 
> > cursors (22873), I thought it would be nifty to identify the background 
> > color (if applicable) associated with a tab ('\t') glyph code in the 
> > buffer-display-table.  In doing so, I discovered that the Lisp function 
> > face-list is way too slow.  Even after I ported the face-list function over 
> > to C, it was still way too slow.  So, I tried my luck at adding a new 
> > variable in xfaces.c for the face-list and am setting it from within the 
> > function internal-make-lisp-face, like so:
> 
> I don't understand why you need face-list for this.  For each glyph in
> the display table, you get its face ID by using the GLYPH_FACE macro.
> Why isn't that sufficient for your needs?



reply via email to

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