mirror of
https://github.com/greenshot/greenshot
synced 2025-08-14 02:37:03 -07:00
Merge pull request #58 from greenshot/release/1.2.9BF2
Release/1.2.9 bf2
This commit is contained in:
commit
db9bf12e0c
52 changed files with 1029 additions and 452 deletions
|
@ -68,8 +68,10 @@ namespace Greenshot.Controls {
|
|||
}
|
||||
|
||||
private void ColorButtonClick(object sender, EventArgs e) {
|
||||
ColorDialog colorDialog = ColorDialog.GetInstance();
|
||||
colorDialog.Color = SelectedColor;
|
||||
var colorDialog = new ColorDialog
|
||||
{
|
||||
Color = SelectedColor
|
||||
};
|
||||
// Using the parent to make sure the dialog doesn't show on another window
|
||||
colorDialog.ShowDialog(Parent.Parent);
|
||||
if (colorDialog.DialogResult == DialogResult.Cancel)
|
||||
|
|
|
@ -66,8 +66,10 @@ namespace Greenshot.Controls {
|
|||
}
|
||||
|
||||
private void ColorButtonClick(object sender, EventArgs e) {
|
||||
ColorDialog colorDialog = ColorDialog.GetInstance();
|
||||
colorDialog.Color = SelectedColor;
|
||||
var colorDialog = new ColorDialog
|
||||
{
|
||||
Color = SelectedColor
|
||||
};
|
||||
// Using the parent to make sure the dialog doesn't show on another window
|
||||
colorDialog.ShowDialog(Parent.Parent);
|
||||
if (colorDialog.DialogResult == DialogResult.Cancel)
|
||||
|
|
|
@ -115,6 +115,7 @@ namespace Greenshot.Destinations {
|
|||
pattern = "greenshot ${capturetime}";
|
||||
}
|
||||
string filename = FilenameHelper.GetFilenameFromPattern(pattern, CoreConfig.OutputFileFormat, captureDetails);
|
||||
CoreConfig.ValidateAndCorrectOutputFilePath();
|
||||
string filepath = FilenameHelper.FillVariables(CoreConfig.OutputFilePath, false);
|
||||
try {
|
||||
fullPath = Path.Combine(filepath, filename);
|
||||
|
|
|
@ -27,6 +27,7 @@ using Greenshot.Plugin.Drawing;
|
|||
using GreenshotPlugin.Interfaces.Drawing;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Linq;
|
||||
|
||||
namespace Greenshot.Drawing.Fields
|
||||
{
|
||||
|
@ -203,7 +204,7 @@ namespace Greenshot.Drawing.Fields
|
|||
{
|
||||
return;
|
||||
}
|
||||
foreach (var drawableContainer1 in _boundContainers)
|
||||
foreach (var drawableContainer1 in _boundContainers.ToList())
|
||||
{
|
||||
var drawableContainer = (DrawableContainer) drawableContainer1;
|
||||
if (!drawableContainer.HasField(field.FieldType))
|
||||
|
|
|
@ -56,9 +56,10 @@ namespace Greenshot.Drawing
|
|||
/// <summary>
|
||||
/// Restore the target gripper
|
||||
/// </summary>
|
||||
/// <param name="context"></param>
|
||||
protected override void OnDeserialized(StreamingContext context)
|
||||
/// <param name="streamingContext">StreamingContext</param>
|
||||
protected override void OnDeserialized(StreamingContext streamingContext)
|
||||
{
|
||||
base.OnDeserialized(streamingContext);
|
||||
InitAdorner(Color.Green, _storedTargetGripperLocation);
|
||||
}
|
||||
#endregion
|
||||
|
@ -303,7 +304,6 @@ namespace Greenshot.Drawing
|
|||
tail.Dispose();
|
||||
|
||||
// Draw the text
|
||||
UpdateFormat();
|
||||
DrawText(graphics, rect, lineThickness, lineColor, shadow, StringFormat, Text, Font);
|
||||
}
|
||||
|
||||
|
|
|
@ -272,8 +272,11 @@ namespace Greenshot.Drawing
|
|||
_parent.Controls.Add(_textBox);
|
||||
}
|
||||
EnsureTextBoxContrast();
|
||||
_textBox.Show();
|
||||
_textBox.Focus();
|
||||
if (_textBox != null)
|
||||
{
|
||||
_textBox.Show();
|
||||
_textBox.Focus();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -281,6 +284,10 @@ namespace Greenshot.Drawing
|
|||
/// </summary>
|
||||
private void EnsureTextBoxContrast()
|
||||
{
|
||||
if (_textBox == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
Color lc = GetFieldValueAsColor(FieldType.LINE_COLOR);
|
||||
if (lc.R > 203 && lc.G > 203 && lc.B > 203)
|
||||
{
|
||||
|
@ -295,7 +302,7 @@ namespace Greenshot.Drawing
|
|||
private void HideTextBox()
|
||||
{
|
||||
_parent.Focus();
|
||||
_textBox.Hide();
|
||||
_textBox?.Hide();
|
||||
_parent.KeysLocked = false;
|
||||
_parent.Controls.Remove(_textBox);
|
||||
}
|
||||
|
@ -424,6 +431,10 @@ namespace Greenshot.Drawing
|
|||
/// </summary>
|
||||
private void UpdateTextBoxPosition()
|
||||
{
|
||||
if (_textBox == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
int lineThickness = GetFieldValueAsInt(FieldType.LINE_THICKNESS);
|
||||
|
||||
int lineWidth = (int)Math.Floor(lineThickness / 2d);
|
||||
|
|
|
@ -34,10 +34,9 @@ namespace Greenshot {
|
|||
/// Description of ColorDialog.
|
||||
/// </summary>
|
||||
public partial class ColorDialog : BaseForm {
|
||||
private static ColorDialog _uniqueInstance;
|
||||
private static readonly EditorConfiguration EditorConfig = IniConfig.GetIniSection<EditorConfiguration>();
|
||||
|
||||
private ColorDialog() {
|
||||
public ColorDialog() {
|
||||
SuspendLayout();
|
||||
InitializeComponent();
|
||||
SuspendLayout();
|
||||
|
@ -47,11 +46,6 @@ namespace Greenshot {
|
|||
UpdateRecentColorsButtonRow();
|
||||
}
|
||||
|
||||
public static ColorDialog GetInstance()
|
||||
{
|
||||
return _uniqueInstance ?? (_uniqueInstance = new ColorDialog());
|
||||
}
|
||||
|
||||
private readonly List<Button> _colorButtons = new List<Button>();
|
||||
private readonly List<Button> _recentColorButtons = new List<Button>();
|
||||
private readonly ToolTip _toolTip = new ToolTip();
|
||||
|
|
|
@ -21,7 +21,6 @@
|
|||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.IO;
|
||||
|
@ -860,13 +859,15 @@ namespace Greenshot {
|
|||
case Keys.Oemcomma: // Rotate CCW Ctrl + ,
|
||||
RotateCcwToolstripButtonClick(sender, e);
|
||||
break;
|
||||
case Keys.OemPeriod: // Rotate CW Ctrl + .
|
||||
case Keys.OemPeriod: // Rotate CW Ctrl + .
|
||||
RotateCwToolstripButtonClick(sender, e);
|
||||
break;
|
||||
case Keys.Add: // Ctrl + +
|
||||
case Keys.Oemplus: // Ctrl + +
|
||||
EnlargeCanvasToolStripMenuItemClick(sender, e);
|
||||
break;
|
||||
case Keys.Subtract: // Ctrl + -
|
||||
case Keys.OemMinus: // Ctrl + -
|
||||
ShrinkCanvasToolStripMenuItemClick(sender, e);
|
||||
break;
|
||||
}
|
||||
|
@ -1001,24 +1002,12 @@ namespace Greenshot {
|
|||
}
|
||||
|
||||
private void OpenDirectoryMenuItemClick(object sender, EventArgs e) {
|
||||
var path = Path.GetDirectoryName(_surface.LastSaveFullPath);
|
||||
if (path == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
var processStartInfo = new ProcessStartInfo("explorer")
|
||||
{
|
||||
Arguments = path,
|
||||
UseShellExecute = false
|
||||
};
|
||||
using (var process = new Process()) {
|
||||
process.StartInfo = processStartInfo;
|
||||
process.Start();
|
||||
}
|
||||
ExplorerHelper.OpenInExplorer(_surface.LastSaveFullPath);
|
||||
}
|
||||
#endregion
|
||||
|
||||
private void BindFieldControls() {
|
||||
// TODO: This is actually risky, if there are no references than the objects may be garbage collected
|
||||
new BidirectionalBinding(btnFillColor, "SelectedColor", _surface.FieldAggregator.GetField(FieldType.FILL_COLOR), "Value", NotNullValidator.GetInstance());
|
||||
new BidirectionalBinding(btnLineColor, "SelectedColor", _surface.FieldAggregator.GetField(FieldType.LINE_COLOR), "Value", NotNullValidator.GetInstance());
|
||||
new BidirectionalBinding(lineThicknessUpDown, "Value", _surface.FieldAggregator.GetField(FieldType.LINE_THICKNESS), "Value", DecimalIntConverter.GetInstance(), NotNullValidator.GetInstance());
|
||||
|
|
|
@ -1307,46 +1307,11 @@ namespace Greenshot {
|
|||
private void NotifyIconClick(ClickActions clickAction) {
|
||||
switch (clickAction) {
|
||||
case ClickActions.OPEN_LAST_IN_EXPLORER:
|
||||
string path = _conf.OutputFileAsFullpath;
|
||||
if (!File.Exists(path)) {
|
||||
string lastFilePath = Path.GetDirectoryName(_conf.OutputFileAsFullpath);
|
||||
if (!string.IsNullOrEmpty(lastFilePath) && Directory.Exists(lastFilePath)) {
|
||||
path = lastFilePath;
|
||||
}
|
||||
}
|
||||
if (path == null) {
|
||||
string configPath = FilenameHelper.FillVariables(_conf.OutputFilePath, false);
|
||||
if (Directory.Exists(configPath)) {
|
||||
path = configPath;
|
||||
}
|
||||
}
|
||||
|
||||
if (path != null) {
|
||||
try {
|
||||
// Check if path is a directory
|
||||
if (Directory.Exists(path))
|
||||
{
|
||||
using (Process.Start(path))
|
||||
{
|
||||
}
|
||||
}
|
||||
// Check if path is a file
|
||||
else if (File.Exists(path))
|
||||
{
|
||||
// Start the explorer process and select the file
|
||||
using (var explorer = Process.Start("explorer.exe", $"/select,\"{path}\""))
|
||||
{
|
||||
explorer?.WaitForInputIdle(500);
|
||||
}
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
// Make sure we show what we tried to open in the exception
|
||||
ex.Data.Add("path", path);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
Contextmenu_OpenRecent(this, null);
|
||||
break;
|
||||
case ClickActions.OPEN_LAST_IN_EDITOR:
|
||||
_conf.ValidateAndCorrectOutputFileAsFullpath();
|
||||
|
||||
if (File.Exists(_conf.OutputFileAsFullpath)) {
|
||||
CaptureHelper.CaptureFile(_conf.OutputFileAsFullpath, DestinationHelper.GetDestination(EditorDestination.DESIGNATION));
|
||||
}
|
||||
|
@ -1364,25 +1329,40 @@ namespace Greenshot {
|
|||
/// <summary>
|
||||
/// The Contextmenu_OpenRecent currently opens the last know save location
|
||||
/// </summary>
|
||||
private void Contextmenu_OpenRecent(object sender, EventArgs eventArgs) {
|
||||
string path = FilenameHelper.FillVariables(_conf.OutputFilePath, false);
|
||||
// Fix for #1470, problems with a drive which is no longer available
|
||||
try {
|
||||
string lastFilePath = Path.GetDirectoryName(_conf.OutputFileAsFullpath);
|
||||
private void Contextmenu_OpenRecent(object sender, EventArgs eventArgs)
|
||||
{
|
||||
_conf.ValidateAndCorrectOutputFilePath();
|
||||
_conf.ValidateAndCorrectOutputFileAsFullpath();
|
||||
string path = _conf.OutputFileAsFullpath;
|
||||
if (!File.Exists(path))
|
||||
{
|
||||
path = FilenameHelper.FillVariables(_conf.OutputFilePath, false);
|
||||
// Fix for #1470, problems with a drive which is no longer available
|
||||
try
|
||||
{
|
||||
string lastFilePath = Path.GetDirectoryName(_conf.OutputFileAsFullpath);
|
||||
|
||||
if (lastFilePath != null && Directory.Exists(lastFilePath)) {
|
||||
path = lastFilePath;
|
||||
} else if (!Directory.Exists(path)) {
|
||||
// What do I open when nothing can be found? Right, nothing...
|
||||
return;
|
||||
if (lastFilePath != null && Directory.Exists(lastFilePath))
|
||||
{
|
||||
path = lastFilePath;
|
||||
}
|
||||
else if (!Directory.Exists(path))
|
||||
{
|
||||
// What do I open when nothing can be found? Right, nothing...
|
||||
return;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LOG.Warn("Couldn't open the path to the last exported file, taking default.", ex);
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
LOG.Warn("Couldn't open the path to the last exported file, taking default.", ex);
|
||||
}
|
||||
LOG.Debug("DoubleClick was called! Starting: " + path);
|
||||
try {
|
||||
Process.Start(path);
|
||||
} catch (Exception ex) {
|
||||
try
|
||||
{
|
||||
ExplorerHelper.OpenInExplorer(path);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// Make sure we show what we tried to open in the exception
|
||||
ex.Data.Add("path", path);
|
||||
LOG.Warn("Couldn't open the path to the last exported file", ex);
|
||||
|
|
|
@ -275,7 +275,9 @@
|
|||
<None Include="Languages\help-nl-NL.html">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Languages\help-nn-NO.html" />
|
||||
<None Include="Languages\help-nn-NO.html">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Languages\help-pl-PL.html">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
|
@ -303,9 +305,9 @@
|
|||
<None Include="Languages\language-el-GR.xml">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
<EmbeddedResource Include="Languages\language-en-US.xml">
|
||||
<None Include="Languages\language-en-US.xml">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</EmbeddedResource>
|
||||
</None>
|
||||
<None Include="Languages\language-es-ES.xml">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
|
@ -318,7 +320,9 @@
|
|||
<None Include="Languages\language-fr-FR.xml">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Languages\language-fr-QC.xml" />
|
||||
<None Include="Languages\language-fr-QC.xml">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Languages\language-he-IL.xml">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
|
@ -340,7 +344,9 @@
|
|||
<None Include="Languages\language-nl-NL.xml">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Languages\language-nn-NO.xml" />
|
||||
<None Include="Languages\language-nn-NO.xml">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Languages\language-pl-PL.xml">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
|
@ -402,6 +408,40 @@
|
|||
<Name>GreenshotPlugin</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="Languages\language-kab-DZ.xml">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="Languages\help-ko-KR.html">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Languages\help-pt-PT.html">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Languages\language-ca-CA.xml">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Languages\language-da-DK.xml">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Languages\language-de-x-franconia.xml">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Languages\language-et-EE.xml">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Languages\language-id-ID.xml">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Languages\language-lv-LV.xml">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Languages\language-sl-SI.xml">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
|
||||
<PropertyGroup>
|
||||
<PreBuildEvent>
|
||||
|
|
|
@ -507,63 +507,17 @@ namespace Greenshot.Helpers {
|
|||
return;
|
||||
}
|
||||
ISurface surface = eventArgs.Surface;
|
||||
if (surface != null && eventArgs.MessageType == SurfaceMessageTyp.FileSaved) {
|
||||
if (!string.IsNullOrEmpty(surface.LastSaveFullPath)) {
|
||||
string errorMessage = null;
|
||||
var path = Path.GetDirectoryName(surface.LastSaveFullPath);
|
||||
try {
|
||||
if (path != null)
|
||||
{
|
||||
var processStartInfo = new ProcessStartInfo("explorer.exe")
|
||||
{
|
||||
Arguments = path,
|
||||
UseShellExecute = false
|
||||
};
|
||||
using (var process = new Process()) {
|
||||
process.StartInfo = processStartInfo;
|
||||
process.Start();
|
||||
}
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
errorMessage = ex.Message;
|
||||
}
|
||||
// Added fallback for when the explorer can't be found
|
||||
if (errorMessage != null) {
|
||||
try {
|
||||
string windowsPath = Environment.GetEnvironmentVariable("SYSTEMROOT");
|
||||
if (windowsPath != null)
|
||||
{
|
||||
string explorerPath = Path.Combine(windowsPath, "explorer.exe");
|
||||
if (File.Exists(explorerPath))
|
||||
{
|
||||
var lastSaveDirectory = Path.GetDirectoryName(surface.LastSaveFullPath);
|
||||
if (lastSaveDirectory != null)
|
||||
{
|
||||
var processStartInfo = new ProcessStartInfo(explorerPath)
|
||||
{
|
||||
Arguments = lastSaveDirectory,
|
||||
UseShellExecute = false
|
||||
};
|
||||
using (var process = new Process()) {
|
||||
process.StartInfo = processStartInfo;
|
||||
process.Start();
|
||||
}
|
||||
}
|
||||
errorMessage = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
// ignored
|
||||
}
|
||||
}
|
||||
if (errorMessage != null) {
|
||||
MessageBox.Show($"{errorMessage}\r\nexplorer.exe {surface.LastSaveFullPath}", "explorer.exe", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
}
|
||||
if (surface != null)
|
||||
{
|
||||
switch (eventArgs.MessageType)
|
||||
{
|
||||
case SurfaceMessageTyp.FileSaved:
|
||||
ExplorerHelper.OpenInExplorer(surface.LastSaveFullPath);
|
||||
break;
|
||||
case SurfaceMessageTyp.UploadedUri:
|
||||
Process.Start(surface.UploadUrl);
|
||||
break;
|
||||
}
|
||||
} else if (!string.IsNullOrEmpty(surface?.UploadUrl)) {
|
||||
Process.Start(surface.UploadUrl);
|
||||
}
|
||||
Log.DebugFormat("Deregistering the BalloonTipClicked");
|
||||
RemoveEventHandler(sender, e);
|
||||
|
@ -852,7 +806,7 @@ namespace Greenshot.Helpers {
|
|||
// Restore the window making sure it's visible!
|
||||
windowToCapture.Restore();
|
||||
} else {
|
||||
windowToCapture.ToForeground();
|
||||
windowToCapture.ToForeground(false);
|
||||
}
|
||||
tmpCapture = windowToCapture.CaptureGdiWindow(captureForWindow);
|
||||
if (tmpCapture != null) {
|
||||
|
@ -954,7 +908,7 @@ namespace Greenshot.Helpers {
|
|||
_capture.CaptureDetails.DpiY = graphics.DpiY;
|
||||
}
|
||||
// Set previouslyActiveWindow as foreground window
|
||||
previouslyActiveWindow?.ToForeground();
|
||||
previouslyActiveWindow?.ToForeground(false);
|
||||
if (_capture.CaptureDetails != null) {
|
||||
((Bitmap) _capture.Image)?.SetResolution(_capture.CaptureDetails.DpiX, _capture.CaptureDetails.DpiY);
|
||||
}
|
||||
|
|
|
@ -36,8 +36,8 @@ namespace Greenshot.Experimental {
|
|||
public static class UpdateHelper {
|
||||
private static readonly ILog Log = LogManager.GetLogger(typeof(UpdateHelper));
|
||||
private static readonly CoreConfiguration CoreConfig = IniConfig.GetIniSection<CoreConfiguration>();
|
||||
private const string StableDownloadLink = "http://getgreenshot.org/downloads/";
|
||||
private const string VersionHistoryLink = "http://getgreenshot.org/version-history/";
|
||||
private const string StableDownloadLink = "https://getgreenshot.org/downloads/";
|
||||
private const string VersionHistoryLink = "https://getgreenshot.org/version-history/";
|
||||
private static readonly object LockObject = new object();
|
||||
private static RssFile _latestGreenshot;
|
||||
private static string _downloadLink = StableDownloadLink;
|
||||
|
|
309
Greenshot/Languages/language-kab-DZ.xml
Normal file
309
Greenshot/Languages/language-kab-DZ.xml
Normal file
|
@ -0,0 +1,309 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<language description="Taqbaylit" ietf="kab-DZ" version="1.2.0.58" languagegroup="1">
|
||||
<resources>
|
||||
<resource name="about_bugs">Azen ibugen ar</resource>
|
||||
<resource name="about_donations">Ma tḥemled Greenshot, Mudd-aɣ-d afus :</resource>
|
||||
<resource name="about_host">Greenshot yezdeɣ di sourceforge.net di</resource>
|
||||
<resource name="about_icons">Tignitin i d-yekkan seg uqettun n tignitin Fugue n Kamiyamane Yuusuke (Creative Commons Attribution 3.0 license)</resource>
|
||||
<resource name="about_license">Copyright © 2007-2015 Thomas Braun, Jens Klingen, Robin Krom
|
||||
Greenshot yettunefk-d S WAR ṬMANA. d aseɣẓan ilelli i tzemreḍ ad tezuzreḍ s kra n tewtilin.
|
||||
Talqayt ɣef GNU General Public License :</resource>
|
||||
<resource name="about_title">Ɣef Greenshot</resource>
|
||||
<resource name="application_title">Greenshot - afecku ifazen n tuṭṭfa n ugdil</resource>
|
||||
<resource name="bugreport_cancel">Mdel</resource>
|
||||
<resource name="bugreport_info">Suref-aɣ, teḍra-d tuccḍa.
|
||||
|
||||
Isali yelhan, tzemreḍ ad tmuddeḍ afus akken ad nefru uguren ma yella tuzned-d aneqqis n ibugen.
|
||||
Rzu ma ulac aɣilif ar tensa URL daw-a, rnu aneqqis amaynur sakin senteḍ agbur-agi di temnaṭ-agi n uḍris.
|
||||
|
||||
Rnu agzul yettwagzan akked telɣut i twalad tlaq akken ad nwali ugur.
|
||||
Rnu ɣur-s, nḥemmel aṭas ma yella tesneqdeḍ aneqqis igebren ugur-agi. (Tzemreḍ ad tesqedceḍ afecku n unadi akken ad id-tafeḍ s zreb.) Tanemmirt :)</resource>
|
||||
<resource name="bugreport_title">Tuccḍa</resource>
|
||||
<resource name="CANCEL">Sefsex</resource>
|
||||
<resource name="clipboard_error">Teḍra-d tuccḍa di tira n ɣef afus.</resource>
|
||||
<resource name="clipboard_inuse">Greenshot ur izmir ara ad yeru ɣef afus acku akala {0} isewḥel anekcum.</resource>
|
||||
<resource name="clipboard_noimage">Ur izmir ara ad d-yaf tugna ɣef afus.</resource>
|
||||
<resource name="ClipboardFormat.BITMAP">Windows Bitmap</resource>
|
||||
<resource name="ClipboardFormat.DIB">Amasal n tugna amunan ɣef yibenk (DIB)</resource>
|
||||
<resource name="ClipboardFormat.HTML">HTML</resource>
|
||||
<resource name="ClipboardFormat.HTMLDATAURL">HTML s tugniwin s srid</resource>
|
||||
<resource name="ClipboardFormat.PNG">PNG</resource>
|
||||
<resource name="colorpicker_alpha">Alpha</resource>
|
||||
<resource name="colorpicker_apply">Snes</resource>
|
||||
<resource name="colorpicker_blue">Amidadi</resource>
|
||||
<resource name="colorpicker_green">Azegzaw</resource>
|
||||
<resource name="colorpicker_htmlcolor">Ini HTML</resource>
|
||||
<resource name="colorpicker_recentcolors">Initen ineggura</resource>
|
||||
<resource name="colorpicker_red">Azeggaɣ</resource>
|
||||
<resource name="colorpicker_title">Fren ini</resource>
|
||||
<resource name="colorpicker_transparent">Afrawan</resource>
|
||||
<resource name="com_rejected">Taniɣert {0} tugi anekcum n Greenshot, tasfaylu n udiwenni ahat yeldi. Mdel asfaylu n udewenni sakin ɛreḍ tikelt-nniḍen.</resource>
|
||||
<resource name="com_rejected_title">Anekcum n Greenshot yettwagdel</resource>
|
||||
<resource name="config_unauthorizedaccess_write">Ur izmir ara ad isekles afaylu n twila n Greenshot. Ma ulac aɣilif senqed izerfan n '{0}'.</resource>
|
||||
<resource name="contextmenu_about">Ɣef Greenshot</resource>
|
||||
<resource name="contextmenu_capturearea">Ṭṭef tamnaṭ</resource>
|
||||
<resource name="contextmenu_captureclipboard">Ldi Tugna yellan Ɣef afus</resource>
|
||||
<resource name="contextmenu_capturefullscreen">Ṭṭef akk agdil</resource>
|
||||
<resource name="contextmenu_capturefullscreen_all">Akk</resource>
|
||||
<resource name="contextmenu_capturefullscreen_bottom">akesser</resource>
|
||||
<resource name="contextmenu_capturefullscreen_left">azelmaḍ</resource>
|
||||
<resource name="contextmenu_capturefullscreen_right">ayeffus</resource>
|
||||
<resource name="contextmenu_capturefullscreen_top">awriran</resource>
|
||||
<resource name="contextmenu_captureie">Ṭṭef Internet Explorer</resource>
|
||||
<resource name="contextmenu_captureiefromlist">Ṭṭef Internet Explorer si tebdart agi</resource>
|
||||
<resource name="contextmenu_capturelastregion">Ṭṭef tamnaṭ taneggarut</resource>
|
||||
<resource name="contextmenu_capturewindow">Ṭṭef asfaylu urmid</resource>
|
||||
<resource name="contextmenu_capturewindowfromlist">Ṭṭef asfaylu urmid si tebdart agi</resource>
|
||||
<resource name="contextmenu_donate">Mudd afus i Greenshot</resource>
|
||||
<resource name="contextmenu_exit">Ffeɣ</resource>
|
||||
<resource name="contextmenu_help">Tallelt</resource>
|
||||
<resource name="contextmenu_openfile">Ldi tugna seg ufaylu</resource>
|
||||
<resource name="contextmenu_openrecentcapture">Ldi adig n usekles aneggaru</resource>
|
||||
<resource name="contextmenu_quicksettings">Ismenyifen iruraden</resource>
|
||||
<resource name="contextmenu_settings">Ismenyifen...</resource>
|
||||
<resource name="destination_exportfailed">Tuccḍa deg usnirem ɣer {0}.Ma ulac aɣilif ɛreḍ tikelt nniḍen.</resource>
|
||||
<resource name="editor_align_bottom">D akesser</resource>
|
||||
<resource name="editor_align_center">Di tlemmast</resource>
|
||||
<resource name="editor_align_horizontal">Areyyec aglawan</resource>
|
||||
<resource name="editor_align_left">Reyyec s azelmaḍ</resource>
|
||||
<resource name="editor_align_middle">Di tlemmast</resource>
|
||||
<resource name="editor_align_right">Reyyec s ayeffus</resource>
|
||||
<resource name="editor_align_top">D asawen</resource>
|
||||
<resource name="editor_align_vertical">Areyyec ubdid</resource>
|
||||
<resource name="editor_arrange">Suddes</resource>
|
||||
<resource name="editor_arrowheads">Iqeṛṛa n ineccaben</resource>
|
||||
<resource name="editor_arrowheads_both">I sin</resource>
|
||||
<resource name="editor_arrowheads_end">Taneqqiṭ n tagara</resource>
|
||||
<resource name="editor_arrowheads_none">Ula yiwen</resource>
|
||||
<resource name="editor_arrowheads_start">Taneqqiṭ n tazwara</resource>
|
||||
<resource name="editor_autocrop">Aseggem awurman</resource>
|
||||
<resource name="editor_backcolor">Ini n taččart</resource>
|
||||
<resource name="editor_blur_radius">Aqqaṛ n udaɛmec</resource>
|
||||
<resource name="editor_bold">Zur</resource>
|
||||
<resource name="editor_border">Rnu leryuf</resource>
|
||||
<resource name="editor_brightness">Tafat</resource>
|
||||
<resource name="editor_cancel">Sefsex</resource>
|
||||
<resource name="editor_clipboardfailed">Teḍra-d tuccḍa deg unekcum ɣef afus. Ɛreḍ tikelt -nniḍen.</resource>
|
||||
<resource name="editor_close">Mdel</resource>
|
||||
<resource name="editor_close_on_save">Tebɣiḍ ad teselkseḍ tuṭṭfa n ugdil?</resource>
|
||||
<resource name="editor_close_on_save_title">Sekles tugna?</resource>
|
||||
<resource name="editor_confirm">Sentem</resource>
|
||||
<resource name="editor_copyimagetoclipboard">Nɣel tugna ɣef afus</resource>
|
||||
<resource name="editor_copypathtoclipboard">Nɣel abrid ɣef afus</resource>
|
||||
<resource name="editor_copytoclipboard">Nɣel</resource>
|
||||
<resource name="editor_counter">Rnu Amesmiḍan</resource>
|
||||
<resource name="editor_crop">Seggem (C)</resource>
|
||||
<resource name="editor_cursortool">Afecku n ufran (ESC)</resource>
|
||||
<resource name="editor_cuttoclipboard">Gzem</resource>
|
||||
<resource name="editor_deleteelement">Kkes</resource>
|
||||
<resource name="editor_downonelevel">Ṣub</resource>
|
||||
<resource name="editor_downtobottom">Deg ugilal</resource>
|
||||
<resource name="editor_drawarrow">Suneɣ aneccab (A)</resource>
|
||||
<resource name="editor_drawellipse">Suneɣ taglayt (E)</resource>
|
||||
<resource name="editor_drawfreehand">Suneɣ s ufus (F)</resource>
|
||||
<resource name="editor_drawhighlighter">Derrer (H)</resource>
|
||||
<resource name="editor_drawline">Suneɣ izirig (L)</resource>
|
||||
<resource name="editor_drawrectangle">Suneɣ asrem(R)</resource>
|
||||
<resource name="editor_drawtextbox">Rnu asfaylu n uḍris (T)</resource>
|
||||
<resource name="editor_dropshadow_darkness">Tebrek n tili</resource>
|
||||
<resource name="editor_dropshadow_offset">Asiẓi</resource>
|
||||
<resource name="editor_dropshadow_settings">Iɣewwaṛen n tili</resource>
|
||||
<resource name="editor_dropshadow_thickness">Tuzert n tili</resource>
|
||||
<resource name="editor_duplicate">Sleg aferdis yettwafernen</resource>
|
||||
<resource name="editor_edit">Taẓrigt</resource>
|
||||
<resource name="editor_effects">Isemda</resource>
|
||||
<resource name="editor_email">Imayl</resource>
|
||||
<resource name="editor_file">Afaylu</resource>
|
||||
<resource name="editor_fontsize">Teɣzi</resource>
|
||||
<resource name="editor_forecolor">Ini n izirig</resource>
|
||||
<resource name="editor_grayscale">Tifesniwin n umumed</resource>
|
||||
<resource name="editor_highlight_area">Jerreḍ tamnaṭ</resource>
|
||||
<resource name="editor_highlight_grayscale">Tifesniwin n umumed</resource>
|
||||
<resource name="editor_highlight_magnify">Semɣeṛ</resource>
|
||||
<resource name="editor_highlight_mode">Askar n ujerreḍ</resource>
|
||||
<resource name="editor_highlight_text">Sebrureq aḍris</resource>
|
||||
<resource name="editor_image_shadow">Tili yettwarfden</resource>
|
||||
<resource name="editor_imagesaved">Tugna tettwasekles ara {0}.</resource>
|
||||
<resource name="editor_insertwindow">Ger asfaylu</resource>
|
||||
<resource name="editor_invert">Tti initen</resource>
|
||||
<resource name="editor_italic">Uknan</resource>
|
||||
<resource name="editor_load_objects">Sali-d tiɣawsiwin seg ufaylu</resource>
|
||||
<resource name="editor_magnification_factor">Amesker n usuzer</resource>
|
||||
<resource name="editor_match_capture_size">Seggem amasal n tuṭṭfa n ugdil</resource>
|
||||
<resource name="editor_obfuscate">Sdaɛmumec (O)</resource>
|
||||
<resource name="editor_obfuscate_blur">Sdeɛmumec</resource>
|
||||
<resource name="editor_obfuscate_mode">Askar n usdaɛmumec</resource>
|
||||
<resource name="editor_obfuscate_pixelize">Piksilizi</resource>
|
||||
<resource name="editor_object">Taɣawsa</resource>
|
||||
<resource name="editor_opendirinexplorer">Ldi akaram n unaram Windows</resource>
|
||||
<resource name="editor_pastefromclipboard">Sented</resource>
|
||||
<resource name="editor_pixel_size">Teɣzu n upiksil</resource>
|
||||
<resource name="editor_preview_quality">Taɣara n teskant</resource>
|
||||
<resource name="editor_print">Siggez</resource>
|
||||
<resource name="editor_redo">Err-d {0}</resource>
|
||||
<resource name="editor_resetsize">Wennez teɣzi</resource>
|
||||
<resource name="editor_resize">Snifel tahri/teɣzi</resource>
|
||||
<resource name="editor_resize_aspectratio">Eǧǧ afmiḍi Teɣ / Teh</resource>
|
||||
<resource name="editor_resize_height">Awrir</resource>
|
||||
<resource name="editor_resize_percent">Afmiḍi</resource>
|
||||
<resource name="editor_resize_pixel">Ipiksilen</resource>
|
||||
<resource name="editor_resize_settings">Iqewwaṛen n usnufel n Tehri/Teɣzi</resource>
|
||||
<resource name="editor_resize_width">Tehri</resource>
|
||||
<resource name="editor_rotateccw">Zzi s azelmaḍ</resource>
|
||||
<resource name="editor_rotatecw">Zzi s ayeffus</resource>
|
||||
<resource name="editor_save">Sekles</resource>
|
||||
<resource name="editor_save_objects">Sekles tiɣawsiwin deg ufaylu</resource>
|
||||
<resource name="editor_saveas">Sekles s yisem...</resource>
|
||||
<resource name="editor_selectall">Fren akk</resource>
|
||||
<resource name="editor_senttoprinter">Tamhelt n usiggez tettwazen ɣer '{0}'.</resource>
|
||||
<resource name="editor_shadow">Tili tettwarfed</resource>
|
||||
<resource name="editor_speechbubble">tačuffiṭ n uḍris</resource>
|
||||
<resource name="editor_storedtoclipboard">Tugna tetwasers ɣef afus.</resource>
|
||||
<resource name="editor_thickness">Tuzert n izirig</resource>
|
||||
<resource name="editor_title">Greenshot Amaẓrag n tugniwin</resource>
|
||||
<resource name="editor_torn_edge">Leryuf qqeṛsen</resource>
|
||||
<resource name="editor_tornedge_all">Seɣres akk idisan</resource>
|
||||
<resource name="editor_tornedge_bottom">Snes aseɣres ukesser</resource>
|
||||
<resource name="editor_tornedge_horizontaltoothrange">Aglawan : azilal n tuɣmas</resource>
|
||||
<resource name="editor_tornedge_left">Snes aseɣres deg uzelmaḍ</resource>
|
||||
<resource name="editor_tornedge_right">Snes aseɣres deg uyeffus</resource>
|
||||
<resource name="editor_tornedge_settings">Aswel n leryuf</resource>
|
||||
<resource name="editor_tornedge_shadow">Sefek tili</resource>
|
||||
<resource name="editor_tornedge_toothsize">Teɣzi n tuɣmas</resource>
|
||||
<resource name="editor_tornedge_top">Snes acerrig d asawen</resource>
|
||||
<resource name="editor_tornedge_verticaltoothrange">Ubdid : Azilal n tuɣmas</resource>
|
||||
<resource name="editor_undo">Sefsex {0}</resource>
|
||||
<resource name="editor_uponelevel">Rfed</resource>
|
||||
<resource name="editor_uptotop">Deg uɣawas amenzu</resource>
|
||||
<resource name="EmailFormat.MAPI">Amsaɣ MAPI</resource>
|
||||
<resource name="EmailFormat.OUTLOOK_HTML">Outlook s HTML</resource>
|
||||
<resource name="EmailFormat.OUTLOOK_TXT">Outlook s uḍris</resource>
|
||||
<resource name="error">Tuccḍa</resource>
|
||||
<resource name="error_multipleinstances">Tummant n Greenshot tettuselkam yakan.</resource>
|
||||
<resource name="error_nowriteaccess">Ur izmir ara ad isekles afaylu ara {0}.
|
||||
Ma ulac aɣilif senqed tuffart n ukaram n usekles.</resource>
|
||||
<resource name="error_openfile">afaylu "{0}" ur izmir ara ad yettwaldi.</resource>
|
||||
<resource name="error_openlink">Ur izmir ara ad d-yelid aseɣwen '{0}'.</resource>
|
||||
<resource name="error_save">Ur izmir ara ad isekles tuṭṭfa n ugdil. Ma ulac aɣilif, aff-d akaram ilaqen !</resource>
|
||||
<resource name="error_save_invalid_chars">Isem n ukaram neɣ isem n ufaylu yettusirwen mačči d ameɣtu. Seɣti taneɣruft n yisem n ufaylu, sakin ɛreḍ tikelt-nniḍen.</resource>
|
||||
<resource name="expertsettings">Amazzag</resource>
|
||||
<resource name="expertsettings_autoreducecolors">Tugna s 8 s ibiten ma yella amḍan n initen < 256 i tugna n > 8 n ibiten</resource>
|
||||
<resource name="expertsettings_checkunstableupdates">Senqed ileqman urkiden</resource>
|
||||
<resource name="expertsettings_clipboardformats">Imasalen n ɣef afus</resource>
|
||||
<resource name="expertsettings_counter">Amḍan i $(NUM) di tneɣruft n ufaylu</resource>
|
||||
<resource name="expertsettings_enableexpert">Ẓriɣ d acu xeddmeɣ!</resource>
|
||||
<resource name="expertsettings_footerpattern">Taneɣruft n uḍar n usebter</resource>
|
||||
<resource name="expertsettings_minimizememoryfootprint">Adsil n tkatut yettusemẓi, acukan timellit tuder (ur lhi ara).</resource>
|
||||
<resource name="expertsettings_optimizeforrdp">Asesfer i useqdec s tnarit tanmeggagt</resource>
|
||||
<resource name="expertsettings_reuseeditorifpossible">Seqdec amaẓrag ma tzemreḍ</resource>
|
||||
<resource name="expertsettings_suppresssavedialogatclose">Kkes asfaylu n udiwenni n usekles deg umdal n umazrag</resource>
|
||||
<resource name="expertsettings_thumbnailpreview">Asfaylu aqmamaḍ deg umuɣ asatal (i Windows Vista akked Windows 7)</resource>
|
||||
<resource name="exported_to">Yettusifeḍ ar : {0}</resource>
|
||||
<resource name="exported_to_error">Teḍra-d tuccḍa deg usifeḍ n {0} :</resource>
|
||||
<resource name="help_title">Tallalt n Greenshot</resource>
|
||||
<resource name="hotkeys">Inegzumen n unasiw</resource>
|
||||
<resource name="jpegqualitydialog_choosejpegquality">Ma ulac aɣilif, fren taɣara n tugna JPEG.</resource>
|
||||
<resource name="OK">Ih</resource>
|
||||
<resource name="print_error">Teḍra-d tuccḍa deeg usiggez.</resource>
|
||||
<resource name="printoptions_allowcenter">Slemmes ɣef usebter</resource>
|
||||
<resource name="printoptions_allowenlarge">Sehrew ar tisektiwin n usebter</resource>
|
||||
<resource name="printoptions_allowrotate">Zzi tasaggazt akken tella tnila n usebter</resource>
|
||||
<resource name="printoptions_allowshrink">Senɣes ar tsektiwin n usebter</resource>
|
||||
<resource name="printoptions_colors">Iɣewwaṛen n usiggez s yiniten</resource>
|
||||
<resource name="printoptions_dontaskagain">Sekles iɣewwaṛen amzun d azalen imezwar, ur d-sutur ara tikelt nniḍen.</resource>
|
||||
<resource name="printoptions_inverted">Siggez s tuttya n yiniten</resource>
|
||||
<resource name="printoptions_layout">Iɣewwaṛen n trusi n usebter</resource>
|
||||
<resource name="printoptions_printcolor">Asiggez s initen</resource>
|
||||
<resource name="printoptions_printgrayscale">Sekmer asiggez s uswir n tfesniwin n umumad</resource>
|
||||
<resource name="printoptions_printmonochrome">Sekmer asiggez s aberkan/amellal</resource>
|
||||
<resource name="printoptions_timestamp">Siggez azemz d wakud deg uḍaṛ n usebter</resource>
|
||||
<resource name="printoptions_title">Greenshot - Iɣewwaṛen n tsaggazt</resource>
|
||||
<resource name="qualitydialog_dontaskagain">Sekles am tɣara tamezwert udiɣ ur d(sutur ara tikelt-nniḍen</resource>
|
||||
<resource name="qualitydialog_title">Greenshot - Taɣara</resource>
|
||||
<resource name="quicksettings_destination_file">Sekles srid (seqdec iɣewwaṛen n tuffɣa)</resource>
|
||||
<resource name="settings_alwaysshowprintoptionsdialog">Sken srid asfaylu n udiwenni n usiggez.</resource>
|
||||
<resource name="settings_alwaysshowqualitydialog">Sken asfaylu n udiwenni n tɣaṛa n yal asekles</resource>
|
||||
<resource name="settings_applicationsettings">Iɣewwaṛen n usnas</resource>
|
||||
<resource name="settings_autostartshortcut">Senker Greenshot di tnekra n Windows</resource>
|
||||
<resource name="settings_capture">Tuṭṭfa</resource>
|
||||
<resource name="settings_capture_mousepointer">Ṭṭef taḥnaccaṭ n tɣerdayt</resource>
|
||||
<resource name="settings_capture_windows_interactive">Seqdec askar amyigawan n tuṭṭfa n usfaylu</resource>
|
||||
<resource name="settings_checkperiod">Azilal n usenqed n ileqman s wussan (0=ulac usenqed)</resource>
|
||||
<resource name="settings_configureplugin">Swel</resource>
|
||||
<resource name="settings_copypathtoclipboard">Nɣel abrid ar ufaylu ɣef afus di yal asekles</resource>
|
||||
<resource name="settings_destination">Taniɣert n tuṭṭfa n ugdil</resource>
|
||||
<resource name="settings_destination_clipboard">Ɣef afus</resource>
|
||||
<resource name="settings_destination_editor">Ldi deg umaẓrag n tugniwin</resource>
|
||||
<resource name="settings_destination_email">Imayl</resource>
|
||||
<resource name="settings_destination_file">Sekles s srid (s useqdec n iɣewwaṛen daw-a)</resource>
|
||||
<resource name="settings_destination_fileas">Sekles s yisem (sken asfaylu n udiwenni)</resource>
|
||||
<resource name="settings_destination_picker">Fren taniɣert tamussant</resource>
|
||||
<resource name="settings_destination_printer">Ar tsaggazt</resource>
|
||||
<resource name="settings_editor">Amaẓrag</resource>
|
||||
<resource name="settings_filenamepattern">Taneɣruft n ufaylu</resource>
|
||||
<resource name="settings_general">Amatu</resource>
|
||||
<resource name="settings_iconsize">Teɣzi n tignitin</resource>
|
||||
<resource name="settings_iecapture">Tuṭṭfa n Internet Explorer</resource>
|
||||
<resource name="settings_jpegquality">Taɣara JPEG</resource>
|
||||
<resource name="settings_language">Tutlayt</resource>
|
||||
<resource name="settings_message_filenamepattern">Imuttiyen-agi ad ttwasemselsin s wudem awurman di tneqruft inek:
|
||||
${YYYY} aseggass s 4
|
||||
${MM} aggur s 2 n izwilen
|
||||
${DD} jass s 2 n izwilen
|
||||
${hh} asrag s n 2 izwilen
|
||||
${mm} tisdatin s 2 n izwilen
|
||||
${ss} tasinin s 2 n izwilen
|
||||
${NUM} Incrément sur 6 n izwilen
|
||||
${title} Azwel n usfaylu
|
||||
${user} isem n useqdac Windows
|
||||
${domain} Taɣult Windows
|
||||
${hostname} Isem n usenneftaɣ n uselkim
|
||||
|
||||
Tzemreḍ daɣen ad teǧǧeḍ Greenshot ad yernu ikaramen s wudem amussan, s useqdec n uslac(\) akken ad tfeṛqeḍ gar ikaramen aekked ifuyla.
|
||||
Amedya: taneqruft ${YYYY}-${MM}-${DD}\${hh}-${mm}-${ss}
|
||||
ad yernu akaram i wass amiran deg adig n usekles amezwer, amedya 2008-06-29, isem n ufaylu igebren tuṭṭfa n ugdil ad tettwabnu qef usrag
|
||||
amiran, amedya 11_58_32 (akked usiɣzef yettwamlen deg iɣewwaṛen)</resource>
|
||||
<resource name="settings_network">Aẓeṭṭa akked ileqman</resource>
|
||||
<resource name="settings_output">Tuffɣa</resource>
|
||||
<resource name="settings_playsound">Urar imesli n usagu n tewlafin</resource>
|
||||
<resource name="settings_plugins">Isiɣzaf</resource>
|
||||
<resource name="settings_plugins_createdby">Yerna-t</resource>
|
||||
<resource name="settings_plugins_dllpath">Abrid DLL</resource>
|
||||
<resource name="settings_plugins_name">Isem</resource>
|
||||
<resource name="settings_plugins_version">Lqem</resource>
|
||||
<resource name="settings_preferredfilesettings">Ismenyifen n usekles</resource>
|
||||
<resource name="settings_primaryimageformat">Amasal n tugna</resource>
|
||||
<resource name="settings_printer">Tasaggazt</resource>
|
||||
<resource name="settings_printoptions">Iɣewwaṛen n usiggez</resource>
|
||||
<resource name="settings_qualitysettings">Iɣewwaṛen n tɣara</resource>
|
||||
<resource name="settings_reducecolors">Senɣes amḍan n yiniten ar 256 ma yela aṭas</resource>
|
||||
<resource name="settings_registerhotkeys">Sekles inegzumen n unasiw</resource>
|
||||
<resource name="settings_showflashlight">Zlem agdil</resource>
|
||||
<resource name="settings_shownotify">Sken alɣu</resource>
|
||||
<resource name="settings_storagelocation">Sniles asekles</resource>
|
||||
<resource name="settings_title">Iɣewwaṛen</resource>
|
||||
<resource name="settings_tooltip_filenamepattern">Taneɣruft yettwasqedcen i usirew n yesmawen n ifuyla deg usekles n tuṭṭfiwin n ugdil</resource>
|
||||
<resource name="settings_tooltip_language">Tutlayt tamezwert n ugrudem n useqdac n Greenshot</resource>
|
||||
<resource name="settings_tooltip_primaryimageformat">Amasal n tugna tamezwert</resource>
|
||||
<resource name="settings_tooltip_registerhotkeys">Ad d-yemmel ma yellai negzumen n unasiw Sigg. agd, Ctrl+Sigg. agdil, Alt+Sigg. agdil ttwaḥerren i Greenshot ticki yettuselkam.</resource>
|
||||
<resource name="settings_tooltip_storagelocation">Akaram anida ttwakelsent tuṭṭfiwin inek n ugdil. (Eǧǧ-it d ilem akken ad tseklseḍ ɣef tnarit)</resource>
|
||||
<resource name="settings_usedefaultproxy">Seqdec apṛuksi n unagraw amezwer</resource>
|
||||
<resource name="settings_visualization">Isemda</resource>
|
||||
<resource name="settings_waittime">Millitasinin n uraǧu send tuṭṭfa</resource>
|
||||
<resource name="settings_window_capture_mode">Aska n tuṭṭfa n usfaylu (aɣanib Aero)</resource>
|
||||
<resource name="settings_windowscapture">Ṭṭef asfaylu urmid</resource>
|
||||
<resource name="settings_zoom">Sken tasemɣart</resource>
|
||||
<resource name="tooltip_firststart">Sit s tqeffalt n uyeffus dagi sakin senned ɣef tqeffalt {0}.</resource>
|
||||
<resource name="update_found">Yella lqem-nniḍen n Greenshot! Tebɣid ad tsidreḍ Greenshot {0} ?</resource>
|
||||
<resource name="wait_ie_capture">Ma ulac aɣilif, rǧu arama tfuk tuṭṭfa n ugdil n usebter Internet Explorer...</resource>
|
||||
<resource name="warning">Ɣur-k</resource>
|
||||
<resource name="warning_hotkeys">Anegzum n unasiw "{0}" ur yettwakles ara. Ugur-agi ahat yekka-d seg ufecku-nniḍen iseqdacen yiwen n unegzum n unasiw. Tzemreḍ ahat ad tesnifleḍ inegzumen inek n unasiw neɣ ad tsenseḍ/ad tesnifleḍ aseɣẓan iseqdacen anegzum.
|
||||
|
||||
Akk timahilin n Greenshot sttenkarent daɣen s srid seg umuɣ umniḍ n tignit n temnaṭ n ulɣu n unagraw.</resource>
|
||||
<resource name="WindowCaptureMode.Aero">Seqdec ini udmawan</resource>
|
||||
<resource name="WindowCaptureMode.AeroTransparent">Ḥrez tafrawant</resource>
|
||||
<resource name="WindowCaptureMode.Auto">Awurman</resource>
|
||||
<resource name="WindowCaptureMode.GDI">Seqdec ini amezwer</resource>
|
||||
<resource name="WindowCaptureMode.Screen">Akken i d-yettban</resource>
|
||||
</resources>
|
||||
</language>
|
|
@ -9,6 +9,38 @@ All details to our tickets can be found here: https://greenshot.atlassian.net
|
|||
|
||||
@DETAILVERSION@
|
||||
|
||||
Bugs fixed:
|
||||
* [BUG-2051] - Scroll-lock button not usable as hotkey
|
||||
* [BUG-2056] - Cannot export to external command Paint.NET if .greenshot format is used
|
||||
* [BUG-2081] - Canvas resize (Ctrl + / Ctrl -) only works via numpad keys
|
||||
* [BUG-2093] - Shadow effects not rendering correctly on Windows 10
|
||||
* [BUG-2095] - 'Save as' doesn't remember last saved directory (after restart)
|
||||
* [BUG-2097] - Window border is not captured on Windows 10
|
||||
* [BUG-2102] - InvalidOperationException when selecting a color
|
||||
* [BUG-2104] - Speechbubble can't be used after copy/paste
|
||||
* [BUG-2105] - Window border is not captured on Windows 10
|
||||
* [BUG-2108] - Capture last region doesn't work
|
||||
* [BUG-2109] - Double-click on textbox causes NullReferenceException
|
||||
* [BUG-2111] - Drag and Drop image file on editor doesn't work
|
||||
* [BUG-2114] - Storage location reset to default if not available during start
|
||||
* [BUG-2115] - Error while trying to upload screen shot to Jira
|
||||
* [BUG-2116] - MemberAccessException when opening the color dialog
|
||||
* [BUG-2119] - crash on editing (dragged line)
|
||||
* [BUG-2120] - Greenshot Editor Canvas Changed to White Screen
|
||||
* [BUG-2121] - NullReferenceException when moving text
|
||||
* [BUG-2122] - Jira Plugin: Crash when uploading to Jira
|
||||
* [BUG-2124] - Flickr plugin generates wrong image link
|
||||
* [BUG-2125] - Send to OneNote does not work
|
||||
* [BUG-2126] - MemberAccessException during un-DropShadow of Ellipse
|
||||
* [FEATURE-998] - Opening last capture in explorer should select/jump to the file
|
||||
* [FEATURE-992] - When reusing the editor, it is not brought to the front (second try)
|
||||
|
||||
Added Taqbaylit as a new language.
|
||||
|
||||
|
||||
1.2.9.112-9bc62ac RELEASE
|
||||
|
||||
|
||||
This is a bugfix release for the Greenshot 1.2.9.104-3721c10 RELEASE
|
||||
|
||||
Bugs fixed:
|
||||
|
|
|
@ -50,6 +50,7 @@ Source: ..\..\Languages\*id-ID*; Excludes: "*installer*,*website*"; DestDir: {ap
|
|||
Source: ..\..\Languages\*it-IT*; Excludes: "*installer*,*website*"; DestDir: {app}\Languages; Components: languages\itIT; Flags: overwritereadonly ignoreversion replacesameversion;
|
||||
Source: ..\..\Languages\*ja-JP*; Excludes: "*installer*,*website*"; DestDir: {app}\Languages; Components: languages\jaJP; Flags: overwritereadonly ignoreversion replacesameversion;
|
||||
Source: ..\..\Languages\*ko-KR*; Excludes: "*installer*,*website*"; DestDir: {app}\Languages; Components: languages\koKR; Flags: overwritereadonly ignoreversion replacesameversion;
|
||||
Source: ..\..\Languages\*kab-DZ*; Excludes: "*installer*,*website*"; DestDir: {app}\Languages; Components: languages\kabDZ; Flags: overwritereadonly ignoreversion replacesameversion;
|
||||
Source: ..\..\Languages\*lt-LT*; Excludes: "*installer*,*website*"; DestDir: {app}\Languages; Components: languages\ltLT; Flags: overwritereadonly ignoreversion replacesameversion;
|
||||
Source: ..\..\Languages\*lv-LV*; Excludes: "*installer*,*website*"; DestDir: {app}\Languages; Components: languages\lvLV; Flags: overwritereadonly ignoreversion replacesameversion;
|
||||
Source: ..\..\Languages\*nn-NO*; Excludes: "*installer*,*website*"; DestDir: {app}\Languages; Components: languages\nnNO; Flags: overwritereadonly ignoreversion replacesameversion;
|
||||
|
@ -391,6 +392,7 @@ Name: "languages\idID"; Description: "Bahasa Indonesia"; Types: full custom; Fla
|
|||
Name: "languages\itIT"; Description: "Italiano"; Types: full custom; Flags: disablenouninstallwarning; Check: hasLanguageGroup('1')
|
||||
Name: "languages\jaJP"; Description: "日本語"; Types: full custom; Flags: disablenouninstallwarning; Check: hasLanguageGroup('7')
|
||||
Name: "languages\koKR"; Description: "한국의"; Types: full custom; Flags: disablenouninstallwarning; Check: hasLanguageGroup('8')
|
||||
Name: "languages\kabDZ"; Description: "Taqbaylit"; Types: full custom; Flags: disablenouninstallwarning; Check: hasLanguageGroup('8')
|
||||
Name: "languages\ltLT"; Description: "Lietuvių"; Types: full custom; Flags: disablenouninstallwarning; Check: hasLanguageGroup('3')
|
||||
Name: "languages\lvLV"; Description: "Latviski"; Types: full custom; Flags: disablenouninstallwarning; Check: hasLanguageGroup('3')
|
||||
Name: "languages\nnNO"; Description: "Nynorsk"; Types: full custom; Flags: disablenouninstallwarning; Check: hasLanguageGroup('1')
|
||||
|
|
14
GreenshotBoxPlugin/Languages/language_boxplugin-kab-DZ.xml
Normal file
14
GreenshotBoxPlugin/Languages/language_boxplugin-kab-DZ.xml
Normal file
|
@ -0,0 +1,14 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<language description="Taqbaylit" ietf="kab-DZ" version="1.0.0" languagegroup="">
|
||||
<resources>
|
||||
<resource name="communication_wait">Taɣwaylt tetteddu akked umeẓlu n usekles s srid. Ṛǧu ma ulac aɣilif...</resource>
|
||||
<resource name="Configure">Swel Box</resource>
|
||||
<resource name="label_AfterUpload">Deffir n usider/asali</resource>
|
||||
<resource name="label_AfterUploadLinkToClipBoard">Nɣel aseɣwen ɣef afus</resource>
|
||||
<resource name="label_upload_format">Amasal tugna</resource>
|
||||
<resource name="settings_title">Iɣewwaṛen n usekles s srid</resource>
|
||||
<resource name="upload_failure">Teḍra-d tuccḍa deg usali ɣer usekles s srid :</resource>
|
||||
<resource name="upload_menu_item">Sali ɣer usekles s srid</resource>
|
||||
<resource name="upload_success">Tugna tuli ɣer usekles srid !</resource>
|
||||
</resources>
|
||||
</language>
|
|
@ -0,0 +1,29 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<language description="Taqbaylit" ietf="kab-DZ" version="1.0.0" languagegroup="">
|
||||
<resources>
|
||||
<resource name="browse_pages">Inig</resource>
|
||||
<resource name="CANCEL">Sefsex</resource>
|
||||
<resource name="copy_wikimarkup">Nɣel Wikimarkup ɣef afus</resource>
|
||||
<resource name="filename">Afaylu</resource>
|
||||
<resource name="include_person_spaces">Seddu imeḍqan idiganen deg unagi akked tunigin</resource>
|
||||
<resource name="label_password">Awal uffir</resource>
|
||||
<resource name="label_timeout">Akud n uṛaǧu</resource>
|
||||
<resource name="label_url">Tansa Url</resource>
|
||||
<resource name="label_user">Aseqdac</resource>
|
||||
<resource name="loading">Aggway n isefka n Confluence, Rǧu ma ulac aɣilif...</resource>
|
||||
<resource name="login_error">Teḍra-d tuccḍa deg usesteb : {0}</resource>
|
||||
<resource name="login_title">Sekcem ma ulac aɣilif, isefka yinek n usesteb confluence</resource>
|
||||
<resource name="OK">Ih</resource>
|
||||
<resource name="open_page_after_upload">Ldi asebter ticki yemmed usali</resource>
|
||||
<resource name="open_pages">Ldi isebtar</resource>
|
||||
<resource name="plugin_settings">Iɣewwaṛen n Confluence</resource>
|
||||
<resource name="search">Nadi</resource>
|
||||
<resource name="search_pages">Nadi deg isebtar</resource>
|
||||
<resource name="search_text">Nadi aḍris</resource>
|
||||
<resource name="upload">Sali</resource>
|
||||
<resource name="upload_failure">Teḍra-d tuccḍa deg usali ɣer Confluence :</resource>
|
||||
<resource name="upload_format">Sali amasal</resource>
|
||||
<resource name="upload_menu_item">Sali ɣef Confluence</resource>
|
||||
<resource name="upload_success">Tugna tuli ɣer Confluence !</resource>
|
||||
</resources>
|
||||
</language>
|
|
@ -0,0 +1,14 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<language description="Taqbaylit" ietf="kab-DZ" version="1.0.0" languagegroup="">
|
||||
<resources>
|
||||
<resource name="communication_wait">Taɣwalt tetteddu akked Dropbox. Ṛǧu ma ulac aɣilif...</resource>
|
||||
<resource name="Configure">Swel Dropbox</resource>
|
||||
<resource name="label_AfterUpload">Ticki yemmad usali</resource>
|
||||
<resource name="label_AfterUploadLinkToClipBoard">Nɣel aseɣwen ɣef afus</resource>
|
||||
<resource name="label_upload_format">Amasal tugna</resource>
|
||||
<resource name="settings_title">Iɣewwaṛen n Dropbox</resource>
|
||||
<resource name="upload_failure">Teḍra-d tuccḍa deg usali ɣer Dropbox :</resource>
|
||||
<resource name="upload_menu_item">Sali ɣer Dropbox</resource>
|
||||
<resource name="upload_success">Tugna tuli ɣer Dropbox !</resource>
|
||||
</resources>
|
||||
</language>
|
|
@ -43,33 +43,21 @@ namespace ExternalCommand {
|
|||
_presetCommand = commando;
|
||||
}
|
||||
|
||||
public override string Designation {
|
||||
get {
|
||||
return "External " + _presetCommand.Replace(',','_');
|
||||
}
|
||||
}
|
||||
public override string Designation => "External " + _presetCommand.Replace(',','_');
|
||||
|
||||
public override string Description {
|
||||
get {
|
||||
return _presetCommand;
|
||||
}
|
||||
}
|
||||
public override string Description => _presetCommand;
|
||||
|
||||
public override IEnumerable<IDestination> DynamicDestinations() {
|
||||
yield break;
|
||||
}
|
||||
|
||||
public override Image DisplayIcon {
|
||||
get {
|
||||
return IconCache.IconForCommand(_presetCommand);
|
||||
}
|
||||
}
|
||||
public override Image DisplayIcon => IconCache.IconForCommand(_presetCommand);
|
||||
|
||||
public override ExportInformation ExportCapture(bool manuallyInitiated, ISurface surface, ICaptureDetails captureDetails) {
|
||||
ExportInformation exportInformation = new ExportInformation(Designation, Description);
|
||||
SurfaceOutputSettings outputSettings = new SurfaceOutputSettings();
|
||||
outputSettings.PreventGreenshotFormat();
|
||||
|
||||
|
||||
if (_presetCommand != null) {
|
||||
if (!config.RunInbackground.ContainsKey(_presetCommand)) {
|
||||
config.RunInbackground.Add(_presetCommand, true);
|
||||
|
@ -154,12 +142,12 @@ namespace ExternalCommand {
|
|||
private int CallExternalCommand(string commando, string fullPath, out string output, out string error) {
|
||||
try {
|
||||
return CallExternalCommand(commando, fullPath, null, out output, out error);
|
||||
} catch (Win32Exception w32ex) {
|
||||
} catch (Win32Exception w32Ex) {
|
||||
try {
|
||||
return CallExternalCommand(commando, fullPath, "runas", out output, out error);
|
||||
} catch {
|
||||
w32ex.Data.Add("commandline", config.Commandline[_presetCommand]);
|
||||
w32ex.Data.Add("arguments", config.Argument[_presetCommand]);
|
||||
w32Ex.Data.Add("commandline", config.Commandline[_presetCommand]);
|
||||
w32Ex.Data.Add("arguments", config.Argument[_presetCommand]);
|
||||
throw;
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
|
|
|
@ -0,0 +1,35 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<language description="Taqbaylit" ietf="kab-DZ" version="1.0.0">
|
||||
<resources>
|
||||
<resource name="contextmenu_configure">
|
||||
Tawila n tludna tizɣaṛayin
|
||||
</resource>
|
||||
<resource name="settings_title">
|
||||
Tawila n tladna tazɣarayt
|
||||
</resource>
|
||||
<resource name="settings_detail_title">
|
||||
Tawila n tladna
|
||||
</resource>
|
||||
<resource name="settings_new">
|
||||
Amaynut
|
||||
</resource>
|
||||
<resource name="settings_delete">
|
||||
Kkes
|
||||
</resource>
|
||||
<resource name="settings_edit">
|
||||
Ẓreg
|
||||
</resource>
|
||||
<resource name="label_name">
|
||||
Isem
|
||||
</resource>
|
||||
<resource name="label_command">
|
||||
Taladna
|
||||
</resource>
|
||||
<resource name="label_argument">
|
||||
Tiɣira
|
||||
</resource>
|
||||
<resource name="label_information">
|
||||
{0} d isem n ufaylu n tuṭṭfa yinek n ugdil
|
||||
</resource>
|
||||
</resources>
|
||||
</language>
|
|
@ -42,7 +42,7 @@ namespace GreenshotFlickrPlugin {
|
|||
private const string FLICKR_ACCESS_TOKEN_URL = FLICKR_OAUTH_BASE_URL + "access_token";
|
||||
private const string FLICKR_AUTHORIZE_URL = FLICKR_OAUTH_BASE_URL + "authorize";
|
||||
private const string FLICKR_REQUEST_TOKEN_URL = FLICKR_OAUTH_BASE_URL + "request_token";
|
||||
private const string FLICKR_FARM_URL = "https://farm{0}.staticflickr.com/{1}/{2}_{3}.jpg";
|
||||
private const string FLICKR_FARM_URL = "https://farm{0}.staticflickr.com/{1}/{2}_{3}_o.{4}";
|
||||
// REST
|
||||
private const string FLICKR_REST_URL = FLICKR_API_BASE_URL + "rest/";
|
||||
private const string FLICKR_GET_INFO_URL = FLICKR_REST_URL + "?method=flickr.photos.getInfo";
|
||||
|
@ -131,8 +131,9 @@ namespace GreenshotFlickrPlugin {
|
|||
string farmId = item.Attributes["farm"].Value;
|
||||
string serverId = item.Attributes["server"].Value;
|
||||
string photoId = item.Attributes["id"].Value;
|
||||
string secret = item.Attributes["secret"].Value;
|
||||
return string.Format(FLICKR_FARM_URL, farmId, serverId, photoId, secret);
|
||||
string originalsecret = item.Attributes["originalsecret"].Value;
|
||||
string originalFormat = item.Attributes["originalformat"].Value;
|
||||
return string.Format(FLICKR_FARM_URL, farmId, serverId, photoId, originalsecret, originalFormat);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,47 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<language description="Taqbaylit" ietf="kab-DZ" version="1.2.0.58" languagegroup="1">
|
||||
<resources prefix="Flickr">
|
||||
<resource name="label_HiddenFromSearch">
|
||||
Yettwaffer seg unadi
|
||||
</resource>
|
||||
<resource name="label_SafetyLevel">
|
||||
Aswir aɣelsan
|
||||
</resource>
|
||||
<resource name="label_AfterUploadLinkToClipBoard">
|
||||
Cudd ɣef afus
|
||||
</resource>
|
||||
<resource name="label_AfterUpload">
|
||||
Seld asali
|
||||
</resource>
|
||||
<resource name="Configure">
|
||||
Swel Flickr
|
||||
</resource>
|
||||
<resource name="upload_menu_item">
|
||||
Sali ar Flickr
|
||||
</resource>
|
||||
<resource name="settings_title">
|
||||
Iɣewwaṛen n Flickr
|
||||
</resource>
|
||||
<resource name="upload_success">
|
||||
Tugna tuli akken iwata ar Flickr!
|
||||
</resource>
|
||||
<resource name="upload_failure">
|
||||
Teḍra-d tuccḍa deg usali ar Flickr:
|
||||
</resource>
|
||||
<resource name="label_upload_format">
|
||||
Amasal n tugna
|
||||
</resource>
|
||||
<resource name="communication_wait">
|
||||
Taɣwalt tetteddu akked Flickr. Rǧu ma ulac aɣilif...
|
||||
</resource>
|
||||
<resource name="public">
|
||||
Azayez
|
||||
</resource>
|
||||
<resource name="family">
|
||||
Tawacult
|
||||
</resource>
|
||||
<resource name="friend">
|
||||
Amdakkel
|
||||
</resource>
|
||||
</resources>
|
||||
</language>
|
|
@ -0,0 +1,53 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<language description="Taqbaylit" ietf="kab-DZ" version="1.2.0.58" languagegroup="1">
|
||||
<resources prefix="Imgur">
|
||||
<resource name="upload_menu_item">
|
||||
Sali ar Imgur
|
||||
</resource>
|
||||
<resource name="settings_title">
|
||||
Iɣewwaṛen n Imgur
|
||||
</resource>
|
||||
<resource name="label_url">
|
||||
Tansa Url
|
||||
</resource>
|
||||
<resource name="OK">
|
||||
IH
|
||||
</resource>
|
||||
<resource name="CANCEL">
|
||||
Sefsex
|
||||
</resource>
|
||||
<resource name="upload_success">
|
||||
Tugna tuli akken i wata ar Imgur!
|
||||
</resource>
|
||||
<resource name="upload_failure">
|
||||
Teḍra-d tuccḍa deg usali ar Imgur:
|
||||
</resource>
|
||||
<resource name="label_upload_format">
|
||||
Amasal n tugna
|
||||
</resource>
|
||||
<resource name="communication_wait">
|
||||
Taɣwalt tetteddu akked Imgur. Ma ulac aɣilif, ṛǧu...
|
||||
</resource>
|
||||
<resource name="delete_question">
|
||||
Tebɣiḍ ad tekksed tugna {0} si Imgur?
|
||||
</resource>
|
||||
<resource name="clear_question">
|
||||
Tebɣiḍ ad tekkseḍ Are you sure you want to delete the local Imgur history?
|
||||
</resource>
|
||||
<resource name="delete_title">
|
||||
Kkes Imgur {0}
|
||||
</resource>
|
||||
<resource name="anonymous_access">
|
||||
Seqdec anekcum udrig
|
||||
</resource>
|
||||
<resource name="use_page_link">
|
||||
Seqdec aseɣwen n usebter deg umḍiq n useɣwenn tuggna ɣef afus
|
||||
</resource>
|
||||
<resource name="history">
|
||||
Amazray
|
||||
</resource>
|
||||
<resource name="configure">
|
||||
Swel
|
||||
</resource>
|
||||
</resources>
|
||||
</language>
|
|
@ -29,7 +29,7 @@ using System;
|
|||
using System.Runtime.Caching;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using Dapplo.Log.Facade;
|
||||
using Dapplo.Log;
|
||||
|
||||
#endregion
|
||||
|
||||
|
|
|
@ -36,7 +36,6 @@ namespace GreenshotJiraPlugin.Forms {
|
|||
private readonly JiraConnector _jiraConnector;
|
||||
private Issue _selectedIssue;
|
||||
private readonly GreenshotColumnSorter _columnSorter;
|
||||
private static readonly JiraConfiguration JiraConfig = IniConfig.GetIniSection<JiraConfiguration>();
|
||||
private static readonly CoreConfiguration CoreConfig = IniConfig.GetIniSection<CoreConfiguration>();
|
||||
|
||||
public JiraForm(JiraConnector jiraConnector) {
|
||||
|
@ -161,14 +160,21 @@ namespace GreenshotJiraPlugin.Forms {
|
|||
jiraListView.LargeImageList = imageList;
|
||||
|
||||
foreach (var issue in issues) {
|
||||
var issueIcon = await _jiraConnector.GetIssueTypeBitmapAsync(issue);
|
||||
imageList.Images.Add(issueIcon);
|
||||
|
||||
var item = new ListViewItem
|
||||
{
|
||||
Tag = issue,
|
||||
ImageIndex = imageList.Images.Count - 1
|
||||
Tag = issue
|
||||
};
|
||||
try
|
||||
{
|
||||
var issueIcon = await _jiraConnector.GetIssueTypeBitmapAsync(issue);
|
||||
imageList.Images.Add(issueIcon);
|
||||
item.ImageIndex = imageList.Images.Count - 1;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.Warn("Problem loading issue type, ignoring", ex);
|
||||
}
|
||||
|
||||
item.SubItems.Add(issue.Key);
|
||||
item.SubItems.Add(issue.Fields.Created.ToString("d", DateTimeFormatInfo.InvariantInfo));
|
||||
item.SubItems.Add(issue.Fields.Assignee?.DisplayName);
|
||||
|
|
|
@ -34,32 +34,42 @@
|
|||
</PropertyGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
|
||||
<ItemGroup>
|
||||
<Reference Include="Dapplo.HttpExtensions, Version=0.5.43.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Dapplo.HttpExtensions.0.5.43\lib\net45\Dapplo.HttpExtensions.dll</HintPath>
|
||||
<Reference Include="Dapplo.HttpExtensions, Version=0.6.17.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Dapplo.HttpExtensions.0.6.17\lib\net45\Dapplo.HttpExtensions.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="Dapplo.Jira, Version=0.1.65.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Dapplo.Jira.0.1.65\lib\net45\Dapplo.Jira.dll</HintPath>
|
||||
<Reference Include="Dapplo.Jira, Version=0.5.12.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Dapplo.Jira.0.5.12\lib\net45\Dapplo.Jira.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="Dapplo.Log.Facade, Version=0.5.4.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Dapplo.Log.Facade.0.5.4\lib\net45\Dapplo.Log.Facade.dll</HintPath>
|
||||
<Reference Include="Dapplo.Log, Version=1.0.23.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Dapplo.Log.1.0.23\lib\net45\Dapplo.Log.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="log4net">
|
||||
<HintPath>..\Greenshot\Lib\log4net.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Svg, Version=2.2.1.38382, Culture=neutral, PublicKeyToken=12a0bac221edeae2, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Svg.2.2.2\lib\net35\Svg.dll</HintPath>
|
||||
<Reference Include="Microsoft.VisualBasic" />
|
||||
<Reference Include="PresentationCore" />
|
||||
<Reference Include="PresentationFramework" />
|
||||
<Reference Include="Svg, Version=2.2.1.39233, Culture=neutral, PublicKeyToken=12a0bac221edeae2, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Svg.2.3.0\lib\net35\Svg.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.ComponentModel.DataAnnotations" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Net.Http" />
|
||||
<Reference Include="System.Net.Http.WebRequest" />
|
||||
<Reference Include="System.Runtime.Caching" />
|
||||
<Reference Include="System.Runtime.Serialization" />
|
||||
<Reference Include="System.ServiceModel" />
|
||||
<Reference Include="System.Web.Services" />
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<Reference Include="System.Xaml" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="WindowsBase" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="AsyncMemoryCache.cs" />
|
||||
|
@ -94,7 +104,6 @@
|
|||
<Compile Include="LanguageKeys.cs" />
|
||||
<Compile Include="Log4NetLogger.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="SvgBitmapHttpContentConverter.cs" />
|
||||
<Compile Include="SvgImage.cs" />
|
||||
<None Include="Languages\language_jiraplugin-de-DE.xml">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
|
|
|
@ -33,11 +33,11 @@ namespace GreenshotJiraPlugin
|
|||
/// </summary>
|
||||
public class IssueTypeBitmapCache : AsyncMemoryCache<IssueType, Bitmap>
|
||||
{
|
||||
private readonly JiraApi _jiraApi;
|
||||
private readonly IJiraClient _jiraClient;
|
||||
|
||||
public IssueTypeBitmapCache(JiraApi jiraApi)
|
||||
public IssueTypeBitmapCache(IJiraClient jiraClient)
|
||||
{
|
||||
_jiraApi = jiraApi;
|
||||
_jiraClient = jiraClient;
|
||||
// Set the expire timeout to an hour
|
||||
ExpireTimeSpan = TimeSpan.FromHours(4);
|
||||
}
|
||||
|
@ -49,7 +49,7 @@ namespace GreenshotJiraPlugin
|
|||
|
||||
protected override async Task<Bitmap> CreateAsync(IssueType issueType, CancellationToken cancellationToken = new CancellationToken())
|
||||
{
|
||||
return await _jiraApi.GetUriContentAsync<Bitmap>(issueType.IconUri, cancellationToken).ConfigureAwait(false);
|
||||
return await _jiraClient.Server.GetUriContentAsync<Bitmap>(issueType.IconUri, cancellationToken).ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -24,19 +24,20 @@ using System;
|
|||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using Dapplo.HttpExtensions;
|
||||
using Dapplo.HttpExtensions.Extensions;
|
||||
using Dapplo.Jira;
|
||||
using Dapplo.Jira.Converters;
|
||||
using Dapplo.Jira.Entities;
|
||||
using Greenshot.IniFile;
|
||||
using GreenshotPlugin.Core;
|
||||
|
||||
namespace GreenshotJiraPlugin {
|
||||
/// <summary>
|
||||
/// This encapsulates the JiraApi to make it possible to change as less old Greenshot code as needed
|
||||
/// This encapsulates the JiraClient to make it possible to change as less old Greenshot code as needed
|
||||
/// </summary>
|
||||
public class JiraConnector : IDisposable {
|
||||
private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(JiraConnector));
|
||||
|
@ -47,27 +48,19 @@ namespace GreenshotJiraPlugin {
|
|||
private DateTimeOffset _loggedInTime = DateTimeOffset.MinValue;
|
||||
private bool _loggedIn;
|
||||
private readonly int _timeout;
|
||||
private JiraApi _jiraApi;
|
||||
private IJiraClient _jiraClient;
|
||||
private IssueTypeBitmapCache _issueTypeBitmapCache;
|
||||
private static readonly SvgBitmapHttpContentConverter SvgBitmapHttpContentConverterInstance = new SvgBitmapHttpContentConverter();
|
||||
|
||||
/// <summary>
|
||||
/// Initialize some basic stuff, in the case the SVG to bitmap converter
|
||||
/// </summary>
|
||||
static JiraConnector()
|
||||
{
|
||||
if (HttpExtensionsGlobals.HttpContentConverters.All(x => x.GetType() != typeof(SvgBitmapHttpContentConverter)))
|
||||
{
|
||||
HttpExtensionsGlobals.HttpContentConverters.Add(SvgBitmapHttpContentConverterInstance);
|
||||
}
|
||||
SvgBitmapHttpContentConverterInstance.Width = CoreConfig.IconSize.Width;
|
||||
SvgBitmapHttpContentConverterInstance.Height = CoreConfig.IconSize.Height;
|
||||
CoreConfig.PropertyChanged += (sender, args) =>
|
||||
{
|
||||
if (args.PropertyName == nameof(CoreConfig.IconSize))
|
||||
{
|
||||
SvgBitmapHttpContentConverterInstance.Width = CoreConfig.IconSize.Width;
|
||||
SvgBitmapHttpContentConverterInstance.Height = CoreConfig.IconSize.Height;
|
||||
JiraPlugin.Instance.JiraConnector._jiraClient?.Behaviour.SetConfig(new SvgConfiguration { Width = CoreConfig.IconSize.Width, Height = CoreConfig.IconSize.Height });
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -77,7 +70,7 @@ namespace GreenshotJiraPlugin {
|
|||
/// Dispose, logout the users
|
||||
/// </summary>
|
||||
public void Dispose() {
|
||||
if (_jiraApi != null)
|
||||
if (_jiraClient != null)
|
||||
{
|
||||
Task.Run(async () => await LogoutAsync()).Wait();
|
||||
}
|
||||
|
@ -104,25 +97,27 @@ namespace GreenshotJiraPlugin {
|
|||
/// Internal login which catches the exceptions
|
||||
/// </summary>
|
||||
/// <returns>true if login was done sucessfully</returns>
|
||||
private async Task<bool> DoLoginAsync(string user, string password)
|
||||
private async Task<bool> DoLoginAsync(string user, string password, CancellationToken cancellationToken = default(CancellationToken))
|
||||
{
|
||||
if (string.IsNullOrEmpty(user) || string.IsNullOrEmpty(password))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
_jiraApi = new JiraApi(new Uri(JiraConfig.Url));
|
||||
_issueTypeBitmapCache = new IssueTypeBitmapCache(_jiraApi);
|
||||
_jiraClient = JiraClient.Create(new Uri(JiraConfig.Url));
|
||||
_jiraClient.Behaviour.SetConfig(new SvgConfiguration { Width = CoreConfig.IconSize.Width, Height = CoreConfig.IconSize.Height });
|
||||
|
||||
_issueTypeBitmapCache = new IssueTypeBitmapCache(_jiraClient);
|
||||
LoginInfo loginInfo;
|
||||
try
|
||||
{
|
||||
loginInfo = await _jiraApi.StartSessionAsync(user, password);
|
||||
loginInfo = await _jiraClient.Session.StartAsync(user, password, cancellationToken);
|
||||
Monitor = new JiraMonitor();
|
||||
await Monitor.AddJiraInstanceAsync(_jiraApi);
|
||||
await Monitor.AddJiraInstanceAsync(_jiraClient, cancellationToken);
|
||||
|
||||
var favIconUri = _jiraApi.JiraBaseUri.AppendSegments("favicon.ico");
|
||||
var favIconUri = _jiraClient.JiraBaseUri.AppendSegments("favicon.ico");
|
||||
try
|
||||
{
|
||||
FavIcon = await _jiraApi.GetUriContentAsync<Bitmap>(favIconUri);
|
||||
FavIcon = await _jiraClient.Server.GetUriContentAsync<Bitmap>(favIconUri, cancellationToken);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
@ -142,8 +137,8 @@ namespace GreenshotJiraPlugin {
|
|||
/// If there are credentials, call the real login.
|
||||
/// </summary>
|
||||
/// <returns>Task</returns>
|
||||
public async Task LoginAsync() {
|
||||
await LogoutAsync();
|
||||
public async Task LoginAsync(CancellationToken cancellationToken = default(CancellationToken)) {
|
||||
await LogoutAsync(cancellationToken);
|
||||
try {
|
||||
// Get the system name, so the user knows where to login to
|
||||
var credentialsDialog = new CredentialsDialog(JiraConfig.Url)
|
||||
|
@ -151,7 +146,7 @@ namespace GreenshotJiraPlugin {
|
|||
Name = null
|
||||
};
|
||||
while (credentialsDialog.Show(credentialsDialog.Name) == DialogResult.OK) {
|
||||
if (await DoLoginAsync(credentialsDialog.Name, credentialsDialog.Password)) {
|
||||
if (await DoLoginAsync(credentialsDialog.Name, credentialsDialog.Password, cancellationToken)) {
|
||||
if (credentialsDialog.SaveChecked) {
|
||||
credentialsDialog.Confirm(true);
|
||||
}
|
||||
|
@ -181,11 +176,11 @@ namespace GreenshotJiraPlugin {
|
|||
/// <summary>
|
||||
/// End the session, if there was one
|
||||
/// </summary>
|
||||
public async Task LogoutAsync() {
|
||||
if (_jiraApi != null && _loggedIn)
|
||||
public async Task LogoutAsync(CancellationToken cancellationToken = default(CancellationToken)) {
|
||||
if (_jiraClient != null && _loggedIn)
|
||||
{
|
||||
Monitor.Dispose();
|
||||
await _jiraApi.EndSessionAsync();
|
||||
await _jiraClient.Session.EndAsync(cancellationToken);
|
||||
_loggedIn = false;
|
||||
}
|
||||
}
|
||||
|
@ -195,14 +190,14 @@ namespace GreenshotJiraPlugin {
|
|||
/// Do not use ConfigureAwait to call this, as it will move await from the UI thread.
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
private async Task CheckCredentialsAsync() {
|
||||
private async Task CheckCredentialsAsync(CancellationToken cancellationToken = default(CancellationToken)) {
|
||||
if (_loggedIn) {
|
||||
if (_loggedInTime.AddMinutes(_timeout-1).CompareTo(DateTime.Now) < 0) {
|
||||
await LogoutAsync();
|
||||
await LoginAsync();
|
||||
await LogoutAsync(cancellationToken);
|
||||
await LoginAsync(cancellationToken);
|
||||
}
|
||||
} else {
|
||||
await LoginAsync();
|
||||
await LoginAsync(cancellationToken);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -210,23 +205,24 @@ namespace GreenshotJiraPlugin {
|
|||
/// Get the favourite filters
|
||||
/// </summary>
|
||||
/// <returns>List with filters</returns>
|
||||
public async Task<IList<Filter>> GetFavoriteFiltersAsync()
|
||||
public async Task<IList<Filter>> GetFavoriteFiltersAsync(CancellationToken cancellationToken = default(CancellationToken))
|
||||
{
|
||||
await CheckCredentialsAsync();
|
||||
return await _jiraApi.GetFavoriteFiltersAsync().ConfigureAwait(false);
|
||||
await CheckCredentialsAsync(cancellationToken);
|
||||
return await _jiraClient.Filter.GetFavoritesAsync(cancellationToken).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the issue for a key
|
||||
/// </summary>
|
||||
/// <param name="issueKey">Jira issue key</param>
|
||||
/// <param name="cancellationToken">CancellationToken</param>
|
||||
/// <returns>Issue</returns>
|
||||
public async Task<Issue> GetIssueAsync(string issueKey)
|
||||
public async Task<Issue> GetIssueAsync(string issueKey, CancellationToken cancellationToken = default(CancellationToken))
|
||||
{
|
||||
await CheckCredentialsAsync();
|
||||
await CheckCredentialsAsync(cancellationToken);
|
||||
try
|
||||
{
|
||||
return await _jiraApi.GetIssueAsync(issueKey).ConfigureAwait(false);
|
||||
return await _jiraClient.Issue.GetAsync(issueKey, cancellationToken).ConfigureAwait(false);
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
@ -243,12 +239,12 @@ namespace GreenshotJiraPlugin {
|
|||
/// <returns></returns>
|
||||
public async Task AttachAsync(string issueKey, IBinaryContainer content, CancellationToken cancellationToken = default(CancellationToken))
|
||||
{
|
||||
await CheckCredentialsAsync();
|
||||
await CheckCredentialsAsync(cancellationToken);
|
||||
using (var memoryStream = new MemoryStream())
|
||||
{
|
||||
content.WriteToStream(memoryStream);
|
||||
memoryStream.Seek(0, SeekOrigin.Begin);
|
||||
await _jiraApi.AttachAsync(issueKey, memoryStream, content.Filename, content.ContentType, cancellationToken).ConfigureAwait(false);
|
||||
await _jiraClient.Attachment.AttachAsync(issueKey, memoryStream, content.Filename, content.ContentType, cancellationToken).ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -261,8 +257,8 @@ namespace GreenshotJiraPlugin {
|
|||
/// <param name="cancellationToken">CancellationToken</param>
|
||||
public async Task AddCommentAsync(string issueKey, string body, string visibility = null, CancellationToken cancellationToken = default(CancellationToken))
|
||||
{
|
||||
await CheckCredentialsAsync();
|
||||
await _jiraApi.AddCommentAsync(issueKey, body, visibility, cancellationToken).ConfigureAwait(false);
|
||||
await CheckCredentialsAsync(cancellationToken);
|
||||
await _jiraClient.Issue.AddCommentAsync(issueKey, body, visibility, cancellationToken).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -273,8 +269,8 @@ namespace GreenshotJiraPlugin {
|
|||
/// <returns></returns>
|
||||
public async Task<IList<Issue>> SearchAsync(Filter filter, CancellationToken cancellationToken = default(CancellationToken))
|
||||
{
|
||||
await CheckCredentialsAsync();
|
||||
var searchResult = await _jiraApi.SearchAsync(filter.Jql, 20, new[] { "summary", "reporter", "assignee", "created", "issuetype" }, cancellationToken).ConfigureAwait(false);
|
||||
await CheckCredentialsAsync(cancellationToken);
|
||||
var searchResult = await _jiraClient.Issue.SearchAsync(filter.Jql, 20, new[] { "summary", "reporter", "assignee", "created", "issuetype" }, cancellationToken).ConfigureAwait(false);
|
||||
return searchResult.Issues;
|
||||
}
|
||||
|
||||
|
@ -292,7 +288,7 @@ namespace GreenshotJiraPlugin {
|
|||
/// <summary>
|
||||
/// Get the base uri
|
||||
/// </summary>
|
||||
public Uri JiraBaseUri => _jiraApi.JiraBaseUri;
|
||||
public Uri JiraBaseUri => _jiraClient.JiraBaseUri;
|
||||
|
||||
/// <summary>
|
||||
/// Is the user "logged in?
|
||||
|
|
|
@ -78,9 +78,17 @@ namespace GreenshotJiraPlugin {
|
|||
{
|
||||
if (_jiraIssue != null)
|
||||
{
|
||||
displayIcon = jiraConnector.GetIssueTypeBitmapAsync(_jiraIssue).Result;
|
||||
// Try to get the issue type as icon
|
||||
try
|
||||
{
|
||||
displayIcon = jiraConnector.GetIssueTypeBitmapAsync(_jiraIssue).Result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.Warn($"Problem loading issue type for {_jiraIssue.Key}, ignoring", ex);
|
||||
}
|
||||
}
|
||||
else
|
||||
if (displayIcon == null)
|
||||
{
|
||||
displayIcon = jiraConnector.FavIcon;
|
||||
}
|
||||
|
|
|
@ -26,7 +26,7 @@ using System.Text.RegularExpressions;
|
|||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using Dapplo.Jira;
|
||||
using Dapplo.Log.Facade;
|
||||
using Dapplo.Log;
|
||||
using GreenshotJiraPlugin.Hooking;
|
||||
|
||||
namespace GreenshotJiraPlugin
|
||||
|
@ -42,9 +42,10 @@ namespace GreenshotJiraPlugin
|
|||
private static readonly LogSource Log = new LogSource();
|
||||
private readonly Regex _jiraKeyPattern = new Regex(@"[A-Z][A-Z0-9]+\-[0-9]+");
|
||||
private readonly WindowsTitleMonitor _monitor;
|
||||
private readonly IList<JiraApi> _jiraInstances = new List<JiraApi>();
|
||||
private readonly IDictionary<string, JiraApi> _projectJiraApiMap = new Dictionary<string, JiraApi>();
|
||||
private readonly IList<IJiraClient> _jiraInstances = new List<IJiraClient>();
|
||||
private readonly IDictionary<string, IJiraClient> _projectJiraClientMap = new Dictionary<string, IJiraClient>();
|
||||
private readonly int _maxEntries;
|
||||
// TODO: Add issues from issueHistory (JQL -> Where.IssueKey.InIssueHistory())
|
||||
private IDictionary<string, JiraDetails> _recentJiras = new Dictionary<string, JiraDetails>();
|
||||
|
||||
/// <summary>
|
||||
|
@ -92,10 +93,10 @@ namespace GreenshotJiraPlugin
|
|||
/// Retrieve the API belonging to a JiraDetails
|
||||
/// </summary>
|
||||
/// <param name="jiraDetails"></param>
|
||||
/// <returns>JiraAPI</returns>
|
||||
public JiraApi GetJiraApiForKey(JiraDetails jiraDetails)
|
||||
/// <returns>IJiraClient</returns>
|
||||
public IJiraClient GetJiraClientForKey(JiraDetails jiraDetails)
|
||||
{
|
||||
return _projectJiraApiMap[jiraDetails.ProjectKey];
|
||||
return _projectJiraClientMap[jiraDetails.ProjectKey];
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -116,17 +117,17 @@ namespace GreenshotJiraPlugin
|
|||
/// </summary>
|
||||
/// <param name="jiraInstance"></param>
|
||||
/// <param name="token"></param>
|
||||
public async Task AddJiraInstanceAsync(JiraApi jiraInstance, CancellationToken token = default(CancellationToken))
|
||||
public async Task AddJiraInstanceAsync(IJiraClient jiraInstance, CancellationToken token = default(CancellationToken))
|
||||
{
|
||||
_jiraInstances.Add(jiraInstance);
|
||||
var projects = await jiraInstance.GetProjectsAsync(token).ConfigureAwait(false);
|
||||
var projects = await jiraInstance.Project.GetAllAsync(cancellationToken: token).ConfigureAwait(false);
|
||||
if (projects != null)
|
||||
{
|
||||
foreach (var project in projects)
|
||||
{
|
||||
if (!_projectJiraApiMap.ContainsKey(project.Key))
|
||||
if (!_projectJiraClientMap.ContainsKey(project.Key))
|
||||
{
|
||||
_projectJiraApiMap.Add(project.Key, jiraInstance);
|
||||
_projectJiraClientMap.Add(project.Key, jiraInstance);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -141,10 +142,10 @@ namespace GreenshotJiraPlugin
|
|||
{
|
||||
try
|
||||
{
|
||||
JiraApi jiraApi;
|
||||
if (_projectJiraApiMap.TryGetValue(jiraDetails.ProjectKey, out jiraApi))
|
||||
IJiraClient jiraClient;
|
||||
if (_projectJiraClientMap.TryGetValue(jiraDetails.ProjectKey, out jiraClient))
|
||||
{
|
||||
var issue = await jiraApi.GetIssueAsync(jiraDetails.JiraKey).ConfigureAwait(false);
|
||||
var issue = await jiraClient.Issue.GetAsync(jiraDetails.JiraKey).ConfigureAwait(false);
|
||||
jiraDetails.JiraIssue = issue;
|
||||
}
|
||||
// Send event
|
||||
|
@ -178,9 +179,9 @@ namespace GreenshotJiraPlugin
|
|||
var projectKey = jiraKeyParts[0];
|
||||
var jiraId = jiraKeyParts[1];
|
||||
|
||||
JiraApi jiraApi;
|
||||
IJiraClient jiraClient;
|
||||
// Check if we have a JIRA instance with a project for this key
|
||||
if (_projectJiraApiMap.TryGetValue(projectKey, out jiraApi))
|
||||
if (_projectJiraClientMap.TryGetValue(projectKey, out jiraClient))
|
||||
{
|
||||
// We have found a project for this _jira key, so it must be a valid & known JIRA
|
||||
JiraDetails currentJiraDetails;
|
||||
|
@ -207,8 +208,7 @@ namespace GreenshotJiraPlugin
|
|||
if (_recentJiras.Count > _maxEntries)
|
||||
{
|
||||
// Add it to the list of recent Jiras
|
||||
IList<JiraDetails> clonedList = new List<JiraDetails>(_recentJiras.Values);
|
||||
_recentJiras = (from jiraDetails in clonedList
|
||||
_recentJiras = (from jiraDetails in _recentJiras.Values.ToList()
|
||||
orderby jiraDetails.SeenAt descending
|
||||
select jiraDetails).Take(_maxEntries).ToDictionary(jd => jd.JiraKey, jd => jd);
|
||||
}
|
||||
|
|
|
@ -24,7 +24,9 @@ using Greenshot.IniFile;
|
|||
using Greenshot.Plugin;
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using Dapplo.Log.Facade;
|
||||
using Dapplo.Log;
|
||||
using Greenshot.Forms;
|
||||
using Greenshot.Helpers;
|
||||
using GreenshotJiraPlugin.Forms;
|
||||
using GreenshotPlugin.Core;
|
||||
using log4net;
|
||||
|
@ -57,6 +59,22 @@ namespace GreenshotJiraPlugin {
|
|||
|
||||
public JiraPlugin() {
|
||||
_instance = this;
|
||||
// Added to prevent Greenshot from shutting down when there was an exception in a Task
|
||||
TaskScheduler.UnobservedTaskException += (sender, args) =>
|
||||
{
|
||||
try
|
||||
{
|
||||
Exception exceptionToLog = args.Exception;
|
||||
string exceptionText = EnvironmentInfo.BuildReport(exceptionToLog);
|
||||
Log.Error("Exception caught in the UnobservedTaskException handler.");
|
||||
Log.Error(exceptionText);
|
||||
new BugReportForm(exceptionText).ShowDialog();
|
||||
}
|
||||
finally
|
||||
{
|
||||
args.SetObserved();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public IEnumerable<IDestination> Destinations() {
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using Dapplo.Log.Facade;
|
||||
using Dapplo.Log;
|
||||
using log4net;
|
||||
|
||||
namespace GreenshotJiraPlugin
|
||||
|
|
|
@ -1,126 +0,0 @@
|
|||
/*
|
||||
* Greenshot - a free and open source screenshot tool
|
||||
* Copyright (C) 2007-2016 Thomas Braun, Jens Klingen, Robin Krom
|
||||
*
|
||||
* For more information see: http://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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using Dapplo.HttpExtensions;
|
||||
using Dapplo.HttpExtensions.ContentConverter;
|
||||
using Dapplo.HttpExtensions.Extensions;
|
||||
using Dapplo.HttpExtensions.Support;
|
||||
using Dapplo.Log.Facade;
|
||||
using System.Net.Http;
|
||||
using System.Net.Http.Headers;
|
||||
|
||||
namespace GreenshotJiraPlugin
|
||||
{
|
||||
/// <summary>
|
||||
/// This adds SVG image support for the Jira Plugin
|
||||
/// </summary>
|
||||
public class SvgBitmapHttpContentConverter : IHttpContentConverter
|
||||
{
|
||||
private static readonly LogSource Log = new LogSource();
|
||||
private static readonly IList<string> SupportedContentTypes = new List<string>();
|
||||
|
||||
static SvgBitmapHttpContentConverter()
|
||||
{
|
||||
SupportedContentTypes.Add(MediaTypes.Svg.EnumValueOf());
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public int Order => 0;
|
||||
|
||||
public int Width { get; set; }
|
||||
|
||||
public int Height { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// This checks if the HttpContent can be converted to a Bitmap and is assignable to the specified Type
|
||||
/// </summary>
|
||||
/// <param name="typeToConvertTo">This should be something we can assign Bitmap to</param>
|
||||
/// <param name="httpContent">HttpContent to process</param>
|
||||
/// <returns>true if it can convert</returns>
|
||||
public bool CanConvertFromHttpContent(Type typeToConvertTo, HttpContent httpContent)
|
||||
{
|
||||
if (typeToConvertTo == typeof(object) || !typeToConvertTo.IsAssignableFrom(typeof(Bitmap)))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
var httpBehaviour = HttpBehaviour.Current;
|
||||
return !httpBehaviour.ValidateResponseContentType || SupportedContentTypes.Contains(httpContent.GetContentType());
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task<object> ConvertFromHttpContentAsync(Type resultType, HttpContent httpContent, CancellationToken cancellationToken = default(CancellationToken))
|
||||
{
|
||||
if (!CanConvertFromHttpContent(resultType, httpContent))
|
||||
{
|
||||
var exMessage = "CanConvertFromHttpContent resulted in false, ConvertFromHttpContentAsync is not supposed to be called.";
|
||||
Log.Error().WriteLine(exMessage);
|
||||
throw new NotSupportedException(exMessage);
|
||||
}
|
||||
using (var memoryStream = (MemoryStream) await StreamHttpContentConverter.Instance.ConvertFromHttpContentAsync(typeof(MemoryStream), httpContent, cancellationToken).ConfigureAwait(false))
|
||||
{
|
||||
Log.Debug().WriteLine("Creating a Bitmap from the SVG.");
|
||||
var svgImage = new SvgImage(memoryStream)
|
||||
{
|
||||
Height = Height,
|
||||
Width = Width
|
||||
};
|
||||
return svgImage.Image;
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public bool CanConvertToHttpContent(Type typeToConvert, object content)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public HttpContent ConvertToHttpContent(Type typeToConvert, object content)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public void AddAcceptHeadersForType(Type resultType, HttpRequestMessage httpRequestMessage)
|
||||
{
|
||||
if (resultType == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(resultType));
|
||||
}
|
||||
if (httpRequestMessage == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(httpRequestMessage));
|
||||
}
|
||||
if (resultType == typeof(object) || !resultType.IsAssignableFrom(typeof(Bitmap)))
|
||||
{
|
||||
return;
|
||||
}
|
||||
httpRequestMessage.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(MediaTypes.Svg.EnumValueOf()));
|
||||
Log.Debug().WriteLine("Modified the header(s) of the HttpRequestMessage: Accept: {0}", httpRequestMessage.Headers.Accept);
|
||||
}
|
||||
}
|
||||
}
|
25
GreenshotJiraPlugin/language_jiraplugin-kab-DZ.xml
Normal file
25
GreenshotJiraPlugin/language_jiraplugin-kab-DZ.xml
Normal file
|
@ -0,0 +1,25 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<language description="Taqbaylit" ietf="kab-DZ" version="1.0.0" languagegroup="">
|
||||
<resources>
|
||||
<resource name="CANCEL">Sefsex</resource>
|
||||
<resource name="column_assignee">Bénéficiaire</resource>
|
||||
<resource name="column_created">Yettwarna</resource>
|
||||
<resource name="column_id">Asulay</resource>
|
||||
<resource name="column_reporter">Azen</resource>
|
||||
<resource name="column_summary">Agzul</resource>
|
||||
<resource name="communication_wait">Asiweḍ n isefka ɣer JIRA, ṛǧu ma ulac aɣilif...</resource>
|
||||
<resource name="label_comment">Awennit</resource>
|
||||
<resource name="label_filename">Afaylu</resource>
|
||||
<resource name="label_jira">JIRA</resource>
|
||||
<resource name="label_jirafilter">Imzizdeg JIRA</resource>
|
||||
<resource name="label_upload_format">Amasal tugna</resource>
|
||||
<resource name="label_url">Tansa Url</resource>
|
||||
<resource name="login_error">Teḍra-d tucḍa deg usesteb : {0}</resource>
|
||||
<resource name="login_title">Ma ulac aɣilif sekcem isulayen Jira</resource>
|
||||
<resource name="OK">IH</resource>
|
||||
<resource name="settings_title">Iɣewwaṛen Jira</resource>
|
||||
<resource name="upload_failure">Teḍra-d tuccḍa deg usal ɣer Jira :</resource>
|
||||
<resource name="upload_menu_item">Sali ɣer Jira</resource>
|
||||
<resource name="upload_success">Tugna tuli ɣer Jira akken iwata !</resource>
|
||||
</resources>
|
||||
</language>
|
|
@ -1,8 +1,8 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="Dapplo.HttpExtensions" version="0.5.43" targetFramework="net45" />
|
||||
<package id="Dapplo.Jira" version="0.1.65" targetFramework="net45" />
|
||||
<package id="Dapplo.Log.Facade" version="0.5.4" targetFramework="net45" />
|
||||
<package id="Dapplo.HttpExtensions" version="0.6.17" targetFramework="net45" />
|
||||
<package id="Dapplo.Jira" version="0.5.12" targetFramework="net45" />
|
||||
<package id="Dapplo.Log" version="1.0.23" targetFramework="net45" />
|
||||
<package id="LibZ.Tool" version="1.2.0.0" targetFramework="net45" />
|
||||
<package id="Svg" version="2.2.2" targetFramework="net45" />
|
||||
<package id="Svg" version="2.3.0" targetFramework="net45" />
|
||||
</packages>
|
|
@ -0,0 +1,8 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<language description="Taqbaylit" ietf="kab-DZ" version="1.0.0" languagegroup="">
|
||||
<resources>
|
||||
<resource name="language">Tutlayt i OCR</resource>
|
||||
<resource name="orient_image">Wehhi tugna</resource>
|
||||
<resource name="straighten_image">Seggwem tugna</resource>
|
||||
</resources>
|
||||
</language>
|
|
@ -45,7 +45,8 @@ namespace Greenshot.Interop.Office {
|
|||
OneNotePage newPage = new OneNotePage();
|
||||
string unfiledNotesSectionId = GetSectionId(oneNoteApplication, SpecialLocation.slUnfiledNotesSection);
|
||||
if(unfiledNotesSectionId != null) {
|
||||
string pageId;
|
||||
// ReSharper disable once RedundantAssignment
|
||||
string pageId = "";
|
||||
oneNoteApplication.CreateNewPage(unfiledNotesSectionId, out pageId, NewPageStyle.npsDefault);
|
||||
newPage.ID = pageId;
|
||||
// Set the new name, this is automatically done in the export to page
|
||||
|
@ -106,10 +107,12 @@ namespace Greenshot.Interop.Office {
|
|||
if(oneNoteApplication == null) {
|
||||
return null;
|
||||
}
|
||||
string unfiledNotesPath;
|
||||
// ReSharper disable once RedundantAssignment
|
||||
string unfiledNotesPath = "";
|
||||
oneNoteApplication.GetSpecialLocation(specialLocation, out unfiledNotesPath);
|
||||
|
||||
string notebookXml;
|
||||
// ReSharper disable once RedundantAssignment
|
||||
string notebookXml = "";
|
||||
oneNoteApplication.GetHierarchy("", HierarchyScope.hsPages, out notebookXml, XMLSchema.xs2010);
|
||||
if(!string.IsNullOrEmpty(notebookXml)) {
|
||||
Log.Debug(notebookXml);
|
||||
|
@ -144,7 +147,8 @@ namespace Greenshot.Interop.Office {
|
|||
try {
|
||||
using (IOneNoteApplication oneNoteApplication = COMWrapper.GetOrCreateInstance<IOneNoteApplication>()) {
|
||||
if (oneNoteApplication != null) {
|
||||
string notebookXml;
|
||||
// ReSharper disable once RedundantAssignment
|
||||
string notebookXml = "";
|
||||
oneNoteApplication.GetHierarchy("", HierarchyScope.hsPages, out notebookXml, XMLSchema.xs2010);
|
||||
if (!string.IsNullOrEmpty(notebookXml)) {
|
||||
Log.Debug(notebookXml);
|
||||
|
@ -215,7 +219,7 @@ namespace Greenshot.Interop.Office {
|
|||
if(p1.IsCurrentlyViewed || p2.IsCurrentlyViewed) {
|
||||
return p2.IsCurrentlyViewed.CompareTo(p1.IsCurrentlyViewed);
|
||||
}
|
||||
return String.Compare(p1.DisplayName, p2.DisplayName, StringComparison.Ordinal);
|
||||
return string.Compare(p1.DisplayName, p2.DisplayName, StringComparison.Ordinal);
|
||||
});
|
||||
return pages;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<language description="Taqbaylit" ietf="kab-DZ" version="0.8.0">
|
||||
<resources>
|
||||
<resource name="upload_menu_item">
|
||||
Sali ɣer Photobucket
|
||||
</resource>
|
||||
<resource name="settings_title">
|
||||
Iɣewwaṛen n Photobucket
|
||||
</resource>
|
||||
<resource name="label_use_proxy">
|
||||
Seqdec apṛuksi
|
||||
</resource>
|
||||
<resource name="upload_success">
|
||||
Tugna tuli akken iwata ɣer Photobucket !
|
||||
</resource>
|
||||
<resource name="upload_failure">
|
||||
Teḍra-d tuccḍa deg usali ɣer Photobucket:
|
||||
</resource>
|
||||
<resource name="label_upload_format">
|
||||
Amasal n tugna
|
||||
</resource>
|
||||
<resource name="upload_wait">
|
||||
Asali ɣer Photobucket, Ṛǧu ma ulac aɣilif...
|
||||
</resource>
|
||||
<resource name="configure">
|
||||
Swel Photobucket
|
||||
</resource>
|
||||
</resources>
|
||||
</language>
|
|
@ -0,0 +1,14 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<language description="Taqbaylit" ietf="kab-DZ" version="1.0.0" languagegroup="">
|
||||
<resources>
|
||||
<resource name="communication_wait">S tidett tebɣiḍ ad tekkseḍ amazray adigan n Picasa ?...</resource>
|
||||
<resource name="Configure">Swel Picasa</resource>
|
||||
<resource name="label_AfterUpload">Ticki yemmed usali</resource>
|
||||
<resource name="label_AfterUploadLinkToClipBoard">Nɣel aseɣwen ɣef afus</resource>
|
||||
<resource name="label_upload_format">Amsal n tugna</resource>
|
||||
<resource name="settings_title">Iɣewwaṛen Picasa</resource>
|
||||
<resource name="upload_failure">Teḍra-d tuccḍa deg usali ɣer Picasa :</resource>
|
||||
<resource name="upload_menu_item">Sali ɣer Picasa</resource>
|
||||
<resource name="upload_success">Tugna tuli ɣer Picasa !</resource>
|
||||
</resources>
|
||||
</language>
|
|
@ -20,7 +20,6 @@
|
|||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Runtime.InteropServices;
|
||||
|
@ -48,15 +47,6 @@ namespace GreenshotPlugin.Controls {
|
|||
private static int _hotKeyCounter = 1;
|
||||
private const uint WM_HOTKEY = 0x312;
|
||||
private static IntPtr _hotkeyHwnd;
|
||||
|
||||
// static HotkeyControl() {
|
||||
// StringBuilder keyName = new StringBuilder();
|
||||
// for(uint sc = 0; sc < 500; sc++) {
|
||||
// if (GetKeyNameText(sc << 16, keyName, 100) != 0) {
|
||||
// LOG.DebugFormat("SC {0} = {1}", sc, keyName);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
public enum Modifiers : uint {
|
||||
|
@ -96,8 +86,8 @@ namespace GreenshotPlugin.Controls {
|
|||
|
||||
// ArrayLists used to enforce the use of proper modifiers.
|
||||
// Shift+A isn't a valid hotkey, for instance, as it would screw up when the user is typing.
|
||||
private readonly ArrayList _needNonShiftModifier;
|
||||
private readonly ArrayList _needNonAltGrModifier;
|
||||
private readonly IList<int> _needNonShiftModifier = new List<int>();
|
||||
private readonly IList<int> _needNonAltGrModifier = new List<int>();
|
||||
|
||||
private readonly ContextMenu _dummy = new ContextMenu();
|
||||
|
||||
|
@ -138,9 +128,6 @@ namespace GreenshotPlugin.Controls {
|
|||
KeyUp += HotkeyControl_KeyUp;
|
||||
KeyDown += HotkeyControl_KeyDown;
|
||||
|
||||
// Fill the ArrayLists that contain all invalid hotkey combinations
|
||||
_needNonShiftModifier = new ArrayList();
|
||||
_needNonAltGrModifier = new ArrayList();
|
||||
PopulateModifierLists();
|
||||
}
|
||||
|
||||
|
@ -180,8 +167,6 @@ namespace GreenshotPlugin.Controls {
|
|||
_needNonShiftModifier.Add((int)Keys.Return);
|
||||
_needNonShiftModifier.Add((int)Keys.Escape);
|
||||
_needNonShiftModifier.Add((int)Keys.NumLock);
|
||||
_needNonShiftModifier.Add((int)Keys.Scroll);
|
||||
_needNonShiftModifier.Add((int)Keys.Pause);
|
||||
|
||||
// Ctrl+Alt + 0 - 9
|
||||
for (Keys k = Keys.D0; k <= Keys.D9; k++) {
|
||||
|
|
|
@ -68,6 +68,7 @@ namespace GreenshotPlugin.Controls {
|
|||
ApplyFilterOptions();
|
||||
string initialDirectory = null;
|
||||
try {
|
||||
conf.ValidateAndCorrectOutputFileAsFullpath();
|
||||
initialDirectory = Path.GetDirectoryName(conf.OutputFileAsFullpath);
|
||||
} catch {
|
||||
LOG.WarnFormat("OutputFileAsFullpath was set to {0}, ignoring due to problem in path.", conf.OutputFileAsFullpath);
|
||||
|
@ -90,12 +91,12 @@ namespace GreenshotPlugin.Controls {
|
|||
PrepareFilterOptions();
|
||||
string fdf = "";
|
||||
int preselect = 0;
|
||||
var outputFileFormatAsString = Enum.GetName(typeof(OutputFormat), conf.OutputFileFormat);
|
||||
var outputFileFormatAsString = Enum.GetName(typeof(OutputFormat), conf.OutputFileFormat);
|
||||
for(int i=0; i<_filterOptions.Length; i++){
|
||||
FilterOption fo = _filterOptions[i];
|
||||
fdf += fo.Label + "|*." + fo.Extension + "|";
|
||||
if(outputFileFormatAsString == fo.Extension)
|
||||
preselect = i;
|
||||
if(outputFileFormatAsString == fo.Extension)
|
||||
preselect = i;
|
||||
}
|
||||
fdf = fdf.Substring(0, fdf.Length-1);
|
||||
SaveFileDialog.Filter = fdf;
|
||||
|
|
|
@ -813,10 +813,10 @@ EndSelection:<<<<<<<4
|
|||
string[] dropFileNames = (string[]) dataObject.GetData(DataFormats.FileDrop);
|
||||
if (dropFileNames != null && dropFileNames.Length > 0)
|
||||
{
|
||||
return dropFileNames.Where(filename => !string.IsNullOrEmpty(filename))
|
||||
return dropFileNames
|
||||
.Where(filename => !string.IsNullOrEmpty(filename))
|
||||
.Where(Path.HasExtension)
|
||||
.Select(filename => Path.GetExtension(filename).ToLowerInvariant())
|
||||
.Where(ext => ImageHelper.StreamConverters.Keys.Contains(ext));
|
||||
.Where(filename => ImageHelper.StreamConverters.Keys.Contains(Path.GetExtension(filename).ToLowerInvariant().Substring(1)));
|
||||
}
|
||||
return Enumerable.Empty<string>();
|
||||
}
|
||||
|
|
|
@ -263,6 +263,9 @@ namespace GreenshotPlugin.Core {
|
|||
[IniProperty("LastCapturedRegion", Description = "The last used region, for reuse in the capture last region")]
|
||||
public Rectangle LastCapturedRegion { get; set; }
|
||||
|
||||
[IniProperty("Win10BorderCrop", Description = "The capture is cropped with these settings, e.g. when you don't want to color around it -1,-1"), DefaultValue("0,0")]
|
||||
public Size Win10BorderCrop { get; set; }
|
||||
|
||||
private Size _iconSize;
|
||||
[IniProperty("IconSize", Description = "Defines the size of the icons (e.g. for the buttons in the editor), default value 16,16 anything bigger will cause scaling", DefaultValue = "16,16")]
|
||||
public Size IconSize {
|
||||
|
@ -339,9 +342,8 @@ namespace GreenshotPlugin.Core {
|
|||
case "OutputFileAsFullpath":
|
||||
if (IniConfig.IsPortable) {
|
||||
return Path.Combine(Application.StartupPath, @"..\..\Documents\Pictures\Greenshots\dummy.png");
|
||||
} else {
|
||||
return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop),"dummy.png");
|
||||
}
|
||||
return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop),"dummy.png");
|
||||
case "OutputFilePath":
|
||||
if (IniConfig.IsPortable) {
|
||||
string pafOutputFilePath = Path.Combine(Application.StartupPath, @"..\..\Documents\Pictures\Greenshots");
|
||||
|
@ -512,13 +514,27 @@ namespace GreenshotPlugin.Core {
|
|||
if (WebRequestReadWriteTimeout < 1) {
|
||||
WebRequestReadWriteTimeout = 100;
|
||||
}
|
||||
}
|
||||
|
||||
// Added for BUG-1992, reset the OutputFilePath / OutputFileAsFullpath if they don't exist (e.g. the configuration is used on a different PC)
|
||||
/// <summary>
|
||||
/// Validate the OutputFilePath, and if this is not correct it will be set to the default
|
||||
/// Added for BUG-1992, reset the OutputFilePath / OutputFileAsFullpath if they don't exist (e.g. the configuration is used on a different PC)
|
||||
/// </summary>
|
||||
public void ValidateAndCorrectOutputFilePath()
|
||||
{
|
||||
if (!Directory.Exists(OutputFilePath))
|
||||
{
|
||||
OutputFilePath = GetDefault(nameof(OutputFilePath)) as string;
|
||||
}
|
||||
if (!File.Exists(OutputFileAsFullpath))
|
||||
}
|
||||
/// <summary>
|
||||
/// Validate the OutputFileAsFullpath, and if this is not correct it will be set to the default
|
||||
/// Added for BUG-1992, reset the OutputFilePath / OutputFileAsFullpath if they don't exist (e.g. the configuration is used on a different PC)
|
||||
/// </summary>
|
||||
public void ValidateAndCorrectOutputFileAsFullpath()
|
||||
{
|
||||
var outputFilePath = Path.GetDirectoryName(OutputFileAsFullpath);
|
||||
if (outputFilePath == null || (!File.Exists(OutputFileAsFullpath) && !Directory.Exists(outputFilePath)))
|
||||
{
|
||||
OutputFileAsFullpath = GetDefault(nameof(OutputFileAsFullpath)) as string;
|
||||
}
|
||||
|
|
54
GreenshotPlugin/Core/ExplorerHelper.cs
Normal file
54
GreenshotPlugin/Core/ExplorerHelper.cs
Normal file
|
@ -0,0 +1,54 @@
|
|||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
|
||||
namespace GreenshotPlugin.Core
|
||||
{
|
||||
/// <summary>
|
||||
/// Simple utility for the explorer
|
||||
/// </summary>
|
||||
public static class ExplorerHelper
|
||||
{
|
||||
/// <summary>
|
||||
/// Open the path in the windows explorer.
|
||||
/// If the path is a directory, it will just open the explorer with that directory.
|
||||
/// If the path is a file, the explorer is opened with the directory and the file is selected.
|
||||
/// </summary>
|
||||
/// <param name="path">Path to file or directory</param>
|
||||
public static bool OpenInExplorer(string path)
|
||||
{
|
||||
if (path == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
try
|
||||
{
|
||||
// Check if path is a directory
|
||||
if (Directory.Exists(path))
|
||||
{
|
||||
using (Process.Start(path))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
// Check if path is a file
|
||||
if (File.Exists(path))
|
||||
{
|
||||
// Start the explorer process and select the file
|
||||
using (var explorer = Process.Start("explorer.exe", $"/select,\"{path}\""))
|
||||
{
|
||||
explorer?.WaitForInputIdle(500);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// Make sure we show what we tried to open in the exception
|
||||
ex.Data.Add("path", path);
|
||||
throw;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -105,7 +105,7 @@ namespace GreenshotPlugin.Core {
|
|||
bool useMemoryStream = false;
|
||||
MemoryStream memoryStream = null;
|
||||
if (outputSettings.Format == OutputFormat.greenshot && surface == null) {
|
||||
throw new ArgumentException("Surface needs to be se when using OutputFormat.Greenshot");
|
||||
throw new ArgumentException("Surface needs to be set when using OutputFormat.Greenshot");
|
||||
}
|
||||
|
||||
try {
|
||||
|
|
|
@ -44,7 +44,7 @@ namespace GreenshotPlugin.Core {
|
|||
private const string LanguageFilenamePattern = @"language*.xml";
|
||||
private static readonly Regex PrefixRegexp = new Regex(@"language_([a-zA-Z0-9]+).*");
|
||||
private static readonly Regex IetfCleanRegexp = new Regex(@"[^a-zA-Z]+");
|
||||
private static readonly Regex IetfRegexp = new Regex(@"^.*([a-zA-Z]{2}-[a-zA-Z]{2})\.xml$");
|
||||
private static readonly Regex IetfRegexp = new Regex(@"^.*([a-zA-Z]{2,3}-[a-zA-Z]{2})\.xml$");
|
||||
private const string LanguageGroupsKey = @"SYSTEM\CurrentControlSet\Control\Nls\Language Groups";
|
||||
private static readonly IList<string> UnsupportedLanguageGroups = new List<string>();
|
||||
private static readonly IDictionary<string, string> Resources = new Dictionary<string, string>();
|
||||
|
@ -341,8 +341,10 @@ namespace GreenshotPlugin.Core {
|
|||
xmlDocument.Load(languageFilePath);
|
||||
XmlNodeList nodes = xmlDocument.GetElementsByTagName("language");
|
||||
if (nodes.Count > 0) {
|
||||
LanguageFile languageFile = new LanguageFile();
|
||||
languageFile.Filepath = languageFilePath;
|
||||
LanguageFile languageFile = new LanguageFile
|
||||
{
|
||||
Filepath = languageFilePath
|
||||
};
|
||||
XmlNode node = nodes.Item(0);
|
||||
if (node?.Attributes != null)
|
||||
{
|
||||
|
|
|
@ -770,7 +770,7 @@ namespace GreenshotPlugin.Core {
|
|||
{
|
||||
// Somehow DWM doesn't calculate it corectly, there is a 1 pixel border around the capture
|
||||
// Remove this border, currently it's fixed but TODO: Make it depend on the OS?
|
||||
windowRect.Inflate(-1, -1);
|
||||
windowRect.Inflate(Conf.Win10BorderCrop);
|
||||
_previousWindowRectangle = windowRect;
|
||||
_lastWindowRectangleRetrieveTime = now;
|
||||
return windowRect;
|
||||
|
@ -1001,7 +1001,7 @@ namespace GreenshotPlugin.Core {
|
|||
// TODO: Also 8.x?
|
||||
if (Environment.OSVersion.IsWindows10())
|
||||
{
|
||||
captureRectangle.Inflate(-1, -1);
|
||||
captureRectangle.Inflate(Conf.Win10BorderCrop);
|
||||
}
|
||||
|
||||
if (autoMode) {
|
||||
|
@ -1250,36 +1250,50 @@ namespace GreenshotPlugin.Core {
|
|||
size = result ? new Size((int)windowInfo.cxWindowBorders, (int)windowInfo.cyWindowBorders) : Size.Empty;
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Set the window as foreground window
|
||||
/// </summary>
|
||||
public static void ToForeground(IntPtr handle)
|
||||
/// <param name="handle">hWnd of the window to bring to the foreground</param>
|
||||
/// <param name="workaround">bool with true to use a trick to really bring the window to the foreground</param>
|
||||
public static void ToForeground(IntPtr handle, bool workaround = true)
|
||||
{
|
||||
// Do nothing if the window is already in the foreground
|
||||
if (User32.GetForegroundWindow() == handle)
|
||||
var window = new WindowDetails(handle);
|
||||
// Nothing we can do if it's not visible!
|
||||
if (!window.Visible)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
const byte ALT = 0xA4;
|
||||
const int EXTENDEDKEY = 0x1;
|
||||
const int KEYUP = 0x2;
|
||||
|
||||
// Simulate an "ALT" key press.
|
||||
User32.keybd_event(ALT, 0x45, EXTENDEDKEY | 0, 0);
|
||||
// Simulate an "ALT" key release.
|
||||
User32.keybd_event(ALT, 0x45, EXTENDEDKEY | KEYUP, 0);
|
||||
|
||||
if (window.Iconic)
|
||||
{
|
||||
window.Iconic = false;
|
||||
while (window.Iconic)
|
||||
{
|
||||
Application.DoEvents();
|
||||
}
|
||||
}
|
||||
// See https://msdn.microsoft.com/en-us/library/windows/desktop/ms633539(v=vs.85).aspx
|
||||
if (workaround)
|
||||
{
|
||||
const byte alt = 0xA4;
|
||||
const int extendedkey = 0x1;
|
||||
const int keyup = 0x2;
|
||||
// Simulate an "ALT" key press.
|
||||
User32.keybd_event(alt, 0x45, extendedkey | 0, 0);
|
||||
// Simulate an "ALT" key release.
|
||||
User32.keybd_event(alt, 0x45, extendedkey | keyup, 0);
|
||||
}
|
||||
// Show window in forground.
|
||||
User32.BringWindowToTop(handle);
|
||||
User32.SetForegroundWindow(handle);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Set the window as foreground window
|
||||
/// </summary>
|
||||
public void ToForeground() {
|
||||
ToForeground(Handle);
|
||||
/// <param name="workaround">true to use a workaround, otherwise the window might only flash</param>
|
||||
public void ToForeground(bool workaround = true) {
|
||||
ToForeground(Handle, workaround);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
|
@ -43,6 +43,7 @@
|
|||
<Compile Include="Controls\GreenshotRadioButton.cs">
|
||||
<SubType>Component</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Core\ExplorerHelper.cs" />
|
||||
<Compile Include="Effects\AdjustEffect.cs" />
|
||||
<Compile Include="Effects\BorderEffect.cs" />
|
||||
<Compile Include="Core\CaptureHandler.cs" />
|
||||
|
|
|
@ -98,8 +98,15 @@ namespace Greenshot.Plugin {
|
|||
ReduceColors = reduceColors;
|
||||
}
|
||||
|
||||
public SurfaceOutputSettings PreventGreenshotFormat() {
|
||||
if (Format == OutputFormat.greenshot) {
|
||||
/// <summary>
|
||||
/// BUG-2056 reported a logical issue, using greenshot format as the default causes issues with the external commands.
|
||||
/// </summary>
|
||||
/// <returns>this for fluent API usage</returns>
|
||||
public SurfaceOutputSettings PreventGreenshotFormat()
|
||||
{
|
||||
// If OutputFormat is Greenshot, use PNG instead.
|
||||
if (Format == OutputFormat.greenshot)
|
||||
{
|
||||
Format = OutputFormat.png;
|
||||
}
|
||||
return this;
|
||||
|
|
|
@ -171,11 +171,16 @@ namespace GreenshotPlugin.UnmanagedHelpers {
|
|||
/// </summary>
|
||||
/// <param name="radius"></param>
|
||||
/// <returns>false if blur is not possible</returns>
|
||||
public static bool IsBlurPossible(int radius) {
|
||||
public static bool IsBlurPossible(int radius)
|
||||
{
|
||||
if (!_isBlurEnabled) {
|
||||
return false;
|
||||
}
|
||||
return Environment.OSVersion.Version.Minor < 2 || radius >= 20;
|
||||
if (Environment.OSVersion.Version.Major == 6 && Environment.OSVersion.Version.Minor < 2)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return Environment.OSVersion.Version.Major > 6 && radius >= 20;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
|
@ -70,8 +70,11 @@ namespace GreenshotWin10Plugin
|
|||
using (var logoStream = new MemoryRandomAccessStream())
|
||||
using (var thumbnailStream = new MemoryRandomAccessStream())
|
||||
{
|
||||
var outputSettings = new SurfaceOutputSettings();
|
||||
outputSettings.PreventGreenshotFormat();
|
||||
|
||||
// Create capture for export
|
||||
ImageOutput.SaveToStream(surface, imageStream, new SurfaceOutputSettings());
|
||||
ImageOutput.SaveToStream(surface, imageStream, outputSettings);
|
||||
imageStream.Position = 0;
|
||||
Log.Info("Created RandomAccessStreamReference for the image");
|
||||
var imageRandomAccessStreamReference = RandomAccessStreamReference.CreateFromStream(imageStream);
|
||||
|
@ -83,7 +86,7 @@ namespace GreenshotWin10Plugin
|
|||
{
|
||||
using (var thumbnail = ImageHelper.CreateThumbnail(tmpImageForThumbnail, 240, 160))
|
||||
{
|
||||
ImageOutput.SaveToStream(thumbnail, null, thumbnailStream, new SurfaceOutputSettings());
|
||||
ImageOutput.SaveToStream(thumbnail, null, thumbnailStream, outputSettings);
|
||||
thumbnailStream.Position = 0;
|
||||
thumbnailRandomAccessStreamReference = RandomAccessStreamReference.CreateFromStream(thumbnailStream);
|
||||
Log.Info("Created RandomAccessStreamReference for the thumbnail");
|
||||
|
@ -94,7 +97,7 @@ namespace GreenshotWin10Plugin
|
|||
{
|
||||
using (var logoThumbnail = ImageHelper.CreateThumbnail(logo, 30, 30))
|
||||
{
|
||||
ImageOutput.SaveToStream(logoThumbnail, null, logoStream, new SurfaceOutputSettings());
|
||||
ImageOutput.SaveToStream(logoThumbnail, null, logoStream, outputSettings);
|
||||
logoStream.Position = 0;
|
||||
logoRandomAccessStreamReference = RandomAccessStreamReference.CreateFromStream(logoStream);
|
||||
Log.Info("Created RandomAccessStreamReference for the logo");
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
version: 1.2.9.{build}
|
||||
branches:
|
||||
only:
|
||||
- release/1.2.9
|
||||
- release/1.2.9BF2
|
||||
skip_tags: true
|
||||
configuration: Release
|
||||
platform: Any CPU
|
||||
|
@ -38,7 +38,7 @@ environment:
|
|||
secure: bjKXhFZkDqaq98XBrz5oQKQfT8CLpuv2ZAiBIwkzloaAPUs97b5yx6h/xFaE4NLS
|
||||
credentials_picasa_consumer_secret:
|
||||
secure: yNptTpmJWypbu9alOQtetxU66drr2FKxoPflNgRJdag=
|
||||
build_type: UNSTABLE
|
||||
build_type: RELEASE
|
||||
rsakey:
|
||||
secure: GNomwdlwZOCyd8d7xEWTnMVs1lpOeHvF+tlnvcbXGovLRtwAp2Ufu0r7paGY7BHGGkIs2WE7xUfyQ9UauVB+58JZ6fwVega8ucUgVJhl4x0QQNN2d6sULUhHfhuEHmxw+FDO/FxKFE6Lmf+ZRY+OGiw0wKIl4qD7mGRHcDQTipNEsTbau8HzqRVCdu3dx7pODC61DlsbO71xLF7UlqnmuZE+91Zz3V6AgaqE246n1499d6bXBYw1AH+8opNnKDFLnTHf7hUVcZn9mj6tKZXeTCuVUOr/SVQcgHKxlBlqzhfaEkxCR5GPtzQRqwDMxEycmFvj2wNP/sie6UEGhQxE4YMCc2OgqNOkpc5BbP/fxLr/SLFOEf1XXzTWCFMhsgpHx7TZbgQH26sa0rK/xaBRacZlwAaNk7V2nFZT7TebYEFy6zWNr9Y+IyeXIofj42XQTNXv8d8hyh+UYLByVEFYRf2DnActQkZQyNdWjZ+CxDV50QSZZs8FT3IIqraHYKsj2ITAN5LrUtWCi7bpNJL0UGo0EJiB2i0bp++tEAAwyrCljxI8d4bbGl/flHk/xd+ysQPnomndijeObjguEzqT8pyXZluSZhF+lI50mIDhMdtdAfMi5yn5RW7P6NWOSlC8xgQQgMZylsuSvRflKbEd/gsoDyEOnakNcdH2jekt9OD6GnuYM7iHkbMC89LBZ0VaHNGvCC+BQXdGUG7O9R3NthZcDXE7q7xbtGRB5ncVQDRfKoT5HVfiV6bSDrcfRODiuR59mZgiSYtZG+3kQWYUKn2wagvZKckGukA0SlOuTRCKZhgLcVHhWeRWeGE3iJ8K6BeHf2EgB8Qr6ayTyTUjBcn+u4qqWKgkvG4qRavlvrBSdMrAXWIKE8vSq1od0A2ZzP6+HCsrkuUR+HFfpE2dpjeckoa5vATQgyn8j5x11iIOB9HnT3YKbZ0aTU4rQgYMJXA/fPcgKDGkAPdgtGbQLssy/mwSdsXBYtMgEcs7vI9laR8Ik+NK2dbFHGFPnxS43WToGyKBxojt8SZbgPJXm22WRrN1+9AZvvhI7/mpZiEE7HWgNRClZYuqbfCMpelLGvVq832OLjelrWMJ0XBVNHnOw0p8qZKI1UpqQJXX1nL8j3JttEVHsfryIanM03kNDL0dX1VAKECKUMCVQ6i6tG4VWsR0C2JccPJ3PSoPgo5KMJhuZNaBoiPjZ2eaMREV6vUYbBYzrvdDQzUcE2stacREl4eJzGJ4GP5h08GQmIirGF/SCyZV1CadAbKZVjqb70XpIbE6NT/+84O82LZR4ui5KgTAv87lTZgvNJ7LxM7rRg1awj/iBxQeARNJxuPMPlk1CVx8Z3091UdL1K1avPKa85lCRwCkDKLcJPO9tlqi4dVjCrwpoCJkQMm3fbTl/BgHn00/RsnFZ2qfl5m2DyF+XuaOPauzsRdLUFAC4h44qoUuzRb4Pv6RFhN5CI4fddRKafNBHU9f69UCkO080/hIjTdj0+bpr4oNY4UEi80huyJY/c0iUPE8o48qBB8F3cW30SwhPmuphn4/18lB8GEwEPqoatmli4QRaDFUCUf9Hj0DEUqEAya/OHOW7/PvWcw/l/ZaIMUpOZ6q0xvPDAXokFRJAWzZhG7hNbWNEzQ3f/BjlYlYsBtMY0JUU8mH6YxwIzIGbHiLTBC0OglH0rDd5W+3NaUG9FZ//o9MAP5j2QqwSuFWXppbigh4zk+h17eJn5zhld7dtvOr+YmgYULj6NFIDKBZHUJdqLYScVzdc1p812FCCBcLmmw4RnwuF+RldHixTdy4UZ17T/hD4OLpWCINl9lUAficC0OFeLJLHxFW6Em8SCbZ3aUtFDIQD8oTqzUHZhGWYF2ukrOc8Dzm4FQ8xy3BhqfntTod1gwoilIirsP/z+GGMnTltkqiqK+gCmkVOfICwNFmHltZeJrmDQ4YU5abR09Yr1TaAk3CzWjV1XGBaf/oek0+tFkMOtZNdFRdlzLLE90PsZZFFnZhFBoNoOhYnMB9K2VqgEpJs0nXvF6qBOllptcpBYUYMzMdb0Ggu6m1d/phxuBuOsm+Xtr0Zw8Xd0vxIOQNDGsskCDIEUYWYajw2i66MmRPRyFEennXfLA0WIPpztXvfsrKjf42rjE3RukBsRff1Sci68cel4fGfmvj2y7gW0Tt
|
||||
before_build:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue