diff --unified --recursive --text fvwm-2.6.9/fvwm/builtins.c fvwm-patched/fvwm/builtins.c --- fvwm-2.6.9/fvwm/builtins.c 2018-05-27 09:47:03.000000000 -0600 +++ fvwm-patched/fvwm/builtins.c 2020-08-21 16:10:56.462693301 -0600 @@ -482,6 +482,21 @@ if (action) action += next; } + else if (!do_add && StrEquals(parm,"buttonwidth")) + { + int width = 0; + int next = 0; + + sscanf(action, "%d%n", &width, &next); + + if (decor->button_width != width) + { + decor->button_width = width; + decor->flags.has_changed = 1; + } + if (action) + action += next; + } else if (!do_add && StrEquals(parm,"MinHeight")) { int height = 0; Only in fvwm-patched/fvwm: builtins.c.orig diff --unified --recursive --text fvwm-2.6.9/fvwm/frame.c fvwm-patched/fvwm/frame.c --- fvwm-2.6.9/fvwm/frame.c 2020-08-21 16:09:27.172710920 -0600 +++ fvwm-patched/fvwm/frame.c 2020-08-21 16:10:56.466693390 -0600 @@ -1372,7 +1372,14 @@ tb_thick = fw->title_thickness; nbuttons = fw->nr_left_buttons + fw->nr_right_buttons; nbuttons_big = 0; - b_length = tb_thick; + if (fw->decor->button_width == 0) + { + b_length = tb_thick; + } + else + { + b_length = fw->decor->button_width; + } t_length = tb_length - nbuttons * b_length; if (nbuttons > 0 && t_length < MIN_WINDOW_TITLE_LENGTH) { Only in fvwm-patched/fvwm: frame.c.orig diff --unified --recursive --text fvwm-2.6.9/fvwm/fvwm.h fvwm-patched/fvwm/fvwm.h --- fvwm-2.6.9/fvwm/fvwm.h 2020-08-21 16:09:27.172710920 -0600 +++ fvwm-patched/fvwm/fvwm.h 2020-08-21 16:10:56.466693390 -0600 @@ -274,6 +274,7 @@ unsigned has_rounded_corners_top : 1; unsigned has_rounded_corners_bottom : 1; unsigned has_slightly_rounded_corners : 1; + unsigned has_no_top_border : 1; focus_policy_t focus_policy; } s; } common_flags_t; Only in fvwm-patched/fvwm: fvwm.h.orig diff --unified --recursive --text fvwm-2.6.9/fvwm/geometry.c fvwm-patched/fvwm/geometry.c --- fvwm-2.6.9/fvwm/geometry.c 2020-08-21 16:09:27.176711008 -0600 +++ fvwm-patched/fvwm/geometry.c 2020-08-21 16:10:56.466693390 -0600 @@ -489,6 +489,7 @@ const FvwmWindow *fw, size_borders *borders, Bool is_shaded) { int title_thickness; + int *title_border = NULL; int bw; bw = HAS_FLUXBOX_HANDLES(fw) ? 1 : fw->boundary_width; @@ -506,18 +507,25 @@ switch (GET_TITLE_DIR(fw)) { case DIR_N: - borders->top_left.height += title_thickness; + title_border = &borders->top_left.height; break; case DIR_S: - borders->bottom_right.height += title_thickness; + title_border = &borders->bottom_right.height; break; case DIR_W: - borders->top_left.width += title_thickness; + title_border = &borders->top_left.width; break; case DIR_E: - borders->bottom_right.width += title_thickness; + title_border = &borders->bottom_right.width; break; } + + if (HAS_NO_TOP_BORDER(fw)) + { + *title_border = 1; + } + *title_border += title_thickness; + borders->total_size.width = borders->top_left.width + borders->bottom_right.width; borders->total_size.height = @@ -538,6 +546,26 @@ borders->bottom_right.width = bw; borders->top_left.height = bw; borders->bottom_right.height = fw->boundary_width; + + if (HAS_NO_TOP_BORDER(fw)) + { + switch (GET_TITLE_DIR(fw)) + { + case DIR_N: + borders->top_left.height = 1; + break; + case DIR_S: + borders->bottom_right.height = 1; + break; + case DIR_W: + borders->top_left.width = 1; + break; + case DIR_E: + borders->bottom_right.width = 1; + break; + } + } + borders->total_size.width = borders->top_left.width + borders->bottom_right.width; borders->total_size.height = Only in fvwm-patched/fvwm: geometry.c.orig diff --unified --recursive --text fvwm-2.6.9/fvwm/screen.h fvwm-patched/fvwm/screen.h --- fvwm-2.6.9/fvwm/screen.h 2020-08-21 15:30:39.091737766 -0600 +++ fvwm-patched/fvwm/screen.h 2020-08-21 16:10:56.466693390 -0600 @@ -284,6 +284,7 @@ char *tag; /* general style tag */ int title_height; /* explicitly specified title bar height */ int min_title_height; + int button_width; /* titlebar buttons */ TitleButton buttons[NUMBER_OF_TITLE_BUTTONS]; TitleButton titlebar; Only in fvwm-patched/fvwm: screen.h.orig diff --unified --recursive --text fvwm-2.6.9/fvwm/style.c fvwm-patched/fvwm/style.c --- fvwm-2.6.9/fvwm/style.c 2020-08-21 16:09:27.176711008 -0600 +++ fvwm-patched/fvwm/style.c 2020-08-21 16:10:56.466693390 -0600 @@ -4714,6 +4714,12 @@ ps->change_mask.has_title_format_string = 1; } + else if (StrEquals(token, "TopBorder")) + { + S_SET_HAS_NO_TOP_BORDER(SCF(*ps), !on); + S_SET_HAS_NO_TOP_BORDER(SCM(*ps), 1); + S_SET_HAS_NO_TOP_BORDER(SCC(*ps), 1); + } else if (StrEquals(token, "TopTitleRotated")) { S_SET_IS_TOP_TITLE_ROTATED(SCF(*ps), on); @@ -5315,6 +5321,11 @@ { flags->do_redecorate = True; } + + if (S_HAS_NO_TOP_BORDER(SCC(*ret_style))) + { + flags->do_redecorate = True; + } /* has_mwm_border * has_mwm_buttons */ Only in fvwm-patched/fvwm: style.c.orig diff --unified --recursive --text fvwm-2.6.9/fvwm/style.h fvwm-patched/fvwm/style.h --- fvwm-2.6.9/fvwm/style.h 2020-08-21 16:09:27.176711008 -0600 +++ fvwm-patched/fvwm/style.h 2020-08-21 16:10:56.466693390 -0600 @@ -395,6 +395,11 @@ ((c).s.has_slightly_rounded_corners) #define S_SET_HAS_SLIGHTLY_ROUNDED_CORNERS(c,x) \ ((c).s.has_slightly_rounded_corners = !!(x)) +#define S_HAS_NO_TOP_BORDER(c) \ + ((c).s.has_no_top_border) +#define S_SET_HAS_NO_TOP_BORDER(c,x) \ + ((c).s.has_no_top_border = !!(x)) + #define S_DO_EWMH_MINI_ICON_OVERRIDE(c) \ ((c).s.do_ewmh_mini_icon_override) #define S_SET_DO_EWMH_MINI_ICON_OVERRIDE(c,x) \ Only in fvwm-patched/fvwm: style.h.orig diff --unified --recursive --text fvwm-2.6.9/fvwm/window_flags.h fvwm-patched/fvwm/window_flags.h --- fvwm-2.6.9/fvwm/window_flags.h 2020-08-21 16:09:27.176711008 -0600 +++ fvwm-patched/fvwm/window_flags.h 2020-08-21 16:10:56.466693390 -0600 @@ -358,6 +358,12 @@ (fw)->flags.common.s.has_slightly_rounded_corners = !!(x) #define SETM_HAS_SLIGHTLY_ROUNDED_CORNERS(fw,x) \ (fw)->flag_mask.common.s.has_slightly_rounded_corners = !!(x) +#define HAS_NO_TOP_BORDER(fw) \ + ((fw)->flags.common.s.has_no_top_border) +#define SET_HAS_NO_TOP_BORDER(fw,x) \ + (fw)->flags.common.s.has_no_top_border = !!(x) +#define SETM_HAS_NO_TOP_BORDER(fw,x) \ + (fw)->flag_mask.common.s.has_no_top_border = !!(x) /* access to the special flags of a window */ #define DO_REUSE_DESTROYED(fw) \