mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-08-02 14:57:31 +03:00
apprt: begin transition to making actions an enum and not use hasDecl
This commit is contained in:
22
src/App.zig
22
src/App.zig
@ -241,19 +241,17 @@ fn redrawInspector(self: *App, rt_app: *apprt.App, surface: *apprt.Surface) !voi
|
|||||||
|
|
||||||
/// Create a new window
|
/// Create a new window
|
||||||
pub fn newWindow(self: *App, rt_app: *apprt.App, msg: Message.NewWindow) !void {
|
pub fn newWindow(self: *App, rt_app: *apprt.App, msg: Message.NewWindow) !void {
|
||||||
if (!@hasDecl(apprt.App, "newWindow")) {
|
const target: apprt.Target = target: {
|
||||||
log.warn("newWindow is not supported by this runtime", .{});
|
const parent = msg.parent orelse break :target .app;
|
||||||
return;
|
if (self.hasSurface(parent)) break :target .{ .surface = parent };
|
||||||
}
|
break :target .app;
|
||||||
|
};
|
||||||
|
|
||||||
const parent = if (msg.parent) |parent| parent: {
|
try rt_app.performAction(
|
||||||
break :parent if (self.hasSurface(parent))
|
target,
|
||||||
parent
|
.new_window,
|
||||||
else
|
{},
|
||||||
null;
|
);
|
||||||
} else null;
|
|
||||||
|
|
||||||
try rt_app.newWindow(parent);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Start quitting
|
/// Start quitting
|
||||||
|
@ -12,6 +12,7 @@ const std = @import("std");
|
|||||||
const builtin = @import("builtin");
|
const builtin = @import("builtin");
|
||||||
const build_config = @import("build_config.zig");
|
const build_config = @import("build_config.zig");
|
||||||
|
|
||||||
|
const action = @import("apprt/action.zig");
|
||||||
const structs = @import("apprt/structs.zig");
|
const structs = @import("apprt/structs.zig");
|
||||||
|
|
||||||
pub const glfw = @import("apprt/glfw.zig");
|
pub const glfw = @import("apprt/glfw.zig");
|
||||||
@ -21,6 +22,9 @@ pub const browser = @import("apprt/browser.zig");
|
|||||||
pub const embedded = @import("apprt/embedded.zig");
|
pub const embedded = @import("apprt/embedded.zig");
|
||||||
pub const surface = @import("apprt/surface.zig");
|
pub const surface = @import("apprt/surface.zig");
|
||||||
|
|
||||||
|
pub const Action = action.Action;
|
||||||
|
pub const Target = action.Target;
|
||||||
|
|
||||||
pub const ContentScale = structs.ContentScale;
|
pub const ContentScale = structs.ContentScale;
|
||||||
pub const Clipboard = structs.Clipboard;
|
pub const Clipboard = structs.Clipboard;
|
||||||
pub const ClipboardRequest = structs.ClipboardRequest;
|
pub const ClipboardRequest = structs.ClipboardRequest;
|
||||||
@ -84,4 +88,6 @@ pub const Runtime = enum {
|
|||||||
test {
|
test {
|
||||||
_ = Runtime;
|
_ = Runtime;
|
||||||
_ = runtime;
|
_ = runtime;
|
||||||
|
_ = action;
|
||||||
|
_ = structs;
|
||||||
}
|
}
|
||||||
|
29
src/apprt/action.zig
Normal file
29
src/apprt/action.zig
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
const std = @import("std");
|
||||||
|
const assert = std.debug.assert;
|
||||||
|
const CoreSurface = @import("../Surface.zig");
|
||||||
|
|
||||||
|
/// The possible actions an apprt has to react to.
|
||||||
|
pub const Action = union(enum) {
|
||||||
|
new_window,
|
||||||
|
|
||||||
|
/// The enum of keys in the tagged union.
|
||||||
|
pub const Key = @typeInfo(Action).Union.tag_type.?;
|
||||||
|
|
||||||
|
/// Returns the value type for the given key.
|
||||||
|
pub fn Value(comptime key: Key) type {
|
||||||
|
inline for (@typeInfo(Action).Union.fields) |field| {
|
||||||
|
const field_key = @field(Key, field.name);
|
||||||
|
if (field_key == key) return field.type;
|
||||||
|
}
|
||||||
|
|
||||||
|
unreachable;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/// The target for an action. This is generally the thing that had focus
|
||||||
|
/// while the action was made but the concept of "focus" is not guaranteed
|
||||||
|
/// since actions can also be triggered by timers, scripts, etc.
|
||||||
|
pub const Target = union(enum) {
|
||||||
|
app,
|
||||||
|
surface: *CoreSurface,
|
||||||
|
};
|
@ -127,6 +127,23 @@ pub const App = struct {
|
|||||||
glfw.postEmptyEvent();
|
glfw.postEmptyEvent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Perform a given action.
|
||||||
|
pub fn performAction(
|
||||||
|
self: *App,
|
||||||
|
target: apprt.Target,
|
||||||
|
comptime action: apprt.Action.Key,
|
||||||
|
value: apprt.Action.Value(action),
|
||||||
|
) !void {
|
||||||
|
_ = value;
|
||||||
|
|
||||||
|
switch (action) {
|
||||||
|
.new_window => _ = try self.newSurface(switch (target) {
|
||||||
|
.app => null,
|
||||||
|
.surface => |v| v,
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Open the configuration in the system editor.
|
/// Open the configuration in the system editor.
|
||||||
pub fn openConfig(self: *App) !void {
|
pub fn openConfig(self: *App) !void {
|
||||||
try configpkg.edit.open(self.app.alloc);
|
try configpkg.edit.open(self.app.alloc);
|
||||||
@ -195,11 +212,6 @@ pub const App = struct {
|
|||||||
win.setMonitor(monitor, 0, 0, video_mode.getWidth(), video_mode.getHeight(), 0);
|
win.setMonitor(monitor, 0, 0, video_mode.getWidth(), video_mode.getHeight(), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create a new window for the app.
|
|
||||||
pub fn newWindow(self: *App, parent_: ?*CoreSurface) !void {
|
|
||||||
_ = try self.newSurface(parent_);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Create a new tab in the parent surface.
|
/// Create a new tab in the parent surface.
|
||||||
fn newTab(self: *App, parent: *CoreSurface) !void {
|
fn newTab(self: *App, parent: *CoreSurface) !void {
|
||||||
if (!Darwin.enabled) {
|
if (!Darwin.enabled) {
|
||||||
|
Reference in New Issue
Block a user