diff options
author | Iain Holmes <iain@src.gnome.org> | 2007-11-22 00:57:48 +0000 |
---|---|---|
committer | Iain Holmes <iain@src.gnome.org> | 2007-11-22 00:57:48 +0000 |
commit | 001205a3c9b1204fde3dff61280dbe7c5fe00968 (patch) | |
tree | 35aa81bbba3be90067eb7d7b9691d9d330a635ac | |
parent | bf35b52abf03e176f811b1ba2e5bbf50b928b0bd (diff) | |
download | metacity-001205a3c9b1204fde3dff61280dbe7c5fe00968.tar.gz |
Correctly put a drop shadow on the frame-free windows (like the panel)
while not putting shadows around weirdly shaped windows like awn or the
libnotify popups.
Shuffle around how the windows are added so we can pass the MetaWindow
to the compositor.
svn path=/branches/iains-blingtastic-bucket-o-bling/; revision=3425
-rw-r--r-- | src/compositor.c | 27 | ||||
-rw-r--r-- | src/display.c | 19 | ||||
-rw-r--r-- | src/screen.c | 24 |
3 files changed, 49 insertions, 21 deletions
diff --git a/src/compositor.c b/src/compositor.c index 0ff57d8a..abe8fa3a 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -654,6 +654,22 @@ paint_root (MetaScreen *screen, screen->rect.width, screen->rect.height); } +static gboolean +window_has_shadow (MetaCompWindow *cw) +{ + /* Always put a shadow around windows with a frame */ + if (cw->window) + { + if (cw->window->frame) + return TRUE; + } + + if (cw->mode != WINDOW_ARGB) + return TRUE; + + return FALSE; +} + static XserverRegion win_extents (MetaCompWindow *cw) { @@ -671,16 +687,7 @@ win_extents (MetaCompWindow *cw) r.width = cw->attrs.width + cw->attrs.border_width * 2; r.height = cw->attrs.height + cw->attrs.border_width * 2; - /* - We apply a shadow to the window if: - * the window is ARGB and not override redirected. - * the window is shaped and not override redirected. - * if it has a frame - */ - - if ((! (cw->mode == WINDOW_ARGB && cw->attrs.override_redirect)) && - (! (cw->shaped && cw->attrs.override_redirect)) && - ( (cw->window && cw->window->frame))) + if (window_has_shadow (cw)) { XRectangle sr; diff --git a/src/display.c b/src/display.c index 63e80530..03925cba 100644 --- a/src/display.c +++ b/src/display.c @@ -191,7 +191,8 @@ sn_error_trap_pop (SnDisplay *sn_display, #endif static void -enable_compositor (MetaDisplay *display) +enable_compositor (MetaDisplay *display, + gboolean composite_windows) { GSList *list; @@ -208,7 +209,8 @@ enable_compositor (MetaDisplay *display) meta_compositor_manage_screen (screen->display->compositor, screen); - meta_screen_composite_all_windows (screen); + if (composite_windows) + meta_screen_composite_all_windows (screen); } } @@ -816,7 +818,13 @@ meta_display_open (void) meta_display_close (display, timestamp); return FALSE; } - + + /* We don't composite the windows here because they will be composited + faster with the call to meta_screen_manage_all_windows further down + the code */ + if (meta_prefs_get_compositing_manager ()) + enable_compositor (display, FALSE); + meta_display_grab (display); /* Now manage all existing windows */ @@ -870,9 +878,6 @@ meta_display_open (void) meta_display_ungrab (display); - if (meta_prefs_get_compositing_manager ()) - enable_compositor (display); - /* Done opening new display */ display->display_opening = FALSE; @@ -4904,7 +4909,7 @@ prefs_changed_callback (MetaPreference pref, gboolean cm = meta_prefs_get_compositing_manager (); if (cm) - enable_compositor (display); + enable_compositor (display, TRUE); else disable_compositor (display); } diff --git a/src/screen.c b/src/screen.c index eb21fdc8..7eb8c409 100644 --- a/src/screen.c +++ b/src/screen.c @@ -812,9 +812,21 @@ meta_screen_manage_all_windows (MetaScreen *screen) for (list = windows; list != NULL; list = list->next) { WindowInfo *info = list->data; + MetaWindow *window; - meta_window_new_with_attrs (screen->display, info->xwindow, TRUE, - &info->attrs); + window = meta_window_new_with_attrs (screen->display, info->xwindow, TRUE, + &info->attrs); + 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; + } + + if (screen->display->compositor) + meta_compositor_add_window (screen->display->compositor, window, + info->xwindow, &info->attrs); } meta_stack_thaw (screen->stack); @@ -828,9 +840,11 @@ void meta_screen_composite_all_windows (MetaScreen *screen) { #ifdef HAVE_COMPOSITE_EXTENSIONS + MetaDisplay *display; GList *windows, *list; - if (!screen->display->compositor) + display = screen->display; + if (!display->compositor) return; windows = list_windows (screen); @@ -849,7 +863,9 @@ meta_screen_composite_all_windows (MetaScreen *screen) continue; } - meta_compositor_add_window (screen->display->compositor, NULL, + meta_compositor_add_window (display->compositor, + meta_display_lookup_x_window (display, + info->xwindow), info->xwindow, &info->attrs); } |