Почему символические значки GNOME выглядят темнее в работающем приложении?

10

Я создаю приложение, которое использует символические значки из темы по умолчанию.

Однако есть несколько нужных мне значков, которые не могут быть представлены значками из темы по умолчанию, поэтому я создаю свои собственные.

Я просто пошел /usr/share/icons/gnome/scalable/actions/, скопировал несколько локально в дерево исходных текстов моего приложения, которое могло бы послужить основой, и начал их редактировать.

Все идет нормально. Но я заметил следующее: все символические значки имеют светло-серый цвет при просмотре исходного файла .svg, но когда они помещаются в виджет, они становятся темнее.

Вот пример использования /usr/share/icons/gnome/scalable/actions/view-refresh-symbolic.svgзначка из темы по умолчанию:

  • Вот как это выглядит при открытии оригинала с помощью Inkscape:

view-refresh-symbolic на Inkscape

  • А вот как это выглядит на панели инструментов запущенного приложения:

view-refresh-symbolic on во время выполнения

Обратите внимание, что значок во время выполнения стал намного темнее. Это происходит как с темами Ambiance, так и Radiance.

Я бы не стал возражать, но я заметил, что это влияет на мой пользовательский значок, в результате чего его части становятся темнее (внутренняя заливка), тогда как его части остаются того же цвета, что и оригинал (штрих).

Итак, что заставляет символические значки по умолчанию темнеть и как это реализовать для моих пользовательских значков?

Дэвид Планелла
источник
Как вы загружаете иконку точно, в приложении?
Добей
С Glade, на кнопке панели инструментов, используя параметр «Загрузить из имени значка».
Дэвид Планелла
Тогда наиболее вероятным ответом будет то, что он вообще не загружает ваш пользовательский значок, а один из темы значков в стеке, который имеет совпадающее имя (или запасное имя).
Добей

Ответы:

15
  • Символические значки создаются в цвете с насыщенными цветами, сером с полной непрозрачностью ( #bebebeff). Затем они могут быть окрашены на основе fg_colorзначения, определенного темой в settings.ini(GTK3) или gtkrc(GTK2); или по fg_colorопределению в CSS (GTK3).
    • Например, для Ambiance цвет переднего плана ( fg_color) установлен на темно-серый ( #4c4c4c) /usr/share/themes/Ambiance/gtk-3.0/settings.ini, поэтому символические значки выглядят темнее.
  • Чтобы пользовательские символические значки выглядели одинаково, необходимо удалить обводку и использовать только заливку со значением RGBA, установленным на #bebebeff; в противном случае обводка всегда будет отображаться как заданная (т.е. серый или любой другой цвет).

    • В Inkscape просто выберите объект, откройте « Заливка и обводка» и щелкните значок « Без рисования (x)» под «Обводкой»:

    введите описание изображения здесь

  • Это дает нам красивую и даже выглядящую символическую иконку «MyRefresh»:

    введите описание изображения здесь


Один пользователь указал, что вместо символического значка гнома по умолчанию открывается другой, более темный значок; как показывает эта линия, это утверждение неверно:

введите описание изображения здесь

иш
источник
Спасибо за отличный ответ! Однако есть еще одна вещь, которую я не совсем понимаю: почему пользовательские символические значки не могут иметь штрихов, даже если они заполнены #bebebeff?
Дэвид Планелла
Я думаю, что это связано с тем, как Gnome рендерит (растеризует) символические SVG, основываясь на значении fg_color(он использует libRSVG ); Очевидно, что двигатель различает заливки и штрихи и, по-видимому, кодируется для применения fg_colorтолько к заливке, оставляя штрих как есть. Это можно сделать потому, что SVG является векторизованным (параметризованным) форматом, в то время как для обычных растровых значков это всего лишь пиксели :)
ish
3

Символические иконки обычно задаются темой с помощью свойства «color», это их большое преимущество, они хорошо смотрятся на любом фоне. Однако вы можете загрузить их своим собственным цветом.

Пример кода Вала:

//get the icon theme and lookup the icon we want by name, here at a size of 64px
var info = Gtk.IconTheme.get_default ().lookup_icon ("view-refresh-symbolic", 64, 0);

//now load the icon as a symbolic with a color set in the brackets as RGBA, here as plain red
var pixbuf = info.load_symbolic ({1, 0, 0, 1});

//finally we just put in a GtkImage to render it
var image_widget = new Gtk.Image.from_pixbuf (pixbuf);
Том
источник
Действительно, перекрашивание в соответствии с текущей темой является едва ли не главной целью символических значков (другое - быть проще и более разборчивым, что также способствует)
underscore_d