mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-08-02 14:57:31 +03:00
apprt: support a pwd change action
This commit is contained in:
@ -430,6 +430,11 @@ typedef struct {
|
|||||||
const char* title;
|
const char* title;
|
||||||
} ghostty_action_set_title_s;
|
} ghostty_action_set_title_s;
|
||||||
|
|
||||||
|
// apprt.action.Pwd.C
|
||||||
|
typedef struct {
|
||||||
|
const char* pwd;
|
||||||
|
} ghostty_action_pwd_s;
|
||||||
|
|
||||||
// terminal.MouseShape
|
// terminal.MouseShape
|
||||||
typedef enum {
|
typedef enum {
|
||||||
GHOSTTY_MOUSE_SHAPE_DEFAULT,
|
GHOSTTY_MOUSE_SHAPE_DEFAULT,
|
||||||
@ -552,6 +557,7 @@ typedef enum {
|
|||||||
GHOSTTY_ACTION_RENDER_INSPECTOR,
|
GHOSTTY_ACTION_RENDER_INSPECTOR,
|
||||||
GHOSTTY_ACTION_DESKTOP_NOTIFICATION,
|
GHOSTTY_ACTION_DESKTOP_NOTIFICATION,
|
||||||
GHOSTTY_ACTION_SET_TITLE,
|
GHOSTTY_ACTION_SET_TITLE,
|
||||||
|
GHOSTTY_ACTION_PWD,
|
||||||
GHOSTTY_ACTION_MOUSE_SHAPE,
|
GHOSTTY_ACTION_MOUSE_SHAPE,
|
||||||
GHOSTTY_ACTION_MOUSE_VISIBILITY,
|
GHOSTTY_ACTION_MOUSE_VISIBILITY,
|
||||||
GHOSTTY_ACTION_MOUSE_OVER_LINK,
|
GHOSTTY_ACTION_MOUSE_OVER_LINK,
|
||||||
@ -576,6 +582,7 @@ typedef union {
|
|||||||
ghostty_action_inspector_e inspector;
|
ghostty_action_inspector_e inspector;
|
||||||
ghostty_action_desktop_notification_s desktop_notification;
|
ghostty_action_desktop_notification_s desktop_notification;
|
||||||
ghostty_action_set_title_s set_title;
|
ghostty_action_set_title_s set_title;
|
||||||
|
ghostty_action_pwd_s pwd;
|
||||||
ghostty_action_mouse_shape_e mouse_shape;
|
ghostty_action_mouse_shape_e mouse_shape;
|
||||||
ghostty_action_mouse_visibility_e mouse_visibility;
|
ghostty_action_mouse_visibility_e mouse_visibility;
|
||||||
ghostty_action_mouse_over_link_s mouse_over_link;
|
ghostty_action_mouse_over_link_s mouse_over_link;
|
||||||
|
@ -856,6 +856,20 @@ pub fn handleMessage(self: *Surface, msg: Message) !void {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
.pwd_change => |w| {
|
||||||
|
defer w.deinit();
|
||||||
|
|
||||||
|
// We always allocate for this because we need to null-terminate.
|
||||||
|
const str = try self.alloc.dupeZ(u8, w.slice());
|
||||||
|
defer self.alloc.free(str);
|
||||||
|
|
||||||
|
try self.rt_app.performAction(
|
||||||
|
.{ .surface = self },
|
||||||
|
.pwd,
|
||||||
|
.{ .pwd = str },
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
.close => self.close(),
|
.close => self.close(),
|
||||||
|
|
||||||
// Close without confirmation.
|
// Close without confirmation.
|
||||||
|
@ -151,6 +151,9 @@ pub const Action = union(Key) {
|
|||||||
/// Set the title of the target.
|
/// Set the title of the target.
|
||||||
set_title: SetTitle,
|
set_title: SetTitle,
|
||||||
|
|
||||||
|
/// The current working directory has changed for the target terminal.
|
||||||
|
pwd: Pwd,
|
||||||
|
|
||||||
/// Set the mouse cursor shape.
|
/// Set the mouse cursor shape.
|
||||||
mouse_shape: terminal.MouseShape,
|
mouse_shape: terminal.MouseShape,
|
||||||
|
|
||||||
@ -215,6 +218,7 @@ pub const Action = union(Key) {
|
|||||||
render_inspector,
|
render_inspector,
|
||||||
desktop_notification,
|
desktop_notification,
|
||||||
set_title,
|
set_title,
|
||||||
|
pwd,
|
||||||
mouse_shape,
|
mouse_shape,
|
||||||
mouse_visibility,
|
mouse_visibility,
|
||||||
mouse_over_link,
|
mouse_over_link,
|
||||||
@ -417,6 +421,21 @@ pub const SetTitle = struct {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
pub const Pwd = struct {
|
||||||
|
pwd: [:0]const u8,
|
||||||
|
|
||||||
|
// Sync with: ghostty_action_set_pwd_s
|
||||||
|
pub const C = extern struct {
|
||||||
|
pwd: [*:0]const u8,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub fn cval(self: Pwd) C {
|
||||||
|
return .{
|
||||||
|
.pwd = self.pwd.ptr,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/// The desktop notification to show.
|
/// The desktop notification to show.
|
||||||
pub const DesktopNotification = struct {
|
pub const DesktopNotification = struct {
|
||||||
title: [:0]const u8,
|
title: [:0]const u8,
|
||||||
|
@ -224,6 +224,7 @@ pub const App = struct {
|
|||||||
.cell_size,
|
.cell_size,
|
||||||
.renderer_health,
|
.renderer_health,
|
||||||
.color_change,
|
.color_change,
|
||||||
|
.pwd,
|
||||||
=> log.info("unimplemented action={}", .{action}),
|
=> log.info("unimplemented action={}", .{action}),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -486,6 +486,7 @@ pub fn performAction(
|
|||||||
.render_inspector,
|
.render_inspector,
|
||||||
.renderer_health,
|
.renderer_health,
|
||||||
.color_change,
|
.color_change,
|
||||||
|
.pwd,
|
||||||
=> log.warn("unimplemented action={}", .{action}),
|
=> log.warn("unimplemented action={}", .{action}),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -76,6 +76,9 @@ pub const Message = union(enum) {
|
|||||||
color: terminal.color.RGB,
|
color: terminal.color.RGB,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/// The terminal has reported a change in the working directory.
|
||||||
|
pwd_change: WriteReq,
|
||||||
|
|
||||||
pub const ReportTitleStyle = enum {
|
pub const ReportTitleStyle = enum {
|
||||||
csi_21_t,
|
csi_21_t,
|
||||||
|
|
||||||
|
@ -1123,6 +1123,14 @@ pub const StreamHandler = struct {
|
|||||||
log.debug("terminal pwd: {s}", .{path});
|
log.debug("terminal pwd: {s}", .{path});
|
||||||
try self.terminal.setPwd(path);
|
try self.terminal.setPwd(path);
|
||||||
|
|
||||||
|
// Report it to the surface. If creating our write request fails
|
||||||
|
// then we just ignore it.
|
||||||
|
if (apprt.surface.Message.WriteReq.init(self.alloc, path)) |req| {
|
||||||
|
self.surfaceMessageWriter(.{ .pwd_change = req });
|
||||||
|
} else |err| {
|
||||||
|
log.warn("error notifying surface of pwd change err={}", .{err});
|
||||||
|
}
|
||||||
|
|
||||||
// If we haven't seen a title, use our pwd as the title.
|
// If we haven't seen a title, use our pwd as the title.
|
||||||
if (!self.seen_title) {
|
if (!self.seen_title) {
|
||||||
try self.changeWindowTitle(path);
|
try self.changeWindowTitle(path);
|
||||||
|
Reference in New Issue
Block a user