微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在没有 Autotools 或 Meson 的情况下显示我的 Gtkmm 应用程序的帮助

如何解决在没有 Autotools 或 Meson 的情况下显示我的 Gtkmm 应用程序的帮助

我使用 Gtkmm 编写了一个小应用程序,我想为用户提供文档。为此,我想从应用程序的菜单中启动 Gnome help system(有关工作示例,可以查看 gedit)。

首先,我写了一个最小的 Mallard index.page 文件

<page xmlns="http://projectmallard.org/1.0/"
      type="guide"
      id="index">
<title>Example help</title>
</page>

我可以通过从我的项目的根目录调用命令 yelp help/C/index.page 来查看:

Basic help from yelp

然后,我编写了一些最小的 C++ 应用程序 (Gtkmm 3.22) 来调用帮助系统:

#include <iostream>
#include <gtkmm.h>

constexpr char HELP_URI[] = "help:myapp";

int main(int argc,char* argv[]) 
{
    auto app = Gtk::Application::create(argc,argv,"bob.morane.question");

    Gtk::Window window;

    // 1. Add the help menu item:
    Gtk::MenuItem helpItem;
    helpItem.set_label("Help");

    Gtk::Menu helpMenu;
    Gtk::MenuItem openHelpItem;
    openHelpItem.set_label("Open help...");

    Gtk::MenuBar menuBar;
    menuBar.append(helpItem);
    helpItem.set_submenu(helpMenu);
    helpMenu.append(openHelpItem);

    window.add(menuBar);
    

    // 2. Link the help menu item to Mallard documentation:
    openHelpItem.signal_activate().connect([&window](){
        const guint32 timestamp = gtk_get_current_event_time();
        GError* error = nullptr;

        // This is the call that triggers gnome help system:
        const bool status = gtk_show_uri_on_window (window.gobj(),HELP_URI,timestamp,&error);
        if(!status)
        {
            std::cout << "Unable to show help : " + std::string{error->message} << std::endl;
            return;
        }
    });

    window.show_all();
    return app->run(window);
}

我使用一个非常简单的 Makefile 构建:

all: main.cpp
    g++ -std=c++17 main.cpp -o myapp `pkg-config gtkmm-3.0 --cflags --libs`

当我点击 Open help... 菜单项时,我得到以下信息:

Not found

如果我将程序的第一行更改为:constexpr char HELP_URI[] = "help:gedit";,那么 gedit 帮助就会正常弹出。现在使用诸如 Meson(如 gedit)或 Autotools(如 Gnome documentation 建议的)之类的构建系统对我来说是多余的。我希望能够显示我的帮助文件而无需处理这些文件(即我想继续使用我的 Makefile)。

*问题:如何在不需要使用 Meson 或 Autotools 的情况下显示我自己的帮助文件

解决方法

帮助文件必须在 Yelp 可以找到的地方。通常,您会将它们安装到 /usr/share/help/LANG/APPID/,其中 LANG 是语言标识符(或者对于未翻译的文档仅 C),而 APPID 是您的应用程序的一些标识符(匹配.desktop 文件的基本名称是一个很好的最佳做法)。

如果您使用自动工具,yelp.m4 会为您处理所有这些:http://yelp.io/tools/yelp.m4

如果您使用介子,gnome.yelp 函数会为您处理:https://mesonbuild.com/Gnome-module.html#gnomeyelp

但如果您不想使用构建系统,则必须自己管理将文件获取到某个地方。他们不必在 /usr/ 中。 Yelp 在 XDG 基本目录规范中的 help$XDG_DATA_HOME 目录的 $XDG_DATA_DIRS 子目录中查找。默认情况下,这意味着它查看 ~/.local/share/help/:/usr/local/share/help/:/usr/share/help/。因此,您可以将这些文件安装在本地 ~/.local/share/ 下以进行测试。

或者,如果你真的不想在任何地方安装文件,你可以以特定的方式排列你的源代码树并设置一个环境变量。例如,如果您的源代码树以 ~/myapp/ 为根,则将您的页面文件放在 ~/myapp/help/C/myapp/ 下,并使用 XDG_DATA_HOME=~/myapp/ myapp 调用您的应用。

但实际上,如果您希望用户使用您的应用,您将必须弄清楚如何在正确的位置安装文件。为此,您最好使用现有的构建系统,即使您认为您的应用程序太小。

,

我最终做了什么:由于我目前还不能迁移到构建系统,我决定编写一个小脚本将我的帮助内容复制到 ~/.local/share 以进行测试:

#!/bin/bash

TARGET=~/.local/share

if [[ -d "${TARGET}/" ]]
then
    cp -r ./help ${TARGET}
else
    echo "Error: ${TARGET} does not exist."
fi

有了这个,我就可以开发我的帮助文档,而无需使用构建系统。请注意,为了让此脚本正常工作,我已将我的 index.page 帮助文件添加到项目根目录中的 help/C/myapp/index.page 下。这使我可以从我的 Makefile 中自动执行此脚本,因此我不必手动复制所有内容或自己调用 Yelp:

all: main.cpp
    ./installHelp.sh
    g++ -std=c++17 main.cpp -o myapp `pkg-config gtkmm-3.0 --cflags --libs`

然而,正如 Shaun McCance 所提到的,这个解决方案不可移植,迟早我将不得不转移到某个构建系统。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。