使用自定义标题栏

时间:2016-10-17 23:58:29

标签: c++ gtk3 gnome gtkmm

我的问题

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

这包括带有自定义按钮的大型可拖动Headerbar以及其他视觉效果,例如窗口后面较大的背景阴影。

黑条问题

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

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

与其他桌面的兼容性

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

screenshot with black bar on top

更新

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

enter image description here

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

1 个答案:

答案 0 :(得分:1)

好的,我明白了。

黑条问题

要在没有上述问题之一的情况下在林间空地获得这个很酷的gnome栏,请按照以下步骤操作:

  1. 勾选"客户端窗口装饰"在"常规选项卡"在窗口属性中。确保"装饰"也被勾选,即使它是灰色的。您可以在"客户端窗口装饰"时打勾(或取消勾选)它。没有被击中。
  2. enter image description here

    1. 应显示窗口顶部的新空间
    2. enter image description here

      1. 在其中放置标题栏
      2. enter image description here

        1. (可选)勾选"显示窗口控件"在"将军"其属性的标签,并给它一个标题和一个副标题
        2. enter image description here

          <强>瞧:

          enter image description here

          请注意,甚至不需要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";