2017-01-26 11 views
1

Возможно ли запустить только одну копию приложения GTK, но без создания каких-либо окон? В этом примере вы можете запускать несколько копий программы, но мне почему-то нужно обеспечить, чтобы разрешалось только одно.Уникальность приложения 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);                               
} 

ответ

0

Просто создайте GApplication (обеспечиваемые G) вместо GtkApplication (предоставляется GTK). Я указываю на API C, но в GTKmm должен быть эквивалент.

С этой страницы:

Еще одна особенность, что GApplication (необязательно) обеспечивает это процесс уникальность. Приложения могут использовать эту функциональность по , предоставляя уникальный идентификатор приложения. Если задано, только одно приложение с этот идентификатор может запускаться одновременно за сеанс. Концепция сеанса зависит от платформы, но примерно соответствует графическому рабочему столу . Когда ваше приложение запускается снова, его аргументы равны , прошедшим через связь платформы с уже запущенной программой. Инициализируемый экземпляр программы называется «первичным экземпляром»; для не-уникальных приложений это всегда текущий экземпляр. В Linux шина сеанса D-Bus используется для связи.

+0

К сожалению, это не помешало запустить вторую копию моего приложения. Просто измените Gtk на Gio, удалите 'argc' и' argv' из метода 'create()' и передайте их методу 'run()' в моем первом фрагменте кода. –

0

Я не знаком с C++, но мое предложение состоит в том, что вы неправильно помещаете метод удержания. Следует проводить только первичный экземпляр. После запуска второго экземпляра он активирует сигнал «активировать» для первичного экземпляра. Итак, разместите все, что вы делаете в g_application_activate способ похоже похоже решение.

Это, как он работает с питоном, может быть, это может помочь

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() 

 Смежные вопросы

  • Нет связанных вопросов^_^