udev: Only handle devices from the current seat

Summary: This prevents the firstFound device, or any device detected by UdevEnumerate::find that is not from the same seat kwin is running under, from being handled

Test Plan:
made sure that kwin starts on a default udev (assuming a blank ID_SEAT attribute on a device means the device is on seat0)

added /dev/dri/card1 to seat1 and /dev/dri/card0 to seat0.
Start kwin with the drm-backend on seat0 and seat1, and make sure it starts on both instances

Reviewers: #kwin, graesslin

Reviewed By: #kwin, graesslin

Subscribers: rkflx, graesslin, kwin, #kwin

Tags: #kwin

Differential Revision: https://phabricator.kde.org/D9553
This commit is contained in:
Nerdopolis Turfwalker 2018-04-05 19:47:15 +02:00 committed by Martin Flöser
parent 7801afdd4c
commit 99376d38f6

View file

@ -18,6 +18,7 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*********************************************************************/
#include "udev.h"
#include "logind.h"
// Qt
#include <QByteArray>
#include <QScopedPointer>
@ -106,6 +107,7 @@ UdevDevice::Ptr UdevEnumerate::find(std::function<bool(const UdevDevice::Ptr &de
if (m_enumerate.isNull()) {
return UdevDevice::Ptr();
}
QString defaultSeat = QStringLiteral("seat0");
udev_list_entry *it = udev_enumerate_get_list_entry(m_enumerate.data());
UdevDevice::Ptr firstFound;
while (it) {
@ -115,6 +117,13 @@ UdevDevice::Ptr UdevEnumerate::find(std::function<bool(const UdevDevice::Ptr &de
if (!device) {
continue;
}
QString deviceSeat = device->property("ID_SEAT");
if (deviceSeat.isEmpty()) {
deviceSeat = defaultSeat;
}
if (deviceSeat != LogindIntegration::self()->seat()) {
continue;
}
if (test(device)) {
return device;
}
@ -135,7 +144,6 @@ UdevDevice::Ptr Udev::primaryGpu()
enumerate.addMatch(UdevEnumerate::Match::SysName, "card[0-9]*");
enumerate.scan();
return enumerate.find([](const UdevDevice::Ptr &device) {
// TODO: check seat
auto pci = device->getParentWithSubsystemDevType("pci");
if (!pci) {
return false;