I'm experimenting with implementing a different approach to alt-screen, similar to the effect of termcapinfo ti@:te@, except when using an app which actually requests alt mode.
The specific goal I have is to have a working mouse-wheel in both shells and pagers in terminals which change mouse-wheel behavior depending on the terminal mode. Currently, scrolling in a shell pages through the history list or similar, while scrolling in a pager or editor generally works properly. Setting ti@:te@ gets usable behavior out of shells, but loses the ability to scroll in less, vim, and so forth. The idea is to restore somewhat sane mouse-wheel scrolling by setting screen to not use alternate mode until a running app actually requests it. Attached is the (not working) patch I've come up with so far. AddCStr(...) appears to be modifying a global, which then gets flushed out to the tty on Flush(), but repeating the calls (D_TI/TE) in Enter/LeaveAltScreen doesn't seem to do anything (after removing the D_TI/TE's in the initialization); I'm not certain if that's because it's the wrong call, or just the wrong place for the call. It's possible that Enter/LeaveAltScreen isn't the right place to put those calls, although that seems unlikely, as they're called almost directly from where an app's ti/te would be handled. --Carey Underwood
--- screen-4.0.3.orig/display.c +++ screen-4.0.3/display.c @@ -722,6 +722,6 @@ int adapt; ASSERT(display); ASSERT(D_tcinited); D_top = D_bot = -1; - AddCStr(D_TI); AddCStr(D_IS); /* Check for toggle */ if (D_IM && strcmp(D_IM, D_EI)) @@ -788,6 +788,6 @@ FinitTerm() GotoPos(0, D_height - 1); AddChar('\r'); AddChar('\n'); - AddCStr(D_TE); } Flush(); } @@ -3302,6 +3302,6 @@ NukePending() D_obufp = D_obuf; D_obuffree += len; D_top = D_bot = -1; - AddCStr(D_TI); AddCStr(D_IS); /* Turn off all attributes. (Tim MacKenzie) */ if (D_ME) diff --git a/resize.c b/resize.c index 6b5cef4..a0e39ab 100644 --- a/resize.c +++ b/resize.c @@ -1084,6 +1084,9 @@ void EnterAltScreen(p) struct win *p; { + AddCStr(D_TI); + Flush(); + int ox = p->w_x, oy = p->w_y; FreeAltScreen(p); SwapAltScreen(p); @@ -1096,6 +1099,9 @@ void LeaveAltScreen(p) struct win *p; { + AddCStr(D_TE); + Flush(); + if (!p->w_alt_mlines) return; SwapAltScreen(p);