Gtk应用程序的唯一性,无需创建任何窗口

问题描述 投票:1回答:2

是否可以只运行一个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++ gtk gtkmm
2个回答
1
投票

我不熟悉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()

-1
投票

只需创建一个GApplication(由gio提供)而不是GtkApplication(由GTK提供)。我指的是C API,但GTKmm应该有一个等价物。

从该页面:

GApplication(可选)提供的另一个功能是流程唯一性。应用程序可以通过提供唯一的应用程序ID来利用此功能。如果给定,则每个会话一次只能运行一个具有此ID的应用程序。会话概念取决于平台,但大致对应于图形桌面登录。当您的应用程序再次启动时,其参数将通过平台通信传递给已在运行的程序。已经运行的程序实例称为“主实例”;对于非唯一应用程序,这始终是当前实例。在Linux上,D-Bus会话总线用于通信。

© www.soinside.com 2019 - 2024. All rights reserved.