Плакат первого раза; давний поклонник ангелов переполнения стека.
У меня проблема с цветами в тексте диапазона, которые контролируются Pango.
Длинная версия:
Я обновляю старую программу пользовательского интерфейса, в которой есть код C++ с GTK, XML (написанный Glade) и таблицей стилей RC, обрабатывающей графику. Часть нашего цветного текста разметки жестко запрограммирована в XML. Некоторые из них динамически задаются в коде C++. Проблема в том, что когда программа работает на наших старых системах, цвет, указанный в тексте диапазона как «зеленый», отображается как #00FF00. В наших новых системах «зеленый» отображается как #008000. Пример печати кода в виджет этикетки:
gtk_label_set_markup((GtkLabel *) TitleBarLabel, "<span color='green'>Orbital Cannon Positioning</span>");
Я совершенно уверен, что Pango контролирует разметку текста диапазона. Я обнаружил, что разница между зеленым цветом точно такая же, как между списками цветов X11 и W3C (https://en.wikipedia.org/wiki/X11_color_names#Clashes_between_web_and_X11_colors). Кажется, что наши старые системы используют X11, а наши новые используют W3C, что имеет смысл.
Я мог бы просто заменить все экземпляры «зеленого» на «#00FF00», но если бы мы захотели изменить цвета в будущем, нам пришлось бы пройти через все это снова. Я бы предпочел, чтобы цвета менялись с помощью таблицы стилей, а не запекались в коде.
Код С++:
GtkWidget * TitleBarLabel;
TitleBarLabel = GTK_WIDGET (get_builder_object (builder, "TitleBarLabel"));
gtk_label_set_markup((GtkLabel *) TitleBarLabel, "<span color='#00FF00'>Death Ray Power Status</span>");
Я могу создать GdkColor во время выполнения и gdk_color_parse со значениями из файла конфигурации, а затем использовать gtk_widget_modify_text() для применения цвета к виджетам меток. Но тогда это не работает для всего жестко запрограммированного текста span в XML. Кроме того, у нас есть множество меток с фрагментами текста, окрашенными по-разному внутри одной строки.
Код С++:
GdkColor pass_color;
gdk_color_parse("#00FF00", &pass_color);
gtk_widget_modify_text(TitleBarLabel, GTK_STATE_NORMAL, &pass_color);
Я могу создать стиль в своем файле RC для каждого цвета и связать каждую метку, которая будет использовать этот цвет во время выполнения. Но нам пришлось бы удалить всю раскраску разметки и добавить много кода для захвата виджетов, с которыми мы никогда не беспокоились раньше, и код для установки имен виджетов вместо того, чтобы просто печатать их с новым текстом диапазона. Это дает желаемый результат изменения цветов в таблице стилей, но это масштабное мероприятие, и оно не интуитивно понятно для наших инженеров-ветеранов, которые привыкли использовать атрибуты цвета.
RC-файл:
style "pass_color"
{
fg[NORMAL] = #00FF00
}
widget "*TitleBarLabel_Pass" style "pass_color"
Код С++:
gtk_widget_set_name(TitleBarLabel, "TitleBarLabel_Pass");
Краткая версия:
В идеале я хотел бы иметь возможность создавать новый цвет во время выполнения, который мы можем связать с текстом span в такой фракции:
<span color='MyNewColor'>Weather Manipulation Settings</span>
Или, может быть, даже создать новый тег, который применяет определенные атрибуты, например:
<span><MyNewColor>Shark Tank pH Balance</MyNewColor></span>
Но я сомневаюсь, что это возможно.
Я пробовал играть с pango_attr_type_register(), pango_attr_foreground_new() и другими, но не мог понять, как работают атрибуты, если они вообще могут делать то, что я думал. После долгих исследований оказалось, что «атрибут» — это просто одноразовая настройка для одной строки текста. А не новое значение, которое можно вызвать в строке span text, как я надеялся.
Возможно ли что-то подобное удаленно без пересборки всего Pango?
Есть ли другой обходной путь, который позволил бы мне получить таблицу стилей, такую как установка?
На данный момент я открыт для предложений.
Характеристики версии:
Компьютеры, отмеченные зеленым как #00FF00
ОС: Linux Slackware 13.37 и ниже
GTK: 2.24.4
Pango: 1.28.4
Компьютеры с зеленым цветом #008000
ОС: Linux Slackware 14.1
GTK: 2.24.20
Pango: 1.34.1