diff options
| -rw-r--r-- | prompt_info/prompt_info.pl | 7 | ||||
| -rw-r--r-- | scrolled-reminder/scrolled_reminder.pl | 165 | 
2 files changed, 144 insertions, 28 deletions
| diff --git a/prompt_info/prompt_info.pl b/prompt_info/prompt_info.pl index ad5321b..aa52a81 100644 --- a/prompt_info/prompt_info.pl +++ b/prompt_info/prompt_info.pl @@ -33,8 +33,10 @@ $VERSION = "1.0.1";     changed         => "24/7/2010"    ); +#sub DEBUG () { 1 }  sub DEBUG () { 0 } +  my $prompt_additional_content = '';  Irssi::expando_create('prompt_additional', \&expando_prompt, {}); @@ -52,9 +54,10 @@ sub redraw_prompts {  sub handle_change_prompt_sig {      my ($text) = @_; -    print "Got prompt change sig with: $text" if DEBUG; -      my $expanded_text = Irssi::parse_special($text); + +    print "Got prompt change sig with: $text -> $expanded_text" if DEBUG; +      my $changed = ($expanded_text ne $prompt_additional_content);      $prompt_additional_content = $expanded_text; diff --git a/scrolled-reminder/scrolled_reminder.pl b/scrolled-reminder/scrolled_reminder.pl index d768220..32b3bb5 100644 --- a/scrolled-reminder/scrolled_reminder.pl +++ b/scrolled-reminder/scrolled_reminder.pl @@ -7,21 +7,66 @@ use Irssi::Irc;  use Data::Dumper; +# Everyone is permitted to copy and distribute verbatim or modified +# copies of this license document, and changing it is allowed as long +# as the name is changed. + +#             DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE +#    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +#   0. You just DO WHAT THE FUCK YOU WANT TO. + +sub DEBUG () { 1 } +  our $VERSION = '0.01'; -our %IRSSI = ( -              authors     => 'Tom Feist', -              contact     => 'shabble@cowu.be', -              name        => 'scrolled-reminder', -              description => 'Requires confirmation to messages sent' -              . 'when the current window is scrolled up', - -              license     => 'WTFPL; http://sam.zoy.org/wtfpl/', -              url         => 'http://metavore.org/', +our %IRSSI = +  ( +   authors     => 'Tom Feist', +   contact     => 'shabble+irssi@metavore.org', +   name        => 'scrolled-reminder', +   description => 'Requires confirmation to messages sent' +                  . 'when the current window is scrolled up', + +   license     => 'WTFPL; http://sam.zoy.org/wtfpl/', +   url         => 'http://github.com/shabble/shab-irssi-scripts/' +                  . 'tree/master/scrolled-reminder/',               ); +# check we have prompt_info loaded. + +sub script_is_loaded { +    my $name = shift; +    print "Checking if $name is loaded" if DEBUG; +    no strict 'refs'; +    my $retval = defined %{ "Irssi::Script::${name}::" }; +    use strict 'refs'; + +    return $retval; +} + +unless (script_is_loaded('prompt_info')) { +    die "This script requires 'prompt_info' in order to work. " +      . "Please load it and try again"; +} else { +    scroll_reminder_init(); +} + +my $permit_pending; +my $pending_input = {}; +my $active; + +sub scroll_reminder_init { +    $permit_pending = 0; +    $active = 0; +    # we need to be first so we can intercept stuff. +    Irssi::signal_add_first('send text', \&handle_send_text); +    Irssi::signal_add_first('gui key pressed', \&handle_keypress); +} + +################################################################  sub handle_send_text { -    my ($text, $server_tag, $win_item) = @_; +    my ($text, $server, $win_item) = @_;      unless ($win_item) {          # not all windows have window-items (eg: status window)          return; @@ -30,38 +75,106 @@ sub handle_send_text {      my $window = $win_item->window;      my $view = $window->view; +    # are we scrolled up? + +    # TODO: would be better to check if we're scrolled /and/ there's activity? +    # eg: --more-- is showing? +      if ($view->{bottom} != 1) { -        # we're scrolled up. -        unless (require_confirmation($window)) { + +        # have we got a pending line that we've already allowed? +        if ($permit_pending) { + +            $pending_input = {}; +            $permit_pending = 0; + +            # no idea why we need to explicitly continue this time. +            Irssi::signal_continue(@_); + +        } else { + +            # otherwise, store it and start the confirmation process. +            $pending_input = { +                              text     => $text, +                              server   => $server, +                              win_item => $win_item +                             }; +              Irssi::signal_stop; +            require_confirmation();          }      }  }  sub handle_keypress {      my ($key) = @_; -    Irssi::print("key pressed: " . $key); + +    # would be nicer to add/remove ourselves appropriately, but +    # for odd reasons, that doesn't work. +    return unless $active; +      if ($key == 3) { # Ctrl-c + +        # notify, and have it disappear after a second. +        set_prompt('aborted!'); +        Irssi::timeout_add_once(1000, sub { set_prompt('') }, undef); + +        # stick the input line back into the input buffer for them. +        my $text = $pending_input->{text}; +        Irssi::gui_input_set($text); +        Irssi::gui_input_set_pos(length $text); + +        # clean up the pending stuff +        $permit_pending = 0; +        $pending_input = {}; + +        # don't draw the C-c. +        Irssi::signal_stop(); + + +        # and, we don't need the handler to trigger anymore +        $active = 0; +      } elsif ($key == 11) { # Ctrl-k + +        # allow this to be reraised and pass through +        # the send text handler. +        $permit_pending = 1; + +        # stop the C-k from behaving normally. +        Irssi::signal_stop(); + +        # and re-raise the signal with stored params. +        Irssi::signal_emit('send text', +                           $pending_input->{text}, +                           $pending_input->{server}, +                           $pending_input->{win_item}); + +        # stop the key handler from doing stuff +        $active = 0; +        # and restore the prompt +        set_prompt(''); +      } else { -    } -    Irssi::signal_remove('gui key pressed', \&handle_keypress); +        #TODO: What should the behaviour of other keys be when we're +        # awaiting a response? + +        Irssi::signal_stop(); +        return; +    }  }  sub require_confirmation { -    my ($window) = @_; -    Irssi::signal_add_first('gui key pressed', \&handle_keypress); - -    $window->print("You are scrolled up Really send?"); -    write_to_prompt($window, 'Press Ctrl-K to confirm, Ctrl-C to cancel '); +    # enable the key handler +    $active = 1; +    set_prompt('Scrolled Warning: C-k to confirm, C-c to cancel');  } -sub write_to_prompt { -    my ($window, $msg) = @_; -    #$window->command("insert_text $msg"); +sub set_prompt { +    my $msg = shift; +    # add a leading space unless we're trying to clear it entirely. +    $msg = ' ' . $msg if length $msg; +    Irssi::signal_emit('change prompt', $msg);  } - -Irssi::signal_add_first('send text', 'handle_send_text'); - | 
