diff options
| author | Can Celik <ogulcancelik@gmail.com> | 2026-04-04 19:22:04 +0300 |
|---|---|---|
| committer | Can Celik <ogulcancelik@gmail.com> | 2026-04-05 01:23:06 +0300 |
| commit | 41dd733ca7123c9ac4bfc6c781697a660e95b052 (patch) | |
| tree | 3fc91815ca139ef2e0b281bba0abda4ef15175f4 /vendor/libghostty-vt/src/apprt/gtk/App.zig | |
| parent | 55c138263e190a1e79d4b997bfb9397306c0ec1f (diff) | |
feat: finish ghostty pane backend integration
Diffstat (limited to 'vendor/libghostty-vt/src/apprt/gtk/App.zig')
| -rw-r--r-- | vendor/libghostty-vt/src/apprt/gtk/App.zig | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/vendor/libghostty-vt/src/apprt/gtk/App.zig b/vendor/libghostty-vt/src/apprt/gtk/App.zig new file mode 100644 index 00000000..39c13c19 --- /dev/null +++ b/vendor/libghostty-vt/src/apprt/gtk/App.zig @@ -0,0 +1,93 @@ +/// This is the main entrypoint to the apprt for Ghostty. Ghostty will +/// initialize this in main to start the application.. +const App = @This(); + +const std = @import("std"); +const builtin = @import("builtin"); +const Allocator = std.mem.Allocator; +const apprt = @import("../../apprt.zig"); +const configpkg = @import("../../config.zig"); +const Config = configpkg.Config; +const CoreApp = @import("../../App.zig"); + +const Application = @import("class/application.zig").Application; +const Surface = @import("Surface.zig"); +const ipcNewWindow = @import("ipc/new_window.zig").newWindow; + +const log = std.log.scoped(.gtk); + +/// This is detected by the Renderer, in which case it sends a `redraw_surface` +/// message so that we can call `drawFrame` ourselves from the app thread, +/// because GTK's `GLArea` does not support drawing from a different thread. +pub const must_draw_from_app_thread = true; + +/// GTK application ID +pub const application_id = @import("build/info.zig").application_id; + +/// GTK object path +pub const object_path = @import("build/info.zig").object_path; + +/// The GObject Application instance +app: *Application, + +pub fn init( + self: *App, + core_app: *CoreApp, + + // Required by the apprt interface but we don't use it. + opts: struct {}, +) !void { + _ = opts; + + const app: *Application = try .new(self, core_app); + errdefer app.unref(); + self.* = .{ .app = app }; + return; +} + +pub fn run(self: *App) !void { + try self.app.run(); +} + +pub fn terminate(self: *App) void { + // We force deinitialize the app. We don't unref because other things + // tend to have a reference at this point, so this just forces the + // disposal now. + self.app.deinit(); +} + +/// Called by CoreApp to wake up the event loop. +pub fn wakeup(self: *App) void { + self.app.wakeup(); +} + +pub fn performAction( + self: *App, + target: apprt.Target, + comptime action: apprt.Action.Key, + value: apprt.Action.Value(action), +) !bool { + return try self.app.performAction(target, action, value); +} + +/// Send the given IPC to a running Ghostty. Returns `true` if the action was +/// able to be performed, `false` otherwise. +/// +/// Note that this is a static function. Since this is called from a CLI app (or +/// some other process that is not Ghostty) there is no full-featured apprt App +/// to use. +pub fn performIpc( + alloc: Allocator, + target: apprt.ipc.Target, + comptime action: apprt.ipc.Action.Key, + value: apprt.ipc.Action.Value(action), +) !bool { + switch (action) { + .new_window => return try ipcNewWindow(alloc, target, value), + } +} + +/// Redraw the inspector for the given surface. +pub fn redrawInspector(_: *App, surface: *Surface) void { + surface.redrawInspector(); +} |
