[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?