diff --git a/data/rc.xsd b/data/rc.xsd
index 7cdc5900..3c6c47b7 100644
--- a/data/rc.xsd
+++ b/data/rc.xsd
@@ -100,6 +100,7 @@
+
diff --git a/openbox/config.c b/openbox/config.c
index 8c86b973..c43db935 100644
--- a/openbox/config.c
+++ b/openbox/config.c
@@ -35,6 +35,7 @@ ObPlacePolicy config_place_policy;
gchar *config_theme;
gboolean config_theme_keepborder;
+gboolean config_theme_hidedisabled;
gchar *config_title_layout;
@@ -256,6 +257,8 @@ static void parse_theme(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
}
if ((n = parse_find_node("keepBorder", node)))
config_theme_keepborder = parse_bool(doc, n);
+ if ((n = parse_find_node("hideDisabled", node)))
+ config_theme_hidedisabled = parse_bool(doc, n);
}
static void parse_desktops(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
@@ -556,6 +559,7 @@ void config_startup(ObParseInst *i)
config_title_layout = g_strdup("NLIMC");
config_theme_keepborder = TRUE;
+ config_theme_hidedisabled = FALSE;
parse_register(i, "theme", parse_theme, NULL);
diff --git a/openbox/config.h b/openbox/config.h
index b04d06af..5be26ef4 100644
--- a/openbox/config.h
+++ b/openbox/config.h
@@ -84,6 +84,8 @@ extern gchar *config_theme;
/* Show the onepixel border after toggleDecor */
extern gboolean config_theme_keepborder;
+/* Hide window frame buttons that the window doesn't allow */
+extern gboolean config_theme_hidedisabled;
/* Titlebar button layout */
extern gchar *config_title_layout;
diff --git a/openbox/frame.c b/openbox/frame.c
index fcad427b..f390887a 100644
--- a/openbox/frame.c
+++ b/openbox/frame.c
@@ -579,18 +579,24 @@ static void layout_title(ObFrame *self)
break;
case 'D':
if (d) { *lc = ' '; break; }
+ if (!(self->decorations & OB_FRAME_DECOR_ALLDESKTOPS) && config_theme_hidedisabled)
+ break;
d = TRUE;
self->label_width -= (ob_rr_theme->button_size +
ob_rr_theme->padding + 1);
break;
case 'S':
if (s) { *lc = ' '; break; }
+ if (!(self->decorations & OB_FRAME_DECOR_SHADE) && config_theme_hidedisabled)
+ break;
s = TRUE;
self->label_width -= (ob_rr_theme->button_size +
ob_rr_theme->padding + 1);
break;
case 'I':
if (i) { *lc = ' '; break; }
+ if (!(self->decorations & OB_FRAME_DECOR_ICONIFY) && config_theme_hidedisabled)
+ break;
i = TRUE;
self->label_width -= (ob_rr_theme->button_size +
ob_rr_theme->padding + 1);
@@ -601,12 +607,16 @@ static void layout_title(ObFrame *self)
break;
case 'M':
if (m) { *lc = ' '; break; }
+ if (!(self->decorations & OB_FRAME_DECOR_MAXIMIZE) && config_theme_hidedisabled)
+ break;
m = TRUE;
self->label_width -= (ob_rr_theme->button_size +
ob_rr_theme->padding + 1);
break;
case 'C':
if (c) { *lc = ' '; break; }
+ if (!(self->decorations & OB_FRAME_DECOR_CLOSE) && config_theme_hidedisabled)
+ break;
c = TRUE;
self->label_width -= (ob_rr_theme->button_size +
ob_rr_theme->padding + 1);