+++ /dev/null
-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.
--- /dev/null
+<?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>
--- /dev/null
+#!/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");
--- /dev/null
+#!/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();
+
--- /dev/null
+#!/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
--- /dev/null
+#!/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
--- /dev/null
+<?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>
--- /dev/null
+% 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}
+++ /dev/null
-#!/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");
+++ /dev/null
-#!/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();
-
+++ /dev/null
-#!/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
+++ /dev/null
-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
+++ /dev/null
-# 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
+++ /dev/null
-#!/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');
+++ /dev/null
-#!/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