如何在 Gtk3 可选标签中设置光标颜色?

How to set cursor color in Gtk3 selectable label?

我有一个使用 Gtk3 用 Perl 编写的程序,我在其中创建了一个 selectable 标签,我希望用户能够从中进行复制。默认情况下,Gtk3 似乎假定用户想要 select 使用键盘,因此每当您单击标签时它都会显示一个光标/插入符号。有没有一种方法可以将光标的颜色更改为不太明显的颜色或使其完全不可见,就像通常发生的情况一样,例如在 Firefox 中用于非输入字段?

4 年前我在这里看到了一个类似的问题,有人建议使用 override_cursorset_style,但现在 Gtk 3.24 似乎都已弃用。我尝试使用自定义 caret-color 属性 定义 CSS 样式,但它似乎仅适用于 Entry 小部件而不适用于 selectable 标签。无论是为所有 类 * 还是仅为 label 定义自定义插入符号颜色,我都会得到这种行为。其他 CSS 属性,例如 background-color 似乎工作正常。

一个额外的问题:Gtk3 参考手册建议对 add_provider 的第二个参数使用 GTK_STYLE_PROVIDER_PRIORITY_FALLBACKGTK_STYLE_PROVIDER_PRIORITY_USER 之间的值。我如何在 Perl 中编写这些常量?我试过 GTK_STYLE_PROVIDER_PRIORITY_FALLBACK 带引号和不带引号、"style-provider-priority-fallback""priority-fallback" 和许多其他组合,但 Perl 似乎可以识别 none。

到目前为止,这是我的代码的相关部分:

#!/usr/bin/perl
use Gtk3 -init;

my $window = Gtk3::Window->new('toplevel');
my $box = Gtk3::Box->new('horizontal',0);

my $label = Gtk3::Label->new();
$label->set_selectable(TRUE);
$label->set_label("Testing");

$box->pack_start($label, FALSE, FALSE, 5);

my $style = "* { caret-color: transparent; }";
my $css = Gtk3::CssProvider->new();
$css->load_from_data($style);

my $stylecontext = $label->get_style_context();
$stylecontext->add_provider($css,1);

$window->add($box);
$window->show_all;

Gtk3->main();

您可以使用 gtk_style_context_add_class() 向您的标签添加自定义 class。例如:

use strict;
use warnings;
use Glib qw(TRUE FALSE);
use Gtk3 -init;

my $window = Gtk3::Window->new('toplevel');
$window->signal_connect( destroy  => sub { Gtk3->main_quit() } );
my $box = Gtk3::Box->new('horizontal',0);
my $label = Gtk3::Label->new();
$label->set_selectable(TRUE);
$label->set_label("Testing");
$box->pack_start($label, FALSE, FALSE, 5);
my $stylecontext = $label->get_style_context();
$stylecontext->add_class("my_label");
my $style = ".my_label { caret-color: transparent; }";
my $css = Gtk3::CssProvider->new();
$css->load_from_data($style);
$stylecontext->add_provider($css, Gtk3::STYLE_PROVIDER_PRIORITY_USER);
$window->add($box);
$window->show_all;
Gtk3->main();

这也展示了如何获取常量GTK_STYLE_PROVIDER_PRIORITY_USER的值。