author | llornkcor <llornkcor> | 2002-10-31 14:49:24 (UTC) |
---|---|---|
committer | llornkcor <llornkcor> | 2002-10-31 14:49:24 (UTC) |
commit | c3a6f53669140cf9e3c953772c610cd91d69ab78 (patch) (unidiff) | |
tree | ab8579e66582aedc01da2aea4272e754902e9287 | |
parent | 7d8a563125b981718ae963ba6308e3506e870045 (diff) | |
download | opie-c3a6f53669140cf9e3c953772c610cd91d69ab78.zip opie-c3a6f53669140cf9e3c953772c610cd91d69ab78.tar.gz opie-c3a6f53669140cf9e3c953772c610cd91d69ab78.tar.bz2 |
no wrap mode taken from console, gui needs work
-rw-r--r-- | core/apps/embeddedkonsole/TEHistory.cpp | 29 | ||||
-rw-r--r-- | core/apps/embeddedkonsole/TEScreen.cpp | 415 | ||||
-rw-r--r-- | core/apps/embeddedkonsole/TEWidget.cpp | 169 | ||||
-rw-r--r-- | core/apps/embeddedkonsole/TEWidget.h | 15 | ||||
-rw-r--r-- | core/apps/embeddedkonsole/TEmulation.cpp | 43 | ||||
-rw-r--r-- | core/apps/embeddedkonsole/konsole.cpp | 34 |
6 files changed, 491 insertions, 214 deletions
diff --git a/core/apps/embeddedkonsole/TEHistory.cpp b/core/apps/embeddedkonsole/TEHistory.cpp index 317ce57..db9d10c 100644 --- a/core/apps/embeddedkonsole/TEHistory.cpp +++ b/core/apps/embeddedkonsole/TEHistory.cpp | |||
@@ -4,21 +4,21 @@ | |||
4 | /* */ | 4 | /* */ |
5 | /* -------------------------------------------------------------------------- */ | 5 | /* -------------------------------------------------------------------------- */ |
6 | /* */ | 6 | /* */ |
7 | /* Copyright (c) 1997,1998 by Lars Doelle <lars.doelle@on-line.de> */ | 7 | /* Copyright (c) 1997,1998 by Lars Doelle <lars.doelle@on-line.de> */ |
8 | /* */ | 8 | /* */ |
9 | /* This file is part of Konsole - an X terminal for KDE */ | 9 | /* This file is part of Konsole - an X terminal for KDE */ |
10 | /* */ | 10 | /* */ |
11 | /* -------------------------------------------------------------------------- */ | 11 | /* -------------------------------------------------------------------------- */ |
12 | /* */ | 12 | /* */ |
13 | /* Ported Konsole to Qt/Embedded */ | 13 | /* Ported Konsole to Qt/Embedded */ |
14 | /* */ | 14 | /* */ |
15 | /* Copyright (C) 2000 by John Ryland <jryland@trolltech.com> */ | 15 | /* Copyright (C) 2000 by John Ryland <jryland@trolltech.com> */ |
16 | /* */ | 16 | /* */ |
17 | /* -------------------------------------------------------------------------- */ | 17 | /* -------------------------------------------------------------------------- */ |
18 | 18 | ||
19 | #include "TEHistory.h" | 19 | #include "TEHistory.h" |
20 | #include <stdlib.h> | 20 | #include <stdlib.h> |
21 | #include <assert.h> | 21 | #include <assert.h> |
22 | #include <stdio.h> | 22 | #include <stdio.h> |
23 | #include <sys/types.h> | 23 | #include <sys/types.h> |
24 | #include <unistd.h> | 24 | #include <unistd.h> |
@@ -112,28 +112,34 @@ void HistoryBuffer::setScroll(bool on) | |||
112 | bool HistoryBuffer::hasScroll() | 112 | bool HistoryBuffer::hasScroll() |
113 | { | 113 | { |
114 | return ion >= 0; | 114 | return ion >= 0; |
115 | } | 115 | } |
116 | 116 | ||
117 | void HistoryBuffer::add(const unsigned char* bytes, int len) | 117 | void HistoryBuffer::add(const unsigned char* bytes, int len) |
118 | { int rc; | 118 | { int rc; |
119 | assert(hasScroll()); | 119 | assert(hasScroll()); |
120 | rc = lseek(ion,length,SEEK_SET); if (rc < 0) { perror("HistoryBuffer::add.seek"); setScroll(FALSE); return; } | 120 | rc = lseek( ion, length, SEEK_SET); |
121 | rc = write(ion,bytes,len); if (rc < 0) { perror("HistoryBuffer::add.write"); setScroll(FALSE); return; } | 121 | if (rc < 0) { perror("HistoryBuffer::add.seek"); setScroll(FALSE); return; } |
122 | rc = write( ion, bytes, len); | ||
123 | if (rc < 0) { perror("HistoryBuffer::add.write"); setScroll(FALSE); return; } | ||
122 | length += rc; | 124 | length += rc; |
123 | } | 125 | } |
124 | 126 | ||
125 | void HistoryBuffer::get(unsigned char* bytes, int len, int loc) | 127 | void HistoryBuffer::get(unsigned char* bytes, int len, int loc) { |
126 | { int rc; | 128 | int rc; |
127 | assert(hasScroll()); | 129 | assert(hasScroll()); |
130 | // qDebug("history get len %d, loc %d, length %d", len, loc, length); | ||
128 | if (loc < 0 || len < 0 || loc + len > length) | 131 | if (loc < 0 || len < 0 || loc + len > length) |
129 | fprintf(stderr,"getHist(...,%d,%d): invalid args.\n",len,loc); | 132 | fprintf(stderr,"getHist(...,%d,%d): invalid args.\n",len,loc); |
130 | rc = lseek(ion,loc,SEEK_SET); if (rc < 0) { perror("HistoryBuffer::get.seek"); setScroll(FALSE); return; } | 133 | |
131 | rc = read(ion,bytes,len); if (rc < 0) { perror("HistoryBuffer::get.read"); setScroll(FALSE); return; } | 134 | rc = lseek( ion, loc, SEEK_SET); |
135 | if (rc < 0) { perror("HistoryBuffer::get.seek"); setScroll(FALSE); return; } | ||
136 | rc = read( ion, bytes, len); | ||
137 | if (rc < 0) { perror("HistoryBuffer::get.read"); setScroll(FALSE); return; } | ||
132 | } | 138 | } |
133 | 139 | ||
134 | int HistoryBuffer::len() | 140 | int HistoryBuffer::len() |
135 | { | 141 | { |
136 | return length; | 142 | return length; |
137 | } | 143 | } |
138 | 144 | ||
139 | // History Scroll ////////////////////////////////////// | 145 | // History Scroll ////////////////////////////////////// |
@@ -190,17 +196,18 @@ int HistoryScroll::startOfLine(int lineno) | |||
190 | return res; | 196 | return res; |
191 | } | 197 | } |
192 | return cells.len(); | 198 | return cells.len(); |
193 | } | 199 | } |
194 | 200 | ||
195 | void HistoryScroll::getCells(int lineno, int colno, int count, ca res[]) | 201 | void HistoryScroll::getCells(int lineno, int colno, int count, ca res[]) |
196 | { | 202 | { |
197 | assert(hasScroll()); | 203 | assert(hasScroll()); |
198 | cells.get((unsigned char*)res,count*sizeof(ca),startOfLine(lineno)+colno*sizeof(ca)); | 204 | //get(unsigned char* bytes, int len, int loc) |
205 | cells.get( (unsigned char*)res, count * sizeof(ca), startOfLine( lineno) + colno * sizeof(ca) ); | ||
199 | } | 206 | } |
200 | 207 | ||
201 | void HistoryScroll::addCells(ca text[], int count) | 208 | void HistoryScroll::addCells(ca text[], int count) |
202 | { | 209 | { |
203 | if (!hasScroll()) return; | 210 | if (!hasScroll()) return; |
204 | cells.add((unsigned char*)text,count*sizeof(ca)); | 211 | cells.add((unsigned char*)text,count*sizeof(ca)); |
205 | } | 212 | } |
206 | 213 | ||
diff --git a/core/apps/embeddedkonsole/TEScreen.cpp b/core/apps/embeddedkonsole/TEScreen.cpp index a3d115d..50807d3 100644 --- a/core/apps/embeddedkonsole/TEScreen.cpp +++ b/core/apps/embeddedkonsole/TEScreen.cpp | |||
@@ -4,22 +4,23 @@ | |||
4 | /* */ | 4 | /* */ |
5 | /* -------------------------------------------------------------------------- */ | 5 | /* -------------------------------------------------------------------------- */ |
6 | /* */ | 6 | /* */ |
7 | /* Copyright (c) 1997,1998 by Lars Doelle <lars.doelle@on-line.de> */ | 7 | /* Copyright (c) 1997,1998 by Lars Doelle <lars.doelle@on-line.de> */ |
8 | /* */ | 8 | /* */ |
9 | /* This file is part of Konsole - an X terminal for KDE */ | 9 | /* This file is part of Konsole - an X terminal for KDE */ |
10 | /* */ | 10 | /* */ |
11 | /* -------------------------------------------------------------------------- */ | 11 | /* -------------------------------------------------------------------------- */ |
12 | /* */ | 12 | /* */ |
13 | /* Ported Konsole to Qt/Embedded */ | 13 | /* Ported Konsole to Qt/Embedded */ |
14 | /* */ | 14 | /* */ |
15 | /* Copyright (C) 2000 by John Ryland <jryland@trolltech.com> */ | 15 | /* Copyright (C) 2000 by John Ryland <jryland@trolltech.com> */ |
16 | /* */ | 16 | /* */ |
17 | /* -------------------------------------------------------------------------- */ | 17 | /* -------------------------------------------------------------------------- */ |
18 | // enhancements added by L.J. Potter <ljp@llornkcor.com> | ||
18 | 19 | ||
19 | /*! \file | 20 | /*! \file |
20 | */ | 21 | */ |
21 | 22 | ||
22 | /*! \class TEScreen | 23 | /*! \class TEScreen |
23 | 24 | ||
24 | \brief The image manipulated by the emulation. | 25 | \brief The image manipulated by the emulation. |
25 | 26 | ||
@@ -45,38 +46,41 @@ | |||
45 | #include <stdlib.h> | 46 | #include <stdlib.h> |
46 | #include <unistd.h> | 47 | #include <unistd.h> |
47 | // #include <kdebug.h> | 48 | // #include <kdebug.h> |
48 | 49 | ||
49 | #include <assert.h> | 50 | #include <assert.h> |
50 | #include <string.h> | 51 | #include <string.h> |
51 | #include <ctype.h> | 52 | #include <ctype.h> |
52 | 53 | ||
54 | #include <qpe/config.h> | ||
53 | #include "TEScreen.h" | 55 | #include "TEScreen.h" |
54 | 56 | ||
55 | #define HERE printf("%s(%d): here\n",__FILE__,__LINE__) | 57 | #define HERE printf("%s(%d): here\n",__FILE__,__LINE__) |
56 | 58 | ||
57 | //FIXME: this is emulation specific. Use FALSE for xterm, TRUE for ANSI. | 59 | //FIXME: this is emulation specific. Use FALSE for xterm, TRUE for ANSI. |
58 | //FIXME: see if we can get this from terminfo. | 60 | //FIXME: see if we can get this from terminfo. |
59 | #define BS_CLEARS FALSE | 61 | #define BS_CLEARS FALSE |
60 | 62 | ||
61 | #define loc(X,Y) ((Y)*columns+(X)) | 63 | #define loc(X,Y) ((Y) * columns + (X)) |
62 | 64 | ||
63 | /*! creates a `TEScreen' of `lines' lines and `columns' columns. | 65 | /*! creates a `TEScreen' of `lines' lines and `columns' columns. |
64 | */ | 66 | */ |
65 | 67 | ||
66 | TEScreen::TEScreen(int lines, int columns) | 68 | TEScreen::TEScreen(int lines, int columns) |
67 | { | 69 | { |
68 | this->lines = lines; | 70 | this->lines = lines; |
69 | this->columns = columns; | 71 | this->columns = columns; |
70 | 72 | // qDebug("Columns %d", columns); | |
73 | |||
71 | image = (ca*) malloc(lines*columns*sizeof(ca)); | 74 | image = (ca*) malloc(lines*columns*sizeof(ca)); |
72 | tabstops = NULL; initTabStops(); | 75 | tabstops = NULL; initTabStops(); |
73 | 76 | ||
74 | histCursor = 0; | 77 | histCursor = 0; |
78 | horzCursor = 0; | ||
75 | 79 | ||
76 | clearSelection(); | 80 | clearSelection(); |
77 | reset(); | 81 | reset(); |
78 | } | 82 | } |
79 | 83 | ||
80 | /*! Destructor | 84 | /*! Destructor |
81 | */ | 85 | */ |
82 | 86 | ||
@@ -378,63 +382,59 @@ void TEScreen::restoreCursor() | |||
378 | spaces to fit the new size. | 382 | spaces to fit the new size. |
379 | 383 | ||
380 | The region setting is reset to the whole screen and the | 384 | The region setting is reset to the whole screen and the |
381 | tab positions reinitialized. | 385 | tab positions reinitialized. |
382 | */ | 386 | */ |
383 | 387 | ||
384 | void TEScreen::resizeImage(int new_lines, int new_columns) | 388 | void TEScreen::resizeImage(int new_lines, int new_columns) |
385 | { | 389 | { |
386 | 390 | if (cuY > new_lines-1) { | |
387 | if (cuY > new_lines-1) | 391 | // attempt to preserve focus and lines |
388 | { // attempt to preserve focus and lines | 392 | bmargin = lines-1; //FIXME: margin lost |
389 | bmargin = lines-1; //FIXME: margin lost | 393 | for (int i = 0; i < cuY-(new_lines-1); i++) { |
390 | for (int i = 0; i < cuY-(new_lines-1); i++) | 394 | addHistLine(); scrollUp(horzCursor,1); |
391 | { | 395 | } |
392 | addHistLine(); scrollUp(0,1); | ||
393 | } | 396 | } |
394 | } | ||
395 | 397 | ||
396 | // make new image | 398 | // make new image |
397 | ca* newimg = (ca*)malloc(new_lines*new_columns*sizeof(ca)); | 399 | ca* newimg = (ca*)malloc( new_lines * new_columns * sizeof( ca)); |
398 | 400 | ||
399 | clearSelection(); | 401 | clearSelection(); |
400 | |||
401 | // clear new image | ||
402 | for (int y = 0; y < new_lines; y++) | ||
403 | for (int x = 0; x < new_columns; x++) | ||
404 | { | ||
405 | newimg[y*new_columns+x].c = ' '; | ||
406 | newimg[y*new_columns+x].f = DEFAULT_FORE_COLOR; | ||
407 | newimg[y*new_columns+x].b = DEFAULT_BACK_COLOR; | ||
408 | newimg[y*new_columns+x].r = DEFAULT_RENDITION; | ||
409 | } | ||
410 | int cpy_lines = QMIN(new_lines, lines); | ||
411 | int cpy_columns = QMIN(new_columns,columns); | ||
412 | // copy to new image | ||
413 | for (int y = 0; y < cpy_lines; y++) | ||
414 | for (int x = 0; x < cpy_columns; x++) | ||
415 | { | ||
416 | newimg[y*new_columns+x].c = image[loc(x,y)].c; | ||
417 | newimg[y*new_columns+x].f = image[loc(x,y)].f; | ||
418 | newimg[y*new_columns+x].b = image[loc(x,y)].b; | ||
419 | newimg[y*new_columns+x].r = image[loc(x,y)].r; | ||
420 | } | ||
421 | free(image); | ||
422 | image = newimg; | ||
423 | lines = new_lines; | ||
424 | columns = new_columns; | ||
425 | cuX = QMIN(cuX,columns-1); | ||
426 | cuY = QMIN(cuY,lines-1); | ||
427 | 402 | ||
428 | // FIXME: try to keep values, evtl. | 403 | // clear new image |
429 | tmargin=0; | 404 | for (int y = 0; y < new_lines; y++) |
430 | bmargin=lines-1; | 405 | for (int x = 0; x < new_columns; x++) { |
431 | initTabStops(); | 406 | newimg[y*new_columns+x].c = ' '; |
432 | clearSelection(); | 407 | newimg[y*new_columns+x].f = DEFAULT_FORE_COLOR; |
408 | newimg[y*new_columns+x].b = DEFAULT_BACK_COLOR; | ||
409 | newimg[y*new_columns+x].r = DEFAULT_RENDITION; | ||
410 | } | ||
411 | int cpy_lines = QMIN(new_lines, lines); | ||
412 | int cpy_columns = QMIN(new_columns,columns); | ||
413 | // copy to new image | ||
414 | for (int y = 0; y < cpy_lines; y++) | ||
415 | for (int x = 0; x < cpy_columns; x++) { | ||
416 | newimg[y*new_columns+x].c = image[loc(x,y)].c; | ||
417 | newimg[y*new_columns+x].f = image[loc(x,y)].f; | ||
418 | newimg[y*new_columns+x].b = image[loc(x,y)].b; | ||
419 | newimg[y*new_columns+x].r = image[loc(x,y)].r; | ||
420 | } | ||
421 | free(image); | ||
422 | image = newimg; | ||
423 | lines = new_lines; | ||
424 | columns = new_columns; | ||
425 | cuX = QMIN(cuX,columns-1); | ||
426 | cuY = QMIN(cuY,lines-1); | ||
427 | |||
428 | // FIXME: try to keep values, evtl. | ||
429 | tmargin=0; | ||
430 | bmargin=lines-1; | ||
431 | initTabStops(); | ||
432 | clearSelection(); | ||
433 | } | 433 | } |
434 | 434 | ||
435 | /* | 435 | /* |
436 | Clarifying rendition here and in TEWidget. | 436 | Clarifying rendition here and in TEWidget. |
437 | 437 | ||
438 | currently, TEWidget's color table is | 438 | currently, TEWidget's color table is |
439 | 0 1 2 .. 9 10 .. 17 | 439 | 0 1 2 .. 9 10 .. 17 |
440 | dft_fg, dft_bg, dim 0..7, intensive 0..7 | 440 | dft_fg, dft_bg, dim 0..7, intensive 0..7 |
@@ -500,17 +500,18 @@ void TEScreen::effectiveRendition() | |||
500 | Get the size of the image by \sa getLines and \sa getColumns. | 500 | Get the size of the image by \sa getLines and \sa getColumns. |
501 | 501 | ||
502 | NOTE that the image returned by this function must later be | 502 | NOTE that the image returned by this function must later be |
503 | freed. | 503 | freed. |
504 | 504 | ||
505 | */ | 505 | */ |
506 | 506 | ||
507 | ca* TEScreen::getCookedImage() | 507 | ca* TEScreen::getCookedImage() |
508 | { int x,y; | 508 | { |
509 | int x,y; | ||
509 | ca* merged = (ca*)malloc(lines*columns*sizeof(ca)); | 510 | ca* merged = (ca*)malloc(lines*columns*sizeof(ca)); |
510 | ca dft(' ',DEFAULT_FORE_COLOR,DEFAULT_BACK_COLOR,DEFAULT_RENDITION); | 511 | ca dft(' ',DEFAULT_FORE_COLOR,DEFAULT_BACK_COLOR,DEFAULT_RENDITION); |
511 | 512 | ||
512 | for (y = 0; (y < lines) && (y < (hist.getLines()-histCursor)); y++) | 513 | for (y = 0; (y < lines) && (y < (hist.getLines()-histCursor)); y++) |
513 | { | 514 | { |
514 | int len = QMIN(columns,hist.getLineLen(y+histCursor)); | 515 | int len = QMIN(columns,hist.getLineLen(y+histCursor)); |
515 | int yp = y*columns; | 516 | int yp = y*columns; |
516 | int yq = (y+histCursor)*columns; | 517 | int yq = (y+histCursor)*columns; |
@@ -543,25 +544,89 @@ ca* TEScreen::getCookedImage() | |||
543 | if (getMode(MODE_Screen)) | 544 | if (getMode(MODE_Screen)) |
544 | { int i,n = lines*columns; | 545 | { int i,n = lines*columns; |
545 | for (i = 0; i < n; i++) | 546 | for (i = 0; i < n; i++) |
546 | reverseRendition(&merged[i]); // for reverse display | 547 | reverseRendition(&merged[i]); // for reverse display |
547 | } | 548 | } |
548 | if (getMode(MODE_Cursor) && (cuY+(hist.getLines()-histCursor) < lines)) // cursor visible | 549 | if (getMode(MODE_Cursor) && (cuY+(hist.getLines()-histCursor) < lines)) // cursor visible |
549 | reverseRendition(&merged[loc(cuX,cuY+(hist.getLines()-histCursor))]); | 550 | reverseRendition(&merged[loc(cuX,cuY+(hist.getLines()-histCursor))]); |
550 | return merged; | 551 | return merged; |
552 | |||
553 | /* | ||
554 | int x, y, z; | ||
555 | |||
556 | ca* merged = (ca*)malloc( lines * columns * sizeof( ca)); | ||
557 | |||
558 | ca dft(' ',DEFAULT_FORE_COLOR,DEFAULT_BACK_COLOR,DEFAULT_RENDITION); | ||
559 | |||
560 | // qDebug("hist lines %d, historyCursor %d, minus %d ,lines %d, columns %d", | ||
561 | // hist.getLines(), histCursor, hist.getLines() - histCursor , lines, columns); | ||
562 | for (y = 0; (y < lines) && (y < ( hist.getLines() - histCursor )); y++) { | ||
563 | |||
564 | int len = QMIN( columns, hist.getLineLen( y + histCursor) ); | ||
565 | int yp = y * columns; | ||
566 | int yq = ( y + histCursor) * columns; | ||
567 | // qDebug("horzCursor %d, columns %d, len %d", horzCursor, columns, len); | ||
568 | // qDebug("lineno %d, colno %d, count %d\n", y + histCursor, (horzCursor / 2), len ); | ||
569 | qDebug("Y %d", y); | ||
570 | hist.getCells( y + histCursor, (horzCursor / 2), len, merged + yp); | ||
571 | |||
572 | for (x = len; x < columns; x++) | ||
573 | merged[yp + x] = dft; | ||
574 | for (x = 0; x < columns; x++) { | ||
575 | int p = x + yp; int q = x + yq; | ||
576 | if ( ( q >= sel_TL ) && ( q <= sel_BR ) ) | ||
577 | reverseRendition(&merged[p]); // for selection | ||
578 | } | ||
579 | } | ||
580 | |||
581 | if (lines >= hist.getLines() - histCursor) { | ||
582 | for (y = ( hist.getLines() - histCursor); y < lines ; y++) { | ||
583 | int z = horzCursor; | ||
584 | int yp = y * columns; | ||
585 | int yq = ( y + histCursor) * columns; | ||
586 | int yr = ( y - hist.getLines() + histCursor) * columns; | ||
587 | // qDebug("y %d, yp %d, yq %d, columns %d, z cursor %d", y, yp, yq, columns, z); | ||
588 | for (x = 0; x < columns; x++) { | ||
589 | int p = x + yp; int q = x + yq; int r = (x + (horzCursor/2) ) + yr; | ||
590 | merged[p] = image[r]; | ||
591 | if ( q >= sel_TL && q <= sel_BR ) | ||
592 | reverseRendition( &merged[p]); // for selection | ||
593 | } | ||
594 | } | ||
595 | } | ||
596 | |||
597 | |||
598 | // evtl. inverse display | ||
599 | if (getMode(MODE_Screen)) | ||
600 | { int i, n = lines * columns; | ||
601 | for (i = 0; i < n; i++) | ||
602 | reverseRendition( &merged[i]); // for reverse display | ||
603 | } | ||
604 | if (getMode(MODE_Cursor) && ( cuY + ( hist.getLines() - histCursor) < lines)) // cursor visible | ||
605 | |||
606 | reverseRendition( &merged[ loc( cuX, cuY + ( hist.getLines() - histCursor))] ); | ||
607 | |||
608 | return merged; | ||
609 | */ | ||
610 | |||
551 | } | 611 | } |
552 | 612 | ||
553 | 613 | ||
554 | /*! | 614 | /*! |
555 | */ | 615 | */ |
556 | 616 | ||
557 | void TEScreen::reset() | 617 | void TEScreen::reset() |
558 | { | 618 | { |
619 | Config cfg("Konsole"); | ||
620 | cfg.setGroup("ScrollBar"); | ||
621 | if( !cfg.readBoolEntry("HorzScroll",0) ) | ||
559 | setMode(MODE_Wrap ); saveMode(MODE_Wrap ); // wrap at end of margin | 622 | setMode(MODE_Wrap ); saveMode(MODE_Wrap ); // wrap at end of margin |
623 | |||
624 | |||
560 | resetMode(MODE_Origin); saveMode(MODE_Origin); // position refere to [1,1] | 625 | resetMode(MODE_Origin); saveMode(MODE_Origin); // position refere to [1,1] |
561 | resetMode(MODE_Insert); saveMode(MODE_Insert); // overstroke | 626 | resetMode(MODE_Insert); saveMode(MODE_Insert); // overstroke |
562 | setMode(MODE_Cursor); // cursor visible | 627 | setMode(MODE_Cursor); // cursor visible |
563 | resetMode(MODE_Screen); // screen not inverse | 628 | resetMode(MODE_Screen); // screen not inverse |
564 | resetMode(MODE_NewLine); | 629 | resetMode(MODE_NewLine); |
565 | 630 | ||
566 | tmargin=0; | 631 | tmargin=0; |
567 | bmargin=lines-1; | 632 | bmargin=lines-1; |
@@ -653,22 +718,23 @@ void TEScreen::ShowCharacter(unsigned short c) | |||
653 | { | 718 | { |
654 | // Note that VT100 does wrapping BEFORE putting the character. | 719 | // Note that VT100 does wrapping BEFORE putting the character. |
655 | // This has impact on the assumption of valid cursor positions. | 720 | // This has impact on the assumption of valid cursor positions. |
656 | // We indicate the fact that a newline has to be triggered by | 721 | // We indicate the fact that a newline has to be triggered by |
657 | // putting the cursor one right to the last column of the screen. | 722 | // putting the cursor one right to the last column of the screen. |
658 | 723 | ||
659 | if (cuX >= columns) | 724 | if (cuX >= columns) |
660 | { | 725 | { |
661 | if (getMode(MODE_Wrap)) NextLine(); else cuX = columns-1; | 726 | if (getMode(MODE_Wrap)) NextLine(); else cuX = columns - 1; |
727 | // comment out for no wrap | ||
662 | } | 728 | } |
663 | 729 | ||
664 | if (getMode(MODE_Insert)) insertChars(1); | 730 | if (getMode(MODE_Insert)) insertChars(1); |
665 | 731 | ||
666 | int i = loc(cuX,cuY); | 732 | int i = loc( cuX, cuY); |
667 | 733 | ||
668 | checkSelection(i, i); // check if selection is still valid. | 734 | checkSelection(i, i); // check if selection is still valid. |
669 | 735 | ||
670 | image[i].c = c; | 736 | image[i].c = c; |
671 | image[i].f = ef_fg; | 737 | image[i].f = ef_fg; |
672 | image[i].b = ef_bg; | 738 | image[i].b = ef_bg; |
673 | image[i].r = ef_re; | 739 | image[i].r = ef_re; |
674 | 740 | ||
@@ -680,37 +746,42 @@ void TEScreen::ShowCharacter(unsigned short c) | |||
680 | 746 | ||
681 | /*! scroll up `n' lines within current region. | 747 | /*! scroll up `n' lines within current region. |
682 | The `n' new lines are cleared. | 748 | The `n' new lines are cleared. |
683 | \sa setRegion \sa scrollDown | 749 | \sa setRegion \sa scrollDown |
684 | */ | 750 | */ |
685 | 751 | ||
686 | void TEScreen::scrollUp(int from, int n) | 752 | void TEScreen::scrollUp(int from, int n) |
687 | { | 753 | { |
688 | if (n <= 0 || from + n > bmargin) return; | 754 | if (n <= 0 || from + n > bmargin) return; |
689 | //FIXME: make sure `tmargin', `bmargin', `from', `n' is in bounds. | 755 | //FIXME: make sure `tmargin', `bmargin', `from', `n' is in bounds. |
690 | moveImage(loc(0,from),loc(0,from+n),loc(columns-1,bmargin)); | 756 | |
691 | clearImage(loc(0,bmargin-n+1),loc(columns-1,bmargin),' '); | 757 | moveImage( loc( 0, from), loc( 0, from + n), loc( columns - 1, bmargin)); |
758 | clearImage( loc( 0, bmargin - n + 1), loc( columns - 1, bmargin), ' '); | ||
692 | } | 759 | } |
693 | 760 | ||
694 | /*! scroll down `n' lines within current region. | 761 | /*! scroll down `n' lines within current region. |
695 | The `n' new lines are cleared. | 762 | The `n' new lines are cleared. |
696 | \sa setRegion \sa scrollUp | 763 | \sa setRegion \sa scrollUp |
697 | */ | 764 | */ |
698 | 765 | ||
699 | void TEScreen::scrollDown(int from, int n) | 766 | void TEScreen::scrollDown(int from, int n) |
700 | { | 767 | { |
768 | |||
701 | //FIXME: make sure `tmargin', `bmargin', `from', `n' is in bounds. | 769 | //FIXME: make sure `tmargin', `bmargin', `from', `n' is in bounds. |
702 | if (n <= 0) return; | 770 | if (n <= 0) return; |
703 | if (from > bmargin) return; | 771 | if (from > bmargin) return; |
704 | if (from + n > bmargin) n = bmargin - from; | 772 | if (from + n > bmargin) n = bmargin - from; |
705 | moveImage(loc(0,from+n),loc(0,from),loc(columns-1,bmargin-n)); | 773 | |
774 | moveImage( loc(0,from+n), loc(0,from), loc(columns-1,bmargin-n)); | ||
706 | clearImage(loc(0,from),loc(columns-1,from+n-1),' '); | 775 | clearImage(loc(0,from),loc(columns-1,from+n-1),' '); |
707 | } | 776 | } |
708 | 777 | ||
778 | |||
779 | |||
709 | /*! position the cursor to a specific line and column. */ | 780 | /*! position the cursor to a specific line and column. */ |
710 | void TEScreen::setCursorYX(int y, int x) | 781 | void TEScreen::setCursorYX(int y, int x) |
711 | { | 782 | { |
712 | setCursorY(y); setCursorX(x); | 783 | setCursorY(y); setCursorX(x); |
713 | } | 784 | } |
714 | 785 | ||
715 | /*! Set the cursor to x-th line. */ | 786 | /*! Set the cursor to x-th line. */ |
716 | 787 | ||
@@ -866,17 +937,17 @@ void TEScreen::clearToBeginOfLine() | |||
866 | clearImage(loc(0,cuY),loc(cuX,cuY),' '); | 937 | clearImage(loc(0,cuY),loc(cuX,cuY),' '); |
867 | } | 938 | } |
868 | 939 | ||
869 | /*! clears entire current cursor line | 940 | /*! clears entire current cursor line |
870 | */ | 941 | */ |
871 | 942 | ||
872 | void TEScreen::clearEntireLine() | 943 | void TEScreen::clearEntireLine() |
873 | { | 944 | { |
874 | clearImage(loc(0,cuY),loc(columns-1,cuY),' '); | 945 | clearImage( loc( 0, cuY),loc( columns - 1, cuY),' '); |
875 | } | 946 | } |
876 | 947 | ||
877 | // Rendition ------------------------------------------------------------------ | 948 | // Rendition ------------------------------------------------------------------ |
878 | 949 | ||
879 | /*! | 950 | /*! |
880 | set rendition mode | 951 | set rendition mode |
881 | */ | 952 | */ |
882 | 953 | ||
@@ -983,131 +1054,131 @@ void TEScreen::setSelExtentXY(const int x, const int y) | |||
983 | } | 1054 | } |
984 | } | 1055 | } |
985 | 1056 | ||
986 | QString TEScreen::getSelText(const BOOL preserve_line_breaks) | 1057 | QString TEScreen::getSelText(const BOOL preserve_line_breaks) |
987 | { | 1058 | { |
988 | if (sel_begin == -1) | 1059 | if (sel_begin == -1) |
989 | return QString::null; // Selection got clear while selecting. | 1060 | return QString::null; // Selection got clear while selecting. |
990 | 1061 | ||
991 | int *m; // buffer to fill. | 1062 | int *m; // buffer to fill. |
992 | int s, d; // source index, dest. index. | 1063 | int s, d; // source index, dest. index. |
993 | int hist_BR = loc(0, hist.getLines()); | 1064 | int hist_BR = loc(0, hist.getLines()); |
994 | int hY = sel_TL / columns; | 1065 | int hY = sel_TL / columns; |
995 | int hX = sel_TL % columns; | 1066 | int hX = sel_TL % columns; |
996 | int eol; // end of line | 1067 | int eol; // end of line |
997 | 1068 | ||
998 | s = sel_TL; // tracks copy in source. | 1069 | s = sel_TL; // tracks copy in source. |
999 | 1070 | ||
1000 | // allocate buffer for maximum | 1071 | // allocate buffer for maximum |
1001 | // possible size... | 1072 | // possible size... |
1002 | d = (sel_BR - sel_TL) / columns + 1; | 1073 | d = (sel_BR - sel_TL) / columns + 1; |
1003 | m = new int[d * (columns + 1) + 2]; | 1074 | m = new int[d * (columns + 1) + 2]; |
1004 | d = 0; | 1075 | d = 0; |
1005 | 1076 | ||
1006 | while (s <= sel_BR) | 1077 | while (s <= sel_BR) |
1007 | { | 1078 | { |
1008 | if (s < hist_BR) | 1079 | if (s < hist_BR) |
1009 | { // get lines from hist.history | 1080 | { // get lines from hist.history |
1010 | // buffer. | 1081 | // buffer. |
1011 | eol = hist.getLineLen(hY); | 1082 | eol = hist.getLineLen(hY); |
1012 | 1083 | ||
1013 | if ((hY == (sel_BR / columns)) && | 1084 | if ((hY == (sel_BR / columns)) && |
1014 | (eol >= (sel_BR % columns))) | 1085 | (eol >= (sel_BR % columns))) |
1015 | { | 1086 | { |
1016 | eol = sel_BR % columns + 1; | 1087 | eol = sel_BR % columns + 1; |
1017 | } | 1088 | } |
1018 | 1089 | ||
1019 | while (hX < eol) | 1090 | while (hX < eol) |
1020 | { | 1091 | { |
1021 | m[d++] = hist.getCell(hY, hX++).c; | 1092 | m[d++] = hist.getCell(hY, hX++).c; |
1022 | s++; | 1093 | s++; |
1023 | } | 1094 | } |
1024 | 1095 | ||
1025 | if (s <= sel_BR) | 1096 | if (s <= sel_BR) |
1026 | { | 1097 | { |
1027 | // The line break handling | 1098 | // The line break handling |
1028 | // It's different from the screen | 1099 | // It's different from the screen |
1029 | // image case! | 1100 | // image case! |
1030 | if (eol % columns == 0) | 1101 | if (eol % columns == 0) |
1031 | { | 1102 | { |
1032 | // That's either a completely filled | 1103 | // That's either a completely filled |
1033 | // line or an empty line | 1104 | // line or an empty line |
1034 | if (eol == 0) | 1105 | if (eol == 0) |
1035 | { | 1106 | { |
1036 | m[d++] = '\n'; | 1107 | m[d++] = '\n'; |
1037 | } | 1108 | } |
1038 | else | 1109 | else |
1039 | { | 1110 | { |
1040 | // We have a full line. | 1111 | // We have a full line. |
1041 | // FIXME: How can we handle newlines | 1112 | // FIXME: How can we handle newlines |
1042 | // at this position?! | 1113 | // at this position?! |
1043 | } | 1114 | } |
1044 | } | 1115 | } |
1045 | else if ((eol + 1) % columns == 0) | 1116 | else if ((eol + 1) % columns == 0) |
1046 | { | 1117 | { |
1047 | // FIXME: We don't know if this was a | 1118 | // FIXME: We don't know if this was a |
1048 | // space at the last position or a | 1119 | // space at the last position or a |
1049 | // short line!! | 1120 | // short line!! |
1050 | m[d++] = ' '; | 1121 | m[d++] = ' '; |
1051 | } | 1122 | } |
1052 | else | 1123 | else |
1053 | { | 1124 | { |
1054 | // We have a short line here. Put a | 1125 | // We have a short line here. Put a |
1055 | // newline or a space into the | 1126 | // newline or a space into the |
1056 | // buffer. | 1127 | // buffer. |
1057 | m[d++] = preserve_line_breaks ? '\n' : ' '; | 1128 | m[d++] = preserve_line_breaks ? '\n' : ' '; |
1058 | } | 1129 | } |
1059 | } | 1130 | } |
1060 | 1131 | ||
1061 | hY++; | 1132 | hY++; |
1062 | hX = 0; | 1133 | hX = 0; |
1063 | s = hY * columns; | 1134 | s = hY * columns; |
1064 | } | 1135 | } |
1065 | else | 1136 | else |
1066 | { // or from screen image. | 1137 | { // or from screen image. |
1067 | eol = (s / columns + 1) * columns - 1; | 1138 | eol = (s / columns + 1) * columns - 1; |
1068 | 1139 | ||
1069 | if (eol < sel_BR) | 1140 | if (eol < sel_BR) |
1070 | { | 1141 | { |
1071 | while ((eol > s) && | 1142 | while ((eol > s) && |
1072 | isspace(image[eol - hist_BR].c)) | 1143 | isspace(image[eol - hist_BR].c)) |
1073 | { | 1144 | { |
1074 | eol--; | 1145 | eol--; |
1075 | } | 1146 | } |
1076 | } | 1147 | } |
1077 | else | 1148 | else |
1078 | { | 1149 | { |
1079 | eol = sel_BR; | 1150 | eol = sel_BR; |
1080 | } | 1151 | } |
1081 | 1152 | ||
1082 | while (s <= eol) | 1153 | while (s <= eol) |
1083 | { | 1154 | { |
1084 | m[d++] = image[s++ - hist_BR].c; | 1155 | m[d++] = image[s++ - hist_BR].c; |
1085 | } | 1156 | } |
1086 | 1157 | ||
1087 | if (eol < sel_BR) | 1158 | if (eol < sel_BR) |
1088 | { | 1159 | { |
1089 | // eol processing see below ... | 1160 | // eol processing see below ... |
1090 | if ((eol + 1) % columns == 0) | 1161 | if ((eol + 1) % columns == 0) |
1091 | { | 1162 | { |
1092 | if (image[eol - hist_BR].c == ' ') | 1163 | if (image[eol - hist_BR].c == ' ') |
1093 | { | 1164 | { |
1094 | m[d++] = ' '; | 1165 | m[d++] = ' '; |
1095 | } | 1166 | } |
1096 | } | 1167 | } |
1097 | else | 1168 | else |
1098 | { | 1169 | { |
1099 | m[d++] = ((preserve_line_breaks || | 1170 | m[d++] = ((preserve_line_breaks || |
1100 | ((eol % columns) == 0)) ? | 1171 | ((eol % columns) == 0)) ? |
1101 | '\n' : ' '); | 1172 | '\n' : ' '); |
1102 | } | 1173 | } |
1103 | } | 1174 | } |
1104 | 1175 | ||
1105 | s = (eol / columns + 1) * columns; | 1176 | s = (eol / columns + 1) * columns; |
1106 | } | 1177 | } |
1107 | } | 1178 | } |
1108 | 1179 | ||
1109 | QChar* qc = new QChar[d]; | 1180 | QChar* qc = new QChar[d]; |
1110 | 1181 | ||
1111 | for (int i = 0; i < d; i++) | 1182 | for (int i = 0; i < d; i++) |
1112 | { | 1183 | { |
1113 | qc[i] = m[i]; | 1184 | qc[i] = m[i]; |
@@ -1124,66 +1195,76 @@ QString TEScreen::getSelText(const BOOL preserve_line_breaks) | |||
1124 | cases: | 1195 | cases: |
1125 | 1196 | ||
1126 | 1) (eol+1)%columns == 0 --> the whole line is filled. | 1197 | 1) (eol+1)%columns == 0 --> the whole line is filled. |
1127 | If the last char is a space, insert (preserve) space. otherwise | 1198 | If the last char is a space, insert (preserve) space. otherwise |
1128 | leave the text alone, so that words that are broken by linewrap | 1199 | leave the text alone, so that words that are broken by linewrap |
1129 | are preserved. | 1200 | are preserved. |
1130 | 1201 | ||
1131 | FIXME: | 1202 | FIXME: |
1132 | * this suppresses \n for command output that is | 1203 | * this suppresses \n for command output that is |
1133 | sized to the exact column width of the screen. | 1204 | sized to the exact column width of the screen. |
1134 | 1205 | ||
1135 | 2) eol%columns == 0 --> blank line. | 1206 | 2) eol%columns == 0 --> blank line. |
1136 | insert a \n unconditionally. | 1207 | insert a \n unconditionally. |
1137 | Do it either you would because you are in preserve_line_break mode, | 1208 | Do it either you would because you are in preserve_line_break mode, |
1138 | or because it's an ASCII paragraph delimiter, so even when | 1209 | or because it's an ASCII paragraph delimiter, so even when |
1139 | not preserving line_breaks, you want to preserve paragraph breaks. | 1210 | not preserving line_breaks, you want to preserve paragraph breaks. |
1140 | 1211 | ||
1141 | 3) else --> partially filled line | 1212 | 3) else --> partially filled line |
1142 | insert a \n in preserve line break mode, else a space | 1213 | insert a \n in preserve line break mode, else a space |
1143 | The space prevents concatenation of the last word of one | 1214 | The space prevents concatenation of the last word of one |
1144 | line with the first of the next. | 1215 | line with the first of the next. |
1145 | 1216 | ||
1146 | */ | 1217 | */ |
1147 | 1218 | ||
1148 | void TEScreen::addHistLine() | 1219 | void TEScreen::addHistLine() |
1149 | { | 1220 | { |
1150 | assert(hasScroll() || histCursor == 0); | 1221 | assert(hasScroll() || histCursor == 0); |
1151 | 1222 | ||
1152 | // add to hist buffer | 1223 | // add to hist buffer |
1153 | // we have to take care about scrolling, too... | 1224 | // we have to take care about scrolling, too... |
1154 | 1225 | ||
1155 | if (hasScroll()) | 1226 | if (hasScroll()){ |
1156 | { ca dft; | 1227 | ca dft; |
1157 | 1228 | ||
1158 | int end = columns-1; | 1229 | int end = columns - 1; |
1159 | while (end >= 0 && image[end] == dft) | 1230 | while (end >= 0 && image[end] == dft) |
1160 | end -= 1; | 1231 | end -= 1; |
1161 | 1232 | ||
1162 | hist.addCells(image,end+1); | 1233 | hist.addCells( image, end + 1); |
1163 | hist.addLine(); | 1234 | hist.addLine(); |
1164 | 1235 | ||
1165 | // adjust history cursor | 1236 | // adjust history cursor |
1166 | histCursor += (hist.getLines()-1 == histCursor); | 1237 | histCursor += ( hist.getLines() - 1 == histCursor); |
1167 | } | 1238 | } |
1168 | 1239 | ||
1169 | if (!hasScroll()) histCursor = 0; //FIXME: a poor workaround | 1240 | if (!hasScroll()) histCursor = 0; //FIXME: a poor workaround |
1170 | } | 1241 | } |
1171 | 1242 | ||
1172 | void TEScreen::setHistCursor(int cursor) | 1243 | void TEScreen::setHistCursor(int cursor) |
1173 | { | 1244 | { |
1174 | histCursor = cursor; //FIXME:rangecheck | 1245 | histCursor = cursor; //FIXME:rangecheck |
1175 | } | 1246 | } |
1176 | 1247 | ||
1248 | void TEScreen::setHorzCursor(int cursor) | ||
1249 | { | ||
1250 | horzCursor = cursor; | ||
1251 | } | ||
1252 | |||
1177 | int TEScreen::getHistCursor() | 1253 | int TEScreen::getHistCursor() |
1178 | { | 1254 | { |
1179 | return histCursor; | 1255 | return histCursor; |
1180 | } | 1256 | } |
1181 | 1257 | ||
1258 | int TEScreen::getHorzCursor() | ||
1259 | { | ||
1260 | return horzCursor; | ||
1261 | } | ||
1262 | |||
1182 | int TEScreen::getHistLines() | 1263 | int TEScreen::getHistLines() |
1183 | { | 1264 | { |
1184 | return hist.getLines(); | 1265 | return hist.getLines(); |
1185 | } | 1266 | } |
1186 | 1267 | ||
1187 | void TEScreen::setScroll(bool on) | 1268 | void TEScreen::setScroll(bool on) |
1188 | { | 1269 | { |
1189 | histCursor = 0; | 1270 | histCursor = 0; |
diff --git a/core/apps/embeddedkonsole/TEWidget.cpp b/core/apps/embeddedkonsole/TEWidget.cpp index b1ad008..c10c7a8 100644 --- a/core/apps/embeddedkonsole/TEWidget.cpp +++ b/core/apps/embeddedkonsole/TEWidget.cpp | |||
@@ -47,16 +47,23 @@ | |||
47 | - set different 'rounding' styles? I.e. have a mode to show clipped chars? | 47 | - set different 'rounding' styles? I.e. have a mode to show clipped chars? |
48 | */ | 48 | */ |
49 | 49 | ||
50 | // #include "config.h" | 50 | // #include "config.h" |
51 | #include "TEWidget.h" | 51 | #include "TEWidget.h" |
52 | #include "session.h" | 52 | #include "session.h" |
53 | #include <qpe/config.h> | 53 | #include <qpe/config.h> |
54 | 54 | ||
55 | #include <qpe/resource.h> | ||
56 | #include <qpe/sound.h> | ||
57 | |||
58 | #ifdef QWS | ||
59 | #include <qpe/qcopenvelope_qws.h> | ||
60 | #endif | ||
61 | |||
55 | #include <qcursor.h> | 62 | #include <qcursor.h> |
56 | #include <qregexp.h> | 63 | #include <qregexp.h> |
57 | #include <qpainter.h> | 64 | #include <qpainter.h> |
58 | #include <qclipboard.h> | 65 | #include <qclipboard.h> |
59 | #include <qstyle.h> | 66 | #include <qstyle.h> |
60 | #include <qfile.h> | 67 | #include <qfile.h> |
61 | #include <qdragobject.h> | 68 | #include <qdragobject.h> |
62 | 69 | ||
@@ -282,44 +289,54 @@ TEWidget::TEWidget(QWidget *parent, const char *name) : QFrame(parent,name) | |||
282 | QObject::connect( (QObject*)cb, SIGNAL(dataChanged()), | 289 | QObject::connect( (QObject*)cb, SIGNAL(dataChanged()), |
283 | this, SLOT(onClearSelection()) ); | 290 | this, SLOT(onClearSelection()) ); |
284 | #endif | 291 | #endif |
285 | 292 | ||
286 | scrollbar = new QScrollBar(this); | 293 | scrollbar = new QScrollBar(this); |
287 | scrollbar->setCursor( arrowCursor ); | 294 | scrollbar->setCursor( arrowCursor ); |
288 | connect(scrollbar, SIGNAL(valueChanged(int)), this, SLOT(scrollChanged(int))); | 295 | connect(scrollbar, SIGNAL(valueChanged(int)), this, SLOT(scrollChanged(int))); |
289 | 296 | ||
297 | hScrollbar = new QScrollBar(this); | ||
298 | hScrollbar->setCursor( arrowCursor ); | ||
299 | hScrollbar->setOrientation(QScrollBar::Horizontal); | ||
300 | hScrollbar->setMaximumHeight(16); | ||
301 | |||
302 | connect( hScrollbar, SIGNAL(valueChanged(int)), this, SLOT( hScrollChanged(int))); | ||
303 | |||
290 | Config cfg("Konsole"); | 304 | Config cfg("Konsole"); |
291 | cfg.setGroup("ScrollBar"); | 305 | cfg.setGroup("ScrollBar"); |
292 | switch( cfg.readNumEntry("Position",2)){ | 306 | switch( cfg.readNumEntry("Position",2)){ |
293 | case 0: | 307 | case 0: |
294 | scrollLoc = SCRNONE; | 308 | scrollLoc = SCRNONE; |
295 | break; | 309 | break; |
296 | case 1: | 310 | case 1: |
297 | scrollLoc = SCRLEFT; | 311 | scrollLoc = SCRLEFT; |
298 | break; | 312 | break; |
299 | case 2: | 313 | case 2: |
300 | scrollLoc = SCRRIGHT; | 314 | scrollLoc = SCRRIGHT; |
301 | break; | 315 | break; |
302 | }; | 316 | }; |
303 | 317 | ||
318 | useHorzScroll=cfg.readBoolEntry("HorzScroll",0); | ||
319 | |||
304 | blinkT = new QTimer(this); | 320 | blinkT = new QTimer(this); |
305 | connect(blinkT, SIGNAL(timeout()), this, SLOT(blinkEvent())); | 321 | connect(blinkT, SIGNAL(timeout()), this, SLOT(blinkEvent())); |
306 | // blinking = FALSE; | 322 | // blinking = FALSE; |
307 | blinking = TRUE; | 323 | blinking = TRUE; |
308 | 324 | ||
309 | resizing = FALSE; | 325 | resizing = FALSE; |
310 | actSel = 0; | 326 | actSel = 0; |
311 | image = 0; | 327 | image = 0; |
312 | lines = 1; | 328 | lines = 1; |
313 | columns = 1; | 329 | columns = 1; |
314 | font_w = 1; | 330 | font_w = 1; |
315 | font_h = 1; | 331 | font_h = 1; |
316 | font_a = 1; | 332 | font_a = 1; |
317 | word_selection_mode = FALSE; | 333 | word_selection_mode = FALSE; |
334 | hposition = 0; | ||
318 | 335 | ||
319 | setMouseMarks(TRUE); | 336 | setMouseMarks(TRUE); |
320 | setVTFont( QFont("fixed") ); | 337 | setVTFont( QFont("fixed") ); |
321 | setColorTable(base_color_table); // init color table | 338 | setColorTable(base_color_table); // init color table |
322 | 339 | ||
323 | qApp->installEventFilter( this ); //FIXME: see below | 340 | qApp->installEventFilter( this ); //FIXME: see below |
324 | // KCursor::setAutoHideCursor( this, true ); | 341 | // KCursor::setAutoHideCursor( this, true ); |
325 | 342 | ||
@@ -405,20 +422,17 @@ HCNT("setImage"); | |||
405 | 422 | ||
406 | int cf = -1; // undefined | 423 | int cf = -1; // undefined |
407 | int cb = -1; // undefined | 424 | int cb = -1; // undefined |
408 | int cr = -1; // undefined | 425 | int cr = -1; // undefined |
409 | 426 | ||
410 | int lins = QMIN(this->lines, QMAX(0,lines )); | 427 | int lins = QMIN(this->lines, QMAX(0,lines )); |
411 | int cols = QMIN(this->columns,QMAX(0,columns)); | 428 | int cols = QMIN(this->columns,QMAX(0,columns)); |
412 | QChar *disstrU = new QChar[cols]; | 429 | QChar *disstrU = new QChar[cols]; |
413 | 430 | for (y = 0; y < lins; y++) { | |
414 | //{ static int cnt = 0; printf("setImage %d\n",cnt++); } | ||
415 | for (y = 0; y < lins; y++) | ||
416 | { | ||
417 | const ca* lcl = &image[y*this->columns]; | 431 | const ca* lcl = &image[y*this->columns]; |
418 | const ca* const ext = &newimg[y*columns]; | 432 | const ca* const ext = &newimg[y*columns]; |
419 | if (!resizing) // not while resizing, we're expecting a paintEvent | 433 | if (!resizing) // not while resizing, we're expecting a paintEvent |
420 | for (x = 0; x < cols; x++) | 434 | for (x = 0; x < cols; x++) |
421 | { | 435 | { |
422 | hasBlinker |= (ext[x].r & RE_BLINK); | 436 | hasBlinker |= (ext[x].r & RE_BLINK); |
423 | if (ext[x] != lcl[x]) | 437 | if (ext[x] != lcl[x]) |
424 | { | 438 | { |
@@ -583,21 +597,28 @@ void TEWidget::propagateSize() | |||
583 | } | 597 | } |
584 | 598 | ||
585 | /* ------------------------------------------------------------------------- */ | 599 | /* ------------------------------------------------------------------------- */ |
586 | /* */ | 600 | /* */ |
587 | /* Scrollbar */ | 601 | /* Scrollbar */ |
588 | /* */ | 602 | /* */ |
589 | /* ------------------------------------------------------------------------- */ | 603 | /* ------------------------------------------------------------------------- */ |
590 | 604 | ||
591 | void TEWidget::scrollChanged(int) | 605 | void TEWidget::scrollChanged(int) { |
592 | { | ||
593 | emit changedHistoryCursor(scrollbar->value()); //expose | 606 | emit changedHistoryCursor(scrollbar->value()); //expose |
594 | } | 607 | } |
595 | 608 | ||
609 | void TEWidget::hScrollChanged(int loc) { | ||
610 | hposition = loc; | ||
611 | propagateSize(); | ||
612 | update(); | ||
613 | |||
614 | // emit changedHorzCursor( hScrollbar->value()); //expose | ||
615 | } | ||
616 | |||
596 | void TEWidget::setScroll(int cursor, int slines) | 617 | void TEWidget::setScroll(int cursor, int slines) |
597 | { | 618 | { |
598 | disconnect(scrollbar, SIGNAL(valueChanged(int)), this, SLOT(scrollChanged(int))); | 619 | disconnect(scrollbar, SIGNAL(valueChanged(int)), this, SLOT(scrollChanged(int))); |
599 | scrollbar->setRange(0,slines); | 620 | scrollbar->setRange(0,slines); |
600 | scrollbar->setSteps(1,lines); | 621 | scrollbar->setSteps(1,lines); |
601 | scrollbar->setValue(cursor); | 622 | scrollbar->setValue(cursor); |
602 | connect(scrollbar, SIGNAL(valueChanged(int)), this, SLOT(scrollChanged(int))); | 623 | connect(scrollbar, SIGNAL(valueChanged(int)), this, SLOT(scrollChanged(int))); |
603 | } | 624 | } |
@@ -692,16 +713,17 @@ void TEWidget::mouseMoveEvent(QMouseEvent* ev) | |||
692 | // don't extend selection while pasting | 713 | // don't extend selection while pasting |
693 | if (ev->state() & MidButton) return; | 714 | if (ev->state() & MidButton) return; |
694 | 715 | ||
695 | //if ( !contentsRect().contains(ev->pos()) ) return; | 716 | //if ( !contentsRect().contains(ev->pos()) ) return; |
696 | QPoint tL = contentsRect().topLeft(); | 717 | QPoint tL = contentsRect().topLeft(); |
697 | int tLx = tL.x(); | 718 | int tLx = tL.x(); |
698 | int tLy = tL.y(); | 719 | int tLy = tL.y(); |
699 | int scroll = scrollbar->value(); | 720 | int scroll = scrollbar->value(); |
721 | // int hScroll = hScrollbar->value(); | ||
700 | 722 | ||
701 | // we're in the process of moving the mouse with the left button pressed | 723 | // we're in the process of moving the mouse with the left button pressed |
702 | // the mouse cursor will kept catched within the bounds of the text in | 724 | // the mouse cursor will kept catched within the bounds of the text in |
703 | // this widget. | 725 | // this widget. |
704 | 726 | ||
705 | // Adjust position within text area bounds. See FIXME above. | 727 | // Adjust position within text area bounds. See FIXME above. |
706 | QPoint pos = ev->pos(); | 728 | QPoint pos = ev->pos(); |
707 | if ( pos.x() < tLx+blX ) pos.setX( tLx+blX ); | 729 | if ( pos.x() < tLx+blX ) pos.setX( tLx+blX ); |
@@ -968,16 +990,20 @@ void TEWidget::onClearSelection() | |||
968 | // For auto-hide, we need to get keypress-events, but we only get them when | 990 | // For auto-hide, we need to get keypress-events, but we only get them when |
969 | // we have focus. | 991 | // we have focus. |
970 | 992 | ||
971 | void TEWidget::doScroll(int lines) | 993 | void TEWidget::doScroll(int lines) |
972 | { | 994 | { |
973 | scrollbar->setValue(scrollbar->value()+lines); | 995 | scrollbar->setValue(scrollbar->value()+lines); |
974 | } | 996 | } |
975 | 997 | ||
998 | void TEWidget::doHScroll(int lines) { | ||
999 | hScrollbar->setValue( hScrollbar->value()+lines); | ||
1000 | } | ||
1001 | |||
976 | bool TEWidget::eventFilter( QObject *obj, QEvent *e ) | 1002 | bool TEWidget::eventFilter( QObject *obj, QEvent *e ) |
977 | { | 1003 | { |
978 | if ( (e->type() == QEvent::Accel || | 1004 | if ( (e->type() == QEvent::Accel || |
979 | e->type() == QEvent::AccelAvailable ) && qApp->focusWidget() == this ) { | 1005 | e->type() == QEvent::AccelAvailable ) && qApp->focusWidget() == this ) { |
980 | static_cast<QKeyEvent *>( e )->ignore(); | 1006 | static_cast<QKeyEvent *>( e )->ignore(); |
981 | return true; | 1007 | return true; |
982 | } | 1008 | } |
983 | if ( obj != this /* when embedded */ && obj != parent() /* when standalone */ ) | 1009 | if ( obj != this /* when embedded */ && obj != parent() /* when standalone */ ) |
@@ -1073,17 +1099,27 @@ void TEWidget::frameChanged() | |||
1073 | /* ------------------------------------------------------------------------- */ | 1099 | /* ------------------------------------------------------------------------- */ |
1074 | /* */ | 1100 | /* */ |
1075 | /* Sound */ | 1101 | /* Sound */ |
1076 | /* */ | 1102 | /* */ |
1077 | /* ------------------------------------------------------------------------- */ | 1103 | /* ------------------------------------------------------------------------- */ |
1078 | 1104 | ||
1079 | void TEWidget::Bell() | 1105 | void TEWidget::Bell() |
1080 | { | 1106 | { |
1081 | QApplication::beep(); | 1107 | //#ifdef QT_QWS_CUSTOM |
1108 | //# ifndef QT_NO_COP | ||
1109 | QCopEnvelope( "QPE/TaskBar", "soundAlarm()" ); | ||
1110 | //# endif | ||
1111 | //#else | ||
1112 | //# ifndef QT_NO_SOUND | ||
1113 | // QSound::play(Resource::findSound("alarm")); | ||
1114 | //# endif | ||
1115 | //#endif | ||
1116 | |||
1117 | // QApplication::beep(); | ||
1082 | } | 1118 | } |
1083 | 1119 | ||
1084 | /* ------------------------------------------------------------------------- */ | 1120 | /* ------------------------------------------------------------------------- */ |
1085 | /* */ | 1121 | /* */ |
1086 | /* Auxiluary */ | 1122 | /* Auxiluary */ |
1087 | /* */ | 1123 | /* */ |
1088 | /* ------------------------------------------------------------------------- */ | 1124 | /* ------------------------------------------------------------------------- */ |
1089 | 1125 | ||
@@ -1100,46 +1136,141 @@ void TEWidget::clearImage() | |||
1100 | image[loc(x,y)].r = 0xff; //DEFAULT_RENDITION; | 1136 | image[loc(x,y)].r = 0xff; //DEFAULT_RENDITION; |
1101 | } | 1137 | } |
1102 | } | 1138 | } |
1103 | 1139 | ||
1104 | // Create Image /////////////////////////////////////////////////////// | 1140 | // Create Image /////////////////////////////////////////////////////// |
1105 | 1141 | ||
1106 | void TEWidget::calcGeometry() | 1142 | void TEWidget::calcGeometry() |
1107 | { | 1143 | { |
1108 | //FIXME: set rimX == rimY == 0 when running in full screen mode. | 1144 | int showhscrollbar = 1; |
1145 | int hwidth = 0; | ||
1146 | int dcolumns; | ||
1147 | Config cfg("Konsole"); | ||
1148 | cfg.setGroup("ScrollBar"); | ||
1149 | useHorzScroll=cfg.readBoolEntry("HorzScroll",0); | ||
1150 | |||
1151 | if(vcolumns == 0) showhscrollbar = 0; | ||
1152 | if(showhscrollbar == 1) hwidth = QApplication::style().scrollBarExtent().width(); | ||
1153 | |||
1154 | scrollbar->resize(QApplication::style().scrollBarExtent().width(), | ||
1155 | contentsRect().height() - hwidth); | ||
1156 | |||
1157 | switch(scrollLoc) { | ||
1158 | case SCRNONE : | ||
1159 | columns = ( contentsRect().width() - 2 * rimX ) / font_w; | ||
1160 | dcolumns = columns; | ||
1161 | if(vcolumns) columns = vcolumns; | ||
1162 | blX = (contentsRect().width() - (columns*font_w) ) / 2; | ||
1163 | if(showhscrollbar) | ||
1164 | blX = -hposition * font_w; | ||
1165 | brX = blX; | ||
1166 | scrollbar->hide(); | ||
1167 | break; | ||
1168 | case SCRLEFT : | ||
1169 | columns = ( contentsRect().width() - 2 * rimX - scrollbar->width()) / font_w; | ||
1170 | dcolumns = columns; | ||
1171 | if(vcolumns) columns = vcolumns; | ||
1172 | brX = (contentsRect().width() - (columns*font_w) - scrollbar->width() ) / 2; | ||
1173 | if(showhscrollbar) | ||
1174 | brX = -hposition * font_w; | ||
1175 | blX = brX + scrollbar->width(); | ||
1176 | scrollbar->move(contentsRect().topLeft()); | ||
1177 | scrollbar->show(); | ||
1178 | break; | ||
1179 | case SCRRIGHT: | ||
1180 | columns = ( contentsRect().width() - 2 * rimX - scrollbar->width()) / font_w; | ||
1181 | dcolumns = columns; | ||
1182 | if(vcolumns) columns = vcolumns; | ||
1183 | blX = (contentsRect().width() - (columns*font_w) - scrollbar->width() ) / 2; | ||
1184 | if(showhscrollbar) | ||
1185 | blX = -hposition * font_w; | ||
1186 | brX = blX; | ||
1187 | scrollbar->move(contentsRect().topRight() - QPoint(scrollbar->width()-1,0)); | ||
1188 | scrollbar->show(); | ||
1189 | break; | ||
1190 | } | ||
1191 | //FIXME: support 'rounding' styles | ||
1192 | lines = ( contentsRect().height() - 2 * rimY ) / font_h; | ||
1193 | bY = (contentsRect().height() - (lines *font_h)) / 2; | ||
1109 | 1194 | ||
1110 | scrollbar->resize(QApplication::style().scrollBarExtent().width(), | 1195 | if(showhscrollbar == 1) { |
1196 | hScrollbar->resize(contentsRect().width() - hwidth, hwidth); | ||
1197 | hScrollbar->setRange(0, vcolumns - dcolumns); | ||
1198 | |||
1199 | QPoint p = contentsRect().bottomLeft(); | ||
1200 | hScrollbar->move(QPoint(p.x(), p.y() - hwidth)); | ||
1201 | hScrollbar->show(); | ||
1202 | } | ||
1203 | else hScrollbar->hide(); | ||
1204 | |||
1205 | if(showhscrollbar == 1) { | ||
1206 | lines = lines - (hwidth / font_h) - 1; | ||
1207 | if(lines < 1) lines = 1; | ||
1208 | } | ||
1209 | |||
1210 | /*//FIXME: set rimX == rimY == 0 when running in full screen mode. | ||
1211 | Config cfg("Konsole"); | ||
1212 | cfg.setGroup("ScrollBar"); | ||
1213 | useHorzScroll=cfg.readBoolEntry("HorzScroll",0); | ||
1214 | |||
1215 | scrollbar->resize( QApplication::style().scrollBarExtent().width(), | ||
1111 | contentsRect().height()); | 1216 | contentsRect().height()); |
1217 | qDebug("font_w %d", font_w); | ||
1112 | switch(scrollLoc) | 1218 | switch(scrollLoc) |
1113 | { | 1219 | { |
1114 | case SCRNONE : | 1220 | case SCRNONE : |
1115 | columns = ( contentsRect().width() - 2 * rimX ) / font_w; | 1221 | columns = ( contentsRect().width() - 2 * rimX ) / font_w; |
1116 | blX = (contentsRect().width() - (columns*font_w) ) / 2; | 1222 | blX = (contentsRect().width() - (columns*font_w) ) / 2; |
1117 | brX = blX; | 1223 | brX = blX; |
1118 | scrollbar->hide(); | 1224 | scrollbar->hide(); |
1119 | break; | 1225 | break; |
1120 | case SCRLEFT : | 1226 | case SCRLEFT : |
1121 | columns = ( contentsRect().width() - 2 * rimX - scrollbar->width()) / font_w; | 1227 | columns = ( contentsRect().width() - 2 * rimX - scrollbar->width()) / font_w; |
1228 | if(useHorzScroll) columns = columns * (font_w/2); | ||
1122 | brX = (contentsRect().width() - (columns*font_w) - scrollbar->width() ) / 2; | 1229 | brX = (contentsRect().width() - (columns*font_w) - scrollbar->width() ) / 2; |
1123 | blX = brX + scrollbar->width(); | 1230 | blX = brX + scrollbar->width(); |
1124 | scrollbar->move(contentsRect().topLeft()); | 1231 | scrollbar->move(contentsRect().topLeft()); |
1125 | scrollbar->show(); | 1232 | scrollbar->show(); |
1126 | break; | 1233 | break; |
1127 | case SCRRIGHT: | 1234 | case SCRRIGHT: |
1128 | columns = ( contentsRect().width() - 2 * rimX - scrollbar->width()) / font_w; | 1235 | columns = ( contentsRect().width() - 2 * rimX - scrollbar->width() ) / font_w; |
1129 | blX = (contentsRect().width() - (columns*font_w) - scrollbar->width() ) / 2; | 1236 | if(useHorzScroll) columns = columns * (font_w/2); |
1130 | brX = blX; | 1237 | blX = (contentsRect().width() - (columns*font_w) - scrollbar->width() ) / 2; |
1131 | scrollbar->move(contentsRect().topRight() - QPoint(scrollbar->width()-1,0)); | 1238 | if(useHorzScroll) { |
1239 | brX = blX =2; | ||
1240 | } else { | ||
1241 | brX=blX; | ||
1242 | } | ||
1243 | scrollbar->move(contentsRect().topRight() - QPoint(scrollbar->width()-1,0) ); | ||
1132 | scrollbar->show(); | 1244 | scrollbar->show(); |
1133 | break; | 1245 | break; |
1134 | } | 1246 | } |
1247 | |||
1248 | if( !scrollbar->isHidden()) | ||
1249 | hScrollbar->resize( contentsRect().width()-SCRWIDTH, QApplication::style() | ||
1250 | .scrollBarExtent().height()); | ||
1251 | else | ||
1252 | hScrollbar->resize( contentsRect().width(), QApplication::style() | ||
1253 | .scrollBarExtent().height()); | ||
1254 | |||
1255 | hScrollbar->move( 0, contentsRect().height() - SCRWIDTH); | ||
1256 | |||
1257 | |||
1258 | if(useHorzScroll) { | ||
1259 | hScrollbar->show(); | ||
1260 | lines = ( (contentsRect().height() - SCRWIDTH) - 2 * rimY ) / font_h; | ||
1261 | bY = ((contentsRect().height() - SCRWIDTH) - (lines *font_h)) / 2; | ||
1262 | } else { | ||
1263 | hScrollbar->hide(); | ||
1264 | lines = (contentsRect().height() - 2 * rimY ) / font_h; | ||
1265 | bY = (contentsRect().height() - (lines *font_h)) / 2; | ||
1266 | } | ||
1267 | */ | ||
1135 | //FIXME: support 'rounding' styles | 1268 | //FIXME: support 'rounding' styles |
1136 | lines = ( contentsRect().height() - 2 * rimY ) / font_h; | ||
1137 | bY = (contentsRect().height() - (lines *font_h)) / 2; | ||
1138 | } | 1269 | } |
1139 | 1270 | ||
1140 | void TEWidget::makeImage() | 1271 | void TEWidget::makeImage() |
1141 | //FIXME: rename 'calcGeometry? | 1272 | //FIXME: rename 'calcGeometry? |
1142 | { | 1273 | { |
1143 | calcGeometry(); | 1274 | calcGeometry(); |
1144 | image = (ca*) malloc(lines*columns*sizeof(ca)); | 1275 | image = (ca*) malloc(lines*columns*sizeof(ca)); |
1145 | clearImage(); | 1276 | clearImage(); |
@@ -1261,8 +1392,16 @@ void TEWidget::drop_menu_activated(int item) | |||
1261 | currentSession->getEmulation()->sendString(dropText.local8Bit()); | 1392 | currentSession->getEmulation()->sendString(dropText.local8Bit()); |
1262 | currentSession->getEmulation()->sendString("\n"); | 1393 | currentSession->getEmulation()->sendString("\n"); |
1263 | // KWM::activate((Window)this->winId()); | 1394 | // KWM::activate((Window)this->winId()); |
1264 | break; | 1395 | break; |
1265 | } | 1396 | } |
1266 | #endif | 1397 | #endif |
1267 | } | 1398 | } |
1268 | 1399 | ||
1400 | void TEWidget::setWrapAt(int columns) | ||
1401 | { | ||
1402 | vcolumns = columns; | ||
1403 | propagateSize(); | ||
1404 | update(); | ||
1405 | } | ||
1406 | |||
1407 | |||
diff --git a/core/apps/embeddedkonsole/TEWidget.h b/core/apps/embeddedkonsole/TEWidget.h index 40e1aea..a480d45 100644 --- a/core/apps/embeddedkonsole/TEWidget.h +++ b/core/apps/embeddedkonsole/TEWidget.h | |||
@@ -55,53 +55,58 @@ public: | |||
55 | void setColorTable(const ColorEntry table[]); | 55 | void setColorTable(const ColorEntry table[]); |
56 | 56 | ||
57 | void setScrollbarLocation(int loc); | 57 | void setScrollbarLocation(int loc); |
58 | enum { SCRNONE=0, SCRLEFT=1, SCRRIGHT=2 }; | 58 | enum { SCRNONE=0, SCRLEFT=1, SCRRIGHT=2 }; |
59 | 59 | ||
60 | void setScroll(int cursor, int lines); | 60 | void setScroll(int cursor, int lines); |
61 | void doScroll(int lines); | 61 | void doScroll(int lines); |
62 | 62 | ||
63 | void doHScroll(int lines); | ||
64 | |||
65 | |||
63 | void emitSelection(); | 66 | void emitSelection(); |
67 | void setWrapAt(int columns); | ||
64 | 68 | ||
65 | public: | 69 | public: |
66 | 70 | ||
67 | void setImage(const ca* const newimg, int lines, int columns); | 71 | void setImage(const ca* const newimg, int lines, int columns); |
68 | 72 | ||
69 | int Lines() { return lines; } | 73 | int Lines() { return lines; } |
70 | int Columns() { return columns; } | 74 | int Columns() { return columns; } |
71 | 75 | ||
72 | void calcGeometry(); | 76 | void calcGeometry(); |
73 | void propagateSize(); | 77 | void propagateSize(); |
74 | QSize calcSize(int cols, int lins) const; | 78 | QSize calcSize(int cols, int lins) const; |
75 | 79 | ||
76 | QSize sizeHint() const; | 80 | QSize sizeHint() const; |
77 | 81 | ||
78 | public: | 82 | public: |
83 | bool useHorzScroll; | ||
79 | 84 | ||
80 | void Bell(); | 85 | void Bell(); |
81 | void emitText(QString text); | 86 | void emitText(QString text); |
82 | void pasteClipboard(); | 87 | void pasteClipboard(); |
83 | 88 | ||
84 | signals: | 89 | signals: |
85 | 90 | ||
86 | void keyPressedSignal(QKeyEvent *e); | 91 | void keyPressedSignal(QKeyEvent *e); |
87 | void mouseSignal(int cb, int cx, int cy); | 92 | void mouseSignal(int cb, int cx, int cy); |
88 | void changedImageSizeSignal(int lines, int columns); | 93 | void changedImageSizeSignal(int lines, int columns); |
89 | void changedHistoryCursor(int value); | 94 | void changedHistoryCursor(int value); |
95 | void changedHorzCursor(int value); | ||
90 | void configureRequest( TEWidget*, int state, int x, int y ); | 96 | void configureRequest( TEWidget*, int state, int x, int y ); |
91 | 97 | ||
92 | void clearSelectionSignal(); | 98 | void clearSelectionSignal(); |
93 | void beginSelectionSignal( const int x, const int y ); | 99 | void beginSelectionSignal( const int x, const int y ); |
94 | void extendSelectionSignal( const int x, const int y ); | 100 | void extendSelectionSignal( const int x, const int y ); |
95 | void endSelectionSignal(const BOOL preserve_line_breaks); | 101 | void endSelectionSignal(const BOOL preserve_line_breaks); |
96 | 102 | ||
97 | 103 | ||
98 | protected: | 104 | protected: |
99 | |||
100 | virtual void styleChange( QStyle& ); | 105 | virtual void styleChange( QStyle& ); |
101 | 106 | ||
102 | bool eventFilter( QObject *, QEvent * ); | 107 | bool eventFilter( QObject *, QEvent * ); |
103 | 108 | ||
104 | void drawAttrStr(QPainter &paint, QRect rect, | 109 | void drawAttrStr(QPainter &paint, QRect rect, |
105 | QString& str, ca attr, BOOL pm, BOOL clear); | 110 | QString& str, ca attr, BOOL pm, BOOL clear); |
106 | void paintEvent( QPaintEvent * ); | 111 | void paintEvent( QPaintEvent * ); |
107 | 112 | ||
@@ -142,16 +147,17 @@ public: | |||
142 | 147 | ||
143 | public slots: | 148 | public slots: |
144 | 149 | ||
145 | void onClearSelection(); | 150 | void onClearSelection(); |
146 | 151 | ||
147 | protected slots: | 152 | protected slots: |
148 | 153 | ||
149 | void scrollChanged(int value); | 154 | void scrollChanged(int value); |
155 | void hScrollChanged(int value); | ||
150 | void blinkEvent(); | 156 | void blinkEvent(); |
151 | 157 | ||
152 | private: | 158 | private: |
153 | 159 | ||
154 | QChar (*fontMap)(QChar); // possible vt100 font extention | 160 | QChar (*fontMap)(QChar); // possible vt100 font extention |
155 | 161 | ||
156 | bool fixed_font; // has fixed pitch | 162 | bool fixed_font; // has fixed pitch |
157 | int font_h; // height | 163 | int font_h; // height |
@@ -175,19 +181,22 @@ private: | |||
175 | 181 | ||
176 | QPoint iPntSel; // initial selection point | 182 | QPoint iPntSel; // initial selection point |
177 | QPoint pntSel; // current selection point | 183 | QPoint pntSel; // current selection point |
178 | int actSel; // selection state | 184 | int actSel; // selection state |
179 | BOOL word_selection_mode; | 185 | BOOL word_selection_mode; |
180 | BOOL preserve_line_breaks; | 186 | BOOL preserve_line_breaks; |
181 | 187 | ||
182 | QClipboard* cb; | 188 | QClipboard* cb; |
183 | QScrollBar* scrollbar; | 189 | QScrollBar* scrollbar, *hScrollbar; |
184 | int scrollLoc; | 190 | |
191 | int scrollLoc, hScrollLoc; | ||
192 | int hposition, vcolumns; | ||
185 | 193 | ||
194 | |||
186 | //#define SCRNONE 0 | 195 | //#define SCRNONE 0 |
187 | //#define SCRLEFT 1 | 196 | //#define SCRLEFT 1 |
188 | //#define SCRRIGHT 2 | 197 | //#define SCRRIGHT 2 |
189 | 198 | ||
190 | BOOL blinking; // hide text in paintEvent | 199 | BOOL blinking; // hide text in paintEvent |
191 | BOOL hasBlinker; // has characters to blink | 200 | BOOL hasBlinker; // has characters to blink |
192 | QTimer* blinkT; // active when hasBlinker | 201 | QTimer* blinkT; // active when hasBlinker |
193 | QPopupMenu* m_drop; | 202 | QPopupMenu* m_drop; |
diff --git a/core/apps/embeddedkonsole/TEmulation.cpp b/core/apps/embeddedkonsole/TEmulation.cpp index 6f3ad32..c19f2a1 100644 --- a/core/apps/embeddedkonsole/TEmulation.cpp +++ b/core/apps/embeddedkonsole/TEmulation.cpp | |||
@@ -4,21 +4,21 @@ | |||
4 | /* */ | 4 | /* */ |
5 | /* -------------------------------------------------------------------------- */ | 5 | /* -------------------------------------------------------------------------- */ |
6 | /* */ | 6 | /* */ |
7 | /* Copyright (c) 1997,1998 by Lars Doelle <lars.doelle@on-line.de> */ | 7 | /* Copyright (c) 1997,1998 by Lars Doelle <lars.doelle@on-line.de> */ |
8 | /* */ | 8 | /* */ |
9 | /* This file is part of Konsole - an X terminal for KDE */ | 9 | /* This file is part of Konsole - an X terminal for KDE */ |
10 | /* */ | 10 | /* */ |
11 | /* -------------------------------------------------------------------------- */ | 11 | /* -------------------------------------------------------------------------- */ |
12 | /* */ | 12 | /* */ |
13 | /* Ported Konsole to Qt/Embedded */ | 13 | /* Ported Konsole to Qt/Embedded */ |
14 | /* */ | 14 | /* */ |
15 | /* Copyright (C) 2000 by John Ryland <jryland@trolltech.com> */ | 15 | /* Copyright (C) 2000 by John Ryland <jryland@trolltech.com> */ |
16 | /* */ | 16 | /* */ |
17 | /* -------------------------------------------------------------------------- */ | 17 | /* -------------------------------------------------------------------------- */ |
18 | 18 | ||
19 | /*! \class TEmulation | 19 | /*! \class TEmulation |
20 | 20 | ||
21 | \brief Mediator between TEWidget and TEScreen. | 21 | \brief Mediator between TEWidget and TEScreen. |
22 | 22 | ||
23 | This class is responsible to scan the escapes sequences of the terminal | 23 | This class is responsible to scan the escapes sequences of the terminal |
24 | emulation and to map it to their corresponding semantic complements. | 24 | emulation and to map it to their corresponding semantic complements. |
@@ -98,30 +98,40 @@ TEmulation::TEmulation(TEWidget* gui) | |||
98 | screen[1] = new TEScreen(gui->Lines(),gui->Columns()); | 98 | screen[1] = new TEScreen(gui->Lines(),gui->Columns()); |
99 | scr = screen[0]; | 99 | scr = screen[0]; |
100 | 100 | ||
101 | bulk_nlcnt = 0; // reset bulk newline counter | 101 | bulk_nlcnt = 0; // reset bulk newline counter |
102 | bulk_incnt = 0; // reset bulk counter | 102 | bulk_incnt = 0; // reset bulk counter |
103 | connected = FALSE; | 103 | connected = FALSE; |
104 | 104 | ||
105 | QObject::connect(&bulk_timer, SIGNAL(timeout()), this, SLOT(showBulk()) ); | 105 | QObject::connect(&bulk_timer, SIGNAL(timeout()), this, SLOT(showBulk()) ); |
106 | |||
106 | QObject::connect(gui,SIGNAL(changedImageSizeSignal(int,int)), | 107 | QObject::connect(gui,SIGNAL(changedImageSizeSignal(int,int)), |
107 | this,SLOT(onImageSizeChange(int,int))); | 108 | this,SLOT(onImageSizeChange(int,int))); |
109 | |||
108 | QObject::connect(gui,SIGNAL(changedHistoryCursor(int)), | 110 | QObject::connect(gui,SIGNAL(changedHistoryCursor(int)), |
109 | this,SLOT(onHistoryCursorChange(int))); | 111 | this,SLOT(onHistoryCursorChange(int))); |
112 | |||
113 | QObject::connect(gui,SIGNAL(changedHorzCursor(int)), | ||
114 | this,SLOT(onHorzCursorChange(int))); | ||
115 | |||
110 | QObject::connect(gui,SIGNAL(keyPressedSignal(QKeyEvent*)), | 116 | QObject::connect(gui,SIGNAL(keyPressedSignal(QKeyEvent*)), |
111 | this,SLOT(onKeyPress(QKeyEvent*))); | 117 | this,SLOT(onKeyPress(QKeyEvent*))); |
118 | |||
112 | QObject::connect(gui,SIGNAL(beginSelectionSignal(const int,const int)), | 119 | QObject::connect(gui,SIGNAL(beginSelectionSignal(const int,const int)), |
113 | this,SLOT(onSelectionBegin(const int,const int)) ); | 120 | this,SLOT(onSelectionBegin(const int,const int)) ); |
121 | |||
114 | QObject::connect(gui,SIGNAL(extendSelectionSignal(const int,const int)), | 122 | QObject::connect(gui,SIGNAL(extendSelectionSignal(const int,const int)), |
115 | this,SLOT(onSelectionExtend(const int,const int)) ); | 123 | this,SLOT(onSelectionExtend(const int,const int)) ); |
124 | |||
116 | QObject::connect(gui,SIGNAL(endSelectionSignal(const BOOL)), | 125 | QObject::connect(gui,SIGNAL(endSelectionSignal(const BOOL)), |
117 | this,SLOT(setSelection(const BOOL)) ); | 126 | this,SLOT(setSelection(const BOOL)) ); |
127 | |||
118 | QObject::connect(gui,SIGNAL(clearSelectionSignal()), | 128 | QObject::connect(gui,SIGNAL(clearSelectionSignal()), |
119 | this,SLOT(clearSelection()) ); | 129 | this,SLOT(clearSelection()) ); |
120 | } | 130 | } |
121 | 131 | ||
122 | /*! | 132 | /*! |
123 | */ | 133 | */ |
124 | 134 | ||
125 | TEmulation::~TEmulation() | 135 | TEmulation::~TEmulation() |
126 | { | 136 | { |
127 | delete screen[0]; | 137 | delete screen[0]; |
@@ -294,18 +304,20 @@ void TEmulation::showBulk() | |||
294 | bulk_incnt = 0; // reset bulk counter | 304 | bulk_incnt = 0; // reset bulk counter |
295 | if (connected) | 305 | if (connected) |
296 | { | 306 | { |
297 | ca* image = scr->getCookedImage(); // get the image | 307 | ca* image = scr->getCookedImage(); // get the image |
298 | gui->setImage(image, | 308 | gui->setImage(image, |
299 | scr->getLines(), | 309 | scr->getLines(), |
300 | scr->getColumns()); // actual refresh | 310 | scr->getColumns()); // actual refresh |
301 | free(image); | 311 | free(image); |
302 | //FIXME: check that we do not trigger other draw event here. | 312 | |
313 | //FIXME: check that we do not trigger other draw event here. | ||
303 | gui->setScroll(scr->getHistCursor(),scr->getHistLines()); | 314 | gui->setScroll(scr->getHistCursor(),scr->getHistLines()); |
315 | |||
304 | } | 316 | } |
305 | } | 317 | } |
306 | 318 | ||
307 | void TEmulation::bulkStart() | 319 | void TEmulation::bulkStart() |
308 | { | 320 | { |
309 | if (bulk_timer.isActive()) bulk_timer.stop(); | 321 | if (bulk_timer.isActive()) bulk_timer.stop(); |
310 | } | 322 | } |
311 | 323 | ||
@@ -334,30 +346,33 @@ void TEmulation::setConnect(bool c) | |||
334 | // --------------------------------------------------------------------------- | 346 | // --------------------------------------------------------------------------- |
335 | 347 | ||
336 | /*! triggered by image size change of the TEWidget `gui'. | 348 | /*! triggered by image size change of the TEWidget `gui'. |
337 | 349 | ||
338 | This event is simply propagated to the attached screens | 350 | This event is simply propagated to the attached screens |
339 | and to the related serial line. | 351 | and to the related serial line. |
340 | */ | 352 | */ |
341 | 353 | ||
342 | void TEmulation::onImageSizeChange(int lines, int columns) | 354 | void TEmulation::onImageSizeChange(int lines, int columns) { |
343 | { | ||
344 | if (!connected) return; | 355 | if (!connected) return; |
345 | screen[0]->resizeImage(lines,columns); | 356 | screen[0]->resizeImage(lines,columns); |
346 | screen[1]->resizeImage(lines,columns); | 357 | screen[1]->resizeImage(lines,columns); |
347 | showBulk(); | 358 | showBulk(); |
348 | emit ImageSizeChanged(lines,columns); // propagate event to serial line | 359 | emit ImageSizeChanged(lines,columns); // propagate event to serial line |
349 | } | 360 | } |
350 | 361 | ||
351 | void TEmulation::onHistoryCursorChange(int cursor) | 362 | void TEmulation::onHistoryCursorChange(int cursor) { |
352 | { | ||
353 | if (!connected) return; | 363 | if (!connected) return; |
354 | scr->setHistCursor(cursor); | 364 | scr->setHistCursor(cursor); |
355 | showBulk(); | 365 | showBulk(); |
356 | } | 366 | } |
357 | 367 | ||
358 | void TEmulation::setColumns(int columns) | 368 | void TEmulation::onHorzCursorChange(int cursor) { |
359 | { | 369 | if (!connected) return; |
370 | scr->setHorzCursor(cursor); | ||
371 | showBulk(); | ||
372 | } | ||
373 | |||
374 | void TEmulation::setColumns(int columns) { | ||
360 | //FIXME: this goes strange ways. | 375 | //FIXME: this goes strange ways. |
361 | // Can we put this straight or explain it at least? | 376 | // Can we put this straight or explain it at least? |
362 | emit changeColumns(columns); | 377 | emit changeColumns(columns); |
363 | } | 378 | } |
diff --git a/core/apps/embeddedkonsole/konsole.cpp b/core/apps/embeddedkonsole/konsole.cpp index a8ddc99..3c87ad4 100644 --- a/core/apps/embeddedkonsole/konsole.cpp +++ b/core/apps/embeddedkonsole/konsole.cpp | |||
@@ -353,31 +353,43 @@ void Konsole::init(const char* _pgm, QStrList & _args) | |||
353 | // commonCombo->changeItem( tmp,i ); | 353 | // commonCombo->changeItem( tmp,i ); |
354 | // } | 354 | // } |
355 | 355 | ||
356 | connect( commonCombo, SIGNAL( activated(int) ), this, SLOT( enterCommand(int) )); | 356 | connect( commonCombo, SIGNAL( activated(int) ), this, SLOT( enterCommand(int) )); |
357 | 357 | ||
358 | scrollMenu->insertItem(tr( "None" )); | 358 | scrollMenu->insertItem(tr( "None" )); |
359 | scrollMenu->insertItem(tr( "Left" )); | 359 | scrollMenu->insertItem(tr( "Left" )); |
360 | scrollMenu->insertItem(tr( "Right" )); | 360 | scrollMenu->insertItem(tr( "Right" )); |
361 | scrollMenu->insertSeparator(4); | ||
362 | scrollMenu->insertItem(tr( "Horizontal" )); | ||
363 | |||
361 | configMenu->insertItem(tr( "ScrollBar" ),scrollMenu); | 364 | configMenu->insertItem(tr( "ScrollBar" ),scrollMenu); |
362 | 365 | //scrollMenuSelected(-29); | |
366 | // cfg.setGroup("ScrollBar"); | ||
367 | // if(cfg.readBoolEntry("HorzScroll",0)) { | ||
368 | // if(cfg.readNumEntry("Position",2) == 0) | ||
369 | // te->setScrollbarLocation(1); | ||
370 | // else | ||
371 | // te->setScrollbarLocation(0); | ||
372 | // te->setScrollbarLocation( cfg.readNumEntry("Position",2)); | ||
373 | // te->setWrapAt(120); | ||
374 | // } | ||
363 | // create applications ///////////////////////////////////////////////////// | 375 | // create applications ///////////////////////////////////////////////////// |
364 | setCentralWidget(tab); | 376 | setCentralWidget(tab); |
365 | 377 | ||
366 | // load keymaps //////////////////////////////////////////////////////////// | 378 | // load keymaps //////////////////////////////////////////////////////////// |
367 | KeyTrans::loadAll(); | 379 | KeyTrans::loadAll(); |
368 | for (int i = 0; i < KeyTrans::count(); i++) | 380 | for (int i = 0; i < KeyTrans::count(); i++) |
369 | { KeyTrans* s = KeyTrans::find(i); | 381 | { KeyTrans* s = KeyTrans::find(i); |
370 | assert( s ); | 382 | assert( s ); |
371 | } | 383 | } |
372 | 384 | ||
373 | se_pgm = _pgm; | 385 | se_pgm = _pgm; |
374 | se_args = _args; | 386 | se_args = _args; |
375 | 387 | se_args.prepend("--login"); | |
376 | parseCommandLine(); | 388 | parseCommandLine(); |
377 | // read and apply default values /////////////////////////////////////////// | 389 | // read and apply default values /////////////////////////////////////////// |
378 | resize(321, 321); // Dummy. | 390 | resize(321, 321); // Dummy. |
379 | QSize currentSize = size(); | 391 | QSize currentSize = size(); |
380 | if (currentSize != size()) | 392 | if (currentSize != size()) |
381 | defaultSize = size(); | 393 | defaultSize = size(); |
382 | } | 394 | } |
383 | 395 | ||
@@ -503,16 +515,18 @@ QSize Konsole::calcSize(int columns, int lines) { | |||
503 | 515 | ||
504 | /** | 516 | /** |
505 | sets application window to a size based on columns X lines of the te | 517 | sets application window to a size based on columns X lines of the te |
506 | guest widget. Call with (0,0) for setting default size. | 518 | guest widget. Call with (0,0) for setting default size. |
507 | */ | 519 | */ |
508 | 520 | ||
509 | void Konsole::setColLin(int columns, int lines) | 521 | void Konsole::setColLin(int columns, int lines) |
510 | { | 522 | { |
523 | qDebug("konsole::setColLin:: Columns %d", columns); | ||
524 | |||
511 | if ((columns==0) || (lines==0)) | 525 | if ((columns==0) || (lines==0)) |
512 | { | 526 | { |
513 | if (defaultSize.isEmpty()) // not in config file : set default value | 527 | if (defaultSize.isEmpty()) // not in config file : set default value |
514 | { | 528 | { |
515 | defaultSize = calcSize(80,24); | 529 | defaultSize = calcSize(80,24); |
516 | // notifySize(24,80); // set menu items (strange arg order !) | 530 | // notifySize(24,80); // set menu items (strange arg order !) |
517 | } | 531 | } |
518 | resize(defaultSize); | 532 | resize(defaultSize); |
@@ -547,16 +561,17 @@ void Konsole::setFont(int fontno) | |||
547 | n_font = fontno; | 561 | n_font = fontno; |
548 | } | 562 | } |
549 | */ | 563 | */ |
550 | 564 | ||
551 | // --| color selection |------------------------------------------------------- | 565 | // --| color selection |------------------------------------------------------- |
552 | 566 | ||
553 | void Konsole::changeColumns(int columns) | 567 | void Konsole::changeColumns(int columns) |
554 | { | 568 | { |
569 | qDebug("change columns"); | ||
555 | TEWidget* te = getTe(); | 570 | TEWidget* te = getTe(); |
556 | if (te != 0) { | 571 | if (te != 0) { |
557 | setColLin(columns,te->Lines()); | 572 | setColLin(columns,te->Lines()); |
558 | te->update(); | 573 | te->update(); |
559 | } | 574 | } |
560 | } | 575 | } |
561 | 576 | ||
562 | //FIXME: If a child dies during session swap, | 577 | //FIXME: If a child dies during session swap, |
@@ -795,34 +810,45 @@ void Konsole::setColor() | |||
795 | Config cfg("Konsole"); | 810 | Config cfg("Konsole"); |
796 | cfg.setGroup("Colors"); | 811 | cfg.setGroup("Colors"); |
797 | int scheme = cfg.readNumEntry("Schema",1); | 812 | int scheme = cfg.readNumEntry("Schema",1); |
798 | if(scheme != 1) colorMenuSelected( -scheme); | 813 | if(scheme != 1) colorMenuSelected( -scheme); |
799 | } | 814 | } |
800 | 815 | ||
801 | void Konsole::scrollMenuSelected(int index) | 816 | void Konsole::scrollMenuSelected(int index) |
802 | { | 817 | { |
803 | // QString temp; | 818 | qDebug( "scrollbar menu %d",index); |
804 | // qDebug( temp.sprintf("scrollbar menu %d",index)); | ||
805 | TEWidget* te = getTe(); | 819 | TEWidget* te = getTe(); |
806 | Config cfg("Konsole"); | 820 | Config cfg("Konsole"); |
807 | cfg.setGroup("ScrollBar"); | 821 | cfg.setGroup("ScrollBar"); |
808 | switch( index){ | 822 | switch( index){ |
809 | case -25: | 823 | case -25: |
810 | te->setScrollbarLocation(0); | 824 | te->setScrollbarLocation(0); |
811 | cfg.writeEntry("Position",0); | 825 | cfg.writeEntry("Position",0); |
812 | break; | 826 | break; |
813 | case -26: | 827 | case -26: |
814 | te->setScrollbarLocation(1); | 828 | te->setScrollbarLocation(1); |
815 | cfg.writeEntry("Position",1); | 829 | cfg.writeEntry("Position",1); |
816 | break; | 830 | break; |
817 | case -27: | 831 | case -27: |
818 | te->setScrollbarLocation(2); | 832 | te->setScrollbarLocation(2); |
819 | cfg.writeEntry("Position",2); | 833 | cfg.writeEntry("Position",2); |
820 | break; | 834 | break; |
835 | case -29: { | ||
836 | bool b=cfg.readBoolEntry("HorzScroll",0); | ||
837 | cfg.writeEntry("HorzScroll", !b ); | ||
838 | cfg.write(); | ||
839 | if(cfg.readNumEntry("Position",2) == 0) | ||
840 | te->setScrollbarLocation(1); | ||
841 | else | ||
842 | te->setScrollbarLocation(0); | ||
843 | te->setScrollbarLocation( cfg.readNumEntry("Position",2)); | ||
844 | te->setWrapAt(120); | ||
845 | } | ||
846 | break; | ||
821 | }; | 847 | }; |
822 | 848 | ||
823 | } | 849 | } |
824 | 850 | ||
825 | void Konsole::editCommandListMenuSelected(int iD) | 851 | void Konsole::editCommandListMenuSelected(int iD) |
826 | { | 852 | { |
827 | // QString temp; | 853 | // QString temp; |
828 | // qDebug( temp.sprintf("edit command list %d",iD)); | 854 | // qDebug( temp.sprintf("edit command list %d",iD)); |