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 <caol...@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 <caol...@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 <caol...@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 <caol...@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 ) )
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits