[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-core-devel
Subject:    PATCH, take 2 , uses BlockArray (was Re: konsole's history : is anyone taking care of it ?)
From:       Guillaume Laurent <glaurent () telegraph-road ! org>
Date:       2001-05-31 23:43:09
[Download RAW message or body]

On Monday 28 May 2001 17:16, Stephan Kulow wrote:

> If your patch works, put it in (after approval of Chris) and I'll try later
> to revive my BlockArray stuff

Given that nobody expressed interest in file logging and it looked like a 
headache to get right (from the user's standpoint, that is, how to select the 
file name), I went ahead and used your BlockArray instead. I had to make a 
couple of changes, you might want to check (see in BlockArray::at(size_t i)).

The attached patch is simpler (though it carries a lot of #if 0'ed code in 
case the other history mechanisms are found useful later on). Session 
management is here.

-- 
					Guillaume.
					http://www.telegraph-road.org

["konsole_history_patch_2.patch" (text/x-c++)]

Index: BlockArray.C
===================================================================
RCS file: /home/kde/kdebase/konsole/src/BlockArray.C,v
retrieving revision 1.2
diff -u -r1.2 BlockArray.C
--- BlockArray.C	2000/10/29 23:34:07	1.2
+++ BlockArray.C	2001/05/31 23:36:29
@@ -9,14 +9,18 @@
 static int blocksize = 0;
 
 BlockArray::BlockArray()
-    : size(0), lastmap(0), lastblock(0), ion(-1), length(0)
+    : size(0),
+      current(-1),
+      index(-1),
+      lastmap(0),
+      lastmap_index(-1),
+      lastblock(0), ion(-1),
+      length(0)
 {
-    lastmap_index = index = current = size_t(-1);
+    // lastmap_index = index = current = size_t(-1);
     if (blocksize == 0)
         blocksize = ((sizeof(Block) / getpagesize()) + 1) * getpagesize();
 
-    if (!size)
-        return;
 }
 
 BlockArray::~BlockArray()
@@ -29,15 +33,19 @@
 {
     if (!size)
         return size_t(-1);
+
+    ++current;
+    if (current >= size) current = 0;
 
-    current = ++current % size;
     int rc;
     rc = lseek(ion, current * blocksize, SEEK_SET); if (rc < 0) { \
                perror("HistoryBuffer::add.seek"); setHistorySize(0); return \
                size_t(-1); }
     rc = write(ion, block, blocksize); if (rc < 0) { \
perror("HistoryBuffer::add.write"); setHistorySize(0); return size_t(-1); } +
     length++;
-    if (length>size)
-        length=size;
-    index++;
+    if (length > size) length = size;
+
+    ++index;
+
     delete block;
     return current;
 }
@@ -69,7 +77,7 @@
     return true;
 }
 
-const Block *BlockArray::at(size_t i)
+const Block* BlockArray::at(size_t i)
 {
     if (i == index + 1)
         return lastblock;
@@ -77,20 +85,28 @@
     if (i == lastmap_index)
         return lastmap;
 
-    if (i > index)
+    if (i > index) {
+        kdDebug() << "BlockArray::at() i > index\n";
         return 0;
-    if (index - i >= length)
-        return 0;
-    size_t j = (current - (index - i) + (index/size+1)*size) % size;
+    }
+    
+//     if (index - i >= length) {
+//         kdDebug() << "BlockArray::at() index - i >= length\n";
+//         return 0;
+//     }
 
+    size_t j = i; // (current - (index - i) + (index/size+1)*size) % size ;
+
     assert(j < size);
     unmap();
 
     Block *block = (Block*)mmap(0, blocksize, PROT_READ, MAP_PRIVATE, ion, j * \
blocksize);  
     if (block == (Block*)-1) { perror("mmap"); return 0; }
+
     lastmap = block;
     lastmap_index = i;
+
     return block;
 }
 
@@ -176,7 +192,7 @@
     res = fwrite(buffer2, blocksize, 1, fion);
     if (res != 1)
         perror("fwrite");
-    printf("moving block %d to %d\n", cursor, newpos);
+    //    printf("moving block %d to %d\n", cursor, newpos);
 }
 
 void BlockArray::decreaseBuffer(size_t newsize)
Index: Makefile.am
===================================================================
RCS file: /home/kde/kdebase/konsole/src/Makefile.am,v
retrieving revision 1.65
diff -u -r1.65 Makefile.am
--- Makefile.am	2001/03/23 01:05:09	1.65
+++ Makefile.am	2001/05/31 23:36:30
@@ -20,7 +20,7 @@
 # libkonsolepart is a part, but konsole.la links directly to it, so we can't
 # install it under kde_module
 
-libkonsolepart_la_SOURCES = TEPty.C \
+libkonsolepart_la_SOURCES = BlockArray.C TEPty.C \
 	schema.C \
 	session.C \
 	TEWidget.C \
@@ -50,7 +50,7 @@
 konsole_la_LDFLAGS = $(all_libraries) -module -avoid-version
 
 # konsole executable - has all the sources, doesn't link kparts, saves startup time
-konsole_SOURCES	= TEPty.C main.C konsole.C schema.C session.C TEWidget.C TEmuVt102.C \
\ +konsole_SOURCES	= BlockArray.C TEPty.C main.C konsole.C schema.C session.C \
TEWidget.C TEmuVt102.C \  TEScreen.C TEmulation.C TEHistory.C keytrans.C 
 konsole_LDADD = $(LIB_KDEUI) $(LIB_KSYCOCA) $(LIBUTEMPTER) $(LIBUTIL)
 konsole_LDFLAGS = $(all_libraries) $(KDE_RPATH)
Index: TEHistory.C
===================================================================
RCS file: /home/kde/kdebase/konsole/src/TEHistory.C,v
retrieving revision 1.12
diff -u -r1.12 TEHistory.C
--- TEHistory.C	2001/03/17 14:30:42	1.12
+++ TEHistory.C	2001/05/31 23:36:30
@@ -17,6 +17,7 @@
 #include <sys/types.h>
 #include <unistd.h>
 #include <errno.h>
+#include <kdebug.h>
 
 #ifndef HERE
 #define HERE printf("%s(%d): here\n",__FILE__,__LINE__)
@@ -58,6 +59,8 @@
 
 //#define tmpfile xTmpFile
 
+#if 0
+
 FILE* xTmpFile()
 {
   static int fid = 0;
@@ -67,72 +70,72 @@
 }
 
 
-// History Buffer ///////////////////////////////////////////
+// History File ///////////////////////////////////////////
 
 /*
-   A Row(X) data type which allows adding elements to the end.
+  A Row(X) data type which allows adding elements to the end.
 */
 
-HistoryBuffer::HistoryBuffer()
+HistoryFile::HistoryFile()
+  : ion(-1),
+    length(0)
 {
-  ion    = -1;
-  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);
 }
 
-HistoryBuffer::~HistoryBuffer()
+HistoryFile::~HistoryFile()
 {
-  setScroll(FALSE);
+  close(ion);
 }
 
-void HistoryBuffer::setScroll(bool on)
+void HistoryFile::add(const unsigned char* bytes, int len)
 {
-  if (on == hasScroll()) return;
+  int rc = 0;
 
-  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);
-  }
-  else
-  {
-    assert( ion >= 0 );
-    close(ion);
-    ion    = -1;
-    length = 0;
-  }
+  rc = lseek(ion,length,SEEK_SET); if (rc < 0) { perror("HistoryFile::add.seek"); \
return; } +  rc = write(ion,bytes,len);       if (rc < 0) { \
perror("HistoryFile::add.write"); return; } +  length += rc;
 }
 
-bool HistoryBuffer::hasScroll()
+void HistoryFile::get(unsigned char* bytes, int len, int loc)
 {
-  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;
-}
+  int rc = 0;
 
-void HistoryBuffer::get(unsigned char* bytes, int len, int loc)
-{ int rc;
-  assert(hasScroll());
   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; } +  rc = lseek(ion,loc,SEEK_SET); if (rc < 0) { \
perror("HistoryFile::get.seek"); return; } +  rc = read(ion,bytes,len);     if (rc < \
0) { perror("HistoryFile::get.read"); return; }  }
 
-int HistoryBuffer::len()
+int HistoryFile::len()
 {
   return length;
 }
+
+#endif
+
+// History Scroll abstract base class //////////////////////////////////////
+
+
+HistoryScroll::HistoryScroll(HistoryType* t)
+  : m_histType(t)
+{
+}
+
+HistoryScroll::~HistoryScroll()
+{
+  delete m_histType;
+}
+
+bool HistoryScroll::hasScroll()
+{
+  return true;
+}
 
-// History Scroll //////////////////////////////////////
+#if 0
+// History Scroll File //////////////////////////////////////
 
 /* 
    The history scroll makes a Row(Row(Cell)) from
@@ -145,64 +148,343 @@
    at 0 in cells.
 */
 
-HistoryScroll::HistoryScroll()
+HistoryScrollFile::HistoryScrollFile(const QString &logFileName)
+  : HistoryScroll(new HistoryTypeFile(logFileName)),
+  m_logFileName(logFileName)
 {
 }
 
-HistoryScroll::~HistoryScroll()
+HistoryScrollFile::~HistoryScrollFile()
 {
 }
  
-void HistoryScroll::setScroll(bool on)
+int HistoryScrollFile::getLines()
 {
-  index.setScroll(on);
-  cells.setScroll(on);
-}
- 
-bool HistoryScroll::hasScroll()
-{
-  return index.hasScroll() && cells.hasScroll();
-}
-
-int HistoryScroll::getLines()
-{
-  if (!hasScroll()) return 0;
   return index.len() / sizeof(int);
 }
 
-int HistoryScroll::getLineLen(int lineno)
+int HistoryScrollFile::getLineLen(int lineno)
 {
-  if (!hasScroll()) return 0;
   return (startOfLine(lineno+1) - startOfLine(lineno)) / sizeof(ca);
 }
 
-int HistoryScroll::startOfLine(int lineno)
+int HistoryScrollFile::startOfLine(int lineno)
 {
   if (lineno <= 0) return 0;
-  if (!hasScroll()) return 0;
   if (lineno <= getLines())
-  { int res;
+    { int res;
     index.get((unsigned char*)&res,sizeof(int),(lineno-1)*sizeof(int));
     return res;
-  }
+    }
   return cells.len();
 }
 
-void HistoryScroll::getCells(int lineno, int colno, int count, ca res[])
+void HistoryScrollFile::getCells(int lineno, int colno, int count, ca res[])
 {
-  assert(hasScroll());
   cells.get((unsigned \
char*)res,count*sizeof(ca),startOfLine(lineno)+colno*sizeof(ca));  }
 
-void HistoryScroll::addCells(ca text[], int count)
+void HistoryScrollFile::addCells(ca text[], int count)
 {
-  if (!hasScroll()) return;
   cells.add((unsigned char*)text,count*sizeof(ca));
 }
 
-void HistoryScroll::addLine()
+void HistoryScrollFile::addLine()
 {
-  if (!hasScroll()) return;
   int locn = cells.len();
   index.add((unsigned char*)&locn,sizeof(int));
 }
+
+
+// History Scroll Buffer //////////////////////////////////////
+HistoryScrollBuffer::HistoryScrollBuffer(unsigned int maxNbLines)
+  : HistoryScroll(new HistoryTypeBuffer(maxNbLines)),
+    m_maxNbLines(maxNbLines),
+    m_nbLines(0),
+    m_arrayIndex(0)
+{
+  m_histBuffer.setAutoDelete(true);
+  m_histBuffer.resize(maxNbLines);
+}
+
+HistoryScrollBuffer::~HistoryScrollBuffer()
+{
+}
+
+void HistoryScrollBuffer::addCells(ca a[], int count)
+{
+  //unsigned int nbLines = countLines(bytes, len);
+
+  histline* newLine = new histline;
+
+  newLine->duplicate(a, count);
+  
+  ++m_arrayIndex;
+  if (m_arrayIndex >= m_maxNbLines) m_arrayIndex = 0;
+
+  if (m_nbLines < m_maxNbLines - 1) ++m_nbLines;
+
+  // m_histBuffer.remove(m_arrayIndex); // not necessary
+  m_histBuffer.insert(m_arrayIndex, newLine);
+}
+
+void HistoryScrollBuffer::addLine()
+{
+  // ? Do nothing
+}
+
+int HistoryScrollBuffer::getLines()
+{
+  return m_nbLines; // m_histBuffer.size();
+}
+
+int HistoryScrollBuffer::getLineLen(int lineno)
+{
+  if (lineno >= m_maxNbLines) return 0;
+  
+  histline *l = m_histBuffer[lineno];
+
+  return l ? l->size() : 0;
+}
+
+
+void HistoryScrollBuffer::getCells(int lineno, int colno, int count, ca res[])
+{
+  if (!count) return;
+
+  assert (lineno < m_maxNbLines);
+  
+  histline *l = m_histBuffer[lineno];
+
+  if (!l) {
+    memset(res, 0, count * sizeof(ca));
+    return;
+  }
+
+  assert(colno < l->size() || count == 0);
+    
+  memcpy(res, l->data() + colno, count * sizeof(ca));
+}
+
+void HistoryScrollBuffer::setMaxNbLines(unsigned int nbLines)
+{
+  m_maxNbLines = nbLines;
+  m_histBuffer.resize(m_maxNbLines);
+}
+
+#endif
+
+// History Scroll None //////////////////////////////////////
+
+HistoryScrollNone::HistoryScrollNone()
+  : HistoryScroll(new HistoryTypeNone())
+{
+}
+
+HistoryScrollNone::~HistoryScrollNone()
+{
+}
+
+bool HistoryScrollNone::hasScroll()
+{
+  return false;
+}
+
+int  HistoryScrollNone::getLines()
+{
+  return 0;
+}
+
+int  HistoryScrollNone::getLineLen(int lineno)
+{
+  return 0;
+}
+
+void HistoryScrollNone::getCells(int lineno, int colno, int count, ca res[])
+{
+}
+
+void HistoryScrollNone::addCells(ca a[], int count)
+{
+}
+
+void HistoryScrollNone::addLine()
+{
+}
+
+// History Scroll BlockArray //////////////////////////////////////
+
+HistoryScrollBlockArray::HistoryScrollBlockArray(size_t size)
+  : HistoryScroll(new HistoryTypeBlockArray(size))
+{
+  m_lineLengths.setAutoDelete(true);
+  m_blockArray.setSize(size);
+}
+
+HistoryScrollBlockArray::~HistoryScrollBlockArray()
+{
+}
+
+int  HistoryScrollBlockArray::getLines()
+{
+//   kdDebug() << "HistoryScrollBlockArray::getLines() : "
+//             << m_lineLengths.count() << endl;
+
+  return m_lineLengths.count();
+}
+
+int  HistoryScrollBlockArray::getLineLen(int lineno)
+{
+  size_t *pLen = m_lineLengths[lineno];
+  size_t res = pLen ? *pLen : 0;
+
+  return res;
+}
+
+void HistoryScrollBlockArray::getCells(int lineno, int colno, int count, ca res[])
+{
+  if (!count) return;
+
+  const Block *b = m_blockArray.at(lineno);
+
+  if (!b) {
+    memset(res, 0, count * sizeof(ca)); // still better than random data
+    return;
+  }
+
+  assert(((colno + count) * sizeof(ca)) < ENTRIES);
+  memcpy(res, b->data + (colno * sizeof(ca)), count * sizeof(ca));
+}
+
+void HistoryScrollBlockArray::addCells(ca a[], int count)
+{
+  Block *b = m_blockArray.lastBlock();
+  
+  assert (b);
+
+  // put cells in block's data
+  assert((count * sizeof(ca)) < ENTRIES);
+
+  memset(b->data, 0, ENTRIES);
+
+  memcpy(b->data, a, count * sizeof(ca));
+  b->size = count * sizeof(ca);
+
+  size_t res = m_blockArray.newBlock();
+  assert (res > 0);
+
+  // store line length
+  size_t *pLen = new size_t;
+  *pLen = count;
+  
+  m_lineLengths.replace(m_blockArray.getCurrent(), pLen);
+
+}
+
+void HistoryScrollBlockArray::addLine()
+{
+}
+
+//////////////////////////////////////////////////////////////////////
+// History Types
+//////////////////////////////////////////////////////////////////////
+
+HistoryType::HistoryType()
+{
+}
+
+HistoryType::~HistoryType()
+{
+}
+
+//////////////////////////////
+
+HistoryTypeNone::HistoryTypeNone()
+{
+}
+
+bool HistoryTypeNone::isOn() const
+{
+  return false;
+}
+
+HistoryScroll* HistoryTypeNone::getScroll() const
+{
+  return new HistoryScrollNone();
+}
+
+unsigned int HistoryTypeNone::getSize() const
+{
+  return 0;
+}
+
+//////////////////////////////
+
+HistoryTypeBlockArray::HistoryTypeBlockArray(size_t size)
+  : m_size(size)
+{
+}
+
+bool HistoryTypeBlockArray::isOn() const
+{
+  return true;
+}
+
+unsigned int HistoryTypeBlockArray::getSize() const
+{
+  return m_size;
+}
+
+HistoryScroll* HistoryTypeBlockArray::getScroll() const
+{
+  return new HistoryScrollBlockArray(m_size);
+}
+
+
+#if 0 // Disabled for now 
+
+//////////////////////////////
+
+HistoryTypeBuffer::HistoryTypeBuffer(unsigned int nbLines)
+  : m_nbLines(nbLines)
+{
+}
+
+bool HistoryTypeBuffer::isOn() const
+{
+  return true;
+}
+
+unsigned int HistoryTypeBuffer::getNbLines() const
+{
+  return m_nbLines;
+}
+
+HistoryScroll* HistoryTypeBuffer::getScroll() const
+{
+  return new HistoryScrollBuffer(m_nbLines);
+}
+
+//////////////////////////////
+
+HistoryTypeFile::HistoryTypeFile(const QString& fileName)
+  : m_fileName(fileName)
+{
+}
+
+bool HistoryTypeFile::isOn() const
+{
+  return true;
+}
+
+const QString& HistoryTypeFile::getFileName() const
+{
+  return m_fileName;
+}
+
+HistoryScroll* HistoryTypeFile::getScroll() const
+{
+  return new HistoryScrollFile(m_fileName);
+}
+
+#endif
Index: TEScreen.C
===================================================================
RCS file: /home/kde/kdebase/konsole/src/TEScreen.C,v
retrieving revision 1.41
diff -u -r1.41 TEScreen.C
--- TEScreen.C	2001/03/17 14:30:42	1.41
+++ TEScreen.C	2001/05/31 23:36:32
@@ -61,20 +61,35 @@
 /*! creates a `TEScreen' of `lines' lines and `columns' columns.
 */
 
-TEScreen::TEScreen(int lines, int columns)
-{
-  this->lines   = lines;
-  this->columns = columns;
-
-  // we add +1 here as under some weired circumstances konsole crashes
-  // reading out of bound. As a crash is worse, we afford the minimum
-  // of added memory
-  image      = (ca*) malloc((lines+1)*columns*sizeof(ca));
-  tabstops   = NULL; initTabStops();
-  cuX = cuY = sa_cu_re = cu_re = sa_cu_fg = cu_fg = sa_cu_bg = cu_bg = 0;
+TEScreen::TEScreen(int l, int c)
+  : lines(l),
+    columns(c),
+    image(new ca[(lines+1)*columns]),
+    histCursor(0),
+    hist(new HistoryScrollNone()),
+    cuX(0), cuY(0),
+    cu_fg(0), cu_bg(0), cu_re(0),
+    tmargin(0), bmargin(0),
+    tabstops(0),
+    sel_begin(0), sel_TL(0), sel_BR(0),
+    ef_fg(0), ef_bg(0), ef_re(0),
+    sa_cuX(0), sa_cuY(0),
+    sa_cu_re(0), sa_cu_fg(0), sa_cu_bg(0)
+{
+  /*
+    this->lines   = lines;
+    this->columns = columns;
+
+    // we add +1 here as under some weired circumstances konsole crashes
+    // reading out of bound. As a crash is worse, we afford the minimum
+    // of added memory
+    image      = (ca*) malloc((lines+1)*columns*sizeof(ca));
+    tabstops   = NULL; initTabStops();
+    cuX = cuY = sa_cu_re = cu_re = sa_cu_fg = cu_fg = sa_cu_bg = cu_bg = 0;
 
-  histCursor = 0;
-
+    histCursor = 0;
+  */
+  initTabStops();
   clearSelection();
   reset();
 }
@@ -84,8 +99,9 @@
 
 TEScreen::~TEScreen()
 {
-  free(image);
-  if (tabstops) free(tabstops);
+  delete[] image;
+  delete[] tabstops;
+  delete hist;
 }
 
 /* ------------------------------------------------------------------------- */
@@ -421,7 +437,7 @@
     newimg[y*new_columns+x].b = image[loc(x,y)].b;
     newimg[y*new_columns+x].r = image[loc(x,y)].r;
   }
-  free(image);
+  delete[] image;
   image = newimg;
   lines = new_lines;
   columns = new_columns;
@@ -512,13 +528,13 @@
   ca* merged = (ca*)malloc(lines*columns*sizeof(ca));
   ca dft(' ',DEFAULT_FORE_COLOR,DEFAULT_BACK_COLOR,DEFAULT_RENDITION);
 
-  for (y = 0; (y < lines) && (y < (hist.getLines()-histCursor)); y++)
+  for (y = 0; (y < lines) && (y < (hist->getLines()-histCursor)); y++)
   {
-    int len = QMIN(columns,hist.getLineLen(y+histCursor));
+    int len = QMIN(columns,hist->getLineLen(y+histCursor));
     int yp  = y*columns;
     int yq  = (y+histCursor)*columns;
 
-    hist.getCells(y+histCursor,0,len,merged+yp);
+    hist->getCells(y+histCursor,0,len,merged+yp);
     for (x = len; x < columns; x++) merged[yp+x] = dft;
     for (x = 0; x < columns; x++)
     {   int p=x + yp; int q=x + yq;
@@ -526,13 +542,13 @@
           reverseRendition(&merged[p]); // for selection
     }
   }
-  if (lines >= hist.getLines()-histCursor)
+  if (lines >= hist->getLines()-histCursor)
   {
-    for (y = (hist.getLines()-histCursor); y < lines ; y++)
+    for (y = (hist->getLines()-histCursor); y < lines ; y++)
     {
        int yp  = y*columns;
        int yq  = (y+histCursor)*columns;
-       int yr =  (y-hist.getLines()+histCursor)*columns;
+       int yr =  (y-hist->getLines()+histCursor)*columns;
        for (x = 0; x < columns; x++)
        { int p = x + yp; int q = x + yq; int r = x + yr;
          merged[p] = image[r];
@@ -548,11 +564,11 @@
     for (i = 0; i < n; i++)
       reverseRendition(&merged[i]); // for reverse display
   }
-//  if (getMode(MODE_Cursor) && (cuY+(hist.getLines()-histCursor) < lines)) // \
cursor visible +//  if (getMode(MODE_Cursor) && (cuY+(hist->getLines()-histCursor) < \
lines)) // cursor visible  
-  int loc_ = loc(cuX, cuY+hist.getLines()-histCursor);
+  int loc_ = loc(cuX, cuY+hist->getLines()-histCursor);
   if(getMode(MODE_Cursor) && loc_ < columns*lines)
-    reverseRendition(&merged[loc(cuX,cuY+(hist.getLines()-histCursor))]);
+    reverseRendition(&merged[loc(cuX,cuY+(hist->getLines()-histCursor))]);
   return merged;
 }
 
@@ -618,8 +634,9 @@
 
 void TEScreen::initTabStops()
 {
-  if (tabstops) free(tabstops);
-  tabstops = (bool*)malloc(columns*sizeof(bool));
+  delete[] tabstops;
+  tabstops = new bool[columns];
+
   // Arrg! The 1st tabstop has to be one longer than the other.
   // i.e. the kids start counting from 0 instead of 1.
   // Other programs might behave correctly. Be aware.
@@ -647,7 +664,7 @@
 void TEScreen::checkSelection(int from, int to)
 {
   if (sel_begin == -1) return;
-  int scr_TL = loc(0, hist.getLines());
+  int scr_TL = loc(0, hist->getLines());
   //Clear entire selection if it overlaps region [from, to]
   if ( (sel_BR > (from+scr_TL) )&&(sel_TL < (to+scr_TL)) )
   {
@@ -791,7 +808,7 @@
 
 void TEScreen::clearImage(int loca, int loce, char c)
 { int i;
-  int scr_TL=loc(0,hist.getLines());
+  int scr_TL=loc(0,hist->getLines());
   //FIXME: check positions
 
   //Clear entire selection if it overlaps region to be moved...
@@ -998,7 +1015,7 @@
 
   int *m;			// buffer to fill.
   int s, d;			// source index, dest. index.
-  int hist_BR = loc(0, hist.getLines());
+  int hist_BR = loc(0, hist->getLines());
   int hY = sel_TL / columns;
   int hX = sel_TL % columns;
   int eol;			// end of line
@@ -1015,9 +1032,9 @@
   while (s <= sel_BR)
     {
       if (s < hist_BR)
-	{			// get lines from hist.history
+	{			// get lines from hist->history
 				// buffer.
-	  eol = hist.getLineLen(hY);
+	  eol = hist->getLineLen(hY);
 
 	  if ((hY == (sel_BR / columns)) &&
 	      (eol >= (sel_BR % columns)))
@@ -1027,7 +1044,7 @@
 	  
 	  while (hX < eol)
 	    {
-	      m[d++] = hist.getCell(hY, hX++).c;
+	      m[d++] = hist->getCell(hY, hX++).c;
 	      s++;
 	    }
 
@@ -1176,11 +1193,11 @@
     while (end >= 0 && image[end] == dft)
       end -= 1;
 
-    hist.addCells(image,end+1);
-    hist.addLine();
+    hist->addCells(image,end+1);
+    hist->addLine();
 
     // adjust history cursor
-    histCursor += (hist.getLines()-1 == histCursor);
+    histCursor += (hist->getLines()-1 == histCursor);
   }
 
   if (!hasScroll()) histCursor = 0; //FIXME: a poor workaround
@@ -1198,17 +1215,23 @@
 
 int TEScreen::getHistLines()
 {
-  return hist.getLines();
+  return hist->getLines();
 }
 
-void TEScreen::setScroll(bool on)
+void TEScreen::setScroll(const HistoryType& t)
 {
   histCursor = 0;
   clearSelection();
-  hist.setScroll(on);
+  delete hist;
+  hist = t.getScroll();
 }
 
 bool TEScreen::hasScroll()
+{
+  return hist->hasScroll();
+}
+
+const HistoryType& TEScreen::getScroll()
 {
-  return hist.hasScroll();
+  return hist->getType();
 }
Index: TEmulation.C
===================================================================
RCS file: /home/kde/kdebase/konsole/src/TEmulation.C,v
retrieving revision 1.21
diff -u -r1.21 TEmulation.C
--- TEmulation.C	2001/03/19 14:37:37	1.21
+++ TEmulation.C	2001/05/31 23:36:33
@@ -92,19 +92,21 @@
 /*!
 */
 
-TEmulation::TEmulation(TEWidget* gui)
-: decoder(0)
+TEmulation::TEmulation(TEWidget* w)
+: gui(w),
+  scr(0),
+  connected(false),
+  codec(0),
+  decoder(0),
+  keytrans(0),
+  bulk_nlcnt(0),
+  bulk_incnt(0)
 {
-  this->gui = gui;
 
   screen[0] = new TEScreen(gui->Lines(),gui->Columns());
   screen[1] = new TEScreen(gui->Lines(),gui->Columns());
   scr = screen[0];
 
-  bulk_nlcnt = 0; // reset bulk newline counter
-  bulk_incnt = 0; // reset bulk counter
-  connected  = FALSE;
-
   QObject::connect(&bulk_timer, SIGNAL(timeout()), this, SLOT(showBulk()) );
   QObject::connect(gui,SIGNAL(changedImageSizeSignal(int,int)),
                    this,SLOT(onImageSizeChange(int,int)));
@@ -141,16 +143,17 @@
   scr = screen[n&1];
 }
 
-void TEmulation::setHistory(bool on)
+void TEmulation::setHistory(const HistoryType& t)
 {
-  screen[0]->setScroll(on);
+  screen[0]->setScroll(t);
+
   if (!connected) return;
   showBulk();
 }
 
-bool TEmulation::history()
+const HistoryType& TEmulation::history()
 {
-  return screen[0]->hasScroll();
+  return screen[0]->getScroll();
 }
 
 void TEmulation::setCodec(int c)
Index: konsole.C
===================================================================
RCS file: /home/kde/kdebase/konsole/src/konsole.C,v
retrieving revision 1.126
diff -u -r1.126 konsole.C
--- konsole.C	2001/05/23 00:24:38	1.126
+++ konsole.C	2001/05/31 23:36:36
@@ -80,6 +80,11 @@
 #include <qobjectlist.h>
 #include <ktoolbarbutton.h>
 
+#include <qspinbox.h>
+#include <qradiobutton.h>
+#include <qlayout.h>
+#include <qbuttongroup.h>
+
 #include <stdio.h>
 #include <stdlib.h>
 
@@ -204,6 +209,7 @@
 ,skip_exit_query(false) // used to skip the query when closed by the session \
management  ,b_warnQuit(false)
 ,alreadyNoticedBackgroundChange_(false)
+,m_histSize(0)
 {
   //QTime time;
   //time.start();
@@ -272,6 +278,11 @@
   // activate and run first session //////////////////////////////////////////
   // FIXME: this slows it down if --type is given, but prevents a crash (malte)
   se = newSession(co);
+  if (!m_histSize)
+    se->setHistory(HistoryTypeNone());
+  else
+    se->setHistory(HistoryTypeBlockArray(m_histSize));
+
   delete co;
   //kdDebug()<<"Konsole ctor(): runSession()"<<endl;
   te->currentSession = se;
@@ -434,8 +445,11 @@
    // Schema
    m_options->insertItem( SmallIconSet( "colorize" ), i18n( "Schema" ), m_schema);
    m_options->insertSeparator();
-   m_options->insertItem( i18n("&History"), 3 );
-   m_options->setItemEnabled(3, false);
+
+   KAction *historyType = new KAction(i18n("History..."), 0, this,
+                                      SLOT(slotHistoryType()), this);
+   historyType->plug(m_options);
+   
    m_options->insertSeparator();
    m_options->insertItem( SmallIconSet( "charset" ), i18n( "&Codec" ), m_codec);
    m_options->insertItem( SmallIconSet( "key_bindings" ), i18n( "&Keyboard" ), \
m_keytab ); @@ -699,6 +713,8 @@
   config->writeEntry("scrollbar",n_scroll);
   config->writeEntry("keytab",n_keytab);
   config->writeEntry("WarnQuit", b_warnQuit);
+  if (se)
+    config->writeEntry("history", se->history().getSize());
 
   if (args.count() > 0) config->writeEntry("konsolearguments", args);
   config->writeEntry("class",name());
@@ -772,6 +788,9 @@
    te->setFrameStyle( b_framevis?(QFrame::WinPanel|QFrame::Sunken):QFrame::NoFrame \
);  te->setColorTable(sch->table());
 
+   // History
+   m_histSize = config->readNumEntry("history",0);
+   KONSOLEDEBUG << "Hist size : " << m_histSize << endl;
 
    if (m_menuCreated)
    {
@@ -988,18 +1007,10 @@
                      : QFrame::NoFrame );
 }
 
-void Konsole::setHistory(bool on)
-{
-  b_scroll = on;
-  m_options->setItemChecked(3,b_scroll);
-  if (se) se->setHistory( b_scroll );
-}
 
 void Konsole::opt_menu_activated(int item)
 {
   switch( item )  {
-    case 3: setHistory(!b_scroll);
-            break;
     case 5: setFullScreen(!b_fullscreen);
             break;
     case 8:
@@ -1357,7 +1368,8 @@
   s->setSchemaNo(schmno);
 //kdDebug()<<"setTitle Konsole 1319 "<< txt << endl;
   s->setTitle(txt);
-  s->setHistory(b_scroll); //FIXME: take from schema
+
+  //s->setHistory(b_scroll); //FIXME: take from schema
 
   addSession(s);
   runSession(s); // activate and run
@@ -1633,6 +1645,98 @@
     toolBar()->updateRects();
 //  }
 }
+
+
+//////////////////////////////////////////////////////////////////////
+
+HistoryTypeDialog::HistoryTypeDialog(const HistoryType& histType, QWidget *parent)
+  : KDialogBase(Plain, i18n("History Configuration"),
+                Help | Default | Ok | Cancel, Ok,
+                parent),
+    m_size(0)
+{
+  QFrame *mainFrame = plainPage();
+  
+  QGridLayout *grid = new QGridLayout(mainFrame, 2, 2);
+
+  QButtonGroup *btnGroup = new QButtonGroup(mainFrame);
+  btnGroup->hide();
+
+  QRadioButton *btnOff    = new QRadioButton(i18n("Off"),      mainFrame);
+  QRadioButton *btnBuffer = new QRadioButton(i18n("Buffer :"), mainFrame);
+
+  btnGroup->insert(btnOff);
+  btnGroup->insert(btnBuffer);
+
+  QObject::connect(btnOff, SIGNAL(clicked()),
+                   this,   SLOT(slotNoHistChoosen()));
+
+  QObject::connect(btnBuffer, SIGNAL(clicked()),
+                   this,      SLOT(slotBufferHistChoosen()));
+
+  grid->addWidget(btnOff,    0, 0);
+  grid->addWidget(btnBuffer, 1, 0);
+
+  
+  m_size = new QSpinBox(0, 10 * 1000 * 1000, 1, mainFrame);
+  grid->addWidget(m_size, 1, 1);
+
+  if (!histType.isOn()) {
+
+    btnOff->setChecked(true);
+    slotNoHistChoosen();
+
+  } else {
+
+    btnBuffer->setChecked(true);
+    m_size->setValue(histType.getSize());
+    slotBufferHistChoosen();
+  }
+  
+}
+
+void HistoryTypeDialog::slotBufferHistChoosen()
+{
+  kdDebug() << "Konsole::slotBufferHistChoosen\n";
+  m_isOff = false;
+  m_size->setEnabled(true);
+  m_size->setFocus();
+}
+
+void HistoryTypeDialog::slotNoHistChoosen()
+{
+  kdDebug() << "Konsole::slotNoHistChoosen\n";
+  m_isOff = true;
+  m_size->setEnabled(false);
+}
+
+unsigned int HistoryTypeDialog::bufferSize() const
+{
+  return m_isOff ? 0 : m_size->value();
+}
+
+
+
+
+void Konsole::slotHistoryType()
+{
+  kdDebug() << "Konsole::slotHistoryType()\n";
+  if (!se) return;
+  
+  HistoryTypeDialog dlg(se->history(), this);
+  if (dlg.exec()) {
+
+    if (dlg.isOff())
+
+      se->setHistory(HistoryTypeNone());
+    
+    else
+
+      se->setHistory(HistoryTypeBlockArray(dlg.bufferSize()));
+  }
+}
+
+//////////////////////////////////////////////////////////////////////
 
 
 void Konsole::slotWordSeps() {
Index: konsole_part.C
===================================================================
RCS file: /home/kde/kdebase/konsole/src/konsole_part.C,v
retrieving revision 1.30
diff -u -r1.30 konsole_part.C
--- konsole_part.C	2001/05/07 02:17:30	1.30
+++ konsole_part.C	2001/05/31 23:36:36
@@ -141,7 +141,7 @@
       te->setColorTable(ctable); 
     }
   
-  initial->setHistory(true);
+  initial->setHistory(HistoryTypeBlockArray(1000));
 
   // setXMLFile("konsole_part.rc");
 
Index: session.C
===================================================================
RCS file: /home/kde/kdebase/konsole/src/session.C,v
retrieving revision 1.33
diff -u -r1.33 session.C
--- session.C	2001/05/12 13:26:34	1.33
+++ session.C	2001/05/31 23:36:36
@@ -146,12 +146,12 @@
   return title;
 }
 
-void TESession::setHistory(bool on)
+void TESession::setHistory(const HistoryType &hType)
 {
-  em->setHistory( on );
+  em->setHistory(hType);
 }
 
-bool TESession::history()
+const HistoryType& TESession::history()
 {
   return em->history();
 }



[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic