summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2016-05-05 15:17:29 +0100
committerCaolán McNamara <caolanm@redhat.com>2016-05-05 15:18:38 +0100
commit0771f36bf5910a8a8103c6575792ca55cf65d5d4 (patch)
treee6e78b7944e764b715f402b60578cca1a0a37044 /vcl
parent82350673eae51abe73b8de81af52b736e9ad5b9e (diff)
Revert "gtk3: New Folder dialog from Templates dialog doesn't get keyboard focus"
cause testing in libreoffice 5-1 shows that it breaks the menus there, we need that more complicated grab after all, we just don't see that on master because of the native menus in use there. This reverts commit 72e6a1365cb08986b542a5beb797634bca62d85b.
Diffstat (limited to 'vcl')
-rw-r--r--vcl/inc/unx/gtk/gtkframe.hxx1
-rw-r--r--vcl/unx/gtk3/gtk3gtkframe.cxx106
2 files changed, 54 insertions, 53 deletions
diff --git a/vcl/inc/unx/gtk/gtkframe.hxx b/vcl/inc/unx/gtk/gtkframe.hxx
index f033efff2506..3610addde351 100644
--- a/vcl/inc/unx/gtk/gtkframe.hxx
+++ b/vcl/inc/unx/gtk/gtkframe.hxx
@@ -271,7 +271,6 @@ class GtkSalFrame : public SalFrame
static void gestureSwipe(GtkGestureSwipe* gesture, gdouble velocity_x, gdouble velocity_y, gpointer frame);
static void gestureLongPress(GtkGestureLongPress* gesture, gpointer frame);
#endif
- gboolean handleKey(GtkWidget* pWidget, GdkEventKey* pEvent);
#else
static gboolean signalExpose( GtkWidget*, GdkEventExpose*, gpointer );
#endif
diff --git a/vcl/unx/gtk3/gtk3gtkframe.cxx b/vcl/unx/gtk3/gtk3gtkframe.cxx
index 701616584493..3dc58afd7c42 100644
--- a/vcl/unx/gtk3/gtk3gtkframe.cxx
+++ b/vcl/unx/gtk3/gtk3gtkframe.cxx
@@ -1424,6 +1424,21 @@ void GtkSalFrame::Show( bool bVisible, bool bNoActivate )
SetDefaultSize();
setMinMaxSize();
+ if( isFloatGrabWindow() &&
+ m_pParent &&
+ m_nFloats == 0 &&
+ ! getDisplay()->GetCaptureFrame() )
+ {
+ /* #i63086#
+ * outsmart Metacity's "focus:mouse" mode
+ * which insists on taking the focus from the document
+ * to the new float. Grab focus to parent frame BEFORE
+ * showing the float (cannot grab it to the float
+ * before show).
+ */
+ m_pParent->grabPointer( true, true );
+ }
+
if( ! bNoActivate && (m_nStyle & SalFrameStyleFlags::TOOLWINDOW) )
m_bSetFocusOnMap = true;
@@ -1434,9 +1449,9 @@ void GtkSalFrame::Show( bool bVisible, bool bNoActivate )
m_nFloats++;
if( ! getDisplay()->GetCaptureFrame() && m_nFloats == 1 )
{
- gtk_grab_add(getMouseEventWidget());
- grabPointer(true);
- grabKeyboard(true);
+ grabPointer(true, true);
+ GtkSalFrame *pKeyboardFrame = m_pParent ? m_pParent : this;
+ pKeyboardFrame->grabKeyboard(true);
}
// #i44068# reset parent's IM context
if( m_pParent )
@@ -1452,9 +1467,9 @@ void GtkSalFrame::Show( bool bVisible, bool bNoActivate )
m_nFloats--;
if( ! getDisplay()->GetCaptureFrame() && m_nFloats == 0)
{
- grabKeyboard(false);
+ GtkSalFrame *pKeyboardFrame = m_pParent ? m_pParent : this;
+ pKeyboardFrame->grabKeyboard(false);
grabPointer(false);
- gtk_grab_remove(getMouseEventWidget());
}
}
gtk_widget_hide( m_pWindow );
@@ -2061,13 +2076,9 @@ void GtkSalFrame::grabPointer( bool bGrab, bool bOwnerEvents )
GdkDeviceManager* pDeviceManager = gdk_display_get_device_manager(getGdkDisplay());
GdkDevice* pPointer = gdk_device_manager_get_client_pointer(pDeviceManager);
if (bGrab)
- {
gdk_device_grab(pPointer, widget_get_window(getMouseEventWidget()), GDK_OWNERSHIP_NONE, bOwnerEvents, (GdkEventMask) nMask, m_pCurrentCursor, gtk_get_current_event_time());
- }
else
- {
gdk_device_ungrab(pPointer, gtk_get_current_event_time());
- }
}
void GtkSalFrame::grabKeyboard( bool bGrab )
@@ -2403,6 +2414,13 @@ void GtkSalFrame::SetModal(bool bModal)
if (!m_pWindow)
return;
gtk_window_set_modal(GTK_WINDOW(m_pWindow), bModal);
+ if (bModal)
+ {
+ //gtk_window_set_modal bTrue adds a grab, so ungrab here. Quite
+ //possibly we should alternatively call grab_add grab_ungrab on
+ //show/hide of menus ?
+ gtk_grab_remove(m_pWindow);
+ }
}
gboolean GtkSalFrame::signalTooltipQuery(GtkWidget*, gint /*x*/, gint /*y*/,
@@ -2582,12 +2600,9 @@ gboolean GtkSalFrame::signalButton( GtkWidget*, GdkEventButton* pEvent, gpointer
{
if( m_nFloats > 0 )
{
- // close popups if user clicks outside our menu
- if (aEvent.mnX < 0 || aEvent.mnY < 0 ||
- aEvent.mnX > (long)pThis->maGeometry.nWidth || aEvent.mnY > (long)pThis->maGeometry.nHeight)
- {
- bClosePopups = true;
- }
+ // close popups if user clicks outside our application
+ gint x, y;
+ bClosePopups = (gdk_display_get_window_at_pointer( GtkSalFrame::getGdkDisplay(), &x, &y ) == nullptr);
}
/* #i30306# release implicit pointer grab if no popups are open; else
* Drag cannot grab the pointer and will fail.
@@ -2780,7 +2795,7 @@ gboolean GtkSalFrame::signalMotion( GtkWidget*, GdkEventMotion* pEvent, gpointer
// ask for the next hint
gint x, y;
GdkModifierType mask;
- gdk_window_get_pointer( widget_get_window(GTK_WIDGET(pThis->getMouseEventWidget())), &x, &y, &mask );
+ gdk_window_get_pointer( widget_get_window(GTK_WIDGET(pThis->m_pWindow)), &x, &y, &mask );
}
}
@@ -2962,28 +2977,15 @@ gboolean GtkSalFrame::signalUnmap( GtkWidget*, GdkEvent*, gpointer frame )
return false;
}
-gboolean GtkSalFrame::signalKey(GtkWidget* pWidget, GdkEventKey* pEvent, gpointer frame)
+gboolean GtkSalFrame::signalKey( GtkWidget*, GdkEventKey* pEvent, gpointer frame )
{
GtkSalFrame* pThis = static_cast<GtkSalFrame*>(frame);
- return pThis->handleKey(pWidget, pEvent);
-}
-
-gboolean GtkSalFrame::handleKey(GtkWidget* pWidget, GdkEventKey* pEvent)
-{
- //If we're the type of menu that wants to forward keypresses to our parent
- //widget, do that here, this is related to the gtk_grab_add use in
- //GtkSalFrame::Show where we want the mouse events to go to us, but
- //the keyboard events to go to our parent
- if (isFloatGrabWindow() && !getDisplay()->GetCaptureFrame() && m_nFloats == 1 && m_pParent)
- {
- return m_pParent->handleKey(pWidget, pEvent);
- }
- vcl::DeletionListener aDel(this);
+ vcl::DeletionListener aDel( pThis );
- if( m_pIMHandler )
+ if( pThis->m_pIMHandler )
{
- if( m_pIMHandler->handleKeyEvent( pEvent ) )
+ if( pThis->m_pIMHandler->handleKeyEvent( pEvent ) )
return true;
}
@@ -2999,13 +3001,13 @@ gboolean GtkSalFrame::handleKey(GtkWidget* pWidget, GdkEventKey* pEvent)
sal_uInt16 nModCode = GetKeyModCode( pEvent->state );
aModEvt.mnModKeyCode = 0; // emit no MODKEYCHANGE events
- if( pEvent->type == GDK_KEY_PRESS && !m_nKeyModifiers )
- m_bSendModChangeOnRelease = true;
+ if( pEvent->type == GDK_KEY_PRESS && !pThis->m_nKeyModifiers )
+ pThis->m_bSendModChangeOnRelease = true;
else if( pEvent->type == GDK_KEY_RELEASE &&
- m_bSendModChangeOnRelease )
+ pThis->m_bSendModChangeOnRelease )
{
- aModEvt.mnModKeyCode = m_nKeyModifiers;
+ aModEvt.mnModKeyCode = pThis->m_nKeyModifiers;
}
sal_uInt16 nExtModMask = 0;
@@ -3056,37 +3058,37 @@ gboolean GtkSalFrame::handleKey(GtkWidget* pWidget, GdkEventKey* pEvent)
if( pEvent->type == GDK_KEY_RELEASE )
{
nModCode &= ~nModMask;
- m_nKeyModifiers &= ~nExtModMask;
+ pThis->m_nKeyModifiers &= ~nExtModMask;
}
else
{
nModCode |= nModMask;
- m_nKeyModifiers |= nExtModMask;
+ pThis->m_nKeyModifiers |= nExtModMask;
}
aModEvt.mnCode = nModCode;
aModEvt.mnTime = pEvent->time;
- aModEvt.mnModKeyCode = m_nKeyModifiers;
+ aModEvt.mnModKeyCode = pThis->m_nKeyModifiers;
- CallCallback( SALEVENT_KEYMODCHANGE, &aModEvt );
+ pThis->CallCallback( SALEVENT_KEYMODCHANGE, &aModEvt );
}
else
{
- doKeyCallback( pEvent->state,
- pEvent->keyval,
- pEvent->hardware_keycode,
- pEvent->group,
- pEvent->time,
- sal_Unicode(gdk_keyval_to_unicode( pEvent->keyval )),
- (pEvent->type == GDK_KEY_PRESS),
- false );
+ pThis->doKeyCallback( pEvent->state,
+ pEvent->keyval,
+ pEvent->hardware_keycode,
+ pEvent->group,
+ pEvent->time,
+ sal_Unicode(gdk_keyval_to_unicode( pEvent->keyval )),
+ (pEvent->type == GDK_KEY_PRESS),
+ false );
if( ! aDel.isDeleted() )
- m_bSendModChangeOnRelease = false;
+ pThis->m_bSendModChangeOnRelease = false;
}
- if( !aDel.isDeleted() && m_pIMHandler )
- m_pIMHandler->updateIMSpotLocation();
+ if( !aDel.isDeleted() && pThis->m_pIMHandler )
+ pThis->m_pIMHandler->updateIMSpotLocation();
return false;
}