use Gtk;
use Gtk::Atoms;
sub bbox_widget_destroy {
my($widget, $todestroy) = @_;
}
sub destroy_tooltips {
# print "Destroy_tooltips: ", Dumper(\@_);
my($widget, $window) = @_;
#$$window->{tooltips}->unref;
$$window = undef;
}
sub cursor_expose_event {
my($widget, $event, $data) = @_;
my($darea, $drawable, $black_gc, $gray_gc, $white_gc, $max_width, $max_height);
$darea = $widget;
$drawable = $widget->window;
$white_gc = $widget->style->white_gc;
$gray_gc = $widget->style->bc_gc('normal');
$black_gc = $widget->style->black_gc;
$max_width = $widget->allocation->{width};
$max_height = $widget->allocation->{width};
$drawable->draw_rectangle($white_gc, 1, 0, 0, $max_width, $max_height/2);
$drawable->draw_rectangle($black_gc, 1, 0, $max_height/2, $max_width, $max_height/2);
$drawable->draw_rectangle($gray_gc, 1, $max_width/3, $max_height/3, $max_width/3, $max_height/3);
1;
}
sub set_cursor {
my($spinner, $widget) = @_;
my($c, $cursor);
$c = $spinner->get_value_as_int;
$c = 0 if $c < 0;
$c = 152 if $c > 152;
$cursor = new Gtk::Gdk::Cusor $c;
$widget->window->set_cursor($cursor);
}
sub cursor_event {
my($widget,$event,$spinner) = @_;
if ($event->{type} eq 'button-press' and ($event->{button} == 1 or $event->{button} == 3)) {
$spinner->spin($event->{button} == 1 ? 'up' : 'down', $spinner->adjustment->step_increment);
return 1;
}
return 0;
}
#static void
#create_cursors ()
#{
# static GtkWidget *window = NULL;
# GtkWidget *frame;
# GtkWidget *hbox;
# GtkWidget *main_vbox;
# GtkWidget *vbox;
# GtkWidget *darea;
# GtkWidget *spinner;
# GtkWidget *button;
# GtkWidget *label;
# GtkWidget *any;
# GtkAdjustment *adj;
#
# if (!window)
# {
# window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
#
# gtk_signal_connect (GTK_OBJECT (window), "destroy",
# GTK_SIGNAL_FUNC (gtk_widget_destroyed),
# &window);
#
# gtk_window_set_title (GTK_WINDOW (window), "Cursors");
#
# main_vbox = gtk_vbox_new (FALSE, 5);
# gtk_container_border_width (GTK_CONTAINER (main_vbox), 0);
# gtk_container_add (GTK_CONTAINER (window), main_vbox);
#
# vbox =
# gtk_widget_new (gtk_vbox_get_type (),
# "GtkBox::homogeneous", FALSE,
# "GtkBox::spacing", 5,
# "GtkContainer::border_width", 10,
# "GtkWidget::parent", main_vbox,
# "GtkWidget::visible", TRUE,
# NULL);
#
# hbox = gtk_hbox_new (FALSE, 0);
# gtk_container_border_width (GTK_CONTAINER (hbox), 5);
# gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
#
# label = gtk_label_new ("Cursor Value:");
# gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
# gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
#
# adj = (GtkAdjustment *) gtk_adjustment_new (0,
# 0, 152,
# 2,
# 10, 0);
# spinner = gtk_spin_button_new (adj, 0, 0);
# gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 0);
#
# frame =
# gtk_widget_new (gtk_frame_get_type (),
# "GtkFrame::shadow", GTK_SHADOW_ETCHED_IN,
# "GtkFrame::label_xalign", 0.5,
# "GtkFrame::label", "Cursor Area",
# "GtkContainer::border_width", 10,
# "GtkWidget::parent", vbox,
# "GtkWidget::visible", TRUE,
# NULL);
#
# darea = gtk_drawing_area_new ();
# gtk_widget_set_usize (darea, 80, 80);
# gtk_container_add (GTK_CONTAINER (frame), darea);
# gtk_signal_connect (GTK_OBJECT (darea),
# "expose_event",
# GTK_SIGNAL_FUNC (cursor_expose_event),
# NULL);
# gtk_widget_set_events (darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
# gtk_signal_connect (GTK_OBJECT (darea),
# "button_press_event",
# GTK_SIGNAL_FUNC (cursor_event),
# spinner);
# gtk_widget_show (darea);
#
# gtk_signal_connect (GTK_OBJECT (spinner), "changed",
# GTK_SIGNAL_FUNC (set_cursor),
# darea);
#
# any =
# gtk_widget_new (gtk_hseparator_get_type (),
# "GtkWidget::visible", TRUE,
# NULL);
# gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
#
# hbox = gtk_hbox_new (FALSE, 0);
# gtk_container_border_width (GTK_CONTAINER (hbox), 10);
# gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
#
# button = gtk_button_new_with_label ("Close");
# gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
# GTK_SIGNAL_FUNC (gtk_widget_destroy),
# GTK_OBJECT (window));
# gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
#
# gtk_widget_show_all (window);
#
# set_cursor (spinner, darea);
# }
# else
# gtk_widget_destroy (window);
#}
sub create_bbox_window {
my($horizontal, $title, $pos, $spacing, $child_w, $child_h, $layout) = @_;
my($window, $box1, $bbox, $button);
$window = new Gtk::Window -toplevel;
set_title $window $title;
$window->signal_connect("destroy", \&bbox_widget_destroy, \$window);
if ($horizontal) {
set_usize $window 550, 60;
set_uposition $window 150, $pos;
$box1 = new Gtk::VBox 0, 0;
} else {
set_usize $window 150, 400;
set_uposition $window $pos, 200;
$box1 = new Gtk::VBox 0, 0;
}
add $window $box1;
show $box1;
if ($horizontal) {
$bbox = new Gtk::HButtonBox;
} else {
$bbox = new Gtk::VButtonBox;
}
set_layout $bbox $layout;
set_spacing $bbox $spacing;
set_child_size $bbox $child_w, $child_h;
show $bbox;
border_width $box1 25;
pack_start $box1 $bbox, 1, 1, 0;
$button = new Gtk::Button "OK";
add $bbox $button;
signal_connect $button "clicked" => \&bbox_widget_destroy, \$window;
show $button;
$button = new Gtk::Button "Cancel";
add $bbox $button;
show $button;
$button = new Gtk::Button "Help";
add $bbox $button;
show $button;
show $window;
}
sub test_hbbox {
create_bbox_window (1, "Spread", 50, 40, 85, 28, -spread);
create_bbox_window (1, "Edge", 200, 40, 85, 25, -edge);
create_bbox_window (1, "Start", 350, 40, 85, 25, -start);
create_bbox_window (1, "End", 500, 15, 30, 25, -end);
}
sub test_vbbox {
create_bbox_window (0, "Spread", 50, 40, 85, 28, -spread);
create_bbox_window (0, "Edge", 250, 40, 85, 28, -edge);
create_bbox_window (0, "Start", 450, 40, 85, 25, -start);
create_bbox_window (0, "End", 650, 15, 30, 25, -end);
}
sub create_button_box {
my($bbox,$button);
if (not defined $button_box_window) {
$button_box_window = new Gtk::Window -toplevel;
$button_box_window->set_title("Button Box Test");
$button_box_window->signal_connect("destroy", \&Gtk::Widget::destroyed, \$button_box_window);
$button_box_window->border_width(20);
$bbox = new Gtk::HButtonBox;
$button_box_window->add($bbox);
show $bbox;
$button = new Gtk::Button "Horizontal";
signal_connect $button "clicked" => \&test_hbbox;
$bbox->add($button);
show $button;
$button = new Gtk::Button "Vertical";
signal_connect $button "clicked" => \&test_vbbox;
$bbox->add($button);
show $button;
}
if (!$button_box_window->visible) {
show $button_box_window;
} else {
destroy $button_box_window;
}
}
$spinner1 = undef;
sub toggle_snap {
my($widget, $spin) = @_;
if ($widget->active) {
$spin->set_update_policy(['always', 'snap_to_ticks']);
} else {
$spin->set_update_policy('always');
}
}
sub toggle_numeric {
my($widget, $spin) = @_;
$spin->set_numeric($widget->active);
}
sub change_digits {
my($widget, $spin) = @_;
$spinner1->set_digits($spin->get_value_as_int);
}
sub get_value {
my($widget,$data) = @_;
my($labels, $spin, $buf);
$spin = $spinner1;
$label = $widget->{label};
if ($data == 1) {
$buf = sprintf "%d", $spin->get_value_as_int;
} else {
$buf = sprintf "%0.*f", $spin->digits, $spin->get_value_as_float;
}
$label->set($buf);
}
sub create_spins {
my($frame, $hbox, $main_vbox, $vbox, $vbox2, $spinner2, $spinner, $button, $label, $val_label, $adj);
if (not defined $spinner_window) {
$spinner_window = new Gtk::Window -toplevel;
$spinner_window->signal_connect(destroy => \&Gtk::Widget::destroyed, \$spinner_window);
$spinner_window->set_title("GtkSpinButton");
$main_vbox = new Gtk::VBox 0, 5;
border_width $main_vbox 10;
$spinner_window->add($main_vbox);
$frame = new Gtk::Frame "Not accelerated";
$main_vbox->pack_start($frame, 1, 1, 0);
$vbox = new Gtk::VBox 0, 0;
$vbox->border_width(5);
$frame->add($vbox);
$hbox = new Gtk::HBox(0,0);
$vbox->pack_start($hbox, 1, 1, 5);
$vbox2 = new Gtk::VBox(0,0);
$hbox->pack_start($vbox2, 1, 1, 5);
$label = new Gtk::Label "Day :";
$label->set_alignment(0, 0.5);
$vbox2->pack_start($label, 0, 1, 0);
$adj = new Gtk::Adjustment 1.0, 1.0, 31.0, 1.0, 5.0, 0.0;
$spinner = new Gtk::SpinButton $adj, 0, 0;
$spinner->set_wrap(1);
$vbox2->pack_start($spinner, 0, 1, 0);
$vbox2 = new Gtk::VBox 0, 0;
$hbox->pack_start($vbox2, 1, 1, 5);
$label = new Gtk::Label "Month :";
$label->set_alignment(0, 0.5);
$vbox2->pack_start($label, 0, 1, 0);
$adj = new Gtk::Adjustment 1.0, 1.0, 12.0, 1.0, 5.0, 0.0;
$spinner = new Gtk::SpinButton $adj, 0, 0;
$spinner->set_wrap(1);
$vbox2->pack_start($spinner, 0, 1, 0);
$vbox2 = new Gtk::VBox 0, 0;
$hbox->pack_start($vbox2, 1, 1, 5);
$label = new Gtk::Label "Year :";
$label->set_alignment(0, 0.5);
$vbox2->pack_start($label, 0, 1, 0);
$adj = new Gtk::Adjustment 1998.0, 0.0, 2100.0, 1.0, 100.0, 0.0;
$spinner = new Gtk::SpinButton $adj, 0, 0;
$spinner->set_wrap(1);
$spinner->set_usize(55, 0);
$vbox2->pack_start($spinner, 0, 1, 0);
$frame = new Gtk::Frame "Accelerated";
$main_vbox->pack_start($frame, 1, 1, 0);
$vbox = new Gtk::VBox 0, 0;
$vbox->border_width(5);
$frame->add($vbox);
$hbox = new Gtk::HBox 0, 0;
$vbox->pack_start($hbox, 0, 1, 5);
$vbox2 = new Gtk::VBox 0, 0;
$hbox->pack_start($vbox2, 1, 1, 5);
$label = new Gtk::Label "Value :";
$label->set_alignment(0, 0.5);
$vbox2->pack_start($label, 0, 1, 0);
$adj = new Gtk::Adjustment 0.0, -10000.0, 10000.0, 0.5, 100.0, 0.0;
$spinner1 = new Gtk::SpinButton $adj, 1.0, 2;
$spinner1->set_wrap(1);
$spinner1->set_usize(100, 0);
$spinner1->set_update_policy('always');
$vbox2->pack_start($spinner1, 0, 1, 0);
$vbox2 = new Gtk::VBox 0, 0;
$hbox->pack_start($vbox2, 1, 1, 5);
$label = new Gtk::Label "Digits :";
$label->set_alignment(0, 0.5);
$vbox2->pack_start($label, 0, 1, 0);
$adj = new Gtk::Adjustment(2, 1, 5, 1, 1, 0);
$spinner2 = new Gtk::SpinButton($adj, 0.0, 0);
$spinner2->set_wrap(1);
$adj->signal_connect(value_changed => \&change_digits, $spinner2);
$vbox2->pack_start($spinner2, 0, 1, 0);
$hbox = new Gtk::HBox(0, 0);
$vbox->pack_start($hbox, 0, 1, 5);
$button = new Gtk::CheckButton "Snap to 0.5-ticks";
$button->signal_connect(clicked => \&toggle_snap, $spinner1);
$vbox->pack_start($button, 1, 1, 0);
$button->set_state(1);
$button = new Gtk::CheckButton "Numeric only input mode";
$button->signal_connect(clicked => \&toggle_numeric, $spinner1);
$vbox->pack_start($button, 1, 1, 0);
$button->set_state(1);
$val_label = new Gtk::Label "";
$hbox = new Gtk::HBox 0, 0;
$vbox->pack_start($hbox, 0, 1, 5);
$button = new Gtk::Button "Value as Int";
$button->{label} = $val_label;
$button->signal_connect(clicked => \&get_value, 1);
$hbox->pack_start($button, 1, 1, 5);
$button = new Gtk::Button "Value as Float";
$button->{label} = $val_label;
$button->signal_connect(clicked => \&get_value, 2);
$hbox->pack_start($button, 1, 1, 5);
$vbox->pack_start($val_label, 1, 1, 0);
$val_label->set("0");
$hbox = new Gtk::HBox 0, 0;
$main_vbox->pack_start($hbox, 0, 1, 0);
$button = new Gtk::Button "Close";
$button->signal_connect(clicked => sub {destroy $spinner_window});
$hbox->pack_start($button, 1, 1, 5);
}
if (!$spinner_window->visible) {
show_all $spinner_window;
} else {
destroy $spinner_window;
}
}
sub shape_pressed {
my($widget, $event) = @_;
return if $event->{type} ne 'button_press';
$widget->{save_x} = $event->{x};
$widget->{save_y} = $event->{y};
$widget->grab_add;
$w = $widget->window;
Gtk::Gdk->pointer_grab($w, 1,
['button_release_mask', 'button_motion_mask', 'pointer_motion_hint_mask'],
undef, undef ,0);
}
sub shape_released {
my($widget) = @_;
$widget->grab_remove;
Gtk::Gdk->pointer_ungrab(0);
}
sub shape_motion {
my($widget, $event) = @_;
($x,$y) = $root_win->get_pointer;
$widget->set_uposition($x - $widget->{save_x}, $y - $widget->{save_y});
}
sub shape_create_icon {
my($xpm_file, $x, $y, $px, $py, $window_type) = @_;
my($window, $pixmap, $fixed, $gc, $gdk_pixmap_mask, $gdk_pixmap, $style);
$style = Gtk::Widget->get_default_style;
$gc = $style->black;#_gc;
$window = new Gtk::Window $window_type;
$fixed = new Gtk::Fixed;
$fixed->set_usize(100,100);
$window->add($fixed);
show $fixed;
$window->set_events( [@{$window->get_events}, 'button_motion_mask', 'pointer_motion_hint_mask', 'button_press_mask']);
realize $window;
($gdk_pixmap, $gdk_pixmap_mask) = Gtk::Gdk::Pixmap->create_from_xpm($window->window, $style->bg('normal'), $xpm_file);
$pixmap = new Gtk::Pixmap $gdk_pixmap, $gdk_pixmap_mask;
$fixed->put($pixmap, $px, $py);
show $pixmap;
$window->shape_combine_mask($gdk_pixmap_mask, $px, $py);
$window->signal_connect('button_press_event', \&shape_pressed);
$window->signal_connect('button_release_event', \&shape_released);
$window->signal_connect('motion_notify_event', \&shape_motion);
$window->set_uposition($x,$y);
$window->show;
$window;
}
sub destroy_window {
my($widget, $windowref, $w2) = @_;
$$windowref = undef;
$w2 = undef if defined $w2;
0;
}
sub button_window {
my($widget,$button) = @_;
if (! $button->visible) {
show $button;
} else {
hide $button;
}
}
sub create_shapes {
$root_win = Gtk::Gdk::Window->new_foreign(Gtk::Gdk->ROOT_WINDOW());
if (not defined $modeller) {
$modeller = shape_create_icon("Modeller.xpm", 440, 140, 0,0, -popup);
$modeller->signal_connect("destroy", \&Gtk::Widget::destroyed, \$modeller);
} else {
destroy $modeller;
}
if (not defined $sheets) {
$sheets = shape_create_icon("FilesQueue.xpm", 580,170, 0,0, -popup);
$sheets->signal_connect("destroy", \&Gtk::Widget::destroyed, \$sheets);
} else {
destroy $sheets;
}
if (not defined $rings) {
$rings = shape_create_icon("3DRings.xpm", 460, 270, 25,25, -toplevel);
$rings->signal_connect("destroy", \&Gtk::Widget::destroyed, \$rings);
} else {
destroy $rings;
}
}
sub create_buttons {
my($box1, $box2, $table, @button, $separator);
if (not defined $buttons_window) {
$buttons_window = new Gtk::Window 'toplevel';
signal_connect $buttons_window "destroy", \&destroy_window, \$buttons_window;
signal_connect $buttons_window "delete_event", \&destroy_window, \$buttons_window;
$buttons_window->set_title("buttons");
$buttons_window->border_width(0);
$box1 = new Gtk::VBox 0, 0;
$buttons_window->add($box1);
$box1->show;
$table = new Gtk::Table (3,3, 0);
$table->set_row_spacings(5);
$table->set_col_spacings(5);
$table->border_width(10);
$box1->pack_start($table, 1, 1, 0);
$table->show;
for (0..8) { $button[$_] = new Gtk::Button "button".($_+1); }
$button[0]->signal_connect("clicked", \&button_window, $button[1]);
$table->attach($button[0], 0, 1, 0, 1, {expand=>1,fill=>1}, {expand=>1,fill=>1},0,0);
$button[0]->show;
$button[1]->signal_connect("clicked", \&button_window, $button[2]);
$table->attach($button[1], 1, 2, 1, 2, {expand=>1,fill=>1}, {expand=>1,fill=>1},0,0);
$button[1]->show;
$button[2]->signal_connect("clicked", \&button_window, $button[3]);
$table->attach($button[2], 2, 3, 2, 3, ["expand","fill"], ["expand","fill"],0,0);
$button[2]->show;
$button[3]->signal_connect("clicked", \&button_window, $button[4]);
$table->attach($button[3], 0, 1, 2, 3, ["expand","fill"], ["expand","fill"],0,0);
$button[3]->show;
$button[4]->signal_connect("clicked", \&button_window, $button[5]);
$table->attach($button[4], 2, 3, 0, 1, ["expand","fill"], ["expand","fill"],0,0);
$button[4]->show;
$button[5]->signal_connect("clicked", \&button_window, $button[6]);
$table->attach($button[5], 1, 2, 2, 3, ["expand","fill"], ["expand","fill"],0,0);
$button[5]->show;
$button[6]->signal_connect("clicked", \&button_window, $button[7]);
$table->attach($button[6], 1, 2, 0, 1, ["expand","fill"], ["expand","fill"],0,0);
$button[6]->show;
$button[7]->signal_connect("clicked", \&button_window, $button[8]);
$table->attach($button[7], 2, 3, 1, 2, ["expand","fill"], ["expand","fill"],0,0);
$button[7]->show;
$button[8]->signal_connect("clicked", \&button_window, $button[8]);
$table->attach($button[8], 0, 1, 1, 2, ["expand","fill"], ["expand","fill"],0,0);
$button[8]->show;
$separator = new Gtk::HSeparator;
$box1->pack_start($separator, 0, 1, 0);
$separator->show;
$box2 = new Gtk::VBox(0, 10);
$box2->border_width(10);
$box1->pack_start($box2, 0, 1, 0);
$box2->show;
$button[0] = new Gtk::Button "close";
$button[0]->signal_connect("clicked", sub { destroy $buttons_window});
$box2->pack_start($button[0], 1, 1, 0);
$button[0]->can_default(1);
$button[0]->grab_default;
$button[0]->show;
}
if (not $buttons_window->visible) {
$buttons_window->show;
} else {
destroy $buttons_window;
}
}
sub create_toggle_buttons {
my($box1, $box2, $button, $separator);
if (not defined $tb_window) {
$tb_window = new Gtk::Window -toplevel;
$tb_window->signal_connect("destroy", \&destroy_window, \$tb_window);
$tb_window->signal_connect("delete_event", \&destroy_window, \$tb_window);
$tb_window->set_title("toggle buttons");
$tb_window->border_width(0);
$box1 = new Gtk::VBox(0, 0);
$tb_window->add($box1);
$box1->show;
$box2 = new Gtk::VBox 0, 10;
$box2->border_width(10);
$box1->pack_start($box2, 1, 1, 0);
$box2->show;
$button = new Gtk::ToggleButton "button1";
$box2->pack_start($button, 1, 1, 0);
$button->show;
$button = new Gtk::ToggleButton "button2";
$box2->pack_start($button, 1, 1, 0);
$button->show;
$button = new Gtk::ToggleButton "button3";
$box2->pack_start($button, 1, 1, 0);
$button->show;
$separator = new Gtk::HSeparator;
$box1->pack_start($separator, 0, 1, 0);
$separator->show;
$box2 = new Gtk::VBox (0, 10);
$box2->border_width(10);
$box1->pack_start($box2, 0, 1, 0);
$box2->show;
$button = new Gtk::Button "close";
$button->signal_connect( "clicked", sub { destroy $tb_window });
$box2->pack_start($button, 1, 1, 0);
$button->can_default(1);
$button->grab_default;
$button->show;
}
if (!$tb_window->visible) {
$tb_window->show;
} else {
destroy $tb_window;
}
}
sub create_radio_buttons {
my($box1,$box2,$button,$separator);
if (not defined $rb_window) {
$rb_window = new Gtk::Window -toplevel;
$rb_window->signal_connect("destroy", \&destroy_window, \$rb_window);
$rb_window->signal_connect("delete_event", \&destroy_window, \$rb_window);
$rb_window->set_title("radio buttons");
$rb_window->border_width(0);
$box1 = new Gtk::VBox(0,0);
$rb_window->add($box1);
show $box1;
$box2 = new Gtk::VBox(0,10);
$box2->border_width(10);
$box1->pack_start($box2, 1, 1, 0);
$box2->show;
$button = new Gtk::RadioButton "button1";
$box2->pack_start($button, 1, 1, 0);
$button->show;
$button = new Gtk::RadioButton "button2", $button;
$button->set_state(1);
$box2->pack_start($button, 1, 1, 0);
$button->show;
$button = new Gtk::RadioButton "button3", $button;
$box2->pack_start($button, 1, 1, 0);
$button->show;
$separator = new Gtk::HSeparator;
$box1->pack_start($separator, 0, 1, 0);
$separator->show;
$box2 = new Gtk::VBox(0,10);
$box2->border_width(10);
$box1->pack_start($box2, 0, 1, 0);
$box2->show;
$button = new Gtk::Button "close";
$button->signal_connect( clicked => sub { destroy $rb_window} );
$box2->pack_start($button, 1, 1, 0);
$button->can_default(1);
$button->grab_default;
$button->show;
}
if (!$rb_window->visible) {
show $rb_window;
} else {
destroy $rb_window;
}
}
sub new_pixmap {
my ($filename, $window, $background) = @_;
my ($pixmap, $mask) = create_from_xpm Gtk::Gdk::Pixmap($window, $background, $filename);
return new Gtk::Pixmap($pixmap, $mask);
}
sub create_toolbar_window {
my ($toolbar, $button, $window, $color);
if (!defined $toolbar_window ) {
$toolbar_window = new Gtk::Window "toplevel";
$toolbar_window->signal_connect("destroy", \&destroy_window, \$toolbar_window);
$toolbar_window->signal_connect("delete_event", \&destroy_window, \$toolbar_window);
$toolbar_window->set_title("toolbar");
$toolbar_window->border_width(0);
$toolbar_window->realize;
$toolbar = make_toolbar($toolbar_window);
$toolbar_window->add($toolbar);
$toolbar->show;
}
if (!$toolbar_window->visible) {
show $toolbar_window;
} else {
destroy $toolbar_window;
}
}
sub make_toolbar {
my ($toplevel) = shift;
my ($window, $color, $toolbar, $entry);
$toplevel->realize unless $toplevel->realized;
$window = $toplevel->window;
$color = $toplevel->style->bg('normal');
$toolbar = new Gtk::Toolbar('horizontal', 'both');
$button = $toolbar->append_item ( "Horizontal", "Horizontal toolbar layout",
"Toolbar/Horizontal", new_pixmap("test.xpm",$window, $color));
$button->signal_connect('clicked', sub {$toolbar->set_orientation('horizontal')});
$button = $toolbar->append_item( "Vertical","Vertical toolbar layout",
"Toolbar/Vertical", new_pixmap("test.xpm",$window, $color));
$button->signal_connect('clicked', sub {$toolbar->set_orientation('vertical')});
$toolbar->append_space();
$button = $toolbar->append_item( "Icons","Only show toolbar icons",
"Toolbar/IconsOnly", new_pixmap("test.xpm",$window, $color));
$button->signal_connect('clicked', sub {$toolbar->set_style('icons')});
$button = $toolbar->append_item( "Text","Only show toolbar text",
"Toolbar/TextOnly", new_pixmap("test.xpm",$window, $color));
$button->signal_connect('clicked', sub {$toolbar->set_style('text')});
$button = $toolbar->append_item( "Both","Show toolbar icons and text",
"Toolbar/Both", new_pixmap("test.xpm",$window, $color));
$button->signal_connect('clicked', sub {$toolbar->set_style('both')});
$toolbar->append_space;
$entry = new Gtk::Entry;
$entry->set_text("Abracadabra");
$entry->set_max_length(3);
$entry->show;
$toolbar->append_widget($entry, "This is an unusable GtkEntry ;)", "Hey don't click me!!!");
$button = $toolbar->append_item( "Small","Use small spaces",
"Toolbar/Small",, new_pixmap("test.xpm",$window, $color));
$button->signal_connect('clicked', sub {$toolbar->set_space_size(5)});
$button = $toolbar->append_item( "Big","Use big spaces",
"Toolbar/Big", new_pixmap("test.xpm",$window, $color));
$button->signal_connect('clicked', sub {$toolbar->set_space_size(10)});
$toolbar->append_space();
$button = $toolbar->append_item( "Enable","Enable tooltips",
undef, new_pixmap("test.xpm",$window, $color));
$button->signal_connect('clicked', sub {$toolbar->set_tooltips(1)});
$button = $toolbar->append_item( "Disable","Disable tooltips",
undef, new_pixmap("test.xpm",$window, $color));
$button->signal_connect('clicked', sub {$toolbar->set_tooltips(0)});
$toolbar;
}
sub create_handlebox {
my ($toolbar, $hbox);
if ( !defined $handlebox_window ) {
$handlebox_window = new Gtk::Window "toplevel";
$handlebox_window->signal_connect("destroy", \&destroy_window, \$handlebox_window);
$handlebox_window->signal_connect("delete_event", \&destroy_window, \$handlebox_window);
$handlebox_window->set_title("Handle Box Test");
$handlebox_window->border_width(20);
$hbox = new Gtk::HandleBox;
$hbox->show;
$handlebox_window->add($hbox);
$toolbar = make_toolbar($handlebox_window);
$toolbar->show;
$hbox->add($toolbar);
}
if (!$handlebox_window->visible) {
show $handlebox_window;
} else {
destroy $handlebox_window;
}
}
$statusbar_counter = 1;
sub statusbar_push {
my($widget, $statusbar) = @_;
$statusbar->push(1, "Something ".($statusbar_counter++));
}
sub statusbar_pop {
my($widget, $statusbar) = @_;
$statusbar->pop(1);
}
sub statusbar_steal {
my($widget, $statusbar) = @_;
$statusbar->remove(1,4);
}
sub statusbar_popped {
my($statusbar, $context_id, $text) = @_;
if (!$statusbar->messages) {
$statusbar_counter = 1;
}
}
sub statusbar_contexts {
my($button, $statusbar) = @_;
foreach $string ("any context", "idle messages", "some text", "hit the mouse", "hit the mouse2") {
print "Gtk::StatusBar: context = \"$string\", context_id=", $statusbar->get_context_id($string),"\n";
}
}
sub statusbar_dump_stack {
my($button, $statusbar) = @_;
foreach $msg ($statusbar->messages) {
print "context_id: $msg{context_id}, message_id: $msg{message_id}, status_text: \"$msg{text}\"\n";
}
}
sub create_statusbar {
my($box1, $box2, $button, $separator, $statusbar);
if (not defined $statusbar_window) {
$statusbar_window = new Gtk::Window -toplevel;
$statusbar_window->signal_connect("destroy", \&Gtk::Widget::destroyed, \$statusbar_window);
$statusbar_window->set_title("statusbar");
border_width $statusbar_window 0;
$box1 = new Gtk::VBox 0, 0;
$statusbar_window->add($box1);
show $box1;
$box2 = new Gtk::VBox 0, 10;
$box2->border_width(10);
$box1->pack_start($box2, 1, 1, 0);
show $box2;
$statusbar = new Gtk::Statusbar;
$box1->pack_end($statusbar, 1, 1, 0);
show $statusbar;
$statusbar->signal_connect("text_popped", \&statusbar_popped);
$button = new Gtk::Widget "Gtk::Button",
-label => "push something",
-visible => 1,
-parent => $box2,
GtkObject::signal::clicked => [\&statusbar_push, $statusbar];
$button = new Gtk::Widget "Gtk::Button",
-label => "pop",
-visible => 1,
-parent => $box2,
-signal::clicked => [\&statusbar_pop, $statusbar];
$button = new Gtk::Widget "Gtk::Button",
-label => "steal #4",
-visible => 1,
-parent => $box2,
-signal::clicked => [\&statusbar_steal, $statusbar];
$button = new Gtk::Widget "Gtk::Button",
-label => "dump stack",
-visible => 1,
-parent => $box2,
-signal::clicked => [\&statusbar_dump_stack, $statusbar];
$button = new Gtk::Widget "Gtk::Button",
-label => "test contexts",
-visible => 1,
-parent => $box2,
-signal::clicked => [\&statusbar_contexts, $statusbar];
$separator = new Gtk::HSeparator;
$box1->pack_start($separator, 0, 1, 0);
show $separator;
$box2 = new Gtk::VBox 0, 10;
$box2->border_width(10);
$box1->pack_start($box2, 0, 1, 0);
show $box2;
$button = new Gtk::Button "close";
$button->signal_connect("clicked", sub {$statusbar_window->destroy} );
$box2->pack_start($button, 1, 1, 0);
$button->can_default(1);
$button->grab_default;
$button->show;
}
if (not $statusbar_window->visible) {
show $statusbar_window;
} else {
destroy $statusbar_window;
}
}
sub reparent_label {
my($widget, $new_parent) = @_;
my($label) = ($widget->get_user_data);
$label->reparent($new_parent);
}
sub create_reparent {
my($box1, $box2, $box3, $frame, $button, $label, $separator);
if (not defined $reparent_window) {
$reparent_window = new Gtk::Window "toplevel";
$reparent_window->signal_connect("destroy", \&destroy_window, \$reparent_window);
$reparent_window->signal_connect("delete_event", \&destroy_window, \$reparent_window);
$reparent_window->set_title("buttons");
$reparent_window->border_width(0);
$box1 = new Gtk::VBox(0, 0);
$reparent_window->add($box1);
show $box1;
$box2 = new Gtk::HBox(0, 5);
$box2->border_width(10);
$box1->pack_start($box2, 1, 1, 0);
show $box2;
$label = new Gtk::Label "Hello World";
$frame = new Gtk::Frame "Frame 1";
$box2->pack_start($frame, 1, 1, 0);
show $frame;
$box3 = new Gtk::VBox 0, 5;
$box3->border_width(5);
$frame->add($box3);
show $box3;
$button = new Gtk::Button "switch";
$button->signal_connect( clicked => \&reparent_label, $box3);
$button->set_user_data($label);
$box3->pack_start($button, 0, 1, 0);
$button->show;
$box3->pack_start($label, 0, 1, 0);
show $label;
$frame = new Gtk::Frame "Frame 2";
$box2->pack_start($frame, 1, 1, 0);
show $frame;
$box3 = new Gtk::VBox 0, 5;
$box3->border_width(5);
$frame->add($box3);
show $box3;
$button = new Gtk::Button "switch";
$button->signal_connect( clicked => \&reparent_label, $box3);
$button->set_user_data($label);
$box3->pack_start($button, 0, 1, 0);
$button->show;
$separator = new Gtk::HSeparator;
$box1->pack_start($separator, 0, 1, 0);
$separator->show;
$box2 = new Gtk::VBox (0, 10);
$box2->border_width(10);
$box1->pack_start($box2, 0, 1, 0);
$box2->show;
$button = new Gtk::Button "close";
signal_connect $button clicked => sub {destroy $reparent_window};
$box2->pack_start($button, 1, 1, 0);
$button->can_default(1);
$button->grab_default;
$button->show;
}
if (!$reparent_window->visible) {
show $reparent_window;
} else {
destroy $reparent_window;
}
}
sub create_pixmap {
my($box1,$box2,$box3,$button,$label,$separator,$pixmapwid,$pixmap,$mask,$style);
if (not defined $pixmap_window) {
$pixmap_window = new Gtk::Window "toplevel";
signal_connect $pixmap_window "destroy", \&destroy_window, \$pixmap_window;
signal_connect $pixmap_window "delete_event", \&destroy_window, \$pixmap_window;
$pixmap_window->set_title("pixmap");
$pixmap_window->border_width(0);
$pixmap_window->realize;
$box1 = new Gtk::VBox(0,0);
$pixmap_window->add($box1);
$box1->show;
$box2 = new Gtk::VBox(0, 10);
$box2->border_width(10);
$box1->pack_start($box2, 1, 1, 0);
$box2->show;
$button = new Gtk::Button;
$box2->pack_start($button, 0, 0, 0);
$button->show;
$style = $button->get_style;
($pixmap,$mask) = Gtk::Gdk::Pixmap->create_from_xpm($pixmap_window->window, $style->bg('normal'), "test.xpm");
$pixmapwid = new Gtk::Pixmap $pixmap, $mask;
$label = new Gtk::Label "Pixmap test\n";
$box3 = new Gtk::HBox(0,0);
$box3->border_width(2);
$box3->add($pixmapwid);
$box3->add($label);
$button->add($box3);
$pixmapwid->show;
$label->show;
$box3->show;
$separator = new Gtk::HSeparator;
$box1->pack_start($separator, 0, 1, 0);
$separator->show;
$box2 = new Gtk::VBox(0,10);
$box2->border_width(10);
$box1->pack_start($box2, 0, 1, 0);
$box2->show;
$button = new Gtk::Button "close";
$button->signal_connect("clicked", sub { destroy $pixmap_window } );
$box2->pack_start($button, 1, 1, 0);
$button->can_default(1);
$button->grab_default;
$button->show;
}
if (!visible $pixmap_window) {
show $pixmap_window;
} else {
destroy $pixmap_window;
}
}
#use Data::Dumper;
sub tips_query_widget_entered {
print "entered: ";
# print Dumper(\@_);
my($tips_query, $widget, $tip_text, $tip_private, $toggle) = @_;
if ($toggle->active) {
$tips_query->set(defined($tip_text) ? "There is a Tip!" : "There is no Tip!");
# Don't let GtkTipsQuery reset it's label
$tips_query->signal_emit_stop_by_name("widget_entered");
}
}
sub tips_query_widget_selected {
print "selected: ";
# print Dumper(\@_);
my($tips_query, $widget, $tip_text, $tip_private, $event, $func_data) = @_;
if ($widget) {
printf "Help \"%s\" requested for <%s>\n", defined($tip_private) ? $tip_private : "None", $widget->type_name;
}
}
sub create_tooltips {
my($box1,$box2,$box3, $button,$toggle,$frame,$tips_query,$separator,$tooltips);
if (not defined $tt_window) {
print "1\n";
$tt_window = new Gtk::Widget "Gtk::Window",
type => -toplevel,
border_width => 0,
title => "Tooltips",
allow_shrink => 1,
allow_grow => 0,
auto_shrink => 1,
width => 200,
signal::destroy => [\&destroy_tooltips, \$tt_window];
print "2\n";
$tooltips = new Gtk::Tooltips;
$tt_window->{tooltips} = $tooltips;
$box1 = new Gtk::VBox(0, 0);
$tt_window->add($box1);
$box1->show;
$box2 = new Gtk::VBox(0,10);
$box2->border_width(10);
$box1->pack_start($box2, 1, 1, 0);
$box2->show;
$button = new Gtk::ToggleButton("button1");
$box2->pack_start($button, 1, 1, 0);
$button->show;
$tooltips->set_tip($button, "This is button 1", "ContextHelp/buttons/1");
$button = new Gtk::ToggleButton("button2");
$box2->pack_start($button, 1, 1, 0);
show $button;
set_tip $tooltips $button => "This is button 2. This is also a really long tooltip which probably won't fit on a single line and will therefore need to be wrapped. Hopefully the wrapping will work correctly.", "ContextHelp/buttons/2_long";
$toggle = new Gtk::ToggleButton "Override TipsQuery Label";
$box2->pack_start($toggle, 1, 1, 0);
$toggle->show;
set_tip $tooltips $toggle => "Toggle TipsQuery view.", "Hi msw! ;)";
$box3 = new Gtk::Widget "Gtk::VBox",
homogeneous => 0,
spacing => 5,
border_width => 5,
visible => 1;
$tips_query = new Gtk::TipsQuery;
$button = new Gtk::Widget "Gtk::Button",
label => "[?]",
visible => 1,
parent => $box3,
signal::clicked => sub {$tips_query->start_query};
$box3->set_child_packing($button, 0, 0, 0, 'start');
$tooltips->set_tip($button, "Start the Tooltips Inspector", "ContextHelp/buttons/?");
Gtk::Object::set($tips_query,visible => 1,
parent => $box3,
caller => $button,
widget_entered => sub {tips_query_widget_entered @_, $toggle}, # [\&tips_query_widget_entered, $toggle],
widget_selected => \&tips_query_widget_selected);
$frame = new Gtk::Widget "Gtk::Frame",
label => "ToolTips Inspector",
label_xalign => 0.5,
border_width => 0,
visible => 1,
parent => $box2,
child => $box3;
$box2->set_child_packing($frame, 1, 1, 10, 'start');
$separator = new Gtk::HSeparator;
$box1->pack_start($separator, 0, 1, 0);
show $separator;
$box2 = new Gtk::VBox (0, 10);
$box2->border_width(10);
$box1->pack_start($box2, 0, 1, 0);
$box2->show;
$button = new Gtk::Button "close";
$button->signal_connect("clicked", sub { destroy $tt_window});
$box2->pack_start($button, 1, 1, 0);
$button->can_default(1);
$button->grab_default;
$button->show;
$tooltips->set_tip($button, "Push this button to close window", "ContextHelp/buttons/Close");
}
if (!visible $tt_window) {
show $tt_window;
} else {
$tt_window->hide;
}
}
sub create_scrolled_windows {
my($scrolled_window,$table,$button,$buffer,$i,$j);
if (not defined $s_window) {
$s_window = new Gtk::Dialog;
$s_window->signal_connect("destroy", \&destroy_window, \$s_window);
$s_window->signal_connect("delete_event", \&destroy_window, \$s_window);
$s_window->set_title("dialog");
$s_window->border_width(0);
$scrolled_window = new Gtk::ScrolledWindow(undef,undef);
$scrolled_window->border_width(10);
$scrolled_window->set_policy(-automatic, -automatic);
$s_window->vbox->pack_start($scrolled_window, 1, 1, 0);
$scrolled_window->show;
$table = new Gtk::Table(20,20,0);
$table->set_row_spacings(10);
$table->set_col_spacings(10);
$scrolled_window->add($table);
$table->show;
for ($i=0;$i<20;$i++)
{
for($j=0;$j<20;$j++)
{
$button = new Gtk::Button "button ($i,$j)\n";
$table->attach_defaults($button, $i, $i+1, $j, $j+1);
$button->show;
}
}
$button = new Gtk::Button "close";
$button->signal_connect("clicked", sub {destroy $s_window});
$button->can_default(1);
$s_window->action_area->pack_start($button, 1, 1, 0);
$button->grab_default;
$button->show;
}
if (!visible $s_window) {
show $s_window;
} else {
destroy $s_window;
}
}
sub create_entry {
my($box1,$box2,$entry,$cb, $editable,$button,$separator);
if (not defined $entry_window) {
$entry_window = new Gtk::Window -toplevel;
$entry_window->signal_connect("destroy", \&destroy_window, \$entry_window);
$entry_window->signal_connect("delete_event", \&destroy_window, \$entry_window);
$entry_window->set_title("entry");
$entry_window->border_width(0);
$box1 = new Gtk::VBox(0,0);
$entry_window->add($box1);
$box1->show;
$box2 = new Gtk::VBox(0,10);
$box2->border_width(10);
$box1->pack_start($box2, 1, 1, 0);
$box2->show;
$entry = new Gtk::Entry;
#$entry->set_usize(0, 25);
$entry->set_text("hello world");
$entry->select_region(0, length($entry->get_text));
$box2->pack_start($entry, 1, 1, 0);
$entry->show;
#$cb = new Gtk::ComboBox;
#$cb->set_text('hello world');
#$cb->select_region(0, length($cb->get_text));
#$cb->set_popdown_strings('item1', 'item2', 'and item3');
#$cb->show;
#$box2->pack_start($cb, 1, 1, 0);
$editable = new Gtk::CheckButton('Editable');
$editable->signal_connect('toggled', sub {$entry->set_editable($_[0]->active)});
$editable->set_state(1);
$editable->show;
$box2->pack_start($editable, 1, 1, 0);
$separator = new Gtk::HSeparator;
$box1->pack_start($separator, 0, 1, 0);
$separator->show;
$box2 = new Gtk::VBox(0,10);
$box2->border_width(10);
$box1->pack_start($box2, 0, 1, 0);
$box2->show;
$button = new Gtk::Button "close";
$button->signal_connect("clicked", sub {destroy $entry_window});
$box2->pack_start($button, 1, 1, 0);
$button->can_default(1);
$button->grab_default;
$button->show;
}
if (!visible $entry_window) {
show $entry_window;
} else {
destroy $entry_window;
}
}
sub list_add
{
my($widget,$list) = @_;
Gtk->print("list_add\n");
}
sub list_remove
{
my($widget, $list) = @_;
$list->remove_items($list->selection);
}
sub create_list
{
my(@list_items) =
(
"hello",
"world",
"blah",
"foo",
"bar",
"argh",
"spencer",
"is a",
"wussy",
"programmer",
);
my($box1,$box2,$scrolled_win,$list,$list_item,$button,$separator,$i);
if (not defined $list_window) {
$list_window = new Gtk::Window -toplevel;
$list_window->signal_connect("destroy", \&destroy_window, \$list_window);
$list_window->signal_connect("delete_event", \&destroy_window, \$list_window);
$list_window->set_title("list");
$list_window->border_width(0);
$box1 = new Gtk::VBox(0,0);
$list_window->add($box1);
$box1->show;
$box2 = new Gtk::VBox(0, 10);
$box2->border_width(10);
$box1->pack_start($box2, 1, 1, 0);
$box2->show;
$scrolled_win = new Gtk::ScrolledWindow(undef, undef);
$scrolled_win->set_policy(-automatic, -automatic);
$box2->pack_start($scrolled_win, 1, 1, 0);
$scrolled_win->show;
$list = new Gtk::List;
$list->set_selection_mode(-multiple);
$list->set_selection_mode(-browse);
$scrolled_win->add($list);
$list->show;
for($i=0;$i<@list_items;$i++)
{
$list_item = new Gtk::ListItem($list_items[$i]);
$list->add($list_item);
$list_item->show;
}
$button = new Gtk::Button "add";
$button->can_focus(0);
$button->signal_connect("clicked", \&list_add, $list);
$box2->pack_start($button, 0, 1, 0);
$button->show;
$button = new Gtk::Button "remove";
$button->can_focus(0);
$button->signal_connect("clicked", \&list_remove, $list);
$box2->pack_start($button, 0, 1, 0);
$button->show;
$separator = new Gtk::HSeparator;
$box1->pack_start($separator, 0, 1, 0);
$separator->show;
$box2 = new Gtk::VBox(0,10);
$box2->border_width(10);
$box1->pack_start($box2, 0, 1, 0);
$box2->show;
$button = new Gtk::Button "close";
$button->signal_connect("clicked", sub { destroy $list_window});
$box2->pack_start($button, 1, 1, 0);
$button->can_default(1);
$button->grab_default;
$button->show;
}
if (not $list_window->visible) {
show $list_window;
} else {
destroy $list_window;
}
}
# FIXME: clist signal handling..
sub create_clist {
my (@titles, @text, $clist, $box1, $box2, $button, $separator);
@titles = (
"Title 0",
"Title 1",
"Title 2",
"Title 3",
"Title 4",
"Title 5",
"Title 6"
);
if (not defined $clist_window) {
$clist_window = new Gtk::Window -toplevel;
$clist_window->signal_connect("destroy", \&destroy_window, \$clist_window);
$clist_window->signal_connect("delete_event", \&destroy_window, \$clist_window);
$clist_window->set_title("clist");
$clist_window->border_width(0);
$box1 = new Gtk::VBox(0,0);
$clist_window->add($box1);
$box1->show;
$box2 = new Gtk::HBox(0, 10);
$box2->border_width(10);
$box1->pack_start($box2, 0, 0, 0);
$box2->show;
$clist = new Gtk::CList($#titles);
$button = new Gtk::Button('Add 1,000 Rows');
$button->show;
$button->signal_connect('clicked', \&add1000_clist); # FIXME
$box2->pack_start($button, 1, 1, 0);
$button = new Gtk::Button('Add 10,000 Rows');
$button->show;
$button->signal_connect('clicked', \&add10000_clist);
$box2->pack_start($button, 1, 1, 0);
$button = new Gtk::Button('Clear list');
$button->show;
$button->signal_connect('clicked', sub {$clist->clear; $clist_rows = 0;});
$box2->pack_start($button, 1, 1, 0);
$button = new Gtk::Button('Remove Row');
$button->show;
$button->signal_connect('clicked', sub {$clist->remove_row(0); $clist_rows--;});
$box2->pack_start($button, 1, 1, 0);
$box2 = new Gtk::VBox(0, 10);
$box2->border_width(10);
$box1->pack_start($box2, 1, 1, 0);
$box2->show;
$clist->set_row_height(20);
for $i ( 1 .. scalar(@titles) - 1 ) {
$clist->set_column_width($i, 80);
}
$clist->set_selection_mode('browse');
$clist->set_policy ('automatic', 'automatic');
$clist->set_column_justification(1, 'right');
$clist->set_column_justification(2, 'left');
for $i ( 0 .. scalar(@titles) - 1 ) {
$text[$i] = "Column $i";
}
$text[1] = 'Right';
$text[2] = 'Center';
shift( @text );
# FIXME
for $i ( 0 .. 100 ) {
$clist->append("Row $i", @text);
}
$clist->border_width(5);
$box2->pack_start($clist, 1, 1, 0);
$clist->show;
$separator = new Gtk::HSeparator;
$separator->show;
$box1->pack_start($separator, 0, 1, 0);
$box2 = new Gtk::VBox(0, 10);
$box2->border_width(10);
$box1->pack_start($box2, 1, 1, 0);
$box2->show;
$button = new Gtk::Button('close');
$button->signal_connect('clicked', sub {$clist_window->destroy});
$button->can_default(1);
$button->grab_default;
$box2->pack_start($button, 1, 1, 0);
$button->show;
}
if (not $clist_window->visible) {
show $clist_window;
} else {
destroy $clist_window;
}
}
sub create_menu {
my($depth) = @_;
my($menu,$submenu,$menuitem);
if ($depth<1) {
return undef;
}
$menu = new Gtk::Menu;
$submenu = undef;
$menuitem = undef;
my($i,$j);
for($i=0,$j=1;$i<5;$i++,$j++)
{
my($buffer) = sprintf("item %2d - %d", $depth, $j);
$menuitem = new Gtk::RadioMenuItem($buffer, $menuitem);
$menu->append($menuitem);
$menuitem->set_show_toggle(1) if $depth % 2;
$menuitem->show;
if ($depth>1) {
if (not defined $submenu) {
$submenu = create_menu($depth-1);
$menuitem->set_submenu($submenu);
}
}
}
return $menu;
}
sub create_menus {
my($box1,$box2,$button,$menu,$menubar,$menuitem,$optionmenu,$separator);
if (not defined $menu_window) {
$menu_window = new Gtk::Window -toplevel;
signal_connect $menu_window destroy => \&destroy_window, \$menu_window;
signal_connect $menu_window delete_event => \&destroy_window, \$menu_window;
$menu_window->set_title("menus");
$menu_window->border_width(0);
$box1 = new Gtk::VBox(0,0);
$menu_window->add($box1);
$box1->show;
$menubar = new Gtk::MenuBar;
$box1->pack_start($menubar, 0, 1, 0);
$menubar->show;
$menu = create_menu(2);
$menuitem = new Gtk::MenuItem("test");
$menuitem->set_submenu($menu);
$menubar->append($menuitem);
show $menuitem;
$menu = create_menu(3);
$menuitem = new Gtk::MenuItem("foo");
$menuitem->set_submenu($menu);
$menubar->append($menuitem);
show $menuitem;
$menu = create_menu(4);
$menuitem = new Gtk::MenuItem("bar");
$menuitem->set_submenu($menu);
$menubar->append($menuitem);
show $menuitem;
$box2 = new Gtk::VBox(0,10);
$box2->border_width(10);
$box1->pack_start($box2, 1, 1, 0);
$box2->show;
$optionmenu = new Gtk::OptionMenu;
$optionmenu->set_menu(create_menu(1));
$optionmenu->set_history(4);
$box2->pack_start($optionmenu, 1, 1, 0);
$optionmenu->show;
$separator = new Gtk::HSeparator;
$box1->pack_start($separator, 0, 1, 0);
show $separator;
$box2 = new Gtk::VBox(0,10);
$box2->border_width(10);
$box1->pack_start($box2, 0, 1, 0);
$box2->show;
$button = new Gtk::Button "close";
signal_connect $button clicked => sub { destroy $menu_window};
$box2->pack_start($button, 1, 1, 0);
$button->can_default(1);
$button->grab_default;
$button->show;
}
if (!visible $menu_window) {
show $menu_window;
} else {
destroy $menu_window;
}
}
sub color_selection_ok {
my($widget, $dialog) = @_;
my(@color) = $dialog->colorsel->get_color;
print "color=@color\n";
$dialog->colorsel->set_color(@color);
}
sub color_selection_changed {
my($widget, $dialog) = @_;
my(@color) = $dialog->colorsel->get_color;
print "color=@color\n";
}
sub create_color_selection {
if (not defined $cs_window) {
set_install_cmap Gtk::Preview 1;
Gtk::Widget->push_visual(Gtk::Preview->get_visual);
Gtk::Widget->push_colormap(Gtk::Preview->get_cmap);
$cs_window = new Gtk::ColorSelectionDialog "color selection dialog";
$cs_window->colorsel->set_opacity(1);
$cs_window->colorsel->set_update_policy(-continuous);
$cs_window->position(-mouse);
signal_connect $cs_window destroy => \&destroy_window, \$cs_window;
$cs_window->colorsel->signal_connect("color_changed", \&color_selection_changed, $cs_window);
$cs_window->ok_button->signal_connect("clicked", \&color_selection_ok, $cs_window);
$cs_window->cancel_button->signal_connect("clicked", sub { destroy $cs_window });
pop_colormap Gtk::Widget;
pop_visual Gtk::Widget;
}
if (!visible $cs_window) {
show $cs_window;
} else {
destroy $cs_window;
}
}
sub file_selection_ok {
my($widget, $fs) = @_;
Gtk->print( $fs->get_filename . "\n");
}
sub create_file_selection {
if (not defined $fs_window) {
$fs_window = new Gtk::FileSelection "file selection dialog";
$fs_window->position(-mouse);
$fs_window->signal_connect("destroy", \&destroy_window, \$fs_window);
$fs_window->signal_connect("delete_event", \&destroy_window, \$fs_window);
$fs_window->ok_button->signal_connect("clicked", \&file_selection_ok, $fs_window);
$fs_window->cancel_button->signal_connect("clicked", sub { destroy $fs_window });
}
if (!visible $fs_window) {
show $fs_window;
} else {
destroy $fs_window;
}
}
sub create_range_controls {
my($box1,$box2,$button,$scrollbar,$scale,$separator,$adjustment);
if (not defined $range_window) {
$range_window = new Gtk::Window -toplevel;
$range_window->signal_connect("destroy", \&destroy_window, \$range_window);
$range_window->signal_connect("delete_event", \&destroy_window, \$range_window);
$range_window->set_title("range controls");
$range_window->border_width(0);
$box1 = new Gtk::VBox(0,0);
$range_window->add($box1);
$box1->show;
$box2 = new Gtk::VBox(0,10);
$box2->border_width(10);
$box1->pack_start($box2, 1, 1, 0);
$box2->show;
$adjustment = new Gtk::Adjustment(0.0, 0.0, 101.0, 0.1, 1.0, 1.0);
$scale = new Gtk::HScale($adjustment);
$scale->set_usize(150,30);
$scale->set_update_policy(-delayed);
$scale->set_digits(1);
$scale->set_draw_value(1);
$box2->pack_start($scale, 1, 1, 0);
$scale->show;
$scrollbar = new Gtk::HScrollbar $adjustment;
$scrollbar->set_update_policy(-continuous);
$box2->pack_start($scrollbar, 1, 1, 0);
$scrollbar->show;
$separator = new Gtk::HSeparator;
$box1->pack_start($separator, 0, 1, 0);
$separator->show;
$box2 = new Gtk::VBox(0,10);
$box2->border_width(10);
$box1->pack_start($box2, 0, 1, 0);
$box2->show;
$button = new Gtk::Button "close";
$button->signal_connect("clicked", sub {destroy $range_window});
$box2->pack_start($button, 1, 1, 0);
$button->can_default(1);
$button->grab_default;
show $button;
}
if (!visible $range_window) {
show $range_window;
} else {
destroy $range_window;
}
}
sub create_rulers {
my($table);
if (not defined $ruler_window) {
$ruler_window = new Gtk::Window 'toplevel';
$ruler_window->signal_connect("destroy", \&destroy_window, \$ruler_window);
$ruler_window->signal_connect("delete_event", \&destroy_window, \$ruler_window);
$ruler_window->set_title("rulers");
$ruler_window->set_usize(300, 300);
$ruler_window->set_events(["pointer_motion_mask", "pointer_motion_hint_mask"]);
$ruler_window->border_width(0);
$table = new Gtk::Table(2,2,0);
$ruler_window->add($table);
show $table;
{
my($ruler) = new Gtk::HRuler;
$ruler->set_range(5, 15, 0, 20);
$ruler_window->signal_connect("motion_notify_event",
sub { my($widget,$event)=@_; $ruler->motion_notify_event($event) });
$table->attach($ruler, 1, 2, 0, 1, [-expand, -fill], [-fill], 0, 0);
$ruler->show;
}
{
my($ruler) = new Gtk::VRuler;
$ruler->set_range(5, 15, 0, 20);
$ruler_window->signal_connect("motion_notify_event",
sub { my($widget,$event)=@_; $ruler->motion_notify_event($event) });
$table->attach($ruler, 0, 1, 1, 2, [-fill], [-expand, -fill], 0, 0);
$ruler->show;
}
}
if (!visible $ruler_window) {
show $ruler_window;
} else {
destroy $ruler_window;
}
}
sub create_text {
my($box1,$box2,$button,$separator,$table,$hscrollbar,$vscrollbar,$text);
if (not defined $text_window) {
$text_window = new Gtk::Window "toplevel";
$text_window->set_name("text window");
$text_window->signal_connect("destroy", \&destroy_window, \$text_window);
$text_window->signal_connect("delete_event", \&destroy_window, \$text_window);
$text_window->set_title("test");
$text_window->border_width(0);
$box1 = new Gtk::VBox(0,0);
$text_window->add($box1);
$box1->show;
$box2 = new Gtk::VBox(0,10);
$box2->border_width(10);
$box1->pack_start($box2,1,1,0);
$box2->show;
$table = new Gtk::Table(2,2,0);
$table->set_row_spacing(0,2);
$table->set_col_spacing(0,2);
$box2->pack_start($table,1,1,0);
$table->show;
$text = new Gtk::Text(undef,undef);
$table->attach_defaults($text, 0,1,0,1);
show $text;
$hscrollbar = new Gtk::HScrollbar($text->hadj);
$table->attach($hscrollbar, 0, 1,1,2,[-expand,-fill],[-fill],0,0);
$hscrollbar->show;
$vscrollbar = new Gtk::VScrollbar($text->vadj);
$table->attach($vscrollbar, 1, 2,0,1,[-fill],[-expand,-fill],0,0);
$vscrollbar->show;
$text->freeze;
$text->realize;
$text->insert(undef,$text->style->white,undef, "spencer blah blah blah blah blah blah blah blah blah\n");
$text->insert(undef,$text->style->white,undef, "kimball\n");
$text->insert(undef,$text->style->white,undef, "is\n");
$text->insert(undef,$text->style->white,undef, "a\n");
$text->insert(undef,$text->style->white,undef, "wuss.\n");
$text->insert(undef,$text->style->white,undef, "but\n");
$text->insert(undef,$text->style->white,undef, "josephine\n");
$text->insert(undef,$text->style->white,undef, "(his\n");
$text->insert(undef,$text->style->white,undef, "girlfriend\n");
$text->insert(undef,$text->style->white,undef, "is\n");
$text->insert(undef,$text->style->white,undef, "not).\n");
$text->insert(undef,$text->style->white,undef, "why?\n");
$text->insert(undef,$text->style->white,undef, "because\n");
$text->insert(undef,$text->style->white,undef, "spencer\n");
$text->insert(undef,$text->style->white,undef, "puked\n");
$text->insert(undef,$text->style->white,undef, "last\n");
$text->insert(undef,$text->style->white,undef, "night\n");
$text->insert(undef,$text->style->white,undef, "but\n");
$text->insert(undef,$text->style->white,undef, "josephine\n");
$text->insert(undef,$text->style->white,undef, "did\n");
$text->insert(undef,$text->style->white,undef, "not");
$text->insert(undef,$text->style->white,undef, "whereas\n");
$text->insert(undef,$text->style->white,undef, "kenneth\n");
$text->insert(undef,$text->style->white,undef, "is\n");
$text->insert(undef,$text->style->white,undef, "undoubtedly\n");
$text->insert(undef,$text->style->white,undef, "more\n");
$text->insert(undef,$text->style->white,undef, "wussful\n");
$text->insert(undef,$text->style->white,undef, "by default\nn");
$text->insert(undef,$text->style->white,undef, "not\n");
$text->insert(undef,$text->style->white,undef, "having\n");
$text->insert(undef,$text->style->white,undef, "any\n");
$text->insert(undef,$text->style->white,undef, "more\n");
$text->insert(undef,$text->style->white,undef, "information\n");
$text->insert(undef,$text->style->white,undef, "to\n");
$text->insert(undef,$text->style->white,undef, "base\n");
$text->insert(undef,$text->style->white,undef, "a\n");
$text->insert(undef,$text->style->white,undef, "comparison on\n");
$text->thaw;
$separator = new Gtk::HSeparator();
$box1->pack_start($separator,0,1,0);
$separator->show;
$box2 = new Gtk::VBox(0,10);
$box2->border_width(10);
$box1->pack_start($box2, 0, 1, 0);
$box2->show;
$button = new Gtk::Button "close";
$button->signal_connect("clicked", sub {destroy $text_window});
$box2->pack_start($button, 1, 1, 0);
$button->can_default(1);
$button->grab_default;
$button->show;
}
if (!visible $text_window) {
show $text_window;
} else {
destroy $text_window;
}
}
@book_open_xpm = (
"16 16 4 1",
" c None s None",
". c black",
"X c #808080",
"o c white",
" ",
" .. ",
" .Xo. ... ",
" .Xoo. ..oo. ",
" .Xooo.Xooo... ",
" .Xooo.oooo.X. ",
" .Xooo.Xooo.X. ",
" .Xooo.oooo.X. ",
" .Xooo.Xooo.X. ",
" .Xooo.oooo.X. ",
" .Xoo.Xoo..X. ",
" .Xo.o..ooX. ",
" .X..XXXXX. ",
" ..X....... ",
" .. ",
" ");
@book_closed_xpm = (
"16 16 6 1",
" c None s None",
". c black",
"X c red",
"o c yellow",
"O c #808080",
"# c white",
" ",
" .. ",
" ..XX. ",
" ..XXXXX. ",
" ..XXXXXXXX. ",
".ooXXXXXXXXX. ",
"..ooXXXXXXXXX. ",
".X.ooXXXXXXXXX. ",
".XX.ooXXXXXX.. ",
" .XX.ooXXX..#O ",
" .XX.oo..##OO. ",
" .XX..##OO.. ",
" .X.#OO.. ",
" ..O.. ",
" .. ",
" ");
sub page_switch {
my($widget, $page, $page_num) = @_;
my($oldpage, $pixwid);
$oldpage = $widget->cur_page;
print "page_switch: new_page=$page, old_page=$oldpage, page_num=$page_num\n";
return if ($page == $oldpage);
print "p0=$page\n";
$p1 = $page->tab_label;
print "p1=$p1\n";
@c = $p1->children;
print "Children = ",join(",", @c),"\n";
$p2 = $c[0];
print "p2=$p2\n";
$p3 = $p2->widget;
print "p3=$p3\n";
$pixwid = $p3;
#$pixwid = ($page->tab_label->children)[0]->widget;
$pixwid->set($book_open, $book_open_mask);
#$pixwid = ($page->menu_label->children)[0]->widget;
#$pixwid->set($book_open, $book_open_mask);
if ($oldpage) {
$pixwid = ($page->tab_label->children)[0]->widget;
$pixwid->set($book_closed, $book_closed_mask);
#$pixwid = ($page->menu_label->children)[0]->widget;
#$pixwid->set($book_closed, $book_closed_mask);
}
}
#static void
#page_switch (GtkWidget *widget, GtkNotebookPage *page, gint page_num)
#{
# GtkNotebookPage *oldpage;
# GtkWidget *pixwid;
#
# oldpage = GTK_NOTEBOOK (widget)->cur_page;
#
# if (page == oldpage)
# return;
#
# pixwid = ((GtkBoxChild*)(GTK_BOX (page->tab_label)->children->data))->widget;
# gtk_pixmap_set (GTK_PIXMAP (pixwid), book_open, book_open_mask);
# pixwid = ((GtkBoxChild*) (GTK_BOX (page->menu_label)->children->data))->widget;
# gtk_pixmap_set (GTK_PIXMAP (pixwid), book_open, book_open_mask);
#
# if (oldpage)
# {
# pixwid = ((GtkBoxChild*) (GTK_BOX
# (oldpage->tab_label)->children->data))->widget;
# gtk_pixmap_set (GTK_PIXMAP (pixwid), book_closed, book_closed_mask);
# pixwid = ((GtkBoxChild*) (GTK_BOX (oldpage->menu_label)->children->data))->widget;
# gtk_pixmap_set (GTK_PIXMAP (pixwid), book_closed, book_closed_mask);
# }
#}
sub create_pages {
my($notebook, $start, $end) = @_;
my($child, $label, $entry, $box, $hbox, $label_box, $menu_box, $button, $pixwid);
my($i, $buffer);
for ($i=$start; $i <= $end; $i++) {
$buffer = "Page $i";
if ((i % 4) == 3) {
$child = new Gtk::Button $buffer;
$child->border_width(10);
} elsif((i % 4) == 2) {
$child = new Gtk::Label $buffer;
} elsif((i % 4) == 1) {
$child = new Gtk::Frame $buffer;
$child->border_width(10);
$box = new Gtk::VBox 1, 0;
$box->border_width(10);
$child->add($box);
$label = new Gtk::Label $buffer;
$box->pack_start($label, 1, 1, 5);
$entry = new Gtk::Entry;
$box->pack_start($entry, 1, 1, 5);
$hbox = new Gtk::HBox 1, 0;
$box->pack_start($hbox, 1, 1, 5);
$button = new Gtk::Button "Ok";
$hbox->pack_start($button, 1, 1, 5);
$button = new Gtk::Button "Cancel";
$hbox->pack_start($button, 1, 1, 5);
} else {
$child = new Gtk::Frame $buffer;
$child->border_width(10);
$label = new Gtk::Label $buffer;
$child->add($label);
}
show_all $child;
$label_box = new Gtk::HBox 0, 0;
$pixwid = new Gtk::Pixmap $book_closed, $book_closed_mask;
$label_box->pack_start($pixwid, 0, 1, 0);
$pixwid->set_padding(3, 1);
$label = new Gtk::Label $buffer;
$label_box->pack_start($label, 0, 1, 0);
show_all $label_box;
$menu_box = new Gtk::HBox 0, 0;
$pixwid = new Gtk::Pixmap $book_closed, $book_closed_mask;
$menu_box ->pack_start($pixwid, 0, 1, 0);
$pixwid->set_padding(3,1);
$label = new Gtk::Label $buffer;
$menu_box->pack_start($label, 0, 1, 0);
show_all $menu_box;
$notebook->append_page_menu($child, $label_box, $menu_box);
}
}
sub rotate_notebook {
my($button, $notebook) = @_;
my(%rotate) = (top => "right", right => "bottom", bottom => "left", left => "top");
$notebook->set_tab_pos($rotate{$notebook->tab_pos});
}
sub standard_notebook {
my($button, $notebook) = @_;
$notebook->set_show_tabs(1);
$notebook->set_scrollable(0);
if ($notebook->children == 15) {
my($i);
for($i=0;$i<10;$i++) {
$notebook->remove_page(5);
}
}
}
sub notabs_notebook {
my($button, $notebook) = @_;
$notebook->set_show_tabs(0);
if ($notebook->children == 15) {
my($i);
for($i=0;$i<10;$i++) {
$notebook->remove_page(5);
}
}
}
sub scrollable_notebook {
my($button, $notebook) = @_;
$notebook->set_show_tabs(1);
$notebook->set_scrollable(1);
if ($notebook->children == 5) {
create_pages($notebook, 6, 15);
}
}
sub notebook_popup {
my($button, $notebook) = @_;
if ($button->active) {
$notebook->popup_enable;
} else {
$notebook->popup_disable;
}
}
sub create_notebook {
my($box1, $box2, $button, $separator, $notebook, $omenu, $menu, $submenu, $menuitem, $group, $transparent);
if (not defined $notebook_window) {
$notebook_window = new Gtk::Window -toplevel;
$notebook_window->signal_connect("destroy", \&Gtk::Widget::destroyed, \$notebook_window);
$notebook_window->set_title("notebook");
$notebook_window->border_width(0);
$box1 = new Gtk::VBox 0, 0;
$notebook_window->add($box1);
$notebook = new Gtk::Notebook;
$notebook->signal_connect("switch_page", \&page_switch);
$notebook->set_tab_pos(-top);
$box1->pack_start($notebook, 1, 1, 0);
$notebook->border_width(10);
$notebook->realize;
($book_open, $book_open_mask) = Gtk::Gdk::Pixmap->create_from_xpm_d($notebook->window, $transparent, @book_open_xpm);
($book_closed, $book_closed_mask) = Gtk::Gdk::Pixmap->create_from_xpm_d($notebook->window, $transparent, @book_closed_xpm);
create_pages($notebook, 1, 5);
$separator = new Gtk::HSeparator;
$box1->pack_start($separator, 0, 1, 10);
$box2 = new Gtk::HBox 1, 5;
$box1->pack_start($box2, 0, 1, 0);
$omenu = new Gtk::OptionMenu;
$menu = new Gtk::Menu;
$submenu = undef;
$menuitem = undef;
$menuitem = new Gtk::RadioMenuItem "Standard", $menuitem;
$menuitem->signal_connect("activate", \&standard_notebook, $notebook);
$menu->append($menuitem);
$menuitem->show;
$menuitem = new Gtk::RadioMenuItem "w/o Tabs", $menuitem;
$menuitem->signal_connect("activate", \¬abs_notebook, $notebook);
$menu->append($menuitem);
$menuitem->show;
$menuitem = new Gtk::RadioMenuItem "Scrollable", $menuitem;
$menuitem->signal_connect("activate", \&scrollable_notebook, $notebook);
$menu->append($menuitem);
$menuitem->show;
$omenu->set_menu($menu);
$box2->pack_start($omenu, 0, 0, 0);
$button = new Gtk::CheckButton "enable popup menu";
$box2->pack_start($button, 0, 0, 0);
$button->signal_connect("clicked", \¬ebook_popup, $notebook);
$box2 = new Gtk::HBox 0, 10;
$box2->border_width(10);
$box1->pack_start($box2, 0, 1, 0);
$button = new Gtk::Button "close";
$button->signal_connect("clicked", sub {$notebook_window->destroy});
$box2->pack_start($button, 1, 1, 0);
$button->can_default(1);
$button->grab_default;
$button = new Gtk::Button "next";
$button->signal_connect("clicked", sub {$notebook->next_page});
$box2->pack_start($button, 1, 1, 0);
$button = new Gtk::Button "prev";
$button->signal_connect("clicked", sub {$notebook->prev_page});
$box2->pack_start($button, 1, 1, 0);
$button = new Gtk::Button "rotate";
$button->signal_connect("clicked", \&rotate_notebook, $notebook);
$box2->pack_start($button, 1, 1, 0);
}
if (! $notebook_window->visible) {
$notebook_window->show_all;
} else {
$notebook_window->destroy;
}
}
sub create_panes {
my($frame,$hpaned,$vpaned);
if (not defined $paned_window) {
$paned_window = new Gtk::Window "toplevel";
$paned_window->signal_connect("destroy", \&destroy_window, \$paned_window);
$paned_window->signal_connect("delete_event", \&destroy_window, \$paned_window);
$paned_window->set_title("Panes");
$paned_window->border_width(0);
$vpaned = new Gtk::VPaned;
$paned_window->add($vpaned);
$vpaned->border_width(5);
$vpaned->show;
$hpaned = new Gtk::HPaned;
$vpaned->add1($hpaned);
$frame = new Gtk::Frame;
$frame->set_shadow_type("in");
$frame->set_usize(60,60);
$hpaned->add1($frame);
$frame->show;
$frame = new Gtk::Frame;
$frame->set_shadow_type("in");
$frame->set_usize(80,60);
$hpaned->add2($frame);
$frame->show;
$hpaned->show;
$frame = new Gtk::Frame;
$frame->set_shadow_type("in");
$frame->set_usize(60,80);
$vpaned->add2($frame);
$frame->show;
}
if (not visible $paned_window) {
show $paned_window;
} else {
destroy $paned_window;
}
}
sub progress_timeout {
my($progressbar) = @_;
my($new_val) = $progressbar->percentage;
if ($new_val>=1.0) {
$new_val = 0.0;
}
$new_val += 0.02;
$progressbar->update($new_val);
return 1;
}
sub destroy_progress {
my($widget, $windowref) = @_;
destroy_window($widget,$windowref);
Gtk->timeout_remove($progress_timer);
$progress_timer = 0;
1;
}
sub create_progress_bar {
my($button,$vbox,$pbar,$label);
if (not defined $p_window) {
$p_window = new Gtk::Dialog;
signal_connect $p_window "destroy" => \&destroy_progress, \$p_window;
signal_connect $p_window "delete_event" => \&destroy_progress, \$p_window;
$p_window->set_title("dialog");
$p_window->border_width(0);
$vbox = new Gtk::VBox(0,5);
$vbox->border_width(10);
$p_window->vbox->pack_start($vbox,1,1,0);
$vbox->show;
$label = new Gtk::Label "progress...";
$label->set_alignment(0.0,0.5);
$vbox->pack_start($label,0,1,0);
$label->show;
$pbar = new Gtk::ProgressBar;
$pbar->set_usize(200,20);
$vbox->pack_start($pbar,1,1,0);
$pbar->show;
$progress_timer = Gtk->timeout_add(100, \&progress_timeout, $pbar);
$button = new Gtk::Button "close";
$button->signal_connect("clicked", sub { destroy $p_window});
$button->can_default(1);
$p_window->action_area->pack_start($button,1,1,0);
$button->grab_default;
$button->show;
}
if (!$p_window->visible) {
$p_window->show;
} else {
destroy $p_window;
}
}
my($color_idle)=0;
my($color_count)=1;
sub color_idle_func {
my($preview) = @_;
my($i,$j,$k,$buf);
for($i=0;$i<32;$i++)
{
for($j=0,$k=0;$j<32;$j++)
{
vec($buf, $k+0, 8) = $i+$color_count;
vec($buf, $k+1, 8) = 0;
vec($buf, $k+2, 8) = $j+$color_count;
$k += 3;
}
$preview->draw_row($buf,0,$i,32);
}
$color_count +=1;
$preview->draw(undef);
return 1;
}
sub color_preview_destroy {
my($widget,$windowref) = @_;
if ($color_idle) {
Gtk->idle_remove($color_idle);
}
$color_idle=0;
destroy_window($window, $windowref);
}
sub create_color_preview {
my($preview,$buf,$i,$j,$k);
if (not defined $cp_window) {
Gtk::Widget->push_visual(Gtk::Preview->get_visual);
Gtk::Widget->push_colormap(Gtk::Preview->get_cmap);
$cp_window = new Gtk::Window "toplevel";
$cp_window->signal_connect("destroy", \&color_preview_destroy, \$cp_window);
$cp_window->signal_connect("delete_event", \&color_preview_destroy, \$cp_window);
$cp_window->set_title("test");
$cp_window->border_width(10);
$preview = new Gtk::Preview("color");
$preview->size(32,32);
$cp_window->add($preview);
$preview->show;
for($i=0;$i<32;$i++)
{
for($j=0,$k=0;$j<32;$j++)
{
vec($buf,$k+0,8) = $i;
vec($buf,$k+1,8) = 0;
vec($buf,$k+2,8) = $j;
$k+=3;
}
$preview->draw_row($buf, 0, $i, 32);
}
$color_idle = Gtk->idle_add(\&color_idle_func, $preview);
Gtk::Widget->pop_colormap;
Gtk::Widget->pop_visual;
}
if (!visible $cp_window) {
show $cp_window;
} else {
destroy $cp_window;
}
}
my($gray_idle)=0;
my($gray_count)=1;
sub gray_idle_func {
my($preview) = @_;
my($i,$j,$k,$buf);
for($i=0;$i<64;$i++)
{
for($j=0;$j<64;$j++)
{
vec($buf, $j, 8) = $i + $j + $gray_count;
}
$preview->draw_row($buf,0,$i,64);
}
$gray_count +=1;
$preview->draw(undef);
return 1;
}
sub gray_preview_destroy {
my($widget,$windowref) = @_;
if ($gray_idle) {
Gtk->idle_remove($gray_idle);
}
$gray_idle=0;
destroy_window($window, $windowref);
}
sub create_gray_preview {
my($preview,$buf,$i,$j,$k);
if (not defined $gp_window) {
Gtk::Widget->push_visual(Gtk::Preview->get_visual);
Gtk::Widget->push_colormap(Gtk::Preview->get_cmap);
$gp_window = new Gtk::Window "toplevel";
$gp_window->signal_connect("destroy", \&gray_preview_destroy, \$gp_window);
$gp_window->signal_connect("delete_event", \&gray_preview_destroy, \$gp_window);
$gp_window->set_title("test");
$gp_window->border_width(10);
$preview = new Gtk::Preview("grayscale");
$preview->size(64,64);
$gp_window->add($preview);
$preview->show;
for($i=0;$i<64;$i++)
{
for($j=0;$j<64;$j++)
{
vec($buf,$j,8) = $i+$j;
}
$preview->draw_row($buf, 0, $i, 64);
}
$gray_idle = Gtk->idle_add(\&gray_idle_func, $preview);
Gtk::Widget->pop_colormap;
Gtk::Widget->pop_visual;
}
if (!visible $gp_window) {
show $gp_window;
} else {
destroy $gp_window;
}
}
my($curve_count)=0;
sub create_gamma_curve {
my($curve,@vec,$i,$max);
if (not defined $curve_window) {
$curve_window = new Gtk::Window "toplevel";
$curve_window->set_title("test");
$curve_window->border_width(10);
$gamma_curve = new Gtk::GammaCurve;
$curve_window->add($gamma_curve);
$gamma_curve->show;
}
$max = 127 + ($curve_count % 2) * 128;
$gamma_curve->curve->set_range(0, $max, 0, $max);
for($i=0;$i<$max;$i++) {
$vec[$i] = (127 / sqrt($max))*sqrt($i);
}
$gamma_curve->curve->set_vector(@vec);
if (!visible $curve_window) {
show $curve_window;
} elsif ($curve_count % 4 == 3) {
destroy $curve_window;
$curve_window = undef;
}
$curve_count++;
}
sub selection_test_received
{
my ($list, $selection_data) = @_;
my $data = $selection_data->data;
if (!defined $data) {
warn ("Selection retrieval failed\n");
return;
}
if ($selection_data->type != $Gtk::Atoms{ATOM}) {
warn ("Selection TARGETS was not returned as atoms!\n");
return;
}
# Clear out any current list items
$list->clear_items (0, -1);
# Add new items to list
my @atoms = unpack("L*", $data);
my @item_list = ();
foreach (@atoms) {
my $name = Gtk::Gdk::Atom->name($_);
my $list_item = new Gtk::ListItem (defined $name ? $name : "(bad atom)");
$list_item->show;
push @item_list, $list_item;
}
$list->append_items (@item_list);
}
sub create_selection_test {
if (not defined $sel_window) {
$sel_window = new Gtk::Dialog;
$sel_window->signal_connect ("destroy", \&destroy_window, \$dialog_window);
$sel_window->signal_connect ("delete_event", \&destroy_window, \$dialog_window);
$sel_window->set_title ("Selection Test");
$sel_window->border_width (0);
# Create the list
my $vbox = new Gtk::VBox (0, 5);
$vbox->border_width (10);
$sel_window->vbox->pack_start ($vbox, 1, 1, 0);
$vbox->show;
my $label = new Gtk::Label "Get available targets for current selection";
$vbox->pack_start ($label, 0, 0, 0);
$label->show;
my $scrolled_win = new Gtk::ScrolledWindow (undef, undef);
$scrolled_win->set_policy ('automatic', 'automatic');
$vbox->pack_start ($scrolled_win, 1, 1, 0);
$scrolled_win->set_usize (100, 200);
$scrolled_win->show;
my $list = new Gtk::List;
$scrolled_win->add ($list);
$list->signal_connect ("selection_received",
\&selection_test_received);
$list->show;
# and create some buttons
my $button = new Gtk::Button "Get Targets";
$sel_window->action_area->pack_start ($button, 1, 1, 0);
$button->signal_connect ("clicked",
sub {
$list->selection_convert ($Gtk::Atoms{PRIMARY},$Gtk::Atoms{TARGETS}, 0);
});
$button->show;
$button = new Gtk::Button "Quit";
$sel_window->action_area->pack_start ($button, 1, 1, 0);
$button->signal_connect ("clicked", sub { $sel_window->destroy; } );
$button->show;
}
if (!$sel_window->visible) {
$sel_window->show;
} else {
$sel_window->destroy;
}
}
my($timeout_count)=0;
sub timeout_test {
my($label)=@_;
$label->set("count: ".++$timeout_count);
return 1;
}
sub start_timeout_test {
my($widget, $label) = @_;
if (!$timer) {
$timer = Gtk->timeout_add(100, \&timeout_test, $label);
}
}
sub stop_timeout_test {
if (defined $timer) {
Gtk->timeout_remove($timer);
$timer =0 ;
}
}
sub destroy_timeout_test {
my($widget,$windowref)=@_;
destroy_window($widget,$windowref);
stop_timeout_test(undef,undef);
}
sub create_timeout_test {
my($button,$label);
if (not defined $timeout_window) {
$timeout_window = new Gtk::Dialog;
$timeout_window->signal_connect("destroy", \&destroy_timeout_test, \$timeout_window);
$timeout_window->signal_connect("delete_event", \&destroy_timeout_test, \$timeout_window);
$timeout_window->set_title("Timeout Test");
$timeout_window->border_width(0);
$label = new Gtk::Label("count: 0");
$label->set_padding(10,10);
$timeout_window->vbox->pack_start($label,1,1,0);
$label->show;
$button = new Gtk::Button "close";
$button->signal_connect("clicked", sub { destroy $timeout_window});
$button->can_default(1);
$timeout_window->action_area->pack_start($button,1,1,0);
$button->grab_default;
$button->show;
$button = new Gtk::Button "start";
$button->signal_connect("clicked", \&start_timeout_test, $label);
$button->can_default(1);
$timeout_window->action_area->pack_start($button,1,1,0);
$button->show;
$button = new Gtk::Button "stop";
$button->signal_connect("clicked", \&stop_timeout_test);
$button->can_default(1);
$timeout_window->action_area->pack_start($button, 1,1,0);
$button->show;
}
if (!visible $timeout_window) {
show $timeout_window;
} else {
destroy $timeout_window;
}
}
sub label_toggle {
my($widget,$widgetref) = @_;
if (not defined $$widgetref) {
$$widgetref = new Gtk::Label "Dialog Test";
$$widgetref->set_padding(10, 10);
$dialog_window->vbox->pack_start($$widgetref, 1, 1, 0);
$$widgetref->show;
} else {
$$widgetref->destroy;
$$widgetref = undef;
}
}
sub create_dialog {
my($label, $button);
if (not defined $dialog_window) {
$dialog_window = new Gtk::Dialog;
$dialog_window->signal_connect("destroy", \&destroy_window, \$dialog_window);
$dialog_window->signal_connect("delete_event", \&destroy_window, \$dialog_window);
$dialog_window->set_title("dialog");
$dialog_window->border_width(0);
$button = new Gtk::Button "OK";
$button->can_default(1);
$dialog_window->action_area->pack_start($button, 1, 1, 0);
$button->grab_default;
$button->show;
$button = new Gtk::Button "Toggle";
$button->signal_connect("clicked", \&label_toggle, \$label);
$button->can_default(1);
$dialog_window->action_area->pack_start($button, 1, 1, 0);
$button->show;
$label = undef;
}
if (!$dialog_window->visible) {
$dialog_window->show;
} else {
$dialog_window->destroy;
}
}
sub idle_test {
my($label) = @_;
my($buffer) = "count: ".++$idle_count;
$label->set($buffer);
return 1;
}
sub start_idle_test {
my($widget, $label) = @_;
if (!$idle) {
$idle = Gtk->idle_add(\&idle_test, $label);
}
}
sub stop_idle_test {
if ($idle) {
Gtk->idle_remove($idle);
$idle = 0;
}
}
sub destroy_idle_test {
destroy_window(@_);
stop_idle_test(undef, undef);
}
sub create_idle_test {
my ($button, $label);
if (not defined $idle_window) {
$idle_window = new Gtk::Dialog;
signal_connect $idle_window destroy => \&destroy_idle_test, \$idle_window;
signal_connect $idle_window delete_event => \&destroy_idle_test, \$idle_window;
$idle_window->set_title("Idle Test");
$idle_window->border_width(0);
$label = new Gtk::Label "count: 0";
$label->set_padding(10, 10);
$idle_window->vbox->pack_start($label, 1, 1, 0);
$label->show;
$button = new Gtk::Button "close";
$button->signal_connect("clicked", sub { $idle_window->destroy });
$button->can_default(1);
$idle_window->action_area->pack_start($button, 1, 1, 0);
$button->grab_default();
$button->show;
$button = new Gtk::Button "start";
signal_connect $button "clicked", \&start_idle_test, $label;
$button->can_default(1);
$idle_window->action_area->pack_start($button, 1, 1, 0);
$button->show;
$button = new Gtk::Button "stop";
signal_connect $button "clicked", \&stop_idle_test;
$button->can_default(1);
$idle_window->action_area->pack_start($button, 1, 1, 0);
$button->show;
}
if (!$idle_window->visible) {
show $idle_window;
} else {
destroy $idle_window;
}
}
sub test_destroy {
my($widget, $windowref) = @_;
destroy_window($widget, $windowref);
Gtk->main_quit;
}
sub create_test {
if (not defined $test_window) {
$test_window = new Gtk::Window("toplevel");
$test_window->signal_connect("destroy" => \&test_destroy, \$test_window);
$test_window->signal_connect("delete_event" => \&test_destroy, \$test_window);
$test_window->set_title("test");
$test_window->border_width(0);
}
if (!$test_window->visible) {
$test_window->show;
Gtk->print("create_test: start\n");
Gtk->main;
Gtk->print("create_test: done\n");
} else {
$test_window->destroy;
}
}
sub do_exit {
Gtk->exit(0);
}
sub create_main_window {
my(@buttons,$window,$box1,$scw, $box2,$button,$separator, $buffer, $label);
@buttons = (
"button box", \&create_button_box,
"buttons", \&create_buttons,
"toggle buttons", \&create_toggle_buttons,
"radio buttons", \&create_radio_buttons,
"toolbar", \&create_toolbar_window,
"handlebox", \&create_handlebox,
"reparent", \&create_reparent,
"pixmap", \&create_pixmap,
"create tooltips", \&create_tooltips,
"menus", \&create_menus,
"create scrolled windows", \&create_scrolled_windows,
"drawing areas", undef,
"entry", \&create_entry,
"list", \&create_list,
"clist", \&create_clist,
"color selection", \&create_color_selection,
"file selection", \&create_file_selection,
"range controls", \&create_range_controls,
"rulers", \&create_rulers,
"shapes", \&create_shapes,
"text", \&create_text,
"notebook", \&create_notebook,
"panes", \&create_panes,
"progress bar", \&create_progress_bar,
"color preview", \&create_color_preview,
"gray preview", \&create_gray_preview,
"dialog", \&create_dialog,
"gamma curve", \&create_gamma_curve,
"test selection", \&create_selection_test,
"test timeout", \&create_timeout_test,
"spinbutton", \&create_spins,
"statusbar", \&create_statusbar,
"test idle", \&create_idle_test,
"create test", \&create_test,
);
$window = new Gtk::Window('toplevel');
$window->set_name("main window");
$window->set_uposition(20, 20);
$window->set_usize(200, 400);
$window->signal_connect("destroy" => \&Gtk::main_quit);
$window->signal_connect("delete_event" => \&Gtk::false);
$box1 = new Gtk::VBox(0, 0);
$window->add($box1);
$box1->show;
$buffer = sprintf "Gtk+ v%d.%d", Gtk->major_version, Gtk->minor_version;
if (Gtk->micro_version > 0) {
$buffer .= sprintf ".%d", Gtk->micro_version;
}
$label = new Gtk::Label $buffer;
show $label;
$box1->pack_start($label, 0, 0, 0);
$scw = new Gtk::ScrolledWindow(undef, undef);
$scw->set_policy('automatic', 'automatic');
$scw->show;
$scw->border_width(10);
$box1->pack_start($scw, 1, 1, 0);
$box2 = new Gtk::VBox(0, 0);
$box2->show;
$box2->border_width(10);
$scw->add($box2);
for($i=0;$i<@buttons;$i+=2) {
$button = new Gtk::Button($buttons[$i]);
if (defined $buttons[$i+1]) {
$button->signal_connect(clicked => $buttons[$i+1]);
} else {
$button->set_sensitive(0);
}
$box2->pack_start($button, 1, 1, 0);
show $button;
}
$separator = new Gtk::HSeparator;
$box1->pack_start($separator, 0, 1, 0);
$separator->show;
$box2 = new Gtk::VBox(0, 10);
$box2->border_width(10);
$box1->pack_start($box2, 0, 1, 0);
$box2->show();
$button = new Gtk::Button "close";
signal_connect $button "clicked", \&do_exit;
$box2->pack_start($button, 1, 1, 0);
$button->can_default(1);
$button->grab_default();
$button->show;
$window->show;
}
parse Gtk::Rc "testgtkrc";
create_main_window;
main Gtk;