<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US"> <head> <title>kdecore: netwm.cpp Source File (kdecore)</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Style-Type" content="text/css" /> <meta http-equiv="pics-label" content='(pics-1.1 "http://www.icra.org/ratingsv02.html" comment "ICRAonline DE v2.0" l gen true for "http://www.kde.org" r (nz 1 vz 1 lz 1 oz 1 cb 1) "http://www.rsac.org/ratingsv01.html" l gen true for "http://www.kde.org" r (n 0 s 0 v 0 l 0))' /> <meta name="trademark" content="KDE e.V." /> <meta name="description" content="K Desktop Environment Homepage, KDE.org" /> <meta name="MSSmartTagsPreventParsing" content="true" /> <meta name="robots" content="all" /> <link rel="shortcut icon" href="../../favicon.ico" /> <link rel="stylesheet" media="screen" type="text/css" title="APIDOX" href="doxygen.css" /> </head> <body> <div id="nav_header_top" align="right"> <a href="#content" class="doNotDisplay" accesskey="2">Skip to main content ::</a> <a href="../.."><img id="nav_header_logo" alt="Home" align="left" src="../../kde_gear_64.png" border="0" /></a> <span class="doNotDisplay">::</span> <div id="nav_header_title" align="left">KDE API Reference</div> </div> <div id="nav_header_bottom" align="right"> <span class="doNotDisplay">:: <a href="#navigation" accesskey="5">Skip to Link Menu</a><br/></span> <div id="nav_header_bottom_right" style="text-align: left;"> / <a href="../..">API Reference</a> / <a href=".">kdecore</a> </div> </div> <table id="main" border="0" cellpadding="0" cellspacing="0" width="100%"> <tr> <td valign="top" class="menuheader" height="0"></td> <td id="contentcolumn" valign="top" rowspan="2" > <div id="content" style="padding-top: 0px;"><div style="width:100%; margin: 0px; padding: 0px;"> <a name="content"></a> <!-- Generated by Doxygen 1.7.4 --> <div class="header"> <div class="headertitle"> <div class="title">netwm.cpp</div> </div> </div> <div class="contents"> <div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span> <a name="l00002"></a>00002 <span class="comment"></span> <a name="l00003"></a>00003 <span class="comment"> Copyright (c) 2000 Troll Tech AS</span> <a name="l00004"></a>00004 <span class="comment"> Copyright (c) 2003 Lubos Lunak <l.lunak@kde.org></span> <a name="l00005"></a>00005 <span class="comment"></span> <a name="l00006"></a>00006 <span class="comment"> Permission is hereby granted, free of charge, to any person obtaining a</span> <a name="l00007"></a>00007 <span class="comment"> copy of this software and associated documentation files (the "Software"),</span> <a name="l00008"></a>00008 <span class="comment"> to deal in the Software without restriction, including without limitation</span> <a name="l00009"></a>00009 <span class="comment"> the rights to use, copy, modify, merge, publish, distribute, sublicense,</span> <a name="l00010"></a>00010 <span class="comment"> and/or sell copies of the Software, and to permit persons to whom the</span> <a name="l00011"></a>00011 <span class="comment"> Software is furnished to do so, subject to the following conditions:</span> <a name="l00012"></a>00012 <span class="comment"></span> <a name="l00013"></a>00013 <span class="comment"> The above copyright notice and this permission notice shall be included in</span> <a name="l00014"></a>00014 <span class="comment"> all copies or substantial portions of the Software.</span> <a name="l00015"></a>00015 <span class="comment"></span> <a name="l00016"></a>00016 <span class="comment"> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR</span> <a name="l00017"></a>00017 <span class="comment"> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</span> <a name="l00018"></a>00018 <span class="comment"> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL</span> <a name="l00019"></a>00019 <span class="comment"> THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER</span> <a name="l00020"></a>00020 <span class="comment"> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING</span> <a name="l00021"></a>00021 <span class="comment"> FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER</span> <a name="l00022"></a>00022 <span class="comment"> DEALINGS IN THE SOFTWARE.</span> <a name="l00023"></a>00023 <span class="comment"></span> <a name="l00024"></a>00024 <span class="comment">*/</span> <a name="l00025"></a>00025 <a name="l00026"></a>00026 <span class="comment">//#define NETWMDEBUG</span> <a name="l00027"></a>00027 <a name="l00028"></a>00028 <span class="preprocessor">#include <qwidget.h></span> <a name="l00029"></a>00029 <span class="preprocessor">#ifdef Q_WS_X11 //FIXME</span> <a name="l00030"></a>00030 <span class="preprocessor"></span> <a name="l00031"></a>00031 <span class="preprocessor">#include "netwm.h"</span> <a name="l00032"></a>00032 <a name="l00033"></a>00033 <span class="preprocessor">#include <string.h></span> <a name="l00034"></a>00034 <span class="preprocessor">#include <stdio.h></span> <a name="l00035"></a>00035 <span class="preprocessor">#include <assert.h></span> <a name="l00036"></a>00036 <span class="preprocessor">#include <stdlib.h></span> <a name="l00037"></a>00037 <a name="l00038"></a>00038 <span class="preprocessor">#include <X11/Xmd.h></span> <a name="l00039"></a>00039 <a name="l00040"></a>00040 <span class="preprocessor">#include "netwm_p.h"</span> <a name="l00041"></a>00041 <a name="l00042"></a>00042 <span class="comment">// UTF-8 string</span> <a name="l00043"></a>00043 <span class="keyword">static</span> Atom UTF8_STRING = 0; <a name="l00044"></a>00044 <a name="l00045"></a>00045 <span class="comment">// root window properties</span> <a name="l00046"></a>00046 <span class="keyword">static</span> Atom net_supported = 0; <a name="l00047"></a>00047 <span class="keyword">static</span> Atom net_client_list = 0; <a name="l00048"></a>00048 <span class="keyword">static</span> Atom net_client_list_stacking = 0; <a name="l00049"></a>00049 <span class="keyword">static</span> Atom net_desktop_geometry = 0; <a name="l00050"></a>00050 <span class="keyword">static</span> Atom net_desktop_viewport = 0; <a name="l00051"></a>00051 <span class="keyword">static</span> Atom net_current_desktop = 0; <a name="l00052"></a>00052 <span class="keyword">static</span> Atom net_desktop_names = 0; <a name="l00053"></a>00053 <span class="keyword">static</span> Atom net_number_of_desktops = 0; <a name="l00054"></a>00054 <span class="keyword">static</span> Atom net_active_window = 0; <a name="l00055"></a>00055 <span class="keyword">static</span> Atom net_workarea = 0; <a name="l00056"></a>00056 <span class="keyword">static</span> Atom net_supporting_wm_check = 0; <a name="l00057"></a>00057 <span class="keyword">static</span> Atom net_virtual_roots = 0; <a name="l00058"></a>00058 <span class="keyword">static</span> Atom net_showing_desktop = 0; <a name="l00059"></a>00059 <span class="keyword">static</span> Atom net_desktop_layout = 0; <a name="l00060"></a>00060 <a name="l00061"></a>00061 <span class="comment">// root window messages</span> <a name="l00062"></a>00062 <span class="keyword">static</span> Atom net_close_window = 0; <a name="l00063"></a>00063 <span class="keyword">static</span> Atom net_restack_window = 0; <a name="l00064"></a>00064 <span class="keyword">static</span> Atom net_wm_moveresize = 0; <a name="l00065"></a>00065 <span class="keyword">static</span> Atom net_moveresize_window = 0; <a name="l00066"></a>00066 <a name="l00067"></a>00067 <span class="comment">// application window properties</span> <a name="l00068"></a>00068 <span class="keyword">static</span> Atom net_wm_name = 0; <a name="l00069"></a>00069 <span class="keyword">static</span> Atom net_wm_visible_name = 0; <a name="l00070"></a>00070 <span class="keyword">static</span> Atom net_wm_icon_name = 0; <a name="l00071"></a>00071 <span class="keyword">static</span> Atom net_wm_visible_icon_name = 0; <a name="l00072"></a>00072 <span class="keyword">static</span> Atom net_wm_desktop = 0; <a name="l00073"></a>00073 <span class="keyword">static</span> Atom net_wm_window_type = 0; <a name="l00074"></a>00074 <span class="keyword">static</span> Atom net_wm_state = 0; <a name="l00075"></a>00075 <span class="keyword">static</span> Atom net_wm_strut = 0; <a name="l00076"></a>00076 <span class="keyword">static</span> Atom net_wm_extended_strut = 0; <span class="comment">// the atom is called _NET_WM_STRUT_PARTIAL</span> <a name="l00077"></a>00077 <span class="keyword">static</span> Atom net_wm_icon_geometry = 0; <a name="l00078"></a>00078 <span class="keyword">static</span> Atom net_wm_icon = 0; <a name="l00079"></a>00079 <span class="keyword">static</span> Atom net_wm_pid = 0; <a name="l00080"></a>00080 <span class="keyword">static</span> Atom net_wm_user_time = 0; <a name="l00081"></a>00081 <span class="keyword">static</span> Atom net_wm_handled_icons = 0; <a name="l00082"></a>00082 <span class="keyword">static</span> Atom net_startup_id = 0; <a name="l00083"></a>00083 <span class="keyword">static</span> Atom net_wm_allowed_actions = 0; <a name="l00084"></a>00084 <span class="keyword">static</span> Atom wm_window_role = 0; <a name="l00085"></a>00085 <span class="keyword">static</span> Atom net_frame_extents = 0; <a name="l00086"></a>00086 <a name="l00087"></a>00087 <span class="comment">// KDE extensions</span> <a name="l00088"></a>00088 <span class="keyword">static</span> Atom kde_net_system_tray_windows = 0; <a name="l00089"></a>00089 <span class="keyword">static</span> Atom kde_net_wm_system_tray_window_for = 0; <a name="l00090"></a>00090 <span class="keyword">static</span> Atom kde_net_wm_frame_strut = 0; <a name="l00091"></a>00091 <span class="keyword">static</span> Atom kde_net_wm_window_type_override = 0; <a name="l00092"></a>00092 <span class="keyword">static</span> Atom kde_net_wm_window_type_topmenu = 0; <a name="l00093"></a>00093 <span class="keyword">static</span> Atom kde_net_wm_temporary_rules = 0; <a name="l00094"></a>00094 <a name="l00095"></a>00095 <span class="comment">// application protocols</span> <a name="l00096"></a>00096 <span class="keyword">static</span> Atom wm_protocols = 0; <a name="l00097"></a>00097 <span class="keyword">static</span> Atom net_wm_ping = 0; <a name="l00098"></a>00098 <span class="keyword">static</span> Atom net_wm_take_activity = 0; <a name="l00099"></a>00099 <a name="l00100"></a>00100 <span class="comment">// application window types</span> <a name="l00101"></a>00101 <span class="keyword">static</span> Atom net_wm_window_type_normal = 0; <a name="l00102"></a>00102 <span class="keyword">static</span> Atom net_wm_window_type_desktop = 0; <a name="l00103"></a>00103 <span class="keyword">static</span> Atom net_wm_window_type_dock = 0; <a name="l00104"></a>00104 <span class="keyword">static</span> Atom net_wm_window_type_toolbar = 0; <a name="l00105"></a>00105 <span class="keyword">static</span> Atom net_wm_window_type_menu = 0; <a name="l00106"></a>00106 <span class="keyword">static</span> Atom net_wm_window_type_dialog = 0; <a name="l00107"></a>00107 <span class="keyword">static</span> Atom net_wm_window_type_utility = 0; <a name="l00108"></a>00108 <span class="keyword">static</span> Atom net_wm_window_type_splash = 0; <a name="l00109"></a>00109 <span class="keyword">static</span> Atom net_wm_window_type_dropdown_menu = 0; <a name="l00110"></a>00110 <span class="keyword">static</span> Atom net_wm_window_type_popup_menu = 0; <a name="l00111"></a>00111 <span class="keyword">static</span> Atom net_wm_window_type_tooltip = 0; <a name="l00112"></a>00112 <span class="keyword">static</span> Atom net_wm_window_type_notification = 0; <a name="l00113"></a>00113 <span class="keyword">static</span> Atom net_wm_window_type_combobox = 0; <a name="l00114"></a>00114 <span class="keyword">static</span> Atom net_wm_window_type_dnd = 0; <a name="l00115"></a>00115 <a name="l00116"></a>00116 <span class="comment">// application window state</span> <a name="l00117"></a>00117 <span class="keyword">static</span> Atom net_wm_state_modal = 0; <a name="l00118"></a>00118 <span class="keyword">static</span> Atom net_wm_state_sticky = 0; <a name="l00119"></a>00119 <span class="keyword">static</span> Atom net_wm_state_max_vert = 0; <a name="l00120"></a>00120 <span class="keyword">static</span> Atom net_wm_state_max_horiz = 0; <a name="l00121"></a>00121 <span class="keyword">static</span> Atom net_wm_state_shaded = 0; <a name="l00122"></a>00122 <span class="keyword">static</span> Atom net_wm_state_skip_taskbar = 0; <a name="l00123"></a>00123 <span class="keyword">static</span> Atom net_wm_state_skip_pager = 0; <a name="l00124"></a>00124 <span class="keyword">static</span> Atom net_wm_state_hidden = 0; <a name="l00125"></a>00125 <span class="keyword">static</span> Atom net_wm_state_fullscreen = 0; <a name="l00126"></a>00126 <span class="keyword">static</span> Atom net_wm_state_above = 0; <a name="l00127"></a>00127 <span class="keyword">static</span> Atom net_wm_state_below = 0; <a name="l00128"></a>00128 <span class="keyword">static</span> Atom net_wm_state_demands_attention = 0; <a name="l00129"></a>00129 <a name="l00130"></a>00130 <span class="comment">// allowed actions</span> <a name="l00131"></a>00131 <span class="keyword">static</span> Atom net_wm_action_move = 0; <a name="l00132"></a>00132 <span class="keyword">static</span> Atom net_wm_action_resize = 0; <a name="l00133"></a>00133 <span class="keyword">static</span> Atom net_wm_action_minimize = 0; <a name="l00134"></a>00134 <span class="keyword">static</span> Atom net_wm_action_shade = 0; <a name="l00135"></a>00135 <span class="keyword">static</span> Atom net_wm_action_stick = 0; <a name="l00136"></a>00136 <span class="keyword">static</span> Atom net_wm_action_max_vert = 0; <a name="l00137"></a>00137 <span class="keyword">static</span> Atom net_wm_action_max_horiz = 0; <a name="l00138"></a>00138 <span class="keyword">static</span> Atom net_wm_action_fullscreen = 0; <a name="l00139"></a>00139 <span class="keyword">static</span> Atom net_wm_action_change_desk = 0; <a name="l00140"></a>00140 <span class="keyword">static</span> Atom net_wm_action_close = 0; <a name="l00141"></a>00141 <a name="l00142"></a>00142 <span class="comment">// KDE extension that's not in the specs - Replaced by state_above now?</span> <a name="l00143"></a>00143 <span class="keyword">static</span> Atom net_wm_state_stays_on_top = 0; <a name="l00144"></a>00144 <a name="l00145"></a>00145 <span class="comment">// used to determine whether application window is managed or not</span> <a name="l00146"></a>00146 <span class="keyword">static</span> Atom xa_wm_state = 0; <a name="l00147"></a>00147 <a name="l00148"></a>00148 <span class="keyword">static</span> Bool netwm_atoms_created = False; <a name="l00149"></a>00149 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> netwm_sendevent_mask = (SubstructureRedirectMask| <a name="l00150"></a>00150 SubstructureNotifyMask); <a name="l00151"></a>00151 <a name="l00152"></a>00152 <a name="l00153"></a>00153 <span class="keyword">const</span> <span class="keywordtype">long</span> MAX_PROP_SIZE = 100000; <a name="l00154"></a>00154 <a name="l00155"></a>00155 <span class="keyword">static</span> <span class="keywordtype">char</span> *nstrdup(<span class="keyword">const</span> <span class="keywordtype">char</span> *s1) { <a name="l00156"></a>00156 <span class="keywordflow">if</span> (! s1) <span class="keywordflow">return</span> (<span class="keywordtype">char</span> *) 0; <a name="l00157"></a>00157 <a name="l00158"></a>00158 <span class="keywordtype">int</span> l = strlen(s1) + 1; <a name="l00159"></a>00159 <span class="keywordtype">char</span> *s2 = <span class="keyword">new</span> <span class="keywordtype">char</span>[l]; <a name="l00160"></a>00160 strncpy(s2, s1, l); <a name="l00161"></a>00161 <span class="keywordflow">return</span> s2; <a name="l00162"></a>00162 } <a name="l00163"></a>00163 <a name="l00164"></a>00164 <a name="l00165"></a>00165 <span class="keyword">static</span> <span class="keywordtype">char</span> *nstrndup(<span class="keyword">const</span> <span class="keywordtype">char</span> *s1, <span class="keywordtype">int</span> l) { <a name="l00166"></a>00166 <span class="keywordflow">if</span> (! s1 || l == 0) <span class="keywordflow">return</span> (<span class="keywordtype">char</span> *) 0; <a name="l00167"></a>00167 <a name="l00168"></a>00168 <span class="keywordtype">char</span> *s2 = <span class="keyword">new</span> <span class="keywordtype">char</span>[l+1]; <a name="l00169"></a>00169 strncpy(s2, s1, l); <a name="l00170"></a>00170 s2[l] = <span class="charliteral">'\0'</span>; <a name="l00171"></a>00171 <span class="keywordflow">return</span> s2; <a name="l00172"></a>00172 } <a name="l00173"></a>00173 <a name="l00174"></a>00174 <a name="l00175"></a>00175 <span class="keyword">static</span> Window *nwindup(Window *w1, <span class="keywordtype">int</span> n) { <a name="l00176"></a>00176 <span class="keywordflow">if</span> (! w1 || n == 0) <span class="keywordflow">return</span> (Window *) 0; <a name="l00177"></a>00177 <a name="l00178"></a>00178 Window *w2 = <span class="keyword">new</span> Window[n]; <a name="l00179"></a>00179 <span class="keywordflow">while</span> (n--) w2[n] = w1[n]; <a name="l00180"></a>00180 <span class="keywordflow">return</span> w2; <a name="l00181"></a>00181 } <a name="l00182"></a>00182 <a name="l00183"></a>00183 <a name="l00184"></a>00184 <span class="keyword">static</span> <span class="keywordtype">void</span> refdec_nri(NETRootInfoPrivate *p) { <a name="l00185"></a>00185 <a name="l00186"></a>00186 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l00187"></a>00187 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NET: decrementing NETRootInfoPrivate::ref (%d)\n"</span>, p->ref - 1); <a name="l00188"></a>00188 <span class="preprocessor">#endif</span> <a name="l00189"></a>00189 <span class="preprocessor"></span> <a name="l00190"></a>00190 <span class="keywordflow">if</span> (! --p->ref) { <a name="l00191"></a>00191 <a name="l00192"></a>00192 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l00193"></a>00193 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NET: \tno more references, deleting\n"</span>); <a name="l00194"></a>00194 <span class="preprocessor">#endif</span> <a name="l00195"></a>00195 <span class="preprocessor"></span> <a name="l00196"></a>00196 <span class="keyword">delete</span> [] p->name; <a name="l00197"></a>00197 <span class="keyword">delete</span> [] p->stacking; <a name="l00198"></a>00198 <span class="keyword">delete</span> [] p->clients; <a name="l00199"></a>00199 <span class="keyword">delete</span> [] p->virtual_roots; <a name="l00200"></a>00200 <span class="keyword">delete</span> [] p->kde_system_tray_windows; <a name="l00201"></a>00201 <a name="l00202"></a>00202 <span class="keywordtype">int</span> i; <a name="l00203"></a>00203 <span class="keywordflow">for</span> (i = 0; i < p->desktop_names.size(); i++) <a name="l00204"></a>00204 <span class="keyword">delete</span> [] p->desktop_names[i]; <a name="l00205"></a>00205 } <a name="l00206"></a>00206 } <a name="l00207"></a>00207 <a name="l00208"></a>00208 <a name="l00209"></a>00209 <span class="keyword">static</span> <span class="keywordtype">void</span> refdec_nwi(NETWinInfoPrivate *p) { <a name="l00210"></a>00210 <a name="l00211"></a>00211 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l00212"></a>00212 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NET: decrementing NETWinInfoPrivate::ref (%d)\n"</span>, p->ref - 1); <a name="l00213"></a>00213 <span class="preprocessor">#endif</span> <a name="l00214"></a>00214 <span class="preprocessor"></span> <a name="l00215"></a>00215 <span class="keywordflow">if</span> (! --p->ref) { <a name="l00216"></a>00216 <a name="l00217"></a>00217 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l00218"></a>00218 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NET: \tno more references, deleting\n"</span>); <a name="l00219"></a>00219 <span class="preprocessor">#endif</span> <a name="l00220"></a>00220 <span class="preprocessor"></span> <a name="l00221"></a>00221 <span class="keyword">delete</span> [] p->name; <a name="l00222"></a>00222 <span class="keyword">delete</span> [] p->visible_name; <a name="l00223"></a>00223 <span class="keyword">delete</span> [] p->icon_name; <a name="l00224"></a>00224 <span class="keyword">delete</span> [] p->visible_icon_name; <a name="l00225"></a>00225 <span class="keyword">delete</span> [] p->startup_id; <a name="l00226"></a>00226 <a name="l00227"></a>00227 <span class="keywordtype">int</span> i; <a name="l00228"></a>00228 <span class="keywordflow">for</span> (i = 0; i < p->icons.size(); i++) <a name="l00229"></a>00229 <span class="keyword">delete</span> [] p->icons[i].data; <a name="l00230"></a>00230 } <a name="l00231"></a>00231 } <a name="l00232"></a>00232 <a name="l00233"></a>00233 <a name="l00234"></a>00234 <span class="keyword">static</span> <span class="keywordtype">int</span> wcmp(<span class="keyword">const</span> <span class="keywordtype">void</span> *a, <span class="keyword">const</span> <span class="keywordtype">void</span> *b) { <a name="l00235"></a>00235 <span class="keywordflow">return</span> *((Window *) a) - *((Window *) b); <a name="l00236"></a>00236 } <a name="l00237"></a>00237 <a name="l00238"></a>00238 <a name="l00239"></a>00239 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> netAtomCount = 84; <a name="l00240"></a>00240 <span class="keyword">static</span> <span class="keywordtype">void</span> create_atoms(Display *d) { <a name="l00241"></a>00241 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * <span class="keyword">const</span> names[netAtomCount] = <a name="l00242"></a>00242 { <a name="l00243"></a>00243 <span class="stringliteral">"UTF8_STRING"</span>, <a name="l00244"></a>00244 <span class="stringliteral">"_NET_SUPPORTED"</span>, <a name="l00245"></a>00245 <span class="stringliteral">"_NET_SUPPORTING_WM_CHECK"</span>, <a name="l00246"></a>00246 <span class="stringliteral">"_NET_CLIENT_LIST"</span>, <a name="l00247"></a>00247 <span class="stringliteral">"_NET_CLIENT_LIST_STACKING"</span>, <a name="l00248"></a>00248 <span class="stringliteral">"_NET_NUMBER_OF_DESKTOPS"</span>, <a name="l00249"></a>00249 <span class="stringliteral">"_NET_DESKTOP_GEOMETRY"</span>, <a name="l00250"></a>00250 <span class="stringliteral">"_NET_DESKTOP_VIEWPORT"</span>, <a name="l00251"></a>00251 <span class="stringliteral">"_NET_CURRENT_DESKTOP"</span>, <a name="l00252"></a>00252 <span class="stringliteral">"_NET_DESKTOP_NAMES"</span>, <a name="l00253"></a>00253 <span class="stringliteral">"_NET_ACTIVE_WINDOW"</span>, <a name="l00254"></a>00254 <span class="stringliteral">"_NET_WORKAREA"</span>, <a name="l00255"></a>00255 <span class="stringliteral">"_NET_VIRTUAL_ROOTS"</span>, <a name="l00256"></a>00256 <span class="stringliteral">"_NET_DESKTOP_LAYOUT"</span>, <a name="l00257"></a>00257 <span class="stringliteral">"_NET_SHOWING_DESKTOP"</span>, <a name="l00258"></a>00258 <span class="stringliteral">"_NET_CLOSE_WINDOW"</span>, <a name="l00259"></a>00259 <span class="stringliteral">"_NET_RESTACK_WINDOW"</span>, <a name="l00260"></a>00260 <a name="l00261"></a>00261 <span class="stringliteral">"_NET_WM_MOVERESIZE"</span>, <a name="l00262"></a>00262 <span class="stringliteral">"_NET_MOVERESIZE_WINDOW"</span>, <a name="l00263"></a>00263 <span class="stringliteral">"_NET_WM_NAME"</span>, <a name="l00264"></a>00264 <span class="stringliteral">"_NET_WM_VISIBLE_NAME"</span>, <a name="l00265"></a>00265 <span class="stringliteral">"_NET_WM_ICON_NAME"</span>, <a name="l00266"></a>00266 <span class="stringliteral">"_NET_WM_VISIBLE_ICON_NAME"</span>, <a name="l00267"></a>00267 <span class="stringliteral">"_NET_WM_DESKTOP"</span>, <a name="l00268"></a>00268 <span class="stringliteral">"_NET_WM_WINDOW_TYPE"</span>, <a name="l00269"></a>00269 <span class="stringliteral">"_NET_WM_STATE"</span>, <a name="l00270"></a>00270 <span class="stringliteral">"_NET_WM_STRUT"</span>, <a name="l00271"></a>00271 <span class="stringliteral">"_NET_WM_STRUT_PARTIAL"</span>, <a name="l00272"></a>00272 <span class="stringliteral">"_NET_WM_ICON_GEOMETRY"</span>, <a name="l00273"></a>00273 <span class="stringliteral">"_NET_WM_ICON"</span>, <a name="l00274"></a>00274 <span class="stringliteral">"_NET_WM_PID"</span>, <a name="l00275"></a>00275 <span class="stringliteral">"_NET_WM_USER_TIME"</span>, <a name="l00276"></a>00276 <span class="stringliteral">"_NET_WM_HANDLED_ICONS"</span>, <a name="l00277"></a>00277 <span class="stringliteral">"_NET_STARTUP_ID"</span>, <a name="l00278"></a>00278 <span class="stringliteral">"_NET_WM_ALLOWED_ACTIONS"</span>, <a name="l00279"></a>00279 <span class="stringliteral">"_NET_WM_PING"</span>, <a name="l00280"></a>00280 <span class="stringliteral">"_NET_WM_TAKE_ACTIVITY"</span>, <a name="l00281"></a>00281 <span class="stringliteral">"WM_WINDOW_ROLE"</span>, <a name="l00282"></a>00282 <span class="stringliteral">"_NET_FRAME_EXTENTS"</span>, <a name="l00283"></a>00283 <a name="l00284"></a>00284 <span class="stringliteral">"_NET_WM_WINDOW_TYPE_NORMAL"</span>, <a name="l00285"></a>00285 <span class="stringliteral">"_NET_WM_WINDOW_TYPE_DESKTOP"</span>, <a name="l00286"></a>00286 <span class="stringliteral">"_NET_WM_WINDOW_TYPE_DOCK"</span>, <a name="l00287"></a>00287 <span class="stringliteral">"_NET_WM_WINDOW_TYPE_TOOLBAR"</span>, <a name="l00288"></a>00288 <span class="stringliteral">"_NET_WM_WINDOW_TYPE_MENU"</span>, <a name="l00289"></a>00289 <span class="stringliteral">"_NET_WM_WINDOW_TYPE_DIALOG"</span>, <a name="l00290"></a>00290 <span class="stringliteral">"_NET_WM_WINDOW_TYPE_UTILITY"</span>, <a name="l00291"></a>00291 <span class="stringliteral">"_NET_WM_WINDOW_TYPE_SPLASH"</span>, <a name="l00292"></a>00292 <span class="stringliteral">"_NET_WM_WINDOW_TYPE_DROPDOWN_MENU"</span>, <a name="l00293"></a>00293 <span class="stringliteral">"_NET_WM_WINDOW_TYPE_POPUP_MENU"</span>, <a name="l00294"></a>00294 <span class="stringliteral">"_NET_WM_WINDOW_TYPE_TOOLTIP"</span>, <a name="l00295"></a>00295 <span class="stringliteral">"_NET_WM_WINDOW_TYPE_NOTIFICATION"</span>, <a name="l00296"></a>00296 <span class="stringliteral">"_NET_WM_WINDOW_TYPE_COMBOBOX"</span>, <a name="l00297"></a>00297 <span class="stringliteral">"_NET_WM_WINDOW_TYPE_DND"</span>, <a name="l00298"></a>00298 <a name="l00299"></a>00299 <span class="stringliteral">"_NET_WM_STATE_MODAL"</span>, <a name="l00300"></a>00300 <span class="stringliteral">"_NET_WM_STATE_STICKY"</span>, <a name="l00301"></a>00301 <span class="stringliteral">"_NET_WM_STATE_MAXIMIZED_VERT"</span>, <a name="l00302"></a>00302 <span class="stringliteral">"_NET_WM_STATE_MAXIMIZED_HORZ"</span>, <a name="l00303"></a>00303 <span class="stringliteral">"_NET_WM_STATE_SHADED"</span>, <a name="l00304"></a>00304 <span class="stringliteral">"_NET_WM_STATE_SKIP_TASKBAR"</span>, <a name="l00305"></a>00305 <span class="stringliteral">"_NET_WM_STATE_SKIP_PAGER"</span>, <a name="l00306"></a>00306 <span class="stringliteral">"_NET_WM_STATE_HIDDEN"</span>, <a name="l00307"></a>00307 <span class="stringliteral">"_NET_WM_STATE_FULLSCREEN"</span>, <a name="l00308"></a>00308 <span class="stringliteral">"_NET_WM_STATE_ABOVE"</span>, <a name="l00309"></a>00309 <span class="stringliteral">"_NET_WM_STATE_BELOW"</span>, <a name="l00310"></a>00310 <span class="stringliteral">"_NET_WM_STATE_DEMANDS_ATTENTION"</span>, <a name="l00311"></a>00311 <a name="l00312"></a>00312 <span class="stringliteral">"_NET_WM_ACTION_MOVE"</span>, <a name="l00313"></a>00313 <span class="stringliteral">"_NET_WM_ACTION_RESIZE"</span>, <a name="l00314"></a>00314 <span class="stringliteral">"_NET_WM_ACTION_MINIMIZE"</span>, <a name="l00315"></a>00315 <span class="stringliteral">"_NET_WM_ACTION_SHADE"</span>, <a name="l00316"></a>00316 <span class="stringliteral">"_NET_WM_ACTION_STICK"</span>, <a name="l00317"></a>00317 <span class="stringliteral">"_NET_WM_ACTION_MAXIMIZE_VERT"</span>, <a name="l00318"></a>00318 <span class="stringliteral">"_NET_WM_ACTION_MAXIMIZE_HORZ"</span>, <a name="l00319"></a>00319 <span class="stringliteral">"_NET_WM_ACTION_FULLSCREEN"</span>, <a name="l00320"></a>00320 <span class="stringliteral">"_NET_WM_ACTION_CHANGE_DESKTOP"</span>, <a name="l00321"></a>00321 <span class="stringliteral">"_NET_WM_ACTION_CLOSE"</span>, <a name="l00322"></a>00322 <a name="l00323"></a>00323 <span class="stringliteral">"_NET_WM_STATE_STAYS_ON_TOP"</span>, <a name="l00324"></a>00324 <a name="l00325"></a>00325 <span class="stringliteral">"_KDE_NET_SYSTEM_TRAY_WINDOWS"</span>, <a name="l00326"></a>00326 <span class="stringliteral">"_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR"</span>, <a name="l00327"></a>00327 <span class="stringliteral">"_KDE_NET_WM_FRAME_STRUT"</span>, <a name="l00328"></a>00328 <span class="stringliteral">"_KDE_NET_WM_WINDOW_TYPE_OVERRIDE"</span>, <a name="l00329"></a>00329 <span class="stringliteral">"_KDE_NET_WM_WINDOW_TYPE_TOPMENU"</span>, <a name="l00330"></a>00330 <span class="stringliteral">"_KDE_NET_WM_TEMPORARY_RULES"</span>, <a name="l00331"></a>00331 <a name="l00332"></a>00332 <span class="stringliteral">"WM_STATE"</span>, <a name="l00333"></a>00333 <span class="stringliteral">"WM_PROTOCOLS"</span> <a name="l00334"></a>00334 }; <a name="l00335"></a>00335 <a name="l00336"></a>00336 Atom atoms[netAtomCount], *atomsp[netAtomCount] = <a name="l00337"></a>00337 { <a name="l00338"></a>00338 &UTF8_STRING, <a name="l00339"></a>00339 &net_supported, <a name="l00340"></a>00340 &net_supporting_wm_check, <a name="l00341"></a>00341 &net_client_list, <a name="l00342"></a>00342 &net_client_list_stacking, <a name="l00343"></a>00343 &net_number_of_desktops, <a name="l00344"></a>00344 &net_desktop_geometry, <a name="l00345"></a>00345 &net_desktop_viewport, <a name="l00346"></a>00346 &net_current_desktop, <a name="l00347"></a>00347 &net_desktop_names, <a name="l00348"></a>00348 &net_active_window, <a name="l00349"></a>00349 &net_workarea, <a name="l00350"></a>00350 &net_virtual_roots, <a name="l00351"></a>00351 &net_desktop_layout, <a name="l00352"></a>00352 &net_showing_desktop, <a name="l00353"></a>00353 &net_close_window, <a name="l00354"></a>00354 &net_restack_window, <a name="l00355"></a>00355 <a name="l00356"></a>00356 &net_wm_moveresize, <a name="l00357"></a>00357 &net_moveresize_window, <a name="l00358"></a>00358 &net_wm_name, <a name="l00359"></a>00359 &net_wm_visible_name, <a name="l00360"></a>00360 &net_wm_icon_name, <a name="l00361"></a>00361 &net_wm_visible_icon_name, <a name="l00362"></a>00362 &net_wm_desktop, <a name="l00363"></a>00363 &net_wm_window_type, <a name="l00364"></a>00364 &net_wm_state, <a name="l00365"></a>00365 &net_wm_strut, <a name="l00366"></a>00366 &net_wm_extended_strut, <a name="l00367"></a>00367 &net_wm_icon_geometry, <a name="l00368"></a>00368 &net_wm_icon, <a name="l00369"></a>00369 &net_wm_pid, <a name="l00370"></a>00370 &net_wm_user_time, <a name="l00371"></a>00371 &net_wm_handled_icons, <a name="l00372"></a>00372 &net_startup_id, <a name="l00373"></a>00373 &net_wm_allowed_actions, <a name="l00374"></a>00374 &net_wm_ping, <a name="l00375"></a>00375 &net_wm_take_activity, <a name="l00376"></a>00376 &wm_window_role, <a name="l00377"></a>00377 &net_frame_extents, <a name="l00378"></a>00378 <a name="l00379"></a>00379 &net_wm_window_type_normal, <a name="l00380"></a>00380 &net_wm_window_type_desktop, <a name="l00381"></a>00381 &net_wm_window_type_dock, <a name="l00382"></a>00382 &net_wm_window_type_toolbar, <a name="l00383"></a>00383 &net_wm_window_type_menu, <a name="l00384"></a>00384 &net_wm_window_type_dialog, <a name="l00385"></a>00385 &net_wm_window_type_utility, <a name="l00386"></a>00386 &net_wm_window_type_splash, <a name="l00387"></a>00387 &net_wm_window_type_dropdown_menu, <a name="l00388"></a>00388 &net_wm_window_type_popup_menu, <a name="l00389"></a>00389 &net_wm_window_type_tooltip, <a name="l00390"></a>00390 &net_wm_window_type_notification, <a name="l00391"></a>00391 &net_wm_window_type_combobox, <a name="l00392"></a>00392 &net_wm_window_type_dnd, <a name="l00393"></a>00393 <a name="l00394"></a>00394 &net_wm_state_modal, <a name="l00395"></a>00395 &net_wm_state_sticky, <a name="l00396"></a>00396 &net_wm_state_max_vert, <a name="l00397"></a>00397 &net_wm_state_max_horiz, <a name="l00398"></a>00398 &net_wm_state_shaded, <a name="l00399"></a>00399 &net_wm_state_skip_taskbar, <a name="l00400"></a>00400 &net_wm_state_skip_pager, <a name="l00401"></a>00401 &net_wm_state_hidden, <a name="l00402"></a>00402 &net_wm_state_fullscreen, <a name="l00403"></a>00403 &net_wm_state_above, <a name="l00404"></a>00404 &net_wm_state_below, <a name="l00405"></a>00405 &net_wm_state_demands_attention, <a name="l00406"></a>00406 <a name="l00407"></a>00407 &net_wm_action_move, <a name="l00408"></a>00408 &net_wm_action_resize, <a name="l00409"></a>00409 &net_wm_action_minimize, <a name="l00410"></a>00410 &net_wm_action_shade, <a name="l00411"></a>00411 &net_wm_action_stick, <a name="l00412"></a>00412 &net_wm_action_max_vert, <a name="l00413"></a>00413 &net_wm_action_max_horiz, <a name="l00414"></a>00414 &net_wm_action_fullscreen, <a name="l00415"></a>00415 &net_wm_action_change_desk, <a name="l00416"></a>00416 &net_wm_action_close, <a name="l00417"></a>00417 <a name="l00418"></a>00418 &net_wm_state_stays_on_top, <a name="l00419"></a>00419 <a name="l00420"></a>00420 &kde_net_system_tray_windows, <a name="l00421"></a>00421 &kde_net_wm_system_tray_window_for, <a name="l00422"></a>00422 &kde_net_wm_frame_strut, <a name="l00423"></a>00423 &kde_net_wm_window_type_override, <a name="l00424"></a>00424 &kde_net_wm_window_type_topmenu, <a name="l00425"></a>00425 &kde_net_wm_temporary_rules, <a name="l00426"></a>00426 <a name="l00427"></a>00427 &xa_wm_state, <a name="l00428"></a>00428 &wm_protocols <a name="l00429"></a>00429 }; <a name="l00430"></a>00430 <a name="l00431"></a>00431 assert( !netwm_atoms_created ); <a name="l00432"></a>00432 <a name="l00433"></a>00433 <span class="keywordtype">int</span> i = netAtomCount; <a name="l00434"></a>00434 <span class="keywordflow">while</span> (i--) <a name="l00435"></a>00435 atoms[i] = 0; <a name="l00436"></a>00436 <a name="l00437"></a>00437 XInternAtoms(d, (<span class="keywordtype">char</span> **) names, netAtomCount, False, atoms); <a name="l00438"></a>00438 <a name="l00439"></a>00439 i = netAtomCount; <a name="l00440"></a>00440 <span class="keywordflow">while</span> (i--) <a name="l00441"></a>00441 *atomsp[i] = atoms[i]; <a name="l00442"></a>00442 <a name="l00443"></a>00443 netwm_atoms_created = True; <a name="l00444"></a>00444 } <a name="l00445"></a>00445 <a name="l00446"></a>00446 <a name="l00447"></a>00447 <span class="keyword">static</span> <span class="keywordtype">void</span> readIcon(Display* display, Window window, Atom property, NETRArray<NETIcon>& icons, <span class="keywordtype">int</span>& icon_count) { <a name="l00448"></a>00448 <a name="l00449"></a>00449 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l00450"></a>00450 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NET: readIcon\n"</span>); <a name="l00451"></a>00451 <span class="preprocessor">#endif</span> <a name="l00452"></a>00452 <span class="preprocessor"></span> <a name="l00453"></a>00453 Atom type_ret; <a name="l00454"></a>00454 <span class="keywordtype">int</span> format_ret; <a name="l00455"></a>00455 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> nitems_ret = 0, after_ret = 0; <a name="l00456"></a>00456 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *data_ret = 0; <a name="l00457"></a>00457 <a name="l00458"></a>00458 <span class="comment">// reset</span> <a name="l00459"></a>00459 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < icons.size(); i++) <a name="l00460"></a>00460 <span class="keyword">delete</span> [] icons[i].data; <a name="l00461"></a>00461 icons.reset(); <a name="l00462"></a>00462 icon_count = 0; <a name="l00463"></a>00463 <a name="l00464"></a>00464 <span class="comment">// allocate buffers</span> <a name="l00465"></a>00465 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *buffer = 0; <a name="l00466"></a>00466 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> offset = 0; <a name="l00467"></a>00467 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> buffer_offset = 0; <a name="l00468"></a>00468 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> bufsize = 0; <a name="l00469"></a>00469 <a name="l00470"></a>00470 <span class="comment">// read data</span> <a name="l00471"></a>00471 <span class="keywordflow">do</span> { <a name="l00472"></a>00472 <span class="keywordflow">if</span> (XGetWindowProperty(display, window, property, offset, <a name="l00473"></a>00473 MAX_PROP_SIZE, False, XA_CARDINAL, &type_ret, <a name="l00474"></a>00474 &format_ret, &nitems_ret, &after_ret, &data_ret) <a name="l00475"></a>00475 == Success) { <a name="l00476"></a>00476 <span class="keywordflow">if</span> (!bufsize) <a name="l00477"></a>00477 { <a name="l00478"></a>00478 <span class="keywordflow">if</span> (nitems_ret < 3 || type_ret != XA_CARDINAL || <a name="l00479"></a>00479 format_ret != 32) { <a name="l00480"></a>00480 <span class="comment">// either we didn't get the property, or the property has less than</span> <a name="l00481"></a>00481 <span class="comment">// 3 elements in it</span> <a name="l00482"></a>00482 <span class="comment">// NOTE: 3 is the ABSOLUTE minimum:</span> <a name="l00483"></a>00483 <span class="comment">// width = 1, height = 1, length(data) = 1 (width * height)</span> <a name="l00484"></a>00484 <span class="keywordflow">if</span> ( data_ret ) <a name="l00485"></a>00485 XFree(data_ret); <a name="l00486"></a>00486 <span class="keywordflow">return</span>; <a name="l00487"></a>00487 } <a name="l00488"></a>00488 <a name="l00489"></a>00489 bufsize = nitems_ret * <span class="keyword">sizeof</span>(long) + after_ret; <a name="l00490"></a>00490 buffer = (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) malloc(bufsize); <a name="l00491"></a>00491 } <a name="l00492"></a>00492 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (buffer_offset + nitems_ret*<span class="keyword">sizeof</span>(<span class="keywordtype">long</span>) > bufsize) <a name="l00493"></a>00493 { <a name="l00494"></a>00494 fprintf(stderr, <span class="stringliteral">"NETWM: Warning readIcon() needs buffer adjustment!\n"</span>); <a name="l00495"></a>00495 bufsize = buffer_offset + nitems_ret * <span class="keyword">sizeof</span>(long) + after_ret; <a name="l00496"></a>00496 buffer = (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) realloc(buffer, bufsize); <a name="l00497"></a>00497 } <a name="l00498"></a>00498 memcpy((buffer + buffer_offset), data_ret, nitems_ret * <span class="keyword">sizeof</span>(<span class="keywordtype">long</span>)); <a name="l00499"></a>00499 buffer_offset += nitems_ret * <span class="keyword">sizeof</span>(long); <a name="l00500"></a>00500 offset += nitems_ret; <a name="l00501"></a>00501 <a name="l00502"></a>00502 <span class="keywordflow">if</span> ( data_ret ) <a name="l00503"></a>00503 XFree(data_ret); <a name="l00504"></a>00504 } <span class="keywordflow">else</span> { <a name="l00505"></a>00505 <span class="keywordflow">if</span> (buffer) <a name="l00506"></a>00506 free(buffer); <a name="l00507"></a>00507 <span class="keywordflow">return</span>; <span class="comment">// Some error occurred cq. property didn't exist.</span> <a name="l00508"></a>00508 } <a name="l00509"></a>00509 } <a name="l00510"></a>00510 <span class="keywordflow">while</span> (after_ret > 0); <a name="l00511"></a>00511 <a name="l00512"></a>00512 CARD32 *data32; <a name="l00513"></a>00513 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> i, j, k, sz, s; <a name="l00514"></a>00514 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> *d = (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> *) buffer; <a name="l00515"></a>00515 <span class="keywordflow">for</span> (i = 0, j = 0; i < bufsize;) { <a name="l00516"></a>00516 icons[j].size.width = *d++; <a name="l00517"></a>00517 i += <span class="keyword">sizeof</span>(long); <a name="l00518"></a>00518 icons[j].size.height = *d++; <a name="l00519"></a>00519 i += <span class="keyword">sizeof</span>(long); <a name="l00520"></a>00520 <a name="l00521"></a>00521 sz = icons[j].size.width * icons[j].size.height; <a name="l00522"></a>00522 s = sz * <span class="keyword">sizeof</span>(long); <a name="l00523"></a>00523 <a name="l00524"></a>00524 <span class="keywordflow">if</span> ( i + s - 1 > bufsize || sz == 0 || sz > 1024 * 1024 ) { <a name="l00525"></a>00525 <span class="keywordflow">break</span>; <a name="l00526"></a>00526 } <a name="l00527"></a>00527 <a name="l00528"></a>00528 <span class="keyword">delete</span> [] icons[j].data; <a name="l00529"></a>00529 data32 = <span class="keyword">new</span> CARD32[sz]; <a name="l00530"></a>00530 icons[j].data = (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) data32; <a name="l00531"></a>00531 <span class="keywordflow">for</span> (k = 0; k < sz; k++, i += <span class="keyword">sizeof</span>(long)) { <a name="l00532"></a>00532 *data32++ = (CARD32) *d++; <a name="l00533"></a>00533 } <a name="l00534"></a>00534 j++; <a name="l00535"></a>00535 icon_count++; <a name="l00536"></a>00536 } <a name="l00537"></a>00537 <a name="l00538"></a>00538 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l00539"></a>00539 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NET: readIcon got %d icons\n"</span>, icon_count); <a name="l00540"></a>00540 <span class="preprocessor">#endif</span> <a name="l00541"></a>00541 <span class="preprocessor"></span> <a name="l00542"></a>00542 free(buffer); <a name="l00543"></a>00543 } <a name="l00544"></a>00544 <a name="l00545"></a>00545 <a name="l00546"></a>00546 <span class="keyword">template</span> <<span class="keyword">class</span> Z> <a name="l00547"></a>00547 NETRArray<Z>::NETRArray() <a name="l00548"></a>00548 : sz(0), capacity(2) <a name="l00549"></a>00549 { <a name="l00550"></a>00550 d = (Z*) calloc(capacity, <span class="keyword">sizeof</span>(Z)); <span class="comment">// allocate 2 elts and set to zero</span> <a name="l00551"></a>00551 } <a name="l00552"></a>00552 <a name="l00553"></a>00553 <a name="l00554"></a>00554 <span class="keyword">template</span> <<span class="keyword">class</span> Z> <a name="l00555"></a>00555 NETRArray<Z>::~NETRArray() { <a name="l00556"></a>00556 free(d); <a name="l00557"></a>00557 } <a name="l00558"></a>00558 <a name="l00559"></a>00559 <a name="l00560"></a>00560 <span class="keyword">template</span> <<span class="keyword">class</span> Z> <a name="l00561"></a>00561 <span class="keywordtype">void</span> NETRArray<Z>::reset() { <a name="l00562"></a>00562 sz = 0; <a name="l00563"></a>00563 capacity = 2; <a name="l00564"></a>00564 d = (Z*) realloc(d, <span class="keyword">sizeof</span>(Z)*capacity); <a name="l00565"></a>00565 memset( (<span class="keywordtype">void</span>*) d, 0, <span class="keyword">sizeof</span>(Z)*capacity ); <a name="l00566"></a>00566 } <a name="l00567"></a>00567 <a name="l00568"></a>00568 <span class="keyword">template</span> <<span class="keyword">class</span> Z> <a name="l00569"></a>00569 Z &NETRArray<Z>::operator[](<span class="keywordtype">int</span> index) { <a name="l00570"></a>00570 <span class="keywordflow">if</span> (index >= capacity) { <a name="l00571"></a>00571 <span class="comment">// allocate space for the new data</span> <a name="l00572"></a>00572 <span class="comment">// open table has amortized O(1) access time</span> <a name="l00573"></a>00573 <span class="comment">// when N elements appended consecutively -- exa</span> <a name="l00574"></a>00574 <span class="keywordtype">int</span> newcapacity = 2*capacity > index+1 ? 2*capacity : index+1; <span class="comment">// max</span> <a name="l00575"></a>00575 <span class="comment">// copy into new larger memory block using realloc</span> <a name="l00576"></a>00576 d = (Z*) realloc(d, <span class="keyword">sizeof</span>(Z)*newcapacity); <a name="l00577"></a>00577 memset( (<span class="keywordtype">void</span>*) &d[capacity], 0, <span class="keyword">sizeof</span>(Z)*(newcapacity-capacity) ); <a name="l00578"></a>00578 capacity = newcapacity; <a name="l00579"></a>00579 } <a name="l00580"></a>00580 <span class="keywordflow">if</span> (index >= sz) <span class="comment">// at this point capacity>index</span> <a name="l00581"></a>00581 sz = index + 1; <a name="l00582"></a>00582 <a name="l00583"></a>00583 <span class="keywordflow">return</span> d[index]; <a name="l00584"></a>00584 } <a name="l00585"></a>00585 <a name="l00586"></a>00586 <a name="l00587"></a>00587 <span class="comment">// Construct a new NETRootInfo object.</span> <a name="l00588"></a>00588 <a name="l00589"></a>00589 NETRootInfo::NETRootInfo(Display *display, Window supportWindow, <span class="keyword">const</span> <span class="keywordtype">char</span> *wmName, <a name="l00590"></a>00590 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> properties[], <span class="keywordtype">int</span> properties_size, <a name="l00591"></a>00591 <span class="keywordtype">int</span> screen, <span class="keywordtype">bool</span> doActivate) <a name="l00592"></a>00592 { <a name="l00593"></a>00593 <a name="l00594"></a>00594 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l00595"></a>00595 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::NETRootInfo: using window manager constructor\n"</span>); <a name="l00596"></a>00596 <span class="preprocessor">#endif</span> <a name="l00597"></a>00597 <span class="preprocessor"></span> <a name="l00598"></a>00598 p = <span class="keyword">new</span> NETRootInfoPrivate; <a name="l00599"></a>00599 p->ref = 1; <a name="l00600"></a>00600 <a name="l00601"></a>00601 p->display = display; <a name="l00602"></a>00602 p->name = nstrdup(wmName); <a name="l00603"></a>00603 <a name="l00604"></a>00604 <span class="keywordflow">if</span> (screen != -1) { <a name="l00605"></a>00605 p->screen = screen; <a name="l00606"></a>00606 } <span class="keywordflow">else</span> { <a name="l00607"></a>00607 p->screen = DefaultScreen(p->display); <a name="l00608"></a>00608 } <a name="l00609"></a>00609 <a name="l00610"></a>00610 p->root = RootWindow(p->display, p->screen); <a name="l00611"></a>00611 p->supportwindow = supportWindow; <a name="l00612"></a>00612 p->number_of_desktops = p->current_desktop = 0; <a name="l00613"></a>00613 p->active = None; <a name="l00614"></a>00614 p->clients = p->stacking = p->virtual_roots = (Window *) 0; <a name="l00615"></a>00615 p->clients_count = p->stacking_count = p->virtual_roots_count = 0; <a name="l00616"></a>00616 p->kde_system_tray_windows = 0; <a name="l00617"></a>00617 p->kde_system_tray_windows_count = 0; <a name="l00618"></a>00618 p->showing_desktop = <span class="keyword">false</span>; <a name="l00619"></a>00619 p->desktop_layout_orientation = OrientationHorizontal; <a name="l00620"></a>00620 p->desktop_layout_corner = DesktopLayoutCornerTopLeft; <a name="l00621"></a>00621 p->desktop_layout_columns = p->desktop_layout_rows = 0; <a name="l00622"></a>00622 setDefaultProperties(); <a name="l00623"></a>00623 <span class="keywordflow">if</span>( properties_size > PROPERTIES_SIZE ) { <a name="l00624"></a>00624 fprintf( stderr, <span class="stringliteral">"NETRootInfo::NETRootInfo(): properties array too large\n"</span>); <a name="l00625"></a>00625 properties_size = PROPERTIES_SIZE; <a name="l00626"></a>00626 } <a name="l00627"></a>00627 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = 0; i < properties_size; ++i ) <a name="l00628"></a>00628 p->properties[ i ] = properties[ i ]; <a name="l00629"></a>00629 <span class="comment">// force support for Supported and SupportingWMCheck for window managers</span> <a name="l00630"></a>00630 p->properties[ PROTOCOLS ] |= ( Supported | SupportingWMCheck ); <a name="l00631"></a>00631 p->client_properties[ PROTOCOLS ] = DesktopNames <span class="comment">// the only thing that can be changed by clients</span> <a name="l00632"></a>00632 | WMPing; <span class="comment">// or they can reply to this</span> <a name="l00633"></a>00633 p->client_properties[ PROTOCOLS2 ] = WM2TakeActivity | WM2DesktopLayout; <a name="l00634"></a>00634 <a name="l00635"></a>00635 role = WindowManager; <a name="l00636"></a>00636 <a name="l00637"></a>00637 <span class="keywordflow">if</span> (! netwm_atoms_created) create_atoms(p->display); <a name="l00638"></a>00638 <a name="l00639"></a>00639 <span class="keywordflow">if</span> (doActivate) activate(); <a name="l00640"></a>00640 } <a name="l00641"></a>00641 <a name="l00642"></a>00642 NETRootInfo::NETRootInfo(Display *display, Window supportWindow, <span class="keyword">const</span> <span class="keywordtype">char</span> *wmName, <a name="l00643"></a>00643 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> properties, <span class="keywordtype">int</span> screen, <span class="keywordtype">bool</span> doActivate) <a name="l00644"></a>00644 { <a name="l00645"></a>00645 <a name="l00646"></a>00646 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l00647"></a>00647 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::NETRootInfo: using window manager constructor\n"</span>); <a name="l00648"></a>00648 <span class="preprocessor">#endif</span> <a name="l00649"></a>00649 <span class="preprocessor"></span> <a name="l00650"></a>00650 p = <span class="keyword">new</span> NETRootInfoPrivate; <a name="l00651"></a>00651 p->ref = 1; <a name="l00652"></a>00652 <a name="l00653"></a>00653 p->display = display; <a name="l00654"></a>00654 p->name = nstrdup(wmName); <a name="l00655"></a>00655 <a name="l00656"></a>00656 <span class="keywordflow">if</span> (screen != -1) { <a name="l00657"></a>00657 p->screen = screen; <a name="l00658"></a>00658 } <span class="keywordflow">else</span> { <a name="l00659"></a>00659 p->screen = DefaultScreen(p->display); <a name="l00660"></a>00660 } <a name="l00661"></a>00661 <a name="l00662"></a>00662 p->root = RootWindow(p->display, p->screen); <a name="l00663"></a>00663 p->supportwindow = supportWindow; <a name="l00664"></a>00664 p->number_of_desktops = p->current_desktop = 0; <a name="l00665"></a>00665 p->active = None; <a name="l00666"></a>00666 p->clients = p->stacking = p->virtual_roots = (Window *) 0; <a name="l00667"></a>00667 p->clients_count = p->stacking_count = p->virtual_roots_count = 0; <a name="l00668"></a>00668 p->kde_system_tray_windows = 0; <a name="l00669"></a>00669 p->kde_system_tray_windows_count = 0; <a name="l00670"></a>00670 p->showing_desktop = <span class="keyword">false</span>; <a name="l00671"></a>00671 setDefaultProperties(); <a name="l00672"></a>00672 p->properties[ PROTOCOLS ] = properties; <a name="l00673"></a>00673 <span class="comment">// force support for Supported and SupportingWMCheck for window managers</span> <a name="l00674"></a>00674 p->properties[ PROTOCOLS ] |= ( Supported | SupportingWMCheck ); <a name="l00675"></a>00675 p->client_properties[ PROTOCOLS ] = DesktopNames <span class="comment">// the only thing that can be changed by clients</span> <a name="l00676"></a>00676 | WMPing; <span class="comment">// or they can reply to this</span> <a name="l00677"></a>00677 p->client_properties[ PROTOCOLS2 ] = WM2TakeActivity; <a name="l00678"></a>00678 <a name="l00679"></a>00679 role = WindowManager; <a name="l00680"></a>00680 <a name="l00681"></a>00681 <span class="keywordflow">if</span> (! netwm_atoms_created) create_atoms(p->display); <a name="l00682"></a>00682 <a name="l00683"></a>00683 <span class="keywordflow">if</span> (doActivate) activate(); <a name="l00684"></a>00684 } <a name="l00685"></a>00685 <a name="l00686"></a>00686 <a name="l00687"></a>00687 NETRootInfo::NETRootInfo(Display *display, <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> properties[], <span class="keywordtype">int</span> properties_size, <a name="l00688"></a>00688 <span class="keywordtype">int</span> screen, <span class="keywordtype">bool</span> doActivate) <a name="l00689"></a>00689 { <a name="l00690"></a>00690 <a name="l00691"></a>00691 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l00692"></a>00692 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::NETRootInfo: using Client constructor\n"</span>); <a name="l00693"></a>00693 <span class="preprocessor">#endif</span> <a name="l00694"></a>00694 <span class="preprocessor"></span> <a name="l00695"></a>00695 p = <span class="keyword">new</span> NETRootInfoPrivate; <a name="l00696"></a>00696 p->ref = 1; <a name="l00697"></a>00697 <a name="l00698"></a>00698 p->name = 0; <a name="l00699"></a>00699 <a name="l00700"></a>00700 p->display = display; <a name="l00701"></a>00701 <a name="l00702"></a>00702 <span class="keywordflow">if</span> (screen != -1) { <a name="l00703"></a>00703 p->screen = screen; <a name="l00704"></a>00704 } <span class="keywordflow">else</span> { <a name="l00705"></a>00705 p->screen = DefaultScreen(p->display); <a name="l00706"></a>00706 } <a name="l00707"></a>00707 <a name="l00708"></a>00708 p->root = RootWindow(p->display, p->screen); <a name="l00709"></a>00709 p->rootSize.width = WidthOfScreen(ScreenOfDisplay(p->display, p->screen)); <a name="l00710"></a>00710 p->rootSize.height = HeightOfScreen(ScreenOfDisplay(p->display, p->screen)); <a name="l00711"></a>00711 <a name="l00712"></a>00712 p->supportwindow = None; <a name="l00713"></a>00713 p->number_of_desktops = p->current_desktop = 0; <a name="l00714"></a>00714 p->active = None; <a name="l00715"></a>00715 p->clients = p->stacking = p->virtual_roots = (Window *) 0; <a name="l00716"></a>00716 p->clients_count = p->stacking_count = p->virtual_roots_count = 0; <a name="l00717"></a>00717 p->kde_system_tray_windows = 0; <a name="l00718"></a>00718 p->kde_system_tray_windows_count = 0; <a name="l00719"></a>00719 p->showing_desktop = <span class="keyword">false</span>; <a name="l00720"></a>00720 p->desktop_layout_orientation = OrientationHorizontal; <a name="l00721"></a>00721 p->desktop_layout_corner = DesktopLayoutCornerTopLeft; <a name="l00722"></a>00722 p->desktop_layout_columns = p->desktop_layout_rows = 0; <a name="l00723"></a>00723 setDefaultProperties(); <a name="l00724"></a>00724 <span class="keywordflow">if</span>( properties_size > 2 ) { <a name="l00725"></a>00725 fprintf( stderr, <span class="stringliteral">"NETWinInfo::NETWinInfo(): properties array too large\n"</span>); <a name="l00726"></a>00726 properties_size = 2; <a name="l00727"></a>00727 } <a name="l00728"></a>00728 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = 0; i < properties_size; ++i ) <a name="l00729"></a>00729 <span class="comment">// remap from [0]=NET::Property,[1]=NET::Property2</span> <a name="l00730"></a>00730 <span class="keywordflow">switch</span>( i ) { <a name="l00731"></a>00731 <span class="keywordflow">case</span> 0: <a name="l00732"></a>00732 p->client_properties[ PROTOCOLS ] = properties[ i ]; <a name="l00733"></a>00733 <span class="keywordflow">break</span>; <a name="l00734"></a>00734 <span class="keywordflow">case</span> 1: <a name="l00735"></a>00735 p->client_properties[ PROTOCOLS2 ] = properties[ i ]; <a name="l00736"></a>00736 <span class="keywordflow">break</span>; <a name="l00737"></a>00737 } <a name="l00738"></a>00738 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = 0; i < PROPERTIES_SIZE; ++i ) <a name="l00739"></a>00739 p->properties[ i ] = 0; <a name="l00740"></a>00740 <a name="l00741"></a>00741 role = Client; <a name="l00742"></a>00742 <a name="l00743"></a>00743 if (! netwm_atoms_created) create_atoms(p->display); <a name="l00744"></a>00744 <a name="l00745"></a>00745 <span class="keywordflow">if</span> (doActivate) activate(); <a name="l00746"></a>00746 } <a name="l00747"></a>00747 <a name="l00748"></a>00748 NETRootInfo::NETRootInfo(Display *display, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> properties, <span class="keywordtype">int</span> screen, <a name="l00749"></a>00749 <span class="keywordtype">bool</span> doActivate) <a name="l00750"></a>00750 { <a name="l00751"></a>00751 <a name="l00752"></a>00752 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l00753"></a>00753 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::NETRootInfo: using Client constructor\n"</span>); <a name="l00754"></a>00754 <span class="preprocessor">#endif</span> <a name="l00755"></a>00755 <span class="preprocessor"></span> <a name="l00756"></a>00756 p = <span class="keyword">new</span> NETRootInfoPrivate; <a name="l00757"></a>00757 p->ref = 1; <a name="l00758"></a>00758 <a name="l00759"></a>00759 p->name = 0; <a name="l00760"></a>00760 <a name="l00761"></a>00761 p->display = display; <a name="l00762"></a>00762 <a name="l00763"></a>00763 <span class="keywordflow">if</span> (screen != -1) { <a name="l00764"></a>00764 p->screen = screen; <a name="l00765"></a>00765 } <span class="keywordflow">else</span> { <a name="l00766"></a>00766 p->screen = DefaultScreen(p->display); <a name="l00767"></a>00767 } <a name="l00768"></a>00768 <a name="l00769"></a>00769 p->root = RootWindow(p->display, p->screen); <a name="l00770"></a>00770 p->rootSize.width = WidthOfScreen(ScreenOfDisplay(p->display, p->screen)); <a name="l00771"></a>00771 p->rootSize.height = HeightOfScreen(ScreenOfDisplay(p->display, p->screen)); <a name="l00772"></a>00772 <a name="l00773"></a>00773 p->supportwindow = None; <a name="l00774"></a>00774 p->number_of_desktops = p->current_desktop = 0; <a name="l00775"></a>00775 p->active = None; <a name="l00776"></a>00776 p->clients = p->stacking = p->virtual_roots = (Window *) 0; <a name="l00777"></a>00777 p->clients_count = p->stacking_count = p->virtual_roots_count = 0; <a name="l00778"></a>00778 p->kde_system_tray_windows = 0; <a name="l00779"></a>00779 p->kde_system_tray_windows_count = 0; <a name="l00780"></a>00780 p->showing_desktop = <span class="keyword">false</span>; <a name="l00781"></a>00781 p->desktop_layout_orientation = OrientationHorizontal; <a name="l00782"></a>00782 p->desktop_layout_corner = DesktopLayoutCornerTopLeft; <a name="l00783"></a>00783 p->desktop_layout_columns = p->desktop_layout_rows = 0; <a name="l00784"></a>00784 setDefaultProperties(); <a name="l00785"></a>00785 p->client_properties[ PROTOCOLS ] = properties; <a name="l00786"></a>00786 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = 0; i < PROPERTIES_SIZE; ++i ) <a name="l00787"></a>00787 p->properties[ i ] = 0; <a name="l00788"></a>00788 <a name="l00789"></a>00789 role = Client; <a name="l00790"></a>00790 <a name="l00791"></a>00791 if (! netwm_atoms_created) create_atoms(p->display); <a name="l00792"></a>00792 <a name="l00793"></a>00793 <span class="keywordflow">if</span> (doActivate) activate(); <a name="l00794"></a>00794 } <a name="l00795"></a>00795 <a name="l00796"></a>00796 <a name="l00797"></a>00797 NETRootInfo2::NETRootInfo2(Display *display, Window supportWindow, <span class="keyword">const</span> <span class="keywordtype">char</span> *wmName, <a name="l00798"></a>00798 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> properties[], <span class="keywordtype">int</span> properties_size, <a name="l00799"></a>00799 <span class="keywordtype">int</span> screen, <span class="keywordtype">bool</span> doActivate) <a name="l00800"></a>00800 : NETRootInfo( display, supportWindow, wmName, properties, properties_size, <a name="l00801"></a>00801 screen, doActivate ) <a name="l00802"></a>00802 { <a name="l00803"></a>00803 } <a name="l00804"></a>00804 <a name="l00805"></a>00805 NETRootInfo2::NETRootInfo2(Display *display, <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> properties[], <span class="keywordtype">int</span> properties_size, <a name="l00806"></a>00806 <span class="keywordtype">int</span> screen, <span class="keywordtype">bool</span> doActivate) <a name="l00807"></a>00807 : NETRootInfo( display, properties, properties_size, screen, doActivate ) <a name="l00808"></a>00808 { <a name="l00809"></a>00809 } <a name="l00810"></a>00810 <a name="l00811"></a>00811 NETRootInfo3::NETRootInfo3(Display *display, Window supportWindow, <span class="keyword">const</span> <span class="keywordtype">char</span> *wmName, <a name="l00812"></a>00812 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> properties[], <span class="keywordtype">int</span> properties_size, <a name="l00813"></a>00813 <span class="keywordtype">int</span> screen, <span class="keywordtype">bool</span> doActivate) <a name="l00814"></a>00814 : NETRootInfo2( display, supportWindow, wmName, properties, properties_size, <a name="l00815"></a>00815 screen, doActivate ) <a name="l00816"></a>00816 { <a name="l00817"></a>00817 } <a name="l00818"></a>00818 <a name="l00819"></a>00819 NETRootInfo3::NETRootInfo3(Display *display, <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> properties[], <span class="keywordtype">int</span> properties_size, <a name="l00820"></a>00820 <span class="keywordtype">int</span> screen, <span class="keywordtype">bool</span> doActivate) <a name="l00821"></a>00821 : NETRootInfo2( display, properties, properties_size, screen, doActivate ) <a name="l00822"></a>00822 { <a name="l00823"></a>00823 } <a name="l00824"></a>00824 <a name="l00825"></a>00825 NETRootInfo4::NETRootInfo4(Display *display, Window supportWindow, <span class="keyword">const</span> <span class="keywordtype">char</span> *wmName, <a name="l00826"></a>00826 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> properties[], <span class="keywordtype">int</span> properties_size, <a name="l00827"></a>00827 <span class="keywordtype">int</span> screen, <span class="keywordtype">bool</span> doActivate) <a name="l00828"></a>00828 : NETRootInfo3( display, supportWindow, wmName, properties, properties_size, <a name="l00829"></a>00829 screen, doActivate ) <a name="l00830"></a>00830 { <a name="l00831"></a>00831 } <a name="l00832"></a>00832 <a name="l00833"></a>00833 NETRootInfo4::NETRootInfo4(Display *display, <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> properties[], <span class="keywordtype">int</span> properties_size, <a name="l00834"></a>00834 <span class="keywordtype">int</span> screen, <span class="keywordtype">bool</span> doActivate) <a name="l00835"></a>00835 : NETRootInfo3( display, properties, properties_size, screen, doActivate ) <a name="l00836"></a>00836 { <a name="l00837"></a>00837 } <a name="l00838"></a>00838 <a name="l00839"></a>00839 <span class="comment">// Copy an existing NETRootInfo object.</span> <a name="l00840"></a>00840 <a name="l00841"></a>00841 NETRootInfo::NETRootInfo(<span class="keyword">const</span> NETRootInfo &rootinfo) { <a name="l00842"></a>00842 <a name="l00843"></a>00843 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l00844"></a>00844 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::NETRootInfo: using copy constructor\n"</span>); <a name="l00845"></a>00845 <span class="preprocessor">#endif</span> <a name="l00846"></a>00846 <span class="preprocessor"></span> <a name="l00847"></a>00847 p = rootinfo.p; <a name="l00848"></a>00848 role = rootinfo.role; <a name="l00849"></a>00849 <a name="l00850"></a>00850 p->ref++; <a name="l00851"></a>00851 } <a name="l00852"></a>00852 <a name="l00853"></a>00853 <a name="l00854"></a>00854 <span class="comment">// Be gone with our NETRootInfo.</span> <a name="l00855"></a>00855 <a name="l00856"></a>00856 NETRootInfo::~NETRootInfo() { <a name="l00857"></a>00857 refdec_nri(p); <a name="l00858"></a>00858 <a name="l00859"></a>00859 <span class="keywordflow">if</span> (! p->ref) <span class="keyword">delete</span> p; <a name="l00860"></a>00860 } <a name="l00861"></a>00861 <a name="l00862"></a>00862 <a name="l00863"></a>00863 <span class="keywordtype">void</span> NETRootInfo::setDefaultProperties() <a name="l00864"></a>00864 { <a name="l00865"></a>00865 p->properties[ PROTOCOLS ] = Supported | SupportingWMCheck; <a name="l00866"></a>00866 p->properties[ WINDOW_TYPES ] = NormalMask | DesktopMask | DockMask <a name="l00867"></a>00867 | ToolbarMask | MenuMask | DialogMask; <a name="l00868"></a>00868 p->properties[ STATES ] = Modal | Sticky | MaxVert | MaxHoriz | Shaded <a name="l00869"></a>00869 | SkipTaskbar | StaysOnTop; <a name="l00870"></a>00870 p->properties[ PROTOCOLS2 ] = 0; <a name="l00871"></a>00871 p->properties[ ACTIONS ] = 0; <a name="l00872"></a>00872 p->client_properties[ PROTOCOLS ] = 0; <a name="l00873"></a>00873 p->client_properties[ WINDOW_TYPES ] = 0; <span class="comment">// these two actually don't</span> <a name="l00874"></a>00874 p->client_properties[ STATES ] = 0; <span class="comment">// make sense in client_properties</span> <a name="l00875"></a>00875 p->client_properties[ PROTOCOLS2 ] = 0; <a name="l00876"></a>00876 p->client_properties[ ACTIONS ] = 0; <a name="l00877"></a>00877 } <a name="l00878"></a>00878 <a name="l00879"></a>00879 <span class="keywordtype">void</span> NETRootInfo::activate() { <a name="l00880"></a>00880 <span class="keywordflow">if</span> (role == WindowManager) { <a name="l00881"></a>00881 <a name="l00882"></a>00882 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l00883"></a>00883 <span class="preprocessor"></span> fprintf(stderr, <a name="l00884"></a>00884 <span class="stringliteral">"NETRootInfo::activate: setting supported properties on root\n"</span>); <a name="l00885"></a>00885 <span class="preprocessor">#endif</span> <a name="l00886"></a>00886 <span class="preprocessor"></span> <a name="l00887"></a>00887 setSupported(); <a name="l00888"></a>00888 update(p->client_properties); <a name="l00889"></a>00889 } <span class="keywordflow">else</span> { <a name="l00890"></a>00890 <a name="l00891"></a>00891 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l00892"></a>00892 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::activate: updating client information\n"</span>); <a name="l00893"></a>00893 <span class="preprocessor">#endif</span> <a name="l00894"></a>00894 <span class="preprocessor"></span> <a name="l00895"></a>00895 update(p->client_properties); <a name="l00896"></a>00896 } <a name="l00897"></a>00897 } <a name="l00898"></a>00898 <a name="l00899"></a>00899 <a name="l00900"></a>00900 <span class="keywordtype">void</span> NETRootInfo::setClientList(Window *windows, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> count) { <a name="l00901"></a>00901 <span class="keywordflow">if</span> (role != WindowManager) <span class="keywordflow">return</span>; <a name="l00902"></a>00902 <a name="l00903"></a>00903 p->clients_count = count; <a name="l00904"></a>00904 <a name="l00905"></a>00905 <span class="keyword">delete</span> [] p->clients; <a name="l00906"></a>00906 p->clients = nwindup(windows, count); <a name="l00907"></a>00907 <a name="l00908"></a>00908 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l00909"></a>00909 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::setClientList: setting list with %ld windows\n"</span>, <a name="l00910"></a>00910 p->clients_count); <a name="l00911"></a>00911 <span class="preprocessor">#endif</span> <a name="l00912"></a>00912 <span class="preprocessor"></span> <a name="l00913"></a>00913 XChangeProperty(p->display, p->root, net_client_list, XA_WINDOW, 32, <a name="l00914"></a>00914 PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *)p->clients, <a name="l00915"></a>00915 p->clients_count); <a name="l00916"></a>00916 } <a name="l00917"></a>00917 <a name="l00918"></a>00918 <a name="l00919"></a>00919 <span class="keywordtype">void</span> NETRootInfo::setClientListStacking(Window *windows, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> count) { <a name="l00920"></a>00920 <span class="keywordflow">if</span> (role != WindowManager) <span class="keywordflow">return</span>; <a name="l00921"></a>00921 <a name="l00922"></a>00922 p->stacking_count = count; <a name="l00923"></a>00923 <span class="keyword">delete</span> [] p->stacking; <a name="l00924"></a>00924 p->stacking = nwindup(windows, count); <a name="l00925"></a>00925 <a name="l00926"></a>00926 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l00927"></a>00927 <span class="preprocessor"></span> fprintf(stderr, <a name="l00928"></a>00928 <span class="stringliteral">"NETRootInfo::setClientListStacking: setting list with %ld windows\n"</span>, <a name="l00929"></a>00929 p->clients_count); <a name="l00930"></a>00930 <span class="preprocessor">#endif</span> <a name="l00931"></a>00931 <span class="preprocessor"></span> <a name="l00932"></a>00932 XChangeProperty(p->display, p->root, net_client_list_stacking, XA_WINDOW, 32, <a name="l00933"></a>00933 PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) p->stacking, <a name="l00934"></a>00934 p->stacking_count); <a name="l00935"></a>00935 } <a name="l00936"></a>00936 <a name="l00937"></a>00937 <a name="l00938"></a>00938 <span class="keywordtype">void</span> NETRootInfo::setKDESystemTrayWindows(Window *windows, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> count) { <a name="l00939"></a>00939 <span class="keywordflow">if</span> (role != WindowManager) <span class="keywordflow">return</span>; <a name="l00940"></a>00940 <a name="l00941"></a>00941 p->kde_system_tray_windows_count = count; <a name="l00942"></a>00942 <span class="keyword">delete</span> [] p->kde_system_tray_windows; <a name="l00943"></a>00943 p->kde_system_tray_windows = nwindup(windows, count); <a name="l00944"></a>00944 <a name="l00945"></a>00945 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l00946"></a>00946 <span class="preprocessor"></span> fprintf(stderr, <a name="l00947"></a>00947 <span class="stringliteral">"NETRootInfo::setKDESystemTrayWindows: setting list with %ld windows\n"</span>, <a name="l00948"></a>00948 p->kde_system_tray_windows_count); <a name="l00949"></a>00949 <span class="preprocessor">#endif</span> <a name="l00950"></a>00950 <span class="preprocessor"></span> <a name="l00951"></a>00951 XChangeProperty(p->display, p->root, kde_net_system_tray_windows, XA_WINDOW, 32, <a name="l00952"></a>00952 PropModeReplace, <a name="l00953"></a>00953 (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) p->kde_system_tray_windows, <a name="l00954"></a>00954 p->kde_system_tray_windows_count); <a name="l00955"></a>00955 } <a name="l00956"></a>00956 <a name="l00957"></a>00957 <a name="l00958"></a>00958 <span class="keywordtype">void</span> NETRootInfo::setNumberOfDesktops(<span class="keywordtype">int</span> numberOfDesktops) { <a name="l00959"></a>00959 <a name="l00960"></a>00960 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l00961"></a>00961 <span class="preprocessor"></span> fprintf(stderr, <a name="l00962"></a>00962 <span class="stringliteral">"NETRootInfo::setNumberOfDesktops: setting desktop count to %d (%s)\n"</span>, <a name="l00963"></a>00963 numberOfDesktops, (role == WindowManager) ? <span class="stringliteral">"WM"</span> : <span class="stringliteral">"Client"</span>); <a name="l00964"></a>00964 <span class="preprocessor">#endif</span> <a name="l00965"></a>00965 <span class="preprocessor"></span> <a name="l00966"></a>00966 <span class="keywordflow">if</span> (role == WindowManager) { <a name="l00967"></a>00967 p->number_of_desktops = numberOfDesktops; <a name="l00968"></a>00968 <span class="keywordtype">long</span> d = numberOfDesktops; <a name="l00969"></a>00969 XChangeProperty(p->display, p->root, net_number_of_desktops, XA_CARDINAL, 32, <a name="l00970"></a>00970 PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) &d, 1); <a name="l00971"></a>00971 } <span class="keywordflow">else</span> { <a name="l00972"></a>00972 XEvent e; <a name="l00973"></a>00973 <a name="l00974"></a>00974 e.xclient.type = ClientMessage; <a name="l00975"></a>00975 e.xclient.message_type = net_number_of_desktops; <a name="l00976"></a>00976 e.xclient.display = p->display; <a name="l00977"></a>00977 e.xclient.window = p->root; <a name="l00978"></a>00978 e.xclient.format = 32; <a name="l00979"></a>00979 e.xclient.data.l[0] = numberOfDesktops; <a name="l00980"></a>00980 e.xclient.data.l[1] = 0l; <a name="l00981"></a>00981 e.xclient.data.l[2] = 0l; <a name="l00982"></a>00982 e.xclient.data.l[3] = 0l; <a name="l00983"></a>00983 e.xclient.data.l[4] = 0l; <a name="l00984"></a>00984 <a name="l00985"></a>00985 XSendEvent(p->display, p->root, False, netwm_sendevent_mask, &e); <a name="l00986"></a>00986 } <a name="l00987"></a>00987 } <a name="l00988"></a>00988 <a name="l00989"></a>00989 <a name="l00990"></a>00990 <span class="keywordtype">void</span> NETRootInfo::setCurrentDesktop(<span class="keywordtype">int</span> desktop) { <a name="l00991"></a>00991 <a name="l00992"></a>00992 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l00993"></a>00993 <span class="preprocessor"></span> fprintf(stderr, <a name="l00994"></a>00994 <span class="stringliteral">"NETRootInfo::setCurrentDesktop: setting current desktop = %d (%s)\n"</span>, <a name="l00995"></a>00995 desktop, (role == WindowManager) ? <span class="stringliteral">"WM"</span> : <span class="stringliteral">"Client"</span>); <a name="l00996"></a>00996 <span class="preprocessor">#endif</span> <a name="l00997"></a>00997 <span class="preprocessor"></span> <a name="l00998"></a>00998 <span class="keywordflow">if</span> (role == WindowManager) { <a name="l00999"></a>00999 p->current_desktop = desktop; <a name="l01000"></a>01000 <span class="keywordtype">long</span> d = p->current_desktop - 1; <a name="l01001"></a>01001 XChangeProperty(p->display, p->root, net_current_desktop, XA_CARDINAL, 32, <a name="l01002"></a>01002 PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) &d, 1); <a name="l01003"></a>01003 } <span class="keywordflow">else</span> { <a name="l01004"></a>01004 XEvent e; <a name="l01005"></a>01005 <a name="l01006"></a>01006 e.xclient.type = ClientMessage; <a name="l01007"></a>01007 e.xclient.message_type = net_current_desktop; <a name="l01008"></a>01008 e.xclient.display = p->display; <a name="l01009"></a>01009 e.xclient.window = p->root; <a name="l01010"></a>01010 e.xclient.format = 32; <a name="l01011"></a>01011 e.xclient.data.l[0] = desktop - 1; <a name="l01012"></a>01012 e.xclient.data.l[1] = 0l; <a name="l01013"></a>01013 e.xclient.data.l[2] = 0l; <a name="l01014"></a>01014 e.xclient.data.l[3] = 0l; <a name="l01015"></a>01015 e.xclient.data.l[4] = 0l; <a name="l01016"></a>01016 <a name="l01017"></a>01017 XSendEvent(p->display, p->root, False, netwm_sendevent_mask, &e); <a name="l01018"></a>01018 } <a name="l01019"></a>01019 } <a name="l01020"></a>01020 <a name="l01021"></a>01021 <a name="l01022"></a>01022 <span class="keywordtype">void</span> NETRootInfo::setDesktopName(<span class="keywordtype">int</span> desktop, <span class="keyword">const</span> <span class="keywordtype">char</span> *desktopName) { <a name="l01023"></a>01023 <span class="comment">// allow setting desktop names even for non-existant desktops, see the spec, sect.3.7.</span> <a name="l01024"></a>01024 <span class="keywordflow">if</span> (desktop < 1) <span class="keywordflow">return</span>; <a name="l01025"></a>01025 <a name="l01026"></a>01026 <span class="keyword">delete</span> [] p->desktop_names[desktop - 1]; <a name="l01027"></a>01027 p->desktop_names[desktop - 1] = nstrdup(desktopName); <a name="l01028"></a>01028 <a name="l01029"></a>01029 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i, proplen, <a name="l01030"></a>01030 num = ((p->number_of_desktops > p->desktop_names.size()) ? <a name="l01031"></a>01031 p->number_of_desktops : p->desktop_names.size()); <a name="l01032"></a>01032 <span class="keywordflow">for</span> (i = 0, proplen = 0; i < num; i++) <a name="l01033"></a>01033 proplen += (p->desktop_names[i] != 0 ? strlen(p->desktop_names[i])+1 : 1 ); <a name="l01034"></a>01034 <a name="l01035"></a>01035 <span class="keywordtype">char</span> *prop = <span class="keyword">new</span> <span class="keywordtype">char</span>[proplen], *propp = prop; <a name="l01036"></a>01036 <a name="l01037"></a>01037 <span class="keywordflow">for</span> (i = 0; i < num; i++) <a name="l01038"></a>01038 <span class="keywordflow">if</span> (p->desktop_names[i]) { <a name="l01039"></a>01039 strcpy(propp, p->desktop_names[i]); <a name="l01040"></a>01040 propp += strlen(p->desktop_names[i]) + 1; <a name="l01041"></a>01041 } <span class="keywordflow">else</span> <a name="l01042"></a>01042 *propp++ = <span class="charliteral">'\0'</span>; <a name="l01043"></a>01043 <a name="l01044"></a>01044 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l01045"></a>01045 <span class="preprocessor"></span> fprintf(stderr, <a name="l01046"></a>01046 <span class="stringliteral">"NETRootInfo::setDesktopName(%d, '%s')\n"</span> <a name="l01047"></a>01047 <span class="stringliteral">"NETRootInfo::setDesktopName: total property length = %d"</span>, <a name="l01048"></a>01048 desktop, desktopName, proplen); <a name="l01049"></a>01049 <span class="preprocessor">#endif</span> <a name="l01050"></a>01050 <span class="preprocessor"></span> <a name="l01051"></a>01051 XChangeProperty(p->display, p->root, net_desktop_names, UTF8_STRING, 8, <a name="l01052"></a>01052 PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) prop, proplen); <a name="l01053"></a>01053 <a name="l01054"></a>01054 <span class="keyword">delete</span> [] prop; <a name="l01055"></a>01055 } <a name="l01056"></a>01056 <a name="l01057"></a>01057 <a name="l01058"></a>01058 <span class="keywordtype">void</span> NETRootInfo::setDesktopGeometry(<span class="keywordtype">int</span> , <span class="keyword">const</span> <a class="code" href="structNETSize.html" title="Simple size class for NET classes.">NETSize</a> &geometry) { <a name="l01059"></a>01059 <a name="l01060"></a>01060 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l01061"></a>01061 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::setDesktopGeometry( -- , { %d, %d }) (%s)\n"</span>, <a name="l01062"></a>01062 geometry.<a class="code" href="structNETSize.html#af2e6a5fcac88037fa745273e85c5e219" title="Width.">width</a>, geometry.<a class="code" href="structNETSize.html#a0a6def5683983f7f3478192248ef2f8e" title="Height.">height</a>, (role == WindowManager) ? <span class="stringliteral">"WM"</span> : <span class="stringliteral">"Client"</span>); <a name="l01063"></a>01063 <span class="preprocessor">#endif</span> <a name="l01064"></a>01064 <span class="preprocessor"></span> <a name="l01065"></a>01065 <span class="keywordflow">if</span> (role == WindowManager) { <a name="l01066"></a>01066 p->geometry = geometry; <a name="l01067"></a>01067 <a name="l01068"></a>01068 <span class="keywordtype">long</span> data[2]; <a name="l01069"></a>01069 data[0] = p->geometry.<a class="code" href="structNETSize.html#af2e6a5fcac88037fa745273e85c5e219" title="Width.">width</a>; <a name="l01070"></a>01070 data[1] = p->geometry.height; <a name="l01071"></a>01071 <a name="l01072"></a>01072 XChangeProperty(p->display, p->root, net_desktop_geometry, XA_CARDINAL, 32, <a name="l01073"></a>01073 PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) data, 2); <a name="l01074"></a>01074 } <span class="keywordflow">else</span> { <a name="l01075"></a>01075 XEvent e; <a name="l01076"></a>01076 <a name="l01077"></a>01077 e.xclient.type = ClientMessage; <a name="l01078"></a>01078 e.xclient.message_type = net_desktop_geometry; <a name="l01079"></a>01079 e.xclient.display = p->display; <a name="l01080"></a>01080 e.xclient.window = p->root; <a name="l01081"></a>01081 e.xclient.format = 32; <a name="l01082"></a>01082 e.xclient.data.l[0] = geometry.<a class="code" href="structNETSize.html#af2e6a5fcac88037fa745273e85c5e219" title="Width.">width</a>; <a name="l01083"></a>01083 e.xclient.data.l[1] = geometry.<a class="code" href="structNETSize.html#a0a6def5683983f7f3478192248ef2f8e" title="Height.">height</a>; <a name="l01084"></a>01084 e.xclient.data.l[2] = 0l; <a name="l01085"></a>01085 e.xclient.data.l[3] = 0l; <a name="l01086"></a>01086 e.xclient.data.l[4] = 0l; <a name="l01087"></a>01087 <a name="l01088"></a>01088 XSendEvent(p->display, p->root, False, netwm_sendevent_mask, &e); <a name="l01089"></a>01089 } <a name="l01090"></a>01090 } <a name="l01091"></a>01091 <a name="l01092"></a>01092 <a name="l01093"></a>01093 <span class="keywordtype">void</span> NETRootInfo::setDesktopViewport(<span class="keywordtype">int</span> desktop, <span class="keyword">const</span> <a class="code" href="structNETPoint.html" title="Simple point class for NET classes.">NETPoint</a> &viewport) { <a name="l01094"></a>01094 <a name="l01095"></a>01095 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l01096"></a>01096 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::setDesktopViewport(%d, { %d, %d }) (%s)\n"</span>, <a name="l01097"></a>01097 desktop, viewport.<a class="code" href="structNETPoint.html#a662b6d948b949dabcaf2e955a078e63f" title="x coordinate.">x</a>, viewport.<a class="code" href="structNETPoint.html#ac64b3831f6fd7f1874f7e344beb117bd" title="y coordinate">y</a>, (role == WindowManager) ? <span class="stringliteral">"WM"</span> : <span class="stringliteral">"Client"</span>); <a name="l01098"></a>01098 <span class="preprocessor">#endif</span> <a name="l01099"></a>01099 <span class="preprocessor"></span> <a name="l01100"></a>01100 <span class="keywordflow">if</span> (desktop < 1) <span class="keywordflow">return</span>; <a name="l01101"></a>01101 <a name="l01102"></a>01102 <span class="keywordflow">if</span> (role == WindowManager) { <a name="l01103"></a>01103 p->viewport[desktop - 1] = viewport; <a name="l01104"></a>01104 <a name="l01105"></a>01105 <span class="keywordtype">int</span> d, i, l; <a name="l01106"></a>01106 l = p->number_of_desktops * 2; <a name="l01107"></a>01107 <span class="keywordtype">long</span> *data = <span class="keyword">new</span> <span class="keywordtype">long</span>[l]; <a name="l01108"></a>01108 <span class="keywordflow">for</span> (d = 0, i = 0; d < p->number_of_desktops; d++) { <a name="l01109"></a>01109 data[i++] = p->viewport[d].<a class="code" href="structNETPoint.html#a662b6d948b949dabcaf2e955a078e63f" title="x coordinate.">x</a>; <a name="l01110"></a>01110 data[i++] = p->viewport[d].y; <a name="l01111"></a>01111 } <a name="l01112"></a>01112 <a name="l01113"></a>01113 XChangeProperty(p->display, p->root, net_desktop_viewport, XA_CARDINAL, 32, <a name="l01114"></a>01114 PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) data, l); <a name="l01115"></a>01115 <a name="l01116"></a>01116 <span class="keyword">delete</span> [] data; <a name="l01117"></a>01117 } <span class="keywordflow">else</span> { <a name="l01118"></a>01118 XEvent e; <a name="l01119"></a>01119 <a name="l01120"></a>01120 e.xclient.type = ClientMessage; <a name="l01121"></a>01121 e.xclient.message_type = net_desktop_viewport; <a name="l01122"></a>01122 e.xclient.display = p->display; <a name="l01123"></a>01123 e.xclient.window = p->root; <a name="l01124"></a>01124 e.xclient.format = 32; <a name="l01125"></a>01125 e.xclient.data.l[0] = viewport.<a class="code" href="structNETPoint.html#a662b6d948b949dabcaf2e955a078e63f" title="x coordinate.">x</a>; <a name="l01126"></a>01126 e.xclient.data.l[1] = viewport.<a class="code" href="structNETPoint.html#ac64b3831f6fd7f1874f7e344beb117bd" title="y coordinate">y</a>; <a name="l01127"></a>01127 e.xclient.data.l[2] = 0l; <a name="l01128"></a>01128 e.xclient.data.l[3] = 0l; <a name="l01129"></a>01129 e.xclient.data.l[4] = 0l; <a name="l01130"></a>01130 <a name="l01131"></a>01131 XSendEvent(p->display, p->root, False, netwm_sendevent_mask, &e); <a name="l01132"></a>01132 } <a name="l01133"></a>01133 } <a name="l01134"></a>01134 <a name="l01135"></a>01135 <a name="l01136"></a>01136 <span class="keywordtype">void</span> NETRootInfo::setSupported() { <a name="l01137"></a>01137 <span class="keywordflow">if</span> (role != WindowManager) { <a name="l01138"></a>01138 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l01139"></a>01139 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::setSupported - role != WindowManager\n"</span>); <a name="l01140"></a>01140 <span class="preprocessor">#endif</span> <a name="l01141"></a>01141 <span class="preprocessor"></span> <a name="l01142"></a>01142 <span class="keywordflow">return</span>; <a name="l01143"></a>01143 } <a name="l01144"></a>01144 <a name="l01145"></a>01145 Atom atoms[netAtomCount]; <a name="l01146"></a>01146 <span class="keywordtype">int</span> pnum = 2; <a name="l01147"></a>01147 <a name="l01148"></a>01148 <span class="comment">// Root window properties/messages</span> <a name="l01149"></a>01149 atoms[0] = net_supported; <a name="l01150"></a>01150 atoms[1] = net_supporting_wm_check; <a name="l01151"></a>01151 <a name="l01152"></a>01152 <span class="keywordflow">if</span> (p->properties[ PROTOCOLS ] & ClientList) <a name="l01153"></a>01153 atoms[pnum++] = net_client_list; <a name="l01154"></a>01154 <a name="l01155"></a>01155 <span class="keywordflow">if</span> (p->properties[ PROTOCOLS ] & ClientListStacking) <a name="l01156"></a>01156 atoms[pnum++] = net_client_list_stacking; <a name="l01157"></a>01157 <a name="l01158"></a>01158 <span class="keywordflow">if</span> (p->properties[ PROTOCOLS ] & NumberOfDesktops) <a name="l01159"></a>01159 atoms[pnum++] = net_number_of_desktops; <a name="l01160"></a>01160 <a name="l01161"></a>01161 <span class="keywordflow">if</span> (p->properties[ PROTOCOLS ] & DesktopGeometry) <a name="l01162"></a>01162 atoms[pnum++] = net_desktop_geometry; <a name="l01163"></a>01163 <a name="l01164"></a>01164 <span class="keywordflow">if</span> (p->properties[ PROTOCOLS ] & DesktopViewport) <a name="l01165"></a>01165 atoms[pnum++] = net_desktop_viewport; <a name="l01166"></a>01166 <a name="l01167"></a>01167 <span class="keywordflow">if</span> (p->properties[ PROTOCOLS ] & CurrentDesktop) <a name="l01168"></a>01168 atoms[pnum++] = net_current_desktop; <a name="l01169"></a>01169 <a name="l01170"></a>01170 <span class="keywordflow">if</span> (p->properties[ PROTOCOLS ] & DesktopNames) <a name="l01171"></a>01171 atoms[pnum++] = net_desktop_names; <a name="l01172"></a>01172 <a name="l01173"></a>01173 <span class="keywordflow">if</span> (p->properties[ PROTOCOLS ] & ActiveWindow) <a name="l01174"></a>01174 atoms[pnum++] = net_active_window; <a name="l01175"></a>01175 <a name="l01176"></a>01176 <span class="keywordflow">if</span> (p->properties[ PROTOCOLS ] & WorkArea) <a name="l01177"></a>01177 atoms[pnum++] = net_workarea; <a name="l01178"></a>01178 <a name="l01179"></a>01179 <span class="keywordflow">if</span> (p->properties[ PROTOCOLS ] & VirtualRoots) <a name="l01180"></a>01180 atoms[pnum++] = net_virtual_roots; <a name="l01181"></a>01181 <a name="l01182"></a>01182 <span class="keywordflow">if</span> (p->properties[ PROTOCOLS2 ] & WM2DesktopLayout) <a name="l01183"></a>01183 atoms[pnum++] = net_desktop_layout; <a name="l01184"></a>01184 <a name="l01185"></a>01185 <span class="keywordflow">if</span> (p->properties[ PROTOCOLS ] & CloseWindow) <a name="l01186"></a>01186 atoms[pnum++] = net_close_window; <a name="l01187"></a>01187 <a name="l01188"></a>01188 <span class="keywordflow">if</span> (p->properties[ PROTOCOLS2 ] & WM2RestackWindow) <a name="l01189"></a>01189 atoms[pnum++] = net_restack_window; <a name="l01190"></a>01190 <a name="l01191"></a>01191 <span class="keywordflow">if</span> (p->properties[ PROTOCOLS2 ] & WM2ShowingDesktop) <a name="l01192"></a>01192 atoms[pnum++] = net_showing_desktop; <a name="l01193"></a>01193 <a name="l01194"></a>01194 <span class="comment">// Application window properties/messages</span> <a name="l01195"></a>01195 <span class="keywordflow">if</span> (p->properties[ PROTOCOLS ] & WMMoveResize) <a name="l01196"></a>01196 atoms[pnum++] = net_wm_moveresize; <a name="l01197"></a>01197 <a name="l01198"></a>01198 <span class="keywordflow">if</span> (p->properties[ PROTOCOLS2 ] & WM2MoveResizeWindow) <a name="l01199"></a>01199 atoms[pnum++] = net_moveresize_window; <a name="l01200"></a>01200 <a name="l01201"></a>01201 <span class="keywordflow">if</span> (p->properties[ PROTOCOLS ] & WMName) <a name="l01202"></a>01202 atoms[pnum++] = net_wm_name; <a name="l01203"></a>01203 <a name="l01204"></a>01204 <span class="keywordflow">if</span> (p->properties[ PROTOCOLS ] & WMVisibleName) <a name="l01205"></a>01205 atoms[pnum++] = net_wm_visible_name; <a name="l01206"></a>01206 <a name="l01207"></a>01207 <span class="keywordflow">if</span> (p->properties[ PROTOCOLS ] & WMIconName) <a name="l01208"></a>01208 atoms[pnum++] = net_wm_icon_name; <a name="l01209"></a>01209 <a name="l01210"></a>01210 <span class="keywordflow">if</span> (p->properties[ PROTOCOLS ] & WMVisibleIconName) <a name="l01211"></a>01211 atoms[pnum++] = net_wm_visible_icon_name; <a name="l01212"></a>01212 <a name="l01213"></a>01213 <span class="keywordflow">if</span> (p->properties[ PROTOCOLS ] & WMDesktop) <a name="l01214"></a>01214 atoms[pnum++] = net_wm_desktop; <a name="l01215"></a>01215 <a name="l01216"></a>01216 <span class="keywordflow">if</span> (p->properties[ PROTOCOLS ] & WMWindowType) { <a name="l01217"></a>01217 atoms[pnum++] = net_wm_window_type; <a name="l01218"></a>01218 <a name="l01219"></a>01219 <span class="comment">// Application window types</span> <a name="l01220"></a>01220 <span class="keywordflow">if</span> (p->properties[ WINDOW_TYPES ] & NormalMask) <a name="l01221"></a>01221 atoms[pnum++] = net_wm_window_type_normal; <a name="l01222"></a>01222 <span class="keywordflow">if</span> (p->properties[ WINDOW_TYPES ] & DesktopMask) <a name="l01223"></a>01223 atoms[pnum++] = net_wm_window_type_desktop; <a name="l01224"></a>01224 <span class="keywordflow">if</span> (p->properties[ WINDOW_TYPES ] & DockMask) <a name="l01225"></a>01225 atoms[pnum++] = net_wm_window_type_dock; <a name="l01226"></a>01226 <span class="keywordflow">if</span> (p->properties[ WINDOW_TYPES ] & ToolbarMask) <a name="l01227"></a>01227 atoms[pnum++] = net_wm_window_type_toolbar; <a name="l01228"></a>01228 <span class="keywordflow">if</span> (p->properties[ WINDOW_TYPES ] & MenuMask) <a name="l01229"></a>01229 atoms[pnum++] = net_wm_window_type_menu; <a name="l01230"></a>01230 <span class="keywordflow">if</span> (p->properties[ WINDOW_TYPES ] & DialogMask) <a name="l01231"></a>01231 atoms[pnum++] = net_wm_window_type_dialog; <a name="l01232"></a>01232 <span class="keywordflow">if</span> (p->properties[ WINDOW_TYPES ] & UtilityMask) <a name="l01233"></a>01233 atoms[pnum++] = net_wm_window_type_utility; <a name="l01234"></a>01234 <span class="keywordflow">if</span> (p->properties[ WINDOW_TYPES ] & SplashMask) <a name="l01235"></a>01235 atoms[pnum++] = net_wm_window_type_splash; <a name="l01236"></a>01236 <span class="keywordflow">if</span> (p->properties[ WINDOW_TYPES ] & DropdownMenuMask) <a name="l01237"></a>01237 atoms[pnum++] = net_wm_window_type_dropdown_menu; <a name="l01238"></a>01238 <span class="keywordflow">if</span> (p->properties[ WINDOW_TYPES ] & PopupMenuMask) <a name="l01239"></a>01239 atoms[pnum++] = net_wm_window_type_popup_menu; <a name="l01240"></a>01240 <span class="keywordflow">if</span> (p->properties[ WINDOW_TYPES ] & TooltipMask) <a name="l01241"></a>01241 atoms[pnum++] = net_wm_window_type_tooltip; <a name="l01242"></a>01242 <span class="keywordflow">if</span> (p->properties[ WINDOW_TYPES ] & NotificationMask) <a name="l01243"></a>01243 atoms[pnum++] = net_wm_window_type_notification; <a name="l01244"></a>01244 <span class="keywordflow">if</span> (p->properties[ WINDOW_TYPES ] & ComboBoxMask) <a name="l01245"></a>01245 atoms[pnum++] = net_wm_window_type_combobox; <a name="l01246"></a>01246 <span class="keywordflow">if</span> (p->properties[ WINDOW_TYPES ] & DNDIconMask) <a name="l01247"></a>01247 atoms[pnum++] = net_wm_window_type_dnd; <a name="l01248"></a>01248 <span class="comment">// KDE extensions</span> <a name="l01249"></a>01249 <span class="keywordflow">if</span> (p->properties[ WINDOW_TYPES ] & OverrideMask) <a name="l01250"></a>01250 atoms[pnum++] = kde_net_wm_window_type_override; <a name="l01251"></a>01251 <span class="keywordflow">if</span> (p->properties[ WINDOW_TYPES ] & TopMenuMask) <a name="l01252"></a>01252 atoms[pnum++] = kde_net_wm_window_type_topmenu; <a name="l01253"></a>01253 } <a name="l01254"></a>01254 <a name="l01255"></a>01255 <span class="keywordflow">if</span> (p->properties[ PROTOCOLS ] & WMState) { <a name="l01256"></a>01256 atoms[pnum++] = net_wm_state; <a name="l01257"></a>01257 <a name="l01258"></a>01258 <span class="comment">// Application window states</span> <a name="l01259"></a>01259 <span class="keywordflow">if</span> (p->properties[ STATES ] & Modal) <a name="l01260"></a>01260 atoms[pnum++] = net_wm_state_modal; <a name="l01261"></a>01261 <span class="keywordflow">if</span> (p->properties[ STATES ] & Sticky) <a name="l01262"></a>01262 atoms[pnum++] = net_wm_state_sticky; <a name="l01263"></a>01263 <span class="keywordflow">if</span> (p->properties[ STATES ] & MaxVert) <a name="l01264"></a>01264 atoms[pnum++] = net_wm_state_max_vert; <a name="l01265"></a>01265 <span class="keywordflow">if</span> (p->properties[ STATES ] & MaxHoriz) <a name="l01266"></a>01266 atoms[pnum++] = net_wm_state_max_horiz; <a name="l01267"></a>01267 <span class="keywordflow">if</span> (p->properties[ STATES ] & Shaded) <a name="l01268"></a>01268 atoms[pnum++] = net_wm_state_shaded; <a name="l01269"></a>01269 <span class="keywordflow">if</span> (p->properties[ STATES ] & SkipTaskbar) <a name="l01270"></a>01270 atoms[pnum++] = net_wm_state_skip_taskbar; <a name="l01271"></a>01271 <span class="keywordflow">if</span> (p->properties[ STATES ] & SkipPager) <a name="l01272"></a>01272 atoms[pnum++] = net_wm_state_skip_pager; <a name="l01273"></a>01273 <span class="keywordflow">if</span> (p->properties[ STATES ] & Hidden) <a name="l01274"></a>01274 atoms[pnum++] = net_wm_state_hidden; <a name="l01275"></a>01275 <span class="keywordflow">if</span> (p->properties[ STATES ] & FullScreen) <a name="l01276"></a>01276 atoms[pnum++] = net_wm_state_fullscreen; <a name="l01277"></a>01277 <span class="keywordflow">if</span> (p->properties[ STATES ] & KeepAbove) <a name="l01278"></a>01278 atoms[pnum++] = net_wm_state_above; <a name="l01279"></a>01279 <span class="keywordflow">if</span> (p->properties[ STATES ] & KeepBelow) <a name="l01280"></a>01280 atoms[pnum++] = net_wm_state_below; <a name="l01281"></a>01281 <span class="keywordflow">if</span> (p->properties[ STATES ] & DemandsAttention) <a name="l01282"></a>01282 atoms[pnum++] = net_wm_state_demands_attention; <a name="l01283"></a>01283 <a name="l01284"></a>01284 <span class="keywordflow">if</span> (p->properties[ STATES ] & StaysOnTop) <a name="l01285"></a>01285 atoms[pnum++] = net_wm_state_stays_on_top; <a name="l01286"></a>01286 } <a name="l01287"></a>01287 <a name="l01288"></a>01288 <span class="keywordflow">if</span> (p->properties[ PROTOCOLS ] & WMStrut) <a name="l01289"></a>01289 atoms[pnum++] = net_wm_strut; <a name="l01290"></a>01290 <a name="l01291"></a>01291 <span class="keywordflow">if</span> (p->properties[ PROTOCOLS2 ] & WM2ExtendedStrut) <a name="l01292"></a>01292 atoms[pnum++] = net_wm_extended_strut; <a name="l01293"></a>01293 <a name="l01294"></a>01294 <span class="keywordflow">if</span> (p->properties[ PROTOCOLS ] & WMIconGeometry) <a name="l01295"></a>01295 atoms[pnum++] = net_wm_icon_geometry; <a name="l01296"></a>01296 <a name="l01297"></a>01297 <span class="keywordflow">if</span> (p->properties[ PROTOCOLS ] & WMIcon) <a name="l01298"></a>01298 atoms[pnum++] = net_wm_icon; <a name="l01299"></a>01299 <a name="l01300"></a>01300 <span class="keywordflow">if</span> (p->properties[ PROTOCOLS ] & WMPid) <a name="l01301"></a>01301 atoms[pnum++] = net_wm_pid; <a name="l01302"></a>01302 <a name="l01303"></a>01303 <span class="keywordflow">if</span> (p->properties[ PROTOCOLS ] & WMHandledIcons) <a name="l01304"></a>01304 atoms[pnum++] = net_wm_handled_icons; <a name="l01305"></a>01305 <a name="l01306"></a>01306 <span class="keywordflow">if</span> (p->properties[ PROTOCOLS ] & WMPing) <a name="l01307"></a>01307 atoms[pnum++] = net_wm_ping; <a name="l01308"></a>01308 <a name="l01309"></a>01309 <span class="keywordflow">if</span> (p->properties[ PROTOCOLS2 ] & WM2TakeActivity) <a name="l01310"></a>01310 atoms[pnum++] = net_wm_take_activity; <a name="l01311"></a>01311 <a name="l01312"></a>01312 <span class="keywordflow">if</span> (p->properties[ PROTOCOLS2 ] & WM2UserTime) <a name="l01313"></a>01313 atoms[pnum++] = net_wm_user_time; <a name="l01314"></a>01314 <a name="l01315"></a>01315 <span class="keywordflow">if</span> (p->properties[ PROTOCOLS2 ] & WM2StartupId) <a name="l01316"></a>01316 atoms[pnum++] = net_startup_id; <a name="l01317"></a>01317 <a name="l01318"></a>01318 <span class="keywordflow">if</span> (p->properties[ PROTOCOLS2 ] & WM2AllowedActions) { <a name="l01319"></a>01319 atoms[pnum++] = net_wm_allowed_actions; <a name="l01320"></a>01320 <a name="l01321"></a>01321 <span class="comment">// Actions</span> <a name="l01322"></a>01322 <span class="keywordflow">if</span> (p->properties[ ACTIONS ] & ActionMove) <a name="l01323"></a>01323 atoms[pnum++] = net_wm_action_move; <a name="l01324"></a>01324 <span class="keywordflow">if</span> (p->properties[ ACTIONS ] & ActionResize) <a name="l01325"></a>01325 atoms[pnum++] = net_wm_action_resize; <a name="l01326"></a>01326 <span class="keywordflow">if</span> (p->properties[ ACTIONS ] & ActionMinimize) <a name="l01327"></a>01327 atoms[pnum++] = net_wm_action_minimize; <a name="l01328"></a>01328 <span class="keywordflow">if</span> (p->properties[ ACTIONS ] & ActionShade) <a name="l01329"></a>01329 atoms[pnum++] = net_wm_action_shade; <a name="l01330"></a>01330 <span class="keywordflow">if</span> (p->properties[ ACTIONS ] & ActionStick) <a name="l01331"></a>01331 atoms[pnum++] = net_wm_action_stick; <a name="l01332"></a>01332 <span class="keywordflow">if</span> (p->properties[ ACTIONS ] & ActionMaxVert) <a name="l01333"></a>01333 atoms[pnum++] = net_wm_action_max_vert; <a name="l01334"></a>01334 <span class="keywordflow">if</span> (p->properties[ ACTIONS ] & ActionMaxHoriz) <a name="l01335"></a>01335 atoms[pnum++] = net_wm_action_max_horiz; <a name="l01336"></a>01336 <span class="keywordflow">if</span> (p->properties[ ACTIONS ] & ActionFullScreen) <a name="l01337"></a>01337 atoms[pnum++] = net_wm_action_fullscreen; <a name="l01338"></a>01338 <span class="keywordflow">if</span> (p->properties[ ACTIONS ] & ActionChangeDesktop) <a name="l01339"></a>01339 atoms[pnum++] = net_wm_action_change_desk; <a name="l01340"></a>01340 <span class="keywordflow">if</span> (p->properties[ ACTIONS ] & ActionClose) <a name="l01341"></a>01341 atoms[pnum++] = net_wm_action_close; <a name="l01342"></a>01342 } <a name="l01343"></a>01343 <a name="l01344"></a>01344 <span class="comment">// KDE specific extensions</span> <a name="l01345"></a>01345 <span class="keywordflow">if</span> (p->properties[ PROTOCOLS ] & KDESystemTrayWindows) <a name="l01346"></a>01346 atoms[pnum++] = kde_net_system_tray_windows; <a name="l01347"></a>01347 <a name="l01348"></a>01348 <span class="keywordflow">if</span> (p->properties[ PROTOCOLS ] & WMKDESystemTrayWinFor) <a name="l01349"></a>01349 atoms[pnum++] = kde_net_wm_system_tray_window_for; <a name="l01350"></a>01350 <a name="l01351"></a>01351 <span class="keywordflow">if</span> (p->properties[ PROTOCOLS ] & WMFrameExtents) { <a name="l01352"></a>01352 atoms[pnum++] = net_frame_extents; <a name="l01353"></a>01353 atoms[pnum++] = kde_net_wm_frame_strut; <a name="l01354"></a>01354 } <a name="l01355"></a>01355 <a name="l01356"></a>01356 <span class="keywordflow">if</span> (p->properties[ PROTOCOLS2 ] & WM2KDETemporaryRules) <a name="l01357"></a>01357 atoms[pnum++] = kde_net_wm_temporary_rules; <a name="l01358"></a>01358 <a name="l01359"></a>01359 XChangeProperty(p->display, p->root, net_supported, XA_ATOM, 32, <a name="l01360"></a>01360 PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) atoms, pnum); <a name="l01361"></a>01361 XChangeProperty(p->display, p->root, net_supporting_wm_check, XA_WINDOW, 32, <a name="l01362"></a>01362 PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) &(p->supportwindow), 1); <a name="l01363"></a>01363 <a name="l01364"></a>01364 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l01365"></a>01365 <span class="preprocessor"></span> fprintf(stderr, <a name="l01366"></a>01366 <span class="stringliteral">"NETRootInfo::setSupported: _NET_SUPPORTING_WM_CHECK = 0x%lx on 0x%lx\n"</span> <a name="l01367"></a>01367 <span class="stringliteral">" : _NET_WM_NAME = '%s' on 0x%lx\n"</span>, <a name="l01368"></a>01368 p->supportwindow, p->supportwindow, p->name, p->supportwindow); <a name="l01369"></a>01369 <span class="preprocessor">#endif</span> <a name="l01370"></a>01370 <span class="preprocessor"></span> <a name="l01371"></a>01371 XChangeProperty(p->display, p->supportwindow, net_supporting_wm_check, <a name="l01372"></a>01372 XA_WINDOW, 32, PropModeReplace, <a name="l01373"></a>01373 (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) &(p->supportwindow), 1); <a name="l01374"></a>01374 XChangeProperty(p->display, p->supportwindow, net_wm_name, UTF8_STRING, 8, <a name="l01375"></a>01375 PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) p->name, <a name="l01376"></a>01376 strlen(p->name)); <a name="l01377"></a>01377 } <a name="l01378"></a>01378 <a name="l01379"></a>01379 <span class="keywordtype">void</span> NETRootInfo::updateSupportedProperties( Atom atom ) <a name="l01380"></a>01380 { <a name="l01381"></a>01381 <span class="keywordflow">if</span>( atom == net_supported ) <a name="l01382"></a>01382 p->properties[ PROTOCOLS ] |= Supported; <a name="l01383"></a>01383 <a name="l01384"></a>01384 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_supporting_wm_check ) <a name="l01385"></a>01385 p->properties[ PROTOCOLS ] |= SupportingWMCheck; <a name="l01386"></a>01386 <a name="l01387"></a>01387 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_client_list ) <a name="l01388"></a>01388 p->properties[ PROTOCOLS ] |= ClientList; <a name="l01389"></a>01389 <a name="l01390"></a>01390 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_client_list_stacking ) <a name="l01391"></a>01391 p->properties[ PROTOCOLS ] |= ClientListStacking; <a name="l01392"></a>01392 <a name="l01393"></a>01393 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_number_of_desktops ) <a name="l01394"></a>01394 p->properties[ PROTOCOLS ] |= NumberOfDesktops; <a name="l01395"></a>01395 <a name="l01396"></a>01396 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_desktop_geometry ) <a name="l01397"></a>01397 p->properties[ PROTOCOLS ] |= DesktopGeometry; <a name="l01398"></a>01398 <a name="l01399"></a>01399 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_desktop_viewport ) <a name="l01400"></a>01400 p->properties[ PROTOCOLS ] |= DesktopViewport; <a name="l01401"></a>01401 <a name="l01402"></a>01402 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_current_desktop ) <a name="l01403"></a>01403 p->properties[ PROTOCOLS ] |= CurrentDesktop; <a name="l01404"></a>01404 <a name="l01405"></a>01405 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_desktop_names ) <a name="l01406"></a>01406 p->properties[ PROTOCOLS ] |= DesktopNames; <a name="l01407"></a>01407 <a name="l01408"></a>01408 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_active_window ) <a name="l01409"></a>01409 p->properties[ PROTOCOLS ] |= ActiveWindow; <a name="l01410"></a>01410 <a name="l01411"></a>01411 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_workarea ) <a name="l01412"></a>01412 p->properties[ PROTOCOLS ] |= WorkArea; <a name="l01413"></a>01413 <a name="l01414"></a>01414 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_virtual_roots ) <a name="l01415"></a>01415 p->properties[ PROTOCOLS ] |= VirtualRoots; <a name="l01416"></a>01416 <a name="l01417"></a>01417 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_desktop_layout ) <a name="l01418"></a>01418 p->properties[ PROTOCOLS2 ] |= WM2DesktopLayout; <a name="l01419"></a>01419 <a name="l01420"></a>01420 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_close_window ) <a name="l01421"></a>01421 p->properties[ PROTOCOLS ] |= CloseWindow; <a name="l01422"></a>01422 <a name="l01423"></a>01423 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_restack_window ) <a name="l01424"></a>01424 p->properties[ PROTOCOLS2 ] |= WM2RestackWindow; <a name="l01425"></a>01425 <a name="l01426"></a>01426 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_showing_desktop ) <a name="l01427"></a>01427 p->properties[ PROTOCOLS2 ] |= WM2ShowingDesktop; <a name="l01428"></a>01428 <a name="l01429"></a>01429 <span class="comment">// Application window properties/messages</span> <a name="l01430"></a>01430 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_moveresize ) <a name="l01431"></a>01431 p->properties[ PROTOCOLS ] |= WMMoveResize; <a name="l01432"></a>01432 <a name="l01433"></a>01433 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_moveresize_window ) <a name="l01434"></a>01434 p->properties[ PROTOCOLS2 ] |= WM2MoveResizeWindow; <a name="l01435"></a>01435 <a name="l01436"></a>01436 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_name ) <a name="l01437"></a>01437 p->properties[ PROTOCOLS ] |= WMName; <a name="l01438"></a>01438 <a name="l01439"></a>01439 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_visible_name ) <a name="l01440"></a>01440 p->properties[ PROTOCOLS ] |= WMVisibleName; <a name="l01441"></a>01441 <a name="l01442"></a>01442 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_icon_name ) <a name="l01443"></a>01443 p->properties[ PROTOCOLS ] |= WMIconName; <a name="l01444"></a>01444 <a name="l01445"></a>01445 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_visible_icon_name ) <a name="l01446"></a>01446 p->properties[ PROTOCOLS ] |= WMVisibleIconName; <a name="l01447"></a>01447 <a name="l01448"></a>01448 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_desktop ) <a name="l01449"></a>01449 p->properties[ PROTOCOLS ] |= WMDesktop; <a name="l01450"></a>01450 <a name="l01451"></a>01451 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_window_type ) <a name="l01452"></a>01452 p->properties[ PROTOCOLS ] |= WMWindowType; <a name="l01453"></a>01453 <a name="l01454"></a>01454 <span class="comment">// Application window types</span> <a name="l01455"></a>01455 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_window_type_normal ) <a name="l01456"></a>01456 p->properties[ WINDOW_TYPES ] |= NormalMask; <a name="l01457"></a>01457 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_window_type_desktop ) <a name="l01458"></a>01458 p->properties[ WINDOW_TYPES ] |= DesktopMask; <a name="l01459"></a>01459 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_window_type_dock ) <a name="l01460"></a>01460 p->properties[ WINDOW_TYPES ] |= DockMask; <a name="l01461"></a>01461 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_window_type_toolbar ) <a name="l01462"></a>01462 p->properties[ WINDOW_TYPES ] |= ToolbarMask; <a name="l01463"></a>01463 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_window_type_menu ) <a name="l01464"></a>01464 p->properties[ WINDOW_TYPES ] |= MenuMask; <a name="l01465"></a>01465 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_window_type_dialog ) <a name="l01466"></a>01466 p->properties[ WINDOW_TYPES ] |= DialogMask; <a name="l01467"></a>01467 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_window_type_utility ) <a name="l01468"></a>01468 p->properties[ WINDOW_TYPES ] |= UtilityMask; <a name="l01469"></a>01469 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_window_type_splash ) <a name="l01470"></a>01470 p->properties[ WINDOW_TYPES ] |= SplashMask; <a name="l01471"></a>01471 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_window_type_dropdown_menu ) <a name="l01472"></a>01472 p->properties[ WINDOW_TYPES ] |= DropdownMenuMask; <a name="l01473"></a>01473 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_window_type_popup_menu ) <a name="l01474"></a>01474 p->properties[ WINDOW_TYPES ] |= PopupMenuMask; <a name="l01475"></a>01475 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_window_type_tooltip ) <a name="l01476"></a>01476 p->properties[ WINDOW_TYPES ] |= TooltipMask; <a name="l01477"></a>01477 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_window_type_notification ) <a name="l01478"></a>01478 p->properties[ WINDOW_TYPES ] |= NotificationMask; <a name="l01479"></a>01479 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_window_type_combobox ) <a name="l01480"></a>01480 p->properties[ WINDOW_TYPES ] |= ComboBoxMask; <a name="l01481"></a>01481 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_window_type_dnd ) <a name="l01482"></a>01482 p->properties[ WINDOW_TYPES ] |= DNDIconMask; <a name="l01483"></a>01483 <span class="comment">// KDE extensions</span> <a name="l01484"></a>01484 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == kde_net_wm_window_type_override ) <a name="l01485"></a>01485 p->properties[ WINDOW_TYPES ] |= OverrideMask; <a name="l01486"></a>01486 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == kde_net_wm_window_type_topmenu ) <a name="l01487"></a>01487 p->properties[ WINDOW_TYPES ] |= TopMenuMask; <a name="l01488"></a>01488 <a name="l01489"></a>01489 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_state ) <a name="l01490"></a>01490 p->properties[ PROTOCOLS ] |= WMState; <a name="l01491"></a>01491 <a name="l01492"></a>01492 <span class="comment">// Application window states</span> <a name="l01493"></a>01493 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_state_modal ) <a name="l01494"></a>01494 p->properties[ STATES ] |= Modal; <a name="l01495"></a>01495 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_state_sticky ) <a name="l01496"></a>01496 p->properties[ STATES ] |= Sticky; <a name="l01497"></a>01497 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_state_max_vert ) <a name="l01498"></a>01498 p->properties[ STATES ] |= MaxVert; <a name="l01499"></a>01499 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_state_max_horiz ) <a name="l01500"></a>01500 p->properties[ STATES ] |= MaxHoriz; <a name="l01501"></a>01501 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_state_shaded ) <a name="l01502"></a>01502 p->properties[ STATES ] |= Shaded; <a name="l01503"></a>01503 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_state_skip_taskbar ) <a name="l01504"></a>01504 p->properties[ STATES ] |= SkipTaskbar; <a name="l01505"></a>01505 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_state_skip_pager ) <a name="l01506"></a>01506 p->properties[ STATES ] |= SkipPager; <a name="l01507"></a>01507 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_state_hidden ) <a name="l01508"></a>01508 p->properties[ STATES ] |= Hidden; <a name="l01509"></a>01509 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_state_fullscreen ) <a name="l01510"></a>01510 p->properties[ STATES ] |= FullScreen; <a name="l01511"></a>01511 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_state_above ) <a name="l01512"></a>01512 p->properties[ STATES ] |= KeepAbove; <a name="l01513"></a>01513 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_state_below ) <a name="l01514"></a>01514 p->properties[ STATES ] |= KeepBelow; <a name="l01515"></a>01515 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_state_demands_attention ) <a name="l01516"></a>01516 p->properties[ STATES ] |= DemandsAttention; <a name="l01517"></a>01517 <a name="l01518"></a>01518 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_state_stays_on_top ) <a name="l01519"></a>01519 p->properties[ STATES ] |= StaysOnTop; <a name="l01520"></a>01520 <a name="l01521"></a>01521 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_strut ) <a name="l01522"></a>01522 p->properties[ PROTOCOLS ] |= WMStrut; <a name="l01523"></a>01523 <a name="l01524"></a>01524 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_extended_strut ) <a name="l01525"></a>01525 p->properties[ PROTOCOLS2 ] |= WM2ExtendedStrut; <a name="l01526"></a>01526 <a name="l01527"></a>01527 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_icon_geometry ) <a name="l01528"></a>01528 p->properties[ PROTOCOLS ] |= WMIconGeometry; <a name="l01529"></a>01529 <a name="l01530"></a>01530 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_icon ) <a name="l01531"></a>01531 p->properties[ PROTOCOLS ] |= WMIcon; <a name="l01532"></a>01532 <a name="l01533"></a>01533 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_pid ) <a name="l01534"></a>01534 p->properties[ PROTOCOLS ] |= WMPid; <a name="l01535"></a>01535 <a name="l01536"></a>01536 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_handled_icons ) <a name="l01537"></a>01537 p->properties[ PROTOCOLS ] |= WMHandledIcons; <a name="l01538"></a>01538 <a name="l01539"></a>01539 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_ping ) <a name="l01540"></a>01540 p->properties[ PROTOCOLS ] |= WMPing; <a name="l01541"></a>01541 <a name="l01542"></a>01542 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_take_activity ) <a name="l01543"></a>01543 p->properties[ PROTOCOLS2 ] |= WM2TakeActivity; <a name="l01544"></a>01544 <a name="l01545"></a>01545 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_user_time ) <a name="l01546"></a>01546 p->properties[ PROTOCOLS2 ] |= WM2UserTime; <a name="l01547"></a>01547 <a name="l01548"></a>01548 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_startup_id ) <a name="l01549"></a>01549 p->properties[ PROTOCOLS2 ] |= WM2StartupId; <a name="l01550"></a>01550 <a name="l01551"></a>01551 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_allowed_actions ) <a name="l01552"></a>01552 p->properties[ PROTOCOLS2 ] |= WM2AllowedActions; <a name="l01553"></a>01553 <a name="l01554"></a>01554 <span class="comment">// Actions</span> <a name="l01555"></a>01555 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_action_move ) <a name="l01556"></a>01556 p->properties[ ACTIONS ] |= ActionMove; <a name="l01557"></a>01557 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_action_resize ) <a name="l01558"></a>01558 p->properties[ ACTIONS ] |= ActionResize; <a name="l01559"></a>01559 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_action_minimize ) <a name="l01560"></a>01560 p->properties[ ACTIONS ] |= ActionMinimize; <a name="l01561"></a>01561 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_action_shade ) <a name="l01562"></a>01562 p->properties[ ACTIONS ] |= ActionShade; <a name="l01563"></a>01563 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_action_stick ) <a name="l01564"></a>01564 p->properties[ ACTIONS ] |= ActionStick; <a name="l01565"></a>01565 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_action_max_vert ) <a name="l01566"></a>01566 p->properties[ ACTIONS ] |= ActionMaxVert; <a name="l01567"></a>01567 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_action_max_horiz ) <a name="l01568"></a>01568 p->properties[ ACTIONS ] |= ActionMaxHoriz; <a name="l01569"></a>01569 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_action_fullscreen ) <a name="l01570"></a>01570 p->properties[ ACTIONS ] |= ActionFullScreen; <a name="l01571"></a>01571 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_action_change_desk ) <a name="l01572"></a>01572 p->properties[ ACTIONS ] |= ActionChangeDesktop; <a name="l01573"></a>01573 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_wm_action_close ) <a name="l01574"></a>01574 p->properties[ ACTIONS ] |= ActionClose; <a name="l01575"></a>01575 <a name="l01576"></a>01576 <span class="comment">// KDE specific extensions</span> <a name="l01577"></a>01577 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == kde_net_system_tray_windows ) <a name="l01578"></a>01578 p->properties[ PROTOCOLS ] |= KDESystemTrayWindows; <a name="l01579"></a>01579 <a name="l01580"></a>01580 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == kde_net_wm_system_tray_window_for ) <a name="l01581"></a>01581 p->properties[ PROTOCOLS ] |= WMKDESystemTrayWinFor; <a name="l01582"></a>01582 <a name="l01583"></a>01583 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == net_frame_extents ) <a name="l01584"></a>01584 p->properties[ PROTOCOLS ] |= WMFrameExtents; <a name="l01585"></a>01585 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == kde_net_wm_frame_strut ) <a name="l01586"></a>01586 p->properties[ PROTOCOLS ] |= WMKDEFrameStrut; <a name="l01587"></a>01587 <a name="l01588"></a>01588 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( atom == kde_net_wm_temporary_rules ) <a name="l01589"></a>01589 p->properties[ PROTOCOLS2 ] |= WM2KDETemporaryRules; <a name="l01590"></a>01590 } <a name="l01591"></a>01591 <a name="l01592"></a>01592 <span class="keyword">extern</span> Time qt_x_user_time; <a name="l01593"></a>01593 <span class="keywordtype">void</span> NETRootInfo::setActiveWindow(Window window) { <a name="l01594"></a>01594 setActiveWindow( window, FromUnknown, qt_x_user_time, None ); <a name="l01595"></a>01595 } <a name="l01596"></a>01596 <a name="l01597"></a>01597 <span class="keywordtype">void</span> NETRootInfo::setActiveWindow(Window window, <a class="code" href="classNET.html#ab8310daed1ca6a628b77ad4f92eeae74" title="Source of the request.">NET::RequestSource</a> src, <a name="l01598"></a>01598 Time timestamp, Window active_window ) { <a name="l01599"></a>01599 <a name="l01600"></a>01600 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l01601"></a>01601 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::setActiveWindow(0x%lx) (%s)\n"</span>, <a name="l01602"></a>01602 window, (role == WindowManager) ? <span class="stringliteral">"WM"</span> : <span class="stringliteral">"Client"</span>); <a name="l01603"></a>01603 <span class="preprocessor">#endif</span> <a name="l01604"></a>01604 <span class="preprocessor"></span> <a name="l01605"></a>01605 <span class="keywordflow">if</span> (role == WindowManager) { <a name="l01606"></a>01606 p->active = window; <a name="l01607"></a>01607 XChangeProperty(p->display, p->root, net_active_window, XA_WINDOW, 32, <a name="l01608"></a>01608 PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) &(p->active), 1); <a name="l01609"></a>01609 } <span class="keywordflow">else</span> { <a name="l01610"></a>01610 XEvent e; <a name="l01611"></a>01611 <a name="l01612"></a>01612 e.xclient.type = ClientMessage; <a name="l01613"></a>01613 e.xclient.message_type = net_active_window; <a name="l01614"></a>01614 e.xclient.display = p->display; <a name="l01615"></a>01615 e.xclient.window = window; <a name="l01616"></a>01616 e.xclient.format = 32; <a name="l01617"></a>01617 e.xclient.data.l[0] = src; <a name="l01618"></a>01618 e.xclient.data.l[1] = timestamp; <a name="l01619"></a>01619 e.xclient.data.l[2] = active_window; <a name="l01620"></a>01620 e.xclient.data.l[3] = 0l; <a name="l01621"></a>01621 e.xclient.data.l[4] = 0l; <a name="l01622"></a>01622 <a name="l01623"></a>01623 XSendEvent(p->display, p->root, False, netwm_sendevent_mask, &e); <a name="l01624"></a>01624 } <a name="l01625"></a>01625 } <a name="l01626"></a>01626 <a name="l01627"></a>01627 <a name="l01628"></a>01628 <span class="keywordtype">void</span> NETRootInfo::setWorkArea(<span class="keywordtype">int</span> desktop, <span class="keyword">const</span> <a class="code" href="structNETRect.html" title="Simple rectangle class for NET classes.">NETRect</a> &workarea) { <a name="l01629"></a>01629 <a name="l01630"></a>01630 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l01631"></a>01631 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::setWorkArea(%d, { %d, %d, %d, %d }) (%s)\n"</span>, <a name="l01632"></a>01632 desktop, workarea.<a class="code" href="structNETRect.html#a2604a60ef01bb245df79ada826b1718d" title="Position of the rectangle.">pos</a>.<a class="code" href="structNETPoint.html#a662b6d948b949dabcaf2e955a078e63f" title="x coordinate.">x</a>, workarea.<a class="code" href="structNETRect.html#a2604a60ef01bb245df79ada826b1718d" title="Position of the rectangle.">pos</a>.<a class="code" href="structNETPoint.html#ac64b3831f6fd7f1874f7e344beb117bd" title="y coordinate">y</a>, workarea.<a class="code" href="structNETRect.html#a97102c18e356965d829855c570bb45ca" title="Size of the rectangle.">size</a>.<a class="code" href="structNETSize.html#af2e6a5fcac88037fa745273e85c5e219" title="Width.">width</a>, workarea.<a class="code" href="structNETRect.html#a97102c18e356965d829855c570bb45ca" title="Size of the rectangle.">size</a>.<a class="code" href="structNETSize.html#a0a6def5683983f7f3478192248ef2f8e" title="Height.">height</a>, <a name="l01633"></a>01633 (role == WindowManager) ? <span class="stringliteral">"WM"</span> : <span class="stringliteral">"Client"</span>); <a name="l01634"></a>01634 <span class="preprocessor">#endif</span> <a name="l01635"></a>01635 <span class="preprocessor"></span> <a name="l01636"></a>01636 <span class="keywordflow">if</span> (role != WindowManager || desktop < 1) <span class="keywordflow">return</span>; <a name="l01637"></a>01637 <a name="l01638"></a>01638 p->workarea[desktop - 1] = workarea; <a name="l01639"></a>01639 <a name="l01640"></a>01640 <span class="keywordtype">long</span> *wa = <span class="keyword">new</span> <span class="keywordtype">long</span>[p->number_of_desktops * 4]; <a name="l01641"></a>01641 <span class="keywordtype">int</span> i, o; <a name="l01642"></a>01642 <span class="keywordflow">for</span> (i = 0, o = 0; i < p->number_of_desktops; i++) { <a name="l01643"></a>01643 wa[o++] = p->workarea[i].<a class="code" href="structNETRect.html#a2604a60ef01bb245df79ada826b1718d" title="Position of the rectangle.">pos</a>.<a class="code" href="structNETPoint.html#a662b6d948b949dabcaf2e955a078e63f" title="x coordinate.">x</a>; <a name="l01644"></a>01644 wa[o++] = p->workarea[i].pos.y; <a name="l01645"></a>01645 wa[o++] = p->workarea[i].size.width; <a name="l01646"></a>01646 wa[o++] = p->workarea[i].size.height; <a name="l01647"></a>01647 } <a name="l01648"></a>01648 <a name="l01649"></a>01649 XChangeProperty(p->display, p->root, net_workarea, XA_CARDINAL, 32, <a name="l01650"></a>01650 PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) wa, <a name="l01651"></a>01651 p->number_of_desktops * 4); <a name="l01652"></a>01652 <a name="l01653"></a>01653 <span class="keyword">delete</span> [] wa; <a name="l01654"></a>01654 } <a name="l01655"></a>01655 <a name="l01656"></a>01656 <a name="l01657"></a>01657 <span class="keywordtype">void</span> NETRootInfo::setVirtualRoots(Window *windows, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> count) { <a name="l01658"></a>01658 <span class="keywordflow">if</span> (role != WindowManager) <span class="keywordflow">return</span>; <a name="l01659"></a>01659 <a name="l01660"></a>01660 p->virtual_roots_count = count; <a name="l01661"></a>01661 p->virtual_roots = windows; <a name="l01662"></a>01662 <a name="l01663"></a>01663 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l01664"></a>01664 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::setVirtualRoots: setting list with %ld windows\n"</span>, <a name="l01665"></a>01665 p->virtual_roots_count); <a name="l01666"></a>01666 <span class="preprocessor">#endif</span> <a name="l01667"></a>01667 <span class="preprocessor"></span> <a name="l01668"></a>01668 XChangeProperty(p->display, p->root, net_virtual_roots, XA_WINDOW, 32, <a name="l01669"></a>01669 PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) p->virtual_roots, <a name="l01670"></a>01670 p->virtual_roots_count); <a name="l01671"></a>01671 } <a name="l01672"></a>01672 <a name="l01673"></a>01673 <a name="l01674"></a>01674 <span class="keywordtype">void</span> NETRootInfo::setDesktopLayout(<a class="code" href="classNET.html#afac5b26cfb4e28ec2f18cd5cc9e1989a" title="Orientation.">NET::Orientation</a> orientation, <span class="keywordtype">int</span> columns, <span class="keywordtype">int</span> rows, <a name="l01675"></a>01675 <a class="code" href="classNET.html#a3359c32a21f438e0e6564f26179e458f" title="Starting corner for desktop layout.">NET::DesktopLayoutCorner</a> corner) <a name="l01676"></a>01676 { <a name="l01677"></a>01677 p->desktop_layout_orientation = orientation; <a name="l01678"></a>01678 p->desktop_layout_columns = columns; <a name="l01679"></a>01679 p->desktop_layout_rows = rows; <a name="l01680"></a>01680 p->desktop_layout_corner = corner; <a name="l01681"></a>01681 <a name="l01682"></a>01682 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l01683"></a>01683 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::setDesktopLayout: %d %d %d %d\n"</span>, <a name="l01684"></a>01684 orientation, columns, rows, corner); <a name="l01685"></a>01685 <span class="preprocessor">#endif</span> <a name="l01686"></a>01686 <span class="preprocessor"></span> <a name="l01687"></a>01687 <span class="keywordtype">long</span> data[ 4 ]; <a name="l01688"></a>01688 data[ 0 ] = orientation; <a name="l01689"></a>01689 data[ 1 ] = columns; <a name="l01690"></a>01690 data[ 2 ] = rows; <a name="l01691"></a>01691 data[ 3 ] = corner; <a name="l01692"></a>01692 XChangeProperty(p->display, p->root, net_desktop_layout, XA_CARDINAL, 32, <a name="l01693"></a>01693 PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) &data, 4); <a name="l01694"></a>01694 } <a name="l01695"></a>01695 <a name="l01696"></a>01696 <a name="l01697"></a>01697 <span class="keywordtype">void</span> NETRootInfo::setShowingDesktop( <span class="keywordtype">bool</span> showing ) { <a name="l01698"></a>01698 <span class="keywordflow">if</span> (role == WindowManager) { <a name="l01699"></a>01699 <span class="keywordtype">long</span> d = p->showing_desktop = showing; <a name="l01700"></a>01700 XChangeProperty(p->display, p->root, net_showing_desktop, XA_CARDINAL, 32, <a name="l01701"></a>01701 PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) &d, 1); <a name="l01702"></a>01702 } <span class="keywordflow">else</span> { <a name="l01703"></a>01703 XEvent e; <a name="l01704"></a>01704 <a name="l01705"></a>01705 e.xclient.type = ClientMessage; <a name="l01706"></a>01706 e.xclient.message_type = net_showing_desktop; <a name="l01707"></a>01707 e.xclient.display = p->display; <a name="l01708"></a>01708 e.xclient.window = 0; <a name="l01709"></a>01709 e.xclient.format = 32; <a name="l01710"></a>01710 e.xclient.data.l[0] = showing ? 1 : 0; <a name="l01711"></a>01711 e.xclient.data.l[1] = 0; <a name="l01712"></a>01712 e.xclient.data.l[2] = 0; <a name="l01713"></a>01713 e.xclient.data.l[3] = 0; <a name="l01714"></a>01714 e.xclient.data.l[4] = 0; <a name="l01715"></a>01715 <a name="l01716"></a>01716 XSendEvent(p->display, p->root, False, netwm_sendevent_mask, &e); <a name="l01717"></a>01717 } <a name="l01718"></a>01718 } <a name="l01719"></a>01719 <a name="l01720"></a>01720 <a name="l01721"></a>01721 <span class="keywordtype">bool</span> NETRootInfo::showingDesktop()<span class="keyword"> const </span>{ <a name="l01722"></a>01722 <span class="keywordflow">return</span> p->showing_desktop; <a name="l01723"></a>01723 } <a name="l01724"></a>01724 <a name="l01725"></a>01725 <a name="l01726"></a>01726 <span class="keywordtype">void</span> NETRootInfo::closeWindowRequest(Window window) { <a name="l01727"></a>01727 <a name="l01728"></a>01728 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l01729"></a>01729 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::closeWindowRequest: requesting close for 0x%lx\n"</span>, <a name="l01730"></a>01730 window); <a name="l01731"></a>01731 <span class="preprocessor">#endif</span> <a name="l01732"></a>01732 <span class="preprocessor"></span> <a name="l01733"></a>01733 XEvent e; <a name="l01734"></a>01734 <a name="l01735"></a>01735 e.xclient.type = ClientMessage; <a name="l01736"></a>01736 e.xclient.message_type = net_close_window; <a name="l01737"></a>01737 e.xclient.display = p->display; <a name="l01738"></a>01738 e.xclient.window = window; <a name="l01739"></a>01739 e.xclient.format = 32; <a name="l01740"></a>01740 e.xclient.data.l[0] = 0l; <a name="l01741"></a>01741 e.xclient.data.l[1] = 0l; <a name="l01742"></a>01742 e.xclient.data.l[2] = 0l; <a name="l01743"></a>01743 e.xclient.data.l[3] = 0l; <a name="l01744"></a>01744 e.xclient.data.l[4] = 0l; <a name="l01745"></a>01745 <a name="l01746"></a>01746 XSendEvent(p->display, p->root, False, netwm_sendevent_mask, &e); <a name="l01747"></a>01747 } <a name="l01748"></a>01748 <a name="l01749"></a>01749 <a name="l01750"></a>01750 <span class="keywordtype">void</span> NETRootInfo::moveResizeRequest(Window window, <span class="keywordtype">int</span> x_root, <span class="keywordtype">int</span> y_root, <a name="l01751"></a>01751 Direction direction) <a name="l01752"></a>01752 { <a name="l01753"></a>01753 <a name="l01754"></a>01754 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l01755"></a>01755 <span class="preprocessor"></span> fprintf(stderr, <a name="l01756"></a>01756 <span class="stringliteral">"NETRootInfo::moveResizeRequest: requesting resize/move for 0x%lx (%d, %d, %d)\n"</span>, <a name="l01757"></a>01757 window, x_root, y_root, direction); <a name="l01758"></a>01758 <span class="preprocessor">#endif</span> <a name="l01759"></a>01759 <span class="preprocessor"></span> <a name="l01760"></a>01760 XEvent e; <a name="l01761"></a>01761 <a name="l01762"></a>01762 e.xclient.type = ClientMessage; <a name="l01763"></a>01763 e.xclient.message_type = net_wm_moveresize; <a name="l01764"></a>01764 e.xclient.display = p->display; <a name="l01765"></a>01765 e.xclient.window = window, <a name="l01766"></a>01766 e.xclient.format = 32; <a name="l01767"></a>01767 e.xclient.data.l[0] = x_root; <a name="l01768"></a>01768 e.xclient.data.l[1] = y_root; <a name="l01769"></a>01769 e.xclient.data.l[2] = direction; <a name="l01770"></a>01770 e.xclient.data.l[3] = 0l; <a name="l01771"></a>01771 e.xclient.data.l[4] = 0l; <a name="l01772"></a>01772 <a name="l01773"></a>01773 XSendEvent(p->display, p->root, False, netwm_sendevent_mask, &e); <a name="l01774"></a>01774 } <a name="l01775"></a>01775 <a name="l01776"></a>01776 <span class="keywordtype">void</span> NETRootInfo::moveResizeWindowRequest(Window window, <span class="keywordtype">int</span> flags, <span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y, <span class="keywordtype">int</span> width, <span class="keywordtype">int</span> height ) <a name="l01777"></a>01777 { <a name="l01778"></a>01778 <a name="l01779"></a>01779 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l01780"></a>01780 <span class="preprocessor"></span> fprintf(stderr, <a name="l01781"></a>01781 <span class="stringliteral">"NETRootInfo::moveResizeWindowRequest: resizing/moving 0x%lx (%d, %d, %d, %d, %d)\n"</span>, <a name="l01782"></a>01782 window, flags, x, y, width, height); <a name="l01783"></a>01783 <span class="preprocessor">#endif</span> <a name="l01784"></a>01784 <span class="preprocessor"></span> <a name="l01785"></a>01785 XEvent e; <a name="l01786"></a>01786 <a name="l01787"></a>01787 e.xclient.type = ClientMessage; <a name="l01788"></a>01788 e.xclient.message_type = net_moveresize_window; <a name="l01789"></a>01789 e.xclient.display = p->display; <a name="l01790"></a>01790 e.xclient.window = window, <a name="l01791"></a>01791 e.xclient.format = 32; <a name="l01792"></a>01792 e.xclient.data.l[0] = flags; <a name="l01793"></a>01793 e.xclient.data.l[1] = x; <a name="l01794"></a>01794 e.xclient.data.l[2] = y; <a name="l01795"></a>01795 e.xclient.data.l[3] = width; <a name="l01796"></a>01796 e.xclient.data.l[4] = height; <a name="l01797"></a>01797 <a name="l01798"></a>01798 XSendEvent(p->display, p->root, False, netwm_sendevent_mask, &e); <a name="l01799"></a>01799 } <a name="l01800"></a>01800 <a name="l01801"></a>01801 <span class="keywordtype">void</span> NETRootInfo::restackRequest(Window window, Window above, <span class="keywordtype">int</span> detail) <a name="l01802"></a>01802 { <a name="l01803"></a>01803 restackRequest( window, FromTool, above, detail, qt_x_user_time ); <a name="l01804"></a>01804 } <a name="l01805"></a>01805 <a name="l01806"></a>01806 <span class="keywordtype">void</span> NETRootInfo::restackRequest(Window window, RequestSource src, Window above, <span class="keywordtype">int</span> detail, Time timestamp ) <a name="l01807"></a>01807 { <a name="l01808"></a>01808 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l01809"></a>01809 <span class="preprocessor"></span> fprintf(stderr, <a name="l01810"></a>01810 <span class="stringliteral">"NETRootInfo::restackRequest: requesting restack for 0x%lx (%lx, %d)\n"</span>, <a name="l01811"></a>01811 window, above, detail); <a name="l01812"></a>01812 <span class="preprocessor">#endif</span> <a name="l01813"></a>01813 <span class="preprocessor"></span> <a name="l01814"></a>01814 XEvent e; <a name="l01815"></a>01815 <a name="l01816"></a>01816 e.xclient.type = ClientMessage; <a name="l01817"></a>01817 e.xclient.message_type = net_restack_window; <a name="l01818"></a>01818 e.xclient.display = p->display; <a name="l01819"></a>01819 e.xclient.window = window, <a name="l01820"></a>01820 e.xclient.format = 32; <a name="l01821"></a>01821 e.xclient.data.l[0] = src; <a name="l01822"></a>01822 e.xclient.data.l[1] = above; <a name="l01823"></a>01823 e.xclient.data.l[2] = detail; <a name="l01824"></a>01824 e.xclient.data.l[3] = timestamp; <a name="l01825"></a>01825 e.xclient.data.l[4] = 0l; <a name="l01826"></a>01826 <a name="l01827"></a>01827 XSendEvent(p->display, p->root, False, netwm_sendevent_mask, &e); <a name="l01828"></a>01828 } <a name="l01829"></a>01829 <a name="l01830"></a>01830 <span class="keywordtype">void</span> NETRootInfo2::sendPing( Window window, Time timestamp ) <a name="l01831"></a>01831 { <a name="l01832"></a>01832 <span class="keywordflow">if</span> (role != WindowManager) <span class="keywordflow">return</span>; <a name="l01833"></a>01833 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l01834"></a>01834 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo2::setPing: window 0x%lx, timestamp %lu\n"</span>, <a name="l01835"></a>01835 window, timestamp ); <a name="l01836"></a>01836 <span class="preprocessor">#endif</span> <a name="l01837"></a>01837 <span class="preprocessor"></span> XEvent e; <a name="l01838"></a>01838 e.xclient.type = ClientMessage; <a name="l01839"></a>01839 e.xclient.message_type = wm_protocols; <a name="l01840"></a>01840 e.xclient.display = p->display; <a name="l01841"></a>01841 e.xclient.window = window, <a name="l01842"></a>01842 e.xclient.format = 32; <a name="l01843"></a>01843 e.xclient.data.l[0] = net_wm_ping; <a name="l01844"></a>01844 e.xclient.data.l[1] = timestamp; <a name="l01845"></a>01845 e.xclient.data.l[2] = window; <a name="l01846"></a>01846 e.xclient.data.l[3] = 0; <a name="l01847"></a>01847 e.xclient.data.l[4] = 0; <a name="l01848"></a>01848 <a name="l01849"></a>01849 XSendEvent(p->display, window, False, 0, &e); <a name="l01850"></a>01850 } <a name="l01851"></a>01851 <a name="l01852"></a>01852 <span class="keywordtype">void</span> NETRootInfo3::takeActivity( Window window, Time timestamp, <span class="keywordtype">long</span> flags ) <a name="l01853"></a>01853 { <a name="l01854"></a>01854 <span class="keywordflow">if</span> (role != WindowManager) <span class="keywordflow">return</span>; <a name="l01855"></a>01855 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l01856"></a>01856 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo2::takeActivity: window 0x%lx, timestamp %lu, flags 0x%lx\n"</span>, <a name="l01857"></a>01857 window, timestamp, flags ); <a name="l01858"></a>01858 <span class="preprocessor">#endif</span> <a name="l01859"></a>01859 <span class="preprocessor"></span> XEvent e; <a name="l01860"></a>01860 e.xclient.type = ClientMessage; <a name="l01861"></a>01861 e.xclient.message_type = wm_protocols; <a name="l01862"></a>01862 e.xclient.display = p->display; <a name="l01863"></a>01863 e.xclient.window = window, <a name="l01864"></a>01864 e.xclient.format = 32; <a name="l01865"></a>01865 e.xclient.data.l[0] = net_wm_take_activity; <a name="l01866"></a>01866 e.xclient.data.l[1] = timestamp; <a name="l01867"></a>01867 e.xclient.data.l[2] = window; <a name="l01868"></a>01868 e.xclient.data.l[3] = flags; <a name="l01869"></a>01869 e.xclient.data.l[4] = 0; <a name="l01870"></a>01870 <a name="l01871"></a>01871 XSendEvent(p->display, window, False, 0, &e); <a name="l01872"></a>01872 } <a name="l01873"></a>01873 <a name="l01874"></a>01874 <a name="l01875"></a>01875 <a name="l01876"></a>01876 <span class="comment">// assignment operator</span> <a name="l01877"></a>01877 <a name="l01878"></a>01878 <span class="keyword">const</span> NETRootInfo &NETRootInfo::operator=(<span class="keyword">const</span> NETRootInfo &rootinfo) { <a name="l01879"></a>01879 <a name="l01880"></a>01880 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l01881"></a>01881 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::operator=()\n"</span>); <a name="l01882"></a>01882 <span class="preprocessor">#endif</span> <a name="l01883"></a>01883 <span class="preprocessor"></span> <a name="l01884"></a>01884 <span class="keywordflow">if</span> (p != rootinfo.p) { <a name="l01885"></a>01885 refdec_nri(p); <a name="l01886"></a>01886 <a name="l01887"></a>01887 <span class="keywordflow">if</span> (! p->ref) <span class="keyword">delete</span> p; <a name="l01888"></a>01888 } <a name="l01889"></a>01889 <a name="l01890"></a>01890 p = rootinfo.p; <a name="l01891"></a>01891 role = rootinfo.role; <a name="l01892"></a>01892 p->ref++; <a name="l01893"></a>01893 <a name="l01894"></a>01894 <span class="keywordflow">return</span> *<span class="keyword">this</span>; <a name="l01895"></a>01895 } <a name="l01896"></a>01896 <a name="l01897"></a>01897 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> NETRootInfo::event(XEvent *ev ) <a name="l01898"></a>01898 { <a name="l01899"></a>01899 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> props[ 1 ]; <a name="l01900"></a>01900 <a class="code" href="namespaceKNotifyClient.html#a4057f79811e557201f9dc297541be589">event</a>( ev, props, 1 ); <a name="l01901"></a>01901 <span class="keywordflow">return</span> props[ 0 ]; <a name="l01902"></a>01902 } <a name="l01903"></a>01903 <a name="l01904"></a>01904 <span class="keywordtype">void</span> NETRootInfo::event(XEvent *event, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>* properties, <span class="keywordtype">int</span> properties_size ) <a name="l01905"></a>01905 { <a name="l01906"></a>01906 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> props[ PROPERTIES_SIZE ] = { 0, 0, 0, 0, 0 }; <a name="l01907"></a>01907 assert( PROPERTIES_SIZE == 5 ); <span class="comment">// add elements above</span> <a name="l01908"></a>01908 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>& dirty = props[ PROTOCOLS ]; <a name="l01909"></a>01909 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>& dirty2 = props[ PROTOCOLS2 ]; <a name="l01910"></a>01910 <span class="keywordtype">bool</span> do_update = <span class="keyword">false</span>; <a name="l01911"></a>01911 <a name="l01912"></a>01912 <span class="comment">// the window manager will be interested in client messages... no other</span> <a name="l01913"></a>01913 <span class="comment">// client should get these messages</span> <a name="l01914"></a>01914 <span class="keywordflow">if</span> (role == WindowManager && event->type == ClientMessage && <a name="l01915"></a>01915 event->xclient.format == 32) { <a name="l01916"></a>01916 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l01917"></a>01917 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::event: handling ClientMessage event\n"</span>); <a name="l01918"></a>01918 <span class="preprocessor">#endif</span> <a name="l01919"></a>01919 <span class="preprocessor"></span> <a name="l01920"></a>01920 <span class="keywordflow">if</span> (event->xclient.message_type == net_number_of_desktops) { <a name="l01921"></a>01921 dirty = NumberOfDesktops; <a name="l01922"></a>01922 <a name="l01923"></a>01923 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l01924"></a>01924 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::event: changeNumberOfDesktops(%ld)\n"</span>, <a name="l01925"></a>01925 event->xclient.data.l[0]); <a name="l01926"></a>01926 <span class="preprocessor">#endif</span> <a name="l01927"></a>01927 <span class="preprocessor"></span> <a name="l01928"></a>01928 changeNumberOfDesktops(event->xclient.data.l[0]); <a name="l01929"></a>01929 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (event->xclient.message_type == net_desktop_geometry) { <a name="l01930"></a>01930 dirty = DesktopGeometry; <a name="l01931"></a>01931 <a name="l01932"></a>01932 <a class="code" href="structNETSize.html" title="Simple size class for NET classes.">NETSize</a> sz; <a name="l01933"></a>01933 sz.<a class="code" href="structNETSize.html#af2e6a5fcac88037fa745273e85c5e219" title="Width.">width</a> = <span class="keyword">event</span>->xclient.data.l[0]; <a name="l01934"></a>01934 sz.<a class="code" href="structNETSize.html#a0a6def5683983f7f3478192248ef2f8e" title="Height.">height</a> = <span class="keyword">event</span>->xclient.data.l[1]; <a name="l01935"></a>01935 <a name="l01936"></a>01936 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l01937"></a>01937 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::event: changeDesktopGeometry( -- , { %d, %d })\n"</span>, <a name="l01938"></a>01938 sz.<a class="code" href="structNETSize.html#af2e6a5fcac88037fa745273e85c5e219" title="Width.">width</a>, sz.<a class="code" href="structNETSize.html#a0a6def5683983f7f3478192248ef2f8e" title="Height.">height</a>); <a name="l01939"></a>01939 <span class="preprocessor">#endif</span> <a name="l01940"></a>01940 <span class="preprocessor"></span> <a name="l01941"></a>01941 changeDesktopGeometry(~0, sz); <a name="l01942"></a>01942 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (event->xclient.message_type == net_desktop_viewport) { <a name="l01943"></a>01943 dirty = DesktopViewport; <a name="l01944"></a>01944 <a name="l01945"></a>01945 <a class="code" href="structNETPoint.html" title="Simple point class for NET classes.">NETPoint</a> pt; <a name="l01946"></a>01946 pt.<a class="code" href="structNETPoint.html#a662b6d948b949dabcaf2e955a078e63f" title="x coordinate.">x</a> = <span class="keyword">event</span>->xclient.data.l[0]; <a name="l01947"></a>01947 pt.<a class="code" href="structNETPoint.html#ac64b3831f6fd7f1874f7e344beb117bd" title="y coordinate">y</a> = <span class="keyword">event</span>->xclient.data.l[1]; <a name="l01948"></a>01948 <a name="l01949"></a>01949 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l01950"></a>01950 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::event: changeDesktopViewport(%d, { %d, %d })\n"</span>, <a name="l01951"></a>01951 p->current_desktop, pt.<a class="code" href="structNETPoint.html#a662b6d948b949dabcaf2e955a078e63f" title="x coordinate.">x</a>, pt.<a class="code" href="structNETPoint.html#ac64b3831f6fd7f1874f7e344beb117bd" title="y coordinate">y</a>); <a name="l01952"></a>01952 <span class="preprocessor">#endif</span> <a name="l01953"></a>01953 <span class="preprocessor"></span> <a name="l01954"></a>01954 changeDesktopViewport(p->current_desktop, pt); <a name="l01955"></a>01955 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (event->xclient.message_type == net_current_desktop) { <a name="l01956"></a>01956 dirty = CurrentDesktop; <a name="l01957"></a>01957 <a name="l01958"></a>01958 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l01959"></a>01959 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::event: changeCurrentDesktop(%ld)\n"</span>, <a name="l01960"></a>01960 event->xclient.data.l[0] + 1); <a name="l01961"></a>01961 <span class="preprocessor">#endif</span> <a name="l01962"></a>01962 <span class="preprocessor"></span> <a name="l01963"></a>01963 changeCurrentDesktop(event->xclient.data.l[0] + 1); <a name="l01964"></a>01964 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (event->xclient.message_type == net_active_window) { <a name="l01965"></a>01965 dirty = ActiveWindow; <a name="l01966"></a>01966 <a name="l01967"></a>01967 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l01968"></a>01968 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::event: changeActiveWindow(0x%lx)\n"</span>, <a name="l01969"></a>01969 event->xclient.window); <a name="l01970"></a>01970 <span class="preprocessor">#endif</span> <a name="l01971"></a>01971 <span class="preprocessor"></span> <a name="l01972"></a>01972 changeActiveWindow(event->xclient.window); <a name="l01973"></a>01973 <span class="keywordflow">if</span>( NETRootInfo2* this2 = dynamic_cast< NETRootInfo2* >( <span class="keyword">this</span> )) <a name="l01974"></a>01974 { <a name="l01975"></a>01975 RequestSource src = FromUnknown; <a name="l01976"></a>01976 Time timestamp = CurrentTime; <a name="l01977"></a>01977 Window active_window = None; <a name="l01978"></a>01978 <span class="comment">// make sure there aren't unknown values</span> <a name="l01979"></a>01979 <span class="keywordflow">if</span>( event->xclient.data.l[0] >= FromUnknown <a name="l01980"></a>01980 && event->xclient.data.l[0] <= FromTool ) <a name="l01981"></a>01981 { <a name="l01982"></a>01982 src = <span class="keyword">static_cast<</span> RequestSource <span class="keyword">></span>( <span class="keyword">event</span>->xclient.data.l[0] ); <a name="l01983"></a>01983 timestamp = <span class="keyword">event</span>->xclient.data.l[1]; <a name="l01984"></a>01984 active_window = <span class="keyword">event</span>->xclient.data.l[2]; <a name="l01985"></a>01985 } <a name="l01986"></a>01986 this2->changeActiveWindow( event->xclient.window, src, timestamp, active_window ); <a name="l01987"></a>01987 } <a name="l01988"></a>01988 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (event->xclient.message_type == net_wm_moveresize) { <a name="l01989"></a>01989 <a name="l01990"></a>01990 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l01991"></a>01991 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::event: moveResize(%ld, %ld, %ld, %ld)\n"</span>, <a name="l01992"></a>01992 event->xclient.window, <a name="l01993"></a>01993 event->xclient.data.l[0], <a name="l01994"></a>01994 event->xclient.data.l[1], <a name="l01995"></a>01995 event->xclient.data.l[2] <a name="l01996"></a>01996 ); <a name="l01997"></a>01997 <span class="preprocessor">#endif</span> <a name="l01998"></a>01998 <span class="preprocessor"></span> <a name="l01999"></a>01999 moveResize(event->xclient.window, <a name="l02000"></a>02000 event->xclient.data.l[0], <a name="l02001"></a>02001 event->xclient.data.l[1], <a name="l02002"></a>02002 event->xclient.data.l[2]); <a name="l02003"></a>02003 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (event->xclient.message_type == net_moveresize_window) { <a name="l02004"></a>02004 <a name="l02005"></a>02005 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l02006"></a>02006 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::event: moveResizeWindow(%ld, %ld, %ld, %ld, %ld, %ld)\n"</span>, <a name="l02007"></a>02007 event->xclient.window, <a name="l02008"></a>02008 event->xclient.data.l[0], <a name="l02009"></a>02009 event->xclient.data.l[1], <a name="l02010"></a>02010 event->xclient.data.l[2], <a name="l02011"></a>02011 event->xclient.data.l[3], <a name="l02012"></a>02012 event->xclient.data.l[4] <a name="l02013"></a>02013 ); <a name="l02014"></a>02014 <span class="preprocessor">#endif</span> <a name="l02015"></a>02015 <span class="preprocessor"></span> <a name="l02016"></a>02016 <span class="keywordflow">if</span>( NETRootInfo2* this2 = dynamic_cast< NETRootInfo2* >( <span class="keyword">this</span> )) <a name="l02017"></a>02017 this2->moveResizeWindow(event->xclient.window, <a name="l02018"></a>02018 event->xclient.data.l[0], <a name="l02019"></a>02019 event->xclient.data.l[1], <a name="l02020"></a>02020 event->xclient.data.l[2], <a name="l02021"></a>02021 event->xclient.data.l[3], <a name="l02022"></a>02022 event->xclient.data.l[4]); <a name="l02023"></a>02023 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (event->xclient.message_type == net_close_window) { <a name="l02024"></a>02024 <a name="l02025"></a>02025 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l02026"></a>02026 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::event: closeWindow(0x%lx)\n"</span>, <a name="l02027"></a>02027 event->xclient.window); <a name="l02028"></a>02028 <span class="preprocessor">#endif</span> <a name="l02029"></a>02029 <span class="preprocessor"></span> <a name="l02030"></a>02030 closeWindow(event->xclient.window); <a name="l02031"></a>02031 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (event->xclient.message_type == net_restack_window) { <a name="l02032"></a>02032 <a name="l02033"></a>02033 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l02034"></a>02034 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::event: restackWindow(0x%lx)\n"</span>, <a name="l02035"></a>02035 event->xclient.window); <a name="l02036"></a>02036 <span class="preprocessor">#endif</span> <a name="l02037"></a>02037 <span class="preprocessor"></span> <a name="l02038"></a>02038 <span class="keywordflow">if</span>( NETRootInfo3* this3 = dynamic_cast< NETRootInfo3* >( <span class="keyword">this</span> )) <a name="l02039"></a>02039 { <a name="l02040"></a>02040 RequestSource src = FromUnknown; <a name="l02041"></a>02041 Time timestamp = CurrentTime; <a name="l02042"></a>02042 <span class="comment">// make sure there aren't unknown values</span> <a name="l02043"></a>02043 <span class="keywordflow">if</span>( event->xclient.data.l[0] >= FromUnknown <a name="l02044"></a>02044 && event->xclient.data.l[0] <= FromTool ) <a name="l02045"></a>02045 { <a name="l02046"></a>02046 src = <span class="keyword">static_cast<</span> RequestSource <span class="keyword">></span>( <span class="keyword">event</span>->xclient.data.l[0] ); <a name="l02047"></a>02047 timestamp = <span class="keyword">event</span>->xclient.data.l[3]; <a name="l02048"></a>02048 } <a name="l02049"></a>02049 this3->restackWindow(event->xclient.window, src, <a name="l02050"></a>02050 event->xclient.data.l[1], event->xclient.data.l[2], timestamp); <a name="l02051"></a>02051 } <a name="l02052"></a>02052 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( NETRootInfo2* this2 = dynamic_cast< NETRootInfo2* >( <span class="keyword">this</span> )) <a name="l02053"></a>02053 this2->restackWindow(event->xclient.window, <a name="l02054"></a>02054 event->xclient.data.l[1], event->xclient.data.l[2]); <a name="l02055"></a>02055 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (event->xclient.message_type == wm_protocols <a name="l02056"></a>02056 && (Atom)event->xclient.data.l[ 0 ] == net_wm_ping) { <a name="l02057"></a>02057 dirty = WMPing; <a name="l02058"></a>02058 <a name="l02059"></a>02059 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l02060"></a>02060 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo2::event: gotPing(0x%lx,%lu)\n"</span>, <a name="l02061"></a>02061 event->xclient.window, event->xclient.data.l[1]); <a name="l02062"></a>02062 <span class="preprocessor">#endif</span> <a name="l02063"></a>02063 <span class="preprocessor"></span> <span class="keywordflow">if</span>( NETRootInfo2* this2 = dynamic_cast< NETRootInfo2* >( <span class="keyword">this</span> )) <a name="l02064"></a>02064 this2->gotPing( event->xclient.data.l[2], event->xclient.data.l[1]); <a name="l02065"></a>02065 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (event->xclient.message_type == wm_protocols <a name="l02066"></a>02066 && (Atom)event->xclient.data.l[ 0 ] == net_wm_take_activity) { <a name="l02067"></a>02067 dirty2 = WM2TakeActivity; <a name="l02068"></a>02068 <a name="l02069"></a>02069 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l02070"></a>02070 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo2::event: gotTakeActivity(0x%lx,%lu,0x%lx)\n"</span>, <a name="l02071"></a>02071 event->xclient.window, event->xclient.data.l[1], event->xclient.data.l[3]); <a name="l02072"></a>02072 <span class="preprocessor">#endif</span> <a name="l02073"></a>02073 <span class="preprocessor"></span> <span class="keywordflow">if</span>( NETRootInfo3* this3 = dynamic_cast< NETRootInfo3* >( <span class="keyword">this</span> )) <a name="l02074"></a>02074 this3->gotTakeActivity( event->xclient.data.l[2], event->xclient.data.l[1], <a name="l02075"></a>02075 event->xclient.data.l[3]); <a name="l02076"></a>02076 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (event->xclient.message_type == net_showing_desktop) { <a name="l02077"></a>02077 dirty2 = WM2ShowingDesktop; <a name="l02078"></a>02078 <a name="l02079"></a>02079 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l02080"></a>02080 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::event: changeShowingDesktop(%ld)\n"</span>, <a name="l02081"></a>02081 event->xclient.data.l[0]); <a name="l02082"></a>02082 <span class="preprocessor">#endif</span> <a name="l02083"></a>02083 <span class="preprocessor"></span> <a name="l02084"></a>02084 <span class="keywordflow">if</span>( NETRootInfo4* this4 = dynamic_cast< NETRootInfo4* >( <span class="keyword">this</span> )) <a name="l02085"></a>02085 this4->changeShowingDesktop(event->xclient.data.l[0]); <a name="l02086"></a>02086 } <a name="l02087"></a>02087 } <a name="l02088"></a>02088 <a name="l02089"></a>02089 <span class="keywordflow">if</span> (event->type == PropertyNotify) { <a name="l02090"></a>02090 <a name="l02091"></a>02091 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l02092"></a>02092 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::event: handling PropertyNotify event\n"</span>); <a name="l02093"></a>02093 <span class="preprocessor">#endif</span> <a name="l02094"></a>02094 <span class="preprocessor"></span> <a name="l02095"></a>02095 XEvent pe = *event; <a name="l02096"></a>02096 <a name="l02097"></a>02097 Bool done = False; <a name="l02098"></a>02098 Bool compaction = False; <a name="l02099"></a>02099 <span class="keywordflow">while</span> (! done) { <a name="l02100"></a>02100 <a name="l02101"></a>02101 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l02102"></a>02102 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::event: loop fire\n"</span>); <a name="l02103"></a>02103 <span class="preprocessor">#endif</span> <a name="l02104"></a>02104 <span class="preprocessor"></span> <a name="l02105"></a>02105 <span class="keywordflow">if</span> (pe.xproperty.atom == net_client_list) <a name="l02106"></a>02106 dirty |= ClientList; <a name="l02107"></a>02107 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pe.xproperty.atom == net_client_list_stacking) <a name="l02108"></a>02108 dirty |= ClientListStacking; <a name="l02109"></a>02109 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pe.xproperty.atom == kde_net_system_tray_windows) <a name="l02110"></a>02110 dirty |= KDESystemTrayWindows; <a name="l02111"></a>02111 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pe.xproperty.atom == net_desktop_names) <a name="l02112"></a>02112 dirty |= DesktopNames; <a name="l02113"></a>02113 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pe.xproperty.atom == net_workarea) <a name="l02114"></a>02114 dirty |= WorkArea; <a name="l02115"></a>02115 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pe.xproperty.atom == net_number_of_desktops) <a name="l02116"></a>02116 dirty |= NumberOfDesktops; <a name="l02117"></a>02117 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pe.xproperty.atom == net_desktop_geometry) <a name="l02118"></a>02118 dirty |= DesktopGeometry; <a name="l02119"></a>02119 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pe.xproperty.atom == net_desktop_viewport) <a name="l02120"></a>02120 dirty |= DesktopViewport; <a name="l02121"></a>02121 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pe.xproperty.atom == net_current_desktop) <a name="l02122"></a>02122 dirty |= CurrentDesktop; <a name="l02123"></a>02123 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pe.xproperty.atom == net_active_window) <a name="l02124"></a>02124 dirty |= ActiveWindow; <a name="l02125"></a>02125 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pe.xproperty.atom == net_showing_desktop) <a name="l02126"></a>02126 dirty2 |= WM2ShowingDesktop; <a name="l02127"></a>02127 <span class="comment">// else if (pe.xproperty.atom == net_supported )</span> <a name="l02128"></a>02128 <span class="comment">// dirty |= Supported; // update here?</span> <a name="l02129"></a>02129 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pe.xproperty.atom == net_supporting_wm_check ) <a name="l02130"></a>02130 dirty |= SupportingWMCheck; <a name="l02131"></a>02131 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pe.xproperty.atom == net_virtual_roots ) <a name="l02132"></a>02132 dirty |= VirtualRoots; <a name="l02133"></a>02133 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pe.xproperty.atom == net_desktop_layout ) <a name="l02134"></a>02134 dirty2 |= WM2DesktopLayout; <a name="l02135"></a>02135 <span class="keywordflow">else</span> { <a name="l02136"></a>02136 <a name="l02137"></a>02137 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l02138"></a>02138 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::event: putting back event and breaking\n"</span>); <a name="l02139"></a>02139 <span class="preprocessor">#endif</span> <a name="l02140"></a>02140 <span class="preprocessor"></span> <a name="l02141"></a>02141 <span class="keywordflow">if</span> ( compaction ) <a name="l02142"></a>02142 XPutBackEvent(p->display, &pe); <a name="l02143"></a>02143 <span class="keywordflow">break</span>; <a name="l02144"></a>02144 } <a name="l02145"></a>02145 <a name="l02146"></a>02146 <span class="keywordflow">if</span> (XCheckTypedWindowEvent(p->display, p->root, PropertyNotify, &pe) ) <a name="l02147"></a>02147 compaction = True; <a name="l02148"></a>02148 <span class="keywordflow">else</span> <a name="l02149"></a>02149 <span class="keywordflow">break</span>; <a name="l02150"></a>02150 } <a name="l02151"></a>02151 <a name="l02152"></a>02152 do_update = <span class="keyword">true</span>; <a name="l02153"></a>02153 } <a name="l02154"></a>02154 <a name="l02155"></a>02155 <span class="keywordflow">if</span>( do_update ) <a name="l02156"></a>02156 update( props ); <a name="l02157"></a>02157 <a name="l02158"></a>02158 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l02159"></a>02159 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::event: handled events, returning dirty = 0x%lx, 0x%lx\n"</span>, <a name="l02160"></a>02160 dirty, dirty2); <a name="l02161"></a>02161 <span class="preprocessor">#endif</span> <a name="l02162"></a>02162 <span class="preprocessor"></span> <a name="l02163"></a>02163 <span class="keywordflow">if</span>( properties_size > PROPERTIES_SIZE ) <a name="l02164"></a>02164 properties_size = PROPERTIES_SIZE; <a name="l02165"></a>02165 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = 0; <a name="l02166"></a>02166 i < properties_size; <a name="l02167"></a>02167 ++i ) <a name="l02168"></a>02168 properties[ i ] = props[ i ]; <a name="l02169"></a>02169 } <a name="l02170"></a>02170 <a name="l02171"></a>02171 <a name="l02172"></a>02172 <span class="comment">// private functions to update the data we keep</span> <a name="l02173"></a>02173 <a name="l02174"></a>02174 <span class="keywordtype">void</span> NETRootInfo::update( <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> dirty_props[] ) <a name="l02175"></a>02175 { <a name="l02176"></a>02176 Atom type_ret; <a name="l02177"></a>02177 <span class="keywordtype">int</span> format_ret; <a name="l02178"></a>02178 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *data_ret; <a name="l02179"></a>02179 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> nitems_ret, unused; <a name="l02180"></a>02180 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> props[ PROPERTIES_SIZE ]; <a name="l02181"></a>02181 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = 0; <a name="l02182"></a>02182 i < PROPERTIES_SIZE; <a name="l02183"></a>02183 ++i ) <a name="l02184"></a>02184 props[ i ] = dirty_props[ i ] & p->client_properties[ i ]; <a name="l02185"></a>02185 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>& dirty = props[ PROTOCOLS ]; <a name="l02186"></a>02186 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>& dirty2 = props[ PROTOCOLS2 ]; <a name="l02187"></a>02187 <a name="l02188"></a>02188 if (dirty & Supported ) { <a name="l02189"></a>02189 <span class="comment">// only in Client mode</span> <a name="l02190"></a>02190 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = 0; i < PROPERTIES_SIZE; ++i ) <a name="l02191"></a>02191 p->properties[ i ] = 0; <a name="l02192"></a>02192 <span class="keywordflow">if</span>( XGetWindowProperty(p->display, p->root, net_supported, <a name="l02193"></a>02193 0l, MAX_PROP_SIZE, False, XA_ATOM, &type_ret, <a name="l02194"></a>02194 &format_ret, &nitems_ret, &unused, &data_ret) <a name="l02195"></a>02195 == Success ) { <a name="l02196"></a>02196 <span class="keywordflow">if</span>( type_ret == XA_ATOM && format_ret == 32 ) { <a name="l02197"></a>02197 Atom* atoms = (Atom*) data_ret; <a name="l02198"></a>02198 <span class="keywordflow">for</span>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; <a name="l02199"></a>02199 i < nitems_ret; <a name="l02200"></a>02200 ++i ) <a name="l02201"></a>02201 updateSupportedProperties( atoms[ i ] ); <a name="l02202"></a>02202 } <a name="l02203"></a>02203 <span class="keywordflow">if</span> ( data_ret ) <a name="l02204"></a>02204 XFree(data_ret); <a name="l02205"></a>02205 } <a name="l02206"></a>02206 } <a name="l02207"></a>02207 <a name="l02208"></a>02208 <span class="keywordflow">if</span> (dirty & ClientList) { <a name="l02209"></a>02209 <span class="keywordtype">bool</span> read_ok = <span class="keyword">false</span>; <a name="l02210"></a>02210 <span class="keywordflow">if</span> (XGetWindowProperty(p->display, p->root, net_client_list, <a name="l02211"></a>02211 0l, MAX_PROP_SIZE, False, XA_WINDOW, &type_ret, <a name="l02212"></a>02212 &format_ret, &nitems_ret, &unused, &data_ret) <a name="l02213"></a>02213 == Success) { <a name="l02214"></a>02214 <span class="keywordflow">if</span> (type_ret == XA_WINDOW && format_ret == 32) { <a name="l02215"></a>02215 Window *wins = (Window *) data_ret; <a name="l02216"></a>02216 <a name="l02217"></a>02217 qsort(wins, nitems_ret, <span class="keyword">sizeof</span>(Window), wcmp); <a name="l02218"></a>02218 <a name="l02219"></a>02219 <span class="keywordflow">if</span> (p->clients) { <a name="l02220"></a>02220 <span class="keywordflow">if</span> (role == Client) { <a name="l02221"></a>02221 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> new_index = 0, old_index = 0; <a name="l02222"></a>02222 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> new_count = nitems_ret, <a name="l02223"></a>02223 old_count = p->clients_count; <a name="l02224"></a>02224 <a name="l02225"></a>02225 <span class="keywordflow">while</span> (old_index < old_count || new_index < new_count) { <a name="l02226"></a>02226 <span class="keywordflow">if</span> (old_index == old_count) { <a name="l02227"></a>02227 addClient(wins[new_index++]); <a name="l02228"></a>02228 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (new_index == new_count) { <a name="l02229"></a>02229 removeClient(p->clients[old_index++]); <a name="l02230"></a>02230 } <span class="keywordflow">else</span> { <a name="l02231"></a>02231 <span class="keywordflow">if</span> (p->clients[old_index] < <a name="l02232"></a>02232 wins[new_index]) { <a name="l02233"></a>02233 removeClient(p->clients[old_index++]); <a name="l02234"></a>02234 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (wins[new_index] < <a name="l02235"></a>02235 p->clients[old_index]) { <a name="l02236"></a>02236 addClient(wins[new_index++]); <a name="l02237"></a>02237 } <span class="keywordflow">else</span> { <a name="l02238"></a>02238 new_index++; <a name="l02239"></a>02239 old_index++; <a name="l02240"></a>02240 } <a name="l02241"></a>02241 } <a name="l02242"></a>02242 } <a name="l02243"></a>02243 } <a name="l02244"></a>02244 <a name="l02245"></a>02245 <span class="keyword">delete</span> [] p->clients; <a name="l02246"></a>02246 } <span class="keywordflow">else</span> { <a name="l02247"></a>02247 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l02248"></a>02248 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::update: client list null, creating\n"</span>); <a name="l02249"></a>02249 <span class="preprocessor">#endif</span> <a name="l02250"></a>02250 <span class="preprocessor"></span> <a name="l02251"></a>02251 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> n; <a name="l02252"></a>02252 <span class="keywordflow">for</span> (n = 0; n < nitems_ret; n++) { <a name="l02253"></a>02253 addClient(wins[n]); <a name="l02254"></a>02254 } <a name="l02255"></a>02255 } <a name="l02256"></a>02256 <a name="l02257"></a>02257 p->clients_count = nitems_ret; <a name="l02258"></a>02258 p->clients = nwindup(wins, p->clients_count); <a name="l02259"></a>02259 read_ok = <span class="keyword">true</span>; <a name="l02260"></a>02260 } <a name="l02261"></a>02261 <a name="l02262"></a>02262 <span class="keywordflow">if</span> ( data_ret ) <a name="l02263"></a>02263 XFree(data_ret); <a name="l02264"></a>02264 } <a name="l02265"></a>02265 <span class="keywordflow">if</span>( !read_ok ) { <a name="l02266"></a>02266 <span class="keywordflow">for</span>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i < p->clients_count; ++ i ) <a name="l02267"></a>02267 removeClient(p->clients[i]); <a name="l02268"></a>02268 p->clients_count = 0; <a name="l02269"></a>02269 <span class="keyword">delete</span>[] p->clients; <a name="l02270"></a>02270 p->clients = NULL; <a name="l02271"></a>02271 } <a name="l02272"></a>02272 <a name="l02273"></a>02273 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l02274"></a>02274 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::update: client list updated (%ld clients)\n"</span>, <a name="l02275"></a>02275 p->clients_count); <a name="l02276"></a>02276 <span class="preprocessor">#endif</span> <a name="l02277"></a>02277 <span class="preprocessor"></span> } <a name="l02278"></a>02278 <a name="l02279"></a>02279 <span class="keywordflow">if</span> (dirty & KDESystemTrayWindows) { <a name="l02280"></a>02280 <span class="keywordtype">bool</span> read_ok = <span class="keyword">false</span>; <a name="l02281"></a>02281 <span class="keywordflow">if</span> (XGetWindowProperty(p->display, p->root, kde_net_system_tray_windows, <a name="l02282"></a>02282 0l, MAX_PROP_SIZE, False, XA_WINDOW, &type_ret, <a name="l02283"></a>02283 &format_ret, &nitems_ret, &unused, &data_ret) <a name="l02284"></a>02284 == Success) { <a name="l02285"></a>02285 <span class="keywordflow">if</span> (type_ret == XA_WINDOW && format_ret == 32) { <a name="l02286"></a>02286 Window *wins = (Window *) data_ret; <a name="l02287"></a>02287 <a name="l02288"></a>02288 qsort(wins, nitems_ret, <span class="keyword">sizeof</span>(Window), wcmp); <a name="l02289"></a>02289 <a name="l02290"></a>02290 <span class="keywordflow">if</span> (p->kde_system_tray_windows) { <a name="l02291"></a>02291 <span class="keywordflow">if</span> (role == Client) { <a name="l02292"></a>02292 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> new_index = 0, new_count = nitems_ret; <a name="l02293"></a>02293 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> old_index = 0, <a name="l02294"></a>02294 old_count = p->kde_system_tray_windows_count; <a name="l02295"></a>02295 <a name="l02296"></a>02296 <span class="keywordflow">while</span>(old_index < old_count || new_index < new_count) { <a name="l02297"></a>02297 <span class="keywordflow">if</span> (old_index == old_count) { <a name="l02298"></a>02298 addSystemTrayWin(wins[new_index++]); <a name="l02299"></a>02299 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (new_index == new_count) { <a name="l02300"></a>02300 removeSystemTrayWin(p->kde_system_tray_windows[old_index++]); <a name="l02301"></a>02301 } <span class="keywordflow">else</span> { <a name="l02302"></a>02302 <span class="keywordflow">if</span> (p->kde_system_tray_windows[old_index] < <a name="l02303"></a>02303 wins[new_index]) { <a name="l02304"></a>02304 removeSystemTrayWin(p->kde_system_tray_windows[old_index++]); <a name="l02305"></a>02305 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (wins[new_index] < <a name="l02306"></a>02306 p->kde_system_tray_windows[old_index]) { <a name="l02307"></a>02307 addSystemTrayWin(wins[new_index++]); <a name="l02308"></a>02308 } <span class="keywordflow">else</span> { <a name="l02309"></a>02309 new_index++; <a name="l02310"></a>02310 old_index++; <a name="l02311"></a>02311 } <a name="l02312"></a>02312 } <a name="l02313"></a>02313 } <a name="l02314"></a>02314 } <a name="l02315"></a>02315 <a name="l02316"></a>02316 } <span class="keywordflow">else</span> { <a name="l02317"></a>02317 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> n; <a name="l02318"></a>02318 <span class="keywordflow">for</span> (n = 0; n < nitems_ret; n++) { <a name="l02319"></a>02319 addSystemTrayWin(wins[n]); <a name="l02320"></a>02320 } <a name="l02321"></a>02321 } <a name="l02322"></a>02322 <a name="l02323"></a>02323 p->kde_system_tray_windows_count = nitems_ret; <a name="l02324"></a>02324 <span class="keyword">delete</span> [] p->kde_system_tray_windows; <a name="l02325"></a>02325 p->kde_system_tray_windows = <a name="l02326"></a>02326 nwindup(wins, p->kde_system_tray_windows_count); <a name="l02327"></a>02327 read_ok = <span class="keyword">true</span>; <a name="l02328"></a>02328 } <a name="l02329"></a>02329 <a name="l02330"></a>02330 <span class="keywordflow">if</span> ( data_ret ) <a name="l02331"></a>02331 XFree(data_ret); <a name="l02332"></a>02332 } <a name="l02333"></a>02333 <span class="keywordflow">if</span>( !read_ok ) { <a name="l02334"></a>02334 <span class="keywordflow">for</span>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i < p->kde_system_tray_windows_count; ++i ) <a name="l02335"></a>02335 removeSystemTrayWin(p->kde_system_tray_windows[i]); <a name="l02336"></a>02336 p->kde_system_tray_windows_count = 0; <a name="l02337"></a>02337 <span class="keyword">delete</span> [] p->kde_system_tray_windows; <a name="l02338"></a>02338 p->kde_system_tray_windows = NULL; <a name="l02339"></a>02339 } <a name="l02340"></a>02340 } <a name="l02341"></a>02341 <a name="l02342"></a>02342 <span class="keywordflow">if</span> (dirty & ClientListStacking) { <a name="l02343"></a>02343 p->stacking_count = 0; <a name="l02344"></a>02344 <span class="keyword">delete</span>[] p->stacking; <a name="l02345"></a>02345 p->stacking = NULL; <a name="l02346"></a>02346 <span class="keywordflow">if</span> (XGetWindowProperty(p->display, p->root, net_client_list_stacking, <a name="l02347"></a>02347 0, MAX_PROP_SIZE, False, XA_WINDOW, &type_ret, <a name="l02348"></a>02348 &format_ret, &nitems_ret, &unused, &data_ret) <a name="l02349"></a>02349 == Success) { <a name="l02350"></a>02350 <span class="keywordflow">if</span> (type_ret == XA_WINDOW && format_ret == 32) { <a name="l02351"></a>02351 Window *wins = (Window *) data_ret; <a name="l02352"></a>02352 <a name="l02353"></a>02353 p->stacking_count = nitems_ret; <a name="l02354"></a>02354 p->stacking = nwindup(wins, p->stacking_count); <a name="l02355"></a>02355 } <a name="l02356"></a>02356 <a name="l02357"></a>02357 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l02358"></a>02358 <span class="preprocessor"></span> fprintf(stderr,<span class="stringliteral">"NETRootInfo::update: client stacking updated (%ld clients)\n"</span>, <a name="l02359"></a>02359 p->stacking_count); <a name="l02360"></a>02360 <span class="preprocessor">#endif</span> <a name="l02361"></a>02361 <span class="preprocessor"></span> <a name="l02362"></a>02362 <span class="keywordflow">if</span> ( data_ret ) <a name="l02363"></a>02363 XFree(data_ret); <a name="l02364"></a>02364 } <a name="l02365"></a>02365 } <a name="l02366"></a>02366 <a name="l02367"></a>02367 <span class="keywordflow">if</span> (dirty & NumberOfDesktops) { <a name="l02368"></a>02368 p->number_of_desktops = 0; <a name="l02369"></a>02369 <a name="l02370"></a>02370 <span class="keywordflow">if</span> (XGetWindowProperty(p->display, p->root, net_number_of_desktops, <a name="l02371"></a>02371 0l, 1l, False, XA_CARDINAL, &type_ret, &format_ret, <a name="l02372"></a>02372 &nitems_ret, &unused, &data_ret) <a name="l02373"></a>02373 == Success) { <a name="l02374"></a>02374 <span class="keywordflow">if</span> (type_ret == XA_CARDINAL && format_ret == 32 && nitems_ret == 1) { <a name="l02375"></a>02375 p->number_of_desktops = *((<span class="keywordtype">long</span> *) data_ret); <a name="l02376"></a>02376 } <a name="l02377"></a>02377 <a name="l02378"></a>02378 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l02379"></a>02379 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::update: number of desktops = %d\n"</span>, <a name="l02380"></a>02380 p->number_of_desktops); <a name="l02381"></a>02381 <span class="preprocessor">#endif</span> <a name="l02382"></a>02382 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( data_ret ) <a name="l02383"></a>02383 XFree(data_ret); <a name="l02384"></a>02384 } <a name="l02385"></a>02385 } <a name="l02386"></a>02386 <a name="l02387"></a>02387 <span class="keywordflow">if</span> (dirty & DesktopGeometry) { <a name="l02388"></a>02388 p->geometry = p->rootSize; <a name="l02389"></a>02389 <span class="keywordflow">if</span> (XGetWindowProperty(p->display, p->root, net_desktop_geometry, <a name="l02390"></a>02390 0l, 2l, False, XA_CARDINAL, &type_ret, &format_ret, <a name="l02391"></a>02391 &nitems_ret, &unused, &data_ret) <a name="l02392"></a>02392 == Success) { <a name="l02393"></a>02393 <span class="keywordflow">if</span> (type_ret == XA_CARDINAL && format_ret == 32 && <a name="l02394"></a>02394 nitems_ret == 2) { <a name="l02395"></a>02395 <span class="keywordtype">long</span> *data = (<span class="keywordtype">long</span> *) data_ret; <a name="l02396"></a>02396 <a name="l02397"></a>02397 p->geometry.width = data[0]; <a name="l02398"></a>02398 p->geometry.height = data[1]; <a name="l02399"></a>02399 <a name="l02400"></a>02400 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l02401"></a>02401 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::update: desktop geometry updated\n"</span>); <a name="l02402"></a>02402 <span class="preprocessor">#endif</span> <a name="l02403"></a>02403 <span class="preprocessor"></span> } <a name="l02404"></a>02404 <span class="keywordflow">if</span> ( data_ret ) <a name="l02405"></a>02405 XFree(data_ret); <a name="l02406"></a>02406 } <a name="l02407"></a>02407 } <a name="l02408"></a>02408 <a name="l02409"></a>02409 <span class="keywordflow">if</span> (dirty & DesktopViewport) { <a name="l02410"></a>02410 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < p->viewport.size(); i++) <a name="l02411"></a>02411 p->viewport[i].x = p->viewport[i].y = 0; <a name="l02412"></a>02412 if (XGetWindowProperty(p->display, p->root, net_desktop_viewport, <a name="l02413"></a>02413 0l, 2l, False, XA_CARDINAL, &type_ret, &format_ret, <a name="l02414"></a>02414 &nitems_ret, &unused, &data_ret) <a name="l02415"></a>02415 == Success) { <a name="l02416"></a>02416 <span class="keywordflow">if</span> (type_ret == XA_CARDINAL && format_ret == 32 && <a name="l02417"></a>02417 nitems_ret == 2) { <a name="l02418"></a>02418 <span class="keywordtype">long</span> *data = (<span class="keywordtype">long</span> *) data_ret; <a name="l02419"></a>02419 <a name="l02420"></a>02420 <span class="keywordtype">int</span> d, i, n; <a name="l02421"></a>02421 n = nitems_ret / 2; <a name="l02422"></a>02422 <span class="keywordflow">for</span> (d = 0, i = 0; d < n; d++) { <a name="l02423"></a>02423 p->viewport[d].x = data[i++]; <a name="l02424"></a>02424 p->viewport[d].y = data[i++]; <a name="l02425"></a>02425 } <a name="l02426"></a>02426 <a name="l02427"></a>02427 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l02428"></a>02428 <span class="preprocessor"></span> fprintf(stderr, <a name="l02429"></a>02429 <span class="stringliteral">"NETRootInfo::update: desktop viewport array updated (%d entries)\n"</span>, <a name="l02430"></a>02430 p->viewport.size()); <a name="l02431"></a>02431 <a name="l02432"></a>02432 <span class="keywordflow">if</span> (nitems_ret % 2 != 0) { <a name="l02433"></a>02433 fprintf(stderr, <a name="l02434"></a>02434 <span class="stringliteral">"NETRootInfo::update(): desktop viewport array "</span> <a name="l02435"></a>02435 <span class="stringliteral">"size not a multiple of 2\n"</span>); <a name="l02436"></a>02436 } <a name="l02437"></a>02437 <span class="preprocessor">#endif</span> <a name="l02438"></a>02438 <span class="preprocessor"></span> } <a name="l02439"></a>02439 <span class="keywordflow">if</span> ( data_ret ) <a name="l02440"></a>02440 XFree(data_ret); <a name="l02441"></a>02441 } <a name="l02442"></a>02442 } <a name="l02443"></a>02443 <a name="l02444"></a>02444 <span class="keywordflow">if</span> (dirty & CurrentDesktop) { <a name="l02445"></a>02445 p->current_desktop = 0; <a name="l02446"></a>02446 <span class="keywordflow">if</span> (XGetWindowProperty(p->display, p->root, net_current_desktop, <a name="l02447"></a>02447 0l, 1l, False, XA_CARDINAL, &type_ret, &format_ret, <a name="l02448"></a>02448 &nitems_ret, &unused, &data_ret) <a name="l02449"></a>02449 == Success) { <a name="l02450"></a>02450 <span class="keywordflow">if</span> (type_ret == XA_CARDINAL && format_ret == 32 && nitems_ret == 1) { <a name="l02451"></a>02451 p->current_desktop = *((<span class="keywordtype">long</span> *) data_ret) + 1; <a name="l02452"></a>02452 } <a name="l02453"></a>02453 <a name="l02454"></a>02454 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l02455"></a>02455 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::update: current desktop = %d\n"</span>, <a name="l02456"></a>02456 p->current_desktop); <a name="l02457"></a>02457 <span class="preprocessor">#endif</span> <a name="l02458"></a>02458 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( data_ret ) <a name="l02459"></a>02459 XFree(data_ret); <a name="l02460"></a>02460 } <a name="l02461"></a>02461 } <a name="l02462"></a>02462 <a name="l02463"></a>02463 <span class="keywordflow">if</span> (dirty & DesktopNames) { <a name="l02464"></a>02464 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = 0; i < p->desktop_names.size(); ++i ) <a name="l02465"></a>02465 <span class="keyword">delete</span>[] p->desktop_names[ i ]; <a name="l02466"></a>02466 p->desktop_names.reset(); <a name="l02467"></a>02467 <span class="keywordflow">if</span> (XGetWindowProperty(p->display, p->root, net_desktop_names, <a name="l02468"></a>02468 0l, MAX_PROP_SIZE, False, UTF8_STRING, &type_ret, <a name="l02469"></a>02469 &format_ret, &nitems_ret, &unused, &data_ret) <a name="l02470"></a>02470 == Success) { <a name="l02471"></a>02471 <span class="keywordflow">if</span> (type_ret == UTF8_STRING && format_ret == 8) { <a name="l02472"></a>02472 <span class="keyword">const</span> <span class="keywordtype">char</span> *d = (<span class="keyword">const</span> <span class="keywordtype">char</span> *) data_ret; <a name="l02473"></a>02473 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> s, n, index; <a name="l02474"></a>02474 <a name="l02475"></a>02475 <span class="keywordflow">for</span> (s = 0, n = 0, index = 0; n < nitems_ret; n++) { <a name="l02476"></a>02476 <span class="keywordflow">if</span> (d[n] == <span class="charliteral">'\0'</span>) { <a name="l02477"></a>02477 <span class="keyword">delete</span> [] p->desktop_names[index]; <a name="l02478"></a>02478 p->desktop_names[index++] = nstrndup((d + s), n - s + 1); <a name="l02479"></a>02479 s = n + 1; <a name="l02480"></a>02480 } <a name="l02481"></a>02481 } <a name="l02482"></a>02482 } <a name="l02483"></a>02483 <a name="l02484"></a>02484 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l02485"></a>02485 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::update: desktop names array updated (%d entries)\n"</span>, <a name="l02486"></a>02486 p->desktop_names.size()); <a name="l02487"></a>02487 <span class="preprocessor">#endif</span> <a name="l02488"></a>02488 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( data_ret ) <a name="l02489"></a>02489 XFree(data_ret); <a name="l02490"></a>02490 } <a name="l02491"></a>02491 } <a name="l02492"></a>02492 <a name="l02493"></a>02493 <span class="keywordflow">if</span> (dirty & ActiveWindow) { <a name="l02494"></a>02494 p->active = None; <a name="l02495"></a>02495 <span class="keywordflow">if</span> (XGetWindowProperty(p->display, p->root, net_active_window, 0l, 1l, <a name="l02496"></a>02496 False, XA_WINDOW, &type_ret, &format_ret, <a name="l02497"></a>02497 &nitems_ret, &unused, &data_ret) <a name="l02498"></a>02498 == Success) { <a name="l02499"></a>02499 <span class="keywordflow">if</span> (type_ret == XA_WINDOW && format_ret == 32 && nitems_ret == 1) { <a name="l02500"></a>02500 p->active = *((Window *) data_ret); <a name="l02501"></a>02501 } <a name="l02502"></a>02502 <a name="l02503"></a>02503 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l02504"></a>02504 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::update: active window = 0x%lx\n"</span>, <a name="l02505"></a>02505 p->active); <a name="l02506"></a>02506 <span class="preprocessor">#endif</span> <a name="l02507"></a>02507 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( data_ret ) <a name="l02508"></a>02508 XFree(data_ret); <a name="l02509"></a>02509 } <a name="l02510"></a>02510 } <a name="l02511"></a>02511 <a name="l02512"></a>02512 <span class="keywordflow">if</span> (dirty & WorkArea) { <a name="l02513"></a>02513 p->workarea.reset(); <a name="l02514"></a>02514 <span class="keywordflow">if</span> (XGetWindowProperty(p->display, p->root, net_workarea, 0l, <a name="l02515"></a>02515 (p->number_of_desktops * 4), False, XA_CARDINAL, <a name="l02516"></a>02516 &type_ret, &format_ret, &nitems_ret, &unused, <a name="l02517"></a>02517 &data_ret) <a name="l02518"></a>02518 == Success) { <a name="l02519"></a>02519 <span class="keywordflow">if</span> (type_ret == XA_CARDINAL && format_ret == 32 && <a name="l02520"></a>02520 nitems_ret == (<span class="keywordtype">unsigned</span>) (p->number_of_desktops * 4)) { <a name="l02521"></a>02521 <span class="keywordtype">long</span> *d = (<span class="keywordtype">long</span> *) data_ret; <a name="l02522"></a>02522 <span class="keywordtype">int</span> i, j; <a name="l02523"></a>02523 <span class="keywordflow">for</span> (i = 0, j = 0; i < p->number_of_desktops; i++) { <a name="l02524"></a>02524 p->workarea[i].pos.x = d[j++]; <a name="l02525"></a>02525 p->workarea[i].pos.y = d[j++]; <a name="l02526"></a>02526 p->workarea[i].size.width = d[j++]; <a name="l02527"></a>02527 p->workarea[i].size.height = d[j++]; <a name="l02528"></a>02528 } <a name="l02529"></a>02529 } <a name="l02530"></a>02530 <a name="l02531"></a>02531 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l02532"></a>02532 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::update: work area array updated (%d entries)\n"</span>, <a name="l02533"></a>02533 p->workarea.size()); <a name="l02534"></a>02534 <span class="preprocessor">#endif</span> <a name="l02535"></a>02535 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( data_ret ) <a name="l02536"></a>02536 XFree(data_ret); <a name="l02537"></a>02537 } <a name="l02538"></a>02538 } <a name="l02539"></a>02539 <a name="l02540"></a>02540 <a name="l02541"></a>02541 <span class="keywordflow">if</span> (dirty & SupportingWMCheck) { <a name="l02542"></a>02542 p->supportwindow = None; <a name="l02543"></a>02543 <span class="keyword">delete</span>[] p->name; <a name="l02544"></a>02544 p->name = NULL; <a name="l02545"></a>02545 <span class="keywordflow">if</span> (XGetWindowProperty(p->display, p->root, net_supporting_wm_check, <a name="l02546"></a>02546 0l, 1l, False, XA_WINDOW, &type_ret, &format_ret, <a name="l02547"></a>02547 &nitems_ret, &unused, &data_ret) <a name="l02548"></a>02548 == Success) { <a name="l02549"></a>02549 <span class="keywordflow">if</span> (type_ret == XA_WINDOW && format_ret == 32 && nitems_ret == 1) { <a name="l02550"></a>02550 p->supportwindow = *((Window *) data_ret); <a name="l02551"></a>02551 <a name="l02552"></a>02552 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *name_ret; <a name="l02553"></a>02553 <span class="keywordflow">if</span> (XGetWindowProperty(p->display, p->supportwindow, <a name="l02554"></a>02554 net_wm_name, 0l, MAX_PROP_SIZE, False, <a name="l02555"></a>02555 UTF8_STRING, &type_ret, &format_ret, <a name="l02556"></a>02556 &nitems_ret, &unused, &name_ret) <a name="l02557"></a>02557 == Success) { <a name="l02558"></a>02558 <span class="keywordflow">if</span> (type_ret == UTF8_STRING && format_ret == 8) <a name="l02559"></a>02559 p->name = nstrndup((<span class="keyword">const</span> <span class="keywordtype">char</span> *) name_ret, nitems_ret); <a name="l02560"></a>02560 <a name="l02561"></a>02561 <span class="keywordflow">if</span> ( name_ret ) <a name="l02562"></a>02562 XFree(name_ret); <a name="l02563"></a>02563 } <a name="l02564"></a>02564 } <a name="l02565"></a>02565 <a name="l02566"></a>02566 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l02567"></a>02567 <span class="preprocessor"></span> fprintf(stderr, <a name="l02568"></a>02568 <span class="stringliteral">"NETRootInfo::update: supporting window manager = '%s'\n"</span>, <a name="l02569"></a>02569 p->name); <a name="l02570"></a>02570 <span class="preprocessor">#endif</span> <a name="l02571"></a>02571 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( data_ret ) <a name="l02572"></a>02572 XFree(data_ret); <a name="l02573"></a>02573 } <a name="l02574"></a>02574 } <a name="l02575"></a>02575 <a name="l02576"></a>02576 <span class="keywordflow">if</span> (dirty & VirtualRoots) { <a name="l02577"></a>02577 p->virtual_roots_count = 0; <a name="l02578"></a>02578 <span class="keyword">delete</span>[] p->virtual_roots; <a name="l02579"></a>02579 p->virtual_roots = NULL; <a name="l02580"></a>02580 <span class="keywordflow">if</span> (XGetWindowProperty(p->display, p->root, net_virtual_roots, <a name="l02581"></a>02581 0, MAX_PROP_SIZE, False, XA_WINDOW, &type_ret, <a name="l02582"></a>02582 &format_ret, &nitems_ret, &unused, &data_ret) <a name="l02583"></a>02583 == Success) { <a name="l02584"></a>02584 <span class="keywordflow">if</span> (type_ret == XA_WINDOW && format_ret == 32) { <a name="l02585"></a>02585 Window *wins = (Window *) data_ret; <a name="l02586"></a>02586 <a name="l02587"></a>02587 p->virtual_roots_count = nitems_ret; <a name="l02588"></a>02588 p->virtual_roots = nwindup(wins, p->virtual_roots_count); <a name="l02589"></a>02589 } <a name="l02590"></a>02590 <a name="l02591"></a>02591 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l02592"></a>02592 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::updated: virtual roots updated (%ld windows)\n"</span>, <a name="l02593"></a>02593 p->virtual_roots_count); <a name="l02594"></a>02594 <span class="preprocessor">#endif</span> <a name="l02595"></a>02595 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( data_ret ) <a name="l02596"></a>02596 XFree(data_ret); <a name="l02597"></a>02597 } <a name="l02598"></a>02598 } <a name="l02599"></a>02599 <a name="l02600"></a>02600 <span class="keywordflow">if</span> (dirty2 & WM2DesktopLayout) { <a name="l02601"></a>02601 p->desktop_layout_orientation = OrientationHorizontal; <a name="l02602"></a>02602 p->desktop_layout_corner = DesktopLayoutCornerTopLeft; <a name="l02603"></a>02603 p->desktop_layout_columns = p->desktop_layout_rows = 0; <a name="l02604"></a>02604 <span class="keywordflow">if</span> (XGetWindowProperty(p->display, p->root, net_desktop_layout, <a name="l02605"></a>02605 0, MAX_PROP_SIZE, False, XA_CARDINAL, &type_ret, <a name="l02606"></a>02606 &format_ret, &nitems_ret, &unused, &data_ret) <a name="l02607"></a>02607 == Success) { <a name="l02608"></a>02608 <span class="keywordflow">if</span> (type_ret == XA_CARDINAL && format_ret == 32) { <a name="l02609"></a>02609 <span class="keywordtype">long</span>* data = (<span class="keywordtype">long</span>*) data_ret; <a name="l02610"></a>02610 <span class="keywordflow">if</span>( nitems_ret >= 4 && data[ 3 ] >= 0 && data[ 3 ] <= 3 ) <a name="l02611"></a>02611 p->desktop_layout_corner = (<a class="code" href="classNET.html#a3359c32a21f438e0e6564f26179e458f" title="Starting corner for desktop layout.">NET::DesktopLayoutCorner</a>)data[ 3 ]; <a name="l02612"></a>02612 <span class="keywordflow">if</span>( nitems_ret >= 3 ) { <a name="l02613"></a>02613 <span class="keywordflow">if</span>( data[ 0 ] >= 0 && data[ 0 ] <= 1 ) <a name="l02614"></a>02614 p->desktop_layout_orientation = (<a class="code" href="classNET.html#afac5b26cfb4e28ec2f18cd5cc9e1989a" title="Orientation.">NET::Orientation</a>)data[ 0 ]; <a name="l02615"></a>02615 p->desktop_layout_columns = data[ 1 ]; <a name="l02616"></a>02616 p->desktop_layout_rows = data[ 2 ]; <a name="l02617"></a>02617 } <a name="l02618"></a>02618 } <a name="l02619"></a>02619 <a name="l02620"></a>02620 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l02621"></a>02621 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::updated: desktop layout updated (%d %d %d %d)\n"</span>, <a name="l02622"></a>02622 p->desktop_layout_orientation, p->desktop_layout_columns, <a name="l02623"></a>02623 p->desktop_layout_rows, p->desktop_layout_corner ); <a name="l02624"></a>02624 <span class="preprocessor">#endif</span> <a name="l02625"></a>02625 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( data_ret ) <a name="l02626"></a>02626 XFree(data_ret); <a name="l02627"></a>02627 } <a name="l02628"></a>02628 } <a name="l02629"></a>02629 <a name="l02630"></a>02630 <span class="keywordflow">if</span> (dirty2 & WM2ShowingDesktop) { <a name="l02631"></a>02631 p->showing_desktop = <span class="keyword">false</span>; <a name="l02632"></a>02632 <span class="keywordflow">if</span> (XGetWindowProperty(p->display, p->root, net_showing_desktop, <a name="l02633"></a>02633 0, MAX_PROP_SIZE, False, XA_CARDINAL, &type_ret, <a name="l02634"></a>02634 &format_ret, &nitems_ret, &unused, &data_ret) <a name="l02635"></a>02635 == Success) { <a name="l02636"></a>02636 <span class="keywordflow">if</span> (type_ret == XA_CARDINAL && format_ret == 32 && nitems_ret == 1) { <a name="l02637"></a>02637 p->showing_desktop = *((<span class="keywordtype">long</span> *) data_ret); <a name="l02638"></a>02638 } <a name="l02639"></a>02639 <a name="l02640"></a>02640 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l02641"></a>02641 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETRootInfo::update: showing desktop = %d\n"</span>, <a name="l02642"></a>02642 p->showing_desktop); <a name="l02643"></a>02643 <span class="preprocessor">#endif</span> <a name="l02644"></a>02644 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( data_ret ) <a name="l02645"></a>02645 XFree(data_ret); <a name="l02646"></a>02646 } <a name="l02647"></a>02647 } <a name="l02648"></a>02648 } <a name="l02649"></a>02649 <a name="l02650"></a>02650 <a name="l02651"></a>02651 Display *NETRootInfo::x11Display()<span class="keyword"> const </span>{ <a name="l02652"></a>02652 <span class="keywordflow">return</span> p->display; <a name="l02653"></a>02653 } <a name="l02654"></a>02654 <a name="l02655"></a>02655 <a name="l02656"></a>02656 Window NETRootInfo::rootWindow()<span class="keyword"> const </span>{ <a name="l02657"></a>02657 <span class="keywordflow">return</span> p->root; <a name="l02658"></a>02658 } <a name="l02659"></a>02659 <a name="l02660"></a>02660 <a name="l02661"></a>02661 Window NETRootInfo::supportWindow()<span class="keyword"> const </span>{ <a name="l02662"></a>02662 <span class="keywordflow">return</span> p->supportwindow; <a name="l02663"></a>02663 } <a name="l02664"></a>02664 <a name="l02665"></a>02665 <a name="l02666"></a>02666 <span class="keyword">const</span> <span class="keywordtype">char</span> *NETRootInfo::wmName()<span class="keyword"> const </span>{ <a name="l02667"></a>02667 <span class="keywordflow">return</span> p->name; } <a name="l02668"></a>02668 <a name="l02669"></a>02669 <a name="l02670"></a>02670 <span class="keywordtype">int</span> NETRootInfo::screenNumber()<span class="keyword"> const </span>{ <a name="l02671"></a>02671 <span class="keywordflow">return</span> p->screen; <a name="l02672"></a>02672 } <a name="l02673"></a>02673 <a name="l02674"></a>02674 <a name="l02675"></a>02675 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> NETRootInfo::supported()<span class="keyword"> const </span>{ <a name="l02676"></a>02676 <span class="keywordflow">return</span> role == WindowManager <a name="l02677"></a>02677 ? p->properties[ PROTOCOLS ] <a name="l02678"></a>02678 : p->client_properties[ PROTOCOLS ]; <a name="l02679"></a>02679 } <a name="l02680"></a>02680 <a name="l02681"></a>02681 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>* NETRootInfo::supportedProperties()<span class="keyword"> const </span>{ <a name="l02682"></a>02682 <span class="keywordflow">return</span> p->properties; <a name="l02683"></a>02683 } <a name="l02684"></a>02684 <a name="l02685"></a>02685 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>* NETRootInfo::passedProperties()<span class="keyword"> const </span>{ <a name="l02686"></a>02686 <span class="keywordflow">return</span> role == WindowManager <a name="l02687"></a>02687 ? p->properties <a name="l02688"></a>02688 : p->client_properties; <a name="l02689"></a>02689 } <a name="l02690"></a>02690 <a name="l02691"></a>02691 <span class="keywordtype">bool</span> NETRootInfo::isSupported( <a class="code" href="classNET.html#aaea92340c4b9901e05aa7748587dcde5" title="Supported properties.">NET::Property</a> property )<span class="keyword"> const </span>{ <a name="l02692"></a>02692 <span class="keywordflow">return</span> p->properties[ PROTOCOLS ] & property; <a name="l02693"></a>02693 } <a name="l02694"></a>02694 <a name="l02695"></a>02695 <span class="keywordtype">bool</span> NETRootInfo::isSupported( <a class="code" href="classNET.html#a851d15d9aa748b5f76e44b1e2d7c79b0" title="Supported properties.">NET::Property2</a> property )<span class="keyword"> const </span>{ <a name="l02696"></a>02696 <span class="keywordflow">return</span> p->properties[ PROTOCOLS2 ] & property; <a name="l02697"></a>02697 } <a name="l02698"></a>02698 <a name="l02699"></a>02699 <span class="keywordtype">bool</span> NETRootInfo::isSupported( <a class="code" href="classNET.html#a4b3115c0f40e7bc8e38119cc44dd60e0" title="Window type.">NET::WindowType</a> type )<span class="keyword"> const </span>{ <a name="l02700"></a>02700 <span class="keywordflow">return</span> p->properties[ WINDOW_TYPES ] & type; <a name="l02701"></a>02701 } <a name="l02702"></a>02702 <a name="l02703"></a>02703 <span class="keywordtype">bool</span> NETRootInfo::isSupported( <a class="code" href="classNET.html#a08dce7f5ea8a2a6d1d38aea3498f00ee" title="Window state.">NET::State</a> state )<span class="keyword"> const </span>{ <a name="l02704"></a>02704 <span class="keywordflow">return</span> p->properties[ STATES ] & state; <a name="l02705"></a>02705 } <a name="l02706"></a>02706 <a name="l02707"></a>02707 <span class="keywordtype">bool</span> NETRootInfo::isSupported( <a class="code" href="classNET.html#afa9281c19ea7e280327b01b2c6236928" title="Actions that can be done with a window (_NET_WM_ALLOWED_ACTIONS).">NET::Action</a> action )<span class="keyword"> const </span>{ <a name="l02708"></a>02708 <span class="keywordflow">return</span> p->properties[ ACTIONS ] & action; <a name="l02709"></a>02709 } <a name="l02710"></a>02710 <a name="l02711"></a>02711 <span class="keyword">const</span> Window *NETRootInfo::clientList()<span class="keyword"> const </span>{ <a name="l02712"></a>02712 <span class="keywordflow">return</span> p->clients; <a name="l02713"></a>02713 } <a name="l02714"></a>02714 <a name="l02715"></a>02715 <a name="l02716"></a>02716 <span class="keywordtype">int</span> NETRootInfo::clientListCount()<span class="keyword"> const </span>{ <a name="l02717"></a>02717 <span class="keywordflow">return</span> p->clients_count; <a name="l02718"></a>02718 } <a name="l02719"></a>02719 <a name="l02720"></a>02720 <a name="l02721"></a>02721 <span class="keyword">const</span> Window *NETRootInfo::clientListStacking()<span class="keyword"> const </span>{ <a name="l02722"></a>02722 <span class="keywordflow">return</span> p->stacking; <a name="l02723"></a>02723 } <a name="l02724"></a>02724 <a name="l02725"></a>02725 <a name="l02726"></a>02726 <span class="keywordtype">int</span> NETRootInfo::clientListStackingCount()<span class="keyword"> const </span>{ <a name="l02727"></a>02727 <span class="keywordflow">return</span> p->stacking_count; <a name="l02728"></a>02728 } <a name="l02729"></a>02729 <a name="l02730"></a>02730 <a name="l02731"></a>02731 <span class="keyword">const</span> Window *NETRootInfo::kdeSystemTrayWindows()<span class="keyword"> const </span>{ <a name="l02732"></a>02732 <span class="keywordflow">return</span> p->kde_system_tray_windows; <a name="l02733"></a>02733 } <a name="l02734"></a>02734 <a name="l02735"></a>02735 <a name="l02736"></a>02736 <span class="keywordtype">int</span> NETRootInfo::kdeSystemTrayWindowsCount()<span class="keyword"> const </span>{ <a name="l02737"></a>02737 <span class="keywordflow">return</span> p->kde_system_tray_windows_count; <a name="l02738"></a>02738 } <a name="l02739"></a>02739 <a name="l02740"></a>02740 <a name="l02741"></a>02741 <a class="code" href="structNETSize.html" title="Simple size class for NET classes.">NETSize</a> NETRootInfo::desktopGeometry(<span class="keywordtype">int</span>)<span class="keyword"> const </span>{ <a name="l02742"></a>02742 <span class="keywordflow">return</span> p->geometry.<a class="code" href="structNETSize.html#af2e6a5fcac88037fa745273e85c5e219" title="Width.">width</a> != 0 ? p->geometry : p->rootSize; <a name="l02743"></a>02743 } <a name="l02744"></a>02744 <a name="l02745"></a>02745 <a name="l02746"></a>02746 <a class="code" href="structNETPoint.html" title="Simple point class for NET classes.">NETPoint</a> NETRootInfo::desktopViewport(<span class="keywordtype">int</span> desktop)<span class="keyword"> const </span>{ <a name="l02747"></a>02747 <span class="keywordflow">if</span> (desktop < 1) { <a name="l02748"></a>02748 <a class="code" href="structNETPoint.html" title="Simple point class for NET classes.">NETPoint</a> pt; <span class="comment">// set to (0,0)</span> <a name="l02749"></a>02749 <span class="keywordflow">return</span> pt; <a name="l02750"></a>02750 } <a name="l02751"></a>02751 <a name="l02752"></a>02752 <span class="keywordflow">return</span> p->viewport[desktop - 1]; <a name="l02753"></a>02753 } <a name="l02754"></a>02754 <a name="l02755"></a>02755 <a name="l02756"></a>02756 <a class="code" href="structNETRect.html" title="Simple rectangle class for NET classes.">NETRect</a> NETRootInfo::workArea(<span class="keywordtype">int</span> desktop)<span class="keyword"> const </span>{ <a name="l02757"></a>02757 <span class="keywordflow">if</span> (desktop < 1) { <a name="l02758"></a>02758 <a class="code" href="structNETRect.html" title="Simple rectangle class for NET classes.">NETRect</a> rt; <a name="l02759"></a>02759 <span class="keywordflow">return</span> rt; <a name="l02760"></a>02760 } <a name="l02761"></a>02761 <a name="l02762"></a>02762 <span class="keywordflow">return</span> p->workarea[desktop - 1]; <a name="l02763"></a>02763 } <a name="l02764"></a>02764 <a name="l02765"></a>02765 <a name="l02766"></a>02766 <span class="keyword">const</span> <span class="keywordtype">char</span> *NETRootInfo::desktopName(<span class="keywordtype">int</span> desktop)<span class="keyword"> const </span>{ <a name="l02767"></a>02767 <span class="keywordflow">if</span> (desktop < 1) { <a name="l02768"></a>02768 <span class="keywordflow">return</span> 0; <a name="l02769"></a>02769 } <a name="l02770"></a>02770 <a name="l02771"></a>02771 <span class="keywordflow">return</span> p->desktop_names[desktop - 1]; <a name="l02772"></a>02772 } <a name="l02773"></a>02773 <a name="l02774"></a>02774 <a name="l02775"></a>02775 <span class="keyword">const</span> Window *NETRootInfo::virtualRoots( )<span class="keyword"> const </span>{ <a name="l02776"></a>02776 <span class="keywordflow">return</span> p->virtual_roots; <a name="l02777"></a>02777 } <a name="l02778"></a>02778 <a name="l02779"></a>02779 <a name="l02780"></a>02780 <span class="keywordtype">int</span> NETRootInfo::virtualRootsCount()<span class="keyword"> const </span>{ <a name="l02781"></a>02781 <span class="keywordflow">return</span> p->virtual_roots_count; <a name="l02782"></a>02782 } <a name="l02783"></a>02783 <a name="l02784"></a>02784 <a name="l02785"></a>02785 <a class="code" href="classNET.html#afac5b26cfb4e28ec2f18cd5cc9e1989a" title="Orientation.">NET::Orientation</a> NETRootInfo::desktopLayoutOrientation()<span class="keyword"> const </span>{ <a name="l02786"></a>02786 <span class="keywordflow">return</span> p->desktop_layout_orientation; <a name="l02787"></a>02787 } <a name="l02788"></a>02788 <a name="l02789"></a>02789 <a name="l02790"></a>02790 <a class="codeRef" href="qsize.html">QSize</a> NETRootInfo::desktopLayoutColumnsRows()<span class="keyword"> const </span>{ <a name="l02791"></a>02791 <span class="keywordflow">return</span> <a class="codeRef" href="qsize.html">QSize</a>( p->desktop_layout_columns, p->desktop_layout_rows ); <a name="l02792"></a>02792 } <a name="l02793"></a>02793 <a name="l02794"></a>02794 <a name="l02795"></a>02795 <a class="code" href="classNET.html#a3359c32a21f438e0e6564f26179e458f" title="Starting corner for desktop layout.">NET::DesktopLayoutCorner</a> NETRootInfo::desktopLayoutCorner()<span class="keyword"> const </span>{ <a name="l02796"></a>02796 <span class="keywordflow">return</span> p->desktop_layout_corner; <a name="l02797"></a>02797 } <a name="l02798"></a>02798 <a name="l02799"></a>02799 <a name="l02800"></a>02800 <span class="keywordtype">int</span> NETRootInfo::numberOfDesktops()<span class="keyword"> const </span>{ <a name="l02801"></a>02801 <span class="keywordflow">return</span> p->number_of_desktops == 0 ? 1 : p->number_of_desktops; <a name="l02802"></a>02802 } <a name="l02803"></a>02803 <a name="l02804"></a>02804 <a name="l02805"></a>02805 <span class="keywordtype">int</span> NETRootInfo::currentDesktop()<span class="keyword"> const </span>{ <a name="l02806"></a>02806 <span class="keywordflow">return</span> p->current_desktop == 0 ? 1 : p->current_desktop; <a name="l02807"></a>02807 } <a name="l02808"></a>02808 <a name="l02809"></a>02809 <a name="l02810"></a>02810 Window NETRootInfo::activeWindow()<span class="keyword"> const </span>{ <a name="l02811"></a>02811 <span class="keywordflow">return</span> p->active; <a name="l02812"></a>02812 } <a name="l02813"></a>02813 <a name="l02814"></a>02814 <a name="l02815"></a>02815 <span class="comment">// NETWinInfo stuffs</span> <a name="l02816"></a>02816 <a name="l02817"></a>02817 <span class="keyword">const</span> <span class="keywordtype">int</span> NETWinInfo::OnAllDesktops = NET::OnAllDesktops; <a name="l02818"></a>02818 <a name="l02819"></a>02819 NETWinInfo::NETWinInfo(Display *display, Window window, Window rootWindow, <a name="l02820"></a>02820 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> properties[], <span class="keywordtype">int</span> properties_size, <a name="l02821"></a>02821 Role role) <a name="l02822"></a>02822 { <a name="l02823"></a>02823 <a name="l02824"></a>02824 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l02825"></a>02825 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETWinInfo::NETWinInfo: constructing object with role '%s'\n"</span>, <a name="l02826"></a>02826 (role == WindowManager) ? <span class="stringliteral">"WindowManager"</span> : <span class="stringliteral">"Client"</span>); <a name="l02827"></a>02827 <span class="preprocessor">#endif</span> <a name="l02828"></a>02828 <span class="preprocessor"></span> <a name="l02829"></a>02829 p = <span class="keyword">new</span> NETWinInfoPrivate; <a name="l02830"></a>02830 p->ref = 1; <a name="l02831"></a>02831 <a name="l02832"></a>02832 p->display = display; <a name="l02833"></a>02833 p->window = window; <a name="l02834"></a>02834 p->root = rootWindow; <a name="l02835"></a>02835 p->mapping_state = Withdrawn; <a name="l02836"></a>02836 p->mapping_state_dirty = True; <a name="l02837"></a>02837 p->state = 0; <a name="l02838"></a>02838 p->types[ 0 ] = Unknown; <a name="l02839"></a>02839 p->name = (<span class="keywordtype">char</span> *) 0; <a name="l02840"></a>02840 p->visible_name = (<span class="keywordtype">char</span> *) 0; <a name="l02841"></a>02841 p->icon_name = (<span class="keywordtype">char</span> *) 0; <a name="l02842"></a>02842 p->visible_icon_name = (<span class="keywordtype">char</span> *) 0; <a name="l02843"></a>02843 p->desktop = p->pid = p->handled_icons = 0; <a name="l02844"></a>02844 p->user_time = -1U; <a name="l02845"></a>02845 p->startup_id = NULL; <a name="l02846"></a>02846 p->transient_for = None; <a name="l02847"></a>02847 p->window_group = None; <a name="l02848"></a>02848 p->allowed_actions = 0; <a name="l02849"></a>02849 p->has_net_support = <span class="keyword">false</span>; <a name="l02850"></a>02850 p->class_class = (<span class="keywordtype">char</span>*) 0; <a name="l02851"></a>02851 p->class_name = (<span class="keywordtype">char</span>*) 0; <a name="l02852"></a>02852 p->role = (<span class="keywordtype">char</span>*) 0; <a name="l02853"></a>02853 p->client_machine = (<span class="keywordtype">char</span>*) 0; <a name="l02854"></a>02854 <a name="l02855"></a>02855 <span class="comment">// p->strut.left = p->strut.right = p->strut.top = p->strut.bottom = 0;</span> <a name="l02856"></a>02856 <span class="comment">// p->frame_strut.left = p->frame_strut.right = p->frame_strut.top =</span> <a name="l02857"></a>02857 <span class="comment">// p->frame_strut.bottom = 0;</span> <a name="l02858"></a>02858 <a name="l02859"></a>02859 p->kde_system_tray_win_for = 0; <a name="l02860"></a>02860 <a name="l02861"></a>02861 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = 0; <a name="l02862"></a>02862 i < PROPERTIES_SIZE; <a name="l02863"></a>02863 ++i ) <a name="l02864"></a>02864 p->properties[ i ] = 0; <a name="l02865"></a>02865 <span class="keywordflow">if</span>( properties_size > PROPERTIES_SIZE ) <a name="l02866"></a>02866 properties_size = PROPERTIES_SIZE; <a name="l02867"></a>02867 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = 0; <a name="l02868"></a>02868 i < properties_size; <a name="l02869"></a>02869 ++i ) <a name="l02870"></a>02870 p->properties[ i ] = properties[ i ]; <a name="l02871"></a>02871 <a name="l02872"></a>02872 p->icon_count = 0; <a name="l02873"></a>02873 <a name="l02874"></a>02874 this->role = role; <a name="l02875"></a>02875 <a name="l02876"></a>02876 if (! netwm_atoms_created) create_atoms(p->display); <a name="l02877"></a>02877 <a name="l02878"></a>02878 update(p->properties); <a name="l02879"></a>02879 } <a name="l02880"></a>02880 <a name="l02881"></a>02881 <a name="l02882"></a>02882 NETWinInfo::NETWinInfo(Display *display, Window window, Window rootWindow, <a name="l02883"></a>02883 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> properties, Role role) <a name="l02884"></a>02884 { <a name="l02885"></a>02885 <a name="l02886"></a>02886 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l02887"></a>02887 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETWinInfo::NETWinInfo: constructing object with role '%s'\n"</span>, <a name="l02888"></a>02888 (role == WindowManager) ? <span class="stringliteral">"WindowManager"</span> : <span class="stringliteral">"Client"</span>); <a name="l02889"></a>02889 <span class="preprocessor">#endif</span> <a name="l02890"></a>02890 <span class="preprocessor"></span> <a name="l02891"></a>02891 p = <span class="keyword">new</span> NETWinInfoPrivate; <a name="l02892"></a>02892 p->ref = 1; <a name="l02893"></a>02893 <a name="l02894"></a>02894 p->display = display; <a name="l02895"></a>02895 p->window = window; <a name="l02896"></a>02896 p->root = rootWindow; <a name="l02897"></a>02897 p->mapping_state = Withdrawn; <a name="l02898"></a>02898 p->mapping_state_dirty = True; <a name="l02899"></a>02899 p->state = 0; <a name="l02900"></a>02900 p->types[ 0 ] = Unknown; <a name="l02901"></a>02901 p->name = (<span class="keywordtype">char</span> *) 0; <a name="l02902"></a>02902 p->visible_name = (<span class="keywordtype">char</span> *) 0; <a name="l02903"></a>02903 p->icon_name = (<span class="keywordtype">char</span> *) 0; <a name="l02904"></a>02904 p->visible_icon_name = (<span class="keywordtype">char</span> *) 0; <a name="l02905"></a>02905 p->desktop = p->pid = p->handled_icons = 0; <a name="l02906"></a>02906 p->user_time = -1U; <a name="l02907"></a>02907 p->startup_id = NULL; <a name="l02908"></a>02908 p->transient_for = None; <a name="l02909"></a>02909 p->window_group = None; <a name="l02910"></a>02910 p->allowed_actions = 0; <a name="l02911"></a>02911 p->has_net_support = <span class="keyword">false</span>; <a name="l02912"></a>02912 p->class_class = (<span class="keywordtype">char</span>*) 0; <a name="l02913"></a>02913 p->class_name = (<span class="keywordtype">char</span>*) 0; <a name="l02914"></a>02914 p->role = (<span class="keywordtype">char</span>*) 0; <a name="l02915"></a>02915 p->client_machine = (<span class="keywordtype">char</span>*) 0; <a name="l02916"></a>02916 <a name="l02917"></a>02917 <span class="comment">// p->strut.left = p->strut.right = p->strut.top = p->strut.bottom = 0;</span> <a name="l02918"></a>02918 <span class="comment">// p->frame_strut.left = p->frame_strut.right = p->frame_strut.top =</span> <a name="l02919"></a>02919 <span class="comment">// p->frame_strut.bottom = 0;</span> <a name="l02920"></a>02920 <a name="l02921"></a>02921 p->kde_system_tray_win_for = 0; <a name="l02922"></a>02922 <a name="l02923"></a>02923 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = 0; <a name="l02924"></a>02924 i < PROPERTIES_SIZE; <a name="l02925"></a>02925 ++i ) <a name="l02926"></a>02926 p->properties[ i ] = 0; <a name="l02927"></a>02927 p->properties[ PROTOCOLS ] = properties; <a name="l02928"></a>02928 <a name="l02929"></a>02929 p->icon_count = 0; <a name="l02930"></a>02930 <a name="l02931"></a>02931 this->role = role; <a name="l02932"></a>02932 <a name="l02933"></a>02933 if (! netwm_atoms_created) create_atoms(p->display); <a name="l02934"></a>02934 <a name="l02935"></a>02935 update(p->properties); <a name="l02936"></a>02936 } <a name="l02937"></a>02937 <a name="l02938"></a>02938 <a name="l02939"></a>02939 NETWinInfo::NETWinInfo(<span class="keyword">const</span> NETWinInfo &wininfo) { <a name="l02940"></a>02940 p = wininfo.p; <a name="l02941"></a>02941 p->ref++; <a name="l02942"></a>02942 } <a name="l02943"></a>02943 <a name="l02944"></a>02944 <a name="l02945"></a>02945 NETWinInfo::~NETWinInfo() { <a name="l02946"></a>02946 refdec_nwi(p); <a name="l02947"></a>02947 <a name="l02948"></a>02948 <span class="keywordflow">if</span> (! p->ref) <span class="keyword">delete</span> p; <a name="l02949"></a>02949 } <a name="l02950"></a>02950 <a name="l02951"></a>02951 <a name="l02952"></a>02952 <span class="comment">// assignment operator</span> <a name="l02953"></a>02953 <a name="l02954"></a>02954 <span class="keyword">const</span> NETWinInfo &NETWinInfo::operator=(<span class="keyword">const</span> NETWinInfo &wininfo) { <a name="l02955"></a>02955 <a name="l02956"></a>02956 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l02957"></a>02957 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETWinInfo::operator=()\n"</span>); <a name="l02958"></a>02958 <span class="preprocessor">#endif</span> <a name="l02959"></a>02959 <span class="preprocessor"></span> <a name="l02960"></a>02960 <span class="keywordflow">if</span> (p != wininfo.p) { <a name="l02961"></a>02961 refdec_nwi(p); <a name="l02962"></a>02962 <a name="l02963"></a>02963 <span class="keywordflow">if</span> (! p->ref) <span class="keyword">delete</span> p; <a name="l02964"></a>02964 } <a name="l02965"></a>02965 <a name="l02966"></a>02966 p = wininfo.p; <a name="l02967"></a>02967 role = wininfo.role; <a name="l02968"></a>02968 p->ref++; <a name="l02969"></a>02969 <a name="l02970"></a>02970 <span class="keywordflow">return</span> *<span class="keyword">this</span>; <a name="l02971"></a>02971 } <a name="l02972"></a>02972 <a name="l02973"></a>02973 <a name="l02974"></a>02974 <span class="keywordtype">void</span> NETWinInfo::setIcon(<a class="code" href="structNETIcon.html" title="Simple icon class for NET classes.">NETIcon</a> icon, Bool replace) { <a name="l02975"></a>02975 setIconInternal( p->icons, p->icon_count, net_wm_icon, icon, replace ); <a name="l02976"></a>02976 } <a name="l02977"></a>02977 <a name="l02978"></a>02978 <span class="keywordtype">void</span> NETWinInfo::setIconInternal(NETRArray<NETIcon>& icons, <span class="keywordtype">int</span>& icon_count, Atom property, <a class="code" href="structNETIcon.html" title="Simple icon class for NET classes.">NETIcon</a> icon, Bool replace) { <a name="l02979"></a>02979 <span class="keywordflow">if</span> (role != Client) <span class="keywordflow">return</span>; <a name="l02980"></a>02980 <a name="l02981"></a>02981 <span class="keywordtype">int</span> proplen, i, sz, j; <a name="l02982"></a>02982 <a name="l02983"></a>02983 <span class="keywordflow">if</span> (replace) { <a name="l02984"></a>02984 <a name="l02985"></a>02985 <span class="keywordflow">for</span> (i = 0; i < icons.size(); i++) { <a name="l02986"></a>02986 <span class="keyword">delete</span> [] icons[i].data; <a name="l02987"></a>02987 icons[i].data = 0; <a name="l02988"></a>02988 icons[i].size.width = 0; <a name="l02989"></a>02989 icons[i].size.height = 0; <a name="l02990"></a>02990 } <a name="l02991"></a>02991 <a name="l02992"></a>02992 icon_count = 0; <a name="l02993"></a>02993 } <a name="l02994"></a>02994 <a name="l02995"></a>02995 <span class="comment">// assign icon</span> <a name="l02996"></a>02996 icons[icon_count] = icon; <a name="l02997"></a>02997 icon_count++; <a name="l02998"></a>02998 <a name="l02999"></a>02999 <span class="comment">// do a deep copy, we want to own the data</span> <a name="l03000"></a>03000 <a class="code" href="structNETIcon.html" title="Simple icon class for NET classes.">NETIcon</a> &ni = icons[icon_count - 1]; <a name="l03001"></a>03001 sz = ni.<a class="code" href="structNETIcon.html#a6506944fe7143f0a37bbe58cc0d8df94" title="Size of the icon.">size</a>.<a class="code" href="structNETSize.html#af2e6a5fcac88037fa745273e85c5e219" title="Width.">width</a> * ni.<a class="code" href="structNETIcon.html#a6506944fe7143f0a37bbe58cc0d8df94" title="Size of the icon.">size</a>.<a class="code" href="structNETSize.html#a0a6def5683983f7f3478192248ef2f8e" title="Height.">height</a>; <a name="l03002"></a>03002 CARD32 *d = <span class="keyword">new</span> CARD32[sz]; <a name="l03003"></a>03003 ni.<a class="code" href="structNETIcon.html#aaa6c9f9828e7d2f9a29f408529a68822" title="Image data for the icon.">data</a> = (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) d; <a name="l03004"></a>03004 memcpy(d, icon.<a class="code" href="structNETIcon.html#aaa6c9f9828e7d2f9a29f408529a68822" title="Image data for the icon.">data</a>, sz * <span class="keyword">sizeof</span>(CARD32)); <a name="l03005"></a>03005 <a name="l03006"></a>03006 <span class="comment">// compute property length</span> <a name="l03007"></a>03007 <span class="keywordflow">for</span> (i = 0, proplen = 0; i < icon_count; i++) { <a name="l03008"></a>03008 proplen += 2 + (icons[i].size.width * <a name="l03009"></a>03009 icons[i].size.height); <a name="l03010"></a>03010 } <a name="l03011"></a>03011 <a name="l03012"></a>03012 CARD32 *d32; <a name="l03013"></a>03013 <span class="keywordtype">long</span> *prop = <span class="keyword">new</span> <span class="keywordtype">long</span>[proplen], *pprop = prop; <a name="l03014"></a>03014 <span class="keywordflow">for</span> (i = 0; i < icon_count; i++) { <a name="l03015"></a>03015 <span class="comment">// copy size into property</span> <a name="l03016"></a>03016 *pprop++ = icons[i].size.width; <a name="l03017"></a>03017 *pprop++ = icons[i].size.height; <a name="l03018"></a>03018 <a name="l03019"></a>03019 <span class="comment">// copy data into property</span> <a name="l03020"></a>03020 sz = (icons[i].size.width * icons[i].size.height); <a name="l03021"></a>03021 d32 = (CARD32 *) icons[i].data; <a name="l03022"></a>03022 <span class="keywordflow">for</span> (j = 0; j < sz; j++) *pprop++ = *d32++; <a name="l03023"></a>03023 } <a name="l03024"></a>03024 <a name="l03025"></a>03025 XChangeProperty(p->display, p->window, property, XA_CARDINAL, 32, <a name="l03026"></a>03026 PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) prop, proplen); <a name="l03027"></a>03027 <a name="l03028"></a>03028 <span class="keyword">delete</span> [] prop; <a name="l03029"></a>03029 } <a name="l03030"></a>03030 <a name="l03031"></a>03031 <a name="l03032"></a>03032 <span class="keywordtype">void</span> NETWinInfo::setIconGeometry(<a class="code" href="structNETRect.html" title="Simple rectangle class for NET classes.">NETRect</a> geometry) { <a name="l03033"></a>03033 <span class="keywordflow">if</span> (role != Client) <span class="keywordflow">return</span>; <a name="l03034"></a>03034 <a name="l03035"></a>03035 p->icon_geom = geometry; <a name="l03036"></a>03036 <a name="l03037"></a>03037 <span class="keywordflow">if</span>( geometry.<a class="code" href="structNETRect.html#a97102c18e356965d829855c570bb45ca" title="Size of the rectangle.">size</a>.<a class="code" href="structNETSize.html#af2e6a5fcac88037fa745273e85c5e219" title="Width.">width</a> == 0 ) <span class="comment">// empty</span> <a name="l03038"></a>03038 XDeleteProperty(p->display, p->window, net_wm_icon_geometry); <a name="l03039"></a>03039 <span class="keywordflow">else</span> { <a name="l03040"></a>03040 <span class="keywordtype">long</span> data[4]; <a name="l03041"></a>03041 data[0] = geometry.<a class="code" href="structNETRect.html#a2604a60ef01bb245df79ada826b1718d" title="Position of the rectangle.">pos</a>.<a class="code" href="structNETPoint.html#a662b6d948b949dabcaf2e955a078e63f" title="x coordinate.">x</a>; <a name="l03042"></a>03042 data[1] = geometry.<a class="code" href="structNETRect.html#a2604a60ef01bb245df79ada826b1718d" title="Position of the rectangle.">pos</a>.<a class="code" href="structNETPoint.html#ac64b3831f6fd7f1874f7e344beb117bd" title="y coordinate">y</a>; <a name="l03043"></a>03043 data[2] = geometry.<a class="code" href="structNETRect.html#a97102c18e356965d829855c570bb45ca" title="Size of the rectangle.">size</a>.<a class="code" href="structNETSize.html#af2e6a5fcac88037fa745273e85c5e219" title="Width.">width</a>; <a name="l03044"></a>03044 data[3] = geometry.<a class="code" href="structNETRect.html#a97102c18e356965d829855c570bb45ca" title="Size of the rectangle.">size</a>.<a class="code" href="structNETSize.html#a0a6def5683983f7f3478192248ef2f8e" title="Height.">height</a>; <a name="l03045"></a>03045 <a name="l03046"></a>03046 XChangeProperty(p->display, p->window, net_wm_icon_geometry, XA_CARDINAL, <a name="l03047"></a>03047 32, PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) data, 4); <a name="l03048"></a>03048 } <a name="l03049"></a>03049 } <a name="l03050"></a>03050 <a name="l03051"></a>03051 <a name="l03052"></a>03052 <span class="keywordtype">void</span> NETWinInfo::setExtendedStrut(<span class="keyword">const</span> <a class="code" href="structNETExtendedStrut.html" title="Partial strut class for NET classes.">NETExtendedStrut</a>& extended_strut ) { <a name="l03053"></a>03053 <span class="keywordflow">if</span> (role != Client) <span class="keywordflow">return</span>; <a name="l03054"></a>03054 <a name="l03055"></a>03055 p->extended_strut = extended_strut; <a name="l03056"></a>03056 <a name="l03057"></a>03057 <span class="keywordtype">long</span> data[12]; <a name="l03058"></a>03058 data[0] = extended_strut.<a class="code" href="structNETExtendedStrut.html#a79fc79c632ccc599b393693d99f24164" title="Left border of the strut, width and range.">left_width</a>; <a name="l03059"></a>03059 data[1] = extended_strut.<a class="code" href="structNETExtendedStrut.html#a7c1f4d0bf33fe20f5dba649e8a2a505b" title="Right border of the strut, width and range.">right_width</a>; <a name="l03060"></a>03060 data[2] = extended_strut.<a class="code" href="structNETExtendedStrut.html#acb07800b67a53e134faaf09c571a1f0e" title="Top border of the strut, width and range.">top_width</a>; <a name="l03061"></a>03061 data[3] = extended_strut.<a class="code" href="structNETExtendedStrut.html#a12ee0a2d04e980001139a7677a821148" title="Bottom border of the strut, width and range.">bottom_width</a>; <a name="l03062"></a>03062 data[4] = extended_strut.left_start; <a name="l03063"></a>03063 data[5] = extended_strut.left_end; <a name="l03064"></a>03064 data[6] = extended_strut.right_start; <a name="l03065"></a>03065 data[7] = extended_strut.right_end; <a name="l03066"></a>03066 data[8] = extended_strut.top_start; <a name="l03067"></a>03067 data[9] = extended_strut.top_end; <a name="l03068"></a>03068 data[10] = extended_strut.bottom_start; <a name="l03069"></a>03069 data[11] = extended_strut.bottom_end; <a name="l03070"></a>03070 <a name="l03071"></a>03071 XChangeProperty(p->display, p->window, net_wm_extended_strut, XA_CARDINAL, 32, <a name="l03072"></a>03072 PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) data, 12); <a name="l03073"></a>03073 } <a name="l03074"></a>03074 <a name="l03075"></a>03075 <a name="l03076"></a>03076 <span class="keywordtype">void</span> NETWinInfo::setStrut(<a class="code" href="structNETStrut.html">NETStrut</a> strut) { <a name="l03077"></a>03077 <span class="keywordflow">if</span> (role != Client) <span class="keywordflow">return</span>; <a name="l03078"></a>03078 <a name="l03079"></a>03079 p->strut = strut; <a name="l03080"></a>03080 <a name="l03081"></a>03081 <span class="keywordtype">long</span> data[4]; <a name="l03082"></a>03082 data[0] = strut.<a class="code" href="structNETStrut.html#a3ffe1d55e64632f4cdc1225ae8a301df" title="Left border of the strut.">left</a>; <a name="l03083"></a>03083 data[1] = strut.<a class="code" href="structNETStrut.html#a46c92f5dc806d6def2390f258d00b80e" title="Right border of the strut.">right</a>; <a name="l03084"></a>03084 data[2] = strut.<a class="code" href="structNETStrut.html#ac359ac56290a66002010f64dc4842aa2" title="Top border of the strut.">top</a>; <a name="l03085"></a>03085 data[3] = strut.<a class="code" href="structNETStrut.html#a031e023bb8f0c8cf3d00b748c7dd7ca7" title="Bottom border of the strut.">bottom</a>; <a name="l03086"></a>03086 <a name="l03087"></a>03087 XChangeProperty(p->display, p->window, net_wm_strut, XA_CARDINAL, 32, <a name="l03088"></a>03088 PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) data, 4); <a name="l03089"></a>03089 } <a name="l03090"></a>03090 <a name="l03091"></a>03091 <a name="l03092"></a>03092 <span class="keywordtype">void</span> NETWinInfo::setState(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> state, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> mask) { <a name="l03093"></a>03093 <span class="keywordflow">if</span> (p->mapping_state_dirty) <a name="l03094"></a>03094 updateWMState(); <a name="l03095"></a>03095 <a name="l03096"></a>03096 <span class="comment">// setState() needs to know the current state, so read it even if not requested</span> <a name="l03097"></a>03097 <span class="keywordflow">if</span>( ( p->properties[ PROTOCOLS ] & WMState ) == 0 ) { <a name="l03098"></a>03098 p->properties[ PROTOCOLS ] |= WMState; <a name="l03099"></a>03099 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> props[ PROPERTIES_SIZE ] = { WMState, 0 }; <a name="l03100"></a>03100 assert( PROPERTIES_SIZE == 2 ); <span class="comment">// add elements above</span> <a name="l03101"></a>03101 update( props ); <a name="l03102"></a>03102 p->properties[ PROTOCOLS ] &= ~WMState; <a name="l03103"></a>03103 } <a name="l03104"></a>03104 <a name="l03105"></a>03105 <span class="keywordflow">if</span> (role == Client && p->mapping_state != Withdrawn) { <a name="l03106"></a>03106 <a name="l03107"></a>03107 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l03108"></a>03108 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETWinInfo::setState (0x%lx, 0x%lx) (Client)\n"</span>, <a name="l03109"></a>03109 state, mask); <a name="l03110"></a>03110 <span class="preprocessor">#endif // NETWMDEBUG</span> <a name="l03111"></a>03111 <span class="preprocessor"></span> <a name="l03112"></a>03112 XEvent e; <a name="l03113"></a>03113 e.xclient.type = ClientMessage; <a name="l03114"></a>03114 e.xclient.message_type = net_wm_state; <a name="l03115"></a>03115 e.xclient.display = p->display; <a name="l03116"></a>03116 e.xclient.window = p->window; <a name="l03117"></a>03117 e.xclient.format = 32; <a name="l03118"></a>03118 e.xclient.data.l[3] = 0l; <a name="l03119"></a>03119 e.xclient.data.l[4] = 0l; <a name="l03120"></a>03120 <a name="l03121"></a>03121 <span class="keywordflow">if</span> ((mask & Modal) && ((p->state & Modal) != (state & Modal))) { <a name="l03122"></a>03122 e.xclient.data.l[0] = (state & Modal) ? 1 : 0; <a name="l03123"></a>03123 e.xclient.data.l[1] = net_wm_state_modal; <a name="l03124"></a>03124 e.xclient.data.l[2] = 0l; <a name="l03125"></a>03125 <a name="l03126"></a>03126 XSendEvent(p->display, p->root, False, netwm_sendevent_mask, &e); <a name="l03127"></a>03127 } <a name="l03128"></a>03128 <a name="l03129"></a>03129 <span class="keywordflow">if</span> ((mask & Sticky) && ((p->state & Sticky) != (state & Sticky))) { <a name="l03130"></a>03130 e.xclient.data.l[0] = (state & Sticky) ? 1 : 0; <a name="l03131"></a>03131 e.xclient.data.l[1] = net_wm_state_sticky; <a name="l03132"></a>03132 e.xclient.data.l[2] = 0l; <a name="l03133"></a>03133 <a name="l03134"></a>03134 XSendEvent(p->display, p->root, False, netwm_sendevent_mask, &e); <a name="l03135"></a>03135 } <a name="l03136"></a>03136 <a name="l03137"></a>03137 <span class="keywordflow">if</span> ((mask & Max) && (( (p->state&mask) & Max) != (state & Max))) { <a name="l03138"></a>03138 <a name="l03139"></a>03139 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> wishstate = (p->state & ~mask) | (state & mask); <a name="l03140"></a>03140 <span class="keywordflow">if</span> ( ( (wishstate & MaxHoriz) != (p->state & MaxHoriz) ) <a name="l03141"></a>03141 && ( (wishstate & MaxVert) != (p->state & MaxVert) ) ) { <a name="l03142"></a>03142 <span class="keywordflow">if</span> ( (wishstate & Max) == Max ) { <a name="l03143"></a>03143 e.xclient.data.l[0] = 1; <a name="l03144"></a>03144 e.xclient.data.l[1] = net_wm_state_max_horiz; <a name="l03145"></a>03145 e.xclient.data.l[2] = net_wm_state_max_vert; <a name="l03146"></a>03146 XSendEvent(p->display, p->root, False, netwm_sendevent_mask, &e); <a name="l03147"></a>03147 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( (wishstate & Max) == 0 ) { <a name="l03148"></a>03148 e.xclient.data.l[0] = 0; <a name="l03149"></a>03149 e.xclient.data.l[1] = net_wm_state_max_horiz; <a name="l03150"></a>03150 e.xclient.data.l[2] = net_wm_state_max_vert; <a name="l03151"></a>03151 XSendEvent(p->display, p->root, False, netwm_sendevent_mask, &e); <a name="l03152"></a>03152 } <span class="keywordflow">else</span> { <a name="l03153"></a>03153 e.xclient.data.l[0] = ( wishstate & MaxHoriz ) ? 1 : 0; <a name="l03154"></a>03154 e.xclient.data.l[1] = net_wm_state_max_horiz; <a name="l03155"></a>03155 e.xclient.data.l[2] = 0; <a name="l03156"></a>03156 XSendEvent(p->display, p->root, False, netwm_sendevent_mask, &e); <a name="l03157"></a>03157 e.xclient.data.l[0] = ( wishstate & MaxVert ) ? 1 : 0; <a name="l03158"></a>03158 e.xclient.data.l[1] = net_wm_state_max_vert; <a name="l03159"></a>03159 e.xclient.data.l[2] = 0; <a name="l03160"></a>03160 XSendEvent(p->display, p->root, False, netwm_sendevent_mask, &e); <a name="l03161"></a>03161 } <a name="l03162"></a>03162 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( (wishstate & MaxVert) != (p->state & MaxVert) ) { <a name="l03163"></a>03163 e.xclient.data.l[0] = ( wishstate & MaxVert ) ? 1 : 0; <a name="l03164"></a>03164 e.xclient.data.l[1] = net_wm_state_max_vert; <a name="l03165"></a>03165 e.xclient.data.l[2] = 0; <a name="l03166"></a>03166 XSendEvent(p->display, p->root, False, netwm_sendevent_mask, &e); <a name="l03167"></a>03167 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( (wishstate & MaxHoriz) != (p->state & MaxHoriz) ) { <a name="l03168"></a>03168 e.xclient.data.l[0] = ( wishstate & MaxHoriz ) ? 1 : 0; <a name="l03169"></a>03169 e.xclient.data.l[1] = net_wm_state_max_horiz; <a name="l03170"></a>03170 e.xclient.data.l[2] = 0; <a name="l03171"></a>03171 XSendEvent(p->display, p->root, False, netwm_sendevent_mask, &e); <a name="l03172"></a>03172 } <a name="l03173"></a>03173 } <a name="l03174"></a>03174 <a name="l03175"></a>03175 <span class="keywordflow">if</span> ((mask & Shaded) && ((p->state & Shaded) != (state & Shaded))) { <a name="l03176"></a>03176 e.xclient.data.l[0] = (state & Shaded) ? 1 : 0; <a name="l03177"></a>03177 e.xclient.data.l[1] = net_wm_state_shaded; <a name="l03178"></a>03178 e.xclient.data.l[2] = 0l; <a name="l03179"></a>03179 <a name="l03180"></a>03180 XSendEvent(p->display, p->root, False, netwm_sendevent_mask, &e); <a name="l03181"></a>03181 } <a name="l03182"></a>03182 <a name="l03183"></a>03183 <span class="keywordflow">if</span> ((mask & SkipTaskbar) && <a name="l03184"></a>03184 ((p->state & SkipTaskbar) != (state & SkipTaskbar))) { <a name="l03185"></a>03185 e.xclient.data.l[0] = (state & SkipTaskbar) ? 1 : 0; <a name="l03186"></a>03186 e.xclient.data.l[1] = net_wm_state_skip_taskbar; <a name="l03187"></a>03187 e.xclient.data.l[2] = 0l; <a name="l03188"></a>03188 <a name="l03189"></a>03189 XSendEvent(p->display, p->root, False, netwm_sendevent_mask, &e); <a name="l03190"></a>03190 } <a name="l03191"></a>03191 <a name="l03192"></a>03192 <span class="keywordflow">if</span> ((mask & SkipPager) && <a name="l03193"></a>03193 ((p->state & SkipPager) != (state & SkipPager))) { <a name="l03194"></a>03194 e.xclient.data.l[0] = (state & SkipPager) ? 1 : 0; <a name="l03195"></a>03195 e.xclient.data.l[1] = net_wm_state_skip_pager; <a name="l03196"></a>03196 e.xclient.data.l[2] = 0l; <a name="l03197"></a>03197 <a name="l03198"></a>03198 XSendEvent(p->display, p->root, False, netwm_sendevent_mask, &e); <a name="l03199"></a>03199 } <a name="l03200"></a>03200 <a name="l03201"></a>03201 <span class="keywordflow">if</span> ((mask & Hidden) && <a name="l03202"></a>03202 ((p->state & Hidden) != (state & Hidden))) { <a name="l03203"></a>03203 e.xclient.data.l[0] = (state & Hidden) ? 1 : 0; <a name="l03204"></a>03204 e.xclient.data.l[1] = net_wm_state_hidden; <a name="l03205"></a>03205 e.xclient.data.l[2] = 0l; <a name="l03206"></a>03206 <a name="l03207"></a>03207 XSendEvent(p->display, p->root, False, netwm_sendevent_mask, &e); <a name="l03208"></a>03208 } <a name="l03209"></a>03209 <a name="l03210"></a>03210 <span class="keywordflow">if</span> ((mask & FullScreen) && <a name="l03211"></a>03211 ((p->state & FullScreen) != (state & FullScreen))) { <a name="l03212"></a>03212 e.xclient.data.l[0] = (state & FullScreen) ? 1 : 0; <a name="l03213"></a>03213 e.xclient.data.l[1] = net_wm_state_fullscreen; <a name="l03214"></a>03214 e.xclient.data.l[2] = 0l; <a name="l03215"></a>03215 <a name="l03216"></a>03216 XSendEvent(p->display, p->root, False, netwm_sendevent_mask, &e); <a name="l03217"></a>03217 } <a name="l03218"></a>03218 <a name="l03219"></a>03219 <span class="keywordflow">if</span> ((mask & KeepAbove) && <a name="l03220"></a>03220 ((p->state & KeepAbove) != (state & KeepAbove))) { <a name="l03221"></a>03221 e.xclient.data.l[0] = (state & KeepAbove) ? 1 : 0; <a name="l03222"></a>03222 e.xclient.data.l[1] = net_wm_state_above; <a name="l03223"></a>03223 e.xclient.data.l[2] = 0l; <a name="l03224"></a>03224 <a name="l03225"></a>03225 XSendEvent(p->display, p->root, False, netwm_sendevent_mask, &e); <a name="l03226"></a>03226 } <a name="l03227"></a>03227 <a name="l03228"></a>03228 <span class="keywordflow">if</span> ((mask & KeepBelow) && <a name="l03229"></a>03229 ((p->state & KeepBelow) != (state & KeepBelow))) { <a name="l03230"></a>03230 e.xclient.data.l[0] = (state & KeepBelow) ? 1 : 0; <a name="l03231"></a>03231 e.xclient.data.l[1] = net_wm_state_below; <a name="l03232"></a>03232 e.xclient.data.l[2] = 0l; <a name="l03233"></a>03233 <a name="l03234"></a>03234 XSendEvent(p->display, p->root, False, netwm_sendevent_mask, &e); <a name="l03235"></a>03235 } <a name="l03236"></a>03236 <a name="l03237"></a>03237 <span class="keywordflow">if</span> ((mask & StaysOnTop) && ((p->state & StaysOnTop) != (state & StaysOnTop))) { <a name="l03238"></a>03238 e.xclient.data.l[0] = (state & StaysOnTop) ? 1 : 0; <a name="l03239"></a>03239 e.xclient.data.l[1] = net_wm_state_stays_on_top; <a name="l03240"></a>03240 e.xclient.data.l[2] = 0l; <a name="l03241"></a>03241 <a name="l03242"></a>03242 XSendEvent(p->display, p->root, False, netwm_sendevent_mask, &e); <a name="l03243"></a>03243 } <a name="l03244"></a>03244 <a name="l03245"></a>03245 <span class="keywordflow">if</span> ((mask & DemandsAttention) && <a name="l03246"></a>03246 ((p->state & DemandsAttention) != (state & DemandsAttention))) { <a name="l03247"></a>03247 e.xclient.data.l[0] = (state & DemandsAttention) ? 1 : 0; <a name="l03248"></a>03248 e.xclient.data.l[1] = net_wm_state_demands_attention; <a name="l03249"></a>03249 e.xclient.data.l[2] = 0l; <a name="l03250"></a>03250 <a name="l03251"></a>03251 XSendEvent(p->display, p->root, False, netwm_sendevent_mask, &e); <a name="l03252"></a>03252 } <a name="l03253"></a>03253 <a name="l03254"></a>03254 } <span class="keywordflow">else</span> { <a name="l03255"></a>03255 p->state &= ~mask; <a name="l03256"></a>03256 p->state |= state; <a name="l03257"></a>03257 <a name="l03258"></a>03258 <span class="keywordtype">long</span> data[50]; <a name="l03259"></a>03259 <span class="keywordtype">int</span> count = 0; <a name="l03260"></a>03260 <a name="l03261"></a>03261 <span class="comment">// hints</span> <a name="l03262"></a>03262 <span class="keywordflow">if</span> (p->state & Modal) data[count++] = net_wm_state_modal; <a name="l03263"></a>03263 <span class="keywordflow">if</span> (p->state & MaxVert) data[count++] = net_wm_state_max_vert; <a name="l03264"></a>03264 <span class="keywordflow">if</span> (p->state & MaxHoriz) data[count++] = net_wm_state_max_horiz; <a name="l03265"></a>03265 <span class="keywordflow">if</span> (p->state & Shaded) data[count++] = net_wm_state_shaded; <a name="l03266"></a>03266 <span class="keywordflow">if</span> (p->state & Hidden) data[count++] = net_wm_state_hidden; <a name="l03267"></a>03267 <span class="keywordflow">if</span> (p->state & FullScreen) data[count++] = net_wm_state_fullscreen; <a name="l03268"></a>03268 <span class="keywordflow">if</span> (p->state & DemandsAttention) data[count++] = net_wm_state_demands_attention; <a name="l03269"></a>03269 <a name="l03270"></a>03270 <span class="comment">// policy</span> <a name="l03271"></a>03271 <span class="keywordflow">if</span> (p->state & KeepAbove) data[count++] = net_wm_state_above; <a name="l03272"></a>03272 <span class="keywordflow">if</span> (p->state & KeepBelow) data[count++] = net_wm_state_below; <a name="l03273"></a>03273 <span class="keywordflow">if</span> (p->state & StaysOnTop) data[count++] = net_wm_state_stays_on_top; <a name="l03274"></a>03274 <span class="keywordflow">if</span> (p->state & Sticky) data[count++] = net_wm_state_sticky; <a name="l03275"></a>03275 <span class="keywordflow">if</span> (p->state & SkipTaskbar) data[count++] = net_wm_state_skip_taskbar; <a name="l03276"></a>03276 <span class="keywordflow">if</span> (p->state & SkipPager) data[count++] = net_wm_state_skip_pager; <a name="l03277"></a>03277 <a name="l03278"></a>03278 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l03279"></a>03279 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETWinInfo::setState: setting state property (%d)\n"</span>, count); <a name="l03280"></a>03280 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < count; i++) { <a name="l03281"></a>03281 <span class="keywordtype">char</span>* data_ret = XGetAtomName(p->display, (Atom) data[i]); <a name="l03282"></a>03282 fprintf(stderr, <span class="stringliteral">"NETWinInfo::setState: state %ld '%s'\n"</span>, <a name="l03283"></a>03283 data[i], data_ret); <a name="l03284"></a>03284 <span class="keywordflow">if</span> ( data_ret ) <a name="l03285"></a>03285 XFree( data_ret ); <a name="l03286"></a>03286 } <a name="l03287"></a>03287 <a name="l03288"></a>03288 <span class="preprocessor">#endif</span> <a name="l03289"></a>03289 <span class="preprocessor"></span> <a name="l03290"></a>03290 XChangeProperty(p->display, p->window, net_wm_state, XA_ATOM, 32, <a name="l03291"></a>03291 PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) data, count); <a name="l03292"></a>03292 } <a name="l03293"></a>03293 } <a name="l03294"></a>03294 <a name="l03295"></a>03295 <a name="l03296"></a>03296 <span class="keywordtype">void</span> NETWinInfo::setWindowType(WindowType type) { <a name="l03297"></a>03297 <span class="keywordflow">if</span> (role != Client) <span class="keywordflow">return</span>; <a name="l03298"></a>03298 <a name="l03299"></a>03299 <span class="keywordtype">int</span> len; <a name="l03300"></a>03300 <span class="keywordtype">long</span> data[2]; <a name="l03301"></a>03301 <a name="l03302"></a>03302 <span class="keywordflow">switch</span> (type) { <a name="l03303"></a>03303 <span class="keywordflow">case</span> Override: <a name="l03304"></a>03304 <span class="comment">// spec extension: override window type. we must comply with the spec</span> <a name="l03305"></a>03305 <span class="comment">// and provide a fall back (normal seems best)</span> <a name="l03306"></a>03306 data[0] = kde_net_wm_window_type_override; <a name="l03307"></a>03307 data[1] = net_wm_window_type_normal; <a name="l03308"></a>03308 len = 2; <a name="l03309"></a>03309 <span class="keywordflow">break</span>; <a name="l03310"></a>03310 <a name="l03311"></a>03311 <span class="keywordflow">case</span> Dialog: <a name="l03312"></a>03312 data[0] = net_wm_window_type_dialog; <a name="l03313"></a>03313 data[1] = None; <a name="l03314"></a>03314 len = 1; <a name="l03315"></a>03315 <span class="keywordflow">break</span>; <a name="l03316"></a>03316 <a name="l03317"></a>03317 <span class="keywordflow">case</span> Menu: <a name="l03318"></a>03318 data[0] = net_wm_window_type_menu; <a name="l03319"></a>03319 data[1] = None; <a name="l03320"></a>03320 len = 1; <a name="l03321"></a>03321 <span class="keywordflow">break</span>; <a name="l03322"></a>03322 <a name="l03323"></a>03323 <span class="keywordflow">case</span> TopMenu: <a name="l03324"></a>03324 <span class="comment">// spec extension: override window type. we must comply with the spec</span> <a name="l03325"></a>03325 <span class="comment">// and provide a fall back (dock seems best)</span> <a name="l03326"></a>03326 data[0] = kde_net_wm_window_type_topmenu; <a name="l03327"></a>03327 data[1] = net_wm_window_type_dock; <a name="l03328"></a>03328 len = 2; <a name="l03329"></a>03329 <span class="keywordflow">break</span>; <a name="l03330"></a>03330 <a name="l03331"></a>03331 <span class="keywordflow">case</span> Tool: <a name="l03332"></a>03332 data[0] = net_wm_window_type_toolbar; <a name="l03333"></a>03333 data[1] = None; <a name="l03334"></a>03334 len = 1; <a name="l03335"></a>03335 <span class="keywordflow">break</span>; <a name="l03336"></a>03336 <a name="l03337"></a>03337 <span class="keywordflow">case</span> Dock: <a name="l03338"></a>03338 data[0] = net_wm_window_type_dock; <a name="l03339"></a>03339 data[1] = None; <a name="l03340"></a>03340 len = 1; <a name="l03341"></a>03341 <span class="keywordflow">break</span>; <a name="l03342"></a>03342 <a name="l03343"></a>03343 <span class="keywordflow">case</span> Desktop: <a name="l03344"></a>03344 data[0] = net_wm_window_type_desktop; <a name="l03345"></a>03345 data[1] = None; <a name="l03346"></a>03346 len = 1; <a name="l03347"></a>03347 <span class="keywordflow">break</span>; <a name="l03348"></a>03348 <a name="l03349"></a>03349 <span class="keywordflow">case</span> Utility: <a name="l03350"></a>03350 data[0] = net_wm_window_type_utility; <a name="l03351"></a>03351 data[1] = net_wm_window_type_dialog; <span class="comment">// fallback for old netwm version</span> <a name="l03352"></a>03352 len = 2; <a name="l03353"></a>03353 <span class="keywordflow">break</span>; <a name="l03354"></a>03354 <a name="l03355"></a>03355 <span class="keywordflow">case</span> Splash: <a name="l03356"></a>03356 data[0] = net_wm_window_type_splash; <a name="l03357"></a>03357 data[1] = net_wm_window_type_dock; <span class="comment">// fallback (dock seems best)</span> <a name="l03358"></a>03358 len = 2; <a name="l03359"></a>03359 <span class="keywordflow">break</span>; <a name="l03360"></a>03360 <a name="l03361"></a>03361 <span class="keywordflow">case</span> DropdownMenu: <a name="l03362"></a>03362 data[0] = net_wm_window_type_dropdown_menu; <a name="l03363"></a>03363 data[1] = None; <a name="l03364"></a>03364 len = 1; <a name="l03365"></a>03365 <span class="keywordflow">break</span>; <a name="l03366"></a>03366 <a name="l03367"></a>03367 <span class="keywordflow">case</span> PopupMenu: <a name="l03368"></a>03368 data[0] = net_wm_window_type_popup_menu; <a name="l03369"></a>03369 data[1] = None; <a name="l03370"></a>03370 len = 1; <a name="l03371"></a>03371 <span class="keywordflow">break</span>; <a name="l03372"></a>03372 <a name="l03373"></a>03373 <span class="keywordflow">case</span> Tooltip: <a name="l03374"></a>03374 data[0] = net_wm_window_type_tooltip; <a name="l03375"></a>03375 data[1] = None; <a name="l03376"></a>03376 len = 1; <a name="l03377"></a>03377 <span class="keywordflow">break</span>; <a name="l03378"></a>03378 <a name="l03379"></a>03379 <span class="keywordflow">case</span> Notification: <a name="l03380"></a>03380 data[0] = net_wm_window_type_notification; <a name="l03381"></a>03381 data[1] = None; <a name="l03382"></a>03382 len = 1; <a name="l03383"></a>03383 <span class="keywordflow">break</span>; <a name="l03384"></a>03384 <a name="l03385"></a>03385 <span class="keywordflow">case</span> ComboBox: <a name="l03386"></a>03386 data[0] = net_wm_window_type_combobox; <a name="l03387"></a>03387 data[1] = None; <a name="l03388"></a>03388 len = 1; <a name="l03389"></a>03389 <span class="keywordflow">break</span>; <a name="l03390"></a>03390 <a name="l03391"></a>03391 <span class="keywordflow">case</span> DNDIcon: <a name="l03392"></a>03392 data[0] = net_wm_window_type_dnd; <a name="l03393"></a>03393 data[1] = None; <a name="l03394"></a>03394 len = 1; <a name="l03395"></a>03395 <span class="keywordflow">break</span>; <a name="l03396"></a>03396 <a name="l03397"></a>03397 <span class="keywordflow">default</span>: <a name="l03398"></a>03398 <span class="keywordflow">case</span> Normal: <a name="l03399"></a>03399 data[0] = net_wm_window_type_normal; <a name="l03400"></a>03400 data[1] = None; <a name="l03401"></a>03401 len = 1; <a name="l03402"></a>03402 <span class="keywordflow">break</span>; <a name="l03403"></a>03403 } <a name="l03404"></a>03404 <a name="l03405"></a>03405 XChangeProperty(p->display, p->window, net_wm_window_type, XA_ATOM, 32, <a name="l03406"></a>03406 PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) &data, len); <a name="l03407"></a>03407 } <a name="l03408"></a>03408 <a name="l03409"></a>03409 <a name="l03410"></a>03410 <span class="keywordtype">void</span> NETWinInfo::setName(<span class="keyword">const</span> <span class="keywordtype">char</span> *name) { <a name="l03411"></a>03411 <span class="keywordflow">if</span> (role != Client) <span class="keywordflow">return</span>; <a name="l03412"></a>03412 <a name="l03413"></a>03413 <span class="keyword">delete</span> [] p->name; <a name="l03414"></a>03414 p->name = nstrdup(name); <a name="l03415"></a>03415 <span class="keywordflow">if</span>( p->name[ 0 ] != <span class="charliteral">'\0'</span> ) <a name="l03416"></a>03416 XChangeProperty(p->display, p->window, net_wm_name, UTF8_STRING, 8, <a name="l03417"></a>03417 PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) p->name, <a name="l03418"></a>03418 strlen(p->name)); <a name="l03419"></a>03419 <span class="keywordflow">else</span> <a name="l03420"></a>03420 XDeleteProperty(p->display, p->window, net_wm_name); <a name="l03421"></a>03421 } <a name="l03422"></a>03422 <a name="l03423"></a>03423 <a name="l03424"></a>03424 <span class="keywordtype">void</span> NETWinInfo::setVisibleName(<span class="keyword">const</span> <span class="keywordtype">char</span> *visibleName) { <a name="l03425"></a>03425 <span class="keywordflow">if</span> (role != WindowManager) <span class="keywordflow">return</span>; <a name="l03426"></a>03426 <a name="l03427"></a>03427 <span class="keyword">delete</span> [] p->visible_name; <a name="l03428"></a>03428 p->visible_name = nstrdup(visibleName); <a name="l03429"></a>03429 <span class="keywordflow">if</span>( p->visible_name[ 0 ] != <span class="charliteral">'\0'</span> ) <a name="l03430"></a>03430 XChangeProperty(p->display, p->window, net_wm_visible_name, UTF8_STRING, 8, <a name="l03431"></a>03431 PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) p->visible_name, <a name="l03432"></a>03432 strlen(p->visible_name)); <a name="l03433"></a>03433 <span class="keywordflow">else</span> <a name="l03434"></a>03434 XDeleteProperty(p->display, p->window, net_wm_visible_name); <a name="l03435"></a>03435 } <a name="l03436"></a>03436 <a name="l03437"></a>03437 <a name="l03438"></a>03438 <span class="keywordtype">void</span> NETWinInfo::setIconName(<span class="keyword">const</span> <span class="keywordtype">char</span> *iconName) { <a name="l03439"></a>03439 <span class="keywordflow">if</span> (role != Client) <span class="keywordflow">return</span>; <a name="l03440"></a>03440 <a name="l03441"></a>03441 <span class="keyword">delete</span> [] p->icon_name; <a name="l03442"></a>03442 p->icon_name = nstrdup(iconName); <a name="l03443"></a>03443 <span class="keywordflow">if</span>( p->icon_name[ 0 ] != <span class="charliteral">'\0'</span> ) <a name="l03444"></a>03444 XChangeProperty(p->display, p->window, net_wm_icon_name, UTF8_STRING, 8, <a name="l03445"></a>03445 PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) p->icon_name, <a name="l03446"></a>03446 strlen(p->icon_name)); <a name="l03447"></a>03447 <span class="keywordflow">else</span> <a name="l03448"></a>03448 XDeleteProperty(p->display, p->window, net_wm_icon_name); <a name="l03449"></a>03449 } <a name="l03450"></a>03450 <a name="l03451"></a>03451 <a name="l03452"></a>03452 <span class="keywordtype">void</span> NETWinInfo::setVisibleIconName(<span class="keyword">const</span> <span class="keywordtype">char</span> *visibleIconName) { <a name="l03453"></a>03453 <span class="keywordflow">if</span> (role != WindowManager) <span class="keywordflow">return</span>; <a name="l03454"></a>03454 <a name="l03455"></a>03455 <span class="keyword">delete</span> [] p->visible_icon_name; <a name="l03456"></a>03456 p->visible_icon_name = nstrdup(visibleIconName); <a name="l03457"></a>03457 <span class="keywordflow">if</span>( p->visible_icon_name[ 0 ] != <span class="charliteral">'\0'</span> ) <a name="l03458"></a>03458 XChangeProperty(p->display, p->window, net_wm_visible_icon_name, UTF8_STRING, 8, <a name="l03459"></a>03459 PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) p->visible_icon_name, <a name="l03460"></a>03460 strlen(p->visible_icon_name)); <a name="l03461"></a>03461 <span class="keywordflow">else</span> <a name="l03462"></a>03462 XDeleteProperty(p->display, p->window, net_wm_visible_icon_name); <a name="l03463"></a>03463 } <a name="l03464"></a>03464 <a name="l03465"></a>03465 <a name="l03466"></a>03466 <span class="keywordtype">void</span> NETWinInfo::setDesktop(<span class="keywordtype">int</span> desktop) { <a name="l03467"></a>03467 <span class="keywordflow">if</span> (p->mapping_state_dirty) <a name="l03468"></a>03468 updateWMState(); <a name="l03469"></a>03469 <a name="l03470"></a>03470 <span class="keywordflow">if</span> (role == Client && p->mapping_state != Withdrawn) { <a name="l03471"></a>03471 <span class="comment">// we only send a ClientMessage if we are 1) a client and 2) managed</span> <a name="l03472"></a>03472 <a name="l03473"></a>03473 <span class="keywordflow">if</span> ( desktop == 0 ) <a name="l03474"></a>03474 <span class="keywordflow">return</span>; <span class="comment">// we can't do that while being managed</span> <a name="l03475"></a>03475 <a name="l03476"></a>03476 XEvent e; <a name="l03477"></a>03477 <a name="l03478"></a>03478 e.xclient.type = ClientMessage; <a name="l03479"></a>03479 e.xclient.message_type = net_wm_desktop; <a name="l03480"></a>03480 e.xclient.display = p->display; <a name="l03481"></a>03481 e.xclient.window = p->window; <a name="l03482"></a>03482 e.xclient.format = 32; <a name="l03483"></a>03483 e.xclient.data.l[0] = desktop == OnAllDesktops ? OnAllDesktops : desktop - 1; <a name="l03484"></a>03484 e.xclient.data.l[1] = 0l; <a name="l03485"></a>03485 e.xclient.data.l[2] = 0l; <a name="l03486"></a>03486 e.xclient.data.l[3] = 0l; <a name="l03487"></a>03487 e.xclient.data.l[4] = 0l; <a name="l03488"></a>03488 <a name="l03489"></a>03489 XSendEvent(p->display, p->root, False, netwm_sendevent_mask, &e); <a name="l03490"></a>03490 } <span class="keywordflow">else</span> { <a name="l03491"></a>03491 <span class="comment">// otherwise we just set or remove the property directly</span> <a name="l03492"></a>03492 p->desktop = desktop; <a name="l03493"></a>03493 <span class="keywordtype">long</span> d = desktop; <a name="l03494"></a>03494 <a name="l03495"></a>03495 <span class="keywordflow">if</span> ( d != OnAllDesktops ) { <a name="l03496"></a>03496 <span class="keywordflow">if</span> ( d == 0 ) { <a name="l03497"></a>03497 XDeleteProperty( p->display, p->window, net_wm_desktop ); <a name="l03498"></a>03498 <span class="keywordflow">return</span>; <a name="l03499"></a>03499 } <a name="l03500"></a>03500 <a name="l03501"></a>03501 d -= 1; <a name="l03502"></a>03502 } <a name="l03503"></a>03503 <a name="l03504"></a>03504 XChangeProperty(p->display, p->window, net_wm_desktop, XA_CARDINAL, 32, <a name="l03505"></a>03505 PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) &d, 1); <a name="l03506"></a>03506 } <a name="l03507"></a>03507 } <a name="l03508"></a>03508 <a name="l03509"></a>03509 <a name="l03510"></a>03510 <span class="keywordtype">void</span> NETWinInfo::setPid(<span class="keywordtype">int</span> pid) { <a name="l03511"></a>03511 <span class="keywordflow">if</span> (role != Client) <span class="keywordflow">return</span>; <a name="l03512"></a>03512 <a name="l03513"></a>03513 p->pid = pid; <a name="l03514"></a>03514 <span class="keywordtype">long</span> d = pid; <a name="l03515"></a>03515 XChangeProperty(p->display, p->window, net_wm_pid, XA_CARDINAL, 32, <a name="l03516"></a>03516 PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) &d, 1); <a name="l03517"></a>03517 } <a name="l03518"></a>03518 <a name="l03519"></a>03519 <a name="l03520"></a>03520 <span class="keywordtype">void</span> NETWinInfo::setHandledIcons(Bool handled) { <a name="l03521"></a>03521 <span class="keywordflow">if</span> (role != Client) <span class="keywordflow">return</span>; <a name="l03522"></a>03522 <a name="l03523"></a>03523 p->handled_icons = handled; <a name="l03524"></a>03524 <span class="keywordtype">long</span> d = handled; <a name="l03525"></a>03525 XChangeProperty(p->display, p->window, net_wm_handled_icons, XA_CARDINAL, 32, <a name="l03526"></a>03526 PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) &d, 1); <a name="l03527"></a>03527 } <a name="l03528"></a>03528 <a name="l03529"></a>03529 <span class="keywordtype">void</span> NETWinInfo::setStartupId(<span class="keyword">const</span> <span class="keywordtype">char</span>* <span class="keywordtype">id</span>) { <a name="l03530"></a>03530 <span class="keywordflow">if</span> (role != Client) <span class="keywordflow">return</span>; <a name="l03531"></a>03531 <a name="l03532"></a>03532 <span class="keyword">delete</span>[] p->startup_id; <a name="l03533"></a>03533 p->startup_id = nstrdup(<span class="keywordtype">id</span>); <a name="l03534"></a>03534 XChangeProperty(p->display, p->window, net_startup_id, UTF8_STRING, 8, <a name="l03535"></a>03535 PropModeReplace, reinterpret_cast< unsigned char* >( p->startup_id ), <a name="l03536"></a>03536 strlen( p->startup_id )); <a name="l03537"></a>03537 } <a name="l03538"></a>03538 <a name="l03539"></a>03539 <span class="keywordtype">void</span> NETWinInfo::setAllowedActions( <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> actions ) { <a name="l03540"></a>03540 <span class="keywordflow">if</span>( role != WindowManager ) <a name="l03541"></a>03541 <span class="keywordflow">return</span>; <a name="l03542"></a>03542 <span class="keywordtype">long</span> data[50]; <a name="l03543"></a>03543 <span class="keywordtype">int</span> count = 0; <a name="l03544"></a>03544 <a name="l03545"></a>03545 p->allowed_actions = actions; <a name="l03546"></a>03546 <span class="keywordflow">if</span> (p->allowed_actions & ActionMove) data[count++] = net_wm_action_move; <a name="l03547"></a>03547 <span class="keywordflow">if</span> (p->allowed_actions & ActionResize) data[count++] = net_wm_action_resize; <a name="l03548"></a>03548 <span class="keywordflow">if</span> (p->allowed_actions & ActionMinimize) data[count++] = net_wm_action_minimize; <a name="l03549"></a>03549 <span class="keywordflow">if</span> (p->allowed_actions & ActionShade) data[count++] = net_wm_action_shade; <a name="l03550"></a>03550 <span class="keywordflow">if</span> (p->allowed_actions & ActionStick) data[count++] = net_wm_action_stick; <a name="l03551"></a>03551 <span class="keywordflow">if</span> (p->allowed_actions & ActionMaxVert) data[count++] = net_wm_action_max_vert; <a name="l03552"></a>03552 <span class="keywordflow">if</span> (p->allowed_actions & ActionMaxHoriz) data[count++] = net_wm_action_max_horiz; <a name="l03553"></a>03553 <span class="keywordflow">if</span> (p->allowed_actions & ActionFullScreen) data[count++] = net_wm_action_fullscreen; <a name="l03554"></a>03554 <span class="keywordflow">if</span> (p->allowed_actions & ActionChangeDesktop) data[count++] = net_wm_action_change_desk; <a name="l03555"></a>03555 <span class="keywordflow">if</span> (p->allowed_actions & ActionClose) data[count++] = net_wm_action_close; <a name="l03556"></a>03556 <a name="l03557"></a>03557 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l03558"></a>03558 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETWinInfo::setAllowedActions: setting property (%d)\n"</span>, count); <a name="l03559"></a>03559 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < count; i++) { <a name="l03560"></a>03560 <span class="keywordtype">char</span>* data_ret = XGetAtomName(p->display, (Atom) data[i]); <a name="l03561"></a>03561 fprintf(stderr, <span class="stringliteral">"NETWinInfo::setAllowedActions: action %ld '%s'\n"</span>, <a name="l03562"></a>03562 data[i], data_ret); <a name="l03563"></a>03563 <span class="keywordflow">if</span> ( data_ret ) <a name="l03564"></a>03564 XFree(data_ret); <a name="l03565"></a>03565 } <a name="l03566"></a>03566 <span class="preprocessor">#endif</span> <a name="l03567"></a>03567 <span class="preprocessor"></span> <a name="l03568"></a>03568 XChangeProperty(p->display, p->window, net_wm_allowed_actions, XA_ATOM, 32, <a name="l03569"></a>03569 PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) data, count); <a name="l03570"></a>03570 } <a name="l03571"></a>03571 <a name="l03572"></a>03572 <span class="keywordtype">void</span> NETWinInfo::setKDESystemTrayWinFor(Window window) { <a name="l03573"></a>03573 <span class="keywordflow">if</span> (role != Client) <span class="keywordflow">return</span>; <a name="l03574"></a>03574 <a name="l03575"></a>03575 p->kde_system_tray_win_for = window; <a name="l03576"></a>03576 XChangeProperty(p->display, p->window, kde_net_wm_system_tray_window_for, <a name="l03577"></a>03577 XA_WINDOW, 32, PropModeReplace, <a name="l03578"></a>03578 (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) &(p->kde_system_tray_win_for), 1); <a name="l03579"></a>03579 } <a name="l03580"></a>03580 <a name="l03581"></a>03581 <a name="l03582"></a>03582 <span class="keywordtype">void</span> NETWinInfo::setKDEFrameStrut(<a class="code" href="structNETStrut.html">NETStrut</a> strut) { <a name="l03583"></a>03583 setFrameExtents( strut ); <a name="l03584"></a>03584 } <a name="l03585"></a>03585 <a name="l03586"></a>03586 <span class="keywordtype">void</span> NETWinInfo::setFrameExtents(<a class="code" href="structNETStrut.html">NETStrut</a> strut) { <a name="l03587"></a>03587 <span class="keywordflow">if</span> (role != WindowManager) <span class="keywordflow">return</span>; <a name="l03588"></a>03588 <a name="l03589"></a>03589 p->frame_strut = strut; <a name="l03590"></a>03590 <a name="l03591"></a>03591 <span class="keywordtype">long</span> d[4]; <a name="l03592"></a>03592 d[0] = strut.<a class="code" href="structNETStrut.html#a3ffe1d55e64632f4cdc1225ae8a301df" title="Left border of the strut.">left</a>; <a name="l03593"></a>03593 d[1] = strut.<a class="code" href="structNETStrut.html#a46c92f5dc806d6def2390f258d00b80e" title="Right border of the strut.">right</a>; <a name="l03594"></a>03594 d[2] = strut.<a class="code" href="structNETStrut.html#ac359ac56290a66002010f64dc4842aa2" title="Top border of the strut.">top</a>; <a name="l03595"></a>03595 d[3] = strut.<a class="code" href="structNETStrut.html#a031e023bb8f0c8cf3d00b748c7dd7ca7" title="Bottom border of the strut.">bottom</a>; <a name="l03596"></a>03596 <a name="l03597"></a>03597 XChangeProperty(p->display, p->window, net_frame_extents, XA_CARDINAL, 32, <a name="l03598"></a>03598 PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) d, 4); <a name="l03599"></a>03599 XChangeProperty(p->display, p->window, kde_net_wm_frame_strut, XA_CARDINAL, 32, <a name="l03600"></a>03600 PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) d, 4); <a name="l03601"></a>03601 } <a name="l03602"></a>03602 <a name="l03603"></a>03603 <a name="l03604"></a>03604 <span class="keywordtype">void</span> NETWinInfo::kdeGeometry(<a class="code" href="structNETRect.html" title="Simple rectangle class for NET classes.">NETRect</a>& frame, <a class="code" href="structNETRect.html" title="Simple rectangle class for NET classes.">NETRect</a>& window) { <a name="l03605"></a>03605 <span class="keywordflow">if</span> (p->win_geom.size.width == 0 || p->win_geom.size.height == 0) { <a name="l03606"></a>03606 Window unused; <a name="l03607"></a>03607 <span class="keywordtype">int</span> x, y; <a name="l03608"></a>03608 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> w, h, junk; <a name="l03609"></a>03609 XGetGeometry(p->display, p->window, &unused, &x, &y, &w, &h, &junk, &junk); <a name="l03610"></a>03610 XTranslateCoordinates(p->display, p->window, p->root, 0, 0, &x, &y, &unused <a name="l03611"></a>03611 ); <a name="l03612"></a>03612 <a name="l03613"></a>03613 p->win_geom.pos.x = x; <a name="l03614"></a>03614 p->win_geom.pos.y = y; <a name="l03615"></a>03615 <a name="l03616"></a>03616 p->win_geom.size.width = w; <a name="l03617"></a>03617 p->win_geom.size.height = h; <a name="l03618"></a>03618 } <a name="l03619"></a>03619 <span class="comment">// TODO try to work also without _KDE_NET_WM_FRAME_STRUT</span> <a name="l03620"></a>03620 window = p->win_geom; <a name="l03621"></a>03621 <a name="l03622"></a>03622 frame.<a class="code" href="structNETRect.html#a2604a60ef01bb245df79ada826b1718d" title="Position of the rectangle.">pos</a>.<a class="code" href="structNETPoint.html#a662b6d948b949dabcaf2e955a078e63f" title="x coordinate.">x</a> = window.<a class="code" href="structNETRect.html#a2604a60ef01bb245df79ada826b1718d" title="Position of the rectangle.">pos</a>.<a class="code" href="structNETPoint.html#a662b6d948b949dabcaf2e955a078e63f" title="x coordinate.">x</a> - p->frame_strut.left; <a name="l03623"></a>03623 frame.<a class="code" href="structNETRect.html#a2604a60ef01bb245df79ada826b1718d" title="Position of the rectangle.">pos</a>.<a class="code" href="structNETPoint.html#ac64b3831f6fd7f1874f7e344beb117bd" title="y coordinate">y</a> = window.<a class="code" href="structNETRect.html#a2604a60ef01bb245df79ada826b1718d" title="Position of the rectangle.">pos</a>.<a class="code" href="structNETPoint.html#ac64b3831f6fd7f1874f7e344beb117bd" title="y coordinate">y</a> - p->frame_strut.top; <a name="l03624"></a>03624 frame.<a class="code" href="structNETRect.html#a97102c18e356965d829855c570bb45ca" title="Size of the rectangle.">size</a>.<a class="code" href="structNETSize.html#af2e6a5fcac88037fa745273e85c5e219" title="Width.">width</a> = window.<a class="code" href="structNETRect.html#a97102c18e356965d829855c570bb45ca" title="Size of the rectangle.">size</a>.<a class="code" href="structNETSize.html#af2e6a5fcac88037fa745273e85c5e219" title="Width.">width</a> + p->frame_strut.left + p->frame_strut.right; <a name="l03625"></a>03625 frame.<a class="code" href="structNETRect.html#a97102c18e356965d829855c570bb45ca" title="Size of the rectangle.">size</a>.<a class="code" href="structNETSize.html#a0a6def5683983f7f3478192248ef2f8e" title="Height.">height</a> = window.<a class="code" href="structNETRect.html#a97102c18e356965d829855c570bb45ca" title="Size of the rectangle.">size</a>.<a class="code" href="structNETSize.html#a0a6def5683983f7f3478192248ef2f8e" title="Height.">height</a> + p->frame_strut.top + p->frame_strut.bottom; <a name="l03626"></a>03626 } <a name="l03627"></a>03627 <a name="l03628"></a>03628 <a name="l03629"></a>03629 <a class="code" href="structNETIcon.html" title="Simple icon class for NET classes.">NETIcon</a> NETWinInfo::icon(<span class="keywordtype">int</span> width, <span class="keywordtype">int</span> height)<span class="keyword"> const </span>{ <a name="l03630"></a>03630 <span class="keywordflow">return</span> iconInternal( p->icons, p->icon_count, width, height ); <a name="l03631"></a>03631 } <a name="l03632"></a>03632 <a name="l03633"></a>03633 <a class="code" href="structNETIcon.html" title="Simple icon class for NET classes.">NETIcon</a> NETWinInfo::iconInternal(NETRArray<NETIcon>& icons, <span class="keywordtype">int</span> icon_count, <span class="keywordtype">int</span> width, <span class="keywordtype">int</span> height)<span class="keyword"> const </span>{ <a name="l03634"></a>03634 <a class="code" href="structNETIcon.html" title="Simple icon class for NET classes.">NETIcon</a> result; <a name="l03635"></a>03635 <a name="l03636"></a>03636 <span class="keywordflow">if</span> ( !icon_count ) { <a name="l03637"></a>03637 result.<a class="code" href="structNETIcon.html#a6506944fe7143f0a37bbe58cc0d8df94" title="Size of the icon.">size</a>.<a class="code" href="structNETSize.html#af2e6a5fcac88037fa745273e85c5e219" title="Width.">width</a> = 0; <a name="l03638"></a>03638 result.<a class="code" href="structNETIcon.html#a6506944fe7143f0a37bbe58cc0d8df94" title="Size of the icon.">size</a>.<a class="code" href="structNETSize.html#a0a6def5683983f7f3478192248ef2f8e" title="Height.">height</a> = 0; <a name="l03639"></a>03639 result.<a class="code" href="structNETIcon.html#aaa6c9f9828e7d2f9a29f408529a68822" title="Image data for the icon.">data</a> = 0; <a name="l03640"></a>03640 <span class="keywordflow">return</span> result; <a name="l03641"></a>03641 } <a name="l03642"></a>03642 <a name="l03643"></a>03643 <span class="comment">// find the largest icon</span> <a name="l03644"></a>03644 result = icons[0]; <a name="l03645"></a>03645 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 1; i < icons.size(); i++) { <a name="l03646"></a>03646 <span class="keywordflow">if</span>( icons[i].size.width >= result.<a class="code" href="structNETIcon.html#a6506944fe7143f0a37bbe58cc0d8df94" title="Size of the icon.">size</a>.<a class="code" href="structNETSize.html#af2e6a5fcac88037fa745273e85c5e219" title="Width.">width</a> && <a name="l03647"></a>03647 icons[i].size.height >= result.<a class="code" href="structNETIcon.html#a6506944fe7143f0a37bbe58cc0d8df94" title="Size of the icon.">size</a>.<a class="code" href="structNETSize.html#a0a6def5683983f7f3478192248ef2f8e" title="Height.">height</a> ) <a name="l03648"></a>03648 result = icons[i]; <a name="l03649"></a>03649 } <a name="l03650"></a>03650 <a name="l03651"></a>03651 <span class="comment">// return the largest icon if w and h are -1</span> <a name="l03652"></a>03652 <span class="keywordflow">if</span> (width == -1 && height == -1) <span class="keywordflow">return</span> result; <a name="l03653"></a>03653 <a name="l03654"></a>03654 <span class="comment">// find the icon that's closest in size to w x h...</span> <a name="l03655"></a>03655 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < icons.size(); i++) { <a name="l03656"></a>03656 <span class="keywordflow">if</span> ((icons[i].size.width >= width && <a name="l03657"></a>03657 icons[i].size.width < result.<a class="code" href="structNETIcon.html#a6506944fe7143f0a37bbe58cc0d8df94" title="Size of the icon.">size</a>.<a class="code" href="structNETSize.html#af2e6a5fcac88037fa745273e85c5e219" title="Width.">width</a>) && <a name="l03658"></a>03658 (icons[i].size.height >= height && <a name="l03659"></a>03659 icons[i].size.height < result.<a class="code" href="structNETIcon.html#a6506944fe7143f0a37bbe58cc0d8df94" title="Size of the icon.">size</a>.<a class="code" href="structNETSize.html#a0a6def5683983f7f3478192248ef2f8e" title="Height.">height</a>)) <a name="l03660"></a>03660 result = icons[i]; <a name="l03661"></a>03661 } <a name="l03662"></a>03662 <a name="l03663"></a>03663 <span class="keywordflow">return</span> result; <a name="l03664"></a>03664 } <a name="l03665"></a>03665 <a name="l03666"></a>03666 <span class="keywordtype">void</span> NETWinInfo::setUserTime( Time time ) { <a name="l03667"></a>03667 <span class="keywordflow">if</span> (role != Client) <span class="keywordflow">return</span>; <a name="l03668"></a>03668 <a name="l03669"></a>03669 p->user_time = time; <a name="l03670"></a>03670 <span class="keywordtype">long</span> d = time; <a name="l03671"></a>03671 XChangeProperty(p->display, p->window, net_wm_user_time, XA_CARDINAL, 32, <a name="l03672"></a>03672 PropModeReplace, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) &d, 1); <a name="l03673"></a>03673 } <a name="l03674"></a>03674 <a name="l03675"></a>03675 <a name="l03676"></a>03676 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> NETWinInfo::event(XEvent *ev ) <a name="l03677"></a>03677 { <a name="l03678"></a>03678 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> props[ 1 ]; <a name="l03679"></a>03679 event( ev, props, 1 ); <a name="l03680"></a>03680 <span class="keywordflow">return</span> props[ 0 ]; <a name="l03681"></a>03681 } <a name="l03682"></a>03682 <a name="l03683"></a>03683 <span class="keywordtype">void</span> NETWinInfo::event(XEvent *event, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>* properties, <span class="keywordtype">int</span> properties_size ) { <a name="l03684"></a>03684 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> props[ PROPERTIES_SIZE ] = { 0, 0 }; <a name="l03685"></a>03685 assert( PROPERTIES_SIZE == 2 ); <span class="comment">// add elements above</span> <a name="l03686"></a>03686 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>& dirty = props[ PROTOCOLS ]; <a name="l03687"></a>03687 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>& dirty2 = props[ PROTOCOLS2 ]; <a name="l03688"></a>03688 <span class="keywordtype">bool</span> do_update = <span class="keyword">false</span>; <a name="l03689"></a>03689 <a name="l03690"></a>03690 <span class="keywordflow">if</span> (role == WindowManager && event->type == ClientMessage && <a name="l03691"></a>03691 event->xclient.format == 32) { <a name="l03692"></a>03692 <a name="l03693"></a>03693 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l03694"></a>03694 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETWinInfo::event: handling ClientMessage event\n"</span>); <a name="l03695"></a>03695 <span class="preprocessor">#endif // NETWMDEBUG</span> <a name="l03696"></a>03696 <span class="preprocessor"></span> <a name="l03697"></a>03697 <span class="keywordflow">if</span> (event->xclient.message_type == net_wm_state) { <a name="l03698"></a>03698 dirty = WMState; <a name="l03699"></a>03699 <a name="l03700"></a>03700 <span class="comment">// we need to generate a change mask</span> <a name="l03701"></a>03701 <a name="l03702"></a>03702 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l03703"></a>03703 <span class="preprocessor"></span> fprintf(stderr, <a name="l03704"></a>03704 <span class="stringliteral">"NETWinInfo::event: state client message, getting new state/mask\n"</span>); <a name="l03705"></a>03705 <span class="preprocessor">#endif</span> <a name="l03706"></a>03706 <span class="preprocessor"></span> <a name="l03707"></a>03707 <span class="keywordtype">int</span> i; <a name="l03708"></a>03708 <span class="keywordtype">long</span> state = 0, mask = 0; <a name="l03709"></a>03709 <a name="l03710"></a>03710 <span class="keywordflow">for</span> (i = 1; i < 3; i++) { <a name="l03711"></a>03711 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l03712"></a>03712 <span class="preprocessor"></span> <span class="keywordtype">char</span>* debug_txt = XGetAtomName(p->display, (Atom) event->xclient.data.l[i]); <a name="l03713"></a>03713 fprintf(stderr, <span class="stringliteral">"NETWinInfo::event: message %ld '%s'\n"</span>, <a name="l03714"></a>03714 event->xclient.data.l[i], debug_txt ); <a name="l03715"></a>03715 <span class="keywordflow">if</span> ( debug_txt ) <a name="l03716"></a>03716 XFree( debug_txt ); <a name="l03717"></a>03717 <span class="preprocessor">#endif</span> <a name="l03718"></a>03718 <span class="preprocessor"></span> <a name="l03719"></a>03719 <span class="keywordflow">if</span> ((Atom) event->xclient.data.l[i] == net_wm_state_modal) <a name="l03720"></a>03720 mask |= Modal; <a name="l03721"></a>03721 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) event->xclient.data.l[i] == net_wm_state_sticky) <a name="l03722"></a>03722 mask |= Sticky; <a name="l03723"></a>03723 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) event->xclient.data.l[i] == net_wm_state_max_vert) <a name="l03724"></a>03724 mask |= MaxVert; <a name="l03725"></a>03725 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) event->xclient.data.l[i] == net_wm_state_max_horiz) <a name="l03726"></a>03726 mask |= MaxHoriz; <a name="l03727"></a>03727 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) event->xclient.data.l[i] == net_wm_state_shaded) <a name="l03728"></a>03728 mask |= Shaded; <a name="l03729"></a>03729 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) event->xclient.data.l[i] == net_wm_state_skip_taskbar) <a name="l03730"></a>03730 mask |= SkipTaskbar; <a name="l03731"></a>03731 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) event->xclient.data.l[i] == net_wm_state_skip_pager) <a name="l03732"></a>03732 mask |= SkipPager; <a name="l03733"></a>03733 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) event->xclient.data.l[i] == net_wm_state_hidden) <a name="l03734"></a>03734 mask |= Hidden; <a name="l03735"></a>03735 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) event->xclient.data.l[i] == net_wm_state_fullscreen) <a name="l03736"></a>03736 mask |= FullScreen; <a name="l03737"></a>03737 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) event->xclient.data.l[i] == net_wm_state_above) <a name="l03738"></a>03738 mask |= KeepAbove; <a name="l03739"></a>03739 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) event->xclient.data.l[i] == net_wm_state_below) <a name="l03740"></a>03740 mask |= KeepBelow; <a name="l03741"></a>03741 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) event->xclient.data.l[i] == net_wm_state_demands_attention) <a name="l03742"></a>03742 mask |= DemandsAttention; <a name="l03743"></a>03743 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) event->xclient.data.l[i] == net_wm_state_stays_on_top) <a name="l03744"></a>03744 mask |= StaysOnTop; <a name="l03745"></a>03745 } <a name="l03746"></a>03746 <a name="l03747"></a>03747 <span class="comment">// when removing, we just leave newstate == 0</span> <a name="l03748"></a>03748 <span class="keywordflow">switch</span> (event->xclient.data.l[0]) { <a name="l03749"></a>03749 <span class="keywordflow">case</span> 1: <span class="comment">// set</span> <a name="l03750"></a>03750 <span class="comment">// to set... the change state should be the same as the mask</span> <a name="l03751"></a>03751 state = mask; <a name="l03752"></a>03752 <span class="keywordflow">break</span>; <a name="l03753"></a>03753 <a name="l03754"></a>03754 <span class="keywordflow">case</span> 2: <span class="comment">// toggle</span> <a name="l03755"></a>03755 <span class="comment">// to toggle, we need to xor the current state with the new state</span> <a name="l03756"></a>03756 state = (p->state & mask) ^ mask; <a name="l03757"></a>03757 <span class="keywordflow">break</span>; <a name="l03758"></a>03758 <a name="l03759"></a>03759 <span class="keywordflow">default</span>: <a name="l03760"></a>03760 <span class="comment">// to clear state, the new state should stay zero</span> <a name="l03761"></a>03761 ; <a name="l03762"></a>03762 } <a name="l03763"></a>03763 <a name="l03764"></a>03764 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l03765"></a>03765 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETWinInfo::event: calling changeState(%lx, %lx)\n"</span>, <a name="l03766"></a>03766 state, mask); <a name="l03767"></a>03767 <span class="preprocessor">#endif</span> <a name="l03768"></a>03768 <span class="preprocessor"></span> <a name="l03769"></a>03769 changeState(state, mask); <a name="l03770"></a>03770 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (event->xclient.message_type == net_wm_desktop) { <a name="l03771"></a>03771 dirty = WMDesktop; <a name="l03772"></a>03772 <a name="l03773"></a>03773 <span class="keywordflow">if</span>( event->xclient.data.l[0] == OnAllDesktops ) <a name="l03774"></a>03774 changeDesktop( OnAllDesktops ); <a name="l03775"></a>03775 <span class="keywordflow">else</span> <a name="l03776"></a>03776 changeDesktop(event->xclient.data.l[0] + 1); <a name="l03777"></a>03777 } <a name="l03778"></a>03778 } <a name="l03779"></a>03779 <a name="l03780"></a>03780 <span class="keywordflow">if</span> (event->type == PropertyNotify) { <a name="l03781"></a>03781 <a name="l03782"></a>03782 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l03783"></a>03783 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETWinInfo::event: handling PropertyNotify event\n"</span>); <a name="l03784"></a>03784 <span class="preprocessor">#endif</span> <a name="l03785"></a>03785 <span class="preprocessor"></span> <a name="l03786"></a>03786 XEvent pe = *event; <a name="l03787"></a>03787 <a name="l03788"></a>03788 Bool done = False; <a name="l03789"></a>03789 Bool compaction = False; <a name="l03790"></a>03790 <span class="keywordflow">while</span> (! done) { <a name="l03791"></a>03791 <a name="l03792"></a>03792 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l03793"></a>03793 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETWinInfo::event: loop fire\n"</span>); <a name="l03794"></a>03794 <span class="preprocessor">#endif</span> <a name="l03795"></a>03795 <span class="preprocessor"></span> <a name="l03796"></a>03796 <span class="keywordflow">if</span> (pe.xproperty.atom == net_wm_name) <a name="l03797"></a>03797 dirty |= WMName; <a name="l03798"></a>03798 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pe.xproperty.atom == net_wm_visible_name) <a name="l03799"></a>03799 dirty |= WMVisibleName; <a name="l03800"></a>03800 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pe.xproperty.atom == net_wm_desktop) <a name="l03801"></a>03801 dirty |= WMDesktop; <a name="l03802"></a>03802 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pe.xproperty.atom == net_wm_window_type) <a name="l03803"></a>03803 dirty |=WMWindowType; <a name="l03804"></a>03804 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pe.xproperty.atom == net_wm_state) <a name="l03805"></a>03805 dirty |= WMState; <a name="l03806"></a>03806 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pe.xproperty.atom == net_wm_strut) <a name="l03807"></a>03807 dirty |= WMStrut; <a name="l03808"></a>03808 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pe.xproperty.atom == net_wm_extended_strut) <a name="l03809"></a>03809 dirty2 |= WM2ExtendedStrut; <a name="l03810"></a>03810 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pe.xproperty.atom == net_wm_icon_geometry) <a name="l03811"></a>03811 dirty |= WMIconGeometry; <a name="l03812"></a>03812 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pe.xproperty.atom == net_wm_icon) <a name="l03813"></a>03813 dirty |= WMIcon; <a name="l03814"></a>03814 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pe.xproperty.atom == net_wm_pid) <a name="l03815"></a>03815 dirty |= WMPid; <a name="l03816"></a>03816 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pe.xproperty.atom == net_wm_handled_icons) <a name="l03817"></a>03817 dirty |= WMHandledIcons; <a name="l03818"></a>03818 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pe.xproperty.atom == net_startup_id) <a name="l03819"></a>03819 dirty2 |= WM2StartupId; <a name="l03820"></a>03820 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pe.xproperty.atom == net_wm_allowed_actions) <a name="l03821"></a>03821 dirty2 |= WM2AllowedActions; <a name="l03822"></a>03822 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pe.xproperty.atom == kde_net_wm_system_tray_window_for) <a name="l03823"></a>03823 dirty |= WMKDESystemTrayWinFor; <a name="l03824"></a>03824 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pe.xproperty.atom == xa_wm_state) <a name="l03825"></a>03825 dirty |= XAWMState; <a name="l03826"></a>03826 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pe.xproperty.atom == net_frame_extents) <a name="l03827"></a>03827 dirty |= WMFrameExtents; <a name="l03828"></a>03828 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pe.xproperty.atom == kde_net_wm_frame_strut) <a name="l03829"></a>03829 dirty |= WMKDEFrameStrut; <a name="l03830"></a>03830 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pe.xproperty.atom == net_wm_icon_name) <a name="l03831"></a>03831 dirty |= WMIconName; <a name="l03832"></a>03832 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pe.xproperty.atom == net_wm_visible_icon_name) <a name="l03833"></a>03833 dirty |= WMVisibleIconName; <a name="l03834"></a>03834 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pe.xproperty.atom == net_wm_user_time) <a name="l03835"></a>03835 dirty2 |= WM2UserTime; <a name="l03836"></a>03836 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pe.xproperty.atom == XA_WM_HINTS) <a name="l03837"></a>03837 dirty2 |= WM2GroupLeader; <a name="l03838"></a>03838 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pe.xproperty.atom == XA_WM_TRANSIENT_FOR) <a name="l03839"></a>03839 dirty2 |= WM2TransientFor; <a name="l03840"></a>03840 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pe.xproperty.atom == XA_WM_CLASS) <a name="l03841"></a>03841 dirty2 |= WM2WindowClass; <a name="l03842"></a>03842 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pe.xproperty.atom == wm_window_role) <a name="l03843"></a>03843 dirty2 |= WM2WindowRole; <a name="l03844"></a>03844 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pe.xproperty.atom == XA_WM_CLIENT_MACHINE) <a name="l03845"></a>03845 dirty2 |= WM2ClientMachine; <a name="l03846"></a>03846 <span class="keywordflow">else</span> { <a name="l03847"></a>03847 <a name="l03848"></a>03848 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l03849"></a>03849 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETWinInfo::event: putting back event and breaking\n"</span>); <a name="l03850"></a>03850 <span class="preprocessor">#endif</span> <a name="l03851"></a>03851 <span class="preprocessor"></span> <a name="l03852"></a>03852 <span class="keywordflow">if</span> ( compaction ) <a name="l03853"></a>03853 XPutBackEvent(p->display, &pe); <a name="l03854"></a>03854 <span class="keywordflow">break</span>; <a name="l03855"></a>03855 } <a name="l03856"></a>03856 <a name="l03857"></a>03857 <span class="keywordflow">if</span> (XCheckTypedWindowEvent(p->display, p->window, PropertyNotify, &pe) ) <a name="l03858"></a>03858 compaction = True; <a name="l03859"></a>03859 <span class="keywordflow">else</span> <a name="l03860"></a>03860 <span class="keywordflow">break</span>; <a name="l03861"></a>03861 } <a name="l03862"></a>03862 <a name="l03863"></a>03863 do_update = <span class="keyword">true</span>; <a name="l03864"></a>03864 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (event->type == ConfigureNotify) { <a name="l03865"></a>03865 <a name="l03866"></a>03866 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l03867"></a>03867 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETWinInfo::event: handling ConfigureNotify event\n"</span>); <a name="l03868"></a>03868 <span class="preprocessor">#endif</span> <a name="l03869"></a>03869 <span class="preprocessor"></span> <a name="l03870"></a>03870 dirty |= WMGeometry; <a name="l03871"></a>03871 <a name="l03872"></a>03872 <span class="comment">// update window geometry</span> <a name="l03873"></a>03873 p->win_geom.pos.x = <span class="keyword">event</span>->xconfigure.x; <a name="l03874"></a>03874 p->win_geom.pos.y = <span class="keyword">event</span>->xconfigure.y; <a name="l03875"></a>03875 p->win_geom.size.width = <span class="keyword">event</span>->xconfigure.width; <a name="l03876"></a>03876 p->win_geom.size.height = <span class="keyword">event</span>->xconfigure.height; <a name="l03877"></a>03877 } <a name="l03878"></a>03878 <a name="l03879"></a>03879 <span class="keywordflow">if</span>( do_update ) <a name="l03880"></a>03880 update( props ); <a name="l03881"></a>03881 <a name="l03882"></a>03882 <span class="keywordflow">if</span>( properties_size > PROPERTIES_SIZE ) <a name="l03883"></a>03883 properties_size = PROPERTIES_SIZE; <a name="l03884"></a>03884 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = 0; <a name="l03885"></a>03885 i < properties_size; <a name="l03886"></a>03886 ++i ) <a name="l03887"></a>03887 properties[ i ] = props[ i ]; <a name="l03888"></a>03888 } <a name="l03889"></a>03889 <a name="l03890"></a>03890 <span class="keywordtype">void</span> NETWinInfo::updateWMState() { <a name="l03891"></a>03891 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> props[ PROPERTIES_SIZE ] = { XAWMState, 0 }; <a name="l03892"></a>03892 assert( PROPERTIES_SIZE == 2 ); <span class="comment">// add elements above</span> <a name="l03893"></a>03893 update( props ); <a name="l03894"></a>03894 } <a name="l03895"></a>03895 <a name="l03896"></a>03896 <span class="keywordtype">void</span> NETWinInfo::update(<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> dirty_props[]) { <a name="l03897"></a>03897 Atom type_ret; <a name="l03898"></a>03898 <span class="keywordtype">int</span> format_ret; <a name="l03899"></a>03899 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> nitems_ret, unused; <a name="l03900"></a>03900 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *data_ret; <a name="l03901"></a>03901 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> props[ PROPERTIES_SIZE ]; <a name="l03902"></a>03902 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = 0; <a name="l03903"></a>03903 i < PROPERTIES_SIZE; <a name="l03904"></a>03904 ++i ) <a name="l03905"></a>03905 props[ i ] = dirty_props[ i ] & p->properties[ i ]; <a name="l03906"></a>03906 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>& dirty = props[ PROTOCOLS ]; <a name="l03907"></a>03907 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>& dirty2 = props[ PROTOCOLS2 ]; <a name="l03908"></a>03908 <a name="l03909"></a>03909 <span class="comment">// we *always* want to update WM_STATE if set in dirty_props</span> <a name="l03910"></a>03910 <span class="keywordflow">if</span>( dirty_props[ PROTOCOLS ] & XAWMState ) <a name="l03911"></a>03911 props[ PROTOCOLS ] |= XAWMState; <a name="l03912"></a>03912 <a name="l03913"></a>03913 <span class="keywordflow">if</span> (dirty & XAWMState) { <a name="l03914"></a>03914 p->mapping_state = Withdrawn; <a name="l03915"></a>03915 <span class="keywordflow">if</span> (XGetWindowProperty(p->display, p->window, xa_wm_state, 0l, 1l, <a name="l03916"></a>03916 False, xa_wm_state, &type_ret, &format_ret, <a name="l03917"></a>03917 &nitems_ret, &unused, &data_ret) <a name="l03918"></a>03918 == Success) { <a name="l03919"></a>03919 <span class="keywordflow">if</span> (type_ret == xa_wm_state && format_ret == 32 && <a name="l03920"></a>03920 nitems_ret == 1) { <a name="l03921"></a>03921 <span class="keywordtype">long</span> *state = (<span class="keywordtype">long</span> *) data_ret; <a name="l03922"></a>03922 <a name="l03923"></a>03923 <span class="keywordflow">switch</span>(*state) { <a name="l03924"></a>03924 <span class="keywordflow">case</span> IconicState: <a name="l03925"></a>03925 p->mapping_state = Iconic; <a name="l03926"></a>03926 <span class="keywordflow">break</span>; <a name="l03927"></a>03927 <span class="keywordflow">case</span> NormalState: <a name="l03928"></a>03928 p->mapping_state = Visible; <a name="l03929"></a>03929 <span class="keywordflow">break</span>; <a name="l03930"></a>03930 <span class="keywordflow">case</span> WithdrawnState: <a name="l03931"></a>03931 <span class="keywordflow">default</span>: <a name="l03932"></a>03932 p->mapping_state = Withdrawn; <a name="l03933"></a>03933 <span class="keywordflow">break</span>; <a name="l03934"></a>03934 } <a name="l03935"></a>03935 <a name="l03936"></a>03936 p->mapping_state_dirty = False; <a name="l03937"></a>03937 } <a name="l03938"></a>03938 <span class="keywordflow">if</span> ( data_ret ) <a name="l03939"></a>03939 XFree(data_ret); <a name="l03940"></a>03940 } <a name="l03941"></a>03941 } <a name="l03942"></a>03942 <a name="l03943"></a>03943 <span class="keywordflow">if</span> (dirty & WMState) { <a name="l03944"></a>03944 p->state = 0; <a name="l03945"></a>03945 <span class="keywordflow">if</span> (XGetWindowProperty(p->display, p->window, net_wm_state, 0l, 2048l, <a name="l03946"></a>03946 False, XA_ATOM, &type_ret, &format_ret, <a name="l03947"></a>03947 &nitems_ret, &unused, &data_ret) <a name="l03948"></a>03948 == Success) { <a name="l03949"></a>03949 <span class="keywordflow">if</span> (type_ret == XA_ATOM && format_ret == 32 && nitems_ret > 0) { <a name="l03950"></a>03950 <span class="comment">// determine window state</span> <a name="l03951"></a>03951 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l03952"></a>03952 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETWinInfo::update: updating window state (%ld)\n"</span>, <a name="l03953"></a>03953 nitems_ret); <a name="l03954"></a>03954 <span class="preprocessor">#endif</span> <a name="l03955"></a>03955 <span class="preprocessor"></span> <a name="l03956"></a>03956 <span class="keywordtype">long</span> *states = (<span class="keywordtype">long</span> *) data_ret; <a name="l03957"></a>03957 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> count; <a name="l03958"></a>03958 <a name="l03959"></a>03959 <span class="keywordflow">for</span> (count = 0; count < nitems_ret; count++) { <a name="l03960"></a>03960 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l03961"></a>03961 <span class="preprocessor"></span> <span class="keywordtype">char</span>* data_ret = XGetAtomName(p->display, (Atom) states[count]); <a name="l03962"></a>03962 fprintf(stderr, <a name="l03963"></a>03963 <span class="stringliteral">"NETWinInfo::update: adding window state %ld '%s'\n"</span>, <a name="l03964"></a>03964 states[count], data_ret ); <a name="l03965"></a>03965 <span class="keywordflow">if</span> ( data_ret ) <a name="l03966"></a>03966 XFree( data_ret ); <a name="l03967"></a>03967 <span class="preprocessor">#endif</span> <a name="l03968"></a>03968 <span class="preprocessor"></span> <a name="l03969"></a>03969 <span class="keywordflow">if</span> ((Atom) states[count] == net_wm_state_modal) <a name="l03970"></a>03970 p->state |= Modal; <a name="l03971"></a>03971 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) states[count] == net_wm_state_sticky) <a name="l03972"></a>03972 p->state |= Sticky; <a name="l03973"></a>03973 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) states[count] == net_wm_state_max_vert) <a name="l03974"></a>03974 p->state |= MaxVert; <a name="l03975"></a>03975 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) states[count] == net_wm_state_max_horiz) <a name="l03976"></a>03976 p->state |= MaxHoriz; <a name="l03977"></a>03977 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) states[count] == net_wm_state_shaded) <a name="l03978"></a>03978 p->state |= Shaded; <a name="l03979"></a>03979 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) states[count] == net_wm_state_skip_taskbar) <a name="l03980"></a>03980 p->state |= SkipTaskbar; <a name="l03981"></a>03981 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) states[count] == net_wm_state_skip_pager) <a name="l03982"></a>03982 p->state |= SkipPager; <a name="l03983"></a>03983 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) states[count] == net_wm_state_hidden) <a name="l03984"></a>03984 p->state |= Hidden; <a name="l03985"></a>03985 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) states[count] == net_wm_state_fullscreen) <a name="l03986"></a>03986 p->state |= FullScreen; <a name="l03987"></a>03987 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) states[count] == net_wm_state_above) <a name="l03988"></a>03988 p->state |= KeepAbove; <a name="l03989"></a>03989 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) states[count] == net_wm_state_below) <a name="l03990"></a>03990 p->state |= KeepBelow; <a name="l03991"></a>03991 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) states[count] == net_wm_state_demands_attention) <a name="l03992"></a>03992 p->state |= DemandsAttention; <a name="l03993"></a>03993 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) states[count] == net_wm_state_stays_on_top) <a name="l03994"></a>03994 p->state |= StaysOnTop; <a name="l03995"></a>03995 } <a name="l03996"></a>03996 } <a name="l03997"></a>03997 <span class="keywordflow">if</span> ( data_ret ) <a name="l03998"></a>03998 XFree(data_ret); <a name="l03999"></a>03999 } <a name="l04000"></a>04000 } <a name="l04001"></a>04001 <a name="l04002"></a>04002 <span class="keywordflow">if</span> (dirty & WMDesktop) { <a name="l04003"></a>04003 p->desktop = 0; <a name="l04004"></a>04004 <span class="keywordflow">if</span> (XGetWindowProperty(p->display, p->window, net_wm_desktop, 0l, 1l, <a name="l04005"></a>04005 False, XA_CARDINAL, &type_ret, <a name="l04006"></a>04006 &format_ret, &nitems_ret, <a name="l04007"></a>04007 &unused, &data_ret) <a name="l04008"></a>04008 == Success) { <a name="l04009"></a>04009 <span class="keywordflow">if</span> (type_ret == XA_CARDINAL && format_ret == 32 && <a name="l04010"></a>04010 nitems_ret == 1) { <a name="l04011"></a>04011 p->desktop = *((<span class="keywordtype">long</span> *) data_ret); <a name="l04012"></a>04012 <span class="keywordflow">if</span> ((<span class="keywordtype">signed</span>) p->desktop != OnAllDesktops) <a name="l04013"></a>04013 p->desktop++; <a name="l04014"></a>04014 <a name="l04015"></a>04015 if ( p->desktop == 0 ) <a name="l04016"></a>04016 p->desktop = OnAllDesktops; <a name="l04017"></a>04017 } <a name="l04018"></a>04018 <span class="keywordflow">if</span> ( data_ret ) <a name="l04019"></a>04019 XFree(data_ret); <a name="l04020"></a>04020 } <a name="l04021"></a>04021 } <a name="l04022"></a>04022 <a name="l04023"></a>04023 <span class="keywordflow">if</span> (dirty & WMName) { <a name="l04024"></a>04024 <span class="keyword">delete</span>[] p->name; <a name="l04025"></a>04025 p->name = NULL; <a name="l04026"></a>04026 <span class="keywordflow">if</span> (XGetWindowProperty(p->display, p->window, net_wm_name, 0l, <a name="l04027"></a>04027 MAX_PROP_SIZE, False, UTF8_STRING, &type_ret, <a name="l04028"></a>04028 &format_ret, &nitems_ret, &unused, &data_ret) <a name="l04029"></a>04029 == Success) { <a name="l04030"></a>04030 <span class="keywordflow">if</span> (type_ret == UTF8_STRING && format_ret == 8 && nitems_ret > 0) { <a name="l04031"></a>04031 p->name = nstrndup((<span class="keyword">const</span> <span class="keywordtype">char</span> *) data_ret, nitems_ret); <a name="l04032"></a>04032 } <a name="l04033"></a>04033 <a name="l04034"></a>04034 <span class="keywordflow">if</span>( data_ret ) <a name="l04035"></a>04035 XFree(data_ret); <a name="l04036"></a>04036 } <a name="l04037"></a>04037 } <a name="l04038"></a>04038 <a name="l04039"></a>04039 <span class="keywordflow">if</span> (dirty & WMVisibleName) { <a name="l04040"></a>04040 <span class="keyword">delete</span>[] p->visible_name; <a name="l04041"></a>04041 p->visible_name = NULL; <a name="l04042"></a>04042 <span class="keywordflow">if</span> (XGetWindowProperty(p->display, p->window, net_wm_visible_name, 0l, <a name="l04043"></a>04043 MAX_PROP_SIZE, False, UTF8_STRING, &type_ret, <a name="l04044"></a>04044 &format_ret, &nitems_ret, &unused, &data_ret) <a name="l04045"></a>04045 == Success) { <a name="l04046"></a>04046 <span class="keywordflow">if</span> (type_ret == UTF8_STRING && format_ret == 8 && nitems_ret > 0) { <a name="l04047"></a>04047 p->visible_name = nstrndup((<span class="keyword">const</span> <span class="keywordtype">char</span> *) data_ret, nitems_ret); <a name="l04048"></a>04048 } <a name="l04049"></a>04049 <a name="l04050"></a>04050 <span class="keywordflow">if</span>( data_ret ) <a name="l04051"></a>04051 XFree(data_ret); <a name="l04052"></a>04052 } <a name="l04053"></a>04053 } <a name="l04054"></a>04054 <a name="l04055"></a>04055 <span class="keywordflow">if</span> (dirty & WMIconName) { <a name="l04056"></a>04056 <span class="keyword">delete</span>[] p->icon_name; <a name="l04057"></a>04057 p->icon_name = NULL; <a name="l04058"></a>04058 <span class="keywordflow">if</span> (XGetWindowProperty(p->display, p->window, net_wm_icon_name, 0l, <a name="l04059"></a>04059 MAX_PROP_SIZE, False, UTF8_STRING, &type_ret, <a name="l04060"></a>04060 &format_ret, &nitems_ret, &unused, &data_ret) <a name="l04061"></a>04061 == Success) { <a name="l04062"></a>04062 <span class="keywordflow">if</span> (type_ret == UTF8_STRING && format_ret == 8 && nitems_ret > 0) { <a name="l04063"></a>04063 p->icon_name = nstrndup((<span class="keyword">const</span> <span class="keywordtype">char</span> *) data_ret, nitems_ret); <a name="l04064"></a>04064 } <a name="l04065"></a>04065 <a name="l04066"></a>04066 <span class="keywordflow">if</span>( data_ret ) <a name="l04067"></a>04067 XFree(data_ret); <a name="l04068"></a>04068 } <a name="l04069"></a>04069 } <a name="l04070"></a>04070 <a name="l04071"></a>04071 <span class="keywordflow">if</span> (dirty & WMVisibleIconName) <a name="l04072"></a>04072 { <a name="l04073"></a>04073 <span class="keyword">delete</span>[] p->visible_icon_name; <a name="l04074"></a>04074 p->visible_icon_name = NULL; <a name="l04075"></a>04075 <span class="keywordflow">if</span> (XGetWindowProperty(p->display, p->window, net_wm_visible_icon_name, 0l, <a name="l04076"></a>04076 MAX_PROP_SIZE, False, UTF8_STRING, &type_ret, <a name="l04077"></a>04077 &format_ret, &nitems_ret, &unused, &data_ret) <a name="l04078"></a>04078 == Success) { <a name="l04079"></a>04079 <span class="keywordflow">if</span> (type_ret == UTF8_STRING && format_ret == 8 && nitems_ret > 0) { <a name="l04080"></a>04080 p->visible_icon_name = nstrndup((<span class="keyword">const</span> <span class="keywordtype">char</span> *) data_ret, nitems_ret); <a name="l04081"></a>04081 } <a name="l04082"></a>04082 <a name="l04083"></a>04083 <span class="keywordflow">if</span>( data_ret ) <a name="l04084"></a>04084 XFree(data_ret); <a name="l04085"></a>04085 } <a name="l04086"></a>04086 } <a name="l04087"></a>04087 <a name="l04088"></a>04088 <span class="keywordflow">if</span> (dirty & WMWindowType) { <a name="l04089"></a>04089 p->types.reset(); <a name="l04090"></a>04090 p->types[ 0 ] = Unknown; <a name="l04091"></a>04091 p->has_net_support = <span class="keyword">false</span>; <a name="l04092"></a>04092 <span class="keywordflow">if</span> (XGetWindowProperty(p->display, p->window, net_wm_window_type, 0l, 2048l, <a name="l04093"></a>04093 False, XA_ATOM, &type_ret, &format_ret, <a name="l04094"></a>04094 &nitems_ret, &unused, &data_ret) <a name="l04095"></a>04095 == Success) { <a name="l04096"></a>04096 <span class="keywordflow">if</span> (type_ret == XA_ATOM && format_ret == 32 && nitems_ret > 0) { <a name="l04097"></a>04097 <span class="comment">// determine the window type</span> <a name="l04098"></a>04098 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l04099"></a>04099 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETWinInfo::update: getting window type (%ld)\n"</span>, <a name="l04100"></a>04100 nitems_ret); <a name="l04101"></a>04101 <span class="preprocessor">#endif</span> <a name="l04102"></a>04102 <span class="preprocessor"></span> <a name="l04103"></a>04103 p->has_net_support = <span class="keyword">true</span>; <a name="l04104"></a>04104 <a name="l04105"></a>04105 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> count = 0; <a name="l04106"></a>04106 <span class="keywordtype">long</span> *types = (<span class="keywordtype">long</span> *) data_ret; <a name="l04107"></a>04107 <span class="keywordtype">int</span> pos = 0; <a name="l04108"></a>04108 <a name="l04109"></a>04109 <span class="keywordflow">while</span> (count < nitems_ret) { <a name="l04110"></a>04110 <span class="comment">// remember all window types we know</span> <a name="l04111"></a>04111 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l04112"></a>04112 <span class="preprocessor"></span> <span class="keywordtype">char</span>* debug_type = XGetAtomName(p->display, (Atom) types[count]); <a name="l04113"></a>04113 fprintf(stderr, <a name="l04114"></a>04114 <span class="stringliteral">"NETWinInfo::update: examining window type %ld %s\n"</span>, <a name="l04115"></a>04115 types[count], debug_type ); <a name="l04116"></a>04116 <span class="keywordflow">if</span> ( debug_type ) <a name="l04117"></a>04117 XFree( debug_type ); <a name="l04118"></a>04118 <span class="preprocessor">#endif</span> <a name="l04119"></a>04119 <span class="preprocessor"></span> <a name="l04120"></a>04120 <span class="keywordflow">if</span> ((Atom) types[count] == net_wm_window_type_normal) <a name="l04121"></a>04121 p->types[ pos++ ] = Normal; <a name="l04122"></a>04122 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) types[count] == net_wm_window_type_desktop) <a name="l04123"></a>04123 p->types[ pos++ ] = Desktop; <a name="l04124"></a>04124 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) types[count] == net_wm_window_type_dock) <a name="l04125"></a>04125 p->types[ pos++ ] = Dock; <a name="l04126"></a>04126 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) types[count] == net_wm_window_type_toolbar) <a name="l04127"></a>04127 p->types[ pos++ ] = Tool; <a name="l04128"></a>04128 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) types[count] == net_wm_window_type_menu) <a name="l04129"></a>04129 p->types[ pos++ ] = Menu; <a name="l04130"></a>04130 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) types[count] == net_wm_window_type_dialog) <a name="l04131"></a>04131 p->types[ pos++ ] = Dialog; <a name="l04132"></a>04132 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) types[count] == net_wm_window_type_utility) <a name="l04133"></a>04133 p->types[ pos++ ] = Utility; <a name="l04134"></a>04134 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) types[count] == net_wm_window_type_splash) <a name="l04135"></a>04135 p->types[ pos++ ] = Splash; <a name="l04136"></a>04136 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) types[count] == net_wm_window_type_dropdown_menu) <a name="l04137"></a>04137 p->types[ pos++ ] = DropdownMenu; <a name="l04138"></a>04138 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) types[count] == net_wm_window_type_popup_menu) <a name="l04139"></a>04139 p->types[ pos++ ] = PopupMenu; <a name="l04140"></a>04140 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) types[count] == net_wm_window_type_tooltip) <a name="l04141"></a>04141 p->types[ pos++ ] = Tooltip; <a name="l04142"></a>04142 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) types[count] == net_wm_window_type_notification) <a name="l04143"></a>04143 p->types[ pos++ ] = Notification; <a name="l04144"></a>04144 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) types[count] == net_wm_window_type_combobox) <a name="l04145"></a>04145 p->types[ pos++ ] = ComboBox; <a name="l04146"></a>04146 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) types[count] == net_wm_window_type_dnd) <a name="l04147"></a>04147 p->types[ pos++ ] = DNDIcon; <a name="l04148"></a>04148 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) types[count] == kde_net_wm_window_type_override) <a name="l04149"></a>04149 p->types[ pos++ ] = Override; <a name="l04150"></a>04150 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((Atom) types[count] == kde_net_wm_window_type_topmenu) <a name="l04151"></a>04151 p->types[ pos++ ] = TopMenu; <a name="l04152"></a>04152 <a name="l04153"></a>04153 count++; <a name="l04154"></a>04154 } <a name="l04155"></a>04155 } <a name="l04156"></a>04156 <a name="l04157"></a>04157 <span class="keywordflow">if</span> ( data_ret ) <a name="l04158"></a>04158 XFree(data_ret); <a name="l04159"></a>04159 } <a name="l04160"></a>04160 } <a name="l04161"></a>04161 <a name="l04162"></a>04162 <span class="keywordflow">if</span> (dirty & WMStrut) { <a name="l04163"></a>04163 p->strut = <a class="code" href="structNETStrut.html">NETStrut</a>(); <a name="l04164"></a>04164 <span class="keywordflow">if</span> (XGetWindowProperty(p->display, p->window, net_wm_strut, 0l, 4l, <a name="l04165"></a>04165 False, XA_CARDINAL, &type_ret, &format_ret, <a name="l04166"></a>04166 &nitems_ret, &unused, &data_ret) <a name="l04167"></a>04167 == Success) { <a name="l04168"></a>04168 <span class="keywordflow">if</span> (type_ret == XA_CARDINAL && format_ret == 32 && <a name="l04169"></a>04169 nitems_ret == 4) { <a name="l04170"></a>04170 <span class="keywordtype">long</span> *d = (<span class="keywordtype">long</span> *) data_ret; <a name="l04171"></a>04171 p->strut.left = d[0]; <a name="l04172"></a>04172 p->strut.right = d[1]; <a name="l04173"></a>04173 p->strut.top = d[2]; <a name="l04174"></a>04174 p->strut.bottom = d[3]; <a name="l04175"></a>04175 } <a name="l04176"></a>04176 <span class="keywordflow">if</span> ( data_ret ) <a name="l04177"></a>04177 XFree(data_ret); <a name="l04178"></a>04178 } <a name="l04179"></a>04179 } <a name="l04180"></a>04180 <a name="l04181"></a>04181 <span class="keywordflow">if</span> (dirty2 & WM2ExtendedStrut) { <a name="l04182"></a>04182 p->extended_strut = <a class="code" href="structNETExtendedStrut.html" title="Partial strut class for NET classes.">NETExtendedStrut</a>(); <a name="l04183"></a>04183 <span class="keywordflow">if</span> (XGetWindowProperty(p->display, p->window, net_wm_extended_strut, 0l, 12l, <a name="l04184"></a>04184 False, XA_CARDINAL, &type_ret, &format_ret, <a name="l04185"></a>04185 &nitems_ret, &unused, &data_ret) <a name="l04186"></a>04186 == Success) { <a name="l04187"></a>04187 <span class="keywordflow">if</span> (type_ret == XA_CARDINAL && format_ret == 32 && <a name="l04188"></a>04188 nitems_ret == 12) { <a name="l04189"></a>04189 <span class="keywordtype">long</span> *d = (<span class="keywordtype">long</span> *) data_ret; <a name="l04190"></a>04190 p->extended_strut.left_width = d[0]; <a name="l04191"></a>04191 p->extended_strut.right_width = d[1]; <a name="l04192"></a>04192 p->extended_strut.top_width = d[2]; <a name="l04193"></a>04193 p->extended_strut.bottom_width = d[3]; <a name="l04194"></a>04194 p->extended_strut.left_start = d[4]; <a name="l04195"></a>04195 p->extended_strut.left_end = d[5]; <a name="l04196"></a>04196 p->extended_strut.right_start = d[6]; <a name="l04197"></a>04197 p->extended_strut.right_end = d[7]; <a name="l04198"></a>04198 p->extended_strut.top_start = d[8]; <a name="l04199"></a>04199 p->extended_strut.top_end = d[9]; <a name="l04200"></a>04200 p->extended_strut.bottom_start = d[10]; <a name="l04201"></a>04201 p->extended_strut.bottom_end = d[11]; <a name="l04202"></a>04202 } <a name="l04203"></a>04203 <span class="keywordflow">if</span> ( data_ret ) <a name="l04204"></a>04204 XFree(data_ret); <a name="l04205"></a>04205 } <a name="l04206"></a>04206 } <a name="l04207"></a>04207 <a name="l04208"></a>04208 <span class="keywordflow">if</span> (dirty & WMIconGeometry) { <a name="l04209"></a>04209 p->icon_geom = <a class="code" href="structNETRect.html" title="Simple rectangle class for NET classes.">NETRect</a>(); <a name="l04210"></a>04210 <span class="keywordflow">if</span> (XGetWindowProperty(p->display, p->window, net_wm_icon_geometry, 0l, 4l, <a name="l04211"></a>04211 False, XA_CARDINAL, &type_ret, &format_ret, <a name="l04212"></a>04212 &nitems_ret, &unused, &data_ret) <a name="l04213"></a>04213 == Success) { <a name="l04214"></a>04214 <span class="keywordflow">if</span> (type_ret == XA_CARDINAL && format_ret == 32 && <a name="l04215"></a>04215 nitems_ret == 4) { <a name="l04216"></a>04216 <span class="keywordtype">long</span> *d = (<span class="keywordtype">long</span> *) data_ret; <a name="l04217"></a>04217 p->icon_geom.pos.x = d[0]; <a name="l04218"></a>04218 p->icon_geom.pos.y = d[1]; <a name="l04219"></a>04219 p->icon_geom.size.width = d[2]; <a name="l04220"></a>04220 p->icon_geom.size.height = d[3]; <a name="l04221"></a>04221 } <a name="l04222"></a>04222 <span class="keywordflow">if</span> ( data_ret ) <a name="l04223"></a>04223 XFree(data_ret); <a name="l04224"></a>04224 } <a name="l04225"></a>04225 } <a name="l04226"></a>04226 <a name="l04227"></a>04227 <span class="keywordflow">if</span> (dirty & WMIcon) { <a name="l04228"></a>04228 readIcon(p->display,p->window,net_wm_icon,p->icons,p->icon_count); <a name="l04229"></a>04229 } <a name="l04230"></a>04230 <a name="l04231"></a>04231 <span class="keywordflow">if</span> (dirty & WMKDESystemTrayWinFor) { <a name="l04232"></a>04232 p->kde_system_tray_win_for = 0; <a name="l04233"></a>04233 <span class="keywordflow">if</span> (XGetWindowProperty(p->display, p->window, kde_net_wm_system_tray_window_for, <a name="l04234"></a>04234 0l, 1l, False, XA_WINDOW, &type_ret, &format_ret, <a name="l04235"></a>04235 &nitems_ret, &unused, &data_ret) <a name="l04236"></a>04236 == Success) { <a name="l04237"></a>04237 <span class="keywordflow">if</span> (type_ret == XA_WINDOW && format_ret == 32 && <a name="l04238"></a>04238 nitems_ret == 1) { <a name="l04239"></a>04239 p->kde_system_tray_win_for = *((Window *) data_ret); <a name="l04240"></a>04240 <span class="keywordflow">if</span> ( p->kde_system_tray_win_for == 0 ) <a name="l04241"></a>04241 p->kde_system_tray_win_for = p->root; <a name="l04242"></a>04242 } <a name="l04243"></a>04243 <span class="keywordflow">if</span> ( data_ret ) <a name="l04244"></a>04244 XFree(data_ret); <a name="l04245"></a>04245 } <a name="l04246"></a>04246 } <a name="l04247"></a>04247 <a name="l04248"></a>04248 <span class="keywordflow">if</span> (dirty & WMFrameExtents) { <a name="l04249"></a>04249 p->frame_strut = <a class="code" href="structNETStrut.html">NETStrut</a>(); <a name="l04250"></a>04250 <span class="keywordtype">bool</span> ok = <span class="keyword">false</span>; <a name="l04251"></a>04251 <span class="keywordflow">if</span> (XGetWindowProperty(p->display, p->window, net_frame_extents, <a name="l04252"></a>04252 0l, 4l, False, XA_CARDINAL, &type_ret, &format_ret, <a name="l04253"></a>04253 &nitems_ret, &unused, &data_ret) == Success) { <a name="l04254"></a>04254 <span class="keywordflow">if</span> (type_ret == XA_CARDINAL && format_ret == 32 && nitems_ret == 4) { <a name="l04255"></a>04255 ok = <span class="keyword">true</span>; <a name="l04256"></a>04256 <span class="keywordtype">long</span> *d = (<span class="keywordtype">long</span> *) data_ret; <a name="l04257"></a>04257 <a name="l04258"></a>04258 p->frame_strut.left = d[0]; <a name="l04259"></a>04259 p->frame_strut.right = d[1]; <a name="l04260"></a>04260 p->frame_strut.top = d[2]; <a name="l04261"></a>04261 p->frame_strut.bottom = d[3]; <a name="l04262"></a>04262 } <a name="l04263"></a>04263 <span class="keywordflow">if</span> ( data_ret ) <a name="l04264"></a>04264 XFree(data_ret); <a name="l04265"></a>04265 } <a name="l04266"></a>04266 <span class="keywordflow">if</span> (!ok && XGetWindowProperty(p->display, p->window, kde_net_wm_frame_strut, <a name="l04267"></a>04267 0l, 4l, False, XA_CARDINAL, &type_ret, &format_ret, <a name="l04268"></a>04268 &nitems_ret, &unused, &data_ret) == Success) { <a name="l04269"></a>04269 <span class="keywordflow">if</span> (type_ret == XA_CARDINAL && format_ret == 32 && nitems_ret == 4) { <a name="l04270"></a>04270 ok = <span class="keyword">true</span>; <a name="l04271"></a>04271 <span class="keywordtype">long</span> *d = (<span class="keywordtype">long</span> *) data_ret; <a name="l04272"></a>04272 <a name="l04273"></a>04273 p->frame_strut.left = d[0]; <a name="l04274"></a>04274 p->frame_strut.right = d[1]; <a name="l04275"></a>04275 p->frame_strut.top = d[2]; <a name="l04276"></a>04276 p->frame_strut.bottom = d[3]; <a name="l04277"></a>04277 } <a name="l04278"></a>04278 <span class="keywordflow">if</span> ( data_ret ) <a name="l04279"></a>04279 XFree(data_ret); <a name="l04280"></a>04280 } <a name="l04281"></a>04281 } <a name="l04282"></a>04282 <a name="l04283"></a>04283 <span class="keywordflow">if</span> (dirty & WMPid) { <a name="l04284"></a>04284 p->pid = 0; <a name="l04285"></a>04285 <span class="keywordflow">if</span> (XGetWindowProperty(p->display, p->window, net_wm_pid, 0l, 1l, <a name="l04286"></a>04286 False, XA_CARDINAL, &type_ret, &format_ret, <a name="l04287"></a>04287 &nitems_ret, &unused, &data_ret) == Success) { <a name="l04288"></a>04288 <span class="keywordflow">if</span> (type_ret == XA_CARDINAL && format_ret == 32 && nitems_ret == 1) { <a name="l04289"></a>04289 p->pid = *((<span class="keywordtype">long</span> *) data_ret); <a name="l04290"></a>04290 } <a name="l04291"></a>04291 <span class="keywordflow">if</span> ( data_ret ) <a name="l04292"></a>04292 XFree(data_ret); <a name="l04293"></a>04293 } <a name="l04294"></a>04294 } <a name="l04295"></a>04295 <a name="l04296"></a>04296 <span class="keywordflow">if</span> (dirty2 & WM2StartupId) <a name="l04297"></a>04297 { <a name="l04298"></a>04298 <span class="keyword">delete</span>[] p->startup_id; <a name="l04299"></a>04299 p->startup_id = NULL; <a name="l04300"></a>04300 <span class="keywordflow">if</span> (XGetWindowProperty(p->display, p->window, net_startup_id, 0l, <a name="l04301"></a>04301 MAX_PROP_SIZE, False, UTF8_STRING, &type_ret, <a name="l04302"></a>04302 &format_ret, &nitems_ret, &unused, &data_ret) <a name="l04303"></a>04303 == Success) { <a name="l04304"></a>04304 <span class="keywordflow">if</span> (type_ret == UTF8_STRING && format_ret == 8 && nitems_ret > 0) { <a name="l04305"></a>04305 p->startup_id = nstrndup((<span class="keyword">const</span> <span class="keywordtype">char</span> *) data_ret, nitems_ret); <a name="l04306"></a>04306 } <a name="l04307"></a>04307 <a name="l04308"></a>04308 <span class="keywordflow">if</span>( data_ret ) <a name="l04309"></a>04309 XFree(data_ret); <a name="l04310"></a>04310 } <a name="l04311"></a>04311 } <a name="l04312"></a>04312 <a name="l04313"></a>04313 <span class="keywordflow">if</span>( dirty2 & WM2AllowedActions ) { <a name="l04314"></a>04314 p->allowed_actions = 0; <a name="l04315"></a>04315 <span class="keywordflow">if</span> (XGetWindowProperty(p->display, p->window, net_wm_allowed_actions, 0l, 2048l, <a name="l04316"></a>04316 False, XA_ATOM, &type_ret, &format_ret, <a name="l04317"></a>04317 &nitems_ret, &unused, &data_ret) <a name="l04318"></a>04318 == Success) { <a name="l04319"></a>04319 <span class="keywordflow">if</span> (type_ret == XA_ATOM && format_ret == 32 && nitems_ret > 0) { <a name="l04320"></a>04320 <span class="comment">// determine actions</span> <a name="l04321"></a>04321 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l04322"></a>04322 <span class="preprocessor"></span> fprintf(stderr, <span class="stringliteral">"NETWinInfo::update: updating allowed actions (%ld)\n"</span>, <a name="l04323"></a>04323 nitems_ret); <a name="l04324"></a>04324 <span class="preprocessor">#endif</span> <a name="l04325"></a>04325 <span class="preprocessor"></span> <a name="l04326"></a>04326 <span class="keywordtype">long</span> *actions = (<span class="keywordtype">long</span> *) data_ret; <a name="l04327"></a>04327 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> count; <a name="l04328"></a>04328 <a name="l04329"></a>04329 <span class="keywordflow">for</span> (count = 0; count < nitems_ret; count++) { <a name="l04330"></a>04330 <span class="preprocessor">#ifdef NETWMDEBUG</span> <a name="l04331"></a>04331 <span class="preprocessor"></span> fprintf(stderr, <a name="l04332"></a>04332 <span class="stringliteral">"NETWinInfo::update: adding allowed action %ld '%s'\n"</span>, <a name="l04333"></a>04333 actions[count], <a name="l04334"></a>04334 XGetAtomName(p->display, (Atom) actions[count])); <a name="l04335"></a>04335 <span class="preprocessor">#endif</span> <a name="l04336"></a>04336 <span class="preprocessor"></span> <a name="l04337"></a>04337 <span class="keywordflow">if</span> ((Atom) actions[count] == net_wm_action_move) <a name="l04338"></a>04338 p->allowed_actions |= ActionMove; <a name="l04339"></a>04339 <span class="keywordflow">if</span> ((Atom) actions[count] == net_wm_action_resize) <a name="l04340"></a>04340 p->allowed_actions |= ActionResize; <a name="l04341"></a>04341 <span class="keywordflow">if</span> ((Atom) actions[count] == net_wm_action_minimize) <a name="l04342"></a>04342 p->allowed_actions |= ActionMinimize; <a name="l04343"></a>04343 <span class="keywordflow">if</span> ((Atom) actions[count] == net_wm_action_shade) <a name="l04344"></a>04344 p->allowed_actions |= ActionShade; <a name="l04345"></a>04345 <span class="keywordflow">if</span> ((Atom) actions[count] == net_wm_action_stick) <a name="l04346"></a>04346 p->allowed_actions |= ActionStick; <a name="l04347"></a>04347 <span class="keywordflow">if</span> ((Atom) actions[count] == net_wm_action_max_vert) <a name="l04348"></a>04348 p->allowed_actions |= ActionMaxVert; <a name="l04349"></a>04349 <span class="keywordflow">if</span> ((Atom) actions[count] == net_wm_action_max_horiz) <a name="l04350"></a>04350 p->allowed_actions |= ActionMaxHoriz; <a name="l04351"></a>04351 <span class="keywordflow">if</span> ((Atom) actions[count] == net_wm_action_fullscreen) <a name="l04352"></a>04352 p->allowed_actions |= ActionFullScreen; <a name="l04353"></a>04353 <span class="keywordflow">if</span> ((Atom) actions[count] == net_wm_action_change_desk) <a name="l04354"></a>04354 p->allowed_actions |= ActionChangeDesktop; <a name="l04355"></a>04355 <span class="keywordflow">if</span> ((Atom) actions[count] == net_wm_action_close) <a name="l04356"></a>04356 p->allowed_actions |= ActionClose; <a name="l04357"></a>04357 } <a name="l04358"></a>04358 } <a name="l04359"></a>04359 <span class="keywordflow">if</span> ( data_ret ) <a name="l04360"></a>04360 XFree(data_ret); <a name="l04361"></a>04361 } <a name="l04362"></a>04362 } <a name="l04363"></a>04363 <a name="l04364"></a>04364 <span class="keywordflow">if</span> (dirty2 & WM2UserTime) { <a name="l04365"></a>04365 p->user_time = -1U; <a name="l04366"></a>04366 <span class="keywordflow">if</span> (XGetWindowProperty(p->display, p->window, net_wm_user_time, 0l, 1l, <a name="l04367"></a>04367 False, XA_CARDINAL, &type_ret, &format_ret, <a name="l04368"></a>04368 &nitems_ret, &unused, &data_ret) == Success) { <a name="l04369"></a>04369 <span class="comment">// don't do nitems_ret check - Qt does PropModeAppend to avoid API call for it</span> <a name="l04370"></a>04370 <span class="keywordflow">if</span> (type_ret == XA_CARDINAL && format_ret == 32 <span class="comment">/*&& nitems_ret == 1*/</span>) { <a name="l04371"></a>04371 p->user_time = *((<span class="keywordtype">long</span> *) data_ret); <a name="l04372"></a>04372 } <a name="l04373"></a>04373 <span class="keywordflow">if</span> ( data_ret ) <a name="l04374"></a>04374 XFree(data_ret); <a name="l04375"></a>04375 } <a name="l04376"></a>04376 } <a name="l04377"></a>04377 <a name="l04378"></a>04378 <span class="keywordflow">if</span> (dirty2 & WM2TransientFor) { <a name="l04379"></a>04379 p->transient_for = None; <a name="l04380"></a>04380 XGetTransientForHint(p->display, p->window, &p->transient_for); <a name="l04381"></a>04381 } <a name="l04382"></a>04382 <a name="l04383"></a>04383 <span class="keywordflow">if</span> (dirty2 & WM2GroupLeader) { <a name="l04384"></a>04384 XWMHints *hints = XGetWMHints(p->display, p->window); <a name="l04385"></a>04385 p->window_group = None; <a name="l04386"></a>04386 <span class="keywordflow">if</span> ( hints ) <a name="l04387"></a>04387 { <a name="l04388"></a>04388 <span class="keywordflow">if</span>( hints->flags & WindowGroupHint ) <a name="l04389"></a>04389 p->window_group = hints->window_group; <a name="l04390"></a>04390 XFree( reinterpret_cast< char* >( hints )); <a name="l04391"></a>04391 } <a name="l04392"></a>04392 } <a name="l04393"></a>04393 <a name="l04394"></a>04394 <span class="keywordflow">if</span>( dirty2 & WM2WindowClass ) { <a name="l04395"></a>04395 <span class="keyword">delete</span>[] p->class_class; <a name="l04396"></a>04396 <span class="keyword">delete</span>[] p->class_name; <a name="l04397"></a>04397 p->class_class = NULL; <a name="l04398"></a>04398 p->class_name = NULL; <a name="l04399"></a>04399 XClassHint hint; <a name="l04400"></a>04400 <span class="keywordflow">if</span>( XGetClassHint( p->display, p->window, &hint )) { <a name="l04401"></a>04401 p->class_class = strdup( hint.res_class ); <a name="l04402"></a>04402 p->class_name = strdup( hint.res_name ); <a name="l04403"></a>04403 XFree( hint.res_class ); <a name="l04404"></a>04404 XFree( hint.res_name ); <a name="l04405"></a>04405 } <a name="l04406"></a>04406 } <a name="l04407"></a>04407 <a name="l04408"></a>04408 <span class="keywordflow">if</span>( dirty2 & WM2WindowRole ) { <a name="l04409"></a>04409 <span class="keyword">delete</span>[] p->role; <a name="l04410"></a>04410 p->role = NULL; <a name="l04411"></a>04411 <span class="keywordflow">if</span> (XGetWindowProperty(p->display, p->window, wm_window_role, 0l, <a name="l04412"></a>04412 MAX_PROP_SIZE, False, XA_STRING, &type_ret, <a name="l04413"></a>04413 &format_ret, &nitems_ret, &unused, &data_ret) <a name="l04414"></a>04414 == Success) { <a name="l04415"></a>04415 <span class="keywordflow">if</span> (type_ret == XA_STRING && format_ret == 8 && nitems_ret > 0) { <a name="l04416"></a>04416 p->role = nstrndup((<span class="keyword">const</span> <span class="keywordtype">char</span> *) data_ret, nitems_ret); <a name="l04417"></a>04417 } <a name="l04418"></a>04418 <span class="keywordflow">if</span>( data_ret ) <a name="l04419"></a>04419 XFree(data_ret); <a name="l04420"></a>04420 } <a name="l04421"></a>04421 } <a name="l04422"></a>04422 <a name="l04423"></a>04423 <span class="keywordflow">if</span>( dirty2 & WM2ClientMachine ) { <a name="l04424"></a>04424 <span class="keyword">delete</span>[] p->client_machine; <a name="l04425"></a>04425 p->client_machine = NULL; <a name="l04426"></a>04426 <span class="keywordflow">if</span> (XGetWindowProperty(p->display, p->window, XA_WM_CLIENT_MACHINE, 0l, <a name="l04427"></a>04427 MAX_PROP_SIZE, False, XA_STRING, &type_ret, <a name="l04428"></a>04428 &format_ret, &nitems_ret, &unused, &data_ret) <a name="l04429"></a>04429 == Success) { <a name="l04430"></a>04430 <span class="keywordflow">if</span> (type_ret == XA_STRING && format_ret == 8 && nitems_ret > 0) { <a name="l04431"></a>04431 p->client_machine = nstrndup((<span class="keyword">const</span> <span class="keywordtype">char</span> *) data_ret, nitems_ret); <a name="l04432"></a>04432 } <a name="l04433"></a>04433 <span class="keywordflow">if</span>( data_ret ) <a name="l04434"></a>04434 XFree(data_ret); <a name="l04435"></a>04435 } <a name="l04436"></a>04436 } <a name="l04437"></a>04437 } <a name="l04438"></a>04438 <a name="l04439"></a>04439 <a name="l04440"></a>04440 <a class="code" href="structNETRect.html" title="Simple rectangle class for NET classes.">NETRect</a> NETWinInfo::iconGeometry()<span class="keyword"> const </span>{ <a name="l04441"></a>04441 <span class="keywordflow">return</span> p->icon_geom; <a name="l04442"></a>04442 } <a name="l04443"></a>04443 <a name="l04444"></a>04444 <a name="l04445"></a>04445 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> NETWinInfo::state()<span class="keyword"> const </span>{ <a name="l04446"></a>04446 <span class="keywordflow">return</span> p->state; <a name="l04447"></a>04447 } <a name="l04448"></a>04448 <a name="l04449"></a>04449 <a name="l04450"></a>04450 <a class="code" href="structNETStrut.html">NETStrut</a> NETWinInfo::strut()<span class="keyword"> const </span>{ <a name="l04451"></a>04451 <span class="keywordflow">return</span> p->strut; <a name="l04452"></a>04452 } <a name="l04453"></a>04453 <a name="l04454"></a>04454 <a class="code" href="structNETExtendedStrut.html" title="Partial strut class for NET classes.">NETExtendedStrut</a> NETWinInfo::extendedStrut()<span class="keyword"> const </span>{ <a name="l04455"></a>04455 <span class="keywordflow">return</span> p->extended_strut; <a name="l04456"></a>04456 } <a name="l04457"></a>04457 <a name="l04458"></a>04458 <span class="keywordtype">bool</span> <a class="code" href="classNET.html#a337d6c9e124c5740cedb20328f41bea3" title="Returns true if the given window type matches the mask given using WindowTypeMask flags...">NET::typeMatchesMask</a>( WindowType type, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> mask ) { <a name="l04459"></a>04459 <span class="keywordflow">switch</span>( type ) { <a name="l04460"></a>04460 <span class="preprocessor">#define CHECK_TYPE_MASK( type ) \</span> <a name="l04461"></a>04461 <span class="preprocessor"> case type: \</span> <a name="l04462"></a>04462 <span class="preprocessor"> if( mask & type##Mask ) \</span> <a name="l04463"></a>04463 <span class="preprocessor"> return true; \</span> <a name="l04464"></a>04464 <span class="preprocessor"> break;</span> <a name="l04465"></a>04465 <span class="preprocessor"></span> CHECK_TYPE_MASK( Normal ) <a name="l04466"></a>04466 CHECK_TYPE_MASK( Desktop ) <a name="l04467"></a>04467 CHECK_TYPE_MASK( Dock ) <a name="l04468"></a>04468 CHECK_TYPE_MASK( Toolbar ) <a name="l04469"></a>04469 CHECK_TYPE_MASK( Menu ) <a name="l04470"></a>04470 CHECK_TYPE_MASK( Dialog ) <a name="l04471"></a>04471 CHECK_TYPE_MASK( <a class="code" href="classNET.html#a4b3115c0f40e7bc8e38119cc44dd60e0a169c19bad87c970ee27283f2b3378b7e">Override</a> ) <a name="l04472"></a>04472 CHECK_TYPE_MASK( TopMenu ) <a name="l04473"></a>04473 CHECK_TYPE_MASK( <a class="code" href="classNET.html#a4b3115c0f40e7bc8e38119cc44dd60e0aed5a5fbe48af6bcd46122f9bda58f0c8">Utility</a> ) <a name="l04474"></a>04474 CHECK_TYPE_MASK( <a class="code" href="classNET.html#a4b3115c0f40e7bc8e38119cc44dd60e0a07c62266f94f41d18b1f522c8f917333">Splash</a> ) <a name="l04475"></a>04475 CHECK_TYPE_MASK( <a class="code" href="classNET.html#a4b3115c0f40e7bc8e38119cc44dd60e0abbd1eb83dab2ebd2b1e1909f9bf03809">DropdownMenu</a> ) <a name="l04476"></a>04476 CHECK_TYPE_MASK( <a class="code" href="classNET.html#a4b3115c0f40e7bc8e38119cc44dd60e0abf2250001e5fc6e63a42f8cc86fc8725">PopupMenu</a> ) <a name="l04477"></a>04477 CHECK_TYPE_MASK( <a class="code" href="classNET.html#a4b3115c0f40e7bc8e38119cc44dd60e0a8e9c1aa0e9c868b99aa8b5c2008cc45c">Tooltip</a> ) <a name="l04478"></a>04478 CHECK_TYPE_MASK( <a class="code" href="classNET.html#a4b3115c0f40e7bc8e38119cc44dd60e0a0f3f4349eae1a7aca0e44da1f7f26984">Notification</a> ) <a name="l04479"></a>04479 CHECK_TYPE_MASK( <a class="code" href="classNET.html#a4b3115c0f40e7bc8e38119cc44dd60e0adf15e4b5b7558558fd4adb72866d5972">ComboBox</a> ) <a name="l04480"></a>04480 CHECK_TYPE_MASK( <a class="code" href="classNET.html#a4b3115c0f40e7bc8e38119cc44dd60e0a3f2e95b29fea412b74e23deb530bb7fc">DNDIcon</a> ) <a name="l04481"></a>04481 <span class="preprocessor">#undef CHECK_TYPE_MASK</span> <a name="l04482"></a>04482 <span class="preprocessor"></span> <span class="keywordflow">default</span>: <a name="l04483"></a>04483 <span class="keywordflow">break</span>; <a name="l04484"></a>04484 } <a name="l04485"></a>04485 <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l04486"></a>04486 } <a name="l04487"></a>04487 <a name="l04488"></a>04488 <a class="code" href="classNET.html#a4b3115c0f40e7bc8e38119cc44dd60e0" title="Window type.">NET::WindowType</a> NETWinInfo::windowType( <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> supported_types )<span class="keyword"> const </span>{ <a name="l04489"></a>04489 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = 0; <a name="l04490"></a>04490 i < p->types.size(); <a name="l04491"></a>04491 ++i ) { <a name="l04492"></a>04492 <span class="comment">// return the type only if the application supports it</span> <a name="l04493"></a>04493 <span class="keywordflow">if</span>( typeMatchesMask( p->types[ i ], supported_types )) <a name="l04494"></a>04494 <span class="keywordflow">return</span> p->types[ i ]; <a name="l04495"></a>04495 } <a name="l04496"></a>04496 <span class="keywordflow">return</span> Unknown; <a name="l04497"></a>04497 } <a name="l04498"></a>04498 <a name="l04499"></a>04499 <a class="code" href="classNET.html#a4b3115c0f40e7bc8e38119cc44dd60e0" title="Window type.">NET::WindowType</a> NETWinInfo::windowType()<span class="keyword"> const </span>{ <a name="l04500"></a>04500 <span class="keywordflow">return</span> p->types[ 0 ]; <a name="l04501"></a>04501 } <a name="l04502"></a>04502 <a name="l04503"></a>04503 <a name="l04504"></a>04504 <span class="keyword">const</span> <span class="keywordtype">char</span> *NETWinInfo::name()<span class="keyword"> const </span>{ <a name="l04505"></a>04505 <span class="keywordflow">return</span> p->name; <a name="l04506"></a>04506 } <a name="l04507"></a>04507 <a name="l04508"></a>04508 <a name="l04509"></a>04509 <span class="keyword">const</span> <span class="keywordtype">char</span> *NETWinInfo::visibleName()<span class="keyword"> const </span>{ <a name="l04510"></a>04510 <span class="keywordflow">return</span> p->visible_name; <a name="l04511"></a>04511 } <a name="l04512"></a>04512 <a name="l04513"></a>04513 <a name="l04514"></a>04514 <span class="keyword">const</span> <span class="keywordtype">char</span> *NETWinInfo::iconName()<span class="keyword"> const </span>{ <a name="l04515"></a>04515 <span class="keywordflow">return</span> p->icon_name; <a name="l04516"></a>04516 } <a name="l04517"></a>04517 <a name="l04518"></a>04518 <a name="l04519"></a>04519 <span class="keyword">const</span> <span class="keywordtype">char</span> *NETWinInfo::visibleIconName()<span class="keyword"> const </span>{ <a name="l04520"></a>04520 <span class="keywordflow">return</span> p->visible_icon_name; <a name="l04521"></a>04521 } <a name="l04522"></a>04522 <a name="l04523"></a>04523 <a name="l04524"></a>04524 <span class="keywordtype">int</span> NETWinInfo::desktop()<span class="keyword"> const </span>{ <a name="l04525"></a>04525 <span class="keywordflow">return</span> p->desktop; <a name="l04526"></a>04526 } <a name="l04527"></a>04527 <a name="l04528"></a>04528 <span class="keywordtype">int</span> NETWinInfo::pid()<span class="keyword"> const </span>{ <a name="l04529"></a>04529 <span class="keywordflow">return</span> p->pid; <a name="l04530"></a>04530 } <a name="l04531"></a>04531 <a name="l04532"></a>04532 Time NETWinInfo::userTime()<span class="keyword"> const </span>{ <a name="l04533"></a>04533 <span class="keywordflow">return</span> p->user_time; <a name="l04534"></a>04534 } <a name="l04535"></a>04535 <a name="l04536"></a>04536 <span class="keyword">const</span> <span class="keywordtype">char</span>* NETWinInfo::startupId()<span class="keyword"> const </span>{ <a name="l04537"></a>04537 <span class="keywordflow">return</span> p->startup_id; <a name="l04538"></a>04538 } <a name="l04539"></a>04539 <a name="l04540"></a>04540 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> NETWinInfo::allowedActions()<span class="keyword"> const </span>{ <a name="l04541"></a>04541 <span class="keywordflow">return</span> p->allowed_actions; <a name="l04542"></a>04542 } <a name="l04543"></a>04543 <a name="l04544"></a>04544 <span class="keywordtype">bool</span> NETWinInfo::hasNETSupport()<span class="keyword"> const </span>{ <a name="l04545"></a>04545 <span class="keywordflow">return</span> p->has_net_support; <a name="l04546"></a>04546 } <a name="l04547"></a>04547 <a name="l04548"></a>04548 Window NETWinInfo::transientFor()<span class="keyword"> const </span>{ <a name="l04549"></a>04549 <span class="keywordflow">return</span> p->transient_for; <a name="l04550"></a>04550 } <a name="l04551"></a>04551 <a name="l04552"></a>04552 Window NETWinInfo::groupLeader()<span class="keyword"> const </span>{ <a name="l04553"></a>04553 <span class="keywordflow">return</span> p->window_group; <a name="l04554"></a>04554 } <a name="l04555"></a>04555 <a name="l04556"></a>04556 <span class="keyword">const</span> <span class="keywordtype">char</span>* NETWinInfo::windowClassClass()<span class="keyword"> const </span>{ <a name="l04557"></a>04557 <span class="keywordflow">return</span> p->class_class; <a name="l04558"></a>04558 } <a name="l04559"></a>04559 <a name="l04560"></a>04560 <span class="keyword">const</span> <span class="keywordtype">char</span>* NETWinInfo::windowClassName()<span class="keyword"> const </span>{ <a name="l04561"></a>04561 <span class="keywordflow">return</span> p->class_name; <a name="l04562"></a>04562 } <a name="l04563"></a>04563 <a name="l04564"></a>04564 <span class="keyword">const</span> <span class="keywordtype">char</span>* NETWinInfo::windowRole()<span class="keyword"> const </span>{ <a name="l04565"></a>04565 <span class="keywordflow">return</span> p->role; <a name="l04566"></a>04566 } <a name="l04567"></a>04567 <a name="l04568"></a>04568 <span class="keyword">const</span> <span class="keywordtype">char</span>* NETWinInfo::clientMachine()<span class="keyword"> const </span>{ <a name="l04569"></a>04569 <span class="keywordflow">return</span> p->client_machine; <a name="l04570"></a>04570 } <a name="l04571"></a>04571 <a name="l04572"></a>04572 Bool NETWinInfo::handledIcons()<span class="keyword"> const </span>{ <a name="l04573"></a>04573 <span class="keywordflow">return</span> p->handled_icons; <a name="l04574"></a>04574 } <a name="l04575"></a>04575 <a name="l04576"></a>04576 <a name="l04577"></a>04577 Window NETWinInfo::kdeSystemTrayWinFor()<span class="keyword"> const </span>{ <a name="l04578"></a>04578 <span class="keywordflow">return</span> p->kde_system_tray_win_for; <a name="l04579"></a>04579 } <a name="l04580"></a>04580 <a name="l04581"></a>04581 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>* NETWinInfo::passedProperties()<span class="keyword"> const </span>{ <a name="l04582"></a>04582 <span class="keywordflow">return</span> p->properties; <a name="l04583"></a>04583 } <a name="l04584"></a>04584 <a name="l04585"></a>04585 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> NETWinInfo::properties()<span class="keyword"> const </span>{ <a name="l04586"></a>04586 <span class="keywordflow">return</span> p->properties[ PROTOCOLS ]; <a name="l04587"></a>04587 } <a name="l04588"></a>04588 <a name="l04589"></a>04589 <a name="l04590"></a>04590 <a class="code" href="classNET.html#afb6eef2d78c27ea693652a30d2a07c05" title="Client window mapping state.">NET::MappingState</a> NETWinInfo::mappingState()<span class="keyword"> const </span>{ <a name="l04591"></a>04591 <span class="keywordflow">return</span> p->mapping_state; <a name="l04592"></a>04592 } <a name="l04593"></a>04593 <a name="l04594"></a>04594 <span class="keywordtype">void</span> NETRootInfo::virtual_hook( <span class="keywordtype">int</span>, <span class="keywordtype">void</span>* ) <a name="l04595"></a>04595 { <span class="comment">/*BASE::virtual_hook( id, data );*/</span> } <a name="l04596"></a>04596 <a name="l04597"></a>04597 <span class="keywordtype">void</span> NETWinInfo::virtual_hook( <span class="keywordtype">int</span>, <span class="keywordtype">void</span>* ) <a name="l04598"></a>04598 { <span class="comment">/*BASE::virtual_hook( id, data );*/</span> } <a name="l04599"></a>04599 <a name="l04600"></a>04600 <span class="comment">// Functions for X timestamp comparing. For Time being 32bit they're fairly simple</span> <a name="l04601"></a>04601 <span class="comment">// (the #if 0 part), but on 64bit architectures Time is 64bit unsigned long,</span> <a name="l04602"></a>04602 <span class="comment">// so there special care needs to be taken to always use only the lower 32bits.</span> <a name="l04603"></a>04603 <span class="preprocessor">#if 0</span> <a name="l04604"></a>04604 <span class="preprocessor"></span><span class="keywordtype">int</span> <a class="code" href="classNET.html#ac6cf69eec8a1bb4fe21c1cd51b0782e9" title="Compares two X timestamps, taking into account wrapping and 64bit architectures.">NET::timestampCompare</a>( Time time1, Time time2 ) <span class="comment">// like strcmp()</span> <a name="l04605"></a>04605 { <a name="l04606"></a>04606 <span class="keywordflow">if</span>( time1 == time2 ) <a name="l04607"></a>04607 <span class="keywordflow">return</span> 0; <a name="l04608"></a>04608 <span class="keywordflow">return</span> ( time1 - time2 ) < 0x7fffffffU ? 1 : -1; <span class="comment">// time1 > time2 -> 1, handle wrapping</span> <a name="l04609"></a>04609 } <a name="l04610"></a>04610 <a name="l04611"></a>04611 Time <a class="code" href="classNET.html#a13dcb62f162416d353b97bd9f5f3e7f4" title="Returns a difference of two X timestamps, time2 - time1, where time2 must be later than time1...">NET::timestampDiff</a>( Time time1, Time time2 ) <span class="comment">// returns time2 - time1</span> <a name="l04612"></a>04612 { <span class="comment">// no need to handle wrapping?</span> <a name="l04613"></a>04613 <span class="keywordflow">return</span> time2 - time1; <a name="l04614"></a>04614 } <a name="l04615"></a>04615 <span class="preprocessor">#else</span> <a name="l04616"></a>04616 <span class="preprocessor"></span><span class="keywordtype">int</span> <a class="code" href="classNET.html#ac6cf69eec8a1bb4fe21c1cd51b0782e9" title="Compares two X timestamps, taking into account wrapping and 64bit architectures.">NET::timestampCompare</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> time1_, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> time2_ ) <span class="comment">// like strcmp()</span> <a name="l04617"></a>04617 { <a name="l04618"></a>04618 Q_UINT32 time1 = time1_; <a name="l04619"></a>04619 Q_UINT32 time2 = time2_; <a name="l04620"></a>04620 <span class="keywordflow">if</span>( time1 == time2 ) <a name="l04621"></a>04621 <span class="keywordflow">return</span> 0; <a name="l04622"></a>04622 <span class="keywordflow">return</span> Q_UINT32( time1 - time2 ) < 0x7fffffffU ? 1 : -1; <span class="comment">// time1 > time2 -> 1, handle wrapping</span> <a name="l04623"></a>04623 } <a name="l04624"></a>04624 <a name="l04625"></a>04625 <span class="keywordtype">int</span> <a class="code" href="classNET.html#a13dcb62f162416d353b97bd9f5f3e7f4" title="Returns a difference of two X timestamps, time2 - time1, where time2 must be later than time1...">NET::timestampDiff</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> time1_, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> time2_ ) <span class="comment">// returns time2 - time1</span> <a name="l04626"></a>04626 { <span class="comment">// no need to handle wrapping?</span> <a name="l04627"></a>04627 Q_UINT32 time1 = time1_; <a name="l04628"></a>04628 Q_UINT32 time2 = time2_; <a name="l04629"></a>04629 <span class="keywordflow">return</span> Q_UINT32( time2 - time1 ); <a name="l04630"></a>04630 } <a name="l04631"></a>04631 <span class="preprocessor">#endif</span> <a name="l04632"></a>04632 <span class="preprocessor"></span> <a name="l04633"></a>04633 <a name="l04634"></a>04634 <span class="preprocessor">#endif</span> </pre></div></div> </div> </div></div> </td> </tr> <tr> <td valign="top" id="leftmenu" width="25%"> <a name="navigation"></a> <div class="menu_box"><h2>kdecore</h2> <div class="nav_list"> <ul><li><a href="index.html">Main Page</a></li><li><a href="modules.html">Modules</a></li><li><a href="namespaces.html">Namespace List</a></li><li><a href="hierarchy.html">Class Hierarchy</a></li><li><a href="classes.html">Alphabetical List</a></li><li><a href="annotated.html">Class List</a></li><li><a href="files.html">File List</a></li><li><a href="namespacemembers.html">Namespace Members</a></li><li><a href="functions.html">Class Members</a></li><li><a href="pages.html">Related Pages</a></li></ul> <!-- <h2>Class Picker</h2> <div style="text-align: center;"> <form name="guideform"> <select name="guidelinks" style="width:100%;" onChange="window.location=document.guideform.guidelinks.options[document.guideform.guidelinks.selectedIndex].value"> <option value="annotated.html">-- Choose --</option> <option value="classKAboutData.html">kaboutdata</option>, <option value="classKAboutPerson.html">kaboutperson</option>, <option value="classKAboutTranslator.html">kabouttranslator</option>, <option value="classKAccel.html">kaccel</option>, <option value="classKAcceleratorManager.html">kacceleratormanager</option>, <option value="classKAccelManagerAlgorithm.html">kaccelmanageralgorithm</option>, <option value="classKAccelShortcutList.html">kaccelshortcutlist</option>, <option value="classKAccelString.html">kaccelstring</option>, <option value="classKAddressInfo.html">kaddressinfo</option>, <option value="classKAppDCOPInterface.html">kappdcopinterface</option>, <option value="classKApplication.html">kapplication</option>, <option value="classKAsyncIO.html">kasyncio</option>, <option value="classKAudioPlayer.html">kaudioplayer</option>, <option value="classKBufferedIO.html">kbufferedio</option>, <option value="classKCalendarSystem.html">kcalendarsystem</option>, <option value="classKCalendarSystemFactory.html">kcalendarsystemfactory</option>, <option value="classKCalendarSystemJalali.html">kcalendarsystemjalali</option>, <option value="classKCatalogue.html">kcatalogue</option>, <option value="classKCharMacroExpander.html">kcharmacroexpander</option>, <option value="classKCharsets.html">kcharsets</option>, <option value="classKClipboardSynchronizer.html">kclipboardsynchronizer</option>, <option value="classKCmdLineArgs.html">kcmdlineargs</option>, <option value="classKCodecs.html">kcodecs</option>, <option value="classKCompletion.html">kcompletion</option>, <option value="classKCompletionBase.html">kcompletionbase</option>, <option value="classKCompletionMatches.html">kcompletionmatches</option>, <option value="classKCompTreeNode.html">kcomptreenode</option>, <option value="classKConfig.html">kconfig</option>, <option value="classKConfigBackEnd.html">kconfigbackend</option>, <option value="classKConfigBase.html">kconfigbase</option>, <option value="classKConfigDialogManager.html">kconfigdialogmanager</option>, <option value="classKConfigGroup.html">kconfiggroup</option>, <option value="classKConfigGroupSaver.html">kconfiggroupsaver</option>, <option value="classKConfigINIBackEnd.html">kconfiginibackend</option>, <option value="classKConfigSkeleton.html">kconfigskeleton</option>, <option value="classKConfigSkeleton_1_1ItemBool.html">kconfigskeleton::itembool</option>, <option value="classKConfigSkeleton_1_1ItemColor.html">kconfigskeleton::itemcolor</option>, <option value="classKConfigSkeleton_1_1ItemDateTime.html">kconfigskeleton::itemdatetime</option>, <option value="classKConfigSkeleton_1_1ItemDouble.html">kconfigskeleton::itemdouble</option>, <option value="classKConfigSkeleton_1_1ItemEnum.html">kconfigskeleton::itemenum</option>, <option value="classKConfigSkeleton_1_1ItemFont.html">kconfigskeleton::itemfont</option>, <option value="classKConfigSkeleton_1_1ItemInt.html">kconfigskeleton::itemint</option>, <option value="classKConfigSkeleton_1_1ItemInt64.html">kconfigskeleton::itemint64</option>, <option value="classKConfigSkeleton_1_1ItemIntList.html">kconfigskeleton::itemintlist</option>, <option value="classKConfigSkeleton_1_1ItemLong.html">kconfigskeleton::itemlong</option>, <option value="classKConfigSkeleton_1_1ItemPassword.html">kconfigskeleton::itempassword</option>, <option value="classKConfigSkeleton_1_1ItemPath.html">kconfigskeleton::itempath</option>, <option value="classKConfigSkeleton_1_1ItemPathList.html">kconfigskeleton::itempathlist</option>, <option value="classKConfigSkeleton_1_1ItemPoint.html">kconfigskeleton::itempoint</option>, <option value="classKConfigSkeleton_1_1ItemProperty.html">kconfigskeleton::itemproperty</option>, <option value="classKConfigSkeleton_1_1ItemRect.html">kconfigskeleton::itemrect</option>, <option value="classKConfigSkeleton_1_1ItemSize.html">kconfigskeleton::itemsize</option>, <option value="classKConfigSkeleton_1_1ItemString.html">kconfigskeleton::itemstring</option>, <option value="classKConfigSkeleton_1_1ItemStringList.html">kconfigskeleton::itemstringlist</option>, <option value="classKConfigSkeleton_1_1ItemUInt.html">kconfigskeleton::itemuint</option>, <option value="classKConfigSkeleton_1_1ItemUInt64.html">kconfigskeleton::itemuint64</option>, <option value="classKConfigSkeleton_1_1ItemULong.html">kconfigskeleton::itemulong</option>, <option value="classKConfigSkeletonItem.html">kconfigskeletonitem</option>, <option value="classKCrash.html">kcrash</option>, <option value="classKDCOPPropertyProxy.html">kdcoppropertyproxy</option>, <option value="classKDebugDCOPIface.html">kdebugdcopiface</option>, <option value="classKDesktopFile.html">kdesktopfile</option>, <option value="classKExtendedSocket.html">kextendedsocket</option>, <option value="classKGenericFactory.html">kgenericfactory</option>, <option value="classKGenericFactory_3_01KTypeList_3_01Product_00_01ProductListTail_01_4_00_01KTypeList_3_01Pare1ed8d1e5a9847c99711cad3b12c7e96c.html">kgenericfactory< ktypelist< product, productlisttail >, ktypelist< pare1ed8d1e5a9847c99711cad3b12c7e96c</option>, <option value="classKGenericFactory_3_01KTypeList_3_01Product_00_01ProductListTail_01_4_00_01KTypeList_3_01Paref6a00f76851e0daa2cb662bb8a41fc7f.html">kgenericfactory< ktypelist< product, productlisttail >, ktypelist< paref6a00f76851e0daa2cb662bb8a41fc7f</option>, <option value="classKGenericFactory_3_01KTypeList_3_01Product_00_01ProductListTail_01_4_00_01QObject_01_4.html">kgenericfactory< ktypelist< product, productlisttail >, qobject ></option>, <option value="classKGlobal.html">kglobal</option>, <option value="classKGlobalAccel.html">kglobalaccel</option>, <option value="classKGlobalSettings.html">kglobalsettings</option>, <option value="classKIcon.html">kicon</option>, <option value="classKIconEffect.html">kiconeffect</option>, <option value="classKIconLoader.html">kiconloader</option>, <option value="classKIconTheme.html">kicontheme</option>, <option value="classKInetSocketAddress.html">kinetsocketaddress</option>, <option value="classKInstance.html">kinstance</option>, <option value="classKIOBufferBase.html">kiobufferbase</option>, <option value="classKIPC.html">kipc</option>, <option value="classKKey.html">kkey</option>, <option value="classKKeyNative.html">kkeynative</option>, <option value="classKKeySequence.html">kkeysequence</option>, <option value="classKLibFactory.html">klibfactory</option>, <option value="classKLibLoader.html">klibloader</option>, <option value="classKLibrary.html">klibrary</option>, <option value="classKLocale.html">klocale</option>, <option value="classKLockFile.html">klockfile</option>, <option value="classKMacroExpanderBase.html">kmacroexpanderbase</option>, <option value="classKMD4.html">kmd4</option>, <option value="classKMD5.html">kmd5</option>, <option value="classKMimeSourceFactory.html">kmimesourcefactory</option>, <option value="classKMountPoint.html">kmountpoint</option>, <option value="classKMultipleDrag.html">kmultipledrag</option>, <option value="classKNetwork_1_1KActiveSocketBase.html">knetwork::kactivesocketbase</option>, <option value="classKNetwork_1_1KBufferedSocket.html">knetwork::kbufferedsocket</option>, <option value="classKNetwork_1_1KClientSocketBase.html">knetwork::kclientsocketbase</option>, <option value="classKNetwork_1_1KDatagramPacket.html">knetwork::kdatagrampacket</option>, <option value="classKNetwork_1_1KDatagramSocket.html">knetwork::kdatagramsocket</option>, <option value="classKNetwork_1_1KHttpProxySocketDevice.html">knetwork::khttpproxysocketdevice</option>, <option value="classKNetwork_1_1KInetSocketAddress.html">knetwork::kinetsocketaddress</option>, <option value="classKNetwork_1_1KIpAddress.html">knetwork::kipaddress</option>, <option value="classKNetwork_1_1KMulticastSocket.html">knetwork::kmulticastsocket</option>, <option value="classKNetwork_1_1KMulticastSocketImpl.html">knetwork::kmulticastsocketimpl</option>, <option value="classKNetwork_1_1KNetworkInterface.html">knetwork::knetworkinterface</option>, <option value="classKNetwork_1_1KPassiveSocketBase.html">knetwork::kpassivesocketbase</option>, <option value="classKNetwork_1_1KResolver.html">knetwork::kresolver</option>, <option value="classKNetwork_1_1KResolverEntry.html">knetwork::kresolverentry</option>, <option value="classKNetwork_1_1KResolverResults.html">knetwork::kresolverresults</option>, <option value="classKNetwork_1_1KResolverWorkerBase_1_1ResolverLocker.html">knetwork::kresolverworkerbase::resolverlocker</option>, <option value="classKNetwork_1_1KReverseResolver.html">knetwork::kreverseresolver</option>, <option value="classKNetwork_1_1KServerSocket.html">knetwork::kserversocket</option>, <option value="classKNetwork_1_1KSocketAddress.html">knetwork::ksocketaddress</option>, <option value="classKNetwork_1_1KSocketBase.html">knetwork::ksocketbase</option>, <option value="classKNetwork_1_1KSocketDevice.html">knetwork::ksocketdevice</option>, <option value="classKNetwork_1_1KSocketDeviceFactory.html">knetwork::ksocketdevicefactory</option>, <option value="classKNetwork_1_1KSocksSocketDevice.html">knetwork::ksockssocketdevice</option>, <option value="classKNetwork_1_1KStreamSocket.html">knetwork::kstreamsocket</option>, <option value="classKNetwork_1_1KUnixSocketAddress.html">knetwork::kunixsocketaddress</option>, <option value="classKNotifyClient_1_1Instance.html">knotifyclient::instance</option>, <option value="classKPalette.html">kpalette</option>, <option value="classKPixmapProvider.html">kpixmapprovider</option>, <option value="classKPopupAccelManager.html">kpopupaccelmanager</option>, <option value="classKProcess.html">kprocess</option>, <option value="classKProcessController.html">kprocesscontroller</option>, <option value="classKProcIO.html">kprocio</option>, <option value="classKProtocolInfoFactory.html">kprotocolinfofactory</option>, <option value="classKPty.html">kpty</option>, <option value="classKRandomSequence.html">krandomsequence</option>, <option value="classKRegExp.html">kregexp</option>, <option value="classKRegExpPrivate.html">kregexpprivate</option>, <option value="classKRFCDate.html">krfcdate</option>, <option value="classKRootProp.html">krootprop</option>, <option value="classKSaveFile.html">ksavefile</option>, <option value="classKServerSocket.html">kserversocket</option>, <option value="classKSessionManaged.html">ksessionmanaged</option>, <option value="classKShared.html">kshared</option>, <option value="classKSharedConfig.html">ksharedconfig</option>, <option value="classKSharedPtr.html">ksharedptr</option>, <option value="classKShellProcess.html">kshellprocess</option>, <option value="classKShortcut.html">kshortcut</option>, <option value="classKShortcutList.html">kshortcutlist</option>, <option value="classKSimpleConfig.html">ksimpleconfig</option>, <option value="classKSocket.html">ksocket</option>, <option value="classKSocketAddress.html">ksocketaddress</option>, <option value="classKSocks.html">ksocks</option>, <option value="classKSortableItem.html">ksortableitem</option>, <option value="classKSortableValueList.html">ksortablevaluelist</option>, <option value="classKStandardDirs.html">kstandarddirs</option>, <option value="classKStaticDeleter.html">kstaticdeleter</option>, <option value="classKStaticDeleterBase.html">kstaticdeleterbase</option>, <option value="classKStdAccel_1_1ShortcutList.html">kstdaccel::shortcutlist</option>, <option value="classKStringHandler.html">kstringhandler</option>, <option value="classKSycocaEntry.html">ksycocaentry</option>, <option value="classKSycocaFactoryList.html">ksycocafactorylist</option>, <option value="classKTempDir.html">ktempdir</option>, <option value="classKTempFile.html">ktempfile</option>, <option value="classKTimezone.html">ktimezone</option>, <option value="classKTimezoneDetails.html">ktimezonedetails</option>, <option value="classKTimezones.html">ktimezones</option>, <option value="classKTimezoneSource.html">ktimezonesource</option>, <option value="classKUniqueApplication.html">kuniqueapplication</option>, <option value="classKUnixSocketAddress.html">kunixsocketaddress</option>, <option value="classKURL.html">kurl</option>, <option value="classKURL_1_1List.html">kurl::list</option>, <option value="classKURLDrag.html">kurldrag</option>, <option value="classKUser.html">kuser</option>, <option value="classKUserGroup.html">kusergroup</option>, <option value="classKVMAllocator.html">kvmallocator</option>, <option value="classKWin.html">kwin</option>, <option value="classKWin_1_1WindowInfo.html">kwin::windowinfo</option>, <option value="classKWinModule.html">kwinmodule</option>, <option value="classKWordMacroExpander.html">kwordmacroexpander</option>, <option value="classKXErrorHandler.html">kxerrorhandler</option>, <option value="classKZoneAllocator.html">kzoneallocator</option>, <option value="classNET.html">net</option>, </select> </form> </div> --> </div></div> <div class="menu_box"><h2>API Dox</h2> <div class="nav_list"> <ul> <li><a href="../../arts/html/index.html">arts</a></li><li><a href="../../dcop/html/index.html">dcop</a></li><li><a href="../../dnssd/html/index.html">dnssd</a></li><li><a href="../../interfaces/html/index.html">interfaces</a></li><li> <a href="../../interfaces/kimproxy/interface/html/index.html">interface</a></li><li> <a href="../../interfaces/kimproxy/library/html/index.html">library</a></li><li> <a href="../../interfaces/kspeech/html/index.html">kspeech</a></li><li> <a href="../../interfaces/ktexteditor/html/index.html">ktexteditor</a></li><li><a href="../../kabc/html/index.html">kabc</a></li><li><a href="../../kate/html/index.html">kate</a></li><li><a href="../../kcmshell/html/index.html">kcmshell</a></li><li><a href="../../kdecore/html/index.html">kdecore</a></li><li><a href="../../kded/html/index.html">kded</a></li><li><a href="../../kdefx/html/index.html">kdefx</a></li><li><a href="../../kdeprint/html/index.html">kdeprint</a></li><li><a href="../../kdesu/html/index.html">kdesu</a></li><li><a href="../../kdeui/html/index.html">kdeui</a></li><li><a href="../../kdoctools/html/index.html">kdoctools</a></li><li><a href="../../khtml/html/index.html">khtml</a></li><li><a href="../../kimgio/html/index.html">kimgio</a></li><li><a href="../../kinit/html/index.html">kinit</a></li><li><a href="../../kio/html/index.html">kio</a></li><li> <a href="../../kio/bookmarks/html/index.html">bookmarks</a></li><li> <a href="../../kio/httpfilter/html/index.html">httpfilter</a></li><li> <a href="../../kio/kfile/html/index.html">kfile</a></li><li> <a href="../../kio/kio/html/index.html">kio</a></li><li> <a href="../../kio/kioexec/html/index.html">kioexec</a></li><li> <a href="../../kio/kpasswdserver/html/index.html">kpasswdserver</a></li><li> <a href="../../kio/kssl/html/index.html">kssl</a></li><li><a href="../../kioslave/html/index.html">kioslave</a></li><li> <a href="../../kioslave/http/html/index.html">http</a></li><li><a href="../../kjs/html/index.html">kjs</a></li><li><a href="../../kmdi/html/index.html">kmdi</a></li><li> <a href="../../kmdi/kmdi/html/index.html">kmdi</a></li><li><a href="../../knewstuff/html/index.html">knewstuff</a></li><li><a href="../../kparts/html/index.html">kparts</a></li><li><a href="../../kresources/html/index.html">kresources</a></li><li><a href="../../kspell2/html/index.html">kspell2</a></li><li><a href="../../kunittest/html/index.html">kunittest</a></li><li><a href="../../kutils/html/index.html">kutils</a></li><li><a href="../../kwallet/html/index.html">kwallet</a></li><li><a href="../../libkmid/html/index.html">libkmid</a></li><li><a href="../../libkscreensaver/html/index.html">libkscreensaver</a></li> </ul></div></div> </td> </tr> </table> <span class="doNotDisplay"> <a href="http://www.kde.org/" accesskey="8">KDE Home</a> | <a href="http://accessibility.kde.org/" accesskey="9">KDE Accessibility Home</a> | <a href="http://www.kde.org/media/accesskeys.php" accesskey="0">Description of Access Keys</a> </span> <div style="height: 8px"></div> <div id="footer"> <div id="footer_left"> Maintained by <a href="mailto:groot@kde.org">Adriaan de Groot</a> and <a href="mailto:winter@kde.org">Allen Winter</a>. <br/> KDE and K Desktop Environment are trademarks of <a href="http://www.kde.org/areas/kde-ev/" title="Homepage of the KDE non-profit Organization">KDE e.V.</a> | <a href="http://www.kde.org/contact/impressum.php">Legal</a> </div> <div id="footer_right"><img src="/media/images/footer_right.png" style="margin: 0px" alt="" /></div> </div> <!-- WARNING: DO NOT SEND MAIL TO THE FOLLOWING EMAIL ADDRESS! YOU WILL BE BLOCKED INSTANTLY AND PERMANENTLY! <a href="mailto:aaaatrap-425acc3b5374943f@kde.org">Block me</a> WARNING END --> </body> </html>