Resolves: rhbz#1344042 deb#826654 scale gtk3 smooth scaling events...
to give traditional amounts of scroll on a single mouse wheel event ditch non smooth scroll events now seeing as apparently they are always available so the other types are irrelevent now if we get x and y scroll, then like macosx just dispatch x and y scroll events. Note: there seems to be a bug in the stack below us where the first scroll event after getting focus is one of a 0 x and y delta. Because we now check x and y against 0, we don't launch a scroll event in the case of a 0x0 scroll which stops us occasionally appearing to go backwards on the first scroll after getting focus. Which is the same thing I see on e.g. gedit, the first mouse wheel scroll after getting focus doesn't actually do anything. Change-Id: Iec8f2e4627cd84e3896270a0847a5c4907fa083f
This commit is contained in:
@@ -214,7 +214,6 @@ class GtkSalFrame : public SalFrame
|
|||||||
#if GTK_CHECK_VERSION(3,0,0)
|
#if GTK_CHECK_VERSION(3,0,0)
|
||||||
OUString m_aTooltip;
|
OUString m_aTooltip;
|
||||||
Rectangle m_aHelpArea;
|
Rectangle m_aHelpArea;
|
||||||
guint32 m_nLastScrollEventTime;
|
|
||||||
long m_nWidthRequest;
|
long m_nWidthRequest;
|
||||||
long m_nHeightRequest;
|
long m_nHeightRequest;
|
||||||
cairo_region_t* m_pRegion;
|
cairo_region_t* m_pRegion;
|
||||||
|
@@ -1048,7 +1048,6 @@ void GtkSalFrame::InitCommon()
|
|||||||
m_bSpanMonitorsWhenFullscreen = false;
|
m_bSpanMonitorsWhenFullscreen = false;
|
||||||
m_nState = GDK_WINDOW_STATE_WITHDRAWN;
|
m_nState = GDK_WINDOW_STATE_WITHDRAWN;
|
||||||
m_nVisibility = GDK_VISIBILITY_FULLY_OBSCURED;
|
m_nVisibility = GDK_VISIBILITY_FULLY_OBSCURED;
|
||||||
m_nLastScrollEventTime = GDK_CURRENT_TIME;
|
|
||||||
m_bSendModChangeOnRelease = false;
|
m_bSendModChangeOnRelease = false;
|
||||||
m_pIMHandler = nullptr;
|
m_pIMHandler = nullptr;
|
||||||
m_hBackgroundPixmap = None;
|
m_hBackgroundPixmap = None;
|
||||||
@@ -2648,63 +2647,53 @@ gboolean GtkSalFrame::signalButton( GtkWidget*, GdkEventButton* pEvent, gpointer
|
|||||||
|
|
||||||
gboolean GtkSalFrame::signalScroll( GtkWidget*, GdkEvent* pEvent, gpointer frame )
|
gboolean GtkSalFrame::signalScroll( GtkWidget*, GdkEvent* pEvent, gpointer frame )
|
||||||
{
|
{
|
||||||
GtkSalFrame* pThis = static_cast<GtkSalFrame*>(frame);
|
|
||||||
GdkEventScroll* pSEvent = reinterpret_cast<GdkEventScroll*>(pEvent);
|
GdkEventScroll* pSEvent = reinterpret_cast<GdkEventScroll*>(pEvent);
|
||||||
|
if (pSEvent->direction != GDK_SCROLL_SMOOTH)
|
||||||
|
return false;
|
||||||
|
|
||||||
// gnome#726878 check for duplicate legacy scroll event
|
GtkSalFrame* pThis = static_cast<GtkSalFrame*>(frame);
|
||||||
if (pSEvent->direction != GDK_SCROLL_SMOOTH &&
|
|
||||||
pThis->m_nLastScrollEventTime == pSEvent->time)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
SalWheelMouseEvent aEvent;
|
SalWheelMouseEvent aEvent;
|
||||||
|
|
||||||
aEvent.mnTime = pSEvent->time;
|
aEvent.mnTime = pSEvent->time;
|
||||||
aEvent.mnX = (sal_uLong)pSEvent->x;
|
aEvent.mnX = (sal_uLong)pSEvent->x;
|
||||||
|
// --- RTL --- (mirror mouse pos)
|
||||||
|
if (AllSettings::GetLayoutRTL())
|
||||||
|
aEvent.mnX = pThis->maGeometry.nWidth - 1 - aEvent.mnX;
|
||||||
aEvent.mnY = (sal_uLong)pSEvent->y;
|
aEvent.mnY = (sal_uLong)pSEvent->y;
|
||||||
aEvent.mnCode = GetMouseModCode( pSEvent->state );
|
aEvent.mnCode = GetMouseModCode( pSEvent->state );
|
||||||
aEvent.mnScrollLines = 3;
|
|
||||||
|
|
||||||
switch (pSEvent->direction)
|
// rhbz#1344042 "Traditionally" in gtk3 we tool a single up/down event as
|
||||||
|
// equating to 3 scroll lines and a delta of 120. So scale the delta here
|
||||||
|
// by 120 where a single mouse wheel click is an incoming delta_x of 1
|
||||||
|
// and divide that by 40 to get the number of scrollines
|
||||||
|
if (pSEvent->delta_x != 0.0)
|
||||||
{
|
{
|
||||||
case GDK_SCROLL_SMOOTH:
|
aEvent.mnDelta = -pSEvent->delta_x * 120;
|
||||||
{
|
aEvent.mnNotchDelta = aEvent.mnDelta < 0 ? -1 : +1;
|
||||||
//pick the bigger one I guess
|
if (aEvent.mnDelta == 0)
|
||||||
aEvent.mbHorz = fabs(pSEvent->delta_x) > fabs(pSEvent->delta_y);
|
aEvent.mnDelta = aEvent.mnNotchDelta;
|
||||||
if (aEvent.mbHorz)
|
aEvent.mbHorz = true;
|
||||||
aEvent.mnDelta = -pSEvent->delta_x * 40;
|
aEvent.mnScrollLines = abs(aEvent.mnDelta) / 40;
|
||||||
else
|
if (aEvent.mnScrollLines == 0)
|
||||||
aEvent.mnDelta = -pSEvent->delta_y * 40;
|
|
||||||
aEvent.mnScrollLines = 1;
|
aEvent.mnScrollLines = 1;
|
||||||
pThis->m_nLastScrollEventTime = pSEvent->time;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GDK_SCROLL_UP:
|
|
||||||
aEvent.mnDelta = 120;
|
|
||||||
aEvent.mbHorz = false;
|
|
||||||
break;
|
|
||||||
case GDK_SCROLL_DOWN:
|
|
||||||
aEvent.mnDelta = -120;
|
|
||||||
aEvent.mbHorz = false;
|
|
||||||
break;
|
|
||||||
case GDK_SCROLL_LEFT:
|
|
||||||
aEvent.mbHorz = true;
|
|
||||||
aEvent.mnDelta = 120;
|
|
||||||
break;
|
|
||||||
case GDK_SCROLL_RIGHT:
|
|
||||||
aEvent.mnDelta = -120;
|
|
||||||
aEvent.mbHorz = true;
|
|
||||||
break;
|
|
||||||
};
|
|
||||||
|
|
||||||
aEvent.mnNotchDelta = aEvent.mnDelta < 0 ? -1 : 1;
|
pThis->CallCallback(SalEvent::WheelMouse, &aEvent);
|
||||||
|
}
|
||||||
|
|
||||||
// --- RTL --- (mirror mouse pos)
|
if (pSEvent->delta_y != 0.0)
|
||||||
if( AllSettings::GetLayoutRTL() )
|
{
|
||||||
aEvent.mnX = pThis->maGeometry.nWidth-1-aEvent.mnX;
|
aEvent.mnDelta = -pSEvent->delta_y * 120;
|
||||||
|
aEvent.mnNotchDelta = aEvent.mnDelta < 0 ? -1 : +1;
|
||||||
|
if (aEvent.mnDelta == 0)
|
||||||
|
aEvent.mnDelta = aEvent.mnNotchDelta;
|
||||||
|
aEvent.mbHorz = false;
|
||||||
|
aEvent.mnScrollLines = abs(aEvent.mnDelta) / 40;
|
||||||
|
if (aEvent.mnScrollLines == 0)
|
||||||
|
aEvent.mnScrollLines = 1;
|
||||||
|
|
||||||
pThis->CallCallback( SalEvent::WheelMouse, &aEvent );
|
pThis->CallCallback(SalEvent::WheelMouse, &aEvent);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user