Prevent gnu screen from resizing display size

Solution 1:

Try adding this (from /etc/screenrc) to your ~/.screenrc:

# Change the xterm initialization string from is2=\E[!p\E[?3;4l\E[4l\E>
# (This fixes the "Aborted because of window size change" konsole symptoms found
#  in bug #134198)
termcapinfo xterm* 'is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l'

You may need to change the "xterm" to match your $TERM.

The termcapinfo line sets is (ininitialization string) for any terminal with a name starting with "xterm" to a sequence of escape codes. \E represents escape and the codes are as follows:

\E[r       - set scrolling region to default (full size of window)
\E[m       - reset all resources (keyboard) to their initial values
\E[2J      - Erase in Display (ED). 2 -> Erase All.
\E[H       - set cursor position to default (1, 1)
\E[?7h     - DEC Private Mode Set. 7 -> Wraparound Mode
\E[?1;4;6l - DEC Private Mode Reset. 1 -> Normal Cursor Keys; 4  -> Jump (Fast) Scroll; 6 -> Normal Cursor Mode

The replaced line had these codes:

\E[!p      - Soft terminal reset
\E[?3;4l   - DEC Private Mode Reset. 3 -> 80 Column Mode; 4 -> Jump (Fast) Scroll
\E[4l      - Reset Mode. 4 -> Replace Mode
\E>        - Normal keypad

(source: XTerm Control Sequences)

Solution 2:

The explanation (and suggested equivalents) for the xterm initialization string aren't completely accurate.

Starting with the string from xterm's terminal description:

is2=\E[!p\E[?3;4l\E[4l\E>

we have

CSI ! p   Soft terminal reset (DECSTR).
CSI ? Pm l
      DEC Private Mode Reset (DECRST).
...
        Ps = 3  -> 80 Column Mode (DECCOLM).
        Ps = 4  -> Jump (Fast) Scroll (DECSCLM).
CSI Pm l  Reset Mode (RM).
...
        Ps = 4  -> Replace Mode (IRM).
ESC >     Normal Keypad (DECKPNM).

But DECSTR resets several things not found in the replacement:

  • the cursor shape and appearance
  • character sets
  • other keyboard modes related to application/normal modes (DECCKM, KAM, DECKPAM)
  • wraparound (and reverse wraparound)
  • origin mode

Also, it doesn't clear the screen.

The reason for using DECSTR (since 1997) is to keep termcap sizes small enough to fit in termcap's 1024-byte limit.

The setting for screen is from the Debian package; the bug report mentioned in the comment is Debian #134198 — screen: has some sort of odd emulation problem most noticable with irssi and konsole, from 2002. screen does not recognize that sequence, and incidentally, KDE konsole does not implement that sequence, as seen in KDE #134892, while at the same time its developers state in KDE #145977 that they prefer to not use a different TERM value than xterm. Since some users might want a terminal description which does match konsole's capabilities, that's in ncurses as konsole, e.g.,

is2=\E[m\E[?7h\E[4l\E>\E7\E[r\E[?1;3;4;6l\E8

versus

is2=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l

Removing the spurious clear-screen, the relevant portion of screen's customization is

is2=\E[r\E[m\E[?7h\E[?1;4;6l

so what was left out was (aside from DECCOLM) \E[4l.

The \E7 and \E8 in the initialization string save/restore the cursor position when adjusting the scrolling margins. Just like the insert-mode, some users would notice the absence of the feature.

The point of the customization is to suppress the DECCOLM (80/132 column) switching, and working from screen's cut-down and rather old customization might not work as well as adapting from a terminal description written for the terminal.

Further reading:

  • XTerm Control Sequences
  • VT220 Programmer Reference Manual