void KWD::Switcher::updateWindowProperties () { long data[256]; decor_quad_t quads[N_QUADS_MAX]; int nQuad; int lh, rh; int w; lh = mDecorLayout.left.y2 - mDecorLayout.left.y1; rh = mDecorLayout.right.y2 - mDecorLayout.right.y1; w = mDecorLayout.top.x2 - mDecorLayout.top.x1 - mContext.left_space - mContext.right_space; nQuad = decor_set_lXrXtXbX_window_quads (quads, &mContext, &mDecorLayout, lh / 2, rh / 2, w, w / 2); decor_quads_to_property (data, mX11Pixmap, &mBorder, &mBorder, 0, 0, quads, nQuad); KWD::trapXError (); XChangeProperty (QX11Info::display(), mId, Atoms::netWindowDecor, XA_INTEGER, 32, PropModeReplace, (unsigned char *) data, BASE_PROP_SIZE + QUAD_PROP_SIZE * nQuad); KWD::popXError (); updateBlurProperty (lh / 2, rh / 2, w / 2, w / 2); }
static void decor_update_meta_window_property (decor_t *d, MetaTheme *theme, MetaFrameFlags flags, Region top, Region bottom, Region left, Region right) { long *data; Display *xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); gint nQuad; decor_extents_t win_extents, frame_win_extents; decor_extents_t max_win_extents, frame_max_win_extents; decor_quad_t quads[N_QUADS_MAX]; unsigned int nOffset = 1; unsigned int frame_type = populate_frame_type (d); unsigned int frame_state = populate_frame_state (d); unsigned int frame_actions = populate_frame_actions (d); gint w, lh, rh; gint top_stretch_offset; gint bottom_stretch_offset; gint left_stretch_offset; gint right_stretch_offset; gint mutter_draggable_border_width = 0; win_extents = frame_win_extents = d->frame->win_extents; max_win_extents = frame_max_win_extents = d->frame->max_win_extents; g_object_get (settings, "draggable-border-width", &mutter_draggable_border_width, NULL); /* Add the invisible grab area padding, but only for * pixmap type decorations */ if (!d->frame_window) { if (flags & META_FRAME_ALLOWS_HORIZONTAL_RESIZE) { frame_win_extents.left += mutter_draggable_border_width; frame_win_extents.right += mutter_draggable_border_width; frame_max_win_extents.left += mutter_draggable_border_width; frame_max_win_extents.right += mutter_draggable_border_width; } if (flags & META_FRAME_ALLOWS_VERTICAL_RESIZE) { frame_win_extents.bottom += mutter_draggable_border_width; frame_win_extents.top += mutter_draggable_border_width; frame_max_win_extents.bottom += mutter_draggable_border_width; frame_max_win_extents.top += mutter_draggable_border_width; } } w = d->border_layout.top.x2 - d->border_layout.top.x1 - d->context->left_space - d->context->right_space; if (d->border_layout.rotation) lh = d->border_layout.left.x2 - d->border_layout.left.x1; else lh = d->border_layout.left.y2 - d->border_layout.left.y1; if (d->border_layout.rotation) rh = d->border_layout.right.x2 - d->border_layout.right.x1; else rh = d->border_layout.right.y2 - d->border_layout.right.y1; left_stretch_offset = lh / 2; right_stretch_offset = rh / 2; top_stretch_offset = w - d->button_width - 1; bottom_stretch_offset = (d->border_layout.bottom.x2 - d->border_layout.bottom.x1 - d->context->left_space - d->context->right_space) / 2; nQuad = decor_set_lXrXtXbX_window_quads (quads, d->context, &d->border_layout, left_stretch_offset, right_stretch_offset, top_stretch_offset, bottom_stretch_offset); win_extents.top += d->frame->titlebar_height; frame_win_extents.top += d->frame->titlebar_height; max_win_extents.top += d->frame->max_titlebar_height; frame_max_win_extents.top += d->frame->max_titlebar_height; if (d->frame_window) { data = decor_alloc_property (nOffset, WINDOW_DECORATION_TYPE_WINDOW); decor_gen_window_property (data, nOffset - 1, &win_extents, &max_win_extents, 20, 20, frame_type, frame_state, frame_actions); } else { data = decor_alloc_property (nOffset, WINDOW_DECORATION_TYPE_PIXMAP); decor_quads_to_property (data, nOffset - 1, cairo_xlib_surface_get_drawable (d->surface), &frame_win_extents, &win_extents, &frame_max_win_extents, &max_win_extents, ICON_SPACE + d->button_width, 0, quads, nQuad, frame_type, frame_state, frame_actions); } gdk_error_trap_push (); XChangeProperty (xdisplay, d->prop_xid, win_decor_atom, XA_INTEGER, 32, PropModeReplace, (guchar *) data, PROP_HEADER_SIZE + BASE_PROP_SIZE + QUAD_PROP_SIZE * N_QUADS_MAX); gdk_display_sync (gdk_display_get_default ()); gdk_error_trap_pop_ignored (); free (data); decor_update_blur_property (d, w, lh, top, top_stretch_offset, bottom, bottom_stretch_offset, left, left_stretch_offset, right, right_stretch_offset); }