nwm
Version:
Dynamic window manager for X11
132 lines (127 loc) • 66.8 kB
HTML
<!DOCTYPE html> <html> <head> <title>nwm.js</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <link rel="stylesheet" media="all" href="docco.css" /> </head> <body> <div id="container"> <div id="background"></div> <table cellpadding="0" cellspacing="0"> <thead> <tr> <th class="docs"> <h1> nwm.js </h1> </th> <th class="code"> </th> </tr> </thead> <tbody> <tr id="section-1"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-1">¶</a> </div> <pre><code>nwm.js
(c) 2011 Mikito Takada
nwm is freely distributable under the MIT license.
Portions of nwm are inspired or borrowed from dwm.
</code></pre> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-2"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-2">¶</a> </div> <h2>Modules</h2> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-3"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-3">¶</a> </div> <p>Native extension</p> </td> <td class="code"> <div class="highlight"><pre><span class="kd">var</span> <span class="nx">X11wm</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'./build/default/nwm.node'</span><span class="p">).</span><span class="nx">NodeWM</span><span class="p">;</span>
<span class="kd">var</span> <span class="nx">Collection</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'./lib/collection.js'</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">Monitor</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'./lib/monitor.js'</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">Window</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'./lib/window.js'</span><span class="p">);</span></pre></div> </td> </tr> <tr id="section-4"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-4">¶</a> </div> <h2>Node Window Manager</h2> </td> <td class="code"> <div class="highlight"><pre><span class="kd">var</span> <span class="nx">NWM</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">binding</span><span class="p">)</span> <span class="p">{</span></pre></div> </td> </tr> <tr id="section-5"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-5">¶</a> </div> <p>A reference to the nwm C++ X11 binding</p> </td> <td class="code"> <div class="highlight"><pre> <span class="k">this</span><span class="p">.</span><span class="nx">wm</span> <span class="o">=</span> <span class="p">(</span><span class="nx">binding</span> <span class="o">?</span> <span class="nx">binding</span> <span class="o">:</span> <span class="k">new</span> <span class="nx">X11wm</span><span class="p">());</span></pre></div> </td> </tr> <tr id="section-6"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-6">¶</a> </div> <p>Known layous</p> </td> <td class="code"> <div class="highlight"><pre> <span class="k">this</span><span class="p">.</span><span class="nx">layouts</span> <span class="o">=</span> <span class="p">{};</span></pre></div> </td> </tr> <tr id="section-7"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-7">¶</a> </div> <p>Keyboard shortcut lookup</p> </td> <td class="code"> <div class="highlight"><pre> <span class="k">this</span><span class="p">.</span><span class="nx">shortcuts</span> <span class="o">=</span> <span class="p">[];</span></pre></div> </td> </tr> <tr id="section-8"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-8">¶</a> </div> <p>monitors</p> </td> <td class="code"> <div class="highlight"><pre> <span class="k">this</span><span class="p">.</span><span class="nx">monitors</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Collection</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="s1">'monitor'</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span></pre></div> </td> </tr> <tr id="section-9"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-9">¶</a> </div> <p>windows -- this is the global storage for windows, any other objects just store ids referring to this hash.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="k">this</span><span class="p">.</span><span class="nx">windows</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Collection</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="s1">'window'</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="k">this</span><span class="p">.</span><span class="nx">floaters</span> <span class="o">=</span> <span class="p">[];</span>
<span class="p">}</span>
<span class="nx">require</span><span class="p">(</span><span class="s1">'util'</span><span class="p">).</span><span class="nx">inherits</span><span class="p">(</span><span class="nx">NWM</span><span class="p">,</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'events'</span><span class="p">).</span><span class="nx">EventEmitter</span><span class="p">);</span></pre></div> </td> </tr> <tr id="section-10"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-10">¶</a> </div> <h2>Events</h2> </td> <td class="code"> <div class="highlight"><pre><span class="nx">NWM</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">events</span> <span class="o">=</span> <span class="p">{</span></pre></div> </td> </tr> <tr id="section-11"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-11">¶</a> </div> <h2>Monitor events</h2>
<p>A new monitor is added</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">addMonitor</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">monitor</span><span class="p">)</span> <span class="p">{</span>
<span class="k">this</span><span class="p">.</span><span class="nx">monitors</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="k">new</span> <span class="nx">Monitor</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">monitor</span><span class="p">));</span>
<span class="k">this</span><span class="p">.</span><span class="nx">monitors</span><span class="p">.</span><span class="nx">current</span> <span class="o">=</span> <span class="nx">monitor</span><span class="p">.</span><span class="nx">id</span><span class="p">;</span></pre></div> </td> </tr> <tr id="section-12"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-12">¶</a> </div> <p>TODO:
When a monitor is added, check that the x coordinates
represent a continuous space.
Virtualbox incorrectly reports the starting
x position even when it correctly detects the w/h of the monitor</p> </td> <td class="code"> <div class="highlight"><pre> <span class="p">},</span></pre></div> </td> </tr> <tr id="section-13"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-13">¶</a> </div> <p>A monitor is updated</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">updateMonitor</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">monitor</span><span class="p">)</span> <span class="p">{</span>
<span class="k">this</span><span class="p">.</span><span class="nx">monitors</span><span class="p">.</span><span class="nx">update</span><span class="p">(</span><span class="nx">monitor</span><span class="p">.</span><span class="nx">id</span><span class="p">,</span> <span class="nx">monitor</span><span class="p">);</span>
<span class="p">},</span></pre></div> </td> </tr> <tr id="section-14"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-14">¶</a> </div> <p>A monitor is removed</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">removeMonitor</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">id</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">'Remove monitor'</span><span class="p">,</span> <span class="nx">id</span><span class="p">);</span>
<span class="k">this</span><span class="p">.</span><span class="nx">monitors</span><span class="p">.</span><span class="nx">remove</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">monitor</span><span class="p">){</span> <span class="k">return</span> <span class="p">(</span><span class="nx">monitor</span><span class="p">.</span><span class="nx">id</span> <span class="o">!=</span> <span class="nx">id</span><span class="p">);</span> <span class="p">});</span>
<span class="p">},</span></pre></div> </td> </tr> <tr id="section-15"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-15">¶</a> </div> <h2>Window events</h2>
<p>A new window is added</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">addWindow</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nb">window</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span><span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">id</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">monitor</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">monitors</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">monitors</span><span class="p">.</span><span class="nx">current</span><span class="p">);</span>
<span class="nb">window</span><span class="p">.</span><span class="nx">workspace</span> <span class="o">=</span> <span class="nx">monitor</span><span class="p">.</span><span class="nx">workspaces</span><span class="p">.</span><span class="nx">current</span><span class="p">;</span></pre></div> </td> </tr> <tr id="section-16"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-16">¶</a> </div> <p>ignore monitor number from binding as windows should open on the focused monitor</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nb">window</span><span class="p">.</span><span class="nx">monitor</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">monitors</span><span class="p">.</span><span class="nx">current</span><span class="p">;</span>
<span class="kd">var</span> <span class="nx">current_monitor</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">monitors</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">monitors</span><span class="p">.</span><span class="nx">current</span><span class="p">);</span>
<span class="k">if</span><span class="p">(</span><span class="nx">current_monitor</span><span class="p">.</span><span class="nx">focused_window</span> <span class="o">==</span> <span class="kc">null</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">current_monitor</span><span class="p">.</span><span class="nx">focused_window</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">id</span><span class="p">;</span>
<span class="p">}</span></pre></div> </td> </tr> <tr id="section-17"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-17">¶</a> </div> <p>do not add floating windows</p> </td> <td class="code"> <div class="highlight"><pre> <span class="k">if</span><span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">isfloating</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">'Ignoring floating window: '</span><span class="p">,</span> <span class="nb">window</span><span class="p">);</span>
<span class="k">this</span><span class="p">.</span><span class="nx">floaters</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">id</span><span class="p">);</span>
<span class="k">return</span><span class="p">;</span>
<span class="p">}</span>
<span class="kd">var</span> <span class="nb">window</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Window</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nb">window</span><span class="p">);</span></pre></div> </td> </tr> <tr id="section-18"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-18">¶</a> </div> <p>windows might be placed outside the screen if the wm was terminated</p> </td> <td class="code"> <div class="highlight"><pre> <span class="k">if</span><span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">x</span> <span class="o">></span> <span class="nx">monitor</span><span class="p">.</span><span class="nx">width</span> <span class="o">||</span> <span class="nb">window</span><span class="p">.</span><span class="nx">y</span> <span class="o">></span> <span class="nx">monitor</span><span class="p">.</span><span class="nx">height</span><span class="p">)</span> <span class="p">{</span>
<span class="nb">window</span><span class="p">.</span><span class="nx">move</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="p">}</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">'Add window'</span><span class="p">,</span> <span class="nb">window</span><span class="p">);</span>
<span class="k">this</span><span class="p">.</span><span class="nx">windows</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nb">window</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">},</span></pre></div> </td> </tr> <tr id="section-19"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-19">¶</a> </div> <p>When a window is removed</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">removeWindow</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">id</span><span class="p">)</span> <span class="p">{</span>
<span class="k">this</span><span class="p">.</span><span class="nx">windows</span><span class="p">.</span><span class="nx">remove</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nb">window</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">id</span> <span class="o">!=</span> <span class="nx">id</span><span class="p">);</span> <span class="p">});</span>
<span class="kd">var</span> <span class="nx">pos</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">floaters</span><span class="p">.</span><span class="nx">indexOf</span><span class="p">(</span><span class="nx">id</span><span class="p">);</span>
<span class="k">if</span><span class="p">(</span><span class="nx">pos</span> <span class="o">></span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
<span class="k">this</span><span class="p">.</span><span class="nx">floaters</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">floaters</span><span class="p">.</span><span class="nx">splice</span><span class="p">(</span><span class="nx">pos</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">},</span></pre></div> </td> </tr> <tr id="section-20"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-20">¶</a> </div> <p>When a window is updated
This is only triggered for title and class updates, never coordinates or monitors.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">updateWindow</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nb">window</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">windows</span><span class="p">.</span><span class="nx">exists</span><span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">id</span><span class="p">))</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">old</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">windows</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">id</span><span class="p">);</span>
<span class="k">this</span><span class="p">.</span><span class="nx">windows</span><span class="p">.</span><span class="nx">update</span><span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">id</span><span class="p">,</span> <span class="p">{</span>
<span class="nx">title</span><span class="o">:</span> <span class="nb">window</span><span class="p">.</span><span class="nx">title</span> <span class="o">||</span> <span class="nx">old</span><span class="p">.</span><span class="nx">title</span> <span class="o">||</span> <span class="s1">''</span><span class="p">,</span>
<span class="kr">class</span><span class="o">:</span> <span class="nb">window</span><span class="p">.</span><span class="kr">class</span> <span class="o">||</span> <span class="nx">old</span><span class="p">.</span><span class="kr">class</span> <span class="o">||</span> <span class="s1">''</span>
<span class="p">});</span>
<span class="p">}</span>
<span class="p">},</span></pre></div> </td> </tr> <tr id="section-21"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-21">¶</a> </div> <p>When a window requests full screen mode</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">fullscreen</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">id</span><span class="p">,</span> <span class="nx">status</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">windows</span><span class="p">.</span><span class="nx">exists</span><span class="p">(</span><span class="nx">id</span><span class="p">))</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nb">window</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">windows</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">id</span><span class="p">);</span>
<span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="k">this</span><span class="p">.</span><span class="nx">monitors</span><span class="p">.</span><span class="nx">exists</span><span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">monitor</span><span class="p">))</span> <span class="p">{</span></pre></div> </td> </tr> <tr id="section-22"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-22">¶</a> </div> <p>TODO handle this error, which occurs when a win was in fullscren and then the monitor was removed, then fullscreen is toggled back</p> </td> <td class="code"> <div class="highlight"><pre> <span class="k">return</span><span class="p">;</span>
<span class="p">}</span></pre></div> </td> </tr> <tr id="section-23"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-23">¶</a> </div> <p>use the monitor dimensions associated with the window</p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">var</span> <span class="nx">monitor</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">monitors</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">monitor</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">workspace</span> <span class="o">=</span> <span class="nx">monitor</span><span class="p">.</span><span class="nx">workspaces</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">monitor</span><span class="p">.</span><span class="nx">workspaces</span><span class="p">.</span><span class="nx">current</span><span class="p">);</span>
<span class="k">if</span><span class="p">(</span><span class="nx">status</span><span class="p">)</span> <span class="p">{</span>
<span class="k">this</span><span class="p">.</span><span class="nx">wm</span><span class="p">.</span><span class="nx">moveWindow</span><span class="p">(</span><span class="nx">id</span><span class="p">,</span> <span class="nx">monitor</span><span class="p">.</span><span class="nx">x</span><span class="p">,</span> <span class="nx">monitor</span><span class="p">.</span><span class="nx">y</span><span class="p">);</span>
<span class="k">this</span><span class="p">.</span><span class="nx">wm</span><span class="p">.</span><span class="nx">resizeWindow</span><span class="p">(</span><span class="nx">id</span><span class="p">,</span> <span class="nx">monitor</span><span class="p">.</span><span class="nx">width</span><span class="p">,</span> <span class="nx">monitor</span><span class="p">.</span><span class="nx">height</span><span class="p">);</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="nx">workspace</span><span class="p">.</span><span class="nx">rearrange</span><span class="p">();</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">},</span></pre></div> </td> </tr> <tr id="section-24"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-24">¶</a> </div> <p>ConfigureRequest is generated when a client window wants to change its size, stacking order or border width</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">configureRequest</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">ev</span><span class="p">){</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">'configureRequest'</span><span class="p">,</span> <span class="nx">ev</span><span class="p">);</span>
<span class="k">this</span><span class="p">.</span><span class="nx">wm</span><span class="p">.</span><span class="nx">configureWindow</span><span class="p">(</span><span class="nx">ev</span><span class="p">.</span><span class="nx">id</span><span class="p">,</span> <span class="nx">ev</span><span class="p">.</span><span class="nx">x</span><span class="p">,</span> <span class="nx">ev</span><span class="p">.</span><span class="nx">y</span><span class="p">,</span> <span class="nx">ev</span><span class="p">.</span><span class="nx">width</span><span class="p">,</span> <span class="nx">ev</span><span class="p">.</span><span class="nx">height</span><span class="p">,</span> <span class="nx">ev</span><span class="p">.</span><span class="nx">border_width</span><span class="p">,</span>
<span class="nx">ev</span><span class="p">.</span><span class="nx">above</span><span class="p">,</span> <span class="nx">ev</span><span class="p">.</span><span class="nx">detail</span><span class="p">,</span> <span class="nx">ev</span><span class="p">.</span><span class="nx">value_mask</span><span class="p">);</span>
<span class="k">return</span><span class="p">;</span>
<span class="k">if</span><span class="p">(</span><span class="nx">ev</span><span class="p">.</span><span class="nx">id</span> <span class="o">&&</span> <span class="k">this</span><span class="p">.</span><span class="nx">windows</span><span class="p">.</span><span class="nx">exists</span><span class="p">(</span><span class="nx">ev</span><span class="p">.</span><span class="nx">id</span><span class="p">))</span> <span class="p">{</span></pre></div> </td> </tr> <tr id="section-25"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-25">¶</a> </div> <p>Check whether the window is known (e.g. managed and not floating)
Known windows should not be allowed to reconfigure themselves.
They should just be send back a ConfigureNotify() with the current info</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">'denying configureRequest'</span><span class="p">);</span>
<span class="kd">var</span> <span class="nb">window</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">windows</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">id</span><span class="p">);</span>
<span class="k">this</span><span class="p">.</span><span class="nx">wm</span><span class="p">.</span><span class="nx">notifyWindow</span><span class="p">(</span><span class="nx">ev</span><span class="p">.</span><span class="nx">id</span><span class="p">,</span> <span class="nb">window</span><span class="p">.</span><span class="nx">x</span><span class="p">,</span> <span class="nb">window</span><span class="p">.</span><span class="nx">y</span><span class="p">,</span> <span class="nb">window</span><span class="p">.</span><span class="nx">width</span><span class="p">,</span> <span class="nb">window</span><span class="p">.</span><span class="nx">height</span><span class="p">,</span> <span class="nx">ev</span><span class="p">.</span><span class="nx">border_width</span><span class="p">,</span>
<span class="nx">ev</span><span class="p">.</span><span class="nx">above</span><span class="p">,</span> <span class="nx">ev</span><span class="p">.</span><span class="nx">detail</span><span class="p">,</span> <span class="nx">ev</span><span class="p">.</span><span class="nx">value_mask</span><span class="p">);</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">'allowing configureRequest'</span><span class="p">);</span>
<span class="k">if</span><span class="p">(</span><span class="nx">ev</span><span class="p">.</span><span class="nx">id</span> <span class="o">&&</span> <span class="k">this</span><span class="p">.</span><span class="nx">floaters</span><span class="p">.</span><span class="nx">indexOf</span><span class="p">(</span><span class="nx">ev</span><span class="p">.</span><span class="nx">id</span><span class="p">))</span> <span class="p">{</span></pre></div> </td> </tr> <tr id="section-26"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-26">¶</a> </div> <p>If the window is floating, it should be moved and resized
The size should be modifiable, but the floating window should be centered
on the current monitor (or the monitor the floater is on, but we don't track that now)</p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">var</span> <span class="nx">monitor</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">currentMonitor</span><span class="p">();</span>
<span class="nx">ev</span><span class="p">.</span><span class="nx">x</span> <span class="o">=</span> <span class="nx">monitor</span><span class="p">.</span><span class="nx">x</span> <span class="o">+</span> <span class="nx">ev</span><span class="p">.</span><span class="nx">x</span><span class="p">;</span>
<span class="nx">ev</span><span class="p">.</span><span class="nx">y</span> <span class="o">=</span> <span class="nx">monitor</span><span class="p">.</span><span class="nx">y</span> <span class="o">+</span> <span class="nx">ev</span><span class="p">.</span><span class="nx">y</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span> <span class="p">(</span><span class="nx">ev</span><span class="p">.</span><span class="nx">x</span> <span class="o">+</span> <span class="nx">ev</span><span class="p">.</span><span class="nx">width</span><span class="p">)</span> <span class="o">></span> <span class="nx">monitor</span><span class="p">.</span><span class="nx">x</span> <span class="o">+</span> <span class="nx">monitor</span><span class="p">.</span><span class="nx">width</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">ev</span><span class="p">.</span><span class="nx">x</span> <span class="o">=</span> <span class="nx">monitor</span><span class="p">.</span><span class="nx">x</span> <span class="o">+</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">floor</span><span class="p">(</span><span class="nx">monitor</span><span class="p">.</span><span class="nx">width</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">-</span> <span class="nx">ev</span><span class="p">.</span><span class="nx">width</span> <span class="o">/</span> <span class="mi">2</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">if</span> <span class="p">(</span> <span class="p">(</span><span class="nx">ev</span><span class="p">.</span><span class="nx">y</span> <span class="o">+</span> <span class="nx">ev</span><span class="p">.</span><span class="nx">heigth</span><span class="p">)</span> <span class="o">></span> <span class="nx">monitor</span><span class="p">.</span><span class="nx">y</span> <span class="o">+</span> <span class="nx">monitor</span><span class="p">.</span><span class="nx">height</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">ev</span><span class="p">.</span><span class="nx">y</span> <span class="o">=</span> <span class="nx">monitor</span><span class="p">.</span><span class="nx">y</span> <span class="o">+</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">floor</span><span class="p">(</span><span class="nx">monitor</span><span class="p">.</span><span class="nx">height</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">-</span> <span class="nx">ev</span><span class="p">.</span><span class="nx">height</span> <span class="o">/</span> <span class="mi">2</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span></pre></div> </td> </tr> <tr id="section-27"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-27">¶</a> </div> <p>Unknown windows should be passed through with a XConfigureWindow()</p> </td> <td class="code"> <div class="highlight"><pre> <span class="k">this</span><span class="p">.</span><span class="nx">wm</span><span class="p">.</span><span class="nx">configureWindow</span><span class="p">(</span><span class="nx">ev</span><span class="p">.</span><span class="nx">id</span><span class="p">,</span> <span class="nx">ev</span><span class="p">.</span><span class="nx">x</span><span class="p">,</span> <span class="nx">ev</span><span class="p">.</span><span class="nx">y</span><span class="p">,</span> <span class="nx">ev</span><span class="p">.</span><span class="nx">width</span><span class="p">,</span> <span class="nx">ev</span><span class="p">.</span><span class="nx">height</span><span class="p">,</span> <span class="nx">ev</span><span class="p">.</span><span class="nx">border_width</span><span class="p">,</span>
<span class="nx">ev</span><span class="p">.</span><span class="nx">above</span><span class="p">,</span> <span class="nx">ev</span><span class="p">.</span><span class="nx">detail</span><span class="p">,</span> <span class="nx">ev</span><span class="p">.</span><span class="nx">value_mask</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">},</span></pre></div> </td> </tr> <tr id="section-28"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-28">¶</a> </div> <h2>Mouse events</h2>
<p>A mouse button has been clicked</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">mouseDown</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="p">)</span> <span class="p">{</span>
<span class="k">this</span><span class="p">.</span><span class="nx">wm</span><span class="p">.</span><span class="nx">focusWindow</span><span class="p">(</span><span class="nx">event</span><span class="p">.</span><span class="nx">id</span><span class="p">);</span>
<span class="p">},</span></pre></div> </td> </tr> <tr id="section-29"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-29">¶</a> </div> <p>A mouse drag is in progress</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">mouseDrag</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="p">)</span> <span class="p">{</span></pre></div> </td> </tr> <tr id="section-30"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-30">¶</a> </div> <p>move when drag is triggered</p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">var</span> <span class="nx">change_x</span> <span class="o">=</span> <span class="nx">event</span><span class="p">.</span><span class="nx">move_x</span> <span class="o">-</span> <span class="nx">event</span><span class="p">.</span><span class="nx">x</span><span class="p">;</span>
<span class="kd">var</span> <span class="nx">change_y</span> <span class="o">=</span> <span class="nx">event</span><span class="p">.</span><span class="nx">move_y</span> <span class="o">-</span> <span class="nx">event</span><span class="p">.</span><span class="nx">y</span><span class="p">;</span>
<span class="kd">var</span> <span class="nb">window</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">windows</span><span class="p">.</span><span class="nx">exists</span><span class="p">(</span><span class="nx">event</span><span class="p">.</span><span class="nx">id</span><span class="p">)</span> <span class="o">&&</span> <span class="k">this</span><span class="p">.</span><span class="nx">windows</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">event</span><span class="p">.</span><span class="nx">id</span><span class="p">);</span>
<span class="k">if</span><span class="p">(</span><span class="nb">window</span><span class="p">)</span> <span class="p">{</span>
<span class="k">this</span><span class="p">.</span><span class="nx">wm</span><span class="p">.</span><span class="nx">moveWindow</span><span class="p">(</span><span class="nx">event</span><span class="p">.</span><span class="nx">id</span><span class="p">,</span> <span class="nb">window</span><span class="p">.</span><span class="nx">x</span><span class="o">+</span><span class="nx">change_x</span><span class="p">,</span> <span class="nb">window</span><span class="p">.</span><span class="nx">y</span><span class="o">+</span><span class="nx">change_y</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">},</span></pre></div> </td> </tr> <tr id="section-31"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-31">¶</a> </div> <p>Mouse enters a window</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">enterNotify</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="p">){</span>
<span class="k">if</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">windows</span><span class="p">.</span><span class="nx">exists</span><span class="p">(</span><span class="nx">event</span><span class="p">.</span><span class="nx">id</span><span class="p">))</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nb">window</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">windows</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">event</span><span class="p">.</span><span class="nx">id</span><span class="p">);</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">'focused monitor is '</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">monitors</span><span class="p">.</span><span class="nx">current</span><span class="p">,</span> <span class="s1">'focusing to'</span><span class="p">,</span> <span class="nb">window</span><span class="p">.</span><span class="nx">monitor</span><span class="p">,</span> <span class="nb">window</span><span class="p">.</span><span class="nx">title</span><span class="p">);</span>
<span class="k">if</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">monitors</span><span class="p">.</span><span class="nx">exists</span><span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">monitor</span><span class="p">))</span> <span class="p">{</span>
<span class="k">this</span><span class="p">.</span><span class="nx">monitors</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">monitor</span><span class="p">).</span><span class="nx">focused_window</span> <span class="o">=</span> <span class="nx">event</span><span class="p">.</span><span class="nx">id</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">this</span><span class="p">.</span><span class="nx">wm</span><span class="p">.</span><span class="nx">focusWindow</span><span class="p">(</span><span class="nx">event</span><span class="p">.</span><span class="nx">id</span><span class="p">);</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">'WARNING got focus event for nonexistent (transient) window'</span><span class="p">,</span> <span class="nx">event</span><span class="p">);</span></pre></div> </td> </tr> <tr id="section-32"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-32">¶</a> </div> <p>transients need this to happen to get keyboard focus</p> </td> <td class="code"> <div class="highlight"><pre> <span class="k">this</span><span class="p">.</span><span class="nx">wm</span><span class="p">.</span><span class="nx">focusWindow</span><span class="p">(</span><span class="nx">event</span><span class="p">.</span><span class="nx">id</span><span class="p">);</span>
<span class="p">}</span></pre></div> </td> </tr> <tr id="section-33"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-33">¶</a> </div> <p>This event is also emitted for the root window
so in any case, we want to set the current monitor based on the event coordinates</p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">var</span> <span class="nx">x</span> <span class="o">=</span> <span class="nx">event</span><span class="p">.</span><span class="nx">x_root</span> <span class="o">||</span> <span class="nx">event</span><span class="p">.</span><span class="nx">x</span><span class="p">;</span>
<span class="kd">var</span> <span class="nx">y</span> <span class="o">=</span> <span class="nx">event</span><span class="p">.</span><span class="nx">y_root</span> <span class="o">||</span> <span class="nx">event</span><span class="p">.</span><span class="nx">y</span><span class="p">;</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">'Focus monitor by coordinates'</span><span class="p">,</span> <span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">);</span></pre></div> </td> </tr> <tr id="section-34"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-34">¶</a> </div> <p>go through the monitors and find a matching monitor</p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">var</span> <span class="nx">monitor_ids</span> <span class="o">=</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">keys</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">monitors</span><span class="p">.</span><span class="nx">items</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">self</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
<span class="nx">monitor_ids</span><span class="p">.</span><span class="nx">some</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">monid</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">monitor</span> <span class="o">=</span> <span class="nx">self</span><span class="p">.</span><span class="nx">monitors</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">monid</span><span class="p">);</span>
<span class="k">if</span><span class="p">(</span><span class="nx">monitor</span><span class="p">.</span><span class="nx">inside</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">))</span> <span class="p">{</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">'Change focused monitor: '</span><span class="p">,</span> <span class="nx">monid</span><span class="p">);</span>
<span class="nx">self</span><span class="p">.</span><span class="nx">monitors</span><span class="p">.</span><span class="nx">current</span> <span class="o">=</span> <span class="nx">monid</span><span class="p">;</span>
<span class="k">return</span> <span class="kc">true</span><span class="p">;</span> <span class="c1">// end iteration</span>
<span class="