首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取带有自定义头条的gnome-3类窗口

获取带有自定义头条的gnome-3类窗口
EN

Stack Overflow用户
提问于 2016-10-17 23:58:28
回答 1查看 665关注 0票数 3

我的问题

我正在使用Anjuta/gtkmm/C++,并希望设计一个类似于其他gnome 3程序的程序。

这包括一个大的可拖头栏,上面有自定义按钮,还有其他视觉效果,比如窗口后面更大的背景阴影。

黑棒问题

到目前为止,我发现了GtkHeaderBar Widget。我还发现,您可以使用main_win->set_titlebar(*header_bar);使其可拖放。此外,我勾选了“客户端窗口装饰”复选框中的沼泽地插件(在安朱塔内)。

然而,现在它看起来像在下面的图片。我该怎么摆脱那个黑酒吧?

与其他桌面的兼容性

另一个问题是如何保持与其他DEs的兼容性?我打赌会有两个不同的glade/xml文件(或者其中的一部分在两个外部文件中)。一个包含生成gnome 3类窗口的代码,另一个生成普通窗口。在加载程序时,将根据gnome 3或任何其他桌面环境下运行的事实来决定应该加载哪个文件。但是,确定DE是否为gnome 3的最佳方法是什么?

更新

当我取消“客户端窗口装饰”和“装饰”时,黑条就不见了。但是阴影和圆角也不见了。

我这么做是对的吗?应该怎么做呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-21 12:20:09

好吧,我想出来了。

黑棒问题

要想在没有上述问题之一的情况下在沼泽地获得这个酷酷的gnome栏,请执行以下步骤:

  1. 在窗口属性的"General选项卡“中勾选”客户端窗口装饰“。确保“装饰”也被勾上了,即使它是灰色的。您可以在取消“客户端窗口装饰”时勾选(或取消)。

  1. 窗口顶部应该出现一个新的空间。

  1. 在里面放一个标题栏

  1. (可选)在其属性的"General“选项卡中勾选”显示窗口控件“,并给它一个标题和一个副标题

Voila:

注意,甚至不需要像main_win->set_titlebar(*header_bar);这样的东西。在您的代码中没有任何特定的操作可以完成。

兼容性

保持兼容性的唯一方法似乎是在问题帖子中已经描述过的方式。确定gnome是否正在运行或是否使用了正确版本的GTK+的最佳方法如下所示。(或者至少是我想出的最好的一个)。它从这里使用函数execstackoverflow

代码语言:javascript
复制
//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";
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40097455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档