From 34caa7898197cceab366a5bb42616d7bacf5bb9d Mon Sep 17 00:00:00 2001 From: cedric Date: Sat, 17 Aug 2013 23:20:40 +0200 Subject: [PATCH 1/4] Fix frameSetShape function --- src/frame.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/frame.c b/src/frame.c index 7f4cbd3..ae4aa49 100644 --- a/src/frame.c +++ b/src/frame.c @@ -791,8 +791,8 @@ frameSetShape (Client * c, int state, FramePixmap * frame_pix, int button_x[BUTT if (xfwmWindowVisible (&c->sides[SIDE_TOP])) { XShapeCombineShape (display_info->dpy, screen_info->shape_win, ShapeBounding, - screen_info->corners[CORNER_BOTTOM_LEFT][state].width, - frameTop (c) - frameBottom (c), + frameTopLeftWidth (c, state), + 0, MYWINDOW_XWINDOW (c->sides[SIDE_TOP]), ShapeBounding, ShapeUnion); } -- 1.8.4.2 From 87cea4783114d5655dcdd37c51c35e50e4e748ee Mon Sep 17 00:00:00 2001 From: Viktor Semykin Date: Sun, 10 Mar 2013 22:03:54 +0200 Subject: [PATCH 2/4] Added titleless maximization feature Conflicts: settings-dialogs/xfwm4-settings.c settings-dialogs/xfwm4-tweaks-dialog.glade --- settings-dialogs/tweaks-settings.c | 5 +++++ settings-dialogs/xfwm4-tweaks-dialog.glade | 25 ++++++++++++++++++++----- src/client.c | 2 ++ src/frame.c | 8 +++++++- src/settings.c | 8 ++++++++ src/settings.h | 1 + 6 files changed, 43 insertions(+), 6 deletions(-) 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..42b864d 100644 --- a/settings-dialogs/xfwm4-tweaks-dialog.glade +++ b/settings-dialogs/xfwm4-tweaks-dialog.glade @@ -343,6 +343,21 @@ or "skip taskbar" properties set + + Hide title of windows when maximized + True + True + False + True + True + + + False + False + 3 + + + Restore original _size of maximized windows when moving True @@ -354,7 +369,7 @@ or "skip taskbar" properties set False False - 3 + 4 @@ -369,7 +384,7 @@ or "skip taskbar" properties set False False - 4 + 5 @@ -384,7 +399,7 @@ or "skip taskbar" properties set False False - 5 + 6 @@ -399,7 +414,7 @@ or "skip taskbar" properties set False False - 5 + 7 @@ -414,7 +429,7 @@ or "skip taskbar" properties set False False - 6 + 8 diff --git a/src/client.c b/src/client.c index 4e86808..6eb14d7 100644 --- a/src/client.c +++ b/src/client.c @@ -3137,6 +3137,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/frame.c b/src/frame.c index ae4aa49..a8ada34 100644 --- a/src/frame.c +++ b/src/frame.c @@ -121,7 +121,13 @@ 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 | CLIENT_FLAG_MAXIMIZED_VERT) + && c->screen_info->params->titleless_maximize + && c->screen_info->params->borderless_maximize + ) + ) + ) { return c->screen_info->title[TITLE_3][ACTIVE].height; } 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.2 From 4019856910380e9e2bc0e6c158779b3810c9397a Mon Sep 17 00:00:00 2001 From: cedric Date: Thu, 8 Aug 2013 22:41:09 +0200 Subject: [PATCH 3/4] Tweak frame.c functions to activate titleless option (when window is fully maximized only). --- src/frame.c | 99 +++++++++++++++++++++++++++++++++---------------------------- 1 file changed, 53 insertions(+), 46 deletions(-) diff --git a/src/frame.c b/src/frame.c index a8ada34..297bf84 100644 --- a/src/frame.c +++ b/src/frame.c @@ -121,13 +121,9 @@ 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_MAXIMIZED | CLIENT_FLAG_MAXIMIZED_VERT) - && c->screen_info->params->titleless_maximize - && c->screen_info->params->borderless_maximize - ) - ) - ) + && !FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN) + && !(FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED) + && c->screen_info->params->titleless_maximize)) { return c->screen_info->title[TITLE_3][ACTIVE].height; } @@ -960,8 +956,26 @@ frameDrawWin (Client * c) } } + 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]); + + /* test if the title have to be displayed */ 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->titleless_maximize)) { /* First, hide the buttons that we don't have... */ for (i = 0; i < BUTTON_COUNT; i++) @@ -1048,28 +1062,33 @@ frameDrawWin (Client * c) 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)); + /* Show the title */ + 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)); + } + else + { + /* hide the title and buttons */ + if (xfwmWindowVisible (&c->title)) + { + xfwmWindowHide (&c->title); + } + for (i = 0; i < BUTTON_COUNT; i++) + { + if (MYWINDOW_XWINDOW (c->buttons[i]) && xfwmWindowVisible (&c->buttons[i])) + { + xfwmWindowHide (&c->buttons[i]); + } + } + } + /* test if the borders have to be displayed */ + if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_BORDER) + && !FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN)) + { /* Corners are never resized, we need to update them separately */ if (requires_clearing) { @@ -1179,19 +1198,9 @@ frameDrawWin (Client * c) 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]); - xfwmPixmapFree (&frame_pix.pm_sides[SIDE_LEFT]); - xfwmPixmapFree (&frame_pix.pm_sides[SIDE_RIGHT]); } else { - if (xfwmWindowVisible (&c->title)) - { - xfwmWindowHide (&c->title); - } for (i = 0; i < 4; i++) { if (MYWINDOW_XWINDOW (c->sides[i]) && xfwmWindowVisible (&c->sides[i])) @@ -1206,15 +1215,13 @@ frameDrawWin (Client * c) xfwmWindowHide (&c->corners[i]); } } - for (i = 0; i < BUTTON_COUNT; i++) - { - if (MYWINDOW_XWINDOW (c->buttons[i]) && xfwmWindowVisible (&c->buttons[i])) - { - xfwmWindowHide (&c->buttons[i]); - } - } frameSetShape (c, 0, NULL, 0); } + 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]); } static gboolean -- 1.8.4.2 From 313221042805bfa95d9c7df96208132f94261e3b Mon Sep 17 00:00:00 2001 From: cedric Date: Thu, 8 Aug 2013 23:06:13 +0200 Subject: [PATCH 4/4] force redraw titleless maximized window when resizing to show title --- src/moveresize.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/moveresize.c b/src/moveresize.c index a98bdf7..39a8403 100644 --- a/src/moveresize.c +++ b/src/moveresize.c @@ -1624,6 +1624,7 @@ clientResize (Client * c, int handle, XEvent * ev) XWindowChanges wc; MoveResizeData passdata; int w_orig, h_orig; + unsigned long configure_flags; Cursor cursor; gboolean g1, g2; @@ -1752,9 +1753,17 @@ clientResize (Client * c, int handle, XEvent * ev) /* Set window opacity to its original value */ clientSetOpacity (c, c->opacity, OPACITY_RESIZE, 0); + configure_flags = NO_CFG_FLAG; + if (FLAG_TEST (c->flags, CLIENT_FLAG_MAXIMIZED) && ((w_orig != c->width) || (h_orig != c->height))) { + if (c->screen_info->params->titleless_maximize) + { + /* force redraw titleless window when maximized and resized */ + configure_flags = CFG_FORCE_REDRAW; + } + clientRemoveMaximizeFlag (c); } @@ -1762,7 +1771,7 @@ clientResize (Client * c, int handle, XEvent * ev) wc.y = c->y; wc.width = c->width; wc.height = c->height; - clientConfigure (c, &wc, CWX | CWY | CWHeight | CWWidth, NO_CFG_FLAG); + clientConfigure (c, &wc, CWX | CWY | CWHeight | CWWidth, configure_flags); #ifdef HAVE_XSYNC clientXSyncClearTimeout (c); c->xsync_waiting = FALSE; -- 1.8.4.2