summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/apps/embeddedkonsole/TEWidget.cpp6
1 files changed, 5 insertions, 1 deletions
diff --git a/core/apps/embeddedkonsole/TEWidget.cpp b/core/apps/embeddedkonsole/TEWidget.cpp
index 23720cd..a989e10 100644
--- a/core/apps/embeddedkonsole/TEWidget.cpp
+++ b/core/apps/embeddedkonsole/TEWidget.cpp
@@ -678,648 +678,652 @@ void TEWidget::mousePressEvent(QMouseEvent* ev)
678 678
679//printf("press top left [%d,%d] by=%d\n",tLx,tLy, bY); 679//printf("press top left [%d,%d] by=%d\n",tLx,tLy, bY);
680 if ( ev->button() == LeftButton) 680 if ( ev->button() == LeftButton)
681 { 681 {
682 QPoint pos = QPoint((ev->x()-tLx-blX)/font_w,(ev->y()-tLy-bY)/font_h); 682 QPoint pos = QPoint((ev->x()-tLx-blX)/font_w,(ev->y()-tLy-bY)/font_h);
683 683
684 if ( ev->state() & ControlButton ) preserve_line_breaks = FALSE ; 684 if ( ev->state() & ControlButton ) preserve_line_breaks = FALSE ;
685 685
686 if (mouse_marks || (ev->state() & ShiftButton)) 686 if (mouse_marks || (ev->state() & ShiftButton))
687 { 687 {
688 emit clearSelectionSignal(); 688 emit clearSelectionSignal();
689 iPntSel = pntSel = pos; 689 iPntSel = pntSel = pos;
690 actSel = 1; // left mouse button pressed but nothing selected yet. 690 actSel = 1; // left mouse button pressed but nothing selected yet.
691 grabMouse( /*crossCursor*/ ); // handle with care! 691 grabMouse( /*crossCursor*/ ); // handle with care!
692 } 692 }
693 else 693 else
694 { 694 {
695 emit mouseSignal( 0, pos.x() + 1, pos.y() + 1 ); // left button 695 emit mouseSignal( 0, pos.x() + 1, pos.y() + 1 ); // left button
696 } 696 }
697 } 697 }
698 if ( ev->button() == MidButton ) 698 if ( ev->button() == MidButton )
699 { 699 {
700 emitSelection(); 700 emitSelection();
701 } 701 }
702 if ( ev->button() == RightButton ) // Configure 702 if ( ev->button() == RightButton ) // Configure
703 { 703 {
704 emit configureRequest( this, ev->state()&(ShiftButton|ControlButton), ev->x(), ev->y() ); 704 emit configureRequest( this, ev->state()&(ShiftButton|ControlButton), ev->x(), ev->y() );
705 } 705 }
706} 706}
707 707
708void TEWidget::mouseMoveEvent(QMouseEvent* ev) 708void TEWidget::mouseMoveEvent(QMouseEvent* ev)
709{ 709{
710 // for auto-hiding the cursor, we need mouseTracking 710 // for auto-hiding the cursor, we need mouseTracking
711 if (ev->state() == NoButton ) return; 711 if (ev->state() == NoButton ) return;
712 712
713 if (actSel == 0) return; 713 if (actSel == 0) return;
714 714
715 // don't extend selection while pasting 715 // don't extend selection while pasting
716 if (ev->state() & MidButton) return; 716 if (ev->state() & MidButton) return;
717 717
718 //if ( !contentsRect().contains(ev->pos()) ) return; 718 //if ( !contentsRect().contains(ev->pos()) ) return;
719 QPoint tL = contentsRect().topLeft(); 719 QPoint tL = contentsRect().topLeft();
720 int tLx = tL.x(); 720 int tLx = tL.x();
721 int tLy = tL.y(); 721 int tLy = tL.y();
722 int scroll = scrollbar->value(); 722 int scroll = scrollbar->value();
723// int hScroll = hScrollbar->value(); 723// int hScroll = hScrollbar->value();
724 724
725 // we're in the process of moving the mouse with the left button pressed 725 // we're in the process of moving the mouse with the left button pressed
726 // the mouse cursor will kept catched within the bounds of the text in 726 // the mouse cursor will kept catched within the bounds of the text in
727 // this widget. 727 // this widget.
728 728
729 // Adjust position within text area bounds. See FIXME above. 729 // Adjust position within text area bounds. See FIXME above.
730 QPoint pos = ev->pos(); 730 QPoint pos = ev->pos();
731 if ( pos.x() < tLx+blX ) pos.setX( tLx+blX ); 731 if ( pos.x() < tLx+blX ) pos.setX( tLx+blX );
732 if ( pos.x() > tLx+blX+columns*font_w-1 ) pos.setX( tLx+blX+columns*font_w ); 732 if ( pos.x() > tLx+blX+columns*font_w-1 ) pos.setX( tLx+blX+columns*font_w );
733 if ( pos.y() < tLy+bY ) pos.setY( tLy+bY ); 733 if ( pos.y() < tLy+bY ) pos.setY( tLy+bY );
734 if ( pos.y() > tLy+bY+lines*font_h-1 ) pos.setY( tLy+bY+lines*font_h-1 ); 734 if ( pos.y() > tLy+bY+lines*font_h-1 ) pos.setY( tLy+bY+lines*font_h-1 );
735 // check if we produce a mouse move event by this 735 // check if we produce a mouse move event by this
736 if ( pos != ev->pos() ) cursor().setPos(mapToGlobal(pos)); 736 if ( pos != ev->pos() ) cursor().setPos(mapToGlobal(pos));
737 737
738 if ( pos.y() == tLy+bY+lines*font_h-1 ) 738 if ( pos.y() == tLy+bY+lines*font_h-1 )
739 { 739 {
740 scrollbar->setValue(scrollbar->value()+yMouseScroll); // scrollforward 740 scrollbar->setValue(scrollbar->value()+yMouseScroll); // scrollforward
741 } 741 }
742 if ( pos.y() == tLy+bY ) 742 if ( pos.y() == tLy+bY )
743 { 743 {
744 scrollbar->setValue(scrollbar->value()-yMouseScroll); // scrollback 744 scrollbar->setValue(scrollbar->value()-yMouseScroll); // scrollback
745 } 745 }
746 746
747 QPoint here = QPoint((pos.x()-tLx-blX)/font_w,(pos.y()-tLy-bY)/font_h); 747 QPoint here = QPoint((pos.x()-tLx-blX)/font_w,(pos.y()-tLy-bY)/font_h);
748 QPoint ohere; 748 QPoint ohere;
749 bool swapping = FALSE; 749 bool swapping = FALSE;
750 750
751 if ( word_selection_mode ) 751 if ( word_selection_mode )
752 { 752 {
753 // Extend to word boundaries 753 // Extend to word boundaries
754 int i; 754 int i;
755 int selClass; 755 int selClass;
756 756
757 bool left_not_right = ( here.y() < iPntSel.y() || 757 bool left_not_right = ( here.y() < iPntSel.y() ||
758 here.y() == iPntSel.y() && here.x() < iPntSel.x() ); 758 here.y() == iPntSel.y() && here.x() < iPntSel.x() );
759 bool old_left_not_right = ( pntSel.y() < iPntSel.y() || 759 bool old_left_not_right = ( pntSel.y() < iPntSel.y() ||
760 pntSel.y() == iPntSel.y() && pntSel.x() < iPntSel.x() ); 760 pntSel.y() == iPntSel.y() && pntSel.x() < iPntSel.x() );
761 swapping = left_not_right != old_left_not_right; 761 swapping = left_not_right != old_left_not_right;
762 762
763 // Find left (left_not_right ? from here : from start) 763 // Find left (left_not_right ? from here : from start)
764 QPoint left = left_not_right ? here : iPntSel; 764 QPoint left = left_not_right ? here : iPntSel;
765 i = loc(left.x(),left.y()); 765 i = loc(left.x(),left.y());
766 selClass = charClass(image[i].c); 766 selClass = charClass(image[i].c);
767 while ( left.x() > 0 && charClass(image[i-1].c) == selClass ) 767 while ( left.x() > 0 && charClass(image[i-1].c) == selClass )
768 { i--; left.rx()--; } 768 { i--; left.rx()--; }
769 769
770 // Find left (left_not_right ? from start : from here) 770 // Find left (left_not_right ? from start : from here)
771 QPoint right = left_not_right ? iPntSel : here; 771 QPoint right = left_not_right ? iPntSel : here;
772 i = loc(right.x(),right.y()); 772 i = loc(right.x(),right.y());
773 selClass = charClass(image[i].c); 773 selClass = charClass(image[i].c);
774 while ( right.x() < columns-1 && charClass(image[i+1].c) == selClass ) 774 while ( right.x() < columns-1 && charClass(image[i+1].c) == selClass )
775 { i++; right.rx()++; } 775 { i++; right.rx()++; }
776 776
777 // Pick which is start (ohere) and which is extension (here) 777 // Pick which is start (ohere) and which is extension (here)
778 if ( left_not_right ) 778 if ( left_not_right )
779 { 779 {
780 here = left; ohere = right; 780 here = left; ohere = right;
781 } 781 }
782 else 782 else
783 { 783 {
784 here = right; ohere = left; 784 here = right; ohere = left;
785 } 785 }
786 } 786 }
787 787
788 if (here == pntSel && scroll == scrollbar->value()) return; // not moved 788 if (here == pntSel && scroll == scrollbar->value()) return; // not moved
789 789
790 if ( word_selection_mode ) { 790 if ( word_selection_mode ) {
791 if ( actSel < 2 || swapping ) { 791 if ( actSel < 2 || swapping ) {
792 emit beginSelectionSignal( ohere.x(), ohere.y() ); 792 emit beginSelectionSignal( ohere.x(), ohere.y() );
793 } 793 }
794 } else if ( actSel < 2 ) { 794 } else if ( actSel < 2 ) {
795 emit beginSelectionSignal( pntSel.x(), pntSel.y() ); 795 emit beginSelectionSignal( pntSel.x(), pntSel.y() );
796 } 796 }
797 797
798 actSel = 2; // within selection 798 actSel = 2; // within selection
799 pntSel = here; 799 pntSel = here;
800 emit extendSelectionSignal( here.x(), here.y() ); 800 emit extendSelectionSignal( here.x(), here.y() );
801} 801}
802 802
803void TEWidget::mouseReleaseEvent(QMouseEvent* ev) 803void TEWidget::mouseReleaseEvent(QMouseEvent* ev)
804{ 804{
805//printf("release [%d,%d] %d\n",ev->x()/font_w,ev->y()/font_h,ev->button()); 805//printf("release [%d,%d] %d\n",ev->x()/font_w,ev->y()/font_h,ev->button());
806 if ( ev->button() == LeftButton) 806 if ( ev->button() == LeftButton)
807 { 807 {
808 if ( actSel > 1 ) emit endSelectionSignal(preserve_line_breaks); 808 if ( actSel > 1 ) emit endSelectionSignal(preserve_line_breaks);
809 preserve_line_breaks = TRUE; 809 preserve_line_breaks = TRUE;
810 actSel = 0; 810 actSel = 0;
811 811
812 //FIXME: emits a release event even if the mouse is 812 //FIXME: emits a release event even if the mouse is
813 // outside the range. The procedure used in `mouseMoveEvent' 813 // outside the range. The procedure used in `mouseMoveEvent'
814 // applies here, too. 814 // applies here, too.
815 815
816 QPoint tL = contentsRect().topLeft(); 816 QPoint tL = contentsRect().topLeft();
817 int tLx = tL.x(); 817 int tLx = tL.x();
818 int tLy = tL.y(); 818 int tLy = tL.y();
819 819
820 if (!mouse_marks && !(ev->state() & ShiftButton)) 820 if (!mouse_marks && !(ev->state() & ShiftButton))
821 emit mouseSignal( 3, // release 821 emit mouseSignal( 3, // release
822 (ev->x()-tLx-blX)/font_w + 1, 822 (ev->x()-tLx-blX)/font_w + 1,
823 (ev->y()-tLy-bY)/font_h + 1 ); 823 (ev->y()-tLy-bY)/font_h + 1 );
824 releaseMouse(); 824 releaseMouse();
825 } 825 }
826} 826}
827 827
828void TEWidget::mouseDoubleClickEvent(QMouseEvent* ev) 828void TEWidget::mouseDoubleClickEvent(QMouseEvent* ev)
829{ 829{
830 if ( ev->button() != LeftButton) return; 830 if ( ev->button() != LeftButton) return;
831 831
832 QPoint tL = contentsRect().topLeft(); 832 QPoint tL = contentsRect().topLeft();
833 int tLx = tL.x(); 833 int tLx = tL.x();
834 int tLy = tL.y(); 834 int tLy = tL.y();
835 QPoint pos = QPoint((ev->x()-tLx-blX)/font_w,(ev->y()-tLy-bY)/font_h); 835 QPoint pos = QPoint((ev->x()-tLx-blX)/font_w,(ev->y()-tLy-bY)/font_h);
836 836
837 // pass on double click as two clicks. 837 // pass on double click as two clicks.
838 if (!mouse_marks && !(ev->state() & ShiftButton)) 838 if (!mouse_marks && !(ev->state() & ShiftButton))
839 { 839 {
840 emit mouseSignal( 0, pos.x()+1, pos.y()+1 ); // left button 840 emit mouseSignal( 0, pos.x()+1, pos.y()+1 ); // left button
841 emit mouseSignal( 3, pos.x()+1, pos.y()+1 ); // release 841 emit mouseSignal( 3, pos.x()+1, pos.y()+1 ); // release
842 emit mouseSignal( 0, pos.x()+1, pos.y()+1 ); // left button 842 emit mouseSignal( 0, pos.x()+1, pos.y()+1 ); // left button
843 return; 843 return;
844 } 844 }
845 845
846 846
847 emit clearSelectionSignal(); 847 emit clearSelectionSignal();
848 QPoint bgnSel = pos; 848 QPoint bgnSel = pos;
849 QPoint endSel = QPoint((ev->x()-tLx-blX)/font_w,(ev->y()-tLy-bY)/font_h); 849 QPoint endSel = QPoint((ev->x()-tLx-blX)/font_w,(ev->y()-tLy-bY)/font_h);
850 int i = loc(bgnSel.x(),bgnSel.y()); 850 int i = loc(bgnSel.x(),bgnSel.y());
851 iPntSel = bgnSel; 851 iPntSel = bgnSel;
852 852
853 word_selection_mode = TRUE; 853 word_selection_mode = TRUE;
854 854
855 // find word boundaries... 855 // find word boundaries...
856 int selClass = charClass(image[i].c); 856 int selClass = charClass(image[i].c);
857 { 857 {
858 // set the start... 858 // set the start...
859 int x = bgnSel.x(); 859 int x = bgnSel.x();
860 while ( x > 0 && charClass(image[i-1].c) == selClass ) 860 while ( x > 0 && charClass(image[i-1].c) == selClass )
861 { i--; x--; } 861 { i--; x--; }
862 bgnSel.setX(x); 862 bgnSel.setX(x);
863 emit beginSelectionSignal( bgnSel.x(), bgnSel.y() ); 863 emit beginSelectionSignal( bgnSel.x(), bgnSel.y() );
864 864
865 // set the end... 865 // set the end...
866 i = loc( endSel.x(), endSel.y() ); 866 i = loc( endSel.x(), endSel.y() );
867 x = endSel.x(); 867 x = endSel.x();
868 while( x < columns-1 && charClass(image[i+1].c) == selClass ) 868 while( x < columns-1 && charClass(image[i+1].c) == selClass )
869 { i++; x++ ; } 869 { i++; x++ ; }
870 endSel.setX(x); 870 endSel.setX(x);
871 actSel = 2; // within selection 871 actSel = 2; // within selection
872 emit extendSelectionSignal( endSel.x(), endSel.y() ); 872 emit extendSelectionSignal( endSel.x(), endSel.y() );
873 emit endSelectionSignal(preserve_line_breaks); 873 emit endSelectionSignal(preserve_line_breaks);
874 preserve_line_breaks = TRUE; 874 preserve_line_breaks = TRUE;
875 } 875 }
876} 876}
877 877
878void TEWidget::focusInEvent( QFocusEvent * ) 878void TEWidget::focusInEvent( QFocusEvent * )
879{ 879{
880 880
881 // do nothing, to prevent repainting 881 // do nothing, to prevent repainting
882} 882}
883 883
884 884
885void TEWidget::focusOutEvent( QFocusEvent * ) 885void TEWidget::focusOutEvent( QFocusEvent * )
886{ 886{
887 // do nothing, to prevent repainting 887 // do nothing, to prevent repainting
888} 888}
889 889
890bool TEWidget::focusNextPrevChild( bool next ) 890bool TEWidget::focusNextPrevChild( bool next )
891{ 891{
892 if (next) 892 if (next)
893 return false; // This disables changing the active part in konqueror 893 return false; // This disables changing the active part in konqueror
894 // when pressing Tab 894 // when pressing Tab
895 return QFrame::focusNextPrevChild( next ); 895 return QFrame::focusNextPrevChild( next );
896} 896}
897 897
898 898
899int TEWidget::charClass(char ch) const 899int TEWidget::charClass(char ch) const
900{ 900{
901 // This might seem like overkill, but imagine if ch was a Unicode 901 // This might seem like overkill, but imagine if ch was a Unicode
902 // character (Qt 2.0 QChar) - it might then be sensible to separate 902 // character (Qt 2.0 QChar) - it might then be sensible to separate
903 // the different language ranges, etc. 903 // the different language ranges, etc.
904 904
905 if ( isspace(ch) ) return ' '; 905 if ( isspace(ch) ) return ' ';
906 906
907 static const char *word_characters = ":@-./_~"; 907 static const char *word_characters = ":@-./_~";
908 if ( isalnum(ch) || strchr(word_characters, ch) ) 908 if ( isalnum(ch) || strchr(word_characters, ch) )
909 return 'a'; 909 return 'a';
910 910
911 // Everything else is weird 911 // Everything else is weird
912 return 1; 912 return 1;
913} 913}
914 914
915void TEWidget::setMouseMarks(bool on) 915void TEWidget::setMouseMarks(bool on)
916{ 916{
917 mouse_marks = on; 917 mouse_marks = on;
918 setCursor( mouse_marks ? ibeamCursor : arrowCursor ); 918 setCursor( mouse_marks ? ibeamCursor : arrowCursor );
919} 919}
920 920
921/* ------------------------------------------------------------------------- */ 921/* ------------------------------------------------------------------------- */
922/* */ 922/* */
923/* Clipboard */ 923/* Clipboard */
924/* */ 924/* */
925/* ------------------------------------------------------------------------- */ 925/* ------------------------------------------------------------------------- */
926 926
927#undef KeyPress 927#undef KeyPress
928 928
929void TEWidget::emitSelection() 929void TEWidget::emitSelection()
930// Paste Clipboard by simulating keypress events 930// Paste Clipboard by simulating keypress events
931{ 931{
932#ifndef QT_NO_CLIPBOARD 932#ifndef QT_NO_CLIPBOARD
933 QString text = QApplication::clipboard()->text(); 933 QString text = QApplication::clipboard()->text();
934 if ( ! text.isNull() ) 934 //qDebug(text);
935 if ( ! text.isNull())
935 { 936 {
936 text.replace(QRegExp("\n"), "\r"); 937 text.replace(QRegExp("\n"), "\r");
937 QKeyEvent e(QEvent::KeyPress, 0, -1, 0, text); 938 QKeyEvent e(QEvent::KeyPress, 0, -1, 0, text);
938 emit keyPressedSignal(&e); // expose as a big fat keypress event 939 emit keyPressedSignal(&e); // expose as a big fat keypress event
939 emit clearSelectionSignal(); 940 emit clearSelectionSignal();
940 } 941 }
941#endif 942#endif
942} 943}
943 944
944void TEWidget::emitText(QString text) 945void TEWidget::emitText(QString text)
945{ 946{
946 QKeyEvent e(QEvent::KeyPress, 0, -1, 0, text); 947 QKeyEvent e(QEvent::KeyPress, 0, -1, 0, text);
947 emit keyPressedSignal(&e); // expose as a big fat keypress event 948 emit keyPressedSignal(&e); // expose as a big fat keypress event
948} 949}
949 950
950void TEWidget::pasteClipboard( ) 951void TEWidget::pasteClipboard( )
951{ 952{
952 emitSelection(); 953 emitSelection();
953} 954}
954 955
955void TEWidget::setSelection(const QString& t) 956void TEWidget::setSelection(const QString& t)
956{ 957{
957#ifndef QT_NO_CLIPBOARD 958#ifndef QT_NO_CLIPBOARD
958 // Disconnect signal while WE set the clipboard 959 // Disconnect signal while WE set the clipboard
959 QObject *cb = QApplication::clipboard(); 960 QObject *cb = QApplication::clipboard();
960 QObject::disconnect( cb, SIGNAL(dataChanged()), 961 QObject::disconnect( cb, SIGNAL(dataChanged()),
961 this, SLOT(onClearSelection()) ); 962 this, SLOT(onClearSelection()) );
962 963
963 QApplication::clipboard()->setText(t); 964 QApplication::clipboard()->setText(t);
964 965
965 QObject::connect( cb, SIGNAL(dataChanged()), 966 QObject::connect( cb, SIGNAL(dataChanged()),
966 this, SLOT(onClearSelection()) ); 967 this, SLOT(onClearSelection()) );
967#endif 968#endif
968} 969}
969 970
970void TEWidget::onClearSelection() 971void TEWidget::onClearSelection()
971{ 972{
972 emit clearSelectionSignal(); 973 emit clearSelectionSignal();
973} 974}
974 975
975/* ------------------------------------------------------------------------- */ 976/* ------------------------------------------------------------------------- */
976/* */ 977/* */
977/* Keyboard */ 978/* Keyboard */
978/* */ 979/* */
979/* ------------------------------------------------------------------------- */ 980/* ------------------------------------------------------------------------- */
980 981
981//FIXME: an `eventFilter' has been installed instead of a `keyPressEvent' 982//FIXME: an `eventFilter' has been installed instead of a `keyPressEvent'
982// due to a bug in `QT' or the ignorance of the author to prevent 983// due to a bug in `QT' or the ignorance of the author to prevent
983// repaint events being emitted to the screen whenever one leaves 984// repaint events being emitted to the screen whenever one leaves
984// or reenters the screen to/from another application. 985// or reenters the screen to/from another application.
985// 986//
986// Troll says one needs to change focusInEvent() and focusOutEvent(), 987// Troll says one needs to change focusInEvent() and focusOutEvent(),
987// which would also let you have an in-focus cursor and an out-focus 988// which would also let you have an in-focus cursor and an out-focus
988// cursor like xterm does. 989// cursor like xterm does.
989 990
990// for the auto-hide cursor feature, I added empty focusInEvent() and 991// for the auto-hide cursor feature, I added empty focusInEvent() and
991// focusOutEvent() so that update() isn't called. 992// focusOutEvent() so that update() isn't called.
992// For auto-hide, we need to get keypress-events, but we only get them when 993// For auto-hide, we need to get keypress-events, but we only get them when
993// we have focus. 994// we have focus.
994 995
995void TEWidget::doScroll(int lines) 996void TEWidget::doScroll(int lines)
996{ 997{
997 scrollbar->setValue(scrollbar->value()+lines); 998 scrollbar->setValue(scrollbar->value()+lines);
998} 999}
999 1000
1000void TEWidget::doHScroll(int lines) { 1001void TEWidget::doHScroll(int lines) {
1001 hScrollbar->setValue( hScrollbar->value()+lines); 1002 hScrollbar->setValue( hScrollbar->value()+lines);
1002} 1003}
1003 1004
1004bool TEWidget::eventFilter( QObject *obj, QEvent *e ) 1005bool TEWidget::eventFilter( QObject *obj, QEvent *e )
1005{ 1006{
1006 if ( (e->type() == QEvent::Accel || 1007 if ( (e->type() == QEvent::Accel ||
1007 e->type() == QEvent::AccelAvailable ) && qApp->focusWidget() == this ) { 1008 e->type() == QEvent::AccelAvailable ) && qApp->focusWidget() == this ) {
1008 static_cast<QKeyEvent *>( e )->ignore(); 1009 static_cast<QKeyEvent *>( e )->ignore();
1009 return true; 1010 return true;
1010 } 1011 }
1011 if ( obj != this /* when embedded */ && obj != parent() /* when standalone */ ) 1012 if ( obj != this /* when embedded */ && obj != parent() /* when standalone */ )
1012 return FALSE; // not us 1013 return FALSE; // not us
1013 if ( e->type() == QEvent::Wheel) { 1014 if ( e->type() == QEvent::Wheel) {
1014 QApplication::sendEvent(scrollbar, e); 1015 QApplication::sendEvent(scrollbar, e);
1015 } 1016 }
1016 1017
1017#ifdef FAKE_CTRL_AND_ALT 1018#ifdef FAKE_CTRL_AND_ALT
1018 static bool control = FALSE; 1019 static bool control = FALSE;
1019 static bool alt = FALSE; 1020 static bool alt = FALSE;
1020// qDebug(" Has a keyboard with no CTRL and ALT keys, but we fake it:"); 1021// qDebug(" Has a keyboard with no CTRL and ALT keys, but we fake it:");
1021 bool dele=FALSE; 1022 bool dele=FALSE;
1022 if ( e->type() == QEvent::KeyPress || e->type() == QEvent::KeyRelease ) { 1023 if ( e->type() == QEvent::KeyPress || e->type() == QEvent::KeyRelease ) {
1023 QKeyEvent* ke = (QKeyEvent*)e; 1024 QKeyEvent* ke = (QKeyEvent*)e;
1024 bool keydown = e->type() == QEvent::KeyPress || ke->isAutoRepeat(); 1025 bool keydown = e->type() == QEvent::KeyPress || ke->isAutoRepeat();
1025 switch (ke->key()) { 1026 switch (ke->key()) {
1026 case Key_F9: // let this be "Control" 1027 case Key_F9: // let this be "Control"
1027 control = keydown; 1028 control = keydown;
1028 e = new QKeyEvent(QEvent::KeyPress, Key_Control, 0, ke->state()); 1029 e = new QKeyEvent(QEvent::KeyPress, Key_Control, 0, ke->state());
1029 dele=TRUE; 1030 dele=TRUE;
1030 break; 1031 break;
1031 case Key_F13: // let this be "Alt" 1032 case Key_F13: // let this be "Alt"
1032 alt = keydown; 1033 alt = keydown;
1033 e = new QKeyEvent(QEvent::KeyPress, Key_Alt, 0, ke->state()); 1034 e = new QKeyEvent(QEvent::KeyPress, Key_Alt, 0, ke->state());
1034 dele=TRUE; 1035 dele=TRUE;
1035 break; 1036 break;
1036 default: 1037 default:
1037 if ( control ) { 1038 if ( control ) {
1038 int a = toupper(ke->ascii())-64; 1039 int a = toupper(ke->ascii())-64;
1039 if ( a >= 0 && a < ' ' ) { 1040 if ( a >= 0 && a < ' ' ) {
1040 e = new QKeyEvent(e->type(), ke->key(), 1041 e = new QKeyEvent(e->type(), ke->key(),
1041 a, ke->state()|ControlButton, QChar(a,0)); 1042 a, ke->state()|ControlButton, QChar(a,0));
1042 dele=TRUE; 1043 dele=TRUE;
1043 } 1044 }
1044 } 1045 }
1045 if ( alt ) { 1046 if ( alt ) {
1046 e = new QKeyEvent(e->type(), ke->key(), 1047 e = new QKeyEvent(e->type(), ke->key(),
1047 ke->ascii(), ke->state()|AltButton, ke->text()); 1048 ke->ascii(), ke->state()|AltButton, ke->text());
1048 dele=TRUE; 1049 dele=TRUE;
1049 } 1050 }
1050 } 1051 }
1051 } 1052 }
1052#endif 1053#endif
1053 1054
1054 if ( e->type() == QEvent::KeyPress ) { 1055 if ( e->type() == QEvent::KeyPress ) {
1055 QKeyEvent* ke = (QKeyEvent*)e; 1056 QKeyEvent* ke = (QKeyEvent*)e;
1056 actSel=0; // Key stroke implies a screen update, so TEWidget won't 1057 actSel=0; // Key stroke implies a screen update, so TEWidget won't
1057 // know where the current selection is. 1058 // know where the current selection is.
1058 1059
1059// qDebug("key pressed is 0x%x, ascii is 0x%x, state %d", ke->key(), ke->ascii(), ke->state()); 1060// qDebug("key pressed is 0x%x, ascii is 0x%x, state %d", ke->key(), ke->ascii(), ke->state());
1060 1061
1061 if( ke->state() == ShiftButton && ke->key() == Key_Tab) { 1062 if( ke->state() == ShiftButton && ke->key() == Key_Tab) {
1062 //lets hardcode this sucker 1063 //lets hardcode this sucker
1063 1064
1064// qDebug("key pressed 2 is 0x%x", ke->key()); 1065// qDebug("key pressed 2 is 0x%x", ke->key());
1065 emitText("\\"); // expose 1066 emitText("\\"); // expose
1066 } 1067 }
1067 else if( ke->state() == ControlButton && ke->key() == Key_V) { 1068 else if( ke->state() == ControlButton && ke->key() == Key_V) {
1068 pasteClipboard(); 1069 pasteClipboard();
1069 } 1070 }
1071 else if( ke->state() == ControlButton && ke->key() == Key_C) {
1072// pasteClipboard();
1073 }
1070 else 1074 else
1071 emit keyPressedSignal(ke); // expose 1075 emit keyPressedSignal(ke); // expose
1072 ke->accept(); 1076 ke->accept();
1073#ifdef FAKE_CTRL_AND_ALT 1077#ifdef FAKE_CTRL_AND_ALT
1074 if ( dele ) delete e; 1078 if ( dele ) delete e;
1075#endif 1079#endif
1076 return true; // stop the event 1080 return true; // stop the event
1077 } 1081 }
1078 if ( e->type() == QEvent::Enter ) { 1082 if ( e->type() == QEvent::Enter ) {
1079 QObject::disconnect( (QObject*)cb, SIGNAL(dataChanged()), 1083 QObject::disconnect( (QObject*)cb, SIGNAL(dataChanged()),
1080 this, SLOT(onClearSelection()) ); 1084 this, SLOT(onClearSelection()) );
1081 } 1085 }
1082 if ( e->type() == QEvent::Leave ) { 1086 if ( e->type() == QEvent::Leave ) {
1083 QObject::connect( (QObject*)cb, SIGNAL(dataChanged()), 1087 QObject::connect( (QObject*)cb, SIGNAL(dataChanged()),
1084 this, SLOT(onClearSelection()) ); 1088 this, SLOT(onClearSelection()) );
1085 } 1089 }
1086 return QFrame::eventFilter( obj, e ); 1090 return QFrame::eventFilter( obj, e );
1087} 1091}
1088 1092
1089/* ------------------------------------------------------------------------- */ 1093/* ------------------------------------------------------------------------- */
1090/* */ 1094/* */
1091/* Frame */ 1095/* Frame */
1092/* */ 1096/* */
1093/* ------------------------------------------------------------------------- */ 1097/* ------------------------------------------------------------------------- */
1094 1098
1095void TEWidget::frameChanged() 1099void TEWidget::frameChanged()
1096{ 1100{
1097 propagateSize(); 1101 propagateSize();
1098 update(); 1102 update();
1099} 1103}
1100 1104
1101/* ------------------------------------------------------------------------- */ 1105/* ------------------------------------------------------------------------- */
1102/* */ 1106/* */
1103/* Sound */ 1107/* Sound */
1104/* */ 1108/* */
1105/* ------------------------------------------------------------------------- */ 1109/* ------------------------------------------------------------------------- */
1106 1110
1107void TEWidget::Bell() 1111void TEWidget::Bell()
1108{ 1112{
1109//#ifdef QT_QWS_SHARP 1113//#ifdef QT_QWS_SHARP
1110//# ifndef QT_NO_COP 1114//# ifndef QT_NO_COP
1111 if(useBeep) 1115 if(useBeep)
1112 QCopEnvelope( "QPE/TaskBar", "soundAlarm()" ); 1116 QCopEnvelope( "QPE/TaskBar", "soundAlarm()" );
1113 1117
1114//# endif 1118//# endif
1115//#else 1119//#else
1116//# ifndef QT_NO_SOUND 1120//# ifndef QT_NO_SOUND
1117// QSound::play(Resource::findSound("alarm")); 1121// QSound::play(Resource::findSound("alarm"));
1118//# endif 1122//# endif
1119//#endif 1123//#endif
1120 1124
1121// QApplication::beep(); 1125// QApplication::beep();
1122} 1126}
1123 1127
1124/* ------------------------------------------------------------------------- */ 1128/* ------------------------------------------------------------------------- */
1125/* */ 1129/* */
1126/* Auxiluary */ 1130/* Auxiluary */
1127/* */ 1131/* */
1128/* ------------------------------------------------------------------------- */ 1132/* ------------------------------------------------------------------------- */
1129 1133
1130void TEWidget::clearImage() 1134void TEWidget::clearImage()
1131// initialize the image 1135// initialize the image
1132// for internal use only 1136// for internal use only
1133{ 1137{
1134 for (int y = 0; y < lines; y++) 1138 for (int y = 0; y < lines; y++)
1135 for (int x = 0; x < columns; x++) 1139 for (int x = 0; x < columns; x++)
1136 { 1140 {
1137 image[loc(x,y)].c = 0xff; //' '; 1141 image[loc(x,y)].c = 0xff; //' ';
1138 image[loc(x,y)].f = 0xff; //DEFAULT_FORE_COLOR; 1142 image[loc(x,y)].f = 0xff; //DEFAULT_FORE_COLOR;
1139 image[loc(x,y)].b = 0xff; //DEFAULT_BACK_COLOR; 1143 image[loc(x,y)].b = 0xff; //DEFAULT_BACK_COLOR;
1140 image[loc(x,y)].r = 0xff; //DEFAULT_RENDITION; 1144 image[loc(x,y)].r = 0xff; //DEFAULT_RENDITION;
1141 } 1145 }
1142} 1146}
1143 1147
1144// Create Image /////////////////////////////////////////////////////// 1148// Create Image ///////////////////////////////////////////////////////
1145 1149
1146void TEWidget::calcGeometry() 1150void TEWidget::calcGeometry()
1147{ 1151{
1148 int showhscrollbar = 1; 1152 int showhscrollbar = 1;
1149 int hwidth = 0; 1153 int hwidth = 0;
1150 int dcolumns; 1154 int dcolumns;
1151 Config cfg("Konsole"); 1155 Config cfg("Konsole");
1152 cfg.setGroup("ScrollBar"); 1156 cfg.setGroup("ScrollBar");
1153 useHorzScroll=cfg.readBoolEntry("HorzScroll",0); 1157 useHorzScroll=cfg.readBoolEntry("HorzScroll",0);
1154 1158
1155 if(vcolumns == 0) showhscrollbar = 0; 1159 if(vcolumns == 0) showhscrollbar = 0;
1156 if(showhscrollbar == 1) hwidth = QApplication::style().scrollBarExtent().width(); 1160 if(showhscrollbar == 1) hwidth = QApplication::style().scrollBarExtent().width();
1157 1161
1158 scrollbar->resize(QApplication::style().scrollBarExtent().width(), 1162 scrollbar->resize(QApplication::style().scrollBarExtent().width(),
1159 contentsRect().height() - hwidth); 1163 contentsRect().height() - hwidth);
1160 1164
1161 switch(scrollLoc) { 1165 switch(scrollLoc) {
1162 case SCRNONE : 1166 case SCRNONE :
1163 columns = ( contentsRect().width() - 2 * rimX ) / font_w; 1167 columns = ( contentsRect().width() - 2 * rimX ) / font_w;
1164 dcolumns = columns; 1168 dcolumns = columns;
1165 if(vcolumns) columns = vcolumns; 1169 if(vcolumns) columns = vcolumns;
1166 blX = (contentsRect().width() - (columns*font_w) ) / 2; 1170 blX = (contentsRect().width() - (columns*font_w) ) / 2;
1167 if(showhscrollbar) 1171 if(showhscrollbar)
1168 blX = -hposition * font_w; 1172 blX = -hposition * font_w;
1169 brX = blX; 1173 brX = blX;
1170 scrollbar->hide(); 1174 scrollbar->hide();
1171 break; 1175 break;
1172 case SCRLEFT : 1176 case SCRLEFT :
1173 columns = ( contentsRect().width() - 2 * rimX - scrollbar->width()) / font_w; 1177 columns = ( contentsRect().width() - 2 * rimX - scrollbar->width()) / font_w;
1174 dcolumns = columns; 1178 dcolumns = columns;
1175 if(vcolumns) columns = vcolumns; 1179 if(vcolumns) columns = vcolumns;
1176 brX = (contentsRect().width() - (columns*font_w) - scrollbar->width() ) / 2; 1180 brX = (contentsRect().width() - (columns*font_w) - scrollbar->width() ) / 2;
1177 if(showhscrollbar) 1181 if(showhscrollbar)
1178 brX = -hposition * font_w; 1182 brX = -hposition * font_w;
1179 blX = brX + scrollbar->width(); 1183 blX = brX + scrollbar->width();
1180 scrollbar->move(contentsRect().topLeft()); 1184 scrollbar->move(contentsRect().topLeft());
1181 scrollbar->show(); 1185 scrollbar->show();
1182 break; 1186 break;
1183 case SCRRIGHT: 1187 case SCRRIGHT:
1184 columns = ( contentsRect().width() - 2 * rimX - scrollbar->width()) / font_w; 1188 columns = ( contentsRect().width() - 2 * rimX - scrollbar->width()) / font_w;
1185 dcolumns = columns; 1189 dcolumns = columns;
1186 if(vcolumns) columns = vcolumns; 1190 if(vcolumns) columns = vcolumns;
1187 blX = (contentsRect().width() - (columns*font_w) - scrollbar->width() ) / 2; 1191 blX = (contentsRect().width() - (columns*font_w) - scrollbar->width() ) / 2;
1188 if(showhscrollbar) 1192 if(showhscrollbar)
1189 blX = -hposition * font_w; 1193 blX = -hposition * font_w;
1190 brX = blX; 1194 brX = blX;
1191 scrollbar->move(contentsRect().topRight() - QPoint(scrollbar->width()-1,0)); 1195 scrollbar->move(contentsRect().topRight() - QPoint(scrollbar->width()-1,0));
1192 scrollbar->show(); 1196 scrollbar->show();
1193 break; 1197 break;
1194 } 1198 }
1195 //FIXME: support 'rounding' styles 1199 //FIXME: support 'rounding' styles
1196 lines = ( contentsRect().height() - 2 * rimY ) / font_h; 1200 lines = ( contentsRect().height() - 2 * rimY ) / font_h;
1197 bY = (contentsRect().height() - (lines *font_h)) / 2; 1201 bY = (contentsRect().height() - (lines *font_h)) / 2;
1198 1202
1199 if(showhscrollbar == 1) { 1203 if(showhscrollbar == 1) {
1200 hScrollbar->resize(contentsRect().width() - hwidth, hwidth); 1204 hScrollbar->resize(contentsRect().width() - hwidth, hwidth);
1201 hScrollbar->setRange(0, vcolumns - dcolumns); 1205 hScrollbar->setRange(0, vcolumns - dcolumns);
1202 1206
1203 QPoint p = contentsRect().bottomLeft(); 1207 QPoint p = contentsRect().bottomLeft();
1204 if(scrollLoc == SCRLEFT) 1208 if(scrollLoc == SCRLEFT)
1205 hScrollbar->move(QPoint(p.x()+hwidth, p.y() - hwidth)); 1209 hScrollbar->move(QPoint(p.x()+hwidth, p.y() - hwidth));
1206 else 1210 else
1207 hScrollbar->move(QPoint(p.x(), p.y() - hwidth)); 1211 hScrollbar->move(QPoint(p.x(), p.y() - hwidth));
1208 1212
1209 hScrollbar->show(); 1213 hScrollbar->show();
1210 } 1214 }
1211 else hScrollbar->hide(); 1215 else hScrollbar->hide();
1212 1216
1213 if(showhscrollbar == 1) { 1217 if(showhscrollbar == 1) {
1214 lines = lines - (hwidth / font_h) - 1; 1218 lines = lines - (hwidth / font_h) - 1;
1215 if(lines < 1) lines = 1; 1219 if(lines < 1) lines = 1;
1216 } 1220 }
1217 //FIXME: support 'rounding' styles 1221 //FIXME: support 'rounding' styles
1218} 1222}
1219 1223
1220void TEWidget::makeImage() 1224void TEWidget::makeImage()
1221//FIXME: rename 'calcGeometry? 1225//FIXME: rename 'calcGeometry?
1222{ 1226{
1223 calcGeometry(); 1227 calcGeometry();
1224 image = (ca*) malloc(lines*columns*sizeof(ca)); 1228 image = (ca*) malloc(lines*columns*sizeof(ca));
1225 clearImage(); 1229 clearImage();
1226} 1230}
1227 1231
1228// calculate the needed size 1232// calculate the needed size
1229QSize TEWidget::calcSize(int cols, int lins) const 1233QSize TEWidget::calcSize(int cols, int lins) const
1230{ 1234{
1231 int frw = width() - contentsRect().width(); 1235 int frw = width() - contentsRect().width();
1232 int frh = height() - contentsRect().height(); 1236 int frh = height() - contentsRect().height();
1233 int scw = (scrollLoc==SCRNONE?0:scrollbar->width()); 1237 int scw = (scrollLoc==SCRNONE?0:scrollbar->width());
1234 return QSize( font_w*cols + 2*rimX + frw + scw, font_h*lins + 2*rimY + frh ); 1238 return QSize( font_w*cols + 2*rimX + frw + scw, font_h*lins + 2*rimY + frh );
1235} 1239}
1236 1240
1237QSize TEWidget::sizeHint() const 1241QSize TEWidget::sizeHint() const
1238{ 1242{
1239 return size(); 1243 return size();
1240} 1244}
1241 1245
1242void TEWidget::styleChange(QStyle &) 1246void TEWidget::styleChange(QStyle &)
1243{ 1247{
1244 propagateSize(); 1248 propagateSize();
1245} 1249}
1246 1250
1247#ifndef QT_NO_DRAGANDDROP 1251#ifndef QT_NO_DRAGANDDROP
1248 1252
1249/* --------------------------------------------------------------------- */ 1253/* --------------------------------------------------------------------- */
1250/* */ 1254/* */
1251/* Drag & Drop */ 1255/* Drag & Drop */
1252/* */ 1256/* */
1253/* --------------------------------------------------------------------- */ 1257/* --------------------------------------------------------------------- */
1254 1258
1255 1259
1256void TEWidget::dragEnterEvent(QDragEnterEvent* e) 1260void TEWidget::dragEnterEvent(QDragEnterEvent* e)
1257{ 1261{
1258 e->accept(QTextDrag::canDecode(e) || 1262 e->accept(QTextDrag::canDecode(e) ||
1259 QUriDrag::canDecode(e)); 1263 QUriDrag::canDecode(e));
1260} 1264}
1261 1265
1262void TEWidget::dropEvent(QDropEvent* event) 1266void TEWidget::dropEvent(QDropEvent* event)
1263{ 1267{
1264 // The current behaviour when url(s) are dropped is 1268 // The current behaviour when url(s) are dropped is
1265 // * if there is only ONE url and if it's a LOCAL one, ask for paste or cd 1269 // * if there is only ONE url and if it's a LOCAL one, ask for paste or cd
1266 // * in all other cases, just paste 1270 // * in all other cases, just paste
1267 // (for non-local ones, or for a list of URLs, 'cd' is nonsense) 1271 // (for non-local ones, or for a list of URLs, 'cd' is nonsense)
1268 QStrList strlist; 1272 QStrList strlist;
1269 int file_count = 0; 1273 int file_count = 0;
1270 dropText = ""; 1274 dropText = "";
1271 bool bPopup = true; 1275 bool bPopup = true;
1272 1276
1273 if(QUriDrag::decode(event, strlist)) { 1277 if(QUriDrag::decode(event, strlist)) {
1274 if (strlist.count()) { 1278 if (strlist.count()) {
1275 for(const char* p = strlist.first(); p; p = strlist.next()) { 1279 for(const char* p = strlist.first(); p; p = strlist.next()) {
1276 if(file_count++ > 0) { 1280 if(file_count++ > 0) {
1277 dropText += " "; 1281 dropText += " ";
1278 bPopup = false; // more than one file, don't popup 1282 bPopup = false; // more than one file, don't popup
1279 } 1283 }
1280 1284
1281/* 1285/*
1282 KURL url(p); 1286 KURL url(p);
1283 if (url.isLocalFile()) { 1287 if (url.isLocalFile()) {
1284 dropText += url.path(); // local URL : remove protocol 1288 dropText += url.path(); // local URL : remove protocol
1285 } 1289 }
1286 else { 1290 else {
1287 dropText += url.prettyURL(); 1291 dropText += url.prettyURL();
1288 bPopup = false; // a non-local file, don't popup 1292 bPopup = false; // a non-local file, don't popup
1289 } 1293 }
1290*/ 1294*/
1291 1295
1292 } 1296 }
1293 1297
1294 if (bPopup) 1298 if (bPopup)
1295 // m_drop->popup(pos() + event->pos()); 1299 // m_drop->popup(pos() + event->pos());
1296 m_drop->popup(mapToGlobal(event->pos())); 1300 m_drop->popup(mapToGlobal(event->pos()));
1297 else 1301 else
1298 { 1302 {
1299 if (currentSession) { 1303 if (currentSession) {
1300 currentSession->getEmulation()->sendString(dropText.local8Bit()); 1304 currentSession->getEmulation()->sendString(dropText.local8Bit());
1301 } 1305 }
1302// kdDebug() << "Drop:" << dropText.local8Bit() << "\n"; 1306// kdDebug() << "Drop:" << dropText.local8Bit() << "\n";
1303 } 1307 }
1304 } 1308 }
1305 } 1309 }
1306 else if(QTextDrag::decode(event, dropText)) { 1310 else if(QTextDrag::decode(event, dropText)) {
1307// kdDebug() << "Drop:" << dropText.local8Bit() << "\n"; 1311// kdDebug() << "Drop:" << dropText.local8Bit() << "\n";
1308 if (currentSession) { 1312 if (currentSession) {
1309 currentSession->getEmulation()->sendString(dropText.local8Bit()); 1313 currentSession->getEmulation()->sendString(dropText.local8Bit());
1310 } 1314 }
1311 // Paste it 1315 // Paste it
1312 } 1316 }
1313} 1317}
1314#endif 1318#endif
1315 1319
1316 1320
1317void TEWidget::drop_menu_activated(int item) 1321void TEWidget::drop_menu_activated(int item)
1318{ 1322{
1319#ifndef QT_NO_DRAGANDDROP 1323#ifndef QT_NO_DRAGANDDROP
1320 switch (item) 1324 switch (item)
1321 { 1325 {
1322 case 0: // paste 1326 case 0: // paste
1323 currentSession->getEmulation()->sendString(dropText.local8Bit()); 1327 currentSession->getEmulation()->sendString(dropText.local8Bit());
1324// KWM::activate((Window)this->winId()); 1328// KWM::activate((Window)this->winId());
1325 break; 1329 break;