Ejemplo n.º 1
0
 public override int GetHashCode()
 {
     unchecked
     {
         var hashCode = (Payload != null ? Payload.GetHashCode() : 0);
         hashCode = (hashCode * 397) ^ (LogName != null ? LogName.GetHashCode() : 0);
         hashCode = (hashCode * 397) ^ (TargetApplicationName != null ? TargetApplicationName.GetHashCode() : 0);
         hashCode = (hashCode * 397) ^ TargetApplicationVersion.GetHashCode();
         return(hashCode);
     }
 }
Ejemplo n.º 2
0
        // FIXME: VMでやることじゃない
        public AxisStandardViewModel(
            INativeWindowManager nativeWindowManager,
            IScreenManager screenManager,
            IAudioManager audioManager,
            IVersionRepository versionRepository,
            ISettingService settingService)
        {
            settings              = settingService.Instance();
            Vertical              = BindSettings(settings.Vertical, nameof(settings.Vertical));
            Horizontal            = BindSettings(settings.Horizontal, nameof(settings.Horizontal));
            WindowFittingStandard = BindSettings(settings.WindowFittingStandard, nameof(settings.WindowFittingStandard));
            MuteCondition         = BindSettings(settings.MuteCondition, nameof(settings.MuteCondition));
            TargetApplicationName = BindSettings(settings.TargetApplicationName, nameof(TargetApplicationName));
            LatestVersion         = new ReactiveProperty <string>("");

            UseCurrentVerticalUserSetting   = BindSettings(settings.UseCurrentVerticalUserSetting, nameof(settings.UseCurrentVerticalUserSetting), ReactivePropertyMode.RaiseLatestValueOnSubscribe);
            UseCurrentHorizontalUserSetting = BindSettings(settings.UseCurrentHorizontalUserSetting, nameof(settings.UseCurrentHorizontalUserSetting), ReactivePropertyMode.RaiseLatestValueOnSubscribe);
            UserDefinedVerticalWindowRect   = BindSettings(settings.UserDefinedVerticalWindowRect, nameof(settings.UserDefinedVerticalWindowRect));
            UserDefinedHorizontalWindowRect = BindSettings(settings.UserDefinedHorizontalWindowRect, nameof(settings.UserDefinedHorizontalWindowRect));
            IsMostTop      = BindSettings(settings.IsMostTop, nameof(settings.IsMostTop));
            IsRemoveBorder = BindSettings(settings.IsRemoveBorder, nameof(settings.IsRemoveBorder));

            // FIXME: PollingじゃなくてGlobalHookとかでやりたい
            targetWindowHandle = Observable.Interval(TimeSpan.FromSeconds(5))
                                 .CombineLatest(TargetApplicationName)
                                 .Select(x => nativeWindowManager.GetWindowHandle(x.Second))
                                 .Distinct()
                                 .ToReadOnlyReactiveProperty();

            // FIXME: TargetApplicationNameが変わってもThreadが変わって動かなくなるわ…
            Disposable.Add(TargetApplicationName.Subscribe(x => nativeWindowManager.SetHook(x)));
            Disposable.Add(targetWindowHandle.Subscribe(x => nativeWindowManager.SetTargetProcessHandler(x)));

            var observableBorderChanged = Observable.FromEventPattern(nativeWindowManager, nameof(nativeWindowManager.OnBorderChanged)).StartWith(new object[] { null });
            var observableOnMoveChanged = Observable.FromEventPattern(nativeWindowManager, nameof(nativeWindowManager.OnMoveOrSizeChanged)).Throttle(TimeSpan.FromMilliseconds(200)).StartWith(new object[] { null });

            var windowRect = targetWindowHandle
                             .CombineLatest(
                observableOnMoveChanged,
                observableBorderChanged.Delay(TimeSpan.FromMilliseconds(500))
                )
                             .Select(x =>
            {
                if (x.First == IntPtr.Zero)
                {
                    return(WindowRect.Empty, WindowRect.Empty);
                }
                var windowClientRectPair = nativeWindowManager.GetWindowRect(x.First);
                var(r, _) = windowClientRectPair;
                if (r.IsEmpty)
                {
                    return(WindowRect.Empty, WindowRect.Empty);
                }
                return(windowClientRectPair);
            });

            Disposable.Add(UseCurrentHorizontalUserSetting.Subscribe(x =>
            {
                if (!x)
                {
                    return;
                }
                var handle = targetWindowHandle.Value;
                if (handle == IntPtr.Zero)
                {
                    return;
                }
                var(r, _) = nativeWindowManager.GetWindowRect(handle);
                if (r.IsEmpty)
                {
                    UserDefinedHorizontalWindowRect.Value = WindowRect.Empty;
                    return;
                }
                UserDefinedHorizontalWindowRect.Value = r;
                return;
            }));

            Disposable.Add(UseCurrentVerticalUserSetting.Subscribe(x =>
            {
                if (!x)
                {
                    return;
                }
                var handle = targetWindowHandle.Value;
                if (handle == IntPtr.Zero)
                {
                    return;
                }
                var(r, _) = nativeWindowManager.GetWindowRect(handle);
                if (r.IsEmpty)
                {
                    UserDefinedVerticalWindowRect.Value = WindowRect.Empty;
                    return;
                }
                UserDefinedVerticalWindowRect.Value = r;
                return;
            }));

            Disposable.Add(targetWindowHandle.CombineLatest(
                               MuteCondition,
                               Observable.CombineLatest(
                                   Observable.FromEventPattern <bool>(nativeWindowManager, nameof(nativeWindowManager.OnForeground))
                                   .Select(x => x.EventArgs.ToDefaultableBooleanLike()).StartWith(DefaultableBooleanLike.Default),
                                   Observable.FromEventPattern <bool>(nativeWindowManager, nameof(nativeWindowManager.OnMinimized))
                                   .Select(x => x.EventArgs.ToDefaultableBooleanLike()).StartWith(DefaultableBooleanLike.Default)
                                   )
                               .DistinctUntilChanged()
                               .Select(x =>
            {
                var maybeForeground = x[0];
                var maybeMinimized  = x[1];
                return((maybeForeground, maybeMinimized) switch
                {
                    (DefaultableBooleanLike.Default, DefaultableBooleanLike.Default) => ApplicationState.Foreground,
                    (DefaultableBooleanLike.Default, DefaultableBooleanLike.True) => ApplicationState.Minimized,
                    (DefaultableBooleanLike.Default, DefaultableBooleanLike.False) => ApplicationState.Background,
                    (DefaultableBooleanLike.True, DefaultableBooleanLike.Default) => ApplicationState.Foreground,
                    (DefaultableBooleanLike.True, DefaultableBooleanLike.True) => ApplicationState.Minimized,
                    (DefaultableBooleanLike.True, DefaultableBooleanLike.False) => ApplicationState.Foreground,
                    (DefaultableBooleanLike.False, DefaultableBooleanLike.Default) => ApplicationState.Background,
                    (DefaultableBooleanLike.False, DefaultableBooleanLike.True) => ApplicationState.Minimized,
                    (DefaultableBooleanLike.False, DefaultableBooleanLike.False) => ApplicationState.Background
                });
            })