Members of the KDE Community are recommended to subscribe to the kde-community mailing list at https://mail.kde.org/mailman/listinfo/kde-community to allow them to participate in important discussions and receive other important announcements

Commit c87230c3 authored by Martin Flöser's avatar Martin Flöser

Use xcb-icccm to read the name property

Summary:
The KWindowSystem call which we used doesn't work on Wayland as it's only
implemented in the xcb variant and cannot be made available for Wayland
in an easy way as it is still XLib based.

This change turns the optional XCB-ICCCM dependency in a required one
and thus can use the functionality provided by said library to implement
what KWindowSystem provided.

BUG: 382789

Test Plan: New test case which failed with old code

Reviewers: #kwin, #plasma

Subscribers: plasma-devel, kwin

Tags: #kwin

Differential Revision: https://phabricator.kde.org/D7046
parent 0455fa9e
......@@ -233,7 +233,6 @@ find_package(XCB 1.10
SHM
GLX
CURSOR
OPTIONAL_COMPONENTS
ICCCM
)
set_package_properties(XCB PROPERTIES TYPE REQUIRED)
......@@ -570,6 +569,7 @@ set(kwin_XCB_LIBS
XCB::KEYSYMS
XCB::SHM
XCB::GLX
XCB::ICCCM
)
set(kwin_WAYLAND_LIBS
......
......@@ -52,6 +52,7 @@ private Q_SLOTS:
void testFocusInWithWaylandLastActiveWindow();
void testX11WindowId();
void testCaptionChanges();
void testCaptionWmName();
};
void X11ClientTest::initTestCase()
......@@ -427,5 +428,27 @@ void X11ClientTest::testCaptionChanges()
c.reset();
}
void X11ClientTest::testCaptionWmName()
{
// this test verifies that a caption set through WM_NAME is read correctly
// open glxgears as that one only uses WM_NAME
QSignalSpy clientAddedSpy(workspace(), &Workspace::clientAdded);
QVERIFY(clientAddedSpy.isValid());
QProcess glxgears;
glxgears.start(QStringLiteral("glxgears"));
QVERIFY(glxgears.waitForStarted());
QVERIFY(clientAddedSpy.wait());
QCOMPARE(clientAddedSpy.count(), 1);
QCOMPARE(workspace()->clientList().count(), 1);
Client *glxgearsClient = workspace()->clientList().first();
QCOMPARE(glxgearsClient->caption(), QStringLiteral("glxgears"));
glxgears.terminate();
QVERIFY(glxgears.waitForFinished());
}
WAYLANDTEST_MAIN(X11ClientTest)
#include "x11_client_test.moc"
......@@ -52,6 +52,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// XLib
#include <X11/Xutil.h>
#include <fixx11h.h>
#include <xcb/xcb_icccm.h>
// system
#include <unistd.h>
#include <signal.h>
......@@ -1411,12 +1412,30 @@ void Client::fetchName()
setCaption(readName());
}
static inline QString readNameProperty(xcb_window_t w, xcb_atom_t atom)
{
const auto cookie = xcb_icccm_get_text_property_unchecked(connection(), w, atom);
xcb_icccm_get_text_property_reply_t reply;
if (xcb_icccm_get_wm_name_reply(connection(), cookie, &reply, nullptr)) {
QString retVal;
if (reply.encoding == atoms->utf8_string) {
retVal = QString::fromUtf8(QByteArray(reply.name, reply.name_len));
} else if (reply.encoding == XCB_ATOM_STRING) {
retVal = QString::fromLocal8Bit(QByteArray(reply.name, reply.name_len));
}
xcb_icccm_get_text_property_reply_wipe(&reply);
return retVal.simplified();
}
return QString();
}
QString Client::readName() const
{
if (info->name() && info->name()[0] != '\0')
return QString::fromUtf8(info->name()).simplified();
else
return KWindowSystem::readNameProperty(window(), XCB_ATOM_WM_NAME).simplified();
else {
return readNameProperty(window(), XCB_ATOM_WM_NAME);
}
}
// The list is taken from http://www.unicode.org/reports/tr9/ (#154840)
......@@ -1487,7 +1506,7 @@ void Client::fetchIconicName()
if (info->iconName() && info->iconName()[0] != '\0')
s = QString::fromUtf8(info->iconName());
else
s = KWindowSystem::readNameProperty(window(), XCB_ATOM_WM_ICON_NAME);
s = readNameProperty(window(), XCB_ATOM_WM_ICON_NAME);
if (s != cap_iconic) {
bool was_set = !cap_iconic.isEmpty();
cap_iconic = s;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment