http://qs321.pair.com?node_id=1171519

rir has asked for the wisdom of the Perl Monks concerning the following question:

The C documents for GTK3 indicate that a EntryBuffer's text value needs to be altered by appropriate GTK3 functions. Does this apply in Perl?

I feel like I am missing something.

I am looking for a widget that allows something like:

my $sv = "Some value"; my $gtktextentryish = Gtk3::somewidget->new( \$sv); # map gui stuff, etc. $window->show_all(); $sv = "Another scalar value!";
And now $gtktextentryish is unfazed that its data value has changed underneath it.

rir

Replies are listed 'Best First'.
Re: Referring to Gtk3::EntryBuffer data
by Anonymous Monk on Sep 10, 2016 at 23:02 UTC

      Nonny, sorry I was unclear.

      You are right so far as I know (whether Gtk2 or Gtk3). I am just starting with Gtk3.

      I would like to find an editable text entry widget, which can be passed a scalar ref at creation and can have the referenced value be changed by actions invoked by code outside the widget. Which is to say, outside changing when the user's cursor is in the widget need not be defined.

      It occurs to me that I may be asking a lot of code that is wrapping C/C++.

      rir

        :) see perltie, and usage idease see Tk::Trace/Tie::Watch

        So you write something like this , tested in gtk2

        #!/usr/bin/perl -- use strict; use warnings; #~ use Gtk3 '-init'; #~ my $windowclass = 'Gtk3::Window'; #~ my $entryclass = 'Gtk3::Entry'; #~ my $quitclass = 'Gtk3'; #~ my $box = Gtk3::Box->new('vertical', 5); #~ my $bufferclass = 'Gtk3::EntryBuffer'; use Gtk2 '-init'; my $windowclass = 'Gtk2::Window'; my $entryclass = 'Gtk2::Entry'; my $quitclass = 'Gtk2'; my $bufferclass = 'Gtk2::EntryBuffer'; my $box = Gtk2::VBox->new; ## my $bufferentry = $bufferclass->new; my $uff = $bufferclass->new; tie my $foo, 'TraceBuffer', $uff, "foo text"; my $bar = TraceBuffer->new( $bufferentry, "bar text" ); $foo = "sha nana "; $bar->STORE("tra la la "); my $window = $windowclass->new(); $window->set_title('EntryBuffer'); $window->signal_connect('destroy' => sub {$quitclass->main_quit}); $window->add($box); my $ent = $entryclass->new(); $ent->set_buffer($uff); $box->add($ent); my $entry = $entryclass->new(); $entry->set_buffer($bufferentry); $box->add($entry); $window->show_all(); $quitclass->main(); BEGIN { package TraceBuffer; sub new { my $pkg = shift; $pkg->TIESCALAR(@_); } sub TIESCALAR { my $class = shift; my $buffer = shift || die "USELESS WITHOUT BUFFER!\n"; my $text = shift || ''; $buffer->set_text( $text ); return bless [ $buffer, $text ] => $class; } sub FETCH { #~ return $_[0]->[0]->get_text(); return $_[0]->[1]; } sub STORE { $_[0]->[1] = $_[1]; $_[0]->[0]->set_text( $_[1] ); } sub DESTROY { undef @{$_[0]}; } $INC{'TraceBuffer.pm'} = __FILE__; 1;; }

        Its only half of it, if user updates the entry, the "tracebuffer" doesn't know about it ... you'd have to involve https://metacpan.org/pod/Glib::Object::Subclass for that portion