[英]Uniqueness of Gtk application without creating any window
是否可以只運行一個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窗口,一切都在按照我的預期進行。 即只有一個副本正在運行,第二個副本剛剛退出。 但我的應用程序存在於系統托盤中,並且在開始時不會創建任何窗口。
#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會話總線用於通信。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.