Linux: Read all /dev/input/event entries, not just the first 30
This commit is contained in:
parent
72fc0de383
commit
0675fbdfe3
3 changed files with 39 additions and 22 deletions
|
@ -1,6 +1,7 @@
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include "LinuxKeyManager.h"
|
#include "LinuxKeyManager.h"
|
||||||
#include "LinuxGameController.h"
|
#include "LinuxGameController.h"
|
||||||
|
#include "../Utilities/FolderUtilities.h"
|
||||||
#include "../Core/ControlManager.h"
|
#include "../Core/ControlManager.h"
|
||||||
#include "../Core/Console.h"
|
#include "../Core/Console.h"
|
||||||
|
|
||||||
|
@ -257,12 +258,7 @@ LinuxKeyManager::LinuxKeyManager(shared_ptr<Console> console)
|
||||||
_keyCodes[keyDef.description] = keyDef.keyCode;
|
_keyCodes[keyDef.description] = keyDef.keyCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int i = 0; i < 30; i++) {
|
CheckForGamepads(true);
|
||||||
std::shared_ptr<LinuxGameController> controller = LinuxGameController::GetController(_console, i, true);
|
|
||||||
if(controller) {
|
|
||||||
_controllers.push_back(controller);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_disableAllKeys = false;
|
_disableAllKeys = false;
|
||||||
_stopUpdateDeviceThread = false;
|
_stopUpdateDeviceThread = false;
|
||||||
|
@ -354,30 +350,50 @@ void LinuxKeyManager::UpdateDevices()
|
||||||
//Only needed to detect newly plugged in devices
|
//Only needed to detect newly plugged in devices
|
||||||
}
|
}
|
||||||
|
|
||||||
void LinuxKeyManager::StartUpdateDeviceThread()
|
void LinuxKeyManager::CheckForGamepads(bool logInformation)
|
||||||
{
|
{
|
||||||
_updateDeviceThread = std::thread([=]() {
|
|
||||||
while(!_stopUpdateDeviceThread) {
|
|
||||||
//Check for newly plugged in controllers every 2 secs
|
|
||||||
vector<int> indexesToRemove;
|
|
||||||
vector<int> connectedIDs;
|
vector<int> connectedIDs;
|
||||||
std::vector<shared_ptr<LinuxGameController>> controllersToAdd;
|
|
||||||
for(int i = _controllers.size() - 1; i >= 0; i--) {
|
for(int i = _controllers.size() - 1; i >= 0; i--) {
|
||||||
if(_controllers[i]->IsDisconnected()) {
|
if(!_controllers[i]->IsDisconnected()) {
|
||||||
indexesToRemove.push_back(i);
|
|
||||||
} else {
|
|
||||||
connectedIDs.push_back(_controllers[i]->GetDeviceID());
|
connectedIDs.push_back(_controllers[i]->GetDeviceID());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int i = 0; i < 30; i++) {
|
vector<string> files = FolderUtilities::GetFilesInFolder("/dev/input/", {}, false);
|
||||||
if(std::find(connectedIDs.begin(), connectedIDs.end(), i) == connectedIDs.end()) {
|
for(size_t i = 0; i < files.size(); i++) {
|
||||||
std::shared_ptr<LinuxGameController> controller = LinuxGameController::GetController(_console, i, false);
|
string filename = FolderUtilities::GetFilename(files[i], false);
|
||||||
|
if(filename.find("event", 0) == 0) {
|
||||||
|
int deviceId = 0;
|
||||||
|
try {
|
||||||
|
deviceId = std::stoi(filename.substr(5));
|
||||||
|
} catch(std::exception e) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(std::find(connectedIDs.begin(), connectedIDs.end(), deviceId) == connectedIDs.end()) {
|
||||||
|
std::shared_ptr<LinuxGameController> controller = LinuxGameController::GetController(_console, deviceId, logInformation);
|
||||||
if(controller) {
|
if(controller) {
|
||||||
controllersToAdd.push_back(controller);
|
_controllers.push_back(controller);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void LinuxKeyManager::StartUpdateDeviceThread()
|
||||||
|
{
|
||||||
|
_updateDeviceThread = std::thread([=]() {
|
||||||
|
while(!_stopUpdateDeviceThread) {
|
||||||
|
//Check for newly plugged in controllers every 5 secs
|
||||||
|
vector<shared_ptr<LinuxGameController>> controllersToAdd;
|
||||||
|
vector<int> indexesToRemove;
|
||||||
|
for(int i = _controllers.size() - 1; i >= 0; i--) {
|
||||||
|
if(_controllers[i]->IsDisconnected()) {
|
||||||
|
indexesToRemove.push_back(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CheckForGamepads(false);
|
||||||
|
|
||||||
if(!indexesToRemove.empty() || !controllersToAdd.empty()) {
|
if(!indexesToRemove.empty() || !controllersToAdd.empty()) {
|
||||||
_console->Pause();
|
_console->Pause();
|
||||||
|
@ -390,7 +406,7 @@ void LinuxKeyManager::StartUpdateDeviceThread()
|
||||||
_console->Resume();
|
_console->Resume();
|
||||||
}
|
}
|
||||||
|
|
||||||
_stopSignal.Wait(2000);
|
_stopSignal.Wait(5000);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,6 +31,7 @@ private:
|
||||||
bool _disableAllKeys;
|
bool _disableAllKeys;
|
||||||
|
|
||||||
void StartUpdateDeviceThread();
|
void StartUpdateDeviceThread();
|
||||||
|
void CheckForGamepads(bool logInformation);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
LinuxKeyManager(shared_ptr<Console> console);
|
LinuxKeyManager(shared_ptr<Console> console);
|
||||||
|
|
|
@ -167,7 +167,7 @@ vector<string> FolderUtilities::GetFilesInFolder(string rootFolder, std::unorder
|
||||||
} else {
|
} else {
|
||||||
string extension = i->path().extension().u8string();
|
string extension = i->path().extension().u8string();
|
||||||
std::transform(extension.begin(), extension.end(), extension.begin(), ::tolower);
|
std::transform(extension.begin(), extension.end(), extension.begin(), ::tolower);
|
||||||
if(extensions.find(extension) != extensions.end()) {
|
if(extensions.empty() || extensions.find(extension) != extensions.end()) {
|
||||||
files.push_back(i->path().u8string());
|
files.push_back(i->path().u8string());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -176,7 +176,7 @@ vector<string> FolderUtilities::GetFilesInFolder(string rootFolder, std::unorder
|
||||||
for(fs::directory_iterator i(fs::u8path(rootFolder)), end; i != end; i++) {
|
for(fs::directory_iterator i(fs::u8path(rootFolder)), end; i != end; i++) {
|
||||||
string extension = i->path().extension().u8string();
|
string extension = i->path().extension().u8string();
|
||||||
std::transform(extension.begin(), extension.end(), extension.begin(), ::tolower);
|
std::transform(extension.begin(), extension.end(), extension.begin(), ::tolower);
|
||||||
if(extensions.find(extension) != extensions.end()) {
|
if(extensions.empty() || extensions.find(extension) != extensions.end()) {
|
||||||
files.push_back(i->path().u8string());
|
files.push_back(i->path().u8string());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue