From 6ac67f80a6bac067f3314434dfd48bf7d547e763 Mon Sep 17 00:00:00 2001 From: Rob Adams Date: Sun, 16 Nov 2003 04:19:18 +0000 Subject: [PATCH] Inherit visual from frame window so that metacity will work with the new 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. --- ChangeLog | 16 ++++++++++++++++ src/frame.c | 13 ++++++++++--- src/ui.c | 17 ++++++++++++++--- src/ui.h | 3 ++- 4 files changed, 42 insertions(+), 7 deletions(-) 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,