我开始使用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
交叉图标,但仍然存在。
答案 0 :(得分:2)
在TextView
中发现光标变得可见之后,我确信问题依赖于我的代码中的某个地方。
window.GdkWindow
无效的问题让我想到,可能在应用程序Run()
之前没有设置。
在我记忆中的某个地方,出现了一个我在SO上发现的关于事件的问题,这些问题在Widget
暴露后被调用 - 开始寻找它们。
起初,我参加了window.Shown
活动:
window.Shown += delegate
{
window.GdkWindow.Cursor = new Gdk.Cursor(Gdk.CursorType.Arrow);
};
瞧! - 光标可见。
然后我继续转向更合理的window.Realized
事件,这也证明是值得的。
这种神秘的解决了!