[Libreoffice-commits] core.git: Branch 'libreoffice-5-0' - 4 commits - vcl/inc vcl/source vcl/unx

Caolán McNamara caolanm at redhat.com
Tue Jun 30 04:20:37 PDT 2015


 vcl/inc/unx/gtk/gtkframe.hxx         |    3 ++-
 vcl/source/window/menu.cxx           |    9 +++++----
 vcl/source/window/menubarwindow.cxx  |    4 ++++
 vcl/unx/gtk/fpicker/SalGtkPicker.cxx |   23 +++++++++++++++++------
 vcl/unx/gtk/window/gtksalframe.cxx   |   31 +++++++++++++++++++++++++++++--
 5 files changed, 57 insertions(+), 13 deletions(-)

New commits:
commit 01bee1de5c4daf53abc01056145b1e387c517959
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Tue Jun 30 12:16:20 2015 +0100

    gtk3: re-enable when in backdrop and receive delete signal
    
    Change-Id: I845a3eda41263a07e1e69eb6ff37ff5ab2576905
    (cherry picked from commit 9ce8f73550e327ecffeed3f4f8697f8b1f2548ed)

diff --git a/vcl/unx/gtk/window/gtksalframe.cxx b/vcl/unx/gtk/window/gtksalframe.cxx
index 0cd5516..017b7f1 100644
--- a/vcl/unx/gtk/window/gtksalframe.cxx
+++ b/vcl/unx/gtk/window/gtksalframe.cxx
@@ -4017,6 +4017,14 @@ gboolean GtkSalFrame::signalDelete( GtkWidget*, GdkEvent*, gpointer frame )
 {
     GtkSalFrame* pThis = static_cast<GtkSalFrame*>(frame);
 
+#if GTK_CHECK_VERSION(3,0,0)
+    //If we went into the backdrop we disabled the toplevel window, if we
+    //receive a delete here, re-enable so we can process it
+    bool bBackDrop = (gtk_widget_get_state_flags(GTK_WIDGET(pThis->m_pWindow)) & GTK_STATE_FLAG_BACKDROP);
+    if (bBackDrop)
+        pThis->GetWindow()->Enable();
+#endif
+
     pThis->CallCallback( SALEVENT_CLOSE, NULL );
 
     return true;
commit ff562991b449be56c05cc40e932f21b39e965219
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Tue Jun 30 11:45:16 2015 +0100

    gtk3: detect if a new frame is just a tooltip
    
    Change-Id: I906f53ca5428b51077b4ac28462c2e8827f2a31f
    (cherry picked from commit f43058753b6d9850261ab050d14de7b9e4ec8a37)

diff --git a/vcl/unx/gtk/fpicker/SalGtkPicker.cxx b/vcl/unx/gtk/fpicker/SalGtkPicker.cxx
index 1e07d9a..5f715ad 100644
--- a/vcl/unx/gtk/fpicker/SalGtkPicker.cxx
+++ b/vcl/unx/gtk/fpicker/SalGtkPicker.cxx
@@ -25,6 +25,8 @@
 
 #include <com/sun/star/lang/XMultiComponentFactory.hpp>
 #include <com/sun/star/uri/ExternalUriReferenceTranslator.hpp>
+#include <com/sun/star/accessibility/XAccessibleContext.hpp>
+#include <com/sun/star/accessibility/AccessibleRole.hpp>
 #include <comphelper/processfactory.hxx>
 #include <rtl/process.h>
 #include <osl/diagnose.h>
@@ -133,15 +135,24 @@ RunDialog::~RunDialog()
     g_source_remove_by_user_data (this);
 }
 
-void SAL_CALL RunDialog::windowOpened( const ::com::sun::star::lang::EventObject& )
-    throw (::com::sun::star::uno::RuntimeException, std::exception)
+void SAL_CALL RunDialog::windowOpened(const css::lang::EventObject& e)
+    throw (css::uno::RuntimeException, std::exception)
 {
-#if !GTK_CHECK_VERSION(3,0,0)
     SolarMutexGuard g;
+
+    //Don't popdown dialogs if a tooltip appears elsewhere, that's ok, but do pop down
+    //if another dialog/frame is launched.
+    css::uno::Reference<css::accessibility::XAccessible> xAccessible(e.Source, css::uno::UNO_QUERY);
+    if (xAccessible.is())
+    {
+        css::uno::Reference<css::accessibility::XAccessibleContext> xContext(xAccessible->getAccessibleContext());
+        if (xContext.is() && xContext->getAccessibleRole() == css::accessibility::AccessibleRole::TOOL_TIP)
+        {
+            return;
+        }
+    }
+
     g_timeout_add_full(G_PRIORITY_HIGH_IDLE, 0, reinterpret_cast<GSourceFunc>(canceldialog), this, NULL);
-#else
-    SAL_WARN( "vcl", "ignoring windowOpened, because gtk3 dialog is probably not modal as expected and a tooltip was triggered" );
-#endif
 }
 
 void SAL_CALL RunDialog::queryTermination( const ::com::sun::star::lang::EventObject& )
commit 88b336b86585508ee947a97334cb184f5b0671e0
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Tue Jun 30 09:48:39 2015 +0100

    gtk3: draw disabled menubars entries with disabled text color
    
    Change-Id: I9188c6071f62d13a688c1eb6b14b1ac3f7dc77d4
    (cherry picked from commit 67d0aee921ae7c10bfd823097db73d7f125faa3a)

diff --git a/vcl/source/window/menu.cxx b/vcl/source/window/menu.cxx
index 7acd139..8f2a93f 100644
--- a/vcl/source/window/menu.cxx
+++ b/vcl/source/window/menu.cxx
@@ -1878,7 +1878,7 @@ void Menu::ImplPaint(vcl::RenderContext& rRenderContext,
                 // contained. The application itself should check for this!
                 // Otherwise it could happen entries are disabled due to
                 // asynchronous loading
-                if (!pData->bEnabled)
+                if (!pData->bEnabled || !pWindow->IsEnabled())
                 {
                     nTextStyle   |= DrawTextFlags::Disable;
                     nSymbolStyle |= DrawSymbolFlags::Disable;
@@ -1892,7 +1892,7 @@ void Menu::ImplPaint(vcl::RenderContext& rRenderContext,
                     if (rRenderContext.IsNativeControlSupported(CTRL_MENU_POPUP, PART_MENU_SEPARATOR))
                     {
                         ControlState nState = ControlState::NONE;
-                        if (pData->bEnabled)
+                        if (pData->bEnabled && !pWindow->IsEnabled())
                             nState |= ControlState::ENABLED;
                         if (bHighlighted)
                             nState |= ControlState::SELECTED;
@@ -1948,7 +1948,7 @@ void Menu::ImplPaint(vcl::RenderContext& rRenderContext,
                             if (pData->bChecked)
                                 nState |= ControlState::PRESSED;
 
-                            if (pData->bEnabled)
+                            if (pData->bEnabled && !pWindow->IsEnabled())
                                 nState |= ControlState::ENABLED;
 
                             if (bHighlighted)
@@ -2019,6 +2019,7 @@ void Menu::ImplPaint(vcl::RenderContext& rRenderContext,
                     aTmpPos.Y() = aPos.Y();
                     aTmpPos.Y() += nTextOffsetY;
                     DrawTextFlags nStyle = nTextStyle | DrawTextFlags::Mnemonic;
+
                     if (pData->bIsTemporary)
                         nStyle |= DrawTextFlags::Disable;
                     MetricVector* pVector = bLayout ? &mpLayoutData->m_aUnicodeBoundRects : NULL;
@@ -2088,7 +2089,7 @@ void Menu::ImplPaint(vcl::RenderContext& rRenderContext,
                             aSpacing = nOuterSpaceX;
                         }
 
-                        if (pData->bEnabled)
+                        if (pData->bEnabled && !pWindow->IsEnabled())
                             nState |= ControlState::ENABLED;
                         if (bHighlighted)
                             nState |= ControlState::SELECTED;
diff --git a/vcl/source/window/menubarwindow.cxx b/vcl/source/window/menubarwindow.cxx
index 9d44a9e..fb542a4 100644
--- a/vcl/source/window/menubarwindow.cxx
+++ b/vcl/source/window/menubarwindow.cxx
@@ -993,6 +993,10 @@ void MenuBarWindow::StateChanged( StateChangedType nType )
         ApplySettings(*this);
         Invalidate();
     }
+    else if (nType == StateChangedType::Enable)
+    {
+        Invalidate();
+    }
     else if(pMenu)
     {
         pMenu->ImplKillLayoutData();
commit 43f21855d2da0ad446511f3b09c5d0898410668a
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Tue Jun 30 08:58:04 2015 +0100

    gtk3: listen to state-flags-changed and disable toplevels when in backdrop
    
    Change-Id: I173618b2e6a2ad69918da8b85ec0eef7099f1d3d
    (cherry picked from commit 02b1e14743fa48b365f80e76ecb713877c990c34)

diff --git a/vcl/inc/unx/gtk/gtkframe.hxx b/vcl/inc/unx/gtk/gtkframe.hxx
index 0adeecd..6797ea82 100644
--- a/vcl/inc/unx/gtk/gtkframe.hxx
+++ b/vcl/inc/unx/gtk/gtkframe.hxx
@@ -238,6 +238,7 @@ class GtkSalFrame : public SalFrame, public X11WindowProvider
     static void         signalStyleSet( GtkWidget*, GtkStyle* pPrevious, gpointer );
 #if GTK_CHECK_VERSION(3,0,0)
     static gboolean     signalDraw( GtkWidget*, cairo_t *cr, gpointer );
+    static void         signalFlagsChanged( GtkWidget*, GtkStateFlags, gpointer );
 #if GTK_CHECK_VERSION(3,14,0)
     static void         gestureSwipe(GtkGestureSwipe* gesture, gdouble velocity_x, gdouble velocity_y, gpointer frame);
     static void         gestureLongPress(GtkGestureLongPress* gesture, gpointer frame);
@@ -252,7 +253,7 @@ class GtkSalFrame : public SalFrame, public X11WindowProvider
     static gboolean     signalMotion( GtkWidget*, GdkEventMotion*, gpointer );
     static gboolean     signalKey( GtkWidget*, GdkEventKey*, gpointer );
     static gboolean     signalDelete( GtkWidget*, GdkEvent*, gpointer );
-    static gboolean     signalState( GtkWidget*, GdkEvent*, gpointer );
+    static gboolean     signalWindowState( GtkWidget*, GdkEvent*, gpointer );
     static gboolean     signalScroll( GtkWidget*, GdkEvent*, gpointer );
     static gboolean     signalCrossing( GtkWidget*, GdkEventCrossing*, gpointer );
     static gboolean     signalVisibility( GtkWidget*, GdkEventVisibility*, gpointer );
diff --git a/vcl/unx/gtk/window/gtksalframe.cxx b/vcl/unx/gtk/window/gtksalframe.cxx
index 55fce4d..0cd5516 100644
--- a/vcl/unx/gtk/window/gtksalframe.cxx
+++ b/vcl/unx/gtk/window/gtksalframe.cxx
@@ -1036,6 +1036,7 @@ void GtkSalFrame::InitCommon()
     g_signal_connect( G_OBJECT(m_pWindow), "button-release-event", G_CALLBACK(signalButton), this );
 #if GTK_CHECK_VERSION(3,0,0)
     g_signal_connect( G_OBJECT(m_pWindow), "draw", G_CALLBACK(signalDraw), this );
+    g_signal_connect( G_OBJECT(m_pWindow), "state-flags-changed", G_CALLBACK(signalFlagsChanged), this );
 #if GTK_CHECK_VERSION(3,14,0)
     GtkGesture *pSwipe = gtk_gesture_swipe_new(m_pWindow);
     g_signal_connect(pSwipe, "swipe", G_CALLBACK(gestureSwipe), this);
@@ -1061,7 +1062,7 @@ void GtkSalFrame::InitCommon()
     g_signal_connect( G_OBJECT(m_pWindow), "key-press-event", G_CALLBACK(signalKey), this );
     g_signal_connect( G_OBJECT(m_pWindow), "key-release-event", G_CALLBACK(signalKey), this );
     g_signal_connect( G_OBJECT(m_pWindow), "delete-event", G_CALLBACK(signalDelete), this );
-    g_signal_connect( G_OBJECT(m_pWindow), "window-state-event", G_CALLBACK(signalState), this );
+    g_signal_connect( G_OBJECT(m_pWindow), "window-state-event", G_CALLBACK(signalWindowState), this );
     g_signal_connect( G_OBJECT(m_pWindow), "scroll-event", G_CALLBACK(signalScroll), this );
     g_signal_connect( G_OBJECT(m_pWindow), "leave-notify-event", G_CALLBACK(signalCrossing), this );
     g_signal_connect( G_OBJECT(m_pWindow), "enter-notify-event", G_CALLBACK(signalCrossing), this );
@@ -3439,6 +3440,24 @@ gboolean GtkSalFrame::signalButton( GtkWidget*, GdkEventButton* pEvent, gpointer
     return true;
 }
 
+#if GTK_CHECK_VERSION(3,0,0)
+void GtkSalFrame::signalFlagsChanged( GtkWidget* ,  GtkStateFlags state, gpointer frame )
+{
+    GtkSalFrame* pThis = static_cast<GtkSalFrame*>(frame);
+
+    bool bOldBackDrop = state & GTK_STATE_FLAG_BACKDROP;
+    bool bNewBackDrop = (gtk_widget_get_state_flags(GTK_WIDGET(pThis->m_pWindow)) & GTK_STATE_FLAG_BACKDROP);
+    if (bNewBackDrop && !bOldBackDrop)
+    {
+        pThis->GetWindow()->Disable();
+    }
+    else if (bOldBackDrop && !bNewBackDrop)
+    {
+        pThis->GetWindow()->Enable();
+    }
+}
+#endif
+
 gboolean GtkSalFrame::signalScroll( GtkWidget*, GdkEvent* pEvent, gpointer frame )
 {
     GtkSalFrame* pThis = static_cast<GtkSalFrame*>(frame);
@@ -4044,7 +4063,7 @@ void GtkSalFrame::signalStyleSet( GtkWidget*, GtkStyle* pPrevious, gpointer fram
 #endif
 }
 
-gboolean GtkSalFrame::signalState( GtkWidget*, GdkEvent* pEvent, gpointer frame )
+gboolean GtkSalFrame::signalWindowState( GtkWidget*, GdkEvent* pEvent, gpointer frame )
 {
     GtkSalFrame* pThis = static_cast<GtkSalFrame*>(frame);
     if( (pThis->m_nState & GDK_WINDOW_STATE_ICONIFIED) != (pEvent->window_state.new_window_state & GDK_WINDOW_STATE_ICONIFIED ) )


More information about the Libreoffice-commits mailing list