Sophie

Sophie

distrib > Fedora > 15 > i386 > by-pkgid > 1f9eb832ba1e4b88d9a5c2b384813bb4 > files > 4016

kdelibs3-apidocs-3.5.10-31.fc15.noarch.rpm

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">

<head>
  <title>kdeui: qxembed.cpp Source File (kdeui)</title>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

  <meta http-equiv="Content-Style-Type" content="text/css" />

  <meta http-equiv="pics-label" content='(pics-1.1 "http://www.icra.org/ratingsv02.html" comment "ICRAonline DE v2.0" l gen true for "http://www.kde.org"  r (nz 1 vz 1 lz 1 oz 1 cb 1) "http://www.rsac.org/ratingsv01.html" l gen true for "http://www.kde.org"  r (n 0 s 0 v 0 l 0))' />

  <meta name="trademark" content="KDE e.V." />
  <meta name="description" content="K Desktop Environment Homepage, KDE.org" />
  <meta name="MSSmartTagsPreventParsing" content="true" />
  <meta name="robots" content="all" />

  <link rel="shortcut icon" href="../../favicon.ico" />

<link rel="stylesheet" media="screen" type="text/css" title="APIDOX" href="doxygen.css" />



</head>

<body>

<div id="nav_header_top" align="right">
  <a href="#content" class="doNotDisplay" accesskey="2">Skip to main content ::</a>

  <a href="../.."><img id="nav_header_logo" alt="Home" align="left" src="../../kde_gear_64.png" border="0" /></a>
  <span class="doNotDisplay">::</span>

  <div id="nav_header_title" align="left">KDE API Reference</div>


</div>

<div id="nav_header_bottom" align="right">
  <span class="doNotDisplay">:: <a href="#navigation" accesskey="5">Skip to Link Menu</a><br/></span>
  <div id="nav_header_bottom_right" style="text-align: left;">
/ <a href="../..">API Reference</a>
 / <a href=".">kdeui</a>
  </div>
</div>


<table id="main" border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
      <td valign="top" class="menuheader" height="0"></td>

  <td id="contentcolumn" valign="top" rowspan="2" >
    <div id="content" style="padding-top: 0px;"><div style="width:100%; margin: 0px; padding: 0px;">
    <a name="content"></a>


<!-- Generated by Doxygen 1.7.4 -->
<div class="header">
  <div class="headertitle">
<div class="title">qxembed.cpp</div>  </div>
</div>
<div class="contents">
<div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/****************************************************************************</span>
<a name="l00002"></a>00002 <span class="comment">    Implementation of QXEmbed class</span>
<a name="l00003"></a>00003 <span class="comment"></span>
<a name="l00004"></a>00004 <span class="comment">    Copyright (C) 1999-2002 Trolltech AS</span>
<a name="l00005"></a>00005 <span class="comment"></span>
<a name="l00006"></a>00006 <span class="comment">    This library is free software; you can redistribute it and/or</span>
<a name="l00007"></a>00007 <span class="comment">    modify it under the terms of the GNU Library General Public</span>
<a name="l00008"></a>00008 <span class="comment">    License as published by the Free Software Foundation; either</span>
<a name="l00009"></a>00009 <span class="comment">    version 2 of the License, or (at your option) any later version.</span>
<a name="l00010"></a>00010 <span class="comment"></span>
<a name="l00011"></a>00011 <span class="comment">    This library is distributed in the hope that it will be useful,</span>
<a name="l00012"></a>00012 <span class="comment">    but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<a name="l00013"></a>00013 <span class="comment">    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</span>
<a name="l00014"></a>00014 <span class="comment">    Library General Public License for more details.</span>
<a name="l00015"></a>00015 <span class="comment"></span>
<a name="l00016"></a>00016 <span class="comment">    You should have received a copy of the GNU Library General Public License</span>
<a name="l00017"></a>00017 <span class="comment">    along with this library; see the file COPYING.LIB.  If not, write to</span>
<a name="l00018"></a>00018 <span class="comment">    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,</span>
<a name="l00019"></a>00019 <span class="comment">    Boston, MA 02110-1301, USA.</span>
<a name="l00020"></a>00020 <span class="comment">*****************************************************************************/</span>
<a name="l00021"></a>00021 
<a name="l00022"></a>00022 
<a name="l00023"></a>00023 <span class="comment">// L-000: About comments marked with Lxxxx.</span>
<a name="l00024"></a>00024 <span class="comment">// </span>
<a name="l00025"></a>00025 <span class="comment">//    These comments represent an attempt to provide a more adequate</span>
<a name="l00026"></a>00026 <span class="comment">//    documentation to KDE developpers willing to modify QXEmbed.  Keep in</span>
<a name="l00027"></a>00027 <span class="comment">//    mind that these comments were written long after most of the code.</span>
<a name="l00028"></a>00028 <span class="comment">//    Please improve them if you spot something wrong or missing </span>
<a name="l00029"></a>00029 <span class="comment">//    (Leon Bottou, 26-10-2003).</span>
<a name="l00030"></a>00030 <span class="comment">//</span>
<a name="l00031"></a>00031 <span class="comment">//    Relevant documents:</span>
<a name="l00032"></a>00032 <span class="comment">//    - QXEmbed developper documentation</span>
<a name="l00033"></a>00033 <span class="comment">//        (see comments in qxembed.h)</span>
<a name="l00034"></a>00034 <span class="comment">//    - Xlib Reference Manual  </span>
<a name="l00035"></a>00035 <span class="comment">//        (sections about focus, reparenting, window management)</span>
<a name="l00036"></a>00036 <span class="comment">//    - ICCCM Manual</span>
<a name="l00037"></a>00037 <span class="comment">//        (window management)</span>
<a name="l00038"></a>00038 <span class="comment">//    - XEMBED specification </span>
<a name="l00039"></a>00039 <span class="comment">//        (http://www.freedesktop.org/Standards/xembed-spec)</span>
<a name="l00040"></a>00040 <span class="comment">//    - XPLAIN and XEMBED.</span>
<a name="l00041"></a>00041 <span class="comment">//        &lt;http://lists.kde.org/?w=2&amp;r=1&amp;s=qxembed+variants&amp;q=t&gt;</span>
<a name="l00042"></a>00042 <span class="comment">//    - Accumulated community knowledge.</span>
<a name="l00043"></a>00043 <span class="comment">//        &lt;http://lists.kde.org/?w=2&amp;r=1&amp;s=qxembed&amp;q=t&gt;</span>
<a name="l00044"></a>00044 <span class="comment">//        &lt;http://lists.kde.org/?l=kde-devel&amp;w=2&amp;r=1&amp;s=qxembed&amp;q=b&gt;</span>
<a name="l00045"></a>00045 <span class="comment">//        &lt;http://lists.kde.org/?l=kfm-devel&amp;w=2&amp;r=1&amp;s=qxembed&amp;q=b&gt;</span>
<a name="l00046"></a>00046 <span class="comment">// </span>
<a name="l00047"></a>00047 
<a name="l00048"></a>00048 
<a name="l00049"></a>00049 <span class="preprocessor">#include &lt;qapplication.h&gt;</span>
<a name="l00050"></a>00050 <span class="preprocessor">#include &lt;qptrlist.h&gt;</span>
<a name="l00051"></a>00051 <span class="preprocessor">#include &lt;qptrdict.h&gt;</span>
<a name="l00052"></a>00052 <span class="preprocessor">#include &lt;qguardedptr.h&gt;</span>
<a name="l00053"></a>00053 <span class="preprocessor">#include &lt;qwhatsthis.h&gt;</span>
<a name="l00054"></a>00054 <span class="preprocessor">#include &lt;qfocusdata.h&gt;</span>
<a name="l00055"></a>00055 
<a name="l00056"></a>00056 <span class="comment">// L0001: QXEmbed works only under X windows.</span>
<a name="l00057"></a>00057 <span class="preprocessor">#ifdef Q_WS_X11</span>
<a name="l00058"></a>00058 <span class="preprocessor"></span>
<a name="l00059"></a>00059 <span class="preprocessor"># include &lt;X11/X.h&gt;</span>
<a name="l00060"></a>00060 <span class="preprocessor"># include &lt;X11/Xlib.h&gt;</span>
<a name="l00061"></a>00061 <span class="preprocessor"># include &lt;X11/Xutil.h&gt;</span>
<a name="l00062"></a>00062 <span class="preprocessor"># include &lt;X11/Xatom.h&gt;</span>
<a name="l00063"></a>00063 <span class="preprocessor"># define XK_MISCELLANY</span>
<a name="l00064"></a>00064 <span class="preprocessor"></span><span class="preprocessor"># define XK_LATIN1</span>
<a name="l00065"></a>00065 <span class="preprocessor"></span><span class="preprocessor"># include &lt;X11/keysymdef.h&gt;</span>
<a name="l00066"></a>00066 <span class="preprocessor"># include &lt;kdebug.h&gt;</span>
<a name="l00067"></a>00067 <span class="preprocessor"># include &lt;kxerrorhandler.h&gt;</span>
<a name="l00068"></a>00068 
<a name="l00069"></a>00069 <span class="comment">// L0002: Is file config.h KDE specific?</span>
<a name="l00070"></a>00070 <span class="preprocessor"># include &lt;config.h&gt;</span>
<a name="l00071"></a>00071 <span class="preprocessor"># ifdef HAVE_UNISTD_H</span>
<a name="l00072"></a>00072 <span class="preprocessor"></span><span class="preprocessor">#  include &lt;unistd.h&gt;</span>
<a name="l00073"></a>00073 <span class="preprocessor">#  ifdef HAVE_USLEEP</span>
<a name="l00074"></a>00074 <span class="preprocessor"></span><span class="preprocessor">#   define USLEEP(x) usleep(x)</span>
<a name="l00075"></a>00075 <span class="preprocessor"></span><span class="preprocessor">#  else</span>
<a name="l00076"></a>00076 <span class="preprocessor"></span><span class="preprocessor">#   define USLEEP(x) sleep(0)</span>
<a name="l00077"></a>00077 <span class="preprocessor"></span><span class="preprocessor">#  endif</span>
<a name="l00078"></a>00078 <span class="preprocessor"></span><span class="preprocessor"># else</span>
<a name="l00079"></a>00079 <span class="preprocessor"></span><span class="preprocessor">#  define USLEEP(x) sleep(0)</span>
<a name="l00080"></a>00080 <span class="preprocessor"></span><span class="preprocessor"># endif</span>
<a name="l00081"></a>00081 <span class="preprocessor"></span>
<a name="l00082"></a>00082 <span class="preprocessor"># include &quot;qxembed.h&quot;</span>
<a name="l00083"></a>00083 
<a name="l00084"></a>00084 <span class="comment">// L0003: This keysym is used for focus navigation.</span>
<a name="l00085"></a>00085 <span class="preprocessor"># ifndef XK_ISO_Left_Tab</span>
<a name="l00086"></a>00086 <span class="preprocessor"></span><span class="preprocessor">#  define XK_ISO_Left_Tab 0xFE20</span>
<a name="l00087"></a>00087 <span class="preprocessor"></span><span class="preprocessor"># endif</span>
<a name="l00088"></a>00088 <span class="preprocessor"></span>
<a name="l00089"></a>00089 <span class="comment">// L0004: Conflicts between X11 and Qt definitions.</span>
<a name="l00090"></a>00090 <span class="keyword">const</span> <span class="keywordtype">int</span> XFocusOut = FocusOut;
<a name="l00091"></a>00091 <span class="keyword">const</span> <span class="keywordtype">int</span> XFocusIn = FocusIn;
<a name="l00092"></a>00092 <span class="keyword">const</span> <span class="keywordtype">int</span> XKeyPress = KeyPress;
<a name="l00093"></a>00093 <span class="keyword">const</span> <span class="keywordtype">int</span> XKeyRelease = KeyRelease;
<a name="l00094"></a>00094 <span class="preprocessor"># undef KeyRelease</span>
<a name="l00095"></a>00095 <span class="preprocessor"></span><span class="preprocessor"># undef KeyPress</span>
<a name="l00096"></a>00096 <span class="preprocessor"></span><span class="preprocessor"># undef FocusOut</span>
<a name="l00097"></a>00097 <span class="preprocessor"></span><span class="preprocessor"># undef FocusIn</span>
<a name="l00098"></a>00098 <span class="preprocessor"></span>
<a name="l00099"></a>00099 <span class="comment">// L0005: Variables defined in qapplication_x11.cpp</span>
<a name="l00100"></a>00100 <span class="keyword">extern</span> Atom qt_wm_protocols;
<a name="l00101"></a>00101 <span class="keyword">extern</span> Atom qt_wm_delete_window;
<a name="l00102"></a>00102 <span class="keyword">extern</span> Atom qt_wm_take_focus;
<a name="l00103"></a>00103 <span class="keyword">extern</span> Atom qt_wm_state;
<a name="l00104"></a>00104 <span class="keyword">extern</span> Time qt_x_time;
<a name="l00105"></a>00105 
<a name="l00106"></a>00106 <span class="comment">// L0006: X11 atoms private to QXEmbed</span>
<a name="l00107"></a>00107 <span class="keyword">static</span> Atom xembed = 0;
<a name="l00108"></a>00108 <span class="keyword">static</span> Atom context_help = 0;
<a name="l00109"></a>00109 
<a name="l00110"></a>00110 <span class="comment">// L0007: Xembed message codes (see XEmbed spec)</span>
<a name="l00111"></a>00111 <span class="preprocessor">#define XEMBED_EMBEDDED_NOTIFY          0</span>
<a name="l00112"></a>00112 <span class="preprocessor"></span><span class="preprocessor">#define XEMBED_WINDOW_ACTIVATE          1</span>
<a name="l00113"></a>00113 <span class="preprocessor"></span><span class="preprocessor">#define XEMBED_WINDOW_DEACTIVATE        2</span>
<a name="l00114"></a>00114 <span class="preprocessor"></span><span class="preprocessor">#define XEMBED_REQUEST_FOCUS            3</span>
<a name="l00115"></a>00115 <span class="preprocessor"></span><span class="preprocessor">#define XEMBED_FOCUS_IN                 4</span>
<a name="l00116"></a>00116 <span class="preprocessor"></span><span class="preprocessor">#define XEMBED_FOCUS_OUT                5</span>
<a name="l00117"></a>00117 <span class="preprocessor"></span><span class="preprocessor">#define XEMBED_FOCUS_NEXT               6</span>
<a name="l00118"></a>00118 <span class="preprocessor"></span><span class="preprocessor">#define XEMBED_FOCUS_PREV               7</span>
<a name="l00119"></a>00119 <span class="preprocessor"></span>
<a name="l00120"></a>00120 <span class="comment">// L0008: Xembed message details (see XEmbed spec)</span>
<a name="l00121"></a>00121 <span class="comment">// -- XEMBED_FOCUS_IN:</span>
<a name="l00122"></a>00122 <span class="preprocessor">#define XEMBED_FOCUS_CURRENT            0</span>
<a name="l00123"></a>00123 <span class="preprocessor"></span><span class="preprocessor">#define XEMBED_FOCUS_FIRST              1</span>
<a name="l00124"></a>00124 <span class="preprocessor"></span><span class="preprocessor">#define XEMBED_FOCUS_LAST               2</span>
<a name="l00125"></a>00125 <span class="preprocessor"></span>
<a name="l00126"></a>00126 
<a name="l00127"></a>00127 <span class="comment">// L0100: Private data held by the QXEmbed object.</span>
<a name="l00128"></a>00128 <span class="comment">//        This belongs to the embedder side.</span>
<a name="l00129"></a>00129 <span class="keyword">class </span>QXEmbedData
<a name="l00130"></a>00130 {
<a name="l00131"></a>00131 <span class="keyword">public</span>:
<a name="l00132"></a>00132     QXEmbedData(){ 
<a name="l00133"></a>00133         autoDelete = <span class="keyword">true</span>;
<a name="l00134"></a>00134         xplain = <span class="keyword">false</span>;
<a name="l00135"></a>00135         xgrab = <span class="keyword">false</span>;
<a name="l00136"></a>00136         mapAfterRelease = <span class="keyword">false</span>;
<a name="l00137"></a>00137         lastPos = <a class="codeRef" href="qpoint.html">QPoint</a>(0,0);
<a name="l00138"></a>00138     }
<a name="l00139"></a>00139     ~QXEmbedData(){}
<a name="l00140"></a>00140 
<a name="l00141"></a>00141     <span class="keywordtype">bool</span> autoDelete;      <span class="comment">// L0101: See L2600</span>
<a name="l00142"></a>00142     <span class="keywordtype">bool</span> xplain;          <span class="comment">// L0102: See L1100</span>
<a name="l00143"></a>00143     <span class="keywordtype">bool</span> xgrab;           <span class="comment">// L0103: See L2800</span>
<a name="l00144"></a>00144     <span class="keywordtype">bool</span> mapAfterRelease;
<a name="l00145"></a>00145     <a class="codeRef" href="qwidget.html">QWidget</a>* focusProxy;  <span class="comment">// L0104: See XEmbed spec</span>
<a name="l00146"></a>00146     <a class="codeRef" href="qpoint.html">QPoint</a> lastPos;       <span class="comment">// L0105: See L1390</span>
<a name="l00147"></a>00147 };
<a name="l00148"></a>00148 
<a name="l00149"></a>00149 <span class="keyword">namespace</span>
<a name="l00150"></a>00150 {
<a name="l00151"></a>00151     <span class="comment">// L0200: This application wide event filter handles focus</span>
<a name="l00152"></a>00152     <span class="comment">//        issues in the embedded client.</span>
<a name="l00153"></a>00153     <span class="keyword">class </span>QXEmbedAppFilter : <span class="keyword">public</span> <a class="codeRef" href="qobject.html">QObject</a>
<a name="l00154"></a>00154     {
<a name="l00155"></a>00155     <span class="keyword">public</span>:
<a name="l00156"></a>00156         QXEmbedAppFilter()  { qApp-&gt;<a class="codeRef" href="qobject.html#installEventFilter">installEventFilter</a>( <span class="keyword">this</span> ); } 
<a name="l00157"></a>00157         ~QXEmbedAppFilter() { }
<a name="l00158"></a>00158         <span class="keywordtype">bool</span> <a class="codeRef" href="qobject.html#eventFilter">eventFilter</a>( <a class="codeRef" href="qobject.html">QObject</a> *, <a class="codeRef" href="qevent.html">QEvent</a> * );
<a name="l00159"></a>00159     };
<a name="l00160"></a>00160 }
<a name="l00161"></a>00161 
<a name="l00162"></a>00162 <span class="comment">// L0201: See L0200, L0740</span>
<a name="l00163"></a>00163 <span class="keyword">static</span> QXEmbedAppFilter* filter = 0;
<a name="l00164"></a>00164 <span class="comment">// L0202: See L0610, L0730</span>
<a name="l00165"></a>00165 <span class="keyword">static</span> <a class="codeRef" href="qptrdict.html">QPtrDict&lt;QGuardedPtr&lt;QWidget&gt;</a> &gt; *focusMap = 0;
<a name="l00166"></a>00166 <span class="comment">// L0203: See L0660, L1400, L1450</span>
<a name="l00167"></a>00167 <span class="keyword">static</span> XKeyEvent last_key_event;
<a name="l00168"></a>00168 
<a name="l00169"></a>00169 <span class="comment">// L0300: This class gives access protected members of class QWidget.</span>
<a name="l00170"></a>00170 <span class="comment">//        Function focusData() is useful to reimplement tab focus management</span>
<a name="l00171"></a>00171 <span class="comment">//        (L0620) Function topData() returns a structure QTLWExtra containing</span>
<a name="l00172"></a>00172 <span class="comment">//        information unique to toplevel windows.  This structure contains two</span>
<a name="l00173"></a>00173 <span class="comment">//        members for the sole use of QXEmbed. Flag `embedded&#39; indicates whether</span>
<a name="l00174"></a>00174 <span class="comment">//        the toplevel window is embedded using the XEMBED protocol (L0680). </span>
<a name="l00175"></a>00175 <span class="comment">//        Handle `parentWinId&#39; then records the id of the embedding window.</span>
<a name="l00176"></a>00176 
<a name="l00177"></a>00177 <span class="keyword">class </span>QPublicWidget : <span class="keyword">public</span> <a class="codeRef" href="qwidget.html">QWidget</a>
<a name="l00178"></a>00178 {
<a name="l00179"></a>00179 <span class="keyword">public</span>:
<a name="l00180"></a>00180     QTLWExtra* topData() { <span class="keywordflow">return</span> QWidget::topData(); }
<a name="l00181"></a>00181     <a class="codeRef" href="qfocusdata.html">QFocusData</a> *<a class="codeRef" href="qwidget.html#focusData">focusData</a>(){ <span class="keywordflow">return</span> <a class="codeRef" href="qwidget.html#focusData">QWidget::focusData</a>(); }
<a name="l00182"></a>00182     <span class="keywordtype">bool</span> focusNextPrev(<span class="keywordtype">bool</span> b) { <span class="keywordflow">return</span> <a class="codeRef" href="qwidget.html#focusNextPrevChild">focusNextPrevChild</a>(b); }
<a name="l00183"></a>00183 };
<a name="l00184"></a>00184 
<a name="l00185"></a>00185 <span class="comment">// L0400: This sets a very low level filter for X11 messages.</span>
<a name="l00186"></a>00186 <span class="comment">//        See qapplication_x11.cpp</span>
<a name="l00187"></a>00187 <span class="keyword">typedef</span> int (*QX11EventFilter) (XEvent*);
<a name="l00188"></a>00188 <span class="keyword">extern</span> QX11EventFilter qt_set_x11_event_filter (QX11EventFilter filter);
<a name="l00189"></a>00189 <span class="keyword">static</span> QX11EventFilter oldFilter = 0;
<a name="l00190"></a>00190 
<a name="l00191"></a>00191 
<a name="l00192"></a>00192 <span class="comment">// L0500: Helper to send XEmbed messages.</span>
<a name="l00193"></a>00193 <span class="keyword">static</span> <span class="keywordtype">void</span> sendXEmbedMessage( WId window, <span class="keywordtype">long</span> message, <span class="keywordtype">long</span> detail = 0,
<a name="l00194"></a>00194                                <span class="keywordtype">long</span> data1 = 0, <span class="keywordtype">long</span> data2 = 0)
<a name="l00195"></a>00195 {
<a name="l00196"></a>00196     <span class="keywordflow">if</span> (!window) <span class="keywordflow">return</span>;
<a name="l00197"></a>00197     XEvent ev;
<a name="l00198"></a>00198     memset(&amp;ev, 0, <span class="keyword">sizeof</span>(ev));
<a name="l00199"></a>00199     ev.xclient.type = ClientMessage;
<a name="l00200"></a>00200     ev.xclient.window = window;
<a name="l00201"></a>00201     ev.xclient.message_type = xembed;
<a name="l00202"></a>00202     ev.xclient.format = 32;
<a name="l00203"></a>00203     ev.xclient.data.l[0] = qt_x_time;
<a name="l00204"></a>00204     ev.xclient.data.l[1] = message;
<a name="l00205"></a>00205     ev.xclient.data.l[2] = detail;
<a name="l00206"></a>00206     ev.xclient.data.l[3] = data1;
<a name="l00207"></a>00207     ev.xclient.data.l[4] = data2;
<a name="l00208"></a>00208     XSendEvent(qt_xdisplay(), window, <span class="keyword">false</span>, NoEventMask, &amp;ev);
<a name="l00209"></a>00209 }
<a name="l00210"></a>00210 
<a name="l00211"></a>00211 <span class="comment">// L0501: Helper to send ICCCM Client messages. </span>
<a name="l00212"></a>00212 <span class="comment">//        See X11 ICCCM Specification.</span>
<a name="l00213"></a>00213 <span class="keyword">static</span> <span class="keywordtype">void</span> sendClientMessage(Window window, Atom a, <span class="keywordtype">long</span> x)
<a name="l00214"></a>00214 {
<a name="l00215"></a>00215   <span class="keywordflow">if</span> (!window) <span class="keywordflow">return</span>;
<a name="l00216"></a>00216   XEvent ev;
<a name="l00217"></a>00217   memset(&amp;ev, 0, <span class="keyword">sizeof</span>(ev));
<a name="l00218"></a>00218   ev.xclient.type = ClientMessage;
<a name="l00219"></a>00219   ev.xclient.window = window;
<a name="l00220"></a>00220   ev.xclient.message_type = a;
<a name="l00221"></a>00221   ev.xclient.format = 32;
<a name="l00222"></a>00222   ev.xclient.data.l[0] = x;
<a name="l00223"></a>00223   ev.xclient.data.l[1] = qt_x_time;
<a name="l00224"></a>00224   XSendEvent(qt_xdisplay(), window, <span class="keyword">false</span>, NoEventMask, &amp;ev);
<a name="l00225"></a>00225 }
<a name="l00226"></a>00226 
<a name="l00227"></a>00227 <span class="comment">// L0502: Helper to send fake X11 focus messages.</span>
<a name="l00228"></a>00228 <span class="comment">//        See X11 Reference Manual and Window Management stuff.</span>
<a name="l00229"></a>00229 <span class="keyword">static</span> <span class="keywordtype">void</span> sendFocusMessage(Window window, <span class="keywordtype">int</span> type, <span class="keywordtype">int</span> mode, <span class="keywordtype">int</span> detail)
<a name="l00230"></a>00230 {
<a name="l00231"></a>00231   <span class="keywordflow">if</span> (!window) <span class="keywordflow">return</span>;
<a name="l00232"></a>00232   XEvent ev;
<a name="l00233"></a>00233   memset(&amp;ev, 0, <span class="keyword">sizeof</span>(ev));
<a name="l00234"></a>00234   ev.xfocus.type = type;
<a name="l00235"></a>00235   ev.xfocus.window = window;
<a name="l00236"></a>00236   ev.xfocus.mode = mode;
<a name="l00237"></a>00237   ev.xfocus.detail = detail;
<a name="l00238"></a>00238   XSendEvent(qt_xdisplay(), window, <span class="keyword">false</span>, FocusChangeMask, &amp;ev);
<a name="l00239"></a>00239 }
<a name="l00240"></a>00240 
<a name="l00241"></a>00241 
<a name="l00242"></a>00242 <span class="comment">// ------------------------------------------------------------</span>
<a name="l00243"></a>00243 <span class="comment">// L0600: MOST OF WHAT FOLLOWS CONCERNS THE CLIENT SIDE.</span>
<a name="l00244"></a>00244 <span class="comment">//        The following code mostly executes inside a Qt application swallowed</span>
<a name="l00245"></a>00245 <span class="comment">//        by QXEmbed widget.  It mostly consists of event filters that fight</span>
<a name="l00246"></a>00246 <span class="comment">//        the normal Qt mechanisms in order to implement the XEMBED protocol.</span>
<a name="l00247"></a>00247 <span class="comment">//        All this would be a lot simpler if it was implemented by Qt itself.</span>
<a name="l00248"></a>00248 
<a name="l00249"></a>00249 
<a name="l00250"></a>00250 
<a name="l00251"></a>00251 <span class="comment">// L0610: This event filter receives all Qt events.  Its main purpose is to</span>
<a name="l00252"></a>00252 <span class="comment">//        capture the Qt focus events in the embedded client in order to</span>
<a name="l00253"></a>00253 <span class="comment">//        implement the XEMBED protocol. </span>
<a name="l00254"></a>00254 <span class="comment">//</span>
<a name="l00255"></a>00255 <span class="comment">//        Let&#39;s start with a few reminders:</span>
<a name="l00256"></a>00256 <span class="comment">//</span>
<a name="l00257"></a>00257 <span class="comment">//        - X11 only has the concept of the &quot;X11 focus window&quot;.  This window</span>
<a name="l00258"></a>00258 <span class="comment">//          basically receives all key events.  The ICCCM conventions define</span>
<a name="l00259"></a>00259 <span class="comment">//          how the window manager and the applications must cooperate to</span>
<a name="l00260"></a>00260 <span class="comment">//          choose the X11 focus window.</span>
<a name="l00261"></a>00261 <span class="comment">//</span>
<a name="l00262"></a>00262 <span class="comment">//        - Most toolkits, including Qt, maintain the concepts of &#39;active</span>
<a name="l00263"></a>00263 <span class="comment">//          widget&#39; and &#39;Qt focus widget&#39;.  A toplevel widget is active when</span>
<a name="l00264"></a>00264 <span class="comment">//          the X11 focus is set to one of its children.  By extension a</span>
<a name="l00265"></a>00265 <span class="comment">//          widget is active when its toplevel widget is active.  There is one</span>
<a name="l00266"></a>00266 <span class="comment">//          Qt focus widget for each toplevel widget.  When the toplevel</span>
<a name="l00267"></a>00267 <span class="comment">//          widget is active, all key events are sent to the Qt focus widget,</span>
<a name="l00268"></a>00268 <span class="comment">//          regardless of which descendant of the toplevel window has the X11</span>
<a name="l00269"></a>00269 <span class="comment">//          focus.  Widgets can adjust their appearance according to both </span>
<a name="l00270"></a>00270 <span class="comment">//          their activation and focus states.  The Qt FocusIn and FocusOut </span>
<a name="l00271"></a>00271 <span class="comment">//          events indicate when a widget simultaneously is active and has</span>
<a name="l00272"></a>00272 <span class="comment">//          the Qt focus. </span>
<a name="l00273"></a>00273 <span class="comment">//</span>
<a name="l00274"></a>00274 <span class="comment">//        The XEMBED protocol defines ways to communicate abouth both</span>
<a name="l00275"></a>00275 <span class="comment">//        activation and focus. The embedded client is active as soon as the</span>
<a name="l00276"></a>00276 <span class="comment">//        embedding window is active (L0676, L0677).  A widget in the embedded</span>
<a name="l00277"></a>00277 <span class="comment">//        client receives key events when (1) it has the Qt focus in the</span>
<a name="l00278"></a>00278 <span class="comment">//        embedded application, and (2) the QXEmbed widget in the embedding</span>
<a name="l00279"></a>00279 <span class="comment">//        application is active and has the Qt focus.  The Qt library in the</span>
<a name="l00280"></a>00280 <span class="comment">//        embedded application is unaware of the focus status of the QXEmbed</span>
<a name="l00281"></a>00281 <span class="comment">//        widget.  We must make sure it does the right thing regarding the</span>
<a name="l00282"></a>00282 <span class="comment">//        sending of focus events and the visual appearance of the focussed </span>
<a name="l00283"></a>00283 <span class="comment">//        widgets.  When the QXEmbed widget looses the Qt focus, we clear the </span>
<a name="l00284"></a>00284 <span class="comment">//        focus in the embedded client (L1570, L0688). Conversely, when</span>
<a name="l00285"></a>00285 <span class="comment">//        the QXEmbed widget gains the Qt focus, we restore the Qt focus </span>
<a name="l00286"></a>00286 <span class="comment">//        window in the embedded client (L1530, L0680, L0683). </span>
<a name="l00287"></a>00287 <span class="comment">//        Variable focusMap is used to remember which was the Qt focus</span>
<a name="l00288"></a>00288 <span class="comment">//        widget in the embedded application.  All this would be a lot</span>
<a name="l00289"></a>00289 <span class="comment">//        simpler if it was implemented inside Qt...</span>
<a name="l00290"></a>00290 <span class="comment">//</span>
<a name="l00291"></a>00291 <span class="comment">//        The XPLAIN protocol is much less refined in this respect.</span>
<a name="l00292"></a>00292 <span class="comment">//        The activation status of the embedded client simply reflect</span>
<a name="l00293"></a>00293 <span class="comment">//        the focus status of the QXEmbed widget. This is achieved</span>
<a name="l00294"></a>00294 <span class="comment">//        by sending fake X11 focus message to the client (L1521, L1561).</span>
<a name="l00295"></a>00295 <span class="comment">//        A passive button grab (L2800) intercepts mouse activity in the</span>
<a name="l00296"></a>00296 <span class="comment">//        embedded client and sets the Qt focus to the QXEmbed widget</span>
<a name="l00297"></a>00297 <span class="comment">//        when this happens (L2060).  This can be achieved without</span>
<a name="l00298"></a>00298 <span class="comment">//        cooperation from the client.</span>
<a name="l00299"></a>00299 
<a name="l00300"></a>00300 <span class="keywordtype">bool</span> <a class="codeRef" href="qobject.html#eventFilter">QXEmbedAppFilter::eventFilter</a>( <a class="codeRef" href="qobject.html">QObject</a> *o, <a class="codeRef" href="qevent.html">QEvent</a> * e)
<a name="l00301"></a>00301 {
<a name="l00302"></a>00302     <span class="keyword">static</span> <span class="keywordtype">bool</span> obeyFocus = <span class="keyword">false</span>;
<a name="l00303"></a>00303     <span class="keywordflow">switch</span> ( e-&gt;<a class="codeRef" href="qevent.html#type">type</a>() ) {
<a name="l00304"></a>00304     <span class="keywordflow">case</span> QEvent::MouseButtonPress:
<a name="l00305"></a>00305         <span class="comment">// L0612: This will become clear with L0614</span>
<a name="l00306"></a>00306         <span class="keywordflow">if</span> ( !((<a class="codeRef" href="qwidget.html">QWidget</a>*)o)-&gt;isActiveWindow() )
<a name="l00307"></a>00307             obeyFocus = <span class="keyword">true</span>;
<a name="l00308"></a>00308         <span class="keywordflow">break</span>;
<a name="l00309"></a>00309     <span class="keywordflow">case</span> QEvent::FocusIn:
<a name="l00310"></a>00310         <span class="comment">// L0613: FocusIn events either occur because the widget already was</span>
<a name="l00311"></a>00311         <span class="comment">//        active and has just been given the Qt focus (L0614) or</span>
<a name="l00312"></a>00312         <span class="comment">//        because the widget already had the Qt focus and just became</span>
<a name="l00313"></a>00313         <span class="comment">//        active (L0615).</span>
<a name="l00314"></a>00314         <span class="keywordflow">if</span> ( qApp-&gt;focusWidget() == o &amp;&amp;
<a name="l00315"></a>00315              ((QPublicWidget*)qApp-&gt;focusWidget()-&gt;topLevelWidget())-&gt;topData()-&gt;embedded ) {
<a name="l00316"></a>00316             <a class="codeRef" href="qfocusevent.html">QFocusEvent</a>* fe = (<a class="codeRef" href="qfocusevent.html">QFocusEvent</a>*) e;
<a name="l00317"></a>00317             <span class="keywordflow">if</span> ( obeyFocus || fe-&gt;<a class="codeRef" href="qfocusevent.html#reason">reason</a>() == QFocusEvent::Mouse ||
<a name="l00318"></a>00318                  fe-&gt;<a class="codeRef" href="qfocusevent.html#reason">reason</a>() == QFocusEvent::Shortcut ) {
<a name="l00319"></a>00319                 <span class="comment">// L0614: A widget in the embedded client was just given the Qt focus.</span>
<a name="l00320"></a>00320                 <span class="comment">//        Variable `obeyFocus&#39; suggests that this is the result of mouse</span>
<a name="l00321"></a>00321                 <span class="comment">//        activity in the client.  The XEMBED_REQUEST_FOCUS message causes</span>
<a name="l00322"></a>00322                 <span class="comment">//        the embedding widget to take the Qt focus (L2085).</span>
<a name="l00323"></a>00323                 WId window = ((QPublicWidget*)qApp-&gt;focusWidget()-&gt;topLevelWidget())-&gt;topData()-&gt;parentWinId;
<a name="l00324"></a>00324                 focusMap-&gt;<a class="codeRef" href="qptrdict.html#remove">remove</a>( qApp-&gt;focusWidget()-&gt;topLevelWidget() );
<a name="l00325"></a>00325                 sendXEmbedMessage( window, XEMBED_REQUEST_FOCUS );
<a name="l00326"></a>00326             } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( fe-&gt;<a class="codeRef" href="qfocusevent.html#reason">reason</a>() == QFocusEvent::ActiveWindow ) {
<a name="l00327"></a>00327                 <span class="comment">// L0615: Both the embedder and the embedded client became active.</span>
<a name="l00328"></a>00328                 <span class="comment">//        But we do not know whether the QXEmbed widget has the Qt focus.</span>
<a name="l00329"></a>00329                 <span class="comment">//        So we clear the Qt focus for now.  If indeed the QXEmbed widget</span>
<a name="l00330"></a>00330                 <span class="comment">//        has the focus, it will receive a FocusIn message (L1530) and</span>
<a name="l00331"></a>00331                 <span class="comment">//        tell us to restore the focus (L0680, L0683).</span>
<a name="l00332"></a>00332                 focusMap-&gt;<a class="codeRef" href="qptrdict.html#remove">remove</a>( qApp-&gt;focusWidget()-&gt;topLevelWidget() );
<a name="l00333"></a>00333                 focusMap-&gt;<a class="codeRef" href="qptrdict.html#insert">insert</a>( qApp-&gt;focusWidget()-&gt;topLevelWidget(),
<a name="l00334"></a>00334                                   <span class="keyword">new</span> <a class="codeRef" href="qguardedptr.html">QGuardedPtr&lt;QWidget&gt;</a>(qApp-&gt;focusWidget()-&gt;topLevelWidget()-&gt;focusWidget() ) );
<a name="l00335"></a>00335                 <span class="comment">// L0616: qApp-&gt;focusWidget() might belong to a modal dialog and not be </span>
<a name="l00336"></a>00336                 <span class="comment">//        equal to qApp-&gt;focusWidget()-&gt;topLevelWidget()-&gt;focusWidget() !</span>
<a name="l00337"></a>00337                 qApp-&gt;focusWidget()-&gt;clearFocus();
<a name="l00338"></a>00338                 <span class="comment">// L0617: ??? [why not {obeyFocus=false; return true;} here?]</span>
<a name="l00339"></a>00339             }
<a name="l00340"></a>00340             obeyFocus = <span class="keyword">false</span>;
<a name="l00341"></a>00341         }
<a name="l00342"></a>00342         <span class="keywordflow">break</span>;
<a name="l00343"></a>00343     <span class="keywordflow">case</span> QEvent::KeyPress: 
<a name="l00344"></a>00344         <span class="keywordflow">if</span> (qApp-&gt;focusWidget() == o &amp;&amp;
<a name="l00345"></a>00345             ((QPublicWidget*)qApp-&gt;focusWidget()-&gt;topLevelWidget())-&gt;topData()-&gt;embedded ) {
<a name="l00346"></a>00346             <span class="comment">// L0620: The following code replaces the Qt code that </span>
<a name="l00347"></a>00347             <span class="comment">//        handles focus focus changes with the tab key. See the</span>
<a name="l00348"></a>00348             <span class="comment">//        XEMBED specification for details.  The keypress event</span>
<a name="l00349"></a>00349             <span class="comment">//        arrives here after an interesting itinerary. It is first</span>
<a name="l00350"></a>00350             <span class="comment">//        saved in the embedding application (L0660). After being</span>
<a name="l00351"></a>00351             <span class="comment">//        rejected for tab navigation in the embedding application</span>
<a name="l00352"></a>00352             <span class="comment">//        (L1901), it gets forwarded to the embedded client</span>
<a name="l00353"></a>00353             <span class="comment">//        (L1400) and arrives here.  Depending on the status of</span>
<a name="l00354"></a>00354             <span class="comment">//        the tab chain in the embedded client, focus navigation</span>
<a name="l00355"></a>00355             <span class="comment">//        messages are sent back to the embedding application</span>
<a name="l00356"></a>00356             <span class="comment">//        (L0653, L0654) which then performs tab navigation</span>
<a name="l00357"></a>00357             <span class="comment">//        (L2081).</span>
<a name="l00358"></a>00358             <a class="codeRef" href="qkeyevent.html">QKeyEvent</a> *k = (<a class="codeRef" href="qkeyevent.html">QKeyEvent</a> *)e;
<a name="l00359"></a>00359             <a class="codeRef" href="qwidget.html">QWidget</a> *w = qApp-&gt;<a class="codeRef" href="qwidget.html#focusWidget">focusWidget</a>();
<a name="l00360"></a>00360             <span class="comment">// L0621: The following tests are copied from QWidget::event().</span>
<a name="l00361"></a>00361             <span class="keywordtype">bool</span> res = <span class="keyword">false</span>;
<a name="l00362"></a>00362             <span class="keywordtype">bool</span> tabForward = <span class="keyword">true</span>;
<a name="l00363"></a>00363             <span class="keywordflow">if</span> ( !(k-&gt;<a class="codeRef" href="qkeyevent.html#state">state</a>() &amp; ControlButton || k-&gt;<a class="codeRef" href="qkeyevent.html#state">state</a>() &amp; AltButton) ) {
<a name="l00364"></a>00364                 <span class="keywordflow">if</span> ( k-&gt;<a class="codeRef" href="qkeyevent.html#key">key</a>() == Key_Backtab || (k-&gt;<a class="codeRef" href="qkeyevent.html#key">key</a>() == Key_Tab &amp;&amp; (k-&gt;<a class="codeRef" href="qkeyevent.html#state">state</a>() &amp; ShiftButton)) ) {
<a name="l00365"></a>00365                     <a class="codeRef" href="qfocusevent.html#setReason">QFocusEvent::setReason</a>( QFocusEvent::Backtab );
<a name="l00366"></a>00366                     res = ((QPublicWidget*)w)-&gt;focusNextPrev( tabForward = <span class="keyword">false</span> );
<a name="l00367"></a>00367                     <a class="codeRef" href="qfocusevent.html#resetReason">QFocusEvent::resetReason</a>();
<a name="l00368"></a>00368                 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( k-&gt;<a class="codeRef" href="qkeyevent.html#key">key</a>() == Key_Tab ) {
<a name="l00369"></a>00369                     <a class="codeRef" href="qfocusevent.html#setReason">QFocusEvent::setReason</a>( QFocusEvent::Tab );
<a name="l00370"></a>00370                     res = ((QPublicWidget*)w)-&gt;focusNextPrev( tabForward = <span class="keyword">true</span> );
<a name="l00371"></a>00371                     <a class="codeRef" href="qfocusevent.html#resetReason">QFocusEvent::resetReason</a>();
<a name="l00372"></a>00372                 }
<a name="l00373"></a>00373             }
<a name="l00374"></a>00374             <span class="keywordflow">if</span> (res) {
<a name="l00375"></a>00375                 <span class="comment">// L0625: We changed the focus because of tab/backtab key</span>
<a name="l00376"></a>00376                 <span class="comment">//        Now check whether we have been looping around.</span>
<a name="l00377"></a>00377                 <a class="codeRef" href="qfocusdata.html">QFocusData</a> *fd = ((QPublicWidget*)w)-&gt;focusData();
<a name="l00378"></a>00378                 WId window = ((QPublicWidget*)w-&gt;<a class="codeRef" href="qwidget.html#topLevelWidget">topLevelWidget</a>())-&gt;topData()-&gt;parentWinId;
<a name="l00379"></a>00379                 <a class="codeRef" href="qwidget.html">QWidget</a> *cw = 0;
<a name="l00380"></a>00380                 <a class="codeRef" href="qwidget.html">QWidget</a> *fw = fd-&gt;<a class="codeRef" href="qfocusdata.html#home">home</a>();
<a name="l00381"></a>00381                 <span class="keywordflow">if</span> (tabForward &amp;&amp; window) {
<a name="l00382"></a>00382                     <span class="keywordflow">while</span> (cw != w &amp;&amp; cw != fw &amp;&amp; cw != w-&gt;<a class="codeRef" href="qwidget.html#topLevelWidget">topLevelWidget</a>()) 
<a name="l00383"></a>00383                         cw = fd-&gt;<a class="codeRef" href="qfocusdata.html#prev">prev</a>();
<a name="l00384"></a>00384                     <span class="keywordflow">if</span> (cw != w)
<a name="l00385"></a>00385                         sendXEmbedMessage( window, XEMBED_FOCUS_NEXT );
<a name="l00386"></a>00386                 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (window) {
<a name="l00387"></a>00387                     <span class="keywordflow">while</span> (cw != w &amp;&amp; cw != fw &amp;&amp; cw != w-&gt;<a class="codeRef" href="qwidget.html#topLevelWidget">topLevelWidget</a>()) 
<a name="l00388"></a>00388                         cw = fd-&gt;<a class="codeRef" href="qfocusdata.html#next">next</a>();
<a name="l00389"></a>00389                     <span class="keywordflow">if</span> (cw != w)
<a name="l00390"></a>00390                         sendXEmbedMessage( window, XEMBED_FOCUS_PREV );
<a name="l00391"></a>00391                 }
<a name="l00392"></a>00392                 <span class="comment">// L0628: Qt should no longer process this event.</span>
<a name="l00393"></a>00393                 <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00394"></a>00394             }
<a name="l00395"></a>00395         }
<a name="l00396"></a>00396         <span class="keywordflow">break</span>;
<a name="l00397"></a>00397     <span class="keywordflow">default</span>:
<a name="l00398"></a>00398         <span class="keywordflow">break</span>;
<a name="l00399"></a>00399     }
<a name="l00400"></a>00400     <span class="comment">// L0640: Application gets to see the events anyway.</span>
<a name="l00401"></a>00401     <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00402"></a>00402 }
<a name="l00403"></a>00403 
<a name="l00404"></a>00404 <span class="comment">// L0650: This filter receives all XEvents in both the client and the embedder.  </span>
<a name="l00405"></a>00405 <span class="comment">//        Most of it involves the embedded client (except L0660, L0671).</span>
<a name="l00406"></a>00406 <span class="keyword">static</span> <span class="keywordtype">int</span> qxembed_x11_event_filter( XEvent* e)
<a name="l00407"></a>00407 {
<a name="l00408"></a>00408     <span class="keywordflow">switch</span> ( e-&gt;type ) {
<a name="l00409"></a>00409     <span class="keywordflow">case</span> XKeyPress:
<a name="l00410"></a>00410     <span class="keywordflow">case</span> XKeyRelease: {
<a name="l00411"></a>00411         <span class="comment">// L0660: This is for the embedding side (L1450).</span>
<a name="l00412"></a>00412         last_key_event = e-&gt;xkey;
<a name="l00413"></a>00413         <span class="keywordflow">break</span>;
<a name="l00414"></a>00414     }
<a name="l00415"></a>00415     <span class="keywordflow">case</span> ClientMessage:
<a name="l00416"></a>00416         <span class="keywordflow">if</span> ( e-&gt;xclient.message_type == xembed ) {
<a name="l00417"></a>00417             <span class="comment">// L0670: This is where the XEmbed messages are </span>
<a name="l00418"></a>00418             <span class="comment">//        processed on the client side.</span>
<a name="l00419"></a>00419             Time msgtime = (Time) e-&gt;xclient.data.l[0];
<a name="l00420"></a>00420             <span class="keywordtype">long</span> message = e-&gt;xclient.data.l[1];
<a name="l00421"></a>00421             <span class="keywordtype">long</span> detail = e-&gt;xclient.data.l[2];
<a name="l00422"></a>00422             <span class="comment">// L0671: Keep Qt message time up to date</span>
<a name="l00423"></a>00423             if ( msgtime &gt; qt_x_time )
<a name="l00424"></a>00424                 qt_x_time = msgtime;
<a name="l00425"></a>00425             <a class="codeRef" href="qwidget.html">QWidget</a>* w = <a class="codeRef" href="qwidget.html#find">QWidget::find</a>( e-&gt;xclient.window );
<a name="l00426"></a>00426             <span class="keywordflow">if</span> ( !w )
<a name="l00427"></a>00427                 <span class="keywordflow">break</span>;
<a name="l00428"></a>00428             <span class="keywordflow">switch</span> ( message) {
<a name="l00429"></a>00429             <span class="keywordflow">case</span> XEMBED_EMBEDDED_NOTIFY: {
<a name="l00430"></a>00430                 <span class="comment">// L0675: We just have been embedded into a XEMBED aware widget.</span>
<a name="l00431"></a>00431                 QTLWExtra *extra = ((QPublicWidget*)w-&gt;<a class="codeRef" href="qwidget.html#topLevelWidget">topLevelWidget</a>())-&gt;topData();
<a name="l00432"></a>00432                 extra-&gt;embedded = 1;
<a name="l00433"></a>00433                 extra-&gt;parentWinId = e-&gt;xclient.data.l[3];
<a name="l00434"></a>00434                 w-&gt;<a class="codeRef" href="qwidget.html#topLevelWidget">topLevelWidget</a>()-&gt;show();
<a name="l00435"></a>00435                 <span class="keywordflow">break</span>;
<a name="l00436"></a>00436             }
<a name="l00437"></a>00437             <span class="keywordflow">case</span> XEMBED_WINDOW_ACTIVATE: {
<a name="l00438"></a>00438                 <span class="comment">// L0676: Embedding window becomes active. Send a fake XFocusIn</span>
<a name="l00439"></a>00439                 <span class="comment">//        to convince Qt that we are active as well.  Qt will send</span>
<a name="l00440"></a>00440                 <span class="comment">//        us a focus notification (L0615) that we will intercept to</span>
<a name="l00441"></a>00441                 <span class="comment">//        ensure that we have no Qt focus widget yet.  The Qt focus</span>
<a name="l00442"></a>00442                 <span class="comment">//        widget might later be set in L0680.</span>
<a name="l00443"></a>00443                 XEvent ev;
<a name="l00444"></a>00444                 memset(&amp;ev, 0, <span class="keyword">sizeof</span>(ev));
<a name="l00445"></a>00445                 ev.xfocus.display = qt_xdisplay();
<a name="l00446"></a>00446                 ev.xfocus.type = XFocusIn;
<a name="l00447"></a>00447                 ev.xfocus.window = w-&gt;<a class="codeRef" href="qwidget.html#topLevelWidget">topLevelWidget</a>()-&gt;winId();
<a name="l00448"></a>00448                 ev.xfocus.mode = NotifyNormal;
<a name="l00449"></a>00449                 ev.xfocus.detail = NotifyAncestor;
<a name="l00450"></a>00450                 qApp-&gt;x11ProcessEvent( &amp;ev );
<a name="l00451"></a>00451             }
<a name="l00452"></a>00452             <span class="keywordflow">break</span>;
<a name="l00453"></a>00453             <span class="keywordflow">case</span> XEMBED_WINDOW_DEACTIVATE: {
<a name="l00454"></a>00454                 <span class="comment">// L0677: Embedding window becomes inactive. Send a fake XFocusOut</span>
<a name="l00455"></a>00455                 <span class="comment">//        event to convince Qt that we no longer are active.  We will</span>
<a name="l00456"></a>00456                 <span class="comment">//        receive extra Qt FocusOut events but we do not care.</span>
<a name="l00457"></a>00457                 XEvent ev;
<a name="l00458"></a>00458                 memset(&amp;ev, 0, <span class="keyword">sizeof</span>(ev));
<a name="l00459"></a>00459                 ev.xfocus.display = qt_xdisplay();
<a name="l00460"></a>00460                 ev.xfocus.type = XFocusOut;
<a name="l00461"></a>00461                 ev.xfocus.window = w-&gt;<a class="codeRef" href="qwidget.html#topLevelWidget">topLevelWidget</a>()-&gt;winId();
<a name="l00462"></a>00462                 ev.xfocus.mode = NotifyNormal;
<a name="l00463"></a>00463                 ev.xfocus.detail = NotifyAncestor;
<a name="l00464"></a>00464                 qApp-&gt;x11ProcessEvent( &amp;ev );
<a name="l00465"></a>00465             }
<a name="l00466"></a>00466             <span class="keywordflow">break</span>;
<a name="l00467"></a>00467             <span class="keywordflow">case</span> XEMBED_FOCUS_IN:
<a name="l00468"></a>00468                 <span class="comment">// L0680: Embedding application gives us the focus.</span>
<a name="l00469"></a>00469                 {
<a name="l00470"></a>00470                     <span class="comment">// L0681: Search saved focus widget.</span>
<a name="l00471"></a>00471                     <a class="codeRef" href="qwidget.html">QWidget</a>* focusCurrent = 0;
<a name="l00472"></a>00472                     <a class="codeRef" href="qguardedptr.html">QGuardedPtr&lt;QWidget&gt;</a>* fw = focusMap-&gt;<a class="codeRef" href="qptrdict.html#find">find</a>( w-&gt;<a class="codeRef" href="qwidget.html#topLevelWidget">topLevelWidget</a>() );
<a name="l00473"></a>00473                     <span class="keywordflow">if</span> ( fw ) {
<a name="l00474"></a>00474                         focusCurrent = *fw;
<a name="l00475"></a>00475                         <span class="comment">// L0682: Remove it from the map</span>
<a name="l00476"></a>00476                         focusMap-&gt;<a class="codeRef" href="qptrdict.html#remove">remove</a>( w-&gt;<a class="codeRef" href="qwidget.html#topLevelWidget">topLevelWidget</a>() );
<a name="l00477"></a>00477                     }
<a name="l00478"></a>00478                     <span class="keywordflow">switch</span> ( detail ) {
<a name="l00479"></a>00479                     <span class="keywordflow">case</span> XEMBED_FOCUS_CURRENT:
<a name="l00480"></a>00480                         <span class="comment">// L0683: Set focus on saved focus widget</span>
<a name="l00481"></a>00481                         <span class="keywordflow">if</span> ( focusCurrent )
<a name="l00482"></a>00482                             focusCurrent-&gt;<a class="codeRef" href="qwidget.html#setFocus">setFocus</a>();
<a name="l00483"></a>00483                         <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( !w-&gt;<a class="codeRef" href="qwidget.html#topLevelWidget">topLevelWidget</a>()-&gt;focusWidget() )
<a name="l00484"></a>00484                             w-&gt;<a class="codeRef" href="qwidget.html#topLevelWidget">topLevelWidget</a>()-&gt;setFocus();
<a name="l00485"></a>00485                         <span class="keywordflow">break</span>;
<a name="l00486"></a>00486                     <span class="keywordflow">case</span> XEMBED_FOCUS_FIRST:
<a name="l00487"></a>00487                         {
<a name="l00488"></a>00488                             <span class="comment">// L0684: Search first widget in tab chain</span>
<a name="l00489"></a>00489                             <a class="codeRef" href="qfocusevent.html#setReason">QFocusEvent::setReason</a>( QFocusEvent::Tab );
<a name="l00490"></a>00490                             w-&gt;<a class="codeRef" href="qwidget.html#topLevelWidget">topLevelWidget</a>()-&gt;setFocus();
<a name="l00491"></a>00491                             ((QPublicWidget*)w-&gt;<a class="codeRef" href="qwidget.html#topLevelWidget">topLevelWidget</a>())-&gt;focusNextPrev(<span class="keyword">true</span>);
<a name="l00492"></a>00492                             <a class="codeRef" href="qfocusevent.html#resetReason">QFocusEvent::resetReason</a>();
<a name="l00493"></a>00493                         }
<a name="l00494"></a>00494                         <span class="keywordflow">break</span>;
<a name="l00495"></a>00495                     <span class="keywordflow">case</span> XEMBED_FOCUS_LAST:
<a name="l00496"></a>00496                         {
<a name="l00497"></a>00497                             <span class="comment">// L0686: Search last widget in tab chain</span>
<a name="l00498"></a>00498                             <a class="codeRef" href="qfocusevent.html#setReason">QFocusEvent::setReason</a>( QFocusEvent::Backtab );
<a name="l00499"></a>00499                             w-&gt;<a class="codeRef" href="qwidget.html#topLevelWidget">topLevelWidget</a>()-&gt;setFocus();
<a name="l00500"></a>00500                             ((QPublicWidget*)w-&gt;<a class="codeRef" href="qwidget.html#topLevelWidget">topLevelWidget</a>())-&gt;focusNextPrev(<span class="keyword">false</span>);
<a name="l00501"></a>00501                             <a class="codeRef" href="qfocusevent.html#resetReason">QFocusEvent::resetReason</a>();
<a name="l00502"></a>00502                         }
<a name="l00503"></a>00503                         <span class="keywordflow">break</span>;
<a name="l00504"></a>00504                     <span class="keywordflow">default</span>:
<a name="l00505"></a>00505                         <span class="keywordflow">break</span>;
<a name="l00506"></a>00506                     }
<a name="l00507"></a>00507                 }
<a name="l00508"></a>00508                 <span class="keywordflow">break</span>;
<a name="l00509"></a>00509             <span class="keywordflow">case</span> XEMBED_FOCUS_OUT:
<a name="l00510"></a>00510                 <span class="comment">// L0688: Embedding application takes the focus away</span>
<a name="l00511"></a>00511                 <span class="comment">//        We first record what the focus widget was</span>
<a name="l00512"></a>00512                 <span class="comment">//        and clear the Qt focus.</span>
<a name="l00513"></a>00513                 <span class="keywordflow">if</span> ( w-&gt;<a class="codeRef" href="qwidget.html#topLevelWidget">topLevelWidget</a>()-&gt;focusWidget() ) {
<a name="l00514"></a>00514                     focusMap-&gt;<a class="codeRef" href="qptrdict.html#insert">insert</a>( w-&gt;<a class="codeRef" href="qwidget.html#topLevelWidget">topLevelWidget</a>(),
<a name="l00515"></a>00515                         <span class="keyword">new</span> <a class="codeRef" href="qguardedptr.html">QGuardedPtr&lt;QWidget&gt;</a>(w-&gt;<a class="codeRef" href="qwidget.html#topLevelWidget">topLevelWidget</a>()-&gt;focusWidget() ) );
<a name="l00516"></a>00516                     w-&gt;<a class="codeRef" href="qwidget.html#topLevelWidget">topLevelWidget</a>()-&gt;focusWidget()-&gt;clearFocus();
<a name="l00517"></a>00517                 }
<a name="l00518"></a>00518             <span class="keywordflow">break</span>;
<a name="l00519"></a>00519             <span class="keywordflow">default</span>:
<a name="l00520"></a>00520                 <span class="keywordflow">break</span>;
<a name="l00521"></a>00521             }
<a name="l00522"></a>00522         } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( e-&gt;xclient.format == 32 &amp;&amp; e-&gt;xclient.message_type ) {
<a name="l00523"></a>00523             <span class="keywordflow">if</span> ( e-&gt;xclient.message_type == qt_wm_protocols ) {
<a name="l00524"></a>00524                 <a class="codeRef" href="qwidget.html">QWidget</a>* w = <a class="codeRef" href="qwidget.html#find">QWidget::find</a>( e-&gt;xclient.window );
<a name="l00525"></a>00525                 <span class="keywordflow">if</span> ( !w )
<a name="l00526"></a>00526                     <span class="keywordflow">break</span>;
<a name="l00527"></a>00527                 <span class="comment">// L0690: This is for the embedding side!</span>
<a name="l00528"></a>00528                 <span class="comment">//        See L0902 for more information about the focus proxy.</span>
<a name="l00529"></a>00529                 <span class="comment">//        Window manager may send WM_TAKE_FOCUS messages to the </span>
<a name="l00530"></a>00530                 <span class="comment">//        embedding application to indicate that it becomes active. </span>
<a name="l00531"></a>00531                 <span class="comment">//        But this also suggests that the window manager has</span>
<a name="l00532"></a>00532                 <span class="comment">//        changed the X11 focus. We want to make sure it goes</span>
<a name="l00533"></a>00533                 <span class="comment">//        to the focus proxy window eventually.</span>
<a name="l00534"></a>00534                 Atom a = e-&gt;xclient.data.l[0];
<a name="l00535"></a>00535                 <span class="keywordflow">if</span> ( a == qt_wm_take_focus ) {
<a name="l00536"></a>00536                     <span class="comment">// L0695: update Qt message time variable</span>
<a name="l00537"></a>00537                     <span class="keywordflow">if</span> ( (ulong) e-&gt;xclient.data.l[1] &gt; qt_x_time )
<a name="l00538"></a>00538                         qt_x_time = e-&gt;xclient.data.l[1];
<a name="l00539"></a>00539                     <span class="comment">// L0696: There is no problem when the window is not active.</span>
<a name="l00540"></a>00540                     <span class="comment">//        Qt will generate a WindowActivate event that will</span>
<a name="l00541"></a>00541                     <span class="comment">//        do the job (L1310).  This does not happen if the</span>
<a name="l00542"></a>00542                     <span class="comment">//        window is already active.  So we simulate it.</span>
<a name="l00543"></a>00543                     <span class="keywordflow">if</span> ( w-&gt;<a class="codeRef" href="qwidget.html#isActiveWindow">isActiveWindow</a>() ) {
<a name="l00544"></a>00544                         <a class="codeRef" href="qevent.html">QEvent</a> e( QEvent::WindowActivate );
<a name="l00545"></a>00545                         <a class="codeRef" href="qapplication.html#sendEvent">QApplication::sendEvent</a>( w, &amp;e );
<a name="l00546"></a>00546                     }
<a name="l00547"></a>00547                 }
<a name="l00548"></a>00548             }
<a name="l00549"></a>00549         }
<a name="l00550"></a>00550         <span class="keywordflow">break</span>;
<a name="l00551"></a>00551     <span class="keywordflow">default</span>:
<a name="l00552"></a>00552         <span class="keywordflow">break</span>;
<a name="l00553"></a>00553     }
<a name="l00554"></a>00554     <span class="comment">// L0698: The next x11 filter </span>
<a name="l00555"></a>00555     <span class="keywordflow">if</span> ( oldFilter )
<a name="l00556"></a>00556         <span class="keywordflow">return</span> oldFilter( e );
<a name="l00557"></a>00557     <span class="comment">// L0699: Otherwise process the event as usual.</span>
<a name="l00558"></a>00558     <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00559"></a>00559 }
<a name="l00560"></a>00560 
<a name="l00561"></a>00561 
<a name="l00562"></a>00562 
<a name="l00563"></a>00563 <span class="comment">// L0700: Install the xembed filters in both client and embedder sides.</span>
<a name="l00564"></a>00564 <span class="comment">//        This function is called automatically when using</span>
<a name="l00565"></a>00565 <span class="comment">//        embedClientIntoWindow() or creating an instance of QXEmbed You may</span>
<a name="l00566"></a>00566 <span class="comment">//        have to call it manually for a client when using embedder-side</span>
<a name="l00567"></a>00567 <span class="comment">//        embedding, though.</span>
<a name="l00568"></a>00568 <span class="keywordtype">void</span> QXEmbed::initialize()
<a name="l00569"></a>00569 {
<a name="l00570"></a>00570     <span class="keyword">static</span> <span class="keywordtype">bool</span> is_initialized = <span class="keyword">false</span>;
<a name="l00571"></a>00571     <span class="keywordflow">if</span> ( is_initialized )
<a name="l00572"></a>00572         <span class="keywordflow">return</span>;
<a name="l00573"></a>00573 
<a name="l00574"></a>00574     <span class="comment">// L0710: Atom used by the XEMBED protocol.</span>
<a name="l00575"></a>00575     xembed = XInternAtom( qt_xdisplay(), <span class="stringliteral">&quot;_XEMBED&quot;</span>, <span class="keyword">false</span> );
<a name="l00576"></a>00576     <span class="comment">// L0720: Install low level filter for X11 events (L0650)</span>
<a name="l00577"></a>00577     oldFilter = qt_set_x11_event_filter( qxembed_x11_event_filter );
<a name="l00578"></a>00578     <span class="comment">// L0730: See L0610 for an explanation about focusMap.</span>
<a name="l00579"></a>00579     focusMap = <span class="keyword">new</span> <a class="codeRef" href="qptrdict.html">QPtrDict&lt;QGuardedPtr&lt;QWidget&gt;</a> &gt;;
<a name="l00580"></a>00580     focusMap-&gt;<a class="codeRef" href="qptrdict.html#setAutoDelete">setAutoDelete</a>( <span class="keyword">true</span> );
<a name="l00581"></a>00581     <span class="comment">// L0740: Create client side application wide event filter (L0610)</span>
<a name="l00582"></a>00582     filter = <span class="keyword">new</span> QXEmbedAppFilter;
<a name="l00583"></a>00583 
<a name="l00584"></a>00584     is_initialized = <span class="keyword">true</span>;
<a name="l00585"></a>00585 }
<a name="l00586"></a>00586 
<a name="l00587"></a>00587 
<a name="l00588"></a>00588 
<a name="l00589"></a>00589 
<a name="l00590"></a>00590 
<a name="l00591"></a>00591 <span class="comment">// ------------------------------------------------------------</span>
<a name="l00592"></a>00592 <span class="comment">// L0800: MOST OF WHAT FOLLOWS CONCERNS THE EMBEDDER SIDE.</span>
<a name="l00593"></a>00593 <span class="comment">//        Things that happen inside a Qt application that contain</span>
<a name="l00594"></a>00594 <span class="comment">//        a QXEmbed widget for embedding other applications.</span>
<a name="l00595"></a>00595 <span class="comment">//        This applies to both the XEMBED and XPLAIN protocols.</span>
<a name="l00596"></a>00596 <span class="comment">//        Deviations are commented below.</span>
<a name="l00597"></a>00597 
<a name="l00598"></a>00598 
<a name="l00599"></a>00599 
<a name="l00600"></a>00600 <span class="comment">// L0810: Class QXEmbed.</span>
<a name="l00601"></a>00601 <span class="comment">//        A QXEmbed widget serves as an embedder that can manage one single</span>
<a name="l00602"></a>00602 <span class="comment">//        embedded X-window. These so-called client windows can be arbitrary</span>
<a name="l00603"></a>00603 <span class="comment">//        Qt or non Qt applications.  There are two different ways of using</span>
<a name="l00604"></a>00604 <span class="comment">//        QXEmbed, from the client side or from the embedder&#39;s side.</span>
<a name="l00605"></a>00605 
<a name="l00606"></a>00606 
<a name="l00607"></a>00607 <span class="comment">// L0900: Constructs a xembed widget.</span>
<a name="l00608"></a>00608 QXEmbed::QXEmbed(<a class="codeRef" href="qwidget.html">QWidget</a> *parent, <span class="keyword">const</span> <span class="keywordtype">char</span> *name, WFlags f)
<a name="l00609"></a>00609   : <a class="codeRef" href="qwidget.html">QWidget</a>(parent, name, f)
<a name="l00610"></a>00610 {
<a name="l00611"></a>00611     <span class="comment">// L0901: Create private data. See L0100.</span>
<a name="l00612"></a>00612     d = <span class="keyword">new</span> QXEmbedData;
<a name="l00613"></a>00613     <span class="comment">// L0902: Create focus proxy widget. See XEmbed specification.</span>
<a name="l00614"></a>00614     <span class="comment">//        Each QXEmbed widget has a focus proxy window. Every single</span>
<a name="l00615"></a>00615     <span class="comment">//        QXEmbed widget tries to force its focus proxy window onto the</span>
<a name="l00616"></a>00616     <span class="comment">//        whole embedding application. They compete between themselves and</span>
<a name="l00617"></a>00617     <span class="comment">//        against Qt (L0690, L0914, L1040, L1310, L1510, L1580). </span>
<a name="l00618"></a>00618     <span class="comment">//        This would be much simpler if implemented within Qt.</span>
<a name="l00619"></a>00619     d-&gt;focusProxy = <span class="keyword">new</span> <a class="codeRef" href="qwidget.html">QWidget</a>( topLevelWidget(), <span class="stringliteral">&quot;xembed_focus&quot;</span> );
<a name="l00620"></a>00620     d-&gt;focusProxy-&gt;setGeometry( -1, -1, 1, 1 );
<a name="l00621"></a>00621     d-&gt;focusProxy-&gt;show();
<a name="l00622"></a>00622     <span class="comment">// make sure it&#39;s shown - for XSetInputFocus</span>
<a name="l00623"></a>00623     <a class="codeRef" href="qapplication.html#sendPostedEvents-2">QApplication::sendPostedEvents</a>( d-&gt;focusProxy, 0 );
<a name="l00624"></a>00624     <span class="comment">// L0903: Install the client side event filters</span>
<a name="l00625"></a>00625     <span class="comment">//        because they also provide services for the embedder side</span>
<a name="l00626"></a>00626     <span class="comment">//        See L0660, L0671, L0685.</span>
<a name="l00627"></a>00627     initialize();
<a name="l00628"></a>00628     window = 0;
<a name="l00629"></a>00629     setFocusPolicy(StrongFocus);
<a name="l00630"></a>00630     setKeyCompression( <span class="keyword">false</span> );
<a name="l00631"></a>00631 
<a name="l00632"></a>00632     <span class="comment">// L0910: Trick Qt to create extraData();</span>
<a name="l00633"></a>00633     (void) topData();
<a name="l00634"></a>00634 
<a name="l00635"></a>00635     <span class="comment">// L0912: We are mostly interested in SubstructureNotify</span>
<a name="l00636"></a>00636     <span class="comment">//        This is sent when something happens to the children of</span>
<a name="l00637"></a>00637     <span class="comment">//        the X11 window associated with the QXEmbed widget.</span>
<a name="l00638"></a>00638     XSelectInput(qt_xdisplay(), winId(),
<a name="l00639"></a>00639                  KeyPressMask | KeyReleaseMask |
<a name="l00640"></a>00640                  ButtonPressMask | ButtonReleaseMask |
<a name="l00641"></a>00641                  KeymapStateMask |
<a name="l00642"></a>00642                  ButtonMotionMask |
<a name="l00643"></a>00643                  PointerMotionMask | <span class="comment">// may need this, too</span>
<a name="l00644"></a>00644                  EnterWindowMask | LeaveWindowMask |
<a name="l00645"></a>00645                  FocusChangeMask |
<a name="l00646"></a>00646                  ExposureMask |
<a name="l00647"></a>00647                  StructureNotifyMask |
<a name="l00648"></a>00648                  SubstructureRedirectMask |
<a name="l00649"></a>00649                  SubstructureNotifyMask
<a name="l00650"></a>00650                  );
<a name="l00651"></a>00651     <span class="comment">// L0913: all application events pass through eventFilter().</span>
<a name="l00652"></a>00652     <span class="comment">//        This is mostly used to force the X11 focus on the </span>
<a name="l00653"></a>00653     <span class="comment">//        proxy focus window. See L1300.</span>
<a name="l00654"></a>00654     topLevelWidget()-&gt;installEventFilter( <span class="keyword">this</span> );
<a name="l00655"></a>00655     qApp-&gt;installEventFilter( <span class="keyword">this</span> );
<a name="l00656"></a>00656 
<a name="l00657"></a>00657     <span class="comment">// L0914: Start moving the X11 focus on the focus proxy window.</span>
<a name="l00658"></a>00658     <span class="comment">//        See L1581 to know why we do not use isActiveWindow().</span>
<a name="l00659"></a>00659     <span class="keywordflow">if</span> ( qApp-&gt;activeWindow() == topLevelWidget() )
<a name="l00660"></a>00660         <span class="keywordflow">if</span> ( !((QPublicWidget*) topLevelWidget())-&gt;topData()-&gt;embedded )
<a name="l00661"></a>00661             XSetInputFocus( qt_xdisplay(), d-&gt;focusProxy-&gt;winId(), 
<a name="l00662"></a>00662                             RevertToParent, qt_x_time );
<a name="l00663"></a>00663     <span class="comment">// L0915: ??? [drag&amp;drop?]</span>
<a name="l00664"></a>00664     setAcceptDrops( <span class="keyword">true</span> );
<a name="l00665"></a>00665 }
<a name="l00666"></a>00666 
<a name="l00667"></a>00667 <span class="comment">// L1000: Destructor must dispose of the embedded client window.</span>
<a name="l00668"></a>00668 QXEmbed::~QXEmbed()
<a name="l00669"></a>00669 {
<a name="l00670"></a>00670     <span class="comment">// L1010: Make sure no pointer grab is left.</span>
<a name="l00671"></a>00671     <span class="keywordflow">if</span> ( d &amp;&amp; d-&gt;xgrab)
<a name="l00672"></a>00672         XUngrabButton( qt_xdisplay(), AnyButton, AnyModifier, winId() );
<a name="l00673"></a>00673     <span class="keywordflow">if</span> ( window &amp;&amp; ( autoDelete() || !d-&gt;xplain ))
<a name="l00674"></a>00674         {
<a name="l00675"></a>00675             <span class="comment">// L1021: Hide the window and safely reparent it into the root,</span>
<a name="l00676"></a>00676             <span class="comment">//        otherwise it would be destroyed by X11 together </span>
<a name="l00677"></a>00677             <span class="comment">//        with this QXEmbed&#39;s window.</span>
<a name="l00678"></a>00678 <span class="preprocessor">#if 0</span>
<a name="l00679"></a>00679 <span class="preprocessor"></span><span class="comment">// TODO: The proper XEmbed way would be to unmap the window, and the embedded</span>
<a name="l00680"></a>00680 <span class="comment">// app would detect the embedding has ended, and do whatever it finds appropriate.</span>
<a name="l00681"></a>00681 <span class="comment">// However, QXEmbed currently doesn&#39;t provide support for this detection,</span>
<a name="l00682"></a>00682 <span class="comment">// so for the time being, it&#39;s better to leave the window mapped as toplevel window.</span>
<a name="l00683"></a>00683 <span class="comment">// This will be ever more complicated with the systray windows, as the simple API</span>
<a name="l00684"></a>00684 <span class="comment">// for them (KWin::setSystemTrayWindowFor()) doesn&#39;t make it possible to detect</span>
<a name="l00685"></a>00685 <span class="comment">// themselves they have been released from systray, but KWin requires them</span>
<a name="l00686"></a>00686 <span class="comment">// to be visible to allow next Kicker instance to swallow them.</span>
<a name="l00687"></a>00687 <span class="comment">// See also below the L1022 comment.</span>
<a name="l00688"></a>00688 <span class="comment">//            XUnmapWindow( qt_xdisplay(), window );</span>
<a name="l00689"></a>00689 <span class="preprocessor">#else</span>
<a name="l00690"></a>00690 <span class="preprocessor"></span>            <span class="keywordflow">if</span>( autoDelete())
<a name="l00691"></a>00691                 XUnmapWindow( qt_xdisplay(), window );
<a name="l00692"></a>00692 <span class="preprocessor">#endif</span>
<a name="l00693"></a>00693 <span class="preprocessor"></span>            XReparentWindow(qt_xdisplay(), window, qt_xrootwin(), 0, 0);
<a name="l00694"></a>00694             <span class="keywordflow">if</span>( !d-&gt;xplain )
<a name="l00695"></a>00695                 XRemoveFromSaveSet( qt_xdisplay(), window );
<a name="l00696"></a>00696             <span class="keywordflow">if</span>( d-&gt;mapAfterRelease )
<a name="l00697"></a>00697                 XMapWindow( qt_xdisplay(), window );
<a name="l00698"></a>00698             XSync(qt_xdisplay(), <span class="keyword">false</span>);
<a name="l00699"></a>00699             <span class="comment">// L1022: Send the WM_DELETE_WINDOW message</span>
<a name="l00700"></a>00700             <span class="keywordflow">if</span>( autoDelete() <span class="comment">/*&amp;&amp; d-&gt;xplain*/</span> ) 
<a name="l00701"></a>00701                 <span class="comment">// This sendDelete should only apply to XPLAIN.</span>
<a name="l00702"></a>00702                 <span class="comment">// XEMBED apps are supposed to detect when the embedding ends.</span>
<a name="l00703"></a>00703                 <span class="comment">// ??? [We do not do this detection yet! </span>
<a name="l00704"></a>00704                 <span class="comment">//      So we sendDelete() instead.]</span>
<a name="l00705"></a>00705                 sendDelete();
<a name="l00706"></a>00706       }
<a name="l00707"></a>00707     window = 0;
<a name="l00708"></a>00708     <span class="comment">// L01040: Our focus proxy window will be destroyed as well.</span>
<a name="l00709"></a>00709     <span class="comment">//         Make sure that the X11 focus is not lost in the process.</span>
<a name="l00710"></a>00710     Window focus;
<a name="l00711"></a>00711     <span class="keywordtype">int</span> <a class="code" href="namespaceKStdAction.html#ae4ed5da77bde65ffc02ab14a7de174ba" title="Revert the current document to the last saved version (essentially will undo all changes).">revert</a>;
<a name="l00712"></a>00712     XGetInputFocus( qt_xdisplay(), &amp;focus, &amp;revert );
<a name="l00713"></a>00713     <span class="keywordflow">if</span>( focus == d-&gt;focusProxy-&gt;winId())
<a name="l00714"></a>00714         XSetInputFocus( qt_xdisplay(), topLevelWidget()-&gt;winId(), RevertToParent, qt_x_time );
<a name="l00715"></a>00715     <span class="comment">// L01045: Delete our private data.</span>
<a name="l00716"></a>00716     <span class="keyword">delete</span> d;
<a name="l00717"></a>00717 }
<a name="l00718"></a>00718 
<a name="l00719"></a>00719 
<a name="l00720"></a>00720 <span class="comment">// L1050: Sends a WM_DELETE_WINDOW message to the embedded window.  This is</span>
<a name="l00721"></a>00721 <span class="comment">//        what typically happens when you click on the close button of a </span>
<a name="l00722"></a>00722 <span class="comment">//        window manager decoration.</span>
<a name="l00723"></a>00723 <span class="keywordtype">void</span> QXEmbed::sendDelete( <span class="keywordtype">void</span> )
<a name="l00724"></a>00724 {
<a name="l00725"></a>00725   <span class="keywordflow">if</span> (window)
<a name="l00726"></a>00726     {
<a name="l00727"></a>00727       sendClientMessage(window, qt_wm_protocols, qt_wm_delete_window);
<a name="l00728"></a>00728       XFlush( qt_xdisplay() );
<a name="l00729"></a>00729     }
<a name="l00730"></a>00730 }
<a name="l00731"></a>00731 
<a name="l00732"></a>00732 <span class="comment">// L1100: Sets the protocol used for embedding windows.</span>
<a name="l00733"></a>00733 <span class="comment">//        This function must be called before embedding a window.</span>
<a name="l00734"></a>00734 <span class="comment">//        Protocol XEMBED provides maximal functionality (focus, tabs, etc)</span>
<a name="l00735"></a>00735 <span class="comment">//        but requires explicit cooperation from the embedded window.  </span>
<a name="l00736"></a>00736 <span class="comment">//        Protocol XPLAIN provides maximal compatibility with </span>
<a name="l00737"></a>00737 <span class="comment">//        embedded applications that do not support the XEMBED protocol.</span>
<a name="l00738"></a>00738 <span class="comment">//        The default is XEMBED.  </span>
<a name="l00739"></a>00739 <span class="keywordtype">void</span> QXEmbed::setProtocol( Protocol proto )
<a name="l00740"></a>00740 {
<a name="l00741"></a>00741     <span class="keywordflow">if</span> (!window) {
<a name="l00742"></a>00742         d-&gt;xplain = <span class="keyword">false</span>;
<a name="l00743"></a>00743         <span class="keywordflow">if</span> (proto == XPLAIN)
<a name="l00744"></a>00744             d-&gt;xplain = <span class="keyword">true</span>;
<a name="l00745"></a>00745     }
<a name="l00746"></a>00746 }
<a name="l00747"></a>00747 
<a name="l00748"></a>00748 <span class="comment">// L1150: Returns the protocol used for embedding the current window.</span>
<a name="l00749"></a>00749 QXEmbed::Protocol QXEmbed::protocol()
<a name="l00750"></a>00750 {
<a name="l00751"></a>00751   <span class="keywordflow">if</span> (d-&gt;xplain)
<a name="l00752"></a>00752     <span class="keywordflow">return</span> XPLAIN;
<a name="l00753"></a>00753   <span class="keywordflow">return</span> XEMBED;
<a name="l00754"></a>00754 }
<a name="l00755"></a>00755 
<a name="l00756"></a>00756 
<a name="l00757"></a>00757 <span class="comment">// L1200: QXEmbed widget size changes: resize embedded window.</span>
<a name="l00758"></a>00758 <span class="keywordtype">void</span> QXEmbed::resizeEvent(<a class="codeRef" href="qresizeevent.html">QResizeEvent</a>*)
<a name="l00759"></a>00759 {
<a name="l00760"></a>00760     <span class="keywordflow">if</span> (window)
<a name="l00761"></a>00761         XResizeWindow(qt_xdisplay(), window, width(), height());
<a name="l00762"></a>00762 }
<a name="l00763"></a>00763 
<a name="l00764"></a>00764 <span class="comment">// L1250: QXEmbed widget is shown: make sure embedded window is visible.</span>
<a name="l00765"></a>00765 <span class="keywordtype">void</span> QXEmbed::showEvent(<a class="codeRef" href="qshowevent.html">QShowEvent</a>*)
<a name="l00766"></a>00766 {
<a name="l00767"></a>00767     <span class="keywordflow">if</span> (window)
<a name="l00768"></a>00768         XMapRaised(qt_xdisplay(), window);
<a name="l00769"></a>00769 }
<a name="l00770"></a>00770 
<a name="l00771"></a>00771 
<a name="l00772"></a>00772 <span class="comment">// L1300: This event filter sees all application events (L0913).</span>
<a name="l00773"></a>00773 <span class="keywordtype">bool</span> QXEmbed::eventFilter( <a class="codeRef" href="qobject.html">QObject</a> *o, <a class="codeRef" href="qevent.html">QEvent</a> * e)
<a name="l00774"></a>00774 {
<a name="l00775"></a>00775 
<a name="l00776"></a>00776     <span class="keywordflow">switch</span> ( e-&gt;<a class="codeRef" href="qevent.html#type">type</a>() ) {
<a name="l00777"></a>00777     <span class="keywordflow">case</span> QEvent::WindowActivate:
<a name="l00778"></a>00778         <span class="keywordflow">if</span> ( o == topLevelWidget() ) {
<a name="l00779"></a>00779             <span class="comment">// L1310: Qt thinks the application window has just been activated.</span>
<a name="l00780"></a>00780             <span class="comment">//        Make sure the X11 focus is on the focus proxy window. See L0686.</span>
<a name="l00781"></a>00781             <span class="keywordflow">if</span> ( !((QPublicWidget*) topLevelWidget())-&gt;topData()-&gt;embedded )
<a name="l00782"></a>00782                 <span class="keywordflow">if</span> (! hasFocus() )
<a name="l00783"></a>00783                     XSetInputFocus( qt_xdisplay(), d-&gt;focusProxy-&gt;winId(), 
<a name="l00784"></a>00784                                     RevertToParent, qt_x_time );
<a name="l00785"></a>00785             <span class="keywordflow">if</span> (d-&gt;xplain)
<a name="l00786"></a>00786                 <span class="comment">// L1311: Activation has changed. Grab state might change. See L2800.</span>
<a name="l00787"></a>00787                 checkGrab();
<a name="l00788"></a>00788             <span class="keywordflow">else</span>
<a name="l00789"></a>00789                 <span class="comment">// L1312: Let the client know that we just became active</span>
<a name="l00790"></a>00790                 sendXEmbedMessage( window, XEMBED_WINDOW_ACTIVATE );
<a name="l00791"></a>00791         }
<a name="l00792"></a>00792         <span class="keywordflow">break</span>;
<a name="l00793"></a>00793     <span class="keywordflow">case</span> QEvent::WindowDeactivate:
<a name="l00794"></a>00794         <span class="keywordflow">if</span> ( o == topLevelWidget() ) {
<a name="l00795"></a>00795             <span class="keywordflow">if</span> (d-&gt;xplain)
<a name="l00796"></a>00796                 <span class="comment">// L1321: Activation has changed. Grab state might change. See L2800.</span>
<a name="l00797"></a>00797                 checkGrab();
<a name="l00798"></a>00798             <span class="keywordflow">else</span>
<a name="l00799"></a>00799                 <span class="comment">// L1322: Let the client know that we are no longer active</span>
<a name="l00800"></a>00800                 sendXEmbedMessage( window, XEMBED_WINDOW_DEACTIVATE );
<a name="l00801"></a>00801         }
<a name="l00802"></a>00802         <span class="keywordflow">break</span>;
<a name="l00803"></a>00803     <span class="keywordflow">case</span> QEvent::Move:
<a name="l00804"></a>00804         {
<a name="l00805"></a>00805             <a class="codeRef" href="qwidget.html">QWidget</a>* pos = <span class="keyword">this</span>;
<a name="l00806"></a>00806             <span class="keywordflow">while</span>( pos != o &amp;&amp; pos != topLevelWidget())
<a name="l00807"></a>00807                 pos = pos-&gt;<a class="codeRef" href="qwidget.html#parentWidget">parentWidget</a>();
<a name="l00808"></a>00808             <span class="keywordflow">if</span>( pos == o ) {
<a name="l00809"></a>00809                 <span class="comment">// L1390: Send fake configure notify events whenever the</span>
<a name="l00810"></a>00810                 <span class="comment">//        global position of the client changes. See L2900.</span>
<a name="l00811"></a>00811                 <a class="codeRef" href="qpoint.html">QPoint</a> globalPos = mapToGlobal(<a class="codeRef" href="qpoint.html">QPoint</a>(0,0));
<a name="l00812"></a>00812                 <span class="keywordflow">if</span> (globalPos != d-&gt;lastPos) {
<a name="l00813"></a>00813                     d-&gt;lastPos = globalPos;
<a name="l00814"></a>00814                     sendSyntheticConfigureNotifyEvent();
<a name="l00815"></a>00815                 }
<a name="l00816"></a>00816             }
<a name="l00817"></a>00817         }                    
<a name="l00818"></a>00818         <span class="keywordflow">break</span>;
<a name="l00819"></a>00819     <span class="keywordflow">default</span>:
<a name="l00820"></a>00820         <span class="keywordflow">break</span>;
<a name="l00821"></a>00821    }
<a name="l00822"></a>00822    <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00823"></a>00823 }
<a name="l00824"></a>00824 
<a name="l00825"></a>00825 <span class="comment">// L1350: ??? [why this?]</span>
<a name="l00826"></a>00826 <span class="keywordtype">bool</span>  QXEmbed::event( <a class="codeRef" href="qevent.html">QEvent</a> * e)
<a name="l00827"></a>00827 {
<a name="l00828"></a>00828     <span class="keywordflow">return</span> <a class="codeRef" href="qwidget.html#event">QWidget::event</a>( e );
<a name="l00829"></a>00829 }
<a name="l00830"></a>00830 
<a name="l00831"></a>00831 <span class="comment">// L1400: Forward keypress event to the client</span>
<a name="l00832"></a>00832 <span class="comment">//        Receiving a Qt key event indicates that</span>
<a name="l00833"></a>00833 <span class="comment">//        the QXEmbed object has the Qt focus.</span>
<a name="l00834"></a>00834 <span class="comment">//        The X11 event that caused the Qt key event</span>
<a name="l00835"></a>00835 <span class="comment">//        must be forwarded to the client.</span>
<a name="l00836"></a>00836 <span class="comment">//        See L0660.</span>
<a name="l00837"></a>00837 <span class="keywordtype">void</span> QXEmbed::keyPressEvent( <a class="codeRef" href="qkeyevent.html">QKeyEvent</a> *)
<a name="l00838"></a>00838 {
<a name="l00839"></a>00839     <span class="keywordflow">if</span> (!window)
<a name="l00840"></a>00840         <span class="keywordflow">return</span>;
<a name="l00841"></a>00841     last_key_event.window = window;
<a name="l00842"></a>00842     XSendEvent(qt_xdisplay(), window, <span class="keyword">false</span>, KeyPressMask, (XEvent*)&amp;last_key_event);
<a name="l00843"></a>00843 
<a name="l00844"></a>00844 }
<a name="l00845"></a>00845 
<a name="l00846"></a>00846 <span class="comment">// L1450: Forward keyrelease event to the client.</span>
<a name="l00847"></a>00847 <span class="comment">//        See comment L1400.</span>
<a name="l00848"></a>00848 <span class="keywordtype">void</span> QXEmbed::keyReleaseEvent( <a class="codeRef" href="qkeyevent.html">QKeyEvent</a> *)
<a name="l00849"></a>00849 {
<a name="l00850"></a>00850     <span class="keywordflow">if</span> (!window)
<a name="l00851"></a>00851         <span class="keywordflow">return</span>;
<a name="l00852"></a>00852     last_key_event.window = window;
<a name="l00853"></a>00853     XSendEvent(qt_xdisplay(), window, <span class="keyword">false</span>, KeyReleaseMask, (XEvent*)&amp;last_key_event);
<a name="l00854"></a>00854 }
<a name="l00855"></a>00855 
<a name="l00856"></a>00856 <span class="comment">// L1500: Handle Qt focus in event.</span>
<a name="l00857"></a>00857 <span class="keywordtype">void</span> QXEmbed::focusInEvent( <a class="codeRef" href="qfocusevent.html">QFocusEvent</a> * e ){
<a name="l00858"></a>00858     <span class="keywordflow">if</span> (!window)
<a name="l00859"></a>00859         <span class="keywordflow">return</span>;
<a name="l00860"></a>00860     <span class="comment">// L1510: This is a good time to set the X11 focus on the focus proxy window.</span>
<a name="l00861"></a>00861     <span class="comment">//        Except if the the embedding application itself is embedded into another.</span>
<a name="l00862"></a>00862     <span class="keywordflow">if</span> ( !((QPublicWidget*) topLevelWidget())-&gt;topData()-&gt;embedded )
<a name="l00863"></a>00863       <span class="keywordflow">if</span> ( qApp-&gt;activeWindow() == topLevelWidget() )
<a name="l00864"></a>00864           <span class="comment">// L1511: Alter X focus only when window is active. </span>
<a name="l00865"></a>00865           <span class="comment">//        This is dual safety here because FocusIn implies this.</span>
<a name="l00866"></a>00866           <span class="comment">//        But see L1581 for an example where this really matters.</span>
<a name="l00867"></a>00867           XSetInputFocus( qt_xdisplay(), d-&gt;focusProxy-&gt;winId(), 
<a name="l00868"></a>00868                           RevertToParent, qt_x_time );
<a name="l00869"></a>00869     <span class="keywordflow">if</span> (d-&gt;xplain) {
<a name="l00870"></a>00870         <span class="comment">// L1520: Qt focus has changed. Grab state might change. See L2800.</span>
<a name="l00871"></a>00871         checkGrab();
<a name="l00872"></a>00872         <span class="comment">// L1521: Window managers activate applications by setting the X11 focus.</span>
<a name="l00873"></a>00873         <span class="comment">//        We cannot do this (see L1510) but we can send a fake focus event</span>
<a name="l00874"></a>00874         <span class="comment">//        and forward the X11 key events ourselves (see L1400, L1450).</span>
<a name="l00875"></a>00875         sendFocusMessage(window, XFocusIn, NotifyNormal, NotifyPointer );
<a name="l00876"></a>00876     } <span class="keywordflow">else</span> {
<a name="l00877"></a>00877         <span class="comment">// L1530: No need for fake events with XEMBED.</span>
<a name="l00878"></a>00878         <span class="comment">//        Just inform the client. It knows what to do.</span>
<a name="l00879"></a>00879         <span class="keywordtype">int</span> detail = XEMBED_FOCUS_CURRENT;
<a name="l00880"></a>00880         <span class="comment">// L1531: When the focus change is caused by the tab key,</span>
<a name="l00881"></a>00881         <span class="comment">//        the client must select the first (or last) widget of</span>
<a name="l00882"></a>00882         <span class="comment">//        its own tab chain.</span>
<a name="l00883"></a>00883         <span class="keywordflow">if</span> ( e-&gt;<a class="codeRef" href="qfocusevent.html#reason">reason</a>() == QFocusEvent::Tab )
<a name="l00884"></a>00884             detail = XEMBED_FOCUS_FIRST;
<a name="l00885"></a>00885         <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( e-&gt;<a class="codeRef" href="qfocusevent.html#reason">reason</a>() == QFocusEvent::Backtab )
<a name="l00886"></a>00886             detail = XEMBED_FOCUS_LAST;
<a name="l00887"></a>00887         sendXEmbedMessage( window, XEMBED_FOCUS_IN, detail);
<a name="l00888"></a>00888     }
<a name="l00889"></a>00889 }
<a name="l00890"></a>00890 
<a name="l00891"></a>00891 <span class="comment">// L1550: Handle Qt focus out event.</span>
<a name="l00892"></a>00892 <span class="keywordtype">void</span> QXEmbed::focusOutEvent( <a class="codeRef" href="qfocusevent.html">QFocusEvent</a> * ){
<a name="l00893"></a>00893     <span class="keywordflow">if</span> (!window)
<a name="l00894"></a>00894         <span class="keywordflow">return</span>;
<a name="l00895"></a>00895     <span class="keywordflow">if</span> (d-&gt;xplain) {
<a name="l00896"></a>00896         <span class="comment">// L1560: Qt focus has changed. Grab state might change. See L2800.</span>
<a name="l00897"></a>00897         checkGrab();
<a name="l00898"></a>00898         <span class="comment">// L1561: Send fake focus out message. See L1521.</span>
<a name="l00899"></a>00899         sendFocusMessage(window, XFocusOut, NotifyNormal, NotifyPointer );
<a name="l00900"></a>00900     } <span class="keywordflow">else</span> {
<a name="l00901"></a>00901         <span class="comment">// L1570: Send XEMBED focus out message. See L1531.</span>
<a name="l00902"></a>00902         sendXEmbedMessage( window, XEMBED_FOCUS_OUT );
<a name="l00903"></a>00903     }
<a name="l00904"></a>00904     <span class="comment">// L1580: The QXEmbed object might loose the focus because its</span>
<a name="l00905"></a>00905     <span class="comment">//        toplevel window looses the X11 focus and is no longer active, </span>
<a name="l00906"></a>00906     <span class="comment">//        or simply because the Qt focus has been moved to another widget.</span>
<a name="l00907"></a>00907     <span class="comment">//        In the latter case only, we want to make sure that the X11 focus</span>
<a name="l00908"></a>00908     <span class="comment">//        is properly set to the X11 focus widget.  We do this because</span>
<a name="l00909"></a>00909     <span class="comment">//        the client application might have moved the X11 focus after</span>
<a name="l00910"></a>00910     <span class="comment">//        receiving the fake focus messages.</span>
<a name="l00911"></a>00911     <span class="keywordflow">if</span> ( !((QPublicWidget*) topLevelWidget())-&gt;topData()-&gt;embedded )
<a name="l00912"></a>00912         <span class="keywordflow">if</span> ( qApp-&gt;activeWindow() == topLevelWidget() )
<a name="l00913"></a>00913             <span class="comment">// L1581: Alter X focus only when window is active.</span>
<a name="l00914"></a>00914             <span class="comment">//        The test above is not the same as isActiveWindow().</span>
<a name="l00915"></a>00915             <span class="comment">//        Function isActiveWindow() also returns true when a modal</span>
<a name="l00916"></a>00916             <span class="comment">//        dialog child of this window is active.</span>
<a name="l00917"></a>00917             XSetInputFocus( qt_xdisplay(), d-&gt;focusProxy-&gt;winId(), 
<a name="l00918"></a>00918                             RevertToParent, qt_x_time );
<a name="l00919"></a>00919 }
<a name="l00920"></a>00920 
<a name="l00921"></a>00921 
<a name="l00922"></a>00922 <span class="comment">// L1600: Helper for QXEmbed::embed()</span>
<a name="l00923"></a>00923 <span class="comment">//        Check whether a window is in withdrawn state.</span>
<a name="l00924"></a>00924 <span class="keyword">static</span> <span class="keywordtype">bool</span> wstate_withdrawn( WId winid )
<a name="l00925"></a>00925 {
<a name="l00926"></a>00926     Atom type;
<a name="l00927"></a>00927     <span class="keywordtype">int</span> format;
<a name="l00928"></a>00928     <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> length, after;
<a name="l00929"></a>00929     <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *data;
<a name="l00930"></a>00930     <span class="keywordtype">int</span> r = XGetWindowProperty( qt_xdisplay(), winid, qt_wm_state, 0, 2,
<a name="l00931"></a>00931                                 <span class="keyword">false</span>, AnyPropertyType, &amp;type, &amp;format,
<a name="l00932"></a>00932                                 &amp;length, &amp;after, &amp;data );
<a name="l00933"></a>00933     <span class="keywordtype">bool</span> withdrawn = <span class="keyword">true</span>;
<a name="l00934"></a>00934     <span class="comment">// L1610: Non managed windows have no WM_STATE property.</span>
<a name="l00935"></a>00935     <span class="comment">//        Returning true ensures that the loop L1711 stops.</span>
<a name="l00936"></a>00936     <span class="keywordflow">if</span> ( r == Success &amp;&amp; data &amp;&amp; format == 32 ) {
<a name="l00937"></a>00937         Q_UINT32 *wstate = (Q_UINT32*)data;
<a name="l00938"></a>00938         withdrawn  = (*wstate == WithdrawnState );
<a name="l00939"></a>00939         XFree( (<span class="keywordtype">char</span> *)data );
<a name="l00940"></a>00940     }
<a name="l00941"></a>00941     <span class="keywordflow">return</span> withdrawn;
<a name="l00942"></a>00942 }
<a name="l00943"></a>00943 
<a name="l00944"></a>00944 <span class="comment">// L1650: Helper for QXEmbed::embed()</span>
<a name="l00945"></a>00945 <span class="comment">//        Get the X11 id of the parent window.</span>
<a name="l00946"></a>00946 <span class="keyword">static</span> <span class="keywordtype">int</span> get_parent(WId winid, Window *out_parent)
<a name="l00947"></a>00947 {
<a name="l00948"></a>00948     Window root, *children=0;
<a name="l00949"></a>00949     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nchildren;
<a name="l00950"></a>00950     <span class="keywordtype">int</span> st = XQueryTree(qt_xdisplay(), winid, &amp;root, out_parent, &amp;children, &amp;nchildren);
<a name="l00951"></a>00951     <span class="keywordflow">if</span> (st &amp;&amp; children) 
<a name="l00952"></a>00952         XFree(children);
<a name="l00953"></a>00953     <span class="keywordflow">return</span> st;
<a name="l00954"></a>00954 }
<a name="l00955"></a>00955 
<a name="l00956"></a>00956 <span class="comment">// L1700: Embeds the window w into this QXEmbed widget.</span>
<a name="l00957"></a>00957 <span class="comment">//        See doc in qxembed.h.</span>
<a name="l00958"></a>00958 <span class="keywordtype">void</span> QXEmbed::embed(WId w)
<a name="l00959"></a>00959 {
<a name="l00960"></a>00960     <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gafbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>() &lt;&lt; <span class="stringliteral">&quot;*** Embed &quot;</span> &lt;&lt; w &lt;&lt; <span class="stringliteral">&quot; into &quot;</span> &lt;&lt; winId() &lt;&lt; <span class="stringliteral">&quot;. window=&quot;</span> &lt;&lt; window &lt;&lt; <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#ga313d520ed8f8f6b46eeef22cfb3b082a">endl</a>;
<a name="l00961"></a>00961     <span class="keywordflow">if</span> (!w)
<a name="l00962"></a>00962         <span class="keywordflow">return</span>;
<a name="l00963"></a>00963     <span class="comment">// L1701: The has_window variable prevents embedding a same window twice.</span>
<a name="l00964"></a>00964     <span class="comment">//        ??? [what happens if one embed two windows into the same QXEmbed?]</span>
<a name="l00965"></a>00965     <span class="keywordtype">bool</span> has_window =  (w == window);
<a name="l00966"></a>00966     window = w;
<a name="l00967"></a>00967     <span class="keywordflow">if</span> ( !has_window ) {
<a name="l00968"></a>00968         <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/classKXErrorHandler.html">KXErrorHandler</a> errhandler; <span class="comment">// make X BadWindow errors silent</span>
<a name="l00969"></a>00969         <span class="comment">// L1710: Try hard to withdraw the window.</span>
<a name="l00970"></a>00970         <span class="comment">//        This makes sure that the window manager will</span>
<a name="l00971"></a>00971         <span class="comment">//        no longer try to manage this window.</span>
<a name="l00972"></a>00972         <span class="keywordflow">if</span> ( !wstate_withdrawn(window) ) {
<a name="l00973"></a>00973             XWithdrawWindow(qt_xdisplay(), window, qt_xscreen());
<a name="l00974"></a>00974             <a class="codeRef" href="qapplication.html#flushX">QApplication::flushX</a>();
<a name="l00975"></a>00975             <span class="comment">// L1711: See L1610</span>
<a name="l00976"></a>00976             <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0; i &lt; 10000; ++i) {
<a name="l00977"></a>00977                 <span class="keywordflow">if</span> (wstate_withdrawn(window)) {
<a name="l00978"></a>00978                     Window parent = 0;
<a name="l00979"></a>00979                     get_parent(w, &amp;parent);
<a name="l00980"></a>00980                     <span class="keywordflow">if</span> (parent == qt_xrootwin()) <span class="keywordflow">break</span>;
<a name="l00981"></a>00981                 }
<a name="l00982"></a>00982                 USLEEP(1000);
<a name="l00983"></a>00983             }
<a name="l00984"></a>00984         }
<a name="l00985"></a>00985         <span class="comment">// L1710: It would be sufficient in principle to reparent</span>
<a name="l00986"></a>00986         <span class="comment">//        window w into winId(). Everything else happens in L2020.</span>
<a name="l00987"></a>00987         <span class="comment">//        The following code might be useful when the X11 server takes </span>
<a name="l00988"></a>00988         <span class="comment">//        time to create the embedded application main window.</span>
<a name="l00989"></a>00989         Window parent = 0;
<a name="l00990"></a>00990         get_parent(w, &amp;parent);
<a name="l00991"></a>00991         <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gafbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>() &lt;&lt; <a class="codeRef" href="qstring.html">QString</a>(<span class="stringliteral">&quot;&gt; before reparent: parent=0x%1&quot;</span>).<a class="codeRef" href="qstring.html#arg">arg</a>(parent,0,16) &lt;&lt; <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#ga313d520ed8f8f6b46eeef22cfb3b082a">endl</a>;
<a name="l00992"></a>00992         <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; 50; i++) {
<a name="l00993"></a>00993             <span class="comment">// this is done once more when finishing embedding, but it&#39;s done also here</span>
<a name="l00994"></a>00994             <span class="comment">// just in case we crash before reaching that place</span>
<a name="l00995"></a>00995             <span class="keywordflow">if</span>( !d-&gt;xplain )
<a name="l00996"></a>00996                 XAddToSaveSet( qt_xdisplay(), w );
<a name="l00997"></a>00997             XReparentWindow(qt_xdisplay(), w, winId(), 0, 0);
<a name="l00998"></a>00998             <span class="keywordflow">if</span> (get_parent(w, &amp;parent) &amp;&amp; parent == winId()) {
<a name="l00999"></a>00999                <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gafbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>() &lt;&lt; <a class="codeRef" href="qstring.html">QString</a>(<span class="stringliteral">&quot;&gt; Loop %1: &quot;</span>).<a class="codeRef" href="qstring.html#arg">arg</a>(i)
<a name="l01000"></a>01000                          &lt;&lt; <a class="codeRef" href="qstring.html">QString</a>(<span class="stringliteral">&quot;&gt; reparent of 0x%1&quot;</span>).<a class="codeRef" href="qstring.html#arg">arg</a>(w,0,16)
<a name="l01001"></a>01001                          &lt;&lt; <a class="codeRef" href="qstring.html">QString</a>(<span class="stringliteral">&quot; into 0x%1&quot;</span>).<a class="codeRef" href="qstring.html#arg">arg</a>(winId(),0,16)
<a name="l01002"></a>01002                          &lt;&lt; <a class="codeRef" href="qstring.html">QString</a>(<span class="stringliteral">&quot; successful&quot;</span>) &lt;&lt; <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#ga313d520ed8f8f6b46eeef22cfb3b082a">endl</a>;
<a name="l01003"></a>01003                 <span class="keywordflow">break</span>;
<a name="l01004"></a>01004             }
<a name="l01005"></a>01005             <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#gafbb9aa4a84d6c0563d46550454b9714b">kdDebug</a>() &lt;&lt; <a class="codeRef" href="qstring.html">QString</a>(<span class="stringliteral">&quot;&gt; Loop %1: &quot;</span>).<a class="codeRef" href="qstring.html#arg">arg</a>(i)
<a name="l01006"></a>01006                       &lt;&lt; <a class="codeRef" href="qstring.html">QString</a>(<span class="stringliteral">&quot;&gt; reparent of 0x%1&quot;</span>).<a class="codeRef" href="qstring.html#arg">arg</a>(w,0,16)
<a name="l01007"></a>01007                       &lt;&lt; <a class="codeRef" href="qstring.html">QString</a>(<span class="stringliteral">&quot; into 0x%1&quot;</span>).<a class="codeRef" href="qstring.html#arg">arg</a>(winId(),0,16)
<a name="l01008"></a>01008                       &lt;&lt; <a class="codeRef" href="qstring.html">QString</a>(<span class="stringliteral">&quot; failed&quot;</span>) &lt;&lt; <a class="codeRef" doxygen="kdecore.tag:../../kdecore/html/" href="../../kdecore/html/group__kdebug.html#ga313d520ed8f8f6b46eeef22cfb3b082a">endl</a>;
<a name="l01009"></a>01009             USLEEP(1000);
<a name="l01010"></a>01010         }
<a name="l01011"></a>01011         <span class="keywordflow">if</span>( parent != winId()) <span class="comment">// failed</span>
<a name="l01012"></a>01012             window = 0;
<a name="l01013"></a>01013     }
<a name="l01014"></a>01014 }
<a name="l01015"></a>01015 
<a name="l01016"></a>01016 <span class="comment">// When a window is reparented into QXEmbed (or created inside of it), this function</span>
<a name="l01017"></a>01017 <span class="comment">// sets up the actual embedding.</span>
<a name="l01018"></a>01018 <span class="keywordtype">void</span> QXEmbed::handleEmbed()
<a name="l01019"></a>01019 {
<a name="l01020"></a>01020     <span class="comment">// only XEMBED apps can survive crash,</span>
<a name="l01021"></a>01021     <span class="comment">// see http://lists.kde.org/?l=kfm-devel&amp;m=106752026501968&amp;w=2</span>
<a name="l01022"></a>01022     <span class="keywordflow">if</span>( !d-&gt;xplain )
<a name="l01023"></a>01023         XAddToSaveSet( qt_xdisplay(), window );
<a name="l01024"></a>01024     XResizeWindow(qt_xdisplay(), window, width(), height());
<a name="l01025"></a>01025     XMapRaised(qt_xdisplay(), window);
<a name="l01026"></a>01026     <span class="comment">// L2024: see L2900.</span>
<a name="l01027"></a>01027     sendSyntheticConfigureNotifyEvent();
<a name="l01028"></a>01028     <span class="comment">// L2025: ??? [any idea about drag&amp;drop?] </span>
<a name="l01029"></a>01029     extraData()-&gt;xDndProxy = window;
<a name="l01030"></a>01030     <span class="keywordflow">if</span> ( parent() ) {
<a name="l01031"></a>01031         <span class="comment">// L2030: embedded window might have new size requirements.</span>
<a name="l01032"></a>01032         <span class="comment">//        see L2500, L2520, L2550.</span>
<a name="l01033"></a>01033         <a class="codeRef" href="qevent.html">QEvent</a> * layoutHint = <span class="keyword">new</span> <a class="codeRef" href="qevent.html">QEvent</a>( QEvent::LayoutHint );
<a name="l01034"></a>01034         <a class="codeRef" href="qapplication.html#postEvent">QApplication::postEvent</a>( parent(), layoutHint );
<a name="l01035"></a>01035     }
<a name="l01036"></a>01036     windowChanged( window );
<a name="l01037"></a>01037     <span class="keywordflow">if</span> (d-&gt;xplain) {
<a name="l01038"></a>01038         <span class="comment">// L2040: Activation has changed. Grab state might change. See L2800.</span>
<a name="l01039"></a>01039         checkGrab();
<a name="l01040"></a>01040         <span class="keywordflow">if</span> ( hasFocus() )
<a name="l01041"></a>01041             <span class="comment">// L2041: Send fake focus message to inform the client. See L1521.</span>
<a name="l01042"></a>01042             sendFocusMessage(window, XFocusIn, NotifyNormal, NotifyPointer );
<a name="l01043"></a>01043     } <span class="keywordflow">else</span> {
<a name="l01044"></a>01044         <span class="comment">// L2050: Send XEMBED messages (see L0670, L1312, L1322, L1530)</span>
<a name="l01045"></a>01045         sendXEmbedMessage( window, XEMBED_EMBEDDED_NOTIFY, 0, (<span class="keywordtype">long</span>) winId() );
<a name="l01046"></a>01046         <span class="keywordflow">if</span> (isActiveWindow())
<a name="l01047"></a>01047             sendXEmbedMessage( window, XEMBED_WINDOW_ACTIVATE);
<a name="l01048"></a>01048         <span class="keywordflow">else</span>
<a name="l01049"></a>01049             sendXEmbedMessage( window, XEMBED_WINDOW_DEACTIVATE);
<a name="l01050"></a>01050         <span class="keywordflow">if</span> ( hasFocus() )
<a name="l01051"></a>01051             sendXEmbedMessage( window, XEMBED_FOCUS_IN, XEMBED_FOCUS_CURRENT );
<a name="l01052"></a>01052     }
<a name="l01053"></a>01053 }
<a name="l01054"></a>01054 
<a name="l01055"></a>01055 <span class="comment">// L1800: Returns the window identifier of the embedded window</span>
<a name="l01056"></a>01056 WId QXEmbed::embeddedWinId()<span class="keyword"> const</span>
<a name="l01057"></a>01057 <span class="keyword"></span>{
<a name="l01058"></a>01058     <span class="keywordflow">return</span> window;
<a name="l01059"></a>01059 }
<a name="l01060"></a>01060 
<a name="l01061"></a>01061 
<a name="l01062"></a>01062 <span class="comment">// L1900: Control Qt tab focus management.</span>
<a name="l01063"></a>01063 <span class="comment">//        See Qt documentation.</span>
<a name="l01064"></a>01064 <span class="keywordtype">bool</span> QXEmbed::focusNextPrevChild( <span class="keywordtype">bool</span> next )
<a name="l01065"></a>01065 {
<a name="l01066"></a>01066     <span class="keywordflow">if</span> ( window )
<a name="l01067"></a>01067         <span class="comment">// L1901: Return false when there is an embedded window</span>
<a name="l01068"></a>01068         <span class="comment">//        When the user presses TAB, Qt will not change </span>
<a name="l01069"></a>01069         <span class="comment">//        the focus and pass the TAB key events to the QXEmbed widget.</span>
<a name="l01070"></a>01070         <span class="comment">//        These key events will be forwarded to the client (L1400, L1450)</span>
<a name="l01071"></a>01071         <span class="comment">//        who eventually will manage the tab focus (L0620) and possible</span>
<a name="l01072"></a>01072         <span class="comment">//        instruct us to call QWidget::focusNextPrevChild (L2081).</span>
<a name="l01073"></a>01073         <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l01074"></a>01074     <span class="keywordflow">else</span>
<a name="l01075"></a>01075         <span class="comment">// L1920: Default behavior otherwise.</span>
<a name="l01076"></a>01076         <span class="keywordflow">return</span> <a class="codeRef" href="qwidget.html#focusNextPrevChild">QWidget::focusNextPrevChild</a>( next );
<a name="l01077"></a>01077 }
<a name="l01078"></a>01078 
<a name="l01079"></a>01079 
<a name="l01080"></a>01080 <span class="comment">// L2000: Filter for X11 events sent to the QXEmbed window.</span>
<a name="l01081"></a>01081 <span class="keywordtype">bool</span> QXEmbed::x11Event( XEvent* e)
<a name="l01082"></a>01082 {
<a name="l01083"></a>01083     <span class="keywordflow">switch</span> ( e-&gt;type ) {
<a name="l01084"></a>01084     <span class="keywordflow">case</span> DestroyNotify:
<a name="l01085"></a>01085         <span class="keywordflow">if</span> ( e-&gt;xdestroywindow.window == window ) {
<a name="l01086"></a>01086             <span class="comment">// L2005: Client window is being destroyed.</span>
<a name="l01087"></a>01087             window = 0;
<a name="l01088"></a>01088             windowChanged( window );
<a name="l01089"></a>01089             emit embeddedWindowDestroyed();
<a name="l01090"></a>01090         }
<a name="l01091"></a>01091         <span class="keywordflow">break</span>;
<a name="l01092"></a>01092     <span class="keywordflow">case</span> CreateNotify:
<a name="l01093"></a>01093         <span class="comment">// A window was created inside of QXEmbed, handle it as embedded</span>
<a name="l01094"></a>01094         <span class="keywordflow">if</span>( window == 0 ) { <span class="comment">// only one window</span>
<a name="l01095"></a>01095             window = e-&gt;xcreatewindow.window;
<a name="l01096"></a>01096             handleEmbed();
<a name="l01097"></a>01097         }
<a name="l01098"></a>01098         <span class="keywordflow">break</span>;
<a name="l01099"></a>01099     <span class="keywordflow">case</span> ReparentNotify:
<a name="l01100"></a>01100         <span class="keywordflow">if</span> ( e-&gt;xreparent.window == d-&gt;focusProxy-&gt;winId() )
<a name="l01101"></a>01101             <span class="keywordflow">break</span>; <span class="comment">// ignore proxy</span>
<a name="l01102"></a>01102         <span class="keywordflow">if</span> ( window &amp;&amp; e-&gt;xreparent.window == window &amp;&amp;
<a name="l01103"></a>01103              e-&gt;xreparent.parent != winId() ) {
<a name="l01104"></a>01104             <span class="comment">// L2010: We lost the window</span>
<a name="l01105"></a>01105             window = 0;
<a name="l01106"></a>01106             windowChanged( window );
<a name="l01107"></a>01107             emit embeddedWindowDestroyed();
<a name="l01108"></a>01108             <span class="comment">// L2011: Remove window from save set</span>
<a name="l01109"></a>01109             <span class="comment">//        ??? [not sure it is good to touch this window since</span>
<a name="l01110"></a>01110             <span class="comment">//             someone else has taken control of it already.]</span>
<a name="l01111"></a>01111             <span class="keywordflow">if</span>( !d-&gt;xplain )
<a name="l01112"></a>01112                 XRemoveFromSaveSet( qt_xdisplay(), window );
<a name="l01113"></a>01113         } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( e-&gt;xreparent.parent == winId()){
<a name="l01114"></a>01114             <span class="keywordflow">if</span>( window == 0 ) <span class="comment">// something started embedding from the outside</span>
<a name="l01115"></a>01115                 window = e-&gt;xreparent.window;
<a name="l01116"></a>01116             <span class="comment">// L2020: We got a window. Complete the embedding process.</span>
<a name="l01117"></a>01117             <span class="keywordflow">if</span>( e-&gt;xreparent.window == window )
<a name="l01118"></a>01118                 handleEmbed();
<a name="l01119"></a>01119         }
<a name="l01120"></a>01120         <span class="keywordflow">break</span>;
<a name="l01121"></a>01121     <span class="keywordflow">case</span> ButtonPress:
<a name="l01122"></a>01122         <span class="keywordflow">if</span> (d-&gt;xplain &amp;&amp; d-&gt;xgrab) {
<a name="l01123"></a>01123             <span class="comment">// L2060: The passive grab has intercepted a mouse click</span>
<a name="l01124"></a>01124             <span class="comment">//        in the embedded client window. Take the focus.</span>
<a name="l01125"></a>01125             <a class="codeRef" href="qfocusevent.html#setReason">QFocusEvent::setReason</a>( QFocusEvent::Mouse );
<a name="l01126"></a>01126             setFocus();
<a name="l01127"></a>01127             <a class="codeRef" href="qfocusevent.html#resetReason">QFocusEvent::resetReason</a>();
<a name="l01128"></a>01128             <span class="comment">// L2064: Resume X11 event processing.</span>
<a name="l01129"></a>01129             XAllowEvents(qt_xdisplay(), ReplayPointer, CurrentTime);
<a name="l01130"></a>01130             <span class="comment">// L2065: Qt should not know about this.</span>
<a name="l01131"></a>01131             <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l01132"></a>01132         }
<a name="l01133"></a>01133         <span class="keywordflow">break</span>;
<a name="l01134"></a>01134     <span class="keywordflow">case</span> ButtonRelease:
<a name="l01135"></a>01135         <span class="keywordflow">if</span> (d-&gt;xplain &amp;&amp; d-&gt;xgrab) {
<a name="l01136"></a>01136             <span class="comment">// L2064: Resume X11 event processing after passive grab (see L2060)</span>
<a name="l01137"></a>01137             XAllowEvents(qt_xdisplay(), SyncPointer, CurrentTime);
<a name="l01138"></a>01138             <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l01139"></a>01139         }
<a name="l01140"></a>01140         <span class="keywordflow">break</span>;
<a name="l01141"></a>01141     <span class="keywordflow">case</span> MapRequest:
<a name="l01142"></a>01142         <span class="comment">// L2070: Behave like a window manager.</span>
<a name="l01143"></a>01143         <span class="keywordflow">if</span> ( window &amp;&amp; e-&gt;xmaprequest.window == window )
<a name="l01144"></a>01144             XMapRaised(qt_xdisplay(), window );
<a name="l01145"></a>01145         <span class="keywordflow">break</span>;
<a name="l01146"></a>01146     <span class="keywordflow">case</span> ClientMessage:
<a name="l01147"></a>01147         <span class="comment">// L2080: This is where the QXEmbed object receives XEMBED </span>
<a name="l01148"></a>01148         <span class="comment">//        messaged from the client application.</span>
<a name="l01149"></a>01149         <span class="keywordflow">if</span> ( e-&gt;xclient.format == 32 &amp;&amp; e-&gt;xclient.message_type == xembed ) {
<a name="l01150"></a>01150             <span class="keywordtype">long</span> message = e-&gt;xclient.data.l[1];
<a name="l01151"></a>01151             <span class="keywordflow">switch</span> ( message ) {
<a name="l01152"></a>01152                 <span class="comment">// L2081: Tab focus management. It is very important to call the </span>
<a name="l01153"></a>01153                 <span class="comment">//        focusNextPrevChild() defined by QWidget (not QXEmbed). </span>
<a name="l01154"></a>01154                 <span class="comment">//        See L1901.</span>
<a name="l01155"></a>01155             <span class="keywordflow">case</span> XEMBED_FOCUS_NEXT:
<a name="l01156"></a>01156                 <a class="codeRef" href="qwidget.html#focusNextPrevChild">QWidget::focusNextPrevChild</a>( <span class="keyword">true</span> );
<a name="l01157"></a>01157                 <span class="keywordflow">break</span>;
<a name="l01158"></a>01158             <span class="keywordflow">case</span> XEMBED_FOCUS_PREV:
<a name="l01159"></a>01159                 <a class="codeRef" href="qwidget.html#focusNextPrevChild">QWidget::focusNextPrevChild</a>( <span class="keyword">false</span> );
<a name="l01160"></a>01160                 <span class="keywordflow">break</span>;
<a name="l01161"></a>01161                 <span class="comment">// L2085: The client asks for the focus.</span>
<a name="l01162"></a>01162             <span class="keywordflow">case</span> XEMBED_REQUEST_FOCUS:
<a name="l01163"></a>01163                 <span class="keywordflow">if</span>( ((QPublicWidget*)topLevelWidget())-&gt;topData()-&gt;embedded ) {
<a name="l01164"></a>01164                     WId window = ((QPublicWidget*)topLevelWidget())-&gt;topData()-&gt;parentWinId;
<a name="l01165"></a>01165                     sendXEmbedMessage( window, XEMBED_REQUEST_FOCUS );
<a name="l01166"></a>01166                 } <span class="keywordflow">else</span> {
<a name="l01167"></a>01167                     <a class="codeRef" href="qfocusevent.html#setReason">QFocusEvent::setReason</a>( QFocusEvent::Mouse );
<a name="l01168"></a>01168                     setFocus();
<a name="l01169"></a>01169                     <a class="codeRef" href="qfocusevent.html#resetReason">QFocusEvent::resetReason</a>();
<a name="l01170"></a>01170                 }
<a name="l01171"></a>01171                 <span class="keywordflow">break</span>;
<a name="l01172"></a>01172             <span class="keywordflow">default</span>:
<a name="l01173"></a>01173                 <span class="keywordflow">break</span>;
<a name="l01174"></a>01174             }
<a name="l01175"></a>01175         }
<a name="l01176"></a>01176     <span class="keywordflow">break</span>;
<a name="l01177"></a>01177 
<a name="l01178"></a>01178     <span class="keywordflow">case</span> ConfigureRequest:
<a name="l01179"></a>01179         <span class="comment">// L2090: Client wants to change its geometry. </span>
<a name="l01180"></a>01180         <span class="comment">//        Just inform it that nothing has changed.</span>
<a name="l01181"></a>01181         <span class="keywordflow">if</span> (e-&gt;xconfigurerequest.window == window) 
<a name="l01182"></a>01182         {
<a name="l01183"></a>01183              sendSyntheticConfigureNotifyEvent();
<a name="l01184"></a>01184         }
<a name="l01185"></a>01185         <span class="keywordflow">break</span>;
<a name="l01186"></a>01186     <span class="keywordflow">case</span> MotionNotify: 
<a name="l01187"></a>01187     <span class="comment">// fall through, workaround for Qt 3.0 &lt; 3.0.3</span>
<a name="l01188"></a>01188     <span class="keywordflow">case</span> EnterNotify:
<a name="l01189"></a>01189         <span class="comment">// L2095: See L2200.</span>
<a name="l01190"></a>01190         <span class="keywordflow">if</span> ( <a class="codeRef" href="qwhatsthis.html#inWhatsThisMode">QWhatsThis::inWhatsThisMode</a>() )
<a name="l01191"></a>01191             enterWhatsThisMode();
<a name="l01192"></a>01192         <span class="keywordflow">break</span>;
<a name="l01193"></a>01193     <span class="keywordflow">default</span>:
<a name="l01194"></a>01194         <span class="keywordflow">break</span>;
<a name="l01195"></a>01195     }
<a name="l01196"></a>01196     <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l01197"></a>01197 }
<a name="l01198"></a>01198 
<a name="l01199"></a>01199 
<a name="l01200"></a>01200 <span class="comment">// L2200: Try to handle Qt&#39;s &quot;what&#39;s this&quot; mode.  Broken.</span>
<a name="l01201"></a>01201 <span class="comment">//        &quot;temporary, fix in Qt (Matthias, Mon Jul 17 15:20:55 CEST 2000&quot;</span>
<a name="l01202"></a>01202 <span class="keywordtype">void</span> QXEmbed::enterWhatsThisMode()
<a name="l01203"></a>01203 {
<a name="l01204"></a>01204     <span class="comment">// L2210: When the what-s-this pointer enters the embedded window (L2095)</span>
<a name="l01205"></a>01205     <span class="comment">//        cancel what-s-this mode, and use a non stantard _NET_WM_ message</span>
<a name="l01206"></a>01206     <span class="comment">//        to instruct the embedded client to enter the &quot;what&#39;s this&quot; mode.</span>
<a name="l01207"></a>01207     <span class="comment">//        This works only one way...</span>
<a name="l01208"></a>01208     <a class="codeRef" href="qwhatsthis.html#leaveWhatsThisMode">QWhatsThis::leaveWhatsThisMode</a>();
<a name="l01209"></a>01209     <span class="keywordflow">if</span> ( !context_help )
<a name="l01210"></a>01210         context_help = XInternAtom( x11Display(), <span class="stringliteral">&quot;_NET_WM_CONTEXT_HELP&quot;</span>, <span class="keyword">false</span> );
<a name="l01211"></a>01211     sendClientMessage(window , qt_wm_protocols, context_help );
<a name="l01212"></a>01212 }
<a name="l01213"></a>01213 
<a name="l01214"></a>01214 
<a name="l01215"></a>01215 <span class="comment">// L2300: indicates that the embedded window has been changed.</span>
<a name="l01216"></a>01216 <span class="keywordtype">void</span> QXEmbed::windowChanged( WId )
<a name="l01217"></a>01217 {
<a name="l01218"></a>01218 }
<a name="l01219"></a>01219 
<a name="l01220"></a>01220 
<a name="l01221"></a>01221 <span class="comment">// L2400: Utility function for clients that embed themselves.</span>
<a name="l01222"></a>01222 <span class="comment">//        This is client side code.</span>
<a name="l01223"></a>01223 <span class="keywordtype">bool</span> QXEmbed::processClientCmdline( <a class="codeRef" href="qwidget.html">QWidget</a>* client, <span class="keywordtype">int</span>&amp; argc, <span class="keywordtype">char</span> ** argv )
<a name="l01224"></a>01224 {
<a name="l01225"></a>01225     <span class="keywordtype">int</span> myargc = argc;
<a name="l01226"></a>01226     WId window = 0;
<a name="l01227"></a>01227     <span class="keywordtype">int</span> i, j;
<a name="l01228"></a>01228 
<a name="l01229"></a>01229     j = 1;
<a name="l01230"></a>01230     <span class="keywordflow">for</span> ( i=1; i&lt;myargc; i++ ) {
<a name="l01231"></a>01231         <span class="keywordflow">if</span> ( argv[i] &amp;&amp; *argv[i] != <span class="charliteral">&#39;-&#39;</span> ) {
<a name="l01232"></a>01232             argv[j++] = argv[i];
<a name="l01233"></a>01233             <span class="keywordflow">continue</span>;
<a name="l01234"></a>01234         }
<a name="l01235"></a>01235         <a class="codeRef" href="qcstring.html">QCString</a> arg = argv[i];
<a name="l01236"></a>01236         <span class="keywordflow">if</span> ( !strcmp(arg,<span class="stringliteral">&quot;-embed&quot;</span>) &amp;&amp; i &lt; myargc-1 ) {
<a name="l01237"></a>01237             <a class="codeRef" href="qcstring.html">QCString</a> s = argv[++i];
<a name="l01238"></a>01238             window = s.<a class="codeRef" href="qcstring.html#toInt">toInt</a>();
<a name="l01239"></a>01239         } <span class="keywordflow">else</span>
<a name="l01240"></a>01240             argv[j++] = argv[i];
<a name="l01241"></a>01241     }
<a name="l01242"></a>01242     argc = j;
<a name="l01243"></a>01243 
<a name="l01244"></a>01244     <span class="keywordflow">if</span> ( window ) {
<a name="l01245"></a>01245         embedClientIntoWindow( client, window );
<a name="l01246"></a>01246         <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l01247"></a>01247     }
<a name="l01248"></a>01248 
<a name="l01249"></a>01249     <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l01250"></a>01250 }
<a name="l01251"></a>01251 
<a name="l01252"></a>01252 
<a name="l01253"></a>01253 <span class="comment">// L2450: Utility function for clients that embed themselves.</span>
<a name="l01254"></a>01254 <span class="comment">//        This is client side code.</span>
<a name="l01255"></a>01255 <span class="keywordtype">void</span> QXEmbed::embedClientIntoWindow(<a class="codeRef" href="qwidget.html">QWidget</a>* client, WId window)
<a name="l01256"></a>01256 {
<a name="l01257"></a>01257     initialize();
<a name="l01258"></a>01258     XReparentWindow(qt_xdisplay(), client-&gt;<a class="codeRef" href="qwidget.html#winId">winId</a>(), window, 0, 0);
<a name="l01259"></a>01259     <span class="comment">// L2451: These two lines are redundant. See L0680.</span>
<a name="l01260"></a>01260     ((QXEmbed*)client)-&gt;topData()-&gt;embedded = <span class="keyword">true</span>;
<a name="l01261"></a>01261     ((QXEmbed*)client)-&gt;topData()-&gt;parentWinId = window;
<a name="l01262"></a>01262     <span class="comment">// L2452: This seems redundant because L2020 maps the window.</span>
<a name="l01263"></a>01263     <span class="comment">//        But calling show() might also set Qt internal flags.</span>
<a name="l01264"></a>01264     client-&gt;<a class="codeRef" href="qwidget.html#show">show</a>();
<a name="l01265"></a>01265 }
<a name="l01266"></a>01266 
<a name="l01267"></a>01267 
<a name="l01268"></a>01268 
<a name="l01269"></a>01269 <span class="comment">// L2500: Specifies that this widget can use additional space,</span>
<a name="l01270"></a>01270 <span class="comment">//        and that it can survive on less than sizeHint().</span>
<a name="l01271"></a>01271 <a class="codeRef" href="qsizepolicy.html">QSizePolicy</a> QXEmbed::sizePolicy()<span class="keyword"> const</span>
<a name="l01272"></a>01272 <span class="keyword"></span>{
<a name="l01273"></a>01273     <span class="keywordflow">return</span> <a class="codeRef" href="qsizepolicy.html">QSizePolicy</a>( QSizePolicy::Expanding, QSizePolicy::Expanding );
<a name="l01274"></a>01274 }
<a name="l01275"></a>01275 
<a name="l01276"></a>01276 
<a name="l01277"></a>01277 <span class="comment">// L2520: Returns a size sufficient for the embedded window</span>
<a name="l01278"></a>01278 <a class="codeRef" href="qsize.html">QSize</a> QXEmbed::sizeHint()<span class="keyword"> const</span>
<a name="l01279"></a>01279 <span class="keyword"></span>{
<a name="l01280"></a>01280     <span class="keywordflow">return</span> minimumSizeHint();
<a name="l01281"></a>01281 }
<a name="l01282"></a>01282 
<a name="l01283"></a>01283 <span class="comment">// L2550: Returns the minimum size specified by the embedded window.</span>
<a name="l01284"></a>01284 <a class="codeRef" href="qsize.html">QSize</a> QXEmbed::minimumSizeHint()<span class="keyword"> const</span>
<a name="l01285"></a>01285 <span class="keyword"></span>{
<a name="l01286"></a>01286     <span class="keywordtype">int</span> minw = 0;
<a name="l01287"></a>01287     <span class="keywordtype">int</span> minh = 0;
<a name="l01288"></a>01288     <span class="keywordflow">if</span> ( window ) {
<a name="l01289"></a>01289         XSizeHints size;
<a name="l01290"></a>01290         <span class="keywordtype">long</span> msize;
<a name="l01291"></a>01291         <span class="keywordflow">if</span> (XGetWMNormalHints(qt_xdisplay(), window, &amp;size, &amp;msize)
<a name="l01292"></a>01292             &amp;&amp; ( size.flags &amp; PMinSize) ) {
<a name="l01293"></a>01293             minw = size.min_width;
<a name="l01294"></a>01294             minh = size.min_height;
<a name="l01295"></a>01295         }
<a name="l01296"></a>01296     }
<a name="l01297"></a>01297 
<a name="l01298"></a>01298     <span class="keywordflow">return</span> <a class="codeRef" href="qsize.html">QSize</a>( minw, minh );
<a name="l01299"></a>01299 }
<a name="l01300"></a>01300 
<a name="l01301"></a>01301 <span class="comment">// L2600: Tells what shoud be done with the embedded window when</span>
<a name="l01302"></a>01302 <span class="comment">//        the embedding window is destroyed. </span>
<a name="l01303"></a>01303 <span class="keywordtype">void</span> QXEmbed::setAutoDelete( <span class="keywordtype">bool</span> b)
<a name="l01304"></a>01304 {
<a name="l01305"></a>01305     d-&gt;autoDelete = b;
<a name="l01306"></a>01306 }
<a name="l01307"></a>01307 
<a name="l01308"></a>01308 <span class="comment">// L2650: See L2600.</span>
<a name="l01309"></a>01309 <span class="keywordtype">bool</span> QXEmbed::autoDelete()<span class="keyword"> const</span>
<a name="l01310"></a>01310 <span class="keyword"></span>{
<a name="l01311"></a>01311     <span class="keywordflow">return</span> d-&gt;autoDelete;
<a name="l01312"></a>01312 }
<a name="l01313"></a>01313 
<a name="l01314"></a>01314 <span class="comment">// L2700: See L2200.</span>
<a name="l01315"></a>01315 <span class="keywordtype">bool</span> QXEmbed::customWhatsThis()<span class="keyword"> const</span>
<a name="l01316"></a>01316 <span class="keyword"></span>{
<a name="l01317"></a>01317     <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l01318"></a>01318 }
<a name="l01319"></a>01319 
<a name="l01320"></a>01320 <span class="comment">// L2800: When using the XPLAIN protocol, this function maintains</span>
<a name="l01321"></a>01321 <span class="comment">//        a passive button grab when (1) the application is active</span>
<a name="l01322"></a>01322 <span class="comment">//        and (2) the Qt focus is not on the QXEmbed.  This passive</span>
<a name="l01323"></a>01323 <span class="comment">//        grab intercepts button clicks in the client window and</span>
<a name="l01324"></a>01324 <span class="comment">//        give us chance to request the Qt focus (L2060).</span>
<a name="l01325"></a>01325 <span class="keywordtype">void</span> QXEmbed::checkGrab() 
<a name="l01326"></a>01326 {
<a name="l01327"></a>01327     <span class="keywordflow">if</span> (d-&gt;xplain &amp;&amp; isActiveWindow() &amp;&amp; !hasFocus()) {
<a name="l01328"></a>01328         <span class="keywordflow">if</span> (! d-&gt;xgrab)
<a name="l01329"></a>01329             XGrabButton(qt_xdisplay(), AnyButton, AnyModifier, winId(),
<a name="l01330"></a>01330                         <span class="keyword">false</span>, ButtonPressMask, GrabModeSync, GrabModeAsync,
<a name="l01331"></a>01331                         None, None );
<a name="l01332"></a>01332         d-&gt;xgrab = <span class="keyword">true</span>;
<a name="l01333"></a>01333     } <span class="keywordflow">else</span> {
<a name="l01334"></a>01334         <span class="keywordflow">if</span> (d-&gt;xgrab)
<a name="l01335"></a>01335             XUngrabButton( qt_xdisplay(), AnyButton, AnyModifier, winId() );
<a name="l01336"></a>01336         d-&gt;xgrab = <span class="keyword">false</span>;
<a name="l01337"></a>01337     }
<a name="l01338"></a>01338 }
<a name="l01339"></a>01339 
<a name="l01340"></a>01340 <span class="comment">// L2900: This sends fake configure notify events to inform</span>
<a name="l01341"></a>01341 <span class="comment">//        the client about its window geometry. See L1390, L2024 and L2090.</span>
<a name="l01342"></a>01342 <span class="keywordtype">void</span> QXEmbed::sendSyntheticConfigureNotifyEvent() 
<a name="l01343"></a>01343 {
<a name="l01344"></a>01344     <span class="comment">// L2910: It seems that the x and y coordinates are global.</span>
<a name="l01345"></a>01345     <span class="comment">//        But this is what ICCCM section 4.1.5 wants.</span>
<a name="l01346"></a>01346     <span class="comment">//        See http://lists.kde.org/?l=kfm-devel&amp;m=107090222032378</span>
<a name="l01347"></a>01347     <a class="codeRef" href="qpoint.html">QPoint</a> globalPos = mapToGlobal(<a class="codeRef" href="qpoint.html">QPoint</a>(0,0));
<a name="l01348"></a>01348     <span class="keywordflow">if</span> (window) {
<a name="l01349"></a>01349 <span class="preprocessor">#if 0</span>
<a name="l01350"></a>01350 <span class="preprocessor"></span>        XConfigureEvent c;
<a name="l01351"></a>01351         memset(&amp;c, 0, <span class="keyword">sizeof</span>(c));
<a name="l01352"></a>01352         c.type = ConfigureNotify;
<a name="l01353"></a>01353         c.display = qt_xdisplay();
<a name="l01354"></a>01354         c.send_event = True;
<a name="l01355"></a>01355         c.event = window;
<a name="l01356"></a>01356         c.window = window;
<a name="l01357"></a>01357         c.x = globalPos.<a class="codeRef" href="qpoint.html#x">x</a>();
<a name="l01358"></a>01358         c.y = globalPos.<a class="codeRef" href="qpoint.html#y">y</a>();
<a name="l01359"></a>01359         c.width = width();
<a name="l01360"></a>01360         c.height = height();
<a name="l01361"></a>01361         c.border_width = 0;
<a name="l01362"></a>01362         c.above = None;
<a name="l01363"></a>01363         c.override_redirect = 0;
<a name="l01364"></a>01364         XSendEvent( qt_xdisplay(), c.event, <span class="keyword">true</span>, StructureNotifyMask, (XEvent*)&amp;c );
<a name="l01365"></a>01365 <span class="preprocessor">#endif</span>
<a name="l01366"></a>01366 <span class="preprocessor"></span>        <span class="comment">// Yes, this doesn&#39;t make sense at all. See the commit message.</span>
<a name="l01367"></a>01367         XSetWindowBorderWidth( qt_xdisplay(), window, 1 );
<a name="l01368"></a>01368         XSetWindowBorderWidth( qt_xdisplay(), window, 0 );
<a name="l01369"></a>01369     }
<a name="l01370"></a>01370 }
<a name="l01371"></a>01371 
<a name="l01372"></a>01372 <span class="comment">// L3000: One should not call QWidget::reparent after embedding a window.</span>
<a name="l01373"></a>01373 <span class="keywordtype">void</span> QXEmbed::reparent( <a class="codeRef" href="qwidget.html">QWidget</a> * parent, WFlags f, <span class="keyword">const</span> <a class="codeRef" href="qpoint.html">QPoint</a> &amp; p, <span class="keywordtype">bool</span> showIt )
<a name="l01374"></a>01374 {
<a name="l01375"></a>01375     <span class="comment">// QWidget::reparent() destroys the old X Window for the widget, and</span>
<a name="l01376"></a>01376     <span class="comment">// creates a new one, thus QXEmbed after reparenting is no longer the</span>
<a name="l01377"></a>01377     <span class="comment">// parent of the embedded window.  I think reparenting of QXEmbed can be</span>
<a name="l01378"></a>01378     <span class="comment">// done only by a mistake, so just complain.</span>
<a name="l01379"></a>01379     Q_ASSERT( !window );
<a name="l01380"></a>01380     <a class="codeRef" href="qwidget.html#reparent">QWidget::reparent</a>( parent, f, p, showIt );
<a name="l01381"></a>01381 }
<a name="l01382"></a>01382 
<a name="l01383"></a>01383 <span class="comment">// for KDE</span>
<a name="l01384"></a>01384 <span class="preprocessor">#include &quot;qxembed.moc&quot;</span>
<a name="l01385"></a>01385 <span class="preprocessor">#endif // Q_WS_X11</span>
</pre></div></div>
</div>
    </div></div>


      </td>
  </tr>
  <tr>
    <td valign="top" id="leftmenu" width="25%">
      <a name="navigation"></a>
      <div class="menu_box"><h2>kdeui</h2>
<div class="nav_list">
<ul><li><a href="index.html">Main Page</a></li><li><a href="namespaces.html">Namespace List</a></li><li><a href="hierarchy.html">Class Hierarchy</a></li><li><a href="classes.html">Alphabetical List</a></li><li><a href="annotated.html">Class List</a></li><li><a href="files.html">File List</a></li><li><a href="namespacemembers.html">Namespace Members</a></li><li><a href="functions.html">Class Members</a></li><li><a href="pages.html">Related Pages</a></li></ul>
<!--
<h2>Class Picker</h2>
<div style="text-align: center;">
<form name="guideform">
<select name="guidelinks" style="width:100%;" onChange="window.location=document.guideform.guidelinks.options[document.guideform.guidelinks.selectedIndex].value">
<option value="annotated.html">-- Choose --</option>
  <option value="classKAboutApplication.html">kaboutapplication</option>,  <option value="classKAboutContainer.html">kaboutcontainer</option>,  <option value="classKAboutContainerBase.html">kaboutcontainerbase</option>,  <option value="classKAboutContributor.html">kaboutcontributor</option>,  <option value="classKAboutDialog.html">kaboutdialog</option>,  <option value="classKAboutKDE.html">kaboutkde</option>,  <option value="classKAboutWidget.html">kaboutwidget</option>,  <option value="classKAccelGen_1_1Deref.html">kaccelgen::deref</option>,  <option value="classKAccelGen_1_1Deref__Key.html">kaccelgen::deref__key</option>,  <option value="classKAction.html">kaction</option>,  <option value="classKActionCollection.html">kactioncollection</option>,  <option value="classKActionMenu.html">kactionmenu</option>,  <option value="classKActionSelector.html">kactionselector</option>,  <option value="classKActiveLabel.html">kactivelabel</option>,  <option value="classKAnimWidget.html">kanimwidget</option>,  <option value="classKArrowButton.html">karrowbutton</option>,  <option value="classKAuthIcon.html">kauthicon</option>,  <option value="classKBugReport.html">kbugreport</option>,  <option value="classKButtonBox.html">kbuttonbox</option>,  <option value="classKCharSelect.html">kcharselect</option>,  <option value="classKCharSelectTable.html">kcharselecttable</option>,  <option value="classKCModule.html">kcmodule</option>,  <option value="classKColor.html">kcolor</option>,  <option value="classKColorButton.html">kcolorbutton</option>,  <option value="classKColorCells.html">kcolorcells</option>,  <option value="classKColorCombo.html">kcolorcombo</option>,  <option value="classKColorDialog.html">kcolordialog</option>,  <option value="classKColorDrag.html">kcolordrag</option>,  <option value="classKColorPatch.html">kcolorpatch</option>,  <option value="classKComboBox.html">kcombobox</option>,  <option value="classKCommand.html">kcommand</option>,  <option value="classKCommandHistory.html">kcommandhistory</option>,  <option value="classKCompletionBox.html">kcompletionbox</option>,  <option value="classKConfigDialog.html">kconfigdialog</option>,  <option value="classKContextMenuManager.html">kcontextmenumanager</option>,  <option value="classKCursor.html">kcursor</option>,  <option value="classKCursorPrivate.html">kcursorprivate</option>,  <option value="classKCursorPrivateAutoHideEventFilter.html">kcursorprivateautohideeventfilter</option>,  <option value="classKDateInternalMonthPicker.html">kdateinternalmonthpicker</option>,  <option value="classKDateInternalWeekSelector.html">kdateinternalweekselector</option>,  <option value="classKDateInternalYearSelector.html">kdateinternalyearselector</option>,  <option value="classKDatePicker.html">kdatepicker</option>,  <option value="classKDateTable.html">kdatetable</option>,  <option value="classKDateTimeWidget.html">kdatetimewidget</option>,  <option value="classKDateValidator.html">kdatevalidator</option>,  <option value="classKDateWidget.html">kdatewidget</option>,  <option value="classKDCOPActionProxy.html">kdcopactionproxy</option>,  <option value="classKDEPrivate_1_1ToolBarHandler.html">kdeprivate::toolbarhandler</option>,  <option value="classKDialog.html">kdialog</option>,  <option value="classKDialogBase.html">kdialogbase</option>,  <option value="classKDialogBaseButton.html">kdialogbasebutton</option>,  <option value="classKDialogBaseTile.html">kdialogbasetile</option>,  <option value="classKDictSpellingHighlighter.html">kdictspellinghighlighter</option>,  <option value="classKDockButton__Private.html">kdockbutton__private</option>,  <option value="classKDockMainWindow.html">kdockmainwindow</option>,  <option value="classKDockManager.html">kdockmanager</option>,  <option value="classKDockSplitter.html">kdocksplitter</option>,  <option value="classKDockTabGroup.html">kdocktabgroup</option>,  <option value="classKDockWidget.html">kdockwidget</option>,  <option value="classKDockWidgetAbstractHeader.html">kdockwidgetabstractheader</option>,  <option value="classKDockWidgetAbstractHeaderDrag.html">kdockwidgetabstractheaderdrag</option>,  <option value="classKDockWidgetHeader.html">kdockwidgetheader</option>,  <option value="classKDockWidgetHeaderDrag.html">kdockwidgetheaderdrag</option>,  <option value="classKDockWidgetPrivate.html">kdockwidgetprivate</option>,  <option value="classKDockWindow.html">kdockwindow</option>,  <option value="classKDoubleNumInput.html">kdoublenuminput</option>,  <option value="classKDoubleSpinBox.html">kdoublespinbox</option>,  <option value="classKDoubleValidator.html">kdoublevalidator</option>,  <option value="classKDualColorButton.html">kdualcolorbutton</option>,  <option value="classKEdit.html">kedit</option>,  <option value="classKEditListBox.html">keditlistbox</option>,  <option value="classKEditListBox_1_1CustomEditor.html">keditlistbox::customeditor</option>,  <option value="classKEditToolbar.html">kedittoolbar</option>,  <option value="classKEditToolbarWidget.html">kedittoolbarwidget</option>,  <option value="classKFloatValidator.html">kfloatvalidator</option>,  <option value="classKFontChooser.html">kfontchooser</option>,  <option value="classKFontCombo.html">kfontcombo</option>,  <option value="classKFontDialog.html">kfontdialog</option>,  <option value="classKFontRequester.html">kfontrequester</option>,  <option value="classKGradientSelector.html">kgradientselector</option>,  <option value="classKGuiItem.html">kguiitem</option>,  <option value="classKHelpMenu.html">khelpmenu</option>,  <option value="classKHistoryCombo.html">khistorycombo</option>,  <option value="classKHSSelector.html">khsselector</option>,  <option value="classKIconView.html">kiconview</option>,  <option value="classKIconViewItem.html">kiconviewitem</option>,  <option value="classKIconViewSearchLine.html">kiconviewsearchline</option>,  <option value="classKImageTrackLabel.html">kimagetracklabel</option>,  <option value="classKInputDialog.html">kinputdialog</option>,  <option value="classKIntNumInput.html">kintnuminput</option>,  <option value="classKIntSpinBox.html">kintspinbox</option>,  <option value="classKIntValidator.html">kintvalidator</option>,  <option value="classKJanusWidget.html">kjanuswidget</option>,  <option value="classKKeyButton.html">kkeybutton</option>,  <option value="classKKeyChooser.html">kkeychooser</option>,  <option value="classKKeyDialog.html">kkeydialog</option>,  <option value="classKLanguageButton.html">klanguagebutton</option>,  <option value="classKLed.html">kled</option>,  <option value="classKLineEdit.html">klineedit</option>,  <option value="classKLineEditDlg.html">klineeditdlg</option>,  <option value="classKListAction.html">klistaction</option>,  <option value="classKListBox.html">klistbox</option>,  <option value="classKListView.html">klistview</option>,  <option value="classKListViewItem.html">klistviewitem</option>,  <option value="classKListViewLineEdit.html">klistviewlineedit</option>,  <option value="classKListViewSearchLine.html">klistviewsearchline</option>,  <option value="classKListViewSearchLineWidget.html">klistviewsearchlinewidget</option>,  <option value="classKMacroCommand.html">kmacrocommand</option>,  <option value="classKMainWindow.html">kmainwindow</option>,  <option value="classKMainWindowInterface.html">kmainwindowinterface</option>,  <option value="classKMenuBar.html">kmenubar</option>,  <option value="classKMessageBox.html">kmessagebox</option>,  <option value="classKMimeTypeValidator.html">kmimetypevalidator</option>,  <option value="classKNamedCommand.html">knamedcommand</option>,  <option value="classKNumInput.html">knuminput</option>,  <option value="classKPaletteTable.html">kpalettetable</option>,  <option value="classKPanelApplet.html">kpanelapplet</option>,  <option value="classKPanelAppMenu.html">kpanelappmenu</option>,  <option value="classKPanelExtension.html">kpanelextension</option>,  <option value="classKPanelMenu.html">kpanelmenu</option>,  <option value="classKPassivePopup.html">kpassivepopup</option>,  <option value="classKPasswordDialog.html">kpassworddialog</option>,  <option value="classKPasswordEdit.html">kpasswordedit</option>,  <option value="classKPasteTextAction.html">kpastetextaction</option>,  <option value="classKPixmapIO.html">kpixmapio</option>,  <option value="classKPixmapRegionSelectorDialog.html">kpixmapregionselectordialog</option>,  <option value="classKPixmapRegionSelectorWidget.html">kpixmapregionselectorwidget</option>,  <option value="classKPopupFrame.html">kpopupframe</option>,  <option value="classKPopupMenu.html">kpopupmenu</option>,  <option value="classKPopupTitle.html">kpopuptitle</option>,  <option value="classKProgress.html">kprogress</option>,  <option value="classKProgressDialog.html">kprogressdialog</option>,  <option value="classKPushButton.html">kpushbutton</option>,  <option value="classKRadioAction.html">kradioaction</option>,  <option value="classKRecentFilesAction.html">krecentfilesaction</option>,  <option value="classKRestrictedLine.html">krestrictedline</option>,  <option value="classKRootPermsIcon.html">krootpermsicon</option>,  <option value="classKRootPixmap.html">krootpixmap</option>,  <option value="classKRuler.html">kruler</option>,  <option value="classKScrollView.html">kscrollview</option>,  <option value="classKSelectAction.html">kselectaction</option>,  <option value="classKSelector.html">kselector</option>,  <option value="classKSeparator.html">kseparator</option>,  <option value="classKShortcutDialog.html">kshortcutdialog</option>,  <option value="classKSpell.html">kspell</option>,  <option value="classKSpellConfig.html">kspellconfig</option>,  <option value="classKSplashScreen.html">ksplashscreen</option>,  <option value="classKSqueezedTextLabel.html">ksqueezedtextlabel</option>,  <option value="classKStatusBar.html">kstatusbar</option>,  <option value="classKStatusBarLabel.html">kstatusbarlabel</option>,  <option value="classKStdGuiItem.html">kstdguiitem</option>,  <option value="classKStringListValidator.html">kstringlistvalidator</option>,  <option value="classKSwitchLanguageDialog.html">kswitchlanguagedialog</option>,  <option value="classKSyntaxHighlighter.html">ksyntaxhighlighter</option>,  <option value="classKSystemTray.html">ksystemtray</option>,  <option value="classKTabBar.html">ktabbar</option>,  <option value="classKTabCtl.html">ktabctl</option>,  <option value="classKTabWidget.html">ktabwidget</option>,  <option value="classKTextBrowser.html">ktextbrowser</option>,  <option value="classKTextEdit.html">ktextedit</option>,  <option value="classKTimeWidget.html">ktimewidget</option>,  <option value="classKTimezoneWidget.html">ktimezonewidget</option>,  <option value="classKTipDatabase.html">ktipdatabase</option>,  <option value="classKTipDialog.html">ktipdialog</option>,  <option value="classKToggleAction.html">ktoggleaction</option>,  <option value="classKToggleFullScreenAction.html">ktogglefullscreenaction</option>,  <option value="classKToggleToolBarAction.html">ktoggletoolbaraction</option>,  <option value="classKToolBar.html">ktoolbar</option>,  <option value="classKToolBarButton.html">ktoolbarbutton</option>,  <option value="classKToolBarButtonList.html">ktoolbarbuttonlist</option>,  <option value="classKToolBarLabelAction.html">ktoolbarlabelaction</option>,  <option value="classKToolBarPopupAction.html">ktoolbarpopupaction</option>,  <option value="classKToolBarRadioGroup.html">ktoolbarradiogroup</option>,  <option value="classKURLLabel.html">kurllabel</option>,  <option value="classKValueSelector.html">kvalueselector</option>,  <option value="classKWidgetAction.html">kwidgetaction</option>,  <option value="classKWindowInfo.html">kwindowinfo</option>,  <option value="classKWizard.html">kwizard</option>,  <option value="classKWordWrap.html">kwordwrap</option>,  <option value="classKWritePermsIcon.html">kwritepermsicon</option>,  <option value="classKXMLGUIBuilder.html">kxmlguibuilder</option>,  <option value="classKXMLGUIClient.html">kxmlguiclient</option>,  <option value="classKXMLGUIFactory.html">kxmlguifactory</option>,  <option value="classKXYSelector.html">kxyselector</option>,
</select>
</form>
</div>
-->
</div></div>
<div class="menu_box"><h2>API Dox</h2>
<div class="nav_list">
<ul>
<li><a href="../../arts/html/index.html">arts</a></li><li><a href="../../dcop/html/index.html">dcop</a></li><li><a href="../../dnssd/html/index.html">dnssd</a></li><li><a href="../../interfaces/html/index.html">interfaces</a></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<a href="../../interfaces/kimproxy/interface/html/index.html">interface</a></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<a href="../../interfaces/kimproxy/library/html/index.html">library</a></li><li>&nbsp;&nbsp;<a href="../../interfaces/kspeech/html/index.html">kspeech</a></li><li>&nbsp;&nbsp;<a href="../../interfaces/ktexteditor/html/index.html">ktexteditor</a></li><li><a href="../../kabc/html/index.html">kabc</a></li><li><a href="../../kate/html/index.html">kate</a></li><li><a href="../../kcmshell/html/index.html">kcmshell</a></li><li><a href="../../kdecore/html/index.html">kdecore</a></li><li><a href="../../kded/html/index.html">kded</a></li><li><a href="../../kdefx/html/index.html">kdefx</a></li><li><a href="../../kdeprint/html/index.html">kdeprint</a></li><li><a href="../../kdesu/html/index.html">kdesu</a></li><li><a href="../../kdeui/html/index.html">kdeui</a></li><li><a href="../../kdoctools/html/index.html">kdoctools</a></li><li><a href="../../khtml/html/index.html">khtml</a></li><li><a href="../../kimgio/html/index.html">kimgio</a></li><li><a href="../../kinit/html/index.html">kinit</a></li><li><a href="../../kio/html/index.html">kio</a></li><li>&nbsp;&nbsp;<a href="../../kio/bookmarks/html/index.html">bookmarks</a></li><li>&nbsp;&nbsp;<a href="../../kio/httpfilter/html/index.html">httpfilter</a></li><li>&nbsp;&nbsp;<a href="../../kio/kfile/html/index.html">kfile</a></li><li>&nbsp;&nbsp;<a href="../../kio/kio/html/index.html">kio</a></li><li>&nbsp;&nbsp;<a href="../../kio/kioexec/html/index.html">kioexec</a></li><li>&nbsp;&nbsp;<a href="../../kio/kpasswdserver/html/index.html">kpasswdserver</a></li><li>&nbsp;&nbsp;<a href="../../kio/kssl/html/index.html">kssl</a></li><li><a href="../../kioslave/html/index.html">kioslave</a></li><li>&nbsp;&nbsp;<a href="../../kioslave/http/html/index.html">http</a></li><li><a href="../../kjs/html/index.html">kjs</a></li><li><a href="../../kmdi/html/index.html">kmdi</a></li><li>&nbsp;&nbsp;<a href="../../kmdi/kmdi/html/index.html">kmdi</a></li><li><a href="../../knewstuff/html/index.html">knewstuff</a></li><li><a href="../../kparts/html/index.html">kparts</a></li><li><a href="../../kresources/html/index.html">kresources</a></li><li><a href="../../kspell2/html/index.html">kspell2</a></li><li><a href="../../kunittest/html/index.html">kunittest</a></li><li><a href="../../kutils/html/index.html">kutils</a></li><li><a href="../../kwallet/html/index.html">kwallet</a></li><li><a href="../../libkmid/html/index.html">libkmid</a></li><li><a href="../../libkscreensaver/html/index.html">libkscreensaver</a></li>
</ul></div></div>


        </td>
</tr>
</table>

<span class="doNotDisplay">
  <a href="http://www.kde.org/" accesskey="8">KDE Home</a> |
  <a href="http://accessibility.kde.org/" accesskey="9">KDE Accessibility Home</a> |
  <a href="http://www.kde.org/media/accesskeys.php" accesskey="0">Description of Access Keys</a>
</span>


<div style="height: 8px"></div>

<div id="footer">
  <div id="footer_left">
    Maintained by <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;groo&#116;&#64;kde&#46;or&#x67;">Adriaan de Groot</a>
and
<a href="&#109;a&#105;&#108;&#116;&#111;&#58;w&#105;nter&#64;kde&#46;or&#x67">Allen Winter</a>.
<br/>
    KDE and K Desktop Environment are trademarks of <a href="http://www.kde.org/areas/kde-ev/" title="Homepage of the KDE non-profit Organization">KDE e.V.</a> |
    <a href="http://www.kde.org/contact/impressum.php">Legal</a>
  </div>
  <div id="footer_right"><img src="/media/images/footer_right.png" style="margin: 0px" alt="" /></div>
</div>

<!--
WARNING: DO NOT SEND MAIL TO THE FOLLOWING EMAIL ADDRESS! YOU WILL
BE BLOCKED INSTANTLY AND PERMANENTLY!
<a href="mailto:aaaatrap-425acc3b5374943f@kde.org">Block me</a>
WARNING END
-->

</body>
</html>