# st

Unnamed repository; edit this file 'description' to name the repository.

| Log | Files | Refs | README | LICENSE

    commit 62ab938965f2673e029ae2e2a4244788e673bd70
    parent 2b1bc8087f232a7b0ba4c7233e76be7abae25a88
    Author: Mihail Zenkov <mihail.zenkov@gmail.com>
    Date:   Tue,  1 Oct 2013 20:02:24 +0200

    Fix save/restore cursor

    st was assuming that save/restore cursor position was independent
    of the screen that was shown in each moment, but it is not true,
    because each screen has a different save/restore buffer. This
    patch fixes it.

    Diffstat:
    Mst.c | 15++++++++-------

    1 file changed, 8 insertions(+), 7 deletions(-)
    diff --git a/st.c b/st.c
    @@ -1342,13 +1342,14 @@ tfulldirt(void) {

     void
     tcursor(int mode) {
    -	static TCursor c;
    +	static TCursor c[2];
    +	bool alt = IS_SET(MODE_ALTSCREEN);

     	if(mode == CURSOR_SAVE) {
    -		c = term.c;
    +		c[alt] = term.c;
     	} else if(mode == CURSOR_LOAD) {
    -		term.c = c;
    -		tmoveto(c.x, c.y);
    +		term.c = c[alt];
    +		tmoveto(c[alt].x, c[alt].y);
     	}
     }

    @@ -1854,12 +1855,12 @@ tsetmode(bool priv, bool set, int *args, int narg) {
     			case 1034:
     				MODBIT(term.mode, set, MODE_8BIT);
     				break;
    -			case 1049: /* = 1047 and 1048 */
    -			case 47:
    +			case 1049: /* swap screen & set/restore cursor as xterm */
    +				tcursor((set) ? CURSOR_SAVE : CURSOR_LOAD);
    +			case 47: /* swap screen */
     			case 1047:
     				if (!allowaltscreen)
     					break;
    -
     				alt = IS_SET(MODE_ALTSCREEN);
     				if(alt) {
     					tclearregion(0, 0, term.col-1,