void engine_draw_frame (decor_t * d, cairo_t * cr) { double x1, y1, x2, y2, h; int top; frame_settings * fs = d->fs; private_fs * pfs = fs->engine_fs; window_settings * ws = fs->ws; private_ws * pws = ws->engine_ws; gdouble pleft; gdouble ptop; gdouble pwidth; gdouble pheight; top = ws->win_extents.top + ws->titlebar_height; x1 = ws->left_space - ws->win_extents.left; y1 = ws->top_space - ws->win_extents.top; x2 = d->width - ws->right_space + ws->win_extents.right; y2 = d->height - ws->bottom_space + ws->win_extents.bottom; pleft = x1 + ws->win_extents.left - 0.5; ptop = y1 + top - 0.5; pwidth = x2 - x1 - ws->win_extents.left - ws->win_extents.right + 1; pheight = y2 - y1 - top-ws->win_extents.bottom + 1; h = d->height - ws->top_space - ws->titlebar_height - ws->bottom_space; int corners = ((pws->round_top_left) ? CORNER_TOPLEFT : 0) | ((pws->round_top_right) ? CORNER_TOPRIGHT : 0) | ((pws->round_bottom_left) ? CORNER_BOTTOMLEFT : 0) | ((pws->round_bottom_right) ? CORNER_BOTTOMRIGHT : 0); /* maximize work-a-round */ if (d->state & (WNCK_WINDOW_STATE_MAXIMIZED_HORIZONTALLY | WNCK_WINDOW_STATE_MAXIMIZED_VERTICALLY)) corners = 0; cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); cairo_set_line_width (cr, 1.0); fill_rounded_rectangle (cr, x1 + 0.5, y1 + 0.5, ws->win_extents.left - 0.5, top - 0.5, CORNER_TOPLEFT & corners, &pfs->title_inner, &pfs->title_outer, SHADE_TOP | SHADE_LEFT, ws, pws->corner_radius); fill_rounded_rectangle (cr, x1 + ws->win_extents.left, y1 + 0.5, x2 - x1 - ws->win_extents.left - ws->win_extents.right, top - 0.5, 0, &pfs->title_inner, &pfs->title_outer, SHADE_TOP, ws, pws->corner_radius); fill_rounded_rectangle (cr, x2 - ws->win_extents.right, y1 + 0.5, ws->win_extents.right - 0.5, top - 0.5, CORNER_TOPRIGHT & corners, &pfs->title_inner, &pfs->title_outer, SHADE_TOP | SHADE_RIGHT, ws, pws->corner_radius); fill_rounded_rectangle (cr, x1 + 0.5, y1 + top, ws->win_extents.left - 0.5, h, 0, &pfs->inner, &pfs->outer, SHADE_LEFT, ws, pws->corner_radius); fill_rounded_rectangle (cr, x2 - ws->win_extents.right, y1 + top, ws->win_extents.right - 0.5, h, 0, &pfs->inner, &pfs->outer, SHADE_RIGHT, ws, pws->corner_radius); fill_rounded_rectangle (cr, x1 + 0.5, y2 - ws->win_extents.bottom, ws->win_extents.left - 0.5, ws->win_extents.bottom - 0.5, CORNER_BOTTOMLEFT & corners, &pfs->inner, &pfs->outer, SHADE_BOTTOM | SHADE_LEFT, ws, pws->corner_radius); fill_rounded_rectangle (cr, x1 + ws->win_extents.left, y2 - ws->win_extents.bottom, x2 - x1 - ws->win_extents.left - ws->win_extents.right, ws->win_extents.bottom - 0.5, 0, &pfs->inner, &pfs->outer, SHADE_BOTTOM, ws, pws->corner_radius); fill_rounded_rectangle (cr, x2 - ws->win_extents.right, y2 - ws->win_extents.bottom, ws->win_extents.right - 0.5, ws->win_extents.bottom - 0.5, CORNER_BOTTOMRIGHT & corners, &pfs->inner, &pfs->outer, SHADE_BOTTOM | SHADE_RIGHT, ws, pws->corner_radius); /* ======= NEW LAYER ======= */ cairo_set_operator (cr, CAIRO_OPERATOR_OVER); /* titlebar separator line */ cairo_set_source_alpha_color(cr, &pfs->separator_line); cairo_move_to (cr, x1 + 0.5, y1 + top - 0.5); cairo_rel_line_to (cr, x2 - x1 - 1.0, 0.0); cairo_stroke (cr); /* do not draw outside the decoration area */ rounded_rectangle (cr, x1 + 0.5, y1 + 0.5, x2 - x1 - 1.0, y2 - y1 - 1.0, (CORNER_TOPLEFT | CORNER_TOPRIGHT | CORNER_BOTTOMLEFT | CORNER_BOTTOMRIGHT) & corners, ws, pws->corner_radius); cairo_clip (cr); cairo_translate (cr, 1.0, 1.0); /* highlight */ rounded_rectangle (cr, x1 + 0.5, y1 + 0.5, x2 - x1 - 1.0, y2 - y1 - 1.0, (CORNER_TOPLEFT | CORNER_TOPRIGHT | CORNER_BOTTOMLEFT | CORNER_BOTTOMRIGHT) & corners, ws, pws->corner_radius); cairo_set_source_alpha_color (cr, &pfs->window_highlight); cairo_stroke (cr); cairo_translate (cr, -2.0, -2.0); /* shadow */ rounded_rectangle (cr, x1 + 0.5, y1 + 0.5, x2 - x1 - 1.0, y2 - y1 - 1.0, (CORNER_TOPLEFT | CORNER_TOPRIGHT | CORNER_BOTTOMLEFT | CORNER_BOTTOMRIGHT) & corners, ws, pws->corner_radius); cairo_set_source_alpha_color (cr, &pfs->window_shadow); cairo_stroke (cr); cairo_translate (cr, 1.0, 1.0); cairo_reset_clip (cr); /* halo */ rounded_rectangle (cr, x1 + 0.5, y1 + 0.5, x2 - x1 - 1.0, y2 - y1 - 1.0, (CORNER_TOPLEFT | CORNER_TOPRIGHT | CORNER_BOTTOMLEFT | CORNER_BOTTOMRIGHT) & corners, ws, pws->corner_radius); cairo_set_source_alpha_color (cr, &pfs->window_halo); cairo_stroke (cr); /* inner border TODO: make this a bit more pixel-perfect... but it works for now */ cairo_set_line_width (cr, 1.0); cairo_move_to (cr, pleft + pwidth + 1.5, ptop - 1); cairo_rel_line_to (cr, -pwidth - 2.5, 0); cairo_rel_line_to (cr, 0, pheight + 2.5); cairo_set_source_alpha_color (cr, &pfs->contents_shadow); cairo_stroke (cr); cairo_move_to (cr, pleft + pwidth + 1, ptop - 1.5); cairo_rel_line_to (cr, 0, pheight + 2.5); cairo_rel_line_to (cr, -pwidth - 2.5, 0); cairo_set_source_alpha_color (cr, &pfs->contents_highlight); cairo_stroke (cr); cairo_move_to (cr, pleft, ptop); cairo_rel_line_to (cr, pwidth, 0); cairo_rel_line_to (cr, 0, pheight); cairo_rel_line_to (cr, -pwidth, 0); cairo_rel_line_to (cr, 0, -pheight); cairo_set_source_alpha_color (cr, &pfs->contents_halo); cairo_stroke(cr); }
void engine_draw_frame (decor_t * d, cairo_t * cr) { frame_settings *fs = d->fs; private_fs *pfs = fs->engine_fs; window_settings *ws = fs->ws; double x1, y1, x2, y2; x1 = ws->left_space - ws->win_extents.left; y1 = ws->top_space - ws->win_extents.top; x2 = d->width - ws->right_space + ws->win_extents.right; y2 = d->height - ws->bottom_space + ws->win_extents.bottom; int top; top = ws->win_extents.top + ws->titlebar_height; double m1 = MIN(ws->win_extents.left, ws->win_extents.right); double m2 = MIN(ws->win_extents.top, ws->win_extents.bottom); double border_width = MIN(m1, m2); double border_offset = border_width/2.0; cairo_set_line_width (cr, border_width); cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); rounded_rectangle (cr, x1 + border_offset, y1 + top - border_offset, x2 - x1 - border_width, y2 - y1 - top, 0, ws, 0); cairo_set_source_alpha_color(cr, &pfs->border); cairo_stroke (cr); /* title bar */ if (pfs->title_bar.alpha != 0.0) { rounded_rectangle (cr, x1, y1, x2 - x1, top, 0, ws, 0); cairo_set_source_alpha_color(cr, &pfs->title_bar); cairo_fill(cr); } else { cairo_save(cr); cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); cairo_rectangle (cr, 0.0, 0.0, d->width, top + y1 - border_width); cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 1.0); cairo_fill(cr); cairo_restore(cr); /* FIXME => find a proper solution for this */ #ifdef SHADOW_FIX cairo_rectangle (cr, 0.0, 0.0, d->width, top + y1 - border_width); cairo_clip(cr); cairo_translate(cr, 0.0, ws->top_space + ws->win_extents.top); draw_shadow_background(d, cr); cairo_translate(cr, 0.0, -ws->top_space - ws->win_extents.top); #endif } }