在没有Window Manager的情况下运行时,Gtk2应用程序中的不可见光标

时间:2015-08-06 14:51:52

标签: c# mono gtk gtk# xorg

我开始使用Gtk#应用程序,用于在ArchLinux live CD上创建GUI配置工具。

我已将应用程序的所有先决条件都加入到现场CD中,但我遇到了一个问题,如果我在没有运行窗口管理器的情况下启动应用程序,它将会有一个不可见的光标图标。我可以移动鼠标,看到按钮上的悬停效果,点击它们 - 只是有不可见的光标。

应用程序非常简单,因为我刚刚开始:

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)并在那里运行应用程序,我将有一个可见的光标占用默认样式。

如果我要运行肉桂会话,我会看到我的光标并且(我没有运行应用程序)我假设光标会持续存在于应用程序中。

Arch附带了一个默认的Gtk2配置文件,该文件使用了我已经安装的Adwaita主题。

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

我的光标在剥离的X设置中消失会出现什么问题?

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

更新

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

1 个答案:

答案 0 :(得分:2)

TextView中发现光标变得可见之后,我确信问题依赖于我的代码中的某个地方。

window.GdkWindow无效的问题让我想到,可能在应用程序Run()之前没有设置。

在我记忆中的某个地方,出现了一个我在SO上发现的关于事件的问题,这些问题在Widget暴露后被调用 - 开始寻找它们。

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

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

瞧! - 光标可见。

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

这种神秘的解决了!