File indexing completed on 2025-04-27 11:33:00
0001 /* 0002 KWin - the KDE window manager 0003 This file is part of the KDE project. 0004 0005 SPDX-FileCopyrightText: 2017 Martin Flöser <mgraesslin@kde.org> 0006 0007 SPDX-License-Identifier: GPL-2.0-or-later 0008 */ 0009 #include "x11_standalone_screenedges_filter.h" 0010 #include "atoms.h" 0011 #include "screenedge.h" 0012 #include "workspace.h" 0013 0014 #include <QWidget> 0015 #include <xcb/xcb.h> 0016 0017 namespace KWin 0018 { 0019 0020 ScreenEdgesFilter::ScreenEdgesFilter() 0021 : X11EventFilter(QVector<int>{XCB_MOTION_NOTIFY, XCB_ENTER_NOTIFY, XCB_CLIENT_MESSAGE}) 0022 { 0023 } 0024 0025 bool ScreenEdgesFilter::event(xcb_generic_event_t *event) 0026 { 0027 const uint8_t eventType = event->response_type & ~0x80; 0028 switch (eventType) { 0029 case XCB_MOTION_NOTIFY: { 0030 const auto mouseEvent = reinterpret_cast<xcb_motion_notify_event_t *>(event); 0031 const QPoint rootPos(mouseEvent->root_x, mouseEvent->root_y); 0032 if (QWidget::mouseGrabber()) { 0033 workspace()->screenEdges()->check(rootPos, QDateTime::fromMSecsSinceEpoch(xTime(), Qt::UTC), true); 0034 } else { 0035 workspace()->screenEdges()->check(rootPos, QDateTime::fromMSecsSinceEpoch(mouseEvent->time, Qt::UTC)); 0036 } 0037 // not filtered out 0038 break; 0039 } 0040 case XCB_ENTER_NOTIFY: { 0041 const auto enter = reinterpret_cast<xcb_enter_notify_event_t *>(event); 0042 return workspace()->screenEdges()->handleEnterNotifiy(enter->event, QPoint(enter->root_x, enter->root_y), QDateTime::fromMSecsSinceEpoch(enter->time, Qt::UTC)); 0043 } 0044 case XCB_CLIENT_MESSAGE: { 0045 const auto ce = reinterpret_cast<xcb_client_message_event_t *>(event); 0046 if (ce->type != atoms->xdnd_position) { 0047 return false; 0048 } 0049 return workspace()->screenEdges()->handleDndNotify(ce->window, QPoint(ce->data.data32[2] >> 16, ce->data.data32[2] & 0xffff)); 0050 } 0051 } 0052 return false; 0053 } 0054 0055 }