emacs-diffs
[Top][All Lists]
Advanced

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

feature/pgtk ae18c8e 2/2: Support child frame border width


From: Yuuki Harano
Subject: feature/pgtk ae18c8e 2/2: Support child frame border width
Date: Sat, 30 Jan 2021 10:59:13 -0500 (EST)

branch: feature/pgtk
commit ae18c8ec4f0ef37c8c9cda473770ff47e41291e2
Author: Yuuki Harano <masm+github@masm11.me>
Commit: Yuuki Harano <masm+github@masm11.me>

    Support child frame border width
    
    * src/pgtkfns.c (x_set_child_frame_border_width): Port code for X.
    (pgtk_frame_parm_handlers): Add hook.
    (Fx_create_frame): Get default parameter.
    * src/pgtkterm.c (x_draw_stretch_glyph_string): Re-port code for X.
    (pgtk_clear_under_internal_border): Re-port code for X.
---
 src/pgtkfns.c  | 38 ++++++++++++++++++++++++++++++
 src/pgtkterm.c | 73 +++++++++++++++++++++++++++++++++++-----------------------
 2 files changed, 82 insertions(+), 29 deletions(-)

diff --git a/src/pgtkfns.c b/src/pgtkfns.c
index 620680f..cee24c1 100644
--- a/src/pgtkfns.c
+++ b/src/pgtkfns.c
@@ -534,6 +534,24 @@ x_set_tool_bar_lines (struct frame *f, Lisp_Object value, 
Lisp_Object oldval)
 
 }
 
+static void
+x_set_child_frame_border_width (struct frame *f, Lisp_Object arg, Lisp_Object 
oldval)
+{
+  int border = check_int_nonnegative (arg);
+
+  if (border != FRAME_CHILD_FRAME_BORDER_WIDTH (f))
+    {
+      f->child_frame_border_width = border;
+
+      if (FRAME_X_WINDOW (f))
+       {
+         adjust_frame_size (f, -1, -1, 3, false, Qchild_frame_border_width);
+         pgtk_clear_under_internal_border (f);
+       }
+    }
+
+}
+
 
 static void
 x_set_internal_border_width (struct frame *f, Lisp_Object arg,
@@ -963,6 +981,7 @@ frame_parm_handler pgtk_frame_parm_handlers[] = {
   x_set_foreground_color,
   x_set_icon_name,
   x_set_icon_type,
+  x_set_child_frame_border_width,
   x_set_internal_border_width, /* generic OK */
   gui_set_right_divider_width,
   gui_set_bottom_divider_width,
@@ -1422,6 +1441,25 @@ This function is an internal primitive--use `make-frame' 
instead.  */ )
       if (!EQ (value, Qunbound))
        parms = Fcons (Fcons (Qinternal_border_width, value), parms);
     }
+
+  /* Same for child frames.  */
+  if (NILP (Fassq (Qchild_frame_border_width, parms)))
+    {
+      Lisp_Object value;
+
+      value = gui_display_get_arg (dpyinfo, parms, Qchild_frame_border_width,
+                                   "childFrameBorderWidth", 
"childFrameBorderWidth",
+                                   RES_TYPE_NUMBER);
+      if (! EQ (value, Qunbound))
+       parms = Fcons (Fcons (Qchild_frame_border_width, value),
+                      parms);
+
+    }
+
+  gui_default_parameter (f, parms, Qchild_frame_border_width,
+                        make_fixnum (0),
+                        "childFrameBorderWidth", "childFrameBorderWidth",
+                        RES_TYPE_NUMBER);
   gui_default_parameter (f, parms, Qinternal_border_width,
                         make_fixnum (0),
                         "internalBorderWidth", "internalBorderWidth",
diff --git a/src/pgtkterm.c b/src/pgtkterm.c
index 5d1716a..437249a 100644
--- a/src/pgtkterm.c
+++ b/src/pgtkterm.c
@@ -2367,14 +2367,29 @@ x_draw_stretch_glyph_string (struct glyph_string *s)
   else if (!s->background_filled_p)
     {
       int background_width = s->background_width;
-      int x = s->x, left_x = window_box_left_offset (s->w, TEXT_AREA);
+      int x = s->x, text_left_x = window_box_left_offset (s->w, TEXT_AREA);
 
-      /* Don't draw into left margin, fringe or scrollbar area
-         except for header line and mode line.  */
-      if (x < left_x && !s->row->mode_line_p)
+      /* Don't draw into left fringe or scrollbar area except for
+         header line and mode line.  */
+      if (x < text_left_x && !s->row->mode_line_p)
        {
-         background_width -= left_x - x;
-         x = left_x;
+         int left_x = WINDOW_LEFT_SCROLL_BAR_AREA_WIDTH (s->w);
+         int right_x = text_left_x;
+
+         if (WINDOW_HAS_FRINGES_OUTSIDE_MARGINS (s->w))
+           left_x += WINDOW_LEFT_FRINGE_WIDTH (s->w);
+         else
+           right_x -= WINDOW_LEFT_FRINGE_WIDTH (s->w);
+
+         /* Adjust X and BACKGROUND_WIDTH to fit inside the space
+            between LEFT_X and RIGHT_X.  */
+         if (x < left_x)
+           {
+             background_width -= left_x - x;
+             x = left_x;
+           }
+         if (x + background_width > right_x)
+           background_width = right_x - x;
        }
       if (background_width > 0)
        x_draw_glyph_string_bg_rect (s, x, s->y, background_width, s->height);
@@ -5261,37 +5276,37 @@ pgtk_clear_under_internal_border (struct frame *f)
       int border = FRAME_INTERNAL_BORDER_WIDTH (f);
       int width = FRAME_PIXEL_WIDTH (f);
       int height = FRAME_PIXEL_HEIGHT (f);
-      int margin = 0;
-      struct face *face = FACE_FROM_ID_OR_NULL (f, INTERNAL_BORDER_FACE_ID);
+      int margin = FRAME_TOP_MARGIN_HEIGHT (f);
+      int face_id =
+       (FRAME_PARENT_FRAME (f)
+        ? (!NILP (Vface_remapping_alist)
+           ? lookup_basic_face (NULL, f, CHILD_FRAME_BORDER_FACE_ID)
+           : CHILD_FRAME_BORDER_FACE_ID)
+        : (!NILP (Vface_remapping_alist)
+           ? lookup_basic_face (NULL, f, INTERNAL_BORDER_FACE_ID)
+           : INTERNAL_BORDER_FACE_ID));
+      struct face *face = FACE_FROM_ID_OR_NULL (f, face_id);
 
       block_input ();
 
-      struct
-      {
-       int x, y, w, h;
-      } rects[] = {
-       {0, margin, width, border},
-       {0, 0, border, height},
-       {width - border, 0, border, height},
-       {0, height - border, width, border},
-      };
-
       if (face)
        {
-         for (int i = 0; i < 4; i++)
-           {
-             int x = rects[i].x;
-             int y = rects[i].y;
-             int w = rects[i].w;
-             int h = rects[i].h;
-             fill_background_by_face (f, face, x, y, w, h);
-           }
+#define x_fill_rectangle(f, gc, x, y, w, h) \
+           fill_background_by_face (f, face, x, y, w, h)
+         x_fill_rectangle (f, gc, 0, margin, width, border);
+         x_fill_rectangle (f, gc, 0, 0, border, height);
+         x_fill_rectangle (f, gc, width - border, 0, border, height);
+         x_fill_rectangle (f, gc, 0, height - border, width, border);
+#undef x_fill_rectangle
        }
       else
        {
-         for (int i = 0; i < 4; i++)
-           pgtk_clear_area (f, rects[i].x, rects[i].y, rects[i].w,
-                            rects[i].h);
+#define x_clear_area(f, x, y, w, h)  pgtk_clear_area (f, x, y, w, h)
+         x_clear_area (f, 0, 0, border, height);
+         x_clear_area (f, 0, margin, width, border);
+         x_clear_area (f, width - border, 0, border, height);
+         x_clear_area (f, 0, height - border, width, border);
+#undef x_clear_area
        }
 
       unblock_input ();



reply via email to

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