Получите gnome-3-подобные окна с пользовательской панелью заголовка

Я работаю с Anjuta / gtkmm / C ++ и хочу разработать программу, похожую на другие программы gnome 3.

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

Black Bar Issue

До сих пор я обнаружил GtkHeaderBar Widget. Я также обнаружил, что вы можете использовать main_win->set_titlebar(*header_bar); чтобы сделать его перетаскиваемым. Кроме того, я установил флажок «Декорации на стороне клиента» в плагине glade (внутри Anjuta).

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

Совместимость с другими десктопами

Другой вопрос, как сохранить совместимость с другими DE? Моя ставка будет состоять в том, чтобы иметь два разных файла glade / xml (или одну их часть в двух внешних файлах). Один содержит код, который генерирует окно, похожее на gnome-3, и код, который генерирует нормальное окно. При загрузке программы определяется, какой файл следует загрузить, исходя из того, работает ли она под gnome 3 или в любой другой среде рабочего стола. Но как лучше определить, является ли DE гномом 3?

скриншот с черной полосой сверху

Обновить

Когда я снимаю флажок «Декорации на стороне клиента» и «Декорированный», черная полоса исчезает Но тени и закругленные углы тоже исчезли.

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

Способ, которым я делаю это, даже правильный? Как это должно быть сделано?

2

Решение

Хорошо, я понял это.

Чтобы получить этот классный гном-бар на поляне без одной из вышеупомянутых проблем, выполните следующие действия:

  1. Отметьте «Оформление окна на стороне клиента» на вкладке «Общие» в свойствах окна. Убедитесь, что галочка «Декорировано» тоже отмечена, даже если она неактивна. Вы можете поставить галочку (или убрать галочку) с этого пункта, пока «Украшение окна на стороне клиента» не отмечено

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

  1. Новое место в верхней части окна должно появиться

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

  1. Поместите панель заголовка в это

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

  1. (Необязательно) Установите флажок «Показать элементы управления окном» на вкладке «Общие» его свойств и присвойте ему заголовок и субтитры.

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

Вуаля:

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

Обратите внимание, что-то вроде main_win->set_titlebar(*header_bar); даже не нужно Там нет ничего конкретного, что вы должны сделать в своем коде, чтобы сделать эту работу.

Кажется, единственный способ сохранить совместимость — это способ, уже описанный в посте с вопросом. Лучший способ определить, работает ли gnome-shell или используется правильная версия GTK +, представлен ниже. (Или, по крайней мере, лучший, который я придумал). Использует функцию exec отсюда: переполнение стека.

//is gnome-shell running?
std::string gnomeString = exec(
"pgrep -lx \"gnome-shell\" | head -1 | cut -d \" \" -f2");
//get version string
std::string gnomeVersionString = exec(
"gnome-shell --version | sed -e \"s/GNOME Shell //\"");

//parse version string to int array; not 100% necessary, but nice to have
std::vector<int> gnomeVersion;
std::stringstream ss(gnomeVersionString); std::string item;

while (std::getline(ss, item, '.'))
gnomeVersion.push_back(std::atoi(item.c_str()));

//optional requirement for gnome-like header bar:
bool isGnome3 = gnomeString == "gnome-shell\n" &&
gnomeVersion.size() > 0 &&
gnomeVersion[0] >= 3;

//absolute requirement for gnome-like header bar:
bool correctGTKversion = gtk_major_version >= 3 &&
gtk_minor_version >= 10;

std::cout << "isGnome3: " << (isGnome3?"yes":"no") << "\n";
std::cout << "correctGTK+: " << (correctGTKversion?"yes":"no") << "\n";
std::cout << "gnome version: ";
for(int v : gnomeVersion)
std::cout << v << ".";
std::cout << "\n";
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]