diff options
author | Caolán McNamara <caolanm@redhat.com> | 2016-06-13 14:44:59 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2016-06-13 14:49:21 +0100 |
commit | 1092cc0c75f6d2ab649dd31b1db9f0a9f0944355 (patch) | |
tree | 46dbcad1cc45e7d67277b16782e8261855097e5b | |
parent | cfe33278f542af05fd1a2df040af1cd0aea9ed45 (diff) |
Related: tdf#100337 revert x-crossplatform ToTop...
which was added in...
commit 82abd23f3ee1900b7579e5a0afa23581d5836f01
Author: Caolán McNamara <caolanm@redhat.com>
Date: Thu Nov 12 16:05:44 2015 +0000
Resolves: tdf#93317 Modified Document Dialog misses focus on Gtk3
because it reportedly causes a windows-only regression
and instead fix tdf#93317 by presenting windows and taking focus
using the last received user input time to ensure that the ToTop
on the main window doesn't take precedence over the following
gtk_widget_show of the quit dialog
Change-Id: I08d1889232af75ca214ccafe9e4e9364df74fbe2
-rw-r--r-- | vcl/inc/unx/gtk/gtkframe.hxx | 2 | ||||
-rw-r--r-- | vcl/source/window/dialog.cxx | 1 | ||||
-rw-r--r-- | vcl/unx/gtk/gtksalframe.cxx | 15 | ||||
-rw-r--r-- | vcl/unx/gtk3/gtk3gtkframe.cxx | 47 |
4 files changed, 38 insertions, 27 deletions
diff --git a/vcl/inc/unx/gtk/gtkframe.hxx b/vcl/inc/unx/gtk/gtkframe.hxx index 8d48824a5eed..ff5c45432574 100644 --- a/vcl/inc/unx/gtk/gtkframe.hxx +++ b/vcl/inc/unx/gtk/gtkframe.hxx @@ -278,7 +278,7 @@ class GtkSalFrame : public SalFrame static gboolean signalKey( GtkWidget*, GdkEventKey*, gpointer ); static gboolean signalDelete( GtkWidget*, GdkEvent*, gpointer ); static gboolean signalWindowState( GtkWidget*, GdkEvent*, gpointer ); - static gboolean signalScroll( GtkWidget*, GdkEvent*, gpointer ); + static gboolean signalScroll( GtkWidget*, GdkEventScroll*, gpointer ); static gboolean signalCrossing( GtkWidget*, GdkEventCrossing*, gpointer ); static gboolean signalVisibility( GtkWidget*, GdkEventVisibility*, gpointer ); static void signalDestroy( GtkWidget*, gpointer ); diff --git a/vcl/source/window/dialog.cxx b/vcl/source/window/dialog.cxx index 30f051fda227..f8f67342b78d 100644 --- a/vcl/source/window/dialog.cxx +++ b/vcl/source/window/dialog.cxx @@ -855,7 +855,6 @@ bool Dialog::ImplStartExecuteModal() ImplAdjustNWFSizes(); Show(); - ToTop(); pSVData->maAppData.mnModalMode++; return true; diff --git a/vcl/unx/gtk/gtksalframe.cxx b/vcl/unx/gtk/gtksalframe.cxx index 0c6e315f9a41..0d8e1532e539 100644 --- a/vcl/unx/gtk/gtksalframe.cxx +++ b/vcl/unx/gtk/gtksalframe.cxx @@ -2840,10 +2840,9 @@ gboolean GtkSalFrame::signalButton( GtkWidget*, GdkEventButton* pEvent, gpointer return true; } -gboolean GtkSalFrame::signalScroll( GtkWidget*, GdkEvent* pEvent, gpointer frame ) +gboolean GtkSalFrame::signalScroll( GtkWidget*, GdkEventScroll* pEvent, gpointer frame ) { GtkSalFrame* pThis = static_cast<GtkSalFrame*>(frame); - GdkEventScroll* pSEvent = reinterpret_cast<GdkEventScroll*>(pEvent); static sal_uLong nLines = 0; if( ! nLines ) @@ -2854,16 +2853,16 @@ gboolean GtkSalFrame::signalScroll( GtkWidget*, GdkEvent* pEvent, gpointer frame nLines = SAL_WHEELMOUSE_EVENT_PAGESCROLL; } - bool bNeg = (pSEvent->direction == GDK_SCROLL_DOWN || pSEvent->direction == GDK_SCROLL_RIGHT ); + bool bNeg = (pEvent->direction == GDK_SCROLL_DOWN || pEvent->direction == GDK_SCROLL_RIGHT ); SalWheelMouseEvent aEvent; - aEvent.mnTime = pSEvent->time; - aEvent.mnX = (sal_uLong)pSEvent->x; - aEvent.mnY = (sal_uLong)pSEvent->y; + aEvent.mnTime = pEvent->time; + aEvent.mnX = (sal_uLong)pEvent->x; + aEvent.mnY = (sal_uLong)pEvent->y; aEvent.mnDelta = bNeg ? -120 : 120; aEvent.mnNotchDelta = bNeg ? -1 : 1; aEvent.mnScrollLines = nLines; - aEvent.mnCode = GetMouseModCode( pSEvent->state ); - aEvent.mbHorz = (pSEvent->direction == GDK_SCROLL_LEFT || pSEvent->direction == GDK_SCROLL_RIGHT); + aEvent.mnCode = GetMouseModCode( pEvent->state ); + aEvent.mbHorz = (pEvent->direction == GDK_SCROLL_LEFT || pEvent->direction == GDK_SCROLL_RIGHT); // --- RTL --- (mirror mouse pos) if( AllSettings::GetLayoutRTL() ) diff --git a/vcl/unx/gtk3/gtk3gtkframe.cxx b/vcl/unx/gtk3/gtk3gtkframe.cxx index 640db4e7e20a..d862a4695c94 100644 --- a/vcl/unx/gtk3/gtk3gtkframe.cxx +++ b/vcl/unx/gtk3/gtk3gtkframe.cxx @@ -2012,6 +2012,13 @@ void GtkSalFrame::SetAlwaysOnTop( bool bOnTop ) gtk_window_set_keep_above( GTK_WINDOW( m_pWindow ), bOnTop ); } +static guint32 nLastUserInputTime = GDK_CURRENT_TIME; + +static void UpdateLastInputEventTime(guint32 nUserInputTime) +{ + nLastUserInputTime = nUserInputTime; +} + void GtkSalFrame::ToTop( SalFrameToTop nFlags ) { if( m_pWindow ) @@ -2020,13 +2027,10 @@ void GtkSalFrame::ToTop( SalFrameToTop nFlags ) gtk_widget_grab_focus( m_pWindow ); else if( IS_WIDGET_MAPPED( m_pWindow ) ) { - if( ! (nFlags & SalFrameToTop::GrabFocusOnly) ) - gtk_window_present( GTK_WINDOW(m_pWindow) ); + if (!(nFlags & SalFrameToTop::GrabFocusOnly)) + gtk_window_present_with_time(GTK_WINDOW(m_pWindow), nLastUserInputTime); else - { - guint32 nUserTime = GDK_CURRENT_TIME; - gdk_window_focus( widget_get_window(m_pWindow), nUserTime ); - } + gdk_window_focus(widget_get_window(m_pWindow), nLastUserInputTime); } else { @@ -2556,6 +2560,8 @@ void GtkSalFrame::StartToolKitMoveBy() gboolean GtkSalFrame::signalButton( GtkWidget*, GdkEventButton* pEvent, gpointer frame ) { + UpdateLastInputEventTime(pEvent->time); + GtkSalFrame* pThis = static_cast<GtkSalFrame*>(frame); SalMouseEvent aEvent; @@ -2645,31 +2651,32 @@ gboolean GtkSalFrame::signalButton( GtkWidget*, GdkEventButton* pEvent, gpointer return true; } -gboolean GtkSalFrame::signalScroll( GtkWidget*, GdkEvent* pEvent, gpointer frame ) +gboolean GtkSalFrame::signalScroll( GtkWidget*, GdkEventScroll* pEvent, gpointer frame ) { - GdkEventScroll* pSEvent = reinterpret_cast<GdkEventScroll*>(pEvent); - if (pSEvent->direction != GDK_SCROLL_SMOOTH) + UpdateLastInputEventTime(pEvent->time); + + if (pEvent->direction != GDK_SCROLL_SMOOTH) return false; GtkSalFrame* pThis = static_cast<GtkSalFrame*>(frame); SalWheelMouseEvent aEvent; - aEvent.mnTime = pSEvent->time; - aEvent.mnX = (sal_uLong)pSEvent->x; + aEvent.mnTime = pEvent->time; + aEvent.mnX = (sal_uLong)pEvent->x; // --- RTL --- (mirror mouse pos) if (AllSettings::GetLayoutRTL()) aEvent.mnX = pThis->maGeometry.nWidth - 1 - aEvent.mnX; - aEvent.mnY = (sal_uLong)pSEvent->y; - aEvent.mnCode = GetMouseModCode( pSEvent->state ); + aEvent.mnY = (sal_uLong)pEvent->y; + aEvent.mnCode = GetMouseModCode( pEvent->state ); // 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) + if (pEvent->delta_x != 0.0) { - aEvent.mnDelta = -pSEvent->delta_x * 120; + aEvent.mnDelta = -pEvent->delta_x * 120; aEvent.mnNotchDelta = aEvent.mnDelta < 0 ? -1 : +1; if (aEvent.mnDelta == 0) aEvent.mnDelta = aEvent.mnNotchDelta; @@ -2681,9 +2688,9 @@ gboolean GtkSalFrame::signalScroll( GtkWidget*, GdkEvent* pEvent, gpointer frame pThis->CallCallback(SalEvent::WheelMouse, &aEvent); } - if (pSEvent->delta_y != 0.0) + if (pEvent->delta_y != 0.0) { - aEvent.mnDelta = -pSEvent->delta_y * 120; + aEvent.mnDelta = -pEvent->delta_y * 120; aEvent.mnNotchDelta = aEvent.mnDelta < 0 ? -1 : +1; if (aEvent.mnDelta == 0) aEvent.mnDelta = aEvent.mnNotchDelta; @@ -2742,6 +2749,8 @@ void GtkSalFrame::gestureLongPress(GtkGestureLongPress* gesture, gpointer frame) gboolean GtkSalFrame::signalMotion( GtkWidget*, GdkEventMotion* pEvent, gpointer frame ) { + UpdateLastInputEventTime(pEvent->time); + GtkSalFrame* pThis = static_cast<GtkSalFrame*>(frame); SalMouseEvent aEvent; @@ -2784,6 +2793,8 @@ gboolean GtkSalFrame::signalMotion( GtkWidget*, GdkEventMotion* pEvent, gpointer gboolean GtkSalFrame::signalCrossing( GtkWidget*, GdkEventCrossing* pEvent, gpointer frame ) { + UpdateLastInputEventTime(pEvent->time); + GtkSalFrame* pThis = static_cast<GtkSalFrame*>(frame); SalMouseEvent aEvent; aEvent.mnTime = pEvent->time; @@ -2953,6 +2964,8 @@ gboolean GtkSalFrame::signalUnmap( GtkWidget*, GdkEvent*, gpointer frame ) gboolean GtkSalFrame::signalKey( GtkWidget*, GdkEventKey* pEvent, gpointer frame ) { + UpdateLastInputEventTime(pEvent->time); + GtkSalFrame* pThis = static_cast<GtkSalFrame*>(frame); vcl::DeletionListener aDel( pThis ); |