mirror of
https://github.com/greenshot/greenshot
synced 2025-07-16 10:03:44 -07:00
Working on making multiple notification systems possible, removing the old "notifyicon" balloon for Windows 10.
This commit is contained in:
parent
d0846b0f09
commit
1ba0bf9b10
6 changed files with 189 additions and 24 deletions
|
@ -349,12 +349,6 @@ namespace Greenshot {
|
||||||
// Make the notify icon available
|
// Make the notify icon available
|
||||||
SimpleServiceProvider.Current.AddService(notifyIcon);
|
SimpleServiceProvider.Current.AddService(notifyIcon);
|
||||||
|
|
||||||
// TODO: Enable check if the Windows 10 notification service is available
|
|
||||||
//if (WindowsVersion.IsBeforeWindows10)
|
|
||||||
//{
|
|
||||||
SimpleServiceProvider.Current.AddService(new NotifyIconNotificationService());
|
|
||||||
//}
|
|
||||||
|
|
||||||
// Disable access to the settings, for feature #3521446
|
// Disable access to the settings, for feature #3521446
|
||||||
contextmenu_settings.Visible = !_conf.DisableSettings;
|
contextmenu_settings.Visible = !_conf.DisableSettings;
|
||||||
|
|
||||||
|
@ -374,8 +368,14 @@ namespace Greenshot {
|
||||||
// Load all the plugins
|
// Load all the plugins
|
||||||
PluginHelper.Instance.LoadPlugins();
|
PluginHelper.Instance.LoadPlugins();
|
||||||
|
|
||||||
// Check destinations, remove all that don't exist
|
// Check to see if there is already another INotificationService
|
||||||
foreach(string destination in _conf.OutputDestinations.ToArray()) {
|
if (SimpleServiceProvider.Current.GetInstance<INotificationService>() == null)
|
||||||
|
{
|
||||||
|
SimpleServiceProvider.Current.AddService<INotificationService>(new NotifyIconNotificationService());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check destinations, remove all that don't exist
|
||||||
|
foreach (string destination in _conf.OutputDestinations.ToArray()) {
|
||||||
if (DestinationHelper.GetDestination(destination) == null) {
|
if (DestinationHelper.GetDestination(destination) == null) {
|
||||||
_conf.OutputDestinations.Remove(destination);
|
_conf.OutputDestinations.Remove(destination);
|
||||||
}
|
}
|
||||||
|
@ -416,6 +416,7 @@ namespace Greenshot {
|
||||||
if (dataTransport != null) {
|
if (dataTransport != null) {
|
||||||
HandleDataTransport(dataTransport);
|
HandleDataTransport(dataTransport);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Make Greenshot use less memory after startup
|
// Make Greenshot use less memory after startup
|
||||||
if (_conf.MinimizeWorkingSetSize) {
|
if (_conf.MinimizeWorkingSetSize) {
|
||||||
PsAPI.EmptyWorkingSet();
|
PsAPI.EmptyWorkingSet();
|
||||||
|
@ -443,7 +444,7 @@ namespace Greenshot {
|
||||||
break;
|
break;
|
||||||
case CommandEnum.FirstLaunch:
|
case CommandEnum.FirstLaunch:
|
||||||
LOG.Info("FirstLaunch: Created new configuration, showing balloon.");
|
LOG.Info("FirstLaunch: Created new configuration, showing balloon.");
|
||||||
var notifyIconClassicMessageHandler = SimpleServiceProvider.Current.GetInstance<NotifyIconNotificationService>();
|
var notifyIconClassicMessageHandler = SimpleServiceProvider.Current.GetInstance<INotificationService>();
|
||||||
notifyIconClassicMessageHandler.ShowInfoMessage(Language.GetFormattedString(LangKey.tooltip_firststart, HotkeyControl.GetLocalizedHotkeyStringFromString(_conf.RegionHotkey)), 2000, ShowSetting);
|
notifyIconClassicMessageHandler.ShowInfoMessage(Language.GetFormattedString(LangKey.tooltip_firststart, HotkeyControl.GetLocalizedHotkeyStringFromString(_conf.RegionHotkey)), 2000, ShowSetting);
|
||||||
break;
|
break;
|
||||||
case CommandEnum.ReloadConfig:
|
case CommandEnum.ReloadConfig:
|
||||||
|
@ -497,14 +498,14 @@ namespace Greenshot {
|
||||||
base.WndProc(ref m);
|
base.WndProc(ref m);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Helper method to cleanly register a hotkey
|
/// Helper method to cleanly register a hotkey
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="failedKeys"></param>
|
/// <param name="failedKeys">StringBuilder</param>
|
||||||
/// <param name="functionName"></param>
|
/// <param name="functionName">string</param>
|
||||||
/// <param name="hotkeyString"></param>
|
/// <param name="hotkeyString">string</param>
|
||||||
/// <param name="handler"></param>
|
/// <param name="handler">HotKeyHandler</param>
|
||||||
/// <returns></returns>
|
/// <returns>bool</returns>
|
||||||
private static bool RegisterHotkey(StringBuilder failedKeys, string functionName, string hotkeyString, HotKeyHandler handler) {
|
private static bool RegisterHotkey(StringBuilder failedKeys, string functionName, string hotkeyString, HotKeyHandler handler) {
|
||||||
Keys modifierKeyCode = HotkeyControl.HotkeyModifiersFromString(hotkeyString);
|
Keys modifierKeyCode = HotkeyControl.HotkeyModifiersFromString(hotkeyString);
|
||||||
Keys virtualKeyCode = HotkeyControl.HotkeyFromString(hotkeyString);
|
Keys virtualKeyCode = HotkeyControl.HotkeyFromString(hotkeyString);
|
||||||
|
@ -547,8 +548,8 @@ namespace Greenshot {
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Fix icon reference
|
/// Fix icon reference
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="sender"></param>
|
/// <param name="sender">object</param>
|
||||||
/// <param name="e"></param>
|
/// <param name="e">PropertyChangedEventArgs</param>
|
||||||
private void OnIconSizeChanged(object sender, PropertyChangedEventArgs e) {
|
private void OnIconSizeChanged(object sender, PropertyChangedEventArgs e) {
|
||||||
if (e.PropertyName == "IconSize")
|
if (e.PropertyName == "IconSize")
|
||||||
{
|
{
|
||||||
|
|
|
@ -546,7 +546,7 @@ namespace Greenshot.Helpers {
|
||||||
if (string.IsNullOrEmpty(eventArgs?.Message)) {
|
if (string.IsNullOrEmpty(eventArgs?.Message)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var notifyIconClassicMessageHandler = SimpleServiceProvider.Current.GetInstance<NotifyIconNotificationService>();
|
var notifyIconClassicMessageHandler = SimpleServiceProvider.Current.GetInstance<INotificationService>();
|
||||||
switch (eventArgs.MessageType) {
|
switch (eventArgs.MessageType) {
|
||||||
case SurfaceMessageTyp.Error:
|
case SurfaceMessageTyp.Error:
|
||||||
notifyIconClassicMessageHandler.ShowErrorMessage(eventArgs.Message, 10000);
|
notifyIconClassicMessageHandler.ShowErrorMessage(eventArgs.Message, 10000);
|
||||||
|
|
|
@ -29,7 +29,7 @@ namespace Greenshot.Helpers
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Notify the user with messages via the NotifyIcon
|
/// Notify the user with messages via the NotifyIcon
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class NotifyIconNotificationService
|
public class NotifyIconNotificationService : INotificationService
|
||||||
{
|
{
|
||||||
private static readonly ILog Log = LogManager.GetLogger(typeof(NotifyIconNotificationService));
|
private static readonly ILog Log = LogManager.GetLogger(typeof(NotifyIconNotificationService));
|
||||||
private readonly NotifyIcon _notifyIcon;
|
private readonly NotifyIcon _notifyIcon;
|
||||||
|
|
55
GreenshotPlugin/Interfaces/INotificationService.cs
Normal file
55
GreenshotPlugin/Interfaces/INotificationService.cs
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
/*
|
||||||
|
* Greenshot - a free and open source screenshot tool
|
||||||
|
* Copyright (C) 2007-2020 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;
|
||||||
|
|
||||||
|
namespace Greenshot.Helpers
|
||||||
|
{
|
||||||
|
public interface INotificationService
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// This will show a warning message to the user
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="message">string</param>
|
||||||
|
/// <param name="timeout"></param>
|
||||||
|
/// <param name="onClickAction">Action called if the user clicks the notification</param>
|
||||||
|
/// <param name="onClosedAction">Action</param>
|
||||||
|
void ShowWarningMessage(string message, int timeout, Action onClickAction = null, Action onClosedAction = null);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// This will show an error message to the user
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="message">string</param>
|
||||||
|
/// <param name="timeout"></param>
|
||||||
|
/// <param name="onClickAction">Action called if the user clicks the notification</param>
|
||||||
|
/// <param name="onClosedAction">Action</param>
|
||||||
|
void ShowErrorMessage(string message, int timeout, Action onClickAction = null, Action onClosedAction = null);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// This will show an info message to the user
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="message">string</param>
|
||||||
|
/// <param name="timeout">int</param>
|
||||||
|
/// <param name="onClickAction">Action called if the user clicks the notification</param>
|
||||||
|
/// <param name="onClosedAction">Action</param>
|
||||||
|
void ShowInfoMessage(string message, int timeout, Action onClickAction = null, Action onClosedAction = null);
|
||||||
|
}
|
||||||
|
}
|
107
GreenshotWin10Plugin/ToastNotificationService.cs
Normal file
107
GreenshotWin10Plugin/ToastNotificationService.cs
Normal file
|
@ -0,0 +1,107 @@
|
||||||
|
/*
|
||||||
|
* Greenshot - a free and open source screenshot tool
|
||||||
|
* Copyright (C) 2007-2020 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.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using Windows.UI.Notifications;
|
||||||
|
using Greenshot.Helpers;
|
||||||
|
using log4net;
|
||||||
|
|
||||||
|
namespace GreenshotWin10Plugin
|
||||||
|
{
|
||||||
|
public class ToastNotificationService : INotificationService
|
||||||
|
{
|
||||||
|
private static readonly ILog Log = LogManager.GetLogger(typeof(ToastNotificationService));
|
||||||
|
|
||||||
|
private void ShowMessage(string message, Action onClickAction, Action onClosedAction)
|
||||||
|
{
|
||||||
|
// Get a toast XML template
|
||||||
|
var toastXml = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastImageAndText01);
|
||||||
|
|
||||||
|
// Fill in the text elements
|
||||||
|
var stringElement = toastXml.GetElementsByTagName("text").First();
|
||||||
|
stringElement.AppendChild(toastXml.CreateTextNode(message));
|
||||||
|
|
||||||
|
// Specify the absolute path to an image
|
||||||
|
//string imagePath = "file:///" + Path.GetFullPath("toastImageAndText.png");
|
||||||
|
//var imageElement = toastXml.GetElementsByTagName("image").First();
|
||||||
|
//imageElement.Attributes.GetNamedItem("src").NodeValue = imagePath;
|
||||||
|
|
||||||
|
// Create the toast and attach event listeners
|
||||||
|
var toast = new ToastNotification(toastXml);
|
||||||
|
|
||||||
|
void ToastActivatedHandler(ToastNotification toastNotification, object sender)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
onClickAction?.Invoke();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Log.Warn("Exception while handling the onclick action: ", ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
toast.Activated -= ToastActivatedHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (onClickAction != null)
|
||||||
|
{
|
||||||
|
toast.Activated += ToastActivatedHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ToastDismissedHandler(ToastNotification toastNotification, ToastDismissedEventArgs eventArgs)
|
||||||
|
{
|
||||||
|
Log.Debug("Toast closed");
|
||||||
|
try
|
||||||
|
{
|
||||||
|
onClosedAction?.Invoke();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Log.Warn("Exception while handling the onClosed action: ", ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
toast.Dismissed -= ToastDismissedHandler;
|
||||||
|
// Remove the other handler too
|
||||||
|
toast.Activated -= ToastActivatedHandler;
|
||||||
|
}
|
||||||
|
toast.Dismissed += ToastDismissedHandler;
|
||||||
|
// Show the toast. Be sure to specify the AppUserModelId on your application's shortcut!
|
||||||
|
ToastNotificationManager.CreateToastNotifier(@"Greenshot").Show(toast);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ShowWarningMessage(string message, int timeout, Action onClickAction = null, Action onClosedAction = null)
|
||||||
|
{
|
||||||
|
ShowMessage(message, onClickAction, onClosedAction);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ShowErrorMessage(string message, int timeout, Action onClickAction = null, Action onClosedAction = null)
|
||||||
|
{
|
||||||
|
ShowMessage(message, onClickAction, onClosedAction);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ShowInfoMessage(string message, int timeout, Action onClickAction = null, Action onClosedAction = null)
|
||||||
|
{
|
||||||
|
ShowMessage(message, onClickAction, onClosedAction);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -20,7 +20,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using Greenshot.Helpers;
|
||||||
using GreenshotPlugin.Core;
|
using GreenshotPlugin.Core;
|
||||||
using GreenshotPlugin.Interfaces;
|
using GreenshotPlugin.Interfaces;
|
||||||
using GreenshotPlugin.Interfaces.Ocr;
|
using GreenshotPlugin.Interfaces.Ocr;
|
||||||
|
@ -34,14 +34,14 @@ namespace GreenshotWin10Plugin
|
||||||
/// This is the Win10Plugin
|
/// This is the Win10Plugin
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Plugin("Win10", false)]
|
[Plugin("Win10", false)]
|
||||||
public class Win10Plugin : IGreenshotPlugin
|
public sealed class Win10Plugin : IGreenshotPlugin
|
||||||
{
|
{
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
Dispose(true);
|
Dispose(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void Dispose(bool disposing)
|
private void Dispose(bool disposing)
|
||||||
{
|
{
|
||||||
if (disposing)
|
if (disposing)
|
||||||
{
|
{
|
||||||
|
@ -63,8 +63,10 @@ namespace GreenshotWin10Plugin
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// Set this as IOcrProvider
|
|
||||||
SimpleServiceProvider.Current.AddService<IOcrProvider>(new Win10OcrProvider());
|
SimpleServiceProvider.Current.AddService<INotificationService>(new ToastNotificationService());
|
||||||
|
// Set this as IOcrProvider
|
||||||
|
SimpleServiceProvider.Current.AddService<IOcrProvider>(new Win10OcrProvider());
|
||||||
// Add the processor
|
// Add the processor
|
||||||
SimpleServiceProvider.Current.AddService<IProcessor>(new Win10OcrProcessor());
|
SimpleServiceProvider.Current.AddService<IProcessor>(new Win10OcrProcessor());
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue