summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmadeusz Sławiński <amade@asmblr.net>2019-09-07 17:58:50 +0200
committerAmadeusz Sławiński <amade@asmblr.net>2019-09-07 17:58:50 +0200
commitabc87e48796c9184ffc478089119e316270c7022 (patch)
tree92516835bff282878fbea4b6945f939b84469a8b
parent0328c657b5b91d439a3bd421a8e83a76b7171831 (diff)
downloadscreen-abc87e48796c9184ffc478089119e316270c7022.tar.gz
Fix broken mouse after ncurses 6.1
ncurses 6.1 changed kmous capability from "\e[M" to "\e[<". It seems to be done to signal that terminal supports sgr mouse mode. screen assumed that if kmous is set to "\e[M" it is on xterm compatible terminal anyway, so just dynamically detect which one is used and override relevant kmapdef. InitKeytab() is moved, so kmapdef[] can be overriden before initialization, as InitTermcap() needs to run first, as far as I can tell this should have no consequences. Signed-off-by: Amadeusz Sławiński <amade@asmblr.net>
-rw-r--r--src/screen.c2
-rw-r--r--src/termcap.c6
2 files changed, 6 insertions, 2 deletions
diff --git a/src/screen.c b/src/screen.c
index 9ed23ce..bf2adfd 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -988,7 +988,6 @@ int main(int argc, char **argv)
sprintf(SocketPath + strlen(SocketPath), "/%s", socknamebuf);
ServerSocket = MakeServerSocket();
- InitKeytab();
#ifdef SYSTEM_SCREENRC
(void)StartRc(SYSTEM_SCREENRC, 0);
#endif
@@ -1011,6 +1010,7 @@ int main(int argc, char **argv)
#endif
} else
MakeTermcap(1);
+ InitKeytab();
MakeNewEnv();
xsignal(SIGHUP, SigHup);
xsignal(SIGINT, FinitHandler);
diff --git a/src/termcap.c b/src/termcap.c
index 95b8ff4..0253cf1 100644
--- a/src/termcap.c
+++ b/src/termcap.c
@@ -36,6 +36,7 @@
#include "screen.h"
#include "encoding.h"
+#include "kmapdef.h"
#include "misc.h"
#include "process.h"
#include "resize.h"
@@ -174,8 +175,11 @@ int InitTermcap(int width, int height)
/* ISO2022 */
if ((D_EA && strstr(D_EA, "\033(B")) || (D_AS && strstr(D_AS, "\033(0")))
D_CG0 = 1;
- if (strstr(D_termname, "xterm") || strstr(D_termname, "rxvt") || (D_CKM && strstr(D_CKM, "\033[M")))
+ if (strstr(D_termname, "xterm") || strstr(D_termname, "rxvt") || (D_CKM &&
+ (strstr(D_CKM, "\033[M") || strstr(D_CKM, "\033[<")))) {
D_CXT = 1;
+ kmapdef[0] = SaveStr(D_CKM);
+ }
/* "be" seems to be standard for xterms... */
if (D_CXT)
D_BE = 1;