簡體   English   中英

Gtk應用程序的唯一性,無需創建任何窗口

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM