Пример #1
0
        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
Пример #2
0
        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);
        }
Пример #3
0
        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);
            }
        }
Пример #4
0
 protected ToastifyMediaAction(string name, ToastifyActionEnum actionEnum, long appCommandCode, VirtualKeyCode virtualKeyCode) : base(name, actionEnum)
 {
     this.AppCommandCode = appCommandCode;
     this.VirtualKeyCode = virtualKeyCode;
 }
Пример #5
0
 protected ToastifyMediaAction(string name, ToastifyActionEnum actionEnum, long appCommandCode) : this(name, actionEnum, appCommandCode, VirtualKeyCode.None)
 {
 }
 public FakeToastifyAction(string name, ToastifyActionEnum toastifyAction) : base(name, toastifyAction)
 {
 }
Пример #7
0
 protected ToastifyAction(string name, ToastifyActionEnum actionEnum)
 {
     this.Name = name;
     this.ToastifyActionEnum = actionEnum;
 }
Пример #8
0
        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);
        }
Пример #9
0
 /// <inheritdoc />
 public ToastifyAction GetAction(ToastifyActionEnum actionEnum)
 {
     return(this.GetOrAddAction(actionEnum));
 }
Пример #10
0
 public ToastifySimpleMediaAction(string name, ToastifyActionEnum actionEnum, long appCommandCode, VirtualKeyCode virtualKeyCode) : base(name, actionEnum, appCommandCode, virtualKeyCode)
 {
 }