mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-08-02 14:57:31 +03:00
macos: hook up change title events
This commit is contained in:
@ -26,10 +26,12 @@ extern "C" {
|
||||
// structs. To find the Zig struct, grep for this type name. The documentation
|
||||
// for all of these types is available in the Zig source.
|
||||
typedef void (*ghostty_runtime_wakeup_cb)(void *);
|
||||
typedef void (*ghostty_runtime_set_title_cb)(void *, const char *);
|
||||
|
||||
typedef struct {
|
||||
void *userdata;
|
||||
ghostty_runtime_wakeup_cb wakeup_cb;
|
||||
ghostty_runtime_set_title_cb set_title_cb;
|
||||
} ghostty_runtime_config_s;
|
||||
|
||||
typedef struct {
|
||||
|
@ -22,6 +22,7 @@ struct GhosttyApp: App {
|
||||
case .ready:
|
||||
TerminalView(app: ghostty.app!)
|
||||
.modifier(WindowObservationModifier())
|
||||
.navigationTitle(ghostty.title)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -35,6 +36,9 @@ class GhosttyState: ObservableObject {
|
||||
/// The readiness value of the state.
|
||||
@Published var readiness: Readiness = .loading
|
||||
|
||||
/// The title of the window as requested by the underlying terminal.
|
||||
@Published var title: String = "Ghostty";
|
||||
|
||||
/// The ghostty global configuration.
|
||||
var config: ghostty_config_t? = nil
|
||||
|
||||
@ -69,7 +73,8 @@ class GhosttyState: ObservableObject {
|
||||
// uses to interface with the application runtime environment.
|
||||
var runtime_cfg = ghostty_runtime_config_s(
|
||||
userdata: Unmanaged.passUnretained(self).toOpaque(),
|
||||
wakeup_cb: { userdata in GhosttyState.wakeup(userdata) })
|
||||
wakeup_cb: { userdata in GhosttyState.wakeup(userdata) },
|
||||
set_title_cb: { userdata, title in GhosttyState.setTitle(userdata, title: title) })
|
||||
|
||||
// Create the ghostty app.
|
||||
guard let app = ghostty_app_new(&runtime_cfg, cfg) else {
|
||||
@ -97,6 +102,14 @@ class GhosttyState: ObservableObject {
|
||||
DispatchQueue.main.async { state.appTick() }
|
||||
}
|
||||
|
||||
static func setTitle(_ userdata: UnsafeMutableRawPointer?, title: UnsafePointer<CChar>?) {
|
||||
let state = Unmanaged<GhosttyState>.fromOpaque(userdata!).takeUnretainedValue()
|
||||
guard let titleStr = String(cString: title!, encoding: .utf8) else { return }
|
||||
DispatchQueue.main.async {
|
||||
state.title = titleStr
|
||||
}
|
||||
}
|
||||
|
||||
deinit {
|
||||
ghostty_app_free(app)
|
||||
ghostty_config_free(config)
|
||||
|
@ -29,6 +29,9 @@ pub const App = struct {
|
||||
/// Callback called to wakeup the event loop. This should trigger
|
||||
/// a full tick of the app loop.
|
||||
wakeup: *const fn (?*anyopaque) callconv(.C) void,
|
||||
|
||||
/// Called to set the title of the window.
|
||||
set_title: *const fn (?*anyopaque, [*]const u8) callconv(.C) void,
|
||||
};
|
||||
|
||||
opts: Options,
|
||||
@ -97,8 +100,10 @@ pub const Window = struct {
|
||||
}
|
||||
|
||||
pub fn setTitle(self: *Window, slice: [:0]const u8) !void {
|
||||
_ = self;
|
||||
_ = slice;
|
||||
self.core_win.app.runtime.opts.set_title(
|
||||
self.core_win.app.runtime.opts.userdata,
|
||||
slice.ptr,
|
||||
);
|
||||
}
|
||||
|
||||
pub fn getClipboardString(self: *const Window) ![:0]const u8 {
|
||||
|
Reference in New Issue
Block a user