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 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 "Προσθήκη χώρου εργασίας"