-rw-r--r-- | core/apps/embeddedkonsole/MyPty.cpp | 10 | ||||
-rw-r--r-- | core/apps/embeddedkonsole/TEHistory.cpp | 275 | ||||
-rw-r--r-- | core/apps/embeddedkonsole/TEHistory.h | 50 | ||||
-rw-r--r-- | core/apps/embeddedkonsole/TEScreen.cpp | 18 | ||||
-rw-r--r-- | core/apps/embeddedkonsole/TEWidget.cpp | 148 | ||||
-rw-r--r-- | core/apps/embeddedkonsole/TEWidget.h | 16 | ||||
-rw-r--r-- | core/apps/embeddedkonsole/TEmulation.cpp | 1 | ||||
-rw-r--r-- | core/apps/embeddedkonsole/commandeditdialog.cpp | 4 | ||||
-rw-r--r-- | core/apps/embeddedkonsole/konsole.cpp | 2214 | ||||
-rw-r--r-- | core/apps/embeddedkonsole/konsole.h | 224 | ||||
-rw-r--r-- | core/apps/embeddedkonsole/main.cpp | 1 | ||||
-rw-r--r-- | core/apps/embeddedkonsole/session.cpp | 20 | ||||
-rw-r--r-- | core/apps/embeddedkonsole/session.h | 5 |
13 files changed, 1941 insertions, 1045 deletions
diff --git a/core/apps/embeddedkonsole/MyPty.cpp b/core/apps/embeddedkonsole/MyPty.cpp index 7e820ad..e7d8274 100644 --- a/core/apps/embeddedkonsole/MyPty.cpp +++ b/core/apps/embeddedkonsole/MyPty.cpp @@ -76,12 +76,13 @@ #include <unistd.h> #include <termios.h> #include <sys/types.h> #include <sys/ioctl.h> #include <sys/wait.h> +#undef HAVE_OPENPTY #ifdef HAVE_OPENPTY #include <pty.h> #endif #include "MyPty.h" @@ -143,12 +144,18 @@ int MyPty::run(const char* cmd, QStrList &, const char*, int) // This is code from the Qt DumbTerminal example cpid = fork(); if ( !cpid ) { // child - exec shell on tty for (int sig = 1; sig < NSIG; sig++) signal(sig,SIG_DFL); + + // attempt to keep apm driver from killing us on power on/off + signal(SIGSTOP, SIG_IGN); + signal(SIGCONT, SIG_IGN); + signal(SIGTSTP, SIG_IGN); + int ttyfd = open(ttynam, O_RDWR); dup2(ttyfd, STDIN_FILENO); dup2(ttyfd, STDOUT_FILENO); dup2(ttyfd, STDERR_FILENO); // should be done with tty, so close it close(ttyfd); @@ -160,14 +167,13 @@ int MyPty::run(const char* cmd, QStrList &, const char*, int) ioctl(STDIN_FILENO, TIOCSCTTY, 0); #endif tcgetattr( STDIN_FILENO, &ttmode ); ttmode.c_cc[VINTR] = 3; ttmode.c_cc[VERASE] = 8; tcsetattr( STDIN_FILENO, TCSANOW, &ttmode ); - if(strlen(getenv("TERM"))<=0) - setenv("TERM","vt100",1); + setenv("TERM","vt100",1); setenv("COLORTERM","0",1); if (getuid() == 0) { char msg[] = "WARNING: You are running this shell as root!\n"; write(ttyfd, msg, sizeof(msg)); } diff --git a/core/apps/embeddedkonsole/TEHistory.cpp b/core/apps/embeddedkonsole/TEHistory.cpp index db9d10c..504cd13 100644 --- a/core/apps/embeddedkonsole/TEHistory.cpp +++ b/core/apps/embeddedkonsole/TEHistory.cpp @@ -3,17 +3,17 @@ /* [TEHistory.C] History Buffer */ /* */ /* -------------------------------------------------------------------------- */ /* */ /* Copyright (c) 1997,1998 by Lars Doelle <lars.doelle@on-line.de> */ /* */ -/* This file is part of Konsole - an X terminal for KDE */ +/* This file is part of Qkonsole - an X terminal for KDE */ /* */ /* -------------------------------------------------------------------------- */ /* */ -/* Ported Konsole to Qt/Embedded */ +/* Ported Qkonsole to Qt/Embedded */ /* */ /* Copyright (C) 2000 by John Ryland <jryland@trolltech.com> */ /* */ /* -------------------------------------------------------------------------- */ #include "TEHistory.h" @@ -21,12 +21,14 @@ #include <assert.h> #include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <errno.h> +#include <qpe/config.h> + #define HERE printf("%s(%d): here\n",__FILE__,__LINE__) /* An arbitrary long scroll. One can modify the scroll only by adding either cells @@ -37,183 +39,192 @@ a serie of cells with no overwriting permitted. The implementation provides arbitrary length and numbers of cells and line/column indexed read access to the scroll at constant costs. -FIXME: some complain about the history buffer comsuming the - memory of their machines. This problem is critical - since the history does not behave gracefully in cases - where the memory is used up completely. - - I put in a workaround that should handle it problem - now gracefully. I'm not satisfied with the solution. - -FIXME: Terminating the history is not properly indicated - in the menu. We should throw a signal. - -FIXME: There is noticable decrease in speed, also. Perhaps, - there whole feature needs to be revisited therefore. - Disadvantage of a more elaborated, say block-oriented - scheme with wrap around would be it's complexity. */ -//FIXME: tempory replacement for tmpfile -// this is here one for debugging purpose. - -//#define tmpfile xTmpFile - -FILE* xTmpFile() -{ - static int fid = 0; - char fname[80]; - sprintf(fname,"TmpFile.%d",fid++); - return fopen(fname,"w"); -} - -// History Buffer /////////////////////////////////////////// - -/* - A Row(X) data type which allows adding elements to the end. -*/ - -HistoryBuffer::HistoryBuffer() +HistoryScroll::HistoryScroll() { - ion = -1; - length = 0; + m_lines = NULL; + m_max_lines = 0; + m_cells = NULL; + m_max_cells = 0; + m_num_lines = 0; + m_first_line = 0; + m_last_cell = 0; + m_start_line = 0; } -HistoryBuffer::~HistoryBuffer() +HistoryScroll::~HistoryScroll() { - setScroll(FALSE); + setSize(0,0); } - -void HistoryBuffer::setScroll(bool on) + +void HistoryScroll::setSize(int lines, int cells) { - if (on == hasScroll()) return; - - if (on) - { - assert( ion < 0 ); - assert( length == 0); - FILE* tmp = tmpfile(); if (!tmp) { perror("konsole: cannot open temp file.\n"); return; } - ion = dup(fileno(tmp)); if (ion<0) perror("konsole: cannot dup temp file.\n"); - fclose(tmp); + // could try to preserve the existing data... + // printf("setSize(%d,%d)\n", lines, cells); + if (m_lines) { + delete m_lines; + m_lines = NULL; } - else - { - assert( ion >= 0 ); - close(ion); - ion = -1; - length = 0; + if (m_cells) { + delete m_cells; + m_cells = NULL; } + m_max_lines = m_max_cells = 0; + if (lines > 0 && cells > 0) { + m_max_lines = lines; + m_lines = new int[m_max_lines]; + m_lines[0] = 0; + m_max_cells = cells; + m_cells = new ca[m_max_cells]; + } + m_first_line = 0; + m_num_lines = 0; + m_last_cell = 0; + m_start_line = 0; } - -bool HistoryBuffer::hasScroll() -{ - return ion >= 0; -} - -void HistoryBuffer::add(const unsigned char* bytes, int len) -{ int rc; - assert(hasScroll()); - rc = lseek( ion, length, SEEK_SET); - if (rc < 0) { perror("HistoryBuffer::add.seek"); setScroll(FALSE); return; } - rc = write( ion, bytes, len); - if (rc < 0) { perror("HistoryBuffer::add.write"); setScroll(FALSE); return; } - length += rc; -} - -void HistoryBuffer::get(unsigned char* bytes, int len, int loc) { - int rc; - assert(hasScroll()); -// qDebug("history get len %d, loc %d, length %d", len, loc, length); - if (loc < 0 || len < 0 || loc + len > length) - fprintf(stderr,"getHist(...,%d,%d): invalid args.\n",len,loc); - - rc = lseek( ion, loc, SEEK_SET); - if (rc < 0) { perror("HistoryBuffer::get.seek"); setScroll(FALSE); return; } - rc = read( ion, bytes, len); - if (rc < 0) { perror("HistoryBuffer::get.read"); setScroll(FALSE); return; } -} - -int HistoryBuffer::len() -{ - return length; -} - -// History Scroll ////////////////////////////////////// - -/* - The history scroll makes a Row(Row(Cell)) from - two history buffers. The index buffer contains - start of line positions which refere to the cells - buffer. - - Note that index[0] addresses the second line - (line #1), while the first line (line #0) starts - at 0 in cells. -*/ - -HistoryScroll::HistoryScroll() -{ -} - -HistoryScroll::~HistoryScroll() -{ -} - + void HistoryScroll::setScroll(bool on) { - index.setScroll(on); - cells.setScroll(on); + Config cfg("Qkonsole"); + cfg.setGroup("History"); + // printf("setScroll(%d)\n", on); + if (on) { + int lines = cfg.readNumEntry("history_lines",300); + int avg_line = cfg.readNumEntry("avg_line_length",60); + int cells = lines * avg_line; + setSize(lines,cells); + } else { + setSize(0,0); + } } bool HistoryScroll::hasScroll() { - return index.hasScroll() && cells.hasScroll(); + return (m_max_lines > 0); } int HistoryScroll::getLines() { - if (!hasScroll()) return 0; - return index.len() / sizeof(int); + return(m_num_lines); } int HistoryScroll::getLineLen(int lineno) { if (!hasScroll()) return 0; - return (startOfLine(lineno+1) - startOfLine(lineno)) / sizeof(ca); + if (lineno >= m_num_lines) { + // printf("getLineLen(%d) out of range %d\n", lineno, m_num_lines); + return(0); + } + int len = startOfLine(lineno+1) - startOfLine(lineno); + if (len < 0) { + len += m_max_cells; + } + // printf("getLineLen(%d) = %d\n", lineno, len); + return(len); } int HistoryScroll::startOfLine(int lineno) { - if (lineno <= 0) return 0; + // printf("startOfLine(%d) =", lineno); if (!hasScroll()) return 0; - if (lineno <= getLines()) - { int res; - index.get((unsigned char*)&res,sizeof(int),(lineno-1)*sizeof(int)); - return res; + assert(lineno >= 0 && lineno <= m_num_lines); + if (lineno < m_num_lines) { + int index = lineno + m_first_line; + if (index >= m_max_lines) + index -= m_max_lines; + // printf("%d\n", m_lines[index]); + return(m_lines[index]); + } else { + // printf("last %d\n", m_last_cell); + return(m_last_cell); } - return cells.len(); } -void HistoryScroll::getCells(int lineno, int colno, int count, ca res[]) +void HistoryScroll::getCells(int lineno, int colno, int count, ca *res) { + // printf("getCells(%d,%d,%d) num_lines=%d\n", lineno, colno, count, m_num_lines); assert(hasScroll()); -//get(unsigned char* bytes, int len, int loc) - cells.get( (unsigned char*)res, count * sizeof(ca), startOfLine( lineno) + colno * sizeof(ca) ); + assert(lineno >= 0 && lineno < m_num_lines); + int index = lineno + m_first_line; + if (index >= m_max_lines) + index -= m_max_lines; + assert(index >= 0 && index < m_max_lines); + index = m_lines[index] + colno; + assert(index >= 0 && index < m_max_cells); + while(count-- > 0) { + *res++ = m_cells[index]; + if (++index >= m_max_cells) { + index = 0; + } + } } -void HistoryScroll::addCells(ca text[], int count) +void HistoryScroll::addCells(ca *text, int count) { if (!hasScroll()) return; - cells.add((unsigned char*)text,count*sizeof(ca)); + int start_cell = m_last_cell; + // printf("addCells count=%d start=%d first_line=%d first_cell=%d lines=%d\n", + // count, start_cell, m_first_line, m_lines[m_first_line], m_num_lines); + if (count <= 0) { + return; + } + while(count-- > 0) { + assert (m_last_cell >= 0 && m_last_cell < m_max_cells ); + m_cells[m_last_cell] = *text++; + if (++m_last_cell >= m_max_cells) { + m_last_cell = 0; + } + } + if (m_num_lines > 1) { + if (m_last_cell > start_cell) { + while(m_num_lines > 0 + && m_lines[m_first_line] >= start_cell + && m_lines[m_first_line] < m_last_cell) { + // printf("A remove %d>%d && %d<%d first_line=%d num_lines=%d\n", + // m_lines[m_first_line], start_cell, m_lines[m_first_line], m_last_cell, + // m_first_line, m_num_lines); + if (++m_first_line >= m_max_lines) { + m_first_line = 0; + } + m_num_lines--; + } + } else { + while(m_num_lines > 0 + && (m_lines[m_first_line] >= start_cell + || m_lines[m_first_line] < m_last_cell)) { + // printf("B remove %d>%d || %d<%d first_line=%d num_lines=%d\n", + // m_lines[m_first_line], start_cell, m_lines[m_first_line], m_last_cell, + // m_first_line, m_num_lines); + if (++m_first_line >= m_max_lines) { + m_first_line = 0; + } + m_num_lines--; + } + } + } } void HistoryScroll::addLine() { if (!hasScroll()) return; - int locn = cells.len(); - index.add((unsigned char*)&locn,sizeof(int)); + int index = m_first_line + m_num_lines; + if (index >= m_max_lines) { + index -= m_max_lines; + } + // printf("addLine line=%d cell=%d\n", index, m_last_cell); + assert(index >= 0 && index < m_max_lines); + m_lines[index] = m_start_line; + m_start_line = m_last_cell; + if (m_num_lines >= m_max_lines) { + if (++m_first_line >= m_num_lines) { + m_first_line = 0; + } + } else { + m_num_lines++; + } } diff --git a/core/apps/embeddedkonsole/TEHistory.h b/core/apps/embeddedkonsole/TEHistory.h index 11eb150..fcf6496 100644 --- a/core/apps/embeddedkonsole/TEHistory.h +++ b/core/apps/embeddedkonsole/TEHistory.h @@ -18,58 +18,40 @@ #ifndef TEHISTORY_H #define TEHISTORY_H #include "TECommon.h" -/* - An extendable tmpfile(1) based buffer. -*/ -class HistoryBuffer -{ -public: - HistoryBuffer(); - ~HistoryBuffer(); - -public: - void setScroll(bool on); - bool hasScroll(); - -public: - void add(const unsigned char* bytes, int len); - void get(unsigned char* bytes, int len, int loc); - int len(); - -private: - int ion; - int length; -}; - class HistoryScroll { public: HistoryScroll(); ~HistoryScroll(); public: - void setScroll(bool on); - bool hasScroll(); + void setSize(int lines, int cells); + void setScroll(bool on); + bool hasScroll(); -public: // access to history - int getLines(); - int getLineLen(int lineno); - void getCells(int lineno, int colno, int count, ca res[]); + int getLines(); + int getLineLen(int lineno); + void getCells(int lineno, int colno, int count, ca *res); -public: // backward compatibility (obsolete) ca getCell(int lineno, int colno) { ca res; getCells(lineno,colno,1,&res); return res; } -public: // adding lines. - void addCells(ca a[], int count); + void addCells(ca *text, int count); void addLine(); private: int startOfLine(int lineno); - HistoryBuffer index; // lines Row(int) - HistoryBuffer cells; // text Row(ca) + + int m_max_lines; + int *m_lines; + int m_max_cells; + ca *m_cells; + int m_first_line; + int m_last_cell; + int m_num_lines; + int m_start_line; }; #endif // TEHISTORY_H diff --git a/core/apps/embeddedkonsole/TEScreen.cpp b/core/apps/embeddedkonsole/TEScreen.cpp index a6cf6a1..4ebc28e 100644 --- a/core/apps/embeddedkonsole/TEScreen.cpp +++ b/core/apps/embeddedkonsole/TEScreen.cpp @@ -507,12 +507,16 @@ void TEScreen::effectiveRendition() ca* TEScreen::getCookedImage() { int x,y; ca* merged = (ca*)malloc(lines*columns*sizeof(ca)); ca dft(' ',DEFAULT_FORE_COLOR,DEFAULT_BACK_COLOR,DEFAULT_RENDITION); + if (histCursor > hist.getLines()) { + histCursor = hist.getLines(); + } + for (y = 0; (y < lines) && (y < (hist.getLines()-histCursor)); y++) { int len = QMIN(columns,hist.getLineLen(y+histCursor)); int yp = y*columns; int yq = (y+histCursor)*columns; @@ -555,13 +559,13 @@ ca* TEScreen::getCookedImage() /*! */ void TEScreen::reset() { - Config cfg("Konsole"); + Config cfg("Qkonsole"); cfg.setGroup("ScrollBar"); if( !cfg.readBoolEntry("HorzScroll",0) ) setMode(MODE_Wrap ); saveMode(MODE_Wrap ); // wrap at end of margin resetMode(MODE_Origin); saveMode(MODE_Origin); // position refere to [1,1] @@ -968,20 +972,26 @@ void TEScreen::clearSelection() sel_TL = -1; sel_begin = -1; } void TEScreen::setSelBeginXY(const int x, const int y) { + if (histCursor > hist.getLines()) { + histCursor = hist.getLines(); + } sel_begin = loc(x,y+histCursor) ; sel_BR = sel_begin; sel_TL = sel_begin; } void TEScreen::setSelExtentXY(const int x, const int y) { if (sel_begin == -1) return; + if (histCursor > hist.getLines()) { + histCursor = hist.getLines(); + } int l = loc(x,y + histCursor); if (l < sel_begin) { sel_TL = l; sel_BR = sel_begin; @@ -1182,12 +1192,18 @@ void TEScreen::addHistLine() if (!hasScroll()) histCursor = 0; //FIXME: a poor workaround } void TEScreen::setHistCursor(int cursor) { histCursor = cursor; //FIXME:rangecheck + if (histCursor > hist.getLines()) { + histCursor = hist.getLines(); + } + if (histCursor < 0) { + histCursor = 0; + } } void TEScreen::setHorzCursor(int cursor) { horzCursor = cursor; } diff --git a/core/apps/embeddedkonsole/TEWidget.cpp b/core/apps/embeddedkonsole/TEWidget.cpp index ec1b30c..98c3cdf 100644 --- a/core/apps/embeddedkonsole/TEWidget.cpp +++ b/core/apps/embeddedkonsole/TEWidget.cpp @@ -63,12 +63,13 @@ #include <qregexp.h> #include <qpainter.h> #include <qclipboard.h> #include <qstyle.h> #include <qfile.h> #include <qdragobject.h> +#include <qnamespace.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <ctype.h> #include <sys/stat.h> @@ -241,29 +242,23 @@ static QChar identicalMap(QChar c) } void TEWidget::fontChange(const QFont &) { QFontMetrics fm(font()); font_h = fm.height(); - - // font_w = max width of ASCII chars (U.B.) - font_w = 0; - int fw; - for (int i = 0x20; i < 0x80; i++) { - if (isprint(i) && font_w < (fw = fm.width(i))) { - font_w = fw; - } - } - //font_w = fm.maxWidth(); - - font_a = fm.ascent(); -//printf("font_h: %d\n",font_h); -//printf("font_w: %d\n",font_w); -//printf("font_a: %d\n",font_a); -//printf("charset: %s\n",QFont::encodingName(font().charSet()).ascii()); -//printf("rawname: %s\n",font().rawName().ascii()); + // font_w = fm.maxWidth(); + font_w = fm.width("m"); + font_a = fm.ascent(); + printf("font h=%d max_width=%d width_m=%d assent=%d\n", font_h, + fm.maxWidth(), font_w, font_a); + + //printf("font_h: %d\n",font_h); + //printf("font_w: %d\n",font_w); + //printf("font_a: %d\n",font_a); + //printf("charset: %s\n",QFont::encodingName(font().charSet()).ascii()); + //printf("rawname: %s\n",font().rawName().ascii()); fontMap = #if QT_VERSION < 300 strcmp(QFont::encodingName(font().charSet()).ascii(),"iso10646") ? vt100extended : #endif @@ -304,17 +299,17 @@ TEWidget::TEWidget(QWidget *parent, const char *name) : QFrame(parent,name) scrollbar->setCursor( arrowCursor ); connect(scrollbar, SIGNAL(valueChanged(int)), this, SLOT(scrollChanged(int))); hScrollbar = new QScrollBar(this); hScrollbar->setCursor( arrowCursor ); hScrollbar->setOrientation(QScrollBar::Horizontal); - hScrollbar->setMaximumHeight(16); + // hScrollbar->setMaximumHeight(16); connect( hScrollbar, SIGNAL(valueChanged(int)), this, SLOT( hScrollChanged(int))); - Config cfg("Konsole"); + Config cfg("Qkonsole"); cfg.setGroup("ScrollBar"); switch( cfg.readNumEntry("Position",2)){ case 0: scrollLoc = SCRNONE; break; case 1: @@ -681,19 +676,22 @@ void TEWidget::mousePressEvent(QMouseEvent* ev) //printf("press [%d,%d] %d\n",ev->x()/font_w,ev->y()/font_h,ev->button()); if ( !contentsRect().contains(ev->pos()) ) return; QPoint tL = contentsRect().topLeft(); int tLx = tL.x(); int tLy = tL.y(); - word_selection_mode = FALSE; + mouse_down_x = ev->x(); + mouse_down_y = ev->y(); //printf("press top left [%d,%d] by=%d\n",tLx,tLy, bY); if ( ev->button() == LeftButton) { QPoint pos = QPoint((ev->x()-tLx-blX)/font_w,(ev->y()-tLy-bY)/font_h); + word_selection_mode = (ev->state() & ShiftButton); + if ( ev->state() & ControlButton ) preserve_line_breaks = FALSE ; if (mouse_marks || (ev->state() & ShiftButton)) { emit clearSelectionSignal(); iPntSel = pntSel = pos; @@ -812,12 +810,18 @@ void TEWidget::mouseMoveEvent(QMouseEvent* ev) void TEWidget::mouseReleaseEvent(QMouseEvent* ev) { //printf("release [%d,%d] %d\n",ev->x()/font_w,ev->y()/font_h,ev->button()); if ( ev->button() == LeftButton) { + if (QABS(ev->x() - mouse_down_x) < 3 + && QABS(ev->y() - mouse_down_y) < 3 + && ev->y() < qApp->desktop()->height()/8) { + emit setFullScreen(false); + } + if ( actSel > 1 ) emit endSelectionSignal(preserve_line_breaks); preserve_line_breaks = TRUE; actSel = 0; //FIXME: emits a release event even if the mouse is // outside the range. The procedure used in `mouseMoveEvent' @@ -1027,13 +1031,12 @@ bool TEWidget::eventFilter( QObject *obj, QEvent *e ) #ifdef FAKE_CTRL_AND_ALT static bool control = FALSE; static bool alt = FALSE; // qDebug(" Has a keyboard with no CTRL and ALT keys, but we fake it:"); bool dele=FALSE; - if ( e->type() == QEvent::KeyPress || e->type() == QEvent::KeyRelease ) { QKeyEvent* ke = (QKeyEvent*)e; bool keydown = e->type() == QEvent::KeyPress || ke->isAutoRepeat(); switch (ke->key()) { case Key_F9: // let this be "Control" control = keydown; @@ -1066,31 +1069,89 @@ bool TEWidget::eventFilter( QObject *obj, QEvent *e ) if ( e->type() == QEvent::KeyPress ) { QKeyEvent* ke = (QKeyEvent*)e; actSel=0; // Key stroke implies a screen update, so TEWidget won't // know where the current selection is. // qDebug("key pressed is 0x%x, ascii is 0x%x, state %d", ke->key(), ke->ascii(), ke->state()); - if(ke->key() == Key_Escape) { - qDebug("key pressed is 0x%x, ascii is 0x%x, state %d", ke->key(), ke->ascii(), ke->state()); - - } - - if( ke->state() == ShiftButton && ke->key() == Key_Tab) { - //lets hardcode this sucker - -// qDebug("key pressed 2 is 0x%x", ke->key()); - emitText("\\"); // expose - } - else if( ke->state() == ControlButton && ke->key() == Key_V) { - pasteClipboard(); - } -// else if( ke->state() == ControlButton && ke->key() == Key_C) { -// pasteClipboard(); -// } - else - emit keyPressedSignal(ke); // expose + + bool special_function = true; + switch(ke->key()) { + // case 0x201b: // fn-5 + // case Key_F1: + // switch sessions (?) + // emitText("\\"); // expose (??) + // break; + + case 0x2016: // fn-p + case Key_F2: + pasteClipboard(); + break; + + case 0x2018: // fn-S + case Key_F3: + emit changeSession(1); + break; + + case 0x2019: // fn-n + emit newSession(); + break; + + case Qt::Key_Tab: + if (ke->state() == ControlButton) { + emit changeSession(1); + } else { + special_function = false; + } + break; + +#if 0 + case Qt::Key_Left: + if (vcolumns == 0) { + emit changeSession(-1); + } else { + special_function = false; + } + break; + + case Qt::Key_Right: + if (vcolumns == 0) { + emit changeSession(1); + } else { + special_function = false; + } + break; +#endif + + case 0x201b: // fn-5 + case Key_F4: + emit toggleFullScreen(); + break; + + case 0x200f: // fn-1 magnify minus + case Key_F5: + emit changeFontSize(-1); + break; + + case 0x2010: // fn-2 magnify plus + case Key_F6: + emit changeFontSize(1); + break; + + default: + special_function = false; + } + if (special_function) { + return true; + } + // else if( ke->state() == ControlButton && ke->key() == Key_V) { + // pasteClipboard(); + // } + // else if( ke->state() == ControlButton && ke->key() == Key_C) { + // pasteClipboard(); + // } + emit keyPressedSignal(ke); // expose ke->accept(); #ifdef FAKE_CTRL_AND_ALT if ( dele ) delete e; #endif return true; // stop the event } @@ -1113,13 +1174,12 @@ bool TEWidget::eventFilter( QObject *obj, QEvent *e ) void TEWidget::frameChanged() { propagateSize(); update(); } - /* ------------------------------------------------------------------------- */ /* */ /* Sound */ /* */ /* ------------------------------------------------------------------------- */ @@ -1164,13 +1224,13 @@ void TEWidget::clearImage() void TEWidget::calcGeometry() { int showhscrollbar = 1; int hwidth = 0; int dcolumns; - Config cfg("Konsole"); + Config cfg("Qkonsole"); cfg.setGroup("ScrollBar"); useHorzScroll=cfg.readBoolEntry("HorzScroll",0); if(vcolumns == 0) showhscrollbar = 0; if(showhscrollbar == 1) hwidth = QApplication::style().scrollBarExtent().width(); @@ -1365,9 +1425,9 @@ void TEWidget::drop_menu_activated(int item) #endif } void TEWidget::setWrapAt(int columns) { vcolumns = columns; - propagateSize(); - update(); + propagateSize(); + update(); } diff --git a/core/apps/embeddedkonsole/TEWidget.h b/core/apps/embeddedkonsole/TEWidget.h index 5597f27..792b109 100644 --- a/core/apps/embeddedkonsole/TEWidget.h +++ b/core/apps/embeddedkonsole/TEWidget.h @@ -34,13 +34,14 @@ extern unsigned short vt100_graphics[32]; class TESession; // class Konsole; class TEWidget : public QFrame // a widget representing attributed text -{ Q_OBJECT +{ + Q_OBJECT // friend class Konsole; public: TEWidget(QWidget *parent=0, const char *name=0); @@ -71,12 +72,13 @@ public: QSize calcSize(int cols, int lins) const; QSize sizeHint() const; bool useHorzScroll; bool useBeep; + int color_menu_item; void Bell(); void emitText(QString text); void pasteClipboard(); signals: @@ -90,12 +92,17 @@ signals: void clearSelectionSignal(); void beginSelectionSignal( const int x, const int y ); void extendSelectionSignal( const int x, const int y ); void endSelectionSignal(const BOOL preserve_line_breaks); + void changeFontSize(int); + void toggleFullScreen(); + void setFullScreen(bool); + void changeSession(int); + void newSession(); protected: virtual void styleChange( QStyle& ); bool eventFilter( QObject *, QEvent * ); @@ -149,13 +156,13 @@ protected slots: void blinkEvent(); private: QChar (*fontMap)(QChar); // possible vt100 font extention - bool fixed_font; // has fixed pitch + // bool fixed_font; // has fixed pitch int font_h; // height int font_w; // width int font_a; // ascend int blX; // actual offset (left) int brX; // actual offset (right) @@ -179,26 +186,29 @@ private: BOOL preserve_line_breaks; QClipboard* cb; QScrollBar* scrollbar, *hScrollbar; int scrollLoc, hScrollLoc; - int hposition, vcolumns; + int hposition, vcolumns; + int mouse_down_x, mouse_down_y; //#define SCRNONE 0 //#define SCRLEFT 1 //#define SCRRIGHT 2 BOOL blinking; // hide text in paintEvent BOOL hasBlinker; // has characters to blink QTimer* blinkT; // active when hasBlinker QPopupMenu* m_drop; QString dropText; + public: // current session in this widget TESession *currentSession; + private slots: void drop_menu_activated(int item); }; #endif // TE_WIDGET_H diff --git a/core/apps/embeddedkonsole/TEmulation.cpp b/core/apps/embeddedkonsole/TEmulation.cpp index c19f2a1..a539757 100644 --- a/core/apps/embeddedkonsole/TEmulation.cpp +++ b/core/apps/embeddedkonsole/TEmulation.cpp @@ -192,12 +192,13 @@ void TEmulation::setKeytrans(const char * no) void TEmulation::onRcvChar(int c) // process application unicode input to terminal // this is a trivial scanner { c &= 0xff; + switch (c) { case '\b' : scr->BackSpace(); break; case '\t' : scr->Tabulate(); break; case '\n' : scr->NewLine(); break; case '\r' : scr->Return(); break; diff --git a/core/apps/embeddedkonsole/commandeditdialog.cpp b/core/apps/embeddedkonsole/commandeditdialog.cpp index dd35466..03cba87 100644 --- a/core/apps/embeddedkonsole/commandeditdialog.cpp +++ b/core/apps/embeddedkonsole/commandeditdialog.cpp @@ -99,13 +99,13 @@ connect(ToolButton5,SIGNAL(clicked()),m_PlayListSelection,SLOT(moveSelectedDown( QListViewItem *current = m_SuggestedCommandList->selectedItem(); if ( current ) item->moveItem( current ); m_SuggestedCommandList->setSelected( item, TRUE ); m_SuggestedCommandList->ensureItemVisible( m_SuggestedCommandList->selectedItem() ); - Config cfg("Konsole"); + Config cfg("Qkonsole"); cfg.setGroup("Commands"); if (cfg.readEntry("Commands Set","FALSE") == "TRUE") { for (int i = 0; i < 100; i++) { QString tmp; tmp = cfg.readEntry( QString::number(i),""); if (!tmp.isEmpty()) @@ -149,13 +149,13 @@ CommandEditDialog::~CommandEditDialog() { } void CommandEditDialog::accept() { int i = 0; - Config *cfg = new Config("Konsole"); + Config *cfg = new Config("Qkonsole"); cfg->setGroup("Commands"); cfg->clearGroup(); QListViewItemIterator it( m_PlayListSelection ); for ( ; it.current(); ++it ) { diff --git a/core/apps/embeddedkonsole/konsole.cpp b/core/apps/embeddedkonsole/konsole.cpp index ce8fb6b..d10b66d 100644 --- a/core/apps/embeddedkonsole/konsole.cpp +++ b/core/apps/embeddedkonsole/konsole.cpp @@ -1,6 +1,7 @@ + /* ---------------------------------------------------------------------- */ /* */ /* [main.C] Konsole */ /* */ /* ---------------------------------------------------------------------- */ /* */ @@ -18,13 +19,13 @@ /* Copyright (C) 2000 by John Ryland <jryland@trolltech.com> */ /* */ /* -------------------------------------------------------------------------- */ // enhancements added by L.J. Potter <ljp@llornkcor.com> //#define QT_QWS_OPIE -#include "signal.h" +#include <stdlib.h> #include <qpe/resource.h> #include <qdir.h> #include <qevent.h> #include <qdragobject.h> @@ -41,635 +42,1045 @@ #include <qapplication.h> #include <qfontmetrics.h> #include <qcombobox.h> #include <qevent.h> #include <qtabwidget.h> #include <qtabbar.h> +#include <qpe/config.h> #include <qstringlist.h> #include <qpalette.h> -#include <qpe/config.h> -#include <qpe/qpeapplication.h> +#include <qfontdatabase.h> +#include <qfile.h> +#include <qspinbox.h> +#include <qlayout.h> +#include <qvbox.h> -#include <unistd.h> -#include <pwd.h> -#include <sys/types.h> -//#include <sys/wait.h> +#include <sys/wait.h> #include <stdio.h> #include <stdlib.h> #include <assert.h> #include "konsole.h" #include "keytrans.h" #include "commandeditdialog.h" #ifdef QT_QWS_OPIE #include <opie/colorpopupmenu.h> #endif -#include <qfontdatabase.h> // U.B. -#include <qstringlist.h> // U.B. -#include <qvaluelist.h> // U.B. - -class EKNumTabBar : public QTabBar { +class EKNumTabBar : public QTabBar +{ public: + EKNumTabBar(QWidget *parent = 0, const char *name = 0) : + QTabBar(parent, name) + {} + + // QList<QTab> *getTabList() { return(tabList()); } + void numberTabs() { - // Yes, it really is this messy. QTabWidget needs functions - // that provide acces to tabs in a sequential way. - int m=INT_MIN; - for (int i=0; i<count(); i++) { - QTab* left=0; - QListIterator<QTab> it(*tabList()); - int x=INT_MAX; - for( QTab* t; (t=it.current()); ++it ) { - int tx = t->rect().x(); - if ( tx<x && tx>m ) { - x = tx; - left = t; - } - } - if ( left ) { - left->setText(QString::number(i+1)); - m = left->rect().x(); - } - } + // Yes, it really is this messy. QTabWidget needs functions + // that provide acces to tabs in a sequential way. + int m=INT_MIN; + for (int i=0; i<count(); i++) + { + QTab* left=0; + QListIterator<QTab> it(*tabList()); + int x=INT_MAX; + for( QTab* t; (t=it.current()); ++it ) + { + int tx = t->rect().x(); + if ( tx<x && tx>m ) + { + x = tx; + left = t; + } + } + if ( left ) + { + left->setText(QString::number(i+1)); + m = left->rect().x(); + } + } } + + virtual QSize sizeHint() const + { + if (isHidden()) + { + return(QSize(0,0)); + } + else + { + QSize size = QTabBar::sizeHint(); + int shrink = 5; + if (qApp->desktop()->width() > 600 || qApp->desktop()->height() > 600) + { + shrink = 10; + } + size.setHeight(size.height() - shrink); + return(size); + } + } + }; -class EKNumTabWidget : public QTabWidget { +class EKNumTabWidget : public QTabWidget +{ public: EKNumTabWidget(QWidget* parent) : QTabWidget(parent) { + setTabBar(new EKNumTabBar(parent,"EKTabBar")); + setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) ); } + EKNumTabBar *getTabBar() const + { + return ((EKNumTabBar*)tabBar()); + } + + void addTab(QWidget* w) { - QTab* t = new QTab(QString::number(tabBar()->count()+1)); - QTabWidget::addTab(w,t); + QTab* t = new QTab(QString::number(tabBar()->count()+1)); + QTabWidget::addTab(w,t); } void removeTab(QWidget* w) { - removePage(w); - ((EKNumTabBar*)tabBar())->numberTabs(); + removePage(w); + ((EKNumTabBar*)tabBar())->numberTabs(); } }; // This could be configurable or dynamicly generated from the bash history // file of the user static const char *commonCmds[] = -{ - "ls ", // I left this here, cause it looks better than the first alpha - "cardctl eject", - "cat ", - "cd ", - "chmod ", - "clear", - "cp ", - "dc ", - "df ", - "dmesg", - "echo ", - "env", - "find ", - "free", - "grep ", - "ifconfig ", - "ipkg ", - "mkdir ", - "mv ", - "nc localhost 7776", - "nc localhost 7777", - "netstat ", - "nslookup ", - "ping ", - "ps aux", - "pwd ", - "qcop QPE/System 'linkChanged(QString)' ''", - "qcop QPE/System 'restart()'", - "qcop QPE/System 'quit()'", - "rm ", - "rmdir ", - "route ", - "set ", - "traceroute", - -/* - "gzip", - "gunzip", - "chgrp", - "chown", - "date", - "dd", - "df", - "dmesg", - "fuser", - "hostname", - "kill", - "killall", - "ln", - "ping", - "mount", - "more", - "sort", - "touch", - "umount", - "mknod", - "netstat", -*/ + { + "ls ", // I left this here, cause it looks better than the first alpha + "cardctl eject", + "cat ", + "cd ", + "chmod ", + "clear", + "cp ", + "dc ", + "df ", + "dmesg", + "echo ", + "env", + "find ", + "free", + "grep ", + "ifconfig ", + "ipkg ", + "mkdir ", + "mv ", + "nc localhost 7776", + "nc localhost 7777", + "netstat ", + "nslookup ", + "ping ", + "ps aux", + "pwd ", + "qcop QPE/System 'linkChanged(QString)' ''", + "qcop QPE/System 'restart()'", + "qcop QPE/System 'quit()'", + "rm ", + "rmdir ", + "route ", + "set ", + "traceroute", + + /* + "gzip", + "gunzip", + "chgrp", + "chown", + "date", + "dd", + "df", + "dmesg", + "fuser", + "hostname", + "kill", + "killall", + "ln", + "ping", + "mount", + "more", + "sort", + "touch", + "umount", + "mknod", + "netstat", + */ + + "exit", + NULL + }; - "exit", - NULL -}; -static void konsoleInit(const char** shell) { - if(setuid(getuid()) !=0) qDebug("setuid failed"); - if(setgid(getgid()) != 0) qDebug("setgid failed"); // drop privileges +Konsole::Konsole(QWidget* parent, const char* name, WFlags fl) : + QMainWindow(parent, name, fl) +{ + QStrList args; + init("/bin/bash",args); +} -// signal (SIGSTOP, SIG_IGN); - -// QPEApplication::grabKeyboard(); // for CTRL and ALT +Konsole::Konsole(const char* name, const char* _pgm, QStrList & _args, int) + : QMainWindow(0, name) +{ + init(_pgm,_args); +} -// qDebug("keyboard grabbed"); -#ifdef FAKE_CTRL_AND_ALT - qDebug("Fake Ctrl and Alt defined"); - QPEApplication::grabKeyboard(); // for CTRL and ALT -#endif +struct HistoryItem +{ + HistoryItem(int c, const QString &l) + { + count = c; + line = l; + } + int count; + QString line; +}; - *shell = getenv("SHELL"); -// qWarning("SHell initially is %s", *shell ); +class HistoryList : public QList<HistoryItem> +{ + virtual int compareItems( QCollection::Item item1, QCollection::Item item2) + { + int c1 = ((HistoryItem*)item1)->count; + int c2 = ((HistoryItem*)item2)->count; + if (c1 > c2) + return(1); + if (c1 < c2) + return(-1); + return(0); + } +}; - if (shell == NULL || *shell == '\0') { - struct passwd *ent = 0; - uid_t me = getuid(); - *shell = "/bin/sh"; +void Konsole::initCommandList() +{ + // qDebug("Konsole::initCommandList"); + Config cfg("Qkonsole"); + cfg.setGroup("Commands"); + // commonCombo->setInsertionPolicy(QComboBox::AtCurrent); + commonCombo->clear(); - while ( (ent = getpwent()) != 0 ) { - if (ent->pw_uid == me) { - if (ent->pw_shell != "") - *shell = ent->pw_shell; - break; + if (cfg.readEntry("ShellHistory","TRUE") == "TRUE") + { + QString histfilename = QString(getenv("HOME")) + "/.bash_history"; + histfilename = cfg.readEntry("ShellHistoryPath",histfilename); + QFile histfile(histfilename); + // note: compiler barfed on: + // QFile histfile(QString(getenv("HOME")) + "/.bash_history"); + if (histfile.open( IO_ReadOnly )) + { + QString line; + uint i; + HistoryList items; + + int lineno = 0; + while(!histfile.atEnd()) + { + if (histfile.readLine(line, 200) < 0) + { + break; + } + line = line.left(line.length()-1); + lineno++; + + for(i=0; i<items.count(); i++) + { + if (line == items.at(i)->line) + { + // weight recent commands & repeated commands more + // by adding up the index of each command + items.at(i)->count += lineno; + break; + } + } + if (i >= items.count()) + { + items.append(new HistoryItem(lineno, line)); + } + } + items.sort(); + int n = items.count(); + if (n > 40) + { + n = 40; } + for(int i=0; i<n; i++) + { + // should insert start of command, but keep whole thing + if (items.at(items.count()-i-1)->line.length() < 30) + { + commonCombo->insertItem(items.at(items.count()-i-1)->line); + } + } + histfile.close(); + } + } + if (cfg.readEntry("Commands Set","FALSE") == "FALSE") + { + for (int i = 0; commonCmds[i] != NULL; i++) + { + commonCombo->insertItem(commonCmds[i]); + } + } + else + { + for (int i = 0; i < 100; i++) + { + if (!(cfg.readEntry( QString::number(i),"")).isEmpty()) + commonCombo->insertItem(cfg.readEntry( QString::number(i),"")); } - endpwent(); } -// qWarning("SHELL now is %s", *shell ); - if( putenv((char*)"COLORTERM=") !=0) - qDebug("putenv failed"); // to trigger mc's color detection } -Konsole::Konsole(QWidget* parent, const char* name, WFlags fl) : - QMainWindow(parent, name, fl) +static void sig_handler(int x) { - QStrList tmp; const char* shell; - - setCaption( tr("Terminal") ); - - konsoleInit( &shell); -// qWarning("Using shell %s", shell); - init(shell,tmp); + printf("got signal %d\n",x); } - - -void Konsole::initCommandList() +void Konsole::init(const char* _pgm, QStrList & _args) { -// qDebug("Konsole::initCommandList"); - Config cfg("Konsole"); - cfg.setGroup("Commands"); - commonCombo->setInsertionPolicy(QComboBox::AtCurrent); - commonCombo->clear(); - if (cfg.readEntry("Commands Set","FALSE") == "FALSE") { - for (int i = 0; commonCmds[i] != NULL; i++) { - commonCombo->insertItem(commonCmds[i],i); + +#if 0 + for(int i=1; i<=31; i++) + { + if (i != SIGPIPE && i != SIGPROF && i != SIGSEGV + && i != SIGINT && i != SIGILL && i != SIGTERM + && i != SIGBUS) + signal(i,sig_handler); + } +#endif + signal(SIGSTOP, sig_handler); + signal(SIGCONT, sig_handler); + signal(SIGTSTP, sig_handler); + + b_scroll = TRUE; // histon; + n_keytab = 0; + n_render = 0; + startUp=0; + fromMenu = FALSE; + fullscreen = false; + + setCaption( "Qkonsole" ); + setIcon( Resource::loadPixmap( "qkonsole/qkonsole" ) ); + + Config cfg("Qkonsole"); + cfg.setGroup("Font"); + QString tmp; + + // initialize the list of allowed fonts /////////////////////////////////// + + QString cfgFontName = cfg.readEntry("FontName","Lcfont"); + int cfgFontSize = cfg.readNumEntry("FontSize",18); + + cfont = -1; + + // this code causes repeated access to all the font files + // which does slow down startup + QFontDatabase fontDB; + QStringList familyNames; + familyNames = fontDB.families( FALSE ); + QString s; + int fontIndex = 0; + int familyNum = 0; + fontList = new QPopupMenu( this ); + + for(uint j = 0; j < (uint)familyNames.count(); j++) + { + s = familyNames[j]; + if ( s.contains('-') ) + { + int i = s.find('-'); + s = s.right( s.length() - i - 1 ) + " [" + s.left( i ) + "]"; } - } else { - for (int i = 0; i < 100; i++) { - if (!(cfg.readEntry( QString::number(i),"")).isEmpty()) - commonCombo->insertItem((cfg.readEntry( QString::number(i),""))); + s[0] = s[0].upper(); + + QValueList<int> sizes = fontDB.pointSizes( familyNames[j] ); + + printf("family[%d] = %s with %d sizes\n", j, familyNames[j].latin1(), + sizes.count()); + + if (sizes.count() > 0) + { + QPopupMenu *sizeMenu; + QFont f; + int last_width = -1; + sizeMenu = NULL; + + for(uint i = 0; i < (uint)sizes.count() + 4; i++) + { + // printf("family %s size %d ", familyNames[j].latin1(), sizes[i]); + // need to divide by 10 on the Z, but not otherwise + int size; + + if (i >= (uint)sizes.count()) + { + // try for expandable fonts + size = sizes[sizes.count()-1] + 2 * (i - sizes.count() + 1); + } + else + { + printf("sizes[%d] = %d\n", i, sizes[i]); + size = sizes[i]; + } +#ifndef __i386__ + // a hack, sizes on Z seem to be points*10 + size /= 10; +#endif + + f = QFont(familyNames[j], size); + f.setFixedPitch(true); + QFontMetrics fm(f); + // don't trust f.fixedPitch() or f.exactMatch(), they lie!! + if (fm.width("l") == fm.width("m") + && (i < (uint)sizes.count() + || fm.width("m") > last_width)) + { + if (i < (uint)sizes.count()) + { + last_width = fm.width("m"); + } + if (sizeMenu == NULL) + { + sizeMenu = new QPopupMenu(); + } + int id = sizeMenu->insertItem(QString("%1").arg(size), fontIndex); + sizeMenu->setItemParameter(id, fontIndex); + sizeMenu->connectItem(id, this, SLOT(setFont(int))); + QString name = s + " " + QString::number(size); + fonts.append(new VTFont(name, f, familyNames[j], familyNum, size)); + if (familyNames[j] == cfgFontName && size == cfgFontSize) + { + cfont = fontIndex; + } + printf("FOUND: %s family %s size %d\n", name.latin1(), familyNames[j].latin1(), size); + fontIndex++; + } + } + if (sizeMenu) + { + fontList->insertItem(s, sizeMenu, familyNum + 1000); + + familyNum++; + } } + } -} + if (cfont < 0 || cfont >= (int)fonts.count()) + { + cfont = 0; + } -void Konsole::init(const char* _pgm, QStrList & _args) -{ - b_scroll = TRUE; // histon; - n_keytab = 0; - n_render = 0; - startUp=0; - fromMenu = FALSE; - - setCaption( tr("Terminal") ); - setIcon( Resource::loadPixmap( "konsole" ) ); - - Config cfg("Konsole"); - cfg.setGroup("Konsole"); - QString tmp; - // initialize the list of allowed fonts /////////////////////////////////// - cfont = cfg.readNumEntry("FontID", 1); - - QFont f = QFont("Micro", 4, QFont::Normal); - f.setFixedPitch(TRUE); - fonts.append(new VTFont(tr("Micro"), f)); - - f = QFont("Fixed", 7, QFont::Normal); - f.setFixedPitch(TRUE); - fonts.append(new VTFont(tr("Small Fixed"), f)); - - f = QFont("Fixed", 12, QFont::Normal); - f.setFixedPitch(TRUE); - fonts.append(new VTFont(tr("Medium Fixed"), f)); - -// NEW STUFF - - QStringList ignfont = cfg.readListEntry("IgnFont", ','); - /* If there is no "IgnFont = ..." entry in "myonsole.conf", - * put some Japanese fonts of the SL-C7x0 to "ignfont". */ - - if (ignfont.isEmpty()) { - ignfont = QStringList::split (',',"jisupasp,mmkjg1,mmkjg4,mmkjg5"); - } - -// QFont - f = QFont("Fixed", 16, QFont::Normal); - f.setFixedPitch(true); - fonts.append(new VTFont(tr("Default"), f)); - - int fcount = 1; - - f.setCharSet(QFont::AnyCharSet); - f.setStyleHint(QFont::TypeWriter, QFont::PreferMatch); -// f.setWeight(QFont::Normal); + // create terminal emulation framework //////////////////////////////////// + nsessions = 0; - /* - * Look for installed font families. If the family is not in - * the "ignfont" list, look for available sizes. - * If it is fixed pitch font, put the font and the size - * to the fontlist. - */ - QFontDatabase fdb; - QStringList ff = fdb.families(false); - - for (QStringList::Iterator it = ff.begin(); it != ff.end(); ++it ) { - QString fit = *it; - - if( fit != "fixed" && fit != "micro" ) { - if ( ignfont.contains(*it) == 0) { - QValueList<int> pt = fdb.pointSizes(*it); - - for (QValueList<int>::Iterator itv = pt.begin(); - itv != pt.end(); ++itv ) { - int size = (*itv)/10; - if(size > 0) { - f.setFamily(*it); - f.setPointSize(size); - } - - QFontMetrics fm(f); - -//qDebug("%s %d:\twidth('i')=%d, width('w')=%d", (*it).latin1(), (*itv)/10, fm.width('i'), fm.width('w')); - - if (fm.width('i') == fm.width('w') ) { - qDebug((*it)); - f.setFixedPitch(true); - fonts.append(new VTFont(*it + ' ' + QString::number(size), f)); - fcount++; - } - } - } - } - } - -// END NEW STUFF - - -// create terminal emulation framework //////////////////////////////////// - nsessions = 0; - - tab = new EKNumTabWidget(this); - - connect(tab, SIGNAL(currentChanged(QWidget*)), this, SLOT(switchSession(QWidget*))); - - // create terminal toolbar //////////////////////////////////////////////// - setToolBarsMovable( FALSE ); - QToolBar *menuToolBar = new QToolBar( this ); - menuToolBar->setHorizontalStretchable( TRUE ); - - QMenuBar *menuBar = new QMenuBar( menuToolBar ); - - fontList = new QPopupMenu( this ); - for(uint i = 0; i < fonts.count(); i++) { - VTFont *fnt = fonts.at(i); - fontList->insertItem(fnt->getName(), i); - } + tab = new EKNumTabWidget(this); + // tab->setMargin(tab->margin()-5); + connect(tab, SIGNAL(currentChanged(QWidget*)), this, SLOT(switchSession(QWidget*))); - fontChanged(cfont); + // create terminal toolbar //////////////////////////////////////////////// + setToolBarsMovable( FALSE ); + menuToolBar = new QToolBar( this ); + menuToolBar->setHorizontalStretchable( TRUE ); - configMenu = new QPopupMenu( this); - colorMenu = new QPopupMenu( this); - scrollMenu = new QPopupMenu( this); - editCommandListMenu = new QPopupMenu( this); + QMenuBar *menuBar = new QMenuBar( menuToolBar ); - configMenu->insertItem(tr("Command List"), editCommandListMenu); + bool c7xx = false; + if (qApp->desktop()->width() > 600 || qApp->desktop()->height() > 600) + { + c7xx = true; + } + QFont menuFont; + menuFont.setPointSize(c7xx? 18 : 10); + qApp->setFont(menuFont, true); - bool listHidden; - cfg.setGroup("Menubar"); - if( cfg.readEntry("Hidden","FALSE") == "TRUE") { - editCommandListMenu->insertItem( tr( "Show command list" )); - listHidden=TRUE; - } else { - editCommandListMenu->insertItem( tr( "Hide command list" )); - listHidden=FALSE; - } + setFont(cfont); - cfg.setGroup("Tabs"); - tmp=cfg.readEntry("Position","Bottom"); - if(tmp=="Top") { - tab->setTabPosition(QTabWidget::Top); - configMenu->insertItem( tr( "Tabs on Bottom" ) ); - } else { - tab->setTabPosition(QTabWidget::Bottom); - configMenu->insertItem(tr("Tabs on Top")); - } - configMenu->insertSeparator(2); - - colorMenu->insertItem(tr( "Green on Black")); - colorMenu->insertItem(tr( "Black on White")); - colorMenu->insertItem(tr( "White on Black")); - colorMenu->insertItem(tr( "Black on Transparent")); - colorMenu->insertItem(tr( "Black on Red")); - colorMenu->insertItem(tr( "Red on Black")); - colorMenu->insertItem(tr( "Green on Yellow")); - colorMenu->insertItem(tr( "Blue on Magenta")); - colorMenu->insertItem(tr( "Magenta on Blue")); - colorMenu->insertItem(tr( "Cyan on White")); - colorMenu->insertItem(tr( "White on Cyan")); - colorMenu->insertItem(tr( "Blue on Black")); - colorMenu->insertItem(tr( "Amber on Black")); + configMenu = new QPopupMenu( this); + colorMenu = new QPopupMenu( this); + scrollMenu = new QPopupMenu( this); + editCommandListMenu = new QPopupMenu( this); + + configMenu->insertItem(tr("Command List"), editCommandListMenu); + + bool listHidden; + cfg.setGroup("Menubar"); + if( cfg.readEntry("Hidden","FALSE") == "TRUE") + { + ec_cmdlist = editCommandListMenu->insertItem( tr( "Show command list" )); + listHidden=TRUE; + } + else + { + ec_cmdlist = editCommandListMenu->insertItem( tr( "Hide command list" )); + listHidden=FALSE; + } + + cfg.setGroup("Tabs"); + + tabMenu = new QPopupMenu(this); + tm_bottom = tabMenu->insertItem(tr("Bottom" )); + tm_top = tabMenu->insertItem(tr("Top")); + tm_hidden = tabMenu->insertItem(tr("Hidden")); + + configMenu->insertItem(tr("Tabs"), tabMenu); + + tmp=cfg.readEntry("Position","Top"); + if(tmp=="Top") + { + tab->setTabPosition(QTabWidget::Top); + tab->getTabBar()->show(); + tabPos = tm_top; + } + else if (tmp=="Bottom") + { + tab->setTabPosition(QTabWidget::Bottom); + tab->getTabBar()->show(); + tabPos = tm_bottom; + } + else + { + tab->getTabBar()->hide(); + tab->setMargin(tab->margin()); + tabPos = tm_hidden; + } + + cm_bw = colorMenu->insertItem(tr( "Black on White")); + cm_wb = colorMenu->insertItem(tr( "White on Black")); + cm_gb = colorMenu->insertItem(tr( "Green on Black")); + // cm_bt = colorMenu->insertItem(tr( "Black on Transparent")); + cm_br = colorMenu->insertItem(tr( "Black on Pink")); + cm_rb = colorMenu->insertItem(tr( "Pink on Black")); + cm_gy = colorMenu->insertItem(tr( "Green on Yellow")); + cm_bm = colorMenu->insertItem(tr( "Blue on Magenta")); + cm_mb = colorMenu->insertItem(tr( "Magenta on Blue")); + cm_cw = colorMenu->insertItem(tr( "Cyan on White")); + cm_wc = colorMenu->insertItem(tr( "White on Cyan")); + cm_bb = colorMenu->insertItem(tr( "Blue on Black")); + cm_ab = colorMenu->insertItem(tr( "Amber on Black")); + cm_default = colorMenu->insertItem(tr("default")); #ifdef QT_QWS_OPIE - colorMenu->insertItem(tr( "Custom")); + + colorMenu->insertItem(tr( "Custom")); #endif - configMenu->insertItem( tr("Font"), fontList ); - configMenu->insertItem(tr( "Colors") ,colorMenu); - - connect( fontList, SIGNAL( activated(int) ), this, SLOT( fontChanged(int) )); - connect( configMenu, SIGNAL( activated(int) ), this, SLOT( configMenuSelected(int) )); - connect( colorMenu, SIGNAL( activated(int) ), this, SLOT( colorMenuIsSelected(int) )); - connect( scrollMenu, SIGNAL(activated(int)),this,SLOT(scrollMenuSelected(int))); - connect(editCommandListMenu,SIGNAL(activated(int)),this,SLOT(editCommandListMenuSelected(int))); - - menuBar->insertItem( tr("Options"), configMenu ); - - QToolBar *toolbar = new QToolBar( this ); - - QAction *a; - - // Button Commands - a = new QAction( tr("New"), Resource::loadPixmap( "konsole" ), QString::null, 0, this, 0 ); - connect( a, SIGNAL( activated() ), this, SLOT( newSession() ) ); a->addTo( toolbar ); - a = new QAction( tr("Enter"), Resource::loadPixmap( "konsole/enter" ), QString::null, 0, this, 0 ); - connect( a, SIGNAL( activated() ), this, SLOT( hitEnter() ) ); a->addTo( toolbar ); - a = new QAction( tr("Space"), Resource::loadPixmap( "konsole/space" ), QString::null, 0, this, 0 ); - connect( a, SIGNAL( activated() ), this, SLOT( hitSpace() ) ); a->addTo( toolbar ); - a = new QAction( tr("Tab"), Resource::loadPixmap( "konsole/tab" ), QString::null, 0, this, 0 ); - connect( a, SIGNAL( activated() ), this, SLOT( hitTab() ) ); a->addTo( toolbar ); - a = new QAction( tr("Up"), Resource::loadPixmap( "konsole/up" ), QString::null, 0, this, 0 ); - connect( a, SIGNAL( activated() ), this, SLOT( hitUp() ) ); a->addTo( toolbar ); - a = new QAction( tr("Down"), Resource::loadPixmap( "konsole/down" ), QString::null, 0, this, 0 ); - connect( a, SIGNAL( activated() ), this, SLOT( hitDown() ) ); a->addTo( toolbar ); - a = new QAction( tr("Paste"), Resource::loadPixmap( "paste" ), QString::null, 0, this, 0 ); - connect( a, SIGNAL( activated() ), this, SLOT( hitPaste() ) ); a->addTo( toolbar ); -/* - a = new QAction( tr("Up"), Resource::loadPixmap( "up" ), QString::null, 0, this, 0 ); - connect( a, SIGNAL( activated() ), this, SLOT( hitUp() ) ); a->addTo( toolbar ); - a = new QAction( tr("Down"), Resource::loadPixmap( "down" ), QString::null, 0, this, 0 ); - connect( a, SIGNAL( activated() ), this, SLOT( hitDown() ) ); a->addTo( toolbar ); -*/ + configMenu->insertItem(tr( "Colors") ,colorMenu); - secondToolBar = new QToolBar( this ); - secondToolBar->setHorizontalStretchable( TRUE ); + sessionList = new QPopupMenu(this); + sessionList-> insertItem ( Resource::loadPixmap ( "qkonsole/qkonsole" ), tr( "new session" ), this, + SLOT(newSession()) ); - commonCombo = new QComboBox( secondToolBar ); - commonCombo->setMaximumWidth(236); + // connect( fontList, SIGNAL( activated(int) ), this, SLOT( fontChanged(int) )); + connect( configMenu, SIGNAL( activated(int) ), this, SLOT( configMenuSelected(int) )); + connect( colorMenu, SIGNAL( activated(int) ), this, SLOT( colorMenuIsSelected(int) )); + connect( tabMenu, SIGNAL( activated(int) ), this, SLOT( tabMenuSelected(int) )); + connect( scrollMenu, SIGNAL(activated(int)),this,SLOT(scrollMenuSelected(int))); + connect( editCommandListMenu,SIGNAL(activated(int)),this,SLOT(editCommandListMenuSelected(int))); + connect( sessionList, SIGNAL(activated(int)), this, SLOT( sessionListSelected(int) ) ); - editCommandListMenu->insertItem( tr( "Quick Edit" ) ); - if( listHidden) { - secondToolBar->hide(); - editCommandListMenu->setItemEnabled(-23 ,FALSE); - } - editCommandListMenu->insertItem(tr( "Edit" ) ); + menuBar->insertItem( tr("View"), configMenu ); + menuBar->insertItem( tr("Fonts"), fontList ); + menuBar->insertItem( tr("Sessions"), sessionList ); + + toolBar = new QToolBar( this ); - cfg.setGroup("Commands"); - commonCombo->setInsertionPolicy(QComboBox::AtCurrent); + QAction *a; - initCommandList(); -// for (int i = 0; commonCmds[i] != NULL; i++) { -// commonCombo->insertItem( commonCmds[i], i ); -// tmp = cfg.readEntry( QString::number(i),""); -// if(tmp != "") -// commonCombo->changeItem( tmp,i ); -// } + // Button Commands + a = new QAction( tr("New"), Resource::loadPixmap( "konsole/Terminal" ), QString::null, 0, this, 0 ); + connect( a, SIGNAL( activated() ), this, SLOT( newSession() ) ); + a->addTo( toolBar ); - connect( commonCombo, SIGNAL( activated(int) ), this, SLOT( enterCommand(int) )); + a = new QAction( tr("Full Screen"), Resource::loadPixmap( "fullscreen" ), QString::null, 0, this, 0 ); + connect( a, SIGNAL( activated() ), this, SLOT( toggleFullScreen() ) ); + a->addTo( toolBar ); - scrollMenu->insertItem(tr( "None" )); - scrollMenu->insertItem(tr( "Left" )); - scrollMenu->insertItem(tr( "Right" )); -// scrollMenu->insertSeparator(4); -// scrollMenu->insertItem(tr( "Horizontal" )); + a = new QAction( tr("Zoom"), Resource::loadPixmap( "zoom" ), QString::null, 0, this, 0 ); + connect( a, SIGNAL( activated() ), this, SLOT( cycleZoom() ) ); + a->addTo( toolBar ); - configMenu->insertItem(tr( "ScrollBar" ),scrollMenu); - int jut = configMenu->insertItem(tr( "Wrap" )); + /* + a = new QAction( tr("Enter"), Resource::loadPixmap( "konsole/enter" ), QString::null, 0, this, 0 ); + connect( a, SIGNAL( activated() ), this, SLOT( hitEnter() ) ); a->addTo( toolBar ); + a = new QAction( tr("Space"), Resource::loadPixmap( "konsole/space" ), QString::null, 0, this, 0 ); + connect( a, SIGNAL( activated() ), this, SLOT( hitSpace() ) ); a->addTo( toolBar ); + a = new QAction( tr("Tab"), Resource::loadPixmap( "konsole/tab" ), QString::null, 0, this, 0 ); + connect( a, SIGNAL( activated() ), this, SLOT( hitTab() ) ); a->addTo( toolBar ); + */ + /* + a = new QAction( tr("Up"), Resource::loadPixmap( "konsole/up" ), QString::null, 0, this, 0 ); + connect( a, SIGNAL( activated() ), this, SLOT( hitUp() ) ); a->addTo( toolBar ); + a = new QAction( tr("Down"), Resource::loadPixmap( "konsole/down" ), QString::null, 0, this, 0 ); + connect( a, SIGNAL( activated() ), this, SLOT( hitDown() ) ); a->addTo( toolBar ); + */ + a = new QAction( tr("Paste"), Resource::loadPixmap( "paste" ), QString::null, 0, this, 0 ); + connect( a, SIGNAL( activated() ), this, SLOT( hitPaste() ) ); + a->addTo( toolBar ); + + secondToolBar = new QToolBar( this ); + secondToolBar->setHorizontalStretchable( TRUE ); + + commonCombo = new QComboBox( secondToolBar ); + // commonCombo->setMaximumWidth(236); + + ec_quick = editCommandListMenu->insertItem( tr( "Quick Edit" ) ); + if( listHidden) + { + secondToolBar->hide(); + editCommandListMenu->setItemEnabled(ec_quick ,FALSE); + } + ec_edit = editCommandListMenu->insertItem(tr( "Edit" ) ); + + cfg.setGroup("Commands"); + commonCombo->setInsertionPolicy(QComboBox::AtCurrent); + + initCommandList(); + // for (int i = 0; commonCmds[i] != NULL; i++) { + // commonCombo->insertItem( commonCmds[i], i ); + // tmp = cfg.readEntry( QString::number(i),""); + // if(tmp != "") + // commonCombo->changeItem( tmp,i ); + // } + + connect( commonCombo, SIGNAL( activated(int) ), this, SLOT( enterCommand(int) )); + + sm_none = scrollMenu->insertItem(tr( "None" )); + sm_left = scrollMenu->insertItem(tr( "Left" )); + sm_right = scrollMenu->insertItem(tr( "Right" )); + // scrollMenu->insertSeparator(4); + // scrollMenu->insertItem(tr( "Horizontal" )); + + configMenu->insertItem(tr( "ScrollBar" ),scrollMenu); + + configMenu->insertItem(tr( "History" ), this, SLOT(historyDialog())); + + cm_wrap = configMenu->insertItem(tr( "Wrap" )); cfg.setGroup("ScrollBar"); - configMenu->setItemChecked(jut, cfg.readBoolEntry("HorzScroll",0)); - - jut = configMenu->insertItem(tr( "Use Beep" )); - cfg.setGroup("Menubar"); - - configMenu->setItemChecked(jut, cfg.readBoolEntry("useBeep",0)); - - -//scrollMenuSelected(-29); -// cfg.setGroup("ScrollBar"); -// if(cfg.readBoolEntry("HorzScroll",0)) { -// if(cfg.readNumEntry("Position",2) == 0) -// te->setScrollbarLocation(1); -// else -// te->setScrollbarLocation(0); -// te->setScrollbarLocation( cfg.readNumEntry("Position",2)); -// te->setWrapAt(120); -// } - // create applications ///////////////////////////////////////////////////// - setCentralWidget(tab); - - // load keymaps //////////////////////////////////////////////////////////// - KeyTrans::loadAll(); - for (int i = 0; i < KeyTrans::count(); i++) - { KeyTrans* s = KeyTrans::find(i); - assert( s ); - } + configMenu->setItemChecked(cm_wrap, cfg.readBoolEntry("HorzScroll",0)); + + cm_beep = configMenu->insertItem(tr( "Use Beep" )); + cfg.setGroup("Menubar"); + configMenu->setItemChecked(cm_beep, cfg.readBoolEntry("useBeep",0)); + + fullscreen_msg = new QLabel(this); + fullscreen_msg-> setAlignment ( AlignCenter | SingleLine ); + fullscreen_msg-> hide(); + fullscreen_msg-> setSizePolicy ( QSizePolicy ( QSizePolicy::Expanding, QSizePolicy::Expanding )); + fullscreen_msg-> setAutoResize(true); + fullscreen_msg-> setFrameStyle(QFrame::PopupPanel | QFrame::Raised); + fullscreen_msg-> setText(tr("To exit fullscreen, tap here.")); + + fullscreen_timer = new QTimer(this); + connect(fullscreen_timer, SIGNAL(timeout()), + this, SLOT(fullscreenTimeout())); + show_fullscreen_msg = true; + + //scrollMenuSelected(-29); + // cfg.setGroup("ScrollBar"); + // if(cfg.readBoolEntry("HorzScroll",0)) { + // if(cfg.readNumEntry("Position",2) == 0) + // te->setScrollbarLocation(1); + // else + // te->setScrollbarLocation(0); + // te->setScrollbarLocation( cfg.readNumEntry("Position",2)); + // te->setWrapAt(120); + // } + // create applications ///////////////////////////////////////////////////// + setCentralWidget(tab); + + // load keymaps //////////////////////////////////////////////////////////// + KeyTrans::loadAll(); + for (int i = 0; i < KeyTrans::count(); i++) + { + KeyTrans* s = KeyTrans::find(i); + assert( s ); + } + + se_pgm = _pgm; + se_args = _args; + + cfg.setGroup("CommandLine"); - se_pgm = _pgm; - se_args = _args; - se_args.prepend("--login"); -parseCommandLine(); - // read and apply default values /////////////////////////////////////////// - resize(321, 321); // Dummy. - QSize currentSize = size(); - if (currentSize != size()) - defaultSize = size(); + if (cfg.hasKey("shell_args")) + { + QStringList se_args_list = cfg.readListEntry("shell_args",'|'); + for(uint i = 0; i < se_args_list.count(); i++) + { + se_args.prepend(se_args_list[se_args_list.count() - i - 1].latin1()); + } + } + else + { + se_args.prepend("--login"); + } + + se_pgm = cfg.readEntry("shell_bin", QString(se_pgm)); + + // this is the "documentation" for those who know to look + if (! cfg.hasKey("shell_args")) + { + cfg.writeEntry("shell_args",QStringList::fromStrList(se_args),'|'); + } + if (! cfg.hasKey("shell_bin")) + { + cfg.writeEntry("shell_bin",QString(se_pgm)); + } + + parseCommandLine(); + + // read and apply default values /////////////////////////////////////////// + resize(321, 321); // Dummy. + QSize currentSize = size(); + if (currentSize != size()) + defaultSize = size(); + + + /* allows us to catch cancel/escape */ + reparent ( 0, WStyle_Customize | WStyle_NoBorder, + QPoint ( 0, 0 )); } void Konsole::show() { - if ( !nsessions ) { - newSession(); - } - QMainWindow::show(); + if ( !nsessions ) + { + newSession(); + } + QMainWindow::show(); } void Konsole::initSession(const char*, QStrList &) { - QMainWindow::show(); + QMainWindow::show(); } Konsole::~Konsole() { - while (nsessions > 0) { - doneSession(getTe()->currentSession, 0); - } + while (nsessions > 0) + { + doneSession(getTe(), 0); + } +} + +void +Konsole::historyDialog() +{ + QDialog *d = new QDialog ( this, "histdlg", true ); + // d-> setCaption ( tr( "History" )); + + QBoxLayout *lay = new QVBoxLayout ( d, 4, 4 ); + + QLabel *l = new QLabel ( tr( "History Lines:" ), d ); + lay-> addWidget ( l ); + + Config cfg("Qkonsole"); + cfg.setGroup("History"); + int hist = cfg.readNumEntry("history_lines",300); + int avg_line = cfg.readNumEntry("avg_line_length",60); + + QSpinBox *spin = new QSpinBox ( 1, 100000, 20, d ); + spin-> setValue ( hist ); + spin-> setWrapping ( true ); + spin-> setButtonSymbols ( QSpinBox::PlusMinus ); + lay-> addWidget ( spin ); + + if ( d-> exec ( ) == QDialog::Accepted ) + { + cfg.writeEntry("history_lines", spin->value()); + cfg.writeEntry("avg_line_length", avg_line); + if (getTe() != NULL) + { + getTe()->currentSession->setHistory(true); + } + } + + delete d; +} + + +void Konsole::cycleZoom() +{ + TEWidget* te = getTe(); + QFont font = te->getVTFont(); + int size = font.pointSize(); + changeFontSize(1); + font = te->getVTFont(); + if (font.pointSize() <= size) + { + do + { + font = te->getVTFont(); + size = font.pointSize(); + changeFontSize(-1); + font = te->getVTFont(); + } + while (font.pointSize() < size); + } +} + +void Konsole::changeFontSize(int delta) +{ + // printf("delta font size %d\n", delta); + TEWidget* te = getTe(); + QFont font = te->getVTFont(); + int size = font.pointSize(); + int closest = delta > 0? 10000 : -10000; + int closest_font = -1; + for(uint i = 0; i < fonts.count(); i++) + { + if (fonts.at(i)->getFont() == font) + { + if (delta > 0) + { + if (i+1 < fonts.count() + && fonts.at(i+1)->getFamilyNum() == fonts.at(i)->getFamilyNum()) + { + setFont(i+1); + printf("font %d\n", i+1); + return; + } + } + else if (delta < 0) + { + if (i > 0 + && fonts.at(i-1)->getFamilyNum() == fonts.at(i)->getFamilyNum()) + { + setFont(i-1); + printf("font %d\n", i-1); + return; + } + } + } + int fsize = fonts.at(i)->getSize(); + printf("%d size=%d fsize=%d closest=%d\n", i, size, fsize, closest); + if ((delta > 0 && fsize > size && fsize < closest) + || (delta < 0 && fsize < size && fsize > closest)) + { + closest = fsize; + closest_font = i; + } + } + if (closest_font >= 0) + { + printf("font closest %d (%d)\n", closest_font, closest); + setFont(closest_font); + } +} + +int Konsole::findFont(QString name, int size, bool exactMatch) +{ + for(uint i = 0; i < fonts.count(); i++) + { + if (fonts.at(i)->getName() == name + && fonts.at(i)->getSize() == size) + { + return(i); + } + } + if (exactMatch) + { + return(-1); + } + for(uint i = 0; i < fonts.count(); i++) + { + if (fonts.at(i)->getSize() == size) + { + return(i); + } + } + return(-1); +} - Config cfg("Konsole"); - cfg.setGroup("Konsole"); - cfg.writeEntry("FontID", cfont); +void Konsole::setFont(int f) +{ + VTFont* font = fonts.at(f); + if (font) + { + TEWidget* te = getTe(); + if (te != 0) + { + te->setVTFont(font->getFont()); + } + cfont = f; + + int familyNum = font->getFamilyNum(); + int size = font->getSize(); + printf("familyNum = %d size = %d count=%d\n", familyNum, size, + fontList->count()); + for(int i = 0; i < (int)fontList->count(); i++) + { + fontList->setItemChecked(i + 1000, i == familyNum); + } + for(int i = 0; i < (int)fonts.count(); i++) + { + fontList->setItemChecked(i, fonts.at(i)->getFamilyNum() == familyNum + && fonts.at(i)->getSize() == size); + } + Config cfg("Qkonsole"); + cfg.setGroup("Font"); + QString ss = "Session"+ QString::number(tab->currentPageIndex()+1); + if (tab->currentPageIndex() == 0) + { + cfg.writeEntry("FontName", fonts.at(cfont)->getFamily()); + cfg.writeEntry("FontSize", fonts.at(cfont)->getSize()); + } + cfg.writeEntry("FontName"+ss, fonts.at(cfont)->getFamily()); + cfg.writeEntry("FontSize"+ss, fonts.at(cfont)->getSize()); + } } +#if 0 void Konsole::fontChanged(int f) { VTFont* font = fonts.at(f); - if (font != 0) { - for(uint i = 0; i < fonts.count(); i++) { + if (font != 0) + { + for(uint i = 0; i < fonts.count(); i++) + { fontList->setItemChecked(i, (i == (uint) f) ? TRUE : FALSE); } cfont = f; TEWidget* te = getTe(); - if (te != 0) { + if (te != 0) + { te->setVTFont(font->getFont()); } } } +#endif void Konsole::enterCommand(int c) { TEWidget* te = getTe(); - if (te != 0) { - if(!commonCombo->editable()) { + if (te != 0) + { + if(!commonCombo->editable()) + { QString text = commonCombo->text(c); //commonCmds[c]; te->emitText(text); - } else { + } + else + { changeCommand( commonCombo->text(c), c); } } } void Konsole::hitEnter() { TEWidget* te = getTe(); - if (te != 0) { - te->emitText(QString("\r")); + if (te != 0) + { + te->emitText(QString("\r")); } } void Konsole::hitSpace() { TEWidget* te = getTe(); - if (te != 0) { - te->emitText(QString(" ")); + if (te != 0) + { + te->emitText(QString(" ")); } } void Konsole::hitTab() { TEWidget* te = getTe(); - if (te != 0) { - te->emitText(QString("\t")); + if (te != 0) + { + te->emitText(QString("\t")); } } void Konsole::hitPaste() { TEWidget* te = getTe(); - if (te != 0) { - te->pasteClipboard(); + if (te != 0) + { + te->pasteClipboard(); } } void Konsole::hitUp() { TEWidget* te = getTe(); - if (te != 0) { - QKeyEvent ke( QKeyEvent::KeyPress, Qt::Key_Up, 0, 0); - QApplication::sendEvent( te, &ke ); + if (te != 0) + { + QKeyEvent ke( QKeyEvent::KeyPress, Qt::Key_Up, 0, 0); + QApplication::sendEvent( te, &ke ); } } void Konsole::hitDown() { TEWidget* te = getTe(); - if (te != 0) { - QKeyEvent ke( QKeyEvent::KeyPress, Qt::Key_Down, 0, 0); - QApplication::sendEvent( te, &ke ); + if (te != 0) + { + QKeyEvent ke( QKeyEvent::KeyPress, Qt::Key_Down, 0, 0); + QApplication::sendEvent( te, &ke ); } } /** This function calculates the size of the external widget needed for the internal widget to be */ -QSize Konsole::calcSize(int columns, int lines) { +QSize Konsole::calcSize(int columns, int lines) +{ TEWidget* te = getTe(); - if (te != 0) { - QSize size = te->calcSize(columns, lines); - return size; - } else { - QSize size; - return size; + if (te != 0) + { + QSize size = te->calcSize(columns, lines); + return size; + } + else + { + QSize size; + return size; } } /** sets application window to a size based on columns X lines of the te guest widget. Call with (0,0) for setting default size. */ void Konsole::setColLin(int columns, int lines) { - qDebug("konsole::setColLin:: Columns %d", columns); + qDebug("konsole::setColLin:: Columns %d", columns); - if ((columns==0) || (lines==0)) - { - if (defaultSize.isEmpty()) // not in config file : set default value + if ((columns==0) || (lines==0)) { - defaultSize = calcSize(80,24); - // notifySize(24,80); // set menu items (strange arg order !) + if (defaultSize.isEmpty()) // not in config file : set default value + { + defaultSize = calcSize(80,24); + // notifySize(24,80); // set menu items (strange arg order !) + } + resize(defaultSize); + } + else + { + resize(calcSize(columns, lines)); + // notifySize(lines,columns); // set menu items (strange arg order !) } - resize(defaultSize); - } else { - resize(calcSize(columns, lines)); - // notifySize(lines,columns); // set menu items (strange arg order !) - } } /* void Konsole::setFont(int fontno) { QFont f; @@ -694,327 +1105,628 @@ void Konsole::setFont(int fontno) n_font = fontno; } */ // --| color selection |------------------------------------------------------- -void Konsole::changeColumns(int columns) -{ - //FIXME this seems to cause silliness when reset command is executed -// qDebug("change columns"); -// TEWidget* te = getTe(); -// if (te != 0) { -// setColLin(columns,te->Lines()); -// te->update(); -// } +void Konsole::changeColumns(int /*columns*/) +{ //FIXME this seems to cause silliness when reset command is executed + // qDebug("change columns"); + // TEWidget* te = getTe(); + // if (te != 0) { + // setColLin(columns,te->Lines()); + // te->update(); + // } } //FIXME: If a child dies during session swap, // this routine might be called before // session swap is completed. -void Konsole::doneSession(TESession*, int ) +void Konsole::doneSession(TEWidget* te, int ) { - TEWidget *te = getTe(); - if (te != 0) { - te->currentSession->setConnect(FALSE); - tab->removeTab(te); - delete te->currentSession; - delete te; - nsessions--; - } + // TEWidget *te = NULL; + // if (sess->currentSession == tab->currentPage()) { + // printf("done current session\n"); + // te = getTe(); + // } else { + // int currentPage = tab->currentPageIndex(); + // printf("done not current session\n"); + // for(int i = 0; i < nsessions; i++) { + // tab->setCurrentPage(i); + // printf("find session %d tab page %x session %x\n", + // i, tab->currentPage(), sess->currentSession); + // if (tab->currentPage() == sess->currentSession) { + // printf("found session %d\n", i); + // te = tab->currentPage(); + // break; + // } + // } + // tab->setCurrentPage(currentPage); + // } + if (te != 0) + { + te->currentSession->setConnect(FALSE); + tab->removeTab(te); + delete te->currentSession; + delete te; + sessionList->removeItem(nsessions); + nsessions--; + } + if (nsessions == 0) + { + close(); + } +} - if (nsessions == 0) { - close(); - } +void Konsole::changeTitle(TEWidget* te, QString newTitle ) +{ + if (te == getTe()) + { + setCaption(newTitle + " - QKonsole"); + } } -void Konsole::newSession() { - if(nsessions < 15) { // seems to be something weird about 16 tabs on the Zaurus.... memory? - TEWidget* te = new TEWidget(tab); - Config c("Konsole"); - c.setGroup("Menubar"); - te->useBeep=c.readBoolEntry("useBeep",0); -// te->setBackgroundMode(PaletteBase); //we want transparent!! +void Konsole::newSession() +{ + if(nsessions < 15) + { // seems to be something weird about 16 tabs on the Zaurus.... memory? + TEWidget* te = new TEWidget(tab); + Config cfg("Qkonsole"); + cfg.setGroup("Menubar"); + + // FIXME use more defaults from config file + te->useBeep=cfg.readBoolEntry("useBeep",0); + + // te->setBackgroundMode(PaletteBase); //we want transparent!! + + cfg.setGroup("Font"); + QString sn = "Session" + QString::number(nsessions+1); + printf("read font session %s\n", sn.latin1()); + QString fontName = cfg.readEntry("FontName"+sn, + cfg.readEntry("FontName", + fonts.at(cfont)->getFamily())); + int fontSize = cfg.readNumEntry("FontSize"+sn, + cfg.readNumEntry("FontSize", + fonts.at(cfont)->getSize())); + cfont = findFont(fontName, fontSize, false); + printf("lookup font %s size %d got %d\n", fontName.latin1(), fontSize, cfont); + if (cfont < 0) + cfont = 0; te->setVTFont(fonts.at(cfont)->getFont()); + tab->addTab(te); TESession* se = new TESession(this, te, se_pgm, se_args, "xterm"); te->currentSession = se; - connect( se, SIGNAL(done(TESession*,int)), this, SLOT(doneSession(TESession*,int)) ); + connect( se, SIGNAL(done(TEWidget*,int)), this, SLOT(doneSession(TEWidget*,int)) ); + connect( se, SIGNAL(changeTitle(TEWidget*,QString)), this, + SLOT(changeTitle(TEWidget*,QString)) ); + connect(te, SIGNAL(changeFontSize(int)), this, SLOT(changeFontSize(int))); + connect(te, SIGNAL(changeSession(int)), this, SLOT(changeSession(int))); + connect(te, SIGNAL(newSession()), this, SLOT(newSession())); + connect(te, SIGNAL(toggleFullScreen()), this, SLOT(toggleFullScreen())); + connect(te, SIGNAL(setFullScreen(bool)), this, SLOT(setFullScreen(bool))); se->run(); se->setConnect(TRUE); se->setHistory(b_scroll); - tab->setCurrentPage(nsessions); nsessions++; + sessionList->insertItem(QString::number(nsessions), nsessions); + sessionListSelected(nsessions); doWrap(); - setColor(); + setColor(nsessions-1); } } -TEWidget* Konsole::getTe() { - if (nsessions) { - return (TEWidget *) tab->currentPage(); - } else { - return 0; - } +TEWidget* Konsole::getTe() +{ + if (nsessions) + { + return (TEWidget *) tab->currentPage(); + } + else + { + return 0; + } } -void Konsole::switchSession(QWidget* w) { - TEWidget* te = (TEWidget *) w; +void Konsole::sessionListSelected(int id) +{ + if (id < 0) + { + return; + } + QString selected = sessionList->text(id); + EKNumTabBar *tabBar = tab->getTabBar(); - QFont teFnt = te->getVTFont(); - for(uint i = 0; i < fonts.count(); i++) { - VTFont *fnt = fonts.at(i); - bool cf = fnt->getFont() == teFnt; - fontList->setItemChecked(i, cf); - if (cf) { - cfont = i; + int n = 0; + for(int i = 0; n < tabBar->count(); i++) + { + if (tabBar->tab(i)) + { + // printf("selected = %s tab %d = %s\n", selected.latin1(), + // i, tabBar->tab(i)->text().latin1()); + if (tabBar->tab(i)->text() == selected) + { + tab->setCurrentPage(i); + break; + } + n++; + } } - } } -void Konsole::colorMenuIsSelected(int iD) { + +void Konsole::changeSession(int delta) +{ + printf("delta session %d\n", delta); + QTabBar *tabBar = tab->getTabBar(); + int i = tabBar->tab(tabBar->currentTab())->text().toInt() - 1; + i += delta; + if (i < 0) + i += tabBar->count(); + if (i >= tabBar->count()) + i -= tabBar->count(); + + QString selected = QString::number(i+1); + int n = 0; + for(int i = 0; n < tabBar->count(); i++) + { + if (tabBar->tab(i)) + { + printf("selected = %s tab %d = %s\n", selected.latin1(), + i, tabBar->tab(i)->text().latin1()); + if (tabBar->tab(i)->text() == selected) + { + tab->setCurrentPage(i); + break; + } + n++; + } + } +} + +void Konsole::switchSession(QWidget* w) +{ + TEWidget* te = (TEWidget *) w; + QFont teFnt = te->getVTFont(); + int familyNum = -1; + + for(uint i = 0; i < fonts.count(); i++) + { + VTFont *fnt = fonts.at(i); + bool cf = fnt->getFont() == teFnt; + fontList->setItemChecked(i, cf); + if (cf) + { + cfont = i; + familyNum = fnt->getFamilyNum(); + } + } + for(int i = 0; i < (int)fontList->count(); i++) + { + fontList->setItemChecked(i + 1000, i == familyNum); + } + if (! te->currentSession->Title().isEmpty() ) + { + setCaption(te->currentSession->Title() + " - QKonsole"); + } + else + { + setCaption( "Qkonsole" ); + } + // colorMenuSelected(te->color_menu_item); +} + + +void Konsole::toggleFullScreen() +{ + setFullScreen(! fullscreen); +} + +void Konsole::setFullScreen ( bool b ) +{ + static QSize normalsize; + static bool listHidden; + + if (b == fullscreen) + { + return; + } + + fullscreen = b; + + if ( b ) + { + if ( !normalsize. isValid ( )) + { + normalsize = size ( ); + } + + setFixedSize ( qApp-> desktop ( )-> size ( )); + showNormal ( ); + reparent ( 0, WStyle_Customize | WStyle_NoBorder, + QPoint ( 0, 0 )); + showFullScreen ( ); + + menuToolBar->hide(); + toolBar->hide(); + listHidden = secondToolBar->isHidden(); + secondToolBar->hide(); + // commonCombo->hide(); + tab->getTabBar()->hide(); + tab->setMargin(tab->margin()); + + if (show_fullscreen_msg) + { + fullscreen_msg-> move(tab->x() + tab->width()/2 - fullscreen_msg->width()/2, + qApp->desktop()->height()/16 - fullscreen_msg->height()/2); + fullscreen_msg->show(); + fullscreen_timer->start(3000, true); + show_fullscreen_msg = false; + } + } + else + { + showNormal ( ); + reparent ( 0, WStyle_Customize, QPoint ( 0, 0 )); + resize ( normalsize ); + showMaximized ( ); + normalsize = QSize ( ); + + menuToolBar->show(); + toolBar->show(); + if(! listHidden) + { + secondToolBar->show(); + } + // commonCombo->show(); + menuToolBar->show(); + if (tabPos != tm_hidden) + { + tab->getTabBar()->show(); + } + } + tab->setMargin(tab->margin()); // cause setup to run +} + + +void Konsole::fullscreenTimeout() +{ + fullscreen_msg->hide(); +} + +void Konsole::colorMenuIsSelected(int iD) +{ fromMenu = TRUE; colorMenuSelected(iD); } /// ------------------------------- some new stuff by L.J. Potter + + void Konsole::colorMenuSelected(int iD) -{ // this is NOT pretty, elegant or anything else besides functional -// QString temp; -// qDebug( temp.sprintf("colormenu %d", iD)); +{ + // this is NOT pretty, elegant or anything else besides functional + // QString temp; + // qDebug( temp.sprintf("colormenu %d", iD)); - TEWidget* te = getTe(); - Config cfg("Konsole"); + TEWidget* te = getTe(); + Config cfg("Qkonsole"); cfg.setGroup("Colors"); -// QColor foreground; -// QColor background; - colorMenu->setItemChecked(lastSelectedMenu,FALSE); + ColorEntry m_table[TABLE_COLORS]; const ColorEntry * defaultCt=te->getdefaultColorTable(); - /////////// fore back + int i; - if(iD==-9) { // default default - for (i = 0; i < TABLE_COLORS; i++) { + + // te->color_menu_item = iD; + + colorMenu->setItemChecked(cm_ab,FALSE); + colorMenu->setItemChecked(cm_bb,FALSE); + colorMenu->setItemChecked(cm_wc,FALSE); + colorMenu->setItemChecked(cm_cw,FALSE); + colorMenu->setItemChecked(cm_mb,FALSE); + colorMenu->setItemChecked(cm_bm,FALSE); + colorMenu->setItemChecked(cm_gy,FALSE); + colorMenu->setItemChecked(cm_rb,FALSE); + colorMenu->setItemChecked(cm_br,FALSE); + colorMenu->setItemChecked(cm_wb,FALSE); + colorMenu->setItemChecked(cm_bw,FALSE); + colorMenu->setItemChecked(cm_gb,FALSE); + + if(iD==cm_default) + { // default default + printf("default colors\n"); + for (i = 0; i < TABLE_COLORS; i++) + { m_table[i].color = defaultCt[i].color; if(i==1 || i == 11) m_table[i].transparent=1; - cfg.writeEntry("Schema","9"); - colorMenu->setItemChecked(-9,TRUE); - } - } else { - if(iD==-6) { // green black - foreground.setRgb(0x18,255,0x18); - background.setRgb(0x00,0x00,0x00); - cfg.writeEntry("Schema","6"); - colorMenu->setItemChecked(-6,TRUE); - } - if(iD==-7) { // black white - foreground.setRgb(0x00,0x00,0x00); - background.setRgb(0xFF,0xFF,0xFF); - cfg.writeEntry("Schema","7"); - colorMenu->setItemChecked(-7,TRUE); - } - if(iD==-8) { // white black - foreground.setRgb(0xFF,0xFF,0xFF); - background.setRgb(0x00,0x00,0x00); - cfg.writeEntry("Schema","8"); - colorMenu->setItemChecked(-8,TRUE); - } - if(iD==-10) {// Black, Red - foreground.setRgb(0x00,0x00,0x00); - background.setRgb(0xB2,0x18,0x18); - cfg.writeEntry("Schema","10"); - colorMenu->setItemChecked(-10,TRUE); - } - if(iD==-11) {// Red, Black - foreground.setRgb(230,31,31); //0xB2,0x18,0x18 - background.setRgb(0x00,0x00,0x00); - cfg.writeEntry("Schema","11"); - colorMenu->setItemChecked(-11,TRUE); - } - if(iD==-12) {// Green, Yellow - is ugly -// foreground.setRgb(0x18,0xB2,0x18); - foreground.setRgb(36,139,10); -// background.setRgb(0xB2,0x68,0x18); - background.setRgb(255,255,0); - cfg.writeEntry("Schema","12"); - colorMenu->setItemChecked(-12,TRUE); - } - if(iD==-13) {// Blue, Magenta - foreground.setRgb(0x18,0xB2,0xB2); - background.setRgb(0x18,0x18,0xB2); - cfg.writeEntry("Schema","13"); - colorMenu->setItemChecked(-13,TRUE); - } - if(iD==-14) {// Magenta, Blue - foreground.setRgb(0x18,0x18,0xB2); - background.setRgb(0x18,0xB2,0xB2); - cfg.writeEntry("Schema","14"); - colorMenu->setItemChecked(-14,TRUE); - } - if(iD==-15) {// Cyan, White - foreground.setRgb(0x18,0xB2,0xB2); - background.setRgb(0xFF,0xFF,0xFF); - cfg.writeEntry("Schema","15"); - colorMenu->setItemChecked(-15,TRUE); - } - if(iD==-16) {// White, Cyan - background.setRgb(0x18,0xB2,0xB2); - foreground.setRgb(0xFF,0xFF,0xFF); - cfg.writeEntry("Schema","16"); - colorMenu->setItemChecked(-16,TRUE); - } - if(iD==-17) {// Black, Blue - background.setRgb(0x00,0x00,0x00); - foreground.setRgb(0x18,0xB2,0xB2); - cfg.writeEntry("Schema","17"); - colorMenu->setItemChecked(-17,TRUE); - } - if(iD==-18) {// Black, Gold - background.setRgb(0x00,0x00,0x00); - foreground.setRgb(255,215,0); - cfg.writeEntry("Schema","18"); - colorMenu->setItemChecked(-18,TRUE); + colorMenu->setItemChecked(cm_default,TRUE); } + te->setColorTable(m_table); + } + if(iD==cm_gb) + { // green black + foreground.setRgb(100,255,100); // (0x18,255,0x18); + background.setRgb(0x00,0x00,0x00); + colorMenu->setItemChecked(cm_gb,TRUE); + } + if(iD==cm_bw) + { // black white + foreground.setRgb(0x00,0x00,0x00); + background.setRgb(0xFF,0xFF,0xFF); + colorMenu->setItemChecked(cm_bw,TRUE); + } + if(iD==cm_wb) + { // white black + foreground.setRgb(0xFF,0xFF,0xFF); + background.setRgb(0x00,0x00,0x00); + colorMenu->setItemChecked(cm_wb,TRUE); + } + if(iD==cm_br) + {// Black, Red + foreground.setRgb(0x00,0x00,0x00); + background.setRgb(255,85,85); //(0xB2,0x18,0x18); + colorMenu->setItemChecked(cm_br,TRUE); + } + if(iD==cm_rb) + {// Red, Black + foreground.setRgb(255,85,85); + background.setRgb(0x00,0x00,0x00); + colorMenu->setItemChecked(cm_rb,TRUE); + } + if(iD==cm_gy) + {// Green, Yellow - is ugly + // foreground.setRgb(0x18,0xB2,0x18); + foreground.setRgb(15,115,0); + // background.setRgb(0xB2,0x68,0x18); + background.setRgb(255,255,0); + colorMenu->setItemChecked(cm_gy,TRUE); + } + if(iD==cm_bm) + {// Blue, Magenta + foreground.setRgb(3,24,132); + background.setRgb(225,2,255); + colorMenu->setItemChecked(cm_bm,TRUE); + } + if(iD==cm_mb) + {// Magenta, Blue + foreground.setRgb(225,2,255); + background.setRgb(3,24,132); + colorMenu->setItemChecked(cm_mb,TRUE); + } + if(iD==cm_cw) + {// Cyan, White + foreground.setRgb(8,91,129); + background.setRgb(0xFF,0xFF,0xFF); + colorMenu->setItemChecked(cm_cw,TRUE); + } + if(iD==cm_wc) + {// White, Cyan + background.setRgb(8,91,129); + foreground.setRgb(0xFF,0xFF,0xFF); + colorMenu->setItemChecked(cm_wc,TRUE); + } + if(iD==cm_bb) + {// Black, Blue + background.setRgb(0x00,0x00,0x00); + foreground.setRgb(127,147,225); + colorMenu->setItemChecked(cm_bb,TRUE); + } + if(iD==cm_ab) + {// Black, Gold + background.setRgb(0x00,0x00,0x00); + foreground.setRgb(255,215,105); + colorMenu->setItemChecked(cm_ab,TRUE); + } #ifdef QT_QWS_OPIE - if(iD==-19) { -// Custom - qDebug("do custom"); - if(fromMenu) { + if(iD==-19) + { + // Custom + qDebug("do custom"); + if(fromMenu) + { OColorPopupMenu* penColorPopupMenu = new OColorPopupMenu(Qt::black, this, "foreground color"); connect(penColorPopupMenu, SIGNAL(colorSelected(const QColor&)), this, SLOT(changeForegroundColor(const QColor&))); penColorPopupMenu->exec(); - } - cfg.writeEntry("Schema","19"); - if(!fromMenu) { - foreground.setNamedColor(cfg.readEntry("foreground","")); - background.setNamedColor(cfg.readEntry("background","")); - } - fromMenu=FALSE; - colorMenu->setItemChecked(-19,TRUE); } -#endif - for (i = 0; i < TABLE_COLORS; i++) { - if(i==0 || i == 10) { - m_table[i].color = foreground; - } - else if(i==1 || i == 11) { - m_table[i].color = background; m_table[i].transparent=0; - } - else - m_table[i].color = defaultCt[i].color; + if(!fromMenu) + { + foreground.setNamedColor(cfg.readEntry("foreground","")); + background.setNamedColor(cfg.readEntry("background","")); } + fromMenu=FALSE; + colorMenu->setItemChecked(-19,TRUE); } +#endif + lastSelectedMenu = iD; - te->setColorTable(m_table); + + setColors(foreground, background); + + QTabBar *tabBar = tab->getTabBar(); + QString ss = QString("Session%1").arg(tabBar->currentTab()); + // printf("current tab = %d\n", tabBar->currentTab()); + + if (tabBar->currentTab() == 0) + { + cfg.writeEntry("foregroundRed",QString::number(foreground.red())); + cfg.writeEntry("foregroundGreen",QString::number(foreground.green())); + cfg.writeEntry("foregroundBlue",QString::number(foreground.blue())); + cfg.writeEntry("backgroundRed",QString::number(background.red())); + cfg.writeEntry("backgroundGreen",QString::number(background.green())); + cfg.writeEntry("backgroundBlue",QString::number(background.blue())); + } + cfg.writeEntry("foregroundRed"+ss,QString::number(foreground.red())); + cfg.writeEntry("foregroundGreen"+ss,QString::number(foreground.green())); + cfg.writeEntry("foregroundBlue"+ss,QString::number(foreground.blue())); + cfg.writeEntry("backgroundRed"+ss,QString::number(background.red())); + cfg.writeEntry("backgroundGreen"+ss,QString::number(background.green())); + cfg.writeEntry("backgroundBlue"+ss,QString::number(background.blue())); + update(); +} +void Konsole::setColors(QColor foreground, QColor background) +{ + int i; + ColorEntry m_table[TABLE_COLORS]; + TEWidget* te = getTe(); + const ColorEntry * defaultCt=te->getdefaultColorTable(); + + for (i = 0; i < TABLE_COLORS; i++) + { + if(i==0 || i == 10) + { + m_table[i].color = foreground; + } + else if(i==1 || i == 11) + { + m_table[i].color = background; + m_table[i].transparent=0; + } + else + m_table[i].color = defaultCt[i].color; + } + te->setColorTable(m_table); } +void Konsole::tabMenuSelected(int id) +{ + Config cfg("Qkonsole"); + cfg.setGroup("Tabs"); + tabMenu->setItemChecked(tabPos, false); + if (id == tm_bottom) + { + printf("set bottom tab\n"); + tab->getTabBar()->show(); + tab->setTabPosition(QTabWidget::Bottom); + tab->getTabBar()->show(); + cfg.writeEntry("Position","Bottom"); + } + else if (id == tm_top) + { + printf("set top tab\n"); + tab->getTabBar()->show(); + tab->setTabPosition(QTabWidget::Bottom); + tab->setTabPosition(QTabWidget::Top); + tab->getTabBar()->show(); + cfg.writeEntry("Position","Top"); + } + else if (id == tm_hidden) + { + tab->getTabBar()->hide(); + tab->setMargin(tab->margin()); + cfg.writeEntry("Position","Hidden"); + } + tabMenu->setItemChecked(id, true); + tabPos = id; +} + + void Konsole::configMenuSelected(int iD) { -// QString temp; -// qDebug( temp.sprintf("configmenu %d",iD)); + // QString temp; + // qDebug( temp.sprintf("configmenu %d",iD)); - TEWidget* te = getTe(); - Config cfg("Konsole"); + TEWidget* te = getTe(); + Config cfg("Qkonsole"); cfg.setGroup("Menubar"); - int i,j; -#ifdef QT_QWS_OPIE - i=-29;j=-30; -#else - i=-28;j=-29; -#endif - - if(iD == -4) { - cfg.setGroup("Tabs"); - QString tmp=cfg.readEntry("Position","Bottom"); - - if(tmp=="Top") { - tab->setTabPosition(QTabWidget::Bottom); - configMenu->changeItem( iD, tr("Tabs on Top")); - cfg.writeEntry("Position","Bottom"); - } else { - tab->setTabPosition(QTabWidget::Top); - configMenu->changeItem( iD, tr("Tabs on Bottom")); - cfg.writeEntry("Position","Top"); - } - } - if(iD == i) { - cfg.setGroup("ScrollBar"); - bool b=cfg.readBoolEntry("HorzScroll",0); - b=!b; - cfg.writeEntry("HorzScroll", b ); - cfg.write(); - doWrap(); - if(cfg.readNumEntry("Position",2) == 0) { - te->setScrollbarLocation(1); - } else { - te->setScrollbarLocation(0); - } - te->setScrollbarLocation( cfg.readNumEntry("Position",2)); - } - if(iD == j) { - cfg.setGroup("Menubar"); - bool b=cfg.readBoolEntry("useBeep",0); - b=!b; - cfg.writeEntry("useBeep", b ); - cfg.write(); - configMenu->setItemChecked(j,b); - te->useBeep=b; - } + if(iD == cm_wrap) + { + cfg.setGroup("ScrollBar"); + bool b=cfg.readBoolEntry("HorzScroll",0); + b=!b; + cfg.writeEntry("HorzScroll", b ); + cfg.write(); + doWrap(); + if(cfg.readNumEntry("Position",2) == 0) + { + te->setScrollbarLocation(1); + } + else + { + te->setScrollbarLocation(0); + } + te->setScrollbarLocation( cfg.readNumEntry("Position",2)); + } + if(iD == cm_beep) + { + cfg.setGroup("Menubar"); + bool b=cfg.readBoolEntry("useBeep",0); + b=!b; + cfg.writeEntry("useBeep", b ); + cfg.write(); + configMenu->setItemChecked(cm_beep,b); + te->useBeep=b; + } } void Konsole::changeCommand(const QString &text, int c) { - Config cfg("Konsole"); + Config cfg("Qkonsole"); cfg.setGroup("Commands"); - if(commonCmds[c] != text) { + if(commonCmds[c] != text) + { cfg.writeEntry(QString::number(c),text); commonCombo->clearEdit(); commonCombo->setCurrentItem(c); } } -void Konsole::setColor() +void Konsole::setColor(int sess) { - Config cfg("Konsole"); + Config cfg("Qkonsole"); cfg.setGroup("Colors"); - int scheme = cfg.readNumEntry("Schema",1); - if(scheme != 1) colorMenuSelected( -scheme); + QColor foreground, background; + QString ss = QString("Session") + QString::number(sess); + foreground.setRgb(cfg.readNumEntry("foregroundRed"+ss, + cfg.readNumEntry("foregroundRed",0xff)), + cfg.readNumEntry("foregroundGreen"+ss, + cfg.readNumEntry("foregroundGreen",0xff)), + cfg.readNumEntry("foregroundBlue"+ss, + cfg.readNumEntry("foregroundBlue",0xff))); + background.setRgb(cfg.readNumEntry("backgroundRed"+ss, + cfg.readNumEntry("backgroundRed",0)), + cfg.readNumEntry("backgroundGreen"+ss, + cfg.readNumEntry("backgroundGreen",0)), + cfg.readNumEntry("backgroundBlue"+ss, + cfg.readNumEntry("backgroundBlue",0))); + setColors(foreground, background); } void Konsole::scrollMenuSelected(int index) { -// qDebug( "scrollbar menu %d",index); + // qDebug( "scrollbar menu %d",index); TEWidget* te = getTe(); - Config cfg("Konsole"); + Config cfg("Qkonsole"); cfg.setGroup("ScrollBar"); - int i,j,k; -#ifdef QT_QWS_OPIE -i=-25;j=-26;k=-27; -#else -i=-24;j=-25;k=-26; -#endif - if(index == i) { - - te->setScrollbarLocation(0); - cfg.writeEntry("Position",0); - } else if(index == j) { - - te->setScrollbarLocation(1); - cfg.writeEntry("Position",1); - } else if(index == k) { - te->setScrollbarLocation(2); - cfg.writeEntry("Position",2); - } + if(index == sm_none) + { + te->setScrollbarLocation(0); + cfg.writeEntry("Position",0); + } + else if(index == sm_left) + { + te->setScrollbarLocation(1); + cfg.writeEntry("Position",1); + } + else if(index == sm_right) + { + te->setScrollbarLocation(2); + cfg.writeEntry("Position",2); + } + scrollMenu->setItemChecked(sm_none, index == sm_none); + scrollMenu->setItemChecked(sm_left, index == sm_left); + scrollMenu->setItemChecked(sm_right, index == sm_right); +} // case -29: { // bool b=cfg.readBoolEntry("HorzScroll",0); // cfg.writeEntry("HorzScroll", !b ); // cfg.write(); // if(cfg.readNumEntry("Position",2) == 0) { @@ -1024,153 +1736,183 @@ i=-24;j=-25;k=-26; // te->setScrollbarLocation(0); // te->setWrapAt(120); // } // te->setScrollbarLocation( cfg.readNumEntry("Position",2)); // } // break; -} void Konsole::editCommandListMenuSelected(int iD) { -// QString temp; -// qDebug( temp.sprintf("edit command list %d",iD)); + // QString temp; + // qDebug( temp.sprintf("edit command list %d",iD)); + + // FIXME: more cleanup needed here + + TEWidget* te = getTe(); - Config cfg("Konsole"); + Config cfg("Qkonsole"); cfg.setGroup("Menubar"); - if( iD == -3) { - if(!secondToolBar->isHidden()) { + if( iD == ec_cmdlist) + { + if(!secondToolBar->isHidden()) + { secondToolBar->hide(); configMenu->changeItem( iD,tr( "Show Command List" )); cfg.writeEntry("Hidden","TRUE"); - configMenu->setItemEnabled(-23 ,FALSE); - } else { + configMenu->setItemEnabled(ec_edit ,FALSE); + configMenu->setItemEnabled(ec_quick ,FALSE); + } + else + { secondToolBar->show(); configMenu->changeItem( iD,tr( "Hide Command List" )); cfg.writeEntry("Hidden","FALSE"); - configMenu->setItemEnabled(-23 ,TRUE); + configMenu->setItemEnabled(ec_edit ,TRUE); + configMenu->setItemEnabled(ec_quick ,TRUE); - if(cfg.readEntry("EditEnabled","FALSE")=="TRUE") { - configMenu->setItemChecked(-23,TRUE); + if(cfg.readEntry("EditEnabled","FALSE")=="TRUE") + { + configMenu->setItemChecked(ec_edit,TRUE); commonCombo->setEditable( TRUE ); - } else { - configMenu->setItemChecked(-23,FALSE); + } + else + { + configMenu->setItemChecked(ec_edit,FALSE); commonCombo->setEditable( FALSE ); } } } - if( iD == -23) { + if( iD == ec_quick) + { cfg.setGroup("Commands"); -// qDebug("enableCommandEdit"); - if( !configMenu->isItemChecked(iD) ) { + // qDebug("enableCommandEdit"); + if( !configMenu->isItemChecked(iD) ) + { commonCombo->setEditable( TRUE ); configMenu->setItemChecked(iD,TRUE); commonCombo->setCurrentItem(0); cfg.writeEntry("EditEnabled","TRUE"); - } else { + } + else + { commonCombo->setEditable( FALSE ); configMenu->setItemChecked(iD,FALSE); cfg.writeEntry("EditEnabled","FALSE"); commonCombo->setFocusPolicy(QWidget::NoFocus); te->setFocus(); } } - if(iD == -24) { - // "edit commands" - CommandEditDialog *m = new CommandEditDialog(this); - connect(m,SIGNAL(commandsEdited()),this,SLOT(initCommandList())); - QPEApplication::showDialog( m ); + if(iD == ec_edit) + { + // "edit commands" + CommandEditDialog *m = new CommandEditDialog(this); + connect(m,SIGNAL(commandsEdited()),this,SLOT(initCommandList())); + m->showMaximized(); } } // $QPEDIR/bin/qcop QPE/Application/embeddedkonsole 'setDocument(QString)' 'ssh -V' -void Konsole::setDocument( const QString &cmd) { +void Konsole::setDocument( const QString &cmd) +{ newSession(); TEWidget* te = getTe(); - if(cmd.find("-e", 0, TRUE) != -1) { + if(cmd.find("-e", 0, TRUE) != -1) + { QString cmd2; cmd2=cmd.right(cmd.length()-3)+" &"; system(cmd2.latin1()); - if(startUp <= 1 && nsessions < 2) { - doneSession(getTe()->currentSession, 0); + if(startUp <= 1 && nsessions < 2) + { + doneSession(getTe(), 0); exit(0); - } else - doneSession(getTe()->currentSession, 0); - } else { - if (te != 0) { + } + else + doneSession(getTe(), 0); + } + else + { + if (te != 0) + { te->emitText(cmd+"\r"); } } startUp++; } -void Konsole::parseCommandLine() { + +// what is the point of this when you can just +// run commands by using the shell directly?? +void Konsole::parseCommandLine() +{ QString cmd; - // newSession(); - for (int i=1;i< qApp->argc();i++) { - if( QString(qApp->argv()[i]) == "-e") { + // newSession(); + for (int i=1;i< qApp->argc();i++) + { + if( QString(qApp->argv()[i]) == "-e") + { i++; - for ( int j=i;j< qApp->argc();j++) { + for ( int j=i;j< qApp->argc();j++) + { cmd+=QString(qApp->argv()[j])+" "; } cmd.stripWhiteSpace(); system(cmd.latin1()); exit(0);//close(); } // end -e switch } startUp++; } -void Konsole::changeForegroundColor(const QColor &color) { - Config cfg("Konsole"); +void Konsole::changeForegroundColor(const QColor &color) +{ + Config cfg("Qkonsole"); cfg.setGroup("Colors"); int r, g, b; color.rgb(&r,&g,&b); foreground.setRgb(r,g,b); cfg.writeEntry("foreground",color.name()); qDebug("foreground "+color.name()); cfg.write(); -qDebug("do other dialog"); + qDebug("do other dialog"); #ifdef QT_QWS_OPIE - OColorPopupMenu* penColorPopupMenu2 = new OColorPopupMenu(Qt::black, this,"background color"); + OColorPopupMenu* penColorPopupMenu2 = new OColorPopupMenu(Qt::black, this,"background color"); connect(penColorPopupMenu2, SIGNAL(colorSelected(const QColor&)), this, SLOT(changeBackgroundColor(const QColor&))); - penColorPopupMenu2->exec(); + penColorPopupMenu2->exec(); #endif } -void Konsole::changeBackgroundColor(const QColor &color) { +void Konsole::changeBackgroundColor(const QColor &color) +{ qDebug("Change background"); - Config cfg("Konsole"); + Config cfg("Qkonsole"); cfg.setGroup("Colors"); int r, g, b; color.rgb(&r,&g,&b); background.setRgb(r,g,b); cfg.writeEntry("background",color.name()); qDebug("background "+color.name()); cfg.write(); } -void Konsole::doWrap() { -int i; -#ifdef QT_QWS_OPIE -i=-29; -#else -i=-28; -#endif - - Config cfg("Konsole"); +void Konsole::doWrap() +{ + Config cfg("Qkonsole"); cfg.setGroup("ScrollBar"); TEWidget* te = getTe(); - if( !cfg.readBoolEntry("HorzScroll",0)) { + if( !cfg.readBoolEntry("HorzScroll",0)) + { te->setWrapAt(0); - configMenu->setItemChecked( i,TRUE); - } else { -// te->setWrapAt(90); + configMenu->setItemChecked( cm_wrap,TRUE); + } + else + { + // te->setWrapAt(90); te->setWrapAt(120); - configMenu->setItemChecked( i,FALSE); + configMenu->setItemChecked( cm_wrap,FALSE); } } diff --git a/core/apps/embeddedkonsole/konsole.h b/core/apps/embeddedkonsole/konsole.h index 7d5a908..37babbb 100644 --- a/core/apps/embeddedkonsole/konsole.h +++ b/core/apps/embeddedkonsole/konsole.h @@ -43,102 +43,164 @@ class EKNumTabWidget; class Konsole : public QMainWindow { Q_OBJECT public: - static QString appName() { return QString::fromLatin1("embeddedkonsole"); } - - Konsole(QWidget* parent = 0, const char* name = 0, WFlags fl = 0); - ~Konsole(); - void setColLin(int columns, int lines); - QToolBar *secondToolBar; - void show(); - void setColor(); - int lastSelectedMenu; - int startUp; + + static QString appName() + { + return QString::fromLatin1("embeddedkonsole"); + } + + Konsole(QWidget* parent = 0, const char* name = 0, WFlags fl = 0); + Konsole(const char * name, const char* pgm, QStrList & _args, int histon); + ~Konsole(); + void setColLin(int columns, int lines); + QToolBar *secondToolBar; + void show(); + void setColor(int); + int lastSelectedMenu; + int startUp; + +public slots: + void changeFontSize(int); + void toggleFullScreen(); + void setFullScreen(bool); + void changeSession(int); + void cycleZoom(); + void newSession(); + private slots: - void setDocument(const QString &); - void doneSession(TESession*,int); - void changeColumns(int); - void fontChanged(int); - void configMenuSelected(int ); - void colorMenuSelected(int); - void colorMenuIsSelected(int); - void enterCommand(int); - void hitEnter(); - void hitSpace(); - void hitTab(); - void hitPaste(); - void hitUp(); - void hitDown(); - void switchSession(QWidget *); - void newSession(); - void changeCommand(const QString &, int); - void initCommandList(); - void scrollMenuSelected(int); - void editCommandListMenuSelected(int); - void parseCommandLine(); + void setDocument(const QString &); + void doneSession(TEWidget*,int); + void changeTitle(TEWidget*,QString); + void changeColumns(int); + void setFont(int); + // void fontChanged(int); + void configMenuSelected(int ); + void colorMenuSelected(int); + void colorMenuIsSelected(int); + void tabMenuSelected(int); + void sessionListSelected(int); + + void enterCommand(int); + void hitEnter(); + void hitSpace(); + void hitTab(); + void hitPaste(); + void hitUp(); + void hitDown(); + void switchSession(QWidget *); + void changeCommand(const QString &, int); + void initCommandList(); + void scrollMenuSelected(int); + void editCommandListMenuSelected(int); + void parseCommandLine(); void changeForegroundColor(const QColor &); void changeBackgroundColor(const QColor &); + + void historyDialog(); + void fullscreenTimeout(); + private: void doWrap(); - void init(const char* _pgm, QStrList & _args); - void initSession(const char* _pgm, QStrList & _args); - void runSession(TESession* s); - void setColorPixmaps(); - void setHistory(bool); - QSize calcSize(int columns, int lines); - TEWidget* getTe(); - QStringList commands; - QLabel * msgLabel; - QColor foreground, background; -bool fromMenu; -private: - class VTFont - { - public: - VTFont(QString name, QFont& font) - { - this->name = name; - this->font = font; - } - - QFont& getFont() - { - return font; - } + void init(const char* _pgm, QStrList & _args); + void initSession(const char* _pgm, QStrList & _args); + void runSession(TESession* s); + void setColorPixmaps(); + void setHistory(bool); + void setColors(QColor foreground, QColor background); + int findFont(QString name, int size, bool exact = false); + QSize calcSize(int columns, int lines); + TEWidget* getTe(); + QStringList commands; + QLabel * msgLabel; + QColor foreground, background; + bool fromMenu; + + bool fullscreen; - QString getName() +private: + class VTFont { - return name; - } - - private: - QString name; - QFont font; - }; + public: + VTFont(QString name, QFont& font, QString family, int familyNum, int size) + { + this->name = name; + this->font = font; + this->family = family; + this->size = size; + this->familyNum = familyNum; + } + + QFont& getFont() + { + return font; + } + QString getName() + { + return name; + } + int getSize() + { + return(size); + } + QString getFamily() + { + return(family); + } + int getFamilyNum() + { + return(familyNum); + } + + private: + QFont font; + QString name; + QString family; + int familyNum; + int size; + }; + + EKNumTabWidget* tab; + int tabPos; + int nsessions; + QList<VTFont> fonts; + int cfont; + QCString se_pgm; + QStrList se_args; + + QToolBar *menuToolBar; + QToolBar *toolBar; + QComboBox *commonCombo; + + QPopupMenu *fontList,*configMenu,*colorMenu,*scrollMenu,*editCommandListMenu; + QPopupMenu *sessionList, *tabMenu; + + int sm_none, sm_left, sm_right; + int cm_beep, cm_wrap; + int cm_default; + int cm_bw, cm_wb, cm_gb, cm_bt, cm_br, cm_rb, cm_gy, cm_bm, cm_mb, cm_cw, cm_wc, cm_bb, cm_ab; + int tm_top, tm_bottom, tm_hidden; + int ec_edit, ec_cmdlist, ec_quick; + + bool show_fullscreen_msg; + QTimer *fullscreen_timer; + QLabel *fullscreen_msg; - EKNumTabWidget* tab; - int nsessions; - QList<VTFont> fonts; - int cfont; - QCString se_pgm; - QStrList se_args; - QPopupMenu *fontList,*configMenu,*colorMenu,*scrollMenu,*editCommandListMenu; - QComboBox *commonCombo; // history scrolling I think - bool b_scroll; - - int n_keytab; - int n_scroll; - int n_render; - QString pmPath; // pixmap path - QString dropText; - QFont defaultFont; - QSize defaultSize; + bool b_scroll; + + int n_keytab; + int n_scroll; + int n_render; + QString pmPath; // pixmap path + QString dropText; + QFont defaultFont; + QSize defaultSize; }; #endif diff --git a/core/apps/embeddedkonsole/main.cpp b/core/apps/embeddedkonsole/main.cpp index f77fe24..a6a079c 100644 --- a/core/apps/embeddedkonsole/main.cpp +++ b/core/apps/embeddedkonsole/main.cpp @@ -33,6 +33,7 @@ #include <pwd.h> #include <sys/types.h> /* --| main |------------------------------------------------------ */ OPIE_EXPORT_APP( OApplicationFactory<Konsole> ) + diff --git a/core/apps/embeddedkonsole/session.cpp b/core/apps/embeddedkonsole/session.cpp index 520af86..17acb8c 100644 --- a/core/apps/embeddedkonsole/session.cpp +++ b/core/apps/embeddedkonsole/session.cpp @@ -20,20 +20,21 @@ The stuff in here does not belong to the terminal emulation framework, but to main.C. It serves it's duty by providing a single reference to TEPTy/Emulation pairs. In fact, it is only there to demonstrate one of the abilities of the framework - multible sessions. */ -TESession::TESession(QMainWindow* main, TEWidget* te, const char* _pgm, QStrList & _args, const char *_term) : schema_no(0), font_no(3), pgm(_pgm), args(_args) +TESession::TESession(QMainWindow* main, TEWidget* _te, const char* _pgm, QStrList & _args, const char *_term) : schema_no(0), font_no(3), pgm(_pgm), args(_args) { + te = _te; + term = _term; + // sh = new TEPty(); sh = new MyPty(); em = new TEmuVt102(te); - term = _term; - sh->setSize(te->Lines(),te->Columns()); // not absolutely nessesary QObject::connect( sh,SIGNAL(block_in(const char*,int)), em,SLOT(onRcvBlock(const char*,int)) ); QObject::connect( em,SIGNAL(ImageSizeChanged(int,int)), sh,SLOT(setSize(int,int))); @@ -45,16 +46,18 @@ TESession::TESession(QMainWindow* main, TEWidget* te, const char* _pgm, QStrList main,SLOT(notifySize(int,int))); */ QObject::connect( em,SIGNAL(sndBlock(const char*,int)), sh,SLOT(send_bytes(const char*,int)) ); QObject::connect( em,SIGNAL(changeColumns(int)), main,SLOT(changeColumns(int)) ); -/* + + + QObject::connect( em,SIGNAL(changeTitle(int, const QString&)), - main,SLOT(changeTitle(int, const QString&)) ); -*/ + this,SLOT(changeTitle(int, const QString&)) ); + QObject::connect( sh,SIGNAL(done(int)), this,SLOT(done(int)) ); } void TESession::run() @@ -80,13 +83,13 @@ void TESession::setConnect(bool c) { em->setConnect(c); } void TESession::done(int status) { - emit done(this,status); + emit done(te,status); } void TESession::terminate() { delete this; } @@ -131,15 +134,16 @@ void TESession::setKeymapNo(int kn) void TESession::setFontNo(int fn) { font_no = fn; } -void TESession::setTitle(const QString& title) +void TESession::changeTitle(int, const QString& title) { this->title = title; + emit changeTitle(te, title); } const QString& TESession::Title() { return title; } diff --git a/core/apps/embeddedkonsole/session.h b/core/apps/embeddedkonsole/session.h index 4a61569..f399e96 100644 --- a/core/apps/embeddedkonsole/session.h +++ b/core/apps/embeddedkonsole/session.h @@ -53,24 +53,25 @@ public: int keymap(); void setHistory(bool on); void setSchemaNo(int sn); void setKeymapNo(int kn); void setFontNo(int fn); - void setTitle(const QString& title); void kill(int signal); public slots: void run(); void done(int status); void terminate(); + void changeTitle(int, const QString& title); signals: - void done(TESession*, int); + void done(TEWidget*, int); + void changeTitle(TEWidget*, QString); private: // TEPty* sh; MyPty* sh; TEWidget* te; |