コード例 #1
0
ファイル: WindowManager.cs プロジェクト: zetz/xenko
        private static void WindowHidden(IntPtr hwnd)
        {
            Logger.Verbose($"Processing newly hidden window ({hwnd})...");

            var windowInfo = Find(hwnd);

            if (windowInfo == null)
            {
                var message = $"This window was not handled by the {nameof(WindowManager)} ({hwnd})";
                Logger.Verbose(message);
                return;
            }

            windowInfo.IsShown = false;
            windowInfo.WindowClosed.SetResult(0);
            AllWindowsList.Remove(windowInfo);

            if (MainWindow != null && MainWindow.Equals(windowInfo))
            {
                Logger.Info($"Main window closed. ({hwnd})");
                MainWindow = null;
                MainWindowChanged?.Invoke(null, new WindowManagerEventArgs(MainWindow));
            }
            else
            {
                var index = ModalWindowsList.IndexOf(windowInfo);
                if (index >= 0)
                {
                    var childModal  = index < ModalWindows.Count - 1 ? ModalWindows[index + 1] : null;
                    var parentModal = index > 0 ? ModalWindows[index - 1] : MainWindow;
                    if (childModal != null)
                    {
                        childModal.Owner = parentModal;
                        if (parentModal != null)
                        {
                            parentModal.IsDisabled = true;
                        }
                    }
                    else if (parentModal != null)
                    {
                        parentModal.IsDisabled = false;
                    }
                    ModalWindowClosed?.Invoke(null, new WindowManagerEventArgs(windowInfo));
                    ModalWindowsList.RemoveAt(index);

                    var nextWindow = ModalWindows.FirstOrDefault(x => x.Hwnd != IntPtr.Zero && x.IsVisible) ?? MainWindow;
                    if (nextWindow != null && nextWindow.Hwnd != IntPtr.Zero)
                    {
                        NativeHelper.SetActiveWindow(nextWindow.Hwnd);
                    }

                    Logger.Info($"Modal window closed. ({hwnd})");
                }
            }
        }
コード例 #2
0
ファイル: WindowManager.cs プロジェクト: zetz/xenko
        private static void WindowShown(IntPtr hwnd)
        {
            if (!HwndHelper.HasStyleFlag(hwnd, NativeHelper.WS_VISIBLE))
            {
                Logger.Debug($"Discarding non-visible window ({hwnd})");
                return;
            }

            Logger.Verbose($"Processing newly shown window ({hwnd})...");
            var windowInfo = Find(hwnd);

            if (windowInfo == null)
            {
                windowInfo = new WindowInfo(hwnd);

                if (Debugger.IsAttached)
                {
                    foreach (var debugWindowTypeName in DebugWindowTypeNames)
                    {
                        if (windowInfo.Window?.GetType().FullName.StartsWith(debugWindowTypeName) ?? false)
                        {
                            Logger.Debug($"Discarding debug/diagnostics window '{windowInfo.Window.GetType().FullName}' ({hwnd})");
                            return;
                        }
                    }
                }

                AllWindowsList.Add(windowInfo);
            }
            windowInfo.IsShown = true;

            if (windowInfo == MainWindow)
            {
                Logger.Info("Main window shown.");
                MainWindowChanged?.Invoke(null, new WindowManagerEventArgs(MainWindow));
            }
            else
            {
                if (windowInfo.IsModal)
                {
                    // If this window has not been shown using a WindowManager method, add it as a top-level modal window
                    if (!ModalWindows.Any(x => x.Equals(windowInfo)))
                    {
                        var lastModal = ModalWindows.LastOrDefault() ?? MainWindow;
                        if (lastModal != null)
                        {
                            windowInfo.Owner     = lastModal;
                            lastModal.IsDisabled = true;
                        }
                        ModalWindowsList.Add(windowInfo);
                        Logger.Info($"Modal window shown. (standalone) ({hwnd})");
                    }
                    else
                    {
                        var index       = ModalWindowsList.IndexOf(windowInfo);
                        var childModal  = index < ModalWindows.Count - 1 ? ModalWindows[index + 1] : null;
                        var parentModal = index > 0 ? ModalWindows[index - 1] : MainWindow;
                        if (childModal != null)
                        {
                            childModal.Owner      = windowInfo;
                            windowInfo.IsDisabled = true;
                            // We're placing another window on top of us, let's activate it so it comes to the foreground!
                            if (childModal.Hwnd != IntPtr.Zero)
                            {
                                NativeHelper.SetActiveWindow(childModal.Hwnd);
                            }
                        }
                        if (parentModal != null)
                        {
                            parentModal.IsDisabled = true;
                        }
                        Logger.Info($"Modal window shown. (with WindowManager) ({hwnd})");
                    }
                    ModalWindowOpened?.Invoke(null, new WindowManagerEventArgs(windowInfo));
                }
            }
        }