33
44// Qx Includes
55#include < qx/core/qx-regularexpression.h>
6+ #include < qx/utility/qx-helpers.h>
67
78// Project Includes
89#include " kernel/core.h"
@@ -71,22 +72,48 @@ Fp::AddApp CPlay::buildAdditionalApp(const Fp::Db::QueryBuffer& addAppResult)
7172
7273// -Instance Functions-------------------------------------------------------------
7374// Private:
74- void CPlay::addPassthroughParameters (QString& param )
75+ void CPlay::addExtraExecParameters (TExec* execTask, Task::Stage taskStage )
7576{
76- // Consider all positional arguments (can be explicitly added with "-- <args>") to be passthrough
77- QStringList ptp = mParser .positionalArguments ();
78- if (!ptp.isEmpty ())
77+ // Currently only affects primary execs
78+ if (taskStage != Task::Stage::Primary)
79+ return ;
80+
81+ QStringList extraParams;
82+
83+ // Check for fullscreen
84+ if (mParser .isSet (CL_OPTION_FULLSCREEN))
7985 {
80- param.append (u' ' );
81- param.append (TExec::joinArguments (ptp));
86+ logEvent (LOG_EVENT_FORCING_FULLSCREEN);
87+ auto lookupName = QFileInfo (execTask->executable ()).baseName ().toLower ();
88+ auto fsItr = FULLSCREEN_PARAMS.constFind (lookupName);
89+ if (fsItr != FULLSCREEN_PARAMS.cend ())
90+ {
91+ logEvent (LOG_EVENT_FULLSCREEN_SUPPORTED);
92+ extraParams.append (*fsItr);
93+ }
94+ else
95+ logEvent (LOG_EVENT_FULLSCREEN_UNSUPPORTED);
8296 }
83- }
8497
85- void CPlay::addPassthroughParameters (QStringList& param)
86- {
87- // See above method
88- QStringList ptp = mParser .positionalArguments ();
89- param.append (ptp);
98+ // Get passthrough args
99+ if (auto ptp = mParser .positionalArguments (); !ptp.isEmpty ())
100+ extraParams.append (ptp);
101+
102+ /* Add extra params, which may be
103+ * - Passthrough args (i.e. <rest_of_command> -- <passthrough_args>)
104+ * - Fullscreen params
105+ */
106+ auto params = execTask->parameters ();
107+ std::visit (qxFuncAggregate{
108+ [&](QString& ps){
109+ ps.append (u' ' );
110+ ps.append (TExec::joinArguments (extraParams));
111+ },
112+ [&](QStringList& ps){
113+ ps.append (extraParams);
114+ }
115+ }, params);
116+ execTask->setParameters (params);
90117}
91118
92119QString CPlay::getServerOverride (const Fp::GameData& gd)
@@ -282,29 +309,16 @@ Qx::Error CPlay::enqueueAdditionalApp(const Fp::AddApp& addApp, const Fp::Game&
282309
283310 mCore .enqueueSingleTask (extraTask);
284311 }
285- else if (useRuffle (parent, taskStage))
286- enqueueRuffleTask (addApp.name (), addApp.launchCommand ());
287312 else
288313 {
289- QString addAppPath = mCore .resolveFullAppPath (addApp.appPath (), parent.platformName ());
290- QFileInfo addAppPathInfo (addAppPath);
291- QString param = addApp.launchCommand ();
292- addPassthroughParameters (param);
293-
294- TExec* addAppTask = new TExec (mCore );
295- addAppTask->setIdentifier (addApp.name ());
296- addAppTask->setStage (taskStage);
297- addAppTask->setExecutable (QDir::cleanPath (addAppPathInfo.absoluteFilePath ())); // Like canonical but doesn't care if path DNE
298- addAppTask->setDirectory (addAppPathInfo.absoluteDir ());
299- addAppTask->setParameters (param);
300- addAppTask->setEnvironment (mCore .childTitleProcessEnvironment ());
301- addAppTask->setProcessType (addApp.isWaitExit () || taskStage == Task::Stage::Primary ? TExec::ProcessType::Blocking : TExec::ProcessType::Deferred);
302-
303- mCore .enqueueSingleTask (addAppTask);
314+ TExec* execTask = useRuffle (parent, taskStage) ? createRuffleTask (addApp.name (), addApp.launchCommand ()) :
315+ createStdAddAppExecTask (addApp, parent, taskStage);
316+ addExtraExecParameters (execTask, taskStage);
317+ mCore .enqueueSingleTask (execTask);
304318
305319#ifdef _WIN32
306320 // Add wait task if required
307- if (Qx::Error ee = mCore .conditionallyEnqueueBideTask (addAppPathInfo ); ee.isValid ())
321+ if (Qx::Error ee = mCore .conditionallyEnqueueBideTask (execTask ); ee.isValid ())
308322 return ee;
309323#endif
310324 }
@@ -315,19 +329,28 @@ Qx::Error CPlay::enqueueAdditionalApp(const Fp::AddApp& addApp, const Fp::Game&
315329
316330Qx::Error CPlay::enqueueGame (const Fp::Game& game, const Fp::GameData& gameData, Task::Stage taskStage)
317331{
318- QString param = !gameData.isNull () ? gameData.launchCommand () : game.launchCommand ();
332+ TExec* execTask = useRuffle (game, taskStage) ? createRuffleTask (game.title (), !gameData.isNull () ? gameData.launchCommand () : game.launchCommand ()) :
333+ createStdGameExecTask (game, gameData, taskStage);
319334
320- if (useRuffle (game, taskStage))
321- {
322- enqueueRuffleTask (game.title (), param);
323- return Qx::Error ();
324- }
335+ addExtraExecParameters (execTask, taskStage);
336+ mCore .enqueueSingleTask (execTask);
337+
338+ #ifdef _WIN32
339+ // Add wait task if required
340+ if (Qx::Error ee = mCore .conditionallyEnqueueBideTask (execTask); ee.isValid ())
341+ return ee;
342+ #endif
343+
344+ // Return success
345+ return Qx::Error ();
346+ }
325347
348+ TExec* CPlay::createStdGameExecTask (const Fp::Game& game, const Fp::GameData& gameData, Task::Stage taskStage)
349+ {
326350 QString gamePath = mCore .resolveFullAppPath (!gameData.isNull () ? gameData.appPath () : game.appPath (),
327351 game.platformName ());
328352 QFileInfo gamePathInfo (gamePath);
329-
330- addPassthroughParameters (param);
353+ QString param = !gameData.isNull () ? gameData.launchCommand () : game.launchCommand ();
331354
332355 TExec* gameTask = new TExec (mCore );
333356 gameTask->setIdentifier (game.title ());
@@ -338,19 +361,28 @@ Qx::Error CPlay::enqueueGame(const Fp::Game& game, const Fp::GameData& gameData,
338361 gameTask->setEnvironment (mCore .childTitleProcessEnvironment ());
339362 gameTask->setProcessType (TExec::ProcessType::Blocking);
340363
341- mCore .enqueueSingleTask (gameTask);
342-
343- #ifdef _WIN32
344- // Add wait task if required
345- if (Qx::Error ee = mCore .conditionallyEnqueueBideTask (gamePathInfo); ee.isValid ())
346- return ee;
347- #endif
364+ return gameTask;
365+ }
348366
349- // Return success
350- return Qx::Error ();
367+ TExec* CPlay::createStdAddAppExecTask (const Fp::AddApp& addApp, const Fp::Game& parent, Task::Stage taskStage)
368+ {
369+ QString addAppPath = mCore .resolveFullAppPath (addApp.appPath (), parent.platformName ());
370+ QFileInfo addAppPathInfo (addAppPath);
371+ QString param = addApp.launchCommand ();
372+
373+ TExec* addAppTask = new TExec (mCore );
374+ addAppTask->setIdentifier (addApp.name ());
375+ addAppTask->setStage (taskStage);
376+ addAppTask->setExecutable (QDir::cleanPath (addAppPathInfo.absoluteFilePath ())); // Like canonical but doesn't care if path DNE
377+ addAppTask->setDirectory (addAppPathInfo.absoluteDir ());
378+ addAppTask->setParameters (param);
379+ addAppTask->setEnvironment (mCore .childTitleProcessEnvironment ());
380+ addAppTask->setProcessType (addApp.isWaitExit () || taskStage == Task::Stage::Primary ? TExec::ProcessType::Blocking : TExec::ProcessType::Deferred);
381+
382+ return addAppTask;
351383}
352384
353- void CPlay::enqueueRuffleTask (const QString& name, const QString& originalParams)
385+ TExec* CPlay::createRuffleTask (const QString& name, const QString& originalParams)
354386{
355387 /* Replicating:
356388 *
@@ -384,19 +416,18 @@ void CPlay::enqueueRuffleTask(const QString& name, const QString& originalParams
384416 u" --proxy" _s,
385417 fp.preferences ().browserModeProxy
386418 };
387- addPassthroughParameters (newParams);
388419 newParams.append (QProcess::splitCommand (originalParams));
389420
390- TExec* gameTask = new TExec (mCore );
391- gameTask ->setIdentifier (name);
392- gameTask ->setStage (Task::Stage::Primary);
393- gameTask ->setExecutable (ruffle.absoluteFilePath ());
394- gameTask ->setDirectory (ruffle.absoluteDir ());
395- gameTask ->setParameters (newParams);
396- gameTask ->setEnvironment (mCore .childTitleProcessEnvironment ());
397- gameTask ->setProcessType (TExec::ProcessType::Blocking);
421+ TExec* ruffleTask = new TExec (mCore );
422+ ruffleTask ->setIdentifier (name);
423+ ruffleTask ->setStage (Task::Stage::Primary);
424+ ruffleTask ->setExecutable (ruffle.absoluteFilePath ());
425+ ruffleTask ->setDirectory (ruffle.absoluteDir ());
426+ ruffleTask ->setParameters (newParams);
427+ ruffleTask ->setEnvironment (mCore .childTitleProcessEnvironment ());
428+ ruffleTask ->setProcessType (TExec::ProcessType::Blocking);
398429
399- mCore . enqueueSingleTask (gameTask) ;
430+ return ruffleTask ;
400431}
401432
402433// Protected:
0 commit comments