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

时间:2017-01-26 21:45:08

标签: c++ gtk gtkmm

是否可以只运行一个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);                                                                                                                         
}

2 个答案:

答案 0 :(得分:1)

我不熟悉c ++,但我的建议是你把hold方法弄错了。只应保留主要实例。第二次实例启动后,它会激活&#39;主要实例的信号。因此,将所有操作放在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 :(得分:-1)

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

从该页面开始:

  

GApplication(可选)提供的另一个功能是流程   独特之处。应用程序可以使用此功能   提供唯一的应用程序ID。如果给出,只有一个应用程序   此ID可以在每个会话中一次运行。会议的概念是   平台相关,但大致对应于图形桌面   登录。当您的应用程序再次启动时,它的参数是   通过平台通信传递给已经运行的程序。   已经运行的程序实例称为&#34; primary   实例&#34 ;;对于非独特的应用程序,这始终是当前的   实例。在Linux上,D-Bus会话总线用于通信。