Показать справку для моего приложения Gtkmm без Autotools или Meson
Я написал небольшое приложение с использованием Gtkmm, для которого я хотел бы предоставить документацию для пользователей. Для этого я хотел бы запустить справочную систему Gnome из меню моего приложения (в качестве рабочего примера можно посмотреть gedit).
Сначала я написал минимальную крякву
index.page
файл:
<page xmlns="http://projectmallard.org/1.0/"
type="guide"
id="index">
<title>Example help</title>
</page>
который я могу просмотреть, вызвав команду
yelp help/C/index.page
из корневого каталога моего проекта:
Затем я написал небольшое приложение на 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?
2 ответа
Файлы справки должны быть где-нибудь, где Yelp сможет их найти. Обычно вы устанавливаете их в
/usr/share/help/LANG/APPID/
, куда
LANG
идентификатор языка (или просто
C
для непереведенных документов) и
APPID
какой-то идентификатор вашего приложения (соответствующий базовому имени вашего
.desktop
file - хорошая практика).
Если вы используете автоинструменты,
yelp.m4
обо всем этом позаботится: http://yelp.io/tools/yelp.m4
Если вы используете мезон,
gnome.yelp
об этом позаботится функция: https://mesonbuild.com/Gnome-module.html#gnomeyelp
Но если вы не хотите использовать систему сборки, вам придется самостоятельно управлять получением файлов. Им не обязательно быть в
/usr/
. Yelp смотрит в
help
подкаталог каталогов в
$XDG_DATA_HOME
и
$XDG_DATA_DIRS
из спецификации базового каталога XDG. По умолчанию это означает, что он смотрит на
~/.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`
Однако, как заметил Шон МакКэнс, это решение не переносимо, и рано или поздно мне придется перейти на какую-нибудь систему сборки.