summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIain Holmes <iain@src.gnome.org>2007-11-22 00:57:48 +0000
committerIain Holmes <iain@src.gnome.org>2007-11-22 00:57:48 +0000
commit001205a3c9b1204fde3dff61280dbe7c5fe00968 (patch)
tree35aa81bbba3be90067eb7d7b9691d9d330a635ac
parentbf35b52abf03e176f811b1ba2e5bbf50b928b0bd (diff)
downloadmetacity-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.c27
-rw-r--r--src/display.c19
-rw-r--r--src/screen.c24
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);
}