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/>.
|
||||
*********************************************************************/
|
||||
#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;
|
||||
|
|
Loading…
Reference in a new issue