[rkward-cvs] SF.net SVN: rkward: [2052] branches/KDE4_port/rkward/windows

tfry at users.sourceforge.net tfry at users.sourceforge.net
Sun Oct 14 13:48:19 UTC 2007


Revision: 2052
          http://rkward.svn.sourceforge.net/rkward/?rev=2052&view=rev
Author:   tfry
Date:     2007-10-14 06:48:17 -0700 (Sun, 14 Oct 2007)

Log Message:
-----------
Remove qxembedcopy. We'll use QX11EmbedContainer, instead

Modified Paths:
--------------
    branches/KDE4_port/rkward/windows/CMakeLists.txt

Removed Paths:
-------------
    branches/KDE4_port/rkward/windows/qxembedcopy.cpp
    branches/KDE4_port/rkward/windows/qxembedcopy.h

Modified: branches/KDE4_port/rkward/windows/CMakeLists.txt
===================================================================
--- branches/KDE4_port/rkward/windows/CMakeLists.txt	2007-10-14 13:43:34 UTC (rev 2051)
+++ branches/KDE4_port/rkward/windows/CMakeLists.txt	2007-10-14 13:48:17 UTC (rev 2052)
@@ -12,7 +12,6 @@
 	rkmdiwindow.cpp
 	rkworkplaceview.cpp
 	rkworkplace.cpp
-	qxembedcopy.cpp
 	rkwindowcatcher.cpp
 	rkcommandlog.cpp
 	rkhelpsearchwindow.cpp

Deleted: branches/KDE4_port/rkward/windows/qxembedcopy.cpp
===================================================================
--- branches/KDE4_port/rkward/windows/qxembedcopy.cpp	2007-10-14 13:43:34 UTC (rev 2051)
+++ branches/KDE4_port/rkward/windows/qxembedcopy.cpp	2007-10-14 13:48:17 UTC (rev 2052)
@@ -1,1379 +0,0 @@
-/****************************************************************************
-    Implementation of QXEmbedCopy class
-
-    Copyright (C) 1999-2002 Trolltech AS
-
-    This library is free software; you can redistribute it and/or
-    modify it under the terms of the GNU Library General Public
-    License as published by the Free Software Foundation; either
-    version 2 of the License, or (at your option) any later version.
-
-    This library is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-    Library General Public License for more details.
-
-    You should have received a copy of the GNU Library General Public License
-    along with this library; see the file COPYING.LIB.  If not, write to
-    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-    Boston, MA 02110-1301, USA.
-*****************************************************************************/
-
-
-// L-000: About comments marked with Lxxxx.
-// 
-//    These comments represent an attempt to provide a more adequate
-//    documentation to KDE developpers willing to modify QXEmbedCopy.  Keep in
-//    mind that these comments were written long after most of the code.
-//    Please improve them if you spot something wrong or missing 
-//    (Leon Bottou, 26-10-2003).
-//
-//    Relevant documents:
-//    - QXEmbedCopy developper documentation
-//        (see comments in qxembed.h)
-//    - Xlib Reference Manual  
-//        (sections about focus, reparenting, window management)
-//    - ICCCM Manual
-//        (window management)
-//    - XEMBED specification 
-//        (http://www.freedesktop.org/Standards/xembed-spec)
-//    - XPLAIN and XEMBED.
-//        <http://lists.kde.org/?w=2&r=1&s=qxembed+variants&q=t>
-//    - Accumulated community knowledge.
-//        <http://lists.kde.org/?w=2&r=1&s=qxembed&q=t>
-//        <http://lists.kde.org/?l=kde-devel&w=2&r=1&s=qxembed&q=b>
-//        <http://lists.kde.org/?l=kfm-devel&w=2&r=1&s=qxembed&q=b>
-// 
-
-
-#include <qapplication.h>
-#include <q3ptrlist.h>
-#include <q3ptrdict.h>
-#include <qpointer.h>
-#include <q3whatsthis.h>
-#include <qfocusdata.h>
-//Added by qt3to4:
-#include <QKeyEvent>
-#include <Q3CString>
-#include <QResizeEvent>
-#include <QFocusEvent>
-#include <QEvent>
-#include <QShowEvent>
-
-// L0001: QXEmbedCopy works only under X windows.
-#ifdef Q_WS_X11
-
-# include <X11/X.h>
-# include <X11/Xlib.h>
-# include <X11/Xutil.h>
-# include <X11/Xatom.h>
-# define XK_MISCELLANY
-# define XK_LATIN1
-# include <X11/keysymdef.h>
-# include <kdebug.h>
-# include <kxerrorhandler.h>
-
-// L0002: Is file config.h KDE specific?
-//# include <config.h>
-# ifdef HAVE_UNISTD_H
-#  include <unistd.h>
-#  ifdef HAVE_USLEEP
-#   define USLEEP(x) usleep(x)
-#  else
-#   define USLEEP(x) sleep(0)
-#  endif
-# else
-#  define USLEEP(x) sleep(0)
-# endif
-
-# include "qxembedcopy.h"
-
-// L0003: This keysym is used for focus navigation.
-# ifndef XK_ISO_Left_Tab
-#  define XK_ISO_Left_Tab 0xFE20
-# endif
-
-// L0004: Conflicts between X11 and Qt definitions.
-const int XFocusOut = FocusOut;
-const int XFocusIn = FocusIn;
-const int XKeyPress = KeyPress;
-const int XKeyRelease = KeyRelease;
-# undef KeyRelease
-# undef KeyPress
-# undef FocusOut
-# undef FocusIn
-
-// L0005: Variables defined in qapplication_x11.cpp
-extern Atom qt_wm_protocols;
-extern Atom qt_wm_delete_window;
-extern Atom qt_wm_take_focus;
-extern Atom qt_wm_state;
-extern Time qt_x_time;
-
-// L0006: X11 atoms private to QXEmbedCopy
-static Atom xembed = 0;
-static Atom context_help = 0;
-
-// L0007: Xembed message codes (see XEmbed spec)
-#define XEMBED_EMBEDDED_NOTIFY          0
-#define XEMBED_WINDOW_ACTIVATE          1
-#define XEMBED_WINDOW_DEACTIVATE        2
-#define XEMBED_REQUEST_FOCUS            3
-#define XEMBED_FOCUS_IN                 4
-#define XEMBED_FOCUS_OUT                5
-#define XEMBED_FOCUS_NEXT               6
-#define XEMBED_FOCUS_PREV               7
-
-// L0008: Xembed message details (see XEmbed spec)
-// -- XEMBED_FOCUS_IN:
-#define XEMBED_FOCUS_CURRENT            0
-#define XEMBED_FOCUS_FIRST              1
-#define XEMBED_FOCUS_LAST               2
-
-
-// L0100: Private data held by the QXEmbedCopy object.
-//        This belongs to the embedder side.
-class QXEmbedCopyData
-{
-public:
-    QXEmbedCopyData(){ 
-        autoDelete = true;
-        xplain = false;
-        xgrab = false;
-        mapAfterRelease = false;
-        lastPos = QPoint(0,0);
-    }
-    ~QXEmbedCopyData(){};
-
-    bool autoDelete;      // L0101: See L2600
-    bool xplain;          // L0102: See L1100
-    bool xgrab;           // L0103: See L2800
-    bool mapAfterRelease;
-    QWidget* focusProxy;  // L0104: See XEmbed spec
-    QPoint lastPos;       // L0105: See L1390
-};
-
-namespace
-{
-    // L0200: This application wide event filter handles focus
-    //        issues in the embedded client.
-    class QXEmbedCopyAppFilter : public QObject
-    {
-    public:
-        QXEmbedCopyAppFilter()  { qApp->installEventFilter( this ); } 
-        ~QXEmbedCopyAppFilter() { };
-        bool eventFilter( QObject *, QEvent * );
-    };
-}
-
-// L0201: See L0200, L0740
-static QXEmbedCopyAppFilter* filter = 0;
-// L0202: See L0610, L0730
-static Q3PtrDict<QPointer<QWidget> > *focusMap = 0;
-// L0203: See L0660, L1400, L1450
-static XKeyEvent last_key_event;
-
-// L0300: This class gives access protected members of class QWidget.
-//        Function focusData() is useful to reimplement tab focus management
-//        (L0620) Function topData() returns a structure QTLWExtra containing
-//        information unique to toplevel windows.  This structure contains two
-//        members for the sole use of QXEmbedCopy. Flag `embedded' indicates whether
-//        the toplevel window is embedded using the XEMBED protocol (L0680). 
-//        Handle `parentWinId' then records the id of the embedding window.
-
-class QPublicWidget : public QWidget
-{
-public:
-    QTLWExtra* topData() { return QWidget::topData(); }
-    QFocusData *focusData(){ return QWidget::focusData(); }
-    bool focusNextPrev(bool b) { return focusNextPrevChild(b); }
-};
-
-// L0400: This sets a very low level filter for X11 messages.
-//        See qapplication_x11.cpp
-typedef int (*QX11EventFilter) (XEvent*);
-extern QX11EventFilter qt_set_x11_event_filter (QX11EventFilter filter);
-static QX11EventFilter oldFilter = 0;
-
-
-// L0500: Helper to send XEmbed messages.
-static void sendXEmbedMessage( WId window, long message, long detail = 0,
-                               long data1 = 0, long data2 = 0)
-{
-    if (!window) return;
-    XEvent ev;
-    memset(&ev, 0, sizeof(ev));
-    ev.xclient.type = ClientMessage;
-    ev.xclient.window = window;
-    ev.xclient.message_type = xembed;
-    ev.xclient.format = 32;
-    ev.xclient.data.l[0] = qt_x_time;
-    ev.xclient.data.l[1] = message;
-    ev.xclient.data.l[2] = detail;
-    ev.xclient.data.l[3] = data1;
-    ev.xclient.data.l[4] = data2;
-    XSendEvent(qt_xdisplay(), window, false, NoEventMask, &ev);
-}
-
-// L0501: Helper to send ICCCM Client messages. 
-//        See X11 ICCCM Specification.
-static void sendClientMessage(Window window, Atom a, long x)
-{
-  if (!window) return;
-  XEvent ev;
-  memset(&ev, 0, sizeof(ev));
-  ev.xclient.type = ClientMessage;
-  ev.xclient.window = window;
-  ev.xclient.message_type = a;
-  ev.xclient.format = 32;
-  ev.xclient.data.l[0] = x;
-  ev.xclient.data.l[1] = qt_x_time;
-  XSendEvent(qt_xdisplay(), window, false, NoEventMask, &ev);
-}
-
-// L0502: Helper to send fake X11 focus messages.
-//        See X11 Reference Manual and Window Management stuff.
-static void sendFocusMessage(Window window, int type, int mode, int detail)
-{
-  if (!window) return;
-  XEvent ev;
-  memset(&ev, 0, sizeof(ev));
-  ev.xfocus.type = type;
-  ev.xfocus.window = window;
-  ev.xfocus.mode = mode;
-  ev.xfocus.detail = detail;
-  XSendEvent(qt_xdisplay(), window, false, FocusChangeMask, &ev);
-}
-
-
-// ------------------------------------------------------------
-// L0600: MOST OF WHAT FOLLOWS CONCERNS THE CLIENT SIDE.
-//        The following code mostly executes inside a Qt application swallowed
-//        by QXEmbedCopy widget.  It mostly consists of event filters that fight
-//        the normal Qt mechanisms in order to implement the XEMBED protocol.
-//        All this would be a lot simpler if it was implemented by Qt itself.
-
-
-
-// L0610: This event filter receives all Qt events.  Its main purpose is to
-//        capture the Qt focus events in the embedded client in order to
-//        implement the XEMBED protocol. 
-//
-//        Let's start with a few reminders:
-//
-//        - X11 only has the concept of the "X11 focus window".  This window
-//          basically receives all key events.  The ICCCM conventions define
-//          how the window manager and the applications must cooperate to
-//          choose the X11 focus window.
-//
-//        - Most toolkits, including Qt, maintain the concepts of 'active
-//          widget' and 'Qt focus widget'.  A toplevel widget is active when
-//          the X11 focus is set to one of its children.  By extension a
-//          widget is active when its toplevel widget is active.  There is one
-//          Qt focus widget for each toplevel widget.  When the toplevel
-//          widget is active, all key events are sent to the Qt focus widget,
-//          regardless of which descendant of the toplevel window has the X11
-//          focus.  Widgets can adjust their appearance according to both 
-//          their activation and focus states.  The Qt FocusIn and FocusOut 
-//          events indicate when a widget simultaneously is active and has
-//          the Qt focus. 
-//
-//        The XEMBED protocol defines ways to communicate abouth both
-//        activation and focus. The embedded client is active as soon as the
-//        embedding window is active (L0676, L0677).  A widget in the embedded
-//        client receives key events when (1) it has the Qt focus in the
-//        embedded application, and (2) the QXEmbedCopy widget in the embedding
-//        application is active and has the Qt focus.  The Qt library in the
-//        embedded application is unaware of the focus status of the QXEmbedCopy
-//        widget.  We must make sure it does the right thing regarding the
-//        sending of focus events and the visual appearance of the focussed 
-//        widgets.  When the QXEmbedCopy widget looses the Qt focus, we clear the 
-//        focus in the embedded client (L1570, L0688). Conversely, when
-//        the QXEmbedCopy widget gains the Qt focus, we restore the Qt focus 
-//        window in the embedded client (L1530, L0680, L0683). 
-//        Variable focusMap is used to remember which was the Qt focus
-//        widget in the embedded application.  All this would be a lot
-//        simpler if it was implemented inside Qt...
-//
-//        The XPLAIN protocol is much less refined in this respect.
-//        The activation status of the embedded client simply reflect
-//        the focus status of the QXEmbedCopy widget. This is achieved
-//        by sending fake X11 focus message to the client (L1521, L1561).
-//        A passive button grab (L2800) intercepts mouse activity in the
-//        embedded client and sets the Qt focus to the QXEmbedCopy widget
-//        when this happens (L2060).  This can be achieved without
-//        cooperation from the client.
-
-bool QXEmbedCopyAppFilter::eventFilter( QObject *o, QEvent * e)
-{
-    static bool obeyFocus = false;
-    switch ( e->type() ) {
-    case QEvent::MouseButtonPress:
-        // L0612: This will become clear with L0614
-        if ( !((QWidget*)o)->isActiveWindow() )
-            obeyFocus = true;
-        break;
-    case QEvent::FocusIn:
-        // L0613: FocusIn events either occur because the widget already was
-        //        active and has just been given the Qt focus (L0614) or
-        //        because the widget already had the Qt focus and just became
-        //        active (L0615).
-        if ( qApp->focusWidget() == o &&
-             ((QPublicWidget*)qApp->focusWidget()->topLevelWidget())->topData()->embedded ) {
-            QFocusEvent* fe = (QFocusEvent*) e;
-            if ( obeyFocus || 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
-                //        the embedding widget to take the Qt focus (L2085).
-                WId window = ((QPublicWidget*)qApp->focusWidget()->topLevelWidget())->topData()->parentWinId;
-                focusMap->remove( qApp->focusWidget()->topLevelWidget() );
-                sendXEmbedMessage( window, XEMBED_REQUEST_FOCUS );
-            } else if ( fe->reason() == QFocusEvent::ActiveWindow ) {
-                // L0615: Both the embedder and the embedded client became active.
-                //        But we do not know whether the QXEmbedCopy widget has the Qt focus.
-                //        So we clear the Qt focus for now.  If indeed the QXEmbedCopy widget
-                //        has the focus, it will receive a FocusIn message (L1530) and
-                //        tell us to restore the focus (L0680, L0683).
-                focusMap->remove( qApp->focusWidget()->topLevelWidget() );
-                focusMap->insert( qApp->focusWidget()->topLevelWidget(),
-                                  new QPointer<QWidget>(qApp->focusWidget()->topLevelWidget()->focusWidget() ) );
-                // L0616: qApp->focusWidget() might belong to a modal dialog and not be 
-                //        equal to qApp->focusWidget()->topLevelWidget()->focusWidget() !
-                qApp->focusWidget()->clearFocus();
-                // L0617: ??? [why not {obeyFocus=false; return true;} here?]
-            }
-            obeyFocus = false;
-        }
-        break;
-    case QEvent::KeyPress: 
-        if (qApp->focusWidget() == o &&
-            ((QPublicWidget*)qApp->focusWidget()->topLevelWidget())->topData()->embedded ) {
-            // L0620: The following code replaces the Qt code that 
-            //        handles focus focus changes with the tab key. See the
-            //        XEMBED specification for details.  The keypress event
-            //        arrives here after an interesting itinerary. It is first
-            //        saved in the embedding application (L0660). After being
-            //        rejected for tab navigation in the embedding application
-            //        (L1901), it gets forwarded to the embedded client
-            //        (L1400) and arrives here.  Depending on the status of
-            //        the tab chain in the embedded client, focus navigation
-            //        messages are sent back to the embedding application
-            //        (L0653, L0654) which then performs tab navigation
-            //        (L2081).
-            QKeyEvent *k = (QKeyEvent *)e;
-            QWidget *w = qApp->focusWidget();
-            // L0621: The following tests are copied from QWidget::event().
-            bool res = false;
-            bool tabForward = true;
-            if ( !(k->state() & Qt::ControlModifier || k->state() & Qt::AltModifier) ) {
-                if ( k->key() == Qt::Key_Backtab || (k->key() == Qt::Key_Tab && (k->state() & Qt::ShiftModifier)) ) {
-                    QFocusEvent::setReason( QFocusEvent::Backtab );
-                    res = ((QPublicWidget*)w)->focusNextPrev( tabForward = false );
-                    QFocusEvent::resetReason();
-                } else if ( k->key() == Qt::Key_Tab ) {
-                    QFocusEvent::setReason( QFocusEvent::Tab );
-                    res = ((QPublicWidget*)w)->focusNextPrev( tabForward = true );
-                    QFocusEvent::resetReason();
-                }
-            }
-            if (res) {
-                // L0625: We changed the focus because of tab/backtab key
-                //        Now check whether we have been looping around.
-                QFocusData *fd = ((QPublicWidget*)w)->focusData();
-                WId window = ((QPublicWidget*)w->topLevelWidget())->topData()->parentWinId;
-                QWidget *cw = 0;
-                QWidget *fw = fd->home();
-                if (tabForward && window) {
-                    while (cw != w && cw != fw && cw != w->topLevelWidget()) 
-                        cw = fd->prev();
-                    if (cw != w)
-                        sendXEmbedMessage( window, XEMBED_FOCUS_NEXT );
-                } else if (window) {
-                    while (cw != w && cw != fw && cw != w->topLevelWidget()) 
-                        cw = fd->next();
-                    if (cw != w)
-                        sendXEmbedMessage( window, XEMBED_FOCUS_PREV );
-                }
-                // L0628: Qt should no longer process this event.
-                return true;
-            }
-        }
-        break;
-    default:
-        break;
-    }
-    // L0640: Application gets to see the events anyway.
-    return false;
-}
-
-// L0650: This filter receives all XEvents in both the client and the embedder.  
-//        Most of it involves the embedded client (except L0660, L0671).
-static int qxembed_x11_event_filter( XEvent* e)
-{
-    switch ( e->type ) {
-    case XKeyPress:
-    case XKeyRelease: {
-        // L0660: This is for the embedding side (L1450).
-        last_key_event = e->xkey;
-        break;
-    }
-    case ClientMessage:
-        if ( e->xclient.message_type == xembed ) {
-            // L0670: This is where the XEmbed messages are 
-            //        processed on the client side.
-            Time msgtime = (Time) e->xclient.data.l[0];
-            long message = e->xclient.data.l[1];
-            long detail = e->xclient.data.l[2];
-            // L0671: Keep Qt message time up to date
-            if ( msgtime > qt_x_time )
-                qt_x_time = msgtime;
-            QWidget* w = QWidget::find( e->xclient.window );
-            if ( !w )
-                break;
-            switch ( message) {
-            case XEMBED_EMBEDDED_NOTIFY: {
-                // L0675: We just have been embedded into a XEMBED aware widget.
-                QTLWExtra *extra = ((QPublicWidget*)w->topLevelWidget())->topData();
-                extra->embedded = 1;
-                extra->parentWinId = e->xclient.data.l[3];
-                w->topLevelWidget()->show();
-                break;
-            }
-            case XEMBED_WINDOW_ACTIVATE: {
-                // L0676: Embedding window becomes active. Send a fake XFocusIn
-                //        to convince Qt that we are active as well.  Qt will send
-                //        us a focus notification (L0615) that we will intercept to
-                //        ensure that we have no Qt focus widget yet.  The Qt focus
-                //        widget might later be set in L0680.
-                XEvent ev;
-                memset(&ev, 0, sizeof(ev));
-                ev.xfocus.display = qt_xdisplay();
-                ev.xfocus.type = XFocusIn;
-                ev.xfocus.window = w->topLevelWidget()->winId();
-                ev.xfocus.mode = NotifyNormal;
-                ev.xfocus.detail = NotifyAncestor;
-                qApp->x11ProcessEvent( &ev );
-            }
-            break;
-            case XEMBED_WINDOW_DEACTIVATE: {
-                // L0677: Embedding window becomes inactive. Send a fake XFocusOut
-                //        event to convince Qt that we no longer are active.  We will
-                //        receive extra Qt FocusOut events but we do not care.
-                XEvent ev;
-                memset(&ev, 0, sizeof(ev));
-                ev.xfocus.display = qt_xdisplay();
-                ev.xfocus.type = XFocusOut;
-                ev.xfocus.window = w->topLevelWidget()->winId();
-                ev.xfocus.mode = NotifyNormal;
-                ev.xfocus.detail = NotifyAncestor;
-                qApp->x11ProcessEvent( &ev );
-            }
-            break;
-            case XEMBED_FOCUS_IN:
-                // L0680: Embedding application gives us the focus.
-                {
-                    // L0681: Search saved focus widget.
-                    QWidget* focusCurrent = 0;
-                    QPointer<QWidget>* fw = focusMap->find( w->topLevelWidget() );
-                    if ( fw ) {
-                        focusCurrent = *fw;
-                        // L0682: Remove it from the map
-                        focusMap->remove( w->topLevelWidget() );
-                    }
-                    switch ( detail ) {
-                    case XEMBED_FOCUS_CURRENT:
-                        // L0683: Set focus on saved focus widget
-                        if ( focusCurrent )
-                            focusCurrent->setFocus();
-                        else if ( !w->topLevelWidget()->focusWidget() )
-                            w->topLevelWidget()->setFocus();
-                        break;
-                    case XEMBED_FOCUS_FIRST:
-                        {
-                            // L0684: Search first widget in tab chain
-                            QFocusEvent::setReason( QFocusEvent::Tab );
-                            w->topLevelWidget()->setFocus();
-                            ((QPublicWidget*)w->topLevelWidget())->focusNextPrev(true);
-                            QFocusEvent::resetReason();
-                        }
-                        break;
-                    case XEMBED_FOCUS_LAST:
-                        {
-                            // L0686: Search last widget in tab chain
-                            QFocusEvent::setReason( QFocusEvent::Backtab );
-                            w->topLevelWidget()->setFocus();
-                            ((QPublicWidget*)w->topLevelWidget())->focusNextPrev(false);
-                            QFocusEvent::resetReason();
-                        }
-                        break;
-                    default:
-                        break;
-                    }
-                }
-                break;
-            case XEMBED_FOCUS_OUT:
-                // L0688: Embedding application takes the focus away
-                //        We first record what the focus widget was
-                //        and clear the Qt focus.
-                if ( w->topLevelWidget()->focusWidget() ) {
-                    focusMap->insert( w->topLevelWidget(),
-                        new QPointer<QWidget>(w->topLevelWidget()->focusWidget() ) );
-                    w->topLevelWidget()->focusWidget()->clearFocus();
-                }
-            break;
-            default:
-                break;
-            }
-        } else if ( e->xclient.format == 32 && e->xclient.message_type ) {
-            if ( e->xclient.message_type == qt_wm_protocols ) {
-                QWidget* w = QWidget::find( e->xclient.window );
-                if ( !w )
-                    break;
-                // L0690: This is for the embedding side!
-                //        See L0902 for more information about the focus proxy.
-                //        Window manager may send WM_TAKE_FOCUS messages to the 
-                //        embedding application to indicate that it becomes active. 
-                //        But this also suggests that the window manager has
-                //        changed the X11 focus. We want to make sure it goes
-                //        to the focus proxy window eventually.
-                Atom a = e->xclient.data.l[0];
-                if ( a == qt_wm_take_focus ) {
-                    // L0695: update Qt message time variable
-                    if ( (ulong) e->xclient.data.l[1] > qt_x_time )
-                        qt_x_time = e->xclient.data.l[1];
-                    // L0696: There is no problem when the window is not active.
-                    //        Qt will generate a WindowActivate event that will
-                    //        do the job (L1310).  This does not happen if the
-                    //        window is already active.  So we simulate it.
-                    if ( w->isActiveWindow() ) {
-                        QEvent e( QEvent::WindowActivate );
-                        QApplication::sendEvent( w, &e );
-                    }
-                }
-            }
-        }
-        break;
-    default:
-        break;
-    }
-    // L0698: The next x11 filter 
-    if ( oldFilter )
-        return oldFilter( e );
-    // L0699: Otherwise process the event as usual.
-    return false;
-}
-
-
-
-// L0700: Install the xembed filters in both client and embedder sides.
-//        This function is called automatically when using
-//        embedClientIntoWindow() or creating an instance of QXEmbedCopy You may
-//        have to call it manually for a client when using embedder-side
-//        embedding, though.
-void QXEmbedCopy::initialize()
-{
-    static bool is_initialized = false;
-    if ( is_initialized )
-        return;
-
-    // L0710: Atom used by the XEMBED protocol.
-    xembed = XInternAtom( qt_xdisplay(), "_XEMBED", false );
-    // L0720: Install low level filter for X11 events (L0650)
-    oldFilter = qt_set_x11_event_filter( qxembed_x11_event_filter );
-    // L0730: See L0610 for an explanation about focusMap.
-    focusMap = new Q3PtrDict<QPointer<QWidget> >;
-    focusMap->setAutoDelete( true );
-    // L0740: Create client side application wide event filter (L0610)
-    filter = new QXEmbedCopyAppFilter;
-
-    is_initialized = true;
-}
-
-
-
-
-
-// ------------------------------------------------------------
-// L0800: MOST OF WHAT FOLLOWS CONCERNS THE EMBEDDER SIDE.
-//        Things that happen inside a Qt application that contain
-//        a QXEmbedCopy widget for embedding other applications.
-//        This applies to both the XEMBED and XPLAIN protocols.
-//        Deviations are commented below.
-
-
-
-// L0810: Class QXEmbedCopy.
-//        A QXEmbedCopy widget serves as an embedder that can manage one single
-//        embedded X-window. These so-called client windows can be arbitrary
-//        Qt or non Qt applications.  There are two different ways of using
-//        QXEmbedCopy, from the client side or from the embedder's side.
-
-
-// L0900: Constructs a xembed widget.
-QXEmbedCopy::QXEmbedCopy(QWidget *parent, const char *name, Qt::WFlags f)
-  : QWidget(parent, name, f)
-{
-    // L0901: Create private data. See L0100.
-    d = new QXEmbedCopyData;
-    // L0902: Create focus proxy widget. See XEmbed specification.
-    //        Each QXEmbedCopy widget has a focus proxy window. Every single
-    //        QXEmbedCopy widget tries to force its focus proxy window onto the
-    //        whole embedding application. They compete between themselves and
-    //        against Qt (L0690, L0914, L1040, L1310, L1510, L1580). 
-    //        This would be much simpler if implemented within Qt.
-    d->focusProxy = new QWidget( topLevelWidget(), "xembed_focus" );
-    d->focusProxy->setGeometry( -1, -1, 1, 1 );
-    d->focusProxy->show();
-    // make sure it's shown - for XSetInputFocus
-    QApplication::sendPostedEvents( d->focusProxy, 0 );
-    // L0903: Install the client side event filters
-    //        because they also provide services for the embedder side
-    //        See L0660, L0671, L0685.
-    initialize();
-    window = 0;
-    setFocusPolicy(Qt::StrongFocus);
-    setKeyCompression( false );
-
-    // L0910: Trick Qt to create extraData();
-    (void) topData();
-
-    // L0912: We are mostly interested in SubstructureNotify
-    //        This is sent when something happens to the children of
-    //        the X11 window associated with the QXEmbedCopy widget.
-    XSelectInput(qt_xdisplay(), winId(),
-                 KeyPressMask | KeyReleaseMask |
-                 ButtonPressMask | ButtonReleaseMask |
-                 KeymapStateMask |
-                 ButtonMotionMask |
-                 PointerMotionMask | // may need this, too
-                 EnterWindowMask | LeaveWindowMask |
-                 FocusChangeMask |
-                 ExposureMask |
-                 StructureNotifyMask |
-                 SubstructureRedirectMask |
-                 SubstructureNotifyMask
-                 );
-    // L0913: all application events pass through eventFilter().
-    //        This is mostly used to force the X11 focus on the 
-    //        proxy focus window. See L1300.
-    topLevelWidget()->installEventFilter( this );
-    qApp->installEventFilter( this );
-
-    // L0914: Start moving the X11 focus on the focus proxy window.
-    //        See L1581 to know why we do not use isActiveWindow().
-    if ( qApp->activeWindow() == topLevelWidget() )
-        if ( !((QPublicWidget*) topLevelWidget())->topData()->embedded )
-            XSetInputFocus( qt_xdisplay(), d->focusProxy->winId(), 
-                            RevertToParent, qt_x_time );
-    // L0915: ??? [drag&drop?]
-    setAcceptDrops( true );
-}
-
-// L1000: Destructor must dispose of the embedded client window.
-QXEmbedCopy::~QXEmbedCopy()
-{
-    // L1010: Make sure no pointer grab is left.
-    if ( d && d->xgrab)
-        XUngrabButton( qt_xdisplay(), AnyButton, AnyModifier, winId() );
-    if ( window && ( autoDelete() || !d->xplain ))
-        {
-            // L1021: Hide the window and safely reparent it into the root,
-            //        otherwise it would be destroyed by X11 together 
-            //        with this QXEmbedCopy's window.
-#if 0
-// TODO: The proper XEmbed way would be to unmap the window, and the embedded
-// app would detect the embedding has ended, and do whatever it finds appropriate.
-// However, QXEmbedCopy currently doesn't provide support for this detection,
-// so for the time being, it's better to leave the window mapped as toplevel window.
-// This will be ever more complicated with the systray windows, as the simple API
-// for them (KWindowSystem::setSystemTrayWindowFor()) doesn't make it possible to detect
-// themselves they have been released from systray, but KWindowSystem requires them
-// to be visible to allow next Kicker instance to swallow them.
-// See also below the L1022 comment.
-//            XUnmapWindow( qt_xdisplay(), window );
-#else
-            if( autoDelete())
-                XUnmapWindow( qt_xdisplay(), window );
-#endif
-            XReparentWindow(qt_xdisplay(), window, qt_xrootwin(), 0, 0);
-            if( !d->xplain )
-                XRemoveFromSaveSet( qt_xdisplay(), window );
-            if( d->mapAfterRelease )
-                XMapWindow( qt_xdisplay(), window );
-            XSync(qt_xdisplay(), false);
-            // L1022: Send the WM_DELETE_WINDOW message
-            if( autoDelete() /*&& d->xplain*/ ) 
-                // This sendDelete should only apply to XPLAIN.
-                // XEMBED apps are supposed to detect when the embedding ends.
-                // ??? [We do not do this detection yet! 
-                //      So we sendDelete() instead.]
-                sendDelete();
-      }
-    window = 0;
-    // L01040: Our focus proxy window will be destroyed as well.
-    //         Make sure that the X11 focus is not lost in the process.
-    Window focus;
-    int revert;
-    XGetInputFocus( qt_xdisplay(), &focus, &revert );
-    if( focus == d->focusProxy->winId())
-        XSetInputFocus( qt_xdisplay(), topLevelWidget()->winId(), RevertToParent, qt_x_time );
-    // L01045: Delete our private data.
-    delete d;
-}
-
-
-// L1050: Sends a WM_DELETE_WINDOW message to the embedded window.  This is
-//        what typically happens when you click on the close button of a 
-//        window manager decoration.
-void QXEmbedCopy::sendDelete( void )
-{
-  if (window)
-    {
-      sendClientMessage(window, qt_wm_protocols, qt_wm_delete_window);
-      XFlush( qt_xdisplay() );
-    }
-}
-
-// L1100: Sets the protocol used for embedding windows.
-//        This function must be called before embedding a window.
-//        Protocol XEMBED provides maximal functionality (focus, tabs, etc)
-//        but requires explicit cooperation from the embedded window.  
-//        Protocol XPLAIN provides maximal compatibility with 
-//        embedded applications that do not support the XEMBED protocol.
-//        The default is XEMBED.  
-void QXEmbedCopy::setProtocol( Protocol proto )
-{
-    if (!window) {
-        d->xplain = false;
-        if (proto == XPLAIN)
-            d->xplain = true;
-    }
-}
-
-// L1150: Returns the protocol used for embedding the current window.
-QXEmbedCopy::Protocol QXEmbedCopy::protocol()
-{
-  if (d->xplain)
-    return XPLAIN;
-  return XEMBED;
-}
-
-
-// L1200: QXEmbedCopy widget size changes: resize embedded window.
-void QXEmbedCopy::resizeEvent(QResizeEvent*)
-{
-    if (window)
-        XResizeWindow(qt_xdisplay(), window, width(), height());
-}
-
-// L1250: QXEmbedCopy widget is shown: make sure embedded window is visible.
-void QXEmbedCopy::showEvent(QShowEvent*)
-{
-    if (window)
-        XMapRaised(qt_xdisplay(), window);
-}
-
-
-// L1300: This event filter sees all application events (L0913).
-bool QXEmbedCopy::eventFilter( QObject *o, QEvent * e)
-{
-
-    switch ( e->type() ) {
-    case QEvent::WindowActivate:
-        if ( o == topLevelWidget() ) {
-            // L1310: Qt thinks the application window has just been activated.
-            //        Make sure the X11 focus is on the focus proxy window. See L0686.
-            if ( !((QPublicWidget*) topLevelWidget())->topData()->embedded )
-                if (! hasFocus() )
-                    XSetInputFocus( qt_xdisplay(), d->focusProxy->winId(), 
-                                    RevertToParent, qt_x_time );
-            if (d->xplain)
-                // L1311: Activation has changed. Grab state might change. See L2800.
-                checkGrab();
-            else
-                // L1312: Let the client know that we just became active
-                sendXEmbedMessage( window, XEMBED_WINDOW_ACTIVATE );
-        }
-        break;
-    case QEvent::WindowDeactivate:
-        if ( o == topLevelWidget() ) {
-            if (d->xplain)
-                // L1321: Activation has changed. Grab state might change. See L2800.
-                checkGrab();
-            else
-                // L1322: Let the client know that we are no longer active
-                sendXEmbedMessage( window, XEMBED_WINDOW_DEACTIVATE );
-        }
-        break;
-    case QEvent::Move:
-        {
-            QWidget* pos = this;
-            while( pos != o && pos != topLevelWidget())
-                pos = pos->parentWidget();
-            if( pos == o ) {
-                // L1390: Send fake configure notify events whenever the
-                //        global position of the client changes. See L2900.
-                QPoint globalPos = mapToGlobal(QPoint(0,0));
-                if (globalPos != d->lastPos) {
-                    d->lastPos = globalPos;
-                    sendSyntheticConfigureNotifyEvent();
-                }
-            }
-        }                    
-        break;
-    default:
-        break;
-   }
-   return false;
-}
-
-// L1350: ??? [why this?]
-bool  QXEmbedCopy::event( QEvent * e)
-{
-    return QWidget::event( e );
-}
-
-// L1400: Forward keypress event to the client
-//        Receiving a Qt key event indicates that
-//        the QXEmbedCopy object has the Qt focus.
-//        The X11 event that caused the Qt key event
-//        must be forwarded to the client.
-//        See L0660.
-void QXEmbedCopy::keyPressEvent( QKeyEvent *)
-{
-    if (!window)
-        return;
-    last_key_event.window = window;
-    XSendEvent(qt_xdisplay(), window, false, KeyPressMask, (XEvent*)&last_key_event);
-
-}
-
-// L1450: Forward keyrelease event to the client.
-//        See comment L1400.
-void QXEmbedCopy::keyReleaseEvent( QKeyEvent *)
-{
-    if (!window)
-        return;
-    last_key_event.window = window;
-    XSendEvent(qt_xdisplay(), window, false, KeyReleaseMask, (XEvent*)&last_key_event);
-}
-
-// L1500: Handle Qt focus in event.
-void QXEmbedCopy::focusInEvent( QFocusEvent * e ){
-    if (!window)
-        return;
-    // L1510: This is a good time to set the X11 focus on the focus proxy window.
-    //        Except if the the embedding application itself is embedded into another.
-    if ( !((QPublicWidget*) topLevelWidget())->topData()->embedded )
-      if ( qApp->activeWindow() == topLevelWidget() )
-          // L1511: Alter X focus only when window is active. 
-          //        This is dual safety here because FocusIn implies this.
-          //        But see L1581 for an example where this really matters.
-          XSetInputFocus( qt_xdisplay(), d->focusProxy->winId(), 
-                          RevertToParent, qt_x_time );
-    if (d->xplain) {
-        // L1520: Qt focus has changed. Grab state might change. See L2800.
-        checkGrab();
-        // L1521: Window managers activate applications by setting the X11 focus.
-        //        We cannot do this (see L1510) but we can send a fake focus event
-        //        and forward the X11 key events ourselves (see L1400, L1450).
-        sendFocusMessage(window, XFocusIn, NotifyNormal, NotifyPointer );
-    } else {
-        // L1530: No need for fake events with XEMBED.
-        //        Just inform the client. It knows what to do.
-        int detail = XEMBED_FOCUS_CURRENT;
-        // L1531: When the focus change is caused by the tab key,
-        //        the client must select the first (or last) widget of
-        //        its own tab chain.
-        if ( e->reason() == QFocusEvent::Tab )
-            detail = XEMBED_FOCUS_FIRST;
-        else if ( e->reason() == QFocusEvent::Backtab )
-            detail = XEMBED_FOCUS_LAST;
-        sendXEmbedMessage( window, XEMBED_FOCUS_IN, detail);
-    }
-}
-
-// L1550: Handle Qt focus out event.
-void QXEmbedCopy::focusOutEvent( QFocusEvent * ){
-    if (!window)
-        return;
-    if (d->xplain) {
-        // L1560: Qt focus has changed. Grab state might change. See L2800.
-        checkGrab();
-        // L1561: Send fake focus out message. See L1521.
-        sendFocusMessage(window, XFocusOut, NotifyNormal, NotifyPointer );
-    } else {
-        // L1570: Send XEMBED focus out message. See L1531.
-        sendXEmbedMessage( window, XEMBED_FOCUS_OUT );
-    }
-    // L1580: The QXEmbedCopy object might loose the focus because its
-    //        toplevel window looses the X11 focus and is no longer active, 
-    //        or simply because the Qt focus has been moved to another widget.
-    //        In the latter case only, we want to make sure that the X11 focus
-    //        is properly set to the X11 focus widget.  We do this because
-    //        the client application might have moved the X11 focus after
-    //        receiving the fake focus messages.
-    if ( !((QPublicWidget*) topLevelWidget())->topData()->embedded )
-        if ( qApp->activeWindow() == topLevelWidget() )
-            // L1581: Alter X focus only when window is active.
-            //        The test above is not the same as isActiveWindow().
-            //        Function isActiveWindow() also returns true when a modal
-            //        dialog child of this window is active.
-            XSetInputFocus( qt_xdisplay(), d->focusProxy->winId(), 
-                            RevertToParent, qt_x_time );
-}
-
-
-// L1600: Helper for QXEmbedCopy::embed()
-//        Check whether a window is in withdrawn state.
-static bool wstate_withdrawn( WId winid )
-{
-    Atom type;
-    int format;
-    unsigned long length, after;
-    unsigned char *data;
-    int r = XGetWindowProperty( qt_xdisplay(), winid, qt_wm_state, 0, 2,
-                                false, AnyPropertyType, &type, &format,
-                                &length, &after, &data );
-    bool withdrawn = true;
-    // L1610: Non managed windows have no WM_STATE property.
-    //        Returning true ensures that the loop L1711 stops.
-    if ( r == Success && data && format == 32 ) {
-        quint32 *wstate = (quint32*)data;
-        withdrawn  = (*wstate == WithdrawnState );
-        XFree( (char *)data );
-    }
-    return withdrawn;
-}
-
-// L1650: Helper for QXEmbedCopy::embed()
-//        Get the X11 id of the parent window.
-static int get_parent(WId winid, Window *out_parent)
-{
-    Window root, *children=0;
-    unsigned int nchildren;
-    int st = XQueryTree(qt_xdisplay(), winid, &root, out_parent, &children, &nchildren);
-    if (st && children) 
-        XFree(children);
-    return st;
-}
-
-// L1700: Embeds the window w into this QXEmbedCopy widget.
-//        See doc in qxembed.h.
-void QXEmbedCopy::embed(WId w)
-{
-    kDebug() << "*** Embed " << w << " into " << winId() << ". window=" << window << endl;
-    if (!w)
-        return;
-    // L1701: The has_window variable prevents embedding a same window twice.
-    //        ??? [what happens if one embed two windows into the same QXEmbedCopy?]
-    bool has_window =  (w == window);
-    window = w;
-    if ( !has_window ) {
-        KXErrorHandler errhandler; // make X BadWindow errors silent
-        // L1710: Try hard to withdraw the window.
-        //        This makes sure that the window manager will
-        //        no longer try to manage this window.
-        if ( !wstate_withdrawn(window) ) {
-            XWithdrawWindow(qt_xdisplay(), window, qt_xscreen());
-            QApplication::flushX();
-            // L1711: See L1610
-            for (int i=0; i < 100000; ++i) {	// this section changed from original QXEmbed
-                if (wstate_withdrawn(window)) {
-                    Window parent = 0;
-                    get_parent(w, &parent);
-                    if (parent == qt_xrootwin()) break;
-                    else if ((i%500) == 0) qDebug ("not really withdrawn, yet in loop #%d", i);
-                }
-                USLEEP(10);
-            }
-        }
-
-        // L1710: It would be sufficient in principle to reparent
-        //        window w into winId(). Everything else happens in L2020.
-        //        The following code might be useful when the X11 server takes 
-        //        time to create the embedded application main window.
-        Window parent = 0;
-        get_parent(w, &parent);
-        if (parent != qt_xrootwin()) {		// this if added to original QXEmbed
-            kDebug() << QString(" failure to withdraw window") << endl;
-            window = 0;
-            return;
-        }
-        kDebug() << QString("> before reparent: parent=0x%1").arg(parent,0,16) << endl;
-        for (int i = 0; i < 50; i++) {
-            // this is done once more when finishing embedding, but it's done also here
-            // just in case we crash before reaching that place
-            if( !d->xplain )
-                XAddToSaveSet( qt_xdisplay(), w );
-            XReparentWindow(qt_xdisplay(), w, winId(), 0, 0);
-            if (get_parent(w, &parent) && parent == winId()) {
-               kDebug() << QString("> Loop %1: ").arg(i)
-                         << QString("> reparent of 0x%1").arg(w,0,16)
-                         << QString(" into 0x%1").arg(winId(),0,16)
-                         << QString(" successful") << endl;
-                break;
-            }
-            kDebug() << QString("> Loop %1: ").arg(i)
-                      << QString("> reparent of 0x%1").arg(w,0,16)
-                      << QString(" into 0x%1").arg(winId(),0,16)
-                      << QString(" failed") << endl;
-            USLEEP(1000);
-        }
-        if( parent != winId()) // failed
-            window = 0;
-    }
-}
-
-
-// L1800: Returns the window identifier of the embedded window
-WId QXEmbedCopy::embeddedWinId() const
-{
-    return window;
-}
-
-
-// L1900: Control Qt tab focus management.
-//        See Qt documentation.
-bool QXEmbedCopy::focusNextPrevChild( bool next )
-{
-    if ( window )
-        // L1901: Return false when there is an embedded window
-        //        When the user presses TAB, Qt will not change 
-        //        the focus and pass the TAB key events to the QXEmbedCopy widget.
-        //        These key events will be forwarded to the client (L1400, L1450)
-        //        who eventually will manage the tab focus (L0620) and possible
-        //        instruct us to call QWidget::focusNextPrevChild (L2081).
-        return false;
-    else
-        // L1920: Default behavior otherwise.
-        return QWidget::focusNextPrevChild( next );
-}
-
-
-// L2000: Filter for X11 events sent to the QXEmbedCopy window.
-bool QXEmbedCopy::x11Event( XEvent* e)
-{
-    switch ( e->type ) {
-    case DestroyNotify:
-        if ( e->xdestroywindow.window == window ) {
-            // L2005: Client window is being destroyed.
-            window = 0;
-            windowChanged( window );
-            emit embeddedWindowDestroyed();
-        }
-        break;
-    case ReparentNotify:
-        if ( e->xreparent.window == d->focusProxy->winId() )
-            break; // ignore proxy
-        if ( window && e->xreparent.window == window &&
-             e->xreparent.parent != winId() ) {
-            // L2010: We lost the window
-            window = 0;
-            windowChanged( window );
-            emit embeddedWindowDestroyed();
-            // L2011: Remove window from save set
-            //        ??? [not sure it is good to touch this window since
-            //             someone else has taken control of it already.]
-            if( !d->xplain )
-                XRemoveFromSaveSet( qt_xdisplay(), window );
-        } else if ( e->xreparent.parent == winId()){
-            // L2020: We got a window. Complete the embedding process.
-            window = e->xreparent.window;
-            // only XEMBED apps can survive crash,
-            // see http://lists.kde.org/?l=kfm-devel&m=106752026501968&w=2
-            if( !d->xplain )
-                XAddToSaveSet( qt_xdisplay(), window );
-            XResizeWindow(qt_xdisplay(), window, width(), height());
-            XMapRaised(qt_xdisplay(), window);
-            // L2024: see L2900.
-            sendSyntheticConfigureNotifyEvent();
-            // L2025: ??? [any idea about drag&drop?] 
-            extraData()->xDndProxy = window;
-            if ( parent() ) {
-                // L2030: embedded window might have new size requirements.
-                //        see L2500, L2520, L2550.
-                QEvent * layoutHint = new QEvent( QEvent::LayoutRequest );
-                QApplication::postEvent( parent(), layoutHint );
-            }
-            windowChanged( window );
-            if (d->xplain) {
-                // L2040: Activation has changed. Grab state might change. See L2800.
-                checkGrab();
-                if ( hasFocus() )
-                    // L2041: Send fake focus message to inform the client. See L1521.
-                    sendFocusMessage(window, XFocusIn, NotifyNormal, NotifyPointer );
-            } else {
-                // L2050: Send XEMBED messages (see L0670, L1312, L1322, L1530)
-                sendXEmbedMessage( window, XEMBED_EMBEDDED_NOTIFY, 0, (long) winId() );
-                if (isActiveWindow())
-                    sendXEmbedMessage( window, XEMBED_WINDOW_ACTIVATE);
-                else
-                    sendXEmbedMessage( window, XEMBED_WINDOW_DEACTIVATE);
-                if ( hasFocus() )
-                    sendXEmbedMessage( window, XEMBED_FOCUS_IN, XEMBED_FOCUS_CURRENT );
-            }
-        }
-        break;
-    case ButtonPress:
-        if (d->xplain && d->xgrab) {
-            // L2060: The passive grab has intercepted a mouse click
-            //        in the embedded client window. Take the focus.
-            QFocusEvent::setReason( QFocusEvent::Mouse );
-            setFocus();
-            QFocusEvent::resetReason();
-            // L2064: Resume X11 event processing.
-            XAllowEvents(qt_xdisplay(), ReplayPointer, CurrentTime);
-            // L2065: Qt should not know about this.
-            return true;
-        }
-        break;
-    case ButtonRelease:
-        if (d->xplain && d->xgrab) {
-            // L2064: Resume X11 event processing after passive grab (see L2060)
-            XAllowEvents(qt_xdisplay(), SyncPointer, CurrentTime);
-            return true;
-        }
-        break;
-    case MapRequest:
-        // L2070: Behave like a window manager.
-        if ( window && e->xmaprequest.window == window )
-            XMapRaised(qt_xdisplay(), window );
-        break;
-    case ClientMessage:
-        // L2080: This is where the QXEmbedCopy object receives XEMBED 
-        //        messaged from the client application.
-        if ( e->xclient.format == 32 && e->xclient.message_type == xembed ) {
-            long message = e->xclient.data.l[1];
-            switch ( message ) {
-                // L2081: Tab focus management. It is very important to call the 
-                //        focusNextPrevChild() defined by QWidget (not QXEmbedCopy). 
-                //        See L1901.
-            case XEMBED_FOCUS_NEXT:
-                QWidget::focusNextPrevChild( true );
-                break;
-            case XEMBED_FOCUS_PREV:
-                QWidget::focusNextPrevChild( false );
-                break;
-                // L2085: The client asks for the focus.
-            case XEMBED_REQUEST_FOCUS:
-                if( ((QPublicWidget*)topLevelWidget())->topData()->embedded ) {
-                    WId window = ((QPublicWidget*)topLevelWidget())->topData()->parentWinId;
-                    sendXEmbedMessage( window, XEMBED_REQUEST_FOCUS );
-                } else {
-                    QFocusEvent::setReason( QFocusEvent::Mouse );
-                    setFocus();
-                    QFocusEvent::resetReason();
-                }
-                break;
-            default:
-                break;
-            }
-        }
-	break;
-
-    case ConfigureRequest:
-        // L2090: Client wants to change its geometry. 
-        //        Just inform it that nothing has changed.
-        if (e->xconfigurerequest.window == window) 
-        {
-             sendSyntheticConfigureNotifyEvent();
-        }
-        break;
-    case MotionNotify: 
-	// fall through, workaround for Qt 3.0 < 3.0.3
-    case EnterNotify:
-        // L2095: See L2200.
-        if ( Q3WhatsThis::inWhatsThisMode() )
-            enterWhatsThisMode();
-        break;
-    default:
-        break;
-    }
-    return false;
-}
-
-
-// L2200: Try to handle Qt's "what's this" mode.  Broken.
-//        "temporary, fix in Qt (Matthias, Mon Jul 17 15:20:55 CEST 2000"
-void QXEmbedCopy::enterWhatsThisMode()
-{
-    // L2210: When the what-s-this pointer enters the embedded window (L2095)
-    //        cancel what-s-this mode, and use a non stantard _NET_WM_ message
-    //        to instruct the embedded client to enter the "what's this" mode.
-    //        This works only one way...
-    Q3WhatsThis::leaveWhatsThisMode();
-    if ( !context_help )
-        context_help = XInternAtom( x11Display(), "_NET_WM_CONTEXT_HELP", false );
-    sendClientMessage(window , qt_wm_protocols, context_help );
-}
-
-
-// L2300: indicates that the embedded window has been changed.
-void QXEmbedCopy::windowChanged( WId )
-{
-}
-
-
-// L2400: Utility function for clients that embed themselves.
-//        This is client side code.
-bool QXEmbedCopy::processClientCmdline( QWidget* client, int& argc, char ** argv )
-{
-    int myargc = argc;
-    WId window = 0;
-    int i, j;
-
-    j = 1;
-    for ( i=1; i<myargc; i++ ) {
-        if ( argv[i] && *argv[i] != '-' ) {
-            argv[j++] = argv[i];
-            continue;
-        }
-        Q3CString arg = argv[i];
-        if ( !strcmp(arg,"-embed") && i < myargc-1 ) {
-            Q3CString s = argv[++i];
-            window = s.toInt();
-        } else
-            argv[j++] = argv[i];
-    }
-    argc = j;
-
-    if ( window ) {
-        embedClientIntoWindow( client, window );
-        return true;
-    }
-
-    return false;
-}
-
-
-// L2450: Utility function for clients that embed themselves.
-//        This is client side code.
-void QXEmbedCopy::embedClientIntoWindow(QWidget* client, WId window)
-{
-    initialize();
-    XReparentWindow(qt_xdisplay(), client->winId(), window, 0, 0);
-    // L2451: These two lines are redundant. See L0680.
-    ((QXEmbedCopy*)client)->topData()->embedded = true;
-    ((QXEmbedCopy*)client)->topData()->parentWinId = window;
-    // L2452: This seems redundant because L2020 maps the window.
-    //        But calling show() might also set Qt internal flags.
-    client->show();
-}
-
-
-
-// L2500: Specifies that this widget can use additional space,
-//        and that it can survive on less than sizeHint().
-QSizePolicy QXEmbedCopy::sizePolicy() const
-{
-    return QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
-}
-
-
-// L2520: Returns a size sufficient for the embedded window
-QSize QXEmbedCopy::sizeHint() const
-{
-    return minimumSizeHint();
-}
-
-// L2550: Returns the minimum size specified by the embedded window.
-QSize QXEmbedCopy::minimumSizeHint() const
-{
-    int minw = 0;
-    int minh = 0;
-    if ( window ) {
-        XSizeHints size;
-        long msize;
-        if (XGetWMNormalHints(qt_xdisplay(), window, &size, &msize)
-            && ( size.flags & PMinSize) ) {
-            minw = size.min_width;
-            minh = size.min_height;
-        }
-    }
-
-    return QSize( minw, minh );
-}
-
-// L2600: Tells what shoud be done with the embedded window when
-//        the embedding window is destroyed. 
-void QXEmbedCopy::setAutoDelete( bool b)
-{
-    d->autoDelete = b;
-}
-
-// L2650: See L2600.
-bool QXEmbedCopy::autoDelete() const
-{
-    return d->autoDelete;
-}
-
-// L2700: See L2200.
-bool QXEmbedCopy::customWhatsThis() const
-{
-    return true;
-}
-
-// L2800: When using the XPLAIN protocol, this function maintains
-//        a passive button grab when (1) the application is active
-//        and (2) the Qt focus is not on the QXEmbedCopy.  This passive
-//        grab intercepts button clicks in the client window and
-//        give us chance to request the Qt focus (L2060).
-void QXEmbedCopy::checkGrab() 
-{
-    if (d->xplain && isActiveWindow() && !hasFocus()) {
-        if (! d->xgrab)
-            XGrabButton(qt_xdisplay(), AnyButton, AnyModifier, winId(),
-                        false, ButtonPressMask, GrabModeSync, GrabModeAsync,
-                        None, None );
-        d->xgrab = true;
-    } else {
-        if (d->xgrab)
-            XUngrabButton( qt_xdisplay(), AnyButton, AnyModifier, winId() );
-        d->xgrab = false;
-    }
-}
-
-// L2900: This sends fake configure notify events to inform
-//        the client about its window geometry. See L1390, L2024 and L2090.
-void QXEmbedCopy::sendSyntheticConfigureNotifyEvent() 
-{
-    // L2910: It seems that the x and y coordinates are global.
-    //        But this is what ICCCM section 4.1.5 wants.
-    //        See http://lists.kde.org/?l=kfm-devel&m=107090222032378
-    QPoint globalPos = mapToGlobal(QPoint(0,0));
-    if (window) {
-        XConfigureEvent c;
-        memset(&c, 0, sizeof(c));
-        c.type = ConfigureNotify;
-        c.display = qt_xdisplay();
-        c.send_event = True;
-        c.event = window;
-        c.window = window;		// this line changed against the original version of QXEmbed!
-        c.x = globalPos.x();
-        c.y = globalPos.y();
-        c.width = width();
-        c.height = height();
-        c.border_width = 0;
-        c.above = None;
-        c.override_redirect = 0;
-        XSendEvent( qt_xdisplay(), c.event, true, StructureNotifyMask, (XEvent*)&c );
-    }
-}
-
-// L3000: One should not call QWidget::reparent after embedding a window.
-void QXEmbedCopy::reparent( QWidget * parent, Qt::WFlags f, const QPoint & p, bool showIt )
-{
-    // QWidget::reparent() destroys the old X Window for the widget, and
-    // creates a new one, thus QXEmbedCopy after reparenting is no longer the
-    // parent of the embedded window.  I think reparenting of QXEmbedCopy can be
-    // done only by a mistake, so just complain.
-    Q_ASSERT( !window );
-    QWidget::reparent( parent, f, p, showIt );
-}
-
-// for KDE
-#include "qxembedcopy.moc"
-#endif // Q_WS_X11

Deleted: branches/KDE4_port/rkward/windows/qxembedcopy.h
===================================================================
--- branches/KDE4_port/rkward/windows/qxembedcopy.h	2007-10-14 13:43:34 UTC (rev 2051)
+++ branches/KDE4_port/rkward/windows/qxembedcopy.h	2007-10-14 13:48:17 UTC (rev 2052)
@@ -1,239 +0,0 @@
-/****************************************************************************
-    Definition of QXEmbedCopy class
-
-   Copyright (C) 1999-2000 Troll Tech AS
-
-    This library is free software; you can redistribute it and/or
-    modify it under the terms of the GNU Library General Public
-    License as published by the Free Software Foundation; either
-    version 2 of the License, or (at your option) any later version.
-
-    This library is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-    Library General Public License for more details.
-
-    You should have received a copy of the GNU Library General Public License
-    along with this library; see the file COPYING.LIB.  If not, write to
-    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-    Boston, MA 02110-1301, USA.
-*****************************************************************************/
-
-#ifndef QXEMBED_H
-#define QXEMBED_H
-
-#include <qwidget.h>
-//Added by qt3to4:
-#include <QResizeEvent>
-#include <QShowEvent>
-#include <QEvent>
-#include <QKeyEvent>
-#include <QFocusEvent>
-//#include <kdelibs_export.h>		// this line changed against original QXEmbed
-
-#ifdef Q_WS_X11
-
-class QXEmbedCopyData;
-
-/**
- * A QXEmbedCopy widget serves as an embedder that can manage one single embedded
- * X-window. These so-called client windows can be arbitrary Qt or non Qt
- * applications.
- *
- * There are two different ways of using QXEmbedCopy,
- * from the client side or from the embedder's side.
- * 
- * Embedding from the client's side requires that the client knows the
- * window identifier of the respective embedder widget. Use either
- * embedClientIntoWindow() or the high-level wrapper processClientCmdline().
- * This is only possible when the client is a Qt application.
- *
- * When using it from the embedder's side, you must know the window 
- * identifier of the window that should be embedded. Simply call embed() 
- * with this identifier as parameter.  If the client is a Qt application,
- * make sure it has called QXEmbedCopy::initialize(). Otherwise you should
- * probably call setProtocol(XPLAIN) before embed().
- * 
- * Reimplement the change handler windowChanged() to catch embedding or
- * the destruction of embedded windows. In the latter case, the
- * embedder also emits a signal embeddedWindowDestroyed() for
- * convenience.
- *
- * @short The QXEmbedCopy widget is a graphical socket that can embed an external X-Window.
-*/
-class QXEmbedCopy : public QWidget		// this line changed against original QXEmbed
-{
-    Q_OBJECT
-
-public:
-
-    /**
-     *
-     * Constructs a xembed widget.
-     *
-     * The parent, name and f arguments are passed to the QFrame
-     * constructor.
-     */
-    QXEmbedCopy( QWidget *parent=0, const char *name=0, Qt::WFlags f = 0 );
-
-    /**
-     * Destructor. Cleans up the focus if necessary.
-     */
-    ~QXEmbedCopy();
-
-    /**
-     * Embedded applications should call this function to make sure
-     * they support the XEMBED protocol. It is called automatically
-     * when you use embedClientIntoWindow() or
-     * processClientCmdline(). Clients might have to call it
-     * manually when you use embed().
-     */
-    static void initialize();
-
-    enum Protocol { XEMBED, XPLAIN };
-
-    /**
-     * Sets the protocol used for embedding windows.
-     * This function must be called before embedding a window.
-     * Protocol XEMBED provides maximal functionality (focus, tabs, etc)
-     * but requires explicit cooperation from the embedded window.
-     * Protocol XPLAIN provides maximal compatibility with
-     * embedded applications that do not support the XEMBED protocol.
-     * The default is XEMBED.
-     *
-     * Non KDE applications should be embedded with protocol XPLAIN. 
-     * This does not happen automatically yet. 
-     * You must call setProtocol() explicitly.
-     */
-
-    void setProtocol( Protocol proto );
-
-    /**
-     * Returns the protocol used for embedding the current window.
-     *
-     * @return the protocol used by QXEmbedCopy.
-     */
-
-    Protocol protocol();
-
-    /**
-     * Embeds the window with the identifier w into this xembed widget.
-     *
-     * This function is useful if the embedder knows about the client window
-     * that should be embedded.  Often it is vice versa: the client knows
-     * about its target embedder. In that case, it is not necessary to call
-     * embed(). Instead, the client will call the static function
-     * embedClientIntoWindow().
-     *
-     * @param w the identifier of the window to embed
-     * @see embeddedWinId()
-     */
-    void embed( WId w );
-
-    /**
-     * Returns the window identifier of the embedded window, or 0 if no
-     * window is embedded yet.
-     *
-     * @return the id of the embedded window (0 if no window is embedded)
-     */
-    WId embeddedWinId() const;
-
-    /**
-     * A function for clients that embed themselves. The widget
-     * client will be embedded in the window window. The application has
-     * to ensure that window is the handle of the window identifier of
-     * an QXEmbedCopy widget.
-     *
-     * @short #processClientCmdline()
-     */
-    static void embedClientIntoWindow( QWidget* client, WId window );
-
-    /**
-     * A utility function for clients that embed theirselves. The widget
-     * client will be embedded in the window that is passed as
-     * -embed command line argument.
-     *
-     * The function returns true on success or false if no such command line
-     * parameter is specified.
-     *
-     * @see embedClientIntoWindow()
-     */
-    static bool processClientCmdline( QWidget* client, int& argc, char ** argv );
-
-    /** 
-     * Sends a WM_DELETE_WINDOW message to the embedded window.  This is what
-     * typically happens when you click on the close button of a window
-     * manager decoration.  This should cause the embedded application to
-     * cleanly close the window.  Signal embeddedWindowDestroyed() can be used
-     * to monitor the status of the embedded window.
-     */
-    void sendDelete( void );
-    
-    /**
-     * Selects what shoud be done with the embedded window when the embedding
-     * window is destroyed.  When the argument is true, the embedded window is
-     * kept alive, is hidden, and receives a WM_DELETE_WINDOW message using
-     * sendDelete().  This is the default.  Otherwise, the destruction of the
-     * QXEmbedCopy object simply destroys the embedded window.
-     *
-     * @see sendDelete()
-     */
-    void setAutoDelete( bool );
-
-    /**
-     * Returns the value of flag indicating what shoud be done with the
-     * embedded window when the embedding window is destroyed.
-     * 
-     * @see setAutoDelete()
-     */
-    bool autoDelete() const;
-
-    /* Reimp */
-    QSize sizeHint() const;
-    QSize minimumSizeHint() const;
-    QSizePolicy sizePolicy() const;
-    bool eventFilter( QObject *, QEvent * );
-    bool customWhatsThis() const;
-    void enterWhatsThisMode(); // temporary, fix in Qt (Matthias, Mon Jul 17 15:20:55 CEST 2000  )
-    virtual void reparent( QWidget * parent, Qt::WFlags f, const QPoint & p, bool showIt = false );
-
-signals:
-    /**
-     * This signal is emitted when the embedded window has been lost (destroyed or reparented away)
-     *
-     * @see embeddedWinId()
-     */
-    // KDE4 rename to embeddedWindowLost()
-    void embeddedWindowDestroyed();
-
-protected:
-    bool event( QEvent * );
-    void keyPressEvent( QKeyEvent * );
-    void keyReleaseEvent( QKeyEvent * );
-    void focusInEvent( QFocusEvent * );
-    void focusOutEvent( QFocusEvent * );
-    void resizeEvent(QResizeEvent *);
-    void showEvent( QShowEvent * );
-    bool x11Event( XEvent* );
-
-    /**
-     * A change handler that indicates that the embedded window has been
-     * changed.  The window handle can also be retrieved with
-     * embeddedWinId().
-     *
-     * @param w the handle of the window that changed
-     */
-    virtual void windowChanged( WId w );
-
-    bool focusNextPrevChild( bool next );
-
-private:
-    WId window;
-    QXEmbedCopyData* d;
-    void checkGrab();
-    void sendSyntheticConfigureNotifyEvent();
-};
-
-
-#endif
-#endif


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the rkward-tracker mailing list