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\"><i>Small</i></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\"><i>Large</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\"><i>Transparent</i>" - ";</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\"><i>Small</i></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\"><i>Large</i></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\"><i>Transparent</i></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\"><i>Opaque</i></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\"><i>Transparent</i><" + "/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\"><i>Opaque</i></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\"><i>Transparent</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\"><i>Opaque</i></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\"><i>Transparent</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\"><i>Opaque</i></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\"><i>Transparent<" - "/i></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\"><i>Opaque</i></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\"><i>Transparent" - "</i></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\"><i>Opaque</i></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\"><i>Transparent<" + ";/i></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\"><i>Opaque</i></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