0

我使用 Gtkmm 编写了一个小型应用程序,我想为用户提供文档。为此,我想从我的应用程序菜单中启动Gnome 帮助系统(例如,可以查看gedit)。

首先,我写了一个最小的 Mallardindex.page文件:

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

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

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...菜单项时,我得到以下信息:

未找到

如果我将程序的第一行更改为: constexpr char HELP_URI[] = "help:gedit";,则 gedit 帮助会很好地弹出。现在使用诸如 Meson(如 gedit)或 Autotools(如Gnome 文档所建议的)之类的构建系统对我来说太过分了。我希望能够显示我的帮助文件而不需要处理那些(即我想继续使用我的 Makefile)。

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

4

2 回答 2

2

帮助文件必须在 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

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

于 2021-02-24T17:41:35.683 回答
1

我最终做了什么:因为我还不能迁移到构建系统,所以我决定编写一个小脚本来复制我的帮助内容以~/.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 所提到的,这个解决方案是不可移植的,迟早我将不得不转向一些构建系统。

于 2021-02-24T23:31:05.350 回答