RetroPie forum home
    • Recent
    • Tags
    • Popular
    • Home
    • Docs
    • Register
    • Login

    Announcing Pegasus Frontend

    Scheduled Pinned Locked Moved Ideas and Development
    frontendpegasusc++developmentqml
    1.7k Posts 145 Posters 5.2m Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • J
      jerzeeloon
      last edited by

      Anyone happen to know what changed in android 11 that my metadata.txt file is no longer launching retroarch?

      1 Reply Last reply Reply Quote 0
      • P
        Patientgamerfr @fluffypillow
        last edited by

        @fluffypillow Really neat page thank you Fluffy.

        1 Reply Last reply Reply Quote 0
        • fluffypillowF
          fluffypillow
          last edited by

          "Weekly" update! This month I was working mostly on internal stuff, related to how Pegasus and the supported sources find games, and finally these changes are available now in the latest version. In general, loading should be slightly faster, especially for Steam, GOG and Android, and the loading progress is now displayed more accurately. There have been also lots of minor improvements and optimizations; everything should continue to work fine, but please report if you notice any surprising behavior!

          Maintenance changes: Running the tests now requires C++17; also expect Pegasus to follow too in the future

          M DarksaviorD 2 Replies Last reply Reply Quote 1
          • M
            msheehan79 @fluffypillow
            last edited by

            @fluffypillow Did something change with regards to how Pegasus runs in portable mode?

            I've been keeping up with the latest builds but the most recent build has broken something on my setup when I try it. It doesn't seem to be recognizing the --portable flag anymore; I also tried the new portable.txt method in the same directory but neither method seems to work.

            This is on Windows 10 x64; I am happy to send along any relevant info you need if it helps.

            My folder structure is configured for portable and uses a centralized folder with the pegasus metadata files stored here:
            C:\Emulation\pegasus\config\metafiles

            Normally the lastrun.log would update in C:\Emulation\pegasus\config\lastrun.log, but with the latest update it is using my windows user AppData directory instead.

            fluffypillowF 1 Reply Last reply Reply Quote 0
            • fluffypillowF
              fluffypillow @msheehan79
              last edited by

              @msheehan79 Indeed there was a leftover bug, but it should be fixed now in the latest release. Thanks!

              M 1 Reply Last reply Reply Quote 1
              • M
                msheehan79 @fluffypillow
                last edited by msheehan79

                @fluffypillow Thanks! I can confirm the newest build is once again respecting the portable flag and reading the metadata files. However this build is crashing where the older builds did not. I don't see any obvious errors in the log file that would help. Will do some troubleshooting and see if I can provide more details soon on how to reproduce.

                After doing some troubleshooting, it seems there is something specific to some metadata entries that trigger the crash. I was able to do some testing and found a specific game metadata entry that consistently triggers the crash, so I'll upload that to the github repo for you.

                1 Reply Last reply Reply Quote 1
                • DarksaviorD
                  Darksavior @fluffypillow
                  last edited by Darksavior

                  @fluffypillow I just updated and it segfaults. I see the pegasus loading screen and I see it scan the "emulationstation" folder and then it segfaults. I am using an experimental kernel (5.10.0-rc2-v71) with the kms driver but pegasus was working just before I updated. ES is still works.

                  What was the command to get a log?

                  1 Reply Last reply Reply Quote 0
                  • B
                    bmonomad @fluffypillow
                    last edited by

                    @fluffypillow Best looking and performing frontend I've found for the shield, thank you for your efforts. Curious, is there any plan in the near-future to have the ability to remove games from the displayed library? For example, I have a big library and want to remove or flag undesirable games over time.

                    1 Reply Last reply Reply Quote 0
                    • fluffypillowF
                      fluffypillow
                      last edited by

                      @Darksavior I've just pushed an update, could you check if it fixes the issue? In case it doesn't, you can find the log file at ~/.config/pegasus-frontend/lastrun.log.

                      @bmonomad Thanks! At the moment the game list is read only: because metadata can come from various files and multiple sources, write support would work only with some limitations. There's no game list/data editor in the works right now, but might come in the future!

                      DarksaviorD 1 Reply Last reply Reply Quote 1
                      • DarksaviorD
                        Darksavior @fluffypillow
                        last edited by Darksavior

                        @fluffypillow No change with the update. That log is empty. Tried a fresh install of retropie and it works with that. Here's more info about the crash:
                        IMG_0142 (2).JPG

                        fluffypillowF 1 Reply Last reply Reply Quote 0
                        • fluffypillowF
                          fluffypillow @Darksavior
                          last edited by

                          @darksavior Haven't managed to reproduce the bug yet, but will try again tomorrow on a larger set of games. Likely Pegasus has problems with one of the gamelist XMLs, maybe the neogeo one, or something that comes after that but haven't had the time to print its name before the crash. Localizing the error could be done by temporarily renaming the gamelist XML or its directory to make Pegasus skip reading it, and see which one succeeds/fails. But I'll also try reproducing it tomorrow.

                          DarksaviorD 1 Reply Last reply Reply Quote 0
                          • DarksaviorD
                            Darksavior @fluffypillow
                            last edited by Darksavior

                            @fluffypillow I re-tested by removing systems until pegasus loaded. While pegasus did load, it did not use the xml's since the games are just white text on a black background.

                            I also reproduced the problem on a clean install of retropie 4.7.1 by transferring my xml's to it. There is definitely a problem with pegasus reading the gamelist xml's from ES.

                            fluffypillowF 1 Reply Last reply Reply Quote 0
                            • fluffypillowF
                              fluffypillow @Darksavior
                              last edited by

                              @darksavior Could you try the latest version? I think I might've fixed it.

                              DarksaviorD 1 Reply Last reply Reply Quote 0
                              • DarksaviorD
                                Darksavior @fluffypillow
                                last edited by Darksavior

                                @fluffypillow It fixes the crash but there's still the issue of pegasus not reading the xml's correctly. Most of my systems have no art or no proper title. Around 10 games do for some reason...

                                fluffypillowF 1 Reply Last reply Reply Quote 0
                                • fluffypillowF
                                  fluffypillow @Darksavior
                                  last edited by

                                  @darksavior Just pushed another update, could you take a look?

                                  DarksaviorD 1 Reply Last reply Reply Quote 1
                                  • DarksaviorD
                                    Darksavior @fluffypillow
                                    last edited by

                                    @fluffypillow Everything working again. Thanks!

                                    1 Reply Last reply Reply Quote 0
                                    • P
                                      prefor
                                      last edited by

                                      I have a few problems with this front-end. Don't get me wrong, so far this is the best looking Front-end I've used for Android, and that it includes Video snaps and the layout is gorgeous!

                                      I'm using this on Android

                                      However I have these two problems:

                                      1. I'm using GameOS theme with this front-end and it looks good!
                                        However 60% of the time when I launch a game (NES game in this case) through Pegasus Front-end using Retroarch, Retroarch just crashes and redirects me back to Pegasus Front-end...
                                        And also when I launch a game the navigation bar shows up in Retroarch for some reason, which I can't remove.. Maybe that's the cause of the crashing? :/

                                      Here is a crash log i get from Retroarch: https://del.dog/dunimuriph.txt
                                      And here is a picture of what I mean about Navigation bar: https://i.imgur.com/cByCchc.jpg

                                      1. The second problem I noticed is when I tried to install this on another phone. For some reason I can't set game directories. It's all empty no matter which folder I open. Does someone knows why? I have granted permission on Pegasus-frontend to use and read file storage etc, but it stills happen. Does anyone knows why? :(
                                        Here is a picture of what I mean: https://i.imgur.com/DWP4PgG.jpg
                                      fluffypillowF 1 Reply Last reply Reply Quote 0
                                      • M
                                        msheehan79
                                        last edited by

                                        @fluffypillow I have a question around theme development. Is there a means within QML to identify when Pegasus is first being loaded up vs. when Pegasus has just returned from launching a game? From what I can gather the Component.onCompleted is usually where any logic is stored that executes when the theme finishes loading, but that triggers both on initial startup as well as after a game ends.

                                        The use case I could envision is trying to control where Pegasus first lands on startup, for example to always display a specific home page or specific collection as a starting point, but I would not want to redirect there after launching every game, in those cases I would want to return the user to the last viewed collection etc.

                                        PlayingKarrdeP 1 Reply Last reply Reply Quote 0
                                        • PlayingKarrdeP
                                          PlayingKarrde @msheehan79
                                          last edited by

                                          @msheehan79 said in Announcing Pegasus Frontend:

                                          @fluffypillow I have a question around theme development. Is there a means within QML to identify when Pegasus is first being loaded up vs. when Pegasus has just returned from launching a game? From what I can gather the Component.onCompleted is usually where any logic is stored that executes when the theme finishes loading, but that triggers both on initial startup as well as after a game ends.

                                          The use case I could envision is trying to control where Pegasus first lands on startup, for example to always display a specific home page or specific collection as a starting point, but I would not want to redirect there after launching every game, in those cases I would want to return the user to the last viewed collection etc.

                                          What I do is store a variable when I launch the game and then check for it in Component.onCompleted, then clear it from memory.

                                          // Launch the current game
                                              function launchGame(game) {
                                                  if (game !== null) {
                                                      saveCurrentState(game);
                                                      game.launch();
                                                  } else {
                                                      saveCurrentState(currentGame);
                                                      currentGame.launch();
                                                  }
                                              }
                                          
                                              // Save current states for returning from game
                                              function saveCurrentState(game) {
                                                  api.memory.set('savedState', root.state);
                                                  api.memory.set('savedCollection', currentCollectionIndex);
                                                  api.memory.set('lastState', JSON.stringify(lastState));
                                                  api.memory.set('lastGame', JSON.stringify(lastGame));
                                                  api.memory.set('storedHomePrimaryIndex', storedHomePrimaryIndex);
                                                  api.memory.set('storedHomeSecondaryIndex', storedHomeSecondaryIndex);
                                                  api.memory.set('storedCollectionIndex', currentCollectionIndex);
                                                  api.memory.set('storedCollectionGameIndex', storedCollectionGameIndex);
                                          
                                                  const savedGameIndex = api.allGames.toVarArray().findIndex(g => g === game);
                                                  api.memory.set('savedGame', savedGameIndex);
                                          
                                                  api.memory.set('To Game', 'True');
                                              }
                                          
                                              // Handle loading settings when returning from a game
                                              property bool fromGame: api.memory.has('To Game');
                                              function returnedFromGame() {
                                                  lastState                   = JSON.parse(api.memory.get('lastState'));
                                                  lastGame                    = JSON.parse(api.memory.get('lastGame'));
                                                  currentCollectionIndex      = api.memory.get('savedCollection');
                                                  storedHomePrimaryIndex      = api.memory.get('storedHomePrimaryIndex');
                                                  storedHomeSecondaryIndex    = api.memory.get('storedHomeSecondaryIndex');
                                                  currentCollectionIndex      = api.memory.get('storedCollectionIndex');
                                                  storedCollectionGameIndex   = api.memory.get('storedCollectionGameIndex');
                                          
                                                  currentGame                 = api.allGames.get(api.memory.get('savedGame'));
                                                  root.state                  = api.memory.get('savedState');
                                          
                                                  // Remove these from memory so as to not clog it up
                                                  api.memory.unset('savedState');
                                                  api.memory.unset('savedGame');
                                                  api.memory.unset('lastState');
                                                  api.memory.unset('lastGame');
                                                  api.memory.unset('storedHomePrimaryIndex');
                                                  api.memory.unset('storedHomeSecondaryIndex');
                                                  api.memory.unset('storedCollectionIndex');
                                                  api.memory.unset('storedCollectionGameIndex');
                                          
                                                  // Remove this one so we only have it when we come back from the game and not at Pegasus launch
                                                  api.memory.unset('To Game');
                                              }
                                          
                                              // Set default state to the platform screen
                                              Component.onCompleted: { 
                                                  if (fromGame)
                                                      returnedFromGame();
                                              }
                                          
                                          M 1 Reply Last reply Reply Quote 0
                                          • M
                                            msheehan79 @PlayingKarrde
                                            last edited by

                                            @playingkarrde Ah! That makes sense. Set it during the launch command and unset it when you come back. Wasn't sure if there was any native way to detect it, but managing it with a variable indeed looks like a solid approach. Thanks for the advice!

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Contributions to the project are always appreciated, so if you would like to support us with a donation you can do so here.

                                            Hosting provided by Mythic-Beasts. See the Hosting Information page for more information.