mirror of
https://github.com/NixOS/mobile-nixos.git
synced 2024-12-16 20:21:32 +03:00
Merge pull request #239 from samueldr-wip/feature/stage-1-gracefulier-errors-handling
stage-1: More useful error handler
This commit is contained in:
commit
08e75d3733
@ -1,85 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<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"
|
||||
id="svg8"
|
||||
version="1.1"
|
||||
viewBox="0 0 285.75001 508.00001"
|
||||
height="1920"
|
||||
width="1080">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<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>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
transform="translate(-33.337511,278.73334)"
|
||||
id="layer1">
|
||||
<g
|
||||
style="stroke-width:0.99834239"
|
||||
transform="matrix(1.0020995,0,0,1.0012214,80.762537,-205.20737)"
|
||||
id="g877">
|
||||
<g
|
||||
id="g928">
|
||||
<path
|
||||
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:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.64144802;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="m 53.484375,32.796875 c -7.374823,0 -13.416011,6.041206 -13.416016,13.416016 V 209.12109 c -4e-6,7.37483 6.041452,13.41407 13.416016,13.41407 h 83.531245 c 7.37457,0 13.41602,-6.03924 13.41602,-13.41407 V 46.212891 c 0,-7.374812 -6.04119,-13.416016 -13.41602,-13.416016 z m 0,2.640625 h 83.531245 c 5.93518,0 10.7754,4.840208 10.7754,10.775391 V 209.12109 c 0,5.93518 -4.83996,10.77344 -10.7754,10.77344 H 53.484375 c -5.935428,0 -10.775394,-4.83826 -10.775391,-10.77344 V 46.212891 c 4e-6,-5.935184 4.840222,-10.775391 10.775391,-10.775391 z m 0,2.652344 c -4.504521,0 -8.125,3.618075 -8.125,8.123047 V 209.12109 c -10e-7,4.50498 3.620479,8.12305 8.125,8.12305 h 83.531245 c 4.50453,0 8.125,-3.61807 8.125,-8.12305 V 46.212891 c 0,-4.504971 -3.62047,-8.123047 -8.125,-8.123047 z m 0,2.640625 h 83.531245 c 3.12538,0 5.48438,2.357505 5.48438,5.482422 V 209.12109 c 0,3.12493 -2.359,5.48243 -5.48438,5.48243 H 53.484375 c -3.125367,0 -5.484376,-2.3575 -5.484375,-5.48243 V 46.212891 c 0,-3.124917 2.359008,-5.482422 5.484375,-5.482422 z"
|
||||
id="rect815-3" />
|
||||
<path
|
||||
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:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.11315823;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="m 77.699219,68.4375 c -0.894986,0.0246 -1.736526,0.444594 -2.294922,1.144531 l -3.914063,4.761719 -4.763672,-3.914062 c -0.54731,-0.462472 -1.240493,-0.717505 -1.957031,-0.71875 -1.383197,-0.0026 -2.48335,0.918696 -2.875,2.033203 -0.39165,1.114506 -0.110039,2.521493 0.970703,3.384765 l 4.763672,3.914063 -3.902344,4.75 c -0.0014,0.0016 -5.53e-4,0.0042 -0.002,0.0059 -0.620425,0.713467 -0.873645,1.609837 -0.757812,2.404297 0.116094,0.796253 0.54705,1.467617 1.121094,1.939453 0.574043,0.471836 1.315476,0.764865 2.11914,0.72461 0.803664,-0.04026 1.636774,-0.462922 2.216797,-1.212891 l 3.904297,-4.75 4.761719,3.912109 c 0.714923,0.60747 1.607555,0.849733 2.396484,0.730469 0.78893,-0.119264 1.453579,-0.547162 1.921875,-1.117187 0.468297,-0.570026 0.75878,-1.304488 0.722656,-2.101563 -0.03609,-0.796254 -0.446437,-1.625652 -1.179687,-2.208984 l -4.761719,-3.914063 3.914063,-4.761719 c 0.823069,-0.972486 0.899538,-2.282513 0.419922,-3.28125 -0.479362,-0.998207 -1.549583,-1.75812 -2.822266,-1.724609 z m 0.05859,2.113281 c 0.440736,-0.01189 0.708355,0.206844 0.861329,0.525391 0.152973,0.318547 0.155926,0.665413 -0.128907,1.001953 l -0.0039,0.0059 -5.271484,6.41211 6.414062,5.271484 0.0059,0.0059 c 0.318738,0.253119 0.37734,0.443454 0.386718,0.65039 0.0094,0.206936 -0.0775,0.45885 -0.246093,0.664063 -0.16859,0.205212 -0.400648,0.34013 -0.605469,0.371093 -0.204821,0.03096 -0.402722,0.0116 -0.712891,-0.251953 l -0.0059,-0.0059 -6.414063,-5.271484 -5.27539,6.419921 -0.0098,0.01172 c -0.253774,0.328129 -0.442957,0.386094 -0.650391,0.396484 -0.207433,0.01039 -0.464066,-0.07724 -0.671874,-0.248046 -0.207809,-0.170809 -0.343082,-0.405808 -0.373047,-0.611328 -0.02997,-0.205521 -0.01107,-0.402346 0.261718,-0.714844 l 0.01172,-0.01172 5.273438,-6.419922 -6.41211,-5.269531 -0.0059,-0.0059 c -0.387052,-0.309168 -0.423683,-0.670396 -0.296875,-1.03125 0.126808,-0.360853 0.381581,-0.622019 0.876953,-0.621093 0.218947,3.8e-4 0.430419,0.07744 0.597656,0.21875 l 0.0059,0.0059 6.412109,5.269531 5.269531,-6.414062 0.0059,-0.0059 c 0.171066,-0.214428 0.426966,-0.340294 0.701171,-0.347657 z"
|
||||
id="path838-6" />
|
||||
<path
|
||||
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:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.11315823;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="m 119.65625,67.492188 c -0.89571,0.02405 -1.73808,0.444089 -2.29687,1.144531 l -3.91211,4.763672 -4.76563,-3.916016 c -0.54731,-0.462471 -1.24049,-0.717505 -1.95703,-0.71875 -1.3832,-0.0026 -2.48335,0.918697 -2.875,2.033203 -0.3912,1.113236 -0.10894,2.517336 0.96875,3.38086 0.001,9.84e-4 7.2e-4,0.0029 0.002,0.0039 l 4.76563,3.916015 -3.9043,4.75 c -0.62346,0.714244 -0.87586,1.613916 -0.75976,2.410157 0.11609,0.796241 0.54705,1.465669 1.12109,1.9375 0.57404,0.47183 1.31549,0.764858 2.11914,0.724609 0.80365,-0.04025 1.63677,-0.462946 2.2168,-1.212891 l 3.90429,-4.75 4.76172,3.91211 c 0.71492,0.607526 1.60753,0.851676 2.39649,0.732422 0.78895,-0.119255 1.45356,-0.5491 1.92187,-1.119141 0.46831,-0.570041 0.76075,-1.304463 0.72461,-2.101563 -0.0361,-0.797099 -0.44886,-1.625569 -1.18359,-2.208984 l 0.0156,0.0098 -4.77539,-3.923828 3.91406,-4.761719 c 0.82307,-0.972485 0.89954,-2.282514 0.41993,-3.28125 -0.47962,-0.998737 -1.5487,-1.758977 -2.82227,-1.724609 z m 0.0566,2.113281 c 0.44074,-0.01189 0.70836,0.206843 0.86133,0.52539 0.15297,0.318547 0.15593,0.665413 -0.12891,1.001953 l -0.004,0.0059 -5.27149,6.412109 6.41406,5.271485 0.008,0.0059 c 0.31877,0.253122 0.37538,0.443453 0.38476,0.650391 0.009,0.206938 -0.0775,0.460793 -0.24609,0.666015 -0.1686,0.205223 -0.40065,0.338181 -0.60547,0.369141 -0.20482,0.03096 -0.40076,0.01163 -0.71094,-0.251953 l -0.008,-0.0059 -6.41406,-5.271484 -5.27539,6.419922 -0.01,0.01172 c -0.25377,0.328114 -0.44296,0.386095 -0.65039,0.396484 -0.20743,0.01039 -0.46407,-0.07529 -0.67187,-0.246094 -0.20781,-0.170805 -0.34308,-0.405808 -0.37305,-0.611328 -0.03,-0.20552 -0.009,-0.404302 0.26367,-0.716797 l 0.01,-0.01172 5.27343,-6.417968 -6.41211,-5.271485 -0.006,-0.0039 c -0.38705,-0.309168 -0.42368,-0.672349 -0.29687,-1.033203 0.12681,-0.360854 0.38158,-0.622018 0.87695,-0.621094 0.21895,3.81e-4 0.43042,0.07744 0.59766,0.21875 l 0.006,0.0059 6.41406,5.269531 5.26953,-6.412109 0.004,-0.0059 c 0.17107,-0.214428 0.42696,-0.342246 0.70117,-0.349609 z"
|
||||
id="path818-7" />
|
||||
<path
|
||||
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:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.11315846;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="m 115.77148,145.03906 c -4.09248,0.12073 -7.95942,1.10278 -10.64843,3.20117 -2.30577,1.79931 -4.71805,3.42098 -7.5918,3.94922 -2.891157,0.53144 -6.42863,0.13598 -11.570312,-3.00976 -6.566659,-4.01758 -13.252474,-2.84073 -17.935547,-0.19727 -2.327499,1.31381 -4.237958,2.94356 -5.697266,4.48633 -1.445623,1.5283 -2.461531,2.90554 -3.052734,4.26563 -0.38008,0.85047 -0.369097,1.76886 -0.03906,2.49023 0.33151,0.72459 0.925604,1.24569 1.601563,1.53906 0.675958,0.29338 1.463065,0.37188 2.21875,0.11914 0.755685,-0.25274 1.438455,-0.87379 1.798828,-1.73828 l -0.0059,0.0137 c -0.0033,0.008 0.230706,-0.41944 0.564453,-0.88867 0.333748,-0.46923 0.790854,-1.04897 1.332032,-1.62109 1.097202,-1.15996 2.589267,-2.42068 4.269531,-3.36914 3.394584,-1.91616 7.102978,-2.77151 11.773437,0.0859 6.071267,3.71449 11.399799,4.62316 15.841797,3.80665 4.428651,-0.81406 7.737711,-3.19039 10.234371,-5.13868 0.49572,-0.38683 2.11234,-1.05604 4.04688,-1.44336 1.93454,-0.38732 4.23495,-0.56508 6.32422,-0.33203 2.10812,0.23516 4.05761,0.84078 5.36914,1.67578 1.34343,0.85533 2.03546,1.73113 2.32812,3.20118 v -0.008 c 0.17567,0.91401 0.7135,1.65796 1.39649,2.06055 0.68299,0.40259 1.46403,0.49099 2.18359,0.34766 0.71956,-0.14334 1.40622,-0.52464 1.88281,-1.15821 0.4766,-0.63357 0.68994,-1.52594 0.50196,-2.4375 -0.63166,-3.16299 -2.6131,-5.59893 -5.02539,-7.13476 -2.39201,-1.52291 -5.18058,-2.28143 -7.96289,-2.5918 -1.38275,-0.15424 -2.77381,-0.21409 -4.13868,-0.17383 z m 0.0625,2.11328 c 1.26052,-0.0372 2.55433,0.0185 3.8418,0.16211 2.55811,0.28536 5.03142,0.97961 7.06055,2.27149 2.00724,1.27795 3.58406,3.23281 4.08984,5.77344 l 0.002,0.002 v 0.004 c 0.081,0.39301 0.005,0.577 -0.11914,0.74219 -0.12426,0.16519 -0.34943,0.30408 -0.60742,0.35547 -0.25799,0.0514 -0.52114,0.009 -0.69922,-0.0957 -0.17807,-0.10497 -0.31879,-0.24462 -0.39453,-0.63867 v -0.004 -0.004 c -0.40018,-2.01013 -1.59428,-3.50426 -3.26562,-4.56836 -1.70327,-1.08441 -3.9184,-1.73361 -6.27149,-1.99609 -2.37195,-0.26459 -4.84913,-0.0638 -6.97265,0.36133 -2.12352,0.42516 -3.8454,1.00238 -4.9336,1.85156 -2.43661,1.90143 -5.42354,4.00904 -9.316403,4.72461 -3.879509,0.71312 -8.620836,-0.0196 -14.357422,-3.5293 -5.290431,-3.23675 -10.131377,-2.26022 -13.914063,-0.125 -1.908365,1.07722 -3.538847,2.45892 -4.765624,3.75586 -0.620814,0.65632 -1.133839,1.30735 -1.519532,1.84961 -0.385692,0.54226 -0.620384,0.90731 -0.779297,1.27344 l -0.0039,0.006 -0.002,0.008 c -0.156141,0.37457 -0.323164,0.4812 -0.519531,0.54688 -0.196367,0.0657 -0.463891,0.0528 -0.707031,-0.0527 -0.243141,-0.10552 -0.435341,-0.29218 -0.521485,-0.48047 -0.08614,-0.18829 -0.122032,-0.38208 0.04492,-0.75195 l 0.0039,-0.008 0.002,-0.008 c 0.440363,-1.01457 1.305682,-2.2305 2.654297,-3.65624 1.336433,-1.41287 3.095402,-2.91096 5.201172,-4.09961 4.183465,-2.36145 9.920687,-3.43574 15.794922,0.1582 5.452243,3.33574 9.653499,3.91229 13.054687,3.28711 3.418598,-0.6284 6.130508,-2.50663 8.509768,-4.36328 2.14884,-1.67687 5.6265,-2.64034 9.41015,-2.75196 z"
|
||||
id="path868-5" />
|
||||
</g>
|
||||
<g
|
||||
id="g936">
|
||||
<path
|
||||
id="rect815"
|
||||
d="m 53.484375,34.117188 c -6.654996,0 -12.095599,5.440706 -12.095603,12.095703 l -1e-4,162.908199 c -4e-6,6.655 5.440707,12.09375 12.095703,12.09375 h 83.531245 c 6.655,0 12.09571,-5.43875 12.09571,-12.09375 l -1e-4,-162.908199 c 0,-6.654997 -5.44061,-12.095703 -12.09561,-12.095703 z m 0,5.292968 h 83.531245 c 3.81495,0 6.80469,2.987791 6.80469,6.802735 V 209.12109 c 0,3.81495 -2.98974,6.80274 -6.80469,6.80274 H 53.484375 c -3.814944,0 -6.804688,-2.98779 -6.804687,-6.80274 V 46.212891 c 0,-3.814944 2.989743,-6.802735 6.804687,-6.802735 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:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.64144778;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||
<g
|
||||
id="g857"
|
||||
style="stroke-width:0.99834239;stroke:none">
|
||||
<path
|
||||
id="path838"
|
||||
transform="matrix(0.26458334,0,0,0.26458334,0,-41.666676)"
|
||||
d="m 293.77734,420.13477 a 7.5007497,7.5007497 0 0 0 -5.66211,2.82031 l -17.36328,21.13281 -21.13281,-17.36719 a 7.5007497,7.5007497 0 0 0 -4.82812,-1.77148 7.5007497,7.5007497 0 0 0 -4.69532,13.36133 l 21.13282,17.36718 -17.36133,21.12891 a 7.5007497,7.5007497 0 1 0 11.58398,9.52148 l 17.36328,-21.1289 21.13282,17.36523 a 7.5007497,7.5007497 0 1 0 9.52148,-11.58984 l -21.12891,-17.36523 17.36524,-21.13086 a 7.5007497,7.5007497 0 0 0 -5.92774,-12.34375 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:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:7.98673916;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||
</g>
|
||||
<g
|
||||
style="stroke-width:0.99834239;stroke:none"
|
||||
id="use859"
|
||||
transform="translate(41.955358,-0.9449405)">
|
||||
<path
|
||||
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:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:7.98673916;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="m 293.77734,420.13477 a 7.5007497,7.5007497 0 0 0 -5.66211,2.82031 l -17.36328,21.13281 -21.13281,-17.36719 a 7.5007497,7.5007497 0 0 0 -4.82812,-1.77148 7.5007497,7.5007497 0 0 0 -4.69532,13.36133 l 21.13282,17.36718 -17.36133,21.12891 a 7.5007497,7.5007497 0 1 0 11.58398,9.52148 l 17.36328,-21.1289 21.13282,17.36523 a 7.5007497,7.5007497 0 1 0 9.52148,-11.58984 l -21.12891,-17.36523 17.36524,-21.13086 a 7.5007497,7.5007497 0 0 0 -5.92774,-12.34375 z"
|
||||
transform="matrix(0.26458334,0,0,0.26458334,0,-41.666676)"
|
||||
id="path818" />
|
||||
</g>
|
||||
<path
|
||||
id="path868"
|
||||
d="m 115.80273,146.0957 c -3.93807,0.11617 -7.61036,1.08894 -10.02929,2.97657 -2.34251,1.82798 -4.90461,3.57793 -8.050784,4.15625 -3.146173,0.57831 -7.015537,0.0923 -12.3125,-3.14844 -6.220446,-3.80576 -12.431965,-2.68019 -16.865234,-0.17774 -2.216635,1.25123 -4.051349,2.81515 -5.449219,4.29297 -1.39787,1.47782 -2.339823,2.77487 -2.855469,3.96289 a 1.9845734,1.9845734 0 1 0 3.640625,1.58008 c 0.155563,-0.35841 0.935666,-1.58796 2.097657,-2.8164 1.16199,-1.22845 2.723261,-2.54966 4.517578,-3.5625 3.588634,-2.02569 7.863305,-2.94164 12.84375,0.10546 5.903926,3.6121 10.938854,4.43279 15.099609,3.66797 4.160757,-0.76481 7.308747,-3.00678 9.775387,-4.93164 1.58391,-1.23601 6.67746,-2.49178 11.13868,-1.99414 2.2306,0.24882 4.31291,0.87623 5.82031,1.83594 1.50739,0.95971 2.45045,2.14467 2.79687,3.88476 a 1.9845734,1.9845734 0 1 0 3.89258,-0.77539 c -0.56804,-2.85333 -2.34803,-5.04963 -4.55859,-6.45703 -2.21057,-1.40739 -4.84151,-2.13378 -7.51172,-2.43164 -1.33511,-0.14893 -2.67755,-0.20669 -3.99024,-0.16797 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:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.11315846;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 22 KiB |
94
artwork/sad.svg
Normal file
94
artwork/sad.svg
Normal file
@ -0,0 +1,94 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
id="svg8"
|
||||
version="1.1"
|
||||
viewBox="0 0 74.113577 73.978384"
|
||||
height="279.60333"
|
||||
width="280.11429"
|
||||
sodipodi:docname="sad.svg"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)">
|
||||
<sodipodi:namedview
|
||||
inkscape:pagecheckerboard="true"
|
||||
inkscape:document-rotation="0"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1760"
|
||||
inkscape:window-height="1407"
|
||||
id="namedview19"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:zoom="2.9698485"
|
||||
inkscape:cx="121.26914"
|
||||
inkscape:cy="249.42173"
|
||||
inkscape:window-x="2476"
|
||||
inkscape:window-y="605"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg8" />
|
||||
<defs
|
||||
id="defs2" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<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>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
transform="translate(-18.969478,-26.925074)"
|
||||
id="g884">
|
||||
<path
|
||||
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;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.11667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="m 44.513438,35.68416 c -0.896866,0.02463 -1.740172,0.445137 -2.299741,1.145928 l -3.92228,4.767535 -4.773674,-3.918842 c -0.548459,-0.463037 -1.243097,-0.718382 -1.961139,-0.719628 -1.386101,-0.0026 -2.488564,0.919818 -2.881036,2.035686 -0.392473,1.115868 -0.11027,2.524573 0.972741,3.388899 l 4.773673,3.918844 -3.910537,4.755802 c -0.0014,0.0016 -5.54e-4,0.0042 -0.002,0.0059 -0.621728,0.714338 -0.875479,1.611803 -0.759403,2.407234 0.116337,0.797225 0.548198,1.469409 1.123447,1.941821 0.575249,0.472413 1.318238,0.7658 2.12359,0.725495 0.805351,-0.04031 1.64021,-0.463487 2.221451,-1.214372 l 3.912494,-4.755802 4.771716,3.916888 c 0.716424,0.608212 1.61093,0.85077 2.401515,0.731361 0.790587,-0.11941 1.456631,-0.547831 1.92591,-1.118552 0.469281,-0.570722 0.760373,-1.306081 0.724174,-2.10413 -0.03617,-0.797226 -0.447375,-1.627637 -1.182164,-2.211682 l -4.771716,-3.918843 3.92228,-4.767535 c 0.824793,-0.973667 0.901423,-2.285294 0.4208,-3.285251 -0.480369,-0.999426 -1.552836,-1.760267 -2.828191,-1.726715 z m 0.05871,2.115862 c 0.441661,-0.0119 0.709842,0.207096 0.863137,0.526032 0.153294,0.318937 0.156253,0.666226 -0.129178,1.003177 l -0.0039,0.0059 -5.282551,6.419942 6.427528,5.277923 0.0059,0.0059 c 0.319407,0.253428 0.378133,0.443996 0.38753,0.651184 0.0094,0.207189 -0.07766,0.459411 -0.246609,0.664874 -0.168944,0.205463 -0.40149,0.340546 -0.606741,0.371547 -0.205251,0.031 -0.403567,0.01161 -0.714387,-0.252261 l -0.0059,-0.0059 -6.427529,-5.277923 -5.286466,6.427762 -0.0098,0.01174 c -0.254307,0.32853 -0.443887,0.386565 -0.651757,0.396968 -0.207868,0.0104 -0.46504,-0.07733 -0.673284,-0.248349 -0.208246,-0.171018 -0.343803,-0.406304 -0.373831,-0.612075 -0.03003,-0.205772 -0.01109,-0.402837 0.262268,-0.715717 l 0.01174,-0.01173 5.28451,-6.427763 -6.425572,-5.275968 -0.0059,-0.0059 c -0.387864,-0.309545 -0.424572,-0.671215 -0.297498,-1.032509 0.127074,-0.361294 0.382382,-0.622779 0.878794,-0.621852 0.219407,3.81e-4 0.431323,0.07753 0.598911,0.219017 l 0.0059,0.0059 6.425572,5.275968 5.280594,-6.421896 0.0059,-0.0059 c 0.171426,-0.21469 0.427863,-0.340709 0.702644,-0.348081 z"
|
||||
id="path838-6" />
|
||||
<path
|
||||
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;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.11667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="m 79.754985,34.737693 c -0.89759,0.02408 -1.741729,0.444631 -2.301692,1.145929 l -3.920323,4.76949 -4.775636,-3.920799 c -0.548459,-0.463036 -1.243094,-0.718381 -1.961139,-0.719628 -1.386104,-0.0026 -2.488563,0.919819 -2.881036,2.035687 -0.392021,1.114595 -0.109168,2.52041 0.970784,3.384989 0.001,9.85e-4 7.22e-4,0.0029 0.002,0.0039 l 4.775636,3.920798 -3.912497,4.755802 c -0.624769,0.715116 -0.877699,1.615887 -0.761355,2.4131 0.116333,0.797214 0.548198,1.467459 1.123443,1.939867 0.575246,0.472406 1.318252,0.765792 2.123589,0.725494 0.805338,-0.0403 1.640207,-0.463512 2.221455,-1.214373 l 3.912487,-4.755801 4.771717,3.916888 c 0.716421,0.608268 1.610905,0.852716 2.401521,0.733317 0.790607,-0.119401 1.456612,-0.549771 1.925905,-1.120508 0.469294,-0.570738 0.762348,-1.306057 0.726132,-2.10413 -0.03618,-0.798073 -0.449803,-1.627555 -1.186075,-2.211682 l 0.01563,0.0098 -4.785415,-3.928621 3.922277,-4.767535 c 0.824798,-0.973673 0.901429,-2.285302 0.420812,-3.285258 -0.480627,-0.999956 -1.551952,-1.761125 -2.828196,-1.726715 z m 0.05672,2.115862 c 0.441665,-0.0119 0.709847,0.207096 0.863138,0.526032 0.153292,0.318936 0.156258,0.666226 -0.12918,1.003177 l -0.004,0.0059 -5.282557,6.419941 6.427526,5.277923 0.008,0.0059 c 0.319439,0.253432 0.376168,0.443995 0.385568,0.651186 0.009,0.207191 -0.07766,0.461356 -0.246607,0.666828 -0.168954,0.205474 -0.401491,0.338594 -0.606741,0.369592 -0.20525,0.031 -0.401601,0.01164 -0.712433,-0.252261 l -0.008,-0.0059 -6.427527,-5.277922 -5.286465,6.427763 -0.01002,0.01173 c -0.254303,0.328515 -0.44389,0.386567 -0.651756,0.396968 -0.207865,0.0104 -0.465044,-0.07538 -0.67328,-0.246394 -0.208247,-0.171014 -0.343801,-0.406304 -0.373834,-0.612075 -0.03006,-0.205771 -0.009,-0.404796 0.264224,-0.717672 l 0.01002,-0.01174 5.284501,-6.425807 -6.425572,-5.277923 -0.006,-0.0039 c -0.387863,-0.309546 -0.42457,-0.67317 -0.297494,-1.034465 0.127077,-0.361295 0.382381,-0.622778 0.878792,-0.621852 0.219409,3.81e-4 0.431323,0.07753 0.598914,0.219017 l 0.006,0.0059 6.427526,5.275967 5.280594,-6.419941 0.004,-0.0059 c 0.171429,-0.21469 0.427856,-0.342664 0.702642,-0.350036 z"
|
||||
id="path818-7" />
|
||||
<path
|
||||
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;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.11667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="m 44.542869,36.741933 a 1.98874,1.9869974 0 0 0 -1.501245,0.747119 l -4.60368,5.598219 -5.603128,-4.600682 a 1.98874,1.9869974 0 0 0 -1.280122,-0.469276 1.98874,1.9869974 0 0 0 -1.244912,3.539503 l 5.603131,4.600679 -4.603163,5.597185 a 1.98874,1.9869974 0 1 0 3.071363,2.522302 l 4.60368,-5.597183 5.603131,4.600162 a 1.98874,1.9869974 0 1 0 2.524514,-3.070223 l -5.602094,-4.600163 4.604199,-5.597702 a 1.98874,1.9869974 0 0 0 -1.571674,-3.26994 z"
|
||||
id="path838" />
|
||||
<path
|
||||
id="path818"
|
||||
d="m 79.782741,35.795838 a 1.98874,1.9869974 0 0 0 -1.501246,0.747119 l -4.603679,5.598219 -5.603129,-4.600682 a 1.98874,1.9869974 0 0 0 -1.280122,-0.469276 1.98874,1.9869974 0 0 0 -1.244912,3.539503 l 5.603131,4.600679 -4.603162,5.597185 a 1.98874,1.9869974 0 1 0 3.071363,2.522302 l 4.603679,-5.597183 5.603132,4.600162 a 1.98874,1.9869974 0 1 0 2.524514,-3.070223 l -5.602095,-4.600163 4.6042,-5.597702 a 1.98874,1.9869974 0 0 0 -1.571674,-3.26994 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;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.11667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||
</g>
|
||||
<g
|
||||
style="stroke-width:1.07952"
|
||||
transform="matrix(0.76118253,0,0,1.1273257,8.8498735,-8.7380624)"
|
||||
id="g894">
|
||||
<path
|
||||
d="m 37.070312,49.945312 c -8.558226,0.201358 -17.153144,1.349813 -25.322265,3.996094 a 0.18823691,0.18823691 0 0 0 -0.0039,0.002 c -4.7712395,1.701266 -9.1719911,4.978042 -11.42187538,9.628907 -0.77246473,1.307417 -0.72802398,3.171218 0.52539063,4.201172 0.001459,0.0012 0.002444,0.0027 0.003906,0.0039 1.4525547,1.379761 4.1489072,1.060714 5.0371094,-0.814453 l 0.00977,-0.01758 c 1.2682911,-2.07157 2.3356284,-4.376733 4.4472655,-5.603515 a 0.18823691,0.18823691 0 0 0 0.0078,-0.0039 c 3.011822,-1.94994 6.646019,-2.577944 10.130859,-3.425782 11.647545,-2.498614 23.651478,-1.453152 35.410156,-0.134765 l -0.0059,-0.002 c 2.422667,0.347972 4.888833,0.462352 7.183594,1.21289 2.314107,0.816912 4.403055,2.494114 5.308593,4.798828 a 0.18823691,0.18823691 0 0 0 0.01563,0.0293 c 1.146767,1.887352 4.092391,1.777418 5.332032,0.05273 l 0.002,-0.0039 c 0.550346,-0.710599 0.653671,-1.54935 0.517578,-2.353515 -0.135674,-0.801691 -0.501121,-1.578401 -0.896485,-2.228516 l -0.0039,-0.0078 C 70.844351,54.563883 65.632385,51.815342 60.457031,51.351562 h -0.0039 c -7.753696,-0.926531 -15.55951,-1.562527 -23.382813,-1.40625 z"
|
||||
inkscape:original="M 37.074219 50.132812 C 28.529876 50.333843 19.954148 51.481814 11.806641 54.121094 C 7.0681173 55.810694 2.705321 59.065149 0.484375 63.667969 C -0.247383 64.906489 -0.20125687 66.671809 0.97070312 67.630859 C 2.3290681 68.935069 4.9072096 68.632824 5.7285156 66.865234 C 6.9929136 64.803124 8.0701968 62.447207 10.251953 61.179688 C 13.306052 59.202377 16.963277 58.574246 20.439453 57.728516 C 32.125217 55.220526 44.152312 56.270894 55.916016 57.589844 C 58.326344 57.936044 60.803744 58.047474 63.130859 58.808594 C 65.489303 59.640024 67.625986 61.35011 68.556641 63.71875 C 69.62734 65.48091 72.424041 65.370546 73.580078 63.753906 C 74.61233 62.425536 73.964391 60.648444 73.185547 59.371094 C 70.719888 54.722804 65.560212 51.997183 60.435547 51.539062 C 52.685275 50.612842 44.886106 49.976763 37.074219 50.132812 z "
|
||||
inkscape:radius="0.18821809"
|
||||
sodipodi:type="inkscape:offset"
|
||||
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;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.28499;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
id="path888" />
|
||||
<path
|
||||
id="path868"
|
||||
d="m 14.35457,54.415688 c -5.2035763,1.42819 -10.5694103,4.46698 -13.1098233,10.15582 -1.10685497,2.45004 2.613059,4.06312 3.648269,1.58201 1.540261,-1.99479 2.00166,-5.76485 9.6529343,-8.02459 13.10434,-3.87024 24.789567,-3.63774 44.172303,-1.26632 3.70701,0.45355 7.624692,1.06369 10.39916,5.47571 0.503939,2.6192 4.439814,1.83587 3.900753,-0.77634 -1.84157,-5.12639 -6.770062,-8.2433 -12.095652,-8.89952 -18.771885,-2.31307 -32.506191,-2.1062 -46.567944,1.75323 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;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.28499;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
sodipodi:nodetypes="sccssccss" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 17 KiB |
22
boot/error/default.nix
Normal file
22
boot/error/default.nix
Normal file
@ -0,0 +1,22 @@
|
||||
{ runCommand
|
||||
, lib
|
||||
, mruby
|
||||
}:
|
||||
|
||||
# mkDerivation will append something like -aarch64-unknown-linux-gnu to the
|
||||
# derivation name with cross, which will break the mruby code loading.
|
||||
# Since we don't need anything from mkDerivation, really, let's use runCommand.
|
||||
runCommand "boot-error.mrb" {
|
||||
src = lib.cleanSource ./.;
|
||||
lib = lib.cleanSource ../recovery-menu/lib;
|
||||
|
||||
nativeBuildInputs = [
|
||||
mruby
|
||||
];
|
||||
} ''
|
||||
mrbc \
|
||||
-o $out \
|
||||
$(find $lib -type f -name '*.rb' | sort) \
|
||||
$(find $src/lib -type f -name '*.rb' | sort) \
|
||||
$src/main.rb
|
||||
''
|
39
boot/error/lib/shaded_text.rb
Normal file
39
boot/error/lib/shaded_text.rb
Normal file
@ -0,0 +1,39 @@
|
||||
# This only works as long as the elements are not in a layout.
|
||||
class ShadedText
|
||||
OFFSET = 2
|
||||
|
||||
def initialize(*args)
|
||||
@secondary = LVGL::LVLabel.new(*args)
|
||||
style = @secondary.get_style(LVGL::LABEL_STYLE::MAIN).dup
|
||||
@secondary.set_style(LVGL::LABEL_STYLE::MAIN, style)
|
||||
style.text_color = 0xFF000000
|
||||
|
||||
@main = LVGL::LVLabel.new(*args)
|
||||
style = @main.get_style(LVGL::LABEL_STYLE::MAIN).dup
|
||||
@main.set_style(LVGL::LABEL_STYLE::MAIN, style)
|
||||
style.text_color = 0xFFFFFFFF
|
||||
|
||||
# Ensures the position is reset at least once, to sync-up the shade.
|
||||
set_pos(0, 0)
|
||||
end
|
||||
|
||||
def method_missing(*args)
|
||||
@main.send(*(args.dup))
|
||||
@secondary.send(*(args.dup))
|
||||
end
|
||||
|
||||
def set_pos(x, y)
|
||||
@main.set_pos(x, y)
|
||||
@secondary.set_pos(x+OFFSET, y+OFFSET)
|
||||
end
|
||||
|
||||
def set_x(value)
|
||||
@main.set_x(value)
|
||||
@secondary.set_x(value+OFFSET)
|
||||
end
|
||||
|
||||
def set_y(value)
|
||||
@main.set_y(value)
|
||||
@secondary.set_y(value+OFFSET)
|
||||
end
|
||||
end
|
@ -1,55 +1,36 @@
|
||||
# Get exclusive control of the framebuffer
|
||||
# By design we will not restore the console at exit.
|
||||
# We are assuming the target does not necessarily have a console attached to
|
||||
# the framebuffer, so this program has to be enough by itself.
|
||||
VTConsole.map_console(0)
|
||||
begin
|
||||
|
||||
# Prepare LVGL
|
||||
LVGL::Hacks.init()
|
||||
data = JSON.parse(File.read(ARGV.first))
|
||||
|
||||
$color = ARGV.shift
|
||||
$code = ARGV.shift
|
||||
$message = ARGV.shift
|
||||
$exit = false
|
||||
$code = data["code"]
|
||||
$color = data["color"]
|
||||
$delay = data["delay"]
|
||||
$message = data["message"]
|
||||
$status = data["status"]
|
||||
$title = data["title"]
|
||||
|
||||
$color = $color.rjust(6, "0").rjust(8, "F").to_i(16)
|
||||
|
||||
# This only works as long as the elements are not in a layout.
|
||||
class ShadedText
|
||||
def initialize(*args)
|
||||
@secondary = LVGL::LVLabel.new(*args)
|
||||
style = @secondary.get_style(LVGL::LABEL_STYLE::MAIN).dup
|
||||
@secondary.set_style(LVGL::LABEL_STYLE::MAIN, style)
|
||||
style.text_color = 0xFF000000
|
||||
|
||||
@main = LVGL::LVLabel.new(*args)
|
||||
style = @main.get_style(LVGL::LABEL_STYLE::MAIN).dup
|
||||
@main.set_style(LVGL::LABEL_STYLE::MAIN, style)
|
||||
style.text_color = 0xFFFFFFFF
|
||||
|
||||
# Ensures the position is reset at least once.
|
||||
set_pos(0, 0)
|
||||
end
|
||||
|
||||
def method_missing(*args)
|
||||
@main.send(*(args.dup))
|
||||
@secondary.send(*(args.dup))
|
||||
end
|
||||
|
||||
def set_pos(x, y)
|
||||
@main.set_pos(x, y)
|
||||
@secondary.set_pos(x+2, y+2)
|
||||
end
|
||||
end
|
||||
|
||||
class UI
|
||||
# As this is not using BaseWindow, LVGUI::init isn't handled for us.
|
||||
LVGUI.init()
|
||||
|
||||
def initialize()
|
||||
screen
|
||||
sad_phone
|
||||
code
|
||||
message
|
||||
add_screen
|
||||
|
||||
# First add the title bar, other elements will sit under.
|
||||
add_title_bar
|
||||
# Then, action pane, so we can get its height
|
||||
add_actions_pane
|
||||
# Finally, messages pane, which takes the remainder.
|
||||
add_messages_pane
|
||||
|
||||
# Re-compute the layout
|
||||
relayout()
|
||||
end
|
||||
|
||||
def screen()
|
||||
def add_screen()
|
||||
@screen = LVGL::LVContainer.new()
|
||||
|
||||
# Create a new style
|
||||
@ -60,54 +41,317 @@ class UI
|
||||
style.body_grad_color = $color
|
||||
end
|
||||
|
||||
def sad_phone()
|
||||
file = nil
|
||||
file = "/sad-phone.svg" if File.exist?("/sad-phone.svg")
|
||||
return unless file
|
||||
def add_title_bar()
|
||||
@title_bar = LVGL::LVContainer.new(@screen)
|
||||
@title_bar.set_width(@screen.get_width())
|
||||
@title_bar.set_height(16*unit)
|
||||
@title_bar.set_pos(0, 0)
|
||||
|
||||
if @screen.get_height > @screen.get_width
|
||||
LVGL::Hacks::LVNanoSVG.resize_next_width(@screen.get_width)
|
||||
else
|
||||
LVGL::Hacks::LVNanoSVG.resize_next_height(@screen.get_height)
|
||||
@title_bar.get_style(LVGL::CONT_STYLE::MAIN).dup.tap do |style|
|
||||
@title_bar.set_style(LVGL::CONT_STYLE::MAIN, style)
|
||||
style.body_main_color = 0x00000000
|
||||
style.body_grad_color = 0x00000000
|
||||
style.body_border_width = 0
|
||||
style.body_radius = 0
|
||||
style.body_opa = (255 * 0.30).to_i
|
||||
end
|
||||
|
||||
add_sad_phone
|
||||
add_title
|
||||
end
|
||||
|
||||
def add_actions_pane()
|
||||
@actions_pane = LVGL::LVContainer.new(@screen)
|
||||
@actions_pane.set_width(get_pane_width())
|
||||
|
||||
# When horizontal, we know it's placed to the right, full height.
|
||||
if horizontal?
|
||||
@actions_pane.set_height(@screen.get_height() - @title_bar.get_height())
|
||||
@actions_pane.set_pos(get_pane_width(), @title_bar.get_height())
|
||||
end
|
||||
|
||||
@actions_pane.get_style(LVGL::CONT_STYLE::MAIN).dup.tap do |style|
|
||||
@actions_pane.set_style(LVGL::CONT_STYLE::MAIN, style)
|
||||
style.body_main_color = 0x00000000
|
||||
style.body_grad_color = 0x00000000
|
||||
style.body_border_width = 0
|
||||
style.body_radius = 0
|
||||
style.body_opa = (255 * 0.20).to_i
|
||||
end
|
||||
|
||||
add_time_left
|
||||
end
|
||||
|
||||
def add_messages_pane()
|
||||
@messages_pane = LVGL::LVContainer.new(@screen)
|
||||
@messages_pane.set_width(get_pane_width())
|
||||
@messages_pane.set_pos(0, @title_bar.get_height())
|
||||
|
||||
# When horizontal, full height
|
||||
if horizontal?
|
||||
@messages_pane.set_height(@screen.get_height() - @title_bar.get_height())
|
||||
end
|
||||
|
||||
@messages_pane.get_style(LVGL::CONT_STYLE::MAIN).dup.tap do |style|
|
||||
@messages_pane.set_style(LVGL::CONT_STYLE::MAIN, style)
|
||||
style.body_main_color = 0x00000000
|
||||
style.body_grad_color = 0x00000000
|
||||
style.body_border_width = 0
|
||||
style.body_radius = 0
|
||||
style.body_opa = (255 * 0).to_i
|
||||
end
|
||||
|
||||
add_message_title
|
||||
add_message
|
||||
end
|
||||
|
||||
# Title elements
|
||||
|
||||
def add_sad_phone()
|
||||
file = nil
|
||||
file = "/sad.svg" if File.exist?("/sad.svg")
|
||||
file = "sad.svg" if File.exist?("sad.svg")
|
||||
return unless file
|
||||
|
||||
LVGL::Hacks::LVNanoSVG.resize_next_height(@title_bar.get_height - 2 * padding)
|
||||
@sad_phone = LVGL::LVImage.new(@screen)
|
||||
@sad_phone.set_src(file)
|
||||
@sad_phone.set_pos(2 * padding, padding)
|
||||
end
|
||||
|
||||
# Center the image
|
||||
@sad_phone.set_pos(
|
||||
@screen.get_width / 2 - @sad_phone.get_width / 2,
|
||||
@screen.get_height / 2 - @sad_phone.get_height / 2,
|
||||
def add_title()
|
||||
@title = new_text($code, parent: @title_bar)
|
||||
@title.set_align(LVGL::LABEL_ALIGN::LEFT)
|
||||
@title.set_x(@sad_phone.get_x()*2 + @sad_phone.get_width())
|
||||
@title.set_y(@title_bar.get_height / 2 - @title.get_height / 2)
|
||||
@title.set_width(@title_bar.get_width() - @title.get_x())
|
||||
end
|
||||
|
||||
# Messages pane elements
|
||||
|
||||
def add_message_title()
|
||||
@message_title = new_text($title, parent: @messages_pane)
|
||||
@message_title.set_align(LVGL::LABEL_ALIGN::LEFT)
|
||||
@message_title.set_pos(
|
||||
padding,
|
||||
padding,
|
||||
)
|
||||
end
|
||||
|
||||
def code()
|
||||
@code = ShadedText.new(@screen)
|
||||
@code.set_long_mode(LVGL::LABEL_LONG::BREAK)
|
||||
@code.set_align(LVGL::LABEL_ALIGN::CENTER)
|
||||
@code.set_width((@screen.get_width * 0.8).to_i)
|
||||
@code.set_text($code)
|
||||
@code.set_pos(
|
||||
@screen.get_width / 2 - @code.get_width / 2,
|
||||
(@screen.get_height * 0.05).to_i
|
||||
)
|
||||
end
|
||||
|
||||
def message()
|
||||
@message = ShadedText.new(@screen)
|
||||
@message.set_long_mode(LVGL::LABEL_LONG::BREAK)
|
||||
@message.set_align(LVGL::LABEL_ALIGN::CENTER)
|
||||
@message.set_width((@screen.get_width * 0.95).to_i)
|
||||
@message.set_text($message)
|
||||
def add_message()
|
||||
@message = new_text($message, parent: @messages_pane)
|
||||
@message.set_align(LVGL::LABEL_ALIGN::LEFT)
|
||||
@message.set_pos(
|
||||
@screen.get_width / 2 - @message.get_width / 2,
|
||||
(@screen.get_height * 0.65).to_i
|
||||
padding,
|
||||
@message_title.get_height() + @message_title.get_y() + padding
|
||||
)
|
||||
end
|
||||
|
||||
# Actions pane elements
|
||||
|
||||
def add_time_left()
|
||||
@time_left = new_text("", parent: @actions_pane)
|
||||
set_time_left($delay)
|
||||
@time_left.set_x(@actions_pane.get_width / 2 - @time_left.get_width / 2)
|
||||
@time_left.set_y(padding)
|
||||
end
|
||||
|
||||
def set_actions(actions)
|
||||
@action_buttons ||= []
|
||||
@action_buttons.each do |el|
|
||||
el.del()
|
||||
end
|
||||
|
||||
y_position = @time_left.get_y() + @time_left.get_height() + padding()
|
||||
|
||||
@action_buttons = actions.map do |action_pair|
|
||||
label, action = action_pair
|
||||
|
||||
LVGUI::Button.new(@actions_pane).tap do |btn|
|
||||
LVGUI.focus_group.add_obj(btn)
|
||||
btn.glue_obj(true)
|
||||
btn.set_label(label)
|
||||
btn.set_y(y_position)
|
||||
btn.event_handler = ->(event) do
|
||||
case event
|
||||
when LVGL::EVENT::CLICKED
|
||||
action.call()
|
||||
end
|
||||
end
|
||||
|
||||
# For the next item
|
||||
y_position = btn.get_y() + btn.get_height() + padding()
|
||||
end
|
||||
end
|
||||
|
||||
relayout()
|
||||
end
|
||||
|
||||
# Layout helpers
|
||||
|
||||
def relayout()
|
||||
unless horizontal?
|
||||
@messages_pane.set_height(
|
||||
@screen.get_height() - @title_bar.get_height() - @actions_pane.get_height()
|
||||
)
|
||||
|
||||
# The actions pane has to be as high as required in vertical mode.
|
||||
last_element = @actions_pane.get_children.reduce do |a, b|
|
||||
if b
|
||||
a_end = a.get_y() + a.get_height()
|
||||
b_end = b.get_y() + b.get_height()
|
||||
if a_end > b_end
|
||||
a
|
||||
else
|
||||
b
|
||||
end
|
||||
else
|
||||
a
|
||||
end
|
||||
end
|
||||
|
||||
@actions_pane.set_height(
|
||||
last_element.get_y() + last_element.get_height() + padding
|
||||
)
|
||||
|
||||
# Always push it as far down as possible!
|
||||
@actions_pane.set_pos(0, @screen.get_height() - @actions_pane.get_height())
|
||||
end
|
||||
end
|
||||
|
||||
# Misc. helpers
|
||||
|
||||
# Creates a label with some useful defaults.
|
||||
def new_text(text, parent: nil)
|
||||
parent ||= @screen
|
||||
|
||||
el = ShadedText.new(parent)
|
||||
el.set_long_mode(LVGL::LABEL_LONG::BREAK)
|
||||
el.set_align(LVGL::LABEL_ALIGN::CENTER)
|
||||
el.set_width((parent.get_width - 2*padding).to_i)
|
||||
el.set_text(text)
|
||||
el
|
||||
end
|
||||
|
||||
# Updates the UI with the time left.
|
||||
def set_time_left(value)
|
||||
if value
|
||||
@time_left.set_text("#{value} seconds left before crashing.")
|
||||
else
|
||||
@time_left.set_text("Select an option:")
|
||||
end
|
||||
end
|
||||
|
||||
def hide_actions()
|
||||
@actions_pane.set_opa_scale_enable(true)
|
||||
@actions_pane.set_opa_scale(0)
|
||||
end
|
||||
|
||||
def get_pane_width()
|
||||
if horizontal?
|
||||
@screen.get_width() / 2
|
||||
else
|
||||
@screen.get_width()
|
||||
end
|
||||
end
|
||||
|
||||
def unit()
|
||||
(if horizontal?
|
||||
@screen.get_height()
|
||||
else
|
||||
@screen.get_width()
|
||||
end) / 128
|
||||
end
|
||||
|
||||
def padding()
|
||||
2 * unit
|
||||
end
|
||||
|
||||
def horizontal?()
|
||||
@screen.get_height < @screen.get_width
|
||||
end
|
||||
end
|
||||
|
||||
# Create the UI
|
||||
ui = UI.new
|
||||
$ui = UI.new
|
||||
|
||||
# Run tasks once to "realize" the UI.
|
||||
LVGL::Hacks::LVTask.handle_tasks
|
||||
|
||||
def run(*cmd)
|
||||
$stderr.puts " $ " + cmd.join(" ")
|
||||
system(*cmd) unless LVGL::Introspection.simulator?
|
||||
end
|
||||
|
||||
def cleanup_and_exit()
|
||||
$ui.hide_actions()
|
||||
|
||||
# Ensure the next scheduled handle_tasks will run
|
||||
LVGL::Hacks::LVTask.handle_tasks
|
||||
sleep(0.1)
|
||||
|
||||
# Refresh the UI one last time.
|
||||
LVGL::Hacks::LVTask.handle_tasks
|
||||
|
||||
puts "Exiting error applet!"
|
||||
puts "exit(#{$status})"
|
||||
|
||||
# Ensures console is flushed entirely.
|
||||
$stdout.flush()
|
||||
$stderr.flush()
|
||||
|
||||
# Ensures all kernel work is done before it kernel panics at exit.
|
||||
sleep(0.1)
|
||||
|
||||
# Exit, which will crash the kernel.
|
||||
exit $status
|
||||
end
|
||||
|
||||
$ui.set_actions([[
|
||||
"Cancel time-out", ->() do
|
||||
$delay = nil
|
||||
$ui.set_time_left(nil)
|
||||
|
||||
$ui.set_actions([
|
||||
["Power off", ->() { run("poweroff") }],
|
||||
["Kernel panic", ->() { $exit = true }],
|
||||
*(RebootModes.options),
|
||||
])
|
||||
end
|
||||
]])
|
||||
|
||||
start = Time.now
|
||||
LVGUI.main_loop do
|
||||
if $delay
|
||||
elapsed = Time.now - start
|
||||
left = $delay - elapsed
|
||||
$ui.set_time_left(left.floor)
|
||||
|
||||
if elapsed >= $delay
|
||||
$exit = true
|
||||
end
|
||||
end
|
||||
|
||||
# We're using `$exit` as a flag to ensure we exit after all event handlers
|
||||
# have been completed.
|
||||
# This is because we will not be able to force a render of the UI during
|
||||
# an event handler.
|
||||
cleanup_and_exit() if $exit
|
||||
end
|
||||
|
||||
# Handles outputing the error and, more importantly, flushing the output.
|
||||
# When simply existing, the system might not flush the output due to the
|
||||
# kernel panic.
|
||||
rescue => e
|
||||
$stderr.puts("")
|
||||
$stderr.puts("Unexpected error in error handler:")
|
||||
$stderr.puts("")
|
||||
$stderr.puts(e.inspect)
|
||||
$stderr.puts("")
|
||||
|
||||
$stdout.flush()
|
||||
$stderr.flush()
|
||||
|
||||
sleep(1)
|
||||
exit 128
|
||||
end
|
||||
|
@ -39,26 +39,15 @@ Tasks::Modules.new(*Configuration["kernel"]["modules"])
|
||||
Tasks::go()
|
||||
|
||||
$logger.fatal("Tasks all ran, but we're still here...")
|
||||
System.failure("did_not_switch", color: "ff0000")
|
||||
System.failure(
|
||||
"INIT_FAILED_SWITCH",
|
||||
"Boot process failed to switch to stage-2",
|
||||
"The stage-1 init did not detect any failure condition, but failed to switch to stage-2.\n\n" +
|
||||
"It shouldn't happen, yet here we are.",
|
||||
color: "ff0000"
|
||||
)
|
||||
|
||||
rescue => e
|
||||
System.sad_phone("765300", "Uncaught Exception", e.inspect)
|
||||
3.times do
|
||||
$logger.fatal("********************")
|
||||
end
|
||||
$logger.fatal("Handling exception")
|
||||
$logger.fatal(e.inspect)
|
||||
$logger.fatal("`init` will exit and the kernel will crash.")
|
||||
$logger.fatal("********************")
|
||||
# Leave some time for the $logger.fatals to flush before the kernel crashes.
|
||||
sleep(1)
|
||||
System.shell if System.respond_to?(:shell)
|
||||
|
||||
# Users with access to serial debug may prefer crashing to the bootloader.
|
||||
# Though, crashing the kernel is *required* for console ramoops to be present.
|
||||
if Configuration["boot"]["crashToBootloader"] then
|
||||
System.run("reboot bootloader")
|
||||
else
|
||||
exit 99
|
||||
end
|
||||
# Then fail
|
||||
System.failure("INIT_EXCEPTION", "Uncaught Exception", e.inspect, color: "765300", status: 99)
|
||||
end
|
||||
|
@ -169,22 +169,64 @@ module System
|
||||
end
|
||||
end
|
||||
|
||||
def self.sad_phone(color, code, message)
|
||||
begin
|
||||
System.run(LOADER, "/applets/boot-error.mrb", color, code, message)
|
||||
rescue CommandError => e
|
||||
$logger.fatal(e.inspect)
|
||||
def self.failure(code, title, message="(No details given)", color: "000000", delay: Configuration["boot"]["fail"]["delay"], status: 111)
|
||||
Progress.kill()
|
||||
|
||||
# First print the error we're handling.
|
||||
# The added asterisks seve to aid in finding it visually.
|
||||
5.times do
|
||||
$logger.fatal("********************************************")
|
||||
end
|
||||
$logger.fatal("")
|
||||
$logger.fatal("********************************************")
|
||||
$logger.fatal("* Fatal error in Mobile NixOS stage-1 init *")
|
||||
$logger.fatal("********************************************")
|
||||
$logger.fatal("")
|
||||
$logger.fatal("#{code}: #{title}")
|
||||
$logger.fatal("")
|
||||
$logger.fatal(message)
|
||||
$logger.fatal("")
|
||||
5.times do
|
||||
$logger.fatal("********************************************")
|
||||
end
|
||||
|
||||
_flush_outputs()
|
||||
|
||||
File.write("/.error.json", {
|
||||
code: code,
|
||||
title: title,
|
||||
color: color,
|
||||
delay: delay,
|
||||
message: message,
|
||||
status: status,
|
||||
}.to_json)
|
||||
|
||||
# Show the error handler applet.
|
||||
begin
|
||||
System.exec(LOADER, "/applets/boot-error.mrb", "/.error.json")
|
||||
rescue => e
|
||||
$logger.fatal("********************************************")
|
||||
$logger.fatal("* Error handler failed to start *")
|
||||
$logger.fatal("********************************************")
|
||||
$logger.fatal(e.inspect)
|
||||
$logger.fatal("********************************************")
|
||||
end
|
||||
|
||||
# If we're here, things are broken beyond belief!
|
||||
_flush_outputs()
|
||||
|
||||
# Drop down to a shell if possible.
|
||||
shell if respond_to?(:shell)
|
||||
|
||||
# As in "command not found".
|
||||
exit 127
|
||||
end
|
||||
|
||||
def self.failure(code, message="(No details given)", color: "000000", delay: Configuration["boot"]["fail"]["delay"])
|
||||
Progress.kill()
|
||||
$logger.fatal("#{code}: #{message}")
|
||||
sad_phone(color, code, message)
|
||||
shell if respond_to?(:shell)
|
||||
sleep(delay)
|
||||
hard_reboot if Configuration["boot"]["fail"]["reboot"]
|
||||
exit 111
|
||||
# Flushes the outputs.
|
||||
def self._flush_outputs()
|
||||
# Flush both output
|
||||
$stdout.flush
|
||||
$stderr.flush
|
||||
end
|
||||
|
||||
def self.hard_reboot()
|
||||
|
@ -92,7 +92,7 @@ module Tasks
|
||||
"\n"
|
||||
|
||||
# Fail with a black backdrop, and force the message to stay up 60s
|
||||
System.failure("hung_tasks", msg, color: "000000", delay: 60)
|
||||
System.failure("TASKS_HANG_TIMEOUT", "Hung Tasks", msg, color: "000000", delay: 60)
|
||||
end
|
||||
|
||||
# Don't burn the CPU if we're waiting on something...
|
||||
|
@ -77,7 +77,7 @@ class Tasks::SwitchRoot < SingletonTask
|
||||
return path if path
|
||||
end
|
||||
|
||||
System.failure("init_not_found", "Could not find init path for stage-2", color: "FF00FF")
|
||||
System.failure("INIT_NOT_FOUND", "Stage-2 init not found", "Could not find init path for stage-2", color: "FF00FF")
|
||||
end
|
||||
|
||||
# May pause the boot to allow the user to select a generation.
|
||||
|
16
boot/recovery-menu/lib/reboot_modes.rb
Normal file
16
boot/recovery-menu/lib/reboot_modes.rb
Normal file
@ -0,0 +1,16 @@
|
||||
module RebootModes
|
||||
Android = {
|
||||
"recovery" => ["Reboot to recovery", ->() { run("reboot recovery") }],
|
||||
"bootloader" => ["Reboot to bootloader", ->() { run("reboot bootloader") }],
|
||||
}
|
||||
|
||||
def self.options()
|
||||
[
|
||||
["Reboot to system", ->() { run("reboot") }],
|
||||
] +
|
||||
Configuration["HAL"]["boot"]["rebootModes"].map do |identifier|
|
||||
const, key = identifier.split(".", 2)
|
||||
const_get(const)[key]
|
||||
end
|
||||
end
|
||||
end
|
@ -7,23 +7,6 @@ def run(*cmd)
|
||||
system(*cmd) unless LVGL::Introspection.simulator?
|
||||
end
|
||||
|
||||
module RebootModes
|
||||
Android = {
|
||||
"recovery" => ["Reboot to recovery", ->() { run("reboot recovery") }],
|
||||
"bootloader" => ["Reboot to bootloader", ->() { run("reboot bootloader") }],
|
||||
}
|
||||
|
||||
def self.options()
|
||||
[
|
||||
["Reboot to system", ->() { run("reboot") }],
|
||||
] +
|
||||
Configuration["HAL"]["boot"]["rebootModes"].map do |identifier|
|
||||
const, key = identifier.split(".", 2)
|
||||
const_get(const)[key]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
module BootGUI
|
||||
class MainWindow < LVGUI::BaseWindow
|
||||
include LVGUI::ButtonPalette
|
||||
|
@ -5818,7 +5818,7 @@ CONFIG_KASAN_STACK=1
|
||||
#
|
||||
# CONFIG_PANIC_ON_OOPS is not set
|
||||
CONFIG_PANIC_ON_OOPS_VALUE=0
|
||||
CONFIG_PANIC_TIMEOUT=0
|
||||
CONFIG_PANIC_TIMEOUT=1
|
||||
# CONFIG_SOFTLOCKUP_DETECTOR is not set
|
||||
# CONFIG_DETECT_HUNG_TASK is not set
|
||||
# CONFIG_WQ_WATCHDOG is not set
|
||||
|
@ -120,7 +120,7 @@ CONFIG_RD_LZMA=y
|
||||
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
|
||||
CONFIG_SYSCTL=y
|
||||
CONFIG_ANON_INODES=y
|
||||
CONFIG_PANIC_TIMEOUT=5
|
||||
CONFIG_PANIC_TIMEOUT=1
|
||||
CONFIG_EXPERT=y
|
||||
CONFIG_UID16=y
|
||||
# CONFIG_SYSCTL_SYSCALL is not set
|
||||
|
@ -138,7 +138,7 @@ CONFIG_ANON_INODES=y
|
||||
CONFIG_HAVE_UID16=y
|
||||
CONFIG_SYSCTL_EXCEPTION_TRACE=y
|
||||
CONFIG_HOTPLUG=y
|
||||
CONFIG_PANIC_TIMEOUT=5
|
||||
CONFIG_PANIC_TIMEOUT=1
|
||||
CONFIG_EXPERT=y
|
||||
CONFIG_UID16=y
|
||||
# CONFIG_SYSCTL_SYSCALL is not set
|
||||
|
@ -4386,7 +4386,7 @@ CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120
|
||||
CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0
|
||||
# CONFIG_PANIC_ON_OOPS is not set
|
||||
CONFIG_PANIC_ON_OOPS_VALUE=0
|
||||
CONFIG_PANIC_TIMEOUT=5
|
||||
CONFIG_PANIC_TIMEOUT=1
|
||||
CONFIG_PANIC_ON_RECURSIVE_FAULT=y
|
||||
CONFIG_SCHED_DEBUG=y
|
||||
# CONFIG_PANIC_ON_RT_THROTTLING is not set
|
||||
|
@ -4759,7 +4759,7 @@ CONFIG_HAVE_ARCH_KASAN=y
|
||||
# CONFIG_DETECT_HUNG_TASK is not set
|
||||
# CONFIG_PANIC_ON_OOPS is not set
|
||||
CONFIG_PANIC_ON_OOPS_VALUE=0
|
||||
CONFIG_PANIC_TIMEOUT=5
|
||||
CONFIG_PANIC_TIMEOUT=1
|
||||
CONFIG_PANIC_ON_RECURSIVE_FAULT=y
|
||||
# CONFIG_SCHED_DEBUG is not set
|
||||
# CONFIG_PANIC_ON_SCHED_BUG is not set
|
||||
|
@ -4492,7 +4492,7 @@ CONFIG_HAVE_DEBUG_KMEMLEAK=y
|
||||
# CONFIG_DETECT_HUNG_TASK is not set
|
||||
# CONFIG_PANIC_ON_OOPS is not set
|
||||
CONFIG_PANIC_ON_OOPS_VALUE=0
|
||||
CONFIG_PANIC_TIMEOUT=5
|
||||
CONFIG_PANIC_TIMEOUT=1
|
||||
CONFIG_PANIC_ON_RECURSIVE_FAULT=y
|
||||
# CONFIG_SCHED_DEBUG is not set
|
||||
# CONFIG_PANIC_ON_SCHED_BUG is not set
|
||||
|
@ -4207,7 +4207,7 @@ CONFIG_HAVE_ARCH_KASAN=y
|
||||
# CONFIG_DETECT_HUNG_TASK is not set
|
||||
# CONFIG_PANIC_ON_OOPS is not set
|
||||
CONFIG_PANIC_ON_OOPS_VALUE=0
|
||||
CONFIG_PANIC_TIMEOUT=5
|
||||
CONFIG_PANIC_TIMEOUT=1
|
||||
CONFIG_PANIC_ON_RECURSIVE_FAULT=y
|
||||
# CONFIG_SCHED_DEBUG is not set
|
||||
# CONFIG_PANIC_ON_SCHED_BUG is not set
|
||||
|
@ -7045,7 +7045,7 @@ CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y
|
||||
#
|
||||
# CONFIG_PANIC_ON_OOPS is not set
|
||||
CONFIG_PANIC_ON_OOPS_VALUE=0
|
||||
CONFIG_PANIC_TIMEOUT=0
|
||||
CONFIG_PANIC_TIMEOUT=1
|
||||
# CONFIG_SOFTLOCKUP_DETECTOR is not set
|
||||
# CONFIG_DETECT_HUNG_TASK is not set
|
||||
# CONFIG_WQ_WATCHDOG is not set
|
||||
|
@ -5055,7 +5055,7 @@ CONFIG_ARCH_HAS_KCOV=y
|
||||
# CONFIG_WQ_WATCHDOG is not set
|
||||
# CONFIG_PANIC_ON_OOPS is not set
|
||||
CONFIG_PANIC_ON_OOPS_VALUE=0
|
||||
CONFIG_PANIC_TIMEOUT=5
|
||||
CONFIG_PANIC_TIMEOUT=1
|
||||
CONFIG_SCHED_DEBUG=y
|
||||
CONFIG_SCHED_INFO=y
|
||||
# CONFIG_PANIC_ON_SCHED_BUG is not set
|
||||
|
@ -4965,7 +4965,7 @@ CONFIG_HAVE_ARCH_KASAN=y
|
||||
# CONFIG_WQ_WATCHDOG is not set
|
||||
# CONFIG_PANIC_ON_OOPS is not set
|
||||
CONFIG_PANIC_ON_OOPS_VALUE=0
|
||||
CONFIG_PANIC_TIMEOUT=5
|
||||
CONFIG_PANIC_TIMEOUT=1
|
||||
CONFIG_SCHED_DEBUG=y
|
||||
CONFIG_SCHED_INFO=y
|
||||
# CONFIG_PANIC_ON_SCHED_BUG is not set
|
||||
|
@ -4905,7 +4905,7 @@ CONFIG_HAVE_ARCH_KASAN=y
|
||||
# CONFIG_WQ_WATCHDOG is not set
|
||||
# CONFIG_PANIC_ON_OOPS is not set
|
||||
CONFIG_PANIC_ON_OOPS_VALUE=0
|
||||
CONFIG_PANIC_TIMEOUT=5
|
||||
CONFIG_PANIC_TIMEOUT=1
|
||||
CONFIG_SCHED_DEBUG=y
|
||||
CONFIG_SCHED_INFO=y
|
||||
# CONFIG_PANIC_ON_SCHED_BUG is not set
|
||||
|
@ -4178,7 +4178,7 @@ CONFIG_HAVE_ARCH_KASAN=y
|
||||
# CONFIG_DETECT_HUNG_TASK is not set
|
||||
# CONFIG_PANIC_ON_OOPS is not set
|
||||
CONFIG_PANIC_ON_OOPS_VALUE=0
|
||||
CONFIG_PANIC_TIMEOUT=5
|
||||
CONFIG_PANIC_TIMEOUT=1
|
||||
CONFIG_PANIC_ON_RECURSIVE_FAULT=y
|
||||
# CONFIG_SCHED_DEBUG is not set
|
||||
# CONFIG_PANIC_ON_SCHED_BUG is not set
|
||||
|
38
examples/testing/crash-before-switch-root/README.md
Normal file
38
examples/testing/crash-before-switch-root/README.md
Normal file
@ -0,0 +1,38 @@
|
||||
`crash-before-switch-root`
|
||||
==========================
|
||||
|
||||
What does this test?
|
||||
--------------------
|
||||
|
||||
A simple known method to crash the system at boot.
|
||||
|
||||
This can be used to check changes to the errors handling.
|
||||
|
||||
|
||||
Why is this scary?
|
||||
------------------
|
||||
|
||||
Not scary at all. Only pretty useless in daily use!
|
||||
|
||||
|
||||
How is success defined?
|
||||
-----------------------
|
||||
|
||||
The boot process should proceed normally (splash, etc), but be
|
||||
interrupted before switch root.
|
||||
|
||||
The crashing happens *after* mounting /mnt, but *before* switching root.
|
||||
|
||||
|
||||
Running
|
||||
-------
|
||||
|
||||
Assuming you are `cd`'d into the root of a Mobile NixOS checkout:
|
||||
|
||||
```
|
||||
nix-build ./examples/testing/crash-before-switch-root && ./result
|
||||
```
|
||||
|
||||
This will build for qemu-x86_64 by default.
|
||||
|
||||
As always, be mindful of your `NIX_PATH`.
|
@ -0,0 +1,9 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
{
|
||||
mobile.boot.stage-1.tasks = [ ./crash.rb ];
|
||||
|
||||
mobile.boot.stage-1.bootConfig = {
|
||||
log.level = lib.mkForce "INFO";
|
||||
};
|
||||
}
|
12
examples/testing/crash-before-switch-root/crash.rb
Normal file
12
examples/testing/crash-before-switch-root/crash.rb
Normal file
@ -0,0 +1,12 @@
|
||||
class Tasks::Crash < SingletonTask
|
||||
def initialize()
|
||||
# Runs before SwitchRoot
|
||||
Targets[:SwitchRoot].add_dependency(:Task, self)
|
||||
# And after /mnt is available
|
||||
add_dependency(:Mount, "/mnt")
|
||||
end
|
||||
|
||||
def run()
|
||||
raise "This is an exception from init!"
|
||||
end
|
||||
end
|
11
examples/testing/crash-before-switch-root/default.nix
Normal file
11
examples/testing/crash-before-switch-root/default.nix
Normal file
@ -0,0 +1,11 @@
|
||||
{ device ? "qemu-x86_64" }:
|
||||
let
|
||||
system-build = import ../../../. {
|
||||
inherit device;
|
||||
configuration = [ { imports = [
|
||||
../../hello/configuration.nix
|
||||
./configuration.nix
|
||||
]; } ];
|
||||
};
|
||||
in
|
||||
system-build.build.default
|
@ -4,9 +4,6 @@ let
|
||||
key-held = pkgs.runCommand "key-held.mrb" {} ''
|
||||
${pkgs.buildPackages.mruby}/bin/mrbc -o $out ${../boot/applets}/key-held.rb
|
||||
'';
|
||||
boot-error = pkgs.runCommand "boot-error.mrb" {} ''
|
||||
${pkgs.buildPackages.mruby}/bin/mrbc -o $out ${../boot/recovery-menu}/lib/*.rb ${../boot/error}/main.rb
|
||||
'';
|
||||
in
|
||||
{
|
||||
mobile.boot.stage-1.contents = with pkgs; [
|
||||
@ -15,7 +12,7 @@ in
|
||||
symlink = "/etc/logo.svg";
|
||||
}
|
||||
{
|
||||
object = boot-error;
|
||||
object = pkgs.mobile-nixos.stage-1.boot-error;
|
||||
symlink = "/applets/boot-error.mrb";
|
||||
}
|
||||
{
|
||||
|
@ -28,8 +28,8 @@ in
|
||||
config = {
|
||||
mobile.boot.stage-1.contents = [
|
||||
{
|
||||
object = (builtins.path { path = ../artwork/sad-phone.svg; });
|
||||
symlink = "/sad-phone.svg";
|
||||
object = (builtins.path { path = ../artwork/sad.svg; });
|
||||
symlink = "/sad.svg";
|
||||
}
|
||||
];
|
||||
};
|
||||
|
@ -18,8 +18,8 @@ mrbgems.mkGem {
|
||||
src = fetchFromGitHub {
|
||||
repo = "mruby-lvgui";
|
||||
owner = "mobile-nixos";
|
||||
rev = "f1bb1dd9b2c5aa3d3df4fcc41ca706f426d182a8";
|
||||
sha256 = "0ybjkzg743d21rn3q0vi0fa9zwp3ym9zw2q5ym24wc7gxdspjcjs";
|
||||
rev = "07f6cce17a9819ec9c6da2adea012e3033cfd7b6";
|
||||
sha256 = "0c47vv2slwh2n3996aw219likicpsmlk47ayx8xcl49kpmq674ns";
|
||||
};
|
||||
|
||||
gemBuildInputs = [
|
||||
|
@ -101,6 +101,7 @@ in
|
||||
stage-1 = {
|
||||
script-loader = callPackage ../boot/script-loader {};
|
||||
boot-recovery-menu = callPackage ../boot/recovery-menu {};
|
||||
boot-error = callPackage ../boot/error {};
|
||||
boot-splash = callPackage ../boot/splash {};
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user