是否可以只运行一个GTK应用程序副本但不创建任何窗口?这个例子允许你运行程序的几个副本,但我不知何故需要强制只允许一个程序运行。
#include <gtkmm.h>
int
main(int argc, char** argv)
{
Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "org.gtkmm.example");
app->hold();
return app->run();
}
如果我添加一个GTK窗口,一切都在按照我的预期进行。即只有一个副本正在运行,第二个副本刚刚退出。但我的application住在系统托盘中,并且在开始时不会创建任何窗口。
#include <gtkmm.h>
int
main(int argc, char** argv)
{
Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "org.gtkmm.example");
Gtk::Window window;
return app->run(window);
}
我不熟悉c ++,但我的建议是你把hold方法弄错了。只应保留主要实例。在第二个实例启动后,它会为主实例引发“激活”信号。所以你在g_application_activate
方法中的所有行动似乎都是解决方案。
这是它如何与python一起使用,也许这可以帮助
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
class Application(Gtk.Application):
def __init__(self, *args, **kwargs):
super().__init__(application_id="org.example.myapp")
def do_activate(self):
if not hasattr(self, "my_app_settings"):
self.hold()
self.my_app_settings = "Primary application instance."
print(self.my_app_settings)
else:
print("Already running!")
app = Application()
app.run()
只需创建一个GApplication(由gio提供)而不是GtkApplication(由GTK提供)。我指的是C API,但GTKmm应该有一个等价物。
从该页面:
GApplication(可选)提供的另一个功能是流程唯一性。应用程序可以通过提供唯一的应用程序ID来利用此功能。如果给定,则每个会话一次只能运行一个具有此ID的应用程序。会话概念取决于平台,但大致对应于图形桌面登录。当您的应用程序再次启动时,其参数将通过平台通信传递给已在运行的程序。已经运行的程序实例称为“主实例”;对于非唯一应用程序,这始终是当前实例。在Linux上,D-Bus会话总线用于通信。