diff --git a/gui/game_run.pas b/gui/game_run.pas index efe6c6fb..5ebb6c89 100644 --- a/gui/game_run.pas +++ b/gui/game_run.pas @@ -82,9 +82,6 @@ begin inherited; end; -var - runing:Boolean=False; - procedure re_init_tty; register; var i:Integer; @@ -244,8 +241,6 @@ begin Result:=nil; if Item.FLock then Exit; - if runing then Exit; - SetStdHandle(STD_OUTPUT_HANDLE,cfg.hOutput); SetStdHandle(STD_ERROR_HANDLE ,cfg.hError ); @@ -326,7 +321,6 @@ begin Result.g_ipc.kevent(@kev,1); - runing:=True; end; diff --git a/gui/main.lfm b/gui/main.lfm index ce352ba4..3385c0cb 100644 --- a/gui/main.lfm +++ b/gui/main.lfm @@ -1,7 +1,7 @@ object frmMain: TfrmMain - Left = 527 + Left = 396 Height = 343 - Top = 146 + Top = 211 Width = 623 Caption = 'fpPS4' ClientHeight = 343 @@ -11,8 +11,8 @@ object frmMain: TfrmMain OnCreate = FormCreate object Pages: TPageControl Left = 0 - Height = 343 - Top = 0 + Height = 275 + Top = 68 Width = 623 ActivePage = TabList Align = alClient @@ -20,12 +20,12 @@ object frmMain: TfrmMain TabOrder = 0 object TabList: TTabSheet Caption = 'Games' - ClientHeight = 315 + ClientHeight = 247 ClientWidth = 615 PopupMenu = MenuList object ListGrid: TStringGrid Left = 0 - Height = 315 + Height = 247 Top = 0 Width = 615 Align = alClient @@ -62,6 +62,44 @@ object frmMain: TfrmMain Caption = 'Log' end end + object MainToolBar: TToolBar + Left = 0 + Height = 68 + Top = 0 + Width = 623 + AutoSize = True + ButtonHeight = 64 + ButtonWidth = 64 + EdgeBorders = [ebLeft, ebTop, ebRight, ebBottom] + Images = MainImageList + ImagesWidth = 64 + TabOrder = 1 + object TBPlay: TToolButton + Left = 3 + Top = 2 + ImageIndex = 0 + Style = tbsCheck + OnClick = TBPlayClick + end + object TBPause: TToolButton + Left = 71 + Top = 2 + ImageIndex = 1 + OnClick = TBPauseClick + end + object TBStop: TToolButton + Left = 139 + Top = 2 + ImageIndex = 2 + OnClick = TBStopClick + end + object TBConfig: TToolButton + Left = 207 + Top = 2 + Caption = 'TBConfig' + ImageIndex = 6 + end + end object MenuList: TPopupMenu Left = 171 Top = 142 @@ -95,4 +133,72 @@ object frmMain: TfrmMain OnClick = MIDelClick end end + object MainImageList: TImageList + AllocBy = 7 + Height = 64 + Width = 64 + Left = 241 + Top = 144 + Bitmap = { + 4C7A070000004000000040000000340700000000000078DAEDDD6DA815451CC7 + F1311F8A527BF0018C2C82BCA18904051A61192589BDAB171156221244595448 + 3E5CEF3D57B4B0C84A2A8AD00CA10C312AACC427C42C7C119441655EA5A232B1 + C0EBF353EAE93F348B8B9D7BCFEC9E39BBB33BDF1FFC88E0B0673FE3EED9DDD9 + B1942284104208A99BABA51BA447A55BA4E302F3AF9356633D2B7D473A3410FF + F1F3FC51BBA44F4AFB94DC5FADD31DD28901FBA3AE910E0FD8AF7B44DA21BD30 + 507FD49DD24901FBE3E7C43501FBABE6BE419F131705EA8FBA4B7A4FC0FEF839 + 716DC07EDD63D245D2FE81FAA3FE2E7D38607FD48DD25101FB754F4997480704 + EA8FBAC7B373A29A53374B4707ECD7FDC79C130303F547FDD39C13BD02F547FD + 423A2660BFEE19E90AE9A040FD517F3373B3A1FA755706EEEFC2CFF11FF0EFDF + 70AE7F41F9B7047AFF13EAFDEFA9809F7F427DFEFD23D0F98F90E7BFF4FCE748 + E6BF837AFFD1A18AF14E90F75FEEDE7F4E56C58BABF7DF455D13C2FA8774EB5F + EE56E5489AF54FFD5479C2FAB79EBB5D3A5E9537DDAD7FDD2F9D21EDADCA9D75 + 35E69F964987A830A2DFB1AC37BF6D9BA4631521841042082184104248B9F39C + F4A4AA3F2FA83FB3C0627B0B1D6FAFD9B1D9D7A8272CB677C2F1F69A9DA4EF42 + B2DE1E7EFCF8F1E3C78F1F3F7EFCF8F1E3C78F1F3F7EFCF8F1E3C78F1F3F7EFC + F8F1E3C78F1F3F7EFCF8F1E3C78F1F3F7EFCF8CFC5F57AE5A2AD7F5E60B9CFFA + 33F373D81E21841042082184104248BD2C57FFFD371EAB05EB69E95207FED305 + B4C7C7A0D1540B5EFCF8F1E3C78F1F3F7EFCF8F1E3C78F1F3F7EFCF8F1E3C78F + 1F3F7EFCF8F1E3C78F1F3F7EFCF8F1E3C78F1F3F7EFCF843F287BEFE795941C7 + 40EFF3DB8A10420821841042082189D3D1D1D122ADC4DA12927DCE9C391BE49F + D5A8B366CDFA36947130CE6AADB6B6B67E5AF631E8C9AF2BC7C681F6F6F68565 + 1D877AFED839B1B38CE784AD3F763C6C28D33824F5479573E2FD328C415ABF39 + 273A8B7E2C34E28F9D131B8B3A0E2EFC51DBDADA56166D0C5CFACD39B1BB48C7 + 826B7FEC9CD85C847168963FEABC79F356F93C06CDF6EBCE9E3D7BAFAFC74216 + FED8387CE5DB3864E98F5D2756FB320679F87D3A27F2F2C7C6615B9EE390B73F + 769DF8308F31F0C51F3B273AB21C079FFC799C133EFA63F36F9F347B0C7CF6C7 + E65B5A42F59B56F0E3C7CFEF1FD73FEE7FB8FFE5F987E75FE63F98FF62FE93F9 + 6FBFFDBEBF13E4FD17EF3F5DD98BB82684F50F0DAD7F29FC9AB006D63FBD17E2 + FAA750D7BFC9B1FE7D88EB1FE5CFBBAB52A92C0871FD6B20EB9F835EFF1E8D41 + A87FFF81104208218410424898A9F12C6CD396ACB69781BFE2727D9AEBEDE1C7 + 8F1F3F7EFCF8F1E3C78F1F3F7EFCF8F1E3C78F1F3F7EFCF8F1E3C78F1F3F7EFC + F8F1E3C78F1F3F7EFCF8F1E3C78F1F3F7EFCF8F9FB0F8410420821841042CA91 + 94CFA3BEB5A5017F11FE7F374D9B1FC18F1F3F7EFCF8F1E3C78F1F3F7EFCF8F1 + E3C78F1F3F7EFCF8F1E3C78F1F3F7EFCF8F1E3C78F1F3F7EFCF8F1E3C78F1F3F + 7EFCF80BE20FFAEF3F1042082184104208212475A64B774ACF4AABB1EE912E92 + F62BB1FDDEF3CCB5FA5289FD6B2DFC07A51794D4FF83855FF78A02DA2E97F671 + E41F54673B433C72DF2CFDCEECF771E90BD2BE353ED74BBADFD27F4337DF3545 + BACF7C669FF9F73C33417AB8C6FEAFAE3106F75BDA755FADF15D4F75F3D96772 + B2DF253DDA83619B7492F446E95CE9B1047E7D6D7C4B3A563A4EBAB4CEE76766 + 6C1F6F8EF5AA479D91A17FB76776DD13D2AB32B00FF3D01EF5BE0CFC7D3D3CF6 + A38ECDE8F86FF5D0BED65C63B388FE9ED73DB27F9DC33DA31E83CF13EEE769E9 + C7D269D291D281D28BA5D79967A377A547126EF367E96539DD03DC96603FD74B + 475BFEBE2E4DB0DDBCEE7F74C658EEE3A214CF7453CD35ADDEB6A7E7E8EFB0D8 + BFC50D6C7F8AC5F63FCBC1DD5FFAB8F4649D7DDB2AEDDDE077BD613106AF35F1 + 99501FB74F48B79BE7B7FDE677CCE61EDEC5F578B0F480E57916ED9F9E5F9B6F + F13C6E9367535E93B63AFC335892721FDA1D7CF7AF29BFDBE5EFF21D29F7E127 + 07DF9DF69E648243FF8094FB702847FF08C7BF43870AE677BDEEEE70C1FC2E8F + FF81391EFFBFA4FC6E97735277A6DC871F1D7CF7CC025FFFE63A7ACE7B4CFA4D + 8AFB9F718EEE7F0E5A7ABBCCFE759A6B7F1FD59C5C6279FFFBA583FBDF372DDC + 2FAB7CDE89D83CFFBCD2C0F61FB2D8FE470578FE7D31C57130CDE2F8AA9A31CA + 2B49E63F3699F1AA972BA5CB3D9DF76F74FEEB8C748D99B31825BDD4CC7F8D30 + 73D72B54CFEF946AB5D3DC1F676DF769FE736BC663D0E6E1FC7756BF837A7D8E + AFEF3FC664E0F7F9FDD7E48C8E814E0FEDFA77736846FE5B55B2F7F959F4D18C + AF0113EB8C81BEF7D5EB1F6E925612FE6644EB1FF438DF2EFD40F9F90EA4BB35 + 20ABD4FFD7BF4C4DE05F9CE09AF3B4CA37B74877A873EB9F9EEFE6B9AB778239 + 9CEBBBF9AE47D4B935547F491F54FE64B0C5F3A6EDBA910175DE470C53D9BDEB + 761917FE22679385FD6F55DE3CA0ECDE159739FA3ABDAB867BAF2AFFFA774208 + 218478907F01A6F0B4E2 + } + end end diff --git a/gui/main.pas b/gui/main.pas index a899589c..75dea0dd 100644 --- a/gui/main.pas +++ b/gui/main.pas @@ -23,10 +23,15 @@ uses host_ipc; type + TMainButtonsState=(mbsStopped, + mdsStarted, + mdsRunned, + mdsSuspended); { TfrmMain } TfrmMain = class(TForm) + MainImageList: TImageList; MIDevide3: TMenuItem; MIRun: TMenuItem; MIEdit: TMenuItem; @@ -40,6 +45,11 @@ type ListGrid: TStringGrid; TabList: TTabSheet; TabLog: TTabSheet; + MainToolBar: TToolBar; + TBPlay: TToolButton; + TBPause: TToolButton; + TBStop: TToolButton; + TBConfig: TToolButton; procedure FormCreate(Sender: TObject); procedure OnIdleUpdate(Sender:TObject;var Done:Boolean); @@ -48,6 +58,9 @@ type procedure MIDelClick(Sender: TObject); procedure MIEditClick(Sender: TObject); procedure MIRunClick(Sender: TObject); + procedure TBPauseClick(Sender: TObject); + procedure TBPlayClick(Sender: TObject); + procedure TBStopClick(Sender: TObject); private public @@ -67,6 +80,8 @@ type FLogUpdateTime:QWORD; + FMainButtonsState:TMainButtonsState; + procedure ReadIniFile; procedure LoadItemIni(Item:TGameItem); procedure SaveItemIni(Item:TGameItem); @@ -79,6 +94,7 @@ type procedure DoEdit(Sender: TObject); procedure LogEnd; procedure ClearLog; + procedure SetButtonsState(s:TMainButtonsState); end; var @@ -163,7 +179,8 @@ begin end; if ((kev[i].fflags and NOTE_EXEC)<>0) then begin - ShowMessage('NOTE_EXEC pid:'+IntToStr(kev[i].ident)); + //ShowMessage('NOTE_EXEC pid:'+IntToStr(kev[i].ident)); + Form.SetButtonsState(mdsRunned); end; end; @@ -322,6 +339,8 @@ begin Pages.ActivePageIndex:=0; Application.AddOnIdleHandler(@OnIdleUpdate,False); + + SetButtonsState(mbsStopped); end; procedure TfrmMain.OnIdleUpdate(Sender:TObject;var Done:Boolean); @@ -338,9 +357,18 @@ begin end; if (FGameProcess<>nil) then - if (FGameProcess.g_ipc<>nil) then begin - FGameProcess.g_ipc.Update(IpcHandler); + + if (FGameProcess.g_ipc<>nil) then + begin + FGameProcess.g_ipc.Update(IpcHandler); + end; + + if FGameProcess.is_terminated then + begin + TBStopClick(Sender); + end; + end; end; @@ -430,6 +458,8 @@ var aRow:Integer; cfg:TGameRunConfig; begin + if (FGameProcess<>nil) then Exit; + aRow:=ListGrid.Row; if (aRow=0) then Exit; @@ -448,6 +478,46 @@ begin cfg.fork_proc:=True; FGameProcess:=run_item(cfg,Item); + + SetButtonsState(mdsStarted); +end; + +procedure TfrmMain.TBPlayClick(Sender: TObject); +begin + if (FGameProcess<>nil) then + begin + //resume + FGameProcess.resume; + SetButtonsState(mdsRunned); + end else + begin + //run + MIRunClick(Sender); + end; +end; + +procedure TfrmMain.TBPauseClick(Sender: TObject); +begin + if (FGameProcess<>nil) then + begin + //suspend + FGameProcess.suspend; + SetButtonsState(mdsSuspended); + end; +end; + +procedure TfrmMain.TBStopClick(Sender: TObject); +begin + if (FGameProcess<>nil) then + if (FGameProcess.g_fork) then //only forked + begin + //terminate + FGameProcess.stop; + SetButtonsState(mbsStopped); + FreeAndNil(FGameProcess); + // + Pages.ActivePage:=TabList; + end; end; procedure TfrmMain.MIDelClick(Sender: TObject); @@ -555,6 +625,54 @@ begin SaveItemIni(Item); end; +procedure TfrmMain.SetButtonsState(s:TMainButtonsState); +begin + FMainButtonsState:=s; + + case s of + mbsStopped: + begin + TBPlay .Enabled:=True; + TBPause.Enabled:=False; + TBStop .Enabled:=False; + // + TBPlay .ImageIndex:=0; + TBPause.ImageIndex:=1+3; + TBStop .ImageIndex:=2+3; + end; + mdsStarted: + begin + TBPlay .Enabled:=False; + TBPause.Enabled:=False; + TBStop .Enabled:=False; + // + TBPlay .ImageIndex:=0+3; + TBPause.ImageIndex:=1+3; + TBStop .ImageIndex:=2+3; + end; + mdsRunned: + begin + TBPlay .Enabled:=False; + TBPause.Enabled:=True; + TBStop .Enabled:=True; + // + TBPlay .ImageIndex:=0+3; + TBPause.ImageIndex:=1; + TBStop .ImageIndex:=2; + end; + mdsSuspended: + begin + TBPlay .Enabled:=True; + TBPause.Enabled:=False; + TBStop .Enabled:=True; + // + TBPlay .ImageIndex:=0; + TBPause.ImageIndex:=1+3; + TBStop .ImageIndex:=2; + end; + end; + +end; end. diff --git a/icons/211751_gear_icon.png b/icons/211751_gear_icon.png new file mode 100644 index 00000000..c5a80988 Binary files /dev/null and b/icons/211751_gear_icon.png differ diff --git a/icons/211871_pause_icon.png b/icons/211871_pause_icon.png new file mode 100644 index 00000000..4070e6ef Binary files /dev/null and b/icons/211871_pause_icon.png differ diff --git a/icons/211871_pause_icon_gray.png b/icons/211871_pause_icon_gray.png new file mode 100644 index 00000000..2db95e9a Binary files /dev/null and b/icons/211871_pause_icon_gray.png differ diff --git a/icons/211876_play_icon.png b/icons/211876_play_icon.png new file mode 100644 index 00000000..30be2732 Binary files /dev/null and b/icons/211876_play_icon.png differ diff --git a/icons/211876_play_icon_gray.png b/icons/211876_play_icon_gray.png new file mode 100644 index 00000000..3a2a930c Binary files /dev/null and b/icons/211876_play_icon_gray.png differ diff --git a/icons/211931_stop_icon.png b/icons/211931_stop_icon.png new file mode 100644 index 00000000..8c73b6ef Binary files /dev/null and b/icons/211931_stop_icon.png differ diff --git a/icons/211931_stop_icon_gray.png b/icons/211931_stop_icon_gray.png new file mode 100644 index 00000000..68d0f9f1 Binary files /dev/null and b/icons/211931_stop_icon_gray.png differ