diff options
-rw-r--r-- | src/compositor/compositor-xrender.c | 57 |
1 files changed, 56 insertions, 1 deletions
diff --git a/src/compositor/compositor-xrender.c b/src/compositor/compositor-xrender.c index 68898257..8397df92 100644 --- a/src/compositor/compositor-xrender.c +++ b/src/compositor/compositor-xrender.c @@ -131,6 +131,8 @@ typedef struct _MetaCompositorXRender Atom atom_net_wm_window_type_dropdown_menu; Atom atom_net_wm_window_type_tooltip; + Atom atom_metacity_window_have_shadow; + #ifdef USE_IDLE_REPAINT guint repaint_id; #endif @@ -207,6 +209,7 @@ typedef struct _MetaCompWindow Picture picture; Picture alpha_pict; + gboolean have_shadow; gboolean needs_shadow; MetaShadowType shadow_type; Picture shadow_pict; @@ -900,6 +903,9 @@ window_has_shadow (MetaCompWindow *cw) if (info == NULL || info->have_shadows == FALSE) return FALSE; + if (cw->have_shadow == FALSE) + return FALSE; + /* Always put a shadow around windows with a frame - This should override the restriction about not putting a shadow around shaped windows as the frame might be the reason the window is shaped */ @@ -1890,6 +1896,8 @@ add_win (MetaScreen *screen, cw->border_clip = None; + cw->have_shadow = TRUE; + determine_mode (display, screen, cw); cw->needs_shadow = window_has_shadow (cw); @@ -2255,6 +2263,51 @@ process_property_notify (MetaCompositorXRender *compositor, } } + /* Check for have_shadow changing */ + if (event->atom == compositor->atom_metacity_window_have_shadow) + { + MetaCompWindow *cw = find_window_in_display (display, event->window); + gulong value; + + if (!cw) + { + /* Applications can set this for their toplevel windows, so + * this must be propagated to the window managed by the compositor + */ + cw = find_window_for_child_window_in_display (display, event->window); + } + + if (!cw) + return; + + if (meta_prop_get_cardinal (display, event->window, + compositor->atom_metacity_window_have_shadow, + &value) == FALSE) + value = 1; + + cw->have_shadow = (gboolean) value; + + determine_mode (display, cw->screen, cw); + cw->needs_shadow = window_has_shadow (cw); + + if (cw->shadow) + { + XRenderFreePicture (xdisplay, cw->shadow); + cw->shadow = None; + } + + if (cw->extents) + XFixesDestroyRegion (xdisplay, cw->extents); + cw->extents = win_extents (cw); + + cw->damaged = TRUE; +#ifdef USE_IDLE_REPAINT + add_repair (display); +#endif + + return; + } + /* Check for the opacity changing */ if (event->atom == compositor->atom_net_wm_window_opacity) { @@ -3083,7 +3136,8 @@ meta_compositor_xrender_new (MetaDisplay *display) "_NET_WM_WINDOW_TYPE_SPLASH", "_NET_WM_WINDOW_TYPE_TOOLBAR", "_NET_WM_WINDOW_TYPE_DROPDOWN_MENU", - "_NET_WM_WINDOW_TYPE_TOOLTIP" + "_NET_WM_WINDOW_TYPE_TOOLTIP", + "METACITY_WINDOW_HAVE_SHADOW", }; Atom atoms[G_N_ELEMENTS(atom_names)]; MetaCompositorXRender *xrc; @@ -3116,6 +3170,7 @@ meta_compositor_xrender_new (MetaDisplay *display) xrc->atom_net_wm_window_type_toolbar = atoms[12]; xrc->atom_net_wm_window_type_dropdown_menu = atoms[13]; xrc->atom_net_wm_window_type_tooltip = atoms[14]; + xrc->atom_metacity_window_have_shadow = atoms[15]; xrc->show_redraw = FALSE; xrc->debug = FALSE; |