Я работаю с Anjuta / gtkmm / C ++ и хочу разработать программу, похожую на другие программы gnome 3.
Это включает в себя большую перетаскиваемую панель заголовков с настраиваемыми кнопками на ней и другие визуальные эффекты, такие как большая тень фона за окном.
До сих пор я обнаружил GtkHeaderBar
Widget. Я также обнаружил, что вы можете использовать main_win->set_titlebar(*header_bar);
чтобы сделать его перетаскиваемым. Кроме того, я установил флажок «Декорации на стороне клиента» в плагине glade (внутри Anjuta).
Однако теперь это выглядит так, как показано на рисунке ниже. Как мне избавиться от этой черной полосы?
Другой вопрос, как сохранить совместимость с другими DE? Моя ставка будет состоять в том, чтобы иметь два разных файла glade / xml (или одну их часть в двух внешних файлах). Один содержит код, который генерирует окно, похожее на gnome-3, и код, который генерирует нормальное окно. При загрузке программы определяется, какой файл следует загрузить, исходя из того, работает ли она под gnome 3 или в любой другой среде рабочего стола. Но как лучше определить, является ли DE гномом 3?
Когда я снимаю флажок «Декорации на стороне клиента» и «Декорированный», черная полоса исчезает Но тени и закругленные углы тоже исчезли.
Способ, которым я делаю это, даже правильный? Как это должно быть сделано?
Хорошо, я понял это.
Чтобы получить этот классный гном-бар на поляне без одной из вышеупомянутых проблем, выполните следующие действия:
Вуаля:
Обратите внимание, что-то вроде 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";
Других решений пока нет …