[Libreoffice-commits] core.git: vcl/inc vcl/source vcl/unx

Caolán McNamara caolanm at redhat.com
Mon Jun 13 13:49:45 UTC 2016


 vcl/inc/unx/gtk/gtkframe.hxx  |    2 -
 vcl/source/window/dialog.cxx  |    1 
 vcl/unx/gtk/gtksalframe.cxx   |   15 ++++++-------
 vcl/unx/gtk3/gtk3gtkframe.cxx |   47 ++++++++++++++++++++++++++----------------
 4 files changed, 38 insertions(+), 27 deletions(-)

New commits:
commit 1092cc0c75f6d2ab649dd31b1db9f0a9f0944355
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Mon Jun 13 14:44:59 2016 +0100

    Related: tdf#100337 revert x-crossplatform ToTop...
    
    which was added in...
    
    commit 82abd23f3ee1900b7579e5a0afa23581d5836f01
    Author: Caolán McNamara <caolanm at 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

diff --git a/vcl/inc/unx/gtk/gtkframe.hxx b/vcl/inc/unx/gtk/gtkframe.hxx
index 8d48824..ff5c454 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 30f051f..f8f6734 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 0c6e315..0d8e153 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 640db4e..d862a46 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 );


More information about the Libreoffice-commits mailing list