[metacity] xrender: use appears-focused property to redraw window
- From: Alberts Muktupāvels <muktupavels src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [metacity] xrender: use appears-focused property to redraw window
- Date: Sun, 12 Mar 2017 19:37:14 +0000 (UTC)
commit 6874e048d8446eb357a7b3cb6c1c311aa5943b1d
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date: Sun Mar 12 20:50:58 2017 +0200
xrender: use appears-focused property to redraw window
src/compositor/meta-compositor-xrender.c | 210 +++++++++++-------------------
src/core/window-private.h | 2 -
src/include/window.h | 2 +-
3 files changed, 77 insertions(+), 137 deletions(-)
---
diff --git a/src/compositor/meta-compositor-xrender.c b/src/compositor/meta-compositor-xrender.c
index bd5d788..24466ac 100644
--- a/src/compositor/meta-compositor-xrender.c
+++ b/src/compositor/meta-compositor-xrender.c
@@ -154,8 +154,6 @@ struct _MetaCompositorXRender
GList *windows;
GHashTable *windows_by_xid;
- MetaWindow *focus_window;
-
Window overlay_window;
gboolean have_shadows;
@@ -1975,9 +1973,6 @@ unmap_win (MetaCompositorXRender *xrender,
return;
}
- if (cw->window && cw->window == xrender->focus_window)
- xrender->focus_window = NULL;
-
cw->attrs.map_state = IsUnmapped;
cw->damaged = FALSE;
@@ -2049,6 +2044,78 @@ is_shaped (MetaDisplay *display,
return FALSE;
}
+static void
+notify_appears_focused_cb (MetaWindow *window,
+ GParamSpec *pspec,
+ MetaCompositorXRender *xrender)
+{
+ MetaFrame *frame;
+ Window xwindow;
+ MetaCompWindow *cw;
+ Display *xdisplay;
+ XserverRegion damage;
+
+ frame = meta_window_get_frame (window);
+
+ if (frame)
+ xwindow = meta_frame_get_xwindow (frame);
+ else
+ xwindow = meta_window_get_xwindow (window);
+
+ cw = find_window (xrender, xwindow);
+
+ if (cw == NULL)
+ return;
+
+ xdisplay = window->display->xdisplay;
+ damage = None;
+
+ if (meta_window_appears_focused (window))
+ cw->shadow_type = META_SHADOW_LARGE;
+ else
+ cw->shadow_type = META_SHADOW_MEDIUM;
+
+ determine_mode (xrender, cw);
+ cw->needs_shadow = window_has_shadow (xrender, cw);
+
+ if (cw->mask)
+ {
+ XRenderFreePicture (xdisplay, cw->mask);
+ cw->mask = None;
+ }
+
+ if (cw->shadow)
+ {
+ XRenderFreePicture (xdisplay, cw->shadow);
+ cw->shadow = None;
+ }
+
+ if (cw->extents)
+ {
+ damage = XFixesCreateRegion (xdisplay, NULL, 0);
+ XFixesCopyRegion (xdisplay, damage, cw->extents);
+ XFixesDestroyRegion (xdisplay, cw->extents);
+ }
+
+ cw->extents = win_extents (xrender, cw);
+
+ if (damage)
+ {
+ XFixesUnionRegion (xdisplay, damage, damage, cw->extents);
+ }
+ else
+ {
+ damage = XFixesCreateRegion (xdisplay, NULL, 0);
+ XFixesCopyRegion (xdisplay, damage, cw->extents);
+ }
+
+ dump_xserver_region (xrender, "notify_appears_focused_cb", damage);
+ add_damage (xrender, damage);
+
+ xrender->clip_changed = TRUE;
+ add_repair (xrender);
+}
+
/* Must be called with an error trap in place */
static void
add_win (MetaCompositorXRender *xrender,
@@ -2073,6 +2140,10 @@ add_win (MetaCompositorXRender *xrender,
return;
}
+ g_signal_connect_object (window, "notify::appears-focused",
+ G_CALLBACK (notify_appears_focused_cb),
+ xrender, 0);
+
cw->back_pixmap = None;
cw->mask_pixmap = None;
@@ -2711,8 +2782,6 @@ meta_compositor_xrender_manage (MetaCompositor *compositor,
xrender->windows = NULL;
xrender->windows_by_xid = g_hash_table_new (g_direct_hash, g_direct_equal);
- xrender->focus_window = meta_display_get_focus_window (display);
-
xrender->clip_changed = TRUE;
xrender->have_shadows = (g_getenv("META_DEBUG_NO_SHADOW") == NULL);
@@ -3038,133 +3107,6 @@ static void
meta_compositor_xrender_set_active_window (MetaCompositor *compositor,
MetaWindow *window)
{
- MetaCompositorXRender *xrender;
- MetaDisplay *display;
- Display *xdisplay;
- MetaCompWindow *old_focus = NULL, *new_focus = NULL;
- MetaWindow *old_focus_win = NULL;
-
- xrender = META_COMPOSITOR_XRENDER (compositor);
- display = meta_compositor_get_display (compositor);
- xdisplay = meta_display_get_xdisplay (display);
-
- old_focus_win = xrender->focus_window;
- xrender->focus_window = window;
-
- if (old_focus_win)
- {
- MetaFrame *f = meta_window_get_frame (old_focus_win);
-
- old_focus = find_window (xrender,
- f ? meta_frame_get_xwindow (f) :
- meta_window_get_xwindow (old_focus_win));
- }
-
- if (window)
- {
- MetaFrame *f = meta_window_get_frame (window);
- new_focus = find_window (xrender,
- f ? meta_frame_get_xwindow (f) :
- meta_window_get_xwindow (window));
- }
-
- if (old_focus)
- {
- XserverRegion damage;
-
- /* Tear down old shadows */
- old_focus->shadow_type = META_SHADOW_MEDIUM;
- determine_mode (xrender, old_focus);
- old_focus->needs_shadow = window_has_shadow (xrender, old_focus);
-
- if (old_focus->attrs.map_state == IsViewable)
- {
- if (old_focus->mask)
- {
- XRenderFreePicture (xdisplay, old_focus->mask);
- old_focus->mask = None;
- }
-
- if (old_focus->shadow)
- {
- XRenderFreePicture (xdisplay, old_focus->shadow);
- old_focus->shadow = None;
- }
-
- if (old_focus->extents)
- {
- damage = XFixesCreateRegion (xdisplay, NULL, 0);
- XFixesCopyRegion (xdisplay, damage, old_focus->extents);
- XFixesDestroyRegion (xdisplay, old_focus->extents);
- }
- else
- damage = None;
-
- /* Build new extents */
- old_focus->extents = win_extents (xrender, old_focus);
-
- if (damage)
- XFixesUnionRegion (xdisplay, damage, damage, old_focus->extents);
- else
- {
- damage = XFixesCreateRegion (xdisplay, NULL, 0);
- XFixesCopyRegion (xdisplay, damage, old_focus->extents);
- }
-
- dump_xserver_region (xrender, "resize_win", damage);
- add_damage (xrender, damage);
-
- xrender->clip_changed = TRUE;
- }
- }
-
- if (new_focus)
- {
- XserverRegion damage;
-
- new_focus->shadow_type = META_SHADOW_LARGE;
- determine_mode (xrender, new_focus);
- new_focus->needs_shadow = window_has_shadow (xrender, new_focus);
-
- if (new_focus->mask)
- {
- XRenderFreePicture (xdisplay, new_focus->mask);
- new_focus->mask = None;
- }
-
- if (new_focus->shadow)
- {
- XRenderFreePicture (xdisplay, new_focus->shadow);
- new_focus->shadow = None;
- }
-
- if (new_focus->extents)
- {
- damage = XFixesCreateRegion (xdisplay, NULL, 0);
- XFixesCopyRegion (xdisplay, damage, new_focus->extents);
- XFixesDestroyRegion (xdisplay, new_focus->extents);
- }
- else
- damage = None;
-
- /* Build new extents */
- new_focus->extents = win_extents (xrender, new_focus);
-
- if (damage)
- XFixesUnionRegion (xdisplay, damage, damage, new_focus->extents);
- else
- {
- damage = XFixesCreateRegion (xdisplay, NULL, 0);
- XFixesCopyRegion (xdisplay, damage, new_focus->extents);
- }
-
- dump_xserver_region (xrender, "resize_win", damage);
- add_damage (xrender, damage);
-
- xrender->clip_changed = TRUE;
- }
-
- add_repair (xrender);
}
static void
diff --git a/src/core/window-private.h b/src/core/window-private.h
index 2987331..1d76eef 100644
--- a/src/core/window-private.h
+++ b/src/core/window-private.h
@@ -500,8 +500,6 @@ void meta_window_update_fullscreen_monitors (MetaWindow *window,
unsigned long left,
unsigned long right);
-gboolean meta_window_appears_focused (MetaWindow *window);
-
/* args to move are window pos, not frame pos */
void meta_window_move (MetaWindow *window,
gboolean user_op,
diff --git a/src/include/window.h b/src/include/window.h
index 1fbd9b6..66d5822 100644
--- a/src/include/window.h
+++ b/src/include/window.h
@@ -42,7 +42,7 @@ MetaWindow *meta_window_get_transient_for (MetaWindow *window);
gboolean meta_window_is_fullscreen (MetaWindow *window);
gboolean meta_window_is_maximized (MetaWindow *window);
gboolean meta_window_is_attached_dialog (MetaWindow *window);
-
+gboolean meta_window_appears_focused (MetaWindow *window);
cairo_region_t *meta_window_get_frame_bounds (MetaWindow *window);
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]