File: GtkInput.pm

package info (click to toggle)
snap 0.08-2
  • links: PTS
  • area: main
  • in suites: woody
  • size: 440 kB
  • ctags: 473
  • sloc: perl: 7,033; makefile: 117; sh: 70
file content (71 lines) | stat: -rw-r--r-- 1,563 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package GtkInput;

@ISA = qw(Gtk::Entry);

sub new
{
  my $class = shift;
  my $self = Gtk::Entry->new();

  bless $self, $class;

  $self->signal_connect("activate", \&enter_handler);
  $self->signal_connect_after("key_press_event", \&key_handler);
  $self->{"history"} = [""];
  $self->{"oldhist"} = [""];
  $self->{"histpos"} = 0;

  return $self;
}

sub key_handler
{
  my $self = shift;
  my $e = shift;
  my $key = $e->{'keyval'};
  my $history = $self->{"history"};
  my $oldhist = $self->{"oldhist"};
  my $histpos = $self->{"histpos"};

  if ($key == $Gtk::Keysyms{'Up'})
    {
      $history->[$self->{"histpos"}] = $self->get_text();
      $self->{"histpos"}-- if ($self->{"histpos"} > 0);
      $self->set_text($history->[$self->{"histpos"}]);
    }
  elsif ($key == $Gtk::Keysyms{'Down'})
    {
      $history->[$self->{"histpos"}] = $self->get_text();
      $self->{"histpos"}++ if ($self->{"histpos"} < $#$history);
      $self->set_text($history->[$self->{"histpos"}]);
    }

  $self->signal_emit_stop_by_name("key_press_event");

  return 1;
}

sub enter_handler
{
  my $self = shift;
  my $history = $self->{"history"};
  my $oldhist = $self->{"oldhist"};
  my $histpos = $self->{"histpos"};
  my $histlen = $#$history;

  $history->[$histpos] = $oldhist->[$histpos];
  $history->[$histlen] = $self->get_text();
  $oldhist->[$histlen] = $self->get_text();
  $history->[$histlen + 1] = "";
  $self->{"histpos"} = $#$history;

  $self->set_text("");
}

sub getline
{
  my $history = $_[0]->{"history"};
  return $history->[$#$history - 1];
}

1;