Gtkmm3:正确处理命令行选项和 Gtk::Plug
Gtkmm3: Handling command line options and Gtk::Plug properly
我正在尝试与我在标准 c gtk+-3.0
库中成功实现的 xfce4-settings-manager
进行交互,但我一直在努力在 gtkmm3 中复制它。 xfce4-settings-manager
将 --socked-id
选项传递给客户端,客户端将使用 GtkPlug 通过 id 连接到套接字。正如我之前提到的,我成功地用 C 编写了它,并且我将该代码放在 github 要点 here 中。我更喜欢使用 C++ 作为以更实用的方式学习语言的一种方式,也因为它比 C 具有更高的功能。
我一直在努力寻找正确的方法来处理关于正确使用 Gtk::Plug 的争论,经过数小时的研究但收效甚微。如果有人可以提供一些关于正确 way/documentation 的见解来处理 gtkmm3 中的命令行参数和 GtkPlugs,我们将不胜感激,如果您可以提供任何示例,我们也将不胜感激。提前致谢!
这是一个类似于您的示例,使用 C++ 和 Gtkmm 3:
#include <string>
#include <gtkmm.h>
#include <gtkmm/plug.h>
// Simple command line argument parser.
//
// Documented here:
//
// https://gitlab.gnome.org/GNOME/glibmm/-/blob/master/examples/options/main.cc
//
class CmdArgParser : public Glib::OptionGroup
{
public:
CmdArgParser(const std::string& p_name, const std::string& p_description, const std::string& p_help)
: Glib::OptionGroup{p_name, p_description, p_help}
{
// Define the 'socket ID' argument options:
Glib::OptionEntry socketIDArg;
socketIDArg.set_long_name("socket-id");
socketIDArg.set_short_name('s');
socketIDArg.set_flags(Glib::OptionEntry::FLAG_IN_MAIN);
socketIDArg.set_description("Settings manager socket");
// Register it in the parser. It value will be recorded in m_socketID for later usage.
add_entry(socketIDArg, m_socketID);
}
// Override this to handle errors. I skipped it for simplicity.
// void on_error(Glib::OptionContext& context, const Glib::Error& error) override;
::Window GetSocketID() const
{
return m_socketID;
}
private:
int m_socketID = 0;
};
// This is what is going to be plugged into xfce4-settings-manager:
//
// Documented here:
//
// https://developer.gnome.org/gtkmm-tutorial/3.22/sec-plugs-sockets-example.html.en
//
class SettingsPlug : public Gtk::Plug
{
public:
SettingsPlug(::Window p_socketID)
: Gtk::Plug{p_socketID}
{
m_button.set_label("A plug with Gtkmm3!");
add(m_button);
show_all_children();
}
private:
Gtk::Button m_button;
};
int main(int argc, char** argv)
{
auto app = Gtk::Application::create(argc, argv, "org.gtkmm.example.plug");
// Parse command line arguments and retreive socket ID:
Glib::init();
setlocale(LC_ALL, "");
Glib::OptionContext context;
CmdArgParser parser{
"Socket ID",
"Command line argument for socket ID communication.",
"No help available, sorry"
};
context.set_main_group(parser);
context.parse(argc, argv);
::Window socketID = parser.GetSocketID();
// Handle plug:
SettingsPlug plug{socketID};
plug.show();
app->run(plug);
return 0;
}
我删除了错误处理和 Glade 文件的使用以简化代码。您可以使用以下方法构建它:
g++ main.cpp -o example.out `pkg-config --cflags --libs gtkmm-3.0`
我正在尝试与我在标准 c gtk+-3.0
库中成功实现的 xfce4-settings-manager
进行交互,但我一直在努力在 gtkmm3 中复制它。 xfce4-settings-manager
将 --socked-id
选项传递给客户端,客户端将使用 GtkPlug 通过 id 连接到套接字。正如我之前提到的,我成功地用 C 编写了它,并且我将该代码放在 github 要点 here 中。我更喜欢使用 C++ 作为以更实用的方式学习语言的一种方式,也因为它比 C 具有更高的功能。
我一直在努力寻找正确的方法来处理关于正确使用 Gtk::Plug 的争论,经过数小时的研究但收效甚微。如果有人可以提供一些关于正确 way/documentation 的见解来处理 gtkmm3 中的命令行参数和 GtkPlugs,我们将不胜感激,如果您可以提供任何示例,我们也将不胜感激。提前致谢!
这是一个类似于您的示例,使用 C++ 和 Gtkmm 3:
#include <string>
#include <gtkmm.h>
#include <gtkmm/plug.h>
// Simple command line argument parser.
//
// Documented here:
//
// https://gitlab.gnome.org/GNOME/glibmm/-/blob/master/examples/options/main.cc
//
class CmdArgParser : public Glib::OptionGroup
{
public:
CmdArgParser(const std::string& p_name, const std::string& p_description, const std::string& p_help)
: Glib::OptionGroup{p_name, p_description, p_help}
{
// Define the 'socket ID' argument options:
Glib::OptionEntry socketIDArg;
socketIDArg.set_long_name("socket-id");
socketIDArg.set_short_name('s');
socketIDArg.set_flags(Glib::OptionEntry::FLAG_IN_MAIN);
socketIDArg.set_description("Settings manager socket");
// Register it in the parser. It value will be recorded in m_socketID for later usage.
add_entry(socketIDArg, m_socketID);
}
// Override this to handle errors. I skipped it for simplicity.
// void on_error(Glib::OptionContext& context, const Glib::Error& error) override;
::Window GetSocketID() const
{
return m_socketID;
}
private:
int m_socketID = 0;
};
// This is what is going to be plugged into xfce4-settings-manager:
//
// Documented here:
//
// https://developer.gnome.org/gtkmm-tutorial/3.22/sec-plugs-sockets-example.html.en
//
class SettingsPlug : public Gtk::Plug
{
public:
SettingsPlug(::Window p_socketID)
: Gtk::Plug{p_socketID}
{
m_button.set_label("A plug with Gtkmm3!");
add(m_button);
show_all_children();
}
private:
Gtk::Button m_button;
};
int main(int argc, char** argv)
{
auto app = Gtk::Application::create(argc, argv, "org.gtkmm.example.plug");
// Parse command line arguments and retreive socket ID:
Glib::init();
setlocale(LC_ALL, "");
Glib::OptionContext context;
CmdArgParser parser{
"Socket ID",
"Command line argument for socket ID communication.",
"No help available, sorry"
};
context.set_main_group(parser);
context.parse(argc, argv);
::Window socketID = parser.GetSocketID();
// Handle plug:
SettingsPlug plug{socketID};
plug.show();
app->run(plug);
return 0;
}
我删除了错误处理和 Glade 文件的使用以简化代码。您可以使用以下方法构建它:
g++ main.cpp -o example.out `pkg-config --cflags --libs gtkmm-3.0`