From 999c375f5342947525813584fbdc92f3b63dced6 Mon Sep 17 00:00:00 2001
From: Christian Hesse <eworm@leda.eworm.de>
Date: Wed, 25 Sep 2013 15:16:57 +0200
Subject: [PATCH 1/1] xfwm4: hide titlebar when maximized

---
 defaults/defaults                          |   1 +
 settings-dialogs/tweaks-settings.c         |   5 +
 settings-dialogs/xfwm4-tweaks-dialog.glade |  25 +-
 settings-dialogs/xfwm4-tweaks-dialog_ui.h  | 612 +++++++++++++++--------------
 src/client.c                               |   6 +
 src/client.h                               |   1 +
 src/display.c                              |   3 +-
 src/display.h                              |   1 +
 src/events.c                               |   5 +
 src/frame.c                                | 366 ++++++++++-------
 src/netwm.c                                |  38 ++
 src/placement.c                            |   4 +-
 src/settings.c                             |   8 +
 src/settings.h                             |   1 +
 14 files changed, 616 insertions(+), 460 deletions(-)

diff --git a/defaults/defaults b/defaults/defaults
index 6db210a..1582fc1 100644
--- a/defaults/defaults
+++ b/defaults/defaults
@@ -1,5 +1,6 @@
 activate_action=bring
 borderless_maximize=true
+titleless_maximize=false
 box_move=false
 box_resize=false
 button_layout=O|SHMC
diff --git a/settings-dialogs/tweaks-settings.c b/settings-dialogs/tweaks-settings.c
index f60b606..2532733 100644
--- a/settings-dialogs/tweaks-settings.c
+++ b/settings-dialogs/tweaks-settings.c
@@ -180,6 +180,7 @@ wm_tweaks_dialog_configure_widgets (GtkBuilder *builder)
     GtkWidget *easy_click_combo_box = GTK_WIDGET (gtk_builder_get_object (builder, "easy_click_combo_box"));
     GtkWidget *raise_with_any_button_check = GTK_WIDGET (gtk_builder_get_object (builder, "raise_with_any_button_check"));
     GtkWidget *borderless_maximize_check = GTK_WIDGET (gtk_builder_get_object (builder, "borderless_maximize_check"));
+    GtkWidget *titleless_maximize_check = GTK_WIDGET (gtk_builder_get_object (builder, "titleless_maximize_check"));
     GtkWidget *restore_on_move_check = GTK_WIDGET (gtk_builder_get_object (builder, "restore_on_move_check"));
     GtkWidget *tile_on_move_check = GTK_WIDGET (gtk_builder_get_object (builder, "tile_on_move_check"));
     GtkWidget *snap_resist_check = GTK_WIDGET (gtk_builder_get_object (builder, "snap_resist_check"));
@@ -336,6 +337,10 @@ wm_tweaks_dialog_configure_widgets (GtkBuilder *builder)
                             G_TYPE_BOOLEAN,
                             (GObject *)borderless_maximize_check, "active");
     xfconf_g_property_bind (xfwm4_channel,
+                            "/general/titleless_maximize",
+                            G_TYPE_BOOLEAN,
+                            (GObject *)titleless_maximize_check, "active");
+    xfconf_g_property_bind (xfwm4_channel,
                             "/general/restore_on_move",
                             G_TYPE_BOOLEAN,
                             (GObject *)restore_on_move_check, "active");
diff --git a/settings-dialogs/xfwm4-tweaks-dialog.glade b/settings-dialogs/xfwm4-tweaks-dialog.glade
index bd2a86f..7d604c6 100644
--- a/settings-dialogs/xfwm4-tweaks-dialog.glade
+++ b/settings-dialogs/xfwm4-tweaks-dialog.glade
@@ -343,6 +343,21 @@ or "skip taskbar" properties set</property>
                   </packing>
                 </child>
                 <child>
+                  <object class="GtkCheckButton" id="titleless_maximize_check">
+                    <property name="label" translatable="yes">Hide _title of windows when maximized</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="use_underline">True</property>
+                    <property name="draw_indicator">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">3</property>
+                  </packing>
+                </child>
+                <child>
                   <object class="GtkCheckButton" id="restore_on_move_check">
                     <property name="label" translatable="yes">Restore original _size of maximized windows when moving</property>
                     <property name="visible">True</property>
@@ -354,7 +369,7 @@ or "skip taskbar" properties set</property>
                   <packing>
                     <property name="expand">False</property>
                     <property name="fill">False</property>
-                    <property name="position">3</property>
+                    <property name="position">4</property>
                   </packing>
                 </child>
                 <child>
@@ -369,7 +384,7 @@ or "skip taskbar" properties set</property>
                   <packing>
                     <property name="expand">False</property>
                     <property name="fill">False</property>
-                    <property name="position">4</property>
+                    <property name="position">5</property>
                   </packing>
                 </child>
                 <child>
@@ -384,7 +399,7 @@ or "skip taskbar" properties set</property>
                   <packing>
                     <property name="expand">False</property>
                     <property name="fill">False</property>
-                    <property name="position">5</property>
+                    <property name="position">6</property>
                   </packing>
                 </child>
                 <child>
@@ -399,7 +414,7 @@ or "skip taskbar" properties set</property>
                   <packing>
                     <property name="expand">False</property>
                     <property name="fill">False</property>
-                    <property name="position">5</property>
+                    <property name="position">7</property>
                   </packing>
                 </child>
                 <child>
@@ -414,7 +429,7 @@ or "skip taskbar" properties set</property>
                   <packing>
                     <property name="expand">False</property>
                     <property name="fill">False</property>
-                    <property name="position">6</property>
+                    <property name="position">8</property>
                   </packing>
                 </child>
               </object>
diff --git a/settings-dialogs/xfwm4-tweaks-dialog_ui.h b/settings-dialogs/xfwm4-tweaks-dialog_ui.h
index a6121dd..8ddbf30 100644
--- a/settings-dialogs/xfwm4-tweaks-dialog_ui.h
+++ b/settings-dialogs/xfwm4-tweaks-dialog_ui.h
@@ -177,332 +177,340 @@ static const char tweaks_dialog_ui[] =
   "y><property name=\"draw_indicator\">True</property></object><packing><p"
   "roperty name=\"expand\">False</property><property name=\"fill\">False</"
   "property><property name=\"position\">2</property></packing></child><chi"
-  "ld><object class=\"GtkCheckButton\" id=\"restore_on_move_check\"><prope"
-  "rty name=\"label\" translatable=\"yes\">Restore original _size of maxim"
-  "ized windows when moving</property><property name=\"visible\">True</pro"
-  "perty><property name=\"can_focus\">True</property><property name=\"rece"
-  "ives_default\">False</property><property name=\"use_underline\">True</p"
-  "roperty><property name=\"draw_indicator\">True</property></object><pack"
-  "ing><property name=\"expand\">False</property><property name=\"fill\">F"
-  "alse</property><property name=\"position\">3</property></packing></chil"
-  "d><child><object class=\"GtkCheckButton\" id=\"tile_on_move_check\"><pr"
-  "operty name=\"label\" translatable=\"yes\">Automatically _tile windows "
-  "when moving toward the screen edge</property><property name=\"visible\""
-  ">True</property><property name=\"can_focus\">True</property><property n"
-  "ame=\"receives_default\">False</property><property name=\"use_underline"
-  "\">True</property><property name=\"draw_indicator\">True</property></ob"
-  "ject><packing><property name=\"expand\">False</property><property name="
-  "\"fill\">False</property><property name=\"position\">4</property></pack"
-  "ing></child><child><object class=\"GtkCheckButton\" id=\"snap_resist_ch"
-  "eck\"><property name=\"label\" translatable=\"yes\">Use _edge resistanc"
-  "e instead of window snapping</property><property name=\"visible\">True<"
-  "/property><property name=\"can_focus\">True</property><property name=\""
-  "receives_default\">False</property><property name=\"use_underline\">Tru"
-  "e</property><property name=\"draw_indicator\">True</property></object><"
-  "packing><property name=\"expand\">False</property><property name=\"fill"
-  "\">False</property><property name=\"position\">5</property></packing></"
-  "child><child><object class=\"GtkCheckButton\" id=\"urgent_blink\"><prop"
-  "erty name=\"label\" translatable=\"yes\">Notify of _urgency by making w"
-  "indow\'s decoration blink</property><property name=\"visible\">True</pr"
+  "ld><object class=\"GtkCheckButton\" id=\"titleless_maximize_check\"><pr"
+  "operty name=\"label\" translatable=\"yes\">Hide _title of windows when "
+  "maximized</property><property name=\"visible\">True</property><property"
+  " name=\"can_focus\">True</property><property name=\"receives_default\">"
+  "False</property><property name=\"use_underline\">True</property><proper"
+  "ty name=\"draw_indicator\">True</property></object><packing><property n"
+  "ame=\"expand\">False</property><property name=\"fill\">False</property>"
+  "<property name=\"position\">3</property></packing></child><child><objec"
+  "t class=\"GtkCheckButton\" id=\"restore_on_move_check\"><property name="
+  "\"label\" translatable=\"yes\">Restore original _size of maximized wind"
+  "ows when moving</property><property name=\"visible\">True</property><pr"
+  "operty name=\"can_focus\">True</property><property name=\"receives_defa"
+  "ult\">False</property><property name=\"use_underline\">True</property><"
+  "property name=\"draw_indicator\">True</property></object><packing><prop"
+  "erty name=\"expand\">False</property><property name=\"fill\">False</pro"
+  "perty><property name=\"position\">4</property></packing></child><child>"
+  "<object class=\"GtkCheckButton\" id=\"tile_on_move_check\"><property na"
+  "me=\"label\" translatable=\"yes\">Automatically _tile windows when movi"
+  "ng toward the screen edge</property><property name=\"visible\">True</pr"
   "operty><property name=\"can_focus\">True</property><property name=\"rec"
   "eives_default\">False</property><property name=\"use_underline\">True</"
   "property><property name=\"draw_indicator\">True</property></object><pac"
   "king><property name=\"expand\">False</property><property name=\"fill\">"
   "False</property><property name=\"position\">5</property></packing></chi"
-  "ld><child><object class=\"GtkCheckButton\" id=\"repeat_urgent_blink\"><"
-  "property name=\"label\" translatable=\"yes\">Keep urgent windows _blink"
-  "ing repeatedly</property><property name=\"visible\">True</property><pro"
+  "ld><child><object class=\"GtkCheckButton\" id=\"snap_resist_check\"><pr"
+  "operty name=\"label\" translatable=\"yes\">Use _edge resistance instead"
+  " of window snapping</property><property name=\"visible\">True</property"
+  "><property name=\"can_focus\">True</property><property name=\"receives_"
+  "default\">False</property><property name=\"use_underline\">True</proper"
+  "ty><property name=\"draw_indicator\">True</property></object><packing><"
+  "property name=\"expand\">False</property><property name=\"fill\">False<"
+  "/property><property name=\"position\">6</property></packing></child><ch"
+  "ild><object class=\"GtkCheckButton\" id=\"urgent_blink\"><property name"
+  "=\"label\" translatable=\"yes\">Notify of _urgency by making window\'s "
+  "decoration blink</property><property name=\"visible\">True</property><p"
+  "roperty name=\"can_focus\">True</property><property name=\"receives_def"
+  "ault\">False</property><property name=\"use_underline\">True</property>"
+  "<property name=\"draw_indicator\">True</property></object><packing><pro"
+  "perty name=\"expand\">False</property><property name=\"fill\">False</pr"
+  "operty><property name=\"position\">7</property></packing></child><child"
+  "><object class=\"GtkCheckButton\" id=\"repeat_urgent_blink\"><property "
+  "name=\"label\" translatable=\"yes\">Keep urgent windows _blinking repea"
+  "tedly</property><property name=\"visible\">True</property><property nam"
+  "e=\"can_focus\">True</property><property name=\"receives_default\">Fals"
+  "e</property><property name=\"use_underline\">True</property><property n"
+  "ame=\"draw_indicator\">True</property></object><packing><property name="
+  "\"expand\">False</property><property name=\"fill\">False</property><pro"
+  "perty name=\"position\">8</property></packing></child></object><packing"
+  "><property name=\"position\">2</property></packing></child><child type="
+  "\"tab\"><object class=\"GtkLabel\" id=\"label3\"><property name=\"visib"
+  "le\">True</property><property name=\"label\" translatable=\"yes\">_Acce"
+  "ssibility</property><property name=\"use_underline\">True</property></o"
+  "bject><packing><property name=\"position\">2</property><property name=\""
+  "tab_fill\">False</property></packing></child><child><object class=\"Gtk"
+  "VBox\" id=\"vbox5\"><property name=\"visible\">True</property><property"
+  " name=\"border_width\">12</property><property name=\"orientation\">vert"
+  "ical</property><property name=\"spacing\">6</property><child><object cl"
+  "ass=\"GtkCheckButton\" id=\"scroll_workspaces_check\"><property name=\""
+  "label\" translatable=\"yes\">Use the _mouse wheel on the desktop to swi"
+  "tch workspaces</property><property name=\"visible\">True</property><pro"
   "perty name=\"can_focus\">True</property><property name=\"receives_defau"
   "lt\">False</property><property name=\"use_underline\">True</property><p"
   "roperty name=\"draw_indicator\">True</property></object><packing><prope"
   "rty name=\"expand\">False</property><property name=\"fill\">False</prop"
-  "erty><property name=\"position\">6</property></packing></child></object"
-  "><packing><property name=\"position\">2</property></packing></child><ch"
-  "ild type=\"tab\"><object class=\"GtkLabel\" id=\"label3\"><property nam"
-  "e=\"visible\">True</property><property name=\"label\" translatable=\"ye"
-  "s\">_Accessibility</property><property name=\"use_underline\">True</pro"
-  "perty></object><packing><property name=\"position\">2</property><proper"
-  "ty name=\"tab_fill\">False</property></packing></child><child><object c"
-  "lass=\"GtkVBox\" id=\"vbox5\"><property name=\"visible\">True</property"
-  "><property name=\"border_width\">12</property><property name=\"orientat"
-  "ion\">vertical</property><property name=\"spacing\">6</property><child>"
-  "<object class=\"GtkCheckButton\" id=\"scroll_workspaces_check\"><proper"
-  "ty name=\"label\" translatable=\"yes\">Use the _mouse wheel on the desk"
-  "top to switch workspaces</property><property name=\"visible\">True</pro"
-  "perty><property name=\"can_focus\">True</property><property name=\"rece"
-  "ives_default\">False</property><property name=\"use_underline\">True</p"
-  "roperty><property name=\"draw_indicator\">True</property></object><pack"
-  "ing><property name=\"expand\">False</property><property name=\"fill\">F"
-  "alse</property><property name=\"position\">0</property></packing></chil"
-  "d><child><object class=\"GtkCheckButton\" id=\"toggle_workspaces_check\""
-  "><property name=\"label\" translatable=\"yes\">_Remember and recall pre"
-  "vious workspace\nwhen switching via keyboard shortcuts</property><prope"
-  "rty name=\"visible\">True</property><property name=\"can_focus\">True</"
-  "property><property name=\"receives_default\">False</property><property "
-  "name=\"use_underline\">True</property><property name=\"draw_indicator\""
-  ">True</property></object><packing><property name=\"expand\">False</prop"
-  "erty><property name=\"fill\">False</property><property name=\"position\""
-  ">1</property></packing></child><child><object class=\"GtkCheckButton\" "
-  "id=\"wrap_layout_check\"><property name=\"label\" translatable=\"yes\">"
-  "Wrap workspaces depending on the actual desktop _layout</property><prop"
-  "erty name=\"visible\">True</property><property name=\"can_focus\">True<"
-  "/property><property name=\"receives_default\">False</property><property"
-  " name=\"use_underline\">True</property><property name=\"draw_indicator\""
-  ">True</property></object><packing><property name=\"expand\">False</prop"
-  "erty><property name=\"fill\">False</property><property name=\"position\""
-  ">2</property></packing></child><child><object class=\"GtkCheckButton\" "
-  "id=\"wrap_cycle_check\"><property name=\"label\" translatable=\"yes\">W"
-  "rap workspaces when the _first or the last workspace is reached</proper"
-  "ty><property name=\"visible\">True</property><property name=\"can_focus"
-  "\">True</property><property name=\"receives_default\">False</property><"
-  "property name=\"use_underline\">True</property><property name=\"draw_in"
-  "dicator\">True</property></object><packing><property name=\"expand\">Fa"
-  "lse</property><property name=\"fill\">False</property><property name=\""
-  "position\">3</property></packing></child></object><packing><property na"
-  "me=\"position\">3</property></packing></child><child type=\"tab\"><obje"
-  "ct class=\"GtkLabel\" id=\"label4\"><property name=\"visible\">True</pr"
-  "operty><property name=\"label\" translatable=\"yes\">_Workspaces</prope"
-  "rty><property name=\"use_underline\">True</property></object><packing><"
-  "property name=\"position\">3</property><property name=\"tab_fill\">Fals"
-  "e</property></packing></child><child><object class=\"GtkVBox\" id=\"vbo"
-  "x6\"><property name=\"visible\">True</property><property name=\"border_"
-  "width\">12</property><property name=\"orientation\">vertical</property>"
-  "<property name=\"spacing\">6</property><child><object class=\"GtkLabel\""
-  " id=\"label8\"><property name=\"visible\">True</property><property name"
-  "=\"xalign\">0</property><property name=\"label\" translatable=\"yes\">_"
-  "Minimum size of windows to trigger smart placement:</property><property"
-  " name=\"use_underline\">True</property><property name=\"mnemonic_widget"
-  "\">placement_ratio_scale</property></object><packing><property name=\"e"
-  "xpand\">False</property><property name=\"fill\">False</property><proper"
-  "ty name=\"position\">0</property></packing></child><child><object class"
-  "=\"GtkAlignment\" id=\"alignment4\"><property name=\"visible\">True</pr"
-  "operty><property name=\"bottom_padding\">6</property><property name=\"l"
-  "eft_padding\">12</property><child><object class=\"GtkHBox\" id=\"hbox2\""
-  "><property name=\"visible\">True</property><property name=\"spacing\">1"
-  "2</property><child><object class=\"GtkLabel\" id=\"label9\"><property n"
-  "ame=\"visible\">True</property><property name=\"label\" translatable=\""
-  "yes\" comments=\"Smart placement size\">&lt;i&gt;Small&lt;/i&gt;</prope"
-  "rty><property name=\"use_markup\">True</property></object><packing><pro"
-  "perty name=\"expand\">False</property><property name=\"fill\">False</pr"
-  "operty><property name=\"position\">0</property></packing></child><child"
-  "><object class=\"GtkHScale\" id=\"placement_ratio_scale\"><property nam"
-  "e=\"visible\">True</property><property name=\"can_focus\">True</propert"
-  "y><property name=\"adjustment\">adjustment1</property><property name=\""
-  "restrict_to_fill_level\">False</property><property name=\"draw_value\">"
-  "False</property></object><packing><property name=\"position\">1</proper"
-  "ty></packing></child><child><object class=\"GtkLabel\" id=\"label10\"><"
-  "property name=\"visible\">True</property><property name=\"label\" trans"
-  "latable=\"yes\" comments=\"Smart placement size\">&lt;i&gt;Large&lt;/i&"
-  "gt;</property><property name=\"use_markup\">True</property></object><pa"
-  "cking><property name=\"expand\">False</property><property name=\"positi"
-  "on\">2</property></packing></child></object></child></object><packing><"
-  "property name=\"expand\">False</property><property name=\"fill\">False<"
-  "/property><property name=\"position\">1</property></packing></child><ch"
-  "ild><object class=\"GtkVBox\" id=\"default_placement_box\"><property na"
-  "me=\"visible\">True</property><property name=\"orientation\">vertical</"
-  "property><property name=\"spacing\">6</property><child><object class=\""
-  "GtkLabel\" id=\"label27\"><property name=\"visible\">True</property><pr"
-  "operty name=\"xalign\">0</property><property name=\"label\" translatabl"
-  "e=\"yes\">By default, place windows:</property></object><packing><prope"
-  "rty name=\"position\">0</property></packing></child><child><object clas"
-  "s=\"GtkAlignment\" id=\"alignment10\"><property name=\"visible\">True</"
-  "property><property name=\"bottom_padding\">6</property><property name=\""
-  "left_padding\">12</property><child><object class=\"GtkVBox\" id=\"vbox1"
-  "8\"><property name=\"visible\">True</property><property name=\"border_w"
-  "idth\">6</property><property name=\"orientation\">vertical</property><p"
-  "roperty name=\"spacing\">6</property><child><object class=\"GtkRadioBut"
-  "ton\" id=\"placement_center_option\"><property name=\"label\" translata"
-  "ble=\"yes\">At the _center of the screen</property><property name=\"vis"
-  "ible\">True</property><property name=\"can_focus\">True</property><prop"
-  "erty name=\"receives_default\">False</property><property name=\"use_und"
-  "erline\">True</property><property name=\"draw_indicator\">True</propert"
-  "y></object><packing><property name=\"position\">0</property></packing><"
-  "/child><child><object class=\"GtkRadioButton\" id=\"placement_mouse_opt"
-  "ion\"><property name=\"label\" translatable=\"yes\">Under the mouse _po"
-  "inter</property><property name=\"visible\">True</property><property nam"
-  "e=\"can_focus\">True</property><property name=\"receives_default\">Fals"
-  "e</property><property name=\"use_underline\">True</property><property n"
-  "ame=\"active\">True</property><property name=\"draw_indicator\">True</p"
-  "roperty><property name=\"group\">placement_center_option</property></ob"
-  "ject><packing><property name=\"position\">1</property></packing></child"
-  "></object></child></object><packing><property name=\"position\">1</prop"
-  "erty></packing></child></object><packing><property name=\"expand\">Fals"
-  "e</property><property name=\"fill\">False</property><property name=\"po"
-  "sition\">2</property></packing></child></object><packing><property name"
-  "=\"position\">4</property></packing></child><child type=\"tab\"><object"
-  " class=\"GtkLabel\" id=\"label5\"><property name=\"visible\">True</prop"
-  "erty><property name=\"label\" translatable=\"yes\">_Placement</property"
-  "><property name=\"use_underline\">True</property></object><packing><pro"
-  "perty name=\"position\">4</property><property name=\"tab_fill\">False</"
-  "property></packing></child><child><object class=\"GtkVBox\" id=\"vbox7\""
-  "><property name=\"visible\">True</property><property name=\"border_widt"
-  "h\">12</property><property name=\"orientation\">vertical</property><pro"
-  "perty name=\"spacing\">6</property><child><object class=\"GtkCheckButto"
-  "n\" id=\"use_compositing_check\"><property name=\"label\" translatable="
-  "\"yes\">_Enable display compositing</property><property name=\"visible\""
-  ">True</property><property name=\"can_focus\">True</property><property n"
-  "ame=\"receives_default\">False</property><property name=\"use_underline"
-  "\">True</property><property name=\"draw_indicator\">True</property></ob"
-  "ject><packing><property name=\"expand\">False</property><property name="
-  "\"fill\">False</property><property name=\"position\">0</property></pack"
-  "ing></child><child><object class=\"GtkScrolledWindow\" id=\"use_composi"
-  "ting_box\"><property name=\"visible\">True</property><property name=\"s"
-  "ensitive\">False</property><property name=\"can_focus\">True</property>"
-  "<property name=\"hscrollbar_policy\">never</property><property name=\"v"
-  "scrollbar_policy\">automatic</property><child><object class=\"GtkViewpo"
-  "rt\" id=\"viewport1\"><property name=\"visible\">True</property><proper"
-  "ty name=\"resize_mode\">queue</property><property name=\"shadow_type\">"
-  "none</property><child><object class=\"GtkAlignment\" id=\"alignment3\">"
-  "<property name=\"visible\">True</property><property name=\"bottom_paddi"
-  "ng\">6</property><property name=\"left_padding\">12</property><child><o"
-  "bject class=\"GtkVBox\" id=\"vbox8\"><property name=\"visible\">True</p"
-  "roperty><property name=\"orientation\">vertical</property><property nam"
-  "e=\"spacing\">6</property><child><object class=\"GtkCheckButton\" id=\""
-  "unredirect_overlays_check\"><property name=\"label\" translatable=\"yes"
-  "\">Display _fullscreen overlay windows directly</property><property nam"
+  "erty><property name=\"position\">0</property></packing></child><child><"
+  "object class=\"GtkCheckButton\" id=\"toggle_workspaces_check\"><propert"
+  "y name=\"label\" translatable=\"yes\">_Remember and recall previous wor"
+  "kspace\nwhen switching via keyboard shortcuts</property><property name="
+  "\"visible\">True</property><property name=\"can_focus\">True</property>"
+  "<property name=\"receives_default\">False</property><property name=\"us"
+  "e_underline\">True</property><property name=\"draw_indicator\">True</pr"
+  "operty></object><packing><property name=\"expand\">False</property><pro"
+  "perty name=\"fill\">False</property><property name=\"position\">1</prop"
+  "erty></packing></child><child><object class=\"GtkCheckButton\" id=\"wra"
+  "p_layout_check\"><property name=\"label\" translatable=\"yes\">Wrap wor"
+  "kspaces depending on the actual desktop _layout</property><property nam"
   "e=\"visible\">True</property><property name=\"can_focus\">True</propert"
   "y><property name=\"receives_default\">False</property><property name=\""
   "use_underline\">True</property><property name=\"draw_indicator\">True</"
   "property></object><packing><property name=\"expand\">False</property><p"
-  "roperty name=\"position\">0</property></packing></child><child><object "
-  "class=\"GtkCheckButton\" id=\"show_frame_shadow_check\"><property name="
-  "\"label\" translatable=\"yes\">Show shadows under _regular windows</pro"
-  "perty><property name=\"visible\">True</property><property name=\"can_fo"
-  "cus\">True</property><property name=\"receives_default\">False</propert"
-  "y><property name=\"use_underline\">True</property><property name=\"draw"
-  "_indicator\">True</property></object><packing><property name=\"expand\""
-  ">False</property><property name=\"position\">1</property></packing></ch"
-  "ild><child><object class=\"GtkCheckButton\" id=\"show_popup_shadow_chec"
-  "k\"><property name=\"label\" translatable=\"yes\">Show shadows under po"
-  "p_up windows</property><property name=\"visible\">True</property><prope"
-  "rty name=\"can_focus\">True</property><property name=\"receives_default"
-  "\">False</property><property name=\"use_underline\">True</property><pro"
-  "perty name=\"draw_indicator\">True</property></object><packing><propert"
-  "y name=\"expand\">False</property><property name=\"position\">2</proper"
-  "ty></packing></child><child><object class=\"GtkCheckButton\" id=\"show_"
-  "dock_shadow_check\"><property name=\"label\" translatable=\"yes\">Show "
-  "shadows under _dock windows</property><property name=\"visible\">True</"
-  "property><property name=\"can_focus\">True</property><property name=\"r"
-  "eceives_default\">False</property><property name=\"use_underline\">True"
-  "</property><property name=\"draw_indicator\">True</property></object><p"
-  "acking><property name=\"expand\">False</property><property name=\"posit"
-  "ion\">3</property></packing></child><child><object class=\"GtkLabel\" i"
-  "d=\"label12\"><property name=\"visible\">True</property><property name="
-  "\"xalign\">0</property><property name=\"label\" translatable=\"yes\">Op"
-  "aci_ty of window decorations:</property><property name=\"use_underline\""
-  ">True</property><property name=\"mnemonic_widget\">frame_opacity_scale<"
-  "/property></object><packing><property name=\"expand\">False</property><"
-  "property name=\"position\">4</property></packing></child><child><object"
-  " class=\"GtkAlignment\" id=\"alignment5\"><property name=\"visible\">Tr"
-  "ue</property><property name=\"top_padding\">2</property><property name="
-  "\"left_padding\">12</property><child><object class=\"GtkHBox\" id=\"hbo"
-  "x3\"><property name=\"visible\">True</property><child><object class=\"G"
-  "tkLabel\" id=\"label17\"><property name=\"visible\">True</property><pro"
-  "perty name=\"label\" translatable=\"yes\">&lt;i&gt;Transparent&lt;/i&gt"
-  ";</property><property name=\"use_markup\">True</property></object><pack"
-  "ing><property name=\"expand\">False</property><property name=\"fill\">F"
-  "alse</property><property name=\"position\">0</property></packing></chil"
-  "d><child><object class=\"GtkHScale\" id=\"frame_opacity_scale\"><proper"
+  "roperty name=\"fill\">False</property><property name=\"position\">2</pr"
+  "operty></packing></child><child><object class=\"GtkCheckButton\" id=\"w"
+  "rap_cycle_check\"><property name=\"label\" translatable=\"yes\">Wrap wo"
+  "rkspaces when the _first or the last workspace is reached</property><pr"
+  "operty name=\"visible\">True</property><property name=\"can_focus\">Tru"
+  "e</property><property name=\"receives_default\">False</property><proper"
+  "ty name=\"use_underline\">True</property><property name=\"draw_indicato"
+  "r\">True</property></object><packing><property name=\"expand\">False</p"
+  "roperty><property name=\"fill\">False</property><property name=\"positi"
+  "on\">3</property></packing></child></object><packing><property name=\"p"
+  "osition\">3</property></packing></child><child type=\"tab\"><object cla"
+  "ss=\"GtkLabel\" id=\"label4\"><property name=\"visible\">True</property"
+  "><property name=\"label\" translatable=\"yes\">_Workspaces</property><p"
+  "roperty name=\"use_underline\">True</property></object><packing><proper"
+  "ty name=\"position\">3</property><property name=\"tab_fill\">False</pro"
+  "perty></packing></child><child><object class=\"GtkVBox\" id=\"vbox6\"><"
+  "property name=\"visible\">True</property><property name=\"border_width\""
+  ">12</property><property name=\"orientation\">vertical</property><proper"
+  "ty name=\"spacing\">6</property><child><object class=\"GtkLabel\" id=\""
+  "label8\"><property name=\"visible\">True</property><property name=\"xal"
+  "ign\">0</property><property name=\"label\" translatable=\"yes\">_Minimu"
+  "m size of windows to trigger smart placement:</property><property name="
+  "\"use_underline\">True</property><property name=\"mnemonic_widget\">pla"
+  "cement_ratio_scale</property></object><packing><property name=\"expand\""
+  ">False</property><property name=\"fill\">False</property><property name"
+  "=\"position\">0</property></packing></child><child><object class=\"GtkA"
+  "lignment\" id=\"alignment4\"><property name=\"visible\">True</property>"
+  "<property name=\"bottom_padding\">6</property><property name=\"left_pad"
+  "ding\">12</property><child><object class=\"GtkHBox\" id=\"hbox2\"><prop"
+  "erty name=\"visible\">True</property><property name=\"spacing\">12</pro"
+  "perty><child><object class=\"GtkLabel\" id=\"label9\"><property name=\""
+  "visible\">True</property><property name=\"label\" translatable=\"yes\" "
+  "comments=\"Smart placement size\">&lt;i&gt;Small&lt;/i&gt;</property><p"
+  "roperty name=\"use_markup\">True</property></object><packing><property "
+  "name=\"expand\">False</property><property name=\"fill\">False</property"
+  "><property name=\"position\">0</property></packing></child><child><obje"
+  "ct class=\"GtkHScale\" id=\"placement_ratio_scale\"><property name=\"vi"
+  "sible\">True</property><property name=\"can_focus\">True</property><pro"
+  "perty name=\"adjustment\">adjustment1</property><property name=\"restri"
+  "ct_to_fill_level\">False</property><property name=\"draw_value\">False<"
+  "/property></object><packing><property name=\"position\">1</property></p"
+  "acking></child><child><object class=\"GtkLabel\" id=\"label10\"><proper"
+  "ty name=\"visible\">True</property><property name=\"label\" translatabl"
+  "e=\"yes\" comments=\"Smart placement size\">&lt;i&gt;Large&lt;/i&gt;</p"
+  "roperty><property name=\"use_markup\">True</property></object><packing>"
+  "<property name=\"expand\">False</property><property name=\"position\">2"
+  "</property></packing></child></object></child></object><packing><proper"
+  "ty name=\"expand\">False</property><property name=\"fill\">False</prope"
+  "rty><property name=\"position\">1</property></packing></child><child><o"
+  "bject class=\"GtkVBox\" id=\"default_placement_box\"><property name=\"v"
+  "isible\">True</property><property name=\"orientation\">vertical</proper"
+  "ty><property name=\"spacing\">6</property><child><object class=\"GtkLab"
+  "el\" id=\"label27\"><property name=\"visible\">True</property><property"
+  " name=\"xalign\">0</property><property name=\"label\" translatable=\"ye"
+  "s\">By default, place windows:</property></object><packing><property na"
+  "me=\"position\">0</property></packing></child><child><object class=\"Gt"
+  "kAlignment\" id=\"alignment10\"><property name=\"visible\">True</proper"
+  "ty><property name=\"bottom_padding\">6</property><property name=\"left_"
+  "padding\">12</property><child><object class=\"GtkVBox\" id=\"vbox18\"><"
+  "property name=\"visible\">True</property><property name=\"border_width\""
+  ">6</property><property name=\"orientation\">vertical</property><propert"
+  "y name=\"spacing\">6</property><child><object class=\"GtkRadioButton\" "
+  "id=\"placement_center_option\"><property name=\"label\" translatable=\""
+  "yes\">At the _center of the screen</property><property name=\"visible\""
+  ">True</property><property name=\"can_focus\">True</property><property n"
+  "ame=\"receives_default\">False</property><property name=\"use_underline"
+  "\">True</property><property name=\"draw_indicator\">True</property></ob"
+  "ject><packing><property name=\"position\">0</property></packing></child"
+  "><child><object class=\"GtkRadioButton\" id=\"placement_mouse_option\">"
+  "<property name=\"label\" translatable=\"yes\">Under the mouse _pointer<"
+  "/property><property name=\"visible\">True</property><property name=\"ca"
+  "n_focus\">True</property><property name=\"receives_default\">False</pro"
+  "perty><property name=\"use_underline\">True</property><property name=\""
+  "active\">True</property><property name=\"draw_indicator\">True</propert"
+  "y><property name=\"group\">placement_center_option</property></object><"
+  "packing><property name=\"position\">1</property></packing></child></obj"
+  "ect></child></object><packing><property name=\"position\">1</property><"
+  "/packing></child></object><packing><property name=\"expand\">False</pro"
+  "perty><property name=\"fill\">False</property><property name=\"position"
+  "\">2</property></packing></child></object><packing><property name=\"pos"
+  "ition\">4</property></packing></child><child type=\"tab\"><object class"
+  "=\"GtkLabel\" id=\"label5\"><property name=\"visible\">True</property><"
+  "property name=\"label\" translatable=\"yes\">_Placement</property><prop"
+  "erty name=\"use_underline\">True</property></object><packing><property "
+  "name=\"position\">4</property><property name=\"tab_fill\">False</proper"
+  "ty></packing></child><child><object class=\"GtkVBox\" id=\"vbox7\"><pro"
+  "perty name=\"visible\">True</property><property name=\"border_width\">1"
+  "2</property><property name=\"orientation\">vertical</property><property"
+  " name=\"spacing\">6</property><child><object class=\"GtkCheckButton\" i"
+  "d=\"use_compositing_check\"><property name=\"label\" translatable=\"yes"
+  "\">_Enable display compositing</property><property name=\"visible\">Tru"
+  "e</property><property name=\"can_focus\">True</property><property name="
+  "\"receives_default\">False</property><property name=\"use_underline\">T"
+  "rue</property><property name=\"draw_indicator\">True</property></object"
+  "><packing><property name=\"expand\">False</property><property name=\"fi"
+  "ll\">False</property><property name=\"position\">0</property></packing>"
+  "</child><child><object class=\"GtkScrolledWindow\" id=\"use_compositing"
+  "_box\"><property name=\"visible\">True</property><property name=\"sensi"
+  "tive\">False</property><property name=\"can_focus\">True</property><pro"
+  "perty name=\"hscrollbar_policy\">never</property><property name=\"vscro"
+  "llbar_policy\">automatic</property><child><object class=\"GtkViewport\""
+  " id=\"viewport1\"><property name=\"visible\">True</property><property n"
+  "ame=\"resize_mode\">queue</property><property name=\"shadow_type\">none"
+  "</property><child><object class=\"GtkAlignment\" id=\"alignment3\"><pro"
+  "perty name=\"visible\">True</property><property name=\"bottom_padding\""
+  ">6</property><property name=\"left_padding\">12</property><child><objec"
+  "t class=\"GtkVBox\" id=\"vbox8\"><property name=\"visible\">True</prope"
+  "rty><property name=\"orientation\">vertical</property><property name=\""
+  "spacing\">6</property><child><object class=\"GtkCheckButton\" id=\"unre"
+  "direct_overlays_check\"><property name=\"label\" translatable=\"yes\">D"
+  "isplay _fullscreen overlay windows directly</property><property name=\""
+  "visible\">True</property><property name=\"can_focus\">True</property><p"
+  "roperty name=\"receives_default\">False</property><property name=\"use_"
+  "underline\">True</property><property name=\"draw_indicator\">True</prop"
+  "erty></object><packing><property name=\"expand\">False</property><prope"
+  "rty name=\"position\">0</property></packing></child><child><object clas"
+  "s=\"GtkCheckButton\" id=\"show_frame_shadow_check\"><property name=\"la"
+  "bel\" translatable=\"yes\">Show shadows under _regular windows</propert"
+  "y><property name=\"visible\">True</property><property name=\"can_focus\""
+  ">True</property><property name=\"receives_default\">False</property><pr"
+  "operty name=\"use_underline\">True</property><property name=\"draw_indi"
+  "cator\">True</property></object><packing><property name=\"expand\">Fals"
+  "e</property><property name=\"position\">1</property></packing></child><"
+  "child><object class=\"GtkCheckButton\" id=\"show_popup_shadow_check\"><"
+  "property name=\"label\" translatable=\"yes\">Show shadows under pop_up "
+  "windows</property><property name=\"visible\">True</property><property n"
+  "ame=\"can_focus\">True</property><property name=\"receives_default\">Fa"
+  "lse</property><property name=\"use_underline\">True</property><property"
+  " name=\"draw_indicator\">True</property></object><packing><property nam"
+  "e=\"expand\">False</property><property name=\"position\">2</property></"
+  "packing></child><child><object class=\"GtkCheckButton\" id=\"show_dock_"
+  "shadow_check\"><property name=\"label\" translatable=\"yes\">Show shado"
+  "ws under _dock windows</property><property name=\"visible\">True</prope"
+  "rty><property name=\"can_focus\">True</property><property name=\"receiv"
+  "es_default\">False</property><property name=\"use_underline\">True</pro"
+  "perty><property name=\"draw_indicator\">True</property></object><packin"
+  "g><property name=\"expand\">False</property><property name=\"position\""
+  ">3</property></packing></child><child><object class=\"GtkLabel\" id=\"l"
+  "abel12\"><property name=\"visible\">True</property><property name=\"xal"
+  "ign\">0</property><property name=\"label\" translatable=\"yes\">Opaci_t"
+  "y of window decorations:</property><property name=\"use_underline\">Tru"
+  "e</property><property name=\"mnemonic_widget\">frame_opacity_scale</pro"
+  "perty></object><packing><property name=\"expand\">False</property><prop"
+  "erty name=\"position\">4</property></packing></child><child><object cla"
+  "ss=\"GtkAlignment\" id=\"alignment5\"><property name=\"visible\">True</"
+  "property><property name=\"top_padding\">2</property><property name=\"le"
+  "ft_padding\">12</property><child><object class=\"GtkHBox\" id=\"hbox3\""
+  "><property name=\"visible\">True</property><child><object class=\"GtkLa"
+  "bel\" id=\"label17\"><property name=\"visible\">True</property><propert"
+  "y name=\"label\" translatable=\"yes\">&lt;i&gt;Transparent&lt;/i&gt;</p"
+  "roperty><property name=\"use_markup\">True</property></object><packing>"
+  "<property name=\"expand\">False</property><property name=\"fill\">False"
+  "</property><property name=\"position\">0</property></packing></child><c"
+  "hild><object class=\"GtkHScale\" id=\"frame_opacity_scale\"><property n"
+  "ame=\"visible\">True</property><property name=\"can_focus\">True</prope"
+  "rty><property name=\"update_policy\">discontinuous</property><property "
+  "name=\"adjustment\">adjustment2</property><property name=\"restrict_to_"
+  "fill_level\">False</property><property name=\"draw_value\">False</prope"
+  "rty></object><packing><property name=\"position\">1</property></packing"
+  "></child><child><object class=\"GtkLabel\" id=\"label18\"><property nam"
+  "e=\"visible\">True</property><property name=\"label\" translatable=\"ye"
+  "s\">&lt;i&gt;Opaque&lt;/i&gt;</property><property name=\"use_markup\">T"
+  "rue</property></object><packing><property name=\"expand\">False</proper"
+  "ty><property name=\"fill\">False</property><property name=\"position\">"
+  "2</property></packing></child></object></child></object><packing><prope"
+  "rty name=\"expand\">False</property><property name=\"fill\">False</prop"
+  "erty><property name=\"position\">5</property></packing></child><child><"
+  "object class=\"GtkLabel\" id=\"label13\"><property name=\"visible\">Tru"
+  "e</property><property name=\"xalign\">0</property><property name=\"labe"
+  "l\" translatable=\"yes\">Opacity of _inactive windows:</property><prope"
+  "rty name=\"use_underline\">True</property><property name=\"mnemonic_wid"
+  "get\">inactive_opacity_scale</property></object><packing><property name"
+  "=\"expand\">False</property><property name=\"fill\">False</property><pr"
+  "operty name=\"position\">6</property></packing></child><child><object c"
+  "lass=\"GtkAlignment\" id=\"alignment6\"><property name=\"visible\">True"
+  "</property><property name=\"top_padding\">2</property><property name=\""
+  "left_padding\">12</property><child><object class=\"GtkHBox\" id=\"hbox4"
+  "\"><property name=\"visible\">True</property><child><object class=\"Gtk"
+  "Label\" id=\"label19\"><property name=\"visible\">True</property><prope"
+  "rty name=\"label\" translatable=\"yes\">&lt;i&gt;Transparent&lt;/i&gt;<"
+  "/property><property name=\"use_markup\">True</property></object><packin"
+  "g><property name=\"expand\">False</property><property name=\"fill\">Fal"
+  "se</property><property name=\"position\">0</property></packing></child>"
+  "<child><object class=\"GtkHScale\" id=\"inactive_opacity_scale\"><prope"
+  "rty name=\"visible\">True</property><property name=\"can_focus\">True</"
+  "property><property name=\"update_policy\">discontinuous</property><prop"
+  "erty name=\"adjustment\">adjustment3</property><property name=\"restric"
+  "t_to_fill_level\">False</property><property name=\"draw_value\">False</"
+  "property></object><packing><property name=\"position\">1</property></pa"
+  "cking></child><child><object class=\"GtkLabel\" id=\"label20\"><propert"
+  "y name=\"visible\">True</property><property name=\"label\" translatable"
+  "=\"yes\">&lt;i&gt;Opaque&lt;/i&gt;</property><property name=\"use_marku"
+  "p\">True</property></object><packing><property name=\"expand\">False</p"
+  "roperty><property name=\"fill\">False</property><property name=\"positi"
+  "on\">2</property></packing></child></object></child></object><packing><"
+  "property name=\"expand\">False</property><property name=\"fill\">False<"
+  "/property><property name=\"position\">7</property></packing></child><ch"
+  "ild><object class=\"GtkLabel\" id=\"label14\"><property name=\"visible\""
+  ">True</property><property name=\"xalign\">0</property><property name=\""
+  "label\" translatable=\"yes\">Opacity of windows during _move:</property"
+  "><property name=\"use_underline\">True</property><property name=\"mnemo"
+  "nic_widget\">move_opacity_scale</property></object><packing><property n"
+  "ame=\"expand\">False</property><property name=\"fill\">False</property>"
+  "<property name=\"position\">8</property></packing></child><child><objec"
+  "t class=\"GtkAlignment\" id=\"alignment7\"><property name=\"visible\">T"
+  "rue</property><property name=\"top_padding\">2</property><property name"
+  "=\"left_padding\">12</property><child><object class=\"GtkHBox\" id=\"hb"
+  "ox5\"><property name=\"visible\">True</property><child><object class=\""
+  "GtkLabel\" id=\"label21\"><property name=\"visible\">True</property><pr"
+  "operty name=\"label\" translatable=\"yes\">&lt;i&gt;Transparent&lt;/i&g"
+  "t;</property><property name=\"use_markup\">True</property></object><pac"
+  "king><property name=\"expand\">False</property><property name=\"fill\">"
+  "False</property><property name=\"position\">0</property></packing></chi"
+  "ld><child><object class=\"GtkHScale\" id=\"move_opacity_scale\"><proper"
   "ty name=\"visible\">True</property><property name=\"can_focus\">True</p"
   "roperty><property name=\"update_policy\">discontinuous</property><prope"
-  "rty name=\"adjustment\">adjustment2</property><property name=\"restrict"
+  "rty name=\"adjustment\">adjustment4</property><property name=\"restrict"
   "_to_fill_level\">False</property><property name=\"draw_value\">False</p"
   "roperty></object><packing><property name=\"position\">1</property></pac"
-  "king></child><child><object class=\"GtkLabel\" id=\"label18\"><property"
+  "king></child><child><object class=\"GtkLabel\" id=\"label22\"><property"
   " name=\"visible\">True</property><property name=\"label\" translatable="
   "\"yes\">&lt;i&gt;Opaque&lt;/i&gt;</property><property name=\"use_markup"
   "\">True</property></object><packing><property name=\"expand\">False</pr"
   "operty><property name=\"fill\">False</property><property name=\"positio"
   "n\">2</property></packing></child></object></child></object><packing><p"
   "roperty name=\"expand\">False</property><property name=\"fill\">False</"
-  "property><property name=\"position\">5</property></packing></child><chi"
-  "ld><object class=\"GtkLabel\" id=\"label13\"><property name=\"visible\""
+  "property><property name=\"position\">9</property></packing></child><chi"
+  "ld><object class=\"GtkLabel\" id=\"label15\"><property name=\"visible\""
   ">True</property><property name=\"xalign\">0</property><property name=\""
-  "label\" translatable=\"yes\">Opacity of _inactive windows:</property><p"
-  "roperty name=\"use_underline\">True</property><property name=\"mnemonic"
-  "_widget\">inactive_opacity_scale</property></object><packing><property "
-  "name=\"expand\">False</property><property name=\"fill\">False</property"
-  "><property name=\"position\">6</property></packing></child><child><obje"
-  "ct class=\"GtkAlignment\" id=\"alignment6\"><property name=\"visible\">"
-  "True</property><property name=\"top_padding\">2</property><property nam"
-  "e=\"left_padding\">12</property><child><object class=\"GtkHBox\" id=\"h"
-  "box4\"><property name=\"visible\">True</property><child><object class=\""
-  "GtkLabel\" id=\"label19\"><property name=\"visible\">True</property><pr"
-  "operty name=\"label\" translatable=\"yes\">&lt;i&gt;Transparent&lt;/i&g"
-  "t;</property><property name=\"use_markup\">True</property></object><pac"
-  "king><property name=\"expand\">False</property><property name=\"fill\">"
-  "False</property><property name=\"position\">0</property></packing></chi"
-  "ld><child><object class=\"GtkHScale\" id=\"inactive_opacity_scale\"><pr"
-  "operty name=\"visible\">True</property><property name=\"can_focus\">Tru"
-  "e</property><property name=\"update_policy\">discontinuous</property><p"
-  "roperty name=\"adjustment\">adjustment3</property><property name=\"rest"
-  "rict_to_fill_level\">False</property><property name=\"draw_value\">Fals"
-  "e</property></object><packing><property name=\"position\">1</property><"
-  "/packing></child><child><object class=\"GtkLabel\" id=\"label20\"><prop"
-  "erty name=\"visible\">True</property><property name=\"label\" translata"
-  "ble=\"yes\">&lt;i&gt;Opaque&lt;/i&gt;</property><property name=\"use_ma"
-  "rkup\">True</property></object><packing><property name=\"expand\">False"
-  "</property><property name=\"fill\">False</property><property name=\"pos"
-  "ition\">2</property></packing></child></object></child></object><packin"
-  "g><property name=\"expand\">False</property><property name=\"fill\">Fal"
-  "se</property><property name=\"position\">7</property></packing></child>"
-  "<child><object class=\"GtkLabel\" id=\"label14\"><property name=\"visib"
-  "le\">True</property><property name=\"xalign\">0</property><property nam"
-  "e=\"label\" translatable=\"yes\">Opacity of windows during _move:</prop"
-  "erty><property name=\"use_underline\">True</property><property name=\"m"
-  "nemonic_widget\">move_opacity_scale</property></object><packing><proper"
+  "label\" translatable=\"yes\">Opacity of windows during resi_ze:</proper"
+  "ty><property name=\"use_underline\">True</property><property name=\"mne"
+  "monic_widget\">resize_opacity_scale</property></object><packing><proper"
   "ty name=\"expand\">False</property><property name=\"fill\">False</prope"
-  "rty><property name=\"position\">8</property></packing></child><child><o"
-  "bject class=\"GtkAlignment\" id=\"alignment7\"><property name=\"visible"
-  "\">True</property><property name=\"top_padding\">2</property><property "
-  "name=\"left_padding\">12</property><child><object class=\"GtkHBox\" id="
-  "\"hbox5\"><property name=\"visible\">True</property><child><object clas"
-  "s=\"GtkLabel\" id=\"label21\"><property name=\"visible\">True</property"
-  "><property name=\"label\" translatable=\"yes\">&lt;i&gt;Transparent&lt;"
-  "/i&gt;</property><property name=\"use_markup\">True</property></object>"
-  "<packing><property name=\"expand\">False</property><property name=\"fil"
-  "l\">False</property><property name=\"position\">0</property></packing><"
-  "/child><child><object class=\"GtkHScale\" id=\"move_opacity_scale\"><pr"
-  "operty name=\"visible\">True</property><property name=\"can_focus\">Tru"
-  "e</property><property name=\"update_policy\">discontinuous</property><p"
-  "roperty name=\"adjustment\">adjustment4</property><property name=\"rest"
-  "rict_to_fill_level\">False</property><property name=\"draw_value\">Fals"
-  "e</property></object><packing><property name=\"position\">1</property><"
-  "/packing></child><child><object class=\"GtkLabel\" id=\"label22\"><prop"
-  "erty name=\"visible\">True</property><property name=\"label\" translata"
-  "ble=\"yes\">&lt;i&gt;Opaque&lt;/i&gt;</property><property name=\"use_ma"
-  "rkup\">True</property></object><packing><property name=\"expand\">False"
-  "</property><property name=\"fill\">False</property><property name=\"pos"
-  "ition\">2</property></packing></child></object></child></object><packin"
-  "g><property name=\"expand\">False</property><property name=\"fill\">Fal"
-  "se</property><property name=\"position\">9</property></packing></child>"
-  "<child><object class=\"GtkLabel\" id=\"label15\"><property name=\"visib"
-  "le\">True</property><property name=\"xalign\">0</property><property nam"
-  "e=\"label\" translatable=\"yes\">Opacity of windows during resi_ze:</pr"
-  "operty><property name=\"use_underline\">True</property><property name=\""
-  "mnemonic_widget\">resize_opacity_scale</property></object><packing><pro"
-  "perty name=\"expand\">False</property><property name=\"fill\">False</pr"
-  "operty><property name=\"position\">10</property></packing></child><chil"
-  "d><object class=\"GtkAlignment\" id=\"alignment8\"><property name=\"vis"
-  "ible\">True</property><property name=\"top_padding\">2</property><prope"
-  "rty name=\"left_padding\">12</property><child><object class=\"GtkHBox\""
-  " id=\"hbox6\"><property name=\"visible\">True</property><child><object "
-  "class=\"GtkLabel\" id=\"label23\"><property name=\"visible\">True</prop"
-  "erty><property name=\"label\" translatable=\"yes\">&lt;i&gt;Transparent"
-  "&lt;/i&gt;</property><property name=\"use_markup\">True</property></obj"
-  "ect><packing><property name=\"expand\">False</property><property name=\""
-  "fill\">False</property><property name=\"position\">0</property></packin"
-  "g></child><child><object class=\"GtkHScale\" id=\"resize_opacity_scale\""
-  "><property name=\"visible\">True</property><property name=\"can_focus\""
-  ">True</property><property name=\"update_policy\">discontinuous</propert"
-  "y><property name=\"adjustment\">adjustment5</property><property name=\""
-  "restrict_to_fill_level\">False</property><property name=\"draw_value\">"
-  "False</property></object><packing><property name=\"position\">1</proper"
-  "ty></packing></child><child><object class=\"GtkLabel\" id=\"label24\"><"
-  "property name=\"visible\">True</property><property name=\"label\" trans"
-  "latable=\"yes\">&lt;i&gt;Opaque&lt;/i&gt;</property><property name=\"us"
-  "e_markup\">True</property></object><packing><property name=\"expand\">F"
-  "alse</property><property name=\"fill\">False</property><property name=\""
+  "rty><property name=\"position\">10</property></packing></child><child><"
+  "object class=\"GtkAlignment\" id=\"alignment8\"><property name=\"visibl"
+  "e\">True</property><property name=\"top_padding\">2</property><property"
+  " name=\"left_padding\">12</property><child><object class=\"GtkHBox\" id"
+  "=\"hbox6\"><property name=\"visible\">True</property><child><object cla"
+  "ss=\"GtkLabel\" id=\"label23\"><property name=\"visible\">True</propert"
+  "y><property name=\"label\" translatable=\"yes\">&lt;i&gt;Transparent&lt"
+  ";/i&gt;</property><property name=\"use_markup\">True</property></object"
+  "><packing><property name=\"expand\">False</property><property name=\"fi"
+  "ll\">False</property><property name=\"position\">0</property></packing>"
+  "</child><child><object class=\"GtkHScale\" id=\"resize_opacity_scale\">"
+  "<property name=\"visible\">True</property><property name=\"can_focus\">"
+  "True</property><property name=\"update_policy\">discontinuous</property"
+  "><property name=\"adjustment\">adjustment5</property><property name=\"r"
+  "estrict_to_fill_level\">False</property><property name=\"draw_value\">F"
+  "alse</property></object><packing><property name=\"position\">1</propert"
+  "y></packing></child><child><object class=\"GtkLabel\" id=\"label24\"><p"
+  "roperty name=\"visible\">True</property><property name=\"label\" transl"
+  "atable=\"yes\">&lt;i&gt;Opaque&lt;/i&gt;</property><property name=\"use"
+  "_markup\">True</property></object><packing><property name=\"expand\">Fa"
+  "lse</property><property name=\"fill\">False</property><property name=\""
   "position\">2</property></packing></child></object></child></object><pac"
   "king><property name=\"expand\">False</property><property name=\"fill\">"
   "False</property><property name=\"position\">11</property></packing></ch"
@@ -568,5 +576,5 @@ static const char tweaks_dialog_ui[] =
   "et></action-widgets></object></interface>"
 };
 
-static const unsigned tweaks_dialog_ui_length = 37803u;
+static const unsigned tweaks_dialog_ui_length = 38338u;
 
diff --git a/src/client.c b/src/client.c
index 4e86808..b92c264 100644
--- a/src/client.c
+++ b/src/client.c
@@ -64,6 +64,8 @@
 #include "xsync.h"
 #include "event_filter.h"
 
+//#define TRACE(fmt, ...) printf(fmt"\n", ##__VA_ARGS__); fflush(stdout);
+
 /* Event mask definition */
 
 #define POINTER_EVENT_MASK \
@@ -173,6 +175,7 @@ clientCreateTitleName (Client *c, gchar *name, gchar *hostname)
     gchar *title;
 
     g_return_val_if_fail (c != NULL, NULL);
+
     TRACE ("entering clientCreateTitleName");
 
     screen_info = c->screen_info;
@@ -1729,6 +1732,7 @@ clientFrame (DisplayInfo *display_info, Window w, gboolean recapture)
     clientGetInitialNetWmDesktop (c);
     /* workarea will be updated when shown, no need to worry here */
     clientGetNetStruts (c);
+    clientGetExtra (c);
 
     /* Once we know the type of window, we can initialize window position */
     if (!FLAG_TEST (c->xfwm_flags, XFWM_FLAG_SESSION_MANAGED))
@@ -3137,6 +3141,8 @@ clientNewMaxSize (Client *c, XWindowChanges *wc, GdkRectangle *rect, tilePositio
         wc->width = full_w - frameLeft (c) - frameRight (c);
         wc->height = full_h - frameTop (c) - frameBottom (c);
 
+        TRACE ("clientNewMaxSize %d %d %d %d", wc->x, wc->y, wc->width, wc->height);
+
         return ((wc->width <= c->size->max_width) && (wc->height <= c->size->max_height));
     }
 
diff --git a/src/client.h b/src/client.h
index e8bc4e3..b5e54df 100644
--- a/src/client.h
+++ b/src/client.h
@@ -161,6 +161,7 @@
 #define CLIENT_FLAG_DEMANDS_ATTENTION   (1L<<17)
 #define CLIENT_FLAG_HAS_SHAPE           (1L<<18)
 #define CLIENT_FLAG_FULLSCREN_MONITORS  (1L<<19)
+#define CLIENT_FLAG_TITLELESS_MAXIMIZE  (1L<<20)
 
 #define WM_FLAG_DELETE                  (1L<<0)
 #define WM_FLAG_INPUT                   (1L<<1)
diff --git a/src/display.c b/src/display.c
index 00318d5..4f847f4 100644
--- a/src/display.c
+++ b/src/display.c
@@ -169,7 +169,8 @@ myDisplayInitAtoms (DisplayInfo *display_info)
         "XFWM4_COMPOSITING_MANAGER",
         "XFWM4_TIMESTAMP_PROP",
         "_XROOTPMAP_ID",
-        "_XSETROOT_ID"
+        "_XSETROOT_ID",
+        "_GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED"
     };
 
     g_assert (ATOM_COUNT == G_N_ELEMENTS (atom_names));
diff --git a/src/display.h b/src/display.h
index 8797237..a297cf2 100644
--- a/src/display.h
+++ b/src/display.h
@@ -265,6 +265,7 @@ enum
     XFWM4_TIMESTAMP_PROP,
     XROOTPMAP,
     XSETROOT,
+    _GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED,
     ATOM_COUNT
 };
 
diff --git a/src/events.c b/src/events.c
index 4b49171..044cd11 100644
--- a/src/events.c
+++ b/src/events.c
@@ -1921,6 +1921,11 @@ handlePropertyNotify (DisplayInfo *display_info, XPropertyEvent * ev)
             TRACE ("Window 0x%lx has NET_WM_SYNC_REQUEST_COUNTER set to 0x%lx", c->window, c->xsync_counter);
         }
 #endif /* HAVE_XSYNC */
+        else if (ev->atom == display_info->atoms[_GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED])
+        {
+            TRACE ("Client \"%s\" Window 0x%lx has received GTK CRAP\n", c->name, c->window);
+            clientUpdateExtra (c);
+        }
 
         return status;
     }
diff --git a/src/frame.c b/src/frame.c
index 7f4cbd3..23c01cd 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -39,6 +39,8 @@
 #include "frame.h"
 #include "compositor.h"
 
+//#define TRACE(fmt, ...) printf(fmt"\n", ##__VA_ARGS__); fflush(stdout);
+
 typedef struct
 {
     xfwmPixmap pm_title;
@@ -121,7 +123,14 @@ frameTop (Client * c)
 
     g_return_val_if_fail (c != NULL, 0);
     if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_BORDER)
-        && !FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN))
+        && !(FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN)
+            || (FLAG_TEST (c->flags, CLIENT_FLAG_MAXIMIZED_VERT)
+                && (c->screen_info->params->titleless_maximize
+                    || FLAG_TEST (c->flags, CLIENT_FLAG_TITLELESS_MAXIMIZE))
+                && c->screen_info->params->borderless_maximize
+                )
+            )
+        )
     {
         return c->screen_info->title[TITLE_3][ACTIVE].height;
     }
@@ -136,8 +145,13 @@ frameBottom (Client * c)
     g_return_val_if_fail (c != NULL, 0);
     if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_BORDER)
         && !FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN)
-        && (!FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED)
-            || !(c->screen_info->params->borderless_maximize)))
+        && !(FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED)
+            && (c->screen_info->params->borderless_maximize))
+        && !(FLAG_TEST (c->flags, CLIENT_FLAG_MAXIMIZED_VERT)
+            && (c->screen_info->params->borderless_maximize)
+            && (c->screen_info->params->titleless_maximize
+                || FLAG_TEST (c->flags, CLIENT_FLAG_TITLELESS_MAXIMIZE)))
+        )
     {
         return c->screen_info->sides[SIDE_BOTTOM][ACTIVE].height;
     }
@@ -203,7 +217,14 @@ frameHeight (Client * c)
         return frameTop (c) + frameBottom (c);
     }
     else if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_BORDER)
-             && !FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN))
+             && !FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN)
+             && !(
+                FLAG_TEST (c->flags, CLIENT_FLAG_MAXIMIZED_VERT)
+                && (c->screen_info->params->borderless_maximize)
+                && (c->screen_info->params->titleless_maximize
+                    || FLAG_TEST (c->flags, CLIENT_FLAG_TITLELESS_MAXIMIZE))
+             ))
+
     {
         return c->height + frameTop (c) + frameBottom (c);
     }
@@ -882,6 +903,7 @@ frameDrawWin (Client * c)
     gboolean requires_clearing;
     gboolean width_changed;
     gboolean height_changed;
+    gboolean vert_only;
 
     TRACE ("entering frameDraw");
     TRACE ("drawing frame for \"%s\" (0x%lx)", c->name, c->window);
@@ -955,128 +977,152 @@ frameDrawWin (Client * c)
     }
 
     if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_BORDER)
-        && !FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN))
+        && !FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN)
+        && !(FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED)
+            && (c->screen_info->params->borderless_maximize)
+            && (c->screen_info->params->titleless_maximize
+                || FLAG_TEST (c->flags, CLIENT_FLAG_TITLELESS_MAXIMIZE))
+            ))
     {
-        /* First, hide the buttons that we don't have... */
-        for (i = 0; i < BUTTON_COUNT; i++)
+        vert_only = FLAG_TEST (c->flags, CLIENT_FLAG_MAXIMIZED_VERT)
+                    && (c->screen_info->params->borderless_maximize) //only vertical decorations shown (titleless vertical maximize)
+                    && (c->screen_info->params->titleless_maximize
+                        || FLAG_TEST (c->flags, CLIENT_FLAG_TITLELESS_MAXIMIZE));
+
+        if (vert_only)
         {
-            char b = getLetterFromButton (i, c);
-            if ((!b) || !strchr (screen_info->params->button_layout, b))
+            //hide all buttons
+            for (i = 0; i < BUTTON_COUNT; i++)
             {
                 xfwmWindowHide (&c->buttons[i]);
             }
+            xfwmWindowHide (&c->title);
+            xfwmWindowHide (&c->sides[SIDE_BOTTOM]);
+            xfwmWindowHide (&c->sides[SIDE_TOP]);
+            xfwmWindowHide (&c->corners[CORNER_TOP_LEFT]);
+            xfwmWindowHide (&c->corners[CORNER_TOP_RIGHT]);
+            xfwmWindowHide (&c->corners[CORNER_BOTTOM_LEFT]);
+            xfwmWindowHide (&c->corners[CORNER_BOTTOM_RIGHT]);
         }
-
-        /* Then, show the ones that we do have on left... */
-        x = frameLeft (c) + frameButtonOffset (c);
-        if (x < 0)
-        {
-            x = 0;
-        }
-        right = frameWidth (c) - frameRight (c) - frameButtonOffset (c);
-        for (i = 0; i < strlen (screen_info->params->button_layout); i++)
+        else
         {
-            button = getButtonFromLetter (screen_info->params->button_layout[i], c);
-            if (button == TITLE_SEPARATOR)
+            /* First, hide the buttons that we don't have... */
+            for (i = 0; i < BUTTON_COUNT; i++)
             {
-                break;
-            }
-            else if (button >= 0)
-            {
-                if (x + screen_info->buttons[button][state].width + screen_info->params->button_spacing < right)
-                {
-                    my_pixmap = clientGetButtonPixmap (c, button, clientGetButtonState (c, button, state));
-                    if (!xfwmPixmapNone(my_pixmap))
-                    {
-                        xfwmWindowSetBG (&c->buttons[button], my_pixmap);
-                    }
-                    xfwmWindowShow (&c->buttons[button], x,
-                        (frameTop (c) - screen_info->buttons[button][state].height + 1) / 2,
-                        screen_info->buttons[button][state].width,
-                        screen_info->buttons[button][state].height, TRUE);
-                    button_x[button] = x;
-                    x = x + screen_info->buttons[button][state].width +
-                        screen_info->params->button_spacing;
-                }
-                else
+                char b = getLetterFromButton (i, c);
+                if ((!b) || !strchr (screen_info->params->button_layout, b))
                 {
-                    xfwmWindowHide (&c->buttons[button]);
+                    xfwmWindowHide (&c->buttons[i]);
                 }
             }
-        }
-        left = x + screen_info->params->button_spacing;
 
-        /* and those that we do have on right... */
-        x = frameWidth (c) - frameRight (c) + screen_info->params->button_spacing -
-            frameButtonOffset (c);
-        for (j = strlen (screen_info->params->button_layout) - 1; j >= i; j--)
-        {
-            button = getButtonFromLetter (screen_info->params->button_layout[j], c);
-            if (button == TITLE_SEPARATOR)
+            /* Then, show the ones that we do have on left... */
+            x = frameLeft (c) + frameButtonOffset (c);
+            if (x < 0)
             {
-                break;
+                x = 0;
             }
-            else if (button >= 0)
+            right = frameWidth (c) - frameRight (c) - frameButtonOffset (c);
+            for (i = 0; i < strlen (screen_info->params->button_layout); i++)
             {
-                if (x - screen_info->buttons[button][state].width - screen_info->params->button_spacing > left)
+                button = getButtonFromLetter (screen_info->params->button_layout[i], c);
+                if (button == TITLE_SEPARATOR)
                 {
-                    my_pixmap = clientGetButtonPixmap (c, button, clientGetButtonState (c, button, state));
-                    if (!xfwmPixmapNone(my_pixmap))
+                    break;
+                }
+                else if (button >= 0)
+                {
+                    if (x + screen_info->buttons[button][state].width + screen_info->params->button_spacing < right)
+                    {
+                        my_pixmap = clientGetButtonPixmap (c, button, clientGetButtonState (c, button, state));
+                        if (!xfwmPixmapNone(my_pixmap))
+                        {
+                            xfwmWindowSetBG (&c->buttons[button], my_pixmap);
+                        }
+                        xfwmWindowShow (&c->buttons[button], x,
+                            (frameTop (c) - screen_info->buttons[button][state].height + 1) / 2,
+                            screen_info->buttons[button][state].width,
+                            screen_info->buttons[button][state].height, TRUE);
+                        button_x[button] = x;
+                        x = x + screen_info->buttons[button][state].width +
+                            screen_info->params->button_spacing;
+                    }
+                    else
                     {
-                        xfwmWindowSetBG (&c->buttons[button], my_pixmap);
+                        xfwmWindowHide (&c->buttons[button]);
                     }
-                    x = x - screen_info->buttons[button][state].width -
-                        screen_info->params->button_spacing;
-                    xfwmWindowShow (&c->buttons[button], x,
-                        (frameTop (c) - screen_info->buttons[button][state].height + 1) / 2,
-                        screen_info->buttons[button][state].width,
-                        screen_info->buttons[button][state].height, TRUE);
-                    button_x[button] = x;
                 }
-                else
+            }
+            left = x + screen_info->params->button_spacing;
+
+            /* and those that we do have on right... */
+            x = frameWidth (c) - frameRight (c) + screen_info->params->button_spacing -
+                frameButtonOffset (c);
+            for (j = strlen (screen_info->params->button_layout) - 1; j >= i; j--)
+            {
+                button = getButtonFromLetter (screen_info->params->button_layout[j], c);
+                if (button == TITLE_SEPARATOR)
                 {
-                    xfwmWindowHide (&c->buttons[button]);
+                    break;
+                }
+                else if (button >= 0)
+                {
+                    if (x - screen_info->buttons[button][state].width - screen_info->params->button_spacing > left)
+                    {
+                        my_pixmap = clientGetButtonPixmap (c, button, clientGetButtonState (c, button, state));
+                        if (!xfwmPixmapNone(my_pixmap))
+                        {
+                            xfwmWindowSetBG (&c->buttons[button], my_pixmap);
+                        }
+                        x = x - screen_info->buttons[button][state].width -
+                            screen_info->params->button_spacing;
+                        xfwmWindowShow (&c->buttons[button], x,
+                            (frameTop (c) - screen_info->buttons[button][state].height + 1) / 2,
+                            screen_info->buttons[button][state].width,
+                            screen_info->buttons[button][state].height, TRUE);
+                        button_x[button] = x;
+                    }
+                    else
+                    {
+                        xfwmWindowHide (&c->buttons[button]);
+                    }
                 }
             }
+            left = left - 2 * screen_info->params->button_spacing;
+            right = x;
+            xfwmPixmapInit (screen_info, &frame_pix.pm_title);
+            xfwmPixmapInit (screen_info, &frame_pix.pm_sides[SIDE_TOP]);
+            xfwmPixmapInit (screen_info, &frame_pix.pm_sides[SIDE_BOTTOM]);
+
+            top_width = frameWidth (c) - frameTopLeftWidth (c, state) - frameTopRightWidth (c, state);
+            bottom_width = frameWidth (c) -
+                screen_info->corners[CORNER_BOTTOM_LEFT][state].width -
+                screen_info->corners[CORNER_BOTTOM_RIGHT][state].width;
+
+            /* The title is almost always visible */
+            frameCreateTitlePixmap (c, state, left, right, &frame_pix.pm_title, &frame_pix.pm_sides[SIDE_TOP]);
+            xfwmWindowSetBG (&c->title, &frame_pix.pm_title);
+            xfwmWindowShow (&c->title,
+                frameTopLeftWidth (c, state), 0, top_width,
+                frameTop (c), (requires_clearing | width_changed));
+
+            /* Corners are never resized, we need to update them separately */
+            if (requires_clearing)
+            {
+                xfwmWindowSetBG (&c->corners[CORNER_TOP_LEFT],
+                    &screen_info->corners[CORNER_TOP_LEFT][state]);
+                xfwmWindowSetBG (&c->corners[CORNER_TOP_RIGHT],
+                    &screen_info->corners[CORNER_TOP_RIGHT][state]);
+                xfwmWindowSetBG (&c->corners[CORNER_BOTTOM_LEFT],
+                    &screen_info->corners[CORNER_BOTTOM_LEFT][state]);
+                xfwmWindowSetBG (&c->corners[CORNER_BOTTOM_RIGHT],
+                    &screen_info->corners[CORNER_BOTTOM_RIGHT][state]);
+            }
         }
-        left = left - 2 * screen_info->params->button_spacing;
-        right = x;
-
-        top_width = frameWidth (c) - frameTopLeftWidth (c, state) - frameTopRightWidth (c, state);
-        bottom_width = frameWidth (c) -
-            screen_info->corners[CORNER_BOTTOM_LEFT][state].width -
-            screen_info->corners[CORNER_BOTTOM_RIGHT][state].width;
-        left_height = frameHeight (c) - frameTop (c) -
-            screen_info->corners[CORNER_BOTTOM_LEFT][state].height;
-        right_height = frameHeight (c) - frameTop (c) -
-            screen_info->corners[CORNER_BOTTOM_RIGHT][state].height;
-
-        xfwmPixmapInit (screen_info, &frame_pix.pm_title);
-        xfwmPixmapInit (screen_info, &frame_pix.pm_sides[SIDE_TOP]);
-        xfwmPixmapInit (screen_info, &frame_pix.pm_sides[SIDE_BOTTOM]);
+
         xfwmPixmapInit (screen_info, &frame_pix.pm_sides[SIDE_LEFT]);
         xfwmPixmapInit (screen_info, &frame_pix.pm_sides[SIDE_RIGHT]);
 
-        /* The title is always visible */
-        frameCreateTitlePixmap (c, state, left, right, &frame_pix.pm_title, &frame_pix.pm_sides[SIDE_TOP]);
-        xfwmWindowSetBG (&c->title, &frame_pix.pm_title);
-        xfwmWindowShow (&c->title,
-            frameTopLeftWidth (c, state), 0, top_width,
-            frameTop (c), (requires_clearing | width_changed));
-
-        /* Corners are never resized, we need to update them separately */
-        if (requires_clearing)
-        {
-            xfwmWindowSetBG (&c->corners[CORNER_TOP_LEFT],
-                &screen_info->corners[CORNER_TOP_LEFT][state]);
-            xfwmWindowSetBG (&c->corners[CORNER_TOP_RIGHT],
-                &screen_info->corners[CORNER_TOP_RIGHT][state]);
-            xfwmWindowSetBG (&c->corners[CORNER_BOTTOM_LEFT],
-                &screen_info->corners[CORNER_BOTTOM_LEFT][state]);
-            xfwmWindowSetBG (&c->corners[CORNER_BOTTOM_RIGHT],
-                &screen_info->corners[CORNER_BOTTOM_RIGHT][state]);
-        }
-
         if (FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED)
             && (c->screen_info->params->borderless_maximize))
         {
@@ -1091,6 +1137,18 @@ frameDrawWin (Client * c)
         }
         else
         {
+            if (vert_only)
+            {
+                left_height = right_height = c->height;
+            }
+            else
+            {
+                left_height = frameHeight (c) - frameTop (c)
+                    - screen_info->corners[CORNER_BOTTOM_LEFT][state].height;
+                right_height = frameHeight (c) - frameTop (c)
+                    - screen_info->corners[CORNER_BOTTOM_RIGHT][state].height;
+            }
+
             if (FLAG_TEST (c->flags, CLIENT_FLAG_SHADED))
             {
                 xfwmWindowHide (&c->sides[SIDE_LEFT]);
@@ -1120,63 +1178,69 @@ frameDrawWin (Client * c)
                     right_height, (requires_clearing | height_changed));
             }
 
-            xfwmPixmapCreate (screen_info, &frame_pix.pm_sides[SIDE_BOTTOM],
-                bottom_width, frameBottom (c));
-            xfwmPixmapFill (&screen_info->sides[SIDE_BOTTOM][state],
-                &frame_pix.pm_sides[SIDE_BOTTOM],
-                0, 0, bottom_width, frameBottom (c));
-            xfwmWindowSetBG (&c->sides[SIDE_BOTTOM],
-                &frame_pix.pm_sides[SIDE_BOTTOM]);
-            xfwmWindowShow (&c->sides[SIDE_BOTTOM],
-                screen_info->corners[CORNER_BOTTOM_LEFT][state].width,
-                frameHeight (c) - frameBottom (c), bottom_width, frameBottom (c),
-                (requires_clearing | width_changed));
-
-            if (!xfwmPixmapNone(&frame_pix.pm_sides[SIDE_TOP]))
+            if (!vert_only)
             {
-                xfwmWindowSetBG (&c->sides[SIDE_TOP], &frame_pix.pm_sides[SIDE_TOP]);
-                xfwmWindowShow (&c->sides[SIDE_TOP],
-                    screen_info->corners[CORNER_TOP_LEFT][state].width,
-                    0, top_width, frame_pix.pm_sides[SIDE_TOP].height,
+                xfwmPixmapCreate (screen_info, &frame_pix.pm_sides[SIDE_BOTTOM],
+                    bottom_width, frameBottom (c));
+                xfwmPixmapFill (&screen_info->sides[SIDE_BOTTOM][state],
+                    &frame_pix.pm_sides[SIDE_BOTTOM],
+                    0, 0, bottom_width, frameBottom (c));
+                xfwmWindowSetBG (&c->sides[SIDE_BOTTOM],
+                    &frame_pix.pm_sides[SIDE_BOTTOM]);
+                xfwmWindowShow (&c->sides[SIDE_BOTTOM],
+                    screen_info->corners[CORNER_BOTTOM_LEFT][state].width,
+                    frameHeight (c) - frameBottom (c), bottom_width, frameBottom (c),
                     (requires_clearing | width_changed));
-            }
-            else
-            {
-                xfwmWindowHide (&c->sides[SIDE_TOP]);
-            }
 
-            xfwmWindowShow (&c->corners[CORNER_TOP_LEFT], 0, 0,
-                frameTopLeftWidth (c, state),
-                screen_info->corners[CORNER_TOP_LEFT][state].height,
-                requires_clearing);
-
-            xfwmWindowShow (&c->corners[CORNER_TOP_RIGHT],
-                frameWidth (c) - frameTopRightWidth (c, state),
-                0, frameTopRightWidth (c, state),
-                screen_info->corners[CORNER_TOP_RIGHT][state].height,
-                requires_clearing);
-
-            xfwmWindowShow (&c->corners[CORNER_BOTTOM_LEFT], 0,
-                frameHeight (c) -
-                screen_info->corners[CORNER_BOTTOM_LEFT][state].height,
-                screen_info->corners[CORNER_BOTTOM_LEFT][state].width,
-                screen_info->corners[CORNER_BOTTOM_LEFT][state].height,
-                requires_clearing);
-
-            xfwmWindowShow (&c->corners[CORNER_BOTTOM_RIGHT],
-                frameWidth (c) -
-                screen_info->corners[CORNER_BOTTOM_RIGHT][state].width,
-                frameHeight (c) -
-                screen_info->corners[CORNER_BOTTOM_RIGHT][state].height,
-                screen_info->corners[CORNER_BOTTOM_RIGHT][state].width,
-                screen_info->corners[CORNER_BOTTOM_RIGHT][state].height,
-                requires_clearing);
+                if (!xfwmPixmapNone(&frame_pix.pm_sides[SIDE_TOP]))
+                {
+                    xfwmWindowSetBG (&c->sides[SIDE_TOP], &frame_pix.pm_sides[SIDE_TOP]);
+                    xfwmWindowShow (&c->sides[SIDE_TOP],
+                        screen_info->corners[CORNER_TOP_LEFT][state].width,
+                        0, top_width, frame_pix.pm_sides[SIDE_TOP].height,
+                        (requires_clearing | width_changed));
+                }
+                else
+                {
+                    xfwmWindowHide (&c->sides[SIDE_TOP]);
+                }
+
+                xfwmWindowShow (&c->corners[CORNER_TOP_LEFT], 0, 0,
+                    frameTopLeftWidth (c, state),
+                    screen_info->corners[CORNER_TOP_LEFT][state].height,
+                    requires_clearing);
+
+                xfwmWindowShow (&c->corners[CORNER_TOP_RIGHT],
+                    frameWidth (c) - frameTopRightWidth (c, state),
+                    0, frameTopRightWidth (c, state),
+                    screen_info->corners[CORNER_TOP_RIGHT][state].height,
+                    requires_clearing);
+
+                xfwmWindowShow (&c->corners[CORNER_BOTTOM_LEFT], 0,
+                    frameHeight (c) -
+                    screen_info->corners[CORNER_BOTTOM_LEFT][state].height,
+                    screen_info->corners[CORNER_BOTTOM_LEFT][state].width,
+                    screen_info->corners[CORNER_BOTTOM_LEFT][state].height,
+                    requires_clearing);
+
+                xfwmWindowShow (&c->corners[CORNER_BOTTOM_RIGHT],
+                    frameWidth (c) -
+                    screen_info->corners[CORNER_BOTTOM_RIGHT][state].width,
+                    frameHeight (c) -
+                    screen_info->corners[CORNER_BOTTOM_RIGHT][state].height,
+                    screen_info->corners[CORNER_BOTTOM_RIGHT][state].width,
+                    screen_info->corners[CORNER_BOTTOM_RIGHT][state].height,
+                    requires_clearing);
+            }
         }
         frameSetShape (c, state, &frame_pix, button_x);
 
-        xfwmPixmapFree (&frame_pix.pm_title);
-        xfwmPixmapFree (&frame_pix.pm_sides[SIDE_TOP]);
-        xfwmPixmapFree (&frame_pix.pm_sides[SIDE_BOTTOM]);
+        if (!vert_only)
+        {
+            xfwmPixmapFree (&frame_pix.pm_title);
+            xfwmPixmapFree (&frame_pix.pm_sides[SIDE_TOP]);
+            xfwmPixmapFree (&frame_pix.pm_sides[SIDE_BOTTOM]);
+        }
         xfwmPixmapFree (&frame_pix.pm_sides[SIDE_LEFT]);
         xfwmPixmapFree (&frame_pix.pm_sides[SIDE_RIGHT]);
     }
diff --git a/src/netwm.c b/src/netwm.c
index 1352f08..9e3647c 100644
--- a/src/netwm.c
+++ b/src/netwm.c
@@ -136,6 +136,44 @@ clientSetNetState (Client * c)
 }
 
 void
+clientGetExtra (Client *c)
+{
+    long val;
+    DisplayInfo *display_info;
+
+    display_info = c->screen_info->display_info;
+
+    getHint (display_info, c->window, _GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED, &val);
+    if (val)
+        FLAG_SET (c->flags, CLIENT_FLAG_TITLELESS_MAXIMIZE);
+}
+
+void
+clientUpdateExtra (Client *c)
+{
+    long val;
+    unsigned long maximization_flags = 0L;
+    DisplayInfo *display_info;
+
+    display_info = c->screen_info->display_info;
+
+    getHint (display_info, c->window, _GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED, &val);
+    if (val)
+        FLAG_SET (c->flags, CLIENT_FLAG_TITLELESS_MAXIMIZE);
+    else
+        FLAG_UNSET (c->flags, CLIENT_FLAG_TITLELESS_MAXIMIZE);
+
+    if (FLAG_TEST (c->flags, CLIENT_FLAG_MAXIMIZED))
+    {
+        maximization_flags = c->flags & CLIENT_FLAG_MAXIMIZED;
+
+        /* Force an update by clearing the internal flags */
+        FLAG_UNSET (c->flags, CLIENT_FLAG_MAXIMIZED_HORIZ | CLIENT_FLAG_MAXIMIZED_VERT);
+        clientToggleMaximized (c, maximization_flags, TRUE);
+    }
+}
+
+void
 clientGetNetState (Client * c)
 {
     ScreenInfo *screen_info;
diff --git a/src/placement.c b/src/placement.c
index 01f2590..64719a7 100644
--- a/src/placement.c
+++ b/src/placement.c
@@ -38,7 +38,6 @@
 #include "frame.h"
 #include "netwm.h"
 
-
 /* Compute rectangle overlap area */
 
 static inline unsigned long
@@ -108,6 +107,8 @@ clientMaxSpace (ScreenInfo *screen_info, int *x, int *y, int *w, int *h)
     g_return_if_fail (w != NULL);
     g_return_if_fail (h != NULL);
 
+    TRACE ("entering clientMaxSpace");
+
     screen_width = 0;
     screen_height = 0;
     delta = 0;
@@ -157,6 +158,7 @@ clientMaxSpace (ScreenInfo *screen_info, int *x, int *y, int *w, int *h)
             }
         }
     }
+    TRACE ("clientMaxSpace result %d %d %d %d", *x, *y, *w, *h);
 }
 
 gboolean
diff --git a/src/settings.c b/src/settings.c
index 607bb7b..37b6c2a 100644
--- a/src/settings.c
+++ b/src/settings.c
@@ -667,6 +667,7 @@ loadSettings (ScreenInfo *screen_info)
         /* You can change the order of the following parameters */
         {"activate_action", NULL, G_TYPE_STRING, TRUE},
         {"borderless_maximize", NULL, G_TYPE_BOOLEAN, TRUE},
+        {"titleless_maximize", NULL, G_TYPE_BOOLEAN, TRUE},
         {"box_move", NULL, G_TYPE_BOOLEAN, TRUE},
         {"box_resize", NULL, G_TYPE_BOOLEAN, TRUE},
         {"button_layout", NULL, G_TYPE_STRING, TRUE},
@@ -753,6 +754,8 @@ loadSettings (ScreenInfo *screen_info)
 
     screen_info->params->borderless_maximize =
         getBoolValue ("borderless_maximize", rc);
+    screen_info->params->titleless_maximize =
+        getBoolValue ("titleless_maximize", rc);
     screen_info->params->box_resize =
         getBoolValue ("box_resize", rc);
     screen_info->params->box_move =
@@ -1261,6 +1264,11 @@ cb_xfwm4_channel_property_changed(XfconfChannel *channel, const gchar *property_
                     screen_info->params->borderless_maximize = g_value_get_boolean (value);
                     reloadScreenSettings (screen_info, UPDATE_MAXIMIZE);
                 }
+                else if (!strcmp (name, "titleless_maximize"))
+                {
+                    screen_info->params->titleless_maximize = g_value_get_boolean (value);
+                    reloadScreenSettings (screen_info, UPDATE_MAXIMIZE);
+                }
                 else if (!strcmp (name, "cycle_minimum"))
                 {
                     screen_info->params->cycle_minimum = g_value_get_boolean (value);
diff --git a/src/settings.h b/src/settings.h
index be01b6b..ea8b79b 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -197,6 +197,7 @@ struct _XfwmParams
     int title_shadow[2];
     int wrap_resistance;
     gboolean borderless_maximize;
+    gboolean titleless_maximize;
     gboolean box_move;
     gboolean box_resize;
     gboolean click_to_focus;
-- 
1.8.4