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); }
void KWD::Decorator::updateShadow (void) { Display *xdisplay = QX11Info::display (); Screen *xscreen; decor_context_t context; xscreen = ScreenOfDisplay (xdisplay, QX11Info::appScreen ()); if (mNoBorderShadow) decor_shadow_destroy (xdisplay, mNoBorderShadow); mNoBorderShadow = decor_shadow_create (xdisplay, xscreen, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, &mActiveShadowOptions, &context, decor_draw_simple, 0); if (mNoBorderShadow) { decor_extents_t extents = { 0, 0, 0, 0 }; long *data; unsigned int n = 1, frame_type = 0, frame_state = 0, frame_actions = 0; decor_quad_t quads[N_QUADS_MAX]; int nQuad; decor_layout_t layout; decor_get_default_layout (&context, 1, 1, &layout); nQuad = decor_set_lSrStSbS_window_quads (quads, &context, &layout); data = decor_alloc_property (n, WINDOW_DECORATION_TYPE_PIXMAP); decor_quads_to_property (data, n - 1, mNoBorderShadow->pixmap, &extents, &extents, &extents, &extents, 0, 0, quads, nQuad, frame_type, frame_state, frame_actions); KWD::trapXError (); XChangeProperty (QX11Info::display (), QX11Info::appRootWindow (), Atoms::netWindowDecorBare, XA_INTEGER, 32, PropModeReplace, (unsigned char *) data, PROP_HEADER_SIZE + BASE_PROP_SIZE + QUAD_PROP_SIZE * N_QUADS_MAX); KWD::popXError (); free (data); } }
void decor_update_switcher_property (decor_t *d) { long *data; Display *xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); gint nQuad; 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); GtkStyleContext *context; GdkRGBA fg; long fgColor[4]; nQuad = decor_set_lSrStSbX_window_quads (quads, &d->frame->window_context_active, &d->border_layout, d->border_layout.top.x2 - d->border_layout.top.x1 - d->frame->window_context_active.extents.left - d->frame->window_context_active.extents.right - 32); data = decor_alloc_property (nOffset, WINDOW_DECORATION_TYPE_PIXMAP); decor_quads_to_property (data, nOffset - 1, cairo_xlib_surface_get_drawable (d->surface), &d->frame->win_extents, &d->frame->win_extents, &d->frame->win_extents, &d->frame->win_extents, 0, 0, quads, nQuad, frame_type, frame_state, frame_actions); context = gtk_widget_get_style_context (d->frame->style_window_rgba); gtk_style_context_get_color (context, GTK_STATE_FLAG_NORMAL, &fg); fgColor[0] = fg.red; fgColor[1] = fg.green; fgColor[2] = fg.blue; fgColor[3] = SWITCHER_ALPHA; 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); XChangeProperty (xdisplay, d->prop_xid, switcher_fg_atom, XA_INTEGER, 32, PropModeReplace, (guchar *) fgColor, 4); gdk_display_sync (gdk_display_get_default ()); gdk_error_trap_pop_ignored (); free (data); }
/* * update_default_decorations * * Description: update the default decorations */ void update_default_decorations (GdkScreen *screen) { long *data; Window xroot; GdkDisplay *gdkdisplay = gdk_display_get_default (); Display *xdisplay = gdk_x11_display_get_xdisplay (gdkdisplay); Atom bareAtom, activeAtom; decor_frame_t *frame; decor_frame_t *bare_frame = gwd_get_decor_frame ("bare"); decor_extents_t extents; unsigned int i; xroot = RootWindowOfScreen (gdk_x11_screen_get_xscreen (screen)); bareAtom = XInternAtom (xdisplay, DECOR_BARE_ATOM_NAME, FALSE); activeAtom = XInternAtom (xdisplay, DECOR_ACTIVE_ATOM_NAME, FALSE); if (bare_frame->border_shadow_active) { decor_layout_t layout; unsigned int frame_type = 0; unsigned int frame_state = 0; unsigned int frame_actions = 0; unsigned int nQuad; decor_quad_t quads[N_QUADS_MAX]; long *data = decor_alloc_property (1, WINDOW_DECORATION_TYPE_PIXMAP); decor_get_default_layout (&bare_frame->window_context_active, 1, 1, &layout); nQuad = decor_set_lSrStSbS_window_quads (quads, &bare_frame->window_context_active, &layout); decor_quads_to_property (data, 0, bare_frame->border_shadow_active->pixmap, &bare_frame->win_extents, &bare_frame->win_extents, &bare_frame->win_extents, &bare_frame->win_extents, 0, 0, quads, nQuad, frame_type, frame_state, frame_actions); XChangeProperty (xdisplay, xroot, bareAtom, XA_INTEGER, 32, PropModeReplace, (guchar *) data, PROP_HEADER_SIZE + BASE_PROP_SIZE + QUAD_PROP_SIZE * N_QUADS_MAX); if (minimal) { XChangeProperty (xdisplay, xroot, activeAtom, XA_INTEGER, 32, PropModeReplace, (guchar *) data, PROP_HEADER_SIZE + BASE_PROP_SIZE + QUAD_PROP_SIZE * N_QUADS_MAX); } free (data); } else { XDeleteProperty (xdisplay, xroot, bareAtom); if (minimal) { XDeleteProperty (xdisplay, xroot, activeAtom); } } if (minimal) { gwd_decor_frame_unref (bare_frame); return; } XDeleteProperty (xdisplay, xroot, activeAtom); data = decor_alloc_property (WINDOW_TYPE_FRAMES_NUM * 2, WINDOW_DECORATION_TYPE_PIXMAP); /* All active states and all inactive states */ for (i = 0; i < WINDOW_TYPE_FRAMES_NUM * 2; ++i) { frame = gwd_get_decor_frame (default_frames[i].name); extents = frame->win_extents; if (default_frames[i].d) { if (default_frames[i].d->surface) cairo_surface_destroy (default_frames[i].d->surface); free (default_frames[i].d); } default_frames[i].d = calloc (1, sizeof (decor_t)); default_frames[i].d->context = i < WINDOW_TYPE_FRAMES_NUM ? &frame->window_context_active : &frame->window_context_inactive; default_frames[i].d->shadow = i < WINDOW_TYPE_FRAMES_NUM ? frame->border_shadow_active : frame->border_shadow_inactive; default_frames[i].d->layout = pango_layout_new (frame->pango_context); decor_get_default_layout (default_frames[i].d->context, 1, 1, &default_frames[i].d->border_layout); default_frames[i].d->width = default_frames[i].d->border_layout.width; default_frames[i].d->height = default_frames[i].d->border_layout.height; default_frames[i].d->frame = frame; default_frames[i].d->active = i < WINDOW_TYPE_FRAMES_NUM ? TRUE : FALSE; extents.top += frame->titlebar_height; default_frames[i].d->draw = theme_draw_window_decoration; default_frames[i].d->surface = create_native_surface_and_wrap (default_frames[i].d->width, default_frames[i].d->height, frame->style_window_rgba); unsigned int j, k; for (j = 0; j < 3; ++j) { for (k = 0; k < 3; k++) { default_frames[i].d->event_windows[j][k].window = None; } } for (j = 0; j < BUTTON_NUM; ++j) { default_frames[i].d->button_windows[j].window = None; default_frames[i].d->button_states[j] = 0; } if (default_frames[i].d->surface) { gint nQuad; unsigned int frame_type = populate_frame_type (default_frames[i].d); unsigned int frame_state = populate_frame_state (default_frames[i].d); unsigned int frame_actions = populate_frame_actions (default_frames[i].d); decor_quad_t quads[N_QUADS_MAX]; nQuad = decor_set_lSrStSbS_window_quads (quads, default_frames[i].d->context, &default_frames[i].d->border_layout); default_frames[i].d->picture = XRenderCreatePicture (xdisplay, cairo_xlib_surface_get_drawable (default_frames[i].d->surface), xformat_rgba, 0, NULL); (*default_frames[i].d->draw) (default_frames[i].d); decor_quads_to_property (data, i, cairo_xlib_surface_get_drawable (default_frames[i].d->surface), &extents, &extents, &extents, &extents, 0, 0, quads, nQuad, frame_type, frame_state, frame_actions); } gwd_decor_frame_unref (frame); } XChangeProperty (xdisplay, xroot, activeAtom, XA_INTEGER, 32, PropModeAppend, (guchar *) data, PROP_HEADER_SIZE + (WINDOW_TYPE_FRAMES_NUM * 2) * (BASE_PROP_SIZE + QUAD_PROP_SIZE * N_QUADS_MAX)); free (data); gwd_decor_frame_unref (bare_frame); }
void decor_update_window_property (decor_t *d) { long *data; Display *xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); decor_extents_t extents = d->frame->win_extents; gint nQuad; 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); decor_quad_t quads[N_QUADS_MAX]; int w, h; gint stretch_offset; REGION top, bottom, left, right; w = d->border_layout.top.x2 - d->border_layout.top.x1 - d->context->left_space - d->context->right_space; if (d->border_layout.rotation) h = d->border_layout.left.x2 - d->border_layout.left.x1; else h = d->border_layout.left.y2 - d->border_layout.left.y1; stretch_offset = w - d->button_width - 1; nQuad = decor_set_lSrStXbS_window_quads (quads, d->context, &d->border_layout, stretch_offset); extents.top += d->frame->titlebar_height; if (d->frame_window) { data = decor_alloc_property (nOffset, WINDOW_DECORATION_TYPE_WINDOW); decor_gen_window_property (data, nOffset - 1, &extents, &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), &extents, &extents, &extents, &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 (); top.rects = &top.extents; top.numRects = top.size = 1; top.extents.x1 = -extents.left; top.extents.y1 = -extents.top; top.extents.x2 = w + extents.right; top.extents.y2 = 0; bottom.rects = &bottom.extents; bottom.numRects = bottom.size = 1; bottom.extents.x1 = -extents.left; bottom.extents.y1 = 0; bottom.extents.x2 = w + extents.right; bottom.extents.y2 = extents.bottom; left.rects = &left.extents; left.numRects = left.size = 1; left.extents.x1 = -extents.left; left.extents.y1 = 0; left.extents.x2 = 0; left.extents.y2 = h; right.rects = &right.extents; right.numRects = right.size = 1; right.extents.x1 = 0; right.extents.y1 = 0; right.extents.x2 = extents.right; right.extents.y2 = h; decor_update_blur_property (d, w, h, &top, stretch_offset, &bottom, w / 2, &left, h / 2, &right, h / 2); free (data); }
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); }