package gtk; our $text_renderer = new Gtk2::CellRendererText; our $int_renderer = new Gtk2::CellRendererText; $int_renderer->set (xalign => 1); our $state = $util::state->{gtk} || {}; # shows the properties of a glib object sub gtk_info { my ($idx, $obj) = @_; last if $seen{$idx}++; print "\n$idx\n"; for ($obj->list_properties) { printf "%-16s %-24s %-24s %s\n", $_->{name}, $_->{type}, (join ":", @{$_->{flags}}), $_->{descr}; } } # grr... more gtk+ brokenness my %get = ( hpane_position => sub { ($_[0]->children)[0]->allocation->[2] }, vpane_position => sub { ($_[0]->children)[0]->allocation->[3] }, window_size => sub { [ ($_[0]->allocation->values)[2,3] ] }, #window_pos => sub { die KGS::Listener::Debug::dumpval [ $_[0]->get_root_origin ] }, clist_column_widths => sub { $_[0]{column_widths}; }, ); my %set = ( hpane_position => sub { $_[0]->set_position($_[1]) }, vpane_position => sub { $_[0]->set_position($_[1]) }, window_size => sub { $_[0]->set_default_size(@{$_[1]}) }, #window_pos => sub { $_[0]->set_uposition(@{$_[1]}) if @{$_[1]} }, clist_column_widths => sub { my ($w, $v) = @_; $v->[$_] && $w->set_column_width($_, $v->[$_]) for 0..$#$v; $w->{column_widths} = $v; $w->signal_connect(resize_column => sub { $v->[$_[1]] = $_[2]; }); }, ); sub state { my ($widget, $class, $instance, %attr) = @_; while (my ($k, $v) = each %attr) { my ($set, $get) = $k =~ /=/ ? split /=/, $k : ($k, $k); $v = $state->{$class}{"*"}{$get} if exists $state->{$class}{"*"}{$get}; $v = $state->{$class}{$instance}{$get} if exists $state->{$class}{$instance}{$get}; $set{$get} ? $set{$get}->($widget, $v) : $widget->set($set => $v); } $widget = [$widget, $class, $instance, \%attr]; Scalar::Util::weaken $widget->[0]; @widgets = (grep $_->[0], @widgets, $widget); } sub save_state { for (@widgets) { if ($_->[0]) { my ($widget, $class, $instance, $attr) = @$_; $widget->realize if $widget->isa(Gtk2::Widget::); while (my ($k, $v) = each %$attr) { my ($set, $get) = $k =~ /=/ ? split /=/, $k : ($k, $k); $v = $get{$get} ? $get{$get}->($widget) : $widget->get($get); warn "$class : $get = $v\n";#d# $state->{$class}{"*"}{$get} = $v; $state->{$class}{$instance}{$get} = $v; } } ::status("save_state", "layout saved"); } } # make a clist unselectable sub clist_autosort { my $w = shift; my ($c, $o) = (-1); for (0..$w->columns-1) { $w->signal_connect(click_column => sub { if ($_[1] != $c) { $c = $_[1]; $o = 0; } else { $o = !$o; } $w->set_sort_column($c); $w->set_sort_type($o ? "descending" : "ascending"); $w->sort; }); } } package gtk::widget; # hacked gtk pseudo-widget sub widget { $_[0]{widget} } sub AUTOLOAD { warn $AUTOLOAD; die; } 1;