From 34caa7898197cceab366a5bb42616d7bacf5bb9d Mon Sep 17 00:00:00 2001 From: cedric Date: Sat, 17 Aug 2013 23:20:40 +0200 Subject: [PATCH 01/11] 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 02/11] 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 03/11] 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 04/11] 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 From 8a356724992503045d56d527d654fda2e3741948 Mon Sep 17 00:00:00 2001 From: cedric Date: Sun, 11 Aug 2013 00:22:52 +0200 Subject: [PATCH 05/11] sparse draw button code in a new function frameDrawButtons --- src/frame.c | 205 ++++++++++++++++++++++++++++++++---------------------------- 1 file changed, 110 insertions(+), 95 deletions(-) diff --git a/src/frame.c b/src/frame.c index 297bf84..e157951 100644 --- a/src/frame.c +++ b/src/frame.c @@ -872,15 +872,113 @@ frameSetShapeInput (Client * c) } static void +frameDrawButtons (Client * c, int state, int *left, int *right, int button_x[BUTTON_COUNT]) +{ + ScreenInfo *screen_info; + xfwmPixmap *my_pixmap; + gint x, button; + guint i, j; + + TRACE ("entering frameDrawButtons"); + TRACE ("drawing title for \"%s\" (0x%lx)", c->name, c->window); + + screen_info = c->screen_info; + + /* First, hide the buttons that we don't have... */ + for (i = 0; i < BUTTON_COUNT; i++) + { + char b = getLetterFromButton (i, c); + if ((!b) || !strchr (screen_info->params->button_layout, b)) + { + xfwmWindowHide (&c->buttons[i]); + } + } + + /* 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++) + { + button = getButtonFromLetter (screen_info->params->button_layout[i], c); + if (button == TITLE_SEPARATOR) + { + 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 + { + xfwmWindowHide (&c->buttons[button]); + } + } + } + *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) + { + 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; +} + +static void frameDrawWin (Client * c) { ScreenInfo *screen_info; FramePixmap frame_pix; - xfwmPixmap *my_pixmap; - gint state, x, button, left, right; + gint state, left, right; gint top_width, bottom_width, left_height, right_height; - gint button_x[BUTTON_COUNT]; - guint i, j; + gint button_x[BUTTON_COUNT] = {0}; + guint i; gboolean requires_clearing; gboolean width_changed; gboolean height_changed; @@ -977,97 +1075,14 @@ frameDrawWin (Client * c) && !(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++) - { - char b = getLetterFromButton (i, c); - if ((!b) || !strchr (screen_info->params->button_layout, b)) - { - xfwmWindowHide (&c->buttons[i]); - } - } - - /* 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++) - { - button = getButtonFromLetter (screen_info->params->button_layout[i], c); - if (button == TITLE_SEPARATOR) - { - 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 - { - xfwmWindowHide (&c->buttons[button]); - } - } - } - 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) - { - 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; - - /* 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)); + frameDrawButtons(c, state, &left, &right, button_x); + + /* 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 { -- 1.8.4.2 From cf51711b0aa0401bb3ac167cbe4979895cf30f8a Mon Sep 17 00:00:00 2001 From: cedric Date: Sun, 11 Aug 2013 15:48:36 +0200 Subject: [PATCH 06/11] change top border creation for hiding capabilities (add frameTopBorder and frameTitle functions) --- src/frame.c | 163 +++++++++++++++++++++++++++++++++++++++++++----------------- src/frame.h | 2 + 2 files changed, 119 insertions(+), 46 deletions(-) diff --git a/src/frame.c b/src/frame.c index e157951..0db1c0b 100644 --- a/src/frame.c +++ b/src/frame.c @@ -70,7 +70,7 @@ frameDecorationTop (ScreenInfo *screen_info) TRACE ("entering frameDecorationTop"); g_return_val_if_fail (screen_info != NULL, 0); - return screen_info->title[TITLE_3][ACTIVE].height; + return screen_info->title[TITLE_3][ACTIVE].height + screen_info->top[TITLE_3][ACTIVE].height; } int @@ -114,6 +114,50 @@ frameRight (Client * c) return 0; } +/* frame of the top border */ +int +frameTopBorder (Client * c) +{ + TRACE ("entering frameTopBorder"); + + 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->titleless_maximize)) + { + return 0; + } + /* test if top_3_active.xpm exist */ + else if (!xfwmPixmapNone(&c->screen_info->top[3][ACTIVE])) + { + return c->screen_info->top[3][ACTIVE].height; + } + return c->screen_info->title[TITLE_3][ACTIVE].height / 10 + 1; +} + +/* frame of the title without top border */ +int +frameTitle (Client * c) +{ + TRACE ("entering frameTitle"); + + 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->titleless_maximize)) + { + return 0; + } + else if (!xfwmPixmapNone(&c->screen_info->top[3][ACTIVE])) + { + return c->screen_info->title[TITLE_3][ACTIVE].height; + } + return c->screen_info->title[TITLE_3][ACTIVE].height - c->screen_info->title[TITLE_3][ACTIVE].height / 10 - 1; +} + +/* frameTop = frameTopBorder + frameTitle */ int frameTop (Client * c) { @@ -121,11 +165,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_ALL (c->flags, CLIENT_FLAG_MAXIMIZED) - && c->screen_info->params->titleless_maximize)) + && !FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN)) { - return c->screen_info->title[TITLE_3][ACTIVE].height; + return frameTopBorder (c) + frameTitle (c); } return 0; } @@ -255,12 +297,40 @@ frameButtonOffset (Client *c) return c->screen_info->params->button_offset; } +static int +frameButtonY (Client *c, int state, int button) +{ + int y; + + TRACE ("entering frameButtonY"); + + g_return_val_if_fail (c != NULL, 0); + y = (c->screen_info->top[TITLE_5][state].height + c->screen_info->title[TITLE_5][state].height - c->screen_info->buttons[button][state].height + 1) / 2; + if (FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED) + && (c->screen_info->params->borderless_maximize)) + { + /* show the button pixmap correctly */ + if (!xfwmPixmapNone(&c->screen_info->top[3][state])) + { + return y - c->screen_info->top[TITLE_5][ACTIVE].height; + } + else + { + return y - c->screen_info->title[TITLE_5][ACTIVE].height / 10 - 1; + } + } + else + { + return y; + } +} + static void -frameFillTitlePixmap (Client * c, int state, int part, int x, int w, int h, xfwmPixmap * title_pm, xfwmPixmap * top_pm) +frameFillTopPixmap (Client * c, int state, int part, int x, int w, int h, xfwmPixmap * title_pm, xfwmPixmap * top_pm) { ScreenInfo *screen_info; - TRACE ("entering frameFillTitlePixmap"); + TRACE ("entering frameFillTopPixmap"); g_return_if_fail (c); g_return_if_fail (title_pm); @@ -276,7 +346,23 @@ frameFillTitlePixmap (Client * c, int state, int part, int x, int w, int h, xfwm { xfwmPixmapFill (&screen_info->title[part][state], top_pm, x, 0, w, h); } - xfwmPixmapFill (&screen_info->title[part][state], title_pm, x, 0, w, frameTop (c)); +} + +static void +frameFillTitlePixmap (Client * c, int state, int part, int x, int w, int h, xfwmPixmap * title_pm, xfwmPixmap * top_pm) +{ + ScreenInfo *screen_info; + + TRACE ("entering frameFillTitlePixmap"); + + g_return_if_fail (c); + g_return_if_fail (title_pm); + g_return_if_fail (top_pm); + + screen_info = c->screen_info; + + frameFillTopPixmap (c, state, part, x, w, h, title_pm, top_pm); + xfwmPixmapFill (&screen_info->title[part][state], title_pm, x, 0, w, frameTitle (c)); } static void @@ -353,24 +439,11 @@ frameCreateTitlePixmap (Client * c, int state, int left, int right, xfwmPixmap * */ title_height = logical_rect.height; } - title_y = voffset + (frameTop (c) - title_height) / 2; - if (title_y + title_height > frameTop (c)) - { - title_y = MAX (0, frameTop (c) - title_height); - } - if (!xfwmPixmapNone(&screen_info->top[3][ACTIVE])) - { - top_height = screen_info->top[3][ACTIVE].height; - } - else - { - top_height = frameTop (c) / 10 + 1; - if (top_height > title_y - 1) - { - top_height = MAX (title_y - 1, 0); - } - } + top_height = frameTopBorder (c); + + /* center the title in the frameTitle space (top border is not included) */ + title_y = MAX (0, voffset + (frameTitle (c) - title_height - 2) / 2); w1 = 0; w2 = screen_info->title[TITLE_2][state].width; @@ -433,7 +506,7 @@ frameCreateTitlePixmap (Client * c, int state, int left, int right, xfwmPixmap * } xfwmPixmapCreate (screen_info, top_pm, width, top_height); - xfwmPixmapCreate (screen_info, title_pm, width, frameTop (c)); + xfwmPixmapCreate (screen_info, title_pm, width, frameTitle (c)); gpixmap = gdk_pixmap_foreign_new (title_pm->pixmap); gdk_drawable_set_colormap (gpixmap, gdk_screen_get_rgb_colormap (screen_info->gscr)); gc = gdk_gc_new (gpixmap); @@ -706,24 +779,24 @@ frameSetShape (Client * c, int state, FramePixmap * frame_pix, int button_x[BUTT } if (xfwmWindowVisible (&c->corners[CORNER_TOP_LEFT]) && - (screen_info->corners[CORNER_TOP_LEFT][state].height > frameHeight (c) - frameBottom (c) + 1)) + (frameTop (c) > frameHeight (c) - frameBottom (c) + 1)) { rect.x = 0; rect.y = frameHeight (c) - frameBottom (c) + 1; rect.width = frameTopLeftWidth (c, state); - rect.height = screen_info->corners[CORNER_TOP_LEFT][state].height + rect.height = frameTop (c) - (frameHeight (c) - frameBottom (c) + 1); XShapeCombineRectangles (display_info->dpy, MYWINDOW_XWINDOW (c->corners[CORNER_TOP_LEFT]), ShapeBounding, 0, 0, &rect, 1, ShapeSubtract, 0); } if (xfwmWindowVisible (&c->corners[CORNER_TOP_RIGHT]) && - (screen_info->corners[CORNER_TOP_RIGHT][state].height > frameHeight (c) - frameBottom (c) + 1)) + (frameTop (c) > frameHeight (c) - frameBottom (c) + 1)) { rect.x = 0; rect.y = frameHeight (c) - frameBottom (c) + 1; rect.width = frameTopRightWidth (c, state); - rect.height = screen_info->corners[CORNER_TOP_RIGHT][state].height + rect.height = frameTop (c) - (frameHeight (c) - frameBottom (c) + 1); XShapeCombineRectangles (display_info->dpy, MYWINDOW_XWINDOW (c->corners[CORNER_TOP_RIGHT]), ShapeBounding, 0, 0, &rect, 1, ShapeSubtract, 0); @@ -771,7 +844,7 @@ frameSetShape (Client * c, int state, FramePixmap * frame_pix, int button_x[BUTT if (xfwmWindowVisible (&c->title)) { XShapeCombineShape (display_info->dpy, screen_info->shape_win, ShapeBounding, - frameTopLeftWidth (c, state), 0, + frameTopLeftWidth (c, state), frameTopBorder(c), MYWINDOW_XWINDOW (c->title), ShapeBounding, ShapeUnion); } @@ -825,7 +898,7 @@ frameSetShape (Client * c, int state, FramePixmap * frame_pix, int button_x[BUTT if (xfwmWindowVisible (&c->buttons[i])) { XShapeCombineShape (display_info->dpy, screen_info->shape_win, ShapeBounding, button_x[i], - (frameTop (c) - screen_info->buttons[i][state].height + 1) / 2, + frameTopBorder (c), MYWINDOW_XWINDOW (c->buttons[i]), ShapeBounding, ShapeUnion); } } @@ -880,7 +953,6 @@ frameDrawButtons (Client * c, int state, int *left, int *right, int button_x[BUT guint i, j; TRACE ("entering frameDrawButtons"); - TRACE ("drawing title for \"%s\" (0x%lx)", c->name, c->window); screen_info = c->screen_info; @@ -918,7 +990,7 @@ frameDrawButtons (Client * c, int state, int *left, int *right, int button_x[BUT xfwmWindowSetBG (&c->buttons[button], my_pixmap); } xfwmWindowShow (&c->buttons[button], x, - (frameTop (c) - screen_info->buttons[button][state].height + 1) / 2, + frameButtonY (c, state, button), screen_info->buttons[button][state].width, screen_info->buttons[button][state].height, TRUE); button_x[button] = x; @@ -955,7 +1027,7 @@ frameDrawButtons (Client * c, int state, int *left, int *right, int button_x[BUT 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, + frameButtonY (c, state, button), screen_info->buttons[button][state].width, screen_info->buttons[button][state].height, TRUE); button_x[button] = x; @@ -1054,6 +1126,9 @@ frameDrawWin (Client * c) } } + left = frameTopLeftWidth (c, state); + right = frameTopRightWidth (c, state); + top_width = frameWidth (c) - frameTopLeftWidth (c, state) - frameTopRightWidth (c, state); bottom_width = frameWidth (c) - screen_info->corners[CORNER_BOTTOM_LEFT][state].width - @@ -1070,10 +1145,7 @@ frameDrawWin (Client * c) 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_ALL (c->flags, CLIENT_FLAG_MAXIMIZED) - && c->screen_info->params->titleless_maximize)) + if (frameTitle (c) > 0) { frameDrawButtons(c, state, &left, &right, button_x); @@ -1081,8 +1153,8 @@ frameDrawWin (Client * c) 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)); + frameTopLeftWidth (c, state), frameTopBorder (c), top_width, + frameTitle (c), (requires_clearing | width_changed)); } else { @@ -1123,7 +1195,6 @@ frameDrawWin (Client * c) xfwmWindowHide (&c->sides[SIDE_LEFT]); xfwmWindowHide (&c->sides[SIDE_RIGHT]); 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]); @@ -1176,8 +1247,8 @@ frameDrawWin (Client * c) { 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, + frameTopLeftWidth (c, state), + 0, top_width, frameTopBorder (c), (requires_clearing | width_changed)); } else @@ -1187,13 +1258,13 @@ frameDrawWin (Client * c) xfwmWindowShow (&c->corners[CORNER_TOP_LEFT], 0, 0, frameTopLeftWidth (c, state), - screen_info->corners[CORNER_TOP_LEFT][state].height, + frameTop (c), 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, + frameTop (c), requires_clearing); xfwmWindowShow (&c->corners[CORNER_BOTTOM_LEFT], 0, diff --git a/src/frame.h b/src/frame.h index 9e40eef..df5c07d 100644 --- a/src/frame.h +++ b/src/frame.h @@ -38,6 +38,8 @@ int frameDecorationTop (ScreenInfo *); int frameDecorationBottom (ScreenInfo *); int frameLeft (Client *); int frameRight (Client *); +int frameTopBorder (Client *); +int frameTitle (Client *); int frameTop (Client *); int frameBottom (Client *); int frameX (Client *); -- 1.8.4.2 From 6b560df177d3bd40bdceac00c51bb0e2993b2229 Mon Sep 17 00:00:00 2001 From: cedric Date: Sun, 18 Aug 2013 00:54:33 +0200 Subject: [PATCH 07/11] enable hiding top border when maximized --- src/frame.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/frame.c b/src/frame.c index 0db1c0b..129f7a2 100644 --- a/src/frame.c +++ b/src/frame.c @@ -124,7 +124,7 @@ frameTopBorder (Client * c) 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->titleless_maximize)) + && c->screen_info->params->borderless_maximize)) { return 0; } @@ -361,8 +361,12 @@ frameFillTitlePixmap (Client * c, int state, int part, int x, int w, int h, xfwm screen_info = c->screen_info; + if (!(FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED) + && c->screen_info->params->borderless_maximize)) + { frameFillTopPixmap (c, state, part, x, w, h, title_pm, top_pm); - xfwmPixmapFill (&screen_info->title[part][state], title_pm, x, 0, w, frameTitle (c)); + } + xfwmPixmapFill (&screen_info->title[part][state], title_pm, x, 0, w, frameTitle (c)); } static void @@ -505,7 +509,6 @@ frameCreateTitlePixmap (Client * c, int state, int left, int right, xfwmPixmap * } } - xfwmPixmapCreate (screen_info, top_pm, width, top_height); xfwmPixmapCreate (screen_info, title_pm, width, frameTitle (c)); gpixmap = gdk_pixmap_foreign_new (title_pm->pixmap); gdk_drawable_set_colormap (gpixmap, gdk_screen_get_rgb_colormap (screen_info->gscr)); @@ -1144,6 +1147,11 @@ frameDrawWin (Client * c) xfwmPixmapInit (screen_info, &frame_pix.pm_sides[SIDE_LEFT]); xfwmPixmapInit (screen_info, &frame_pix.pm_sides[SIDE_RIGHT]); + if (frameTopBorder (c) > 0) + { + xfwmPixmapCreate (screen_info, &frame_pix.pm_sides[SIDE_TOP], top_width, frameTopBorder (c)); + } + /* test if the title have to be displayed */ if (frameTitle (c) > 0) { @@ -1158,6 +1166,13 @@ frameDrawWin (Client * c) } else { + if (!(FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED) + && (c->screen_info->params->borderless_maximize))) + { + frameFillTopPixmap (c, state, TITLE_1, 0, top_width / 2, frameTopBorder (c), &frame_pix.pm_title, &frame_pix.pm_sides[SIDE_TOP]); + frameFillTopPixmap (c, state, TITLE_5, top_width / 2, top_width -top_width / 2, frameTopBorder (c), &frame_pix.pm_title, &frame_pix.pm_sides[SIDE_TOP]); + } + /* hide the title and buttons */ if (xfwmWindowVisible (&c->title)) { @@ -1195,6 +1210,7 @@ frameDrawWin (Client * c) xfwmWindowHide (&c->sides[SIDE_LEFT]); xfwmWindowHide (&c->sides[SIDE_RIGHT]); 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]); -- 1.8.4.2 From 21259bf048dc482c7162ec79f04c9176d1ab9565 Mon Sep 17 00:00:00 2001 From: cedric Date: Sun, 18 Aug 2013 12:32:19 +0200 Subject: [PATCH 08/11] split title-*.xpm into title and top border part if top-3-active.xpm don't exist --- src/frame.c | 60 +++++++-------------------------------- src/mypixmap.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++----------- src/mypixmap.h | 8 ++++++ src/settings.c | 39 ++++++++++++++++++------- 4 files changed, 121 insertions(+), 76 deletions(-) diff --git a/src/frame.c b/src/frame.c index 129f7a2..5dca99c 100644 --- a/src/frame.c +++ b/src/frame.c @@ -128,12 +128,7 @@ frameTopBorder (Client * c) { return 0; } - /* test if top_3_active.xpm exist */ - else if (!xfwmPixmapNone(&c->screen_info->top[3][ACTIVE])) - { - return c->screen_info->top[3][ACTIVE].height; - } - return c->screen_info->title[TITLE_3][ACTIVE].height / 10 + 1; + return c->screen_info->top[3][ACTIVE].height; } /* frame of the title without top border */ @@ -150,11 +145,7 @@ frameTitle (Client * c) { return 0; } - else if (!xfwmPixmapNone(&c->screen_info->top[3][ACTIVE])) - { - return c->screen_info->title[TITLE_3][ACTIVE].height; - } - return c->screen_info->title[TITLE_3][ACTIVE].height - c->screen_info->title[TITLE_3][ACTIVE].height / 10 - 1; + return c->screen_info->title[TITLE_3][ACTIVE].height; } /* frameTop = frameTopBorder + frameTitle */ @@ -307,17 +298,10 @@ frameButtonY (Client *c, int state, int button) g_return_val_if_fail (c != NULL, 0); y = (c->screen_info->top[TITLE_5][state].height + c->screen_info->title[TITLE_5][state].height - c->screen_info->buttons[button][state].height + 1) / 2; if (FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED) - && (c->screen_info->params->borderless_maximize)) + && c->screen_info->params->borderless_maximize) { /* show the button pixmap correctly */ - if (!xfwmPixmapNone(&c->screen_info->top[3][state])) - { - return y - c->screen_info->top[TITLE_5][ACTIVE].height; - } - else - { - return y - c->screen_info->title[TITLE_5][ACTIVE].height / 10 - 1; - } + return y - c->screen_info->top[TITLE_5][ACTIVE].height; } else { @@ -326,29 +310,6 @@ frameButtonY (Client *c, int state, int button) } static void -frameFillTopPixmap (Client * c, int state, int part, int x, int w, int h, xfwmPixmap * title_pm, xfwmPixmap * top_pm) -{ - ScreenInfo *screen_info; - - TRACE ("entering frameFillTopPixmap"); - - g_return_if_fail (c); - g_return_if_fail (title_pm); - g_return_if_fail (top_pm); - - screen_info = c->screen_info; - - if (!xfwmPixmapNone(&screen_info->top[part][state])) - { - xfwmPixmapFill (&screen_info->top[part][state], top_pm, x, 0, w, h); - } - else - { - xfwmPixmapFill (&screen_info->title[part][state], top_pm, x, 0, w, h); - } -} - -static void frameFillTitlePixmap (Client * c, int state, int part, int x, int w, int h, xfwmPixmap * title_pm, xfwmPixmap * top_pm) { ScreenInfo *screen_info; @@ -362,9 +323,9 @@ frameFillTitlePixmap (Client * c, int state, int part, int x, int w, int h, xfwm screen_info = c->screen_info; if (!(FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED) - && c->screen_info->params->borderless_maximize)) + && c->screen_info->params->borderless_maximize)) { - frameFillTopPixmap (c, state, part, x, w, h, title_pm, top_pm); + xfwmPixmapFill (&screen_info->top[part][state], top_pm, x, 0, w, h); } xfwmPixmapFill (&screen_info->title[part][state], title_pm, x, 0, w, frameTitle (c)); } @@ -1166,11 +1127,12 @@ frameDrawWin (Client * c) } else { - if (!(FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED) - && (c->screen_info->params->borderless_maximize))) + /* hide title but display top border */ + if (FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED) + && !c->screen_info->params->borderless_maximize) { - frameFillTopPixmap (c, state, TITLE_1, 0, top_width / 2, frameTopBorder (c), &frame_pix.pm_title, &frame_pix.pm_sides[SIDE_TOP]); - frameFillTopPixmap (c, state, TITLE_5, top_width / 2, top_width -top_width / 2, frameTopBorder (c), &frame_pix.pm_title, &frame_pix.pm_sides[SIDE_TOP]); + xfwmPixmapFill (&c->screen_info->top[TITLE_1][state], &frame_pix.pm_sides[SIDE_TOP], 0, 0, top_width / 2, frameTopBorder (c)); + xfwmPixmapFill (&c->screen_info->top[TITLE_5][state], &frame_pix.pm_sides[SIDE_TOP], top_width / 2, 0, top_width - top_width / 2, frameTopBorder (c)); } /* hide the title and buttons */ diff --git a/src/mypixmap.c b/src/mypixmap.c index bfec217..8ad77b7 100644 --- a/src/mypixmap.c +++ b/src/mypixmap.c @@ -932,20 +932,13 @@ xfwmPixmapRenderGdkPixbuf (xfwmPixmap * pm, GdkPixbuf *pixbuf) return TRUE; } -gboolean -xfwmPixmapLoad (ScreenInfo * screen_info, xfwmPixmap * pm, const gchar * dir, const gchar * file, xfwmColorSymbol * cs) +GdkPixbuf * +xfwmPixbufLoad (const gchar * dir, const gchar * file, xfwmColorSymbol * cs) { gchar *filename; gchar *filexpm; GdkPixbuf *pixbuf; - TRACE ("entering xfwmPixmapLoad"); - - g_return_val_if_fail (pm != NULL, FALSE); - g_return_val_if_fail (dir != NULL, FALSE); - g_return_val_if_fail (file != NULL, FALSE); - - xfwmPixmapInit (screen_info, pm); /* * Always try to load the XPM first, using our own routine * that supports XPM color symbol susbstitution (used to @@ -959,6 +952,36 @@ xfwmPixmapLoad (ScreenInfo * screen_info, xfwmPixmap * pm, const gchar * dir, co /* Compose with other image formats, if any available. */ pixbuf = xfwmPixmapCompose (pixbuf, dir, file); + return pixbuf; +} + +static void +pixmap_create_from_pixbuf (ScreenInfo * screen_info, GdkPixbuf *pixbuf, xfwmPixmap * pm) +{ + xfwmPixmapCreate (screen_info, pm, + gdk_pixbuf_get_width (pixbuf), + gdk_pixbuf_get_height (pixbuf)); + xfwmPixmapDrawFromGdkPixbuf (pm, pixbuf); + +#ifdef HAVE_RENDER + xfwmPixmapRefreshPict (pm); +#endif + g_object_unref (pixbuf); +} + +gboolean +xfwmPixmapLoad (ScreenInfo * screen_info, xfwmPixmap * pm, const gchar * dir, const gchar * file, xfwmColorSymbol * cs) +{ + GdkPixbuf *pixbuf; + + TRACE ("entering xfwmPixmapLoad"); + + g_return_val_if_fail (pm != NULL, FALSE); + g_return_val_if_fail (dir != NULL, FALSE); + g_return_val_if_fail (file != NULL, FALSE); + + xfwmPixmapInit (screen_info, pm); + pixbuf = xfwmPixbufLoad (dir, file, cs); if (!pixbuf) { /* @@ -968,15 +991,48 @@ xfwmPixmapLoad (ScreenInfo * screen_info, xfwmPixmap * pm, const gchar * dir, co */ return FALSE; } - xfwmPixmapCreate (screen_info, pm, - gdk_pixbuf_get_width (pixbuf), - gdk_pixbuf_get_height (pixbuf)); - xfwmPixmapDrawFromGdkPixbuf (pm, pixbuf); -#ifdef HAVE_RENDER - xfwmPixmapRefreshPict (pm); -#endif - g_object_unref (pixbuf); + pixmap_create_from_pixbuf (screen_info, pixbuf, pm); + + return TRUE; +} + +gboolean +xfwmPixmapSplit (ScreenInfo * screen_info,xfwmPixmap * pmA, int h, xfwmPixmap * pmB, const gchar * dir, const gchar * file, xfwmColorSymbol * cs) +{ + GdkPixbuf *pixbuf; + GdkPixbuf *pixbufA; + GdkPixbuf *pixbufB; + + TRACE ("entering xfwmPixmapSplit"); + + g_return_val_if_fail (pmA != NULL, FALSE); + g_return_val_if_fail (pmB != NULL, FALSE); + g_return_val_if_fail (dir != NULL, FALSE); + g_return_val_if_fail (file != NULL, FALSE); + + xfwmPixmapInit (screen_info, pmA); + xfwmPixmapInit (screen_info, pmB); + pixbuf = xfwmPixbufLoad (dir, file, cs); + + if (!pixbuf) + { + /* + * Cannot find a suitable image format for some part, + * it's not critical though as most themes are missing + * buttons + */ + return FALSE; + } + + pixbufA = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, gdk_pixbuf_get_width (pixbuf), h); + pixbufB = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, gdk_pixbuf_get_width (pixbuf), gdk_pixbuf_get_height (pixbuf) - h); + + gdk_pixbuf_copy_area (pixbuf, 0, 0, gdk_pixbuf_get_width (pixbuf), h, pixbufA, 0, 0); + gdk_pixbuf_copy_area (pixbuf, 0, h, gdk_pixbuf_get_width (pixbuf), gdk_pixbuf_get_height (pixbuf) - h, pixbufB, 0, 0); + + pixmap_create_from_pixbuf (screen_info, pixbufA, pmA); + pixmap_create_from_pixbuf (screen_info, pixbufB, pmB); return TRUE; } diff --git a/src/mypixmap.h b/src/mypixmap.h index 19302bc..7cbf81c 100644 --- a/src/mypixmap.h +++ b/src/mypixmap.h @@ -57,11 +57,19 @@ struct _xfwmPixmap gboolean xfwmPixmapRenderGdkPixbuf (xfwmPixmap *, GdkPixbuf *); +GdkPixbuf * xfwmPixbufLoad (const gchar *, + const gchar *, + xfwmColorSymbol *); gboolean xfwmPixmapLoad (ScreenInfo *, xfwmPixmap *, const gchar *, const gchar *, xfwmColorSymbol *); +gboolean xfwmPixmapSplit (ScreenInfo * screen_info, + xfwmPixmap * pmA, int h, + xfwmPixmap * pmB, const + gchar * dir, const gchar * + file, xfwmColorSymbol * cs); void xfwmPixmapCreate (ScreenInfo *, xfwmPixmap *, gint, diff --git a/src/settings.c b/src/settings.c index 37b6c2a..5a10ac8 100644 --- a/src/settings.c +++ b/src/settings.c @@ -400,7 +400,7 @@ loadTheme (ScreenInfo *screen_info, Settings *rc) gchar *theme; const gchar *font; PangoFontDescription *desc; - guint i, j; + guint i, j, h; widget = myScreenGetGtkWidget (screen_info); display_info = screen_info->display_info; @@ -512,19 +512,38 @@ loadTheme (ScreenInfo *screen_info, Settings *rc) xfwmPixmapLoad (screen_info, &screen_info->buttons[i][j], theme, imagename, colsym); } } - for (i = 0; i < TITLE_COUNT; i++) + + /* test if top-3-active.xpm exist */ + if (fopen (g_build_filename (theme, "top-3-active.xpm", NULL), "rb")) { - g_snprintf(imagename, sizeof (imagename), "title-%d-active", i + 1); - xfwmPixmapLoad (screen_info, &screen_info->title[i][ACTIVE], theme, imagename, colsym); + for (i = 0; i < TITLE_COUNT; i++) + { + g_snprintf(imagename, sizeof (imagename), "title-%d-active", i + 1); + xfwmPixmapLoad (screen_info, &screen_info->title[i][ACTIVE], theme, imagename, colsym); - g_snprintf(imagename, sizeof (imagename), "title-%d-inactive", i + 1); - xfwmPixmapLoad (screen_info, &screen_info->title[i][INACTIVE], theme, imagename, colsym); + g_snprintf(imagename, sizeof (imagename), "title-%d-inactive", i + 1); + xfwmPixmapLoad (screen_info, &screen_info->title[i][INACTIVE], theme, imagename, colsym); - g_snprintf(imagename, sizeof (imagename), "top-%d-active", i + 1); - xfwmPixmapLoad (screen_info, &screen_info->top[i][ACTIVE], theme, imagename, colsym); + g_snprintf(imagename, sizeof (imagename), "top-%d-active", i + 1); + xfwmPixmapLoad (screen_info, &screen_info->top[i][ACTIVE], theme, imagename, colsym); + + g_snprintf(imagename, sizeof (imagename), "top-%d-inactive", i + 1); + xfwmPixmapLoad (screen_info, &screen_info->top[i][INACTIVE], theme, imagename, colsym); + } + } + else + { + /* sets the height of top border from title-3-active */ + h = gdk_pixbuf_get_height (xfwmPixbufLoad (theme, "title-3-active", colsym)) / 10 + 1; + for (i = 0; i < TITLE_COUNT; i++) + { + g_snprintf(imagename, sizeof (imagename), "title-%d-active", i + 1); + xfwmPixmapSplit (screen_info, &screen_info->top[i][ACTIVE], h, &screen_info->title[i][ACTIVE], theme, imagename, colsym); + + g_snprintf(imagename, sizeof (imagename), "title-%d-inactive", i + 1); + xfwmPixmapSplit (screen_info, &screen_info->top[i][INACTIVE], h, &screen_info->title[i][INACTIVE], theme, imagename, colsym); + } - g_snprintf(imagename, sizeof (imagename), "top-%d-inactive", i + 1); - xfwmPixmapLoad (screen_info, &screen_info->top[i][INACTIVE], theme, imagename, colsym); } screen_info->box_gc = createGC (screen_info, "#FFFFFF", GXxor, NULL, 2, TRUE); -- 1.8.4.2 From f683c01cda734c3e5c76332e14016f8d578dca09 Mon Sep 17 00:00:00 2001 From: cedric Date: Sun, 18 Aug 2013 19:03:40 +0200 Subject: [PATCH 09/11] add optional top_border_height parameter --- src/frame.c | 25 +++++++++---------------- src/mypixmap.c | 27 +++++++++++++++------------ src/settings.c | 28 +++++++++++++++++++++++----- src/settings.h | 1 + 4 files changed, 48 insertions(+), 33 deletions(-) diff --git a/src/frame.c b/src/frame.c index 5dca99c..533da10 100644 --- a/src/frame.c +++ b/src/frame.c @@ -70,7 +70,7 @@ frameDecorationTop (ScreenInfo *screen_info) TRACE ("entering frameDecorationTop"); g_return_val_if_fail (screen_info != NULL, 0); - return screen_info->title[TITLE_3][ACTIVE].height + screen_info->top[TITLE_3][ACTIVE].height; + return screen_info->title[TITLE_3][ACTIVE].height + screen_info->params->top_border_height; } int @@ -128,7 +128,7 @@ frameTopBorder (Client * c) { return 0; } - return c->screen_info->top[3][ACTIVE].height; + return c->screen_info->params->top_border_height; } /* frame of the title without top border */ @@ -296,12 +296,12 @@ frameButtonY (Client *c, int state, int button) TRACE ("entering frameButtonY"); g_return_val_if_fail (c != NULL, 0); - y = (c->screen_info->top[TITLE_5][state].height + c->screen_info->title[TITLE_5][state].height - c->screen_info->buttons[button][state].height + 1) / 2; + y = (c->screen_info->params->top_border_height + c->screen_info->title[TITLE_5][state].height - c->screen_info->buttons[button][state].height + 1) / 2; if (FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED) && c->screen_info->params->borderless_maximize) { /* show the button pixmap correctly */ - return y - c->screen_info->top[TITLE_5][ACTIVE].height; + return y - c->screen_info->params->top_border_height; } else { @@ -1221,18 +1221,11 @@ frameDrawWin (Client * c) frameHeight (c) - frameBottom (c), bottom_width, frameBottom (c), (requires_clearing | width_changed)); - if (!xfwmPixmapNone(&frame_pix.pm_sides[SIDE_TOP])) - { - xfwmWindowSetBG (&c->sides[SIDE_TOP], &frame_pix.pm_sides[SIDE_TOP]); - xfwmWindowShow (&c->sides[SIDE_TOP], - frameTopLeftWidth (c, state), - 0, top_width, frameTopBorder (c), - (requires_clearing | width_changed)); - } - else - { - xfwmWindowHide (&c->sides[SIDE_TOP]); - } + xfwmWindowSetBG (&c->sides[SIDE_TOP], &frame_pix.pm_sides[SIDE_TOP]); + xfwmWindowShow (&c->sides[SIDE_TOP], + frameTopLeftWidth (c, state), + 0, top_width, frameTopBorder (c), + (requires_clearing | width_changed)); xfwmWindowShow (&c->corners[CORNER_TOP_LEFT], 0, 0, frameTopLeftWidth (c, state), diff --git a/src/mypixmap.c b/src/mypixmap.c index 8ad77b7..b099f9c 100644 --- a/src/mypixmap.c +++ b/src/mypixmap.c @@ -1006,13 +1006,10 @@ xfwmPixmapSplit (ScreenInfo * screen_info,xfwmPixmap * pmA, int h, xfwmPixmap * TRACE ("entering xfwmPixmapSplit"); - g_return_val_if_fail (pmA != NULL, FALSE); - g_return_val_if_fail (pmB != NULL, FALSE); + g_return_val_if_fail (pmA != NULL && pmB != NULL, FALSE); g_return_val_if_fail (dir != NULL, FALSE); g_return_val_if_fail (file != NULL, FALSE); - xfwmPixmapInit (screen_info, pmA); - xfwmPixmapInit (screen_info, pmB); pixbuf = xfwmPixbufLoad (dir, file, cs); if (!pixbuf) @@ -1025,14 +1022,20 @@ xfwmPixmapSplit (ScreenInfo * screen_info,xfwmPixmap * pmA, int h, xfwmPixmap * return FALSE; } - pixbufA = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, gdk_pixbuf_get_width (pixbuf), h); - pixbufB = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, gdk_pixbuf_get_width (pixbuf), gdk_pixbuf_get_height (pixbuf) - h); - - gdk_pixbuf_copy_area (pixbuf, 0, 0, gdk_pixbuf_get_width (pixbuf), h, pixbufA, 0, 0); - gdk_pixbuf_copy_area (pixbuf, 0, h, gdk_pixbuf_get_width (pixbuf), gdk_pixbuf_get_height (pixbuf) - h, pixbufB, 0, 0); - - pixmap_create_from_pixbuf (screen_info, pixbufA, pmA); - pixmap_create_from_pixbuf (screen_info, pixbufB, pmB); + if (pmA != NULL) + { + xfwmPixmapInit (screen_info, pmA); + pixbufA = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, gdk_pixbuf_get_width (pixbuf), h); + gdk_pixbuf_copy_area (pixbuf, 0, 0, gdk_pixbuf_get_width (pixbuf), h, pixbufA, 0, 0); + pixmap_create_from_pixbuf (screen_info, pixbufA, pmA); + } + if (pmB != NULL) + { + xfwmPixmapInit (screen_info, pmB); + pixbufB = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, gdk_pixbuf_get_width (pixbuf), gdk_pixbuf_get_height (pixbuf) - h); + gdk_pixbuf_copy_area (pixbuf, 0, h, gdk_pixbuf_get_width (pixbuf), gdk_pixbuf_get_height (pixbuf) - h, pixbufB, 0, 0); + pixmap_create_from_pixbuf (screen_info, pixbufB, pmB); + } return TRUE; } diff --git a/src/settings.c b/src/settings.c index 5a10ac8..e3df51b 100644 --- a/src/settings.c +++ b/src/settings.c @@ -400,7 +400,7 @@ loadTheme (ScreenInfo *screen_info, Settings *rc) gchar *theme; const gchar *font; PangoFontDescription *desc; - guint i, j, h; + guint i, j; widget = myScreenGetGtkWidget (screen_info); display_info = screen_info->display_info; @@ -513,6 +513,8 @@ loadTheme (ScreenInfo *screen_info, Settings *rc) } } + screen_info->params->top_border_height = getIntValue ("top_border_height", rc); + /* test if top-3-active.xpm exist */ if (fopen (g_build_filename (theme, "top-3-active.xpm", NULL), "rb")) { @@ -530,18 +532,33 @@ loadTheme (ScreenInfo *screen_info, Settings *rc) g_snprintf(imagename, sizeof (imagename), "top-%d-inactive", i + 1); xfwmPixmapLoad (screen_info, &screen_info->top[i][INACTIVE], theme, imagename, colsym); } + if (!screen_info->params->top_border_height) + { + /* sets the height of top border from top-3-active */ + screen_info->params->top_border_height = screen_info->top[3][ACTIVE].height; + } } else { - /* sets the height of top border from title-3-active */ - h = gdk_pixbuf_get_height (xfwmPixbufLoad (theme, "title-3-active", colsym)) / 10 + 1; + /* sets the height of top border */ + if (!screen_info->params->top_border_height) + { + screen_info->params->top_border_height = gdk_pixbuf_get_height (xfwmPixbufLoad (theme, "title-3-active", colsym)) / 10 + 1; + } + for (i = 0; i < TITLE_COUNT; i++) { g_snprintf(imagename, sizeof (imagename), "title-%d-active", i + 1); - xfwmPixmapSplit (screen_info, &screen_info->top[i][ACTIVE], h, &screen_info->title[i][ACTIVE], theme, imagename, colsym); + xfwmPixmapSplit (screen_info, &screen_info->top[i][ACTIVE], + screen_info->params->top_border_height, + &screen_info->title[i][ACTIVE], + theme, imagename, colsym); g_snprintf(imagename, sizeof (imagename), "title-%d-inactive", i + 1); - xfwmPixmapSplit (screen_info, &screen_info->top[i][INACTIVE], h, &screen_info->title[i][INACTIVE], theme, imagename, colsym); + xfwmPixmapSplit (screen_info, &screen_info->top[i][INACTIVE], + screen_info->params->top_border_height, + &screen_info->title[i][INACTIVE], + theme, imagename, colsym); } } @@ -749,6 +766,7 @@ loadSettings (ScreenInfo *screen_info) {"title_shadow_inactive", NULL, G_TYPE_STRING, TRUE}, {"title_vertical_offset_active", NULL, G_TYPE_INT, TRUE}, {"title_vertical_offset_inactive", NULL, G_TYPE_INT, TRUE}, + {"top_border_height", NULL, G_TYPE_INT, FALSE}, {"toggle_workspaces", NULL, G_TYPE_BOOLEAN, TRUE}, {"unredirect_overlays", NULL, G_TYPE_BOOLEAN, TRUE}, {"urgent_blink", NULL, G_TYPE_BOOLEAN, TRUE}, diff --git a/src/settings.h b/src/settings.h index ea8b79b..1d72161 100644 --- a/src/settings.h +++ b/src/settings.h @@ -195,6 +195,7 @@ struct _XfwmParams int title_alignment; int title_horizontal_offset; int title_shadow[2]; + int top_border_height; int wrap_resistance; gboolean borderless_maximize; gboolean titleless_maximize; -- 1.8.4.2 From c885652ea87a3a2deb48391d0fcec641705cd2af Mon Sep 17 00:00:00 2001 From: cedric Date: Mon, 19 Aug 2013 18:48:32 +0200 Subject: [PATCH 10/11] add optional top_border_maximize parameter --- src/frame.c | 29 +++++++++++++++++------------ src/settings.c | 19 +++++++++++++++++++ src/settings.h | 1 + 3 files changed, 37 insertions(+), 12 deletions(-) diff --git a/src/frame.c b/src/frame.c index 533da10..1dd46ff 100644 --- a/src/frame.c +++ b/src/frame.c @@ -124,7 +124,7 @@ frameTopBorder (Client * c) 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)) + && !c->screen_info->params->top_border_maximize)) { return 0; } @@ -298,7 +298,7 @@ frameButtonY (Client *c, int state, int button) g_return_val_if_fail (c != NULL, 0); y = (c->screen_info->params->top_border_height + c->screen_info->title[TITLE_5][state].height - c->screen_info->buttons[button][state].height + 1) / 2; if (FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED) - && c->screen_info->params->borderless_maximize) + && !c->screen_info->params->top_border_maximize) { /* show the button pixmap correctly */ return y - c->screen_info->params->top_border_height; @@ -323,7 +323,7 @@ frameFillTitlePixmap (Client * c, int state, int part, int x, int w, int h, xfwm screen_info = c->screen_info; if (!(FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED) - && c->screen_info->params->borderless_maximize)) + && !c->screen_info->params->top_border_maximize)) { xfwmPixmapFill (&screen_info->top[part][state], top_pm, x, 0, w, h); } @@ -1129,7 +1129,7 @@ frameDrawWin (Client * c) { /* hide title but display top border */ if (FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED) - && !c->screen_info->params->borderless_maximize) + && c->screen_info->params->top_border_maximize) { xfwmPixmapFill (&c->screen_info->top[TITLE_1][state], &frame_pix.pm_sides[SIDE_TOP], 0, 0, top_width / 2, frameTopBorder (c)); xfwmPixmapFill (&c->screen_info->top[TITLE_5][state], &frame_pix.pm_sides[SIDE_TOP], top_width / 2, 0, top_width - top_width / 2, frameTopBorder (c)); @@ -1167,12 +1167,24 @@ frameDrawWin (Client * c) } if (FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED) + && !c->screen_info->params->top_border_maximize) + { + xfwmWindowHide (&c->sides[SIDE_TOP]); + } + else + { + xfwmWindowSetBG (&c->sides[SIDE_TOP], &frame_pix.pm_sides[SIDE_TOP]); + xfwmWindowShow (&c->sides[SIDE_TOP], + frameTopLeftWidth (c, state), + 0, top_width, frameTopBorder (c), + (requires_clearing | width_changed)); + } + if (FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED) && (c->screen_info->params->borderless_maximize)) { xfwmWindowHide (&c->sides[SIDE_LEFT]); xfwmWindowHide (&c->sides[SIDE_RIGHT]); 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]); @@ -1208,7 +1220,6 @@ frameDrawWin (Client * c) frameWidth (c) - frameRight (c), frameTop (c), frameRight (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], @@ -1221,12 +1232,6 @@ frameDrawWin (Client * c) frameHeight (c) - frameBottom (c), bottom_width, frameBottom (c), (requires_clearing | width_changed)); - xfwmWindowSetBG (&c->sides[SIDE_TOP], &frame_pix.pm_sides[SIDE_TOP]); - xfwmWindowShow (&c->sides[SIDE_TOP], - frameTopLeftWidth (c, state), - 0, top_width, frameTopBorder (c), - (requires_clearing | width_changed)); - xfwmWindowShow (&c->corners[CORNER_TOP_LEFT], 0, 0, frameTopLeftWidth (c, state), frameTop (c), diff --git a/src/settings.c b/src/settings.c index e3df51b..cd22a68 100644 --- a/src/settings.c +++ b/src/settings.c @@ -675,6 +675,7 @@ loadKeyBindings (ScreenInfo *screen_info) gboolean loadSettings (ScreenInfo *screen_info) { + guint i; const gchar *value; Settings rc[] = { /* Do not change the order of the following parameters */ @@ -767,6 +768,7 @@ loadSettings (ScreenInfo *screen_info) {"title_vertical_offset_active", NULL, G_TYPE_INT, TRUE}, {"title_vertical_offset_inactive", NULL, G_TYPE_INT, TRUE}, {"top_border_height", NULL, G_TYPE_INT, FALSE}, + {"top_border_maximize", NULL, G_TYPE_BOOLEAN, FALSE}, {"toggle_workspaces", NULL, G_TYPE_BOOLEAN, TRUE}, {"unredirect_overlays", NULL, G_TYPE_BOOLEAN, TRUE}, {"urgent_blink", NULL, G_TYPE_BOOLEAN, TRUE}, @@ -925,6 +927,23 @@ loadSettings (ScreenInfo *screen_info) workspaceSetCount (screen_info, (guint) MAX (getIntValue ("workspace_count", rc), 1)); } + for (i = 0; rc[i].option; i++) + { + if (!g_ascii_strcasecmp ("top_border_maximize", rc[i].option)) + { + if (rc[i].value == NULL) + { + /* sets top_border_maximize from borderless_maximize param. if NULL */ + screen_info->params->top_border_maximize = + !screen_info->params->borderless_maximize; + } + else + { + screen_info->params->top_border_maximize = getBoolValue ("top_border_maximize", rc); + } + } + } + freeRc (rc); return TRUE; } diff --git a/src/settings.h b/src/settings.h index 1d72161..2438222 100644 --- a/src/settings.h +++ b/src/settings.h @@ -229,6 +229,7 @@ struct _XfwmParams gboolean title_vertical_offset_active; gboolean title_vertical_offset_inactive; gboolean toggle_workspaces; + gboolean top_border_maximize; gboolean unredirect_overlays; gboolean urgent_blink; gboolean use_compositing; -- 1.8.4.2 From ac491946309ce08e1d8dcb4db1477832aadb2956 Mon Sep 17 00:00:00 2001 From: cedric Date: Tue, 15 Oct 2013 22:16:10 +0200 Subject: [PATCH 11/11] disable shading for maximized windows without title --- src/client.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/client.c b/src/client.c index 6eb14d7..0f1b326 100644 --- a/src/client.c +++ b/src/client.c @@ -2664,11 +2664,13 @@ clientShade (Client *c) unsigned long mask; g_return_if_fail (c != NULL); - TRACE ("entering clientToggleShaded"); + TRACE ("entering clientShaded"); TRACE ("shading client \"%s\" (0x%lx)", c->name, c->window); 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)) { TRACE ("cowardly refusing to shade \"%s\" (0x%lx) because it has no border", c->name, c->window); return; @@ -2723,7 +2725,7 @@ clientUnshade (Client *c) DisplayInfo *display_info; g_return_if_fail (c != NULL); - TRACE ("entering clientToggleShaded"); + TRACE ("entering clientUnshaded"); TRACE ("shading/unshading client \"%s\" (0x%lx)", c->name, c->window); if (!FLAG_TEST (c->flags, CLIENT_FLAG_SHADED)) @@ -3224,6 +3226,15 @@ clientToggleMaximized (Client *c, int mode, gboolean restore_position) return FALSE; } + if (FLAG_TEST (c->flags, CLIENT_FLAG_SHADED) + && FLAG_TEST (mode, CLIENT_FLAG_MAXIMIZED) + && !FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED) + && c->screen_info->params->titleless_maximize) + { + /* unshade when client try to maximize shaded window without title */ + clientUnshade (c); + } + screen_info = c->screen_info; display_info = screen_info->display_info; myScreenFindMonitorAtPoint (screen_info, -- 1.8.4.2