commit kwindowsystem for openSUSE:Factory
From b2db22fd2598fb64a89f4b2c6d30f0d5b442a86c Mon Sep 17 00:00:00 2001 From: Volker Krause <vkrause@kde.org> Date: Sun, 14 Sep 2014 16:48:38 +0200 Subject: [PATCH 01/13] Make constants const, saves a few symbols in the .data
Hello community, here is the log from the commit of package kwindowsystem for openSUSE:Factory checked in at 2014-10-01 11:22:18 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/kwindowsystem (Old) and /work/SRC/openSUSE:Factory/.kwindowsystem.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Package is "kwindowsystem" Changes: -------- --- /work/SRC/openSUSE:Factory/kwindowsystem/kwindowsystem.changes 2014-09-12 17:05:05.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.kwindowsystem.new/kwindowsystem.changes 2014-10-01 11:22:19.000000000 +0200 @@ -1,0 +2,9 @@ +Wed Sep 24 19:25:07 UTC 2014 - hrvoje.senjan@gmail.com + +- Added patches needed for KWin's 5.1 release, all from upstream: + 0001-Make-constants-const-saves-a-few-symbols-in-the-.dat.patch, + 0002-Add-support-for-urgency-hint-in-NETWinInfo.patch, + 0003-Add-support-for-input-hint-in-NETWinInfo.patch and + 0007-Add-support-for-protocols-to-NETWinInfo.patch + +------------------------------------------------------------------- New: ---- 0001-Make-constants-const-saves-a-few-symbols-in-the-.dat.patch 0002-Add-support-for-urgency-hint-in-NETWinInfo.patch 0003-Add-support-for-input-hint-in-NETWinInfo.patch 0007-Add-support-for-protocols-to-NETWinInfo.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ kwindowsystem.spec ++++++ --- /var/tmp/diff_new_pack.ZL1WnY/_old 2014-10-01 11:22:21.000000000 +0200 +++ /var/tmp/diff_new_pack.ZL1WnY/_new 2014-10-01 11:22:21.000000000 +0200 @@ -39,6 +39,14 @@ Url: http://www.kde.org Source: http://download.kde.org/stable/frameworks/%{version}/%{name}-%{version}.tar.xz Source1: baselibs.conf +# PATCH-FIX-UPSTREAM 0001-Make-constants-const-saves-a-few-symbols-in-the-.dat.patch +Patch0: 0001-Make-constants-const-saves-a-few-symbols-in-the-.dat.patch +# PATCH-FIX-UPSTREAM 0002-Add-support-for-urgency-hint-in-NETWinInfo.patch +Patch1: 0002-Add-support-for-urgency-hint-in-NETWinInfo.patch +# PATCH-FIX-UPSTREAM 0003-Add-support-for-input-hint-in-NETWinInfo.patch +Patch2: 0003-Add-support-for-input-hint-in-NETWinInfo.patch +# PATCH-FIX-UPSTREAM 0007-Add-support-for-protocols-to-NETWinInfo.patch +Patch3: 0007-Add-support-for-protocols-to-NETWinInfo.patch BuildRoot: %{_tmppath}/%{name}-%{version}-build %description @@ -81,6 +89,10 @@ %lang_package -n %lname %prep %setup -q +%patch0 -p1 +%patch1 -p1 +%patch2 -p1 +%patch3 -p1 %build %cmake_kf5 -d build -- -Dlconvert_executable=%{_kf5_libdir}/qt5/bin/lconvert ++++++ 0001-Make-constants-const-saves-a-few-symbols-in-the-.dat.patch ++++++ section. --- src/kwindoweffects_x11.cpp | 2 +- src/kwindowsystem_x11.cpp | 8 ++++---- src/netwm.cpp | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/kwindoweffects_x11.cpp b/src/kwindoweffects_x11.cpp index 66aaca3..661a0af 100644 --- a/src/kwindoweffects_x11.cpp +++ b/src/kwindoweffects_x11.cpp @@ -29,7 +29,7 @@ #include <QX11Info> #include <QMatrix4x4> -static const char *DASHBOARD_WIN_CLASS = "dashboard\0dashboard"; +static const char DASHBOARD_WIN_CLASS[] = "dashboard\0dashboard"; using namespace KWindowEffects; KWindowEffectsPrivateX11::KWindowEffectsPrivateX11() diff --git a/src/kwindowsystem_x11.cpp b/src/kwindowsystem_x11.cpp index 46fbc7d..db77003 100644 --- a/src/kwindowsystem_x11.cpp +++ b/src/kwindowsystem_x11.cpp @@ -50,7 +50,7 @@ static Atom net_wm_cm; static void create_atoms(Display *dpy = QX11Info::display()); -static NET::Properties windowsProperties = NET::ClientList | NET::ClientListStacking | +static const NET::Properties windowsProperties = NET::ClientList | NET::ClientListStacking | NET::Supported | NET::NumberOfDesktops | NET::DesktopGeometry | @@ -59,11 +59,11 @@ static NET::Properties windowsProperties = NET::ClientList | NET::ClientListStac NET::DesktopNames | NET::ActiveWindow | NET::WorkArea; -static NET::Properties2 windowsProperties2 = NET::WM2ShowingDesktop; +static const NET::Properties2 windowsProperties2 = NET::WM2ShowingDesktop; // ClientList and ClientListStacking is not per-window information, but a desktop information, // so track it even with only INFO_BASIC -static NET::Properties desktopProperties = NET::ClientList | NET::ClientListStacking | +static const NET::Properties desktopProperties = NET::ClientList | NET::ClientListStacking | NET::Supported | NET::NumberOfDesktops | NET::DesktopGeometry | @@ -72,7 +72,7 @@ static NET::Properties desktopProperties = NET::ClientList | NET::ClientListStac NET::DesktopNames | NET::ActiveWindow | NET::WorkArea; -static NET::Properties2 desktopProperties2 = NET::WM2ShowingDesktop; +static const NET::Properties2 desktopProperties2 = NET::WM2ShowingDesktop; MainThreadInstantiator::MainThreadInstantiator(KWindowSystemPrivateX11::FilterInfo _what) : QObject(), diff --git a/src/netwm.cpp b/src/netwm.cpp index a0a2fae..07e5254 100644 --- a/src/netwm.cpp +++ b/src/netwm.cpp @@ -4771,7 +4771,7 @@ void NETWinInfo::setActivities(const char *activities) if (activities == (char *) NULL || activities[0] == '\0') { // on all activities - static const char *nulluuid = KDE_ALL_ACTIVITIES_UUID; + static const char nulluuid[] = KDE_ALL_ACTIVITIES_UUID; p->activities = nstrdup(nulluuid); -- 2.1.0 ++++++ 0002-Add-support-for-urgency-hint-in-NETWinInfo.patch ++++++
From 512b7c17dd3d02d5c49b2b34cbb155f7ad754115 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Gr=C3=A4=C3=9Flin?= <mgraesslin@kde.org> Date: Fri, 12 Sep 2014 11:39:55 +0200 Subject: [PATCH 02/13] Add support for urgency hint in NETWinInfo
UrgencyHint is part of WM_HINTS property which is already processed for WM2GroupLeader. REVIEW: 120158 CHANGELOG: NETWinInfo provides convenient wrapper for urgency hint of WM_HINTS property. --- autotests/netwininfotestclient.cpp | 42 ++++++++++++++++++++++++++++++++++++++ src/netwm.cpp | 13 ++++++++++-- src/netwm.h | 8 ++++++++ src/netwm_def.h | 2 ++ src/netwm_p.h | 1 + 5 files changed, 64 insertions(+), 2 deletions(-) diff --git a/autotests/netwininfotestclient.cpp b/autotests/netwininfotestclient.cpp index 160f759..8a39ba5 100644 --- a/autotests/netwininfotestclient.cpp +++ b/autotests/netwininfotestclient.cpp @@ -78,6 +78,8 @@ private Q_SLOTS: void testWindowClass(); void testClientMachine(); void testGroupLeader(); + void testUrgency_data(); + void testUrgency(); void testTransientFor(); private: @@ -665,6 +667,46 @@ void NetWinInfoTestClient::testGroupLeader() QCOMPARE(info.groupLeader(), m_rootWindow); } +void NetWinInfoTestClient::testUrgency_data() +{ + QTest::addColumn<quint32>("flags"); + QTest::addColumn<bool>("expected"); + + QTest::newRow("urgency") << quint32(1 << 8) << true; + QTest::newRow("none") << quint32(0) << false; + QTest::newRow("group_urgency") << quint32((1 << 6) | (1 << 8)) << true; + QTest::newRow("input") << quint32(1) << false; +} + +void NetWinInfoTestClient::testUrgency() +{ + QVERIFY(connection()); + INFO + + QVERIFY(!info.urgency()); + QFETCH(quint32, flags); + + // group leader needs to be changed through wm hints + uint32_t values[] = { + flags, + 1, /* Input */ + 1, /* Normal State */ + XCB_NONE, /* icon pixmap */ + XCB_NONE, /* icon window */ + XCB_NONE, /* icon x */ + XCB_NONE, /* icon y */ + XCB_NONE, /* icon mask */ + XCB_NONE /* group leader */ + }; + xcb_change_property(connection(), XCB_PROP_MODE_REPLACE, m_testWindow, + XCB_ATOM_WM_HINTS, XCB_ATOM_WM_HINTS, 32, 9, values); + xcb_flush(connection()); + + // only updated after event + waitForPropertyChange(&info, XCB_ATOM_WM_HINTS, NET::Property(0), NET::WM2Urgency); + QTEST(info.urgency(), "expected"); +} + void NetWinInfoTestClient::testTransientFor() { QVERIFY(connection()); diff --git a/src/netwm.cpp b/src/netwm.cpp index 07e5254..0e77a95 100644 --- a/src/netwm.cpp +++ b/src/netwm.cpp @@ -2763,6 +2763,7 @@ NETWinInfo::NETWinInfo(xcb_connection_t *connection, xcb_window_t window, xcb_wi p->icon_sizes = NULL; p->activities = (char *) 0; p->blockCompositing = false; + p->urgency = false; // p->strut.left = p->strut.right = p->strut.top = p->strut.bottom = 0; // p->frame_strut.left = p->frame_strut.right = p->frame_strut.top = @@ -2822,6 +2823,7 @@ NETWinInfo::NETWinInfo(xcb_connection_t *connection, xcb_window_t window, xcb_wi p->icon_sizes = NULL; p->activities = (char *) 0; p->blockCompositing = false; + p->urgency = false; // p->strut.left = p->strut.right = p->strut.top = p->strut.bottom = 0; // p->frame_strut.left = p->frame_strut.right = p->frame_strut.top = @@ -3917,6 +3919,7 @@ void NETWinInfo::event(xcb_generic_event_t *event, NET::Properties *properties, dirty2 |= WM2UserTime; } else if (pe->atom == XCB_ATOM_WM_HINTS) { dirty2 |= WM2GroupLeader; + dirty2 |= WM2Urgency; } else if (pe->atom == XCB_ATOM_WM_TRANSIENT_FOR) { dirty2 |= WM2TransientFor; } else if (pe->atom == XCB_ATOM_WM_CLASS) { @@ -4093,7 +4096,7 @@ void NETWinInfo::update(NET::Properties dirtyProperties, NET::Properties2 dirtyP cookies[c++] = xcb_get_property(p->conn, false, p->window, XCB_ATOM_WM_TRANSIENT_FOR, XCB_ATOM_WINDOW, 0, 1); } - if (dirty2 & WM2GroupLeader) { + if (dirty2 & (WM2GroupLeader | WM2Urgency)) { cookies[c++] = xcb_get_property(p->conn, false, p->window, XCB_ATOM_WM_HINTS, XCB_ATOM_WM_HINTS, 0, 9); } @@ -4547,7 +4550,7 @@ void NETWinInfo::update(NET::Properties dirtyProperties, NET::Properties2 dirtyP p->transient_for = get_value_reply<xcb_window_t>(p->conn, cookies[c++], XCB_ATOM_WINDOW, 0); } - if (dirty2 & WM2GroupLeader) { + if (dirty2 & (WM2GroupLeader | WM2Urgency)) { xcb_get_property_reply_t *reply = xcb_get_property_reply(p->conn, cookies[c++], 0); if (reply && reply->format == 32 && reply->value_len == 9 && reply->type == XCB_ATOM_WM_HINTS) { @@ -4556,6 +4559,7 @@ void NETWinInfo::update(NET::Properties dirtyProperties, NET::Properties2 dirtyP if (hints->flags & (1 << 6)/*WindowGroupHint*/) { p->window_group = hints->window_group; } + p->urgency = (hints->flags & (1 << 8)/*UrgencyHint*/); } if (reply) { @@ -4740,6 +4744,11 @@ xcb_window_t NETWinInfo::groupLeader() const return p->window_group; } +bool NETWinInfo::urgency() const +{ + return p->urgency; +} + const char *NETWinInfo::windowClassClass() const { return p->class_class; diff --git a/src/netwm.h b/src/netwm.h index 0c89dc7..ba97db1 100644 --- a/src/netwm.h +++ b/src/netwm.h @@ -1373,6 +1373,14 @@ public: xcb_window_t groupLeader() const; /** + * Returns whether the UrgencyHint is set in the WM_HINTS.flags. + * See ICCCM 4.1.2.4. + * + * @since 5.3 + **/ + bool urgency() const; + + /** * Returns the class component of the window class for the window * (i.e. WM_CLASS property). */ diff --git a/src/netwm_def.h b/src/netwm_def.h index 0edadc0..9e14634 100644 --- a/src/netwm_def.h +++ b/src/netwm_def.h @@ -675,6 +675,7 @@ public: @li WM2DesktopLayout _NET_DESKTOP_LAYOUT @li WM2FullPlacement _NET_WM_FULL_PLACEMENT @li WM2FullscreenMonitors _NET_WM_FULLSCREEN_MONITORS + @li WM2Urgency urgency hint in WM_HINTS (see ICCCM 4.1.2.4) **/ enum Property2 { WM2UserTime = 1u << 0, @@ -698,6 +699,7 @@ public: WM2Activities = 1u << 18, // NOT STANDARD @since 4.6 WM2BlockCompositing = 1u << 19, // NOT STANDARD @since 4.7 WM2KDEShadow = 1u << 20, // NOT Standard @since 4.7 + WM2Urgency = 1u << 21, // @since 5.3 WM2AllProperties = ~0u }; Q_DECLARE_FLAGS(Properties2, Property2) diff --git a/src/netwm_p.h b/src/netwm_p.h index 2e4659e..36ffb8d 100644 --- a/src/netwm_p.h +++ b/src/netwm_p.h @@ -165,6 +165,7 @@ struct NETWinInfoPrivate { const char *activities; bool blockCompositing; + bool urgency; int ref; }; -- 2.1.0 ++++++ 0003-Add-support-for-input-hint-in-NETWinInfo.patch ++++++
From fc189fa9ccd34ca50ef7999139d55a393054c37a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Gr=C3=A4=C3=9Flin?= <mgraesslin@kde.org> Date: Fri, 12 Sep 2014 13:24:29 +0200 Subject: [PATCH 03/13] Add support for input hint in NETWinInfo
The Input Hint is part of WM_HINTS property which is already processed for WM2GroupLeader and WM2Urgency. The default for input hint is true. ICCCM suggests to assume convenient values for all fields of WM_HINTS property if a window is mapped wihtout one. KWin sets this value to true, so the sane convenient value for the input field seems to be true. REVIEW: 120165 CHANGELOG: NETWinInfo provides convenient wrapper for input hint of WM_HINTS property. --- autotests/netwininfotestclient.cpp | 46 ++++++++++++++++++++++++++++++++++++++ src/netwm.cpp | 15 +++++++++++-- src/netwm.h | 10 +++++++++ src/netwm_def.h | 2 ++ src/netwm_p.h | 1 + 5 files changed, 72 insertions(+), 2 deletions(-) diff --git a/autotests/netwininfotestclient.cpp b/autotests/netwininfotestclient.cpp index 8a39ba5..e35ab8d 100644 --- a/autotests/netwininfotestclient.cpp +++ b/autotests/netwininfotestclient.cpp @@ -80,6 +80,8 @@ private Q_SLOTS: void testGroupLeader(); void testUrgency_data(); void testUrgency(); + void testInput_data(); + void testInput(); void testTransientFor(); private: @@ -707,6 +709,50 @@ void NetWinInfoTestClient::testUrgency() QTEST(info.urgency(), "expected"); } +void NetWinInfoTestClient::testInput_data() +{ + QTest::addColumn<quint32>("flags"); + QTest::addColumn<quint32>("input"); + QTest::addColumn<bool>("expected"); + + QTest::newRow("flag_input") << quint32(1) << quint32(1) << true; + QTest::newRow("flag_noinput") << quint32(1) << quint32(0) << false; + QTest::newRow("noflag_input") << quint32(0) << quint32(1) << true; + QTest::newRow("noflag_noinput") << quint32(0) << quint32(0) << true; + QTest::newRow("flag_with_other_input") << quint32(1 | 1 << 8) << quint32(1) << true; + QTest::newRow("flag_with_other_noinput") << quint32(1 | 1 << 8) << quint32(0) << false; +} + +void NetWinInfoTestClient::testInput() +{ + QVERIFY(connection()); + INFO + + QVERIFY(info.input()); + QFETCH(quint32, flags); + QFETCH(quint32, input); + + // group leader needs to be changed through wm hints + uint32_t values[] = { + flags, + input, /* Input */ + 1, /* Normal State */ + XCB_NONE, /* icon pixmap */ + XCB_NONE, /* icon window */ + XCB_NONE, /* icon x */ + XCB_NONE, /* icon y */ + XCB_NONE, /* icon mask */ + XCB_NONE /* group leader */ + }; + xcb_change_property(connection(), XCB_PROP_MODE_REPLACE, m_testWindow, + XCB_ATOM_WM_HINTS, XCB_ATOM_WM_HINTS, 32, 9, values); + xcb_flush(connection()); + + // only updated after event + waitForPropertyChange(&info, XCB_ATOM_WM_HINTS, NET::Property(0), NET::WM2Urgency); + QTEST(info.input(), "expected"); +} + void NetWinInfoTestClient::testTransientFor() { QVERIFY(connection()); diff --git a/src/netwm.cpp b/src/netwm.cpp index 0e77a95..1431cf6 100644 --- a/src/netwm.cpp +++ b/src/netwm.cpp @@ -2764,6 +2764,7 @@ NETWinInfo::NETWinInfo(xcb_connection_t *connection, xcb_window_t window, xcb_wi p->activities = (char *) 0; p->blockCompositing = false; p->urgency = false; + p->input = true; // p->strut.left = p->strut.right = p->strut.top = p->strut.bottom = 0; // p->frame_strut.left = p->frame_strut.right = p->frame_strut.top = @@ -2824,6 +2825,7 @@ NETWinInfo::NETWinInfo(xcb_connection_t *connection, xcb_window_t window, xcb_wi p->activities = (char *) 0; p->blockCompositing = false; p->urgency = false; + p->input = true; // p->strut.left = p->strut.right = p->strut.top = p->strut.bottom = 0; // p->frame_strut.left = p->frame_strut.right = p->frame_strut.top = @@ -3920,6 +3922,7 @@ void NETWinInfo::event(xcb_generic_event_t *event, NET::Properties *properties, } else if (pe->atom == XCB_ATOM_WM_HINTS) { dirty2 |= WM2GroupLeader; dirty2 |= WM2Urgency; + dirty2 |= WM2Input; } else if (pe->atom == XCB_ATOM_WM_TRANSIENT_FOR) { dirty2 |= WM2TransientFor; } else if (pe->atom == XCB_ATOM_WM_CLASS) { @@ -4096,7 +4099,7 @@ void NETWinInfo::update(NET::Properties dirtyProperties, NET::Properties2 dirtyP cookies[c++] = xcb_get_property(p->conn, false, p->window, XCB_ATOM_WM_TRANSIENT_FOR, XCB_ATOM_WINDOW, 0, 1); } - if (dirty2 & (WM2GroupLeader | WM2Urgency)) { + if (dirty2 & (WM2GroupLeader | WM2Urgency | WM2Input)) { cookies[c++] = xcb_get_property(p->conn, false, p->window, XCB_ATOM_WM_HINTS, XCB_ATOM_WM_HINTS, 0, 9); } @@ -4550,12 +4553,15 @@ void NETWinInfo::update(NET::Properties dirtyProperties, NET::Properties2 dirtyP p->transient_for = get_value_reply<xcb_window_t>(p->conn, cookies[c++], XCB_ATOM_WINDOW, 0); } - if (dirty2 & (WM2GroupLeader | WM2Urgency)) { + if (dirty2 & (WM2GroupLeader | WM2Urgency | WM2Input)) { xcb_get_property_reply_t *reply = xcb_get_property_reply(p->conn, cookies[c++], 0); if (reply && reply->format == 32 && reply->value_len == 9 && reply->type == XCB_ATOM_WM_HINTS) { kde_wm_hints *hints = reinterpret_cast<kde_wm_hints *>(xcb_get_property_value(reply)); + if (hints->flags & (1 << 0)/*Input*/) { + p->input = hints->input; + } if (hints->flags & (1 << 6)/*WindowGroupHint*/) { p->window_group = hints->window_group; } @@ -4749,6 +4755,11 @@ bool NETWinInfo::urgency() const return p->urgency; } +bool NETWinInfo::input() const +{ + return p->input; +} + const char *NETWinInfo::windowClassClass() const { return p->class_class; diff --git a/src/netwm.h b/src/netwm.h index ba97db1..436ad2f 100644 --- a/src/netwm.h +++ b/src/netwm.h @@ -1381,6 +1381,16 @@ public: bool urgency() const; /** + * Returns whether the Input flag is set in WM_HINTS. + * See ICCCM 4.1.2.4 and 4.1.7. + * + * The default value is @c true in case the Client is mapped without a WM_HINTS property. + * + * @since 5.3 + **/ + bool input() const; + + /** * Returns the class component of the window class for the window * (i.e. WM_CLASS property). */ diff --git a/src/netwm_def.h b/src/netwm_def.h index 9e14634..12abfff 100644 --- a/src/netwm_def.h +++ b/src/netwm_def.h @@ -676,6 +676,7 @@ public: @li WM2FullPlacement _NET_WM_FULL_PLACEMENT @li WM2FullscreenMonitors _NET_WM_FULLSCREEN_MONITORS @li WM2Urgency urgency hint in WM_HINTS (see ICCCM 4.1.2.4) + @li WM2Input input hint (input in WM_HINTS, see ICCCM 4.1.2.4) **/ enum Property2 { WM2UserTime = 1u << 0, @@ -700,6 +701,7 @@ public: WM2BlockCompositing = 1u << 19, // NOT STANDARD @since 4.7 WM2KDEShadow = 1u << 20, // NOT Standard @since 4.7 WM2Urgency = 1u << 21, // @since 5.3 + WM2Input = 1u << 22, // @since 5.3 WM2AllProperties = ~0u }; Q_DECLARE_FLAGS(Properties2, Property2) diff --git a/src/netwm_p.h b/src/netwm_p.h index 36ffb8d..a586450 100644 --- a/src/netwm_p.h +++ b/src/netwm_p.h @@ -166,6 +166,7 @@ struct NETWinInfoPrivate { const char *activities; bool blockCompositing; bool urgency; + bool input; int ref; }; -- 2.1.0 ++++++ 0007-Add-support-for-protocols-to-NETWinInfo.patch ++++++
From 59cb063b99e6ec13c0bc3cf3fd95a01258184e86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Gr=C3=A4=C3=9Flin?= <mgraesslin@kde.org> Date: Fri, 12 Sep 2014 16:04:01 +0200 Subject: [PATCH 07/13] Add support for protocols to NETWinInfo
NETWinInfo is now able to read all known protocols set on WM_PROTOCOLS property and provides the set protocols as flags. So far the following protocols are supported: * WM_TAKE_FOCUS (ICCCM 4.1.2.7) * WM_DELETE_WINDOW (ICCCM 4.1.2.7) * _NET_WM_SYNC_REQUEST (EWMH) * _NET_WM_PING (EWMH) * _NET_WM_CONTEXT_HELP (KDE specific extension to EWMH) REVIEW: 120213 CHANGELOG: NETWinInfo provides convenient wrapper for WM_PROTOCOLS. --- src/netwm.cpp | 46 +++++++++++++- src/netwm.h | 13 ++++ src/netwm_def.h | 19 ++++++ src/netwm_p.h | 1 + 5 files changed, 201 insertions(+), 1 deletion(-) diff --git a/src/netwm.cpp b/src/netwm.cpp index 1431cf6..3107a23 100644 --- a/src/netwm.cpp +++ b/src/netwm.cpp @@ -118,7 +118,11 @@ static xcb_atom_t kde_net_wm_shadow = 0; // application protocols static xcb_atom_t wm_protocols = 0; +static xcb_atom_t wm_take_focus = 0; +static xcb_atom_t wm_delete_window = 0; static xcb_atom_t net_wm_ping = 0; +static xcb_atom_t net_wm_sync_request = 0; +static xcb_atom_t net_wm_context_help = 0; // application window types static xcb_atom_t net_wm_window_type_normal = 0; @@ -382,7 +386,7 @@ static QByteArray get_atom_name(xcb_connection_t *c, xcb_atom_t atom) } #endif -static const int netAtomCount = 88; +static const int netAtomCount = 91; static void create_netwm_atoms(xcb_connection_t *c) { @@ -481,6 +485,10 @@ static void create_netwm_atoms(xcb_connection_t *c) { "WM_STATE", &xa_wm_state }, { "WM_PROTOCOLS", &wm_protocols }, + { "WM_TAKE_FOCUS", &wm_take_focus }, + { "WM_DELETE_WINDOW", &wm_delete_window }, + { "_NET_WM_SYNC_REQUEST", &net_wm_sync_request }, + { "_NET_WM_CONTEXT_HELP", &net_wm_context_help }, { "_NET_WM_FULL_PLACEMENT", &net_wm_full_placement }, { "_KDE_NET_WM_ACTIVITIES", &kde_net_wm_activities }, @@ -2765,6 +2773,7 @@ NETWinInfo::NETWinInfo(xcb_connection_t *connection, xcb_window_t window, xcb_wi p->blockCompositing = false; p->urgency = false; p->input = true; + p->protocols = NET::NoProtocol; // p->strut.left = p->strut.right = p->strut.top = p->strut.bottom = 0; // p->frame_strut.left = p->frame_strut.right = p->frame_strut.top = @@ -2826,6 +2835,7 @@ NETWinInfo::NETWinInfo(xcb_connection_t *connection, xcb_window_t window, xcb_wi p->blockCompositing = false; p->urgency = false; p->input = true; + p->protocols = NET::NoProtocol; // p->strut.left = p->strut.right = p->strut.top = p->strut.bottom = 0; // p->frame_strut.left = p->frame_strut.right = p->frame_strut.top = @@ -3937,6 +3947,8 @@ void NETWinInfo::event(xcb_generic_event_t *event, NET::Properties *properties, dirty2 |= WM2BlockCompositing; } else if (pe->atom == kde_net_wm_shadow) { dirty2 |= WM2KDEShadow; + } else if (pe->atom == wm_protocols) { + dirty2 |= WM2Protocols; } do_update = true; @@ -4115,6 +4127,10 @@ void NETWinInfo::update(NET::Properties dirtyProperties, NET::Properties2 dirtyP cookies[c++] = xcb_get_property(p->conn, false, p->window, XCB_ATOM_WM_CLIENT_MACHINE, XCB_ATOM_STRING, 0, MAX_PROP_SIZE); } + if (dirty2 & WM2Protocols) { + cookies[c++] = xcb_get_property(p->conn, false, p->window, wm_protocols, XCB_ATOM_ATOM, 0, 2048); + } + c = 0; if (dirty & XAWMState) { @@ -4605,6 +4621,24 @@ void NETWinInfo::update(NET::Properties dirtyProperties, NET::Properties2 dirtyP p->client_machine = nstrndup(value.constData(), value.length()); } } + + if (dirty2 & WM2Protocols) { + const QVector<xcb_atom_t> protocols = get_array_reply<xcb_atom_t>(p->conn, cookies[c++], XCB_ATOM_ATOM); + p->protocols = NET::NoProtocol; + for (auto it = protocols.begin(); it != protocols.end(); ++it) { + if ((*it) == wm_take_focus) { + p->protocols |= TakeFocusProtocol; + } else if ((*it) == wm_delete_window) { + p->protocols |= DeleteWindowProtocol; + } else if ((*it) == net_wm_ping) { + p->protocols |= PingProtocol; + } else if ((*it) == net_wm_sync_request) { + p->protocols |= SyncRequestProtocol; + } else if ((*it) == net_wm_context_help) { + p->protocols |= ContextHelpProtocol; + } + } + } } NETRect NETWinInfo::iconGeometry() const @@ -4845,6 +4879,16 @@ NET::MappingState NETWinInfo::mappingState() const return p->mapping_state; } +NET::Protocols NETWinInfo::protocols() const +{ + return p->protocols; +} + +bool NETWinInfo::supportsProtocol(NET::Protocol protocol) const +{ + return p->protocols.testFlag(protocol); +} + void NETRootInfo::virtual_hook(int, void *) { /*BASE::virtual_hook( id, data );*/ diff --git a/src/netwm.h b/src/netwm.h index 436ad2f..0535c39 100644 --- a/src/netwm.h +++ b/src/netwm.h @@ -1519,6 +1519,19 @@ public: NET::Properties event(xcb_generic_event_t *event); /** + * @returns The window manager protocols this Client supports. + * @since 5.3 + **/ + NET::Protocols protocols() const; + + /** + * @returns @c true if the Client supports the @p protocol. + * @param protocol The window manager protocol to test for + * @since 5.3 + **/ + bool supportsProtocol(NET::Protocol protocol) const; + + /** Sentinel value to indicate that the client wishes to be visible on all desktops. diff --git a/src/netwm_def.h b/src/netwm_def.h index 12abfff..c8b1ba0 100644 --- a/src/netwm_def.h +++ b/src/netwm_def.h @@ -677,6 +677,7 @@ public: @li WM2FullscreenMonitors _NET_WM_FULLSCREEN_MONITORS @li WM2Urgency urgency hint in WM_HINTS (see ICCCM 4.1.2.4) @li WM2Input input hint (input in WM_HINTS, see ICCCM 4.1.2.4) + @li WM2Protocols see NET::Protocol **/ enum Property2 { WM2UserTime = 1u << 0, @@ -702,6 +703,7 @@ public: WM2KDEShadow = 1u << 20, // NOT Standard @since 4.7 WM2Urgency = 1u << 21, // @since 5.3 WM2Input = 1u << 22, // @since 5.3 + WM2Protocols = 1u << 23, // @since 5.3 WM2AllProperties = ~0u }; Q_DECLARE_FLAGS(Properties2, Property2) @@ -750,6 +752,22 @@ public: }; /** + * Protocols supported by the client. + * See ICCCM 4.1.2.7. + * + * @since 5.3 + **/ + enum Protocol { + NoProtocol = 0, + TakeFocusProtocol = 1 << 0, ///< WM_TAKE_FOCUS + DeleteWindowProtocol = 1 << 1, ///< WM_DELETE_WINDOW + PingProtocol = 1 << 2, ///< _NET_WM_PING from EWMH + SyncRequestProtocol = 1 << 3, ///< _NET_WM_SYNC_REQUEST from EWMH + ContextHelpProtocol = 1 << 4 ///< _NET_WM_CONTEXT_HELP, NON STANDARD! + }; + Q_DECLARE_FLAGS(Protocols, Protocol) + + /** Compares two X timestamps, taking into account wrapping and 64bit architectures. Return value is like with strcmp(), 0 for equal, -1 for time1 < time2, 1 for time1 > time2. */ @@ -767,5 +785,6 @@ Q_DECLARE_OPERATORS_FOR_FLAGS(NET::Properties2) Q_DECLARE_OPERATORS_FOR_FLAGS(NET::WindowTypes) Q_DECLARE_OPERATORS_FOR_FLAGS(NET::States) Q_DECLARE_OPERATORS_FOR_FLAGS(NET::Actions) +Q_DECLARE_OPERATORS_FOR_FLAGS(NET::Protocols) #endif // netwm_def_h diff --git a/src/netwm_p.h b/src/netwm_p.h index a586450..3bb8213 100644 --- a/src/netwm_p.h +++ b/src/netwm_p.h @@ -167,6 +167,7 @@ struct NETWinInfoPrivate { bool blockCompositing; bool urgency; bool input; + NET::Protocols protocols; int ref; }; -- 2.1.0 -- To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-commit+help@opensuse.org
participants (1)
-
root@hilbert.suse.de