【问题标题】:Get gnome-3-like windows with custom headerbar使用自定义标题栏获取类似 gnome-3 的窗口
【发布时间】:2016-10-17 23:58:28
【问题描述】:

我的问题

我正在使用 Anjuta/gtkmm/C++ 并想设计一个看起来类似于其他 gnome 3 程序的程序。

这包括带有自定义按钮的大型可拖动标题栏和其他视觉效果,例如窗口后面更大的背景阴影。

黑条问题

到目前为止,我发现了 GtkHeaderBar 小部件。我还发现您可以使用main_win->set_titlebar(*header_bar); 使其可拖动。此外,我在 glade 插件(Anjuta 内部)中勾选了“客户端窗口装饰”复选框。

但是现在看起来如下图所示。我如何摆脱那个黑条?

与其他桌面的兼容性

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

更新

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

我这样做的方式是否正确?应该怎么做?

【问题讨论】:

标签: c++ gtk3 gnome gtkmm


【解决方案1】:

好的,我想通了。

黑条问题

要在林间空地中获得这个很酷的 gnome 酒吧,而不会出现上述问题之一,请按照以下步骤操作:

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

  1. 应该会在窗口顶部出现一个新空间

  1. 在其中放置一个标题栏

  1. (可选)在其属性的“常规”选项卡中勾选“显示窗口控件”并为其指定标题和副标题

瞧:

请注意,甚至不需要像 main_win->set_titlebar(*header_bar); 这样的东西。您无需在代码中执行任何特定操作即可完成这项工作。

兼容性

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

//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";

【讨论】:

  • 您不需要生成另一个进程来获取环境变量。这些可以通过使用 std::string = Glib::getenv("GDMSESSION"); .此外,可以将 GDMSESSION 设置为“默认”并且仍然运行 gnome-shell 或任何其他 shell。
  • @Errolvandel'Isle 感谢您的提示。我使用askubuntu.com/a/227669/232476 作为我原始代码的来源。但我现在想出了一个更强大的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-05
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 1970-01-01
相关资源
最近更新 更多