diff options
author | Caolán McNamara <caolanm@redhat.com> | 2016-05-05 15:17:29 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2016-05-05 15:18:38 +0100 |
commit | 0771f36bf5910a8a8103c6575792ca55cf65d5d4 (patch) | |
tree | e6e78b7944e764b715f402b60578cca1a0a37044 /vcl | |
parent | 82350673eae51abe73b8de81af52b736e9ad5b9e (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.hxx | 1 | ||||
-rw-r--r-- | vcl/unx/gtk3/gtk3gtkframe.cxx | 106 |
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; } |