emacs-diffs
[Top][All Lists]
Advanced

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

[Emacs-diffs] scratch/x_emacs 7170354 5/5: Add terminal hook defined_col


From: Alexander Gramiak
Subject: [Emacs-diffs] scratch/x_emacs 7170354 5/5: Add terminal hook defined_color_hook
Date: Sat, 13 Apr 2019 14:41:01 -0400 (EDT)

branch: scratch/x_emacs
commit 7170354467a91fc5c6fb846bf0e2da1e5ca092e9
Author: Alexander Gramiak <address@hidden>
Commit: Alexander Gramiak <address@hidden>

    Add terminal hook defined_color_hook
    
    * src/termhooks.h (defined_color_hook): New terminal hook.
    
    * src/xterm.c:
    * src/nsterm.m:
    * src/term.c:
    * src/w32term.c: Set defined_color_hook.
    
    * src/nsterm.m (ns_defined_color_hook): New hook wrapper procedure.
    
    * src/xfaces.c: Use defined_color_hook.
    (defined_color): Remove.
    
    * src/image.c (image_defined_color): New wrapper procedure for NS.
    Remove redefinitions of x_defined_color, and rename x_defined_color to
    image_defined_color.
---
 src/dispextern.h |  2 ++
 src/image.c      | 45 +++++++++++++++++++++++++++++++--------------
 src/nsterm.m     | 12 ++++++++++++
 src/term.c       |  2 ++
 src/termhooks.h  |  8 ++++++++
 src/w32term.c    |  1 +
 src/xfaces.c     | 50 +++++++++++++-------------------------------------
 src/xterm.c      |  1 +
 8 files changed, 70 insertions(+), 51 deletions(-)

diff --git a/src/dispextern.h b/src/dispextern.h
index 4851fc6..899a1f1 100644
--- a/src/dispextern.h
+++ b/src/dispextern.h
@@ -3413,6 +3413,8 @@ void x_free_colors (struct frame *, unsigned long *, int);
 
 void update_face_from_frame_parameter (struct frame *, Lisp_Object,
                                        Lisp_Object);
+extern bool tty_defined_color (struct frame *f, const char *, XColor *, bool);
+
 Lisp_Object tty_color_name (struct frame *, int);
 void clear_face_cache (bool);
 unsigned long load_color (struct frame *, struct face *, Lisp_Object,
diff --git a/src/image.c b/src/image.c
index 1885f75..b554d5c 100644
--- a/src/image.c
+++ b/src/image.c
@@ -89,8 +89,6 @@ typedef struct w32_bitmap_record Bitmap_Record;
 #define PIX_MASK_RETAIN        0
 #define PIX_MASK_DRAW  1
 
-#define x_defined_color w32_defined_color
-
 #endif /* HAVE_NTGUI */
 
 #ifdef HAVE_NS
@@ -101,8 +99,6 @@ typedef struct ns_bitmap_record Bitmap_Record;
 
 #define PIX_MASK_RETAIN        0
 
-#define x_defined_color(f, name, color_def, alloc) \
-  ns_defined_color (f, name, color_def, alloc, 0)
 #endif /* HAVE_NS */
 
 #if (defined HAVE_X_WINDOWS \
@@ -1413,6 +1409,21 @@ gui_clear_image (struct frame *f, struct image *img)
   unblock_input ();
 }
 
+/* Wrapper for defined_color_hook to support the extra argument in
+   ns_defined_color. */
+
+static bool
+image_defined_color (struct frame *f, const char *color_name, XColor 
*color_def,
+                     bool alloc)
+{
+#ifdef HAVE_NS
+  if (FRAME_NS_P (f))
+    return ns_defined_color (f, color_name, color_def, alloc, false);
+  else
+#endif
+    return FRAME_TERMINAL (f)->defined_color_hook
+      (f, color_name, color_def, alloc);
+}
 
 /* Allocate color COLOR_NAME for image IMG on frame F.  If color
    cannot be allocated, use DFLT.  Add a newly allocated color to
@@ -1428,7 +1439,7 @@ gui_alloc_image_color (struct frame *f, struct image 
*img, Lisp_Object color_nam
 
   eassert (STRINGP (color_name));
 
-  if (x_defined_color (f, SSDATA (color_name), &color, 1)
+  if (image_defined_color (f, SSDATA (color_name), &color, true)
       && img->ncolors < min (min (PTRDIFF_MAX, SIZE_MAX) / sizeof *img->colors,
                             INT_MAX))
     {
@@ -4469,8 +4480,8 @@ xpm_load_image (struct frame *f,
            {
              if (xstrcasecmp (SSDATA (XCDR (specified_color)), "None") == 0)
                color_val = Qt;
-             else if (x_defined_color (f, SSDATA (XCDR (specified_color)),
-                                       &cdef, 0))
+             else if (image_defined_color (f, SSDATA (XCDR (specified_color)),
+                                            &cdef, false))
                color_val = make_fixnum (cdef.pixel);
            }
        }
@@ -4478,7 +4489,7 @@ xpm_load_image (struct frame *f,
        {
          if (xstrcasecmp (max_color, "None") == 0)
            color_val = Qt;
-         else if (x_defined_color (f, max_color, &cdef, 0))
+         else if (image_defined_color (f, max_color, &cdef, false))
            color_val = make_fixnum (cdef.pixel);
        }
       if (!NILP (color_val))
@@ -5684,7 +5695,10 @@ pbm_load (struct frame *f, struct image *img)
 #ifdef USE_CAIRO
       if (! fmt[PBM_FOREGROUND].count
           || ! STRINGP (fmt[PBM_FOREGROUND].value)
-          || ! x_defined_color (f, SSDATA (fmt[PBM_FOREGROUND].value), &xfg, 
0))
+          || ! image_defined_color (f,
+                                    SSDATA (fmt[PBM_FOREGROUND].value),
+                                    &xfg,
+                                    false))
         {
           xfg.pixel = fg;
           x_query_colors (f, &xfg, 1);
@@ -5693,7 +5707,10 @@ pbm_load (struct frame *f, struct image *img)
 
       if (! fmt[PBM_BACKGROUND].count
           || ! STRINGP (fmt[PBM_BACKGROUND].value)
-          || ! x_defined_color (f, SSDATA (fmt[PBM_BACKGROUND].value), &xbg, 
0))
+          || ! image_defined_color (f,
+                                    SSDATA (fmt[PBM_BACKGROUND].value),
+                                    &xbg,
+                                    false))
        {
           xbg.pixel = bg;
           x_query_colors (f, &xbg, 1);
@@ -6352,7 +6369,7 @@ png_load_body (struct frame *f, struct image *img, struct 
png_load_context *c)
         current frame background, ignoring any default background
         color set by the image.  */
       if (STRINGP (specified_bg)
-         ? x_defined_color (f, SSDATA (specified_bg), &color, false)
+         ? image_defined_color (f, SSDATA (specified_bg), &color, false)
          : (gui_query_frame_background_color (f, &color), true))
        /* The user specified `:background', use that.  */
        {
@@ -8037,7 +8054,7 @@ gif_load (struct frame *f, struct image *img)
   if (STRINGP (specified_bg))
     {
       XColor color;
-      if (x_defined_color (f, SSDATA (specified_bg), &color, 0))
+      if (image_defined_color (f, SSDATA (specified_bg), &color, false))
         {
           uint32_t *dataptr = data32;
           int r = color.red/256;
@@ -8798,7 +8815,7 @@ imagemagick_load_image (struct frame *f, struct image 
*img,
 
     specified_bg = image_spec_value (img->spec, QCbackground, NULL);
     if (!STRINGP (specified_bg)
-       || !x_defined_color (f, SSDATA (specified_bg), &bgcolor, 0))
+       || !image_defined_color (f, SSDATA (specified_bg), &bgcolor, false))
       gui_query_frame_background_color (f, &bgcolor);
 
     bg_wand = NewPixelWand ();
@@ -9533,7 +9550,7 @@ svg_load_image (struct frame *f, struct image *img, char 
*contents,
     XColor background;
     Lisp_Object specified_bg = image_spec_value (img->spec, QCbackground, 
NULL);
     if (!STRINGP (specified_bg)
-       || !x_defined_color (f, SSDATA (specified_bg), &background, 0))
+       || !image_defined_color (f, SSDATA (specified_bg), &background, false))
       gui_query_frame_background_color (f, &background);
 
     /* SVG pixmaps specify transparency in the last byte, so right
diff --git a/src/nsterm.m b/src/nsterm.m
index fa43b6a..95d1c60 100644
--- a/src/nsterm.m
+++ b/src/nsterm.m
@@ -2447,6 +2447,17 @@ ns_defined_color (struct frame *f,
   return 1;
 }
 
+static bool
+ns_defined_color_hook (struct frame *f,
+                       const char *name,
+                       XColor *color_def,
+                       bool alloc)
+/* --------------------------------------------------------------------------
+   External (hook): Used as the terminal hook interface for ns_defined_color
+   -------------------------------------------------------------------------- 
*/
+{
+  return ns_defined_color (f, name, color_def, alloc, true);
+}
 
 static void
 ns_set_frame_alpha (struct frame *f)
@@ -5232,6 +5243,7 @@ ns_create_terminal (struct ns_display_info *dpyinfo)
   terminal->update_end_hook = ns_update_end;
   terminal->read_socket_hook = ns_read_socket;
   terminal->frame_up_to_date_hook = ns_frame_up_to_date;
+  terminal->defined_color_hook = ns_defined_color_hook;
   terminal->mouse_position_hook = ns_mouse_position;
   terminal->get_focus_frame = ns_get_focus_frame;
   terminal->focus_frame_hook = ns_focus_frame;
diff --git a/src/term.c b/src/term.c
index a492276..a150da7 100644
--- a/src/term.c
+++ b/src/term.c
@@ -3839,6 +3839,7 @@ clear_tty_hooks (struct terminal *terminal)
   terminal->update_begin_hook = 0;
   terminal->update_end_hook = 0;
   terminal->set_terminal_window_hook = 0;
+  terminal->defined_color_hook = 0;
   terminal->mouse_position_hook = 0;
   terminal->frame_rehighlight_hook = 0;
   terminal->frame_raise_lower_hook = 0;
@@ -3882,6 +3883,7 @@ set_tty_hooks (struct terminal *terminal)
   terminal->menu_show_hook = &tty_menu_show;
 #endif
   terminal->set_terminal_window_hook = &tty_set_terminal_window;
+  terminal->defined_color_hook = &tty_defined_color; /* xfaces.c */
   terminal->read_socket_hook = &tty_read_avail_input; /* keyboard.c */
   terminal->delete_frame_hook = &tty_free_frame_resources;
   terminal->delete_terminal_hook = &delete_tty;
diff --git a/src/termhooks.h b/src/termhooks.h
index 29c5737..982b0fa 100644
--- a/src/termhooks.h
+++ b/src/termhooks.h
@@ -24,6 +24,7 @@ along with GNU Emacs.  If not, see 
<https://www.gnu.org/licenses/>.  */
 /* Miscellanea.   */
 
 #include "lisp.h"
+#include "dispextern.h"
 #include "systime.h" /* for Time */
 
 struct glyph;
@@ -488,6 +489,13 @@ struct terminal
   void (*update_end_hook) (struct frame *);
   void (*set_terminal_window_hook) (struct frame *, int);
 
+  /* Decide if color named COLOR_NAME is valid for the display
+   associated with the frame F; if so, return the rgb values in
+   COLOR_DEF.  If ALLOC, allocate a new colormap cell. */
+  bool (*defined_color_hook) (struct frame *f, const char *color_name,
+                              XColor *color_def,
+                              bool alloc);
+
   /* Multi-frame and mouse support hooks.  */
 
   /* Return the current position of the mouse.
diff --git a/src/w32term.c b/src/w32term.c
index 9e51ddf..96a1020 100644
--- a/src/w32term.c
+++ b/src/w32term.c
@@ -7159,6 +7159,7 @@ w32_create_terminal (struct w32_display_info *dpyinfo)
   terminal->update_end_hook = w32_update_end;
   terminal->read_socket_hook = w32_read_socket;
   terminal->frame_up_to_date_hook = w32_frame_up_to_date;
+  terminal->defined_color_hook = w32_defined_color;
   terminal->mouse_position_hook = w32_mouse_position;
   terminal->get_focus_frame = w32_get_focus_frame;
   terminal->focus_frame_hook = w32_focus_frame;
diff --git a/src/xfaces.c b/src/xfaces.c
index 3f627d3..c470d6a 100644
--- a/src/xfaces.c
+++ b/src/xfaces.c
@@ -898,9 +898,9 @@ tty_lookup_color (struct frame *f, Lisp_Object color, 
XColor *tty_color,
     return false;
 }
 
-/* A version of defined_color for non-X frames.  */
+/* An implementation of defined_color_hook for tty frames.  */
 
-static bool
+bool
 tty_defined_color (struct frame *f, const char *color_name,
                   XColor *color_def, bool alloc)
 {
@@ -929,36 +929,6 @@ tty_defined_color (struct frame *f, const char *color_name,
   return status;
 }
 
-
-/* Decide if color named COLOR_NAME is valid for the display
-   associated with the frame F; if so, return the rgb values in
-   COLOR_DEF.  If ALLOC, allocate a new colormap cell.
-
-   This does the right thing for any type of frame.  */
-
-static bool
-defined_color (struct frame *f, const char *color_name, XColor *color_def,
-              bool alloc)
-{
-  if (!FRAME_WINDOW_P (f))
-    return tty_defined_color (f, color_name, color_def, alloc);
-#ifdef HAVE_X_WINDOWS
-  else if (FRAME_X_P (f))
-    return x_defined_color (f, color_name, color_def, alloc);
-#endif
-#ifdef HAVE_NTGUI
-  else if (FRAME_W32_P (f))
-    return w32_defined_color (f, color_name, color_def, alloc);
-#endif
-#ifdef HAVE_NS
-  else if (FRAME_NS_P (f))
-    return ns_defined_color (f, color_name, color_def, alloc, true);
-#endif
-  else
-    emacs_abort ();
-}
-
-
 /* Given the index IDX of a tty color on frame F, return its name, a
    Lisp string.  */
 
@@ -1003,7 +973,7 @@ face_color_gray_p (struct frame *f, const char *color_name)
   XColor color;
   bool gray_p;
 
-  if (defined_color (f, color_name, &color, false))
+  if (FRAME_TERMINAL (f)->defined_color_hook (f, color_name, &color, false))
     gray_p = (/* Any color sufficiently close to black counts as gray.  */
              (color.red < 5000 && color.green < 5000 && color.blue < 5000)
              ||
@@ -1087,9 +1057,9 @@ load_color2 (struct frame *f, struct face *face, 
Lisp_Object name,
           || target_index == LFACE_STRIKE_THROUGH_INDEX
           || target_index == LFACE_BOX_INDEX);
 
-  /* if the color map is full, defined_color will return a best match
+  /* if the color map is full, defined_color_hook will return a best match
      to the values in an existing cell. */
-  if (!defined_color (f, SSDATA (name), color, true))
+  if (!FRAME_TERMINAL (f)->defined_color_hook (f, SSDATA (name), color, true))
     {
       add_to_log ("Unable to load color \"%s\"", name);
 
@@ -4243,11 +4213,17 @@ two lists of the form (RED GREEN BLUE) aforementioned. 
*/)
 
   if (!(CONSP (color1) && parse_rgb_list (color1, &cdef1))
       && !(STRINGP (color1)
-          && defined_color (f, SSDATA (color1), &cdef1, false)))
+           && FRAME_TERMINAL (f)->defined_color_hook (f,
+                                                      SSDATA (color1),
+                                                      &cdef1,
+                                                      false)))
     signal_error ("Invalid color", color1);
   if (!(CONSP (color2) && parse_rgb_list (color2, &cdef2))
       && !(STRINGP (color2)
-          && defined_color (f, SSDATA (color2), &cdef2, false)))
+           && FRAME_TERMINAL (f)->defined_color_hook (f,
+                                                      SSDATA (color2),
+                                                      &cdef2,
+                                                      false)))
     signal_error ("Invalid color", color2);
 
   if (NILP (metric))
diff --git a/src/xterm.c b/src/xterm.c
index 82be9b2..951f71c 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -13296,6 +13296,7 @@ x_create_terminal (struct x_display_info *dpyinfo)
   terminal->read_socket_hook = XTread_socket;
   terminal->frame_up_to_date_hook = XTframe_up_to_date;
   terminal->buffer_flipping_unblocked_hook = XTbuffer_flipping_unblocked_hook;
+  terminal->defined_color_hook = x_defined_color;
   terminal->mouse_position_hook = XTmouse_position;
   terminal->get_focus_frame = x_get_focus_frame;
   terminal->focus_frame_hook = x_focus_frame;



reply via email to

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