From ea34cf69c7c5d02f7751f1b20e74fcfe23755380 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
Date: Mon, 13 Jun 2016 14:44:59 +0100
Subject: [PATCH] Resolves: rhbz#1342823 toolbar menus popdown immediately
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
(cherry picked from commit f7c888994db744396c69aa1be720c2089ada5798)
Change-Id: I9cecf50fb85d84e108ccc23d22bf97d2ac510a9b
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
(cherry picked from commit 1092cc0c75f6d2ab649dd31b1db9f0a9f0944355)
Change-Id: I08d1889232af75ca214ccafe9e4e9364df74fbe2
---
vcl/inc/unx/gtk/gtkframe.hxx | 4 +++-
vcl/source/window/dialog.cxx | 1 -
vcl/unx/gtk/gtksalframe.cxx | 14 +++++++-------
vcl/unx/gtk/gtksalmenu.cxx | 2 +-
vcl/unx/gtk3/gtk3gtkframe.cxx | 29 ++++++++++++++++++++++++-----
5 files changed, 35 insertions(+), 15 deletions(-)
diff --git a/vcl/inc/unx/gtk/gtkframe.hxx b/vcl/inc/unx/gtk/gtkframe.hxx
index b5eb02d..85ceb9a 100644
--- a/vcl/inc/unx/gtk/gtkframe.hxx
+++ b/vcl/inc/unx/gtk/gtkframe.hxx
@@ -277,7 +277,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*, GdkEventScroll* pEvent, gpointer );
+ static gboolean signalScroll( GtkWidget*, GdkEventScroll*, gpointer );
static gboolean signalCrossing( GtkWidget*, GdkEventCrossing*, gpointer );
static gboolean signalVisibility( GtkWidget*, GdkEventVisibility*, gpointer );
static void signalDestroy( GtkWidget*, gpointer );
@@ -528,6 +528,8 @@ public:
static void KeyCodeToGdkKey(const vcl::KeyCode& rKeyCode,
guint* pGdkKeyCode, GdkModifierType *pGdkModifiers);
+
+ static guint32 GetLastInputEventTime();
};
#define OOO_TYPE_FIXED ooo_fixed_get_type()
diff --git a/vcl/source/window/dialog.cxx b/vcl/source/window/dialog.cxx
index 8b70c2e..f9a0997 100644
--- a/vcl/source/window/dialog.cxx
+++ b/vcl/source/window/dialog.cxx
@@ -866,7 +866,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 4f9c6da..4207ae2 100644
--- a/vcl/unx/gtk/gtksalframe.cxx
+++ b/vcl/unx/gtk/gtksalframe.cxx
@@ -2838,7 +2838,7 @@ gboolean GtkSalFrame::signalButton( GtkWidget*, GdkEventButton* pEvent, gpointer
return true;
}
-gboolean GtkSalFrame::signalScroll( GtkWidget*, GdkEventScroll* pSEvent, gpointer frame )
+gboolean GtkSalFrame::signalScroll( GtkWidget*, GdkEventScroll* pEvent, gpointer frame )
{
GtkSalFrame* pThis = static_cast<GtkSalFrame*>(frame);
@@ -2851,16 +2851,16 @@ gboolean GtkSalFrame::signalScroll( GtkWidget*, GdkEventScroll* pSEvent, gpointe
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/gtk/gtksalmenu.cxx b/vcl/unx/gtk/gtksalmenu.cxx
index 2711291..a06b580 100644
--- a/vcl/unx/gtk/gtksalmenu.cxx
+++ b/vcl/unx/gtk/gtksalmenu.cxx
@@ -360,7 +360,7 @@ bool GtkSalMenu::ShowNativePopupMenu(FloatingWindow* pWin, const Rectangle& rRec
else
{
nButton = 0;
- nTime = gtk_get_current_event_time();
+ nTime = GtkSalFrame::GetLastInputEventTime();
}
VclPtr<vcl::Window> xParent = pWin->ImplGetWindowImpl()->mpRealParent;
diff --git a/vcl/unx/gtk3/gtk3gtkframe.cxx b/vcl/unx/gtk3/gtk3gtkframe.cxx
index cd980ce..7694a33 100644
--- a/vcl/unx/gtk3/gtk3gtkframe.cxx
+++ b/vcl/unx/gtk3/gtk3gtkframe.cxx
@@ -2028,6 +2028,18 @@ void GtkSalFrame::SetAlwaysOnTop( bool bOnTop )
gtk_window_set_keep_above( GTK_WINDOW( m_pWindow ), bOnTop );
}
+static guint32 nLastUserInputTime = GDK_CURRENT_TIME;
+
+guint32 GtkSalFrame::GetLastInputEventTime()
+{
+ return nLastUserInputTime;
+}
+
+static void UpdateLastInputEventTime(guint32 nUserInputTime)
+{
+ nLastUserInputTime = nUserInputTime;
+}
+
void GtkSalFrame::ToTop( sal_uInt16 nFlags )
{
if( m_pWindow )
@@ -2037,12 +2049,9 @@ void GtkSalFrame::ToTop( sal_uInt16 nFlags )
else if( IS_WIDGET_MAPPED( m_pWindow ) )
{
if( ! (nFlags & SAL_FRAME_TOTOP_GRABFOCUS_ONLY) )
- gtk_window_present( GTK_WINDOW(m_pWindow) );
+ gtk_window_present_with_time(GTK_WINDOW(m_pWindow), GetLastInputEventTime());
else
- {
- guint32 nUserTime = GDK_CURRENT_TIME;
- gdk_window_focus( widget_get_window(m_pWindow), nUserTime );
- }
+ gdk_window_focus(widget_get_window(m_pWindow), GetLastInputEventTime());
}
else
{
@@ -2460,6 +2469,8 @@ bool GtkSalFrame::ShowTooltip(const OUString& rHelpText, const Rectangle& rHelpA
gboolean GtkSalFrame::signalButton( GtkWidget*, GdkEventButton* pEvent, gpointer frame )
{
+ UpdateLastInputEventTime(pEvent->time);
+
GtkSalFrame* pThis = static_cast<GtkSalFrame*>(frame);
SalMouseEvent aEvent;
@@ -2551,6 +2562,8 @@ gboolean GtkSalFrame::signalButton( GtkWidget*, GdkEventButton* pEvent, gpointer
gboolean GtkSalFrame::signalScroll( GtkWidget*, GdkEventScroll* pEvent, gpointer frame )
{
+ UpdateLastInputEventTime(pEvent->time);
+
GtkSalFrame* pThis = static_cast<GtkSalFrame*>(frame);
SalWheelMouseEvent aEvent;
@@ -2680,6 +2693,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;
@@ -2722,6 +2737,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;
@@ -2922,6 +2939,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 );
--
2.7.4