Новый символический цвет в тексте Pango Span

Плакат первого раза; давний поклонник ангелов переполнения стека.

У меня проблема с цветами в тексте диапазона, которые контролируются 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


person Sizz    schedule 16.07.2016    source источник


Ответы (1)


Если вы можете использовать GTK 3.x, я бы посоветовал сделать это, поскольку это гораздо проще сделать с помощью CSS. Существует даже способ использовать несколько стилей CSS для разных областей одной и той же метки, хотя это неудобно.

Как вы заметили, в GTK 2 вы можете ссылаться на виджеты по их свойству name в вашем RC-файле:

widget "shark-tank-ph-label" style "green-text"
style "green-text" {
    text[NORMAL] = #008000
}

Я бы рекомендовал использовать этот подход, даже если это не то, к чему вы привыкли. Рефакторинг один раз для удаления жестко запрограммированных цветов из ваших меток значительно упростит в следующий раз, когда вам придется изменить что-то подобное, а также приблизит ваш код к тому, как все будет работать в GTK 3.x, если вы решите сделать порт. в будущем.

person ptomato    schedule 04.08.2016