Compare commits
113 Commits
ubuntu/jam
...
debian/mas
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6ce713f305 | ||
|
|
db248b3ce6 | ||
|
|
2e2651ea4c | ||
|
|
696225fdc9 | ||
|
|
fd31c81873 | ||
|
|
981f094061 | ||
|
|
e864d0d1cc | ||
|
|
4345703c2e | ||
|
|
a911447375 | ||
|
|
2d3307c657 | ||
|
|
d59bc0b7f0 | ||
|
|
cb8c2eb27f | ||
|
|
0544729bba | ||
|
|
017c410a6a | ||
|
|
f2c73329be | ||
|
|
ce644be96f | ||
|
|
e75a1a15ac | ||
|
|
1155170c7c | ||
|
|
6d8f54a20b | ||
|
|
93a2e7bdba | ||
|
|
3bfaf6f88a | ||
|
|
37baccd9fc | ||
|
|
9365725246 | ||
|
|
f1257c4523 | ||
|
|
f0865f039e | ||
|
|
4955c20669 | ||
|
|
cf007dd472 | ||
|
|
701b14ecbf | ||
|
|
18674b2e35 | ||
|
|
278d0afc79 | ||
|
|
90031432da | ||
|
|
b11f0f16f4 | ||
|
|
b7895ad956 | ||
|
|
22b9f888fb | ||
|
|
61a260bc94 | ||
|
|
ced3c94dfa | ||
|
|
904ead1fb1 | ||
|
|
f6b6049bc5 | ||
|
|
ca1c4b0f9e | ||
|
|
b9067eed79 | ||
|
|
68c7beabab | ||
|
|
3ba184bfe2 | ||
|
|
24fa8a6e04 | ||
|
|
923f204478 | ||
|
|
930595003d | ||
|
|
58b4b3c8d6 | ||
|
|
25cc126ebc | ||
|
|
30bac19c5a | ||
|
|
7689d660dc | ||
|
|
a69d37f2ee | ||
|
|
2e715149db | ||
|
|
26d067d301 | ||
|
|
51df22adcf | ||
|
|
e0d5ede296 | ||
|
|
2c25e22145 | ||
|
|
c1df8cedb8 | ||
|
|
2189f8cc58 | ||
|
|
6cd74c86ae | ||
|
|
6ff6eb2c22 | ||
|
|
ffa9806d40 | ||
|
|
5ff41b9151 | ||
|
|
7e8ba59304 | ||
|
|
88657c2def | ||
|
|
68b7915bc6 | ||
|
|
497d175ae9 | ||
|
|
f6e66faf8f | ||
|
|
ee0bb2c636 | ||
|
|
6bee46bf1a | ||
|
|
1edb245e85 | ||
|
|
de48d02c62 | ||
|
|
ac3e095e27 | ||
|
|
95a58358f8 | ||
|
|
cc72a34973 | ||
|
|
7a010d5a72 | ||
|
|
9e4b7488b3 | ||
|
|
18cf40a521 | ||
|
|
ed6d806617 | ||
|
|
f4347d240a | ||
|
|
77b35dcda3 | ||
|
|
6ebb41b1e8 | ||
|
|
11cb22bd24 | ||
|
|
6fc3f5cea2 | ||
|
|
c8484e77d3 | ||
|
|
98c5d4a739 | ||
|
|
4f5e421539 | ||
|
|
72868ac7c5 | ||
|
|
5dea503cbd | ||
|
|
81b8ad4499 | ||
|
|
01d3d8fd6d | ||
|
|
47c2834ffa | ||
|
|
8f8292afb3 | ||
|
|
d505f75c9b | ||
|
|
a8a2729531 | ||
|
|
aeee81a82c | ||
|
|
9f88e98d1b | ||
|
|
4b7055d0da | ||
|
|
563d7770d3 | ||
|
|
d62b58b1d9 | ||
|
|
4f78bb96a7 | ||
|
|
c94678e2be | ||
|
|
3c515d42f2 | ||
|
|
9306ee7a5d | ||
|
|
e8c8c7d940 | ||
|
|
871c9c39dc | ||
|
|
bb5869f8df | ||
|
|
faaa66eb3f | ||
|
|
14c60eb954 | ||
|
|
0234cd74f7 | ||
|
|
f637e81c8c | ||
|
|
ea82830a9f | ||
|
|
ecc955b4cd | ||
|
|
7e5f7eb0aa | ||
|
|
1c3407c05f |
@@ -2,8 +2,6 @@ include:
|
||||
- remote: 'https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/bbe5232986c9b98eb1efe62484e07216f7d1a4df/templates/fedora.yml'
|
||||
- remote: "https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/6f86b8bcb0cd5168c32779c4fea9a893c4a0c046/templates/ci-fairy.yml"
|
||||
|
||||
image: registry.gitlab.gnome.org/gnome/gnome-shell/fedora/35:2022-02-18.0
|
||||
|
||||
stages:
|
||||
- pre_review
|
||||
- prepare
|
||||
@@ -12,6 +10,7 @@ stages:
|
||||
- deploy
|
||||
|
||||
default:
|
||||
image: registry.gitlab.gnome.org/gnome/gnome-shell/fedora/35:2022-02-18.0
|
||||
# Cancel jobs if newer commits are pushed to the branch
|
||||
interruptible: true
|
||||
# Auto-retry jobs in case of infra failures
|
||||
@@ -108,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}
|
||||
@@ -133,8 +133,6 @@ fedora-build:
|
||||
stage: build
|
||||
needs:
|
||||
- build-fedora-container
|
||||
before_script:
|
||||
- git submodule update --init
|
||||
script:
|
||||
- meson setup build --werror -Dextension_set=all -Dclassic_mode=true
|
||||
- meson compile -C build
|
||||
@@ -151,8 +149,8 @@ fedora-dist:
|
||||
stage: deploy
|
||||
needs:
|
||||
- fedora-build
|
||||
before_script:
|
||||
- git submodule update --init
|
||||
variables:
|
||||
GIT_SUBMODULE_STRATEGY: normal
|
||||
script:
|
||||
- meson dist -C build
|
||||
rules:
|
||||
|
||||
54
.gitlab-ci/run-eslint
Executable file
54
.gitlab-ci/run-eslint
Executable file
@@ -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);
|
||||
});
|
||||
86
NEWS
86
NEWS
@@ -1,3 +1,89 @@
|
||||
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
|
||||
|
||||
44.rc
|
||||
=====
|
||||
* Bump version
|
||||
|
||||
44.beta
|
||||
=======
|
||||
* Tweak menu alignment [robxnano; !246]
|
||||
|
||||
Contributors:
|
||||
Florian Müllner, robxnano
|
||||
|
||||
Translators:
|
||||
Vasil Pupkin [be]
|
||||
|
||||
43.1
|
||||
====
|
||||
* Fixed crash [Florian; !243]
|
||||
* Misc. bug fixes and cleanups [mowemcfc; !244]
|
||||
|
||||
Contributors:
|
||||
Florian Müllner, mowemcfc
|
||||
|
||||
Translators:
|
||||
Sabri Ünal [tr]
|
||||
|
||||
43.0
|
||||
====
|
||||
|
||||
Contributors:
|
||||
Florian Müllner
|
||||
|
||||
Translators:
|
||||
Pawan Chitrakar [ne], Zurab Kargareteli [ka], Aleksandr Melman [ru]
|
||||
|
||||
43.rc
|
||||
=====
|
||||
* Misc. bug fixes and cleanups [Florian; !240]
|
||||
|
||||
Contributors:
|
||||
Florian Müllner
|
||||
|
||||
43.beta
|
||||
=======
|
||||
* Misc. bug fixes and cleanups [Florian; !237, !238]
|
||||
|
||||
Contributors:
|
||||
Florian Müllner
|
||||
|
||||
Translators:
|
||||
Nart Tlisha [ab]
|
||||
|
||||
43.alpha
|
||||
========
|
||||
|
||||
Contributors:
|
||||
Florian Müllner
|
||||
|
||||
Translators:
|
||||
Marco Ciampa [it]
|
||||
|
||||
42.3
|
||||
====
|
||||
* screenshot-window-sizer: Fix reported sizes on wayland [Florian; !232]
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
|
Before Width: | Height: | Size: 100 KiB |
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"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", "aggregateMenu"]
|
||||
"right": ["a11y", "keyboard", "dateMenu", "quickSettings"]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
@import url("gnome-classic.css");
|
||||
|
||||
stage {
|
||||
-st-icon-style: symbolic;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -1,339 +0,0 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc. <http://fsf.org>
|
||||
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.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
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.
|
||||
|
||||
<signature of Ty Coon>, 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.
|
||||
@@ -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
|
||||
@@ -1,94 +0,0 @@
|
||||
// When color definition differs for dark and light variant,
|
||||
// it gets @if-ed depending on $variant
|
||||
|
||||
//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;
|
||||
|
||||
|
||||
$base_color: if($variant == 'light', #fff, darken(desaturate(#241f31, 100%), 2%));
|
||||
$bg_color: if($variant == 'light', #f6f5f4, lighten($base_color, 5%));
|
||||
$fg_color: if($variant == 'light', transparentize(black, .2), white);
|
||||
|
||||
$selected_fg_color: #fff;
|
||||
$selected_bg_color: #3584e4;
|
||||
$selected_borders_color: if($variant== 'light', darken($selected_bg_color, 15%), darken($selected_bg_color, 30%));
|
||||
|
||||
$borders_color: if($variant == 'light', transparentize($fg_color, .5), transparentize($fg_color, .9));
|
||||
$borders_edge: 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: white;
|
||||
$osd_bg_color: transparentize(desaturate($bg_color, 100%),0.04);
|
||||
$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.98);
|
||||
|
||||
$shadow_color: if($variant == 'light', rgba(0,0,0,0.1), rgba(0,0,0,0.2));
|
||||
|
||||
// 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%);
|
||||
@@ -1,221 +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
|
||||
|
||||
// derived hover colors
|
||||
$hover_bg_color: if($variant=='light', darken($bg_color, 3%), lighten($bg_color, 4%));
|
||||
$hover_fg_color: if($variant=='light', darken($fg_color, 5%), lighten($fg_color, 4%));
|
||||
|
||||
// derived active colors
|
||||
$active_bg_color: if($variant=='light', darken($bg_color, 5%), lighten($bg_color, 6%));
|
||||
$active_fg_color: if($variant=='light', darken($fg_color, 5%), lighten($fg_color, 6%));
|
||||
|
||||
// derived checked colors
|
||||
$checked_bg_color: if($variant=='light', darken($bg_color, 7%), lighten($bg_color, 9%));
|
||||
$checked_fg_color: if($variant=='light', darken($fg_color, 7%), lighten($fg_color, 9%));
|
||||
|
||||
// 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;
|
||||
}
|
||||
|
||||
// Overview panels
|
||||
// for the dash and workspace switcher
|
||||
%overview_panel {
|
||||
color: $osd_fg_color;
|
||||
background-color: transparentize($osd_fg_color, 0.9);
|
||||
}
|
||||
|
||||
// icon tiles
|
||||
%tile {
|
||||
border-radius: $base_border_radius * 2; // 16px
|
||||
padding: $base_padding;
|
||||
spacing: $base_padding;
|
||||
border: 2px solid transparent;
|
||||
transition-duration: 100ms;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
// dialogs
|
||||
%bubble_panel {
|
||||
color: $fg_color;
|
||||
background-color: $bg_color;
|
||||
border-radius: $base_border_radius*1.25 + 1px;
|
||||
border: 1px solid $borders_edge;
|
||||
}
|
||||
|
||||
// normal button styling
|
||||
%button {
|
||||
border-radius: $base_border_radius - 2px; // 6px
|
||||
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);}
|
||||
&:active { @include button(active);}
|
||||
&:checked { @include button(checked);}
|
||||
}
|
||||
|
||||
// buttons in dialogs/notifications
|
||||
// lighter in color and have a greater radius
|
||||
|
||||
$bubble_button_radius:$base_border_radius*1.25;
|
||||
$bubble_buttons_color: if($variant == 'light', darken($bg_color, 12%), lighten($bg_color, 7%));
|
||||
|
||||
%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 $bubble_button_radius;
|
||||
}
|
||||
|
||||
&:last-child:ltr {
|
||||
border-radius: 0 0 $bubble_button_radius 0;
|
||||
margin-right: 0 !important;
|
||||
}
|
||||
|
||||
&:first-child:rtl {
|
||||
border-radius: 0 0 $bubble_button_radius 0;
|
||||
}
|
||||
|
||||
&:last-child:rtl {
|
||||
border-radius: 0 0 0 $bubble_button_radius;
|
||||
margin-left: 0 !important;
|
||||
}
|
||||
|
||||
&:first-child:last-child {
|
||||
border-radius: 0 0 $bubble_button_radius $bubble_button_radius !important;
|
||||
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, $c:$osd_bg_color);}
|
||||
&:focus { @include button(focus, $c:$osd_bg_color);}
|
||||
&:hover { @include button(hover, $c:$osd_bg_color);}
|
||||
&:active { @include button(active, $c:$osd_bg_color);}
|
||||
&:outlined,&:checked { @include button(checked, $c:$osd_bg_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";}
|
||||
@@ -1,312 +0,0 @@
|
||||
// Drawing mixins
|
||||
|
||||
// generic drawing of more complex things
|
||||
|
||||
@function draw_widget_edge($c:$borders_edge) {
|
||||
// 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
|
||||
//
|
||||
|
||||
@if $t==normal {
|
||||
background-color: lighten($bg_color, 5%);
|
||||
color: transparentize($fg_color,0.3);
|
||||
border: 2px solid lighten($bg_color, 5%);
|
||||
}
|
||||
|
||||
@if $t==focus {
|
||||
background-color: mix(lighten($bg_color, 5%), $selected_bg_color, 95%);
|
||||
border-color: $fc;
|
||||
color: $fg_color;
|
||||
&:hover {}
|
||||
}
|
||||
|
||||
@if $t==hover {
|
||||
background-color:lighten($hover_bg_color, 5%);
|
||||
border-color:lighten($hover_bg_color, 5%);
|
||||
color: transparentize($fg_color,0.3);
|
||||
}
|
||||
|
||||
@if $t==insensitive {
|
||||
background-color:lighten($insensitive_bg_color, 5%);
|
||||
border-color: lighten($insensitive_bg_color, 5%);
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// buttons
|
||||
// since buttons are all flat an borderless now the mixin is simpler
|
||||
|
||||
@mixin button($t, $tc:$fg_color, $c:$bg_color) {
|
||||
|
||||
$button_bg_color: mix($tc, $c, 5%);
|
||||
//
|
||||
// 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
|
||||
//
|
||||
|
||||
// normal button
|
||||
@if $t==normal {
|
||||
color: $tc;
|
||||
background-color: $button_bg_color;
|
||||
}
|
||||
|
||||
// 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);
|
||||
&: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);
|
||||
}
|
||||
&: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);
|
||||
}
|
||||
}
|
||||
|
||||
// hover button
|
||||
@else if $t==hover {
|
||||
color: $tc;
|
||||
background-color: lighten($button_bg_color, 3%);
|
||||
}
|
||||
|
||||
// active button
|
||||
@else if $t==active {
|
||||
color: $tc;
|
||||
background-color: lighten($button_bg_color, 6%);
|
||||
}
|
||||
|
||||
// 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%);}
|
||||
}
|
||||
|
||||
// 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_bg_color, 0.4);
|
||||
}
|
||||
&: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;
|
||||
&: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);
|
||||
}
|
||||
&: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) {
|
||||
.overview-icon { @extend %tile; }
|
||||
@if $flat {
|
||||
.overview-icon { background-color: transparent;}
|
||||
} @else {
|
||||
.overview-icon { background-color: transparentize($color, .81);}
|
||||
}
|
||||
&: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;
|
||||
margin: $base_margin;
|
||||
box-shadow: 0 1px 1px 0 rgba(0,0,0,.1);
|
||||
|
||||
@if $flat {
|
||||
@include button(undecorated);
|
||||
box-shadow: none !important;
|
||||
} @else {
|
||||
@include button(normal);
|
||||
}
|
||||
|
||||
&:focus {
|
||||
@include button(focus);
|
||||
}
|
||||
|
||||
&:hover {
|
||||
@include button(hover);
|
||||
}
|
||||
|
||||
&:active {
|
||||
@include button(active);
|
||||
}
|
||||
}
|
||||
@@ -1,42 +0,0 @@
|
||||
// When color definition differs for dark and light variant,
|
||||
// it gets @if ed depending on $variant
|
||||
|
||||
$base_color: #222;
|
||||
$bg_color: #000;
|
||||
$fg_color: #fff;
|
||||
|
||||
$selected_fg_color: #ffffff;
|
||||
$selected_bg_color: darken(#4a90d9,20%);
|
||||
$selected_borders_color: darken($selected_bg_color, 20%);
|
||||
$borders_color: darken($bg_color,12%);
|
||||
$borders_edge: transparentize($fg_color, 0.9);
|
||||
$link_color: lighten($selected_bg_color,20%);
|
||||
$link_visited_color: lighten($selected_bg_color,10%);
|
||||
|
||||
$warning_color: #f57900;
|
||||
$error_color: #cc0000;
|
||||
$success_color: darken(#73d216,10%);
|
||||
$destructive_color: darken(#ef2929,10%);
|
||||
|
||||
$osd_fg_color: #eeeeec;
|
||||
$osd_bg_color: #2e3436;
|
||||
$osd_borders_color: rgba(0,0,0, 0.7);
|
||||
$osd_outer_borders_color: rgba(255,255,255, 0.1);
|
||||
$osd_insensitive_bg_color: mix($osd_fg_color, $osd_bg_color, 10%);
|
||||
$osd_insensitive_fg_color: if($variant == 'light', mix($osd_fg_color, $osd_bg_color, 80%), mix($osd_fg_color, $osd_bg_color, 70%));
|
||||
|
||||
$shadow_color: rgba(0,0,0, 0.1);
|
||||
$system_bg_color: desaturate(#241f31,100%); //neutralize the HIG 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: $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%);
|
||||
@@ -1,51 +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';
|
||||
@import 'widgets/network-dialog';
|
||||
// OSDs
|
||||
@import 'widgets/osd';
|
||||
@import 'widgets/switcher-popup';
|
||||
@import 'widgets/workspace-switcher';
|
||||
@import 'widgets/screenshot';
|
||||
// Panel
|
||||
@import 'widgets/panel';
|
||||
@import 'widgets/corner-ripple';
|
||||
// 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 screens
|
||||
@import 'widgets/login-dialog';
|
||||
@import 'widgets/screen-shield';
|
||||
@@ -1,37 +0,0 @@
|
||||
<Project xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
|
||||
xmlns:foaf="http://xmlns.com/foaf/0.1/"
|
||||
xmlns:gnome="http://api.gnome.org/doap-extensions#"
|
||||
xmlns="http://usefulinc.com/ns/doap#">
|
||||
|
||||
<name xml:lang="en">GNOME Shell Sass</name>
|
||||
<shortdesc xml:lang="en">Sass sources of GNOME Shell</shortdesc>
|
||||
<description>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.</description>
|
||||
|
||||
<category rdf:resource="http://api.gnome.org/doap-extensions#core" />
|
||||
<programming-language>sass</programming-language>
|
||||
<programming-language>css</programming-language>
|
||||
|
||||
<maintainer>
|
||||
<foaf:Person>
|
||||
<foaf:name>Carlos Soriano</foaf:name>
|
||||
<foaf:mbox rdf:resource="mailto:csoriano@gnome.org" />
|
||||
<gnome:userid>csoriano</gnome:userid>
|
||||
</foaf:Person>
|
||||
</maintainer>
|
||||
<maintainer>
|
||||
<foaf:Person>
|
||||
<foaf:name>Florian Müllner</foaf:name>
|
||||
<foaf:mbox rdf:resource="mailto:fmuellner@gnome.org" />
|
||||
<gnome:userid>fmuellner</gnome:userid>
|
||||
</foaf:Person>
|
||||
</maintainer>
|
||||
<maintainer>
|
||||
<foaf:Person>
|
||||
<foaf:name>Jakub Steiner</foaf:name>
|
||||
<foaf:mbox rdf:resource="mailto:jimmac@gmail.com" />
|
||||
<gnome:userid>jimmac</gnome:userid>
|
||||
</foaf:Person>
|
||||
</maintainer>
|
||||
</Project>
|
||||
@@ -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; }
|
||||
}
|
||||
@@ -1,154 +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;}
|
||||
.overview-icon.overview-icon-with-label {
|
||||
> StBoxLayout {
|
||||
spacing: $base_padding;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// app folders
|
||||
.app-well-app.app-folder {
|
||||
@include overview_icon($osd_fg_color, $flat: false);
|
||||
}
|
||||
|
||||
// expanded folder
|
||||
.app-folder-dialog {
|
||||
border-radius: $modal_radius*2;
|
||||
background-color: $dash_background_color;
|
||||
|
||||
& .folder-name-container {
|
||||
padding: 24px 36px 0;
|
||||
spacing: 12px;
|
||||
|
||||
& .folder-name-label,
|
||||
& .folder-name-entry {
|
||||
@extend %title_1;
|
||||
}
|
||||
|
||||
& .folder-name-entry { width: 300px }
|
||||
|
||||
/* 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: 640px;
|
||||
height: 640px;
|
||||
}
|
||||
|
||||
// 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;
|
||||
|
||||
.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: #fff;
|
||||
border-radius: 99px;
|
||||
icon-size: $app_icon_size * 0.5;
|
||||
}
|
||||
|
||||
.page-navigation-hint {
|
||||
width: 300px;
|
||||
|
||||
&.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;
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
/* Buttons */
|
||||
|
||||
.button {
|
||||
@extend %button; // that's it
|
||||
min-height: 22px;
|
||||
}
|
||||
@@ -1,256 +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: true);
|
||||
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 {
|
||||
color: lighten($fg_color,5%);
|
||||
@extend %heading;
|
||||
padding: 8px 0;
|
||||
}
|
||||
.pager-button {
|
||||
background-color: transparent;
|
||||
height: 32px;
|
||||
width: 32px;
|
||||
margin: 2px;
|
||||
border-radius: $base_border_radius - 2px;
|
||||
&:hover, &:focus {background-color: $hover_bg_color;}
|
||||
&:active {background-color: $active_bg_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;
|
||||
@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: bold;
|
||||
@extend %smaller;
|
||||
}
|
||||
}
|
||||
|
||||
.calendar-day {}
|
||||
.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: darken($bg_color, 2%);
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -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"); }
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
/* Activities Ripple */
|
||||
|
||||
$ripple_size: 50px;
|
||||
|
||||
.ripple-box {
|
||||
background-color: lighten(transparentize($selected_bg_color, 0.7), 40%);
|
||||
box-shadow: 0 0 2px 2px lighten($selected_bg_color, 20%);
|
||||
// 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; }
|
||||
}
|
||||
@@ -1,75 +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;
|
||||
}
|
||||
|
||||
// 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;
|
||||
}
|
||||
|
||||
// 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;
|
||||
}
|
||||
|
||||
// OSD Tooltip
|
||||
.dash-label {
|
||||
color: $osd_fg_color;
|
||||
background-color: $osd_bg_color;
|
||||
border-radius: 99px;
|
||||
padding: $base_padding $base_padding * 2;
|
||||
text-align: center;
|
||||
-y-offset: $base_margin * 2; // distance from the dash edge
|
||||
}
|
||||
@@ -1,167 +0,0 @@
|
||||
/* Modal Dialogs */
|
||||
|
||||
.headline {
|
||||
@extend %title_4;
|
||||
}
|
||||
|
||||
.modal-dialog {
|
||||
@extend %bubble_panel;
|
||||
|
||||
.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;
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
/* Entries */
|
||||
|
||||
StEntry {
|
||||
border-radius: $base_border_radius;
|
||||
padding: 8px;
|
||||
color: $fg_color;
|
||||
|
||||
@include entry(normal);
|
||||
&:hover { @include entry(hover);}
|
||||
&:focus { @include entry(focus);}
|
||||
&:insensitive { @include entry(insensitive);}
|
||||
|
||||
selection-background-color: $selected_bg_color;
|
||||
selected-color: $selected_fg_color;
|
||||
|
||||
StIcon.capslock-warning {
|
||||
icon-size: 16px;
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
// hotplug
|
||||
|
||||
.hotplug-notification-item {
|
||||
@extend %bubble_button;
|
||||
}
|
||||
|
||||
.hotplug-notification-item-icon {
|
||||
icon-size: 24px;
|
||||
padding: 0 4px;
|
||||
}
|
||||
@@ -1,36 +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;}
|
||||
|
||||
.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;}
|
||||
.candidate-page-button-icon { icon-size: $base_icon_size; }
|
||||
@@ -1,153 +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;
|
||||
}
|
||||
|
||||
// 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 + 3);
|
||||
spacing: 12px;
|
||||
min-height: 20pt;
|
||||
padding: $base_padding*2;
|
||||
color: $osd_fg_color;
|
||||
|
||||
// each suggestion
|
||||
StButton {
|
||||
margin: 0 3px;
|
||||
min-width: 32px;
|
||||
border-radius: $base_border_radius - 2px;
|
||||
padding: $base_padding $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); }
|
||||
}
|
||||
}
|
||||
@@ -1,204 +0,0 @@
|
||||
/* Login Dialog */
|
||||
|
||||
.login-dialog-banner-view {
|
||||
padding-top: 24px;
|
||||
max-width: 23em;
|
||||
}
|
||||
|
||||
.login-dialog,
|
||||
.unlock-dialog {
|
||||
//reset
|
||||
border: none;
|
||||
background-color: transparent;
|
||||
|
||||
$_gdm_bg: $system_bg_color;
|
||||
|
||||
.modal-dialog-button-box { spacing: 3px; }
|
||||
.modal-dialog-button {
|
||||
padding: 4px 18px;
|
||||
box-shadow: 0 1px 3px rgba(0,0,0,0.2);
|
||||
background-color: darken($system_bg_color, 3%);
|
||||
border-color: darken($system_bg_color, 3%);
|
||||
color: $osd_fg_color;
|
||||
|
||||
$_hover_c: lighten($_gdm_bg, 5%);
|
||||
&:hover, &:focus {
|
||||
background-color: $_hover_c;
|
||||
border-color: $_hover_c;
|
||||
}
|
||||
&:active {
|
||||
$_active_c: darken($_gdm_bg, 5%);
|
||||
box-shadow: none;
|
||||
background-color: $_active_c;
|
||||
border-color: $_active_c;
|
||||
}
|
||||
&:insensitive {
|
||||
@include button(insensitive);
|
||||
border-color: darken($_gdm_bg, 5%);
|
||||
background-color: darken($_gdm_bg, 5%);
|
||||
color: transparentize($osd_fg_color, 0.3);
|
||||
}
|
||||
&:default {
|
||||
@include button(default);
|
||||
}
|
||||
}
|
||||
|
||||
.cancel-button,
|
||||
.switch-user-button,
|
||||
.login-dialog-session-list-button {
|
||||
padding: 0;
|
||||
border-radius: 99px;
|
||||
width: $large_icon_size;
|
||||
height: $large_icon_size;
|
||||
border-color: darken($system_bg_color, 3%);
|
||||
background-color: darken($system_bg_color, 3%);
|
||||
|
||||
StIcon { icon-size: $base_icon_size; }
|
||||
}
|
||||
|
||||
.caps-lock-warning-label,
|
||||
.login-dialog-message-warning {
|
||||
color: $osd_fg_color;
|
||||
}
|
||||
}
|
||||
|
||||
.login-dialog-logo-bin { padding: 24px 0px; }
|
||||
.login-dialog-banner { color: darken($osd_fg_color,10%); }
|
||||
.login-dialog-button-box { width: 23em; spacing: 5px; }
|
||||
.login-dialog-message { text-align: center; }
|
||||
.login-dialog-user-selection-box { padding: 100px 0px; }
|
||||
.login-dialog-not-listed-label {
|
||||
padding-left: 2px;
|
||||
.login-dialog-not-listed-button:focus &,
|
||||
.login-dialog-not-listed-button:hover & {
|
||||
color: $osd_fg_color;
|
||||
}
|
||||
}
|
||||
|
||||
.login-dialog-not-listed-label {
|
||||
@extend %caption;
|
||||
font-weight: bold;
|
||||
color: darken($osd_fg_color,30%);
|
||||
padding-top: 1em;
|
||||
}
|
||||
|
||||
.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 + 4px;
|
||||
padding: 6px;
|
||||
color: darken($osd_fg_color,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: 23em;
|
||||
&:expanded .login-dialog-user-list-item:selected { background-color: $selected_bg_color; color: $selected_fg_color; }
|
||||
&:expanded .login-dialog-user-list-item:logged-in { border-right: 2px solid $selected_bg_color; }
|
||||
}
|
||||
|
||||
.login-dialog-user-list-item {
|
||||
border-radius: $base_border_radius + 4px;
|
||||
padding: 6px;
|
||||
color: darken($osd_fg_color,30%);
|
||||
&:ltr .user-widget { padding-right: 1em; }
|
||||
&:rtl .user-widget { padding-left: 1em; }
|
||||
.login-dialog-timed-login-indicator {
|
||||
height: 2px;
|
||||
margin-top: 6px;
|
||||
background-color: $osd_fg_color;
|
||||
}
|
||||
&:focus .login-dialog-timed-login-indicator { background-color: $selected_fg_color; }
|
||||
}
|
||||
|
||||
.user-widget-label {
|
||||
color: $osd_fg_color;
|
||||
}
|
||||
|
||||
.user-widget.horizontal .user-widget-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; }
|
||||
}
|
||||
|
||||
.user-widget.vertical .user-widget-label {
|
||||
@include fontsize($base_font_size + 5);
|
||||
text-align: center;
|
||||
font-weight: normal;
|
||||
padding-top: 16px;
|
||||
}
|
||||
|
||||
.login-dialog-timed-login-indicator {
|
||||
height: 2px;
|
||||
background-color: darken($fg_color,40%);
|
||||
}
|
||||
|
||||
.login-dialog-prompt-layout {
|
||||
padding-top: 24px;
|
||||
padding-bottom: 12px;
|
||||
spacing: $base_padding * 2;
|
||||
width: 23em;
|
||||
}
|
||||
|
||||
.login-dialog-prompt-entry {
|
||||
height: 1.5em;
|
||||
}
|
||||
|
||||
.login-dialog-prompt-label {
|
||||
color: darken($osd_fg_color, 20%);
|
||||
@include fontsize($base_font_size + 1);
|
||||
padding-top: 1em;
|
||||
}
|
||||
|
||||
.login-dialog {
|
||||
StEntry {
|
||||
@if $variant=='dark' {
|
||||
$_gdm_entry_bg: darken($system_bg_color, 3%);
|
||||
background-color: $_gdm_entry_bg;
|
||||
color: $fg_color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Custom styling for unlock entry
|
||||
.unlock-dialog {
|
||||
StEntry {
|
||||
border:none !important;
|
||||
&:focus {
|
||||
background-color: transparentize($fg_color, 0.9);
|
||||
}
|
||||
&:insensitive {
|
||||
color: transparentize($fg_color, 0.5);
|
||||
background-color: transparentize($fg_color, 0.95);
|
||||
}
|
||||
}
|
||||
|
||||
.cancel-button,
|
||||
.switch-user-button,
|
||||
.login-dialog-session-list-button {
|
||||
border-color: transparent;
|
||||
background-color: transparentize($fg_color, 0.9);
|
||||
}
|
||||
}
|
||||
@@ -1,142 +0,0 @@
|
||||
/* Looking Glass */
|
||||
|
||||
// Dialog
|
||||
#LookingGlassDialog {
|
||||
background-color: $osd_bg_color;
|
||||
border-radius: 0 0 $modal_radius $modal_radius;
|
||||
border-top-width: 0;
|
||||
border: 1px solid $osd_outer_borders_color;
|
||||
color: $osd_fg_color;
|
||||
padding: $base_padding;
|
||||
spacing: $base_padding;
|
||||
box-shadow: 0 2px 4px 0 rgba(0,0,0,0.1);
|
||||
|
||||
& > #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;
|
||||
|
||||
font-weight: bold;
|
||||
padding: $base_padding $base_padding*2;
|
||||
color: darken($osd_fg_color, 15%);
|
||||
transition-duration: 100ms;
|
||||
box-shadow:none;
|
||||
border:none;
|
||||
border-radius: $base_border_radius - 2px;
|
||||
background-color: transparent;
|
||||
|
||||
&:hover {
|
||||
color: $osd_fg_color;
|
||||
background-color: transparentize($osd_fg_color, 0.95);
|
||||
}
|
||||
|
||||
&:selected {
|
||||
color: $osd_fg_color;
|
||||
background-color: transparentize($osd_fg_color, 0.9);
|
||||
}
|
||||
}
|
||||
|
||||
StBoxLayout#EvalBox { padding: 4px; spacing: $base_padding; padding: $base_padding; }
|
||||
StBoxLayout#ResultsArea { spacing: $base_padding; padding: $base_padding; }
|
||||
}
|
||||
|
||||
.lg-dialog {
|
||||
|
||||
StEntry {
|
||||
background-color: transparentize(lighten($osd_bg_color, 5%), 0.4);
|
||||
color: $osd_fg_color;
|
||||
border-color: transparentize($osd_fg_color, 0.8);
|
||||
min-height: 22px;
|
||||
selection-background-color: $selected_bg_color;
|
||||
selected-color: $selected_fg_color;
|
||||
}
|
||||
|
||||
.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%); }
|
||||
}
|
||||
}
|
||||
|
||||
.lg-completions-text {
|
||||
@extend %caption;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.lg-obj-inspector-title {
|
||||
spacing: $base_padding;
|
||||
}
|
||||
|
||||
.lg-obj-inspector-button {
|
||||
border: 1px solid $osd_borders_color;
|
||||
padding: 4px;
|
||||
border-radius: $base_border_radius;
|
||||
&:hover { border: 1px solid #ffffff; }
|
||||
}
|
||||
|
||||
// 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: $osd_bg_color;
|
||||
border: 1px solid $osd_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;
|
||||
}
|
||||
@@ -1,176 +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);}
|
||||
}
|
||||
|
||||
// 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;
|
||||
|
||||
// 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%); }
|
||||
|
||||
// fix margin for last button
|
||||
&:last-child:ltr { margin-right: $base_margin*3; }
|
||||
&:last-child:rtl { margin-left: $base_margin*3; }
|
||||
}
|
||||
|
||||
// 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
|
||||
}
|
||||
}
|
||||
@@ -1,65 +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
|
||||
&:hover {
|
||||
color: lighten($osd_fg_color,30%);
|
||||
}
|
||||
|
||||
& 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 {
|
||||
border: 2px $osd_fg_color;
|
||||
}
|
||||
}
|
||||
|
||||
.user-widget.vertical .user-icon {
|
||||
icon-size: $base_icon_size * 6; // 128px
|
||||
|
||||
& StIcon {
|
||||
padding: $base_padding * 3 + 2px; // 20px
|
||||
padding-top: $base_padding * 3; // 18 px
|
||||
padding-bottom: $base_padding * 3 + 4px; // 22px
|
||||
width: $base_icon_size * 5.5; height: $base_icon_size * 5.5; // 88px;
|
||||
}
|
||||
}
|
||||
|
||||
.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;
|
||||
}
|
||||
@@ -1,48 +0,0 @@
|
||||
/* Select Network dialogs */
|
||||
.nm-dialog {
|
||||
max-height: 34em;
|
||||
min-height: 31em;
|
||||
min-width: 32em;
|
||||
}
|
||||
|
||||
.nm-dialog-content {
|
||||
spacing: 20px;
|
||||
padding: 24px;
|
||||
}
|
||||
|
||||
.nm-dialog-header { @extend %heading; }
|
||||
.nm-dialog-subheader { color: $insensitive_fg_color;}
|
||||
.nm-dialog-header-icon { icon-size: $large_icon_size;}
|
||||
.nm-dialog-header-hbox { spacing: 10px; }
|
||||
|
||||
.nm-dialog-scroll-view {
|
||||
padding:$base_padding;
|
||||
border-radius: $base_border_radius;
|
||||
background-color: $base_color;
|
||||
}
|
||||
|
||||
.nm-dialog-item {
|
||||
padding: $base_padding * 2;
|
||||
|
||||
&:selected {
|
||||
background-color: $selected_bg_color;
|
||||
border-radius: $base_border_radius - 3px;
|
||||
color: $selected_fg_color;
|
||||
}
|
||||
&:hover { background-color:$hover_bg_color;}
|
||||
}
|
||||
|
||||
.nm-dialog-icon { icon-size: $base_icon_size; }
|
||||
.nm-dialog-icons { spacing: $base_padding * 2; }
|
||||
|
||||
// no networks
|
||||
.no-networks-box { spacing: $base_padding; }
|
||||
.no-networks-label { color: $insensitive_fg_color; }
|
||||
|
||||
// airplane mode
|
||||
.nm-dialog-airplane-box {
|
||||
text-align: center;
|
||||
spacing: 12px;
|
||||
}
|
||||
.nm-dialog-airplane-headline { @extend %title_3;}
|
||||
.nm-dialog-airplane-text { color: $insensitive_fg_color;}
|
||||
@@ -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 rgba(0,0,0,0.1);
|
||||
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; }
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -1,208 +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;
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
&: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);
|
||||
}
|
||||
}
|
||||
|
||||
&: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);
|
||||
}
|
||||
}
|
||||
|
||||
// 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);
|
||||
}
|
||||
}
|
||||
|
||||
&: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);
|
||||
}
|
||||
}
|
||||
|
||||
&: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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.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;
|
||||
}
|
||||
}
|
||||
@@ -1,204 +0,0 @@
|
||||
/* Popovers/Menus */
|
||||
|
||||
// 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;
|
||||
border-radius: $modal_radius - 2px;
|
||||
border: 1px solid $borders_edge;
|
||||
box-shadow: 0 2px 4px 0 rgba(0,0,0,0.1);
|
||||
background-color: $bg_color;
|
||||
}
|
||||
|
||||
// menu items
|
||||
.popup-menu-item {
|
||||
padding: $base_padding*1.5 $base_padding*2;
|
||||
border-radius: $base_border_radius;
|
||||
spacing: $base_padding;
|
||||
transition: 0.2s all ease;
|
||||
background-color: transparent;
|
||||
|
||||
&:ltr {padding-left: $base_padding;}
|
||||
&:rtl {padding-right: $base_padding;}
|
||||
|
||||
&:focus, &:hover {
|
||||
background-color: $hover_bg_color !important;
|
||||
&:active { background-color: $active_bg_color !important;}
|
||||
}
|
||||
|
||||
&:checked {background-color: $checked_bg_color !important;}
|
||||
|
||||
&:checked {
|
||||
margin-bottom: 0;
|
||||
box-shadow: inset 0 -1px 0 0 darken($checked_bg_color, 5%);
|
||||
border-radius: $base_border_radius $base_border_radius 0 0;
|
||||
&:focus,&:hover { background-color: lighten($checked_bg_color, 3%) !important;}
|
||||
&:active { background-color: lighten($checked_bg_color, 5%) !important;}
|
||||
}
|
||||
|
||||
&:active {
|
||||
background-color: lighten($active_bg_color, 5%);
|
||||
color: $active_fg_color;
|
||||
}
|
||||
|
||||
&:insensitive {color: transparentize($fg_color,0.5);}
|
||||
|
||||
// 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
|
||||
}
|
||||
|
||||
.popup-menu-arrow {
|
||||
}
|
||||
|
||||
|
||||
// popover submenus
|
||||
.popup-sub-menu {
|
||||
background-color: $checked_bg_color;
|
||||
border-radius: 0 0 $base_border_radius $base_border_radius;
|
||||
|
||||
.popup-menu-ornament {
|
||||
min-width: $base_icon_size !important;
|
||||
}
|
||||
|
||||
// submenu specific styles
|
||||
.popup-menu-item {
|
||||
border-radius: 0;
|
||||
margin: 0;
|
||||
|
||||
&:last-child {
|
||||
border-radius: 0 0 $base_border_radius $base_border_radius;
|
||||
}
|
||||
|
||||
&:focus,&:hover { background-color: lighten($hover_bg_color, 10%) !important;}
|
||||
&:checked {
|
||||
background-color: lighten($checked_bg_color, 10%) !important;
|
||||
&:focus,&:hover { background-color: lighten($checked_bg_color, 8%) !important;}
|
||||
}
|
||||
&:active { background-color: lighten($active_bg_color, 10%) !important;}
|
||||
}
|
||||
|
||||
.popup-menu-section {
|
||||
.popup-menu-item:last-child {
|
||||
&:hover,&:focus { border-radius: 0;}
|
||||
}
|
||||
&:last-child .popup-menu-item:last-child {
|
||||
border-radius: 0 0 $base_border_radius $base_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 {
|
||||
margin: 6px 0;
|
||||
padding:0 !important;
|
||||
&:ltr { margin-right: $base_margin;}
|
||||
&:rtl { margin-left: $base_margin;}
|
||||
|
||||
.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: lighten($borders_color, 7%);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// desktop background menu
|
||||
.background-menu {
|
||||
-boxpointer-gap: 0px;
|
||||
-arrow-rise: 0px; // hide the beak on the menu
|
||||
}
|
||||
|
||||
// system status menu
|
||||
.aggregate-menu {
|
||||
min-width: 22em;
|
||||
|
||||
// this is unneeded at the top-level in this menu, hide it
|
||||
.popup-menu-ornament { width: 0 !important; }
|
||||
|
||||
// lock screen, shutdown, etc. buttons
|
||||
.popup-menu-icon {
|
||||
-st-icon-style: symbolic;
|
||||
&:ltr {margin-right: $base_margin*2;}
|
||||
&:rtl {margin-left: $base_margin*2;}
|
||||
}
|
||||
|
||||
// account for ornaments in submenus with padding
|
||||
.popup-sub-menu .popup-menu-item > :first-child {
|
||||
// this value is hardcoded for visual effect
|
||||
&:ltr { margin-left: 1em;}
|
||||
&:rtl { margin-right: 1em;}
|
||||
}
|
||||
}
|
||||
|
||||
// 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;}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,76 +0,0 @@
|
||||
/* Screen Shield */
|
||||
|
||||
.unlock-dialog-clock {
|
||||
color: white;
|
||||
font-weight: 300;
|
||||
text-align: center;
|
||||
spacing: 24px;
|
||||
padding-bottom: 2.5em;
|
||||
}
|
||||
|
||||
.unlock-dialog-clock-time {
|
||||
font-size: 64pt;
|
||||
padding-top: 42px;
|
||||
@extend %numeric;
|
||||
}
|
||||
|
||||
.unlock-dialog-clock-date {
|
||||
font-size: 16pt;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.unlock-dialog-clock-hint {
|
||||
font-weight: normal;
|
||||
padding-top: 48px;
|
||||
}
|
||||
|
||||
.unlock-dialog-notifications-container {
|
||||
margin: 12px;
|
||||
spacing: 6px;
|
||||
width: 23em;
|
||||
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($osd_fg_color,0.9);
|
||||
color: $osd_fg_color;
|
||||
border-radius: $modal_radius;
|
||||
|
||||
&.critical { background-color: transparentize($osd_fg_color,0.8) }
|
||||
}
|
||||
}
|
||||
|
||||
.unlock-dialog-notification-label {
|
||||
padding: 0 0 0 12px;
|
||||
}
|
||||
|
||||
.unlock-dialog-notification-count-text {
|
||||
font-weight: bold;
|
||||
padding: 0 12px;
|
||||
color: $osd_fg_color;
|
||||
background-color: transparentize($osd_fg_color, 0.9);
|
||||
border-radius: 99px;
|
||||
}
|
||||
|
||||
.screen-shield-background { //just the shadow, really
|
||||
background: black;
|
||||
box-shadow: 0 2px 4px rgba(0,0,0,0.6);
|
||||
}
|
||||
|
||||
#lockDialogGroup {
|
||||
background-color: $system_bg_color;
|
||||
}
|
||||
#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); }
|
||||
}
|
||||
}
|
||||
@@ -1,201 +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
|
||||
&.left { margin-left: 8px;}
|
||||
&.right { margin-right: 8px;}
|
||||
}
|
||||
|
||||
.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: $hover_bg_color;
|
||||
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($hover_bg_color, 5%);}
|
||||
&:active { background-color: lighten($active_bg_color,5%);}
|
||||
&:checked { background-color: white;color: black;}
|
||||
|
||||
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;
|
||||
}
|
||||
@@ -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%);}
|
||||
}
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
// Search entry
|
||||
|
||||
$search_entry_width: 320px;
|
||||
$search_entry_height: 36px;
|
||||
|
||||
%search_entry,
|
||||
.search-entry {
|
||||
border-radius: $search_entry_height * 0.5; // half the height
|
||||
|
||||
margin-top: $base_padding * 2;
|
||||
margin-bottom: $base_padding;
|
||||
padding: $base_padding+1 $base_padding+3;
|
||||
width: $search_entry_width;
|
||||
|
||||
@include entry(normal);
|
||||
&:hover { @include entry(hover);}
|
||||
&:focus { @include entry(focus);}
|
||||
&:insensitive { @include entry(insensitive);}
|
||||
|
||||
.search-entry-icon {
|
||||
color: inherit;
|
||||
icon-size: $base_icon_size;
|
||||
margin-top: 2px; // center vertically
|
||||
padding: 0 4px;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
border: 1px solid $osd_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;
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -1,72 +0,0 @@
|
||||
/* App Switcher */
|
||||
|
||||
// same as dash
|
||||
$switcher_padding: $base_padding + 4px; // 10px
|
||||
$switcher_border_radius: $modal_radius + 8px;
|
||||
|
||||
|
||||
// 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: $switcher_border_radius;
|
||||
box-shadow: 0 8px 8px 0 rgba(0,0,0,0.1);
|
||||
|
||||
// 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;}
|
||||
}
|
||||
|
||||
.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;
|
||||
}
|
||||
@@ -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"));
|
||||
}
|
||||
}
|
||||
@@ -1,52 +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: darken(transparentize($osd_bg_color, .05), 3%);
|
||||
$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 {
|
||||
color: $osd_fg_color;
|
||||
background-color: $osd_bg_color;
|
||||
border-radius: 99px;
|
||||
padding: $base_padding $base_padding * 2;
|
||||
}
|
||||
|
||||
// Close button
|
||||
.window-close {
|
||||
background-color: $window_close_button_color;
|
||||
color: $osd_fg_color;
|
||||
border-radius: 99px;
|
||||
padding: $window_close_button_padding;
|
||||
height: $window_close_button_size;
|
||||
width: $window_close_button_size;
|
||||
transition-duration: 300ms;
|
||||
|
||||
& StIcon { icon-size: 24px; } // uses non standard icon size
|
||||
|
||||
&:hover {
|
||||
background-color: mix($osd_fg_color, $window_close_button_color, 15%);
|
||||
}
|
||||
|
||||
&:active {
|
||||
color: transparentize($osd_fg_color, 0.2);
|
||||
background-color: darken($window_close_button_color, 5%);
|
||||
}
|
||||
}
|
||||
|
||||
.workspace-background {
|
||||
// keep in sync with BACKGROUND_CORNER_RADIUS_PIXELS in workspace.js
|
||||
border-radius: 30px;
|
||||
box-shadow: 0 4px 16px 4px transparentize(darken($osd_bg_color, 30%), 0.7);
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
/* Workspace pager */
|
||||
|
||||
// thumbnails in overview
|
||||
.workspace-thumbnails {
|
||||
visible-width: 32px; //amount visible before hover
|
||||
spacing: $base_padding;
|
||||
padding: $base_padding;
|
||||
|
||||
.workspace-thumbnail {
|
||||
@extend %overview_panel;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
// 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: 3px;
|
||||
padding: 0px;
|
||||
// background-color: transparentize($selected_bg_color, 0.9);
|
||||
}
|
||||
@@ -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-dialog.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/_network-dialog.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/_screen-shield.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)
|
||||
|
||||
79
debian/changelog
vendored
79
debian/changelog
vendored
@@ -1,10 +1,83 @@
|
||||
gnome-shell-extensions (42.3-0ubuntu1) jammy; urgency=medium
|
||||
gnome-shell-extensions (45~beta-1) experimental; urgency=medium
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- Jeremy Bícha <jbicha@ubuntu.com> Mon, 21 Aug 2023 10:17:23 -0400
|
||||
|
||||
gnome-shell-extensions (44.0-2) unstable; urgency=medium
|
||||
|
||||
* Team upload
|
||||
* Upload to unstable (part of transition: #1043144)
|
||||
|
||||
-- Simon McVittie <smcv@debian.org> Sun, 20 Aug 2023 23:04:08 +0100
|
||||
|
||||
gnome-shell-extensions (44.0-1) experimental; urgency=medium
|
||||
|
||||
* New upstream release
|
||||
* debian/control.in: Bump minimum meson to 0.58.0
|
||||
* debian/control.in: Build-Depend on libglib2.0-bin
|
||||
|
||||
-- Jeremy Bicha <jbicha@ubuntu.com> Mon, 27 Mar 2023 08:50:32 -0400
|
||||
|
||||
gnome-shell-extensions (44~rc-1) experimental; urgency=medium
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- Jeremy Bicha <jbicha@ubuntu.com> Tue, 07 Mar 2023 12:20:00 -0500
|
||||
|
||||
gnome-shell-extensions (44~beta-1) experimental; urgency=medium
|
||||
|
||||
[ Jeremy Bicha ]
|
||||
* New upstream release
|
||||
|
||||
[ Debian Janitor ]
|
||||
* Remove constraints unnecessary since buster (oldstable)
|
||||
|
||||
-- Jeremy Bicha <jbicha@ubuntu.com> Wed, 15 Feb 2023 11:01:26 -0500
|
||||
|
||||
gnome-shell-extensions (43.1-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- Jeremy Bicha <jbicha@ubuntu.com> Tue, 22 Nov 2022 14:14:48 -0500
|
||||
|
||||
gnome-shell-extensions (43.0-2) unstable; urgency=medium
|
||||
|
||||
* Release to unstable
|
||||
|
||||
-- Jeremy Bicha <jbicha@ubuntu.com> Tue, 27 Sep 2022 19:13:41 -0400
|
||||
|
||||
gnome-shell-extensions (43.0-1) experimental; urgency=medium
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- Jeremy Bicha <jbicha@ubuntu.com> Mon, 19 Sep 2022 10:57:41 -0400
|
||||
|
||||
gnome-shell-extensions (43~rc-1) experimental; urgency=medium
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- Jeremy Bicha <jbicha@ubuntu.com> Tue, 06 Sep 2022 14:39:00 -0400
|
||||
|
||||
gnome-shell-extensions (43~beta-1) experimental; urgency=medium
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- Jeremy Bicha <jbicha@ubuntu.com> Sun, 21 Aug 2022 10:59:20 -0400
|
||||
|
||||
gnome-shell-extensions (42.3-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release (LP: #1981606)
|
||||
|
||||
-- Jeremy Bicha <jbicha@ubuntu.com> Wed, 13 Jul 2022 17:52:33 +0200
|
||||
-- Jeremy Bicha <jbicha@ubuntu.com> Wed, 13 Jul 2022 17:49:05 +0200
|
||||
|
||||
gnome-shell-extensions (42.1-0ubuntu1) jammy; urgency=medium
|
||||
gnome-shell-extensions (42.2-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- Jeremy Bicha <jbicha@ubuntu.com> Fri, 03 Jun 2022 09:23:28 -0400
|
||||
|
||||
gnome-shell-extensions (42.1-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release (LP: #1972365)
|
||||
|
||||
|
||||
14
debian/control
vendored
14
debian/control
vendored
@@ -5,19 +5,17 @@
|
||||
Source: gnome-shell-extensions
|
||||
Section: gnome
|
||||
Priority: optional
|
||||
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
|
||||
XSBC-Original-Maintainer: Debian GNOME Maintainers <pkg-gnome-maintainers@lists.alioth.debian.org>
|
||||
Uploaders: Iain Lane <laney@debian.org>, Jeremy Bicha <jbicha@ubuntu.com>, Laurent Bigonville <bigon@debian.org>
|
||||
Maintainer: Debian GNOME Maintainers <pkg-gnome-maintainers@lists.alioth.debian.org>
|
||||
Uploaders: Iain Lane <laney@debian.org>, Laurent Bigonville <bigon@debian.org>, Marco Trevisan (Treviño) <marco@ubuntu.com>
|
||||
Build-Depends: debhelper-compat (= 13),
|
||||
dh-sequence-gnome (>= 0.22),
|
||||
meson (>= 0.53.0),
|
||||
libglib2.0-bin,
|
||||
meson (>= 0.58.0),
|
||||
sassc
|
||||
Rules-Requires-Root: no
|
||||
Standards-Version: 4.6.0
|
||||
XS-Debian-Vcs-Browser: https://salsa.debian.org/gnome-team/gnome-shell-extensions
|
||||
XS-Debian-Vcs-Git: https://salsa.debian.org/gnome-team/gnome-shell-extensions.git
|
||||
Vcs-Browser: https://salsa.debian.org/gnome-team/gnome-shell-extensions/tree/ubuntu/jammy
|
||||
Vcs-Git: https://salsa.debian.org/gnome-team/gnome-shell-extensions.git -b ubuntu/jammy
|
||||
Vcs-Browser: https://salsa.debian.org/gnome-team/gnome-shell-extensions
|
||||
Vcs-Git: https://salsa.debian.org/gnome-team/gnome-shell-extensions.git
|
||||
Homepage: https://wiki.gnome.org/Projects/GnomeShell/Extensions
|
||||
|
||||
Package: gnome-shell-extensions
|
||||
|
||||
12
debian/control.in
vendored
12
debian/control.in
vendored
@@ -1,19 +1,17 @@
|
||||
Source: gnome-shell-extensions
|
||||
Section: gnome
|
||||
Priority: optional
|
||||
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
|
||||
XSBC-Original-Maintainer: Debian GNOME Maintainers <pkg-gnome-maintainers@lists.alioth.debian.org>
|
||||
Maintainer: Debian GNOME Maintainers <pkg-gnome-maintainers@lists.alioth.debian.org>
|
||||
Uploaders: @GNOME_TEAM@
|
||||
Build-Depends: debhelper-compat (= 13),
|
||||
dh-sequence-gnome (>= 0.22),
|
||||
meson (>= 0.53.0),
|
||||
libglib2.0-bin,
|
||||
meson (>= 0.58.0),
|
||||
sassc
|
||||
Rules-Requires-Root: no
|
||||
Standards-Version: 4.6.0
|
||||
XS-Debian-Vcs-Browser: https://salsa.debian.org/gnome-team/gnome-shell-extensions
|
||||
XS-Debian-Vcs-Git: https://salsa.debian.org/gnome-team/gnome-shell-extensions.git
|
||||
Vcs-Browser: https://salsa.debian.org/gnome-team/gnome-shell-extensions/tree/ubuntu/jammy
|
||||
Vcs-Git: https://salsa.debian.org/gnome-team/gnome-shell-extensions.git -b ubuntu/jammy
|
||||
Vcs-Browser: https://salsa.debian.org/gnome-team/gnome-shell-extensions
|
||||
Vcs-Git: https://salsa.debian.org/gnome-team/gnome-shell-extensions.git
|
||||
Homepage: https://wiki.gnome.org/Projects/GnomeShell/Extensions
|
||||
|
||||
Package: gnome-shell-extensions
|
||||
|
||||
3
debian/gbp.conf
vendored
3
debian/gbp.conf
vendored
@@ -1,7 +1,6 @@
|
||||
[DEFAULT]
|
||||
pristine-tar = True
|
||||
debian-branch = ubuntu/jammy
|
||||
debian-tag = ubuntu/%(version)s
|
||||
debian-branch = debian/latest
|
||||
upstream-branch = upstream/latest
|
||||
|
||||
[buildpackage]
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#!/bin/sh
|
||||
#!/bin/bash
|
||||
|
||||
srcdir=`dirname $0`
|
||||
srcdir=`(cd $srcdir && pwd)`
|
||||
|
||||
@@ -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 Signals = imports.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;
|
||||
@@ -117,7 +118,7 @@ class CategoryMenuItem extends PopupMenu.PopupBaseMenuItem {
|
||||
else
|
||||
name = _('Favorites');
|
||||
|
||||
this.add_child(new St.Label({ text: name }));
|
||||
this.add_child(new St.Label({text: name}));
|
||||
this.connect('motion-event', this._onMotionEvent.bind(this));
|
||||
this.connect('notify::active', this._onActiveChanged.bind(this));
|
||||
}
|
||||
@@ -239,8 +240,10 @@ class ApplicationsMenu extends PopupMenu.PopupMenu {
|
||||
}
|
||||
}
|
||||
|
||||
class DesktopTarget {
|
||||
class DesktopTarget extends EventEmitter {
|
||||
constructor() {
|
||||
super();
|
||||
|
||||
this._desktop = null;
|
||||
this._desktopDestroyedId = 0;
|
||||
|
||||
@@ -267,9 +270,7 @@ class DesktopTarget {
|
||||
|
||||
_setDesktop(desktop) {
|
||||
if (this._desktop) {
|
||||
this._desktop.disconnect(this._desktopDestroyedId);
|
||||
this._desktopDestroyedId = 0;
|
||||
|
||||
this._desktop.disconnectObject(this);
|
||||
delete this._desktop._delegate;
|
||||
}
|
||||
|
||||
@@ -277,9 +278,9 @@ class DesktopTarget {
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -319,10 +320,7 @@ class DesktopTarget {
|
||||
}
|
||||
|
||||
destroy() {
|
||||
if (this._windowAddedId)
|
||||
global.window_group.disconnect(this._windowAddedId);
|
||||
this._windowAddedId = 0;
|
||||
|
||||
global.window_group.disconnectObject(this);
|
||||
this._setDesktop(null);
|
||||
}
|
||||
|
||||
@@ -357,7 +355,6 @@ class DesktopTarget {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
Signals.addSignalMethods(DesktopTarget.prototype);
|
||||
|
||||
class ApplicationsButton extends PanelMenu.Button {
|
||||
static {
|
||||
@@ -385,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());
|
||||
@@ -408,16 +404,16 @@ 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 = new GMenu.Tree({menu_basename: 'applications.menu'});
|
||||
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() {
|
||||
@@ -441,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');
|
||||
|
||||
@@ -509,7 +501,7 @@ class ApplicationsButton extends PanelMenu.Button {
|
||||
}
|
||||
let app = appSys.lookup_app(id);
|
||||
if (!app)
|
||||
app = new Shell.App({ app_info: entry.get_app_info() });
|
||||
app = new Shell.App({app_info: entry.get_app_info()});
|
||||
if (app.get_app_info().should_show())
|
||||
this.applicationsByCategory[categoryId].push(app);
|
||||
} else if (nextType === GMenu.TreeItemType.SEPARATOR) {
|
||||
@@ -555,8 +547,8 @@ class ApplicationsButton extends PanelMenu.Button {
|
||||
_createLayout() {
|
||||
let section = new PopupMenu.PopupMenuSection();
|
||||
this.menu.addMenuItem(section);
|
||||
this.mainBox = new St.BoxLayout({ vertical: false });
|
||||
this.leftBox = new St.BoxLayout({ vertical: true });
|
||||
this.mainBox = new St.BoxLayout({vertical: false});
|
||||
this.leftBox = new St.BoxLayout({vertical: true});
|
||||
this.applicationsScrollBox = new St.ScrollView({
|
||||
style_class: 'apps-menu vfade',
|
||||
x_expand: true,
|
||||
@@ -578,9 +570,9 @@ class ApplicationsButton extends PanelMenu.Button {
|
||||
vscroll.connect('scroll-stop', () => (this.menu.passEvents = false));
|
||||
this.leftBox.add_child(this.categoriesScrollBox);
|
||||
|
||||
this.applicationsBox = new St.BoxLayout({ vertical: true });
|
||||
this.applicationsBox = new St.BoxLayout({vertical: true});
|
||||
this.applicationsScrollBox.add_actor(this.applicationsBox);
|
||||
this.categoriesBox = new St.BoxLayout({ vertical: true });
|
||||
this.categoriesBox = new St.BoxLayout({vertical: true});
|
||||
this.categoriesScrollBox.add_actor(this.categoriesBox);
|
||||
|
||||
this.mainBox.add(this.leftBox);
|
||||
@@ -676,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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 */
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
@@ -75,7 +77,7 @@ class RulesList extends GObject.Object {
|
||||
append(appInfo) {
|
||||
const pos = this.#rules.length;
|
||||
|
||||
this.#rules.push(new Rule({ appInfo }));
|
||||
this.#rules.push(new Rule({appInfo}));
|
||||
this.#saveRules();
|
||||
|
||||
this.items_changed(pos, 0, 1);
|
||||
@@ -97,7 +99,7 @@ class RulesList extends GObject.Object {
|
||||
if (pos < 0)
|
||||
return;
|
||||
|
||||
this.#rules[pos].set({ workspace });
|
||||
this.#rules[pos].set({workspace});
|
||||
this.#saveRules();
|
||||
}
|
||||
|
||||
@@ -116,7 +118,7 @@ class RulesList extends GObject.Object {
|
||||
const [id, workspace] = stringRule.split(':');
|
||||
const appInfo = Gio.DesktopAppInfo.new(id);
|
||||
if (appInfo)
|
||||
this.#rules.push(new Rule({ appInfo, workspace }));
|
||||
this.#rules.push(new Rule({appInfo, workspace}));
|
||||
else
|
||||
log(`Invalid ID ${id}`);
|
||||
}
|
||||
@@ -147,15 +149,16 @@ 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 });
|
||||
const store = new Gio.ListStore({item_type: Gio.ListModel});
|
||||
const listModel = new Gtk.FlattenListModel({model: store});
|
||||
store.append(this._rules);
|
||||
store.append(new NewItemModel());
|
||||
|
||||
@@ -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;
|
||||
@@ -248,7 +251,7 @@ class RuleRow extends Adw.ActionRow {
|
||||
}
|
||||
|
||||
constructor(rule) {
|
||||
const { appInfo } = rule;
|
||||
const {appInfo} = rule;
|
||||
const id = appInfo.get_id();
|
||||
|
||||
super({
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
@@ -142,7 +136,7 @@ class DriveMenu extends PanelMenu.Button {
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super(0.0, _('Removable devices'));
|
||||
super(0.5, _('Removable devices'));
|
||||
|
||||
let icon = new St.Icon({
|
||||
icon_name: 'media-eject-symbolic',
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
36
extensions/light-style/extension.js
Normal file
36
extensions/light-style/extension.js
Normal file
@@ -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 <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* 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);
|
||||
}
|
||||
}
|
||||
5
extensions/light-style/meson.build
Normal file
5
extensions/light-style/meson.build
Normal file
@@ -0,0 +1,5 @@
|
||||
extension_data += configure_file(
|
||||
input: metadata_name + '.in',
|
||||
output: metadata_name,
|
||||
configuration: metadata_conf
|
||||
)
|
||||
10
extensions/light-style/metadata.json.in
Normal file
10
extensions/light-style/metadata.json.in
Normal file
@@ -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@"
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
@@ -91,7 +81,7 @@ class PlacesMenu extends PanelMenu.Button {
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super(0.0, _('Places'));
|
||||
super(0.5, _('Places'));
|
||||
|
||||
let label = new St.Label({
|
||||
text: _('Places'),
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
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 Signals = imports.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');
|
||||
@@ -22,8 +23,10 @@ const Hostname1Iface = '<node> \
|
||||
</node>';
|
||||
const Hostname1 = Gio.DBusProxy.makeProxyWrapper(Hostname1Iface);
|
||||
|
||||
class PlaceInfo {
|
||||
class PlaceInfo extends EventEmitter {
|
||||
constructor(...params) {
|
||||
super();
|
||||
|
||||
this._init(...params);
|
||||
}
|
||||
|
||||
@@ -31,7 +34,7 @@ class PlaceInfo {
|
||||
this.kind = kind;
|
||||
this.file = file;
|
||||
this.name = name || this._getFileName();
|
||||
this.icon = icon ? new Gio.ThemedIcon({ name: icon }) : this.getIcon();
|
||||
this.icon = icon ? new Gio.ThemedIcon({name: icon}) : this.getIcon();
|
||||
}
|
||||
|
||||
destroy() {
|
||||
@@ -94,16 +97,16 @@ class PlaceInfo {
|
||||
// icon from the query info above
|
||||
switch (this.kind) {
|
||||
case 'network':
|
||||
return new Gio.ThemedIcon({ name: 'folder-remote-symbolic' });
|
||||
return new Gio.ThemedIcon({name: 'folder-remote-symbolic'});
|
||||
case 'devices':
|
||||
return new Gio.ThemedIcon({ name: 'drive-harddisk-symbolic' });
|
||||
return new Gio.ThemedIcon({name: 'drive-harddisk-symbolic'});
|
||||
case 'special':
|
||||
case 'bookmarks':
|
||||
default:
|
||||
if (!this.file.is_native())
|
||||
return new Gio.ThemedIcon({ name: 'folder-remote-symbolic' });
|
||||
return new Gio.ThemedIcon({name: 'folder-remote-symbolic'});
|
||||
else
|
||||
return new Gio.ThemedIcon({ name: 'folder-symbolic' });
|
||||
return new Gio.ThemedIcon({name: 'folder-symbolic'});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -118,7 +121,6 @@ class PlaceInfo {
|
||||
}
|
||||
}
|
||||
}
|
||||
Signals.addSignalMethods(PlaceInfo.prototype);
|
||||
|
||||
class RootInfo extends PlaceInfo {
|
||||
_init() {
|
||||
@@ -138,7 +140,7 @@ class RootInfo extends PlaceInfo {
|
||||
}
|
||||
|
||||
getIcon() {
|
||||
return new Gio.ThemedIcon({ name: 'drive-harddisk-symbolic' });
|
||||
return new Gio.ThemedIcon({name: 'drive-harddisk-symbolic'});
|
||||
}
|
||||
|
||||
_propertiesChanged(proxy) {
|
||||
@@ -246,8 +248,10 @@ const DEFAULT_DIRECTORIES = [
|
||||
GLib.UserDirectory.DIRECTORY_VIDEOS,
|
||||
];
|
||||
|
||||
var PlacesManager = class {
|
||||
export class PlacesManager extends EventEmitter {
|
||||
constructor() {
|
||||
super();
|
||||
|
||||
this._places = {
|
||||
special: [],
|
||||
devices: [],
|
||||
@@ -255,16 +259,26 @@ var PlacesManager = class {
|
||||
network: [],
|
||||
};
|
||||
|
||||
this._settings = new Gio.Settings({ schema_id: BACKGROUND_SCHEMA });
|
||||
this._showDesktopIconsChangedId = this._settings.connect(
|
||||
'changed::show-desktop-icons', this._updateSpecials.bind(this));
|
||||
this._settings = new Gio.Settings({schema_id: BACKGROUND_SCHEMA});
|
||||
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();
|
||||
@@ -289,34 +303,11 @@ var PlacesManager = class {
|
||||
}
|
||||
}
|
||||
|
||||
_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();
|
||||
@@ -542,5 +533,4 @@ var PlacesManager = class {
|
||||
get(kind) {
|
||||
return this._places[kind];
|
||||
}
|
||||
};
|
||||
Signals.addSignalMethods(PlacesManager.prototype);
|
||||
}
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
/* exported enable disable */
|
||||
/* Screenshot Window Sizer for Gnome Shell
|
||||
*
|
||||
* Copyright (c) 2013 Owen Taylor <otaylor@redhat.com>
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
super({ title: 'Themes' });
|
||||
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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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'));
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
@@ -120,27 +116,26 @@ class WindowTitle extends St.BoxLayout {
|
||||
|
||||
this._metaWindow = metaWindow;
|
||||
|
||||
this._icon = new St.Bin({ style_class: 'window-button-icon' });
|
||||
this._icon = new St.Bin({style_class: 'window-button-icon'});
|
||||
this.add(this._icon);
|
||||
this.label_actor = new St.Label({ y_align: Clutter.ActorAlign.CENTER });
|
||||
this.label_actor = new St.Label({y_align: Clutter.ActorAlign.CENTER});
|
||||
this.label_actor.clutter_text.single_line_mode = true;
|
||||
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() {
|
||||
@@ -250,7 +243,7 @@ class BaseButton extends St.Button {
|
||||
if (this._longPressTimeoutId)
|
||||
return;
|
||||
|
||||
const { longPressDuration } = Clutter.Settings.get_default();
|
||||
const {longPressDuration} = Clutter.Settings.get_default();
|
||||
this._longPressTimeoutId =
|
||||
GLib.timeout_add(GLib.PRIORITY_DEFAULT, longPressDuration, () => {
|
||||
delete this._longPressTimeoutId;
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -543,7 +526,7 @@ class AppButton extends BaseButton {
|
||||
this.app = app;
|
||||
this._updateVisibility();
|
||||
|
||||
let stack = new St.Widget({ layout_manager: new Clutter.BinLayout() });
|
||||
let stack = new St.Widget({layout_manager: new Clutter.BinLayout()});
|
||||
this.set_child(stack);
|
||||
|
||||
this._singleWindowTitle = new St.Bin({
|
||||
@@ -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',
|
||||
@@ -742,7 +721,7 @@ class WindowList extends St.Widget {
|
||||
this._perMonitor = perMonitor;
|
||||
this._monitor = monitor;
|
||||
|
||||
let box = new St.BoxLayout({ x_expand: true, y_expand: true });
|
||||
let box = new St.BoxLayout({x_expand: true, y_expand: true});
|
||||
this.add_actor(box);
|
||||
|
||||
let toggle = new WindowPickerToggle();
|
||||
@@ -751,7 +730,7 @@ class WindowList extends St.Widget {
|
||||
toggle.connect('notify::checked',
|
||||
this._updateWindowListVisibility.bind(this));
|
||||
|
||||
let layout = new Clutter.BoxLayout({ homogeneous: true });
|
||||
let layout = new Clutter.BoxLayout({homogeneous: true});
|
||||
this._windowList = new St.Widget({
|
||||
style_class: 'window-list',
|
||||
reactive: true,
|
||||
@@ -769,19 +748,19 @@ class WindowList extends St.Widget {
|
||||
});
|
||||
this._windowList.connect('scroll-event', this._onScrollEvent.bind(this));
|
||||
|
||||
let indicatorsBox = new St.BoxLayout({ x_align: Clutter.ActorAlign.END });
|
||||
let indicatorsBox = new St.BoxLayout({x_align: Clutter.ActorAlign.END});
|
||||
box.add(indicatorsBox);
|
||||
|
||||
this._workspaceIndicator = new WorkspaceIndicator();
|
||||
indicatorsBox.add_child(this._workspaceIndicator.container);
|
||||
|
||||
this._mutterSettings = new Gio.Settings({ schema_id: 'org.gnome.mutter' });
|
||||
this._workspacesOnlyOnPrimaryChangedId = this._mutterSettings.connect(
|
||||
this._mutterSettings = new Gio.Settings({schema_id: 'org.gnome.mutter'});
|
||||
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,9 +837,9 @@ class WindowList extends St.Widget {
|
||||
this._dndTimeoutId = 0;
|
||||
this._dndWindow = null;
|
||||
|
||||
this._settings = ExtensionUtils.getSettings();
|
||||
this._groupingModeChangedId = this._settings.connect(
|
||||
'changed::grouping-mode', this._groupingModeChanged.bind(this));
|
||||
this._settings = settings;
|
||||
this._settings.connect('changed::grouping-mode',
|
||||
() => this._groupingModeChanged());
|
||||
this._grouped = undefined;
|
||||
this._groupingModeChanged();
|
||||
}
|
||||
@@ -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,
|
||||
@@ -918,7 +897,7 @@ class WindowList extends St.Widget {
|
||||
|
||||
let children = this._windowList.get_children();
|
||||
let [, childWidth] = children[0].get_preferred_width(-1);
|
||||
let { spacing } = this._windowList.layout_manager;
|
||||
let {spacing} = this._windowList.layout_manager;
|
||||
|
||||
let workspace = global.workspace_manager.get_active_workspace();
|
||||
let windows = global.display.get_tab_list(Meta.TabList.NORMAL, workspace);
|
||||
@@ -1098,39 +1077,16 @@ 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.disconnect(this._groupingModeChangedId);
|
||||
this._settings.run_dispose();
|
||||
|
||||
let windows = global.get_window_actors();
|
||||
for (let i = 0; i < windows.length; i++)
|
||||
@@ -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),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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(
|
||||
@@ -37,12 +32,12 @@ class WindowListPrefsWidget extends Adw.PreferencesPage {
|
||||
this.add(groupingGroup);
|
||||
|
||||
const modes = [
|
||||
{ mode: 'never', title: _('Never group windows') },
|
||||
{ mode: 'auto', title: _('Group windows when space is limited') },
|
||||
{ mode: 'always', title: _('Always group windows') },
|
||||
{mode: 'never', title: _('Never group windows')},
|
||||
{mode: 'auto', title: _('Group windows when space is limited')},
|
||||
{mode: 'always', title: _('Always group windows')},
|
||||
];
|
||||
|
||||
for (const { mode, title } of modes) {
|
||||
for (const {mode, title} of modes) {
|
||||
const check = new Gtk.CheckButton({
|
||||
action_name: 'window-list.grouping-mode',
|
||||
action_target: new GLib.Variant('s', mode),
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
113
extensions/window-list/stylesheet-dark.css
Normal file
113
extensions/window-list/stylesheet-dark.css
Normal file
@@ -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;
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
@import url("stylesheet.css");
|
||||
@import url("stylesheet-dark.css");
|
||||
|
||||
#panel.bottom-panel {
|
||||
border-top-width: 1px;
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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,88 +74,11 @@ 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] },
|
||||
'open-state-changed': {param_types: [GObject.TYPE_BOOLEAN]},
|
||||
};
|
||||
|
||||
static {
|
||||
@@ -159,16 +86,16 @@ var WindowPicker = class WindowPicker extends Clutter.Actor {
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super({ reactive: true });
|
||||
super({reactive: true});
|
||||
|
||||
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;
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
@@ -25,24 +27,21 @@ class WindowPreview extends St.Button {
|
||||
});
|
||||
|
||||
this._delegate = this;
|
||||
DND.makeDraggable(this, { restoreOnSuccess: true });
|
||||
DND.makeDraggable(this, {restoreOnSuccess: true});
|
||||
|
||||
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,20 +234,16 @@ 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);
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super(0.0, _('Workspace Indicator'), true);
|
||||
super(0.5, _('Workspace Indicator'), true);
|
||||
this.setMenu(new PopupMenu.PopupMenu(this, 0.0, St.Side.BOTTOM));
|
||||
this.add_style_class_name('window-list-workspace-indicator');
|
||||
this.remove_style_class_name('panel-button');
|
||||
@@ -274,7 +259,7 @@ var WorkspaceIndicator = class WorkspaceIndicator extends PanelMenu.Button {
|
||||
let workspaceManager = global.workspace_manager;
|
||||
|
||||
this._currentWorkspace = workspaceManager.get_active_workspace_index();
|
||||
this._statusLabel = new St.Label({ text: this._getStatusText() });
|
||||
this._statusLabel = new St.Label({text: this._getStatusText()});
|
||||
|
||||
this._statusBin = new St.Bin({
|
||||
style_class: 'status-label-bin',
|
||||
@@ -295,39 +280,24 @@ 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();
|
||||
this._updateThumbnails();
|
||||
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 = new Gio.Settings({schema_id: 'org.gnome.desktop.wm.preferences'});
|
||||
this._settings.connectObject('changed::workspace-names',
|
||||
() => this._updateMenuLabels(), this);
|
||||
}
|
||||
|
||||
_updateThumbnailVisibility() {
|
||||
const { workspaceManager } = global;
|
||||
const {workspaceManager} = global;
|
||||
const vertical = workspaceManager.layout_rows === -1;
|
||||
const useMenu =
|
||||
vertical || workspaceManager.n_workspaces > MAX_THUMBNAILS;
|
||||
@@ -447,4 +417,4 @@ var WorkspaceIndicator = class WorkspaceIndicator extends PanelMenu.Button {
|
||||
let newIndex = this._currentWorkspace + diff;
|
||||
this._activate(newIndex);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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';
|
||||
@@ -30,24 +31,21 @@ class WindowPreview extends St.Button {
|
||||
});
|
||||
|
||||
this._delegate = this;
|
||||
DND.makeDraggable(this, { restoreOnSuccess: true });
|
||||
DND.makeDraggable(this, {restoreOnSuccess: true});
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -263,7 +247,7 @@ class WorkspaceIndicator extends PanelMenu.Button {
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super(0.0, _('Workspace Indicator'));
|
||||
super(0.5, _('Workspace Indicator'));
|
||||
|
||||
let container = new St.Widget({
|
||||
layout_manager: new Clutter.BinLayout(),
|
||||
@@ -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));
|
||||
@@ -310,28 +291,19 @@ class WorkspaceIndicator extends PanelMenu.Button {
|
||||
this._updateThumbnails();
|
||||
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 = new Gio.Settings({schema_id: WORKSPACE_SCHEMA});
|
||||
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();
|
||||
}
|
||||
|
||||
_updateThumbnailVisibility() {
|
||||
const { workspaceManager } = global;
|
||||
const {workspaceManager} = global;
|
||||
const vertical = workspaceManager.layout_rows === -1;
|
||||
const useMenu =
|
||||
vertical || workspaceManager.n_workspaces > MAX_THUMBNAILS;
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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';
|
||||
@@ -41,7 +43,7 @@ class WorkspacesList extends GObject.Object {
|
||||
GObject.registerClass(this);
|
||||
}
|
||||
|
||||
#settings = new Gio.Settings({ schema_id: WORKSPACE_SCHEMA });
|
||||
#settings = new Gio.Settings({schema_id: WORKSPACE_SCHEMA});
|
||||
#names = this.#settings.get_strv(WORKSPACE_KEY);
|
||||
#items = Gtk.StringList.new(this.#names);
|
||||
#changedId;
|
||||
@@ -131,8 +133,8 @@ class WorkspaceSettingsWidget extends Adw.PreferencesGroup {
|
||||
|
||||
this._workspaces = new WorkspacesList();
|
||||
|
||||
const store = new Gio.ListStore({ item_type: Gio.ListModel });
|
||||
const listModel = new Gtk.FlattenListModel({ model: store });
|
||||
const store = new Gio.ListStore({item_type: Gio.ListModel});
|
||||
const listModel = new Gtk.FlattenListModel({model: store});
|
||||
store.append(this._workspaces);
|
||||
store.append(new NewItemModel());
|
||||
|
||||
@@ -157,7 +159,7 @@ class WorkspaceRow extends Adw.PreferencesRow {
|
||||
}
|
||||
|
||||
constructor(name) {
|
||||
super({ name });
|
||||
super({name});
|
||||
|
||||
const box = new Gtk.Box({
|
||||
spacing: 12,
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -3,9 +3,12 @@ rules:
|
||||
- error
|
||||
- properties: never
|
||||
allow: [^vfunc_, ^on_]
|
||||
object-curly-spacing:
|
||||
consistent-return: error
|
||||
eqeqeq:
|
||||
- error
|
||||
- always
|
||||
- smart
|
||||
prefer-arrow-callback: error
|
||||
globals:
|
||||
global: readonly
|
||||
parserOptions:
|
||||
sourceType: module
|
||||
|
||||
24
meson.build
24
meson.build
@@ -1,6 +1,6 @@
|
||||
project('gnome-shell-extensions',
|
||||
version: '42.3',
|
||||
meson_version: '>= 0.53.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'
|
||||
@@ -93,7 +93,23 @@ endif
|
||||
subdir('extensions')
|
||||
subdir('po')
|
||||
|
||||
meson.add_dist_script('meson/generate-stylesheets.py')
|
||||
gnome.post_install(
|
||||
glib_compile_schemas: true,
|
||||
)
|
||||
|
||||
meson.add_dist_script('meson/check-version.py',
|
||||
meson.project_version(),
|
||||
'NEWS')
|
||||
|
||||
summary_options = {
|
||||
'extensions': enabled_extensions,
|
||||
'classic_mode': get_option('classic_mode'),
|
||||
}
|
||||
|
||||
summary_dirs = {
|
||||
'prefix': get_option('prefix'),
|
||||
'datadir': get_option('datadir'),
|
||||
}
|
||||
|
||||
summary(summary_dirs, section: 'Directories')
|
||||
summary(summary_options, section: 'Build Options')
|
||||
|
||||
@@ -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)
|
||||
99
po/ab.po
99
po/ab.po
@@ -6,9 +6,8 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell-extensions main\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/"
|
||||
"issues\n"
|
||||
"POT-Creation-Date: 2022-02-12 02:08+0000\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/issues\n"
|
||||
"POT-Creation-Date: 2022-07-10 12:54+0000\n"
|
||||
"PO-Revision-Date: 2022-02-12 02:08+0000\n"
|
||||
"Last-Translator: Нанба Наала <naala-nanba@rambler.ru>, 2022\n"
|
||||
"Language-Team: Abkhazian <ab@li.org>\n"
|
||||
@@ -34,11 +33,11 @@ msgstr "Аклассикатә GNOME Wayland аҟны"
|
||||
msgid "GNOME Classic on Xorg"
|
||||
msgstr "Аклассикатә GNOME Xorg аҟны"
|
||||
|
||||
#: extensions/apps-menu/extension.js:112
|
||||
#: extensions/apps-menu/extension.js:118
|
||||
msgid "Favorites"
|
||||
msgstr "Иалкаау"
|
||||
|
||||
#: extensions/apps-menu/extension.js:370
|
||||
#: extensions/apps-menu/extension.js:379
|
||||
msgid "Applications"
|
||||
msgstr "Аԥшьқәа"
|
||||
|
||||
@@ -50,29 +49,30 @@ msgstr "Аԥшьи аусуратә ҵакырақәа рыхьӡынҵеи"
|
||||
msgid ""
|
||||
"A list of strings, each containing an application id (desktop file name), "
|
||||
"followed by a colon and the workspace number"
|
||||
msgstr "Ацәаҳәақәа рыхьӡынҵа аиԥшрагәаҭага аԥшьы (desktop-фаил ахьӡ )"
|
||||
"змоу, зашьҭахь ҩ-кәаԥки аусуратә ҭыԥ аномери гылоу "
|
||||
msgstr ""
|
||||
"Ацәаҳәақәа рыхьӡынҵа аиԥшрагәаҭага аԥшьы (desktop-фаил ахьӡ )змоу, зашьҭахь "
|
||||
"ҩ-кәаԥки аусуратә ҭыԥ аномери гылоу "
|
||||
|
||||
#: extensions/auto-move-windows/prefs.js:19
|
||||
#: extensions/auto-move-windows/prefs.js:152
|
||||
msgid "Workspace Rules"
|
||||
msgstr "Аусуратә ҵакыра аԥҟаррақәа"
|
||||
|
||||
#: extensions/auto-move-windows/prefs.js:245
|
||||
#: extensions/auto-move-windows/prefs.js:306
|
||||
msgid "Add Rule"
|
||||
msgstr "Аԥҟара ацҵара"
|
||||
|
||||
#. TRANSLATORS: %s is the filesystem name
|
||||
#: extensions/drive-menu/extension.js:123
|
||||
#: extensions/drive-menu/extension.js:126
|
||||
#: extensions/places-menu/placeDisplay.js:210
|
||||
#, javascript-format
|
||||
msgid "Ejecting drive “%s” failed:"
|
||||
msgstr "Адиск «%s» аҭыгара залымшахеит:"
|
||||
|
||||
#: extensions/drive-menu/extension.js:139
|
||||
#: extensions/drive-menu/extension.js:145
|
||||
msgid "Removable devices"
|
||||
msgstr "Иаҿыҵуа аиҿартәырақәа"
|
||||
|
||||
#: extensions/drive-menu/extension.js:161
|
||||
#: extensions/drive-menu/extension.js:167
|
||||
msgid "Open Files"
|
||||
msgstr "Афаил аартра"
|
||||
|
||||
@@ -85,9 +85,11 @@ msgid ""
|
||||
"Try to use more screen for placing window thumbnails by adapting to screen "
|
||||
"aspect ratio, and consolidating them further to reduce the bounding box. "
|
||||
"This setting applies only with the natural placement strategy."
|
||||
msgstr "Шәхы иашәырхәа изыцҵоу аекран аҵакыра аминиатиура атыԥаркразы"
|
||||
"аекран аганқәа реизышәара ԥсахуа аҭыԥыркра шәыржәпала, анаҩс адаԥа ҳәаақәызҵо ашәагаа архәыҷразы"
|
||||
"ари ахышәара ахархәара аиуоит аминиатиура «natural» аҭыԥыркра алгоритм ахархәараан"
|
||||
msgstr ""
|
||||
"Шәхы иашәырхәа изыцҵоу аекран аҵакыра аминиатиура атыԥаркразыаекран аганқәа "
|
||||
"реизышәара ԥсахуа аҭыԥыркра шәыржәпала, анаҩс адаԥа ҳәаақәызҵо ашәагаа "
|
||||
"архәыҷразыари ахышәара ахархәара аиуоит аминиатиура «natural» аҭыԥыркра "
|
||||
"алгоритм ахархәараан"
|
||||
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:11
|
||||
msgid "Place window captions on top"
|
||||
@@ -98,12 +100,13 @@ msgid ""
|
||||
"If true, place window captions on top the respective thumbnail, overriding "
|
||||
"shell default of placing it at the bottom. Changing this setting requires "
|
||||
"restarting the shell to have any effect."
|
||||
msgstr "Иалхзар, ахқәа аминиатиура хыхьтәи ахәҭаҟны аҭыԥ ааныркылалоит"
|
||||
"(ишыҟоу еиԥш ахқәа ҵаҟатәи аҭыԥ ааныркылоит).Ари ахышәара аԥсахраан,"
|
||||
"уи аус аура иалагарцазы, иаҭахуп Shell аиҭарура."
|
||||
msgstr ""
|
||||
"Иалхзар, ахқәа аминиатиура хыхьтәи ахәҭаҟны аҭыԥ ааныркылалоит(ишыҟоу еиԥш "
|
||||
"ахқәа ҵаҟатәи аҭыԥ ааныркылоит).Ари ахышәара аԥсахраан,уи аус аура "
|
||||
"иалагарцазы, иаҭахуп Shell аиҭарура."
|
||||
|
||||
#: extensions/places-menu/extension.js:88
|
||||
#: extensions/places-menu/extension.js:91
|
||||
#: extensions/places-menu/extension.js:94
|
||||
#: extensions/places-menu/extension.js:97
|
||||
msgid "Places"
|
||||
msgstr "Аҭыԥқәа"
|
||||
|
||||
@@ -166,27 +169,27 @@ msgstr "Аиҭашьақәыргылара"
|
||||
msgid "Maximize"
|
||||
msgstr "Аиҵыхра"
|
||||
|
||||
#: extensions/window-list/extension.js:434
|
||||
#: extensions/window-list/extension.js:483
|
||||
msgid "Minimize all"
|
||||
msgstr "Зегьы реиҟәырҳәра"
|
||||
|
||||
#: extensions/window-list/extension.js:440
|
||||
#: extensions/window-list/extension.js:489
|
||||
msgid "Unminimize all"
|
||||
msgstr "Зегьы рырхынҳәра"
|
||||
|
||||
#: extensions/window-list/extension.js:446
|
||||
#: extensions/window-list/extension.js:495
|
||||
msgid "Maximize all"
|
||||
msgstr "Зегьы реиҵыхра"
|
||||
|
||||
#: extensions/window-list/extension.js:454
|
||||
#: extensions/window-list/extension.js:503
|
||||
msgid "Unmaximize all"
|
||||
msgstr "Зегьы реиҭашьақәыргылара"
|
||||
|
||||
#: extensions/window-list/extension.js:462
|
||||
#: extensions/window-list/extension.js:511
|
||||
msgid "Close all"
|
||||
msgstr "Зегьы рыркра"
|
||||
|
||||
#: extensions/window-list/extension.js:741
|
||||
#: extensions/window-list/extension.js:795
|
||||
msgid "Window List"
|
||||
msgstr "Аԥенџьырқәа рыхьӡынҵа"
|
||||
|
||||
@@ -198,18 +201,21 @@ msgstr "Аԥенџьырқәа аидыргәыԥлара анаҭаху"
|
||||
msgid ""
|
||||
"Decides when to group windows from the same application on the window list. "
|
||||
"Possible values are “never”, “auto” and “always”."
|
||||
msgstr "Иҳәаақәнаҵоит, ианаҭаху ԥшьык иаҵанакуа аԥенџьырқәа реидыргәыԥлара, аԥенџьырқәа рыхьӡынҵаҟны"
|
||||
" Иҟалар зылшо аҵакқәа : «never» — ахаан; «auto» — автоматла; «always» — есқьынгьы"
|
||||
msgstr ""
|
||||
"Иҳәаақәнаҵоит, ианаҭаху ԥшьык иаҵанакуа аԥенџьырқәа реидыргәыԥлара, "
|
||||
"аԥенџьырқәа рыхьӡынҵаҟны Иҟалар зылшо аҵакқәа : «never» — ахаан; «auto» — "
|
||||
"автоматла; «always» — есқьынгьы"
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20
|
||||
#: extensions/window-list/prefs.js:76
|
||||
#: extensions/window-list/prefs.js:79
|
||||
msgid "Show windows from all workspaces"
|
||||
msgstr "Аҵакырақәа зегьы рҟынтә аԥенџьырқәа раарԥшра"
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:21
|
||||
msgid "Whether to show windows from all workspaces or only the current one."
|
||||
msgstr
|
||||
"Аԥенџьырқәа рыхьӡынҵа аусуратә ҵакырақәа зегь рҟынтә акәу,мамзар уажәтәи аҟынтә акәу ишаарԥшлатәу"
|
||||
msgstr ""
|
||||
"Аԥенџьырқәа рыхьӡынҵа аусуратә ҵакырақәа зегь рҟынтә акәу,мамзар уажәтәи "
|
||||
"аҟынтә акәу ишаарԥшлатәу"
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:27
|
||||
msgid "Show the window list on all monitors"
|
||||
@@ -219,43 +225,44 @@ msgstr "Аԥенџьырқәа рыхьӡынҵа амониторқәа зег
|
||||
msgid ""
|
||||
"Whether to show the window list on all connected monitors or only on the "
|
||||
"primary one."
|
||||
msgstr
|
||||
"Аԥенџьырқәа рыхьӡынҵа иаҿаку амониторқәа зегьы рыҟноума иахьаарԥшлатәу , мамзар ихадоу аҟны акәу."
|
||||
msgstr ""
|
||||
"Аԥенџьырқәа рыхьӡынҵа иаҿаку амониторқәа зегьы рыҟноума иахьаарԥшлатәу , "
|
||||
"мамзар ихадоу аҟны акәу."
|
||||
|
||||
#: extensions/window-list/prefs.js:32
|
||||
#: extensions/window-list/prefs.js:35
|
||||
msgid "Window Grouping"
|
||||
msgstr "Аԥенџьырқәа реидыргәыԥлара"
|
||||
|
||||
#: extensions/window-list/prefs.js:37
|
||||
#: extensions/window-list/prefs.js:40
|
||||
msgid "Never group windows"
|
||||
msgstr "Ахаангьы аԥенџьырқәа реидмыргәыԥлара"
|
||||
|
||||
#: extensions/window-list/prefs.js:38
|
||||
#: extensions/window-list/prefs.js:41
|
||||
msgid "Group windows when space is limited"
|
||||
msgstr "Аҭыԥ маҷхазар, аԥенџьырқәа еидшәыргәыԥла"
|
||||
|
||||
#: extensions/window-list/prefs.js:39
|
||||
#: extensions/window-list/prefs.js:42
|
||||
msgid "Always group windows"
|
||||
msgstr "Еснагь аԥенџьырқәа реидыргәыԥлара"
|
||||
|
||||
#: extensions/window-list/prefs.js:63
|
||||
#: extensions/window-list/prefs.js:66
|
||||
msgid "Show on all monitors"
|
||||
msgstr "Амониторқәа зегьы рҟны рырбара"
|
||||
|
||||
#: extensions/window-list/workspaceIndicator.js:249
|
||||
#: extensions/workspace-indicator/extension.js:254
|
||||
#: extensions/window-list/workspaceIndicator.js:261
|
||||
#: extensions/workspace-indicator/extension.js:266
|
||||
msgid "Workspace Indicator"
|
||||
msgstr "Аусуратә ҵакыра аиндикатор"
|
||||
|
||||
#: extensions/workspace-indicator/prefs.js:18
|
||||
msgid "Workspace Names"
|
||||
msgstr "Аусуратә ҵакырақәа рыхьӡқәа"
|
||||
|
||||
#: extensions/workspace-indicator/prefs.js:39
|
||||
#: extensions/workspace-indicator/prefs.js:62
|
||||
#, javascript-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "Аусуратә ҵакыра %d"
|
||||
|
||||
#: extensions/workspace-indicator/prefs.js:184
|
||||
#: extensions/workspace-indicator/prefs.js:129
|
||||
msgid "Workspace Names"
|
||||
msgstr "Аусуратә ҵакырақәа рыхьӡқәа"
|
||||
|
||||
#: extensions/workspace-indicator/prefs.js:255
|
||||
msgid "Add Workspace"
|
||||
msgstr "Аусуратә ҵакыра ацҵара"
|
||||
|
||||
101
po/be.po
101
po/be.po
@@ -8,8 +8,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: 2021-01-20 23:03+0000\n"
|
||||
"PO-Revision-Date: 2021-01-24 15:33+0300\n"
|
||||
"POT-Creation-Date: 2022-07-10 12:54+0000\n"
|
||||
"PO-Revision-Date: 2022-10-19 15:20+0300\n"
|
||||
"Last-Translator: Launchpad translators\n"
|
||||
"Language-Team: Belarusian <i18n-bel-gnome@googlegroups.com>\n"
|
||||
"Language: be\n"
|
||||
@@ -18,21 +18,30 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
||||
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
"X-Generator: Poedit 2.4.2\n"
|
||||
"X-Generator: Poedit 3.0\n"
|
||||
|
||||
#: data/gnome-classic.desktop.in:3
|
||||
msgid "GNOME Classic"
|
||||
msgstr "Класічны GNOME"
|
||||
|
||||
#: 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"
|
||||
|
||||
#: extensions/apps-menu/extension.js:113
|
||||
#: data/gnome-classic-wayland.desktop.in:3
|
||||
msgid "GNOME Classic on Wayland"
|
||||
msgstr "Класічны GNOME на Wayland"
|
||||
|
||||
#: data/gnome-classic-xorg.desktop.in:3
|
||||
msgid "GNOME Classic on Xorg"
|
||||
msgstr "Класічны GNOME на Xorg"
|
||||
|
||||
#: extensions/apps-menu/extension.js:118
|
||||
msgid "Favorites"
|
||||
msgstr "Абраныя"
|
||||
|
||||
#: extensions/apps-menu/extension.js:369
|
||||
#: extensions/apps-menu/extension.js:379
|
||||
msgid "Applications"
|
||||
msgstr "Праграмы"
|
||||
|
||||
@@ -48,43 +57,41 @@ msgstr ""
|
||||
"Спіс радкоў, кожны з якіх змяшчае ідэнтыфікатар праграмы (імя файла *."
|
||||
"desktop), затым двукроп'е і нумар працоўнай прасторы"
|
||||
|
||||
#: extensions/auto-move-windows/prefs.js:35
|
||||
#: extensions/auto-move-windows/prefs.js:152
|
||||
msgid "Workspace Rules"
|
||||
msgstr "Правілы для працоўнай прасторы"
|
||||
|
||||
#: extensions/auto-move-windows/prefs.js:237
|
||||
#: 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:210
|
||||
#, 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 "Адкрыць файлы"
|
||||
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:5
|
||||
#, fuzzy
|
||||
msgid "Use more screen for windows"
|
||||
msgstr "Выкарыстоўваць большую плошчу экрана для вокнаў"
|
||||
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:6
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Try to use more screen for placing window thumbnails by adapting to screen "
|
||||
"aspect ratio, and consolidating them further to reduce the bounding box. "
|
||||
"This setting applies only with the natural placement strategy."
|
||||
msgstr ""
|
||||
"Спрабаваць выкарыстаць большую плошчу экрана для размяшчэння мініяцюр праз "
|
||||
"змяненне суадносінаў бакоў экрана, ўшчыльняючы іх, каб зменшыць памеры "
|
||||
"змяненне суадносін бакоў экрана, ўшчыльняючы іх, каб зменшыць памеры "
|
||||
"абмежавальнай рамкі. Гэты параметр ужываецца толькі з натуральным "
|
||||
"размяшчэннем мініяцюр."
|
||||
|
||||
@@ -102,31 +109,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:49
|
||||
#, javascript-format
|
||||
msgid "Failed to launch “%s”"
|
||||
msgstr "Не ўдалося запусціць «%s»"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:61
|
||||
#: extensions/places-menu/placeDisplay.js:64
|
||||
#, javascript-format
|
||||
msgid "Failed to mount volume for “%s”"
|
||||
msgstr "Не ўдалося прымацаваць том для «%s»."
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:125
|
||||
#: extensions/places-menu/placeDisplay.js:148
|
||||
#: extensions/places-menu/placeDisplay.js:171
|
||||
msgid "Computer"
|
||||
msgstr "Камп'ютар"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:359
|
||||
#: extensions/places-menu/placeDisplay.js:336
|
||||
msgid "Home"
|
||||
msgstr "Хатняя папка"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:404
|
||||
#: extensions/places-menu/placeDisplay.js:381
|
||||
msgid "Browse Network"
|
||||
msgstr "Агляд сеткі"
|
||||
|
||||
@@ -146,47 +153,47 @@ msgstr "Назва тэмы"
|
||||
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:432
|
||||
#: extensions/window-list/extension.js:483
|
||||
msgid "Minimize all"
|
||||
msgstr "Згарнуць усе"
|
||||
|
||||
#: extensions/window-list/extension.js:438
|
||||
#: extensions/window-list/extension.js:489
|
||||
msgid "Unminimize all"
|
||||
msgstr "Скасаваць згортванне для ўсіх"
|
||||
|
||||
#: extensions/window-list/extension.js:444
|
||||
#: extensions/window-list/extension.js:495
|
||||
msgid "Maximize all"
|
||||
msgstr "Разгарнуць усе"
|
||||
|
||||
#: extensions/window-list/extension.js:452
|
||||
#: extensions/window-list/extension.js:503
|
||||
msgid "Unmaximize all"
|
||||
msgstr "Скасаваць разгортванне для ўсіх"
|
||||
|
||||
#: extensions/window-list/extension.js:460
|
||||
#: extensions/window-list/extension.js:511
|
||||
msgid "Close all"
|
||||
msgstr "Закрыць усе"
|
||||
|
||||
#: extensions/window-list/extension.js:737
|
||||
#: extensions/window-list/extension.js:795
|
||||
msgid "Window List"
|
||||
msgstr "Спіс вокнаў"
|
||||
|
||||
@@ -203,7 +210,7 @@ msgstr ""
|
||||
"значэнні: «never» (ніколі), «auto» (аўтаматычна), «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 "Паказваць вокны з усіх працоўных прастор"
|
||||
|
||||
@@ -222,41 +229,41 @@ msgid ""
|
||||
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:247
|
||||
#: extensions/workspace-indicator/extension.js:253
|
||||
#: 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:208
|
||||
#: extensions/workspace-indicator/prefs.js:129
|
||||
msgid "Workspace Names"
|
||||
msgstr "Назвы працоўных прастор"
|
||||
|
||||
#: extensions/workspace-indicator/prefs.js:255
|
||||
msgid "Add Workspace"
|
||||
msgstr "Дадаць працоўную прастору"
|
||||
|
||||
|
||||
101
po/el.po
101
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 <eiosifidis@gnome.org>\n"
|
||||
"Language-Team: Greek, Modern (1453-) <gnome-el-list@gnome.org>\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 "Προσθήκη χώρου εργασίας"
|
||||
|
||||
|
||||
2
po/it.po
2
po/it.po
@@ -80,7 +80,7 @@ msgstr "Dispositivi rimovibili"
|
||||
|
||||
#: extensions/drive-menu/extension.js:171
|
||||
msgid "Open Files"
|
||||
msgstr "Apri file"
|
||||
msgstr "Apri File"
|
||||
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:5
|
||||
msgid "Use more screen for windows"
|
||||
|
||||
9
po/ka.po
9
po/ka.po
@@ -9,15 +9,15 @@ msgstr ""
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/"
|
||||
"issues\n"
|
||||
"POT-Creation-Date: 2022-02-13 10:42+0000\n"
|
||||
"PO-Revision-Date: 2022-02-13 14:35+0100\n"
|
||||
"PO-Revision-Date: 2022-09-14 16:37+0200\n"
|
||||
"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
|
||||
"Language-Team: \n"
|
||||
"Language: ka\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Poedit 3.0.1\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Poedit 3.1.1\n"
|
||||
|
||||
#: data/gnome-classic.desktop.in:3
|
||||
msgid "GNOME Classic"
|
||||
@@ -104,6 +104,9 @@ msgid ""
|
||||
"shell default of placing it at the bottom. Changing this setting requires "
|
||||
"restarting the shell to have any effect."
|
||||
msgstr ""
|
||||
"თუ ჩართულია, ფანჯრის სათაური შესაბამისი მინიატურის თავზე გამოჩნდება, რითიც "
|
||||
"გადაფარავს გარსის ნაგულისხმებ მნიშვნელობას, რომ ის ძირზე იყოს. ამ "
|
||||
"პარამეტრის ძალაში შესასვლელად საჭიროა გარსის გადატვირთვა."
|
||||
|
||||
#: extensions/places-menu/extension.js:88
|
||||
#: extensions/places-menu/extension.js:91
|
||||
|
||||
147
po/ne.po
147
po/ne.po
@@ -6,33 +6,41 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell-extension gnome 3.14\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: 2021-05-01 11:32+0545\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/issues\n"
|
||||
"POT-Creation-Date: 2022-07-10 12:54+0000\n"
|
||||
"PO-Revision-Date: 2022-09-08 02:59+0545\n"
|
||||
"Last-Translator: Pawan Chitrakar <chautari@gmail.com>\n"
|
||||
"Language-Team: Nepali Translation Team <chautari@gmail.com>\n"
|
||||
"Language: ne\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 2.4.2\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Poedit 3.0.1\n"
|
||||
"X-Poedit-SourceCharset: UTF-8\n"
|
||||
|
||||
#: data/gnome-classic.desktop.in:3 data/gnome-classic.session.desktop.in:3
|
||||
#: data/gnome-classic.desktop.in:3
|
||||
msgid "GNOME Classic"
|
||||
msgstr "जिनोम क्लासिक"
|
||||
|
||||
#: 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 "यो सेसन जिनोम क्लासिकमा लगईन हुन्छ"
|
||||
|
||||
#: extensions/apps-menu/extension.js:113
|
||||
#: data/gnome-classic-wayland.desktop.in:3
|
||||
msgid "GNOME Classic on Wayland"
|
||||
msgstr "वेल्याण्डमा जिनोम क्लासिक"
|
||||
|
||||
#: data/gnome-classic-xorg.desktop.in:3
|
||||
msgid "GNOME Classic on Xorg"
|
||||
msgstr "Xorg मा जिनोम क्लासिक"
|
||||
|
||||
#: extensions/apps-menu/extension.js:118
|
||||
msgid "Favorites"
|
||||
msgstr "मनपर्ने"
|
||||
|
||||
#: extensions/apps-menu/extension.js:369
|
||||
#: extensions/apps-menu/extension.js:379
|
||||
msgid "Applications"
|
||||
msgstr "अनुप्रयोग"
|
||||
|
||||
@@ -42,32 +50,31 @@ msgstr "अनुप्रयोग र कार्यस्थल सूची
|
||||
|
||||
#: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:7
|
||||
msgid ""
|
||||
"A list of strings, each containing an application id (desktop file name), "
|
||||
"followed by a colon and the workspace number"
|
||||
"A list of strings, each containing an application id (desktop file name), followed by a colon "
|
||||
"and the workspace number"
|
||||
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:210
|
||||
#, 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 "खुला फाइल"
|
||||
|
||||
@@ -77,13 +84,12 @@ msgstr "सञ्झ्यालका लागि बढी पर्दा
|
||||
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:6
|
||||
msgid ""
|
||||
"Try to use more screen for placing window thumbnails by adapting to screen "
|
||||
"aspect ratio, and consolidating them further to reduce the bounding box. "
|
||||
"This setting applies only with the natural placement strategy."
|
||||
"Try to use more screen for placing window thumbnails by adapting to screen aspect ratio, and "
|
||||
"consolidating them further to reduce the bounding box. This setting applies only with the "
|
||||
"natural placement strategy."
|
||||
msgstr ""
|
||||
"सञ्झ्याल थम्बनेलहरू पर्दा आकार अनुपातमा अनुकूल गरेर राख्नका लागि धेरै पर्दा प्रयोग गर्न "
|
||||
"प्रयास गर्नुहोस्, र तिनीहरूलाई बाउन्डिङ बाकस घटाउन अझ संगठित गर्नुहोस् । यो तरिका "
|
||||
"प्राकृतिक प्लेसमेन्ट रणनीतिमा मात्र लागू हुन्छ।"
|
||||
"सञ्झ्याल थम्बनेलहरू पर्दा आकार अनुपातमा अनुकूल गरेर राख्नका लागि धेरै पर्दा प्रयोग गर्न प्रयास गर्नुहोस्, र "
|
||||
"तिनीहरूलाई बाउन्डिङ बाकस घटाउन अझ संगठित गर्नुहोस् । यो तरिका प्राकृतिक प्लेसमेन्ट रणनीतिमा मात्र लागू हुन्छ।"
|
||||
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:11
|
||||
msgid "Place window captions on top"
|
||||
@@ -91,39 +97,36 @@ msgstr "सञ्झ्याल क्याप्सन माथि राख
|
||||
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:12
|
||||
msgid ""
|
||||
"If true, place window captions on top the respective thumbnail, overriding "
|
||||
"shell default of placing it at the bottom. Changing this setting requires "
|
||||
"restarting the shell to have any effect."
|
||||
"If true, place window captions on top the respective thumbnail, overriding shell default of "
|
||||
"placing it at the bottom. Changing this setting requires restarting the shell to have any "
|
||||
"effect."
|
||||
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:49
|
||||
#, javascript-format
|
||||
msgid "Failed to launch “%s”"
|
||||
msgstr "%s सुरु गर्न असफल"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:61
|
||||
#: extensions/places-menu/placeDisplay.js:64
|
||||
#, 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:125 extensions/places-menu/placeDisplay.js:148
|
||||
msgid "Computer"
|
||||
msgstr "कम्प्युटर"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:359
|
||||
#: extensions/places-menu/placeDisplay.js:336
|
||||
msgid "Home"
|
||||
msgstr "गृह"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:404
|
||||
#: extensions/places-menu/placeDisplay.js:381
|
||||
msgid "Browse Network"
|
||||
msgstr "सञ्जाल ब्राउज गर्नुहोस्"
|
||||
|
||||
@@ -143,47 +146,47 @@ msgstr "सारभूत नाम"
|
||||
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 "सञ्झ्याल सूची"
|
||||
|
||||
@@ -193,14 +196,14 @@ msgstr "कहिले सञ्झ्याल समुहबध्द गर
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:13
|
||||
msgid ""
|
||||
"Decides when to group windows from the same application on the window list. "
|
||||
"Possible values are “never”, “auto” and “always”."
|
||||
"Decides when to group windows from the same application on the window list. Possible values are "
|
||||
"“never”, “auto” and “always”."
|
||||
msgstr ""
|
||||
"सञ्झ्याल सूचीमा उस्तै अनुप्रयोगबाट कहिले समूह बनाउने निर्णय गर्दछ । सम्भावित मान \"कहिले "
|
||||
"पनि\", \"स्वचालित\" र \"सधैँ\" हुन् ।"
|
||||
"सञ्झ्याल सूचीमा उस्तै अनुप्रयोगबाट कहिले समूह बनाउने निर्णय गर्दछ । सम्भावित मान \"कहिले पनि\", \"स्वचालित\" र "
|
||||
"\"सधैँ\" हुन् ।"
|
||||
|
||||
#: 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 "सबै कार्यस्थानबाट सन्झ्याल देखाउनुहोस्"
|
||||
|
||||
@@ -213,48 +216,44 @@ msgid "Show the window list on all monitors"
|
||||
msgstr "सबै मोनिटरमा सञ्झ्याल सूची देखाउनुहोस्"
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:28
|
||||
msgid ""
|
||||
"Whether to show the window list on all connected monitors or only on the "
|
||||
"primary one."
|
||||
msgstr ""
|
||||
"सबै जडान गरिएको मोनिटरमा वा प्राथमिक मोनिटरमा मात्र सञ्झ्याल सूची देखाउने या नदेखाउने "
|
||||
"।"
|
||||
msgid "Whether to show the window list on all connected monitors or only on the primary one."
|
||||
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 "कार्यस्थल थप्नुहोस्"
|
||||
|
||||
|
||||
101
po/ru.po
101
po/ru.po
@@ -6,20 +6,20 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell-extensions gnome-3-0\n"
|
||||
"Project-Id-Version: gnome-shell-extensions\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/"
|
||||
"issues\n"
|
||||
"POT-Creation-Date: 2021-11-06 14:08+0000\n"
|
||||
"PO-Revision-Date: 2021-12-11 15:12+0300\n"
|
||||
"POT-Creation-Date: 2022-07-10 12:54+0000\n"
|
||||
"PO-Revision-Date: 2022-09-14 13:09+0300\n"
|
||||
"Last-Translator: Aleksandr Melman <Alexmelman88@gmail.com>\n"
|
||||
"Language-Team: Русский <gnome-cyr@gnome.org>\n"
|
||||
"Language: ru\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
||||
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
"X-Generator: Poedit 3.0\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
|
||||
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
"X-Generator: Poedit 3.1\n"
|
||||
|
||||
#: data/gnome-classic.desktop.in:3
|
||||
msgid "GNOME Classic"
|
||||
@@ -28,7 +28,7 @@ msgstr "Классический GNOME"
|
||||
#: 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"
|
||||
msgstr "Данный сеанс использует классический GNOME"
|
||||
|
||||
#: data/gnome-classic-wayland.desktop.in:3
|
||||
msgid "GNOME Classic on Wayland"
|
||||
@@ -38,17 +38,17 @@ msgstr "Классический GNOME на Wayland"
|
||||
msgid "GNOME Classic on Xorg"
|
||||
msgstr "Классический GNOME на Xorg"
|
||||
|
||||
#: extensions/apps-menu/extension.js:112
|
||||
#: extensions/apps-menu/extension.js:118
|
||||
msgid "Favorites"
|
||||
msgstr "Избранное"
|
||||
|
||||
#: extensions/apps-menu/extension.js:366
|
||||
#: extensions/apps-menu/extension.js:379
|
||||
msgid "Applications"
|
||||
msgstr "Приложения"
|
||||
|
||||
#: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:6
|
||||
msgid "Application and workspace list"
|
||||
msgstr "Приложение и список рабочих областей"
|
||||
msgstr "Приложение и список рабочих столов"
|
||||
|
||||
#: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:7
|
||||
msgid ""
|
||||
@@ -56,28 +56,28 @@ msgid ""
|
||||
"followed by a colon and the workspace number"
|
||||
msgstr ""
|
||||
"Список строк, содержащих идентификатор приложения (имя desktop-файла), за "
|
||||
"которым следует двоеточие и номер рабочего места"
|
||||
"которым следует двоеточие и номер рабочего стола"
|
||||
|
||||
#: extensions/auto-move-windows/prefs.js:34
|
||||
#: extensions/auto-move-windows/prefs.js:152
|
||||
msgid "Workspace Rules"
|
||||
msgstr "Правила для рабочей области"
|
||||
msgstr "Правила для рабочих столов"
|
||||
|
||||
#: extensions/auto-move-windows/prefs.js:236
|
||||
#: extensions/auto-move-windows/prefs.js:306
|
||||
msgid "Add Rule"
|
||||
msgstr "Добавить правило"
|
||||
|
||||
#. TRANSLATORS: %s is the filesystem name
|
||||
#: extensions/drive-menu/extension.js:133
|
||||
#: extensions/places-menu/placeDisplay.js:233
|
||||
#: extensions/drive-menu/extension.js:126
|
||||
#: extensions/places-menu/placeDisplay.js:210
|
||||
#, javascript-format
|
||||
msgid "Ejecting drive “%s” failed:"
|
||||
msgstr "Не удалось извлечь диск «%s»:"
|
||||
|
||||
#: extensions/drive-menu/extension.js:149
|
||||
#: extensions/drive-menu/extension.js:145
|
||||
msgid "Removable devices"
|
||||
msgstr "Съёмные устройства"
|
||||
|
||||
#: extensions/drive-menu/extension.js:171
|
||||
#: extensions/drive-menu/extension.js:167
|
||||
msgid "Open Files"
|
||||
msgstr "Открыть файлы"
|
||||
|
||||
@@ -110,31 +110,31 @@ msgstr ""
|
||||
"умолчанию заголовки располагаются снизу). При изменении этого параметра, "
|
||||
"чтобы оно вступило в силу, необходимо перезапустить Shell."
|
||||
|
||||
#: extensions/places-menu/extension.js:88
|
||||
#: extensions/places-menu/extension.js:91
|
||||
#: 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:49
|
||||
#, javascript-format
|
||||
msgid "Failed to launch “%s”"
|
||||
msgstr "Не удалось запустить «%s»"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:61
|
||||
#: extensions/places-menu/placeDisplay.js:64
|
||||
#, javascript-format
|
||||
msgid "Failed to mount volume for “%s”"
|
||||
msgstr "Не удалось смонтировать том для «%s»"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:125
|
||||
#: extensions/places-menu/placeDisplay.js:148
|
||||
#: extensions/places-menu/placeDisplay.js:171
|
||||
msgid "Computer"
|
||||
msgstr "Компьютер"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:359
|
||||
#: extensions/places-menu/placeDisplay.js:336
|
||||
msgid "Home"
|
||||
msgstr "Домашняя папка"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:404
|
||||
#: extensions/places-menu/placeDisplay.js:381
|
||||
msgid "Browse Network"
|
||||
msgstr "Обзор сети"
|
||||
|
||||
@@ -175,28 +175,28 @@ msgstr "Восстановить"
|
||||
msgid "Maximize"
|
||||
msgstr "Развернуть"
|
||||
|
||||
#: extensions/window-list/extension.js:434
|
||||
#: extensions/window-list/extension.js:483
|
||||
msgid "Minimize all"
|
||||
msgstr "Свернуть все"
|
||||
|
||||
# ну или "восстановить", правда тогда появляется неоднозначный повтор (unmaximize)
|
||||
#: extensions/window-list/extension.js:440
|
||||
#: extensions/window-list/extension.js:489
|
||||
msgid "Unminimize all"
|
||||
msgstr "Вернуть все"
|
||||
|
||||
#: extensions/window-list/extension.js:446
|
||||
#: extensions/window-list/extension.js:495
|
||||
msgid "Maximize all"
|
||||
msgstr "Развернуть все"
|
||||
|
||||
#: extensions/window-list/extension.js:454
|
||||
#: extensions/window-list/extension.js:503
|
||||
msgid "Unmaximize all"
|
||||
msgstr "Восстановить все"
|
||||
|
||||
#: extensions/window-list/extension.js:462
|
||||
#: extensions/window-list/extension.js:511
|
||||
msgid "Close all"
|
||||
msgstr "Закрыть все"
|
||||
|
||||
#: extensions/window-list/extension.js:741
|
||||
#: extensions/window-list/extension.js:795
|
||||
msgid "Window List"
|
||||
msgstr "Список окон"
|
||||
|
||||
@@ -214,14 +214,14 @@ msgstr ""
|
||||
"«always» — всегда."
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20
|
||||
#: extensions/window-list/prefs.js:86
|
||||
#: extensions/window-list/prefs.js:79
|
||||
msgid "Show windows from all workspaces"
|
||||
msgstr "Отображать окна со всех рабочих областей"
|
||||
msgstr "Отображать окна со всех рабочих столов"
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:21
|
||||
msgid "Whether to show windows from all workspaces or only the current one."
|
||||
msgstr ""
|
||||
"Показывать ли список окон со всех рабочих областей или только с текущей."
|
||||
"Показывать ли список окон со всех рабочих столов или только с текущего."
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:27
|
||||
msgid "Show the window list on all monitors"
|
||||
@@ -235,41 +235,40 @@ msgstr ""
|
||||
"Показывать ли список окон на всех подключенных мониторах или только на "
|
||||
"основном."
|
||||
|
||||
#: extensions/window-list/prefs.js:39
|
||||
#: extensions/window-list/prefs.js:35
|
||||
msgid "Window Grouping"
|
||||
msgstr "Группировка окон"
|
||||
|
||||
#: extensions/window-list/prefs.js:63
|
||||
#: extensions/window-list/prefs.js:40
|
||||
msgid "Never group windows"
|
||||
msgstr "Никогда не группировать окна"
|
||||
|
||||
#: extensions/window-list/prefs.js:64
|
||||
#: extensions/window-list/prefs.js:41
|
||||
msgid "Group windows when space is limited"
|
||||
msgstr "Группировать окна, если место ограничено"
|
||||
|
||||
#: extensions/window-list/prefs.js:65
|
||||
#: extensions/window-list/prefs.js:42
|
||||
msgid "Always group windows"
|
||||
msgstr "Всегда группировать окна"
|
||||
|
||||
#: extensions/window-list/prefs.js:81
|
||||
#: extensions/window-list/prefs.js:66
|
||||
msgid "Show on all monitors"
|
||||
msgstr "Показывать на всех мониторах"
|
||||
|
||||
#: extensions/window-list/workspaceIndicator.js:249
|
||||
#: extensions/workspace-indicator/extension.js:254
|
||||
#: extensions/window-list/workspaceIndicator.js:261
|
||||
#: extensions/workspace-indicator/extension.js:266
|
||||
msgid "Workspace Indicator"
|
||||
msgstr "Индикатор рабочей области"
|
||||
msgstr "Индикатор рабочих столов"
|
||||
|
||||
#: extensions/workspace-indicator/prefs.js:33
|
||||
msgid "Workspace Names"
|
||||
msgstr "Названия рабочих областей"
|
||||
|
||||
#: extensions/workspace-indicator/prefs.js:66
|
||||
#: extensions/workspace-indicator/prefs.js:62
|
||||
#, javascript-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "Рабочая область %d"
|
||||
msgstr "Рабочий стол %d"
|
||||
|
||||
#: extensions/workspace-indicator/prefs.js:207
|
||||
#: extensions/workspace-indicator/prefs.js:129
|
||||
msgid "Workspace Names"
|
||||
msgstr "Названия рабочих столов"
|
||||
|
||||
#: extensions/workspace-indicator/prefs.js:255
|
||||
msgid "Add Workspace"
|
||||
msgstr "Добавить рабочую область"
|
||||
|
||||
msgstr "Добавить рабочий стол"
|
||||
|
||||
170
po/tr.po
170
po/tr.po
@@ -1,5 +1,5 @@
|
||||
# Turkish translation for gnome-shell-extensions.
|
||||
# Copyright (C) 2012-2019 gnome-shell-extensions's COPYRIGHT HOLDER
|
||||
# Copyright (C) 2012-2022 gnome-shell-extensions's COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the gnome-shell-extensions package.
|
||||
#
|
||||
# Osman Karagöz <osmank3@gmail.com>, 2012.
|
||||
@@ -14,7 +14,7 @@ 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: 2021-11-06 14:08+0000\n"
|
||||
"POT-Creation-Date: 2022-07-10 12:54+0000\n"
|
||||
"PO-Revision-Date: 2022-02-14 01:35+0300\n"
|
||||
"Last-Translator: Emin Tufan Çetin <etcetin@gmail.com>\n"
|
||||
"Language-Team: Turkish <gnome-turk@gnome.org>\n"
|
||||
@@ -42,11 +42,11 @@ msgstr "Wayland üstünde GNOME Klasik"
|
||||
msgid "GNOME Classic on Xorg"
|
||||
msgstr "Xorg üstünde GNOME Klasik"
|
||||
|
||||
#: extensions/apps-menu/extension.js:112
|
||||
#: extensions/apps-menu/extension.js:118
|
||||
msgid "Favorites"
|
||||
msgstr "Gözdeler"
|
||||
|
||||
#: extensions/apps-menu/extension.js:366
|
||||
#: extensions/apps-menu/extension.js:379
|
||||
msgid "Applications"
|
||||
msgstr "Uygulamalar"
|
||||
|
||||
@@ -62,26 +62,26 @@ msgstr ""
|
||||
"Her biri, bir uygulama kimliği (masaüstü dosya adı) ardından gelen iki nokta "
|
||||
"üst üste ve çalışma alanı numarasını içeren dizgeler listesi"
|
||||
|
||||
#: extensions/auto-move-windows/prefs.js:34
|
||||
#: extensions/auto-move-windows/prefs.js:152
|
||||
msgid "Workspace Rules"
|
||||
msgstr "Çalışma Alanı Kuralları"
|
||||
|
||||
#: extensions/auto-move-windows/prefs.js:236
|
||||
#: extensions/auto-move-windows/prefs.js:306
|
||||
msgid "Add Rule"
|
||||
msgstr "Kural Ekle"
|
||||
|
||||
#. TRANSLATORS: %s is the filesystem name
|
||||
#: extensions/drive-menu/extension.js:133
|
||||
#: extensions/places-menu/placeDisplay.js:233
|
||||
#: extensions/drive-menu/extension.js:126
|
||||
#: extensions/places-menu/placeDisplay.js:210
|
||||
#, javascript-format
|
||||
msgid "Ejecting drive “%s” failed:"
|
||||
msgstr "“%s” sürücüsü çıkarılamadı:"
|
||||
|
||||
#: extensions/drive-menu/extension.js:149
|
||||
#: extensions/drive-menu/extension.js:145
|
||||
msgid "Removable devices"
|
||||
msgstr "Çıkarılabilir aygıtlar"
|
||||
|
||||
#: extensions/drive-menu/extension.js:171
|
||||
#: extensions/drive-menu/extension.js:167
|
||||
msgid "Open Files"
|
||||
msgstr "Dosyaları Aç"
|
||||
|
||||
@@ -96,9 +96,9 @@ msgid ""
|
||||
"This setting applies only with the natural placement strategy."
|
||||
msgstr ""
|
||||
"Ekran en-boy oranına uyarak ve sınır kutucuğunu küçültüp daha da "
|
||||
"sıkılaştırarak, pencere küçük resimlerini yerleştirmek için ekranda daha "
|
||||
"çok alan kullanmayı dene. Bu seçenek yalnızca doğal yerleştirme stratejisi "
|
||||
"ile geçerlidir."
|
||||
"sıkılaştırarak, pencere küçük resimlerini yerleştirmek için ekranda daha çok "
|
||||
"alan kullanmayı dene. Bu seçenek yalnızca doğal yerleştirme stratejisi ile "
|
||||
"geçerlidir."
|
||||
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:11
|
||||
msgid "Place window captions on top"
|
||||
@@ -115,31 +115,31 @@ msgstr ""
|
||||
"Yapılan değişikliklerin etkili olması için kabuğun yeniden başlatılması "
|
||||
"gerekir."
|
||||
|
||||
#: extensions/places-menu/extension.js:88
|
||||
#: extensions/places-menu/extension.js:91
|
||||
#: extensions/places-menu/extension.js:94
|
||||
#: extensions/places-menu/extension.js:97
|
||||
msgid "Places"
|
||||
msgstr "Yerler"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:46
|
||||
#: extensions/places-menu/placeDisplay.js:49
|
||||
#, javascript-format
|
||||
msgid "Failed to launch “%s”"
|
||||
msgstr "“%s” başlatılamadı"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:61
|
||||
#: extensions/places-menu/placeDisplay.js:64
|
||||
#, javascript-format
|
||||
msgid "Failed to mount volume for “%s”"
|
||||
msgstr "“%s” için birim bağlanamadı"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:125
|
||||
#: extensions/places-menu/placeDisplay.js:148
|
||||
#: extensions/places-menu/placeDisplay.js:171
|
||||
msgid "Computer"
|
||||
msgstr "Bilgisayar"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:359
|
||||
#: extensions/places-menu/placeDisplay.js:336
|
||||
msgid "Home"
|
||||
msgstr "Ev"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:404
|
||||
#: extensions/places-menu/placeDisplay.js:381
|
||||
msgid "Browse Network"
|
||||
msgstr "Ağa Gözat"
|
||||
|
||||
@@ -179,27 +179,27 @@ msgstr "Önceki duruma getir"
|
||||
msgid "Maximize"
|
||||
msgstr "En büyük duruma getir"
|
||||
|
||||
#: extensions/window-list/extension.js:434
|
||||
#: extensions/window-list/extension.js:483
|
||||
msgid "Minimize all"
|
||||
msgstr "Tümünü simge durumuna küçült"
|
||||
|
||||
#: extensions/window-list/extension.js:440
|
||||
#: extensions/window-list/extension.js:489
|
||||
msgid "Unminimize all"
|
||||
msgstr "Tümünü önceki duruma getir"
|
||||
|
||||
#: extensions/window-list/extension.js:446
|
||||
#: extensions/window-list/extension.js:495
|
||||
msgid "Maximize all"
|
||||
msgstr "Tümünü en büyük duruma getir"
|
||||
|
||||
#: extensions/window-list/extension.js:454
|
||||
#: extensions/window-list/extension.js:503
|
||||
msgid "Unmaximize all"
|
||||
msgstr "Tümünü önceki duruma getir"
|
||||
|
||||
#: extensions/window-list/extension.js:462
|
||||
#: extensions/window-list/extension.js:511
|
||||
msgid "Close all"
|
||||
msgstr "Tümünü kapat"
|
||||
|
||||
#: extensions/window-list/extension.js:741
|
||||
#: extensions/window-list/extension.js:795
|
||||
msgid "Window List"
|
||||
msgstr "Pencere Listesi"
|
||||
|
||||
@@ -217,7 +217,7 @@ msgstr ""
|
||||
"“always” (her zaman)."
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20
|
||||
#: extensions/window-list/prefs.js:86
|
||||
#: extensions/window-list/prefs.js:79
|
||||
msgid "Show windows from all workspaces"
|
||||
msgstr "Tüm çalışma alanlarındaki pencereleri göster"
|
||||
|
||||
@@ -236,129 +236,43 @@ msgid ""
|
||||
"Whether to show the window list on all connected monitors or only on the "
|
||||
"primary one."
|
||||
msgstr ""
|
||||
"Pencere listesinin tüm bağlı monitörlerde mi yoksa yalnızca birincil monitörde "
|
||||
"mi gösterileceğini belirtir."
|
||||
"Pencere listesinin tüm bağlı monitörlerde mi yoksa yalnızca birincil "
|
||||
"monitörde mi gösterileceğini belirtir."
|
||||
|
||||
#: extensions/window-list/prefs.js:39
|
||||
#: extensions/window-list/prefs.js:35
|
||||
msgid "Window Grouping"
|
||||
msgstr "Pencere Kümeleme"
|
||||
|
||||
#: extensions/window-list/prefs.js:63
|
||||
#: extensions/window-list/prefs.js:40
|
||||
msgid "Never group windows"
|
||||
msgstr "Pencereleri asla kümeleme"
|
||||
|
||||
#: extensions/window-list/prefs.js:64
|
||||
#: extensions/window-list/prefs.js:41
|
||||
msgid "Group windows when space is limited"
|
||||
msgstr "Yer kısıtlıyken pencereleri kümele"
|
||||
|
||||
#: extensions/window-list/prefs.js:65
|
||||
#: extensions/window-list/prefs.js:42
|
||||
msgid "Always group windows"
|
||||
msgstr "Pencereleri her zaman kümele"
|
||||
|
||||
#: extensions/window-list/prefs.js:81
|
||||
#: extensions/window-list/prefs.js:66
|
||||
msgid "Show on all monitors"
|
||||
msgstr "Tüm monitörlerde göster"
|
||||
|
||||
#: extensions/window-list/workspaceIndicator.js:249
|
||||
#: extensions/workspace-indicator/extension.js:254
|
||||
#: extensions/window-list/workspaceIndicator.js:261
|
||||
#: extensions/workspace-indicator/extension.js:266
|
||||
msgid "Workspace Indicator"
|
||||
msgstr "Çalışma Alanı Belirteci"
|
||||
|
||||
#: extensions/workspace-indicator/prefs.js:33
|
||||
msgid "Workspace Names"
|
||||
msgstr "Çalışma Alanı Adları"
|
||||
|
||||
#: extensions/workspace-indicator/prefs.js:66
|
||||
#: extensions/workspace-indicator/prefs.js:62
|
||||
#, javascript-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "Çalışma Alanı %d"
|
||||
|
||||
#: extensions/workspace-indicator/prefs.js:207
|
||||
#: extensions/workspace-indicator/prefs.js:129
|
||||
msgid "Workspace Names"
|
||||
msgstr "Çalışma Alanı Adları"
|
||||
|
||||
#: extensions/workspace-indicator/prefs.js:255
|
||||
msgid "Add Workspace"
|
||||
msgstr "Çalışma Alanı Ekle"
|
||||
|
||||
#~ msgid "Application"
|
||||
#~ msgstr "Uygulama"
|
||||
|
||||
#~ msgid "Create new matching rule"
|
||||
#~ msgstr "Yeni bir eşleşme kuralı oluştur"
|
||||
|
||||
#~ msgid "Add"
|
||||
#~ msgstr "Ekle"
|
||||
|
||||
#~ msgid "Name"
|
||||
#~ msgstr "Ad"
|
||||
|
||||
#~ msgid "Attach modal dialog to the parent window"
|
||||
#~ msgstr "Yardımcı iletişim penceresini ana pencereye iliştir"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "This key overrides the key in org.gnome.mutter when running GNOME Shell."
|
||||
#~ msgstr ""
|
||||
#~ "Bu anahtar, GNOME Shell çalışırken org.gnome.mutter içindeki anahtarı "
|
||||
#~ "geçersiz kılar."
|
||||
|
||||
#~ msgid "Arrangement of buttons on the titlebar"
|
||||
#~ msgstr "Başlık çubuğundaki düğmelerin düzeni"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "This key overrides the key in org.gnome.desktop.wm.preferences when "
|
||||
#~ "running GNOME Shell."
|
||||
#~ msgstr ""
|
||||
#~ "Bu anahtar, GNOME Kabuğu çalışırken org.gnome.desktop.wm.preferences "
|
||||
#~ "içindeki anahtarı geçersiz kılar."
|
||||
|
||||
#~ msgid "Enable edge tiling when dropping windows on screen edges"
|
||||
#~ msgstr ""
|
||||
#~ "Pencereler ekran kenarlarında bırakıldığında kenar döşemeyi etkinleştir"
|
||||
|
||||
#~ msgid "Workspaces only on primary monitor"
|
||||
#~ msgstr "Çalışma alanları sadece birincil ekranda"
|
||||
|
||||
#~ msgid "Delay focus changes in mouse mode until the pointer stops moving"
|
||||
#~ msgstr ""
|
||||
#~ "Fare kipinde odak değişikliklerini işaretçi hareketi durana kadar beklet"
|
||||
|
||||
#~ msgid "Thumbnail only"
|
||||
#~ msgstr "Yalnızca küçük resim"
|
||||
|
||||
#~ msgid "Application icon only"
|
||||
#~ msgstr "Sadece uygulama simgesi"
|
||||
|
||||
#~ msgid "Thumbnail and application icon"
|
||||
#~ msgstr "Küçük resim ve uygulama simgesi"
|
||||
|
||||
#~ msgid "Present windows as"
|
||||
#~ msgstr "Pencereleri farklı sun"
|
||||
|
||||
#~ msgid "Activities Overview"
|
||||
#~ msgstr "Etkinlikler Genel Görünümü"
|
||||
|
||||
#~ msgid "Hello, world!"
|
||||
#~ msgstr "Merhaba dünya!"
|
||||
|
||||
#~ msgid "Alternative greeting text."
|
||||
#~ msgstr "Alternatif karşılama metni."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "If not empty, it contains the text that will be shown when clicking on "
|
||||
#~ "the panel."
|
||||
#~ msgstr "Eğer boş değilse, panele tıklandığında gösterilecek metni içerir."
|
||||
|
||||
#~ msgid "Message"
|
||||
#~ msgstr "İleti"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Example aims to show how to build well behaved extensions for the Shell "
|
||||
#~ "and as such it has little functionality on its own.\n"
|
||||
#~ "Nevertheless it’s possible to customize the greeting message."
|
||||
#~ msgstr ""
|
||||
#~ "Bu örnek, Shell için uygun eklentilerin nasıl geliştirileceğini "
|
||||
#~ "göstermeyi amaçlar; bu yüzden kendi başına çok az işleve sahiptir.\n"
|
||||
#~ "Yine de karşılama iletisini özelleştirmek mümkündür."
|
||||
|
||||
#~ msgid "CPU"
|
||||
#~ msgstr "İşlemci"
|
||||
|
||||
#~ msgid "Memory"
|
||||
#~ msgstr "Bellek"
|
||||
|
||||
Reference in New Issue
Block a user