如何将linux上的flutter桌面应用限制为单个实例?

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

我正在开发 flutter 桌面应用程序。我只想执行应用程序的单个实例。但目前它允许我运行多个实例。

Windows 平台有解决方案,但是如何在 Linux 中做同样的事情?

linux flutter desktop restriction
1个回答
0
投票

对于想要在 Linux 上实现这一目标的人:

所以我进行了一个很长的兔子洞尝试实现与上面类似的修复,但针对 Linux,直到我找到了一个更简单的版本。

您想要转到 my_application.cc 文件,然后在底部附近找到下面的函数并将其更改如下:

来自:

MyApplication* my_application_new() {   
  return MY_APPLICATION(g_object_new(my_application_get_type(),
                                      "application-id", APPLICATION_ID,
                                      "flags", G_APPLICATION_NON_UNIQUE,
                                      nullptr)); }

致:

 MyApplication* my_application_new() {
   return MY_APPLICATION(g_object_new(my_application_get_type(),
                                      "application-id", APPLICATION_ID,
                                      nullptr)); }

G_APPLICATION_NON_UNIQUE 标志明确表示“不尝试进行任何典型的单实例应用程序协商”,这与我们想要的相反。 https://docs.gtk.org/gio/flags.ApplicationFlags.html#can_override_app_id

由于我们的目标是单实例应用程序,因此我们可以在创建应用程序对象时删除 G_APPLICATION_NON_UNIQUE 标志。

默认情况下,如果您提供应用程序 ID,GApplication 会尝试成为单个实例,并且它使用 D-Bus 在实例之间进行通信。

现在,为了使其在尝试打开另一个实例时,您可以执行以下操作以使其抓住现有实例并将其聚焦。

static void my_application_activate(GApplication* application) {
    MyApplication* self = MY_APPLICATION(application);
    GList *list = gtk_application_get_windows(GTK_APPLICATION(application));
    GtkWindow* existing_window = list ? GTK_WINDOW(list->data) : NULL;

    if (existing_window) {
        gtk_window_present(existing_window);
    } else {
        // Put your existing code here
        // this is will normally start like this
        GtkWindow* window =  GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application)));
        // and end like this
        gtk_widget_grab_focus(GTK_WIDGET(view));
    }
}

我希望这对某人有帮助,因为在任何地方找到这些信息都很困难,而且与我尝试的其他路线相比,它相当简单。

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