summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2016-06-13 14:44:59 +0100
committerCaolán McNamara <caolanm@redhat.com>2016-06-13 14:49:47 +0100
commitdc4768583bf90f5a1623f2a3724c2458efae3a65 (patch)
treeeb53606f664625feda7260f21b0d6015894d942e
parentfd99a87a42a79169e55f36044c24a75c6345d241 (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.hxx2
-rw-r--r--vcl/source/window/dialog.cxx1
-rw-r--r--vcl/unx/gtk/gtksalframe.cxx15
-rw-r--r--vcl/unx/gtk3/gtk3gtkframe.cxx47
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 );