运行 没有 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
事件,这也被证明是值得的。
谜团解开了!
我正在启动一个 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
事件,这也被证明是值得的。
谜团解开了!