- my $msg;
-
- while ($msg = shift @{$conn->{inqueue}}){
- $msg =~ s/\%([2-9A-F][0-9A-F])/chr(hex($1))/eg;
- $msg =~ s/[\x00-\x08\x0a-\x1f\x80-\x9f]/./g; # immutable CSI sequence + control characters
- &{$conn->{rproc}}($conn, $msg, $!);
- $! = 0;
+
+ if ($conn && $conn->{msg} =~ /\cJ/) {
+ my @lines = $conn->{msg} =~ /([^\cM\cJ]*)\cM?\cJ/g;
+ if ($conn->{msg} =~ /\cJ$/) {
+ delete $conn->{msg};
+ } else {
+ $conn->{msg} =~ s/([^\cM\cJ]*)\cM?\cJ//g;
+ }
+ for (@lines) {
+ if (defined $_) {
+ s/\%([0-9A-F][0-9A-F])/chr(hex($1))/eg;
+ s/[\x00-\x08\x0a-\x19\x1b-\x1f\x80-\x9f]/./g; # immutable CSI sequence + control characters
+ } else {
+ $_ = '';
+ }
+ &{$conn->{rproc}}($conn, $_) if exists $conn->{rproc};
+ }