Notcurses-Native.git | examples/ | 04-input.raku edit


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

# Interactive input demo: shows keypresses in real-time

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);

# Header
ncplane_set_fg_rgb8($std, 100, 200, 255);
ncplane_putstr_yx($std, 0, 2, 'Input Demo — press keys to see events (Escape to quit)');
ncplane_set_fg_rgb8($std, 60, 60, 60);
ncplane_putstr_yx($std, 1, 2, '─' x ($cols - 4));

# Event log area
my $log-plane = ncplane_create($std, NcplaneOptions.new(
	:y(3), :x(2),
	:rows($rows - 4), :cols($cols - 4),
	:flags(NCPLANE_OPTION_VSCROLL),
));

my $event-num = 0;
notcurses_render($nc);

loop {
	my $ni = Ncinput.new;
	my $key = notcurses_get_blocking($nc, $ni);

	last if $ni.id == NCKEY_ESC;

	$event-num++;

	# Format the event
	my $id = $ni.id;
	my $type = do given $ni.evtype {
		when NCTYPE_PRESS   { 'PRESS  ' }
		when NCTYPE_REPEAT  { 'REPEAT ' }
		when NCTYPE_RELEASE { 'RELEASE' }
		default             { 'UNKNOWN' }
	};

	# Build modifier string
	my @mods;
	@mods.push('Shift') if ncinput_shift_p($ni);
	@mods.push('Ctrl')  if ncinput_ctrl_p($ni);
	@mods.push('Alt')   if ncinput_alt_p($ni);
	@mods.push('Meta')  if ncinput_meta_p($ni);
	@mods.push('Super') if ncinput_super_p($ni);
	my $mod-str = @mods ?? @mods.join('+') ~ '+' !! '';

	# Character representation
	my $char-str = $id >= 32 && $id < 127 ?? chr($id) !! "U+{$id.fmt('%04X')}";

	my $line = sprintf('#%3d  %s  %s%s  (id=%d y=%d x=%d)',
		$event-num, $type, $mod-str, $char-str, $id, $ni.y, $ni.x);

	# Color based on type
	given $ni.evtype {
		when NCTYPE_PRESS   { ncplane_set_fg_rgb8($log-plane, 100, 255, 100) }
		when NCTYPE_RELEASE { ncplane_set_fg_rgb8($log-plane, 255, 100, 100) }
		default             { ncplane_set_fg_rgb8($log-plane, 200, 200, 100) }
	}

	ncplane_putstr_yx($log-plane, $event-num - 1, 0, $line);
	notcurses_render($nc);
}

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