]> git.99rst.org Git - irssi-scripts.irssi.org.git/commitdiff
Track leading keys we overwrite
authormartin f. krafft <redacted>
Wed, 3 Nov 2021 01:00:06 +0000 (02:00 +0100)
committermartin f. krafft <redacted>
Wed, 3 Nov 2021 01:00:06 +0000 (02:00 +0100)
Signed-off-by: martin f. krafft <redacted>
scripts/chankeys.pl

index 7e48e096833ea6e8f7b8df65f0175c94f3a388f8..8273462491bb1703347b4442b2ac6cee7c4d1b47 100644 (file)
@@ -114,6 +114,7 @@ sig_setup_changed();
 my $changed_since_last_save = 0;
 
 my %itemmap;
+my %leadkeys;
 
 ### HELPERS ####################################################################
 
@@ -212,24 +213,19 @@ sub check_for_existing_bind {
 
 ## KEYMAP HANDLERS #############################################################
 
+# TODO check_for_existing_bind really hurts and causes a bit of lag in Irssi
+# that it doesn't recover from for a few seconds after load. Better to read
+# /bind output once into a hash and use that.
+
 sub create_keymapping {
        my ($keys, $name, $chatnet) = @_;
        my $cmd = 'command ' . get_go_command($name, $chatnet);
-       my $bind = check_for_existing_bind($keys);
-       if ($bind and $bind ne $cmd) {
-               if ($overwrite_binds) {
-                       warning("Overwriting bind from $keys to '$bind' as instructed");
-               }
-               else {
-                       error("Key $keys already bound to '$bind', please remove first.", 1);
-                       return 0;
-               }
-       }
-       if ($keys =~ /(meta-.)-.+/) {
+       if ($keys =~ /(meta-.)-.+/ and !exists($leadkeys{$1})) {
                if (my $bind = check_for_existing_bind($1)) {
                        if ($clear_composites) {
                                warning("Removing bind from $1 to '$bind' as instructed");
                                Irssi::command("^bind -delete $1");
+                               $leadkeys{$1} = $bind;
                        }
                        else {
                                error("$1 is bound to '$bind' and cannot be used in composite keybinding", 1);
@@ -241,9 +237,25 @@ sub create_keymapping {
        return 1;
 }
 
+sub check_create_keymapping {
+       my ($keys, $name, $chatnet) = @_;
+       my $cmd = 'command ' . get_go_command($name, $chatnet);
+       my $bind = check_for_existing_bind($keys);
+       if ($bind and $bind ne $cmd) {
+               if ($overwrite_binds) {
+                       warning("Overwriting bind from $keys to '$bind' as instructed");
+               }
+               else {
+                       error("Key $keys already bound to '$bind', please remove first.", 1);
+                       return 0;
+               }
+       }
+       return create_keymapping($keys, $name, $chatnet);
+}
+
 sub add_keymapping {
        my ($keys, $name, $chatnet) = @_;
-       if (create_keymapping($keys, $name, $chatnet)) {
+       if (check_create_keymapping($keys, $name, $chatnet)) {
                $name = channet_pair_to_string($name, $chatnet);
                debug("Key binding created: $keys → $name", 1);
                return 1;
@@ -283,6 +295,7 @@ sub remove_existing_binds {
        while (my ($item, $keys) = each %itemmap) {
                Irssi::command("^bind -delete $keys");
        }
+       %leadkeys = ();
 }
 
 ### SAVING AND LOADING #########################################################
@@ -414,16 +427,15 @@ sub chankey_load {
        remove_existing_binds();
        load_mappings($map_file);
        my $cnt = scalar(keys %itemmap);
-       info("Loaded $cnt mappings from $map_file");
-
        foreach my $channel (Irssi::channels, Irssi::queries) {
                my $name = $channel->{name};
                my $chatnet = $channel->{server}->{chatnet};
                if (my @keymap = get_keymap_for_channet_pair($name, $chatnet)) {
-                       add_keymapping(@keymap);
+                       create_keymapping(@keymap);
                }
        }
        $changed_since_last_save = 0;
+       info("Loaded $cnt mappings from $map_file");
 }
 
 sub chankey_save {
git clone https://git.99rst.org/PROJECT