USe the compositor overlay window instead of the root window.
2007-12-25 Iain Holmes <iain@gnome.org> * src/core/compositor.c: USe the compositor overlay window instead of the root window. svn path=/trunk/; revision=3498
This commit is contained in:
parent
a8e2f45b1c
commit
c96ae75437
@ -1,3 +1,8 @@
|
|||||||
|
2007-12-25 Iain Holmes <iain@gnome.org>
|
||||||
|
|
||||||
|
* src/core/compositor.c: USe the compositor overlay window instead of
|
||||||
|
the root window.
|
||||||
|
|
||||||
2007-12-21 Paolo Borelli <pborelli@katamail.com>
|
2007-12-21 Paolo Borelli <pborelli@katamail.com>
|
||||||
|
|
||||||
* src/core/core.c (meta_invalidate_default_icons): do not leak list.
|
* src/core/core.c (meta_invalidate_default_icons): do not leak list.
|
||||||
|
@ -47,6 +47,12 @@
|
|||||||
#define HAVE_NAME_WINDOW_PIXMAP 1
|
#define HAVE_NAME_WINDOW_PIXMAP 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if COMPOSITE_MAJOR > 0 || COMPOSITE_MINOR >= 3
|
||||||
|
#define HAVE_COW 1
|
||||||
|
#else
|
||||||
|
/* Don't have a cow man...HAAHAAHAA */
|
||||||
|
#endif
|
||||||
|
|
||||||
#define USE_IDLE_REPAINT 1
|
#define USE_IDLE_REPAINT 1
|
||||||
|
|
||||||
typedef enum _MetaCompWindowType
|
typedef enum _MetaCompWindowType
|
||||||
@ -86,6 +92,8 @@ typedef struct _MetaCompScreen
|
|||||||
GList *windows;
|
GList *windows;
|
||||||
GHashTable *windows_by_xid;
|
GHashTable *windows_by_xid;
|
||||||
|
|
||||||
|
Window output;
|
||||||
|
|
||||||
gboolean have_shadows;
|
gboolean have_shadows;
|
||||||
conv *gaussian_map;
|
conv *gaussian_map;
|
||||||
guchar *shadow_corner;
|
guchar *shadow_corner;
|
||||||
@ -695,6 +703,7 @@ static Picture
|
|||||||
create_root_buffer (MetaScreen *screen)
|
create_root_buffer (MetaScreen *screen)
|
||||||
{
|
{
|
||||||
MetaDisplay *display = screen->display;
|
MetaDisplay *display = screen->display;
|
||||||
|
MetaCompScreen *info = screen->compositor_data;
|
||||||
Picture pict;
|
Picture pict;
|
||||||
XRenderPictFormat *format;
|
XRenderPictFormat *format;
|
||||||
Pixmap root_pixmap;
|
Pixmap root_pixmap;
|
||||||
@ -711,7 +720,7 @@ create_root_buffer (MetaScreen *screen)
|
|||||||
g_return_val_if_fail (format != NULL, None);
|
g_return_val_if_fail (format != NULL, None);
|
||||||
|
|
||||||
root_pixmap = XCreatePixmap (display->xdisplay,
|
root_pixmap = XCreatePixmap (display->xdisplay,
|
||||||
screen->xroot,
|
info->output,
|
||||||
screen_width, screen_height, depth);
|
screen_width, screen_height, depth);
|
||||||
g_return_val_if_fail (root_pixmap != None, None);
|
g_return_val_if_fail (root_pixmap != None, None);
|
||||||
|
|
||||||
@ -1590,16 +1599,16 @@ add_win (MetaScreen *screen,
|
|||||||
{
|
{
|
||||||
MetaDisplay *display = screen->display;
|
MetaDisplay *display = screen->display;
|
||||||
MetaCompScreen *info = screen->compositor_data;
|
MetaCompScreen *info = screen->compositor_data;
|
||||||
MetaCompWindow *cw = g_new0 (MetaCompWindow, 1);
|
MetaCompWindow *cw;
|
||||||
gulong event_mask;
|
gulong event_mask;
|
||||||
|
|
||||||
if (info == NULL)
|
if (info == NULL)
|
||||||
{
|
return;
|
||||||
g_warning ("Screen not managed");
|
|
||||||
g_free (cw);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if (xwindow == info->output)
|
||||||
|
return;
|
||||||
|
|
||||||
|
cw = g_new0 (MetaCompWindow, 1);
|
||||||
cw->screen = screen;
|
cw->screen = screen;
|
||||||
cw->window = window;
|
cw->window = window;
|
||||||
cw->id = xwindow;
|
cw->id = xwindow;
|
||||||
@ -2260,6 +2269,50 @@ meta_compositor_remove_window (MetaCompositor *compositor,
|
|||||||
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
#ifdef HAVE_COMPOSITE_EXTENSIONS
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
#ifdef HAVE_COW
|
||||||
|
static void
|
||||||
|
show_overlay_window (MetaScreen *screen,
|
||||||
|
Window cow)
|
||||||
|
{
|
||||||
|
MetaDisplay *display = screen->display;
|
||||||
|
XserverRegion region;
|
||||||
|
|
||||||
|
region = XFixesCreateRegion (display->xdisplay, NULL, 0);
|
||||||
|
|
||||||
|
XFixesSetWindowShapeRegion (display->xdisplay, cow, ShapeBounding, 0, 0, 0);
|
||||||
|
XFixesSetWindowShapeRegion (display->xdisplay, cow, ShapeInput, 0, 0, region);
|
||||||
|
|
||||||
|
XFixesDestroyRegion (display->xdisplay, region);
|
||||||
|
|
||||||
|
damage_screen (screen);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
hide_overlay_window (MetaScreen *screen,
|
||||||
|
Window cow)
|
||||||
|
{
|
||||||
|
MetaDisplay *display = screen->display;
|
||||||
|
XserverRegion region;
|
||||||
|
|
||||||
|
region = XFixesCreateRegion (display->xdisplay, NULL, 0);
|
||||||
|
XFixesSetWindowShapeRegion (display->xdisplay,
|
||||||
|
cow, ShapeBounding,
|
||||||
|
0, 0, region);
|
||||||
|
XFixesDestroyRegion (display->xdisplay, region);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Window
|
||||||
|
get_overlay_window (MetaScreen *screen)
|
||||||
|
{
|
||||||
|
MetaDisplay *display = screen->display;
|
||||||
|
Window cow;
|
||||||
|
|
||||||
|
cow = XCompositeGetOverlayWindow (display->xdisplay, screen->xroot);
|
||||||
|
XSelectInput (display->xdisplay, cow, ExposureMask);
|
||||||
|
|
||||||
|
return cow;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_compositor_manage_screen (MetaCompositor *compositor,
|
meta_compositor_manage_screen (MetaCompositor *compositor,
|
||||||
@ -2291,6 +2344,8 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
|
|||||||
info = g_new0 (MetaCompScreen, 1);
|
info = g_new0 (MetaCompScreen, 1);
|
||||||
info->screen = screen;
|
info->screen = screen;
|
||||||
|
|
||||||
|
screen->compositor_data = info;
|
||||||
|
|
||||||
visual_format = XRenderFindVisualFormat (display->xdisplay,
|
visual_format = XRenderFindVisualFormat (display->xdisplay,
|
||||||
DefaultVisual (display->xdisplay,
|
DefaultVisual (display->xdisplay,
|
||||||
screen->number));
|
screen->number));
|
||||||
@ -2300,8 +2355,14 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_COW
|
||||||
|
info->output = get_overlay_window (screen);
|
||||||
|
#else
|
||||||
|
info->output = screen->xroot;
|
||||||
|
#endif
|
||||||
|
|
||||||
pa.subwindow_mode = IncludeInferiors;
|
pa.subwindow_mode = IncludeInferiors;
|
||||||
info->root_picture = XRenderCreatePicture (display->xdisplay, screen->xroot,
|
info->root_picture = XRenderCreatePicture (display->xdisplay, info->output,
|
||||||
visual_format,
|
visual_format,
|
||||||
CPSubwindowMode, &pa);
|
CPSubwindowMode, &pa);
|
||||||
if (info->root_picture == None)
|
if (info->root_picture == None)
|
||||||
@ -2327,11 +2388,15 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
|
|||||||
info->gaussian_map = make_gaussian_map (SHADOW_RADIUS);
|
info->gaussian_map = make_gaussian_map (SHADOW_RADIUS);
|
||||||
presum_gaussian (info);
|
presum_gaussian (info);
|
||||||
|
|
||||||
XClearArea (display->xdisplay, screen->xroot, 0, 0, 0, 0, TRUE);
|
XClearArea (display->xdisplay, info->output, 0, 0, 0, 0, TRUE);
|
||||||
|
|
||||||
meta_screen_set_cm_selection (screen);
|
meta_screen_set_cm_selection (screen);
|
||||||
|
|
||||||
screen->compositor_data = info;
|
#ifdef HAVE_COW
|
||||||
|
/* Now we're up and running we can show the output if needed */
|
||||||
|
show_overlay_window (screen, info->output);
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user