Fix management of keymap files

This is a regression that was introduced with the port to the new
approach.
This commit is contained in:
Vlad Zahorodnii 2021-03-26 13:14:04 +02:00
parent 83087817f4
commit c56712776a
2 changed files with 35 additions and 29 deletions

View file

@ -36,7 +36,7 @@ void KeyboardInterfacePrivate::keyboard_bind_resource(Resource *resource)
send_repeat_info(resource->handle, keyRepeat.charactersPerSecond, keyRepeat.delay); send_repeat_info(resource->handle, keyRepeat.charactersPerSecond, keyRepeat.delay);
} }
if (!keymap.isNull()) { if (!keymap.isNull()) {
send_keymap(resource->handle, keymap_format::keymap_format_xkb_v1, keymap->handle(), keymap->size()); sendKeymap(resource);
} }
if (focusedClient && focusedClient->client() == resource->client()) { if (focusedClient && focusedClient->client() == resource->client()) {
@ -78,37 +78,45 @@ void KeyboardInterfacePrivate::sendEnter(SurfaceInterface *surface, quint32 seri
} }
} }
void KeyboardInterfacePrivate::sendKeymap(Resource *resource)
{
QScopedPointer<QTemporaryFile> tmp(new QTemporaryFile());
if (!tmp->open()) {
qCWarning(KWAYLAND_SERVER) << "Failed to create keymap file:" << tmp->errorString();
return;
}
unlink(tmp->fileName().toUtf8().constData());
if (!tmp->resize(keymap.size())) {
qCWarning(KWAYLAND_SERVER) << "Failed to resize keymap file:" << tmp->errorString();
return;
}
uchar *address = tmp->map(0, keymap.size());
if (!address) {
qCWarning(KWAYLAND_SERVER) << "Failed to map keymap file:" << tmp->errorString();
return;
}
if (qstrncpy(reinterpret_cast<char *>(address), keymap.constData(), keymap.size() + 1) == nullptr) {
return;
}
tmp->unmap(address);
send_keymap(resource->handle, keymap_format::keymap_format_xkb_v1, tmp->handle(), tmp->size());
}
void KeyboardInterface::setKeymap(const QByteArray &content) void KeyboardInterface::setKeymap(const QByteArray &content)
{ {
if (content.isNull()) { if (content.isNull()) {
return; return;
} }
QScopedPointer<QTemporaryFile> tmp{new QTemporaryFile(this)};
if (!tmp->open()) {
return;
}
unlink(tmp->fileName().toUtf8().constData());
if (!tmp->resize(content.size())) {
return;
}
uchar *address = tmp->map(0, content.size());
if (!address) {
return;
}
if (qstrncpy(reinterpret_cast<char*>(address), content.constData(), content.size() + 1) == nullptr) {
return;
}
tmp->unmap(address);
d->sendKeymap(tmp->handle(), content.size()); d->keymap = content;
d->keymap.swap(tmp);
}
void KeyboardInterfacePrivate::sendKeymap(int fd, quint32 size) const auto keyboardResources = d->resourceMap();
{ for (KeyboardInterfacePrivate::Resource *resource : keyboardResources) {
const QList<Resource *> keyboards = resourceMap().values(); d->sendKeymap(resource);
for (Resource *keyboardResource : keyboards) {
send_keymap(keyboardResource->handle, keymap_format::keymap_format_xkb_v1, fd, size);
} }
} }

View file

@ -12,8 +12,6 @@
#include <QPointer> #include <QPointer>
#include <QHash> #include <QHash>
class QTemporaryFile;
namespace KWaylandServer namespace KWaylandServer
{ {
@ -25,7 +23,7 @@ public:
KeyboardInterfacePrivate(SeatInterface *s); KeyboardInterfacePrivate(SeatInterface *s);
void sendKeymap(int fd, quint32 size); void sendKeymap(Resource *resource);
void sendModifiers(); void sendModifiers();
void sendModifiers(quint32 depressed, quint32 latched, quint32 locked, quint32 group, quint32 serial); void sendModifiers(quint32 depressed, quint32 latched, quint32 locked, quint32 group, quint32 serial);
@ -38,7 +36,7 @@ public:
SeatInterface *seat; SeatInterface *seat;
SurfaceInterface *focusedSurface = nullptr; SurfaceInterface *focusedSurface = nullptr;
QMetaObject::Connection destroyConnection; QMetaObject::Connection destroyConnection;
QScopedPointer<QTemporaryFile> keymap; QByteArray keymap;
struct { struct {
qint32 charactersPerSecond = 0; qint32 charactersPerSecond = 0;