Skip to content

Commit

Permalink
Property handle resizing of the window!
Browse files Browse the repository at this point in the history
  • Loading branch information
mrobinson committed Oct 14, 2011
1 parent fe728ea commit 053f5a8
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 14 deletions.
16 changes: 7 additions & 9 deletions src/pty.cpp
Expand Up @@ -84,15 +84,11 @@ PtyInitResult Pty::init(const std::string& pathToExecutable) {
pid_t pid;

struct termios orig_termios;
struct winsize size;

if (interactive) {
if (tcgetattr(STDIN_FILENO, &orig_termios) < 0) {
return ERROR_TCGETATTR;
}
if (ioctl(STDIN_FILENO, TIOCGWINSZ, (char *) &size) < 0) {
return ERROR_IOCTL_TIOCGWINSZ;
}
}

if((masterfd_ = posix_openpt(O_RDWR)) < 0) {
Expand Down Expand Up @@ -158,11 +154,6 @@ PtyInitResult Pty::init(const std::string& pathToExecutable) {
printf("tcsetattr error on slave pty\n");
exit(EXIT_FAILURE);
}
if (ioctl(slavefd, TIOCSWINSZ, &size) < 0) {
// TODO: better child error handling
printf("TIOCSWINSZ error on slave pty\n");
exit(EXIT_FAILURE);
}
}

// Slave becomes stdin/stdout/stderr of child.
Expand Down Expand Up @@ -271,5 +262,12 @@ void Pty::readWriteLoop() {

pthread_yield();
}
}

void Pty::setSize(int columns, int rows)
{
printf("set size: %i %i\n", columns, rows);
struct winsize size = { rows, columns, 0, 0};
if (ioctl(masterfd_, TIOCSWINSZ, &size) < 0)
printf("TIOCSWINSZ error on master pty\n");
}
1 change: 1 addition & 0 deletions src/pty.h
Expand Up @@ -35,6 +35,7 @@ class Pty {
PtyInitResult init(const std::string& pathToExecutable);
int ptyWrite(const char* buffer, const int count);
int putChar(const char character);
void setSize(int columns, int rows);

void readWriteLoop();

Expand Down
36 changes: 32 additions & 4 deletions src/qt/QtTerminalWindow.cpp
Expand Up @@ -10,15 +10,29 @@ QtTerminalWindow::QtTerminalWindow()
: QFrame(NULL)
, m_pty(NULL)
, m_previousCharacter('\0')
, m_fontMetrics(0)
, m_font(0)
, m_size(80, 25)
{
m_font = new QFont("Monospace");
m_font->setStyleHint(QFont::TypeWriter);
m_fontMetrics = new QFontMetrics(*m_font);

setFont(new QFont("Consolas"));
connect(this, SIGNAL(updateNeeded()),
this, SLOT(handleUpdateNeeded()));
}

void QtTerminalWindow::setFont(QFont* font)
{
delete m_font;
delete m_fontMetrics;

m_font = font;
m_fontMetrics = new QFontMetrics(*m_font);

QSize increment(m_fontMetrics->maxWidth(), m_fontMetrics->height());
setSizeIncrement(increment);
resize(increment.width() * m_size.width(), increment.height() * m_size.height());

}

void QtTerminalWindow::handleUpdateNeeded()
{
// TODO: Be smarter.
Expand Down Expand Up @@ -72,3 +86,17 @@ void QtTerminalWindow::keyPressEvent(QKeyEvent* event)
QByteArray utf8String = eventString.toUtf8();
m_pty->ptyWrite(utf8String.data(), utf8String.length());
}

void QtTerminalWindow::setPty(Pty* pty)
{
m_pty = pty;
m_pty->setSize(m_size.width(), m_size.height());
}

void QtTerminalWindow::resizeEvent(QResizeEvent* resizeEvent)
{
if (m_pty)
m_pty->setSize(size().width() / sizeIncrement().width(),
size().height() / sizeIncrement().height());
QWidget::resizeEvent(resizeEvent);
}
5 changes: 4 additions & 1 deletion src/qt/QtTerminalWindow.h
Expand Up @@ -9,21 +9,24 @@ class QtTerminalWindow : public QFrame, public LineOrientedVT100Client {

public:
QtTerminalWindow();
void setPty(Pty* pty) { m_pty = pty; }
void setPty(Pty* pty);

protected:
virtual void keyPressEvent(QKeyEvent* event);
virtual void resizeEvent(QResizeEvent* resizeEvent);

virtual void characterAppended();
virtual void somethingLargeChanged();
void paintEvent(QPaintEvent*);
void renderLine(QPainter& painter, Line* line, int& currentBaseline);
void setFont(QFont*);

private:
Pty* m_pty;
char m_previousCharacter;
QFontMetrics* m_fontMetrics;
QFont* m_font;
QSize m_size;

signals:
void updateNeeded();
Expand Down

0 comments on commit 053f5a8

Please sign in to comment.