diff --git a/ChangeLog b/ChangeLog index 1a4ff37d1..974a0fe3d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2003-11-15 Rob Adams + + Inherit visual from frame window so that metacity will work with + the new compositing manager extension work by Keith on + freedesktop.org, so that ARGB windows can be full + alpha-transparent without a metacity frame getting drawn in the + background. In the long term, we need to actually set alpha + values when drawing the frame so that it will really work; this is + a stopgap solution. Patch from Keith Packard; see Bug 126875. + + * src/frame.c (meta_window_ensure_frame): pass client visual to + frame. + + * src/ui.[ch] (meta_ui_create_frame_window): add new xvisual + parameter and use it to create new window. + 2003-11-15 Rob Adams * src/window.c (update_net_wm_type): don't set window->type_atom diff --git a/src/frame.c b/src/frame.c index ba6b21c7e..20fc39645 100644 --- a/src/frame.c +++ b/src/frame.c @@ -39,6 +39,7 @@ meta_window_ensure_frame (MetaWindow *window) { MetaFrame *frame; XSetWindowAttributes attrs; + Visual *visual; if (window->frame) return; @@ -78,10 +79,16 @@ meta_window_ensure_frame (MetaWindow *window) * visual as the client. */ + visual = 0; + /* XXX special case for depth 32 windows (assumed to be ARGB) */ + if (window->depth == 32) + visual = window->xvisual; + frame->xwindow = meta_ui_create_frame_window (window->screen->ui, - window->display->xdisplay, - frame->rect.x, - frame->rect.y, + window->display->xdisplay, + visual, + frame->rect.x, + frame->rect.y, frame->rect.width, frame->rect.height, frame->window->screen->number); diff --git a/src/ui.c b/src/ui.c index 993ec2731..93a6beb15 100644 --- a/src/ui.c +++ b/src/ui.c @@ -154,7 +154,8 @@ meta_ui_get_frame_geometry (MetaUI *ui, Window meta_ui_create_frame_window (MetaUI *ui, - Display *xdisplay, + Display *xdisplay, + Visual *xvisual, gint x, gint y, gint width, @@ -166,12 +167,22 @@ meta_ui_create_frame_window (MetaUI *ui, GdkWindowAttr attrs; gint attributes_mask; GdkWindow *window; + GdkVisual *visual; + GdkColormap *cmap = gdk_screen_get_default_colormap (screen); /* Default depth/visual handles clients with weird visuals; they can * always be children of the root depth/visual obviously, but * e.g. DRI games can't be children of a parent that has the same * visual as the client. */ + if (!xvisual) + visual = gdk_screen_get_system_visual (screen); + else + { + visual = gdk_x11_screen_lookup_visual (screen, + XVisualIDFromVisual (xvisual)); + cmap = gdk_colormap_new (visual, FALSE); + } attrs.title = NULL; @@ -185,8 +196,8 @@ meta_ui_create_frame_window (MetaUI *ui, attrs.x = x; attrs.y = y; attrs.wclass = GDK_INPUT_OUTPUT; - attrs.visual = gdk_screen_get_system_visual (screen); - attrs.colormap = gdk_screen_get_default_colormap (screen); + attrs.visual = visual; + attrs.colormap = cmap; attrs.window_type = GDK_WINDOW_CHILD; attrs.cursor = NULL; attrs.wmclass_name = NULL; diff --git a/src/ui.h b/src/ui.h index ca8240ec3..f4cb8d0fd 100644 --- a/src/ui.h +++ b/src/ui.h @@ -58,7 +58,8 @@ void meta_ui_get_frame_geometry (MetaUI *ui, int *top_height, int *bottom_height, int *left_width, int *right_width); Window meta_ui_create_frame_window (MetaUI *ui, - Display *xdisplay, + Display *xdisplay, + Visual *xvisual, gint x, gint y, gint width,