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