我正在开发 flutter 桌面应用程序。我只想执行应用程序的单个实例。但目前它允许我运行多个实例。
Windows 平台有解决方案,但是如何在 Linux 中做同样的事情?
对于想要在 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));
}
}
我希望这对某人有帮助,因为在任何地方找到这些信息都很困难,而且与我尝试的其他路线相比,它相当简单。