diff options
author | Iain Holmes <iain@src.gnome.org> | 2007-11-11 00:38:29 +0000 |
---|---|---|
committer | Iain Holmes <iain@src.gnome.org> | 2007-11-11 00:38:29 +0000 |
commit | 50c5c9c54d61003acc0df68252e66d0dd0b1daa8 (patch) | |
tree | 9321d333656ac57c34f37d895dee265d0b2bcb60 | |
parent | 76b82892896f3409b5ac6671e5fc5af515006a00 (diff) | |
download | metacity-50c5c9c54d61003acc0df68252e66d0dd0b1daa8.tar.gz |
Ignore the metacity windows that don't need to be composited
Wrap the compositor event process function in meta_error_trap_push/pop
functions that that rogue events for dead windows don't cause crashes
svn path=/branches/iains-blingtastic-bucket-o-bling/; revision=3382
-rw-r--r-- | src/compositor.c | 171 | ||||
-rw-r--r-- | src/screen.c | 10 |
2 files changed, 97 insertions, 84 deletions
diff --git a/src/compositor.c b/src/compositor.c index 25ce00de..a761c13d 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -994,6 +994,66 @@ repair_win (MetaCompWindow *cw) } static void +free_win (MetaCompWindow *cw, + gboolean destroy) +{ + MetaDisplay *display = cw->screen->display; + +#ifdef HAVE_NAME_WINDOW_PIXMAP + if (cw->pixmap) { + XFreePixmap (display->xdisplay, cw->pixmap); + cw->pixmap = None; + } +#endif + + if (cw->picture) { + XRenderFreePicture (display->xdisplay, cw->picture); + cw->picture = None; + } + + if (cw->shadow) { + XRenderFreePicture (display->xdisplay, cw->shadow); + cw->shadow = None; + } + + if (cw->alpha_pict) { + XRenderFreePicture (display->xdisplay, cw->alpha_pict); + cw->alpha_pict = None; + } + + if (cw->shadow_pict) { + XRenderFreePicture (display->xdisplay, cw->shadow_pict); + cw->shadow_pict = None; + } + + if (cw->border_size) { + XFixesDestroyRegion (display->xdisplay, cw->border_size); + cw->border_size = None; + } + + if (cw->border_clip) { + XFixesDestroyRegion (display->xdisplay, cw->border_clip); + cw->border_clip = None; + } + + if (cw->extents) { + XFixesDestroyRegion (display->xdisplay, cw->extents); + cw->extents = None; + } + + if (destroy) { + if (cw->damage != None) { + /* If we've got here, then the window has already been destroyed + so this will cause a BadWindow */ +/* XDamageDestroy (display->xdisplay, cw->damage); */ + cw->damage = None; + } + + g_free (cw); + } +} + +static void map_win (MetaDisplay *display, MetaScreen *screen, Window id) @@ -1022,38 +1082,13 @@ unmap_win (MetaDisplay *display, cw->attrs.map_state = IsUnmapped; cw->damaged = FALSE; - + if (cw->extents != None) { - add_damage (display, screen, cw->extents); /* Destroys region */ + add_damage (display, screen, cw->extents); cw->extents = None; } -#ifdef HAVE_NAME_WINDOW_PIXMAP - if (cw->pixmap) { - XFreePixmap (display->xdisplay, cw->pixmap); - cw->pixmap = None; - } -#endif - - if (cw->picture) { - XRenderFreePicture (display->xdisplay, cw->picture); - cw->picture = None; - } - - if (cw->border_size) { - XFixesDestroyRegion (display->xdisplay, cw->border_size); - cw->border_size = None; - } - - if (cw->shadow) { - XRenderFreePicture (display->xdisplay, cw->shadow); - cw->shadow = None; - } - if (cw->border_clip) { - XFixesDestroyRegion (display->xdisplay, cw->border_clip); - cw->border_clip = None; - } - + free_win (cw, FALSE); info->clip_changed = TRUE; } @@ -1092,7 +1127,6 @@ determine_mode (MetaDisplay *display, if (cw->extents) { XserverRegion damage; - g_print ("Extents exist\n"); damage = XFixesCreateRegion (display->xdisplay, NULL, 0); XFixesCopyRegion (display->xdisplay, damage, cw->extents); @@ -1160,53 +1194,6 @@ add_win (MetaScreen *screen, } static void -free_win (MetaCompWindow *cw, - gboolean destroy) -{ - MetaDisplay *display = cw->screen->display; - -#ifdef HAVE_NAME_WINDOW_PIXMAP - if (cw->pixmap) { - XFreePixmap (display->xdisplay, cw->pixmap); - cw->pixmap = None; - } -#endif - - if (cw->picture) { - XRenderFreePicture (display->xdisplay, cw->picture); - cw->picture = None; - } - - if (cw->alpha_pict) { - XRenderFreePicture (display->xdisplay, cw->alpha_pict); - cw->alpha_pict = None; - } - - if (cw->shadow_pict) { - XRenderFreePicture (display->xdisplay, cw->shadow_pict); - cw->shadow_pict = None; - } - - if (cw->border_size) { - XFixesDestroyRegion (display->xdisplay, cw->border_size); - cw->border_size = None; - } - - if (cw->extents) { - XFixesDestroyRegion (display->xdisplay, cw->extents); - cw->extents = None; - } - - if (cw->damage != None) { - /* FIXME: This leaks, but its causing a crash */ - /* XDamageDestroy (display->xdisplay, cw->damage); */ - cw->damage = None; - } - - g_free (cw); -} - -static void destroy_win (MetaDisplay *display, Window xwindow, gboolean gone) @@ -1214,13 +1201,16 @@ destroy_win (MetaDisplay *display, MetaCompWindow *cw; cw = find_window_in_display (display, xwindow); + if (cw) { MetaScreen *screen; MetaCompScreen *info; screen = cw->screen; - if (!gone) { - unmap_win (display, screen, xwindow); + + if (cw->extents != None) { + add_damage (display, screen, cw->extents); + cw->extents = None; } info = screen->compositor_data; @@ -1519,6 +1509,7 @@ void meta_compositor_free_window (MetaCompositor *compositor, MetaWindow *window) { + destroy_win (compositor->display, window->xwindow, FALSE); } static void @@ -1588,7 +1579,7 @@ process_expose (MetaCompositor *compositor, event->window); MetaScreen *screen = NULL; XRectangle rect[1]; - + if (cw != NULL) { screen = cw->screen; } else { @@ -1645,7 +1636,7 @@ process_reparent (MetaCompositor *compositor, if (screen != NULL) { add_win (screen, event->window); } else { - destroy_win (compositor->display, event->window, FALSE); + destroy_win (compositor->display, event->window, FALSE); } } @@ -1656,7 +1647,7 @@ process_create (MetaCompositor *compositor, MetaScreen *screen; /* We are only interested in top level windows, others will be caught by normal metacity functions */ - + screen = meta_display_screen_for_root (compositor->display, event->parent); if (screen != NULL) { if (!find_window_in_display (compositor->display, event->window)) { @@ -1669,7 +1660,17 @@ static void process_destroy (MetaCompositor *compositor, XDestroyWindowEvent *event) { - destroy_win (compositor->display, event->window, TRUE); + MetaScreen *screen; + +#if 0 + screen = meta_display_screen_for_root (compositor->display, event->event); + if (screen == NULL) { + g_print ("Ignoring non root window 0x%lx\n", event->window); + return; + } +#endif + + destroy_win (compositor->display, event->window, FALSE); } static void @@ -1678,11 +1679,9 @@ process_damage (MetaCompositor *compositor, { MetaCompWindow *cw = find_window_in_display (compositor->display, event->drawable); - if (cw == NULL) { return; } - repair_win (cw); } @@ -1697,6 +1696,7 @@ meta_compositor_process_event (MetaCompositor *compositor, XEvent *event, MetaWindow *window) { + meta_error_trap_push (compositor->display); switch (event->type) { case CirculateNotify: process_circulate_notify (compositor, (XCirculateEvent *) event); @@ -1741,6 +1741,9 @@ meta_compositor_process_event (MetaCompositor *compositor, break; } + meta_error_trap_pop (compositor->display); repair_display (compositor->display); + + return; } diff --git a/src/screen.c b/src/screen.c index a02effe5..7d05e695 100644 --- a/src/screen.c +++ b/src/screen.c @@ -827,6 +827,7 @@ meta_screen_manage_all_windows (MetaScreen *screen) void meta_screen_composite_all_windows (MetaScreen *screen) { +#ifdef HAVE_COMPOSITE_EXTENSIONS GList *windows, *list; if (!screen->display->compositor) @@ -840,6 +841,14 @@ meta_screen_composite_all_windows (MetaScreen *screen) { WindowInfo *info = list->data; + if (info->xwindow == screen->no_focus_window || + info->xwindow == screen->flash_window || + info->xwindow == screen->wm_sn_selection_window || + info->xwindow == screen->wm_cm_selection_window) { + g_print ("Not managing our own windows\n"); + continue; + } + meta_compositor_add_window (screen->display->compositor, info->xwindow, &info->attrs); } @@ -848,6 +857,7 @@ meta_screen_composite_all_windows (MetaScreen *screen) g_list_foreach (windows, (GFunc)g_free, NULL); g_list_free (windows); +#endif } MetaScreen* |