Решено: Информация о терминале
Модератор: Модераторы разделов
-
Liksys
- Сообщения: 2910
Решено: Информация о терминале
В общем, как получить информацию о параметрах терминала? Нужен по большей части только параметр с максимальной длиной строки.
Делать getenv("COLUMNS") не предлагать, этот вариант не всегда работает, а только когда переменная експортирована. Очевидно, есть какой-то более правильный способ. Программа запускается в консоли (виртуале, xterm, konsole, etc.), необходимо, чтобы она подстраивалась под длину строки.
Как осуществляется? В поиск, пожалуйста, не посылать, кроме terminfo и termcap ниче не нашел, да и это наверно не совсем то.
Если можно, подкиньте пример.
Делать getenv("COLUMNS") не предлагать, этот вариант не всегда работает, а только когда переменная експортирована. Очевидно, есть какой-то более правильный способ. Программа запускается в консоли (виртуале, xterm, konsole, etc.), необходимо, чтобы она подстраивалась под длину строки.
Как осуществляется? В поиск, пожалуйста, не посылать, кроме terminfo и termcap ниче не нашел, да и это наверно не совсем то.
Если можно, подкиньте пример.
-
pktfag
- Сообщения: 142
- ОС: Arch Linux
Re: Решено: Информация о терминале
Вроде максимальную длину строки в терминале пытается определить ./configure. Попробуй посмотри в каких-нибудь исходниках.
-
Liksys
- Сообщения: 2910
Re: Решено: Информация о терминале
ага потом размер консоли изменил и все поехало
-
Uncle_Theodore
- Сообщения: 3339
- ОС: Slackware 12.2, ArchLinux 64
Re: Решено: Информация о терминале
Есть такая команда resize(1x), она умеет менять значения переменных TERMCAP и termnl на параметры xterm'а, в котором она вызвана. Я думаю, имеет смысл посмотреть на ее исходники.
Чисто формально, как я себе это представляю, надо запросить X-сервер по поводу параметров окошка, в котором мы вызваны.
Чисто формально, как я себе это представляю, надо запросить X-сервер по поводу параметров окошка, в котором мы вызваны.
-
Liksys
- Сообщения: 2910
Re: Решено: Информация о терминале
Про resize - посморю, спасибо.
X-сервер может быть не запущен.
Мне это вообще надо для нового движка в словарь. Там перенос по словам осуществляется через определение максимальной длины строки.
X-сервер может быть не запущен.
Мне это вообще надо для нового движка в словарь. Там перенос по словам осуществляется через определение максимальной длины строки.
-
Uncle_Theodore
- Сообщения: 3339
- ОС: Slackware 12.2, ArchLinux 64
Re: Решено: Информация о терминале
Если X не запущен, надо запрашивать размер консоли. Смотри тут
http://docwiki.gumstix.org/Tips_and_tricks..._serial_console
http://docwiki.gumstix.org/Tips_and_tricks..._serial_console
-
Liksys
- Сообщения: 2910
Re: Решено: Информация о терминале
А вот такое решение насколько правильное? (ессно, проверки на ошибки будут поставлены)
Только меня смущают утечки памяти даже в такой простой программе 
Код: Выделить всё
#include <stdio.h>
#include <unistd.h>
#include <curses.h>
#include <term.h>
int main(void)
{
tgetent(0, NULL);
printf("%d\n", tgetnum("co"));
return 0;
}-
Liksys
- Сообщения: 2910
Re: Решено: Информация о терминале
Uncle_Theodore писал(а): ↑04.06.2007 01:03Если X не запущен, надо запрашивать размер консоли. Смотри тут
http://docwiki.gumstix.org/Tips_and_tricks..._serial_console
Попробовал писать/читать (типа как resize) в /dev/tty1, который у меня текущая консоль. Он в нее гадит
-
halturin
- Сообщения: 167
- ОС: Linux
Re: Решено: Информация о терминале
Liksys писал(а): ↑04.06.2007 01:11А вот такое решение насколько правильное? (ессно, проверки на ошибки будут поставлены)
Только меня смущают утечки памяти даже в такой простой программеКод: Выделить всё
#include <stdio.h> #include <unistd.h> #include <curses.h> #include <term.h> int main(void) { tgetent(0, NULL); printf("%d\n", tgetnum("co")); return 0; }
а где здесь утечка? в упор не вижу.
-
d_n_k
- Сообщения: 636
- ОС: Gentoo GNU/Linux
Re: Решено: Информация о терминале
трудно найти черную кошку в темной комнате, особенно если её там нет
все сказанное есть имхо...
-
Liksys
- Сообщения: 2910
Re: Решено: Информация о терминале
Ну если бы не было, то не писал бы 
[liksys@max ~]$ valgrind ./test
==3143== Memcheck, a memory error detector.
==3143== Copyright © 2002-2006, and GNU GPL'd, by Julian Seward et al.
==3143== Using LibVEX rev 1658, a library for dynamic binary translation.
==3143== Copyright © 2004-2006, and GNU GPL'd, by OpenWorks LLP.
==3143== Using valgrind-3.2.1, a dynamic binary instrumentation framework.
==3143== Copyright © 2000-2006, and GNU GPL'd, by Julian Seward et al.
==3143== For more details, rerun with: -v
==3143==
141
==3143==
==3143== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 14 from 1)
==3143== malloc/free: in use at exit: 3,688 bytes in 12 blocks.
==3143== malloc/free: 20 allocs, 8 frees, 5,509 bytes allocated.
==3143== For counts of detected errors, rerun with: -v
==3143== searching for pointers to 12 not-freed blocks.
==3143== checked 96,416 bytes.
==3143==
==3143== LEAK SUMMARY:
==3143== definitely lost: 0 bytes in 0 blocks.
==3143== possibly lost: 0 bytes in 0 blocks.
==3143== still reachable: 3,688 bytes in 12 blocks.
==3143== suppressed: 0 bytes in 0 blocks.
==3143== Reachable blocks (those to which a pointer was found) are not shown.
==3143== To see them, rerun with: --show-reachable=yes
-
sarutobi
- Сообщения: 676
- Статус: Добрость и скромнота
- ОС: Debian 5, FreeBSD 6.2/8.0
Re: Решено: Информация о терминале
Liksys,
valgrind --leak-check=full ./test не спасет отца русской демократии?
valgrind --leak-check=full ./test не спасет отца русской демократии?
Fire and water, earth and sky - mistery surrounds us, legends never die!
-
Liksys
- Сообщения: 2910
Re: Решено: Информация о терминале
Код:
[liksys@max ~]$ valgrind --leak-check=full --show-reachable=yes ./test
==5827== Memcheck, a memory error detector.
==5827== Copyright © 2002-2006, and GNU GPL'd, by Julian Seward et al.
==5827== Using LibVEX rev 1658, a library for dynamic binary translation.
==5827== Copyright © 2004-2006, and GNU GPL'd, by OpenWorks LLP.
==5827== Using valgrind-3.2.1, a dynamic binary instrumentation framework.
==5827== Copyright © 2000-2006, and GNU GPL'd, by Julian Seward et al.
==5827== For more details, rerun with: -v
==5827==
141
==5827==
==5827== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 14 from 1)
==5827== malloc/free: in use at exit: 3,688 bytes in 12 blocks.
==5827== malloc/free: 20 allocs, 8 frees, 5,509 bytes allocated.
==5827== For counts of detected errors, rerun with: -v
==5827== searching for pointers to 12 not-freed blocks.
==5827== checked 96,416 bytes.
==5827==
==5827== 14 bytes in 2 blocks are still reachable in loss record 1 of 8
==5827== at 0x4005400: malloc (vg_replace_malloc.c:149)
==5827== by 0x487BF01F: strdup (in /lib/libc-2.5.so)
==5827== by 0x48194F21: _nc_setupterm (in /usr/lib/libncurses.so.5.5)
==5827== by 0x48195837: tgetent (in /usr/lib/libncurses.so.5.5)
==5827== by 0x80484A8: main (in /home/liksys/test)
==5827==
==5827==
==5827== 25 bytes in 1 blocks are still reachable in loss record 2 of 8
==5827== at 0x4005400: malloc (vg_replace_malloc.c:149)
==5827== by 0x48192EBE: _nc_home_terminfo (in /usr/lib/libncurses.so.5.5)
==5827== by 0x4819A539: _nc_next_db (in /usr/lib/libncurses.so.5.5)
==5827== by 0x4819B021: _nc_read_entry (in /usr/lib/libncurses.so.5.5)
==5827== by 0x481950CC: _nc_setupterm (in /usr/lib/libncurses.so.5.5)
==5827== by 0x48195837: tgetent (in /usr/lib/libncurses.so.5.5)
==5827== by 0x80484A8: main (in /home/liksys/test)
==5827==
==5827==
==5827== 48 bytes in 1 blocks are still reachable in loss record 3 of 8
==5827== at 0x400473F: calloc (vg_replace_malloc.c:279)
==5827== by 0x4819AD13: _nc_read_file_entry (in /usr/lib/libncurses.so.5.5)
==5827== by 0x4819B094: _nc_read_entry (in /usr/lib/libncurses.so.5.5)
==5827== by 0x481950CC: _nc_setupterm (in /usr/lib/libncurses.so.5.5)
==5827== by 0x48195837: tgetent (in /usr/lib/libncurses.so.5.5)
==5827== by 0x80484A8: main (in /home/liksys/test)
==5827==
==5827==
==5827== 83 bytes in 1 blocks are still reachable in loss record 4 of 8
==5827== at 0x4005400: malloc (vg_replace_malloc.c:149)
==5827== by 0x48192CEC: _nc_doalloc (in /usr/lib/libncurses.so.5.5)
==5827== by 0x4819631E: _nc_tparm_analyze (in /usr/lib/libncurses.so.5.5)
==5827== by 0x48196481: tparm (in /usr/lib/libncurses.so.5.5)
==5827== by 0x4819B616: (within /usr/lib/libncurses.so.5.5)
==5827== by 0x4819B91B: _nc_trim_sgr0 (in /usr/lib/libncurses.so.5.5)
==5827== by 0x481959AE: tgetent (in /usr/lib/libncurses.so.5.5)
==5827== by 0x80484A8: main (in /home/liksys/test)
==5827==
==5827==
==5827== 128 bytes in 1 blocks are still reachable in loss record 5 of 8
==5827== at 0x4005400: malloc (vg_replace_malloc.c:149)
==5827== by 0x4819AF5D: _nc_read_file_entry (in /usr/lib/libncurses.so.5.5)
==5827== by 0x4819B094: _nc_read_entry (in /usr/lib/libncurses.so.5.5)
==5827== by 0x481950CC: _nc_setupterm (in /usr/lib/libncurses.so.5.5)
==5827== by 0x48195837: tgetent (in /usr/lib/libncurses.so.5.5)
==5827== by 0x80484A8: main (in /home/liksys/test)
==5827==
==5827==
==5827== 172 bytes in 1 blocks are still reachable in loss record 6 of 8
==5827== at 0x400473F: calloc (vg_replace_malloc.c:279)
==5827== by 0x48194D76: _nc_setupterm (in /usr/lib/libncurses.so.5.5)
==5827== by 0x48195837: tgetent (in /usr/lib/libncurses.so.5.5)
==5827== by 0x80484A8: main (in /home/liksys/test)
==5827==
==5827==
==5827== 1,381 bytes in 1 blocks are still reachable in loss record 7 of 8
==5827== at 0x4005400: malloc (vg_replace_malloc.c:149)
==5827== by 0x4819A756: _nc_read_file_entry (in /usr/lib/libncurses.so.5.5)
==5827== by 0x4819B094: _nc_read_entry (in /usr/lib/libncurses.so.5.5)
==5827== by 0x481950CC: _nc_setupterm (in /usr/lib/libncurses.so.5.5)
==5827== by 0x48195837: tgetent (in /usr/lib/libncurses.so.5.5)
==5827== by 0x80484A8: main (in /home/liksys/test)
==5827==
==5827==
==5827== 1,837 bytes in 4 blocks are still reachable in loss record 8 of 8
==5827== at 0x40054FB: realloc (vg_replace_malloc.c:306)
==5827== by 0x48192CCF: _nc_doalloc (in /usr/lib/libncurses.so.5.5)
==5827== by 0x4819ABEA: _nc_read_file_entry (in /usr/lib/libncurses.so.5.5)
==5827== by 0x4819B094: _nc_read_entry (in /usr/lib/libncurses.so.5.5)
==5827== by 0x481950CC: _nc_setupterm (in /usr/lib/libncurses.so.5.5)
==5827== by 0x48195837: tgetent (in /usr/lib/libncurses.so.5.5)
==5827== by 0x80484A8: main (in /home/liksys/test)
==5827==
==5827== LEAK SUMMARY:
==5827== definitely lost: 0 bytes in 0 blocks.
==5827== possibly lost: 0 bytes in 0 blocks.
==5827== still reachable: 3,688 bytes in 12 blocks.
==5827== suppressed: 0 bytes in 0 blocks.
[liksys@max ~]$-
RyMiS
- Сообщения: 9
- ОС: GNU/Linux
Re: Решено: Информация о терминале
Liksys писал(а): ↑03.06.2007 21:42В общем, как получить информацию о параметрах терминала? Нужен по большей части только параметр с максимальной длиной строки.
Делать getenv("COLUMNS") не предлагать, этот вариант не всегда работает, а только когда переменная експортирована. Очевидно, есть какой-то более правильный способ. Программа запускается в консоли (виртуале, xterm, konsole, etc.), необходимо, чтобы она подстраивалась под длину строки.
Как осуществляется? В поиск, пожалуйста, не посылать, кроме terminfo и termcap ниче не нашел, да и это наверно не совсем то.
Если можно, подкиньте пример.
Вот как это делается у меня:
Код: Выделить всё
static int get_term_width()
{
char * str = getenv("COLUMNS");
int rv;
#if HAVE_SYS_IOCTL_H && !defined(WIN32)
struct winsize ws;
#endif
if (str) {
rv = atoi(str);
if (rv > 20) return rv;
}
#if HAVE_SYS_IOCTL_H && !defined(WIN32)
if (ioctl(1, TIOCGWINSZ, &ws)<0) {
return 80;
}
return ws.ws_col;
#endif
return 80;
}Работает корректно в Linux/FreeBSD/Solaris/Darwin/Win32. Больше нигде не пробовал
-
Liksys
- Сообщения: 2910
Re: Решено: Информация о терминале
У меня в данный момент что-то в этом духе
Код: Выделить всё
static int init_max_terminal_line_len(void)
{
//////////////////////////////////////////
char *max_terminal_line_len_str; // Strokovaya velichina dliny
extern settings_t settings; // Nastroyki sistemy
//////////////////////////////////////////
// Bez kommentariev :)
if ( (max_terminal_line_len_str = getenv("COLUMNS")) == NULL )
{
fprintf(stderr, "%s: cannot get \"$COLUMNS\" value: %s\n",
MYNAME, strerror(errno) );
settings.max_terminal_line_len = DEFAULT_MAX_TERMINAL_LINE_LEN;
return -1;
}
if ( (settings.max_terminal_line_len = atoi(max_terminal_line_len_str)) == 0 )
{
fprintf(stderr, "%s: incorrect \"COLUMNS\" value\n", MYNAME);
settings.max_terminal_line_len = DEFAULT_MAX_TERMINAL_LINE_LEN;
return -1;
}
return 0;
}