질문은 제목 그대로 입니다.
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 명령의 결과가 써집니다.
수정합니다. echo 명령을 system()으로 실행해도 파일에는 이스케이프 시퀀스만 써지네요.
대략적인 힌트는
대략적인 힌트는 다음과 같습니다.
커서의 위치가 커맨드에 찍히는군요.
힌트 감사드립니다.
응용을 하면 해답을 얻을 수 있을 것 같습니다. ^^
노력만이 살길이다.
노력만이 살길이다.
댓글 달기