질문은 제목 그대로 입니다.
C에서 터미널 상의 마우스 커서가 아닌 텍스트 커서의 위치를 알 수 있는 방법이 있는지요?
떠오른 것이 curses 또는 ncurses 라이브러리 인데요.
curses 또는 ncurses 라이브러리가 아닌 다른 방법을 찾고 있습니다.
다른 함수나 라이브러리 또는 소스를 알고 계신분은 힌트좀 주십시요.
^^
echo -e "\033[6n"
응답은 \033[x;yR 의 형식으로 돌아오며 x,y 가 커서의 좌표값입니다.
vt100 이상을 지원하는 터미널 에뮬레이터가 필요하며, 리눅스 fb콘솔도 vt100(?) 이므로 이를 지원합니다.
저도 그 CSI 시퀀스를 알고 있기는 합니다만, 프로그래밍 상에서 그 응답을 어떻게 가져오죠? 터미널 상에서 실행을 시키면 앞부분은 잘리고,
[root@server ]# ;1R
식으로출력이 됩니다. 응답을 프로그래밍상에서 가져오는 방법도 아시면 귀뜸을 부탁드립니다. 모르는 것이 많아 어떻게 처리해야할지를 모르겠습니다.
노력만이 살길이다.
echo -e "\033[6n" 명령의 출력을 파일로 리디렉션한 후 그 파일을 읽어들이면 어떨까요?
명령의 출력을 파일로 리디렉션 하면, 파일에 위의 시퀀스만 출력이 됩니다.
다시말해서 echo -e "/033[6n" > xy 파일로 리디렉션 하면 /033[6n이 출력이 됩니다.
fprintf(stdout, "\033\133\066\156\n"); 로 실행파일을 만들어 ./a.out > xy 리디렉션 하면 ^[[6n 이 출력이 됩니다.
터미널로 부터의 응답인 ^[[pn;psR 출력이 되지는 않는 것 같습니다.
그리고 리디렉션을 C언어 내에서 사용할 수 있는건가요?
(제가 위 댓글을 이제야 봤습니다.)
제 의도는 C 프로그램에서 system()을 사용해 echo 명령을 실행하면 어떨까 하는 것이었습니다. 다음 프로그램을 한 번 실행해 보세요. where라는 파일에 echo 명령의 결과가 써집니다.
#include <stdlib.h> int main(void) { system("echo -e \"\\033[6n\" >where"); return 0; }
수정합니다. echo 명령을 system()으로 실행해도 파일에는 이스케이프 시퀀스만 써지네요.
대략적인 힌트는 다음과 같습니다.
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { int fd = fileno(stdin); char c; /* gotoxy(current_x + 20, current_y - 3) */ printf("%c[3A%c[20C", 27, 27); /* query cursor position */ printf("%c[6n", 27); fflush(stdout); /* trick, drain first char (0x27) of terminal input */ read(fd, &c, 1); /* you can see "[x;yR" */ return 0; }
힌트 감사드립니다.
응용을 하면 해답을 얻을 수 있을 것 같습니다. ^^
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
echo -e "\033[6n"응답은
echo -e "\033[6n"
응답은 \033[x;yR 의 형식으로 돌아오며 x,y 가 커서의 좌표값입니다.
vt100 이상을 지원하는 터미널 에뮬레이터가 필요하며,
리눅스 fb콘솔도 vt100(?) 이므로 이를 지원합니다.
답변 감사드립니다.
저도 그 CSI 시퀀스를 알고 있기는 합니다만, 프로그래밍 상에서 그 응답을 어떻게 가져오죠? 터미널 상에서 실행을 시키면 앞부분은 잘리고,
[root@server ]# ;1R
식으로출력이 됩니다. 응답을 프로그래밍상에서 가져오는 방법도 아시면 귀뜸을 부탁드립니다. 모르는 것이 많아 어떻게 처리해야할지를 모르겠습니다.
노력만이 살길이다.
노력만이 살길이다.
파일에 쓰고 읽어들이면...
echo -e "\033[6n" 명령의 출력을 파일로 리디렉션한 후 그 파일을 읽어들이면 어떨까요?
명령의 출력을 파일로 리디렉션 하면,
명령의 출력을 파일로 리디렉션 하면, 파일에 위의 시퀀스만 출력이 됩니다.
다시말해서 echo -e "/033[6n" > xy 파일로 리디렉션 하면 /033[6n이 출력이 됩니다.
fprintf(stdout, "\033\133\066\156\n"); 로 실행파일을 만들어 ./a.out > xy 리디렉션 하면 ^[[6n 이 출력이 됩니다.
터미널로 부터의 응답인 ^[[pn;psR 출력이 되지는 않는 것 같습니다.
그리고 리디렉션을 C언어 내에서 사용할 수 있는건가요?
노력만이 살길이다.
노력만이 살길이다.
system()을 사용해 보세요.
(제가 위 댓글을 이제야 봤습니다.)
제 의도는 C 프로그램에서 system()을 사용해 echo 명령을 실행하면 어떨까 하는 것이었습니다. 다음 프로그램을 한 번 실행해 보세요. where라는 파일에 echo 명령의 결과가 써집니다.
#include <stdlib.h> int main(void) { system("echo -e \"\\033[6n\" >where"); return 0; }수정합니다. echo 명령을 system()으로 실행해도 파일에는 이스케이프 시퀀스만 써지네요.
대략적인 힌트는
대략적인 힌트는 다음과 같습니다.
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { int fd = fileno(stdin); char c; /* gotoxy(current_x + 20, current_y - 3) */ printf("%c[3A%c[20C", 27, 27); /* query cursor position */ printf("%c[6n", 27); fflush(stdout); /* trick, drain first char (0x27) of terminal input */ read(fd, &c, 1); /* you can see "[x;yR" */ return 0; }커서의 위치가 커맨드에 찍히는군요.
힌트 감사드립니다.
응용을 하면 해답을 얻을 수 있을 것 같습니다. ^^
노력만이 살길이다.
노력만이 살길이다.
댓글 달기