CatalystX-Restarter-GTK
view release on metacpan or search on metacpan
lib/CatalystX/Restarter/GTK.pm view on Meta::CPAN
try {
$self->start_sub->();
}
catch {
STDERR->print($_);
exit 1;
};
}
}
sub _kill_child {
my $self = shift;
if ($self->_child) {
kill 'INT', $self->_child;
waitpid($self->_child, 0);
$self->_child(0);
$self->notify_win('stopped');
}
}
__PACKAGE__->meta->make_immutable;
no Moose;
#--- Class WinMonitor for GUI ---
package WinMonitor;
use strict;
use warnings;
use Gtk2;
use Glib qw(TRUE FALSE);
use Carp;
my $path = __FILE__;
$path =~ s/[^\/]+$//;
my %status_msg = (
starting => { msg => 'Starting', color => Gtk2::Gdk::Color->new(0, 0, 0x55 * 257) },
started => { msg => 'Started', color => Gtk2::Gdk::Color->new(0, 0x55 * 257, 0) },
stopped => { msg => 'Stopped', color => Gtk2::Gdk::Color->new(0x55 * 257, 0, 0) },
);
$status_msg{$_}->{icon} = $path.$_.'.png' foreach (keys %status_msg);
sub new {
my ($class, $app_name) = @_;
my $obj = {};
my $win = Gtk2::Window->new('toplevel');
$win->set_title($app_name);
$win->set_keep_above(1);
$win->set_position('center');
my $status = Gtk2::Label->new;
my $menu_bar = Gtk2::MenuBar->new;
my $view = Gtk2::MenuItem->new('_View');
my $mview = Gtk2::Menu->new;
my $console = Gtk2::MenuItem->new('Console');
$console->signal_connect('activate', sub { $obj->show_msg; });
$mview->append($console);
$view->set_submenu($mview);
my $restart = Gtk2::MenuItem->new('Restart');
my $mrestart = Gtk2::Menu->new;
$mrestart->append($restart);
my $tools = Gtk2::MenuItem->new('_Tools');
$tools->set_submenu($mrestart);
$menu_bar->append($view);
$menu_bar->append($tools);
$menu_bar->set_size_request(-1, 22);
my $vbox = Gtk2::VBox->new(FALSE, 0);
$vbox->pack_start($menu_bar, FALSE, FALSE, 0);
my $hbox = Gtk2::HBox->new(TRUE, 0);
$hbox->pack_start(Gtk2::Label->new($app_name.' Server'), TRUE, TRUE, 3);
$vbox->pack_start($hbox, TRUE, FALSE, 3);
$vbox->pack_start($status, TRUE, FALSE, 3);
$win->add($vbox);
$win->signal_connect(delete_event => sub { Gtk2->main_quit; });
$win->signal_connect('window-state-event' => sub {
if (shift(@{$_[1]->new_window_state}) eq 'iconified' && $obj->{trayicon}->is_embedded) {
$win->hide;
}
});
$win->show_all;
my $buffer = Gtk2::TextBuffer->new;
#-- Create tray icon and menu
my $trayicon = Gtk2::StatusIcon->new_from_file($status_msg{stopped}->{icon});
$trayicon->set_visible(TRUE);
my $traymenu = Gtk2::Menu->new;
my $tray_mconsole = Gtk2::MenuItem->new('View Console');
$tray_mconsole->signal_connect('activate' => sub { $console->activate; });
my $tray_mrestart = Gtk2::MenuItem->new('Restart');
$tray_mrestart->signal_connect('activate' => sub { $restart->activate; });
my $mexit = Gtk2::MenuItem->new('Exit');
$mexit->signal_connect('activate' => sub { Gtk2->main_quit; });
$traymenu->append($tray_mconsole);
$traymenu->append($tray_mrestart);
$traymenu->append(Gtk2::SeparatorMenuItem->new);
$traymenu->append($mexit);
$trayicon->signal_connect('popup-menu', sub {
my ($ticon, $button, $time) = @_;
my ($x, $y, $push) = Gtk2::StatusIcon::position_menu($traymenu, $ticon);
$traymenu->show_all;
$traymenu->popup(undef, undef, sub {($x, $y,$push)}, undef, $button, $time);
});
$obj = { %$obj, win => $win, trayicon => $trayicon, msg_buffer => $buffer, app_name => $app_name, lbstatus => $status, bt_restart => $restart, bt_console => $console };
bless $obj, $class;
}
# Updates status message on window
sub set_status {
my ($self, $st) = @_;
my $msg = $status_msg{$st};
$self->{lbstatus}->set_text($msg->{msg});
$self->{lbstatus}->modify_fg('normal', $msg->{color});
$self->{win}->set_title($self->{app_name}.'-'.$msg->{msg});
$self->{trayicon}->set_from_file($msg->{icon});
$self->{trayicon}->set_tooltip($self->{app_name}.' ('.$msg->{msg}.')');
}
# Collects console output received into text buffer
sub append_msg {
my ($self, $msg) = @_;
my $buffer = $self->{msg_buffer};
$buffer->insert($buffer->get_end_iter, $msg);
}
sub get_msg_window {
my ($self) = @_;
my $win = Gtk2::Window->new;
$win->set_title($self->{app_name}.' - console output');
$win->set_position('center');
$win->signal_connect('delete_event' => sub { $win->hide; 1; });
my $textview = Gtk2::TextView->new_with_buffer($self->{msg_buffer});
$textview->set_editable(FALSE);
$textview->set_wrap_mode('word');
my $text_desc = Pango::FontDescription->new;
$text_desc->set_family('Monospace');
$textview->modify_font($text_desc);
my $scrolled_win = Gtk2::ScrolledWindow->new;
$scrolled_win->add($textview);
$win->add($scrolled_win);
$win->set_default_size(800, 400);
( run in 1.650 second using v1.01-cache-2.11-cpan-0bb4e1dffa6 )