Import upstream version 3.38.1+git20201121.02db952
Kali Janitor
3 years ago
0 | ABOUT-NLS | |
1 | Makefile | |
2 | Makefile.in | |
3 | Makefile.in.in | |
4 | aclocal.m4 | |
5 | autom4te.cache/ | |
6 | config/ | |
7 | configure | |
8 | config.log | |
9 | config.status | |
10 | data/*.json | |
11 | m4/ | |
12 | po/*.header | |
13 | po/*.sed | |
14 | po/*.sin | |
15 | po/Makevars.template | |
16 | po/POTFILES | |
17 | po/Rules-quot | |
18 | po/gnome-shell-extensions.pot | |
19 | po/stamp-it | |
20 | staging/ | |
21 | zip-files/ | |
22 | ||
23 | *~ | |
24 | *.gmo | |
25 | metadata.json | |
26 | *.desktop | |
27 | *.gschema.valid | |
28 | *.session |
0 | #!/usr/bin/env bash | |
1 | ||
2 | if [ -z "$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" ]; then | |
3 | echo This is not a merge request, skipping | |
4 | exit 0 | |
5 | fi | |
6 | ||
7 | git fetch $CI_MERGE_REQUEST_PROJECT_URL.git $CI_MERGE_REQUEST_TARGET_BRANCH_NAME | |
8 | ||
9 | branch_point=$(git merge-base HEAD FETCH_HEAD) | |
10 | ||
11 | commits=$(git log --format='format:%H' $branch_point..$CI_COMMIT_SHA) | |
12 | ||
13 | if [ -z "$commits" ]; then | |
14 | echo Commit range empty | |
15 | exit 1 | |
16 | fi | |
17 | ||
18 | JUNIT_REPORT_TESTS_FILE=$(mktemp) | |
19 | ||
20 | function append_failed_test_case() { | |
21 | test_name="$1" | |
22 | commit="$2" | |
23 | test_message="$3" | |
24 | commit_short=${commit:0:8} | |
25 | ||
26 | echo "<testcase name=\"$test_name: $commit_short\"><failure message=\"$commit_short: $test_message\"/></testcase>" >> $JUNIT_REPORT_TESTS_FILE | |
27 | echo &>2 "Commit check failed: $commit_short: $test_message" | |
28 | } | |
29 | ||
30 | function append_passed_test_case() { | |
31 | test_name="$1" | |
32 | commit="$2" | |
33 | commit_short=${commit:0:8} | |
34 | echo "<testcase name=\"$test_name: $commit_short\"></testcase>" >> $JUNIT_REPORT_TESTS_FILE | |
35 | } | |
36 | ||
37 | function generate_junit_report() { | |
38 | junit_report_file="$1" | |
39 | num_tests=$(cat "$JUNIT_REPORT_TESTS_FILE" | wc -l) | |
40 | num_failures=$(grep '<failure />' "$JUNIT_REPORT_TESTS_FILE" | wc -l ) | |
41 | ||
42 | echo Generating JUnit report \"$(pwd)/$junit_report_file\" with $num_tests tests and $num_failures failures. | |
43 | ||
44 | cat > $junit_report_file << __EOF__ | |
45 | <?xml version="1.0" encoding="utf-8"?> | |
46 | <testsuites tests="$num_tests" errors="0" failures="$num_failures"> | |
47 | <testsuite name="commit-review" tests="$num_tests" errors="0" failures="$num_failures" skipped="0"> | |
48 | $(< $JUNIT_REPORT_TESTS_FILE) | |
49 | </testsuite> | |
50 | </testsuites> | |
51 | __EOF__ | |
52 | } | |
53 | ||
54 | function commit_message_has_mr_url() { | |
55 | commit=$1 | |
56 | commit_message=$(git show -s --format='format:%b' $commit) | |
57 | echo "$commit_message" | grep -qe "^$CI_MERGE_REQUEST_PROJECT_URL\/\(-\/\)\?merge_requests\/$CI_MERGE_REQUEST_IID$" | |
58 | return $? | |
59 | } | |
60 | ||
61 | for commit in $commits; do | |
62 | if commit_message_has_mr_url $commit; then | |
63 | append_failed_test_case superfluous_url $commit \ | |
64 | "Commit message must not contain a link to its own merge request" | |
65 | else | |
66 | append_passed_test_case superfluous_url $commit | |
67 | fi | |
68 | done | |
69 | ||
70 | generate_junit_report commit-message-junit-report.xml | |
71 | ||
72 | ! grep -q '<failure' commit-message-junit-report.xml | |
73 | exit $? |
0 | include: | |
1 | - remote: "https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/7ea696055e322cc7aa4bcbe5422b56a198c4bdff/templates/ci-fairy.yml" | |
2 | ||
3 | image: registry.gitlab.gnome.org/gnome/gnome-shell/fedora/33:2020-11-17.0 | |
4 | ||
5 | stages: | |
6 | - pre_review | |
7 | - review | |
8 | - build | |
9 | ||
10 | default: | |
11 | # Cancel jobs if newer commits are pushed to the branch | |
12 | interruptible: true | |
13 | # Auto-retry jobs in case of infra failures | |
14 | retry: | |
15 | max: 1 | |
16 | when: | |
17 | - 'runner_system_failure' | |
18 | - 'stuck_or_timeout_failure' | |
19 | - 'scheduler_failure' | |
20 | - 'api_failure' | |
21 | ||
22 | variables: | |
23 | LINT_LOG: "eslint-report.xml" | |
24 | JS_LOG: "js-report.txt" | |
25 | ||
26 | workflow: | |
27 | rules: | |
28 | - if: '$CI_MERGE_REQUEST_IID' | |
29 | - if: '$CI_COMMIT_TAG' | |
30 | - if: '$CI_COMMIT_BRANCH' | |
31 | ||
32 | .pipeline_guard: &pipeline_guard | |
33 | rules: | |
34 | - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' | |
35 | - if: '$CI_COMMIT_TAG' | |
36 | - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' | |
37 | - if: '$CI_COMMIT_BRANCH =~ /^gnome-[0-9-]+$/' | |
38 | - when: 'manual' | |
39 | ||
40 | check_commit_log: | |
41 | extends: | |
42 | - .fdo.ci-fairy | |
43 | stage: pre_review | |
44 | script: | |
45 | - ./.gitlab-ci/check-commit-log.sh | |
46 | <<: *pipeline_guard | |
47 | artifacts: | |
48 | expire_in: 1 week | |
49 | paths: | |
50 | - commit-message-junit-report.xml | |
51 | reports: | |
52 | junit: commit-message-junit-report.xml | |
53 | ||
54 | check-merge-request: | |
55 | extends: | |
56 | - .fdo.ci-fairy | |
57 | stage: pre_review | |
58 | script: | |
59 | - if [[ x"$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" != "x" ]] ; | |
60 | then | |
61 | ci-fairy check-merge-request --require-allow-collaboration --junit-xml=check-merge-request-report.xml ; | |
62 | else | |
63 | echo "Not a merge request" ; | |
64 | fi | |
65 | <<: *pipeline_guard | |
66 | artifacts: | |
67 | expire_in: 1 week | |
68 | paths: | |
69 | - check-merge-request-report.xml | |
70 | reports: | |
71 | junit: check-merge-request-report.xml | |
72 | ||
73 | js_check: | |
74 | stage: review | |
75 | script: | |
76 | - find extensions -name '*.js' -exec js78 -c '{}' ';' 2>&1 | tee $JS_LOG | |
77 | - (! grep -q . $JS_LOG) | |
78 | artifacts: | |
79 | paths: | |
80 | - ${JS_LOG} | |
81 | when: on_failure | |
82 | ||
83 | eslint: | |
84 | stage: review | |
85 | script: | |
86 | - eslint -o $LINT_LOG -f junit extensions | |
87 | artifacts: | |
88 | paths: | |
89 | - ${LINT_LOG} | |
90 | reports: | |
91 | junit: ${LINT_LOG} | |
92 | ||
93 | build-bundles: | |
94 | stage: build | |
95 | needs: ["check_commit_log"] | |
96 | script: | |
97 | - ./export-zips.sh | |
98 | artifacts: | |
99 | name: 'Extension bundles' | |
100 | expose_as: 'Get Extension bundles here' | |
101 | paths: | |
102 | - zip-files/ |
0 | [submodule "data/gnome-shell-sass"] | |
1 | path = data/gnome-shell-sass | |
2 | url = https://gitlab.gnome.org/GNOME/gnome-shell-sass.git |
0 | GNU GENERAL PUBLIC LICENSE | |
1 | Version 2, June 1991 | |
2 | ||
3 | Copyright (C) 1989, 1991 Free Software Foundation, Inc. <http://fsf.org> | |
4 | Everyone is permitted to copy and distribute verbatim copies | |
5 | of this license document, but changing it is not allowed. | |
6 | ||
7 | Preamble | |
8 | ||
9 | The licenses for most software are designed to take away your | |
10 | freedom to share and change it. By contrast, the GNU General Public | |
11 | License is intended to guarantee your freedom to share and change free | |
12 | software--to make sure the software is free for all its users. This | |
13 | General Public License applies to most of the Free Software | |
14 | Foundation's software and to any other program whose authors commit to | |
15 | using it. (Some other Free Software Foundation software is covered by | |
16 | the GNU Library General Public License instead.) You can apply it to | |
17 | your programs, too. | |
18 | ||
19 | When we speak of free software, we are referring to freedom, not | |
20 | price. Our General Public Licenses are designed to make sure that you | |
21 | have the freedom to distribute copies of free software (and charge for | |
22 | this service if you wish), that you receive source code or can get it | |
23 | if you want it, that you can change the software or use pieces of it | |
24 | in new free programs; and that you know you can do these things. | |
25 | ||
26 | To protect your rights, we need to make restrictions that forbid | |
27 | anyone to deny you these rights or to ask you to surrender the rights. | |
28 | These restrictions translate to certain responsibilities for you if you | |
29 | distribute copies of the software, or if you modify it. | |
30 | ||
31 | For example, if you distribute copies of such a program, whether | |
32 | gratis or for a fee, you must give the recipients all the rights that | |
33 | you have. You must make sure that they, too, receive or can get the | |
34 | source code. And you must show them these terms so they know their | |
35 | rights. | |
36 | ||
37 | We protect your rights with two steps: (1) copyright the software, and | |
38 | (2) offer you this license which gives you legal permission to copy, | |
39 | distribute and/or modify the software. | |
40 | ||
41 | Also, for each author's protection and ours, we want to make certain | |
42 | that everyone understands that there is no warranty for this free | |
43 | software. If the software is modified by someone else and passed on, we | |
44 | want its recipients to know that what they have is not the original, so | |
45 | that any problems introduced by others will not reflect on the original | |
46 | authors' reputations. | |
47 | ||
48 | Finally, any free program is threatened constantly by software | |
49 | patents. We wish to avoid the danger that redistributors of a free | |
50 | program will individually obtain patent licenses, in effect making the | |
51 | program proprietary. To prevent this, we have made it clear that any | |
52 | patent must be licensed for everyone's free use or not licensed at all. | |
53 | ||
54 | The precise terms and conditions for copying, distribution and | |
55 | modification follow. | |
56 | ||
57 | GNU GENERAL PUBLIC LICENSE | |
58 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION | |
59 | ||
60 | 0. This License applies to any program or other work which contains | |
61 | a notice placed by the copyright holder saying it may be distributed | |
62 | under the terms of this General Public License. The "Program", below, | |
63 | refers to any such program or work, and a "work based on the Program" | |
64 | means either the Program or any derivative work under copyright law: | |
65 | that is to say, a work containing the Program or a portion of it, | |
66 | either verbatim or with modifications and/or translated into another | |
67 | language. (Hereinafter, translation is included without limitation in | |
68 | the term "modification".) Each licensee is addressed as "you". | |
69 | ||
70 | Activities other than copying, distribution and modification are not | |
71 | covered by this License; they are outside its scope. The act of | |
72 | running the Program is not restricted, and the output from the Program | |
73 | is covered only if its contents constitute a work based on the | |
74 | Program (independent of having been made by running the Program). | |
75 | Whether that is true depends on what the Program does. | |
76 | ||
77 | 1. You may copy and distribute verbatim copies of the Program's | |
78 | source code as you receive it, in any medium, provided that you | |
79 | conspicuously and appropriately publish on each copy an appropriate | |
80 | copyright notice and disclaimer of warranty; keep intact all the | |
81 | notices that refer to this License and to the absence of any warranty; | |
82 | and give any other recipients of the Program a copy of this License | |
83 | along with the Program. | |
84 | ||
85 | You may charge a fee for the physical act of transferring a copy, and | |
86 | you may at your option offer warranty protection in exchange for a fee. | |
87 | ||
88 | 2. You may modify your copy or copies of the Program or any portion | |
89 | of it, thus forming a work based on the Program, and copy and | |
90 | distribute such modifications or work under the terms of Section 1 | |
91 | above, provided that you also meet all of these conditions: | |
92 | ||
93 | a) You must cause the modified files to carry prominent notices | |
94 | stating that you changed the files and the date of any change. | |
95 | ||
96 | b) You must cause any work that you distribute or publish, that in | |
97 | whole or in part contains or is derived from the Program or any | |
98 | part thereof, to be licensed as a whole at no charge to all third | |
99 | parties under the terms of this License. | |
100 | ||
101 | c) If the modified program normally reads commands interactively | |
102 | when run, you must cause it, when started running for such | |
103 | interactive use in the most ordinary way, to print or display an | |
104 | announcement including an appropriate copyright notice and a | |
105 | notice that there is no warranty (or else, saying that you provide | |
106 | a warranty) and that users may redistribute the program under | |
107 | these conditions, and telling the user how to view a copy of this | |
108 | License. (Exception: if the Program itself is interactive but | |
109 | does not normally print such an announcement, your work based on | |
110 | the Program is not required to print an announcement.) | |
111 | ||
112 | These requirements apply to the modified work as a whole. If | |
113 | identifiable sections of that work are not derived from the Program, | |
114 | and can be reasonably considered independent and separate works in | |
115 | themselves, then this License, and its terms, do not apply to those | |
116 | sections when you distribute them as separate works. But when you | |
117 | distribute the same sections as part of a whole which is a work based | |
118 | on the Program, the distribution of the whole must be on the terms of | |
119 | this License, whose permissions for other licensees extend to the | |
120 | entire whole, and thus to each and every part regardless of who wrote it. | |
121 | ||
122 | Thus, it is not the intent of this section to claim rights or contest | |
123 | your rights to work written entirely by you; rather, the intent is to | |
124 | exercise the right to control the distribution of derivative or | |
125 | collective works based on the Program. | |
126 | ||
127 | In addition, mere aggregation of another work not based on the Program | |
128 | with the Program (or with a work based on the Program) on a volume of | |
129 | a storage or distribution medium does not bring the other work under | |
130 | the scope of this License. | |
131 | ||
132 | 3. You may copy and distribute the Program (or a work based on it, | |
133 | under Section 2) in object code or executable form under the terms of | |
134 | Sections 1 and 2 above provided that you also do one of the following: | |
135 | ||
136 | a) Accompany it with the complete corresponding machine-readable | |
137 | source code, which must be distributed under the terms of Sections | |
138 | 1 and 2 above on a medium customarily used for software interchange; or, | |
139 | ||
140 | b) Accompany it with a written offer, valid for at least three | |
141 | years, to give any third party, for a charge no more than your | |
142 | cost of physically performing source distribution, a complete | |
143 | machine-readable copy of the corresponding source code, to be | |
144 | distributed under the terms of Sections 1 and 2 above on a medium | |
145 | customarily used for software interchange; or, | |
146 | ||
147 | c) Accompany it with the information you received as to the offer | |
148 | to distribute corresponding source code. (This alternative is | |
149 | allowed only for noncommercial distribution and only if you | |
150 | received the program in object code or executable form with such | |
151 | an offer, in accord with Subsection b above.) | |
152 | ||
153 | The source code for a work means the preferred form of the work for | |
154 | making modifications to it. For an executable work, complete source | |
155 | code means all the source code for all modules it contains, plus any | |
156 | associated interface definition files, plus the scripts used to | |
157 | control compilation and installation of the executable. However, as a | |
158 | special exception, the source code distributed need not include | |
159 | anything that is normally distributed (in either source or binary | |
160 | form) with the major components (compiler, kernel, and so on) of the | |
161 | operating system on which the executable runs, unless that component | |
162 | itself accompanies the executable. | |
163 | ||
164 | If distribution of executable or object code is made by offering | |
165 | access to copy from a designated place, then offering equivalent | |
166 | access to copy the source code from the same place counts as | |
167 | distribution of the source code, even though third parties are not | |
168 | compelled to copy the source along with the object code. | |
169 | ||
170 | 4. You may not copy, modify, sublicense, or distribute the Program | |
171 | except as expressly provided under this License. Any attempt | |
172 | otherwise to copy, modify, sublicense or distribute the Program is | |
173 | void, and will automatically terminate your rights under this License. | |
174 | However, parties who have received copies, or rights, from you under | |
175 | this License will not have their licenses terminated so long as such | |
176 | parties remain in full compliance. | |
177 | ||
178 | 5. You are not required to accept this License, since you have not | |
179 | signed it. However, nothing else grants you permission to modify or | |
180 | distribute the Program or its derivative works. These actions are | |
181 | prohibited by law if you do not accept this License. Therefore, by | |
182 | modifying or distributing the Program (or any work based on the | |
183 | Program), you indicate your acceptance of this License to do so, and | |
184 | all its terms and conditions for copying, distributing or modifying | |
185 | the Program or works based on it. | |
186 | ||
187 | 6. Each time you redistribute the Program (or any work based on the | |
188 | Program), the recipient automatically receives a license from the | |
189 | original licensor to copy, distribute or modify the Program subject to | |
190 | these terms and conditions. You may not impose any further | |
191 | restrictions on the recipients' exercise of the rights granted herein. | |
192 | You are not responsible for enforcing compliance by third parties to | |
193 | this License. | |
194 | ||
195 | 7. If, as a consequence of a court judgment or allegation of patent | |
196 | infringement or for any other reason (not limited to patent issues), | |
197 | conditions are imposed on you (whether by court order, agreement or | |
198 | otherwise) that contradict the conditions of this License, they do not | |
199 | excuse you from the conditions of this License. If you cannot | |
200 | distribute so as to satisfy simultaneously your obligations under this | |
201 | License and any other pertinent obligations, then as a consequence you | |
202 | may not distribute the Program at all. For example, if a patent | |
203 | license would not permit royalty-free redistribution of the Program by | |
204 | all those who receive copies directly or indirectly through you, then | |
205 | the only way you could satisfy both it and this License would be to | |
206 | refrain entirely from distribution of the Program. | |
207 | ||
208 | If any portion of this section is held invalid or unenforceable under | |
209 | any particular circumstance, the balance of the section is intended to | |
210 | apply and the section as a whole is intended to apply in other | |
211 | circumstances. | |
212 | ||
213 | It is not the purpose of this section to induce you to infringe any | |
214 | patents or other property right claims or to contest validity of any | |
215 | such claims; this section has the sole purpose of protecting the | |
216 | integrity of the free software distribution system, which is | |
217 | implemented by public license practices. Many people have made | |
218 | generous contributions to the wide range of software distributed | |
219 | through that system in reliance on consistent application of that | |
220 | system; it is up to the author/donor to decide if he or she is willing | |
221 | to distribute software through any other system and a licensee cannot | |
222 | impose that choice. | |
223 | ||
224 | This section is intended to make thoroughly clear what is believed to | |
225 | be a consequence of the rest of this License. | |
226 | ||
227 | 8. If the distribution and/or use of the Program is restricted in | |
228 | certain countries either by patents or by copyrighted interfaces, the | |
229 | original copyright holder who places the Program under this License | |
230 | may add an explicit geographical distribution limitation excluding | |
231 | those countries, so that distribution is permitted only in or among | |
232 | countries not thus excluded. In such case, this License incorporates | |
233 | the limitation as if written in the body of this License. | |
234 | ||
235 | 9. The Free Software Foundation may publish revised and/or new versions | |
236 | of the General Public License from time to time. Such new versions will | |
237 | be similar in spirit to the present version, but may differ in detail to | |
238 | address new problems or concerns. | |
239 | ||
240 | Each version is given a distinguishing version number. If the Program | |
241 | specifies a version number of this License which applies to it and "any | |
242 | later version", you have the option of following the terms and conditions | |
243 | either of that version or of any later version published by the Free | |
244 | Software Foundation. If the Program does not specify a version number of | |
245 | this License, you may choose any version ever published by the Free Software | |
246 | Foundation. | |
247 | ||
248 | 10. If you wish to incorporate parts of the Program into other free | |
249 | programs whose distribution conditions are different, write to the author | |
250 | to ask for permission. For software which is copyrighted by the Free | |
251 | Software Foundation, write to the Free Software Foundation; we sometimes | |
252 | make exceptions for this. Our decision will be guided by the two goals | |
253 | of preserving the free status of all derivatives of our free software and | |
254 | of promoting the sharing and reuse of software generally. | |
255 | ||
256 | NO WARRANTY | |
257 | ||
258 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY | |
259 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN | |
260 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES | |
261 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED | |
262 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |
263 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS | |
264 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE | |
265 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, | |
266 | REPAIR OR CORRECTION. | |
267 | ||
268 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING | |
269 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR | |
270 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, | |
271 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING | |
272 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED | |
273 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY | |
274 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER | |
275 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE | |
276 | POSSIBILITY OF SUCH DAMAGES. | |
277 | ||
278 | END OF TERMS AND CONDITIONS | |
279 | ||
280 | How to Apply These Terms to Your New Programs | |
281 | ||
282 | If you develop a new program, and you want it to be of the greatest | |
283 | possible use to the public, the best way to achieve this is to make it | |
284 | free software which everyone can redistribute and change under these terms. | |
285 | ||
286 | To do so, attach the following notices to the program. It is safest | |
287 | to attach them to the start of each source file to most effectively | |
288 | convey the exclusion of warranty; and each file should have at least | |
289 | the "copyright" line and a pointer to where the full notice is found. | |
290 | ||
291 | <one line to give the program's name and a brief idea of what it does.> | |
292 | Copyright (C) <year> <name of author> | |
293 | ||
294 | This program is free software; you can redistribute it and/or modify | |
295 | it under the terms of the GNU General Public License as published by | |
296 | the Free Software Foundation; either version 2 of the License, or | |
297 | (at your option) any later version. | |
298 | ||
299 | This program is distributed in the hope that it will be useful, | |
300 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
301 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
302 | GNU General Public License for more details. | |
303 | ||
304 | You should have received a copy of the GNU General Public License | |
305 | along with this program; if not, write to the Free Software | |
306 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
307 | ||
308 | ||
309 | Also add information on how to contact you by electronic and paper mail. | |
310 | ||
311 | If the program is interactive, make it output a short notice like this | |
312 | when it starts in an interactive mode: | |
313 | ||
314 | Gnomovision version 69, Copyright (C) year name of author | |
315 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. | |
316 | This is free software, and you are welcome to redistribute it | |
317 | under certain conditions; type `show c' for details. | |
318 | ||
319 | The hypothetical commands `show w' and `show c' should show the appropriate | |
320 | parts of the General Public License. Of course, the commands you use may | |
321 | be called something other than `show w' and `show c'; they could even be | |
322 | mouse-clicks or menu items--whatever suits your program. | |
323 | ||
324 | You should also get your employer (if you work as a programmer) or your | |
325 | school, if any, to sign a "copyright disclaimer" for the program, if | |
326 | necessary. Here is a sample; alter the names: | |
327 | ||
328 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program | |
329 | `Gnomovision' (which makes passes at compilers) written by James Hacker. | |
330 | ||
331 | <signature of Ty Coon>, 1 April 1989 | |
332 | Ty Coon, President of Vice | |
333 | ||
334 | This General Public License does not permit incorporating your program into | |
335 | proprietary programs. If your program is a subroutine library, you may | |
336 | consider it more useful to permit linking proprietary applications with the | |
337 | library. If this is what you want to do, use the GNU Library General | |
338 | Public License instead of this License. |
0 | # GNOME Shell Sass | |
1 | GNOME Shell Sass is a project intended to allow the sharing of the | |
2 | theme sources in sass between gnome-shell and other projects like | |
3 | gnome-shell-extensions. | |
4 | ||
5 | Any changes should be done in the [GNOME Shell subtree][shell-subtree] | |
6 | and not the stand-alone [gnome-shell-sass repository][sass-repo]. They | |
7 | will then be synchronized periodically before releases. | |
8 | ||
9 | ## License | |
10 | GNOME Shell Sass is distributed under the terms of the GNU General Public | |
11 | License, version 2 or later. See the [COPYING][license] file for details. | |
12 | ||
13 | [shell-subtree]: https://gitlab.gnome.org/GNOME/gnome-shell/tree/master/data/theme/gnome-shell-sass | |
14 | [sass-repo]: https://gitlab.gnome.org/GNOME/gnome-shell-sass | |
15 | [license]: COPYING |
0 | // When color definition differs for dark and light variant, | |
1 | // it gets @if ed depending on $variant | |
2 | ||
3 | $base_color: if($variant == 'light', #fff, lighten(desaturate(#241f31, 20%), 2%)); | |
4 | $bg_color: if($variant == 'light', #f6f5f4, darken(desaturate(#3d3846, 100%), 4%)); | |
5 | $fg_color: if($variant == 'light', #2e3436, #eeeeec); | |
6 | ||
7 | $selected_fg_color: #fff; | |
8 | $selected_bg_color: if($variant == 'light', #3584e4, darken(#3584e4, 10%)); | |
9 | $selected_borders_color: if($variant== 'light', darken($selected_bg_color, 15%), darken($selected_bg_color, 30%)); | |
10 | $borders_color: if($variant == 'light', darken($bg_color, 18%), darken($bg_color, 8%)); | |
11 | $borders_edge: if($variant == 'light', rgba(255,255,255,0.8), transparentize($fg_color, 0.93)); | |
12 | $link_color: if($variant == 'light', darken($selected_bg_color, 10%), lighten($selected_bg_color, 20%)); | |
13 | $link_visited_color: if($variant == 'light', darken($selected_bg_color, 20%), lighten($selected_bg_color, 10%)); | |
14 | $top_hilight: $borders_edge; | |
15 | ||
16 | $warning_color: #f57900; | |
17 | $error_color: #ff8080; | |
18 | $success_color: if($variant == 'light', #33d17a, darken(#33d17a, 10%)); | |
19 | $destructive_color: if($variant == 'light', #e01b24, darken(#e01b24, 10%)); | |
20 | ||
21 | $osd_fg_color: #eeeeec; | |
22 | $osd_text_color: white; | |
23 | $osd_bg_color: transparentize(darken(desaturate(#3d3846, 100%), 12%),0.04); | |
24 | $osd_insensitive_bg_color: transparentize(mix($osd_fg_color, opacify($osd_bg_color, 1), 10%), 0.5); | |
25 | $osd_insensitive_fg_color: mix($osd_fg_color, opacify($osd_bg_color, 1), 50%); | |
26 | $osd_borders_color: transparentize(black, 0.3); | |
27 | $osd_outer_borders_color: transparentize(white, 0.84); | |
28 | ||
29 | $shadow_color: if($variant == 'light', rgba(0,0,0,0.1), rgba(0,0,0,0.2)); | |
30 | ||
31 | //insensitive state derived colors | |
32 | $insensitive_fg_color: mix($fg_color, $bg_color, 50%); | |
33 | $insensitive_bg_color: mix($bg_color, $base_color, 60%); | |
34 | $insensitive_borders_color: mix($borders_color, $base_color, 60%); | |
35 | ||
36 | //colors for the backdrop state, derived from the main colors. | |
37 | $backdrop_base_color: if($variant =='light', darken($base_color,1%), lighten($base_color,1%)); | |
38 | $backdrop_bg_color: $bg_color; | |
39 | $backdrop_fg_color: mix($fg_color, $backdrop_bg_color, 80%); | |
40 | $backdrop_insensitive_color: if($variant =='light', darken($backdrop_bg_color,15%), lighten($backdrop_bg_color,15%)); | |
41 | $backdrop_borders_color: mix($borders_color, $bg_color, 90%); | |
42 | $backdrop_dark_fill: mix($backdrop_borders_color,$backdrop_bg_color, 35%); |
0 | //This is the RIGHT PLACE to edit the stylesheet | |
1 | ||
2 | //let's start by telling people not to edit the generated CSS: | |
3 | $cakeisalie: "This stylesheet is generated, DO NOT EDIT"; | |
4 | /* #{$cakeisalie} */ | |
5 | ||
6 | /* Copyright 2009, 2015 Red Hat, Inc. | |
7 | * | |
8 | * Portions adapted from Mx's data/style/default.css | |
9 | * Copyright 2009 Intel Corporation | |
10 | * | |
11 | * This program is free software; you can redistribute it and/or modify it | |
12 | * under the terms and conditions of the GNU Lesser General Public License, | |
13 | * version 2.1, as published by the Free Software Foundation. | |
14 | * | |
15 | * This program is distributed in the hope it will be useful, but WITHOUT ANY | |
16 | * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | |
17 | * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for | |
18 | * more details. | |
19 | * | |
20 | * You should have received a copy of the GNU Lesser General Public License | |
21 | * along with this program; if not, write to the Free Software Foundation, | |
22 | * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. | |
23 | */ | |
24 | ||
25 | /* Global Values */ | |
26 | ||
27 | // padding, margin and spacing | |
28 | $base_padding: 6px; | |
29 | $base_margin: 4px; | |
30 | $base_spacing: 6px; | |
31 | ||
32 | // border radii | |
33 | $base_border_radius: 5px; | |
34 | ||
35 | $modal_radius:$base_border_radius * 2; | |
36 | ||
37 | // non-standard colors | |
38 | $bubble_borders_color: lighten($borders_color, if($variant=='light', 0%, 5%)); | |
39 | // $bubble_borders_color: if($variant == 'light', rgba(255,255,255,0.1), rgba(0,0,0,0.3)); | |
40 | ||
41 | // hover | |
42 | $hover_bg_color: if($variant=='light', darken($bg_color, 3%), lighten($bg_color, 5%)); | |
43 | $hover_fg_color: if($variant=='light', darken($fg_color, 5%), lighten($fg_color, 5%)); | |
44 | $hover_borders_color: lighten($borders_color,if($variant=='light', 5%, 3%)); | |
45 | ||
46 | // active | |
47 | $active_bg_color: if($variant == 'light', darken($bg_color, 7%), darken($bg_color, 9%)); | |
48 | $active_fg_color: darken($fg_color,if($variant=='light', 5%, 3%)); | |
49 | $active_borders_color: darken($borders_color,if($variant=='light', 5%, 3%)); | |
50 | ||
51 | // fonts | |
52 | $base_font_size: 11; | |
53 | $text_shadow_color: if($variant == 'light', rgba(255,255,255,0.3), rgba(0,0,0,0.2)); | |
54 | ||
55 | // icons | |
56 | $base_icon_size: 1.09em; | |
57 | // $base_icon_size: 16px; | |
58 | ||
59 | // Stage | |
60 | stage { | |
61 | @include fontsize($base_font_size); | |
62 | color: $fg_color; | |
63 | } | |
64 | ||
65 | /* Common Stylings */ | |
66 | ||
67 | // Text | |
68 | %status_text { | |
69 | font-size: 2em; | |
70 | font-weight: bold; | |
71 | color: $osd_fg_color; | |
72 | } | |
73 | ||
74 | // osd panels | |
75 | %osd_panel { | |
76 | color: $osd_fg_color; | |
77 | background-color: $osd_bg_color; | |
78 | border: 1px solid $osd_outer_borders_color; | |
79 | border-radius: $base_border_radius * 2 + 4px; | |
80 | padding: $base_padding * 2; | |
81 | } | |
82 | ||
83 | // Overview panels | |
84 | // for the dash and workspace switcher | |
85 | %overview_panel { | |
86 | color: $osd_fg_color; | |
87 | background-color: transparentize($osd_bg_color, 0.2); | |
88 | border: 1px solid $osd_outer_borders_color; | |
89 | } | |
90 | ||
91 | // icon tiles | |
92 | %icon_tile { | |
93 | border-radius: $base_border_radius + 4px; | |
94 | padding: $base_padding; | |
95 | border: 2px solid transparent; | |
96 | transition-duration: 100ms; | |
97 | text-align: center; | |
98 | } | |
99 | ||
100 | // dialogs | |
101 | %bubble_panel { | |
102 | color: $fg_color; | |
103 | background-color: $bg_color; | |
104 | border: 1px solid if($variant=='light', rgba(0,0,0, 0.6), $borders_color); | |
105 | } | |
106 | ||
107 | // button styling | |
108 | %button { | |
109 | border-radius: $base_border_radius; | |
110 | border-style: solid; | |
111 | border-width: 1px; | |
112 | min-height: 22px; | |
113 | padding: $base_padding * 0.5 $base_padding * 4; | |
114 | ||
115 | @include button(normal); | |
116 | &:focus { @include button(focus);} | |
117 | &:hover { @include button(hover);} | |
118 | &:insensitive { @include button(insensitive);} | |
119 | &:active { @include button(active);} | |
120 | } | |
121 | ||
122 | // buttons in dialogs | |
123 | %bubble_button { | |
124 | @include button(normal, $shadow: none); | |
125 | padding: $base_padding * 2; | |
126 | border-style: solid; | |
127 | border-width: 1px; | |
128 | border-left-width: 0; | |
129 | border-bottom-width: 0; | |
130 | ||
131 | &:insensitive { @include button(insensitive, $shadow: none); } | |
132 | &:hover { @include button(hover, $shadow: none); } | |
133 | &:focus { @include button(focus, $shadow: none); } | |
134 | &:active { @include button(active, $shadow: none); } | |
135 | ||
136 | // radius is 2 pixel less to fit in bubble | |
137 | &:first-child { | |
138 | border-radius: 0 0 0 $modal_radius - 2px; | |
139 | } | |
140 | ||
141 | &:last-child { | |
142 | border-right-width: 0; | |
143 | border-radius: 0 0 $modal_radius - 2px 0; | |
144 | } | |
145 | ||
146 | &:first-child:last-child { | |
147 | border-radius: 0 0 $modal_radius - 2px $modal_radius - 2px; | |
148 | } | |
149 | } | |
150 | ||
151 | ||
152 | // notification styling | |
153 | @mixin notification_bubble($flat: false) { | |
154 | border-width: 1px; | |
155 | border-style: solid; | |
156 | border-radius: $base_border_radius + 2px; | |
157 | margin: $base_margin; | |
158 | ||
159 | @if $flat { | |
160 | @include button(undecorated); | |
161 | } @else { | |
162 | @include button(normal); | |
163 | } | |
164 | ||
165 | &:focus { | |
166 | @include button(focus); | |
167 | } | |
168 | ||
169 | &:hover { | |
170 | @include button(hover); | |
171 | } | |
172 | ||
173 | &:active { | |
174 | @include button(active); | |
175 | } | |
176 | } |
0 | // Drawing mixins | |
1 | ||
2 | // generic drawing of more complex things | |
3 | ||
4 | @function draw_widget_edge($c:$borders_edge) { | |
5 | // outer highlight "used" on most widgets | |
6 | @return 0 1px $c; | |
7 | } | |
8 | ||
9 | // provide font size in rem, with px fallback | |
10 | @mixin fontsize($size: 24, $base: 16) { | |
11 | font-size: round($size) + pt; | |
12 | //font-size: ($size / $base) * 1rem; | |
13 | } | |
14 | ||
15 | @mixin draw_shadows($shadow1, $shadow2:none, $shadow3:none, $shadow4:none) { | |
16 | // | |
17 | // Helper function to stack up to 4 box-shadows; | |
18 | // | |
19 | @if $shadow4!=none { box-shadow: $shadow1, $shadow2, $shadow3, $shadow4; } | |
20 | @else if $shadow3!=none { box-shadow: $shadow1, $shadow2, $shadow3; } | |
21 | @else if $shadow2!=none { box-shadow: $shadow1, $shadow2; } | |
22 | @else { box-shadow: $shadow1; } | |
23 | } | |
24 | ||
25 | // entries | |
26 | ||
27 | @mixin entry($t, $fc:$selected_bg_color, $edge: $borders_edge) { | |
28 | // | |
29 | // Entries drawing function | |
30 | // | |
31 | // $t: entry type | |
32 | // $fc: focus color | |
33 | // $edge: set to none to not draw the bottom edge or specify a color to not use the default one | |
34 | // | |
35 | // possible $t values: | |
36 | // normal, focus, insensitive | |
37 | // | |
38 | ||
39 | @if $t==normal { | |
40 | background-color: $base_color; | |
41 | border-color: $borders_color; | |
42 | ||
43 | } | |
44 | @if $t==focus { | |
45 | border-color: if($fc==$selected_bg_color, | |
46 | $selected_borders_color, | |
47 | darken($fc,35%)); | |
48 | box-shadow: inset 0 0 0 1px $fc; | |
49 | } | |
50 | @if $t==hover { } | |
51 | @if $t==insensitive { | |
52 | color: $insensitive_fg_color; | |
53 | border-color: $insensitive_bg_color; | |
54 | box-shadow: none; | |
55 | } | |
56 | } | |
57 | ||
58 | // buttons | |
59 | ||
60 | @function draw_border_color ($c) { | |
61 | // | |
62 | // colored buttons want the border form the base color | |
63 | // | |
64 | @return if($variant == 'light', darken($c, 18%), darken($c, 4%)); | |
65 | } | |
66 | ||
67 | @function draw_text_shadow_color ($tc:$fg_color, $bg:$bg_color) { | |
68 | // | |
69 | // calculate the color of text shadows | |
70 | // | |
71 | // $tc is the text color | |
72 | // $bg is the background color | |
73 | // | |
74 | $lbg: lightness($bg)/100%; | |
75 | @if lightness($tc)<50% { @return rgba(255,255,255,$lbg/($lbg*1.3)); } | |
76 | @else { @return rgba(0,0,0,1-$lbg*0.8); } | |
77 | } | |
78 | ||
79 | @function draw_button_hilight_color($c) { | |
80 | // | |
81 | // calculate the right top highlight color for buttons | |
82 | // | |
83 | // $c: base color; | |
84 | // | |
85 | @if lightness($c)>90% { @return white; } | |
86 | @else if lightness($c)>80% { @return rgba(255,255,255, 0.7); } | |
87 | @else if lightness($c)>50% { @return rgba(255,255,255, 0.5); } | |
88 | @else if lightness($c)>40% { @return rgba(255,255,255, 0.3); } | |
89 | @else { @return rgba(255,255,255, 0.1); } | |
90 | } | |
91 | ||
92 | @mixin draw_button_text_shadow ($tc:$fg_color, $bg:$bg_color) { | |
93 | // | |
94 | // helper function for the text emboss effect | |
95 | // | |
96 | // $tc is the optional text color, not the shadow color | |
97 | // | |
98 | // TODO: this functions needs a way to deal with special cases | |
99 | // | |
100 | ||
101 | $shadow: draw_text_shadow_color($tc, $bg); | |
102 | ||
103 | @if lightness($tc)<50% { | |
104 | text-shadow: 0 1px $shadow; | |
105 | icon-shadow: 0 1px $shadow; | |
106 | } | |
107 | @else { | |
108 | text-shadow: 0 -1px $shadow; | |
109 | icon-shadow: 0 -1px $shadow; | |
110 | } | |
111 | } | |
112 | ||
113 | @mixin button($t, $c:$bg_color, $tc:$fg_color, $edge: $borders_edge, $shadow: $shadow_color) { | |
114 | // | |
115 | // Button drawing function | |
116 | // | |
117 | // $t: button type, | |
118 | // $c: base button color for colored* types | |
119 | // $tc: optional text color for colored* types | |
120 | // $edge: set to none to not draw the bottom edge or specify a color to not | |
121 | // use the default one | |
122 | // $shadow: set to none to not draw the drop shadow or specify a color to not | |
123 | // use the default one | |
124 | // | |
125 | // possible $t values: | |
126 | // normal, hover, active, insensitive, insensitive-active, | |
127 | // backdrop, backdrop-active, backdrop-insensitive, backdrop-insensitive-active, | |
128 | // osd, osd-hover, osd-active, osd-insensitive, osd-backdrop, undecorated | |
129 | // | |
130 | ||
131 | $hilight_color: draw_button_hilight_color($c); | |
132 | $button_edge: if($edge == none, none, draw_widget_edge($edge)); | |
133 | $blank_edge: if($edge == none, none, draw_widget_edge(transparentize($edge,1))); | |
134 | $button_shadow: if($shadow == none, none, 0 1px 1px 0 $shadow); | |
135 | ||
136 | // normal button | |
137 | @if $t==normal { | |
138 | color: $tc; | |
139 | background-color: lighten($c, 3%); | |
140 | border-color: draw_border_color($c); | |
141 | @include draw_shadows($button_shadow); | |
142 | // box-shadow: 0 1px 1px 0 rgba(0,0,0,0.1); | |
143 | text-shadow: 0 1px $text_shadow_color; | |
144 | icon-shadow: 0 1px $text_shadow_color; | |
145 | } | |
146 | ||
147 | // focused button | |
148 | @if $t==focus { | |
149 | color: $tc; | |
150 | text-shadow: 0 1px $text_shadow_color; | |
151 | icon-shadow: 0 1px $text_shadow_color; | |
152 | box-shadow: inset 0 0 0 2px transparentize($selected_bg_color, 0.4); | |
153 | //border-color: $selected_bg_color; | |
154 | } | |
155 | ||
156 | // hover button | |
157 | @else if $t==hover { | |
158 | color: $tc; | |
159 | background-color: lighten($c, if($variant == 'light', 8%, 5%)); | |
160 | border-color: if($variant == 'light', draw_border_color(lighten($c, 7%)), draw_border_color($c)); | |
161 | @include draw_shadows($button_shadow); | |
162 | text-shadow: 0 1px $text_shadow_color; | |
163 | icon-shadow: 0 1px $text_shadow_color; | |
164 | } | |
165 | ||
166 | // active button | |
167 | @else if $t==active { | |
168 | color: $tc; | |
169 | background-color: darken($c,3%); | |
170 | border-color: draw_border_color(if($variant == 'light', $c, darken($c,7%))); | |
171 | text-shadow: none; | |
172 | icon-shadow: none; | |
173 | box-shadow: none; | |
174 | } | |
175 | ||
176 | // insensitive button | |
177 | @else if $t==insensitive { | |
178 | color: $insensitive_fg_color; | |
179 | border-color: $insensitive_borders_color; | |
180 | background-color: $insensitive_bg_color; | |
181 | box-shadow: none; | |
182 | text-shadow: none; | |
183 | icon-shadow: none; | |
184 | } | |
185 | ||
186 | // reset | |
187 | @else if $t==undecorated { | |
188 | border-color: transparent; | |
189 | background-color: transparent; | |
190 | background-image: none; | |
191 | @include draw_shadows(inset 0 1px rgba(255,255,255,0),$blank_edge); | |
192 | text-shadow: none; | |
193 | icon-shadow: none; | |
194 | } | |
195 | } | |
196 | ||
197 | // overview icons | |
198 | @mixin overview-icon($color) { | |
199 | .overview-icon { | |
200 | @extend %icon_tile; | |
201 | color: $color; | |
202 | } | |
203 | ||
204 | &:hover, | |
205 | &:selected { | |
206 | .overview-icon { | |
207 | background-color: transparentize($color, .9); | |
208 | } | |
209 | } | |
210 | ||
211 | &:focus { | |
212 | .overview-icon { | |
213 | background-color: transparentize($color, .7); | |
214 | // border-color: $selected_bg_color; | |
215 | } | |
216 | } | |
217 | ||
218 | &:drop { | |
219 | .overview-icon { | |
220 | background-color: transparentize($selected_bg_color, .15); | |
221 | } | |
222 | } | |
223 | ||
224 | &:active, | |
225 | &:checked { | |
226 | .overview-icon { | |
227 | background-color: transparentize(darken($osd_bg_color, 10%), .5); | |
228 | } | |
229 | } | |
230 | } |
0 | // When color definition differs for dark and light variant, | |
1 | // it gets @if ed depending on $variant | |
2 | ||
3 | ||
4 | $base_color: #222; | |
5 | $bg_color: #000; | |
6 | $fg_color: #fff; | |
7 | ||
8 | $selected_fg_color: #ffffff; | |
9 | $selected_bg_color: darken(#4a90d9,20%); | |
10 | $selected_borders_color: darken($selected_bg_color, 20%); | |
11 | $borders_color: darken($bg_color,12%); | |
12 | $borders_edge: transparentize($fg_color, 0.9); | |
13 | $link_color: lighten($selected_bg_color,20%); | |
14 | $link_visited_color: lighten($selected_bg_color,10%); | |
15 | $top_hilight: $borders_edge; | |
16 | ||
17 | $warning_color: #f57900; | |
18 | $error_color: #cc0000; | |
19 | $success_color: darken(#73d216,10%); | |
20 | $destructive_color: darken(#ef2929,10%); | |
21 | ||
22 | $osd_fg_color: #eeeeec; | |
23 | $osd_bg_color: #2e3436; | |
24 | $osd_borders_color: rgba(0,0,0, 0.7); | |
25 | $osd_outer_borders_color: rgba(255,255,255, 0.1); | |
26 | ||
27 | $shadow_color: rgba(0,0,0, 0.1); | |
28 | ||
29 | //insensitive state derived colors | |
30 | $insensitive_fg_color: mix($fg_color, $bg_color, 50%); | |
31 | $insensitive_bg_color: mix($bg_color, $base_color, 60%); | |
32 | $insensitive_borders_color: $borders_color; | |
33 | ||
34 | //colors for the backdrop state, derived from the main colors. | |
35 | $backdrop_base_color: lighten($base_color,1%); | |
36 | $backdrop_bg_color: $bg_color; | |
37 | $backdrop_fg_color: mix($fg_color, $backdrop_bg_color, 80%); | |
38 | $backdrop_insensitive_color: lighten($backdrop_bg_color,15%); | |
39 | $backdrop_borders_color: mix($borders_color, $bg_color, 90%); | |
40 | $backdrop_dark_fill: mix($backdrop_borders_color,$backdrop_bg_color, 35%); |
0 | // | |
1 | // Shell widgets stylesheets are placed in separate .scss files | |
2 | // in 'widgets' and imported into the main stylesheet in this file. | |
3 | // To create or update a widget for the shell modify the list below. | |
4 | // | |
5 | ||
6 | /* WIDGETS */ | |
7 | ||
8 | // Primary widgets | |
9 | @import 'widgets/base'; | |
10 | @import 'widgets/entries'; | |
11 | @import 'widgets/buttons'; | |
12 | @import 'widgets/check-box'; | |
13 | @import 'widgets/switches'; | |
14 | @import 'widgets/slider'; | |
15 | @import 'widgets/scrollbars'; | |
16 | // Popovers | |
17 | @import 'widgets/popovers'; | |
18 | @import 'widgets/calendar'; | |
19 | @import 'widgets/message-list'; | |
20 | @import 'widgets/ibus-popup'; | |
21 | // Notifications | |
22 | @import 'widgets/notifications'; | |
23 | @import 'widgets/hotplug'; | |
24 | // Dialogs | |
25 | @import 'widgets/dialogs'; | |
26 | @import 'widgets/network-dialog'; | |
27 | // OSDs | |
28 | @import 'widgets/osd'; | |
29 | @import 'widgets/switcher-popup'; | |
30 | @import 'widgets/workspace-switcher'; | |
31 | // Panel | |
32 | @import 'widgets/panel'; | |
33 | @import 'widgets/corner-ripple'; | |
34 | // Overview | |
35 | @import 'widgets/overview'; | |
36 | @import 'widgets/window-picker'; | |
37 | @import 'widgets/search-entry'; | |
38 | @import 'widgets/search-results'; | |
39 | @import 'widgets/app-grid'; | |
40 | @import 'widgets/dash'; | |
41 | @import 'widgets/workspace-thumbnails'; | |
42 | // A11y / misc | |
43 | @import 'widgets/a11y'; | |
44 | @import 'widgets/misc'; | |
45 | @import 'widgets/tiled-previews'; | |
46 | @import 'widgets/keyboard'; | |
47 | @import 'widgets/looking-glass'; | |
48 | // Lock / login screens | |
49 | @import 'widgets/login-dialog'; | |
50 | @import 'widgets/screen-shield'; |
0 | <Project xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |
1 | xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" | |
2 | xmlns:foaf="http://xmlns.com/foaf/0.1/" | |
3 | xmlns:gnome="http://api.gnome.org/doap-extensions#" | |
4 | xmlns="http://usefulinc.com/ns/doap#"> | |
5 | ||
6 | <name xml:lang="en">GNOME Shell Sass</name> | |
7 | <shortdesc xml:lang="en">Sass sources of GNOME Shell</shortdesc> | |
8 | <description>GNOME Shell Sass is a project intended to allow the sharing of the | |
9 | sass theme sources between gnome-shell and other projects like gnome-shell-extensions.</description> | |
10 | ||
11 | <category rdf:resource="http://api.gnome.org/doap-extensions#core" /> | |
12 | <programming-language>sass</programming-language> | |
13 | <programming-language>css</programming-language> | |
14 | ||
15 | <maintainer> | |
16 | <foaf:Person> | |
17 | <foaf:name>Carlos Soriano</foaf:name> | |
18 | <foaf:mbox rdf:resource="mailto:[email protected]" /> | |
19 | <gnome:userid>csoriano</gnome:userid> | |
20 | </foaf:Person> | |
21 | </maintainer> | |
22 | <maintainer> | |
23 | <foaf:Person> | |
24 | <foaf:name>Florian Müllner</foaf:name> | |
25 | <foaf:mbox rdf:resource="mailto:[email protected]" /> | |
26 | <gnome:userid>fmuellner</gnome:userid> | |
27 | </foaf:Person> | |
28 | </maintainer> | |
29 | <maintainer> | |
30 | <foaf:Person> | |
31 | <foaf:name>Jakub Steiner</foaf:name> | |
32 | <foaf:mbox rdf:resource="mailto:[email protected]" /> | |
33 | <gnome:userid>jimmac</gnome:userid> | |
34 | </foaf:Person> | |
35 | </maintainer> | |
36 | </Project> |
0 | // Pointer location | |
1 | .ripple-pointer-location { | |
2 | width: $ripple_size; | |
3 | height: $ripple_size; | |
4 | border-radius: $ripple_size * 0.5; // radius equals the size of the box to give us the curve | |
5 | background-color: lighten(transparentize($selected_bg_color, 0.7), 30%); | |
6 | box-shadow: 0 0 2px 2px lighten($selected_bg_color, 20%); | |
7 | } | |
8 | ||
9 | // Pointer accessibility notifications | |
10 | .pie-timer { | |
11 | width: 60px; | |
12 | height: 60px; | |
13 | -pie-border-width: 3px; | |
14 | -pie-border-color: $selected_bg_color; | |
15 | -pie-background-color: lighten(transparentize($selected_bg_color, 0.7), 40%); | |
16 | } | |
17 | ||
18 | // Screen zoom/Magnifier | |
19 | .magnifier-zoom-region { | |
20 | border: 2px solid $selected_bg_color; | |
21 | ||
22 | &.full-screen { border-width: 0; } | |
23 | } |
0 | /* App Grid */ | |
1 | ||
2 | $app_icon_size: 96px; | |
3 | ||
4 | // app icons | |
5 | .icon-grid { | |
6 | row-spacing: $base_spacing * 6; | |
7 | column-spacing: $base_spacing * 6; | |
8 | max-row-spacing: $base_spacing * 12; | |
9 | max-column-spacing: $base_spacing * 12; | |
10 | } | |
11 | ||
12 | /* App Icons */ | |
13 | ||
14 | $app_grid_fg_color: #fff; | |
15 | ||
16 | // Icon tiles in the app grid | |
17 | .app-well-app, | |
18 | %app-well-app { | |
19 | @include overview-icon($app_grid_fg_color); | |
20 | ||
21 | .overview-icon.overview-icon-with-label { | |
22 | padding: 10px 8px 5px 8px; | |
23 | ||
24 | > StBoxLayout { | |
25 | spacing: $base_spacing; | |
26 | } | |
27 | } | |
28 | } | |
29 | ||
30 | /* App Folders */ | |
31 | .app-well-app.app-folder { | |
32 | background-color: transparentize($osd_bg_color, 0.8); | |
33 | border-radius: $base_border_radius + 4px; // same as %icon_tile | |
34 | } | |
35 | ||
36 | // expanded folder | |
37 | .app-folder-dialog { | |
38 | border-radius: $modal_radius * 1.5; | |
39 | border: 1px solid $osd_outer_borders_color; | |
40 | background-color: transparentize(darken($osd_bg_color,10%), 0.05); | |
41 | padding: 12px; | |
42 | ||
43 | & .folder-name-container { | |
44 | padding: 24px 36px 0; | |
45 | spacing: 12px; | |
46 | ||
47 | & .folder-name-label, | |
48 | & .folder-name-entry { | |
49 | font-size: 18pt; | |
50 | font-weight: 800; | |
51 | } | |
52 | ||
53 | & .folder-name-entry { width: 300px } | |
54 | ||
55 | /* FIXME: this is to keep the label in sync with the entry */ | |
56 | & .folder-name-label { padding: 5px 7px; color: $osd_fg_color; } | |
57 | ||
58 | & .edit-folder-button { | |
59 | @extend %button; | |
60 | ||
61 | padding: 0; | |
62 | width: 36px; | |
63 | height: 36px; | |
64 | border-radius: 18px; | |
65 | ||
66 | & > StIcon { icon-size: 16px } | |
67 | } | |
68 | } | |
69 | ||
70 | & .icon-grid { | |
71 | row-spacing: $base_spacing * 2; | |
72 | column-spacing: $base_spacing * 5; | |
73 | } | |
74 | ||
75 | & .page-indicators { | |
76 | margin-bottom: 18px; | |
77 | ||
78 | .page-indicator { | |
79 | padding: 15px 12px; | |
80 | } | |
81 | } | |
82 | } | |
83 | .app-folder-dialog-container { | |
84 | padding: 12px; | |
85 | width: 620px; | |
86 | height: 620px; | |
87 | } | |
88 | ||
89 | .app-folder-icon { | |
90 | padding: $base_padding; | |
91 | spacing-rows: $base_spacing; | |
92 | spacing-columns: $base_spacing; | |
93 | } | |
94 | ||
95 | ||
96 | // Running app indicator (also shown in dash) | |
97 | .app-well-app-running-dot { | |
98 | height: 5px; | |
99 | width: 5px; | |
100 | border-radius:5px; | |
101 | background-color: $osd_fg_color; | |
102 | margin-bottom: 1px; | |
103 | } | |
104 | ||
105 | // Rename popup for app folders | |
106 | .rename-folder-popup { | |
107 | .rename-folder-popup-item { | |
108 | spacing: $base_spacing; | |
109 | &:ltr, &:rtl { padding: 0 $base_padding * 2; } | |
110 | } | |
111 | } | |
112 | ||
113 | // right-click app menu | |
114 | .app-menu, | |
115 | .app-well-menu { | |
116 | max-width: 27.25em; | |
117 | } | |
118 | ||
119 | // App Grid pagination indicators | |
120 | .page-indicator { | |
121 | padding: 15px 20px; | |
122 | ||
123 | .page-indicator-icon { | |
124 | width: 10px; | |
125 | height: 10px; | |
126 | border-radius: 10px; // the same as height&width | |
127 | background-color: white; | |
128 | } | |
129 | } | |
130 | ||
131 | // Some hacks I don't even know | |
132 | .all-apps { | |
133 | // horizontal padding to make sure scrollbars or dash don't overlap content | |
134 | padding: 0px 88px 10px 88px; | |
135 | } | |
136 | ||
137 | // shutdown and other actions in the grid | |
138 | .system-action-icon { | |
139 | background-color: rgba(0,0,0,0.8); | |
140 | color: #fff; | |
141 | border-radius: 99px; | |
142 | icon-size: $app_icon_size * 0.5; | |
143 | } |
0 | // Links | |
1 | .shell-link { | |
2 | color: $link_color; | |
3 | ||
4 | &:hover { | |
5 | color: lighten($link_color, 10%); | |
6 | } | |
7 | } | |
8 | ||
9 | // Outline for low res icons | |
10 | .lowres-icon { | |
11 | icon-shadow: 0 1px 2px rgba(black, 0.3); | |
12 | } | |
13 | ||
14 | // Dropshadow for large icons | |
15 | .icon-dropshadow { | |
16 | icon-shadow: 0 1px 2px rgba(black, 0.4); | |
17 | } |
0 | /* Date/Time Menu */ | |
1 | ||
2 | .clock-display-box { | |
3 | spacing: $base_spacing / 2; | |
4 | ||
5 | .clock { | |
6 | padding-left: $base_padding; | |
7 | padding-right: $base_padding; | |
8 | } | |
9 | } | |
10 | ||
11 | // overall menu | |
12 | #calendarArea { | |
13 | padding:0; | |
14 | } | |
15 | ||
16 | // Calendar menu side column | |
17 | .datemenu-calendar-column { | |
18 | spacing: $base_spacing; | |
19 | border: 0 solid $bubble_borders_color; | |
20 | padding: 0 $base_padding * 2; | |
21 | ||
22 | &:ltr {margin-right: $base_margin * 2; border-left-width: 1px; } | |
23 | &:rtl {margin-left: $base_margin * 2; border-right-width: 1px; } | |
24 | ||
25 | .datemenu-displays-section { | |
26 | } | |
27 | ||
28 | .datemenu-displays-box { | |
29 | spacing: $base_spacing; | |
30 | } | |
31 | } | |
32 | ||
33 | .events-section-title { | |
34 | @include notification_bubble($flat: true); | |
35 | color: desaturate(darken($fg_color,40%), 10%); | |
36 | font-weight: bold; | |
37 | padding: .4em; | |
38 | } | |
39 | ||
40 | /* today button (the date) */ | |
41 | .datemenu-today-button { | |
42 | @include notification_bubble($flat: true); | |
43 | padding: $base_padding * 1.5; | |
44 | ||
45 | // weekday label | |
46 | .day-label { | |
47 | @include fontsize($base_font_size+1); | |
48 | font-weight: bold; | |
49 | } | |
50 | ||
51 | // date label | |
52 | .date-label { | |
53 | @include fontsize($base_font_size+7); | |
54 | font-weight: 1000; | |
55 | } | |
56 | } | |
57 | ||
58 | /* Calendar */ | |
59 | .calendar { | |
60 | @include notification_bubble; | |
61 | padding: $base_padding; | |
62 | ||
63 | // month | |
64 | .calendar-month-label { | |
65 | color: lighten($fg_color,5%); | |
66 | font-weight: bold; | |
67 | padding: 8px 0; | |
68 | &:focus {} | |
69 | } | |
70 | ||
71 | // prev/next month icons | |
72 | .calendar-change-month-back StIcon, | |
73 | .calendar-change-month-forward StIcon { | |
74 | icon-size: $base_icon_size; | |
75 | } | |
76 | ||
77 | .pager-button { | |
78 | background-color: transparent; | |
79 | height: 32px; | |
80 | width: 32px; | |
81 | border-radius: $base_border_radius; | |
82 | &:hover, &:focus { background-color: lighten($hover_bg_color, 5%); } | |
83 | &:active { background-color: $active_bg_color; } | |
84 | } | |
85 | ||
86 | ||
87 | $calendar_day_size: 32px; | |
88 | ||
89 | .calendar-day-base { | |
90 | @include fontsize($base_font_size - 3); | |
91 | text-align: center; | |
92 | width: $calendar_day_size; | |
93 | height: $calendar_day_size; | |
94 | padding: 0; | |
95 | margin: 2px; | |
96 | border-radius: $calendar_day_size * 0.5 + 2px; | |
97 | border: 1px solid transparent; //avoid jumparound due to today | |
98 | font-feature-settings: "tnum"; | |
99 | &:hover, &:focus { background-color: $hover_bg_color; } | |
100 | &:active,&:selected { | |
101 | color: lighten($fg_color,10%); | |
102 | background-color: darken($bg_color,5%); | |
103 | } | |
104 | ||
105 | // day of week heading | |
106 | &.calendar-day-heading { | |
107 | color: lighten($fg_color,10%); | |
108 | margin-top: 1em; | |
109 | @include fontsize($base_font_size - 4); | |
110 | } | |
111 | } | |
112 | ||
113 | .calendar-day { //border collapse hack - see calendar.js | |
114 | border-width: 0; | |
115 | } | |
116 | ||
117 | .calendar-day-top { | |
118 | border-top-width: 1px; | |
119 | } | |
120 | ||
121 | .calendar-day-left { | |
122 | border-left-width: 1px; | |
123 | } | |
124 | ||
125 | .calendar-work-day {} | |
126 | ||
127 | .calendar-nonwork-day { | |
128 | color: $insensitive_fg_color; | |
129 | } | |
130 | ||
131 | // Today | |
132 | .calendar-today { | |
133 | font-weight: bold; | |
134 | border: 1px solid transparent; | |
135 | background-color: $selected_bg_color; | |
136 | color: $selected_fg_color; | |
137 | ||
138 | &:hover,&:focus { | |
139 | background-color:lighten($selected_bg_color, 3%); | |
140 | color: $selected_fg_color; | |
141 | } | |
142 | ||
143 | &:active,&:selected { | |
144 | background-color: $selected_bg_color; | |
145 | color: $selected_fg_color; | |
146 | ||
147 | &:hover,&:focus { | |
148 | background-color:lighten($selected_bg_color, 3%); | |
149 | color: $selected_fg_color; | |
150 | } | |
151 | } | |
152 | } | |
153 | ||
154 | .calendar-day-with-events { | |
155 | background-image: url("resource:///org/gnome/shell/theme/calendar-today.svg"); | |
156 | &.calendar-work-day { | |
157 | color: lighten($fg_color,10%); | |
158 | font-weight: bold; | |
159 | } | |
160 | } | |
161 | ||
162 | .calendar-other-month-day { | |
163 | color: transparentize($fg_color ,0.5); | |
164 | } | |
165 | ||
166 | .calendar-week-number { | |
167 | @include fontsize($base_font_size - 4); | |
168 | font-weight: bold; | |
169 | height: 1.8em; | |
170 | width: 2.3em; | |
171 | border-radius: 2px; | |
172 | margin: 6px; | |
173 | background-color: darken($bg_color, 2%); | |
174 | color: lighten($fg_color, 5%); | |
175 | } | |
176 | } | |
177 | ||
178 | /* Events */ | |
179 | .events-button { | |
180 | @include notification_bubble; | |
181 | padding: $base_padding * 2; | |
182 | ||
183 | .events-box { | |
184 | spacing: $base_spacing; | |
185 | } | |
186 | ||
187 | .events-list { | |
188 | spacing: 2 * $base_spacing; | |
189 | } | |
190 | ||
191 | .events-title { | |
192 | color: desaturate(darken($fg_color,40%), 10%); | |
193 | font-weight: bold; | |
194 | margin-bottom: $base_margin; | |
195 | } | |
196 | ||
197 | .event-time { | |
198 | color: darken($fg_color,20%); | |
199 | font-feature-settings: "tnum"; | |
200 | @include fontsize($base_font_size - 1); | |
201 | } | |
202 | } | |
203 | ||
204 | /* World clocks */ | |
205 | .world-clocks-button { | |
206 | @include notification_bubble; | |
207 | padding: $base_padding * 2; | |
208 | ||
209 | .world-clocks-grid { | |
210 | spacing-rows: $base_spacing; | |
211 | spacing-columns: $base_spacing * 2; | |
212 | } | |
213 | ||
214 | // title | |
215 | .world-clocks-header { | |
216 | color: desaturate(darken($fg_color,40%), 10%); | |
217 | font-weight: bold; | |
218 | } | |
219 | ||
220 | // city label | |
221 | .world-clocks-city { | |
222 | color: $fg_color; | |
223 | @include fontsize($base_font_size); | |
224 | font-weight: normal; | |
225 | } | |
226 | ||
227 | // timezone time | |
228 | .world-clocks-time { | |
229 | font-weight: bold; | |
230 | color: $fg_color; | |
231 | font-feature-settings: "tnum"; | |
232 | @include fontsize($base_font_size); | |
233 | ||
234 | &:ltr { text-align: right; } | |
235 | &:rtl { text-align: left; } | |
236 | } | |
237 | ||
238 | // timezone offset label | |
239 | .world-clocks-timezone { | |
240 | color: darken($fg_color,20%); | |
241 | font-feature-settings: "tnum"; | |
242 | @include fontsize($base_font_size - 1); | |
243 | } | |
244 | } | |
245 | ||
246 | /* Weather */ | |
247 | .weather-button { | |
248 | @include notification_bubble; | |
249 | padding: $base_padding * 2; | |
250 | ||
251 | .weather-box { | |
252 | spacing: $base_spacing + $base_margin; | |
253 | } | |
254 | ||
255 | .weather-header-box { | |
256 | spacing: $base_spacing; | |
257 | } | |
258 | ||
259 | .weather-header { | |
260 | color: desaturate(darken($fg_color,40%), 10%); | |
261 | font-weight: bold; | |
262 | ||
263 | &.location { | |
264 | font-weight: normal; | |
265 | @include fontsize($base_font_size - 1); | |
266 | } | |
267 | } | |
268 | ||
269 | .weather-grid { | |
270 | spacing-rows: $base_spacing; | |
271 | spacing-columns: $base_spacing * 2; | |
272 | } | |
273 | ||
274 | .weather-forecast-time { | |
275 | color: darken($fg_color,30%); | |
276 | font-feature-settings: "tnum"; | |
277 | @include fontsize($base_font_size - 2); | |
278 | font-weight: normal; | |
279 | padding-top: 0.2em; | |
280 | padding-bottom: 0.4em; | |
281 | } | |
282 | ||
283 | .weather-forecast-icon { | |
284 | icon-size: $base_icon_size * 2; | |
285 | } | |
286 | ||
287 | .weather-forecast-temp { | |
288 | font-weight: bold; | |
289 | } | |
290 | } |
0 | /* Check Boxes */ | |
1 | ||
2 | // these are equal to the size of the SVG assets | |
3 | $check_height: 22px; | |
4 | $check_width: 24px; | |
5 | ||
6 | ||
7 | .check-box { | |
8 | StBoxLayout { spacing: .8em; } | |
9 | StBin { | |
10 | width: $check_width; | |
11 | height: $check_height; | |
12 | background-image: url("resource:///org/gnome/shell/theme/checkbox-off.svg"); | |
13 | } | |
14 | &:focus StBin { background-image: url("resource:///org/gnome/shell/theme/checkbox-off-focused.svg"); } | |
15 | &:checked StBin { background-image: url("resource:///org/gnome/shell/theme/checkbox.svg"); } | |
16 | &:focus:checked StBin { background-image: url("resource:///org/gnome/shell/theme/checkbox-focused.svg"); } | |
17 | }⏎ |
0 | /* Activities Ripple */ | |
1 | ||
2 | $ripple_size: 50px; | |
3 | ||
4 | .ripple-box { | |
5 | background-color: lighten(transparentize($selected_bg_color, 0.7), 40%); | |
6 | box-shadow: 0 0 2px 2px lighten($selected_bg_color, 20%); | |
7 | // plus + 2px for the border (box-shadow) | |
8 | width: $ripple_size + 2px; | |
9 | height: $ripple_size + 2px; | |
10 | border-radius: 0 0 $ripple_size + 2px 0; // radius equals the size of the box to give us the curve | |
11 | ||
12 | // just a simple change to the border radius position | |
13 | &:rtl { border-radius: 0 0 0 $ripple_size + 2px; } | |
14 | } |
0 | /* Dash */ | |
1 | ||
2 | $dash_placeholder_size: 32px; | |
3 | $dash_spacing: $base_padding + 4px; | |
4 | $dash_border_radius: $modal_radius * 1.5; | |
5 | ||
6 | #dash { | |
7 | @extend %overview_panel; | |
8 | @include fontsize($base_font_size - 2); | |
9 | padding: ($dash_spacing / 2) 0; | |
10 | ||
11 | border-radius: 0 $dash_border_radius $dash_border_radius 0; | |
12 | border-left-width: 0; | |
13 | &:rtl { | |
14 | border-radius: $dash_border_radius 0 0 $dash_border_radius; | |
15 | border-right-width: 0; | |
16 | } | |
17 | ||
18 | .placeholder { | |
19 | // background-image: url("resource:///org/gnome/shell/theme/dash-placeholder.svg"); | |
20 | background-image:none; | |
21 | background-size: contain; | |
22 | height: $dash_placeholder_size; | |
23 | } | |
24 | ||
25 | .empty-dash-drop-target { | |
26 | width: $dash_placeholder_size; | |
27 | height: $dash_placeholder_size; | |
28 | } | |
29 | } | |
30 | ||
31 | // Dash Items | |
32 | .dash-item-container > StWidget { | |
33 | padding: ($dash_spacing / 2) $dash_spacing; | |
34 | } | |
35 | ||
36 | // OSD Tooltip | |
37 | .dash-label { | |
38 | background-color: transparentize($osd_bg_color,0.05); | |
39 | border-radius: $base_border_radius + 2px; | |
40 | border:none; | |
41 | box-shadow:0 0 0 1px $osd_outer_borders_color; | |
42 | color: $osd_fg_color; | |
43 | padding: $base_padding $base_padding + 2px; | |
44 | text-align: center; | |
45 | -x-offset: $base_margin * 2; // distance from the dash edge | |
46 | } | |
47 | ||
48 | // Show apps button | |
49 | .show-apps { | |
50 | @include overview-icon($osd_fg_color); | |
51 | ||
52 | &:focus, | |
53 | &:checked { | |
54 | .overview-icon { | |
55 | background-color: darken($osd_bg_color,10%); | |
56 | color: $fg_color; | |
57 | } | |
58 | } | |
59 | } | |
60 |
0 | /* Modal Dialogs */ | |
1 | ||
2 | .headline { | |
3 | @include fontsize($base_font_size + 1); | |
4 | } | |
5 | ||
6 | .modal-dialog { | |
7 | border-radius: $modal_radius; | |
8 | @extend %bubble_panel; | |
9 | ||
10 | .modal-dialog-content-box { | |
11 | margin: 32px 40px; | |
12 | spacing: 32px; | |
13 | max-width: 28em; | |
14 | } | |
15 | ||
16 | .modal-dialog-linked-button { | |
17 | @extend %bubble_button; | |
18 | } | |
19 | } | |
20 | ||
21 | /* End Session Dialog */ | |
22 | .end-session-dialog { | |
23 | width: 30em; | |
24 | ||
25 | .end-session-dialog-battery-warning, | |
26 | .dialog-list-title { | |
27 | color: $warning_color; | |
28 | } | |
29 | } | |
30 | ||
31 | /* Message Dialog */ | |
32 | .message-dialog-content { | |
33 | spacing: 18px; | |
34 | ||
35 | .message-dialog-title { | |
36 | text-align: center; | |
37 | font-size: 18pt; | |
38 | font-weight: 800; | |
39 | ||
40 | &.lightweight { | |
41 | font-size: 13pt; | |
42 | font-weight: 800; | |
43 | } | |
44 | } | |
45 | .message-dialog-description { text-align: center; } | |
46 | } | |
47 | ||
48 | /* Dialog List */ | |
49 | .dialog-list { | |
50 | spacing: 18px; | |
51 | ||
52 | .dialog-list-title { | |
53 | text-align: center; | |
54 | font-weight: bold; | |
55 | } | |
56 | ||
57 | .dialog-list-scrollview { max-height: 200px; } | |
58 | .dialog-list-box { | |
59 | spacing: 1em; | |
60 | ||
61 | .dialog-list-item { | |
62 | spacing: 1em; | |
63 | ||
64 | .dialog-list-item-title { font-weight: bold; } | |
65 | .dialog-list-item-description { | |
66 | color: darken($fg_color,5%); | |
67 | @include fontsize($base_font_size - 1); | |
68 | } | |
69 | } | |
70 | } | |
71 | } | |
72 | ||
73 | /* Run Dialog */ | |
74 | .run-dialog { | |
75 | .modal-dialog-content-box { | |
76 | margin-top: 24px; | |
77 | margin-bottom: 14px; | |
78 | } | |
79 | .run-dialog-entry { width: 20em; } | |
80 | .run-dialog-description { | |
81 | @include fontsize($base_font_size - 1); | |
82 | text-align: center; | |
83 | color: darken($fg_color, 20%); | |
84 | } | |
85 | } | |
86 | ||
87 | /* Password or Authentication Dialog */ | |
88 | ||
89 | .prompt-dialog { | |
90 | width: 28em; | |
91 | ||
92 | .modal-dialog-content-box { | |
93 | margin-bottom: 24px; | |
94 | } | |
95 | } | |
96 | ||
97 | .prompt-dialog-password-grid { | |
98 | spacing-rows: 8px; | |
99 | spacing-columns: 4px; | |
100 | ||
101 | .prompt-dialog-password-entry { | |
102 | width: auto; | |
103 | ||
104 | // 4px (spacing) + 16px (spinner-width) | |
105 | &:ltr { margin-left: 20px; } | |
106 | &:rtl { margin-right: 20px; } | |
107 | } | |
108 | } | |
109 | ||
110 | .prompt-dialog-password-layout { | |
111 | spacing: 8px; | |
112 | } | |
113 | ||
114 | .prompt-dialog-password-entry { | |
115 | width: 20em; | |
116 | } | |
117 | ||
118 | .prompt-dialog-error-label, | |
119 | .prompt-dialog-info-label, | |
120 | .prompt-dialog-null-label { | |
121 | text-align: center; | |
122 | @include fontsize($base_font_size - 1); | |
123 | } | |
124 | ||
125 | .prompt-dialog-error-label { | |
126 | color: $warning_color; | |
127 | } | |
128 | ||
129 | ||
130 | /* Polkit Dialog */ | |
131 | ||
132 | .polkit-dialog-user-layout { | |
133 | text-align: center; | |
134 | spacing: 8px; | |
135 | margin-bottom: 6px; | |
136 | ||
137 | .polkit-dialog-user-icon { | |
138 | border-radius: 99px; | |
139 | background-size: contain; | |
140 | } | |
141 | .polkit-dialog-user-root-label { color: $warning_color; } | |
142 | } | |
143 | ||
144 | /* Audio selection dialog */ | |
145 | .audio-device-selection-dialog { | |
146 | .modal-dialog-content-box { margin-bottom: 28px; } | |
147 | .audio-selection-box { spacing: 20px; } | |
148 | } | |
149 | ||
150 | .audio-selection-device { | |
151 | border: 1px solid $bubble_borders_color; | |
152 | border-radius: 12px; | |
153 | &:hover,&:focus { background-color: $hover_bg_color; } | |
154 | &:active { | |
155 | background-color: $selected_bg_color; | |
156 | color: $selected_fg_color; | |
157 | } | |
158 | } | |
159 | ||
160 | .audio-selection-device-box { | |
161 | padding: 20px; | |
162 | spacing: 20px; | |
163 | } | |
164 | ||
165 | .audio-selection-device-icon { | |
166 | icon-size: $base_icon_size * 4; | |
167 | } |
0 | /* Entries */ | |
1 | ||
2 | StEntry { | |
3 | border-radius: $base_border_radius; | |
4 | padding: 8px; | |
5 | border-width: 1px; | |
6 | color: $fg_color; | |
7 | @include entry(normal); | |
8 | //&:hover { @include entry(hover);} | |
9 | &:focus { @include entry(focus);} | |
10 | &:insensitive { @include entry(insensitive);} | |
11 | selection-background-color: $selected_bg_color; | |
12 | selected-color: $selected_fg_color; | |
13 | StIcon.capslock-warning { | |
14 | icon-size: 16px; | |
15 | warning-color: $warning_color; | |
16 | padding: 0 4px; | |
17 | } | |
18 | StIcon.peek-password { | |
19 | icon-size: $base_icon_size; | |
20 | padding: 0 4px; | |
21 | } | |
22 | StLabel.hint-text { | |
23 | margin-left: 2px; | |
24 | color: transparentize($fg_color, 0.3); | |
25 | } | |
26 | } |
0 | // hotplug | |
1 | ||
2 | .hotplug-notification-item { | |
3 | @extend %bubble_button; | |
4 | } | |
5 | ||
6 | .hotplug-notification-item-icon { | |
7 | icon-size: 24px; | |
8 | padding: 0 4px; | |
9 | } |
0 | // IBus Candidate Popup | |
1 | ||
2 | .candidate-popup-boxpointer { | |
3 | @extend .popup-menu-boxpointer; | |
4 | } | |
5 | ||
6 | .candidate-popup-content { | |
7 | padding: 0.5em; | |
8 | spacing: 0.3em; | |
9 | } | |
10 | ||
11 | .candidate-index { | |
12 | padding: 0 0.5em 0 0; | |
13 | color: darken($fg_color,10%); | |
14 | } | |
15 | ||
16 | .candidate-box { | |
17 | padding: 0.3em 0.5em 0.3em 0.5em; | |
18 | border-radius: $base_border_radius; | |
19 | &:selected,&:hover { background-color: $selected_bg_color; color: $selected_fg_color; } | |
20 | } | |
21 | ||
22 | .candidate-page-button-box { | |
23 | height: 2em; | |
24 | .vertical & { padding-top: 0.5em; } | |
25 | .horizontal & { padding-left: 0.5em; } | |
26 | } | |
27 | ||
28 | .candidate-page-button { | |
29 | padding: 4px; | |
30 | } | |
31 | ||
32 | .candidate-page-button-previous { border-radius: $base_border_radius 0px 0px $base_border_radius; border-right-width: 0; } | |
33 | .candidate-page-button-next { border-radius: 0px $base_border_radius $base_border_radius 0px; } | |
34 | .candidate-page-button-icon { icon-size: 1em; }⏎ |
0 | /* On-screen Keyboard */ | |
1 | ||
2 | $key_size: 1.2em; | |
3 | $key_border_radius: $base_border_radius + 3px; | |
4 | $key_bg_color: $bg_color; | |
5 | // $default_key_bg_color: darken($key_bg_color, 4%); | |
6 | $default_key_bg_color: if($variant=='light', darken($osd_bg_color, 11%), lighten($osd_bg_color, 2%)); | |
7 | ||
8 | ||
9 | // draw keys using button function | |
10 | #keyboard { | |
11 | background-color: transparentize(if($variant=='light', darken($bg_color, 5%), darken($bg_color, 8%)), 0.1); | |
12 | box-shadow: inset 0 1px 0 0 $osd_outer_borders_color; | |
13 | ||
14 | .page-indicator { | |
15 | padding: $base_padding; | |
16 | ||
17 | .page-indicator-icon { | |
18 | width: 8px; | |
19 | height: 8px; | |
20 | } | |
21 | } | |
22 | } | |
23 | ||
24 | // the container for individual keys | |
25 | .key-container { | |
26 | padding: $base_margin; | |
27 | spacing: $base_margin; | |
28 | } | |
29 | ||
30 | // the keys | |
31 | .keyboard-key { | |
32 | ||
33 | @include button(normal, $c:$key_bg_color); | |
34 | ||
35 | &:focus { @include button(focus);} | |
36 | &:hover, &:checked { @include button(hover, $c: $key_bg_color);} | |
37 | &:active { @include button(active, $c: $key_bg_color); } | |
38 | ||
39 | @include fontsize($base_font_size + 5); | |
40 | min-height: $key_size; | |
41 | min-width: $key_size; | |
42 | border-width: 1px; | |
43 | border-style: solid; | |
44 | border-radius: $key_border_radius; | |
45 | ||
46 | &:grayed { //FIXMEy | |
47 | background-color: darken($bg_color, 3%); | |
48 | color: $osd_fg_color; | |
49 | border-color: $osd_borders_color; | |
50 | } | |
51 | ||
52 | // non-character keys | |
53 | &.default-key { | |
54 | @include button(normal, $c:$default_key_bg_color); | |
55 | &:hover, &:checked {@include button(hover, $c: $default_key_bg_color);} | |
56 | &:active { @include button(active, $c: $default_key_bg_color);} | |
57 | } | |
58 | ||
59 | // enter key is suggested-action | |
60 | &.enter-key { | |
61 | @include button(normal, $c:$selected_bg_color, $tc:$selected_fg_color); | |
62 | &:hover, &:checked { @include button(hover, $c: lighten($selected_bg_color, 3%));} | |
63 | &:active {@include button(active, $c: darken($selected_bg_color, 2%));} | |
64 | } | |
65 | ||
66 | &.shift-key-uppercase { color: $selected_bg_color } | |
67 | ||
68 | StIcon { icon-size: 1.125em; } | |
69 | } | |
70 | ||
71 | // long press on a key popup | |
72 | .keyboard-subkeys { | |
73 | color: $osd_fg_color; | |
74 | -arrow-border-radius: $modal_radius; | |
75 | -arrow-background-color: $osd_bg_color; | |
76 | -arrow-border-width: 1px; | |
77 | -arrow-border-color: lighten($osd_bg_color, 9%); | |
78 | -arrow-base: 20px; | |
79 | -arrow-rise: 10px; | |
80 | -boxpointer-gap: $base_spacing; | |
81 | ||
82 | .keyboard-key { | |
83 | @include button(normal, $c:$key_bg_color); | |
84 | ||
85 | &:focus { @include button(focus);} | |
86 | &:hover, &:checked { @include button(hover, $c: $key_bg_color);} | |
87 | &:active { @include button(active, $c: $key_bg_color); } | |
88 | ||
89 | border-radius:$base_border_radius; | |
90 | } | |
91 | } | |
92 | ||
93 | // emoji | |
94 | .emoji-page { | |
95 | .keyboard-key { | |
96 | background-color: transparent; | |
97 | border: none; | |
98 | color: initial; | |
99 | } | |
100 | } | |
101 | ||
102 | .emoji-panel { | |
103 | .keyboard-key:latched { | |
104 | border-color: lighten($selected_bg_color, 5%); | |
105 | background-color: $selected_bg_color; | |
106 | } | |
107 | } | |
108 | ||
109 | // suggestions | |
110 | .word-suggestions { | |
111 | @include fontsize($base_font_size + 3); | |
112 | spacing: 12px; | |
113 | min-height: 20pt; | |
114 | } |
0 | /* Login Dialog */ | |
1 | ||
2 | .login-dialog-banner-view { | |
3 | padding-top: 24px; | |
4 | max-width: 23em; | |
5 | } | |
6 | ||
7 | .login-dialog { | |
8 | //reset | |
9 | border: none; | |
10 | background-color: transparent; | |
11 | ||
12 | $_gdm_bg: lighten(#2e3436, 19%); | |
13 | ||
14 | StEntry { | |
15 | @if $variant=='dark' { | |
16 | $_gdm_entry_bg: transparentize(lighten(desaturate(#241f31, 20%), 2%), 0.5); | |
17 | background-color: $_gdm_entry_bg; | |
18 | color: $osd_fg_color; | |
19 | } | |
20 | } | |
21 | ||
22 | .modal-dialog-button-box { spacing: 3px; } | |
23 | .modal-dialog-button { | |
24 | padding: 4px 18px; | |
25 | box-shadow: 0 1px 3px rgba(0,0,0,0.2); | |
26 | background-color: $_gdm_bg; | |
27 | border-color: $_gdm_bg; | |
28 | color: $fg_color; | |
29 | ||
30 | $_hover_c: lighten($_gdm_bg, 5%); | |
31 | &:hover, &:focus { | |
32 | background-color: $_hover_c; | |
33 | border-color: $_hover_c; | |
34 | } | |
35 | &:active { | |
36 | $_active_c: darken($_gdm_bg, 5%); | |
37 | box-shadow: none; | |
38 | background-color: $_active_c; | |
39 | border-color: $_active_c; | |
40 | } | |
41 | &:insensitive { | |
42 | @include button(insensitive); | |
43 | border-color: darken($_gdm_bg, 5%); | |
44 | background-color: darken($_gdm_bg, 5%); | |
45 | color: transparentize($fg_color, 0.3); | |
46 | } | |
47 | &:default { | |
48 | @include button(normal, $c:$selected_bg_color, $tc:$selected_fg_color); | |
49 | border-color: $selected_bg_color; | |
50 | &:hover, &:focus { | |
51 | @include button(hover,$c:$selected_bg_color, $tc:$selected_fg_color); | |
52 | $_def_hover_c: lighten($selected_bg_color, 5%); | |
53 | background-color: $_def_hover_c; | |
54 | border-color: $_def_hover_c; | |
55 | } | |
56 | &:active { | |
57 | @include button(active,$c:$selected_bg_color, $tc:$selected_fg_color); | |
58 | $_def_active_c: darken($selected_bg_color, 5%); | |
59 | background-color: $_def_active_c; | |
60 | border-color: $_def_active_c; | |
61 | } | |
62 | &:insensitive { | |
63 | @include button(insensitive); | |
64 | border-color: darken($selected_bg_color, 10%); | |
65 | background-color: darken($selected_bg_color, 10%); | |
66 | color: transparentize($selected_fg_color, 0.3); | |
67 | } | |
68 | } | |
69 | } | |
70 | ||
71 | .cancel-button, | |
72 | .switch-user-button, | |
73 | .login-dialog-session-list-button { | |
74 | padding: 0; | |
75 | border-radius: 99px; | |
76 | width: $base_icon_size * 2; | |
77 | height: $base_icon_size * 2; | |
78 | border-color: transparentize($bg_color,0.7); | |
79 | background-color: transparentize($bg_color,0.7); | |
80 | ||
81 | StIcon { icon-size: $base_icon_size; } | |
82 | } | |
83 | ||
84 | .caps-lock-warning-label, | |
85 | .login-dialog-message-warning { | |
86 | color: $osd_fg_color; | |
87 | } | |
88 | } | |
89 | ||
90 | .login-dialog-logo-bin { padding: 24px 0px; } | |
91 | .login-dialog-banner { color: darken($osd_fg_color,10%); } | |
92 | .login-dialog-button-box { width: 23em; spacing: 5px; } | |
93 | .login-dialog-message { text-align: center; } | |
94 | .login-dialog-message-hint { padding-top: 0; padding-bottom: 20px; } | |
95 | .login-dialog-user-selection-box { padding: 100px 0px; } | |
96 | .login-dialog-not-listed-label { | |
97 | padding-left: 2px; | |
98 | .login-dialog-not-listed-button:focus &, | |
99 | .login-dialog-not-listed-button:hover & { | |
100 | color: $osd_fg_color; | |
101 | } | |
102 | } | |
103 | ||
104 | .login-dialog-not-listed-label { | |
105 | @include fontsize($base_font_size - 1); | |
106 | font-weight: bold; | |
107 | color: darken($osd_fg_color,30%); | |
108 | padding-top: 1em; | |
109 | } | |
110 | ||
111 | .login-dialog-user-list-view { -st-vfade-offset: 1em; } | |
112 | .login-dialog-user-list { | |
113 | spacing: 12px; | |
114 | width: 23em; | |
115 | &:expanded .login-dialog-user-list-item:selected { background-color: $selected_bg_color; color: $selected_fg_color; } | |
116 | &:expanded .login-dialog-user-list-item:logged-in { border-right: 2px solid $selected_bg_color; } | |
117 | } | |
118 | ||
119 | .login-dialog-user-list-item { | |
120 | border-radius: $base_border_radius + 4px; | |
121 | padding: 6px; | |
122 | color: darken($osd_fg_color,30%); | |
123 | &:ltr .user-widget { padding-right: 1em; } | |
124 | &:rtl .user-widget { padding-left: 1em; } | |
125 | .login-dialog-timed-login-indicator { | |
126 | height: 2px; | |
127 | margin-top: 6px; | |
128 | background-color: $osd_fg_color; | |
129 | } | |
130 | &:focus .login-dialog-timed-login-indicator { background-color: $selected_fg_color; } | |
131 | } | |
132 | ||
133 | .user-widget-label { | |
134 | color: $osd_fg_color; | |
135 | } | |
136 | ||
137 | .user-widget.horizontal .user-widget-label { | |
138 | @include fontsize($base_font_size + 2); | |
139 | font-weight: bold; | |
140 | padding-left: 15px; | |
141 | ||
142 | &:ltr { padding-left: 14px; text-align: left; } | |
143 | &:rtl { padding-right: 14px; text-align: right; } | |
144 | } | |
145 | ||
146 | .user-widget.vertical .user-widget-label { | |
147 | @include fontsize($base_font_size + 5); | |
148 | text-align: center; | |
149 | font-weight: normal; | |
150 | padding-top: 16px; | |
151 | } | |
152 | ||
153 | .login-dialog-prompt-layout { | |
154 | padding-top: 24px; | |
155 | padding-bottom: 12px; | |
156 | spacing: $base_spacing * 2; | |
157 | width: 23em; | |
158 | } | |
159 | ||
160 | .login-dialog-prompt-entry { | |
161 | height: 1.5em; | |
162 | } | |
163 | ||
164 | .login-dialog-prompt-label { | |
165 | color: darken($osd_fg_color, 20%); | |
166 | @include fontsize($base_font_size + 1); | |
167 | padding-top: 1em; | |
168 | } |
0 | /* Looking Glass */ | |
1 | ||
2 | $text_fg_color: #ccc; | |
3 | ||
4 | // Dialog | |
5 | #LookingGlassDialog { | |
6 | background-color: $osd_bg_color; | |
7 | spacing: $base_spacing; | |
8 | padding: 4px; | |
9 | border: 1px solid transparentize($osd_fg_color, 0.8); | |
10 | border-radius: $base_border_radius; | |
11 | color: $osd_fg_color; | |
12 | ||
13 | & > #Toolbar { | |
14 | border: none; | |
15 | border-radius: $base_border_radius; | |
16 | background-color: $osd_bg_color; | |
17 | } | |
18 | ||
19 | .labels { spacing: $base_spacing; } | |
20 | .notebook-tab { | |
21 | -natural-hpadding: $base_padding * 2; | |
22 | -minimum-hpadding: 6px; | |
23 | font-weight: bold; | |
24 | color: darken($osd_fg_color, 15%); | |
25 | transition-duration: 100ms; | |
26 | padding-left: .3em; | |
27 | padding-right: .3em; | |
28 | border-bottom-width: 2px; | |
29 | &:hover { | |
30 | color: $osd_fg_color; | |
31 | } | |
32 | &:selected { | |
33 | border-bottom-width: 2px; | |
34 | box-shadow: inset 0 -2px 0 0 lighten($selected_bg_color, 5%); | |
35 | color: $osd_fg_color; | |
36 | } | |
37 | } | |
38 | StBoxLayout#EvalBox { padding: 4px; spacing: $base_spacing; } | |
39 | StBoxLayout#ResultsArea { spacing: $base_spacing; } | |
40 | } | |
41 | ||
42 | .lg-dialog { | |
43 | StEntry { | |
44 | background-color: transparentize(lighten($osd_bg_color, 5%), 0.4); | |
45 | color: $osd_fg_color; | |
46 | border-color: transparentize($osd_fg_color, 0.8); | |
47 | min-height: 22px; | |
48 | selection-background-color: $selected_bg_color; | |
49 | selected-color: $selected_fg_color; | |
50 | } | |
51 | .shell-link { | |
52 | color: $link_color; | |
53 | &:hover { color: lighten($link_color, 10%); } | |
54 | &:active { color: darken($link_color, 10%); } | |
55 | } | |
56 | .actor-link { | |
57 | color: $text_fg_color; | |
58 | &:hover { color: lighten($text_fg_color, 20%); } | |
59 | &:active { color: darken($text_fg_color, 20%); } | |
60 | } | |
61 | } | |
62 | ||
63 | .lg-completions-text { | |
64 | font-size: .9em; | |
65 | font-style: italic; | |
66 | } | |
67 | ||
68 | .lg-obj-inspector-title { | |
69 | spacing: $base_spacing; | |
70 | } | |
71 | ||
72 | .lg-obj-inspector-button { | |
73 | border: 1px solid $osd_borders_color; | |
74 | padding: 4px; | |
75 | border-radius: $base_border_radius; | |
76 | &:hover { border: 1px solid #ffffff; } | |
77 | } | |
78 | ||
79 | // Extensions | |
80 | #lookingGlassExtensions { padding: 4px; } | |
81 | ||
82 | .lg-extensions-list { | |
83 | padding: 4px; | |
84 | spacing: 6px; | |
85 | } | |
86 | ||
87 | .lg-extension { | |
88 | border: 1px solid lighten($osd_borders_color, 5%); | |
89 | background-color: lighten($osd_bg_color, 5%); | |
90 | border-radius: $base_border_radius; | |
91 | padding: 4px; | |
92 | } | |
93 | ||
94 | .lg-extension-name { | |
95 | font-weight: bold; | |
96 | } | |
97 | ||
98 | .lg-extension-meta { | |
99 | spacing: 6px; | |
100 | } | |
101 | ||
102 | // Inspector | |
103 | #LookingGlassPropertyInspector { | |
104 | background: $osd_bg_color; | |
105 | border: 1px solid $osd_borders_color; | |
106 | border-radius: $base_border_radius; | |
107 | padding: 6px; | |
108 | }⏎ |
0 | /* Message List */ | |
1 | // a.k.a. notifications in the menu | |
2 | ||
3 | // main list | |
4 | .message-list { | |
5 | width: 31.5em; | |
6 | padding: 0 $base_padding * 2; | |
7 | ||
8 | .message-list-placeholder { spacing: 12px; } | |
9 | } | |
10 | ||
11 | .message-list-sections { | |
12 | spacing: $base_spacing; | |
13 | margin: 0 $base_margin * 4; // to account for scrollbar | |
14 | } | |
15 | ||
16 | .message-list-section, | |
17 | .message-list-section-list { | |
18 | spacing: $base_spacing; | |
19 | } | |
20 | ||
21 | // do-not-disturb + clear button | |
22 | .message-list-controls { | |
23 | margin: ($base_margin * 2) ($base_margin * 4) 0; | |
24 | // NOTE: remove the padding if notification_bubble could remove margin for drop shadow | |
25 | padding: $base_margin; | |
26 | spacing: $base_spacing * 2; | |
27 | } | |
28 | ||
29 | // message bubbles | |
30 | .message { | |
31 | @include notification_bubble; | |
32 | ||
33 | // icon container | |
34 | .message-icon-bin { | |
35 | padding: ($base_padding * 3) 0 ($base_padding * 3) ($base_padding * 2); | |
36 | ||
37 | &:rtl { | |
38 | padding: ($base_padding * 3) ($base_padding * 2) ($base_padding * 3) 0; | |
39 | } | |
40 | ||
41 | // icon size and color | |
42 | > StIcon { | |
43 | icon-size: $base_icon_size*2; // 32px | |
44 | -st-icon-style: symbolic; | |
45 | } | |
46 | ||
47 | // fallback | |
48 | > .fallback-app-icon { | |
49 | width: $base_icon_size; | |
50 | height: $base_icon_size; | |
51 | } | |
52 | } | |
53 | ||
54 | // content | |
55 | .message-content { | |
56 | padding: $base_padding + $base_margin * 2; | |
57 | spacing: 4px; | |
58 | } | |
59 | ||
60 | // title | |
61 | .message-title { | |
62 | font-weight: bold; | |
63 | } | |
64 | ||
65 | // secondary container in title box | |
66 | .message-secondary-bin { | |
67 | padding: 0 $base_margin * 2; | |
68 | ||
69 | // notification time stamp | |
70 | > .event-time { | |
71 | color: transparentize($fg_color, 0.5); | |
72 | @include fontsize($base_font_size - 2); | |
73 | /* HACK: the label should be baseline-aligned with a 1em label, fake this with some bottom padding */ | |
74 | padding-bottom: 0.13em; | |
75 | ||
76 | &:ltr { text-align: right }; | |
77 | &:rtl { text-align: left }; | |
78 | } | |
79 | } | |
80 | ||
81 | // close button | |
82 | .message-close-button { | |
83 | color: lighten($fg_color, 15%); | |
84 | &:hover { color: if($variant=='light', lighten($fg_color, 30%), darken($fg_color, 10%)); } | |
85 | &:active { color: if($variant=='light', lighten($fg_color, 40%), darken($fg_color, 20%)); } | |
86 | } | |
87 | ||
88 | // body | |
89 | .message-body { | |
90 | color: darken($fg_color, 10%); | |
91 | } | |
92 | } | |
93 | ||
94 | // URLs in messages | |
95 | .url-highlighter { | |
96 | link-color: $link_color; | |
97 | } | |
98 | ||
99 | /* Media Controls */ | |
100 | .message-media-control { | |
101 | padding: $base_padding * 2 $base_padding * 4; | |
102 | color: darken($fg_color, 15%); | |
103 | ||
104 | // uses $hover_bg_color since the media controls are in a notification_bubble | |
105 | &:hover { | |
106 | background-color: lighten($hover_bg_color, 5%); | |
107 | color: $fg_color; | |
108 | } | |
109 | ||
110 | &:active { | |
111 | background-color: darken($hover_bg_color, 2%); | |
112 | color: $fg_color; | |
113 | } | |
114 | ||
115 | &:insensitive { color: darken($fg_color,40%); } | |
116 | ||
117 | // fix border-radius for last button | |
118 | &:last-child:ltr { border-radius: 0 $base_border_radius+2 $base_border_radius+2 0; } | |
119 | &:last-child:rtl { border-radius: $base_border_radius+2 0 0 $base_border_radius+2; } | |
120 | } | |
121 | ||
122 | // album-art | |
123 | .media-message-cover-icon { | |
124 | icon-size: $base_icon_size*2 !important; // 48px | |
125 | border-radius: $base_border_radius; | |
126 | ||
127 | // when there is no artwork | |
128 | &.fallback { | |
129 | color: darken($fg_color, 17%); | |
130 | background-color: $bg_color; | |
131 | border: 1px solid transparent; | |
132 | border-radius: $base_border_radius; | |
133 | icon-size: $base_icon_size * 2 !important; | |
134 | } | |
135 | } |
0 | // Rubberband for select-area screenshots | |
1 | .select-area-rubberband { | |
2 | background-color: transparentize($selected_bg_color,0.7); | |
3 | border: 1px solid $selected_bg_color; | |
4 | } | |
5 | ||
6 | // User icon | |
7 | .user-icon { | |
8 | background-size: contain; | |
9 | color: $osd_fg_color; | |
10 | border-radius: 99px; | |
11 | border: 2px $osd_fg_color; | |
12 | &:hover { | |
13 | color: lighten($osd_fg_color,30%); | |
14 | } | |
15 | ||
16 | & StIcon { | |
17 | background-color: transparentize($osd_fg_color,0.95); | |
18 | border-radius: 99px; | |
19 | } | |
20 | } | |
21 | ||
22 | .user-widget.vertical .user-icon { | |
23 | icon-size: $base_icon_size * 6; // 128px | |
24 | ||
25 | & StIcon { | |
26 | padding: $base_padding * 3 + 2px; // 20px | |
27 | padding-top: $base_padding * 3; // 18 px | |
28 | padding-bottom: $base_padding * 3 + 4px; // 22px | |
29 | width: $base_icon_size * 5.5; height: $base_icon_size * 5.5; // 88px; | |
30 | } | |
31 | } | |
32 | ||
33 | .user-widget.horizontal .user-icon { | |
34 | icon-size: $base_icon_size * 4; // 64px | |
35 | ||
36 | & StIcon { | |
37 | padding: $base_padding * 2 ; // 12px | |
38 | width: $base_icon_size * 2.5; height: $base_icon_size * 2.5; // 40px; | |
39 | } | |
40 | } | |
41 | ||
42 | .lightbox { background-color: black; } | |
43 | .flashspot { background-color: white; } | |
44 | ||
45 | ||
46 | // Hidden | |
47 | .hidden { color: rgba(0,0,0,0);} | |
48 | ||
49 | // Caps-lock warning | |
50 | .caps-lock-warning-label { | |
51 | text-align: center; | |
52 | padding-bottom: 8px; | |
53 | @include fontsize($base_font_size - 1); | |
54 | color: $warning_color; | |
55 | } |
0 | /* Network Dialogs */ | |
1 | .nm-dialog { | |
2 | max-height: 34em; | |
3 | min-height: 31em; | |
4 | min-width: 32em; | |
5 | } | |
6 | ||
7 | .nm-dialog-content { | |
8 | spacing: 20px; | |
9 | padding: 24px; | |
10 | } | |
11 | ||
12 | .nm-dialog-airplane-box { spacing: 12px; } | |
13 | ||
14 | .nm-dialog-airplane-headline { | |
15 | font-weight: bold; | |
16 | text-align: center; | |
17 | } | |
18 | ||
19 | .nm-dialog-airplane-text { color: $fg_color; } | |
20 | ||
21 | // header | |
22 | .nm-dialog-header { | |
23 | font-weight: bold; | |
24 | } | |
25 | .nm-dialog-header-icon { | |
26 | icon-size: $base_icon_size * 2; | |
27 | } | |
28 | .nm-dialog-header-hbox { spacing: 10px; } | |
29 | ||
30 | // list of networks | |
31 | .nm-dialog-scroll-view { | |
32 | border: 1px solid $borders_color; | |
33 | padding:0; | |
34 | background-color: darken($bg_color, 3%); | |
35 | } | |
36 | ||
37 | // list item | |
38 | .nm-dialog-item { | |
39 | @include fontsize($base_font_size); | |
40 | border-bottom: 1px solid $borders_color; | |
41 | padding: $base_padding * 2; | |
42 | spacing: 0px; | |
43 | &:selected { | |
44 | background-color: $selected_bg_color; | |
45 | color: $selected_fg_color; | |
46 | } | |
47 | } | |
48 | ||
49 | // icons in list | |
50 | .nm-dialog-icon { icon-size: $base_icon_size; } | |
51 | .nm-dialog-icons { spacing: $base_spacing * 2; } | |
52 | ||
53 | // no networks | |
54 | .no-networks-label { color: $insensitive_fg_color; } | |
55 | .no-networks-box { spacing: $base_padding; }⏎ |
0 | /* Notifications & Message Tray */ | |
1 | ||
2 | $notification_banner_height: 64px; | |
3 | $notification_banner_width: 34em; | |
4 | ||
5 | // Banner notifications | |
6 | .notification-banner { | |
7 | min-height: $notification_banner_height; | |
8 | width: $notification_banner_width; | |
9 | ||
10 | .notification-actions { | |
11 | spacing: 0; | |
12 | } | |
13 | ||
14 | .notification-button { | |
15 | @extend %bubble_button; | |
16 | } | |
17 | } | |
18 | ||
19 | // counter | |
20 | .summary-source-counter { | |
21 | font-size: $base_font_size - 1pt; | |
22 | font-weight: bold; | |
23 | height: 1.6em; | |
24 | width: 1.6em; | |
25 | -shell-counter-overlap-x: 3px; | |
26 | -shell-counter-overlap-y: 3px; | |
27 | background-color: $selected_bg_color; | |
28 | color: $selected_fg_color; | |
29 | border: 2px solid $fg_color; | |
30 | box-shadow: 0 2px 2px rgba(0,0,0,0.5); | |
31 | border-radius: 0.9em; // should be 0.8 but whatever; wish I could do 50%; | |
32 | } | |
33 | ||
34 | // chat bubbles | |
35 | .chat-body { spacing: 5px; } | |
36 | .chat-response { margin: 5px; } | |
37 | .chat-log-message { color: darken($fg_color,10%); } | |
38 | .chat-new-group { padding-top: 1em; } | |
39 | .chat-received { | |
40 | padding-left: 4px; | |
41 | &:rtl { padding-left: 0px; padding-right: 4px; } | |
42 | } | |
43 | ||
44 | .chat-sent { | |
45 | padding-left: 18pt; | |
46 | color: lighten($fg_color, 15%); | |
47 | &:rtl { padding-left: 0; padding-right: 18pt; } | |
48 | } | |
49 | ||
50 | .chat-meta-message { | |
51 | padding-left: 4px; | |
52 | @include fontsize($base_font_size - 2); | |
53 | font-weight: bold; | |
54 | color: lighten($fg_color,18%); | |
55 | &:rtl { padding-left: 0; padding-right: 4px; } | |
56 | } |
0 | /* OSD */ | |
1 | ||
2 | $osd_levelbar_height:8px; | |
3 | ||
4 | .osd-window { | |
5 | @extend %osd_panel; | |
6 | text-align: center; | |
7 | font-weight: bold; | |
8 | spacing: $base_spacing * 2; // 12px | |
9 | margin: $base_margin * 8; // 32px | |
10 | min-width: 64px; | |
11 | min-height: 64px; | |
12 | ||
13 | StIcon { | |
14 | icon-size:$base_icon_size * 6; | |
15 | } | |
16 | ||
17 | .osd-monitor-label { font-size: 3em; } | |
18 | ||
19 | .level { | |
20 | height: $osd_levelbar_height; | |
21 | -barlevel-height: $osd_levelbar_height; | |
22 | -barlevel-background-color: transparentize($osd_fg_color, if($variant=='light', 0.7, 0.9)); | |
23 | -barlevel-active-background-color: $osd_fg_color; | |
24 | -barlevel-overdrive-color: $destructive_color; | |
25 | -barlevel-overdrive-separator-width: 3px; | |
26 | } | |
27 | } | |
28 | ||
29 | /* Pad OSD */ | |
30 | .pad-osd-window { | |
31 | padding: 32px; | |
32 | background-color: transparentize(#000, 0.2); | |
33 | ||
34 | .pad-osd-title-box { spacing: 12px; } | |
35 | .pad-osd-title-menu-box { spacing: 6px; } | |
36 | } | |
37 | ||
38 | .combo-box-label { | |
39 | width: 15em; | |
40 | } | |
41 | ||
42 | .resize-popup { | |
43 | @extend %osd_panel; | |
44 | }⏎ |
0 | /* OVERVIEW */ | |
1 | ||
2 | #overview { | |
3 | spacing: 24px; | |
4 | background-color: transparent; | |
5 | } | |
6 | ||
7 | .overview-controls { | |
8 | padding-bottom: 32px; | |
9 | }⏎ |
0 | /* Top Bar */ | |
1 | // a.k.a. the panel | |
2 | ||
3 | $panel_corner_radius: $base_border_radius+1; | |
4 | $panel_bg_color: #000; | |
5 | $panel_fg_color: #ccc; | |
6 | $panel_height: 1.86em; | |
7 | ||
8 | ||
9 | #panel { | |
10 | background-color: $panel_bg_color; | |
11 | font-weight: bold; | |
12 | height: $panel_height; | |
13 | font-feature-settings: "tnum"; | |
14 | ||
15 | // transparent panel on lock & login screens | |
16 | &.unlock-screen, | |
17 | &.login-screen { | |
18 | background-color: transparent; | |
19 | ||
20 | .panel-corner { | |
21 | -panel-corner-radius: 0; | |
22 | -panel-corner-background-color: transparent; | |
23 | -panel-corner-border-color: transparent; | |
24 | } | |
25 | } | |
26 | ||
27 | // spacing between activities, app menu and such | |
28 | #panelLeft, #panelCenter { | |
29 | spacing: $base_spacing; | |
30 | } | |
31 | ||
32 | // the rounded outset corners | |
33 | .panel-corner { | |
34 | -panel-corner-radius: $panel_corner_radius; | |
35 | -panel-corner-background-color: $panel_bg_color; | |
36 | -panel-corner-border-width: 2px; | |
37 | -panel-corner-border-color: transparent; | |
38 | ||
39 | &:active, &:overview, &:focus { | |
40 | -panel-corner-border-color: lighten($selected_bg_color,5%); | |
41 | } | |
42 | } | |
43 | ||
44 | // panel menus | |
45 | .panel-button { | |
46 | font-weight: bold; | |
47 | color: $panel_fg_color; | |
48 | -natural-hpadding: $base_padding * 2; | |
49 | -minimum-hpadding: $base_padding; | |
50 | ||
51 | &:hover { | |
52 | color: lighten($panel_fg_color, 20%); | |
53 | } | |
54 | ||
55 | &:active, &:overview, &:focus, &:checked { | |
56 | color: lighten($panel_fg_color, 20%); | |
57 | } | |
58 | ||
59 | // status area icons | |
60 | .system-status-icon { | |
61 | icon-size: $base_icon_size; | |
62 | padding: $base_padding - 1px; | |
63 | } | |
64 | ||
65 | // app menu icon | |
66 | .app-menu-icon { | |
67 | margin-left: $base_margin; | |
68 | margin-right: $base_margin; | |
69 | -st-icon-style: symbolic; | |
70 | // dimensions of the icon are hardcoded | |
71 | } | |
72 | ||
73 | // lock & login screen styles | |
74 | .unlock-screen &, | |
75 | .login-screen & { | |
76 | color: lighten($fg_color, 10%); | |
77 | &:focus, &:hover, &:active { color: lighten($fg_color, 10%); } | |
78 | } | |
79 | } | |
80 | ||
81 | .panel-button { | |
82 | &:active, &:overview, &:focus, &:checked { | |
83 | // Trick due to St limitations. It needs a background to draw a box-shadow | |
84 | background-color: rgba(0, 0, 0, 0.01); | |
85 | box-shadow: inset 0 -2px 0 0 lighten($selected_bg_color,5%); | |
86 | } | |
87 | } | |
88 | ||
89 | .panel-button.clock-display { | |
90 | // Move highlight from .panel-button to .clock | |
91 | &:active, &:overview, &:focus, &:checked { | |
92 | box-shadow: none; | |
93 | ||
94 | .clock { | |
95 | background-color: rgba(0, 0, 0, 0.01); | |
96 | box-shadow: inset 0 -2px 0 0 lighten($selected_bg_color,5%); | |
97 | } | |
98 | } | |
99 | } | |
100 | ||
101 | .panel-status-indicators-box, | |
102 | .panel-status-menu-box { | |
103 | spacing: 2px; | |
104 | } | |
105 | ||
106 | // spacing between power icon and (optional) percentage label | |
107 | .power-status.panel-status-indicators-box { | |
108 | spacing: 0; | |
109 | } | |
110 | ||
111 | // indicator for active | |
112 | .screencast-indicator, | |
113 | .remote-access-indicator { color: $warning_color; } | |
114 | } | |
115 | ||
116 | // App Menu | |
117 | #appMenu { | |
118 | spacing: $base_spacing; | |
119 | .label-shadow { color: transparent; } | |
120 | } |
0 | /* Popovers/Menus */ | |
1 | ||
2 | $popover_arrow_height: 12px; | |
3 | ||
4 | //.the popover itself | |
5 | .popup-menu-boxpointer { | |
6 | -arrow-border-radius: $base_border_radius+4; | |
7 | -arrow-background-color: $bg_color; | |
8 | -arrow-border-width: 1px; | |
9 | -arrow-border-color: $borders_color; | |
10 | -arrow-base: $popover_arrow_height * 2; | |
11 | -arrow-rise: $popover_arrow_height; | |
12 | -arrow-box-shadow: 0 1px 3px rgba(0,0,0,0.5); // dreaming bugzilla #689995 | |
13 | } | |
14 | ||
15 | // container of the popover menu | |
16 | .popup-menu { | |
17 | min-width: 15em; | |
18 | color: $fg_color; | |
19 | ||
20 | //.popup-status-menu-item { font-weight: normal; color: pink; } //dunno what that is | |
21 | &.panel-menu { | |
22 | -boxpointer-gap: $base_margin; // distance from the panel | |
23 | margin-bottom: 1.75em; | |
24 | } | |
25 | } | |
26 | ||
27 | .popup-menu-content { | |
28 | padding: $base_padding * 2 + $base_margin 0; | |
29 | } | |
30 | ||
31 | // menu items | |
32 | .popup-menu-item { | |
33 | spacing: $base_padding; | |
34 | padding: $base_padding; | |
35 | ||
36 | &:ltr { padding-right:1.75em; padding-left: 0; } | |
37 | &:rtl { padding-right: 0; padding-left:1.75em; } | |
38 | ||
39 | &:checked { | |
40 | background-color: lighten($bg_color, 2%); | |
41 | box-shadow: none; | |
42 | } | |
43 | ||
44 | &.selected { | |
45 | background-color: transparentize(white, if($variant=='light', 0.2, 0.9)); | |
46 | color: $fg_color; | |
47 | } | |
48 | ||
49 | &:active { | |
50 | background-color: $selected_bg_color; | |
51 | color: $selected_fg_color; | |
52 | } | |
53 | ||
54 | &:insensitive { color: transparentize($fg_color,0.5);} | |
55 | } | |
56 | ||
57 | // all icons and other graphical elements | |
58 | .popup-inactive-menu-item { | |
59 | color: $fg_color; | |
60 | ||
61 | &:insensitive { color: transparentize($fg_color,0.5); } | |
62 | } | |
63 | ||
64 | // symbolic icons in popover | |
65 | .popup-menu-arrow, | |
66 | .popup-menu-icon { icon-size: $base_icon_size; } | |
67 | ||
68 | // popover submenus | |
69 | .popup-sub-menu { | |
70 | background-color: darken($bg_color, 3%); | |
71 | box-shadow: none; | |
72 | border-top: 1px solid transparentize($borders_color, 0.2); | |
73 | border-bottom: 1px solid transparentize($borders_color, 0.2); | |
74 | } | |
75 | ||
76 | // container for radio and check boxes | |
77 | .popup-menu-ornament { | |
78 | width: 1.2em; | |
79 | ||
80 | &:ltr { text-align: right }; | |
81 | &:rtl { text-align: left }; | |
82 | } | |
83 | ||
84 | // separator | |
85 | .popup-separator-menu-item { | |
86 | padding: 0; | |
87 | ||
88 | .popup-separator-menu-item-separator { | |
89 | //-margin-horizontal: 24px; | |
90 | height: 1px; //not really the whole box | |
91 | margin: 6px 64px; | |
92 | background-color: lighten($borders_color, 2%); | |
93 | .popup-sub-menu & { //submenu separators | |
94 | margin: 0 64px 0 32px; | |
95 | @if $variant == 'dark' { | |
96 | background-color: lighten($bg_color,10%); | |
97 | } | |
98 | } | |
99 | } | |
100 | } | |
101 | ||
102 | // desktop background menu | |
103 | .background-menu { | |
104 | -boxpointer-gap: $base_margin; | |
105 | -arrow-rise: 0px; // hide the beak on the menu | |
106 | } | |
107 | ||
108 | // system status menu | |
109 | .aggregate-menu { | |
110 | min-width: 21em; | |
111 | ||
112 | // lock screen, shutdown, etc. buttons | |
113 | .popup-menu-icon { | |
114 | padding:0; | |
115 | margin: 0 $base_margin; | |
116 | -st-icon-style: symbolic; | |
117 | } | |
118 | ||
119 | .popup-sub-menu .popup-menu-item > :first-child { | |
120 | // account for icons in submenus with padding | |
121 | &:ltr { | |
122 | padding-left: $base_padding + $base_margin * 2; | |
123 | margin-left: $base_icon_size; | |
124 | } | |
125 | &:rtl { | |
126 | padding-right: $base_padding + $base_margin * 2; ; | |
127 | margin-right: $base_icon_size; | |
128 | } | |
129 | } | |
130 | } |
0 | /* Screen Shield */ | |
1 | ||
2 | .unlock-dialog-clock { | |
3 | color: white; | |
4 | font-weight: 300; | |
5 | text-align: center; | |
6 | spacing: 24px; | |
7 | padding-bottom: 2.5em; | |
8 | } | |
9 | ||
10 | .unlock-dialog-clock-time { | |
11 | font-size: 64pt; | |
12 | padding-top: 42px; | |
13 | font-feature-settings: "tnum"; | |
14 | } | |
15 | ||
16 | .unlock-dialog-clock-date { | |
17 | font-size: 16pt; | |
18 | font-weight: normal; | |
19 | } | |
20 | ||
21 | .unlock-dialog-clock-hint { | |
22 | font-weight: normal; | |
23 | padding-top: 48px; | |
24 | } | |
25 | ||
26 | .unlock-dialog-notifications-container { | |
27 | margin: 12px 0; | |
28 | spacing: 6px; | |
29 | width: 23em; | |
30 | background-color: transparent; | |
31 | .summary-notification-stack-scrollview { | |
32 | padding-top: 0; | |
33 | padding-bottom: 0; | |
34 | } | |
35 | ||
36 | .notification, | |
37 | .unlock-dialog-notification-source { | |
38 | padding: 12px 6px; | |
39 | border: none; | |
40 | background-color: transparentize($osd_bg_color,0.7); | |
41 | color: $osd_fg_color; | |
42 | border-radius: $modal_radius; | |
43 | ||
44 | &.critical { background-color: transparentize($osd_bg_color,0.1) } | |
45 | } | |
46 | } | |
47 | ||
48 | .unlock-dialog-notification-label { | |
49 | padding: 0px 0px 0px 12px; | |
50 | } | |
51 | ||
52 | .unlock-dialog-notification-count-text { | |
53 | weight: bold; | |
54 | padding: 0 6px; | |
55 | color: $osd_bg_color; | |
56 | background-color: transparentize($osd_fg_color, 0.7); | |
57 | border-radius: 99px; | |
58 | margin-right: 12px; | |
59 | ||
60 | } | |
61 | ||
62 | .screen-shield-background { //just the shadow, really | |
63 | background: black; | |
64 | box-shadow: 0px 2px 4px rgba(0,0,0,0.6); | |
65 | } | |
66 | ||
67 | #lockDialogGroup { | |
68 | background-color: lighten(#2e3436, 8%); | |
69 | } | |
70 | ||
71 | #unlockDialogNotifications { | |
72 | StButton#vhandle, StButton#hhandle { | |
73 | background-color: transparentize($bg_color,0.7); | |
74 | &:hover, &:focus { background-color: transparentize($bg_color,0.5); } | |
75 | &:active { background-color: transparentize($selected_bg_color,0.5); } | |
76 | } | |
77 | } |
0 | /* Scrollbars */ | |
1 | ||
2 | StScrollView { | |
3 | &.vfade { -st-vfade-offset: 68px; } | |
4 | &.hfade { -st-hfade-offset: 68px; } | |
5 | } | |
6 | ||
7 | StScrollBar { | |
8 | padding: 0; | |
9 | ||
10 | StScrollView & { | |
11 | min-width: 14px; | |
12 | min-height: 14px; | |
13 | } | |
14 | ||
15 | StBin#trough { | |
16 | border-radius: 0; | |
17 | background-color: transparent; | |
18 | } | |
19 | ||
20 | StButton#vhandle, StButton#hhandle { | |
21 | border-radius: 8px; | |
22 | background-color: mix($fg_color, $bg_color, 60%); | |
23 | //border: 3px solid transparent; //would be nice to margin or at least to transparent | |
24 | margin: 3px; | |
25 | &:hover { background-color: mix($fg_color, $bg_color, 80%); } | |
26 | &:active { background-color: $selected_bg_color; } | |
27 | } | |
28 | }⏎ |
0 | // Search entry | |
1 | ||
2 | $search_entry_width: 320px; | |
3 | $search_entry_height: 36px; | |
4 | ||
5 | %search_entry, | |
6 | .search-entry { | |
7 | width: $search_entry_width; | |
8 | padding: $base_padding+1 $base_padding+3; | |
9 | border-radius: $search_entry_height * 0.5; // half the height | |
10 | color: transparentize($fg_color,0.3); | |
11 | background-color: $bg_color; | |
12 | border-color: $borders_color; | |
13 | ||
14 | &:hover { | |
15 | background-color: $hover_bg_color; | |
16 | border-color: $hover_borders_color; | |
17 | color: $hover_fg_color; | |
18 | } | |
19 | ||
20 | &:focus { | |
21 | padding: $base_padding $base_padding+2; // 1px less to account for wider border | |
22 | border-width: 2px; | |
23 | border-style: solid; | |
24 | border-color: $selected_bg_color; | |
25 | color: $fg_color; | |
26 | box-shadow: inset 0 1px 2px 1px rgba(0,0,0,0.2); | |
27 | } | |
28 | ||
29 | .search-entry-icon { | |
30 | icon-size: $base_icon_size; | |
31 | padding: 0 4px; | |
32 | color: inherit; | |
33 | } | |
34 | }⏎ |
0 | /* Search */ | |
1 | ||
2 | // search overview container | |
3 | #searchResultsContent { | |
4 | max-width: 1024px; | |
5 | spacing: $base_margin * 2; | |
6 | } | |
7 | ||
8 | // search results sections "the boxes" | |
9 | .search-section { | |
10 | // This should be equal to #searchResultsContent spacing | |
11 | spacing: $base_margin * 2; | |
12 | ||
13 | // separator | |
14 | .search-section-separator { | |
15 | // height: 1px; | |
16 | // background-color: $osd_outer_borders_color; | |
17 | height: 0; | |
18 | background-color: transparent; | |
19 | } | |
20 | } | |
21 | ||
22 | // content | |
23 | .search-section-content { | |
24 | background-color: transparentize(lighten($osd_bg_color, 5%), 0.2); | |
25 | border-radius: $modal_radius+3; | |
26 | border: 1px solid $osd_outer_borders_color; | |
27 | box-shadow: 0 2px 4px 0 $shadow_color; | |
28 | text-shadow: 0 1px if($variant == 'light', rgba(255,255,255,0.2), rgba(0,0,0,0.2)); | |
29 | color: $osd_fg_color; | |
30 | padding: $base_padding * 3; | |
31 | // This is the space between the provider icon and the results container | |
32 | spacing: $base_margin * 2; | |
33 | } | |
34 | ||
35 | %search-section-content-item { | |
36 | @extend %icon_tile; | |
37 | ||
38 | &:focus, | |
39 | &:hover, | |
40 | &:selected { | |
41 | background-color: transparentize($osd_fg_color, .9); | |
42 | transition-duration: 200ms; | |
43 | } | |
44 | ||
45 | &:active, | |
46 | &:checked { | |
47 | background-color: transparentize(darken($osd_bg_color, 10%), .1); | |
48 | } | |
49 | } | |
50 | ||
51 | // "no results" text | |
52 | .search-statustext { | |
53 | @extend %status_text; | |
54 | } | |
55 | ||
56 | .grid-search-results { | |
57 | spacing: $base_spacing * 6; | |
58 | } | |
59 | ||
60 | // Search results with icons | |
61 | .grid-search-result { | |
62 | @extend %app-well-app; | |
63 | } | |
64 | ||
65 | // search result provider | |
66 | .search-provider-icon { | |
67 | @extend %search-section-content-item; | |
68 | ||
69 | // content | |
70 | .list-search-provider-content { | |
71 | spacing: $base_spacing * 2; | |
72 | ||
73 | // provider labels | |
74 | .list-search-provider-details { | |
75 | width: 120px; | |
76 | margin-top: 0; | |
77 | color: darken($osd_fg_color, 8%); | |
78 | // font-weight: bold; | |
79 | } | |
80 | } | |
81 | } | |
82 | ||
83 | // search results list | |
84 | .list-search-results { | |
85 | spacing: $base_spacing; | |
86 | } | |
87 | ||
88 | // search result listitem | |
89 | .list-search-result { | |
90 | @extend %search-section-content-item; | |
91 | ||
92 | // content | |
93 | .list-search-result-content { | |
94 | spacing: $base_padding; | |
95 | } | |
96 | ||
97 | // list item title (with leading icon) | |
98 | .list-search-result-title { | |
99 | spacing: $base_spacing * 2; | |
100 | // font-weight: bold; | |
101 | } | |
102 | ||
103 | // list item description | |
104 | .list-search-result-description { | |
105 | color: darken($osd_fg_color, 30%); | |
106 | } | |
107 | } |
0 | /* Slider */ | |
1 | ||
2 | $slider_size: 15px; | |
3 | ||
4 | .slider { | |
5 | height: $slider_size; | |
6 | // slider trough | |
7 | -barlevel-height: 3px; // has to be an odd number | |
8 | -barlevel-background-color: $borders_color; //background of the trough | |
9 | -barlevel-border-width: 1px; | |
10 | -barlevel-border-color: $borders_color; // trough border color | |
11 | // fill style | |
12 | -barlevel-active-background-color: $selected_bg_color; //active trough fill | |
13 | -barlevel-active-border-color: if($variant == 'light', darken($selected_bg_color, 4%), lighten($selected_bg_color, 2%)); //active trough border | |
14 | // overfill style (red in this case) | |
15 | -barlevel-overdrive-color: $destructive_color; | |
16 | -barlevel-overdrive-border-color: if($variant == 'light', darken($destructive_color, 4%), lighten($destructive_color, 2%)); //trough border when red; | |
17 | -barlevel-overdrive-separator-width:1px; | |
18 | // slider handler | |
19 | -slider-handle-radius: $slider_size * 0.5; // half the size of the size | |
20 | -slider-handle-border-width: 1px; | |
21 | -slider-handle-border-color: if($variant == 'light', $borders_color, $fg_color); | |
22 | ||
23 | color: if($variant == 'light', lighten($bg_color, 10%), $fg_color); | |
24 | &:hover { color: $hover_bg_color; } | |
25 | &:active { color: $active_bg_color; } | |
26 | }⏎ |
0 | /* App Switcher */ | |
1 | ||
2 | .switcher-popup { | |
3 | padding: 8px; | |
4 | spacing: $base_spacing * 4; | |
5 | } | |
6 | ||
7 | // switcher onscreen panel | |
8 | .switcher-list { | |
9 | @extend %osd_panel; | |
10 | ||
11 | .item-box { | |
12 | padding: 8px; | |
13 | border-radius: $base_border_radius + 1px; | |
14 | border: 1px solid transparent; | |
15 | ||
16 | &:outlined { | |
17 | background-color: transparentize($osd_fg_color, 0.7); | |
18 | } | |
19 | ||
20 | &:selected { | |
21 | background-color: transparentize($osd_fg_color, 0.7); | |
22 | color: $osd_fg_color; | |
23 | } | |
24 | } | |
25 | ||
26 | // window thumbnails | |
27 | .thumbnail-box { | |
28 | padding: 2px; | |
29 | spacing: $base_spacing; | |
30 | } | |
31 | ||
32 | .thumbnail { | |
33 | width: 256px; | |
34 | } | |
35 | ||
36 | .separator { | |
37 | width: 1px; | |
38 | background: $borders_color; | |
39 | } | |
40 | ||
41 | .switcher-list-item-container { | |
42 | spacing: $base_spacing * 2; | |
43 | } | |
44 | } | |
45 | ||
46 | .switcher-arrow { | |
47 | border-color: rgba(0,0,0,0); | |
48 | color: transparentize($fg_color,0.2); | |
49 | &:highlighted { | |
50 | color: $fg_color; | |
51 | } | |
52 | } | |
53 | ||
54 | // Input Source Switcher | |
55 | .input-source-switcher-symbol { | |
56 | font-size: 34pt; | |
57 | width: 96px; | |
58 | height: 96px; | |
59 | } | |
60 | ||
61 | // Window cycler highlight | |
62 | .cycler-highlight { | |
63 | border: 5px solid $selected_bg_color; | |
64 | } |
0 | /* Switches */ | |
1 | ||
2 | // these are equal to the size of the SVG assets | |
3 | $switch_height: 22px; | |
4 | $switch_width: 46px; | |
5 | ||
6 | .toggle-switch { | |
7 | color: $fg_color; | |
8 | height: $switch_height; | |
9 | width: $switch_width; | |
10 | background-size: contain; | |
11 | background-image: if($variant == 'light', url("resource:///org/gnome/shell/theme/toggle-off.svg"),url("resource:///org/gnome/shell/theme/toggle-off-dark.svg")); | |
12 | &:checked { | |
13 | background-image: if($variant == 'light', url("resource:///org/gnome/shell/theme/toggle-on.svg"),url("resource:///org/gnome/shell/theme/toggle-on-dark.svg")); | |
14 | } | |
15 | }⏎ |
0 | ||
1 | /* Tiled window previews */ | |
2 | $tile_corner_radius: $base_border_radius + 1px; | |
3 | .tile-preview { | |
4 | background-color: transparentize($selected_bg_color,0.5); | |
5 | border: 1px solid $selected_bg_color; | |
6 | } | |
7 | ||
8 | .tile-preview-left.on-primary { | |
9 | border-radius: $tile_corner_radius 0 0 0; | |
10 | } | |
11 | ||
12 | .tile-preview-right.on-primary { | |
13 | border-radius: 0 $tile_corner_radius 0 0; | |
14 | } | |
15 | ||
16 | .tile-preview-left.tile-preview-right.on-primary { | |
17 | border-radius: $tile_corner_radius $tile_corner_radius 0 0; | |
18 | }⏎ |
0 | /* Window Picker */ | |
1 | ||
2 | $window_picker_spacing: $base_spacing; // 6px | |
3 | $window_picker_padding: $base_padding * 2; // 12px | |
4 | ||
5 | $window_thumbnail_border_color:transparentize($selected_fg_color, 0.65); | |
6 | ||
7 | $window_close_button_size: 24px; | |
8 | $window_close_button_padding: 3px; | |
9 | ||
10 | $window_clone_border_size: 6px; | |
11 | ||
12 | // Window picker | |
13 | .window-picker { | |
14 | // Space between window thumbnails | |
15 | spacing: $window_picker_spacing; | |
16 | ||
17 | // Padding for container around window thumbnails | |
18 | padding: $window_picker_padding; | |
19 | ||
20 | &.external-monitor { padding: $window_picker_padding; } | |
21 | } | |
22 | ||
23 | // Borders on window thumbnails | |
24 | .window-clone-border { | |
25 | border-width: $window_clone_border_size; | |
26 | border-style: solid; | |
27 | border-color: $window_thumbnail_border_color; | |
28 | border-radius: $base_border_radius + 2; | |
29 | // For window decorations with round corners we can't match | |
30 | // the exact shape when the window is scaled. So apply a shadow | |
31 | // to fix that case | |
32 | box-shadow: inset 0 0 0 1px transparentize($borders_color, 0.8); | |
33 | } | |
34 | ||
35 | // Window titles | |
36 | .window-caption { | |
37 | color: $osd_fg_color; | |
38 | background-color: $osd_bg_color; | |
39 | border:1px solid $osd_outer_borders_color; | |
40 | border-radius: $base_border_radius + 1; | |
41 | padding: $base_padding $base_padding * 2; | |
42 | font-weight: bold; | |
43 | @include fontsize($base_font_size + 1); | |
44 | } | |
45 | ||
46 | // Close button | |
47 | .window-close { | |
48 | background-color: $selected_bg_color; | |
49 | color: $selected_fg_color; | |
50 | border: none; | |
51 | border-radius: $window_close_button_size * 0.5 + $window_close_button_padding * 2; | |
52 | padding: $window_close_button_padding; | |
53 | height: $window_close_button_size; | |
54 | width: $window_close_button_size; | |
55 | box-shadow: -1px 1px 5px 0px rgba(0,0,0,0.5); | |
56 | ||
57 | &:hover { | |
58 | background-color: lighten($selected_bg_color, 5%); | |
59 | } | |
60 | ||
61 | &:active { | |
62 | background-color: darken($selected_bg_color, 5%); | |
63 | } | |
64 | } |
0 | /* Workspace Switcher */ | |
1 | .workspace-switcher-group { | |
2 | padding: $base_padding * 2; | |
3 | } | |
4 | ||
5 | .workspace-switcher-container { | |
6 | @extend %osd_panel; | |
7 | } | |
8 | ||
9 | .workspace-switcher { | |
10 | background: transparent; | |
11 | border: none; | |
12 | border-radius: 0; | |
13 | padding: 0; | |
14 | spacing: $base_spacing * 2; | |
15 | } | |
16 | ||
17 | .ws-switcher-box { | |
18 | background: transparent; | |
19 | height: 50px; | |
20 | background-size: 32px; | |
21 | border: 1px solid transparentize($osd_fg_color,0.9); | |
22 | border-radius: $base_border_radius + 3px; | |
23 | } | |
24 | ||
25 | // active workspace in the switcher | |
26 | .ws-switcher-active-up, | |
27 | .ws-switcher-active-down, | |
28 | .ws-switcher-active-left, | |
29 | .ws-switcher-active-right { | |
30 | height: 52px; | |
31 | background-color: $selected_bg_color; | |
32 | border: 1px solid if($variant=='light', darken($selected_bg_color, 8%), lighten($selected_bg_color, 5%)); | |
33 | border-radius: $base_border_radius + 3px; | |
34 | color: $selected_fg_color; | |
35 | } |
0 | /* Workspace pager */ | |
1 | ||
2 | // thumbnails in overview | |
3 | .workspace-thumbnails { | |
4 | @extend %overview_panel; | |
5 | visible-width: 32px; //amount visible before hover | |
6 | spacing: $base_spacing; | |
7 | padding: $base_padding; | |
8 | ||
9 | border-radius: $modal_radius 0 0 $modal_radius; | |
10 | border-right-width: 0; | |
11 | ||
12 | &:rtl { | |
13 | border-radius: 0 $modal_radius $modal_radius 0; | |
14 | border-left-width: 0; | |
15 | } | |
16 | ||
17 | // drag and drop indicator | |
18 | .placeholder { | |
19 | background-image: url("resource:///org/gnome/shell/theme/dash-placeholder.svg"); | |
20 | background-size: contain; | |
21 | height: 24px; | |
22 | } | |
23 | } | |
24 | ||
25 | // selected indicator | |
26 | .workspace-thumbnail-indicator { | |
27 | border: 3px solid $selected_bg_color; | |
28 | border-radius: 3px; | |
29 | padding: 0px; | |
30 | // background-color: transparentize($selected_bg_color, 0.9); | |
31 | } |
115 | 115 | let keepAliveWorkspaces = []; |
116 | 116 | let foundNonEmpty = false; |
117 | 117 | for (let i = this._workspaces.length - 1; i >= 0; i--) { |
118 | if (!foundNonEmpty) | |
119 | foundNonEmpty = this._workspaces[i].list_windows().length > 0; | |
120 | else if (!this._workspaces[i]._keepAliveId) | |
118 | if (!foundNonEmpty) { | |
119 | foundNonEmpty = this._workspaces[i].list_windows().some( | |
120 | w => !w.is_on_all_workspaces()); | |
121 | } else if (!this._workspaces[i]._keepAliveId) { | |
121 | 122 | keepAliveWorkspaces.push(this._workspaces[i]); |
123 | } | |
122 | 124 | } |
123 | 125 | |
124 | 126 | // make sure the original method only removes empty workspaces at the end |
102 | 102 | direction++; |
103 | 103 | if (direction === 4) |
104 | 104 | direction = 0; |
105 | ||
106 | 105 | } |
107 | 106 | |
108 | 107 | let loopCounter = 0; |
485 | 485 | } |
486 | 486 | |
487 | 487 | _reloadBookmarks() { |
488 | ||
489 | 488 | this._bookmarks = []; |
490 | 489 | |
491 | 490 | let content = Shell.get_file_contents_utf8_sync(this._bookmarksFile.get_path()); |
351 | 351 | super._init(perMonitor, monitorIndex); |
352 | 352 | |
353 | 353 | this.metaWindow = metaWindow; |
354 | this._skipTaskbarId = metaWindow.connect('notify::skip-taskbar', () => { | |
355 | this._updateVisibility(); | |
356 | }); | |
354 | 357 | this._updateVisibility(); |
355 | 358 | |
356 | 359 | this._windowTitle = new WindowTitle(this.metaWindow); |
411 | 414 | |
412 | 415 | _onDestroy() { |
413 | 416 | super._onDestroy(); |
417 | this.metaWindow.disconnect(this._skipTaskbarId); | |
414 | 418 | this.metaWindow.disconnect(this._workspaceChangedId); |
415 | 419 | global.display.disconnect(this._notifyFocusId); |
416 | 420 | this._contextMenu.destroy(); |
607 | 611 | this._contextMenuManager.addMenu(this._appContextMenu); |
608 | 612 | this.label_actor = this._multiWindowTitle.label_actor; |
609 | 613 | } |
610 | ||
611 | 614 | } |
612 | 615 | |
613 | 616 | _onClicked(actor, button) { |
947 | 950 | } |
948 | 951 | |
949 | 952 | _onWindowAdded(ws, win) { |
950 | if (win.skip_taskbar) | |
951 | return; | |
952 | ||
953 | 953 | if (!this._grouped) |
954 | 954 | this._checkGrouping(); |
955 | 955 |
23 | 23 | this.connect('destroy', this._onDestroy.bind(this)); |
24 | 24 | |
25 | 25 | this._sizeChangedId = this._window.connect('size-changed', |
26 | this._relayout.bind(this)); | |
26 | () => this.queue_relayout()); | |
27 | 27 | this._positionChangedId = this._window.connect('position-changed', |
28 | this._relayout.bind(this)); | |
28 | () => this.queue_relayout()); | |
29 | 29 | this._minimizedChangedId = this._window.connect('notify::minimized', |
30 | this._relayout.bind(this)); | |
30 | this._updateVisible.bind(this)); | |
31 | 31 | this._monitorEnteredId = global.display.connect('window-entered-monitor', |
32 | this._relayout.bind(this)); | |
32 | this._updateVisible.bind(this)); | |
33 | 33 | this._monitorLeftId = global.display.connect('window-left-monitor', |
34 | this._relayout.bind(this)); | |
35 | ||
36 | // Do initial layout when we get a parent | |
37 | let id = this.connect('parent-set', () => { | |
38 | this.disconnect(id); | |
39 | if (!this.get_parent()) | |
40 | return; | |
41 | this._laterId = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { | |
42 | this._laterId = 0; | |
43 | this._relayout(); | |
44 | return false; | |
45 | }); | |
46 | }); | |
34 | this._updateVisible.bind(this)); | |
47 | 35 | |
48 | 36 | this._focusChangedId = global.display.connect('notify::focus-window', |
49 | 37 | this._onFocusChanged.bind(this)); |
51 | 39 | } |
52 | 40 | |
53 | 41 | // needed for DND |
54 | get realWindow() { | |
55 | return this._window.get_compositor_private(); | |
42 | get metaWindow() { | |
43 | return this._window; | |
56 | 44 | } |
57 | 45 | |
58 | 46 | _onDestroy() { |
62 | 50 | global.display.disconnect(this._monitorEnteredId); |
63 | 51 | global.display.disconnect(this._monitorLeftId); |
64 | 52 | global.display.disconnect(this._focusChangedId); |
65 | if (this._laterId) | |
66 | Meta.later_remove(this._laterId); | |
67 | 53 | } |
68 | 54 | |
69 | 55 | _onFocusChanged() { |
73 | 59 | this.remove_style_class_name('active'); |
74 | 60 | } |
75 | 61 | |
76 | _relayout() { | |
62 | _updateVisible() { | |
77 | 63 | let monitor = Main.layoutManager.findIndexForActor(this); |
78 | 64 | this.visible = monitor === this._window.get_monitor() && |
79 | 65 | this._window.window_type !== Meta.WindowType.DESKTOP && |
80 | 66 | this._window.showing_on_its_workspace(); |
81 | ||
82 | if (!this.visible) | |
83 | return; | |
84 | ||
85 | let workArea = Main.layoutManager.getWorkAreaForMonitor(monitor); | |
86 | let hscale = this.get_parent().allocation.get_width() / workArea.width; | |
87 | let vscale = this.get_parent().allocation.get_height() / workArea.height; | |
88 | ||
89 | let frameRect = this._window.get_frame_rect(); | |
90 | this.set_size( | |
91 | Math.round(Math.min(frameRect.width, workArea.width) * hscale), | |
92 | Math.round(Math.min(frameRect.height, workArea.height) * vscale)); | |
93 | this.set_position( | |
94 | Math.round(frameRect.x * hscale), | |
95 | Math.round(frameRect.y * vscale)); | |
67 | } | |
68 | }); | |
69 | ||
70 | let WorkspaceLayout = GObject.registerClass( | |
71 | class WorkspaceLayout extends Clutter.LayoutManager { | |
72 | vfunc_get_preferred_width() { | |
73 | return [0, 0]; | |
74 | } | |
75 | ||
76 | vfunc_get_preferred_height() { | |
77 | return [0, 0]; | |
78 | } | |
79 | ||
80 | vfunc_allocate(container, box) { | |
81 | const monitor = Main.layoutManager.findIndexForActor(container); | |
82 | const workArea = Main.layoutManager.getWorkAreaForMonitor(monitor); | |
83 | const hscale = box.get_width() / workArea.width; | |
84 | const vscale = box.get_height() / workArea.height; | |
85 | ||
86 | for (const child of container) { | |
87 | const childBox = new Clutter.ActorBox(); | |
88 | const frameRect = child.metaWindow.get_frame_rect(); | |
89 | childBox.set_size( | |
90 | Math.round(Math.min(frameRect.width, workArea.width) * hscale), | |
91 | Math.round(Math.min(frameRect.height, workArea.height) * vscale)); | |
92 | childBox.set_origin( | |
93 | Math.round(frameRect.x * hscale), | |
94 | Math.round(frameRect.y * vscale)); | |
95 | child.allocate(childBox); | |
96 | } | |
96 | 97 | } |
97 | 98 | }); |
98 | 99 | |
102 | 103 | super._init({ |
103 | 104 | style_class: 'workspace', |
104 | 105 | child: new Clutter.Actor({ |
105 | layout_manager: new Clutter.BinLayout(), | |
106 | layout_manager: new WorkspaceLayout(), | |
106 | 107 | clip_to_allocation: true, |
107 | 108 | }), |
108 | 109 | }); |
133 | 134 | } |
134 | 135 | |
135 | 136 | acceptDrop(source) { |
136 | if (!source.realWindow) | |
137 | if (!source.metaWindow) | |
137 | 138 | return false; |
138 | 139 | |
139 | let window = source.realWindow.get_meta_window(); | |
140 | this._moveWindow(window); | |
140 | this._moveWindow(source.metaWindow); | |
141 | 141 | return true; |
142 | 142 | } |
143 | 143 | |
144 | 144 | handleDragOver(source) { |
145 | if (source.realWindow) | |
145 | if (source.metaWindow) | |
146 | 146 | return DND.DragMotionResult.MOVE_DROP; |
147 | 147 | else |
148 | 148 | return DND.DragMotionResult.CONTINUE; |
0 | 0 | /* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */ |
1 | 1 | /* exported init */ |
2 | const { Clutter, GObject, St } = imports.gi; | |
2 | const { Clutter, Graphene, GObject, St } = imports.gi; | |
3 | 3 | |
4 | 4 | const Main = imports.ui.main; |
5 | 5 | const Workspace = imports.ui.workspace; |
6 | 6 | const WorkspacesView = imports.ui.workspacesView; |
7 | 7 | |
8 | class MyWindowOverlay extends Workspace.WindowOverlay { | |
9 | constructor(windowClone, parentActor) { | |
10 | super(windowClone, parentActor); | |
11 | ||
12 | this._id = null; | |
13 | this._text = new St.Label({ | |
14 | style_class: 'extension-windowsNavigator-window-tooltip', | |
15 | visible: false, | |
16 | }); | |
17 | parentActor.add_actor(this._text); | |
18 | } | |
19 | ||
20 | showTooltip() { | |
21 | this._parentActor.set_child_below_sibling(this._text, null); | |
22 | this._text.show(); | |
23 | this._text.text = (this._windowClone.slotId + 1).toString(); | |
24 | } | |
25 | ||
26 | hideTooltip() { | |
27 | if (this._text && this._text.visible) | |
28 | this._text.hide(); | |
29 | } | |
30 | ||
31 | relayout(animate) { | |
32 | super.relayout(animate); | |
33 | ||
34 | let [cloneX, cloneY, cloneWidth_, cloneHeight_] = this._windowClone.slot; | |
35 | ||
36 | let textX = cloneX - 2; | |
37 | let textY = cloneY - 2; | |
38 | this._text.set_position(Math.floor(textX) + 5, Math.floor(textY) + 5); | |
39 | this._parentActor.set_child_below_sibling(this._text, null); | |
40 | } | |
41 | } | |
8 | const WINDOW_SLOT = 4; | |
42 | 9 | |
43 | 10 | var MyWorkspace = GObject.registerClass( |
44 | 11 | class MyWorkspace extends Workspace.Workspace { |
60 | 27 | } |
61 | 28 | } |
62 | 29 | |
30 | vfunc_allocate(box) { | |
31 | super.vfunc_allocate(box); | |
32 | ||
33 | if (this._tip) | |
34 | this._tip.allocate_preferred_size(0, 0); | |
35 | } | |
36 | ||
63 | 37 | showTooltip() { |
64 | if (!this._tip || !this._actualGeometry) | |
38 | if (!this._tip) | |
65 | 39 | return; |
66 | 40 | this._tip.text = (this.metaWorkspace.index() + 1).toString(); |
67 | ||
68 | // Hand code this instead of using _getSpacingAndPadding | |
69 | // because that fails on empty workspaces | |
70 | let node = this.get_theme_node(); | |
71 | let padding = { | |
72 | left: node.get_padding(St.Side.LEFT), | |
73 | top: node.get_padding(St.Side.TOP), | |
74 | bottom: node.get_padding(St.Side.BOTTOM), | |
75 | right: node.get_padding(St.Side.RIGHT), | |
76 | }; | |
77 | ||
78 | let area = Workspace.padArea(this._actualGeometry, padding); | |
79 | this._tip.x = area.x; | |
80 | this._tip.y = area.y; | |
81 | 41 | this._tip.show(); |
82 | 42 | this.set_child_below_sibling(this._tip, null); |
83 | 43 | } |
84 | 44 | |
85 | 45 | hideTooltip() { |
86 | if (!this._tip) | |
87 | return; | |
88 | if (!this._tip.get_parent()) | |
89 | return; | |
90 | this._tip.hide(); | |
46 | if (this._tip) | |
47 | this._tip.hide(); | |
91 | 48 | } |
92 | 49 | |
93 | 50 | getWindowWithTooltip(id) { |
94 | for (let i = 0; i < this._windows.length; i++) { | |
95 | if (this._windows[i].slotId + 1 === id) | |
96 | return this._windows[i].metaWindow; | |
97 | } | |
98 | return null; | |
51 | const slot = this.layout_manager._windowSlots[id - 1]; | |
52 | return slot ? slot[WINDOW_SLOT].metaWindow : null; | |
99 | 53 | } |
100 | 54 | |
101 | 55 | showWindowsTooltips() { |
102 | for (let i in this._windowOverlays) { | |
103 | if (this._windowOverlays[i]) | |
104 | this._windowOverlays[i].showTooltip(); | |
56 | for (let i = 0; i < this.layout_manager._windowSlots.length; i++) { | |
57 | if (this.layout_manager._windowSlots[i]) | |
58 | this.layout_manager._windowSlots[i][WINDOW_SLOT].showTooltip(`${i + 1}`); | |
105 | 59 | } |
106 | 60 | } |
107 | 61 | |
108 | 62 | hideWindowsTooltips() { |
109 | for (let i in this._windowOverlays) { | |
110 | if (this._windowOverlays[i]) | |
111 | this._windowOverlays[i].hideTooltip(); | |
112 | } | |
63 | for (let i in this.layout_manager._windowSlots) { | |
64 | if (this.layout_manager._windowSlots[i]) | |
65 | this.layout_manager._windowSlots[i][WINDOW_SLOT].hideTooltip(); | |
66 | } | |
67 | } | |
68 | ||
69 | // overriding _addWindowClone to apply the tooltip patch on the cloned | |
70 | // windowPreview | |
71 | _addWindowClone(metaWindow) { | |
72 | const clone = super._addWindowClone(metaWindow); | |
73 | ||
74 | // appling the tooltip patch | |
75 | (function patchPreview() { | |
76 | this._text = new St.Label({ | |
77 | style_class: 'extension-windowsNavigator-window-tooltip', | |
78 | visible: false, | |
79 | }); | |
80 | ||
81 | this._text.add_constraint(new Clutter.BindConstraint({ | |
82 | source: this._borderCenter, | |
83 | coordinate: Clutter.BindCoordinate.POSITION, | |
84 | })); | |
85 | this._text.add_constraint(new Clutter.AlignConstraint({ | |
86 | source: this._borderCenter, | |
87 | align_axis: Clutter.AlignAxis.X_AXIS, | |
88 | pivot_point: new Graphene.Point({ x: 0.5, y: -1 }), | |
89 | factor: this._closeButtonSide === St.Side.LEFT ? 1 : 0, | |
90 | })); | |
91 | this._text.add_constraint(new Clutter.AlignConstraint({ | |
92 | source: this._borderCenter, | |
93 | align_axis: Clutter.AlignAxis.Y_AXIS, | |
94 | pivot_point: new Graphene.Point({ x: -1, y: 0.5 }), | |
95 | factor: 0, | |
96 | })); | |
97 | ||
98 | this.add_child(this._text); | |
99 | }).call(clone); | |
100 | ||
101 | clone.showTooltip = function (text) { | |
102 | this._text.set({ text }); | |
103 | this._text.show(); | |
104 | }; | |
105 | ||
106 | clone.hideTooltip = function () { | |
107 | if (this._text && this._text.visible) | |
108 | this._text.hide(); | |
109 | }; | |
110 | ||
111 | return clone; | |
113 | 112 | } |
114 | 113 | }); |
115 | 114 | |
243 | 242 | |
244 | 243 | class Extension { |
245 | 244 | constructor() { |
246 | this._origWindowOverlay = Workspace.WindowOverlay; | |
247 | 245 | this._origWorkspace = Workspace.Workspace; |
248 | 246 | this._origWorkspacesView = WorkspacesView.WorkspacesView; |
249 | 247 | } |
250 | 248 | |
251 | 249 | enable() { |
252 | Workspace.WindowOverlay = MyWindowOverlay; | |
253 | 250 | Workspace.Workspace = MyWorkspace; |
254 | 251 | WorkspacesView.WorkspacesView = MyWorkspacesView; |
255 | 252 | } |
256 | 253 | |
257 | 254 | disable() { |
258 | Workspace.WindowOverlay = this._origWindowOverlay; | |
259 | 255 | Workspace.Workspace = this._origWorkspace; |
260 | 256 | WorkspacesView.WorkspacesView = this._origWorkspacesView; |
261 | 257 | } |
29 | 29 | this.connect('destroy', this._onDestroy.bind(this)); |
30 | 30 | |
31 | 31 | this._sizeChangedId = this._window.connect('size-changed', |
32 | this._relayout.bind(this)); | |
32 | () => this.queue_relayout()); | |
33 | 33 | this._positionChangedId = this._window.connect('position-changed', |
34 | this._relayout.bind(this)); | |
34 | () => this.queue_relayout()); | |
35 | 35 | this._minimizedChangedId = this._window.connect('notify::minimized', |
36 | this._relayout.bind(this)); | |
36 | this._updateVisible.bind(this)); | |
37 | 37 | this._monitorEnteredId = global.display.connect('window-entered-monitor', |
38 | this._relayout.bind(this)); | |
38 | this._updateVisible.bind(this)); | |
39 | 39 | this._monitorLeftId = global.display.connect('window-left-monitor', |
40 | this._relayout.bind(this)); | |
41 | ||
42 | // Do initial layout when we get a parent | |
43 | let id = this.connect('parent-set', () => { | |
44 | this.disconnect(id); | |
45 | if (!this.get_parent()) | |
46 | return; | |
47 | this._laterId = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { | |
48 | this._laterId = 0; | |
49 | this._relayout(); | |
50 | return false; | |
51 | }); | |
52 | }); | |
40 | this._updateVisible.bind(this)); | |
53 | 41 | |
54 | 42 | this._focusChangedId = global.display.connect('notify::focus-window', |
55 | 43 | this._onFocusChanged.bind(this)); |
57 | 45 | } |
58 | 46 | |
59 | 47 | // needed for DND |
60 | get realWindow() { | |
61 | return this._window.get_compositor_private(); | |
48 | get metaWindow() { | |
49 | return this._window; | |
62 | 50 | } |
63 | 51 | |
64 | 52 | _onDestroy() { |
68 | 56 | global.display.disconnect(this._monitorEnteredId); |
69 | 57 | global.display.disconnect(this._monitorLeftId); |
70 | 58 | global.display.disconnect(this._focusChangedId); |
71 | if (this._laterId) | |
72 | Meta.later_remove(this._laterId); | |
73 | 59 | } |
74 | 60 | |
75 | 61 | _onFocusChanged() { |
79 | 65 | this.remove_style_class_name('active'); |
80 | 66 | } |
81 | 67 | |
82 | _relayout() { | |
68 | _updateVisible() { | |
83 | 69 | let monitor = Main.layoutManager.findIndexForActor(this); |
84 | 70 | this.visible = monitor === this._window.get_monitor() && |
85 | 71 | this._window.window_type !== Meta.WindowType.DESKTOP && |
86 | 72 | this._window.showing_on_its_workspace(); |
87 | ||
88 | if (!this.visible) | |
89 | return; | |
90 | ||
91 | let workArea = Main.layoutManager.getWorkAreaForMonitor(monitor); | |
92 | let hscale = this.get_parent().allocation.get_width() / workArea.width; | |
93 | let vscale = this.get_parent().allocation.get_height() / workArea.height; | |
94 | ||
95 | let frameRect = this._window.get_frame_rect(); | |
96 | this.set_size( | |
97 | Math.round(Math.min(frameRect.width, workArea.width) * hscale), | |
98 | Math.round(Math.min(frameRect.height, workArea.height) * vscale)); | |
99 | this.set_position( | |
100 | Math.round(frameRect.x * hscale), | |
101 | Math.round(frameRect.y * vscale)); | |
73 | } | |
74 | }); | |
75 | ||
76 | let WorkspaceLayout = GObject.registerClass( | |
77 | class WorkspaceLayout extends Clutter.LayoutManager { | |
78 | vfunc_get_preferred_width() { | |
79 | return [0, 0]; | |
80 | } | |
81 | ||
82 | vfunc_get_preferred_height() { | |
83 | return [0, 0]; | |
84 | } | |
85 | ||
86 | vfunc_allocate(container, box) { | |
87 | const monitor = Main.layoutManager.findIndexForActor(container); | |
88 | const workArea = Main.layoutManager.getWorkAreaForMonitor(monitor); | |
89 | const hscale = box.get_width() / workArea.width; | |
90 | const vscale = box.get_height() / workArea.height; | |
91 | ||
92 | for (const child of container) { | |
93 | const childBox = new Clutter.ActorBox(); | |
94 | const frameRect = child.metaWindow.get_frame_rect(); | |
95 | childBox.set_size( | |
96 | Math.min(frameRect.width, workArea.width) * hscale, | |
97 | Math.min(frameRect.height, workArea.height) * vscale); | |
98 | childBox.set_origin( | |
99 | Math.round(frameRect.x * hscale), | |
100 | Math.round(frameRect.y * vscale)); | |
101 | child.allocate(childBox); | |
102 | } | |
102 | 103 | } |
103 | 104 | }); |
104 | 105 | |
108 | 109 | super._init({ |
109 | 110 | style_class: 'workspace', |
110 | 111 | child: new Clutter.Actor({ |
111 | layout_manager: new Clutter.BinLayout(), | |
112 | layout_manager: new WorkspaceLayout(), | |
112 | 113 | clip_to_allocation: true, |
113 | 114 | }), |
114 | 115 | }); |
139 | 140 | } |
140 | 141 | |
141 | 142 | acceptDrop(source) { |
142 | if (!source.realWindow) | |
143 | if (!source.metaWindow) | |
143 | 144 | return false; |
144 | 145 | |
145 | let window = source.realWindow.get_meta_window(); | |
146 | this._moveWindow(window); | |
146 | this._moveWindow(source.metaWindow); | |
147 | 147 | return true; |
148 | 148 | } |
149 | 149 | |
150 | 150 | handleDragOver(source) { |
151 | if (source.realWindow) | |
151 | if (source.metaWindow) | |
152 | 152 | return DND.DragMotionResult.MOVE_DROP; |
153 | 153 | else |
154 | 154 | return DND.DragMotionResult.CONTINUE; |
33 | 33 | <gnome:userid>fmuellner</gnome:userid> |
34 | 34 | </foaf:Person> |
35 | 35 | </maintainer> |
36 | <maintainer> | |
37 | <foaf:Person> | |
38 | <foaf:name>Marge Bot</foaf:name> | |
39 | <gnome:userid>marge-bot</gnome:userid> | |
40 | </foaf:Person> | |
41 | </maintainer> | |
36 | 42 | </Project> |
0 | 0 | --- |
1 | # SPDX-License-Identifier: MIT OR LGPL-2.0-or-later | |
1 | 2 | env: |
2 | 3 | es6: true |
3 | 4 | extends: 'eslint:recommended' |
23 | 24 | # allow: [^vfunc_, ^on_, _instance_init] |
24 | 25 | comma-dangle: |
25 | 26 | - error |
26 | - always-multiline | |
27 | - arrays: always-multiline | |
28 | objects: always-multiline | |
29 | functions: never | |
27 | 30 | comma-spacing: |
28 | 31 | - error |
29 | 32 | - before: false |
86 | 89 | - error |
87 | 90 | - all |
88 | 91 | - conditionalAssign: false |
92 | nestedBinaryExpressions: false | |
89 | 93 | returnAssign: false |
90 | 94 | no-implicit-coercion: |
91 | 95 | - error |
105 | 109 | no-restricted-properties: |
106 | 110 | - error |
107 | 111 | - object: Lang |
112 | property: copyProperties | |
113 | message: Use Object.assign() | |
114 | - object: Lang | |
108 | 115 | property: bind |
109 | 116 | message: Use arrow notation or Function.prototype.bind() |
110 | 117 | - object: Lang |
111 | 118 | property: Class |
112 | 119 | message: Use ES6 classes |
113 | - object: imports | |
114 | property: mainloop | |
115 | message: Use GLib main loops and timeouts | |
116 | 120 | no-restricted-syntax: |
117 | 121 | - error |
118 | 122 | - selector: >- |
128 | 132 | BlockStatement[body.length=1] |
129 | 133 | CallExpression[arguments.length=0][callee.object.type="Super"][callee.property.name="_init"] |
130 | 134 | message: _init() that only calls super._init() is unnecessary |
135 | - selector: BinaryExpression[operator="instanceof"][right.name="Array"] | |
136 | message: Use Array.isArray() | |
131 | 137 | no-return-assign: error |
132 | 138 | no-return-await: error |
133 | 139 | no-self-compare: error |
164 | 170 | object-shorthand: error |
165 | 171 | operator-assignment: error |
166 | 172 | operator-linebreak: error |
173 | padded-blocks: | |
174 | - error | |
175 | - never | |
167 | 176 | # These may be a bit controversial, we can try them out and enable them later |
168 | 177 | # prefer-const: error |
169 | 178 | # prefer-destructuring: error |
216 | 225 | ARGV: readonly |
217 | 226 | Debugger: readonly |
218 | 227 | GIRepositoryGType: readonly |
228 | globalThis: readonly | |
219 | 229 | imports: readonly |
220 | 230 | Intl: readonly |
221 | 231 | log: readonly |
222 | 232 | logError: readonly |
223 | 233 | print: readonly |
224 | 234 | printerr: readonly |
225 | window: readonly | |
226 | 235 | parserOptions: |
227 | ecmaVersion: 2017 | |
236 | ecmaVersion: 2020 |
0 | 0 | project('gnome-shell-extensions', |
1 | version: '3.38.1', | |
1 | version: '40.alpha', | |
2 | 2 | meson_version: '>= 0.44.0', |
3 | 3 | license: 'GPL2+' |
4 | 4 | ) |
20 | 20 | xsessiondir = join_paths(datadir, 'xsessions') |
21 | 21 | |
22 | 22 | ver_arr = meson.project_version().split('.') |
23 | if ver_arr[1].to_int().is_even() | |
24 | shell_version = '@0@.@1@'.format(ver_arr[0], ver_arr[1]) | |
25 | else | |
23 | if ver_arr[1].version_compare('>=0') | |
24 | shell_version = ver_arr[0] | |
25 | else # pre-release (alpha, beta, rc) | |
26 | 26 | shell_version = '.'.join(ver_arr) |
27 | 27 | endif |
28 | 28 |
82 | 82 | msgstr "" |
83 | 83 | "Intenta utilitzar més espai de la pantalla per a posicionar les miniatures de " |
84 | 84 | "les finestres adaptant-les a la ràtio d'aspecte de la pantalla, consolidant-" |
85 | "les més per a reduir la capsa que les envolta. Aquest paràmetre de " | |
85 | "les més per a reduir la caixa que les envolta. Aquest paràmetre de " | |
86 | 86 | "configuració només s'aplica a l'estratègia de posicionament de finestres " |
87 | 87 | "natural." |
88 | 88 |
7 | 7 | "Project-Id-Version: gnome-shell-extensions master\n" |
8 | 8 | "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/" |
9 | 9 | "issues\n" |
10 | "POT-Creation-Date: 2020-05-28 00:55+0000\n" | |
11 | "PO-Revision-Date: 2020-07-12 18:10+0200\n" | |
10 | "POT-Creation-Date: 2020-10-08 21:24+0000\n" | |
11 | "PO-Revision-Date: 2020-10-17 22:14+0200\n" | |
12 | 12 | "Last-Translator: Fabio Tomat <[email protected]>\n" |
13 | 13 | "Language-Team: Friulian <[email protected]>\n" |
14 | 14 | "Language: fur\n" |
15 | 15 | "MIME-Version: 1.0\n" |
16 | 16 | "Content-Type: text/plain; charset=UTF-8\n" |
17 | 17 | "Content-Transfer-Encoding: 8bit\n" |
18 | "X-Generator: Poedit 2.3.1\n" | |
19 | ||
20 | #: data/gnome-classic.desktop.in:3 data/gnome-classic.session.desktop.in:3 | |
18 | "X-Generator: Poedit 2.4.1\n" | |
19 | ||
20 | #: data/gnome-classic.desktop.in:3 | |
21 | 21 | msgid "GNOME Classic" |
22 | 22 | msgstr "GNOME Classic" |
23 | 23 | |
24 | 24 | #: data/gnome-classic.desktop.in:4 |
25 | 25 | msgid "This session logs you into GNOME Classic" |
26 | msgstr "Cheste session a si invie cun GNOME classic" | |
26 | msgstr "Cheste session ti fâs jentrâ in GNOME Classic" | |
27 | 27 | |
28 | 28 | #: extensions/apps-menu/extension.js:113 |
29 | 29 | msgid "Favorites" |
42 | 42 | "A list of strings, each containing an application id (desktop file name), " |
43 | 43 | "followed by a colon and the workspace number" |
44 | 44 | msgstr "" |
45 | "Une liste di stringhis, ogniune a ten il ID di une aplicazion (non dal file ." | |
46 | "desktop), seguît di doi ponts e il numar dal spazi di lavôr" | |
45 | "Une liste di stringhis, ogniune e ten il ID di une aplicazion (non dal file ." | |
46 | "desktop), cun daûr doi ponts e il numar dal spazi di lavôr" | |
47 | 47 | |
48 | 48 | #: extensions/auto-move-windows/prefs.js:35 |
49 | 49 | msgid "Workspace Rules" |
62 | 62 | |
63 | 63 | #: extensions/drive-menu/extension.js:128 |
64 | 64 | msgid "Removable devices" |
65 | msgstr "Argagn rimovibil" | |
65 | msgstr "Dispositîfs estraibii" | |
66 | 66 | |
67 | 67 | #: extensions/drive-menu/extension.js:155 |
68 | 68 | msgid "Open Files" |
69 | msgstr "Vierç i file" | |
69 | msgstr "Vierç i files" | |
70 | 70 | |
71 | 71 | #: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:5 |
72 | 72 | msgid "Use more screen for windows" |
73 | msgstr "Dopre plui spazi par i balcons" | |
73 | msgstr "Dopre plui schermi pai barcons" | |
74 | 74 | |
75 | 75 | #: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:6 |
76 | 76 | msgid "" |
78 | 78 | "aspect ratio, and consolidating them further to reduce the bounding box. " |
79 | 79 | "This setting applies only with the natural placement strategy." |
80 | 80 | msgstr "" |
81 | "Cîr di doprâ plui puest par plaçâ lis miniaturis dai balcons, adatânsi al " | |
82 | "rapuart di aspiet dal visôr e consolidanlis ancjemo di plui par ridusi il " | |
83 | "spazi complessîf. Cheste impostazion a si apliche dome se l'algoritmo di " | |
84 | "posizionament al è \"natural\"." | |
81 | "Cîr di doprâ plui schermi par plaçâ lis miniaturis dai barcons, adatant il " | |
82 | "rapuart di aspiet dal visôr e consolidant ancjemo di plui lis miniaturis par " | |
83 | "ridusi il spazi complessîf. Cheste impostazion si apliche dome se " | |
84 | "l'algoritmi di plaçament al è naturâl." | |
85 | 85 | |
86 | 86 | #: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:11 |
87 | 87 | msgid "Place window captions on top" |
88 | msgstr "Met il titul dal balcon insomp" | |
88 | msgstr "Met il titul dal barcon parsore" | |
89 | 89 | |
90 | 90 | #: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:12 |
91 | 91 | msgid "" |
93 | 93 | "shell default of placing it at the bottom. Changing this setting requires " |
94 | 94 | "restarting the shell to have any effect." |
95 | 95 | msgstr "" |
96 | "Se VÊR, al place i titui dai balcons insomp as relativis miniaturis, lant in " | |
97 | "volte al compuartament normâl de shell, che lis place in bas.Cambiant cheste " | |
98 | "impostazion a si scugne tornâ a inviâ la shell." | |
96 | "Se VÊR, al place i titui dai barcons denant des relativis miniaturis, " | |
97 | "sorpassant il compuartament predefinît de shell, che lis place in bas. " | |
98 | "Cambiant cheste impostazion si scugne tornâ a inviâ la shell." | |
99 | 99 | |
100 | 100 | #: extensions/places-menu/extension.js:89 |
101 | 101 | #: extensions/places-menu/extension.js:93 |
119 | 119 | |
120 | 120 | #: extensions/places-menu/placeDisplay.js:359 |
121 | 121 | msgid "Home" |
122 | msgstr "Cjase" | |
122 | msgstr "Home" | |
123 | 123 | |
124 | 124 | #: extensions/places-menu/placeDisplay.js:404 |
125 | 125 | msgid "Browse Network" |
127 | 127 | |
128 | 128 | #: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:7 |
129 | 129 | msgid "Cycle Screenshot Sizes" |
130 | msgstr "Dimensions caturis di schermi ciclichis" | |
130 | msgstr "Dimensions videadis catuardis ciclichis" | |
131 | 131 | |
132 | 132 | #: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:11 |
133 | 133 | msgid "Cycle Screenshot Sizes Backward" |
134 | msgstr "Dimensions caturis di schermi ciclichis indaûr" | |
134 | msgstr "Dimensions videadis caturadis ciclichis indaûr" | |
135 | 135 | |
136 | 136 | #: extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml:5 |
137 | 137 | msgid "Theme name" |
183 | 183 | |
184 | 184 | #: extensions/window-list/extension.js:734 |
185 | 185 | msgid "Window List" |
186 | msgstr "Liste balcons" | |
186 | msgstr "Liste barcons" | |
187 | 187 | |
188 | 188 | #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:12 |
189 | 189 | msgid "When to group windows" |
190 | msgstr "Quant ingrumâ i balcons" | |
190 | msgstr "Cuant meti in grup i barcons" | |
191 | 191 | |
192 | 192 | #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:13 |
193 | 193 | msgid "" |
194 | 194 | "Decides when to group windows from the same application on the window list. " |
195 | 195 | "Possible values are “never”, “auto” and “always”." |
196 | 196 | msgstr "" |
197 | "Al decît cuant intropâ i balcons de stesse aplicazion su le liste dai " | |
198 | "balcons. I pussibii valôrs a son “never”, “auto” e “always”." | |
197 | "Al decît cuant meti dongje i barcons de stesse aplicazion su la liste dai " | |
198 | "barcons. I valôrs pussibii a son “never”, “auto” e “always”." | |
199 | 199 | |
200 | 200 | #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20 |
201 | 201 | #: extensions/window-list/prefs.js:100 |
217 | 217 | "primary one." |
218 | 218 | msgstr "" |
219 | 219 | "Indiche se mostrâ la liste dai barcons su ducj i visôrs tacâts o nome sul " |
220 | "principâl." | |
220 | "chel principâl." | |
221 | 221 | |
222 | 222 | #: extensions/window-list/prefs.js:29 |
223 | 223 | msgid "Window Grouping" |
224 | msgstr "Ingrumament balcons" | |
224 | msgstr "Intropament di barcons" | |
225 | 225 | |
226 | 226 | #: extensions/window-list/prefs.js:58 |
227 | 227 | msgid "Never group windows" |
228 | msgstr "No ingrumâ i balcons" | |
228 | msgstr "No sta meti mai in grup i barcons" | |
229 | 229 | |
230 | 230 | #: extensions/window-list/prefs.js:59 |
231 | 231 | msgid "Group windows when space is limited" |
232 | msgstr "Ingrume i balcons quanche al'è pôc puest" | |
232 | msgstr "Met dongje i barcons cuant che il spazi al è limitât" | |
233 | 233 | |
234 | 234 | #: extensions/window-list/prefs.js:60 |
235 | 235 | msgid "Always group windows" |
236 | msgstr "Ingrume simpri i balcons" | |
236 | msgstr "Met simpri in grup i barcons" | |
237 | 237 | |
238 | 238 | #: extensions/window-list/prefs.js:94 |
239 | 239 | msgid "Show on all monitors" |