[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