diff --git a/autotests/kwindowinfox11test.cpp b/autotests/kwindowinfox11test.cpp --- a/autotests/kwindowinfox11test.cpp +++ b/autotests/kwindowinfox11test.cpp @@ -415,6 +415,7 @@ QTest::newRow("ComboBox") << NET::ComboBoxMask << NET::ComboBox << NET::ComboBox; QTest::newRow("DNDIcon") << NET::DNDIconMask << NET::DNDIcon << NET::DNDIcon; QTest::newRow("OnScreenDisplay") << NET::OnScreenDisplayMask << NET::OnScreenDisplay << NET::OnScreenDisplay; + QTest::newRow("CriticalNotification") << NET::CriticalNotificationMask << NET::CriticalNotification << NET::CriticalNotification; // incorrect masks QTest::newRow("desktop-unknown") << NET::NormalMask << NET::Desktop << NET::Unknown; @@ -433,6 +434,7 @@ QTest::newRow("ComboBox-unknown") << NET::NormalMask << NET::ComboBox << NET::Unknown; QTest::newRow("DNDIcon-unknown") << NET::NormalMask << NET::DNDIcon << NET::Unknown; QTest::newRow("OnScreenDisplay-unknown") << NET::NormalMask << NET::OnScreenDisplay << NET::Unknown; + QTest::newRow("CriticalNotification-unknown") << NET::NormalMask << NET::CriticalNotification << NET::Unknown; } void KWindowInfoX11Test::testWindowType() diff --git a/autotests/netrootinfotestwm.cpp b/autotests/netrootinfotestwm.cpp --- a/autotests/netrootinfotestwm.cpp +++ b/autotests/netrootinfotestwm.cpp @@ -216,7 +216,7 @@ NETRootInfo rootInfo(connection(), m_supportWindow, s_wmName, NET::WMAllProperties, NET::AllTypesMask, NET::States(~0u), NET::WM2AllProperties, NET::Actions(~0u)); int count = 0; - for (int i = 0; i < 32; ++i) { + for (int i = 0; i < 33; ++i) { if (i == 12) { continue; } diff --git a/autotests/netwininfotestclient.cpp b/autotests/netwininfotestclient.cpp --- a/autotests/netwininfotestclient.cpp +++ b/autotests/netwininfotestclient.cpp @@ -601,6 +601,7 @@ QTest::newRow("DNDIcon") << NET::DNDIcon << 1 << QByteArrayLiteral("_NET_WM_WINDOW_TYPE_DND") << QByteArray(); QTest::newRow("Normal") << NET::Normal << 1 << QByteArrayLiteral("_NET_WM_WINDOW_TYPE_NORMAL") << QByteArray(); QTest::newRow("OnScreenDisplay") << NET::OnScreenDisplay << 1 << QByteArrayLiteral("_KDE_NET_WM_WINDOW_TYPE_ON_SCREEN_DISPLAY") << QByteArray(); + QTest::newRow("CriticalNotification") << NET::CriticalNotification << 1 << QByteArrayLiteral("_KDE_NET_WM_WINDOW_TYPE_CRITICAL_NOTIFICATION") << QByteArray(); } void NetWinInfoTestClient::testWindowType() diff --git a/src/netwm_def.h b/src/netwm_def.h --- a/src/netwm_def.h +++ b/src/netwm_def.h @@ -378,7 +378,12 @@ indicates an On Screen Display window (such as volume feedback) @since 5.6 **/ - OnScreenDisplay = 16 // NON STANDARD + OnScreenDisplay = 16, // NON STANDARD + /** + indicates a critical notification (such as battery is running out) + @since 5.58 + **/ + CriticalNotification = 17, // NON STANDARD }; /** @@ -403,6 +408,7 @@ ComboBoxMask = 1u << 14, ///< @see ComboBox DNDIconMask = 1u << 15, ///< @see DNDIcon OnScreenDisplayMask = 1u << 16, ///< NON STANDARD @see OnScreenDisplay @since 5.6 + CriticalNotificationMask = 1u << 17, ///< NON STANDARD @see CriticalNotification @since 5.58 AllTypesMask = 0U - 1 ///< All window types. }; Q_DECLARE_FLAGS(WindowTypes, WindowTypeMask) diff --git a/src/platforms/xcb/atoms_p.h b/src/platforms/xcb/atoms_p.h --- a/src/platforms/xcb/atoms_p.h +++ b/src/platforms/xcb/atoms_p.h @@ -154,6 +154,7 @@ ENUM(_KDE_NET_WM_WINDOW_TYPE_OVERRIDE), ENUM(_KDE_NET_WM_WINDOW_TYPE_TOPMENU), ENUM(_KDE_NET_WM_WINDOW_TYPE_ON_SCREEN_DISPLAY), + ENUM(_KDE_NET_WM_WINDOW_TYPE_CRITICAL_NOTIFICATION), ENUM(_KDE_NET_WM_TEMPORARY_RULES), ENUM(_NET_WM_FRAME_OVERLAP), // deprecated and naming convention violation diff --git a/src/platforms/xcb/netwm.cpp b/src/platforms/xcb/netwm.cpp --- a/src/platforms/xcb/netwm.cpp +++ b/src/platforms/xcb/netwm.cpp @@ -976,6 +976,9 @@ if (p->windowTypes & OnScreenDisplayMask) { atoms[pnum++] = p->atom(_KDE_NET_WM_WINDOW_TYPE_ON_SCREEN_DISPLAY); } + if (p->windowTypes & CriticalNotificationMask) { + atoms[pnum++] = p->atom(_KDE_NET_WM_WINDOW_TYPE_CRITICAL_NOTIFICATION); + } } if (p->properties & WMState) { @@ -1301,6 +1304,8 @@ p->windowTypes |= TopMenuMask; } else if (atom == p->atom(_KDE_NET_WM_WINDOW_TYPE_ON_SCREEN_DISPLAY)) { p->windowTypes |= OnScreenDisplayMask; + } else if (atom == p->atom(_KDE_NET_WM_WINDOW_TYPE_CRITICAL_NOTIFICATION)) { + p->windowTypes |= CriticalNotificationMask; } else if (atom == p->atom(_NET_WM_STATE)) { @@ -3219,6 +3224,12 @@ len = 1; break; + case CriticalNotification: + data[0] = p->atom(_KDE_NET_WM_WINDOW_TYPE_CRITICAL_NOTIFICATION); + data[1] = p->atom(_NET_WM_WINDOW_TYPE_NOTIFICATION); + len = 1; + break; + default: case Normal: data[0] = p->atom(_NET_WM_WINDOW_TYPE_NORMAL); @@ -4246,6 +4257,10 @@ else if (type == p->atom(_KDE_NET_WM_WINDOW_TYPE_ON_SCREEN_DISPLAY)) { p->types[pos++] = OnScreenDisplay; } + + else if (type == p->atom(_KDE_NET_WM_WINDOW_TYPE_CRITICAL_NOTIFICATION)) { + p->types[pos++] = CriticalNotification; + } } } } @@ -4633,6 +4648,7 @@ CHECK_TYPE_MASK(ComboBox) CHECK_TYPE_MASK(DNDIcon) CHECK_TYPE_MASK(OnScreenDisplay) + CHECK_TYPE_MASK(CriticalNotification) #undef CHECK_TYPE_MASK default: break;