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:21 +0100
commit1092cc0c75f6d2ab649dd31b1db9f0a9f0944355 (patch)
tree46dbcad1cc45e7d67277b16782e8261855097e5b
parentcfe33278f542af05fd1a2df040af1cd0aea9ed45 (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.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 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 );