diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index a53e93fe..5981e068 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -107,7 +107,8 @@ eslint:
stage: review
<<: *prereview_req
script:
- - eslint -o $LINT_LOG -f junit --resolve-plugins-relative-to $(npm root -g) extensions
+ - export NODE_PATH=$(npm root -g)
+ - ./.gitlab-ci/run-eslint --output-file ${LINT_LOG} --format junit --stdout
artifacts:
paths:
- ${LINT_LOG}
@@ -132,8 +133,6 @@ fedora-build:
stage: build
needs:
- build-fedora-container
- variables:
- GIT_SUBMODULE_STRATEGY: normal
script:
- meson setup build --werror -Dextension_set=all -Dclassic_mode=true
- meson compile -C build
diff --git a/.gitlab-ci/run-eslint b/.gitlab-ci/run-eslint
new file mode 100755
index 00000000..ac0b281a
--- /dev/null
+++ b/.gitlab-ci/run-eslint
@@ -0,0 +1,54 @@
+#!/usr/bin/env node
+
+const {ESLint} = require('eslint');
+
+console.log(`Running ESLint version ${ESLint.version}...`);
+
+const fs = require('fs');
+const path = require('path');
+
+function hasOption(...names) {
+ return process.argv.some(arg => names.includes(arg));
+}
+
+function getOption(...names) {
+ const optIndex =
+ process.argv.findIndex(arg => names.includes(arg)) + 1;
+
+ if (optIndex === 0)
+ return undefined;
+
+ return process.argv[optIndex];
+}
+
+(async function main() {
+ const outputOption = getOption('--output-file', '-o');
+ const outputPath = outputOption ? path.resolve(outputOption) : null;
+
+ const sourceDir = path.dirname(process.argv[1]);
+ process.chdir(path.resolve(sourceDir, '..'));
+
+ const sources = ['extensions'];
+ const eslint = new ESLint();
+
+ const results = await eslint.lintFiles(sources);
+ const formatter = await eslint.loadFormatter(getOption('--format', '-f'));
+ const resultText = formatter.format(results);
+
+ if (outputPath) {
+ fs.mkdirSync(path.dirname(outputPath), {recursive: true});
+ fs.writeFileSync(outputPath, resultText);
+
+ if (hasOption('--stdout')) {
+ const consoleFormatter = await eslint.loadFormatter();
+ console.log(consoleFormatter.format(results));
+ }
+ } else {
+ console.log(resultText);
+ }
+
+ process.exitCode = results.some(r => r.errorCount > 0) ? 1 : 0;
+})().catch((error) => {
+ process.exitCode = 1;
+ console.error(error);
+});
diff --git a/NEWS b/NEWS
index cab0d150..1314288a 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,25 @@
+45.beta
+=======
+* Port extensions to ESM [Florian; !259, !266, !268, !269]
+* Misc. bug fixes and cleanups [Florian; !260, !261, !262, !263, !264]
+
+Contributors:
+ Florian Müllner
+
+Translators:
+ Efstathios Iosifidis [el]
+
+45.alpha
+========
+* window-list: Modernize default styling [Alexander; !253]
+* Replace classic styling with built-in light style [Florian; !254]
+* window-list: Add tooltip for long window titles [Arik; !251]
+* light-style: New extension [Florian; !256]
+* Misc. bug fixes and cleanups [Florian; !255, !257]
+
+Contributors:
+ Florian Müllner, Arik W, Alexander Weichart
+
44.0
====
* Bump version
diff --git a/data/classic-process-working.svg b/data/classic-process-working.svg
deleted file mode 100644
index ed28a5c7..00000000
--- a/data/classic-process-working.svg
+++ /dev/null
@@ -1,3160 +0,0 @@
-
-
-
-
diff --git a/data/classic.json.in b/data/classic.json.in
index 41976b69..f4cad60b 100644
--- a/data/classic.json.in
+++ b/data/classic.json.in
@@ -1,10 +1,10 @@
{
"parentMode": "user",
- "stylesheetName": "gnome-classic.css",
+ "colorScheme": "force-light",
"hasOverview": false,
"showWelcomeDialog": false,
"enabledExtensions": [@CLASSIC_EXTENSIONS@],
- "panel": { "left": ["appMenu"],
+ "panel": { "left": [],
"center": [],
"right": ["a11y", "keyboard", "dateMenu", "quickSettings"]
}
diff --git a/data/gnome-classic-high-contrast.css b/data/gnome-classic-high-contrast.css
deleted file mode 100644
index 7e4e7712..00000000
--- a/data/gnome-classic-high-contrast.css
+++ /dev/null
@@ -1,5 +0,0 @@
-@import url("gnome-classic.css");
-
-stage {
- -st-icon-style: symbolic;
-}
diff --git a/data/gnome-classic.scss b/data/gnome-classic.scss
deleted file mode 100644
index 33399f86..00000000
--- a/data/gnome-classic.scss
+++ /dev/null
@@ -1,95 +0,0 @@
-/* Use the gnome-shell theme, but with light colors */
-$variant: 'light';
-
-@import "gnome-shell-sass/_colors"; //use gtk colors
-@import "gnome-shell-sass/_drawing";
-@import "gnome-shell-sass/_common";
-@import "gnome-shell-sass/_widgets";
-
-/* Overrides */
-
-#panel, #panel.solid {
- font-weight: normal;
- background-color: $bg_color;
- background-gradient-direction: vertical;
- background-gradient-end: darken($bg_color,5%);
- border-top-color: #666; /* we don't support non-uniform border-colors and
- use the top border color for any border, so we
- need to set it even if all we want is a bottom
- border */
- border-bottom: 1px solid #666;
- app-icon-bottom-clip: 0px;
- &:overview {
- background-color: #000;
- background-gradient-end: #000;
- border-top-color: #000;
- border-bottom: 1px solid #000;
- .panel-button { color: #fff; }
- }
-
- .panel-button {
- -natural-hpadding: 8px;
- -minimum-hpadding: 4px;
- font-weight: normal;
- color: $fg_color;
- text-shadow: none;
- transition-duration: 0ms;
- border: 0;
- border-radius: 0px;
-
- &.clock-display {
- .clock {
- transition-duration: 0ms;
- border: 0;
- border-radius: 0px;
- }
- }
-
- &:hover {
- color: lighten($fg_color,10%);
- text-shadow: none;
- & .system-status-icon { icon-shadow: none; }
- }
- &:active, &:overview, &:focus, &:checked {
- // Trick due to St limitations. It needs a background to draw
- // a box-shadow
- background-color: $selected_bg_color;
- color: $selected_fg_color;
- box-shadow: none;
- & > .system-status-icon { icon-shadow: none; }
- }
-
- .app-menu-icon { width: 0; height: 0; margin: 0; } // shell's display:none; :D
-
- .system-status-icon {
- icon-shadow: none;
- }
- }
-
- .panel-corner,
- .panel-corner:active,
- .panel-corner:overview,
- .panel-corner:focus {
- -panel-corner-radius: 0;
- }
- &.lock-screen,
- &.unlock-screen,
- &.login-screen {
- background-color: transparentize($bg_color, 0.5);
- background-gradient-start: transparentize($bg_color, 0.5);
- background-gradient-end: transparentize($bg_color, 0.5);
- border-bottom: none;
- .panel-button { color: $osd_fg_color; }
- }
-}
-
-#appMenu {
- spinner-image: url("classic-process-working.svg");
- .panel-status-menu-box { padding: 0; }
-}
-.tile-preview-left.on-primary,
-.tile-preview-right.on-primary,
-.tile-preview-left.tile-preview-right.on-primary {
- /* keep in sync with -panel-corner-radius */
- border-radius: 0;
-}
diff --git a/data/gnome-shell-sass/COPYING b/data/gnome-shell-sass/COPYING
deleted file mode 100644
index e55e5b8a..00000000
--- a/data/gnome-shell-sass/COPYING
+++ /dev/null
@@ -1,339 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users. This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
- To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. You must make sure that they, too, receive or can get the
-source code. And you must show them these terms so they know their
-rights.
-
- We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary. To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License. The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language. (Hereinafter, translation is included without limitation in
-the term "modification".) Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
- 1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
- 2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-
- b) You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any
- part thereof, to be licensed as a whole at no charge to all third
- parties under the terms of this License.
-
- c) If the modified program normally reads commands interactively
- when run, you must cause it, when started running for such
- interactive use in the most ordinary way, to print or display an
- announcement including an appropriate copyright notice and a
- notice that there is no warranty (or else, saying that you provide
- a warranty) and that users may redistribute the program under
- these conditions, and telling the user how to view a copy of this
- License. (Exception: if the Program itself is interactive but
- does not normally print such an announcement, your work based on
- the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
- a) Accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software interchange; or,
-
- b) Accompany it with a written offer, valid for at least three
- years, to give any third party, for a charge no more than your
- cost of physically performing source distribution, a complete
- machine-readable copy of the corresponding source code, to be
- distributed under the terms of Sections 1 and 2 above on a medium
- customarily used for software interchange; or,
-
- c) Accompany it with the information you received as to the offer
- to distribute corresponding source code. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form with such
- an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable. However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License. Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
- 5. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Program or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
- 6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
- 7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all. For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded. In such case, this License incorporates
-the limitation as if written in the body of this License.
-
- 9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation. If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
- 10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this. Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
- NO WARRANTY
-
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-
- Copyright (C)
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
- Gnomovision version 69, Copyright (C) year name of author
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
- , 1 April 1989
- Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs. If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Library General
-Public License instead of this License.
diff --git a/data/gnome-shell-sass/NEWS b/data/gnome-shell-sass/NEWS
deleted file mode 100644
index e69de29b..00000000
diff --git a/data/gnome-shell-sass/README.md b/data/gnome-shell-sass/README.md
deleted file mode 100644
index 443b4dc5..00000000
--- a/data/gnome-shell-sass/README.md
+++ /dev/null
@@ -1,16 +0,0 @@
-# GNOME Shell Sass
-GNOME Shell Sass is a project intended to allow the sharing of the
-theme sources in sass between gnome-shell and other projects like
-gnome-shell-extensions.
-
-Any changes should be done in the [GNOME Shell subtree][shell-subtree]
-and not the stand-alone [gnome-shell-sass repository][sass-repo]. They
-will then be synchronized periodically before releases.
-
-## License
-GNOME Shell Sass is distributed under the terms of the GNU General Public
-License, version 2 or later. See the [COPYING][license] file for details.
-
-[shell-subtree]: https://gitlab.gnome.org/GNOME/gnome-shell/tree/HEAD/data/theme/gnome-shell-sass
-[sass-repo]: https://gitlab.gnome.org/GNOME/gnome-shell-sass
-[license]: COPYING
diff --git a/data/gnome-shell-sass/_colors.scss b/data/gnome-shell-sass/_colors.scss
deleted file mode 100644
index d2f406b7..00000000
--- a/data/gnome-shell-sass/_colors.scss
+++ /dev/null
@@ -1,70 +0,0 @@
-// When color definition differs for dark and light variant,
-// it gets @if-ed depending on $variant
-
-@import '_palette.scss';
-
-$is_highcontrast:false;
-
-$_dark_base_color: desaturate($dark_4, 100%);
-
-$base_color: if($variant == 'light', $light_1, $_dark_base_color);
-$bg_color: if($variant == 'light', $light_2, lighten($base_color, 5%));
-$fg_color: if($variant == 'light', transparentize(black, .2), white);
-
-$selected_fg_color: $light_1;
-$selected_bg_color: $blue_3;
-$selected_borders_color: if($variant== 'light', darken($selected_bg_color, 15%), darken($selected_bg_color, 20%));
-
-$borders_color: if($variant == 'light', transparentize($fg_color, .5), transparentize($fg_color, .9));
-$outer_borders_color: if($variant == 'light', rgba(255,255,255,0.8), lighten($bg_color, 5%));
-
-$link_color: if($variant == 'light', darken($selected_bg_color, 10%), lighten($selected_bg_color, 20%));
-$link_visited_color: if($variant == 'light', darken($selected_bg_color, 20%), lighten($selected_bg_color, 10%));
-
-$warning_color: if($variant == 'light', $yellow_5, #cd9309);
-$error_color: if($variant == 'light', $red_3, $red_4);
-$success_color: if($variant == 'light', $green_4, $green_5);
-$destructive_color: $error_color;
-
-$osd_fg_color: $light_1;
-$osd_bg_color: $_dark_base_color; //hardcoded for both light & dark
-$osd_insensitive_bg_color: transparentize(mix($osd_fg_color, opacify($osd_bg_color, 1), 10%), 0.5);
-$osd_insensitive_fg_color: if($variant == 'light', mix($osd_fg_color, $osd_bg_color, 80%), mix($osd_fg_color, $osd_bg_color, 70%));
-$osd_borders_color: transparentize(black, 0.3);
-$osd_outer_borders_color: transparentize($osd_fg_color, 0.9);
-
-$shadow_color: if($variant == 'light', rgba(0,0,0,0.1), rgba(0,0,0,0.2));
-
-// button
-$button_mix_factor: 9%;
-
-// notifications
-$bubble_buttons_color: if($variant == 'light', darken($bg_color, 7%), lighten($bg_color, 5%));
-
-// overview background color
-$system_bg_color: $base_color;
-
-//insensitive state derived colors
-$insensitive_fg_color: mix($fg_color, $bg_color, 50%);
-$insensitive_bg_color: mix($bg_color, $base_color, 60%);
-$insensitive_borders_color: mix($borders_color, $base_color, 60%);
-
-//colors for the backdrop state, derived from the main colors.
-$backdrop_base_color: if($variant =='light', darken($base_color,1%), lighten($base_color,1%));
-$backdrop_bg_color: $bg_color;
-$backdrop_fg_color: mix($fg_color, $backdrop_bg_color, 80%);
-$backdrop_insensitive_color: if($variant =='light', darken($backdrop_bg_color,15%), lighten($backdrop_bg_color,15%));
-$backdrop_borders_color: mix($borders_color, $bg_color, 90%);
-$backdrop_dark_fill: mix($backdrop_borders_color,$backdrop_bg_color, 35%);
-
-// derived checked colors
-$checked_bg_color: if($variant=='light', darken($bg_color, 7%), lighten($bg_color, 7%));
-$checked_fg_color: if($variant=='light', darken($fg_color, 7%), lighten($fg_color, 7%));
-
-// derived hover colors
-$hover_bg_color: if($variant=='light', darken($bg_color, 3%), lighten($bg_color, 10%));
-$hover_fg_color: if($variant=='light', darken($fg_color, 5%), lighten($fg_color, 10%));
-
-// derived active colors
-$active_bg_color: if($variant=='light', darken($bg_color, 5%), lighten($bg_color, 12%));
-$active_fg_color: if($variant=='light', darken($fg_color, 5%), lighten($fg_color, 12%));
diff --git a/data/gnome-shell-sass/_common.scss b/data/gnome-shell-sass/_common.scss
deleted file mode 100644
index 79c96001..00000000
--- a/data/gnome-shell-sass/_common.scss
+++ /dev/null
@@ -1,245 +0,0 @@
-//This is the RIGHT PLACE to edit the stylesheet
-
-//let's start by telling people not to edit the generated CSS:
-$cakeisalie: "This stylesheet is generated, DO NOT EDIT";
-/* #{$cakeisalie} */
-
-/* Copyright 2009, 2015 Red Hat, Inc.
- *
- * Portions adapted from Mx's data/style/default.css
- * Copyright 2009 Intel Corporation
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU Lesser General Public License,
- * version 2.1, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
- * more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/* Global Values */
-
-// padding, margin and spacing
-$base_padding: 6px;
-$base_margin: 4px;
-
-// border radii
-$base_border_radius: 8px;
-
-// radii of things that display over other things, e.g. popovers
-$modal_radius: $base_border_radius*2; // 24px
-
-// Chroma key to flag when a background-color is always occluded, not visible.
-// This allows any box-shadow behind it to be rendered more efficiently by
-// omitting the middle rectangle.
-$invisible_occluded_bg_color: rgba(3,2,1,0);
-
-// fonts
-$base_font_size: 11;
-$text_shadow_color: if($variant == 'light', rgba(255,255,255,0.3), rgba(0,0,0,0.2));
-
-// icons
-$base_icon_size: 1.09em;
-$large_icon_size: $base_icon_size*2; // 32px
-// $base_icon_size: 16px;
-
-// Stage
-stage {
- @include fontsize($base_font_size);
- color: $fg_color;
-}
-
-/* Common Stylings */
-
-// osd panels
-%osd_panel {
- color: $osd_fg_color;
- background-color: $osd_bg_color;
- border: 1px solid $osd_outer_borders_color;
- border-radius: 999px;
- padding: $base_padding*2;
- @if $is_highcontrast {
- border: 2px solid $hc_inset_color;
- }
-}
-
-// icon tiles
-%tile {
- border-radius: $base_border_radius * 2; // 16px
- padding: $base_padding;
- spacing: $base_padding;
- border: 2px solid transparent;
- transition-duration: 200ms;
- text-align: center;
- @if $is_highcontrast {
- border-color: $hc_inset_color;
- }
-}
-
-// normal button styling
-%button {
- border-radius: $base_border_radius;
- border-style: solid;
- border-width: 1px;
- font-weight: bold;
- padding: $base_padding*.5 $base_padding*4;
-
- @include button(normal);
- &:focus { @include button(focus);}
- &:hover { @include button(hover);}
- &:insensitive { @include button(insensitive);}
- &:selected,
- &:active { @include button(active);}
- &:checked { @include button(checked);}
-
- &.flat {
- @include button(normal, $flat:true);
- &:focus { @include button(focus, $flat:true);}
- &:hover { @include button(hover, $flat:true);}
- &:insensitive { @include button(insensitive, $flat:true);}
- &:selected,
- &:active { @include button(active, $flat:true);}
- &:checked { @include button(checked, $flat:true);}
- }
-}
-
-
-// normal entry style
-%entry {
- border-radius: $base_border_radius;
- padding: $base_padding*1.5 $base_padding*1.5;
- color: $fg_color;
- selection-background-color: $selected_bg_color;
- selected-color: $selected_fg_color;
-
- @include entry(normal);
- &:hover { @include entry(hover);}
- &:focus { @include entry(focus);}
- &:insensitive { @include entry(insensitive);}
-}
-
-
-// buttons in dialogs/notifications
-// lighter in color and have a greater radius
-%bubble_button {
- padding: $base_padding * 2;
- font-weight: bold !important;
-
- &:ltr {margin-right: 1px;}
- &:rtl {margin-left: 1px;}
-
- @include button(normal, $c:$bubble_buttons_color);
- &:insensitive { @include button(insensitive, $c:$bubble_buttons_color);}
- &:focus { @include button(focus, $c:$bubble_buttons_color);}
- &:hover { @include button(hover, $c:$bubble_buttons_color);}
- &:active { @include button(active, $c:$bubble_buttons_color);}
- &:checked { @include button(checked, $c:$bubble_buttons_color);}
-
- &:first-child:ltr {
- border-radius: 0 0 0 $modal_radius;
- }
-
- &:last-child:ltr {
- border-radius: 0 0 $modal_radius;
- margin-right: 0 !important;
- }
-
- &:first-child:rtl {
- border-radius: 0 0 $modal_radius;
- }
-
- &:last-child:rtl {
- border-radius: 0 0 0 $modal_radius;
- margin-left: 0 !important;
- }
-
- &:first-child:last-child {
- border-radius: 0 0 $modal_radius $modal_radius;
- margin-left: 0 !important;
- margin-right: 0 !important;
- }
-}
-
-// buttons on OSD elements
-// that are undecorated by default and use OSD colors
-%osd_button {
- @include button(undecorated);
- &:insensitive { @include button(undecorated, $tc:$osd_fg_color, $c:$osd_bg_color);}
- &:focus { @include button(focus, $tc:$osd_fg_color, $c:$osd_bg_color);}
- &:hover { @include button(hover, $tc:$osd_fg_color, $c:$osd_bg_color);}
- &:active { @include button(active, $tc:$osd_fg_color, $c:$osd_bg_color);}
- &:outlined,&:checked { @include button(checked, $tc:$osd_fg_color, $c:$osd_bg_color);}
-}
-
-
-// tooltip
-%tooltip {
- background-color: $osd_bg_color;
- color: $osd_fg_color;
- border:1px solid $osd_outer_borders_color;
- border-radius: 99px;
- padding: $base_padding $base_padding * 2;
- text-align: center;
-
- @if $is_highcontrast {
- background-color: $osd_bg_color;
- color: $osd_fg_color;
- border: 1px solid $hc_inset_color;
- }
-}
-
-/* General Typography */
-
-%large_title {
- font-weight: 300;
- @include fontsize(24);
-}
-
-%title_1 {
- font-weight: 800;
- @include fontsize(20);
-}
-
-%title_2 {
- font-weight: 800;
- @include fontsize(15);
-}
-
-%title_3 {
- font-weight: 700;
- @include fontsize(15);
-}
-
-%title_4 {
- font-weight: 700;
- @include fontsize(13);
-}
-
-%heading {
- font-weight: 700;
- @include fontsize(11);
-}
-
-%caption_heading {
- font-weight: 700;
- @include fontsize(9);
-}
-
-%caption {
- font-weight: 400;
- @include fontsize(9);
-}
-
-%smaller {
- font-weight: 400;
- @include fontsize(8);
-}
-
-%monospace {font-family: monospace;}
-%numeric { font-feature-settings: "tnum";}
diff --git a/data/gnome-shell-sass/_drawing.scss b/data/gnome-shell-sass/_drawing.scss
deleted file mode 100644
index 80d59cb3..00000000
--- a/data/gnome-shell-sass/_drawing.scss
+++ /dev/null
@@ -1,350 +0,0 @@
-// Drawing mixins
-
-// generic drawing of more complex things
-
-@function draw_widget_edge($c:$outer_borders_color) {
-// outer highlight "used" on most widgets
- @return 0 1px $c;
-}
-
-// provide font size in rem, with px fallback
-@mixin fontsize($size: 24, $base: 16) {
- font-size: round($size) + pt;
- //font-size: ($size / $base) * 1rem;
-}
-
-@mixin draw_shadows($shadow1, $shadow2:none, $shadow3:none, $shadow4:none) {
-//
-// Helper function to stack up to 4 box-shadows;
-//
- @if $shadow4!=none { box-shadow: $shadow1, $shadow2, $shadow3, $shadow4; }
- @else if $shadow3!=none { box-shadow: $shadow1, $shadow2, $shadow3; }
- @else if $shadow2!=none { box-shadow: $shadow1, $shadow2; }
- @else { box-shadow: $shadow1; }
-}
-
-// entries
-
-@mixin entry($t, $fc:$selected_bg_color) {
-//
-// Entries drawing function
-//
-// $t: entry type
-// $fc: focus color
-//
-// possible $t values:
-// normal, focus, insensitive
-//
- transition-duration: 100ms;
-
- @if $t==normal {
- background-color: transparentize($fg_color, 0.9);
- color: transparentize($fg_color,0.3);
-
- @if $is_highcontrast {
- box-shadow: inset 0 0 0 1px $hc_inset_color;
- }
- }
-
- @if $t==focus {
- background-color: mix(transparentize($fg_color, 0.8), $selected_bg_color, 95%);
- box-shadow: inset 0 0 0 2px $fc;
- color: $fg_color;
- &:hover {}
- }
-
- @if $t==hover {
- background-color:transparentize($fg_color, 0.8);
- color: inherit;
- }
-
- @if $t==insensitive {
- background-color:transparentize($insensitive_fg_color, 0.8);
- color: $insensitive_fg_color;
- }
-}
-
-// On-screen Keyboard
-@mixin keyboard_key($t, $c:$osd_bg_color, $tc:$osd_fg_color) {
-//
-// Keyboard key drawing function
-//
-// $t: key type,
-// $c: base key color for colored* types
-// $tc: optional text color for colored* types
-//
-// possible $t values:
-// normal, hover, active, insensitive, insensitive-active,
-// backdrop, backdrop-active, backdrop-insensitive, backdrop-insensitive-active,
-// osd, osd-hover, osd-active, osd-insensitive, osd-backdrop, undecorated
-//
-
- // normal key
- @if $t==normal {
- color: $tc;
- background-color: lighten($c, 3%);
- }
-
- // focused key
- @if $t==focus {
- color: $tc;
- background-color: mix(lighten($c, 3%), $selected_bg_color, 90%);
- box-shadow: inset 0 0 0 2px transparentize($selected_bg_color, 0.4);
- &:hover {
- background-color: mix(lighten($c, 8%), $selected_bg_color, 90%);
- box-shadow: inset 0 0 0 2px transparentize($selected_bg_color, 0.3);
- }
- &:active {
- background-color: mix(lighten($c, 10%), $selected_bg_color, 90%);
- box-shadow: inset 0 0 0 2px transparentize($selected_bg_color, 0.3);
- }
- }
-
- // hover key
- @else if $t==hover {
- color: $tc;
- background-color: lighten($c, 7%);
- }
-
- // active key
- @else if $t==active {
- color: $tc;
- background-color: lighten($c, 10%);
- }
-
- // checked key
- @else if $t==checked {
- color: $tc;
- background-color: lighten($c, 15%);
- }
-
- // insensitive key
- @else if $t==insensitive {
- color: $insensitive_fg_color;
- background-color: $insensitive_bg_color;
- }
-
- // reset
- @else if $t==undecorated {
- background-color: transparent;
- background-image: none;
- }
-}
-
-//
-// Button drawing function
-//
-// $t: button type,
-// $c: base button colors, derived from fg_color
-// $tc: base button colors, derived from fg_color
-//
-// possible $t values:
-// normal, hover, active, insensitive, insensitive-active,
-// backdrop, backdrop-active, backdrop-insensitive, backdrop-insensitive-active,
-// osd, osd-hover, osd-active, osd-insensitive, osd-backdrop, undecorated
-//
-// since buttons are all flat an borderless now the mixin is simpler
-
-@mixin button($t, $tc:$fg_color, $c:$bg_color, $flat: false) {
-
- $button_bg_color: mix($tc, $c, $button_mix_factor);
- transition-duration: 100ms;
-
- // normal button
- @if $t==normal {
- color: $tc;
- background-color: $button_bg_color;
- @if $flat {
- background-color: transparent;
- }
- @if $is_highcontrast {
- box-shadow: inset 0 0 0 1px $hc_inset_color;
- }
- }
-
- // hover button
- @else if $t==hover {
- color: $tc;
- background-color: lighten($button_bg_color, 3%);
- @if $is_highcontrast {
- box-shadow: inset 0 0 0 1px $hc_inset_color !important;
- }
- }
-
- // active button
- @else if $t==active {
- color: $tc;
- background-color: lighten($button_bg_color, 9%);
- }
-
- // checked button
- @else if $t==checked {
- color: $tc;
- background-color: lighten($button_bg_color, 9%);
- &:hover { background-color: lighten($button_bg_color, 12%);}
- &:active { background-color: lighten($button_bg_color, 15%);}
- }
-
- // focused button
- @if $t==focus {
- color: $tc;
- background-color: mix($button_bg_color, $selected_bg_color, 90%);
- box-shadow: inset 0 0 0 2px transparentize($selected_bg_color, 0.4) !important;
- &:hover {
- background-color: mix(lighten($button_bg_color, 3%), $selected_bg_color, 90%);
- box-shadow: inset 0 0 0 2px transparentize($selected_bg_color, 0.3) !important;
- }
- &:active {
- background-color: mix(lighten($button_bg_color, 6%), $selected_bg_color, 90%);
- box-shadow: inset 0 0 0 2px transparentize($selected_bg_color, 0.3) !important;
- }
- }
-
- // insensitive button
- @else if $t==insensitive {
- color: transparentize($tc, 0.5);
- background-color: transparentize($tc, .95);
- }
-
- // default/suggested button
- @else if $t==default {
- background-color: $selected_bg_color;
- color: $selected_fg_color;
-
- &:focus {
- box-shadow: inset 0 0 0 2px transparentize($selected_fg_color, .4) !important;
- }
- &:hover, &:focus {
- background-color: lighten($selected_bg_color, 5%);
- color: lighten($selected_fg_color, 5%);
- }
- &:active {
- background-color: darken($selected_bg_color, 7%);
- color: darken($selected_fg_color, 7%);
- }
- &:insensitive {
- @include button(insensitive);
- background-color: transparentize($selected_bg_color, .5);
- color: transparentize($selected_fg_color, .5);
- }
- }
-
- // reset
- @else if $t==undecorated {
- background-color: transparent;
- background-color: none;
- box-shadow: none;
- &:insensitive {
- @include button(insensitive);
- background-color: transparent;
- color: transparentize($selected_fg_color, .5);
- }
- }
-}
-
-// tile
-@mixin tile_button($color, $flat: true) {
- @extend %tile;
- @if $flat {
- background-color: transparent;
- } @else {
- background-color: transparentize($color, .84);
- @if $is_highcontrast {
- box-shadow: inset 999px 0 0 0 transparentize($color, .2); // bit of a hack
- }
- }
- &:hover { background-color: transparentize($color, .9);}
- &:selected, &:focus {
- background-color: transparentize($color, .87);
- &:hover { background-color: transparentize($color, .84);}
- &:active { background-color: transparentize($color, .87);}
- }
- &:active { background-color: transparentize($color, .84);}
- &:outlined, &:checked {
- background-color: transparentize($color, .81);
- &:active { background-color: transparentize($color, .78);}
- &:hover { background-color: transparentize($color, .75);}
- }
- &:drop {
- border: 2px solid transparentize($selected_bg_color, .2); //already 2px transparent so no jumping
- background-color: transparentize($selected_bg_color, .8);
- }
-}
-
-// overview icon, dash, app grid
-@mixin overview_icon($color, $flat: true) {
- transition-duration: 400ms;
- .overview-icon {
- @extend %tile;
- }
- @if $flat {
- .overview-icon { background-color: transparent;}
- } @else {
- .overview-icon {
- background-color: transparentize($color, .93);
- }
- }
- &:hover .overview-icon { background-color: transparentize($color, .9);}
-
- &:selected .overview-icon,
- &:focus .overview-icon {
- background-color: transparentize($color, .87);
- &:hover .overview-icon { background-color: transparentize($color, .84);}
- &:active .overview-icon { background-color: transparentize($color, .87);}
- }
- &:active .overview-icon { background-color: transparentize($color, .84);}
- &:outlined .overview-icon,
- &:checked .overview-icon {
- background-color: transparentize($color, .81);
- &:active .overview-icon { background-color: transparentize($color, .78);}
- &:hover .overview-icon { background-color: transparentize($color, .75);}
- }
- &:drop .overview-icon {
- border: 2px solid transparentize($selected_bg_color, .2); //already 2px transparent so no jumping
- background-color: transparentize($selected_bg_color, .8);
- }
-}
-
-// styling for elements within popovers that look like notifications
-@mixin card($flat: false) {
- border-radius: $base_border_radius*1.5;
- margin: $base_margin;
-
- @if $flat {
- @include button(undecorated);
- box-shadow: none !important;
- } @else {
- @include button(normal);
- }
- &:hover {@include button(hover);}
- &:active {@include button(active);}
- &:focus {@include button(focus);}
-}
-
-// styling for all menuitems in popovers
-@mixin menuitem($bg, $flat: true) {
-
- // lighten the background color always
- $bg: lighten($bg,5%);
-
- font-weight: normal;
- spacing: $base_padding;
- transition-duration: 100ms;
- padding: $base_padding*1.5 $base_padding*2;
-
- &:ltr {padding-left: $base_padding;}
- &:rtl {padding-right: $base_padding;}
-
- @if $flat {
- @include button(undecorated);
- box-shadow: none !important;
- } @else {
- @include button(normal, $c:$bg);
- }
- &:focus,
- &:hover {
- @include button(hover, $c:$bg);
- }
- &:active {@include button(active, $c:$bg);}
- &:checked {@include button(checked, $c:$bg);}
-}
diff --git a/data/gnome-shell-sass/_high-contrast-colors.scss b/data/gnome-shell-sass/_high-contrast-colors.scss
deleted file mode 100644
index 4d9aafdd..00000000
--- a/data/gnome-shell-sass/_high-contrast-colors.scss
+++ /dev/null
@@ -1,70 +0,0 @@
-// When color definition differs for dark and light variant,
-// it gets @if ed depending on $variant
-
-@import '_palette.scss';
-
-$is_highcontrast:true;
-
-$base_color: if($variant == 'light', white, black);
-$bg_color: if($variant == 'light', darken($base_color, 10%), lighten($base_color, 10%));
-$fg_color: if($variant == 'light', transparentize(black, .2), white);
-
-$selected_fg_color: white;
-$selected_bg_color: $blue_3;
-
-$selected_borders_color: darken($selected_bg_color, 20%);
-$borders_color: if($variant == 'light', transparentize($fg_color, .5), transparentize($fg_color, .7));
-$outer_borders_color: $borders_color;
-$link_color: lighten($selected_bg_color,20%);
-$link_visited_color: lighten($selected_bg_color,10%);
-
-$warning_color: if($variant == 'light', $yellow_5, #cd9309);
-$error_color: if($variant == 'light', $red_3, $red_4);
-$success_color: if($variant == 'light', $green_4, $green_5);
-$destructive_color: $error_color;
-
-$osd_fg_color: white;
-$osd_bg_color: $base_color;
-$osd_insensitive_bg_color: transparentize(mix($osd_fg_color, opacify($osd_bg_color, 1), 10%), 0.5);
-$osd_insensitive_fg_color: if($variant == 'light', mix($osd_fg_color, $osd_bg_color, 80%), mix($osd_fg_color, $osd_bg_color, 70%));
-$osd_borders_color: transparentize($osd_fg_color, 0.8);
-$osd_outer_borders_color: $osd_borders_color;
-
-$shadow_color: rgba(0,0,0,0);
-
-// hc
-$hc_inset_color: transparentize($fg_color, 0.7);
-
-// button
-$button_mix_factor: 20%;
-
-// notifications
-$bubble_buttons_color: if($variant == 'light', darken($bg_color, 7%), lighten($bg_color, 5%));
-
-// overview background color
-$system_bg_color: black;
-
-//insensitive state derived colors
-$insensitive_fg_color: mix($fg_color, $bg_color, 50%);
-$insensitive_bg_color: mix($bg_color, $base_color, 60%);
-$insensitive_borders_color: $borders_color;
-
-//colors for the backdrop state, derived from the main colors.
-$backdrop_base_color: lighten($base_color,1%);
-$backdrop_bg_color: $bg_color;
-$backdrop_fg_color: mix($fg_color, $backdrop_bg_color, 80%);
-$backdrop_insensitive_color: lighten($backdrop_bg_color,15%);
-$backdrop_borders_color: mix($borders_color, $bg_color, 90%);
-$backdrop_dark_fill: mix($backdrop_borders_color,$backdrop_bg_color, 35%);
-
-// derived checked colors
-$checked_bg_color: if($variant=='light', darken($bg_color, 12%), lighten($bg_color, 18%));
-$checked_fg_color: if($variant=='light', darken($fg_color, 12%), lighten($fg_color, 18%));
-
-// derived hover colors
-$hover_bg_color: if($variant=='light', darken($bg_color, 8%), lighten($bg_color, 20%));
-$hover_fg_color: if($variant=='light', darken($fg_color, 10%), lighten($fg_color, 20%));
-
-// derived active colors
-$active_bg_color: if($variant=='light', darken($bg_color, 10%), lighten($bg_color, 22%));
-$active_fg_color: if($variant=='light', darken($fg_color, 10%), lighten($fg_color, 22%));
diff --git a/data/gnome-shell-sass/_palette.scss b/data/gnome-shell-sass/_palette.scss
deleted file mode 100644
index 78847d95..00000000
--- a/data/gnome-shell-sass/_palette.scss
+++ /dev/null
@@ -1,46 +0,0 @@
-//GNOME Color Palette
-$blue_1: #99c1f1;
-$blue_2: #62a0ea;
-$blue_3: #3584e4;
-$blue_4: #1c71d8;
-$blue_5: #1a5fb4;
-$green_1: #8ff0a4;
-$green_2: #57e389;
-$green_3: #33d17a;
-$green_4: #2ec27e;
-$green_5: #26a269;
-$yellow_1: #f9f06b;
-$yellow_2: #f8e45c;
-$yellow_3: #f6d32d;
-$yellow_4: #f5c211;
-$yellow_5: #e5a50a;
-$orange_1: #ffbe6f;
-$orange_2: #ffa348;
-$orange_3: #ff7800;
-$orange_4: #e66100;
-$orange_5: #c64600;
-$red_1: #f66151;
-$red_2: #ed333b;
-$red_3: #e01b24;
-$red_4: #c01c28;
-$red_5: #a51d2d;
-$purple_1: #dc8add;
-$purple_2: #c061cb;
-$purple_3: #9141ac;
-$purple_4: #813d9c;
-$purple_5: #613583;
-$brown_1: #cdab8f;
-$brown_2: #b5835a;
-$brown_3: #986a44;
-$brown_4: #865e3c;
-$brown_5: #63452c;
-$light_1: #ffffff;
-$light_2: #f6f5f4;
-$light_3: #deddda;
-$light_4: #c0bfbc;
-$light_5: #9a9996;
-$dark_1: #77767b;
-$dark_2: #5e5c64;
-$dark_3: #3d3846;
-$dark_4: #241f31;
-$dark_5: #000000;
\ No newline at end of file
diff --git a/data/gnome-shell-sass/_widgets.scss b/data/gnome-shell-sass/_widgets.scss
deleted file mode 100644
index ee16a714..00000000
--- a/data/gnome-shell-sass/_widgets.scss
+++ /dev/null
@@ -1,50 +0,0 @@
-//
-// Shell widgets stylesheets are placed in separate .scss files
-// in 'widgets' and imported into the main stylesheet in this file.
-// To create or update a widget for the shell modify the list below.
-//
-
-/* WIDGETS */
-
-// Primary widgets
-@import 'widgets/base';
-@import 'widgets/entries';
-@import 'widgets/buttons';
-@import 'widgets/check-box';
-@import 'widgets/switches';
-@import 'widgets/slider';
-@import 'widgets/scrollbars';
-// Popovers
-@import 'widgets/popovers';
-@import 'widgets/calendar';
-@import 'widgets/message-list';
-@import 'widgets/ibus-popup';
-// Notifications
-@import 'widgets/notifications';
-@import 'widgets/hotplug';
-// Dialogs
-@import 'widgets/dialogs';
-// OSDs
-@import 'widgets/osd';
-@import 'widgets/switcher-popup';
-@import 'widgets/workspace-switcher';
-@import 'widgets/screenshot';
-// Panel
-@import 'widgets/panel';
-@import 'widgets/corner-ripple';
-@import 'widgets/quick-settings';
-// Overview
-@import 'widgets/overview';
-@import 'widgets/window-picker';
-@import 'widgets/search-entry';
-@import 'widgets/search-results';
-@import 'widgets/dash';
-@import 'widgets/app-grid';
-@import 'widgets/workspace-thumbnails';
-// A11y / misc
-@import 'widgets/a11y';
-@import 'widgets/misc';
-@import 'widgets/keyboard';
-@import 'widgets/looking-glass';
-// Lock / login screen
-@import 'widgets/login-lock';
diff --git a/data/gnome-shell-sass/gnome-shell-sass.doap b/data/gnome-shell-sass/gnome-shell-sass.doap
deleted file mode 100644
index f18ec1b8..00000000
--- a/data/gnome-shell-sass/gnome-shell-sass.doap
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
- GNOME Shell Sass
- Sass sources of GNOME Shell
- GNOME Shell Sass is a project intended to allow the sharing of the
- sass theme sources between gnome-shell and other projects like gnome-shell-extensions.
-
-
- sass
- css
-
-
-
- Carlos Soriano
-
- csoriano
-
-
-
-
- Florian Müllner
-
- fmuellner
-
-
-
-
- Jakub Steiner
-
- jimmac
-
-
-
diff --git a/data/gnome-shell-sass/widgets/_a11y.scss b/data/gnome-shell-sass/widgets/_a11y.scss
deleted file mode 100644
index 31b5c4b7..00000000
--- a/data/gnome-shell-sass/widgets/_a11y.scss
+++ /dev/null
@@ -1,24 +0,0 @@
-// Pointer location
-.ripple-pointer-location {
- width: $ripple_size;
- height: $ripple_size;
- border-radius: $ripple_size * 0.5; // radius equals the size of the box to give us the curve
- background-color: lighten(transparentize($selected_bg_color, 0.7), 30%);
- box-shadow: 0 0 2px 2px lighten($selected_bg_color, 20%);
-}
-
-// Pointer accessibility notifications
-.pie-timer {
- width: 60px;
- height: 60px;
- -pie-border-width: 3px;
- -pie-border-color: $selected_bg_color;
- -pie-background-color: lighten(transparentize($selected_bg_color, 0.7), 40%);
-}
-
-// Screen zoom/Magnifier
-.magnifier-zoom-region {
- border: 2px solid $selected_bg_color;
-
- &.full-screen { border-width: 0; }
-}
diff --git a/data/gnome-shell-sass/widgets/_app-grid.scss b/data/gnome-shell-sass/widgets/_app-grid.scss
deleted file mode 100644
index 31d43829..00000000
--- a/data/gnome-shell-sass/widgets/_app-grid.scss
+++ /dev/null
@@ -1,177 +0,0 @@
-/* App Grid */
-
-$app_icon_size: 96px;
-
-// app icons
-.icon-grid {
- row-spacing: $base_padding * 2;
- column-spacing: $base_padding * 2;
- max-row-spacing: $base_padding * 7;
- max-column-spacing: $base_padding * 7;
- page-padding-top: $base_padding * 4;
- page-padding-bottom: $base_padding * 4;
- page-padding-left: $base_padding * 3;
- page-padding-right: $base_padding * 3;
-}
-
-/* App Icons */
-
-// Icon tiles in the app grid
-.app-well-app {
- @include overview_icon($osd_fg_color);
-
- .overview-icon {
- padding: $base_padding*2;
- border-radius: $base_border_radius*3;
- }
- .overview-icon.overview-icon-with-label {
- > StBoxLayout {
- spacing: $base_padding;
- }
- }
-}
-
-// app folders
-.app-well-app.app-folder {
- @include overview_icon($fg_color, $flat: false);
-}
-
-// expanded folder
-.app-folder-dialog {
- border-radius: $modal_radius*4;
- background-color: $bg_color;
- padding: $base_padding*2;
- box-shadow:inset 0 0 0 1px $outer_borders_color;
-
- @if $is_highcontrast {
- box-shadow:inset 0 0 0 2px $hc_inset_color;
- }
-
- & .folder-name-container {
- padding: 24px 36px 0;
- spacing: 12px;
-
- & .folder-name-label,
- & .folder-name-entry {
- @extend %title_1;
- }
-
- & .folder-name-entry {
- width: 12em;
- border-radius: $base_border_radius*2;
- }
-
- /* FIXME: this is to keep the label in sync with the entry */
- & .folder-name-label { padding: 5px 7px; color: $osd_fg_color; }
-
- & .edit-folder-button {
- @extend %button;
- padding: 0;
- width: 36px;
- height: 36px;
- border-radius: 99px;
- & > StIcon { icon-size: $base_icon_size }
- }
- }
-
- & .icon-grid {
- row-spacing: $base_padding * 2;
- column-spacing: $base_padding * 5;
- page-padding-top: 0;
- page-padding-bottom: 0;
- page-padding-left: 0;
- page-padding-right: 0;
- }
-
- & .page-indicators {
- margin-bottom: 18px;
- }
-}
-
-.app-folder-dialog-container {
- padding: $base_padding*2;
- width: 720px;
- height: 720px;
-}
-
-// Running app indicator (also shown in dash)
-.app-well-app-running-dot {
- height: 5px;
- width: 5px;
- border-radius:5px;
- margin-bottom: 8px;
- background-color: $osd_fg_color;
-}
-
-// Rename popup for app folders
-.rename-folder-popup {
- .rename-folder-popup-item {
- spacing: $base_padding;
- &:ltr, &:rtl { padding: 0 $base_padding * 2; }
- }
-}
-
-// App Grid pagination indicators
-.page-indicator {
- padding: $base_padding $base_padding * 2 0;
- transition-duration:400ms;
-
- .page-indicator-icon {
- width: 10px;
- height: 10px;
- border-radius: 10px; // the same as height&width
- background-color: white;
- }
-}
-
-.apps-scroll-view {
- padding: 0;
-}
-
-// shutdown and other actions in the grid
-.system-action-icon {
- background-color: rgba(0,0,0,0.8);
- color: white;
- border-radius: 99px;
- icon-size: $app_icon_size * 0.5;
- @if $is_highcontrast {
- box-shadow: inset 0 0 0 2px $hc_inset_color;
- }
-}
-
-.page-navigation-hint {
- &.dnd {
- background: rgba(255, 255, 255, 0.1);
- }
-
- &.next:ltr,
- &.previous:rtl {
- background-gradient-start: rgba(255, 255, 255, 0.05);
- background-gradient-end: transparent;
- background-gradient-direction: horizontal;
- border-radius: $modal_radius*1.5 0px 0px $modal_radius*1.5;
- }
-
- &.previous:ltr,
- &.next:rtl {
- background-gradient-start: transparent;
- background-gradient-end: rgba(255, 255, 255, 0.05);
- background-gradient-direction: horizontal;
- border-radius: 0px $modal_radius*1.5 $modal_radius*1.5 0px;
- }
-}
-
-.page-navigation-arrow {
- margin: 6px;
- padding: 18px;
- width: 24px;
- height: 24px;
- border-radius: 99px;
- @if $is_highcontrast {
- @include button(normal, $osd_fg_color, transparentize($osd_bg_color, 0.5));
- }
-
- &:insensitive { @include button(undecorated, $osd_fg_color, transparentize($osd_bg_color, 0.5));}
- &:hover { @include button(hover, $osd_fg_color, transparentize($osd_bg_color, 0.5));}
- &:active { @include button(active, $osd_fg_color, transparentize($osd_bg_color, 0.5));}
-}
diff --git a/data/gnome-shell-sass/widgets/_base.scss b/data/gnome-shell-sass/widgets/_base.scss
deleted file mode 100644
index 69ebb301..00000000
--- a/data/gnome-shell-sass/widgets/_base.scss
+++ /dev/null
@@ -1,18 +0,0 @@
-// Links
-.shell-link {
- color: $link_color;
-
- &:hover {
- color: lighten($link_color, 10%);
- }
-}
-
-// Outline for low res icons
-.lowres-icon {
- icon-shadow: 0 1px 2px rgba(black, 0.3);
-}
-
-// Dropshadow for large icons
-.icon-dropshadow {
- icon-shadow: 0 1px 5px rgba(black, 0.8);
-}
diff --git a/data/gnome-shell-sass/widgets/_buttons.scss b/data/gnome-shell-sass/widgets/_buttons.scss
deleted file mode 100644
index 84d23161..00000000
--- a/data/gnome-shell-sass/widgets/_buttons.scss
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Buttons */
-
-.button {
- @extend %button; // that's it
- min-height: 22px;
-}
-
-.icon-button {
- @extend .button; // same style as buttons
-
- border-radius: 99px;
- padding: $base_padding*2;
- min-height: 16px;
-
- StIcon {
- icon-size: $base_icon_size;
- -st-icon-style: symbolic;
- }
-}
diff --git a/data/gnome-shell-sass/widgets/_calendar.scss b/data/gnome-shell-sass/widgets/_calendar.scss
deleted file mode 100644
index df91dce5..00000000
--- a/data/gnome-shell-sass/widgets/_calendar.scss
+++ /dev/null
@@ -1,265 +0,0 @@
-/* Date/Time Menu */
-
-// overall menu
-#calendarArea {
- padding: $base_padding - 2px;
-}
-
-// Calendar menu side column
-.datemenu-calendar-column {
- spacing: $base_padding;
- &:ltr {padding-left: $base_padding;}
- &:rtl {padding-right: $base_padding;}
- .datemenu-displays-box {spacing: $base_padding;}
-}
-
-/* today button (the date) */
-.datemenu-today-button {
- @include card(flat);
- padding: $base_padding * 1.5;
-
- // weekday label
- .day-label {
- @extend %heading;
- }
-
- // date label
- .date-label {
- @extend %title_2;
- }
-}
-
-/* Calendar */
-.calendar {
- @include card(flat);
- margin-top: 0;
-
- // month header
- .calendar-month-header {
-
- // prev/next month icons
- .calendar-change-month-back StIcon,
- .calendar-change-month-forward StIcon {
- icon-size: $base_icon_size;
- }
-
- // month label
- .calendar-month-label {
- @extend %heading;
- padding: 8px 0;
- }
- .pager-button {
- background-color: transparent;
- height: 32px;
- width: 32px;
- margin: 2px;
- border-radius: $base_border_radius;
- &:hover, &:focus {background-color: $hover_bg_color;}
- &:active {background-color: $active_bg_color;}
- @if $is_highcontrast {
- border:1px solid $hc_inset_color;
- }
- }
- }
-
- $calendar_day_size: 3em;
-
- .calendar-day-base {
- text-align: center;
- margin: 2px;
- padding: 0 !important;
- height: $calendar_day_size !important;
- width: $calendar_day_size !important;
- border-radius: 99px;
- transition-duration: 100ms;
- @extend %numeric;
- @extend %smaller;
-
- &:hover {background-color: $hover_bg_color;}
- &:focus {
- background-color: mix($bg_color, $selected_bg_color, 80%);
- color: $selected_fg_color;
- box-shadow:inset 0 0 0 2px transparentize($selected_bg_color, 0.4);
- }
-
- &:active,&:selected {
- color: $active_fg_color;
- background-color: $active_bg_color;
- &:focus {
- background-color: mix($active_bg_color, $selected_bg_color, 80%);
- }
- }
-
- // day of week heading
- &.calendar-day-heading {
- color: $insensitive_fg_color;
- padding-top: $base_padding;
- height: 16px !important; // force heading to be smaller height
- font-weight: 600;
- @extend %smaller;
- }
- }
-
- .calendar-day {
- font-weight: 600;
- @if $is_highcontrast {
- border:1px solid $hc_inset_color;
- border-radius: 9px;
- }
- }
- .calendar-work-day {}
- .calendar-nonwork-day {color: $insensitive_fg_color;}
- .calendar-other-month-day {
- color: transparentize($fg_color, 0.5);
- &.calendar-nonwork-day {
- color: transparentize($insensitive_fg_color, 0.5);
- }
- }
-
- // Today
- .calendar-today {
- background-color: $selected_bg_color;
- font-weight: 800;
- color: $selected_fg_color !important;
-
- &:hover,&:focus {
- background-color:lighten($selected_bg_color, 3%);
- color: inherit;
- }
-
- &:active,&:selected {
- background-color: $selected_bg_color;
- color: inherit;
-
- &:hover,&:focus {
- background-color:lighten($selected_bg_color, 3%);
- color: inherit;
- }
- }
- }
-
- .calendar-day-with-events {
- background-image: if($variant == 'light', url("resource:///org/gnome/shell/theme/calendar-today-light.svg"),url("resource:///org/gnome/shell/theme/calendar-today.svg"));
- background-size: contain;
- }
-
- .calendar-week-number {
- @include fontsize($base_font_size - 4);
- font-weight: bold;
- font-feature-settings: "tnum";
- margin: 6px;
- padding: 0 $base_padding;
- border-radius: 3px;
- background-color: transparentize($fg_color, 0.9);
- color: $insensitive_fg_color
- }
-}
-
-/* Events */
-.events-button {
- @include card;
- padding: $base_padding * 2;
-
- .events-box {
- spacing: $base_padding;
- }
-
- .events-list {
- spacing: 2 * $base_padding;
- }
-
- .events-title {
- @extend %heading;
- color: $insensitive_fg_color;
- margin-bottom: $base_margin;
- }
-
- .event-time {
- @extend %numeric;
- @extend %caption;
- color: $insensitive_fg_color;
- }
-}
-
-/* World clocks */
-.world-clocks-button {
- @include card;
- padding: $base_padding * 2;
-
- .world-clocks-grid {
- spacing-rows: $base_padding;
- spacing-columns: $base_padding * 2;
- }
-
- // title
- .world-clocks-header {
- @extend %heading;
- color: $insensitive_fg_color;
- }
-
- // city label
- .world-clocks-city {
- color: $fg_color;
- }
-
- // timezone time
- .world-clocks-time {
- @extend %heading;
- @extend %numeric;
- color: $fg_color;
-
- &:ltr {text-align: right;}
- &:rtl {text-align: left;}
- }
-
- // timezone offset label
- .world-clocks-timezone {
- @extend %numeric;
- @extend %caption;
- color: $insensitive_fg_color;
- }
-}
-
-/* Weather */
-.weather-button {
- @include card;
- padding: $base_padding * 2;
-
- .weather-box {
- spacing: $base_padding + $base_margin;
- }
-
- .weather-header-box {
- spacing: $base_padding;
- }
-
- .weather-header {
- color: $insensitive_fg_color;
- @extend %heading;
-
- &.location {
- font-weight: normal;
- }
- }
-
- .weather-grid {
- spacing-rows: $base_padding;
- spacing-columns: $base_padding * 2;
- }
-
- .weather-forecast-time {
- @extend %numeric;
- @extend %caption;
- color: darken($fg_color,30%);
- padding-top: 0.2em;
- padding-bottom: 0.4em;
- }
-
- .weather-forecast-icon {
- icon-size: $large_icon_size;
- }
-
- .weather-forecast-temp {
- @extend %heading;
- }
-}
diff --git a/data/gnome-shell-sass/widgets/_check-box.scss b/data/gnome-shell-sass/widgets/_check-box.scss
deleted file mode 100644
index 1480ade2..00000000
--- a/data/gnome-shell-sass/widgets/_check-box.scss
+++ /dev/null
@@ -1,18 +0,0 @@
-/* Check Boxes */
-
-// these are equal to the size of the SVG assets
-$check_height: 24px;
-$check_width: 24px;
-
-
-.check-box {
- StBoxLayout { spacing: .8em; }
- StBin {
- width: $check_width;
- height: $check_height;
- background-image: if($variant == 'light', url("resource:///org/gnome/shell/theme/checkbox-off-light.svg"), url("resource:///org/gnome/shell/theme/checkbox-off.svg"));
- }
- &:focus StBin { background-image: if($variant == 'light', url("resource:///org/gnome/shell/theme/checkbox-off-focused-light.svg"), url("resource:///org/gnome/shell/theme/checkbox-off-focused.svg"));; }
- &:checked StBin { background-image: url("resource:///org/gnome/shell/theme/checkbox.svg"); }
- &:focus:checked StBin { background-image: url("resource:///org/gnome/shell/theme/checkbox-focused.svg"); }
-}
diff --git a/data/gnome-shell-sass/widgets/_corner-ripple.scss b/data/gnome-shell-sass/widgets/_corner-ripple.scss
deleted file mode 100644
index 9aff4317..00000000
--- a/data/gnome-shell-sass/widgets/_corner-ripple.scss
+++ /dev/null
@@ -1,15 +0,0 @@
-/* Activities Ripple */
-
-$ripple_size: 50px;
-
-.ripple-box {
- background-color: rgba(255,255,255,0.2);
- box-shadow: 0 0 2px 2px rgba(255,255,255,0.2);
- // plus + 2px for the border (box-shadow)
- width: $ripple_size + 2px;
- height: $ripple_size + 2px;
- border-radius: 0 0 $ripple_size + 2px 0; // radius equals the size of the box to give us the curve
-
- // just a simple change to the border radius position
- &:rtl { border-radius: 0 0 0 $ripple_size + 2px; }
-}
diff --git a/data/gnome-shell-sass/widgets/_dash.scss b/data/gnome-shell-sass/widgets/_dash.scss
deleted file mode 100644
index 8f9b5e71..00000000
--- a/data/gnome-shell-sass/widgets/_dash.scss
+++ /dev/null
@@ -1,80 +0,0 @@
-/* Dash */
-
-$dash_background_color: lighten($system_bg_color, 5%);
-$dash_placeholder_size: 32px;
-$dash_padding: $base_padding*2; // 12px
-$dash_border_radius: $modal_radius + $dash_padding;
-
-// container for the dash
-#dash {
- @extend %caption;
- margin-top: $dash_padding;
-
- .placeholder {
- // background-image: url("resource:///org/gnome/shell/theme/dash-placeholder.svg");
- background-image:none;
- background-size: contain;
- height: $dash_placeholder_size;
- }
-
- .empty-dash-drop-target {
- width: $dash_placeholder_size;
- height: $dash_placeholder_size;
- }
-
- // Running app indicator (also shown in app grid)
- .app-well-app-running-dot {
- margin-bottom: 14px; // hardcoded
- }
-}
-
-// background of the dash behind app icons
-.dash-background {
- background-color: $dash_background_color;
- border-radius: $dash_border_radius;
- padding: $dash_padding;
- spacing: $base_padding;
- margin-bottom: $dash_padding;
-
- @if $is_highcontrast {
- border: 2px solid $hc_inset_color;
- box-shadow:none;
- }
-}
-
-// items on the dash
-.dash-item-container {
- > * {margin: 0 2px;}
- &:ltr{&:first-child {margin-left: 0;}}
- &:rtl{&:first-child {margin-right: 0;}}
-
- // each app item on the dash
- .app-well-app .overview-icon {
- padding: $base_padding;
- border-radius: $base_border_radius*2;
- }
-
- // show apps button
- .show-apps { @include overview_icon($osd_fg_color);}
-
- .show-apps, .app-well-app {
- padding-bottom: $dash_padding;
- }
-}
-
-// separator between favourites and running apps
-.dash-separator {
- width: 1px;
- margin: 0 $base_margin;
- background-color: $borders_color;
- margin-bottom: $dash_padding;
- @if $is_highcontrast {
- width: 2px;
- }
-}
-
-// OSD Tooltip
-.dash-label {
- @extend %tooltip;
- -y-offset: $base_margin * 2; // distance from the dash edge
-}
diff --git a/data/gnome-shell-sass/widgets/_dialogs.scss b/data/gnome-shell-sass/widgets/_dialogs.scss
deleted file mode 100644
index 98b3b8ce..00000000
--- a/data/gnome-shell-sass/widgets/_dialogs.scss
+++ /dev/null
@@ -1,174 +0,0 @@
-/* Modal Dialogs */
-
-.headline {
- @extend %title_4;
-}
-
-.modal-dialog {
- background-color: $bg_color;
- border-radius: $modal_radius;
- box-shadow: inset 0 0 0 1px $outer_borders_color;
-
- .modal-dialog-content-box {
- margin: 32px 40px;
- spacing: 32px;
- max-width: 28em;
- }
-
- .modal-dialog-linked-button {
- @extend %bubble_button;
- }
-}
-
-/* End Session Dialog */
-.end-session-dialog {
- width: 30em;
-
- .end-session-dialog-battery-warning,
- .dialog-list-title {
- color: $warning_color;
- }
-}
-
-/* Message Dialog */
-.message-dialog-content {
- spacing: 18px;
-
- .message-dialog-title {
- text-align: center;
- @extend %title_2;
-
- &.lightweight { @extend %title_4;}
- }
- .message-dialog-description { text-align: center; }
-}
-
-/* Dialog List */
-.dialog-list {
- spacing: 18px;
-
- .dialog-list-title {
- text-align: center;
- @extend %heading;
- }
-
- .dialog-list-scrollview { max-height: 200px; }
- .dialog-list-box {
- spacing: 1em;
-
- .dialog-list-item {
- spacing: 1em;
-
- .dialog-list-item-title { font-weight: bold; }
- .dialog-list-item-description {
- color: darken($fg_color,5%);
- @extend %caption;
- }
- }
- }
-}
-
-/* Run Dialog */
-.run-dialog {
- .modal-dialog-content-box {
- margin-top: 24px;
- margin-bottom: 14px;
- }
- .run-dialog-entry { width: 20em; }
- .run-dialog-description {
- @extend %caption;
- text-align: center;
- color: darken($fg_color, 20%);
- }
-}
-
-/* Password or Authentication Dialog */
-
-.prompt-dialog {
- width: 28em;
-
- .modal-dialog-content-box {
- margin-bottom: 24px;
- }
-}
-
-.prompt-dialog-password-grid {
- spacing-rows: 8px;
- spacing-columns: 4px;
-
- .prompt-dialog-password-entry {
- width: auto;
-
- // 4px (spacing) + 16px (spinner-width)
- &:ltr { margin-left: 20px; }
- &:rtl { margin-right: 20px; }
- }
-}
-
-.prompt-dialog-password-layout {
- spacing: 8px;
-}
-
-.prompt-dialog-password-entry {
- width: 20em;
-}
-
-.prompt-dialog-error-label,
-.prompt-dialog-info-label,
-.prompt-dialog-null-label {
- text-align: center;
- @extend %caption;
-}
-
-.prompt-dialog-error-label {
- color: $warning_color;
-}
-
-
-/* Polkit Dialog */
-
-.polkit-dialog-user-layout {
- text-align: center;
- spacing: 8px;
- margin-bottom: 6px;
-
- .polkit-dialog-user-root-label { color: $warning_color; }
-}
-
-/* Audio selection dialog */
-.audio-device-selection-dialog {
- .modal-dialog-content-box { margin-bottom: 28px; }
- .audio-selection-box { spacing: 20px; }
-}
-
-.audio-selection-device {
- border-radius: $base_border_radius*2;
- &:hover,&:focus { background-color: $hover_bg_color; }
- &:active {
- background-color: $selected_bg_color;
- color: $selected_fg_color;
- }
-}
-
-.audio-selection-device-box {
- padding: 20px;
- spacing: 20px;
-}
-
-.audio-selection-device-icon {
- icon-size: $base_icon_size * 4;
-}
-
-/* Welcome dialog */
-.welcome-dialog-image {
- background-image: url("resource:///org/gnome/shell/theme/gnome-shell-start.svg");
- background-size: contain;
- /* Reasonable maximum dimensions */
- height: 300px;
- width: 300px;
-}
-
-/* Access portal dialog */
-.access-dialog {
- text-align: center;
-}
\ No newline at end of file
diff --git a/data/gnome-shell-sass/widgets/_entries.scss b/data/gnome-shell-sass/widgets/_entries.scss
deleted file mode 100644
index ed65b787..00000000
--- a/data/gnome-shell-sass/widgets/_entries.scss
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Entries */
-
-StEntry {
- @extend %entry;
-
- StIcon.capslock-warning {
- icon-size: $base_icon_size;
- warning-color: $warning_color;
- padding: 0 4px;
- }
-
- StIcon.peek-password {
- icon-size: $base_icon_size;
- padding: 0 4px;
- }
-
- StLabel.hint-text {
- margin-left: 2px;
- color: transparentize($fg_color, 0.3);
- }
-}
diff --git a/data/gnome-shell-sass/widgets/_hotplug.scss b/data/gnome-shell-sass/widgets/_hotplug.scss
deleted file mode 100644
index acd0265d..00000000
--- a/data/gnome-shell-sass/widgets/_hotplug.scss
+++ /dev/null
@@ -1,10 +0,0 @@
-// hotplug
-
-.hotplug-notification-item {
- @extend %bubble_button;
-}
-
-.hotplug-notification-item-icon {
- icon-size: 24px;
- padding: 0 4px;
-}
diff --git a/data/gnome-shell-sass/widgets/_ibus-popup.scss b/data/gnome-shell-sass/widgets/_ibus-popup.scss
deleted file mode 100644
index 8cbaa952..00000000
--- a/data/gnome-shell-sass/widgets/_ibus-popup.scss
+++ /dev/null
@@ -1,39 +0,0 @@
-// IBus Candidate Popup
-
-.candidate-popup-boxpointer {
- @extend .popup-menu-boxpointer;
-}
-
-.candidate-popup-content {
- padding: $base_padding;
- spacing: $base_padding;
- @extend .popup-menu-content;
-}
-
-.candidate-index {
- padding: 0;
- padding-right: $base_padding;
- color: $insensitive_fg_color;
-}
-
-.candidate-box {
- padding: $base_padding $base_padding*2 $base_padding $base_padding*2;
- border-radius: $base_border_radius;
- &:selected { background-color: $selected_bg_color; color: $selected_fg_color; }
- &:hover { background-color: $hover_bg_color; color: $hover_fg_color; }
-}
-
-.candidate-page-button-box {
- height: 2em;
- .vertical & { padding-top: $base_padding*2; }
- .horizontal & { padding-left: $base_padding*2; }
-}
-
-.candidate-page-button {
- padding: $base_padding;
-
- & StIcon { icon-size: $base_icon_size; }
-}
-
-.candidate-page-button-previous { border-radius: $base_border_radius 0px 0px $base_border_radius; border-right-width: 0;box-shadow: none;}
-.candidate-page-button-next { border-radius: 0px $base_border_radius $base_border_radius 0px;box-shadow: none;}
diff --git a/data/gnome-shell-sass/widgets/_keyboard.scss b/data/gnome-shell-sass/widgets/_keyboard.scss
deleted file mode 100644
index 1dc6b953..00000000
--- a/data/gnome-shell-sass/widgets/_keyboard.scss
+++ /dev/null
@@ -1,159 +0,0 @@
-/* On-screen Keyboard */
-
-$key_size: 1.2em;
-$key_border_radius: $base_border_radius + 4px; // 12px
-$key_bg_color: darken($osd_fg_color, 70%);
-// $default_key_bg_color: darken($key_bg_color, 4%);
-$default_key_bg_color: if($variant=='light', darken($key_bg_color, 11%), darken($key_bg_color, 10%));
-
-
-// draw keys using button function
-#keyboard {
- // background-color: transparentize(if($variant=='light', darken($bg_color, 5%), darken($bg_color, 8%)), 0.1);
- background-color: $osd_bg_color;
- box-shadow: inset 0 1px 0 0 $osd_outer_borders_color;
-
- .page-indicator {
- padding: $base_padding;
-
- .page-indicator-icon {
- width: 8px;
- height: 8px;
- }
- }
-}
-
-// the container for individual keys
-.key-container {
- padding: $base_margin;
- spacing: $base_margin;
-}
-
-// the keys
-.keyboard-key {
-
- @include fontsize($base_font_size + 5);
- font-weight: bold;
- min-height: $key_size;
- min-width: $key_size;
- border-width: 1px;
- border-style: solid;
- border-radius: $key_border_radius;
- box-shadow: 0 1px 0 0 $shadow_color;
-
- @include keyboard_key(normal, $key_bg_color, $osd_fg_color);
-
- &:focus { @include keyboard_key(focus);}
- &:hover { @include keyboard_key(hover, $key_bg_color, $osd_fg_color);}
- &:active { @include keyboard_key(active, $key_bg_color, $osd_fg_color); }
- &:checked { @include keyboard_key(checked, $key_bg_color, $osd_fg_color); }
-
- &:grayed { //FIXMEy
- background-color: darken($bg_color, 3%);
- color: $osd_fg_color;
- border-color: $osd_borders_color;
- }
-
- // non-character keys
- &.default-key {
- @include keyboard_key(normal, $default_key_bg_color, $osd_fg_color);
- &:hover {@include keyboard_key(hover, $default_key_bg_color, $osd_fg_color);}
- &:active { @include keyboard_key(active, $default_key_bg_color, $osd_fg_color);}
- &:checked { @include keyboard_key(checked, $default_key_bg_color, $osd_fg_color);}
- border-radius: $key_border_radius;
-
- // keys that may be latched: ctrl/alt/shift
- &:latched {
- border-color: lighten($selected_bg_color, 5%);
- background-color: $selected_bg_color;
- }
- }
-
- // enter key is suggested-action
- &.enter-key {
- @include keyboard_key(normal, $selected_bg_color, $selected_fg_color);
- &:hover { @include keyboard_key(hover, $selected_bg_color, $selected_fg_color);}
- &:active {@include keyboard_key(active, $selected_bg_color, $selected_fg_color);}
- &:checked {@include keyboard_key(checked, $selected_bg_color, $selected_fg_color);}
- border-radius: $key_border_radius;
- color: $osd_fg_color;
- }
-
- &.shift-key-lowercase {}
-
- // pressed shift has different style
- &.shift-key-uppercase {
- background-color: lighten($key_bg_color, 20%);
- color: $osd_bg_color;
- &:hover {
- background-color: lighten($key_bg_color, 25%);
- color: lighten($osd_bg_color, 5%);
- }
- }
-
- // size of icons on keys
- StIcon { icon-size: 24px; }
-}
-
-// long press on a key popup
-.keyboard-subkeys {
- -arrow-border-radius: $base_border_radius*2;
- -arrow-background-color: $osd_bg_color;
- -arrow-border-width: 1px;
- -arrow-border-color: lighten($osd_bg_color, 9%);
- -arrow-base: 20px;
- -arrow-rise: 10px;
- -boxpointer-gap: $base_padding;
- padding: $base_padding;
-
- .keyboard-key {
- @include keyboard_key(normal, $key_bg_color, $osd_fg_color);
-
- &:focus { @include keyboard_key(focus);}
- &:hover { @include keyboard_key(hover, $key_bg_color, $osd_fg_color);}
- &:active { @include keyboard_key(active, $key_bg_color, $osd_fg_color); }
- &:checked { @include keyboard_key(checked, $key_bg_color, $osd_fg_color); }
-
- border-radius:$key_border_radius;
- }
-}
-
-// emoji
-.emoji-page {
- .keyboard-key {
- background-color: transparent;
- border: none;
- color: initial;
- }
-}
-
-.emoji-panel {
- .keyboard-key:latched {
- border-color: lighten($selected_bg_color, 5%);
- background-color: $selected_bg_color;
- }
-}
-
-// suggestions
-.word-suggestions {
- @include fontsize($base_font_size + 1);
- spacing: 12px;
- min-height: 17pt;
- padding: $base_padding*2;
- color: $osd_fg_color;
-
- // each suggestion
- StButton {
- margin: 0 3px;
- min-width: 32px;
- border-radius: $base_border_radius - 2px;
- padding: 0px $base_padding*3;
-
- @include keyboard_key(undecorated, $key_bg_color, $osd_fg_color);
-
- &:focus { @include keyboard_key(focus);}
- &:hover { @include keyboard_key(hover, $key_bg_color, $osd_fg_color);}
- &:active { @include keyboard_key(active, $key_bg_color, $osd_fg_color); }
- &:checked { @include keyboard_key(checked, $key_bg_color, $osd_fg_color); }
- }
-}
diff --git a/data/gnome-shell-sass/widgets/_login-lock.scss b/data/gnome-shell-sass/widgets/_login-lock.scss
deleted file mode 100644
index cc67cb95..00000000
--- a/data/gnome-shell-sass/widgets/_login-lock.scss
+++ /dev/null
@@ -1,283 +0,0 @@
-$_gdm_bg: $system_bg_color;
-$_gdm_fg: white;
-$_gdm_dialog_width: 23em;
-
-// common style for gdm and lockscreen
-.login-dialog,
-.unlock-dialog {
-
- .caps-lock-warning-label,
- .login-dialog-message-warning {
- color: $_gdm_fg;
- }
-}
-
-/* Login Dialog */
-.login-dialog {
- background-color: $_gdm_bg;
-}
-
-// buttons
-.login-dialog-button {
- @extend .button;
-
- &.cancel-button,
- &.switch-user-button,
- &.login-dialog-session-list-button {
- @extend .icon-button;
- }
-
- &.cancel-button {
- padding: $base_padding*1.5;
- }
-}
-
-.login-dialog-button-box {
- width: $_gdm_dialog_width;
- spacing: $base_padding*2;
-}
-
-.login-dialog-logo-bin {
- margin:3em 0;
-}
-.login-dialog-banner { color: darken($_gdm_fg,10%); }
-.login-dialog-banner-view { max-width: $_gdm_dialog_width; }
-.login-dialog-message { text-align: center; }
-.login-dialog-user-selection-box { padding: 100px 0px; }
-
-.login-dialog-not-listed-label {
- @include fontsize($base_font_size);
- font-weight: bold;
- color: darken($_gdm_fg,30%);
- padding: $base_padding*2;
-
- .login-dialog-not-listed-button:focus &,
- .login-dialog-not-listed-button:hover & {
- color: $_gdm_fg;
- }
- .login-dialog-not-listed-button:focus & {
- text-decoration: underline;
- }
-}
-
-.login-dialog-auth-list-view { -st-vfade-offset: 1em; }
-.login-dialog-auth-list {
- spacing: 6px;
- margin-left: 2em;
-}
-.login-dialog-auth-list-title {
- margin-left: 2em;
-}
-
-.login-dialog-auth-list-item {
- border-radius: $base_border_radius*2;
- padding: 4px;
- color: darken($_gdm_fg,30%);
-
- &:focus, &:selected {
- background-color: $selected_bg_color;
- color: $selected_fg_color;
- }
-}
-
-.login-dialog-auth-list-label {
- @include fontsize($base_font_size + 2);
- font-weight: bold;
- padding-left: 15px;
-
- &:ltr { padding-left: 14px; text-align: left; }
- &:rtl { padding-right: 14px; text-align: right; }
-}
-
-.login-dialog-user-list-view { -st-vfade-offset: 1em; }
-
-.login-dialog-user-list {
- spacing: 12px;
- width: $_gdm_dialog_width;
-
- .login-dialog-user-list-item {
- border-radius: $base_border_radius + 4px;
- padding: $base_padding;
- background-color: transparentize($_gdm_fg, .95);
- color: $_gdm_fg;
-
- @if $is_highcontrast {
- box-shadow:inset 0 0 0 1px $hc_inset_color;;
- }
- .user-widget .user-icon {
- border: 4px solid transparent;
- }
-
- .login-dialog-timed-login-indicator {
- height: 2px;
- margin-top: 6px;
- background-color: darken($_gdm_fg, 30%);
- }
-
- &:focus .login-dialog-timed-login-indicator { background-color: $selected_fg_color; }
- }
-
- &:expanded .login-dialog-user-list-item {
- transition-duration: 300ms;
- transition-timing-function: ease;
-
- &:hover {
- background-color: transparentize($_gdm_fg, .9);
- color: $_gdm_fg;
- }
-
- &:selected {
- background-color: $selected_bg_color;
- color: $selected_fg_color;
- &:hover { background-color: lighten($selected_bg_color,5%); }
- }
-
- &:logged-in {
- .user-widget .user-icon {
- border-color: $selected_bg_color;
- }
- }
- }
-}
-
-.login-dialog-prompt-layout {
- spacing: $base_padding*2;
- width: 26em;
-}
-
-.login-dialog-prompt-entry {}
-
-
-/* Screen Shield */
-// a.k.a. the lockscreen
-
-.unlock-dialog {
- background-color: transparent;
-}
-
-.screen-shield-background { // just the shadow, really
- background: black;
- box-shadow: 0 2px 4px rgba(0,0,0,0.6);
-}
-
-#lockDialogGroup {
- background-color: $_gdm_bg;
-}
-
-// Clock
-.unlock-dialog-clock {
- color: $_gdm_fg;
- spacing: 2em;
-
- .unlock-dialog-clock-time {
- @extend %numeric;
- @include fontsize(72);
- font-weight: 200;
- }
-
- .unlock-dialog-clock-date {
- @extend %title_1;
- font-weight: 400;
- }
-
- .unlock-dialog-clock-hint {
- margin-top: 2em;
- padding: $base_padding $base_padding*3;
- border-radius: $base_border_radius*2;
- font-weight: bold;
- }
-}
-
-// Notifications
-#unlockDialogNotifications {
- StButton#vhandle, StButton#hhandle {
- background-color: transparentize($bg_color,0.7);
- &:hover, &:focus { background-color: transparentize($bg_color,0.5); }
- &:active { background-color: transparentize($selected_bg_color,0.5); }
- }
-}
-
-.unlock-dialog-notifications-container {
- margin: 12px;
- spacing: 6px;
- width: $_gdm_dialog_width;
- background-color: transparent;
-
- .summary-notification-stack-scrollview {
- padding-top: 0;
- padding-bottom: 0;
- }
-
- .notification,
- .unlock-dialog-notification-source {
- padding: 12px 16px;
- border: none;
- background-color: transparentize($_gdm_fg,0.9);
- color: $_gdm_fg;
- border-radius: $modal_radius;
-
- &.critical { background-color: transparentize($_gdm_fg,0.8) }
- }
-}
-
-.unlock-dialog-notification-label {
- padding-left: 12px;
- padding-right: 0;
- &:rtl { padding-right: 12px; padding-left: 0; }
-}
-
-.unlock-dialog-notification-count-text {
- font-weight: bold;
- padding: 0 12px;
- color: $_gdm_fg;
- background-color: transparentize($_gdm_fg, 0.9);
- border-radius: 99px;
-}
-
-
-// User Widget
-.user-widget {
-
- .user-widget-label {
- color: $_gdm_fg;
- }
-
- // layout of the user list
- &.horizontal {
- spacing: $base_padding*3;
- .user-widget-label {
- @extend %title_3;
- }
-
- .user-icon {
- & StIcon {
- padding: 12px;
- icon-size: $base_icon_size*2;
- width: $base_icon_size*3;
- height: $base_icon_size*3;
- background-color: transparentize($_gdm_fg, 0.9);
- }
- }
- }
-
- // layout of the login prompt
- &.vertical {
- spacing: $base_padding*4;
-
- .user-widget-label {
- @extend %title_1;
- text-align: center;
- margin-bottom: .75em;
- }
-
- .user-icon {
- icon-size: $base_icon_size*10;
-
- & StIcon {
- padding: 32px;
- icon-size: $base_icon_size*4;
- background-color: transparentize($_gdm_fg, 0.9);
- }
- }
- }
-}
diff --git a/data/gnome-shell-sass/widgets/_looking-glass.scss b/data/gnome-shell-sass/widgets/_looking-glass.scss
deleted file mode 100644
index adcc372d..00000000
--- a/data/gnome-shell-sass/widgets/_looking-glass.scss
+++ /dev/null
@@ -1,130 +0,0 @@
-/* Looking Glass */
-
-// Dialog
-#LookingGlassDialog {
- background-color: transparentize($bg_color,0.05);
- border-radius: 0 0 $modal_radius $modal_radius;
- border: 1px solid $outer_borders_color;
- border-top-width: 0;
- color: $fg_color;
- padding: $base_padding;
- spacing: $base_padding;
- box-shadow: 0 2px 4px 0 $shadow_color;
-
- @if $is_highcontrast {
- border: 2px solid $hc_inset_color;
- background-color: $bg_color;
- border-top-width: 0;
- box-shadow:none;
- }
-
- & > #Toolbar {
- border: none;
- padding: $base_padding;
- border-radius: 0;
- background-color: transparent;
- spacing: $base_padding;
-
- .lg-toolbar-button {
- padding: $base_padding $base_padding*2;
- @extend %button;
-
- & > StIcon { icon-size: $base_icon_size; }
- }
- }
-
- .labels {
- spacing: $base_padding;
- }
-
- .notebook-tab {
- -natural-hpadding: $base_padding*2;
- -minimum-hpadding: $base_padding*2;
- @extend %button;
- padding: $base_padding $base_padding*2;
- }
-
- StBoxLayout#EvalBox { padding: 4px; spacing: $base_padding; padding: $base_padding; }
- StBoxLayout#ResultsArea { spacing: $base_padding; padding: $base_padding; }
-}
-
-.lg-dialog {
-
- StEntry {
- min-height: 22px;
- @extend %entry;
- }
-
- .shell-link {
- color: $link_color;
- &:hover { color: lighten($link_color, 10%); }
- &:active { color: darken($link_color, 10%); }
- }
-
- .actor-link {
- color: $insensitive_fg_color;
- &:hover { color: lighten($insensitive_fg_color, 20%); }
- &:active { color: darken($insensitive_fg_color, 20%); }
-
- & StIcon { icon-size: 12px; }
- }
-}
-
-.lg-completions-text {
- @extend %caption;
- font-style: italic;
-}
-
-.lg-obj-inspector-title {
- spacing: $base_padding;
-}
-
-.lg-obj-inspector-button {
- border: 1px solid $borders_color;
- padding: 4px;
- border-radius: $base_border_radius;
- &:hover { border: 1px solid $fg_color; }
-}
-
-// Extensions
-#lookingGlassExtensions { padding: $base_padding; }
-
-.lg-extensions-list {
- padding: $base_padding;
- spacing: $base_padding;
-}
-
-.lg-extension {
- padding: $base_padding*2;
- @include card;
-}
-
-.lg-extension-name {
- @extend %heading;
-}
-
-.lg-extension-meta {
- spacing: $base_padding;
-}
-
-// Inspector
-#LookingGlassPropertyInspector {
- background: $bg_color;
- border: 1px solid $borders_color;
- border-radius: $base_border_radius;
- padding: $base_padding;
-}
-
-.lg-debug-flag-button {
- StLabel { padding: $base_padding, 2 * $base_padding; }
-
- color: $fg_color;
- &:hover { color: lighten($fg_color, 20%); }
- &:active { color: darken($fg_color, 20%); }
-}
-
-.lg-debug-flags-header {
- padding-top: 2 * $base_padding;
- padding: $base_padding;
- @extend %title_2;
-}
diff --git a/data/gnome-shell-sass/widgets/_message-list.scss b/data/gnome-shell-sass/widgets/_message-list.scss
deleted file mode 100644
index d0e5d855..00000000
--- a/data/gnome-shell-sass/widgets/_message-list.scss
+++ /dev/null
@@ -1,190 +0,0 @@
-/* Message List */
-// a.k.a. notifications in the menu
-
-// main list
-.message-list {
- width: 29em;
- border: solid $borders_color;
-
- // padding and margins to account for scrollbar
- &:ltr {margin-left: 0; margin-right: $base_margin; padding-right: $base_padding; border-right-width: 1px; }
- &:rtl {margin-right: 0; margin-left: $base_margin; padding-left: $base_padding; border-left-width: 1px; }
-
- .message-list-placeholder {
- @extend %title_2;
- color: transparentize($insensitive_fg_color, .5);
-
- // icon size and color
- > StIcon {
- icon-size: $base_icon_size*3; // 48px
- margin-bottom: $base_margin*3;
- -st-icon-style: symbolic;
- }
- }
-}
-
-.message-list-sections {
- spacing: $base_padding;
- margin: 0;
- padding-bottom: $base_padding;
-
- // to account for scrollbar
- &:ltr {margin-right: $base_margin * 3; }
- &:rtl {margin-left: $base_margin * 3;}
-}
-
-.message-list-section,
-.message-list-section-list {
- spacing: $base_padding;
-}
-
-// do-not-disturb + clear button
-.message-list-controls {
- // NOTE: remove the padding if notification_bubble could remove margin for drop shadow
- padding: $base_padding;
- spacing: $base_padding;
- @extend %heading;
-
- .dnd-button {
- // We need this because the focus outline isn't inset like for the buttons
- // so the dnd button would grow when it gets focus if we didn't change only
- // its color when focusing.
- border-width: 2px;
- border-color: transparent;
- border-radius: 32px;
- border-style: solid;
-
- &:focus {
- border-color: transparentize($selected_bg_color, 0.4);
- }
- }
-}
-
-// message bubbles
-.message {
- @include card;
-
- // icon container
- .message-icon-bin {
- padding: ($base_padding * 3);
-
- &:ltr {padding-right:$base_padding;}
- &:rtl {padding-left:$base_padding;}
-
- // icon size and color
- > StIcon {
- icon-size: $large_icon_size; // 32px
- -st-icon-style: symbolic;
- }
-
- // fallback
- > .fallback-app-icon {
- width: $base_icon_size;
- height: $base_icon_size;
- }
- }
-
- // content
- .message-content {
- spacing: 4px;
- padding: ($base_padding*1.5);
- margin-bottom: $base_margin*2;
- }
-
- // title
- .message-title {
- font-weight: bold;
- /* HACK: the label should be baseline-aligned with a 1em label, fake this with some bottom padding */
- padding-top: 0.57em;
- }
-
- // secondary container in title box
- .message-secondary-bin {
- padding: 0 $base_margin * 2;
-
- // notification time stamp
- > .event-time {
- color: transparentize($fg_color, 0.5);
- @include fontsize($base_font_size - 2);
- /* HACK: the label should be baseline-aligned with a 1em label, fake this with some bottom padding */
- padding-bottom: 0.13em;
-
- &:ltr { text-align: right };
- &:rtl { text-align: left };
- }
- }
-
- // close button
- .message-close-button {
- color: $fg_color;
- background-color: transparentize($fg_color, 0.9);
- border-radius: 99px;
- padding: $base_padding - 1px;
- margin: 1px;
- &:hover {background-color: transparentize($fg_color, 0.8);}
- &:active {background-color: transparentize($fg_color, 0.9);}
-
- & StIcon { icon-size: $base_icon_size; }
- }
-
- // body
- .message-body {color: darken($fg_color, 10%);}
-}
-
-// URLs in messages
-.url-highlighter {
- link-color: $link_color;
-}
-
-/* Media Controls */
-.message-media-control {
- padding: 0 $base_padding*3;
- margin: $base_padding*2 0;
- border-radius: $base_border_radius;
- color: $fg_color;
-
- @if $is_highcontrast {
- border: 1px solid $hc_inset_color;
- margin: $base_padding*2 2px;
- }
-
- // colors are lightened since the media controls are in a card
- &:hover {
- background-color: lighten($hover_bg_color, 5%);
- color: $fg_color;
- }
-
- &:active {
- background-color: lighten($active_bg_color, 5%);
- color: $fg_color;
- }
-
- &:insensitive {
- color: lighten($insensitive_fg_color, 5%);
- @if $is_highcontrast {
- border-color: transparent;
- }
- }
-
- // fix margin for last button
- &:last-child:ltr { margin-right: $base_margin*3; }
- &:last-child:rtl { margin-left: $base_margin*3; }
-
- & StIcon { icon-size: $base_icon_size; }
-}
-
-// album-art
-.media-message-cover-icon {
- icon-size: $base_icon_size*3 !important; // 48px
- border-radius: $base_border_radius;
-
- // when there is no artwork
- &.fallback {
- color: darken($fg_color, 17%);
- background-color: $bg_color;
- border: 1px solid transparent;
- border-radius: $base_border_radius;
- icon-size: $large_icon_size !important; // 32px
- padding: ($base_padding*2 + 2); // 16px
- }
-}
diff --git a/data/gnome-shell-sass/widgets/_misc.scss b/data/gnome-shell-sass/widgets/_misc.scss
deleted file mode 100644
index 0a98d570..00000000
--- a/data/gnome-shell-sass/widgets/_misc.scss
+++ /dev/null
@@ -1,53 +0,0 @@
-// Rubberband for select-area screenshots
-.select-area-rubberband {
- background-color: transparentize($selected_bg_color,0.7);
- border: 1px solid $selected_bg_color;
-}
-
-// User icon
-.user-icon {
- background-size: contain;
- color: $osd_fg_color;
- border-radius: 99px;
- icon-size: $base_icon_size * 4; // 64px
-
- & StIcon {
- background-color: transparentize($osd_fg_color,0.95);
- border-radius: 99px;
- padding: $base_padding * 2 ; // 12px
- width: $base_icon_size * 2.5; height: $base_icon_size * 2.5; // 40px;
- }
-
- &.user-avatar {
- box-shadow:inset 0 0 0 1px transparentize($osd_fg_color, 0.9);
- @if $is_highcontrast {
- box-shadow:inset 0 0 0 1px $hc_inset_color;
- }
- }
-}
-
-.lightbox { background-color: black; }
-.flashspot { background-color: white; }
-
-// Hidden
-.hidden { color: rgba(0,0,0,0);}
-
-// Caps-lock warning
-.caps-lock-warning-label {
- text-align: center;
- padding-bottom: 8px;
- @extend %caption;
- color: $warning_color;
-}
-
-/* Workspace animation */
-
-.workspace-animation {
- background-color: $system_bg_color;
-}
-
-/* Tiled window previews */
-.tile-preview {
- background-color: transparentize($selected_bg_color,0.5);
- border: 1px solid $selected_bg_color;
-}
diff --git a/data/gnome-shell-sass/widgets/_notifications.scss b/data/gnome-shell-sass/widgets/_notifications.scss
deleted file mode 100644
index 86480a87..00000000
--- a/data/gnome-shell-sass/widgets/_notifications.scss
+++ /dev/null
@@ -1,61 +0,0 @@
-/* Notifications & Message Tray */
-
-$notification_banner_height: 64px;
-$notification_banner_width: 34em;
-$notification_banner_radius: $base_border_radius*1.5;
-
-// Banner notifications
-.notification-banner {
- min-height: $notification_banner_height;
- width: $notification_banner_width;
- box-shadow: 0 2px 4px 2px $shadow_color;
- border-radius: $notification_banner_radius;
- margin: $base_margin;
-
- .notification-actions {
- spacing: 0;
- }
-
- .notification-button {
- @extend %bubble_button;
- }
-}
-
-// counter
-.summary-source-counter {
- font-size: $base_font_size - 1pt;
- font-weight: bold;
- height: 1.6em;
- width: 1.6em;
- -shell-counter-overlap-x: 3px;
- -shell-counter-overlap-y: 3px;
- background-color: $selected_bg_color;
- color: $selected_fg_color;
- border: 2px solid $fg_color;
- box-shadow: 0 2px 2px rgba(0,0,0,0.5);
- border-radius: 0.9em; // should be 0.8 but whatever; wish I could do 50%;
-}
-
-// chat bubbles
-.chat-body { spacing: 5px; }
-.chat-response { margin: 5px; }
-.chat-log-message { color: darken($fg_color,10%); }
-.chat-new-group { padding-top: 1em; }
-.chat-received {
- padding-left: 4px;
- &:rtl { padding-left: 0px; padding-right: 4px; }
-}
-
-.chat-sent {
- padding-left: 18pt;
- color: lighten($fg_color, 15%);
- &:rtl { padding-left: 0; padding-right: 18pt; }
-}
-
-.chat-meta-message {
- padding-left: 4px;
- @include fontsize($base_font_size - 2);
- font-weight: bold;
- color: lighten($fg_color,18%);
- &:rtl { padding-left: 0; padding-right: 4px; }
-}
diff --git a/data/gnome-shell-sass/widgets/_osd.scss b/data/gnome-shell-sass/widgets/_osd.scss
deleted file mode 100644
index a8d1a55f..00000000
--- a/data/gnome-shell-sass/widgets/_osd.scss
+++ /dev/null
@@ -1,64 +0,0 @@
-/* OSD */
-
-$osd_levelbar_height:6px;
-
-.osd-window {
- @extend %osd_panel;
- @extend %heading;
- text-align: center;
- font-weight: bold;
- spacing: $base_padding * 2; // 12px
- padding: $base_padding * 2 $base_padding * 3;
- & > * { spacing: 8px; }
- margin-bottom: 4em;
-
- StIcon { icon-size:$large_icon_size;}
-
- StLabel {
- &:ltr { margin-right: 6px; }
- &:rtl { margin-left: 6px; }
- }
-
- .level {
- margin-bottom: 4px;
- &:first-child { margin-bottom: 0px; }
-
- height: $osd_levelbar_height;
- min-width:$base_icon_size * 10;
- -barlevel-height: $osd_levelbar_height;
- -barlevel-background-color: transparentize($osd_fg_color, if($variant=='light', 0.7, 0.9));
- -barlevel-active-background-color: $osd_fg_color;
- -barlevel-overdrive-color: $destructive_color;
- -barlevel-overdrive-separator-width: 3px;
- &:ltr { margin-right: 6px; }
- &:rtl { margin-left: 6px; }
- }
-}
-
-// Monitor number label
-.osd-monitor-label {
- @extend %osd_panel;
- border-radius: $modal_radius;
- font-size: 3em;
- font-weight: bold;
- margin: $base_margin * 3;
- text-align: center;
- min-width: 1.3em;
-}
-
-/* Pad OSD */
-.pad-osd-window {
- padding: 32px;
- background-color: transparentize(#000, 0.2);
-
- .pad-osd-title-box { spacing: 12px; }
- .pad-osd-title-menu-box { spacing: 6px; }
-}
-
-.combo-box-label {
- width: 15em;
-}
-
-.resize-popup {
- @extend %osd_panel;
-}
diff --git a/data/gnome-shell-sass/widgets/_overview.scss b/data/gnome-shell-sass/widgets/_overview.scss
deleted file mode 100644
index d8e70eaf..00000000
--- a/data/gnome-shell-sass/widgets/_overview.scss
+++ /dev/null
@@ -1,13 +0,0 @@
-/* OVERVIEW */
-
-.controls-manager, .secondary-monitor-workspaces {
- spacing: $base_padding * 2;
-}
-
-#overviewGroup {
- background-color: $system_bg_color;
-}
-
-.overview-controls {
- padding-bottom: 32px;
-}
diff --git a/data/gnome-shell-sass/widgets/_panel.scss b/data/gnome-shell-sass/widgets/_panel.scss
deleted file mode 100644
index 487eb0f5..00000000
--- a/data/gnome-shell-sass/widgets/_panel.scss
+++ /dev/null
@@ -1,234 +0,0 @@
-/* Top Bar */
-// a.k.a. the panel
-
-$panel_bg_color: #000;
-$panel_fg_color: if($variant == 'light', lighten($bg_color, 10%), darken($fg_color, 5%));
-$panel_height: 2.2em;
-$panel_transition_duration: 250ms; // same as the overview transition duration
-
-#panel {
- background-color: $panel_bg_color;
- font-weight: bold;
- height: $panel_height;
- @extend %numeric;
- transition-duration: $panel_transition_duration;
-
- // transparent panel on lock & login screens
- &.unlock-screen,
- &.login-screen,
- &:overview {
- background-color: transparent;
- }
-
- // panel menus
- .panel-button {
- font-weight: bold;
- color: $panel_fg_color;
- -natural-hpadding: $base_padding * 2;
- -minimum-hpadding: $base_padding;
- transition-duration: 150ms;
- border: 3px solid transparent;
- border-radius: 99px;
-
- &.clock-display {
- .clock {
- transition-duration: 150ms;
- border: 3px solid transparent;
- border-radius: 99px;
- }
- }
-
- &.screen-recording-indicator {
- box-shadow: inset 0 0 0 100px $screenshot_ui_button_red;
- }
-
- &.screen-sharing-indicator {
- box-shadow: inset 0 0 0 100px $warning_color;
- StBoxLayout { margin: 0 $base_padding; }
- }
-
- &.screen-recording-indicator,
- &.screen-sharing-indicator {
- StBoxLayout {
- spacing: $base_padding;
- }
-
- StIcon {
- icon-size: $base_icon_size;
- }
- }
-
- &:active, &:overview, &:focus, &:checked {
- box-shadow: inset 0 0 0 100px transparentize($panel_fg_color, 0.8);
-
- // The clock display needs to have the background on .clock because
- // we want to exclude the do-not-disturb indicator from the background
- &.clock-display {
- box-shadow: none;
-
- .clock {
- box-shadow: inset 0 0 0 100px transparentize($panel_fg_color, 0.8);
- }
- }
-
- &.screen-recording-indicator {
- box-shadow: inset 0 0 0 100px transparentize($screenshot_ui_button_red, 0.15);
- }
- &.screen-sharing-indicator {
- box-shadow: inset 0 0 0 100px transparentize($warning_color, 0.15);
- }
- }
-
- &:hover {
- box-shadow: inset 0 0 0 100px transparentize($panel_fg_color, 0.85);
- &.clock-display {
- box-shadow: none;
- .clock {
- box-shadow: inset 0 0 0 100px transparentize($panel_fg_color, 0.85);
- }
- }
-
- &.screen-recording-indicator {
- box-shadow: inset 0 0 0 100px transparentize($screenshot_ui_button_red, 0.1);
- }
- &.screen-sharing-indicator {
- box-shadow: inset 0 0 0 100px transparentize($warning_color, 0.1);
- }
- }
-
- &:active:hover, &:overview:hover, &:focus:hover, &:checked:hover {
- box-shadow: inset 0 0 0 100px transparentize($panel_fg_color, 0.75);
- &.clock-display {
- box-shadow: none;
- .clock {
- box-shadow: inset 0 0 0 100px transparentize($panel_fg_color, 0.75);
- }
- }
-
- &.screen-recording-indicator {
- box-shadow: inset 0 0 0 100px transparentize($screenshot_ui_button_red, 0.2);
- }
- &.screen-sharing-indicator {
- box-shadow: inset 0 0 0 100px transparentize($warning_color, 0.2);
- }
- }
-
- // status area icons
- .system-status-icon {
- icon-size: $base_icon_size;
- padding: $base_padding - 1px;
- margin: 0 $base_margin;
- }
-
- .panel-status-indicators-box .system-status-icon,
- .panel-status-menu-box .system-status-icon {
- margin: 0;
- }
-
- // app menu icon
- .app-menu-icon {
- -st-icon-style: symbolic;
- // dimensions of the icon are hardcoded
- }
-
- panelActivities {
- -natural-hpadding: $base_padding * 3;
- }
- }
-
- &.unlock-screen,
- &.login-screen,
- &:overview {
- .panel-button {
- &:active, &:overview, &:focus, &:checked {
- box-shadow: inset 0 0 0 100px rgba(255,255,255, 0.15);
-
- &.clock-display {
- box-shadow: none;
-
- .clock {
- box-shadow: inset 0 0 0 100px rgba(255,255,255, 0.15);
- }
- }
-
- &.screen-recording-indicator {
- box-shadow: inset 0 0 0 100px transparentize($screenshot_ui_button_red, 0.15);
- }
- &.screen-sharing-indicator {
- box-shadow: inset 0 0 0 100px transparentize($warning_color, 0.15);
- }
- }
-
- &:hover {
- box-shadow: inset 0 0 0 100px rgba(255,255,255, 0.10);
- &.clock-display {
- box-shadow: none;
- .clock {
- box-shadow: inset 0 0 0 100px rgba(255,255,255, 0.10);
- }
- }
-
- &.screen-recording-indicator {
- box-shadow: inset 0 0 0 100px transparentize($screenshot_ui_button_red, 0.1);
- }
- &.screen-sharing-indicator {
- box-shadow: inset 0 0 0 100px transparentize($warning_color, 0.1);
- }
- }
-
- &:active:hover, &:overview:hover, &:focus:hover, &:checked:hover {
- box-shadow: inset 0 0 0 100px rgba(255,255,255, 0.2);
- &.clock-display {
- box-shadow: none;
- .clock {
- box-shadow: inset 0 0 0 100px rgba(255,255,255, 0.2);
- }
- }
-
- &.screen-recording-indicator {
- box-shadow: inset 0 0 0 100px transparentize($screenshot_ui_button_red, 0.2);
- }
- &.screen-sharing-indicator {
- box-shadow: inset 0 0 0 100px transparentize($warning_color, 0.2);
- }
- }
- }
- }
-
- .panel-status-indicators-box,
- .panel-status-menu-box {
- spacing: 2px;
- }
-
- // spacing between power icon and (optional) percentage label
- .power-status.panel-status-indicators-box {
- spacing: 0;
- }
-
- // indicator for active
- .screencast-indicator,
- .remote-access-indicator { color: $warning_color; }
-}
-
-// App Menu
-#appMenu {
- spacing: $base_padding;
- .label-shadow { color: transparent; }
-}
-
-#appMenu .panel-status-menu-box {
- padding: 0 $base_padding;
- spacing: $base_padding;
-}
-
-
-// Clock
-
-.clock-display-box {
- spacing: 2px;
-
- .clock {
- padding-left: $base_padding * 2;
- padding-right: $base_padding * 2;
- }
-}
diff --git a/data/gnome-shell-sass/widgets/_popovers.scss b/data/gnome-shell-sass/widgets/_popovers.scss
deleted file mode 100644
index 6ab20c21..00000000
--- a/data/gnome-shell-sass/widgets/_popovers.scss
+++ /dev/null
@@ -1,162 +0,0 @@
-/* Popovers/Menus */
-
-$menu_bg_color: $bg_color;
-$menuitem_bg_color: lighten($menu_bg_color, 4%);
-$menuitem_border_radius: $base_border_radius*1.5;
-
-$submenu_bg_color: lighten($menu_bg_color, 7%);
-
-// the popover itself
-.popup-menu-boxpointer {
- -arrow-rise: $base_margin+2px; // distance from the panel & screen edge
-}
-
-// container of the popover menu
-.popup-menu {
- min-width: 15em;
- color: $fg_color;
-
- //.popup-status-menu-item {font-weight: normal; color: pink;} //dunno what that is
- &.panel-menu {
- margin-bottom: 1.75em; // so it doesn't touch the bottom of the screen
- }
-}
-
-// popover content
-.popup-menu-content {
- padding: $base_padding;
- background-color: $bg_color;
- border-radius: $modal_radius*1.25;
- border: 1px solid $outer_borders_color;
- box-shadow: 0 2px 4px 0 $shadow_color;
-}
-
-// menu items
-.popup-menu-item {
- @include menuitem($bg:$menu_bg_color);
-
- border-radius: $menuitem_border_radius;
-
- &:checked {
- border-radius: $menuitem_border_radius $menuitem_border_radius 0 0 !important;
-
- @if $is_highcontrast {
- border: 1px solid $hc_inset_color;
- border-bottom-width:0;
- }
- }
-
- // add margin to switches in menu items
- .toggle-switch {
- &:ltr { margin-left: $base_margin;}
- &:rtl { margin-right: $base_margin;}
- }
-}
-
-
-// all other graphical elements (sliders)
-.popup-inactive-menu-item {
- color: $fg_color;
- &:insensitive { color: $insensitive_fg_color; }
-}
-
-// symbolic icons in popover
-.popup-menu-arrow,
-.popup-menu-icon {
- icon-size: 16px !important; // for some reason the variable doesn't work here
-}
-
-// popover submenus
-.popup-sub-menu {
- border-radius: 0 0 $menuitem_border_radius+1px $menuitem_border_radius+1px;
- margin-bottom: $base_padding;
-
- @if $is_highcontrast {
- border: 1px solid $hc_inset_color;
- }
-
- .popup-menu-ornament {
- min-width: $base_icon_size !important;
- }
-
- // submenu specific styles
- .popup-menu-item {
- border-radius: 0;
- @include menuitem($bg:$submenu_bg_color, $flat:false);
- border-top-width:0;
-
- &:last-child {
- border-radius: 0 0 $menuitem_border_radius $menuitem_border_radius;
- border-bottom-width:0;
- }
- }
-
- .popup-menu-section {
- .popup-menu-item:last-child {
- &:hover,&:focus { border-radius: 0;}
- }
- &:last-child .popup-menu-item:last-child {
- border-radius: 0 0 $menuitem_border_radius $menuitem_border_radius;
- }
- }
-}
-
-// container for radio and check boxes
-.popup-menu-ornament {
- @extend %heading;
- width: 1.2em;
- text-align: center !important;
-
- &:ltr { text-align: right;}
- &:rtl { text-align: left;}
-}
-
-// separator
-.popup-separator-menu-item {
- border:none !important;
-
- .popup-separator-menu-item-separator {
- height: 1px; //not really the whole box
- background-color: $borders_color;
- }
-
- .popup-menu-ornament {
- width: 0 !important;
- }
-
- // separators in submenus
- .popup-sub-menu & {
- background-color: transparent;
-
- // account for ornament
- &:ltr { margin-right: 2.5em;}
- &:rtl { margin-left: 2.5em;}
-
- .popup-separator-menu-item-separator {
- background-color: $borders_color;
- }
- }
-}
-
-// desktop background menu
-.background-menu {
- -boxpointer-gap: 0px;
- -arrow-rise: 0px; // hide the beak on the menu
-}
-
-// right-click (and panel) app menu
-.app-menu {
- max-width: 27.25em;
-
- // this is unneeded at the top-level in this menu, hide it
- .popup-menu-ornament { width: 0 !important; }
-
- .popup-inactive-menu-item:first-child {
- // "Open Windows" label
- > StLabel {
- @extend %caption_heading;
- &:ltr {margin-right: $base_margin*2;}
- &:rtl {margin-left: $base_margin*2;}
- }
- }
-}
diff --git a/data/gnome-shell-sass/widgets/_quick-settings.scss b/data/gnome-shell-sass/widgets/_quick-settings.scss
deleted file mode 100644
index 03fb7780..00000000
--- a/data/gnome-shell-sass/widgets/_quick-settings.scss
+++ /dev/null
@@ -1,178 +0,0 @@
-.quick-settings {
- padding: $base_padding*3;
- border-radius: $modal_radius*2.25;
-
- .icon-button, .button {
- padding: $base_padding*1.75;
- }
-}
-
-.quick-settings-grid {
- spacing-rows: $base_padding*2;
- spacing-columns: $base_padding*2;
-}
-
-.quick-toggle, .quick-menu-toggle {
- border-radius: 99px;
- min-width: 12em;
- max-width: 12em;
- min-height: 48px;
- border:none;
-}
-
-.quick-toggle {
- &:checked { @include button(default, $c:$selected_bg_color); }
-
- & > StBoxLayout { spacing: $base_padding*1.5; }
-
- /* Move padding into the box; this is to allow menu arrows
- to extend to the border */
- &.button { padding: 0; }
- & > StBoxLayout { padding: 0 $base_padding*2; }
- &:ltr > StBoxLayout { padding-left: $base_padding*2.5; }
- &:rtl > StBoxLayout { padding-right: $base_padding*2.5; }
-
- .quick-toggle-title { font-weight: bold; }
-
- & StBoxLayout > .quick-toggle-subtitle {
- font-weight: normal;
- font-size: 12px;
- }
-
- .quick-toggle-icon { icon-size: $base_icon_size; }
-}
-
-.quick-menu-toggle {
- & .quick-toggle {
- min-width: auto;
- max-width: auto;
-
- &:ltr { border-radius: 99px 0 0 99px; }
- &:rtl { border-radius: 0 99px 99px 0; }
-
- &:ltr:last-child { border-radius: 99px; }
- &:rtl:last-child { border-radius: 99px; }
- }
-
- & .quick-toggle-arrow {
- padding: $base_padding $base_padding*1.75;
- border-width: 0;
-
- &:checked {
- @include button(default, $c:$selected_bg_color);
- border-color: $selected_borders_color;
- }
-
- &:ltr {
- border-radius: 0 99px 99px 0;
- border-left-width: 1px;
- }
- &:rtl {
- border-radius: 99px 0 0 99px;
- border-right-width: 1px;
- }
- }
-}
-
-.quick-slider {
- & > StBoxLayout { spacing: $base_padding; }
-
- .icon-button { padding: $base_padding; }
-
- .slider-bin {
- &:focus {@include button(focus);}
- min-height: 16px; // slider size
- padding: $base_padding;
- border-radius: 99px;
- }
-}
-
-.quick-toggle-menu {
- @include card;
- border-radius: $base_border_radius*3;
- padding: $base_padding*2;
- margin: $base_padding*2 $base_padding*3 0;
-
- .popup-menu-item > StIcon { -st-icon-style: symbolic; }
-
- & .header {
- spacing-rows: 0.5 * $base_padding;
- spacing-columns: $base_padding*2;
- padding-bottom: 2 * $base_padding;
-
- & .icon {
- icon-size: $base_icon_size*1.5; // a non-standard symbolic size but ok
- border-radius: 999px;
- padding: 1.5 * $base_padding;
- background-color: transparentize($fg_color, 0.8);
-
- &.active { background-color: $selected_bg_color;}
- }
-
- & .title {
- @extend %title_3;
- }
-
- & .subtitle {
- @extend %caption_heading;
- }
- }
-}
-
-.quick-toggle-menu-container {
-}
-
-.quick-settings-system-item {
- & > StBoxLayout { spacing: 2 * $base_padding; }
-
- & .power-item {
- min-height: 0;
- min-width: 0;
-
- &:insensitive {
- @include button(normal);
- background-color: transparent;
- }
- }
-}
-
-.nm-network-item {
- .wireless-secure-icon { icon-size: 0.5 * $base_icon_size; }
-}
-
-.bt-device-item {
- .popup-menu-icon { -st-icon-style: symbolic; }
-}
-
-.bt-menu-placeholder {
- @extend %title_4;
- text-align: center;
-
- padding: 2em 4em;
-}
-
-.device-subtitle { color: transparentize($fg_color, 0.5); }
-
-// background apps
-
-.background-apps-quick-toggle {
- min-height: 40px;
- background-color: transparent;
-
- & StIcon { icon-size: $base_icon_size !important; }
-}
-
-.background-app-item {
- & .title { @extend %heading; }
- & .subtitle { @extend %caption; }
- & .popup-menu-icon {
- icon-size: $large_icon_size !important;
- -st-icon-style: regular !important;
- }
- & .close-button {
- @extend .icon-button;
- padding: $base_padding;
- }
-
- &.popup-inactive-menu-item { color: $fg_color; }
-}
diff --git a/data/gnome-shell-sass/widgets/_screenshot.scss b/data/gnome-shell-sass/widgets/_screenshot.scss
deleted file mode 100644
index 150f273b..00000000
--- a/data/gnome-shell-sass/widgets/_screenshot.scss
+++ /dev/null
@@ -1,204 +0,0 @@
-// Screenshot UI
-.icon-label-button-container {
- spacing: $base_padding;
- @extend %caption;
-
- StIcon { icon-size: 32px;}
-}
-
-$screenshot_ui_panel_padding: $base_padding*3;
-$screenshot_ui_shot_cast_margin: 21px;
-$screenshot_ui_panel_border_radius: $modal_radius + $screenshot_ui_shot_cast_margin;
-$screenshot_ui_shot_cast_spacing: 3px;
-
-$screenshot_ui_button_red: $error_color;
-
-.screenshot-ui-panel {
- @extend %osd_panel;
- border-radius: $screenshot_ui_panel_border_radius;
- padding: $screenshot_ui_panel_padding;
- // Reduce the bottom padding a little to accommodate the large capture button.
- padding-bottom: $screenshot_ui_panel_padding - 6px;
- margin-bottom: 4em;
- spacing: $base_padding * 2;
-}
-
-.screenshot-ui-close-button {
- @extend .window-close; // copy window close button
- padding: $base_padding !important; // but with more padding
- margin-top: 12px;
- box-shadow: 0 2px 4px 0 $shadow_color;
- &.left { margin-left: 12px;}
- &.right { margin-right: 12px;}
-}
-
-.screenshot-ui-type-button {
- @extend %osd_button;
- min-width: 48px;
- padding: $base_padding * 2 $base_padding * 3 !important;
- border-radius: $screenshot_ui_panel_border_radius - $screenshot_ui_panel_padding;
-}
-
-.screenshot-ui-capture-button {
- width: 36px;
- height: 36px;
- border-radius: 99px;
- border: 4px $osd_fg_color;
- padding: 4px;
-
- .screenshot-ui-capture-button-circle {
- background-color: $osd_fg_color;
- transition-duration: 200ms;
- &:hover, &:focus { background-color: $hover_bg_color;}
- border-radius: 99px;
- }
-
- &:hover, &:focus {
- .screenshot-ui-capture-button-circle {
- background-color: darken($osd_fg_color, 15%);
- }
- }
-
- &:active {
- .screenshot-ui-capture-button-circle {
- background-color: darken($osd_fg_color, 50%);
- }
- }
-
- &:cast {
- .screenshot-ui-capture-button-circle {
- background-color: $screenshot_ui_button_red;
- }
- &:hover, &:focus {
- .screenshot-ui-capture-button-circle {
- background-color: lighten($screenshot_ui_button_red, 5%);
- }
- }
- &:active {
- .screenshot-ui-capture-button-circle {
- background-color: darken($screenshot_ui_button_red, 7%);
- }
- }
- }
-}
-
-.screenshot-ui-shot-cast-container {
- background-color: lighten($osd_bg_color,5%);
- border-radius: $modal_radius;
- padding: $screenshot_ui_shot_cast_spacing;
- spacing: $screenshot_ui_shot_cast_spacing;
-
- &:ltr { margin-left: $screenshot_ui_shot_cast_margin - $screenshot_ui_panel_padding;}
- &:rtl { margin-right: $screenshot_ui_shot_cast_margin - $screenshot_ui_panel_padding;}
-}
-
-.screenshot-ui-shot-cast-button {
- padding: $base_padding $base_padding*2;
- background-color: transparent;
- &:hover, &:focus { background-color: lighten($osd_bg_color, 10%);}
- &:active { background-color: lighten($active_bg_color,5%);}
- &:checked { background-color: white;color: black;}
- &:insensitive { color: transparentize($osd_fg_color, 0.5);}
-
- border-radius: $modal_radius - $screenshot_ui_shot_cast_spacing;
-
- StIcon { icon-size: $base_icon_size;}
-}
-
-.screenshot-ui-show-pointer-button {
- @extend %osd_button;
- border-radius: 99px;
- padding: $base_padding * 2 !important;
- StIcon { icon-size: $base_icon_size;}
-}
-
-.screenshot-ui-area-indicator-shade {
- background-color: rgba(0,0,0,.3);
-}
-
-.screenshot-ui-area-selector {
- .screenshot-ui-area-indicator-shade {
- background-color: rgba(0,0,0,.5);
- }
-
- .screenshot-ui-area-indicator-selection {
- border: 2px white;
- }
-}
-
-.screenshot-ui-area-selector-handle {
- border-radius: 99px;
- background-color: white;
- box-shadow: 0 1px 3px 2px rgba(0,0,0,0.2);
- width: 24px;
- height: 24px;
-}
-
-.screenshot-ui-window-selector {
- background-color: $system_bg_color;
-
- .screenshot-ui-window-selector-window-container {
- margin: 100px;
- }
-
- &:primary-monitor {
- .screenshot-ui-window-selector-window-container {
- // Make some room for the panel.
- margin-bottom: 200px;
- }
- }
-}
-
-.screenshot-ui-window-selector-window-border {
- transition-duration: 200ms;
- border-radius: $modal_radius;
- border: 6px transparent;
-}
-
-.screenshot-ui-window-selector-check {
- transition-duration: 200ms;
- color: transparent;
- border-radius: 99px;
- border-width: 12px;
- icon-size: 24px;
-}
-
-.screenshot-ui-window-selector-window {
- &:hover {
- .screenshot-ui-window-selector-window-border {
- border-color: darken($selected_bg_color, 15%);
- }
- }
- &:checked {
- .screenshot-ui-window-selector-window-border {
- border-color: $selected_bg_color;
- background-color: transparentize($selected_bg_color, 0.8);
- }
-
- .screenshot-ui-window-selector-check {
- color: $selected_fg_color;
- background-color: $selected_bg_color;
- }
- }
-}
-
-.screenshot-ui-screen-selector {
- transition-duration: 200ms;
- background-color: rgba(0,0,0,.5);
-
- &:hover { background-color: rgba(0,0,0,.3);}
- &:active { background-color: rgba(0,0,0,.7);}
- &:checked {
- background-color: transparent;
- border: 2px white;
- }
-}
-
-.screenshot-ui-tooltip {
- color: $osd_fg_color;
- background-color: $osd_bg_color;
- border-radius: 99px;
- padding: $base_padding $base_padding * 2;
- text-align: center;
- -y-offset: 24px;
-}
diff --git a/data/gnome-shell-sass/widgets/_scrollbars.scss b/data/gnome-shell-sass/widgets/_scrollbars.scss
deleted file mode 100644
index 77cde653..00000000
--- a/data/gnome-shell-sass/widgets/_scrollbars.scss
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Scrollbars */
-
-StScrollView {
- &.vfade { -st-vfade-offset: 68px; }
- &.hfade { -st-hfade-offset: 68px; }
-}
-
-StScrollBar {
- padding: 0;
-
- StScrollView & {
- min-width: 8px;
- min-height: 8px;
- }
-
- StBin#trough {
- border-radius: 0;
- background-color: transparent;
- }
-
- StButton#vhandle, StButton#hhandle {
- border-radius: 8px;
- background-color: mix($fg_color, $bg_color, 30%);
- border: 3px solid transparent; //would be nice to margin or at least to transparent
- transition: 500ms all ease;
- &:hover {background-color: mix($fg_color, $bg_color, 50%);}
- &:active {background-color: mix($fg_color, $bg_color, 40%);}
- }
-}
diff --git a/data/gnome-shell-sass/widgets/_search-entry.scss b/data/gnome-shell-sass/widgets/_search-entry.scss
deleted file mode 100644
index 4ae86187..00000000
--- a/data/gnome-shell-sass/widgets/_search-entry.scss
+++ /dev/null
@@ -1,13 +0,0 @@
-// Search entry
-.search-entry {
- border-radius: 99px;
- margin-top: $base_padding*2;
- margin-bottom: $base_padding;
- width: 24em;
-
- .search-entry-icon {
- icon-size: $base_icon_size;
- margin-top: 2px; // center vertically
- padding: 0 4px;
- }
-}
diff --git a/data/gnome-shell-sass/widgets/_search-results.scss b/data/gnome-shell-sass/widgets/_search-results.scss
deleted file mode 100644
index b7d72c9b..00000000
--- a/data/gnome-shell-sass/widgets/_search-results.scss
+++ /dev/null
@@ -1,96 +0,0 @@
-/* Search */
-
-// search overview container
-#searchResults {
- margin: 0 $base_margin;
-}
-
-#searchResultsContent {
- max-width: 1072px;
-}
-
-// search results sections "the boxes"
-.search-section {
- // This should be equal to #searchResultsContent spacing
- spacing: $base_padding*3;
-
- // separator (unstyled)
- .search-section-separator {
- height: $base_margin*2; // use it as a spacer
- background-color: transparent;
- }
-}
-
-// content
-.search-section-content {
- background-color: lighten($system_bg_color, 5%);
- border-radius: $modal_radius*1.5;
- box-shadow:inset 0 0 0 1px solid $outer_borders_color;
- color: $osd_fg_color;
- padding: $base_padding*2;
- margin:0 $base_margin*3;
-}
-
-%search_section_content_item {
- @include tile_button($osd_fg_color);
- border-radius: $base_border_radius+3px;
-}
-
-// "no results" text
-.search-statustext {
- @extend %title_1;
-}
-
-.grid-search-results {
- spacing: $base_padding*5;
- margin:0 $base_margin*3;
-}
-
-// Search results with icons
-.grid-search-result {
- @extend .app-well-app;
-}
-
-// search result provider
-.search-provider-icon {
- @extend %search_section_content_item;
- &:ltr {margin-right: $base_margin;}
- &:rtl {margin-left: $base_margin;}
-
- // content
- .list-search-provider-content {
- spacing: $base_padding * 2;
-
- // provider labels
- .list-search-provider-details {
- width: 120px;
- color: $osd_fg_color;
- }
- }
-}
-
-// search results list
-.list-search-results {
- spacing: $base_padding;
-}
-
-// search result listitem
-.list-search-result {
- @extend %search_section_content_item;
-
- // content
- .list-search-result-content {
- spacing: $base_padding;
- }
-
- // list item title (with leading icon)
- .list-search-result-title {
- spacing: $base_padding * 2;
- // font-weight: bold;
- }
-
- // list item description
- .list-search-result-description {
- color: $osd_insensitive_fg_color;
- }
-}
diff --git a/data/gnome-shell-sass/widgets/_slider.scss b/data/gnome-shell-sass/widgets/_slider.scss
deleted file mode 100644
index 500249aa..00000000
--- a/data/gnome-shell-sass/widgets/_slider.scss
+++ /dev/null
@@ -1,22 +0,0 @@
-/* Slider */
-
-$slider_size: 16px;
-
-.slider {
- // slider trough
- -barlevel-height: 4px;
- -barlevel-background-color: if($variant == 'light', transparentize($fg_color, 0.6), transparentize($fg_color, 0.8)); //background of the trough
- -barlevel-border-width: 2px;
- -barlevel-border-color: transparent; // trough border color
- // fill style
- -barlevel-active-background-color: $selected_bg_color;
- -barlevel-active-border-color: transparent;
- // overfill style (red in this case)
- -barlevel-overdrive-color: $destructive_color;
- -barlevel-overdrive-border-color: transparent; //trough border when red;
- -barlevel-overdrive-separator-width:1px;
- // slider handler
- -slider-handle-radius: $slider_size * 0.5; // half the size of the size
- -slider-handle-border-width: 0;
- -slider-handle-border-color: transparent; // because 0 width
-}
diff --git a/data/gnome-shell-sass/widgets/_switcher-popup.scss b/data/gnome-shell-sass/widgets/_switcher-popup.scss
deleted file mode 100644
index 5136c3cf..00000000
--- a/data/gnome-shell-sass/widgets/_switcher-popup.scss
+++ /dev/null
@@ -1,74 +0,0 @@
-/* App Switcher */
-
-// same as dash
-$switcher_padding: $base_padding*2;
-
-
-// the full screen container of the switcher
-.switcher-popup {
- padding: 0;
- spacing: $base_padding * 4;
-}
-
-// switcher onscreen panel
-.switcher-list {
- @extend %osd_panel;
- padding: $switcher_padding;
- border-radius: $modal_radius+$switcher_padding;
- box-shadow: 0 8px 8px 0 $shadow_color;
-
- // container for items in list
- .switcher-list-item-container {
- spacing: $base_padding * 2;
- }
-
- // each item in the list
- .item-box {
- @include tile_button($osd_fg_color);
- // override over style so mouse doesn't steal focus
- &:hover {background: none;}
- @if $is_highcontrast {
- box-shadow: inset 0 0 0 999px transparentize($hc_inset_color,0.2);
- }
- }
-
- .separator {
- width: 1px;
- background: $borders_color;
- }
-
- // container of thumbnails
- .thumbnail-box {
- padding: 2px;
- spacing: $base_padding;
- }
-
- // window thumbnail itself
- .thumbnail {
- width: 256px; // equal to THUMBNAIL_DEFAULT_SIZE in altTab.js
- border-radius:$base_border_radius;
- }
-}
-
-// arrow if app has multiple windows
-.switcher-arrow {
- border-color: transparentize($osd_fg_color, 0.2);
- color: transparentize($osd_fg_color, 0.2);
-
- &:highlighted {
- border-color: $osd_fg_color;
- color: $osd_fg_color;
- }
-}
-
-// Input Source Switcher
-.input-source-switcher-symbol {
- font-size: 34pt;
- width: 96px;
- height: 96px;
-}
-
-// Window cycler highlight
-.cycler-highlight {
- border: 5px solid $selected_bg_color;
-}
diff --git a/data/gnome-shell-sass/widgets/_switches.scss b/data/gnome-shell-sass/widgets/_switches.scss
deleted file mode 100644
index b6d8fe83..00000000
--- a/data/gnome-shell-sass/widgets/_switches.scss
+++ /dev/null
@@ -1,16 +0,0 @@
-/* Switches */
-
-// these are equal to the size of the SVG assets
-$switch_height: 26px;
-$switch_width: 48px;
-
-.toggle-switch {
- color: $fg_color;
- height: $switch_height;
- width: $switch_width;
- background-size: contain;
- background-image: if($variant == 'light', url("resource:///org/gnome/shell/theme/toggle-off-light.svg"),url("resource:///org/gnome/shell/theme/toggle-off.svg"));
- &:checked {
- background-image: if($variant == 'light', url("resource:///org/gnome/shell/theme/toggle-on-light.svg"),url("resource:///org/gnome/shell/theme/toggle-on.svg"));
- }
-}
diff --git a/data/gnome-shell-sass/widgets/_window-picker.scss b/data/gnome-shell-sass/widgets/_window-picker.scss
deleted file mode 100644
index 1847250b..00000000
--- a/data/gnome-shell-sass/widgets/_window-picker.scss
+++ /dev/null
@@ -1,54 +0,0 @@
-/* Window Picker */
-
-$window_picker_spacing: $base_padding; // 6px
-$window_picker_padding: $base_padding * 2; // 12px
-
-$window_thumbnail_label_color: transparentize($osd_bg_color, 0.4);
-
-$window_close_button_color: transparentize(lighten($osd_bg_color, 7%), .02);
-$window_close_button_size: 30px;
-$window_close_button_padding: 3px;
-
-// Window picker
-.window-picker {
- // Space between window thumbnails
- spacing: $window_picker_spacing;
-}
-
-// Window titles
-.window-caption {
- @extend %tooltip;
-}
-
-// Close button
-.window-close {
- background-color: $window_close_button_color;
- color: $osd_fg_color;
- border-radius: 99px;
- box-shadow: 0 2px 4px 0 $shadow_color;
- padding: $window_close_button_padding;
- height: $window_close_button_size;
- width: $window_close_button_size;
- transition-duration: 100ms;
-
- & StIcon { icon-size: 24px; } // uses non standard icon size
-
- &:hover {
- background-color: lighten($window_close_button_color, 7%);
- }
-
- &:active {
- background-color: lighten($window_close_button_color, 13%);
- }
-
- @if $is_highcontrast {
- border:2px solid $outer_borders_color;
- }
-}
-
-.workspace-background {
- // keep in sync with BACKGROUND_CORNER_RADIUS_PIXELS in workspace.js
- border-radius: 30px;
- background-color: $invisible_occluded_bg_color;
- box-shadow: 0 4px 16px 4px transparentize(darken($osd_bg_color, 30%), 0.7);
-}
diff --git a/data/gnome-shell-sass/widgets/_workspace-switcher.scss b/data/gnome-shell-sass/widgets/_workspace-switcher.scss
deleted file mode 100644
index f06130ba..00000000
--- a/data/gnome-shell-sass/widgets/_workspace-switcher.scss
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Workspace Switcher */
-
-$ws_indicator_height: $large_icon_size;
-$ws_dot_active: $ws_indicator_height / 3;
-$ws_dot_inactive: $ws_indicator_height / 6;
-
-.workspace-switcher {
- @extend %osd_panel;
- margin-bottom: 4em;
- spacing: $base_padding * 2;
- padding: $base_padding * 2 $base_padding * 3;
-}
-
-.ws-switcher-indicator {
- background-color: transparentize($osd_fg_color,0.5);
- padding: $ws_dot_inactive / 2;
- margin: ($ws_indicator_height - $ws_dot_inactive) / 2;
- border-radius: $ws_indicator_height;
-
- &:active {
- background-color: $osd_fg_color;
- padding: $ws_dot_active / 2;
- margin: ($ws_indicator_height - $ws_dot_active) / 2;
- }
-}
diff --git a/data/gnome-shell-sass/widgets/_workspace-thumbnails.scss b/data/gnome-shell-sass/widgets/_workspace-thumbnails.scss
deleted file mode 100644
index ecbbc411..00000000
--- a/data/gnome-shell-sass/widgets/_workspace-thumbnails.scss
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Workspace pager */
-
-// thumbnails in overview
-.workspace-thumbnails {
- visible-width: 32px; //amount visible before hover
- spacing: $base_padding;
- padding: $base_padding;
-
- .workspace-thumbnail {
- color: $osd_fg_color;
- background-color: lighten($system_bg_color, 10%);
- border-radius: $base_border_radius*0.5;
- border: 1px solid transparent;
-
- @if $is_highcontrast {
- border-color: $hc_inset_color;
- }
- }
-
- // drag and drop indicator
- .placeholder {
- background-image: url("resource:///org/gnome/shell/theme/workspace-placeholder.svg");
- background-size: contain;
- width: 18px;
- }
-}
-
-// selected indicator
-.workspace-thumbnail-indicator {
- border: 3px solid $selected_bg_color;
- border-radius: $base_border_radius;
-}
diff --git a/data/meson.build b/data/meson.build
index b8a72979..2219aa5e 100644
--- a/data/meson.build
+++ b/data/meson.build
@@ -46,68 +46,5 @@ configure_file(
install_dir: modedir
)
-theme_sources = files(
- 'gnome-shell-sass/_colors.scss',
- 'gnome-shell-sass/_common.scss',
- 'gnome-shell-sass/_drawing.scss',
- 'gnome-shell-sass/_high-contrast-colors.scss',
- 'gnome-shell-sass/_widgets.scss',
- 'gnome-shell-sass/widgets/_a11y.scss',
- 'gnome-shell-sass/widgets/_app-grid.scss',
- 'gnome-shell-sass/widgets/_base.scss',
- 'gnome-shell-sass/widgets/_buttons.scss',
- 'gnome-shell-sass/widgets/_calendar.scss',
- 'gnome-shell-sass/widgets/_check-box.scss',
- 'gnome-shell-sass/widgets/_corner-ripple.scss',
- 'gnome-shell-sass/widgets/_dash.scss',
- 'gnome-shell-sass/widgets/_dialogs.scss',
- 'gnome-shell-sass/widgets/_entries.scss',
- 'gnome-shell-sass/widgets/_hotplug.scss',
- 'gnome-shell-sass/widgets/_ibus-popup.scss',
- 'gnome-shell-sass/widgets/_keyboard.scss',
- 'gnome-shell-sass/widgets/_login-lock.scss',
- 'gnome-shell-sass/widgets/_looking-glass.scss',
- 'gnome-shell-sass/widgets/_message-list.scss',
- 'gnome-shell-sass/widgets/_misc.scss',
- 'gnome-shell-sass/widgets/_notifications.scss',
- 'gnome-shell-sass/widgets/_osd.scss',
- 'gnome-shell-sass/widgets/_overview.scss',
- 'gnome-shell-sass/widgets/_panel.scss',
- 'gnome-shell-sass/widgets/_popovers.scss',
- 'gnome-shell-sass/widgets/_quick-settings.scss',
- 'gnome-shell-sass/widgets/_screenshot.scss',
- 'gnome-shell-sass/widgets/_scrollbars.scss',
- 'gnome-shell-sass/widgets/_search-entry.scss',
- 'gnome-shell-sass/widgets/_search-results.scss',
- 'gnome-shell-sass/widgets/_slider.scss',
- 'gnome-shell-sass/widgets/_switcher-popup.scss',
- 'gnome-shell-sass/widgets/_switches.scss',
- 'gnome-shell-sass/widgets/_window-picker.scss',
- 'gnome-shell-sass/widgets/_workspace-switcher.scss',
- 'gnome-shell-sass/widgets/_workspace-thumbnails.scss'
-)
-
-theme_data = [
- 'classic-process-working.svg',
- 'gnome-classic-high-contrast.css'
-]
-
-stylesheet = 'gnome-classic.css'
-if fs.exists(stylesheet)
- install_data(stylesheet, install_dir: themedir)
-else
- sassc = find_program('sassc', required: true)
- custom_target(stylesheet,
- input: fs.replace_suffix(stylesheet, '.scss'),
- output: stylesheet,
- depend_files: theme_sources,
- command: [sassc, '-a', '@INPUT@', '@OUTPUT@'],
- install: true,
- install_dir: themedir
- )
-endif
-
-install_data(theme_data, install_dir: themedir)
-
classic_override = '00_org.gnome.shell.extensions.classic.gschema.override'
install_data(classic_override, install_dir: schemadir)
diff --git a/extensions/apps-menu/extension.js b/extensions/apps-menu/extension.js
index 23da6c08..b6185338 100644
--- a/extensions/apps-menu/extension.js
+++ b/extensions/apps-menu/extension.js
@@ -1,18 +1,22 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
-/* exported init enable disable */
+import Atk from 'gi://Atk';
+import Clutter from 'gi://Clutter';
+import Gio from 'gi://Gio';
+import GLib from 'gi://GLib';
+import GMenu from 'gi://GMenu';
+import GObject from 'gi://GObject';
+import Gtk from 'gi://Gtk';
+import Meta from 'gi://Meta';
+import Shell from 'gi://Shell';
+import St from 'gi://St';
+import {EventEmitter} from 'resource:///org/gnome/shell/misc/signals.js';
-const {
- Atk, Clutter, Gio, GLib, GMenu, GObject, Gtk, Meta, Shell, St,
-} = imports.gi;
-const {EventEmitter} = imports.misc.signals;
+import {Extension, gettext as _} from 'resource:///org/gnome/shell/extensions/extension.js';
-const DND = imports.ui.dnd;
-const ExtensionUtils = imports.misc.extensionUtils;
-const Main = imports.ui.main;
-const PanelMenu = imports.ui.panelMenu;
-const PopupMenu = imports.ui.popupMenu;
-
-const _ = ExtensionUtils.gettext;
+import * as DND from 'resource:///org/gnome/shell/ui/dnd.js';
+import * as Main from 'resource:///org/gnome/shell/ui/main.js';
+import * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js';
+import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js';
const appSys = Shell.AppSystem.get_default();
@@ -46,11 +50,8 @@ class ApplicationMenuItem extends PopupMenu.PopupBaseMenuItem {
this.label_actor = appLabel;
let textureCache = St.TextureCache.get_default();
- let iconThemeChangedId = textureCache.connect('icon-theme-changed',
- this._updateIcon.bind(this));
- this.connect('destroy', () => {
- textureCache.disconnect(iconThemeChangedId);
- });
+ textureCache.connectObject('icon-theme-changed',
+ () => this._updateIcon(), this);
this._updateIcon();
this._delegate = this;
@@ -269,9 +270,7 @@ class DesktopTarget extends EventEmitter {
_setDesktop(desktop) {
if (this._desktop) {
- this._desktop.disconnect(this._desktopDestroyedId);
- this._desktopDestroyedId = 0;
-
+ this._desktop.disconnectObject(this);
delete this._desktop._delegate;
}
@@ -279,9 +278,9 @@ class DesktopTarget extends EventEmitter {
this.emit('desktop-changed');
if (this._desktop) {
- this._desktopDestroyedId = this._desktop.connect('destroy', () => {
+ this._desktop.connectObject('destroy', () => {
this._setDesktop(null);
- });
+ }, this);
this._desktop._delegate = this;
}
}
@@ -321,10 +320,7 @@ class DesktopTarget extends EventEmitter {
}
destroy() {
- if (this._windowAddedId)
- global.window_group.disconnect(this._windowAddedId);
- this._windowAddedId = 0;
-
+ global.window_group.disconnectObject(this);
this._setDesktop(null);
}
@@ -386,15 +382,14 @@ class ApplicationsButton extends PanelMenu.Button {
this.name = 'panelApplications';
this.label_actor = this._label;
- this._showingId = Main.overview.connect('showing', () => {
- this.add_accessible_state(Atk.StateType.CHECKED);
- });
- this._hidingId = Main.overview.connect('hiding', () => {
- this.remove_accessible_state(Atk.StateType.CHECKED);
- });
+ Main.overview.connectObject(
+ 'showing', () => this.add_accessible_state(Atk.StateType.CHECKED),
+ 'hiding', () => this.remove_accessible_state(Atk.StateType.CHECKED),
+ this);
+
Main.wm.addKeybinding(
'apps-menu-toggle-menu',
- ExtensionUtils.getSettings(),
+ Extension.lookupByURL(import.meta.url).getSettings(),
Meta.KeyBindingFlags.IGNORE_AUTOREPEAT,
Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW,
() => this.menu.toggle());
@@ -410,15 +405,15 @@ class ApplicationsButton extends PanelMenu.Button {
});
this._tree = new GMenu.Tree({menu_basename: 'applications.menu'});
- this._treeChangedId = this._tree.connect('changed',
- this._onTreeChanged.bind(this));
+ this._tree.connectObject('changed',
+ () => this._onTreeChanged(), this);
this._applicationsButtons = new Map();
this.reloadFlag = false;
this._createLayout();
this._display();
- this._installedChangedId = appSys.connect('installed-changed',
- this._onTreeChanged.bind(this));
+ appSys.connectObject('installed-changed',
+ () => this._onTreeChanged(), this);
}
_onTreeChanged() {
@@ -442,11 +437,7 @@ class ApplicationsButton extends PanelMenu.Button {
_onDestroy() {
super._onDestroy();
- Main.overview.disconnect(this._showingId);
- Main.overview.disconnect(this._hidingId);
- appSys.disconnect(this._installedChangedId);
- this._tree.disconnect(this._treeChangedId);
- this._tree = null;
+ delete this._tree;
Main.wm.removeKeybinding('apps-menu-toggle-menu');
@@ -677,22 +668,17 @@ class ApplicationsButton extends PanelMenu.Button {
}
}
-let appsMenuButton;
+export default class AppsMenuExtension extends Extension {
+ enable() {
+ this._appsMenuButton = new ApplicationsButton();
+ const index = Main.sessionMode.panel.left.indexOf('activities') + 1;
+ Main.panel.addToStatusArea(
+ 'apps-menu', this._appsMenuButton, index, 'left');
+ }
-/** */
-function enable() {
- appsMenuButton = new ApplicationsButton();
- let index = Main.sessionMode.panel.left.indexOf('activities') + 1;
- Main.panel.addToStatusArea('apps-menu', appsMenuButton, index, 'left');
-}
-
-/** */
-function disable() {
- Main.panel.menuManager.removeMenu(appsMenuButton.menu);
- appsMenuButton.destroy();
-}
-
-/** */
-function init() {
- ExtensionUtils.initTranslations();
+ disable() {
+ Main.panel.menuManager.removeMenu(this._appsMenuButton.menu);
+ this._appsMenuButton.destroy();
+ delete this._appsMenuButton;
+ }
}
diff --git a/extensions/auto-move-windows/extension.js b/extensions/auto-move-windows/extension.js
index 298de536..1b0cb43c 100644
--- a/extensions/auto-move-windows/extension.js
+++ b/extensions/auto-move-windows/extension.js
@@ -1,22 +1,20 @@
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
// Start apps on custom workspaces
-/* exported init enable disable */
-const {Shell} = imports.gi;
+import Shell from 'gi://Shell';
-const ExtensionUtils = imports.misc.extensionUtils;
-const Main = imports.ui.main;
+import {Extension} from 'resource:///org/gnome/shell/extensions/extension.js';
+import * as Main from 'resource:///org/gnome/shell/ui/main.js';
class WindowMover {
- constructor() {
- this._settings = ExtensionUtils.getSettings();
+ constructor(settings) {
+ this._settings = settings;
this._appSystem = Shell.AppSystem.get_default();
this._appConfigs = new Map();
this._appData = new Map();
- this._appsChangedId =
- this._appSystem.connect('installed-changed',
- this._updateAppData.bind(this));
+ this._appSystem.connectObject('installed-changed',
+ () => this._updateAppData(), this);
this._settings.connect('changed', this._updateAppConfigs.bind(this));
this._updateAppConfigs();
@@ -38,7 +36,7 @@ class WindowMover {
let removedApps = [...this._appData.keys()]
.filter(a => !ids.includes(a.id));
removedApps.forEach(app => {
- app.disconnect(this._appData.get(app).windowsChangedId);
+ app.disconnectObject(this);
this._appData.delete(app);
});
@@ -46,21 +44,14 @@ class WindowMover {
.map(id => this._appSystem.lookup_app(id))
.filter(app => app && !this._appData.has(app));
addedApps.forEach(app => {
- let data = {
- windowsChangedId: app.connect('windows-changed',
- this._appWindowsChanged.bind(this)),
- moveWindowsId: 0,
- windows: app.get_windows(),
- };
- this._appData.set(app, data);
+ app.connectObject('window-changed',
+ this._appWindowsChanged.bind(this), this);
+ this._appData.set(app, {windows: app.get_windows()});
});
}
destroy() {
- if (this._appsChangedId) {
- this._appSystem.disconnect(this._appsChangedId);
- this._appsChangedId = 0;
- }
+ this._appSystem.disconnectObject(this);
if (this._settings) {
this._settings.run_dispose();
@@ -105,47 +96,41 @@ class WindowMover {
}
}
-let prevCheckWorkspaces;
-let winMover;
-
-/** */
-function init() {
- ExtensionUtils.initTranslations();
-}
-
-/**
- * @returns {bool} - false (used as MetaLater handler)
- */
-function myCheckWorkspaces() {
- let keepAliveWorkspaces = [];
- let foundNonEmpty = false;
- for (let i = this._workspaces.length - 1; i >= 0; i--) {
- if (!foundNonEmpty) {
- foundNonEmpty = this._workspaces[i].list_windows().some(
- w => !w.is_on_all_workspaces());
- } else if (!this._workspaces[i]._keepAliveId) {
- keepAliveWorkspaces.push(this._workspaces[i]);
- }
+export default class AutoMoveExtension extends Extension {
+ enable() {
+ this._prevCheckWorkspaces = Main.wm._workspaceTracker._checkWorkspaces;
+ Main.wm._workspaceTracker._checkWorkspaces =
+ this._getCheckWorkspaceOverride(this._prevCheckWorkspaces);
+ this._windowMover = new WindowMover(this.getSettings());
}
- // make sure the original method only removes empty workspaces at the end
- keepAliveWorkspaces.forEach(ws => (ws._keepAliveId = 1));
- prevCheckWorkspaces.call(this);
- keepAliveWorkspaces.forEach(ws => delete ws._keepAliveId);
+ disable() {
+ Main.wm._workspaceTracker._checkWorkspaces = this._prevCheckWorkspaces;
+ this._windowMover.destroy();
+ delete this._windowMover;
+ }
- return false;
-}
-
-/** */
-function enable() {
- prevCheckWorkspaces = Main.wm._workspaceTracker._checkWorkspaces;
- Main.wm._workspaceTracker._checkWorkspaces = myCheckWorkspaces;
-
- winMover = new WindowMover();
-}
-
-/** */
-function disable() {
- Main.wm._workspaceTracker._checkWorkspaces = prevCheckWorkspaces;
- winMover.destroy();
+ _getCheckWorkspaceOverride(originalMethod) {
+ /* eslint-disable no-invalid-this */
+ return function () {
+ const keepAliveWorkspaces = [];
+ let foundNonEmpty = false;
+ for (let i = this._workspaces.length - 1; i >= 0; i--) {
+ if (!foundNonEmpty) {
+ foundNonEmpty = this._workspaces[i].list_windows().some(
+ w => !w.is_on_all_workspaces());
+ } else if (!this._workspaces[i]._keepAliveId) {
+ keepAliveWorkspaces.push(this._workspaces[i]);
+ }
+ }
+
+ // make sure the original method only removes empty workspaces at the end
+ keepAliveWorkspaces.forEach(ws => (ws._keepAliveId = 1));
+ originalMethod.call(this);
+ keepAliveWorkspaces.forEach(ws => delete ws._keepAliveId);
+
+ return false;
+ };
+ /* eslint-enable no-invalid-this */
+ }
}
diff --git a/extensions/auto-move-windows/prefs.js b/extensions/auto-move-windows/prefs.js
index b849db7d..62be52a0 100644
--- a/extensions/auto-move-windows/prefs.js
+++ b/extensions/auto-move-windows/prefs.js
@@ -1,12 +1,13 @@
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
// Start apps on custom workspaces
-/* exported init buildPrefsWidget */
-const {Adw, Gio, GLib, GObject, Gtk} = imports.gi;
+import Adw from 'gi://Adw';
+import Gio from 'gi://Gio';
+import GLib from 'gi://GLib';
+import GObject from 'gi://GObject';
+import Gtk from 'gi://Gtk';
-const ExtensionUtils = imports.misc.extensionUtils;
-
-const _ = ExtensionUtils.gettext;
+import {ExtensionPreferences, gettext as _} from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js';
const SETTINGS_KEY = 'application-list';
@@ -59,13 +60,14 @@ class RulesList extends GObject.Object {
GObject.registerClass(this);
}
- #settings = ExtensionUtils.getSettings();
+ #settings;
#rules = [];
#changedId;
- constructor() {
+ constructor(settings) {
super();
+ this.#settings = settings;
this.#changedId =
this.#settings.connect(`changed::${SETTINGS_KEY}`,
() => this.#sync());
@@ -147,12 +149,13 @@ class AutoMoveSettingsWidget extends Adw.PreferencesGroup {
(self, name, param) => self._rules.changeWorkspace(...param.deepUnpack()));
}
- constructor() {
+ constructor(settings) {
super({
title: _('Workspace Rules'),
});
- this._rules = new RulesList();
+ this._settings = settings;
+ this._rules = new RulesList(this._settings);
const store = new Gio.ListStore({item_type: Gio.ListModel});
const listModel = new Gtk.FlattenListModel({model: store});
@@ -173,7 +176,7 @@ class AutoMoveSettingsWidget extends Adw.PreferencesGroup {
}
_addNewRule() {
- const dialog = new NewRuleDialog(this.get_root());
+ const dialog = new NewRuleDialog(this.get_root(), this._settings);
dialog.connect('response', (dlg, id) => {
const appInfo = id === Gtk.ResponseType.OK
? dialog.get_widget().get_app_info() : null;
@@ -312,13 +315,13 @@ class NewRuleDialog extends Gtk.AppChooserDialog {
GObject.registerClass(this);
}
- constructor(parent) {
+ constructor(parent, settings) {
super({
transient_for: parent,
modal: true,
});
- this._settings = ExtensionUtils.getSettings();
+ this._settings = settings;
this.get_widget().set({
show_all: true,
@@ -338,14 +341,8 @@ class NewRuleDialog extends Gtk.AppChooserDialog {
}
}
-/** */
-function init() {
- ExtensionUtils.initTranslations();
-}
-
-/**
- * @returns {Gtk.Widget} - the prefs widget
- */
-function buildPrefsWidget() {
- return new AutoMoveSettingsWidget();
+export default class AutoMovePrefs extends ExtensionPreferences {
+ getPreferencesWidget() {
+ return new AutoMoveSettingsWidget(this.getSettings());
+ }
}
diff --git a/extensions/drive-menu/extension.js b/extensions/drive-menu/extension.js
index 45c854f4..7d42ab25 100644
--- a/extensions/drive-menu/extension.js
+++ b/extensions/drive-menu/extension.js
@@ -1,14 +1,16 @@
-/* exported init enable disable */
// Drive menu extension
-const {Clutter, Gio, GObject, Shell, St} = imports.gi;
+import Clutter from 'gi://Clutter';
+import Gio from 'gi://Gio';
+import GObject from 'gi://GObject';
+import Shell from 'gi://Shell';
+import St from 'gi://St';
-const ExtensionUtils = imports.misc.extensionUtils;
-const Main = imports.ui.main;
-const PanelMenu = imports.ui.panelMenu;
-const PopupMenu = imports.ui.popupMenu;
-const ShellMountOperation = imports.ui.shellMountOperation;
+import {Extension, gettext as _} from 'resource:///org/gnome/shell/extensions/extension.js';
-const _ = ExtensionUtils.gettext;
+import * as Main from 'resource:///org/gnome/shell/ui/main.js';
+import * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js';
+import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js';
+import * as ShellMountOperation from 'resource:///org/gnome/shell/ui/shellMountOperation.js';
Gio._promisify(Gio.File.prototype, 'query_filesystem_info_async');
@@ -47,19 +49,11 @@ class MountMenuItem extends PopupMenu.PopupBaseMenuItem {
this.hide();
- this._changedId = mount.connect('changed', this._syncVisibility.bind(this));
+ mount.connectObject('changed',
+ () => this._syncVisibility(), this);
this._syncVisibility();
}
- _onDestroy() {
- if (this._changedId) {
- this.mount.disconnect(this._changedId);
- this._changedId = 0;
- }
-
- super.destroy();
- }
-
async _isInteresting() {
if (!this.mount.can_eject() && !this.mount.can_unmount())
return false;
@@ -152,12 +146,12 @@ class DriveMenu extends PanelMenu.Button {
this.add_child(icon);
this._monitor = Gio.VolumeMonitor.get();
- this._addedId = this._monitor.connect('mount-added',
- (monitor, mount) => this._addMount(mount));
- this._removedId = this._monitor.connect('mount-removed', (monitor, mount) => {
- this._removeMount(mount);
- this._updateMenuVisibility();
- });
+ this._monitor.connectObject(
+ 'mount-added', (monitor, mount) => this._addMount(mount),
+ 'mount-removed', (monitor, mount) => {
+ this._removeMount(mount);
+ this._updateMenuVisibility();
+ }, this);
this._mounts = [];
@@ -199,33 +193,16 @@ class DriveMenu extends PanelMenu.Button {
}
log('Removing a mount that was never added to the menu');
}
+}
- _onDestroy() {
- if (this._addedId) {
- this._monitor.disconnect(this._addedId);
- this._monitor.disconnect(this._removedId);
- this._addedId = 0;
- this._removedId = 0;
- }
+export default class PlaceMenuExtension extends Extension {
+ enable() {
+ this._indicator = new DriveMenu();
+ Main.panel.addToStatusArea('drive-menu', this._indicator);
+ }
- super._onDestroy();
+ disable() {
+ this._indicator.destroy();
+ delete this._indicator;
}
}
-
-/** */
-function init() {
- ExtensionUtils.initTranslations();
-}
-
-let _indicator;
-
-/** */
-function enable() {
- _indicator = new DriveMenu();
- Main.panel.addToStatusArea('drive-menu', _indicator);
-}
-
-/** */
-function disable() {
- _indicator.destroy();
-}
diff --git a/extensions/launch-new-instance/extension.js b/extensions/launch-new-instance/extension.js
index a249cd48..b4b0d8ae 100644
--- a/extensions/launch-new-instance/extension.js
+++ b/extensions/launch-new-instance/extension.js
@@ -1,17 +1,22 @@
-/* exported enable disable */
-const AppDisplay = imports.ui.appDisplay;
+import {AppIcon} from 'resource:///org/gnome/shell/ui/appDisplay.js';
+import {InjectionManager} from 'resource:///org/gnome/shell/extensions/extension.js';
-let _activateOriginal = null;
+export default class Extension {
+ constructor() {
+ this._injectionManager = new InjectionManager();
+ }
-/** */
-function enable() {
- _activateOriginal = AppDisplay.AppIcon.prototype.activate;
- AppDisplay.AppIcon.prototype.activate = function () {
- _activateOriginal.call(this, 2);
- };
-}
-
-/** */
-function disable() {
- AppDisplay.AppIcon.prototype.activate = _activateOriginal;
+ enable() {
+ this._injectionManager.overrideMethod(AppIcon.prototype, 'activate',
+ originalMethod => {
+ return function () {
+ // eslint-disable-next-line no-invalid-this
+ originalMethod.call(this, 2);
+ };
+ });
+ }
+
+ disable() {
+ this._injectionManager.clear();
+ }
}
diff --git a/extensions/light-style/extension.js b/extensions/light-style/extension.js
new file mode 100644
index 00000000..5825093d
--- /dev/null
+++ b/extensions/light-style/extension.js
@@ -0,0 +1,36 @@
+/*
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+import St from 'gi://St';
+
+import * as Main from 'resource:///org/gnome/shell/ui/main.js';
+
+export default class Extension {
+ _updateColorScheme(scheme) {
+ Main.sessionMode.colorScheme = scheme;
+ St.Settings.get().notify('color-scheme');
+ }
+
+ enable() {
+ this._savedColorScheme = Main.sessionMode.colorScheme;
+ this._updateColorScheme('prefer-light');
+ }
+
+ disable() {
+ this._updateColorScheme(this._savedColorScheme);
+ }
+}
diff --git a/extensions/light-style/meson.build b/extensions/light-style/meson.build
new file mode 100644
index 00000000..48504f63
--- /dev/null
+++ b/extensions/light-style/meson.build
@@ -0,0 +1,5 @@
+extension_data += configure_file(
+ input: metadata_name + '.in',
+ output: metadata_name,
+ configuration: metadata_conf
+)
diff --git a/extensions/light-style/metadata.json.in b/extensions/light-style/metadata.json.in
new file mode 100644
index 00000000..a763a9f9
--- /dev/null
+++ b/extensions/light-style/metadata.json.in
@@ -0,0 +1,10 @@
+{
+"extension-id": "@extension_id@",
+"uuid": "@uuid@",
+"settings-schema": "@gschemaname@",
+"gettext-domain": "@gettext_domain@",
+"name": "Light Style",
+"description": "Switch default to light style",
+"shell-version": [ "@shell_current@" ],
+"url": "@url@"
+}
diff --git a/extensions/native-window-placement/extension.js b/extensions/native-window-placement/extension.js
index b6b662a8..9877a8fe 100644
--- a/extensions/native-window-placement/extension.js
+++ b/extensions/native-window-placement/extension.js
@@ -1,11 +1,11 @@
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
-/* exported enable disable */
-const {Clutter} = imports.gi;
+import Clutter from 'gi://Clutter';
-const ExtensionUtils = imports.misc.extensionUtils;
-const Main = imports.ui.main;
-const {WindowPreview} = imports.ui.windowPreview;
-const Workspace = imports.ui.workspace;
+import {Extension, InjectionManager} from 'resource:///org/gnome/shell/extensions/extension.js';
+
+import * as Main from 'resource:///org/gnome/shell/ui/main.js';
+import {WindowPreview} from 'resource:///org/gnome/shell/ui/windowPreview.js';
+import * as Workspace from 'resource:///org/gnome/shell/ui/workspace.js';
// testing settings for natural window placement strategy:
const WINDOW_PLACEMENT_NATURAL_ACCURACY = 20; // accuracy of window translate moves (KDE-default: 20)
@@ -236,75 +236,64 @@ class NaturalLayoutStrategy extends Workspace.LayoutStrategy {
}
}
-let winInjections, workspaceInjections;
+export default class NativeWindowPlacementExtension extends Extension {
+ constructor(metadata) {
+ super(metadata);
-/** */
-function resetState() {
- winInjections = { };
- workspaceInjections = { };
-}
-
-/** */
-function enable() {
- resetState();
-
- let settings = ExtensionUtils.getSettings();
-
- workspaceInjections['_createBestLayout'] = Workspace.WorkspaceLayout.prototype._createBestLayout;
- Workspace.WorkspaceLayout.prototype._createBestLayout = function (_area) {
- this._layoutStrategy = new NaturalLayoutStrategy({
- monitor: Main.layoutManager.monitors[this._monitorIndex],
- }, settings);
- return this._layoutStrategy.computeLayout(this._sortedWindows);
- };
-
- // position window titles on top of windows in overlay
- winInjections['_init'] = WindowPreview.prototype._init;
- WindowPreview.prototype._init = function (...args) {
- winInjections['_init'].call(this, ...args);
-
- if (!settings.get_boolean('window-captions-on-top'))
- return;
-
- const alignConstraint = this._title.get_constraints().find(
- c => c.align_axis && c.align_axis === Clutter.AlignAxis.Y_AXIS);
- alignConstraint.factor = 0;
-
- const bindConstraint = this._title.get_constraints().find(
- c => c.coordinate && c.coordinate === Clutter.BindCoordinate.Y);
- bindConstraint.offset = 0;
- };
- winInjections['_adjustOverlayOffsets'] =
- WindowPreview.prototype._adjustOverlayOffsets;
- WindowPreview.prototype._adjustOverlayOffsets = function (...args) {
- winInjections['_adjustOverlayOffsets'].call(this, ...args);
-
- if (settings.get_boolean('window-captions-on-top'))
- this._title.translation_y = -this._title.translation_y;
- };
-}
-
-/**
- * @param {object} object - object that was modified
- * @param {object} injection - the map of previous injections
- * @param {string} name - the @injection key that should be removed
- */
-function removeInjection(object, injection, name) {
- if (injection[name] === undefined)
- delete object[name];
- else
- object[name] = injection[name];
-}
-
-/** */
-function disable() {
- var i;
-
- for (i in workspaceInjections)
- removeInjection(Workspace.WorkspaceLayout.prototype, workspaceInjections, i);
- for (i in winInjections)
- removeInjection(WindowPreview.prototype, winInjections, i);
-
- global.stage.queue_relayout();
- resetState();
+ this._injectionManager = new InjectionManager();
+ }
+
+ enable() {
+ const settings = this.getSettings();
+
+ const layoutProto = Workspace.WorkspaceLayout.prototype;
+ const previewProto = WindowPreview.prototype;
+
+ this._injectionManager.overrideMethod(layoutProto, '_createBestLayout', () => {
+ /* eslint-disable no-invalid-this */
+ return function () {
+ this._layoutStrategy = new NaturalLayoutStrategy({
+ monitor: Main.layoutManager.monitors[this._monitorIndex],
+ }, settings);
+ return this._layoutStrategy.computeLayout(this._sortedWindows);
+ };
+ /* eslint-enable no-invalid-this */
+ });
+
+ // position window titles on top of windows in overlay
+ this._injectionManager.overrideMethod(previewProto, '_init', originalMethod => {
+ /* eslint-disable no-invalid-this */
+ return function (...args) {
+ originalMethod.call(this, ...args);
+
+ if (!settings.get_boolean('window-captions-on-top'))
+ return;
+
+ const alignConstraint = this._title.get_constraints().find(
+ c => c.align_axis && c.align_axis === Clutter.AlignAxis.Y_AXIS);
+ alignConstraint.factor = 0;
+
+ const bindConstraint = this._title.get_constraints().find(
+ c => c.coordinate && c.coordinate === Clutter.BindCoordinate.Y);
+ bindConstraint.offset = 0;
+ };
+ /* eslint-enable no-invalid-this */
+ });
+
+ this._injectionManager.overrideMethod(previewProto, '_adjustOverlayOffsets', originalMethod => {
+ /* eslint-disable no-invalid-this */
+ return function (...args) {
+ originalMethod.call(this, ...args);
+
+ if (settings.get_boolean('window-captions-on-top'))
+ this._title.translation_y = -this._title.translation_y;
+ };
+ /* eslint-enable no-invalid-this */
+ });
+ }
+
+ disable() {
+ this._injectionManager.clear();
+ global.stage.queue_relayout();
+ }
}
diff --git a/extensions/places-menu/extension.js b/extensions/places-menu/extension.js
index f71460c7..de8593e7 100644
--- a/extensions/places-menu/extension.js
+++ b/extensions/places-menu/extension.js
@@ -1,17 +1,16 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
-/* exported init enable disable */
+import Clutter from 'gi://Clutter';
+import GObject from 'gi://GObject';
+import St from 'gi://St';
-const {Clutter, GObject, St} = imports.gi;
+import {Extension, gettext as _} from 'resource:///org/gnome/shell/extensions/extension.js';
-const ExtensionUtils = imports.misc.extensionUtils;
-const Main = imports.ui.main;
-const PanelMenu = imports.ui.panelMenu;
-const PopupMenu = imports.ui.popupMenu;
+import * as Main from 'resource:///org/gnome/shell/ui/main.js';
+import * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js';
+import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js';
-const Me = ExtensionUtils.getCurrentExtension();
-const PlaceDisplay = Me.imports.placeDisplay;
+import {PlacesManager} from './placeDisplay.js';
-const _ = ExtensionUtils.gettext;
const N_ = x => x;
const PLACE_ICON_SIZE = 16;
@@ -53,17 +52,8 @@ class PlaceMenuItem extends PopupMenu.PopupBaseMenuItem {
this.add_child(this._ejectButton);
}
- this._changedId = info.connect('changed',
- this._propertiesChanged.bind(this));
- }
-
- destroy() {
- if (this._changedId) {
- this._info.disconnect(this._changedId);
- this._changedId = 0;
- }
-
- super.destroy();
+ info.connectObject('changed',
+ this._propertiesChanged.bind(this), this);
}
activate(event) {
@@ -100,7 +90,7 @@ class PlacesMenu extends PanelMenu.Button {
});
this.add_actor(label);
- this.placesManager = new PlaceDisplay.PlacesManager();
+ this.placesManager = new PlacesManager();
this._sections = { };
@@ -138,24 +128,18 @@ class PlacesMenu extends PanelMenu.Button {
}
}
-/** */
-function init() {
- ExtensionUtils.initTranslations();
-}
-
-let _indicator;
-
-/** */
-function enable() {
- _indicator = new PlacesMenu();
-
- let pos = Main.sessionMode.panel.left.indexOf('appMenu');
- if ('apps-menu' in Main.panel.statusArea)
- pos++;
- Main.panel.addToStatusArea('places-menu', _indicator, pos, 'left');
-}
-
-/** */
-function disable() {
- _indicator.destroy();
+export default class PlacesMenuExtension extends Extension {
+ enable() {
+ this._indicator = new PlacesMenu();
+
+ let pos = Main.sessionMode.panel.left.length;
+ if ('apps-menu' in Main.panel.statusArea)
+ pos++;
+ Main.panel.addToStatusArea('places-menu', this._indicator, pos, 'left');
+ }
+
+ disable() {
+ this._indicator.destroy();
+ delete this._indicator;
+ }
}
diff --git a/extensions/places-menu/placeDisplay.js b/extensions/places-menu/placeDisplay.js
index 9b5c205f..0be170fe 100644
--- a/extensions/places-menu/placeDisplay.js
+++ b/extensions/places-menu/placeDisplay.js
@@ -1,14 +1,14 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
-/* exported PlacesManager */
+import Gio from 'gi://Gio';
+import GLib from 'gi://GLib';
+import Shell from 'gi://Shell';
+import {EventEmitter} from 'resource:///org/gnome/shell/misc/signals.js';
-const {Gio, GLib, Shell} = imports.gi;
-const {EventEmitter} = imports.misc.signals;
+import {gettext as _} from 'resource:///org/gnome/shell/extensions/extension.js';
-const ExtensionUtils = imports.misc.extensionUtils;
-const Main = imports.ui.main;
-const ShellMountOperation = imports.ui.shellMountOperation;
+import * as Main from 'resource:///org/gnome/shell/ui/main.js';
+import * as ShellMountOperation from 'resource:///org/gnome/shell/ui/shellMountOperation.js';
-const _ = ExtensionUtils.gettext;
const N_ = x => x;
Gio._promisify(Gio.AppInfo, 'launch_default_for_uri_async');
@@ -248,7 +248,7 @@ const DEFAULT_DIRECTORIES = [
GLib.UserDirectory.DIRECTORY_VIDEOS,
];
-var PlacesManager = class extends EventEmitter {
+export class PlacesManager extends EventEmitter {
constructor() {
super();
@@ -260,15 +260,25 @@ var PlacesManager = class extends EventEmitter {
};
this._settings = new Gio.Settings({schema_id: BACKGROUND_SCHEMA});
- this._showDesktopIconsChangedId = this._settings.connect(
- 'changed::show-desktop-icons', this._updateSpecials.bind(this));
+ this._settings.connectObject('changed::show-desktop-icons',
+ () => this._updateSpecials(), this);
this._updateSpecials();
/*
* Show devices, code more or less ported from nautilus-places-sidebar.c
*/
this._volumeMonitor = Gio.VolumeMonitor.get();
- this._connectVolumeMonitorSignals();
+ this._volumeMonitor.connectObject(
+ 'volume-added', () => this._updateMounts(),
+ 'volume-removed', () => this._updateMounts(),
+ 'volume-changed', () => this._updateMounts(),
+ 'mount-added', () => this._updateMounts(),
+ 'mount-removed', () => this._updateMounts(),
+ 'mount-changed', () => this._updateMounts(),
+ 'drive-connected', () => this._updateMounts(),
+ 'drive-disconnected', () => this._updateMounts(),
+ 'drive-changed', () => this._updateMounts(),
+ this);
this._updateMounts();
this._bookmarksFile = this._findBookmarksFile();
@@ -293,34 +303,11 @@ var PlacesManager = class extends EventEmitter {
}
}
- _connectVolumeMonitorSignals() {
- const signals = [
- 'volume-added',
- 'volume-removed',
- 'volume-changed',
- 'mount-added',
- 'mount-removed',
- 'mount-changed',
- 'drive-connected',
- 'drive-disconnected',
- 'drive-changed',
- ];
-
- this._volumeMonitorSignals = [];
- let func = this._updateMounts.bind(this);
- for (let i = 0; i < signals.length; i++) {
- let id = this._volumeMonitor.connect(signals[i], func);
- this._volumeMonitorSignals.push(id);
- }
- }
-
destroy() {
- if (this._settings)
- this._settings.disconnect(this._showDesktopIconsChangedId);
+ this._settings?.disconnectObject(this);
this._settings = null;
- for (let i = 0; i < this._volumeMonitorSignals.length; i++)
- this._volumeMonitor.disconnect(this._volumeMonitorSignals[i]);
+ this._volumeMonitor.disconnectObject(this);
if (this._monitor)
this._monitor.cancel();
@@ -546,4 +533,4 @@ var PlacesManager = class extends EventEmitter {
get(kind) {
return this._places[kind];
}
-};
+}
diff --git a/extensions/screenshot-window-sizer/extension.js b/extensions/screenshot-window-sizer/extension.js
index d59ec3f3..4312a5a5 100644
--- a/extensions/screenshot-window-sizer/extension.js
+++ b/extensions/screenshot-window-sizer/extension.js
@@ -1,4 +1,3 @@
-/* exported enable disable */
/* Screenshot Window Sizer for Gnome Shell
*
* Copyright (c) 2013 Owen Taylor
@@ -19,153 +18,151 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
-const {Clutter, Meta, Shell, St} = imports.gi;
+import Clutter from 'gi://Clutter';
+import Meta from 'gi://Meta';
+import Shell from 'gi://Shell';
+import St from 'gi://St';
-const ExtensionUtils = imports.misc.extensionUtils;
-const Main = imports.ui.main;
+import {Extension} from 'resource:///org/gnome/shell/extensions/extension.js';
+
+import * as Main from 'resource:///org/gnome/shell/ui/main.js';
const MESSAGE_FADE_TIME = 2000;
-let text;
+export default class ScreenshotWindowSizerExtension extends Extension {
+ SIZES = [
+ [624, 351],
+ [800, 450],
+ [1024, 576],
+ [1200, 675],
+ [1600, 900],
+ [360, 654], // Phone portrait maximized
+ [720, 360], // Phone landscape fullscreen
+ ];
-/** */
-function hideMessage() {
- text.destroy();
- text = null;
-}
-
-/**
- * @param {string} message - the message to flash
- */
-function flashMessage(message) {
- if (!text) {
- text = new St.Label({style_class: 'screenshot-sizer-message'});
- Main.uiGroup.add_actor(text);
- }
-
- text.remove_all_transitions();
- text.text = message;
-
- text.opacity = 255;
-
- let monitor = Main.layoutManager.primaryMonitor;
- text.set_position(
- monitor.x + Math.floor(monitor.width / 2 - text.width / 2),
- monitor.y + Math.floor(monitor.height / 2 - text.height / 2));
-
- text.ease({
- opacity: 0,
- duration: MESSAGE_FADE_TIME,
- mode: Clutter.AnimationMode.EASE_OUT_QUAD,
- onComplete: hideMessage,
- });
-}
-
-let SIZES = [
- [624, 351],
- [800, 450],
- [1024, 576],
- [1200, 675],
- [1600, 900],
- [360, 654], // Phone portrait maximized
- [720, 360], // Phone landscape fullscreen
-];
-
-/**
- * @param {Meta.Display} display - the display
- * @param {Meta.Window=} window - for per-window bindings, the window
- * @param {Meta.KeyBinding} binding - the key binding
- */
-function cycleScreenshotSizes(display, window, binding) {
- // Probably this isn't useful with 5 sizes, but you can decrease instead
- // of increase by holding down shift.
- let modifiers = binding.get_modifiers();
- let backwards = (modifiers & Meta.VirtualModifier.SHIFT_MASK) !== 0;
-
- // Unmaximize first
- if (window.get_maximized() !== 0)
- window.unmaximize(Meta.MaximizeFlags.BOTH);
-
- let workArea = window.get_work_area_current_monitor();
- let outerRect = window.get_frame_rect();
-
- // Double both axes if on a hidpi display
- let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
- let scaledSizes = SIZES.map(size => size.map(wh => wh * scaleFactor))
- .filter(([w, h]) => w <= workArea.width && h <= workArea.height);
-
- // Find the nearest 16:9 size for the current window size
- let nearestIndex;
- let nearestError;
-
- for (let i = 0; i < scaledSizes.length; i++) {
- let [width, height] = scaledSizes[i];
-
- // get the best initial window size
- let error = Math.abs(width - outerRect.width) + Math.abs(height - outerRect.height);
- if (nearestIndex === undefined || error < nearestError) {
- nearestIndex = i;
- nearestError = error;
+ _flashMessage(message) {
+ if (!this._text) {
+ this._text = new St.Label({style_class: 'screenshot-sizer-message'});
+ Main.uiGroup.add_actor(this._text);
}
+
+ this._text.remove_all_transitions();
+ this._text.text = message;
+
+ this._text.opacity = 255;
+
+ const monitor = Main.layoutManager.primaryMonitor;
+ this._text.set_position(
+ monitor.x + Math.floor(monitor.width / 2 - this._text.width / 2),
+ monitor.y + Math.floor(monitor.height / 2 - this._text.height / 2));
+
+ this._text.ease({
+ opacity: 0,
+ duration: MESSAGE_FADE_TIME,
+ mode: Clutter.AnimationMode.EASE_OUT_QUAD,
+ onComplete: () => this._hideMessage(),
+ });
}
- // get the next size up or down from ideal
- let newIndex = (nearestIndex + (backwards ? -1 : 1)) % scaledSizes.length;
- let [newWidth, newHeight] = scaledSizes[newIndex];
+ _hideMessage() {
+ this._text.destroy();
+ delete this._text;
+ }
- // Push the window onscreen if it would be resized offscreen
- let newX = outerRect.x;
- let newY = outerRect.y;
- if (newX + newWidth > workArea.x + workArea.width)
- newX = Math.max(workArea.x + workArea.width - newWidth);
- if (newY + newHeight > workArea.y + workArea.height)
- newY = Math.max(workArea.y + workArea.height - newHeight);
+ /**
+ * @param {Meta.Display} display - the display
+ * @param {Meta.Window=} window - for per-window bindings, the window
+ * @param {Meta.KeyBinding} binding - the key binding
+ */
+ _cycleScreenshotSizes(display, window, binding) {
+ // Probably this isn't useful with 5 sizes, but you can decrease instead
+ // of increase by holding down shift.
+ let modifiers = binding.get_modifiers();
+ let backwards = (modifiers & Meta.VirtualModifier.SHIFT_MASK) !== 0;
- const id = window.connect('size-changed', () => {
- window.disconnect(id);
- _notifySizeChange(window);
- });
- window.move_resize_frame(true, newX, newY, newWidth, newHeight);
-}
-
-/**
- * @param {Meta.Window} window - the window whose size changed
- */
-function _notifySizeChange(window) {
- const {scaleFactor} = St.ThemeContext.get_for_stage(global.stage);
- let newOuterRect = window.get_frame_rect();
- let message = '%d×%d'.format(
- newOuterRect.width / scaleFactor,
- newOuterRect.height / scaleFactor);
-
- // The new size might have been constrained by geometry hints (e.g. for
- // a terminal) - in that case, include the actual ratio to the message
- // we flash
- let actualNumerator = 9 * newOuterRect.width / newOuterRect.height;
- if (Math.abs(actualNumerator - 16) > 0.01)
- message += ' (%.2f:9)'.format(actualNumerator);
-
- flashMessage(message);
-}
-
-/** */
-function enable() {
- Main.wm.addKeybinding(
- 'cycle-screenshot-sizes',
- ExtensionUtils.getSettings(),
- Meta.KeyBindingFlags.PER_WINDOW,
- Shell.ActionMode.NORMAL,
- cycleScreenshotSizes);
- Main.wm.addKeybinding(
- 'cycle-screenshot-sizes-backward',
- ExtensionUtils.getSettings(),
- Meta.KeyBindingFlags.PER_WINDOW | Meta.KeyBindingFlags.IS_REVERSED,
- Shell.ActionMode.NORMAL,
- cycleScreenshotSizes);
-}
-
-/** */
-function disable() {
- Main.wm.removeKeybinding('cycle-screenshot-sizes');
- Main.wm.removeKeybinding('cycle-screenshot-sizes-backward');
+ // Unmaximize first
+ if (window.get_maximized() !== 0)
+ window.unmaximize(Meta.MaximizeFlags.BOTH);
+
+ let workArea = window.get_work_area_current_monitor();
+ let outerRect = window.get_frame_rect();
+
+ // Double both axes if on a hidpi display
+ let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
+ let scaledSizes = this.SIZES.map(size => size.map(wh => wh * scaleFactor))
+ .filter(([w, h]) => w <= workArea.width && h <= workArea.height);
+
+ // Find the nearest 16:9 size for the current window size
+ let nearestIndex;
+ let nearestError;
+
+ for (let i = 0; i < scaledSizes.length; i++) {
+ let [width, height] = scaledSizes[i];
+
+ // get the best initial window size
+ let error = Math.abs(width - outerRect.width) + Math.abs(height - outerRect.height);
+ if (nearestIndex === undefined || error < nearestError) {
+ nearestIndex = i;
+ nearestError = error;
+ }
+ }
+
+ // get the next size up or down from ideal
+ let newIndex = (nearestIndex + (backwards ? -1 : 1)) % scaledSizes.length;
+ let [newWidth, newHeight] = scaledSizes[newIndex];
+
+ // Push the window onscreen if it would be resized offscreen
+ let newX = outerRect.x;
+ let newY = outerRect.y;
+ if (newX + newWidth > workArea.x + workArea.width)
+ newX = Math.max(workArea.x + workArea.width - newWidth);
+ if (newY + newHeight > workArea.y + workArea.height)
+ newY = Math.max(workArea.y + workArea.height - newHeight);
+
+ const id = window.connect('size-changed', () => {
+ window.disconnect(id);
+ this._notifySizeChange(window);
+ });
+ window.move_resize_frame(true, newX, newY, newWidth, newHeight);
+ }
+
+ /**
+ * @param {Meta.Window} window - the window whose size changed
+ */
+ _notifySizeChange(window) {
+ const {scaleFactor} = St.ThemeContext.get_for_stage(global.stage);
+ let newOuterRect = window.get_frame_rect();
+ let message = '%d×%d'.format(
+ newOuterRect.width / scaleFactor,
+ newOuterRect.height / scaleFactor);
+
+ // The new size might have been constrained by geometry hints (e.g. for
+ // a terminal) - in that case, include the actual ratio to the message
+ // we flash
+ let actualNumerator = 9 * newOuterRect.width / newOuterRect.height;
+ if (Math.abs(actualNumerator - 16) > 0.01)
+ message += ' (%.2f:9)'.format(actualNumerator);
+
+ this._flashMessage(message);
+ }
+
+ enable() {
+ Main.wm.addKeybinding(
+ 'cycle-screenshot-sizes',
+ this.getSettings(),
+ Meta.KeyBindingFlags.PER_WINDOW,
+ Shell.ActionMode.NORMAL,
+ this._cycleScreenshotSizes.bind(this));
+ Main.wm.addKeybinding(
+ 'cycle-screenshot-sizes-backward',
+ this.getSettings(),
+ Meta.KeyBindingFlags.PER_WINDOW | Meta.KeyBindingFlags.IS_REVERSED,
+ Shell.ActionMode.NORMAL,
+ this._cycleScreenshotSizes.bind(this));
+ }
+
+ disable() {
+ Main.wm.removeKeybinding('cycle-screenshot-sizes');
+ Main.wm.removeKeybinding('cycle-screenshot-sizes-backward');
+ }
}
diff --git a/extensions/user-theme/extension.js b/extensions/user-theme/extension.js
index 4295519c..f006fdfe 100644
--- a/extensions/user-theme/extension.js
+++ b/extensions/user-theme/extension.js
@@ -1,20 +1,19 @@
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
// Load shell theme from ~/.local/share/themes/name/gnome-shell
-/* exported init */
-const {Gio} = imports.gi;
+import Gio from 'gi://Gio';
-const ExtensionUtils = imports.misc.extensionUtils;
-const Main = imports.ui.main;
+import {Extension} from 'resource:///org/gnome/shell/extensions/extension.js';
-const Me = ExtensionUtils.getCurrentExtension();
-const Util = Me.imports.util;
+import * as Main from 'resource:///org/gnome/shell/ui/main.js';
+
+import {getThemeDirs, getModeThemeDirs} from './util.js';
const SETTINGS_KEY = 'name';
-class ThemeManager {
+export default class ThemeManager extends Extension {
enable() {
- this._settings = ExtensionUtils.getSettings();
+ this._settings = this.getSettings();
this._settings.connect(`changed::${SETTINGS_KEY}`, this._changeTheme.bind(this));
this._changeTheme();
}
@@ -32,10 +31,10 @@ class ThemeManager {
let themeName = this._settings.get_string(SETTINGS_KEY);
if (themeName) {
- const stylesheetPaths = Util.getThemeDirs()
+ const stylesheetPaths = getThemeDirs()
.map(dir => `${dir}/${themeName}/gnome-shell/gnome-shell.css`);
- stylesheetPaths.push(...Util.getModeThemeDirs()
+ stylesheetPaths.push(...getModeThemeDirs()
.map(dir => `${dir}/${themeName}.css`));
stylesheet = stylesheetPaths.find(path => {
@@ -45,17 +44,10 @@ class ThemeManager {
}
if (stylesheet)
- global.log(`loading user theme: ${stylesheet}`);
+ log(`loading user theme: ${stylesheet}`);
else
- global.log('loading default theme (Adwaita)');
+ log('loading default theme (Adwaita)');
Main.setThemeStylesheet(stylesheet);
Main.loadTheme();
}
}
-
-/**
- * @returns {ThemeManager} - the extension state object
- */
-function init() {
- return new ThemeManager();
-}
diff --git a/extensions/user-theme/prefs.js b/extensions/user-theme/prefs.js
index ef5c9fcb..98a27309 100644
--- a/extensions/user-theme/prefs.js
+++ b/extensions/user-theme/prefs.js
@@ -1,15 +1,17 @@
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
-/* exported init buildPrefsWidget */
// we use async/await here to not block the mainloop, not to parallelize
/* eslint-disable no-await-in-loop */
-const {Adw, Gio, GLib, GObject, Gtk} = imports.gi;
+import Adw from 'gi://Adw';
+import Gio from 'gi://Gio';
+import GLib from 'gi://GLib';
+import GObject from 'gi://GObject';
+import Gtk from 'gi://Gtk';
-const ExtensionUtils = imports.misc.extensionUtils;
+import {ExtensionPreferences} from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js';
-const Me = ExtensionUtils.getCurrentExtension();
-const Util = Me.imports.util;
+import {getThemeDirs, getModeThemeDirs} from './util.js';
Gio._promisify(Gio.File.prototype, 'enumerate_children_async');
Gio._promisify(Gio.File.prototype, 'query_info_async');
@@ -20,13 +22,13 @@ class UserThemePrefsWidget extends Adw.PreferencesGroup {
GObject.registerClass(this);
}
- constructor() {
+ constructor(settings) {
super({title: 'Themes'});
this._actionGroup = new Gio.SimpleActionGroup();
this.insert_action_group('theme', this._actionGroup);
- this._settings = ExtensionUtils.getSettings();
+ this._settings = settings;
this._actionGroup.add_action(
this._settings.create_action('name'));
@@ -39,7 +41,7 @@ class UserThemePrefsWidget extends Adw.PreferencesGroup {
}
async _collectThemes() {
- for (const dirName of Util.getThemeDirs()) {
+ for (const dirName of getThemeDirs()) {
const dir = Gio.File.new_for_path(dirName);
for (const name of await this._enumerateDir(dir)) {
if (this._rows.has(name))
@@ -60,7 +62,7 @@ class UserThemePrefsWidget extends Adw.PreferencesGroup {
}
}
- for (const dirName of Util.getModeThemeDirs()) {
+ for (const dirName of getModeThemeDirs()) {
const dir = Gio.File.new_for_path(dirName);
for (const filename of await this._enumerateDir(dir)) {
if (!filename.endsWith('.css'))
@@ -125,13 +127,8 @@ class ThemeRow extends Adw.ActionRow {
}
}
-/** */
-function init() {
-}
-
-/**
- * @returns {Gtk.Widget} - the prefs widget
- */
-function buildPrefsWidget() {
- return new UserThemePrefsWidget();
+export default class UserThemePrefs extends ExtensionPreferences {
+ getPreferencesWidget() {
+ return new UserThemePrefsWidget(this.getSettings());
+ }
}
diff --git a/extensions/user-theme/util.js b/extensions/user-theme/util.js
index 222eb75f..6ba22b74 100644
--- a/extensions/user-theme/util.js
+++ b/extensions/user-theme/util.js
@@ -1,12 +1,11 @@
-/* exported getThemeDirs getModeThemeDirs */
-const {GLib} = imports.gi;
+import GLib from 'gi://GLib';
const fn = (...args) => GLib.build_filenamev(args);
/**
* @returns {string[]} - an ordered list of theme directories
*/
-function getThemeDirs() {
+export function getThemeDirs() {
return [
fn(GLib.get_home_dir(), '.themes'),
fn(GLib.get_user_data_dir(), 'themes'),
@@ -17,7 +16,7 @@ function getThemeDirs() {
/**
* @returns {string[]} - an ordered list of mode theme directories
*/
-function getModeThemeDirs() {
+export function getModeThemeDirs() {
return GLib.get_system_data_dirs()
.map(dir => fn(dir, 'gnome-shell', 'theme'));
}
diff --git a/extensions/window-list/extension.js b/extensions/window-list/extension.js
index 1f4a22f3..71672695 100644
--- a/extensions/window-list/extension.js
+++ b/extensions/window-list/extension.js
@@ -1,21 +1,28 @@
-/* exported init */
-const {Clutter, Gio, GLib, GObject, Gtk, Meta, Shell, St} = imports.gi;
+import Clutter from 'gi://Clutter';
+import Gio from 'gi://Gio';
+import GLib from 'gi://GLib';
+import GObject from 'gi://GObject';
+import Gtk from 'gi://Gtk';
+import Meta from 'gi://Meta';
+import Shell from 'gi://Shell';
+import St from 'gi://St';
-const DND = imports.ui.dnd;
-const ExtensionUtils = imports.misc.extensionUtils;
-const Main = imports.ui.main;
-const Overview = imports.ui.overview;
-const PopupMenu = imports.ui.popupMenu;
+import {Extension, gettext as _} from 'resource:///org/gnome/shell/extensions/extension.js';
-const Me = ExtensionUtils.getCurrentExtension();
-const {WindowPicker, WindowPickerToggle} = Me.imports.windowPicker;
-const {WorkspaceIndicator} = Me.imports.workspaceIndicator;
+import * as DND from 'resource:///org/gnome/shell/ui/dnd.js';
+import * as Main from 'resource:///org/gnome/shell/ui/main.js';
+import * as Overview from 'resource:///org/gnome/shell/ui/overview.js';
+import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js';
-const _ = ExtensionUtils.gettext;
+import {WindowPicker, WindowPickerToggle} from './windowPicker.js';
+import {WorkspaceIndicator} from './workspaceIndicator.js';
const ICON_TEXTURE_SIZE = 24;
const DND_ACTIVATE_TIMEOUT = 500;
+const TOOLTIP_OFFSET = 6;
+const TOOLTIP_ANIMATION_TIME = 150;
+
const GroupingMode = {
NEVER: 0,
AUTO: 1,
@@ -48,10 +55,6 @@ class WindowContextMenu extends PopupMenu.PopupMenu {
});
this.addMenuItem(this._minimizeItem);
- this._notifyMinimizedId = this._metaWindow.connect(
- 'notify::minimized', this._updateMinimizeItem.bind(this));
- this._updateMinimizeItem();
-
this._maximizeItem = new PopupMenu.PopupMenuItem('');
this._maximizeItem.connect('activate', () => {
if (this._metaWindow.get_maximized() === Meta.MaximizeFlags.BOTH)
@@ -61,21 +64,20 @@ class WindowContextMenu extends PopupMenu.PopupMenu {
});
this.addMenuItem(this._maximizeItem);
- this._notifyMaximizedHId = this._metaWindow.connect(
- 'notify::maximized-horizontally',
- this._updateMaximizeItem.bind(this));
- this._notifyMaximizedVId = this._metaWindow.connect(
- 'notify::maximized-vertically',
- this._updateMaximizeItem.bind(this));
- this._updateMaximizeItem();
-
this._closeItem = new PopupMenu.PopupMenuItem(_('Close'));
this._closeItem.connect('activate', () => {
this._metaWindow.delete(global.get_current_time());
});
this.addMenuItem(this._closeItem);
- this.actor.connect('destroy', this._onDestroy.bind(this));
+ this._metaWindow.connectObject(
+ 'notify::minimized', this._updateMinimizeItem.bind(this),
+ 'notify::maximized-horizontally', this._updateMaximizeItem.bind(this),
+ 'notify::maximized-vertically', this._updateMaximizeItem.bind(this),
+ this);
+
+ this._updateMinimizeItem();
+ this._updateMaximizeItem();
this.connect('open-state-changed', () => {
if (!this.isOpen)
@@ -98,12 +100,6 @@ class WindowContextMenu extends PopupMenu.PopupMenu {
this._maximizeItem.label.text = maximized
? _('Unmaximize') : _('Maximize');
}
-
- _onDestroy() {
- this._metaWindow.disconnect(this._notifyMinimizedId);
- this._metaWindow.disconnect(this._notifyMaximizedHId);
- this._metaWindow.disconnect(this._notifyMaximizedVId);
- }
}
class WindowTitle extends St.BoxLayout {
@@ -127,20 +123,19 @@ class WindowTitle extends St.BoxLayout {
this.add(this.label_actor);
this._textureCache = St.TextureCache.get_default();
- this._iconThemeChangedId = this._textureCache.connect(
- 'icon-theme-changed', this._updateIcon.bind(this));
- this._notifyWmClass = this._metaWindow.connect_after(
- 'notify::wm-class', this._updateIcon.bind(this));
- this._notifyAppId = this._metaWindow.connect_after(
- 'notify::gtk-application-id', this._updateIcon.bind(this));
+ this._textureCache.connectObject('icon-theme-changed',
+ () => this._updateIcon(), this);
+
+ this._metaWindow.connectObject(
+ 'notify::wm-class',
+ () => this._updateIcon(), GObject.ConnectFlags.AFTER,
+ 'notify::gtk-application-id',
+ () => this._updateIcon(), GObject.ConnectFlags.AFTER,
+ 'notify::title', () => this._updateTitle(),
+ 'notify::minimized', () => this._minimizedChanged(),
+ this);
+
this._updateIcon();
-
- this.connect('destroy', this._onDestroy.bind(this));
-
- this._notifyTitleId = this._metaWindow.connect(
- 'notify::title', this._updateTitle.bind(this));
- this._notifyMinimizedId = this._metaWindow.connect(
- 'notify::minimized', this._minimizedChanged.bind(this));
this._minimizedChanged();
}
@@ -170,14 +165,6 @@ class WindowTitle extends St.BoxLayout {
});
}
}
-
- _onDestroy() {
- this._textureCache.disconnect(this._iconThemeChangedId);
- this._metaWindow.disconnect(this._notifyTitleId);
- this._metaWindow.disconnect(this._notifyMinimizedId);
- this._metaWindow.disconnect(this._notifyWmClass);
- this._metaWindow.disconnect(this._notifyAppId);
- }
}
class BaseButton extends St.Button {
@@ -213,17 +200,23 @@ class BaseButton extends St.Button {
this._contextMenuManager = new PopupMenu.PopupMenuManager(this);
- this._switchWorkspaceId = global.window_manager.connect(
- 'switch-workspace', this._updateVisibility.bind(this));
+ global.window_manager.connectObject('switch-workspace',
+ () => this._updateVisibility(), this);
if (this._perMonitor) {
- this._windowEnteredMonitorId = global.display.connect(
+ global.display.connectObject(
'window-entered-monitor',
- this._windowEnteredOrLeftMonitor.bind(this));
- this._windowLeftMonitorId = global.display.connect(
+ this._windowEnteredOrLeftMonitor.bind(this),
'window-left-monitor',
- this._windowEnteredOrLeftMonitor.bind(this));
+ this._windowEnteredOrLeftMonitor.bind(this),
+ this);
}
+
+ this._tooltip = new Tooltip(this, {
+ style_class: 'dash-label',
+ visible: false,
+ });
+ Main.uiGroup.add_child(this._tooltip);
}
get active() {
@@ -325,9 +318,11 @@ class BaseButton extends St.Button {
if (isOpen)
return;
+ const extension = Extension.lookupByURL(import.meta.url);
+
let [x, y] = global.get_pointer();
let actor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, x, y);
- if (Me.stateObj.someWindowListContains(actor))
+ if (extension.someWindowListContains(actor))
actor.sync_hover();
}
@@ -382,15 +377,7 @@ class BaseButton extends St.Button {
}
_onDestroy() {
- global.window_manager.disconnect(this._switchWorkspaceId);
-
- if (this._windowEnteredMonitorId)
- global.display.disconnect(this._windowEnteredMonitorId);
- this._windowEnteredMonitorId = 0;
-
- if (this._windowLeftMonitorId)
- global.display.disconnect(this._windowLeftMonitorId);
- this._windowLeftMonitorId = 0;
+ this._tooltip.destroy();
}
}
@@ -403,9 +390,11 @@ class WindowButton extends BaseButton {
super(perMonitor, monitorIndex);
this.metaWindow = metaWindow;
- this._skipTaskbarId = metaWindow.connect('notify::skip-taskbar', () => {
- this._updateVisibility();
- });
+ metaWindow.connectObject(
+ 'notify::skip-taskbar', () => this._updateVisibility(),
+ 'workspace-changed', () => this._updateVisibility(),
+ this);
+
this._updateVisibility();
this._windowTitle = new WindowTitle(this.metaWindow);
@@ -419,11 +408,8 @@ class WindowButton extends BaseButton {
this._contextMenuManager.addMenu(this._contextMenu);
Main.uiGroup.add_actor(this._contextMenu.actor);
- this._workspaceChangedId = this.metaWindow.connect(
- 'workspace-changed', this._updateVisibility.bind(this));
-
- this._notifyFocusId = global.display.connect(
- 'notify::focus-window', this._updateStyle.bind(this));
+ global.display.connectObject('notify::focus-window',
+ () => this._updateStyle(), this);
this._updateStyle();
}
@@ -467,9 +453,6 @@ class WindowButton extends BaseButton {
_onDestroy() {
super._onDestroy();
- this.metaWindow.disconnect(this._skipTaskbarId);
- this.metaWindow.disconnect(this._workspaceChangedId);
- global.display.disconnect(this._notifyFocusId);
this._contextMenu.destroy();
}
}
@@ -586,18 +569,17 @@ class AppButton extends BaseButton {
Main.uiGroup.add_actor(this._appContextMenu.actor);
this._textureCache = St.TextureCache.get_default();
- this._iconThemeChangedId =
- this._textureCache.connect('icon-theme-changed', () => {
- this._icon.child = app.create_icon_texture(ICON_TEXTURE_SIZE);
- });
+ this._textureCache.connectObject('icon-theme-changed', () => {
+ this._icon.child = app.create_icon_texture(ICON_TEXTURE_SIZE);
+ }, this);
- this._windowsChangedId = this.app.connect(
- 'windows-changed', this._windowsChanged.bind(this));
+ this.app.connectObject('windows-changed',
+ () => this._windowsChanged(), this);
this._windowsChanged();
this._windowTracker = Shell.WindowTracker.get_default();
- this._notifyFocusId = this._windowTracker.connect(
- 'notify::focus-app', this._updateStyle.bind(this));
+ this._windowTracker.connectObject('notify::focus-app',
+ () => this._updateStyle(), this);
this._updateStyle();
}
@@ -717,9 +699,6 @@ class AppButton extends BaseButton {
_onDestroy() {
super._onDestroy();
- this._textureCache.disconnect(this._iconThemeChangedId);
- this._windowTracker.disconnect(this._notifyFocusId);
- this.app.disconnect(this._windowsChangedId);
this._menu.destroy();
}
}
@@ -729,7 +708,7 @@ class WindowList extends St.Widget {
GObject.registerClass(this);
}
- constructor(perMonitor, monitor) {
+ constructor(perMonitor, monitor, settings) {
super({
name: 'panel',
style_class: 'bottom-panel solid',
@@ -776,12 +755,12 @@ class WindowList extends St.Widget {
indicatorsBox.add_child(this._workspaceIndicator.container);
this._mutterSettings = new Gio.Settings({schema_id: 'org.gnome.mutter'});
- this._workspacesOnlyOnPrimaryChangedId = this._mutterSettings.connect(
+ this._mutterSettings.connectObject(
'changed::workspaces-only-on-primary',
- this._updateWorkspaceIndicatorVisibility.bind(this));
- this._dynamicWorkspacesChangedId = this._mutterSettings.connect(
+ () => this._updateWorkspaceIndicatorVisibility(),
'changed::dynamic-workspaces',
- this._updateWorkspaceIndicatorVisibility.bind(this));
+ () => this._updateWorkspaceIndicatorVisibility(),
+ this);
this._updateWorkspaceIndicatorVisibility();
this._menuManager = new PopupMenu.PopupMenuManager(this);
@@ -799,59 +778,58 @@ class WindowList extends St.Widget {
this._updatePosition();
this._appSystem = Shell.AppSystem.get_default();
- this._appStateChangedId = this._appSystem.connect(
- 'app-state-changed', this._onAppStateChanged.bind(this));
+ this._appSystem.connectObject('app-state-changed',
+ this._onAppStateChanged.bind(this), this);
// Hack: OSK gesture is tied to visibility, piggy-back on that
- this._keyboardVisiblechangedId =
- Main.keyboard._bottomDragAction.connect('notify::enabled',
- action => {
- const visible = !action.enabled;
- if (visible) {
- Main.uiGroup.set_child_above_sibling(
- this, Main.layoutManager.keyboardBox);
- } else {
- Main.uiGroup.set_child_above_sibling(
- this, Main.layoutManager.panelBox);
- }
- this._updateKeyboardAnchor();
- });
+ Main.keyboard._bottomDragAction.connectObject('notify::enabled',
+ action => {
+ const visible = !action.enabled;
+ if (visible) {
+ Main.uiGroup.set_child_above_sibling(
+ this, Main.layoutManager.keyboardBox);
+ } else {
+ Main.uiGroup.set_child_above_sibling(
+ this, Main.layoutManager.panelBox);
+ }
+ this._updateKeyboardAnchor();
+ }, this);
let workspaceManager = global.workspace_manager;
- this._nWorkspacesChangedId = workspaceManager.connect(
- 'notify::n-workspaces', this._updateWorkspaceIndicatorVisibility.bind(this));
+ workspaceManager.connectObject('notify::n-workspaces',
+ () => this._updateWorkspaceIndicatorVisibility(), this);
this._updateWorkspaceIndicatorVisibility();
- this._switchWorkspaceId = global.window_manager.connect(
- 'switch-workspace', this._checkGrouping.bind(this));
+ global.window_manager.connectObject('switch-workspace',
+ () => this._checkGrouping(), this);
- this._overviewShowingId = Main.overview.connect('showing', () => {
- this.hide();
- this._updateKeyboardAnchor();
- });
-
- this._overviewHidingId = Main.overview.connect('hidden', () => {
- this.visible = !this._monitor.inFullscreen;
- this._updateKeyboardAnchor();
- });
-
- this._fullscreenChangedId =
- global.display.connect('in-fullscreen-changed', () => {
- // Work-around for initial change from unknown to !fullscreen
- if (Main.overview.visible)
- this.hide();
+ Main.overview.connectObject(
+ 'showing', () => {
+ this.hide();
this._updateKeyboardAnchor();
- });
+ },
+ 'hidden', () => {
+ this.visible = !this._monitor.inFullscreen;
+ this._updateKeyboardAnchor();
+ }, this);
+
+ global.display.connectObject('in-fullscreen-changed', () => {
+ // Work-around for initial change from unknown to !fullscreen
+ if (Main.overview.visible)
+ this.hide();
+ this._updateKeyboardAnchor();
+ }, this);
this._windowSignals = new Map();
this._windowCreatedId = global.display.connect(
'window-created', (dsp, win) => this._addWindow(win));
- this._dragBeginId = Main.xdndHandler.connect('drag-begin',
- this._monitorDrag.bind(this));
- this._dragEndId = Main.xdndHandler.connect('drag-end',
- this._stopMonitoringDrag.bind(this));
+ Main.xdndHandler.connectObject(
+ 'drag-begin', () => this._monitorDrag(),
+ 'drag-end', () => this._stopMonitoringDrag(),
+ this);
+
this._dragMonitor = {
dragMotion: this._onDragMotion.bind(this),
};
@@ -859,7 +837,7 @@ class WindowList extends St.Widget {
this._dndTimeoutId = 0;
this._dndWindow = null;
- this._settings = ExtensionUtils.getSettings();
+ this._settings = settings;
this._settings.connect('changed::grouping-mode',
() => this._groupingModeChanged());
this._grouped = undefined;
@@ -900,7 +878,8 @@ class WindowList extends St.Widget {
}
_updateWindowListVisibility() {
- let visible = !Main.windowPicker.visible;
+ const {windowPicker} = Extension.lookupByURL(import.meta.url);
+ const visible = !windowPicker.visible;
this._windowList.ease({
opacity: visible ? 255 : 0,
@@ -1098,37 +1077,14 @@ class WindowList extends St.Widget {
}
_onDestroy() {
- this._mutterSettings.disconnect(this._workspacesOnlyOnPrimaryChangedId);
- this._mutterSettings.disconnect(this._dynamicWorkspacesChangedId);
-
this._workspaceIndicator.destroy();
Main.ctrlAltTabManager.removeGroup(this);
- this._appSystem.disconnect(this._appStateChangedId);
- this._appStateChangedId = 0;
-
- Main.keyboard._bottomDragAction.disconnect(this._keyboardVisiblechangedId);
- this._keyboardVisiblechangedId = 0;
-
- global.workspace_manager.disconnect(this._nWorkspacesChangedId);
- this._nWorkspacesChangedId = 0;
-
- global.window_manager.disconnect(this._switchWorkspaceId);
- this._switchWorkspaceId = 0;
-
this._windowSignals.forEach((id, win) => win.disconnect(id));
this._windowSignals.clear();
- Main.overview.disconnect(this._overviewShowingId);
- Main.overview.disconnect(this._overviewHidingId);
-
- global.display.disconnect(this._fullscreenChangedId);
- global.display.disconnect(this._windowCreatedId);
-
this._stopMonitoringDrag();
- Main.xdndHandler.disconnect(this._dragBeginId);
- Main.xdndHandler.disconnect(this._dragEndId);
this._settings.run_dispose();
@@ -1138,9 +1094,9 @@ class WindowList extends St.Widget {
}
}
-class Extension {
- constructor() {
- ExtensionUtils.initTranslations();
+export default class WindowListExtension extends Extension {
+ constructor(metadata) {
+ super(metadata);
this._windowLists = null;
this._hideOverviewOrig = Main.overview.hide;
@@ -1149,17 +1105,17 @@ class Extension {
enable() {
this._windowLists = [];
- this._settings = ExtensionUtils.getSettings();
- this._showOnAllMonitorsChangedId = this._settings.connect(
- 'changed::show-on-all-monitors', this._buildWindowLists.bind(this));
+ this._settings = this.getSettings();
+ this._settings.connectObject('changed::show-on-all-monitors',
+ () => this._buildWindowLists(), this);
- this._monitorsChangedId = Main.layoutManager.connect(
- 'monitors-changed', this._buildWindowLists.bind(this));
+ Main.layoutManager.connectObject('monitors-changed',
+ () => this._buildWindowLists(), this);
- Main.windowPicker = new WindowPicker();
+ this.windowPicker = new WindowPicker();
Main.overview.hide = () => {
- Main.windowPicker.close();
+ this.windowPicker.close();
this._hideOverviewOrig.call(Main.overview);
};
@@ -1174,7 +1130,7 @@ class Extension {
Main.layoutManager.monitors.forEach(monitor => {
if (showOnAllMonitors || monitor === Main.layoutManager.primaryMonitor)
- this._windowLists.push(new WindowList(showOnAllMonitors, monitor));
+ this._windowLists.push(new WindowList(showOnAllMonitors, monitor, this.getSettings()));
});
}
@@ -1182,11 +1138,8 @@ class Extension {
if (!this._windowLists)
return;
- this._settings.disconnect(this._showOnAllMonitorsChangedId);
- this._showOnAllMonitorsChangedId = 0;
-
- Main.layoutManager.disconnect(this._monitorsChangedId);
- this._monitorsChangedId = 0;
+ this._settings.disconnectObject(this);
+ Main.layoutManager.disconnectObject(this);
this._windowLists.forEach(windowList => {
windowList.hide();
@@ -1194,8 +1147,8 @@ class Extension {
});
this._windowLists = null;
- Main.windowPicker.destroy();
- delete Main.windowPicker;
+ this.windowPicker.destroy();
+ delete this.windowPicker;
Main.overview.hide = this._hideOverviewOrig;
}
@@ -1205,9 +1158,66 @@ class Extension {
}
}
-/**
- * @returns {Extension} - the extension's state object
- */
-function init() {
- return new Extension();
+class Tooltip extends St.Label {
+ static {
+ GObject.registerClass(this);
+ }
+
+ constructor(widget, params) {
+ super(params);
+
+ this._widget = widget;
+
+ this._widget.connect('notify::hover', () => {
+ if (this._widget.hover)
+ this.open();
+ else
+ this.close();
+ });
+ }
+
+ open() {
+ const buttonTitleWidget = this._widget.label_actor;
+ const [, , preferredTitleWidth] = buttonTitleWidget.get_preferred_size();
+ const maxTitleWidth = buttonTitleWidget.allocation.get_width();
+ const isTitleFullyShown = preferredTitleWidth <= maxTitleWidth;
+
+ if (isTitleFullyShown)
+ return;
+
+ this.set({
+ text: this._widget.label_actor.get_text(),
+ visible: true,
+ opacity: 0,
+ });
+
+ const [stageX, stageY] = this._widget.get_transformed_position();
+ const thumbWidth = this._widget.allocation.get_width();
+ const tipWidth = this.width;
+ const tipHeight = this.height;
+ const xOffset = Math.floor((thumbWidth - tipWidth) / 2);
+ const monitor = Main.layoutManager.findMonitorForActor(this);
+ const x = Math.clamp(
+ stageX + xOffset,
+ monitor.x,
+ monitor.x + monitor.width - tipWidth);
+ const y = stageY - tipHeight - TOOLTIP_OFFSET;
+ this.set_position(x, y);
+
+ this.ease({
+ opacity: 255,
+ duration: TOOLTIP_ANIMATION_TIME,
+ mode: Clutter.AnimationMode.EASE_OUT_QUAD,
+ onComplete: () => (this.visible = this._widget.hover),
+ });
+ }
+
+ close() {
+ this.ease({
+ opacity: 0,
+ duration: TOOLTIP_ANIMATION_TIME,
+ mode: Clutter.AnimationMode.EASE_OUT_QUAD,
+ onComplete: () => (this.visible = this._widget.hover),
+ });
+ }
}
diff --git a/extensions/window-list/meson.build b/extensions/window-list/meson.build
index 599f45e1..43cf1193 100644
--- a/extensions/window-list/meson.build
+++ b/extensions/window-list/meson.build
@@ -3,11 +3,10 @@ extension_data += configure_file(
output: metadata_name,
configuration: metadata_conf
)
-extension_data += files('stylesheet.css')
+extension_data += files(
+ 'stylesheet-dark.css',
+ 'stylesheet-light.css'
+)
extension_sources += files('prefs.js', 'windowPicker.js', 'workspaceIndicator.js')
extension_schemas += files(metadata_conf.get('gschemaname') + '.gschema.xml')
-
-if classic_mode_enabled
- extension_data += files('classic.css')
-endif
diff --git a/extensions/window-list/prefs.js b/extensions/window-list/prefs.js
index 6ef097d1..2e33dfb0 100644
--- a/extensions/window-list/prefs.js
+++ b/extensions/window-list/prefs.js
@@ -1,29 +1,24 @@
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
-/* exported init buildPrefsWidget */
+import Adw from 'gi://Adw';
+import Gio from 'gi://Gio';
+import GLib from 'gi://GLib';
+import GObject from 'gi://GObject';
+import Gtk from 'gi://Gtk';
-const {Adw, Gio, GLib, GObject, Gtk} = imports.gi;
-
-const ExtensionUtils = imports.misc.extensionUtils;
-
-const _ = ExtensionUtils.gettext;
-
-/** */
-function init() {
- ExtensionUtils.initTranslations();
-}
+import {ExtensionPreferences, gettext as _} from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js';
class WindowListPrefsWidget extends Adw.PreferencesPage {
static {
GObject.registerClass(this);
}
- constructor() {
+ constructor(settings) {
super();
this._actionGroup = new Gio.SimpleActionGroup();
this.insert_action_group('window-list', this._actionGroup);
- this._settings = ExtensionUtils.getSettings();
+ this._settings = settings;
this._actionGroup.add_action(
this._settings.create_action('grouping-mode'));
this._actionGroup.add_action(
@@ -84,9 +79,8 @@ class WindowListPrefsWidget extends Adw.PreferencesPage {
}
}
-/**
- * @returns {Gtk.Widget} - the prefs widget
- */
-function buildPrefsWidget() {
- return new WindowListPrefsWidget();
+export default class WindowListPrefs extends ExtensionPreferences {
+ getPreferencesWidget() {
+ return new WindowListPrefsWidget(this.getSettings());
+ }
}
diff --git a/extensions/window-list/stylesheet-dark.css b/extensions/window-list/stylesheet-dark.css
new file mode 100644
index 00000000..8950c4ff
--- /dev/null
+++ b/extensions/window-list/stylesheet-dark.css
@@ -0,0 +1,113 @@
+.window-list {
+ spacing: 2px;
+ font-size: 10pt;
+}
+
+.bottom-panel {
+ background-color: #000000;
+ border-top-width: 0px;
+ padding: 2px;
+}
+
+.window-button {
+ padding: 2px, 1px;
+}
+
+.window-button:first-child:ltr {
+ padding-left: 2px;
+}
+
+.window-button:last-child:rtl {
+ padding-right: 2px;
+}
+
+.window-button-box {
+ spacing: 4px;
+}
+
+.window-button > StWidget,
+.window-picker-toggle > StWidget {
+ color: #bbb;
+ background-color: #1d1d1d;
+ border-radius: 4px;
+ padding: 3px 6px 1px;
+ transition: 100ms ease;
+}
+
+.window-button > StWidget {
+ -st-natural-width: 18.75em;
+ max-width: 18.75em;
+}
+
+.window-button:hover > StWidget,
+.window-picker-toggle:hover > StWidget {
+ color: #fff;
+ background-color: #303030;
+}
+
+.window-button:active > StWidget,
+.window-button:focus > StWidget {
+ color: #fff;
+ background-color: #3f3f3f;
+}
+
+.window-button.focused > StWidget,
+.window-picker-toggle:checked > StWidget {
+ color: #fff;
+ background-color: #3f3f3f;
+}
+
+.window-button.focused:active > StWidget,
+.window-picker-toggle:checked:active > StWidget {
+ color: #fff;
+ background-color: #3f3f3f;
+}
+
+.window-button.minimized > StWidget {
+ color: #666;
+ background-color: #161616;
+}
+
+.window-button.minimized:active > StWidget {
+ color: #666;
+ background-color: #161616;
+}
+
+.window-button-icon {
+ width: 24px;
+ height: 24px;
+}
+
+.window-list-workspace-indicator .status-label-bin {
+ background-color: rgba(200, 200, 200, 0.3);
+ padding: 0 3px;
+ margin: 3px;
+}
+
+.window-list-workspace-indicator .workspaces-box {
+ spacing: 3px;
+ padding: 3px;
+}
+
+.window-list-workspace-indicator .workspace {
+ width: 52px;
+ border-radius: 4px;
+ background-color: #1e1e1e;
+}
+
+.window-list-workspace-indicator .workspace.active {
+ background-color: #3f3f3f;
+}
+
+.window-list-window-preview {
+ background-color: #bebebe;
+ border-radius: 1px;
+}
+
+.window-list-window-preview.active {
+ background-color: #d4d4d4;
+}
+
+.notification {
+ font-weight: normal;
+}
diff --git a/extensions/window-list/classic.css b/extensions/window-list/stylesheet-light.css
similarity index 97%
rename from extensions/window-list/classic.css
rename to extensions/window-list/stylesheet-light.css
index 375a33e1..30843fc5 100644
--- a/extensions/window-list/classic.css
+++ b/extensions/window-list/stylesheet-light.css
@@ -1,4 +1,4 @@
-@import url("stylesheet.css");
+@import url("stylesheet-dark.css");
#panel.bottom-panel {
border-top-width: 1px;
diff --git a/extensions/window-list/stylesheet.css b/extensions/window-list/stylesheet.css
deleted file mode 100644
index 87813a42..00000000
--- a/extensions/window-list/stylesheet.css
+++ /dev/null
@@ -1,115 +0,0 @@
-.window-list {
- spacing: 2px;
- font-size: 10pt;
-}
-
-.window-button {
- padding: 1px;
-}
-
-.window-button:first-child:ltr {
- padding-left: 2px;
-}
-
-.window-button:last-child:rtl {
- padding-right: 2px;
-}
-
-.window-button-box {
- spacing: 4px;
-}
-
-.window-button > StWidget,
-.window-picker-toggle > StWidget {
- color: #bbb;
- background-color: black;
- border-radius: 2px;
- padding: 3px 6px 1px;
- box-shadow: inset 1px 1px 4px rgba(255,255,255,0.5);
- text-shadow: 1px 1px 4px rgba(0,0,0,0.8);
-}
-
-.window-picker-toggle {
- padding: 3px;
-}
-
-.window-picker-toggle > StWidet {
- border: 1px solid rgba(255,255,255,0.3);
-}
-
-.window-button > StWidget {
- -st-natural-width: 18.75em;
- max-width: 18.75em;
-}
-
-.window-button:hover > StWidget,
-.window-picker-toggle:hover > StWidget {
- color: white;
- background-color: #1f1f1f;
-}
-
-.window-button:active > StWidget,
-.window-button:focus > StWidget {
- box-shadow: inset 2px 2px 4px rgba(255,255,255,0.5);
-}
-
-.window-button.focused > StWidget,
-.window-picker-toggle:checked > StWidget {
- color: white;
- box-shadow: inset 1px 1px 4px rgba(255,255,255,0.7);
-}
-
-.window-button.focused:active > StWidget,
-.window-picker-toggle:checked:active > StWidget {
- box-shadow: inset 2px 2px 4px rgba(255,255,255,0.7);
-}
-
-.window-button.minimized > StWidget {
- color: #666;
- box-shadow: inset -1px -1px 4px rgba(255,255,255,0.5);
-}
-
-.window-button.minimized:active > StWidget {
- box-shadow: inset -2px -2px 4px rgba(255,255,255,0.5);
-}
-
-.window-button-icon {
- width: 24px;
- height: 24px;
-}
-
-.window-list-workspace-indicator .status-label-bin {
- background-color: rgba(200, 200, 200, .3);
- border: 1px solid #cccccc;
- padding: 0 3px;
- margin: 3px;
-}
-
-.window-list-workspace-indicator .workspaces-box {
- spacing: 3px;
- padding: 3px;
-}
-
-.window-list-workspace-indicator .workspace {
- border: 2px solid #000;
- width: 52px;
- border-radius: 4px;
- background-color: #595959;
-}
-
-.window-list-workspace-indicator .workspace.active {
- border-color: #fff;
-}
-
-.window-list-window-preview {
- background-color: #bebebe;
- border: 1px solid #828282;
-}
-
-.window-list-window-preview.active {
- background-color: #d4d4d4;
-}
-
-.notification {
- font-weight: normal;
-}
diff --git a/extensions/window-list/windowPicker.js b/extensions/window-list/windowPicker.js
index 8da04cdf..6cafba61 100644
--- a/extensions/window-list/windowPicker.js
+++ b/extensions/window-list/windowPicker.js
@@ -1,17 +1,20 @@
-/* exported WindowPicker, WindowPickerToggle */
-const {Clutter, GObject, Shell, St} = imports.gi;
+import Clutter from 'gi://Clutter';
+import GObject from 'gi://GObject';
+import Shell from 'gi://Shell';
+import St from 'gi://St';
-const Layout = imports.ui.layout;
-const Main = imports.ui.main;
-const {WorkspacesDisplay} = imports.ui.workspacesView;
-const Workspace = imports.ui.workspace;
+import {Extension, InjectionManager} from 'resource:///org/gnome/shell/extensions/extension.js';
+import * as Layout from 'resource:///org/gnome/shell/ui/layout.js';
+import * as Main from 'resource:///org/gnome/shell/ui/main.js';
+import {WorkspacesDisplay} from 'resource:///org/gnome/shell/ui/workspacesView.js';
+import * as Workspace from 'resource:///org/gnome/shell/ui/workspace.js';
-const {VIGNETTE_BRIGHTNESS} = imports.ui.lightbox;
-const {
+import {VIGNETTE_BRIGHTNESS} from 'resource:///org/gnome/shell/ui/lightbox.js';
+import {
SIDE_CONTROLS_ANIMATION_TIME,
OverviewAdjustment,
- ControlsState,
-} = imports.ui.overviewControls;
+ ControlsState
+} from 'resource:///org/gnome/shell/ui/overviewControls.js';
class MyWorkspacesDisplay extends WorkspacesDisplay {
static {
@@ -32,12 +35,13 @@ class MyWorkspacesDisplay extends WorkspacesDisplay {
super(controls, workspaceAdjustment, overviewAdjustment);
+ this._windowPicker = controls;
+
this._workspaceAdjustment = workspaceAdjustment;
this._workspaceAdjustment.actor = this;
- this._nWorkspacesChangedId =
- workspaceManager.connect('notify::n-workspaces',
- this._updateAdjustment.bind(this));
+ workspaceManager.connectObject('notify::n-workspaces',
+ () => this._updateAdjustment(), this);
this.add_constraint(
new Layout.MonitorConstraint({
@@ -48,7 +52,7 @@ class MyWorkspacesDisplay extends WorkspacesDisplay {
prepareToEnterOverview(...args) {
if (!this._scrollEventId) {
- this._scrollEventId = Main.windowPicker.connect('scroll-event',
+ this._scrollEventId = this._windowPicker.connect('scroll-event',
this._onScrollEvent.bind(this));
}
@@ -57,7 +61,7 @@ class MyWorkspacesDisplay extends WorkspacesDisplay {
vfunc_hide(...args) {
if (this._scrollEventId > 0)
- Main.windowPicker.disconnect(this._scrollEventId);
+ this._windowPicker.disconnect(this._scrollEventId);
this._scrollEventId = 0;
super.vfunc_hide(...args);
@@ -70,86 +74,9 @@ class MyWorkspacesDisplay extends WorkspacesDisplay {
value: workspaceManager.get_active_workspace_index(),
});
}
-
- _onDestroy() {
- if (this._nWorkspacesChangedId)
- global.workspace_manager.disconnect(this._nWorkspacesChangedId);
- this._nWorkspacesChangedId = 0;
-
- super._onDestroy();
- }
}
-class MyWorkspace extends Workspace.Workspace {
- static {
- GObject.registerClass(this);
- }
-
- constructor(...args) {
- super(...args);
-
- this._adjChangedId =
- this._overviewAdjustment.connect('notify::value', () => {
- const {value: progress} = this._overviewAdjustment;
- const brightness = 1 - (1 - VIGNETTE_BRIGHTNESS) * progress;
- for (const bg of this._background?._backgroundGroup ?? []) {
- bg.content.set({
- vignette: true,
- brightness,
- });
- }
- });
- }
-
- _onDestroy() {
- super._onDestroy();
-
- if (this._adjChangedId)
- this._overviewAdjustment.disconnect(this._adjChangedId);
- this._adjChangedId = 0;
- }
-}
-
-class MyWorkspaceBackground extends Workspace.WorkspaceBackground {
- static {
- GObject.registerClass(this);
- }
-
- _updateBorderRadius() {
- }
-
- vfunc_allocate(box) {
- this.set_allocation(box);
-
- const themeNode = this.get_theme_node();
- const contentBox = themeNode.get_content_box(box);
-
- this._bin.allocate(contentBox);
-
- const [contentWidth, contentHeight] = contentBox.get_size();
- const monitor = Main.layoutManager.monitors[this._monitorIndex];
- const xRatio = contentWidth / this._workarea.width;
- const yRatio = contentHeight / this._workarea.height;
-
- const right = area => area.x + area.width;
- const bottom = area => area.y + area.height;
-
- const offsets = {
- left: xRatio * (this._workarea.x - monitor.x),
- right: xRatio * (right(monitor) - right(this._workarea)),
- top: yRatio * (this._workarea.y - monitor.y),
- bottom: yRatio * (bottom(monitor) - bottom(this._workarea)),
- };
-
- contentBox.set_origin(-offsets.left, -offsets.top);
- contentBox.set_size(
- offsets.left + contentWidth + offsets.right,
- offsets.top + contentHeight + offsets.bottom);
- this._backgroundGroup.allocate(contentBox);
- }
-}
-
-var WindowPicker = class WindowPicker extends Clutter.Actor {
+export class WindowPicker extends Clutter.Actor {
static [GObject.signals] = {
'open-state-changed': {param_types: [GObject.TYPE_BOOLEAN]},
};
@@ -164,11 +91,11 @@ var WindowPicker = class WindowPicker extends Clutter.Actor {
this._visible = false;
this._modal = false;
- this._overlayKeyId = 0;
this._stageKeyPressId = 0;
this._adjustment = new OverviewAdjustment(this);
+ this._injectionManager = new InjectionManager();
this.connect('destroy', this._onDestroy.bind(this));
global.bind_property('screen-width',
@@ -186,21 +113,78 @@ var WindowPicker = class WindowPicker extends Clutter.Actor {
if (!Main.sessionMode.hasOverview) {
this._injectBackgroundShade();
- this._overlayKeyId = global.display.connect('overlay-key', () => {
+ global.display.connectObject('overlay-key', () => {
if (!this._visible)
this.open();
else
this.close();
- });
+ }, this);
}
}
_injectBackgroundShade() {
- this._origWorkspace = Workspace.Workspace;
- this._origWorkspaceBackground = Workspace.WorkspaceBackground;
+ const backgroundProto = Workspace.WorkspaceBackground.prototype;
+ this._injectionManager.overrideMethod(backgroundProto, '_updateBorderRadius',
+ () => {
+ return function () {};
+ });
+ this._injectionManager.overrideMethod(backgroundProto, 'vfunc_allocate',
+ () => {
+ /* eslint-disable no-invalid-this */
+ return function (box) {
+ this.set_allocation(box);
- Workspace.Workspace = MyWorkspace;
- Workspace.WorkspaceBackground = MyWorkspaceBackground;
+ const themeNode = this.get_theme_node();
+ const contentBox = themeNode.get_content_box(box);
+
+ this._bin.allocate(contentBox);
+
+ const [contentWidth, contentHeight] = contentBox.get_size();
+ const monitor = Main.layoutManager.monitors[this._monitorIndex];
+ const xRatio = contentWidth / this._workarea.width;
+ const yRatio = contentHeight / this._workarea.height;
+
+ const right = area => area.x + area.width;
+ const bottom = area => area.y + area.height;
+
+ const offsets = {
+ left: xRatio * (this._workarea.x - monitor.x),
+ right: xRatio * (right(monitor) - right(this._workarea)),
+ top: yRatio * (this._workarea.y - monitor.y),
+ bottom: yRatio * (bottom(monitor) - bottom(this._workarea)),
+ };
+
+ contentBox.set_origin(-offsets.left, -offsets.top);
+ contentBox.set_size(
+ offsets.left + contentWidth + offsets.right,
+ offsets.top + contentHeight + offsets.bottom);
+ this._backgroundGroup.allocate(contentBox);
+ };
+ /* eslint-enable */
+ });
+ this._injectionManager.overrideMethod(backgroundProto, 'vfunc_parent_set',
+ () => {
+ /* eslint-disable no-invalid-this */
+ return function () {
+ setTimeout(() => {
+ const parent = this.get_parent();
+ if (!parent)
+ return;
+
+ parent._overviewAdjustment.connectObject('notify::value', () => {
+ const {value: progress} = parent._overviewAdjustment;
+ const brightness = 1 - (1 - VIGNETTE_BRIGHTNESS) * progress;
+ for (const bg of this._backgroundGroup ?? []) {
+ bg.content.set({
+ vignette: true,
+ brightness,
+ });
+ }
+ }, this);
+ });
+ };
+ /* eslint-enable */
+ });
}
get visible() {
@@ -306,27 +290,15 @@ var WindowPicker = class WindowPicker extends Clutter.Actor {
}
_onDestroy() {
- if (this._origWorkspace)
- Workspace.Workspace = this._origWorkspace;
-
- if (this._origWorkspaceBackground)
- Workspace.WorkspaceBackground = this._origWorkspaceBackground;
-
- if (this._monitorsChangedId)
- Main.layoutManager.disconnect(this._monitorsChangedId);
- this._monitorsChangedId = 0;
-
- if (this._overlayKeyId)
- global.display.disconnect(this._overlayKeyId);
- this._overlayKeyId = 0;
+ this._injectionManager.clear();
if (this._stageKeyPressId)
global.stage.disconnect(this._stageKeyPressId);
this._stageKeyPressId = 0;
}
-};
+}
-var WindowPickerToggle = class WindowPickerToggle extends St.Button {
+export class WindowPickerToggle extends St.Button {
static {
GObject.registerClass(this);
}
@@ -350,15 +322,16 @@ var WindowPickerToggle = class WindowPickerToggle extends St.Button {
toggle_mode: true,
});
+ const {windowPicker} = Extension.lookupByURL(import.meta.url);
this.connect('notify::checked', () => {
if (this.checked)
- Main.windowPicker.open();
+ windowPicker.open();
else
- Main.windowPicker.close();
+ windowPicker.close();
});
- Main.windowPicker.connect('open-state-changed', () => {
- this.checked = Main.windowPicker.visible;
+ windowPicker.connect('open-state-changed', () => {
+ this.checked = windowPicker.visible;
});
}
-};
+}
diff --git a/extensions/window-list/workspaceIndicator.js b/extensions/window-list/workspaceIndicator.js
index 7fe7c07d..aa2548d7 100644
--- a/extensions/window-list/workspaceIndicator.js
+++ b/extensions/window-list/workspaceIndicator.js
@@ -1,13 +1,15 @@
-/* exported WorkspaceIndicator */
-const {Clutter, Gio, GObject, Meta, St} = imports.gi;
+import Clutter from 'gi://Clutter';
+import Gio from 'gi://Gio';
+import GObject from 'gi://GObject';
+import Meta from 'gi://Meta';
+import St from 'gi://St';
-const DND = imports.ui.dnd;
-const ExtensionUtils = imports.misc.extensionUtils;
-const Main = imports.ui.main;
-const PanelMenu = imports.ui.panelMenu;
-const PopupMenu = imports.ui.popupMenu;
+import {gettext as _} from 'resource:///org/gnome/shell/extensions/extension.js';
-const _ = ExtensionUtils.gettext;
+import * as DND from 'resource:///org/gnome/shell/ui/dnd.js';
+import * as Main from 'resource:///org/gnome/shell/ui/main.js';
+import * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js';
+import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js';
const TOOLTIP_OFFSET = 6;
const TOOLTIP_ANIMATION_TIME = 150;
@@ -29,20 +31,17 @@ class WindowPreview extends St.Button {
this._window = window;
- this.connect('destroy', this._onDestroy.bind(this));
-
- this._sizeChangedId = this._window.connect('size-changed',
- () => this.queue_relayout());
- this._positionChangedId = this._window.connect('position-changed',
- () => {
+ this._window.connectObject(
+ 'size-changed', () => this.queue_relayout(),
+ 'position-changed', () => {
this._updateVisible();
this.queue_relayout();
- });
- this._minimizedChangedId = this._window.connect('notify::minimized',
- this._updateVisible.bind(this));
+ },
+ 'notify::minimized', this._updateVisible.bind(this),
+ this);
- this._focusChangedId = global.display.connect('notify::focus-window',
- this._onFocusChanged.bind(this));
+ global.display.connectObject('notify::focus-window',
+ this._onFocusChanged.bind(this), this);
this._onFocusChanged();
}
@@ -51,13 +50,6 @@ class WindowPreview extends St.Button {
return this._window;
}
- _onDestroy() {
- this._window.disconnect(this._sizeChangedId);
- this._window.disconnect(this._positionChangedId);
- this._window.disconnect(this._minimizedChangedId);
- global.display.disconnect(this._focusChangedId);
- }
-
_onFocusChanged() {
if (global.display.focus_window === this._window)
this.add_style_class_name('active');
@@ -138,16 +130,13 @@ class WorkspaceThumbnail extends St.Button {
let workspaceManager = global.workspace_manager;
this._workspace = workspaceManager.get_workspace_by_index(index);
- this._windowAddedId = this._workspace.connect('window-added',
- (ws, window) => {
- this._addWindow(window);
- });
- this._windowRemovedId = this._workspace.connect('window-removed',
- (ws, window) => {
- this._removeWindow(window);
- });
- this._restackedId = global.display.connect('restacked',
- this._onRestacked.bind(this));
+ this._workspace.connectObject(
+ 'window-added', (ws, window) => this._addWindow(window),
+ 'window-removed', (ws, window) => this._removeWindow(window),
+ this);
+
+ global.display.connectObject('restacked',
+ this._onRestacked.bind(this), this);
this._workspace.list_windows().forEach(w => this._addWindow(w));
this._onRestacked();
@@ -245,14 +234,10 @@ class WorkspaceThumbnail extends St.Button {
_onDestroy() {
this._tooltip.destroy();
-
- this._workspace.disconnect(this._windowAddedId);
- this._workspace.disconnect(this._windowRemovedId);
- global.display.disconnect(this._restackedId);
}
}
-var WorkspaceIndicator = class WorkspaceIndicator extends PanelMenu.Button {
+export class WorkspaceIndicator extends PanelMenu.Button {
static {
GObject.registerClass(this);
}
@@ -295,14 +280,11 @@ var WorkspaceIndicator = class WorkspaceIndicator extends PanelMenu.Button {
this._workspacesItems = [];
- this._workspaceManagerSignals = [
- workspaceManager.connect('notify::n-workspaces',
- this._nWorkspacesChanged.bind(this)),
- workspaceManager.connect_after('workspace-switched',
- this._onWorkspaceSwitched.bind(this)),
- workspaceManager.connect('notify::layout-rows',
- this._updateThumbnailVisibility.bind(this)),
- ];
+ workspaceManager.connectObject(
+ 'notify::n-workspaces', this._nWorkspacesChanged.bind(this), GObject.ConnectFlags.AFTER,
+ 'workspace-switched', this._onWorkspaceSwitched.bind(this), GObject.ConnectFlags.AFTER,
+ 'notify::layout-rows', this._updateThumbnailVisibility.bind(this),
+ this);
this.connect('scroll-event', this._onScrollEvent.bind(this));
this._updateMenu();
@@ -310,20 +292,8 @@ var WorkspaceIndicator = class WorkspaceIndicator extends PanelMenu.Button {
this._updateThumbnailVisibility();
this._settings = new Gio.Settings({schema_id: 'org.gnome.desktop.wm.preferences'});
- this._settingsChangedId = this._settings.connect(
- 'changed::workspace-names', this._updateMenuLabels.bind(this));
- }
-
- _onDestroy() {
- for (let i = 0; i < this._workspaceManagerSignals.length; i++)
- global.workspace_manager.disconnect(this._workspaceManagerSignals[i]);
-
- if (this._settingsChangedId) {
- this._settings.disconnect(this._settingsChangedId);
- this._settingsChangedId = 0;
- }
-
- super._onDestroy();
+ this._settings.connectObject('changed::workspace-names',
+ () => this._updateMenuLabels(), this);
}
_updateThumbnailVisibility() {
@@ -447,4 +417,4 @@ var WorkspaceIndicator = class WorkspaceIndicator extends PanelMenu.Button {
let newIndex = this._currentWorkspace + diff;
this._activate(newIndex);
}
-};
+}
diff --git a/extensions/windowsNavigator/extension.js b/extensions/windowsNavigator/extension.js
index 4f55a335..e089df22 100644
--- a/extensions/windowsNavigator/extension.js
+++ b/extensions/windowsNavigator/extension.js
@@ -1,276 +1,290 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
-/* exported init */
-const {Clutter, Graphene, GObject, St} = imports.gi;
+import Clutter from 'gi://Clutter';
+import Graphene from 'gi://Graphene';
+import St from 'gi://St';
-const Main = imports.ui.main;
-const OverviewControls = imports.ui.overviewControls;
-const Workspace = imports.ui.workspace;
-const WorkspacesView = imports.ui.workspacesView;
+import * as Main from 'resource:///org/gnome/shell/ui/main.js';
+import * as OverviewControls from 'resource:///org/gnome/shell/ui/overviewControls.js';
+import {InjectionManager} from 'resource:///org/gnome/shell/extensions/extension.js';
+import {WindowPreview} from 'resource:///org/gnome/shell/ui/windowPreview.js';
+import {Workspace} from 'resource:///org/gnome/shell/ui/workspace.js';
+import {WorkspacesView} from 'resource:///org/gnome/shell/ui/workspacesView.js';
const WINDOW_SLOT = 4;
-class MyWorkspace extends Workspace.Workspace {
- static {
- GObject.registerClass(this);
- }
-
- constructor(...args) {
- super(...args);
-
- if (this.metaWorkspace && this.metaWorkspace.index() < 9) {
- this._tip = new St.Label({
- style_class: 'extension-windowsNavigator-window-tooltip',
- visible: false,
- });
- this.add_actor(this._tip);
-
- this.connect('notify::scale-x', () => {
- this._tip.set_scale(1 / this.scale_x, 1 / this.scale_x);
- });
- } else {
- this._tip = null;
- }
- }
-
- vfunc_allocate(box) {
- super.vfunc_allocate(box);
-
- if (this._tip)
- this._tip.allocate_preferred_size(0, 0);
- }
-
- showTooltip() {
- if (!this._tip)
- return;
- this._tip.text = (this.metaWorkspace.index() + 1).toString();
- this._tip.show();
- this.set_child_below_sibling(this._tip, null);
- }
-
- hideTooltip() {
- if (this._tip)
- this._tip.hide();
- }
-
- getWindowWithTooltip(id) {
- const {layoutManager} = this._container;
- const slot = layoutManager._windowSlots[id - 1];
- return slot ? slot[WINDOW_SLOT].metaWindow : null;
- }
-
- showWindowsTooltips() {
- const {layoutManager} = this._container;
- for (let i = 0; i < layoutManager._windowSlots.length; i++) {
- if (layoutManager._windowSlots[i])
- layoutManager._windowSlots[i][WINDOW_SLOT].showTooltip(`${i + 1}`);
- }
- }
-
- hideWindowsTooltips() {
- const {layoutManager} = this._container;
- for (let i in layoutManager._windowSlots) {
- if (layoutManager._windowSlots[i])
- layoutManager._windowSlots[i][WINDOW_SLOT].hideTooltip();
- }
- }
-
- // overriding _addWindowClone to apply the tooltip patch on the cloned
- // windowPreview
- _addWindowClone(metaWindow) {
- const clone = super._addWindowClone(metaWindow);
-
- // appling the tooltip patch
- (function patchPreview() {
- this._text = new St.Label({
- style_class: 'extension-windowsNavigator-window-tooltip',
- visible: false,
- });
-
- this._text.add_constraint(new Clutter.BindConstraint({
- source: this.windowContainer,
- coordinate: Clutter.BindCoordinate.POSITION,
- }));
- this._text.add_constraint(new Clutter.AlignConstraint({
- source: this.windowContainer,
- align_axis: Clutter.AlignAxis.X_AXIS,
- pivot_point: new Graphene.Point({x: 0.5, y: -1}),
- factor: this._closeButtonSide === St.Side.LEFT ? 1 : 0,
- }));
- this._text.add_constraint(new Clutter.AlignConstraint({
- source: this.windowContainer,
- align_axis: Clutter.AlignAxis.Y_AXIS,
- pivot_point: new Graphene.Point({x: -1, y: 0.5}),
- factor: 0,
- }));
-
- this.add_child(this._text);
- }).call(clone);
-
- clone.showTooltip = function (text) {
- this._text.set({text});
- this._text.show();
- };
-
- clone.hideTooltip = function () {
- if (this._text && this._text.visible)
- this._text.hide();
- };
-
- return clone;
- }
-}
-
-class MyWorkspacesView extends WorkspacesView.WorkspacesView {
- static {
- GObject.registerClass(this);
- }
-
- constructor(...args) {
- super(...args);
-
- this._pickWorkspace = false;
- this._pickWindow = false;
- this._keyPressEventId =
- global.stage.connect('key-press-event', this._onKeyPress.bind(this));
- this._keyReleaseEventId =
- global.stage.connect('key-release-event', this._onKeyRelease.bind(this));
- }
-
- _onDestroy() {
- super._onDestroy();
-
- global.stage.disconnect(this._keyPressEventId);
- global.stage.disconnect(this._keyReleaseEventId);
- }
-
- _hideTooltips() {
- if (global.stage.get_key_focus() === global.stage)
- global.stage.set_key_focus(this._prevFocusActor);
- this._pickWindow = false;
- for (let i = 0; i < this._workspaces.length; i++)
- this._workspaces[i].hideWindowsTooltips();
- }
-
- _hideWorkspacesTooltips() {
- global.stage.set_key_focus(this._prevFocusActor);
- this._pickWorkspace = false;
- for (let i = 0; i < this._workspaces.length; i++)
- this._workspaces[i].hideTooltip();
- }
-
- _onKeyRelease(s, o) {
- if (this._pickWindow &&
- (o.get_key_symbol() === Clutter.KEY_Alt_L ||
- o.get_key_symbol() === Clutter.KEY_Alt_R))
- this._hideTooltips();
- if (this._pickWorkspace &&
- (o.get_key_symbol() === Clutter.KEY_Control_L ||
- o.get_key_symbol() === Clutter.KEY_Control_R))
- this._hideWorkspacesTooltips();
- }
-
- _onKeyPress(s, o) {
- const {ControlsState} = OverviewControls;
- if (this._overviewAdjustment.value !== ControlsState.WINDOW_PICKER)
- return false;
-
- let workspaceManager = global.workspace_manager;
-
- if ((o.get_key_symbol() === Clutter.KEY_Alt_L ||
- o.get_key_symbol() === Clutter.KEY_Alt_R) &&
- !this._pickWorkspace) {
- this._prevFocusActor = global.stage.get_key_focus();
- global.stage.set_key_focus(null);
- this._active = workspaceManager.get_active_workspace_index();
- this._pickWindow = true;
- this._workspaces[workspaceManager.get_active_workspace_index()].showWindowsTooltips();
- return true;
- }
- if ((o.get_key_symbol() === Clutter.KEY_Control_L ||
- o.get_key_symbol() === Clutter.KEY_Control_R) &&
- !this._pickWindow) {
- this._prevFocusActor = global.stage.get_key_focus();
- global.stage.set_key_focus(null);
- this._pickWorkspace = true;
- for (let i = 0; i < this._workspaces.length; i++)
- this._workspaces[i].showTooltip();
- return true;
- }
-
- if (global.stage.get_key_focus() !== global.stage)
- return false;
-
- // ignore shift presses, they're required to get numerals in azerty keyboards
- if ((this._pickWindow || this._pickWorkspace) &&
- (o.get_key_symbol() === Clutter.KEY_Shift_L ||
- o.get_key_symbol() === Clutter.KEY_Shift_R))
- return true;
-
- if (this._pickWindow) {
- if (this._active !== workspaceManager.get_active_workspace_index()) {
- this._hideTooltips();
- return false;
- }
-
- let c = o.get_key_symbol() - Clutter.KEY_KP_0;
- if (c > 9 || c <= 0) {
- c = o.get_key_symbol() - Clutter.KEY_0;
- if (c > 9 || c <= 0) {
- this._hideTooltips();
- global.log(c);
- return false;
- }
- }
-
- let win = this._workspaces[this._active].getWindowWithTooltip(c);
- this._hideTooltips();
-
- if (win)
- Main.activateWindow(win, global.get_current_time());
-
- return true;
- }
- if (this._pickWorkspace) {
- let c = o.get_key_symbol() - Clutter.KEY_KP_0;
- if (c > 9 || c <= 0) {
- c = o.get_key_symbol() - Clutter.KEY_0;
- if (c > 9 || c <= 0) {
- this._hideWorkspacesTooltips();
- return false;
- }
- }
-
- let workspace = this._workspaces[c - 1];
- if (workspace !== undefined)
- workspace.metaWorkspace.activate(global.get_current_time());
-
- this._hideWorkspacesTooltips();
- return true;
- }
- return false;
- }
-}
-
-class Extension {
+export default class Extension {
constructor() {
- this._origWorkspace = Workspace.Workspace;
- this._origWorkspacesView = WorkspacesView.WorkspacesView;
+ this._injectionManager = new InjectionManager();
}
enable() {
- Workspace.Workspace = MyWorkspace;
- WorkspacesView.WorkspacesView = MyWorkspacesView;
+ const previewProto = WindowPreview.prototype;
+
+ this._injectionManager.overrideMethod(previewProto, '_init', originalMethod => {
+ /* eslint-disable no-invalid-this */
+ return function (...args) {
+ originalMethod.call(this, ...args);
+
+ this._text = new St.Label({
+ style_class: 'extension-windowsNavigator-window-tooltip',
+ visible: false,
+ });
+
+ this._text.add_constraint(new Clutter.BindConstraint({
+ source: this.windowContainer,
+ coordinate: Clutter.BindCoordinate.POSITION,
+ }));
+ this._text.add_constraint(new Clutter.AlignConstraint({
+ source: this.windowContainer,
+ align_axis: Clutter.AlignAxis.X_AXIS,
+ pivot_point: new Graphene.Point({x: 0.5, y: -1}),
+ factor: this._closeButtonSide === St.Side.LEFT ? 1 : 0,
+ }));
+ this._text.add_constraint(new Clutter.AlignConstraint({
+ source: this.windowContainer,
+ align_axis: Clutter.AlignAxis.Y_AXIS,
+ pivot_point: new Graphene.Point({x: -1, y: 0.5}),
+ factor: 0,
+ }));
+
+ this.add_child(this._text);
+ };
+ /* eslint-enable */
+ });
+ this._injectionManager.overrideMethod(previewProto, 'showTooltip', () => {
+ /* eslint-disable no-invalid-this */
+ return function (text) {
+ this._text.set({text});
+ this._text.show();
+ };
+ /* eslint-enable */
+ });
+ this._injectionManager.overrideMethod(previewProto, 'hideTooltip', () => {
+ /* eslint-disable no-invalid-this */
+ return function () {
+ this._text?.hide();
+ };
+ /* eslint-enable */
+ });
+
+ const workspaceProto = Workspace.prototype;
+ this._injectionManager.overrideMethod(workspaceProto, '_init', originalMethod => {
+ /* eslint-disable no-invalid-this */
+ return function (...args) {
+ originalMethod.call(this, ...args);
+
+ if (this.metaWorkspace && this.metaWorkspace.index() < 9) {
+ this._tip = new St.Label({
+ style_class: 'extension-windowsNavigator-window-tooltip',
+ visible: false,
+ });
+ this.add_actor(this._tip);
+
+ this.connect('notify::scale-x', () => {
+ this._tip.set_scale(1 / this.scale_x, 1 / this.scale_x);
+ });
+ } else {
+ this._tip = null;
+ }
+ };
+ /* eslint-enable */
+ });
+ this._injectionManager.overrideMethod(workspaceProto, 'vfunc_allocate', originalMethod => {
+ /* eslint-disable no-invalid-this */
+ return function (box) {
+ originalMethod.call(this, box);
+
+ this._tip?.allocate_preferred_size(0, 0);
+ };
+ /* eslint-enable */
+ });
+ this._injectionManager.overrideMethod(workspaceProto, 'showTooltip', () => {
+ /* eslint-disable no-invalid-this */
+ return function () {
+ if (!this._tip)
+ return;
+ this._tip.text = (this.metaWorkspace.index() + 1).toString();
+ this._tip.show();
+ this.set_child_below_sibling(this._tip, null);
+ };
+ /* eslint-enable */
+ });
+ this._injectionManager.overrideMethod(workspaceProto, 'hideTooltip', () => {
+ /* eslint-disable no-invalid-this */
+ return function () {
+ this._tip?.hide();
+ };
+ /* eslint-enable */
+ });
+ this._injectionManager.overrideMethod(workspaceProto, 'getWindowWithTooltip', () => {
+ /* eslint-disable no-invalid-this */
+ return function (id) {
+ const {layoutManager} = this._container;
+ const slot = layoutManager._windowSlots[id - 1];
+ return slot ? slot[WINDOW_SLOT].metaWindow : null;
+ };
+ /* eslint-enable */
+ });
+ this._injectionManager.overrideMethod(workspaceProto, 'showWindowsTooltips', () => {
+ /* eslint-disable no-invalid-this */
+ return function () {
+ const {layoutManager} = this._container;
+ for (let i = 0; i < layoutManager._windowSlots.length; i++) {
+ if (layoutManager._windowSlots[i])
+ layoutManager._windowSlots[i][WINDOW_SLOT].showTooltip(`${i + 1}`);
+ }
+ };
+ /* eslint-enable */
+ });
+ this._injectionManager.overrideMethod(workspaceProto, 'hideWindowsTooltips', () => {
+ /* eslint-disable no-invalid-this */
+ return function () {
+ const {layoutManager} = this._container;
+ for (let i in layoutManager._windowSlots) {
+ if (layoutManager._windowSlots[i])
+ layoutManager._windowSlots[i][WINDOW_SLOT].hideTooltip();
+ }
+ };
+ /* eslint-enable */
+ });
+
+ const viewProto = WorkspacesView.prototype;
+ this._injectionManager.overrideMethod(viewProto, '_init', originalMethod => {
+ /* eslint-disable no-invalid-this */
+ return function (...args) {
+ originalMethod.call(this, ...args);
+
+ this._pickWorkspace = false;
+ this._pickWindow = false;
+ global.stage.connectObject(
+ 'key-press-event', this._onKeyPress.bind(this),
+ 'key-release-event', this._onKeyRelease.bind(this),
+ this);
+ };
+ /* eslint-enable */
+ });
+ this._injectionManager.overrideMethod(viewProto, '_hideTooltips', () => {
+ /* eslint-disable no-invalid-this */
+ return function () {
+ if (global.stage.get_key_focus() === global.stage)
+ global.stage.set_key_focus(this._prevFocusActor);
+ this._pickWindow = false;
+ for (let i = 0; i < this._workspaces.length; i++)
+ this._workspaces[i].hideWindowsTooltips();
+ };
+ /* eslint-enable */
+ });
+ this._injectionManager.overrideMethod(viewProto, '_hideWorkspacesTooltips', () => {
+ /* eslint-disable no-invalid-this */
+ return function () {
+ global.stage.set_key_focus(this._prevFocusActor);
+ this._pickWorkspace = false;
+ for (let i = 0; i < this._workspaces.length; i++)
+ this._workspaces[i].hideTooltip();
+ };
+ /* eslint-enable */
+ });
+ this._injectionManager.overrideMethod(viewProto, '_onKeyRelease', () => {
+ /* eslint-disable no-invalid-this */
+ return function (actor, event) {
+ if (this._pickWindow &&
+ (event.get_key_symbol() === Clutter.KEY_Alt_L ||
+ event.get_key_symbol() === Clutter.KEY_Alt_R))
+ this._hideTooltips();
+ if (this._pickWorkspace &&
+ (event.get_key_symbol() === Clutter.KEY_Control_L ||
+ event.get_key_symbol() === Clutter.KEY_Control_R))
+ this._hideWorkspacesTooltips();
+ };
+ /* eslint-enable */
+ });
+ this._injectionManager.overrideMethod(viewProto, '_onKeyPress', () => {
+ /* eslint-disable no-invalid-this */
+ return function (actor, event) {
+ const {ControlsState} = OverviewControls;
+ if (this._overviewAdjustment.value !== ControlsState.WINDOW_PICKER)
+ return false;
+
+ let workspaceManager = global.workspace_manager;
+
+ if ((event.get_key_symbol() === Clutter.KEY_Alt_L ||
+ event.get_key_symbol() === Clutter.KEY_Alt_R) &&
+ !this._pickWorkspace) {
+ this._prevFocusActor = global.stage.get_key_focus();
+ global.stage.set_key_focus(null);
+ this._active = workspaceManager.get_active_workspace_index();
+ this._pickWindow = true;
+ this._workspaces[workspaceManager.get_active_workspace_index()].showWindowsTooltips();
+ return true;
+ }
+ if ((event.get_key_symbol() === Clutter.KEY_Control_L ||
+ event.get_key_symbol() === Clutter.KEY_Control_R) &&
+ !this._pickWindow) {
+ this._prevFocusActor = global.stage.get_key_focus();
+ global.stage.set_key_focus(null);
+ this._pickWorkspace = true;
+ for (let i = 0; i < this._workspaces.length; i++)
+ this._workspaces[i].showTooltip();
+ return true;
+ }
+
+ if (global.stage.get_key_focus() !== global.stage)
+ return false;
+
+ // ignore shift presses, they're required to get numerals in azerty keyboards
+ if ((this._pickWindow || this._pickWorkspace) &&
+ (event.get_key_symbol() === Clutter.KEY_Shift_L ||
+ event.get_key_symbol() === Clutter.KEY_Shift_R))
+ return true;
+
+ if (this._pickWindow) {
+ if (this._active !== workspaceManager.get_active_workspace_index()) {
+ this._hideTooltips();
+ return false;
+ }
+
+ let c = event.get_key_symbol() - Clutter.KEY_KP_0;
+ if (c > 9 || c <= 0) {
+ c = event.get_key_symbol() - Clutter.KEY_0;
+ if (c > 9 || c <= 0) {
+ this._hideTooltips();
+ log(c);
+ return false;
+ }
+ }
+
+ let win = this._workspaces[this._active].getWindowWithTooltip(c);
+ this._hideTooltips();
+
+ if (win)
+ Main.activateWindow(win, global.get_current_time());
+
+ return true;
+ }
+ if (this._pickWorkspace) {
+ let c = event.get_key_symbol() - Clutter.KEY_KP_0;
+ if (c > 9 || c <= 0) {
+ c = event.get_key_symbol() - Clutter.KEY_0;
+ if (c > 9 || c <= 0) {
+ this._hideWorkspacesTooltips();
+ return false;
+ }
+ }
+
+ let workspace = this._workspaces[c - 1];
+ if (workspace !== undefined)
+ workspace.metaWorkspace.activate(global.get_current_time());
+
+ this._hideWorkspacesTooltips();
+ return true;
+ }
+ return false;
+ };
+ /* eslint-enable */
+ });
}
disable() {
- Workspace.Workspace = this._origWorkspace;
- WorkspacesView.WorkspacesView = this._origWorkspacesView;
+ this._injectionManager.clear();
}
}
-
-/**
- * @returns {Extension} - the extension's state object
- */
-function init() {
- return new Extension();
-}
diff --git a/extensions/workspace-indicator/extension.js b/extensions/workspace-indicator/extension.js
index a9b3fd46..dd6ed1ce 100644
--- a/extensions/workspace-indicator/extension.js
+++ b/extensions/workspace-indicator/extension.js
@@ -1,15 +1,16 @@
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
-/* exported init enable disable */
+import Clutter from 'gi://Clutter';
+import Gio from 'gi://Gio';
+import GObject from 'gi://GObject';
+import Meta from 'gi://Meta';
+import St from 'gi://St';
-const {Clutter, Gio, GObject, Meta, St} = imports.gi;
+import {Extension, gettext as _} from 'resource:///org/gnome/shell/extensions/extension.js';
-const DND = imports.ui.dnd;
-const ExtensionUtils = imports.misc.extensionUtils;
-const Main = imports.ui.main;
-const PanelMenu = imports.ui.panelMenu;
-const PopupMenu = imports.ui.popupMenu;
-
-const _ = ExtensionUtils.gettext;
+import * as DND from 'resource:///org/gnome/shell/ui/dnd.js';
+import * as Main from 'resource:///org/gnome/shell/ui/main.js';
+import * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js';
+import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js';
const WORKSPACE_SCHEMA = 'org.gnome.desktop.wm.preferences';
const WORKSPACE_KEY = 'workspace-names';
@@ -34,20 +35,17 @@ class WindowPreview extends St.Button {
this._window = window;
- this.connect('destroy', this._onDestroy.bind(this));
-
- this._sizeChangedId = this._window.connect('size-changed',
- () => this.queue_relayout());
- this._positionChangedId = this._window.connect('position-changed',
- () => {
+ this._window.connectObject(
+ 'size-changed', () => this.queue_relayout(),
+ 'position-changed', () => {
this._updateVisible();
this.queue_relayout();
- });
- this._minimizedChangedId = this._window.connect('notify::minimized',
- this._updateVisible.bind(this));
+ },
+ 'notify::minimized', this._updateVisible.bind(this),
+ this);
- this._focusChangedId = global.display.connect('notify::focus-window',
- this._onFocusChanged.bind(this));
+ global.display.connectObject('notify::focus-window',
+ this._onFocusChanged.bind(this), this);
this._onFocusChanged();
}
@@ -56,13 +54,6 @@ class WindowPreview extends St.Button {
return this._window;
}
- _onDestroy() {
- this._window.disconnect(this._sizeChangedId);
- this._window.disconnect(this._positionChangedId);
- this._window.disconnect(this._minimizedChangedId);
- global.display.disconnect(this._focusChangedId);
- }
-
_onFocusChanged() {
if (global.display.focus_window === this._window)
this.add_style_class_name('active');
@@ -143,16 +134,13 @@ class WorkspaceThumbnail extends St.Button {
let workspaceManager = global.workspace_manager;
this._workspace = workspaceManager.get_workspace_by_index(index);
- this._windowAddedId = this._workspace.connect('window-added',
- (ws, window) => {
- this._addWindow(window);
- });
- this._windowRemovedId = this._workspace.connect('window-removed',
- (ws, window) => {
- this._removeWindow(window);
- });
- this._restackedId = global.display.connect('restacked',
- this._onRestacked.bind(this));
+ this._workspace.connectObject(
+ 'window-added', (ws, window) => this._addWindow(window),
+ 'window-removed', (ws, window) => this._removeWindow(window),
+ this);
+
+ global.display.connectObject('restacked',
+ this._onRestacked.bind(this), this);
this._workspace.list_windows().forEach(w => this._addWindow(w));
this._onRestacked();
@@ -250,10 +238,6 @@ class WorkspaceThumbnail extends St.Button {
_onDestroy() {
this._tooltip.destroy();
-
- this._workspace.disconnect(this._windowAddedId);
- this._workspace.disconnect(this._windowRemovedId);
- global.display.disconnect(this._restackedId);
}
}
@@ -295,14 +279,11 @@ class WorkspaceIndicator extends PanelMenu.Button {
this._workspaceSection = new PopupMenu.PopupMenuSection();
this.menu.addMenuItem(this._workspaceSection);
- this._workspaceManagerSignals = [
- workspaceManager.connect_after('notify::n-workspaces',
- this._nWorkspacesChanged.bind(this)),
- workspaceManager.connect_after('workspace-switched',
- this._onWorkspaceSwitched.bind(this)),
- workspaceManager.connect('notify::layout-rows',
- this._updateThumbnailVisibility.bind(this)),
- ];
+ workspaceManager.connectObject(
+ 'notify::n-workspaces', this._nWorkspacesChanged.bind(this), GObject.ConnectFlags.AFTER,
+ 'workspace-switched', this._onWorkspaceSwitched.bind(this), GObject.ConnectFlags.AFTER,
+ 'notify::layout-rows', this._updateThumbnailVisibility.bind(this),
+ this);
this.connect('scroll-event', this._onScrollEvent.bind(this));
this._thumbnailsBox.connect('scroll-event', this._onScrollEvent.bind(this));
@@ -311,20 +292,11 @@ class WorkspaceIndicator extends PanelMenu.Button {
this._updateThumbnailVisibility();
this._settings = new Gio.Settings({schema_id: WORKSPACE_SCHEMA});
- this._settingsChangedId = this._settings.connect(
- `changed::${WORKSPACE_KEY}`,
- this._updateMenuLabels.bind(this));
+ this._settings.connectObject(`changed::${WORKSPACE_KEY}`,
+ this._updateMenuLabels.bind(this), this);
}
_onDestroy() {
- for (let i = 0; i < this._workspaceManagerSignals.length; i++)
- global.workspace_manager.disconnect(this._workspaceManagerSignals[i]);
-
- if (this._settingsChangedId) {
- this._settings.disconnect(this._settingsChangedId);
- this._settingsChangedId = 0;
- }
-
Main.panel.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS);
super._onDestroy();
@@ -454,20 +426,14 @@ class WorkspaceIndicator extends PanelMenu.Button {
}
}
-/** */
-function init() {
- ExtensionUtils.initTranslations();
-}
+export default class WorkspaceIndicatorExtension extends Extension {
+ enable() {
+ this._indicator = new WorkspaceIndicator();
+ Main.panel.addToStatusArea('workspace-indicator', this._indicator);
+ }
-let _indicator;
-
-/** */
-function enable() {
- _indicator = new WorkspaceIndicator();
- Main.panel.addToStatusArea('workspace-indicator', _indicator);
-}
-
-/** */
-function disable() {
- _indicator.destroy();
+ disable() {
+ this._indicator.destroy();
+ delete this._indicator;
+ }
}
diff --git a/extensions/workspace-indicator/prefs.js b/extensions/workspace-indicator/prefs.js
index 002be954..78e75282 100644
--- a/extensions/workspace-indicator/prefs.js
+++ b/extensions/workspace-indicator/prefs.js
@@ -1,11 +1,13 @@
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
-/* exported init buildPrefsWidget */
+import Adw from 'gi://Adw';
+import Gio from 'gi://Gio';
+import GLib from 'gi://GLib';
+import GObject from 'gi://GObject';
+import Gtk from 'gi://Gtk';
+import Pango from 'gi://Pango';
-const {Adw, Gio, GLib, GObject, Gtk, Pango} = imports.gi;
+import {ExtensionPreferences, gettext as _} from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js';
-const ExtensionUtils = imports.misc.extensionUtils;
-
-const _ = ExtensionUtils.gettext;
const N_ = e => e;
const WORKSPACE_SCHEMA = 'org.gnome.desktop.wm.preferences';
@@ -256,14 +258,8 @@ class NewWorkspaceRow extends Adw.PreferencesRow {
}
}
-/** */
-function init() {
- ExtensionUtils.initTranslations();
-}
-
-/**
- * @returns {Gtk.Widget} - the prefs widget
- */
-function buildPrefsWidget() {
- return new WorkspaceSettingsWidget();
+export default class WorkspaceIndicatorPrefs extends ExtensionPreferences {
+ getPreferencesWidget() {
+ return new WorkspaceSettingsWidget();
+ }
}
diff --git a/lint/eslintrc-gjs.yml b/lint/eslintrc-gjs.yml
index 97e728f9..b1d73946 100644
--- a/lint/eslintrc-gjs.yml
+++ b/lint/eslintrc-gjs.yml
@@ -68,7 +68,10 @@ rules:
jsdoc/check-tag-names: error
jsdoc/check-types: error
jsdoc/implements-on-classes: error
- jsdoc/newline-after-description: error
+ jsdoc/tag-lines:
+ - error
+ - any
+ - startLines: 1
jsdoc/require-jsdoc: error
jsdoc/require-param: error
jsdoc/require-param-description: error
diff --git a/lint/eslintrc-shell.yml b/lint/eslintrc-shell.yml
index 75a78187..a0e2e14f 100644
--- a/lint/eslintrc-shell.yml
+++ b/lint/eslintrc-shell.yml
@@ -10,3 +10,5 @@ rules:
prefer-arrow-callback: error
globals:
global: readonly
+parserOptions:
+ sourceType: module
diff --git a/meson.build b/meson.build
index f3160208..00820b4e 100644
--- a/meson.build
+++ b/meson.build
@@ -1,5 +1,5 @@
project('gnome-shell-extensions',
- version: '44.0',
+ version: '45.beta',
meson_version: '>= 0.58.0',
license: 'GPL2+'
)
@@ -15,7 +15,6 @@ datadir = get_option('datadir')
shelldir = join_paths(datadir, 'gnome-shell')
extensiondir = join_paths(shelldir, 'extensions')
modedir = join_paths(shelldir, 'modes')
-themedir = join_paths(shelldir, 'theme')
schemadir = join_paths(datadir, 'glib-2.0', 'schemas')
sessiondir = join_paths(datadir, 'gnome-session', 'sessions')
@@ -37,6 +36,7 @@ classic_extensions = [
default_extensions = classic_extensions
default_extensions += [
'drive-menu',
+ 'light-style',
'screenshot-window-sizer',
'windowsNavigator',
'workspace-indicator'
@@ -97,7 +97,6 @@ gnome.post_install(
glib_compile_schemas: true,
)
-meson.add_dist_script('meson/generate-stylesheets.py')
meson.add_dist_script('meson/check-version.py',
meson.project_version(),
'NEWS')
diff --git a/meson/generate-stylesheets.py b/meson/generate-stylesheets.py
deleted file mode 100644
index 599d098f..00000000
--- a/meson/generate-stylesheets.py
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/usr/bin/env python3
-
-import os
-from pathlib import PurePath
-import subprocess
-
-sourceroot = os.environ.get('MESON_SOURCE_ROOT')
-distroot = os.environ.get('MESON_DIST_ROOT')
-
-stylesheet_path = PurePath('data/gnome-classic.css')
-src = PurePath(sourceroot, stylesheet_path.with_suffix('.scss'))
-dst = PurePath(distroot, stylesheet_path)
-subprocess.run(['sassc', '-a', src, dst], check=True)
diff --git a/po/el.po b/po/el.po
index 59b14dfb..11c6ad39 100644
--- a/po/el.po
+++ b/po/el.po
@@ -12,8 +12,8 @@ msgstr ""
"Project-Id-Version: gnome-shell-extensions master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/"
"issues\n"
-"POT-Creation-Date: 2020-05-28 00:55+0000\n"
-"PO-Revision-Date: 2020-07-14 00:40+0300\n"
+"POT-Creation-Date: 2023-02-18 15:10+0000\n"
+"PO-Revision-Date: 2023-08-01 23:41+0300\n"
"Last-Translator: Efstathios Iosifidis \n"
"Language-Team: Greek, Modern (1453-) \n"
"Language: el\n"
@@ -21,22 +21,31 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 1.8.7.1\n"
+"X-Generator: Poedit 3.3.2\n"
"X-Project-Style: gnome\n"
-#: data/gnome-classic.desktop.in:3 data/gnome-classic.session.desktop.in:3
+#: data/gnome-classic.desktop.in:3
msgid "GNOME Classic"
msgstr "GNOME Classic"
-#: data/gnome-classic.desktop.in:4
+#: data/gnome-classic.desktop.in:4 data/gnome-classic-wayland.desktop.in:4
+#: data/gnome-classic-xorg.desktop.in:4
msgid "This session logs you into GNOME Classic"
msgstr "Αυτή η συνεδρία σας συνδέει στο GNOME Classic"
-#: extensions/apps-menu/extension.js:113
+#: data/gnome-classic-wayland.desktop.in:3
+msgid "GNOME Classic on Wayland"
+msgstr "GNOME Classic σε Wayland"
+
+#: data/gnome-classic-xorg.desktop.in:3
+msgid "GNOME Classic on Xorg"
+msgstr "GNOME Classic σε Xorg"
+
+#: extensions/apps-menu/extension.js:118
msgid "Favorites"
msgstr "Αγαπημένα"
-#: extensions/apps-menu/extension.js:369
+#: extensions/apps-menu/extension.js:380
msgid "Applications"
msgstr "Εφαρμογές"
@@ -53,26 +62,26 @@ msgstr ""
"(όνομα αρχείου επιφάνειας εργασίας), ακολουθούμενη από άνω-κάτω τελεία και "
"τον αριθμό του χώρου εργασίας"
-#: extensions/auto-move-windows/prefs.js:35
+#: extensions/auto-move-windows/prefs.js:152
msgid "Workspace Rules"
msgstr "Κανόνες χώρων εργασίας"
-#: extensions/auto-move-windows/prefs.js:243
+#: extensions/auto-move-windows/prefs.js:306
msgid "Add Rule"
msgstr "Προσθήκη κανόνα"
#. TRANSLATORS: %s is the filesystem name
-#: extensions/drive-menu/extension.js:112
-#: extensions/places-menu/placeDisplay.js:233
+#: extensions/drive-menu/extension.js:126
+#: extensions/places-menu/placeDisplay.js:212
#, javascript-format
msgid "Ejecting drive “%s” failed:"
msgstr "Αποτυχία εξαγωγής του δίσκου «%s»:"
-#: extensions/drive-menu/extension.js:128
+#: extensions/drive-menu/extension.js:145
msgid "Removable devices"
msgstr "Αφαιρούμενες συσκευές"
-#: extensions/drive-menu/extension.js:155
+#: extensions/drive-menu/extension.js:167
msgid "Open Files"
msgstr "Άνοιγμα αρχείων"
@@ -106,31 +115,31 @@ msgstr ""
"στο κάτω μέρος. Η αλλαγή αυτής της ρύθμισης απαιτεί επανεκκίνηση του "
"κελύφους για να υπάρξει κάποιο αποτέλεσμα."
-#: extensions/places-menu/extension.js:89
-#: extensions/places-menu/extension.js:93
+#: extensions/places-menu/extension.js:94
+#: extensions/places-menu/extension.js:97
msgid "Places"
msgstr "Τοποθεσίες"
-#: extensions/places-menu/placeDisplay.js:46
+#: extensions/places-menu/placeDisplay.js:52
#, javascript-format
msgid "Failed to launch “%s”"
msgstr "Αποτυχία εκκίνησης «%s»"
-#: extensions/places-menu/placeDisplay.js:61
+#: extensions/places-menu/placeDisplay.js:67
#, javascript-format
msgid "Failed to mount volume for “%s”"
msgstr "Αποτυχία προσάρτησης τόμου για «%s»"
-#: extensions/places-menu/placeDisplay.js:148
-#: extensions/places-menu/placeDisplay.js:171
+#: extensions/places-menu/placeDisplay.js:127
+#: extensions/places-menu/placeDisplay.js:150
msgid "Computer"
msgstr "Υπολογιστής"
-#: extensions/places-menu/placeDisplay.js:359
+#: extensions/places-menu/placeDisplay.js:340
msgid "Home"
msgstr "Προσωπικός φάκελος"
-#: extensions/places-menu/placeDisplay.js:404
+#: extensions/places-menu/placeDisplay.js:385
msgid "Browse Network"
msgstr "Περιήγηση δικτύου"
@@ -151,47 +160,47 @@ msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
msgstr ""
"Το όνομα του θέματος που θα φορτωθεί από το ~ /.themes/name/gnome-shell"
-#: extensions/window-list/extension.js:98
+#: extensions/window-list/extension.js:72
msgid "Close"
msgstr "Κλείσιμο"
-#: extensions/window-list/extension.js:118
+#: extensions/window-list/extension.js:92
msgid "Unminimize"
msgstr "Αποελαχιστοποίηση"
-#: extensions/window-list/extension.js:118
+#: extensions/window-list/extension.js:92
msgid "Minimize"
msgstr "Ελαχιστοποίηση"
-#: extensions/window-list/extension.js:125
+#: extensions/window-list/extension.js:99
msgid "Unmaximize"
msgstr "Απομεγιστοποίηση"
-#: extensions/window-list/extension.js:125
+#: extensions/window-list/extension.js:99
msgid "Maximize"
msgstr "Μεγιστοποίηση"
-#: extensions/window-list/extension.js:428
+#: extensions/window-list/extension.js:483
msgid "Minimize all"
msgstr "Ελαχιστοποίηση όλων"
-#: extensions/window-list/extension.js:434
+#: extensions/window-list/extension.js:489
msgid "Unminimize all"
msgstr "Αποελαχιστοποίηση όλων"
-#: extensions/window-list/extension.js:440
+#: extensions/window-list/extension.js:495
msgid "Maximize all"
msgstr "Μεγιστοποίηση όλων"
-#: extensions/window-list/extension.js:448
+#: extensions/window-list/extension.js:503
msgid "Unmaximize all"
msgstr "Απομεγιστοποίηση όλων"
-#: extensions/window-list/extension.js:456
+#: extensions/window-list/extension.js:511
msgid "Close all"
msgstr "Κλείσιμο όλων"
-#: extensions/window-list/extension.js:734
+#: extensions/window-list/extension.js:795
msgid "Window List"
msgstr "Λίστα παραθύρου"
@@ -209,7 +218,7 @@ msgstr ""
"«always» (πάντα)."
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20
-#: extensions/window-list/prefs.js:100
+#: extensions/window-list/prefs.js:79
msgid "Show windows from all workspaces"
msgstr "Εμφάνιση των παραθύρων από όλους τους χώρους εργασίας"
@@ -230,41 +239,41 @@ msgstr ""
"Αν θα εμφανίζεται ο κατάλογος παραθύρων όλων των συνδεμένων οθονών ή μόνο "
"της κύριας οθόνης."
-#: extensions/window-list/prefs.js:29
+#: extensions/window-list/prefs.js:35
msgid "Window Grouping"
msgstr "Ομαδοποίηση παραθύρου"
-#: extensions/window-list/prefs.js:58
+#: extensions/window-list/prefs.js:40
msgid "Never group windows"
msgstr "Να μη γίνεται ποτέ ομαδοποίηση παραθύρων"
-#: extensions/window-list/prefs.js:59
+#: extensions/window-list/prefs.js:41
msgid "Group windows when space is limited"
msgstr "Ομαδοποίηση παραθύρων όταν ο χώρος είναι περιορισμένος"
-#: extensions/window-list/prefs.js:60
+#: extensions/window-list/prefs.js:42
msgid "Always group windows"
msgstr "Να γίνεται πάντα ομαδοποίηση παραθύρων"
-#: extensions/window-list/prefs.js:94
+#: extensions/window-list/prefs.js:66
msgid "Show on all monitors"
msgstr "Να εμφανίζεται σε όλες τις οθόνες"
-#: extensions/window-list/workspaceIndicator.js:207
-#: extensions/workspace-indicator/extension.js:213
+#: extensions/window-list/workspaceIndicator.js:261
+#: extensions/workspace-indicator/extension.js:266
msgid "Workspace Indicator"
msgstr "Δείκτης χώρου εργασίας"
-#: extensions/workspace-indicator/prefs.js:34
-msgid "Workspace Names"
-msgstr "Ονόματα χώρων εργασίας:"
-
-#: extensions/workspace-indicator/prefs.js:67
+#: extensions/workspace-indicator/prefs.js:62
#, javascript-format
msgid "Workspace %d"
msgstr "Χώρος εργασίας %d"
-#: extensions/workspace-indicator/prefs.js:218
+#: extensions/workspace-indicator/prefs.js:129
+msgid "Workspace Names"
+msgstr "Ονόματα χώρων εργασίας"
+
+#: extensions/workspace-indicator/prefs.js:255
msgid "Add Workspace"
msgstr "Προσθήκη χώρου εργασίας"