summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--common/Wizcommon_gtk2.pm118
1 files changed, 118 insertions, 0 deletions
diff --git a/common/Wizcommon_gtk2.pm b/common/Wizcommon_gtk2.pm
new file mode 100644
index 00000000..81a1582d
--- /dev/null
+++ b/common/Wizcommon_gtk2.pm
@@ -0,0 +1,118 @@
+#!/usr/bin/perl
+
+# Copyright (C) 2003 Mandrakesoft
+#
+# Author: Florent Villard <warly@mandrakesoft.com>
+# A Ginies
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+package MDK::Wizard::Wizcommon_gtk2;
+use strict;
+use common;
+
+sub wizard_progress_bar {
+ use lib qw(/usr/lib/libDrakX);
+ use ugtk2 qw(:wrappers);
+ my ($command, $descr) = @_;
+ my ($value, $timer);
+ my $my_win = ugtk2->new("");
+ my $window1 = $my_win->{window};
+ gtkadd($window1,
+ gtkpack(Gtk2::VBox->new(0,0),
+ gtkpack_(Gtk2::VBox->new(0, 3),
+ 0, my $text = Gtk2::Label->new($descr),
+ 0, my $text2 = Gtk2::Label->new,
+ 0, Gtk2::HSeparator->new,
+ 0, my $pbar = Gtk2::ProgressBar->new,
+ ),
+ ),
+ );
+ $window1->realize;
+ $pbar->set_pulse_step(0.1);
+
+ local *TMP;
+ open(TMP, "$command 2>&1 |");
+ while ($value = <TMP>) {
+ $timer = Glib::Timeout->add(10, sub {});
+ $pbar->pulse;
+ $text2->set_text($value);
+ gtkflush();
+ next;
+ $my_win->main;
+ $window1->show_all;
+ undef $value;
+ }
+ close TMP;
+ $my_win->destroy;
+ return 0;
+}
+
+
+my $timeout;
+sub gtktext_get_log {
+ my ($command, $log_w, $log_scroll) = @_;
+ my $buffer = $log_w->get_buffer;
+ $buffer->delete($buffer->get_start_iter, $buffer->get_end_iter);
+
+ my ($prev_scroll, $want_scroll_down) = (0, 1);
+ my $pid = open(my $F, "$command 2>&1 |") or return sub { 1 };
+ fcntl($F, c::F_SETFL(), c::O_NONBLOCK()) or die "can't fcntl F_SETFL: $!";
+ Glib::Source->remove($timeout) if $timeout; $timeout = '';
+ $timeout = Glib::Timeout->add(100, sub {
+ if ($buffer) {
+ my $end = $buffer->get_end_iter;
+ while (defined (my $s = <$F>)) {
+ $buffer->insert_interactive($end, $s, -1);
+ }
+ my $new_scroll = $log_scroll->child->get_vadjustment->get_value;
+ $want_scroll_down &&= $new_scroll >= $prev_scroll;
+ $prev_scroll = $new_scroll;
+ $log_w->scroll_to_iter($end, 0, 0, 0, 0) if $want_scroll_down;
+ }
+ if (waitpid($pid, c::WNOHANG()) > 0) {
+ $buffer->insert_interactive($buffer->get_end_iter, "\n" . "#" x 20 . "\n" . " This script has terminated,\nyou can close this window", -1) if $buffer;
+ $pid = $timeout = '';
+ 0;
+ } else {
+ 1;
+ }
+ });
+ sub {
+ if ($pid) {
+ $::in->ask_yesorno('', N("The command is still running. Do you want to kill it and quit the Wizard?")) or return;
+ kill 9, $pid+1;
+ 1;
+ }
+ $buffer = '';
+ 1;
+ };
+}
+
+sub run_command_and_log {
+ use lib qw(/usr/lib/libDrakX);
+ my ($command, $descr, $when_command_is_over) = @_;
+ my $w = ugtk2->new('');
+ gtkadd(gtkset_size_request($w->{window}, 800, 400),
+ gtkpack_(gtkset_modal(Gtk2::VBox->new, 1),
+ 0, $descr,
+ 1, my $log_scroll = create_scrolled_window(my $log_w = gtkset_editable(Gtk2::TextView->new, 0)),
+ 0, my $close_w = Gtk2::Button->new(N("Close"))),
+ );
+ my $stop_running = gtktext_get_log($command, $log_w, $log_scroll);
+ $close_w->signal_connect(clicked => sub { $stop_running->() and $w->destroy and return 0 });
+ $close_w->grab_focus;
+ $w->show;
+}