<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8"> <title>kwin Library: client.cpp Source File (kwin Library)</title> <link href="../../common/doxygen.css" rel="stylesheet" type="text/css"> </head> <div class="header"> <table border="0" cellspacing="0" cellpadding="0"> <tr> <td rowspan="2" width="92"> <a href="../../index.html" title="The API documentation main page"><img src="../../common/docheadergears.png" style="border:0px;" alt=""></a> </td> <td width="95%"> <h1>kwin Library API Documentation</h1> </td> </tr> <tr> <td valign="bottom"> <table class="links" border=0 cellspacing=0> <tr> <td><a href="index.html">Overview</a></td> <td><a href="hierarchy.html" title="Inheritance list, sorted roughly alphabetically">Class Hierarchy</a></td> <td><a href="classes.html" title="Alphabetical list of classes">Classes</a></td> <td><a href="annotated.html" title="Classes, structs, unions and interfaces with brief descriptions">Classes (annotated)</a></td> <td><a href="functions.html" title="Documented class members with links to the classes they belong to">Members</a></td> <td><a href="namespaces.html" title="All documented namespaces with brief descriptions">Namespaces</a></td> <td><a href="files.html" title="A list of all documented files with brief descriptions">Source Files</a></td> </tr> </table> </td></tr></table> </div> <div id="hgrad"></div> <div class="text"> <!-- Generated by Doxygen 1.4.4 --> <h1>client.cpp</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*****************************************************************</span> <a name="l00002"></a>00002 <span class="comment"> KWin - the KDE window manager</span> <a name="l00003"></a>00003 <span class="comment"> This file is part of the KDE project.</span> <a name="l00004"></a>00004 <span class="comment"></span> <a name="l00005"></a>00005 <span class="comment">Copyright (C) 1999, 2000 Matthias Ettrich <ettrich@kde.org></span> <a name="l00006"></a>00006 <span class="comment">Copyright (C) 2003 Lubos Lunak <l.lunak@kde.org></span> <a name="l00007"></a>00007 <span class="comment"></span> <a name="l00008"></a>00008 <span class="comment">You can Freely distribute this program under the GNU General Public</span> <a name="l00009"></a>00009 <span class="comment">License. See the file "COPYING" for the exact licensing terms.</span> <a name="l00010"></a>00010 <span class="comment">******************************************************************/</span> <a name="l00011"></a>00011 <a name="l00012"></a>00012 <span class="preprocessor">#include "client.h"</span> <a name="l00013"></a>00013 <a name="l00014"></a>00014 <span class="preprocessor">#include <qapplication.h></span> <a name="l00015"></a>00015 <span class="preprocessor">#include <qpainter.h></span> <a name="l00016"></a>00016 <span class="preprocessor">#include <qdatetime.h></span> <a name="l00017"></a>00017 <span class="preprocessor">#include <kprocess.h></span> <a name="l00018"></a>00018 <span class="preprocessor">#include <unistd.h></span> <a name="l00019"></a>00019 <span class="preprocessor">#include <kstandarddirs.h></span> <a name="l00020"></a>00020 <span class="preprocessor">#include <qwhatsthis.h></span> <a name="l00021"></a>00021 <span class="preprocessor">#include <kwin.h></span> <a name="l00022"></a>00022 <span class="preprocessor">#include <kiconloader.h></span> <a name="l00023"></a>00023 <span class="preprocessor">#include <stdlib.h></span> <a name="l00024"></a>00024 <a name="l00025"></a>00025 <span class="preprocessor">#include "bridge.h"</span> <a name="l00026"></a>00026 <span class="preprocessor">#include "group.h"</span> <a name="l00027"></a>00027 <span class="preprocessor">#include "workspace.h"</span> <a name="l00028"></a>00028 <span class="preprocessor">#include "atoms.h"</span> <a name="l00029"></a>00029 <span class="preprocessor">#include "notifications.h"</span> <a name="l00030"></a>00030 <span class="preprocessor">#include "rules.h"</span> <a name="l00031"></a>00031 <a name="l00032"></a>00032 <span class="preprocessor">#include <X11/extensions/shape.h></span> <a name="l00033"></a>00033 <a name="l00034"></a>00034 <span class="comment">// put all externs before the namespace statement to allow the linker</span> <a name="l00035"></a>00035 <span class="comment">// to resolve them properly</span> <a name="l00036"></a>00036 <a name="l00037"></a>00037 <span class="keyword">extern</span> Atom qt_wm_state; <a name="l00038"></a>00038 <span class="keyword">extern</span> Time qt_x_time; <a name="l00039"></a>00039 <span class="keyword">extern</span> Atom qt_window_role; <a name="l00040"></a>00040 <span class="keyword">extern</span> Atom qt_sm_client_id; <a name="l00041"></a>00041 <a name="l00042"></a>00042 <span class="keyword">namespace </span>KWinInternal <a name="l00043"></a>00043 { <a name="l00044"></a>00044 <a name="l00045"></a>00045 <span class="comment">/*</span> <a name="l00046"></a>00046 <span class="comment"></span> <a name="l00047"></a>00047 <span class="comment"> Creating a client:</span> <a name="l00048"></a>00048 <span class="comment"> - only by calling Workspace::createClient()</span> <a name="l00049"></a>00049 <span class="comment"> - it creates a new client and calls manage() for it</span> <a name="l00050"></a>00050 <span class="comment"></span> <a name="l00051"></a>00051 <span class="comment"> Destroying a client:</span> <a name="l00052"></a>00052 <span class="comment"> - destroyClient() - only when the window itself has been destroyed</span> <a name="l00053"></a>00053 <span class="comment"> - releaseWindow() - the window is kept, only the client itself is destroyed</span> <a name="l00054"></a>00054 <span class="comment"></span> <a name="l00055"></a>00055 <span class="comment">*/</span> <a name="l00056"></a>00056 <a name="l00057"></a>00057 <a name="l00069"></a><a class="code" href="classKWinInternal_1_1Client.html#a0">00069</a> <a class="code" href="classKWinInternal_1_1Client.html#a0">Client::Client</a>( <a class="code" href="classKWinInternal_1_1Workspace.html">Workspace</a> *ws ) <a name="l00070"></a>00070 : QObject( NULL ), <a name="l00071"></a>00071 client( None ), <a name="l00072"></a>00072 wrapper( None ), <a name="l00073"></a>00073 frame( None ), <a name="l00074"></a>00074 decoration( NULL ), <a name="l00075"></a>00075 wspace( ws ), <a name="l00076"></a>00076 bridge( new <a class="code" href="classKWinInternal_1_1Bridge.html">Bridge</a>( this )), <a name="l00077"></a>00077 move_faked_activity( false ), <a name="l00078"></a>00078 move_resize_grab_window( None ), <a name="l00079"></a>00079 transient_for( NULL ), <a name="l00080"></a>00080 transient_for_id( None ), <a name="l00081"></a>00081 original_transient_for_id( None ), <a name="l00082"></a>00082 in_group( NULL ), <a name="l00083"></a>00083 window_group( None ), <a name="l00084"></a>00084 in_layer( UnknownLayer ), <a name="l00085"></a>00085 ping_timer( NULL ), <a name="l00086"></a>00086 process_killer( NULL ), <a name="l00087"></a>00087 user_time( CurrentTime ), <span class="comment">// not known yet</span> <a name="l00088"></a>00088 allowed_actions( 0 ), <a name="l00089"></a>00089 postpone_geometry_updates( 0 ), <a name="l00090"></a>00090 pending_geometry_update( false ), <a name="l00091"></a>00091 shade_geometry_change( false ), <a name="l00092"></a>00092 border_left( 0 ), <a name="l00093"></a>00093 border_right( 0 ), <a name="l00094"></a>00094 border_top( 0 ), <a name="l00095"></a>00095 border_bottom( 0 ) <a name="l00096"></a>00096 <span class="comment">// SELI do all as initialization</span> <a name="l00097"></a>00097 { <a name="l00098"></a>00098 autoRaiseTimer = 0; <a name="l00099"></a>00099 shadeHoverTimer = 0; <a name="l00100"></a>00100 <a name="l00101"></a>00101 <span class="comment">// set the initial mapping state</span> <a name="l00102"></a>00102 mapping_state = WithdrawnState; <a name="l00103"></a>00103 desk = 0; <span class="comment">// no desktop yet</span> <a name="l00104"></a>00104 <a name="l00105"></a>00105 mode = PositionCenter; <a name="l00106"></a>00106 buttonDown = FALSE; <a name="l00107"></a>00107 moveResizeMode = FALSE; <a name="l00108"></a>00108 <a name="l00109"></a>00109 info = NULL; <a name="l00110"></a>00110 <a name="l00111"></a>00111 shade_mode = ShadeNone; <a name="l00112"></a>00112 active = FALSE; <a name="l00113"></a>00113 keep_above = FALSE; <a name="l00114"></a>00114 keep_below = FALSE; <a name="l00115"></a>00115 is_shape = FALSE; <a name="l00116"></a>00116 motif_noborder = <span class="keyword">false</span>; <a name="l00117"></a>00117 motif_may_move = TRUE; <a name="l00118"></a>00118 motif_may_resize = TRUE; <a name="l00119"></a>00119 motif_may_close = TRUE; <a name="l00120"></a>00120 fullscreen_mode = FullScreenNone; <a name="l00121"></a>00121 skip_taskbar = FALSE; <a name="l00122"></a>00122 original_skip_taskbar = <span class="keyword">false</span>; <a name="l00123"></a>00123 minimized = <span class="keyword">false</span>; <a name="l00124"></a>00124 hidden = <span class="keyword">false</span>; <a name="l00125"></a>00125 modal = <span class="keyword">false</span>; <a name="l00126"></a>00126 noborder = <span class="keyword">false</span>; <a name="l00127"></a>00127 user_noborder = <span class="keyword">false</span>; <a name="l00128"></a>00128 not_obscured = <span class="keyword">false</span>; <a name="l00129"></a>00129 urgency = <span class="keyword">false</span>; <a name="l00130"></a>00130 ignore_focus_stealing = <span class="keyword">false</span>; <a name="l00131"></a>00131 check_active_modal = <span class="keyword">false</span>; <a name="l00132"></a>00132 <a name="l00133"></a>00133 Pdeletewindow = 0; <a name="l00134"></a>00134 Ptakefocus = 0; <a name="l00135"></a>00135 Ptakeactivity = 0; <a name="l00136"></a>00136 Pcontexthelp = 0; <a name="l00137"></a>00137 Pping = 0; <a name="l00138"></a>00138 input = FALSE; <a name="l00139"></a>00139 skip_pager = FALSE; <a name="l00140"></a>00140 <a name="l00141"></a>00141 max_mode = <a class="code" href="classKDecorationDefines.html#w71w9">MaximizeRestore</a>; <a name="l00142"></a>00142 <a name="l00143"></a>00143 cmap = None; <a name="l00144"></a>00144 <a name="l00145"></a>00145 frame_geometry = QRect( 0, 0, 100, 100 ); <span class="comment">// so that decorations don't start with size being (0,0)</span> <a name="l00146"></a>00146 client_size = QSize( 100, 100 ); <a name="l00147"></a>00147 custom_opacity = <span class="keyword">false</span>; <a name="l00148"></a>00148 rule_opacity_active = 0;; <span class="comment">//translucency rules</span> <a name="l00149"></a>00149 rule_opacity_inactive = 0; <span class="comment">//dito.</span> <a name="l00150"></a>00150 <a name="l00151"></a>00151 <span class="comment">// SELI initialize xsizehints??</span> <a name="l00152"></a>00152 } <a name="l00153"></a>00153 <a name="l00157"></a>00157 Client::~Client() <a name="l00158"></a>00158 { <a name="l00159"></a>00159 assert(!moveResizeMode); <a name="l00160"></a>00160 assert( client == None ); <a name="l00161"></a>00161 assert( frame == None && wrapper == None ); <a name="l00162"></a>00162 assert( decoration == NULL ); <a name="l00163"></a>00163 assert( postpone_geometry_updates == 0 ); <a name="l00164"></a>00164 assert( !check_active_modal ); <a name="l00165"></a>00165 <span class="keyword">delete</span> info; <a name="l00166"></a>00166 <span class="keyword">delete</span> bridge; <a name="l00167"></a>00167 } <a name="l00168"></a>00168 <a name="l00169"></a>00169 <span class="comment">// use destroyClient() or releaseWindow(), Client instances cannot be deleted directly</span> <a name="l00170"></a><a class="code" href="classKWinInternal_1_1Client.html#e5">00170</a> <span class="keywordtype">void</span> <a class="code" href="classKWinInternal_1_1Client.html#e5">Client::deleteClient</a>( <a class="code" href="classKWinInternal_1_1Client.html">Client</a>* c, <a class="code" href="namespaceKWinInternal.html#a120">allowed_t</a> ) <a name="l00171"></a>00171 { <a name="l00172"></a>00172 <span class="keyword">delete</span> c; <a name="l00173"></a>00173 } <a name="l00174"></a>00174 <a name="l00178"></a><a class="code" href="classKWinInternal_1_1Client.html#a36">00178</a> <span class="keywordtype">void</span> <a class="code" href="classKWinInternal_1_1Client.html#a36">Client::releaseWindow</a>( <span class="keywordtype">bool</span> on_shutdown ) <a name="l00179"></a>00179 { <a name="l00180"></a>00180 <a class="code" href="classKWinInternal_1_1StackingUpdatesBlocker.html">StackingUpdatesBlocker</a> blocker( <a class="code" href="classKWinInternal_1_1Client.html#a5">workspace</a>()); <a name="l00181"></a>00181 <span class="keywordflow">if</span> (!custom_opacity) <a class="code" href="classKWinInternal_1_1Client.html#a161">setOpacity</a>(FALSE); <a name="l00182"></a>00182 <span class="keywordflow">if</span> (moveResizeMode) <a name="l00183"></a>00183 leaveMoveResize(); <a name="l00184"></a>00184 finishWindowRules(); <a name="l00185"></a>00185 ++postpone_geometry_updates; <a name="l00186"></a>00186 setMappingState( WithdrawnState ); <a name="l00187"></a>00187 <a class="code" href="classKWinInternal_1_1Client.html#a81">setModal</a>( <span class="keyword">false</span> ); <span class="comment">// otherwise its mainwindow wouldn't get focus</span> <a name="l00188"></a>00188 hidden = <span class="keyword">true</span>; <span class="comment">// so that it's not considered visible anymore (can't use hideClient(), it would set flags)</span> <a name="l00189"></a>00189 <span class="keywordflow">if</span>( !on_shutdown ) <a name="l00190"></a>00190 <a class="code" href="classKWinInternal_1_1Client.html#a5">workspace</a>()-><a class="code" href="classKWinInternal_1_1Workspace.html#a42">clientHidden</a>( <span class="keyword">this</span> ); <a name="l00191"></a>00191 XUnmapWindow( qt_xdisplay(), <a class="code" href="classKWinInternal_1_1Client.html#a2">frameId</a>()); <span class="comment">// destroying decoration would cause ugly visual effect</span> <a name="l00192"></a>00192 destroyDecoration(); <a name="l00193"></a>00193 cleanGrouping(); <a name="l00194"></a>00194 <span class="keywordflow">if</span>( !on_shutdown ) <a name="l00195"></a>00195 { <a name="l00196"></a>00196 <a class="code" href="classKWinInternal_1_1Client.html#a5">workspace</a>()-><a class="code" href="classKWinInternal_1_1Workspace.html#a90">removeClient</a>( <span class="keyword">this</span>, Allowed ); <a name="l00197"></a>00197 <span class="comment">// only when the window is being unmapped, not when closing down KWin</span> <a name="l00198"></a>00198 <span class="comment">// (NETWM sections 5.5,5.7)</span> <a name="l00199"></a>00199 info->setDesktop( 0 ); <a name="l00200"></a>00200 desk = 0; <a name="l00201"></a>00201 info->setState( 0, info->state()); <span class="comment">// reset all state flags</span> <a name="l00202"></a>00202 } <a name="l00203"></a>00203 XDeleteProperty( qt_xdisplay(), client, <a class="code" href="namespaceKWinInternal.html#a0">atoms</a>-><a class="code" href="classKWinInternal_1_1Atoms.html#o11">kde_net_wm_user_creation_time</a>); <a name="l00204"></a>00204 <span class="comment">// TODO remove KDEFrameStrut property</span> <a name="l00205"></a>00205 XReparentWindow( qt_xdisplay(), client, <a class="code" href="classKWinInternal_1_1Client.html#a5">workspace</a>()->rootWin(), <a class="code" href="classKWinInternal_1_1Client.html#a27">x</a>(), <a class="code" href="classKWinInternal_1_1Client.html#a28">y</a>()); <a name="l00206"></a>00206 XRemoveFromSaveSet( qt_xdisplay(), client ); <a name="l00207"></a>00207 XSelectInput( qt_xdisplay(), client, NoEventMask ); <a name="l00208"></a>00208 <span class="keywordflow">if</span>( on_shutdown ) <a name="l00209"></a>00209 { <span class="comment">// map the window, so it can be found after another WM is started</span> <a name="l00210"></a>00210 XMapWindow( qt_xdisplay(), client ); <a name="l00211"></a>00211 <span class="comment">// TODO preserve minimized, shaded etc. state?</span> <a name="l00212"></a>00212 } <a name="l00213"></a>00213 <span class="keywordflow">else</span> <a name="l00214"></a>00214 { <a name="l00215"></a>00215 <span class="comment">// Make sure it's not mapped if the app unmapped it (#65279). The app</span> <a name="l00216"></a>00216 <span class="comment">// may do map+unmap before we initially map the window by calling rawShow() from manage().</span> <a name="l00217"></a>00217 XUnmapWindow( qt_xdisplay(), client ); <a name="l00218"></a>00218 } <a name="l00219"></a>00219 client = None; <a name="l00220"></a>00220 XDestroyWindow( qt_xdisplay(), wrapper ); <a name="l00221"></a>00221 wrapper = None; <a name="l00222"></a>00222 XDestroyWindow( qt_xdisplay(), frame ); <a name="l00223"></a>00223 frame = None; <a name="l00224"></a>00224 --postpone_geometry_updates; <span class="comment">// don't use GeometryUpdatesBlocker, it would now set the geometry</span> <a name="l00225"></a>00225 <a class="code" href="classKWinInternal_1_1Client.html#e5">deleteClient</a>( <span class="keyword">this</span>, Allowed ); <a name="l00226"></a>00226 } <a name="l00227"></a>00227 <a name="l00228"></a>00228 <span class="comment">// like releaseWindow(), but this one is called when the window has been already destroyed</span> <a name="l00229"></a>00229 <span class="comment">// (e.g. the application closed it)</span> <a name="l00230"></a><a class="code" href="classKWinInternal_1_1Client.html#a159">00230</a> <span class="keywordtype">void</span> <a class="code" href="classKWinInternal_1_1Client.html#a159">Client::destroyClient</a>() <a name="l00231"></a>00231 { <a name="l00232"></a>00232 <a class="code" href="classKWinInternal_1_1StackingUpdatesBlocker.html">StackingUpdatesBlocker</a> blocker( <a class="code" href="classKWinInternal_1_1Client.html#a5">workspace</a>()); <a name="l00233"></a>00233 <span class="keywordflow">if</span> (moveResizeMode) <a name="l00234"></a>00234 leaveMoveResize(); <a name="l00235"></a>00235 finishWindowRules(); <a name="l00236"></a>00236 ++postpone_geometry_updates; <a name="l00237"></a>00237 <a class="code" href="classKWinInternal_1_1Client.html#a81">setModal</a>( <span class="keyword">false</span> ); <a name="l00238"></a>00238 hidden = <span class="keyword">true</span>; <span class="comment">// so that it's not considered visible anymore</span> <a name="l00239"></a>00239 <a class="code" href="classKWinInternal_1_1Client.html#a5">workspace</a>()-><a class="code" href="classKWinInternal_1_1Workspace.html#a42">clientHidden</a>( <span class="keyword">this</span> ); <a name="l00240"></a>00240 destroyDecoration(); <a name="l00241"></a>00241 cleanGrouping(); <a name="l00242"></a>00242 <a class="code" href="classKWinInternal_1_1Client.html#a5">workspace</a>()-><a class="code" href="classKWinInternal_1_1Workspace.html#a90">removeClient</a>( <span class="keyword">this</span>, Allowed ); <a name="l00243"></a>00243 client = None; <span class="comment">// invalidate</span> <a name="l00244"></a>00244 XDestroyWindow( qt_xdisplay(), wrapper ); <a name="l00245"></a>00245 wrapper = None; <a name="l00246"></a>00246 XDestroyWindow( qt_xdisplay(), frame ); <a name="l00247"></a>00247 frame = None; <a name="l00248"></a>00248 --postpone_geometry_updates; <span class="comment">// don't use GeometryUpdatesBlocker, it would now set the geometry</span> <a name="l00249"></a>00249 <a class="code" href="classKWinInternal_1_1Client.html#e5">deleteClient</a>( <span class="keyword">this</span>, Allowed ); <a name="l00250"></a>00250 } <a name="l00251"></a>00251 <a name="l00252"></a><a class="code" href="classKWinInternal_1_1Client.html#a105">00252</a> <span class="keywordtype">void</span> <a class="code" href="classKWinInternal_1_1Client.html#a105">Client::updateDecoration</a>( <span class="keywordtype">bool</span> check_workspace_pos, <span class="keywordtype">bool</span> force ) <a name="l00253"></a>00253 { <a name="l00254"></a>00254 <span class="keywordflow">if</span>( !force && (( decoration == NULL && <a class="code" href="classKWinInternal_1_1Client.html#a69">noBorder</a>()) <a name="l00255"></a>00255 || ( decoration != NULL && !<a class="code" href="classKWinInternal_1_1Client.html#a69">noBorder</a>()))) <a name="l00256"></a>00256 <span class="keywordflow">return</span>; <a name="l00257"></a>00257 <span class="keywordtype">bool</span> do_show = <span class="keyword">false</span>; <a name="l00258"></a>00258 postponeGeometryUpdates( <span class="keyword">true</span> ); <a name="l00259"></a>00259 <span class="keywordflow">if</span>( force ) <a name="l00260"></a>00260 destroyDecoration(); <a name="l00261"></a>00261 <span class="keywordflow">if</span>( !<a class="code" href="classKWinInternal_1_1Client.html#a69">noBorder</a>()) <a name="l00262"></a>00262 { <a name="l00263"></a>00263 decoration = <a class="code" href="classKWinInternal_1_1Client.html#a5">workspace</a>()-><a class="code" href="classKWinInternal_1_1Workspace.html#a3">createDecoration</a>( bridge ); <a name="l00264"></a>00264 <span class="comment">// TODO check decoration's minimum size?</span> <a name="l00265"></a>00265 decoration-><a class="code" href="classKDecoration.html#a35">init</a>(); <a name="l00266"></a>00266 decoration->widget()->installEventFilter( <span class="keyword">this</span> ); <a name="l00267"></a>00267 XReparentWindow( qt_xdisplay(), decoration->widget()->winId(), <a class="code" href="classKWinInternal_1_1Client.html#a2">frameId</a>(), 0, 0 ); <a name="l00268"></a>00268 decoration->widget()->lower(); <a name="l00269"></a>00269 decoration->borders( border_left, border_right, border_top, border_bottom ); <a name="l00270"></a>00270 setXTitleHeightProperty(border_top); <a name="l00271"></a>00271 <span class="keywordtype">int</span> save_workarea_diff_x = workarea_diff_x; <a name="l00272"></a>00272 <span class="keywordtype">int</span> save_workarea_diff_y = workarea_diff_y; <a name="l00273"></a>00273 <a class="code" href="classKWinInternal_1_1Client.html#a111">move</a>( <a class="code" href="classKWinInternal_1_1Client.html#a141">calculateGravitation</a>( <span class="keyword">false</span> )); <a name="l00274"></a>00274 <a class="code" href="classKWinInternal_1_1Client.html#a113">plainResize</a>( sizeForClientSize( <a class="code" href="classKWinInternal_1_1Client.html#a32">clientSize</a>()), ForceGeometrySet ); <a name="l00275"></a>00275 workarea_diff_x = save_workarea_diff_x; <a name="l00276"></a>00276 workarea_diff_y = save_workarea_diff_y; <a name="l00277"></a>00277 do_show = <span class="keyword">true</span>; <a name="l00278"></a>00278 } <a name="l00279"></a>00279 <span class="keywordflow">else</span> <a name="l00280"></a>00280 destroyDecoration(); <a name="l00281"></a>00281 <span class="keywordflow">if</span>( check_workspace_pos ) <a name="l00282"></a>00282 <a class="code" href="classKWinInternal_1_1Client.html#a146">checkWorkspacePosition</a>(); <a name="l00283"></a>00283 postponeGeometryUpdates( <span class="keyword">false</span> ); <a name="l00284"></a>00284 <span class="keywordflow">if</span>( do_show ) <a name="l00285"></a>00285 decoration->widget()->show(); <a name="l00286"></a>00286 updateFrameStrut(); <a name="l00287"></a>00287 } <a name="l00288"></a>00288 <a name="l00289"></a>00289 <span class="keywordtype">void</span> Client::destroyDecoration() <a name="l00290"></a>00290 { <a name="l00291"></a>00291 <span class="keywordflow">if</span>( decoration != NULL ) <a name="l00292"></a>00292 { <a name="l00293"></a>00293 <span class="keyword">delete</span> decoration; <a name="l00294"></a>00294 decoration = NULL; <a name="l00295"></a>00295 QPoint grav = <a class="code" href="classKWinInternal_1_1Client.html#a141">calculateGravitation</a>( <span class="keyword">true</span> ); <a name="l00296"></a>00296 border_left = border_right = border_top = border_bottom = 0; <a name="l00297"></a>00297 <a class="code" href="classKWinInternal_1_1Client.html#a103">setMask</a>( QRegion()); <span class="comment">// reset shape mask</span> <a name="l00298"></a>00298 <span class="keywordtype">int</span> save_workarea_diff_x = workarea_diff_x; <a name="l00299"></a>00299 <span class="keywordtype">int</span> save_workarea_diff_y = workarea_diff_y; <a name="l00300"></a>00300 <a class="code" href="classKWinInternal_1_1Client.html#a113">plainResize</a>( sizeForClientSize( <a class="code" href="classKWinInternal_1_1Client.html#a32">clientSize</a>()), ForceGeometrySet ); <a name="l00301"></a>00301 <a class="code" href="classKWinInternal_1_1Client.html#a111">move</a>( grav ); <a name="l00302"></a>00302 workarea_diff_x = save_workarea_diff_x; <a name="l00303"></a>00303 workarea_diff_y = save_workarea_diff_y; <a name="l00304"></a>00304 } <a name="l00305"></a>00305 } <a name="l00306"></a>00306 <a name="l00307"></a><a class="code" href="classKWinInternal_1_1Client.html#a106">00307</a> <span class="keywordtype">void</span> <a class="code" href="classKWinInternal_1_1Client.html#a106">Client::checkBorderSizes</a>() <a name="l00308"></a>00308 { <a name="l00309"></a>00309 <span class="keywordflow">if</span>( decoration == NULL ) <a name="l00310"></a>00310 <span class="keywordflow">return</span>; <a name="l00311"></a>00311 <span class="keywordtype">int</span> new_left, new_right, new_top, new_bottom; <a name="l00312"></a>00312 decoration-><a class="code" href="classKDecoration.html#a37">borders</a>( new_left, new_right, new_top, new_bottom ); <a name="l00313"></a>00313 <span class="keywordflow">if</span>( new_left == border_left && new_right == border_right <a name="l00314"></a>00314 && new_top == border_top && new_bottom == border_bottom ) <a name="l00315"></a>00315 <span class="keywordflow">return</span>; <a name="l00316"></a>00316 <a class="code" href="classKWinInternal_1_1GeometryUpdatesPostponer.html">GeometryUpdatesPostponer</a> blocker( <span class="keyword">this</span> ); <a name="l00317"></a>00317 <a class="code" href="classKWinInternal_1_1Client.html#a111">move</a>( <a class="code" href="classKWinInternal_1_1Client.html#a141">calculateGravitation</a>( <span class="keyword">true</span> )); <a name="l00318"></a>00318 border_left = new_left; <a name="l00319"></a>00319 border_right = new_right; <a name="l00320"></a>00320 <span class="keywordflow">if</span> (border_top != new_top) <a name="l00321"></a>00321 setXTitleHeightProperty(new_top); <a name="l00322"></a>00322 border_top = new_top; <a name="l00323"></a>00323 border_bottom = new_bottom; <a name="l00324"></a>00324 <a class="code" href="classKWinInternal_1_1Client.html#a111">move</a>( <a class="code" href="classKWinInternal_1_1Client.html#a141">calculateGravitation</a>( <span class="keyword">false</span> )); <a name="l00325"></a>00325 <a class="code" href="classKWinInternal_1_1Client.html#a113">plainResize</a>( sizeForClientSize( <a class="code" href="classKWinInternal_1_1Client.html#a32">clientSize</a>()), ForceGeometrySet ); <a name="l00326"></a>00326 <a class="code" href="classKWinInternal_1_1Client.html#a146">checkWorkspacePosition</a>(); <a name="l00327"></a>00327 } <a name="l00328"></a>00328 <a name="l00329"></a>00329 <span class="keywordtype">void</span> Client::detectNoBorder() <a name="l00330"></a>00330 { <a name="l00331"></a>00331 <span class="keywordflow">if</span>( <a class="code" href="classKWinInternal_1_1Shape.html#e1">Shape::hasShape</a>( <a class="code" href="classKWinInternal_1_1Client.html#a1">window</a>())) <a name="l00332"></a>00332 { <a name="l00333"></a>00333 noborder = <span class="keyword">true</span>; <a name="l00334"></a>00334 <span class="keywordflow">return</span>; <a name="l00335"></a>00335 } <a name="l00336"></a>00336 <span class="keywordflow">switch</span>( <a class="code" href="classKWinInternal_1_1Client.html#a19">windowType</a>()) <a name="l00337"></a>00337 { <a name="l00338"></a>00338 <span class="keywordflow">case</span> NET::Desktop : <a name="l00339"></a>00339 <span class="keywordflow">case</span> NET::Dock : <a name="l00340"></a>00340 <span class="keywordflow">case</span> NET::TopMenu : <a name="l00341"></a>00341 <span class="keywordflow">case</span> NET::Override : <a name="l00342"></a>00342 <span class="keywordflow">case</span> NET::Splash : <a name="l00343"></a>00343 noborder = <span class="keyword">true</span>; <a name="l00344"></a>00344 <span class="keywordflow">break</span>; <a name="l00345"></a>00345 <span class="keywordflow">case</span> NET::Unknown : <a name="l00346"></a>00346 <span class="keywordflow">case</span> NET::Normal : <a name="l00347"></a>00347 <span class="keywordflow">case</span> NET::Toolbar : <a name="l00348"></a>00348 <span class="keywordflow">case</span> NET::Menu : <a name="l00349"></a>00349 <span class="keywordflow">case</span> NET::Dialog : <a name="l00350"></a>00350 <span class="keywordflow">case</span> NET::Utility : <a name="l00351"></a>00351 noborder = <span class="keyword">false</span>; <a name="l00352"></a>00352 <a class="code" href="classKWinInternal_1_1Client.html#a176">setShapable</a>(FALSE); <a name="l00353"></a>00353 <span class="keywordflow">break</span>; <a name="l00354"></a>00354 <span class="keywordflow">default</span>: <a name="l00355"></a>00355 assert( <span class="keyword">false</span> ); <a name="l00356"></a>00356 } <a name="l00357"></a>00357 } <a name="l00358"></a>00358 <a name="l00359"></a>00359 <span class="keywordtype">void</span> Client::updateFrameStrut() <a name="l00360"></a>00360 { <a name="l00361"></a>00361 <span class="comment">// TODO KDEFrameStrut je ale pitome jmeno</span> <a name="l00362"></a>00362 NETStrut strut; <a name="l00363"></a>00363 strut.left = border_left; <a name="l00364"></a>00364 strut.right = border_right; <a name="l00365"></a>00365 strut.top = border_top; <a name="l00366"></a>00366 strut.bottom = border_bottom; <a name="l00367"></a>00367 info->setKDEFrameStrut( strut ); <a name="l00368"></a>00368 } <a name="l00369"></a>00369 <a name="l00370"></a>00370 <span class="comment">// Resizes the decoration, and makes sure the decoration widget gets resize event</span> <a name="l00371"></a>00371 <span class="comment">// even if the size hasn't changed. This is needed to make sure the decoration</span> <a name="l00372"></a>00372 <span class="comment">// re-layouts (e.g. when options()->moveResizeMaximizedWindows() changes,</span> <a name="l00373"></a>00373 <span class="comment">// the decoration may turn on/off some borders, but the actual size</span> <a name="l00374"></a>00374 <span class="comment">// of the decoration stays the same).</span> <a name="l00375"></a>00375 <span class="keywordtype">void</span> Client::resizeDecoration( <span class="keyword">const</span> QSize& s ) <a name="l00376"></a>00376 { <a name="l00377"></a>00377 <span class="keywordflow">if</span>( decoration == NULL ) <a name="l00378"></a>00378 <span class="keywordflow">return</span>; <a name="l00379"></a>00379 QSize oldsize = decoration-><a class="code" href="classKDecoration.html#a55">widget</a>()->size(); <a name="l00380"></a>00380 decoration-><a class="code" href="classKDecoration.html#a38">resize</a>( s ); <a name="l00381"></a>00381 <span class="keywordflow">if</span>( oldsize == s ) <a name="l00382"></a>00382 { <a name="l00383"></a>00383 QResizeEvent e( s, oldsize ); <a name="l00384"></a>00384 QApplication::sendEvent( decoration-><a class="code" href="classKDecoration.html#a55">widget</a>(), &e ); <a name="l00385"></a>00385 } <a name="l00386"></a>00386 } <a name="l00387"></a>00387 <a name="l00388"></a><a class="code" href="classKWinInternal_1_1Client.html#a69">00388</a> <span class="keywordtype">bool</span> <a class="code" href="classKWinInternal_1_1Client.html#a69">Client::noBorder</a>()<span class="keyword"> const</span> <a name="l00389"></a>00389 <span class="keyword"> </span>{ <a name="l00390"></a>00390 <span class="keywordflow">return</span> noborder || <a class="code" href="classKWinInternal_1_1Client.html#a61">isFullScreen</a>() || user_noborder || motif_noborder; <a name="l00391"></a>00391 } <a name="l00392"></a>00392 <a name="l00393"></a><a class="code" href="classKWinInternal_1_1Client.html#a68">00393</a> <span class="keywordtype">bool</span> <a class="code" href="classKWinInternal_1_1Client.html#a68">Client::userCanSetNoBorder</a>()<span class="keyword"> const</span> <a name="l00394"></a>00394 <span class="keyword"> </span>{ <a name="l00395"></a>00395 <span class="keywordflow">return</span> !noborder && !<a class="code" href="classKWinInternal_1_1Client.html#a61">isFullScreen</a>() && !<a class="code" href="classKWinInternal_1_1Client.html#a50">isShade</a>(); <a name="l00396"></a>00396 } <a name="l00397"></a>00397 <a name="l00398"></a><a class="code" href="classKWinInternal_1_1Client.html#a66">00398</a> <span class="keywordtype">bool</span> <a class="code" href="classKWinInternal_1_1Client.html#a66">Client::isUserNoBorder</a>()<span class="keyword"> const</span> <a name="l00399"></a>00399 <span class="keyword"> </span>{ <a name="l00400"></a>00400 <span class="keywordflow">return</span> user_noborder; <a name="l00401"></a>00401 } <a name="l00402"></a>00402 <a name="l00403"></a><a class="code" href="classKWinInternal_1_1Client.html#a67">00403</a> <span class="keywordtype">void</span> <a class="code" href="classKWinInternal_1_1Client.html#a67">Client::setUserNoBorder</a>( <span class="keywordtype">bool</span> set ) <a name="l00404"></a>00404 { <a name="l00405"></a>00405 <span class="keywordflow">if</span>( !<a class="code" href="classKWinInternal_1_1Client.html#a68">userCanSetNoBorder</a>()) <a name="l00406"></a>00406 <span class="keywordflow">return</span>; <a name="l00407"></a>00407 set = <a class="code" href="classKWinInternal_1_1Client.html#a20">rules</a>()-><a class="code" href="classKWinInternal_1_1WindowRules.html#a23">checkNoBorder</a>( set ); <a name="l00408"></a>00408 <span class="keywordflow">if</span>( user_noborder == set ) <a name="l00409"></a>00409 <span class="keywordflow">return</span>; <a name="l00410"></a>00410 user_noborder = set; <a name="l00411"></a>00411 <a class="code" href="classKWinInternal_1_1Client.html#a105">updateDecoration</a>( <span class="keyword">true</span>, <span class="keyword">false</span> ); <a name="l00412"></a>00412 updateWindowRules(); <a name="l00413"></a>00413 } <a name="l00414"></a>00414 <a name="l00415"></a><a class="code" href="classKWinInternal_1_1Client.html#a108">00415</a> <span class="keywordtype">void</span> <a class="code" href="classKWinInternal_1_1Client.html#a108">Client::updateShape</a>() <a name="l00416"></a>00416 { <a name="l00417"></a>00417 <a class="code" href="classKWinInternal_1_1Client.html#a176">setShapable</a>(TRUE); <a name="l00418"></a>00418 <span class="keywordflow">if</span> ( <a class="code" href="classKWinInternal_1_1Client.html#a107">shape</a>() ) <a name="l00419"></a>00419 { <a name="l00420"></a>00420 XShapeCombineShape(qt_xdisplay(), <a class="code" href="classKWinInternal_1_1Client.html#a2">frameId</a>(), ShapeBounding, <a name="l00421"></a>00421 <a class="code" href="classKWinInternal_1_1Client.html#a31">clientPos</a>().<a class="code" href="classKWinInternal_1_1Client.html#a27">x</a>(), <a class="code" href="classKWinInternal_1_1Client.html#a31">clientPos</a>().<a class="code" href="classKWinInternal_1_1Client.html#a28">y</a>(), <a name="l00422"></a>00422 <a class="code" href="classKWinInternal_1_1Client.html#a1">window</a>(), ShapeBounding, ShapeSet); <a name="l00423"></a>00423 } <a name="l00424"></a>00424 <span class="keywordflow">else</span> <a name="l00425"></a>00425 { <a name="l00426"></a>00426 XShapeCombineMask( qt_xdisplay(), <a class="code" href="classKWinInternal_1_1Client.html#a2">frameId</a>(), ShapeBounding, 0, 0, <a name="l00427"></a>00427 None, ShapeSet); <a name="l00428"></a>00428 } <a name="l00429"></a>00429 <span class="comment">// workaround for #19644 - shaped windows shouldn't have decoration</span> <a name="l00430"></a>00430 <span class="keywordflow">if</span>( <a class="code" href="classKWinInternal_1_1Client.html#a107">shape</a>() && !<a class="code" href="classKWinInternal_1_1Client.html#a69">noBorder</a>()) <a name="l00431"></a>00431 { <a name="l00432"></a>00432 noborder = <span class="keyword">true</span>; <a name="l00433"></a>00433 <a class="code" href="classKWinInternal_1_1Client.html#a105">updateDecoration</a>( <span class="keyword">true</span> ); <a name="l00434"></a>00434 } <a name="l00435"></a>00435 } <a name="l00436"></a>00436 <a name="l00437"></a><a class="code" href="classKWinInternal_1_1Client.html#a103">00437</a> <span class="keywordtype">void</span> <a class="code" href="classKWinInternal_1_1Client.html#a103">Client::setMask</a>( <span class="keyword">const</span> QRegion& reg, <span class="keywordtype">int</span> mode ) <a name="l00438"></a>00438 { <a name="l00439"></a>00439 _mask = reg; <a name="l00440"></a>00440 <span class="keywordflow">if</span>( reg.isNull()) <a name="l00441"></a>00441 XShapeCombineMask( qt_xdisplay(), <a class="code" href="classKWinInternal_1_1Client.html#a2">frameId</a>(), ShapeBounding, 0, 0, <a name="l00442"></a>00442 None, ShapeSet ); <a name="l00443"></a>00443 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( mode == X::Unsorted ) <a name="l00444"></a>00444 XShapeCombineRegion( qt_xdisplay(), <a class="code" href="classKWinInternal_1_1Client.html#a2">frameId</a>(), ShapeBounding, 0, 0, <a name="l00445"></a>00445 reg.handle(), ShapeSet ); <a name="l00446"></a>00446 <span class="keywordflow">else</span> <a name="l00447"></a>00447 { <a name="l00448"></a>00448 QMemArray< QRect > rects = reg.rects(); <a name="l00449"></a>00449 XRectangle* xrects = <span class="keyword">new</span> XRectangle[ rects.count() ]; <a name="l00450"></a>00450 <span class="keywordflow">for</span>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; <a name="l00451"></a>00451 i < rects.count(); <a name="l00452"></a>00452 ++i ) <a name="l00453"></a>00453 { <a name="l00454"></a>00454 xrects[ i ].x = rects[ i ].x(); <a name="l00455"></a>00455 xrects[ i ].y = rects[ i ].y(); <a name="l00456"></a>00456 xrects[ i ].width = rects[ i ].width(); <a name="l00457"></a>00457 xrects[ i ].height = rects[ i ].height(); <a name="l00458"></a>00458 } <a name="l00459"></a>00459 XShapeCombineRectangles( qt_xdisplay(), <a class="code" href="classKWinInternal_1_1Client.html#a2">frameId</a>(), ShapeBounding, 0, 0, <a name="l00460"></a>00460 xrects, rects.count(), ShapeSet, mode ); <a name="l00461"></a>00461 <span class="keyword">delete</span>[] xrects; <a name="l00462"></a>00462 } <a name="l00463"></a>00463 } <a name="l00464"></a>00464 <a name="l00465"></a><a class="code" href="classKWinInternal_1_1Client.html#a104">00465</a> QRegion <a class="code" href="classKWinInternal_1_1Client.html#a104">Client::mask</a>()<span class="keyword"> const</span> <a name="l00466"></a>00466 <span class="keyword"> </span>{ <a name="l00467"></a>00467 <span class="keywordflow">if</span>( _mask.isEmpty()) <a name="l00468"></a>00468 <span class="keywordflow">return</span> QRegion( 0, 0, <a class="code" href="classKWinInternal_1_1Client.html#a29">width</a>(), <a class="code" href="classKWinInternal_1_1Client.html#a30">height</a>()); <a name="l00469"></a>00469 <span class="keywordflow">return</span> _mask; <a name="l00470"></a>00470 } <a name="l00471"></a>00471 <a name="l00472"></a><a class="code" href="classKWinInternal_1_1Client.html#a176">00472</a> <span class="keywordtype">void</span> <a class="code" href="classKWinInternal_1_1Client.html#a176">Client::setShapable</a>(<span class="keywordtype">bool</span> b) <a name="l00473"></a>00473 { <a name="l00474"></a>00474 <span class="keywordtype">long</span> tmp = b?1:0; <a name="l00475"></a>00475 XChangeProperty(qt_xdisplay(), <a class="code" href="classKWinInternal_1_1Client.html#a2">frameId</a>(), <a class="code" href="namespaceKWinInternal.html#a0">atoms</a>-><a class="code" href="classKWinInternal_1_1Atoms.html#o17">net_wm_window_shapable</a>, XA_CARDINAL, 32, PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) &tmp, 1L); <a name="l00476"></a>00476 } <a name="l00477"></a>00477 <a name="l00478"></a><a class="code" href="classKWinInternal_1_1Client.html#a134">00478</a> <span class="keywordtype">void</span> <a class="code" href="classKWinInternal_1_1Client.html#a134">Client::hideClient</a>( <span class="keywordtype">bool</span> hide ) <a name="l00479"></a>00479 { <a name="l00480"></a>00480 <span class="keywordflow">if</span>( hidden == hide ) <a name="l00481"></a>00481 <span class="keywordflow">return</span>; <a name="l00482"></a>00482 hidden = hide; <a name="l00483"></a>00483 info->setState( hidden ? NET::Hidden : 0, NET::Hidden ); <a name="l00484"></a>00484 <span class="keywordflow">if</span>( hidden ) <a name="l00485"></a>00485 { <a name="l00486"></a>00486 setMappingState( IconicState ); <a name="l00487"></a>00487 rawHide(); <a name="l00488"></a>00488 <a class="code" href="classKWinInternal_1_1Client.html#a71">setSkipTaskbar</a>( <span class="keyword">true</span>, <span class="keyword">false</span> ); <span class="comment">// also hide from taskbar</span> <a name="l00489"></a>00489 } <a name="l00490"></a>00490 <span class="keywordflow">else</span> <span class="comment">// !hidden</span> <a name="l00491"></a>00491 { <a name="l00492"></a>00492 <a class="code" href="classKWinInternal_1_1Client.html#a71">setSkipTaskbar</a>( original_skip_taskbar, <span class="keyword">false</span> ); <a name="l00493"></a>00493 <span class="keywordflow">if</span>( <a class="code" href="classKWinInternal_1_1Client.html#a46">isOnCurrentDesktop</a>()) <a name="l00494"></a>00494 { <a name="l00495"></a>00495 <span class="keywordflow">if</span>( <a class="code" href="classKWinInternal_1_1Client.html#a49">isShown</a>( <span class="keyword">false</span> )) <a name="l00496"></a>00496 setMappingState( NormalState ); <a name="l00497"></a>00497 rawShow(); <span class="comment">// is either visible or shaded</span> <a name="l00498"></a>00498 } <a name="l00499"></a>00499 } <a name="l00500"></a>00500 } <a name="l00501"></a>00501 <a name="l00502"></a>00502 <span class="comment">/*</span> <a name="l00503"></a>00503 <span class="comment"> Returns whether the window is minimizable or not</span> <a name="l00504"></a>00504 <span class="comment"> */</span> <a name="l00505"></a><a class="code" href="classKWinInternal_1_1Client.html#a58">00505</a> <span class="keywordtype">bool</span> <a class="code" href="classKWinInternal_1_1Client.html#a58">Client::isMinimizable</a>()<span class="keyword"> const</span> <a name="l00506"></a>00506 <span class="keyword"> </span>{ <a name="l00507"></a>00507 <span class="keywordflow">if</span>( <a class="code" href="classKWinInternal_1_1Client.html#a97">isSpecialWindow</a>() && !<a class="code" href="classKWinInternal_1_1Client.html#a96">isOverride</a>()) <a name="l00508"></a>00508 <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l00509"></a>00509 <span class="keywordflow">if</span>( <a class="code" href="classKWinInternal_1_1Client.html#a8">isTransient</a>()) <a name="l00510"></a>00510 { <span class="comment">// #66868 - let other xmms windows be minimized when the mainwindow is minimized</span> <a name="l00511"></a>00511 <span class="keywordtype">bool</span> shown_mainwindow = <span class="keyword">false</span>; <a name="l00512"></a>00512 <a class="code" href="namespaceKWinInternal.html#a24">ClientList</a> mainclients = <a class="code" href="classKWinInternal_1_1Client.html#a11">mainClients</a>(); <a name="l00513"></a>00513 <span class="keywordflow">for</span>( ClientList::ConstIterator it = mainclients.begin(); <a name="l00514"></a>00514 it != mainclients.end(); <a name="l00515"></a>00515 ++it ) <a name="l00516"></a>00516 { <a name="l00517"></a>00517 <span class="keywordflow">if</span>( (*it)->isShown( <span class="keyword">true</span> )) <a name="l00518"></a>00518 shown_mainwindow = <span class="keyword">true</span>; <a name="l00519"></a>00519 } <a name="l00520"></a>00520 <span class="keywordflow">if</span>( !shown_mainwindow ) <a name="l00521"></a>00521 <span class="keywordflow">return</span> <span class="keyword">true</span>; <a name="l00522"></a>00522 } <a name="l00523"></a>00523 <span class="comment">// this is here because kicker's taskbar doesn't provide separate entries</span> <a name="l00524"></a>00524 <span class="comment">// for windows with an explicitly given parent</span> <a name="l00525"></a>00525 <span class="comment">// TODO perhaps this should be redone</span> <a name="l00526"></a>00526 <span class="keywordflow">if</span>( <a class="code" href="classKWinInternal_1_1Client.html#a6">transientFor</a>() != NULL ) <a name="l00527"></a>00527 <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l00528"></a>00528 <span class="keywordflow">if</span>( !<a class="code" href="classKWinInternal_1_1Client.html#a83">wantsTabFocus</a>()) <span class="comment">// SELI - NET::Utility? why wantsTabFocus() - skiptaskbar? ?</span> <a name="l00529"></a>00529 <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l00530"></a>00530 <span class="keywordflow">return</span> <span class="keyword">true</span>; <a name="l00531"></a>00531 } <a name="l00532"></a>00532 <a name="l00536"></a><a class="code" href="classKWinInternal_1_1Client.html#a151">00536</a> <span class="keywordtype">void</span> <a class="code" href="classKWinInternal_1_1Client.html#a151">Client::minimize</a>( <span class="keywordtype">bool</span> avoid_animation ) <a name="l00537"></a>00537 { <a name="l00538"></a>00538 <span class="keywordflow">if</span> ( !<a class="code" href="classKWinInternal_1_1Client.html#a58">isMinimizable</a>() || <a class="code" href="classKWinInternal_1_1Client.html#a54">isMinimized</a>()) <a name="l00539"></a>00539 <span class="keywordflow">return</span>; <a name="l00540"></a>00540 <a name="l00541"></a>00541 minimized = <span class="keyword">true</span>; <a name="l00542"></a>00542 <a name="l00543"></a>00543 <a class="code" href="classKWinInternal_1_1Notify.html#e0">Notify::raise</a>( Notify::Minimize ); <a name="l00544"></a>00544 <a name="l00545"></a>00545 <span class="comment">// SELI mainClients().isEmpty() ??? - and in unminimize() too</span> <a name="l00546"></a>00546 <span class="keywordflow">if</span> ( <a class="code" href="classKWinInternal_1_1Client.html#a11">mainClients</a>().isEmpty() && <a class="code" href="classKWinInternal_1_1Client.html#a46">isOnCurrentDesktop</a>() && !avoid_animation ) <a name="l00547"></a>00547 animateMinimizeOrUnminimize( <span class="keyword">true</span> ); <span class="comment">// was visible or shaded</span> <a name="l00548"></a>00548 <a name="l00549"></a>00549 setMappingState( IconicState ); <a name="l00550"></a>00550 info->setState( NET::Hidden, NET::Hidden ); <a name="l00551"></a>00551 rawHide(); <a name="l00552"></a>00552 updateAllowedActions(); <a name="l00553"></a>00553 <a class="code" href="classKWinInternal_1_1Client.html#a5">workspace</a>()-><a class="code" href="classKWinInternal_1_1Workspace.html#a65">updateMinimizedOfTransients</a>( <span class="keyword">this</span> ); <a name="l00554"></a>00554 updateWindowRules(); <a name="l00555"></a>00555 } <a name="l00556"></a>00556 <a name="l00557"></a><a class="code" href="classKWinInternal_1_1Client.html#a152">00557</a> <span class="keywordtype">void</span> <a class="code" href="classKWinInternal_1_1Client.html#a152">Client::unminimize</a>( <span class="keywordtype">bool</span> avoid_animation ) <a name="l00558"></a>00558 { <a name="l00559"></a>00559 <span class="keywordflow">if</span>( !<a class="code" href="classKWinInternal_1_1Client.html#a54">isMinimized</a>()) <a name="l00560"></a>00560 <span class="keywordflow">return</span>; <a name="l00561"></a>00561 <a name="l00562"></a>00562 <a class="code" href="classKWinInternal_1_1Notify.html#e0">Notify::raise</a>( Notify::UnMinimize ); <a name="l00563"></a>00563 minimized = <span class="keyword">false</span>; <a name="l00564"></a>00564 info->setState( 0, NET::Hidden ); <a name="l00565"></a>00565 <span class="keywordflow">if</span>( <a class="code" href="classKWinInternal_1_1Client.html#a46">isOnCurrentDesktop</a>()) <a name="l00566"></a>00566 { <a name="l00567"></a>00567 <span class="keywordflow">if</span>( <a class="code" href="classKWinInternal_1_1Client.html#a11">mainClients</a>().isEmpty() && !avoid_animation ) <a name="l00568"></a>00568 animateMinimizeOrUnminimize( FALSE ); <a name="l00569"></a>00569 <span class="keywordflow">if</span>( <a class="code" href="classKWinInternal_1_1Client.html#a49">isShown</a>( <span class="keyword">false</span> )) <a name="l00570"></a>00570 setMappingState( NormalState ); <a name="l00571"></a>00571 rawShow(); <span class="comment">// is either visible or shaded</span> <a name="l00572"></a>00572 } <a name="l00573"></a>00573 updateAllowedActions(); <a name="l00574"></a>00574 <a class="code" href="classKWinInternal_1_1Client.html#a5">workspace</a>()-><a class="code" href="classKWinInternal_1_1Workspace.html#a65">updateMinimizedOfTransients</a>( <span class="keyword">this</span> ); <a name="l00575"></a>00575 updateWindowRules(); <a name="l00576"></a>00576 } <a name="l00577"></a>00577 <a name="l00578"></a>00578 <span class="keyword">extern</span> <span class="keywordtype">bool</span> <a class="code" href="namespaceKWinInternal.html#a1">blockAnimation</a>; <a name="l00579"></a>00579 <a name="l00580"></a>00580 <span class="keywordtype">void</span> Client::animateMinimizeOrUnminimize( <span class="keywordtype">bool</span> minimize ) <a name="l00581"></a>00581 { <a name="l00582"></a>00582 <span class="keywordflow">if</span> ( <a class="code" href="namespaceKWinInternal.html#a1">blockAnimation</a> ) <a name="l00583"></a>00583 <span class="keywordflow">return</span>; <a name="l00584"></a>00584 <span class="keywordflow">if</span> ( !<a class="code" href="namespaceKWinInternal.html#a13">options</a>-><a class="code" href="classKWinInternal_1_1Options.html#o21">animateMinimize</a> ) <a name="l00585"></a>00585 <span class="keywordflow">return</span>; <a name="l00586"></a>00586 <a name="l00587"></a>00587 <span class="keywordflow">if</span>( decoration != NULL && decoration-><a class="code" href="classKDecoration.html#a47">animateMinimize</a>( minimize )) <a name="l00588"></a>00588 <span class="keywordflow">return</span>; <span class="comment">// decoration did it</span> <a name="l00589"></a>00589 <a name="l00590"></a>00590 <span class="comment">// the function is a bit tricky since it will ensure that an</span> <a name="l00591"></a>00591 <span class="comment">// animation action needs always the same time regardless of the</span> <a name="l00592"></a>00592 <span class="comment">// performance of the machine or the X-Server.</span> <a name="l00593"></a>00593 <a name="l00594"></a>00594 <span class="keywordtype">float</span> lf,rf,tf,bf,step; <a name="l00595"></a>00595 <a name="l00596"></a>00596 <span class="keywordtype">int</span> speed = <a class="code" href="namespaceKWinInternal.html#a13">options</a>-><a class="code" href="classKWinInternal_1_1Options.html#o22">animateMinimizeSpeed</a>; <a name="l00597"></a>00597 <span class="keywordflow">if</span> ( speed > 10 ) <a name="l00598"></a>00598 speed = 10; <a name="l00599"></a>00599 <span class="keywordflow">if</span> ( speed < 0 ) <a name="l00600"></a>00600 speed = 0; <a name="l00601"></a>00601 <a name="l00602"></a>00602 step = 40. * (11 - speed ); <a name="l00603"></a>00603 <a name="l00604"></a>00604 NETRect r = info->iconGeometry(); <a name="l00605"></a>00605 QRect icongeom( r.pos.x, r.pos.y, r.size.width, r.size.height ); <a name="l00606"></a>00606 <span class="keywordflow">if</span> ( !icongeom.isValid() ) <a name="l00607"></a>00607 <span class="keywordflow">return</span>; <a name="l00608"></a>00608 <a name="l00609"></a>00609 QPixmap pm = animationPixmap( minimize ? <a class="code" href="classKWinInternal_1_1Client.html#a29">width</a>() : icongeom.width() ); <a name="l00610"></a>00610 <a name="l00611"></a>00611 QRect before, after; <a name="l00612"></a>00612 <span class="keywordflow">if</span> ( minimize ) <a name="l00613"></a>00613 { <a name="l00614"></a>00614 before = QRect( <a class="code" href="classKWinInternal_1_1Client.html#a27">x</a>(), <a class="code" href="classKWinInternal_1_1Client.html#a28">y</a>(), <a class="code" href="classKWinInternal_1_1Client.html#a29">width</a>(), pm.height() ); <a name="l00615"></a>00615 after = QRect( icongeom.x(), icongeom.y(), icongeom.width(), pm.height() ); <a name="l00616"></a>00616 } <a name="l00617"></a>00617 <span class="keywordflow">else</span> <a name="l00618"></a>00618 { <a name="l00619"></a>00619 before = QRect( icongeom.x(), icongeom.y(), icongeom.width(), pm.height() ); <a name="l00620"></a>00620 after = QRect( <a class="code" href="classKWinInternal_1_1Client.html#a27">x</a>(), <a class="code" href="classKWinInternal_1_1Client.html#a28">y</a>(), <a class="code" href="classKWinInternal_1_1Client.html#a29">width</a>(), pm.height() ); <a name="l00621"></a>00621 } <a name="l00622"></a>00622 <a name="l00623"></a>00623 lf = (after.left() - before.left())/step; <a name="l00624"></a>00624 rf = (after.right() - before.right())/step; <a name="l00625"></a>00625 tf = (after.top() - before.top())/step; <a name="l00626"></a>00626 bf = (after.bottom() - before.bottom())/step; <a name="l00627"></a>00627 <a name="l00628"></a>00628 <a class="code" href="namespaceKWinInternal.html#a105">grabXServer</a>(); <a name="l00629"></a>00629 <a name="l00630"></a>00630 QRect area = before; <a name="l00631"></a>00631 QRect area2; <a name="l00632"></a>00632 QPixmap pm2; <a name="l00633"></a>00633 <a name="l00634"></a>00634 QTime t; <a name="l00635"></a>00635 t.start(); <a name="l00636"></a>00636 <span class="keywordtype">float</span> diff; <a name="l00637"></a>00637 <a name="l00638"></a>00638 QPainter p ( <a class="code" href="classKWinInternal_1_1Client.html#a5">workspace</a>()->desktopWidget() ); <a name="l00639"></a>00639 <span class="keywordtype">bool</span> need_to_clear = FALSE; <a name="l00640"></a>00640 QPixmap pm3; <a name="l00641"></a>00641 <span class="keywordflow">do</span> <a name="l00642"></a>00642 { <a name="l00643"></a>00643 <span class="keywordflow">if</span> (area2 != area) <a name="l00644"></a>00644 { <a name="l00645"></a>00645 pm = animationPixmap( area.width() ); <a name="l00646"></a>00646 pm2 = QPixmap::grabWindow( qt_xrootwin(), area.x(), area.y(), area.width(), area.height() ); <a name="l00647"></a>00647 p.drawPixmap( area.x(), area.y(), pm ); <a name="l00648"></a>00648 <span class="keywordflow">if</span> ( need_to_clear ) <a name="l00649"></a>00649 { <a name="l00650"></a>00650 p.drawPixmap( area2.x(), area2.y(), pm3 ); <a name="l00651"></a>00651 need_to_clear = FALSE; <a name="l00652"></a>00652 } <a name="l00653"></a>00653 area2 = area; <a name="l00654"></a>00654 } <a name="l00655"></a>00655 XFlush(qt_xdisplay()); <a name="l00656"></a>00656 XSync( qt_xdisplay(), FALSE ); <a name="l00657"></a>00657 diff = t.elapsed(); <a name="l00658"></a>00658 <span class="keywordflow">if</span> (diff > step) <a name="l00659"></a>00659 diff = step; <a name="l00660"></a>00660 area.setLeft(before.left() + int(diff*lf)); <a name="l00661"></a>00661 area.setRight(before.right() + int(diff*rf)); <a name="l00662"></a>00662 area.setTop(before.top() + int(diff*tf)); <a name="l00663"></a>00663 area.setBottom(before.bottom() + int(diff*bf)); <a name="l00664"></a>00664 <span class="keywordflow">if</span> (area2 != area ) <a name="l00665"></a>00665 { <a name="l00666"></a>00666 <span class="keywordflow">if</span> ( area2.intersects( area ) ) <a name="l00667"></a>00667 p.drawPixmap( area2.x(), area2.y(), pm2 ); <a name="l00668"></a>00668 <span class="keywordflow">else</span> <a name="l00669"></a>00669 { <span class="comment">// no overlap, we can clear later to avoid flicker</span> <a name="l00670"></a>00670 pm3 = pm2; <a name="l00671"></a>00671 need_to_clear = TRUE; <a name="l00672"></a>00672 } <a name="l00673"></a>00673 } <a name="l00674"></a>00674 } <span class="keywordflow">while</span> ( t.elapsed() < step); <a name="l00675"></a>00675 <span class="keywordflow">if</span> (area2 == area || need_to_clear ) <a name="l00676"></a>00676 p.drawPixmap( area2.x(), area2.y(), pm2 ); <a name="l00677"></a>00677 <a name="l00678"></a>00678 p.end(); <a name="l00679"></a>00679 <a class="code" href="namespaceKWinInternal.html#a106">ungrabXServer</a>(); <a name="l00680"></a>00680 } <a name="l00681"></a>00681 <a name="l00682"></a>00682 <a name="l00686"></a>00686 QPixmap Client::animationPixmap( <span class="keywordtype">int</span> w ) <a name="l00687"></a>00687 { <a name="l00688"></a>00688 QFont font = <a class="code" href="namespaceKWinInternal.html#a13">options</a>->font(<a class="code" href="classKWinInternal_1_1Client.html#a41">isActive</a>()); <a name="l00689"></a>00689 QFontMetrics fm( font ); <a name="l00690"></a>00690 QPixmap pm( w, fm.lineSpacing() ); <a name="l00691"></a>00691 pm.fill( <a class="code" href="namespaceKWinInternal.html#a13">options</a>->color(<a class="code" href="classKDecorationDefines.html#w73w35">Options::ColorTitleBar</a>, <a class="code" href="classKWinInternal_1_1Client.html#a41">isActive</a>() || <a class="code" href="classKWinInternal_1_1Client.html#a54">isMinimized</a>() ) ); <a name="l00692"></a>00692 QPainter p( &pm ); <a name="l00693"></a>00693 p.setPen(<a class="code" href="namespaceKWinInternal.html#a13">options</a>->color(<a class="code" href="classKDecorationDefines.html#w73w37">Options::ColorFont</a>, <a class="code" href="classKWinInternal_1_1Client.html#a41">isActive</a>() || <a class="code" href="classKWinInternal_1_1Client.html#a54">isMinimized</a>() )); <a name="l00694"></a>00694 p.setFont(<a class="code" href="namespaceKWinInternal.html#a13">options</a>->font(<a class="code" href="classKWinInternal_1_1Client.html#a41">isActive</a>())); <a name="l00695"></a>00695 p.drawText( pm.rect(), AlignLeft|AlignVCenter|SingleLine, <a class="code" href="classKWinInternal_1_1Client.html#a136">caption</a>() ); <a name="l00696"></a>00696 <span class="keywordflow">return</span> pm; <a name="l00697"></a>00697 } <a name="l00698"></a>00698 <a name="l00699"></a>00699 <a name="l00700"></a><a class="code" href="classKWinInternal_1_1Client.html#a53">00700</a> <span class="keywordtype">bool</span> <a class="code" href="classKWinInternal_1_1Client.html#a53">Client::isShadeable</a>()<span class="keyword"> const</span> <a name="l00701"></a>00701 <span class="keyword"> </span>{ <a name="l00702"></a>00702 <span class="keywordflow">return</span> !<a class="code" href="classKWinInternal_1_1Client.html#a97">isSpecialWindow</a>() && !<a class="code" href="classKWinInternal_1_1Client.html#a69">noBorder</a>(); <a name="l00703"></a>00703 } <a name="l00704"></a>00704 <a name="l00705"></a><a class="code" href="classKWinInternal_1_1Client.html#a52">00705</a> <span class="keywordtype">void</span> <a class="code" href="classKWinInternal_1_1Client.html#a52">Client::setShade</a>( <a class="code" href="namespaceKWinInternal.html#a123">ShadeMode</a> mode ) <a name="l00706"></a>00706 { <a name="l00707"></a>00707 <span class="keywordflow">if</span>( !<a class="code" href="classKWinInternal_1_1Client.html#a53">isShadeable</a>()) <a name="l00708"></a>00708 <span class="keywordflow">return</span>; <a name="l00709"></a>00709 mode = <a class="code" href="classKWinInternal_1_1Client.html#a20">rules</a>()-><a class="code" href="classKWinInternal_1_1WindowRules.html#a17">checkShade</a>( mode ); <a name="l00710"></a>00710 <span class="keywordflow">if</span>( shade_mode == mode ) <a name="l00711"></a>00711 <span class="keywordflow">return</span>; <a name="l00712"></a>00712 <span class="keywordtype">bool</span> was_shade = <a class="code" href="classKWinInternal_1_1Client.html#a50">isShade</a>(); <a name="l00713"></a>00713 <a class="code" href="namespaceKWinInternal.html#a123">ShadeMode</a> was_shade_mode = shade_mode; <a name="l00714"></a>00714 shade_mode = mode; <a name="l00715"></a>00715 <span class="keywordflow">if</span>( was_shade == <a class="code" href="classKWinInternal_1_1Client.html#a50">isShade</a>()) <a name="l00716"></a>00716 { <a name="l00717"></a>00717 <span class="keywordflow">if</span>( decoration != NULL ) <span class="comment">// decoration may want to update after e.g. hover-shade changes</span> <a name="l00718"></a>00718 decoration-><a class="code" href="classKDecoration.html#a45">shadeChange</a>(); <a name="l00719"></a>00719 <span class="keywordflow">return</span>; <span class="comment">// no real change in shaded state</span> <a name="l00720"></a>00720 } <a name="l00721"></a>00721 <a name="l00722"></a>00722 <span class="keywordflow">if</span>( shade_mode == ShadeNormal ) <a name="l00723"></a>00723 { <a name="l00724"></a>00724 <span class="keywordflow">if</span> ( <a class="code" href="classKWinInternal_1_1Client.html#a49">isShown</a>( <span class="keyword">true</span> ) && <a class="code" href="classKWinInternal_1_1Client.html#a46">isOnCurrentDesktop</a>()) <a name="l00725"></a>00725 <a class="code" href="classKWinInternal_1_1Notify.html#e0">Notify::raise</a>( Notify::ShadeUp ); <a name="l00726"></a>00726 } <a name="l00727"></a>00727 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( shade_mode == ShadeNone ) <a name="l00728"></a>00728 { <a name="l00729"></a>00729 <span class="keywordflow">if</span>( <a class="code" href="classKWinInternal_1_1Client.html#a49">isShown</a>( <span class="keyword">true</span> ) && <a class="code" href="classKWinInternal_1_1Client.html#a46">isOnCurrentDesktop</a>()) <a name="l00730"></a>00730 <a class="code" href="classKWinInternal_1_1Notify.html#e0">Notify::raise</a>( Notify::ShadeDown ); <a name="l00731"></a>00731 } <a name="l00732"></a>00732 <a name="l00733"></a>00733 assert( decoration != NULL ); <span class="comment">// noborder windows can't be shaded</span> <a name="l00734"></a>00734 <a class="code" href="classKWinInternal_1_1GeometryUpdatesPostponer.html">GeometryUpdatesPostponer</a> blocker( <span class="keyword">this</span> ); <a name="l00735"></a>00735 <span class="comment">// decorations may turn off some borders when shaded</span> <a name="l00736"></a>00736 decoration-><a class="code" href="classKDecoration.html#a37">borders</a>( border_left, border_right, border_top, border_bottom ); <a name="l00737"></a>00737 <a name="l00738"></a>00738 <span class="keywordtype">int</span> as = <a class="code" href="namespaceKWinInternal.html#a13">options</a>-><a class="code" href="classKWinInternal_1_1Options.html#o17">animateShade</a>? 10 : 1; <a name="l00739"></a>00739 <span class="comment">// TODO all this unmapping, resizing etc. feels too much duplicated from elsewhere</span> <a name="l00740"></a>00740 <span class="keywordflow">if</span> ( <a class="code" href="classKWinInternal_1_1Client.html#a50">isShade</a>()) <a name="l00741"></a>00741 { <span class="comment">// shade_mode == ShadeNormal</span> <a name="l00742"></a>00742 <span class="comment">// we're about to shade, texx xcompmgr to prepare</span> <a name="l00743"></a>00743 <span class="keywordtype">long</span> _shade = 1; <a name="l00744"></a>00744 XChangeProperty(qt_xdisplay(), <a class="code" href="classKWinInternal_1_1Client.html#a2">frameId</a>(), <a class="code" href="namespaceKWinInternal.html#a0">atoms</a>-><a class="code" href="classKWinInternal_1_1Atoms.html#o16">net_wm_window_shade</a>, XA_CARDINAL, 32, PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) &_shade, 1L); <a name="l00745"></a>00745 <span class="comment">// shade</span> <a name="l00746"></a>00746 <span class="keywordtype">int</span> h = <a class="code" href="classKWinInternal_1_1Client.html#a30">height</a>(); <a name="l00747"></a>00747 shade_geometry_change = <span class="keyword">true</span>; <a name="l00748"></a>00748 QSize s( sizeForClientSize( QSize( <a class="code" href="classKWinInternal_1_1Client.html#a32">clientSize</a>()))); <a name="l00749"></a>00749 s.setHeight( border_top + border_bottom ); <a name="l00750"></a>00750 XSelectInput( qt_xdisplay(), wrapper, <a class="code" href="namespaceKWinInternal.html#a23">ClientWinMask</a> ); <span class="comment">// avoid getting UnmapNotify</span> <a name="l00751"></a>00751 XUnmapWindow( qt_xdisplay(), wrapper ); <a name="l00752"></a>00752 XUnmapWindow( qt_xdisplay(), client ); <a name="l00753"></a>00753 XSelectInput( qt_xdisplay(), wrapper, <a class="code" href="namespaceKWinInternal.html#a23">ClientWinMask</a> | SubstructureNotifyMask ); <a name="l00754"></a>00754 <span class="comment">//as we hid the unmap event, xcompmgr didn't recognize the client wid has vanished, so we'll extra inform it </span> <a name="l00755"></a>00755 <span class="comment">//done xcompmgr workaround</span> <a name="l00756"></a>00756 <span class="comment">// FRAME repaint( FALSE );</span> <a name="l00757"></a>00757 <span class="comment">// bool wasStaticContents = testWFlags( WStaticContents );</span> <a name="l00758"></a>00758 <span class="comment">// setWFlags( WStaticContents );</span> <a name="l00759"></a>00759 <span class="keywordtype">int</span> step = QMAX( 4, QABS( h - s.height() ) / as )+1; <a name="l00760"></a>00760 <span class="keywordflow">do</span> <a name="l00761"></a>00761 { <a name="l00762"></a>00762 h -= step; <a name="l00763"></a>00763 XResizeWindow( qt_xdisplay(), <a class="code" href="classKWinInternal_1_1Client.html#a2">frameId</a>(), s.width(), h ); <a name="l00764"></a>00764 resizeDecoration( QSize( s.width(), h )); <a name="l00765"></a>00765 QApplication::syncX(); <a name="l00766"></a>00766 } <span class="keywordflow">while</span> ( h > s.height() + step ); <a name="l00767"></a>00767 <span class="comment">// if ( !wasStaticContents )</span> <a name="l00768"></a>00768 <span class="comment">// clearWFlags( WStaticContents );</span> <a name="l00769"></a>00769 <a class="code" href="classKWinInternal_1_1Client.html#a113">plainResize</a>( s ); <a name="l00770"></a>00770 shade_geometry_change = <span class="keyword">false</span>; <a name="l00771"></a>00771 <span class="keywordflow">if</span>( <a class="code" href="classKWinInternal_1_1Client.html#a41">isActive</a>()) <a name="l00772"></a>00772 { <a name="l00773"></a>00773 <span class="keywordflow">if</span>( was_shade_mode == ShadeHover ) <a name="l00774"></a>00774 <a class="code" href="classKWinInternal_1_1Client.html#a5">workspace</a>()-><a class="code" href="classKWinInternal_1_1Workspace.html#a26">activateNextClient</a>( <span class="keyword">this</span> ); <a name="l00775"></a>00775 <span class="keywordflow">else</span> <a name="l00776"></a>00776 <a class="code" href="classKWinInternal_1_1Client.html#a5">workspace</a>()-><a class="code" href="classKWinInternal_1_1Workspace.html#a97">focusToNull</a>(); <a name="l00777"></a>00777 } <a name="l00778"></a>00778 <span class="comment">// tell xcompmgr shade's done</span> <a name="l00779"></a>00779 _shade = 2; <a name="l00780"></a>00780 XChangeProperty(qt_xdisplay(), <a class="code" href="classKWinInternal_1_1Client.html#a2">frameId</a>(), <a class="code" href="namespaceKWinInternal.html#a0">atoms</a>-><a class="code" href="classKWinInternal_1_1Atoms.html#o16">net_wm_window_shade</a>, XA_CARDINAL, 32, PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) &_shade, 1L); <a name="l00781"></a>00781 } <a name="l00782"></a>00782 <span class="keywordflow">else</span> <a name="l00783"></a>00783 { <a name="l00784"></a>00784 <span class="keywordtype">int</span> h = <a class="code" href="classKWinInternal_1_1Client.html#a30">height</a>(); <a name="l00785"></a>00785 shade_geometry_change = <span class="keyword">true</span>; <a name="l00786"></a>00786 QSize s( sizeForClientSize( <a class="code" href="classKWinInternal_1_1Client.html#a32">clientSize</a>())); <a name="l00787"></a>00787 <span class="comment">// FRAME bool wasStaticContents = testWFlags( WStaticContents );</span> <a name="l00788"></a>00788 <span class="comment">// setWFlags( WStaticContents );</span> <a name="l00789"></a>00789 <span class="keywordtype">int</span> step = QMAX( 4, QABS( h - s.height() ) / as )+1; <a name="l00790"></a>00790 <span class="keywordflow">do</span> <a name="l00791"></a>00791 { <a name="l00792"></a>00792 h += step; <a name="l00793"></a>00793 XResizeWindow( qt_xdisplay(), <a class="code" href="classKWinInternal_1_1Client.html#a2">frameId</a>(), s.width(), h ); <a name="l00794"></a>00794 resizeDecoration( QSize( s.width(), h )); <a name="l00795"></a>00795 <span class="comment">// assume a border</span> <a name="l00796"></a>00796 <span class="comment">// we do not have time to wait for X to send us paint events</span> <a name="l00797"></a>00797 <span class="comment">// FRAME repaint( 0, h - step-5, width(), step+5, TRUE);</span> <a name="l00798"></a>00798 QApplication::syncX(); <a name="l00799"></a>00799 } <span class="keywordflow">while</span> ( h < s.height() - step ); <a name="l00800"></a>00800 <span class="comment">// if ( !wasStaticContents )</span> <a name="l00801"></a>00801 <span class="comment">// clearWFlags( WStaticContents );</span> <a name="l00802"></a>00802 shade_geometry_change = <span class="keyword">false</span>; <a name="l00803"></a>00803 <a class="code" href="classKWinInternal_1_1Client.html#a113">plainResize</a>( s ); <a name="l00804"></a>00804 <span class="keywordflow">if</span>( shade_mode == ShadeHover || shade_mode == ShadeActivated ) <a name="l00805"></a>00805 <a class="code" href="classKWinInternal_1_1Client.html#a42">setActive</a>( TRUE ); <a name="l00806"></a>00806 XMapWindow( qt_xdisplay(), <a class="code" href="classKWinInternal_1_1Client.html#a3">wrapperId</a>()); <a name="l00807"></a>00807 XMapWindow( qt_xdisplay(), <a class="code" href="classKWinInternal_1_1Client.html#a1">window</a>()); <a name="l00808"></a>00808 XDeleteProperty (qt_xdisplay(), client, <a class="code" href="namespaceKWinInternal.html#a0">atoms</a>-><a class="code" href="classKWinInternal_1_1Atoms.html#o16">net_wm_window_shade</a>); <a name="l00809"></a>00809 <span class="keywordflow">if</span> ( <a class="code" href="classKWinInternal_1_1Client.html#a41">isActive</a>() ) <a name="l00810"></a>00810 <a class="code" href="classKWinInternal_1_1Client.html#a5">workspace</a>()-><a class="code" href="classKWinInternal_1_1Workspace.html#a17">requestFocus</a>( <span class="keyword">this</span> ); <a name="l00811"></a>00811 } <a name="l00812"></a>00812 checkMaximizeGeometry(); <a name="l00813"></a>00813 info->setState( <a class="code" href="classKWinInternal_1_1Client.html#a50">isShade</a>() ? NET::Shaded : 0, NET::Shaded ); <a name="l00814"></a>00814 info->setState( <a class="code" href="classKWinInternal_1_1Client.html#a49">isShown</a>( <span class="keyword">false</span> ) ? 0 : NET::Hidden, NET::Hidden ); <a name="l00815"></a>00815 setMappingState( <a class="code" href="classKWinInternal_1_1Client.html#a49">isShown</a>( <span class="keyword">false</span> ) && <a class="code" href="classKWinInternal_1_1Client.html#a46">isOnCurrentDesktop</a>() ? NormalState : IconicState ); <a name="l00816"></a>00816 updateAllowedActions(); <a name="l00817"></a>00817 <a class="code" href="classKWinInternal_1_1Client.html#a5">workspace</a>()-><a class="code" href="classKWinInternal_1_1Workspace.html#a65">updateMinimizedOfTransients</a>( <span class="keyword">this</span> ); <a name="l00818"></a>00818 decoration-><a class="code" href="classKDecoration.html#a45">shadeChange</a>(); <a name="l00819"></a>00819 updateWindowRules(); <a name="l00820"></a>00820 } <a name="l00821"></a>00821 <a name="l00822"></a>00822 <span class="keywordtype">void</span> Client::shadeHover() <a name="l00823"></a>00823 { <a name="l00824"></a>00824 <a class="code" href="classKWinInternal_1_1Client.html#a52">setShade</a>( ShadeHover ); <a name="l00825"></a>00825 <span class="keyword">delete</span> shadeHoverTimer; <a name="l00826"></a>00826 shadeHoverTimer = 0; <a name="l00827"></a>00827 } <a name="l00828"></a>00828 <a name="l00829"></a><a class="code" href="classKWinInternal_1_1Client.html#a156">00829</a> <span class="keywordtype">void</span> <a class="code" href="classKWinInternal_1_1Client.html#a156">Client::toggleShade</a>() <a name="l00830"></a>00830 { <a name="l00831"></a>00831 <span class="comment">// if the mode is ShadeHover or ShadeActive, cancel shade too</span> <a name="l00832"></a>00832 <a class="code" href="classKWinInternal_1_1Client.html#a52">setShade</a>( shade_mode == ShadeNone ? ShadeNormal : ShadeNone ); <a name="l00833"></a>00833 } <a name="l00834"></a>00834 <a name="l00835"></a><a class="code" href="classKWinInternal_1_1Client.html#a135">00835</a> <span class="keywordtype">void</span> <a class="code" href="classKWinInternal_1_1Client.html#a135">Client::virtualDesktopChange</a>() <a name="l00836"></a>00836 { <a name="l00837"></a>00837 <span class="keywordflow">if</span>( hidden || minimized ) <a name="l00838"></a>00838 <span class="keywordflow">return</span>; <span class="comment">// no visibility change</span> <a name="l00839"></a>00839 <span class="comment">// from here it can be only shaded or normally shown</span> <a name="l00840"></a>00840 <span class="keywordflow">if</span>( <a class="code" href="classKWinInternal_1_1Client.html#a46">isOnCurrentDesktop</a>()) <a name="l00841"></a>00841 { <a name="l00842"></a>00842 <span class="keywordflow">if</span>( !<a class="code" href="classKWinInternal_1_1Client.html#a50">isShade</a>()) <a name="l00843"></a>00843 setMappingState( NormalState ); <a name="l00844"></a>00844 rawShow(); <a name="l00845"></a>00845 } <a name="l00846"></a>00846 <span class="keywordflow">else</span> <a name="l00847"></a>00847 { <a name="l00848"></a>00848 <span class="keywordflow">if</span>( !<a class="code" href="classKWinInternal_1_1Client.html#a50">isShade</a>()) <a name="l00849"></a>00849 setMappingState( IconicState ); <a name="l00850"></a>00850 rawHide(); <a name="l00851"></a>00851 } <a name="l00852"></a>00852 } <a name="l00853"></a>00853 <a name="l00858"></a>00858 <span class="keywordtype">void</span> Client::setMappingState(<span class="keywordtype">int</span> s) <a name="l00859"></a>00859 { <a name="l00860"></a>00860 assert( client != None ); <a name="l00861"></a>00861 <span class="keywordflow">if</span>( mapping_state == s ) <a name="l00862"></a>00862 <span class="keywordflow">return</span>; <a name="l00863"></a>00863 <span class="keywordtype">bool</span> was_unmanaged = ( mapping_state == WithdrawnState ); <a name="l00864"></a>00864 mapping_state = s; <a name="l00865"></a>00865 <span class="keywordflow">if</span>( mapping_state == WithdrawnState ) <a name="l00866"></a>00866 { <a name="l00867"></a>00867 XDeleteProperty( qt_xdisplay(), <a class="code" href="classKWinInternal_1_1Client.html#a1">window</a>(), qt_wm_state ); <a name="l00868"></a>00868 <span class="keywordflow">return</span>; <a name="l00869"></a>00869 } <a name="l00870"></a>00870 assert( s == NormalState || s == IconicState ); <a name="l00871"></a>00871 <a name="l00872"></a>00872 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> data[2]; <a name="l00873"></a>00873 data[0] = (<span class="keywordtype">unsigned</span> long) s; <a name="l00874"></a>00874 data[1] = (<span class="keywordtype">unsigned</span> long) None; <a name="l00875"></a>00875 XChangeProperty(qt_xdisplay(), <a class="code" href="classKWinInternal_1_1Client.html#a1">window</a>(), qt_wm_state, qt_wm_state, 32, <a name="l00876"></a>00876 PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *)data, 2); <a name="l00877"></a>00877 <a name="l00878"></a>00878 <span class="keywordflow">if</span>( was_unmanaged ) <span class="comment">// manage() did postpone_geometry_updates = 1, now it's ok to finally set the geometry</span> <a name="l00879"></a>00879 postponeGeometryUpdates( <span class="keyword">false</span> ); <a name="l00880"></a>00880 } <a name="l00881"></a>00881 <a name="l00886"></a>00886 <span class="keywordtype">void</span> Client::rawShow() <a name="l00887"></a>00887 { <a name="l00888"></a>00888 <span class="keywordflow">if</span>( decoration != NULL ) <a name="l00889"></a>00889 decoration-><a class="code" href="classKDecoration.html#a55">widget</a>()->show(); <span class="comment">// not really necessary, but let it know the state</span> <a name="l00890"></a>00890 XMapWindow( qt_xdisplay(), frame ); <a name="l00891"></a>00891 <span class="keywordflow">if</span>( !<a class="code" href="classKWinInternal_1_1Client.html#a50">isShade</a>()) <a name="l00892"></a>00892 { <a name="l00893"></a>00893 XMapWindow( qt_xdisplay(), wrapper ); <a name="l00894"></a>00894 XMapWindow( qt_xdisplay(), client ); <a name="l00895"></a>00895 } <a name="l00896"></a>00896 } <a name="l00897"></a>00897 <a name="l00903"></a>00903 <span class="keywordtype">void</span> Client::rawHide() <a name="l00904"></a>00904 { <a name="l00905"></a>00905 <span class="comment">// Here it may look like a race condition, as some other client might try to unmap</span> <a name="l00906"></a>00906 <span class="comment">// the window between these two XSelectInput() calls. However, they're supposed to</span> <a name="l00907"></a>00907 <span class="comment">// use XWithdrawWindow(), which also sends a synthetic event to the root window,</span> <a name="l00908"></a>00908 <span class="comment">// which won't be missed, so this shouldn't be a problem. The chance the real UnmapNotify</span> <a name="l00909"></a>00909 <span class="comment">// will be missed is also very minimal, so I don't think it's needed to grab the server</span> <a name="l00910"></a>00910 <span class="comment">// here.</span> <a name="l00911"></a>00911 XSelectInput( qt_xdisplay(), wrapper, <a class="code" href="namespaceKWinInternal.html#a23">ClientWinMask</a> ); <span class="comment">// avoid getting UnmapNotify</span> <a name="l00912"></a>00912 XUnmapWindow( qt_xdisplay(), frame ); <a name="l00913"></a>00913 XUnmapWindow( qt_xdisplay(), wrapper ); <a name="l00914"></a>00914 XUnmapWindow( qt_xdisplay(), client ); <a name="l00915"></a>00915 XSelectInput( qt_xdisplay(), wrapper, <a class="code" href="namespaceKWinInternal.html#a23">ClientWinMask</a> | SubstructureNotifyMask ); <a name="l00916"></a>00916 <span class="keywordflow">if</span>( decoration != NULL ) <a name="l00917"></a>00917 decoration-><a class="code" href="classKDecoration.html#a55">widget</a>()->hide(); <span class="comment">// not really necessary, but let it know the state</span> <a name="l00918"></a>00918 <a class="code" href="classKWinInternal_1_1Client.html#a5">workspace</a>()->clientHidden( <span class="keyword">this</span> ); <a name="l00919"></a>00919 } <a name="l00920"></a>00920 <a name="l00921"></a>00921 <span class="keywordtype">void</span> Client::sendClientMessage(Window w, Atom a, Atom protocol, <span class="keywordtype">long</span> data1, <span class="keywordtype">long</span> data2, <span class="keywordtype">long</span> data3) <a name="l00922"></a>00922 { <a name="l00923"></a>00923 XEvent ev; <a name="l00924"></a>00924 <span class="keywordtype">long</span> <a class="code" href="classKWinInternal_1_1Client.html#a104">mask</a>; <a name="l00925"></a>00925 <a name="l00926"></a>00926 memset(&ev, 0, <span class="keyword">sizeof</span>(ev)); <a name="l00927"></a>00927 ev.xclient.type = ClientMessage; <a name="l00928"></a>00928 ev.xclient.window = w; <a name="l00929"></a>00929 ev.xclient.message_type = a; <a name="l00930"></a>00930 ev.xclient.format = 32; <a name="l00931"></a>00931 ev.xclient.data.l[0] = protocol; <a name="l00932"></a>00932 ev.xclient.data.l[1] = qt_x_time; <a name="l00933"></a>00933 ev.xclient.data.l[2] = data1; <a name="l00934"></a>00934 ev.xclient.data.l[3] = data2; <a name="l00935"></a>00935 ev.xclient.data.l[4] = data3; <a name="l00936"></a>00936 mask = 0L; <a name="l00937"></a>00937 <span class="keywordflow">if</span> (w == qt_xrootwin()) <a name="l00938"></a>00938 mask = SubstructureRedirectMask; <span class="comment">/* magic! */</span> <a name="l00939"></a>00939 XSendEvent(qt_xdisplay(), w, False, mask, &ev); <a name="l00940"></a>00940 } <a name="l00941"></a>00941 <a name="l00942"></a>00942 <span class="comment">/*</span> <a name="l00943"></a>00943 <span class="comment"> Returns whether the window may be closed (have a close button)</span> <a name="l00944"></a>00944 <span class="comment"> */</span> <a name="l00945"></a><a class="code" href="classKWinInternal_1_1Client.html#a99">00945</a> <span class="keywordtype">bool</span> <a class="code" href="classKWinInternal_1_1Client.html#a99">Client::isCloseable</a>()<span class="keyword"> const</span> <a name="l00946"></a>00946 <span class="keyword"> </span>{ <a name="l00947"></a>00947 <span class="keywordflow">return</span> <a class="code" href="classKWinInternal_1_1Client.html#a20">rules</a>()-><a class="code" href="classKWinInternal_1_1WindowRules.html#a27">checkCloseable</a>( motif_may_close && ( !<a class="code" href="classKWinInternal_1_1Client.html#a97">isSpecialWindow</a>() || <a class="code" href="classKWinInternal_1_1Client.html#a96">isOverride</a>())); <span class="comment">// TODO is NET::Override special?</span> <a name="l00948"></a>00948 } <a name="l00949"></a>00949 <a name="l00954"></a><a class="code" href="classKWinInternal_1_1Client.html#a153">00954</a> <span class="keywordtype">void</span> <a class="code" href="classKWinInternal_1_1Client.html#a153">Client::closeWindow</a>() <a name="l00955"></a>00955 { <a name="l00956"></a>00956 <span class="keywordflow">if</span>( !<a class="code" href="classKWinInternal_1_1Client.html#a99">isCloseable</a>()) <a name="l00957"></a>00957 <span class="keywordflow">return</span>; <a name="l00958"></a>00958 <span class="comment">// Update user time, needed for whole group, because the window may create a confirming dialog,</span> <a name="l00959"></a>00959 <span class="comment">// and this window's user time wouldn't apply to it</span> <a name="l00960"></a>00960 <span class="comment">// This is needed even for apps without support for user timestamp (e.g. nedit), so updating</span> <a name="l00961"></a>00961 <span class="comment">// user timestamp in apps on WM_DELETE_WINDOW is not an option (and I'm not sure if it would be right)</span> <a name="l00962"></a>00962 <a class="code" href="classKWinInternal_1_1Client.html#a16">group</a>()-><a class="code" href="classKWinInternal_1_1Group.html#a14">updateUserTime</a>(); <a name="l00963"></a>00963 <span class="keywordflow">if</span> ( Pdeletewindow ) <a name="l00964"></a>00964 { <a name="l00965"></a>00965 <a class="code" href="classKWinInternal_1_1Notify.html#e0">Notify::raise</a>( Notify::Close ); <a name="l00966"></a>00966 sendClientMessage( <a class="code" href="classKWinInternal_1_1Client.html#a1">window</a>(), <a class="code" href="namespaceKWinInternal.html#a0">atoms</a>-><a class="code" href="classKWinInternal_1_1Atoms.html#o1">wm_protocols</a>, <a class="code" href="namespaceKWinInternal.html#a0">atoms</a>-><a class="code" href="classKWinInternal_1_1Atoms.html#o2">wm_delete_window</a>); <a name="l00967"></a>00967 pingWindow(); <a name="l00968"></a>00968 } <a name="l00969"></a>00969 <span class="keywordflow">else</span> <a name="l00970"></a>00970 { <a name="l00971"></a>00971 <span class="comment">// client will not react on wm_delete_window. We have not choice</span> <a name="l00972"></a>00972 <span class="comment">// but destroy his connection to the XServer.</span> <a name="l00973"></a>00973 <a class="code" href="classKWinInternal_1_1Client.html#a154">killWindow</a>(); <a name="l00974"></a>00974 } <a name="l00975"></a>00975 } <a name="l00976"></a>00976 <a name="l00977"></a>00977 <a name="l00981"></a><a class="code" href="classKWinInternal_1_1Client.html#a154">00981</a> <span class="keywordtype">void</span> <a class="code" href="classKWinInternal_1_1Client.html#a154">Client::killWindow</a>() <a name="l00982"></a>00982 { <a name="l00983"></a>00983 kdDebug( 1212 ) << <span class="stringliteral">"Client::killWindow():"</span> << <a class="code" href="classKWinInternal_1_1Client.html#a136">caption</a>() << endl; <a name="l00984"></a>00984 <span class="comment">// not sure if we need an Notify::Kill or not.. until then, use</span> <a name="l00985"></a>00985 <span class="comment">// Notify::Close</span> <a name="l00986"></a>00986 <a class="code" href="classKWinInternal_1_1Notify.html#e0">Notify::raise</a>( Notify::Close ); <a name="l00987"></a>00987 <a name="l00988"></a>00988 <span class="keywordflow">if</span>( <a class="code" href="classKWinInternal_1_1Client.html#a93">isDialog</a>()) <a name="l00989"></a>00989 <a class="code" href="classKWinInternal_1_1Notify.html#e0">Notify::raise</a>( Notify::TransDelete ); <a name="l00990"></a>00990 <span class="keywordflow">if</span>( <a class="code" href="classKWinInternal_1_1Client.html#a92">isNormalWindow</a>()) <a name="l00991"></a>00991 <a class="code" href="classKWinInternal_1_1Notify.html#e0">Notify::raise</a>( Notify::Delete ); <a name="l00992"></a>00992 killProcess( <span class="keyword">false</span> ); <a name="l00993"></a>00993 <span class="comment">// always kill this client at the server</span> <a name="l00994"></a>00994 XKillClient(qt_xdisplay(), <a class="code" href="classKWinInternal_1_1Client.html#a1">window</a>() ); <a name="l00995"></a>00995 <a class="code" href="classKWinInternal_1_1Client.html#a159">destroyClient</a>(); <a name="l00996"></a>00996 } <a name="l00997"></a>00997 <a name="l00998"></a>00998 <span class="comment">// send a ping to the window using _NET_WM_PING if possible</span> <a name="l00999"></a>00999 <span class="comment">// if it doesn't respond within a reasonable time, it will be</span> <a name="l01000"></a>01000 <span class="comment">// killed</span> <a name="l01001"></a>01001 <span class="keywordtype">void</span> Client::pingWindow() <a name="l01002"></a>01002 { <a name="l01003"></a>01003 <span class="keywordflow">if</span>( !Pping ) <a name="l01004"></a>01004 <span class="keywordflow">return</span>; <span class="comment">// can't ping :(</span> <a name="l01005"></a>01005 <span class="keywordflow">if</span>( <a class="code" href="namespaceKWinInternal.html#a13">options</a>-><a class="code" href="classKWinInternal_1_1Options.html#o26">killPingTimeout</a> == 0 ) <a name="l01006"></a>01006 <span class="keywordflow">return</span>; <span class="comment">// turned off</span> <a name="l01007"></a>01007 <span class="keywordflow">if</span>( ping_timer != NULL ) <a name="l01008"></a>01008 <span class="keywordflow">return</span>; <span class="comment">// pinging already</span> <a name="l01009"></a>01009 ping_timer = <span class="keyword">new</span> QTimer( <span class="keyword">this</span> ); <a name="l01010"></a>01010 connect( ping_timer, SIGNAL( timeout()), SLOT( pingTimeout())); <a name="l01011"></a>01011 ping_timer->start( <a class="code" href="namespaceKWinInternal.html#a13">options</a>-><a class="code" href="classKWinInternal_1_1Options.html#o26">killPingTimeout</a>, <span class="keyword">true</span> ); <a name="l01012"></a>01012 ping_timestamp = qt_x_time; <a name="l01013"></a>01013 <a class="code" href="classKWinInternal_1_1Client.html#a5">workspace</a>()-><a class="code" href="classKWinInternal_1_1Workspace.html#a83">sendPingToWindow</a>( <a class="code" href="classKWinInternal_1_1Client.html#a1">window</a>(), ping_timestamp ); <a name="l01014"></a>01014 } <a name="l01015"></a>01015 <a name="l01016"></a><a class="code" href="classKWinInternal_1_1Client.html#a145">01016</a> <span class="keywordtype">void</span> <a class="code" href="classKWinInternal_1_1Client.html#a145">Client::gotPing</a>( Time timestamp ) <a name="l01017"></a>01017 { <a name="l01018"></a>01018 <span class="keywordflow">if</span>( timestamp != ping_timestamp ) <a name="l01019"></a>01019 <span class="keywordflow">return</span>; <a name="l01020"></a>01020 <span class="keyword">delete</span> ping_timer; <a name="l01021"></a>01021 ping_timer = NULL; <a name="l01022"></a>01022 <span class="keywordflow">if</span>( process_killer != NULL ) <a name="l01023"></a>01023 { <a name="l01024"></a>01024 process_killer->kill(); <a name="l01025"></a>01025 <span class="keyword">delete</span> process_killer; <a name="l01026"></a>01026 process_killer = NULL; <a name="l01027"></a>01027 } <a name="l01028"></a>01028 } <a name="l01029"></a>01029 <a name="l01030"></a>01030 <span class="keywordtype">void</span> Client::pingTimeout() <a name="l01031"></a>01031 { <a name="l01032"></a>01032 kdDebug( 1212 ) << <span class="stringliteral">"Ping timeout:"</span> << <a class="code" href="classKWinInternal_1_1Client.html#a136">caption</a>() << endl; <a name="l01033"></a>01033 <span class="keyword">delete</span> ping_timer; <a name="l01034"></a>01034 ping_timer = NULL; <a name="l01035"></a>01035 killProcess( <span class="keyword">true</span>, ping_timestamp ); <a name="l01036"></a>01036 } <a name="l01037"></a>01037 <a name="l01038"></a>01038 <span class="keywordtype">void</span> Client::killProcess( <span class="keywordtype">bool</span> ask, Time timestamp ) <a name="l01039"></a>01039 { <a name="l01040"></a>01040 <span class="keywordflow">if</span>( process_killer != NULL ) <a name="l01041"></a>01041 <span class="keywordflow">return</span>; <a name="l01042"></a>01042 Q_ASSERT( !ask || timestamp != CurrentTime ); <a name="l01043"></a>01043 QCString machine = <a class="code" href="classKWinInternal_1_1Client.html#a129">wmClientMachine</a>( <span class="keyword">true</span> ); <a name="l01044"></a>01044 pid_t <a class="code" href="classKWinInternal_1_1Client.html#a131">pid</a> = info->pid(); <a name="l01045"></a>01045 <span class="keywordflow">if</span>( pid <= 0 || machine.isEmpty()) <span class="comment">// needed properties missing</span> <a name="l01046"></a>01046 <span class="keywordflow">return</span>; <a name="l01047"></a>01047 kdDebug( 1212 ) << <span class="stringliteral">"Kill process:"</span> << pid << <span class="stringliteral">"("</span> << machine << <span class="stringliteral">")"</span> << endl; <a name="l01048"></a>01048 <span class="keywordflow">if</span>( !ask ) <a name="l01049"></a>01049 { <a name="l01050"></a>01050 <span class="keywordflow">if</span>( machine != <span class="stringliteral">"localhost"</span> ) <a name="l01051"></a>01051 { <a name="l01052"></a>01052 KProcess proc; <a name="l01053"></a>01053 proc << <span class="stringliteral">"xon"</span> << machine << <span class="stringliteral">"kill"</span> << pid; <a name="l01054"></a>01054 proc.start( KProcess::DontCare ); <a name="l01055"></a>01055 } <a name="l01056"></a>01056 else <a name="l01057"></a>01057 ::kill( pid, SIGTERM ); <a name="l01058"></a>01058 } <a name="l01059"></a>01059 <span class="keywordflow">else</span> <a name="l01060"></a>01060 { <span class="comment">// SELI TODO handle the window created by handler specially (on top,urgent?)</span> <a name="l01061"></a>01061 process_killer = <span class="keyword">new</span> KProcess( <span class="keyword">this</span> ); <a name="l01062"></a>01062 *process_killer << KStandardDirs::findExe( <span class="stringliteral">"kwin_killer_helper"</span> ) <a name="l01063"></a>01063 << <span class="stringliteral">"--pid"</span> << QCString().setNum( pid ) << <span class="stringliteral">"--hostname"</span> << machine <a name="l01064"></a>01064 << <span class="stringliteral">"--windowname"</span> << <a class="code" href="classKWinInternal_1_1Client.html#a136">caption</a>().utf8() <a name="l01065"></a>01065 << <span class="stringliteral">"--applicationname"</span> << <a class="code" href="classKWinInternal_1_1Client.html#a127">resourceClass</a>() <a name="l01066"></a>01066 << <span class="stringliteral">"--wid"</span> << QCString().setNum( <a class="code" href="classKWinInternal_1_1Client.html#a1">window</a>()) <a name="l01067"></a>01067 << <span class="stringliteral">"--timestamp"</span> << QCString().setNum( timestamp ); <a name="l01068"></a>01068 connect( process_killer, SIGNAL( processExited( KProcess* )), <a name="l01069"></a>01069 SLOT( processKillerExited())); <a name="l01070"></a>01070 <span class="keywordflow">if</span>( !process_killer->start( KProcess::NotifyOnExit )) <a name="l01071"></a>01071 { <a name="l01072"></a>01072 <span class="keyword">delete</span> process_killer; <a name="l01073"></a>01073 process_killer = NULL; <a name="l01074"></a>01074 <span class="keywordflow">return</span>; <a name="l01075"></a>01075 } <a name="l01076"></a>01076 } <a name="l01077"></a>01077 } <a name="l01078"></a>01078 <a name="l01079"></a>01079 <span class="keywordtype">void</span> Client::processKillerExited() <a name="l01080"></a>01080 { <a name="l01081"></a>01081 kdDebug( 1212 ) << <span class="stringliteral">"Killer exited"</span> << endl; <a name="l01082"></a>01082 <span class="keyword">delete</span> process_killer; <a name="l01083"></a>01083 process_killer = NULL; <a name="l01084"></a>01084 } <a name="l01085"></a>01085 <a name="l01086"></a><a class="code" href="classKWinInternal_1_1Client.html#a71">01086</a> <span class="keywordtype">void</span> <a class="code" href="classKWinInternal_1_1Client.html#a71">Client::setSkipTaskbar</a>( <span class="keywordtype">bool</span> b, <span class="keywordtype">bool</span> from_outside ) <a name="l01087"></a>01087 { <a name="l01088"></a>01088 <span class="keywordflow">if</span>( from_outside ) <a name="l01089"></a>01089 { <a name="l01090"></a>01090 b = <a class="code" href="classKWinInternal_1_1Client.html#a20">rules</a>()-><a class="code" href="classKWinInternal_1_1WindowRules.html#a18">checkSkipTaskbar</a>( b ); <a name="l01091"></a>01091 original_skip_taskbar = b; <a name="l01092"></a>01092 } <a name="l01093"></a>01093 <span class="keywordflow">if</span> ( b == <a class="code" href="classKWinInternal_1_1Client.html#a70">skipTaskbar</a>() ) <a name="l01094"></a>01094 <span class="keywordflow">return</span>; <a name="l01095"></a>01095 skip_taskbar = b; <a name="l01096"></a>01096 info->setState( b?NET::SkipTaskbar:0, NET::SkipTaskbar ); <a name="l01097"></a>01097 updateWindowRules(); <a name="l01098"></a>01098 } <a name="l01099"></a>01099 <a name="l01100"></a><a class="code" href="classKWinInternal_1_1Client.html#a73">01100</a> <span class="keywordtype">void</span> <a class="code" href="classKWinInternal_1_1Client.html#a73">Client::setSkipPager</a>( <span class="keywordtype">bool</span> b ) <a name="l01101"></a>01101 { <a name="l01102"></a>01102 b = <a class="code" href="classKWinInternal_1_1Client.html#a20">rules</a>()-><a class="code" href="classKWinInternal_1_1WindowRules.html#a19">checkSkipPager</a>( b ); <a name="l01103"></a>01103 <span class="keywordflow">if</span> ( b == <a class="code" href="classKWinInternal_1_1Client.html#a72">skipPager</a>() ) <a name="l01104"></a>01104 <span class="keywordflow">return</span>; <a name="l01105"></a>01105 skip_pager = b; <a name="l01106"></a>01106 info->setState( b?NET::SkipPager:0, NET::SkipPager ); <a name="l01107"></a>01107 updateWindowRules(); <a name="l01108"></a>01108 } <a name="l01109"></a>01109 <a name="l01110"></a><a class="code" href="classKWinInternal_1_1Client.html#a81">01110</a> <span class="keywordtype">void</span> <a class="code" href="classKWinInternal_1_1Client.html#a81">Client::setModal</a>( <span class="keywordtype">bool</span> m ) <a name="l01111"></a>01111 { <span class="comment">// Qt-3.2 can have even modal normal windows :(</span> <a name="l01112"></a>01112 <span class="keywordflow">if</span>( modal == m ) <a name="l01113"></a>01113 <span class="keywordflow">return</span>; <a name="l01114"></a>01114 modal = m; <a name="l01115"></a>01115 <span class="keywordflow">if</span>( !modal ) <a name="l01116"></a>01116 <span class="keywordflow">return</span>; <a name="l01117"></a>01117 <span class="comment">// changing modality for a mapped window is weird (?)</span> <a name="l01118"></a>01118 <span class="comment">// _NET_WM_STATE_MODAL should possibly rather be _NET_WM_WINDOW_TYPE_MODAL_DIALOG</span> <a name="l01119"></a>01119 } <a name="l01120"></a>01120 <a name="l01121"></a><a class="code" href="classKWinInternal_1_1Client.html#a44">01121</a> <span class="keywordtype">void</span> <a class="code" href="classKWinInternal_1_1Client.html#a44">Client::setDesktop</a>( <span class="keywordtype">int</span> desktop ) <a name="l01122"></a>01122 { <a name="l01123"></a>01123 <span class="keywordflow">if</span>( desktop != NET::OnAllDesktops ) <span class="comment">// do range check</span> <a name="l01124"></a>01124 desktop = KMAX( 1, KMIN( <a class="code" href="classKWinInternal_1_1Client.html#a5">workspace</a>()->numberOfDesktops(), desktop )); <a name="l01125"></a>01125 desktop = <a class="code" href="classKWinInternal_1_1Client.html#a20">rules</a>()-><a class="code" href="classKWinInternal_1_1WindowRules.html#a13">checkDesktop</a>( desktop ); <a name="l01126"></a>01126 <span class="keywordflow">if</span>( desk == desktop ) <a name="l01127"></a>01127 <span class="keywordflow">return</span>; <a name="l01128"></a>01128 <span class="keywordtype">int</span> was_desk = desk; <a name="l01129"></a>01129 desk = desktop; <a name="l01130"></a>01130 info->setDesktop( desktop ); <a name="l01131"></a>01131 <span class="keywordflow">if</span>(( was_desk == NET::OnAllDesktops ) != ( desktop == NET::OnAllDesktops )) <a name="l01132"></a>01132 { <span class="comment">// onAllDesktops changed</span> <a name="l01133"></a>01133 <span class="keywordflow">if</span> ( <a class="code" href="classKWinInternal_1_1Client.html#a49">isShown</a>( <span class="keyword">true</span> )) <a name="l01134"></a>01134 <a class="code" href="classKWinInternal_1_1Notify.html#e0">Notify::raise</a>( <a class="code" href="classKWinInternal_1_1Client.html#a47">isOnAllDesktops</a>() ? Notify::OnAllDesktops : Notify::NotOnAllDesktops ); <a name="l01135"></a>01135 <a class="code" href="classKWinInternal_1_1Client.html#a5">workspace</a>()-><a class="code" href="classKWinInternal_1_1Workspace.html#a66">updateOnAllDesktopsOfTransients</a>( <span class="keyword">this</span> ); <a name="l01136"></a>01136 } <a name="l01137"></a>01137 <span class="keywordflow">if</span>( decoration != NULL ) <a name="l01138"></a>01138 decoration-><a class="code" href="classKDecoration.html#a44">desktopChange</a>(); <a name="l01139"></a>01139 <a class="code" href="classKWinInternal_1_1Client.html#a135">virtualDesktopChange</a>(); <span class="comment">// hide/show if needed</span> <a name="l01140"></a>01140 updateWindowRules(); <a name="l01141"></a>01141 } <a name="l01142"></a>01142 <a name="l01143"></a><a class="code" href="classKWinInternal_1_1Client.html#a48">01143</a> <span class="keywordtype">void</span> <a class="code" href="classKWinInternal_1_1Client.html#a48">Client::setOnAllDesktops</a>( <span class="keywordtype">bool</span> b ) <a name="l01144"></a>01144 { <a name="l01145"></a>01145 <span class="keywordflow">if</span>(( b && <a class="code" href="classKWinInternal_1_1Client.html#a47">isOnAllDesktops</a>()) <a name="l01146"></a>01146 || ( !b && !<a class="code" href="classKWinInternal_1_1Client.html#a47">isOnAllDesktops</a>())) <a name="l01147"></a>01147 <span class="keywordflow">return</span>; <a name="l01148"></a>01148 <span class="keywordflow">if</span>( b ) <a name="l01149"></a>01149 <a class="code" href="classKWinInternal_1_1Client.html#a44">setDesktop</a>( NET::OnAllDesktops ); <a name="l01150"></a>01150 <span class="keywordflow">else</span> <a name="l01151"></a>01151 <a class="code" href="classKWinInternal_1_1Client.html#a44">setDesktop</a>( <a class="code" href="classKWinInternal_1_1Client.html#a5">workspace</a>()->currentDesktop()); <a name="l01152"></a>01152 } <a name="l01153"></a>01153 <a name="l01154"></a><a class="code" href="classKWinInternal_1_1Client.html#a46">01154</a> <span class="keywordtype">bool</span> <a class="code" href="classKWinInternal_1_1Client.html#a46">Client::isOnCurrentDesktop</a>()<span class="keyword"> const</span> <a name="l01155"></a>01155 <span class="keyword"> </span>{ <a name="l01156"></a>01156 <span class="keywordflow">return</span> <a class="code" href="classKWinInternal_1_1Client.html#a45">isOnDesktop</a>( <a class="code" href="classKWinInternal_1_1Client.html#a5">workspace</a>()->currentDesktop()); <a name="l01157"></a>01157 } <a name="l01158"></a>01158 <a name="l01159"></a>01159 <span class="comment">// performs activation and/or raising of the window</span> <a name="l01160"></a><a class="code" href="classKWinInternal_1_1Client.html#a100">01160</a> <span class="keywordtype">void</span> <a class="code" href="classKWinInternal_1_1Client.html#a100">Client::takeActivity</a>( <span class="keywordtype">int</span> flags, <span class="keywordtype">bool</span> handled, <a class="code" href="namespaceKWinInternal.html#a120">allowed_t</a> ) <a name="l01161"></a>01161 { <a name="l01162"></a>01162 <span class="keywordflow">if</span>( !handled || !Ptakeactivity ) <a name="l01163"></a>01163 { <a name="l01164"></a>01164 <span class="keywordflow">if</span>( flags & ActivityFocus ) <a name="l01165"></a>01165 <a class="code" href="classKWinInternal_1_1Client.html#a101">takeFocus</a>( Allowed ); <a name="l01166"></a>01166 <span class="keywordflow">if</span>( flags & ActivityRaise ) <a name="l01167"></a>01167 <a class="code" href="classKWinInternal_1_1Client.html#a5">workspace</a>()-><a class="code" href="classKWinInternal_1_1Workspace.html#a34">raiseClient</a>( <span class="keyword">this</span> ); <a name="l01168"></a>01168 <span class="keywordflow">return</span>; <a name="l01169"></a>01169 } <a name="l01170"></a>01170 <a name="l01171"></a>01171 <span class="preprocessor">#ifndef NDEBUG</span> <a name="l01172"></a>01172 <span class="preprocessor"></span> <span class="keyword">static</span> Time previous_activity_timestamp; <a name="l01173"></a>01173 <span class="keyword">static</span> <a class="code" href="classKWinInternal_1_1Client.html">Client</a>* previous_client; <a name="l01174"></a>01174 <span class="keywordflow">if</span>( previous_activity_timestamp == qt_x_time && previous_client != this ) <a name="l01175"></a>01175 { <a name="l01176"></a>01176 kdWarning( 1212 ) << <span class="stringliteral">"Repeated use of the same X timestamp for activity"</span> << endl; <a name="l01177"></a>01177 kdDebug( 1212 ) << kdBacktrace() << endl; <a name="l01178"></a>01178 } <a name="l01179"></a>01179 previous_activity_timestamp = qt_x_time; <a name="l01180"></a>01180 previous_client = <span class="keyword">this</span>; <a name="l01181"></a>01181 <span class="preprocessor">#endif</span> <a name="l01182"></a>01182 <span class="preprocessor"></span> <a class="code" href="classKWinInternal_1_1Client.html#a5">workspace</a>()-><a class="code" href="classKWinInternal_1_1Workspace.html#a84">sendTakeActivity</a>( <span class="keyword">this</span>, qt_x_time, flags ); <a name="l01183"></a>01183 } <a name="l01184"></a>01184 <a name="l01185"></a>01185 <span class="comment">// performs the actual focusing of the window using XSetInputFocus and WM_TAKE_FOCUS</span> <a name="l01186"></a><a class="code" href="classKWinInternal_1_1Client.html#a101">01186</a> <span class="keywordtype">void</span> <a class="code" href="classKWinInternal_1_1Client.html#a101">Client::takeFocus</a>( <a class="code" href="namespaceKWinInternal.html#a120">allowed_t</a> ) <a name="l01187"></a>01187 { <a name="l01188"></a>01188 <span class="preprocessor">#ifndef NDEBUG</span> <a name="l01189"></a>01189 <span class="preprocessor"></span> <span class="keyword">static</span> Time previous_focus_timestamp; <a name="l01190"></a>01190 <span class="keyword">static</span> <a class="code" href="classKWinInternal_1_1Client.html">Client</a>* previous_client; <a name="l01191"></a>01191 <span class="keywordflow">if</span>( previous_focus_timestamp == qt_x_time && previous_client != this ) <a name="l01192"></a>01192 { <a name="l01193"></a>01193 kdWarning( 1212 ) << <span class="stringliteral">"Repeated use of the same X timestamp for focus"</span> << endl; <a name="l01194"></a>01194 kdDebug( 1212 ) << kdBacktrace() << endl; <a name="l01195"></a>01195 } <a name="l01196"></a>01196 previous_focus_timestamp = qt_x_time; <a name="l01197"></a>01197 previous_client = <span class="keyword">this</span>; <a name="l01198"></a>01198 <span class="preprocessor">#endif</span> <a name="l01199"></a>01199 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( <a class="code" href="classKWinInternal_1_1Client.html#a20">rules</a>()->checkAcceptFocus( input )) <a name="l01200"></a>01200 { <a name="l01201"></a>01201 XSetInputFocus( qt_xdisplay(), <a class="code" href="classKWinInternal_1_1Client.html#a1">window</a>(), RevertToPointerRoot, qt_x_time ); <a name="l01202"></a>01202 } <a name="l01203"></a>01203 <span class="keywordflow">if</span> ( Ptakefocus ) <a name="l01204"></a>01204 sendClientMessage(<a class="code" href="classKWinInternal_1_1Client.html#a1">window</a>(), <a class="code" href="namespaceKWinInternal.html#a0">atoms</a>-><a class="code" href="classKWinInternal_1_1Atoms.html#o1">wm_protocols</a>, <a class="code" href="namespaceKWinInternal.html#a0">atoms</a>-><a class="code" href="classKWinInternal_1_1Atoms.html#o3">wm_take_focus</a>); <a name="l01205"></a>01205 <a class="code" href="classKWinInternal_1_1Client.html#a5">workspace</a>()-><a class="code" href="classKWinInternal_1_1Workspace.html#a23">setShouldGetFocus</a>( <span class="keyword">this</span> ); <a name="l01206"></a>01206 } <a name="l01207"></a>01207 <a name="l01215"></a><a class="code" href="classKWinInternal_1_1Client.html#a120">01215</a> <span class="keywordtype">bool</span> <a class="code" href="classKWinInternal_1_1Client.html#a120">Client::providesContextHelp</a>()<span class="keyword"> const</span> <a name="l01216"></a>01216 <span class="keyword"> </span>{ <a name="l01217"></a>01217 <span class="keywordflow">return</span> Pcontexthelp; <a name="l01218"></a>01218 } <a name="l01219"></a>01219 <a name="l01220"></a>01220 <a name="l01227"></a><a class="code" href="classKWinInternal_1_1Client.html#a157">01227</a> <span class="keywordtype">void</span> <a class="code" href="classKWinInternal_1_1Client.html#a157">Client::showContextHelp</a>() <a name="l01228"></a>01228 { <a name="l01229"></a>01229 <span class="keywordflow">if</span> ( Pcontexthelp ) <a name="l01230"></a>01230 { <a name="l01231"></a>01231 sendClientMessage(<a class="code" href="classKWinInternal_1_1Client.html#a1">window</a>(), <a class="code" href="namespaceKWinInternal.html#a0">atoms</a>-><a class="code" href="classKWinInternal_1_1Atoms.html#o1">wm_protocols</a>, <a class="code" href="namespaceKWinInternal.html#a0">atoms</a>-><a class="code" href="classKWinInternal_1_1Atoms.html#o7">net_wm_context_help</a>); <a name="l01232"></a>01232 QWhatsThis::enterWhatsThisMode(); <span class="comment">// SELI?</span> <a name="l01233"></a>01233 } <a name="l01234"></a>01234 } <a name="l01235"></a>01235 <a name="l01236"></a>01236 <a name="l01241"></a>01241 <span class="keywordtype">void</span> Client::fetchName() <a name="l01242"></a>01242 { <a name="l01243"></a>01243 setCaption( readName()); <a name="l01244"></a>01244 } <a name="l01245"></a>01245 <a name="l01246"></a>01246 QString Client::readName()<span class="keyword"> const</span> <a name="l01247"></a>01247 <span class="keyword"> </span>{ <a name="l01248"></a>01248 <span class="keywordflow">if</span> ( info->name() && info->name()[ 0 ] != <span class="charliteral">'\0'</span> ) <a name="l01249"></a>01249 <span class="keywordflow">return</span> QString::fromUtf8( info->name() ); <a name="l01250"></a>01250 <span class="keywordflow">else</span> <a name="l01251"></a>01251 <span class="keywordflow">return</span> KWin::readNameProperty( <a class="code" href="classKWinInternal_1_1Client.html#a1">window</a>(), XA_WM_NAME ); <a name="l01252"></a>01252 } <a name="l01253"></a>01253 <a name="l01254"></a>01254 KWIN_COMPARE_PREDICATE( FetchNameInternalPredicate, <span class="keyword">const</span> Client*, (!cl->isSpecialWindow() || cl->isToolbar()) && cl != value && cl->caption() == value->caption()); <a name="l01255"></a>01255 <a name="l01256"></a>01256 <span class="keywordtype">void</span> Client::setCaption( <span class="keyword">const</span> QString& s, <span class="keywordtype">bool</span> force ) <a name="l01257"></a>01257 { <a name="l01258"></a>01258 <span class="keywordflow">if</span> ( s != cap_normal || force ) <a name="l01259"></a>01259 { <a name="l01260"></a>01260 <span class="keywordtype">bool</span> reset_name = force; <a name="l01261"></a>01261 <span class="keywordflow">for</span>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; <a name="l01262"></a>01262 i < s.length(); <a name="l01263"></a>01263 ++i ) <a name="l01264"></a>01264 <span class="keywordflow">if</span>( !s[ i ].isPrint()) <a name="l01265"></a>01265 s[ i ] = <span class="charliteral">' '</span>; <a name="l01266"></a>01266 cap_normal = s; <a name="l01267"></a>01267 <span class="keywordtype">bool</span> was_suffix = ( !cap_suffix.isEmpty()); <a name="l01268"></a>01268 QString machine_suffix; <a name="l01269"></a>01269 <span class="keywordflow">if</span>( <a class="code" href="classKWinInternal_1_1Client.html#a129">wmClientMachine</a>( <span class="keyword">false</span> ) != <span class="stringliteral">"localhost"</span> && !<a class="code" href="namespaceKWinInternal.html#a107">isLocalMachine</a>( <a class="code" href="classKWinInternal_1_1Client.html#a129">wmClientMachine</a>( <span class="keyword">false</span> ))) <a name="l01270"></a>01270 machine_suffix = <span class="stringliteral">" <@"</span> + <a class="code" href="classKWinInternal_1_1Client.html#a129">wmClientMachine</a>( <span class="keyword">true</span> ) + <span class="stringliteral">">"</span>; <a name="l01271"></a>01271 QString shortcut_suffix = !<a class="code" href="classKWinInternal_1_1Client.html#a121">shortcut</a>().isNull() ? ( <span class="stringliteral">" {"</span> + <a class="code" href="classKWinInternal_1_1Client.html#a121">shortcut</a>().toString() + <span class="stringliteral">"}"</span> ) : <span class="stringliteral">""</span>; <a name="l01272"></a>01272 cap_suffix = machine_suffix + shortcut_suffix; <a name="l01273"></a>01273 <span class="keywordflow">if</span> ( ( !<a class="code" href="classKWinInternal_1_1Client.html#a97">isSpecialWindow</a>() || <a class="code" href="classKWinInternal_1_1Client.html#a89">isToolbar</a>()) && <a class="code" href="classKWinInternal_1_1Client.html#a5">workspace</a>()->findClient( <a class="code" href="classKWinInternal_1_1Client.html#n1">FetchNameInternalPredicate</a>( <span class="keyword">this</span> ))) <a name="l01274"></a>01274 { <a name="l01275"></a>01275 <span class="keywordtype">int</span> i = 2; <a name="l01276"></a>01276 <span class="keywordflow">do</span> <a name="l01277"></a>01277 { <a name="l01278"></a>01278 cap_suffix = machine_suffix + <span class="stringliteral">" <"</span> + QString::number(i) + <span class="stringliteral">">"</span> + shortcut_suffix; <a name="l01279"></a>01279 i++; <a name="l01280"></a>01280 } <span class="keywordflow">while</span> ( <a class="code" href="classKWinInternal_1_1Client.html#a5">workspace</a>()->findClient( <a class="code" href="classKWinInternal_1_1Client.html#n1">FetchNameInternalPredicate</a>( <span class="keyword">this</span> ))); <a name="l01281"></a>01281 info->setVisibleName( <a class="code" href="classKWinInternal_1_1Client.html#a136">caption</a>().utf8() ); <a name="l01282"></a>01282 reset_name = <span class="keyword">false</span>; <a name="l01283"></a>01283 } <a name="l01284"></a>01284 <span class="keywordflow">if</span>(( was_suffix && cap_suffix.isEmpty() <a name="l01285"></a>01285 || reset_name )) <span class="comment">// if it was new window, it may have old value still set, if the window is reused</span> <a name="l01286"></a>01286 { <a name="l01287"></a>01287 info->setVisibleName( <span class="stringliteral">""</span> ); <span class="comment">// remove</span> <a name="l01288"></a>01288 info->setVisibleIconName( <span class="stringliteral">""</span> ); <span class="comment">// remove</span> <a name="l01289"></a>01289 } <a name="l01290"></a>01290 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( !cap_suffix.isEmpty() && !cap_iconic.isEmpty()) <span class="comment">// keep the same suffix in iconic name if it's set</span> <a name="l01291"></a>01291 info->setVisibleIconName( ( cap_iconic + cap_suffix ).utf8() ); <a name="l01292"></a>01292 <a name="l01293"></a>01293 <span class="keywordflow">if</span>( isManaged() && decoration != NULL ) <a name="l01294"></a>01294 decoration-><a class="code" href="classKDecoration.html#a41">captionChange</a>(); <a name="l01295"></a>01295 } <a name="l01296"></a>01296 } <a name="l01297"></a>01297 <a name="l01298"></a><a class="code" href="classKWinInternal_1_1Client.html#a137">01298</a> <span class="keywordtype">void</span> <a class="code" href="classKWinInternal_1_1Client.html#a137">Client::updateCaption</a>() <a name="l01299"></a>01299 { <a name="l01300"></a>01300 setCaption( cap_normal, <span class="keyword">true</span> ); <a name="l01301"></a>01301 } <a name="l01302"></a>01302 <a name="l01303"></a>01303 <span class="keywordtype">void</span> Client::fetchIconicName() <a name="l01304"></a>01304 { <a name="l01305"></a>01305 QString s; <a name="l01306"></a>01306 <span class="keywordflow">if</span> ( info->iconName() && info->iconName()[ 0 ] != <span class="charliteral">'\0'</span> ) <a name="l01307"></a>01307 s = QString::fromUtf8( info->iconName() ); <a name="l01308"></a>01308 <span class="keywordflow">else</span> <a name="l01309"></a>01309 s = KWin::readNameProperty( <a class="code" href="classKWinInternal_1_1Client.html#a1">window</a>(), XA_WM_ICON_NAME ); <a name="l01310"></a>01310 <span class="keywordflow">if</span> ( s != cap_iconic ) <a name="l01311"></a>01311 { <a name="l01312"></a>01312 <span class="keywordtype">bool</span> was_set = !cap_iconic.isEmpty(); <a name="l01313"></a>01313 cap_iconic = s; <a name="l01314"></a>01314 <span class="keywordflow">if</span>( !cap_suffix.isEmpty()) <a name="l01315"></a>01315 { <a name="l01316"></a>01316 <span class="keywordflow">if</span>( !cap_iconic.isEmpty()) <span class="comment">// keep the same suffix in iconic name if it's set</span> <a name="l01317"></a>01317 info->setVisibleIconName( ( s + cap_suffix ).utf8() ); <a name="l01318"></a>01318 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( was_set ) <a name="l01319"></a>01319 info->setVisibleIconName( <span class="stringliteral">""</span> ); <span class="comment">//remove</span> <a name="l01320"></a>01320 } <a name="l01321"></a>01321 } <a name="l01322"></a>01322 } <a name="l01323"></a>01323 <a name="l01326"></a><a class="code" href="classKWinInternal_1_1Client.html#a136">01326</a> QString <a class="code" href="classKWinInternal_1_1Client.html#a136">Client::caption</a>( <span class="keywordtype">bool</span> full )<span class="keyword"> const</span> <a name="l01327"></a>01327 <span class="keyword"> </span>{ <a name="l01328"></a>01328 <span class="keywordflow">return</span> full ? cap_normal + cap_suffix : cap_normal; <a name="l01329"></a>01329 } <a name="l01330"></a>01330 <a name="l01331"></a>01331 <span class="keywordtype">void</span> Client::getWMHints() <a name="l01332"></a>01332 { <a name="l01333"></a>01333 XWMHints *hints = XGetWMHints(qt_xdisplay(), <a class="code" href="classKWinInternal_1_1Client.html#a1">window</a>() ); <a name="l01334"></a>01334 input = <span class="keyword">true</span>; <a name="l01335"></a>01335 window_group = None; <a name="l01336"></a>01336 urgency = <span class="keyword">false</span>; <a name="l01337"></a>01337 <span class="keywordflow">if</span> ( hints ) <a name="l01338"></a>01338 { <a name="l01339"></a>01339 <span class="keywordflow">if</span>( hints->flags & InputHint ) <a name="l01340"></a>01340 input = hints->input; <a name="l01341"></a>01341 <span class="keywordflow">if</span>( hints->flags & WindowGroupHint ) <a name="l01342"></a>01342 window_group = hints->window_group; <a name="l01343"></a>01343 urgency = ( hints->flags & UrgencyHint ) ? <span class="keyword">true</span> : <span class="keyword">false</span>; <span class="comment">// true/false needed, it's uint bitfield</span> <a name="l01344"></a>01344 XFree( (<span class="keywordtype">char</span>*)hints ); <a name="l01345"></a>01345 } <a name="l01346"></a>01346 <a class="code" href="classKWinInternal_1_1Client.html#a18">checkGroup</a>(); <a name="l01347"></a>01347 updateUrgency(); <a name="l01348"></a>01348 updateAllowedActions(); <span class="comment">// group affects isMinimizable()</span> <a name="l01349"></a>01349 } <a name="l01350"></a>01350 <a name="l01351"></a>01351 <span class="keywordtype">void</span> Client::getMotifHints() <a name="l01352"></a>01352 { <a name="l01353"></a>01353 <span class="keywordtype">bool</span> mnoborder, mresize, mmove, mminimize, mmaximize, mclose; <a name="l01354"></a>01354 <a class="code" href="classKWinInternal_1_1Motif.html#e0">Motif::readFlags</a>( client, mnoborder, mresize, mmove, mminimize, mmaximize, mclose ); <a name="l01355"></a>01355 motif_noborder = mnoborder; <a name="l01356"></a>01356 <span class="keywordflow">if</span>( !<a class="code" href="classKWinInternal_1_1Client.html#a85">hasNETSupport</a>()) <span class="comment">// NETWM apps should set type and size constraints</span> <a name="l01357"></a>01357 { <a name="l01358"></a>01358 motif_may_resize = mresize; <span class="comment">// this should be set using minsize==maxsize, but oh well</span> <a name="l01359"></a>01359 motif_may_move = mmove; <a name="l01360"></a>01360 } <a name="l01361"></a>01361 <span class="comment">// mminimize; - ignore, bogus - e.g. shading or sending to another desktop is "minimizing" too</span> <a name="l01362"></a>01362 <span class="comment">// mmaximize; - ignore, bogus - maximizing is basically just resizing</span> <a name="l01363"></a>01363 motif_may_close = mclose; <span class="comment">// motif apps like to crash when they set this hint and WM closes them anyway</span> <a name="l01364"></a>01364 <span class="keywordflow">if</span>( isManaged()) <a name="l01365"></a>01365 <a class="code" href="classKWinInternal_1_1Client.html#a105">updateDecoration</a>( <span class="keyword">true</span> ); <span class="comment">// check if noborder state has changed</span> <a name="l01366"></a>01366 } <a name="l01367"></a>01367 <a name="l01368"></a><a class="code" href="classKWinInternal_1_1Client.html#e8">01368</a> <span class="keywordtype">void</span> Client::readIcons( Window win, QPixmap* icon, QPixmap* miniicon ) <a name="l01369"></a>01369 { <a name="l01370"></a>01370 <span class="comment">// get the icons, allow scaling</span> <a name="l01371"></a>01371 <span class="keywordflow">if</span>( icon != NULL ) <a name="l01372"></a>01372 *icon = KWin::icon( win, 32, 32, TRUE, KWin::NETWM | KWin::WMHints ); <a name="l01373"></a>01373 <span class="keywordflow">if</span>( miniicon != NULL ) <a name="l01374"></a>01374 <span class="keywordflow">if</span>( icon == NULL || !icon->isNull()) <a name="l01375"></a>01375 *miniicon = KWin::icon( win, 16, 16, TRUE, KWin::NETWM | KWin::WMHints ); <a name="l01376"></a>01376 <span class="keywordflow">else</span> <a name="l01377"></a>01377 *miniicon = QPixmap(); <a name="l01378"></a>01378 } <a name="l01379"></a>01379 <a name="l01380"></a>01380 <span class="keywordtype">void</span> Client::getIcons() <a name="l01381"></a>01381 { <a name="l01382"></a>01382 <span class="comment">// first read icons from the window itself</span> <a name="l01383"></a>01383 readIcons( <a class="code" href="classKWinInternal_1_1Client.html#a1">window</a>(), &icon_pix, &miniicon_pix ); <a name="l01384"></a>01384 <span class="keywordflow">if</span>( icon_pix.isNull()) <a name="l01385"></a>01385 { <span class="comment">// then try window group</span> <a name="l01386"></a>01386 icon_pix = <a class="code" href="classKWinInternal_1_1Client.html#a16">group</a>()-><a class="code" href="classKWinInternal_1_1Group.html#a6">icon</a>(); <a name="l01387"></a>01387 miniicon_pix = <a class="code" href="classKWinInternal_1_1Client.html#a16">group</a>()-><a class="code" href="classKWinInternal_1_1Group.html#a7">miniIcon</a>(); <a name="l01388"></a>01388 } <a name="l01389"></a>01389 <span class="keywordflow">if</span>( icon_pix.isNull() && <a class="code" href="classKWinInternal_1_1Client.html#a8">isTransient</a>()) <a name="l01390"></a>01390 { <span class="comment">// then mainclients</span> <a name="l01391"></a>01391 <a class="code" href="namespaceKWinInternal.html#a24">ClientList</a> mainclients = <a class="code" href="classKWinInternal_1_1Client.html#a11">mainClients</a>(); <a name="l01392"></a>01392 <span class="keywordflow">for</span>( ClientList::ConstIterator it = mainclients.begin(); <a name="l01393"></a>01393 it != mainclients.end() && icon_pix.isNull(); <a name="l01394"></a>01394 ++it ) <a name="l01395"></a>01395 { <a name="l01396"></a>01396 icon_pix = (*it)->icon(); <a name="l01397"></a>01397 miniicon_pix = (*it)->miniIcon(); <a name="l01398"></a>01398 } <a name="l01399"></a>01399 } <a name="l01400"></a>01400 <span class="keywordflow">if</span>( icon_pix.isNull()) <a name="l01401"></a>01401 { <span class="comment">// and if nothing else, load icon from classhint or xapp icon</span> <a name="l01402"></a>01402 icon_pix = KWin::icon( <a class="code" href="classKWinInternal_1_1Client.html#a1">window</a>(), 32, 32, TRUE, KWin::ClassHint | KWin::XApp ); <a name="l01403"></a>01403 miniicon_pix = KWin::icon( <a class="code" href="classKWinInternal_1_1Client.html#a1">window</a>(), 16, 16, TRUE, KWin::ClassHint | KWin::XApp ); <a name="l01404"></a>01404 } <a name="l01405"></a>01405 <span class="keywordflow">if</span>( isManaged() && decoration != NULL ) <a name="l01406"></a>01406 decoration-><a class="code" href="classKDecoration.html#a42">iconChange</a>(); <a name="l01407"></a>01407 } <a name="l01408"></a>01408 <a name="l01409"></a>01409 <span class="keywordtype">void</span> Client::getWindowProtocols() <a name="l01410"></a>01410 { <a name="l01411"></a>01411 Atom *p; <a name="l01412"></a>01412 <span class="keywordtype">int</span> i,n; <a name="l01413"></a>01413 <a name="l01414"></a>01414 Pdeletewindow = 0; <a name="l01415"></a>01415 Ptakefocus = 0; <a name="l01416"></a>01416 Ptakeactivity = 0; <a name="l01417"></a>01417 Pcontexthelp = 0; <a name="l01418"></a>01418 Pping = 0; <a name="l01419"></a>01419 <a name="l01420"></a>01420 <span class="keywordflow">if</span> (XGetWMProtocols(qt_xdisplay(), <a class="code" href="classKWinInternal_1_1Client.html#a1">window</a>(), &p, &n)) <a name="l01421"></a>01421 { <a name="l01422"></a>01422 <span class="keywordflow">for</span> (i = 0; i < n; i++) <a name="l01423"></a>01423 <span class="keywordflow">if</span> (p[i] == <a class="code" href="namespaceKWinInternal.html#a0">atoms</a>->wm_delete_window) <a name="l01424"></a>01424 Pdeletewindow = 1; <a name="l01425"></a>01425 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (p[i] == <a class="code" href="namespaceKWinInternal.html#a0">atoms</a>->wm_take_focus) <a name="l01426"></a>01426 Ptakefocus = 1; <a name="l01427"></a>01427 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (p[i] == <a class="code" href="namespaceKWinInternal.html#a0">atoms</a>->net_wm_take_activity) <a name="l01428"></a>01428 Ptakeactivity = 1; <a name="l01429"></a>01429 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (p[i] == <a class="code" href="namespaceKWinInternal.html#a0">atoms</a>->net_wm_context_help) <a name="l01430"></a>01430 Pcontexthelp = 1; <a name="l01431"></a>01431 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (p[i] == <a class="code" href="namespaceKWinInternal.html#a0">atoms</a>->net_wm_ping) <a name="l01432"></a>01432 Pping = 1; <a name="l01433"></a>01433 <span class="keywordflow">if</span> (n>0) <a name="l01434"></a>01434 XFree(p); <a name="l01435"></a>01435 } <a name="l01436"></a>01436 } <a name="l01437"></a>01437 <a name="l01438"></a><a class="code" href="namespaceKWinInternal.html#a60">01438</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="namespaceKWinInternal.html#a60">nullErrorHandler</a>(Display *, XErrorEvent *) <a name="l01439"></a>01439 { <a name="l01440"></a>01440 <span class="keywordflow">return</span> 0; <a name="l01441"></a>01441 } <a name="l01442"></a>01442 <a name="l01446"></a><a class="code" href="classKWinInternal_1_1Client.html#e0">01446</a> QCString <a class="code" href="classKWinInternal_1_1Client.html#e0">Client::staticWindowRole</a>(WId w) <a name="l01447"></a>01447 { <a name="l01448"></a>01448 <span class="keywordflow">return</span> <a class="code" href="namespaceKWinInternal.html#a102">getStringProperty</a>(w, qt_window_role).lower(); <a name="l01449"></a>01449 } <a name="l01450"></a>01450 <a name="l01454"></a><a class="code" href="classKWinInternal_1_1Client.html#e1">01454</a> QCString <a class="code" href="classKWinInternal_1_1Client.html#e1">Client::staticSessionId</a>(WId w) <a name="l01455"></a>01455 { <a name="l01456"></a>01456 <span class="keywordflow">return</span> <a class="code" href="namespaceKWinInternal.html#a102">getStringProperty</a>(w, qt_sm_client_id); <a name="l01457"></a>01457 } <a name="l01458"></a>01458 <a name="l01462"></a><a class="code" href="classKWinInternal_1_1Client.html#e2">01462</a> QCString <a class="code" href="classKWinInternal_1_1Client.html#e2">Client::staticWmCommand</a>(WId w) <a name="l01463"></a>01463 { <a name="l01464"></a>01464 <span class="keywordflow">return</span> <a class="code" href="namespaceKWinInternal.html#a102">getStringProperty</a>(w, XA_WM_COMMAND, <span class="charliteral">' '</span>); <a name="l01465"></a>01465 } <a name="l01466"></a>01466 <a name="l01470"></a><a class="code" href="classKWinInternal_1_1Client.html#e4">01470</a> Window <a class="code" href="classKWinInternal_1_1Client.html#e4">Client::staticWmClientLeader</a>(WId w) <a name="l01471"></a>01471 { <a name="l01472"></a>01472 Atom type; <a name="l01473"></a>01473 <span class="keywordtype">int</span> format, status; <a name="l01474"></a>01474 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> nitems = 0; <a name="l01475"></a>01475 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> extra = 0; <a name="l01476"></a>01476 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *data = 0; <a name="l01477"></a>01477 Window result = w; <a name="l01478"></a>01478 XErrorHandler oldHandler = XSetErrorHandler(<a class="code" href="namespaceKWinInternal.html#a60">nullErrorHandler</a>); <a name="l01479"></a>01479 status = XGetWindowProperty( qt_xdisplay(), w, <a class="code" href="namespaceKWinInternal.html#a0">atoms</a>-><a class="code" href="classKWinInternal_1_1Atoms.html#o5">wm_client_leader</a>, 0, 10000, <a name="l01480"></a>01480 FALSE, XA_WINDOW, &type, &format, <a name="l01481"></a>01481 &nitems, &extra, &data ); <a name="l01482"></a>01482 XSetErrorHandler(oldHandler); <a name="l01483"></a>01483 <span class="keywordflow">if</span> (status == Success ) <a name="l01484"></a>01484 { <a name="l01485"></a>01485 <span class="keywordflow">if</span> (data && nitems > 0) <a name="l01486"></a>01486 result = *((Window*) data); <a name="l01487"></a>01487 XFree(data); <a name="l01488"></a>01488 } <a name="l01489"></a>01489 <span class="keywordflow">return</span> result; <a name="l01490"></a>01490 } <a name="l01491"></a>01491 <a name="l01492"></a>01492 <a name="l01493"></a>01493 <span class="keywordtype">void</span> Client::getWmClientLeader() <a name="l01494"></a>01494 { <a name="l01495"></a>01495 wmClientLeaderWin = <a class="code" href="classKWinInternal_1_1Client.html#e4">staticWmClientLeader</a>(<a class="code" href="classKWinInternal_1_1Client.html#a1">window</a>()); <a name="l01496"></a>01496 } <a name="l01497"></a>01497 <a name="l01502"></a><a class="code" href="classKWinInternal_1_1Client.html#a125">01502</a> QCString <a class="code" href="classKWinInternal_1_1Client.html#a125">Client::sessionId</a>() <a name="l01503"></a>01503 { <a name="l01504"></a>01504 QCString result = <a class="code" href="classKWinInternal_1_1Client.html#e1">staticSessionId</a>(<a class="code" href="classKWinInternal_1_1Client.html#a1">window</a>()); <a name="l01505"></a>01505 <span class="keywordflow">if</span> (result.isEmpty() && wmClientLeaderWin && wmClientLeaderWin!=<a class="code" href="classKWinInternal_1_1Client.html#a1">window</a>()) <a name="l01506"></a>01506 result = <a class="code" href="classKWinInternal_1_1Client.html#e1">staticSessionId</a>(wmClientLeaderWin); <a name="l01507"></a>01507 <span class="keywordflow">return</span> result; <a name="l01508"></a>01508 } <a name="l01509"></a>01509 <a name="l01514"></a><a class="code" href="classKWinInternal_1_1Client.html#a128">01514</a> QCString <a class="code" href="classKWinInternal_1_1Client.html#a128">Client::wmCommand</a>() <a name="l01515"></a>01515 { <a name="l01516"></a>01516 QCString result = <a class="code" href="classKWinInternal_1_1Client.html#e2">staticWmCommand</a>(<a class="code" href="classKWinInternal_1_1Client.html#a1">window</a>()); <a name="l01517"></a>01517 <span class="keywordflow">if</span> (result.isEmpty() && wmClientLeaderWin && wmClientLeaderWin!=<a class="code" href="classKWinInternal_1_1Client.html#a1">window</a>()) <a name="l01518"></a>01518 result = <a class="code" href="classKWinInternal_1_1Client.html#e2">staticWmCommand</a>(wmClientLeaderWin); <a name="l01519"></a>01519 <span class="keywordflow">return</span> result; <a name="l01520"></a>01520 } <a name="l01521"></a>01521 <a name="l01522"></a>01522 <span class="keywordtype">void</span> Client::getWmClientMachine() <a name="l01523"></a>01523 { <a name="l01524"></a>01524 client_machine = <a class="code" href="namespaceKWinInternal.html#a102">getStringProperty</a>(<a class="code" href="classKWinInternal_1_1Client.html#a1">window</a>(), XA_WM_CLIENT_MACHINE); <a name="l01525"></a>01525 <span class="keywordflow">if</span>( client_machine.isEmpty() && wmClientLeaderWin && wmClientLeaderWin!=<a class="code" href="classKWinInternal_1_1Client.html#a1">window</a>()) <a name="l01526"></a>01526 client_machine = <a class="code" href="namespaceKWinInternal.html#a102">getStringProperty</a>(wmClientLeaderWin, XA_WM_CLIENT_MACHINE); <a name="l01527"></a>01527 <span class="keywordflow">if</span>( client_machine.isEmpty()) <a name="l01528"></a>01528 client_machine = <span class="stringliteral">"localhost"</span>; <a name="l01529"></a>01529 } <a name="l01530"></a>01530 <a name="l01535"></a><a class="code" href="classKWinInternal_1_1Client.html#a129">01535</a> QCString <a class="code" href="classKWinInternal_1_1Client.html#a129">Client::wmClientMachine</a>( <span class="keywordtype">bool</span> use_localhost )<span class="keyword"> const</span> <a name="l01536"></a>01536 <span class="keyword"> </span>{ <a name="l01537"></a>01537 QCString result = client_machine; <a name="l01538"></a>01538 <span class="keywordflow">if</span>( use_localhost ) <a name="l01539"></a>01539 { <span class="comment">// special name for the local machine (localhost)</span> <a name="l01540"></a>01540 <span class="keywordflow">if</span>( result != <span class="stringliteral">"localhost"</span> && <a class="code" href="namespaceKWinInternal.html#a107">isLocalMachine</a>( result )) <a name="l01541"></a>01541 result = <span class="stringliteral">"localhost"</span>; <a name="l01542"></a>01542 } <a name="l01543"></a>01543 <span class="keywordflow">return</span> result; <a name="l01544"></a>01544 } <a name="l01545"></a>01545 <a name="l01550"></a><a class="code" href="classKWinInternal_1_1Client.html#a130">01550</a> Window <a class="code" href="classKWinInternal_1_1Client.html#a130">Client::wmClientLeader</a>()<span class="keyword"> const</span> <a name="l01551"></a>01551 <span class="keyword"> </span>{ <a name="l01552"></a>01552 <span class="keywordflow">if</span> (wmClientLeaderWin) <a name="l01553"></a>01553 <span class="keywordflow">return</span> wmClientLeaderWin; <a name="l01554"></a>01554 <span class="keywordflow">return</span> <a class="code" href="classKWinInternal_1_1Client.html#a1">window</a>(); <a name="l01555"></a>01555 } <a name="l01556"></a>01556 <a name="l01557"></a><a class="code" href="classKWinInternal_1_1Client.html#a83">01557</a> <span class="keywordtype">bool</span> <a class="code" href="classKWinInternal_1_1Client.html#a83">Client::wantsTabFocus</a>()<span class="keyword"> const</span> <a name="l01558"></a>01558 <span class="keyword"> </span>{ <a name="l01559"></a>01559 <span class="keywordflow">return</span> ( <a class="code" href="classKWinInternal_1_1Client.html#a92">isNormalWindow</a>() || <a class="code" href="classKWinInternal_1_1Client.html#a93">isDialog</a>() || <a class="code" href="classKWinInternal_1_1Client.html#a96">isOverride</a>()) && <a class="code" href="classKWinInternal_1_1Client.html#a84">wantsInput</a>() && !skip_taskbar; <a name="l01560"></a>01560 } <a name="l01561"></a>01561 <a name="l01562"></a>01562 <a name="l01563"></a><a class="code" href="classKWinInternal_1_1Client.html#a84">01563</a> <span class="keywordtype">bool</span> <a class="code" href="classKWinInternal_1_1Client.html#a84">Client::wantsInput</a>()<span class="keyword"> const</span> <a name="l01564"></a>01564 <span class="keyword"> </span>{ <a name="l01565"></a>01565 <span class="keywordflow">return</span> <a class="code" href="classKWinInternal_1_1Client.html#a20">rules</a>()-><a class="code" href="classKWinInternal_1_1WindowRules.html#a25">checkAcceptFocus</a>( input || Ptakefocus ); <a name="l01566"></a>01566 } <a name="l01567"></a>01567 <a name="l01568"></a><a class="code" href="classKWinInternal_1_1Client.html#a87">01568</a> <span class="keywordtype">bool</span> <a class="code" href="classKWinInternal_1_1Client.html#a87">Client::isDesktop</a>()<span class="keyword"> const</span> <a name="l01569"></a>01569 <span class="keyword"> </span>{ <a name="l01570"></a>01570 <span class="keywordflow">return</span> <a class="code" href="classKWinInternal_1_1Client.html#a19">windowType</a>() == NET::Desktop; <a name="l01571"></a>01571 } <a name="l01572"></a>01572 <a name="l01573"></a><a class="code" href="classKWinInternal_1_1Client.html#a88">01573</a> <span class="keywordtype">bool</span> <a class="code" href="classKWinInternal_1_1Client.html#a88">Client::isDock</a>()<span class="keyword"> const</span> <a name="l01574"></a>01574 <span class="keyword"> </span>{ <a name="l01575"></a>01575 <span class="keywordflow">return</span> <a class="code" href="classKWinInternal_1_1Client.html#a19">windowType</a>() == NET::Dock; <a name="l01576"></a>01576 } <a name="l01577"></a>01577 <a name="l01578"></a><a class="code" href="classKWinInternal_1_1Client.html#a90">01578</a> <span class="keywordtype">bool</span> <a class="code" href="classKWinInternal_1_1Client.html#a90">Client::isTopMenu</a>()<span class="keyword"> const</span> <a name="l01579"></a>01579 <span class="keyword"> </span>{ <a name="l01580"></a>01580 <span class="keywordflow">return</span> <a class="code" href="classKWinInternal_1_1Client.html#a19">windowType</a>() == NET::TopMenu; <a name="l01581"></a>01581 } <a name="l01582"></a>01582 <a name="l01583"></a>01583 <a name="l01584"></a><a class="code" href="classKWinInternal_1_1Client.html#a91">01584</a> <span class="keywordtype">bool</span> <a class="code" href="classKWinInternal_1_1Client.html#a91">Client::isMenu</a>()<span class="keyword"> const</span> <a name="l01585"></a>01585 <span class="keyword"> </span>{ <a name="l01586"></a>01586 <span class="keywordflow">return</span> <a class="code" href="classKWinInternal_1_1Client.html#a19">windowType</a>() == NET::Menu && !<a class="code" href="classKWinInternal_1_1Client.html#a90">isTopMenu</a>(); <span class="comment">// because of backwards comp.</span> <a name="l01587"></a>01587 } <a name="l01588"></a>01588 <a name="l01589"></a><a class="code" href="classKWinInternal_1_1Client.html#a89">01589</a> <span class="keywordtype">bool</span> <a class="code" href="classKWinInternal_1_1Client.html#a89">Client::isToolbar</a>()<span class="keyword"> const</span> <a name="l01590"></a>01590 <span class="keyword"> </span>{ <a name="l01591"></a>01591 <span class="keywordflow">return</span> <a class="code" href="classKWinInternal_1_1Client.html#a19">windowType</a>() == NET::Toolbar; <a name="l01592"></a>01592 } <a name="l01593"></a>01593 <a name="l01594"></a><a class="code" href="classKWinInternal_1_1Client.html#a96">01594</a> <span class="keywordtype">bool</span> <a class="code" href="classKWinInternal_1_1Client.html#a96">Client::isOverride</a>()<span class="keyword"> const</span> <a name="l01595"></a>01595 <span class="keyword"> </span>{ <a name="l01596"></a>01596 <span class="keywordflow">return</span> <a class="code" href="classKWinInternal_1_1Client.html#a19">windowType</a>() == NET::Override; <a name="l01597"></a>01597 } <a name="l01598"></a>01598 <a name="l01599"></a><a class="code" href="classKWinInternal_1_1Client.html#a94">01599</a> <span class="keywordtype">bool</span> <a class="code" href="classKWinInternal_1_1Client.html#a94">Client::isSplash</a>()<span class="keyword"> const</span> <a name="l01600"></a>01600 <span class="keyword"> </span>{ <a name="l01601"></a>01601 <span class="keywordflow">return</span> <a class="code" href="classKWinInternal_1_1Client.html#a19">windowType</a>() == NET::Splash; <a name="l01602"></a>01602 } <a name="l01603"></a>01603 <a name="l01604"></a><a class="code" href="classKWinInternal_1_1Client.html#a95">01604</a> <span class="keywordtype">bool</span> <a class="code" href="classKWinInternal_1_1Client.html#a95">Client::isUtility</a>()<span class="keyword"> const</span> <a name="l01605"></a>01605 <span class="keyword"> </span>{ <a name="l01606"></a>01606 <span class="keywordflow">return</span> <a class="code" href="classKWinInternal_1_1Client.html#a19">windowType</a>() == NET::Utility; <a name="l01607"></a>01607 } <a name="l01608"></a>01608 <a name="l01609"></a><a class="code" href="classKWinInternal_1_1Client.html#a93">01609</a> <span class="keywordtype">bool</span> <a class="code" href="classKWinInternal_1_1Client.html#a93">Client::isDialog</a>()<span class="keyword"> const</span> <a name="l01610"></a>01610 <span class="keyword"> </span>{ <a name="l01611"></a>01611 <span class="keywordflow">return</span> <a class="code" href="classKWinInternal_1_1Client.html#a19">windowType</a>() == NET::Dialog; <a name="l01612"></a>01612 } <a name="l01613"></a>01613 <a name="l01614"></a><a class="code" href="classKWinInternal_1_1Client.html#a92">01614</a> <span class="keywordtype">bool</span> <a class="code" href="classKWinInternal_1_1Client.html#a92">Client::isNormalWindow</a>()<span class="keyword"> const</span> <a name="l01615"></a>01615 <span class="keyword"> </span>{ <a name="l01616"></a>01616 <span class="keywordflow">return</span> <a class="code" href="classKWinInternal_1_1Client.html#a19">windowType</a>() == NET::Normal; <a name="l01617"></a>01617 } <a name="l01618"></a>01618 <a name="l01619"></a><a class="code" href="classKWinInternal_1_1Client.html#a97">01619</a> <span class="keywordtype">bool</span> <a class="code" href="classKWinInternal_1_1Client.html#a97">Client::isSpecialWindow</a>()<span class="keyword"> const</span> <a name="l01620"></a>01620 <span class="keyword"> </span>{ <a name="l01621"></a>01621 <span class="keywordflow">return</span> <a class="code" href="classKWinInternal_1_1Client.html#a87">isDesktop</a>() || <a class="code" href="classKWinInternal_1_1Client.html#a88">isDock</a>() || <a class="code" href="classKWinInternal_1_1Client.html#a94">isSplash</a>() || <a class="code" href="classKWinInternal_1_1Client.html#a90">isTopMenu</a>() <a name="l01622"></a>01622 || ( <a class="code" href="classKWinInternal_1_1Client.html#a96">isOverride</a>() && !<a class="code" href="classKWinInternal_1_1Client.html#a61">isFullScreen</a>())<span class="comment">// SELI is NET::Override special or not?</span> <a name="l01623"></a>01623 || <a class="code" href="classKWinInternal_1_1Client.html#a89">isToolbar</a>(); <span class="comment">// TODO</span> <a name="l01624"></a>01624 } <a name="l01625"></a>01625 <a name="l01626"></a><a class="code" href="classKWinInternal_1_1Client.html#a19">01626</a> NET::WindowType <a class="code" href="classKWinInternal_1_1Client.html#a19">Client::windowType</a>( <span class="keywordtype">bool</span> direct, <span class="keywordtype">int</span> supported_types )<span class="keyword"> const</span> <a name="l01627"></a>01627 <span class="keyword"> </span>{ <a name="l01628"></a>01628 NET::WindowType wt = info->windowType( supported_types ); <a name="l01629"></a>01629 <span class="keywordflow">if</span>( direct ) <a name="l01630"></a>01630 <span class="keywordflow">return</span> wt; <a name="l01631"></a>01631 NET::WindowType wt2 = <a class="code" href="classKWinInternal_1_1Client.html#a20">rules</a>()-><a class="code" href="classKWinInternal_1_1WindowRules.html#a14">checkType</a>( wt ); <a name="l01632"></a>01632 <span class="keywordflow">if</span>( wt != wt2 ) <a name="l01633"></a>01633 { <a name="l01634"></a>01634 wt = wt2; <a name="l01635"></a>01635 info->setWindowType( wt ); <span class="comment">// force hint change</span> <a name="l01636"></a>01636 } <a name="l01637"></a>01637 <span class="comment">// hacks here</span> <a name="l01638"></a>01638 <span class="keywordflow">if</span>( wt == NET::Menu ) <a name="l01639"></a>01639 { <a name="l01640"></a>01640 <span class="comment">// ugly hack to support the times when NET::Menu meant NET::TopMenu</span> <a name="l01641"></a>01641 <span class="comment">// if it's as wide as the screen, not very high and has its upper-left</span> <a name="l01642"></a>01642 <span class="comment">// corner a bit above the screen's upper-left cornet, it's a topmenu</span> <a name="l01643"></a>01643 <span class="keywordflow">if</span>( <a class="code" href="classKWinInternal_1_1Client.html#a27">x</a>() == 0 && <a class="code" href="classKWinInternal_1_1Client.html#a28">y</a>() < 0 && <a class="code" href="classKWinInternal_1_1Client.html#a28">y</a>() > -10 && <a class="code" href="classKWinInternal_1_1Client.html#a30">height</a>() < 100 <a name="l01644"></a>01644 && abs( <a class="code" href="classKWinInternal_1_1Client.html#a29">width</a>() - <a class="code" href="classKWinInternal_1_1Client.html#a5">workspace</a>()->clientArea( FullArea, <span class="keyword">this</span> ).<a class="code" href="classKWinInternal_1_1Client.html#a29">width</a>()) < 10 ) <a name="l01645"></a>01645 wt = NET::TopMenu; <a name="l01646"></a>01646 } <a name="l01647"></a>01647 <span class="comment">// TODO change this to rule</span> <a name="l01648"></a>01648 <span class="keyword">const</span> <span class="keywordtype">char</span>* <span class="keyword">const</span> oo_prefix = <span class="stringliteral">"openoffice.org"</span>; <span class="comment">// QCString has no startsWith()</span> <a name="l01649"></a>01649 <span class="comment">// oo_prefix is lowercase, because resourceClass() is forced to be lowercase</span> <a name="l01650"></a>01650 <span class="keywordflow">if</span>( qstrncmp( <a class="code" href="classKWinInternal_1_1Client.html#a127">resourceClass</a>(), oo_prefix, strlen( oo_prefix )) == 0 && wt == NET::Dialog ) <a name="l01651"></a>01651 wt = NET::Normal; <span class="comment">// see bug #66065</span> <a name="l01652"></a>01652 <span class="keywordflow">if</span>( wt == NET::Unknown ) <span class="comment">// this is more or less suggested in NETWM spec</span> <a name="l01653"></a>01653 wt = <a class="code" href="classKWinInternal_1_1Client.html#a8">isTransient</a>() ? NET::Dialog : NET::Normal; <a name="l01654"></a>01654 <span class="keywordflow">return</span> wt; <a name="l01655"></a>01655 } <a name="l01656"></a>01656 <a name="l01661"></a>01661 <span class="keywordtype">void</span> Client::setCursor( Position m ) <a name="l01662"></a>01662 { <a name="l01663"></a>01663 <span class="keywordflow">if</span>( !<a class="code" href="classKWinInternal_1_1Client.html#a98">isResizable</a>() || <a class="code" href="classKWinInternal_1_1Client.html#a50">isShade</a>()) <a name="l01664"></a>01664 { <a name="l01665"></a>01665 m = PositionCenter; <a name="l01666"></a>01666 } <a name="l01667"></a>01667 <span class="keywordflow">switch</span> ( m ) <a name="l01668"></a>01668 { <a name="l01669"></a>01669 <span class="keywordflow">case</span> PositionTopLeft: <a name="l01670"></a>01670 <span class="keywordflow">case</span> PositionBottomRight: <a name="l01671"></a>01671 setCursor( sizeFDiagCursor ); <a name="l01672"></a>01672 <span class="keywordflow">break</span>; <a name="l01673"></a>01673 <span class="keywordflow">case</span> PositionBottomLeft: <a name="l01674"></a>01674 <span class="keywordflow">case</span> PositionTopRight: <a name="l01675"></a>01675 setCursor( sizeBDiagCursor ); <a name="l01676"></a>01676 <span class="keywordflow">break</span>; <a name="l01677"></a>01677 <span class="keywordflow">case</span> PositionTop: <a name="l01678"></a>01678 <span class="keywordflow">case</span> PositionBottom: <a name="l01679"></a>01679 setCursor( sizeVerCursor ); <a name="l01680"></a>01680 <span class="keywordflow">break</span>; <a name="l01681"></a>01681 <span class="keywordflow">case</span> PositionLeft: <a name="l01682"></a>01682 <span class="keywordflow">case</span> PositionRight: <a name="l01683"></a>01683 setCursor( sizeHorCursor ); <a name="l01684"></a>01684 <span class="keywordflow">break</span>; <a name="l01685"></a>01685 <span class="keywordflow">default</span>: <a name="l01686"></a>01686 <span class="keywordflow">if</span>( buttonDown && <a class="code" href="classKWinInternal_1_1Client.html#a86">isMovable</a>()) <a name="l01687"></a>01687 setCursor( sizeAllCursor ); <a name="l01688"></a>01688 <span class="keywordflow">else</span> <a name="l01689"></a>01689 setCursor( arrowCursor ); <a name="l01690"></a>01690 <span class="keywordflow">break</span>; <a name="l01691"></a>01691 } <a name="l01692"></a>01692 } <a name="l01693"></a>01693 <a name="l01694"></a>01694 <span class="comment">// TODO mit nejake checkCursor(), ktere se zavola v manage() a pri vecech, kdy by se kurzor mohl zmenit?</span> <a name="l01695"></a>01695 <span class="keywordtype">void</span> Client::setCursor( <span class="keyword">const</span> QCursor& c ) <a name="l01696"></a>01696 { <a name="l01697"></a>01697 <span class="keywordflow">if</span>( c.handle() == cursor.handle()) <a name="l01698"></a>01698 <span class="keywordflow">return</span>; <a name="l01699"></a>01699 cursor = c; <a name="l01700"></a>01700 <span class="keywordflow">if</span>( decoration != NULL ) <a name="l01701"></a>01701 decoration-><a class="code" href="classKDecoration.html#a55">widget</a>()->setCursor( cursor ); <a name="l01702"></a>01702 XDefineCursor( qt_xdisplay(), <a class="code" href="classKWinInternal_1_1Client.html#a2">frameId</a>(), cursor.handle()); <a name="l01703"></a>01703 } <a name="l01704"></a>01704 <a name="l01705"></a>01705 <a class="code" href="classKDecorationDefines.html#w70">Client::Position</a> Client::mousePosition( <span class="keyword">const</span> QPoint& p )<span class="keyword"> const</span> <a name="l01706"></a>01706 <span class="keyword"> </span>{ <a name="l01707"></a>01707 <span class="keywordflow">if</span>( decoration != NULL ) <a name="l01708"></a>01708 <span class="keywordflow">return</span> decoration-><a class="code" href="classKDecoration.html#a36">mousePosition</a>( p ); <a name="l01709"></a>01709 <span class="keywordflow">return</span> PositionCenter; <a name="l01710"></a>01710 } <a name="l01711"></a>01711 <a name="l01712"></a>01712 <span class="keywordtype">void</span> Client::updateAllowedActions( <span class="keywordtype">bool</span> force ) <a name="l01713"></a>01713 { <a name="l01714"></a>01714 <span class="keywordflow">if</span>( !isManaged() && !force ) <a name="l01715"></a>01715 <span class="keywordflow">return</span>; <a name="l01716"></a>01716 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> old_allowed_actions = allowed_actions; <a name="l01717"></a>01717 allowed_actions = 0; <a name="l01718"></a>01718 <span class="keywordflow">if</span>( <a class="code" href="classKWinInternal_1_1Client.html#a86">isMovable</a>()) <a name="l01719"></a>01719 allowed_actions |= NET::ActionMove; <a name="l01720"></a>01720 <span class="keywordflow">if</span>( <a class="code" href="classKWinInternal_1_1Client.html#a98">isResizable</a>()) <a name="l01721"></a>01721 allowed_actions |= NET::ActionResize; <a name="l01722"></a>01722 <span class="keywordflow">if</span>( <a class="code" href="classKWinInternal_1_1Client.html#a58">isMinimizable</a>()) <a name="l01723"></a>01723 allowed_actions |= NET::ActionMinimize; <a name="l01724"></a>01724 <span class="keywordflow">if</span>( <a class="code" href="classKWinInternal_1_1Client.html#a53">isShadeable</a>()) <a name="l01725"></a>01725 allowed_actions |= NET::ActionShade; <a name="l01726"></a>01726 <span class="comment">// sticky state not supported</span> <a name="l01727"></a>01727 <span class="keywordflow">if</span>( <a class="code" href="classKWinInternal_1_1Client.html#a55">isMaximizable</a>()) <a name="l01728"></a>01728 allowed_actions |= NET::ActionMax; <a name="l01729"></a>01729 <span class="keywordflow">if</span>( <a class="code" href="classKWinInternal_1_1Client.html#a63">userCanSetFullScreen</a>()) <a name="l01730"></a>01730 allowed_actions |= NET::ActionFullScreen; <a name="l01731"></a>01731 allowed_actions |= NET::ActionChangeDesktop; <span class="comment">// always (pagers shouldn't show Docks etc.)</span> <a name="l01732"></a>01732 <span class="keywordflow">if</span>( <a class="code" href="classKWinInternal_1_1Client.html#a99">isCloseable</a>()) <a name="l01733"></a>01733 allowed_actions |= NET::ActionClose; <a name="l01734"></a>01734 <span class="keywordflow">if</span>( old_allowed_actions == allowed_actions ) <a name="l01735"></a>01735 <span class="keywordflow">return</span>; <a name="l01736"></a>01736 <span class="comment">// TODO this could be delayed and compressed - it's only for pagers etc. anyway</span> <a name="l01737"></a>01737 info->setAllowedActions( allowed_actions ); <a name="l01738"></a>01738 <span class="comment">// TODO this should also tell the decoration, so that it can update the buttons</span> <a name="l01739"></a>01739 } <a name="l01740"></a>01740 <a name="l01741"></a>01741 <span class="keywordtype">void</span> Client::autoRaise() <a name="l01742"></a>01742 { <a name="l01743"></a>01743 <a class="code" href="classKWinInternal_1_1Client.html#a5">workspace</a>()->raiseClient( <span class="keyword">this</span> ); <a name="l01744"></a>01744 <a class="code" href="classKWinInternal_1_1Client.html#a158">cancelAutoRaise</a>(); <a name="l01745"></a>01745 } <a name="l01746"></a>01746 <a name="l01747"></a><a class="code" href="classKWinInternal_1_1Client.html#a158">01747</a> <span class="keywordtype">void</span> <a class="code" href="classKWinInternal_1_1Client.html#a158">Client::cancelAutoRaise</a>() <a name="l01748"></a>01748 { <a name="l01749"></a>01749 <span class="keyword">delete</span> autoRaiseTimer; <a name="l01750"></a>01750 autoRaiseTimer = 0; <a name="l01751"></a>01751 } <a name="l01752"></a>01752 <a name="l01753"></a><a class="code" href="classKWinInternal_1_1Client.html#a161">01753</a> <span class="keywordtype">void</span> <a class="code" href="classKWinInternal_1_1Client.html#a161">Client::setOpacity</a>(<span class="keywordtype">bool</span> translucent, uint opacity) <a name="l01754"></a>01754 { <a name="l01755"></a>01755 <span class="keywordflow">if</span> (<a class="code" href="classKWinInternal_1_1Client.html#a87">isDesktop</a>()) <a name="l01756"></a>01756 <span class="keywordflow">return</span>; <span class="comment">// xcompmgr does not like non solid desktops and the user could set it accidently by mouse scrolling</span> <a name="l01757"></a>01757 <span class="comment">// qWarning("setting opacity for %d",qt_xdisplay());</span> <a name="l01758"></a>01758 <span class="comment">//rule out activated translulcency with 100% opacity</span> <a name="l01759"></a>01759 <span class="keywordflow">if</span> (!translucent || opacity == 0xFFFFFFFF) <a name="l01760"></a>01760 { <a name="l01761"></a>01761 opacity_ = 0xFFFFFFFF; <a name="l01762"></a>01762 XDeleteProperty (qt_xdisplay(), <a class="code" href="classKWinInternal_1_1Client.html#a2">frameId</a>(), <a class="code" href="namespaceKWinInternal.html#a0">atoms</a>-><a class="code" href="classKWinInternal_1_1Atoms.html#o14">net_wm_window_opacity</a>); <a name="l01763"></a>01763 XDeleteProperty (qt_xdisplay(), <a class="code" href="classKWinInternal_1_1Client.html#a1">window</a>(), <a class="code" href="namespaceKWinInternal.html#a0">atoms</a>-><a class="code" href="classKWinInternal_1_1Atoms.html#o14">net_wm_window_opacity</a>); <span class="comment">// ??? frameId() is necessary for visible changes, window() is the winId() that would be set by apps - we set both to be sure the app knows what's currently displayd</span> <a name="l01764"></a>01764 } <a name="l01765"></a>01765 <span class="keywordflow">else</span>{ <a name="l01766"></a>01766 <span class="keywordflow">if</span>(opacity == opacity_) <a name="l01767"></a>01767 <span class="keywordflow">return</span>; <a name="l01768"></a>01768 opacity_ = opacity; <a name="l01769"></a>01769 <span class="keywordtype">long</span> data = opacity; <span class="comment">// 32bit XChangeProperty needs long</span> <a name="l01770"></a>01770 XChangeProperty(qt_xdisplay(), <a class="code" href="classKWinInternal_1_1Client.html#a2">frameId</a>(), <a class="code" href="namespaceKWinInternal.html#a0">atoms</a>-><a class="code" href="classKWinInternal_1_1Atoms.html#o14">net_wm_window_opacity</a>, XA_CARDINAL, 32, PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) &data, 1L); <a name="l01771"></a>01771 XChangeProperty(qt_xdisplay(), <a class="code" href="classKWinInternal_1_1Client.html#a1">window</a>(), <a class="code" href="namespaceKWinInternal.html#a0">atoms</a>-><a class="code" href="classKWinInternal_1_1Atoms.html#o14">net_wm_window_opacity</a>, XA_CARDINAL, 32, PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) &data, 1L); <a name="l01772"></a>01772 } <a name="l01773"></a>01773 } <a name="l01774"></a>01774 <a name="l01775"></a><a class="code" href="classKWinInternal_1_1Client.html#a162">01775</a> <span class="keywordtype">void</span> <a class="code" href="classKWinInternal_1_1Client.html#a162">Client::setShadowSize</a>(uint shadowSize) <a name="l01776"></a>01776 { <a name="l01777"></a>01777 <span class="comment">// ignoring all individual settings - if we control a window, we control it's shadow</span> <a name="l01778"></a>01778 <span class="comment">// TODO somehow handle individual settings for docks (besides custom sizes)</span> <a name="l01779"></a>01779 <span class="keywordtype">long</span> data = shadowSize; <a name="l01780"></a>01780 XChangeProperty(qt_xdisplay(), <a class="code" href="classKWinInternal_1_1Client.html#a2">frameId</a>(), <a class="code" href="namespaceKWinInternal.html#a0">atoms</a>-><a class="code" href="classKWinInternal_1_1Atoms.html#o15">net_wm_window_shadow</a>, XA_CARDINAL, 32, PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) &data, 1L); <a name="l01781"></a>01781 } <a name="l01782"></a>01782 <a name="l01783"></a><a class="code" href="classKWinInternal_1_1Client.html#a163">01783</a> <span class="keywordtype">void</span> <a class="code" href="classKWinInternal_1_1Client.html#a163">Client::updateOpacity</a>() <a name="l01784"></a>01784 <span class="comment">// extra syncscreen flag allows to avoid double syncs when active state changes (as it will usually change for two windows)</span> <a name="l01785"></a>01785 { <a name="l01786"></a>01786 <span class="keywordflow">if</span> (!(<a class="code" href="classKWinInternal_1_1Client.html#a92">isNormalWindow</a>() || <a class="code" href="classKWinInternal_1_1Client.html#a93">isDialog</a>() || <a class="code" href="classKWinInternal_1_1Client.html#a95">isUtility</a>() )|| custom_opacity) <a name="l01787"></a>01787 <span class="keywordflow">return</span>; <a name="l01788"></a>01788 <span class="keywordflow">if</span> (<a class="code" href="classKWinInternal_1_1Client.html#a41">isActive</a>()) <a name="l01789"></a>01789 { <a name="l01790"></a>01790 <span class="keywordflow">if</span>( <a class="code" href="classKWinInternal_1_1Client.html#a171">ruleOpacityActive</a>() ) <a name="l01791"></a>01791 <a class="code" href="classKWinInternal_1_1Client.html#a161">setOpacity</a>(rule_opacity_active < 0xFFFFFFFF, rule_opacity_active); <a name="l01792"></a>01792 <span class="keywordflow">else</span> <a name="l01793"></a>01793 <a class="code" href="classKWinInternal_1_1Client.html#a161">setOpacity</a>(<a class="code" href="namespaceKWinInternal.html#a13">options</a>-><a class="code" href="classKWinInternal_1_1Options.html#o28">translucentActiveWindows</a>, <a class="code" href="namespaceKWinInternal.html#a13">options</a>-><a class="code" href="classKWinInternal_1_1Options.html#o29">activeWindowOpacity</a>); <a name="l01794"></a>01794 <span class="keywordflow">if</span> (<a class="code" href="classKWinInternal_1_1Client.html#a173">isBMP</a>()) <a name="l01795"></a>01795 <span class="comment">// beep-media-player, only undecorated windows (gtk2 xmms, xmms doesn't work with compmgr at all - s.e.p. :P )</span> <a name="l01796"></a>01796 { <a name="l01797"></a>01797 <a class="code" href="namespaceKWinInternal.html#a24">ClientList</a> tmpGroupMembers = <a class="code" href="classKWinInternal_1_1Client.html#a16">group</a>()-><a class="code" href="classKWinInternal_1_1Group.html#a5">members</a>(); <a name="l01798"></a>01798 <a class="code" href="namespaceKWinInternal.html#a24">ClientList</a> activeGroupMembers; <a name="l01799"></a>01799 activeGroupMembers.append(<span class="keyword">this</span>); <a name="l01800"></a>01800 tmpGroupMembers.remove(<span class="keyword">this</span>); <a name="l01801"></a>01801 ClientList::Iterator it = tmpGroupMembers.begin(); <a name="l01802"></a>01802 <span class="keywordflow">while</span> (it != tmpGroupMembers.end()) <a name="l01803"></a>01803 <span class="comment">// search for next attached and not activated client and repeat if found</span> <a name="l01804"></a>01804 { <a name="l01805"></a>01805 <span class="keywordflow">if</span> ((*it) != <span class="keyword">this</span> && (*it)->isBMP()) <a name="l01806"></a>01806 <span class="comment">// potential "to activate" client found</span> <a name="l01807"></a>01807 { <a name="l01808"></a>01808 <span class="comment">// qWarning("client found");</span> <a name="l01809"></a>01809 <span class="keywordflow">if</span> ((*it)->touches(<span class="keyword">this</span>)) <span class="comment">// first test, if the new client touches the just activated one</span> <a name="l01810"></a>01810 { <a name="l01811"></a>01811 <span class="comment">// qWarning("found client touches me");</span> <a name="l01812"></a>01812 <span class="keywordflow">if</span>( <a class="code" href="classKWinInternal_1_1Client.html#a171">ruleOpacityActive</a>() ) <a name="l01813"></a>01813 (*it)->setOpacity(rule_opacity_active < 0xFFFFFFFF, rule_opacity_active); <a name="l01814"></a>01814 <span class="keywordflow">else</span> <a name="l01815"></a>01815 (*it)->setOpacity(<a class="code" href="namespaceKWinInternal.html#a13">options</a>-><a class="code" href="classKWinInternal_1_1Options.html#o28">translucentActiveWindows</a>, <a class="code" href="namespaceKWinInternal.html#a13">options</a>-><a class="code" href="classKWinInternal_1_1Options.html#o29">activeWindowOpacity</a>); <a name="l01816"></a>01816 <span class="comment">// qWarning("activated, search restarted (1)");</span> <a name="l01817"></a>01817 (*it)->setShadowSize(<a class="code" href="namespaceKWinInternal.html#a13">options</a>-><a class="code" href="classKWinInternal_1_1Options.html#o40">activeWindowShadowSize</a>); <a name="l01818"></a>01818 activeGroupMembers.append(*it); <a name="l01819"></a>01819 tmpGroupMembers.remove(it); <a name="l01820"></a>01820 it = tmpGroupMembers.begin(); <span class="comment">// restart, search next client</span> <a name="l01821"></a>01821 <span class="keywordflow">continue</span>; <a name="l01822"></a>01822 } <a name="l01823"></a>01823 <span class="keywordflow">else</span> <a name="l01824"></a>01824 { <span class="comment">// pot. client does not touch c, so we have to search if it touches some other activated client</span> <a name="l01825"></a>01825 <span class="keywordtype">bool</span> found = <span class="keyword">false</span>; <a name="l01826"></a>01826 <span class="keywordflow">for</span>( ClientList::ConstIterator it2 = activeGroupMembers.begin(); it2 != activeGroupMembers.end(); it2++ ) <a name="l01827"></a>01827 { <a name="l01828"></a>01828 <span class="keywordflow">if</span> ((*it2) != <span class="keyword">this</span> && (*it2) != (*it) && (*it)->touches(*it2)) <a name="l01829"></a>01829 { <a name="l01830"></a>01830 <span class="comment">// qWarning("found client touches other active client");</span> <a name="l01831"></a>01831 <span class="keywordflow">if</span>( <a class="code" href="classKWinInternal_1_1Client.html#a171">ruleOpacityActive</a>() ) <a name="l01832"></a>01832 (*it)->setOpacity(rule_opacity_active < 0xFFFFFFFF, rule_opacity_active); <a name="l01833"></a>01833 <span class="keywordflow">else</span> <a name="l01834"></a>01834 (*it)->setOpacity(<a class="code" href="namespaceKWinInternal.html#a13">options</a>-><a class="code" href="classKWinInternal_1_1Options.html#o28">translucentActiveWindows</a>, <a class="code" href="namespaceKWinInternal.html#a13">options</a>-><a class="code" href="classKWinInternal_1_1Options.html#o29">activeWindowOpacity</a>); <a name="l01835"></a>01835 (*it)->setShadowSize(<a class="code" href="namespaceKWinInternal.html#a13">options</a>-><a class="code" href="classKWinInternal_1_1Options.html#o40">activeWindowShadowSize</a>); <a name="l01836"></a>01836 activeGroupMembers.append(*it); <a name="l01837"></a>01837 tmpGroupMembers.remove(it); <a name="l01838"></a>01838 it = tmpGroupMembers.begin(); <span class="comment">// reset potential client search</span> <a name="l01839"></a>01839 found = <span class="keyword">true</span>; <a name="l01840"></a>01840 <span class="comment">// qWarning("activated, search restarted (2)");</span> <a name="l01841"></a>01841 <span class="keywordflow">break</span>; <span class="comment">// skip this loop</span> <a name="l01842"></a>01842 } <a name="l01843"></a>01843 } <a name="l01844"></a>01844 <span class="keywordflow">if</span> (found) <span class="keywordflow">continue</span>; <a name="l01845"></a>01845 } <a name="l01846"></a>01846 } <a name="l01847"></a>01847 it++; <a name="l01848"></a>01848 } <a name="l01849"></a>01849 } <a name="l01850"></a>01850 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classKWinInternal_1_1Client.html#a92">isNormalWindow</a>()) <a name="l01851"></a>01851 <span class="comment">// activate dependend minor windows as well</span> <a name="l01852"></a>01852 { <a name="l01853"></a>01853 <span class="keywordflow">for</span>( ClientList::ConstIterator it = <a class="code" href="classKWinInternal_1_1Client.html#a16">group</a>()-><a class="code" href="classKWinInternal_1_1Group.html#a5">members</a>().begin(); it != <a class="code" href="classKWinInternal_1_1Client.html#a16">group</a>()-><a class="code" href="classKWinInternal_1_1Group.html#a5">members</a>().end(); it++ ) <a name="l01854"></a>01854 <span class="keywordflow">if</span> ((*it)->isDialog() || (*it)->isUtility()) <a name="l01855"></a>01855 <span class="keywordflow">if</span>( (*it)->ruleOpacityActive() ) <a name="l01856"></a>01856 (*it)->setOpacity((*it)->ruleOpacityActive() < 0xFFFFFFFF, (*it)->ruleOpacityActive()); <a name="l01857"></a>01857 <span class="keywordflow">else</span> <a name="l01858"></a>01858 (*it)->setOpacity(<a class="code" href="namespaceKWinInternal.html#a13">options</a>-><a class="code" href="classKWinInternal_1_1Options.html#o28">translucentActiveWindows</a>, <a class="code" href="namespaceKWinInternal.html#a13">options</a>-><a class="code" href="classKWinInternal_1_1Options.html#o29">activeWindowOpacity</a>); <a name="l01859"></a>01859 } <a name="l01860"></a>01860 } <a name="l01861"></a>01861 <span class="keywordflow">else</span> <a name="l01862"></a>01862 { <a name="l01863"></a>01863 <span class="keywordflow">if</span>( <a class="code" href="classKWinInternal_1_1Client.html#a170">ruleOpacityInactive</a>() ) <a name="l01864"></a>01864 <a class="code" href="classKWinInternal_1_1Client.html#a161">setOpacity</a>(rule_opacity_inactive < 0xFFFFFFFF, rule_opacity_inactive); <a name="l01865"></a>01865 <span class="keywordflow">else</span> <a name="l01866"></a>01866 <a class="code" href="classKWinInternal_1_1Client.html#a161">setOpacity</a>(<a class="code" href="namespaceKWinInternal.html#a13">options</a>-><a class="code" href="classKWinInternal_1_1Options.html#o30">translucentInactiveWindows</a> && !(<a class="code" href="classKWinInternal_1_1Client.html#a74">keepAbove</a>() && <a class="code" href="namespaceKWinInternal.html#a13">options</a>-><a class="code" href="classKWinInternal_1_1Options.html#o38">keepAboveAsActive</a>), <a name="l01867"></a>01867 <a class="code" href="namespaceKWinInternal.html#a13">options</a>-><a class="code" href="classKWinInternal_1_1Options.html#o31">inactiveWindowOpacity</a>); <a name="l01868"></a>01868 <span class="comment">// deactivate dependend minor windows as well</span> <a name="l01869"></a>01869 <span class="keywordflow">if</span> (<a class="code" href="classKWinInternal_1_1Client.html#a173">isBMP</a>()) <a name="l01870"></a>01870 <span class="comment">// beep-media-player, only undecorated windows (gtk2 xmms, xmms doesn't work with compmgr at all - s.e.p. :P )</span> <a name="l01871"></a>01871 { <a name="l01872"></a>01872 <a class="code" href="namespaceKWinInternal.html#a24">ClientList</a> tmpGroupMembers = <a class="code" href="classKWinInternal_1_1Client.html#a16">group</a>()-><a class="code" href="classKWinInternal_1_1Group.html#a5">members</a>(); <a name="l01873"></a>01873 <a class="code" href="namespaceKWinInternal.html#a24">ClientList</a> inactiveGroupMembers; <a name="l01874"></a>01874 inactiveGroupMembers.append(<span class="keyword">this</span>); <a name="l01875"></a>01875 tmpGroupMembers.remove(<span class="keyword">this</span>); <a name="l01876"></a>01876 ClientList::Iterator it = tmpGroupMembers.begin(); <a name="l01877"></a>01877 <span class="keywordflow">while</span> ( it != tmpGroupMembers.end() ) <a name="l01878"></a>01878 <span class="comment">// search for next attached and not activated client and repeat if found</span> <a name="l01879"></a>01879 { <a name="l01880"></a>01880 <span class="keywordflow">if</span> ((*it) != <span class="keyword">this</span> && (*it)->isBMP()) <a name="l01881"></a>01881 <span class="comment">// potential "to activate" client found</span> <a name="l01882"></a>01882 { <a name="l01883"></a>01883 <span class="comment">// qWarning("client found");</span> <a name="l01884"></a>01884 <span class="keywordflow">if</span> ((*it)->touches(<span class="keyword">this</span>)) <span class="comment">// first test, if the new client touches the just activated one</span> <a name="l01885"></a>01885 { <a name="l01886"></a>01886 <span class="comment">// qWarning("found client touches me");</span> <a name="l01887"></a>01887 <span class="keywordflow">if</span>( (*it)->ruleOpacityInactive() ) <a name="l01888"></a>01888 (*it)->setOpacity((*it)->ruleOpacityInactive() < 0xFFFFFFFF, (*it)->ruleOpacityInactive()); <a name="l01889"></a>01889 <span class="keywordflow">else</span> <a name="l01890"></a>01890 (*it)->setOpacity(<a class="code" href="namespaceKWinInternal.html#a13">options</a>-><a class="code" href="classKWinInternal_1_1Options.html#o30">translucentInactiveWindows</a> && !((*it)->keepAbove() && <a class="code" href="namespaceKWinInternal.html#a13">options</a>-><a class="code" href="classKWinInternal_1_1Options.html#o38">keepAboveAsActive</a>), <a class="code" href="namespaceKWinInternal.html#a13">options</a>-><a class="code" href="classKWinInternal_1_1Options.html#o31">inactiveWindowOpacity</a>); <a name="l01891"></a>01891 (*it)->setShadowSize(<a class="code" href="namespaceKWinInternal.html#a13">options</a>-><a class="code" href="classKWinInternal_1_1Options.html#o41">inactiveWindowShadowSize</a>); <a name="l01892"></a>01892 <span class="comment">// qWarning("deactivated, search restarted (1)");</span> <a name="l01893"></a>01893 inactiveGroupMembers.append(*it); <a name="l01894"></a>01894 tmpGroupMembers.remove(it); <a name="l01895"></a>01895 it = tmpGroupMembers.begin(); <span class="comment">// restart, search next client</span> <a name="l01896"></a>01896 <span class="keywordflow">continue</span>; <a name="l01897"></a>01897 } <a name="l01898"></a>01898 <span class="keywordflow">else</span> <span class="comment">// pot. client does not touch c, so we have to search if it touches some other activated client</span> <a name="l01899"></a>01899 { <a name="l01900"></a>01900 <span class="keywordtype">bool</span> found = <span class="keyword">false</span>; <a name="l01901"></a>01901 <span class="keywordflow">for</span>( ClientList::ConstIterator it2 = inactiveGroupMembers.begin(); it2 != inactiveGroupMembers.end(); it2++ ) <a name="l01902"></a>01902 { <a name="l01903"></a>01903 <span class="keywordflow">if</span> ((*it2) != <span class="keyword">this</span> && (*it2) != (*it) && (*it)->touches(*it2)) <a name="l01904"></a>01904 { <a name="l01905"></a>01905 <span class="comment">// qWarning("found client touches other inactive client");</span> <a name="l01906"></a>01906 <span class="keywordflow">if</span>( (*it)->ruleOpacityInactive() ) <a name="l01907"></a>01907 (*it)->setOpacity((*it)->ruleOpacityInactive() < 0xFFFFFFFF, (*it)->ruleOpacityInactive()); <a name="l01908"></a>01908 <span class="keywordflow">else</span> <a name="l01909"></a>01909 (*it)->setOpacity(<a class="code" href="namespaceKWinInternal.html#a13">options</a>-><a class="code" href="classKWinInternal_1_1Options.html#o30">translucentInactiveWindows</a> && !((*it)->keepAbove() && <a class="code" href="namespaceKWinInternal.html#a13">options</a>-><a class="code" href="classKWinInternal_1_1Options.html#o38">keepAboveAsActive</a>), <a class="code" href="namespaceKWinInternal.html#a13">options</a>-><a class="code" href="classKWinInternal_1_1Options.html#o31">inactiveWindowOpacity</a>); <a name="l01910"></a>01910 (*it)->setShadowSize(<a class="code" href="namespaceKWinInternal.html#a13">options</a>-><a class="code" href="classKWinInternal_1_1Options.html#o41">inactiveWindowShadowSize</a>); <a name="l01911"></a>01911 <span class="comment">// qWarning("deactivated, search restarted (2)");</span> <a name="l01912"></a>01912 inactiveGroupMembers.append(*it); <a name="l01913"></a>01913 tmpGroupMembers.remove(it); <a name="l01914"></a>01914 it = tmpGroupMembers.begin(); <span class="comment">// reset potential client search</span> <a name="l01915"></a>01915 found = <span class="keyword">true</span>; <a name="l01916"></a>01916 <span class="keywordflow">break</span>; <span class="comment">// skip this loop</span> <a name="l01917"></a>01917 } <a name="l01918"></a>01918 } <a name="l01919"></a>01919 <span class="keywordflow">if</span> (found) <span class="keywordflow">continue</span>; <a name="l01920"></a>01920 } <a name="l01921"></a>01921 } <a name="l01922"></a>01922 it++; <a name="l01923"></a>01923 } <a name="l01924"></a>01924 } <a name="l01925"></a>01925 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classKWinInternal_1_1Client.html#a92">isNormalWindow</a>()) <a name="l01926"></a>01926 { <a name="l01927"></a>01927 <span class="keywordflow">for</span>( ClientList::ConstIterator it = <a class="code" href="classKWinInternal_1_1Client.html#a16">group</a>()-><a class="code" href="classKWinInternal_1_1Group.html#a5">members</a>().begin(); it != <a class="code" href="classKWinInternal_1_1Client.html#a16">group</a>()-><a class="code" href="classKWinInternal_1_1Group.html#a5">members</a>().end(); it++ ) <a name="l01928"></a>01928 <span class="keywordflow">if</span> ((*it)->isUtility()) <span class="comment">//don't deactivate dialogs...</span> <a name="l01929"></a>01929 <span class="keywordflow">if</span>( (*it)->ruleOpacityInactive() ) <a name="l01930"></a>01930 (*it)->setOpacity((*it)->ruleOpacityInactive() < 0xFFFFFFFF, (*it)->ruleOpacityInactive()); <a name="l01931"></a>01931 <span class="keywordflow">else</span> <a name="l01932"></a>01932 (*it)->setOpacity(<a class="code" href="namespaceKWinInternal.html#a13">options</a>-><a class="code" href="classKWinInternal_1_1Options.html#o30">translucentInactiveWindows</a> && !((*it)->keepAbove() && <a class="code" href="namespaceKWinInternal.html#a13">options</a>-><a class="code" href="classKWinInternal_1_1Options.html#o38">keepAboveAsActive</a>), <a class="code" href="namespaceKWinInternal.html#a13">options</a>-><a class="code" href="classKWinInternal_1_1Options.html#o31">inactiveWindowOpacity</a>); <a name="l01933"></a>01933 } <a name="l01934"></a>01934 } <a name="l01935"></a>01935 } <a name="l01936"></a>01936 <a name="l01937"></a><a class="code" href="classKWinInternal_1_1Client.html#a164">01937</a> <span class="keywordtype">void</span> <a class="code" href="classKWinInternal_1_1Client.html#a164">Client::updateShadowSize</a>() <a name="l01938"></a>01938 <span class="comment">// extra syncscreen flag allows to avoid double syncs when active state changes (as it will usually change for two windows)</span> <a name="l01939"></a>01939 { <a name="l01940"></a>01940 <span class="keywordflow">if</span> (!(<a class="code" href="classKWinInternal_1_1Client.html#a92">isNormalWindow</a>() || <a class="code" href="classKWinInternal_1_1Client.html#a93">isDialog</a>() || <a class="code" href="classKWinInternal_1_1Client.html#a95">isUtility</a>() )) <a name="l01941"></a>01941 <span class="keywordflow">return</span>; <a name="l01942"></a>01942 <span class="keywordflow">if</span> (<a class="code" href="classKWinInternal_1_1Client.html#a41">isActive</a>()) <a name="l01943"></a>01943 <a class="code" href="classKWinInternal_1_1Client.html#a162">setShadowSize</a>(<a class="code" href="namespaceKWinInternal.html#a13">options</a>-><a class="code" href="classKWinInternal_1_1Options.html#o40">activeWindowShadowSize</a>); <a name="l01944"></a>01944 <span class="keywordflow">else</span> <a name="l01945"></a>01945 <a class="code" href="classKWinInternal_1_1Client.html#a162">setShadowSize</a>(<a class="code" href="namespaceKWinInternal.html#a13">options</a>-><a class="code" href="classKWinInternal_1_1Options.html#o41">inactiveWindowShadowSize</a>); <a name="l01946"></a>01946 } <a name="l01947"></a>01947 <a name="l01948"></a><a class="code" href="classKWinInternal_1_1Client.html#a170">01948</a> uint <a class="code" href="classKWinInternal_1_1Client.html#a170">Client::ruleOpacityInactive</a>() <a name="l01949"></a>01949 { <a name="l01950"></a>01950 <span class="keywordflow">return</span> rule_opacity_inactive;<span class="comment">// != 0 ;</span> <a name="l01951"></a>01951 } <a name="l01952"></a>01952 <a name="l01953"></a><a class="code" href="classKWinInternal_1_1Client.html#a171">01953</a> uint <a class="code" href="classKWinInternal_1_1Client.html#a171">Client::ruleOpacityActive</a>() <a name="l01954"></a>01954 { <a name="l01955"></a>01955 <span class="keywordflow">return</span> rule_opacity_active;<span class="comment">// != 0;</span> <a name="l01956"></a>01956 } <a name="l01957"></a>01957 <a name="l01958"></a><a class="code" href="classKWinInternal_1_1Client.html#a167">01958</a> <span class="keywordtype">bool</span> <a class="code" href="classKWinInternal_1_1Client.html#a167">Client::getWindowOpacity</a>() <span class="comment">//query translucency settings from X, returns true if window opacity is set</span> <a name="l01959"></a>01959 { <a name="l01960"></a>01960 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *data = 0; <a name="l01961"></a>01961 Atom actual; <a name="l01962"></a>01962 <span class="keywordtype">int</span> format, result; <a name="l01963"></a>01963 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> n, left; <a name="l01964"></a>01964 result = XGetWindowProperty(qt_xdisplay(), <a class="code" href="classKWinInternal_1_1Client.html#a1">window</a>(), <a class="code" href="namespaceKWinInternal.html#a0">atoms</a>-><a class="code" href="classKWinInternal_1_1Atoms.html#o14">net_wm_window_opacity</a>, 0L, 1L, False, XA_CARDINAL, &actual, &format, &n, &left, <span class="comment">/*(unsigned char **)*/</span> &data); <a name="l01965"></a>01965 <span class="keywordflow">if</span> (result == Success && data != None) <a name="l01966"></a>01966 { <a name="l01967"></a>01967 memcpy (&opacity_, data, <span class="keyword">sizeof</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>)); <a name="l01968"></a>01968 custom_opacity = <span class="keyword">true</span>; <a name="l01969"></a>01969 <span class="comment">// setOpacity(opacity_ < 0xFFFFFFFF, opacity_);</span> <a name="l01970"></a>01970 <span class="keywordflow">return</span> TRUE; <a name="l01971"></a>01971 } <a name="l01972"></a>01972 <span class="keywordflow">return</span> FALSE; <a name="l01973"></a>01973 } <a name="l01974"></a>01974 <a name="l01975"></a><a class="code" href="classKWinInternal_1_1Client.html#a166">01975</a> <span class="keywordtype">void</span> <a class="code" href="classKWinInternal_1_1Client.html#a166">Client::setCustomOpacityFlag</a>(<span class="keywordtype">bool</span> custom) <a name="l01976"></a>01976 { <a name="l01977"></a>01977 custom_opacity = custom; <a name="l01978"></a>01978 } <a name="l01979"></a>01979 <a name="l01980"></a><a class="code" href="classKWinInternal_1_1Client.html#a172">01980</a> uint <a class="code" href="classKWinInternal_1_1Client.html#a172">Client::opacity</a>() <a name="l01981"></a>01981 { <a name="l01982"></a>01982 <span class="keywordflow">return</span> opacity_; <a name="l01983"></a>01983 } <a name="l01984"></a>01984 <a name="l01985"></a><a class="code" href="classKWinInternal_1_1Client.html#a168">01985</a> <span class="keywordtype">int</span> <a class="code" href="classKWinInternal_1_1Client.html#a168">Client::opacityPercentage</a>() <a name="l01986"></a>01986 { <a name="l01987"></a>01987 <span class="keywordflow">return</span> int(100*((<span class="keywordtype">double</span>)opacity_/0xffffffff)); <a name="l01988"></a>01988 } <a name="l01989"></a>01989 <a name="l01990"></a><a class="code" href="classKWinInternal_1_1Client.html#a175">01990</a> <span class="keywordtype">bool</span> <a class="code" href="classKWinInternal_1_1Client.html#a175">Client::touches</a>(<span class="keyword">const</span> <a class="code" href="classKWinInternal_1_1Client.html">Client</a>* c) <a name="l01991"></a>01991 <span class="comment">// checks if this client borders c, needed to test beep media player window state</span> <a name="l01992"></a>01992 { <a name="l01993"></a>01993 <span class="keywordflow">if</span> (<a class="code" href="classKWinInternal_1_1Client.html#a28">y</a>() == c-><a class="code" href="classKWinInternal_1_1Client.html#a28">y</a>() + c-><a class="code" href="classKWinInternal_1_1Client.html#a30">height</a>()) <span class="comment">// this bottom to c</span> <a name="l01994"></a>01994 <span class="keywordflow">return</span> TRUE; <a name="l01995"></a>01995 <span class="keywordflow">if</span> (<a class="code" href="classKWinInternal_1_1Client.html#a28">y</a>() + <a class="code" href="classKWinInternal_1_1Client.html#a30">height</a>() == c-><a class="code" href="classKWinInternal_1_1Client.html#a28">y</a>()) <span class="comment">// this top to c</span> <a name="l01996"></a>01996 <span class="keywordflow">return</span> TRUE; <a name="l01997"></a>01997 <span class="keywordflow">if</span> (<a class="code" href="classKWinInternal_1_1Client.html#a27">x</a>() == c-><a class="code" href="classKWinInternal_1_1Client.html#a27">x</a>() + c-><a class="code" href="classKWinInternal_1_1Client.html#a29">width</a>()) <span class="comment">// this right to c</span> <a name="l01998"></a>01998 <span class="keywordflow">return</span> TRUE; <a name="l01999"></a>01999 <span class="keywordflow">if</span> (<a class="code" href="classKWinInternal_1_1Client.html#a27">x</a>() + <a class="code" href="classKWinInternal_1_1Client.html#a29">width</a>() == c-><a class="code" href="classKWinInternal_1_1Client.html#a27">x</a>()) <span class="comment">// this left to c</span> <a name="l02000"></a>02000 <span class="keywordflow">return</span> TRUE; <a name="l02001"></a>02001 <span class="keywordflow">return</span> FALSE; <a name="l02002"></a>02002 } <a name="l02003"></a>02003 <a name="l02004"></a>02004 <span class="keywordtype">void</span> Client::setXTitleHeightProperty(<span class="keywordtype">int</span> titleHeight) <a name="l02005"></a>02005 { <a name="l02006"></a>02006 <span class="keywordtype">long</span> data = titleHeight; <a name="l02007"></a>02007 XChangeProperty(qt_xdisplay(), <a class="code" href="classKWinInternal_1_1Client.html#a2">frameId</a>(), <a class="code" href="namespaceKWinInternal.html#a0">atoms</a>-><a class="code" href="classKWinInternal_1_1Atoms.html#o18">net_wm_window_titleheight</a>, XA_CARDINAL, 32, PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) &data, 1L); <a name="l02008"></a>02008 } <a name="l02009"></a>02009 <a name="l02010"></a>02010 <span class="preprocessor">#ifndef NDEBUG</span> <a name="l02011"></a><a class="code" href="namespaceKWinInternal.html#a61">02011</a> <span class="preprocessor"></span>kdbgstream& <a class="code" href="namespaceKWinInternal.html#a61">operator<<</a>( kdbgstream& stream, <span class="keyword">const</span> <a class="code" href="classKWinInternal_1_1Client.html">Client</a>* cl ) <a name="l02012"></a>02012 { <a name="l02013"></a>02013 <span class="keywordflow">if</span>( cl == NULL ) <a name="l02014"></a>02014 <span class="keywordflow">return</span> stream << <span class="stringliteral">"\'NULL_CLIENT\'"</span>; <a name="l02015"></a>02015 <span class="keywordflow">return</span> stream << <span class="stringliteral">"\'ID:"</span> << cl-><a class="code" href="classKWinInternal_1_1Client.html#a1">window</a>() << <span class="stringliteral">";WMCLASS:"</span> << cl-><a class="code" href="classKWinInternal_1_1Client.html#a127">resourceClass</a>() << <span class="stringliteral">":"</span> << cl-><a class="code" href="classKWinInternal_1_1Client.html#a126">resourceName</a>() << <span class="stringliteral">";Caption:"</span> << cl-><a class="code" href="classKWinInternal_1_1Client.html#a136">caption</a>() << <span class="stringliteral">"\'"</span>; <a name="l02016"></a>02016 } <a name="l02017"></a><a class="code" href="namespaceKWinInternal.html#a62">02017</a> kdbgstream& <a class="code" href="namespaceKWinInternal.html#a61">operator<<</a>( kdbgstream& stream, <span class="keyword">const</span> <a class="code" href="namespaceKWinInternal.html#a24">ClientList</a>& list ) <a name="l02018"></a>02018 { <a name="l02019"></a>02019 stream << <span class="stringliteral">"LIST:("</span>; <a name="l02020"></a>02020 <span class="keywordtype">bool</span> first = <span class="keyword">true</span>; <a name="l02021"></a>02021 <span class="keywordflow">for</span>( ClientList::ConstIterator it = list.begin(); <a name="l02022"></a>02022 it != list.end(); <a name="l02023"></a>02023 ++it ) <a name="l02024"></a>02024 { <a name="l02025"></a>02025 <span class="keywordflow">if</span>( !first ) <a name="l02026"></a>02026 stream << <span class="stringliteral">":"</span>; <a name="l02027"></a>02027 first = <span class="keyword">false</span>; <a name="l02028"></a>02028 stream << *it; <a name="l02029"></a>02029 } <a name="l02030"></a>02030 stream << <span class="stringliteral">")"</span>; <a name="l02031"></a>02031 <span class="keywordflow">return</span> stream; <a name="l02032"></a>02032 } <a name="l02033"></a><a class="code" href="namespaceKWinInternal.html#a63">02033</a> kdbgstream& <a class="code" href="namespaceKWinInternal.html#a61">operator<<</a>( kdbgstream& stream, <span class="keyword">const</span> <a class="code" href="namespaceKWinInternal.html#a25">ConstClientList</a>& list ) <a name="l02034"></a>02034 { <a name="l02035"></a>02035 stream << <span class="stringliteral">"LIST:("</span>; <a name="l02036"></a>02036 <span class="keywordtype">bool</span> first = <span class="keyword">true</span>; <a name="l02037"></a>02037 <span class="keywordflow">for</span>( ConstClientList::ConstIterator it = list.begin(); <a name="l02038"></a>02038 it != list.end(); <a name="l02039"></a>02039 ++it ) <a name="l02040"></a>02040 { <a name="l02041"></a>02041 <span class="keywordflow">if</span>( !first ) <a name="l02042"></a>02042 stream << <span class="stringliteral">":"</span>; <a name="l02043"></a>02043 first = <span class="keyword">false</span>; <a name="l02044"></a>02044 stream << *it; <a name="l02045"></a>02045 } <a name="l02046"></a>02046 stream << <span class="stringliteral">")"</span>; <a name="l02047"></a>02047 <span class="keywordflow">return</span> stream; <a name="l02048"></a>02048 } <a name="l02049"></a>02049 <span class="preprocessor">#endif</span> <a name="l02050"></a>02050 <span class="preprocessor"></span> <a name="l02051"></a><a class="code" href="namespaceKWinInternal.html#a64">02051</a> QPixmap * <a class="code" href="namespaceKWinInternal.html#a64">kwin_get_menu_pix_hack</a>() <a name="l02052"></a>02052 { <a name="l02053"></a>02053 <span class="keyword">static</span> QPixmap p; <a name="l02054"></a>02054 <span class="keywordflow">if</span> ( p.isNull() ) <a name="l02055"></a>02055 p = SmallIcon( <span class="stringliteral">"bx2"</span> ); <a name="l02056"></a>02056 <span class="keywordflow">return</span> &p; <a name="l02057"></a>02057 } <a name="l02058"></a>02058 <a name="l02059"></a>02059 } <span class="comment">// namespace</span> <a name="l02060"></a>02060 <a name="l02061"></a>02061 <span class="preprocessor">#include "client.moc"</span> </pre></div></div> <div id="bottom-nav"> <img src="../../common/bottom2.png" align="right" height="59" width="227" alt="KDE Logo"> </div> <div class="bottom"> This file is part of the documentation for kwin Library Version 3.4.2. </div> <div class="bottom" style="color:#cccccc"> Documentation copyright © 1996-2004 the KDE developers.<br> Generated on Wed Jun 14 19:06:09 2006 by <a href="http://www.doxygen.org/index.html">doxygen</a> 1.4.4 written by <a href="mailto:dimitri@stack.nl">Dimitri van Heesch</a>, © 1997-2003 </div> </body> </html>