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:
parent
7801afdd4c
commit
99376d38f6
1 changed files with 9 additions and 1 deletions
10
udev.cpp
10
udev.cpp
|
@ -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/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*********************************************************************/
|
*********************************************************************/
|
||||||
#include "udev.h"
|
#include "udev.h"
|
||||||
|
#include "logind.h"
|
||||||
// Qt
|
// Qt
|
||||||
#include <QByteArray>
|
#include <QByteArray>
|
||||||
#include <QScopedPointer>
|
#include <QScopedPointer>
|
||||||
|
@ -106,6 +107,7 @@ UdevDevice::Ptr UdevEnumerate::find(std::function<bool(const UdevDevice::Ptr &de
|
||||||
if (m_enumerate.isNull()) {
|
if (m_enumerate.isNull()) {
|
||||||
return UdevDevice::Ptr();
|
return UdevDevice::Ptr();
|
||||||
}
|
}
|
||||||
|
QString defaultSeat = QStringLiteral("seat0");
|
||||||
udev_list_entry *it = udev_enumerate_get_list_entry(m_enumerate.data());
|
udev_list_entry *it = udev_enumerate_get_list_entry(m_enumerate.data());
|
||||||
UdevDevice::Ptr firstFound;
|
UdevDevice::Ptr firstFound;
|
||||||
while (it) {
|
while (it) {
|
||||||
|
@ -115,6 +117,13 @@ UdevDevice::Ptr UdevEnumerate::find(std::function<bool(const UdevDevice::Ptr &de
|
||||||
if (!device) {
|
if (!device) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
QString deviceSeat = device->property("ID_SEAT");
|
||||||
|
if (deviceSeat.isEmpty()) {
|
||||||
|
deviceSeat = defaultSeat;
|
||||||
|
}
|
||||||
|
if (deviceSeat != LogindIntegration::self()->seat()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (test(device)) {
|
if (test(device)) {
|
||||||
return device;
|
return device;
|
||||||
}
|
}
|
||||||
|
@ -135,7 +144,6 @@ UdevDevice::Ptr Udev::primaryGpu()
|
||||||
enumerate.addMatch(UdevEnumerate::Match::SysName, "card[0-9]*");
|
enumerate.addMatch(UdevEnumerate::Match::SysName, "card[0-9]*");
|
||||||
enumerate.scan();
|
enumerate.scan();
|
||||||
return enumerate.find([](const UdevDevice::Ptr &device) {
|
return enumerate.find([](const UdevDevice::Ptr &device) {
|
||||||
// TODO: check seat
|
|
||||||
auto pci = device->getParentWithSubsystemDevType("pci");
|
auto pci = device->getParentWithSubsystemDevType("pci");
|
||||||
if (!pci) {
|
if (!pci) {
|
||||||
return false;
|
return false;
|
||||||
|
|
Loading…
Reference in a new issue