Notcurses-Native.git | examples/ | 05-clock.raku edit


#!/usr/bin/env raku
use lib 'lib';
use NativeCall;
use Notcurses::Native;
use Notcurses::Native::Types;
use Notcurses::Native::Plane;

# Real-time clock with color cycling — press any key to quit

my $nc = notcurses_init(NotcursesOptions.new, Pointer)
	or die "Failed to initialize notcurses";

my $std = notcurses_stdplane($nc);
my uint32 ($rows, $cols);
ncplane_dim_yx($std, $rows, $cols);

my $clock-plane = ncplane_create($std, NcplaneOptions.new(
	:y(($rows / 2 - 1).Int), :x(($cols / 2 - 5).Int),
	:rows(3), :cols(10),
));

my $hue = 0;
loop {
	# Check for keypress (non-blocking)
	my $ni = Ncinput.new;
	my $key = notcurses_get_nblock($nc, $ni);
	last if $key > 0 && ($ni.id == 'q'.ord || $ni.id == NCKEY_ESC);

	# Color cycle
	my $r = ((sin($hue) + 1) * 127).Int;
	my $g = ((sin($hue + 2.094) + 1) * 127).Int;  # +2π/3
	my $b = ((sin($hue + 4.189) + 1) * 127).Int;  # +4π/3
	$hue += 0.05;

	# Draw time
	my $time = DateTime.now.hh-mm-ss;
	ncplane_erase($clock-plane);
	ncplane_set_fg_rgb8($clock-plane, $r, $g, $b);
	ncplane_on_styles($clock-plane, NCSTYLE_BOLD);
	ncplane_putstr_yx($clock-plane, 1, 1, $time);
	ncplane_off_styles($clock-plane, NCSTYLE_BOLD);

	# Dim instruction
	ncplane_set_fg_rgb8($std, 80, 80, 80);
	ncplane_putstr_yx($std, $rows - 1, ($cols - 14) div 2, 'q or Esc quits');

	notcurses_render($nc);
	sleep 0.05;
}

ncplane_destroy($clock-plane);
notcurses_stop($nc);