mirror of
https://github.com/greenshot/greenshot
synced 2025-08-20 13:33:27 -07:00
Compare commits
27 commits
v1.3.274
...
release/1.
Author | SHA1 | Date | |
---|---|---|---|
|
c1ad1d4a93 | ||
|
82702c4830 |
||
|
b69c415669 |
||
|
e81abdcd7b |
||
|
dbbfbb654e |
||
|
7360791872 |
||
|
aa98a7ce78 |
||
|
dbfdfe9a05 |
||
|
2121547387 |
||
|
af04773497 |
||
|
8e98cdbfb5 |
||
|
789a569706 |
||
|
6400b08a8c |
||
|
1f0ae08a52 |
||
|
95d4c1c2d1 |
||
|
cc063b6426 |
||
|
ff260bae52 | ||
|
15d5888090 | ||
|
c8f424b72e |
||
|
262307e61e | ||
|
cac566c70a |
||
|
245f6f261b |
||
|
bb7a374390 |
||
|
a3e65fee6f |
||
|
f862e79485 | ||
|
099e656963 | ||
|
a152e2883f |
69 changed files with 1458 additions and 634 deletions
14
.github/workflows/purge-cloudflare-cache.yml
vendored
Normal file
14
.github/workflows/purge-cloudflare-cache.yml
vendored
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
name: Purge CloudFlare Cache
|
||||||
|
|
||||||
|
on:
|
||||||
|
page_build:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
purge_cache:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: purge
|
||||||
|
uses: jakejarvis/cloudflare-purge-action@master
|
||||||
|
env:
|
||||||
|
CLOUDFLARE_ZONE: ${{ secrets.CLOUDFLARE_ZONE }}
|
||||||
|
CLOUDFLARE_TOKEN: ${{ secrets.CLOUDFLARE_TOKEN }}
|
163
.github/workflows/release.yml
vendored
Normal file
163
.github/workflows/release.yml
vendored
Normal file
|
@ -0,0 +1,163 @@
|
||||||
|
env:
|
||||||
|
IS_RELEASE_BRANCH: ${{ startsWith(github.ref, 'refs/heads/release/') }}
|
||||||
|
BRANCH_NAME: ${{ github.ref_name }}
|
||||||
|
|
||||||
|
name: Build and Deploy
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- 'release/1.*'
|
||||||
|
paths-ignore:
|
||||||
|
- '.github/**'
|
||||||
|
- '.gitignore'
|
||||||
|
- '*.md'
|
||||||
|
- 'LICENSE'
|
||||||
|
- 'build-and-deploy.ps1'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: windows-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Setup MSBuild
|
||||||
|
uses: microsoft/setup-msbuild@v2
|
||||||
|
|
||||||
|
- name: Set up .NET
|
||||||
|
uses: actions/setup-dotnet@v4
|
||||||
|
with:
|
||||||
|
dotnet-version: '7.x'
|
||||||
|
|
||||||
|
- name: Restore NuGet packages
|
||||||
|
run: msbuild src/Greenshot.sln /p:Configuration=Release /restore /t:PrepareForBuild
|
||||||
|
env:
|
||||||
|
Box13_ClientId: ${{ secrets.Box13_ClientId }}
|
||||||
|
Box13_ClientSecret: ${{ secrets.Box13_ClientSecret }}
|
||||||
|
DropBox13_ClientId: ${{ secrets.DropBox13_ClientId }}
|
||||||
|
DropBox13_ClientSecret: ${{ secrets.DropBox13_ClientSecret }}
|
||||||
|
Flickr_ClientId: ${{ secrets.Flickr_ClientId }}
|
||||||
|
Flickr_ClientSecret: ${{ secrets.Flickr_ClientSecret }}
|
||||||
|
Imgur13_ClientId: ${{ secrets.Imgur13_ClientId }}
|
||||||
|
Imgur13_ClientSecret: ${{ secrets.Imgur13_ClientSecret }}
|
||||||
|
Photobucket_ClientId: ${{ secrets.Photobucket_ClientId }}
|
||||||
|
Photobucket_ClientSecret: ${{ secrets.Photobucket_ClientSecret }}
|
||||||
|
Picasa_ClientId: ${{ secrets.Picasa_ClientId }}
|
||||||
|
Picasa_ClientSecret: ${{ secrets.Picasa_ClientSecret }}
|
||||||
|
|
||||||
|
- name: Build and package
|
||||||
|
run: msbuild src/Greenshot.sln /p:Configuration=Release /t:Rebuild /v:normal
|
||||||
|
env:
|
||||||
|
Box13_ClientId: ${{ secrets.Box13_ClientId }}
|
||||||
|
Box13_ClientSecret: ${{ secrets.Box13_ClientSecret }}
|
||||||
|
DropBox13_ClientId: ${{ secrets.DropBox13_ClientId }}
|
||||||
|
DropBox13_ClientSecret: ${{ secrets.DropBox13_ClientSecret }}
|
||||||
|
Flickr_ClientId: ${{ secrets.Flickr_ClientId }}
|
||||||
|
Flickr_ClientSecret: ${{ secrets.Flickr_ClientSecret }}
|
||||||
|
Imgur13_ClientId: ${{ secrets.Imgur13_ClientId }}
|
||||||
|
Imgur13_ClientSecret: ${{ secrets.Imgur13_ClientSecret }}
|
||||||
|
Photobucket_ClientId: ${{ secrets.Photobucket_ClientId }}
|
||||||
|
Photobucket_ClientSecret: ${{ secrets.Photobucket_ClientSecret }}
|
||||||
|
Picasa_ClientId: ${{ secrets.Picasa_ClientId }}
|
||||||
|
Picasa_ClientSecret: ${{ secrets.Picasa_ClientSecret }}
|
||||||
|
|
||||||
|
- name: Copy Files
|
||||||
|
run: |
|
||||||
|
mkdir -p ${{ github.workspace }}/artifacts
|
||||||
|
cp installer/Greenshot-INSTALLER-*.exe ${{ github.workspace }}/artifacts/
|
||||||
|
|
||||||
|
- name: Upload Artifact
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: drop
|
||||||
|
path: ${{ github.workspace }}/artifacts
|
||||||
|
|
||||||
|
deploy:
|
||||||
|
runs-on: windows-latest
|
||||||
|
needs: build
|
||||||
|
|
||||||
|
steps:
|
||||||
|
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Download build artifacts
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: drop # Name of the artifact uploaded in previous steps
|
||||||
|
path: drop # Local folder where artifacts are downloaded
|
||||||
|
|
||||||
|
- name: Extract version from file name
|
||||||
|
if: env.IS_RELEASE_BRANCH == 'true'
|
||||||
|
id: version_from_filename
|
||||||
|
run: |
|
||||||
|
$file = Get-ChildItem drop -Filter "Greenshot-INSTALLER-*.exe" | Select-Object -First 1
|
||||||
|
if (-not $file) {
|
||||||
|
throw "No matching file found in 'drop' directory."
|
||||||
|
}
|
||||||
|
if ($file.Name -match "Greenshot-INSTALLER-([\d\.]+)(.*)\.exe") {
|
||||||
|
echo "version=$($matches[1])" >> $Env:GITHUB_OUTPUT
|
||||||
|
} else {
|
||||||
|
throw "Version number could not be extracted from file name: $($file.Name)"
|
||||||
|
}
|
||||||
|
shell: pwsh
|
||||||
|
|
||||||
|
- name: Set version from sanitized branch name
|
||||||
|
if: env.IS_RELEASE_BRANCH != 'true'
|
||||||
|
id: version_from_branchname
|
||||||
|
run: |
|
||||||
|
$branch = "${{ github.ref }}" -replace '^refs/heads/', ''
|
||||||
|
$sanitized = $branch -replace '[^a-zA-Z0-9._-]', '_'
|
||||||
|
echo "version=$sanitized" >> $Env:GITHUB_OUTPUT
|
||||||
|
shell: pwsh
|
||||||
|
|
||||||
|
- name: Set version info
|
||||||
|
id: version_info
|
||||||
|
run: |
|
||||||
|
echo "version=${{ steps.version_from_filename.outputs.version || steps.version_from_branchname.outputs.version }}" >> $GITHUB_OUTPUT
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
|
||||||
|
- name: Create tag
|
||||||
|
if: env.IS_RELEASE_BRANCH == 'true'
|
||||||
|
run: |
|
||||||
|
git config user.name "github-actions[bot]"
|
||||||
|
git config user.email "github-actions[bot]@users.noreply.github.com"
|
||||||
|
git tag -a "v${{ steps.version_info.outputs.version }}" -m "v${{ steps.version_info.outputs.version }}"
|
||||||
|
git push origin "v${{ steps.version_info.outputs.version }}"
|
||||||
|
|
||||||
|
- name: Rename installer for non-release branch
|
||||||
|
if: env.IS_RELEASE_BRANCH != 'true'
|
||||||
|
run: |
|
||||||
|
branch="${BRANCH_NAME:-${GITHUB_REF#refs/heads/}}"
|
||||||
|
sanitized=$(echo "$branch" | sed 's/[^a-zA-Z0-9._-]/_/g')
|
||||||
|
mv drop/Greenshot-INSTALLER-*.exe "drop/Greenshot-INSTALLER-${sanitized}.exe"
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
- name: Create GitHub Release
|
||||||
|
uses: softprops/action-gh-release@v2
|
||||||
|
with:
|
||||||
|
name: "Greenshot ${{ steps.version_info.outputs.version }} (continuous build)"
|
||||||
|
tag_name: ${{ env.IS_RELEASE_BRANCH == 'true' && format('v{0}', steps.version_info.outputs.version) || env.BRANCH_NAME }}
|
||||||
|
files: drop/*.exe
|
||||||
|
generate_release_notes: true
|
||||||
|
draft: ${{ env.IS_RELEASE_BRANCH != 'true' }}
|
||||||
|
prerelease: true
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Trigger GitHub Pages rebuild
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
curl -X POST \
|
||||||
|
-H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
|
||||||
|
-H "Accept: application/vnd.github+json" \
|
||||||
|
https://api.github.com/repos/${{ github.repository }}/pages/builds
|
||||||
|
|
18
.github/workflows/update-gh-pages.yml
vendored
Normal file
18
.github/workflows/update-gh-pages.yml
vendored
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
name: Update GitHub Pages
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
release:
|
||||||
|
types: [published, unpublished, created, edited, deleted, prereleased, released]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
update-gh-pages:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Trigger GitHub Pages rebuild
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
curl -X POST \
|
||||||
|
-H "Authorization: Bearer ${{ secrets.GH_PAGES_TOKEN }}" \
|
||||||
|
-H "Accept: application/vnd.github+json" \
|
||||||
|
https://api.github.com/repos/${{ github.repository }}/pages/builds
|
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -215,3 +215,5 @@ ModelManifest.xml
|
||||||
|
|
||||||
# Rider files
|
# Rider files
|
||||||
.idea
|
.idea
|
||||||
|
|
||||||
|
/installer/Greenshot-INSTALLER-*.exe
|
||||||
|
|
23
README.md
23
README.md
|
@ -21,4 +21,25 @@ Being easy to understand and configurable, Greenshot is an efficient tool for pr
|
||||||
|
|
||||||
About this repository
|
About this repository
|
||||||
---------------------
|
---------------------
|
||||||
This repository is for Greenshot 1.3, currently in development, but is the next planned release
|
This is the development branch is for Greenshot 1.3, which has been first released on 2025-07-14.
|
||||||
|
|
||||||
|
Releases
|
||||||
|
--------
|
||||||
|
|
||||||
|
You can find a list of all releases (stable and unstable) in the [Github releases](https://github.com/greenshot/greenshot/releases) or in the [version history on our website](https://getgreenshot.org/version-history/).
|
||||||
|
The [downloads page on our website](https://getgreenshot.org/downloads/) always links to the latest stable release.
|
||||||
|
|
||||||
|
Trademark and Logo Usage Policy
|
||||||
|
-------------------------------
|
||||||
|
|
||||||
|
The Greenshot logo and trademark are the property of the Greenshot development team. Unauthorized use of the logo and trademark is generally prohibited. However, we allow the use of the Greenshot name and logo in the following contexts:
|
||||||
|
|
||||||
|
* In blog posts, articles, or reviews that discuss or promote the Greenshot, provided that the usage is fair and does not imply endorsement by Greenshot.
|
||||||
|
* In educational materials or presentations that accurately represent the project.
|
||||||
|
|
||||||
|
Please refrain from using the Greenshot logo and trademark in any promotional materials, products, or in a manner that may cause confusion or imply endorsement without prior written permission.
|
||||||
|
|
||||||
|
If you have any questions or wish to seek permission for other uses, please contact us.
|
||||||
|
|
||||||
|
Thank you for your understanding and cooperation.
|
||||||
|
|
||||||
|
|
5
SECURITY.md
Normal file
5
SECURITY.md
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
# Security Policy
|
||||||
|
|
||||||
|
## Reporting a Vulnerability
|
||||||
|
|
||||||
|
If you think you found a security issue in Greenshot, please report it responsibly [in our security section](https://github.com/greenshot/greenshot/security). We try to look into it as soon as possible - please give us some time for reaction, though.
|
|
@ -1,106 +0,0 @@
|
||||||
# .NET Desktop
|
|
||||||
# Build and run tests for .NET Desktop or Windows classic desktop solutions.
|
|
||||||
# Add steps that publish symbols, save build artifacts, and more:
|
|
||||||
# https://docs.microsoft.com/azure/devops/pipelines/apps/windows/dot-net
|
|
||||||
|
|
||||||
trigger:
|
|
||||||
batch: true
|
|
||||||
branches:
|
|
||||||
include:
|
|
||||||
- 'release/1.*'
|
|
||||||
exclude:
|
|
||||||
- 'develop'
|
|
||||||
|
|
||||||
stages:
|
|
||||||
- stage: Build
|
|
||||||
jobs:
|
|
||||||
- job: Build
|
|
||||||
variables:
|
|
||||||
- group: 'Plug-in Credentials'
|
|
||||||
- name: solution
|
|
||||||
value: 'src/Greenshot.sln'
|
|
||||||
- name: buildPlatform
|
|
||||||
value: 'Any CPU'
|
|
||||||
- name: buildConfiguration
|
|
||||||
value: 'Release'
|
|
||||||
|
|
||||||
pool:
|
|
||||||
vmImage: 'Windows-latest'
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- task: MSBuild@1
|
|
||||||
displayName: Restore nuget packages and generate credential templates
|
|
||||||
inputs:
|
|
||||||
solution: '$(solution)'
|
|
||||||
platform: $(buildPlatform)
|
|
||||||
configuration: $(buildConfiguration)
|
|
||||||
msbuildArguments: '/restore /t:PrepareForBuild'
|
|
||||||
|
|
||||||
- task: MSBuild@1
|
|
||||||
displayName: Build and package
|
|
||||||
inputs:
|
|
||||||
solution: '$(solution)'
|
|
||||||
platform: $(buildPlatform)
|
|
||||||
configuration: $(buildConfiguration)
|
|
||||||
env:
|
|
||||||
Box13_ClientId: $(Box13_ClientId)
|
|
||||||
Box13_ClientSecret: $(Box13_ClientSecret)
|
|
||||||
DropBox13_ClientId: $(DropBox13_ClientId)
|
|
||||||
DropBox13_ClientSecret: $(DropBox13_ClientSecret)
|
|
||||||
Flickr_ClientId: $(Flickr_ClientId)
|
|
||||||
Flickr_ClientSecret: $(Flickr_ClientSecret)
|
|
||||||
Imgur13_ClientId: $(Imgur13_ClientId)
|
|
||||||
Imgur13_ClientSecret: $(Imgur13_ClientSecret)
|
|
||||||
Photobucket_ClientId: $(Photobucket_ClientId)
|
|
||||||
Photobucket_ClientSecret: $(Photobucket_ClientSecret)
|
|
||||||
Picasa_ClientId: $(Picasa_ClientId)
|
|
||||||
Picasa_ClientSecret: $(Picasa_ClientSecret)
|
|
||||||
|
|
||||||
- task: CopyFiles@2
|
|
||||||
displayName: 'Copy Files to: $(build.artifactstagingdirectory)'
|
|
||||||
inputs:
|
|
||||||
SourceFolder: '$(Build.SourcesDirectory)\installer'
|
|
||||||
Contents: Greenshot-INSTALLER-*.exe
|
|
||||||
TargetFolder: '$(build.artifactstagingdirectory)'
|
|
||||||
flattenFolders: true
|
|
||||||
|
|
||||||
- task: PublishBuildArtifacts@1
|
|
||||||
displayName: 'Publish Artifact: drop'
|
|
||||||
inputs:
|
|
||||||
PathtoPublish: '$(build.artifactstagingdirectory)'
|
|
||||||
|
|
||||||
- stage: Deploy
|
|
||||||
jobs:
|
|
||||||
- deployment: GitHub_Release
|
|
||||||
pool:
|
|
||||||
vmImage: 'Windows-latest'
|
|
||||||
|
|
||||||
environment: 'GitHub Release'
|
|
||||||
strategy:
|
|
||||||
# default deployment strategy
|
|
||||||
runOnce:
|
|
||||||
deploy:
|
|
||||||
steps:
|
|
||||||
- download: current
|
|
||||||
artifact: drop
|
|
||||||
|
|
||||||
# Create a GitHub release
|
|
||||||
- task: GitHubRelease@0
|
|
||||||
inputs:
|
|
||||||
gitHubConnection: GitHub Release
|
|
||||||
repositoryName: '$(Build.Repository.Name)'
|
|
||||||
action: 'create' # Options: create, edit, delete
|
|
||||||
target: '$(Build.SourceVersion)' # Required when action == Create || Action == Edit
|
|
||||||
tagSource: 'manual' # Required when action == Create# Options: auto, manual
|
|
||||||
tag: 'v$(Build.BuildNumber)' # Required when action == Edit || Action == Delete || TagSource == Manual
|
|
||||||
title: Greenshot $(Build.BuildNumber) unstable # Optional
|
|
||||||
#releaseNotesSource: 'file' # Optional. Options: file, input
|
|
||||||
#releaseNotesFile: # Optional
|
|
||||||
#releaseNotes: # Optional
|
|
||||||
assets: '$(Pipeline.Workspace)/drop/*.exe'
|
|
||||||
#assetUploadMode: 'delete' # Optional. Options: delete, replace
|
|
||||||
isDraft: true # Optional
|
|
||||||
isPreRelease: true # Optional
|
|
||||||
addChangeLog: true # Optional
|
|
||||||
#compareWith: 'lastFullRelease' # Required when addChangeLog == True. Options: lastFullRelease, lastRelease, lastReleaseByTag
|
|
||||||
#releaseTag: # Required when compareWith == LastReleaseByTag
|
|
149
build-and-deploy.ps1
Normal file
149
build-and-deploy.ps1
Normal file
|
@ -0,0 +1,149 @@
|
||||||
|
# USAGE
|
||||||
|
# * Enable script execution in Powershell: 'Set-ExecutionPolicy RemoteSigned'
|
||||||
|
# * Create a GitHub personal access token (PAT) for greenshot repository
|
||||||
|
# * user must be owner of the repository
|
||||||
|
# * token needs read and write permissions ""for Contents"" and ""Pages""
|
||||||
|
# * Execute the script and paste your token
|
||||||
|
|
||||||
|
# Prompt the user to securely input the Github token
|
||||||
|
$SecureToken = Read-Host "Please enter your GitHub personal access token" -AsSecureString
|
||||||
|
$ReleaseToken = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecureToken))
|
||||||
|
|
||||||
|
# Variables
|
||||||
|
$RepoPath = "." # Replace with your local repo path
|
||||||
|
$ArtifactsPath = "$RepoPath\artifacts"
|
||||||
|
$SolutionFile = "$RepoPath\src\Greenshot.sln"
|
||||||
|
|
||||||
|
# Step 0: Update Local Repository
|
||||||
|
git pull
|
||||||
|
|
||||||
|
# Step 1: Restore NuGet Packages
|
||||||
|
Write-Host "Restoring NuGet packages..."
|
||||||
|
msbuild "$SolutionFile" /p:Configuration=Release /restore /t:PrepareForBuild
|
||||||
|
if ($LASTEXITCODE -ne 0) {
|
||||||
|
Write-Error "Failed to restore NuGet packages."
|
||||||
|
exit $LASTEXITCODE
|
||||||
|
}
|
||||||
|
|
||||||
|
# Step 2: Build and Package
|
||||||
|
Write-Host "Building and packaging the solution..."
|
||||||
|
msbuild "$SolutionFile" /p:Configuration=Release /t:Rebuild /v:normal
|
||||||
|
if ($LASTEXITCODE -ne 0) {
|
||||||
|
Write-Error "Build failed."
|
||||||
|
exit $LASTEXITCODE
|
||||||
|
}
|
||||||
|
|
||||||
|
# Step 3: Copy Installer Files
|
||||||
|
Write-Host "Copying installer files..."
|
||||||
|
if (-not (Test-Path $ArtifactsPath)) {
|
||||||
|
New-Item -ItemType Directory -Force -Path $ArtifactsPath
|
||||||
|
}
|
||||||
|
Copy-Item "$RepoPath\installer\Greenshot-INSTALLER-*.exe" -Destination $ArtifactsPath -Force
|
||||||
|
if ($LASTEXITCODE -ne 0) {
|
||||||
|
Write-Error "Failed to copy installer files."
|
||||||
|
exit $LASTEXITCODE
|
||||||
|
}
|
||||||
|
|
||||||
|
# Step 4: Extract Version from File Name
|
||||||
|
Write-Host "Extracting version from installer file name..."
|
||||||
|
$InstallerFile = Get-ChildItem $ArtifactsPath -Filter "Greenshot-INSTALLER-*.exe" | Select-Object -Last 1
|
||||||
|
if (-not $InstallerFile) {
|
||||||
|
Write-Error "No matching installer file found in '$ArtifactsPath'."
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($InstallerFile.Name -match "Greenshot-INSTALLER-([\d\.]+).*\.exe") {
|
||||||
|
$Version = $matches[1]
|
||||||
|
Write-Host "Extracted version: $Version"
|
||||||
|
} else {
|
||||||
|
Write-Error "Version number could not be extracted from file name: $($InstallerFile.Name)"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Step 5: Create Git Tag
|
||||||
|
Write-Host "Creating Git tag..."
|
||||||
|
cd $RepoPath
|
||||||
|
#git config user.name "local-script"
|
||||||
|
#git config user.email "local-script@example.com"
|
||||||
|
git tag -a "v$Version" -m "v$Version"
|
||||||
|
git push origin "v$Version"
|
||||||
|
if ($LASTEXITCODE -ne 0) {
|
||||||
|
Write-Error "Failed to create Git tag."
|
||||||
|
exit $LASTEXITCODE
|
||||||
|
}
|
||||||
|
|
||||||
|
# Step 6: Create GitHub Release
|
||||||
|
Write-Host "Creating GitHub release..."
|
||||||
|
$Headers = @{
|
||||||
|
Authorization = "Bearer $ReleaseToken"
|
||||||
|
Accept = "application/vnd.github+json"
|
||||||
|
}
|
||||||
|
$ReleaseData = @{
|
||||||
|
tag_name = "v$Version"
|
||||||
|
name = "Greenshot $Version unstable"
|
||||||
|
body = "Pre-release of Greenshot $Version."
|
||||||
|
draft = $true
|
||||||
|
prerelease = $true
|
||||||
|
generate_release_notes = $true
|
||||||
|
}
|
||||||
|
$ReleaseResponse = Invoke-RestMethod `
|
||||||
|
-Uri "https://api.github.com/repos/greenshot/greenshot/releases" `
|
||||||
|
-Method POST `
|
||||||
|
-Headers $Headers `
|
||||||
|
-Body (ConvertTo-Json $ReleaseData -Depth 10)
|
||||||
|
|
||||||
|
if ($LASTEXITCODE -ne 0) {
|
||||||
|
Write-Error "Failed to create GitHub release."
|
||||||
|
exit $LASTEXITCODE
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Host "Release created successfully."
|
||||||
|
|
||||||
|
# Get the release ID from the response
|
||||||
|
$ReleaseId = $ReleaseResponse.id
|
||||||
|
Write-Host "Release ID: $ReleaseId"
|
||||||
|
|
||||||
|
# Step 7: Upload .exe File to Release
|
||||||
|
Write-Host "Uploading .exe file to GitHub release..."
|
||||||
|
$ExeFilePath = "$ArtifactsPath\$($InstallerFile.Name)"
|
||||||
|
if (-Not (Test-Path $ExeFilePath)) {
|
||||||
|
Write-Error "Built .exe file not found: $ExeFilePath"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# GitHub API for uploading release assets
|
||||||
|
$UploadUrl = $ReleaseResponse.upload_url -replace "{.*}", ""
|
||||||
|
|
||||||
|
# Upload the file
|
||||||
|
$FileHeaders = @{
|
||||||
|
Authorization = "Bearer $ReleaseToken"
|
||||||
|
ContentType = "application/octet-stream"
|
||||||
|
}
|
||||||
|
$FileName = [System.IO.Path]::GetFileName($ExeFilePath)
|
||||||
|
|
||||||
|
Invoke-RestMethod `
|
||||||
|
-Uri "$($UploadUrl)?name=$FileName" `
|
||||||
|
-Method POST `
|
||||||
|
-Headers $FileHeaders `
|
||||||
|
-InFile $ExeFilePath `
|
||||||
|
-ContentType "application/octet-stream"
|
||||||
|
|
||||||
|
if ($LASTEXITCODE -ne 0) {
|
||||||
|
Write-Error "Failed to upload .exe file to release."
|
||||||
|
exit $LASTEXITCODE
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Host "File uploaded successfully: $FileName"
|
||||||
|
|
||||||
|
# Step 7: Trigger GitHub Pages Rebuild
|
||||||
|
#Write-Host "Triggering GitHub Pages rebuild..."
|
||||||
|
#Invoke-RestMethod `
|
||||||
|
# -Uri "https://api.github.com/repos/greenshot/greenshot/pages/builds" `
|
||||||
|
# -Method POST `
|
||||||
|
# -Headers $Headers
|
||||||
|
#if ($LASTEXITCODE -ne 0) {
|
||||||
|
# Write-Error "Failed to trigger GitHub Pages rebuild."
|
||||||
|
# exit $LASTEXITCODE
|
||||||
|
#}
|
||||||
|
#
|
||||||
|
#Write-Host "GitHub Pages rebuild triggered successfully."
|
|
@ -7,7 +7,29 @@ CHANGE LOG:
|
||||||
|
|
||||||
All details to our tickets can be found here: https://greenshot.atlassian.net
|
All details to our tickets can be found here: https://greenshot.atlassian.net
|
||||||
|
|
||||||
# Release notes for Greenshot 1.3
|
# Greenshot 1.3.xxx
|
||||||
|
|
||||||
|
Bugs fixed:
|
||||||
|
* greenshot.ini: Exclude Plugins and Include Plugins setting broken [#648](https://github.com/greenshot/greenshot/issues/648) [#642](https://github.com/greenshot/greenshot/issues/642) thanks to @Christian-Schulz for providing the fix
|
||||||
|
|
||||||
|
Features added:
|
||||||
|
|
||||||
|
# Greenshot 1.3.296
|
||||||
|
|
||||||
|
Bugs fixed
|
||||||
|
* Fix Administrative installation via user interface [#546](https://github.com/greenshot/greenshot/issues/546) [#611](https://github.com/greenshot/greenshot/issues/611) [#598](https://github.com/greenshot/greenshot/issues/598)
|
||||||
|
|
||||||
|
Features added:
|
||||||
|
* Installer: Allow Choice between All-Users (Administrative) and Current-User Installation [#625](https://github.com/greenshot/greenshot/pull/625)
|
||||||
|
|
||||||
|
# Greenshot 1.3.292
|
||||||
|
|
||||||
|
Bugs fixed:
|
||||||
|
* Fix Administrative installation via command line using /ALLUSERS [#601](https://github.com/greenshot/greenshot/issues/601) [#619](https://github.com/greenshot/greenshot/issues/619)
|
||||||
|
|
||||||
|
# Greenshot 1.3.290
|
||||||
|
|
||||||
|
Note: the version information for the first 1.3 release is outdated/incomplete. Due to the long timespan and large amount of changes between 1.2 and 1.3 we lost track. Sorry.
|
||||||
|
|
||||||
Greenshot 1.3 is the first Greenshot which targets .NET 4.7.2 which just by doing to solves some general issues in the area of Internet Explorer capturing, TLS communication and some other minor issues.
|
Greenshot 1.3 is the first Greenshot which targets .NET 4.7.2 which just by doing to solves some general issues in the area of Internet Explorer capturing, TLS communication and some other minor issues.
|
||||||
|
|
||||||
|
@ -646,3 +668,5 @@ Features added:
|
||||||
* when clicking two overlapping elements, the one created later gets selected [ 1725175 ]
|
* when clicking two overlapping elements, the one created later gets selected [ 1725175 ]
|
||||||
* created textboxes can now be edited with a doubleclick [ 1704408 ]
|
* created textboxes can now be edited with a doubleclick [ 1704408 ]
|
||||||
* selected font is now stored in the application config file [ 1704411 ]
|
* selected font is now stored in the application config file [ 1704411 ]
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#define BinDir "bin\Release\net472"
|
#define BinDir "bin\Release\net472"
|
||||||
#define ReleaseDir "..\..\src\Greenshot\bin\Release\net472"
|
#define ReleaseDir "..\..\src\Greenshot\bin\Release\net472"
|
||||||
#define PluginDir "..\..\src\Greenshot\bin\Release\net472\Plugins"
|
#define PluginDir "..\..\src\Greenshot\bin\Release\net472\Plugins"
|
||||||
|
#define CertumThumbprint GetEnv('CertumThumbprint')
|
||||||
|
|
||||||
; Include the scripts to install .NET Framework
|
; Include the scripts to install .NET Framework
|
||||||
; See https://www.codeproject.com/KB/install/dotnetfx_innosetup_instal.aspx
|
; See https://www.codeproject.com/KB/install/dotnetfx_innosetup_instal.aspx
|
||||||
|
@ -126,21 +127,27 @@ AppVersion={#Version}
|
||||||
ArchitecturesInstallIn64BitMode=x64
|
ArchitecturesInstallIn64BitMode=x64
|
||||||
Compression=lzma2/ultra64
|
Compression=lzma2/ultra64
|
||||||
SolidCompression=yes
|
SolidCompression=yes
|
||||||
DefaultDirName={code:DefDirRoot}\{#ExeName}
|
DefaultDirName={autopf}\{#ExeName}
|
||||||
DefaultGroupName={#ExeName}
|
DefaultGroupName={#ExeName}
|
||||||
InfoBeforeFile=..\additional_files\readme.txt
|
InfoBeforeFile=..\additional_files\readme.txt
|
||||||
LicenseFile=..\additional_files\license.txt
|
LicenseFile=..\additional_files\license.txt
|
||||||
LanguageDetectionMethod=uilanguage
|
LanguageDetectionMethod=uilanguage
|
||||||
MinVersion=6.1sp1
|
MinVersion=6.1sp1
|
||||||
OutputBaseFilename={#ExeName}-INSTALLER-{#Version}-UNSTABLE
|
|
||||||
OutputDir=..\
|
OutputDir=..\
|
||||||
|
; user may choose between all-users vs. current-user installation in a dialog or by using the /ALLUSERS flag (on the command line)
|
||||||
|
; in registry section, HKA will take care of the appropriate root key (HKLM vs. HKCU), see https://jrsoftware.org/ishelp/index.php?topic=admininstallmode
|
||||||
|
PrivilegesRequiredOverridesAllowed=dialog
|
||||||
|
; admin privileges not required, unless user chooses all-users installation
|
||||||
|
; the installer will ask for elevation if needed
|
||||||
PrivilegesRequired=lowest
|
PrivilegesRequired=lowest
|
||||||
SetupIconFile=..\..\src\Greenshot\icons\applicationIcon\icon.ico
|
SetupIconFile=..\..\src\Greenshot\icons\applicationIcon\icon.ico
|
||||||
; Create a SHA1 signature
|
#if CertumThumbprint != ""
|
||||||
; SignTool=SignTool sign /debug /fd sha1 /tr https://time.certum.pl /td sha1 $f
|
OutputBaseFilename={#ExeName}-INSTALLER-{#Version}-UNSTABLE
|
||||||
; Append a SHA256 to the previous SHA1 signature (this is what as does)
|
SignTool=SignTool sign /sha1 "{#CertumThumbprint}" /tr http://time.certum.pl /td sha256 /fd sha256 /v $f
|
||||||
; SignTool=SignTool sign /debug /as /fd sha256 /tr https://time.certum.pl /td sha256 $f
|
SignedUninstaller=yes
|
||||||
; SignedUninstaller=yes
|
#else
|
||||||
|
OutputBaseFilename={#ExeName}-INSTALLER-{#Version}-UNSTABLE-UNSIGNED
|
||||||
|
#endif
|
||||||
UninstallDisplayIcon={app}\{#ExeName}.exe
|
UninstallDisplayIcon={app}\{#ExeName}.exe
|
||||||
Uninstallable=true
|
Uninstallable=true
|
||||||
VersionInfoCompany={#ExeName}
|
VersionInfoCompany={#ExeName}
|
||||||
|
@ -152,6 +159,7 @@ VersionInfoVersion={#Version}
|
||||||
WizardImageFile=installer-large.bmp
|
WizardImageFile=installer-large.bmp
|
||||||
; Reference a bitmap, max size 55x58
|
; Reference a bitmap, max size 55x58
|
||||||
WizardSmallImageFile=installer-small.bmp
|
WizardSmallImageFile=installer-small.bmp
|
||||||
|
|
||||||
[Registry]
|
[Registry]
|
||||||
; Delete all startup entries, so we don't have leftover values
|
; Delete all startup entries, so we don't have leftover values
|
||||||
Root: HKCU; Subkey: Software\Microsoft\Windows\CurrentVersion\Run; ValueType: none; ValueName: {#ExeName}; Flags: deletevalue noerror;
|
Root: HKCU; Subkey: Software\Microsoft\Windows\CurrentVersion\Run; ValueType: none; ValueName: {#ExeName}; Flags: deletevalue noerror;
|
||||||
|
@ -170,22 +178,16 @@ Root: HKLM; Subkey: Software\Classes\.greenshot; ValueType: none; ValueName: {#E
|
||||||
Root: HKLM; Subkey: Software\Classes\Greenshot; ValueType: none; ValueName: {#ExeName}; Flags: deletevalue noerror;
|
Root: HKLM; Subkey: Software\Classes\Greenshot; ValueType: none; ValueName: {#ExeName}; Flags: deletevalue noerror;
|
||||||
|
|
||||||
; Create the startup entries if requested to do so
|
; Create the startup entries if requested to do so
|
||||||
; HKEY_LOCAL_USER - for current user only
|
Root: HKA; Subkey: Software\Microsoft\Windows\CurrentVersion\Run; ValueType: string; ValueName: {#ExeName}; ValueData: """{app}\{#ExeName}.exe"""; Flags: uninsdeletevalue noerror; Tasks: startup
|
||||||
Root: HKCU; Subkey: Software\Microsoft\Windows\CurrentVersion\Run; ValueType: string; ValueName: {#ExeName}; ValueData: """{app}\{#ExeName}.exe"""; Permissions: users-modify; Flags: uninsdeletevalue noerror; Tasks: startup; Check: IsRegularUser
|
|
||||||
; HKEY_LOCAL_MACHINE - for all users when admin
|
|
||||||
Root: HKLM; Subkey: Software\Microsoft\Windows\CurrentVersion\Run; ValueType: string; ValueName: {#ExeName}; ValueData: """{app}\{#ExeName}.exe"""; Permissions: admins-modify; Flags: uninsdeletevalue noerror; Tasks: startup; Check: not IsRegularUser
|
|
||||||
|
|
||||||
; Register our own filetype for all users
|
; Register our own filetype for all users
|
||||||
; HKEY_LOCAL_USER - for current user only
|
Root: HKA; Subkey: Software\Classes\.greenshot; ValueType: string; ValueName: ""; ValueData: "Greenshot"; Flags: uninsdeletevalue noerror
|
||||||
Root: HKCU; Subkey: Software\Classes\.greenshot; ValueType: string; ValueName: ""; ValueData: "Greenshot"; Permissions: users-modify; Flags: uninsdeletevalue noerror; Check: IsRegularUser
|
Root: HKA; Subkey: Software\Classes\Greenshot; ValueType: string; ValueName: ""; ValueData: "Greenshot File"; Flags: uninsdeletevalue noerror
|
||||||
Root: HKCU; Subkey: Software\Classes\Greenshot; ValueType: string; ValueName: ""; ValueData: "Greenshot File"; Permissions: users-modify; Flags: uninsdeletevalue noerror; Check: IsRegularUser
|
Root: HKA; Subkey: Software\Classes\Greenshot\DefaultIcon; ValueType: string; ValueName: ""; ValueData: """{app}\Greenshot.EXE,0"""; Flags: uninsdeletevalue noerror
|
||||||
Root: HKCU; Subkey: Software\Classes\Greenshot\DefaultIcon; ValueType: string; ValueName: ""; ValueData: """{app}\Greenshot.EXE,0"""; Permissions: users-modify; Flags: uninsdeletevalue noerror; Check: IsRegularUser
|
Root: HKA; Subkey: Software\Classes\Greenshot\shell\open\command; ValueType: string; ValueName: ""; ValueData: """{app}\Greenshot.EXE"" --openfile ""%1"""; Flags: uninsdeletevalue noerror
|
||||||
Root: HKCU; Subkey: Software\Classes\Greenshot\shell\open\command; ValueType: string; ValueName: ""; ValueData: """{app}\Greenshot.EXE"" --openfile ""%1"""; Permissions: users-modify; Flags: uninsdeletevalue noerror; Check: IsRegularUser
|
|
||||||
; HKEY_LOCAL_MACHINE - for all users when admin
|
; Disable the default PRTSCR Snipping Tool in Windows 11
|
||||||
Root: HKLM; Subkey: Software\Classes\.greenshot; ValueType: string; ValueName: ""; ValueData: "Greenshot"; Permissions: admins-modify; Flags: uninsdeletevalue noerror; Check: not IsRegularUser
|
Root: HKCU; Subkey: Control Panel\Keyboard; ValueType: dword; ValueName: "PrintScreenKeyForSnippingEnabled"; ValueData: "0"; Flags: uninsdeletevalue; Check: ShouldDisableSnippingTool
|
||||||
Root: HKLM; Subkey: Software\Classes\Greenshot; ValueType: string; ValueName: ""; ValueData: "Greenshot File"; Permissions: admins-modify; Flags: uninsdeletevalue noerror; Check: not IsRegularUser
|
|
||||||
Root: HKLM; Subkey: Software\Classes\Greenshot\DefaultIcon; ValueType: string; ValueName: ""; ValueData: """{app}\Greenshot.EXE,0"""; Permissions: admins-modify; Flags: uninsdeletevalue noerror; Check: not IsRegularUser
|
|
||||||
Root: HKLM; Subkey: Software\Classes\Greenshot\shell\open\command; ValueType: string; ValueName: ""; ValueData: """{app}\Greenshot.EXE"" --openfile ""%1"""; Permissions: admins-modify; Flags: uninsdeletevalue noerror; Check: not IsRegularUser
|
|
||||||
|
|
||||||
[Icons]
|
[Icons]
|
||||||
Name: {group}\{#ExeName}; Filename: {app}\{#ExeName}.exe; WorkingDir: {app}; AppUserModelID: "{#ExeName}"
|
Name: {group}\{#ExeName}; Filename: {app}\{#ExeName}.exe; WorkingDir: {app}; AppUserModelID: "{#ExeName}"
|
||||||
|
@ -269,6 +271,7 @@ en.win10=Windows 10 plug-in
|
||||||
en.UninstallIconDescription=Uninstall
|
en.UninstallIconDescription=Uninstall
|
||||||
en.ShowLicense=Show license
|
en.ShowLicense=Show license
|
||||||
en.ShowReadme=Show Readme
|
en.ShowReadme=Show Readme
|
||||||
|
en.disablewin11snippingtool=Disable Win11 default PrtScr snipping tool
|
||||||
|
|
||||||
de.confluence=Confluence Plug-in
|
de.confluence=Confluence Plug-in
|
||||||
de.default=Standard installation
|
de.default=Standard installation
|
||||||
|
@ -281,6 +284,7 @@ de.optimize=Optimierung der Leistung, kann etwas dauern.
|
||||||
de.startgreenshot={#ExeName} starten
|
de.startgreenshot={#ExeName} starten
|
||||||
de.startup={#ExeName} starten wenn Windows hochfährt
|
de.startup={#ExeName} starten wenn Windows hochfährt
|
||||||
de.win10=Windows 10 Plug-in
|
de.win10=Windows 10 Plug-in
|
||||||
|
de.disablewin11snippingtool=Deaktiviere das Standard Windows 11 Snipping Tool auf "Druck"
|
||||||
|
|
||||||
es.confluence=Extensión para Confluence
|
es.confluence=Extensión para Confluence
|
||||||
es.default=${default}
|
es.default=${default}
|
||||||
|
@ -482,6 +486,7 @@ Name: "compact"; Description: "{code:CompactInstall}"
|
||||||
Name: "custom"; Description: "{code:CustomInstall}"; Flags: iscustom
|
Name: "custom"; Description: "{code:CustomInstall}"; Flags: iscustom
|
||||||
|
|
||||||
[Components]
|
[Components]
|
||||||
|
Name: "disablesnippingtool"; Description: {cm:disablewin11snippingtool}; Flags: disablenouninstallwarning; Types: default full custom; Check: IsWindows11OrNewer()
|
||||||
Name: "greenshot"; Description: "Greenshot"; Types: default full compact custom; Flags: fixed
|
Name: "greenshot"; Description: "Greenshot"; Types: default full compact custom; Flags: fixed
|
||||||
;Name: "plugins\networkimport"; Description: "Network Import Plugin"; Types: full
|
;Name: "plugins\networkimport"; Description: "Network Import Plugin"; Types: full
|
||||||
Name: "plugins\box"; Description: {cm:box}; Types: full custom; Flags: disablenouninstallwarning
|
Name: "plugins\box"; Description: {cm:box}; Types: full custom; Flags: disablenouninstallwarning
|
||||||
|
@ -531,23 +536,8 @@ Name: "languages\ukUA"; Description: {cm:ukUA}; Types: full custom; Flags: disab
|
||||||
Name: "languages\viVN"; Description: {cm:viVN}; Types: full custom; Flags: disablenouninstallwarning; Check: hasLanguageGroup('e')
|
Name: "languages\viVN"; Description: {cm:viVN}; Types: full custom; Flags: disablenouninstallwarning; Check: hasLanguageGroup('e')
|
||||||
Name: "languages\zhCN"; Description: {cm:zhCN}; Types: full custom; Flags: disablenouninstallwarning; Check: hasLanguageGroup('a')
|
Name: "languages\zhCN"; Description: {cm:zhCN}; Types: full custom; Flags: disablenouninstallwarning; Check: hasLanguageGroup('a')
|
||||||
Name: "languages\zhTW"; Description: {cm:zhTW}; Types: full custom; Flags: disablenouninstallwarning; Check: hasLanguageGroup('9')
|
Name: "languages\zhTW"; Description: {cm:zhTW}; Types: full custom; Flags: disablenouninstallwarning; Check: hasLanguageGroup('9')
|
||||||
|
|
||||||
[Code]
|
[Code]
|
||||||
// Do we have a regular user trying to install this?
|
|
||||||
function IsRegularUser(): Boolean;
|
|
||||||
begin
|
|
||||||
Result := not (IsAdmin or IsAdminInstallMode);
|
|
||||||
end;
|
|
||||||
|
|
||||||
// The following code is used to select the installation path, this is localappdata if non poweruser
|
|
||||||
function DefDirRoot(Param: String): String;
|
|
||||||
begin
|
|
||||||
if IsRegularUser then
|
|
||||||
Result := ExpandConstant('{localappdata}')
|
|
||||||
else
|
|
||||||
Result := ExpandConstant('{pf}')
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
function FullInstall(Param : String) : String;
|
function FullInstall(Param : String) : String;
|
||||||
begin
|
begin
|
||||||
result := SetupMessage(msgFullInstallation);
|
result := SetupMessage(msgFullInstallation);
|
||||||
|
@ -745,6 +735,19 @@ begin
|
||||||
Result := IsWindowsVersionOrNewer(10, 0);
|
Result := IsWindowsVersionOrNewer(10, 0);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function IsWindows11OrNewer: Boolean;
|
||||||
|
var
|
||||||
|
WindowsVersion: TWindowsVersion;
|
||||||
|
begin
|
||||||
|
GetWindowsVersionEx(WindowsVersion);
|
||||||
|
Result := (WindowsVersion.Major >= 10) and (WindowsVersion.Build >= 22000);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function ShouldDisableSnippingTool: Boolean;
|
||||||
|
begin
|
||||||
|
Result := IsComponentSelected('disablesnippingtool');
|
||||||
|
end;
|
||||||
|
|
||||||
[Run]
|
[Run]
|
||||||
Filename: "{app}\{#ExeName}.exe"; Description: "{cm:startgreenshot}"; Parameters: "{code:GetParamsForGS}"; WorkingDir: "{app}"; Flags: nowait postinstall runasoriginaluser
|
Filename: "{app}\{#ExeName}.exe"; Description: "{cm:startgreenshot}"; Parameters: "{code:GetParamsForGS}"; WorkingDir: "{app}"; Flags: nowait postinstall runasoriginaluser
|
||||||
Filename: "https://getgreenshot.org/thank-you/?language={language}&version={#Version}"; Flags: shellexec runasoriginaluser
|
Filename: "https://getgreenshot.org/thank-you/?language={language}&version={#Version}"; Flags: shellexec runasoriginaluser
|
||||||
|
|
6
nuget.config
Normal file
6
nuget.config
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<configuration>
|
||||||
|
<packageSources>
|
||||||
|
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
|
||||||
|
</packageSources>
|
||||||
|
</configuration>
|
|
@ -1,13 +1,65 @@
|
||||||
<Project>
|
<Project>
|
||||||
|
<UsingTask TaskName="ApplyTokenReplacements" TaskFactory="CodeTaskFactory" AssemblyName="Microsoft.Build.Tasks.Core">
|
||||||
|
<ParameterGroup>
|
||||||
|
<InputLines ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" />
|
||||||
|
<Tokens ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" />
|
||||||
|
<OutputLines ParameterType="Microsoft.Build.Framework.ITaskItem[]" Output="true" />
|
||||||
|
</ParameterGroup>
|
||||||
|
<Task>
|
||||||
|
<Reference Include="System.Text.RegularExpressions" />
|
||||||
|
<Code Type="Fragment" Language="cs">
|
||||||
|
<![CDATA[
|
||||||
|
var output = new List<ITaskItem>();
|
||||||
|
foreach (var line in InputLines)
|
||||||
|
{
|
||||||
|
string text = line.ItemSpec;
|
||||||
|
foreach (var token in Tokens)
|
||||||
|
{
|
||||||
|
string tokenName = token.ItemSpec;
|
||||||
|
// Skip if tokenName is null or empty
|
||||||
|
if (string.IsNullOrEmpty(tokenName))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
string replacementValue = token.GetMetadata("ReplacementValue");
|
||||||
|
if (!string.IsNullOrEmpty(replacementValue))
|
||||||
|
{
|
||||||
|
string placeholder = "$"+ "{"+tokenName+"}"; // Token-Format wie $(Box13_ClientId)
|
||||||
|
text = text.Replace(placeholder, replacementValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
output.Add(new Microsoft.Build.Utilities.TaskItem(text));
|
||||||
|
}
|
||||||
|
OutputLines = output.ToArray();
|
||||||
|
]]>
|
||||||
|
</Code>
|
||||||
|
</Task>
|
||||||
|
</UsingTask>
|
||||||
|
|
||||||
<PropertyGroup Condition="Exists('$(ProjectDir)$(ProjectName).Credentials.template')">
|
<PropertyGroup Condition="Exists('$(ProjectDir)$(ProjectName).Credentials.template')">
|
||||||
<MSBuildCommunityTasksPath>$(PkgMSBuildTasks)\tools\</MSBuildCommunityTasksPath>
|
<MSBuildCommunityTasksPath>$(NuGetPackageRoot)msbuildtasks/1.5.0.235/tools/</MSBuildCommunityTasksPath>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<Import Project="$(MSBuildCommunityTasksPath)MSBuild.Community.Tasks.Targets" Condition="Exists('$(ProjectDir)$(ProjectName).Credentials.template')"/>
|
<Import Project="$(MSBuildCommunityTasksPath)MSBuild.Community.Tasks.Targets" Condition="Exists('$(ProjectDir)$(ProjectName).Credentials.template')" />
|
||||||
|
|
||||||
<Target Name="ProcessTemplates" BeforeTargets="PrepareForBuild" Condition="Exists('$(ProjectDir)$(ProjectName).Credentials.template')">
|
<Target Name="ProcessTemplates" BeforeTargets="PrepareForBuild" Condition="Exists('$(ProjectDir)$(ProjectName).Credentials.template')">
|
||||||
<Message Text="Processing: $(ProjectDir)$(ProjectName).Credentials.template" Importance="high"/>
|
<Message Text="Processing: $(ProjectDir)$(ProjectName).Credentials.template" Importance="high"/>
|
||||||
<TemplateFile Template="$(ProjectDir)$(ProjectName).Credentials.template" OutputFilename="$(ProjectDir)$(ProjectName).Credentials.cs" Tokens="@(Tokens)" />
|
|
||||||
|
|
||||||
|
<ReadLinesFromFile File="$(ProjectDir)$(ProjectName).Credentials.template">
|
||||||
|
<Output TaskParameter="Lines" ItemName="TemplateLines" />
|
||||||
|
</ReadLinesFromFile>
|
||||||
|
|
||||||
|
<ApplyTokenReplacements InputLines="@(TemplateLines)" Tokens="@(Tokens)">
|
||||||
|
<Output TaskParameter="OutputLines" ItemName="ProcessedLines" />
|
||||||
|
</ApplyTokenReplacements>
|
||||||
|
|
||||||
|
<WriteLinesToFile
|
||||||
|
File="$(ProjectDir)$(ProjectName).Credentials.cs"
|
||||||
|
Lines="@(ProcessedLines)"
|
||||||
|
Overwrite="true" />
|
||||||
</Target>
|
</Target>
|
||||||
</Project>
|
</Project>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,10 @@
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
|
||||||
|
<DebugType>none</DebugType>
|
||||||
|
<DebugSymbols>false</DebugSymbols>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Dapplo.HttpExtensions.JsonNet" Version="1.1.2" />
|
<PackageReference Include="Dapplo.HttpExtensions.JsonNet" Version="1.1.2" />
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
/*
|
||||||
|
* Greenshot - a free and open source screenshot tool
|
||||||
|
* Copyright (C) 2007-2025 Thomas Braun, Jens Klingen, Robin Krom
|
||||||
|
*
|
||||||
|
* For more information see: https://getgreenshot.org/
|
||||||
|
* The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 1 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Greenshot.Base.Interfaces.Plugin
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Attribute to specify a custom plugin identifier at assembly level
|
||||||
|
/// </summary>
|
||||||
|
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = false)]
|
||||||
|
public class AssemblyPluginIdentifierAttribute : Attribute
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The identifier used for the plugin in configuration
|
||||||
|
/// </summary>
|
||||||
|
public string Identifier { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor for the plugin identifier attribute
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="identifier">The identifier for the plugin in configuration</param>
|
||||||
|
public AssemblyPluginIdentifierAttribute(string identifier)
|
||||||
|
{
|
||||||
|
Identifier = identifier;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -43,10 +43,12 @@ namespace Greenshot.Editor.Drawing
|
||||||
0.5f, 0.25f, 0.75f
|
0.5f, 0.25f, 0.75f
|
||||||
};
|
};
|
||||||
|
|
||||||
[NonSerialized] private GraphicsPath freehandPath = new GraphicsPath();
|
[NonSerialized]
|
||||||
private NativeRect myBounds = NativeRect.Empty;
|
private GraphicsPath freehandPath = new GraphicsPath();
|
||||||
private NativePoint lastMouse = NativePoint.Empty;
|
|
||||||
private readonly List<Point> capturePoints = new List<Point>();
|
private Rectangle myBounds = NativeRect.Empty;
|
||||||
|
private Point lastMouse = NativePoint.Empty;
|
||||||
|
private List<Point> capturePoints = new List<Point>();
|
||||||
private bool isRecalculated;
|
private bool isRecalculated;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -39,10 +39,10 @@ namespace Greenshot.Editor.Drawing
|
||||||
[Serializable]
|
[Serializable]
|
||||||
public class SpeechbubbleContainer : TextContainer
|
public class SpeechbubbleContainer : TextContainer
|
||||||
{
|
{
|
||||||
private NativePoint _initialGripperPoint;
|
private Point _initialGripperPoint;
|
||||||
|
|
||||||
// Only used for serializing the TargetGripper location
|
// Only used for serializing the TargetGripper location
|
||||||
private NativePoint _storedTargetGripperLocation;
|
private Point _storedTargetGripperLocation;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Store the current location of the target gripper
|
/// Store the current location of the target gripper
|
||||||
|
@ -120,7 +120,8 @@ namespace Greenshot.Editor.Drawing
|
||||||
int xOffset = leftAligned ? -20 : 20;
|
int xOffset = leftAligned ? -20 : 20;
|
||||||
int yOffset = topAligned ? -20 : 20;
|
int yOffset = topAligned ? -20 : 20;
|
||||||
|
|
||||||
NativePoint newGripperLocation = _initialGripperPoint.Offset(xOffset, yOffset);
|
NativePoint initialGripperPoint = _initialGripperPoint;
|
||||||
|
NativePoint newGripperLocation = initialGripperPoint.Offset(xOffset, yOffset);
|
||||||
|
|
||||||
if (TargetAdorner.Location != newGripperLocation)
|
if (TargetAdorner.Location != newGripperLocation)
|
||||||
{
|
{
|
||||||
|
|
|
@ -24,6 +24,7 @@ using System.Drawing;
|
||||||
using System.Drawing.Drawing2D;
|
using System.Drawing.Drawing2D;
|
||||||
using System.Drawing.Text;
|
using System.Drawing.Text;
|
||||||
using System.Runtime.Serialization;
|
using System.Runtime.Serialization;
|
||||||
|
using System.Windows.Forms;
|
||||||
using Dapplo.Windows.Common.Extensions;
|
using Dapplo.Windows.Common.Extensions;
|
||||||
using Dapplo.Windows.Common.Structs;
|
using Dapplo.Windows.Common.Structs;
|
||||||
using Greenshot.Base.Interfaces;
|
using Greenshot.Base.Interfaces;
|
||||||
|
@ -187,6 +188,8 @@ namespace Greenshot.Editor.Drawing
|
||||||
/// <param name="rm"></param>
|
/// <param name="rm"></param>
|
||||||
public override void Draw(Graphics graphics, RenderMode rm)
|
public override void Draw(Graphics graphics, RenderMode rm)
|
||||||
{
|
{
|
||||||
|
if (Width == 0 || Height == 0) { return; }
|
||||||
|
|
||||||
graphics.SmoothingMode = SmoothingMode.HighQuality;
|
graphics.SmoothingMode = SmoothingMode.HighQuality;
|
||||||
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
|
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
|
||||||
graphics.CompositingQuality = CompositingQuality.HighQuality;
|
graphics.CompositingQuality = CompositingQuality.HighQuality;
|
||||||
|
@ -205,9 +208,17 @@ namespace Greenshot.Editor.Drawing
|
||||||
EllipseContainer.DrawEllipse(rect, graphics, rm, 0, Color.Transparent, fillColor, false);
|
EllipseContainer.DrawEllipse(rect, graphics, rm, 0, Color.Transparent, fillColor, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
float fontSize = Math.Min(Math.Abs(Width), Math.Abs(Height)) / 1.4f;
|
using FontFamily fam = new(FontFamily.GenericSansSerif.Name);
|
||||||
using FontFamily fam = new FontFamily(FontFamily.GenericSansSerif.Name);
|
|
||||||
using Font font = new Font(fam, fontSize, FontStyle.Bold, GraphicsUnit.Pixel);
|
//calculate new font size based on ratio from text height and text width
|
||||||
|
float initialFontSize = Math.Min(Math.Abs(Width), Math.Abs(Height));
|
||||||
|
using Font Measurefont = new(fam, initialFontSize, FontStyle.Bold, GraphicsUnit.Pixel);
|
||||||
|
var fontSize = initialFontSize * TextRenderer.MeasureText(text, Measurefont).Height / TextRenderer.MeasureText(text, Measurefont).Width;
|
||||||
|
|
||||||
|
//static scale for optimal fit
|
||||||
|
fontSize *= 0.7f;
|
||||||
|
|
||||||
|
using Font font = new(fam, fontSize, FontStyle.Bold, GraphicsUnit.Pixel);
|
||||||
TextContainer.DrawText(graphics, rect, 0, lineColor, false, _stringFormat, text, font);
|
TextContainer.DrawText(graphics, rect, 0, lineColor, false, _stringFormat, text, font);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,7 @@ using System.Drawing.Imaging;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Runtime.Serialization.Formatters.Binary;
|
using System.Runtime.Serialization.Formatters.Binary;
|
||||||
|
using System.ServiceModel.Security;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using Dapplo.Windows.Common.Extensions;
|
using Dapplo.Windows.Common.Extensions;
|
||||||
using Dapplo.Windows.Common.Structs;
|
using Dapplo.Windows.Common.Structs;
|
||||||
|
@ -40,6 +41,7 @@ using Greenshot.Base.Interfaces.Drawing;
|
||||||
using Greenshot.Base.Interfaces.Drawing.Adorners;
|
using Greenshot.Base.Interfaces.Drawing.Adorners;
|
||||||
using Greenshot.Editor.Configuration;
|
using Greenshot.Editor.Configuration;
|
||||||
using Greenshot.Editor.Drawing.Fields;
|
using Greenshot.Editor.Drawing.Fields;
|
||||||
|
using Greenshot.Editor.Helpers;
|
||||||
using Greenshot.Editor.Memento;
|
using Greenshot.Editor.Memento;
|
||||||
using log4net;
|
using log4net;
|
||||||
|
|
||||||
|
@ -722,6 +724,7 @@ namespace Greenshot.Editor.Drawing
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
BinaryFormatter binaryRead = new BinaryFormatter();
|
BinaryFormatter binaryRead = new BinaryFormatter();
|
||||||
|
binaryRead.Binder = new BinaryFormatterHelper();
|
||||||
IDrawableContainerList loadedElements = (IDrawableContainerList) binaryRead.Deserialize(streamRead);
|
IDrawableContainerList loadedElements = (IDrawableContainerList) binaryRead.Deserialize(streamRead);
|
||||||
loadedElements.Parent = this;
|
loadedElements.Parent = this;
|
||||||
// Make sure the steplabels are sorted according to their number
|
// Make sure the steplabels are sorted according to their number
|
||||||
|
@ -731,6 +734,10 @@ namespace Greenshot.Editor.Drawing
|
||||||
SelectElements(loadedElements);
|
SelectElements(loadedElements);
|
||||||
FieldAggregator.BindElements(loadedElements);
|
FieldAggregator.BindElements(loadedElements);
|
||||||
}
|
}
|
||||||
|
catch (SecurityAccessDeniedException)
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
LOG.Error("Error serializing elements from stream.", e);
|
LOG.Error("Error serializing elements from stream.", e);
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
|
using System.IO;
|
||||||
using Dapplo.Windows.Common.Structs;
|
using Dapplo.Windows.Common.Structs;
|
||||||
using Greenshot.Base.Core;
|
using Greenshot.Base.Core;
|
||||||
using Greenshot.Base.Interfaces;
|
using Greenshot.Base.Interfaces;
|
||||||
|
@ -34,12 +35,30 @@ namespace Greenshot.Editor.Drawing
|
||||||
[Serializable]
|
[Serializable]
|
||||||
public class SvgContainer : VectorGraphicsContainer
|
public class SvgContainer : VectorGraphicsContainer
|
||||||
{
|
{
|
||||||
private readonly SvgDocument _svgDocument;
|
private MemoryStream _svgContent;
|
||||||
|
|
||||||
public SvgContainer(SvgDocument svgDocument, ISurface parent) : base(parent)
|
[NonSerialized]
|
||||||
|
private SvgDocument _svgDocument;
|
||||||
|
|
||||||
|
public SvgContainer(Stream stream, ISurface parent) : base(parent)
|
||||||
{
|
{
|
||||||
_svgDocument = svgDocument;
|
_svgContent = new MemoryStream();
|
||||||
Size = new Size((int)svgDocument.Width, (int)svgDocument.Height);
|
stream.CopyTo(_svgContent);
|
||||||
|
Init();
|
||||||
|
Size = new Size((int)_svgDocument.Width, (int)_svgDocument.Height);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void Init()
|
||||||
|
{
|
||||||
|
base.Init();
|
||||||
|
// Do nothing when there is no content
|
||||||
|
if (_svgContent == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_svgContent.Position = 0;
|
||||||
|
|
||||||
|
_svgDocument = SvgDocument.Open<SvgDocument>(_svgContent);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override Image ComputeBitmap()
|
protected override Image ComputeBitmap()
|
||||||
|
|
|
@ -47,7 +47,8 @@ namespace Greenshot.Editor.Drawing
|
||||||
/// This is the cached version of the bitmap, pre-rendered to save performance
|
/// This is the cached version of the bitmap, pre-rendered to save performance
|
||||||
/// Do not serialized, it can be rebuild with other information.
|
/// Do not serialized, it can be rebuild with other information.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[NonSerialized] private Image _cachedImage;
|
[NonSerialized]
|
||||||
|
private Image _cachedImage;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Constructor takes care of calling Init
|
/// Constructor takes care of calling Init
|
||||||
|
|
|
@ -71,18 +71,18 @@ namespace Greenshot.Editor.FileFormatHandlers
|
||||||
|
|
||||||
public override IEnumerable<IDrawableContainer> LoadDrawablesFromStream(Stream stream, string extension, ISurface parent = null)
|
public override IEnumerable<IDrawableContainer> LoadDrawablesFromStream(Stream stream, string extension, ISurface parent = null)
|
||||||
{
|
{
|
||||||
SvgDocument svgDocument = null;
|
SvgContainer svgContainer = null;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
svgDocument = SvgDocument.Open<SvgDocument>(stream);
|
svgContainer = new SvgContainer(stream, parent);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Log.Error("Can't load SVG", ex);
|
Log.Error("Can't load SVG", ex);
|
||||||
}
|
}
|
||||||
if (svgDocument != null)
|
if (svgContainer != null)
|
||||||
{
|
{
|
||||||
yield return new SvgContainer(svgDocument, parent);
|
yield return svgContainer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1023,6 +1023,9 @@ namespace Greenshot.Editor.Forms
|
||||||
case Keys.C:
|
case Keys.C:
|
||||||
BtnCropClick(sender, e);
|
BtnCropClick(sender, e);
|
||||||
break;
|
break;
|
||||||
|
case Keys.Z:
|
||||||
|
BtnResizeClick(sender, e);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (e.Modifiers.Equals(Keys.Control))
|
else if (e.Modifiers.Equals(Keys.Control))
|
||||||
|
|
|
@ -2,6 +2,10 @@
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
|
||||||
|
<DebugType>none</DebugType>
|
||||||
|
<DebugSymbols>false</DebugSymbols>
|
||||||
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="Languages\language*.xml">
|
<None Include="Languages\language*.xml">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
|
124
src/Greenshot.Editor/Helpers/BinaryFormatterHelper.cs
Normal file
124
src/Greenshot.Editor/Helpers/BinaryFormatterHelper.cs
Normal file
|
@ -0,0 +1,124 @@
|
||||||
|
/*
|
||||||
|
* Greenshot - a free and open source screenshot tool
|
||||||
|
* Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom
|
||||||
|
*
|
||||||
|
* For more information see: https://getgreenshot.org/
|
||||||
|
* The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 1 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Runtime.Serialization;
|
||||||
|
using System.ServiceModel.Security;
|
||||||
|
using Greenshot.Base.Interfaces.Drawing;
|
||||||
|
using Greenshot.Editor.Drawing;
|
||||||
|
using Greenshot.Editor.Drawing.Fields;
|
||||||
|
using Greenshot.Editor.Drawing.Filters;
|
||||||
|
using log4net;
|
||||||
|
using static Greenshot.Editor.Drawing.FilterContainer;
|
||||||
|
|
||||||
|
namespace Greenshot.Editor.Helpers
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// This helps to map the serialization of the old .greenshot file to the newer.
|
||||||
|
/// It also prevents misuse.
|
||||||
|
/// </summary>
|
||||||
|
internal class BinaryFormatterHelper : SerializationBinder
|
||||||
|
{
|
||||||
|
private static readonly ILog LOG = LogManager.GetLogger(typeof(BinaryFormatterHelper));
|
||||||
|
private static readonly IDictionary<string, Type> TypeMapper = new Dictionary<string, Type>
|
||||||
|
{
|
||||||
|
{"System.Guid",typeof(Guid) },
|
||||||
|
{"System.Drawing.Rectangle",typeof(System.Drawing.Rectangle) },
|
||||||
|
{"System.Drawing.Point",typeof(System.Drawing.Point) },
|
||||||
|
{"System.Drawing.Color",typeof(System.Drawing.Color) },
|
||||||
|
{"System.Drawing.Bitmap",typeof(System.Drawing.Bitmap) },
|
||||||
|
{"System.Drawing.Icon",typeof(System.Drawing.Icon) },
|
||||||
|
{"System.Drawing.Size",typeof(System.Drawing.Size) },
|
||||||
|
{"System.IO.MemoryStream",typeof(System.IO.MemoryStream) },
|
||||||
|
{"System.Drawing.StringAlignment",typeof(System.Drawing.StringAlignment) },
|
||||||
|
{"System.Collections.Generic.List`1[[Greenshot.Base.Interfaces.Drawing.IFieldHolder", typeof(List<IFieldHolder>)},
|
||||||
|
{"System.Collections.Generic.List`1[[Greenshot.Base.Interfaces.Drawing.IField", typeof(List<IField>)},
|
||||||
|
{"System.Collections.Generic.List`1[[System.Drawing.Point", typeof(List<System.Drawing.Point>)},
|
||||||
|
{"Greenshot.Editor.Drawing.ArrowContainer", typeof(ArrowContainer) },
|
||||||
|
{"Greenshot.Editor.Drawing.ArrowContainer+ArrowHeadCombination", typeof(ArrowContainer.ArrowHeadCombination) },
|
||||||
|
{"Greenshot.Editor.Drawing.LineContainer", typeof(LineContainer) },
|
||||||
|
{"Greenshot.Editor.Drawing.TextContainer", typeof(TextContainer) },
|
||||||
|
{"Greenshot.Editor.Drawing.SpeechbubbleContainer", typeof(SpeechbubbleContainer) },
|
||||||
|
{"Greenshot.Editor.Drawing.RectangleContainer", typeof(RectangleContainer) },
|
||||||
|
{"Greenshot.Editor.Drawing.EllipseContainer", typeof(EllipseContainer) },
|
||||||
|
{"Greenshot.Editor.Drawing.FreehandContainer", typeof(FreehandContainer) },
|
||||||
|
{"Greenshot.Editor.Drawing.HighlightContainer", typeof(HighlightContainer) },
|
||||||
|
{"Greenshot.Editor.Drawing.IconContainer", typeof(IconContainer) },
|
||||||
|
{"Greenshot.Editor.Drawing.ObfuscateContainer", typeof(ObfuscateContainer) },
|
||||||
|
{"Greenshot.Editor.Drawing.StepLabelContainer", typeof(StepLabelContainer) },
|
||||||
|
{"Greenshot.Editor.Drawing.SvgContainer", typeof(SvgContainer) },
|
||||||
|
{"Greenshot.Editor.Drawing.VectorGraphicsContainer", typeof(VectorGraphicsContainer) },
|
||||||
|
{"Greenshot.Editor.Drawing.MetafileContainer", typeof(MetafileContainer) },
|
||||||
|
{"Greenshot.Editor.Drawing.ImageContainer", typeof(ImageContainer) },
|
||||||
|
{"Greenshot.Editor.Drawing.FilterContainer", typeof(FilterContainer) },
|
||||||
|
{"Greenshot.Editor.Drawing.DrawableContainer", typeof(DrawableContainer) },
|
||||||
|
{"Greenshot.Editor.Drawing.DrawableContainerList", typeof(DrawableContainerList) },
|
||||||
|
{"Greenshot.Editor.Drawing.CursorContainer", typeof(CursorContainer) },
|
||||||
|
{"Greenshot.Editor.Drawing.Filters.HighlightFilter", typeof(HighlightFilter) },
|
||||||
|
{"Greenshot.Editor.Drawing.Filters.GrayscaleFilter", typeof(GrayscaleFilter) },
|
||||||
|
{"Greenshot.Editor.Drawing.Filters.MagnifierFilter", typeof(MagnifierFilter) },
|
||||||
|
{"Greenshot.Editor.Drawing.Filters.BrightnessFilter", typeof(BrightnessFilter) },
|
||||||
|
{"Greenshot.Editor.Drawing.Filters.BlurFilter", typeof(BlurFilter) },
|
||||||
|
{"Greenshot.Editor.Drawing.Filters.PixelizationFilter", typeof(PixelizationFilter) },
|
||||||
|
{"Greenshot.Base.Interfaces.Drawing.IDrawableContainer", typeof(IDrawableContainer) },
|
||||||
|
{"Greenshot.Base.Interfaces.Drawing.EditStatus", typeof(EditStatus) },
|
||||||
|
{"Greenshot.Base.Interfaces.Drawing.IFieldHolder", typeof(IFieldHolder) },
|
||||||
|
{"Greenshot.Base.Interfaces.Drawing.IField", typeof(IField) },
|
||||||
|
{"Greenshot.Base.Interfaces.Drawing.FieldFlag", typeof(FieldFlag) },
|
||||||
|
{"Greenshot.Editor.Drawing.Fields.Field", typeof(Field) },
|
||||||
|
{"Greenshot.Editor.Drawing.Fields.FieldType", typeof(FieldType) },
|
||||||
|
{"Greenshot.Editor.Drawing.FilterContainer+PreparedFilter", typeof(PreparedFilter) },
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Do the type mapping
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="assemblyName">Assembly for the type that was serialized</param>
|
||||||
|
/// <param name="typeName">Type that was serialized</param>
|
||||||
|
/// <returns>Type which was mapped</returns>
|
||||||
|
/// <exception cref="SecurityAccessDeniedException">If something smells fishy</exception>
|
||||||
|
public override Type BindToType(string assemblyName, string typeName)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(typeName))
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
var typeNameCommaLocation = typeName.IndexOf(",");
|
||||||
|
var comparingTypeName = typeName.Substring(0, typeNameCommaLocation > 0 ? typeNameCommaLocation : typeName.Length);
|
||||||
|
|
||||||
|
// Correct wrong types
|
||||||
|
comparingTypeName = comparingTypeName.Replace("Greenshot.Drawing", "Greenshot.Editor.Drawing");
|
||||||
|
comparingTypeName = comparingTypeName.Replace("Greenshot.Plugin.Drawing", "Greenshot.Base.Interfaces.Drawing");
|
||||||
|
comparingTypeName = comparingTypeName.Replace("GreenshotPlugin.Interfaces.Drawing", "Greenshot.Base.Interfaces.Drawing");
|
||||||
|
comparingTypeName = comparingTypeName.Replace("Greenshot.Drawing.Fields", "Greenshot.Editor.Drawing.Fields");
|
||||||
|
comparingTypeName = comparingTypeName.Replace("Greenshot.Drawing.Filters", "Greenshot.Editor.Drawing.Filters");
|
||||||
|
|
||||||
|
if (TypeMapper.TryGetValue(comparingTypeName, out var returnType))
|
||||||
|
{
|
||||||
|
LOG.Info($"Mapped {assemblyName} - {typeName} to {returnType.FullName}");
|
||||||
|
return returnType;
|
||||||
|
}
|
||||||
|
LOG.Warn($"Unexpected Greenshot type in .greenshot file detected, maybe vulnerability attack created with ysoserial? Suspicious type: {assemblyName} - {typeName}");
|
||||||
|
throw new SecurityAccessDeniedException($"Suspicious type in .greenshot file: {assemblyName} - {typeName}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -202,7 +202,7 @@ namespace Greenshot.Editor.Helpers
|
||||||
{
|
{
|
||||||
// scaled rectangle (ratio) would be taller than original
|
// scaled rectangle (ratio) would be taller than original
|
||||||
// keep width and tweak height to maintain aspect ratio
|
// keep width and tweak height to maintain aspect ratio
|
||||||
newSize = newSize.ChangeWidth(selectedSize.Width / originalRatio * flippedRatioSign);
|
newSize = newSize.ChangeHeight(selectedSize.Width / originalRatio * flippedRatioSign);
|
||||||
}
|
}
|
||||||
|
|
||||||
return newSize;
|
return newSize;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/*
|
/*
|
||||||
* Greenshot - a free and open source screenshot tool
|
* Greenshot - a free and open source screenshot tool
|
||||||
* Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom
|
* Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,4 +1,8 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
|
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
|
||||||
|
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
|
||||||
|
<DebugType>none</DebugType>
|
||||||
|
<DebugSymbols>false</DebugSymbols>
|
||||||
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="Languages\language*.xml">
|
<None Include="Languages\language*.xml">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
|
|
@ -21,11 +21,13 @@
|
||||||
|
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
using Greenshot.Base.Interfaces.Plugin;
|
||||||
|
|
||||||
// General Information about an assembly is controlled through the following
|
// General Information about an assembly is controlled through the following
|
||||||
// set of attributes. Change these attribute values to modify the information
|
// set of attributes. Change these attribute values to modify the information
|
||||||
// associated with an assembly.
|
// associated with an assembly.
|
||||||
[assembly: AssemblyDescription("A plugin to upload images to Box")]
|
[assembly: AssemblyDescription("A plugin to upload images to Box")]
|
||||||
|
[assembly: AssemblyPluginIdentifier("Box Plugin")]
|
||||||
|
|
||||||
// This sets the default COM visibility of types in the assembly to invisible.
|
// This sets the default COM visibility of types in the assembly to invisible.
|
||||||
// If you need to expose a type to COM, use [ComVisible(true)] on that type.
|
// If you need to expose a type to COM, use [ComVisible(true)] on that type.
|
||||||
|
|
|
@ -1,4 +1,8 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
|
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
|
||||||
|
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
|
||||||
|
<DebugType>none</DebugType>
|
||||||
|
<DebugSymbols>false</DebugSymbols>
|
||||||
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="Languages\language*.xml">
|
<None Include="Languages\language*.xml">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
|
34
src/Greenshot.Plugin.Confluence/Properties/AssemblyInfo.cs
Normal file
34
src/Greenshot.Plugin.Confluence/Properties/AssemblyInfo.cs
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
/*
|
||||||
|
* Greenshot - a free and open source screenshot tool
|
||||||
|
* Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel
|
||||||
|
*
|
||||||
|
* For more information see: https://getgreenshot.org/
|
||||||
|
* The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 1 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using Greenshot.Base.Interfaces.Plugin;
|
||||||
|
|
||||||
|
// General Information about an assembly is controlled through the following
|
||||||
|
// set of attributes. Change these attribute values to modify the information
|
||||||
|
// associated with an assembly.
|
||||||
|
[assembly: AssemblyDescription("A plugin to upload images to Confluence")]
|
||||||
|
[assembly: AssemblyPluginIdentifier("Confluence Plugin")]
|
||||||
|
|
||||||
|
// This sets the default COM visibility of types in the assembly to invisible.
|
||||||
|
// If you need to expose a type to COM, use [ComVisible(true)] on that type.
|
||||||
|
[assembly: ComVisible(false)]
|
|
@ -1,4 +1,8 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
|
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
|
||||||
|
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
|
||||||
|
<DebugType>none</DebugType>
|
||||||
|
<DebugSymbols>false</DebugSymbols>
|
||||||
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="Languages\language*.xml">
|
<None Include="Languages\language*.xml">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
|
|
@ -21,11 +21,13 @@
|
||||||
|
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
using Greenshot.Base.Interfaces.Plugin;
|
||||||
|
|
||||||
// General Information about an assembly is controlled through the following
|
// General Information about an assembly is controlled through the following
|
||||||
// set of attributes. Change these attribute values to modify the information
|
// set of attributes. Change these attribute values to modify the information
|
||||||
// associated with an assembly.
|
// associated with an assembly.
|
||||||
[assembly: AssemblyDescription("A plugin to upload images to Dropbox")]
|
[assembly: AssemblyDescription("A plugin to upload images to Dropbox")]
|
||||||
|
[assembly: AssemblyPluginIdentifier("Dropbox Plugin")]
|
||||||
|
|
||||||
// This sets the default COM visibility of types in the assembly to invisible.
|
// This sets the default COM visibility of types in the assembly to invisible.
|
||||||
// If you need to expose a type to COM, use [ComVisible(true)] on that type.
|
// If you need to expose a type to COM, use [ComVisible(true)] on that type.
|
||||||
|
|
|
@ -1,4 +1,8 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
|
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
|
||||||
|
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
|
||||||
|
<DebugType>none</DebugType>
|
||||||
|
<DebugSymbols>false</DebugSymbols>
|
||||||
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="Languages\language*.xml">
|
<None Include="Languages\language*.xml">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
/*
|
||||||
|
* Greenshot - a free and open source screenshot tool
|
||||||
|
* Copyright (C) 2007-2025 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel
|
||||||
|
*
|
||||||
|
* For more information see: https://getgreenshot.org/
|
||||||
|
* The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 1 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using Greenshot.Base.Interfaces.Plugin;
|
||||||
|
|
||||||
|
// General Information about an assembly is controlled through the following
|
||||||
|
// set of attributes. Change these attribute values to modify the information
|
||||||
|
// associated with an assembly.
|
||||||
|
[assembly: AssemblyDescription("A plugin to send screenshots to other applications")]
|
||||||
|
[assembly: AssemblyPluginIdentifier("External command Plugin")]
|
||||||
|
|
||||||
|
// This sets the default COM visibility of types in the assembly to invisible.
|
||||||
|
// If you need to expose a type to COM, use [ComVisible(true)] on that type.
|
||||||
|
[assembly: ComVisible(false)]
|
|
@ -1,4 +1,8 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
|
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
|
||||||
|
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
|
||||||
|
<DebugType>none</DebugType>
|
||||||
|
<DebugSymbols>false</DebugSymbols>
|
||||||
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="Languages\language*.xml">
|
<None Include="Languages\language*.xml">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
|
|
@ -21,11 +21,13 @@
|
||||||
|
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
using Greenshot.Base.Interfaces.Plugin;
|
||||||
|
|
||||||
// General Information about an assembly is controlled through the following
|
// General Information about an assembly is controlled through the following
|
||||||
// set of attributes. Change these attribute values to modify the information
|
// set of attributes. Change these attribute values to modify the information
|
||||||
// associated with an assembly.
|
// associated with an assembly.
|
||||||
[assembly: AssemblyDescription("A plugin to upload images to Flickr")]
|
[assembly: AssemblyDescription("A plugin to upload images to Flickr")]
|
||||||
|
[assembly: AssemblyPluginIdentifier("Flickr Plugin")]
|
||||||
|
|
||||||
// This sets the default COM visibility of types in the assembly to invisible.
|
// This sets the default COM visibility of types in the assembly to invisible.
|
||||||
// If you need to expose a type to COM, use [ComVisible(true)] on that type.
|
// If you need to expose a type to COM, use [ComVisible(true)] on that type.
|
||||||
|
|
|
@ -1,4 +1,8 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
|
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
|
||||||
|
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
|
||||||
|
<DebugType>none</DebugType>
|
||||||
|
<DebugSymbols>false</DebugSymbols>
|
||||||
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="Languages\language*.xml">
|
<None Include="Languages\language*.xml">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
|
|
@ -21,12 +21,17 @@
|
||||||
|
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
using Greenshot.Base.Interfaces.Plugin;
|
||||||
|
|
||||||
// General Information about an assembly is controlled through the following
|
// General Information about an assembly is controlled through the following
|
||||||
// set of attributes. Change these attribute values to modify the information
|
// set of attributes. Change these attribute values to modify the information
|
||||||
// associated with an assembly.
|
// associated with an assembly.
|
||||||
[assembly: AssemblyDescription("A plugin to upload images to GooglePhotos")]
|
[assembly: AssemblyDescription("A plugin to upload images to GooglePhotos")]
|
||||||
|
|
||||||
|
// Still using the old name 'Picasa-Web Plugin' as identifier for backwards compatibility
|
||||||
|
// TODO: replace plugin identifier with "GooglePhotos Plugin" in the future
|
||||||
|
[assembly: AssemblyPluginIdentifier("Picasa-Web Plugin")]
|
||||||
|
|
||||||
// This sets the default COM visibility of types in the assembly to invisible.
|
// This sets the default COM visibility of types in the assembly to invisible.
|
||||||
// If you need to expose a type to COM, use [ComVisible(true)] on that type.
|
// If you need to expose a type to COM, use [ComVisible(true)] on that type.
|
||||||
[assembly: ComVisible(false)]
|
[assembly: ComVisible(false)]
|
|
@ -1,4 +1,8 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
|
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
|
||||||
|
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
|
||||||
|
<DebugType>none</DebugType>
|
||||||
|
<DebugSymbols>false</DebugSymbols>
|
||||||
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="Languages\language*.xml">
|
<None Include="Languages\language*.xml">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
|
|
@ -21,11 +21,13 @@
|
||||||
|
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
using Greenshot.Base.Interfaces.Plugin;
|
||||||
|
|
||||||
// General Information about an assembly is controlled through the following
|
// General Information about an assembly is controlled through the following
|
||||||
// set of attributes. Change these attribute values to modify the information
|
// set of attributes. Change these attribute values to modify the information
|
||||||
// associated with an assembly.
|
// associated with an assembly.
|
||||||
[assembly: AssemblyDescription("A plugin to upload images to Imgur")]
|
[assembly: AssemblyDescription("A plugin to upload images to Imgur")]
|
||||||
|
[assembly: AssemblyPluginIdentifier("Imgur Plugin")]
|
||||||
|
|
||||||
// This sets the default COM visibility of types in the assembly to invisible.
|
// This sets the default COM visibility of types in the assembly to invisible.
|
||||||
// If you need to expose a type to COM, use [ComVisible(true)] on that type.
|
// If you need to expose a type to COM, use [ComVisible(true)] on that type.
|
||||||
|
|
|
@ -1,4 +1,8 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
|
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
|
||||||
|
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
|
||||||
|
<DebugType>none</DebugType>
|
||||||
|
<DebugSymbols>false</DebugSymbols>
|
||||||
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="Languages\language*.xml">
|
<None Include="Languages\language*.xml">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
|
34
src/Greenshot.Plugin.Jira/Properties/AssemblyInfo.cs
Normal file
34
src/Greenshot.Plugin.Jira/Properties/AssemblyInfo.cs
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
/*
|
||||||
|
* Greenshot - a free and open source screenshot tool
|
||||||
|
* Copyright (C) 2007-2025 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel
|
||||||
|
*
|
||||||
|
* For more information see: https://getgreenshot.org/
|
||||||
|
* The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 1 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using Greenshot.Base.Interfaces.Plugin;
|
||||||
|
|
||||||
|
// General Information about an assembly is controlled through the following
|
||||||
|
// set of attributes. Change these attribute values to modify the information
|
||||||
|
// associated with an assembly.
|
||||||
|
[assembly: AssemblyDescription("A plugin to upload images to Jira")]
|
||||||
|
[assembly: AssemblyPluginIdentifier("Jira Plugin")]
|
||||||
|
|
||||||
|
// This sets the default COM visibility of types in the assembly to invisible.
|
||||||
|
// If you need to expose a type to COM, use [ComVisible(true)] on that type.
|
||||||
|
[assembly: ComVisible(false)]
|
|
@ -1,4 +1,8 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
|
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
|
||||||
|
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
|
||||||
|
<DebugType>none</DebugType>
|
||||||
|
<DebugSymbols>false</DebugSymbols>
|
||||||
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="Languages\language*.xml">
|
<None Include="Languages\language*.xml">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
|
|
@ -1,13 +1,14 @@
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Microsoft.Win32;
|
using Microsoft.Win32;
|
||||||
|
|
||||||
namespace Greenshot.Plugin.Office;
|
namespace Greenshot.Plugin.Office
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// A small utility class for helping with office
|
|
||||||
/// </summary>
|
|
||||||
internal static class OfficeUtils
|
|
||||||
{
|
{
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A small utility class for helping with office
|
||||||
|
/// </summary>
|
||||||
|
internal static class OfficeUtils
|
||||||
|
{
|
||||||
private static readonly string[] OfficeRootKeys = { @"SOFTWARE\Microsoft\Office", @"SOFTWARE\WOW6432Node\Microsoft\Office" };
|
private static readonly string[] OfficeRootKeys = { @"SOFTWARE\Microsoft\Office", @"SOFTWARE\WOW6432Node\Microsoft\Office" };
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -40,4 +41,5 @@ internal static class OfficeUtils
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -21,11 +21,13 @@
|
||||||
|
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
using Greenshot.Base.Interfaces.Plugin;
|
||||||
|
|
||||||
// General Information about an assembly is controlled through the following
|
// General Information about an assembly is controlled through the following
|
||||||
// set of attributes. Change these attribute values to modify the information
|
// set of attributes. Change these attribute values to modify the information
|
||||||
// associated with an assembly.
|
// associated with an assembly.
|
||||||
[assembly: AssemblyDescription("A plugin to export images to Office applications")]
|
[assembly: AssemblyDescription("A plugin to export images to Office applications")]
|
||||||
|
[assembly: AssemblyPluginIdentifier("Office Plugin")]
|
||||||
|
|
||||||
// This sets the default COM visibility of types in the assembly to invisible.
|
// This sets the default COM visibility of types in the assembly to invisible.
|
||||||
// If you need to expose a type to COM, use [ComVisible(true)] on that type.
|
// If you need to expose a type to COM, use [ComVisible(true)] on that type.
|
||||||
|
|
|
@ -1,4 +1,8 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
|
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
|
||||||
|
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
|
||||||
|
<DebugType>none</DebugType>
|
||||||
|
<DebugSymbols>false</DebugSymbols>
|
||||||
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="Languages\language*.xml">
|
<None Include="Languages\language*.xml">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
|
|
@ -21,12 +21,14 @@
|
||||||
|
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
using Greenshot.Base.Interfaces.Plugin;
|
||||||
|
|
||||||
|
|
||||||
// General Information about an assembly is controlled through the following
|
// General Information about an assembly is controlled through the following
|
||||||
// set of attributes. Change these attribute values to modify the information
|
// set of attributes. Change these attribute values to modify the information
|
||||||
// associated with an assembly.
|
// associated with an assembly.
|
||||||
[assembly: AssemblyDescription("A plugin to upload images to Photobucket")]
|
[assembly: AssemblyDescription("A plugin to upload images to Photobucket")]
|
||||||
|
[assembly: AssemblyPluginIdentifier("Photobucket Plugin")]
|
||||||
|
|
||||||
// This sets the default COM visibility of types in the assembly to invisible.
|
// This sets the default COM visibility of types in the assembly to invisible.
|
||||||
// If you need to expose a type to COM, use [ComVisible(true)] on that type.
|
// If you need to expose a type to COM, use [ComVisible(true)] on that type.
|
||||||
|
|
|
@ -1,4 +1,8 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
|
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
|
||||||
|
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
|
||||||
|
<DebugType>none</DebugType>
|
||||||
|
<DebugSymbols>false</DebugSymbols>
|
||||||
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="Languages\language*.xml">
|
<None Include="Languages\language*.xml">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
|
|
@ -1,10 +1,33 @@
|
||||||
using System.Reflection;
|
/*
|
||||||
|
* Greenshot - a free and open source screenshot tool
|
||||||
|
* Copyright (C) 2007-2025 Thomas Braun, Jens Klingen, Robin Krom
|
||||||
|
*
|
||||||
|
* For more information see: https://getgreenshot.org/
|
||||||
|
* The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 1 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System.Reflection;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
using Greenshot.Base.Interfaces.Plugin;
|
||||||
|
|
||||||
// General Information about an assembly is controlled through the following
|
// General Information about an assembly is controlled through the following
|
||||||
// set of attributes. Change these attribute values to modify the information
|
// set of attributes. Change these attribute values to modify the information
|
||||||
// associated with an assembly.
|
// associated with an assembly.
|
||||||
[assembly: AssemblyDescription("A plug-in for Windows 10 only functionality")]
|
[assembly: AssemblyDescription("A plug-in for Windows 10 only functionality")]
|
||||||
|
[assembly: AssemblyPluginIdentifier("Win10 Plugin")]
|
||||||
|
|
||||||
// Setting ComVisible to false makes the types in this assembly not visible
|
// Setting ComVisible to false makes the types in this assembly not visible
|
||||||
// to COM components. If you need to access a type in this assembly from
|
// to COM components. If you need to access a type in this assembly from
|
||||||
|
|
|
@ -95,7 +95,17 @@ namespace Greenshot.Plugin.Win10
|
||||||
}
|
}
|
||||||
|
|
||||||
// Prepare the toast notifier. Be sure to specify the AppUserModelId on your application's shortcut!
|
// Prepare the toast notifier. Be sure to specify the AppUserModelId on your application's shortcut!
|
||||||
var toastNotifier = ToastNotificationManagerCompat.CreateToastNotifier();
|
Microsoft.Toolkit.Uwp.Notifications.ToastNotifierCompat toastNotifier = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
toastNotifier = ToastNotificationManagerCompat.CreateToastNotifier();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Log.Warn("Could not create a toast notifier.", ex);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Here is an interesting article on reading the settings: https://www.rudyhuyn.com/blog/2018/02/10/toastnotifier-and-settings-careful-with-non-uwp-applications/
|
// Here is an interesting article on reading the settings: https://www.rudyhuyn.com/blog/2018/02/10/toastnotifier-and-settings-careful-with-non-uwp-applications/
|
||||||
try
|
try
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
# Visual Studio Version 16
|
# Visual Studio Version 17
|
||||||
VisualStudioVersion = 16.0.29728.190
|
VisualStudioVersion = 17.7.34009.444
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Greenshot", "Greenshot\Greenshot.csproj", "{CD642BF4-D815-4D67-A0B5-C69F0B8231AF}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Greenshot", "Greenshot\Greenshot.csproj", "{CD642BF4-D815-4D67-A0B5-C69F0B8231AF}"
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
|
@ -48,6 +48,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
|
||||||
..\azure-pipelines.yml = ..\azure-pipelines.yml
|
..\azure-pipelines.yml = ..\azure-pipelines.yml
|
||||||
Directory.Build.props = Directory.Build.props
|
Directory.Build.props = Directory.Build.props
|
||||||
Directory.Build.targets = Directory.Build.targets
|
Directory.Build.targets = Directory.Build.targets
|
||||||
|
..\.github\workflows\release.yml = ..\.github\workflows\release.yml
|
||||||
EndProjectSection
|
EndProjectSection
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Greenshot.Editor", "Greenshot.Editor\Greenshot.Editor.csproj", "{148D3C8B-D6EC-4A7D-80E9-243A81F19DD2}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Greenshot.Editor", "Greenshot.Editor\Greenshot.Editor.csproj", "{148D3C8B-D6EC-4A7D-80E9-243A81F19DD2}"
|
||||||
|
|
|
@ -9,6 +9,10 @@
|
||||||
<EmbeddedResourceUseDependentUponConvention>false</EmbeddedResourceUseDependentUponConvention>
|
<EmbeddedResourceUseDependentUponConvention>false</EmbeddedResourceUseDependentUponConvention>
|
||||||
<EnableDefaultEmbeddedResourceItems>false</EnableDefaultEmbeddedResourceItems>
|
<EnableDefaultEmbeddedResourceItems>false</EnableDefaultEmbeddedResourceItems>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
|
||||||
|
<DebugType>none</DebugType>
|
||||||
|
<DebugSymbols>false</DebugSymbols>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="Languages\language*.xml">
|
<None Include="Languages\language*.xml">
|
||||||
|
@ -17,6 +21,7 @@
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Microsoft.Build.Utilities.Core" Version="17.13.9" />
|
||||||
<PackageReference Include="Tools.InnoSetup" version="6.2.1" GeneratePathProperty="true" />
|
<PackageReference Include="Tools.InnoSetup" version="6.2.1" GeneratePathProperty="true" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
@ -75,6 +80,7 @@
|
||||||
<Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition="'$(Configuration)' == 'Release'">
|
<Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition="'$(Configuration)' == 'Release'">
|
||||||
<SetEnvironmentVariableTask Name="BuildVersionSimple" Value="$(BuildVersionSimple)" />
|
<SetEnvironmentVariableTask Name="BuildVersionSimple" Value="$(BuildVersionSimple)" />
|
||||||
<SetEnvironmentVariableTask Name="AssemblyInformationalVersion" Value="$(AssemblyInformationalVersion)" />
|
<SetEnvironmentVariableTask Name="AssemblyInformationalVersion" Value="$(AssemblyInformationalVersion)" />
|
||||||
|
<Exec Command="if not "$(CertumThumbprint)" == "" signtool.exe sign /sha1 "$(CertumThumbprint)" /tr http://time.certum.pl /td sha256 /fd sha256 /v "$(OutDir)Greenshot.exe"" />
|
||||||
<Exec Command="$(PkgTools_InnoSetup)\tools\ISCC.exe $(SolutionDir)\..\installer\innosetup\setup.iss" />
|
<Exec Command="$(PkgTools_InnoSetup)\tools\ISCC.exe $(SolutionDir)\..\installer\innosetup\setup.iss" />
|
||||||
</Target>
|
</Target>
|
||||||
<PropertyGroup Condition="'$(Configuration)' == 'Debug'">
|
<PropertyGroup Condition="'$(Configuration)' == 'Debug'">
|
||||||
|
|
|
@ -219,18 +219,15 @@ namespace Greenshot.Helpers
|
||||||
{
|
{
|
||||||
var assembly = Assembly.LoadFrom(pluginFile);
|
var assembly = Assembly.LoadFrom(pluginFile);
|
||||||
|
|
||||||
var assemblyName = assembly.GetName().Name;
|
if (IsPluginExcludedByConfig(assembly, pluginFile) )
|
||||||
|
|
||||||
var pluginEntryName = $"{assemblyName}.{assemblyName.Replace("Greenshot.Plugin.", string.Empty)}Plugin";
|
|
||||||
var pluginEntryType = assembly.GetType(pluginEntryName, false, true);
|
|
||||||
|
|
||||||
if (CoreConfig.ExcludePlugins != null && CoreConfig.ExcludePlugins.Contains(pluginEntryName))
|
|
||||||
{
|
{
|
||||||
Log.WarnFormat("Exclude list: {0}", string.Join(",", CoreConfig.ExcludePlugins));
|
|
||||||
Log.WarnFormat("Skipping the excluded plugin {0} with version {1} from {2}", pluginEntryName, assembly.GetName().Version, pluginFile);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var assemblyName = assembly.GetName().Name;
|
||||||
|
var pluginEntryName = $"{assemblyName}.{assemblyName.Replace("Greenshot.Plugin.", string.Empty)}Plugin";
|
||||||
|
var pluginEntryType = assembly.GetType(pluginEntryName, false, true);
|
||||||
|
|
||||||
var plugin = (IGreenshotPlugin) Activator.CreateInstance(pluginEntryType);
|
var plugin = (IGreenshotPlugin) Activator.CreateInstance(pluginEntryType);
|
||||||
if (plugin != null)
|
if (plugin != null)
|
||||||
{
|
{
|
||||||
|
@ -255,5 +252,54 @@ namespace Greenshot.Helpers
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// This method checks the plugin against the configured include and exclude plugin
|
||||||
|
/// lists. If a plugin is excluded, a warning is logged with details about the exclusion.
|
||||||
|
/// </summary>
|
||||||
|
private bool IsPluginExcludedByConfig(Assembly assembly, string pluginFile)
|
||||||
|
{
|
||||||
|
// Get plugin identifier from assembly attributes
|
||||||
|
string pluginConfigIdentifier = GetPluginIdentifier(assembly, pluginFile);
|
||||||
|
|
||||||
|
if (CoreConfig.IncludePlugins is { } includePlugins
|
||||||
|
&& includePlugins.Count(p => !string.IsNullOrWhiteSpace(p)) > 0 // ignore empty entries i.e. a whitespace
|
||||||
|
&& !includePlugins.Contains(pluginConfigIdentifier))
|
||||||
|
{
|
||||||
|
Log.WarnFormat("Include plugin list: {0}", string.Join(",", includePlugins));
|
||||||
|
Log.WarnFormat("Skipping the not included plugin '{0}' with version {1} from {2}", pluginConfigIdentifier, assembly.GetName().Version, pluginFile);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CoreConfig.ExcludePlugins is { } excludePlugins
|
||||||
|
&& excludePlugins.Contains(pluginConfigIdentifier))
|
||||||
|
{
|
||||||
|
Log.WarnFormat("Exclude plugin list: {0}", string.Join(",", excludePlugins));
|
||||||
|
Log.WarnFormat("Skipping the excluded plugin '{0}' with version {1} from {2}", pluginConfigIdentifier, assembly.GetName().Version, pluginFile);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Retrieves the plugin identifier for the specified assembly.
|
||||||
|
/// </summary>
|
||||||
|
private string GetPluginIdentifier(Assembly assembly, string pluginFile)
|
||||||
|
{
|
||||||
|
// Try to find PluginIdentifierAttribute
|
||||||
|
var attribute = assembly
|
||||||
|
.GetCustomAttributes<AssemblyPluginIdentifierAttribute>()
|
||||||
|
.FirstOrDefault();
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(attribute?.Identifier))
|
||||||
|
{
|
||||||
|
return attribute.Identifier;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If no attribute found, fall back to the sub namespace
|
||||||
|
var pluginSubNamespace = assembly.GetName().Name.Replace("Greenshot.Plugin.", string.Empty);
|
||||||
|
Log.WarnFormat("No '{0}' found in '{1}'. Use plugin namespace '{2}' as fallback.", nameof(AssemblyPluginIdentifierAttribute), pluginFile, pluginSubNamespace);
|
||||||
|
return pluginSubNamespace;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -305,7 +305,7 @@ Malgrat això, encara es poden utilitzar totes les característiques de Greensho
|
||||||
<resource name="editor_counter">Afegeix un comptador (I)</resource>
|
<resource name="editor_counter">Afegeix un comptador (I)</resource>
|
||||||
<resource name="editor_speechbubble">Afegeix una bafarada (S)</resource>
|
<resource name="editor_speechbubble">Afegeix una bafarada (S)</resource>
|
||||||
|
|
||||||
<resource name="editor_resize">Canvia la mida</resource>
|
<resource name="editor_resize">Canvia la mida (Z)</resource>
|
||||||
<resource name="editor_resize_settings">Configuració del canvi de mida</resource>
|
<resource name="editor_resize_settings">Configuració del canvi de mida</resource>
|
||||||
<resource name="editor_resize_aspectratio">Manté la relació d'aspecte</resource>
|
<resource name="editor_resize_aspectratio">Manté la relació d'aspecte</resource>
|
||||||
<resource name="editor_resize_width">Amplada</resource>
|
<resource name="editor_resize_width">Amplada</resource>
|
||||||
|
|
|
@ -308,7 +308,7 @@ Všechny funkce Greenshotu jsou stále dostupné přímo z místní nabídky bez
|
||||||
<resource name="editor_counter">Přidat počítadlo (I)</resource>
|
<resource name="editor_counter">Přidat počítadlo (I)</resource>
|
||||||
<resource name="editor_speechbubble">Přidat textovou bublinu (S)</resource>
|
<resource name="editor_speechbubble">Přidat textovou bublinu (S)</resource>
|
||||||
|
|
||||||
<resource name="editor_resize">Změnit velikost</resource>
|
<resource name="editor_resize">Změnit velikost (Z)</resource>
|
||||||
<resource name="editor_resize_settings">Nastavení změny velikosti</resource>
|
<resource name="editor_resize_settings">Nastavení změny velikosti</resource>
|
||||||
<resource name="editor_resize_aspectratio">Zachovat poměr stran</resource>
|
<resource name="editor_resize_aspectratio">Zachovat poměr stran</resource>
|
||||||
<resource name="editor_resize_width">Šířka</resource>
|
<resource name="editor_resize_width">Šířka</resource>
|
||||||
|
|
|
@ -312,7 +312,7 @@ Sie können aber auch alle Greenshot-Funktionen über das Kontextmenü des Green
|
||||||
<resource name="editor_counter">Zähler hinzufügen (I)</resource>
|
<resource name="editor_counter">Zähler hinzufügen (I)</resource>
|
||||||
<resource name="editor_speechbubble">Sprechblase hinzufügen (S)</resource>
|
<resource name="editor_speechbubble">Sprechblase hinzufügen (S)</resource>
|
||||||
|
|
||||||
<resource name="editor_resize">Skalieren</resource>
|
<resource name="editor_resize">Skalieren (Z)</resource>
|
||||||
<resource name="editor_resize_settings">Einstellungen für Skalierung</resource>
|
<resource name="editor_resize_settings">Einstellungen für Skalierung</resource>
|
||||||
<resource name="editor_resize_aspectratio">Seitenverhältnis beibehalten</resource>
|
<resource name="editor_resize_aspectratio">Seitenverhältnis beibehalten</resource>
|
||||||
<resource name="editor_resize_width">Breite</resource>
|
<resource name="editor_resize_width">Breite</resource>
|
||||||
|
|
|
@ -312,7 +312,7 @@ All Greenshot features still work directly from the tray icon context menu witho
|
||||||
<resource name="editor_counter">Add counter (I)</resource>
|
<resource name="editor_counter">Add counter (I)</resource>
|
||||||
<resource name="editor_speechbubble">Add speechbubble (S)</resource>
|
<resource name="editor_speechbubble">Add speechbubble (S)</resource>
|
||||||
|
|
||||||
<resource name="editor_resize">Resize</resource>
|
<resource name="editor_resize">Resize (Z)</resource>
|
||||||
<resource name="editor_resize_settings">Resize settings</resource>
|
<resource name="editor_resize_settings">Resize settings</resource>
|
||||||
<resource name="editor_resize_aspectratio">Maintain aspect ratio</resource>
|
<resource name="editor_resize_aspectratio">Maintain aspect ratio</resource>
|
||||||
<resource name="editor_resize_width">Width</resource>
|
<resource name="editor_resize_width">Width</resource>
|
||||||
|
|
|
@ -144,7 +144,7 @@ De plus, nous apprécierions beaucoup que vous preniez la peine de vérifier si
|
||||||
<resource name="editor_print">Imprimer</resource>
|
<resource name="editor_print">Imprimer</resource>
|
||||||
<resource name="editor_redo">Rétablir {0}</resource>
|
<resource name="editor_redo">Rétablir {0}</resource>
|
||||||
<resource name="editor_resetsize">Réinitialiser la taille</resource>
|
<resource name="editor_resetsize">Réinitialiser la taille</resource>
|
||||||
<resource name="editor_resize">Redimensionner</resource>
|
<resource name="editor_resize">Redimensionner (Z)</resource>
|
||||||
<resource name="editor_resize_aspectratio">Maintenir le rapport L / H</resource>
|
<resource name="editor_resize_aspectratio">Maintenir le rapport L / H</resource>
|
||||||
<resource name="editor_resize_height">Hauteur</resource>
|
<resource name="editor_resize_height">Hauteur</resource>
|
||||||
<resource name="editor_resize_percent">Pourcentage</resource>
|
<resource name="editor_resize_percent">Pourcentage</resource>
|
||||||
|
|
|
@ -144,7 +144,7 @@ Juga, kami sangat terbantu apabila anda mengecek laporan lain yang sama dengan k
|
||||||
<resource name="editor_print">Cetak</resource>
|
<resource name="editor_print">Cetak</resource>
|
||||||
<resource name="editor_redo">Ulang {0}</resource>
|
<resource name="editor_redo">Ulang {0}</resource>
|
||||||
<resource name="editor_resetsize">Reset ukuran</resource>
|
<resource name="editor_resetsize">Reset ukuran</resource>
|
||||||
<resource name="editor_resize">Ubah ukuran</resource>
|
<resource name="editor_resize">Ubah ukuran (Z)</resource>
|
||||||
<resource name="editor_resize_aspectratio">Pertahankan aspek rasio</resource>
|
<resource name="editor_resize_aspectratio">Pertahankan aspek rasio</resource>
|
||||||
<resource name="editor_resize_height">Tinggi</resource>
|
<resource name="editor_resize_height">Tinggi</resource>
|
||||||
<resource name="editor_resize_percent">Persen</resource>
|
<resource name="editor_resize_percent">Persen</resource>
|
||||||
|
|
|
@ -322,7 +322,7 @@ In alternativa alle scorciatoie di tastiera, tutte le funzioni di Greenshot sono
|
||||||
<resource name="editor_counter">Aggiungi conteggio</resource>
|
<resource name="editor_counter">Aggiungi conteggio</resource>
|
||||||
<resource name="editor_speechbubble">Aggiungi nuvoletta</resource>
|
<resource name="editor_speechbubble">Aggiungi nuvoletta</resource>
|
||||||
|
|
||||||
<resource name="editor_resize">Ridimensiona</resource>
|
<resource name="editor_resize">Ridimensiona (Z)</resource>
|
||||||
<resource name="editor_resize_settings">Impostazioni ridimensionamento</resource>
|
<resource name="editor_resize_settings">Impostazioni ridimensionamento</resource>
|
||||||
<resource name="editor_resize_aspectratio">Mantieni rapporto dimensioni</resource>
|
<resource name="editor_resize_aspectratio">Mantieni rapporto dimensioni</resource>
|
||||||
<resource name="editor_resize_width">Larghezza</resource>
|
<resource name="editor_resize_width">Larghezza</resource>
|
||||||
|
|
|
@ -143,7 +143,7 @@ Greenshot には一切の保障がありません。GNU General Public License
|
||||||
<resource name="editor_print">印刷</resource>
|
<resource name="editor_print">印刷</resource>
|
||||||
<resource name="editor_redo">やり直し{0}</resource>
|
<resource name="editor_redo">やり直し{0}</resource>
|
||||||
<resource name="editor_resetsize">サイズをリセット</resource>
|
<resource name="editor_resetsize">サイズをリセット</resource>
|
||||||
<resource name="editor_resize">リサイズ</resource>
|
<resource name="editor_resize">リサイズ (Z)</resource>
|
||||||
<resource name="editor_resize_aspectratio">縦横比を維持する</resource>
|
<resource name="editor_resize_aspectratio">縦横比を維持する</resource>
|
||||||
<resource name="editor_resize_height">高さ</resource>
|
<resource name="editor_resize_height">高さ</resource>
|
||||||
<resource name="editor_resize_percent">パーセント</resource>
|
<resource name="editor_resize_percent">パーセント</resource>
|
||||||
|
|
|
@ -144,7 +144,7 @@ Rnu ɣur-s, nḥemmel aṭas ma yella tesneqdeḍ aneqqis igebren ugur-agi. (Tze
|
||||||
<resource name="editor_print">Siggez</resource>
|
<resource name="editor_print">Siggez</resource>
|
||||||
<resource name="editor_redo">Err-d {0}</resource>
|
<resource name="editor_redo">Err-d {0}</resource>
|
||||||
<resource name="editor_resetsize">Wennez teɣzi</resource>
|
<resource name="editor_resetsize">Wennez teɣzi</resource>
|
||||||
<resource name="editor_resize">Snifel tahri/teɣzi</resource>
|
<resource name="editor_resize">Snifel tahri/teɣzi (Z)</resource>
|
||||||
<resource name="editor_resize_aspectratio">Eǧǧ afmiḍi Teɣ / Teh</resource>
|
<resource name="editor_resize_aspectratio">Eǧǧ afmiḍi Teɣ / Teh</resource>
|
||||||
<resource name="editor_resize_height">Awrir</resource>
|
<resource name="editor_resize_height">Awrir</resource>
|
||||||
<resource name="editor_resize_percent">Afmiḍi</resource>
|
<resource name="editor_resize_percent">Afmiḍi</resource>
|
||||||
|
|
|
@ -304,7 +304,7 @@ ${hostname} PC명
|
||||||
<resource name="editor_counter">카운터 더하기 (I)</resource>
|
<resource name="editor_counter">카운터 더하기 (I)</resource>
|
||||||
<resource name="editor_speechbubble">설명선 더하기(S)</resource>
|
<resource name="editor_speechbubble">설명선 더하기(S)</resource>
|
||||||
|
|
||||||
<resource name="editor_resize">크기조정</resource>
|
<resource name="editor_resize">크기조정 (Z)</resource>
|
||||||
<resource name="editor_resize_settings">크기조정 설정</resource>
|
<resource name="editor_resize_settings">크기조정 설정</resource>
|
||||||
<resource name="editor_resize_aspectratio">종횡비 유지</resource>
|
<resource name="editor_resize_aspectratio">종횡비 유지</resource>
|
||||||
<resource name="editor_resize_width">너비</resource>
|
<resource name="editor_resize_width">너비</resource>
|
||||||
|
|
|
@ -306,7 +306,7 @@ Arī bez karstiem taustiņiem visas darbības iespējams veikt izmantojot „Gre
|
||||||
<resource name="editor_counter">Pievienot skaitli (I)</resource>
|
<resource name="editor_counter">Pievienot skaitli (I)</resource>
|
||||||
<resource name="editor_speechbubble">Pievienot teksta norādi (S)</resource>
|
<resource name="editor_speechbubble">Pievienot teksta norādi (S)</resource>
|
||||||
|
|
||||||
<resource name="editor_resize">Mainīt izmēru</resource>
|
<resource name="editor_resize">Mainīt izmēru (Z)</resource>
|
||||||
<resource name="editor_resize_settings">Izmēra maiņas iestatījumi</resource>
|
<resource name="editor_resize_settings">Izmēra maiņas iestatījumi</resource>
|
||||||
<resource name="editor_resize_aspectratio">Saglabāt izmēru attiecības</resource>
|
<resource name="editor_resize_aspectratio">Saglabāt izmēru attiecības</resource>
|
||||||
<resource name="editor_resize_width">Platums</resource>
|
<resource name="editor_resize_width">Platums</resource>
|
||||||
|
|
|
@ -307,7 +307,7 @@ Alle Greenshot functies werken ook zonder sneltoetsen via het context menu.</res
|
||||||
<resource name="editor_counter">Teller toevoegen (I)</resource>
|
<resource name="editor_counter">Teller toevoegen (I)</resource>
|
||||||
<resource name="editor_speechbubble">Tekstballon toevoegen (S)</resource>
|
<resource name="editor_speechbubble">Tekstballon toevoegen (S)</resource>
|
||||||
|
|
||||||
<resource name="editor_resize">Grootte</resource>
|
<resource name="editor_resize">Grootte (Z)</resource>
|
||||||
<resource name="editor_resize_settings">Vergrotingsinstellingen</resource>
|
<resource name="editor_resize_settings">Vergrotingsinstellingen</resource>
|
||||||
<resource name="editor_resize_aspectratio">Verhouding behouden</resource>
|
<resource name="editor_resize_aspectratio">Verhouding behouden</resource>
|
||||||
<resource name="editor_resize_width">Breedte</resource>
|
<resource name="editor_resize_width">Breedte</resource>
|
||||||
|
|
|
@ -305,7 +305,7 @@ Todas as funcionalidades do Greenshot funcionam directamente através do menu de
|
||||||
<resource name="editor_counter">Adicionar contador (I)</resource>
|
<resource name="editor_counter">Adicionar contador (I)</resource>
|
||||||
<resource name="editor_speechbubble">Adicionar balão de texto (S)</resource>
|
<resource name="editor_speechbubble">Adicionar balão de texto (S)</resource>
|
||||||
|
|
||||||
<resource name="editor_resize">Redimensionar</resource>
|
<resource name="editor_resize">Redimensionar (Z)</resource>
|
||||||
<resource name="editor_resize_settings">Definições de Redimensionamento</resource>
|
<resource name="editor_resize_settings">Definições de Redimensionamento</resource>
|
||||||
<resource name="editor_resize_aspectratio">Manter proporções</resource>
|
<resource name="editor_resize_aspectratio">Manter proporções</resource>
|
||||||
<resource name="editor_resize_width">Largura</resource>
|
<resource name="editor_resize_width">Largura</resource>
|
||||||
|
|
|
@ -305,7 +305,7 @@ Alla Greenshots funktioner fungerar fortfarande från snabbmenyn i aktivitetsfä
|
||||||
<resource name="editor_counter">Lägg till räknare</resource>
|
<resource name="editor_counter">Lägg till räknare</resource>
|
||||||
<resource name="editor_speechbubble">Lägg till pratbubbla</resource>
|
<resource name="editor_speechbubble">Lägg till pratbubbla</resource>
|
||||||
|
|
||||||
<resource name="editor_resize">Anpassa storlek</resource>
|
<resource name="editor_resize">Anpassa storlek (Z)</resource>
|
||||||
<resource name="editor_resize_settings">Storleksinställningar</resource>
|
<resource name="editor_resize_settings">Storleksinställningar</resource>
|
||||||
<resource name="editor_resize_aspectratio">Behåll bildförhållande</resource>
|
<resource name="editor_resize_aspectratio">Behåll bildförhållande</resource>
|
||||||
<resource name="editor_resize_width">Bredd</resource>
|
<resource name="editor_resize_width">Bredd</resource>
|
||||||
|
|
|
@ -306,7 +306,7 @@ ${hostname} назва комп’ютера
|
||||||
<resource name="editor_counter">Додати лічильник (Ш)</resource>
|
<resource name="editor_counter">Додати лічильник (Ш)</resource>
|
||||||
<resource name="editor_speechbubble">Додати словесну бульбашку (І)</resource>
|
<resource name="editor_speechbubble">Додати словесну бульбашку (І)</resource>
|
||||||
|
|
||||||
<resource name="editor_resize">Змінити розмір</resource>
|
<resource name="editor_resize">Змінити розмір (Z)</resource>
|
||||||
<resource name="editor_resize_settings">Параметри зміни розміру</resource>
|
<resource name="editor_resize_settings">Параметри зміни розміру</resource>
|
||||||
<resource name="editor_resize_aspectratio">Зберігати пропорції</resource>
|
<resource name="editor_resize_aspectratio">Зберігати пропорції</resource>
|
||||||
<resource name="editor_resize_width">Ширина</resource>
|
<resource name="editor_resize_width">Ширина</resource>
|
||||||
|
|
|
@ -307,7 +307,7 @@ Greenshot 所有功能仍然可以直接從通知區圖示的內容功能表動
|
||||||
<resource name="editor_counter">加入計數器 (I)</resource>
|
<resource name="editor_counter">加入計數器 (I)</resource>
|
||||||
<resource name="editor_speechbubble">加入對話框 (S)</resource>
|
<resource name="editor_speechbubble">加入對話框 (S)</resource>
|
||||||
|
|
||||||
<resource name="editor_resize">縮放</resource>
|
<resource name="editor_resize">縮放 (Z)</resource>
|
||||||
<resource name="editor_resize_settings">縮放設定</resource>
|
<resource name="editor_resize_settings">縮放設定</resource>
|
||||||
<resource name="editor_resize_aspectratio">維持長寬比</resource>
|
<resource name="editor_resize_aspectratio">維持長寬比</resource>
|
||||||
<resource name="editor_resize_width">長度</resource>
|
<resource name="editor_resize_width">長度</resource>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue