Merge pull request #595 from mitchellh/gtk-single

apprt/gtk: gtk-single-instance defaults to true only if desktop env
This commit is contained in:
Mitchell Hashimoto
2023-09-30 08:54:33 -07:00
committed by GitHub
2 changed files with 29 additions and 6 deletions

View File

@ -16,6 +16,7 @@ const builtin = @import("builtin");
const glfw = @import("glfw"); const glfw = @import("glfw");
const configpkg = @import("../../config.zig"); const configpkg = @import("../../config.zig");
const input = @import("../../input.zig"); const input = @import("../../input.zig");
const internal_os = @import("../../os/main.zig");
const Config = configpkg.Config; const Config = configpkg.Config;
const CoreApp = @import("../../App.zig"); const CoreApp = @import("../../App.zig");
const CoreSurface = @import("../../Surface.zig"); const CoreSurface = @import("../../Surface.zig");
@ -72,10 +73,16 @@ pub fn init(core_app: *CoreApp, opts: Options) !App {
const cursor_none = c.gdk_cursor_new_from_name("none", null); const cursor_none = c.gdk_cursor_new_from_name("none", null);
errdefer if (cursor_none) |cursor| c.g_object_unref(cursor); errdefer if (cursor_none) |cursor| c.g_object_unref(cursor);
const single_instance = switch (config.@"gtk-single-instance") {
.true => true,
.false => false,
.desktop => internal_os.launchedFromDesktop(),
};
// Setup the flags for our application. // Setup the flags for our application.
const app_flags: c.GApplicationFlags = app_flags: { const app_flags: c.GApplicationFlags = app_flags: {
var flags: c.GApplicationFlags = c.G_APPLICATION_DEFAULT_FLAGS; var flags: c.GApplicationFlags = c.G_APPLICATION_DEFAULT_FLAGS;
if (!config.@"gtk-single-instance") flags |= c.G_APPLICATION_NON_UNIQUE; if (!single_instance) flags |= c.G_APPLICATION_NON_UNIQUE;
break :app_flags flags; break :app_flags flags;
}; };
@ -88,6 +95,10 @@ pub fn init(core_app: *CoreApp, opts: Options) !App {
}; };
// Create our GTK Application which encapsulates our process. // Create our GTK Application which encapsulates our process.
log.debug("creating GTK application id={s} single-instance={}", .{
app_id,
single_instance,
});
const app = @as(?*c.GtkApplication, @ptrCast(c.gtk_application_new( const app = @as(?*c.GtkApplication, @ptrCast(c.gtk_application_new(
app_id.ptr, app_id.ptr,
app_flags, app_flags,

View File

@ -406,14 +406,19 @@ keybind: Keybinds = .{},
/// This does not work with GLFW builds. /// This does not work with GLFW builds.
@"macos-option-as-alt": OptionAsAlt = .false, @"macos-option-as-alt": OptionAsAlt = .false,
/// If true (default), then the Ghostty GTK application will run in /// If true, the Ghostty GTK application will run in single-instance mode:
/// single-instance mode: each new `ghostty` process launched will result /// each new `ghostty` process launched will result in a new window if there
/// in a new window, if there is already a running process. /// is already a running process.
/// ///
/// If false, each new ghostty process will launch a separate application. /// If false, each new ghostty process will launch a separate application.
/// ///
/// Debug builds of Ghostty have a separate single-instance ID. /// The default value is "desktop" which will default to "true" if Ghostty
@"gtk-single-instance": bool = true, /// detects it was launched from the .desktop file such as an app launcher.
/// If Ghostty is launched from the command line, it will default to "false".
///
/// Note that debug builds of Ghostty have a separate single-instance ID
/// so you can test single instance without conflicting with release builds.
@"gtk-single-instance": GtkSingleInstance = .desktop,
/// If true (default), then the Ghostty GTK tabs will be "wide." Wide tabs /// If true (default), then the Ghostty GTK tabs will be "wide." Wide tabs
/// are the new typical Gnome style where tabs fill their available space. /// are the new typical Gnome style where tabs fill their available space.
@ -1856,3 +1861,10 @@ pub const WindowTheme = enum {
light, light,
dark, dark,
}; };
/// See gtk-single-instance
pub const GtkSingleInstance = enum {
desktop,
false,
true,
};