From f5b9a5805adfab54993a7ad0b81e817b8eb000e3 Mon Sep 17 00:00:00 2001 From: Adam Endrodi Date: Tue, 23 Nov 2010 12:33:24 +0200 Subject: Fixes: NB#202389 - mcompositor is wasting time printing stuff to console Don't print a warning if MWindowPropertyCache is created with window=None by MCompositeWindowGroup. Use a singleton dummy object instead. This is also good for performance. * src/mwindowpropertycache.h (MWindowDummyPropertyCache): new class * src/mwindowpropertycache.cpp: - MWindowPropertyCache::MWindowPropertyCache(): new constructor, creating an "invalid" object. * src/mcompositewindowgroup.cpp: use the MWindowDummyPropertyCache singleton --- src/mcompositewindowgroup.cpp | 2 +- src/mwindowpropertycache.cpp | 133 ++++++++++++++++++++++++++---------------- src/mwindowpropertycache.h | 16 +++++ 3 files changed, 100 insertions(+), 51 deletions(-) diff --git a/src/mcompositewindowgroup.cpp b/src/mcompositewindowgroup.cpp index e2ee072..274c0fc 100644 --- a/src/mcompositewindowgroup.cpp +++ b/src/mcompositewindowgroup.cpp @@ -81,7 +81,7 @@ public: with \a mainWindow */ MCompositeWindowGroup::MCompositeWindowGroup(MTexturePixmapItem* mainWindow) - :MCompositeWindow(0, new MWindowPropertyCache(0)), + :MCompositeWindow(0, MWindowDummyPropertyCache::get()), d_ptr(new MCompositeWindowGroupPrivate(mainWindow)) { MCompositeManager *p = (MCompositeManager *) qApp; diff --git a/src/mwindowpropertycache.cpp b/src/mwindowpropertycache.cpp index a54890b..52d19a6 100644 --- a/src/mwindowpropertycache.cpp +++ b/src/mwindowpropertycache.cpp @@ -34,68 +34,78 @@ xcb_connection_t *MWindowPropertyCache::xcb_conn; -MWindowPropertyCache::MWindowPropertyCache(Window w, - xcb_get_window_attributes_reply_t *wa, - xcb_get_geometry_reply_t *geom) - : transient_for((Window)-1), - wm_protocols_valid(false), - icon_geometry_valid(false), - decor_buttons_valid(false), - shape_rects_valid(false), - real_geom_valid(false), - net_wm_state_valid(false), - wm_state_query(true), - has_alpha(-1), - global_alpha(-1), - video_global_alpha(-1), - is_decorator(-1), - wmhints(0), - attrs(0), - meego_layer(-1), - window_state(-1), - window_type(MCompAtoms::INVALID), - window(w), - parent_window(RootWindow(QX11Info::display(), 0)), - always_mapped(-1), - cannot_minimize(-1), - desktop_view(-1), - being_mapped(false), - dont_iconify(false), - custom_region(0), - custom_region_request_fired(false), - xcb_real_geom(0), - damage_object(0) +void MWindowPropertyCache::init() { + transient_for = -1, + wm_protocols_valid = false; + icon_geometry_valid = false; + decor_buttons_valid = false; + shape_rects_valid = false; + real_geom_valid = false; + net_wm_state_valid = false; + wm_state_query = true; + has_alpha = -1; + global_alpha = -1; + video_global_alpha = -1; + is_decorator = -1; + wmhints = 0; + attrs = 0; + meego_layer = -1; + window_state = -1; + window_type = MCompAtoms::INVALID; + parent_window = QX11Info::appRootWindow(); + always_mapped = -1; + cannot_minimize = -1; + desktop_view = -1; + being_mapped = false; + dont_iconify = false; + custom_region = 0; + custom_region_request_fired = false; + xcb_real_geom = 0; + damage_object = 0; + memset(&req_geom, 0, sizeof(req_geom)); memset(&home_button_geom, 0, sizeof(home_button_geom)); memset(&close_button_geom, 0, sizeof(close_button_geom)); window_type_atom = 0; memset(&xcb_real_geom_cookie, 0, sizeof(xcb_real_geom_cookie)); +} +void MWindowPropertyCache::init_invalid() +{ + is_valid = false; + memset(&xcb_transient_for_cookie, 0, + sizeof(xcb_transient_for_cookie)); + memset(&xcb_meego_layer_cookie, 0, sizeof(xcb_meego_layer_cookie)); + memset(&xcb_is_decorator_cookie, 0, sizeof(xcb_is_decorator_cookie)); + memset(&xcb_window_type_cookie, 0, sizeof(xcb_window_type_cookie)); + memset(&xcb_decor_buttons_cookie, 0, sizeof(xcb_decor_buttons_cookie)); + memset(&xcb_wm_protocols_cookie, 0, sizeof(xcb_wm_protocols_cookie)); + memset(&xcb_wm_state_cookie, 0, sizeof(xcb_wm_state_cookie)); + memset(&xcb_wm_hints_cookie, 0, sizeof(xcb_wm_hints_cookie)); + memset(&xcb_icon_geom_cookie, 0, sizeof(xcb_icon_geom_cookie)); + memset(&xcb_global_alpha_cookie, 0, sizeof(xcb_global_alpha_cookie)); + memset(&xcb_video_global_alpha_cookie, 0, + sizeof(xcb_video_global_alpha_cookie)); + memset(&xcb_net_wm_state_cookie, 0, sizeof(xcb_net_wm_state_cookie)); + memset(&xcb_always_mapped_cookie, 0, sizeof(xcb_always_mapped_cookie)); + memset(&xcb_cannot_minimize_cookie, 0, sizeof(xcb_always_mapped_cookie)); + memset(&xcb_pict_formats_cookie, 0, sizeof(xcb_pict_formats_cookie)); + memset(&xcb_shape_rects_cookie, 0, sizeof(xcb_shape_rects_cookie)); +} + +MWindowPropertyCache::MWindowPropertyCache(Window w, + xcb_get_window_attributes_reply_t *wa, + xcb_get_geometry_reply_t *geom) + : window(w) +{ + init(); if (!wa) { attrs = xcb_get_window_attributes_reply(xcb_conn, xcb_get_window_attributes(xcb_conn, window), 0); if (!attrs) { qWarning("%s: invalid window 0x%lx", __func__, window); - is_valid = false; - memset(&xcb_transient_for_cookie, 0, - sizeof(xcb_transient_for_cookie)); - memset(&xcb_meego_layer_cookie, 0, sizeof(xcb_meego_layer_cookie)); - memset(&xcb_is_decorator_cookie, 0, sizeof(xcb_is_decorator_cookie)); - memset(&xcb_window_type_cookie, 0, sizeof(xcb_window_type_cookie)); - memset(&xcb_decor_buttons_cookie, 0, sizeof(xcb_decor_buttons_cookie)); - memset(&xcb_wm_protocols_cookie, 0, sizeof(xcb_wm_protocols_cookie)); - memset(&xcb_wm_state_cookie, 0, sizeof(xcb_wm_state_cookie)); - memset(&xcb_wm_hints_cookie, 0, sizeof(xcb_wm_hints_cookie)); - memset(&xcb_icon_geom_cookie, 0, sizeof(xcb_icon_geom_cookie)); - memset(&xcb_global_alpha_cookie, 0, sizeof(xcb_global_alpha_cookie)); - memset(&xcb_video_global_alpha_cookie, 0, - sizeof(xcb_video_global_alpha_cookie)); - memset(&xcb_net_wm_state_cookie, 0, sizeof(xcb_net_wm_state_cookie)); - memset(&xcb_always_mapped_cookie, 0, sizeof(xcb_always_mapped_cookie)); - memset(&xcb_cannot_minimize_cookie, 0, sizeof(xcb_always_mapped_cookie)); - memset(&xcb_pict_formats_cookie, 0, sizeof(xcb_pict_formats_cookie)); - memset(&xcb_shape_rects_cookie, 0, sizeof(xcb_shape_rects_cookie)); + init_invalid(); return; } } else @@ -171,6 +181,13 @@ MWindowPropertyCache::MWindowPropertyCache(Window w, m->d, SLOT(setupButtonWindows(Window))); } +MWindowPropertyCache::MWindowPropertyCache() + : window(None) +{ + init(); + init_invalid(); +} + MWindowPropertyCache::~MWindowPropertyCache() { if (!is_valid) { @@ -890,3 +907,19 @@ MCompAtoms::Type MWindowPropertyCache::windowType() return window_type; } +// MWindowDummyPropertyCache +MWindowDummyPropertyCache *MWindowDummyPropertyCache::singleton; + +MWindowDummyPropertyCache *MWindowDummyPropertyCache::get() +{ + if (!singleton) + singleton = new MWindowDummyPropertyCache(); + return singleton; +} + +bool MWindowDummyPropertyCache::event(QEvent *e) +{ + // Ignore deleteLater(). + return e->type() == QEvent::DeferredDelete + ? true : MWindowPropertyCache::event(e); +} diff --git a/src/mwindowpropertycache.h b/src/mwindowpropertycache.h index 5329bd7..1b1d0bb 100644 --- a/src/mwindowpropertycache.h +++ b/src/mwindowpropertycache.h @@ -40,7 +40,9 @@ public: /*! Construct a MWindowPropertyCache * \param window id to the window whose properties are cached + * Without one constructs a placeholder object. */ + MWindowPropertyCache(); MWindowPropertyCache(Window window, xcb_get_window_attributes_reply_t *attrs = 0, xcb_get_geometry_reply_t *geom = 0); @@ -268,6 +270,8 @@ signals: void customRegionChanged(MWindowPropertyCache *pc); private: + void init(); + void init_invalid(); int alphaValue(xcb_get_property_cookie_t c); void buttonGeometryHelper(); @@ -326,4 +330,16 @@ private: Damage damage_object; }; +// Non-deletable dummy MWindowPropertyCache. +class MWindowDummyPropertyCache: public MWindowPropertyCache +{ +public: + static MWindowDummyPropertyCache *get(); + +private: + virtual bool event(QEvent *e); + + static MWindowDummyPropertyCache *singleton; +}; + #endif -- cgit v1.2.3