Функции-оболочки для возможности терминала


Я подготовил небольшой интерфейс с остальной части моей программы могут получить доступ к соответствующим функциям системы. Я не программист, хотя - только C++ и D, в основном. Я хочу убедиться, что все здесь "с-иш" до совершения остальной мой код на этот интерфейс.

Это просто один файл, скомпилированный с C компилятор (в отличие от С++).

    /*
     * This file provides functions to interface with
     * low-level terminal properties such as size and
     * input modes.  Functions meant to be accessible
     * to external "user" code begin with "Terminal."
     */

#include <sys/ioctl.h> // For interfacing with the terminal device.
#include <termios.h> // Ditto.
#include <unistd.h> // For the STDIN_FILENO file descriptor macro.

// This is just used internally, and should not be called directly from D code.
struct winsize Size()
{
    struct winsize Size;
    ioctl(STDIN_FILENO, TIOCGWINSZ, &Size);
    return Size;
}

unsigned short int TerminalColumnCount()
{
    return Size().ws_col;
}

unsigned short int TerminalRowCount()
{
    return Size().ws_row;
}

// Used to reset the terminal properties to their original state.
// Again, this is only for internal use.
struct termios BackupProperties;

// Removes terminal input buffering so programs can see typed characters before Enter is pressed.
void TerminalMakeRaw() // I wish I could come up with a better name for this.  
{
    tcgetattr(STDIN_FILENO, &BackupProperties);
    struct termios NewProperties;
    cfmakeraw(&NewProperties);
    tcsetattr(STDIN_FILENO, TCSANOW, &NewProperties);
}

void TerminalReset()
{
    tcsetattr(STDIN_FILENO, TCSANOW, &BackupProperties);
}


326
2
задан 18 октября 2011 в 03:10 Источник Поделиться
Комментарии
1 ответ

Несколько быстрых комментариев:


  • Вы должны объявить все внутренние функции и переменные статические , чтобы избежать загрязнения глобального пространства имен. (Вы бы сделать это в программе на C++, но, вероятно, использовать Безымянное пространство имен. Я не уверен, что Д'эквивалент).

  • Поскольку у вас есть государство (явно и неявно через BackupProperties) я бы посоветовал использовать объектно-ориентированный подход приводит к тому, непрозрачный указатель , чтобы поддерживать его, даже если имеется только один терминал экземпляр это (ИМО) лучше. В противном случае вы должны по крайней мере убедиться, что TerminalMakeRaw не звонил дважды без соответствующих вызовов TerminalReset.

  • Необходимо также учесть, что в какой-то момент Вы, вероятно, хотите иметь обратные вызовы какой-то уведомить пользователей вашей библиотеки, когда/если размер окна меняется и так далее.

2
ответ дан 18 октября 2011 в 04:10 Источник Поделиться