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); } }
// 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 }); })