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:
harry 2024-02-18 10:37:26 -05:00
parent 9cd7b620dd
commit 9ed1dd481b
5 changed files with 134 additions and 32 deletions

View File

@ -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();
} }

View File

@ -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();

View File

@ -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++)

View File

@ -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 );

View File

@ -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;
} }