[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kwin] /: Move event filtering for overlay window into an X11EventFilter
From:       Martin_Flöser <null () kde ! org>
Date:       2017-08-12 9:33:16
Message-ID: E1dgSnE-0007Rn-3t () code ! kde ! org
[Download RAW message or body]

Git commit a65b2c062cb0c02497d593aa535150fd23b5651c by Martin Flöser.
Committed on 12/08/2017 at 09:32.
Pushed by graesslin into branch 'master'.

Move event filtering for overlay window into an X11EventFilter

Summary:
The OverlayWindowX11 also inherits from X11EventFilter and performs
the filtering itself.

Test Plan: Compiles, not yet tested as I'm on Wayland

Reviewers: #kwin, #plasma

Subscribers: plasma-devel

Tags: #plasma

Differential Revision: https://phabricator.kde.org/D7197

M  +0    -18   composite.cpp
M  +0    -8    composite.h
M  +0    -24   events.cpp
M  +28   -0    plugins/platforms/x11/standalone/overlaywindow_x11.cpp
M  +4    -1    plugins/platforms/x11/standalone/overlaywindow_x11.h

https://commits.kde.org/kwin/a65b2c062cb0c02497d593aa535150fd23b5651c

diff --git a/composite.cpp b/composite.cpp
index 4c848f04d..50791a87e 100644
--- a/composite.cpp
+++ b/composite.cpp
@@ -905,17 +905,6 @@ bool Compositor::checkForOverlayWindow(WId w) const
     return w == m_scene->overlayWindow()->window();
 }
 
-WId Compositor::overlayWindow() const
-{
-    if (!hasScene()) {
-        return None;
-    }
-    if (!m_scene->overlayWindow()) {
-        return None;
-    }
-    return m_scene->overlayWindow()->window();
-}
-
 bool Compositor::isOverlayWindowVisible() const
 {
     if (!hasScene()) {
@@ -927,13 +916,6 @@ bool Compositor::isOverlayWindowVisible() const
     return m_scene->overlayWindow()->isVisible();
 }
 
-void Compositor::setOverlayWindowVisibility(bool visible)
-{
-    if (hasScene() && m_scene->overlayWindow()) {
-        m_scene->overlayWindow()->setVisibility(visible);
-    }
-}
-
 /*****************************************************
  * Workspace
  ****************************************************/
diff --git a/composite.h b/composite.h
index a7aee5641..ccff306a9 100644
--- a/composite.h
+++ b/composite.h
@@ -78,18 +78,10 @@ public:
      * Checks whether @p w is the Scene's overlay window.
      **/
     bool checkForOverlayWindow(WId w) const;
-    /**
-     * @returns The Scene's Overlay X Window.
-     **/
-    WId overlayWindow() const;
     /**
      * @returns Whether the Scene's Overlay X Window is visible.
      **/
     bool isOverlayWindowVisible() const;
-    /**
-     * Set's the Scene's Overlay X Window visibility to @p visible.
-     **/
-    void setOverlayWindowVisibility(bool visible);
 
     Scene *scene() {
         return m_scene;
diff --git a/events.cpp b/events.cpp
index 931c95c5a..d93214612 100644
--- a/events.cpp
+++ b/events.cpp
@@ -35,7 +35,6 @@ along with this program.  If not, see \
<http://www.gnu.org/licenses/>.  #include "tabbox.h"
 #endif
 #include "group.h"
-#include "overlaywindow.h"
 #include "rules.h"
 #include "unmanaged.h"
 #include "useractions.h"
@@ -506,29 +505,6 @@ bool Workspace::workspaceEvent(xcb_generic_event_t *e)
         if (ScreenEdges::self()->isEntered(reinterpret_cast<xcb_client_message_event_t*>(e)))
  return true;
         break;
-    case XCB_EXPOSE: {
-        const auto *event = reinterpret_cast<xcb_expose_event_t*>(e);
-        if (compositing()
-                && (event->window == rootWindow()   // root window needs repainting
-                    || (m_compositor->overlayWindow() != XCB_WINDOW_NONE && \
                event->window == m_compositor->overlayWindow()))) { // overlay needs \
                repainting
-            m_compositor->addRepaint(event->x, event->y, event->width, \
                event->height);
-        }
-        break;
-    }
-    case XCB_VISIBILITY_NOTIFY: {
-        const auto *event = reinterpret_cast<xcb_visibility_notify_event_t*>(e);
-        if (compositing() && m_compositor->overlayWindow() != XCB_WINDOW_NONE && \
                event->window == m_compositor->overlayWindow()) {
-            bool was_visible = m_compositor->isOverlayWindowVisible();
-            m_compositor->setOverlayWindowVisibility((event->state != \
                XCB_VISIBILITY_FULLY_OBSCURED));
-            if (!was_visible && m_compositor->isOverlayWindowVisible()) {
-                // hack for #154825
-                m_compositor->addRepaintFull();
-                QTimer::singleShot(2000, m_compositor, SLOT(addRepaintFull()));
-            }
-            m_compositor->scheduleRepaint();
-        }
-        break;
-    }
     default:
         if (eventType == Xcb::Extensions::self()->randrNotifyEvent() && \
                Xcb::Extensions::self()->isRandrAvailable()) {
             auto *event = \
                reinterpret_cast<xcb_randr_screen_change_notify_event_t*>(e);
diff --git a/plugins/platforms/x11/standalone/overlaywindow_x11.cpp \
b/plugins/platforms/x11/standalone/overlaywindow_x11.cpp index c1e4fe9da..5a787665f \
                100644
--- a/plugins/platforms/x11/standalone/overlaywindow_x11.cpp
+++ b/plugins/platforms/x11/standalone/overlaywindow_x11.cpp
@@ -21,6 +21,7 @@ along with this program.  If not, see \
<http://www.gnu.org/licenses/>.  #include "overlaywindow_x11.h"
 
 #include "kwinglobals.h"
+#include "composite.h"
 #include "screens.h"
 #include "utils.h"
 #include "xcbutils.h"
@@ -38,6 +39,7 @@ along with this program.  If not, see \
<http://www.gnu.org/licenses/>.  namespace KWin {
 OverlayWindowX11::OverlayWindowX11()
     : OverlayWindow()
+    , X11EventFilter(QVector<int>{XCB_EXPOSE, XCB_VISIBILITY_NOTIFY})
     , m_visible(true)
     , m_shown(false)
     , m_window(XCB_WINDOW_NONE)
@@ -181,5 +183,31 @@ xcb_window_t OverlayWindowX11::window() const
     return m_window;
 }
 
+bool OverlayWindowX11::event(xcb_generic_event_t *event)
+{
+    const uint8_t eventType = event->response_type & ~0x80;
+    if (eventType == XCB_EXPOSE) {
+        const auto *expose = reinterpret_cast<xcb_expose_event_t*>(event);
+        if (expose->window == rootWindow()   // root window needs repainting
+                || (m_window != XCB_WINDOW_NONE && expose->window == m_window)) { // \
overlay needs repainting +            Compositor::self()->addRepaint(expose->x, \
expose->y, expose->width, expose->height); +        }
+    } else if (eventType == XCB_VISIBILITY_NOTIFY) {
+        const auto *visibility = \
reinterpret_cast<xcb_visibility_notify_event_t*>(event); +        if (m_window != \
XCB_WINDOW_NONE && visibility->window == m_window) { +            bool was_visible = \
isVisible(); +            setVisibility((visibility->state != \
XCB_VISIBILITY_FULLY_OBSCURED)); +            auto compositor = Compositor::self();
+            if (!was_visible && m_visible) {
+                // hack for #154825
+                compositor->addRepaintFull();
+                QTimer::singleShot(2000, compositor, &Compositor::addRepaintFull);
+            }
+            compositor->scheduleRepaint();
+        }
+    }
+    return false;
+}
+
 } // namespace KWin
 
diff --git a/plugins/platforms/x11/standalone/overlaywindow_x11.h \
b/plugins/platforms/x11/standalone/overlaywindow_x11.h index 2cb562ae5..0ca5b143c \
                100644
--- a/plugins/platforms/x11/standalone/overlaywindow_x11.h
+++ b/plugins/platforms/x11/standalone/overlaywindow_x11.h
@@ -22,9 +22,10 @@ along with this program.  If not, see \
<http://www.gnu.org/licenses/>.  #define KWIN_OVERLAYWINDOW_X11_H
 
 #include "../../../../overlaywindow.h"
+#include "../../../../x11eventfilter.h"
 
 namespace KWin {
-class KWIN_EXPORT OverlayWindowX11 : public OverlayWindow {
+class KWIN_EXPORT OverlayWindowX11 : public OverlayWindow, public X11EventFilter {
 public:
     OverlayWindowX11();
     ~OverlayWindowX11();
@@ -41,6 +42,8 @@ public:
     xcb_window_t window() const override;
     bool isVisible() const override;
     void setVisibility(bool visible) override;
+
+    bool event(xcb_generic_event_t *event) override;
 private:
     void setNoneBackgroundPixmap(xcb_window_t window);
     void setupInputShape(xcb_window_t window);


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic