From 1c64345fe4da851982f69ebf6e92bc88cebbad46 Mon Sep 17 00:00:00 2001 From: Michele Calgaro Date: Mon, 14 Mar 2016 17:47:44 +0100 Subject: Konsole : added support for mouse wheel events in the alternate screen. This allows scrolling within vim, less and similar applications. This resolves bug 2597. Signed-off-by: Michele Calgaro --- konsole/konsole/TEWidget.cpp | 19 ++++++++++++++++++- konsole/konsole/TEWidget.h | 7 +++++++ konsole/konsole/TEmulation.cpp | 1 + 3 files changed, 26 insertions(+), 1 deletion(-) (limited to 'konsole/konsole') diff --git a/konsole/konsole/TEWidget.cpp b/konsole/konsole/TEWidget.cpp index f151044fc..52cd1236b 100644 --- a/konsole/konsole/TEWidget.cpp +++ b/konsole/konsole/TEWidget.cpp @@ -340,6 +340,8 @@ TEWidget::TEWidget(TQWidget *parent, const char *name) ,font_h(1) ,font_w(1) ,font_a(1) +,screen_num(0) +,screen(NULL) ,lines(1) ,columns(1) ,contentHeight(1) @@ -1694,7 +1696,22 @@ void TEWidget::wheelEvent( TQWheelEvent* ev ) return; if ( mouse_marks ) - TQApplication::sendEvent(scrollbar, ev); + { + if (!screen || screen->hasScroll() || (scrollbar->maxValue() == 0 && screen_num == 0)) + { + // Send event to scroll bar + TQApplication::sendEvent(scrollbar, ev); + } + else + { + // Terminal window can not be scrolled, so emulate key up/key down when mouse wheel is used + TQKeyEvent ke(TQEvent::KeyPress, ev->delta() > 0 ? TQt::Key_Up : TQt::Key_Down, 0, TQt::NoButton); + for (int i = 0; i < TQApplication::wheelScrollLines(); ++i) + { + emit keyPressedSignal(&ke); + } + } + } else { TQPoint tL = contentsRect().topLeft(); diff --git a/konsole/konsole/TEWidget.h b/konsole/konsole/TEWidget.h index 2baa2531c..967896082 100644 --- a/konsole/konsole/TEWidget.h +++ b/konsole/konsole/TEWidget.h @@ -32,6 +32,7 @@ #include #include "TECommon.h" +#include "TEScreen.h" extern unsigned short vt100_graphics[32]; @@ -142,6 +143,8 @@ public: void setRim(int rim) { rimX=rim; rimY=rim; } + void setScreen(int num, TEScreen *scr) { screen_num = num & 0x01; screen = scr; } + public slots: void setSelectionEnd(); @@ -241,6 +244,10 @@ private: int bX; // offset int bY; // offset + // Required to handle mouse wheel events correctly in all cases + int screen_num; // Screen number (0 or 1) + TEScreen *screen; // Pointer to current screen. No ownership!! + int lines; int columns; int contentHeight; diff --git a/konsole/konsole/TEmulation.cpp b/konsole/konsole/TEmulation.cpp index 7576e9688..943d2f205 100644 --- a/konsole/konsole/TEmulation.cpp +++ b/konsole/konsole/TEmulation.cpp @@ -197,6 +197,7 @@ void TEmulation::setScreen(int n) { TEScreen *old = scr; scr = screen[n&1]; + gui->setScreen(n&1, scr); if (scr != old) old->setBusySelecting(false); } -- cgit v1.2.3