GTK: избавиться от системной темы / CSS в целом - PullRequest
0 голосов
/ 05 октября 2018

Приложения GTK3 могут быть стилизованы и тематически оформлены с помощью CSS.Как заставить GTK использовать исключительно CSS, поставляемый с моим приложением, вместо того, чтобы комбинировать / каскадировать его с темой, установленной в системе пользователя?

Зачем кому-то это нужносделать это ?Теоретически, CSS был бы отличной системой стилей, основанной на правилах, где вы просто добавляете один экран, полный тщательно выбранных правил, чтобы согласованно определять внешний вид вашего приложения.К сожалению, на практике люди склонны добавлять сотни мертвых, повторяющихся определений в свои таблицы стилей, тем самым подделывая саму природу каскадирования.

Фактическая проблема заключается в том, что мое приложение должно получить типичные, приглушенные темныесерый вид приложения обработки мультимедиа, независимо от глобальной темы, установленной в системе пользователя.Прочитав документацию GTK и учебное пособие GTKmm , я пришел к следующему коду для чтения своей собственной таблицы стилей CSS:

auto screen = Gdk::Screen::get_default();
auto css_provider = Gtk::CssProvider::create();
try {
    css_provider->load_from_path(lib::resolveModulePath (stylesheetName, resourceSerachPath));

} catch(Glib::Error const& failure) {
    WARN(gui, "Failure while loading stylesheet '%s': %s", cStr(stylesheetName), cStr(failure.what()));
}

Gtk::StyleContext::add_provider_for_screen(screen, css_provider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);

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

Вопросы

  • Как я могу сказать GTK использовать только мою таблицу стилей для моего приложения?
  • Есть ли жизнеспособная альтернатива, которая не столь радикальна, но все же позволяет мнеиспользовать CSS так, как это было задумано (минимальный набор правил + каскадирование)?

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Как указывает @ptomato, вы можете установить CSS, чтобы эффективно переопределять любые ранее существующие другие правила в системе.Тем не менее, это также показывает путь к менее радикальному решению: просто отмените проблемные части предустановленной темы.

Как это работает?

Мы добавляем универсальные правила вCSS, то есть правила, которые каким-то образом выбирают любой возможный элемент или, по крайней мере, полное поддерево.Это достигается использованием подстановочного знака * в селекторе.И так как мы устанавливаем нашу таблицу стилей с более высоким приоритетом (обычно GTK_STYLE_PROVIDER_PRIORITY_APPLICATION), эти правила будут «перекрывать» каждое конкретное правило, которое присутствует с более низким приоритетом.

  • , мы можем использовать значениеunset чтобы очистить настройку
  • мы можем использовать значение inherit, чтобы заставить свойство извлекаться из установки этого свойства родительским виджетом.

Специально дляУчитывая проблему, чтобы «серое подчиненное медиа-приложение» выглядело в среде с «легкой» темой, мы можем использовать

* {
    color: inherit;
    background-color: inherit;
}

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

Мы даже можем расширить эту идею и обработать дополнительные проблемные параметры в рамках данной области, используя подстановочный знак подCSS контекстный селектор.И ключевым трюком, чтобы получить это право, является использование GTK + инспектор в вашем работающем приложении и изучение фактических настроек, чтобы найти наименьшую возможную точку, чтобы «схватить» проблемную настройку.(Чтобы активировать GTK + инспектор, запустите ваше приложение с GTK_DEBUG=interactive path/to/my/app)

0 голосов
/ 05 октября 2018

Вы можете использовать файл reset.css из демоверсий GTK для отмены всех существующих правил.

Менее радикальной альтернативой может быть просто игнорирование пользовательских тем, отличных от стандартных.Предположительно, если у пользователя есть тема, созданная с использованием плохих методов CSS, ему, тем не менее, нравится эта тема.Так почему же они не смогут просматривать ваше приложение с предпочитаемой темой?

...