From 3cc36b3503bb1e678c75206b5f96d1eebf9682cd Mon Sep 17 00:00:00 2001 From: AK-47 Date: Tue, 21 May 2019 09:40:10 +0000 Subject: [PATCH] Allow the top of the frame to be cropped when maximised. This will not break existing themes, but themes can now take advantage of a new parameter called frame_border_top. --- src/frame.c | 38 +++++++++++++++++++++++++++----------- src/frame.h | 1 + src/settings.c | 3 +++ src/settings.h | 1 + 4 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/frame.c b/src/frame.c index d3ddfec8..51b0df91 100644 --- a/src/frame.c +++ b/src/frame.c @@ -82,6 +82,22 @@ frameDecorationBottom (ScreenInfo *screen_info) } int +frameCropTop (Client * c) +{ + g_return_val_if_fail (c != NULL, 0); + TRACE ("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_ALL (c->flags, CLIENT_FLAG_MAXIMIZED) + && (c->screen_info->params->borderless_maximize)) + { + return c->screen_info->params->frame_border_top; + } + return 0; +} + +int frameLeft (Client * c) { g_return_val_if_fail (c != NULL, 0); @@ -121,7 +137,7 @@ frameTop (Client * c) if (CLIENT_HAS_FRAME (c)) { - return c->screen_info->title[TITLE_3][ACTIVE].height; + return frameDecorationTop(c->screen_info) - frameCropTop (c); } return 0; } @@ -377,7 +393,7 @@ 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)); + xfwmPixmapFill (&screen_info->title[part][state], title_pm, x, 0, w, frameDecorationTop(screen_info)); } static void @@ -453,10 +469,10 @@ 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 = voffset + (frameDecorationTop(screen_info) - title_height) / 2; + if (title_y + title_height > frameDecorationTop(screen_info)) { - title_y = MAX (0, frameTop (c) - title_height); + title_y = MAX (0, frameDecorationTop(screen_info) - title_height); } if (!xfwmPixmapNone(&screen_info->top[3][ACTIVE])) @@ -465,7 +481,7 @@ frameCreateTitlePixmap (Client * c, int state, int left, int right, xfwmPixmap * } else { - top_height = frameTop (c) / 10 + 1; + top_height = frameDecorationTop(screen_info) / 10 + 1; if (top_height > title_y - 1) { top_height = MAX (title_y - 1, 0); @@ -533,7 +549,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, frameDecorationTop(screen_info)); surface = xfwmPixmapCreateSurface (title_pm, FALSE); cr = cairo_create (surface); @@ -1098,7 +1114,7 @@ frameDrawWin (Client * c) xfwmWindowSetBG (&c->buttons[button], my_pixmap); } xfwmWindowShow (&c->buttons[button], x, - (frameTop (c) - screen_info->buttons[button][state].height + 1) / 2, + ((frameDecorationTop(screen_info) - screen_info->buttons[button][state].height + 1) / 2) - frameCropTop (c), screen_info->buttons[button][state].width, screen_info->buttons[button][state].height, TRUE); button_x[button] = x; @@ -1135,7 +1151,7 @@ frameDrawWin (Client * c) 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, + ((frameDecorationTop(screen_info) - screen_info->buttons[button][state].height + 1) / 2) - frameCropTop (c), screen_info->buttons[button][state].width, screen_info->buttons[button][state].height, TRUE); button_x[button] = x; @@ -1168,8 +1184,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), 0 - frameCropTop (c), top_width, + frameDecorationTop(screen_info), (requires_clearing | width_changed)); /* Corners are never resized, we need to update them separately */ if (requires_clearing) diff --git a/src/frame.h b/src/frame.h index 6f34304f..9e2fd1e0 100644 --- a/src/frame.h +++ b/src/frame.h @@ -36,6 +36,7 @@ int frameDecorationLeft (ScreenInfo *); int frameDecorationRight (ScreenInfo *); int frameDecorationTop (ScreenInfo *); int frameDecorationBottom (ScreenInfo *); +int frameCropTop (Client *); int frameLeft (Client *); int frameRight (Client *); int frameTop (Client *); diff --git a/src/settings.c b/src/settings.c index 7dbcffc6..d60b7a20 100644 --- a/src/settings.c +++ b/src/settings.c @@ -523,6 +523,7 @@ loadTheme (ScreenInfo *screen_info, Settings *rc) strncpy (screen_info->params->button_layout, getStringValue ("button_layout", rc), BUTTON_STRING_COUNT); screen_info->params->button_spacing = getIntValue ("button_spacing", rc); screen_info->params->button_offset = getIntValue ("button_offset", rc); + screen_info->params->frame_border_top = getIntValue ("frame_border_top", rc); screen_info->params->maximized_offset = getIntValue ("maximized_offset", rc); screen_info->params->title_vertical_offset_active = getIntValue ("title_vertical_offset_active", rc); @@ -668,6 +669,7 @@ loadSettings (ScreenInfo *screen_info) {"focus_hint", NULL, G_TYPE_BOOLEAN, TRUE}, {"focus_new", NULL, G_TYPE_BOOLEAN,TRUE}, {"frame_opacity", NULL, G_TYPE_INT, TRUE}, + {"frame_border_top", NULL, G_TYPE_INT, TRUE}, {"full_width_title", NULL, G_TYPE_BOOLEAN, TRUE}, {"horiz_scroll_opacity", NULL, G_TYPE_BOOLEAN, FALSE}, {"inactive_opacity", NULL, G_TYPE_INT, TRUE}, @@ -1202,6 +1204,7 @@ cb_xfwm4_channel_property_changed(XfconfChannel *channel, const gchar *property_ || (!strcmp (name, "button_spacing")) || (!strcmp (name, "double_click_time")) || (!strcmp (name, "double_DOUBLE_CLICKclick_distance")) + || (!strcmp (name, "frame_border_top")) || (!strcmp (name, "maximized_offset")) || (!strcmp (name, "shadow_delta_height")) || (!strcmp (name, "shadow_delta_width")) diff --git a/src/settings.h b/src/settings.h index 334acdd4..ad006369 100644 --- a/src/settings.h +++ b/src/settings.h @@ -176,6 +176,7 @@ struct _XfwmParams guint easy_click; int focus_delay; int frame_opacity; + int frame_border_top; int inactive_opacity; int maximized_offset; int move_opacity; -- 2.11.0