깜박임은 특히 커서의 경우 컴퓨팅 초기부터 일반적인 관행이었습니다.
그러나 터미널 에뮬레이터 나 쉘은 strace
이를 확인하는 시스템 호출을 실행할 때 어떤 종류의 타이머(pass )나 간격 타이머(pass ) 도 등록 하지 않습니다 . 동시에 이러한 프로그램은 스핀 잠금을 사용하여 일정 시간 동안 기다릴 수 없습니다.konsole
bash
timer_settime()
setitimer()
실제 터미널은 해당 컨트롤러가 깜박임 탈출 제어 시퀀스를 이해하기 때문에 이를 수행할 수 있습니다. 그러나 그래픽 모니터는 분명히 이러한 일을 할 수 없습니다.
그렇다면 이러한 프로그램은 특히 그래픽 환경에서 어떻게 텍스트를 깜박이게 만들까요? X가 아닌 그래픽 터미널에서도 텍스트가 깜박일 수 있습니다(를 누르는 것과 동일 Ctrl+Alt+F2
).
깜박이는 터미널 커서는 어떻게 발명되었나요?이 질문은 이것이 왜 발명되었는지, 그리고 실제 터미널이 이를 구현하는 방법에 대한 기술적 세부 사항을 보여줍니다.
답변1
귀하의 질문은 깜박이는 커서와 깜박이는 텍스트라는 두 가지 개념을 혼동합니다.
GNOME 터미널(VTE)은 오랫동안 깜박이는 커서를 지원해 왔으며 5년 전에 깜박이는 텍스트 지원을 추가했습니다. 깜박이는 텍스트 지원에 대한 세 가지 흥미로운 세부 사항을 공유하겠습니다. 마음에 드셨으면 좋겠습니다 :)
이것은 귀하의 질문에 대한 답변이 아니며(실제 답변은 별도로 게시했습니다), 단지 옆으로 덧붙인 댓글일 뿐입니다.
흥미로운 점은 텍스트가 정확히 언제 깜박이는가입니다.
텍스트 깜박임 속도는 커서 깜박임 속도와 연관되어야 합니까, 아니면 다른 속성이어야 합니까? 우리는 같은 속도로 움직이며 이 옵션을 탈취합니다. IIRC는 konsole
두 가지 모두에 대해 서로 다른 주파수를 사용합니다.
깜박이는 텍스트가 있는 여러 터미널이 동시에 깜박여야 합니까? 우리의 결론은 그렇습니다. 그렇지 않으면 매우 짜증날 수 있다는 것입니다(마치 깜박이는 텍스트가 애초에 짜증나지 않았던 것처럼). 텍스트가 켜지거나 꺼지는 시기는 시스템 시계를 기준으로 합니다.
깜박이는 커서는 키를 누를 때마다 항상 완전히 "켜진" 상태로 다시 시작됩니다. 우리는 이 행동을 유지해야 할까요? 결론은 '네, 이 행동을 유지하세요' 입니다.
커서와 텍스트가 동시에 깜박여야 합니까? 동시에 모든 것을 가질 수는 없으며 가능한 기준 중 하나가 완화되어야 한다는 점을 쉽게 알 수 있기를 바랍니다. 아니요, 둘은 동기화되지 않습니다.
이것이 이러한 질문에 답할 수 있는 유일한 방법은 아니지만, 우리가 가장 합리적이라고 생각한 방법입니다.
\e[5m
\e[25m
깜박임 텍스트 지원을 구현하려면 해당 또는 이스케이프 시퀀스가 표시되는 시기는 중요하지 않습니다 . 스크롤 막대는 기본이 아닌 위치로 설정되어 스크롤백 내용을 표시할 수 있습니다. 분명히 각 셀에 대해 셀 플래시 여부를 포함하여 모든 색상 및 장식 속성을 추적해야 합니다. 중요한 것은 그러한 셀이 현재 뷰포트 내에 존재하는지 여부입니다.
VTE에서는 전체 화면을 다시 그려야 하는 경우도 있지만 화면의 일부(콘텐츠가 변경되는 부분)만 다시 그려지는 경우도 있습니다.
기준 중 하나는 뷰포트에 깜박이는 텍스트가 없는 경우(대부분의 경우) 아무것도 하지 않고(또는 더 나쁜 경우: 동일한 콘텐츠를 다시 그리지 않고) 약 0.6초마다 터미널을 깨워서는 안 된다는 것입니다. 이는 에너지 절약, 노트북 배터리 수명 연장 등을 위해 중요합니다.
나는 오랫동안 주기적인 타이머에 대해 생각해왔습니다. 깜박이는 텍스트가 그려질 때마다 깜박이는 상태가 바뀔 때마다 시작되는 주기적인 타이머가 시작됩니다. 그런 다음 화면을 다시 그립니다(가급적이면 관련 부분만).
하지만 이 주기적 타이머를 언제 중지해야 하는지 어떻게 알 수 있나요? 오랫동안 나는 명확하고 간단한 답을 찾지 못했습니다.
그런 다음 페니가 떨어졌습니다. 주기적인 타이머에 대해서는 생각하지 맙시다. 현재 화면에 깜박이는 텍스트의 상태를 변경해야 하므로 일회성 타이머만 설치합니다. 뷰포트에 여전히 깜박이는 텍스트가 있는 경우 다시 그리기는 다음 일회성 타이머를 설치하고 콘텐츠가 더 이상 깜박이지 않을 때까지 계속됩니다. 이 견고하고 매우 간단한 솔루션의 비용은 아무도 신경 쓰지 않는 마지막 추가 불필요한 다시 그리기입니다( poll()
깜박이는 텍스트가 있는 상태에서 이러한 호출을 디버그하거나 추적하고 연구하지 않는 한).
많은 사람들은 앱에서 깜박이는 텍스트를 보고 싶어합니다. 많은 사람들이 이 기능을 싫어하고 깜박이는 텍스트를 보고 싶어하지 않습니다. 아마도 집중된 터미널에서만 커서가 깜박이는 것과 유사하게 많은 사람들은 집중된 터미널에서만 깜박이는 텍스트를 보고 싶어할 것입니다.
그러나 GNOME 터미널은 네 번째 특이한 옵션도 제공합니다. 즉, 초점이 맞지 않는 창에서만 텍스트를 깜박이는 것입니다. 제가 생각해낸 사고 과정은 다음과 같습니다. 눈을 깜박이는 것은 정말 예상치 못한 충격적인 것에 주의를 끌기 위해 사용되는 것 같습니다. 집중하고 있는 동안 이는 불필요하며 주의가 산만해질 수 있습니다(예를 들어 경고를 받은 문제를 해결하려고 하는 경우). 그러나 주변 시력은 정적 경고를 한 번만 인쇄하는 것보다 깜박임과 같은 변화에 더 민감합니다.
우리는 소프트웨어에서 분석을 수행하지 않으며 (분노를 유발할 수 있는) 통계를 보내지 않기 때문에 이 네 가지 옵션의 인기에 대한 정보가 없습니다. 특히 누군가가 이 "주의를 기울이지 않을 때만" 옵션이 유용하다고 생각하는 경우에는 더욱 그렇습니다. .
답변2
알아냈는데 strace
, gnome-terminal-server
이것이 그놈 터미널의 실제 프로세스입니다.
유휴 상태일 때 커서만 깜박이면 이는 poll(..., 598)
커널 호출이나 유사한 커널 호출에 상주합니다. 즉, poll()
시간 제한은 0.6초보다 약간 짧습니다. (그놈 전체 깜박임 기간의 기본값은 1.2초이므로 각 켜짐 또는 꺼짐 상태는 0.6초입니다. 이는 커서 영역을 다시 그리는 등 지난번에 수행한 실제 작업량만큼 단축됩니다.)
이는 poll()
주어진 파일 설명자 중 하나에 활동이 있거나 타이머가 만료되거나 신호가 도착할 때까지 기다립니다.
이는 poll()
"수동으로" 구현되지 않으며 오히려 VTE(GNOME 터미널 및 기타 터미널 뒤의 터미널 에뮬레이션 위젯)가 GLib의 메인 루프에 이벤트 핸들러를 등록하고 GLib가 실제 기본 구현을 담당합니다. 어떤 방법을 사용할지 결정하는 것은 GLib에 달려 있습니다. 예를 들어 select
, 또는 를 사용할 수 epoll
있거나 timerfd
아마도 다른 옵션이 있을 수 있습니다.
나는 그것을 할 때 거의 동일한 호출을 보고 있으며 poll()
대부분의 다른 터미널 에뮬레이터도 비슷한 일을 하는 것으로 의심됩니다.strace
konsole
터미널(Bash 등)에서 실행되는 프로그램은 플래시에 필요한 적절한 이스케이프 코드만 출력할 뿐 실제 플래시 수행에는 참여하지 않습니다. 이스케이프 문자를 인쇄한 프로그램은 오래전에 사라졌지만 깜박이는 텍스트는 여전히 터미널에 표시됩니다.