mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-08-02 14:57:31 +03:00
feat: +notify
CLI action for sending desktop notifications
Simple CLI action for sending a desktop notification using OSC 777.
This commit is contained in:
@ -11,6 +11,7 @@ const list_colors = @import("list_colors.zig");
|
|||||||
const list_actions = @import("list_actions.zig");
|
const list_actions = @import("list_actions.zig");
|
||||||
const show_config = @import("show_config.zig");
|
const show_config = @import("show_config.zig");
|
||||||
const validate_config = @import("validate_config.zig");
|
const validate_config = @import("validate_config.zig");
|
||||||
|
const notify = @import("notify.zig");
|
||||||
|
|
||||||
/// Special commands that can be invoked via CLI flags. These are all
|
/// Special commands that can be invoked via CLI flags. These are all
|
||||||
/// invoked by using `+<action>` as a CLI flag. The only exception is
|
/// invoked by using `+<action>` as a CLI flag. The only exception is
|
||||||
@ -43,6 +44,9 @@ pub const Action = enum {
|
|||||||
// Validate passed config file
|
// Validate passed config file
|
||||||
@"validate-config",
|
@"validate-config",
|
||||||
|
|
||||||
|
// Send a desktop notification
|
||||||
|
notify,
|
||||||
|
|
||||||
pub const Error = error{
|
pub const Error = error{
|
||||||
/// Multiple actions were detected. You can specify at most one
|
/// Multiple actions were detected. You can specify at most one
|
||||||
/// action on the CLI otherwise the behavior desired is ambiguous.
|
/// action on the CLI otherwise the behavior desired is ambiguous.
|
||||||
@ -134,6 +138,7 @@ pub const Action = enum {
|
|||||||
.@"list-actions" => try list_actions.run(alloc),
|
.@"list-actions" => try list_actions.run(alloc),
|
||||||
.@"show-config" => try show_config.run(alloc),
|
.@"show-config" => try show_config.run(alloc),
|
||||||
.@"validate-config" => try validate_config.run(alloc),
|
.@"validate-config" => try validate_config.run(alloc),
|
||||||
|
.notify => try notify.run(alloc),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
61
src/cli/notify.zig
Normal file
61
src/cli/notify.zig
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
const std = @import("std");
|
||||||
|
const Allocator = std.mem.Allocator;
|
||||||
|
const ArenaAllocator = std.heap.ArenaAllocator;
|
||||||
|
const Action = @import("action.zig").Action;
|
||||||
|
const args = @import("args.zig");
|
||||||
|
|
||||||
|
const log = std.log.scoped(.notify);
|
||||||
|
|
||||||
|
pub const Config = struct {
|
||||||
|
/// This is set by the CLI parser for deinit.
|
||||||
|
_arena: ?ArenaAllocator = null,
|
||||||
|
|
||||||
|
/// The title of the notifiction.
|
||||||
|
title: [:0]const u8 = "Ghostty",
|
||||||
|
|
||||||
|
/// The body of the notification.
|
||||||
|
body: ?[:0]const u8 = null,
|
||||||
|
|
||||||
|
pub fn deinit(self: *Config) void {
|
||||||
|
if (self._arena) |arena| arena.deinit();
|
||||||
|
self.* = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Enables "-h" and "--help" to work.
|
||||||
|
pub fn help(self: Config) !void {
|
||||||
|
_ = self;
|
||||||
|
return Action.help_error;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/// The `notify` command is used to send a desktop notification to the user
|
||||||
|
/// using OSC 777.
|
||||||
|
///
|
||||||
|
/// The `--title` argument is used to set the title of the notification. If
|
||||||
|
/// unspecified, the default of "Ghostty" will be used.
|
||||||
|
///
|
||||||
|
/// The `--body` argument is used to set the body of the notification. This
|
||||||
|
/// argument is required.
|
||||||
|
pub fn run(alloc: Allocator) !u8 {
|
||||||
|
var iter = try std.process.argsWithAllocator(alloc);
|
||||||
|
defer iter.deinit();
|
||||||
|
return try runArgs(alloc, &iter);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn runArgs(alloc_gpa: Allocator, argsIter: anytype) !u8 {
|
||||||
|
var config: Config = .{};
|
||||||
|
defer config.deinit();
|
||||||
|
try args.parse(Config, alloc_gpa, &config, argsIter);
|
||||||
|
|
||||||
|
const body = config.body orelse {
|
||||||
|
return Action.help_error;
|
||||||
|
};
|
||||||
|
|
||||||
|
var buffer: [2048]u8 = undefined;
|
||||||
|
const message = try std.fmt.bufPrint(&buffer, "\x1b]777;notify;{s};{s}\x1b\\", .{ config.title, body });
|
||||||
|
|
||||||
|
const stdout = std.io.getStdOut();
|
||||||
|
try stdout.writeAll(message);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Reference in New Issue
Block a user