Skip to content

Commit

Permalink
Merge pull request elfmz#2321 from spnethw/extend_nodetect_opt
Browse files Browse the repository at this point in the history
extend --nodetect option to cover win32/iTerm2/kovidgoyal's kitty modes
  • Loading branch information
elfmz authored Aug 26, 2024
2 parents f21f1f9 + f20c85f commit 032483b
Show file tree
Hide file tree
Showing 7 changed files with 48 additions and 21 deletions.
6 changes: 4 additions & 2 deletions WinPort/src/Backend/Backend.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,15 @@
/// Something changed in code below.
/// "WinCompat.h" changed in a way affecting code below.
/// Behavior of backend's code changed in incompatible way.
#define FAR2L_BACKEND_ABI_VERSION 0x09
#define FAR2L_BACKEND_ABI_VERSION 0x0A

#define NODETECT_NONE 0x0000
#define NODETECT_XI 0x0001
#define NODETECT_X 0x0002
#define NODETECT_F 0x0004

#define NODETECT_W 0x0008
#define NODETECT_A 0x0010
#define NODETECT_K 0x0020

class IConsoleOutputBackend
{
Expand Down
2 changes: 1 addition & 1 deletion WinPort/src/Backend/TTY/TTYBackend.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -398,7 +398,7 @@ void TTYBackend::WriterThread()
{
bool gone_background = false;
try {
TTYOutput tty_out(_stdout, _far2l_tty, _norgb);
TTYOutput tty_out(_stdout, _far2l_tty, _norgb, _nodetect);
DispatchPalette(tty_out);
// DispatchTermResized(tty_out);
while (!_exiting && !_deadio) {
Expand Down
30 changes: 22 additions & 8 deletions WinPort/src/Backend/TTY/TTYOutput.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include "FarTTY.h"
#include "WideMB.h"
#include "WinPort.h"
#include "Backend.h"
#include "../WinPortRGB.h"

#define ESC "\x1b"
Expand Down Expand Up @@ -153,9 +154,9 @@ void TTYOutput::WriteUpdatedAttributes(DWORD64 attr, bool is_space)

///////////////////////

TTYOutput::TTYOutput(int out, bool far2l_tty, bool norgb)
TTYOutput::TTYOutput(int out, bool far2l_tty, bool norgb, DWORD nodetect)
:
_out(out), _far2l_tty(far2l_tty), _norgb(norgb), _kernel_tty(false)
_out(out), _far2l_tty(far2l_tty), _norgb(norgb), _kernel_tty(false), _nodetect(nodetect)
{
const char *env = getenv("TERM");
_screen_tty = (env && strncmp(env, "screen", 6) == 0); // TERM=screen.xterm-256color
Expand All @@ -174,9 +175,16 @@ TTYOutput::TTYOutput(int out, bool far2l_tty, bool norgb)
#endif

Format(ESC "7" ESC "[?47h" ESC "[?1049h" ESC "[?2004h");
Format(ESC "[?9001h"); // win32-input-mode on
Format(ESC "[?1337h"); // iTerm2 input mode on
Format(ESC "[=15;1u"); // kovidgoyal's kitty mode on

if ((_nodetect & NODETECT_W) == 0) {
Format(ESC "[?9001h"); // win32-input-mode on
}
if ((_nodetect & NODETECT_A) == 0) {
Format(ESC "[?1337h"); // iTerm2 input mode on
}
if ((_nodetect & NODETECT_K) == 0) {
Format(ESC "[=15;1u"); // kovidgoyal's kitty mode on
}
ChangeKeypad(true);
ChangeMouse(true);

Expand Down Expand Up @@ -204,10 +212,16 @@ TTYOutput::~TTYOutput()
if (!_kernel_tty) {
Format(ESC "[0 q");
}
Format(ESC "[=0;1u" "\r"); // kovidgoyal's kitty mode off
if ((_nodetect & NODETECT_K) == 0) {
Format(ESC "[=0;1u" "\r"); // kovidgoyal's kitty mode off
}
Format(ESC "[0m" ESC "[?1049l" ESC "[?47l" ESC "8" ESC "[?2004l" "\r\n");
Format(ESC "[?9001l"); // win32-input-mode off
Format(ESC "[?1337l"); // iTerm2 input mode off
if ((_nodetect & NODETECT_W) == 0) {
Format(ESC "[?9001l"); // win32-input-mode off
}
if ((_nodetect & NODETECT_A) == 0) {
Format(ESC "[?1337l"); // iTerm2 input mode off
}
TTYBasePalette def_palette;
ChangePalette(def_palette);
Flush();
Expand Down
3 changes: 2 additions & 1 deletion WinPort/src/Backend/TTY/TTYOutput.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ class TTYOutput

int _out;
bool _far2l_tty, _norgb, _kernel_tty, _screen_tty, _wezterm;
DWORD _nodetect;
TTYBasePalette _palette;
bool _prev_attr_valid{false};
DWORD64 _prev_attr{};
Expand All @@ -54,7 +55,7 @@ class TTYOutput
void WriteUpdatedAttributes(DWORD64 new_attr, bool is_space);

public:
TTYOutput(int out, bool far2l_tty, bool norgb);
TTYOutput(int out, bool far2l_tty, bool norgb, DWORD nodetect);
~TTYOutput();

void Flush();
Expand Down
13 changes: 11 additions & 2 deletions WinPort/src/Backend/WinPortMain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,7 @@ extern "C" void WinPortHelp()
printf("FAR2L backend-specific options:\n");
printf("\t--tty - force using TTY backend only (disable GUI/TTY autodetection)\n");
printf("\t--notty - don't fallback to TTY backend if GUI backend failed\n");
printf("\t--nodetect or --nodetect=[f|][x|xi] - don't detect if TTY backend supports FAR2L or X11/Xi extensions\n");
printf("\t--nodetect or --nodetect=[x|xi][f][w][a][k] - don't detect if TTY backend supports X11/Xi input and clipboard interaction extensions and/or disable detect f=FAR2l terminal extensions, w=win32, a=apple iTerm2, k=kovidgoyal's kitty input modes\n");
printf("\t--norgb - don't use true (24-bit) colors\n");
printf("\t--mortal - terminate instead of going to background on getting SIGHUP (default if in Linux TTY)\n");
printf("\t--immortal - go to background instead of terminating on getting SIGHUP (default if not in Linux TTY)\n");
Expand Down Expand Up @@ -290,7 +290,7 @@ struct ArgOptions
norgb = true;

} else if (strcmp(a, "--nodetect") == 0) {
nodetect = NODETECT_F | NODETECT_X;
nodetect = NODETECT_F | NODETECT_X | NODETECT_A | NODETECT_K | NODETECT_W;

} else if (strstr(a, "--nodetect=") == a) {
if(strstr(a+11,"xi")) {
Expand All @@ -301,6 +301,15 @@ struct ArgOptions
if(strchr(a+11,'f')) {
nodetect |= NODETECT_F;
}
if(strchr(a+11,'a')) {
nodetect |= NODETECT_A;
}
if(strchr(a+11,'k')) {
nodetect |= NODETECT_K;
}
if(strchr(a+11,'w')) {
nodetect |= NODETECT_W;
}
} else if (strstr(a, "--clipboard=") == a) {
ext_clipboard = a + 12;

Expand Down
6 changes: 3 additions & 3 deletions man/far2l.1
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
.\" -*- mode: troff; coding: UTF-8 -*-
.\"TOPICS "Topics:"
.TH FAR2L 1 "28-04-24" "FAR2L Version 2.6.1" "Linux fork of FAR Manager v2"
.TH FAR2L 1 "31-07-24" "FAR2L Version 2.6.3" "Linux fork of FAR Manager v2"
.\"SKIP_SECTION"
.SH "NAME"
far2l \- Oldschool file manager, with built\-in terminal and other usefulness\'es.
Expand Down Expand Up @@ -78,8 +78,8 @@ don't fallback to TTY backend if GUI backend failed
\fB\-\-norgb\fP
don't use true (24-bit) colors
.TP
\fB\-\-nodetect\fP, \fB\-\-nodetect\fP=[f|][x|xi]
don't detect if TTY backend supports FAR2L or X11/Xi extensions
\fB\-\-nodetect\fP, \fB\-\-nodetect\fP=[x|xi][f][w][a][k]
don't detect if TTY backend supports X11/Xi input and clipboard interaction extensions and/or disable detect f=FAR2l terminal extensions, w=win32, a=apple iTerm2, k=kovidgoyal's kitty input modes
.TP
\fB\-\-mortal\fP
terminate instead of going to background on getting SIGHUP (default if in Linux TTY)
Expand Down
9 changes: 5 additions & 4 deletions man/ru/far2l.1
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
.\" -*- mode: troff; coding: UTF-8 -*-
.\"TOPICS "Topics:"
.TH FAR2L 1 "28-04-24" "FAR2L Version 2.6.1" "Linux fork of FAR Manager v2"
.TH FAR2L 1 "31-07-24" "FAR2L Version 2.6.3" "Linux fork of FAR Manager v2"
.\"SKIP_SECTION"
.SH "НАИМЕНОВАНИЕ"
far2l \- Файловый менеджер, работающая в текстовом режиме программа, со встроенным терминалом и другими полезными функциями.
Expand Down Expand Up @@ -77,9 +77,10 @@
\fB\-\-norgb\fP
Не использовать полноцветную (24-битную) палитру цветов
.TP
\fB\-\-nodetect\fP, \fB\-\-nodetect\fP=[f|][x|xi]
По умолчанию far2l пытается на запуске определить, не работает ли он в терминале другого far2l. В этом случае far2l автоматически использует режим TTY с расширениями терминала far2l. В случае отсутствия таких расширений терминала, far2l проверяет наличие доступа к X11 сессии или Xi расширении и использует их для улучшения возможностей интерфейса, если был собрать с опцией TTYX.
Данный ключ выключает всю перечисленную функциональность, предотвращая авто определение наличия расширений и разрешает к использованию лишь базовые возможности обычного терминала в TTY режиме.
\fB\-\-nodetect\fP, \fB\-\-nodetect\fP=[x|xi][f][w][a][k]
По умолчанию far2l пытается на запуске определить, не работает ли он в терминале другого far2l. В этом случае far2l автоматически использует режим TTY с расширениями терминала far2l (f). В случае отсутствия таких расширений терминала, far2l проверяет наличие доступа к X11 сессии или Xi расширению и использует их для улучшения возможностей интерфейса, если был собран с опцией TTYX.
Кроме того, по умолчанию используются и доступны для отключения w=win32, a=apple iTerm2, k=kovidgoyal's kitty input modes.
Данный ключ выключает всю или перечисленную функциональность, предотвращая авто определение наличия расширений и разрешает к использованию лишь базовые возможности обычного терминала в TTY режиме.
.TP
\fB\-\-mortal\fP
Завершить работу вместо перехода в фоновый режим при получении сигнала SIGHUP (по умолчанию, если в Linux TTY).
Expand Down

0 comments on commit 032483b

Please sign in to comment.