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