]> git.sur5r.net Git - i3/i3/commitdiff
Merge branch 'master' into next
authorMichael Stapelberg <michael@stapelberg.de>
Sun, 10 Jun 2012 16:19:29 +0000 (18:19 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Sun, 10 Jun 2012 16:19:29 +0000 (18:19 +0200)
17 files changed:
GOALS [deleted file]
contrib/banner.svg [new file with mode: 0644]
contrib/dump-asy.pl [new file with mode: 0755]
contrib/gtk-tree-watch.pl [new file with mode: 0755]
contrib/i3-wsbar [new file with mode: 0755]
contrib/show-download-count.sh [new file with mode: 0644]
contrib/sticker_stickma_black.svg [new file with mode: 0644]
docs/slides-2012-03-16/TdilE.jpg [new file with mode: 0644]
docs/slides-2012-03-16/Ubuntu_Linux_Jaunty_screenshot.png [new file with mode: 0644]
docs/slides-2012-03-16/i3.tex [new file with mode: 0644]
dump-asy.pl [deleted file]
gtk-tree-watch.pl [deleted file]
i3-wsbar [deleted file]
i3.welcome [deleted file]
render-tree/Con.pm [deleted file]
render-tree/render.pl [deleted file]
show-download-count.sh [deleted file]

diff --git a/GOALS b/GOALS
deleted file mode 100644 (file)
index 40d548f..0000000
--- a/GOALS
+++ /dev/null
@@ -1,6 +0,0 @@
-GOALS (these have to be fullfilled all the time):
-
- * Do _NOT_ use autotools or a similar mechanism. Instead, document all
-   requirements properly so that packagers for every plattform can easily
-   provide users with a package. Those who build software for themselves
-   do know how to install requirements, if they are documented.
diff --git a/contrib/banner.svg b/contrib/banner.svg
new file mode 100644 (file)
index 0000000..af82021
--- /dev/null
@@ -0,0 +1,620 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="7086.6138"
+   height="2622.0471"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.1 r9760"
+   sodipodi:docname="banner.pdf"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   version="1.1">
+  <defs
+     id="defs4">
+    <linearGradient
+       id="linearGradient3750">
+      <stop
+         style="stop-color:#17273b;stop-opacity:1;"
+         offset="0"
+         id="stop3752" />
+      <stop
+         id="stop4356"
+         offset="0.41666666"
+         style="stop-color:#008cd4;stop-opacity:0.78039217;" />
+      <stop
+         style="stop-color:#6eb5de;stop-opacity:0.69803923;"
+         offset="0.87847221"
+         id="stop4358" />
+      <stop
+         style="stop-color:#88bfe5;stop-opacity:0.61960787;"
+         offset="1"
+         id="stop3754" />
+    </linearGradient>
+    <inkscape:perspective
+       id="perspective3661"
+       inkscape:persp3d-origin="750.50629 : 505.26732 : 1"
+       inkscape:vp_z="683.5728 : 1230.5721 : 1"
+       inkscape:vp_y="0 : 1946.8917 : 0"
+       inkscape:vp_x="-526.84957 : 2.2065866e-13 : 0"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       id="linearGradient3284">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3286" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0.7518248;"
+         offset="1"
+         id="stop3288" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3278">
+      <stop
+         id="stop3280"
+         offset="0"
+         style="stop-color:#33bff7;stop-opacity:0.38039216;" />
+      <stop
+         id="stop3282"
+         offset="1"
+         style="stop-color:#2d446b;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3272">
+      <stop
+         id="stop3274"
+         offset="0"
+         style="stop-color:#2596f6;stop-opacity:0.38039216;" />
+      <stop
+         id="stop3276"
+         offset="1"
+         style="stop-color:#2d446b;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3266">
+      <stop
+         id="stop3268"
+         offset="0"
+         style="stop-color:#189fff;stop-opacity:0.38039216;" />
+      <stop
+         id="stop3270"
+         offset="1"
+         style="stop-color:#010b2b;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3244">
+      <stop
+         id="stop3246"
+         offset="0"
+         style="stop-color:#419bff;stop-opacity:1;" />
+      <stop
+         id="stop3248"
+         offset="1"
+         style="stop-color:#002359;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3159">
+      <stop
+         style="stop-color:#33bff7;stop-opacity:0.38039216;"
+         offset="0"
+         id="stop3161" />
+      <stop
+         style="stop-color:#2d446b;stop-opacity:1;"
+         offset="1"
+         id="stop3163" />
+    </linearGradient>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="-526.84957 : 2.9848654e-13 : 0"
+       inkscape:vp_y="1.192088e-13 : 1946.8917 : 0"
+       inkscape:vp_z="680.54236 : 1232.3792 : 1"
+       inkscape:persp3d-origin="730.30325 : 937.39936 : 1"
+       id="perspective10" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3244"
+       id="radialGradient3256"
+       cx="344.73471"
+       cy="77.263504"
+       fx="344.73471"
+       fy="77.263504"
+       r="196.15704"
+       gradientTransform="matrix(-1.39796,-0.05336032,0.08355111,-2.1889079,820.20461,272.08319)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3159"
+       id="radialGradient3264"
+       cx="140.3363"
+       cy="300.27451"
+       fx="140.3363"
+       fy="300.27451"
+       r="206.15704"
+       gradientTransform="matrix(0.6771172,-0.6830119,1.1802789,1.1700925,-161.83993,77.639162)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3284"
+       id="radialGradient3290"
+       cx="267.50388"
+       cy="337.12692"
+       fx="267.50388"
+       fy="337.12692"
+       r="77.845421"
+       gradientTransform="matrix(1,0,0,0.7430849,0,86.613009)"
+       gradientUnits="userSpaceOnUse" />
+    <inkscape:perspective
+       id="perspective3373"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       id="linearGradient3211">
+      <stop
+         id="stop3213"
+         offset="0"
+         style="stop-color: rgb(0, 160, 255); stop-opacity: 1;" />
+      <stop
+         id="stop3215"
+         offset="1"
+         style="stop-color: rgb(0, 37, 255); stop-opacity: 1;" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       id="filter3406"
+       color-interpolation-filters="sRGB">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="13.396228"
+         id="feGaussianBlur3408" />
+    </filter>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3284"
+       id="radialGradient3416"
+       cx="119.96373"
+       cy="229.28981"
+       fx="119.96373"
+       fy="229.28981"
+       r="203.19508"
+       gradientTransform="matrix(0.7210805,2.1168143,-1.4722239,0.5015047,347.53034,-320.94088)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3266"
+       id="radialGradient3423"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(9.0785365,-9.2630105,16.085822,15.212343,-6979.1531,-2584.4202)"
+       cx="351.15485"
+       cy="372.06332"
+       fx="351.15485"
+       fy="372.06332"
+       r="163.57143" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3284"
+       id="radialGradient3734"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.7210805,2.1168143,-1.4722239,0.5015047,347.53034,-320.94088)"
+       cx="119.96373"
+       cy="229.28981"
+       fx="119.96373"
+       fy="229.28981"
+       r="203.19508" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3284"
+       id="radialGradient3736"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.7210805,2.1168143,-1.4722239,0.5015047,347.53034,-320.94088)"
+       cx="119.96373"
+       cy="229.28981"
+       fx="119.96373"
+       fy="229.28981"
+       r="203.19508" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3750"
+       id="radialGradient3758"
+       cx="390.69662"
+       cy="258.92429"
+       fx="390.69662"
+       fy="258.92429"
+       r="32.03125"
+       gradientTransform="matrix(4.0292425,-5.5974184,5.1695404,3.721239,-2510.9809,1613.1551)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3750"
+       id="radialGradient3760"
+       cx="59.046589"
+       cy="248.2272"
+       fx="59.046589"
+       fy="248.2272"
+       r="197.15625"
+       gradientTransform="matrix(1.7105919,-0.04370519,0.03334715,1.3051856,-58.593126,-250.18318)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3750"
+       id="radialGradient3762"
+       cx="192.64008"
+       cy="282.40387"
+       fx="192.64008"
+       fy="282.40387"
+       r="133.09375"
+       gradientTransform="matrix(1.0081228,0.4493093,-1.0529321,2.3624813,273.13721,-455.12138)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3750"
+       id="radialGradient4344"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(5.7478532,-0.5889281,0.4834745,4.7186431,-260.98332,-919.446)"
+       cx="24"
+       cy="280.45392"
+       fx="24"
+       fy="280.45392"
+       r="65.0625" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3750"
+       id="linearGradient4354"
+       x1="-125.59599"
+       y1="-100.47679"
+       x2="-5.2882538"
+       y2="-100.47679"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.062500002"
+     inkscape:cx="2861.2881"
+     inkscape:cy="656.52996"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="956"
+     inkscape:window-height="1018"
+     inkscape:window-x="2560"
+     inkscape:window-y="162"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:window-maximized="0"
+     units="cm" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+        <dc:contributor>
+          <cc:Agent>
+            <dc:title>yellowiscool, farvardin</dc:title>
+          </cc:Agent>
+        </dc:contributor>
+        <dc:creator>
+          <cc:Agent>
+            <dc:title>steckdenis</dc:title>
+          </cc:Agent>
+        </dc:creator>
+        <dc:description>Logo for I3, an improved dynamic tiling window manager: http://i3.zekjur.net/</dc:description>
+        <cc:license
+           rdf:resource="http://creativecommons.org/licenses/by-sa/3.0/" />
+      </cc:Work>
+      <cc:License
+         rdf:about="http://creativecommons.org/licenses/by-sa/3.0/">
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Reproduction" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Distribution" />
+        <cc:requires
+           rdf:resource="http://creativecommons.org/ns#Notice" />
+        <cc:requires
+           rdf:resource="http://creativecommons.org/ns#Attribution" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+        <cc:requires
+           rdf:resource="http://creativecommons.org/ns#ShareAlike" />
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="fond"
+     style="display:none"
+     transform="translate(-39.157291,2258.4378)">
+    <rect
+       style="opacity:0.87000002;fill:#5599ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:60;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3241"
+       width="330"
+       height="313.5"
+       x="39"
+       y="103.86218" />
+  </g>
+  <g
+     inkscape:label="Calque 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     style="display:inline"
+     transform="translate(-39.157291,2258.4378)">
+    <rect
+       style="fill:#2e2e2e;fill-opacity:1;stroke:none"
+       id="rect3834"
+       width="7229.6289"
+       height="2725.7007"
+       x="37.157291"
+       y="-2261.1418" />
+    <rect
+       style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:155.6656189;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="rect3836"
+       width="2380.248"
+       height="2290.5771"
+       x="507.66498"
+       y="-2114.5522" />
+    <rect
+       style="fill:url(#radialGradient3423);fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect2383"
+       width="2558.9255"
+       height="2445.6987"
+       x="407.12625"
+       y="-2192.6528" />
+    <path
+       style="opacity:0.09583333;fill:#ffffff;fill-opacity:1;stroke:none"
+       d="m 413.86349,-2192.5867 c -15.25265,33.2522 -2.32827,78.5617 -6.30947,116.6372 1.72096,380.4493 3.44192,760.8985 5.16287,1141.34766 93.88235,82.98568 229.27384,70.38365 345.4922,86.49033 423.97831,27.2898 850.31151,28.61862 1272.94371,-19.4116 269.6865,-27.22552 539.3778,-69.20434 799.6418,-145.93839 66.2578,-22.2482 149.4887,-73.1004 135.2925,-153.3025 0,-341.9409 0,-683.8819 0,-1025.8227 -850.7413,0 -1701.4825,0 -2552.22361,0 z"
+       id="path3221"
+       inkscape:connector-curvature="0" />
+    <g
+       transform="matrix(2.6849003,-2.6961195,2.6961195,2.6849003,536.88627,-838.56295)"
+       style="opacity:0.5;fill:#000000;fill-opacity:1;filter:url(#filter3406)"
+       id="g3394">
+      <path
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         d="M 412.75,98.59375 C 396.19379,98.835333 382.96319,112.44354 383.1875,129 c 0,0 -10e-6,87.25107 0,196.3125 0,23.30736 -12.11655,39.13192 -38.21875,53.46875 -26.1022,14.33683 -64.97276,22.875 -103.875,22.875 -38.90224,0 -77.7728,-8.53817 -103.875,-22.875 C 111.11655,364.44442 99,348.61986 99,325.3125 c 0,-54.37333 0.441249,-103.35555 0.65625,-138.875 0.1075,-17.75973 0.177008,-32.11577 0.09375,-42.34375 -0.04163,-5.11399 -0.129499,-9.10767 -0.28125,-12.46875 -0.07588,-1.68054 -0.136902,-3.05581 -0.40625,-5.25 -0.134674,-1.09709 -0.168072,-2.2122 -1,-5.1875 C 97.646536,119.69985 97.275733,117.79087 94.875,113.75 92.474267,109.70913 84.912085,98.999943 69,99 59.653467,98.879464 50.78473,103.12192 45.013008,110.47443 39.241286,117.82694 37.226064,127.44941 39.5625,136.5 c 0.06318,2.03091 0.15684,4.32729 0.1875,8.09375 0.07765,9.5394 0.0133,23.81477 -0.09375,41.5 C 39.442151,221.46421 39,270.62442 39,325.3125 c -10e-7,47.58256 30.913445,84.95437 69.34375,106.0625 38.43031,21.10813 85.6089,30.28125 132.75,30.28125 47.1411,0 94.31969,-9.17312 132.75,-30.28125 38.43031,-21.10813 69.34375,-58.47994 69.34375,-106.0625 -10e-6,-109.06142 0,-196.3125 0,-196.3125 0.10978,-8.10283 -3.06279,-15.9055 -8.79582,-21.63265 -5.73304,-5.72715 -13.53896,-8.891699 -21.64168,-8.7736 l 0,0 z"
+         id="path3396"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         d="M 239.5625,99.5 C 223.00629,99.741583 209.77569,113.34979 210,129.90625 L 210,350 c -0.15301,10.81908 5.53126,20.88244 14.87619,26.33663 9.34492,5.45419 20.9027,5.45419 30.24762,0 C 264.46874,370.88244 270.15301,360.81908 270,350 l 0,-220.09375 c 0.10978,-8.10283 -3.06279,-15.9055 -8.79582,-21.63265 -5.73304,-5.72715 -13.53896,-8.891699 -21.64168,-8.7736 l 0,0 z"
+         id="path3398"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:type="arc"
+         style="fill:#000000;fill-opacity:1;stroke-width:60;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path3400"
+         sodipodi:cx="70"
+         sodipodi:cy="40"
+         sodipodi:rx="30"
+         sodipodi:ry="30"
+         d="M 100,40 C 100,56.568542 86.568542,70 70,70 53.431458,70 40,56.568542 40,40 40,23.431458 53.431458,10 70,10 c 16.568542,0 30,13.431458 30,30 z"
+         transform="translate(0,-10)" />
+      <path
+         transform="translate(170,-10)"
+         d="M 100,40 C 100,56.568542 86.568542,70 70,70 53.431458,70 40,56.568542 40,40 40,23.431458 53.431458,10 70,10 c 16.568542,0 30,13.431458 30,30 z"
+         sodipodi:ry="30"
+         sodipodi:rx="30"
+         sodipodi:cy="40"
+         sodipodi:cx="70"
+         id="path3402"
+         style="fill:#000000;fill-opacity:1;stroke-width:60;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:#000000;fill-opacity:1;stroke-width:60;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
+         id="path3404"
+         sodipodi:cx="70"
+         sodipodi:cy="40"
+         sodipodi:rx="30"
+         sodipodi:ry="30"
+         d="M 100,40 C 100,56.568542 86.568542,70 70,70 53.431458,70 40,56.568542 40,40 40,23.431458 53.431458,10 70,10 c 16.568542,0 30,13.431458 30,30 z"
+         transform="translate(345,-10)" />
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:110.96224976px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#3a8ecd;fill-opacity:1;stroke:none;font-family:Union;-inkscape-font-specification:Union"
+       x="3376.4146"
+       y="-1172.4049"
+       id="text3058"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3060"
+         x="3376.4146"
+         y="-1172.4049"
+         style="font-size:1141.3260498px;font-weight:bold;fill:#3a8ecd;fill-opacity:1;-inkscape-font-specification:Union Bold">i3</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:110.96224976px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Union;-inkscape-font-specification:Union"
+       x="3400.1733"
+       y="-565.84204"
+       id="text3062"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3064"
+         x="3400.1733"
+         y="-565.84204"
+         style="font-size:570.6630249px;fill:#ffffff;fill-opacity:1">improved</tspan><tspan
+         sodipodi:role="line"
+         x="3400.1733"
+         y="147.48674"
+         style="font-size:570.6630249px;fill:#ffffff;fill-opacity:1"
+         id="tspan3063">tiling wm</tspan></text>
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="tiling"
+     style="display:none"
+     transform="translate(-39.157291,2258.4378)">
+    <rect
+       y="106.6479"
+       x="42.85714"
+       height="308.57144"
+       width="322.85715"
+       id="rect3247"
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3253"
+       width="212.07706"
+       height="98.216858"
+       x="42.85096"
+       y="218.0385" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3257"
+       width="110.75323"
+       height="70.943619"
+       x="254.94135"
+       y="274.26196" />
+    <rect
+       y="218.02481"
+       x="254.93958"
+       height="56.235466"
+       width="110.76914"
+       id="rect3259"
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    <rect
+       y="345.25272"
+       x="254.91608"
+       height="69.955116"
+       width="110.78036"
+       id="rect3255"
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3249"
+       width="106.87583"
+       height="111.69163"
+       x="42.849949"
+       y="106.32091" />
+    <rect
+       y="106.45182"
+       x="149.72185"
+       height="111.57816"
+       width="105.18911"
+       id="rect3261"
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3263"
+       width="110.786"
+       height="111.57211"
+       x="254.91632"
+       y="106.45485" />
+    <rect
+       y="316.22876"
+       x="42.847878"
+       height="98.979958"
+       width="212.0791"
+       id="rect3251"
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="tiling2"
+     style="display:inline"
+     transform="translate(-39.157291,2258.4378)">
+    <rect
+       y="-2192.6528"
+       x="407.12625"
+       height="2445.6987"
+       width="2558.9255"
+       id="rect3244"
+       style="fill:none;stroke:#000000;stroke-width:7.92587519;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:7.92587519;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       id="rect3246"
+       width="2558.9255"
+       height="2445.6987"
+       x="407.12625"
+       y="-2192.6528" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:7.92587519;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;display:inline"
+       d="m 1516.7488,-2192.653 0,2445.6988 0,-2445.6988 z"
+       id="path73"
+       sodipodi:nodetypes="ccc"
+       inkscape:connector-curvature="0" />
+    <path
+       sodipodi:nodetypes="ccc"
+       id="path3254"
+       d="m 1513.2638,-1393.8379 -1102.65249,0 1102.65249,0 z"
+       style="fill:none;stroke:#000000;stroke-width:7.92587519;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:7.92587519;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 1513.2638,-553.69513 -1102.65249,0 1102.65249,0 z"
+       id="path3256"
+       sodipodi:nodetypes="ccc"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="I3"
+     style="display:inline"
+     transform="translate(-39.157291,2258.4378)">
+    <path
+       style="opacity:0.87000002;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:60;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 1910.8996,-1686.6719 c -43.8006,45.2862 -42.6341,117.4941 2.6064,161.3419 0,0 235.2392,234.2605 529.282,527.07952 62.8393,62.57796 72.9725,137.7329 41.5446,246.60061 -31.428,108.86761 -112.7716,236.59139 -217.2204,341.47644 -104.4485,104.88515 -231.8323,186.76064 -340.5677,218.64229 -108.7357,31.88176 -183.9323,22.06207 -246.7717,-40.51589 -146.597,-145.98708 -277.4742,-278.68913 -372.6616,-374.63493 -47.5938,-47.97291 -86.1127,-86.70483 -113.9122,-113.94145 -13.8996,-13.61834 -24.903,-24.10409 -34.3723,-32.71913 -4.7346,-4.30745 -8.6064,-7.83547 -15.2454,-13.00042 -3.3194,-2.58251 -6.4155,-5.48637 -16.671,-11.23181 -5.1277,-2.87267 -11.2701,-6.9983 -28.6106,-11.375 -17.3403,-4.37678 -66.5173,-12.74127 -109.2395,30.15978 -25.41947,24.87572 -37.79297,60.17755 -33.46619,95.47948 4.32669,35.30205 24.85939,66.57063 55.53399,84.57122 5.6452,5.28257 12.088,11.19556 22.3251,21.22547 25.9279,25.40294 64.2432,63.90443 111.6373,111.67611 94.7881,95.54346 226.1427,228.72579 373.5883,375.557869 128.2883,127.754376 312.0468,144.747557 472.1383,97.808209 160.0916,-46.939459 311.4932,-149.509768 438.0623,-276.607698 126.5694,-127.09813 228.5073,-278.92621 274.7788,-439.21204 46.2715,-160.28596 28.5121,-343.97193 -99.7762,-471.72633 -294.0426,-292.819 -529.282,-527.0795 -529.282,-527.0795 -21.5513,-22.0513 -51.1063,-34.4471 -81.9399,-34.3669 -30.8338,0.079 -60.324,12.6292 -81.7604,34.7922 l 0,0 z"
+       id="path2405"
+       inkscape:connector-curvature="0" />
+    <path
+       style="opacity:0.87000002;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
+       d="m 1448.3517,-1217.3044 c -43.8005,45.2861 -42.6341,117.494 2.6065,161.3418 l 593.3989,590.92975 c 28.7587,29.46065 71.1525,41.15432 110.9479,30.60322 39.7953,-10.551 70.8268,-41.71214 81.2117,-81.55118 10.3852,-39.83905 -1.4851,-82.18356 -31.0655,-110.81923 l -593.399,-590.92976 c -21.5515,-22.0513 -51.1064,-34.447 -81.9402,-34.367 -30.8336,0.079 -60.3238,12.6293 -81.7603,34.7924 l 0,0 z"
+       id="path3179"
+       inkscape:connector-curvature="0" />
+    <path
+       sodipodi:type="arc"
+       style="opacity:0.87000002;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:124.98213196;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="path3181"
+       sodipodi:cx="70"
+       sodipodi:cy="40"
+       sodipodi:rx="30"
+       sodipodi:ry="30"
+       d="m 100,40 a 30,30 0 1 1 -60,0 30,30 0 1 1 60,0 z"
+       transform="matrix(2.6849003,-2.6961195,2.6961195,2.6849003,509.92508,-865.41186)" />
+    <path
+       transform="matrix(2.6849003,-2.6961195,2.6961195,2.6849003,966.35812,-1323.7522)"
+       d="m 100,40 a 30,30 0 1 1 -60,0 30,30 0 1 1 60,0 z"
+       sodipodi:ry="30"
+       sodipodi:rx="30"
+       sodipodi:cy="40"
+       sodipodi:cx="70"
+       id="path3183"
+       style="opacity:0.87000002;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:124.98213196;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       sodipodi:type="arc" />
+    <path
+       sodipodi:type="arc"
+       style="opacity:0.87000002;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:124.98213196;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="path3185"
+       sodipodi:cx="70"
+       sodipodi:cy="40"
+       sodipodi:rx="30"
+       sodipodi:ry="30"
+       d="m 100,40 a 30,30 0 1 1 -60,0 30,30 0 1 1 60,0 z"
+       transform="matrix(2.6849003,-2.6961195,2.6961195,2.6849003,1436.2157,-1795.5732)" />
+  </g>
+</svg>
diff --git a/contrib/dump-asy.pl b/contrib/dump-asy.pl
new file mode 100755 (executable)
index 0000000..a8eab04
--- /dev/null
@@ -0,0 +1,45 @@
+#!/usr/bin/env perl
+# vim:ts=4:sw=4:expandtab
+# renders the layout tree using asymptote
+
+use strict;
+use warnings;
+use Data::Dumper;
+use AnyEvent::I3;
+use File::Temp;
+use v5.10;
+
+my $i3 = i3("/tmp/nestedcons");
+
+my $tree = $i3->get_tree->recv;
+
+my $tmp = File::Temp->new(UNLINK => 0, SUFFIX => '.asy');
+
+say $tmp "import drawtree;";
+
+say $tmp "treeLevelStep = 2cm;";
+
+sub dump_node {
+       my ($n, $parent) = @_;
+
+    my $o = ($n->{orientation} eq 'none' ? "u" : ($n->{orientation} eq 'horizontal' ? "h" : "v"));
+    my $w = (defined($n->{window}) ? $n->{window} : "N");
+    my $na = $n->{name};
+    $na =~ s/#/\\#/g;
+    my $name = "($na, $o, $w)";
+
+    print $tmp "TreeNode n" . $n->{id} . " = makeNode(";
+
+    print $tmp "n" . $parent->{id} . ", " if defined($parent);
+    print $tmp "\"" . $name . "\");\n";
+
+       dump_node($_, $n) for @{$n->{nodes}};
+}
+
+dump_node($tree);
+say $tmp "draw(n" . $tree->{id} . ", (0, 0));";
+
+close($tmp);
+my $rep = "$tmp";
+$rep =~ s/asy$/eps/;
+system("cd /tmp && asy $tmp && gv $rep && rm $rep");
diff --git a/contrib/gtk-tree-watch.pl b/contrib/gtk-tree-watch.pl
new file mode 100755 (executable)
index 0000000..f15d0c1
--- /dev/null
@@ -0,0 +1,219 @@
+#!/usr/bin/env perl
+# vim:ts=4:sw=4:expandtab
+# renders the layout tree using asymptote
+
+use strict;
+use warnings;
+
+use JSON::XS;
+use Data::Dumper;
+use AnyEvent::I3;
+use v5.10;
+
+use Gtk2 '-init';
+use Gtk2::SimpleMenu;
+use Glib qw/TRUE FALSE/;
+
+my $window = Gtk2::Window->new('toplevel');
+$window->signal_connect('delete_event' => sub { Gtk2->main_quit; });
+
+my $tree_store = Gtk2::TreeStore->new(qw/Glib::String/, qw/Glib::String/, qw/Glib::String/, qw/Glib::String/, qw/Glib::String/, qw/Glib::String/, qw/Glib::String/, qw/Glib::String/);
+
+my $i3 = i3("/tmp/nestedcons");
+
+my $tree_view = Gtk2::TreeView->new($tree_store);
+
+my $layout_box = undef;
+
+sub copy_node {
+    my ($n, $parent, $piter, $pbox) = @_;
+
+    my $o = ($n->{orientation} == 0 ? "u" : ($n->{orientation} == 1 ? "h" : "v"));
+    my $w = (defined($n->{window}) ? $n->{window} : "N");
+
+    # convert a rectangle struct to X11 notation (WxH+X+Y)
+    my $r = $n->{rect};
+    my $x = $r->{x};
+    my $y = $r->{y};
+    my $dim = $r->{width}."x".$r->{height}.($x<0?$x:"+$x").($y<0?$y:"+$y");
+
+    # add node to the tree with all known properties
+    my $iter = $tree_store->append($piter);
+    $tree_store->set($iter, 0 => $n->{name}, 1 => $w, 2 => $o, 3 => sprintf("0x%08x", $n->{id}), 4 => $n->{urgent}, 5 => $n->{focused}, 6 => $n->{layout}, 7 => $dim);
+
+    # also create a box for the node, each node has a vbox
+    # for combining the title (and properties) with the
+    # container itself, the container will be empty in case
+    # of no children, a vbox or hbox
+    my $box;
+    if($n->{orientation} == 1) {
+        $box = Gtk2::HBox->new(1, 5);
+    } else {
+        $box = Gtk2::VBox->new(1, 5);
+    }
+
+    # combine label and container
+    my $node = Gtk2::Frame->new($n->{name}.",".$o.",".$w);
+    $node->set_shadow_type('etched-out');
+    $node->add($box);
+
+    # the parent is added onto a scrolled window, so add it with a viewport
+    if(defined($pbox)) {
+       $pbox->pack_start($node, 1, 1, 0);
+    } else {
+       $layout_box = $node;
+    }
+
+    # recurse into children
+    copy_node($_, $n, $iter, $box) for @{$n->{nodes}};
+
+    # if it is a window draw a nice color
+    if(defined($n->{window})) {
+       # use a drawing area to fill a colored rectangle
+       my $area = Gtk2::DrawingArea->new();
+
+       # the color is stored as hex in the name
+       $area->{"user-data"} = $n->{name};
+
+       $area->signal_connect(expose_event => sub {
+           my ($widget, $event) = @_;
+
+           # fetch a cairo context and it width/height to start drawing nodes
+           my $cr = Gtk2::Gdk::Cairo::Context->create($widget->window());
+
+           my $w = $widget->allocation->width;
+           my $h = $widget->allocation->height;
+
+           my $hc  = $widget->{"user-data"};
+           my $r = hex(substr($hc, 1, 2)) / 255.0;
+           my $g = hex(substr($hc, 3, 2)) / 255.0;
+           my $b = hex(substr($hc, 5, 2)) / 255.0;
+
+           $cr->set_source_rgb($r, $g, $b);
+           $cr->rectangle(0, 0, $w, $h);
+           $cr->fill();
+
+        return FALSE;
+       });
+
+    $box->pack_end($area, 1, 1, 0);
+    }
+}
+
+# Replaced by Gtk2 Boxes:
+#sub draw_node {
+#    my ($n, $cr, $x, $y, $w, $h) = @_;
+#
+#    $cr->set_source_rgb(1.0, 1.0, 1.0);
+#    $cr->rectangle($x, $y, $w/2, $h/2);
+#    $cr->fill();
+#}
+
+my $json_prev = "";
+
+my $layout_sw = Gtk2::ScrolledWindow->new(undef, undef);
+my $layout_container = Gtk2::HBox->new(0, 0);
+$layout_sw->add_with_viewport($layout_container);
+
+sub copy_tree {
+    my $tree = $i3->get_tree->recv;
+
+    # convert the tree back to json so we only rebuild/redraw when the tree is changed
+    my $json = encode_json($tree);
+    if ($json ne $json_prev) {
+        $json_prev = $json;
+
+        # rebuild the tree and the layout
+        $tree_store->clear();
+        if(defined($layout_box)) {
+            $layout_container->remove($layout_box);
+        }
+        copy_node($tree);
+        $layout_container->add($layout_box);
+        $layout_container->show_all();
+
+        # keep things expanded, otherwise the tree collapses every reload which is more annoying then this :-)
+        $tree_view->expand_all();
+    }
+
+    return(TRUE);
+}
+
+sub new_column {
+    my $tree_column = Gtk2::TreeViewColumn->new();
+    $tree_column->set_title(shift);
+
+    my $renderer = Gtk2::CellRendererText->new();
+    $tree_column->pack_start($renderer, FALSE);
+    $tree_column->add_attribute($renderer, text => shift);
+
+    return($tree_column);
+}
+
+my $col = 0;
+$tree_view->append_column(new_column("Name", $col++));
+$tree_view->append_column(new_column("Window", $col++));
+$tree_view->append_column(new_column("Orientation", $col++));
+$tree_view->append_column(new_column("ID", $col++));
+$tree_view->append_column(new_column("Urgent", $col++));
+$tree_view->append_column(new_column("Focused", $col++));
+$tree_view->append_column(new_column("Layout", $col++));
+$tree_view->append_column(new_column("Rect", $col++));
+
+$tree_view->set_grid_lines("both");
+
+my $tree_sw = Gtk2::ScrolledWindow->new(undef, undef);
+$tree_sw->add($tree_view);
+
+# Replaced by Gtk2 Boxes:
+#my $area = Gtk2::DrawingArea->new();
+#$area->signal_connect(expose_event => sub {
+#    my ($widget, $event) = @_;
+#
+#    # fetch a cairo context and it width/height to start drawing nodes
+#    my $cr = Gtk2::Gdk::Cairo::Context->create($widget->window());
+#
+#    my $w = $widget->allocation->width;
+#    my $h = $widget->allocation->height;
+#
+#    draw_node($gtree, $cr, 0, 0, $w, $h);
+#
+#    return FALSE;
+#});
+
+sub menu_export {
+    print("TODO: EXPORT\n");
+}
+
+my $menu_tree = [
+       _File => {
+               item_type => '<Branch>',
+               children => [
+                       _Export => {
+                               callback => \&menu_export,
+                               accelerator => '<ctrl>E',
+                       },
+                       _Quit => {
+                               callback => sub { Gtk2->main_quit; },
+                               accelerator => '<ctrl>Q',
+                       },
+               ],
+       },
+];
+
+my $menu = Gtk2::SimpleMenu->new(menu_tree => $menu_tree);
+
+my $vbox = Gtk2::VBox->new(0, 0);
+$vbox->pack_start($menu->{widget}, 0, 0, 0);
+$vbox->pack_end($tree_sw, 1, 1, 0);
+$vbox->pack_end($layout_sw, 1, 1, 0);
+
+$window->add($vbox);
+$window->show_all();
+$window->set_size_request(500,500);
+
+Glib::Timeout->add(1000, "copy_tree", undef, Glib::G_PRIORITY_DEFAULT);
+copy_tree();
+
+Gtk2->main();
+
diff --git a/contrib/i3-wsbar b/contrib/i3-wsbar
new file mode 100755 (executable)
index 0000000..a485c15
--- /dev/null
@@ -0,0 +1,290 @@
+#!/usr/bin/env perl
+# vim:ts=4:sw=4:expandtab:ft=perl
+# © 2010 Michael Stapelberg, see LICENSE for license information
+
+use strict;
+use warnings;
+use Getopt::Long;
+use Pod::Usage;
+use IPC::Run qw(start pump);
+use Try::Tiny;
+use AnyEvent::I3;
+use AnyEvent;
+use v5.10;
+
+my $stdin;
+my $socket_path = undef;
+my ($workspaces, $outputs) = ([], {});
+my $last_line = "";
+my $w = AnyEvent->timer(
+    after => 2,
+    cb => sub {
+        say "Connection to i3 timed out. Verify socket path ($socket_path)";
+        exit 1;
+    }
+);
+
+my $command = "";
+my $input_on = "";
+my $output_on = "";
+my $show_all = 0;
+
+my $result = GetOptions(
+    'command=s' => \$command,
+    'socket=s' => \$socket_path,
+    'input-on=s' => \$input_on,
+    'output-on=s' => \$output_on,
+    'show-all' => \$show_all,
+    'help' => sub { pod2usage(1); exit 0 },
+);
+
+if ($command eq '') {
+    say "i3-wsbar is only useful in combination with dzen2.";
+    say "Please specify -c (command)";
+    exit 1;
+}
+
+my $i3 = i3($socket_path);
+
+my @input_on = split(/,/, $input_on);
+my @output_on = split(/,/, $output_on);
+
+# Disable buffering
+$| = 1;
+
+# Wait a short amount of time and try to connect to i3 again
+sub reconnect {
+    my $timer;
+    if (!defined($w)) {
+        $w = AnyEvent->timer(
+            after => 2,
+            cb => sub {
+                say "Connection to i3 timed out. Verify socket path ($socket_path)";
+                exit 1;
+            }
+        );
+    }
+
+    my $c = sub {
+        $timer = AnyEvent->timer(
+            after => 0.01,
+            cb => sub { $i3->connect->cb(\&connected) }
+        );
+    };
+    $c->();
+}
+
+# Connection attempt succeeded or failed
+sub connected {
+    my ($cv) = @_;
+
+    if (!$cv->recv) {
+        reconnect();
+        return;
+    }
+
+    $w = undef;
+
+    $i3->subscribe({
+        workspace => \&ws_change,
+        output => \&output_change,
+        _error => sub { reconnect() }
+    });
+    ws_change();
+    output_change();
+}
+
+# Called when a ws changes
+sub ws_change {
+    # Request the current workspaces and update the output afterwards
+    $i3->get_workspaces->cb(
+        sub {
+            my ($cv) = @_;
+            $workspaces = $cv->recv;
+            update_output();
+        });
+}
+
+# Called when the reply to the GET_OUTPUTS message arrives
+# Compares old outputs with new outputs and starts/kills
+# $command for each output (if specified)
+sub got_outputs {
+    my $reply = shift->recv;
+    my %old = %{$outputs};
+    my %new = map { ($_->{name}, $_) } grep { $_->{active} } @{$reply};
+
+    # If no command was given, we do not need to compare outputs
+    if ($command eq '') {
+        update_output();
+        return;
+    }
+
+    # Handle new outputs
+    for my $name (keys %new) {
+        next if @output_on and !($name ~~ @output_on);
+
+        if (defined($old{$name})) {
+            # Check if the mode changed (by reversing the hashes so
+            # that we can check for equality using the smartmatch op)
+            my %oldrect = reverse %{$old{$name}->{rect}};
+            my %newrect = reverse %{$new{$name}->{rect}};
+            next if (%oldrect ~~ %newrect);
+
+            # On mode changes, we re-start the command
+            $outputs->{$name}->{cmd}->finish;
+            delete $outputs->{$name};
+        }
+
+        my $x = $new{$name}->{rect}->{x};
+        my $w = $new{$name}->{rect}->{width};
+        my $launch = $command;
+        $launch =~ s/([^%])%x/$1$x/g;
+        $launch =~ s/([^%])%w/$1$w/g;
+        $launch =~ s/%%x/%x/g;
+        $launch =~ s/%%w/%w/g;
+
+        $new{$name}->{cmd_input} = '';
+        my @cmd = ('/bin/sh', '-c', $launch);
+        $new{$name}->{cmd} = start \@cmd, \$new{$name}->{cmd_input};
+        $outputs->{$name} = $new{$name};
+    }
+
+    # Handle old outputs
+    for my $name (keys %old) {
+        next if defined($new{$name});
+
+        $outputs->{$name}->{cmd}->finish;
+        delete $outputs->{$name};
+    }
+
+    update_output();
+}
+
+sub output_change {
+    $i3->get_outputs->cb(\&got_outputs)
+}
+
+sub update_output {
+    my $dzen_bg = "#111111";
+    my $out;
+    my $previous_output;
+
+    for my $name (keys %{$outputs}) {
+        my $width = $outputs->{$name}->{rect}->{width};
+
+        $previous_output = undef;
+        $out = qq|^pa(;2)|;
+        for my $ws (@{$workspaces}) {
+            next if $ws->{output} ne $name and !$show_all;
+
+            # Display a separator if we are on a different output now
+            if (defined($previous_output) and
+                ($ws->{output} ne $previous_output)) {
+                $out .= qq|^fg(#900000)^ib(1)\|^ib(0)^p(+4)|;
+            }
+            $previous_output = $ws->{output};
+
+            my ($bg, $fg) = qw(333333 888888);
+            ($bg, $fg) = qw(4c7899 ffffff) if $ws->{visible};
+            ($bg, $fg) = qw(900000 ffffff) if $ws->{urgent};
+
+            my $cmd = q|i3-msg "workspace | . $ws->{name} . q|"|;
+            my $name = $ws->{name};
+
+            # Begin the clickable area
+            $out .= qq|^ca(1,$cmd)|;
+
+            # Draw the rest of the bar in the background color, but
+            # don’t move the "cursor"
+            $out .= qq|^p(_LOCK_X)^fg(#$bg)^r(${width}x17)^p(_UNLOCK_X)|;
+            # Draw the name of the workspace without overwriting the
+            # background color
+            $out .= qq|^p(+3)^fg(#$fg)^ib(1)$name^ib(0)^p(+5)|;
+            # Draw the rest of the bar in the normal background color
+            # without moving the "cursor"
+            $out .= qq|^p(_LOCK_X)^fg($dzen_bg)^r(${width}x17)^p(_UNLOCK_X)|;
+
+            # End the clickable area
+            $out .= qq|^ca()|;
+
+            # Move to the next rect, reset Y coordinate
+            $out .= qq|^p(2)^pa(;2)|;
+        }
+
+        $out .= qq|^p(_LOCK_X)^fg($dzen_bg)^r(${width}x17)^p(_UNLOCK_X)^fg()|;
+        $out .= qq|^p(+5)|;
+        $out .= $last_line if (!@input_on or $name ~~ @input_on);
+        $out .= "\n";
+
+        $outputs->{$name}->{cmd_input} = $out;
+        try {
+            pump $outputs->{$name}->{cmd} while length $outputs->{$name}->{cmd_input};
+        } catch {
+            warn "Could not write to dzen2";
+            exit 1;
+        }
+    }
+}
+
+$i3->connect->cb(\&connected);
+
+$stdin = AnyEvent->io(
+    fh => \*STDIN,
+    poll => 'r',
+    cb => sub {
+        my $line = <STDIN>;
+        if (!defined($line)) {
+            undef $stdin;
+            return;
+        }
+        chomp($line);
+        $last_line = $line;
+        update_output();
+    });
+
+# let AnyEvent do the rest ("endless loop")
+AnyEvent->condvar->recv
+
+__END__
+
+=head1 NAME
+
+i3-wsbar - sample implementation of a standalone workspace bar
+
+=head1 SYNOPSIS
+
+i3-wsbar -c <dzen2-commandline> [options]
+
+=head1 OPTIONS
+
+=over 4
+
+=item B<--command> <command>
+
+This command (at the moment only dzen2 is supported) will be started for each
+output. C<%x> will be replaced with the X coordinate of the output, C<%w> will
+be replaced with the width of the output.
+
+Example:
+    --command "dzen2 -dock -x %x -w %w"
+
+=item B<--input-on> <list-of-RandR-outputs>
+
+Specifies on which outputs the contents of stdin should be appended to the
+workspace bar.
+
+Example:
+    --input-on "LVDS1"
+
+=item B<--output-on> <list-of-RandR-outputs>
+
+Specifies for which outputs i3-wsbar should start C<command>.
+
+=item B<--show-all>
+
+If enabled, all workspaces are shown (not only those of the current output).
+Handy to use with C<--output-on>.
+
+=back
+
+=cut
diff --git a/contrib/show-download-count.sh b/contrib/show-download-count.sh
new file mode 100644 (file)
index 0000000..95b955a
--- /dev/null
@@ -0,0 +1,23 @@
+#!/bin/sh
+# © 2012 Han Boetes <han@mijncomputer.nl> (see also: LICENSE)
+YEAR=`date "+%Y"`
+weblog=$(mktemp)
+zcat $(find /var/log/lighttpd/build.i3wm.org -type f -name "access.log.*.gz" | sort | tail -5) > $weblog
+# this will match the latest logfile, which is not yet gzipped
+find /var/log/lighttpd/build.i3wm.org/log$YEAR -type f \! -name "access.log.*.gz" -exec cat '{}' \; >> $weblog
+cat /var/log/lighttpd/build.i3wm.org/access.log >> $weblog
+gitlog=$(mktemp)
+# create a git output logfile. Only keep the first 6 chars of the release hash
+git log -150 --pretty='        %h %s' next > $gitlog
+
+awk '/i3-wm_.*\.deb/ {print $7}' $weblog|awk -F'/' '{print $NF}'|awk -F'_' '{print $2 }'|awk -F'-' '{print $NF}' |cut -c 2-8|sort |uniq -c | while read line; do
+    set -- $line
+    # $1 is the number of downloads, $2 is the release md5sum
+    sed -i "/$2/s|^        |$(printf '%3i' $1) d/l |" $gitlog
+done
+
+cat $gitlog
+rm $gitlog
+rm $weblog
diff --git a/contrib/sticker_stickma_black.svg b/contrib/sticker_stickma_black.svg
new file mode 100644 (file)
index 0000000..fced8dd
--- /dev/null
@@ -0,0 +1,645 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="269.29132"
+   height="187.79527"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.1 r9760"
+   sodipodi:docname="sticker_stickma_black.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   version="1.1"
+   inkscape:export-filename="/home/michael/i3/sticker.png"
+   inkscape:export-xdpi="116.12904"
+   inkscape:export-ydpi="116.12904">
+  <defs
+     id="defs4">
+    <linearGradient
+       id="linearGradient3750">
+      <stop
+         style="stop-color:#17273b;stop-opacity:1;"
+         offset="0"
+         id="stop3752" />
+      <stop
+         id="stop4356"
+         offset="0.41666666"
+         style="stop-color:#008cd4;stop-opacity:0.78039217;" />
+      <stop
+         style="stop-color:#6eb5de;stop-opacity:0.69803923;"
+         offset="0.87847221"
+         id="stop4358" />
+      <stop
+         style="stop-color:#88bfe5;stop-opacity:0.61960787;"
+         offset="1"
+         id="stop3754" />
+    </linearGradient>
+    <inkscape:perspective
+       id="perspective3661"
+       inkscape:persp3d-origin="750.50629 : 505.26732 : 1"
+       inkscape:vp_z="683.5728 : 1230.5721 : 1"
+       inkscape:vp_y="0 : 1946.8917 : 0"
+       inkscape:vp_x="-526.84957 : 2.2065866e-13 : 0"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       id="linearGradient3284">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3286" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0.7518248;"
+         offset="1"
+         id="stop3288" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3278">
+      <stop
+         id="stop3280"
+         offset="0"
+         style="stop-color:#33bff7;stop-opacity:0.38039216;" />
+      <stop
+         id="stop3282"
+         offset="1"
+         style="stop-color:#2d446b;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3272">
+      <stop
+         id="stop3274"
+         offset="0"
+         style="stop-color:#2596f6;stop-opacity:0.38039216;" />
+      <stop
+         id="stop3276"
+         offset="1"
+         style="stop-color:#2d446b;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3266">
+      <stop
+         id="stop3268"
+         offset="0"
+         style="stop-color:#189fff;stop-opacity:0.38039216;" />
+      <stop
+         id="stop3270"
+         offset="1"
+         style="stop-color:#010b2b;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3244">
+      <stop
+         id="stop3246"
+         offset="0"
+         style="stop-color:#419bff;stop-opacity:1;" />
+      <stop
+         id="stop3248"
+         offset="1"
+         style="stop-color:#002359;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3159">
+      <stop
+         style="stop-color:#33bff7;stop-opacity:0.38039216;"
+         offset="0"
+         id="stop3161" />
+      <stop
+         style="stop-color:#2d446b;stop-opacity:1;"
+         offset="1"
+         id="stop3163" />
+    </linearGradient>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="-526.84957 : 2.9848654e-13 : 0"
+       inkscape:vp_y="1.192088e-13 : 1946.8917 : 0"
+       inkscape:vp_z="680.54236 : 1232.3792 : 1"
+       inkscape:persp3d-origin="730.30325 : 937.39936 : 1"
+       id="perspective10" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3244"
+       id="radialGradient3256"
+       cx="344.73471"
+       cy="77.263504"
+       fx="344.73471"
+       fy="77.263504"
+       r="196.15704"
+       gradientTransform="matrix(-1.39796,-0.05336032,0.08355111,-2.1889079,820.20461,272.08319)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3159"
+       id="radialGradient3264"
+       cx="140.3363"
+       cy="300.27451"
+       fx="140.3363"
+       fy="300.27451"
+       r="206.15704"
+       gradientTransform="matrix(0.6771172,-0.6830119,1.1802789,1.1700925,-161.83993,77.639162)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3284"
+       id="radialGradient3290"
+       cx="267.50388"
+       cy="337.12692"
+       fx="267.50388"
+       fy="337.12692"
+       r="77.845421"
+       gradientTransform="matrix(1,0,0,0.7430849,0,86.613009)"
+       gradientUnits="userSpaceOnUse" />
+    <inkscape:perspective
+       id="perspective3373"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       id="linearGradient3211">
+      <stop
+         id="stop3213"
+         offset="0"
+         style="stop-color: rgb(0, 160, 255); stop-opacity: 1;" />
+      <stop
+         id="stop3215"
+         offset="1"
+         style="stop-color: rgb(0, 37, 255); stop-opacity: 1;" />
+    </linearGradient>
+    <filter
+       inkscape:collect="always"
+       id="filter3406"
+       color-interpolation-filters="sRGB">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="13.396228"
+         id="feGaussianBlur3408" />
+    </filter>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3284"
+       id="radialGradient3416"
+       cx="119.96373"
+       cy="229.28981"
+       fx="119.96373"
+       fy="229.28981"
+       r="203.19508"
+       gradientTransform="matrix(0.7210805,2.1168143,-1.4722239,0.5015047,347.53034,-320.94088)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3284"
+       id="radialGradient3734"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.7210805,2.1168143,-1.4722239,0.5015047,347.53034,-320.94088)"
+       cx="119.96373"
+       cy="229.28981"
+       fx="119.96373"
+       fy="229.28981"
+       r="203.19508" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3284"
+       id="radialGradient3736"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.7210805,2.1168143,-1.4722239,0.5015047,347.53034,-320.94088)"
+       cx="119.96373"
+       cy="229.28981"
+       fx="119.96373"
+       fy="229.28981"
+       r="203.19508" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3750"
+       id="radialGradient3758"
+       cx="390.69662"
+       cy="258.92429"
+       fx="390.69662"
+       fy="258.92429"
+       r="32.03125"
+       gradientTransform="matrix(4.0292425,-5.5974184,5.1695404,3.721239,-2510.9809,1613.1551)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3750"
+       id="radialGradient3760"
+       cx="59.046589"
+       cy="248.2272"
+       fx="59.046589"
+       fy="248.2272"
+       r="197.15625"
+       gradientTransform="matrix(1.7105919,-0.04370519,0.03334715,1.3051856,-58.593126,-250.18318)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3750"
+       id="radialGradient3762"
+       cx="192.64008"
+       cy="282.40387"
+       fx="192.64008"
+       fy="282.40387"
+       r="133.09375"
+       gradientTransform="matrix(1.0081228,0.4493093,-1.0529321,2.3624813,273.13721,-455.12138)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3750"
+       id="radialGradient4344"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(5.7478532,-0.5889281,0.4834745,4.7186431,-260.98332,-919.446)"
+       cx="24"
+       cy="280.45392"
+       fx="24"
+       fy="280.45392"
+       r="65.0625" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3750"
+       id="linearGradient4354"
+       x1="-125.59599"
+       y1="-100.47679"
+       x2="-5.2882538"
+       y2="-100.47679"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3266"
+       id="radialGradient3721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1454302,-1.1687051,2.0295327,1.9193266,-924.0626,56.219022)"
+       cx="351.15485"
+       cy="372.06332"
+       fx="351.15485"
+       fy="372.06332"
+       r="163.57143" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3266"
+       id="radialGradient3303"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.54985655,-0.5425676,0.97426436,0.89104123,-423.22152,225.74786)"
+       cx="351.15485"
+       cy="372.06332"
+       fx="351.15485"
+       fy="372.06332"
+       r="163.57143" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2.632258"
+     inkscape:cx="136.32251"
+     inkscape:cy="106.81637"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer3"
+     showgrid="false"
+     inkscape:window-width="1208"
+     inkscape:window-height="1089"
+     inkscape:window-x="2308"
+     inkscape:window-y="90"
+     inkscape:window-maximized="0"
+     units="mm" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+        <dc:contributor>
+          <cc:Agent>
+            <dc:title>yellowiscool, farvardin</dc:title>
+          </cc:Agent>
+        </dc:contributor>
+        <dc:creator>
+          <cc:Agent>
+            <dc:title>steckdenis</dc:title>
+          </cc:Agent>
+        </dc:creator>
+        <dc:description>Logo for I3, an improved dynamic tiling window manager: http://i3.zekjur.net/</dc:description>
+        <cc:license
+           rdf:resource="http://creativecommons.org/licenses/by-sa/3.0/" />
+      </cc:Work>
+      <cc:License
+         rdf:about="http://creativecommons.org/licenses/by-sa/3.0/">
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Reproduction" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Distribution" />
+        <cc:requires
+           rdf:resource="http://creativecommons.org/ns#Notice" />
+        <cc:requires
+           rdf:resource="http://creativecommons.org/ns#Attribution" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+        <cc:requires
+           rdf:resource="http://creativecommons.org/ns#ShareAlike" />
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="fond"
+     style="display:none"
+     transform="translate(-7.8571396,-226.42406)">
+    <rect
+       style="opacity:0.87000002;fill:#5599ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:60;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect3241"
+       width="330"
+       height="313.5"
+       x="39"
+       y="103.86218" />
+  </g>
+  <g
+     inkscape:label="Calque 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     style="display:inline"
+     transform="translate(-7.8571396,-226.42406)" />
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="tiling"
+     style="display:none"
+     transform="translate(-7.8571396,-226.42406)">
+    <rect
+       y="106.6479"
+       x="42.85714"
+       height="308.57144"
+       width="322.85715"
+       id="rect3247"
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3253"
+       width="212.07706"
+       height="98.216858"
+       x="42.85096"
+       y="218.0385" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3257"
+       width="110.75323"
+       height="70.943619"
+       x="254.94135"
+       y="274.26196" />
+    <rect
+       y="218.02481"
+       x="254.93958"
+       height="56.235466"
+       width="110.76914"
+       id="rect3259"
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    <rect
+       y="345.25272"
+       x="254.91608"
+       height="69.955116"
+       width="110.78036"
+       id="rect3255"
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3249"
+       width="106.87583"
+       height="111.69163"
+       x="42.849949"
+       y="106.32091" />
+    <rect
+       y="106.45182"
+       x="149.72185"
+       height="111.57816"
+       width="105.18911"
+       id="rect3261"
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3263"
+       width="110.786"
+       height="111.57211"
+       x="254.91632"
+       y="106.45485" />
+    <rect
+       y="316.22876"
+       x="42.847878"
+       height="98.979958"
+       width="212.0791"
+       id="rect3251"
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="tiling2"
+     style="display:inline"
+     transform="translate(-7.8571396,-226.42406)" />
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="I3"
+     style="display:inline"
+     transform="translate(-7.8571396,-226.42406)">
+    <rect
+       style="fill:#000000;fill-opacity:1;stroke:none"
+       id="rect4331"
+       width="300.32974"
+       height="228.87383"
+       x="-15.04335"
+       y="-28.721518"
+       transform="translate(7.8571396,226.42406)" />
+    <text
+       xml:space="preserve"
+       style="font-size:11.90824985999999974px;font-style:normal;font-weight:normal;fill:#0b5bb4;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       x="191.96429"
+       y="287.08801"
+       id="text2939"
+       transform="scale(1.0168712,0.98340872)"><tspan
+         sodipodi:role="line"
+         x="191.96429"
+         y="287.08801"
+         style="font-size:48px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#0b5bb4;fill-opacity:1;font-family:Georgia;-inkscape-font-specification:Georgia Bold"
+         id="tspan2951">i3</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:11.90824985999999974px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       x="212.13477"
+       y="327.17087"
+       id="text2943"
+       transform="scale(1.0168712,0.98340872)"><tspan
+         sodipodi:role="line"
+         id="tspan2945"
+         x="212.13477"
+         y="327.17087"
+         style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Georgia;-inkscape-font-specification:Georgia;fill:#ffffff;fill-opacity:1">improved</tspan><tspan
+         sodipodi:role="line"
+         x="212.13477"
+         y="349.67087"
+         style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Georgia;-inkscape-font-specification:Georgia;fill:#ffffff;fill-opacity:1"
+         id="tspan3835">tiling wm</tspan></text>
+    <rect
+       style="fill:#ffffff;fill-opacity:1;stroke:none"
+       id="rect4329"
+       width="145.562"
+       height="134.577"
+       x="23.920139"
+       y="253.03334" />
+    <g
+       id="g3837"
+       transform="matrix(0.93634729,0,0,0.93634729,1.5366196,20.389339)">
+      <rect
+         y="248.69504"
+         x="24.140676"
+         height="143.2533"
+         width="154.98553"
+         id="rect2383"
+         style="fill:url(#radialGradient3303);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+      <path
+         id="path3221"
+         d="m 24.548726,248.69894 c -0.923802,1.94771 -0.141016,4.60164 -0.382144,6.83186 0.104234,22.28427 0.208466,44.56854 0.312698,66.85282 5.686139,4.86076 13.886347,4.12262 20.925306,5.06603 25.678942,1.59846 51.500522,1.6763 77.097934,-1.13701 16.33402,-1.59469 32.66831,-4.05353 48.43162,-8.54811 4.01303,-1.30316 9.05404,-4.28177 8.19421,-8.97949 0,-20.02869 0,-40.0574 0,-60.0861 -51.52654,0 -103.053082,0 -154.579624,0 z"
+         style="opacity:0.09583333;fill:#ffffff;fill-opacity:1;stroke:none;display:inline"
+         inkscape:connector-curvature="0" />
+      <g
+         id="g3394"
+         style="opacity:0.5;fill:#000000;fill-opacity:1;display:inline;filter:url(#filter3406)"
+         transform="matrix(0.16261542,-0.15792135,0.16329493,0.15726421,31.999803,328.00895)">
+        <path
+           id="path3396"
+           d="M 412.75,98.59375 C 396.19379,98.835333 382.96319,112.44354 383.1875,129 c 0,0 -10e-6,87.25107 0,196.3125 0,23.30736 -12.11655,39.13192 -38.21875,53.46875 -26.1022,14.33683 -64.97276,22.875 -103.875,22.875 -38.90224,0 -77.7728,-8.53817 -103.875,-22.875 C 111.11655,364.44442 99,348.61986 99,325.3125 c 0,-54.37333 0.441249,-103.35555 0.65625,-138.875 0.1075,-17.75973 0.177008,-32.11577 0.09375,-42.34375 -0.04163,-5.11399 -0.129499,-9.10767 -0.28125,-12.46875 -0.07588,-1.68054 -0.136902,-3.05581 -0.40625,-5.25 -0.134674,-1.09709 -0.168072,-2.2122 -1,-5.1875 C 97.646536,119.69985 97.275733,117.79087 94.875,113.75 92.474267,109.70913 84.912085,98.999943 69,99 59.653467,98.879464 50.78473,103.12192 45.013008,110.47443 39.241286,117.82694 37.226064,127.44941 39.5625,136.5 c 0.06318,2.03091 0.15684,4.32729 0.1875,8.09375 0.07765,9.5394 0.0133,23.81477 -0.09375,41.5 C 39.442151,221.46421 39,270.62442 39,325.3125 c -10e-7,47.58256 30.913445,84.95437 69.34375,106.0625 38.43031,21.10813 85.6089,30.28125 132.75,30.28125 47.1411,0 94.31969,-9.17312 132.75,-30.28125 38.43031,-21.10813 69.34375,-58.47994 69.34375,-106.0625 -10e-6,-109.06142 0,-196.3125 0,-196.3125 0.10978,-8.10283 -3.06279,-15.9055 -8.79582,-21.63265 -5.73304,-5.72715 -13.53896,-8.891699 -21.64168,-8.7736 l 0,0 z"
+           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path3398"
+           d="M 239.5625,99.5 C 223.00629,99.741583 209.77569,113.34979 210,129.90625 L 210,350 c -0.15301,10.81908 5.53126,20.88244 14.87619,26.33663 9.34492,5.45419 20.9027,5.45419 30.24762,0 C 264.46874,370.88244 270.15301,360.81908 270,350 l 0,-220.09375 c 0.10978,-8.10283 -3.06279,-15.9055 -8.79582,-21.63265 -5.73304,-5.72715 -13.53896,-8.891699 -21.64168,-8.7736 l 0,0 z"
+           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+           inkscape:connector-curvature="0" />
+        <path
+           transform="translate(0,-10)"
+           d="M 100,40 C 100,56.568542 86.568542,70 70,70 53.431458,70 40,56.568542 40,40 40,23.431458 53.431458,10 70,10 c 16.568542,0 30,13.431458 30,30 z"
+           sodipodi:ry="30"
+           sodipodi:rx="30"
+           sodipodi:cy="40"
+           sodipodi:cx="70"
+           id="path3400"
+           style="fill:#000000;fill-opacity:1;stroke-width:60;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
+           sodipodi:type="arc" />
+        <path
+           sodipodi:type="arc"
+           style="fill:#000000;fill-opacity:1;stroke-width:60;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
+           id="path3402"
+           sodipodi:cx="70"
+           sodipodi:cy="40"
+           sodipodi:rx="30"
+           sodipodi:ry="30"
+           d="M 100,40 C 100,56.568542 86.568542,70 70,70 53.431458,70 40,56.568542 40,40 40,23.431458 53.431458,10 70,10 c 16.568542,0 30,13.431458 30,30 z"
+           transform="translate(170,-10)" />
+        <path
+           transform="translate(345,-10)"
+           d="M 100,40 C 100,56.568542 86.568542,70 70,70 53.431458,70 40,56.568542 40,40 40,23.431458 53.431458,10 70,10 c 16.568542,0 30,13.431458 30,30 z"
+           sodipodi:ry="30"
+           sodipodi:rx="30"
+           sodipodi:cy="40"
+           sodipodi:cx="70"
+           id="path3404"
+           style="fill:#000000;fill-opacity:1;stroke-width:60;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
+           sodipodi:type="arc" />
+      </g>
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.47207919;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+         id="rect3244"
+         width="154.98553"
+         height="143.2533"
+         x="24.140676"
+         y="248.69504" />
+      <rect
+         y="248.69504"
+         x="24.140676"
+         height="143.2533"
+         width="154.98553"
+         id="rect3246"
+         style="fill:none;stroke:#000000;stroke-width:0.47207919;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline" />
+      <path
+         sodipodi:nodetypes="ccc"
+         id="path2929"
+         d="m 91.346794,248.69506 0,143.2533 0,-143.2533 z"
+         style="fill:none;stroke:#000000;stroke-width:0.47207919;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;display:inline"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.47207919;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         d="m 91.135721,295.48452 -66.783968,0 66.783968,0 z"
+         id="path3254"
+         sodipodi:nodetypes="ccc"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:nodetypes="ccc"
+         id="path3256"
+         d="m 91.135721,344.69467 -66.783968,0 66.783968,0 z"
+         style="fill:none;stroke:#000000;stroke-width:0.47207919;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path2405"
+         d="m 115.21918,278.33218 c -2.65284,2.65258 -2.58219,6.88205 0.15787,9.45037 0,0 14.24765,13.72146 32.05684,30.87293 3.80597,3.6654 4.4197,8.0675 2.51621,14.44427 -1.90349,6.37677 -6.8302,13.85801 -13.15631,20.0015 -6.3261,6.1435 -14.04129,10.93924 -20.62704,12.80667 -6.58576,1.86742 -11.14017,1.29224 -14.94614,-2.37317 -8.87889,-8.55098 -16.805682,-16.32381 -22.570867,-21.9437 -2.882591,-2.80994 -5.215552,-5.07861 -6.899273,-6.67397 -0.841858,-0.79767 -1.508291,-1.41185 -2.08182,-1.91647 -0.28676,-0.25231 -0.521261,-0.45895 -0.92336,-0.76148 -0.201047,-0.15126 -0.388572,-0.32135 -1.00971,-0.65789 -0.310564,-0.16827 -0.682588,-0.40991 -1.732842,-0.66627 -1.050249,-0.25636 -4.028733,-0.7463 -6.616274,1.76657 -1.539573,1.45705 -2.288993,3.5248 -2.026936,5.59257 0.262055,2.06777 1.505651,3.89928 3.363508,4.95364 0.34191,0.30941 0.732128,0.65576 1.352158,1.24325 1.570361,1.48794 3.890994,3.74311 6.761491,6.54126 5.741001,5.59633 13.69671,13.3973 22.626998,21.99777 7.769995,7.48303 18.899617,8.47839 28.595837,5.72898 9.69621,-2.74941 18.86609,-8.75732 26.53197,-16.20191 7.66587,-7.44459 13.83992,-16.3377 16.64242,-25.72621 2.80251,-9.38852 1.72689,-20.14767 -6.0431,-27.63069 -17.80917,-17.15146 -32.05684,-30.87293 -32.05684,-30.87293 -1.3053,-1.29162 -3.09534,-2.01769 -4.96283,-2.013 -1.8675,0.005 -3.65363,0.73975 -4.95196,2.03791 l 0,0 z"
+         style="opacity:0.87000002;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:60;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path3179"
+         d="m 87.204209,305.82471 c -2.652845,2.65256 -2.582201,6.88205 0.157868,9.45036 l 35.940193,34.61287 c 1.74182,1.72562 4.30946,2.41055 6.71973,1.79255 2.41027,-0.61802 4.28975,-2.44325 4.91873,-4.77676 0.62899,-2.3335 -0.0899,-4.81377 -1.88154,-6.49106 L 97.119,305.7998 c -1.305296,-1.29163 -3.095344,-2.01769 -4.962836,-2.013 -1.867498,0.005 -3.653612,0.73974 -4.951955,2.03791 l 0,0 z"
+         style="opacity:0.87000002;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="matrix(0.16261542,-0.15792135,0.16329493,0.15726421,30.366855,326.43631)"
+         d="M 100,40 C 100,56.568542 86.568542,70 70,70 53.431458,70 40,56.568542 40,40 40,23.431458 53.431458,10 70,10 c 16.568542,0 30,13.431458 30,30 z"
+         sodipodi:ry="30"
+         sodipodi:rx="30"
+         sodipodi:cy="40"
+         sodipodi:cx="70"
+         id="path3181"
+         style="opacity:0.87000002;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:124.98213196;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="opacity:0.87000002;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:124.98213196;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         id="path3183"
+         sodipodi:cx="70"
+         sodipodi:cy="40"
+         sodipodi:rx="30"
+         sodipodi:ry="30"
+         d="M 100,40 C 100,56.568542 86.568542,70 70,70 53.431458,70 40,56.568542 40,40 40,23.431458 53.431458,10 70,10 c 16.568542,0 30,13.431458 30,30 z"
+         transform="matrix(0.16261542,-0.15792135,0.16329493,0.15726421,58.011475,299.58968)" />
+      <path
+         transform="matrix(0.16261542,-0.15792135,0.16329493,0.15726421,86.469174,271.95344)"
+         d="M 100,40 C 100,56.568542 86.568542,70 70,70 53.431458,70 40,56.568542 40,40 40,23.431458 53.431458,10 70,10 c 16.568542,0 30,13.431458 30,30 z"
+         sodipodi:ry="30"
+         sodipodi:rx="30"
+         sodipodi:cy="40"
+         sodipodi:cx="70"
+         id="path3185"
+         style="opacity:0.87000002;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:124.98213196;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         sodipodi:type="arc" />
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:13.28640651999999989px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Trebuchet MS;-inkscape-font-specification:Trebuchet MS"
+       x="215.76903"
+       y="383.70779"
+       id="text3067"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3069"
+         x="215.76903"
+         y="383.70779"
+         style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Georgia;-inkscape-font-specification:Georgia;fill:#ffffff;fill-opacity:1">i3wm.org</tspan></text>
+  </g>
+</svg>
diff --git a/docs/slides-2012-03-16/TdilE.jpg b/docs/slides-2012-03-16/TdilE.jpg
new file mode 100644 (file)
index 0000000..9b939ab
Binary files /dev/null and b/docs/slides-2012-03-16/TdilE.jpg differ
diff --git a/docs/slides-2012-03-16/Ubuntu_Linux_Jaunty_screenshot.png b/docs/slides-2012-03-16/Ubuntu_Linux_Jaunty_screenshot.png
new file mode 100644 (file)
index 0000000..95a2cdb
Binary files /dev/null and b/docs/slides-2012-03-16/Ubuntu_Linux_Jaunty_screenshot.png differ
diff --git a/docs/slides-2012-03-16/i3.tex b/docs/slides-2012-03-16/i3.tex
new file mode 100644 (file)
index 0000000..673c72c
--- /dev/null
@@ -0,0 +1,146 @@
+% vim:ts=4:sw=4:expandtab
+% © 2012 Michael Stapelberg
+%
+% use xelatex %<
+%
+\documentclass[xetex,serif,compress]{beamer}
+\usepackage{fontspec}
+\usepackage{xunicode} % Unicode extras!
+\usepackage{xltxtra}  % Fixes
+\usepackage{listings}
+\setmainfont{Trebuchet MS}
+\setmonofont{Inconsolata}
+\usetheme{default}
+
+\setbeamertemplate{frametitle}{
+    \color{black}
+    \vspace*{0.5cm}
+    \hspace*{0.25cm}
+    \textbf{\insertframetitle}
+    \par
+}
+
+% Hide the navigation icons at the bottom of the page
+\setbeamertemplate{navigation symbols}{}
+
+% No margins on any side
+\setbeamersize{text margin left=0cm,text margin right=0cm}
+
+
+\begin{document}
+
+% slide with bullet points
+\newcommand{\mslide}[2]{
+    \begin{frame}{#1}
+        \begin{center}
+        \begin{list}{$\bullet$}{\itemsep=1em}
+            #2
+        \end{list}
+        \end{center}
+    \end{frame}
+}
+
+\frame{
+\begin{center}
+\vspace{1.5cm}
+{\huge i3}\\
+{\large improved tiling window manager}\\
+\vspace{3cm}
+Michael Stapelberg\\
+\vspace{0.5cm}
+2012-03-16\\
+\end{center}
+}
+
+\begin{frame}{}
+\begin{center}
+\huge
+„Oh, interessant…“
+
+\vspace*{1cm}
+
+oder
+
+\vspace*{1cm}
+
+„Was?! \textbf{Noch ein} window manager?“
+\end{center}
+\end{frame}
+
+
+\begin{frame}{}
+    % talk about the difference between a desktop environment and a window manager:
+    % a desktop environment (like GNOME, KDE, Xfce) is a collection of
+    % programs, libraries (including a graphical toolkit) and configuration.
+    % it usually aims for a coherent look and feel and comes with a number of
+    % tools (g*, like gedit, geeqie, …)
+    % One of the programs of a DE is a window manager.
+    \begin{figure}
+    \includegraphics[width=0.97\textwidth]{Ubuntu_Linux_Jaunty_screenshot.png}
+    % source: http://en.wikipedia.org/wiki/File:Ubuntu_Linux_Jaunty_screenshot.png
+    \end{figure}
+\end{frame}
+
+
+\begin{frame}{}
+\begin{center}
+% compare this to a screenshot of i3:
+% notice the little amount of toolbars.
+% notice the lack of fancy window decorations
+% notice the absence of a desktop.
+% instead, you get to use the full screen.
+    \begin{figure}
+    \includegraphics[width=0.97\textwidth]{TdilE.jpg}
+    % source: jrd in #i3
+    \end{figure}
+\end{center}
+\end{frame}
+
+
+\mslide{i3: Geschichte und Merkmale}{
+    \item komplett neu geschrieben (Februar 2009)
+    \item Nachfolger* zu wmii, den wir nicht hacken konnten
+    \item sauberen, lesbaren, dokumentierten Code. und Dokumentation
+    \item ordentlichen Multi-Monitor-Unterstützung, UTF-8-Unterstützung
+    \item schnell und klein, ausgerichtet auf Power-Nutzer
+}
+
+% live demo here, just like at FrOSCon
+% include: the docs, with the keyboard layout
+% include: the configuration file
+
+\mslide{Inter-Prozess-Kommunication}{
+    \item UNIX-Socket, JSON zur Serialisierung
+    \item i3-msg (C), AnyEvent::I3 (Perl), i3-ipc (Ruby), i3ipc (Python)
+    \item beliebige Befehle schicken, wie \texttt{floating enable}
+    \item Ereignisse empfangen (z.B. Fokusänderung)
+    \item Zugriff auf die Layout-Datenstruktur (!)
+}
+
+% demo: change a workspace
+% demo: testsuite
+
+\mslide{Workflow-Beispiele}{
+    \item Urgency hint
+    \item Scratchpad
+    \item Web-Entwicklung (browser, editor, syslog)
+    \item Programmieren (C): zwei Editoren (Code, Tests), schnell Doku aufmachen
+}
+
+\mslide{i3 in Zahlen}{
+    \item 3149 Commits von > 40 verschiedenen Leuten
+    \item > 600 Tickets (ca. 60 offen)
+    \item ungefähr 10.000 SLOC (größtenteils C, ein bisschen Perl)
+    \item Testsuite: > 1000 Tests in 96 Dateien
+    \item vorsichtige Schätzungen von > 1000 Nutzern
+}
+
+\mslide{Danke für eure Aufmerksamkeit!}{
+    \item Auf \url{http://www.i3wm.org/} findet ihr alles
+    \item Ubuntu: bitte nutze unser Repository: \url{http://i3wm.org/docs/repositories.html}
+    \item Debian: bitte nutze die Version in testing
+    \item Fragen?
+    \item (Bilder: Creative Commons Attribution-Share Alike 3.0 Unported)
+}
+
+\end{document}
diff --git a/dump-asy.pl b/dump-asy.pl
deleted file mode 100755 (executable)
index a8eab04..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/usr/bin/env perl
-# vim:ts=4:sw=4:expandtab
-# renders the layout tree using asymptote
-
-use strict;
-use warnings;
-use Data::Dumper;
-use AnyEvent::I3;
-use File::Temp;
-use v5.10;
-
-my $i3 = i3("/tmp/nestedcons");
-
-my $tree = $i3->get_tree->recv;
-
-my $tmp = File::Temp->new(UNLINK => 0, SUFFIX => '.asy');
-
-say $tmp "import drawtree;";
-
-say $tmp "treeLevelStep = 2cm;";
-
-sub dump_node {
-       my ($n, $parent) = @_;
-
-    my $o = ($n->{orientation} eq 'none' ? "u" : ($n->{orientation} eq 'horizontal' ? "h" : "v"));
-    my $w = (defined($n->{window}) ? $n->{window} : "N");
-    my $na = $n->{name};
-    $na =~ s/#/\\#/g;
-    my $name = "($na, $o, $w)";
-
-    print $tmp "TreeNode n" . $n->{id} . " = makeNode(";
-
-    print $tmp "n" . $parent->{id} . ", " if defined($parent);
-    print $tmp "\"" . $name . "\");\n";
-
-       dump_node($_, $n) for @{$n->{nodes}};
-}
-
-dump_node($tree);
-say $tmp "draw(n" . $tree->{id} . ", (0, 0));";
-
-close($tmp);
-my $rep = "$tmp";
-$rep =~ s/asy$/eps/;
-system("cd /tmp && asy $tmp && gv $rep && rm $rep");
diff --git a/gtk-tree-watch.pl b/gtk-tree-watch.pl
deleted file mode 100755 (executable)
index f15d0c1..0000000
+++ /dev/null
@@ -1,219 +0,0 @@
-#!/usr/bin/env perl
-# vim:ts=4:sw=4:expandtab
-# renders the layout tree using asymptote
-
-use strict;
-use warnings;
-
-use JSON::XS;
-use Data::Dumper;
-use AnyEvent::I3;
-use v5.10;
-
-use Gtk2 '-init';
-use Gtk2::SimpleMenu;
-use Glib qw/TRUE FALSE/;
-
-my $window = Gtk2::Window->new('toplevel');
-$window->signal_connect('delete_event' => sub { Gtk2->main_quit; });
-
-my $tree_store = Gtk2::TreeStore->new(qw/Glib::String/, qw/Glib::String/, qw/Glib::String/, qw/Glib::String/, qw/Glib::String/, qw/Glib::String/, qw/Glib::String/, qw/Glib::String/);
-
-my $i3 = i3("/tmp/nestedcons");
-
-my $tree_view = Gtk2::TreeView->new($tree_store);
-
-my $layout_box = undef;
-
-sub copy_node {
-    my ($n, $parent, $piter, $pbox) = @_;
-
-    my $o = ($n->{orientation} == 0 ? "u" : ($n->{orientation} == 1 ? "h" : "v"));
-    my $w = (defined($n->{window}) ? $n->{window} : "N");
-
-    # convert a rectangle struct to X11 notation (WxH+X+Y)
-    my $r = $n->{rect};
-    my $x = $r->{x};
-    my $y = $r->{y};
-    my $dim = $r->{width}."x".$r->{height}.($x<0?$x:"+$x").($y<0?$y:"+$y");
-
-    # add node to the tree with all known properties
-    my $iter = $tree_store->append($piter);
-    $tree_store->set($iter, 0 => $n->{name}, 1 => $w, 2 => $o, 3 => sprintf("0x%08x", $n->{id}), 4 => $n->{urgent}, 5 => $n->{focused}, 6 => $n->{layout}, 7 => $dim);
-
-    # also create a box for the node, each node has a vbox
-    # for combining the title (and properties) with the
-    # container itself, the container will be empty in case
-    # of no children, a vbox or hbox
-    my $box;
-    if($n->{orientation} == 1) {
-        $box = Gtk2::HBox->new(1, 5);
-    } else {
-        $box = Gtk2::VBox->new(1, 5);
-    }
-
-    # combine label and container
-    my $node = Gtk2::Frame->new($n->{name}.",".$o.",".$w);
-    $node->set_shadow_type('etched-out');
-    $node->add($box);
-
-    # the parent is added onto a scrolled window, so add it with a viewport
-    if(defined($pbox)) {
-       $pbox->pack_start($node, 1, 1, 0);
-    } else {
-       $layout_box = $node;
-    }
-
-    # recurse into children
-    copy_node($_, $n, $iter, $box) for @{$n->{nodes}};
-
-    # if it is a window draw a nice color
-    if(defined($n->{window})) {
-       # use a drawing area to fill a colored rectangle
-       my $area = Gtk2::DrawingArea->new();
-
-       # the color is stored as hex in the name
-       $area->{"user-data"} = $n->{name};
-
-       $area->signal_connect(expose_event => sub {
-           my ($widget, $event) = @_;
-
-           # fetch a cairo context and it width/height to start drawing nodes
-           my $cr = Gtk2::Gdk::Cairo::Context->create($widget->window());
-
-           my $w = $widget->allocation->width;
-           my $h = $widget->allocation->height;
-
-           my $hc  = $widget->{"user-data"};
-           my $r = hex(substr($hc, 1, 2)) / 255.0;
-           my $g = hex(substr($hc, 3, 2)) / 255.0;
-           my $b = hex(substr($hc, 5, 2)) / 255.0;
-
-           $cr->set_source_rgb($r, $g, $b);
-           $cr->rectangle(0, 0, $w, $h);
-           $cr->fill();
-
-        return FALSE;
-       });
-
-    $box->pack_end($area, 1, 1, 0);
-    }
-}
-
-# Replaced by Gtk2 Boxes:
-#sub draw_node {
-#    my ($n, $cr, $x, $y, $w, $h) = @_;
-#
-#    $cr->set_source_rgb(1.0, 1.0, 1.0);
-#    $cr->rectangle($x, $y, $w/2, $h/2);
-#    $cr->fill();
-#}
-
-my $json_prev = "";
-
-my $layout_sw = Gtk2::ScrolledWindow->new(undef, undef);
-my $layout_container = Gtk2::HBox->new(0, 0);
-$layout_sw->add_with_viewport($layout_container);
-
-sub copy_tree {
-    my $tree = $i3->get_tree->recv;
-
-    # convert the tree back to json so we only rebuild/redraw when the tree is changed
-    my $json = encode_json($tree);
-    if ($json ne $json_prev) {
-        $json_prev = $json;
-
-        # rebuild the tree and the layout
-        $tree_store->clear();
-        if(defined($layout_box)) {
-            $layout_container->remove($layout_box);
-        }
-        copy_node($tree);
-        $layout_container->add($layout_box);
-        $layout_container->show_all();
-
-        # keep things expanded, otherwise the tree collapses every reload which is more annoying then this :-)
-        $tree_view->expand_all();
-    }
-
-    return(TRUE);
-}
-
-sub new_column {
-    my $tree_column = Gtk2::TreeViewColumn->new();
-    $tree_column->set_title(shift);
-
-    my $renderer = Gtk2::CellRendererText->new();
-    $tree_column->pack_start($renderer, FALSE);
-    $tree_column->add_attribute($renderer, text => shift);
-
-    return($tree_column);
-}
-
-my $col = 0;
-$tree_view->append_column(new_column("Name", $col++));
-$tree_view->append_column(new_column("Window", $col++));
-$tree_view->append_column(new_column("Orientation", $col++));
-$tree_view->append_column(new_column("ID", $col++));
-$tree_view->append_column(new_column("Urgent", $col++));
-$tree_view->append_column(new_column("Focused", $col++));
-$tree_view->append_column(new_column("Layout", $col++));
-$tree_view->append_column(new_column("Rect", $col++));
-
-$tree_view->set_grid_lines("both");
-
-my $tree_sw = Gtk2::ScrolledWindow->new(undef, undef);
-$tree_sw->add($tree_view);
-
-# Replaced by Gtk2 Boxes:
-#my $area = Gtk2::DrawingArea->new();
-#$area->signal_connect(expose_event => sub {
-#    my ($widget, $event) = @_;
-#
-#    # fetch a cairo context and it width/height to start drawing nodes
-#    my $cr = Gtk2::Gdk::Cairo::Context->create($widget->window());
-#
-#    my $w = $widget->allocation->width;
-#    my $h = $widget->allocation->height;
-#
-#    draw_node($gtree, $cr, 0, 0, $w, $h);
-#
-#    return FALSE;
-#});
-
-sub menu_export {
-    print("TODO: EXPORT\n");
-}
-
-my $menu_tree = [
-       _File => {
-               item_type => '<Branch>',
-               children => [
-                       _Export => {
-                               callback => \&menu_export,
-                               accelerator => '<ctrl>E',
-                       },
-                       _Quit => {
-                               callback => sub { Gtk2->main_quit; },
-                               accelerator => '<ctrl>Q',
-                       },
-               ],
-       },
-];
-
-my $menu = Gtk2::SimpleMenu->new(menu_tree => $menu_tree);
-
-my $vbox = Gtk2::VBox->new(0, 0);
-$vbox->pack_start($menu->{widget}, 0, 0, 0);
-$vbox->pack_end($tree_sw, 1, 1, 0);
-$vbox->pack_end($layout_sw, 1, 1, 0);
-
-$window->add($vbox);
-$window->show_all();
-$window->set_size_request(500,500);
-
-Glib::Timeout->add(1000, "copy_tree", undef, Glib::G_PRIORITY_DEFAULT);
-copy_tree();
-
-Gtk2->main();
-
diff --git a/i3-wsbar b/i3-wsbar
deleted file mode 100755 (executable)
index a485c15..0000000
--- a/i3-wsbar
+++ /dev/null
@@ -1,290 +0,0 @@
-#!/usr/bin/env perl
-# vim:ts=4:sw=4:expandtab:ft=perl
-# © 2010 Michael Stapelberg, see LICENSE for license information
-
-use strict;
-use warnings;
-use Getopt::Long;
-use Pod::Usage;
-use IPC::Run qw(start pump);
-use Try::Tiny;
-use AnyEvent::I3;
-use AnyEvent;
-use v5.10;
-
-my $stdin;
-my $socket_path = undef;
-my ($workspaces, $outputs) = ([], {});
-my $last_line = "";
-my $w = AnyEvent->timer(
-    after => 2,
-    cb => sub {
-        say "Connection to i3 timed out. Verify socket path ($socket_path)";
-        exit 1;
-    }
-);
-
-my $command = "";
-my $input_on = "";
-my $output_on = "";
-my $show_all = 0;
-
-my $result = GetOptions(
-    'command=s' => \$command,
-    'socket=s' => \$socket_path,
-    'input-on=s' => \$input_on,
-    'output-on=s' => \$output_on,
-    'show-all' => \$show_all,
-    'help' => sub { pod2usage(1); exit 0 },
-);
-
-if ($command eq '') {
-    say "i3-wsbar is only useful in combination with dzen2.";
-    say "Please specify -c (command)";
-    exit 1;
-}
-
-my $i3 = i3($socket_path);
-
-my @input_on = split(/,/, $input_on);
-my @output_on = split(/,/, $output_on);
-
-# Disable buffering
-$| = 1;
-
-# Wait a short amount of time and try to connect to i3 again
-sub reconnect {
-    my $timer;
-    if (!defined($w)) {
-        $w = AnyEvent->timer(
-            after => 2,
-            cb => sub {
-                say "Connection to i3 timed out. Verify socket path ($socket_path)";
-                exit 1;
-            }
-        );
-    }
-
-    my $c = sub {
-        $timer = AnyEvent->timer(
-            after => 0.01,
-            cb => sub { $i3->connect->cb(\&connected) }
-        );
-    };
-    $c->();
-}
-
-# Connection attempt succeeded or failed
-sub connected {
-    my ($cv) = @_;
-
-    if (!$cv->recv) {
-        reconnect();
-        return;
-    }
-
-    $w = undef;
-
-    $i3->subscribe({
-        workspace => \&ws_change,
-        output => \&output_change,
-        _error => sub { reconnect() }
-    });
-    ws_change();
-    output_change();
-}
-
-# Called when a ws changes
-sub ws_change {
-    # Request the current workspaces and update the output afterwards
-    $i3->get_workspaces->cb(
-        sub {
-            my ($cv) = @_;
-            $workspaces = $cv->recv;
-            update_output();
-        });
-}
-
-# Called when the reply to the GET_OUTPUTS message arrives
-# Compares old outputs with new outputs and starts/kills
-# $command for each output (if specified)
-sub got_outputs {
-    my $reply = shift->recv;
-    my %old = %{$outputs};
-    my %new = map { ($_->{name}, $_) } grep { $_->{active} } @{$reply};
-
-    # If no command was given, we do not need to compare outputs
-    if ($command eq '') {
-        update_output();
-        return;
-    }
-
-    # Handle new outputs
-    for my $name (keys %new) {
-        next if @output_on and !($name ~~ @output_on);
-
-        if (defined($old{$name})) {
-            # Check if the mode changed (by reversing the hashes so
-            # that we can check for equality using the smartmatch op)
-            my %oldrect = reverse %{$old{$name}->{rect}};
-            my %newrect = reverse %{$new{$name}->{rect}};
-            next if (%oldrect ~~ %newrect);
-
-            # On mode changes, we re-start the command
-            $outputs->{$name}->{cmd}->finish;
-            delete $outputs->{$name};
-        }
-
-        my $x = $new{$name}->{rect}->{x};
-        my $w = $new{$name}->{rect}->{width};
-        my $launch = $command;
-        $launch =~ s/([^%])%x/$1$x/g;
-        $launch =~ s/([^%])%w/$1$w/g;
-        $launch =~ s/%%x/%x/g;
-        $launch =~ s/%%w/%w/g;
-
-        $new{$name}->{cmd_input} = '';
-        my @cmd = ('/bin/sh', '-c', $launch);
-        $new{$name}->{cmd} = start \@cmd, \$new{$name}->{cmd_input};
-        $outputs->{$name} = $new{$name};
-    }
-
-    # Handle old outputs
-    for my $name (keys %old) {
-        next if defined($new{$name});
-
-        $outputs->{$name}->{cmd}->finish;
-        delete $outputs->{$name};
-    }
-
-    update_output();
-}
-
-sub output_change {
-    $i3->get_outputs->cb(\&got_outputs)
-}
-
-sub update_output {
-    my $dzen_bg = "#111111";
-    my $out;
-    my $previous_output;
-
-    for my $name (keys %{$outputs}) {
-        my $width = $outputs->{$name}->{rect}->{width};
-
-        $previous_output = undef;
-        $out = qq|^pa(;2)|;
-        for my $ws (@{$workspaces}) {
-            next if $ws->{output} ne $name and !$show_all;
-
-            # Display a separator if we are on a different output now
-            if (defined($previous_output) and
-                ($ws->{output} ne $previous_output)) {
-                $out .= qq|^fg(#900000)^ib(1)\|^ib(0)^p(+4)|;
-            }
-            $previous_output = $ws->{output};
-
-            my ($bg, $fg) = qw(333333 888888);
-            ($bg, $fg) = qw(4c7899 ffffff) if $ws->{visible};
-            ($bg, $fg) = qw(900000 ffffff) if $ws->{urgent};
-
-            my $cmd = q|i3-msg "workspace | . $ws->{name} . q|"|;
-            my $name = $ws->{name};
-
-            # Begin the clickable area
-            $out .= qq|^ca(1,$cmd)|;
-
-            # Draw the rest of the bar in the background color, but
-            # don’t move the "cursor"
-            $out .= qq|^p(_LOCK_X)^fg(#$bg)^r(${width}x17)^p(_UNLOCK_X)|;
-            # Draw the name of the workspace without overwriting the
-            # background color
-            $out .= qq|^p(+3)^fg(#$fg)^ib(1)$name^ib(0)^p(+5)|;
-            # Draw the rest of the bar in the normal background color
-            # without moving the "cursor"
-            $out .= qq|^p(_LOCK_X)^fg($dzen_bg)^r(${width}x17)^p(_UNLOCK_X)|;
-
-            # End the clickable area
-            $out .= qq|^ca()|;
-
-            # Move to the next rect, reset Y coordinate
-            $out .= qq|^p(2)^pa(;2)|;
-        }
-
-        $out .= qq|^p(_LOCK_X)^fg($dzen_bg)^r(${width}x17)^p(_UNLOCK_X)^fg()|;
-        $out .= qq|^p(+5)|;
-        $out .= $last_line if (!@input_on or $name ~~ @input_on);
-        $out .= "\n";
-
-        $outputs->{$name}->{cmd_input} = $out;
-        try {
-            pump $outputs->{$name}->{cmd} while length $outputs->{$name}->{cmd_input};
-        } catch {
-            warn "Could not write to dzen2";
-            exit 1;
-        }
-    }
-}
-
-$i3->connect->cb(\&connected);
-
-$stdin = AnyEvent->io(
-    fh => \*STDIN,
-    poll => 'r',
-    cb => sub {
-        my $line = <STDIN>;
-        if (!defined($line)) {
-            undef $stdin;
-            return;
-        }
-        chomp($line);
-        $last_line = $line;
-        update_output();
-    });
-
-# let AnyEvent do the rest ("endless loop")
-AnyEvent->condvar->recv
-
-__END__
-
-=head1 NAME
-
-i3-wsbar - sample implementation of a standalone workspace bar
-
-=head1 SYNOPSIS
-
-i3-wsbar -c <dzen2-commandline> [options]
-
-=head1 OPTIONS
-
-=over 4
-
-=item B<--command> <command>
-
-This command (at the moment only dzen2 is supported) will be started for each
-output. C<%x> will be replaced with the X coordinate of the output, C<%w> will
-be replaced with the width of the output.
-
-Example:
-    --command "dzen2 -dock -x %x -w %w"
-
-=item B<--input-on> <list-of-RandR-outputs>
-
-Specifies on which outputs the contents of stdin should be appended to the
-workspace bar.
-
-Example:
-    --input-on "LVDS1"
-
-=item B<--output-on> <list-of-RandR-outputs>
-
-Specifies for which outputs i3-wsbar should start C<command>.
-
-=item B<--show-all>
-
-If enabled, all workspaces are shown (not only those of the current output).
-Handy to use with C<--output-on>.
-
-=back
-
-=cut
diff --git a/i3.welcome b/i3.welcome
deleted file mode 100644 (file)
index 5a267bb..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-1.) Welcome to i3!
-
-This message provides an overview of the default keybindings to use i3.
-Please also make sure to have a look at the man page and the user's guide:
-http://i3wm.org/docs/userguide.html
-
-
-2.) Configuration Files
-
-/etc/i3/config is the default configuration. It is recommended to copy it and
-afterwards edit it to suit your needs (in particular, you may want to disable
-this message):
-
-       cp /etc/i3/config ~/.i3/config
-
-
-3.) Keybindings
-
-The following explanation is related to the QWERTY layout, but as the default
-configuration uses keycodes instead of keysymbols for binding, you still have
-to press the same physical keys, regardless of your keyboard layout.
-
-The Mod1 key is usually bound to the "Alt" key on your keyboard.
-
-Mod1+Enter opens a terminal emulator
-Mod1+v starts dmenu (an application launcher)
-
-The directional keys are j(left), k(down), l(up) and ;(right). You can also use
-the arrow keys on your keyboard, if you prefer them.
-
-Mod1+<directional key> moves the focus to the window in the given direction
-Mod1+Shift+<directional key> moves the window to the given direction
-Mod1+<number> opens the corresponding workspace
-Mod1+Shift+<number> moves a window to the selected workspace
-Mod1+h sets the mode of a container to stacking
-Mod1+e sets the mode back to default
-Mod1+f toggles fullscreen mode for the current window
-Mod1+Shift+Space toggles floating mode for the current window
-Mod1+Shift+q closes a window
-Mod1+Shift+r restarts i3 in-place (at this time, you will lose your layout)
-Mod1+Shift+e exits i3
-
-If you have any questions, please don't hesitate to ask!
-Have fun using i3
diff --git a/render-tree/Con.pm b/render-tree/Con.pm
deleted file mode 100644 (file)
index 1830caf..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-# vim:ts=4:sw=4:expandtab
-package Con;
-
-use Moose;
-use MooseX::AttributeHelpers;
-use v5.10;
-
-has 'name' => (is => 'ro', isa => 'Str');
-has 'width' => (is => 'rw', isa => 'Int', default => 100);
-has '_nodes' => (is => 'ro', metaclass => 'Collection::Array', isa => 'ArrayRef[Con]',
-    default => sub { [] },
-    provides => {
-        'push' => 'add_node',
-        elements => 'nodes',
-    }
-);
-has 'parent' => (is => 'rw', isa => 'Con', predicate => 'has_parent');
-
-__PACKAGE__->meta->make_immutable;
-
-1
diff --git a/render-tree/render.pl b/render-tree/render.pl
deleted file mode 100755 (executable)
index bea5811..0000000
+++ /dev/null
@@ -1,125 +0,0 @@
-#!/usr/bin/env perl
-# vim:ts=4:sw=4:expandtab
-# © 2011 Michael Stapelberg, see LICENSE
-#
-# Needs SVG (libsvg-perl), IO::All (libio-all-perl), JSON::XS (libjson-xs-perl) and Moose (libmoose-perl)
-#
-# XXX: unfinished proof-of-concept. awaits a json dump in my.tree, renders to test.svg
-# XXX: needs more beautifying (in the SVG but also in the code)
-# XXX: has some rendering differences between firefox and chromium. maybe inkscape makes the file look the same in both browsers
-
-use strict;
-use warnings;
-use SVG;
-use Data::Dumper;
-use JSON::XS;
-use IO::All;
-use List::Util qw(sum);
-use lib qw(.);
-use Con;
-use v5.10;
-
-my $input = io('my.tree')->slurp;
-my $tree = decode_json($input);
-my $root = parse_tree($tree);
-render_tree($root);
-
-sub parse_tree {
-    my ($input, $parent) = @_;
-    my $con = Con->new(name => $input->{name});
-    $con->parent($parent) if defined($parent);
-    for my $node (@{$input->{nodes}}) {
-        $con->add_node(parse_tree($node, $con));
-    }
-
-    return $con;
-}
-
-sub render_tree {
-    my ($con) = @_;
-    say 'rendering con ' . $con->name;
-    my @nodes = $con->nodes;
-    for my $node (@nodes) {
-        render_tree($node);
-    }
-
-    # nothing to calculate when there are no children
-    return unless @nodes > 0;
-
-    $con->width((@nodes > 1 ? (@nodes - 1) * 20 : 0) + sum map { $_->width } @nodes);
-
-    say $con->name . ' has width ' . $con->width;
-}
-
-# TODO: figure out the height
-my $svg = SVG->new(id => "tree", width => $root->width + 5, height => '1052');
-
-my $l1 = $svg->group(id => 'layer1');
-
-# gaussian blur (for drop shadows)
-$svg->defs()->filter(id => 'dropshadow')->fe(-type => 'gaussianblur', stdDeviation => '2.19');
-
-my $idcnt = 0;
-my $y = 10;
-render_svg($root, 0, 0);
-
-sub render_svg {
-    my ($con, $level, $x) = @_;
-
-    my $indent = ' ' x $level;
-
-    say $indent . 'svg-rendering con ' . $con->name . ' on level ' . $level;
-    say $indent . 'width: ' . $con->width;
-
-    # render the dropshadow rect
-    $l1->rect(
-        id => 'outer_rect_shadow' . $idcnt,
-        style => 'opacity:1.0;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:4;stroke-opacity:1;stroke-miterlimit:4;filter:url(#dropshadow)',
-        width => "96",
-        height => '50',
-        #x => $x + ($con->has_parent ? ($con->parent->width - 100) / 2 : 0),
-        x => $x + ($con->width / 2) - (96 / 2) + 0,
-        y => 4 + $level * 70 + 0,
-    );
-    $idcnt++;
-
-    # render the main rect
-    $l1->rect(
-        id => 'outer_rect' . $idcnt,
-        style => 'opacity:1.0;fill:#c30000;fill-opacity:1;stroke:#000000;stroke-width:4;stroke-opacity:1;stroke-miterlimit:4',
-        width => "96",
-        height => '50',
-        x => $x + ($con->width / 2) - (96 / 2),
-        y => 4 + $level * 70,
-    );
-
-    $idcnt++;
-
-    # render the text
-    $l1->text(
-        style => 'font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:left;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Trebuchet MS;-inkscape-font-specification:Trebuchet MS',
-        x => $x + ($con->width / 2) - (100/2) + 5,
-        y => 4 + 15 + $level * 70,
-        id => 'title_'.$idcnt,
-    )->tspan(style => 'text-align:start;text-anchor:start')->cdata($con->name);
-    $idcnt++;
-
-    $y = $y + 50;
-    my @nodes = $con->nodes;
-    my $startx = $x + ($con->width / 2);
-
-    for my $node (@nodes) {
-        render_svg($node, $level + 1, $x);
-        my $mid = $x + ($node->width / 2);
-        $l1->path(
-            d => 'M ' . $startx . ',' . (4 + $level * 70 + 50) . ' ' . $mid . ',' . (4 + ($level+1) * 70),
-            id => 'path' . $idcnt,
-            style => 'fill:none;stroke:#000000;stroke-width:2px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1'
-        );
-        $x += $node->width + 20;
-        $idcnt++;
-    }
-
-}
-
-$svg->render > io('test.svg');
diff --git a/show-download-count.sh b/show-download-count.sh
deleted file mode 100644 (file)
index 95b955a..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/sh
-# © 2012 Han Boetes <han@mijncomputer.nl> (see also: LICENSE)
-YEAR=`date "+%Y"`
-weblog=$(mktemp)
-zcat $(find /var/log/lighttpd/build.i3wm.org -type f -name "access.log.*.gz" | sort | tail -5) > $weblog
-# this will match the latest logfile, which is not yet gzipped
-find /var/log/lighttpd/build.i3wm.org/log$YEAR -type f \! -name "access.log.*.gz" -exec cat '{}' \; >> $weblog
-cat /var/log/lighttpd/build.i3wm.org/access.log >> $weblog
-gitlog=$(mktemp)
-# create a git output logfile. Only keep the first 6 chars of the release hash
-git log -150 --pretty='        %h %s' next > $gitlog
-
-awk '/i3-wm_.*\.deb/ {print $7}' $weblog|awk -F'/' '{print $NF}'|awk -F'_' '{print $2 }'|awk -F'-' '{print $NF}' |cut -c 2-8|sort |uniq -c | while read line; do
-    set -- $line
-    # $1 is the number of downloads, $2 is the release md5sum
-    sed -i "/$2/s|^        |$(printf '%3i' $1) d/l |" $gitlog
-done
-
-cat $gitlog
-rm $gitlog
-rm $weblog