vcl/inc/unx/gtk/gtkframe.hxx | 6 +++++- vcl/unx/gtk3/gtk3gtkframe.cxx | 35 ++++++++++++++++++++++++++--------- 2 files changed, 31 insertions(+), 10 deletions(-)
New commits: commit 6ca910adfed9906be587cb82284a631377490303 Author: Caolán McNamara <caol...@redhat.com> Date: Wed Nov 2 13:38:17 2016 +0000 gtk3: grabs on floating window inside floating window under gtk3 with the floating window of the listbox inside the color floating window if the toplevel window is dismissed the focus doesn't remain locked to its parent, but skips to the grandparent so grab and ungrab only once elements in the hierarchy Change-Id: I14b1b8888671634c0c01c6416493f912e4abd2f9 diff --git a/vcl/inc/unx/gtk/gtkframe.hxx b/vcl/inc/unx/gtk/gtkframe.hxx index 4b891b6..4d675c6 100644 --- a/vcl/inc/unx/gtk/gtkframe.hxx +++ b/vcl/inc/unx/gtk/gtkframe.hxx @@ -351,6 +351,7 @@ public: #if GTK_CHECK_VERSION(3,0,0) cairo_surface_t* m_pSurface; DamageHandler m_aDamageHandler; + int m_nGrabLevel; #endif GtkSalFrame( SalFrame* pParent, SalFrameStyleFlags nStyle ); GtkSalFrame( SystemParentData* pSysData ); @@ -425,6 +426,9 @@ public: void closePopup(); + void addGrabLevel(); + void removeGrabLevel(); + #endif virtual ~GtkSalFrame() override; diff --git a/vcl/unx/gtk3/gtk3gtkframe.cxx b/vcl/unx/gtk3/gtk3gtkframe.cxx index 60e1a1d..d377f32 100644 --- a/vcl/unx/gtk3/gtk3gtkframe.cxx +++ b/vcl/unx/gtk3/gtk3gtkframe.cxx @@ -980,6 +980,7 @@ static void damaged(void *handle, void GtkSalFrame::InitCommon() { m_pSurface = nullptr; + m_nGrabLevel = 0; m_aDamageHandler.handle = this; m_aDamageHandler.damaged = ::damaged; @@ -1441,7 +1442,7 @@ void GtkSalFrame::Show( bool bVisible, bool /*bNoActivate*/ ) if (isFloatGrabWindow() && !getDisplay()->GetCaptureFrame()) { m_pParent->grabPointer(true, true); - gtk_grab_add(m_pParent->getMouseEventWidget()); + m_pParent->addGrabLevel(); } gtk_widget_show(m_pWindow); @@ -1452,7 +1453,7 @@ void GtkSalFrame::Show( bool bVisible, bool /*bNoActivate*/ ) if (!getDisplay()->GetCaptureFrame()) { grabPointer(true, true); - gtk_grab_add(getMouseEventWidget()); + addGrabLevel(); } // #i44068# reset parent's IM context if( m_pParent ) @@ -1466,9 +1467,9 @@ void GtkSalFrame::Show( bool bVisible, bool /*bNoActivate*/ ) m_nFloats--; if (!getDisplay()->GetCaptureFrame()) { - gtk_grab_remove(getMouseEventWidget()); + removeGrabLevel(); grabPointer(false); - gtk_grab_remove(m_pParent->getMouseEventWidget()); + m_pParent->removeGrabLevel(); m_pParent->grabPointer(false); } } @@ -2550,6 +2551,20 @@ void GtkSalFrame::StartToolKitMoveBy() pEvent->button.time); } +void GtkSalFrame::addGrabLevel() +{ + if (m_nGrabLevel == 0) + gtk_grab_add(getMouseEventWidget()); + ++m_nGrabLevel; +} + +void GtkSalFrame::removeGrabLevel() +{ + --m_nGrabLevel; + if (m_nGrabLevel == 0) + gtk_grab_remove(getMouseEventWidget()); +} + void GtkSalFrame::closePopup() { if (!m_nFloats) commit b99bff93a3dd2f76c9c98ff3bc72a60cbd79730a Author: Caolán McNamara <caol...@redhat.com> Date: Tue Nov 1 20:32:57 2016 +0000 gtk3: allow float grab inside float grab this is so that the floating window belonging to the listbox inside the floating window color popup will track the mouse as it moves up and down over the menu. Change-Id: If108b5b3866fdbc04513c48c8d859bedd3867379 diff --git a/vcl/unx/gtk3/gtk3gtkframe.cxx b/vcl/unx/gtk3/gtk3gtkframe.cxx index 704e4ce..60e1a1d 100644 --- a/vcl/unx/gtk3/gtk3gtkframe.cxx +++ b/vcl/unx/gtk3/gtk3gtkframe.cxx @@ -1438,7 +1438,7 @@ void GtkSalFrame::Show( bool bVisible, bool /*bNoActivate*/ ) SetDefaultSize(); setMinMaxSize(); - if (isFloatGrabWindow() && !getDisplay()->GetCaptureFrame() && m_nFloats == 0) + if (isFloatGrabWindow() && !getDisplay()->GetCaptureFrame()) { m_pParent->grabPointer(true, true); gtk_grab_add(m_pParent->getMouseEventWidget()); @@ -1449,7 +1449,7 @@ void GtkSalFrame::Show( bool bVisible, bool /*bNoActivate*/ ) if( isFloatGrabWindow() ) { m_nFloats++; - if( ! getDisplay()->GetCaptureFrame() && m_nFloats == 1 ) + if (!getDisplay()->GetCaptureFrame()) { grabPointer(true, true); gtk_grab_add(getMouseEventWidget()); @@ -1464,7 +1464,7 @@ void GtkSalFrame::Show( bool bVisible, bool /*bNoActivate*/ ) if( isFloatGrabWindow() ) { m_nFloats--; - if( ! getDisplay()->GetCaptureFrame() && m_nFloats == 0) + if (!getDisplay()->GetCaptureFrame()) { gtk_grab_remove(getMouseEventWidget()); grabPointer(false); commit 38e7f38b82e121120739034b4119e7d95c8b33fd Author: Caolán McNamara <caol...@redhat.com> Date: Wed Nov 2 10:14:57 2016 +0000 gtk3: just close the toplevel float if it corresponds to the event frame Change-Id: I489acc288fb1c9564f208e024dd5aa3ae9660a49 diff --git a/vcl/inc/unx/gtk/gtkframe.hxx b/vcl/inc/unx/gtk/gtkframe.hxx index c6d7743..4b891b6 100644 --- a/vcl/inc/unx/gtk/gtkframe.hxx +++ b/vcl/inc/unx/gtk/gtkframe.hxx @@ -423,7 +423,7 @@ public: void startDrag(gint nButton, gint nDragOriginX, gint nDragOriginY, GdkDragAction sourceActions, GtkTargetList* pTargetList); - static void closePopup(); + void closePopup(); #endif virtual ~GtkSalFrame() override; diff --git a/vcl/unx/gtk3/gtk3gtkframe.cxx b/vcl/unx/gtk3/gtk3gtkframe.cxx index f274a78..704e4ce 100644 --- a/vcl/unx/gtk3/gtk3gtkframe.cxx +++ b/vcl/unx/gtk3/gtk3gtkframe.cxx @@ -2557,6 +2557,8 @@ void GtkSalFrame::closePopup() ImplSVData* pSVData = ImplGetSVData(); if (!pSVData->maWinData.mpFirstFloat) return; + if (pSVData->maWinData.mpFirstFloat->ImplGetFrame() != this) + return; pSVData->maWinData.mpFirstFloat->EndPopupMode(FloatWinPopupEndFlags::Cancel | FloatWinPopupEndFlags::CloseAll); } @@ -2597,7 +2599,7 @@ gboolean GtkSalFrame::signalButton( GtkWidget*, GdkEventButton* pEvent, gpointer { bool bClosePopups = (pEvent->window != widget_get_window(pThis->getMouseEventWidget())); if (bClosePopups) - closePopup(); + pThis->closePopup(); } // --- RTL --- (mirror mouse pos) @@ -3143,7 +3145,7 @@ gboolean GtkSalFrame::signalWindowState( GtkWidget*, GdkEvent* pEvent, gpointer !(pThis->m_nState & GDK_WINDOW_STATE_WITHDRAWN)) { if (pThis->isFloatGrabWindow()) - closePopup(); + pThis->closePopup(); } pThis->m_nState = pEvent->window_state.new_window_state;
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits