运行 没有 Window 管理器时 Gtk2 应用程序中的不可见光标

Invisible cursor in Gtk2 application when ran without Window Manager

我正在启动一个 Gtk# 应用程序,旨在在我的 ArchLinux live CD 上创建一个 GUI 配置器工具。

我已经将应用程序的所有先决条件都烘焙到 live CD 中,但我遇到了一个问题,如果我在没有 运行 宁 window 管理器的情况下启动我的应用程序 - 它将有一个不可见的光标图标。我可以四处移动鼠标,查看按钮上的悬停效果,单击它们 - 只是有一个不可见的光标。

申请很简单,刚入门:

using System;
using Gtk;

namespace StoneInstallerWizard
{
    class MainClass
    {
        public static void Main (string[] args)
        {
            // Initialize GTK.
            Application.Init();

            // Create a window.
            Window window = new Window("StoneInstallerWizard");

            // Attach closing part to the delete event.
            window.DeleteEvent += delegate
            {
                Application.Quit();
            };

            // Window settings.
            window.WindowPosition = WindowPosition.Center;
            window.Resizable = false;
            window.TypeHint = Gdk.WindowTypeHint.Dialog;

            // HorizontalBox.
            var hbox = new HBox();
            window.Add(hbox);

            // Close button.
            var closeBtn = new Button(Stock.Close);
            closeBtn.Clicked += delegate
            {
                Application.Quit();
            };
            hbox.Add(closeBtn);

            // Next button.
            var nextBtn = new Button(Stock.Apply);
            nextBtn.Clicked += delegate
            {
                var message = new MessageDialog(window, DialogFlags.Modal | DialogFlags.DestroyWithParent, MessageType.Info, ButtonsType.Ok, "And so we continue...");

                ResponseType messageResponse = (ResponseType) message.Run();

                // Clicked or closed, doesn't matter.
                if (messageResponse == ResponseType.Ok || messageResponse == ResponseType.DeleteEvent)
                {
                    message.Destroy();
                    Application.Quit();
                }
            };
            hbox.Add(nextBtn);

            // Show the window and start the app.
            window.ShowAll();
            Application.Run();
        }
    }
}

如果我要创建一个默认派生的 ~/.xinitrc 并用我的应用程序替换 exec 部分并继续 startx - 那是它启动时,但光标是隐藏的。

现在,如果我使用默认的 xinitrc 配置(在 Arch 上它带有 twm、三个 xterms 和 xclock)和 运行 那里的应用程序,我将有一个可见的光标占据默认样式。

如果我要 运行 cinnamon-session,我会看到我的光标并且(我没有 运行 应用程序)我假设光标会持续到应用程序。

Arch 带有默认的 Gtk2 配置文件,使用 Adwaita 主题,我也安装了它。

我假设我必须为我的 Gtk 应用程序设置一个游标,所以我确实尝试添加 window.GdkWindow.Cursor = new Gdk.Cursor(Gdk.CursorType.Arrow);,但显然这在两者(WM 和独立)中都以 NullExceptionError 作为 GdkWindow 变量未设置。

我的光标在剥离的 X 设置中消失可能是什么问题?

P.S。所有未提及的配置文件均为默认值。

更新

如果我将 TextView 添加到我的应用程序,运行 它并将鼠标悬停在 TextView 上,它将显示文本光标图标 I,如果我将鼠标悬停在 TextView 上, 它将恢复为默认的 X 十字图标,但仍然存在。

在发现 TextView 中光标变得可见后,我确信问题出在我的代码中。

window.GdkWindow被取消的问题让我想到,可能直到申请Run()才设置。

在我记忆中的某个地方,弹出了一个我在 SO 上发现的关于事件的问题,一旦 Widget 被公开就会被调用 - 开始寻找它们。

起初,我参加了 window.Shown 活动:

window.Shown += delegate
{
    window.GdkWindow.Cursor = new Gdk.Cursor(Gdk.CursorType.Arrow);
};

瞧! — 光标可见。

然后我继续转向更合理的 window.Realized 事件,这也被证明是值得的。

谜团解开了!