--- ./style.c.orig 2006-07-17 16:12:11.000000000 +0100 +++ ./style.c 2006-07-19 18:11:00.000000000 +0100 @@ -2758,6 +2758,12 @@ S_SET_DO_IGNORE_RESTACK(SCM(*ps), 1); S_SET_DO_IGNORE_RESTACK(SCC(*ps), 1); } + else if (StrEquals(token, "IconStickyStipples")) + { + S_SET_HAS_ICON_STICKY_STIPPLES(SCF(*ps), on); + S_SET_HAS_ICON_STICKY_STIPPLES(SCM(*ps), 1); + S_SET_HAS_ICON_STICKY_STIPPLES(SCC(*ps), 1); + } else if (StrEquals(token, "IconTitle")) { S_SET_HAS_NO_ICON_TITLE(SCF(*ps), !on); @@ -3537,6 +3543,17 @@ S_SET_IS_STICKY_ACROSS_DESKS(SCM(*ps), 1); S_SET_IS_STICKY_ACROSS_DESKS(SCC(*ps), 1); } + else if (StrEquals(token, "StickyWindowStipples")) + { + S_SET_HAS_STICKY_WINDOW_STIPPLES(SCF(*ps), on); + S_SET_HAS_STICKY_WINDOW_STIPPLES(SCM(*ps), 1); + S_SET_HAS_STICKY_WINDOW_STIPPLES(SCC(*ps), 1); + + S_SET_HAS_STIPPLED_TITLE(SCF(*ps),!on); + S_SET_HAS_STIPPLED_TITLE(SCM(*ps),1); + S_SET_HAS_STIPPLED_TITLE(SCC(*ps),1); + } + else if (StrEquals(token, "Slippery")) { S_SET_IS_STICKY_ACROSS_PAGES(SCF(*ps), !on); --- ./style.h.orig 2006-07-17 16:12:19.000000000 +0100 +++ ./style.h 2006-07-19 13:33:53.000000000 +0100 @@ -227,6 +227,8 @@ ((c).s.has_mwm_override) #define S_SET_HAS_MWM_OVERRIDE(c,x) \ ((c).s.has_mwm_override = !!(x)) +#define S_SET_HAS_ICON_STICKY_STIPPLES(c,x) \ + ((c).s.has_icon_sticky_stipples = !!(x)) #define S_HAS_NO_ICON_TITLE(c) \ ((c).s.has_no_icon_title) #define S_SET_HAS_NO_ICON_TITLE(c,x) \ @@ -239,6 +241,8 @@ ((c).s.has_stippled_title) #define S_SET_HAS_STIPPLED_TITLE(c,x) \ ((c).s.has_stippled_title = !!(x)) +#define S_SET_HAS_STICKY_WINDOW_STIPPLES(c,x) \ + ((c).s.has_sticky_window_stipples = !!(x)) #define S_HAS_WINDOW_FONT(c) \ ((c).has_window_font) #define S_SET_HAS_WINDOW_FONT(c,x) \ --- ./window_flags.h.orig 2006-07-17 16:12:32.000000000 +0100 +++ window_flags.h 2006-07-19 18:03:42.000000000 +0100 @@ -81,6 +81,12 @@ (fw)->flags.common.s.has_stippled_title = !!(x) #define SETM_HAS_STIPPLED_TITLE(fw,x) \ (fw)->flag_mask.common.s.has_stippled_title = !!(x) +#define HAS_STICKY_WINDOW_STIPPLES(fw) \ + ((fw)->flags.common.s.has_sticky_window_stipples) +#define SET_HAS_STICKY_WINDOW_STIPPLES(fw) \ + (fw)->flags.common.s.has_sticky_window_stipples = !!(x) +#define SETM_HAS_STICKY_WINDOW_STIPPLES(fw,x) \ + (fw)->flag_mask.common.s.has_sticky_window_stipples = !!(x) #define ICON_OVERRIDE_MODE(fw) \ ((fw)->flags.common.s.icon_override) #define SET_ICON_OVERRIDE_MODE(fw,x) \ @@ -99,6 +105,12 @@ (fw)->flags.common.s.is_icon_sticky_across_desks = !!(x) #define SETM_ICON_STICKY_ACROSS_DESKS(fw,x) \ (fw)->flag_mask.common.s.is_icon_sticky_across_desks = !!(x) +#define HAS_ICON_STICKY_STIPPLES(fw) \ + ((fw)->flags.common.s.has_icon_sticky_stipples) +#define SET_HAS_ICON_STICKY_STIPPLES(fw) \ + (fw)->flags.common.s.has_icon_sticky_stipples = !!(x) +#define SETM_HAS_ICON_STICKY_STIPPLES(fw,x) \ + (fw)->flag_mask.common.s.has_icon_sticky_stipples = !!(x) #define USE_ICON_POSITION_HINT(fw) \ ((fw)->flags.common.s.use_icon_position_hint) #define SET_USE_ICON_POSITION_HINT(fw,x) \ @@ -728,5 +740,4 @@ (fw)->flag_mask.has_ewmh_init_wm_desktop = (x) #define HAS_EWMH_INIT_WM_DESKTOP(fw) \ ((fw)->flags.has_ewmh_init_wm_desktop) - #endif /* _WINDOW_FLAGS_ */ --- ./fvwm.h.orig 2006-07-17 16:12:40.000000000 +0100 +++ ./fvwm.h 2006-07-19 13:37:14.000000000 +0100 @@ -200,6 +200,8 @@ /* common flags (former flags in bits 0-12) */ unsigned is_sticky_across_pages : 1; unsigned is_sticky_across_desks : 1; + unsigned has_sticky_window_stipples : 1; + unsigned has_icon_sticky_stipples : 1; unsigned has_icon_font : 1; unsigned has_no_border : 1; unsigned has_window_font : 1; @@ -239,6 +241,8 @@ unsigned has_no_icon_title : 1; unsigned has_override_size : 1; unsigned has_stippled_title : 1; + unsigned has_sticky_window_stipples : 1; + unsigned has_icon_sticky_stipples : 1; unsigned icon_override : 2; #define NO_ACTIVE_ICON_OVERRIDE 0 #define ICON_OVERRIDE 1 --- ./borders.c.orig 2006-07-02 22:15:42.000000000 +0100 +++ ./borders.c 2006-07-18 22:26:34.000000000 +0100 @@ -3422,8 +3422,7 @@ int left_length = 0; rotation_t rotation; - if (!IS_STICKY_ACROSS_PAGES(fw) && !IS_STICKY_ACROSS_DESKS(fw) && - !HAS_STIPPLED_TITLE(fw)) + if (!IS_STICKY_ACROSS_PAGES(fw) && !IS_STICKY_ACROSS_DESKS(fw)) { return; } @@ -3454,6 +3453,16 @@ right_length = td->right_main_g.width - td->right_of_text_length - td->right_end_length; } + + /* Thomas Adam -- if the window is sticky either across pages or + * desks and it has a stippled title, but nothing for + * stick_window_stipples, then don't bother drawing them -- just + * return immediately. + */ + if ( (IS_STICKY_ACROSS_PAGES(fw) || IS_STICKY_ACROSS_DESKS(fw)) && + (!HAS_STICKY_WINDOW_STIPPLES(fw) && HAS_STIPPLED_TITLE(fw)) ) + return; + num = (int)(fw->title_thickness / WINDOW_TITLE_STICK_VERT_DIST / 2) * 2 - 1; min = fw->title_thickness / 2 - num * 2 + 1; --- ./icons.c.orig 2006-07-19 01:38:12.000000000 +0100 +++ ./icons.c 2006-07-19 18:11:41.000000000 +0100 @@ -854,8 +854,13 @@ use_unexpanded_size = 0; w_title_text_gap = ICON_TITLE_TEXT_GAP_EXPANDED; x_title_min = w_title_text_gap + relief; + if (is_sticky) { + if (HAS_STICKY_WINDOW_STIPPLES(fw)) + { + return; + } w_stipple = ICON_TITLE_STICK_MIN_WIDTH; x_title_min += w_stipple + ICON_TITLE_TO_STICK_EXTRA_GAP; @@ -957,6 +962,13 @@ r.height = ICON_HEIGHT(fw) - 2*relief; if (is_sticky) { + /* + if (HAS_STICKY_WINDOW_STIPPLES(fw)) + { + return; + } + */ + if (w_stipple == 0) { w_stipple = ((w_title_w - 2 * @@ -1030,7 +1042,7 @@ ICON_HEIGHT(fw) - 2*relief, False); } if (is_sticky) - { + { /* clear the sticky area after the text */ XClearArea( dpy, FW_W_ICON_TITLE(fw), @@ -1081,7 +1093,7 @@ ICON_HEIGHT(fw) - 1, (fw->icon_title_relief > 0)? Relief:Shadow, (fw->icon_title_relief > 0)? Shadow:Relief, relief); - if (is_sticky) + if (is_sticky && HAS_ICON_STICKY_STIPPLES(fw)) { /* an odd number of lines every 4 pixels */ int pseudo_height = ICON_HEIGHT(fw)- 2*relief + 2;