This is an automated email from the git hooks/post-receive script. o l i v i e r p u s h e d a c o m m i t t o b r a n c h m a s t e r in repository xfce/xfwm4.
commit 39ef96191273706e8df552117bd2491a329cb68c Author: Olivier Fourdan <four...@xfce.org> Date: Wed May 22 22:03:26 2019 +0200 frame: Set the size of the top resize handle Change the newly added “frame_border_top” setting to set the size of the top resize handle as well. Signed-off-by: Olivier Fourdan <four...@xfce.org> --- src/frame.c | 836 ++++++++++++++++++++++++++++++------------------------------ 1 file changed, 424 insertions(+), 412 deletions(-) diff --git a/src/frame.c b/src/frame.c index 8bac82f..923203b 100644 --- a/src/frame.c +++ b/src/frame.c @@ -45,43 +45,16 @@ typedef struct xfwmPixmap pm_sides[SIDE_COUNT]; } FramePixmap; -int -frameDecorationLeft (ScreenInfo *screen_info) -{ - TRACE ("entering"); - - g_return_val_if_fail (screen_info != NULL, 0); - return screen_info->sides[SIDE_LEFT][ACTIVE].width; -} - -int -frameDecorationRight (ScreenInfo *screen_info) -{ - TRACE ("entering"); - - g_return_val_if_fail (screen_info != NULL, 0); - return screen_info->sides[SIDE_RIGHT][ACTIVE].width; -} - -int -frameDecorationTop (ScreenInfo *screen_info) -{ - TRACE ("entering"); - - g_return_val_if_fail (screen_info != NULL, 0); - return screen_info->title[TITLE_3][ACTIVE].height; -} - -int -frameDecorationBottom (ScreenInfo *screen_info) +static int +frameDecorationBorderTop (ScreenInfo *screen_info) { TRACE ("entering"); g_return_val_if_fail (screen_info != NULL, 0); - return screen_info->sides[SIDE_BOTTOM][ACTIVE].height; + return screen_info->params->frame_border_top; } -int +static int frameBorderTop (Client * c) { g_return_val_if_fail (c != NULL, 0); @@ -92,392 +65,163 @@ frameBorderTop (Client * c) && FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED) && (c->screen_info->params->borderless_maximize)) { - return c->screen_info->params->frame_border_top; + return frameDecorationBorderTop (c->screen_info); } return 0; } -int -frameLeft (Client * c) +static int +frameTopLeftWidth (Client * c, int state) { 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))) + if (FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED) + && c->screen_info->params->borderless_maximize) { - return c->screen_info->sides[SIDE_LEFT][ACTIVE].width; + return 0; } - return 0; + return c->screen_info->corners[CORNER_TOP_LEFT][state].width; + } -int -frameRight (Client * c) +static int +frameTopRightWidth (Client * c, int state) { 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))) + if (FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED) + && c->screen_info->params->borderless_maximize) { - return c->screen_info->sides[SIDE_RIGHT][ACTIVE].width; + return 0; } - return 0; + return c->screen_info->corners[CORNER_TOP_RIGHT][state].width; } -int -frameTop (Client * c) +static int +frameButtonOffset (Client *c) { g_return_val_if_fail (c != NULL, 0); TRACE ("client \"%s\" (0x%lx)", c->name, c->window); - if (CLIENT_HAS_FRAME (c)) + if (FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED) + && c->screen_info->params->borderless_maximize) { - return frameDecorationTop(c->screen_info) - frameBorderTop (c); + return MAX (0, c->screen_info->params->maximized_offset); } - return 0; + return c->screen_info->params->button_offset; } -int -frameBottom (Client * c) +static void +frameFillTitlePixmap (Client * c, int state, int part, int x, int w, int h, xfwmPixmap * title_pm, xfwmPixmap * top_pm) { - g_return_val_if_fail (c != NULL, 0); + ScreenInfo *screen_info; + + g_return_if_fail (c); + g_return_if_fail (title_pm); + g_return_if_fail (top_pm); 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))) + screen_info = c->screen_info; + + if (!xfwmPixmapNone(&screen_info->top[part][state])) { - return c->screen_info->sides[SIDE_BOTTOM][ACTIVE].height; + xfwmPixmapFill (&screen_info->top[part][state], top_pm, x, 0, w, h); } - return 0; -} - -int -frameX (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))) + else { - return c->x - frameLeft (c); + xfwmPixmapFill (&screen_info->title[part][state], top_pm, x, 0, w, h); } - return c->x; + xfwmPixmapFill (&screen_info->title[part][state], title_pm, x, 0, w, frameDecorationTop(screen_info)); } -int -frameY (Client * c) +static void +frameCreateTitlePixmap (Client * c, int state, int left, int right, xfwmPixmap * title_pm, xfwmPixmap * top_pm) { - g_return_val_if_fail (c != NULL, 0); + ScreenInfo *screen_info; + cairo_surface_t *surface; + cairo_t *cr; + PangoLayout *layout; + PangoRectangle logical_rect; + int width, x, hoffset, w1, w2, w3, w4, w5, temp; + int voffset, title_x, title_y; + int title_height, top_height; + + g_return_if_fail (c); + g_return_if_fail (title_pm); + g_return_if_fail (top_pm); 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)) + screen_info = c->screen_info; + + if (left > right) { - return c->y - frameTop (c); + temp = left; + left = right; + right = temp; } - return c->y; -} - -int -frameWidth (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))) + width = frameWidth (c) - frameTopLeftWidth (c, state) - frameTopRightWidth (c, state); + if (width < 1) { - return c->width + frameLeft (c) + frameRight (c); + return; } - return c->width; -} - -int -frameHeight (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_SHADED) - && !FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN)) + if (left < frameTopLeftWidth (c, state)) { - return frameTop (c) + frameBottom (c); + left = frameTopLeftWidth (c, state); } - else if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_BORDER) - && !FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN)) + if (right > frameWidth (c) - frameTopRightWidth (c, state)) { - return c->height + frameTop (c) + frameBottom (c); + right = frameWidth (c) - frameTopRightWidth (c, state); } - return c->height; -} - -int -frameExtentLeft (Client * c) -{ - g_return_val_if_fail (c != NULL, 0); - TRACE ("client \"%s\" (0x%lx)", c->name, c->window); - - if (FLAG_TEST (c->flags, CLIENT_FLAG_HAS_FRAME_EXTENTS)) + if (right < frameTopLeftWidth (c, state)) { - return -c->frame_extents[SIDE_LEFT]; + right = frameTopLeftWidth (c, state); } - return frameLeft(c); -} -int -frameExtentRight (Client * c) -{ - g_return_val_if_fail (c != NULL, 0); - TRACE ("client \"%s\" (0x%lx)", c->name, c->window); + left = left - frameTopLeftWidth (c, state); + right = right - frameTopLeftWidth (c, state); - if (FLAG_TEST (c->flags, CLIENT_FLAG_HAS_FRAME_EXTENTS)) + x = 0; + hoffset = 0; + + if (state == ACTIVE) { - return -c->frame_extents[SIDE_RIGHT]; + voffset = screen_info->params->title_vertical_offset_active; } - return frameRight(c); -} - -int -frameExtentTop (Client * c) -{ - g_return_val_if_fail (c != NULL, 0); - TRACE ("client \"%s\" (0x%lx)", c->name, c->window); - - if (FLAG_TEST (c->flags, CLIENT_FLAG_HAS_FRAME_EXTENTS)) + else { - return -c->frame_extents[SIDE_TOP]; + voffset = screen_info->params->title_vertical_offset_inactive; } - return frameTop(c); -} -int -frameExtentBottom (Client * c) -{ - g_return_val_if_fail (c != NULL, 0); - TRACE ("client \"%s\" (0x%lx)", c->name, c->window); + layout = gtk_widget_create_pango_layout (myScreenGetGtkWidget (screen_info), c->name); + pango_layout_set_font_description (layout, myScreenGetFontDescription (screen_info)); + pango_layout_set_auto_dir (layout, FALSE); + pango_layout_get_pixel_extents (layout, NULL, &logical_rect); - if (FLAG_TEST (c->flags, CLIENT_FLAG_HAS_FRAME_EXTENTS)) + title_height = screen_info->font_height; + if (!title_height) { - return -c->frame_extents[SIDE_BOTTOM]; + /* If for some reason the font height is not known, + * use the actual pango layout height. + */ + title_height = logical_rect.height; } - return frameBottom(c); -} - -int -frameExtentX (Client * c) -{ - g_return_val_if_fail (c != NULL, 0); - TRACE ("client \"%s\" (0x%lx)", c->name, c->window); - - if (FLAG_TEST (c->flags, CLIENT_FLAG_HAS_FRAME_EXTENTS)) + title_y = voffset + (frameDecorationTop(screen_info) - title_height) / 2; + if (title_y + title_height > frameDecorationTop(screen_info)) { - return c->x + c->frame_extents[SIDE_LEFT]; + title_y = MAX (0, frameDecorationTop(screen_info) - title_height); } - return frameX(c); -} -int -frameExtentY (Client * c) -{ - g_return_val_if_fail (c != NULL, 0); - TRACE ("client \"%s\" (0x%lx)", c->name, c->window); - - if (FLAG_TEST (c->flags, CLIENT_FLAG_HAS_FRAME_EXTENTS)) + if (!xfwmPixmapNone(&screen_info->top[3][ACTIVE])) { - return c->y + c->frame_extents[SIDE_TOP]; - } - return frameY(c); -} - -int -frameExtentWidth (Client * c) -{ - g_return_val_if_fail (c != NULL, 0); - TRACE ("client \"%s\" (0x%lx)", c->name, c->window); - - if (FLAG_TEST (c->flags, CLIENT_FLAG_HAS_FRAME_EXTENTS)) - { - return MAX (0, c->width - c->frame_extents[SIDE_LEFT] - - c->frame_extents[SIDE_RIGHT]); - } - return frameWidth(c); -} - -int -frameExtentHeight (Client * c) -{ - g_return_val_if_fail (c != NULL, 0); - TRACE ("client \"%s\" (0x%lx)", c->name, c->window); - - if (FLAG_TEST (c->flags, CLIENT_FLAG_HAS_FRAME_EXTENTS)) - { - return MAX (0, c->height - c->frame_extents[SIDE_TOP] - - c->frame_extents[SIDE_BOTTOM]); - } - return frameHeight(c); -} - -static int -frameTopLeftWidth (Client * c, int state) -{ - g_return_val_if_fail (c != NULL, 0); - TRACE ("client \"%s\" (0x%lx)", c->name, c->window); - - if (FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED) - && c->screen_info->params->borderless_maximize) - { - return 0; - } - return c->screen_info->corners[CORNER_TOP_LEFT][state].width; - -} - -static int -frameTopRightWidth (Client * c, int state) -{ - g_return_val_if_fail (c != NULL, 0); - TRACE ("client \"%s\" (0x%lx)", c->name, c->window); - - if (FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED) - && c->screen_info->params->borderless_maximize) - { - return 0; - } - return c->screen_info->corners[CORNER_TOP_RIGHT][state].width; -} - -static int -frameButtonOffset (Client *c) -{ - g_return_val_if_fail (c != NULL, 0); - TRACE ("client \"%s\" (0x%lx)", c->name, c->window); - - if (FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED) - && c->screen_info->params->borderless_maximize) - { - return MAX (0, c->screen_info->params->maximized_offset); - } - return c->screen_info->params->button_offset; -} - -static void -frameFillTitlePixmap (Client * c, int state, int part, int x, int w, int h, xfwmPixmap * title_pm, xfwmPixmap * top_pm) -{ - ScreenInfo *screen_info; - - g_return_if_fail (c); - g_return_if_fail (title_pm); - g_return_if_fail (top_pm); - TRACE ("client \"%s\" (0x%lx)", c->name, c->window); - - 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); - } - xfwmPixmapFill (&screen_info->title[part][state], title_pm, x, 0, w, frameDecorationTop(screen_info)); -} - -static void -frameCreateTitlePixmap (Client * c, int state, int left, int right, xfwmPixmap * title_pm, xfwmPixmap * top_pm) -{ - ScreenInfo *screen_info; - cairo_surface_t *surface; - cairo_t *cr; - PangoLayout *layout; - PangoRectangle logical_rect; - int width, x, hoffset, w1, w2, w3, w4, w5, temp; - int voffset, title_x, title_y; - int title_height, top_height; - - g_return_if_fail (c); - g_return_if_fail (title_pm); - g_return_if_fail (top_pm); - TRACE ("client \"%s\" (0x%lx)", c->name, c->window); - - screen_info = c->screen_info; - - if (left > right) - { - temp = left; - left = right; - right = temp; - } - - width = frameWidth (c) - frameTopLeftWidth (c, state) - frameTopRightWidth (c, state); - if (width < 1) - { - return; - } - - if (left < frameTopLeftWidth (c, state)) - { - left = frameTopLeftWidth (c, state); - } - if (right > frameWidth (c) - frameTopRightWidth (c, state)) - { - right = frameWidth (c) - frameTopRightWidth (c, state); - } - if (right < frameTopLeftWidth (c, state)) - { - right = frameTopLeftWidth (c, state); - } - - left = left - frameTopLeftWidth (c, state); - right = right - frameTopLeftWidth (c, state); - - x = 0; - hoffset = 0; - - if (state == ACTIVE) - { - voffset = screen_info->params->title_vertical_offset_active; - } - else - { - voffset = screen_info->params->title_vertical_offset_inactive; - } - - layout = gtk_widget_create_pango_layout (myScreenGetGtkWidget (screen_info), c->name); - pango_layout_set_font_description (layout, myScreenGetFontDescription (screen_info)); - pango_layout_set_auto_dir (layout, FALSE); - pango_layout_get_pixel_extents (layout, NULL, &logical_rect); - - title_height = screen_info->font_height; - if (!title_height) - { - /* If for some reason the font height is not known, - * use the actual pango layout height. - */ - title_height = logical_rect.height; - } - title_y = voffset + (frameDecorationTop(screen_info) - title_height) / 2; - if (title_y + title_height > frameDecorationTop(screen_info)) - { - title_y = MAX (0, frameDecorationTop(screen_info) - title_height); + top_height = screen_info->top[3][ACTIVE].height; } - - if (!xfwmPixmapNone(&screen_info->top[3][ACTIVE])) + else if (frameDecorationBorderTop(c->screen_info) > 0) { - top_height = screen_info->top[3][ACTIVE].height; + top_height = frameDecorationBorderTop(c->screen_info); } else { @@ -962,39 +706,6 @@ frameSetShape (Client * c, int state, FramePixmap * frame_pix, int button_x[BUTT XShapeCombineShape (display_info->dpy, c->frame, ShapeBounding, 0, 0, screen_info->shape_win, ShapeBounding, ShapeSet); } -void -frameSetShapeInput (Client * c) -{ - ScreenInfo *screen_info; - DisplayInfo *display_info; - - g_return_if_fail (c != NULL); - TRACE ("client \"%s\" (0x%lx)", c->name, c->window); - - screen_info = c->screen_info; - display_info = screen_info->display_info; - - if (!myDisplayHaveShapeInput(display_info)) - { - return; - } - - if (screen_info->shape_win == None) - { - screen_info->shape_win = XCreateSimpleWindow (display_info->dpy, screen_info->xroot, 0, 0, frameWidth (c), frameHeight (c), 0, 0, 0); - } - else - { - XResizeWindow (display_info->dpy, screen_info->shape_win, frameWidth (c), frameHeight (c)); - } - - /* Set Input shape when using XShape extension 1.1 and later */ - XShapeCombineShape(display_info->dpy, screen_info->shape_win, ShapeInput, 0, 0, c->frame, ShapeBounding, ShapeSet); - XShapeCombineShape(display_info->dpy, screen_info->shape_win, ShapeInput, frameLeft (c), frameTop (c), c->window, ShapeBounding, ShapeSubtract); - XShapeCombineShape(display_info->dpy, screen_info->shape_win, ShapeInput, frameLeft (c), frameTop (c), c->window, ShapeInput, ShapeUnion); - XShapeCombineShape(display_info->dpy, c->frame, ShapeInput, 0, 0, screen_info->shape_win, ShapeInput, ShapeSet); -} - static void frameDrawWin (Client * c) { @@ -1349,46 +1060,315 @@ update_frame_idle_cb (gpointer data) return (FALSE); } -void -frameClearQueueDraw (Client * c) +int +frameDecorationLeft (ScreenInfo *screen_info) { - g_return_if_fail (c); - TRACE ("client \"%s\" (0x%lx)", c->name, c->window); + TRACE ("entering"); - if (c->frame_timeout_id) - { - g_source_remove (c->frame_timeout_id); - c->frame_timeout_id = 0; - } + g_return_val_if_fail (screen_info != NULL, 0); + return screen_info->sides[SIDE_LEFT][ACTIVE].width; } -void -frameDraw (Client * c, gboolean clear_all) +int +frameDecorationRight (ScreenInfo *screen_info) { - g_return_if_fail (c); - TRACE ("client \"%s\" (0x%lx)", c->name, c->window); + TRACE ("entering"); - if (clear_all) - { - FLAG_SET (c->xfwm_flags, XFWM_FLAG_NEEDS_REDRAW); - } - frameDrawWin (c); + g_return_val_if_fail (screen_info != NULL, 0); + return screen_info->sides[SIDE_RIGHT][ACTIVE].width; } -void -frameQueueDraw (Client * c, gboolean clear_all) +int +frameDecorationTop (ScreenInfo *screen_info) { - g_return_if_fail (c); - TRACE ("client \"%s\" (0x%lx)", c->name, c->window); + TRACE ("entering"); - /* Reschedule update */ - if (c->frame_timeout_id) - { - frameClearQueueDraw (c); - } - if (clear_all) - { - FLAG_SET (c->xfwm_flags, XFWM_FLAG_NEEDS_REDRAW); + g_return_val_if_fail (screen_info != NULL, 0); + return screen_info->title[TITLE_3][ACTIVE].height; +} + +int +frameDecorationBottom (ScreenInfo *screen_info) +{ + TRACE ("entering"); + + g_return_val_if_fail (screen_info != NULL, 0); + return screen_info->sides[SIDE_BOTTOM][ACTIVE].height; +} + +int +frameLeft (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->sides[SIDE_LEFT][ACTIVE].width; + } + return 0; +} + +int +frameRight (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->sides[SIDE_RIGHT][ACTIVE].width; + } + return 0; +} + +int +frameTop (Client * c) +{ + g_return_val_if_fail (c != NULL, 0); + TRACE ("client \"%s\" (0x%lx)", c->name, c->window); + + if (CLIENT_HAS_FRAME (c)) + { + return frameDecorationTop(c->screen_info) - frameBorderTop (c); + } + return 0; +} + +int +frameBottom (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->sides[SIDE_BOTTOM][ACTIVE].height; + } + return 0; +} + +int +frameX (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->x - frameLeft (c); + } + return c->x; +} + +int +frameY (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)) + { + return c->y - frameTop (c); + } + return c->y; +} + +int +frameWidth (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->width + frameLeft (c) + frameRight (c); + } + return c->width; +} + +int +frameHeight (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_SHADED) + && !FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN)) + { + return frameTop (c) + frameBottom (c); + } + else if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_BORDER) + && !FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN)) + { + return c->height + frameTop (c) + frameBottom (c); + } + return c->height; +} + +int +frameExtentLeft (Client * c) +{ + g_return_val_if_fail (c != NULL, 0); + TRACE ("client \"%s\" (0x%lx)", c->name, c->window); + + if (FLAG_TEST (c->flags, CLIENT_FLAG_HAS_FRAME_EXTENTS)) + { + return -c->frame_extents[SIDE_LEFT]; + } + return frameLeft(c); +} + +int +frameExtentRight (Client * c) +{ + g_return_val_if_fail (c != NULL, 0); + TRACE ("client \"%s\" (0x%lx)", c->name, c->window); + + if (FLAG_TEST (c->flags, CLIENT_FLAG_HAS_FRAME_EXTENTS)) + { + return -c->frame_extents[SIDE_RIGHT]; + } + return frameRight(c); +} + +int +frameExtentTop (Client * c) +{ + g_return_val_if_fail (c != NULL, 0); + TRACE ("client \"%s\" (0x%lx)", c->name, c->window); + + if (FLAG_TEST (c->flags, CLIENT_FLAG_HAS_FRAME_EXTENTS)) + { + return -c->frame_extents[SIDE_TOP]; + } + return frameTop(c); +} + +int +frameExtentBottom (Client * c) +{ + g_return_val_if_fail (c != NULL, 0); + TRACE ("client \"%s\" (0x%lx)", c->name, c->window); + + if (FLAG_TEST (c->flags, CLIENT_FLAG_HAS_FRAME_EXTENTS)) + { + return -c->frame_extents[SIDE_BOTTOM]; + } + return frameBottom(c); +} + +int +frameExtentX (Client * c) +{ + g_return_val_if_fail (c != NULL, 0); + TRACE ("client \"%s\" (0x%lx)", c->name, c->window); + + if (FLAG_TEST (c->flags, CLIENT_FLAG_HAS_FRAME_EXTENTS)) + { + return c->x + c->frame_extents[SIDE_LEFT]; + } + return frameX(c); +} + +int +frameExtentY (Client * c) +{ + g_return_val_if_fail (c != NULL, 0); + TRACE ("client \"%s\" (0x%lx)", c->name, c->window); + + if (FLAG_TEST (c->flags, CLIENT_FLAG_HAS_FRAME_EXTENTS)) + { + return c->y + c->frame_extents[SIDE_TOP]; + } + return frameY(c); +} + +int +frameExtentWidth (Client * c) +{ + g_return_val_if_fail (c != NULL, 0); + TRACE ("client \"%s\" (0x%lx)", c->name, c->window); + + if (FLAG_TEST (c->flags, CLIENT_FLAG_HAS_FRAME_EXTENTS)) + { + return MAX (0, c->width - c->frame_extents[SIDE_LEFT] + - c->frame_extents[SIDE_RIGHT]); + } + return frameWidth(c); +} + +int +frameExtentHeight (Client * c) +{ + g_return_val_if_fail (c != NULL, 0); + TRACE ("client \"%s\" (0x%lx)", c->name, c->window); + + if (FLAG_TEST (c->flags, CLIENT_FLAG_HAS_FRAME_EXTENTS)) + { + return MAX (0, c->height - c->frame_extents[SIDE_TOP] + - c->frame_extents[SIDE_BOTTOM]); + } + return frameHeight(c); +} + +void +frameClearQueueDraw (Client * c) +{ + g_return_if_fail (c); + TRACE ("client \"%s\" (0x%lx)", c->name, c->window); + + if (c->frame_timeout_id) + { + g_source_remove (c->frame_timeout_id); + c->frame_timeout_id = 0; + } +} + +void +frameDraw (Client * c, gboolean clear_all) +{ + g_return_if_fail (c); + TRACE ("client \"%s\" (0x%lx)", c->name, c->window); + + if (clear_all) + { + FLAG_SET (c->xfwm_flags, XFWM_FLAG_NEEDS_REDRAW); + } + frameDrawWin (c); +} + +void +frameQueueDraw (Client * c, gboolean clear_all) +{ + g_return_if_fail (c); + TRACE ("client \"%s\" (0x%lx)", c->name, c->window); + + /* Reschedule update */ + if (c->frame_timeout_id) + { + frameClearQueueDraw (c); + } + if (clear_all) + { + FLAG_SET (c->xfwm_flags, XFWM_FLAG_NEEDS_REDRAW); } /* Otherwise leave previous schedule */ if (c->frame_timeout_id == 0) @@ -1398,3 +1378,35 @@ frameQueueDraw (Client * c, gboolean clear_all) } } +void +frameSetShapeInput (Client * c) +{ + ScreenInfo *screen_info; + DisplayInfo *display_info; + + g_return_if_fail (c != NULL); + TRACE ("client \"%s\" (0x%lx)", c->name, c->window); + + screen_info = c->screen_info; + display_info = screen_info->display_info; + + if (!myDisplayHaveShapeInput(display_info)) + { + return; + } + + if (screen_info->shape_win == None) + { + screen_info->shape_win = XCreateSimpleWindow (display_info->dpy, screen_info->xroot, 0, 0, frameWidth (c), frameHeight (c), 0, 0, 0); + } + else + { + XResizeWindow (display_info->dpy, screen_info->shape_win, frameWidth (c), frameHeight (c)); + } + + /* Set Input shape when using XShape extension 1.1 and later */ + XShapeCombineShape(display_info->dpy, screen_info->shape_win, ShapeInput, 0, 0, c->frame, ShapeBounding, ShapeSet); + XShapeCombineShape(display_info->dpy, screen_info->shape_win, ShapeInput, frameLeft (c), frameTop (c), c->window, ShapeBounding, ShapeSubtract); + XShapeCombineShape(display_info->dpy, screen_info->shape_win, ShapeInput, frameLeft (c), frameTop (c), c->window, ShapeInput, ShapeUnion); + XShapeCombineShape(display_info->dpy, c->frame, ShapeInput, 0, 0, screen_info->shape_win, ShapeInput, ShapeSet); +} -- To stop receiving notification emails like this one, please contact the administrator of this repository. _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org https://mail.xfce.org/mailman/listinfo/xfce4-commits