From b6ad1a289b5a8963da79c499bf1b670566f4f957 Mon Sep 17 00:00:00 2001 From: Mbucari Date: Mon, 27 Feb 2023 15:08:37 -0700 Subject: [PATCH 1/2] Remove windows desktop runtime dependency from chardonnay --- .../LibationAvalonia/LibationAvalonia.csproj | 2 - Source/LibationUiBase/LibationUiBase.csproj | 4 + Source/LibationWinForms/FormSaveExtension.cs | 1 + .../LinuxConfigApp/LinuxConfigApp.csproj | 2 +- .../MacOSConfigApp/MacOSConfigApp.csproj | 2 +- .../LoadByOS/WindowsConfigApp/FolderIcon.cs | 106 ++++++++++++++++++ .../LoadByOS/WindowsConfigApp/WinInterop.cs | 17 ++- .../WindowsConfigApp/WindowsConfigApp.csproj | 12 +- 8 files changed, 123 insertions(+), 23 deletions(-) create mode 100644 Source/LoadByOS/WindowsConfigApp/FolderIcon.cs diff --git a/Source/LibationAvalonia/LibationAvalonia.csproj b/Source/LibationAvalonia/LibationAvalonia.csproj index 6d726f3b..a8be561c 100644 --- a/Source/LibationAvalonia/LibationAvalonia.csproj +++ b/Source/LibationAvalonia/LibationAvalonia.csproj @@ -101,8 +101,6 @@ - - diff --git a/Source/LibationUiBase/LibationUiBase.csproj b/Source/LibationUiBase/LibationUiBase.csproj index 5cbb0af1..6290198a 100644 --- a/Source/LibationUiBase/LibationUiBase.csproj +++ b/Source/LibationUiBase/LibationUiBase.csproj @@ -8,6 +8,10 @@ false + + + + diff --git a/Source/LibationWinForms/FormSaveExtension.cs b/Source/LibationWinForms/FormSaveExtension.cs index 3ab11630..227ee451 100644 --- a/Source/LibationWinForms/FormSaveExtension.cs +++ b/Source/LibationWinForms/FormSaveExtension.cs @@ -1,6 +1,7 @@ using System.Drawing; using System.Linq; using System.Windows.Forms; +using Dinah.Core.WindowsDesktop; using LibationFileManager; namespace LibationWinForms diff --git a/Source/LoadByOS/LinuxConfigApp/LinuxConfigApp.csproj b/Source/LoadByOS/LinuxConfigApp/LinuxConfigApp.csproj index b114d7cd..a28cc197 100644 --- a/Source/LoadByOS/LinuxConfigApp/LinuxConfigApp.csproj +++ b/Source/LoadByOS/LinuxConfigApp/LinuxConfigApp.csproj @@ -25,7 +25,7 @@ - + diff --git a/Source/LoadByOS/MacOSConfigApp/MacOSConfigApp.csproj b/Source/LoadByOS/MacOSConfigApp/MacOSConfigApp.csproj index 9d80ef2e..1d61b115 100644 --- a/Source/LoadByOS/MacOSConfigApp/MacOSConfigApp.csproj +++ b/Source/LoadByOS/MacOSConfigApp/MacOSConfigApp.csproj @@ -25,7 +25,7 @@ - + diff --git a/Source/LoadByOS/WindowsConfigApp/FolderIcon.cs b/Source/LoadByOS/WindowsConfigApp/FolderIcon.cs new file mode 100644 index 00000000..e35eb57c --- /dev/null +++ b/Source/LoadByOS/WindowsConfigApp/FolderIcon.cs @@ -0,0 +1,106 @@ +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.Formats.Png; +using System; +using System.IO; +using System.Runtime.InteropServices; + +namespace WindowsConfigApp +{ + internal static partial class FolderIcon + { + // https://stackoverflow.com/a/21389253 + public static byte[] ToIcon(this Image img) + { + using var ms = new MemoryStream(); + using var bw = new BinaryWriter(ms); + // Header + bw.Write((short)0); // 0-1 : reserved + bw.Write((short)1); // 2-3 : 1=ico, 2=cur + bw.Write((short)1); // 4-5 : number of images + // Image directory + var w = img.Width; + if (w >= 256) w = 0; + bw.Write((byte)w); // 0 : width of image + var h = img.Height; + if (h >= 256) h = 0; + bw.Write((byte)h); // 1 : height of image + bw.Write((byte)0); // 2 : number of colors in palette + bw.Write((byte)0); // 3 : reserved + bw.Write((short)0); // 4 : number of color planes + bw.Write((short)0); // 6 : bits per pixel + var sizeHere = ms.Position; + bw.Write((int)0); // 8 : image size + var start = (int)ms.Position + 4; + bw.Write(start); // 12: offset of image data + // Image data + img.Save(ms, new PngEncoder()); + var imageSize = (int)ms.Position - start; + ms.Seek(sizeHere, SeekOrigin.Begin); + bw.Write(imageSize); + ms.Seek(0, SeekOrigin.Begin); + + // And load it + return ms.ToArray(); + } + + public static void DeleteIcon(this DirectoryInfo directoryInfo) => DeleteIcon(directoryInfo.FullName); + public static void DeleteIcon(string dir) + { + string[] array = new string[3] { "desktop.ini", "Icon.ico", ".hidden" }; + foreach (string path in array) + { + string text = Path.Combine(dir, path); + if (File.Exists(text)) + { + File.SetAttributes(text, File.GetAttributes(text) | FileAttributes.Normal); + new FileInfo(text).IsReadOnly = false; + File.Delete(text); + } + } + + refresh(); + } + + // https://github.com/dimuththarindu/FIC-Folder-Icon-Changer/blob/master/project/FIC/Classes/IconCustomizer.cs + + public static void SetIcon(this DirectoryInfo directoryInfo, string icoPath, string folderType) + => SetIcon(directoryInfo.FullName, icoPath, folderType); + + public static void SetIcon(string dir, string icoPath, string folderType) + { + var desktop_ini = Path.Combine(dir, "desktop.ini"); + var Icon_ico = Path.Combine(dir, "Icon.ico"); + var hidden = Path.Combine(dir, ".hidden"); + + //deleting existing files + DeleteIcon(dir); + + //copying Icon file //overwriting + File.Copy(icoPath, Icon_ico, true); + + //writing configuration file + string[] desktopLines = { "[.ShellClassInfo]", "IconResource=Icon.ico,0", "[ViewState]", "Mode=", "Vid=", $"FolderType={folderType}" }; + File.WriteAllLines(desktop_ini, desktopLines); + + //configure file 2 + string[] hiddenLines = { "desktop.ini", "Icon.ico" }; + File.WriteAllLines(hidden, hiddenLines); + + //making system files + File.SetAttributes(desktop_ini, File.GetAttributes(desktop_ini) | FileAttributes.Hidden | FileAttributes.System | FileAttributes.ReadOnly); + File.SetAttributes(Icon_ico, File.GetAttributes(Icon_ico) | FileAttributes.Hidden | FileAttributes.System | FileAttributes.ReadOnly); + File.SetAttributes(hidden, File.GetAttributes(hidden) | FileAttributes.Hidden | FileAttributes.System | FileAttributes.ReadOnly); + + // this strangely completes the process. also hides these 3 hidden system files, even if "show hidden items" is checked + File.SetAttributes(dir, File.GetAttributes(dir) | FileAttributes.ReadOnly); + + refresh(); + } + + private static void refresh() => SHChangeNotify(0x08000000, 0x0000, 0, 0); //SHCNE_ASSOCCHANGED SHCNF_IDLIST + + + [DllImport("shell32.dll", SetLastError = true)] + private static extern void SHChangeNotify(int wEventId, int uFlags, nint dwItem1, nint dwItem2); + } +} diff --git a/Source/LoadByOS/WindowsConfigApp/WinInterop.cs b/Source/LoadByOS/WindowsConfigApp/WinInterop.cs index 42cded34..76972c06 100644 --- a/Source/LoadByOS/WindowsConfigApp/WinInterop.cs +++ b/Source/LoadByOS/WindowsConfigApp/WinInterop.cs @@ -1,12 +1,8 @@ -using System; -using System.Collections.Generic; +using SixLabors.ImageSharp; using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using Dinah.Core.WindowsDesktop; -using Dinah.Core.WindowsDesktop.Drawing; using LibationFileManager; +using System.IO; +using System; namespace WindowsConfigApp { @@ -21,11 +17,11 @@ namespace WindowsConfigApp try { - var icon = ImageReader.ToIcon(image); + var icon = Image.Load(File.ReadAllBytes(image)).ToIcon(); iconPath = Path.Combine(directory, $"{Guid.NewGuid()}.ico"); - icon.Save(iconPath); + File.WriteAllBytes(iconPath, icon); - new DirectoryInfo(directory).SetIcon(iconPath, Directories.FolderTypes.Music); + new DirectoryInfo(directory)?.SetIcon(iconPath, "Music"); } finally { @@ -36,6 +32,7 @@ namespace WindowsConfigApp public void DeleteFolderIcon(string directory) => new DirectoryInfo(directory)?.DeleteIcon(); + public bool CanUpdate => true; public void InstallUpdate(string updateBundle) { diff --git a/Source/LoadByOS/WindowsConfigApp/WindowsConfigApp.csproj b/Source/LoadByOS/WindowsConfigApp/WindowsConfigApp.csproj index d547a2d4..a34a143b 100644 --- a/Source/LoadByOS/WindowsConfigApp/WindowsConfigApp.csproj +++ b/Source/LoadByOS/WindowsConfigApp/WindowsConfigApp.csproj @@ -2,10 +2,8 @@ WinExe - net7.0-windows + net7.0 true - true - enable true false false @@ -16,7 +14,7 @@ - ..\..\bin\Debug + ..\..\bin\Avalonia\Debug embedded @@ -26,11 +24,7 @@ - - - - - + From bce4437c79dbc97c4bcb6ab8ec793f2aa5746f14 Mon Sep 17 00:00:00 2001 From: Mbucari Date: Mon, 27 Feb 2023 16:18:48 -0700 Subject: [PATCH 2/2] Change workflows --- .github/workflows/build-linux.yml | 39 ++++++++++++++++--------------- Scripts/Bundle_MacOS.sh | 5 +++- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/.github/workflows/build-linux.yml b/.github/workflows/build-linux.yml index 56d1b219..3f3a8fd0 100644 --- a/.github/workflows/build-linux.yml +++ b/.github/workflows/build-linux.yml @@ -23,10 +23,10 @@ env: jobs: build: - runs-on: ubuntu-latest + runs-on: ${{ matrix.os }} strategy: matrix: - os: [Linux, MacOS] + os: [ubuntu-latest, macos-latest] arch: [x64, arm64] steps: - uses: actions/checkout@v3 @@ -45,62 +45,63 @@ jobs: then version="${inputVersion}" else - version="$(grep -oP '(?<=).*(?=> "${GITHUB_OUTPUT}" - - name: Unit test if: ${{ inputs.run_unit_tests }} working-directory: ./Source run: dotnet test - name: Publish + id: publish working-directory: ./Source run: | os=${{ matrix.os }} - RUNTIME_IDENTIFIER="$(echo ${os,} | sed 's/macOS/osx/')-${{ matrix.arch }}" + target_os="$(echo ${os/-latest/} | sed 's/ubuntu/linux/')" + display_os="$(echo ${target_os/macos/macOS} | sed 's/linux/Linux/')" + echo "display_os=${display_os}" >> $GITHUB_OUTPUT + RUNTIME_IDENTIFIER="$(echo ${target_os/macos/osx})-${{ matrix.arch }}" echo "$RUNTIME_IDENTIFIER" dotnet publish \ LibationAvalonia/LibationAvalonia.csproj \ --runtime "$RUNTIME_IDENTIFIER" \ --configuration ${{ env.DOTNET_CONFIGURATION }} \ - --output bin/Publish/${{ matrix.os }}-${{ matrix.arch }}-${{ env.RELEASE_NAME }} \ - -p:PublishProfile=LibationAvalonia/Properties/PublishProfiles/${{ matrix.os }}Profile.pubxml + --output bin/Publish/${display_os}-${{ matrix.arch }}-${{ env.RELEASE_NAME }} \ + -p:PublishProfile=LibationAvalonia/Properties/PublishProfiles/${display_os}Profile.pubxml dotnet publish \ - LoadByOS/${{ matrix.os }}ConfigApp/${{ matrix.os }}ConfigApp.csproj \ + LoadByOS/${display_os}ConfigApp/${display_os}ConfigApp.csproj \ --runtime "$RUNTIME_IDENTIFIER" \ --configuration ${{ env.DOTNET_CONFIGURATION }} \ - --output bin/Publish/${{ matrix.os }}-${{ matrix.arch }}-${{ env.RELEASE_NAME }} \ - -p:PublishProfile=LoadByOS/Properties/${{ matrix.os }}ConfigApp/PublishProfiles/${{ matrix.os }}Profile.pubxml + --output bin/Publish/${display_os}-${{ matrix.arch }}-${{ env.RELEASE_NAME }} \ + -p:PublishProfile=LoadByOS/Properties/${display_os}ConfigApp/PublishProfiles/${display_os}Profile.pubxml dotnet publish \ LibationCli/LibationCli.csproj \ --runtime "$RUNTIME_IDENTIFIER" \ --configuration ${{ env.DOTNET_CONFIGURATION }} \ - --output bin/Publish/${{ matrix.os }}-${{ matrix.arch }}-${{ env.RELEASE_NAME }} \ - -p:PublishProfile=LibationCli/Properties/PublishProfiles/${{ matrix.os }}Profile.pubxml + --output bin/Publish/${display_os}-${{ matrix.arch }}-${{ env.RELEASE_NAME }} \ + -p:PublishProfile=LibationCli/Properties/PublishProfiles/${display_os}Profile.pubxml dotnet publish \ HangoverAvalonia/HangoverAvalonia.csproj \ --runtime "$RUNTIME_IDENTIFIER" \ --configuration ${{ env.DOTNET_CONFIGURATION }} \ - --output bin/Publish/${{ matrix.os }}-${{ matrix.arch }}-${{ env.RELEASE_NAME }} \ - -p:PublishProfile=HangoverAvalonia/Properties/PublishProfiles/${{ matrix.os }}Profile.pubxml - + --output bin/Publish/${display_os}-${{ matrix.arch }}-${{ env.RELEASE_NAME }} \ + -p:PublishProfile=HangoverAvalonia/Properties/PublishProfiles/${display_os}Profile.pubxml - name: Build bundle id: bundle - working-directory: ./Source/bin/Publish/${{ matrix.os }}-${{ matrix.arch }}-${{ env.RELEASE_NAME }} + working-directory: ./Source/bin/Publish/${{ steps.publish.outputs.display_os }}-${{ matrix.arch }}-${{ env.RELEASE_NAME }} run: | BUNDLE_DIR=$(pwd) echo "Bundle dir: ${BUNDLE_DIR}" cd .. - SCRIPT=../../../Scripts/Bundle_${{ matrix.os }}.sh + SCRIPT=../../../Scripts/Bundle_${{ steps.publish.outputs.display_os }}.sh chmod +rx ${SCRIPT} ${SCRIPT} "${BUNDLE_DIR}" "${{ steps.get_version.outputs.version }}" "${{ matrix.arch }}" artifact=$(ls ./bundle) echo "artifact=${artifact}" >> "${GITHUB_OUTPUT}" - - name: Publish bundle uses: actions/upload-artifact@v3 with: name: ${{ steps.bundle.outputs.artifact }} path: ./Source/bin/Publish/bundle/${{ steps.bundle.outputs.artifact }} - if-no-files-found: error + if-no-files-found: error \ No newline at end of file diff --git a/Scripts/Bundle_MacOS.sh b/Scripts/Bundle_MacOS.sh index d9bd31b9..57bc60e1 100644 --- a/Scripts/Bundle_MacOS.sh +++ b/Scripts/Bundle_MacOS.sh @@ -96,6 +96,9 @@ done APP_FILE=Libation.${VERSION}-macOS-chardonnay-${ARCH}.tgz +echo "Signing executables in: $BUNDLE" +codesign --force --deep -s - $BUNDLE + echo "Creating app bundle: $APP_FILE" tar -czvf $APP_FILE $BUNDLE @@ -105,4 +108,4 @@ mv $APP_FILE ./bundle/$APP_FILE rm -r $BUNDLE -echo "Done!" +echo "Done!" \ No newline at end of file