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:47 +0100 |
commit | dc4768583bf90f5a1623f2a3724c2458efae3a65 (patch) | |
tree | eb53606f664625feda7260f21b0d6015894d942e | |
parent | fd99a87a42a79169e55f36044c24a75c6345d241 (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
(cherry picked from commit 1092cc0c75f6d2ab649dd31b1db9f0a9f0944355)
-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 355910ca4f3e..4677923e7183 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 e7c9992969ff..daa0bc06679a 100644 --- a/vcl/source/window/dialog.cxx +++ b/vcl/source/window/dialog.cxx @@ -856,7 +856,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 7f7c425ad642..232035673a27 100644 --- a/vcl/unx/gtk3/gtk3gtkframe.cxx +++ b/vcl/unx/gtk3/gtk3gtkframe.cxx @@ -2016,6 +2016,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 ) @@ -2024,13 +2031,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 { @@ -2560,6 +2564,8 @@ void GtkSalFrame::StartToolKitMoveBy() gboolean GtkSalFrame::signalButton( GtkWidget*, GdkEventButton* pEvent, gpointer frame ) { + UpdateLastInputEventTime(pEvent->time); + GtkSalFrame* pThis = static_cast<GtkSalFrame*>(frame); SalMouseEvent aEvent; @@ -2649,31 +2655,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; @@ -2685,9 +2692,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; @@ -2746,6 +2753,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; @@ -2788,6 +2797,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; @@ -2963,6 +2974,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 ); |