private static void StartupTaskPreSettings() { if (logger.IsDebugEnabled) { logger.Debug($"[{nameof(StartupTaskPreSettings)}]"); } // Convert the settings file if (File.Exists(Settings.SettingsFilePath)) { JObject jSettings; using (var sr = new StreamReader(Settings.SettingsFilePath)) { using (var jsonReader = new JsonTextReader(sr)) { jSettings = JObject.Load(jsonReader); } } JToken jPreviousV = jSettings["PreviousVersion"]; var previousV = new Version(jPreviousV?.Value <string>() ?? "0"); // [IDO] Hotkeys if (previousV < new Version("1.10.10")) { // pre-1.10.10 hotkeys must be converted to the current format logger.Info("Converting old hotkeys to the current format..."); JToken jHotkeys = jSettings["HotKeys"]; if (jHotkeys?.HasValues == true) { var convertedHotkeys = new JArray(); foreach (JToken jHotkey in jHotkeys.Children()) { JToken jKeyOrButton = jHotkey["KeyOrButton"]; JToken jKey = jKeyOrButton?["Key"]; ModifierKeys modifiers = (jHotkey["Alt"]?.Value <bool>() == true ? ModifierKeys.Alt : ModifierKeys.None) | (jHotkey["Ctrl"]?.Value <bool>() == true ? ModifierKeys.Control : ModifierKeys.None) | (jHotkey["Shift"]?.Value <bool>() == true ? ModifierKeys.Shift : ModifierKeys.None) | (jHotkey["WindowsKey"]?.Value <bool>() == true ? ModifierKeys.Windows : ModifierKeys.None); ToastifyActionEnum toastifyActionEnum = Enum.TryParse(jHotkey["Action"]?.Value <string>(), out ToastifyActionEnum tae) ? tae : ToastifyActionEnum.None; ToastifyAction action = App.Container.Resolve <IToastifyActionRegistry>().GetAction(toastifyActionEnum); bool enabled = jHotkey["Enabled"]?.Value <bool>() ?? false; Hotkey h = jKeyOrButton?["IsKey"]?.Value <bool>() ?? jKey != null ? new KeyboardHotkey { Modifiers = modifiers, Key = Enum.TryParse(jKey?.Value <string>(), out Key k) ? k : (Key?)null, Action = action, Enabled = enabled } as Hotkey
public static void SendMediaKey(ToastifyActionEnum action) { VirtualKeyCode virtualKey; switch (action) { case ToastifyActionEnum.Stop: virtualKey = VirtualKeyCode.VK_MEDIA_STOP; break; case ToastifyActionEnum.PlayPause: virtualKey = VirtualKeyCode.VK_MEDIA_PLAY_PAUSE; break; case ToastifyActionEnum.Mute: virtualKey = VirtualKeyCode.VK_VOLUME_MUTE; break; case ToastifyActionEnum.VolumeDown: virtualKey = VirtualKeyCode.VK_VOLUME_DOWN; break; case ToastifyActionEnum.VolumeUp: virtualKey = VirtualKeyCode.VK_VOLUME_UP; break; case ToastifyActionEnum.PreviousTrack: virtualKey = VirtualKeyCode.VK_MEDIA_PREV_TRACK; break; case ToastifyActionEnum.NextTrack: virtualKey = VirtualKeyCode.VK_MEDIA_NEXT_TRACK; break; case ToastifyActionEnum.None: case ToastifyActionEnum.FastForward: case ToastifyActionEnum.Rewind: case ToastifyActionEnum.ShowToast: case ToastifyActionEnum.ShowSpotify: case ToastifyActionEnum.CopyTrackInfo: case ToastifyActionEnum.SettingsSaved: case ToastifyActionEnum.PasteTrackInfo: case ToastifyActionEnum.ThumbsUp: case ToastifyActionEnum.ThumbsDown: case ToastifyActionEnum.Exit: #if DEBUG case ToastifyActionEnum.ShowDebugView: #endif default: return; } User32.KeyboardEvent(virtualKey, 0, 1, IntPtr.Zero); }
public void SendAction(ToastifyActionEnum action) { if (!this.IsRunning) { return; } bool sendAppCommandMessage = false; bool sendMediaKey = false; switch (action) { #if DEBUG case ToastifyActionEnum.ShowDebugView: #endif case ToastifyActionEnum.None: case ToastifyActionEnum.CopyTrackInfo: case ToastifyActionEnum.PasteTrackInfo: case ToastifyActionEnum.ThumbsUp: case ToastifyActionEnum.ThumbsDown: case ToastifyActionEnum.ShowToast: case ToastifyActionEnum.SettingsSaved: case ToastifyActionEnum.Exit: break; case ToastifyActionEnum.ShowSpotify: Analytics.TrackEvent(Analytics.ToastifyEventCategory.Action, Analytics.ToastifyEvent.Action.ShowSpotify); if (this.IsMinimized) { this.ShowSpotify(); } else { this.Minimize(); } break; case ToastifyActionEnum.VolumeUp: Analytics.TrackEvent(Analytics.ToastifyEventCategory.Action, Analytics.ToastifyEvent.Action.VolumeUp); switch ((ToastifyVolumeControlMode)Settings.Current.VolumeControlMode) { // The Spotify volume control mode has been dropped since Spotify version 1.0.75.483.g7ff4a0dc due to issue #31 //case ToastifyVolumeControlMode.Spotify: // this.SendShortcut(action); // break; case ToastifyVolumeControlMode.SystemSpotifyOnly: VolumeHelper.IncrementVolume(Settings.Current.WindowsVolumeMixerIncrement); break; case ToastifyVolumeControlMode.SystemGlobal: sendMediaKey = true; break; default: sendMediaKey = true; break; } break; case ToastifyActionEnum.VolumeDown: Analytics.TrackEvent(Analytics.ToastifyEventCategory.Action, Analytics.ToastifyEvent.Action.VolumeDown); switch ((ToastifyVolumeControlMode)Settings.Current.VolumeControlMode) { // The Spotify volume control mode has been dropped since Spotify version 1.0.75.483.g7ff4a0dc due to issue #31 //case ToastifyVolumeControlMode.Spotify: // this.SendShortcut(action); // break; case ToastifyVolumeControlMode.SystemSpotifyOnly: VolumeHelper.DecrementVolume(Settings.Current.WindowsVolumeMixerIncrement); break; case ToastifyVolumeControlMode.SystemGlobal: default: sendMediaKey = true; break; } break; case ToastifyActionEnum.Mute: Analytics.TrackEvent(Analytics.ToastifyEventCategory.Action, Analytics.ToastifyEvent.Action.Mute); switch ((ToastifyVolumeControlMode)Settings.Current.VolumeControlMode) { case ToastifyVolumeControlMode.SystemSpotifyOnly: VolumeHelper.ToggleMute(); break; // The Spotify volume control mode has been dropped since Spotify version 1.0.75.483.g7ff4a0dc due to issue #31 //case ToastifyVolumeControlMode.Spotify: case ToastifyVolumeControlMode.SystemGlobal: default: sendMediaKey = true; break; } break; case ToastifyActionEnum.FastForward: case ToastifyActionEnum.Rewind: case ToastifyActionEnum.Stop: case ToastifyActionEnum.PlayPause: case ToastifyActionEnum.PreviousTrack: case ToastifyActionEnum.NextTrack: goto default; default: Analytics.TrackEvent(Analytics.ToastifyEventCategory.Action, $"{Analytics.ToastifyEvent.Action.Default}{action}"); sendAppCommandMessage = true; break; } if (sendAppCommandMessage) { Windows.SendAppCommandMessage(this.GetMainWindowHandle(), (IntPtr)action, true); } if (sendMediaKey) { Win32API.SendMediaKey(action); } }
protected ToastifyMediaAction(string name, ToastifyActionEnum actionEnum, long appCommandCode, VirtualKeyCode virtualKeyCode) : base(name, actionEnum) { this.AppCommandCode = appCommandCode; this.VirtualKeyCode = virtualKeyCode; }
protected ToastifyMediaAction(string name, ToastifyActionEnum actionEnum, long appCommandCode) : this(name, actionEnum, appCommandCode, VirtualKeyCode.None) { }
public FakeToastifyAction(string name, ToastifyActionEnum toastifyAction) : base(name, toastifyAction) { }
protected ToastifyAction(string name, ToastifyActionEnum actionEnum) { this.Name = name; this.ToastifyActionEnum = actionEnum; }
private ToastifyAction GetOrAddAction(ToastifyActionEnum actionEnum) { if (this.actions.ContainsKey(actionEnum)) { return(this.actions[actionEnum]); } ToastifyAction action = null; ToastifyVolumeControlMode GetVolumeControlModeDelegate() => Settings.Current.VolumeControlMode; switch (actionEnum) { case ToastifyActionEnum.None: action = new ToastifyNoAction(); break; case ToastifyActionEnum.ShowToast: #if DEBUG action = new ToastifyShowToast { ShouldPrintExtendedDebugLog = true }; #else action = new ToastifyShowToast(); #endif break; case ToastifyActionEnum.ShowSpotify: action = new ToastifyShowSpotify(); break; case ToastifyActionEnum.Stop: action = new ToastifySimpleMediaAction("Stop", actionEnum, (long)actionEnum, VirtualKeyCode.VK_MEDIA_PLAY_PAUSE) { ActionType = MediaActionType.AppCommandMessage }; break; case ToastifyActionEnum.PlayPause: action = new ToastifySimpleMediaAction("Play / Pause", actionEnum, (long)actionEnum, VirtualKeyCode.VK_MEDIA_PLAY_PAUSE) { ActionType = MediaActionType.AppCommandMessage }; break; case ToastifyActionEnum.Mute: action = new ToastifyVolumeMute(GetVolumeControlModeDelegate, () => Spotify.Instance.ToggleMute()) { ActionType = MediaActionType.MediaKey }; break; case ToastifyActionEnum.VolumeDown: action = new ToastifyVolumeDown(GetVolumeControlModeDelegate, () => Spotify.Instance.VolumeDown()) { ActionType = MediaActionType.MediaKey }; break; case ToastifyActionEnum.VolumeUp: action = new ToastifyVolumeUp(GetVolumeControlModeDelegate, () => Spotify.Instance.VolumeUp()) { ActionType = MediaActionType.MediaKey }; break; case ToastifyActionEnum.PreviousTrack: action = new ToastifySimpleMediaAction("Previous Track", actionEnum, (long)actionEnum, VirtualKeyCode.VK_MEDIA_PREV_TRACK) { ActionType = MediaActionType.AppCommandMessage }; break; case ToastifyActionEnum.NextTrack: action = new ToastifySimpleMediaAction("Next Track", actionEnum, (long)actionEnum, VirtualKeyCode.VK_MEDIA_NEXT_TRACK) { ActionType = MediaActionType.AppCommandMessage }; break; case ToastifyActionEnum.FastForward: action = new ToastifySimpleMediaAction("Fast Forward", actionEnum, (long)actionEnum) { ActionType = MediaActionType.AppCommandMessage }; break; case ToastifyActionEnum.Rewind: action = new ToastifySimpleMediaAction("Rewind", actionEnum, (long)actionEnum) { ActionType = MediaActionType.AppCommandMessage }; break; case ToastifyActionEnum.Exit: action = new ToastifyExit(); break; #if DEBUG case ToastifyActionEnum.ShowDebugView: action = new ToastifyShowDebugView(); break; #endif // TODO: What should we do with these? Are they really necessary? case ToastifyActionEnum.CopyTrackInfo: case ToastifyActionEnum.SettingsSaved: case ToastifyActionEnum.PasteTrackInfo: case ToastifyActionEnum.ThumbsUp: case ToastifyActionEnum.ThumbsDown: default: logger.Warn($"Unhandled toastify action enum value: {actionEnum}"); break; } if (action != null) { this.actions[actionEnum] = action; } return(action); }
/// <inheritdoc /> public ToastifyAction GetAction(ToastifyActionEnum actionEnum) { return(this.GetOrAddAction(actionEnum)); }
public ToastifySimpleMediaAction(string name, ToastifyActionEnum actionEnum, long appCommandCode, VirtualKeyCode virtualKeyCode) : base(name, actionEnum, appCommandCode, virtualKeyCode) { }