apprt/gtk-ng: split zoom title
parent
12bc0d7b10
commit
798e872f48
|
|
@ -70,6 +70,24 @@ pub const Tab = extern struct {
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
pub const @"split-tree" = struct {
|
||||||
|
pub const name = "split-tree";
|
||||||
|
const impl = gobject.ext.defineProperty(
|
||||||
|
name,
|
||||||
|
Self,
|
||||||
|
?*SplitTree,
|
||||||
|
.{
|
||||||
|
.accessor = gobject.ext.typedAccessor(
|
||||||
|
Self,
|
||||||
|
?*SplitTree,
|
||||||
|
.{
|
||||||
|
.getter = getSplitTree,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
},
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
pub const @"surface-tree" = struct {
|
pub const @"surface-tree" = struct {
|
||||||
pub const name = "surface-tree";
|
pub const name = "surface-tree";
|
||||||
const impl = gobject.ext.defineProperty(
|
const impl = gobject.ext.defineProperty(
|
||||||
|
|
@ -103,8 +121,6 @@ pub const Tab = extern struct {
|
||||||
|
|
||||||
pub const title = struct {
|
pub const title = struct {
|
||||||
pub const name = "title";
|
pub const name = "title";
|
||||||
pub const get = impl.get;
|
|
||||||
pub const set = impl.set;
|
|
||||||
const impl = gobject.ext.defineProperty(
|
const impl = gobject.ext.defineProperty(
|
||||||
name,
|
name,
|
||||||
Self,
|
Self,
|
||||||
|
|
@ -135,13 +151,11 @@ pub const Tab = extern struct {
|
||||||
/// The configuration that this surface is using.
|
/// The configuration that this surface is using.
|
||||||
config: ?*Config = null,
|
config: ?*Config = null,
|
||||||
|
|
||||||
/// The title to show for this tab. This is usually set to a binding
|
/// The title of this tab. This is usually bound to the active surface.
|
||||||
/// with the active surface but can be manually set to anything.
|
|
||||||
title: ?[:0]const u8 = null,
|
title: ?[:0]const u8 = null,
|
||||||
tooltip: ?[:0]const u8 = null,
|
|
||||||
|
|
||||||
/// The binding groups for the current active surface.
|
/// The tooltip of this tab. This is usually bound to the active surface.
|
||||||
surface_bindings: *gobject.BindingGroup,
|
tooltip: ?[:0]const u8 = null,
|
||||||
|
|
||||||
// Template bindings
|
// Template bindings
|
||||||
split_tree: *SplitTree,
|
split_tree: *SplitTree,
|
||||||
|
|
@ -169,15 +183,6 @@ pub const Tab = extern struct {
|
||||||
priv.config = app.getConfig();
|
priv.config = app.getConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setup binding groups for surface properties
|
|
||||||
priv.surface_bindings = gobject.BindingGroup.new();
|
|
||||||
priv.surface_bindings.bind(
|
|
||||||
"title",
|
|
||||||
self.as(gobject.Object),
|
|
||||||
"title",
|
|
||||||
.{},
|
|
||||||
);
|
|
||||||
|
|
||||||
// Create our initial surface in the split tree.
|
// Create our initial surface in the split tree.
|
||||||
priv.split_tree.newSplit(.right, null) catch |err| switch (err) {
|
priv.split_tree.newSplit(.right, null) catch |err| switch (err) {
|
||||||
error.OutOfMemory => {
|
error.OutOfMemory => {
|
||||||
|
|
@ -227,7 +232,6 @@ pub const Tab = extern struct {
|
||||||
v.unref();
|
v.unref();
|
||||||
priv.config = null;
|
priv.config = null;
|
||||||
}
|
}
|
||||||
priv.surface_bindings.setSource(null);
|
|
||||||
|
|
||||||
gtk.Widget.disposeTemplate(
|
gtk.Widget.disposeTemplate(
|
||||||
self.as(gtk.Widget),
|
self.as(gtk.Widget),
|
||||||
|
|
@ -250,7 +254,6 @@ pub const Tab = extern struct {
|
||||||
glib.free(@constCast(@ptrCast(v)));
|
glib.free(@constCast(@ptrCast(v)));
|
||||||
priv.title = null;
|
priv.title = null;
|
||||||
}
|
}
|
||||||
priv.surface_bindings.unref();
|
|
||||||
|
|
||||||
gobject.Object.virtual_methods.finalize.call(
|
gobject.Object.virtual_methods.finalize.call(
|
||||||
Class.parent,
|
Class.parent,
|
||||||
|
|
@ -285,13 +288,36 @@ pub const Tab = extern struct {
|
||||||
_: *gobject.ParamSpec,
|
_: *gobject.ParamSpec,
|
||||||
self: *Self,
|
self: *Self,
|
||||||
) callconv(.c) void {
|
) callconv(.c) void {
|
||||||
const priv = self.private();
|
self.as(gobject.Object).notifyByPspec(properties.@"active-surface".impl.param_spec);
|
||||||
priv.surface_bindings.setSource(null);
|
}
|
||||||
if (self.getActiveSurface()) |surface| {
|
|
||||||
priv.surface_bindings.setSource(surface.as(gobject.Object));
|
fn closureComputedTitle(
|
||||||
|
_: *Self,
|
||||||
|
plain_: ?[*:0]const u8,
|
||||||
|
zoomed_: c_int,
|
||||||
|
) callconv(.c) ?[*:0]const u8 {
|
||||||
|
const zoomed = zoomed_ != 0;
|
||||||
|
const plain = plain: {
|
||||||
|
const default = "Ghostty";
|
||||||
|
const plain = plain_ orelse break :plain default;
|
||||||
|
break :plain std.mem.span(plain);
|
||||||
|
};
|
||||||
|
|
||||||
|
// If we're zoomed, prefix with the magnifying glass emoji.
|
||||||
|
if (zoomed) zoomed: {
|
||||||
|
// This results in an extra allocation (that we free), but I
|
||||||
|
// prefer using the Zig APIs so much more than the libc ones.
|
||||||
|
const alloc = Application.default().allocator();
|
||||||
|
const slice = std.fmt.allocPrint(
|
||||||
|
alloc,
|
||||||
|
"🔍 {s}",
|
||||||
|
.{plain},
|
||||||
|
) catch break :zoomed;
|
||||||
|
defer alloc.free(slice);
|
||||||
|
return glib.ext.dupeZ(u8, slice);
|
||||||
}
|
}
|
||||||
|
|
||||||
self.as(gobject.Object).notifyByPspec(properties.@"active-surface".impl.param_spec);
|
return glib.ext.dupeZ(u8, plain);
|
||||||
}
|
}
|
||||||
|
|
||||||
const C = Common(Self, Private);
|
const C = Common(Self, Private);
|
||||||
|
|
@ -321,6 +347,7 @@ pub const Tab = extern struct {
|
||||||
gobject.ext.registerProperties(class, &.{
|
gobject.ext.registerProperties(class, &.{
|
||||||
properties.@"active-surface".impl,
|
properties.@"active-surface".impl,
|
||||||
properties.config.impl,
|
properties.config.impl,
|
||||||
|
properties.@"split-tree".impl,
|
||||||
properties.@"surface-tree".impl,
|
properties.@"surface-tree".impl,
|
||||||
properties.title.impl,
|
properties.title.impl,
|
||||||
properties.tooltip.impl,
|
properties.tooltip.impl,
|
||||||
|
|
@ -330,6 +357,7 @@ pub const Tab = extern struct {
|
||||||
class.bindTemplateChildPrivate("split_tree", .{});
|
class.bindTemplateChildPrivate("split_tree", .{});
|
||||||
|
|
||||||
// Template Callbacks
|
// Template Callbacks
|
||||||
|
class.bindTemplateCallback("computed_title", &closureComputedTitle);
|
||||||
class.bindTemplateCallback("notify_active_surface", &propActiveSurface);
|
class.bindTemplateCallback("notify_active_surface", &propActiveSurface);
|
||||||
class.bindTemplateCallback("notify_tree", &propSplitTree);
|
class.bindTemplateCallback("notify_tree", &propSplitTree);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1804,6 +1804,7 @@ pub const Window = extern struct {
|
||||||
|
|
||||||
fn init(class: *Class) callconv(.c) void {
|
fn init(class: *Class) callconv(.c) void {
|
||||||
gobject.ext.ensureType(DebugWarning);
|
gobject.ext.ensureType(DebugWarning);
|
||||||
|
gobject.ext.ensureType(SplitTree);
|
||||||
gobject.ext.ensureType(Surface);
|
gobject.ext.ensureType(Surface);
|
||||||
gobject.ext.ensureType(Tab);
|
gobject.ext.ensureType(Tab);
|
||||||
gtk.Widget.Class.setTemplateFromResource(
|
gtk.Widget.Class.setTemplateFromResource(
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ template $GhosttyTab: Box {
|
||||||
orientation: vertical;
|
orientation: vertical;
|
||||||
hexpand: true;
|
hexpand: true;
|
||||||
vexpand: true;
|
vexpand: true;
|
||||||
|
title: bind $computed_title(split_tree.active-surface as <$GhosttySurface>.title, split_tree.is-zoomed) as <string>;
|
||||||
tooltip: bind split_tree.active-surface as <$GhosttySurface>.pwd;
|
tooltip: bind split_tree.active-surface as <$GhosttySurface>.pwd;
|
||||||
|
|
||||||
$GhosttySplitTree split_tree {
|
$GhosttySplitTree split_tree {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue