aboutsummaryrefslogtreecommitdiffstats
path: root/scrolled-reminder
diff options
context:
space:
mode:
authorTom Feist <shabble@cowu.be>2010-07-24 19:19:38 +0000
committerTom Feist <shabble@cowu.be>2010-07-24 19:19:38 +0000
commit63051bc06ebb3e3479a0011ac27d8c833da87c4d (patch)
tree7d969958a12b784016dd6341297041ebe5c611d4 /scrolled-reminder
parentmoved testing stuff to a signle dir (diff)
downloadirssi-scripts-63051bc06ebb3e3479a0011ac27d8c833da87c4d.tar.gz
irssi-scripts-63051bc06ebb3e3479a0011ac27d8c833da87c4d.zip
working? verion of scrolled reminder
Diffstat (limited to 'scrolled-reminder')
-rw-r--r--scrolled-reminder/scrolled_reminder.pl165
1 files changed, 139 insertions, 26 deletions
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');
-