Fix another crash at KEXINIT time, ahem.

This is the same code I previously fixed for failing to check NULL
pointers coming back from ssh_pkt_getstring if the server's KEXINIT
ended early, leading to an embarrassing segfault in place of a fatal
error message. But I've now also had it pointed out to me that the
fatal error message passes the string as %s, which is inappropriate
because (being read straight out of the middle of an SSH packet) it
isn't necessarily zero-terminated!

This is still just an embarrassing segfault in place of a fatal error
message, and not exploitable as far as I can see, because the string
is passed to a dupprintf, which will either read off the end of
allocated address space and segfault non-exploitably, or else it will
find a NUL after all and carefully allocate enough space to format an
error message containing all of the previous junk. But still, how
embarrassing to have messed up the same code _twice_.


git-svn-id: svn://svn.tartarus.org/sgt@10211 cda61777-01e9-0310-a592-d414129be87e
Repair GTK timer handling

The bug eventually makes PuTTY take 100% of a CPU.

1) This patch stops run_timers returning with a next timer interval
of zero ms.

2) The code called from run_timers is likely to create a new timer
when it runs before timer_trigger adds the next timer that run_timers
returns. This would mean that two timers get scheduled with gtk.

3) Alter terminal.c to turn off the text blink timer when we don't
have focus and turn it on, synched with the cursor when we get it back.

NB: Windows calls 'term_set_focus' a lot .. Yes you still have focus
Revert almost duplicate change.

This isn't quite the same, but it should be almost as good.
Pango font performance update

This change improves the speed of the best case pango font
processing.  It removes multiple calls to pango_layout_set_text and
pango_layout_get_pixel_extents that were used to check that every prefix
string of a given draw_text is actually the correct size.

Instead the function now checks just once before painting the text
that the size of the whole region is correct. If it's not correct it
falls back to painting one character at a time immediatly rather than
optimistically trying lots of substrings; this normally improves the
draw time of complex screens and proportional fonts too.

If there are compensating layout issues within the string they won't
cause problems because terminal.c already has code to redraw any row
of text that was drawn as one operation if it's split.
Windows font drawing performance upgrade.

Two issues here.

Firstly. Windows is getting slower at drawing characters to the screen,
so much so that sometimes it overruns the time limits and eats into
the time that we should be using to process characters received from
the host. So add a change to make do_paint not accept a redraw request
until there has been 'enough' time since the last one.

In addition the WM_PAINT message has been being used to directly draw
characters to the screen. Because of issues with some machines this can
cause screen corruption (white lines).

Note: not all the corruption is cured by this patch as it stands; white
marks can still occur in the border area and the scroll bar.

With Windows 7 this has become mostly irrelevent as, usually, windows
will now 'save-unders' for the transparency.

Tested on W95 OSR2, W2k SP4, WXP SP3, WXP64 SP2, Win7 SP1.
Minimise, maximise, etc are as annoying as other terminal resize operations.

Note they ARE resize operations so treat them as such and disable them
if requested.
Add XTerm extensions for VTTEST and reverse BS

Codes to enable and disable the DECCOLM 132/80 column switching DEC
control and XTerm's reverse BS hack to 'pass' the vttest option 1.

This means that PuTTY uses the same modal hack as XTerm to pass the vttest
'end of line' test, (Actually the reverse part) and Thomas can stop lying
about PuTTY in the xterm FAQ.  The second part prevents the default xterm
'init' sequence from terminfo clearing the screen.

In addition most applications realise that terminal resizes are requests
and that you likely won't get what you ask for.  Programs (like vttest)
that use the sequence DECCOLM aren't so smart so the change is immediatly
enacted.
Adjust DEC-MCS character set.

U+2426 "␦" is defined as the substitution character in DEC-MCS

Note: dec_mcs is a 94 character set so 0xA0 and 0xFF are not defined in
a different way when it's mapped into GR.
Optimisation to delete windows code on unix

Changed is_dbcs_leadbyte to a macro on unix so the compiler knows
it's always zero.
This is a fix for the direct to font DBCS cursor.

If we're sitting on a DBCS lead byte it extends the cursor to two
characters rather then just one.
Windows codepages do not have C1 controls
Fix the scoasc translation on unix

There should be a set of VGA ROM characters in the first 32 positions
of the character set to match with Linux, scoansi and Windows PuTTY.
Function x11font_draw_text uses the UCS2 character set
SCO Ansi Keyboard correction
Correct Window title character set on windows.

The characters are converted to unicode before use.
Changes to the internal usage of unicode areas for character set conversion.

The unix port is using the U+D800 range for the same jobs as the windows
port uses the U+F100 range. Set it to use the same range of characters.

Note: unlike windows this is ONLY used if the font doesn't have a
recognised character set so this change doesn't make the DTF range
compatible with the Linux console.

In a similar issue terminal.c is using the CSET_* codes for two different
tasks; the screen map characters and the line characters. Making the
distinction explicit should clarify things.

We now have a 32bit space for the characters so the hack of placing
the CSET_* code overlapping the surrogates is no longer required. We
can instead place them past the end of the valid unicode characters
(ie U+180000). Note I've chosen 0x180000 rather than 0x200000 to preserve
the compression of the scrollback.

Unfortunatly I can't do the same for the DTF range as it wouldn't work
for the UTF-16 platform. I can, however, move it to the "Low Surrogates"
area where it shouldn't interfere with the normal use of surrogates.

Added Linux DTF range (U+F000 -> CP437) explicitly into the emulation
because we no longer have the "happy coincidence" of the OEMCP being
mapped to U+F000. This means it could now be disabled for pure utf8 mode.
Clean up VT52 leftovers from the 256 colours patch

Some references to the unused flag vt52_bold are removed.
Also remove the messing with the 'blink_is_real' flag that isn't
needed with the 256 colour implementation as we have more than
eight stable background colours.
Add wcwidth override sequence

ECMA-48: 8.3.90 PEC - PRESENTATION EXPAND OR CONTRACT

CSI Pn SP Z used for character width override.
	Only applies to characters that are not in US-ASCII.
	Does not work with DBCS fonts, only unicode conversion.

    Pn=0   Default
    Pn=1   Force Wide for unicode chars.
    Pn=2   Force narrow for unicode chars.
    Pn=5   Force one Wide unicode char.
    Pn=6   Force one narrow unicode char.

This allows the host to do a DBCS to UTF-8 conversion and keep the
anachronistic alphabetic artifacts of the original encoding.
Add Ansi REP sequence and SCO CSI = g

ECMA-48: 8.3.103 REP - REPEAT
    Notation: (Pn)
    Representation: CSI Pn 06/02
    Parameter default value: Pn = 1

CSI = Pn g
    Display the number Pn as the character from the selected font.
    For 0..255 this is does as the CP437 VGA ROM set, for 256 and
    above it is a unicode character number.

This change requires the literal character print routine to be called
from more than one location so that code has been extracted into a
distinct function. Pragmatically this is a long overdue change to help
reduce the size of the huge term_out function.
Fix width override bug.

Width override should ignore combining characters.