Attached patch adds ability to add border to windows.  Example
usage:

(add-hook 'add-window-hook
          (lambda (w)
            (let ((bw (case (window-type w)
                        ((unframed shaped shaped-transient) 0)
                        ((dockapp) 0)
                        (t 1))))
              (set-window-border w (get-color "black"))
              (set-window-border-width w bw))))

The problem is - I don't see this border.  There's one-pixel
space around window, but it looks transparent regardless of
color.  I am stuck, can anyone help me?

-- 
Regards,    --
Sir Raorn.   --- http://thousandsofhate.blogspot.com/
 src/events.c  |    2 +-
 src/frames.c  |    6 ++++--
 src/sawfish.h |    3 +++
 src/windows.c |   44 ++++++++++++++++++++++++++++++++++++++++----
 4 files changed, 48 insertions(+), 7 deletions(-)

diff --git a/src/events.c b/src/events.c
index 6daefd7..1d037fc 100644
--- a/src/events.c
+++ b/src/events.c
@@ -1290,7 +1290,7 @@ send_synthetic_configure (Lisp_Window *w)
        }
        ev.xconfigure.width = w->attr.width;
        ev.xconfigure.height = w->attr.height;
-       ev.xconfigure.border_width = w->attr.border_width;
+       ev.xconfigure.border_width = w->border_width;
        ev.xconfigure.above = w->reparented ? w->frame : root_window;
        ev.xconfigure.override_redirect = False;
        XSendEvent (dpy, w->id, False, StructureNotifyMask, &ev);
diff --git a/src/frames.c b/src/frames.c
index 14e4d10..3c9d2ce 100644
--- a/src/frames.c
+++ b/src/frames.c
@@ -1581,12 +1581,12 @@ list_frame_generator (Lisp_Window *w)
 
        wa.override_redirect = True;
        wa.colormap = colormap;
-       wa.border_pixel = BlackPixel (dpy, screen_num);
+       wa.border_pixel = w->border_pixel;
        wa.save_under = w->attr.save_under;
        wamask = CWOverrideRedirect | CWColormap | CWBorderPixel | CWSaveUnder;
 
        w->frame = XCreateWindow (dpy, root_window, w->attr.x, w->attr.y,
-                                 w->frame_width, w->frame_height, 0,
+                                 w->frame_width, w->frame_height, 
w->border_width,
                                  depth, InputOutput, visual, wamask, &wa);
     }
     else
@@ -1595,6 +1595,8 @@ list_frame_generator (Lisp_Window *w)
        w->attr.x += w->frame_x - old_x_off;
        w->attr.y += w->frame_y - old_y_off;
 
+       XSetWindowBorder (dpy, w->frame, w->border_pixel);
+       XSetWindowBorderWidth (dpy, w->frame, w->border_width);
        XMoveResizeWindow (dpy, w->frame, w->attr.x, w->attr.y,
                           w->frame_width, w->frame_height);
 
diff --git a/src/sawfish.h b/src/sawfish.h
index 1a6fb7e..69162b8 100644
--- a/src/sawfish.h
+++ b/src/sawfish.h
@@ -142,6 +142,9 @@ typedef struct lisp_window {
        But the position is the position of the frame, while the
        dimensions are those of the client */
     XWindowAttributes attr;
+    unsigned int old_border_width;             /* saved border width of window 
*/
+    unsigned int border_width;
+    unsigned long border_pixel;
     XSizeHints hints;
     XWMHints *wmhints;
     Window *cmap_windows;
diff --git a/src/windows.c b/src/windows.c
index 330f763..5b46c22 100644
--- a/src/windows.c
+++ b/src/windows.c
@@ -458,6 +458,7 @@ add_window (Window id)
        w->name = rep_null_string ();
        w->net_name = Qnil;
        w->net_icon_name = Qnil;
+       w->border_pixel = BlackPixel (dpy, screen_num);
 
         /* Don't garbage collect the window before we are done. */
         /* Note: must not return without rep_POPGC. */
@@ -473,6 +474,7 @@ add_window (Window id)
        XGetWindowAttributes (dpy, id, &w->attr);
        DB(("  orig: width=%d height=%d x=%d y=%d\n",
            w->attr.width, w->attr.height, w->attr.x, w->attr.y));
+       w->old_border_width = w->attr.border_width;
 
        get_window_name(w);
 
@@ -599,7 +601,7 @@ remove_window (Lisp_Window *w, bool destroyed, bool 
from_error)
            remove_window_frame (w);
 
            /* Restore original border width of the client */
-           XSetWindowBorderWidth (dpy, w->id, w->attr.border_width);
+           XSetWindowBorderWidth (dpy, w->id, w->old_border_width);
        }
 
        if (!from_error)
@@ -960,8 +962,8 @@ surrounding WINDOW.
     rep_DECLARE1(win, WINDOWP);
     if (VWIN(win)->reparented)
     {
-       return Fcons (rep_MAKE_INT(VWIN(win)->frame_width),
-                     rep_MAKE_INT(VWIN(win)->frame_height));
+       return Fcons (rep_MAKE_INT(VWIN(win)->frame_width + 
2*VWIN(win)->border_width),
+                     rep_MAKE_INT(VWIN(win)->frame_height + 
2*VWIN(win)->border_width));
     }
     else
        return Fwindow_dimensions (win);
@@ -1255,6 +1257,38 @@ member of, or nil if it is not a member of a group.
            : Qnil);
 }
 
+/* FIXME */
+DEFUN("set-window-border", Fset_window_border, Sset_window_border,
+      (repv win, repv color), rep_Subr2) /*
+::doc:sawfish.wm.windows.subrs#set-window-border::
+set-window-border WINDOW COLOR
+::end:: */
+{
+    rep_DECLARE1(win, WINDOWP);
+    rep_DECLARE2(color, COLORP);
+
+    VWIN(win)->border_pixel = VCOLOR(color)->pixel;
+    DB(("  border_pixel=%d\n", VWIN(win)->border_pixel));
+
+    return win;
+}
+
+/* FIXME */
+DEFUN("set-window-border-width", Fset_window_border_width, 
Sset_window_border_width,
+      (repv win, repv width), rep_Subr2) /*
+::doc:sawfish.wm.windows.subrs#set-window-border-width::
+set-window-border-width WINDOW INTEGER
+::end:: */
+{
+    rep_DECLARE1(win, WINDOWP);
+    rep_DECLARE2(width, rep_INTEGERP);
+
+    VWIN(win)->border_width = rep_get_long_uint(width);
+    DB(("  border_width=%d\n", VWIN(win)->border_width));
+
+    return win;
+}
+
 DEFUN("window-border-width", Fwindow_border_width, Swindow_border_width,
       (repv win), rep_Subr1) /*
 ::doc:sawfish.wm.windows.subrs#window-border-width::
@@ -1262,7 +1296,7 @@ window-border-width WINDOW
 ::end:: */
 {
     rep_DECLARE1(win, WINDOWP);
-    return rep_MAKE_INT(VWIN(win)->attr.border_width);
+    return rep_MAKE_INT(VWIN(win)->border_width);
 }
 
 DEFUN("window-size-hints", Fwindow_size_hints, Swindow_size_hints,
@@ -1697,6 +1731,8 @@ windows_init (void)
     rep_ADD_SUBR(Swindow_group_id);
     rep_ADD_SUBR(Swindow_size_hints);
     rep_ADD_SUBR(Scall_window_hook);
+    rep_ADD_SUBR(Sset_window_border);
+    rep_ADD_SUBR(Sset_window_border_width);
     rep_ADD_SUBR(Swindow_border_width);
     rep_ADD_SUBR(Swindow_icon_image);
     rep_ADD_SUBR(Smap_windows);

Attachment: signature.asc
Description: Digital signature

Reply via email to