Получить имя значка для идентификатора запаса?

Вопрос

Я пытаюсь получить имя (строки) значка (строки), соответствующее заданному (строковому) значению запаса Gtk.

Пример

Идентификатор "gtk-go-forward" в каталоге Gtk имеет два соответствующих имени значков: "gtk-go-forward-ltr" и "gtk-go-forward-rtl". Я хотел бы получить либо:

  • оба значка имен "gtk-go-forward-ltr" и "gtk-go-forward-rtl" заданы идентификатором "gtk-go-forward" ; ИЛИ
  • просто имя значка "gtk-go-forward-ltr" ( "соответствующий" для моего текстового направления).

Потенциальные ограничения

Я использую API-интерфейс интроспекции gobject, а не базу C.

Обоснование (необязательно для чтения)

Я пытаюсь сделать St.Icon для значка, указанного идентификатором запаса, но при довольно большом размере (96 пикселей).

Я могу использовать gtk_icon_set_render_icon с прямым идентификатором "gtk-go-forward" (он выбирает версию LTR) (синтаксис - это java-код GNOME, но это не имеет отношения к quesiton, я использую API-интерфейс для интроспекции GObject):

let style = Gtk.Widget.get_default_style();
let iconset = style.lookup_icon_set('gtk-go-forward');
let icon = new St.Icon({
    gicon: iconset.render_icon(gtkStyle, Gtk.TextDirection.LTR,
                               Gtk.StateType.NORMAL, Gtk.IconSize.DIALOG,
                               null, null),
    icon_type: St.IconType.FULLCOLOR,
    icon_size: 96
});

Это даст мне значок для идентификатора запаса "gtk-go-forward" (он выбирает "gtk-go-forward-ltr" ), , но значок очень нечеткий.

Альтернативно, если я напрямую пишу имя значка "gtk-go-forward-ltr" , значок не является нечетким:

let icon = new St.Icon({
    gicon: Gio.ThemedIcon.new_with_default_fallbacks('gtk-go-forward-ltr'),
    icon_type: St.IconType.FULLCOLOR,
    icon_size: 96
});

Таким образом, я считаю, что мой лучший выбор при получении большого, не-нечеткого значка - найти имя значка для идентификатора запаса, а не использовать идентификатор запаса (подача gtk-go-forward во второй метод выше дает значок "отсутствует значок", поскольку он не является допустимым именем значка).

Icon using stock ID (top); using icon name (bottom)

На рисунке выше верхний значок использует первый метод (идентификатор запаса с render_icon), а нижний значок использует второй метод (используйте имя значка напрямую). Большая разница в ясности.

Ответы

Ответ 1

Имена общих значков Stock

Этот вопрос немного устарел, но для дальнейшего использования: лучше использовать "go-next", а не "gtk-go-forward" - это правильное имя в соответствии с Icon Naming Spec, и рекомендуется с тех пор, как разработчики GTK планируют отказаться от значков запасов в ближайшее время.

Чтобы напрямую ответить на вопрос, как указано в названии: вот удобная электронная таблица Google Docs, дающая эквивалентные имена спецификаций значков для значков акций GTK.

Нечеткие, большие версии значков GTK

Что касается получения не-нечетких версий значков по умолчанию, лучшим способом, который я нашел для отображения значка в 96px в GTK, является загрузка его в GdkPixbuf, а затем используйте его, а не GtkIcon ( который ограничен 48px, что является самым большим GtkIconSize, как указано в j__m). Пример того, как это сделать в Vala (легко преобразовать в JS или Python и т.д.):

var icon_theme = Gtk.IconTheme.get_default();
try {
    var pixbuf = icon_theme.load_icon("go-next", 96, Gtk.IconLookupFlags.USE_BUILTIN);
    // Do something with the pixbuf, for example use it with a CellRendererPixbuf,
    // or a GtkButton or whatever
catch (GLib.Error e) {
    GLib.critical("Could not load icon: %s", e.message);
}

Вы также можете поэкспериментировать с Gtk.IconLookupFlags.FORCE_SIZE и/или FORCE_SVG, особенно если хотите действительно огромные значки.

Я боюсь, что я никогда не использовал Shell Toolkit, поэтому я не знаю, нужен ли вам особенно тег St.Icon, но в простом GTK вы можете использовать GdkPixbuf почти везде, где можете использовать запас значок так что это обходной путь, который я нашел очень полезным.

Ответ 2

GTK_ICON_SIZE_DIALOG (Gtk.IconSize.DIALOG в Javascript) меньше 96 пикселей. Вы отдаете маленькую иконку, а затем взорвали ее; естественно, будет плохо выглядеть.

Как я помню, значение -1 возвращает значок в любом исходном размере. Затем вы можете использовать St.Icon, чтобы указать размер, на который вы хотите нарисовать его, так как это похоже на то, как вы все равно хотите его использовать.