summaryrefslogtreecommitdiffstats
path: root/opensuse/tdelibs/fix-qxembed.diff
diff options
context:
space:
mode:
Diffstat (limited to 'opensuse/tdelibs/fix-qxembed.diff')
-rw-r--r--opensuse/tdelibs/fix-qxembed.diff80
1 files changed, 80 insertions, 0 deletions
diff --git a/opensuse/tdelibs/fix-qxembed.diff b/opensuse/tdelibs/fix-qxembed.diff
new file mode 100644
index 000000000..8ea18d69d
--- /dev/null
+++ b/opensuse/tdelibs/fix-qxembed.diff
@@ -0,0 +1,80 @@
+Index: kdeui/qxembed.h
+===================================================================
+--- kdeui/qxembed.h.orig
++++ kdeui/qxembed.h
+@@ -191,6 +191,11 @@ public:
+ void enterWhatsThisMode(); // temporary, fix in Qt (Matthias, Mon Jul 17 15:20:55 CEST 2000 )
+ virtual void reparent( QWidget * parent, WFlags f, const QPoint & p, bool showIt = false );
+
++ /**
++ * @internal
++ */
++ void updateEmbeddedFocus( bool hasfocus );
++
+ signals:
+ /**
+ * This signal is emitted when the embedded window has been lost (destroyed or reparented away)
+Index: kdeui/qxembed.cpp
+===================================================================
+--- kdeui/qxembed.cpp.orig
++++ kdeui/qxembed.cpp
+@@ -314,8 +314,8 @@ bool QXEmbedAppFilter::eventFilter( QObj
+ if ( qApp->focusWidget() == o &&
+ ((QPublicWidget*)qApp->focusWidget()->topLevelWidget())->topData()->embedded ) {
+ QFocusEvent* fe = (QFocusEvent*) e;
+- if ( obeyFocus || fe->reason() == QFocusEvent::Mouse ||
+- fe->reason() == QFocusEvent::Shortcut ) {
++ if ( obeyFocus || fe->reason() != QFocusEvent::ActiveWindow /*|| fe->reason() == QFocusEvent::Mouse ||
++ fe->reason() == QFocusEvent::Shortcut*/ ) {
+ // L0614: A widget in the embedded client was just given the Qt focus.
+ // Variable `obeyFocus' suggests that this is the result of mouse
+ // activity in the client. The XEMBED_REQUEST_FOCUS message causes
+@@ -478,8 +478,11 @@ static int qxembed_x11_event_filter( XEv
+ switch ( detail ) {
+ case XEMBED_FOCUS_CURRENT:
+ // L0683: Set focus on saved focus widget
+- if ( focusCurrent )
++ if ( focusCurrent ) {
+ focusCurrent->setFocus();
++ if( QXEmbed* emb = dynamic_cast< QXEmbed* >( focusCurrent ))
++ emb->updateEmbeddedFocus( true );
++ }
+ else if ( !w->topLevelWidget()->focusWidget() )
+ w->topLevelWidget()->setFocus();
+ break;
+@@ -511,6 +514,8 @@ static int qxembed_x11_event_filter( XEv
+ // We first record what the focus widget was
+ // and clear the Qt focus.
+ if ( w->topLevelWidget()->focusWidget() ) {
++ if( QXEmbed* emb = dynamic_cast< QXEmbed* >( w->topLevelWidget()->focusWidget()))
++ emb->updateEmbeddedFocus( false );
+ focusMap->insert( w->topLevelWidget(),
+ new QGuardedPtr<QWidget>(w->topLevelWidget()->focusWidget() ) );
+ w->topLevelWidget()->focusWidget()->clearFocus();
+@@ -919,6 +924,17 @@ void QXEmbed::focusOutEvent( QFocusEvent
+ }
+
+
++// When QXEmbed has Qt focus and gets/loses X focus, make sure the client knows
++// about the state of the focus.
++void QXEmbed::updateEmbeddedFocus( bool hasfocus ){
++ if (!window || d->xplain)
++ return;
++ if( hasfocus )
++ sendXEmbedMessage( window, XEMBED_FOCUS_IN, XEMBED_FOCUS_CURRENT);
++ else
++ sendXEmbedMessage( window, XEMBED_FOCUS_OUT);
++}
++
+ // L1600: Helper for QXEmbed::embed()
+ // Check whether a window is in withdrawn state.
+ static bool wstate_withdrawn( WId winid )
+@@ -1161,6 +1177,8 @@ bool QXEmbed::x11Event( XEvent* e)
+ // L2085: The client asks for the focus.
+ case XEMBED_REQUEST_FOCUS:
+ if( ((QPublicWidget*)topLevelWidget())->topData()->embedded ) {
++ focusMap->remove( topLevelWidget() );
++ focusMap->insert( topLevelWidget(), new QGuardedPtr<QWidget>( this ));
+ WId window = ((QPublicWidget*)topLevelWidget())->topData()->parentWinId;
+ sendXEmbedMessage( window, XEMBED_REQUEST_FOCUS );
+ } else {