For Qt GUI, poll SDL events immediately after initializing the joystick subsystem to process all input device add events. Added gamepad init logging.
This commit is contained in:
parent
9cd7b620dd
commit
9ed1dd481b
|
@ -1707,17 +1707,25 @@ QtScriptInstance::QtScriptInstance(QObject* parent)
|
||||||
dialog = win;
|
dialog = win;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FCEU_WRAPPER_LOCK();
|
||||||
|
|
||||||
initEngine();
|
initEngine();
|
||||||
|
|
||||||
QtScriptManager::getInstance()->addScriptInstance(this);
|
QtScriptManager::getInstance()->addScriptInstance(this);
|
||||||
|
|
||||||
|
FCEU_WRAPPER_UNLOCK();
|
||||||
}
|
}
|
||||||
//----------------------------------------------------
|
//----------------------------------------------------
|
||||||
QtScriptInstance::~QtScriptInstance()
|
QtScriptInstance::~QtScriptInstance()
|
||||||
{
|
{
|
||||||
|
FCEU_WRAPPER_LOCK();
|
||||||
|
|
||||||
QtScriptManager::getInstance()->removeScriptInstance(this);
|
QtScriptManager::getInstance()->removeScriptInstance(this);
|
||||||
|
|
||||||
shutdownEngine();
|
shutdownEngine();
|
||||||
|
|
||||||
|
FCEU_WRAPPER_UNLOCK();
|
||||||
|
|
||||||
//printf("QtScriptInstance Destroyed\n");
|
//printf("QtScriptInstance Destroyed\n");
|
||||||
}
|
}
|
||||||
//----------------------------------------------------
|
//----------------------------------------------------
|
||||||
|
@ -2773,6 +2781,17 @@ void QScriptDialog_t::clearPropertyTree()
|
||||||
//----------------------------------------------------
|
//----------------------------------------------------
|
||||||
void QScriptDialog_t::loadPropertyTree(QJSValue& object, JsPropertyItem* parentItem)
|
void QScriptDialog_t::loadPropertyTree(QJSValue& object, JsPropertyItem* parentItem)
|
||||||
{
|
{
|
||||||
|
const QMetaObject* objMeta = nullptr;
|
||||||
|
|
||||||
|
if (object.isObject())
|
||||||
|
{
|
||||||
|
auto* qobjPtr = object.toQObject();
|
||||||
|
if (qobjPtr != nullptr)
|
||||||
|
{
|
||||||
|
objMeta = qobjPtr->metaObject();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QJSValueIterator it(object);
|
QJSValueIterator it(object);
|
||||||
|
|
||||||
while (it.hasNext())
|
while (it.hasNext())
|
||||||
|
@ -2781,6 +2800,7 @@ void QScriptDialog_t::loadPropertyTree(QJSValue& object, JsPropertyItem* parentI
|
||||||
QJSValue child = it.value();
|
QJSValue child = it.value();
|
||||||
|
|
||||||
bool isPrototype = it.name() == "prototype";
|
bool isPrototype = it.name() == "prototype";
|
||||||
|
//printf("ProtoType: %s :: %s\n", object.toString().toLocal8Bit().constData(), child.toString().toLocal8Bit().constData());
|
||||||
|
|
||||||
if (!isPrototype)
|
if (!isPrototype)
|
||||||
{
|
{
|
||||||
|
@ -2827,6 +2847,26 @@ void QScriptDialog_t::loadPropertyTree(QJSValue& object, JsPropertyItem* parentI
|
||||||
{
|
{
|
||||||
type = "function";
|
type = "function";
|
||||||
value = "";
|
value = "";
|
||||||
|
|
||||||
|
if (objMeta != nullptr)
|
||||||
|
{
|
||||||
|
//printf("Function: %s::%s\n", objMeta->className(), name.toLocal8Bit().constData());
|
||||||
|
for (int i=0; i<objMeta->methodCount(); i++)
|
||||||
|
{
|
||||||
|
QMetaMethod m = objMeta->method(i);
|
||||||
|
|
||||||
|
//printf("Method: %s %s %s\n",
|
||||||
|
// m.name().constData(),
|
||||||
|
// m.typeName(),
|
||||||
|
// m.methodSignature().constData());
|
||||||
|
|
||||||
|
if (name == m.name())
|
||||||
|
{
|
||||||
|
value = QString(" ") + QString(m.typeName()) + " " +
|
||||||
|
QString::fromLocal8Bit(m.methodSignature());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (child.isDate())
|
else if (child.isDate())
|
||||||
{
|
{
|
||||||
|
@ -2925,6 +2965,21 @@ void QScriptDialog_t::loadPropertyTree(QJSValue& object, JsPropertyItem* parentI
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//----------------------------------------------------
|
//----------------------------------------------------
|
||||||
|
void QScriptDialog_t::reloadGlobalTree(void)
|
||||||
|
{
|
||||||
|
if (scriptInstance != nullptr)
|
||||||
|
{
|
||||||
|
auto* engine = scriptInstance->getEngine();
|
||||||
|
|
||||||
|
if (engine)
|
||||||
|
{
|
||||||
|
QJSValue globals = engine->globalObject();
|
||||||
|
|
||||||
|
loadPropertyTree(globals);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//----------------------------------------------------
|
||||||
void QScriptDialog_t::updatePeriodic(void)
|
void QScriptDialog_t::updatePeriodic(void)
|
||||||
{
|
{
|
||||||
//printf("Update JS\n");
|
//printf("Update JS\n");
|
||||||
|
@ -2944,17 +2999,11 @@ void QScriptDialog_t::updatePeriodic(void)
|
||||||
emuThreadText.clear();
|
emuThreadText.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (scriptInstance != nullptr)
|
if ((scriptInstance != nullptr) && scriptInstance->isRunning())
|
||||||
{
|
{
|
||||||
auto* engine = scriptInstance->getEngine();
|
reloadGlobalTree();
|
||||||
|
|
||||||
if (engine)
|
|
||||||
{
|
|
||||||
QJSValue globals = engine->globalObject();
|
|
||||||
|
|
||||||
loadPropertyTree(globals);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
refreshState();
|
refreshState();
|
||||||
FCEU_WRAPPER_UNLOCK();
|
FCEU_WRAPPER_UNLOCK();
|
||||||
}
|
}
|
||||||
|
|
|
@ -811,6 +811,7 @@ private slots:
|
||||||
void stopScript(void);
|
void stopScript(void);
|
||||||
void onLogLinkClicked(const QString&);
|
void onLogLinkClicked(const QString&);
|
||||||
void onScriptError(void);
|
void onScriptError(void);
|
||||||
|
void reloadGlobalTree(void);
|
||||||
};
|
};
|
||||||
|
|
||||||
bool FCEU_JSRerecordCountSkip();
|
bool FCEU_JSRerecordCountSkip();
|
||||||
|
|
|
@ -1288,8 +1288,8 @@ void GetMouseRelative(int32 (&d)[3])
|
||||||
/**
|
/**
|
||||||
* Handles outstanding SDL events.
|
* Handles outstanding SDL events.
|
||||||
*/
|
*/
|
||||||
static void
|
void
|
||||||
UpdatePhysicalInput()
|
pollEventsSDL()
|
||||||
{
|
{
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
|
|
||||||
|
@ -1646,7 +1646,7 @@ void FCEUD_UpdateInput(void)
|
||||||
|
|
||||||
updateGamePadKeyMappings();
|
updateGamePadKeyMappings();
|
||||||
|
|
||||||
UpdatePhysicalInput();
|
pollEventsSDL();
|
||||||
KeyboardCommands();
|
KeyboardCommands();
|
||||||
|
|
||||||
for (x = 0; x < 2; x++)
|
for (x = 0; x < 2; x++)
|
||||||
|
@ -2598,7 +2598,7 @@ int loadInputSettingsFromFile(const char *filename)
|
||||||
void UpdateInput(Config *config)
|
void UpdateInput(Config *config)
|
||||||
{
|
{
|
||||||
char buf[64];
|
char buf[64];
|
||||||
std::string device, prefix, guid, mapping;
|
std::string device, prefix;
|
||||||
|
|
||||||
InitJoysticks();
|
InitJoysticks();
|
||||||
|
|
||||||
|
@ -2686,19 +2686,20 @@ void UpdateInput(Config *config)
|
||||||
// input device key.
|
// input device key.
|
||||||
int type, devnum, button;
|
int type, devnum, button;
|
||||||
|
|
||||||
|
// This is now done in InitJoysticks
|
||||||
// gamepad 0 - 3
|
// gamepad 0 - 3
|
||||||
for (unsigned int i = 0; i < GAMEPAD_NUM_DEVICES; i++)
|
//for (unsigned int i = 0; i < GAMEPAD_NUM_DEVICES; i++)
|
||||||
{
|
//{
|
||||||
char buf[64];
|
// char buf[64];
|
||||||
snprintf(buf, sizeof(buf) - 1, "SDL.Input.GamePad.%u.", i);
|
// snprintf(buf, sizeof(buf) - 1, "SDL.Input.GamePad.%u.", i);
|
||||||
prefix = buf;
|
// prefix = buf;
|
||||||
|
|
||||||
config->getOption(prefix + "DeviceType", &device);
|
// config->getOption(prefix + "DeviceType", &device);
|
||||||
config->getOption(prefix + "DeviceGUID", &guid);
|
// config->getOption(prefix + "DeviceGUID", &guid);
|
||||||
config->getOption(prefix + "Profile", &mapping);
|
// config->getOption(prefix + "Profile", &mapping);
|
||||||
|
|
||||||
GamePad[i].init(i, guid.c_str(), mapping.c_str());
|
// GamePad[i].init(i, guid.c_str(), mapping.c_str());
|
||||||
}
|
//}
|
||||||
|
|
||||||
// PowerPad 0 - 1
|
// PowerPad 0 - 1
|
||||||
for (unsigned int i = 0; i < POWERPAD_NUM_DEVICES; i++)
|
for (unsigned int i = 0; i < POWERPAD_NUM_DEVICES; i++)
|
||||||
|
|
|
@ -143,6 +143,7 @@ void UpdateInput(Config *config);
|
||||||
|
|
||||||
const char* ButtonName(const ButtConfig* bc);
|
const char* ButtonName(const ButtConfig* bc);
|
||||||
|
|
||||||
|
void pollEventsSDL();
|
||||||
int getInputSelection( int port, int *cur, int *usr );
|
int getInputSelection( int port, int *cur, int *usr );
|
||||||
int saveInputSettingsToFile( const char *fileBase = NULL );
|
int saveInputSettingsToFile( const char *fileBase = NULL );
|
||||||
int loadInputSettingsFromFile( const char *filename = NULL );
|
int loadInputSettingsFromFile( const char *filename = NULL );
|
||||||
|
|
|
@ -50,6 +50,7 @@ static const char *buttonNames[GAMEPAD_NUM_BUTTONS] =
|
||||||
"dpup", "dpdown", "dpleft", "dpright",
|
"dpup", "dpdown", "dpleft", "dpright",
|
||||||
"turboA", "turboB"};
|
"turboA", "turboB"};
|
||||||
|
|
||||||
|
extern Config* g_config;
|
||||||
//********************************************************************************
|
//********************************************************************************
|
||||||
// Joystick Device
|
// Joystick Device
|
||||||
jsDev_t::jsDev_t(void)
|
jsDev_t::jsDev_t(void)
|
||||||
|
@ -155,6 +156,8 @@ void jsDev_t::init(int idx)
|
||||||
|
|
||||||
guidStr.assign(stmp);
|
guidStr.assign(stmp);
|
||||||
|
|
||||||
|
FCEU_printf("Added Joystick: devIdx:%i name:'%s' GUID:'%s'\n", idx, name.c_str(), guidStr.c_str() );
|
||||||
|
|
||||||
// If game controller, save default mapping if it does not already exist.
|
// If game controller, save default mapping if it does not already exist.
|
||||||
if (gc)
|
if (gc)
|
||||||
{
|
{
|
||||||
|
@ -360,7 +363,7 @@ int GamePad_t::init(int port, const char *guid, const char *profile)
|
||||||
|
|
||||||
portNum = port;
|
portNum = port;
|
||||||
|
|
||||||
//printf("Init: %i %s %s \n", port, guid, profile );
|
FCEU_printf("GamePad[%i].init Requested: GUID:'%s' Profile:'%s' \n", port, guid, profile );
|
||||||
|
|
||||||
// First look for a controller that matches the specific GUID
|
// First look for a controller that matches the specific GUID
|
||||||
// that is not already in use by another port.
|
// that is not already in use by another port.
|
||||||
|
@ -381,9 +384,12 @@ int GamePad_t::init(int port, const char *guid, const char *profile)
|
||||||
|
|
||||||
if (strcmp(jsDev[i].getGUID(), guid) == 0)
|
if (strcmp(jsDev[i].getGUID(), guid) == 0)
|
||||||
{
|
{
|
||||||
|
FCEU_printf("GamePad[%i].init Matched GUID to JS device %i \n", port, i );
|
||||||
|
|
||||||
setDeviceIndex(i);
|
setDeviceIndex(i);
|
||||||
if (loadProfile(profile, guid))
|
if (loadProfile(profile, guid))
|
||||||
{
|
{
|
||||||
|
FCEU_printf("GamePad[%i].init Using default profile.\n", port );
|
||||||
loadDefaults();
|
loadDefaults();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -407,9 +413,12 @@ int GamePad_t::init(int port, const char *guid, const char *profile)
|
||||||
|
|
||||||
if (jsDev[i].isGameController())
|
if (jsDev[i].isGameController())
|
||||||
{
|
{
|
||||||
|
FCEU_printf("GamePad[%i].init Using JS device %i \n", port, i );
|
||||||
|
|
||||||
setDeviceIndex(i);
|
setDeviceIndex(i);
|
||||||
if (loadProfile(profile))
|
if (loadProfile(profile))
|
||||||
{
|
{
|
||||||
|
FCEU_printf("GamePad[%i].init Using default profile.\n", port );
|
||||||
loadDefaults();
|
loadDefaults();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -421,8 +430,10 @@ int GamePad_t::init(int port, const char *guid, const char *profile)
|
||||||
// game controller, then load default keyboard.
|
// game controller, then load default keyboard.
|
||||||
if ((portNum == 0 || strnlen(profile, 1) > 0) && (devIdx < 0))
|
if ((portNum == 0 || strnlen(profile, 1) > 0) && (devIdx < 0))
|
||||||
{
|
{
|
||||||
|
FCEU_printf("GamePad[%i].init Using keyboard device\n", port );
|
||||||
if (loadProfile(profile))
|
if (loadProfile(profile))
|
||||||
{
|
{
|
||||||
|
FCEU_printf("GamePad[%i].init Using default profile.\n", port );
|
||||||
loadDefaults();
|
loadDefaults();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -603,10 +614,16 @@ int GamePad_t::getMapFromFile(const char *filename, nesGamePadMap_t *gpm)
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
char line[256];
|
char line[256];
|
||||||
|
|
||||||
|
bool fileExists = QFile::exists( QString(filename) );
|
||||||
|
|
||||||
fp = ::fopen(filename, "r");
|
fp = ::fopen(filename, "r");
|
||||||
|
|
||||||
if (fp == NULL)
|
if (fp == NULL)
|
||||||
{
|
{
|
||||||
|
if (fileExists)
|
||||||
|
{
|
||||||
|
FCEU_printf("GamePad[%i]: Failed to open binding map from file: %s\n", portNum, filename);
|
||||||
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
while (fgets(line, sizeof(line), fp) != 0)
|
while (fgets(line, sizeof(line), fp) != 0)
|
||||||
|
@ -634,6 +651,8 @@ int GamePad_t::getMapFromFile(const char *filename, nesGamePadMap_t *gpm)
|
||||||
|
|
||||||
::fclose(fp);
|
::fclose(fp);
|
||||||
|
|
||||||
|
FCEU_printf("GamePad[%i]: Loaded Button Binding Map from File: %s\n", portNum, filename);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
//********************************************************************************
|
//********************************************************************************
|
||||||
|
@ -665,6 +684,7 @@ int GamePad_t::loadHotkeyMapFromFile(const char *filename)
|
||||||
|
|
||||||
if (fp == NULL)
|
if (fp == NULL)
|
||||||
{
|
{
|
||||||
|
FCEU_printf("Gamepad[%i]: Error: Failed to Load HotKey Map From File: %s\n", portNum, filename );
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
deleteHotKeyMappings();
|
deleteHotKeyMappings();
|
||||||
|
@ -775,6 +795,7 @@ int GamePad_t::loadHotkeyMapFromFile(const char *filename)
|
||||||
}
|
}
|
||||||
::fclose(fp);
|
::fclose(fp);
|
||||||
|
|
||||||
|
FCEU_printf("Gamepad[%i]: Loaded HotKey Map From File: %s NumBindings:%zi\n", portNum, filename, gpKeySeqList.size() );
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
//********************************************************************************
|
//********************************************************************************
|
||||||
|
@ -1268,24 +1289,48 @@ int KillJoysticks(void)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < GAMEPAD_NUM_DEVICES; i++)
|
||||||
|
{
|
||||||
|
GamePad[i].setDeviceIndex(-1);
|
||||||
|
}
|
||||||
|
|
||||||
for (n = 0; n < MAX_JOYSTICKS; n++)
|
for (n = 0; n < MAX_JOYSTICKS; n++)
|
||||||
{
|
{
|
||||||
jsDev[n].close();
|
jsDev[n].close();
|
||||||
}
|
}
|
||||||
SDL_QuitSubSystem(SDL_INIT_JOYSTICK);
|
FCEU_printf("Shutting down SDL joystick/game constroller subsystem\n");
|
||||||
|
SDL_QuitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER);
|
||||||
|
|
||||||
s_jinited = 0;
|
s_jinited = 0;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//********************************************************************************
|
||||||
|
void initGamepadBindings()
|
||||||
|
{
|
||||||
|
std::string device, prefix, guid, mapping;
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < GAMEPAD_NUM_DEVICES; i++)
|
||||||
|
{
|
||||||
|
char buf[64];
|
||||||
|
snprintf(buf, sizeof(buf) - 1, "SDL.Input.GamePad.%u.", i);
|
||||||
|
prefix = buf;
|
||||||
|
|
||||||
|
g_config->getOption(prefix + "DeviceType", &device);
|
||||||
|
g_config->getOption(prefix + "DeviceGUID", &guid);
|
||||||
|
g_config->getOption(prefix + "Profile", &mapping);
|
||||||
|
|
||||||
|
GamePad[i].init(i, guid.c_str(), mapping.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
//********************************************************************************
|
//********************************************************************************
|
||||||
int AddJoystick(int which)
|
int AddJoystick(int which)
|
||||||
{
|
{
|
||||||
//printf("Add Joystick: %i \n", which );
|
//printf("Add Joystick: %i \n", which );
|
||||||
if (jsDev[which].isConnected())
|
if (jsDev[which].isConnected())
|
||||||
{
|
{
|
||||||
//printf("Error: Joystick already exists at device index %i \n", which );
|
//FCEU_printf("Error: Joystick already exists at device index %i \n", which );
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1296,12 +1341,12 @@ int AddJoystick(int which)
|
||||||
|
|
||||||
if (jsDev[which].gc == NULL)
|
if (jsDev[which].gc == NULL)
|
||||||
{
|
{
|
||||||
printf("Could not open game controller %d: %s.\n",
|
FCEU_printf("Could not open game controller %d: %s.\n",
|
||||||
which, SDL_GetError());
|
which, SDL_GetError());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//printf("Added Joystick: %i \n", which );
|
//FCEU_printf("Added Joystick: %i \n", which );
|
||||||
jsDev[which].init(which);
|
jsDev[which].init(which);
|
||||||
//jsDev[which].print();
|
//jsDev[which].print();
|
||||||
//printJoystick( s_Joysticks[which] );
|
//printJoystick( s_Joysticks[which] );
|
||||||
|
@ -1313,12 +1358,12 @@ int AddJoystick(int which)
|
||||||
|
|
||||||
if (jsDev[which].js == NULL)
|
if (jsDev[which].js == NULL)
|
||||||
{
|
{
|
||||||
printf("Could not open joystick %d: %s.\n",
|
FCEU_printf("Could not open joystick %d: %s.\n",
|
||||||
which, SDL_GetError());
|
which, SDL_GetError());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//printf("Added Joystick: %i \n", which );
|
//FCEU_printf("Added Joystick: %i \n", which );
|
||||||
jsDev[which].init(which);
|
jsDev[which].init(which);
|
||||||
//jsDev[which].print();
|
//jsDev[which].print();
|
||||||
//printJoystick( s_Joysticks[which] );
|
//printJoystick( s_Joysticks[which] );
|
||||||
|
@ -1339,7 +1384,7 @@ int RemoveJoystick(int which)
|
||||||
{
|
{
|
||||||
if (SDL_JoystickInstanceID(jsDev[i].getJS()) == which)
|
if (SDL_JoystickInstanceID(jsDev[i].getJS()) == which)
|
||||||
{
|
{
|
||||||
printf("Remove Joystick: %i \n", which);
|
FCEU_printf("Remove Joystick: %i \n", which);
|
||||||
jsDev[i].close();
|
jsDev[i].close();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1376,7 +1421,8 @@ int InitJoysticks(void)
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
SDL_InitSubSystem(SDL_INIT_JOYSTICK);
|
FCEU_printf("Initializing SDL joystick/game constroller subsystem\n");
|
||||||
|
SDL_InitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER);
|
||||||
|
|
||||||
total = SDL_NumJoysticks();
|
total = SDL_NumJoysticks();
|
||||||
if (total > MAX_JOYSTICKS)
|
if (total > MAX_JOYSTICKS)
|
||||||
|
@ -1390,6 +1436,10 @@ int InitJoysticks(void)
|
||||||
AddJoystick(n);
|
AddJoystick(n);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pollEventsSDL(); // Run event processing here to ensure that all joystick add events are processed.
|
||||||
|
|
||||||
|
initGamepadBindings();
|
||||||
|
|
||||||
s_jinited = 1;
|
s_jinited = 1;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue