Первый раз постер; долгое время поклонник ангелов переполнения стека.Новый символический цвет в тексте Панго
У меня проблема с цветами в тексте диапазона, которые контролируются Pango.
Long Version:
Я обновляю старые программы пользовательского интерфейса, который имеет C++ код кишок с GTK, XML (написанной Поляны), и обработки графики RC таблицы стилей. Некоторые из наших цветных текстов разметки жестко закодированы в XML. Некоторые из них динамически задаются в коде C++. Проблема в том, что, когда программа работает в наших старых системах, цвет, на который ссылается текст интервала как «зеленый», отображается как # 00FF00. В наших новых системах «зеленый» отображается как # 008000. Пример кода печати на виджете метки:
gtk_label_set_markup((GtkLabel *) TitleBarLabel, "<span color='green'>Orbital Cannon Positioning</span>");
Я абсолютно уверен, что Панго контролирует пролете разметки текста. Я обнаружил, что разница между зеленью - это различие между списками цветов X11 и W3C (https://en.wikipedia.org/wiki/X11_color_names#Clashes_between_web_and_X11_colors). Кажется, что наши старые системы используют X11, а наши новые используют W3C, что имеет смысл.
Я мог бы просто заменить все экземпляры «зеленых» с «# 00ff00», но если мы хотим изменить цвета в будущем, мы должны были бы снова пройти через все это. Я бы предпочел бы, чтобы цвета изменялись через таблицу стилей, а не запекались в коде.
C++ Код:
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(), чтобы применить цвет к виджетам этикеток , Но тогда это не работает для всего жестко закодированного текста диапазона в XML. Кроме того, мы располагаем этикетками с битами текста, по-разному окрашенными внутри одной линии.
C++ Код:
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"
C++ Код:
gtk_widget_set_name(TitleBarLabel, "TitleBarLabel_Pass");
Короткая версия:
В идеале, я хотел бы быть в состоянии сделать новый цвет в run- время, которое мы можем связать с текстом диапазона в такой фракции:
<span color='MyNewColor'>Weather Manipulation Settings</span>
Или, может быть, даже создать новый тег, который применяет определенные атрибуты, как:
<span><MyNewColor>Shark Tank pH Balance</MyNewColor></span>
Но я сомневаюсь, что это возможно.
Я попытался поиграть с pango_attr_type_register(), pango_attr_foreground_new() и друзьями, но я не мог понять, как работают атрибуты, если они могут даже делать то, что, как я думал, они сделали. После долгих исследований, похоже, что «атрибут» - это всего лишь одноразовая настройка для одной строки текста. И не новое значение, которое можно назвать в соответствии с текстом диапазона, как я надеялся.
Возможно ли это как можно удаленно, без переустановки всего Pango?
Есть ли другая работа вокруг, которая поможет мне составить таблицу стилей, такую как настройка?
На данный момент я открыт для предложений.
версия Технические характеристики:
Компьютеры, показывающие, как зеленый # 00FF00
ОС: Linux Slackware 13.37 и ниже
GTK: 2.24.4
Панго: 1.28.4
Компьютеры, показывающие, как зеленый # 008000
ОС: Linux Slackware 14.1
GTK: 2.24.20
Панго: 1.34.1