سؤال

ولقد كنت أبحث عن وسيلة للحصول على عرض المحطة الطرفية من داخل برنامجي C. ما أظل الخروج مع شيء على غرار:

#include <sys/ioctl.h>
#include <stdio.h>

int main (void)
{
    struct ttysize ts;
    ioctl(0, TIOCGSIZE, &ts);

    printf ("lines %d\n", ts.ts_lines);
    printf ("columns %d\n", ts.ts_cols);
}

ولكن في كل مرة أحاول أن أحصل

austin@:~$ gcc test.c -o test
test.c: In function ‘main’:
test.c:6: error: storage size of ‘ts’ isn’t known
test.c:7: error: ‘TIOCGSIZE’ undeclared (first use in this function)
test.c:7: error: (Each undeclared identifier is reported only once
test.c:7: error: for each function it appears in.)

هل هذه هي أفضل طريقة للقيام بذلك، أم أن هناك طريقة أفضل؟ إن لم يكن كيف يمكنني الحصول على هذا العمل؟

وتحرير: رمز ثابت هو

#include <sys/ioctl.h>
#include <stdio.h>

int main (void)
{
    struct winsize w;
    ioctl(0, TIOCGWINSZ, &w);

    printf ("lines %d\n", w.ws_row);
    printf ("columns %d\n", w.ws_col);
    return 0;
}
هل كانت مفيدة؟

المحلول

هل تعتبر استخدام getenv () ؟ انها تسمح لك للحصول على متغيرات البيئة للنظام والتي تحتوي على أعمدة المحطات وخطوط.

وبدلا من ذلك باستخدام طريقة الخاص بك، إذا كنت تريد أن ترى ما تراه نواة ويبلغ حجم محطة (يتم تغيير حجم أفضل في محطة الحالة)، وكنت بحاجة إلى استخدام TIOCGWINSZ، في مقابل TIOCGSIZE الخاص بك، كما يلي:

struct winsize w;
ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);

ورمز الكامل:

#include <sys/ioctl.h>
#include <stdio.h>
#include <unistd.h>

int main (int argc, char **argv)
{
    struct winsize w;
    ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);

    printf ("lines %d\n", w.ws_row);
    printf ("columns %d\n", w.ws_col);
    return 0;  // make sure your main returns int
}

نصائح أخرى

وهذا المثال هو قليلا على الجانب طويلة، ولكن أعتقد أنها الطريقة الأكثر المحمولة للكشف عن أبعاد الطرفية. هذا يعالج أيضا تغيير حجم الأحداث.

وكما يوحي تيم وrlbond، أنا باستخدام سأركع. فهو يضمن تحسنا كبيرا في التوافق محطة بالمقارنة مع القراءة متغيرات البيئة مباشرة.

#include <ncurses.h>
#include <string.h>
#include <signal.h>

// SIGWINCH is called when the window is resized.
void handle_winch(int sig){
  signal(SIGWINCH, SIG_IGN);

  // Reinitialize the window to update data structures.
  endwin();
  initscr();
  refresh();
  clear();

  char tmp[128];
  sprintf(tmp, "%dx%d", COLS, LINES);

  // Approximate the center
  int x = COLS / 2 - strlen(tmp) / 2;
  int y = LINES / 2 - 1;

  mvaddstr(y, x, tmp);
  refresh();

  signal(SIGWINCH, handle_winch);
}

int main(int argc, char *argv[]){
  initscr();
  // COLS/LINES are now set

  signal(SIGWINCH, handle_winch);

  while(getch() != 27){
    /* Nada */
  }

  endwin();

  return(0);
}
#include <stdio.h>
#include <stdlib.h>
#include <termcap.h>
#include <error.h>

static char termbuf[2048];

int main(void)
{
    char *termtype = getenv("TERM");

    if (tgetent(termbuf, termtype) < 0) {
        error(EXIT_FAILURE, 0, "Could not access the termcap data base.\n");
    }

    int lines = tgetnum("li");
    int columns = tgetnum("co");
    printf("lines = %d; columns = %d.\n", lines, columns);
    return 0;
}

ويحتاج إلى أن يكون ترجمة مع -ltermcap. هناك الكثير من المعلومات المفيدة الأخرى التي يمكنك الحصول عليها باستخدام termcap. دليل للتحقق من termcap باستخدام info termcap لمزيد من التفاصيل.

إذا كان لديك سأركع تثبيت واستخدامه، يمكنك استخدام getmaxyx() للعثور على أبعاد المحطة.

وعلى افتراض انك على لينكس، وأعتقد أنك تريد استخدام سأركع مكتبة في حين أن. وأنا متأكد من الاشياء ttysize لديك ليس في stdlib.

وحتى لا يدل على أن الإجابة هنا، ولكن:

وlinux-pc:~/scratch$ echo $LINES

49

وlinux-pc:~/scratch$ printenv | grep LINES

وlinux-pc:~/scratch$

وطيب، ولقد لاحظت انه اذا كنت تغيير حجم محطة GNOME، وخطوط وأعمدة متغيرات تتبع ذلك.

وكندة يبدو مثل محطة GNOME هو خلق هذه المتغيرات البيئة نفسها؟

وهنا باستدعاء الدالة على الشيء المتغير البيئي اقترح بالفعل:

int lines = atoi(getenv("LINES"));
int columns = atoi(getenv("COLUMNS"));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top