Commit 4e62db41 authored by Michael Gratton's avatar Michael Gratton 🤞

Merge branch 'wip/3.32-ux' into 'master'

3.32 UX

See merge request !117
parents 383557f8 2ad91f5f
Pipeline #62189 failed with stages
in 71 minutes and 33 seconds
This diff is collapsed.
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128" version="1.0"><defs><linearGradient id="e"><stop offset="0" stop-color="#e5a50a"/><stop offset=".042" stop-color="#f9cf69" stop-opacity=".965"/><stop offset=".097" stop-color="#f6ba29" stop-opacity=".965"/><stop offset=".921" stop-color="#f6ba2b" stop-opacity=".996"/><stop offset=".974" stop-color="#f9cf69"/><stop offset="1" stop-color="#e5a50a" stop-opacity=".828"/></linearGradient><linearGradient id="d"><stop offset="0" stop-color="#e5a50a"/><stop offset=".035" stop-color="#f6ba29" stop-opacity=".965"/><stop offset=".962" stop-color="#f6bb2c"/><stop offset="1" stop-color="#e5a50a" stop-opacity=".828"/></linearGradient><linearGradient id="a"><stop offset="0" stop-color="#d5d3cf"/><stop offset="1" stop-color="#f6f5f4"/></linearGradient><linearGradient id="b"><stop offset="0" stop-color="#d5d3cf"/><stop offset="1" stop-color="#949390"/></linearGradient><linearGradient id="c"><stop offset="0" stop-color="#9a9996"/><stop offset="1" stop-color="#77767b"/></linearGradient><linearGradient xlink:href="#d" id="g" x1="18" y1="196.232" x2="110.132" y2="196.232" gradientUnits="userSpaceOnUse"/><linearGradient xlink:href="#e" id="f" gradientUnits="userSpaceOnUse" x1="12" y1="196.232" x2="116" y2="196.232"/></defs><g transform="translate(0 -172)"><rect ry="8.721" rx="8.721" y="184" x="12" height="104" width="104" style="marker:none;font-variant-east_asian:normal" fill="url(#f)"/><rect style="marker:none" width="104" height="76" x="12" y="184" rx="8" ry="8" fill="#f9f06b"/><rect ry="2" rx="2" y="190" x="18" height="64" width="92" style="marker:none" fill="url(#g)"/><rect style="marker:none" width="92" height="40" x="18" y="214" rx="2" ry="2" fill="#e5a50a"/><path d="M22.204 200.057a2.18 2.18 0 0 0-2.18 2.18L20 254h18v8h52v-8h18l-.055-51.762a2.18 2.18 0 0 0-2.18-2.18H45.88z" style="marker:none" fill="#f6f5f4"/><path d="M20.462 200.676l43.169 34.886 43.606-34.886-43.606 37.066z" opacity=".1"/><path d="M22.204 200.676c-.466 0-.897.148-1.251.397l42.678 34.489 42.893-34.315a2.17 2.17 0 0 0-1.467-.57H45.88z" style="marker:none" fill="#f7f8f9"/><path style="marker:none" d="M63.63 224.84c-4 0-8 1.429-11.064 4.286l-32.542 22.92L20 252v2h88v-2l-33.305-22.874c-3.065-2.857-7.065-4.286-11.064-4.286z" opacity=".05"/><path d="M63.63 226.84c-4 0-8 1.429-11.064 4.286l-32.542 22.92L38 254v10h52v-10h18l-33.305-22.874c-3.065-2.857-7.065-4.286-11.064-4.286z" style="marker:none" fill="#f0f0ee"/><path d="M22.553 200.676a2.18 2.18 0 0 0-2.02 1.36l33.13 33.546a14.43 14.43 0 0 0 20.633 0l33.129-33.547a2.18 2.18 0 0 0-2.02-1.359H46.229z" style="marker:none" opacity=".12"/><path d="M22.553 200.676c-.472 0-.907.151-1.264.406l32.374 32.374a14.558 14.558 0 0 0 20.633 0l32.374-32.374a2.168 2.168 0 0 0-1.264-.406H46.228z" style="marker:none" fill="#f6f5f4"/><path d="M38 268v7c0 2.216 1.784 4 4 4h44c2.216 0 4-1.784 4-4v-7c0 2.216-1.784 4-4 4H42c-2.216 0-4-1.784-4-4z" fill="#f9f06b"/><path d="M90 264v4c0 2.216-1.784 4-4 4H42c-2.216 0-4-1.784-4-4v-4z" fill="#c0bfbc"/></g></svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16"
height="16"
viewBox="0 0 16 16"
id="svg8570"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="geary-symbolic.svg">
<defs
id="defs8572" />
<sodipodi:namedview
id="base"
pagecolor="#000000"
bordercolor="#c8c8c8"
borderopacity="1"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="16"
inkscape:cx="10.771689"
inkscape:cy="18.113217"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:window-width="960"
inkscape:window-height="1136"
inkscape:window-x="960"
inkscape:window-y="27"
inkscape:window-maximized="0"
units="px"
inkscape:snap-page="true"
inkscape:object-paths="true"
inkscape:snap-intersection-paths="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-midpoints="true"
inkscape:object-nodes="true"
inkscape:snap-bbox="true"
inkscape:snap-nodes="true"
showguides="true"
inkscape:guide-bbox="true">
<inkscape:grid
type="xygrid"
id="grid8652"
spacingx="0.25"
spacingy="0.25"
visible="true"
enabled="true" />
</sodipodi:namedview>
id="svg7384"
height="16">
<metadata
id="metadata8575">
id="metadata90">
<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:title>Gnome Symbolic Icon Theme</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<title
id="title9167">Gnome Symbolic Icon Theme</title>
<defs
id="defs7386">
<linearGradient
osb:paint="solid"
id="linearGradient7212">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop7214" />
</linearGradient>
</defs>
<g
transform="translate(-39.982551,-160.00458)"
id="layer10" />
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-1036.3622)">
<g
id="g3589-5"
transform="matrix(1,0,0,0.99910099,-8e-6,1.695223)">
<path
inkscape:connector-curvature="0"
id="path8300-0-8-4-1-9"
d="m 9.9785154,1041.7849 c -0.4247472,0.015 -0.6395173,0.5612 -0.3554687,0.9038 l 3.5000003,4.3347 c 0.104196,0.1293 0.257411,0.3318 0.376953,0.3388 0.276491,0.015 0.758264,-0.2276 0.75,-0.5 -0.0032,-0.1058 -0.27943,-0.4357 -0.373047,-0.5519 l -3.5,-4.3347 c -0.09898,-0.1261 -0.245744,-0.1963 -0.3984376,-0.1905 z"
style="color:#bebebe;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
sodipodi:nodetypes="cccsscccc" />
<path
inkscape:connector-curvature="0"
id="path8300-0-8-4-7-4-3"
d="m 6.0058592,1041.7849 c -0.1472638,-7e-4 -0.2873186,0.069 -0.3828125,0.1905 l -3.5,4.3347 c -0.1046537,0.1299 -0.3836211,0.4224 -0.3730467,0.5521 0.023795,0.292 0.3933503,0.5 0.75,0.5 0,0 0.2782898,-0.216 0.3769529,-0.339 l 3.5,-4.3347 c 0.2885443,-0.3485 0.060959,-0.9028 -0.3710937,-0.9038 z"
style="color:#bebebe;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
sodipodi:nodetypes="cccsscccc" />
<path
inkscape:connector-curvature="0"
id="path8300-0-8-4-7-6-6-9"
d="M 1.4003904,1037.3622 C 1.25,1037.5103 1.2594323,1037.6876 1.25,1037.9546 c -0.00704,0.1992 0.1308106,0.3325 0.75,1.1576 l 5.6953123,4.7321 c 0.1796655,0.1496 0.4297095,0.1496 0.609375,0 l 6.5000007,-5.4184 c 0.166353,-0.1234 0.194835,-0.2713 0.195312,-0.4306 8.54e-4,-0.2849 -0.09144,-0.6228 -0.35126,-0.6331 -0.113409,0 -0.293517,0.056 -0.453428,0.2065 l -6.1953122,5.1623 -6.1953125,-5.1623 c -0.092357,-0.08 -0.2860507,-0.21 -0.4042969,-0.2065 z"
style="color:#bebebe;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
sodipodi:nodetypes="csccccsscccc" />
</g>
transform="translate(-280.98275,206.99542)"
style="display:inline"
id="layer9">
<path
id="rect5954"
d="m 285.50021,-196 h 7 c 0.831,0 1.5,0.446 1.5,1 0,0.554 -0.669,1 -1.5,1 h -7 c -0.831,0 -1.5,-0.446 -1.5,-1 0,-0.554 0.669,-1 1.5,-1 z"
style="opacity:0.3;vector-effect:none;fill:#241f31;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal" />
<path
d="m 284.0002,-206 c -1.108,0 -2,0.892 -2,2 v 10 c 0,1.108 0.892,2 2,2 h 8.5 1.46484 0.0352 c 1.108,0 2,-0.892 2,-2 v -10 c 0,-1.108 -0.892,-2 -2,-2 z m 0.5957,2 h 8.8086 c 0.33053,0 0.5957,0.26517 0.5957,0.5957 v 7.40821 l -2,-0.004 v 2 h -5.98438 l -0.0156,-2 -2,0.004 v -7.4083 c 0,-0.33053 0.26517,-0.5957 0.5957,-0.5957 z"
id="rect885-6"
style="display:inline;opacity:1;fill:#241f31;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;enable-background:new" />
<path
style="color:#bebebe;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 1.249995,1046.8671 0,4.2462 13.75,0 0,-4.2462 m -2.499995,0 0,2.4955 c 0,0.2498 -0.25,0.4996 -0.5,0.4996 l -7.8875944,0 c -0.25,0 -0.49235,-0.2594 -0.5,-0.4996 l 0,-2.4955"
id="rect11749-5-0-9-97-3"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccccc" />
id="path5946"
d="m 283.68945,-203.13086 a 0.50005,0.50005 0 0 0 -0.33789,0.86133 l 3.76367,3.68359 c 0.54827,0.54827 1.31878,0.7106 2.01758,0.6836 0.6988,-0.027 1.35268,-0.21401 1.79297,-0.6543 l -0.002,0.004 3.75976,-3.71094 a 0.50005,0.50005 0 1 0 -0.70117,-0.71094 l -3.76172,3.71094 h -0.002 c -0.1325,0.13249 -0.61975,0.3418 -1.125,0.36133 -0.50525,0.0195 -1.00067,-0.11982 -1.27148,-0.39063 l -0.002,-0.002 -3.76953,-3.68946 a 0.50005,0.50005 0 0 0 -0.36133,-0.14648 z"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#241f31;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
<path
style="color:#bebebe;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 2.195315,1036.3622 c -1.20513,0 -2.19532,0.8499 -2.19532,1.8624 l 0,13.2379 c 7e-5,0.4656 0.44775,0.8997 1,0.8997 l 13.98962,0 c 0.55226,0 1.01031,-0.3958 1.01038,-0.8614 l 0,-13.2762 c 0,-1.0125 -0.99019,-1.8624 -2.19531,-1.8624 z m 11.80468,2.75 2e-5,11.2518 -12.0000199,0 0,-11.25 z"
id="rect11749-5-0-9-9-4-5"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ssccccsssccccc" />
id="path5950"
d="m 291.38281,-200.0625 a 0.50005,0.50005 0 0 0 -0.29492,0.89648 l 2.70313,2.12891 a 0.50005,0.50005 0 1 0 0.61718,-0.78516 l -2.70117,-2.1289 a 0.50005,0.50005 0 0 0 -0.32422,-0.11133 z"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#241f31;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
<path
style="color:#bebebe;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 1.155115,1046.867 0,1.2489 13.75,0 0,-1.2489 z"
id="rect11749-5-0-9-8-8-5"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" />
<rect
ry="0"
rx="0"
y="1046.8622"
x="1"
height="4.7456698"
width="14"
id="rect5839-9-1-0"
style="color:#bebebe;display:inline;overflow:visible;visibility:visible;opacity:0.35;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;enable-background:accumulate" />
id="path5952"
d="m 286.40234,-200.0625 a 0.50005,0.50005 0 0 0 -0.30859,0.11133 l -2.70117,2.1289 a 0.50005,0.50005 0 1 0 0.61914,0.78516 l 2.70117,-2.12891 a 0.50005,0.50005 0 0 0 -0.31055,-0.89648 z"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#241f31;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
</g>
</svg>
......@@ -41,11 +41,9 @@ install_data(icon_files,
install_dir: join_paths(system_icons_dir, 'scalable', 'actions'),
)
foreach icon_dir: colour_app_icon_dirs
install_data(join_paths('hicolor', icon_dir, 'apps', 'org.gnome.Geary.png'),
install_dir: join_paths(system_icons_dir, icon_dir, 'apps'),
)
endforeach
install_data(join_paths('hicolor', 'scalable', 'apps', 'org.gnome.Geary.svg'),
install_dir: join_paths(system_icons_dir, 'scalable', 'apps'),
)
install_data(join_paths('hicolor', 'symbolic', 'apps', 'org.gnome.Geary-symbolic.svg'),
install_dir: join_paths(system_icons_dir, 'symbolic', 'apps'),
......
......@@ -240,7 +240,7 @@ internal class Accounts.EditorListPane : Gtk.Grid, EditorPane, CommandPane {
private void on_execute(Application.Command command) {
if (command.executed_label != null) {
InAppNotification ian = new InAppNotification(command.executed_label);
ian.set_button(_("Undo"), "win." + GearyController.ACTION_UNDO);
ian.set_button(_("Undo"), "win." + GearyApplication.ACTION_UNDO);
this.editor.add_notification(ian);
}
}
......@@ -248,7 +248,7 @@ internal class Accounts.EditorListPane : Gtk.Grid, EditorPane, CommandPane {
private void on_undo(Application.Command command) {
if (command.undone_label != null) {
InAppNotification ian = new InAppNotification(command.undone_label);
ian.set_button(_("Redo"), "win." + GearyController.ACTION_REDO);
ian.set_button(_("Redo"), "win." + GearyApplication.ACTION_REDO);
this.editor.add_notification(ian);
}
}
......
......@@ -19,8 +19,8 @@ public class Accounts.Editor : Gtk.Dialog {
private const ActionEntry[] ACTION_ENTRIES = {
{ GearyController.ACTION_REDO, on_redo },
{ GearyController.ACTION_UNDO, on_undo },
{ GearyApplication.ACTION_REDO, on_redo },
{ GearyApplication.ACTION_UNDO, on_undo },
};
......@@ -226,8 +226,8 @@ public class Accounts.Editor : Gtk.Dialog {
can_redo = pane.commands.can_redo;
}
get_action(GearyController.ACTION_UNDO).set_enabled(can_undo);
get_action(GearyController.ACTION_REDO).set_enabled(can_redo);
get_action(GearyApplication.ACTION_UNDO).set_enabled(can_undo);
get_action(GearyApplication.ACTION_REDO).set_enabled(can_redo);
}
private inline EditorPane? get_current_pane() {
......
......@@ -16,6 +16,7 @@ extern const string GETTEXT_PACKAGE;
* The interface between Geary and the desktop environment.
*/
public class GearyApplication : Gtk.Application {
public const string NAME = "Geary";
public const string PRGNAME = "geary";
public const string APP_ID = "org.gnome.Geary";
......@@ -43,11 +44,19 @@ public class GearyApplication : Gtk.Application {
null
};
// Common window actions
public const string ACTION_CLOSE = "close";
public const string ACTION_COPY = "copy";
public const string ACTION_HELP_OVERLAY = "show-help-overlay";
public const string ACTION_REDO = "redo";
public const string ACTION_UNDO = "undo";
// App-wide actions
private const string ACTION_ABOUT = "about";
private const string ACTION_ACCOUNTS = "accounts";
private const string ACTION_COMPOSE = "compose";
private const string ACTION_MAILTO = "mailto";
private const string ACTION_HELP = "help";
private const string ACTION_MAILTO = "mailto";
private const string ACTION_PREFERENCES = "preferences";
private const string ACTION_QUIT = "quit";
......@@ -55,8 +64,8 @@ public class GearyApplication : Gtk.Application {
{ACTION_ABOUT, on_activate_about},
{ACTION_ACCOUNTS, on_activate_accounts},
{ACTION_COMPOSE, on_activate_compose},
{ACTION_MAILTO, on_activate_mailto, "s"},
{ACTION_HELP, on_activate_help},
{ACTION_MAILTO, on_activate_mailto, "s"},
{ACTION_PREFERENCES, on_activate_preferences},
{ACTION_QUIT, on_activate_quit},
};
......@@ -237,7 +246,21 @@ public class GearyApplication : Gtk.Application {
exec_dir.get_path(), is_installed().to_string());
config = new Configuration(APP_ID);
// Application accels
add_app_accelerators(ACTION_COMPOSE, { "<Ctrl>N", "N" });
add_app_accelerators(ACTION_HELP, { "F1" });
add_app_accelerators(ACTION_QUIT, { "<Ctrl>Q" });
// Common window accels
add_window_accelerators(ACTION_CLOSE, { "<Ctrl>W" });
add_window_accelerators(ACTION_COPY, { "<Ctrl>C" });
add_window_accelerators(ACTION_HELP_OVERLAY, { "<Ctrl>F1", "<Ctrl>question" });
add_window_accelerators(ACTION_REDO, { "<Ctrl><Shift>Z" });
add_window_accelerators(ACTION_UNDO, { "<Ctrl>Z" });
ComposerWidget.add_window_accelerators(this);
yield controller.open_async(null);
release();
......@@ -257,7 +280,12 @@ public class GearyApplication : Gtk.Application {
public void add_window_accelerators(string action,
string[] accelerators,
Variant? param = null) {
set_accels_for_action("win." + action, accelerators);
string name = "win." + action;
string[] all_accel = get_accels_for_action(name);
foreach (string accel in accelerators) {
all_accel += accel;
}
set_accels_for_action(name, all_accel);
}
public void show_accounts() {
......@@ -406,6 +434,12 @@ public class GearyApplication : Gtk.Application {
Posix.exit(1);
}
public void add_app_accelerators(string action,
string[] accelerators,
Variant? param = null) {
set_accels_for_action("app." + action, accelerators);
}
private void on_activate_about() {
Gtk.show_about_dialog(get_active_window(),
"program-name", NAME,
......
......@@ -13,7 +13,6 @@
public class GearyController : Geary.BaseObject {
// Named actions.
public const string ACTION_NEW_MESSAGE = "new-message";
public const string ACTION_REPLY_TO_MESSAGE = "reply-to-message";
public const string ACTION_REPLY_ALL_MESSAGE = "reply-all-message";
public const string ACTION_FORWARD_MESSAGE = "forward-message";
......@@ -22,8 +21,6 @@ public class GearyController : Geary.BaseObject {
public const string ACTION_DELETE_CONVERSATION = "delete-conv";
public const string ACTION_EMPTY_SPAM = "empty-spam";
public const string ACTION_EMPTY_TRASH = "empty-trash";
public const string ACTION_UNDO = "undo";
public const string ACTION_REDO = "redo";
public const string ACTION_FIND_IN_CONVERSATION = "conv-find";
public const string ACTION_ZOOM = "zoom";
public const string ACTION_SHOW_MARK_MENU = "mark-message-menu";
......@@ -162,13 +159,14 @@ public class GearyController : Geary.BaseObject {
private Gee.List<ComposerWidget> waiting_to_close = new Gee.ArrayList<ComposerWidget>();
private const ActionEntry[] win_action_entries = {
{ACTION_NEW_MESSAGE, on_new_message },
{GearyApplication.ACTION_CLOSE, on_close },
{GearyApplication.ACTION_UNDO, on_revoke },
{ACTION_CONVERSATION_LIST, on_conversation_list },
{ACTION_FIND_IN_CONVERSATION, on_find_in_conversation_action },
{ACTION_SEARCH, on_search_activated },
{ACTION_EMPTY_SPAM, on_empty_spam },
{ACTION_EMPTY_TRASH, on_empty_trash },
{ACTION_UNDO, on_revoke },
// Message actions
{ACTION_REPLY_TO_MESSAGE, on_reply_to_message_action },
{ACTION_REPLY_ALL_MESSAGE, on_reply_all_message_action },
......@@ -605,7 +603,6 @@ public class GearyController : Geary.BaseObject {
add_window_accelerators(ACTION_MARK_AS_NOT_SPAM, { "<Ctrl>J", "exclam" });
add_window_accelerators(ACTION_COPY_MENU, { "L" });
add_window_accelerators(ACTION_MOVE_MENU, { "M" });
add_window_accelerators(ACTION_NEW_MESSAGE, { "<Ctrl>N", "N" });
add_window_accelerators(ACTION_REPLY_TO_MESSAGE, { "<Ctrl>R", "R" });
add_window_accelerators(ACTION_REPLY_ALL_MESSAGE, { "<Ctrl><Shift>R", "<Shift>R" });
add_window_accelerators(ACTION_FORWARD_MESSAGE, { "<Ctrl>L", "F" });
......@@ -613,8 +610,6 @@ public class GearyController : Geary.BaseObject {
add_window_accelerators(ACTION_ARCHIVE_CONVERSATION, { "A" });
add_window_accelerators(ACTION_TRASH_CONVERSATION, { "Delete", "BackSpace" });
add_window_accelerators(ACTION_DELETE_CONVERSATION, { "<Shift>Delete", "<Shift>BackSpace" });
add_window_accelerators(ACTION_UNDO, { "<Ctrl>Z" });
add_window_accelerators(ACTION_REDO, { "<Ctrl><Shift>Z" });
add_window_accelerators(ACTION_ZOOM+("('in')"), { "<Ctrl>equal", "equal" });
add_window_accelerators(ACTION_ZOOM+("('out')"), { "<Ctrl>minus", "minus" });
add_window_accelerators(ACTION_ZOOM+("('normal')"), { "<Ctrl>0", "0" });
......@@ -1250,9 +1245,9 @@ public class GearyController : Geary.BaseObject {
private void on_indicator_activated_composer(uint32 timestamp) {
on_indicator_activated_application(timestamp);
on_new_message(null);
compose();
}
private void on_indicator_activated_inbox(Geary.Folder folder, uint32 timestamp) {
on_indicator_activated_application(timestamp);
main_window.folder_list.select_folder(folder);
......@@ -2268,9 +2263,9 @@ public class GearyController : Geary.BaseObject {
this.application.exit();
}
}
private void on_new_message(SimpleAction? action) {
create_compose_widget(ComposerWidget.ComposeType.NEW_MESSAGE);
private void on_close() {
this.application.exit();
}
private void on_reply_to_message(ConversationEmail target_view) {
......@@ -2525,7 +2520,11 @@ public class GearyController : Geary.BaseObject {
}
private void update_revokable_action() {
get_window_action(ACTION_UNDO).set_enabled(this.revokable != null && this.revokable.valid && !this.revokable.in_process);
get_window_action(GearyApplication.ACTION_UNDO).set_enabled(
this.revokable != null &&
this.revokable.valid &&
!this.revokable.in_process
);
}
private void on_revokable_valid_changed() {
......
......@@ -36,9 +36,9 @@ public class MainToolbar : Gtk.Box {
[GtkChild]
private Gtk.HeaderBar folder_header;
[GtkChild]
private Gtk.MenuButton empty_menu_button;
[GtkChild]
private Gtk.ToggleButton search_conversations_button;
[GtkChild]
private Gtk.MenuButton main_menu_button;
private Binding guest_header_binding;
// Conversation header elements
......@@ -89,13 +89,13 @@ public class MainToolbar : Gtk.Box {
this.bind_property("show-close-button-right", this.conversation_header, "show-close-button",
BindingFlags.SYNC_CREATE);
// Assemble the empty/mark menus
// Assemble the main/mark menus
Gtk.Builder builder = new Gtk.Builder.from_resource("/org/gnome/Geary/main-toolbar-menus.ui");
MenuModel empty_menu = (MenuModel) builder.get_object("empty_menu");
MenuModel main_menu = (MenuModel) builder.get_object("main_menu");
MenuModel mark_menu = (MenuModel) builder.get_object("mark_message_menu");
// Setup folder header elements
this.empty_menu_button.popover = new Gtk.Popover.from_model(null, empty_menu);
this.main_menu_button.popover = new Gtk.Popover.from_model(null, main_menu);
this.bind_property("search-open", this.search_conversations_button, "active",
BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL);
......
......@@ -47,10 +47,7 @@ public class ComposerWidget : Gtk.EventBox, Geary.BaseInterface {
}
}
private const string ACTION_UNDO = "undo";
private const string ACTION_REDO = "redo";
private const string ACTION_CUT = "cut";
private const string ACTION_COPY = "copy";
private const string ACTION_COPY_LINK = "copy-link";
private const string ACTION_PASTE = "paste";
private const string ACTION_PASTE_WITHOUT_FORMATTING = "paste-without-formatting";
......@@ -72,7 +69,6 @@ public class ComposerWidget : Gtk.EventBox, Geary.BaseInterface {
private const string ACTION_INSERT_LINK = "insert-link";
private const string ACTION_COMPOSE_AS_HTML = "compose-as-html";
private const string ACTION_SHOW_EXTENDED = "show-extended";
private const string ACTION_CLOSE = "close";
private const string ACTION_CLOSE_AND_SAVE = "close-and-save";
private const string ACTION_CLOSE_AND_DISCARD = "close-and-discard";
private const string ACTION_DETACH = "detach";
......@@ -92,10 +88,10 @@ public class ComposerWidget : Gtk.EventBox, Geary.BaseInterface {
};
private const ActionEntry[] editor_action_entries = {
{ACTION_UNDO, on_undo },
{ACTION_REDO, on_redo },
{GearyApplication.ACTION_UNDO, on_undo },
{GearyApplication.ACTION_REDO, on_redo },
{GearyApplication.ACTION_COPY, on_copy },
{ACTION_CUT, on_cut },
{ACTION_COPY, on_copy },
{ACTION_COPY_LINK, on_copy_link },
{ACTION_PASTE, on_paste },
{ACTION_PASTE_WITHOUT_FORMATTING, on_paste_without_formatting },
......@@ -119,9 +115,9 @@ public class ComposerWidget : Gtk.EventBox, Geary.BaseInterface {
};
private const ActionEntry[] composer_action_entries = {
{GearyApplication.ACTION_CLOSE, on_close },
{ACTION_ADD_ATTACHMENT, on_add_attachment },
{ACTION_ADD_ORIGINAL_ATTACHMENTS, on_pending_attachments },
{ACTION_CLOSE, on_close },
{ACTION_CLOSE_AND_DISCARD, on_close_and_discard },
{ACTION_CLOSE_AND_SAVE, on_close_and_save },
{ACTION_COMPOSE_AS_HTML, on_toggle_action, null, "true", on_compose_as_html_toggled },
......@@ -134,10 +130,8 @@ public class ComposerWidget : Gtk.EventBox, Geary.BaseInterface {
public static Gee.MultiMap<string, string> action_accelerators = new Gee.HashMultiMap<string, string>();
public static void add_window_accelerators(GearyApplication application) {
application.add_window_accelerators(ACTION_UNDO, { "<Ctrl>z" } );
application.add_window_accelerators(ACTION_REDO, { "<Ctrl><Shift>z" } );
application.add_window_accelerators(GearyApplication.ACTION_CLOSE, { "Escape" } );
application.add_window_accelerators(ACTION_CUT, { "<Ctrl>x" } );
application.add_window_accelerators(ACTION_COPY, { "<Ctrl>c" } );
application.add_window_accelerators(ACTION_PASTE, { "<Ctrl>v" } );
application.add_window_accelerators(ACTION_PASTE_WITHOUT_FORMATTING, { "<Ctrl><Shift>v" } );
application.add_window_accelerators(ACTION_INSERT_IMAGE, { "<Ctrl>g" } );
......@@ -149,7 +143,6 @@ public class ComposerWidget : Gtk.EventBox, Geary.BaseInterface {
application.add_window_accelerators(ACTION_ITALIC, { "<Ctrl>i" } );
application.add_window_accelerators(ACTION_UNDERLINE, { "<Ctrl>u" } );
application.add_window_accelerators(ACTION_STRIKETHROUGH, { "<Ctrl>k" } );
application.add_window_accelerators(ACTION_CLOSE, { "Escape" } );
application.add_window_accelerators(ACTION_ADD_ATTACHMENT, { "<Ctrl>t" } );
application.add_window_accelerators(ACTION_DETACH, { "<Ctrl>d" } );
}
......@@ -841,8 +834,8 @@ public class ComposerWidget : Gtk.EventBox, Geary.BaseInterface {
);
get_action(ACTION_CLOSE_AND_SAVE).set_enabled(false);
get_action(ACTION_UNDO).set_enabled(false);
get_action(ACTION_REDO).set_enabled(false);
get_action(GearyApplication.ACTION_UNDO).set_enabled(false);
get_action(GearyApplication.ACTION_REDO).set_enabled(false);
update_cursor_actions();
}
......@@ -850,7 +843,7 @@ public class ComposerWidget : Gtk.EventBox, Geary.BaseInterface {
private void update_cursor_actions() {
bool has_selection = this.editor.has_selection;
get_action(ACTION_CUT).set_enabled(has_selection);
get_action(ACTION_COPY).set_enabled(has_selection);
get_action(GearyApplication.ACTION_COPY).set_enabled(has_selection);
get_action(ACTION_INSERT_LINK).set_enabled(
this.editor.is_rich_text && (has_selection || this.cursor_url != null)
......@@ -2223,8 +2216,8 @@ public class ComposerWidget : Gtk.EventBox, Geary.BaseInterface {
}
private void on_command_state_changed(bool can_undo, bool can_redo) {
get_action(ACTION_UNDO).set_enabled(can_undo);
get_action(ACTION_REDO).set_enabled(can_redo);
get_action(GearyApplication.ACTION_UNDO).set_enabled(can_undo);
get_action(GearyApplication.ACTION_REDO).set_enabled(can_redo);
}
private void on_draft_id_changed() {
......
......@@ -10,10 +10,10 @@ extern const string _SOURCE_ROOT_DIR;
class Geary.AttachmentTest : TestCase {
private const string CONTENT_TYPE = "image/png";
private const string CONTENT_TYPE = "image/svg+xml";
private const string CONTENT_ID = "test-content-id";
private const string CONTENT_DESC = "Mea navis volitans anguillis plena est";
private const string FILE_PATH = "icons/hicolor/16x16/apps/org.gnome.Geary.png";
private const string FILE_PATH = "icons/hicolor/scalable/apps/org.gnome.Geary.svg";
private Mime.ContentType? content_type;
private Mime.ContentType? default_type;
......@@ -73,7 +73,7 @@ class Geary.AttachmentTest : TestCase {
}
public void get_safe_file_name_with_content_name() throws Error {
const string TEST_FILENAME = "test-filename.png";
const string TEST_FILENAME = "test-filename.svg";
Attachment test = new TestAttachment(
this.content_type,
CONTENT_ID,
......@@ -92,7 +92,7 @@ class Geary.AttachmentTest : TestCase {
public void get_safe_file_name_with_bad_content_name() throws Error {
const string TEST_FILENAME = "test-filename.jpg";
const string RESULT_FILENAME = "test-filename.jpg.png";
const string RESULT_FILENAME = "test-filename.jpg.svg";
Attachment test = new TestAttachment(
this.content_type,
CONTENT_ID,
......@@ -111,7 +111,7 @@ class Geary.AttachmentTest : TestCase {
public void get_safe_file_name_with_bad_file_name() throws Error {
const string TEST_FILENAME = "test-filename";
const string RESULT_FILENAME = "test-filename.png";
const string RESULT_FILENAME = "test-filename.svg";
Attachment test = new TestAttachment(
this.content_type,
CONTENT_ID,
......@@ -129,7 +129,7 @@ class Geary.AttachmentTest : TestCase {
}
public void get_safe_file_name_with_no_content_name() throws Error {
const string RESULT_FILENAME = CONTENT_ID + ".png";
const string RESULT_FILENAME = CONTENT_ID + ".svg";
Attachment test = new TestAttachment(
this.content_type,
CONTENT_ID,
......@@ -147,7 +147,7 @@ class Geary.AttachmentTest : TestCase {
}
public void get_safe_file_name_with_no_content_name_or_id() throws Error {
const string RESULT_FILENAME = "attachment.png";
const string RESULT_FILENAME = "attachment.svg";
Attachment test = new TestAttachment(
this.content_type,
null,
......@@ -166,7 +166,7 @@ class Geary.AttachmentTest : TestCase {
public void get_safe_file_name_with_alt_file_name() throws Error {
const string ALT_TEXT = "some text";
const string RESULT_FILENAME = "some text.png";
const string RESULT_FILENAME = "some text.svg";
Attachment test = new TestAttachment(
this.content_type,
null,
......@@ -184,7 +184,7 @@ class Geary.AttachmentTest : TestCase {
}
public void get_safe_file_name_with_default_content_type() throws Error {
const string TEST_FILENAME = "test-filename.png";
const string TEST_FILENAME = "test-filename.svg";
Attachment test = new TestAttachment(
this.default_type,
CONTENT_ID,
......@@ -204,7 +204,7 @@ class Geary.AttachmentTest : TestCase {
public void get_safe_file_name_with_default_content_type_bad_file_name()
throws Error {
const string TEST_FILENAME = "test-filename.jpg";
const string RESULT_FILENAME = "test-filename.jpg.png";
const string RESULT_FILENAME = "test-filename.jpg.svg";
Attachment test = new TestAttachment(
this.default_type,
CONTENT_ID,
......
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<menu id="app-menu">
<section>
<item>
<attribute name="label" translatable="yes">Compose Message</attribute>
<attribute name="action">app.compose</attribute>
</item>
</section>
<section>
<item>
<attribute name="label" translatable="yes">A_ccounts</attribute>
<attribute name="action">app.accounts</attribute>
</item>
<item>
<attribute name="label" translatable="yes">_Preferences</attribute>
<attribute name="action">app.preferences</attribute>
</item>
</section>
<section>
<item>
<attribute name="label" translatable="yes">_Keyboard Shortcuts</attribute>
<attribute name="action">win.show-help-overlay</attribute>
<attribute name="accel">&lt;Primary&gt;F1</attribute>
<attribute name="hidden-when">action-missing</attribute>
</item>
<item>
<attribute name="label" translatable="yes">_Help</attribute>
<attribute name="action">app.help</attribute>
<attribute name="accel">F1</attribute>
</item>
<item>
<attribute name="label" translatable="yes">_About</attribute>
<attribute name="action">app.about</attribute>
</item>
<item>
<attribute name="label" translatable="yes">_Quit</attribute>
<attribute name="action">app.quit</attribute>
<attribute name="accel">&lt;Primary&gt;Q</attribute>
</item>
</section>
</menu>
</interface>
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<menu id="empty_menu">
<item>
<attribute name="label" translatable="yes">Empty _Spam…</attribute>
<attribute name="action">win.empty-spam</attribute>
</item>
<item>
<attribute name="label" translatable="yes">Empty _Trash…</attribute>
<attribute name="action">win.empty-trash</attribute>
</item>
</menu>
<menu id="mark_message_menu">
<item>
<attribute name="label" translatable="yes">Mark as _Read</attribute>
......@@ -37,4 +26,43 @@
<attribute name="action">win.mark-message-not-spam</attribute>
</item>
</menu>
<menu id="main_menu">
<section>
<item>
<attribute name="label" translatable="yes">Empty _Spam…</attribute>
<attribute name="action">win.empty-spam</attribute>
</item>
<item>
<attribute name="label" translatable="yes">Empty _Trash…</attribute>
<attribute name="action">win.empty-trash</attribute>
</item>
</section>
<section>
<item>
<attribute name="label" translatable="yes">_Accounts</attribute>
<attribute name="action">app.accounts</attribute>
</item>