Index: CHANGES.txt ================================================================== --- CHANGES.txt +++ CHANGES.txt @@ -1,4 +1,11 @@ +Version 0.9.9.1 +2022-03-10 + +[Feature] macOS builds are working now. +[Feature] First macOS release. + + Version 0.9.9.0 2022-02-24 [Feature] First working version. Index: src/groffstudio.lpi ================================================================== --- src/groffstudio.lpi +++ src/groffstudio.lpi @@ -1,126 +1,130 @@ - - - - - - - - - <Scaled Value="True"/> - <ResourceType Value="res"/> - <UseXPManifest Value="True"/> - <XPManifest> - <DpiAware Value="True"/> - <TextName Value="rosaelefanten.groffstudio"/> - <TextDesc Value="an ide for groff."/> - </XPManifest> - <Icon Value="0"/> - <Resources Count="1"> - <Resource_0 FileName="..\LICENSE" Type="RCDATA" ResourceName="LICENSE"/> - </Resources> - </General> - <VersionInfo> - <UseVersionInfo Value="True"/> - <AutoIncrementBuild Value="True"/> - <MinorVersionNr Value="9"/> - <RevisionNr Value="9"/> - <Attributes pvaPreRelease="True"/> - <StringTable ProductName="groffstudio"/> - </VersionInfo> - <BuildModes> - <Item Name="Default" Default="True"/> - </BuildModes> - <PublishOptions> - <Version Value="2"/> - <UseFileFilters Value="True"/> - </PublishOptions> - <RunParams> - <FormatVersion Value="2"/> - </RunParams> - <RequiredPackages> - <Item> - <PackageName Value="RunTimeTypeInfoControls"/> - </Item> - <Item> - <PackageName Value="SynEdit"/> - </Item> - <Item> - <PackageName Value="LazControls"/> - </Item> - <Item> - <PackageName Value="LCL"/> - </Item> - </RequiredPackages> - <Units> - <Unit> - <Filename Value="groffstudio.lpr"/> - <IsPartOfProject Value="True"/> - </Unit> - <Unit> - <Filename Value="unit1.pas"/> - <IsPartOfProject Value="True"/> - <ComponentName Value="MainForm"/> - <HasResources Value="True"/> - <ResourceBaseClass Value="Form"/> - <UnitName Value="Unit1"/> - </Unit> - <Unit> - <Filename Value="helpers.pas"/> - <IsPartOfProject Value="True"/> - <UnitName Value="Helpers"/> - </Unit> - <Unit> - <Filename Value="buildoutputwindow.pas"/> - <IsPartOfProject Value="True"/> - <ComponentName Value="BuildStatusWindow"/> - <HasResources Value="True"/> - <ResourceBaseClass Value="Form"/> - <UnitName Value="BuildOutputWindow"/> - </Unit> - </Units> - </ProjectOptions> - <CompilerOptions> - <Version Value="11"/> - <PathDelim Value="\"/> - <Target> - <Filename Value="groffstudio"/> - </Target> - <SearchPaths> - <IncludeFiles Value="$(ProjOutDir)"/> - <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> - </SearchPaths> - <CodeGeneration> - <Optimizations> - <OptimizationLevel Value="4"/> - </Optimizations> - </CodeGeneration> - <Linking> - <Debugging> - <GenerateDebugInfo Value="False"/> - <DebugInfoType Value="dsDwarf3"/> - <StripSymbols Value="True"/> - </Debugging> - <Options> - <Win32> - <GraphicApplication Value="True"/> - </Win32> - </Options> - </Linking> - <Other> - <WriteFPCLogo Value="False"/> - </Other> - </CompilerOptions> - <Debugging> - <Exceptions> - <Item> - <Name Value="EAbort"/> - </Item> - <Item> - <Name Value="ECodetoolError"/> - </Item> - <Item> - <Name Value="EFOpenError"/> - </Item> - </Exceptions> - </Debugging> -</CONFIG> +<?xml version="1.0" encoding="UTF-8"?> +<CONFIG> + <ProjectOptions> + <Version Value="12"/> + <PathDelim Value="\"/> + <General> + <SessionStorage Value="InProjectDir"/> + <Title Value="groffstudio"/> + <Scaled Value="True"/> + <ResourceType Value="res"/> + <UseXPManifest Value="True"/> + <XPManifest> + <DpiAware Value="True"/> + <TextName Value="rosaelefanten.groffstudio"/> + <TextDesc Value="an ide for groff."/> + </XPManifest> + <Icon Value="0"/> + <Resources Count="1"> + <Resource_0 FileName="..\LICENSE" Type="RCDATA" ResourceName="LICENSE"/> + </Resources> + </General> + <VersionInfo> + <UseVersionInfo Value="True"/> + <AutoIncrementBuild Value="True"/> + <MinorVersionNr Value="9"/> + <RevisionNr Value="9"/> + <BuildNr Value="1"/> + <Attributes pvaPreRelease="True"/> + <StringTable ProductName="groffstudio"/> + </VersionInfo> + <BuildModes> + <Item Name="Default" Default="True"/> + </BuildModes> + <PublishOptions> + <Version Value="2"/> + <UseFileFilters Value="True"/> + </PublishOptions> + <RunParams> + <FormatVersion Value="2"/> + </RunParams> + <RequiredPackages> + <Item> + <PackageName Value="RunTimeTypeInfoControls"/> + </Item> + <Item> + <PackageName Value="SynEdit"/> + </Item> + <Item> + <PackageName Value="LazControls"/> + </Item> + <Item> + <PackageName Value="LCL"/> + </Item> + </RequiredPackages> + <Units> + <Unit> + <Filename Value="groffstudio.lpr"/> + <IsPartOfProject Value="True"/> + </Unit> + <Unit> + <Filename Value="unit1.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="MainForm"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="Unit1"/> + </Unit> + <Unit> + <Filename Value="helpers.pas"/> + <IsPartOfProject Value="True"/> + <UnitName Value="Helpers"/> + </Unit> + <Unit> + <Filename Value="buildoutputwindow.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="BuildStatusWindow"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="BuildOutputWindow"/> + </Unit> + </Units> + </ProjectOptions> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <Target> + <Filename Value="groffstudio"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> + </SearchPaths> + <CodeGeneration> + <Optimizations> + <OptimizationLevel Value="4"/> + </Optimizations> + </CodeGeneration> + <Linking> + <Debugging> + <GenerateDebugInfo Value="False"/> + <DebugInfoType Value="dsDwarf3"/> + <StripSymbols Value="True"/> + </Debugging> + <Options> + <Win32> + <GraphicApplication Value="True"/> + </Win32> + </Options> + </Linking> + <Other> + <WriteFPCLogo Value="False"/> + </Other> + </CompilerOptions> + <Debugging> + <Exceptions> + <Item> + <Name Value="EAbort"/> + </Item> + <Item> + <Name Value="ECodetoolError"/> + </Item> + <Item> + <Name Value="EFOpenError"/> + </Item> + <Item> + <Name Value="ESocketError"/> + </Item> + </Exceptions> + </Debugging> +</CONFIG> Index: src/groffstudio.lps ================================================================== --- src/groffstudio.lps +++ src/groffstudio.lps @@ -6,131 +6,98 @@ <BuildModes Active="Default"/> <Units> <Unit> <Filename Value="groffstudio.lpr"/> <IsPartOfProject Value="True"/> - <IsVisibleTab Value="True"/> - <EditorIndex Value="1"/> - <CursorPos X="35" Y="4"/> - <UsageCount Value="42"/> - <Loaded Value="True"/> + <EditorIndex Value="-1"/> + <CursorPos X="60" Y="17"/> + <UsageCount Value="264"/> </Unit> <Unit> <Filename Value="unit1.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="MainForm"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="Unit1"/> - <TopLine Value="121"/> - <CursorPos X="68" Y="134"/> - <UsageCount Value="42"/> + <IsVisibleTab Value="True"/> + <TopLine Value="414"/> + <CursorPos X="23" Y="431"/> + <UsageCount Value="264"/> <Loaded Value="True"/> <LoadedDesigner Value="True"/> </Unit> <Unit> <Filename Value="helpers.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="Helpers"/> - <EditorIndex Value="3"/> + <EditorIndex Value="2"/> <TopLine Value="10"/> <CursorPos X="40" Y="42"/> - <UsageCount Value="35"/> + <UsageCount Value="257"/> <Loaded Value="True"/> </Unit> <Unit> <Filename Value="buildoutputwindow.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="BuildStatusWindow"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="BuildOutputWindow"/> - <EditorIndex Value="2"/> - <TopLine Value="49"/> + <EditorIndex Value="1"/> + <TopLine Value="61"/> <CursorPos X="39" Y="66"/> - <UsageCount Value="24"/> + <UsageCount Value="246"/> <Loaded Value="True"/> <LoadedDesigner Value="True"/> </Unit> <Unit> - <Filename Value="C:\lazarus\lcl\stdctrls.pp"/> - <UnitName Value="StdCtrls"/> + <Filename Value="..\..\..\..\..\Applications\Lazarus\lcl\lcltype.pp"/> + <UnitName Value="LCLType"/> + <EditorIndex Value="-1"/> + <TopLine Value="5"/> + <CursorPos X="42" Y="18"/> + <UsageCount Value="121"/> + </Unit> + <Unit> + <Filename Value="..\..\..\..\..\Applications\Lazarus\components\rtticontrols\rttigrids.pas"/> + <UnitName Value="RTTIGrids"/> + <EditorIndex Value="-1"/> + <TopLine Value="1234"/> + <CursorPos X="3" Y="1247"/> + <UsageCount Value="10"/> + </Unit> + <Unit> + <Filename Value="..\..\..\..\..\Applications\Lazarus\lcl\interfaces\fpgui\fpguicrosshelpers.pas"/> + <EditorIndex Value="-1"/> + <CursorPos X="5" Y="10"/> + <UsageCount Value="10"/> + </Unit> + <Unit> + <Filename Value="..\..\..\..\..\Applications\Lazarus\components\ideintf\columndlg.pp"/> + <UnitName Value="ColumnDlg"/> + <EditorIndex Value="-1"/> + <TopLine Value="417"/> + <CursorPos X="5" Y="430"/> + <UsageCount Value="10"/> + </Unit> + <Unit> + <Filename Value="..\..\..\..\..\Applications\Lazarus\components\codetools\basiccodetools.pas"/> + <UnitName Value="BasicCodeTools"/> + <EditorIndex Value="-1"/> + <TopLine Value="10"/> + <CursorPos X="65" Y="23"/> + <UsageCount Value="10"/> + </Unit> + <Unit> + <Filename Value="..\..\..\..\..\usr\local\share\fpcsrc\3.2.0\packages\fcl-net\src\sslbase.pp"/> <EditorIndex Value="-1"/> - <TopLine Value="1355"/> - <CursorPos X="3" Y="1370"/> - <UsageCount Value="9"/> + <CursorPos X="55" Y="11"/> + <UsageCount Value="10"/> </Unit> </Units> - <JumpHistory HistoryIndex="29"> - <Position> - <Filename Value="unit1.pas"/> - <Caret Line="146" Column="71" TopLine="130"/> - </Position> - <Position> - <Filename Value="unit1.pas"/> - <Caret Line="161" Column="32" TopLine="144"/> - </Position> - <Position> - <Filename Value="unit1.pas"/> - <Caret Line="313" Column="7" TopLine="281"/> - </Position> - <Position> - <Filename Value="unit1.pas"/> - <Caret Line="289" Column="23" TopLine="255"/> - </Position> - <Position> - <Filename Value="unit1.pas"/> - <Caret Line="290" Column="23" TopLine="259"/> - </Position> - <Position> - <Filename Value="unit1.pas"/> - <Caret Line="291" Column="23" TopLine="260"/> - </Position> - <Position> - <Filename Value="unit1.pas"/> - <Caret Line="292" Column="23" TopLine="261"/> - </Position> - <Position> - <Filename Value="unit1.pas"/> - <Caret Line="293" Column="23" TopLine="262"/> - </Position> - <Position> - <Filename Value="unit1.pas"/> - <Caret Line="125" Column="32" TopLine="98"/> - </Position> - <Position> - <Filename Value="unit1.pas"/> - <Caret Line="156" Column="16" TopLine="127"/> - </Position> - <Position> - <Filename Value="unit1.pas"/> - <Caret Line="315" Column="26" TopLine="298"/> - </Position> - <Position> - <Filename Value="unit1.pas"/> - <Caret Line="322" Column="26" TopLine="305"/> - </Position> - <Position> - <Filename Value="unit1.pas"/> - <Caret Line="223" Column="42" TopLine="221"/> - </Position> - <Position> - <Filename Value="unit1.pas"/> - <Caret Line="224" Column="42" TopLine="222"/> - </Position> - <Position> - <Filename Value="unit1.pas"/> - <Caret Line="227" Column="27" TopLine="210"/> - </Position> - <Position> - <Filename Value="unit1.pas"/> - <Caret Line="226" Column="27" TopLine="209"/> - </Position> - <Position> - <Filename Value="unit1.pas"/> - <Caret Line="220" Column="28" TopLine="209"/> - </Position> + <JumpHistory HistoryIndex="28"> <Position> <Filename Value="unit1.pas"/> <Caret Line="227" Column="28" TopLine="211"/> </Position> <Position> @@ -179,12 +146,76 @@ </Position> <Position> <Filename Value="buildoutputwindow.pas"/> <Caret Line="44" Column="7" TopLine="36"/> </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="227" Column="40" TopLine="207"/> + </Position> + <Position> + <Filename Value="buildoutputwindow.pas"/> + <Caret Line="66" Column="39" TopLine="49"/> + </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="106" Column="9" TopLine="90"/> + </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="29" Column="25" TopLine="21"/> + </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="221" Column="44" TopLine="208"/> + </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="222" Column="39" TopLine="221"/> + </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="29" Column="37" TopLine="13"/> + </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="221" Column="5" TopLine="219"/> + </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="114" Column="9" TopLine="89"/> + </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="430" Column="17" TopLine="409"/> + </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="241" Column="6" TopLine="219"/> + </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="196" Column="75" TopLine="175"/> + </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="230" Column="68" TopLine="209"/> + </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="274" Column="29" TopLine="252"/> + </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="196" Column="75" TopLine="184"/> + </Position> + <Position> + <Filename Value="unit1.pas"/> + <Caret Line="436" Column="48" TopLine="414"/> + </Position> </JumpHistory> <RunParams> <FormatVersion Value="2"/> <Modes ActiveMode=""/> </RunParams> </ProjectSession> </CONFIG> Index: src/unit1.lfm ================================================================== --- src/unit1.lfm +++ src/unit1.lfm @@ -1,20 +1,20 @@ object MainForm: TMainForm - Left = 1932 + Left = 819 Height = 692 Top = 147 Width = 861 Caption = 'groffstudio' ClientHeight = 692 ClientWidth = 861 OnClose = FormClose OnCreate = FormCreate - LCLVersion = '2.2.0.4' + LCLVersion = '2.3.0.0' object MainStatusBar: TStatusBar Left = 0 - Height = 23 - Top = 669 + Height = 18 + Top = 674 Width = 861 Panels = < item Text = 'file name with save status' Width = 200 @@ -39,39 +39,40 @@ Style = tsFlatButtons TabIndex = 0 TabOrder = 1 object tsEdit: TTabSheet Caption = 'edit a groff document' - ClientHeight = 631 - ClientWidth = 833 + ClientHeight = 632 + ClientWidth = 835 ParentFont = False object GroupBox1: TGroupBox Left = 10 Height = 65 - Top = 561 - Width = 813 + Top = 562 + Width = 815 Align = alBottom BorderSpacing.Left = 10 BorderSpacing.Right = 10 BorderSpacing.Bottom = 5 Caption = 'build' - ClientHeight = 45 - ClientWidth = 809 + ClientHeight = 46 + ClientWidth = 805 TabOrder = 0 object Label1: TLabel Left = 112 - Height = 15 + Height = 16 Top = -4 - Width = 72 + Width = 83 Caption = 'macro to use:' + ParentColor = False end object cmbMacro: TComboBox Left = 112 - Height = 23 + Height = 20 Top = 14 Width = 100 - ItemHeight = 15 + ItemHeight = 19 Items.Strings = ( 'man' 'me' 'mm' 'mom' @@ -79,112 +80,115 @@ ) TabOrder = 0 Text = '[ select ]' end object Label2: TLabel - Left = 686 - Height = 15 + Left = 673 + Height = 16 Top = -4 - Width = 78 + Width = 87 Anchors = [akTop, akRight] Caption = 'output format:' + ParentColor = False end object rdPs: TRadioButton - Left = 686 - Height = 19 + Left = 670 + Height = 18 Top = 14 - Width = 73 + Width = 85 Anchors = [akTop, akRight] Caption = 'PostScript' OnChange = rdPsChange TabOrder = 1 end object rdPdf: TRadioButton - Left = 766 - Height = 19 + Left = 753 + Height = 18 Top = 14 - Width = 41 + Width = 50 Anchors = [akTop, akRight] Caption = 'PDF' OnChange = rdPdfChange TabOrder = 2 end object Label3: TLabel - Left = 304 - Height = 15 + Left = 285 + Height = 16 Top = -4 - Width = 76 + Width = 91 Anchors = [akTop, akRight] Caption = 'preprocessors:' + ParentColor = False end object chkEqn: TCheckBox - Left = 360 - Height = 19 + Left = 348 + Height = 18 Top = 14 - Width = 40 + Width = 48 Anchors = [akTop, akRight] Caption = 'eqn' TabOrder = 3 end object chkPic: TCheckBox - Left = 446 - Height = 19 + Left = 434 + Height = 18 Top = 14 - Width = 36 + Width = 44 Anchors = [akTop, akRight] Caption = 'pic' TabOrder = 4 end object chkTbl: TCheckBox - Left = 534 - Height = 19 + Left = 523 + Height = 18 Top = 14 - Width = 34 + Width = 41 Anchors = [akTop, akRight] Caption = 'tbl' TabOrder = 5 end object chkGrn: TCheckBox - Left = 404 - Height = 19 + Left = 392 + Height = 18 Top = 14 - Width = 38 + Width = 46 Anchors = [akTop, akRight] Caption = 'grn' TabOrder = 6 end object chkChem: TCheckBox - Left = 304 - Height = 19 + Left = 292 + Height = 18 Top = 14 - Width = 50 + Width = 58 Anchors = [akTop, akRight] Caption = 'chem' TabOrder = 7 end object chkRefer: TCheckBox - Left = 486 - Height = 19 + Left = 473 + Height = 18 Top = 14 - Width = 44 + Width = 53 Anchors = [akTop, akRight] Caption = 'refer' TabOrder = 8 end object Label4: TLabel - Left = 587 - Height = 15 + Left = 576 + Height = 16 Top = -4 - Width = 34 + Width = 41 Anchors = [akTop, akRight] Caption = 'extras:' + ParentColor = False end object chkPdfMark: TCheckBox - Left = 587 - Height = 19 + Left = 574 + Height = 18 Top = 14 - Width = 65 + Width = 74 Anchors = [akTop, akRight] Caption = 'Pdfmark' Enabled = False TabOrder = 9 end @@ -201,59 +205,60 @@ ParentFont = False TabOrder = 10 end end object btnSaveGroff: TButton - Left = 748 + Left = 750 Height = 28 - Top = 530 + Top = 531 Width = 75 Anchors = [akRight, akBottom] Caption = 'save' Font.Style = [fsBold] OnClick = btnSaveGroffClick ParentFont = False TabOrder = 1 end object btnLoadGroff: TButton - Left = 667 + Left = 669 Height = 28 - Top = 530 + Top = 531 Width = 75 Anchors = [akRight, akBottom] Caption = 'load' Font.Style = [fsBold] OnClick = btnLoadGroffClick ParentFont = False TabOrder = 2 end object Label5: TLabel - Left = 211 - Height = 15 + Left = 142 + Height = 16 Top = 543 - Width = 438 + Width = 509 Anchors = [akRight, akBottom] Caption = 'note that everything build-related will be stored in the document''s storage directory' Font.Color = clBlue Font.Style = [fsItalic] + ParentColor = False ParentFont = False end inline SynEdit1: TSynEdit Left = 10 - Height = 523 + Height = 524 Top = 0 - Width = 813 + Width = 815 Anchors = [akTop, akLeft, akRight, akBottom] Font.CharSet = 4 Font.Height = -13 Font.Name = 'Consolas' Font.Pitch = fpFixed Font.Quality = fqCleartypeNatural ParentColor = False ParentFont = False TabOrder = 3 - Gutter.Width = 55 + Gutter.Width = 67 Gutter.MouseActions = <> RightGutter.Width = 0 RightGutter.MouseActions = <> Keystrokes = < item @@ -707,11 +712,11 @@ object SynGutterMarks1: TSynGutterMarks Width = 24 MouseActions = <> end object SynGutterLineNumber1: TSynGutterLineNumber - Width = 15 + Width = 27 MouseActions = <> MarkupInfo.Background = clBtnFace MarkupInfo.Foreground = clNone DigitCount = 2 ShowOnlyLineNumbersMultiplesOf = 1 @@ -740,75 +745,77 @@ end end end object tsSettings: TTabSheet Caption = 'groffstudio settings' - ClientHeight = 631 - ClientWidth = 833 + ClientHeight = 632 + ClientWidth = 835 object chkAutoSaveBuildSettings: TCheckBox Left = 0 - Height = 19 + Height = 18 Top = 16 - Width = 312 + Width = 342 Caption = 'Save and restore the chosen build settings for next time' TabOrder = 0 end object btnSaveSettings: TButton - Left = 744 + Left = 746 Height = 25 - Top = 600 + Top = 601 Width = 91 Anchors = [akRight, akBottom] Caption = 'save settings' OnClick = btnSaveSettingsClick TabOrder = 1 end object Label14: TLabel Left = 0 - Height = 15 + Height = 16 Top = 48 - Width = 129 + Width = 150 Caption = 'Yes, that''s all for now. :-)' + ParentColor = False end end object tsGroff: TTabSheet Caption = 'groff version' - ClientHeight = 631 - ClientWidth = 833 + ClientHeight = 632 + ClientWidth = 835 object GroupBox2: TGroupBox Left = 20 Height = 57 - Top = 566 - Width = 793 + Top = 567 + Width = 795 Align = alBottom BorderSpacing.Left = 20 BorderSpacing.Right = 20 BorderSpacing.Bottom = 8 Caption = 'groff for Windows' - ClientHeight = 37 - ClientWidth = 789 + ClientHeight = 38 + ClientWidth = 785 TabOrder = 0 object Label6: TLabel Left = 8 - Height = 15 + Height = 16 Top = 8 - Width = 108 + Width = 125 Caption = 'latest version online:' + ParentColor = False end object edtOnlineGroffVersionWindows: TEdit Left = 136 - Height = 15 + Height = 17 Top = 8 - Width = 556 + Width = 552 Anchors = [akTop, akLeft, akRight] BorderStyle = bsNone Enabled = False TabOrder = 0 Text = 'fetching ...' end object btnDownloadGroffWindows: TButton - Left = 700 + Left = 696 Height = 25 Top = 5 Width = 80 Anchors = [akTop, akRight] Caption = 'download it' @@ -816,155 +823,167 @@ TabOrder = 1 end end object Label7: TLabel Left = 8 - Height = 30 + Height = 32 Top = 8 - Width = 821 + Width = 823 Anchors = [akTop, akLeft, akRight] Caption = 'as you might guess, groffstudio requires a working installation of groff. this page performs the basic checks for you. note that on windows, everything is harder than it should. :-)' Constraints.MaxHeight = 582 + ParentColor = False WordWrap = True end object Label9: TLabel Left = 8 - Height = 15 + Height = 16 Top = 56 - Width = 70 + Width = 81 Caption = 'groff version:' + ParentColor = False end object edtGroffInstalledVersion: TEdit Left = 144 - Height = 15 + Height = 17 Top = 56 - Width = 685 + Width = 687 Anchors = [akTop, akLeft, akRight] BorderStyle = bsNone Enabled = False TabOrder = 1 end object lblTroffCommandNotFound: TLabel Left = 8 - Height = 45 + Height = 48 Top = 112 - Width = 820 + Width = 822 Anchors = [akTop, akLeft, akRight] Caption = 'groff was not found. in order to use groffstudio, you absolutely need groff in your PATH variable. on unix and unix-like systems, you''ll need to edit the $PATH variable. on windows, i warmly recommend the Rapid Environment Editor for that.'#13#10'please exit groffstudio at your nearest convenience and adjust your PATH variables. then try again.' Font.Color = clRed + ParentColor = False ParentFont = False Visible = False WordWrap = True end object edtGroffstudioInstalledVersion: TEdit Left = 144 - Height = 15 + Height = 17 Top = 77 - Width = 685 + Width = 687 Anchors = [akTop, akLeft, akRight] BorderStyle = bsNone Enabled = False TabOrder = 2 end object Label10: TLabel Left = 8 - Height = 15 + Height = 16 Top = 77 - Width = 103 + Width = 118 Caption = 'groffstudio version:' + ParentColor = False end end object tsAbout: TTabSheet Caption = 'about groffstudio' - ClientHeight = 631 - ClientWidth = 833 + ClientHeight = 632 + ClientWidth = 835 object lblAboutProductName: TLabel Left = 0 - Height = 61 + Height = 53 Top = 16 - Width = 315 + Width = 297 Caption = 'groffstudio x.y.z' Font.Color = clBlue Font.Height = -45 + ParentColor = False ParentFont = False end object Label8: TLabel Left = 20 - Height = 15 + Height = 16 Top = 80 - Width = 217 + Width = 246 Caption = 'brought to you by tux0r and contributors' + ParentColor = False end object Label11: TLabel Left = 0 - Height = 15 + Height = 16 Top = 128 - Width = 45 + Width = 53 Caption = 'Website:' Font.Style = [fsItalic] + ParentColor = False ParentFont = False end object Label12: TLabel Left = 0 - Height = 15 + Height = 16 Top = 152 - Width = 57 + Width = 69 Caption = 'Repository:' Font.Style = [fsItalic] + ParentColor = False ParentFont = False end object Label13: TLabel Left = 0 - Height = 15 + Height = 16 Top = 176 - Width = 99 + Width = 119 Caption = 'Repository (mirror):' Font.Style = [fsItalic] + ParentColor = False ParentFont = False end object mLicense: TMemo Left = 0 Height = 418 Top = 216 - Width = 840 + Width = 842 Anchors = [akTop, akLeft, akRight] ScrollBars = ssAutoBoth TabOrder = 0 end object lblWebsite: TLabel Cursor = crHandPoint Left = 120 - Height = 15 + Height = 16 Top = 128 - Width = 99 + Width = 113 Caption = 'groff.tuxproject.de' Font.Color = clBlue Font.Style = [fsUnderline] + ParentColor = False ParentFont = False OnClick = lblWebsiteClick end object lblFossilRepo: TLabel Cursor = crHandPoint Left = 120 - Height = 15 + Height = 16 Top = 152 - Width = 121 + Width = 140 Caption = 'code.rosaelefanten.org' Font.Color = clBlue Font.Style = [fsUnderline] + ParentColor = False ParentFont = False OnClick = lblFossilRepoClick end object lblGithubRepo: TLabel Cursor = crHandPoint Left = 120 - Height = 15 + Height = 16 Top = 176 - Width = 62 + Width = 68 Caption = 'github.com' Font.Color = clBlue Font.Style = [fsUnderline] + ParentColor = False ParentFont = False OnClick = lblGithubRepoClick end end end Index: src/unit1.pas ================================================================== --- src/unit1.pas +++ src/unit1.pas @@ -23,12 +23,12 @@ Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ComCtrls, StdCtrls, ExtCtrls, Buttons, ExtendedNotebook, SynEdit, fphttpclient, opensslsockets, RegExpr, LCLIntf, LCLType, IniPropStorage, Process, Helpers, fileinfo, {$IF DEFINED(WINDOWS)} winpeimagereader, - {$ELSEIF DEFINED(MACOS)} - machoreader, + {$ELSEIF DEFINED(DARWIN)} + machoreader, ssockets, sslsockets, sslbase, {$ELSEIF DEFINED(LINUX)} elfreader, {$ENDIF} BuildOutputWindow; @@ -99,17 +99,21 @@ procedure lblGithubRepoClick(Sender: TObject); procedure lblWebsiteClick(Sender: TObject); procedure rdPdfChange(Sender: TObject); procedure rdPsChange(Sender: TObject); procedure SynEdit1Change(Sender: TObject); +{$IFDEF DARWIN} + procedure GetSocketHandler(Sender: TObject; const UseSSL: Boolean; out AHandler: TSocketHandler); +{$ENDIF} private var currentGroffFilePath: String; var currentGroffFileName: String; var hasGroff: Boolean; var unsavedChanges: Boolean; +{$IFDEF WINDOWS} var latestGroffWindowsUrl: String; - +{$ENDIF} var storeBuildSettings: Boolean; public end; @@ -125,15 +129,21 @@ procedure TMainForm.FormCreate(Sender: TObject); var GroffOutputVersion: String; OnlineVersionsFile: String; - reGroffVersion, reGroffStudioVersion: TRegExpr; + {$IFDEF WINDOWS} + reGroffVersion: TRegExpr; + {$ENDIF} + reGroffStudioVersion: TRegExpr; FileVerInfo: TFileVersionInfo; HasVersionUpdate: Integer; GroffHelpers: TGroffHelpers; ResStream: TResourceStream; + {$IFDEF DARWIN} + HTTPClient: TFPHttpClient; + {$ENDIF} begin // What's the current running groff version? if RunCommand('troff', ['--version'], GroffOutputVersion) then begin edtGroffInstalledVersion.Text := GroffOutputVersion; @@ -172,19 +182,19 @@ chkPdfMark.Checked := iniStorage.ReadBoolean('BuildUsePdfMark', False); rdPs.Checked := iniStorage.ReadBoolean('BuildToPostscript', False); rdPdf.Checked := iniStorage.ReadBoolean('BuildToPDF', False); end; - {$IFDEF WINDOWS} // What's the latest available version? FileVerInfo := TFileVersionInfo.Create(nil); try FileVerInfo.ReadFileInfo; edtGroffStudioInstalledVersion.Text := FileVerInfo.VersionStrings.Values['FileVersion']; lblAboutProductName.Caption := FileVerInfo.VersionStrings.Values['ProductName'] + ' ' + FileVerInfo.VersionStrings.Values['FileVersion']; + {$IFDEF WINDOWS} OnlineVersionsFile := TFPCustomHTTPClient.SimpleGet('https://groff.tuxproject.de/updates/versions.txt'); reGroffVersion := TRegExpr.Create('groff-win ([\d\.]+) (.*)$'); reGroffVersion.ModifierM := True; if reGroffVersion.Exec(OnlineVersionsFile) then begin @@ -206,19 +216,41 @@ if HasVersionUpdate > 0 then MainStatusBar.Panels[2].Text := 'update ' + reGroffStudioVersion.Match[1] + ' available' else MainStatusBar.Panels[2].Text := IntToStr(HasVersionUpdate); end else MainStatusBar.Panels[2].Text := ''; + {$ELSE} + // Non-Windows platforms won't need some of that. + {$IFDEF DARWIN} + // What's the latest available version? + MainStatusBar.Panels[2].Text := ''; + try + HTTPClient := TFPHTTPClient.Create(Nil); + HTTPClient.OnGetSocketHandler := @GetSocketHandler; + OnlineVersionsFile := HTTPClient.SimpleGet('https://groff.tuxproject.de/updates/versions.txt'); + + reGroffStudioVersion := TRegExpr.Create('studio-macos ([\d\.]+) (.*)$'); + reGroffStudioVersion.ModifierM := True; + if reGroffStudioVersion.Exec(OnlineVersionsFile) then + begin + // Compare the two versions - ours and the online one: + GroffHelpers.VerStrCompare(reGroffStudioVersion.Match[1], FileVerInfo.VersionStrings.Values['FileVersion'], HasVersionUpdate); + if HasVersionUpdate > 0 then + MainStatusBar.Panels[2].Text := 'update ' + reGroffStudioVersion.Match[1] + ' available' + else + MainStatusBar.Panels[2].Text := IntToStr(HasVersionUpdate); + end; + finally + HTTPClient.Free; + end; + {$ENDIF} + edtOnlineGroffVersionWindows.Text := 'n/a'; + btnDownloadGroffWindows.Enabled := False; + {$ENDIF} finally FileVerInfo.Free; end; - {$ELSE} - // Non-Windows platforms won't need all that. - edtOnlineGroffVersionWindows.Text := 'n/a'; - btnDownloadGroffWindows.Enabled := False; - MainStatusBar.Panels[2].Text := ''; - {$ENDIF} // Loaded file display MainStatusBar.Panels[0].Text := ''; // Groff build status @@ -392,8 +424,19 @@ BoxStyle := MB_ICONQUESTION + MB_YESNO; Reply := MessageBox('Do you want to save the document first?', 'UnsavedChanges', BoxStyle); if Reply = IDYES then SynEdit1.Lines.SaveToFile(currentGroffFilePath); end; end; + +{$IFDEF DARWIN} +// Fix HTTPS on macOS: +procedure TMainForm.GetSocketHandler(Sender: TObject; const UseSSL: Boolean; out AHandler: TSocketHandler); +begin + if UseSSL then begin + AHandler := TSSLSocketHandler.Create; + TSSLSocketHandler(AHandler).SSLType := stTLSv1_2; + end else AHandler := TSocketHandler.Create; +end; +{$ENDIF} end.