diff --git a/.github/workflows/dotnet-desktop.yml b/.github/workflows/dotnet-desktop.yml
new file mode 100644
index 0000000..6108d9b
--- /dev/null
+++ b/.github/workflows/dotnet-desktop.yml
@@ -0,0 +1,101 @@
+# This workflow uses actions that are not certified by GitHub.
+# They are provided by a third-party and are governed by
+# separate terms of service, privacy policy, and support
+# documentation.
+
+# This workflow will build, test, sign and package a WPF or Windows Forms desktop application
+# built on .NET Core.
+# To learn how to migrate your existing application to .NET Core,
+# refer to https://docs.microsoft.com/en-us/dotnet/desktop-wpf/migration/convert-project-from-net-framework
+#
+# To configure this workflow:
+#
+# 1. Configure environment variables
+# GitHub sets default environment variables for every workflow run.
+# Replace the variables relative to your project in the "env" section below.
+#
+# 2. Signing
+# Generate a signing certificate in the Windows Application
+# Packaging Project or add an existing signing certificate to the project.
+# Next, use PowerShell to encode the .pfx file using Base64 encoding
+# by running the following Powershell script to generate the output string:
+#
+# $pfx_cert = Get-Content '.\SigningCertificate.pfx' -Encoding Byte
+# [System.Convert]::ToBase64String($pfx_cert) | Out-File 'SigningCertificate_Encoded.txt'
+#
+# Open the output file, SigningCertificate_Encoded.txt, and copy the
+# string inside. Then, add the string to the repo as a GitHub secret
+# and name it "Base64_Encoded_Pfx."
+# For more information on how to configure your signing certificate for
+# this workflow, refer to https://github.com/microsoft/github-actions-for-desktop-apps#signing
+#
+# Finally, add the signing certificate password to the repo as a secret and name it "Pfx_Key".
+# See "Build the Windows Application Packaging project" below to see how the secret is used.
+#
+# For more information on GitHub Actions, refer to https://github.com/features/actions
+# For a complete CI/CD sample to get started with GitHub Action workflows for Desktop Applications,
+# refer to https://github.com/microsoft/github-actions-for-desktop-apps
+
+name: CI/CD develop-v2 branch
+
+on:
+ push:
+ branches: [ "develop-v2" ]
+ pull_request:
+ branches: [ "develop-v2" ]
+
+jobs:
+
+ build:
+
+ strategy:
+ matrix:
+ configuration: [Debug, Release]
+
+ runs-on: windows-latest # For a list of available runner types, refer to
+ # https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idruns-on
+
+ env:
+ Solution_Name: GoAwayEdge.sln
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+ # Install the .NET Core workload
+ - name: Install .NET Core
+ uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: 8.0.x
+
+ # Add MSBuild to the PATH: https://github.com/microsoft/setup-msbuild
+ - name: Setup MSBuild.exe
+ uses: microsoft/setup-msbuild@v2
+
+ # Restore the application to populate the obj folder with RuntimeIdentifiers
+ - name: Restore the application
+ run: msbuild $env:Solution_Name /t:Restore /p:Configuration=$env:Configuration
+ env:
+ Configuration: ${{ matrix.configuration }}
+
+ # Get Git Hash
+ - name: Get Git Hash
+ id: vars
+ run: |
+ echo "sha_short=$(git rev-parse --short HEAD)" >> $env:GITHUB_OUTPUT
+ echo Short SHA: ${{ steps.vars.outputs.sha_short }}
+
+ # Build app
+ - name: Build GoAwayEdge (Release)
+ run: msbuild $env:Solution_Name /t:Restore /t:Build,Publish /p:Configuration=$env:Configuration /p:InformationalVersion=${{ steps.vars.outputs.sha_short }} /p:OutputPath=..\publish\
+ env:
+ Configuration: ${{ matrix.configuration }}
+
+ # Upload builds
+ - name: Upload build artifacts
+ uses: actions/upload-artifact@v4
+ with:
+ name: GoAwayEdge ${{ matrix.configuration }}
+ path: publish\publish\*.exe
\ No newline at end of file
diff --git a/GoAwayEdge.Helper.Package/GoAwayEdge.Helper.Package.assets.cache b/GoAwayEdge.Helper.Package/GoAwayEdge.Helper.Package.assets.cache
new file mode 100644
index 0000000..ac9ed90
Binary files /dev/null and b/GoAwayEdge.Helper.Package/GoAwayEdge.Helper.Package.assets.cache differ
diff --git a/GoAwayEdge.Helper.Package/GoAwayEdge.Helper.Package.wapproj b/GoAwayEdge.Helper.Package/GoAwayEdge.Helper.Package.wapproj
new file mode 100644
index 0000000..44f45b1
--- /dev/null
+++ b/GoAwayEdge.Helper.Package/GoAwayEdge.Helper.Package.wapproj
@@ -0,0 +1,180 @@
+
+
+
+ 15.0
+
+
+
+ Debug
+ x86
+
+
+ Release
+ x86
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+ Debug
+ ARM
+
+
+ Release
+ ARM
+
+
+ Debug
+ ARM64
+
+
+ Release
+ ARM64
+
+
+ Debug
+ AnyCPU
+
+
+ Release
+ AnyCPU
+
+
+
+ $(MSBuildExtensionsPath)\Microsoft\DesktopBridge\
+
+
+
+ 6b1c2331-6097-4559-9d50-62d3e906e2e6
+ 10.0.26100.0
+ 10.0.14393.0
+ de-DE
+ True
+ $(NoWarn);NU1702
+ E302D41D12FF036DBD37FA03D5C85F376EDF659B
+ ..\GoAwayEdge.Helper\GoAwayEdge.Helper.csproj
+ False
+ http://timestamp.digicert.com
+ SHA256
+ False
+ False
+ True
+ x64|arm64
+ 0
+
+
+ en-US
+ Always
+
+
+ en-US
+ Always
+
+
+ en-US
+ Always
+
+
+ en-US
+ Always
+
+
+ en-US
+ Always
+
+
+ en-US
+ Always
+
+
+ en-US
+ Always
+
+
+ en-US
+ Always
+
+
+ en-US
+ Always
+
+
+ en-US
+ Always
+
+
+
+ Designer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/GoAwayEdge.Helper.Package/GoAwayEdge.Helper.Package.wapproj.user b/GoAwayEdge.Helper.Package/GoAwayEdge.Helper.Package.wapproj.user
new file mode 100644
index 0000000..b3cb3d6
--- /dev/null
+++ b/GoAwayEdge.Helper.Package/GoAwayEdge.Helper.Package.wapproj.user
@@ -0,0 +1,18 @@
+
+
+
+ C:\Users\jonas\Pictures\GoAwayEdge.png
+ C:\Users\jonas\Pictures\GoAwayEdge.png
+ C:\Users\jonas\Pictures\GoAwayEdge.png
+ C:\Users\jonas\Pictures\GoAwayEdge.png
+ C:\Users\jonas\Pictures\GoAwayEdge.png
+ C:\Users\jonas\Pictures\GoAwayEdge.png
+ C:\Users\jonas\Pictures\GoAwayEdge.png
+ C:\Users\jonas\Pictures\GoAwayEdge.png
+ C:\Users\jonas\Pictures\GoAwayEdge.png
+ SideloadOnly
+ False
+ x64|arm64
+ False
+
+
\ No newline at end of file
diff --git a/GoAwayEdge.Helper.Package/Images/BadgeLogo.scale-100.png b/GoAwayEdge.Helper.Package/Images/BadgeLogo.scale-100.png
new file mode 100644
index 0000000..9e02d3d
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/BadgeLogo.scale-100.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/BadgeLogo.scale-125.png b/GoAwayEdge.Helper.Package/Images/BadgeLogo.scale-125.png
new file mode 100644
index 0000000..6ed111a
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/BadgeLogo.scale-125.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/BadgeLogo.scale-150.png b/GoAwayEdge.Helper.Package/Images/BadgeLogo.scale-150.png
new file mode 100644
index 0000000..8b51e16
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/BadgeLogo.scale-150.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/BadgeLogo.scale-200.png b/GoAwayEdge.Helper.Package/Images/BadgeLogo.scale-200.png
new file mode 100644
index 0000000..d7175db
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/BadgeLogo.scale-200.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/BadgeLogo.scale-400.png b/GoAwayEdge.Helper.Package/Images/BadgeLogo.scale-400.png
new file mode 100644
index 0000000..7a26f49
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/BadgeLogo.scale-400.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/LargeTile.scale-100.png b/GoAwayEdge.Helper.Package/Images/LargeTile.scale-100.png
new file mode 100644
index 0000000..a1de9a3
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/LargeTile.scale-100.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/LargeTile.scale-125.png b/GoAwayEdge.Helper.Package/Images/LargeTile.scale-125.png
new file mode 100644
index 0000000..f103ecc
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/LargeTile.scale-125.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/LargeTile.scale-150.png b/GoAwayEdge.Helper.Package/Images/LargeTile.scale-150.png
new file mode 100644
index 0000000..2a92acb
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/LargeTile.scale-150.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/LargeTile.scale-200.png b/GoAwayEdge.Helper.Package/Images/LargeTile.scale-200.png
new file mode 100644
index 0000000..ac8a0ea
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/LargeTile.scale-200.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/LargeTile.scale-400.png b/GoAwayEdge.Helper.Package/Images/LargeTile.scale-400.png
new file mode 100644
index 0000000..adb6d1d
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/LargeTile.scale-400.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/LockScreenLogo.scale-200.png b/GoAwayEdge.Helper.Package/Images/LockScreenLogo.scale-200.png
new file mode 100644
index 0000000..735f57a
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/LockScreenLogo.scale-200.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/SmallTile.scale-100.png b/GoAwayEdge.Helper.Package/Images/SmallTile.scale-100.png
new file mode 100644
index 0000000..63ed1b4
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/SmallTile.scale-100.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/SmallTile.scale-125.png b/GoAwayEdge.Helper.Package/Images/SmallTile.scale-125.png
new file mode 100644
index 0000000..e1f0378
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/SmallTile.scale-125.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/SmallTile.scale-150.png b/GoAwayEdge.Helper.Package/Images/SmallTile.scale-150.png
new file mode 100644
index 0000000..2c14b2a
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/SmallTile.scale-150.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/SmallTile.scale-200.png b/GoAwayEdge.Helper.Package/Images/SmallTile.scale-200.png
new file mode 100644
index 0000000..df56d53
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/SmallTile.scale-200.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/SmallTile.scale-400.png b/GoAwayEdge.Helper.Package/Images/SmallTile.scale-400.png
new file mode 100644
index 0000000..4a57beb
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/SmallTile.scale-400.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/SplashScreen.scale-100.png b/GoAwayEdge.Helper.Package/Images/SplashScreen.scale-100.png
new file mode 100644
index 0000000..1ef491d
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/SplashScreen.scale-100.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/SplashScreen.scale-125.png b/GoAwayEdge.Helper.Package/Images/SplashScreen.scale-125.png
new file mode 100644
index 0000000..dd3c95c
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/SplashScreen.scale-125.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/SplashScreen.scale-150.png b/GoAwayEdge.Helper.Package/Images/SplashScreen.scale-150.png
new file mode 100644
index 0000000..b8d0206
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/SplashScreen.scale-150.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/SplashScreen.scale-200.png b/GoAwayEdge.Helper.Package/Images/SplashScreen.scale-200.png
new file mode 100644
index 0000000..27ffbe8
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/SplashScreen.scale-200.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/SplashScreen.scale-400.png b/GoAwayEdge.Helper.Package/Images/SplashScreen.scale-400.png
new file mode 100644
index 0000000..6131711
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/SplashScreen.scale-400.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/Square150x150Logo.scale-100.png b/GoAwayEdge.Helper.Package/Images/Square150x150Logo.scale-100.png
new file mode 100644
index 0000000..3469b02
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/Square150x150Logo.scale-100.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/Square150x150Logo.scale-125.png b/GoAwayEdge.Helper.Package/Images/Square150x150Logo.scale-125.png
new file mode 100644
index 0000000..1632d2b
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/Square150x150Logo.scale-125.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/Square150x150Logo.scale-150.png b/GoAwayEdge.Helper.Package/Images/Square150x150Logo.scale-150.png
new file mode 100644
index 0000000..ced5999
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/Square150x150Logo.scale-150.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/Square150x150Logo.scale-200.png b/GoAwayEdge.Helper.Package/Images/Square150x150Logo.scale-200.png
new file mode 100644
index 0000000..72add25
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/Square150x150Logo.scale-200.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/Square150x150Logo.scale-400.png b/GoAwayEdge.Helper.Package/Images/Square150x150Logo.scale-400.png
new file mode 100644
index 0000000..9bb46a3
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/Square150x150Logo.scale-400.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/Square44x44Logo.altform-lightunplated_targetsize-16.png b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.altform-lightunplated_targetsize-16.png
new file mode 100644
index 0000000..935f3b2
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.altform-lightunplated_targetsize-16.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/Square44x44Logo.altform-lightunplated_targetsize-24.png b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.altform-lightunplated_targetsize-24.png
new file mode 100644
index 0000000..cb2f2d5
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.altform-lightunplated_targetsize-24.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/Square44x44Logo.altform-lightunplated_targetsize-256.png b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.altform-lightunplated_targetsize-256.png
new file mode 100644
index 0000000..474e3ee
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.altform-lightunplated_targetsize-256.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/Square44x44Logo.altform-lightunplated_targetsize-32.png b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.altform-lightunplated_targetsize-32.png
new file mode 100644
index 0000000..74fb847
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.altform-lightunplated_targetsize-32.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/Square44x44Logo.altform-lightunplated_targetsize-48.png b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.altform-lightunplated_targetsize-48.png
new file mode 100644
index 0000000..c0458f4
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.altform-lightunplated_targetsize-48.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/Square44x44Logo.altform-unplated_targetsize-16.png b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.altform-unplated_targetsize-16.png
new file mode 100644
index 0000000..935f3b2
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.altform-unplated_targetsize-16.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/Square44x44Logo.altform-unplated_targetsize-256.png b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.altform-unplated_targetsize-256.png
new file mode 100644
index 0000000..474e3ee
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.altform-unplated_targetsize-256.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/Square44x44Logo.altform-unplated_targetsize-32.png b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.altform-unplated_targetsize-32.png
new file mode 100644
index 0000000..74fb847
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.altform-unplated_targetsize-32.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/Square44x44Logo.altform-unplated_targetsize-48.png b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.altform-unplated_targetsize-48.png
new file mode 100644
index 0000000..c0458f4
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.altform-unplated_targetsize-48.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/Square44x44Logo.scale-100.png b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.scale-100.png
new file mode 100644
index 0000000..9164c71
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.scale-100.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/Square44x44Logo.scale-125.png b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.scale-125.png
new file mode 100644
index 0000000..03d15b4
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.scale-125.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/Square44x44Logo.scale-150.png b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.scale-150.png
new file mode 100644
index 0000000..cbe24e7
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.scale-150.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/Square44x44Logo.scale-200.png b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.scale-200.png
new file mode 100644
index 0000000..5165244
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.scale-200.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/Square44x44Logo.scale-400.png b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.scale-400.png
new file mode 100644
index 0000000..be75f30
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.scale-400.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/Square44x44Logo.targetsize-16.png b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.targetsize-16.png
new file mode 100644
index 0000000..c21a652
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.targetsize-16.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/Square44x44Logo.targetsize-24.png b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.targetsize-24.png
new file mode 100644
index 0000000..6884052
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.targetsize-24.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/Square44x44Logo.targetsize-24_altform-unplated.png b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.targetsize-24_altform-unplated.png
new file mode 100644
index 0000000..cb2f2d5
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.targetsize-24_altform-unplated.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/Square44x44Logo.targetsize-256.png b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.targetsize-256.png
new file mode 100644
index 0000000..d2d5a20
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.targetsize-256.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/Square44x44Logo.targetsize-32.png b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.targetsize-32.png
new file mode 100644
index 0000000..9dd0999
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.targetsize-32.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/Square44x44Logo.targetsize-48.png b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.targetsize-48.png
new file mode 100644
index 0000000..c306901
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/Square44x44Logo.targetsize-48.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/StoreLogo.backup.png b/GoAwayEdge.Helper.Package/Images/StoreLogo.backup.png
new file mode 100644
index 0000000..7385b56
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/StoreLogo.backup.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/StoreLogo.scale-100.png b/GoAwayEdge.Helper.Package/Images/StoreLogo.scale-100.png
new file mode 100644
index 0000000..ea7aea1
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/StoreLogo.scale-100.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/StoreLogo.scale-125.png b/GoAwayEdge.Helper.Package/Images/StoreLogo.scale-125.png
new file mode 100644
index 0000000..07c8bfe
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/StoreLogo.scale-125.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/StoreLogo.scale-150.png b/GoAwayEdge.Helper.Package/Images/StoreLogo.scale-150.png
new file mode 100644
index 0000000..28dc1c5
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/StoreLogo.scale-150.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/StoreLogo.scale-200.png b/GoAwayEdge.Helper.Package/Images/StoreLogo.scale-200.png
new file mode 100644
index 0000000..4321d0f
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/StoreLogo.scale-200.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/StoreLogo.scale-400.png b/GoAwayEdge.Helper.Package/Images/StoreLogo.scale-400.png
new file mode 100644
index 0000000..31a8921
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/StoreLogo.scale-400.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/Wide310x150Logo.scale-100.png b/GoAwayEdge.Helper.Package/Images/Wide310x150Logo.scale-100.png
new file mode 100644
index 0000000..82ecdcf
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/Wide310x150Logo.scale-100.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/Wide310x150Logo.scale-125.png b/GoAwayEdge.Helper.Package/Images/Wide310x150Logo.scale-125.png
new file mode 100644
index 0000000..2fcbce2
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/Wide310x150Logo.scale-125.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/Wide310x150Logo.scale-150.png b/GoAwayEdge.Helper.Package/Images/Wide310x150Logo.scale-150.png
new file mode 100644
index 0000000..ba7a0e2
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/Wide310x150Logo.scale-150.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/Wide310x150Logo.scale-200.png b/GoAwayEdge.Helper.Package/Images/Wide310x150Logo.scale-200.png
new file mode 100644
index 0000000..1ef491d
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/Wide310x150Logo.scale-200.png differ
diff --git a/GoAwayEdge.Helper.Package/Images/Wide310x150Logo.scale-400.png b/GoAwayEdge.Helper.Package/Images/Wide310x150Logo.scale-400.png
new file mode 100644
index 0000000..27ffbe8
Binary files /dev/null and b/GoAwayEdge.Helper.Package/Images/Wide310x150Logo.scale-400.png differ
diff --git a/GoAwayEdge.Helper.Package/Package.appxmanifest b/GoAwayEdge.Helper.Package/Package.appxmanifest
new file mode 100644
index 0000000..a7c7ead
--- /dev/null
+++ b/GoAwayEdge.Helper.Package/Package.appxmanifest
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+ GoAwayEdge Helper
+ Jonas Günner
+ Images\StoreLogo.png
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/GoAwayEdge.Helper/Common/Configuration.cs b/GoAwayEdge.Helper/Common/Configuration.cs
new file mode 100644
index 0000000..1144d6d
--- /dev/null
+++ b/GoAwayEdge.Helper/Common/Configuration.cs
@@ -0,0 +1,98 @@
+using GoAwayEdge.Helper.Common.Debugging;
+using Microsoft.Win32;
+
+namespace GoAwayEdge.Helper.Common
+{
+ internal class Configuration
+ {
+ public static string? CopilotExternalApp { get; set; }
+ public static string? CopilotExternalAppArgument { get; set; }
+
+ ///
+ /// Initialize the current environment.
+ ///
+ ///
+ /// Boolean status of the initialization.
+ ///
+ public static bool InitialEnvironment(bool setupRunning = false)
+ {
+ // Check if Edge is installed
+ try
+ {
+ Logging.Log("Initialize environment ...");
+ Logging.Log("Fetching settings from registry ...");
+
+ try
+ {
+ CopilotExternalApp = RegistryConfig.GetKey("ExternalApp", userSetting: true);
+ CopilotExternalAppArgument = RegistryConfig.GetKey("ExternalAppArgs", userSetting: true);
+ }
+ catch (Exception ex)
+ {
+ Logging.Log("An error has occurred while reading the registry: " + ex.Message, Logging.LogLevel.ERROR);
+ }
+ Logging.Log($"Value of CopilotExternalApp: {CopilotExternalApp}");
+ Logging.Log($"Value of CopilotExternalAppArgument: {CopilotExternalAppArgument}");
+ return true;
+ }
+ catch (Exception ex)
+ {
+ Logging.Log($"Error while initializing environment: {ex.Message}", Logging.LogLevel.ERROR);
+ return false;
+ }
+ }
+ }
+
+ public class RegistryConfig
+ {
+ private const string Company = "valnoxy";
+ private const string Product = "GoAwayEdge";
+ private const string RegistryPath = @$"SOFTWARE\{Company}\{Product}";
+ public const string UninstallGuid = "{DC021E0D-1809-4102-8888-506D3121F1E9}";
+ private const string UninstallRegistryPath = @$"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{UninstallGuid}";
+
+ ///
+ /// Retrieves the value of a key from the Registry.
+ ///
+ /// Name of the key.
+ /// Use the Uninstall Registry key instead.
+ /// Use the CurrentUser Registry key instead.
+ /// The value of the key if it exists, otherwise null.
+ public static string GetKey(string option, bool isUninstall = false, bool userSetting = false)
+ {
+ try
+ {
+ RegistryKey? key;
+ if (userSetting)
+ {
+ key = Registry.CurrentUser.OpenSubKey(RegistryPath);
+ }
+ else if (isUninstall)
+ {
+ key = Registry.LocalMachine.OpenSubKey(UninstallRegistryPath);
+ }
+ else
+ {
+ key = Registry.LocalMachine.OpenSubKey(RegistryPath);
+ }
+ if (key != null)
+ {
+ var value = key.GetValue(option);
+ if (value != null)
+ {
+ return value.ToString()!;
+ }
+ Logging.Log($"Value for key '{option}' not found in the registry.", Logging.LogLevel.ERROR);
+ return "";
+ }
+ }
+ catch (Exception ex)
+ {
+ Logging.Log($"An error has occurred while reading the registry: {ex.Message}", Logging.LogLevel.ERROR);
+ return "";
+ }
+ Logging.Log($"Registry key '{RegistryPath}' not found.", Logging.LogLevel.ERROR);
+ return "";
+ }
+ }
+}
diff --git a/GoAwayEdge/Common/Logging.cs b/GoAwayEdge.Helper/Common/Debugging/Logging.cs
similarity index 57%
rename from GoAwayEdge/Common/Logging.cs
rename to GoAwayEdge.Helper/Common/Debugging/Logging.cs
index 24f0428..ee0352e 100644
--- a/GoAwayEdge/Common/Logging.cs
+++ b/GoAwayEdge.Helper/Common/Debugging/Logging.cs
@@ -14,14 +14,14 @@
* Backported from: https://git.heydu.net/valnoxy/xorieos/-/blob/main/srv03rtm/base/ntsetup/winnt32/modernsetup/common/logging.cs
*/
-using System.IO;
+using System.Diagnostics;
using System.Reflection;
-namespace GoAwayEdge.Common
-{
+namespace GoAwayEdge.Helper.Common.Debugging
+{
internal class Logging
{
- private static string LogPath = Path.Combine(Path.GetTempPath(), "GoAwayEdge", "Logs");
+ private static readonly string LogPath = Path.Combine(Path.GetTempPath(), "GoAwayEdge", "Logs");
private static string? _logFile;
internal enum LogLevel { INFO, ERROR, WARNING }
@@ -35,11 +35,11 @@ public static void Initialize()
}
// Fetching the current log file
- _logFile = Path.Combine(LogPath, $"log_{DateTime.Now:yyyy-MM-dd}.txt");
+ _logFile = Path.Combine(LogPath, $"helper_log_{DateTime.Now:yyyy-MM-dd}.txt");
if (!File.Exists(_logFile))
{
var version = Assembly.GetExecutingAssembly().GetName().Version!;
- Log($"GoAwayEdge {version.Major}.{version.Minor}.{version.Build} (Build {version.Revision})");
+ Log($"GoAwayEdge Helper {version.Major}.{version.Minor}.{version.Build} (Build {version.Revision})");
Log("Logging system initialized");
}
@@ -49,10 +49,26 @@ public static void Initialize()
public static void Log(string message, LogLevel level = LogLevel.INFO)
{
- if (string.IsNullOrEmpty(_logFile))
+ if (string.IsNullOrEmpty(_logFile))
throw new Exception("Logging class not initialized!");
- using var writer = new StreamWriter(_logFile, true);
- writer.WriteLine($"{DateTime.Now:yyyy-MM-dd HH:mm:ss} - {level} - {message}");
+
+ // Get calling method information
+ var stackTrace = new StackTrace();
+ var callingMethod = stackTrace.GetFrame(1)?.GetMethod();
+ var callingClass = callingMethod?.DeclaringType?.FullName ?? "UnknownClass";
+ var methodName = callingMethod?.Name ?? "UnknownMethod";
+
+ // Construct the log message with calling class and method
+ var logMessage = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss} - {level} - {callingClass}.{methodName} - {message}";
+
+ using (var fileStream = new FileStream(_logFile, FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
+ using (var writer = new StreamWriter(fileStream))
+ {
+ writer.WriteLine(logMessage);
+ }
+
+ // Output log message to Debug console
+ System.Diagnostics.Debug.WriteLine(logMessage);
}
private static void DeleteOldLogFiles()
@@ -69,4 +85,4 @@ private static void DeleteOldLogFiles()
}
}
}
-}
+}
\ No newline at end of file
diff --git a/GoAwayEdge.Helper/GoAwayEdge.Helper.csproj b/GoAwayEdge.Helper/GoAwayEdge.Helper.csproj
new file mode 100644
index 0000000..bbe8d2e
--- /dev/null
+++ b/GoAwayEdge.Helper/GoAwayEdge.Helper.csproj
@@ -0,0 +1,19 @@
+
+
+ Exe
+ net8.0-windows10.0.18362.0
+ enable
+ enable
+ false
+ true
+ GoAwayEdge Helper
+ GoAwayEdge
+ Exploitox
+ valnoxy
+ 1.0.0.0
+ https://github.com/valnoxy/GoAwayEdge
+ https://github.com/valnoxy/GoAwayEdge
+ ARM64;x64;x86
+ win-x86;win-x64;win-arm64
+
+
\ No newline at end of file
diff --git a/GoAwayEdge.Helper/Program.cs b/GoAwayEdge.Helper/Program.cs
new file mode 100644
index 0000000..85c538a
--- /dev/null
+++ b/GoAwayEdge.Helper/Program.cs
@@ -0,0 +1,31 @@
+namespace GoAwayEdge.Helper
+{
+ internal class Program
+ {
+ static void Main(string[] args)
+ {
+ Console.WriteLine("GoAwayEdge Helper");
+ Console.WriteLine("Helper Application for intercepting the Copilot Key");
+ Console.WriteLine();
+ Common.Debugging.Logging.Initialize();
+ var resultEnvironment = Common.Configuration.InitialEnvironment();
+ if (!resultEnvironment)
+ return;
+
+ var quotedArgs = args.Select(arg => arg.Contains(" ") ? $"\"{arg}\"" : arg);
+ var argumentJoin = string.Join(" ", quotedArgs);
+ Console.WriteLine("[i] Args: " + argumentJoin);
+ Console.WriteLine("[i] Opening defined external application ...");
+ var p = new System.Diagnostics.Process();
+ var startInfo = new System.Diagnostics.ProcessStartInfo
+ {
+ FileName = "cmd.exe",
+ Arguments = $"/c \"{Common.Configuration.CopilotExternalApp}\" {Common.Configuration.CopilotExternalAppArgument}",
+ WorkingDirectory = Path.GetDirectoryName(Common.Configuration.CopilotExternalApp)
+ };
+ p.StartInfo = startInfo;
+ p.Start();
+ Console.ReadKey();
+ }
+ }
+}
diff --git a/GoAwayEdge.sln b/GoAwayEdge.sln
index 31316e2..6beb6e7 100644
--- a/GoAwayEdge.sln
+++ b/GoAwayEdge.sln
@@ -1,20 +1,53 @@
-
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.4.33020.496
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GoAwayEdge", "GoAwayEdge\GoAwayEdge.csproj", "{95F3960E-372B-45F3-85D8-CD06F4D8B271}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GoAwayEdge.Helper", "GoAwayEdge.Helper\GoAwayEdge.Helper.csproj", "{A1CB967D-9105-47AF-BBB1-F2BA694014F1}"
+EndProject
+Project("{C7167F0D-BC9F-4E6E-AFE1-012C56B48DB5}") = "GoAwayEdge.Helper.Package", "GoAwayEdge.Helper.Package\GoAwayEdge.Helper.Package.wapproj", "{6B1C2331-6097-4559-9D50-62D3E906E2E6}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Release|Any CPU = Release|Any CPU
+ Debug|ARM64 = Debug|ARM64
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
+ Release|ARM64 = Release|ARM64
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {95F3960E-372B-45F3-85D8-CD06F4D8B271}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {95F3960E-372B-45F3-85D8-CD06F4D8B271}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {95F3960E-372B-45F3-85D8-CD06F4D8B271}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {95F3960E-372B-45F3-85D8-CD06F4D8B271}.Release|Any CPU.Build.0 = Release|Any CPU
+ {95F3960E-372B-45F3-85D8-CD06F4D8B271}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {95F3960E-372B-45F3-85D8-CD06F4D8B271}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {95F3960E-372B-45F3-85D8-CD06F4D8B271}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {95F3960E-372B-45F3-85D8-CD06F4D8B271}.Debug|x64.Build.0 = Debug|Any CPU
+ {95F3960E-372B-45F3-85D8-CD06F4D8B271}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {95F3960E-372B-45F3-85D8-CD06F4D8B271}.Debug|x86.Build.0 = Debug|Any CPU
+ {95F3960E-372B-45F3-85D8-CD06F4D8B271}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {95F3960E-372B-45F3-85D8-CD06F4D8B271}.Release|ARM64.Build.0 = Release|Any CPU
+ {95F3960E-372B-45F3-85D8-CD06F4D8B271}.Release|x64.ActiveCfg = Release|Any CPU
+ {95F3960E-372B-45F3-85D8-CD06F4D8B271}.Release|x64.Build.0 = Release|Any CPU
+ {95F3960E-372B-45F3-85D8-CD06F4D8B271}.Release|x86.ActiveCfg = Release|Any CPU
+ {95F3960E-372B-45F3-85D8-CD06F4D8B271}.Release|x86.Build.0 = Release|Any CPU
+ {A1CB967D-9105-47AF-BBB1-F2BA694014F1}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {A1CB967D-9105-47AF-BBB1-F2BA694014F1}.Debug|x64.ActiveCfg = Debug|x64
+ {A1CB967D-9105-47AF-BBB1-F2BA694014F1}.Debug|x86.ActiveCfg = Debug|x86
+ {A1CB967D-9105-47AF-BBB1-F2BA694014F1}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {A1CB967D-9105-47AF-BBB1-F2BA694014F1}.Release|x64.ActiveCfg = Release|x64
+ {A1CB967D-9105-47AF-BBB1-F2BA694014F1}.Release|x86.ActiveCfg = Release|x86
+ {6B1C2331-6097-4559-9D50-62D3E906E2E6}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {6B1C2331-6097-4559-9D50-62D3E906E2E6}.Debug|ARM64.Deploy.0 = Debug|ARM64
+ {6B1C2331-6097-4559-9D50-62D3E906E2E6}.Debug|x64.ActiveCfg = Debug|x64
+ {6B1C2331-6097-4559-9D50-62D3E906E2E6}.Debug|x64.Deploy.0 = Debug|x64
+ {6B1C2331-6097-4559-9D50-62D3E906E2E6}.Debug|x86.ActiveCfg = Debug|x86
+ {6B1C2331-6097-4559-9D50-62D3E906E2E6}.Debug|x86.Deploy.0 = Debug|x86
+ {6B1C2331-6097-4559-9D50-62D3E906E2E6}.Release|ARM64.ActiveCfg = Release|ARM64
+ {6B1C2331-6097-4559-9D50-62D3E906E2E6}.Release|ARM64.Deploy.0 = Release|ARM64
+ {6B1C2331-6097-4559-9D50-62D3E906E2E6}.Release|x64.ActiveCfg = Release|x64
+ {6B1C2331-6097-4559-9D50-62D3E906E2E6}.Release|x64.Deploy.0 = Release|x64
+ {6B1C2331-6097-4559-9D50-62D3E906E2E6}.Release|x86.ActiveCfg = Release|x86
+ {6B1C2331-6097-4559-9D50-62D3E906E2E6}.Release|x86.Deploy.0 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/GoAwayEdge/App.xaml b/GoAwayEdge/App.xaml
index b3f84da..8bcb9eb 100644
--- a/GoAwayEdge/App.xaml
+++ b/GoAwayEdge/App.xaml
@@ -10,7 +10,9 @@
-
+
+
+
diff --git a/GoAwayEdge/App.xaml.cs b/GoAwayEdge/App.xaml.cs
index 6138abf..80da669 100644
--- a/GoAwayEdge/App.xaml.cs
+++ b/GoAwayEdge/App.xaml.cs
@@ -1,22 +1,23 @@
/*
- * Go away Edge - IFEO Method
- * by valnoxy (valnoxy.dev)
- * ----------------------------------
- * HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\msedge.exe
- * > UseFilter (DWORD) = 1
+ * GoAwayEdge
+ * Copyright (c) 2018 - 2025 Exploitox (valnoxy).
*
- * HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\msedge.exe\0
- * > Debugger (REG_SZ) = "Path\To\GoAwayEdge.exe"
- * > FullFilterPath (REG_SZ) = C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe
+ * GoAwayEdge is licensed under MIT License (https://github.com/valnoxy/GoAwayEdge/blob/main/LICENSE).
+ * So you are allowed to use freely and modify the application.
+ * I will not be responsible for any outcome.
+ * Proceed with any action at your own risk.
+ *
+ * Source code: https://github.com/valnoxy/GoAwayEdge
*/
using GoAwayEdge.Common;
using System.Diagnostics;
-using System.IO;
using System.Security.Principal;
-using System.Text;
-using System.Web;
using System.Windows;
+using GoAwayEdge.Common.Runtime;
+using GoAwayEdge.Common.Debugging;
+using GoAwayEdge.Common.Installation;
+using InstallRoutine = GoAwayEdge.Common.Installation.InstallRoutine;
namespace GoAwayEdge
{
@@ -25,10 +26,13 @@ namespace GoAwayEdge
///
public partial class App
{
- private static string? _url;
+ public static bool IsDebug = false;
public void Application_Startup(object sender, StartupEventArgs e)
{
+#if DEBUG
+ IsDebug = true;
+#endif
// Initialize the logging system
Logging.Initialize();
@@ -36,441 +40,265 @@ public void Application_Startup(object sender, StartupEventArgs e)
LocalizationManager.LoadLanguage();
string[] args = e.Args;
- if (args.Length == 0) // Opens Installer
+ switch (args.Length)
{
- if (IsAdministrator() == false)
+ // Opens Installer
+ case 0:
+ case 1 when args.Contains("--debug"):
{
- // Restart program and run as admin
- var exeName = Process.GetCurrentProcess().MainModule?.FileName;
- if (exeName != null)
+ if (args.Contains("--debug"))
+ IsDebug = true;
+ if (IsAdministrator() == false)
{
- var startInfo = new ProcessStartInfo(exeName)
- {
- Verb = "runas",
- UseShellExecute = true
- };
- Process.Start(startInfo);
+ ElevateAsAdmin();
+ Environment.Exit(740);
+ return;
}
- Environment.Exit(0);
- return;
- }
- var installer = new Installer();
- installer.ShowDialog();
- Environment.Exit(0);
- }
- else if (args.Length > 0)
- {
- if (args.Contains("-ToastActivated")) // Clicked on notification, ignore it.
+ var installer = new UserInterface.Setup.Installer();
+ installer.ShowDialog();
Environment.Exit(0);
- if (args.Contains("-s")) // Silent Installation
+ break;
+ }
+ case > 0:
{
- foreach (var arg in args)
+ if (args.Contains("--debug"))
+ IsDebug = true;
+ if (args.Contains("-ToastActivated")) // Clicked on notification, ignore it.
+ Environment.Exit(0);
+ if (args.Contains("--control-panel"))
{
- if (arg.StartsWith("-se:"))
- Configuration.Search = ParseSearchEngine(arg);
- if (arg.Contains("--url:"))
+ if (IsAdministrator() == false)
{
- Configuration.CustomQueryUrl = ParseCustomSearchEngine(arg);
- Configuration.Search = !string.IsNullOrEmpty(Configuration.CustomQueryUrl) ? SearchEngine.Custom : SearchEngine.Google;
+ ElevateAsAdmin(string.Join(" ", args));
+ Environment.Exit(740);
+ return;
}
- }
- if (IsAdministrator() == false)
- {
- // Restart program and run as admin
- var exeName = Process.GetCurrentProcess().MainModule?.FileName;
- if (exeName != null)
+ // Check if user allowed opening the control panel
+ if (RegistryConfig.GetKey("ControlPanelIsInstalled") != "True")
{
- var startInfo = new ProcessStartInfo(exeName)
- {
- Verb = "runas",
- UseShellExecute = true,
- Arguments = string.Join(" ", args)
- };
- Process.Start(startInfo);
+ Logging.Log("Control Panel is not allowed on this system, exiting ...", Logging.LogLevel.ERROR);
+ Environment.Exit(1);
+ return;
}
+
+ Configuration.InitialEnvironment();
+ var controlCenter = new UserInterface.ControlPanel.ControlPanel();
+ controlCenter.ShowDialog();
Environment.Exit(0);
- return;
}
- Configuration.InitialEnvironment();
- InstallRoutine.Install(null);
- Environment.Exit(0);
- }
-
- if (args.Contains("-u"))
- {
- InstallRoutine.Uninstall(null);
- Environment.Exit(0);
- }
- if (args.Contains("--update"))
- {
- var statusEnv = Configuration.InitialEnvironment();
- if (statusEnv == false) Environment.Exit(1);
-
- // Check for app update
- var updateAvailable = Updater.CheckForAppUpdate();
+ if (args.Contains("--copilot-dock"))
+ {
+ Configuration.InitialEnvironment();
- var updateSkipped = RegistryConfig.GetKey("SkipVersion");
- if (updateAvailable == updateSkipped)
- Environment.Exit(0);
+ if (Configuration.AiProvider != AiProvider.Default)
+ {
+ DebugMessage.DisplayDebugMessage("GoAwayEdge",
+ $"Opening AI Provider '{Configuration.AiProvider}' (Triggered with argument) ...");
+ UserInterface.CopilotDock.InterfaceManager.ShowDock();
+ Environment.Exit(0);
+ }
+ else
+ {
+ IsDebug = true;
+ DebugMessage.DisplayDebugMessage("GoAwayEdge",
+ "You cannot open the Copilot dock if your AI provider is set to default");
+ Environment.Exit(1);
+ }
+ }
- if (!string.IsNullOrEmpty(updateAvailable))
+ if (args.Contains("-s")) // Silent Installation
{
- var updateMessage = LocalizationManager.LocalizeValue("NewUpdateAvailable", updateAvailable);
- var remindMeLaterBtn = LocalizationManager.LocalizeValue("RemindMeLater");
- var installUpdateBtn = LocalizationManager.LocalizeValue("InstallUpdate");
- var skipUpdateUpdateBtn = LocalizationManager.LocalizeValue("SkipUpdate");
+ Configuration.InitialEnvironment();
- var updateDialog = new MessageUi("GoAwayEdge", updateMessage, installUpdateBtn, remindMeLaterBtn, skipUpdateUpdateBtn, true);
- updateDialog.ShowDialog();
- switch (updateDialog.Summary)
+ foreach (var arg in args)
{
- case "Btn1":
+ if (arg.StartsWith("-e:"))
+ Configuration.Search = ArgumentParse.ParseSearchEngine(arg);
+ if (arg.Contains("--search-url:"))
{
- var updateResult = Updater.UpdateClient();
- if (!updateResult) Environment.Exit(0);
- break;
+ Configuration.CustomQueryUrl = ParseCustomUrl(arg, 13);
+ Configuration.Search = !string.IsNullOrEmpty(Configuration.CustomQueryUrl)
+ ? SearchEngine.Custom
+ : SearchEngine.Google;
+ }
+
+ if (arg.Contains("-a:"))
+ Configuration.AiProvider = ArgumentParse.ParseAiProvider(arg);
+ if (arg.Contains("--ai-url:"))
+ {
+ Configuration.CustomAiProviderUrl = ParseCustomUrl(arg, 9);
+ Configuration.AiProvider = !string.IsNullOrEmpty(Configuration.CustomAiProviderUrl)
+ ? AiProvider.Custom
+ : AiProvider.Default;
+ }
+
+ if (arg.Contains("-w:"))
+ Configuration.WeatherProvider = ArgumentParse.ParseWeatherProvider(arg);
+ if (arg.Contains("--weather-url:"))
+ {
+ Configuration.CustomWeatherProviderUrl = ParseCustomUrl(arg, 14);
+ Configuration.WeatherProvider = !string.IsNullOrEmpty(Configuration.CustomWeatherProviderUrl)
+ ? WeatherProvider.Custom
+ : WeatherProvider.Default;
}
- case "Btn3":
- RegistryConfig.SetKey("SkipVersion", updateAvailable);
- Environment.Exit(0);
- break;
}
- }
- // Validate Ifeo binary
- var binaryStatus = Updater.ValidateIfeoBinary();
- switch (binaryStatus)
+ if (IsAdministrator() == false)
+ {
+ var elevatedProcess = ElevateAndWait(string.Join(" ", args));
+ Environment.Exit(elevatedProcess);
+ return;
+ }
+
+ Configuration.InstallControlPanel = true;
+ var result = InstallRoutine.Install(null);
+ Environment.Exit(result);
+ }
+ if (args.Contains("-u"))
{
- case 0: // validated
- break;
- case 1: // failed validation
- if (IsAdministrator() == false)
- {
- var updateNonIfeoMessage = LocalizationManager.LocalizeValue("NewNonIfeoUpdate");
- var remindMeLaterBtn = LocalizationManager.LocalizeValue("RemindMeLater");
- var installUpdateBtn = LocalizationManager.LocalizeValue("InstallUpdate");
+ if (IsAdministrator() == false)
+ {
+ var elevatedProcess = ElevateAndWait(string.Join(" ", args));
+ Environment.Exit(elevatedProcess);
+ return;
+ }
+ var result = InstallRoutine.Uninstall(null);
+ Environment.Exit(result);
+ }
+ if (args.Contains("--update"))
+ {
+ var statusEnv = Configuration.InitialEnvironment();
+ if (statusEnv == false) Environment.Exit(1);
- var ifeoMessageUi = new MessageUi("GoAwayEdge", updateNonIfeoMessage, installUpdateBtn, remindMeLaterBtn);
- ifeoMessageUi.ShowDialog();
+ // Check for app update
+ var updateAvailable = Updater.CheckForAppUpdate();
- if (ifeoMessageUi.Summary == "Btn1")
+ var updateSkipped = RegistryConfig.GetKey("SkipVersion");
+ if (updateAvailable == updateSkipped)
+ Environment.Exit(0);
+
+ if (!string.IsNullOrEmpty(updateAvailable))
+ {
+ var updateMessage = LocalizationManager.LocalizeValue("NewUpdateAvailable", updateAvailable);
+ var remindMeLaterBtn = LocalizationManager.LocalizeValue("RemindMeLater");
+ var installUpdateBtn = LocalizationManager.LocalizeValue("InstallUpdate");
+ var skipUpdateUpdateBtn = LocalizationManager.LocalizeValue("SkipUpdate");
+
+ var updateDialog = new MessageUi("GoAwayEdge", updateMessage, installUpdateBtn, remindMeLaterBtn, skipUpdateUpdateBtn, true);
+ updateDialog.ShowDialog();
+ switch (updateDialog.Summary)
+ {
+ case "Btn1":
{
- // Restart program and run as admin
- var exeName = Process.GetCurrentProcess().MainModule?.FileName;
- if (exeName != null)
- {
- var startInfo = new ProcessStartInfo(exeName)
- {
- Verb = "runas",
- UseShellExecute = true,
- Arguments = "--update"
- };
- Process.Start(startInfo);
- }
- Environment.Exit(0);
- return;
+ var updateResult = Updater.UpdateClient();
+ if (!updateResult) Environment.Exit(0);
+ break;
}
- Environment.Exit(0);
+ case "Btn3":
+ RegistryConfig.SetKey("SkipVersion", updateAvailable);
+ Environment.Exit(0);
+ break;
}
- Updater.ModifyIfeoBinary(ModifyAction.Update);
- break;
- case 2: // missing
- if (IsAdministrator() == false)
- {
- var ifeoMissingMessage = LocalizationManager.LocalizeValue("MissingIfeoFile");
- var yesBtn = LocalizationManager.LocalizeValue("Yes");
- var noBtn = LocalizationManager.LocalizeValue("No");
- var ifeoMessageUi = new MessageUi("GoAwayEdge", ifeoMissingMessage, yesBtn, noBtn);
- ifeoMessageUi.ShowDialog();
+ }
- if (ifeoMessageUi.Summary == "Btn1")
+ // Validate Ifeo binary
+ var binaryStatus = Updater.ValidateIfeoBinary();
+ switch (binaryStatus)
+ {
+ case 0: // validated
+ break;
+ case 1: // failed validation
+ if (IsAdministrator() == false)
{
- // Restart program and run as admin
- var exeName = Process.GetCurrentProcess().MainModule?.FileName;
- if (exeName != null)
+ var updateNonIfeoMessage = LocalizationManager.LocalizeValue("NewNonIfeoUpdate");
+ var remindMeLaterBtn = LocalizationManager.LocalizeValue("RemindMeLater");
+ var installUpdateBtn = LocalizationManager.LocalizeValue("InstallUpdate");
+
+ var ifeoMessageUi = new MessageUi("GoAwayEdge", updateNonIfeoMessage, installUpdateBtn, remindMeLaterBtn);
+ ifeoMessageUi.ShowDialog();
+
+ if (ifeoMessageUi.Summary == "Btn1")
+ ElevateAsAdmin("--update");
+
+ Environment.Exit(0);
+ }
+ Updater.ModifyIfeoBinary(ModifyAction.Update);
+ break;
+ case 2: // missing
+ if (IsAdministrator() == false)
+ {
+ var ifeoMissingMessage = LocalizationManager.LocalizeValue("MissingIfeoFile");
+ var yesBtn = LocalizationManager.LocalizeValue("Yes");
+ var noBtn = LocalizationManager.LocalizeValue("No");
+ var ifeoMessageUi = new MessageUi("GoAwayEdge", ifeoMissingMessage, yesBtn, noBtn);
+ ifeoMessageUi.ShowDialog();
+
+ if (ifeoMessageUi.Summary == "Btn1")
{
- var startInfo = new ProcessStartInfo(exeName)
- {
- Verb = "runas",
- UseShellExecute = true,
- Arguments = "--update"
- };
- Process.Start(startInfo);
+ ElevateAsAdmin("--update");
+ Environment.Exit(740);
}
+
Environment.Exit(0);
- return;
}
- Environment.Exit(0);
- }
- Updater.ModifyIfeoBinary(ModifyAction.Create);
- break;
+ Updater.ModifyIfeoBinary(ModifyAction.Create);
+ break;
+ }
+ Environment.Exit(0);
}
- Environment.Exit(0);
+
+ break;
}
}
Configuration.InitialEnvironment();
- try
- {
- Configuration.Search = ParseSearchEngine(RegistryConfig.GetKey("SearchEngine"));
- }
- catch
- {
- // ignored
- }
- RunParser(args);
-
+ ArgumentParse.Parse(args);
Environment.Exit(0);
}
- public static void RunParser(string[] args)
- {
- var argumentJoin = string.Join(" ", args);
- var isFile = false;
- var collectSingleArgument = false;
- var singleArgument = string.Empty;
- var p = new Process();
- p.StartInfo.UseShellExecute = true;
- p.StartInfo.RedirectStandardOutput = false;
-#if DEBUG
- var w = new MessageUi("GoAwayEdge",
- $"The following args are redirected (CTRL+C to copy):\n\n{argumentJoin}", "OK", isMainThread: true);
- w.ShowDialog();
-#endif
- Console.WriteLine("Command line args:\n\n" + argumentJoin + "\n", ConsoleColor.Gray);
-
- // Filter command line args
- foreach (var arg in args)
- {
- if (arg.Contains("microsoft-edge:"))
- {
- _url = arg;
- }
-
- if (collectSingleArgument)
- {
- // Concatenate all remaining arguments into a single string
- singleArgument += (singleArgument.Length > 0 ? " " : "") + arg;
- continue;
- }
-
- // Check for the single argument flag
- if (arg == "--single-argument")
- {
- collectSingleArgument = true;
- }
-
- if (!args.Contains("--profile-directory") && !ContainsParsedData(args) && args.Length != 1) continue; // Start Edge (default browser on this system)
-
-#if DEBUG
- var messageUi = new MessageUi("GoAwayEdge",
- "Microsoft Edge will now start normally via IFEO application.", "OK", isMainThread: true);
- messageUi.ShowDialog();
-#endif
- var parsedArgs = args.Skip(2);
- p.StartInfo.FileName = FileConfiguration.NonIfeoPath;
- p.StartInfo.Arguments = string.Join(" ", parsedArgs);
- p.Start();
- Environment.Exit(0);
- }
-
- // Validate single argument
- if (File.Exists(singleArgument))
- isFile = true;
-
- // Open URL in default browser
- if (_url != null)
- {
- // Windows Copilot
- if (_url.Contains("microsoft-edge://?ux=copilot&tcp=1&source=taskbar")
- || _url.Contains("microsoft-edge:///?ux=copilot&tcp=1&source=taskbar"))
- {
- p.StartInfo.FileName = FileConfiguration.NonIfeoPath;
- p.StartInfo.Arguments = _url;
- Console.WriteLine($"Opening Windows Copilot (Taskbar) with following url:\n{_url}", ConsoleColor.Gray);
-#if DEBUG
- var copilotMessageUi = new MessageUi("GoAwayEdge",
- $"Opening Windows Copilot (Taskbar) with following url:\n{_url}", "OK", isMainThread: true);
- copilotMessageUi.ShowDialog();
-#endif
- }
- else if (_url.Contains("microsoft-edge://?ux=copilot&tcp=1&source=hotkey")
- || _url.Contains("microsoft-edge:///?ux=copilot&tcp=1&source=hotkey"))
- {
- p.StartInfo.FileName = FileConfiguration.NonIfeoPath;
- p.StartInfo.Arguments = _url;
- Console.WriteLine($"Opening Windows Copilot (Hotkey) with following url:\n{_url}", ConsoleColor.Gray);
-#if DEBUG
- var copilotMessageUi = new MessageUi("GoAwayEdge",
- $"Opening Windows Copilot (Hotkey) with following url:\n{_url}", "OK", isMainThread: true);
- copilotMessageUi.ShowDialog();
-#endif
- }
- else
- {
- var parsed = ParseUrl(_url);
- Console.WriteLine("Opening URL in default browser:\n\n" + parsed + "\n", ConsoleColor.Gray);
-#if DEBUG
- var defaultUrlMessageUi = new MessageUi("GoAwayEdge",
- "Opening URL in default browser:\n\n" + parsed + "\n", "OK", isMainThread: true);
- defaultUrlMessageUi.ShowDialog();
-#endif
- p.StartInfo.FileName = parsed;
- p.StartInfo.Arguments = "";
- }
- p.Start();
- }
- // Is File
- else if (isFile)
- {
- p.StartInfo.FileName = FileConfiguration.NonIfeoPath;
- p.StartInfo.Arguments = $"--single-argument {singleArgument}";
-#if DEBUG
- var copilotMessageUi = new MessageUi("GoAwayEdge",
- $"Opening '{singleArgument}' with Edge.", "OK", isMainThread: true);
- copilotMessageUi.ShowDialog();
-#endif
- p.Start();
- }
- }
-
- private static string? ParseCustomSearchEngine(string argument)
+ private static void ElevateAsAdmin(string? arguments = null)
{
- var argParsed = argument.Remove(0, 6);
- var result = Uri.TryCreate(argParsed, UriKind.Absolute, out var uriResult)
- && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps);
- return result ? argParsed : null;
- }
-
- private static SearchEngine ParseSearchEngine(string argument)
- {
- var arg = argument;
- if (argument.StartsWith("-se:"))
- arg = argument.Remove(0, 4);
-
- return arg.ToLower() switch
+ // Restart program and run as admin
+ var exeName = Process.GetCurrentProcess().MainModule?.FileName;
+ if (exeName == null) return;
+ var startInfo = new ProcessStartInfo(exeName)
{
- "google" => SearchEngine.Google,
- "bing" => SearchEngine.Bing,
- "duckduckgo" => SearchEngine.DuckDuckGo,
- "yahoo" => SearchEngine.Yahoo,
- "yandex" => SearchEngine.Yandex,
- "ecosia" => SearchEngine.Ecosia,
- "ask" => SearchEngine.Ask,
- "qwant" => SearchEngine.Qwant,
- "perplexity" => SearchEngine.Perplexity,
- "custom" => SearchEngine.Custom,
- _ => SearchEngine.Google // Fallback search engine
+ Verb = "runas",
+ UseShellExecute = true,
+ Arguments = arguments
};
+ Process.Start(startInfo);
}
- private static bool ContainsParsedData(IEnumerable args)
- {
- var contains = false;
- var engineUrl = DefineEngine(Configuration.Search);
-
- foreach (var arg in args)
- {
- if (arg.Contains(engineUrl))
- contains = true;
- }
- return contains;
- }
-
- private static string ParseUrl(string encodedUrl)
- {
- // Remove URI handler with url argument prefix
- encodedUrl = encodedUrl[encodedUrl.IndexOf("http", StringComparison.Ordinal)..];
-
- // Remove junk after search term
- if (encodedUrl.Contains("https%3A%2F%2Fwww.bing.com%2Fsearch%3Fq%3D") && !encodedUrl.Contains("redirect"))
- encodedUrl = encodedUrl.Substring(encodedUrl.IndexOf("http", StringComparison.Ordinal), encodedUrl.IndexOf("%26", StringComparison.Ordinal));
-
- // Alternative url form
- if (encodedUrl.Contains("https%3A%2F%2Fwww.bing.com%2Fsearch%3Fform%3D"))
- {
- encodedUrl = encodedUrl.Substring(encodedUrl.IndexOf("26q%3D", StringComparison.Ordinal) + 6, encodedUrl.Length - (encodedUrl.IndexOf("26q%3D", StringComparison.Ordinal) + 6));
- encodedUrl = "https://www.bing.com/search?q=" + encodedUrl;
- }
-
- // Decode Url
- encodedUrl = encodedUrl.Contains("redirect") ? DotSlash(encodedUrl) : DecodeUrlString(encodedUrl);
-
- // Replace Search Engine
- encodedUrl = encodedUrl.Replace("https://www.bing.com/search?q=", DefineEngine(Configuration.Search));
-
-#if DEBUG
- var uriMessageUi = new MessageUi("GoAwayEdge",
- "New Uri: " + encodedUrl, "OK", isMainThread: true);
- uriMessageUi.ShowDialog();
-#endif
- var uri = new Uri(encodedUrl);
- return uri.ToString();
- }
-
- private static string DefineEngine(SearchEngine engine)
+ private static int ElevateAndWait(string? arguments = null)
{
- var customQueryUrl = string.Empty;
- try
+ // Restart program and run as admin
+ var exeName = Process.GetCurrentProcess().MainModule?.FileName;
+ if (exeName == null) return -1;
+ var startInfo = new ProcessStartInfo(exeName)
{
- customQueryUrl = RegistryConfig.GetKey("CustomQueryUrl");
- }
- catch
- {
- // ignore; not an valid object
- }
-
- return engine switch
- {
- SearchEngine.Google => "https://www.google.com/search?q=",
- SearchEngine.Bing => "https://www.bing.com/search?q=",
- SearchEngine.DuckDuckGo => "https://duckduckgo.com/?q=",
- SearchEngine.Yahoo => "https://search.yahoo.com/search?p=",
- SearchEngine.Yandex => "https://yandex.com/search/?text=",
- SearchEngine.Ecosia => "https://www.ecosia.org/search?q=",
- SearchEngine.Ask => "https://www.ask.com/web?q=",
- SearchEngine.Qwant => "https://qwant.com/?q=",
- SearchEngine.Perplexity => "https://www.perplexity.ai/search?copilot=false&q=",
- SearchEngine.Custom => customQueryUrl,
- _ => "https://www.google.com/search?q="
+ Verb = "runas",
+ UseShellExecute = true,
+ Arguments = arguments
};
- }
-
- private static string DecodeUrlString(string url)
- {
- string newUrl;
- while ((newUrl = Uri.UnescapeDataString(url)) != url)
- url = newUrl;
- return newUrl;
+ var p = new Process();
+ p.StartInfo = startInfo;
+ p.Start();
+ p.WaitForExit();
+ return p.ExitCode;
}
- private static string DotSlash(string url)
+ private static string? ParseCustomUrl(string argument, int count)
{
- string newUrl;
- while ((newUrl = Uri.UnescapeDataString(url)) != url)
- url = newUrl;
-
- try // Decode base64 string from url
- {
- var uri = new Uri(url);
- var query = HttpUtility.ParseQueryString(uri.Query).Get("url");
- if (query != null)
- {
- var decoded = Encoding.UTF8.GetString(Convert.FromBase64String(query));
- return decoded;
- }
- }
- catch
- {
- // ignored
- }
-
- return url;
+ var argParsed = argument.Remove(0, count);
+ var result = Uri.TryCreate(argParsed, UriKind.Absolute, out var uriResult)
+ && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps);
+ return result ? argParsed : null;
}
-
+
private static bool IsAdministrator()
{
var identity = WindowsIdentity.GetCurrent();
diff --git a/GoAwayEdge/Assets/Copilot.xaml b/GoAwayEdge/Assets/Copilot.xaml
new file mode 100644
index 0000000..32c2ca9
--- /dev/null
+++ b/GoAwayEdge/Assets/Copilot.xaml
@@ -0,0 +1,81 @@
+
+ F1 M48,48z M0,0z M21.676,19.303C21.676,19.303,22.49,16.048,26.367,15.904L38.144,15.904C38.144,15.904 34.745,15.617 34.075,11.5 33.405,7.383 31.634,5.755 29.144,5.707 26.655,5.659 25.506,8.292 25.218,9.202 24.931,10.112 21.676,19.303 21.676,19.303z
+ F1 M48,48z M0,0z M19.234,29.261L25.266,9.011C25.266,9.011,26.415,5.612,29.144,5.708L14.016,5.708C14.016,5.708 11.431,5.708 9.564,8.676 9.564,8.676 6.692,12.41 5.016,20.07 3.34,27.73 4.011,28.16 4.011,28.16 4.011,28.16 3.58,32.373 10.043,32.038L15.022,32.038C15.021,32.037,18.037,32.085,19.234,29.261z
+ F1 M48,48z M0,0z M28.887,6.707L31.358,6.303C30.762,5.945,30.048,5.759,29.308,5.719L29.109,5.708C29.105,5.708 29.102,5.708 29.098,5.707 29.082,5.707 29.067,5.709 29.05,5.709 28.875,5.708 28.71,5.724 28.548,5.748 28.479,5.758 28.412,5.771 28.346,5.785 28.241,5.808 28.14,5.837 28.041,5.869 27.589,6.018 27.193,6.255 26.855,6.546 26.738,6.648 26.63,6.755 26.526,6.866 25.765,7.677 25.344,8.699 25.186,9.2 25.147,9.325 25.047,9.616 24.912,10.008L22.694,17.452C22.78,17.36 22.892,17.273 22.991,17.183 23.047,17.132 23.099,17.08 23.159,17.031 23.247,16.959 23.339,16.892 23.436,16.823 23.602,16.705 23.777,16.592 23.973,16.49 23.998,16.477 24.016,16.46 24.042,16.447L26.173,9.293C26.174,9.296,27.066,6.787,28.887,6.707z
+ F1 M48,48z M0,0z M28.864,6.207L30.34,5.867C30.34,5.867 29.654,5.691 29.088,5.712 28.668,5.727 28.286,5.784 27.941,5.915 27.914,5.926 27.885,5.934 27.858,5.946 27.777,5.979 27.699,6.019 27.622,6.058 27.565,6.088 27.507,6.117 27.452,6.149 27.404,6.177 27.358,6.207 27.311,6.237 27.226,6.293 27.142,6.351 27.062,6.413 27.045,6.426 27.029,6.439 27.013,6.452 26.584,6.798 26.24,7.219 25.974,7.62 25.968,7.629 25.962,7.637 25.957,7.646 25.928,7.69 25.904,7.732 25.877,7.776 25.535,8.338 25.321,8.88 25.219,9.204 25.201,9.262 25.169,9.356 25.128,9.478L22.751,17.456C22.931,17.262,23.139,17.071,23.377,16.893L25.682,9.155C25.685,9.143,26.684,6.292,28.864,6.207z
+ F1 M48,48z M0,0z M26.474,28.607C26.474,28.607,25.66,31.862,21.783,32.006L10.006,32.006C10.006,32.006 13.405,32.293 14.075,36.41 14.745,40.527 16.516,42.155 19.006,42.203 21.496,42.251 22.644,39.618 22.932,38.708 23.219,37.799 26.474,28.607 26.474,28.607z
+ F1 M48,48z M0,0z M19.255,41.171L16.784,41.575C17.38,41.933,18.094,42.119,18.834,42.159L19.033,42.17C19.037,42.17 19.04,42.17 19.044,42.171 19.06,42.171 19.075,42.169 19.092,42.169 19.267,42.17 19.432,42.154 19.594,42.13 19.663,42.12 19.73,42.107 19.796,42.093 19.901,42.07 20.002,42.041 20.101,42.009 20.553,41.86 20.949,41.623 21.287,41.332 21.404,41.23 21.512,41.123 21.616,41.012 22.377,40.201 22.798,39.179 22.956,38.678 22.995,38.553 23.095,38.262 23.23,37.87L25.448,30.426C25.362,30.518 25.25,30.605 25.151,30.695 25.095,30.746 25.043,30.798 24.983,30.847 24.895,30.919 24.803,30.986 24.706,31.055 24.54,31.173 24.365,31.286 24.169,31.388 24.144,31.401 24.126,31.418 24.1,31.431L21.969,38.585C21.969,38.582,21.077,41.091,19.255,41.171z
+ F1 M48,48z M0,0z M19.278,41.671L17.802,42.011C17.802,42.011 18.488,42.187 19.054,42.166 19.474,42.151 19.856,42.094 20.201,41.963 20.228,41.952 20.257,41.944 20.284,41.932 20.365,41.899 20.443,41.859 20.52,41.82 20.577,41.79 20.635,41.761 20.69,41.729 20.738,41.701 20.784,41.671 20.831,41.641 20.916,41.585 21,41.527 21.08,41.465 21.097,41.452 21.113,41.439 21.129,41.426 21.558,41.08 21.902,40.659 22.168,40.258 22.174,40.249 22.18,40.241 22.185,40.232 22.214,40.188 22.238,40.146 22.265,40.102 22.607,39.54 22.821,38.998 22.923,38.674 22.941,38.616 22.973,38.522 23.014,38.4L25.391,30.422C25.211,30.616,25.003,30.807,24.765,30.985L22.46,38.723C22.457,38.736,21.458,41.586,19.278,41.671z
+ F1 M48,48z M0,0z M28.915,18.65L22.845,38.913C22.845,38.913,21.734,42.299,19.006,42.203L34.134,42.203C34.134,42.203 36.719,42.203 38.586,39.235 38.586,39.235 41.458,35.501 43.134,27.841 44.81,20.181 44.139,19.751 44.139,19.751 44.139,19.751 44.57,15.538 38.107,15.873L33.128,15.873C33.128,15.873,30.112,15.826,28.915,18.65z
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/GoAwayEdge/Assets/Edge.xaml b/GoAwayEdge/Assets/Edge.xaml
new file mode 100644
index 0000000..69b56f2
--- /dev/null
+++ b/GoAwayEdge/Assets/Edge.xaml
@@ -0,0 +1,78 @@
+
+ F1 M256,256z M0,0z M235.7,195.5A93.7,93.7,0,0,1,225.1,200.2A101.9,101.9,0,0,1,189.2,206.6C141.9,206.6,100.7,174.1,100.7,132.3A31.5,31.5,0,0,1,117.1,105C74.3,106.8 63.3,151.4 63.3,177.5 63.3,251.5 131.4,258.9 146.1,258.9 154,258.9 165.9,256.6 173.1,254.3L174.4,253.9A128.3,128.3,0,0,0,241,201.1A4,4,0,0,0,235.7,195.5z
+ F1 M256,256z M0,0z M235.7,195.5A93.7,93.7,0,0,1,225.1,200.2A101.9,101.9,0,0,1,189.2,206.6C141.9,206.6,100.7,174.1,100.7,132.3A31.5,31.5,0,0,1,117.1,105C74.3,106.8 63.3,151.4 63.3,177.5 63.3,251.5 131.4,258.9 146.1,258.9 154,258.9 165.9,256.6 173.1,254.3L174.4,253.9A128.3,128.3,0,0,0,241,201.1A4,4,0,0,0,235.7,195.5z
+ F1 M256,256z M0,0z M110.3,246.3A79.2,79.2,0,0,1,87.6,225A80.7,80.7,0,0,1,117.1,105C120.3,103.5,125.6,100.9,132.7,101A32.4,32.4,0,0,1,158.4,114A31.9,31.9,0,0,1,164.7,132.7C164.7,132.5 189.2,53.1 84.7,53.1 40.8,53.1 4.69999999999999,94.7 4.69999999999999,131.3A130.2,130.2,0,0,0,16.8,187.3A128,128,0,0,0,173.2,254.3A75.5,75.5,0,0,1,110.4,246.3z
+ F1 M256,256z M0,0z M110.3,246.3A79.2,79.2,0,0,1,87.6,225A80.7,80.7,0,0,1,117.1,105C120.3,103.5,125.6,100.9,132.7,101A32.4,32.4,0,0,1,158.4,114A31.9,31.9,0,0,1,164.7,132.7C164.7,132.5 189.2,53.1 84.7,53.1 40.8,53.1 4.69999999999999,94.7 4.69999999999999,131.3A130.2,130.2,0,0,0,16.8,187.3A128,128,0,0,0,173.2,254.3A75.5,75.5,0,0,1,110.4,246.3z
+ F1 M256,256z M0,0z M157,153.8C156.1,154.8 153.6,156.3 153.6,159.4 153.6,162 155.3,164.6 158.4,166.7 172.7,176.7 199.8,175.3 199.9,175.3A59.6,59.6,0,0,0,230.2,167A61.4,61.4,0,0,0,260.6,114.1C260.9,91.7 252.6,76.8 249.3,70.2 228,28.8 182.3,5 132.6,5A128,128,0,0,0,4.59999999999999,131.2C5.09999999999999,94.7 41.4,65.2 84.6,65.2 88.1,65.2 108.1,65.5 126.6,75.2A72.6,72.6,0,0,1,157.5,104.5C163.6,115.1 164.7,128.6 164.7,134 164.7,139.4 162,147.3 156.9,153.9z
+ F1 M256,256z M0,0z M157,153.8C156.1,154.8 153.6,156.3 153.6,159.4 153.6,162 155.3,164.6 158.4,166.7 172.7,176.7 199.8,175.3 199.9,175.3A59.6,59.6,0,0,0,230.2,167A61.4,61.4,0,0,0,260.6,114.1C260.9,91.7 252.6,76.8 249.3,70.2 228,28.8 182.3,5 132.6,5A128,128,0,0,0,4.59999999999999,131.2C5.09999999999999,94.7 41.4,65.2 84.6,65.2 88.1,65.2 108.1,65.5 126.6,75.2A72.6,72.6,0,0,1,157.5,104.5C163.6,115.1 164.7,128.6 164.7,134 164.7,139.4 162,147.3 156.9,153.9z
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/GoAwayEdge/Assets/Settings.xaml b/GoAwayEdge/Assets/Settings.xaml
new file mode 100644
index 0000000..040b27b
--- /dev/null
+++ b/GoAwayEdge/Assets/Settings.xaml
@@ -0,0 +1,245 @@
+
+ F1 M113,63z M0,0z M25.5356,39.6396C25.4618,40.1031 25.0981,40.4781 24.6525,40.7562 23.3702,41.3403 22.3648,41.8805 21.5388,42.3908 20.8075,42.8426 20.9283,44.0402 21.7332,44.3416 22.6738,44.6937 23.8423,45.0062 25.1432,45.3846 25.4929,45.4864 26.0051,45.8189 26.1675,46.2718 26.6682,47.6674 27.3086,49.1343 27.9883,50.4802 28.5159,51.525 29.5666,51.4248 29.8912,50.3003 30.3125,48.8405 30.59,47.2804 30.9286,45.7891 31.0001,45.3317 31.3036,44.9467 31.7234,44.7518 32.858,44.2249 33.9453,43.6485 34.8293,43.155 35.6549,42.6942 35.5561,41.4607 34.6674,41.1381 33.7183,40.7937 32.5412,40.4022 31.2752,40.0732 30.8297,39.9575 30.467,39.6584 30.2695,39.204 29.6042,37.6727 29.1507,36.364 28.471,35.0247 27.9414,33.9809 26.8233,34.1203 26.4987,35.2449 26.0837,36.6826 25.833,38.0982 25.5356,39.6396z
+ F1 M113,63z M0,0z M25.5356,39.6396C25.4618,40.1031 25.0981,40.4781 24.6525,40.7562 23.3702,41.3403 22.3648,41.8805 21.5388,42.3908 20.8075,42.8426 20.9283,44.0402 21.7332,44.3416 22.6738,44.6937 23.8423,45.0062 25.1432,45.3846 25.4929,45.4864 26.0051,45.8189 26.1675,46.2718 26.6682,47.6674 27.3086,49.1343 27.9883,50.4802 28.5159,51.525 29.5666,51.4248 29.8912,50.3003 30.3125,48.8405 30.59,47.2804 30.9286,45.7891 31.0001,45.3317 31.3036,44.9467 31.7234,44.7518 32.858,44.2249 33.9453,43.6485 34.8293,43.155 35.6549,42.6942 35.5561,41.4607 34.6674,41.1381 33.7183,40.7937 32.5412,40.4022 31.2752,40.0732 30.8297,39.9575 30.467,39.6584 30.2695,39.204 29.6042,37.6727 29.1507,36.364 28.471,35.0247 27.9414,33.9809 26.8233,34.1203 26.4987,35.2449 26.0837,36.6826 25.833,38.0982 25.5356,39.6396z
+ F1 M113,63z M0,0z M19.6873,36.5436C19.6636,36.6928 19.5465,36.8135 19.4031,36.903 18.9904,37.091 18.6668,37.2649 18.4009,37.4291 18.1656,37.5745 18.2044,37.96 18.4635,38.057 18.7662,38.1703 19.1423,38.2709 19.561,38.3927 19.6736,38.4254 19.8384,38.5325 19.8907,38.6782 20.0519,39.1274 20.258,39.5996 20.4768,40.0328 20.6466,40.369 20.9848,40.3368 21.0892,39.9749 21.2248,39.505 21.3141,39.0029 21.4231,38.5229 21.4462,38.3757 21.5438,38.2518 21.6789,38.189 22.0441,38.0194 22.394,37.8339 22.6786,37.6751 22.9443,37.5267 22.9125,37.1297 22.6265,37.0259 22.321,36.9151 21.9422,36.7891 21.5347,36.6832 21.3912,36.6459 21.2745,36.5497 21.211,36.4034 20.9969,35.9106 20.8509,35.4894 20.6321,35.0583 20.4616,34.7223 20.1018,34.7672 19.9973,35.1292 19.8638,35.5919 19.7831,36.0475 19.6873,36.5436z
+ F1 M113,63z M0,0z M19.6873,36.5436C19.6636,36.6928 19.5465,36.8135 19.4031,36.903 18.9904,37.091 18.6668,37.2649 18.4009,37.4291 18.1656,37.5745 18.2044,37.96 18.4635,38.057 18.7662,38.1703 19.1423,38.2709 19.561,38.3927 19.6736,38.4254 19.8384,38.5325 19.8907,38.6782 20.0519,39.1274 20.258,39.5996 20.4768,40.0328 20.6466,40.369 20.9848,40.3368 21.0892,39.9749 21.2248,39.505 21.3141,39.0029 21.4231,38.5229 21.4462,38.3757 21.5438,38.2518 21.6789,38.189 22.0441,38.0194 22.394,37.8339 22.6786,37.6751 22.9443,37.5267 22.9125,37.1297 22.6265,37.0259 22.321,36.9151 21.9422,36.7891 21.5347,36.6832 21.3912,36.6459 21.2745,36.5497 21.211,36.4034 20.9969,35.9106 20.8509,35.4894 20.6321,35.0583 20.4616,34.7223 20.1018,34.7672 19.9973,35.1292 19.8638,35.5919 19.7831,36.0475 19.6873,36.5436z
+ F1 M113,63z M0,0z M18.8707,46.4507C18.8376,46.6588 18.6743,46.8271 18.4744,46.9519 17.8988,47.214 17.4476,47.4565 17.0768,47.6855 16.7487,47.8882 16.8028,48.4257 17.1641,48.561 17.5862,48.7191 18.1107,48.8593 18.6945,49.0291 18.8515,49.0748 19.0814,49.2241 19.1543,49.4273 19.379,50.0537 19.6665,50.7121 19.9715,51.3161 20.2083,51.7851 20.6799,51.7401 20.8255,51.2354 21.0146,50.5802 21.1392,49.88 21.2911,49.2107 21.3232,49.0054 21.4594,48.8326 21.6479,48.7451 22.1571,48.5087 22.6451,48.25 23.0418,48.0285 23.4123,47.8217 23.368,47.268 22.9691,47.1233 22.5432,46.9687 22.0149,46.793 21.4467,46.6453 21.2467,46.5934 21.084,46.4591 20.9953,46.2552 20.6967,45.5679 20.4932,44.9806 20.1881,44.3795 19.9504,43.911 19.4486,43.9736 19.3029,44.4783 19.1167,45.1235 19.0041,45.7589 18.8707,46.4507z
+ F1 M113,63z M0,0z M85.5356,32.3089C85.4618,31.8454 85.0981,31.4704 84.6525,31.1923 83.3702,30.6082 82.3647,30.068 81.5388,29.5577 80.8075,29.1059 80.9283,27.9083 81.7332,27.6069 82.6738,27.2548 83.8423,26.9423 85.1432,26.5639 85.4929,26.4621 86.0051,26.1296 86.1675,25.6767 86.6682,24.2811 87.3086,22.8142 87.9883,21.4683 88.5159,20.4235 89.5666,20.5237 89.8912,21.6482 90.3125,23.108 90.59,24.6681 90.9286,26.1594 91.0001,26.6168 91.3036,27.0018 91.7234,27.1967 92.858,27.7236 93.9453,28.3 94.8293,28.7935 95.6549,29.2543 95.5561,30.4878 94.6674,30.8104 93.7183,31.1548 92.5412,31.5463 91.2752,31.8753 90.8297,31.991 90.467,32.2901 90.2695,32.7445 89.6042,34.2758 89.1507,35.5845 88.471,36.9238 87.9414,37.9676 86.8233,37.8282 86.4987,36.7036 86.0837,35.2659 85.833,33.8503 85.5356,32.3089z
+ F1 M113,63z M0,0z M85.5356,32.3089C85.4618,31.8454 85.0981,31.4704 84.6525,31.1923 83.3702,30.6082 82.3647,30.068 81.5388,29.5577 80.8075,29.1059 80.9283,27.9083 81.7332,27.6069 82.6738,27.2548 83.8423,26.9423 85.1432,26.5639 85.4929,26.4621 86.0051,26.1296 86.1675,25.6767 86.6682,24.2811 87.3086,22.8142 87.9883,21.4683 88.5159,20.4235 89.5666,20.5237 89.8912,21.6482 90.3125,23.108 90.59,24.6681 90.9286,26.1594 91.0001,26.6168 91.3036,27.0018 91.7234,27.1967 92.858,27.7236 93.9453,28.3 94.8293,28.7935 95.6549,29.2543 95.5561,30.4878 94.6674,30.8104 93.7183,31.1548 92.5412,31.5463 91.2752,31.8753 90.8297,31.991 90.467,32.2901 90.2695,32.7445 89.6042,34.2758 89.1507,35.5845 88.471,36.9238 87.9414,37.9676 86.8233,37.8282 86.4987,36.7036 86.0837,35.2659 85.833,33.8503 85.5356,32.3089z
+ F1 M113,63z M0,0z M79.6873,35.4049C79.6636,35.2557 79.5465,35.135 79.4031,35.0455 78.9904,34.8575 78.6668,34.6836 78.4009,34.5194 78.1656,34.374 78.2044,33.9885 78.4635,33.8915 78.7662,33.7782 79.1424,33.6776 79.561,33.5558 79.6736,33.5231 79.8384,33.416 79.8907,33.2703 80.0519,32.8211 80.258,32.349 80.4768,31.9157 80.6466,31.5795 80.9848,31.6117 81.0892,31.9736 81.2248,32.4435 81.3141,32.9456 81.4231,33.4256 81.4462,33.5728 81.5438,33.6967 81.6789,33.7595 82.0441,33.9291 82.394,34.1146 82.6786,34.2734 82.9443,34.4218 82.9125,34.8188 82.6265,34.9226 82.321,35.0334 81.9422,35.1594 81.5347,35.2653 81.3912,35.3026 81.2745,35.3988 81.211,35.5451 80.9969,36.0379 80.8509,36.4591 80.6321,36.8902 80.4616,37.2262 80.1018,37.1813 79.9973,36.8194 79.8638,36.3566 79.7831,35.901 79.6873,35.4049z
+ F1 M113,63z M0,0z M79.6873,35.4049C79.6636,35.2557 79.5465,35.135 79.4031,35.0455 78.9904,34.8575 78.6668,34.6836 78.4009,34.5194 78.1656,34.374 78.2044,33.9885 78.4635,33.8915 78.7662,33.7782 79.1424,33.6776 79.561,33.5558 79.6736,33.5231 79.8384,33.416 79.8907,33.2703 80.0519,32.8211 80.258,32.349 80.4768,31.9157 80.6466,31.5795 80.9848,31.6117 81.0892,31.9736 81.2248,32.4435 81.3141,32.9456 81.4231,33.4256 81.4462,33.5728 81.5438,33.6967 81.6789,33.7595 82.0441,33.9291 82.394,34.1146 82.6786,34.2734 82.9443,34.4218 82.9125,34.8188 82.6265,34.9226 82.321,35.0334 81.9422,35.1594 81.5347,35.2653 81.3912,35.3026 81.2745,35.3988 81.211,35.5451 80.9969,36.0379 80.8509,36.4591 80.6321,36.8902 80.4616,37.2262 80.1018,37.1813 79.9973,36.8194 79.8638,36.3566 79.7831,35.901 79.6873,35.4049z
+ F1 M113,63z M0,0z M78.8707,25.4978C78.8376,25.2897 78.6743,25.1214 78.4744,24.9966 77.8988,24.7345 77.4476,24.492 77.0768,24.263 76.7487,24.0603 76.8028,23.5228 77.1641,23.3875 77.5862,23.2294 78.1107,23.0892 78.6945,22.9194 78.8515,22.8737 79.0814,22.7244 79.1543,22.5212 79.379,21.8948 79.6665,21.2364 79.9715,20.6324 80.2083,20.1634 80.6799,20.2084 80.8255,20.7131 81.0146,21.3683 81.1392,22.0685 81.2911,22.7378 81.3232,22.9431 81.4594,23.1159 81.6479,23.2034 82.1571,23.4398 82.6451,23.6985 83.0418,23.92 83.4123,24.1268 83.368,24.6805 82.9691,24.8252 82.5432,24.9798 82.0149,25.1555 81.4467,25.3032 81.2467,25.3551 81.084,25.4894 80.9954,25.6933 80.6967,26.3806 80.4932,26.9679 80.1881,27.569 79.9504,28.0375 79.4486,27.9749 79.3029,27.4702 79.1167,26.825 79.0042,26.1896 78.8707,25.4978z
+ F1 M113,63z M0,0z M73.9718,30.9626C73.1149,29.8038,71.7888,29.14,70.3347,29.14L68.1805,29.14 66.5052,29.14 64.9512,24.1435C64.4006,22.2928,62.649,21,60.6932,21L60.4105,21 49.6361,21C46.0131,21,42.8799,23.331,41.8395,26.8016L38.1906,38.9642C37.7836,40.3221 38.0352,41.7533 38.8817,42.8907 39.7275,44.0273 41.0262,44.68 42.4433,44.68L45.8444,44.68C46.6162,44.9686,47.3717,45.4318,47.6559,47.1079L47.7684,47.7858C48.2242,50.5719 48.5254,52.4123 51.9753,52.8148 52.0041,52.8185 52.033,52.82 52.0604,52.82L63.019,52.82C66.6968,52.82,69.8781,50.4905,70.9348,47.0221L74.6467,34.8587C75.0574,33.5156,74.8109,32.0948,73.9718,30.9626z M60.4105,22.48L60.6932,22.48C62.0001,22.48,63.1678,23.3377,63.5363,24.5742L64.9556,29.14 63.3328,29.14C62.5173,29.14 61.7573,29.396 61.1357,29.8393 61.0825,29.8186 61.0321,29.7912 60.9722,29.7831 58.8972,29.5048 57.4261,29.8149 56.3923,30.3107L57.623,26.2081C57.9885,24.9916,59.1496,22.48,60.4105,22.48z M59.9858,31.1735C59.8896,31.3637,59.8052,31.5628,59.7416,31.7729L56.3805,42.7878C55.5739,43.1785 53.7424,43.2673 52.2365,43.2585 52.514,42.9025 52.7367,42.4977 52.8729,42.0426L55.6235,32.874C55.8899,32.4064,56.9525,30.9981,59.9858,31.1735z M42.4433,43.2C41.4991,43.2 40.6333,42.7649 40.0687,42.0071 39.5048,41.2494 39.3368,40.2955 39.6084,39.3897L43.2573,27.2264C44.1091,24.3877,46.6724,22.48,49.6361,22.48L57.8575,22.48C56.8371,23.7713,56.2947,25.4844,56.2051,25.7826L54.2449,32.3168C54.2005,32.4056 54.1753,32.467 54.1694,32.4833 54.1442,32.5477 54.142,32.6136 54.1361,32.6794L51.4543,41.6186C51.1709,42.5643,50.3155,43.2,49.3276,43.2L48.7555,43.2 42.4433,43.2z M52.087,51.337C49.8071,51.0581,49.6791,50.3003,49.2284,47.5468L49.1152,46.8608C48.9524,45.8995,48.6431,45.2032,48.2627,44.68L49.3276,44.68C49.3298,44.68,49.332,44.6793,49.3342,44.6793L50.371,44.6785C50.5708,44.6918 51.4033,44.7429 52.4415,44.7429 53.5219,44.7429 54.8198,44.6844 55.8655,44.4743L54.9094,47.6082C54.6149,48.5702,53.4656,51.3015,52.087,51.337z M73.2318,34.4273L69.5199,46.5907C68.6667,49.3864,65.9938,51.34,63.019,51.34L54.6489,51.34C55.6827,50.0502,56.2347,48.3386,56.325,48.0411L61.1565,32.2058C61.4421,31.2719,62.3368,30.62,63.3321,30.62L65.9605,30.62 68.1805,30.62 70.3347,30.62C71.3144,30.62 72.2069,31.0662 72.7826,31.8425 73.3398,32.5951 73.5026,33.5363 73.2318,34.4273z
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ F1 M113,63z M0,0z M56.3169,13C48.5041,13 41.8579,17.6666 39.1304,24.9701 41.3568,22.5219 44.305,21.2154 47.7309,21.2154L47.7565,21.2154C53.0719,21.2236,58.6898,24.5841,60.5465,28.8643L60.5385,28.8643C61.2039,30.1624 61.0489,31.5017 60.8353,32.3478 60.5889,33.309 60.2192,33.7604 60.0796,33.9412L60.0042,34.039C59.733,34.3759 59.7752,34.8697 60.0956,35.1655 60.1531,35.2147 60.2436,35.2807 60.3668,35.3628L60.5802,35.4944C61.6236,36.1516 63.9815,36.8246 66.1175,36.8246 67.7524,36.8246 69.8878,36.5701 71.8924,34.5573 75.2607,31.189 73.9622,26.4894 73.4857,25.1257 72.6724,22.8172 69.2968,15.1443 59.8244,13.337 58.6743,13.1151 57.4917,13 56.3169,13z M47.7309,22.8585C43.4589,22.8585 40.0334,25.2499 38.0618,29.604 37.4127,37.1293 41.9718,43.8812 47.3939,46.9044 48.1743,47.3399 50.6551,48.5892 54.1138,49 51.0577,47.5541 48.7331,45.0317 47.6651,41.7538 45.8905,36.307 48.1172,30.4911 53.334,26.9421L53.342,26.9501C54.1307,26.4325 55.0919,26.1366 56.0778,26.1366 56.1928,26.1366 56.2997,26.1362 56.4148,26.1526 54.1062,24.1809 50.8373,22.8667 47.7565,22.8585L47.7309,22.8585z M51.1405,31.2134C48.8567,34.1463 48.1088,37.7865 49.2343,41.2451 50.7213,45.8129 55.0679,48.7044 60.3668,48.7208 64.4909,47.8007 68.0801,45.3926 71.0869,41.5067L71.1607,41.4088C71.3661,41.1048 71.3506,40.7015 71.1206,40.414 70.8823,40.1347 70.4882,40.0367 70.1514,40.1845L69.7567,40.3658C69.5924,40.4398 69.4448,40.4879 69.2641,40.5536 69.0751,40.6193 68.8615,40.7017 68.5821,40.8167 67.5224,41.2521 65.9454,41.4987 64.253,41.4987 62.8318,41.4987 61.4434,41.3186 60.3507,40.99 58.8062,40.53 54.0976,39.1082 51.6412,33.6861 51.3372,33.0124 51.1323,32.15 51.1405,31.2134z
+ F1 M113,63z M0,0z M57.6449,56.1063C57.7345,56.0167 58.8095,54.8521 60.5116,53.0605 63.0199,50.4626 73.9491,38.8167 74.1283,38.6376 74.9345,37.8313 78.7866,40.7876 82.0116,37.5626 84.072,35.5022 84.7887,32.9042 83.8929,29.7688L79.772,33.8897C79.772,33.8897 78.2491,33.8896 76.7262,32.4563 75.2929,30.9334 75.2929,29.4105 75.2929,29.4105L79.4137,25.3792C76.4574,24.4834 73.5908,25.2001 71.5304,27.2605 68.3949,30.3959 71.172,34.3376 70.3658,35.1438 70.1866,35.2334 54.8679,49.8355 54.6887,50.0146 53.1658,51.448 53.0762,51.5376 52.9866,51.5376 51.7324,52.8813 51.6429,55.0313 52.897,56.2855 54.1512,57.5396 56.3012,57.4501 57.6449,56.1063z M55.5845,52.2542C56.3012,52.2542 56.9283,52.8813 56.9283,53.598 56.9283,54.3146 56.3012,54.9417 55.5845,54.9417 54.8679,54.9417 54.2408,54.3146 54.2408,53.598 54.2408,52.8813 54.7783,52.2542 55.5845,52.2542z
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ F1 M37,36z M0,0z M18.3169,1.6453E-05C10.5041,1.6453E-05 3.85789,4.6666 1.13039,11.9701 3.35676,9.52188 6.30504,8.21538 9.73085,8.21538L9.75652,8.21538C15.0719,8.2236,20.6898,11.5841,22.5465,15.8643L22.5385,15.8643C23.2039,17.1624 23.0489,18.5017 22.8353,19.3478 22.5889,20.309 22.2192,20.7604 22.0796,20.9412L22.0042,21.039C21.733,21.3759 21.7752,21.8697 22.0956,22.1655 22.1531,22.2147 22.2436,22.2807 22.3668,22.3628L22.5802,22.4944C23.6236,23.1516 25.9815,23.8246 28.1175,23.8246 29.7524,23.8246 31.8878,23.5701 33.8924,21.5573 37.2607,18.189 35.9622,13.4894 35.4857,12.1257 34.6724,9.81717 31.2968,2.14434 21.8244,0.336961 20.6743,0.115147 19.4917,1.6453E-05 18.3169,1.6453E-05z M9.73085,9.85845C5.45886,9.85845 2.03344,12.2499 0.0617534,16.604 -0.58726,24.1293 3.97176,30.8812 9.39389,33.9044 10.1743,34.3399 12.6551,35.5892 16.1138,36 13.0577,34.5541 10.7331,32.0317 9.66506,28.7538 7.89054,23.307 10.1172,17.4911 15.334,13.9421L15.342,13.9501C16.1307,13.4325 17.0919,13.1366 18.0778,13.1366 18.1928,13.1366 18.2997,13.1362 18.4148,13.1526 16.1062,11.1809 12.8373,9.86667 9.75653,9.85845L9.73085,9.85845z M13.1405,18.2134C10.8567,21.1463 10.1088,24.7865 11.2343,28.2451 12.7213,32.8129 17.0679,35.7044 22.3668,35.7208 26.4909,34.8007 30.0801,32.3926 33.0869,28.5067L33.1607,28.4088C33.3661,28.1048 33.3506,27.7015 33.1206,27.414 32.8823,27.1347 32.4882,27.0367 32.1514,27.1845L31.7567,27.3658C31.5924,27.4398 31.4448,27.4879 31.2641,27.5536 31.0751,27.6193 30.8615,27.7017 30.5821,27.8167 29.5224,28.2521 27.9454,28.4987 26.253,28.4987 24.8318,28.4987 23.4434,28.3186 22.3507,27.99 20.8062,27.53 16.0976,26.1082 13.6412,20.6861 13.3372,20.0124 13.1323,19.15 13.1405,18.2134z
+
+
+
+
+ F1 M37,32z M0,0z M35.9718,9.96262C35.1149,8.80378,33.7888,8.14,32.3347,8.14L30.1805,8.14 28.5052,8.14 26.9512,3.14352C26.4006,1.29278,24.649,0,22.6932,0L22.4105,0 11.6361,0C8.0131,0,4.87994,2.331,3.8395,5.8016L0.190558,17.9642C-0.216442,19.3221 0.0351583,20.7533 0.881718,21.8907 1.72754,23.0273 3.02624,23.68 4.44334,23.68L7.84438,23.68C8.6162,23.9686,9.37174,24.4318,9.6559,26.1079L9.76838,26.7858C10.2242,29.5719 10.5254,31.4123 13.9753,31.8148 14.0041,31.8185 14.033,31.82 14.0604,31.82L25.019,31.82C28.6968,31.82,31.8781,29.4905,32.9348,26.0221L36.6467,13.8587C37.0574,12.5156,36.8109,11.0948,35.9718,9.96262z M22.4105,1.48L22.6932,1.48C24.0001,1.48,25.1678,2.33766,25.5363,3.5742L26.9556,8.14 25.3328,8.14C24.5173,8.14 23.7573,8.39604 23.1357,8.8393 23.0825,8.81858 23.0321,8.7912 22.9722,8.78306 20.8972,8.50482 19.4261,8.81488 18.3923,9.31068L19.623,5.20812C19.9885,3.99156,21.1496,1.48,22.4105,1.48z M21.9858,10.1735C21.8896,10.3637,21.8052,10.5628,21.7416,10.7729L18.3805,21.7878C17.5739,22.1785 15.7424,22.2673 14.2365,22.2585 14.514,21.9025 14.7367,21.4977 14.8729,21.0426L17.6235,11.874C17.8899,11.4064,18.9525,9.99814,21.9858,10.1735z M4.44334,22.2C3.4991,22.2 2.6333,21.7649 2.06868,21.0071 1.5048,20.2494 1.33682,19.2955 1.6084,18.3897L5.25734,6.22636C6.10908,3.38772,8.67244,1.48,11.6361,1.48L19.8575,1.48C18.8371,2.7713,18.2947,4.4844,18.2051,4.78262L16.2449,11.3168C16.2005,11.4056 16.1753,11.467 16.1694,11.4833 16.1442,11.5477 16.142,11.6136 16.1361,11.6794L13.4543,20.6186C13.1709,21.5643,12.3155,22.2,11.3276,22.2L10.7555,22.2 4.44334,22.2z M14.087,30.337C11.8071,30.0581,11.6791,29.3003,11.2284,26.5468L11.1152,25.8608C10.9524,24.8995,10.6431,24.2032,10.2627,23.68L11.3276,23.68C11.3298,23.68,11.332,23.6793,11.3342,23.6793L12.371,23.6785C12.5708,23.6918 13.4033,23.7429 14.4415,23.7429 15.5219,23.7429 16.8198,23.6844 17.8655,23.4743L16.9094,26.6082C16.6149,27.5702,15.4656,30.3015,14.087,30.337z M35.2318,13.4273L31.5199,25.5907C30.6667,28.3864,27.9938,30.34,25.019,30.34L16.6489,30.34C17.6827,29.0502,18.2347,27.3386,18.325,27.0411L23.1565,11.2058C23.4421,10.2719,24.3368,9.62,25.3321,9.62L27.9605,9.62 30.1805,9.62 32.3347,9.62C33.3144,9.62 34.2069,10.0662 34.7826,10.8425 35.3398,11.5951 35.5026,12.5363 35.2318,13.4273z
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/GoAwayEdge/Common/Configuration.cs b/GoAwayEdge/Common/Configuration.cs
index dc814cc..ab5982f 100644
--- a/GoAwayEdge/Common/Configuration.cs
+++ b/GoAwayEdge/Common/Configuration.cs
@@ -1,24 +1,69 @@
-using System.IO;
+using System.ComponentModel;
+using System.IO;
+using System.IO.Pipes;
+using System.Runtime.InteropServices;
using System.Windows;
+using GoAwayEdge.Common.Debugging;
+using ManagedShell;
using Microsoft.Win32;
namespace GoAwayEdge.Common
{
- internal enum SearchEngine
+ public enum SearchEngine
{
+ [Description("https://google.com/search?q=")]
Google,
+
+ [Description("https://bing.com/search?q=")]
Bing,
+
+ [Description("https://duckduckgo.com/?q=")]
DuckDuckGo,
+
+ [Description("https://search.yahoo.com/search?p=")]
Yahoo,
+
+ [Description("https://yandex.com/search/?text=")]
Yandex,
+
+ [Description("https://ecosia.org/search?q=")]
Ecosia,
+
+ [Description("https://ask.com/web?q=")]
Ask,
+
+ [Description("https://qwant.com/?q=")]
Qwant,
+
+ [Description("https://perplexity.ai/search?copilot=false&q=")]
Perplexity,
+
+ Custom
+ }
+
+ public enum AiProvider
+ {
+ Default,
+
+ [Description("https://copilot.microsoft.com/")]
+ Copilot,
+
+ [Description("https://chatgpt.com/")]
+ ChatGPT,
+
+ [Description("https://gemini.google.com/")]
+ Gemini,
+
+ [Description("https://github.com/copilot")]
+ GitHub_Copilot,
+
+ [Description("https://x.com/i/grok")]
+ Grok,
+
Custom
}
- internal enum EdgeChannel
+ public enum EdgeChannel
{
Stable,
Beta,
@@ -26,40 +71,120 @@ internal enum EdgeChannel
Canary
}
+ public enum WeatherProvider
+ {
+ Default,
+
+ [Description("https://weather.com/{country-code}/weather/today/l/{latitude},{longitude}")]
+ WeatherCom,
+
+ [Description("https://accuweather.com/{short-country-code}/search-locations?query={latitude},{longitude}")]
+ AccuWeather,
+
+ Custom
+ }
+
internal class Configuration
{
public static EdgeChannel Channel { get; set; }
public static SearchEngine Search { get; set; }
+ public static AiProvider AiProvider { get; set; }
+ public static WeatherProvider WeatherProvider { get; set; }
+ public static bool LicenseAccepted { get; set; }
public static bool Uninstall { get; set; }
public static bool UninstallEdge { get; set; }
public static bool NoEdgeInstalled { get; set; }
+ public static bool InstallControlPanel { get; set; }
public static string? CustomQueryUrl { get; set; }
+ public static string? CustomAiProviderUrl { get; set; }
+ public static string? CustomWeatherProviderUrl { get; set; }
public static string InstallDir = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles),
"valnoxy",
"GoAwayEdge");
+ public static string UserDir = Path.Combine(
+ Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
+ "valnoxy",
+ "GoAwayEdge");
+
+ public static ShellManager? ShellManager { get; set; }
+ public static bool AppBarIsAttached { get; set; }
+ public static string? CopilotExternalApp { get; set; }
+ public static string? CopilotExternalAppArgument { get; set; }
+
+
///
/// Initialize the current environment.
///
///
/// Boolean status of the initialization.
///
- public static bool InitialEnvironment()
+ public static bool InitialEnvironment(bool setupRunning = false)
{
// Check if Edge is installed
try
{
+ Logging.Log("Initialize environment ...");
NoEdgeInstalled = !File.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86),
"Microsoft", "Edge", "Application", "msedge.exe"));
- // RegistryConfig.SetKey("NoEdgeInstalled", NoEdgeInstalled);
if (NoEdgeInstalled)
+ {
+ Logging.Log("Edge is not installed on this device - completed initialization");
return true;
+ }
+
+ if (!IsCopilotDockPipeAvailable() && !setupRunning)
+ {
+ Logging.Log("Copilot Dock (Pipe) is not available - spawning ShellManager");
+ try { ShellManager = new ShellManager(); }
+ catch (Exception ex)
+ {
+ Logging.Log("An error has occurred while initializing the ShellManager: " + ex.Message, Logging.LogLevel.ERROR);
+ }
+ }
+ Logging.Log("Fetching settings from registry ...");
FileConfiguration.EdgePath = RegistryConfig.GetKey("EdgeFilePath");
FileConfiguration.NonIfeoPath = RegistryConfig.GetKey("EdgeNonIEFOFilePath");
+ try
+ {
+ Channel = Runtime.ArgumentParse.ParseEdgeChannel(RegistryConfig.GetKey("EdgeChannel"));
+ Search = Runtime.ArgumentParse.ParseSearchEngine(RegistryConfig.GetKey("SearchEngine"));
+ AiProvider = Runtime.ArgumentParse.ParseAiProvider(RegistryConfig.GetKey("AiProvider", userSetting: true));
+ WeatherProvider = Runtime.ArgumentParse.ParseWeatherProvider(RegistryConfig.GetKey("WeatherProvider", userSetting: true));
+ CopilotExternalApp = RegistryConfig.GetKey("ExternalApp", userSetting: true);
+ CopilotExternalAppArgument = RegistryConfig.GetKey("ExternalAppArgs", userSetting: true);
+ if (Search == SearchEngine.Custom)
+ {
+ CustomQueryUrl = RegistryConfig.GetKey("CustomQueryUrl");
+ }
+ if (AiProvider == AiProvider.Custom)
+ {
+ CustomAiProviderUrl = RegistryConfig.GetKey("CustomAiProviderUrl", userSetting: true);
+ }
+ if (WeatherProvider == WeatherProvider.Custom)
+ {
+ CustomWeatherProviderUrl = RegistryConfig.GetKey("CustomWeatherProviderUrl", userSetting: true);
+ }
+ }
+ catch (Exception ex)
+ {
+ Logging.Log("An error has occurred while reading the registry: " + ex.Message, Logging.LogLevel.ERROR);
+ }
+ Logging.Log($"Value of EdgePath: {FileConfiguration.EdgePath}");
+ Logging.Log($"Value of NonIfeoPath: {FileConfiguration.NonIfeoPath}");
+ Logging.Log($"Value of Channel: {Channel}");
+ Logging.Log($"Value of Search: {Search}");
+ Logging.Log($"Value of AiProvider: {AiProvider}");
+ Logging.Log($"Value of WeatherProvider: {WeatherProvider}");
+ Logging.Log($"Value of CustomQueryUrl: {CustomQueryUrl}");
+ Logging.Log($"Value of CustomAiProviderUrl: {CustomAiProviderUrl}");
+ Logging.Log($"Value of CustomWeatherProviderUrl: {CustomWeatherProviderUrl}");
+ Logging.Log($"Value of CopilotExternalApp: {CopilotExternalApp}");
+ Logging.Log($"Value of CopilotExternalAppArgument: {CopilotExternalAppArgument}");
return true;
}
catch (Exception ex)
@@ -70,6 +195,181 @@ public static bool InitialEnvironment()
return false;
}
}
+
+ public static bool IsCopilotDockPipeAvailable()
+ {
+ try
+ {
+ using var pipeClient = new NamedPipeClientStream(".", "GoAwayEdge_CopilotDockPipe", PipeDirection.In);
+ pipeClient.Connect(1000);
+ return true;
+ }
+ catch (TimeoutException)
+ {
+ // Pipe does not exist or is not available
+ return false;
+ }
+ catch (UnauthorizedAccessException ex)
+ {
+ Logging.Log($"Access Denied for Pipe 'GoAwayEdge_CopilotDockPipe': {ex.Message}", Logging.LogLevel.ERROR);
+ return true;
+ }
+ catch (Exception ex)
+ {
+ Logging.Log($"Failed to check for the pipe 'GoAwayEdge_CopilotDockPipe': {ex.Message}", Logging.LogLevel.ERROR);
+ return false;
+ }
+ }
+
+ ///
+ /// Get a list of all available Edge Channels.
+ ///
+ ///
+ /// List of Edge Channels.
+ ///
+ public static List GetEdgeChannels()
+ {
+ var list = (from edgeChannel in (EdgeChannel[])Enum.GetValues(typeof(EdgeChannel))
+ select edgeChannel.ToString()).ToList();
+ return list;
+ }
+
+ ///
+ /// Get a list of all available Search Engines.
+ ///
+ ///
+ /// List of Search Engines.
+ ///
+ public static List GetSearchEngines()
+ {
+ var list = (from searchEngine in (SearchEngine[])Enum.GetValues(typeof(SearchEngine))
+ where searchEngine != SearchEngine.Custom
+ select searchEngine.ToString()).ToList();
+
+ try
+ {
+ var resourceValue =
+ (string)Application.Current.MainWindow!.FindResource("SettingsSearchEngineCustomItem");
+ list.Add(!string.IsNullOrEmpty(resourceValue) ? resourceValue : "Custom");
+ }
+ catch
+ {
+ list.Add("Custom");
+ }
+
+ return list;
+ }
+
+ ///
+ /// Get a list of all available AI Providers.
+ ///
+ ///
+ /// List of AI Providers.
+ ///
+ public static List GetAiProviders()
+ {
+ var list = (from aiProvider in (AiProvider[])Enum.GetValues(typeof(AiProvider))
+ where aiProvider != AiProvider.Custom && aiProvider != AiProvider.Default
+ select aiProvider.ToString().Replace("_", " ")).ToList();
+
+ try
+ {
+ var resourceValue =
+ (string)Application.Current.MainWindow!.FindResource("SettingsSearchEngineCustomItem");
+ list.Add(!string.IsNullOrEmpty(resourceValue) ? resourceValue : "Custom");
+ }
+ catch
+ {
+ list.Add("Custom");
+ }
+
+ try
+ {
+ var resourceValueDefault =
+ (string)Application.Current.MainWindow!.FindResource("Default");
+ list.Insert(0, !string.IsNullOrEmpty(resourceValueDefault) ? resourceValueDefault : "Default");
+ }
+ catch
+ {
+ list.Insert(0, "Default");
+ }
+
+ return list;
+ }
+
+ ///
+ /// Get a list of all available Weather Services.
+ ///
+ ///
+ /// List of Weather Services.
+ ///
+ public static List GetWeatherProviders()
+ {
+ var list = (from weatherProvider in (WeatherProvider[])Enum.GetValues(typeof(WeatherProvider))
+ where weatherProvider != WeatherProvider.Custom && weatherProvider != WeatherProvider.Default
+ select weatherProvider.ToString().Replace("_", " ")).ToList();
+
+ try
+ {
+ var resourceValueCustom =
+ (string)Application.Current.MainWindow!.FindResource("SettingsSearchEngineCustomItem");
+ list.Add(!string.IsNullOrEmpty(resourceValueCustom) ? resourceValueCustom : "Custom");
+ }
+ catch
+ {
+ list.Add("Custom");
+ }
+
+ try
+ {
+ var resourceValueDefault =
+ (string)Application.Current.MainWindow!.FindResource("Default");
+ list.Insert(0, !string.IsNullOrEmpty(resourceValueDefault) ? resourceValueDefault : "Default");
+ }
+ catch
+ {
+ list.Insert(0, "Default");
+ }
+
+ return list;
+ }
+
+ ///
+ /// Retrieves the description of an enumeration value based on the .
+ ///
+ /// The enumeration value for which to retrieve the description.
+ ///
+ /// The description defined by the if it exists;
+ /// otherwise, the string representation of the enumeration value.
+ ///
+ ///
+ /// Example usage:
+ ///
+ /// public enum SampleEnum
+ /// {
+ /// [Description("First Value")]
+ /// First,
+ ///
+ /// [Description("Second Value")]
+ /// Second,
+ ///
+ /// Third // No DescriptionAttribute
+ /// }
+ ///
+ /// var value = SampleEnum.First;
+ /// string description = GetEnumDescription(value); // "First Value"
+ ///
+ /// value = SampleEnum.Third;
+ /// description = GetEnumDescription(value); // "Third"
+ ///
+ ///
+ public static string GetEnumDescription(Enum value)
+ {
+ var fieldInfo = value.GetType().GetField(value.ToString());
+ var attributes = (DescriptionAttribute[])fieldInfo!.GetCustomAttributes(typeof(DescriptionAttribute), false);
+
+ return attributes.Length > 0 ? attributes[0].Description : value.ToString();
+ }
}
internal enum ModifyAction
@@ -95,20 +395,34 @@ public class RegistryConfig
///
/// Create a Key in the Registry
///
+ /// Name of key
+ /// Value of key
/// Type of value
- /// Use the Uninstall Registry key instead.
- public static void SetKey(string option, object value, RegistryValueKind valueKind = RegistryValueKind.String, bool isUninstall = false)
+ /// Use the Uninstall Registry key instead.
+ /// Use the CurrentUser Registry key instead.
+ public static void SetKey(string option, object value, RegistryValueKind valueKind = RegistryValueKind.String,
+ bool isUninstall = false, bool userSetting = false)
{
try
{
- using var key = isUninstall
- ? Registry.LocalMachine.CreateSubKey(UninstallRegistryPath, RegistryKeyPermissionCheck.ReadWriteSubTree)
- : Registry.LocalMachine.CreateSubKey(RegistryPath, RegistryKeyPermissionCheck.ReadWriteSubTree);
+ RegistryKey? key;
+ if (userSetting)
+ {
+ key = Registry.CurrentUser.CreateSubKey(RegistryPath, RegistryKeyPermissionCheck.ReadWriteSubTree);
+ }
+ else if (isUninstall)
+ {
+ key = Registry.LocalMachine.CreateSubKey(UninstallRegistryPath, RegistryKeyPermissionCheck.ReadWriteSubTree);
+ }
+ else
+ {
+ key = Registry.LocalMachine.CreateSubKey(RegistryPath, RegistryKeyPermissionCheck.ReadWriteSubTree);
+ }
key.SetValue(option, value, valueKind);
}
catch (Exception ex)
{
- Console.WriteLine("An error has occurred while writing to the registry: " + ex.Message);
+ Logging.Log("An error has occurred while writing to the registry: " + ex.Message, Logging.LogLevel.ERROR);
}
}
@@ -117,14 +431,25 @@ public static void SetKey(string option, object value, RegistryValueKind valueKi
///
/// Name of the key.
/// Use the Uninstall Registry key instead.
+ /// Use the CurrentUser Registry key instead.
/// The value of the key if it exists, otherwise null.
- public static string GetKey(string option, bool isUninstall = false)
+ public static string GetKey(string option, bool isUninstall = false, bool userSetting = false)
{
try
{
- using var key = isUninstall
- ? Registry.LocalMachine.OpenSubKey(UninstallRegistryPath)
- : Registry.LocalMachine.OpenSubKey(RegistryPath);
+ RegistryKey? key;
+ if (userSetting)
+ {
+ key = Registry.CurrentUser.OpenSubKey(RegistryPath);
+ }
+ else if (isUninstall)
+ {
+ key = Registry.LocalMachine.OpenSubKey(UninstallRegistryPath);
+ }
+ else
+ {
+ key = Registry.LocalMachine.OpenSubKey(RegistryPath);
+ }
if (key != null)
{
var value = key.GetValue(option);
@@ -132,16 +457,16 @@ public static string GetKey(string option, bool isUninstall = false)
{
return value.ToString()!;
}
- Console.WriteLine($"Value for key '{option}' not found in the registry.");
+ Logging.Log($"Value for key '{option}' not found in the registry.", Logging.LogLevel.ERROR);
return "";
}
}
catch (Exception ex)
{
- Console.WriteLine("An error has occurred while reading the registry: " + ex.Message);
+ Logging.Log($"An error has occurred while reading the registry: {ex.Message}", Logging.LogLevel.ERROR);
return "";
}
- Console.WriteLine($"Registry key '{RegistryPath}' not found.");
+ Logging.Log($"Registry key '{RegistryPath}' not found.", Logging.LogLevel.ERROR);
return "";
}
@@ -149,14 +474,25 @@ public static string GetKey(string option, bool isUninstall = false)
/// Removes a Key in the Registry
///
/// Key Name
- /// Use the Uninstall Registry key instead.
- public static bool RemoveKey(string option, bool isUninstall = false)
+ /// Use the Uninstall Registry key instead.
+ /// Use the CurrentUser Registry key instead.
+ public static bool RemoveKey(string option, bool isUninstall = false, bool userSetting = false)
{
try
{
- using var key = isUninstall
- ? Registry.LocalMachine.OpenSubKey(UninstallRegistryPath)
- : Registry.LocalMachine.OpenSubKey(RegistryPath);
+ RegistryKey? key;
+ if (userSetting)
+ {
+ key = Registry.CurrentUser.OpenSubKey(RegistryPath, RegistryKeyPermissionCheck.ReadWriteSubTree);
+ }
+ else if (isUninstall)
+ {
+ key = Registry.LocalMachine.OpenSubKey(UninstallRegistryPath, RegistryKeyPermissionCheck.ReadWriteSubTree);
+ }
+ else
+ {
+ key = Registry.LocalMachine.OpenSubKey(RegistryPath, RegistryKeyPermissionCheck.ReadWriteSubTree);
+ }
var value = key?.GetValue(option);
if (value != null)
{
@@ -167,7 +503,7 @@ public static bool RemoveKey(string option, bool isUninstall = false)
}
catch (Exception ex)
{
- Console.WriteLine("An error has occurred while removing a key from the registry: " + ex.Message);
+ Logging.Log("An error has occurred while removing a key from the registry: " + ex.Message, Logging.LogLevel.ERROR);
}
return false;
@@ -177,21 +513,32 @@ public static bool RemoveKey(string option, bool isUninstall = false)
/// Removes a SubKey in the Registry
///
/// SubKey Name
- /// Use the Uninstall Registry key instead.
- public static bool RemoveSubKey(string option, bool isUninstall = false)
+ /// Use the Uninstall Registry key instead.
+ /// Use the CurrentUser Registry key instead.
+ public static bool RemoveSubKey(string option, bool isUninstall = false, bool userSetting = false)
{
try
{
- using var key = isUninstall
- ? Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall", true)
- : Registry.LocalMachine.OpenSubKey(RegistryPath, true);
+ RegistryKey? key;
+ if (userSetting)
+ {
+ key = Registry.CurrentUser.OpenSubKey(RegistryPath, true);
+ }
+ else if (isUninstall)
+ {
+ key = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall", true);
+ }
+ else
+ {
+ key = Registry.LocalMachine.OpenSubKey(RegistryPath, RegistryKeyPermissionCheck.ReadWriteSubTree);
+ }
key?.DeleteSubKey(option);
key?.Close();
return true;
}
catch (Exception ex)
{
- Console.WriteLine("An error has occurred while removing a subkey from the registry: " + ex.Message);
+ Logging.Log("An error has occurred while removing a subkey from the registry: " + ex.Message, Logging.LogLevel.ERROR);
}
return false;
diff --git a/GoAwayEdge/Common/Debugging/DebugMessage.cs b/GoAwayEdge/Common/Debugging/DebugMessage.cs
new file mode 100644
index 0000000..8c02d37
--- /dev/null
+++ b/GoAwayEdge/Common/Debugging/DebugMessage.cs
@@ -0,0 +1,17 @@
+namespace GoAwayEdge.Common.Debugging
+{
+ internal class DebugMessage
+ {
+ ///
+ /// Displays a debug message if the application is in debug mode.
+ ///
+ /// The title of the debug message.
+ /// The content of the debug message.
+ public static void DisplayDebugMessage(string title, string message)
+ {
+ if (!App.IsDebug) return;
+ var w = new MessageUi(title, message, "OK", isMainThread: true);
+ w.ShowDialog();
+ }
+ }
+}
diff --git a/GoAwayEdge/Common/Debugging/Logging.cs b/GoAwayEdge/Common/Debugging/Logging.cs
new file mode 100644
index 0000000..b58f51b
--- /dev/null
+++ b/GoAwayEdge/Common/Debugging/Logging.cs
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2021 Exploitox Team
+ *
+ * Module Name:
+ * Logging.cs
+ *
+ * Description:
+ * This class is responsible for initializing the logging system.
+ *
+ * Author:
+ * Jonas Günner (valnoxy) 20-Sep-2021
+ *
+ * Notes:
+ * Backported from: https://git.heydu.net/valnoxy/xorieos/-/blob/main/srv03rtm/base/ntsetup/winnt32/modernsetup/common/logging.cs
+ */
+
+using System.Diagnostics;
+using System.IO;
+using System.Reflection;
+
+namespace GoAwayEdge.Common.Debugging
+{
+ internal class Logging
+ {
+ private static readonly string LogPath = Path.Combine(Path.GetTempPath(), "GoAwayEdge", "Logs");
+ private static string? _logFile;
+
+ internal enum LogLevel { INFO, ERROR, WARNING }
+
+ public static void Initialize()
+ {
+ // Ensure the log directory exists
+ if (!Directory.Exists(LogPath))
+ {
+ Directory.CreateDirectory(LogPath);
+ }
+
+ // Fetching the current log file
+ _logFile = Path.Combine(LogPath, $"log_{DateTime.Now:yyyy-MM-dd}.txt");
+
+ var version = Assembly.GetExecutingAssembly().GetName().Version!;
+ Log($"GoAwayEdge {version.Major}.{version.Minor}.{version.Build} (Build {version.Revision})");
+ Log("Logging system initialized");
+
+ // Delete old log files
+ DeleteOldLogFiles();
+ }
+
+ public static void Log(string message, LogLevel level = LogLevel.INFO)
+ {
+ if (string.IsNullOrEmpty(_logFile))
+ throw new Exception("Logging class not initialized!");
+
+ // Get calling method information
+ var stackTrace = new StackTrace();
+ var callingMethod = stackTrace.GetFrame(1)?.GetMethod();
+ var callingClass = callingMethod?.DeclaringType?.FullName ?? "UnknownClass";
+ var methodName = callingMethod?.Name ?? "UnknownMethod";
+
+ // Construct the log message with calling class and method
+ var logMessage = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss} - {level} - {callingClass}.{methodName} - {message}";
+
+ using (var fileStream = new FileStream(_logFile, FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
+ using (var writer = new StreamWriter(fileStream))
+ {
+ writer.WriteLine(logMessage);
+ }
+
+ // Output log message to Debug console
+ System.Diagnostics.Debug.WriteLine(logMessage);
+ }
+
+ private static void DeleteOldLogFiles()
+ {
+ var logFiles = Directory.GetFiles(LogPath, "log_*.txt");
+ foreach (var logFile in logFiles)
+ {
+ var creationTime = File.GetCreationTime(logFile);
+ if (creationTime < DateTime.Now.AddDays(-7))
+ {
+ File.Delete(logFile);
+ Log("Deleted old log file: " + logFile);
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/GoAwayEdge/Common/InstallRoutine.cs b/GoAwayEdge/Common/Installation/InstallRoutine.cs
similarity index 80%
rename from GoAwayEdge/Common/InstallRoutine.cs
rename to GoAwayEdge/Common/Installation/InstallRoutine.cs
index c446a43..0d2cbeb 100644
--- a/GoAwayEdge/Common/InstallRoutine.cs
+++ b/GoAwayEdge/Common/Installation/InstallRoutine.cs
@@ -1,13 +1,14 @@
-using Microsoft.Win32.TaskScheduler;
-using Microsoft.Win32;
-using System.ComponentModel;
+using System.ComponentModel;
using System.Diagnostics;
using System.IO;
-using System.Windows;
-using System.Runtime.InteropServices;
using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Windows;
+using GoAwayEdge.Common.Debugging;
+using Microsoft.Win32;
+using Microsoft.Win32.TaskScheduler;
-namespace GoAwayEdge.Common
+namespace GoAwayEdge.Common.Installation
{
public partial class InstallRoutine
{
@@ -18,7 +19,7 @@ public partial class Shell32
public static partial void SHChangeNotify(uint wEventId, uint uFlags, IntPtr dwItem1, IntPtr dwItem2);
}
- public static void Install(object? sender, DoWorkEventArgs? e = null)
+ public static int Install(object? sender, DoWorkEventArgs? e = null)
{
var worker = sender as BackgroundWorker;
@@ -39,7 +40,7 @@ public static void Install(object? sender, DoWorkEventArgs? e = null)
messageUi.ShowDialog();
});
Environment.Exit(1);
- return;
+ return 1;
}
// Apply registry key
@@ -71,6 +72,28 @@ public static void Install(object? sender, DoWorkEventArgs? e = null)
RegistryConfig.RemoveKey("CustomQueryUrl");
}
+ RegistryConfig.SetKey("AiProvider", Configuration.AiProvider, userSetting: true);
+ if (Configuration.AiProvider == AiProvider.Custom)
+ {
+ if (Configuration.CustomAiProviderUrl != null)
+ RegistryConfig.SetKey("CustomAiProviderUrl", Configuration.CustomAiProviderUrl, userSetting: true);
+ }
+ else
+ {
+ RegistryConfig.RemoveKey("CustomAiProviderUrl", userSetting: true);
+ }
+
+ RegistryConfig.SetKey("WeatherProvider", Configuration.WeatherProvider, userSetting: true);
+ if (Configuration.WeatherProvider == WeatherProvider.Custom)
+ {
+ if (Configuration.CustomWeatherProviderUrl != null)
+ RegistryConfig.SetKey("CustomWeatherProviderUrl", Configuration.CustomWeatherProviderUrl, userSetting: true);
+ }
+ else
+ {
+ RegistryConfig.RemoveKey("CustomWeatherProviderUrl", userSetting: true);
+ }
+
status = Register.ImageFileExecutionOption(
Register.IfeoType.msedge,
Path.Combine(Configuration.InstallDir, "GoAwayEdge.exe"),
@@ -85,7 +108,7 @@ public static void Install(object? sender, DoWorkEventArgs? e = null)
messageUi.ShowDialog();
});
Environment.Exit(1);
- return;
+ return 1;
}
}
catch (Exception ex)
@@ -98,9 +121,13 @@ public static void Install(object? sender, DoWorkEventArgs? e = null)
messageUi.ShowDialog();
});
Environment.Exit(1);
- return;
+ return 1;
}
+ // Kill Microsoft Edge processes
+ KillProcess("msedge");
+ KillProcess("msedge_non_ifeo");
+
if (Configuration.UninstallEdge)
{
FileConfiguration.EdgePath = msEdge;
@@ -115,7 +142,7 @@ public static void Install(object? sender, DoWorkEventArgs? e = null)
messageUi.ShowDialog();
});
Environment.Exit(1);
- return;
+ return 1;
}
}
else if (!Configuration.NoEdgeInstalled)
@@ -136,7 +163,7 @@ public static void Install(object? sender, DoWorkEventArgs? e = null)
messageUi.ShowDialog();
});
Environment.Exit(1);
- return;
+ return 1;
}
}
@@ -148,6 +175,10 @@ public static void Install(object? sender, DoWorkEventArgs? e = null)
{
ts.RootFolder.DeleteTask("valnoxy\\GoAwayEdge\\GoAwayEdge IFEO Validation");
}
+ catch (FileNotFoundException)
+ {
+ Logging.Log("Old Task not found, skipping ...");
+ }
catch (Exception ex)
{
Logging.Log("Failed to delete old task: " + ex, Logging.LogLevel.ERROR);
@@ -170,7 +201,7 @@ public static void Install(object? sender, DoWorkEventArgs? e = null)
messageUi.ShowDialog();
});
Environment.Exit(1);
- return;
+ return 1;
}
// Register Uninstall data
@@ -185,16 +216,29 @@ public static void Install(object? sender, DoWorkEventArgs? e = null)
messageUi.ShowDialog();
});
Environment.Exit(1);
- return;
+ return 1;
}
+ // Create Shortcut for Control Panel
+ if (Configuration.InstallControlPanel)
+ {
+ var shortcutPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
+ "Microsoft", "Windows", "Start Menu", "Programs", "GoAwayEdge.lnk");
+ Shortcut.Create(Path.Combine(Configuration.InstallDir, "GoAwayEdge.exe"), "--control-panel", shortcutPath);
+ RegistryConfig.SetKey("ControlPanelIsInstalled", true);
+ }
+
+ // Set enable flag
+ RegistryConfig.SetKey("Enabled", true);
+
// Switch FrameWindow content to InstallationSuccess
worker?.ReportProgress(100, "");
Logging.Log("Installation finished.");
Console.WriteLine("Installation finished.");
+ return 0;
}
- public static void Uninstall(object? sender, DoWorkEventArgs? e = null)
+ public static int Uninstall(object? sender, DoWorkEventArgs? e = null)
{
var worker = sender as BackgroundWorker;
Logging.Log("Start uninstallation ...");
@@ -217,7 +261,7 @@ public static void Uninstall(object? sender, DoWorkEventArgs? e = null)
messageUi.ShowDialog();
});
Environment.Exit(1);
- return;
+ return 1;
}
Process.Start(new ProcessStartInfo
{
@@ -225,7 +269,7 @@ public static void Uninstall(object? sender, DoWorkEventArgs? e = null)
Arguments = "-u",
UseShellExecute = true
});
- Environment.Exit(0);
+ Environment.Exit(3010);
}
// Remove installation directory
@@ -244,7 +288,29 @@ public static void Uninstall(object? sender, DoWorkEventArgs? e = null)
messageUi.ShowDialog();
});
Environment.Exit(1);
- return;
+ return 1;
+ }
+
+ // Remove user directory
+ try
+ {
+ if (Directory.Exists(Configuration.UserDir))
+ {
+ var dir = new DirectoryInfo(Configuration.UserDir);
+ dir.Delete(true);
+ }
+ }
+ catch (Exception ex)
+ {
+ Logging.Log("Failed to delete user directory: " + ex, Logging.LogLevel.ERROR);
+ Application.Current.Dispatcher.Invoke(() =>
+ {
+ var errorMessage = LocalizationManager.LocalizeValue("FailedUninstallation", ex.Message);
+ var messageUi = new MessageUi("GoAwayEdge", errorMessage, "OK");
+ messageUi.ShowDialog();
+ });
+ Environment.Exit(1);
+ return 1;
}
// Remove Ifeo & Uri handler from registry
@@ -277,6 +343,11 @@ public static void Uninstall(object? sender, DoWorkEventArgs? e = null)
@"SOFTWARE\valnoxy", true);
generalKey?.DeleteSubKeyTree("GoAwayEdge");
generalKey?.Close();
+
+ var currentUserKey = Registry.CurrentUser.OpenSubKey(
+ @"SOFTWARE\valnoxy", true);
+ currentUserKey?.DeleteSubKeyTree("GoAwayEdge");
+ currentUserKey?.Close();
}
catch (Exception ex)
{
@@ -288,7 +359,7 @@ public static void Uninstall(object? sender, DoWorkEventArgs? e = null)
messageUi.ShowDialog();
});
Environment.Exit(1);
- return;
+ return 1;
}
// Clean up Task Scheduler
@@ -322,10 +393,16 @@ public static void Uninstall(object? sender, DoWorkEventArgs? e = null)
Logging.Log("Failed to remove uninstall data: " + ex, Logging.LogLevel.ERROR);
}
+ // Remove Control Panel shortcut if exists
+ var shortcutPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
+ "Microsoft", "Windows", "Start Menu", "Programs", "GoAwayEdge.lnk");
+ if (File.Exists(shortcutPath)) File.Delete(shortcutPath);
+
// Switch FrameWindow content to InstallationSuccess
worker?.ReportProgress(100, "");
Logging.Log("Uninstallation finished.");
Console.WriteLine("Uninstallation finished.");
+ return 0;
}
internal static bool CopyItself(string pathTo, bool overwrite = false)
@@ -342,9 +419,15 @@ internal static bool CopyItself(string pathTo, bool overwrite = false)
}
}
- catch (Exception e)
+ catch (Exception ex)
{
- MessageBox.Show(e.ToString());
+ Logging.Log("Failed to copy itself: " + ex, Logging.LogLevel.ERROR);
+ Application.Current.Dispatcher.Invoke(() =>
+ {
+ var errorMessage = LocalizationManager.LocalizeValue("FailedInstallation", ex.Message);
+ var messageUi = new MessageUi("GoAwayEdge", errorMessage, "OK");
+ messageUi.ShowDialog();
+ });
return false;
}
@@ -375,6 +458,15 @@ internal static bool SetUninstallData()
return false;
}
}
+
+ internal static void KillProcess(string processName)
+ {
+ var processes = Process.GetProcessesByName(processName);
+ foreach (var process in processes)
+ {
+ process.Kill();
+ }
+ }
}
public class Register
diff --git a/GoAwayEdge/Common/Removal.cs b/GoAwayEdge/Common/Installation/Removal.cs
similarity index 91%
rename from GoAwayEdge/Common/Removal.cs
rename to GoAwayEdge/Common/Installation/Removal.cs
index 2ed7b80..f728b61 100644
--- a/GoAwayEdge/Common/Removal.cs
+++ b/GoAwayEdge/Common/Installation/Removal.cs
@@ -1,390 +1,409 @@
-using System.Diagnostics;
-using System.IO;
-using Microsoft.Win32;
-
-namespace GoAwayEdge.Common
-{
- public class Removal
- {
- ///
- /// Removes Microsoft Edge completely from the system.
- ///
- ///
- /// Result of the removal as boolean.
- ///
- public static bool RemoveMsEdge()
- {
- //
- // Ok, this should be stable now. Current plan:
- //
- // 1. Remove Edge via edge setup (setup.exe --uninstall --system-level --verbose-logging --force-uninstall)
- // 2. Prevent Edge from reinstalling
- // 3. Recreate the URI protocol
- //
- // This way should left WebView2 etc in tact.
- //
- Logging.Log("Removing Microsoft Edge ...");
-
- string edgeSetupPath;
- string edgeNewestVersionPath;
- if (!Directory.Exists(Path.GetDirectoryName(FileConfiguration.EdgePath)))
- return false;
-
- var subDirectories = Directory.GetDirectories(Path.GetDirectoryName(FileConfiguration.EdgePath)!);
- var validDirectories = subDirectories
- .Where(dir => Version.TryParse(Path.GetFileName(dir), out _))
- .ToList();
-
- if (validDirectories.Any())
- {
- var sortedDirectories = validDirectories
- .Select(dir => new
- {
- DirectoryPath = dir,
- Version = new Version(Path.GetFileName(dir))
- })
- .OrderByDescending(x => x.Version);
-
- var newestDirectory = sortedDirectories.FirstOrDefault();
- edgeNewestVersionPath = newestDirectory!.DirectoryPath;
- edgeSetupPath = Path.Combine(newestDirectory!.DirectoryPath, "Installer", "setup.exe");
- }
- else
- {
- Logging.Log("Removal aborted: Edge was not found on this system.", Logging.LogLevel.WARNING);
- return false; // Edge is already removed
- }
-
- // Terminate processes
- Logging.Log("Terminating Edge processes ...");
- KillProcess("MicrosoftEdge");
- KillProcess("chredge");
- KillProcess("msedge");
- KillProcess("MicrosoftEdgeUpdate");
- KillProcess("edge");
-
- // Clean up registry
- Logging.Log("Cleaning up registry ...");
- RemoveRegistryKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\msedge.exe");
- RemoveRegistryKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\ie_to_edge_stub.exe");
- RemoveUserRegistryKey(@"Software\Classes\microsoft-edge");
- RemoveUserRegistryKey(@"Software\Classes\MSEdgeHTM");
-
- // Write temporary URI handler into the registry
- var status = Register.UriHandler(Register.UriType.microsoftEdge,
- $"\"{FileConfiguration.EdgePath}\" \" --single-argument %1\"");
- if (!status)
- {
- Logging.Log("Failed to register URI handler for Microsoft Edge.", Logging.LogLevel.ERROR);
- return false;
- }
-
- status = Register.UriHandler(Register.UriType.EdgeHTM,
- $"\"{FileConfiguration.EdgePath}\" \" --single-argument %1\"");
- if (!status)
- {
- Logging.Log("Failed to register URI handler for EdgeHTM.", Logging.LogLevel.ERROR);
- return false;
- }
-
- // Remove certain registry properties
- try
- {
- string[] registryPaths = { "SOFTWARE\\Policies", "SOFTWARE", "SOFTWARE\\WOW6432Node" };
- string[] edgeProperties =
- {
- "InstallDefault", "Install{56EB18F8-B008-4CBD-B6D2-8C97FE7E9062",
- "Install{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}"
- };
-
- foreach (var path in registryPaths)
- {
- using var key = Registry.LocalMachine.OpenSubKey($@"{path}\Microsoft\EdgeUpdate", true);
- if (key == null) continue;
- foreach (var prop in edgeProperties)
- {
- key.DeleteValue(prop, false);
- }
- }
-
- const string edgeUpdate = @"Microsoft\EdgeUpdate\Clients\{56EB18F8-B008-4CBD-B6D2-8C97FE7E9062}";
- string[] onActions = { "on-os-upgrade", "on-logon", "on-logon-autolaunch", "on-logon-startup-boost" };
- string[] registryBases = { "SOFTWARE", "SOFTWARE\\Wow6432Node" };
-
- foreach (var baseKey in registryBases)
- {
- foreach (var launch in onActions)
- {
- RemoveRegistryKey($@"HKLM\{baseKey}\{edgeUpdate}\Commands\{launch}");
- }
- }
-
- registryPaths = new[] { "HKEY_CURRENT_USER", "HKEY_LOCAL_MACHINE" };
- string[] nodes = { "", "\\Wow6432Node" };
- string[] removeWin32 = { "Microsoft Edge", "Microsoft Edge Update" };
-
- foreach (var regPath in registryPaths)
- {
- foreach (var node in nodes)
- {
- foreach (var i in removeWin32)
- {
- var uninstallPath = $@"{regPath}\SOFTWARE{node}\Microsoft\Windows\CurrentVersion\Uninstall\{i}";
-
- using (var key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64))
- {
- using var uninstallKey = key.OpenSubKey(uninstallPath, true);
- uninstallKey?.DeleteValue("NoRemove", false);
- }
- var edgeUpdateDevKey = Registry.LocalMachine.CreateSubKey($@"SOFTWARE{node}\Microsoft\EdgeUpdateDev");
- edgeUpdateDevKey.SetValue("AllowUninstall", 1, RegistryValueKind.DWord);
- }
- }
- }
- }
- catch
- {
- Logging.Log("Failed to remove certain registry properties.", Logging.LogLevel.ERROR);
- return false;
- }
-
- // Find and copy ie_to_edge_stub.exe
- var ieToEdgeStubFile = Path.Combine(edgeNewestVersionPath, "BHO", "ie_to_edge_stub.exe");
- if (File.Exists(ieToEdgeStubFile))
- {
- try
- {
- File.Copy(ieToEdgeStubFile, Path.Combine(Configuration.InstallDir, "ie_to_edge_stub.exe"), true);
- }
- catch
- {
- Logging.Log("Failed to copy ie_to_edge_stub.exe.", Logging.LogLevel.ERROR);
- return false;
- }
- }
- else
- {
- Logging.Log("ie_to_edge_stub.exe not found.", Logging.LogLevel.ERROR);
- return false;
- }
-
- // AppX Removal
- const string removeAppX = "MicrosoftEdge";
- const string storePath = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore";
- string[] userSids = { "S-1-5-18" };
- var packageFullNameList = new List();
-
- try
- {
- if (Registry.LocalMachine.OpenSubKey(storePath) != null)
- {
- var subKeyNames = Registry.LocalMachine.OpenSubKey(storePath)!.GetSubKeyNames();
- foreach (var subKeyName in subKeyNames)
- {
- if (!subKeyName.Contains("S-1-5-21")) continue;
- userSids = userSids.Append(subKeyName).ToArray();
-
- var userKey = Registry.LocalMachine.OpenSubKey($"{storePath}\\{subKeyName}", false);
- if (userKey == null) continue;
- var subkeyNames = userKey.GetSubKeyNames();
- foreach (var subkeyName in subkeyNames)
- {
- if (subkeyName.Contains(removeAppX) && !packageFullNameList.Contains(subkeyName))
- {
- packageFullNameList.Add(subkeyName);
- }
- }
- }
- }
- }
- catch
- {
- Logging.Log("Failed to remove AppX packages.", Logging.LogLevel.ERROR);
- return false;
- }
-
- // Removing Edge (+ Updater)
- var timeoutStopwatch = new Stopwatch();
- var programFiles = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86);
- var edgeUpdatePath = Path.Combine(programFiles, "Microsoft", "EdgeUpdate", "MicrosoftEdgeUpdate.exe");
-
- try
- {
- if (File.Exists(edgeUpdatePath))
- {
- using (var proc = new Process()) // Remove Edge Updater
- {
- var psi = new ProcessStartInfo
- {
- FileName = edgeUpdatePath,
- Arguments = "/uninstall",
- };
- proc.StartInfo = psi;
- proc.Start();
- proc.WaitForExit();
-
- timeoutStopwatch.Start();
- while (timeoutStopwatch.Elapsed.TotalSeconds < 60 &&
- (IsProcessRunning("MicrosoftEdgeUpdate") || IsEdgeProcessRunning()))
- {
- Thread.Sleep(3000);
- }
-
- timeoutStopwatch.Stop();
- if (timeoutStopwatch.Elapsed.TotalSeconds >= 60)
- return false; // Timeout
- if (proc.ExitCode != 0 && proc.ExitCode != 19)
- return false; // Unknown error?
- }
-
- using (var proc = new Process()) // Remove Edge via setup file
- {
- var psi = new ProcessStartInfo
- {
- FileName = edgeSetupPath,
- Arguments = "--uninstall --msedge --system-level --verbose-logging --force-uninstall",
- RedirectStandardOutput = true
- };
- proc.StartInfo = psi;
- proc.Start();
- proc.WaitForExit();
-
- timeoutStopwatch.Start();
- while (timeoutStopwatch.Elapsed.TotalSeconds < 60 &&
- (IsProcessRunning("setup") || IsEdgeProcessRunning()))
- {
- Thread.Sleep(3000);
- }
-
- timeoutStopwatch.Stop();
- if (timeoutStopwatch.Elapsed.TotalSeconds >= 60)
- return false; // Timeout
- if (proc.ExitCode != 0 && proc.ExitCode != 19)
- return false; // Unknown error?
- }
- }
- }
- catch (Exception ex)
- {
- Logging.Log("Exception: " + ex, Logging.LogLevel.ERROR);
- return false;
- }
-
- // Prevent Edge from reinstalling
- try
- {
- using var baseKey = Registry.LocalMachine;
- using var key = baseKey.OpenSubKey(@"SOFTWARE\Microsoft", true) ??
- baseKey.CreateSubKey(@"SOFTWARE\Microsoft");
- using var edgeUpdate = key.CreateSubKey("EdgeUpdate");
- edgeUpdate.SetValue("DoNotUpdateToEdgeWithChromium", 1, RegistryValueKind.DWord);
- }
- catch (Exception ex)
- {
- Logging.Log("Failed to prevent Edge from reinstalling: " + ex, Logging.LogLevel.ERROR);
- return false;
- }
-
- // Register new URIs
- status = Register.UriHandler(Register.UriType.microsoftEdge,
- $"\"{Path.Combine(Configuration.InstallDir, "ie_to_edge_stub.exe")}\" \"%1\"");
- if (!status)
- {
- Logging.Log("Failed to register URI handler for Microsoft Edge.", Logging.LogLevel.ERROR);
- return false;
- }
-
- status = Register.UriHandler(Register.UriType.EdgeHTM,
- $"\"{Path.Combine(Configuration.InstallDir, "ie_to_edge_stub.exe")}\" \"%1\"");
- if (!status)
- {
- Logging.Log("Failed to register URI handler for EdgeHTM.", Logging.LogLevel.ERROR);
- return false;
- }
-
- status = Register.ImageFileExecutionOption(
- Register.IfeoType.ie_to_edge_stub,
- Path.Combine(Configuration.InstallDir, "GoAwayEdge.exe"),
- Path.Combine(Configuration.InstallDir, "ie_to_edge_stub.exe"));
-
- if (!status)
- {
- Logging.Log("Failed to register Image File Execution Option for ie_to_edge_stub.", Logging.LogLevel.ERROR);
- return false;
- }
-
- // Set registry config
- RegistryConfig.SetKey("NoEdgeInstalled", true);
-
- Logging.Log("Microsoft Edge has been removed successfully.");
- return true;
- }
-
- ///
- /// Terminate the specific process.
- ///
- ///
- /// Result of the termination as boolean.
- ///
- public static bool KillProcess(string processName)
- {
- try
- {
- foreach (var process in Process.GetProcessesByName(processName))
- {
- process.Kill();
- }
-
- return true;
- }
- catch (Exception ex)
- {
- Logging.Log($"Failed to kill process {processName}: {ex}", Logging.LogLevel.ERROR);
- return false;
- }
- }
-
- private static bool IsProcessRunning(string processName)
- {
- var processes = Process.GetProcessesByName(processName);
- return processes.Length > 0;
- }
-
- private static bool IsEdgeProcessRunning()
- {
- var processes = Process.GetProcesses();
- return processes.Any(process => process.ProcessName.StartsWith("MicrosoftEdge", StringComparison.OrdinalIgnoreCase) && process.MainModule != null && process.MainModule.FileName.Contains("\\Microsoft\\Edge"));
- }
-
- private static void RemoveRegistryKey(string keyPath)
- {
- using var key = Registry.LocalMachine.OpenSubKey(keyPath, true);
- if (key != null)
- {
- Registry.LocalMachine.DeleteSubKeyTree(keyPath, false);
- }
- }
-
- private static void RemoveUserRegistryKey(string keyPath)
- {
- try
- {
- var users = Registry.Users.GetSubKeyNames();
- foreach (var userSid in users)
- {
- using var userKey = Registry.Users.OpenSubKey(userSid);
- using var key = userKey?.OpenSubKey(keyPath, true);
- if (key != null)
- {
- userKey!.DeleteSubKeyTree(keyPath, false);
- }
- }
- }
- catch (Exception ex)
- {
- Logging.Log($"Exception while removing registry key: {ex}");
- Debug.WriteLine($"Exception while removing registry key: {ex.Message}");
- }
- }
- }
-}
+using System.Diagnostics;
+using System.IO;
+using GoAwayEdge.Common.Debugging;
+using Microsoft.Win32;
+
+namespace GoAwayEdge.Common.Installation
+{
+ public class Removal
+ {
+ ///
+ /// Removes Microsoft Edge completely from the system.
+ ///
+ ///
+ /// Result of the removal as boolean.
+ ///
+ public static bool RemoveMsEdge()
+ {
+ //
+ // Ok, this should be stable now. Current plan:
+ //
+ // 1. Remove Edge via edge setup (setup.exe --uninstall --system-level --verbose-logging --force-uninstall)
+ // 2. Prevent Edge from reinstalling
+ // 3. Recreate the URI protocol
+ //
+ // This way should left WebView2 etc in tact.
+ //
+ Logging.Log("Removing Microsoft Edge ...");
+
+ string edgeSetupPath;
+ string edgeNewestVersionPath;
+ if (!Directory.Exists(Path.GetDirectoryName(FileConfiguration.EdgePath)))
+ return false;
+
+ var subDirectories = Directory.GetDirectories(Path.GetDirectoryName(FileConfiguration.EdgePath)!);
+ var validDirectories = subDirectories
+ .Where(dir => Version.TryParse(Path.GetFileName(dir), out _))
+ .ToList();
+
+ if (validDirectories.Any())
+ {
+ var sortedDirectories = validDirectories
+ .Select(dir => new
+ {
+ DirectoryPath = dir,
+ Version = new Version(Path.GetFileName(dir))
+ })
+ .OrderByDescending(x => x.Version);
+
+ var newestDirectory = sortedDirectories.FirstOrDefault();
+ edgeNewestVersionPath = newestDirectory!.DirectoryPath;
+ edgeSetupPath = Path.Combine(newestDirectory!.DirectoryPath, "Installer", "setup.exe");
+ }
+ else
+ {
+ Logging.Log("Removal aborted: Edge was not found on this system.", Logging.LogLevel.WARNING);
+ return false; // Edge is already removed
+ }
+
+ // Terminate processes
+ Logging.Log("Terminating Edge processes ...");
+ KillProcess("MicrosoftEdge");
+ KillProcess("chredge");
+ KillProcess("msedge");
+ KillProcess("MicrosoftEdgeUpdate");
+ KillProcess("edge");
+
+ // Clean up registry
+ Logging.Log("Cleaning up registry ...");
+ RemoveRegistryKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\msedge.exe");
+ RemoveRegistryKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\ie_to_edge_stub.exe");
+ RemoveUserRegistryKey(@"Software\Classes\microsoft-edge");
+ RemoveUserRegistryKey(@"Software\Classes\MSEdgeHTM");
+
+ // Write temporary URI handler into the registry
+ var status = Register.UriHandler(Register.UriType.microsoftEdge,
+ $"\"{FileConfiguration.EdgePath}\" \" --single-argument %1\"");
+ if (!status)
+ {
+ Logging.Log("Failed to register URI handler for Microsoft Edge.", Logging.LogLevel.ERROR);
+ return false;
+ }
+
+ status = Register.UriHandler(Register.UriType.EdgeHTM,
+ $"\"{FileConfiguration.EdgePath}\" \" --single-argument %1\"");
+ if (!status)
+ {
+ Logging.Log("Failed to register URI handler for EdgeHTM.", Logging.LogLevel.ERROR);
+ return false;
+ }
+
+ // Remove certain registry properties
+ try
+ {
+ string[] registryPaths = { "SOFTWARE\\Policies", "SOFTWARE", "SOFTWARE\\WOW6432Node" };
+ string[] edgeProperties =
+ {
+ "InstallDefault", "Install{56EB18F8-B008-4CBD-B6D2-8C97FE7E9062",
+ "Install{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}"
+ };
+
+ foreach (var path in registryPaths)
+ {
+ using var key = Registry.LocalMachine.OpenSubKey($@"{path}\Microsoft\EdgeUpdate", true);
+ if (key == null) continue;
+ foreach (var prop in edgeProperties)
+ {
+ key.DeleteValue(prop, false);
+ }
+ }
+
+ const string edgeUpdate = @"Microsoft\EdgeUpdate\Clients\{56EB18F8-B008-4CBD-B6D2-8C97FE7E9062}";
+ string[] onActions = { "on-os-upgrade", "on-logon", "on-logon-autolaunch", "on-logon-startup-boost" };
+ string[] registryBases = { "SOFTWARE", "SOFTWARE\\Wow6432Node" };
+
+ foreach (var baseKey in registryBases)
+ {
+ foreach (var launch in onActions)
+ {
+ RemoveRegistryKey($@"HKLM\{baseKey}\{edgeUpdate}\Commands\{launch}");
+ }
+ }
+
+ registryPaths = new[] { "HKEY_CURRENT_USER", "HKEY_LOCAL_MACHINE" };
+ string[] nodes = { "", "\\Wow6432Node" };
+ string[] removeWin32 = { "Microsoft Edge", "Microsoft Edge Update" };
+
+ foreach (var regPath in registryPaths)
+ {
+ foreach (var node in nodes)
+ {
+ foreach (var i in removeWin32)
+ {
+ var uninstallPath = $@"{regPath}\SOFTWARE{node}\Microsoft\Windows\CurrentVersion\Uninstall\{i}";
+
+ using (var key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64))
+ {
+ using var uninstallKey = key.OpenSubKey(uninstallPath, true);
+ uninstallKey?.DeleteValue("NoRemove", false);
+ }
+ var edgeUpdateDevKey = Registry.LocalMachine.CreateSubKey($@"SOFTWARE{node}\Microsoft\EdgeUpdateDev");
+ edgeUpdateDevKey.SetValue("AllowUninstall", 1, RegistryValueKind.DWord);
+ var edgeUpdateKey = Registry.LocalMachine.CreateSubKey($@"SOFTWARE{node}\Microsoft\EdgeUpdate");
+ edgeUpdateKey.SetValue("AllowUninstall", 1, RegistryValueKind.DWord);
+ }
+ }
+ }
+ }
+ catch
+ {
+ Logging.Log("Failed to remove certain registry properties.", Logging.LogLevel.ERROR);
+ return false;
+ }
+
+ // Find and copy ie_to_edge_stub.exe
+ var ieToEdgeStubFile = Path.Combine(edgeNewestVersionPath, "BHO", "ie_to_edge_stub.exe");
+ if (File.Exists(ieToEdgeStubFile))
+ {
+ try
+ {
+ File.Copy(ieToEdgeStubFile, Path.Combine(Configuration.InstallDir, "ie_to_edge_stub.exe"), true);
+ }
+ catch
+ {
+ Logging.Log("Failed to copy ie_to_edge_stub.exe.", Logging.LogLevel.ERROR);
+ return false;
+ }
+ }
+ else
+ {
+ Logging.Log("ie_to_edge_stub.exe not found.", Logging.LogLevel.ERROR);
+ return false;
+ }
+
+ // AppX Removal
+ const string removeAppX = "MicrosoftEdge";
+ const string storePath = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore";
+ string[] userSids = { "S-1-5-18" };
+ var packageFullNameList = new List();
+
+ try
+ {
+ if (Registry.LocalMachine.OpenSubKey(storePath) != null)
+ {
+ var subKeyNames = Registry.LocalMachine.OpenSubKey(storePath)!.GetSubKeyNames();
+ foreach (var subKeyName in subKeyNames)
+ {
+ if (!subKeyName.Contains("S-1-5-21")) continue;
+ userSids = userSids.Append(subKeyName).ToArray();
+
+ var userKey = Registry.LocalMachine.OpenSubKey($"{storePath}\\{subKeyName}", false);
+ if (userKey == null) continue;
+ var subkeyNames = userKey.GetSubKeyNames();
+ foreach (var subkeyName in subkeyNames)
+ {
+ if (subkeyName.Contains(removeAppX) && !packageFullNameList.Contains(subkeyName))
+ {
+ packageFullNameList.Add(subkeyName);
+ }
+ }
+ }
+ }
+ }
+ catch
+ {
+ Logging.Log("Failed to remove AppX packages.", Logging.LogLevel.ERROR);
+ return false;
+ }
+
+ // Removing Edge (+ Updater)
+ var timeoutStopwatch = new Stopwatch();
+ var programFiles = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86);
+ var edgeUpdatePath = Path.Combine(programFiles, "Microsoft", "EdgeUpdate", "MicrosoftEdgeUpdate.exe");
+
+ try
+ {
+ if (File.Exists(edgeUpdatePath))
+ {
+ using (var proc = new Process()) // Remove Edge Updater
+ {
+ var psi = new ProcessStartInfo
+ {
+ FileName = edgeUpdatePath,
+ Arguments = "/uninstall",
+ };
+ proc.StartInfo = psi;
+ proc.Start();
+ proc.WaitForExit();
+
+ timeoutStopwatch.Start();
+ while (timeoutStopwatch.Elapsed.TotalSeconds < 60 &&
+ (IsProcessRunning("MicrosoftEdgeUpdate") || IsEdgeProcessRunning()))
+ {
+ Thread.Sleep(3000);
+ }
+
+ timeoutStopwatch.Stop();
+ if (timeoutStopwatch.Elapsed.TotalSeconds >= 60)
+ {
+ Logging.Log("Removal of Edge Updater failed: Timeout after 60 seconds.");
+ return false; // Timeout
+ }
+
+ if (proc.ExitCode != 0 && proc.ExitCode != 19)
+ {
+ Logging.Log($"Removal of Edge Updater failed: Unknown error has occurred (exited with error code {proc.ExitCode})");
+ return false; // Unknown error?
+ }
+ }
+
+ using (var proc = new Process()) // Remove Edge via setup file
+ {
+ const string removalArgs = "--uninstall --msedge --system-level --verbose-logging --force-uninstall";
+ var psi = new ProcessStartInfo
+ {
+ FileName = edgeSetupPath,
+ Arguments = removalArgs,
+ RedirectStandardOutput = true
+ };
+ Logging.Log($"Executing \"{edgeSetupPath}\" {removalArgs}");
+ proc.StartInfo = psi;
+ proc.Start();
+ proc.WaitForExit();
+
+ timeoutStopwatch.Start();
+ while (timeoutStopwatch.Elapsed.TotalSeconds < 60 &&
+ (IsProcessRunning("setup") || IsEdgeProcessRunning()))
+ {
+ Thread.Sleep(3000);
+ }
+
+ timeoutStopwatch.Stop();
+ if (timeoutStopwatch.Elapsed.TotalSeconds >= 60)
+ {
+ Logging.Log("Removal of Edge failed: Timeout after 60 seconds.");
+ return false; // Timeout
+ }
+
+ if (proc.ExitCode != 0 && proc.ExitCode != 19)
+ {
+ Logging.Log($"Removal of Edge via Setup file failed: Unknown error has occurred (exited with error code {proc.ExitCode})");
+ return false; // Unknown error?
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ Logging.Log("Exception: " + ex, Logging.LogLevel.ERROR);
+ return false;
+ }
+
+ // Prevent Edge from reinstalling
+ try
+ {
+ using var baseKey = Registry.LocalMachine;
+ using var key = baseKey.OpenSubKey(@"SOFTWARE\Microsoft", true) ??
+ baseKey.CreateSubKey(@"SOFTWARE\Microsoft");
+ using var edgeUpdate = key.CreateSubKey("EdgeUpdate");
+ edgeUpdate.SetValue("DoNotUpdateToEdgeWithChromium", 1, RegistryValueKind.DWord);
+ }
+ catch (Exception ex)
+ {
+ Logging.Log("Failed to prevent Edge from reinstalling: " + ex, Logging.LogLevel.ERROR);
+ return false;
+ }
+
+ // Register new URIs
+ status = Register.UriHandler(Register.UriType.microsoftEdge,
+ $"\"{Path.Combine(Configuration.InstallDir, "ie_to_edge_stub.exe")}\" \"%1\"");
+ if (!status)
+ {
+ Logging.Log("Failed to register URI handler for Microsoft Edge.", Logging.LogLevel.ERROR);
+ return false;
+ }
+
+ status = Register.UriHandler(Register.UriType.EdgeHTM,
+ $"\"{Path.Combine(Configuration.InstallDir, "ie_to_edge_stub.exe")}\" \"%1\"");
+ if (!status)
+ {
+ Logging.Log("Failed to register URI handler for EdgeHTM.", Logging.LogLevel.ERROR);
+ return false;
+ }
+
+ status = Register.ImageFileExecutionOption(
+ Register.IfeoType.ie_to_edge_stub,
+ Path.Combine(Configuration.InstallDir, "GoAwayEdge.exe"),
+ Path.Combine(Configuration.InstallDir, "ie_to_edge_stub.exe"));
+
+ if (!status)
+ {
+ Logging.Log("Failed to register Image File Execution Option for ie_to_edge_stub.", Logging.LogLevel.ERROR);
+ return false;
+ }
+
+ // Set registry config
+ RegistryConfig.SetKey("NoEdgeInstalled", true);
+
+ Logging.Log("Microsoft Edge has been removed successfully.");
+ return true;
+ }
+
+ ///
+ /// Terminate the specific process.
+ ///
+ ///
+ /// Result of the termination as boolean.
+ ///
+ public static bool KillProcess(string processName)
+ {
+ try
+ {
+ foreach (var process in Process.GetProcessesByName(processName))
+ {
+ process.Kill();
+ }
+
+ return true;
+ }
+ catch (Exception ex)
+ {
+ Logging.Log($"Failed to kill process {processName}: {ex}", Logging.LogLevel.ERROR);
+ return false;
+ }
+ }
+
+ private static bool IsProcessRunning(string processName)
+ {
+ var processes = Process.GetProcessesByName(processName);
+ return processes.Length > 0;
+ }
+
+ private static bool IsEdgeProcessRunning()
+ {
+ var processes = Process.GetProcesses();
+ return processes.Any(process => process.ProcessName.StartsWith("MicrosoftEdge", StringComparison.OrdinalIgnoreCase) && process.MainModule != null && process.MainModule.FileName.Contains("\\Microsoft\\Edge"));
+ }
+
+ private static void RemoveRegistryKey(string keyPath)
+ {
+ using var key = Registry.LocalMachine.OpenSubKey(keyPath, true);
+ if (key != null)
+ {
+ Registry.LocalMachine.DeleteSubKeyTree(keyPath, false);
+ }
+ }
+
+ private static void RemoveUserRegistryKey(string keyPath)
+ {
+ try
+ {
+ var users = Registry.Users.GetSubKeyNames();
+ foreach (var userSid in users)
+ {
+ using var userKey = Registry.Users.OpenSubKey(userSid);
+ using var key = userKey?.OpenSubKey(keyPath, true);
+ if (key != null)
+ {
+ userKey!.DeleteSubKeyTree(keyPath, false);
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ Logging.Log($"Exception while removing registry key: {ex}");
+ System.Diagnostics.Debug.WriteLine($"Exception while removing registry key: {ex.Message}");
+ }
+ }
+ }
+}
diff --git a/GoAwayEdge/Common/Installation/Shortcut.cs b/GoAwayEdge/Common/Installation/Shortcut.cs
new file mode 100644
index 0000000..00bff8b
--- /dev/null
+++ b/GoAwayEdge/Common/Installation/Shortcut.cs
@@ -0,0 +1,54 @@
+using System.Runtime.InteropServices;
+using System.Runtime.InteropServices.ComTypes;
+using System.Text;
+
+namespace GoAwayEdge.Common.Installation
+{
+ public class Shortcut
+ {
+ ///
+ /// Creates a shortcut (.lnk) for a given application.
+ ///
+ /// The file path of the application to which the shortcut points.
+ /// The arguments to pass to the application when it is started via the shortcut.
+ /// The file path where the shortcut will be saved.
+ public static void Create(string applicationPath, string arguments, string targetPath)
+ {
+ var link = (IShellLink)new ShellLink();
+ link.SetPath(applicationPath);
+ link.SetArguments(arguments);
+
+ var file = (IPersistFile)link;
+ file.Save(targetPath, false);
+ }
+
+ [ComImport]
+ [Guid("00021401-0000-0000-C000-000000000046")]
+ internal class ShellLink;
+
+ [ComImport]
+ [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
+ [Guid("000214F9-0000-0000-C000-000000000046")]
+ internal interface IShellLink
+ {
+ void GetPath([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszFile, int cchMaxPath, out IntPtr pfd, int fFlags);
+ void GetIDList(out IntPtr ppidl);
+ void SetIDList(IntPtr pidl);
+ void GetDescription([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszName, int cchMaxName);
+ void SetDescription([MarshalAs(UnmanagedType.LPWStr)] string pszName);
+ void GetWorkingDirectory([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszDir, int cchMaxPath);
+ void SetWorkingDirectory([MarshalAs(UnmanagedType.LPWStr)] string pszDir);
+ void GetArguments([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszArgs, int cchMaxPath);
+ void SetArguments([MarshalAs(UnmanagedType.LPWStr)] string pszArgs);
+ void GetHotkey(out short pwHotkey);
+ void SetHotkey(short wHotkey);
+ void GetShowCmd(out int piShowCmd);
+ void SetShowCmd(int iShowCmd);
+ void GetIconLocation([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszIconPath, int cchIconPath, out int piIcon);
+ void SetIconLocation([MarshalAs(UnmanagedType.LPWStr)] string pszIconPath, int iIcon);
+ void SetRelativePath([MarshalAs(UnmanagedType.LPWStr)] string pszPathRel, int dwReserved);
+ void Resolve(IntPtr hwnd, int fFlags);
+ void SetPath([MarshalAs(UnmanagedType.LPWStr)] string pszFile);
+ }
+ }
+}
diff --git a/GoAwayEdge/Common/Updater.cs b/GoAwayEdge/Common/Installation/Updater.cs
similarity index 79%
rename from GoAwayEdge/Common/Updater.cs
rename to GoAwayEdge/Common/Installation/Updater.cs
index 7e117be..d57f734 100644
--- a/GoAwayEdge/Common/Updater.cs
+++ b/GoAwayEdge/Common/Installation/Updater.cs
@@ -1,222 +1,241 @@
-using Microsoft.Toolkit.Uwp.Notifications;
-using Microsoft.Win32;
-using System.Diagnostics;
-using System.IO;
-using System.Net;
-using System.Reflection;
-using System.Security.Cryptography;
-using Newtonsoft.Json;
-
-namespace GoAwayEdge.Common
-{
- internal class Updater
- {
- public class GitHubRelease
- {
- public string tag_name { get; set; }
- public List assets { get; set; }
- }
-
- public class GitHubAsset
- {
- public string browser_download_url { get; set; }
- public string name { get; set; }
- }
-
-
- ///
- /// Validates if the installed IFEO-Binary is identical with the Edge-Binary.
- ///
- ///
- /// Integer value if the Binary is identical, not identical or missing.
- /// 0 : true (also reported if Edge is not installed)
- /// 1 : false
- /// 2 : missing
- ///
- public static int ValidateIfeoBinary()
- {
- if (Configuration.NoEdgeInstalled) return 0;
-
- var key = Registry.LocalMachine.OpenSubKey(
- @"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\msedge.exe\0");
- if (key == null)
- {
- Console.WriteLine("Registry key not found.");
- return 2;
- }
-
- var binaryPath = (string)key.GetValue("FilterFullPath")!;
- if (string.IsNullOrEmpty(binaryPath))
- {
- Console.WriteLine("FilterFullPath value not found.");
- return 2;
- }
-
- var edgeBinaryPath = Path.Combine(Path.GetDirectoryName(binaryPath)!, "msedge.exe");
- var ifeoBinaryPath = Path.Combine(Path.GetDirectoryName(binaryPath)!, "msedge_non_ifeo.exe");
-
- if (File.Exists(ifeoBinaryPath))
- {
- var edgeHash = CalculateMd5(edgeBinaryPath);
- var ifeoHash = CalculateMd5(ifeoBinaryPath);
-#if DEBUG
- if (edgeHash != ifeoHash)
- {
- var messageUi = new MessageUi("GoAwayEdge",
- $"The Edge Hash ({edgeHash}) and Ifeo Hash ({ifeoHash}) are not identical. Validation failed!", "OK", isMainThread: true);
- messageUi.ShowDialog();
- }
-#endif
- return edgeHash != ifeoHash ? 1 : 0;
- }
-
- Console.WriteLine($"Ifeo binary does not exist: {ifeoBinaryPath}");
- return 2;
- }
-
- ///
- /// Modifies the Ifeo binary.
- ///
- public static void ModifyIfeoBinary(ModifyAction action)
- {
- switch (action)
- {
- case ModifyAction.Update:
- {
- try
- {
- File.Copy(FileConfiguration.EdgePath, FileConfiguration.NonIfeoPath, true);
-
- var title = LocalizationManager.LocalizeValue("IfeoUpdateSuccessfulTitle");
- var description = LocalizationManager.LocalizeValue("IfeoUpdateSuccessfulDescription");
- new ToastContentBuilder()
- .AddText(title)
- .AddText(description)
- .Show();
- }
- catch (Exception ex)
- {
- var message = LocalizationManager.LocalizeValue("FailedUpdate", ex.Message);
- var messageUi = new MessageUi("GoAwayEdge", message, "OK", isMainThread: true);
- messageUi.ShowDialog();
- }
- break;
- }
- case ModifyAction.Create:
- {
- try
- {
- File.Copy(FileConfiguration.EdgePath, FileConfiguration.NonIfeoPath, true);
-
- var title = LocalizationManager.LocalizeValue("IfeoCreateSuccessfulTitle");
- var description = LocalizationManager.LocalizeValue("IfeoCreateSuccessfulDescription");
- new ToastContentBuilder()
- .AddText(title)
- .AddText(description)
- .Show();
- }
- catch (Exception ex)
- {
- var message = LocalizationManager.LocalizeValue("FailedUpdate", ex.Message);
- var messageUi = new MessageUi("GoAwayEdge", message, "OK", isMainThread: true);
- messageUi.ShowDialog();
- }
- break;
- }
- default:
- throw new ArgumentOutOfRangeException(nameof(action), action, null);
- }
- }
-
- ///
- /// Checks if a newer version of GoAwayEdge exists.
- ///
- ///
- /// Boolean status of the existence of a newer version.
- ///
- public static string? CheckForAppUpdate()
- {
- const string url = "https://api.github.com/repos/valnoxy/GoAwayEdge/releases";
-
- try
- {
- var appVersion = Assembly.GetExecutingAssembly().GetName().Version!;
- var currentVersion = new Version(appVersion.Major, appVersion.Minor, appVersion.Build);
-
- using var client = new WebClient();
- client.Headers.Add("User-Agent", $"GoAwayEdge/{currentVersion} valnoxy.dev");
- var json = client.DownloadString(url);
-
- var releases = JsonConvert.DeserializeObject(json);
- if (releases is { Length: > 0 })
- {
- var tagName = Convert.ToString(releases[0].tag_name);
- var tagVersion = tagName[1..];
- var latestVersion = new Version(tagVersion);
-
- if (currentVersion < latestVersion)
- return latestVersion.ToString();
- }
- return null;
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex);
- return null;
- }
- }
-
- ///
- /// Download and run the new version of GoAwayEdge.
- ///
- public static bool UpdateClient()
- {
- const string url = "https://api.github.com/repos/valnoxy/GoAwayEdge/releases";
-
- try
- {
- var appVersion = Assembly.GetExecutingAssembly().GetName().Version!;
- var currentVersion = new Version(appVersion.Major, appVersion.Minor, appVersion.Build);
-
- using var client = new WebClient();
- client.Headers.Add("User-Agent", $"GoAwayEdge/{currentVersion} valnoxy.dev");
- var json = client.DownloadString(url);
-
- var releases = JsonConvert.DeserializeObject(json);
- if (releases is { Length: > 0 })
- {
- var assetUrl = string.Empty;
- foreach (var asset in releases[0].assets.Where(asset => asset.name == "GoAwayEdge.exe"))
- {
- assetUrl = asset.browser_download_url;
- }
-
- var tempFolder = Path.GetTempPath();
- if (string.IsNullOrEmpty(assetUrl))
- {
- return false;
- }
-
- if (File.Exists(Path.Combine(tempFolder, "GoAwayEdge.exe")))
- File.Delete(Path.Combine(tempFolder, "GoAwayEdge.exe"));
- client.DownloadFile(assetUrl, Path.Combine(tempFolder, "GoAwayEdge.exe"));
- Process.Start(Path.Combine(tempFolder, "GoAwayEdge.exe"));
- return true;
- }
- }
- catch
- {
- return false;
- }
- return false;
- }
-
- private static string CalculateMd5(string filename)
- {
- using var md5 = MD5.Create();
- using var stream = File.OpenRead(filename);
- var hash = md5.ComputeHash(stream);
- return BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();
- }
- }
-}
+using System.Diagnostics;
+using System.IO;
+using System.Net;
+using System.Net.Http;
+using System.Reflection;
+using System.Security.Cryptography;
+using Microsoft.Toolkit.Uwp.Notifications;
+using Microsoft.Win32;
+using Newtonsoft.Json;
+
+namespace GoAwayEdge.Common.Installation
+{
+ internal class Updater
+ {
+ public class GitHubRelease
+ {
+ public string? tag_name { get; set; }
+ public List? assets { get; set; }
+ }
+
+ public class GitHubAsset
+ {
+ public string? browser_download_url { get; set; }
+ public string? name { get; set; }
+ }
+
+
+ ///
+ /// Validates if the installed IFEO-Binary is identical with the Edge-Binary.
+ ///
+ ///
+ /// Integer value if the Binary is identical, not identical or missing.
+ /// 0 : true (also reported if Edge is not installed)
+ /// 1 : false
+ /// 2 : missing
+ ///
+ public static int ValidateIfeoBinary()
+ {
+ if (Configuration.NoEdgeInstalled) return 0;
+
+ var key = Registry.LocalMachine.OpenSubKey(
+ @"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\msedge.exe\0");
+ if (key == null)
+ {
+ Console.WriteLine("Registry key not found.");
+ return 2;
+ }
+
+ var binaryPath = (string)key.GetValue("FilterFullPath")!;
+ if (string.IsNullOrEmpty(binaryPath))
+ {
+ Console.WriteLine("FilterFullPath value not found.");
+ return 2;
+ }
+
+ var edgeBinaryPath = Path.Combine(Path.GetDirectoryName(binaryPath)!, "msedge.exe");
+ var ifeoBinaryPath = Path.Combine(Path.GetDirectoryName(binaryPath)!, "msedge_non_ifeo.exe");
+
+ if (File.Exists(ifeoBinaryPath))
+ {
+ var edgeHash = CalculateMd5(edgeBinaryPath);
+ var ifeoHash = CalculateMd5(ifeoBinaryPath);
+#if DEBUG
+ if (edgeHash != ifeoHash)
+ {
+ var messageUi = new MessageUi("GoAwayEdge",
+ $"The Edge Hash ({edgeHash}) and Ifeo Hash ({ifeoHash}) are not identical. Validation failed!", "OK", isMainThread: true);
+ messageUi.ShowDialog();
+ }
+#endif
+ return edgeHash != ifeoHash ? 1 : 0;
+ }
+
+ Console.WriteLine($"Ifeo binary does not exist: {ifeoBinaryPath}");
+ return 2;
+ }
+
+ ///
+ /// Modifies the Ifeo binary.
+ ///
+ public static void ModifyIfeoBinary(ModifyAction action)
+ {
+ switch (action)
+ {
+ case ModifyAction.Update:
+ {
+ try
+ {
+ File.Copy(FileConfiguration.EdgePath, FileConfiguration.NonIfeoPath, true);
+
+ var title = LocalizationManager.LocalizeValue("IfeoUpdateSuccessfulTitle");
+ var description = LocalizationManager.LocalizeValue("IfeoUpdateSuccessfulDescription");
+ new ToastContentBuilder()
+ .AddText(title)
+ .AddText(description)
+ .Show();
+ }
+ catch (Exception ex)
+ {
+ var message = LocalizationManager.LocalizeValue("FailedUpdate", ex.Message);
+ var messageUi = new MessageUi("GoAwayEdge", message, "OK", isMainThread: true);
+ messageUi.ShowDialog();
+ }
+ break;
+ }
+ case ModifyAction.Create:
+ {
+ try
+ {
+ File.Copy(FileConfiguration.EdgePath, FileConfiguration.NonIfeoPath, true);
+
+ var title = LocalizationManager.LocalizeValue("IfeoCreateSuccessfulTitle");
+ var description = LocalizationManager.LocalizeValue("IfeoCreateSuccessfulDescription");
+ new ToastContentBuilder()
+ .AddText(title)
+ .AddText(description)
+ .Show();
+ }
+ catch (Exception ex)
+ {
+ var message = LocalizationManager.LocalizeValue("FailedUpdate", ex.Message);
+ var messageUi = new MessageUi("GoAwayEdge", message, "OK", isMainThread: true);
+ messageUi.ShowDialog();
+ }
+ break;
+ }
+ default:
+ throw new ArgumentOutOfRangeException(nameof(action), action, null);
+ }
+ }
+
+ ///
+ /// Checks if a newer version of GoAwayEdge exists.
+ ///
+ ///
+ /// Boolean status of the existence of a newer version.
+ ///
+ public static string? CheckForAppUpdate()
+ {
+ const string url = "https://api.github.com/repos/valnoxy/GoAwayEdge/releases";
+
+ try
+ {
+ var appVersion = Assembly.GetExecutingAssembly().GetName().Version!;
+ var currentVersion = new Version(appVersion.Major, appVersion.Minor, appVersion.Build);
+
+ using var client = new HttpClient();
+ client.DefaultRequestHeaders.UserAgent.ParseAdd($"GoAwayEdge/{currentVersion} valnoxy.dev");
+
+ var response = client.GetAsync(url).Result;
+ response.EnsureSuccessStatusCode();
+ var json = response.Content.ReadAsStringAsync().Result;
+
+ var releases = JsonConvert.DeserializeObject(json);
+ if (releases is { Length: > 0 })
+ {
+ var tagName = Convert.ToString(releases[0].tag_name);
+ var tagVersion = tagName![1..];
+ var latestVersion = new Version(tagVersion);
+
+ if (currentVersion < latestVersion)
+ return latestVersion.ToString();
+ }
+ return null;
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine(ex);
+ return null;
+ }
+ }
+
+ ///
+ /// Download and run the new version of GoAwayEdge.
+ ///
+ public static bool UpdateClient()
+ {
+ const string url = "https://api.github.com/repos/valnoxy/GoAwayEdge/releases";
+
+ try
+ {
+ var appVersion = Assembly.GetExecutingAssembly().GetName().Version!;
+ var currentVersion = new Version(appVersion.Major, appVersion.Minor, appVersion.Build);
+
+ using var client = new HttpClient();
+ client.DefaultRequestHeaders.UserAgent.ParseAdd($"GoAwayEdge/{currentVersion} valnoxy.dev");
+
+ var response = client.GetAsync(url).Result;
+ response.EnsureSuccessStatusCode();
+ var json = response.Content.ReadAsStringAsync().Result;
+
+ var releases = JsonConvert.DeserializeObject(json);
+ if (releases is { Length: > 0 })
+ {
+ var assetUrl = string.Empty;
+ foreach (var asset in releases[0].assets!.Where(asset => asset.name == "GoAwayEdge.exe"))
+ {
+ assetUrl = asset.browser_download_url;
+ }
+
+ if (string.IsNullOrEmpty(assetUrl))
+ {
+ return false;
+ }
+
+ var tempFolder = Path.GetTempPath();
+ var tempFilePath = Path.Combine(tempFolder, "GoAwayEdge.exe");
+
+ if (File.Exists(tempFilePath))
+ {
+ File.Delete(tempFilePath);
+ }
+
+ using (var downloadStream = client.GetStreamAsync(assetUrl).Result)
+ using (var fileStream = new FileStream(tempFilePath, FileMode.Create, FileAccess.Write, FileShare.None))
+ {
+ downloadStream.CopyTo(fileStream);
+ }
+
+ Process.Start(new ProcessStartInfo(tempFilePath) { UseShellExecute = true });
+ return true;
+ }
+ }
+ catch
+ {
+ return false;
+ }
+
+ return false;
+ }
+
+
+ private static string CalculateMd5(string filename)
+ {
+ using var md5 = MD5.Create();
+ using var stream = File.OpenRead(filename);
+ var hash = md5.ComputeHash(stream);
+ return BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();
+ }
+ }
+}
diff --git a/GoAwayEdge/Common/Localization.cs b/GoAwayEdge/Common/Localization.cs
index 3c7b7ec..81dbfc6 100644
--- a/GoAwayEdge/Common/Localization.cs
+++ b/GoAwayEdge/Common/Localization.cs
@@ -1,5 +1,5 @@
-using System.Diagnostics;
-using System.Windows;
+using System.Windows;
+using GoAwayEdge.Common.Debugging;
namespace GoAwayEdge.Common
{
@@ -7,11 +7,13 @@ internal class LocalizationManager
{
public static void LoadLanguage()
{
- // Set current language model
+ // Override language for testing
+ const string overrideLanguage = "";
+
var language = Thread.CurrentThread.CurrentCulture.ToString();
var dict = new ResourceDictionary();
- Logging.Log($"Trying to load language: " + language);
- Debug.WriteLine("Trying to load language: " + language);
+ if (!string.IsNullOrEmpty(overrideLanguage)) language = overrideLanguage;
+ Logging.Log("Trying to load language: " + language);
dict.Source = language switch
{
"en-US" => new Uri("/GoAwayEdge;component/Localization/ResourceDictionary.xaml", UriKind.Relative),
@@ -21,6 +23,12 @@ public static void LoadLanguage()
"it-IT" => new Uri("/GoAwayEdge;component/Localization/ResourceDictionary.it-IT.xaml", UriKind.Relative),
"pl-PL" => new Uri("/GoAwayEdge;component/Localization/ResourceDictionary.pl-PL.xaml", UriKind.Relative),
"ko-KR" => new Uri("/GoAwayEdge;component/Localization/ResourceDictionary.ko-KR.xaml", UriKind.Relative),
+ "pt-BR" => new Uri("/GoAwayEdge;component/Localization/ResourceDictionary.pt-BR.xaml", UriKind.Relative),
+ "da-DK" => new Uri("/GoAwayEdge;component/Localization/ResourceDictionary.da-DK.xaml", UriKind.Relative),
+ "ja-JP" => new Uri("/GoAwayEdge;component/Localization/ResourceDictionary.ja-JP.xaml", UriKind.Relative),
+ "nl-NL" => new Uri("/GoAwayEdge;component/Localization/ResourceDictionary.nl-NL.xaml", UriKind.Relative),
+ "pt-PT" => new Uri("/GoAwayEdge;component/Localization/ResourceDictionary.pt-PT.xaml", UriKind.Relative),
+ "ro-RO" => new Uri("/GoAwayEdge;component/Localization/ResourceDictionary.ro-RO.xaml", UriKind.Relative),
_ => new Uri("/GoAwayEdge;component/Localization/ResourceDictionary.xaml", UriKind.Relative)
};
try
@@ -35,6 +43,13 @@ public static void LoadLanguage()
messageUi.ShowDialog();
Environment.Exit(1);
}
+
+ if (dict.Source ==
+ new Uri("/GoAwayEdge;component/Localization/ResourceDictionary.xaml", UriKind.Relative) &&
+ language != "en-US")
+ {
+ Logging.Log($"No localization file found for language {language}, falling back to English ...", Logging.LogLevel.WARNING);
+ }
}
public static string LocalizeValue(string value)
@@ -42,7 +57,16 @@ public static string LocalizeValue(string value)
try
{
var localizedValue = (string)Application.Current.Resources[value]!;
- return string.IsNullOrEmpty(localizedValue) ? value : localizedValue;
+
+ if (string.IsNullOrEmpty(localizedValue))
+ return value;
+
+ if (localizedValue.Contains("\\n"))
+ {
+ return localizedValue.Replace("\\n", "\n");
+ }
+
+ return localizedValue;
}
catch (Exception ex)
{
@@ -55,11 +79,17 @@ public static string LocalizeValue(string value, params object[]? args)
{
var localizedValue = LocalizeValue(value);
- if (args is not { Length: > 0 }) return localizedValue;
-
+ if (args is not { Length: > 0 })
+ return localizedValue;
+
try
{
localizedValue = string.Format(localizedValue, args);
+
+ if (localizedValue.Contains("\\n"))
+ {
+ localizedValue = localizedValue.Replace("\\n", "\n");
+ }
}
catch (FormatException ex)
{
@@ -69,5 +99,6 @@ public static string LocalizeValue(string value, params object[]? args)
return localizedValue;
}
+
}
}
\ No newline at end of file
diff --git a/GoAwayEdge/Common/Runtime/ArgumentParse.cs b/GoAwayEdge/Common/Runtime/ArgumentParse.cs
new file mode 100644
index 0000000..f039b99
--- /dev/null
+++ b/GoAwayEdge/Common/Runtime/ArgumentParse.cs
@@ -0,0 +1,269 @@
+using System.Diagnostics;
+using System.IO;
+using System.Text.RegularExpressions;
+using GoAwayEdge.Common.Debugging;
+
+namespace GoAwayEdge.Common.Runtime
+{
+ public class ArgumentParse
+ {
+ private static string? _url;
+
+ ///
+ /// Main method for parsing command line arguments and starting the appropriate process.
+ ///
+ /// The command line arguments.
+ public static void Parse(string[] args)
+ {
+ var quotedArgs = args.Select(arg => arg.Contains(" ") ? $"\"{arg}\"" : arg);
+ var argumentJoin = string.Join(" ", quotedArgs);
+ DebugMessage.DisplayDebugMessage("GoAwayEdge", $"The following args are redirected (CTRL+C to copy):\n\n{argumentJoin}");
+
+ if (RegistryConfig.GetKey("Enabled") == "False")
+ {
+ // Redirect to Edge
+ StartProcess(FileConfiguration.NonIfeoPath, argumentJoin, "GoAwayEdge is disabled. Redirecting everything to Edge ...");
+ return;
+ }
+
+ var (isFile, isApp, isOnlyEdge, singleArgument) = ParseArguments(args);
+ if (_url != null)
+ {
+ HandleUrl(_url);
+ }
+ else if (isOnlyEdge)
+ {
+ StartProcess(FileConfiguration.NonIfeoPath, "", "Opening Microsoft Edge without any arguments.");
+ }
+ else if (isFile)
+ {
+ StartProcess(FileConfiguration.NonIfeoPath, $"--single-argument {singleArgument}", $"Opening '{singleArgument}' with Edge.");
+ }
+ else if (isApp)
+ {
+ const string pattern = @"--app-id=([^\s]+)";
+ const string copilotAppId = "khiogjgiicnghciboipemonlmgelhblf";
+ var match = Regex.Match(argumentJoin, pattern);
+ if (match.Success)
+ {
+ var appId = match.Groups[1].Value;
+ Logging.Log($"Opening PWA App with ID {appId}");
+ if (appId == copilotAppId && Common.Configuration.AiProvider != AiProvider.Default)
+ {
+ DebugMessage.DisplayDebugMessage("GoAwayEdge", $"Opening AI Provider '{Configuration.AiProvider}' (PWA) ...");
+ UserInterface.CopilotDock.InterfaceManager.ShowDock();
+ return;
+ }
+ }
+ StartProcess(FileConfiguration.NonIfeoPath, singleArgument, $"Opening PWA Application with following arguments: '{singleArgument}'.");
+ }
+ }
+
+ ///
+ /// Parses the command line arguments to identify if a file path or app ID is present.
+ ///
+ /// The command line arguments.
+ /// A tuple with the values isFile, isApp, isOnlyEdge and singleArgument.
+ private static (bool isFile, bool isApp, bool isOnlyEdge, string singleArgument) ParseArguments(string[] args)
+ {
+ bool isFile = false, isApp = false, collectSingleArgument = false, isOnlyEdge = false;
+ var singleArgument = string.Empty;
+ var cleanedArgs = args
+ .Where(str => str != "--debug")
+ .ToArray();
+ if (cleanedArgs.Length == 1)
+ {
+ if (File.Exists(cleanedArgs[0]) && cleanedArgs[0].EndsWith("msedge.exe"))
+ {
+ isOnlyEdge = true;
+ }
+ }
+
+ foreach (var arg in cleanedArgs)
+ {
+ if (arg.Contains("microsoft-edge:"))
+ {
+ _url = arg;
+ }
+
+ if (collectSingleArgument)
+ {
+ singleArgument += (singleArgument.Length > 0 ? " " : "") + arg;
+ continue;
+ }
+
+ if (arg == "--single-argument" || arg.Contains("--app-id"))
+ {
+ collectSingleArgument = true;
+ }
+
+ if (arg.Contains("--app-id"))
+ {
+ singleArgument = arg;
+ }
+ }
+
+ if (File.Exists(singleArgument))
+ isFile = true;
+
+ if (singleArgument.Contains("--app-id"))
+ isApp = true;
+
+ return (isFile, isApp, isOnlyEdge, singleArgument);
+ }
+
+ ///
+ /// Handles processing and starting a process based on the given URL.
+ ///
+ /// The URL to be processed.
+ private static void HandleUrl(string url)
+ {
+ var p = new Process
+ {
+ StartInfo = new ProcessStartInfo
+ {
+ UseShellExecute = true,
+ RedirectStandardOutput = false,
+ FileName = FileConfiguration.NonIfeoPath,
+ Arguments = url
+ }
+ };
+
+ // Copilot Taskbar
+ if (url.Contains("microsoft-edge://?ux=copilot&tcp=1&source=taskbar") ||
+ url.Contains("microsoft-edge:///?ux=copilot&tcp=1&source=taskbar"))
+ {
+ if (Configuration.AiProvider != AiProvider.Copilot)
+ {
+ DebugMessage.DisplayDebugMessage("GoAwayEdge", $"Opening AI Provider '{Configuration.AiProvider}' (Taskbar) ...");
+ UserInterface.CopilotDock.InterfaceManager.ShowDock();
+ return;
+ }
+ DebugMessage.DisplayDebugMessage("GoAwayEdge", $"Opening Windows Copilot (Taskbar) with following url:\n{url}");
+ }
+ // Copilot Hotkey
+ else if (url.Contains("microsoft-edge://?ux=copilot&tcp=1&source=hotkey") ||
+ url.Contains("microsoft-edge:///?ux=copilot&tcp=1&source=hotkey"))
+ {
+ if (Configuration.AiProvider != AiProvider.Copilot)
+ {
+ DebugMessage.DisplayDebugMessage("GoAwayEdge", $"Opening AI Provider '{Configuration.AiProvider}' (Hotkey) ...");
+ UserInterface.CopilotDock.InterfaceManager.ShowDock();
+ return;
+ }
+ DebugMessage.DisplayDebugMessage("GoAwayEdge", $"Opening Windows Copilot (Hotkey) with following url:\n{url}");
+ }
+ // Weather Provider
+ else if (url.Contains("%3Floc%3D") && url.Contains("msn.com")) // ?loc=
+ {
+ var parsedUrl = UrlParse.Parse(url);
+ var parsedWeather = Weather.ParseUrl(parsedUrl);
+ DebugMessage.DisplayDebugMessage("GoAwayEdge", $"Opening Weather URL in default browser:\n\n{parsedWeather}");
+ p.StartInfo.FileName = parsedWeather;
+ p.StartInfo.Arguments = string.Empty;
+ }
+ // Default
+ else
+ {
+ var parsedUrl = UrlParse.Parse(url);
+ DebugMessage.DisplayDebugMessage("GoAwayEdge", $"Opening URL in default browser:\n\n{parsedUrl}");
+ p.StartInfo.FileName = parsedUrl;
+ p.StartInfo.Arguments = string.Empty;
+ }
+
+ p.Start();
+ }
+
+ ///
+ /// Starts a process with the given file name and arguments.
+ ///
+ /// The file name to start.
+ /// The arguments to pass to the process.
+ /// The debug message to display.
+ private static void StartProcess(string fileName, string arguments, string debugMessage)
+ {
+ var p = new Process
+ {
+ StartInfo = new ProcessStartInfo
+ {
+ UseShellExecute = true,
+ RedirectStandardOutput = false,
+ FileName = fileName,
+ Arguments = arguments
+ }
+ };
+
+ DebugMessage.DisplayDebugMessage("GoAwayEdge", debugMessage);
+ p.Start();
+ }
+
+ public static EdgeChannel ParseEdgeChannel(string argument)
+ {
+ return argument.ToLower() switch
+ {
+ "stable" => EdgeChannel.Stable,
+ "beta" => EdgeChannel.Beta,
+ "dev" => EdgeChannel.Dev,
+ "canary" => EdgeChannel.Canary,
+ _ => EdgeChannel.Stable // Fallback channel
+ };
+ }
+
+ public static AiProvider ParseAiProvider(string argument)
+ {
+ var arg = argument;
+ if (argument.StartsWith("-a:"))
+ arg = argument.Remove(0, 3);
+
+ return arg.ToLower() switch
+ {
+ "default" => AiProvider.Default,
+ "copilot" => AiProvider.Copilot,
+ "chatgpt" => AiProvider.ChatGPT,
+ "gemini" => AiProvider.Gemini,
+ "github_copilot" => AiProvider.GitHub_Copilot,
+ "grok" => AiProvider.Grok,
+ "custom" => AiProvider.Custom,
+ _ => AiProvider.Default // Fallback provider
+ };
+ }
+
+ public static SearchEngine ParseSearchEngine(string argument)
+ {
+ var arg = argument;
+ if (argument.StartsWith("-e:"))
+ arg = argument.Remove(0, 3);
+
+ return arg.ToLower() switch
+ {
+ "google" => SearchEngine.Google,
+ "bing" => SearchEngine.Bing,
+ "duckduckgo" => SearchEngine.DuckDuckGo,
+ "yahoo" => SearchEngine.Yahoo,
+ "yandex" => SearchEngine.Yandex,
+ "ecosia" => SearchEngine.Ecosia,
+ "ask" => SearchEngine.Ask,
+ "qwant" => SearchEngine.Qwant,
+ "perplexity" => SearchEngine.Perplexity,
+ "custom" => SearchEngine.Custom,
+ _ => SearchEngine.Google // Fallback search engine
+ };
+ }
+
+ public static WeatherProvider ParseWeatherProvider(string argument)
+ {
+ var arg = argument;
+ if (argument.StartsWith("-w:"))
+ arg = argument.Remove(0, 3);
+
+ return arg.ToLower() switch
+ {
+ "default" => WeatherProvider.Default,
+ "weathercom" => WeatherProvider.WeatherCom,
+ "accuweather" => WeatherProvider.AccuWeather,
+ "custom" => WeatherProvider.Custom,
+ _ => WeatherProvider.Default // Fallback provider
+ };
+ }
+ }
+}
diff --git a/GoAwayEdge/Common/Runtime/NamedPipeManager.cs b/GoAwayEdge/Common/Runtime/NamedPipeManager.cs
new file mode 100644
index 0000000..fce15a8
--- /dev/null
+++ b/GoAwayEdge/Common/Runtime/NamedPipeManager.cs
@@ -0,0 +1,119 @@
+using System.IO.Pipes;
+using System.Text;
+using GoAwayEdge.Common.Debugging;
+
+namespace GoAwayEdge.Common.Runtime
+{
+ public class NamedPipeManager(string pipeName, int maxRetryAttempts = 3)
+ {
+ private bool _isServerRunning;
+ private Thread? _pipeThread;
+ private readonly object _lock = new();
+
+ public event Action? MessageReceived;
+ public event Action? ErrorOccurred;
+
+ public void StartServer()
+ {
+ _isServerRunning = true;
+
+ _pipeThread = new Thread(() =>
+ {
+ while (_isServerRunning)
+ {
+ try
+ {
+ using (var pipeServer = new NamedPipeServerStream(pipeName, PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous))
+ {
+ Logging.Log("Waiting for client connection...");
+ pipeServer.WaitForConnection();
+
+ Logging.Log("Client connected.");
+ var buffer = new byte[256];
+ while (pipeServer.IsConnected)
+ {
+ try
+ {
+ int bytesRead = pipeServer.Read(buffer, 0, buffer.Length);
+ if (bytesRead > 0)
+ {
+ string message = Encoding.UTF8.GetString(buffer, 0, bytesRead);
+ MessageReceived?.Invoke(message);
+ }
+ }
+ catch (Exception ex)
+ {
+ HandleError(ex);
+ break;
+ }
+ }
+
+ Logging.Log("Client disconnected. Resetting pipe...");
+ pipeServer.Disconnect();
+ }
+ }
+ catch (Exception ex)
+ {
+ HandleError(ex);
+ Thread.Sleep(2000);
+ }
+ }
+ });
+
+ _pipeThread.IsBackground = true;
+ _pipeThread.Start();
+ }
+
+ public void SendMessage(string message)
+ {
+ int attempt = 0;
+
+ while (attempt < maxRetryAttempts)
+ {
+ try
+ {
+ using (var pipeClient = new NamedPipeClientStream(".", pipeName, PipeDirection.Out))
+ {
+ Logging.Log("Attempting to connect to server...");
+ Logging.Log($"Reaching to pipe: {pipeName}");
+ pipeClient.Connect(10000);
+ Logging.Log("Connected to server.");
+
+ byte[] messageBytes = Encoding.UTF8.GetBytes(message);
+ pipeClient.Write(messageBytes, 0, messageBytes.Length);
+ pipeClient.Flush();
+ break;
+ }
+ }
+ catch (TimeoutException ex)
+ {
+ attempt++;
+ HandleError(new TimeoutException("Connection timed out.", ex));
+ Thread.Sleep(2000);
+ }
+ catch (UnauthorizedAccessException ex)
+ {
+ HandleError(ex);
+ break;
+ }
+ catch (Exception ex)
+ {
+ attempt++;
+ HandleError(ex);
+ Thread.Sleep(1000);
+ }
+ }
+
+ if (attempt == maxRetryAttempts)
+ {
+ Logging.Log("Unable to send message after multiple attempts.", Logging.LogLevel.ERROR);
+ }
+ }
+
+ private void HandleError(Exception ex)
+ {
+ Logging.Log($"Pipe error: {ex.Message}", Logging.LogLevel.ERROR);
+ ErrorOccurred?.Invoke(ex);
+ }
+ }
+}
diff --git a/GoAwayEdge/Common/Runtime/UrlParse.cs b/GoAwayEdge/Common/Runtime/UrlParse.cs
new file mode 100644
index 0000000..29906e2
--- /dev/null
+++ b/GoAwayEdge/Common/Runtime/UrlParse.cs
@@ -0,0 +1,80 @@
+using System.Text;
+using System.Web;
+
+namespace GoAwayEdge.Common.Runtime
+{
+ public class UrlParse
+ {
+ ///
+ /// Parses the given encoded URL and returns the processed URL.
+ ///
+ /// The encoded URL to parse.
+ /// The parsed URL.
+ public static string Parse(string encodedUrl)
+ {
+ // Remove URI handler with url argument prefix
+ encodedUrl = encodedUrl[encodedUrl.IndexOf("http", StringComparison.Ordinal)..];
+
+ // Remove junk after search term
+ if (encodedUrl.Contains("https%3A%2F%2Fwww.bing.com%2Fsearch%3Fq%3D") && !encodedUrl.Contains("redirect"))
+ encodedUrl = encodedUrl.Substring(encodedUrl.IndexOf("http", StringComparison.Ordinal), encodedUrl.IndexOf("%26", StringComparison.Ordinal));
+
+ // Alternative url form
+ if (encodedUrl.Contains("https%3A%2F%2Fwww.bing.com%2Fsearch%3Fform%3D"))
+ {
+ encodedUrl = encodedUrl.Substring(encodedUrl.IndexOf("26q%3D", StringComparison.Ordinal) + 6, encodedUrl.Length - (encodedUrl.IndexOf("26q%3D", StringComparison.Ordinal) + 6));
+ encodedUrl = "https://www.bing.com/search?q=" + encodedUrl;
+ }
+
+ // Decode Url
+ encodedUrl = encodedUrl.Contains("redirect") ? DotSlash(encodedUrl) : DecodeUrlString(encodedUrl);
+
+ // Get new URL
+ var definedEngineUrl = Configuration.Search == SearchEngine.Custom
+ ? Configuration.CustomQueryUrl : Configuration.GetEnumDescription(Configuration.Search);
+
+ // Replace Search Engine
+ encodedUrl = encodedUrl.Replace("https://www.bing.com/search?q=", definedEngineUrl);
+
+#if DEBUG
+ var uriMessageUi = new MessageUi("GoAwayEdge",
+ "Got extracted and decoded url variable from Microsoft-Edge Protocol:\n\n" + encodedUrl, "OK", isMainThread: true);
+ uriMessageUi.ShowDialog();
+#endif
+ var uri = new Uri(encodedUrl);
+ return uri.ToString();
+ }
+
+ private static string DecodeUrlString(string url)
+ {
+ string newUrl;
+ while ((newUrl = Uri.UnescapeDataString(url)) != url)
+ url = newUrl;
+ return newUrl;
+ }
+
+ private static string DotSlash(string url)
+ {
+ string newUrl;
+ while ((newUrl = Uri.UnescapeDataString(url)) != url)
+ url = newUrl;
+
+ try // Decode base64 string from url
+ {
+ var uri = new Uri(url);
+ var query = HttpUtility.ParseQueryString(uri.Query).Get("url");
+ if (query != null)
+ {
+ var decoded = Encoding.UTF8.GetString(Convert.FromBase64String(query));
+ return decoded;
+ }
+ }
+ catch
+ {
+ // ignored
+ }
+
+ return url;
+ }
+ }
+}
diff --git a/GoAwayEdge/Common/Runtime/Weather.cs b/GoAwayEdge/Common/Runtime/Weather.cs
new file mode 100644
index 0000000..2e1e1fd
--- /dev/null
+++ b/GoAwayEdge/Common/Runtime/Weather.cs
@@ -0,0 +1,59 @@
+using System.Globalization;
+using System.Text;
+using System.Web;
+using Newtonsoft.Json;
+
+namespace GoAwayEdge.Common.Runtime
+{
+ public class Weather
+ {
+ public class GeoData
+ {
+ public string? L { get; set; } // City
+ public string? R { get; set; } // Region
+ public string? C { get; set; } // Country
+ public string? I { get; set; } // Short Country code
+ public string? G { get; set; } // Country code (lowercase)
+ public double X { get; set; } // longitude
+ public double Y { get; set; } // latitude
+ }
+
+ public static string? ParseUrl(string encodedUrl)
+ {
+ // Encoded URL structure: https://msn.com//.../?loc=
+ // This function will locate the argument "?loc", decode the base64 geolocation information and format the template
+
+ if (Configuration.WeatherProvider == WeatherProvider.Default)
+ return encodedUrl;
+
+ var encodedUri = new Uri(encodedUrl);
+ var locValue = HttpUtility.ParseQueryString(encodedUri.Query).Get("loc"); // Output: Base64
+ if (string.IsNullOrEmpty(locValue))
+ return "";
+
+ var encodedLocValue = Encoding.UTF8.GetString(Convert.FromBase64String(locValue)); // Output: Json
+ var locObject = JsonConvert.DeserializeObject(encodedLocValue);
+ var language = Thread.CurrentThread.CurrentCulture.ToString(); // Country code (full case)
+ if (locObject == null)
+ return "";
+
+ var lat = locObject.Y.ToString(CultureInfo.InvariantCulture).Replace(",", ".");
+ var lon = locObject.X.ToString(CultureInfo.InvariantCulture).Replace(",", ".");
+ var placeholders = new Dictionary
+ {
+ { "country-code", language },
+ { "short-country-code", locObject.I! },
+ { "latitude", lat },
+ { "longitude", lon }
+ };
+
+ var weatherProviderUrl = Configuration.WeatherProvider == WeatherProvider.Custom
+ ? Configuration.CustomWeatherProviderUrl : Configuration.GetEnumDescription(Configuration.WeatherProvider);
+
+ weatherProviderUrl = placeholders.Aggregate(weatherProviderUrl, (current, placeholder) => current.Replace($"{{{placeholder.Key}}}", placeholder.Value));
+ var isValid = Uri.TryCreate(weatherProviderUrl, UriKind.Absolute, out var uriResult)
+ && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps);
+ return isValid ? weatherProviderUrl : "";
+ }
+ }
+}
diff --git a/GoAwayEdge/GoAwayEdge.csproj b/GoAwayEdge/GoAwayEdge.csproj
index 38e432b..9c60563 100644
--- a/GoAwayEdge/GoAwayEdge.csproj
+++ b/GoAwayEdge/GoAwayEdge.csproj
@@ -1,63 +1,74 @@
-
- WinExe
- net8.0-windows10.0.18362.0
- enable
- enable
- true
- false
- win-x64
- true
- true
- GoAwayEdge
- Exploitox
- valnoxy
- 1.3.4.153
- Copyright (c) 2018 - 2024 Exploitox. All rights reserved.
- https://github.com/valnoxy/GoAwayEdge
- https://github.com/valnoxy/GoAwayEdge
- GoAwayEdge.App
- GoAwayEdge.ico
- $(Version)
- $(Version)
- $(Version)
- false
- GoAwayEdge - Redirect Edge calls to your favorite browser!
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Designer
- MSBuild:Compile
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+ WinExe
+ net8.0-windows10.0.18362.0
+ enable
+ enable
+ true
+ false
+ win-x64
+ true
+ true
+ GoAwayEdge
+ Exploitox
+ valnoxy
+ 2.0.0.258
+ Copyright © 2018 - 2025 Exploitox. All rights reserved.
+ https://github.com/valnoxy/GoAwayEdge
+ https://github.com/valnoxy/GoAwayEdge
+ GoAwayEdge.App
+ GoAwayEdge.ico
+ $(Version)
+ $(Version)
+ $(Version)
+ false
+ GoAwayEdge - Redirect Edge calls to your favorite browser!
+ true
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
\ No newline at end of file
diff --git a/GoAwayEdge/GoAwayEdge.csproj.user b/GoAwayEdge/GoAwayEdge.csproj.user
index 850a85e..61534d1 100644
--- a/GoAwayEdge/GoAwayEdge.csproj.user
+++ b/GoAwayEdge/GoAwayEdge.csproj.user
@@ -7,25 +7,37 @@
Code
-
+
Code
-
+
Code
-
+
Code
-
+
Code
-
+
Code
-
+
Code
-
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
Code
@@ -33,10 +45,40 @@
Designer
-
+
+ Designer
+
+
+ Designer
+
+
+ Designer
+
+
+ Designer
+
+
+ Designer
+
+
+ Designer
+
+
+ Designer
+
+
+ Designer
+
+
+ Designer
+
+
+ Designer
+
+
Designer
-
+
Designer
@@ -60,19 +102,19 @@
Designer
-
+
Designer
-
+
Designer
-
+
Designer
-
+
Designer
-
+
Designer
diff --git a/GoAwayEdge/Installer.xaml b/GoAwayEdge/Installer.xaml
deleted file mode 100644
index 2693cc3..0000000
--- a/GoAwayEdge/Installer.xaml
+++ /dev/null
@@ -1,65 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/GoAwayEdge/Localization/ResourceDictionary.da-DK.xaml b/GoAwayEdge/Localization/ResourceDictionary.da-DK.xaml
new file mode 100644
index 0000000..e36756a
--- /dev/null
+++ b/GoAwayEdge/Localization/ResourceDictionary.da-DK.xaml
@@ -0,0 +1,96 @@
+
+ Næste
+ Tilbage
+ Udgang
+ Ja
+ Nej
+ Velkommen
+ Installer
+ Installer og konfigurer GoAwayEdge på dit system.
+ Afinstaller
+ Afinstaller GoAwayEdge, og gendan Edge-funktionaliteten.
+ Brug venligst installationsprogrammet til at afinstallere GoAwayEdge.
+ Licens
+ Jeg accepterer denne licens.
+ Jeg afviser denne licens.
+ Indstillinger
+ Kantkanal
+ Vælg den installerede Microsoft Edge Channel.
+ Søgemaskine
+ Vælg din foretrukne søgemaskine.
+ Brugerdefineret
+ Brugerdefineret søgemaskine
+ Indtast venligst forespørgsels-URL'en fra søgemaskinen.
+ Fjern Microsoft Edge (Stabil)
+ Installer kontrolpanel
+ Installer kontrolpanelet for at gøre det nemmere at konfigurere GoAwayEdge.
+ Installation i gang ...
+ Vent venligst, indtil installationen er færdig.
+ Installationen er færdig!
+ Afinstallation gennemført!
+ GoAwayEdge er blevet fjernet fra systemet.
+ Donér via PayPal
+ GoAwayEdge kontrolpanel
+ Windows Copilot
+ Administrer søgemaskiner og meget mere.
+ Administrer genvejstaster og meget mere.
+ Aktiver/deaktiver GoAwayEdge
+ Aktivér GoAwayEdge
+ Deaktiver GoAwayEdge
+ Initialisering mislykkedes: {0}
+ Installationen mislykkedes: {0}
+ Afinstallation mislykkedes: {0}
+ Opdatering mislykkedes: {0}
+ Fjernelsen af Microsoft Edge mislykkedes! Prøv venligst igen.
+ Kunne ikke registrere Image File Execution Option for '{0}'. Prøv venligst igen.
+ Microsoft Edge er blevet opdateret, og GoAwayEdge skal opdatere den alternative opstartsfil for at sikre Edge-funktionalitet.
+ Den alternative opstartsfil til Edge mangler og skal kopieres for at sikre, at Edge fungerer. Kopier nu?
+ Installer opdatering
+ Mind mig om det senere
+ Opdatering vellykket
+ Oprettelse vellykket
+ Den alternative opstartsfil for Edge er blevet oprettet.
+ GoAwayEdge blev aktiveret på dette system.
+ GoAwayEdge blev deaktiveret på dette system.
+ GoAwayEdge kunne ikke aktiveres på dette system: {0}
+ GoAwayEdge-installatør
+ Installationsprogrammet udfører alle de nødvendige trin for at installere GoAwayEdge på dit system. Efter installationen vil alle Edge-opkald blive omdirigeret til din browser. Vælg den ønskede mulighed for at fortsætte.
+ Læs venligst den følgende licens. Du skal acceptere licensbetingelserne, før du fortsætter med installationen.
+ Fjern Microsoft Edge helt fra systemet.
+ Du skal blot åbne dette installationsprogram, hvis du vil tilpasse GoAwayEdge igen.
+ Velkommen til GoAwayEdge
+ Microsoft Edge
+ Deaktiver videresendelse af søgeforespørgsler til andre browsere.
+ Installationen mislykkedes! Prøv venligst igen.
+ En ny version af GoAwayEdge (v{0}) er tilgængelig. Denne opdatering indeholder nye funktioner, fejlrettelser og sikrer applikationens funktionalitet.
+ Spring denne version over
+ Den alternative opstartsfil for Edge er blevet opdateret.
+ Kunne ikke deaktivere GoAwayEdge på dette system: {0}
+ AI-udbyder
+ Skift udbyder til din foretrukne AI (eller til din foretrukne hjemmeside).
+ Brugerdefineret AI-udbyder
+ Indtast venligst URL'en fra AI-udbyderen (eller din foretrukne hjemmeside).
+ Kunne ikke anvende indstillingerne: {0}
+ Kør et eksternt program, når du trykker på Copilot-tasten.
+ Fjernelse af Microsoft Edge kan forårsage alvorlige systemproblemer, da det er dybt integreret i Windows og afgørende for mange funktioner, herunder opdateringer, hjælpefiler og nogle apps. Hvis du sletter den, kan det resultere i ustabilitet eller ødelagt funktionalitet.\n\nFortsæt kun, hvis du forstår risikoen fuldt ud og har en pålidelig sikkerhedskopi eller et gendannelsespunkt på plads.
+ Advarsel
+ Annuller
+ Fjern Microsoft Edge
+ Vejrtjeneste
+ Skift tjeneste til dit foretrukne vejr-websted.
+ Brugerdefineret vejrtjeneste
+ Indtast venligst URL'en fra vejrtjenesten.
+ Kopilot-nøgle
+ Eksternt program
+ Vejen til ansøgning
+ Vælg det program, du vil køre.
+ Argumenter
+ Definer argumenterne for din applikation.
+ Ingen kilde valgt
+ Standard
+ Omdirigere eller fjerne?
+ Vil du omdirigere alle opkald fra Edge til en anden browser eller helt fjerne Edge?
+ Omdiriger alting
+ Omdiriger alle opkald fra Edge til din yndlingsbrowser.
+ Du skal blot åbne dette installationsprogram eller kontrolpanelet, hvis du vil tilpasse GoAwayEdge igen.
+
diff --git a/GoAwayEdge/Localization/ResourceDictionary.de-DE.xaml b/GoAwayEdge/Localization/ResourceDictionary.de-DE.xaml
index 48a0686..c952b4f 100644
--- a/GoAwayEdge/Localization/ResourceDictionary.de-DE.xaml
+++ b/GoAwayEdge/Localization/ResourceDictionary.de-DE.xaml
@@ -1,66 +1,103 @@
-
-
- GoAwayEdge-Installationsprogramm
- Weiter
- Zurück
- Beenden
- Ja
- Nein
-
-
- Willkommen
- Das Installationsprogramm führt alle notwendigen Schritte durch, um GoAwayEdge auf Ihrem System zu installieren. Nach der Installation werden alle Edge-Aufrufe an Ihren Browser weitergeleitet. Bitte wählen Sie die gewünschte Option, um fortzufahren.
- Installieren
- Installiere und konfiguriere GoAwayEdge auf Ihrem System.
- Deinstallieren
- Deinstalliere GoAwayEdge und wiederherstelle die Edge-Funktionalität.
- Bitte verwenden Sie den Installer, um GoAwayEdge zu deinstallieren.
-
-
- Lizenz
- Bitte lesen Sie die folgende Lizenz. Sie müssen die Lizenzbedingungen akzeptieren, bevor Sie mit der Installation fortfahren können.
- Ich akzeptiere diese Lizenz.
- Ich lehne diese Lizenz ab.
-
-
- Einstellungen
- Edge Channel
- Wählen Sie den installierten Microsoft Edge Channel aus.
- Suchmaschine
- Wählen Sie Ihre bevorzugte Suchmaschine.
- Benutzerdefiniert
- Benutzerdefinierte Suchmaschine
- Bitte geben Sie die Anfrage-URL der Suchmaschine ein.
- Microsoft Edge (Stabil) entfernen
- Entferne Microsoft Edge vollständig von Ihrem System.
-
-
- Installation läuft ...
- Bitte warten Sie, bis die Installation abgeschlossen ist.
-
-
- Installation abgeschlossen!
- Öffnen Sie das Installationsprogramm, wenn Sie GoAwayEdge erneut anpassen möchten.
- Deinstallation abgeschlossen!
- GoAwayEdge wurde erfolgreich vom System entfernt.
- Über PayPal spenden
-
-
- Initialisierung fehlgeschlagen: {0}
- Installation fehlgeschlagen: {0}
- Deinstallation fehlgeschlagen: {0}
- Aktualisierung fehlgeschlagen: {0}
- Installation fehlgeschlagen! Bitte versuchen Sie es erneut.
- Die Entfernung von Microsoft Edge ist fehlgeschlagen! Bitte versuchen Sie es erneut.
- "Image File Execution Option" für '{0}' konnte nicht registriert werden. Bitte versuchen Sie es erneut.
- Eine neue Version von GoAwayEdge (v{0}) ist verfügbar. Dieses Update enthält neue Funktionen, behebt Fehler und gewährleistet die Funktionalität dieser Anwendung.
- Microsoft Edge wurde aktualisiert und GoAwayEdge muss die alternative Startdatei aktualisieren, um die Edge-Funktionalität zu gewährleisten.
- Die alternative Startdatei von Edge fehlt und muss kopiert werden, um die Edge-Funktionalität zu gewährleisten. Jetzt kopieren?
- Update installieren
- Erinnere mich später
- Aktualisierung erfolgreich
- Die alternative Startdatei von Edge wurde erfolgreich aktualisiert.
- Erstellung erfolgreich
- Die alternative Startdatei von Edge wurde erfolgreich erstellt.
-
-
+
+ GoAwayEdge-Installationsprogramm
+ Weiter
+ Zurück
+ Beenden
+ Ja
+ Nein
+ Standard
+ Warnung
+ Abbrechen
+
+ Willkommen
+ Das Installationsprogramm führt alle notwendigen Schritte durch, um GoAwayEdge auf Ihrem System zu installieren. Nach der Installation werden alle Edge-Aufrufe an Ihren Browser weitergeleitet. Bitte wählen Sie die gewünschte Option, um fortzufahren.
+ Installieren
+ Installiere und konfiguriere GoAwayEdge auf Ihrem System.
+ Deinstallieren
+ Deinstalliere GoAwayEdge und wiederherstelle die Edge-Funktionalität.
+ Bitte verwenden Sie den Installer, um GoAwayEdge zu deinstallieren.
+
+ Lizenz
+ Bitte lesen Sie die folgende Lizenz. Sie müssen die Lizenzbedingungen akzeptieren, bevor Sie mit der Installation fortfahren können.
+ Ich akzeptiere diese Lizenz.
+ Ich lehne diese Lizenz ab.
+
+ Umleiten oder Entfernen?
+ Sollen alle Aufrufe von Edge auf einen anderen Browser umgeleitet werden, oder soll Edge vollständig entfernt werden?
+ Alles umleiten (Empfohlen)
+ Leite alle Aufrufe von Edge auf deinen Lieblingsbrowser um.
+
+ Einstellungen
+ Edge Kanal
+ Wählen Sie den installierten Microsoft Edge Kanal aus.
+ Suchmaschine
+ Wählen Sie Ihre bevorzugte Suchmaschine.
+ Benutzerdefiniert
+ Benutzerdefinierte Suchmaschine
+ Bitte geben Sie die Anfrage-URL der Suchmaschine ein.
+ Microsoft Edge (Stabil) entfernen
+ Entferne Microsoft Edge vollständig von Ihrem System.
+ Das Entfernen von Microsoft Edge kann zu schwerwiegenden Systemproblemen führen, da es tief in Windows integriert ist und für viele Funktionen, einschließlich Updates, Hilfedateien und einige Anwendungen, unerlässlich ist. Das Löschen kann zu Instabilität oder defekten Funktionen führen.\n\nFahren Sie nur fort, wenn Sie sich der Risiken bewusst sind und über eine zuverlässige Sicherung oder einen Wiederherstellungspunkt verfügen.
+ Microsoft Edge entfernen
+
+ Installation läuft ...
+ Bitte warten Sie, bis die Installation abgeschlossen ist.
+
+ Installation abgeschlossen!
+ Öffnen Sie das Installationsprogramm, wenn Sie GoAwayEdge erneut anpassen möchten.
+ Öffnen Sie das Installationsprogramm oder das Kontrollpanel, wenn Sie GoAwayEdge erneut anpassen möchten.
+ Deinstallation abgeschlossen!
+ GoAwayEdge wurde erfolgreich vom System entfernt.
+ Über PayPal spenden
+
+ Initialisierung fehlgeschlagen: {0}
+ Installation fehlgeschlagen: {0}
+ Deinstallation fehlgeschlagen: {0}
+ Aktualisierung fehlgeschlagen: {0}
+ Installation fehlgeschlagen! Bitte versuchen Sie es erneut.
+ Die Entfernung von Microsoft Edge ist fehlgeschlagen! Bitte versuchen Sie es erneut.
+ "Image File Execution Option" für '{0}' konnte nicht registriert werden. Bitte versuchen Sie es erneut.
+ Eine neue Version von GoAwayEdge (v{0}) ist verfügbar. Dieses Update enthält neue Funktionen, behebt Fehler und gewährleistet die Funktionalität dieser Anwendung.
+ Microsoft Edge wurde aktualisiert und GoAwayEdge muss die alternative Startdatei aktualisieren, um die Edge-Funktionalität zu gewährleisten.
+ Die alternative Startdatei von Edge fehlt und muss kopiert werden, um die Edge-Funktionalität zu gewährleisten. Jetzt kopieren?
+ Update installieren
+ Erinnere mich später
+ Aktualisierung erfolgreich
+ Die alternative Startdatei von Edge wurde erfolgreich aktualisiert.
+ Erstellung erfolgreich
+ Die alternative Startdatei von Edge wurde erfolgreich erstellt.
+ Version überspringen
+ GoAwayEdge Kontrollpanel
+ Microsoft Edge
+ Windows Copilot
+ Verwalte Suchmaschinen und mehr.
+ Verwalte Hotkeys und mehr.
+ Aktiviere/Deaktiviere GoAwayEdge
+ Aktiviere GoAwayEdge
+ Deaktiviere GoAwayEdge
+ Wetterdienst
+ Wechsel den Anbieter zu Ihres bevorzugten Wetterdienstes.
+ Benutzerdefinierter Wetterdienst
+ Bitte geben Sie die URL des Wetterdienstes ein.
+ GoAwayEdge wurde auf diesem System erfolgreich deaktiviert.
+ GoAwayEdge konnte auf diesem System nicht aktiviert werden: {0}
+ Installiere das Kontrollpanel, um GoAwayEdge einfacher zu konfigurieren.
+ Kontrollpanel installieren
+ Willkommen bei GoAwayEdge
+ Deaktiviere die Weiterleitung von Suchanfragen an anderen Browsern.
+ GoAwayEdge wurde auf diesem System erfolgreich aktiviert.
+ GoAwayEdge konnte auf diesem System nicht deaktiviert werden: {0}
+ KI Anbieter
+ Wechsel den Anbieter Ihrer bevorzugten KI (oder zu Ihrer bevorzugten Webseite).
+ Benutzerdefinierter KI Anbieter
+ Bitte gebe die URL des KI-Anbieters (oder einer Webseite) ein.
+ Die Einstellungen konnten nicht übernommen werden: {0}
+ Copilot Key
+ Externe Anwendung
+ Pfad zur Anwendung
+ Wählen Sie die Anwendung, die Sie ausführen möchten.
+ Argumente
+ Definieren Sie die Argumente Ihrer Anwendung.
+ Führe beim Drücken der Copilot-Taste eine externe Anwendung aus.
+ Keine Quelle ausgewählt
+
diff --git a/GoAwayEdge/Localization/ResourceDictionary.es-ES.xaml b/GoAwayEdge/Localization/ResourceDictionary.es-ES.xaml
index 4bfbbc7..0e746e7 100644
--- a/GoAwayEdge/Localization/ResourceDictionary.es-ES.xaml
+++ b/GoAwayEdge/Localization/ResourceDictionary.es-ES.xaml
@@ -1,66 +1,102 @@
-
-
- Instalador de GoAwayEdge
- Siguiente
- Volver
- Salida
- Sí
- No
-
-
- Bienvenido
- El instalador realizará todos los pasos necesarios para instalar GoAwayEdge en tu sistema. Tras la instalación, todas las llamadas a Edge serán redirigidas a tu navegador. Por favor, selecciona la opción deseada para continuar.
- Instale
- Instale y configure GoAwayEdge en su sistema.
- Desinstalar
- Desinstala GoAwayEdge y restaura la funcionalidad de Edge.
- Por favor, utilice el Instalador para desinstalar GoAwayEdge.
-
-
- Licencia
- Por favor, lea la siguiente Licencia. Debe aceptar los términos de la licencia antes de continuar con la instalación.
- Aceptar licencia.
- Rechazar licencia.
-
-
- Ajustes
- Canal Edge
- Seleccione el canal Microsoft Edge instalado.
- Motor de búsqueda
- Seleccione su motor de búsqueda favorito.
- Personalizar
- Motor de búsqueda personalizado
- Introduzca la URL de consulta del motor de búsqueda.
- Eliminar Microsoft Edge (Estable)
- Elimine Microsoft Edge completamente del sistema.
-
-
- Instalación en curso ...
- Espere a que finalice la instalación.
-
-
- Instalación finalizada.
- Simplemente abre este Instalador, si quieres personalizar GoAwayEdge de nuevo.
- Desinstalación completada.
- GoAwayEdge ha sido eliminado con éxito del sistema.
- Donar a través de PayPal
-
-
- Error de inicialización: {0}
- Error de instalación: {0}
- Error de desinstalación: {0}
- Actualización fallida: {0}
- Error de instalación. Por favor, inténtelo de nuevo.
- La eliminación de Microsoft Edge ha fallado. Por favor, inténtalo de nuevo.
- Error al registrar la opción de ejecución de archivos de imagen para '{0}'. Por favor, inténtelo de nuevo.
- Una nueva versión de GoAwayEdge (v{0}) está disponible. Esta actualización incluye nuevas características, corrección de errores y garantiza la funcionalidad de esta aplicación.
- Microsoft Edge ha sido actualizado y GoAwayEdge necesita actualizar el archivo no-IFEO para asegurar la funcionalidad de Edge.
- Falta la versión de Edge que no es IEFO y debe copiarse para garantizar la funcionalidad de Edge. ¿Copiar ahora?
- Instalar actualización
- Recuérdamelo más tarde
- Actualización satisfactoria
- La versión no IEFO de Edge se ha actualizado correctamente.
- Creación con éxito
- La versión no IEFO de Edge se ha creado correctamente.
-
-
+
+ Instalador de GoAwayEdge
+ Siguiente
+ Volver
+ Salida
+ Sí
+ No
+
+ Bienvenido
+ El instalador realizará todos los pasos necesarios para instalar GoAwayEdge en tu sistema. Tras la instalación, todas las llamadas a Edge serán redirigidas a tu navegador. Por favor, selecciona la opción deseada para continuar.
+ Instale
+ Instale y configure GoAwayEdge en su sistema.
+ Desinstalar
+ Desinstala GoAwayEdge y restaura la funcionalidad de Edge.
+ Por favor, utilice el Instalador para desinstalar GoAwayEdge.
+
+ Licencia
+ Por favor, lea la siguiente Licencia. Debe aceptar los términos de la licencia antes de continuar con la instalación.
+ Aceptar licencia.
+ Rechazar licencia.
+
+ Ajustes
+ Canal Edge
+ Seleccione el canal Microsoft Edge instalado.
+ Motor de búsqueda
+ Seleccione su motor de búsqueda favorito.
+ Personalizar
+ Motor de búsqueda personalizado
+ Introduzca la URL de consulta del motor de búsqueda.
+ Eliminar Microsoft Edge (Estable)
+ Elimine Microsoft Edge completamente del sistema.
+
+ Instalación en curso ...
+ Espere a que finalice la instalación.
+
+ Instalación finalizada!
+ Simplemente abre este Instalador, si quieres personalizar GoAwayEdge de nuevo.
+ Desinstalación completada!
+ GoAwayEdge ha sido eliminado con éxito del sistema.
+ Donar a través de PayPal
+
+ Error de inicialización: {0}
+ Instalación fallida: {0}
+ Error de desinstalación: {0}
+ Actualización fallida: {0}
+ Error de instalación. Por favor, inténtelo de nuevo.
+ La eliminación de Microsoft Edge ha fallado. Por favor, inténtalo de nuevo.
+ Error al registrar la opción de ejecución de archivos de imagen para '{0}'. Por favor, inténtelo de nuevo.
+ Una nueva versión de GoAwayEdge (v{0}) está disponible. Esta actualización incluye nuevas características, corrección de errores y garantiza la funcionalidad de esta aplicación.
+ Microsoft Edge ha sido actualizado y GoAwayEdge necesita actualizar el archivo no-IFEO para asegurar la funcionalidad de Edge.
+ Falta la versión de Edge que no es IEFO y debe copiarse para garantizar la funcionalidad de Edge. ¿Copiar ahora?
+ Instalar actualización
+ Recuérdamelo más tarde
+ Actualización satisfactoria
+ La versión no IEFO de Edge se ha actualizado correctamente.
+ Creación con éxito
+ La versión no IEFO de Edge se ha creado correctamente.
+ Saltar esta versión
+ Cambia el servicio a tu sitio web meteorológico favorito.
+ GoAwayEdge se ha desactivado correctamente en este sistema.
+ No se ha podido activar GoAwayEdge en este sistema: {0}
+ No se ha podido desactivar GoAwayEdge en este sistema: {0}
+ No se ha podido aplicar la configuración: {0}
+ Desactivar GoAwayEdge
+ Eliminar Microsoft Edge puede causar graves problemas en el sistema, ya que está profundamente integrado en Windows y es esencial para muchas funciones, como las actualizaciones, los archivos de ayuda y algunas aplicaciones. Si lo eliminas, podrías provocar inestabilidad o una funcionalidad dañada.\n\nSolo procede si conoces bien los riesgos y tienes una copia de seguridad fiable o un punto de restauración.
+ Advertencia
+ Cancelar
+ ¿Quieres redirigir todas las llamadas de Edge a otro navegador o eliminar Edge por completo?
+ Redirige todas las llamadas de Edge a tu navegador favorito.
+ Panel de control de GoAwayEdge
+ Llave Copiloto
+ Programa externo
+ Ejecuta una aplicación externa al pulsar la tecla Copilot.
+ Camino a la aplicación
+ Seleccione la aplicación que desea ejecutar.
+ Argumentos
+ Defina los argumentos de su aplicación.
+ Ninguna fuente seleccionada
+ Eliminar Microsoft Edge
+ GoAwayEdge se ha activado correctamente en este sistema.
+ Instalar el panel de control
+ Proveedor de AI
+ Cambia el proveedor a tu IA favorita (o a tu sitio web favorito).
+ Por defecto
+ ¿Redirigir o eliminar?
+ Redirigir todo
+ Instala el Panel de Control para configurar GoAwayEdge más fácilmente.
+ Microsoft Edge
+ Windows Copilot
+ Gestione los motores de búsqueda y mucho más.
+ Gestiona las teclas de acceso rápido y mucho más.
+ Activar/Desactivar GoAwayEdge
+ Desactivar el reenvío de consultas de búsqueda a otros navegadores.
+ Bienvenido a GoAwayEdge
+ Activar GoAwayEdge
+ Proveedor de IA personalizada
+ Introduzca la URL del proveedor de AI (o su sitio web favorito).
+ Servicio Meteorológico
+ Servicio Meteorológico Personalizado
+ Introduzca la URL del Servicio Meteorológico.
+ Simplemente abre este instalador o el Panel de Control si quieres personalizar GoAwayEdge de nuevo.
+
diff --git a/GoAwayEdge/Localization/ResourceDictionary.fr-FR.xaml b/GoAwayEdge/Localization/ResourceDictionary.fr-FR.xaml
index 52df41c..9c10acf 100644
--- a/GoAwayEdge/Localization/ResourceDictionary.fr-FR.xaml
+++ b/GoAwayEdge/Localization/ResourceDictionary.fr-FR.xaml
@@ -1,66 +1,102 @@
-
-
- Installateur GoAwayEdge
- Suivant
- Retour
- Sortie
- Oui
- Non
-
-
- Bienvenue
- Le programme d'installation effectuera toutes les étapes nécessaires pour installer GoAwayEdge sur votre système. Après l'installation, tous les appels Edge seront redirigés vers votre navigateur. Veuillez sélectionner l'option souhaitée pour continuer.
- Installer
- Installez et configurez GoAwayEdge sur votre système.
- Désinstaller
- Désinstallez GoAwayEdge et rétablissez les fonctionnalités de Edge.
- Veuillez utiliser le programme d'installation pour désinstaller GoAwayEdge.
-
-
- Licence
- Veuillez lire la licence suivante. Vous devez accepter les termes de la licence avant de poursuivre l'installation.
- J'accepte cette licence.
- Je refuse cette licence.
-
-
- Paramètres
- Canal de dérivation
- Sélectionnez le canal Microsoft Edge installé.
- Moteur de recherche
- Sélectionnez votre moteur de recherche préféré.
- Sur mesure
- Moteur de recherche personnalisé
- Veuillez saisir l'URL de la requête du moteur de recherche.
- Supprimer Microsoft Edge (Stable)
- Supprimer complètement Microsoft Edge du système.
-
-
- Installation en cours ...
- Veuillez patienter jusqu'à la fin de l'installation.
-
-
- Installation terminée !
- Ouvrez simplement ce programme d'installation si vous souhaitez personnaliser GoAwayEdge à nouveau.
- Désinstallation terminée !
- GoAwayEdge a été supprimé avec succès du système.
- Faire un don via PayPal
-
-
- Échec de l'initialisation : {0}
- L'installation a échoué : {0}
- La désinstallation a échoué : {0}
- Échec de la mise à jour : {0}
- L'installation a échoué ! Veuillez réessayer.
- La suppression de Microsoft Edge a échoué ! Veuillez réessayer.
- Échec de l'enregistrement de l'option d'exécution du fichier image pour '{0}'. Veuillez réessayer.
- Une nouvelle version de GoAwayEdge (v{0}) est disponible. Cette mise à jour inclut de nouvelles fonctionnalités, des corrections de bugs et assure la fonctionnalité de cette application.
- Microsoft Edge a été mis à jour et GoAwayEdge doit mettre à jour le fichier non-IFEO pour assurer la fonctionnalité de Edge.
- La version non-IEFO d'Edge est manquante et doit être copiée pour assurer la fonctionnalité d'Edge. Copier maintenant ?
- Installer la mise à jour
- Rappelez-moi plus tard
- Mise à jour réussie
- La version non IFO de Edge a été mise à jour avec succès.
- Création réussie
- La version non-IEFO de Edge a été créée avec succès.
-
-
+
+ Installateur GoAwayEdge
+ Suivant
+ Retour
+ Sortie
+ Oui
+ Non
+
+ Bienvenue
+ Le programme d'installation effectuera toutes les étapes nécessaires pour installer GoAwayEdge sur votre système. Après l'installation, tous les appels Edge seront redirigés vers votre navigateur. Veuillez sélectionner l'option souhaitée pour continuer.
+ Installer
+ Installez et configurez GoAwayEdge sur votre système.
+ Désinstaller
+ Désinstallez GoAwayEdge et rétablissez les fonctionnalités de Edge.
+ Veuillez utiliser le programme d'installation pour désinstaller GoAwayEdge.
+
+ Licence
+ Veuillez lire la licence suivante. Vous devez accepter les termes de la licence avant de poursuivre l'installation.
+ J'accepte cette licence.
+ Je refuse cette licence.
+
+ Paramètres
+ Canal de dérivation
+ Sélectionnez le canal Microsoft Edge installé.
+ Moteur de recherche
+ Sélectionnez votre moteur de recherche préféré.
+ Sur mesure
+ Moteur de recherche personnalisé
+ Veuillez saisir l'URL de la requête du moteur de recherche.
+ Supprimer Microsoft Edge (Stable)
+ Supprimer complètement Microsoft Edge du système.
+
+ Installation en cours ...
+ Veuillez patienter jusqu'à la fin de l'installation.
+
+ Installation terminée !
+ Ouvrez simplement ce programme d'installation si vous souhaitez personnaliser GoAwayEdge à nouveau.
+ Désinstallation terminée !
+ GoAwayEdge a été supprimé avec succès du système.
+ Faire un don via PayPal
+
+ Échec de l'initialisation : {0}
+ L'installation a échoué : {0}
+ La désinstallation a échoué : {0}
+ Échec de la mise à jour : {0}
+ L'installation a échoué ! Veuillez réessayer.
+ La suppression de Microsoft Edge a échoué ! Veuillez réessayer.
+ Échec de l'enregistrement de l'option d'exécution du fichier image pour '{0}'. Veuillez réessayer.
+ Une nouvelle version de GoAwayEdge (v{0}) est disponible. Cette mise à jour inclut de nouvelles fonctionnalités, des corrections de bugs et assure la fonctionnalité de cette application.
+ Microsoft Edge a été mis à jour et GoAwayEdge doit mettre à jour le fichier non-IFEO pour assurer la fonctionnalité de Edge.
+ La version non-IEFO d'Edge est manquante et doit être copiée pour assurer la fonctionnalité d'Edge. Copier maintenant ?
+ Installer la mise à jour
+ Rappelez-moi plus tard
+ Mise à jour réussie
+ La version non IFO de Edge a été mise à jour avec succès.
+ Création réussie
+ La version non-IEFO de Edge a été créée avec succès.
+ Sauter cette version
+ Impossible de désactiver GoAwayEdge sur ce système : {0}
+ Panneau de contrôle GoAwayEdge
+ Bienvenue à GoAwayEdge
+ Microsoft Edge
+ Windows Copilot
+ Gérer les moteurs de recherche et plus encore.
+ Gestion des touches de raccourci et plus encore.
+ Activer/désactiver GoAwayEdge
+ Désactiver la transmission des requêtes de recherche à d'autres navigateurs.
+ Activer GoAwayEdge
+ Désactiver GoAwayEdge
+ Installer le panneau de contrôle
+ Installez le panneau de contrôle pour configurer GoAwayEdge plus facilement.
+ Fournisseur d'IA
+ Changez de fournisseur pour votre IA préférée (ou pour votre site web préféré).
+ Fournisseur d'IA sur mesure
+ Veuillez saisir l'URL du fournisseur d'IA (ou votre site web préféré).
+ GoAwayEdge a été activé avec succès sur ce système.
+ GoAwayEdge a été désactivé avec succès sur ce système.
+ Impossible d'activer GoAwayEdge sur ce système : {0}
+ Impossible d'appliquer les paramètres : {0}
+ Défaut
+ Rediriger ou supprimer ?
+ Voulez-vous rediriger tous les appels de Edge vers un autre navigateur, ou supprimer complètement Edge ?
+ Rediriger tous les appels de Edge vers votre navigateur préféré.
+ Avertissement
+ Annuler
+ Tout rediriger
+ La suppression de Microsoft Edge peut entraîner de graves problèmes pour le système, car il est profondément intégré à Windows et essentiel pour de nombreuses fonctionnalités, notamment les mises à jour, les fichiers d'aide et certaines applications. Sa suppression peut entraîner une instabilité ou des dysfonctionnements.\n\nNe procédez que si vous comprenez parfaitement les risques et si vous disposez d'une sauvegarde fiable ou d'un point de restauration.
+ Supprimer Microsoft Edge
+ Service météorologique
+ Changez le service pour votre site web météo préféré.
+ Service météorologique personnalisé
+ Veuillez saisir l'URL du service météorologique.
+ Clé Copilote
+ Programme externe
+ Exécuter une application externe lorsque vous appuyez sur la touche Copilote.
+ Chemin d'accès à l'application
+ Sélectionnez l'application que vous souhaitez exécuter.
+ Arguments
+ Définissez les arguments de votre application.
+ Aucune source sélectionnée
+ Ouvrez simplement ce programme d'installation ou le panneau de configuration si vous souhaitez personnaliser GoAwayEdge à nouveau.
+
diff --git a/GoAwayEdge/Localization/ResourceDictionary.it-IT.xaml b/GoAwayEdge/Localization/ResourceDictionary.it-IT.xaml
index 4d965f5..d1bb109 100644
--- a/GoAwayEdge/Localization/ResourceDictionary.it-IT.xaml
+++ b/GoAwayEdge/Localization/ResourceDictionary.it-IT.xaml
@@ -1,66 +1,102 @@
-
-
- Installatore GoAwayEdge
- Avanti
- Indietro
- Uscita
- Sì
- No
-
-
- Benvenuti
- Il programma di installazione eseguirà tutte le operazioni necessarie per installare GoAwayEdge sul sistema. Dopo l'installazione, tutte le chiamate a Edge verranno reindirizzate al browser. Selezionare l'opzione desiderata per continuare.
- Installare
- Installare e configurare GoAwayEdge sul sistema.
- Disinstallare
- Disinstallare GoAwayEdge e ripristinare la funzionalità di Edge.
- Utilizzare il programma di installazione per disinstallare GoAwayEdge.
-
-
- Licenza
- Leggere la seguente licenza. È necessario accettare i termini della licenza prima di continuare l'installazione.
- Accetto questa licenza.
- Rifiuto questa licenza.
-
-
- Impostazioni
- Canale dei bordi
- Selezionare il canale Microsoft Edge installato.
- Motore di ricerca
- Selezionate il vostro motore di ricerca preferito.
- Personalizzato
- Motore di ricerca personalizzato
- Inserire l'URL della query dal motore di ricerca.
- Rimuovere Microsoft Edge (Stabile)
- Rimuovere completamente Microsoft Edge dal sistema.
-
-
- Installazione in corso ...
- Attendere il completamento dell'installazione.
-
-
- Installazione completata!
- È sufficiente aprire questo programma di installazione per personalizzare nuovamente GoAwayEdge.
- Disinstallazione completata!
- GoAwayEdge è stato rimosso con successo dal sistema.
- Donazione tramite PayPal
-
-
- Inizializzazione fallita: {0}
- Installazione fallita: {0}
- Disinstallazione fallita: {0}
- Aggiornamento fallito: {0}
- Installazione fallita! Riprovare.
- La rimozione di Microsoft Edge non è riuscita! Riprovare.
- Impossibile registrare l'opzione di esecuzione del file immagine per '{0}'. Riprovare.
- È disponibile una nuova versione di GoAwayEdge (v{0}). Questo aggiornamento include nuove caratteristiche, correzioni di bug e garantisce la funzionalità di questa applicazione.
- Microsoft Edge è stato aggiornato e GoAwayEdge deve aggiornare il file non-IFEO per garantire la funzionalità di Edge.
- La versione non IFO di Edge è mancante e deve essere copiata per garantire la funzionalità di Edge. Copiare ora?
- Installare l'aggiornamento
- Ricordami più tardi
- Aggiornamento riuscito
- La versione non IFO di Edge è stata aggiornata con successo.
- Creazione riuscita
- La versione non IFO di Edge è stata creata con successo.
-
-
+
+ Installatore GoAwayEdge
+ Avanti
+ Indietro
+ Uscita
+ Sì
+ No
+
+ Benvenuti
+ Il programma di installazione eseguirà tutte le operazioni necessarie per installare GoAwayEdge sul sistema. Dopo l'installazione, tutte le chiamate a Edge verranno reindirizzate al browser. Selezionare l'opzione desiderata per continuare.
+ Installare
+ Installare e configurare GoAwayEdge sul sistema.
+ Disinstallare
+ Disinstallare GoAwayEdge e ripristinare la funzionalità di Edge.
+ Utilizzare il programma di installazione per disinstallare GoAwayEdge.
+
+ Licenza
+ Leggere la seguente licenza. È necessario accettare i termini della licenza prima di continuare l'installazione.
+ Accetto questa licenza.
+ Rifiuto questa licenza.
+
+ Impostazioni
+ Canale dei bordi
+ Selezionare il canale Microsoft Edge installato.
+ Motore di ricerca
+ Selezionate il vostro motore di ricerca preferito.
+ Personalizzato
+ Motore di ricerca personalizzato
+ Inserire l'URL della query dal motore di ricerca.
+ Rimuovere Microsoft Edge (Stabile)
+ Rimuovere completamente Microsoft Edge dal sistema.
+
+ Installazione in corso ...
+ Attendere il completamento dell'installazione.
+
+ Installazione completata!
+ È sufficiente aprire questo programma di installazione per personalizzare nuovamente GoAwayEdge.
+ Disinstallazione completata!
+ GoAwayEdge è stato rimosso con successo dal sistema.
+ Donazione tramite PayPal
+
+ Inizializzazione fallita: {0}
+ Installazione fallita: {0}
+ Disinstallazione fallita: {0}
+ Aggiornamento fallito: {0}
+ Installazione fallita! Riprovare.
+ La rimozione di Microsoft Edge non è riuscita! Riprovare.
+ Impossibile registrare l'opzione di esecuzione del file immagine per '{0}'. Riprovare.
+ È disponibile una nuova versione di GoAwayEdge (v{0}). Questo aggiornamento include nuove caratteristiche, correzioni di bug e garantisce la funzionalità di questa applicazione.
+ Microsoft Edge è stato aggiornato e GoAwayEdge deve aggiornare il file non-IFEO per garantire la funzionalità di Edge.
+ La versione non IFO di Edge è mancante e deve essere copiata per garantire la funzionalità di Edge. Copiare ora?
+ Installare l'aggiornamento
+ Ricordami più tardi
+ Aggiornamento riuscito
+ La versione non IFO di Edge è stata aggiornata con successo.
+ Creazione riuscita
+ La versione non IFO di Edge è stata creata con successo.
+ Salta questa versione
+ Disattivare l'inoltro delle query di ricerca ad altri browser.
+ Inserire l'URL del provider AI (o del proprio sito web preferito).
+ Pannello di controllo GoAwayEdge
+ Benvenuti a GoAwayEdge
+ Microsoft Edge
+ Windows Copilot
+ Gestire i motori di ricerca e altro ancora.
+ Gestione dei tasti di scelta rapida e altro ancora.
+ Abilitazione/disabilitazione di GoAwayEdge
+ Abilitare GoAwayEdge
+ Disattivare GoAwayEdge
+ Installare il pannello di controllo
+ Installate il Pannello di controllo per configurare GoAwayEdge più facilmente.
+ Fornitore di AI
+ Cambiare il provider con il vostro AI preferito (o con il vostro sito web preferito).
+ Fornitore di intelligenza artificiale personalizzata
+ GoAwayEdge è stato attivato con successo su questo sistema.
+ GoAwayEdge è stato disattivato con successo su questo sistema.
+ Impossibile abilitare GoAwayEdge su questo sistema: {0}
+ Impossibile disattivare GoAwayEdge su questo sistema: {0}
+ Impossibile applicare le impostazioni: {0}
+ Volete reindirizzare tutte le chiamate da Edge a un altro browser o rimuovere completamente Edge?
+ La rimozione di Microsoft Edge può causare seri problemi al sistema, poiché è profondamente integrato in Windows ed è essenziale per molte funzioni, tra cui gli aggiornamenti, i file di guida e alcune app. L'eliminazione potrebbe causare instabilità o interruzioni di funzionalità.\n\nProcedere solo se si conoscono bene i rischi e se si dispone di un backup affidabile o di un punto di ripristino.
+ Avvertenze
+ Annullamento
+ Reindirizzare o rimuovere?
+ Reindirizzare tutto
+ Reindirizza tutte le chiamate da Edge al vostro browser preferito.
+ Rimuovere Microsoft Edge
+ Servizio meteo
+ Cambiate il servizio con il vostro sito meteo preferito.
+ Servizio meteo personalizzato
+ Inserire l'URL del servizio meteorologico.
+ Chiave del copilota
+ Programma esterno
+ Eseguire un'applicazione esterna quando si preme il tasto Copilot.
+ Percorso di applicazione
+ Selezionare l'applicazione che si desidera eseguire.
+ Argomenti
+ Definire gli argomenti dell'applicazione.
+ Nessuna sorgente selezionata
+ Predefinito
+ È sufficiente aprire questo programma di installazione o il Pannello di controllo se si desidera personalizzare nuovamente GoAwayEdge.
+
diff --git a/GoAwayEdge/Localization/ResourceDictionary.ja-JP.xaml b/GoAwayEdge/Localization/ResourceDictionary.ja-JP.xaml
new file mode 100644
index 0000000..ccd6ce3
--- /dev/null
+++ b/GoAwayEdge/Localization/ResourceDictionary.ja-JP.xaml
@@ -0,0 +1,96 @@
+
+ バック
+ 出口
+ はい
+ いいえ
+ ようこそ
+ インストール
+ GoAwayEdgeをシステムにインストールし、設定します。
+ GoAwayEdgeをアンインストールし、Edgeの機能を復元します。
+ GoAwayEdgeをアンインストールするには、インストーラーをご利用ください。
+ 以下のライセンスをお読みください。インストールを続行する前に、ライセンス条項に同意する必要があります。
+ 私はこのライセンスに同意する。
+ 私はこのライセンスを辞退する。
+ Edgeからのすべての通話をお気に入りのブラウザにリダイレクト。
+ 設定
+ 検索エンジン
+ お好きな検索エンジンを選択してください。
+ カスタム
+ カスタム検索エンジン
+ Microsoft Edge(安定版)を削除する
+ Microsoft Edgeをシステムから完全に削除する。
+ コントロールパネルのインストール
+ GoAwayEdgeをより簡単に設定するためにコントロールパネルをインストールしてください。
+ Microsoft EdgeはWindowsに深く統合されており、アップデート、ヘルプファイル、一部のアプリなど、多くの機能に不可欠なため、削除するとシステムに深刻な問題が発生する可能性があります。削除すると、動作が不安定になったり、機能が壊れたりする可能性があります。リスクを十分に理解し、信頼できるバックアップや復元ポイントがある場合にのみ実行してください。
+ Microsoft Edgeを削除する
+ インストール中 ...
+ インストールが完了するまでお待ちください。
+ 設置完了!
+ GoAwayEdgeを再度カスタマイズしたい場合は、このインストーラーを開くだけです。
+ アンインストールが完了しました!
+ GoAwayEdgeはシステムから正常に削除されました。
+ PayPalで寄付する
+ GoAwayEdgeコントロールパネル
+ GoAwayEdgeへようこそ
+ マイクロソフト・エッジ
+ ウィンドウズ・コパイロット
+ 検索エンジンの管理など。
+ GoAwayEdgeの有効化/無効化
+ 他のブラウザへの検索クエリの転送を無効にする。
+ GoAwayEdgeを有効にする
+ GoAwayEdgeを無効にする
+ GoAwayEdgeインストーラー
+ 次のページ
+ ウェザー・サービス
+ お好きなウェザーサイトにサービスを変更してください。
+ カスタム気象サービス
+ 気象庁のURLを入力してください。
+ コパイロット・キー
+ 外部プログラム
+ 応募への道
+ 実行したいアプリケーションを選択します。
+ 論争
+ アプリケーションの引数を定義する。
+ ソースが選択されていない
+ Microsoft Edgeの削除に失敗しました!もう一度お試しください。
+ {0}' の画像ファイル実行オプションの登録に失敗しました。もう一度お試しください。
+ 警告
+ キャンセル
+ ライセンス
+ リダイレクトか削除か?
+ Edgeからのすべての通話を別のブラウザにリダイレクトさせたいですか、それともEdgeを完全に削除したいですか?
+ すべてをリダイレクト
+ エッジ・チャンネル
+ インストールされているMicrosoft Edge Channelを選択します。
+ 検索エンジンからのクエリーURLを入力してください。
+ Copilotキーを押したときに外部アプリケーションを実行する。
+ ホットキーの管理など。
+ このシステムでGoAwayEdgeを有効にできませんでした:{0}
+ プロバイダーをお気に入りのAIに変更する(またはお気に入りのウェブサイトに変更する)。
+ GoAwayEdge の新バージョン (v{0}) がリリースされました。このアップデートには、新機能、バグ修正が含まれ、このアプリケーションの機能を保証します。
+ Microsoft Edgeが更新され、GoAwayEdgeはEdgeの機能を確保するために代替スタートアップファイルを更新する必要があります。
+ Edgeの代替スタートアップファイルが見つからないため、Edgeの機能を確保するためにコピーする必要があります。今すぐコピーしますか?
+ 後で思い出す
+ このバージョンをスキップする
+ 更新成功
+ Edgeの代替スタートアップファイルが正常に更新されました。
+ 創造に成功
+ Edgeの代替スタートアップファイルが正常に作成されました。
+ GoAwayEdgeはこのシステムで正常に有効化されました。
+ GoAwayEdgeはこのシステムで正常に無効化されました。
+ このシステムでGoAwayEdgeを無効にできませんでした:{0}
+ 設定を適用できませんでした:{0}
+ カスタムAIプロバイダー
+ AIプロバイダー(またはお好きなウェブサイト)のURLを入力してください。
+ 初期化に失敗した:{0}
+ インストールに失敗した:{0}
+ アンインストールに失敗しました:{0}
+ アップデートに失敗した:{0}
+ インストールに失敗しました!もう一度お試しください。
+ アップデートのインストール
+ AIプロバイダー
+ インストーラは、GoAwayEdgeをシステムにインストールするために必要なすべての手順を実行します。インストール後、すべてのEdgeコールがブラウザにリダイレクトされます。続行するには、希望のオプションを選択してください。
+ デフォルト
+ アンインストール
+ GoAwayEdgeを再度カスタマイズしたい場合は、このインストーラーまたはコントロールパネルを開くだけです。
+
diff --git a/GoAwayEdge/Localization/ResourceDictionary.ko-KR.xaml b/GoAwayEdge/Localization/ResourceDictionary.ko-KR.xaml
index 3a835c7..4792445 100644
--- a/GoAwayEdge/Localization/ResourceDictionary.ko-KR.xaml
+++ b/GoAwayEdge/Localization/ResourceDictionary.ko-KR.xaml
@@ -1,66 +1,102 @@
-
-
- GoAwayEdge 설치 관리자
- 다음
- 뒤로
- 종료
- 예
- 아니요
-
-
- 환영
- 설치 관리자가 시스템에 GoAwayEdge를 설치하는 데 필요한 모든 단계를 수행합니다. 설치가 완료되면 모든 Edge 호출이 브라우저로 리디렉션됩니다. 계속하려면 원하는 옵션을 선택하세요.
- 설치
- 시스템에 GoAwayEdge를 설치하고 구성합니다.
- 설치 제거
- GoAwayEdge를 제거하고 Edge 기능을 복원합니다.
- GoAwayEdge를 제거하려면 설치 관리자를 사용하세요.
-
-
- 라이선스
- 다음 라이센스를 읽어 보십시오. 설치를 계속하기 전에 라이선스 조건에 동의해야 합니다.
- 이 라이선스에 동의합니다.
- 이 라이선스를 거부합니다.
-
-
- 설정
- Edge 채널
- 설치된 Microsoft Edge 채널을 선택합니다.
- 검색 엔진
- 선호하는 검색 엔진을 선택합니다.
- 사용자 지정
- 사용자 지정 검색 엔진
- 검색 엔진에서 쿼리 URL을 입력하세요.
- Microsoft Edge 제거(안정)
- 시스템에서 Microsoft Edge를 완전히 제거합니다.
-
-
- 설치 진행 중 ...
- 설치가 완료될 때까지 기다려주세요.
-
-
- 설치 완료!
- GoAwayEdge를 다시 사용자 지정하려면 이 설치 관리자를 열기만 하면 됩니다.
- 제거 완료!
- GoAwayEdge가 시스템에서 성공적으로 제거되었습니다.
- PayPal로 기부하기
-
-
- 초기화 실패: {0}
- 설치 실패: {0}
- 제거 실패: {0}
- 업데이트 실패: {0}
- 설치에 실패했습니다! 다시 시도하세요.
- Microsoft Edge를 제거하지 못했습니다! 다시 시도하세요.
- '{0}'에 대한 이미지 파일 실행 옵션을 등록하지 못했습니다. 다시 시도해 주세요.
- GoAwayEdge의 새 버전(v{0}) 을 사용할 수 있습니다. 이 업데이트에는 새로운 기능과 버그 수정이 포함되어 있으며 이 애플리케이션의 기능을 보장합니다.
- Microsoft Edge가 업데이트되었으며 GoAwayEdge는 비IFEO 파일을 업데이트하여 Edge 기능을 보장해야 합니다.
- 비 IEFO 버전의 Edge가 누락되었으므로 Edge 기능을 보장하려면 복사해야 합니다. 지금 복사하시겠습니까?
- 업데이트 설치
- 나중에 알림
- 업데이트 성공
- Edge의 대체 시작 파일이 성공적으로 업데이트되었습니다.
- 생성 성공
- Edge의 대체 시작 파일이 성공적으로 생성되었습니다.
-
-
+
+ GoAwayEdge 설치 관리자
+ 다음
+ 뒤로
+ 종료
+ 예
+ 아니요
+
+ 환영
+ 설치 관리자가 시스템에 GoAwayEdge를 설치하는 데 필요한 모든 단계를 수행합니다. 설치가 완료되면 모든 Edge 호출이 브라우저로 리디렉션됩니다. 계속하려면 원하는 옵션을 선택하세요.
+ 설치
+ 시스템에 GoAwayEdge를 설치하고 구성합니다.
+ 설치 제거
+ GoAwayEdge를 제거하고 Edge 기능을 복원합니다.
+ GoAwayEdge를 제거하려면 설치 관리자를 사용하세요.
+
+ 라이선스
+ 다음 라이센스를 읽어 보십시오. 설치를 계속하기 전에 라이선스 조건에 동의해야 합니다.
+ 이 라이선스에 동의합니다.
+ 이 라이선스를 거부합니다.
+
+ 설정
+ Edge 채널
+ 설치된 Microsoft Edge 채널을 선택합니다.
+ 검색 엔진
+ 선호하는 검색 엔진을 선택합니다.
+ 사용자 지정
+ 사용자 지정 검색 엔진
+ 검색 엔진에서 쿼리 URL을 입력하세요.
+ Microsoft Edge 제거(안정)
+ 시스템에서 Microsoft Edge를 완전히 제거합니다.
+
+ 설치 진행 중 ...
+ 설치가 완료될 때까지 기다려주세요.
+
+ 설치 완료!
+ GoAwayEdge를 다시 사용자 지정하려면 이 설치 관리자를 열기만 하면 됩니다.
+ 제거 완료!
+ GoAwayEdge가 시스템에서 성공적으로 제거되었습니다.
+ PayPal로 기부하기
+
+ 초기화 실패: {0}
+ 설치 실패: {0}
+ 제거 실패: {0}
+ 업데이트 실패: {0}
+ 설치에 실패했습니다! 다시 시도하세요.
+ Microsoft Edge를 제거하지 못했습니다! 다시 시도하세요.
+ '{0}'에 대한 이미지 파일 실행 옵션을 등록하지 못했습니다. 다시 시도해 주세요.
+ GoAwayEdge의 새 버전(v{0}) 을 사용할 수 있습니다. 이 업데이트에는 새로운 기능과 버그 수정이 포함되어 있으며 이 애플리케이션의 기능을 보장합니다.
+ Microsoft Edge가 업데이트되었으며 GoAwayEdge는 비IFEO 파일을 업데이트하여 Edge 기능을 보장해야 합니다.
+ 비 IEFO 버전의 Edge가 누락되었으므로 Edge 기능을 보장하려면 복사해야 합니다. 지금 복사하시겠습니까?
+ 업데이트 설치
+ 나중에 알림
+ 업데이트 성공
+ Edge의 대체 시작 파일이 성공적으로 업데이트되었습니다.
+ 생성 성공
+ Edge의 대체 시작 파일이 성공적으로 생성되었습니다.
+ 이 버전 건너뛰기
+ 제어판 설치
+ 제어판을 설치하면 GoAwayEdge를 더 쉽게 구성할 수 있습니다.
+ 경고
+ 취소
+ 맞춤형 AI 제공업체
+ AI 제공업체(또는 즐겨찾는 웹사이트)의 URL을 입력하세요.
+ 기상 서비스
+ Microsoft Edge는 Windows에 깊이 통합되어 있고 업데이트, 도움말 파일 및 일부 앱을 비롯한 많은 기능에 필수적이므로 제거하면 심각한 시스템 문제가 발생할 수 있습니다. 삭제하면 시스템이 불안정해지거나 기능이 손상될 수 있습니다.\n\n위험을 완전히 이해하고 신뢰할 수 있는 백업 또는 복원 지점이 있는 경우에만 진행하세요.
+ Microsoft Edge 제거
+ GoAwayEdge 제어판
+ Microsoft Edge
+ Windows 코파일럿
+ 검색 엔진 등을 관리합니다.
+ 단축키 등 관리하기.
+ GoAwayEdge 활성화/비활성화
+ 다른 브라우저로 검색 쿼리 전달을 비활성화합니다.
+ GoAwayEdge 활성화
+ GoAwayEdge 비활성화
+ AI 제공업체
+ 제공업체를 즐겨찾는 AI(또는 즐겨찾는 웹사이트)로 변경하세요.
+ 즐겨 찾는 날씨 웹사이트로 서비스를 변경합니다.
+ 사용자 지정 날씨 서비스
+ 기상청의 URL을 입력하세요.
+ 부조종사 키
+ 외부 프로그램
+ GoAwayEdge에 오신 것을 환영합니다
+ Copilot 키를 누르면 외부 애플리케이션을 실행합니다.
+ 신청 경로
+ 실행하려는 애플리케이션을 선택합니다.
+ 인수
+ 애플리케이션의 인수를 정의합니다.
+ 선택한 소스 없음
+ 이 시스템에서 GoAwayEdge가 성공적으로 활성화되었습니다.
+ 이 시스템에서 GoAwayEdge가 성공적으로 비활성화되었습니다.
+ 이 시스템에서 GoAwayEdge를 활성화할 수 없습니다: {0}
+ 이 시스템에서 GoAwayEdge를 비활성화할 수 없습니다: {0}
+ 설정을 적용할 수 없습니다: {0}
+ 기본값
+ 리디렉션 또는 제거?
+ Edge에서 다른 브라우저로 모든 호출을 리디렉션하거나 Edge를 완전히 제거하시겠습니까?
+ 모든 것을 리디렉션
+ 모든 통화를 Edge에서 즐겨 사용하는 브라우저로 리디렉션하세요.
+ 이 설치 프로그램이나 제어판을 열면 GoAwayEdge를 다시 사용자 지정할 수 있습니다.
+
diff --git a/GoAwayEdge/Localization/ResourceDictionary.nl-NL.xaml b/GoAwayEdge/Localization/ResourceDictionary.nl-NL.xaml
new file mode 100644
index 0000000..523706f
--- /dev/null
+++ b/GoAwayEdge/Localization/ResourceDictionary.nl-NL.xaml
@@ -0,0 +1,96 @@
+
+ GoAwayEdge-installateur
+ Volgende
+ Terug
+ Ga naar
+ Welkom bij GoAwayEdge
+ Microsoft Edge
+ Windows Copiloot
+ Beheer zoekmachines en meer.
+ Sneltoetsen beheren en meer.
+ GoAwayEdge inschakelen/uitschakelen
+ Het doorsturen van zoekopdrachten naar andere browsers uitschakelen.
+ GoAwayEdge inschakelen
+ Ja
+ Geen
+ Welkom
+ GoAwayEdge uitschakelen
+ Installatie mislukt: {0}
+ De optie voor het uitvoeren van afbeeldingsbestanden voor '{0}' is niet geregistreerd. Probeer het opnieuw.
+ AI-aanbieder
+ Het installatieprogramma voert alle noodzakelijke stappen uit om GoAwayEdge op je systeem te installeren. Na de installatie worden alle Edge-oproepen omgeleid naar je browser. Selecteer de gewenste optie om verder te gaan.
+ Installeer
+ Installeer en configureer GoAwayEdge op uw systeem.
+ verwijderen
+ Wijzig de provider naar je favoriete AI (of naar je favoriete website).
+ AI-aanbieder op maat
+ Voer de URL in van de AI-provider (of je favoriete website).
+ Verwijder GoAwayEdge en herstel de Edge-functionaliteit.
+ Gebruik het installatieprogramma om GoAwayEdge te verwijderen.
+ Licentie
+ Lees de volgende licentie. U moet de voorwaarden van de licentie accepteren voordat u doorgaat met de installatie.
+ Waarschuwing
+ Annuleren
+ Ik wijs deze licentie af.
+ Omleiden of verwijderen?
+ Wil je alle oproepen van Edge omleiden naar een andere browser of Edge helemaal verwijderen?
+ Alles omleiden
+ Stuur alle oproepen vanuit Edge door naar je favoriete browser.
+ Instellingen
+ Randkanaal
+ Selecteer het geïnstalleerde Microsoft Edge-kanaal.
+ Zoekmachine
+ Selecteer je favoriete zoekmachine.
+ Aangepast
+ Aangepaste zoekmachine
+ Voer de URL van de zoekmachine in.
+ Microsoft Edge (Stabiel) verwijderen
+ Verwijder Microsoft Edge volledig uit het systeem.
+ Configuratiescherm installeren
+ Installeer het configuratiescherm om GoAwayEdge eenvoudiger te configureren.
+ Het verwijderen van Microsoft Edge kan ernstige systeemproblemen veroorzaken, omdat het diep in Windows is geïntegreerd en essentieel is voor veel functies, waaronder updates, helpbestanden en sommige apps. Het verwijderen kan resulteren in instabiliteit of gebroken functionaliteit. Ga alleen verder als je de risico's volledig begrijpt en een betrouwbare back-up of herstelpunt hebt.
+ Microsoft Edge verwijderen
+ Installatie bezig ...
+ Wacht tot de installatie is voltooid.
+ Installatie voltooid!
+ Open gewoon deze Installer als u GoAwayEdge opnieuw wilt aanpassen.
+ De-installatie voltooid!
+ GoAwayEdge is succesvol verwijderd van het systeem.
+ Doneer via PayPal
+ GoAwayEdge Bedieningspaneel
+ Weerservice
+ Voer de URL van de weerdienst in.
+ Sleutel copiloot
+ Extern programma
+ Pad naar toepassing
+ Selecteer de toepassing die je wilt uitvoeren.
+ Argumenten
+ Definieer de argumenten van je toepassing.
+ Geen bron geselecteerd
+ Initialisatie mislukt: {0}
+ De-installatie mislukt: {0}
+ Update mislukt: {0}
+ Installatie mislukt! Probeer het opnieuw.
+ De verwijdering van Microsoft Edge is mislukt! Probeer het opnieuw.
+ Er is een nieuwe versie van GoAwayEdge (v{0}) beschikbaar. Deze update bevat nieuwe functies en bugfixes en waarborgt de functionaliteit van deze applicatie.
+ Microsoft Edge is bijgewerkt en GoAwayEdge moet het alternatieve opstartbestand bijwerken om de Edge-functionaliteit te garanderen.
+ Het alternatieve opstartbestand van Edge ontbreekt en moet worden gekopieerd om de functionaliteit van Edge te garanderen. Nu kopiëren?
+ Update installeren
+ Herinner me later
+ Deze versie overslaan
+ Update succesvol
+ Het alternatieve opstartbestand van Edge is succesvol bijgewerkt.
+ Succesvolle creatie
+ Het alternatieve opstartbestand van Edge is met succes gemaakt.
+ GoAwayEdge is met succes ingeschakeld op dit systeem.
+ GoAwayEdge is met succes uitgeschakeld op dit systeem.
+ Kan GoAwayEdge niet inschakelen op dit systeem: {0}
+ Kan GoAwayEdge niet uitschakelen op dit systeem: {0}
+ Kon de instellingen niet toepassen: {0}
+ Standaard
+ Ik accepteer deze licentie.
+ Een externe toepassing uitvoeren wanneer je op de Copilot-toets drukt.
+ Wijzig de service naar uw favoriete weerwebsite.
+ Aangepaste weerdienst
+ Open gewoon dit installatieprogramma of het Configuratiescherm als je GoAwayEdge opnieuw wilt aanpassen.
+
diff --git a/GoAwayEdge/Localization/ResourceDictionary.pl-PL.xaml b/GoAwayEdge/Localization/ResourceDictionary.pl-PL.xaml
index fbf0549..e04e62d 100644
--- a/GoAwayEdge/Localization/ResourceDictionary.pl-PL.xaml
+++ b/GoAwayEdge/Localization/ResourceDictionary.pl-PL.xaml
@@ -1,66 +1,102 @@
-
-
- GoAwayEdge Installer
- Następny
- Powrót
- Wyjście
- Tak
- Nie
-
-
- Witamy
- Instalator wykona wszystkie niezbędne kroki, aby zainstalować GoAwayEdge w systemie. Po instalacji wszystkie połączenia Edge zostaną przekierowane do przeglądarki. Wybierz żądaną opcję, aby kontynuować.
- Instalacja
- Zainstaluj i skonfiguruj GoAwayEdge w swoim systemie.
- Odinstaluj
- Odinstaluj GoAwayEdge i przywróć funkcjonalność Edge.
- Użyj Instalatora, aby odinstalować GoAwayEdge.
-
-
- Licencja
- Prosimy o zapoznanie się z poniższą licencją. Przed kontynuowaniem instalacji należy zaakceptować warunki licencji.
- Akceptuję tę licencję.
- Odrzucam tę licencję.
-
-
- Ustawienia
- Kanał krawędziowy
- Wybierz zainstalowany kanał Microsoft Edge.
- Wyszukiwarka
- Wybierz swoją ulubioną wyszukiwarkę.
- Niestandardowe
- Niestandardowa wyszukiwarka
- Wprowadź adres URL zapytania z wyszukiwarki.
- Usuń Microsoft Edge (stabilny)
- Całkowicie usuń Microsoft Edge z systemu.
-
-
- Instalacja w toku ...
- Poczekaj na zakończenie instalacji.
-
-
- Instalacja zakończona!
- Po prostu otwórz ten instalator, jeśli chcesz ponownie dostosować GoAwayEdge.
- Dezinstalacja zakończona!
- GoAwayEdge został pomyślnie usunięty z systemu.
- Przekaż darowiznę przez PayPal
-
-
- Inicjalizacja nie powiodła się: {0}
- Instalacja nie powiodła się: {0}
- Deinstalacja nie powiodła się: {0}
- Aktualizacja nie powiodła się: {0}
- Instalacja nie powiodła się! Spróbuj ponownie.
- Usunięcie Microsoft Edge nie powiodło się! Spróbuj ponownie.
- Nie udało się zarejestrować opcji wykonania pliku obrazu dla '{0}'. Spróbuj ponownie.
- Dostępna jest nowa wersja GoAwayEdge (v{0}). Ta aktualizacja zawiera nowe funkcje, poprawki błędów i zapewnia funkcjonalność tej aplikacji.
- Microsoft Edge został zaktualizowany i GoAwayEdge musi zaktualizować plik non-IFEO, aby zapewnić jego funkcjonalność.
- Brakuje wersji Edge innej niż IEFO i należy ją skopiować, aby zapewnić funkcjonalność Edge. Skopiować teraz?
- Zainstaluj aktualizację
- Przypomnij mi później
- Aktualizacja zakończona sukcesem
- Wersja Edge inna niż IEFO została pomyślnie zaktualizowana.
- Tworzenie zakończone sukcesem
- Wersja Edge bez IFO została pomyślnie utworzona.
-
-
+
+ GoAwayEdge Installer
+ Następny
+ Powrót
+ Wyjście
+ Tak
+ Nie
+
+ Witamy
+ Instalator wykona wszystkie niezbędne kroki, aby zainstalować GoAwayEdge w systemie. Po instalacji wszystkie połączenia Edge zostaną przekierowane do przeglądarki. Wybierz żądaną opcję, aby kontynuować.
+ Instalacja
+ Zainstaluj i skonfiguruj GoAwayEdge w swoim systemie.
+ Odinstaluj
+ Odinstaluj GoAwayEdge i przywróć funkcjonalność Edge.
+ Użyj Instalatora, aby odinstalować GoAwayEdge.
+
+ Licencja
+ Prosimy o zapoznanie się z poniższą licencją. Przed kontynuowaniem instalacji należy zaakceptować warunki licencji.
+ Akceptuję tę licencję.
+ Odrzucam tę licencję.
+
+ Ustawienia
+ Kanał krawędziowy
+ Wybierz zainstalowany kanał Microsoft Edge.
+ Wyszukiwarka
+ Wybierz swoją ulubioną wyszukiwarkę.
+ Niestandardowe
+ Niestandardowa wyszukiwarka
+ Wprowadź adres URL zapytania z wyszukiwarki.
+ Usuń Microsoft Edge (stabilny)
+ Całkowicie usuń Microsoft Edge z systemu.
+
+ Instalacja w toku ...
+ Poczekaj na zakończenie instalacji.
+
+ Instalacja zakończona!
+ Po prostu otwórz ten instalator, jeśli chcesz ponownie dostosować GoAwayEdge.
+ Dezinstalacja zakończona!
+ GoAwayEdge został pomyślnie usunięty z systemu.
+ Przekaż darowiznę przez PayPal
+
+ Inicjalizacja nie powiodła się: {0}
+ Instalacja nie powiodła się: {0}
+ Deinstalacja nie powiodła się: {0}
+ Aktualizacja nie powiodła się: {0}
+ Instalacja nie powiodła się! Spróbuj ponownie.
+ Usunięcie Microsoft Edge nie powiodło się! Spróbuj ponownie.
+ Nie udało się zarejestrować opcji wykonania pliku obrazu dla '{0}'. Spróbuj ponownie.
+ Dostępna jest nowa wersja GoAwayEdge (v{0}). Ta aktualizacja zawiera nowe funkcje, poprawki błędów i zapewnia funkcjonalność tej aplikacji.
+ Microsoft Edge został zaktualizowany i GoAwayEdge musi zaktualizować plik non-IFEO, aby zapewnić jego funkcjonalność.
+ Brakuje wersji Edge innej niż IEFO i należy ją skopiować, aby zapewnić funkcjonalność Edge. Skopiować teraz?
+ Zainstaluj aktualizację
+ Przypomnij mi później
+ Aktualizacja zakończona sukcesem
+ Wersja Edge inna niż IEFO została pomyślnie zaktualizowana.
+ Tworzenie zakończone sukcesem
+ Wersja Edge bez IFO została pomyślnie utworzona.
+ Pomiń tę wersję
+ Czy chcesz przekierować wszystkie połączenia z Edge do innej przeglądarki lub całkowicie usunąć Edge?
+ Dostawca AI
+ Uruchomienie zewnętrznej aplikacji po naciśnięciu przycisku Copilot.
+ Usunięcie przeglądarki Microsoft Edge może spowodować poważne problemy systemowe, ponieważ jest ona głęboko zintegrowana z systemem Windows i niezbędna dla wielu funkcji, w tym aktualizacji, plików pomocy i niektórych aplikacji. Usunięcie go może spowodować niestabilność lub uszkodzenie funkcji.\n\nKontynuuj tylko wtedy, gdy w pełni rozumiesz ryzyko i masz niezawodną kopię zapasową lub punkt przywracania.
+ Wprowadź adres URL z serwisu pogodowego.
+ GoAwayEdge został pomyślnie włączony w tym systemie.
+ Wybierz aplikację, którą chcesz uruchomić.
+ Argumenty
+ Zdefiniuj argumenty swojej aplikacji.
+ Nie wybrano źródła
+ Funkcja GoAwayEdge została pomyślnie wyłączona w tym systemie.
+ Instalacja panelu sterowania
+ Zainstaluj Panel sterowania, aby łatwiej skonfigurować GoAwayEdge.
+ Zmień dostawcę na swojego ulubionego AI (lub na swoją ulubioną stronę internetową).
+ Dostawca niestandardowej sztucznej inteligencji
+ Domyślny
+ Ostrzeżenie
+ Anuluj
+ Przekierować czy usunąć?
+ Przekieruj wszystko
+ Przekieruj wszystkie połączenia z Edge do swojej ulubionej przeglądarki.
+ Usuń Microsoft Edge
+ Panel sterowania GoAwayEdge
+ Witamy w GoAwayEdge
+ Microsoft Edge
+ Windows Copilot
+ Zarządzanie wyszukiwarkami i nie tylko.
+ Zarządzanie skrótami klawiszowymi i nie tylko.
+ Włączanie/wyłączanie GoAwayEdge
+ Dezaktywacja przekazywania zapytań wyszukiwania do innych przeglądarek.
+ Włącz GoAwayEdge
+ Wyłącz GoAwayEdge
+ Wprowadź adres URL z dostawcy AI (lub swojej ulubionej strony internetowej).
+ Serwis pogodowy
+ Zmień usługę na swoją ulubioną witrynę pogodową.
+ Niestandardowa usługa pogodowa
+ Copilot Key
+ Program zewnętrzny
+ Ścieżka do aplikacji
+ Nie można włączyć GoAwayEdge w tym systemie: {0}
+ Nie można wyłączyć GoAwayEdge w tym systemie: {0}
+ Nie można zastosować ustawień: {0}
+ Po prostu otwórz ten instalator lub Panel sterowania, jeśli chcesz ponownie dostosować GoAwayEdge.
+
diff --git a/GoAwayEdge/Localization/ResourceDictionary.pt-BR.xaml b/GoAwayEdge/Localization/ResourceDictionary.pt-BR.xaml
index a89736b..7f1587e 100644
--- a/GoAwayEdge/Localization/ResourceDictionary.pt-BR.xaml
+++ b/GoAwayEdge/Localization/ResourceDictionary.pt-BR.xaml
@@ -1,14 +1,10 @@
-
-
+
Instalador GoAwayEdge
Avançar
Voltar
Sair
Sim
Não
-
Boas-vindas
O instalador realizará todos os passos necessários para instalar o GoAwayEdge em seu sistema. Após a instalação, todas as chamadas do Edge serão redirecionadas para o seu navegador. Selecione a opção desejada para continuar.
@@ -17,13 +13,11 @@
Desinstalar
Desinstale o GoAwayEdge e restaure a funcionalidade do Edge.
Por favor, utilize o Instalador para desinstalar o GoAwayEdge.
-
Licença
Por favor, leia a seguinte Licença. Você deve aceitar os termos da licença antes de continuar com a instalação.
Aceito esta licença.
Recuso esta licença.
-
Configurações
Canal do Edge
@@ -35,18 +29,15 @@
Por favor, insira a URL de consulta do mecanismo de busca.
Remover o Microsoft Edge (Estável)
Remova completamente o Microsoft Edge do sistema.
-
Instalação em progresso...
Aguarde até que a instalação seja concluída.
-
Instalação concluída!
Simplesmente abra este Instalador, se desejar personalizar o GoAwayEdge novamente.
Desinstalação concluída!
O GoAwayEdge foi removido com sucesso do sistema.
Doe via PayPal
-
Inicialização falhou: {0}
Instalação falhou: {0}
@@ -65,5 +56,47 @@
O arquivo de inicialização alternativo do Edge foi atualizado com sucesso.
Criação bem-sucedida
O arquivo de inicialização alternativo do Edge foi criado com sucesso.
-
+ Instalar Painel de Controle
+ Instalar o Painel de Controle para configurar o GoAwayEdge mais facilmente.
+ Execute um aplicativo externo quando você pressionar a tecla Copilot.
+ A remoção do Microsoft Edge pode causar sérios problemas no sistema, pois ele está profundamente integrado ao Windows e é essencial para muitos recursos, incluindo atualizações, arquivos de ajuda e alguns aplicativos. Excluí-lo pode resultar em instabilidade ou funcionalidade interrompida.\n\nSó prossiga se você compreender totalmente os riscos e tiver um backup ou ponto de restauração confiável.
+ Não foi possível aplicar as configurações: {0}
+ Não foi possível desativar o GoAwayEdge neste sistema: {0}
+ Deseja redirecionar todas as chamadas do Edge para outro navegador ou remover completamente o Edge?
+ Caminho para o aplicativo
+ Selecione o aplicativo que deseja executar.
+ Gerencie teclas de atalho e muito mais.
+ Ativar/desativar o GoAwayEdge
+ Desativar o encaminhamento de consultas de pesquisa para outros navegadores.
+ Ativar o GoAwayEdge
+ Desativar o GoAwayEdge
+ Serviço meteorológico
+ Altere o serviço para seu site de clima favorito.
+ Serviço meteorológico personalizado
+ Digite o URL do Serviço de Meteorologia.
+ Chave do copiloto
+ Programa externo
+ Argumentos
+ Defina os argumentos de seu aplicativo.
+ Nenhuma fonte selecionada
+ O GoAwayEdge foi desativado com sucesso neste sistema.
+ Não foi possível ativar o GoAwayEdge neste sistema: {0}
+ Provedor de IA
+ Altere o provedor para sua IA favorita (ou para seu site favorito).
+ Provedor de IA personalizado
+ Digite o URL do provedor de IA (ou seu site favorito).
+ O GoAwayEdge foi ativado com sucesso neste sistema.
+ Padrão
+ Advertência
+ Cancelar
+ Redirecionar ou remover?
+ Redirecionar tudo
+ Redirecione todas as chamadas do Edge para seu navegador favorito.
+ Remover Microsoft Edge
+ Painel de controle do GoAwayEdge
+ Bem-vindo ao GoAwayEdge
+ Microsoft Edge
+ Windows Copilot
+ Gerenciar mecanismos de pesquisa e muito mais.
+ Basta abrir esse instalador ou o Painel de Controle se quiser personalizar o GoAwayEdge novamente.
diff --git a/GoAwayEdge/Localization/ResourceDictionary.pt-PT.xaml b/GoAwayEdge/Localization/ResourceDictionary.pt-PT.xaml
new file mode 100644
index 0000000..d70bd09
--- /dev/null
+++ b/GoAwayEdge/Localization/ResourceDictionary.pt-PT.xaml
@@ -0,0 +1,96 @@
+
+ Instalador GoAwayEdge
+ Seguinte
+ Executar uma aplicação externa quando se prime a tecla Copilot.
+ Voltar
+ Sair
+ Sim
+ Não
+ Bem-vindo
+ O instalador executará todos os passos necessários para instalar o GoAwayEdge no seu sistema. Após a instalação, todas as chamadas do Edge serão redireccionadas para o seu browser. Por favor, selecione a opção desejada para continuar.
+ Instalar
+ Instale e configure o GoAwayEdge no seu sistema.
+ Desinstalar
+ Desinstalar o GoAwayEdge e restaurar a funcionalidade do Edge.
+ Selecione o canal Microsoft Edge instalado.
+ Motor de busca
+ Selecione o seu motor de busca preferido.
+ Personalizado
+ Instale o Painel de Controle para configurar o GoAwayEdge com mais facilidade.
+ Instalação em curso ...
+ Aguarde até que a instalação seja concluída.
+ Aviso
+ Cancelar
+ Criação bem sucedida
+ O arquivo de inicialização alternativo do Edge foi criado com sucesso.
+ O GoAwayEdge foi ativado com sucesso neste sistema.
+ Não foi possível ativar o GoAwayEdge neste sistema: {0}
+ Não foi possível desativar o GoAwayEdge neste sistema: {0}
+ Não foi possível aplicar as definições: {0}
+ O GoAwayEdge foi desativado com êxito neste sistema.
+ Altere o fornecedor para a sua IA favorita (ou para o seu sítio Web favorito).
+ Fornecedor de IA personalizado
+ Fornecedor de IA
+ A inicialização falhou: {0}
+ A instalação falhou! Por favor, tente novamente.
+ Instalar a atualização
+ Utilize o Instalador para desinstalar o GoAwayEdge.
+ Licença
+ Aceito esta licença.
+ Motor de pesquisa personalizado
+ Introduza o URL de consulta do motor de busca.
+ Remover Microsoft Edge (Estável)
+ Remover o Microsoft Edge completamente do sistema.
+ Instalar o painel de controlo
+ Por favor, leia a seguinte Licença. O utilizador deve aceitar os termos da licença antes de continuar com a instalação.
+ Definições
+ Canal de borda
+ Instalação concluída!
+ A remoção do Microsoft Edge pode causar problemas graves no sistema, uma vez que está profundamente integrado no Windows e é essencial para muitas funcionalidades, incluindo actualizações, ficheiros de ajuda e algumas aplicações. A sua eliminação pode resultar em instabilidade ou quebra de funcionalidade.\n\nSó prossiga se compreender totalmente os riscos e tiver uma cópia de segurança ou ponto de restauro fiável.
+ Basta abrir este Instalador, se quiser personalizar o GoAwayEdge novamente.
+ Desinstalação concluída!
+ O GoAwayEdge foi removido com sucesso do sistema.
+ Doar através de PayPal
+ Painel de controlo GoAwayEdge
+ Bem-vindo ao GoAwayEdge
+ Microsoft Edge
+ Copiloto do Windows
+ Gerir motores de busca e muito mais.
+ Gerir teclas de atalho e muito mais.
+ Ativar/desativar o GoAwayEdge
+ Desativar o reencaminhamento de consultas de pesquisa para outros navegadores.
+ Ativar o GoAwayEdge
+ Desativar o GoAwayEdge
+ Introduza o URL do fornecedor de IA (ou do seu sítio Web preferido).
+ Serviço meteorológico
+ Altere o serviço para o seu sítio Web de meteorologia favorito.
+ Serviço meteorológico personalizado
+ Introduza o URL do serviço meteorológico.
+ Chave do copiloto
+ Programa externo
+ Caminho para a aplicação
+ Selecione a aplicação que pretende executar.
+ Argumentos
+ Defina os argumentos da sua aplicação.
+ Nenhuma fonte selecionada
+ A instalação falhou: {0}
+ A desinstalação falhou: {0}
+ A atualização falhou: {0}
+ A remoção do Microsoft Edge falhou! Por favor, tente novamente.
+ Falha ao registar a Opção de Execução de Ficheiro de Imagem para '{0}'. Por favor, tente novamente.
+ Está disponível uma nova versão do GoAwayEdge (v{0}). Esta atualização inclui novas caraterísticas, correcções de erros e assegura a funcionalidade desta aplicação.
+ O Microsoft Edge foi atualizado e o GoAwayEdge precisa atualizar o arquivo de inicialização alternativo para garantir a funcionalidade do Edge.
+ O ficheiro de arranque alternativo do Edge está em falta e tem de ser copiado para garantir a funcionalidade do Edge. Copiar agora?
+ Lembrar-me mais tarde
+ Saltar esta versão
+ Atualização bem sucedida
+ O ficheiro de arranque alternativo do Edge foi atualizado com êxito.
+ Predefinição
+ Recuso esta licença.
+ Redirecionar ou remover?
+ Pretende redirecionar todas as chamadas do Edge para outro navegador ou remover completamente o Edge?
+ Redirecionar tudo
+ Redirecionar todas as chamadas do Edge para o seu browser favorito.
+ Remover Microsoft Edge
+ Basta abrir este instalador ou o Painel de Controlo se pretender personalizar novamente o GoAwayEdge.
+
diff --git a/GoAwayEdge/Localization/ResourceDictionary.ro-RO.xaml b/GoAwayEdge/Localization/ResourceDictionary.ro-RO.xaml
new file mode 100644
index 0000000..50fc405
--- /dev/null
+++ b/GoAwayEdge/Localization/ResourceDictionary.ro-RO.xaml
@@ -0,0 +1,96 @@
+
+ Furnizor AI
+ Instalator GoAwayEdge
+ Următorul
+ Canal de margine
+ Selectați canalul Microsoft Edge instalat.
+ Motor de căutare
+ Avertisment
+ Anulează
+ Eliminarea Microsoft Edge poate cauza probleme grave de sistem, deoarece este profund integrat în Windows și esențial pentru multe caracteristici, inclusiv actualizări, fișiere de ajutor și unele aplicații. Ștergerea acestuia ar putea duce la instabilitate sau funcționalitate întreruptă.\n\nApoi continuați numai dacă înțelegeți pe deplin riscurile și aveți o copie de rezervă sau un punct de restaurare de încredere.
+ Instalare finalizată!
+ Dezinstalare finalizată!
+ Eliminați Microsoft Edge
+ Înapoi
+ Ieșire
+ Da
+ Nu
+ Bine ați venit
+ Instalați
+ Selectați motorul de căutare preferat.
+ Personalizat
+ Motor de căutare personalizat
+ Vă rugăm să introduceți URL-ul de interogare de la motorul de căutare.
+ Eliminați Microsoft Edge (Stabil)
+ Eliminați Microsoft Edge complet din sistem.
+ Instalarea panoului de control
+ Instalați Panoul de control pentru a configura mai ușor GoAwayEdge.
+ Schimbați furnizorul la AI-ul dvs. preferat (sau la site-ul dvs. preferat).
+ Furnizor de AI personalizat
+ Vă rugăm să introduceți URL-ul de la furnizorul de AI (sau site-ul dvs. preferat).
+ Pur și simplu deschideți acest program de instalare, dacă doriți să personalizați GoAwayEdge din nou.
+ GoAwayEdge a fost eliminat cu succes din sistem.
+ Donați prin PayPal
+ Panou de control GoAwayEdge
+ Bine ați venit la GoAwayEdge
+ Nu s-a putut dezactiva GoAwayEdge pe acest sistem: {0}
+ Nu s-a putut aplica setările: {0}
+ Dezactivați redirecționarea interogărilor de căutare către alte browsere.
+ Dezactivați GoAwayEdge
+ Serviciul meteorologic
+ Actualizare reușită
+ Fișierul de pornire alternativ al Edge a fost actualizat cu succes.
+ Creație de succes
+ Fișierul de pornire alternativ al Edge a fost creat cu succes.
+ GoAwayEdge a fost activat cu succes pe acest sistem.
+ GoAwayEdge a fost dezactivat cu succes pe acest sistem.
+ Nu s-a putut activa GoAwayEdge pe acest sistem: {0}
+ Schimbați serviciul la site-ul Weather preferat.
+ Serviciul meteorologic personalizat
+ Vă rugăm să introduceți URL-ul de la Serviciul meteorologic.
+ Cheie copilot
+ Program extern
+ Calea către cerere
+ Selectați aplicația pe care doriți să o rulați.
+ Argumente
+ Definiți argumentele aplicației dumneavoastră.
+ Nicio sursă selectată
+ Inițializarea a eșuat: {0}
+ Instalarea a eșuat: {0}
+ Dezinstalarea a eșuat: {0}
+ Instalarea a eșuat! Vă rugăm să încercați din nou.
+ Eliminarea Microsoft Edge a eșuat! Vă rugăm să încercați din nou.
+ Nu s-a reușit înregistrarea opțiunii de execuție a fișierului imagine pentru '{0}'. Vă rugăm să încercați din nou.
+ O nouă versiune a GoAwayEdge (v{0}) este disponibilă. Această actualizare include caracteristici noi, remedieri de erori și asigură funcționalitatea acestei aplicații.
+ Microsoft Edge a fost actualizat și GoAwayEdge trebuie să actualizeze fișierul de pornire alternativ pentru a asigura funcționalitatea Edge.
+ Fișierul de pornire alternativ al Edge lipsește și trebuie copiat pentru a asigura funcționalitatea Edge. Copiați acum?
+ Instalați actualizarea
+ Amintește-mi mai târziu
+ Sari peste această versiune
+ Rulați o aplicație externă atunci când apăsați tasta Copilot.
+ Implicit
+ Programul de instalare va efectua toți pașii necesari pentru a instala GoAwayEdge pe sistemul dvs. După instalare, toate apelurile Edge vor fi redirecționate către browserul dumneavoastră. Vă rugăm să selectați opțiunea dorită pentru a continua.
+ Instalați și configurați GoAwayEdge pe sistemul dvs.
+ Dezinstalare
+ Dezinstalați GoAwayEdge și restabiliți funcționalitatea Edge.
+ Vă rugăm să utilizați programul de instalare pentru a dezinstala GoAwayEdge.
+ Licență
+ Vă rugăm să citiți următoarea licență. Trebuie să acceptați termenii licenței înainte de a continua cu instalarea.
+ Accept această licență.
+ Refuz această licență.
+ Redirecționare sau eliminare?
+ Doriți să redirecționați toate apelurile din Edge către un alt browser sau să eliminați complet Edge?
+ Redirecționați totul
+ Redirecționați toate apelurile din Edge către browserul dvs. preferat.
+ Setări
+ Actualizarea a eșuat: {0}
+ Instalare în curs ...
+ Vă rugăm să așteptați până la finalizarea instalării.
+ Microsoft Edge
+ Windows Copilot
+ Gestionați motoarele de căutare și multe altele.
+ Gestionați comenzile rapide și multe altele.
+ Activare/Dezactivare GoAwayEdge
+ Activați GoAwayEdge
+ Pur și simplu deschideți acest program de instalare sau panoul de control dacă doriți să personalizați din nou GoAwayEdge.
+
diff --git a/GoAwayEdge/Localization/ResourceDictionary.xaml b/GoAwayEdge/Localization/ResourceDictionary.xaml
index 73c8534..1aa727e 100644
--- a/GoAwayEdge/Localization/ResourceDictionary.xaml
+++ b/GoAwayEdge/Localization/ResourceDictionary.xaml
@@ -7,6 +7,9 @@
Exit
Yes
No
+ Default
+ Warning
+ Cancel
Welcome
@@ -23,6 +26,12 @@
I accept this license.
I decline this license.
+
+ Redirect or Remove?
+ Do you want to redirect all calls from Edge to another browser, or completely remove Edge?
+ Redirect everything
+ Redirect all calls from Edge to your favorite browser.
+
Settings
Edge Channel
@@ -34,6 +43,10 @@
Please enter the query URL from the search engine.
Remove Microsoft Edge (Stable)
Remove Microsoft Edge completely from the system.
+ Install Control Panel
+ Install the Control Panel to configure GoAwayEdge more easily.
+ Removing Microsoft Edge can cause serious system issues, as it’s deeply integrated into Windows and essential for many features, including updates, help files, and some apps. Deleting it could result in instability or broken functionality.\n\nOnly proceed if you fully understand the risks and have a reliable backup or restore point in place.
+ Remove Microsoft Edge
Installation in progress ...
@@ -42,10 +55,39 @@
Installation completed!
Simply open this Installer, if you want to customize GoAwayEdge again.
+ Simply open this installer or the Control Panel if you want to customize GoAwayEdge again.
Uninstallation completed!
GoAwayEdge has been successfully removed from the system.
Donate via PayPal
+
+ GoAwayEdge Control Panel
+ Welcome to GoAwayEdge
+ Microsoft Edge
+ Windows Copilot
+ Manage Search Engines and more.
+ Manage Hotkeys and more.
+ Enable/Disable GoAwayEdge
+ Deactivate the forwarding of search queries to other browsers.
+ Enable GoAwayEdge
+ Disable GoAwayEdge
+ AI Provider
+ Change the provider to your favorite AI (or to your favorite website).
+ Custom AI Provider
+ Please enter the URL from the AI Provider (or your favorite website).
+ Weather Service
+ Change the service to your favorite Weather website.
+ Custom Weather Service
+ Please enter the URL from the Weather Service.
+ Copilot Key
+ External Program
+ Run an external application when you press the Copilot key.
+ Path to Application
+ Select the application you want to run.
+ Arguments
+ Define the arguments of your application.
+ No source selected
+
Initialization failed: {0}
Installation failed: {0}
@@ -64,5 +106,10 @@
The alternative startup file of Edge has been successfully updated.
Creation successful
The alternative startup file of Edge has been successfully created.
+ GoAwayEdge was successfully enabled on this system.
+ GoAwayEdge was successfully disabled on this system.
+ Could not enable GoAwayEdge on this system: {0}
+ Could not disable GoAwayEdge on this system: {0}
+ Could not apply the settings: {0}
\ No newline at end of file
diff --git a/GoAwayEdge/Pages/Settings.xaml.cs b/GoAwayEdge/Pages/Settings.xaml.cs
deleted file mode 100644
index 104a26a..0000000
--- a/GoAwayEdge/Pages/Settings.xaml.cs
+++ /dev/null
@@ -1,139 +0,0 @@
-using System.Windows;
-using System.Windows.Controls;
-using GoAwayEdge.Common;
-
-namespace GoAwayEdge.Pages
-{
- ///
- /// Interaktionslogik für Settings.xaml
- ///
- public partial class Settings
- {
- public Settings()
- {
- InitializeComponent();
-
- EdgeChannelBox.Items.Add("Edge Stable");
- EdgeChannelBox.Items.Add("Edge Beta");
- EdgeChannelBox.Items.Add("Edge Dev");
- EdgeChannelBox.Items.Add("Edge Canary");
- EdgeChannelBox.SelectedIndex = 0;
- Configuration.Channel = EdgeChannel.Stable;
-
- SearchEngineBox.Items.Add("Google");
- SearchEngineBox.Items.Add("Bing");
- SearchEngineBox.Items.Add("DuckDuckGo");
- SearchEngineBox.Items.Add("Yahoo");
- SearchEngineBox.Items.Add("Yandex");
- SearchEngineBox.Items.Add("Ecosia");
- SearchEngineBox.Items.Add("Ask");
- SearchEngineBox.Items.Add("Qwant");
- SearchEngineBox.Items.Add("Perplexity");
-
- try
- {
- Dispatcher.Invoke(() =>
- {
- var resourceValue = (string)Application.Current.MainWindow!.FindResource("SettingsSearchEngineCustomItem");
- SearchEngineBox.Items.Add(!string.IsNullOrEmpty(resourceValue) ? resourceValue : "Custom");
- });
- }
- catch
- {
- SearchEngineBox.Items.Add("Custom");
- }
-
- if (Configuration.NoEdgeInstalled)
- {
- MsEdgeRemoveStackPanel.IsEnabled = false;
- EdgeStackPanel.IsEnabled = false;
- }
-
- SearchEngineBox.SelectedIndex = 0;
- Configuration.Search = SearchEngine.Google;
- Configuration.Uninstall = false;
- }
-
- private void EdgeChannelBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
- {
- Configuration.Channel = EdgeChannelBox.SelectedIndex switch
- {
- 0 => EdgeChannel.Stable,
- 1 => EdgeChannel.Beta,
- 2 => EdgeChannel.Dev,
- 3 => EdgeChannel.Canary,
- _ => EdgeChannel.Stable
- };
- }
-
- private void SearchEngineBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
- {
- switch (SearchEngineBox.SelectedIndex)
- {
- case 0:
- Configuration.Search = SearchEngine.Google;
- CustomSearchPanel.Visibility = Visibility.Collapsed;
- Installer.ContentWindow!.NextBtn.IsEnabled = true;
- break;
- case 1:
- Configuration.Search = SearchEngine.Bing;
- CustomSearchPanel.Visibility = Visibility.Collapsed;
- Installer.ContentWindow!.NextBtn.IsEnabled = true;
- break;
- case 2:
- Configuration.Search = SearchEngine.DuckDuckGo;
- CustomSearchPanel.Visibility = Visibility.Collapsed;
- Installer.ContentWindow!.NextBtn.IsEnabled = true;
- break;
- case 3:
- Configuration.Search = SearchEngine.Yahoo;
- CustomSearchPanel.Visibility = Visibility.Collapsed;
- Installer.ContentWindow!.NextBtn.IsEnabled = true;
- break;
- case 4:
- Configuration.Search = SearchEngine.Yandex;
- CustomSearchPanel.Visibility = Visibility.Collapsed;
- Installer.ContentWindow!.NextBtn.IsEnabled = true;
- break;
- case 5:
- Configuration.Search = SearchEngine.Ecosia;
- CustomSearchPanel.Visibility = Visibility.Collapsed;
- Installer.ContentWindow!.NextBtn.IsEnabled = true;
- break;
- case 6:
- Configuration.Search = SearchEngine.Ask;
- CustomSearchPanel.Visibility = Visibility.Collapsed;
- Installer.ContentWindow!.NextBtn.IsEnabled = true;
- break;
- case 7:
- Configuration.Search = SearchEngine.Qwant;
- CustomSearchPanel.Visibility = Visibility.Collapsed;
- Installer.ContentWindow!.NextBtn.IsEnabled = true;
- break;
- case 8:
- Configuration.Search = SearchEngine.Perplexity;
- CustomSearchPanel.Visibility = Visibility.Collapsed;
- Installer.ContentWindow!.NextBtn.IsEnabled = true;
- break;
- case 9:
- Configuration.Search = SearchEngine.Custom;
- CustomSearchPanel.Visibility = Visibility.Visible;
- if (string.IsNullOrEmpty(Configuration.CustomQueryUrl))
- Installer.ContentWindow!.NextBtn.IsEnabled = false;
- break;
- }
- }
-
- private void QueryUrlTextBox_OnTextChanged(object sender, TextChangedEventArgs e)
- {
- Configuration.CustomQueryUrl = QueryUrlTextBox.Text;
- Installer.ContentWindow!.NextBtn.IsEnabled = Uri.TryCreate(QueryUrlTextBox.Text, UriKind.Absolute, out var uriResult)
- && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps);
- }
-
- private void MsEdgeUninstallSwitch_OnClickUninstallSwitch_OnClick(object sender, RoutedEventArgs e)
- {
- Configuration.UninstallEdge = MsEdgeUninstallSwitch.IsChecked!.Value;
- }
- }
-}
diff --git a/GoAwayEdge/Properties/PublishProfiles/FolderProfile.pubxml.user b/GoAwayEdge/Properties/PublishProfiles/FolderProfile.pubxml.user
index d3e0d3b..24cbb46 100644
--- a/GoAwayEdge/Properties/PublishProfiles/FolderProfile.pubxml.user
+++ b/GoAwayEdge/Properties/PublishProfiles/FolderProfile.pubxml.user
@@ -4,7 +4,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
-->
- True|2024-07-22T16:41:59.8117684Z;True|2024-06-18T00:28:22.3138517+02:00;True|2024-06-18T00:16:46.9788815+02:00;True|2024-06-09T20:14:23.6305404+02:00;True|2024-06-09T19:02:49.2570274+02:00;True|2024-06-09T18:47:29.9573023+02:00;True|2024-06-09T18:46:39.8011527+02:00;False|2024-06-09T18:46:05.6633541+02:00;False|2024-06-09T18:45:59.2563619+02:00;True|2024-02-18T17:16:27.0408261+01:00;True|2024-02-18T17:15:41.3961034+01:00;True|2024-02-18T17:11:58.7761728+01:00;True|2024-02-18T17:08:57.9390623+01:00;True|2024-02-18T17:08:26.6377454+01:00;True|2024-02-18T17:07:45.2050537+01:00;True|2024-02-18T17:05:12.7495146+01:00;True|2024-02-18T17:02:32.4549017+01:00;True|2024-02-18T16:48:25.3074382+01:00;True|2023-10-19T00:00:28.0962969+02:00;True|2022-11-13T02:33:03.7406004+01:00;True|2022-11-13T02:19:07.9073988+01:00;True|2022-11-13T02:18:35.3043045+01:00;True|2022-11-12T20:05:07.6366825+01:00;False|2022-11-12T20:04:52.3576134+01:00;True|2022-11-12T19:36:12.8480978+01:00;
+ True|2024-12-26T17:33:52.9873568Z||;True|2024-12-26T18:31:07.1677995+01:00||;True|2024-12-26T17:03:19.1985996+01:00||;True|2024-12-26T16:24:41.8789667+01:00||;True|2024-12-26T15:22:32.4690057+01:00||;True|2024-12-26T15:09:04.1027404+01:00||;True|2024-12-26T15:03:19.0005711+01:00||;True|2024-12-25T17:22:09.8471194+01:00||;True|2024-08-13T19:39:30.3814052+02:00||;True|2024-08-13T19:35:07.3638159+02:00||;True|2024-08-13T01:10:27.4137217+02:00||;True|2024-08-13T01:06:17.9215774+02:00||;True|2024-08-13T00:56:54.4657665+02:00||;True|2024-08-13T00:49:21.1156303+02:00||;True|2024-08-13T00:45:56.3970427+02:00||;True|2024-08-13T00:25:23.5481220+02:00||;True|2024-08-12T22:11:19.4188626+02:00||;True|2024-08-12T22:10:38.2923046+02:00||;True|2024-08-12T22:08:45.6517147+02:00||;True|2024-07-30T00:22:22.2984409+02:00||;True|2024-07-30T00:18:17.4366719+02:00||;True|2024-07-30T00:17:49.8084336+02:00||;True|2024-07-22T18:41:59.8117684+02:00||;True|2024-06-18T00:28:22.3138517+02:00||;True|2024-06-18T00:16:46.9788815+02:00||;True|2024-06-09T20:14:23.6305404+02:00||;True|2024-06-09T19:02:49.2570274+02:00||;True|2024-06-09T18:47:29.9573023+02:00||;True|2024-06-09T18:46:39.8011527+02:00||;False|2024-06-09T18:46:05.6633541+02:00||;False|2024-06-09T18:45:59.2563619+02:00||;True|2024-02-18T17:16:27.0408261+01:00||;True|2024-02-18T17:15:41.3961034+01:00||;True|2024-02-18T17:11:58.7761728+01:00||;True|2024-02-18T17:08:57.9390623+01:00||;True|2024-02-18T17:08:26.6377454+01:00||;True|2024-02-18T17:07:45.2050537+01:00||;True|2024-02-18T17:05:12.7495146+01:00||;True|2024-02-18T17:02:32.4549017+01:00||;True|2024-02-18T16:48:25.3074382+01:00||;True|2023-10-19T00:00:28.0962969+02:00||;True|2022-11-13T02:33:03.7406004+01:00||;True|2022-11-13T02:19:07.9073988+01:00||;True|2022-11-13T02:18:35.3043045+01:00||;True|2022-11-12T20:05:07.6366825+01:00||;False|2022-11-12T20:04:52.3576134+01:00||;True|2022-11-12T19:36:12.8480978+01:00||;
\ No newline at end of file
diff --git a/GoAwayEdge/UserInterface/ControlPanel/ControlPanel.xaml b/GoAwayEdge/UserInterface/ControlPanel/ControlPanel.xaml
new file mode 100644
index 0000000..188c531
--- /dev/null
+++ b/GoAwayEdge/UserInterface/ControlPanel/ControlPanel.xaml
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/GoAwayEdge/UserInterface/ControlPanel/ControlPanel.xaml.cs b/GoAwayEdge/UserInterface/ControlPanel/ControlPanel.xaml.cs
new file mode 100644
index 0000000..c44d009
--- /dev/null
+++ b/GoAwayEdge/UserInterface/ControlPanel/ControlPanel.xaml.cs
@@ -0,0 +1,70 @@
+using GoAwayEdge.UserInterface.ControlPanel.Pages;
+using System.Diagnostics;
+using System.Diagnostics.CodeAnalysis;
+using System.IO;
+using System.Reflection;
+using System.Security.Principal;
+using System.Windows;
+using System.Windows.Threading;
+using Wpf.Ui.Controls;
+
+namespace GoAwayEdge.UserInterface.ControlPanel
+{
+ ///
+ /// Interaktionslogik für ControlPanel.xaml
+ ///
+ public partial class ControlPanel
+ {
+ private readonly DispatcherTimer _timer = new()
+ {
+ Interval = TimeSpan.FromSeconds(1)
+ };
+ public static ControlPanel? ContentWindow;
+
+ public ControlPanel()
+ {
+ InitializeComponent();
+
+#if DEBUG
+ DebugString.Visibility = Visibility.Visible;
+#else
+ DebugString.Visibility = Visibility.Collapsed;
+#endif
+
+ // Get version
+ var assembly = Assembly.GetExecutingAssembly();
+ var appDirectory = AppContext.BaseDirectory;
+ var assemblyPath = Path.Combine(appDirectory, $"{assembly.GetName().Name}.exe");
+ var fvi = FileVersionInfo.GetVersionInfo(assemblyPath);
+ var version = fvi.FileVersion;
+ Version.Text = $"Version {version}";
+
+ // Get User
+ var accountToken = WindowsIdentity.GetCurrent().Token;
+ var windowsIdentity = new WindowsIdentity(accountToken);
+ UserName.Text = windowsIdentity.Name;
+
+ // Time & Date
+ _timer.Tick += UpdateTimeAndDate_Tick!;
+ _timer.Start();
+
+ // Configuration.InitialEnvironment();
+ }
+
+ private void ControlCenter_OnLoaded(object? sender, EventArgs eventArgs)
+ {
+ RootNavigation.Navigate(typeof(Pages.HomeScreen));
+ }
+
+ private void UpdateTimeAndDate_Tick(object sender, EventArgs e)
+ {
+ Time.Text = DateTime.Now.ToShortTimeString();
+ Date.Text = DateTime.Now.ToShortDateString();
+ }
+
+ private void ThemeSwitch_Click(object sender, RoutedEventArgs e)
+ {
+ WindowBackdropType = WindowBackdropType == WindowBackdropType.Mica ? WindowBackdropType.Tabbed : WindowBackdropType.Mica;
+ }
+ }
+}
diff --git a/GoAwayEdge/UserInterface/ControlPanel/Pages/About.xaml b/GoAwayEdge/UserInterface/ControlPanel/Pages/About.xaml
new file mode 100644
index 0000000..0ad487d
--- /dev/null
+++ b/GoAwayEdge/UserInterface/ControlPanel/Pages/About.xaml
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ GoAwayEdge is licensed under MIT. So you are allowed to use freely and modify the application.
+ I will not be responsible for any outcome. Proceed with any action at your own risk.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/GoAwayEdge/UserInterface/ControlPanel/Pages/About.xaml.cs b/GoAwayEdge/UserInterface/ControlPanel/Pages/About.xaml.cs
new file mode 100644
index 0000000..354c270
--- /dev/null
+++ b/GoAwayEdge/UserInterface/ControlPanel/Pages/About.xaml.cs
@@ -0,0 +1,94 @@
+using System.Diagnostics;
+using System.IO;
+using System.Reflection;
+using System.Windows;
+
+namespace GoAwayEdge.UserInterface.ControlPanel.Pages
+{
+ ///
+ /// Interaktionslogik für About.xaml
+ ///
+ public partial class About
+ {
+ public About()
+ {
+ InitializeComponent();
+
+ string versionText;
+ var assembly = Assembly.GetExecutingAssembly();
+ var version = Assembly.GetExecutingAssembly().GetName().Version!;
+ try
+ {
+ var informationVersion = assembly.GetCustomAttribute()?.InformationalVersion;
+ if (!string.IsNullOrEmpty(informationVersion) && version.ToString() != informationVersion)
+ {
+ versionText = $"{version}-{informationVersion}";
+ }
+ else
+ {
+ versionText = $"{version}";
+ }
+ }
+ catch
+ {
+ versionText = $"{version}";
+ }
+ var appDirectory = AppContext.BaseDirectory;
+ var assemblyPath = Path.Combine(appDirectory, $"{assembly.GetName().Name}.exe");
+ var fvi = FileVersionInfo.GetVersionInfo(assemblyPath);
+ ValueVersion.Content = $"{fvi.ProductName} v{versionText}";
+ ValueCopyright.Content = fvi.LegalCopyright;
+ }
+
+ private void Homepage_OnClick(object sender, RoutedEventArgs e)
+ {
+ try
+ {
+ Process.Start(new ProcessStartInfo { FileName = "https://valnoxy.dev", UseShellExecute = true });
+ }
+ catch (System.ComponentModel.Win32Exception noBrowser)
+ {
+ if (noBrowser.ErrorCode == -2147467259)
+ MessageBox.Show(noBrowser.Message);
+ }
+ catch (Exception other)
+ {
+ MessageBox.Show(other.Message);
+ }
+ }
+
+ private void Donate_OnClick(object sender, RoutedEventArgs e)
+ {
+ try
+ {
+ Process.Start(new ProcessStartInfo { FileName = "https://paypal.me/valnoxy", UseShellExecute = true });
+ }
+ catch (System.ComponentModel.Win32Exception noBrowser)
+ {
+ if (noBrowser.ErrorCode == -2147467259)
+ MessageBox.Show(noBrowser.Message);
+ }
+ catch (Exception other)
+ {
+ MessageBox.Show(other.Message);
+ }
+ }
+
+ private void SourceCode_OnClick(object sender, RoutedEventArgs e)
+ {
+ try
+ {
+ Process.Start(new ProcessStartInfo { FileName = "https://github.com/valnoxy/GoAwayEdge", UseShellExecute = true });
+ }
+ catch (System.ComponentModel.Win32Exception noBrowser)
+ {
+ if (noBrowser.ErrorCode == -2147467259)
+ MessageBox.Show(noBrowser.Message);
+ }
+ catch (Exception other)
+ {
+ MessageBox.Show(other.Message);
+ }
+ }
+ }
+}
diff --git a/GoAwayEdge/UserInterface/ControlPanel/Pages/CopilotSettings.xaml b/GoAwayEdge/UserInterface/ControlPanel/Pages/CopilotSettings.xaml
new file mode 100644
index 0000000..c8c56e1
--- /dev/null
+++ b/GoAwayEdge/UserInterface/ControlPanel/Pages/CopilotSettings.xaml
@@ -0,0 +1,138 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/GoAwayEdge/UserInterface/ControlPanel/Pages/CopilotSettings.xaml.cs b/GoAwayEdge/UserInterface/ControlPanel/Pages/CopilotSettings.xaml.cs
new file mode 100644
index 0000000..78c2d3a
--- /dev/null
+++ b/GoAwayEdge/UserInterface/ControlPanel/Pages/CopilotSettings.xaml.cs
@@ -0,0 +1,160 @@
+using System.IO;
+using System.Windows;
+using System.Windows.Controls;
+using GoAwayEdge.Common;
+using Wpf.Ui.Controls;
+
+namespace GoAwayEdge.UserInterface.ControlPanel.Pages
+{
+ ///
+ /// Interaktionslogik für CopilotSettings.xaml
+ ///
+ public partial class CopilotSettings
+ {
+ public CopilotSettings()
+ {
+ InitializeComponent();
+
+ foreach (var aiProvider in Configuration.GetAiProviders())
+ {
+ CopilotProviderBox.Items.Add(aiProvider);
+ }
+ CopilotProviderBox.SelectedItem = Configuration.AiProvider.ToString().Replace("_", " ");
+
+ if (Configuration.AiProvider == AiProvider.Custom)
+ {
+ CopilotProviderBox.SelectedItem = LocalizationManager.LocalizeValue("SettingsSearchEngineCustomItem");
+ CustomSearchPanel.Visibility = Visibility.Visible;
+ if (Configuration.CustomAiProviderUrl != null) QueryProviderTextBox.Text = Configuration.CustomAiProviderUrl;
+ CustomUrlStatus.Symbol = Uri.TryCreate(QueryProviderTextBox.Text, UriKind.Absolute, out _)
+ ? SymbolRegular.CheckmarkCircle24 : SymbolRegular.ErrorCircle24;
+ }
+ else
+ {
+ CopilotProviderBox.SelectedItem = Configuration.AiProvider.ToString();
+ }
+
+ if (Configuration.AiProvider == AiProvider.Default)
+ CopilotProviderBox.SelectedItem = LocalizationManager.LocalizeValue("Default");
+
+ if (Configuration.CopilotExternalApp != null) ExternalAppTextBox.Text = Configuration.CopilotExternalApp;
+ if (Configuration.CopilotExternalAppArgument != null) ExternalAppArgsTextBox.Text = Configuration.CopilotExternalAppArgument;
+ }
+
+ private static void FlushSettings()
+ {
+ try
+ {
+ // Ai Provider
+ if (Configuration.AiProvider == AiProvider.Custom)
+ {
+ if (Configuration.CustomAiProviderUrl != null)
+ {
+ RegistryConfig.SetKey("AiProvider", Configuration.AiProvider.ToString(), userSetting: true);
+ RegistryConfig.SetKey("CustomAiProviderUrl", Configuration.CustomAiProviderUrl, userSetting: true);
+ }
+ }
+ else
+ {
+ RegistryConfig.SetKey("AiProvider", Configuration.AiProvider.ToString(), userSetting: true);
+ RegistryConfig.RemoveKey("CustomAiProviderUrl", userSetting: true);
+ }
+
+ // External App
+ if (Configuration.CopilotExternalApp != null)
+ RegistryConfig.SetKey("ExternalApp", Configuration.CopilotExternalApp, userSetting: true);
+ else
+ RegistryConfig.RemoveKey("ExternalApp", userSetting: true);
+
+ if (Configuration.CopilotExternalAppArgument != null)
+ RegistryConfig.SetKey("ExternalAppArgs", Configuration.CopilotExternalAppArgument, userSetting: true);
+ else
+ RegistryConfig.RemoveKey("ExternalAppArgs", userSetting: true);
+ }
+ catch (Exception ex)
+ {
+ Application.Current.Dispatcher.Invoke(() =>
+ {
+ var errorMessage = LocalizationManager.LocalizeValue("FailedFlushSetting", ex.Message);
+ var messageUi = new MessageUi("GoAwayEdge", errorMessage, "OK");
+ messageUi.ShowDialog();
+ });
+ }
+ }
+
+ private void CopilotProviderBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ switch (CopilotProviderBox.SelectedIndex)
+ {
+ case 0:
+ Configuration.AiProvider = AiProvider.Default;
+ CustomSearchPanel.Visibility = Visibility.Collapsed;
+ break;
+ case 1:
+ Configuration.AiProvider = AiProvider.Copilot;
+ CustomSearchPanel.Visibility = Visibility.Collapsed;
+ break;
+ case 2:
+ Configuration.AiProvider = AiProvider.ChatGPT;
+ CustomSearchPanel.Visibility = Visibility.Collapsed;
+ break;
+ case 3:
+ Configuration.AiProvider = AiProvider.Gemini;
+ CustomSearchPanel.Visibility = Visibility.Collapsed;
+ break;
+ case 4:
+ Configuration.AiProvider = AiProvider.GitHub_Copilot;
+ CustomSearchPanel.Visibility = Visibility.Collapsed;
+ break;
+ case 5:
+ Configuration.AiProvider = AiProvider.Grok;
+ CustomSearchPanel.Visibility = Visibility.Collapsed;
+ break;
+ case 6:
+ Configuration.AiProvider = AiProvider.Custom;
+ CustomSearchPanel.Visibility = Visibility.Visible;
+ break;
+ }
+ FlushSettings();
+ }
+
+ private void QueryProviderTextBox_OnTextChanged(object sender, TextChangedEventArgs e)
+ {
+ // Test if the URL is valid
+ if (Uri.TryCreate(QueryProviderTextBox.Text, UriKind.Absolute, out var uriResult)
+ && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps))
+ {
+ CustomUrlStatus.Symbol = SymbolRegular.CheckmarkCircle24;
+ Configuration.CustomAiProviderUrl = QueryProviderTextBox.Text;
+ FlushSettings();
+ }
+ else
+ {
+ CustomUrlStatus.Symbol = SymbolRegular.ErrorCircle24;
+ }
+ }
+
+ private void ExternalAppTextBox_OnTextChanged(object sender, TextChangedEventArgs e)
+ {
+ // Test if the file exists
+ if (File.Exists(ExternalAppTextBox.Text))
+ {
+ ExternalAppStatus.Symbol = SymbolRegular.CheckmarkCircle24;
+ Configuration.CopilotExternalApp = ExternalAppTextBox.Text;
+ FlushSettings();
+ }
+ else
+ {
+ ExternalAppStatus.Symbol = SymbolRegular.ErrorCircle24;
+ }
+ }
+
+ private void ExternalAppArgsTextBox_OnTextChanged(object sender, TextChangedEventArgs e)
+ {
+ if (ExternalAppStatus.Symbol != SymbolRegular.CheckmarkCircle24) return;
+
+ Configuration.CopilotExternalAppArgument = ExternalAppArgsTextBox.Text;
+ FlushSettings();
+ }
+ }
+}
diff --git a/GoAwayEdge/Pages/Settings.xaml b/GoAwayEdge/UserInterface/ControlPanel/Pages/EdgeSettings.xaml
similarity index 53%
rename from GoAwayEdge/Pages/Settings.xaml
rename to GoAwayEdge/UserInterface/ControlPanel/Pages/EdgeSettings.xaml
index 19ce9db..babefd5 100644
--- a/GoAwayEdge/Pages/Settings.xaml
+++ b/GoAwayEdge/UserInterface/ControlPanel/Pages/EdgeSettings.xaml
@@ -1,110 +1,164 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/GoAwayEdge/UserInterface/ControlPanel/Pages/EdgeSettings.xaml.cs b/GoAwayEdge/UserInterface/ControlPanel/Pages/EdgeSettings.xaml.cs
new file mode 100644
index 0000000..b9cfbd7
--- /dev/null
+++ b/GoAwayEdge/UserInterface/ControlPanel/Pages/EdgeSettings.xaml.cs
@@ -0,0 +1,291 @@
+using System.Diagnostics;
+using System.Windows;
+using System.Windows.Controls;
+using GoAwayEdge.Common;
+using Wpf.Ui.Controls;
+
+namespace GoAwayEdge.UserInterface.ControlPanel.Pages
+{
+ ///
+ /// Interaktionslogik für EdgeSettings.xaml
+ ///
+ public partial class EdgeSettings
+ {
+ private bool _appIsEnabled;
+
+ public EdgeSettings()
+ {
+ InitializeComponent();
+
+ foreach (var edgeChannels in Configuration.GetEdgeChannels())
+ {
+ EdgeChannelBox.Items.Add(edgeChannels);
+ }
+ EdgeChannelBox.SelectedItem = Configuration.Channel.ToString();
+
+ // Search Engine
+ foreach (var searchEngine in Configuration.GetSearchEngines())
+ {
+ SearchEngineBox.Items.Add(searchEngine);
+ }
+
+ if (Configuration.Search == SearchEngine.Custom)
+ {
+ SearchEngineBox.SelectedItem = LocalizationManager.LocalizeValue("SettingsSearchEngineCustomItem");
+ CustomSearchPanel.Visibility = Visibility.Visible;
+ if (Configuration.CustomQueryUrl != null) QueryUrlTextBox.Text = Configuration.CustomQueryUrl;
+ CustomUrlStatus.Symbol = Uri.TryCreate(QueryUrlTextBox.Text, UriKind.Absolute, out _)
+ ? SymbolRegular.CheckmarkCircle24 : SymbolRegular.ErrorCircle24;
+ }
+ else
+ {
+ SearchEngineBox.SelectedItem = Configuration.Search.ToString();
+ }
+
+ // Weather Provider
+ foreach (var weatherProvider in Configuration.GetWeatherProviders())
+ {
+ WeatherProviderBox.Items.Add(weatherProvider);
+ }
+ WeatherProviderBox.SelectedItem = Configuration.WeatherProvider.ToString().Replace("_", " ");
+
+ if (Configuration.WeatherProvider == WeatherProvider.Custom)
+ {
+ WeatherProviderBox.SelectedItem = LocalizationManager.LocalizeValue("SettingsSearchEngineCustomItem");
+ CustomWeatherPanel.Visibility = Visibility.Visible;
+ if (Configuration.CustomWeatherProviderUrl != null) QueryWeatherProviderTextBox.Text = Configuration.CustomWeatherProviderUrl;
+ CustomWeatherUrlStatus.Symbol = Uri.TryCreate(QueryWeatherProviderTextBox.Text, UriKind.Absolute, out _)
+ ? SymbolRegular.CheckmarkCircle24 : SymbolRegular.ErrorCircle24;
+ }
+
+ if (Configuration.WeatherProvider == WeatherProvider.Default)
+ WeatherProviderBox.SelectedItem = LocalizationManager.LocalizeValue("Default");
+
+ if (RegistryConfig.GetKey("Enabled") == "True")
+ {
+ _appIsEnabled = true;
+ PowerToggle.Content = LocalizationManager.LocalizeValue("ControlPanelEdgePowerDisable"); ;
+ }
+ else
+ {
+ _appIsEnabled = false;
+ PowerToggle.Content = LocalizationManager.LocalizeValue("ControlPanelEdgePowerEnable"); ;
+ }
+ }
+
+ private static void FlushSettings()
+ {
+ try
+ {
+ RegistryConfig.SetKey("EdgeChannel", Configuration.Channel.ToString());
+ RegistryConfig.SetKey("SearchEngine", Configuration.Search);
+ if (Configuration.Search == SearchEngine.Custom)
+ {
+ if (Configuration.CustomQueryUrl != null)
+ RegistryConfig.SetKey("CustomQueryUrl", Configuration.CustomQueryUrl);
+ }
+ else
+ {
+ RegistryConfig.RemoveKey("CustomQueryUrl");
+ }
+
+ RegistryConfig.SetKey("WeatherProvider", Configuration.WeatherProvider, userSetting: true);
+ if (Configuration.WeatherProvider == WeatherProvider.Custom)
+ {
+ if (Configuration.CustomWeatherProviderUrl != null)
+ RegistryConfig.SetKey("CustomWeatherProviderUrl", Configuration.CustomWeatherProviderUrl, userSetting: true);
+ }
+ else
+ {
+ RegistryConfig.RemoveKey("CustomWeatherProviderUrl", userSetting: true);
+ }
+ }
+ catch (Exception ex)
+ {
+ Application.Current.Dispatcher.Invoke(() =>
+ {
+ var errorMessage = LocalizationManager.LocalizeValue("FailedFlushSetting", ex.Message);
+ var messageUi = new MessageUi("GoAwayEdge", errorMessage, "OK");
+ messageUi.ShowDialog();
+ });
+ }
+ }
+
+ private void SearchEngineBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ switch (SearchEngineBox.SelectedIndex)
+ {
+ case 0:
+ Configuration.Search = SearchEngine.Google;
+ CustomSearchPanel.Visibility = Visibility.Collapsed;
+ FlushSettings();
+ break;
+ case 1:
+ Configuration.Search = SearchEngine.Bing;
+ CustomSearchPanel.Visibility = Visibility.Collapsed;
+ FlushSettings();
+ break;
+ case 2:
+ Configuration.Search = SearchEngine.DuckDuckGo;
+ CustomSearchPanel.Visibility = Visibility.Collapsed;
+ FlushSettings();
+ break;
+ case 3:
+ Configuration.Search = SearchEngine.Yahoo;
+ CustomSearchPanel.Visibility = Visibility.Collapsed;
+ FlushSettings();
+ break;
+ case 4:
+ Configuration.Search = SearchEngine.Yandex;
+ CustomSearchPanel.Visibility = Visibility.Collapsed;
+ FlushSettings();
+ break;
+ case 5:
+ Configuration.Search = SearchEngine.Ecosia;
+ CustomSearchPanel.Visibility = Visibility.Collapsed;
+ FlushSettings();
+ break;
+ case 6:
+ Configuration.Search = SearchEngine.Ask;
+ CustomSearchPanel.Visibility = Visibility.Collapsed;
+ FlushSettings();
+ break;
+ case 7:
+ Configuration.Search = SearchEngine.Qwant;
+ CustomSearchPanel.Visibility = Visibility.Collapsed;
+ FlushSettings();
+ break;
+ case 8:
+ Configuration.Search = SearchEngine.Perplexity;
+ CustomSearchPanel.Visibility = Visibility.Collapsed;
+ FlushSettings();
+ break;
+ case 9:
+ Configuration.Search = SearchEngine.Custom;
+ CustomSearchPanel.Visibility = Visibility.Visible;
+ break;
+ }
+ }
+
+ private void WeatherProviderBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ switch (WeatherProviderBox.SelectedIndex)
+ {
+ case 0:
+ Configuration.WeatherProvider = WeatherProvider.Default;
+ CustomWeatherPanel.Visibility = Visibility.Collapsed;
+ break;
+ case 1:
+ Configuration.WeatherProvider = WeatherProvider.WeatherCom;
+ CustomWeatherPanel.Visibility = Visibility.Collapsed;
+ break;
+ case 2:
+ Configuration.WeatherProvider = WeatherProvider.AccuWeather;
+ CustomWeatherPanel.Visibility = Visibility.Collapsed;
+ break;
+ case 3:
+ Configuration.WeatherProvider = WeatherProvider.Custom;
+ CustomWeatherPanel.Visibility = Visibility.Visible;
+ break;
+ }
+ FlushSettings();
+ }
+
+ private void EdgeChannelBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ Configuration.Channel = EdgeChannelBox.SelectedIndex switch
+ {
+ 0 => EdgeChannel.Stable,
+ 1 => EdgeChannel.Beta,
+ 2 => EdgeChannel.Dev,
+ 3 => EdgeChannel.Canary,
+ _ => EdgeChannel.Stable
+ };
+ FlushSettings();
+ }
+
+ private void PowerToggle_OnClick(object sender, RoutedEventArgs e)
+ {
+ if (_appIsEnabled)
+ {
+ try
+ {
+ RegistryConfig.SetKey("Enabled", "False");
+ _appIsEnabled = false;
+ PowerToggle.Content = LocalizationManager.LocalizeValue("ControlPanelEdgePowerEnable");
+ Application.Current.Dispatcher.Invoke(() =>
+ {
+ var errorMessage = LocalizationManager.LocalizeValue("MessageGoAwayEdgeDisabled");
+ var messageUi = new MessageUi("GoAwayEdge", errorMessage, "OK");
+ messageUi.ShowDialog();
+ });
+ }
+ catch (Exception ex)
+ {
+ Application.Current.Dispatcher.Invoke(() =>
+ {
+ var errorMessage = LocalizationManager.LocalizeValue("FailedSetAppDisabled", ex.Message);
+ var messageUi = new MessageUi("GoAwayEdge", errorMessage, "OK");
+ messageUi.ShowDialog();
+ });
+ }
+ }
+ else
+ {
+ try
+ {
+ RegistryConfig.SetKey("Enabled", "True");
+ _appIsEnabled = true;
+ PowerToggle.Content = LocalizationManager.LocalizeValue("ControlPanelEdgePowerDisable");
+ Application.Current.Dispatcher.Invoke(() =>
+ {
+ var errorMessage = LocalizationManager.LocalizeValue("MessageGoAwayEdgeEnabled");
+ var messageUi = new MessageUi("GoAwayEdge", errorMessage, "OK");
+ messageUi.ShowDialog();
+ });
+ }
+ catch (Exception ex)
+ {
+ Application.Current.Dispatcher.Invoke(() =>
+ {
+ var errorMessage = LocalizationManager.LocalizeValue("FailedSetAppEnabled", ex.Message);
+ var messageUi = new MessageUi("GoAwayEdge", errorMessage, "OK");
+ messageUi.ShowDialog();
+ });
+ }
+ }
+ }
+
+ private void QueryUrlTextBox_OnTextChanged(object sender, TextChangedEventArgs e)
+ {
+ // Test if the URL is valid
+ if (Uri.TryCreate(QueryUrlTextBox.Text, UriKind.Absolute, out var uriResult)
+ && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps))
+ {
+ CustomUrlStatus.Symbol = SymbolRegular.CheckmarkCircle24;
+ Configuration.CustomQueryUrl = QueryUrlTextBox.Text;
+ FlushSettings();
+ }
+ else
+ {
+ CustomUrlStatus.Symbol = SymbolRegular.ErrorCircle24;
+ }
+ }
+
+ private void QueryWeatherProviderTextBox_OnTextChanged(object sender, TextChangedEventArgs e)
+ {
+ // Test if the URL is valid
+ if (Uri.TryCreate(QueryWeatherProviderTextBox.Text, UriKind.Absolute, out var uriResult)
+ && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps))
+ {
+ CustomWeatherUrlStatus.Symbol = SymbolRegular.CheckmarkCircle24;
+ Configuration.CustomWeatherProviderUrl = QueryWeatherProviderTextBox.Text;
+ FlushSettings();
+ }
+ else
+ {
+ CustomWeatherUrlStatus.Symbol = SymbolRegular.ErrorCircle24;
+ }
+ }
+ }
+}
diff --git a/GoAwayEdge/UserInterface/ControlPanel/Pages/HomeScreen.xaml b/GoAwayEdge/UserInterface/ControlPanel/Pages/HomeScreen.xaml
new file mode 100644
index 0000000..bee27f4
--- /dev/null
+++ b/GoAwayEdge/UserInterface/ControlPanel/Pages/HomeScreen.xaml
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/GoAwayEdge/UserInterface/ControlPanel/Pages/HomeScreen.xaml.cs b/GoAwayEdge/UserInterface/ControlPanel/Pages/HomeScreen.xaml.cs
new file mode 100644
index 0000000..9161b62
--- /dev/null
+++ b/GoAwayEdge/UserInterface/ControlPanel/Pages/HomeScreen.xaml.cs
@@ -0,0 +1,25 @@
+using System.Windows;
+
+namespace GoAwayEdge.UserInterface.ControlPanel.Pages
+{
+ ///
+ /// Interaktionslogik für HomeScreen.xaml
+ ///
+ public partial class HomeScreen
+ {
+ public HomeScreen()
+ {
+ InitializeComponent();
+ }
+
+ private void EdgeSettings_OnClick(object sender, RoutedEventArgs e)
+ {
+ (Application.Current.MainWindow as ControlPanel)?.RootNavigation.Navigate(typeof(EdgeSettings));
+ }
+
+ private void CopilotSetting_OnClick(object sender, RoutedEventArgs e)
+ {
+ (Application.Current.MainWindow as ControlPanel)?.RootNavigation.Navigate(typeof(CopilotSettings));
+ }
+ }
+}
diff --git a/GoAwayEdge/UserInterface/CopilotDock/CopilotDock.xaml b/GoAwayEdge/UserInterface/CopilotDock/CopilotDock.xaml
new file mode 100644
index 0000000..d83da6b
--- /dev/null
+++ b/GoAwayEdge/UserInterface/CopilotDock/CopilotDock.xaml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/GoAwayEdge/UserInterface/CopilotDock/CopilotDock.xaml.cs b/GoAwayEdge/UserInterface/CopilotDock/CopilotDock.xaml.cs
new file mode 100644
index 0000000..0f30e48
--- /dev/null
+++ b/GoAwayEdge/UserInterface/CopilotDock/CopilotDock.xaml.cs
@@ -0,0 +1,96 @@
+using System.Diagnostics;
+using System.IO;
+using System.Windows;
+using GoAwayEdge.Common;
+using GoAwayEdge.Common.Debugging;
+using ManagedShell;
+using ManagedShell.AppBar;
+using Microsoft.Web.WebView2.Core;
+using Wpf.Ui.Controls;
+using static GoAwayEdge.Common.AiProvider;
+
+namespace GoAwayEdge.UserInterface.CopilotDock
+{
+ ///
+ /// Interaktionslogik für CopilotDock.xaml
+ ///
+ public partial class CopilotDock
+ {
+ public static CopilotDock? Instance;
+ public CopilotDock(ShellManager shellManager, AppBarScreen screen, AppBarEdge edge, double desiredHeight, AppBarMode mode)
+ : base(shellManager.AppBarManager, shellManager.ExplorerHelper, shellManager.FullScreenHelper, screen, edge, mode, desiredHeight)
+ {
+ MaxHeight = SystemParameters.WorkArea.Height;
+ MinHeight = SystemParameters.WorkArea.Height;
+ Configuration.AppBarIsAttached = mode != AppBarMode.None;
+ Instance = this;
+
+ InitializeComponent();
+ _ = InitializeWebViewAsync();
+
+ DockButton.Icon = Configuration.AppBarIsAttached ? new SymbolIcon(SymbolRegular.PinOff28) : new SymbolIcon(SymbolRegular.Pin28);
+ }
+
+ private async Task InitializeWebViewAsync()
+ {
+ try
+ {
+ var userProfilePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "valnoxy", "GoAwayEdge");
+ Directory.CreateDirectory(userProfilePath);
+
+ var webView2Environment = await CoreWebView2Environment.CreateAsync(userDataFolder: userProfilePath);
+ await WebView.EnsureCoreWebView2Async(webView2Environment);
+
+ var providerUrl = Configuration.AiProvider == Custom
+ ? Configuration.CustomAiProviderUrl : Configuration.GetEnumDescription(Configuration.AiProvider);
+ if (providerUrl != null) WebView.Source = new Uri(providerUrl);
+ else
+ {
+ Logging.Log($"Failed to load AiProvider! AiProvider Value '{Configuration.AiProvider}' in invalid!");
+ throw new ArgumentOutOfRangeException();
+ }
+ }
+ catch (Exception ex)
+ {
+ Logging.Log($"Failed to load WebView2 (Copilot replacement): {ex.Message}", Logging.LogLevel.ERROR);
+ }
+ }
+
+ private void CloseButton_OnClick(object sender, RoutedEventArgs e)
+ {
+ if (Configuration.ShellManager != null)
+ {
+ Configuration.ShellManager.AppBarManager.SignalGracefulShutdown();
+ Configuration.ShellManager.Dispose();
+ }
+
+ Environment.Exit(0);
+ }
+
+ private void DockButton_OnClick(object sender, RoutedEventArgs e)
+ {
+ if (Configuration.AppBarIsAttached)
+ {
+ DockButton.Icon = new SymbolIcon(SymbolRegular.Pin28);
+ RegistryConfig.SetKey("CopilotDockState", "Detached", userSetting: true);
+ AppBarMode = AppBarMode.None;
+ }
+ else
+ {
+ DockButton.Icon = new SymbolIcon(SymbolRegular.PinOff28);
+ RegistryConfig.SetKey("CopilotDockState", "Docked", userSetting: true);
+ AppBarMode = AppBarMode.Normal;
+ }
+ Configuration.AppBarIsAttached = !Configuration.AppBarIsAttached;
+ }
+
+ private void CopilotDock_OnDeactivated(object? sender, EventArgs e)
+ {
+ if (Configuration.AppBarIsAttached) return;
+ var currentProcess = Process.GetCurrentProcess();
+ var currentId = currentProcess.Id;
+ Logging.Log($"Deactivated CopilotDock (PID: {currentId})");
+ WindowManager.HideCopilotDock();
+ }
+ }
+}
diff --git a/GoAwayEdge/UserInterface/CopilotDock/InterfaceManager.cs b/GoAwayEdge/UserInterface/CopilotDock/InterfaceManager.cs
new file mode 100644
index 0000000..c7dcb2f
--- /dev/null
+++ b/GoAwayEdge/UserInterface/CopilotDock/InterfaceManager.cs
@@ -0,0 +1,78 @@
+using GoAwayEdge.Common;
+using GoAwayEdge.Common.Debugging;
+using GoAwayEdge.Common.Runtime;
+using ManagedShell.AppBar;
+using System.Windows;
+using ManagedShell;
+
+namespace GoAwayEdge.UserInterface.CopilotDock
+{
+ public class InterfaceManager
+ {
+ private const string MutexName = "GoAwayEdge_CopilotDock";
+ private const string PipeName = "GoAwayEdge_CopilotDockPipe";
+ private static readonly NamedPipeManager PipeManager = new(PipeName);
+
+ public static void ShowDock()
+ {
+ using var mutex = new Mutex(true, MutexName, out var createdNew);
+ if (createdNew)
+ {
+ PipeManager.StartServer();
+ var mode = AppBarMode.Normal;
+
+ // Last state
+ try
+ {
+ var lastState = RegistryConfig.GetKey("CopilotDockState", userSetting: true);
+ if (string.IsNullOrEmpty(lastState))
+ {
+ // Never set; leave Mode as Normal
+ RegistryConfig.SetKey("CopilotDockState", "Docked", userSetting: true);
+ }
+ else if (lastState != "Docked")
+ {
+ // Undocked or unknown state; set to None
+ mode = AppBarMode.None;
+ }
+ }
+ catch
+ {
+ // Error reading last state; set to Docked
+ RegistryConfig.SetKey("CopilotDockState", "Docked", userSetting: true);
+ }
+
+ // PipeManager configuration
+ PipeManager.MessageReceived += (message) =>
+ {
+ Logging.Log($"Message received: {message}");
+ if (message.Contains("BringToFront"))
+ {
+ WindowManager.ShowCopilotDockAsync(Common.Configuration.ShellManager!, AppBarScreen.FromPrimaryScreen(), AppBarEdge.Right, 500, mode); // Dummy data
+ }
+ };
+
+ PipeManager.ErrorOccurred += (ex) =>
+ {
+ Logging.Log($"Error occurred: {ex.Message}", Logging.LogLevel.ERROR);
+ };
+
+ WindowManager.ShowCopilotDockAsync(Common.Configuration.ShellManager!,
+ AppBarScreen.FromPrimaryScreen(),
+ AppBarEdge.Right,
+ 500, // temporary size
+ mode);
+
+
+ // Dock was closed
+ Logging.Log("Closed CopilotDock");
+ Environment.Exit(0);
+ }
+ else
+ {
+ PipeManager.SendMessage("BringToFront");
+ Environment.Exit(0); // Exit the second instance
+ }
+ }
+ }
+}
diff --git a/GoAwayEdge/UserInterface/CopilotDock/WindowManager.cs b/GoAwayEdge/UserInterface/CopilotDock/WindowManager.cs
new file mode 100644
index 0000000..85a8e91
--- /dev/null
+++ b/GoAwayEdge/UserInterface/CopilotDock/WindowManager.cs
@@ -0,0 +1,50 @@
+using System.Windows;
+using System.Windows.Threading;
+using GoAwayEdge.Common.Debugging;
+using ManagedShell;
+using ManagedShell.AppBar;
+
+namespace GoAwayEdge.UserInterface.CopilotDock;
+
+public static class WindowManager
+{
+ private static CopilotDock? _copilotDockInstance;
+
+ public static void ShowCopilotDockAsync(ShellManager shellManager, AppBarScreen screen, AppBarEdge edge, double desiredHeight, AppBarMode mode)
+ {
+ if (_copilotDockInstance == null)
+ {
+ _copilotDockInstance = new CopilotDock(shellManager, screen, edge, desiredHeight, mode);
+
+ var frame = new DispatcherFrame();
+ _copilotDockInstance.Closed += (s, e) =>
+ {
+ _copilotDockInstance = null;
+ frame.Continue = false;
+ };
+
+ _copilotDockInstance.Show();
+ Dispatcher.PushFrame(frame);
+ }
+ else
+ {
+ Application.Current.Dispatcher.Invoke(() =>
+ {
+ _copilotDockInstance.Show();
+ _copilotDockInstance.Activate();
+ });
+ }
+ }
+
+ public static void HideCopilotDock()
+ {
+ try
+ {
+ _copilotDockInstance?.Hide();
+ }
+ catch (Exception ex)
+ {
+ Logging.Log("Failed to hide Copilot Dock: " + ex.Message);
+ }
+ }
+}
\ No newline at end of file
diff --git a/GoAwayEdge/MessageUI.xaml b/GoAwayEdge/UserInterface/MessageUI.xaml
similarity index 97%
rename from GoAwayEdge/MessageUI.xaml
rename to GoAwayEdge/UserInterface/MessageUI.xaml
index def6000..cfd34be 100644
--- a/GoAwayEdge/MessageUI.xaml
+++ b/GoAwayEdge/UserInterface/MessageUI.xaml
@@ -1,77 +1,77 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Message.Title
-
-
-
- Message.Text
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Message.Title
+
+
+
+ Message.Text
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/GoAwayEdge/MessageUI.xaml.cs b/GoAwayEdge/UserInterface/MessageUI.xaml.cs
similarity index 72%
rename from GoAwayEdge/MessageUI.xaml.cs
rename to GoAwayEdge/UserInterface/MessageUI.xaml.cs
index 6311e37..73a1399 100644
--- a/GoAwayEdge/MessageUI.xaml.cs
+++ b/GoAwayEdge/UserInterface/MessageUI.xaml.cs
@@ -1,71 +1,90 @@
-// Copyright (c) 2024 valnoxy
-// Copied from Dive: https://github.com/valnoxy/Dive/blob/main/Dive/Dive.UI/MessageUI.xaml.cs
-
-using System.Reflection;
-using System.Windows;
-using System.Windows.Input;
-
-namespace GoAwayEdge
-{
- ///
- /// Interaktionslogik für MessageUI.xaml
- ///
- public partial class MessageUi
- {
- public virtual string? Summary => _buttonPressed;
-
- private static string? _buttonPressed;
- private static bool _mainThread;
-
- public MessageUi(string title, string message, string? btn1 = null, string? btn2 = null, string? btn3 = null, bool isMainThread = false)
- {
- InitializeComponent();
-
- MessageTitle.Text = title;
- MessageText.Text = message;
- this.Btn1.Content = btn1;
- this.Btn2.Content = btn2;
- this.Btn3.Content = btn3;
-
- if (btn1 is null or "")
- this.Btn1.Visibility = Visibility.Collapsed;
- if (btn2 is null or "")
- this.Btn2.Visibility = Visibility.Collapsed;
- if (btn3 is null or "")
- this.Btn3.Visibility = Visibility.Collapsed;
-
- VersionLbl.Content = $"Version {Assembly.GetExecutingAssembly().GetName().Version!}";
-
- _mainThread = isMainThread;
- }
-
- private void Btn1_OnClick(object sender, RoutedEventArgs e)
- {
- _buttonPressed = "Btn1";
- if (_mainThread) this.Hide();
- else this.Close();
- }
-
- private void Btn2_OnClick(object sender, RoutedEventArgs e)
- {
- _buttonPressed = "Btn2";
- if (_mainThread) this.Hide();
- else this.Close();
- }
-
- private void Btn3_OnClick(object sender, RoutedEventArgs e)
- {
- _buttonPressed = "Btn3";
- if (_mainThread) this.Hide();
- else this.Close();
- }
-
- private void WindowKeyDown(object sender, KeyEventArgs e)
- {
- if (e.Key != Key.C || Keyboard.Modifiers != ModifierKeys.Control) return;
-
- var clipboardString = $"{MessageTitle.Text}\n-----\n{MessageText.Text}";
- Clipboard.SetDataObject(clipboardString);
- }
- }
+// Copyright (c) 2024 valnoxy
+// Copied from Dive: https://github.com/valnoxy/Dive/blob/main/Dive/Dive.UI/MessageUI.xaml.cs
+
+using System.Reflection;
+using System.Windows;
+using System.Windows.Input;
+
+namespace GoAwayEdge
+{
+ ///
+ /// Interaktionslogik für MessageUI.xaml
+ ///
+ public partial class MessageUi
+ {
+ public virtual string? Summary => _buttonPressed;
+
+ private static string? _buttonPressed;
+ private static bool _mainThread;
+
+ public MessageUi(string title, string message, string? btn1 = null, string? btn2 = null, string? btn3 = null, bool isMainThread = false)
+ {
+ InitializeComponent();
+
+ MessageTitle.Text = title;
+ MessageText.Text = message;
+ this.Btn1.Content = btn1;
+ this.Btn2.Content = btn2;
+ this.Btn3.Content = btn3;
+
+ if (btn1 is null or "")
+ this.Btn1.Visibility = Visibility.Collapsed;
+ if (btn2 is null or "")
+ this.Btn2.Visibility = Visibility.Collapsed;
+ if (btn3 is null or "")
+ this.Btn3.Visibility = Visibility.Collapsed;
+
+ string versionText;
+ var assembly = Assembly.GetExecutingAssembly();
+ var version = Assembly.GetExecutingAssembly().GetName().Version!;
+ try
+ {
+ var informationVersion = assembly.GetCustomAttribute()?.InformationalVersion;
+ if (!string.IsNullOrEmpty(informationVersion) && version.ToString() != informationVersion)
+ {
+ versionText = $"Version {version}-{informationVersion}";
+ }
+ else
+ {
+ versionText = $"Version {version}";
+ }
+ }
+ catch
+ {
+ versionText = $"Version {version}";
+ }
+ VersionLbl.Content = versionText;
+
+ _mainThread = isMainThread;
+ }
+
+ private void Btn1_OnClick(object sender, RoutedEventArgs e)
+ {
+ _buttonPressed = "Btn1";
+ if (_mainThread) this.Hide();
+ else this.Close();
+ }
+
+ private void Btn2_OnClick(object sender, RoutedEventArgs e)
+ {
+ _buttonPressed = "Btn2";
+ if (_mainThread) this.Hide();
+ else this.Close();
+ }
+
+ private void Btn3_OnClick(object sender, RoutedEventArgs e)
+ {
+ _buttonPressed = "Btn3";
+ if (_mainThread) this.Hide();
+ else this.Close();
+ }
+
+ private void WindowKeyDown(object sender, KeyEventArgs e)
+ {
+ if (e.Key != Key.C || Keyboard.Modifiers != ModifierKeys.Control) return;
+
+ var clipboardString = $"{MessageTitle.Text}\n-----\n{MessageText.Text}";
+ Clipboard.SetDataObject(clipboardString);
+ }
+ }
}
\ No newline at end of file
diff --git a/GoAwayEdge/UserInterface/Setup/Installer.xaml b/GoAwayEdge/UserInterface/Setup/Installer.xaml
new file mode 100644
index 0000000..82f75bf
--- /dev/null
+++ b/GoAwayEdge/UserInterface/Setup/Installer.xaml
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/GoAwayEdge/Installer.xaml.cs b/GoAwayEdge/UserInterface/Setup/Installer.xaml.cs
similarity index 50%
rename from GoAwayEdge/Installer.xaml.cs
rename to GoAwayEdge/UserInterface/Setup/Installer.xaml.cs
index 28c6e05..504aaa0 100644
--- a/GoAwayEdge/Installer.xaml.cs
+++ b/GoAwayEdge/UserInterface/Setup/Installer.xaml.cs
@@ -1,70 +1,95 @@
-using System.Diagnostics;
-using System.Reflection;
-using System.Windows;
-using GoAwayEdge.Common;
-using GoAwayEdge.Pages;
-
-namespace GoAwayEdge
-{
- ///
- /// Interaktionslogik für Installer.xaml
- ///
- public partial class Installer
- {
- internal static Installer? ContentWindow;
- public static License? LicensePage;
- private static Welcome? _welcomePage;
- private static Settings? _settingPage;
-
- public Installer()
- {
- InitializeComponent();
-
- VersionLbl.Content = $"Version {Assembly.GetExecutingAssembly().GetName().Version!}";
- Configuration.InitialEnvironment();
-
- _welcomePage = new Welcome();
- LicensePage = new License();
- FrameWindow.Content = _welcomePage;
- ContentWindow = this;
- }
-
- internal void NextBtn_OnClick(object sender, RoutedEventArgs e)
- {
- switch (FrameWindow.Content)
- {
- case InstallationSuccess:
- Environment.Exit(0);
- break;
- case Settings:
- NextBtn.IsEnabled = false;
- BackBtn.IsEnabled = false;
- FrameWindow.Content = new Installation();
- break;
- case License:
- NextBtn.IsEnabled = true;
- BackBtn.IsEnabled = true;
- _settingPage = new Settings();
- FrameWindow.Content = _settingPage;
- break;
- }
- }
-
- private void BackBtn_OnClick(object sender, RoutedEventArgs e)
- {
- switch (FrameWindow.Content)
- {
- case Settings:
- NextBtn.IsEnabled = true;
- BackBtn.IsEnabled = true;
- FrameWindow.Content = LicensePage;
- break;
- case License:
- NextBtn.IsEnabled = false;
- BackBtn.IsEnabled = false;
- FrameWindow.Content = _welcomePage;
- break;
- }
- }
- }
-}
+using System.Reflection;
+using System.Windows;
+using GoAwayEdge.Common;
+using GoAwayEdge.UserInterface.Setup.Pages;
+
+namespace GoAwayEdge.UserInterface.Setup
+{
+ ///
+ /// Interaktionslogik für Installer.xaml
+ ///
+ public partial class Installer
+ {
+ internal static Installer? ContentWindow;
+ public static License? LicensePage;
+ public static Settings? SettingPage;
+ private static Welcome? _welcomePage;
+ private static RedirectOrRemove? _redirectOrRemovePage;
+
+ public Installer()
+ {
+ InitializeComponent();
+
+ string versionText;
+ var assembly = Assembly.GetExecutingAssembly();
+ var version = Assembly.GetExecutingAssembly().GetName().Version!;
+ try
+ {
+ var informationVersion = assembly.GetCustomAttribute()?.InformationalVersion;
+ if (!string.IsNullOrEmpty(informationVersion) && version.ToString() != informationVersion)
+ {
+ versionText = $"Version {version}-{informationVersion}";
+ }
+ else
+ {
+ versionText = $"Version {version}";
+ }
+ }
+ catch
+ {
+ versionText = $"Version {version}";
+ }
+
+ VersionLbl.Content = versionText;
+ Configuration.InitialEnvironment(setupRunning: true);
+
+ _welcomePage = new Welcome();
+ _redirectOrRemovePage = new RedirectOrRemove();
+ FrameWindow.Content = _welcomePage;
+ ContentWindow = this;
+ }
+
+ internal void NextBtn_OnClick(object sender, RoutedEventArgs e)
+ {
+ switch (FrameWindow.Content)
+ {
+ case InstallationSuccess:
+ Environment.Exit(0);
+ break;
+ case Settings:
+ NextBtn.IsEnabled = false;
+ BackBtn.IsEnabled = false;
+ FrameWindow.Content = new Installation();
+ break;
+ case License:
+ NextBtn.IsEnabled = false;
+ BackBtn.IsEnabled = true;
+ FrameWindow.Content = _redirectOrRemovePage;
+ break;
+ }
+ }
+
+ private void BackBtn_OnClick(object sender, RoutedEventArgs e)
+ {
+ switch (FrameWindow.Content)
+ {
+ case RedirectOrRemove:
+ NextBtn.IsEnabled = false;
+ BackBtn.IsEnabled = true;
+ LicensePage = new License();
+ FrameWindow.Content = LicensePage;
+ break;
+ case Settings:
+ NextBtn.IsEnabled = false;
+ BackBtn.IsEnabled = true;
+ FrameWindow.Content = _redirectOrRemovePage;
+ break;
+ case License:
+ NextBtn.IsEnabled = false;
+ BackBtn.IsEnabled = false;
+ FrameWindow.Content = _welcomePage;
+ break;
+ }
+ }
+ }
+}
diff --git a/GoAwayEdge/Pages/Installation.xaml b/GoAwayEdge/UserInterface/Setup/Pages/Installation.xaml
similarity index 89%
rename from GoAwayEdge/Pages/Installation.xaml
rename to GoAwayEdge/UserInterface/Setup/Pages/Installation.xaml
index 37c9fd3..71e3b59 100644
--- a/GoAwayEdge/Pages/Installation.xaml
+++ b/GoAwayEdge/UserInterface/Setup/Pages/Installation.xaml
@@ -1,23 +1,22 @@
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/GoAwayEdge/Pages/Installation.xaml.cs b/GoAwayEdge/UserInterface/Setup/Pages/Installation.xaml.cs
similarity index 63%
rename from GoAwayEdge/Pages/Installation.xaml.cs
rename to GoAwayEdge/UserInterface/Setup/Pages/Installation.xaml.cs
index 7562b33..baaa15e 100644
--- a/GoAwayEdge/Pages/Installation.xaml.cs
+++ b/GoAwayEdge/UserInterface/Setup/Pages/Installation.xaml.cs
@@ -1,40 +1,50 @@
-using System.ComponentModel;
-using System.Windows.Controls;
-using GoAwayEdge.Common;
-
-namespace GoAwayEdge.Pages
-{
- ///
- /// Interaktionslogik für Installation.xaml
- ///
- public partial class Installation : UserControl
- {
- public Installation()
- {
- InitializeComponent();
-
- // Background worker for deployment
- var applyBackgroundWorker = new BackgroundWorker();
- applyBackgroundWorker.WorkerReportsProgress = true;
- applyBackgroundWorker.WorkerSupportsCancellation = true;
- if (Configuration.Uninstall)
- {
- applyBackgroundWorker.DoWork += InstallRoutine.Uninstall;
- }
- else
- {
- applyBackgroundWorker.DoWork += InstallRoutine.Install;
- }
- applyBackgroundWorker.ProgressChanged += ApplyBackgroundWorker_ProgressChanged;
- applyBackgroundWorker.RunWorkerAsync();
- }
-
- private static void ApplyBackgroundWorker_ProgressChanged(object? sender, ProgressChangedEventArgs e)
- {
- if (e.ProgressPercentage == 100)
- {
- Installer.ContentWindow?.FrameWindow.NavigationService.Navigate(new InstallationSuccess());
- }
- }
- }
-}
+using System.ComponentModel;
+using GoAwayEdge.Common;
+using InstallRoutine = GoAwayEdge.Common.Installation.InstallRoutine;
+
+namespace GoAwayEdge.UserInterface.Setup.Pages
+{
+ ///
+ /// Interaktionslogik für Installation.xaml
+ ///
+ public partial class Installation
+ {
+ public Installation()
+ {
+ InitializeComponent();
+
+ // Background worker for deployment
+ var applyBackgroundWorker = new BackgroundWorker();
+ applyBackgroundWorker.WorkerReportsProgress = true;
+ applyBackgroundWorker.WorkerSupportsCancellation = true;
+ if (Configuration.Uninstall)
+ {
+ applyBackgroundWorker.DoWork += InstallRoutine_Uninstall;
+ }
+ else
+ {
+ applyBackgroundWorker.DoWork += InstallRoutine_Install;
+ }
+ applyBackgroundWorker.ProgressChanged += ApplyBackgroundWorker_ProgressChanged;
+ applyBackgroundWorker.RunWorkerAsync();
+ }
+
+ private static void ApplyBackgroundWorker_ProgressChanged(object? sender, ProgressChangedEventArgs e)
+ {
+ if (e.ProgressPercentage == 100)
+ {
+ Installer.ContentWindow?.FrameWindow.NavigationService.Navigate(new InstallationSuccess());
+ }
+ }
+
+ private static void InstallRoutine_Install(object? sender, DoWorkEventArgs e)
+ {
+ e.Result = InstallRoutine.Install(sender, e);
+ }
+
+ private static void InstallRoutine_Uninstall(object? sender, DoWorkEventArgs e)
+ {
+ e.Result = InstallRoutine.Uninstall(sender, e);
+ }
+ }
+}
diff --git a/GoAwayEdge/Pages/InstallationSuccess.xaml b/GoAwayEdge/UserInterface/Setup/Pages/InstallationSuccess.xaml
similarity index 89%
rename from GoAwayEdge/Pages/InstallationSuccess.xaml
rename to GoAwayEdge/UserInterface/Setup/Pages/InstallationSuccess.xaml
index 2c6f8c5..7c1f0ed 100644
--- a/GoAwayEdge/Pages/InstallationSuccess.xaml
+++ b/GoAwayEdge/UserInterface/Setup/Pages/InstallationSuccess.xaml
@@ -1,25 +1,24 @@
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/GoAwayEdge/Pages/InstallationSuccess.xaml.cs b/GoAwayEdge/UserInterface/Setup/Pages/InstallationSuccess.xaml.cs
similarity index 78%
rename from GoAwayEdge/Pages/InstallationSuccess.xaml.cs
rename to GoAwayEdge/UserInterface/Setup/Pages/InstallationSuccess.xaml.cs
index f2e03bf..4faab88 100644
--- a/GoAwayEdge/Pages/InstallationSuccess.xaml.cs
+++ b/GoAwayEdge/UserInterface/Setup/Pages/InstallationSuccess.xaml.cs
@@ -1,37 +1,40 @@
-using System.Windows;
-using System.Windows.Media.Imaging;
-using GoAwayEdge.Common;
-using Wpf.Ui.Controls;
-
-namespace GoAwayEdge.Pages
-{
- ///
- /// Interaktionslogik für Installation.xaml
- ///
- public partial class InstallationSuccess
- {
- public InstallationSuccess()
- {
- InitializeComponent();
-
- var exitResource = (string)Application.Current.MainWindow!.FindResource("Exit");
- Installer.ContentWindow!.NextBtn.IsEnabled = true;
- Installer.ContentWindow!.NextBtn.Icon = new SymbolIcon(SymbolRegular.ArrowExit20);
- Installer.ContentWindow!.NextBtn.Content = !string.IsNullOrEmpty(exitResource)
- ? exitResource : "Exit";
-
- if (Configuration.Uninstall)
- {
- Dispatcher.Invoke(() =>
- {
- var titleResource = (string)Application.Current.MainWindow!.FindResource("UninstallFinishedTitle");
- var descriptionResource = (string)Application.Current.MainWindow!.FindResource("UninstallFinishedDescription");
- SetupTitle.Text = !string.IsNullOrEmpty(titleResource)
- ? titleResource : "Uninstallation completed!";
- SetupDescription.Text = !string.IsNullOrEmpty(descriptionResource)
- ? descriptionResource : "GoAwayEdge has been successfully removed from the system.";
- });
- }
- }
- }
-}
+using System.Windows;
+using GoAwayEdge.Common;
+using Wpf.Ui.Controls;
+
+namespace GoAwayEdge.UserInterface.Setup.Pages
+{
+ ///
+ /// Interaktionslogik für Installation.xaml
+ ///
+ public partial class InstallationSuccess
+ {
+ public InstallationSuccess()
+ {
+ InitializeComponent();
+
+ var exitResource = (string)Application.Current.MainWindow!.FindResource("Exit");
+ Installer.ContentWindow!.NextBtn.IsEnabled = true;
+ Installer.ContentWindow!.NextBtn.Icon = new SymbolIcon(SymbolRegular.ArrowExit20);
+ Installer.ContentWindow!.NextBtn.Content = !string.IsNullOrEmpty(exitResource)
+ ? exitResource : "Exit";
+
+ var setupDescriptionResource = Configuration.InstallControlPanel ?
+ (string)Application.Current.MainWindow!.FindResource("SetupFinishedDescriptionWithControlPanel") : (string)Application.Current.MainWindow!.FindResource("SetupFinishedDescription");
+ SetupDescription.Text = setupDescriptionResource;
+
+ if (Configuration.Uninstall)
+ {
+ Dispatcher.Invoke(() =>
+ {
+ var titleResource = (string)Application.Current.MainWindow!.FindResource("UninstallFinishedTitle");
+ var descriptionResource = (string)Application.Current.MainWindow!.FindResource("UninstallFinishedDescription");
+ SetupTitle.Text = !string.IsNullOrEmpty(titleResource)
+ ? titleResource : "Uninstallation completed!";
+ SetupDescription.Text = !string.IsNullOrEmpty(descriptionResource)
+ ? descriptionResource : "GoAwayEdge has been successfully removed from the system.";
+ });
+ }
+ }
+ }
+}
diff --git a/GoAwayEdge/Pages/License.xaml b/GoAwayEdge/UserInterface/Setup/Pages/License.xaml
similarity index 81%
rename from GoAwayEdge/Pages/License.xaml
rename to GoAwayEdge/UserInterface/Setup/Pages/License.xaml
index 194fe6b..2c6e98f 100644
--- a/GoAwayEdge/Pages/License.xaml
+++ b/GoAwayEdge/UserInterface/Setup/Pages/License.xaml
@@ -1,23 +1,22 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/GoAwayEdge/Pages/License.xaml.cs b/GoAwayEdge/UserInterface/Setup/Pages/License.xaml.cs
similarity index 80%
rename from GoAwayEdge/Pages/License.xaml.cs
rename to GoAwayEdge/UserInterface/Setup/Pages/License.xaml.cs
index d2978c4..c85a954 100644
--- a/GoAwayEdge/Pages/License.xaml.cs
+++ b/GoAwayEdge/UserInterface/Setup/Pages/License.xaml.cs
@@ -1,49 +1,58 @@
-using System.Windows;
-
-namespace GoAwayEdge.Pages
-{
- ///
- /// Interaktionslogik für License.xaml
- ///
- public partial class License
- {
- public License()
- {
- InitializeComponent();
-
- const string license = @"MIT License
-
-Copyright (c) 2023-2024 valnoxy
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the ""Software""), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED ""AS IS"", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
- ";
-
- LicenseBlock.Text = license;
- }
-
- private void AcceptLicenseRb_Click(object sender, RoutedEventArgs e)
- {
- Installer.ContentWindow!.NextBtn.IsEnabled = true;
- }
- private void DeclineLicenseRb_Click(object sender, RoutedEventArgs e)
- {
- Installer.ContentWindow!.NextBtn.IsEnabled = false;
- }
- }
-}
+using System.Windows;
+using GoAwayEdge.Common;
+
+namespace GoAwayEdge.UserInterface.Setup.Pages
+{
+ ///
+ /// Interaktionslogik für License.xaml
+ ///
+ public partial class License
+ {
+ public License()
+ {
+ InitializeComponent();
+
+ if (Configuration.LicenseAccepted)
+ {
+ Installer.ContentWindow!.NextBtn.IsEnabled = true;
+ AcceptLicenseRadioBtn.IsChecked = true;
+ }
+
+ const string license = @"MIT License
+
+Copyright (c) 2023-2025 valnoxy
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the ""Software""), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED ""AS IS"", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+ ";
+
+ LicenseBlock.Text = license;
+ }
+
+ private void AcceptLicenseRb_Click(object sender, RoutedEventArgs e)
+ {
+ Installer.ContentWindow!.NextBtn.IsEnabled = true;
+ Configuration.LicenseAccepted = true;
+ }
+ private void DeclineLicenseRb_Click(object sender, RoutedEventArgs e)
+ {
+ Installer.ContentWindow!.NextBtn.IsEnabled = false;
+ Configuration.LicenseAccepted = false;
+ }
+ }
+}
diff --git a/GoAwayEdge/UserInterface/Setup/Pages/RedirectOrRemove.xaml b/GoAwayEdge/UserInterface/Setup/Pages/RedirectOrRemove.xaml
new file mode 100644
index 0000000..5a78aa8
--- /dev/null
+++ b/GoAwayEdge/UserInterface/Setup/Pages/RedirectOrRemove.xaml
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/GoAwayEdge/UserInterface/Setup/Pages/RedirectOrRemove.xaml.cs b/GoAwayEdge/UserInterface/Setup/Pages/RedirectOrRemove.xaml.cs
new file mode 100644
index 0000000..3160bc6
--- /dev/null
+++ b/GoAwayEdge/UserInterface/Setup/Pages/RedirectOrRemove.xaml.cs
@@ -0,0 +1,55 @@
+using System.Windows;
+using GoAwayEdge.Common;
+using GoAwayEdge.Common.Debugging;
+using Wpf.Ui;
+using Wpf.Ui.Controls;
+using Wpf.Ui.Extensions;
+
+namespace GoAwayEdge.UserInterface.Setup.Pages
+{
+ ///
+ /// Interaktionslogik für RedirectOrRemove.xaml
+ ///
+ public partial class RedirectOrRemove
+ {
+ public RedirectOrRemove()
+ {
+ InitializeComponent();
+ }
+
+ private void InstallBtn_Click(object sender, RoutedEventArgs e)
+ {
+ Configuration.UninstallEdge = false;
+ Installer.SettingPage = new Settings();
+ Installer.ContentWindow!.FrameWindow.Content = Installer.SettingPage;
+ Installer.ContentWindow!.NextBtn.IsEnabled = true;
+ }
+
+ private async void UninstallBtn_Click(object sender, RoutedEventArgs e)
+ {
+ var contentDialogService = new ContentDialogService();
+ contentDialogService.SetDialogHost(Installer.ContentWindow!.RootContentDialogPresenter);
+ var warningTitle = LocalizationManager.LocalizeValue("Warning");
+ var cancelBtn = LocalizationManager.LocalizeValue("Cancel");
+ var removeBtn = LocalizationManager.LocalizeValue("SettingsUninstallEdgeBtn");
+ var contentValue = LocalizationManager.LocalizeValue("SettingsUninstallEdgeWarningDescription");
+
+
+ var result = await contentDialogService.ShowSimpleDialogAsync(
+ new SimpleContentDialogCreateOptions
+ {
+ Title = warningTitle,
+ Content = contentValue,
+ PrimaryButtonText = removeBtn,
+ CloseButtonText = cancelBtn
+ }
+ );
+ if (result != ContentDialogResult.Primary) return;
+
+ Logging.Log("User pressed 'Remove Microsoft Edge'");
+ Configuration.UninstallEdge = true;
+ Installer.SettingPage = new Settings();
+ Installer.ContentWindow!.FrameWindow.Content = Installer.SettingPage;
+ }
+ }
+}
diff --git a/GoAwayEdge/UserInterface/Setup/Pages/Settings.xaml b/GoAwayEdge/UserInterface/Setup/Pages/Settings.xaml
new file mode 100644
index 0000000..1a397e3
--- /dev/null
+++ b/GoAwayEdge/UserInterface/Setup/Pages/Settings.xaml
@@ -0,0 +1,217 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/GoAwayEdge/UserInterface/Setup/Pages/Settings.xaml.cs b/GoAwayEdge/UserInterface/Setup/Pages/Settings.xaml.cs
new file mode 100644
index 0000000..3c6628e
--- /dev/null
+++ b/GoAwayEdge/UserInterface/Setup/Pages/Settings.xaml.cs
@@ -0,0 +1,283 @@
+using System.Windows;
+using System.Windows.Controls;
+using GoAwayEdge.Common;
+using Wpf.Ui.Controls;
+
+namespace GoAwayEdge.UserInterface.Setup.Pages
+{
+ ///
+ /// Interaktionslogik für Settings.xaml
+ ///
+ public partial class Settings
+ {
+ public Settings()
+ {
+ InitializeComponent();
+
+ // Edge Channel
+ foreach (var edgeChannels in Configuration.GetEdgeChannels())
+ {
+ EdgeChannelBox.Items.Add(edgeChannels);
+ }
+ EdgeChannelBox.SelectedItem = Configuration.Channel.ToString();
+
+ // Search Engine
+ foreach (var searchEngine in Configuration.GetSearchEngines())
+ {
+ SearchEngineBox.Items.Add(searchEngine);
+ }
+ SearchEngineBox.SelectedItem = Configuration.Search.ToString().Replace("_", " ");
+
+ if (Configuration.Search == SearchEngine.Custom)
+ {
+ SearchEngineBox.SelectedItem = LocalizationManager.LocalizeValue("SettingsSearchEngineCustomItem");
+ CustomSearchPanel.Visibility = Visibility.Visible;
+ if (Configuration.CustomQueryUrl != null) QueryUrlTextBox.Text = Configuration.CustomQueryUrl;
+ CustomUrlStatus.Symbol = Uri.TryCreate(QueryUrlTextBox.Text, UriKind.Absolute, out _)
+ ? SymbolRegular.CheckmarkCircle24 : SymbolRegular.ErrorCircle24;
+ }
+
+ // AI Provider
+ foreach (var aiProvider in Configuration.GetAiProviders())
+ {
+ CopilotProviderBox.Items.Add(aiProvider);
+ }
+ CopilotProviderBox.SelectedItem = Configuration.AiProvider.ToString().Replace("_", " ");
+
+ if (Configuration.AiProvider == AiProvider.Custom)
+ {
+ CopilotProviderBox.SelectedItem = LocalizationManager.LocalizeValue("SettingsSearchEngineCustomItem");
+ CustomAiPanel.Visibility = Visibility.Visible;
+ if (Configuration.CustomAiProviderUrl != null) QueryAiProviderTextBox.Text = Configuration.CustomAiProviderUrl;
+ CustomUrlStatus.Symbol = Uri.TryCreate(QueryAiProviderTextBox.Text, UriKind.Absolute, out _)
+ ? SymbolRegular.CheckmarkCircle24 : SymbolRegular.ErrorCircle24;
+ }
+
+ if (Configuration.AiProvider == AiProvider.Default)
+ CopilotProviderBox.SelectedItem = LocalizationManager.LocalizeValue("Default");
+
+ // Weather Provider
+ foreach (var weatherProvider in Configuration.GetWeatherProviders())
+ {
+ WeatherProviderBox.Items.Add(weatherProvider);
+ }
+ WeatherProviderBox.SelectedItem = Configuration.WeatherProvider.ToString().Replace("_", " ");
+
+ if (Configuration.WeatherProvider == WeatherProvider.Custom)
+ {
+ WeatherProviderBox.SelectedItem = LocalizationManager.LocalizeValue("SettingsSearchEngineCustomItem");
+ CustomWeatherPanel.Visibility = Visibility.Visible;
+ if (Configuration.CustomWeatherProviderUrl != null) QueryWeatherProviderTextBox.Text = Configuration.CustomWeatherProviderUrl;
+ CustomWeatherUrlStatus.Symbol = Uri.TryCreate(QueryWeatherProviderTextBox.Text, UriKind.Absolute, out _)
+ ? SymbolRegular.CheckmarkCircle24 : SymbolRegular.ErrorCircle24;
+ }
+
+ if (Configuration.WeatherProvider == WeatherProvider.Default)
+ WeatherProviderBox.SelectedItem = LocalizationManager.LocalizeValue("Default");
+
+ // Others
+ if (Configuration.NoEdgeInstalled)
+ {
+ CopilotStackPanel.IsEnabled = false;
+ WeatherStackPanel.IsEnabled = false;
+ EdgeStackPanel.IsEnabled = false;
+ }
+
+ Configuration.Uninstall = false;
+ Configuration.InstallControlPanel = true;
+ ControlPanelSwitch.IsChecked = true;
+
+ if (Configuration.UninstallEdge)
+ {
+ CopilotStackPanel.IsEnabled = false;
+ WeatherStackPanel.IsEnabled = false;
+ }
+ }
+
+ private void EnableNextBtnValidation()
+ {
+ var validation = true;
+
+ if (Configuration.Search == SearchEngine.Custom)
+ validation = !string.IsNullOrEmpty(Configuration.CustomQueryUrl) && CustomUrlStatus.Symbol == SymbolRegular.CheckmarkCircle24;
+ if (Configuration.AiProvider == AiProvider.Custom)
+ validation = !string.IsNullOrEmpty(Configuration.CustomAiProviderUrl) && CustomAiUrlStatus.Symbol == SymbolRegular.CheckmarkCircle24;
+ if (Configuration.WeatherProvider == WeatherProvider.Custom)
+ validation = !string.IsNullOrEmpty(Configuration.CustomWeatherProviderUrl) && CustomWeatherUrlStatus.Symbol == SymbolRegular.CheckmarkCircle24;
+
+ Installer.ContentWindow!.NextBtn.IsEnabled = validation;
+ }
+
+ private void EdgeChannelBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ Configuration.Channel = EdgeChannelBox.SelectedIndex switch
+ {
+ 0 => EdgeChannel.Stable,
+ 1 => EdgeChannel.Beta,
+ 2 => EdgeChannel.Dev,
+ 3 => EdgeChannel.Canary,
+ _ => EdgeChannel.Stable
+ };
+ }
+
+ private void SearchEngineBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ switch (SearchEngineBox.SelectedIndex)
+ {
+ case 0:
+ Configuration.Search = SearchEngine.Google;
+ CustomSearchPanel.Visibility = Visibility.Collapsed;
+ break;
+ case 1:
+ Configuration.Search = SearchEngine.Bing;
+ CustomSearchPanel.Visibility = Visibility.Collapsed;
+ break;
+ case 2:
+ Configuration.Search = SearchEngine.DuckDuckGo;
+ CustomSearchPanel.Visibility = Visibility.Collapsed;
+ break;
+ case 3:
+ Configuration.Search = SearchEngine.Yahoo;
+ CustomSearchPanel.Visibility = Visibility.Collapsed;
+ break;
+ case 4:
+ Configuration.Search = SearchEngine.Yandex;
+ CustomSearchPanel.Visibility = Visibility.Collapsed;
+ break;
+ case 5:
+ Configuration.Search = SearchEngine.Ecosia;
+ CustomSearchPanel.Visibility = Visibility.Collapsed;
+ break;
+ case 6:
+ Configuration.Search = SearchEngine.Ask;
+ CustomSearchPanel.Visibility = Visibility.Collapsed;
+ break;
+ case 7:
+ Configuration.Search = SearchEngine.Qwant;
+ CustomSearchPanel.Visibility = Visibility.Collapsed;
+ break;
+ case 8:
+ Configuration.Search = SearchEngine.Perplexity;
+ CustomSearchPanel.Visibility = Visibility.Collapsed;
+ break;
+ case 9:
+ Configuration.Search = SearchEngine.Custom;
+ CustomSearchPanel.Visibility = Visibility.Visible;
+ break;
+ }
+ EnableNextBtnValidation();
+ }
+
+ private void QueryUrlTextBox_OnTextChanged(object sender, TextChangedEventArgs e)
+ {
+ if (Uri.TryCreate(QueryUrlTextBox.Text, UriKind.Absolute, out var uriResult)
+ && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps))
+ {
+ CustomUrlStatus.Symbol = SymbolRegular.CheckmarkCircle24;
+ Configuration.CustomQueryUrl = QueryUrlTextBox.Text;
+ }
+ else
+ {
+ CustomUrlStatus.Symbol = SymbolRegular.ErrorCircle24;
+ }
+ EnableNextBtnValidation();
+ }
+
+ private void ControlPanelSwitch_OnClick(object sender, RoutedEventArgs e)
+ {
+ Configuration.InstallControlPanel = ControlPanelSwitch.IsChecked!.Value;
+ }
+
+ private void CopilotProviderBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ switch (CopilotProviderBox.SelectedIndex)
+ {
+ case 0:
+ Configuration.AiProvider = AiProvider.Default;
+ CustomAiPanel.Visibility = Visibility.Collapsed;
+ break;
+ case 1:
+ Configuration.AiProvider = AiProvider.Copilot;
+ CustomAiPanel.Visibility = Visibility.Collapsed;
+ break;
+ case 2:
+ Configuration.AiProvider = AiProvider.ChatGPT;
+ CustomAiPanel.Visibility = Visibility.Collapsed;
+ break;
+ case 3:
+ Configuration.AiProvider = AiProvider.Gemini;
+ CustomAiPanel.Visibility = Visibility.Collapsed;
+ break;
+ case 4:
+ Configuration.AiProvider = AiProvider.GitHub_Copilot;
+ CustomAiPanel.Visibility = Visibility.Collapsed;
+ break;
+ case 5:
+ Configuration.AiProvider = AiProvider.Grok;
+ CustomAiPanel.Visibility = Visibility.Collapsed;
+ break;
+ case 6:
+ Configuration.AiProvider = AiProvider.Custom;
+ CustomAiPanel.Visibility = Visibility.Visible;
+ break;
+ }
+ EnableNextBtnValidation();
+ }
+
+ private void WeatherProviderBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ switch (WeatherProviderBox.SelectedIndex)
+ {
+ case 0:
+ Configuration.WeatherProvider = WeatherProvider.Default;
+ CustomWeatherPanel.Visibility = Visibility.Collapsed;
+ break;
+ case 1:
+ Configuration.WeatherProvider = WeatherProvider.WeatherCom;
+ CustomWeatherPanel.Visibility = Visibility.Collapsed;
+ break;
+ case 2:
+ Configuration.WeatherProvider = WeatherProvider.AccuWeather;
+ CustomWeatherPanel.Visibility = Visibility.Collapsed;
+ break;
+ case 3:
+ Configuration.WeatherProvider = WeatherProvider.Custom;
+ CustomWeatherPanel.Visibility = Visibility.Visible;
+ break;
+ }
+ EnableNextBtnValidation();
+ }
+
+ private void QueryAiProviderTextBox_OnTextChanged(object sender, TextChangedEventArgs e)
+ {
+ // Test if the URL is valid
+ if (Uri.TryCreate(QueryAiProviderTextBox.Text, UriKind.Absolute, out var uriResult)
+ && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps))
+ {
+ CustomAiUrlStatus.Symbol = SymbolRegular.CheckmarkCircle24;
+ Configuration.CustomAiProviderUrl = QueryAiProviderTextBox.Text;
+ }
+ else
+ {
+ CustomAiUrlStatus.Symbol = SymbolRegular.ErrorCircle24;
+ }
+ EnableNextBtnValidation();
+ }
+
+ private void QueryWeatherProviderTextBox_OnTextChanged(object sender, TextChangedEventArgs e)
+ {
+ // Test if the URL is valid
+ if (Uri.TryCreate(QueryWeatherProviderTextBox.Text, UriKind.Absolute, out var uriResult)
+ && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps))
+ {
+ CustomWeatherUrlStatus.Symbol = SymbolRegular.CheckmarkCircle24;
+ Configuration.CustomWeatherProviderUrl = QueryWeatherProviderTextBox.Text;
+ }
+ else
+ {
+ CustomWeatherUrlStatus.Symbol = SymbolRegular.ErrorCircle24;
+ }
+ EnableNextBtnValidation();
+ }
+ }
+}
diff --git a/GoAwayEdge/Pages/Welcome.xaml b/GoAwayEdge/UserInterface/Setup/Pages/Welcome.xaml
similarity index 94%
rename from GoAwayEdge/Pages/Welcome.xaml
rename to GoAwayEdge/UserInterface/Setup/Pages/Welcome.xaml
index a7e8494..b09c5e5 100644
--- a/GoAwayEdge/Pages/Welcome.xaml
+++ b/GoAwayEdge/UserInterface/Setup/Pages/Welcome.xaml
@@ -1,55 +1,54 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/GoAwayEdge/Pages/Welcome.xaml.cs b/GoAwayEdge/UserInterface/Setup/Pages/Welcome.xaml.cs
similarity index 89%
rename from GoAwayEdge/Pages/Welcome.xaml.cs
rename to GoAwayEdge/UserInterface/Setup/Pages/Welcome.xaml.cs
index 05925ad..834b8a4 100644
--- a/GoAwayEdge/Pages/Welcome.xaml.cs
+++ b/GoAwayEdge/UserInterface/Setup/Pages/Welcome.xaml.cs
@@ -1,40 +1,40 @@
-using System.IO;
-using System.Windows;
-using System.Windows.Controls;
-using GoAwayEdge.Common;
-
-namespace GoAwayEdge.Pages
-{
- ///
- /// Interaktionslogik für Welcome.xaml
- ///
- public partial class Welcome : UserControl
- {
- public Welcome()
- {
- InitializeComponent();
-
- if (!Path.Exists(Configuration.InstallDir))
- UninstallBtn.IsEnabled = false;
- if (Path.GetDirectoryName(Environment.ProcessPath) != Configuration.InstallDir) return;
- UninstallBtn.IsEnabled = false;
- Dispatcher.Invoke(() =>
- {
- var resourceValue = (string)Application.Current.MainWindow!.FindResource("SettingsUninstallUseInstaller");
- EdgeUninstallNote.Text = !string.IsNullOrEmpty(resourceValue) ? resourceValue : "Please use the Installer in order to uninstall GoAwayEdge.";
- });
- }
-
- private void InstallBtn_Click(object sender, RoutedEventArgs e)
- {
- Installer.ContentWindow!.FrameWindow.Content = Installer.LicensePage;
- Installer.ContentWindow!.BackBtn.IsEnabled = true;
- }
-
- private void UninstallBtn_Click(object sender, RoutedEventArgs e)
- {
- Configuration.Uninstall = true;
- Installer.ContentWindow!.FrameWindow.Content = new Installation();
- }
- }
-}
+using System.IO;
+using System.Windows;
+using GoAwayEdge.Common;
+
+namespace GoAwayEdge.UserInterface.Setup.Pages
+{
+ ///
+ /// Interaktionslogik für Welcome.xaml
+ ///
+ public partial class Welcome
+ {
+ public Welcome()
+ {
+ InitializeComponent();
+
+ if (!Path.Exists(Configuration.InstallDir))
+ UninstallBtn.IsEnabled = false;
+ if (Path.GetDirectoryName(Environment.ProcessPath) != Configuration.InstallDir) return;
+ UninstallBtn.IsEnabled = false;
+ Dispatcher.Invoke(() =>
+ {
+ var resourceValue = (string)Application.Current.MainWindow!.FindResource("SettingsUninstallUseInstaller");
+ EdgeUninstallNote.Text = !string.IsNullOrEmpty(resourceValue) ? resourceValue : "Please use the Installer in order to uninstall GoAwayEdge.";
+ });
+ }
+
+ private void InstallBtn_Click(object sender, RoutedEventArgs e)
+ {
+ Installer.LicensePage = new License();
+ Installer.ContentWindow!.FrameWindow.Content = Installer.LicensePage;
+ Installer.ContentWindow!.BackBtn.IsEnabled = true;
+ }
+
+ private void UninstallBtn_Click(object sender, RoutedEventArgs e)
+ {
+ Configuration.Uninstall = true;
+ Installer.ContentWindow!.FrameWindow.Content = new Installation();
+ }
+ }
+}
diff --git a/README.md b/README.md
index f392650..ecf1fc3 100644
--- a/README.md
+++ b/README.md
@@ -35,10 +35,10 @@
·
Discussions
·
- Help me translate
+ Help me translate
- 🎉 Version 1.3.4 is out. Check out the release notes
+ 🎉 Version 2.0.0 is out. Check out the release notes
here .
@@ -72,17 +72,21 @@ Feel free to explore the code, contribute, or simply enjoy a browser experience
## 🤫 2. Silent Installation
You can install GoAwayEdge silently by parsing the following arguments:
-| Switch | Description |
-| ----------------- | ------------------------------------------------------------------------- |
-| `-s` | Silent installation |
-| `-se:` | Specify the Search Engine: `Google` (default), `Bing`, `DuckDuckGo`, `Yahoo`, `Yandex`, `Ecosia`, `Ask`, `Qwant`, `Perplexity` |
-| `--url:` | Custom search query url (ex: `https://google.com/search?q=`) |
+| Switch | Description |
+| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------ |
+| `-s` | Silent installation |
+| `-e:` | Specify the Search Engine: `Google` (default), `Bing`, `DuckDuckGo`, `Yahoo`, `Yandex`, `Ecosia`, `Ask`, `Qwant`, `Perplexity` |
+| `-a:` | Specify the AI Service: `Default`, `Copilot`, `ChatGPT`, `Gemini`, `GitHub_Copilot`, `Grok` |
+| `-w:` | Specify the Weather Service: `Default`, `WeatherCom`, `AccuWeather` |
+| `--search-url:` | Custom search query url (ex: `https://google.com/search?q=`) |
+| `--ai-url:` | Custom AI website (ex: `https://chatgpt.com`) |
+| `--weather-url:` | Custom weather query url (ex: `https://my-weather.com/{country-code}/{latitude},{longitude}`) |
Example :
```bat
-GoAwayEdge.exe -s -se:DuckDuckGo
-```
+GoAwayEdge.exe -s -e:DuckDuckGo
+```
# 🗑️ Remove GoAwayEdge
You can uninstall GoAwayEdge just like any other application. Alternatively, you can also take this way:
@@ -91,7 +95,7 @@ You can uninstall GoAwayEdge just like any other application. Alternatively, you
3. Click on ```Uninstall```.
4. Done!
-You can also uninstall GoAwayEdge by parsing the following argument:
+You can also silently uninstall GoAwayEdge by parsing the following argument:
```bat
GoAwayEdge.exe -u
```
@@ -110,7 +114,7 @@ This project uses the following libraries:
GoAwayEdge is licensed under [MIT](https://github.com/valnoxy/GoAwayEdge/blob/main/LICENSE). So you are allowed to use freely and modify the application. I will not be responsible for any outcome. Proceed with any action at your own risk.
-© 2018 - 2024 valnoxy. All Rights Reserved.
+© 2018 - 2025 valnoxy. All Rights Reserved.
By Jonas Günner <jonas@exploitox.de>