Attempting to pshell into it. Save Point.

This commit is contained in:
kake26 2025-04-30 16:49:36 -05:00
parent a0de10cc12
commit a5de997cfa
Signed by: kake26
GPG key ID: E0A989B571D1F99F
5 changed files with 104 additions and 6 deletions

BIN
kpadgtk3 Executable file

Binary file not shown.

View file

@ -1,17 +1,25 @@
#!/usr/bin/perl #!/usr/bin/perl
use strict;
use warnings;
use Gtk3 '-init'; use Gtk3 '-init';
use Glib qw(TRUE FALSE); use Glib qw(TRUE FALSE);
use File::Glob; use File::Glob;
use FileHandle; use FileHandle;
use LWP::Simple; use LWP::Simple;
use Gtk3::SourceView; use Gtk3::SourceView;
use IPC::Open3;
use IO::Select;
# Declare global variables # Declare global variables
our $textbuffer; # SourceView buffer for the editor our $textbuffer; # SourceView buffer for the editor
our $textview; # SourceView widget our $textview; # SourceView widget for editor
our $statusbar; # Status bar for feedback our $statusbar; # Status bar for feedback
our $open; # Current file path our $open; # Current file path
our $track = 'init'; # Tracks modifications our $track = 'init'; # Tracks modifications
our $shell_buffer; # SourceView buffer for pshell
our $shell_view; # SourceView widget for pshell
our $shell_scrolled; # Scrolled window for pshell
our $shell_pid; # pshell process ID
# Base directory setup (reused from your code) # Base directory setup (reused from your code)
my ($ar) = @ARGV; my ($ar) = @ARGV;
@ -166,6 +174,12 @@ my $which_line_item = Gtk3::MenuItem->new_with_label('Which Line?');
$which_line_item->signal_connect(activate => \&which_line_dialog); $which_line_item->signal_connect(activate => \&which_line_dialog);
$tools_menu->append($which_line_item); $tools_menu->append($which_line_item);
my $toggle_shell = Gtk3::MenuItem->new_with_label('Toggle pshell');
$toggle_shell->signal_connect(activate => sub {
$shell_scrolled->set_visible(!$shell_scrolled->get_visible);
});
$tools_menu->append($toggle_shell);
# HTML menu # HTML menu
my $html_menu = Gtk3::Menu->new; my $html_menu = Gtk3::Menu->new;
my $html_item = Gtk3::MenuItem->new_with_label('HTML'); my $html_item = Gtk3::MenuItem->new_with_label('HTML');
@ -210,9 +224,13 @@ $about_item->signal_connect(activate => sub {
}); });
$help_menu->append($about_item); $help_menu->append($about_item);
# Text view with SourceView # Split pane for editor and pshell
my $paned = Gtk3::Paned->new('vertical');
$vbox->pack_start($paned, TRUE, TRUE, 0);
# Editor (SourceView)
my $scrolled = Gtk3::ScrolledWindow->new(undef, undef); my $scrolled = Gtk3::ScrolledWindow->new(undef, undef);
$vbox->pack_start($scrolled, TRUE, TRUE, 0); $paned->pack1($scrolled, TRUE, TRUE);
$textview = Gtk3::SourceView::View->new; $textview = Gtk3::SourceView::View->new;
$textview->set_wrap_mode('word'); $textview->set_wrap_mode('word');
$textview->set_show_line_numbers(TRUE); $textview->set_show_line_numbers(TRUE);
@ -224,6 +242,84 @@ my $language = $lang_manager->get_language('perl');
$textbuffer->set_language($language) if $language; $textbuffer->set_language($language) if $language;
$textbuffer->set_highlight_syntax(TRUE); $textbuffer->set_highlight_syntax(TRUE);
# pshell panel (SourceView)
$shell_scrolled = Gtk3::ScrolledWindow->new(undef, undef);
$paned->pack2($shell_scrolled, FALSE, TRUE);
$shell_view = Gtk3::SourceView::View->new;
$shell_view->set_wrap_mode('word');
$shell_view->set_editable(TRUE);
$shell_scrolled->add($shell_view);
$shell_buffer = $shell_view->get_buffer;
my $shell_lang = $lang_manager->get_language('perl');
$shell_buffer->set_language($shell_lang) if $shell_lang;
$shell_buffer->set_highlight_syntax(TRUE);
$shell_buffer->set_text("pshell:/home/kake26/projects/perl/kpadold> ");
# Start pshell
my ($wtr, $rdr, $err);
my $pshell_path = "$basedir/pshell";
if (!-x $pshell_path) {
$statusbar->push(0, "Error: pshell not found or not executable at $pshell_path");
} else {
eval {
$shell_pid = open3($wtr, $rdr, $err, $pshell_path);
1;
} or do {
$statusbar->push(0, "Failed to start pshell: $@");
$shell_buffer->set_text("Error: Could not start pshell\n");
};
if ($shell_pid && defined $rdr && defined $err) {
# Ensure unbuffered output
select($wtr); $| = 1; select(STDOUT);
# Non-blocking read for pshell stdout and stderr
my $selector = IO::Select->new($rdr, $err);
Glib::IO->add_watch(fileno($rdr), ['in', 'hup'], sub {
my ($fileno, $condition) = @_;
if ($condition & 'in') {
my $output;
sysread($rdr, $output, 4096); # Increased buffer size
if ($output) {
$output =~ s/pshell:[^\n>]*> //g; # Strip prompt if included
$shell_buffer->insert_at_cursor($output);
$shell_view->scroll_to_iter($shell_buffer->get_end_iter, 0, FALSE, 0, 0);
}
}
return FALSE if $condition & 'hup';
return TRUE;
}) if defined $rdr;
Glib::IO->add_watch(fileno($err), ['in', 'hup'], sub {
my ($fileno, $condition) = @_;
if ($condition & 'in') {
my $output;
sysread($err, $output, 4096);
if ($output) {
$output =~ s/pshell:[^\n>]*> //g; # Strip prompt if included
$shell_buffer->insert_at_cursor($output);
$shell_view->scroll_to_iter($shell_buffer->get_end_iter, 0, FALSE, 0, 0);
}
}
return FALSE if $condition & 'hup';
return TRUE;
}) if defined $err;
}
}
# Handle pshell input
$shell_view->signal_connect('key-press-event' => sub {
my ($widget, $event) = @_;
if ($event->keyval == Gtk3::Gdk::KEY_Return) {
my ($start, $end) = $shell_buffer->get_bounds;
my $text = $shell_buffer->get_text($start, $end, TRUE);
my ($cmd) = $text =~ /pshell:[^\n>]*> (.*?)$/s;
if (defined $cmd && defined $wtr) {
print $wtr "$cmd\n";
$shell_buffer->insert_at_cursor("\npshell:$ENV{HOME}> ");
}
return TRUE;
}
return FALSE;
});
# CSS styling for Kubuntu # CSS styling for Kubuntu
my $provider = Gtk3::CssProvider->new; my $provider = Gtk3::CssProvider->new;
$provider->load_from_data(' $provider->load_from_data('
@ -499,6 +595,8 @@ sub tapp {
save_file(); save_file();
} }
} }
# Kill pshell process
kill 'TERM', $shell_pid if $shell_pid;
Gtk3->main_quit; Gtk3->main_quit;
} }

BIN
pshell Executable file

Binary file not shown.

BIN
pshell_env.db Normal file

Binary file not shown.

BIN
pshell_history.db Normal file

Binary file not shown.