Compare commits
2 Commits
3.33.2
...
gbsneto/au
Author | SHA1 | Date | |
---|---|---|---|
![]() |
47a2e58d45 | ||
![]() |
20d73be57d |
1
.gitignore
vendored
@@ -80,4 +80,3 @@ tests/run-test.sh
|
||||
*~
|
||||
*.patch
|
||||
*.sw?
|
||||
.vscode
|
||||
|
@@ -15,10 +15,10 @@ variables:
|
||||
- merge_requests
|
||||
|
||||
check_commit_log:
|
||||
image: registry.gitlab.gnome.org/gnome/mutter/master:v2
|
||||
image: registry.fedoraproject.org/fedora:latest
|
||||
stage: review
|
||||
variables:
|
||||
GIT_DEPTH: "100"
|
||||
before_script:
|
||||
- dnf install -y git
|
||||
script:
|
||||
- ./.gitlab-ci/check-commit-log.sh
|
||||
only:
|
||||
@@ -40,7 +40,7 @@ js_check:
|
||||
when: on_failure
|
||||
|
||||
build:
|
||||
image: registry.gitlab.gnome.org/gnome/mutter/master:v2
|
||||
image: registry.gitlab.gnome.org/gnome/gnome-shell/master:v1
|
||||
stage: build
|
||||
before_script:
|
||||
- .gitlab-ci/checkout-mutter.sh
|
||||
@@ -58,7 +58,7 @@ build:
|
||||
- build
|
||||
|
||||
test:
|
||||
image: registry.gitlab.gnome.org/gnome/mutter/master:v2
|
||||
image: registry.gitlab.gnome.org/gnome/gnome-shell/master:v1
|
||||
stage: test
|
||||
before_script:
|
||||
- ninja -C mutter/build install
|
||||
@@ -72,7 +72,7 @@ test:
|
||||
when: on_failure
|
||||
|
||||
test-pot:
|
||||
image: registry.gitlab.gnome.org/gnome/mutter/master:v2
|
||||
image: registry.gitlab.gnome.org/gnome/gnome-shell/master:v1
|
||||
stage: test
|
||||
before_script:
|
||||
- ninja -C mutter/build install
|
||||
|
19
.gitlab-ci/Dockerfile
Normal file
@@ -0,0 +1,19 @@
|
||||
FROM registry.gitlab.gnome.org/gnome/mutter/master:v1
|
||||
|
||||
RUN dnf -y update && dnf -y upgrade && \
|
||||
dnf install -y 'dnf-command(copr)' && \
|
||||
dnf copr enable -y fmuellner/gnome-shell-ci && \
|
||||
dnf builddep -y gnome-shell --setopt=install_weak_deps=False && \
|
||||
|
||||
# bt only exports HAVE_BLUETOOTH to js, rest are outdated build-requires
|
||||
dnf remove -y gnome-bluetooth-libs-devel dbus-glib-devel \
|
||||
upower-devel python3-devel && \
|
||||
|
||||
# We'll build mutter ourselves
|
||||
dnf remove -y --noautoremove mutter mutter-devel && \
|
||||
|
||||
# Needed for tests
|
||||
dnf install -y '*/xvfb-run' gdm-lib accountsservice-libs && \
|
||||
|
||||
dnf clean all && \
|
||||
rm -rf /var/cache/dnf
|
@@ -17,19 +17,15 @@ if [ "$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" ]; then
|
||||
merge_request_branch=$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME
|
||||
|
||||
echo Looking for $merge_request_branch on remote ...
|
||||
if git fetch -q $merge_request_remote $merge_request_branch 2>/dev/null; then
|
||||
if git fetch $merge_request_remote $merge_request_branch >/dev/null 2>&1; then
|
||||
mutter_target=FETCH_HEAD
|
||||
else
|
||||
mutter_target=origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME
|
||||
echo Using $mutter_target instead
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "$mutter_target" ]; then
|
||||
mutter_target=$(git branch -r -l origin/$shell_branch)
|
||||
mutter_target=${mutter_target:-$(git branch -r -l ${shell_branch#remotes/})}
|
||||
mutter_target=$(git branch -r -l $shell_branch)
|
||||
mutter_target=${mutter_target:-origin/master}
|
||||
echo Using $mutter_target instead
|
||||
fi
|
||||
|
||||
git checkout -q $mutter_target
|
||||
git checkout $mutter_target
|
||||
|
77
NEWS
@@ -1,80 +1,3 @@
|
||||
3.33.2
|
||||
======
|
||||
* Fix keeping actors visible in scrollviews [Marco; #1061]
|
||||
* Move some chrome above popup windows [Jonas D.; !358]
|
||||
* Include 'sandboxed-app-id' in winodw introspection info [Florian; #1289]
|
||||
* Port to libecal-2.0 [Milan; !501]
|
||||
* Support TCRYPT in mount password dialog [segfault; !126]
|
||||
* Misc. bug fixes and cleanups [Florian, Marco, Veerasamy; !517, #745, !499,
|
||||
!510, !515, !546, !549]
|
||||
|
||||
Contributors:
|
||||
Cosimo Cecchi, Milan Crha, Jonas Dreßler, Florian Müllner, segfault,
|
||||
Veerasamy Sevagen, Marco Trevisan (Treviño)
|
||||
|
||||
Translators:
|
||||
Daniel Mustieles [es]
|
||||
|
||||
3.33.1
|
||||
======
|
||||
* Refine the app menu [Florian; #968]
|
||||
* Refine window preview style [Feichtmeier; !461]
|
||||
* Only emit ::style-changed on actual changes [Carlos; #1153]
|
||||
* Disable emoji on-screen keyboard support on X11 [Florian; #1172]
|
||||
* Fix tablet button mapping overlay [Carlos; #1220]
|
||||
* Don't crash for world clock locations with no timezone [Florian; #1062]
|
||||
* Don't leak old on-screen keyboard layout groups [Carlos; mutter#556]
|
||||
* Fix ellipsization in dialog subtitles/bodies [Marco; !531]
|
||||
* Fix glitch of fullscreen window in workspace switch animation [Jonas D.; !322]
|
||||
* Fix distortion of some image contents [Florian; !525]
|
||||
* Allow dragging unfocused tiled/maximized windows from top bar [Dylan; #679290]
|
||||
* Handle network interface name changes [Fabrice; !534]
|
||||
* Avoid unnecessary style changes when computing :first/:last-child
|
||||
[Florian; !529]
|
||||
* Misc. bug fixes and cleanups [Florian, Marco, Robert, Georges, Carlos, Simon,
|
||||
Jonas D.; !487, !441, !502, !503, !504, !506, #822, !551, !512, !509, !511,
|
||||
#1054, !524, #1065, !331, !540]
|
||||
|
||||
Contributors:
|
||||
Fabrice Bellet, Jonas Dreßler, Feichtmeier, Carlos Garnacho, Robert Mader,
|
||||
Dylan McCall, Simon McVittie, Florian Müllner, Georges Basile Stavracas Neto,
|
||||
Marco Trevisan (Treviño)
|
||||
|
||||
Translators:
|
||||
Daniel Mustieles [es], Kukuh Syafaat [id], Fabio Tomat [fur],
|
||||
Carmen Bianca BAKKER [eo], Dingzhong Chen [zh_CN], Tim Sabsch [de]
|
||||
|
||||
3.32.1
|
||||
======
|
||||
* Fix avatar scaling on login screen [Florian; #1024]
|
||||
* Fix distortion of desktop zoom [Florian; #646]
|
||||
* Fix mouse cursor visibility when using desktop zoom [Florian, Marco; #1020]
|
||||
* Fix screen dimming after wake-up on lock screen [Xiaoguang; #900]
|
||||
* Fix Alt+Esc switcher [Florian; #1064]
|
||||
* Respect struts for popover placement [Andrea; #1102]
|
||||
* Fix app icons updates after theme changes [Florian; #1117]
|
||||
* Fix desktop zoom after resolution changes [Marco; #1120]
|
||||
* Implement stick-to-finger workspace switch overview gestures [Florian; #516]
|
||||
* Make World Clocks offsets relative to local time [Florian; #1157]
|
||||
* Fix top app icon disappearing from dash [Florian; #1053]
|
||||
* Update switch style to match new Adwaita [Jakub; !496]
|
||||
* Ensure CSS units are pixel-aligned when scaling is used [Carlos; #91]
|
||||
* Misc. bug fixes and cleanups [Florian, Jakub, Robert, Alex, Carlos, Phil,
|
||||
Marco, Benjamin, AsciiWolf, Ray, verdre; !444, #1016, #1018, !449, #1036,
|
||||
!455, #1094, !440, #1023, #624, #1017, !476, !473, !480, #1130, !485, !481,
|
||||
!490, !489, #1151, !435, #1160, !482, #1150, #1166, !384]
|
||||
|
||||
Contributors:
|
||||
AsciiWolf, Andrea Azzarone, Benjamin Berg, Carlos Garnacho, Victor Ibragimov,
|
||||
Robert Mader, Alex Monday, Florian Müllner, Jakub Steiner, Ray Strode,
|
||||
Marco Trevisan (Treviño), verdre, Xiaoguang Wang, Phil Wyett
|
||||
|
||||
Translators:
|
||||
Victor Ibragimov [tg, af, et, ja], Bruce Cowan [en_GB], Piotr Drąg [tg],
|
||||
Charles Monzat [fr], Khaled Hosny [ar], Goran Vidović [hr],
|
||||
Cheng-Chia Tseng [zh_TW], Carmen Bianca BAKKER [eo], Daniel Mustieles [es],
|
||||
Dušan Kazik [sk]
|
||||
|
||||
3.32.0
|
||||
======
|
||||
* Fix sizing issues in on-screen-keyboard emoji panel [Carlos; !439]
|
||||
|
@@ -9,6 +9,9 @@
|
||||
<method name="ShowOSD">
|
||||
<arg type="a{sv}" direction="in" name="params"/>
|
||||
</method>
|
||||
<method name="ShowMonitorLabels">
|
||||
<arg type="a{uv}" direction="in" name="params"/>
|
||||
</method>
|
||||
<method name="ShowMonitorLabels2">
|
||||
<arg type="a{sv}" direction="in" name="params"/>
|
||||
</method>
|
||||
|
@@ -1,6 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<gresources>
|
||||
<gresource prefix="/org/gnome/shell/theme">
|
||||
<file>automatic-updates-off-symbolic.svg</file>
|
||||
<file>automatic-updates-on-symbolic.svg</file>
|
||||
<file>automatic-updates-scheduled-symbolic.svg</file>
|
||||
<file>calendar-today.svg</file>
|
||||
<file>checkbox-focused.svg</file>
|
||||
<file>checkbox-off-focused.svg</file>
|
||||
@@ -21,8 +24,10 @@
|
||||
<file>noise-texture.png</file>
|
||||
<file>pad-osd.css</file>
|
||||
<file>process-working.svg</file>
|
||||
<file>toggle-off-us.svg</file>
|
||||
<file>toggle-off-intl.svg</file>
|
||||
<file>toggle-off-hc.svg</file>
|
||||
<file>toggle-on-us.svg</file>
|
||||
<file>toggle-on-intl.svg</file>
|
||||
<file>toggle-on-hc.svg</file>
|
||||
</gresource>
|
||||
|
1
data/theme/automatic-updates-off-symbolic.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><title>EOS_symbolic-icons_v0.1auto-updates_OFF</title><path d="M11.03,10.074a.125.125,0,0,0-.086.213l1.347,1.35a5.733,5.733,0,0,1-4.238,1.9,5.6,5.6,0,0,1-2.282-.484l-1.11,1.11a7.024,7.024,0,0,0,3.392.875,7.3,7.3,0,0,0,5.3-2.339l1.357,1.36a.125.125,0,0,0,.213-.086L15,10Z" style="fill:#999"/><path d="M12.921,5.9a6.354,6.354,0,0,1,.326,1.863.248.248,0,0,0,.244.244h1a.261.261,0,0,0,.257-.265,7.543,7.543,0,0,0-.677-2.991Z" style="fill:#999"/><path d="M6.286,9.707a.994.994,0,0,0,.715.3H9a1,1,0,0,0,1-1v-2A.994.994,0,0,0,9.7,6.3l2.175-2.175,0,0L12.93,3.067l0,0,1.4-1.4a.25.25,0,0,0,0-.354L13.617.608a.25.25,0,0,0-.354,0L11.772,2.1A6.97,6.97,0,0,0,7.948.961,7.3,7.3,0,0,0,2.651,3.3L1.293,1.94a.125.125,0,0,0-.214.086L1,6l3.971-.074a.125.125,0,0,0,.086-.213L3.71,4.363a5.733,5.733,0,0,1,4.238-1.9,5.523,5.523,0,0,1,2.723.739L7.86,6.011H7a1,1,0,0,0-1,1V7.87L3.291,10.58a6,6,0,0,1-.537-2.346.248.248,0,0,0-.244-.245h-1a.261.261,0,0,0-.257.265A7.329,7.329,0,0,0,2.172,11.7L.608,13.263a.25.25,0,0,0,0,.354l.707.707a.25.25,0,0,0,.354,0l1.4-1.4,0,0,1.056-1.056,0,0Z" style="fill:#999"/></svg>
|
After Width: | Height: | Size: 1.1 KiB |
1
data/theme/automatic-updates-on-symbolic.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><title>EOS_symbolic-icons_v0.1auto-updates_ON</title><rect x="6.001" y="6.011" width="4" height="4" rx="1" ry="1" style="fill:#999"/><path d="M5.057,5.713,3.71,4.362a5.733,5.733,0,0,1,4.238-1.9,5.173,5.173,0,0,1,5.3,5.305.248.248,0,0,0,.244.244h1a.261.261,0,0,0,.257-.265A6.684,6.684,0,0,0,7.948.961,7.3,7.3,0,0,0,2.65,3.3L1.293,1.94a.125.125,0,0,0-.213.086L1,6l3.971-.074A.125.125,0,0,0,5.057,5.713Z" style="fill:#999"/><path d="M11.03,10.074a.125.125,0,0,0-.086.213l1.347,1.35a5.733,5.733,0,0,1-4.238,1.9,5.173,5.173,0,0,1-5.3-5.305.248.248,0,0,0-.244-.245h-1a.261.261,0,0,0-.257.265,6.684,6.684,0,0,0,6.8,6.785,7.3,7.3,0,0,0,5.3-2.339l1.357,1.36a.125.125,0,0,0,.214-.086L15,10Z" style="fill:#999"/></svg>
|
After Width: | Height: | Size: 767 B |
1
data/theme/automatic-updates-scheduled-symbolic.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><title>EOS_symbolic-icons_v0.1update-scheduled_OUTLINE</title><path d="M7.99,15.054A6.7,6.7,0,0,1,1.06,8,6.7,6.7,0,0,1,7.99.954,6.71,6.71,0,0,1,14.948,8,6.71,6.71,0,0,1,7.99,15.054Zm0-12.6A5.2,5.2,0,0,0,2.56,8a5.2,5.2,0,0,0,5.43,5.55A5.215,5.215,0,0,0,13.448,8,5.216,5.216,0,0,0,7.99,2.454Z" style="fill:#999"/><path d="M9.209,10.443,7.2,8.437a.25.25,0,0,1-.073-.177l0-4.01A.25.25,0,0,1,7.379,4h1.25a.25.25,0,0,1,.25.25l0,3.283a.25.25,0,0,0,.073.177l1.5,1.494a.25.25,0,0,1,0,.354l-.883.884A.25.25,0,0,1,9.209,10.443Z" style="fill:#999"/></svg>
|
After Width: | Height: | Size: 603 B |
@@ -157,13 +157,18 @@ StScrollBar {
|
||||
|
||||
/* Switches */
|
||||
.toggle-switch {
|
||||
width: 46px;
|
||||
width: 65px;
|
||||
height: 22px;
|
||||
background-size: contain;
|
||||
background-image: url("resource:///org/gnome/shell/theme/toggle-off-intl.svg");
|
||||
&:checked { background-image: url("resource:///org/gnome/shell/theme/toggle-on-intl.svg"); }
|
||||
}
|
||||
|
||||
@each $v in us, intl {
|
||||
.toggle-switch-#{$v} {
|
||||
background-image: url("resource:///org/gnome/shell/theme/toggle-off-#{$v}.svg");
|
||||
&:checked { background-image: url("resource:///org/gnome/shell/theme/toggle-on-#{$v}.svg"); }
|
||||
}
|
||||
}
|
||||
|
||||
/* links */
|
||||
.shell-link {
|
||||
color: $link_color;
|
||||
@@ -382,6 +387,7 @@ StScrollBar {
|
||||
|
||||
.prompt-dialog-password-box {
|
||||
spacing: 1em;
|
||||
padding-bottom: 1em;
|
||||
}
|
||||
|
||||
.prompt-dialog-error-label {
|
||||
@@ -404,23 +410,6 @@ StScrollBar {
|
||||
padding-bottom: 8px;
|
||||
}
|
||||
|
||||
.prompt-dialog-pim-box {
|
||||
spacing: 1em;
|
||||
}
|
||||
|
||||
.prompt-dialog-grid {
|
||||
spacing-rows: 15px;
|
||||
spacing-columns: 1em;
|
||||
}
|
||||
|
||||
.prompt-dialog-keyfiles-box {
|
||||
spacing: 1em;
|
||||
}
|
||||
|
||||
.prompt-dialog-button.button {
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
|
||||
/* Polkit Dialog */
|
||||
|
||||
@@ -1153,12 +1142,6 @@ StScrollBar {
|
||||
|
||||
.ripple-box:rtl { border-radius: 0 0 0 52px; } // just a simple change to the border radius position
|
||||
|
||||
// Rubberband for select-area screenshots
|
||||
.select-area-rubberband {
|
||||
background-color: transparentize($selected_bg_color,0.7);
|
||||
border: 1px solid $selected_bg_color;
|
||||
}
|
||||
|
||||
// not really top bar only
|
||||
.popup-menu-arrow { icon-size: 1.09em; }
|
||||
.popup-menu-icon { icon-size: 1.09em; }
|
||||
@@ -1166,23 +1149,25 @@ StScrollBar {
|
||||
//close buttons
|
||||
|
||||
.window-close {
|
||||
background-color: $selected_bg_color;
|
||||
color: white;
|
||||
background-color: white;
|
||||
border-radius: 24px;
|
||||
border: 2px solid $selected_bg_color;
|
||||
border: 4px solid $selected_bg_color;
|
||||
box-shadow: inset 0 -4px 0 0 transparentize($selected_bg_color, 0.5);
|
||||
color: $selected_bg_color;
|
||||
height: 24px;
|
||||
width: 24px;
|
||||
-shell-close-overlap: 11px;
|
||||
box-shadow: -1px 1px 5px 0px transparentize(black, 0.5);
|
||||
-shell-close-overlap: 14px;
|
||||
|
||||
&:hover {
|
||||
background-color: lighten($selected_bg_color, 5%);
|
||||
border-color: lighten($selected_bg_color, 5%);
|
||||
background-color: $selected_bg_color;
|
||||
border-color: white;
|
||||
color: white;
|
||||
}
|
||||
|
||||
&:active {
|
||||
background-color: darken($selected_bg_color, 5%);
|
||||
border-color: darken($selected_bg_color, 5%);
|
||||
background-color: mix(white, $selected_bg_color, 75%);
|
||||
border-color: $selected_bg_color;
|
||||
color: $selected_bg_color;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1247,14 +1232,13 @@ StScrollBar {
|
||||
}
|
||||
|
||||
.window-clone-border {
|
||||
$_bg: transparentize(white, 0.65);
|
||||
border: 5px solid $_bg;
|
||||
border-radius: 6px;
|
||||
border: 4px solid $selected_bg_color;
|
||||
border-radius: 4px;
|
||||
// For window decorations with round corners we can't match
|
||||
// the exact shape when the window is scaled. So apply a shadow
|
||||
// to fix that case
|
||||
box-shadow: inset 0 0 0 1px $_bg;
|
||||
}
|
||||
box-shadow: inset 0px 0px 0px 1px $selected_bg_color;
|
||||
}
|
||||
.window-caption {
|
||||
spacing: 25px;
|
||||
color: $selected_fg_color;
|
||||
|
@@ -10,62 +10,124 @@
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="46"
|
||||
width="65"
|
||||
height="22"
|
||||
viewBox="0 0 46 22"
|
||||
id="svg2857"
|
||||
version="1.1"
|
||||
id="svg2751"
|
||||
inkscape:version="0.92.4 5da689c313, 2019-01-14"
|
||||
sodipodi:docname="toggle-off-intl.svg">
|
||||
inkscape:version="0.48.5 r10040"
|
||||
sodipodi:docname="toggle-off-us.svg">
|
||||
<defs
|
||||
id="defs2745">
|
||||
id="defs2859">
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 526.18109 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="744.09448 : 526.18109 : 1"
|
||||
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
|
||||
id="perspective2865" />
|
||||
<inkscape:perspective
|
||||
id="perspective2843"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient3329">
|
||||
xlink:href="#linearGradient76469-7-7-4"
|
||||
id="linearGradient38024"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.0215462,0,0,1.0322581,717.22867,428.68472)"
|
||||
x1="6"
|
||||
y1="102.95528"
|
||||
x2="6"
|
||||
y2="84.505203" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient76469-7-7-4">
|
||||
<stop
|
||||
style="stop-color:#39393a;stop-opacity:1;"
|
||||
style="stop-color:#2e3232;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop3325" />
|
||||
id="stop76471-7-1-5" />
|
||||
<stop
|
||||
style="stop-color:#302f30;stop-opacity:1"
|
||||
style="stop-color:#3e4545;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop3327" />
|
||||
id="stop76473-9-0-0" />
|
||||
</linearGradient>
|
||||
<inkscape:path-effect
|
||||
effect="spiro"
|
||||
id="path-effect77541-4"
|
||||
is_visible="true" />
|
||||
<inkscape:path-effect
|
||||
effect="spiro"
|
||||
id="path-effect77541-4-0"
|
||||
is_visible="true" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient37802-8"
|
||||
id="linearGradient12311-3-1-0-5-4"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.5918367,0,0,0.85714285,-256.56122,59.071426)"
|
||||
x1="610.13782"
|
||||
y1="501.43866"
|
||||
x2="610.13782"
|
||||
y2="492.52756" />
|
||||
<linearGradient
|
||||
id="linearGradient37802-8"
|
||||
inkscape:collect="always">
|
||||
<stop
|
||||
id="stop37804-1"
|
||||
offset="0"
|
||||
style="stop-color:#2c2c2c;stop-opacity:1" />
|
||||
<stop
|
||||
id="stop37806-8"
|
||||
offset="1"
|
||||
style="stop-color:#16191a;stop-opacity:1" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3329"
|
||||
id="linearGradient3331"
|
||||
x1="53"
|
||||
y1="294.42917"
|
||||
x2="53"
|
||||
y2="309.80417"
|
||||
y2="492.52756"
|
||||
x2="610.13782"
|
||||
y1="501.43866"
|
||||
x1="610.13782"
|
||||
gradientTransform="matrix(1.5918367,0,0,0.85714285,-900.56122,-423.92857)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(-42.760724)" />
|
||||
id="linearGradient13602"
|
||||
xlink:href="#linearGradient37802-8"
|
||||
inkscape:collect="always" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#535353"
|
||||
pagecolor="#000000"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="1"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1"
|
||||
inkscape:cx="-19.436775"
|
||||
inkscape:cy="-13.499723"
|
||||
inkscape:cx="-5.0602834"
|
||||
inkscape:cy="16.473273"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:current-layer="g37994"
|
||||
showgrid="false"
|
||||
units="px"
|
||||
inkscape:pagecheckerboard="true"
|
||||
inkscape:window-width="2560"
|
||||
inkscape:window-height="1375"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
borderlayer="true"
|
||||
inkscape:showpageshadow="false"
|
||||
inkscape:snap-nodes="false"
|
||||
inkscape:snap-bbox="true"
|
||||
showborder="false">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid3298" />
|
||||
id="grid12954"
|
||||
empspacing="5"
|
||||
visible="true"
|
||||
enabled="true"
|
||||
snapvisiblegridlinesonly="true" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata2748">
|
||||
id="metadata2862">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
@@ -80,24 +142,68 @@
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(0,-291.17916)">
|
||||
<rect
|
||||
style="opacity:1;vector-effect:none;fill:#323233;fill-opacity:1;stroke:#272728;stroke-width:1.08532763;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
|
||||
id="rect3296"
|
||||
width="44.446434"
|
||||
height="20.910645"
|
||||
x="0.625"
|
||||
y="291.71494"
|
||||
rx="10.455324"
|
||||
ry="10.073335" />
|
||||
<rect
|
||||
ry="10.455322"
|
||||
rx="10.455322"
|
||||
y="291.71494"
|
||||
x="0.5428465"
|
||||
height="20.910645"
|
||||
width="21.142862"
|
||||
id="rect3300"
|
||||
style="opacity:1;vector-effect:none;fill:url(#linearGradient3331);fill-opacity:1;stroke:#151515;stroke-width:1.08532763;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal" />
|
||||
transform="translate(-444.64286,-781.36218)">
|
||||
<g
|
||||
transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)"
|
||||
id="g37994">
|
||||
<g
|
||||
id="g37996"
|
||||
transform="translate(-115,1277)">
|
||||
<rect
|
||||
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964000000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.19591837"
|
||||
id="rect13475"
|
||||
width="98"
|
||||
height="25"
|
||||
x="644.5"
|
||||
y="484.61118"
|
||||
rx="4.7429576"
|
||||
ry="3.8424656" />
|
||||
<rect
|
||||
ry="3.8424656"
|
||||
rx="4.7429576"
|
||||
y="483.5"
|
||||
x="644.5"
|
||||
height="25"
|
||||
width="98"
|
||||
id="rect38000"
|
||||
style="color:#000000;fill:url(#linearGradient12311-3-1-0-5-4);fill-opacity:1;fill-rule:nonzero;stroke:#16191a;stroke-width:1.37920942;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
|
||||
</g>
|
||||
<g
|
||||
transform="translate(-49.946213,-1.890275)"
|
||||
id="g38002">
|
||||
<g
|
||||
transform="translate(-115,1247)"
|
||||
style="display:inline"
|
||||
id="g38004">
|
||||
<rect
|
||||
ry="3.7972314"
|
||||
rx="4.6871223"
|
||||
y="515.5"
|
||||
x="694.53046"
|
||||
height="25"
|
||||
width="45.969578"
|
||||
id="rect38006"
|
||||
style="color:#000000;fill:url(#linearGradient38024);fill-opacity:1;fill-rule:nonzero;stroke:#1f2020;stroke-width:1.37920964;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
style="opacity:0.1;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||
d="m 699.09675,516.7365 36.86904,0"
|
||||
id="path38016"
|
||||
inkscape:path-effect="#path-effect77541-4"
|
||||
inkscape:original-d="m 699.09675,516.7365 36.86904,0"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:2.15627193;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
|
||||
id="path13479"
|
||||
sodipodi:cx="16.4375"
|
||||
sodipodi:cy="10.8125"
|
||||
sodipodi:rx="4.3125"
|
||||
sodipodi:ry="4.3125"
|
||||
d="m 20.75,10.8125 a 4.3125,4.3125 0 1 1 -8.625,0 4.3125,4.3125 0 1 1 8.625,0 z"
|
||||
transform="matrix(1.4212691,0,0,1.1514287,577.38488,1761.1138)" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 7.5 KiB |
255
data/theme/toggle-off-us.svg
Normal file
@@ -0,0 +1,255 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="65"
|
||||
height="22"
|
||||
id="svg2857"
|
||||
version="1.1"
|
||||
inkscape:version="0.48.5 r10040"
|
||||
sodipodi:docname="toggle-on-intl.svg">
|
||||
<defs
|
||||
id="defs2859">
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 526.18109 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="744.09448 : 526.18109 : 1"
|
||||
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
|
||||
id="perspective2865" />
|
||||
<inkscape:perspective
|
||||
id="perspective2843"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient76469-7-7-4"
|
||||
id="linearGradient38024"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.0215462,0,0,1.0322581,717.22867,428.68472)"
|
||||
x1="6"
|
||||
y1="102.95528"
|
||||
x2="6"
|
||||
y2="84.505203" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient76469-7-7-4">
|
||||
<stop
|
||||
style="stop-color:#2e3232;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop76471-7-1-5" />
|
||||
<stop
|
||||
style="stop-color:#3e4545;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop76473-9-0-0" />
|
||||
</linearGradient>
|
||||
<inkscape:path-effect
|
||||
effect="spiro"
|
||||
id="path-effect77541-4"
|
||||
is_visible="true" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient37802"
|
||||
id="linearGradient12311-3-1-0-5"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.5918367,0,0,0.85714285,-256.56122,59.071426)"
|
||||
x1="610.13782"
|
||||
y1="501.43866"
|
||||
x2="610.13782"
|
||||
y2="492.52756" />
|
||||
<linearGradient
|
||||
id="linearGradient37802"
|
||||
inkscape:collect="always">
|
||||
<stop
|
||||
id="stop37804"
|
||||
offset="0"
|
||||
style="stop-color:#2c2c2c;stop-opacity:1" />
|
||||
<stop
|
||||
id="stop37806"
|
||||
offset="1"
|
||||
style="stop-color:#16191a;stop-opacity:1" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient76469-7-7-4-3"
|
||||
id="linearGradient77680"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1,0,0,1.0322581,717.71949,428.68472)"
|
||||
x1="6"
|
||||
y1="102.95528"
|
||||
x2="6"
|
||||
y2="84.505203" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient76469-7-7-4-3">
|
||||
<stop
|
||||
style="stop-color:#2e3232;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop76471-7-1-5-7" />
|
||||
<stop
|
||||
style="stop-color:#3e4545;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop76473-9-0-0-9" />
|
||||
</linearGradient>
|
||||
<inkscape:path-effect
|
||||
effect="spiro"
|
||||
id="path-effect77541-4-0"
|
||||
is_visible="true" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient37802-8"
|
||||
id="linearGradient12311-3-1-0-5-4"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.5918367,0,0,0.85714285,-256.56122,59.071426)"
|
||||
x1="610.13782"
|
||||
y1="501.43866"
|
||||
x2="610.13782"
|
||||
y2="492.52756" />
|
||||
<linearGradient
|
||||
id="linearGradient37802-8"
|
||||
inkscape:collect="always">
|
||||
<stop
|
||||
id="stop37804-1"
|
||||
offset="0"
|
||||
style="stop-color:#2c2c2c;stop-opacity:1" />
|
||||
<stop
|
||||
id="stop37806-8"
|
||||
offset="1"
|
||||
style="stop-color:#16191a;stop-opacity:1" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
y2="492.52756"
|
||||
x2="610.13782"
|
||||
y1="501.43866"
|
||||
x1="610.13782"
|
||||
gradientTransform="matrix(1.5918367,0,0,0.85714285,-900.56122,-423.92857)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient13602"
|
||||
xlink:href="#linearGradient37802-8"
|
||||
inkscape:collect="always" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#000000"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="1"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1"
|
||||
inkscape:cx="16.760995"
|
||||
inkscape:cy="21.955673"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="g37994"
|
||||
showgrid="false"
|
||||
inkscape:window-width="2560"
|
||||
inkscape:window-height="1375"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
borderlayer="true"
|
||||
inkscape:showpageshadow="false"
|
||||
inkscape:snap-nodes="false"
|
||||
inkscape:snap-bbox="true"
|
||||
showborder="false">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid12954"
|
||||
empspacing="5"
|
||||
visible="true"
|
||||
enabled="true"
|
||||
snapvisiblegridlinesonly="true" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata2862">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-444.64286,-781.36218)">
|
||||
<g
|
||||
transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)"
|
||||
id="g37994">
|
||||
<g
|
||||
id="g37996"
|
||||
transform="translate(-115,1277)">
|
||||
<rect
|
||||
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964000000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.19591837"
|
||||
id="rect13475"
|
||||
width="98"
|
||||
height="25"
|
||||
x="644.5"
|
||||
y="484.61118"
|
||||
rx="4.7429576"
|
||||
ry="3.8424656" />
|
||||
<rect
|
||||
ry="3.8424656"
|
||||
rx="4.7429576"
|
||||
y="483.5"
|
||||
x="644.5"
|
||||
height="25"
|
||||
width="98"
|
||||
id="rect38000"
|
||||
style="color:#000000;fill:url(#linearGradient12311-3-1-0-5-4);fill-opacity:1;fill-rule:nonzero;stroke:#16191a;stroke-width:1.37920942;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
|
||||
</g>
|
||||
<g
|
||||
transform="translate(-49.946213,-1.890275)"
|
||||
id="g38002">
|
||||
<g
|
||||
transform="translate(-115,1247)"
|
||||
style="display:inline"
|
||||
id="g38004">
|
||||
<rect
|
||||
ry="3.7972314"
|
||||
rx="4.6871223"
|
||||
y="515.5"
|
||||
x="694.53046"
|
||||
height="25"
|
||||
width="45.969578"
|
||||
id="rect38006"
|
||||
style="color:#000000;fill:url(#linearGradient38024);fill-opacity:1;fill-rule:nonzero;stroke:#1f2020;stroke-width:1.37920964;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
style="opacity:0.1;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||
d="m 699.09675,516.7365 36.86904,0"
|
||||
id="path38016"
|
||||
inkscape:path-effect="#path-effect77541-4"
|
||||
inkscape:original-d="m 699.09675,516.7365 36.86904,0"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:13.79166794px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Cantarell;-inkscape-font-specification:Cantarell Bold"
|
||||
x="520.29974"
|
||||
y="1997.0011"
|
||||
id="text75614"
|
||||
sodipodi:linespacing="125%"
|
||||
transform="scale(1.1236771,0.88993537)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan75616"
|
||||
x="520.29974"
|
||||
y="1997.0011">OFF</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 8.8 KiB |
@@ -10,69 +10,117 @@
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="46"
|
||||
width="65"
|
||||
height="22"
|
||||
viewBox="0 0 46 22"
|
||||
id="svg2857"
|
||||
version="1.1"
|
||||
id="svg2751"
|
||||
inkscape:version="0.92.4 5da689c313, 2019-01-14"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="toggle-on-intl.svg">
|
||||
<defs
|
||||
id="defs2745">
|
||||
id="defs2859">
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 526.18109 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="744.09448 : 526.18109 : 1"
|
||||
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
|
||||
id="perspective2865" />
|
||||
<inkscape:perspective
|
||||
id="perspective2843"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient3329">
|
||||
xlink:href="#linearGradient77461"
|
||||
id="linearGradient77551"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.3066667,0,0,1,-841.64667,-483)"
|
||||
x1="1164.7644"
|
||||
y1="962.93695"
|
||||
x2="1164.7644"
|
||||
y2="970.51404" />
|
||||
<linearGradient
|
||||
id="linearGradient77461"
|
||||
inkscape:collect="always">
|
||||
<stop
|
||||
style="stop-color:#39393a;stop-opacity:1;"
|
||||
id="stop77463"
|
||||
offset="0"
|
||||
id="stop3325" />
|
||||
style="stop-color:#182f4c;stop-opacity:1" />
|
||||
<stop
|
||||
style="stop-color:#302f30;stop-opacity:1"
|
||||
id="stop77465"
|
||||
offset="1"
|
||||
id="stop3327" />
|
||||
style="stop-color:#205b9a;stop-opacity:1" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3329"
|
||||
id="linearGradient3331"
|
||||
x1="53"
|
||||
y1="294.42917"
|
||||
x2="53"
|
||||
y2="309.80417"
|
||||
xlink:href="#linearGradient76469-7-7-4"
|
||||
id="linearGradient38024"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(-19)" />
|
||||
gradientTransform="matrix(1.0215462,0,0,1.0322581,717.22867,428.68472)"
|
||||
x1="6"
|
||||
y1="102.95528"
|
||||
x2="6"
|
||||
y2="84.505203" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient76469-7-7-4">
|
||||
<stop
|
||||
style="stop-color:#2e3232;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop76471-7-1-5" />
|
||||
<stop
|
||||
style="stop-color:#3e4545;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop76473-9-0-0" />
|
||||
</linearGradient>
|
||||
<inkscape:path-effect
|
||||
effect="spiro"
|
||||
id="path-effect77541-4"
|
||||
is_visible="true" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#535353"
|
||||
pagecolor="#000000"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="1"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1"
|
||||
inkscape:cx="13.588971"
|
||||
inkscape:cy="14.124546"
|
||||
inkscape:cx="37.410841"
|
||||
inkscape:cy="16.009314"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:current-layer="g37994"
|
||||
showgrid="false"
|
||||
units="px"
|
||||
inkscape:pagecheckerboard="true"
|
||||
inkscape:window-width="2560"
|
||||
inkscape:window-height="1376"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
borderlayer="true"
|
||||
inkscape:showpageshadow="false"
|
||||
inkscape:snap-nodes="false"
|
||||
inkscape:snap-bbox="true"
|
||||
showborder="false">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid3298" />
|
||||
id="grid12954"
|
||||
empspacing="5"
|
||||
visible="true"
|
||||
enabled="true"
|
||||
snapvisiblegridlinesonly="true" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata2748">
|
||||
id="metadata2862">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
@@ -80,24 +128,65 @@
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(0,-291.17916)">
|
||||
<rect
|
||||
style="opacity:1;vector-effect:none;fill:#15539e;fill-opacity:1;stroke:#030e1b;stroke-width:1.08532763;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
|
||||
id="rect3296"
|
||||
width="44.446434"
|
||||
height="20.910645"
|
||||
x="0.625"
|
||||
y="291.71494"
|
||||
rx="10.455324"
|
||||
ry="10.073335" />
|
||||
<rect
|
||||
ry="10.455322"
|
||||
rx="10.455322"
|
||||
y="291.71494"
|
||||
x="24.30357"
|
||||
height="20.910645"
|
||||
width="21.142862"
|
||||
id="rect3300"
|
||||
style="opacity:1;vector-effect:none;fill:url(#linearGradient3331);fill-opacity:1;stroke:#030e1b;stroke-width:1.08532763;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal" />
|
||||
transform="translate(-444.64286,-781.36218)">
|
||||
<g
|
||||
transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)"
|
||||
id="g37994">
|
||||
<g
|
||||
id="g37996"
|
||||
transform="translate(-115,1277)">
|
||||
<rect
|
||||
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964000000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.19591837"
|
||||
id="rect13475"
|
||||
width="98"
|
||||
height="25"
|
||||
x="644.5"
|
||||
y="484.61118"
|
||||
rx="4.7429576"
|
||||
ry="3.8424656" />
|
||||
<rect
|
||||
ry="3.8424656"
|
||||
rx="4.7429576"
|
||||
y="483.5"
|
||||
x="644.5"
|
||||
height="25"
|
||||
width="98"
|
||||
id="rect38000"
|
||||
style="color:#000000;fill:url(#linearGradient77551);fill-opacity:1;fill-rule:nonzero;stroke:#182f4c;stroke-width:1.37920964;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
|
||||
</g>
|
||||
<g
|
||||
transform="translate(2.0625,-2)"
|
||||
id="g38002">
|
||||
<g
|
||||
transform="translate(-115,1247)"
|
||||
style="display:inline"
|
||||
id="g38004">
|
||||
<rect
|
||||
ry="3.7972314"
|
||||
rx="4.6871223"
|
||||
y="515.5"
|
||||
x="694.53046"
|
||||
height="25"
|
||||
width="45.969578"
|
||||
id="rect38006"
|
||||
style="color:#000000;fill:url(#linearGradient38024);fill-opacity:1;fill-rule:nonzero;stroke:#1f2020;stroke-width:1.37920964;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
style="opacity:0.1;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||
d="m 699.09675,516.7365 36.86904,0"
|
||||
id="path38016"
|
||||
inkscape:path-effect="#path-effect77541-4"
|
||||
inkscape:original-d="m 699.09675,516.7365 36.86904,0"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
<rect
|
||||
style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
|
||||
id="rect13678"
|
||||
width="3.0646207"
|
||||
height="12.414008"
|
||||
x="554.77728"
|
||||
y="1767.3566" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 6.8 KiB |
207
data/theme/toggle-on-us.svg
Normal file
@@ -0,0 +1,207 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="65"
|
||||
height="22"
|
||||
id="svg2857"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="toggle-on-us.svg">
|
||||
<defs
|
||||
id="defs2859">
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 526.18109 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="744.09448 : 526.18109 : 1"
|
||||
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
|
||||
id="perspective2865" />
|
||||
<inkscape:perspective
|
||||
id="perspective2843"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient76469-7-7-4"
|
||||
id="linearGradient38024"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.0215462,0,0,1.0322581,717.22867,428.68472)"
|
||||
x1="6"
|
||||
y1="102.95528"
|
||||
x2="6"
|
||||
y2="84.505203" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient76469-7-7-4">
|
||||
<stop
|
||||
style="stop-color:#2e3232;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop76471-7-1-5" />
|
||||
<stop
|
||||
style="stop-color:#3e4545;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop76473-9-0-0" />
|
||||
</linearGradient>
|
||||
<inkscape:path-effect
|
||||
effect="spiro"
|
||||
id="path-effect77541-4"
|
||||
is_visible="true" />
|
||||
<linearGradient
|
||||
id="linearGradient77461-1"
|
||||
inkscape:collect="always">
|
||||
<stop
|
||||
id="stop77463-1"
|
||||
offset="0"
|
||||
style="stop-color:#182f4c;stop-opacity:1" />
|
||||
<stop
|
||||
id="stop77465-4"
|
||||
offset="1"
|
||||
style="stop-color:#205b9a;stop-opacity:1" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient77461-1"
|
||||
id="linearGradient77551-6-5"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.8527367,0,0,0.80554422,-969.41608,-778.00299)"
|
||||
x1="1164.7644"
|
||||
y1="962.93695"
|
||||
x2="1164.7644"
|
||||
y2="970.51404" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient77461-1"
|
||||
id="linearGradient11198"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.3066667,0,0,1,-1066.3709,794.25325)"
|
||||
x1="1322.5831"
|
||||
y1="-312.51855"
|
||||
x2="1322.5831"
|
||||
y2="-306.53461" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#000000"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="1"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1"
|
||||
inkscape:cx="-26.798898"
|
||||
inkscape:cy="5.3753009"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="g37994"
|
||||
showgrid="false"
|
||||
inkscape:window-width="2560"
|
||||
inkscape:window-height="1376"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
borderlayer="true"
|
||||
inkscape:showpageshadow="false"
|
||||
inkscape:snap-nodes="false"
|
||||
inkscape:snap-bbox="true"
|
||||
showborder="false">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid12954"
|
||||
empspacing="5"
|
||||
visible="true"
|
||||
enabled="true"
|
||||
snapvisiblegridlinesonly="true" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata2862">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-444.64286,-781.36218)">
|
||||
<g
|
||||
transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)"
|
||||
id="g37994">
|
||||
<g
|
||||
id="g37996"
|
||||
transform="translate(-115,1277)">
|
||||
<rect
|
||||
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964000000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.19591837"
|
||||
id="rect13475"
|
||||
width="98"
|
||||
height="25"
|
||||
x="644.5"
|
||||
y="484.61118"
|
||||
rx="4.7429576"
|
||||
ry="3.8424656" />
|
||||
<rect
|
||||
ry="3.8424656"
|
||||
rx="4.7429576"
|
||||
y="483.5"
|
||||
x="644.5"
|
||||
height="25"
|
||||
width="98"
|
||||
id="rect38000"
|
||||
style="color:#000000;fill:url(#linearGradient11198);fill-opacity:1;fill-rule:nonzero;stroke:#182f4c;stroke-width:1.37920964;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;clip-rule:nonzero;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;filter-blend-mode:normal;filter-gaussianBlur-deviation:0;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto" />
|
||||
</g>
|
||||
<g
|
||||
transform="translate(2.0625,-2)"
|
||||
id="g38002">
|
||||
<g
|
||||
transform="translate(-115,1247)"
|
||||
style="display:inline"
|
||||
id="g38004">
|
||||
<rect
|
||||
ry="3.7972314"
|
||||
rx="4.6871223"
|
||||
y="515.5"
|
||||
x="694.53046"
|
||||
height="25"
|
||||
width="45.969578"
|
||||
id="rect38006"
|
||||
style="color:#000000;fill:url(#linearGradient38024);fill-opacity:1;fill-rule:nonzero;stroke:#1f2020;stroke-width:1.37920964;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
style="opacity:0.1;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||
d="m 699.09675,516.7365 36.86904,0"
|
||||
id="path38016"
|
||||
inkscape:path-effect="#path-effect77541-4"
|
||||
inkscape:original-d="m 699.09675,516.7365 36.86904,0"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
<text
|
||||
transform="scale(1.1000946,0.90901274)"
|
||||
sodipodi:linespacing="125%"
|
||||
id="text38018"
|
||||
y="1955.5205"
|
||||
x="495.94223"
|
||||
style="font-size:13.29953671px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Cantarell;-inkscape-font-specification:Cantarell Bold"
|
||||
xml:space="preserve"><tspan
|
||||
y="1955.5205"
|
||||
x="495.94223"
|
||||
id="tspan38020"
|
||||
sodipodi:role="line">ON</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 7.7 KiB |
@@ -551,9 +551,9 @@ class ExtensionRow extends Gtk.ListBoxRow {
|
||||
|
||||
let button = new Gtk.Button({ valign: Gtk.Align.CENTER,
|
||||
no_show_all: true });
|
||||
button.set_image(new Gtk.Image({ icon_name: 'emblem-system-symbolic',
|
||||
icon_size: Gtk.IconSize.BUTTON,
|
||||
visible: true }));
|
||||
button.add(new Gtk.Image({ icon_name: 'emblem-system-symbolic',
|
||||
icon_size: Gtk.IconSize.BUTTON,
|
||||
visible: true }));
|
||||
button.get_style_context().add_class('circular');
|
||||
hbox.add(button);
|
||||
|
||||
|
@@ -124,7 +124,7 @@ var Batch = class extends Task {
|
||||
}
|
||||
|
||||
process() {
|
||||
throw new GObject.NotImplementedError(`process in ${this.constructor.name}`);
|
||||
throw new Error('Not implemented');
|
||||
}
|
||||
|
||||
runTask() {
|
||||
|
@@ -325,7 +325,7 @@ var SessionMenuButton = class {
|
||||
this._button.remove_style_pseudo_class('active');
|
||||
});
|
||||
|
||||
this._manager = new PopupMenu.PopupMenuManager(this._button,
|
||||
this._manager = new PopupMenu.PopupMenuManager({ actor: this._button },
|
||||
{ actionMode: Shell.ActionMode.NONE });
|
||||
this._manager.addMenu(this._menu);
|
||||
|
||||
@@ -652,7 +652,7 @@ var LoginDialog = GObject.registerClass({
|
||||
bannerAllocation.x2 = Math.floor(centerX - centerGap / 2);
|
||||
bannerAllocation.x1 = Math.floor(bannerAllocation.x2 - wideBannerWidth);
|
||||
|
||||
// figure out how tall it would like to be and try to accommodate
|
||||
// figure out how tall it would like to be and try to accomodate
|
||||
// but don't let it get too close to the logo
|
||||
let [wideMinHeight, wideBannerHeight] = this._bannerView.get_preferred_height(wideBannerWidth);
|
||||
|
||||
|
@@ -9,6 +9,7 @@
|
||||
<file>gdm/realmd.js</file>
|
||||
<file>gdm/util.js</file>
|
||||
|
||||
<file>misc/updateManager.js</file>
|
||||
<file>misc/config.js</file>
|
||||
<file>misc/extensionUtils.js</file>
|
||||
<file>misc/fileUtils.js</file>
|
||||
@@ -116,9 +117,11 @@
|
||||
<file>ui/components/networkAgent.js</file>
|
||||
<file>ui/components/polkitAgent.js</file>
|
||||
<file>ui/components/telepathyClient.js</file>
|
||||
<file>ui/components/updates.js</file>
|
||||
<file>ui/components/keyring.js</file>
|
||||
|
||||
<file>ui/status/accessibility.js</file>
|
||||
<file>ui/status/automaticUpdates.js</file>
|
||||
<file>ui/status/brightness.js</file>
|
||||
<file>ui/status/location.js</file>
|
||||
<file>ui/status/keyboard.js</file>
|
||||
|
@@ -42,6 +42,8 @@ var IntrospectService = class {
|
||||
}
|
||||
|
||||
_isStandaloneApp(app) {
|
||||
let windows = app.get_windows();
|
||||
|
||||
return app.get_windows().some(w => w.transient_for == null);
|
||||
}
|
||||
|
||||
@@ -53,11 +55,6 @@ var IntrospectService = class {
|
||||
return APP_WHITELIST.includes(sender);
|
||||
}
|
||||
|
||||
_getSandboxedAppId(app) {
|
||||
let ids = app.get_windows().map(w => w.get_sandboxed_app_id());
|
||||
return ids.find(id => id != null);
|
||||
}
|
||||
|
||||
_syncRunningApplications() {
|
||||
let tracker = Shell.WindowTracker.get_default();
|
||||
let apps = this._appSystem.get_running();
|
||||
@@ -79,10 +76,6 @@ var IntrospectService = class {
|
||||
newActiveApplication = app.get_id();
|
||||
}
|
||||
|
||||
let sandboxedAppId = this._getSandboxedAppId(app);
|
||||
if (sandboxedAppId)
|
||||
appInfo['sandboxed-app-id'] = new GLib.Variant('s', sandboxedAppId);
|
||||
|
||||
newRunningApplications[app.get_id()] = appInfo;
|
||||
}
|
||||
|
||||
@@ -144,7 +137,6 @@ var IntrospectService = class {
|
||||
let frameRect = window.get_frame_rect();
|
||||
let title = window.get_title();
|
||||
let wmClass = window.get_wm_class();
|
||||
let sandboxedAppId = window.get_sandboxed_app_id();
|
||||
|
||||
windowsList[windowId] = {
|
||||
'app-id': GLib.Variant.new('s', app.get_id()),
|
||||
@@ -161,10 +153,6 @@ var IntrospectService = class {
|
||||
|
||||
if (wmClass != null)
|
||||
windowsList[windowId]['wm-class'] = GLib.Variant.new('s', wmClass);
|
||||
|
||||
if (sandboxedAppId != null)
|
||||
windowsList[windowId]['sandboxed-app-id'] =
|
||||
GLib.Variant.new('s', sandboxedAppId);
|
||||
}
|
||||
}
|
||||
invocation.return_value(new GLib.Variant('(a{ta{sv}})', [windowsList]));
|
||||
|
@@ -88,42 +88,42 @@ const SystemActions = GObject.registerClass({
|
||||
name: C_("search-result", "Power Off"),
|
||||
iconName: 'system-shutdown-symbolic',
|
||||
// Translators: A list of keywords that match the power-off action, separated by semicolons
|
||||
keywords: _("power off;shutdown;reboot;restart").split(/[; ]/),
|
||||
keywords: _("power off;shutdown;reboot;restart").split(';'),
|
||||
available: false });
|
||||
this._actions.set(LOCK_SCREEN_ACTION_ID,
|
||||
{ // Translators: The name of the lock screen action in search
|
||||
name: C_("search-result", "Lock Screen"),
|
||||
iconName: 'system-lock-screen-symbolic',
|
||||
// Translators: A list of keywords that match the lock screen action, separated by semicolons
|
||||
keywords: _("lock screen").split(/[; ]/),
|
||||
keywords: _("lock screen").split(';'),
|
||||
available: false });
|
||||
this._actions.set(LOGOUT_ACTION_ID,
|
||||
{ // Translators: The name of the logout action in search
|
||||
name: C_("search-result", "Log Out"),
|
||||
iconName: 'application-exit-symbolic',
|
||||
// Translators: A list of keywords that match the logout action, separated by semicolons
|
||||
keywords: _("logout;log out;sign off").split(/[; ]/),
|
||||
keywords: _("logout;sign off").split(';'),
|
||||
available: false });
|
||||
this._actions.set(SUSPEND_ACTION_ID,
|
||||
{ // Translators: The name of the suspend action in search
|
||||
name: C_("search-result", "Suspend"),
|
||||
iconName: 'media-playback-pause-symbolic',
|
||||
// Translators: A list of keywords that match the suspend action, separated by semicolons
|
||||
keywords: _("suspend;sleep").split(/[; ]/),
|
||||
keywords: _("suspend;sleep").split(';'),
|
||||
available: false });
|
||||
this._actions.set(SWITCH_USER_ACTION_ID,
|
||||
{ // Translators: The name of the switch user action in search
|
||||
name: C_("search-result", "Switch User"),
|
||||
iconName: 'system-switch-user-symbolic',
|
||||
// Translators: A list of keywords that match the switch user action, separated by semicolons
|
||||
keywords: _("switch user").split(/[; ]/),
|
||||
keywords: _("switch user").split(';'),
|
||||
available: false });
|
||||
this._actions.set(LOCK_ORIENTATION_ACTION_ID,
|
||||
{ // Translators: The name of the lock orientation action in search
|
||||
name: C_("search-result", "Lock Orientation"),
|
||||
iconName: '',
|
||||
// Translators: A list of keywords that match the lock orientation action, separated by semicolons
|
||||
keywords: _("lock orientation;screen;rotation").split(/[; ]/),
|
||||
keywords: _("lock orientation;screen;rotation").split(';'),
|
||||
available: false });
|
||||
|
||||
this._loginScreenSettings = new Gio.Settings({ schema_id: LOGIN_SCREEN_SCHEMA });
|
||||
@@ -262,7 +262,7 @@ const SystemActions = GObject.registerClass({
|
||||
let results = [];
|
||||
|
||||
for (let [key, {available, keywords}] of this._actions)
|
||||
if (available && terms.every(t => keywords.some(k => k.startsWith(t))))
|
||||
if (available && terms.every(t => keywords.some(k => (k.indexOf(t) >= 0))))
|
||||
results.push(key);
|
||||
|
||||
return results;
|
||||
|
338
js/misc/updateManager.js
Normal file
@@ -0,0 +1,338 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
//
|
||||
// Copyright (C) 2019 Endless Mobile, Inc.
|
||||
//
|
||||
// This is a GNOME Shell component to wrap the interactions over
|
||||
// D-Bus with the Mogwai system daemon.
|
||||
//
|
||||
// Licensed under the GNU General Public License Version 2
|
||||
//
|
||||
// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
const { Clutter, Gio, GLib,
|
||||
GObject, Gtk, NM, Shell, St } = imports.gi;
|
||||
|
||||
const NM_SETTING_AUTOMATIC_UPDATES_NOTIFICATION_TIME = "connection.automatic-updates-notification-time";
|
||||
const NM_SETTING_ALLOW_DOWNLOADS = 'connection.allow-downloads';
|
||||
const NM_SETTING_TARIFF_ENABLED = "connection.tariff-enabled";
|
||||
|
||||
const SchedulerInterface = '\
|
||||
<node> \
|
||||
<interface name="com.endlessm.DownloadManager1.Scheduler"> \
|
||||
<property name="ActiveEntryCount" type="u" access="read" /> \
|
||||
<property name="EntryCount" type="u" access="read" /> \
|
||||
</interface> \
|
||||
</node>';
|
||||
|
||||
const SchedulerProxy = Gio.DBusProxy.makeProxyWrapper(SchedulerInterface);
|
||||
|
||||
let _updateManager = null;
|
||||
|
||||
function getUpdateManager() {
|
||||
if (_updateManager == null)
|
||||
_updateManager = new UpdateManager();
|
||||
return _updateManager;
|
||||
}
|
||||
|
||||
var State = {
|
||||
UNKNOWN: 0,
|
||||
DISCONNECTED: 1,
|
||||
DISABLED: 2,
|
||||
IDLE: 3,
|
||||
SCHEDULED: 4,
|
||||
DOWNLOADING: 5
|
||||
};
|
||||
|
||||
function stateToIconName(state) {
|
||||
switch (state) {
|
||||
case State.UNKNOWN:
|
||||
case State.DISCONNECTED:
|
||||
return null;
|
||||
|
||||
case State.DISABLED:
|
||||
return 'resource:///org/gnome/shell/theme/automatic-updates-off-symbolic.svg';
|
||||
|
||||
case State.IDLE:
|
||||
case State.DOWNLOADING:
|
||||
return 'resource:///org/gnome/shell/theme/automatic-updates-on-symbolic.svg';
|
||||
|
||||
case State.SCHEDULED:
|
||||
return 'resource:///org/gnome/shell/theme/automatic-updates-scheduled-symbolic.svg';
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
var UpdateManager = GObject.registerClass ({
|
||||
Properties: {
|
||||
'last-notification-time': GObject.ParamSpec.int('last-notification-time',
|
||||
'last-notification-time',
|
||||
'last-notification-time',
|
||||
GObject.ParamFlags.READWRITE,
|
||||
null),
|
||||
'icon': GObject.ParamSpec.object('icon', 'icon', 'icon',
|
||||
GObject.ParamFlags.READABLE,
|
||||
Gio.Icon.$gtype),
|
||||
'state': GObject.ParamSpec.uint('state', 'state', 'state',
|
||||
GObject.ParamFlags.READABLE,
|
||||
null),
|
||||
},
|
||||
}, class UpdateManager extends GObject.Object {
|
||||
_init() {
|
||||
super._init();
|
||||
|
||||
this._activeConnection = null;
|
||||
this._settingChangedSignalId = 0;
|
||||
this._updateTimeoutId = 0;
|
||||
|
||||
this._state = State.UNKNOWN;
|
||||
|
||||
NM.Client.new_async(null, this._clientGot.bind(this));
|
||||
}
|
||||
|
||||
_clientGot(obj, result) {
|
||||
this._client = NM.Client.new_finish(result);
|
||||
|
||||
this._client.connect('notify::primary-connection', this._sync.bind(this));
|
||||
this._client.connect('notify::state', this._sync.bind(this));
|
||||
|
||||
// Start retrieving the Mogwai proxy
|
||||
this._proxy = new SchedulerProxy(Gio.DBus.system,
|
||||
'com.endlessm.MogwaiSchedule1',
|
||||
'/com/endlessm/DownloadManager1',
|
||||
(proxy, error) => {
|
||||
if (error) {
|
||||
log(error.message);
|
||||
return;
|
||||
}
|
||||
this._proxy.connect('g-properties-changed',
|
||||
this._sync.bind(this));
|
||||
this._updateStatus();
|
||||
});
|
||||
|
||||
this._sync();
|
||||
}
|
||||
|
||||
_sync() {
|
||||
if (!this._client || !this._proxy)
|
||||
return;
|
||||
|
||||
if (this._updateTimeoutId > 0) {
|
||||
GLib.source_remove(this._updateTimeoutId);
|
||||
this._updateTimeoutId = 0;
|
||||
}
|
||||
|
||||
// Intermediate states (connecting or disconnecting) must not trigger
|
||||
// any kind of state change.
|
||||
if (this._client.state == NM.State.CONNECTING || this._client.state == NM.State.DISCONNECTING)
|
||||
return;
|
||||
|
||||
// Use a timeout to avoid instantly throwing the notification at
|
||||
// the user's face, and to avoid a series of unecessary updates
|
||||
// that happen when NetworkManager is still figuring out details.
|
||||
this._updateTimeoutId = GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT,
|
||||
2,
|
||||
() => {
|
||||
this._updateStatus();
|
||||
this._updateTimeoutId = 0;
|
||||
return GLib.SOURCE_REMOVE;
|
||||
});
|
||||
GLib.Source.set_name_by_id(this._updateTimeoutId, '[update] updateStatus');
|
||||
}
|
||||
|
||||
_updateStatus() {
|
||||
// Update the current active connection. This will connect to the
|
||||
// NM.SettingUser signal to sync every time someone updates the
|
||||
// NM_SETTING_ALLOW_DOWNLOADS setting.
|
||||
this._updateActiveConnection();
|
||||
|
||||
let state = this._getState();
|
||||
if (state != this._state) {
|
||||
this._state = state;
|
||||
this.notify('state');
|
||||
|
||||
this._updateIcon();
|
||||
}
|
||||
}
|
||||
|
||||
_updateActiveConnection() {
|
||||
let currentActiveConnection = this._getActiveConnection();
|
||||
|
||||
if (this._activeConnection == currentActiveConnection)
|
||||
return;
|
||||
|
||||
// Disconnect from the previous active connection
|
||||
if (this._settingChangedSignalId > 0) {
|
||||
this._activeConnection.disconnect(this._settingChangedSignalId);
|
||||
this._settingChangedSignalId = 0;
|
||||
}
|
||||
|
||||
this._activeConnection = currentActiveConnection;
|
||||
|
||||
// Connect from the current active connection
|
||||
if (currentActiveConnection)
|
||||
this._settingChangedSignalId = currentActiveConnection.connect('changed', this._updateStatus.bind(this));
|
||||
}
|
||||
|
||||
_ensureUserSetting(connection) {
|
||||
let userSetting = connection.get_setting(NM.SettingUser.$gtype);
|
||||
if (!userSetting) {
|
||||
userSetting = new NM.SettingUser();
|
||||
connection.add_setting(userSetting);
|
||||
}
|
||||
return userSetting;
|
||||
}
|
||||
|
||||
_getState() {
|
||||
if (!this._activeConnection)
|
||||
return State.DISCONNECTED;
|
||||
|
||||
let userSetting = this._ensureUserSetting(this._activeConnection);
|
||||
|
||||
// We only return true when:
|
||||
// * Automatic Updates are on
|
||||
// * A schedule was set
|
||||
// * Something is being downloaded
|
||||
|
||||
let allowDownloadsValue = userSetting.get_data(NM_SETTING_ALLOW_DOWNLOADS);
|
||||
if (allowDownloadsValue) {
|
||||
let allowDownloads = (allowDownloadsValue === '1');
|
||||
|
||||
if (!allowDownloads)
|
||||
return State.DISABLED;
|
||||
} else {
|
||||
// Guess the default value from the metered state. Only return
|
||||
// if it's disabled - if it's not, we want to follow the regular
|
||||
// code paths and fetch the correct state
|
||||
let connectionSetting = this._activeConnection.get_setting_connection();
|
||||
|
||||
if (!connectionSetting)
|
||||
return State.DISABLED;
|
||||
|
||||
let metered = connectionSetting.get_metered();
|
||||
if (metered == NM.Metered.YES || metered == NM.Metered.GUESS_YES)
|
||||
return State.DISABLED;
|
||||
}
|
||||
|
||||
// Without the proxy, we can't really know the state
|
||||
if (!this._proxy)
|
||||
return State.UNKNOWN;
|
||||
|
||||
let scheduleSet = userSetting.get_data(NM_SETTING_TARIFF_ENABLED) === '1';
|
||||
if (!scheduleSet)
|
||||
return State.IDLE;
|
||||
|
||||
let downloading = this._proxy.ActiveEntryCount > 0;
|
||||
if (downloading)
|
||||
return State.DOWNLOADING;
|
||||
|
||||
// At this point we're not downloading anything, but something
|
||||
// might be queued
|
||||
let downloadsQueued = this._proxy.EntryCount > 0;
|
||||
if (downloadsQueued)
|
||||
return State.SCHEDULED;
|
||||
else
|
||||
return State.IDLE;
|
||||
}
|
||||
|
||||
_getActiveConnection() {
|
||||
let activeConnection = this._client.get_primary_connection();
|
||||
return activeConnection ? activeConnection.get_connection() : null;
|
||||
}
|
||||
|
||||
_updateIcon() {
|
||||
let state = this._state;
|
||||
let iconName = stateToIconName(state);
|
||||
|
||||
if (iconName) {
|
||||
let iconFile = Gio.File.new_for_uri(iconName);
|
||||
this._icon = new Gio.FileIcon({ file: iconFile });
|
||||
} else {
|
||||
this._icon = null;
|
||||
}
|
||||
|
||||
this.notify('icon');
|
||||
}
|
||||
|
||||
get state() {
|
||||
return this._state;
|
||||
}
|
||||
|
||||
get lastNotificationTime() {
|
||||
let connection = this._getActiveConnection();
|
||||
if (!connection)
|
||||
return -1;
|
||||
|
||||
let userSetting = connection.get_setting(NM.SettingUser.$gtype);
|
||||
if (!userSetting)
|
||||
return -1;
|
||||
|
||||
let time = userSetting.get_data(NM_SETTING_AUTOMATIC_UPDATES_NOTIFICATION_TIME);
|
||||
return time ? parseInt(time) : -1;
|
||||
}
|
||||
|
||||
set lastNotificationTime(time) {
|
||||
if (!this._activeConnection)
|
||||
return;
|
||||
|
||||
let userSetting = this._ensureUserSetting(this._activeConnection);
|
||||
userSetting.set_data(NM_SETTING_AUTOMATIC_UPDATES_NOTIFICATION_TIME,
|
||||
'%s'.format(time));
|
||||
|
||||
this._activeConnection.commit_changes(true, null);
|
||||
}
|
||||
|
||||
|
||||
get active() {
|
||||
return this._active;
|
||||
}
|
||||
|
||||
set active(_active) {
|
||||
if (this._active == _active)
|
||||
return;
|
||||
|
||||
this._active = _active;
|
||||
this.notify('active');
|
||||
}
|
||||
|
||||
get icon() {
|
||||
return this._icon;
|
||||
}
|
||||
|
||||
toggleAutomaticUpdates() {
|
||||
if (!this._activeConnection)
|
||||
return;
|
||||
|
||||
let userSetting = this._ensureUserSetting(this._activeConnection);
|
||||
|
||||
let state = this._getState();
|
||||
let value;
|
||||
|
||||
if (state == State.IDLE ||
|
||||
state == State.SCHEDULED ||
|
||||
state == State.DOWNLOADING) {
|
||||
value = '0';
|
||||
} else {
|
||||
value = '1';
|
||||
}
|
||||
|
||||
userSetting.set_data(NM_SETTING_ALLOW_DOWNLOADS, value);
|
||||
|
||||
this._activeConnection.commit_changes_async(true, null, (con, res, data) => {
|
||||
this._activeConnection.commit_changes_finish(res);
|
||||
this._updateStatus();
|
||||
});
|
||||
}
|
||||
});
|
@@ -366,7 +366,7 @@ class CloseButton extends St.Button {
|
||||
}
|
||||
|
||||
_computeBoxPointerOffset() {
|
||||
if (!this._boxPointer || !this._boxPointer.get_stage())
|
||||
if (!this._boxPointer || !this._boxPointer.actor.get_stage())
|
||||
return 0;
|
||||
|
||||
let side = this._boxPointer.arrowSide;
|
||||
|
@@ -30,14 +30,6 @@ var WeatherClient = class {
|
||||
return;
|
||||
}
|
||||
|
||||
if (this._permStore.g_name_owner == null) {
|
||||
// Failed to auto-start, likely because xdg-desktop-portal
|
||||
// isn't installed; don't restrict access to location service
|
||||
this._weatherAuthorized = true;
|
||||
this._updateAutoLocation();
|
||||
return;
|
||||
}
|
||||
|
||||
this._permStore.LookupRemote('gnome', 'geolocation', (res, error) => {
|
||||
if (error)
|
||||
log('Error looking up permission: ' + error.message);
|
||||
|
@@ -10,7 +10,7 @@ const Scripting = imports.ui.scripting;
|
||||
// someone should be able to get an idea of how well the shell is performing
|
||||
// on a particular system.
|
||||
|
||||
var METRICS = {
|
||||
let METRICS = {
|
||||
overviewLatencyFirst:
|
||||
{ description: "Time to first frame after triggering overview, first time",
|
||||
units: "us" },
|
||||
|
@@ -1,8 +1,8 @@
|
||||
const { Clutter, Gio, Shell } = imports.gi;
|
||||
const { Clutter, Gio, Gtk, Shell } = imports.gi;
|
||||
const Main = imports.ui.main;
|
||||
const Scripting = imports.ui.scripting;
|
||||
|
||||
var METRICS = {
|
||||
let METRICS = {
|
||||
timeToDesktop:
|
||||
{ description: "Time from starting graphical.target to desktop showing",
|
||||
units: "us" },
|
||||
@@ -104,10 +104,7 @@ function *run() {
|
||||
yield Scripting.waitLeisure();
|
||||
Scripting.scriptEvent('desktopShown');
|
||||
|
||||
let interfaceSettings = new Gio.Settings({
|
||||
schema_id: 'org.gnome.desktop.interface'
|
||||
});
|
||||
interfaceSettings.set_boolean('enable-animations', false);
|
||||
Gtk.Settings.get_default().gtk_enable_animations = false;
|
||||
|
||||
Scripting.scriptEvent('overviewShowStart');
|
||||
Main.overview.show();
|
||||
@@ -203,7 +200,7 @@ function *run() {
|
||||
|
||||
yield Scripting.sleep(1000);
|
||||
|
||||
interfaceSettings.set_boolean('enable-animations', true);
|
||||
Gtk.Settings.get_default().gtk_enable_animations = true;
|
||||
}
|
||||
|
||||
let overviewShowStart;
|
||||
|
@@ -474,10 +474,12 @@ var CyclerList = GObject.registerClass({
|
||||
}
|
||||
});
|
||||
|
||||
var CyclerPopup = GObject.registerClass({
|
||||
GTypeFlags: GObject.TypeFlags.ABSTRACT
|
||||
}, class CyclerPopup extends SwitcherPopup.SwitcherPopup {
|
||||
var CyclerPopup = GObject.registerClass(
|
||||
class CyclerPopup extends SwitcherPopup.SwitcherPopup {
|
||||
_init() {
|
||||
if (new.target === CyclerPopup)
|
||||
throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
|
||||
|
||||
super._init();
|
||||
|
||||
this._items = this._getWindows();
|
||||
@@ -617,8 +619,9 @@ class WindowSwitcherPopup extends SwitcherPopup.SwitcherPopup {
|
||||
var WindowCyclerPopup = GObject.registerClass(
|
||||
class WindowCyclerPopup extends CyclerPopup {
|
||||
_init() {
|
||||
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell.window-switcher' });
|
||||
super._init();
|
||||
|
||||
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell.window-switcher' });
|
||||
}
|
||||
|
||||
_getWindows() {
|
||||
|
@@ -98,8 +98,8 @@ function clamp(value, min, max) {
|
||||
|
||||
class BaseAppView {
|
||||
constructor(params, gridParams) {
|
||||
if (this.constructor === BaseAppView)
|
||||
throw new TypeError(`Cannot instantiate abstract class ${this.constructor.name}`);
|
||||
if (new.target === BaseAppView)
|
||||
throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
|
||||
|
||||
gridParams = Params.parse(gridParams, { xAlign: St.Align.MIDDLE,
|
||||
columnLimit: MAX_COLUMNS,
|
||||
@@ -414,7 +414,7 @@ var AllView = class AllView extends BaseAppView {
|
||||
this._refilterApps();
|
||||
}
|
||||
|
||||
// Overridden from BaseAppView
|
||||
// Overriden from BaseAppView
|
||||
animate(animationDirection, onComplete) {
|
||||
this._scrollView.reactive = false;
|
||||
let completionFunc = () => {
|
||||
@@ -1017,7 +1017,7 @@ var FolderView = class FolderView extends BaseAppView {
|
||||
Util.ensureActorVisibleInScrollView(this.actor, actor);
|
||||
}
|
||||
|
||||
// Overridden from BaseAppView
|
||||
// Overriden from BaseAppView
|
||||
animate(animationDirection) {
|
||||
this._grid.animatePulse(animationDirection);
|
||||
}
|
||||
@@ -1081,7 +1081,7 @@ var FolderView = class FolderView extends BaseAppView {
|
||||
|
||||
let contentBox = this.actor.get_theme_node().get_content_box(pageBox);
|
||||
// We only can show icons inside the collection view boxPointer
|
||||
// so we have to subtract the required padding etc of the boxpointer
|
||||
// so we have to substract the required padding etc of the boxpointer
|
||||
return [(contentBox.x2 - contentBox.x1) - 2 * this._offsetForEachSide, (contentBox.y2 - contentBox.y1) - 2 * this._offsetForEachSide];
|
||||
}
|
||||
|
||||
@@ -1301,16 +1301,16 @@ var AppFolderPopup = class AppFolderPopup {
|
||||
x_expand: true,
|
||||
x_align: St.Align.START });
|
||||
|
||||
this._boxPointer.style_class = 'app-folder-popup';
|
||||
this.actor.add_actor(this._boxPointer);
|
||||
this._boxPointer.actor.style_class = 'app-folder-popup';
|
||||
this.actor.add_actor(this._boxPointer.actor);
|
||||
this._boxPointer.bin.set_child(this._view.actor);
|
||||
|
||||
this.closeButton = Util.makeCloseButton(this._boxPointer);
|
||||
this.closeButton.connect('clicked', this.popdown.bind(this));
|
||||
this.actor.add_actor(this.closeButton);
|
||||
|
||||
this._boxPointer.bind_property('opacity', this.closeButton, 'opacity',
|
||||
GObject.BindingFlags.SYNC_CREATE);
|
||||
this._boxPointer.actor.bind_property('opacity', this.closeButton, 'opacity',
|
||||
GObject.BindingFlags.SYNC_CREATE);
|
||||
|
||||
global.focus_manager.add_group(this.actor);
|
||||
|
||||
@@ -1479,7 +1479,7 @@ var AppIcon = class AppIcon {
|
||||
this.actor.connect('popup-menu', this._onKeyboardPopupMenu.bind(this));
|
||||
|
||||
this._menu = null;
|
||||
this._menuManager = new PopupMenu.PopupMenuManager(this.actor);
|
||||
this._menuManager = new PopupMenu.PopupMenuManager(this);
|
||||
|
||||
if (isDraggable) {
|
||||
this._draggable = DND.makeDraggable(this.actor);
|
||||
@@ -1707,20 +1707,25 @@ var AppIconMenu = class AppIconMenu extends PopupMenu.PopupMenu {
|
||||
w => !w.skip_taskbar
|
||||
);
|
||||
|
||||
if (windows.length > 0)
|
||||
this.addMenuItem(
|
||||
/* Translators: This is the heading of a list of open windows */
|
||||
new PopupMenu.PopupSeparatorMenuItem(_("Open Windows"))
|
||||
);
|
||||
// Display the app windows menu items and the separator between windows
|
||||
// of the current desktop and other windows.
|
||||
let workspaceManager = global.workspace_manager;
|
||||
let activeWorkspace = workspaceManager.get_active_workspace();
|
||||
let separatorShown = windows.length > 0 && windows[0].get_workspace() != activeWorkspace;
|
||||
|
||||
windows.forEach(window => {
|
||||
for (let i = 0; i < windows.length; i++) {
|
||||
let window = windows[i];
|
||||
if (!separatorShown && window.get_workspace() != activeWorkspace) {
|
||||
this._appendSeparator();
|
||||
separatorShown = true;
|
||||
}
|
||||
let title = window.title ? window.title
|
||||
: this._source.app.get_name();
|
||||
let item = this._appendMenuItem(title);
|
||||
item.connect('activate', () => {
|
||||
this.emit('activate-window', window);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
if (!this._source.app.is_window_backed()) {
|
||||
this._appendSeparator();
|
||||
|
@@ -14,47 +14,39 @@ const RENAMED_DESKTOP_IDS = {
|
||||
'epiphany.desktop': 'org.gnome.Epiphany.desktop',
|
||||
'evolution.desktop': 'org.gnome.Evolution.desktop',
|
||||
'file-roller.desktop': 'org.gnome.FileRoller.desktop',
|
||||
'five-or-more.desktop': 'org.gnome.five-or-more.desktop',
|
||||
'four-in-a-row.desktop': 'org.gnome.Four-in-a-row.desktop',
|
||||
'gcalctool.desktop': 'org.gnome.Calculator.desktop',
|
||||
'geary.desktop': 'org.gnome.Geary.desktop',
|
||||
'gedit.desktop': 'org.gnome.gedit.desktop',
|
||||
'glchess.desktop': 'org.gnome.Chess.desktop',
|
||||
'glines.desktop': 'org.gnome.five-or-more.desktop',
|
||||
'gnect.desktop': 'org.gnome.Four-in-a-row.desktop',
|
||||
'glchess.desktop': 'gnome-chess.desktop',
|
||||
'glines.desktop': 'five-or-more.desktop',
|
||||
'gnect.desktop': 'four-in-a-row.desktop',
|
||||
'gnibbles.desktop': 'org.gnome.Nibbles.desktop',
|
||||
'gnobots2.desktop': 'org.gnome.Robots.desktop',
|
||||
'gnobots2.desktop': 'gnome-robots.desktop',
|
||||
'gnome-boxes.desktop': 'org.gnome.Boxes.desktop',
|
||||
'gnome-calculator.desktop': 'org.gnome.Calculator.desktop',
|
||||
'gnome-chess.desktop': 'org.gnome.Chess.desktop',
|
||||
'gnome-clocks.desktop': 'org.gnome.clocks.desktop',
|
||||
'gnome-contacts.desktop': 'org.gnome.Contacts.desktop',
|
||||
'gnome-documents.desktop': 'org.gnome.Documents.desktop',
|
||||
'gnome-font-viewer.desktop': 'org.gnome.font-viewer.desktop',
|
||||
'gnome-klotski.desktop': 'org.gnome.Klotski.desktop',
|
||||
'gnome-nibbles.desktop': 'org.gnome.Nibbles.desktop',
|
||||
'gnome-mahjongg.desktop': 'org.gnome.Mahjongg.desktop',
|
||||
'gnome-mines.desktop': 'org.gnome.Mines.desktop',
|
||||
'gnome-music.desktop': 'org.gnome.Music.desktop',
|
||||
'gnome-photos.desktop': 'org.gnome.Photos.desktop',
|
||||
'gnome-robots.desktop': 'org.gnome.Robots.desktop',
|
||||
'gnome-screenshot.desktop': 'org.gnome.Screenshot.desktop',
|
||||
'gnome-software.desktop': 'org.gnome.Software.desktop',
|
||||
'gnome-terminal.desktop': 'org.gnome.Terminal.desktop',
|
||||
'gnome-tetravex.desktop': 'org.gnome.Tetravex.desktop',
|
||||
'gnome-tweaks.desktop': 'org.gnome.tweaks.desktop',
|
||||
'gnome-weather.desktop': 'org.gnome.Weather.desktop',
|
||||
'gnomine.desktop': 'org.gnome.Mines.desktop',
|
||||
'gnotravex.desktop': 'org.gnome.Tetravex.desktop',
|
||||
'gnotski.desktop': 'org.gnome.Klotski.desktop',
|
||||
'gtali.desktop': 'org.gnome.Tali.desktop',
|
||||
'gnomine.desktop': 'gnome-mines.desktop',
|
||||
'gnotravex.desktop': 'gnome-tetravex.desktop',
|
||||
'gnotski.desktop': 'gnome-klotski.desktop',
|
||||
'gtali.desktop': 'tali.desktop',
|
||||
'iagno.desktop': 'org.gnome.Reversi.desktop',
|
||||
'nautilus.desktop': 'org.gnome.Nautilus.desktop',
|
||||
'org.gnome.gnome-2048.desktop': 'org.gnome.TwentyFortyEight.desktop',
|
||||
'org.gnome.taquin.desktop': 'org.gnome.Taquin.desktop',
|
||||
'org.gnome.Weather.Application.desktop': 'org.gnome.Weather.desktop',
|
||||
'polari.desktop': 'org.gnome.Polari.desktop',
|
||||
'tali.desktop': 'org.gnome.Tali.desktop',
|
||||
'totem.desktop': 'org.gnome.Totem.desktop',
|
||||
'evince.desktop': 'org.gnome.Evince.desktop',
|
||||
};
|
||||
|
@@ -25,7 +25,7 @@ var BackgroundMenu = class BackgroundMenu extends PopupMenu.PopupMenu {
|
||||
function addBackgroundMenu(actor, layoutManager) {
|
||||
actor.reactive = true;
|
||||
actor._backgroundMenu = new BackgroundMenu(layoutManager);
|
||||
actor._backgroundManager = new PopupMenu.PopupMenuManager(actor);
|
||||
actor._backgroundManager = new PopupMenu.PopupMenuManager({ actor: actor });
|
||||
actor._backgroundManager.addMenu(actor._backgroundMenu);
|
||||
|
||||
function openMenu(x, y) {
|
||||
|
@@ -121,8 +121,7 @@ var BarLevel = class {
|
||||
cr.lineTo(x, (height - barLevelHeight) / 2);
|
||||
cr.lineTo(x, (height + barLevelHeight) / 2);
|
||||
cr.lineTo(barLevelBorderRadius + barLevelBorderWidth, (height + barLevelHeight) / 2);
|
||||
if (this._value > 0)
|
||||
Clutter.cairo_set_source_color(cr, barLevelActiveColor);
|
||||
Clutter.cairo_set_source_color(cr, barLevelActiveColor);
|
||||
cr.fillPreserve();
|
||||
Clutter.cairo_set_source_color(cr, barLevelActiveBorderColor);
|
||||
cr.setLineWidth(barLevelBorderWidth);
|
||||
@@ -144,19 +143,17 @@ var BarLevel = class {
|
||||
}
|
||||
|
||||
/* end progress bar arc */
|
||||
if (this._value > 0) {
|
||||
if (this._value <= this._overdriveStart)
|
||||
Clutter.cairo_set_source_color(cr, barLevelActiveColor);
|
||||
else
|
||||
Clutter.cairo_set_source_color(cr, barLevelOverdriveColor);
|
||||
cr.arc(endX, height / 2, barLevelBorderRadius, TAU * 3 / 4, TAU * 1 / 4);
|
||||
cr.lineTo(Math.floor(endX), (height + barLevelHeight) / 2);
|
||||
cr.lineTo(Math.floor(endX), (height - barLevelHeight) / 2);
|
||||
cr.lineTo(endX, (height - barLevelHeight) / 2);
|
||||
cr.fillPreserve();
|
||||
cr.setLineWidth(barLevelBorderWidth);
|
||||
cr.stroke();
|
||||
}
|
||||
if (this._value <= this._overdriveStart)
|
||||
Clutter.cairo_set_source_color(cr, barLevelActiveColor);
|
||||
else
|
||||
Clutter.cairo_set_source_color(cr, barLevelOverdriveColor);
|
||||
cr.arc(endX, height / 2, barLevelBorderRadius, TAU * 3 / 4, TAU * 1 / 4);
|
||||
cr.lineTo(Math.floor(endX), (height + barLevelHeight) / 2);
|
||||
cr.lineTo(Math.floor(endX), (height - barLevelHeight) / 2);
|
||||
cr.lineTo(endX, (height - barLevelHeight) / 2);
|
||||
cr.fillPreserve();
|
||||
cr.setLineWidth(barLevelBorderWidth);
|
||||
cr.stroke();
|
||||
|
||||
/* draw overdrive separator */
|
||||
if (overdriveActive) {
|
||||
|
@@ -24,7 +24,7 @@ var POPUP_ANIMATION_TIME = 0.15;
|
||||
* placed. The arrow position may be controlled via
|
||||
* setArrowOrigin(). The arrow side might be temporarily flipped
|
||||
* depending on the box size and source position to keep the box
|
||||
* totally inside the monitor workarea if possible.
|
||||
* totally inside the monitor if possible.
|
||||
*
|
||||
*/
|
||||
var BoxPointer = GObject.registerClass({
|
||||
@@ -33,6 +33,8 @@ var BoxPointer = GObject.registerClass({
|
||||
_init(arrowSide, binProperties) {
|
||||
super._init();
|
||||
|
||||
this.actor = this;
|
||||
|
||||
this.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS);
|
||||
|
||||
this._arrowSide = arrowSide;
|
||||
@@ -45,6 +47,10 @@ var BoxPointer = GObject.registerClass({
|
||||
this._border.connect('repaint', this._drawBorder.bind(this));
|
||||
this.add_actor(this._border);
|
||||
this.bin.raise(this._border);
|
||||
this._xOffset = 0;
|
||||
this._yOffset = 0;
|
||||
this._xPosition = 0;
|
||||
this._yPosition = 0;
|
||||
this._sourceAlignment = 0.5;
|
||||
this._capturedEventId = 0;
|
||||
this._muteInput();
|
||||
@@ -112,23 +118,23 @@ var BoxPointer = GObject.registerClass({
|
||||
if (animate & PopupAnimation.SLIDE) {
|
||||
switch (this._arrowSide) {
|
||||
case St.Side.TOP:
|
||||
this.translation_y = -rise;
|
||||
this.yOffset = -rise;
|
||||
break;
|
||||
case St.Side.BOTTOM:
|
||||
this.translation_y = rise;
|
||||
this.yOffset = rise;
|
||||
break;
|
||||
case St.Side.LEFT:
|
||||
this.translation_x = -rise;
|
||||
this.xOffset = -rise;
|
||||
break;
|
||||
case St.Side.RIGHT:
|
||||
this.translation_x = rise;
|
||||
this.xOffset = rise;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Tweener.addTween(this, { opacity: 255,
|
||||
translation_x: 0,
|
||||
translation_y: 0,
|
||||
xOffset: 0,
|
||||
yOffset: 0,
|
||||
transition: 'linear',
|
||||
onComplete: () => {
|
||||
this._unmuteInput();
|
||||
@@ -142,8 +148,8 @@ var BoxPointer = GObject.registerClass({
|
||||
if (!this.visible)
|
||||
return;
|
||||
|
||||
let translationX = 0;
|
||||
let translationY = 0;
|
||||
let xOffset = 0;
|
||||
let yOffset = 0;
|
||||
let themeNode = this.get_theme_node();
|
||||
let rise = themeNode.get_length('-arrow-rise');
|
||||
let fade = (animate & PopupAnimation.FADE);
|
||||
@@ -152,16 +158,16 @@ var BoxPointer = GObject.registerClass({
|
||||
if (animate & PopupAnimation.SLIDE) {
|
||||
switch (this._arrowSide) {
|
||||
case St.Side.TOP:
|
||||
translationY = rise;
|
||||
yOffset = rise;
|
||||
break;
|
||||
case St.Side.BOTTOM:
|
||||
translationY = -rise;
|
||||
yOffset = -rise;
|
||||
break;
|
||||
case St.Side.LEFT:
|
||||
translationX = rise;
|
||||
xOffset = rise;
|
||||
break;
|
||||
case St.Side.RIGHT:
|
||||
translationX = -rise;
|
||||
xOffset = -rise;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -170,15 +176,15 @@ var BoxPointer = GObject.registerClass({
|
||||
|
||||
Tweener.removeTweens(this);
|
||||
Tweener.addTween(this, { opacity: fade ? 0 : 255,
|
||||
translation_x: translationX,
|
||||
translation_y: translationY,
|
||||
xOffset: xOffset,
|
||||
yOffset: yOffset,
|
||||
transition: 'linear',
|
||||
time: animationTime,
|
||||
onComplete: () => {
|
||||
this.hide();
|
||||
this.opacity = 0;
|
||||
this.translation_x = 0;
|
||||
this.translation_y = 0;
|
||||
this.xOffset = 0;
|
||||
this.yOffset = 0;
|
||||
if (onComplete)
|
||||
onComplete();
|
||||
}
|
||||
@@ -471,15 +477,11 @@ var BoxPointer = GObject.registerClass({
|
||||
_reposition() {
|
||||
let sourceActor = this._sourceActor;
|
||||
let alignment = this._arrowAlignment;
|
||||
let monitorIndex = Main.layoutManager.findIndexForActor(sourceActor);
|
||||
|
||||
this._sourceAllocation = Shell.util_get_transformed_allocation(sourceActor);
|
||||
this._workArea = Main.layoutManager.getWorkAreaForMonitor(monitorIndex);
|
||||
|
||||
// Position correctly relative to the sourceActor
|
||||
let sourceNode = sourceActor.get_theme_node();
|
||||
let sourceContentBox = sourceNode.get_content_box(sourceActor.get_allocation_box());
|
||||
let sourceAllocation = this._sourceAllocation;
|
||||
let sourceAllocation = Shell.util_get_transformed_allocation(sourceActor);
|
||||
let sourceCenterX = sourceAllocation.x1 + sourceContentBox.x1 + (sourceContentBox.x2 - sourceContentBox.x1) * this._sourceAlignment;
|
||||
let sourceCenterY = sourceAllocation.y1 + sourceContentBox.y1 + (sourceContentBox.y2 - sourceContentBox.y1) * this._sourceAlignment;
|
||||
let [minWidth, minHeight, natWidth, natHeight] = this.get_preferred_size();
|
||||
@@ -487,7 +489,7 @@ var BoxPointer = GObject.registerClass({
|
||||
// We also want to keep it onscreen, and separated from the
|
||||
// edge by the same distance as the main part of the box is
|
||||
// separated from its sourceActor
|
||||
let workarea = this._workArea;
|
||||
let monitor = Main.layoutManager.findMonitorForActor(sourceActor);
|
||||
let themeNode = this.get_theme_node();
|
||||
let borderWidth = themeNode.get_length('-arrow-border-width');
|
||||
let arrowBase = themeNode.get_length('-arrow-base');
|
||||
@@ -537,8 +539,8 @@ var BoxPointer = GObject.registerClass({
|
||||
case St.Side.BOTTOM:
|
||||
resX = sourceCenterX - (halfMargin + (natWidth - margin) * alignment);
|
||||
|
||||
resX = Math.max(resX, workarea.x + padding);
|
||||
resX = Math.min(resX, workarea.x + workarea.width - (padding + natWidth));
|
||||
resX = Math.max(resX, monitor.x + padding);
|
||||
resX = Math.min(resX, monitor.x + monitor.width - (padding + natWidth));
|
||||
|
||||
arrowOrigin = sourceCenterX - resX;
|
||||
if (arrowOrigin <= (x1 + (borderRadius + halfBase))) {
|
||||
@@ -556,8 +558,8 @@ var BoxPointer = GObject.registerClass({
|
||||
case St.Side.RIGHT:
|
||||
resY = sourceCenterY - (halfMargin + (natHeight - margin) * alignment);
|
||||
|
||||
resY = Math.max(resY, workarea.y + padding);
|
||||
resY = Math.min(resY, workarea.y + workarea.height - (padding + natHeight));
|
||||
resY = Math.max(resY, monitor.y + padding);
|
||||
resY = Math.min(resY, monitor.y + monitor.height - (padding + natHeight));
|
||||
|
||||
arrowOrigin = sourceCenterY - resY;
|
||||
if (arrowOrigin <= (y1 + (borderRadius + halfBase))) {
|
||||
@@ -581,9 +583,9 @@ var BoxPointer = GObject.registerClass({
|
||||
parent = parent.get_parent();
|
||||
}
|
||||
|
||||
// Actually set the position
|
||||
this.x = Math.floor(x);
|
||||
this.y = Math.floor(y);
|
||||
this._xPosition = Math.floor(x);
|
||||
this._yPosition = Math.floor(y);
|
||||
this._shiftActor();
|
||||
}
|
||||
|
||||
// @origin: Coordinate specifying middle of the arrow, along
|
||||
@@ -606,30 +608,44 @@ var BoxPointer = GObject.registerClass({
|
||||
}
|
||||
}
|
||||
|
||||
_shiftActor() {
|
||||
// Since the position of the BoxPointer depends on the allocated size
|
||||
// of the BoxPointer and the position of the source actor, trying
|
||||
// to position the BoxPointer via the x/y properties will result in
|
||||
// allocation loops and warnings. Instead we do the positioning via
|
||||
// the anchor point, which is independent of allocation, and leave
|
||||
// x == y == 0.
|
||||
this.set_anchor_point(-(this._xPosition + this._xOffset),
|
||||
-(this._yPosition + this._yOffset));
|
||||
}
|
||||
|
||||
_calculateArrowSide(arrowSide) {
|
||||
let sourceAllocation = this._sourceAllocation;
|
||||
let sourceAllocation = Shell.util_get_transformed_allocation(this._sourceActor);
|
||||
let [minWidth, minHeight, boxWidth, boxHeight] = this.get_preferred_size();
|
||||
let workarea = this._workArea;
|
||||
let monitorActor = this.sourceActor;
|
||||
if (!monitorActor)
|
||||
monitorActor = this;
|
||||
let monitor = Main.layoutManager.findMonitorForActor(monitorActor);
|
||||
|
||||
switch (arrowSide) {
|
||||
case St.Side.TOP:
|
||||
if (sourceAllocation.y2 + boxHeight > workarea.y + workarea.height &&
|
||||
boxHeight < sourceAllocation.y1 - workarea.y)
|
||||
if (sourceAllocation.y2 + boxHeight > monitor.y + monitor.height &&
|
||||
boxHeight < sourceAllocation.y1 - monitor.y)
|
||||
return St.Side.BOTTOM;
|
||||
break;
|
||||
case St.Side.BOTTOM:
|
||||
if (sourceAllocation.y1 - boxHeight < workarea.y &&
|
||||
boxHeight < workarea.y + workarea.height - sourceAllocation.y2)
|
||||
if (sourceAllocation.y1 - boxHeight < monitor.y &&
|
||||
boxHeight < monitor.y + monitor.height - sourceAllocation.y2)
|
||||
return St.Side.TOP;
|
||||
break;
|
||||
case St.Side.LEFT:
|
||||
if (sourceAllocation.x2 + boxWidth > workarea.x + workarea.width &&
|
||||
boxWidth < sourceAllocation.x1 - workarea.x)
|
||||
if (sourceAllocation.x2 + boxWidth > monitor.x + monitor.width &&
|
||||
boxWidth < sourceAllocation.x1 - monitor.x)
|
||||
return St.Side.RIGHT;
|
||||
break;
|
||||
case St.Side.RIGHT:
|
||||
if (sourceAllocation.x1 - boxWidth < workarea.x &&
|
||||
boxWidth < workarea.x + workarea.width - sourceAllocation.x2)
|
||||
if (sourceAllocation.x1 - boxWidth < monitor.x &&
|
||||
boxWidth < monitor.x + monitor.width - sourceAllocation.x2)
|
||||
return St.Side.LEFT;
|
||||
break;
|
||||
}
|
||||
@@ -651,6 +667,24 @@ var BoxPointer = GObject.registerClass({
|
||||
}
|
||||
}
|
||||
|
||||
set xOffset(offset) {
|
||||
this._xOffset = offset;
|
||||
this._shiftActor();
|
||||
}
|
||||
|
||||
get xOffset() {
|
||||
return this._xOffset;
|
||||
}
|
||||
|
||||
set yOffset(offset) {
|
||||
this._yOffset = offset;
|
||||
this._shiftActor();
|
||||
}
|
||||
|
||||
get yOffset() {
|
||||
return this._yOffset;
|
||||
}
|
||||
|
||||
updateArrowSide(side) {
|
||||
this._arrowSide = side;
|
||||
this._border.queue_repaint();
|
||||
|
@@ -5,7 +5,6 @@ const Mainloop = imports.mainloop;
|
||||
const Params = imports.misc.params;
|
||||
|
||||
const GnomeSession = imports.misc.gnomeSession;
|
||||
const Main = imports.ui.main;
|
||||
const ShellMountOperation = imports.ui.shellMountOperation;
|
||||
|
||||
var GNOME_SESSION_AUTOMOUNT_INHIBIT = 16;
|
||||
@@ -200,20 +199,12 @@ var AutomountManager = class {
|
||||
// error strings are not unique for the cases in the comments below.
|
||||
if (e.message.includes('No key available with this passphrase') || // cryptsetup
|
||||
e.message.includes('No key available to unlock device') || // udisks (no password)
|
||||
// libblockdev wrong password opening LUKS device
|
||||
e.message.includes('Failed to activate device: Incorrect passphrase') ||
|
||||
// cryptsetup returns EINVAL in many cases, including wrong TCRYPT password/parameters
|
||||
e.message.includes('Failed to load device\'s parameters: Invalid argument')) {
|
||||
|
||||
e.message.includes('Error unlocking')) { // udisks (wrong password)
|
||||
this._reaskPassword(volume);
|
||||
} else {
|
||||
if (e.message.includes('Compiled against a version of libcryptsetup that does not support the VeraCrypt PIM setting')) {
|
||||
Main.notifyError(_("Unable to unlock volume"),
|
||||
_("The installed udisks version does not support the PIM setting"));
|
||||
}
|
||||
|
||||
if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.FAILED_HANDLED))
|
||||
log('Unable to mount volume ' + volume.get_name() + ': ' + e.toString());
|
||||
|
||||
this._closeOperation(volume);
|
||||
}
|
||||
}
|
||||
|
@@ -23,8 +23,20 @@ var KeyringDialog = class extends ModalDialog.ModalDialog {
|
||||
this._content = new Dialog.MessageDialogContent({ icon });
|
||||
this.contentLayout.add(this._content);
|
||||
|
||||
// FIXME: Why does this break now?
|
||||
/*
|
||||
this.prompt.bind_property('message', this._content, 'title', GObject.BindingFlags.SYNC_CREATE);
|
||||
this.prompt.bind_property('description', this._content, 'body', GObject.BindingFlags.SYNC_CREATE);
|
||||
*/
|
||||
this.prompt.connect('notify::message', () => {
|
||||
this._content.title = this.prompt.message;
|
||||
});
|
||||
this._content.title = this.prompt.message;
|
||||
|
||||
this.prompt.connect('notify::description', () => {
|
||||
this._content.body = this.prompt.description;
|
||||
});
|
||||
this._content.body = this.prompt.description;
|
||||
|
||||
this._workSpinner = null;
|
||||
this._controlTable = null;
|
||||
|
@@ -401,7 +401,7 @@ var ChatSource = class extends MessageTray.Source {
|
||||
if (this._client.is_handling_channel(this._channel)) {
|
||||
// We are handling the channel, try to pass it to Empathy or Polari
|
||||
// (depending on the channel type)
|
||||
// We don't check if either app is available - mission control will
|
||||
// We don't check if either app is availble - mission control will
|
||||
// fallback to something else if activation fails
|
||||
|
||||
let target;
|
||||
|
135
js/ui/components/updates.js
Normal file
@@ -0,0 +1,135 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
//
|
||||
// Copyright (C) 2018 Endless Mobile, Inc.
|
||||
//
|
||||
// This is a GNOME Shell component to wrap the interactions over
|
||||
// D-Bus with the Mogwai system daemon.
|
||||
//
|
||||
// Licensed under the GNU General Public License Version 2
|
||||
//
|
||||
// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
const { Gio, GLib, Shell } = imports.gi;
|
||||
|
||||
const UpdateManager = imports.misc.updateManager;
|
||||
|
||||
const Main = imports.ui.main;
|
||||
const MessageTray = imports.ui.messageTray;
|
||||
|
||||
var UpdateComponent = class {
|
||||
constructor() {
|
||||
this._notification = null;
|
||||
this._state = UpdateManager.State.UNKNOWN;
|
||||
|
||||
this._manager = UpdateManager.getUpdateManager();
|
||||
this._manager.connect('notify::state', this._updateState.bind(this));
|
||||
|
||||
this._updateState();
|
||||
}
|
||||
|
||||
enable() {
|
||||
}
|
||||
|
||||
disable() {
|
||||
}
|
||||
|
||||
_updateState() {
|
||||
let newState = this._manager.state;
|
||||
|
||||
if (this._state == newState)
|
||||
return;
|
||||
|
||||
this._updateNotification(newState);
|
||||
this._state = newState;
|
||||
}
|
||||
|
||||
_updateNotification(newState) {
|
||||
// Don't notify when starting up
|
||||
if (this._manager.state == UpdateManager.State.UNKNOWN)
|
||||
return;
|
||||
|
||||
let alreadySentNotification = this._manager.lastNotificationTime != -1;
|
||||
|
||||
let wasDisconnected = this._state == UpdateManager.State.DISCONNECTED;
|
||||
let wasActive = this._state >= UpdateManager.State.IDLE;
|
||||
let isActive = newState >= UpdateManager.State.IDLE;
|
||||
|
||||
// The criteria to notify about the Automatic Updates setting is:
|
||||
// 1. If the user was disconnected and connects to a new network; or
|
||||
// 2. If the user was connected and connects to a network with different status;
|
||||
if ((wasDisconnected && alreadySentNotification) || (!wasDisconnected && isActive == wasActive))
|
||||
return;
|
||||
|
||||
if (this._notification)
|
||||
this._notification.destroy();
|
||||
|
||||
if (newState == UpdateManager.State.DISCONNECTED)
|
||||
return;
|
||||
|
||||
let source = new MessageTray.SystemNotificationSource();
|
||||
Main.messageTray.add(source);
|
||||
|
||||
// Figure out the title, subtitle and icon
|
||||
let title, subtitle, iconFile;
|
||||
|
||||
if (isActive) {
|
||||
title = _("Automatic updates on");
|
||||
subtitle = _("Your connection has unlimited data so automatic updates have been turned on.");
|
||||
iconFile = UpdateManager.stateToIconName(UpdateManager.State.IDLE);
|
||||
} else {
|
||||
title = _("Automatic updates are turned off to save your data");
|
||||
subtitle = _("You will need to choose which updates to apply when on this connection.");
|
||||
iconFile = UpdateManager.stateToIconName(UpdateManager.State.DISABLED);
|
||||
}
|
||||
|
||||
let gicon = new Gio.FileIcon({ file: Gio.File.new_for_uri(iconFile) });
|
||||
|
||||
// Create the notification.
|
||||
// The first time we notify the user for a given connection,
|
||||
// we set the urgency to critical so that we make sure the
|
||||
// user understands how we may be changing their settings.
|
||||
// On subsequent notifications for the given connection,
|
||||
// for instance if the user regularly switches between
|
||||
// metered and unmetered connections, we set the urgency
|
||||
// to normal so as not to be too obtrusive.
|
||||
this._notification = new MessageTray.Notification(source, title, subtitle, { gicon: gicon });
|
||||
this._notification.setUrgency(alreadySentNotification ?
|
||||
MessageTray.Urgency.NORMAL : MessageTray.Urgency.CRITICAL);
|
||||
this._notification.setTransient(false);
|
||||
|
||||
this._notification.addAction(_("Close"), () => {
|
||||
this._notification.destroy();
|
||||
});
|
||||
|
||||
this._notification.addAction(_("Change Settings…"), () => {
|
||||
// FIXME: this requires the Automatic Updates panel in GNOME
|
||||
// Settings. Going with the Network panel for now…
|
||||
let app = Shell.AppSystem.get_default().lookup_app('gnome-network-panel.desktop');
|
||||
Main.overview.hide();
|
||||
app.activate();
|
||||
});
|
||||
|
||||
source.notify(this._notification);
|
||||
|
||||
this._notification.connect('destroy', () => {
|
||||
this._notification = null;
|
||||
});
|
||||
|
||||
// Now that we first detected this connection, mark it as such
|
||||
this._manager.lastNotificationTime = GLib.get_real_time();
|
||||
}
|
||||
};
|
||||
|
||||
var Component = UpdateComponent;
|
@@ -584,18 +584,22 @@ var Dash = class Dash {
|
||||
let firstButton = iconChildren[0].child;
|
||||
let firstIcon = firstButton._delegate.icon;
|
||||
|
||||
// Enforce valid spacings during the size request
|
||||
let minHeight, natHeight;
|
||||
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||
|
||||
// Enforce the current icon size during the size request
|
||||
firstIcon.icon.ensure_style();
|
||||
let [, iconHeight] = firstIcon.icon.get_preferred_height(-1);
|
||||
let [, buttonHeight] = firstButton.get_preferred_height(-1);
|
||||
let [, currentHeight] = firstIcon.icon.get_size();
|
||||
firstIcon.icon.set_height(this.iconSize * scaleFactor);
|
||||
[minHeight, natHeight] = firstButton.get_preferred_height(-1);
|
||||
firstIcon.icon.set_height(currentHeight);
|
||||
|
||||
// Subtract icon padding and box spacing from the available height
|
||||
availHeight -= iconChildren.length * (buttonHeight - iconHeight) +
|
||||
availHeight -= iconChildren.length * (natHeight - this.iconSize * scaleFactor) +
|
||||
(iconChildren.length - 1) * spacing;
|
||||
|
||||
let availSize = availHeight / iconChildren.length;
|
||||
|
||||
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||
let iconSizes = baseIconSizes.map(s => s * scaleFactor);
|
||||
|
||||
let newIconSize = baseIconSizes[0];
|
||||
@@ -899,7 +903,7 @@ var Dash = class Dash {
|
||||
favPos++;
|
||||
}
|
||||
|
||||
// No drag placeholder means we don't want to favorite the app
|
||||
// No drag placeholder means we don't wan't to favorite the app
|
||||
// and we are dragging it to its original position
|
||||
if (!this._dragPlaceholder)
|
||||
return true;
|
||||
|
@@ -118,7 +118,7 @@ var WorldClocksSection = class WorldClocksSection {
|
||||
if (!clocks[i].location)
|
||||
continue;
|
||||
let l = world.deserialize(clocks[i].location);
|
||||
if (l && l.get_timezone() != null)
|
||||
if (l)
|
||||
this._locations.push({ location: l });
|
||||
}
|
||||
|
||||
@@ -136,12 +136,11 @@ var WorldClocksSection = class WorldClocksSection {
|
||||
layout.attach(header, 0, 0, 2, 1);
|
||||
this.actor.label_actor = header;
|
||||
|
||||
let localOffset = GLib.DateTime.new_now_local().get_utc_offset();
|
||||
|
||||
for (let i = 0; i < this._locations.length; i++) {
|
||||
let l = this._locations[i].location;
|
||||
|
||||
let name = l.get_city_name() || l.get_name();
|
||||
let name = l.get_level() == GWeather.LocationLevel.NAMED_TIMEZONE ? l.get_name()
|
||||
: l.get_city_name();
|
||||
let label = new St.Label({ style_class: 'world-clocks-city',
|
||||
text: name,
|
||||
x_align: Clutter.ActorAlign.START,
|
||||
@@ -150,8 +149,7 @@ var WorldClocksSection = class WorldClocksSection {
|
||||
|
||||
let time = new St.Label({ style_class: 'world-clocks-time' });
|
||||
|
||||
let otherOffset = this._getTimeAtLocation(l).get_utc_offset();
|
||||
let offset = (otherOffset - localOffset) / GLib.TIME_SPAN_HOUR;
|
||||
let offset = l.get_timezone().get_offset() / 60.;
|
||||
let fmt = (Math.trunc(offset) == offset) ? '%s%.0f' : '%s%.1f';
|
||||
let prefix = (offset >= 0) ? '+' : '-';
|
||||
let tz = new St.Label({ style_class: 'world-clocks-timezone',
|
||||
@@ -184,15 +182,11 @@ var WorldClocksSection = class WorldClocksSection {
|
||||
}
|
||||
}
|
||||
|
||||
_getTimeAtLocation(location) {
|
||||
let tz = GLib.TimeZone.new(location.get_timezone().get_tzid());
|
||||
return GLib.DateTime.new_now(tz);
|
||||
}
|
||||
|
||||
_updateLabels() {
|
||||
for (let i = 0; i < this._locations.length; i++) {
|
||||
let l = this._locations[i];
|
||||
let now = this._getTimeAtLocation(l.location);
|
||||
let tz = GLib.TimeZone.new(l.location.get_timezone().get_tzid());
|
||||
let now = GLib.DateTime.new_now(tz);
|
||||
l.actor.text = Util.formatTime(now, { timeOnly: true });
|
||||
}
|
||||
}
|
||||
@@ -476,9 +470,10 @@ class DateMenuButton extends PanelMenu.Button {
|
||||
box.add_actor(this._clockDisplay);
|
||||
box.add_actor(this._indicator.actor);
|
||||
|
||||
this.label_actor = this._clockDisplay;
|
||||
this.add_actor(box);
|
||||
this.add_style_class_name ('clock-display');
|
||||
this.actor.label_actor = this._clockDisplay;
|
||||
this.actor.add_actor(box);
|
||||
this.actor.add_style_class_name ('clock-display');
|
||||
|
||||
|
||||
let layout = new FreezableBinLayout();
|
||||
let bin = new St.Widget({ layout_manager: layout });
|
||||
|
@@ -175,10 +175,10 @@ var MessageDialogContent = GObject.registerClass({
|
||||
this[`_${prop}`].add_style_class_name(`message-dialog-${prop}`);
|
||||
});
|
||||
|
||||
let textProps = { ellipsize: Pango.EllipsizeMode.NONE,
|
||||
let textProps = { ellipsize_mode: Pango.EllipsizeMode.NONE,
|
||||
line_wrap: true };
|
||||
this._subtitle.clutter_text.set(textProps);
|
||||
this._body.clutter_text.set(textProps);
|
||||
Object.assign(this._subtitle.clutter_text, textProps);
|
||||
Object.assign(this._body.clutter_text, textProps);
|
||||
|
||||
if (!params.hasOwnProperty('style_class'))
|
||||
params.style_class = 'message-dialog-main-layout';
|
||||
|
@@ -96,15 +96,6 @@ function init() {
|
||||
Clutter.Actor.prototype.toString = function() {
|
||||
return St.describe_actor(this);
|
||||
};
|
||||
// Deprecation warning for former JS classes turned into an actor subclass
|
||||
Object.defineProperty(Clutter.Actor.prototype, 'actor', {
|
||||
get() {
|
||||
let klass = this.constructor.name;
|
||||
let { stack } = new Error();
|
||||
log(`Usage of object.actor is deprecated for ${klass}\n${stack}`);
|
||||
return this;
|
||||
}
|
||||
});
|
||||
|
||||
let origToString = Object.prototype.toString;
|
||||
Object.prototype.toString = function() {
|
||||
|
@@ -272,7 +272,7 @@ var CandidatePopup = class CandidatePopup {
|
||||
|
||||
_setDummyCursorGeometry(x, y, w, h) {
|
||||
Main.layoutManager.setDummyCursorGeometry(x, y, w, h);
|
||||
if (this._boxPointer.visible)
|
||||
if (this._boxPointer.actor.visible)
|
||||
this._boxPointer.setPosition(Main.layoutManager.dummyCursor, 0);
|
||||
}
|
||||
|
||||
@@ -285,7 +285,7 @@ var CandidatePopup = class CandidatePopup {
|
||||
if (isVisible) {
|
||||
this._boxPointer.setPosition(Main.layoutManager.dummyCursor, 0);
|
||||
this._boxPointer.open(BoxPointer.PopupAnimation.NONE);
|
||||
this._boxPointer.raise_top();
|
||||
this._boxPointer.actor.raise_top();
|
||||
} else {
|
||||
this._boxPointer.close(BoxPointer.PopupAnimation.NONE);
|
||||
}
|
||||
|
@@ -43,6 +43,8 @@ class BaseIcon extends St.Bin {
|
||||
x_fill: true,
|
||||
y_fill: true });
|
||||
|
||||
this.actor = this;
|
||||
|
||||
this.connect('destroy', this._onDestroy.bind(this));
|
||||
|
||||
this._box = new St.BoxLayout({ vertical: true });
|
||||
@@ -79,7 +81,7 @@ class BaseIcon extends St.Bin {
|
||||
// This can be overridden by a subclass, or by the createIcon
|
||||
// parameter to _init()
|
||||
createIcon(size) {
|
||||
throw new GObject.NotImplementedError(`createIcon in ${this.constructor.name}`);
|
||||
throw new Error('no implementation of createIcon in ' + this);
|
||||
}
|
||||
|
||||
setIconSize(size) {
|
||||
@@ -102,7 +104,6 @@ class BaseIcon extends St.Bin {
|
||||
}
|
||||
|
||||
vfunc_style_changed() {
|
||||
super.vfunc_style_changed();
|
||||
let node = this.get_theme_node();
|
||||
|
||||
let size;
|
||||
@@ -186,6 +187,8 @@ var IconGrid = GObject.registerClass({
|
||||
super._init({ style_class: 'icon-grid',
|
||||
y_align: Clutter.ActorAlign.START });
|
||||
|
||||
this.actor = this;
|
||||
|
||||
params = Params.parse(params, { rowLimit: null,
|
||||
columnLimit: null,
|
||||
minRows: 1,
|
||||
@@ -416,8 +419,7 @@ var IconGrid = GObject.registerClass({
|
||||
|
||||
animatePulse(animationDirection) {
|
||||
if (animationDirection != AnimationDirection.IN)
|
||||
throw new GObject.NotImplementedError("Pulse animation only implements " +
|
||||
"'in' animation direction");
|
||||
throw new Error("Pulse animation only implements 'in' animation direction");
|
||||
|
||||
this._cancelAnimation();
|
||||
|
||||
@@ -841,7 +843,7 @@ var PaginatedIconGrid = GObject.registerClass({
|
||||
}
|
||||
}
|
||||
|
||||
// Overridden from IconGrid
|
||||
// Overriden from IconGrid
|
||||
_getChildrenToAnimate() {
|
||||
let children = this._getVisibleChildren();
|
||||
let firstIndex = this._childrenPerPage * this.currentPage;
|
||||
|
@@ -282,11 +282,11 @@ var Key = class Key {
|
||||
y_fill: true,
|
||||
x_align: St.Align.START });
|
||||
this._boxPointer.hide();
|
||||
Main.layoutManager.addChrome(this._boxPointer);
|
||||
Main.layoutManager.addChrome(this._boxPointer.actor);
|
||||
this._boxPointer.setPosition(this.keyButton, 0.5);
|
||||
|
||||
// Adds style to existing keyboard style to avoid repetition
|
||||
this._boxPointer.add_style_class_name('keyboard-subkeys');
|
||||
this._boxPointer.actor.add_style_class_name('keyboard-subkeys');
|
||||
this._getExtendedKeys();
|
||||
this.keyButton._extended_keys = this._extended_keyboard;
|
||||
}
|
||||
@@ -1049,7 +1049,7 @@ var Keyboard = class Keyboard {
|
||||
this._a11yApplicationsSettings.connect('changed', this._syncEnabled.bind(this));
|
||||
this._lastDeviceId = null;
|
||||
this._suggestions = null;
|
||||
this._emojiKeyVisible = Meta.is_wayland_compositor();
|
||||
this._emojiKeyVisible = true;
|
||||
|
||||
this._focusTracker = new FocusTracker();
|
||||
this._focusTracker.connect('position-changed', this._onFocusPositionChanged.bind(this));
|
||||
@@ -1144,7 +1144,6 @@ var Keyboard = class Keyboard {
|
||||
this._keyboardController.disconnect(this._keypadVisibleId);
|
||||
if (this._focusNotifyId)
|
||||
global.stage.disconnect(this._focusNotifyId);
|
||||
this._clearShowIdle();
|
||||
this._keyboard = null;
|
||||
this.actor.destroy();
|
||||
this.actor = null;
|
||||
@@ -1163,7 +1162,7 @@ var Keyboard = class Keyboard {
|
||||
this._keyboardController = new KeyboardController();
|
||||
|
||||
this._groups = {};
|
||||
this._currentPage = null;
|
||||
this._current_page = null;
|
||||
|
||||
this._suggestions = new Suggestions();
|
||||
this.actor.add(this._suggestions.actor,
|
||||
@@ -1203,12 +1202,10 @@ var Keyboard = class Keyboard {
|
||||
this._keyboardNotifyId = this._keyboardController.connect('active-group', this._onGroupChanged.bind(this));
|
||||
this._keyboardGroupsChangedId = this._keyboardController.connect('groups-changed', this._onKeyboardGroupsChanged.bind(this));
|
||||
this._keyboardStateId = this._keyboardController.connect('panel-state', this._onKeyboardStateChanged.bind(this));
|
||||
this._emojiKeyVisibleId = this._keyboardController.connect('emoji-visible', this._onEmojiKeyVisible.bind(this));
|
||||
this._keypadVisibleId = this._keyboardController.connect('keypad-visible', this._onKeypadVisible.bind(this));
|
||||
this._focusNotifyId = global.stage.connect('notify::key-focus', this._onKeyFocusChanged.bind(this));
|
||||
|
||||
if (Meta.is_wayland_compositor())
|
||||
this._emojiKeyVisibleId = this._keyboardController.connect('emoji-visible', this._onEmojiKeyVisible.bind(this));
|
||||
|
||||
this._relayout();
|
||||
}
|
||||
|
||||
@@ -1230,7 +1227,6 @@ var Keyboard = class Keyboard {
|
||||
if (!this._showIdleId) {
|
||||
this._showIdleId = GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => {
|
||||
this.show(Main.layoutManager.focusIndex);
|
||||
this._showIdleId = 0;
|
||||
return GLib.SOURCE_REMOVE;
|
||||
});
|
||||
GLib.Source.set_name_by_id(this._showIdleId, '[gnome-shell] this.show');
|
||||
@@ -1357,7 +1353,7 @@ var Keyboard = class Keyboard {
|
||||
} else if (switchToLevel == 1) {
|
||||
extraButton.connect('long-press', () => {
|
||||
this._latched = true;
|
||||
this._setCurrentLevelLatched(this._currentPage, this._latched);
|
||||
this._setCurrentLevelLatched(this._current_page, this._latched);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1384,8 +1380,8 @@ var Keyboard = class Keyboard {
|
||||
}
|
||||
|
||||
_updateCurrentPageVisible() {
|
||||
if (this._currentPage)
|
||||
this._currentPage.visible = !this._emojiActive && !this._keypadVisible;
|
||||
if (this._current_page)
|
||||
this._current_page.visible = !this._emojiActive && !this._keypadVisible;
|
||||
}
|
||||
|
||||
_setEmojiActive(active) {
|
||||
@@ -1444,7 +1440,7 @@ var Keyboard = class Keyboard {
|
||||
|
||||
_getGridSlots() {
|
||||
let numOfHorizSlots = 0, numOfVertSlots;
|
||||
let rows = this._currentPage.get_children();
|
||||
let rows = this._current_page.get_children();
|
||||
numOfVertSlots = rows.length;
|
||||
|
||||
for (let i = 0; i < rows.length; ++i) {
|
||||
@@ -1474,12 +1470,7 @@ var Keyboard = class Keyboard {
|
||||
}
|
||||
|
||||
_onKeyboardGroupsChanged(keyboard) {
|
||||
let nonGroupActors = [this._emojiSelection.actor, this._keypad.actor];
|
||||
this._aspectContainer.get_children().filter(c => !nonGroupActors.includes(c)).forEach(c => {
|
||||
c.destroy();
|
||||
});
|
||||
|
||||
this._groups = {};
|
||||
this._groups = [];
|
||||
this._onGroupChanged();
|
||||
}
|
||||
|
||||
@@ -1521,24 +1512,13 @@ var Keyboard = class Keyboard {
|
||||
_setActiveLayer(activeLevel) {
|
||||
let activeGroupName = this._keyboardController.getCurrentGroup();
|
||||
let layers = this._groups[activeGroupName];
|
||||
let currentPage = layers[activeLevel];
|
||||
|
||||
if (this._currentPage == currentPage) {
|
||||
this._updateCurrentPageVisible();
|
||||
return;
|
||||
if (this._current_page != null) {
|
||||
this._setCurrentLevelLatched(this._current_page, false);
|
||||
this._current_page.hide();
|
||||
}
|
||||
|
||||
if (this._currentPage != null) {
|
||||
this._setCurrentLevelLatched(this._currentPage, false);
|
||||
this._currentPage.disconnect(this._currentPage._destroyID);
|
||||
this._currentPage.hide();
|
||||
delete this._currentPage._destroyID;
|
||||
}
|
||||
|
||||
this._currentPage = currentPage;
|
||||
this._currentPage._destroyID = this._currentPage.connect('destroy', () => {
|
||||
this._currentPage = null;
|
||||
});
|
||||
this._current_page = layers[activeLevel];
|
||||
this._updateCurrentPageVisible();
|
||||
}
|
||||
|
||||
@@ -1626,6 +1606,18 @@ var Keyboard = class Keyboard {
|
||||
this.setCursorLocation(null);
|
||||
}
|
||||
|
||||
_hideSubkeys() {
|
||||
if (this._subkeysBoxPointer) {
|
||||
this._subkeysBoxPointer.hide(BoxPointer.PopupAnimation.FULL);
|
||||
this._subkeysBoxPointer = null;
|
||||
}
|
||||
if (this._capturedEventId) {
|
||||
this.actor.disconnect(this._capturedEventId);
|
||||
this._capturedEventId = 0;
|
||||
}
|
||||
this._capturedPress = false;
|
||||
}
|
||||
|
||||
resetSuggestions() {
|
||||
if (this._suggestions)
|
||||
this._suggestions.clear();
|
||||
|
@@ -216,17 +216,10 @@ var LayoutManager = GObject.registerClass({
|
||||
this.uiGroup = new UiActor({ name: 'uiGroup' });
|
||||
this.uiGroup.set_flags(Clutter.ActorFlags.NO_LAYOUT);
|
||||
|
||||
global.stage.add_child(this.uiGroup);
|
||||
|
||||
global.stage.remove_actor(global.window_group);
|
||||
this.uiGroup.add_actor(global.window_group);
|
||||
|
||||
// Using addChrome() to add actors to uiGroup will position actors
|
||||
// underneath the top_window_group.
|
||||
// To insert actors at the top of uiGroup, we use addTopChrome() or
|
||||
// add the actor directly using uiGroup.add_actor().
|
||||
global.stage.remove_actor(global.top_window_group);
|
||||
this.uiGroup.add_actor(global.top_window_group);
|
||||
global.stage.add_child(this.uiGroup);
|
||||
|
||||
this.overviewGroup = new St.Widget({ name: 'overviewGroup',
|
||||
visible: false,
|
||||
@@ -238,7 +231,7 @@ var LayoutManager = GObject.registerClass({
|
||||
clip_to_allocation: true,
|
||||
layout_manager: new Clutter.BinLayout(),
|
||||
});
|
||||
this.addTopChrome(this.screenShieldGroup);
|
||||
this.addChrome(this.screenShieldGroup);
|
||||
|
||||
this.panelBox = new St.BoxLayout({ name: 'panelBox',
|
||||
vertical: true });
|
||||
@@ -254,14 +247,17 @@ var LayoutManager = GObject.registerClass({
|
||||
this.keyboardBox = new St.BoxLayout({ name: 'keyboardBox',
|
||||
reactive: true,
|
||||
track_hover: true });
|
||||
this.addTopChrome(this.keyboardBox);
|
||||
this.addChrome(this.keyboardBox);
|
||||
this._keyboardHeightNotifyId = 0;
|
||||
|
||||
// A dummy actor that tracks the mouse or text cursor, based on the
|
||||
// position and size set in setDummyCursorGeometry.
|
||||
this.dummyCursor = new St.Widget({ width: 0, height: 0, opacity: 0 });
|
||||
this.dummyCursor = new St.Widget({ width: 0, height: 0, visible: false });
|
||||
this.uiGroup.add_actor(this.dummyCursor);
|
||||
|
||||
global.stage.remove_actor(global.top_window_group);
|
||||
this.uiGroup.add_actor(global.top_window_group);
|
||||
|
||||
let feedbackGroup = Meta.get_feedback_group_for_display(global.display);
|
||||
global.stage.remove_actor(feedbackGroup);
|
||||
this.uiGroup.add_actor(feedbackGroup);
|
||||
@@ -806,16 +802,6 @@ var LayoutManager = GObject.registerClass({
|
||||
this._trackActor(actor, params);
|
||||
}
|
||||
|
||||
// addTopChrome:
|
||||
// @actor: an actor to add to the chrome
|
||||
// @params: (optional) additional params
|
||||
//
|
||||
// Like addChrome(), but adds @actor above all windows, including popups.
|
||||
addTopChrome(actor, params) {
|
||||
this.uiGroup.add_actor(actor);
|
||||
this._trackActor(actor, params);
|
||||
}
|
||||
|
||||
// trackChrome:
|
||||
// @actor: a descendant of the chrome to begin tracking
|
||||
// @params: parameters describing how to track @actor
|
||||
|
@@ -18,6 +18,9 @@ var NO_CHANGE = 0.0;
|
||||
var POINTER_REST_TIME = 1000; // milliseconds
|
||||
|
||||
// Settings
|
||||
const APPLICATIONS_SCHEMA = 'org.gnome.desktop.a11y.applications';
|
||||
const SHOW_KEY = 'screen-magnifier-enabled';
|
||||
|
||||
const MAGNIFIER_SCHEMA = 'org.gnome.desktop.a11y.magnifier';
|
||||
const SCREEN_POSITION_KEY = 'screen-position';
|
||||
const MAG_FACTOR_KEY = 'mag-factor';
|
||||
@@ -53,19 +56,20 @@ var MouseSpriteContent = GObject.registerClass({
|
||||
|
||||
vfunc_get_preferred_size() {
|
||||
if (!this._texture)
|
||||
return [false, 0, 0];
|
||||
return [0, 0];
|
||||
|
||||
return [true, this._texture.get_width(), this._texture.get_height()];
|
||||
return [this._texture.get_width(), this._texture.get_height()];
|
||||
}
|
||||
|
||||
vfunc_paint_content(actor, node) {
|
||||
if (!this._texture)
|
||||
return;
|
||||
|
||||
let color = Clutter.Color.get_static(Clutter.StaticColor.WHITE);
|
||||
let [minFilter, magFilter] = actor.get_content_scaling_filters();
|
||||
let color = new Clutter.Color();
|
||||
let textureNode = new Clutter.TextureNode(this._texture,
|
||||
color, minFilter, magFilter);
|
||||
color,
|
||||
Clutter.ScalingFilter.NEAREST,
|
||||
Clutter.ScalingFilter.NEAREST);
|
||||
textureNode.set_name('MouseSpriteContent');
|
||||
node.add_child(textureNode);
|
||||
|
||||
@@ -80,14 +84,8 @@ var MouseSpriteContent = GObject.registerClass({
|
||||
if (this._texture == coglTexture)
|
||||
return;
|
||||
|
||||
let oldTexture = this._texture;
|
||||
this._texture = coglTexture;
|
||||
this.invalidate();
|
||||
|
||||
if (!oldTexture || !coglTexture ||
|
||||
oldTexture.get_width() != coglTexture.get_width() ||
|
||||
oldTexture.get_height() != coglTexture.get_height())
|
||||
this.invalidate_size();
|
||||
}
|
||||
});
|
||||
|
||||
@@ -102,6 +100,7 @@ var Magnifier = class Magnifier {
|
||||
|
||||
this._mouseSprite = new Clutter.Actor({ request_mode: Clutter.RequestMode.CONTENT_SIZE });
|
||||
this._mouseSprite.content = new MouseSpriteContent();
|
||||
this._updateSpriteTexture();
|
||||
|
||||
this._cursorRoot = new Clutter.Actor();
|
||||
this._cursorRoot.add_actor(this._mouseSprite);
|
||||
@@ -114,16 +113,14 @@ var Magnifier = class Magnifier {
|
||||
|
||||
let aZoomRegion = new ZoomRegion(this, this._cursorRoot);
|
||||
this._zoomRegions.push(aZoomRegion);
|
||||
this._settingsInit(aZoomRegion);
|
||||
let showAtLaunch = this._settingsInit(aZoomRegion);
|
||||
aZoomRegion.scrollContentsTo(this.xMouse, this.yMouse);
|
||||
|
||||
St.Settings.get().connect('notify::magnifier-active', () => {
|
||||
this.setActive(St.Settings.get().magnifier_active);
|
||||
});
|
||||
cursorTracker.connect('cursor-changed', this._updateMouseSprite.bind(this));
|
||||
|
||||
// Export to dbus.
|
||||
magDBusService = new MagnifierDBus.ShellMagnifier();
|
||||
this.setActive(St.Settings.get().magnifier_active);
|
||||
this.setActive(showAtLaunch);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -156,15 +153,9 @@ var Magnifier = class Magnifier {
|
||||
|
||||
if (isActive != activate) {
|
||||
if (activate) {
|
||||
this._updateMouseSprite();
|
||||
this._cursorSpriteChangedId =
|
||||
this._cursorTracker.connect('cursor-changed',
|
||||
this._updateMouseSprite.bind(this));
|
||||
Meta.disable_unredirect_for_display(global.display);
|
||||
this.startTrackingMouse();
|
||||
} else {
|
||||
this._cursorTracker.disconnect(this._cursorSpriteChangedId);
|
||||
this._mouseSprite.content.texture = null;
|
||||
Meta.enable_unredirect_for_display(global.display);
|
||||
this.stopTrackingMouse();
|
||||
}
|
||||
@@ -502,8 +493,13 @@ var Magnifier = class Magnifier {
|
||||
}
|
||||
|
||||
_settingsInit(zoomRegion) {
|
||||
this._appSettings = new Gio.Settings({ schema_id: APPLICATIONS_SCHEMA });
|
||||
this._settings = new Gio.Settings({ schema_id: MAGNIFIER_SCHEMA });
|
||||
|
||||
this._appSettings.connect('changed::' + SHOW_KEY, () => {
|
||||
this.setActive(this._appSettings.get_boolean(SHOW_KEY));
|
||||
});
|
||||
|
||||
this._settings.connect('changed::' + SCREEN_POSITION_KEY,
|
||||
this._updateScreenPosition.bind(this));
|
||||
this._settings.connect('changed::' + MAG_FACTOR_KEY,
|
||||
@@ -610,6 +606,8 @@ var Magnifier = class Magnifier {
|
||||
let showCrosshairs = this._settings.get_boolean(SHOW_CROSS_HAIRS_KEY);
|
||||
this.addCrosshairs();
|
||||
this.setCrosshairsVisible(showCrosshairs);
|
||||
|
||||
return this._appSettings.get_boolean(SHOW_KEY);
|
||||
}
|
||||
|
||||
_updateScreenPosition() {
|
||||
@@ -756,41 +754,13 @@ var ZoomRegion = class ZoomRegion {
|
||||
|
||||
this._pointerIdleMonitor = Meta.IdleMonitor.get_for_device(Meta.VIRTUAL_CORE_POINTER_ID);
|
||||
this._scrollContentsTimerId = 0;
|
||||
}
|
||||
|
||||
_connectSignals() {
|
||||
if (this._signalConnections)
|
||||
return;
|
||||
|
||||
this._signalConnections = [];
|
||||
let id = Main.layoutManager.connect('monitors-changed',
|
||||
this._monitorsChanged.bind(this));
|
||||
this._signalConnections.push([Main.layoutManager, id]);
|
||||
|
||||
id = this._focusCaretTracker.connect('caret-moved', this._updateCaret.bind(this));
|
||||
this._signalConnections.push([this._focusCaretTracker, id]);
|
||||
|
||||
id = this._focusCaretTracker.connect('focus-changed', this._updateFocus.bind(this));
|
||||
this._signalConnections.push([this._focusCaretTracker, id]);
|
||||
}
|
||||
|
||||
_disconnectSignals() {
|
||||
for (let [obj, id] of this._signalConnections)
|
||||
obj.disconnect(id);
|
||||
|
||||
delete this._signalConnections;
|
||||
}
|
||||
|
||||
_updateScreenPosition() {
|
||||
if (this._screenPosition == GDesktopEnums.MagnifierScreenPosition.NONE)
|
||||
this._setViewPort({
|
||||
x: this._viewPortX,
|
||||
y: this._viewPortY,
|
||||
width: this._viewPortWidth,
|
||||
height: this._viewPortHeight
|
||||
});
|
||||
else
|
||||
this.setScreenPosition(this._screenPosition);
|
||||
Main.layoutManager.connect('monitors-changed',
|
||||
this._monitorsChanged.bind(this));
|
||||
this._focusCaretTracker.connect('caret-moved',
|
||||
this._updateCaret.bind(this));
|
||||
this._focusCaretTracker.connect('focus-changed',
|
||||
this._updateFocus.bind(this));
|
||||
}
|
||||
|
||||
_updateFocus(caller, event) {
|
||||
@@ -838,13 +808,10 @@ var ZoomRegion = class ZoomRegion {
|
||||
this._createActors();
|
||||
if (this._isMouseOverRegion())
|
||||
this._magnifier.hideSystemCursor();
|
||||
this._updateScreenPosition();
|
||||
this._updateMagViewGeometry();
|
||||
this._updateCloneGeometry();
|
||||
this._updateMousePosition();
|
||||
this._connectSignals();
|
||||
} else {
|
||||
this._disconnectSignals();
|
||||
this._destroyActors();
|
||||
}
|
||||
|
||||
@@ -1272,7 +1239,7 @@ var ZoomRegion = class ZoomRegion {
|
||||
|
||||
/**
|
||||
* getContrast:
|
||||
* Retrieve the contrast of the magnified view.
|
||||
* Retreive the contrast of the magnified view.
|
||||
* @return Object containing the contrast for the red, green,
|
||||
* and blue channels.
|
||||
*/
|
||||
@@ -1594,8 +1561,18 @@ var ZoomRegion = class ZoomRegion {
|
||||
}
|
||||
|
||||
_monitorsChanged() {
|
||||
if (!this.isActive())
|
||||
return;
|
||||
|
||||
this._background.set_size(global.screen_width, global.screen_height);
|
||||
this._updateScreenPosition();
|
||||
|
||||
if (this._screenPosition == GDesktopEnums.MagnifierScreenPosition.NONE)
|
||||
this._setViewPort({ x: this._viewPortX,
|
||||
y: this._viewPortY,
|
||||
width: this._viewPortWidth,
|
||||
height: this._viewPortHeight });
|
||||
else
|
||||
this.setScreenPosition(this._screenPosition);
|
||||
}
|
||||
};
|
||||
|
||||
|
@@ -211,6 +211,13 @@ function _initializeUI() {
|
||||
|
||||
_startDate = new Date();
|
||||
|
||||
let perfModuleName = GLib.getenv("SHELL_PERF_MODULE");
|
||||
if (perfModuleName) {
|
||||
let perfOutput = GLib.getenv("SHELL_PERF_OUTPUT");
|
||||
let module = eval('imports.perf.' + perfModuleName + ';');
|
||||
Scripting.runPerfScript(module, perfOutput);
|
||||
}
|
||||
|
||||
ExtensionDownloader.init();
|
||||
ExtensionSystem.init();
|
||||
|
||||
@@ -232,13 +239,6 @@ function _initializeUI() {
|
||||
Shell.Global.log_structured('GNOME Shell started at ' + _startDate,
|
||||
['MESSAGE_ID=' + GNOMESHELL_STARTED_MESSAGE_ID]);
|
||||
}
|
||||
|
||||
let perfModuleName = GLib.getenv("SHELL_PERF_MODULE");
|
||||
if (perfModuleName) {
|
||||
let perfOutput = GLib.getenv("SHELL_PERF_OUTPUT");
|
||||
let module = eval('imports.perf.' + perfModuleName + ';');
|
||||
Scripting.runPerfScript(module, perfOutput);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -636,7 +636,7 @@ function _queueBeforeRedraw(workId) {
|
||||
* initialization as well, under the assumption that new actors
|
||||
* will need it.
|
||||
*
|
||||
* Returns: A string work identifier
|
||||
* Returns: A string work identifer
|
||||
*/
|
||||
function initializeDeferredWork(actor, callback, props) {
|
||||
// Turn into a string so we can use as an object property
|
||||
|
@@ -584,6 +584,7 @@ class SourceActor extends St.Widget {
|
||||
this._source = source;
|
||||
this._size = size;
|
||||
|
||||
this.actor = this;
|
||||
this.connect('destroy', () => {
|
||||
this._source.disconnect(this._iconUpdatedId);
|
||||
this._actorDestroyed = true;
|
||||
|
@@ -224,10 +224,10 @@ var ModalDialog = class {
|
||||
// can be dismissed by a close call.
|
||||
//
|
||||
// The main point of this method is to give some indication to the user
|
||||
// that the dialog response has been acknowledged but will take a few
|
||||
// that the dialog reponse has been acknowledged but will take a few
|
||||
// moments before being processed.
|
||||
// e.g., if a user clicked "Log Out" then the dialog should go away
|
||||
// immediately, but the lightbox should remain until the logout is
|
||||
// imediately, but the lightbox should remain until the logout is
|
||||
// complete.
|
||||
_fadeOutDialog(timestamp) {
|
||||
if (this.state == State.CLOSED || this.state == State.CLOSING)
|
||||
|
@@ -95,6 +95,28 @@ var OsdMonitorLabeler = class {
|
||||
|
||||
this._reset();
|
||||
|
||||
for (let id in params) {
|
||||
let monitor = this._monitorManager.get_monitor_for_output(id);
|
||||
if (monitor == -1)
|
||||
continue;
|
||||
this._monitorLabels.get(monitor).push(params[id].deep_unpack());
|
||||
}
|
||||
|
||||
// In mirrored display setups, more than one physical outputs
|
||||
// might be showing the same logical monitor. In that case, we
|
||||
// join each output's labels on the same OSD widget.
|
||||
for (let [monitor, labels] of this._monitorLabels.entries()) {
|
||||
labels.sort();
|
||||
this._osdLabels.push(new OsdMonitorLabel(monitor, labels.join(' ')));
|
||||
}
|
||||
}
|
||||
|
||||
show2(client, params) {
|
||||
if (!this._trackClient(client))
|
||||
return;
|
||||
|
||||
this._reset();
|
||||
|
||||
for (let connector in params) {
|
||||
let monitor = this._monitorManager.get_monitor_for_connector(connector);
|
||||
if (monitor == -1)
|
||||
|
@@ -122,7 +122,7 @@ var SlidingControl = class {
|
||||
}
|
||||
|
||||
_getSlide() {
|
||||
throw new GObject.NotImplementedError(`_getSlide in ${this.constructor.name}`);
|
||||
throw new Error('getSlide() must be overridden');
|
||||
}
|
||||
|
||||
_updateSlide() {
|
||||
@@ -369,15 +369,17 @@ class DashSpacer extends St.Widget {
|
||||
}
|
||||
|
||||
vfunc_get_preferred_width(forHeight) {
|
||||
if (this._bindConstraint)
|
||||
return this._bindConstraint.source.get_preferred_width(forHeight);
|
||||
return super.vfunc_get_preferred_width(forHeight);
|
||||
let box = this.get_allocation_box();
|
||||
let minWidth = super.vfunc_get_preferred_width(forHeight)[0];
|
||||
let natWidth = box.x2 - box.x1;
|
||||
return [minWidth, natWidth];
|
||||
}
|
||||
|
||||
vfunc_get_preferred_height(forWidth) {
|
||||
if (this._bindConstraint)
|
||||
return this._bindConstraint.source.get_preferred_height(forWidth);
|
||||
return super.vfunc_get_preferred_height(forWidth);
|
||||
let box = this.get_allocation_box();
|
||||
let minHeight = super.vfunc_get_preferred_height(forWidth)[0];
|
||||
let natHeight = box.y2 - box.y1;
|
||||
return [minHeight, natHeight];
|
||||
}
|
||||
});
|
||||
|
||||
|
@@ -374,12 +374,12 @@ var PadDiagram = GObject.registerClass({
|
||||
svgData += this._cssString();
|
||||
svgData += this._wrappingSvgFooter();
|
||||
|
||||
let istream = new Gio.MemoryInputStream();
|
||||
istream.add_bytes(new GLib.Bytes(svgData));
|
||||
let handle = new Rsvg.Handle();
|
||||
handle.set_base_uri(GLib.path_get_dirname(this._imagePath));
|
||||
handle.write(svgData);
|
||||
handle.close();
|
||||
|
||||
return Rsvg.Handle.new_from_stream_sync(istream,
|
||||
Gio.File.new_for_path(this._imagePath),
|
||||
0, null);
|
||||
return handle;
|
||||
}
|
||||
|
||||
_updateDiagramScale() {
|
||||
|
118
js/ui/panel.js
@@ -1,6 +1,6 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
const { Atk, Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
|
||||
const { Atk, Clutter, Gio, GLib, GObject, Gtk, Meta, Shell, St } = imports.gi;
|
||||
const Cairo = imports.cairo;
|
||||
const Mainloop = imports.mainloop;
|
||||
|
||||
@@ -75,9 +75,6 @@ class AppMenu extends PopupMenu.PopupMenu {
|
||||
|
||||
this._windowsChangedId = 0;
|
||||
|
||||
/* Translators: This is the heading of a list of open windows */
|
||||
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem(_("Open Windows")));
|
||||
|
||||
this._windowSection = new PopupMenu.PopupMenuSection();
|
||||
this.addMenuItem(this._windowSection);
|
||||
|
||||
@@ -108,8 +105,6 @@ class AppMenu extends PopupMenu.PopupMenu {
|
||||
});
|
||||
});
|
||||
|
||||
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||
|
||||
this.addAction(_("Quit"), () => {
|
||||
this._app.request_quit();
|
||||
});
|
||||
@@ -122,7 +117,7 @@ class AppMenu extends PopupMenu.PopupMenu {
|
||||
|
||||
_updateDetailsVisibility() {
|
||||
let sw = this._appSystem.lookup_app('org.gnome.Software.desktop');
|
||||
this._detailsItem.visible = (sw != null);
|
||||
this._detailsItem.actor.visible = (sw != null);
|
||||
}
|
||||
|
||||
isEmpty() {
|
||||
@@ -160,7 +155,7 @@ class AppMenu extends PopupMenu.PopupMenu {
|
||||
});
|
||||
});
|
||||
|
||||
this._newWindowItem.visible =
|
||||
this._newWindowItem.actor.visible =
|
||||
app && app.can_open_new_window() && !actions.includes('new-window');
|
||||
}
|
||||
|
||||
@@ -177,6 +172,13 @@ class AppMenu extends PopupMenu.PopupMenu {
|
||||
Main.activateWindow(window, event.get_time());
|
||||
});
|
||||
});
|
||||
|
||||
// Add separator between windows of the current desktop and other windows.
|
||||
let workspaceManager = global.workspace_manager;
|
||||
let activeWorkspace = workspaceManager.get_active_workspace();
|
||||
let pos = windows.findIndex(w => w.get_workspace() != activeWorkspace);
|
||||
if (pos >= 0)
|
||||
this._windowSection.addMenuItem(new PopupMenu.PopupSeparatorMenuItem(), pos);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -194,20 +196,21 @@ var AppMenuButton = GObject.registerClass({
|
||||
_init(panel) {
|
||||
super._init(0.0, null, true);
|
||||
|
||||
this.accessible_role = Atk.Role.MENU;
|
||||
this.actor.accessible_role = Atk.Role.MENU;
|
||||
|
||||
this._startingApps = [];
|
||||
|
||||
this._menuManager = panel.menuManager;
|
||||
this._gtkSettings = Gtk.Settings.get_default();
|
||||
this._targetApp = null;
|
||||
this._busyNotifyId = 0;
|
||||
|
||||
let bin = new St.Bin({ name: 'appMenu' });
|
||||
bin.connect('style-changed', this._onStyleChanged.bind(this));
|
||||
this.add_actor(bin);
|
||||
this.actor.add_actor(bin);
|
||||
|
||||
this.bind_property("reactive", this, "can-focus", 0);
|
||||
this.reactive = false;
|
||||
this.actor.bind_property("reactive", this.actor, "can-focus", 0);
|
||||
this.actor.reactive = false;
|
||||
|
||||
this._container = new St.BoxLayout({ style_class: 'panel-status-menu-box' });
|
||||
bin.set_child(this._container);
|
||||
@@ -263,10 +266,10 @@ var AppMenuButton = GObject.registerClass({
|
||||
return;
|
||||
|
||||
this._visible = true;
|
||||
this.reactive = true;
|
||||
this.actor.reactive = true;
|
||||
this.show();
|
||||
Tweener.removeTweens(this);
|
||||
Tweener.addTween(this,
|
||||
Tweener.removeTweens(this.actor);
|
||||
Tweener.addTween(this.actor,
|
||||
{ opacity: 255,
|
||||
time: Overview.ANIMATION_TIME,
|
||||
transition: 'easeOutQuad' });
|
||||
@@ -277,9 +280,9 @@ var AppMenuButton = GObject.registerClass({
|
||||
return;
|
||||
|
||||
this._visible = false;
|
||||
this.reactive = false;
|
||||
Tweener.removeTweens(this);
|
||||
Tweener.addTween(this,
|
||||
this.actor.reactive = false;
|
||||
Tweener.removeTweens(this.actor);
|
||||
Tweener.addTween(this.actor,
|
||||
{ opacity: 0,
|
||||
time: Overview.ANIMATION_TIME,
|
||||
transition: 'easeOutQuad',
|
||||
@@ -402,7 +405,7 @@ var AppMenuButton = GObject.registerClass({
|
||||
if (this._targetApp) {
|
||||
this._busyNotifyId = this._targetApp.connect('notify::busy', this._sync.bind(this));
|
||||
this._label.set_text(this._targetApp.get_name());
|
||||
this.set_accessible_name(this._targetApp.get_name());
|
||||
this.actor.set_accessible_name(this._targetApp.get_name());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -420,7 +423,7 @@ var AppMenuButton = GObject.registerClass({
|
||||
else
|
||||
this.stopAnimation();
|
||||
|
||||
this.reactive = (visible && !isBusy);
|
||||
this.actor.reactive = (visible && !isBusy);
|
||||
|
||||
this._syncIcon();
|
||||
this.menu.setApp(this._targetApp);
|
||||
@@ -459,28 +462,28 @@ var ActivitiesButton = GObject.registerClass(
|
||||
class ActivitiesButton extends PanelMenu.Button {
|
||||
_init() {
|
||||
super._init(0.0, null, true);
|
||||
this.accessible_role = Atk.Role.TOGGLE_BUTTON;
|
||||
this.actor.accessible_role = Atk.Role.TOGGLE_BUTTON;
|
||||
|
||||
this.name = 'panelActivities';
|
||||
this.actor.name = 'panelActivities';
|
||||
|
||||
/* Translators: If there is no suitable word for "Activities"
|
||||
in your language, you can use the word for "Overview". */
|
||||
this._label = new St.Label({ text: _("Activities"),
|
||||
y_align: Clutter.ActorAlign.CENTER });
|
||||
this.add_actor(this._label);
|
||||
this.actor.add_actor(this._label);
|
||||
|
||||
this.label_actor = this._label;
|
||||
this.actor.label_actor = this._label;
|
||||
|
||||
this.connect('captured-event', this._onCapturedEvent.bind(this));
|
||||
this.connect_after('key-release-event', this._onKeyRelease.bind(this));
|
||||
this.actor.connect('captured-event', this._onCapturedEvent.bind(this));
|
||||
this.actor.connect_after('key-release-event', this._onKeyRelease.bind(this));
|
||||
|
||||
Main.overview.connect('showing', () => {
|
||||
this.add_style_pseudo_class('overview');
|
||||
this.add_accessible_state (Atk.StateType.CHECKED);
|
||||
this.actor.add_style_pseudo_class('overview');
|
||||
this.actor.add_accessible_state (Atk.StateType.CHECKED);
|
||||
});
|
||||
Main.overview.connect('hiding', () => {
|
||||
this.remove_style_pseudo_class('overview');
|
||||
this.remove_accessible_state (Atk.StateType.CHECKED);
|
||||
this.actor.remove_style_pseudo_class('overview');
|
||||
this.actor.remove_accessible_state (Atk.StateType.CHECKED);
|
||||
});
|
||||
|
||||
this._xdndTimeOut = 0;
|
||||
@@ -533,7 +536,7 @@ class ActivitiesButton extends PanelMenu.Button {
|
||||
let [x, y, mask] = global.get_pointer();
|
||||
let pickedActor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, x, y);
|
||||
|
||||
if (pickedActor == this && Main.overview.shouldToggleByCornerOrButton())
|
||||
if (pickedActor == this.actor && Main.overview.shouldToggleByCornerOrButton())
|
||||
Main.overview.toggle();
|
||||
|
||||
Mainloop.source_remove(this._xdndTimeOut);
|
||||
@@ -747,7 +750,7 @@ class AggregateMenu extends PanelMenu.Button {
|
||||
this.menu.box.set_layout_manager(menuLayout);
|
||||
|
||||
this._indicators = new St.BoxLayout({ style_class: 'panel-status-indicators-box' });
|
||||
this.add_child(this._indicators);
|
||||
this.actor.add_child(this._indicators);
|
||||
|
||||
if (Config.HAVE_NETWORKMANAGER) {
|
||||
this._network = new imports.ui.status.network.NMApplet();
|
||||
@@ -771,10 +774,17 @@ class AggregateMenu extends PanelMenu.Button {
|
||||
this._nightLight = new imports.ui.status.nightLight.Indicator();
|
||||
this._thunderbolt = new imports.ui.status.thunderbolt.Indicator();
|
||||
|
||||
if (Main.sessionMode.components.includes('updates'))
|
||||
this._automaticUpdates = new imports.ui.status.automaticUpdates.Indicator();
|
||||
else
|
||||
this._automaticUpdates = null;
|
||||
|
||||
this._indicators.add_child(this._thunderbolt.indicators);
|
||||
this._indicators.add_child(this._screencast.indicators);
|
||||
this._indicators.add_child(this._location.indicators);
|
||||
this._indicators.add_child(this._nightLight.indicators);
|
||||
if (this._automaticUpdates)
|
||||
this._indicators.add_child(this._automaticUpdates.indicators);
|
||||
if (this._network) {
|
||||
this._indicators.add_child(this._network.indicators);
|
||||
}
|
||||
@@ -793,6 +803,8 @@ class AggregateMenu extends PanelMenu.Button {
|
||||
if (this._network) {
|
||||
this.menu.addMenuItem(this._network.menu);
|
||||
}
|
||||
if (this._automaticUpdates)
|
||||
this.menu.addMenuItem(this._automaticUpdates.menu);
|
||||
if (this._bluetooth) {
|
||||
this.menu.addMenuItem(this._bluetooth.menu);
|
||||
}
|
||||
@@ -806,7 +818,6 @@ class AggregateMenu extends PanelMenu.Button {
|
||||
menuLayout.addSizeChild(this._location.menu.actor);
|
||||
menuLayout.addSizeChild(this._rfkill.menu.actor);
|
||||
menuLayout.addSizeChild(this._power.menu.actor);
|
||||
menuLayout.addSizeChild(this._system.buttonGroup);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -825,6 +836,9 @@ class Panel extends St.Widget {
|
||||
super._init({ name: 'panel',
|
||||
reactive: true });
|
||||
|
||||
// For compatibility with extensions that still use the
|
||||
// this.actor field
|
||||
this.actor = this;
|
||||
this.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS);
|
||||
|
||||
this._sessionStyle = null;
|
||||
@@ -877,7 +891,7 @@ class Panel extends St.Widget {
|
||||
}
|
||||
|
||||
vfunc_allocate(box, flags) {
|
||||
this.set_allocation(box, flags);
|
||||
super.vfunc_allocate(box, flags);
|
||||
|
||||
let allocWidth = box.x2 - box.x1;
|
||||
let allocHeight = box.y2 - box.y1;
|
||||
@@ -971,11 +985,22 @@ class Panel extends St.Widget {
|
||||
if (isPress && button != 1)
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
let focusWindow = global.display.focus_window;
|
||||
if (!focusWindow)
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
let dragWindow = focusWindow.is_attached_dialog() ? focusWindow.get_transient_for()
|
||||
: focusWindow;
|
||||
if (!dragWindow)
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
let rect = dragWindow.get_frame_rect();
|
||||
let [stageX, stageY] = event.get_coords();
|
||||
|
||||
let dragWindow = this._getDraggableWindowForPosition(stageX);
|
||||
let allowDrag = dragWindow.maximized_vertically &&
|
||||
stageX > rect.x && stageX < rect.x + rect.width;
|
||||
|
||||
if (!dragWindow)
|
||||
if (!allowDrag)
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
global.display.begin_grab_op(dragWindow,
|
||||
@@ -1005,7 +1030,7 @@ class Panel extends St.Widget {
|
||||
return; // menu not supported by current session mode
|
||||
|
||||
let menu = indicator.menu;
|
||||
if (!indicator.reactive)
|
||||
if (!indicator.actor.reactive)
|
||||
return;
|
||||
|
||||
menu.toggle();
|
||||
@@ -1027,7 +1052,7 @@ class Panel extends St.Widget {
|
||||
return;
|
||||
|
||||
let menu = indicator.menu;
|
||||
if (!indicator.reactive)
|
||||
if (!indicator.actor.reactive)
|
||||
return;
|
||||
|
||||
menu.close();
|
||||
@@ -1185,21 +1210,4 @@ class Panel extends St.Widget {
|
||||
Main.messageTray.bannerBlocked = isOpen;
|
||||
});
|
||||
}
|
||||
|
||||
_getDraggableWindowForPosition(stageX) {
|
||||
let workspaceManager = global.workspace_manager;
|
||||
let workspace = workspaceManager.get_active_workspace()
|
||||
let allWindowsByStacking = global.display.sort_windows_by_stacking(
|
||||
workspace.list_windows()
|
||||
).reverse();
|
||||
|
||||
return allWindowsByStacking.find(metaWindow => {
|
||||
let rect = metaWindow.get_frame_rect();
|
||||
return metaWindow.is_on_primary_monitor() &&
|
||||
metaWindow.showing_on_its_workspace() &&
|
||||
metaWindow.get_window_type() != Meta.WindowType.DESKTOP &&
|
||||
metaWindow.maximized_vertically &&
|
||||
stageX > rect.x && stageX < rect.x + rect.width
|
||||
});
|
||||
}
|
||||
});
|
||||
|
@@ -14,11 +14,12 @@ class ButtonBox extends St.Widget {
|
||||
|
||||
super._init(params);
|
||||
|
||||
this.actor = this;
|
||||
this._delegate = this;
|
||||
|
||||
this.container = new St.Bin({ y_fill: true,
|
||||
x_fill: true,
|
||||
child: this });
|
||||
child: this.actor });
|
||||
|
||||
this.connect('style-changed', this._onStyleChanged.bind(this));
|
||||
this.connect('destroy', this._onDestroy.bind(this));
|
||||
@@ -104,9 +105,9 @@ var Button = GObject.registerClass({
|
||||
this.connect('notify::visible', this._onVisibilityChanged.bind(this));
|
||||
|
||||
if (dontCreateMenu)
|
||||
this.menu = new PopupMenu.PopupDummyMenu(this);
|
||||
this.menu = new PopupMenu.PopupDummyMenu(this.actor);
|
||||
else
|
||||
this.setMenu(new PopupMenu.PopupMenu(this, menuAlignment, St.Side.TOP, 0));
|
||||
this.setMenu(new PopupMenu.PopupMenu(this.actor, menuAlignment, St.Side.TOP, 0));
|
||||
}
|
||||
|
||||
setSensitive(sensitive) {
|
||||
@@ -144,7 +145,7 @@ var Button = GObject.registerClass({
|
||||
if (!this.menu)
|
||||
return;
|
||||
|
||||
if (!this.visible)
|
||||
if (!this.actor.visible)
|
||||
this.menu.close();
|
||||
}
|
||||
|
||||
@@ -154,10 +155,10 @@ var Button = GObject.registerClass({
|
||||
|
||||
let symbol = event.get_key_symbol();
|
||||
if (symbol == Clutter.KEY_Left || symbol == Clutter.KEY_Right) {
|
||||
let group = global.focus_manager.get_group(this);
|
||||
let group = global.focus_manager.get_group(this.actor);
|
||||
if (group) {
|
||||
let direction = (symbol == Clutter.KEY_Left) ? St.DirectionType.LEFT : St.DirectionType.RIGHT;
|
||||
group.navigate_focus(this, direction, false);
|
||||
group.navigate_focus(this.actor, direction, false);
|
||||
return Clutter.EVENT_STOP;
|
||||
}
|
||||
}
|
||||
@@ -166,9 +167,9 @@ var Button = GObject.registerClass({
|
||||
|
||||
_onOpenStateChanged(menu, open) {
|
||||
if (open)
|
||||
this.add_style_pseudo_class('active');
|
||||
this.actor.add_style_pseudo_class('active');
|
||||
else
|
||||
this.remove_style_pseudo_class('active');
|
||||
this.actor.remove_style_pseudo_class('active');
|
||||
|
||||
// Setting the max-height won't do any good if the minimum height of the
|
||||
// menu is higher then the screen; it's useful if part of the menu is
|
||||
|
@@ -51,64 +51,49 @@ function arrowIcon(side) {
|
||||
return arrow;
|
||||
}
|
||||
|
||||
var PopupBaseMenuItem = GObject.registerClass({
|
||||
Properties: {
|
||||
'active': GObject.ParamSpec.boolean('active', 'active', 'active',
|
||||
GObject.ParamFlags.READWRITE,
|
||||
GObject.TYPE_BOOLEAN,
|
||||
false),
|
||||
'sensitive': GObject.ParamSpec.boolean('sensitive', 'sensitive', 'sensitive',
|
||||
GObject.ParamFlags.READWRITE,
|
||||
GObject.TYPE_BOOLEAN,
|
||||
true),
|
||||
},
|
||||
Signals: {
|
||||
'activate': { param_types: [Clutter.Event.$gtype] },
|
||||
}
|
||||
}, class PopupBaseMenuItem extends St.BoxLayout {
|
||||
_init(params) {
|
||||
var PopupBaseMenuItem = class {
|
||||
constructor(params) {
|
||||
params = Params.parse (params, { reactive: true,
|
||||
activate: true,
|
||||
hover: true,
|
||||
style_class: null,
|
||||
can_focus: true
|
||||
});
|
||||
super._init({ style_class: 'popup-menu-item',
|
||||
reactive: params.reactive,
|
||||
track_hover: params.reactive,
|
||||
can_focus: params.can_focus,
|
||||
accessible_role: Atk.Role.MENU_ITEM });
|
||||
this._delegate = this;
|
||||
|
||||
this.actor = new St.BoxLayout({ style_class: 'popup-menu-item',
|
||||
reactive: params.reactive,
|
||||
track_hover: params.reactive,
|
||||
can_focus: params.can_focus,
|
||||
accessible_role: Atk.Role.MENU_ITEM });
|
||||
this.actor._delegate = this;
|
||||
|
||||
this._ornament = Ornament.NONE;
|
||||
this._ornamentLabel = new St.Label({ style_class: 'popup-menu-ornament' });
|
||||
this.add(this._ornamentLabel);
|
||||
this.actor.add(this._ornamentLabel);
|
||||
|
||||
this._parent = null;
|
||||
this._active = false;
|
||||
this.active = false;
|
||||
this._activatable = params.reactive && params.activate;
|
||||
this._sensitive = true;
|
||||
|
||||
if (!this._activatable)
|
||||
this.add_style_class_name('popup-inactive-menu-item');
|
||||
this.actor.add_style_class_name('popup-inactive-menu-item');
|
||||
|
||||
if (params.style_class)
|
||||
this.add_style_class_name(params.style_class);
|
||||
this.actor.add_style_class_name(params.style_class);
|
||||
|
||||
if (this._activatable) {
|
||||
this.connect('button-press-event', this._onButtonPressEvent.bind(this));
|
||||
this.connect('button-release-event', this._onButtonReleaseEvent.bind(this));
|
||||
this.connect('touch-event', this._onTouchEvent.bind(this));
|
||||
this.connect('key-press-event', this._onKeyPressEvent.bind(this));
|
||||
this.actor.connect('button-press-event', this._onButtonPressEvent.bind(this));
|
||||
this.actor.connect('button-release-event', this._onButtonReleaseEvent.bind(this));
|
||||
this.actor.connect('touch-event', this._onTouchEvent.bind(this));
|
||||
this.actor.connect('key-press-event', this._onKeyPressEvent.bind(this));
|
||||
}
|
||||
if (params.reactive && params.hover)
|
||||
this.bind_property('hover', this, 'active', GObject.BindingFlags.SYNC_CREATE);
|
||||
}
|
||||
this.actor.connect('notify::hover', this._onHoverChanged.bind(this));
|
||||
|
||||
get actor() {
|
||||
/* This is kept for compatibility with current implementation, and we
|
||||
don't want to warn here yet since PopupMenu depends on this */
|
||||
return this;
|
||||
this.actor.connect('key-focus-in', this._onKeyFocusIn.bind(this));
|
||||
this.actor.connect('key-focus-out', this._onKeyFocusOut.bind(this));
|
||||
this.actor.connect('destroy', this._onDestroy.bind(this));
|
||||
}
|
||||
|
||||
_getTopMenu() {
|
||||
@@ -124,24 +109,24 @@ var PopupBaseMenuItem = GObject.registerClass({
|
||||
|
||||
_onButtonPressEvent(actor, event) {
|
||||
// This is the CSS active state
|
||||
this.add_style_pseudo_class('active');
|
||||
this.actor.add_style_pseudo_class ('active');
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
}
|
||||
|
||||
_onButtonReleaseEvent(actor, event) {
|
||||
this.remove_style_pseudo_class('active');
|
||||
this.actor.remove_style_pseudo_class ('active');
|
||||
this.activate(event);
|
||||
return Clutter.EVENT_STOP;
|
||||
}
|
||||
|
||||
_onTouchEvent(actor, event) {
|
||||
if (event.type() == Clutter.EventType.TOUCH_END) {
|
||||
this.remove_style_pseudo_class('active');
|
||||
this.actor.remove_style_pseudo_class ('active');
|
||||
this.activate(event);
|
||||
return Clutter.EVENT_STOP;
|
||||
} else if (event.type() == Clutter.EventType.TOUCH_BEGIN) {
|
||||
// This is the CSS active state
|
||||
this.add_style_pseudo_class('active');
|
||||
this.actor.add_style_pseudo_class ('active');
|
||||
}
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
}
|
||||
@@ -166,56 +151,54 @@ var PopupBaseMenuItem = GObject.registerClass({
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
}
|
||||
|
||||
vfunc_key_focus_in() {
|
||||
super.vfunc_key_focus_in();
|
||||
this.active = true;
|
||||
_onKeyFocusIn(actor) {
|
||||
this.setActive(true);
|
||||
}
|
||||
|
||||
vfunc_key_focus_out() {
|
||||
super.vfunc_key_focus_out();
|
||||
this.active = false;
|
||||
_onKeyFocusOut(actor) {
|
||||
this.setActive(false);
|
||||
}
|
||||
|
||||
_onHoverChanged(actor) {
|
||||
this.setActive(actor.hover);
|
||||
}
|
||||
|
||||
activate(event) {
|
||||
this.emit('activate', event);
|
||||
}
|
||||
|
||||
get active() {
|
||||
return this._active;
|
||||
}
|
||||
|
||||
set active(active) {
|
||||
setActive(active) {
|
||||
let activeChanged = active != this.active;
|
||||
if (activeChanged) {
|
||||
this._active = active;
|
||||
this.active = active;
|
||||
if (active) {
|
||||
this.add_style_class_name('selected');
|
||||
if (this.can_focus)
|
||||
this.grab_key_focus();
|
||||
this.actor.add_style_class_name('selected');
|
||||
if (this.actor.can_focus)
|
||||
this.actor.grab_key_focus();
|
||||
} else {
|
||||
this.remove_style_class_name('selected');
|
||||
this.actor.remove_style_class_name('selected');
|
||||
// Remove the CSS active state if the user press the button and
|
||||
// while holding moves to another menu item, so we don't paint all items.
|
||||
// The correct behaviour would be to set the new item with the CSS
|
||||
// active state as well, but button-press-event is not trigered,
|
||||
// so we should track it in our own, which would involve some work
|
||||
// in the container
|
||||
this.remove_style_pseudo_class('active');
|
||||
this.actor.remove_style_pseudo_class ('active');
|
||||
}
|
||||
this.notify('active');
|
||||
this.emit('active-changed', active);
|
||||
}
|
||||
}
|
||||
|
||||
syncSensitive() {
|
||||
let sensitive = this.sensitive;
|
||||
this.reactive = sensitive;
|
||||
this.can_focus = sensitive;
|
||||
this.notify('sensitive');
|
||||
let sensitive = this.getSensitive();
|
||||
this.actor.reactive = sensitive;
|
||||
this.actor.can_focus = sensitive;
|
||||
this.emit('sensitive-changed');
|
||||
return sensitive;
|
||||
}
|
||||
|
||||
getSensitive() {
|
||||
let parentSensitive = this._parent ? this._parent.sensitive : true;
|
||||
let parentSensitive = this._parent ? this._parent.getSensitive() : true;
|
||||
return this._activatable && this._sensitive && parentSensitive;
|
||||
}
|
||||
|
||||
@@ -227,12 +210,12 @@ var PopupBaseMenuItem = GObject.registerClass({
|
||||
this.syncSensitive();
|
||||
}
|
||||
|
||||
get sensitive() {
|
||||
return this.getSensitive();
|
||||
destroy() {
|
||||
this.actor.destroy();
|
||||
}
|
||||
|
||||
set sensitive(sensitive) {
|
||||
this.setSensitive(sensitive);
|
||||
_onDestroy() {
|
||||
this.emit('destroy');
|
||||
}
|
||||
|
||||
setOrnament(ornament) {
|
||||
@@ -243,38 +226,36 @@ var PopupBaseMenuItem = GObject.registerClass({
|
||||
|
||||
if (ornament == Ornament.DOT) {
|
||||
this._ornamentLabel.text = '\u2022';
|
||||
this.add_accessible_state(Atk.StateType.CHECKED);
|
||||
this.actor.add_accessible_state(Atk.StateType.CHECKED);
|
||||
} else if (ornament == Ornament.CHECK) {
|
||||
this._ornamentLabel.text = '\u2713';
|
||||
this.add_accessible_state(Atk.StateType.CHECKED);
|
||||
this.actor.add_accessible_state(Atk.StateType.CHECKED);
|
||||
} else if (ornament == Ornament.NONE) {
|
||||
this._ornamentLabel.text = '';
|
||||
this.remove_accessible_state(Atk.StateType.CHECKED);
|
||||
this.actor.remove_accessible_state(Atk.StateType.CHECKED);
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
Signals.addSignalMethods(PopupBaseMenuItem.prototype);
|
||||
|
||||
var PopupMenuItem = GObject.registerClass(
|
||||
class PopupMenuItem extends PopupBaseMenuItem {
|
||||
_init(text, params) {
|
||||
super._init(params);
|
||||
var PopupMenuItem = class extends PopupBaseMenuItem {
|
||||
constructor(text, params) {
|
||||
super(params);
|
||||
|
||||
this.label = new St.Label({ text: text });
|
||||
this.add_child(this.label);
|
||||
this.label_actor = this.label
|
||||
this.actor.add_child(this.label);
|
||||
this.actor.label_actor = this.label
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
var PopupSeparatorMenuItem = GObject.registerClass(
|
||||
class PopupSeparatorMenuItem extends PopupBaseMenuItem {
|
||||
_init(text) {
|
||||
super._init({ reactive: false,
|
||||
can_focus: false });
|
||||
var PopupSeparatorMenuItem = class extends PopupBaseMenuItem {
|
||||
constructor(text) {
|
||||
super({ reactive: false,
|
||||
can_focus: false});
|
||||
|
||||
this.label = new St.Label({ text: text || '' });
|
||||
this.add(this.label);
|
||||
this.label_actor = this.label;
|
||||
this.actor.add(this.label);
|
||||
this.actor.label_actor = this.label;
|
||||
|
||||
this.label.connect('notify::text',
|
||||
this._syncVisibility.bind(this));
|
||||
@@ -283,78 +264,81 @@ class PopupSeparatorMenuItem extends PopupBaseMenuItem {
|
||||
this._separator = new St.Widget({ style_class: 'popup-separator-menu-item',
|
||||
y_expand: true,
|
||||
y_align: Clutter.ActorAlign.CENTER });
|
||||
this.add(this._separator, { expand: true });
|
||||
this.actor.add(this._separator, { expand: true });
|
||||
}
|
||||
|
||||
_syncVisibility() {
|
||||
this.label.visible = this.label.text != '';
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
var Switch = GObject.registerClass(
|
||||
class Switch extends St.Bin {
|
||||
_init(state) {
|
||||
super._init({ style_class: 'toggle-switch',
|
||||
accessible_role: Atk.Role.CHECK_BOX,
|
||||
can_focus: true });
|
||||
var Switch = class {
|
||||
constructor(state) {
|
||||
this.actor = new St.Bin({ style_class: 'toggle-switch',
|
||||
accessible_role: Atk.Role.CHECK_BOX,
|
||||
can_focus: true });
|
||||
// Translators: this MUST be either "toggle-switch-us"
|
||||
// (for toggle switches containing the English words
|
||||
// "ON" and "OFF") or "toggle-switch-intl" (for toggle
|
||||
// switches containing "◯" and "|"). Other values will
|
||||
// simply result in invisible toggle switches.
|
||||
this.actor.add_style_class_name(_("toggle-switch-us"));
|
||||
this.setToggleState(state);
|
||||
}
|
||||
|
||||
setToggleState(state) {
|
||||
if (state)
|
||||
this.add_style_pseudo_class('checked');
|
||||
this.actor.add_style_pseudo_class('checked');
|
||||
else
|
||||
this.remove_style_pseudo_class('checked');
|
||||
this.actor.remove_style_pseudo_class('checked');
|
||||
this.state = state;
|
||||
}
|
||||
|
||||
toggle() {
|
||||
this.setToggleState(!this.state);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
var PopupSwitchMenuItem = GObject.registerClass({
|
||||
Signals: { 'toggled': { param_types: [GObject.TYPE_BOOLEAN] }, },
|
||||
},
|
||||
class PopupSwitchMenuItem extends PopupBaseMenuItem {
|
||||
_init(text, active, params) {
|
||||
super._init(params);
|
||||
var PopupSwitchMenuItem = class extends PopupBaseMenuItem {
|
||||
constructor(text, active, params) {
|
||||
super(params);
|
||||
|
||||
this.label = new St.Label({ text: text });
|
||||
this._switch = new Switch(active);
|
||||
|
||||
this.accessible_role = Atk.Role.CHECK_MENU_ITEM;
|
||||
this.actor.accessible_role = Atk.Role.CHECK_MENU_ITEM;
|
||||
this.checkAccessibleState();
|
||||
this.label_actor = this.label;
|
||||
this.actor.label_actor = this.label;
|
||||
|
||||
this.add_child(this.label);
|
||||
this.actor.add_child(this.label);
|
||||
|
||||
this._statusBin = new St.Bin({ x_align: St.Align.END });
|
||||
this.add(this._statusBin, { expand: true, x_align: St.Align.END });
|
||||
this.actor.add(this._statusBin, { expand: true, x_align: St.Align.END });
|
||||
|
||||
this._statusLabel = new St.Label({ text: '',
|
||||
style_class: 'popup-status-menu-item'
|
||||
});
|
||||
this._statusBin.child = this._switch;
|
||||
this._statusBin.child = this._switch.actor;
|
||||
}
|
||||
|
||||
setStatus(text) {
|
||||
if (text != null) {
|
||||
this._statusLabel.text = text;
|
||||
this._statusBin.child = this._statusLabel;
|
||||
this.reactive = false;
|
||||
this.accessible_role = Atk.Role.MENU_ITEM;
|
||||
this.actor.reactive = false;
|
||||
this.actor.accessible_role = Atk.Role.MENU_ITEM;
|
||||
} else {
|
||||
this._statusBin.child = this._switch;
|
||||
this.reactive = true;
|
||||
this.accessible_role = Atk.Role.CHECK_MENU_ITEM;
|
||||
this._statusBin.child = this._switch.actor;
|
||||
this.actor.reactive = true;
|
||||
this.actor.accessible_role = Atk.Role.CHECK_MENU_ITEM;
|
||||
}
|
||||
this.checkAccessibleState();
|
||||
}
|
||||
|
||||
activate(event) {
|
||||
if (this._switch.mapped)
|
||||
if (this._switch.actor.mapped) {
|
||||
this.toggle();
|
||||
}
|
||||
|
||||
// we allow pressing space to toggle the switch
|
||||
// without closing the menu
|
||||
@@ -381,30 +365,29 @@ class PopupSwitchMenuItem extends PopupBaseMenuItem {
|
||||
}
|
||||
|
||||
checkAccessibleState() {
|
||||
switch (this.accessible_role) {
|
||||
switch (this.actor.accessible_role) {
|
||||
case Atk.Role.CHECK_MENU_ITEM:
|
||||
if (this._switch.state)
|
||||
this.add_accessible_state(Atk.StateType.CHECKED);
|
||||
this.actor.add_accessible_state (Atk.StateType.CHECKED);
|
||||
else
|
||||
this.remove_accessible_state(Atk.StateType.CHECKED);
|
||||
this.actor.remove_accessible_state (Atk.StateType.CHECKED);
|
||||
break;
|
||||
default:
|
||||
this.remove_accessible_state(Atk.StateType.CHECKED);
|
||||
this.actor.remove_accessible_state (Atk.StateType.CHECKED);
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
var PopupImageMenuItem = GObject.registerClass(
|
||||
class PopupImageMenuItem extends PopupBaseMenuItem {
|
||||
_init(text, icon, params) {
|
||||
super._init(params);
|
||||
var PopupImageMenuItem = class extends PopupBaseMenuItem {
|
||||
constructor(text, icon, params) {
|
||||
super(params);
|
||||
|
||||
this._icon = new St.Icon({ style_class: 'popup-menu-icon',
|
||||
x_align: Clutter.ActorAlign.END });
|
||||
this.add_child(this._icon);
|
||||
this.actor.add_child(this._icon);
|
||||
this.label = new St.Label({ text: text });
|
||||
this.add_child(this.label);
|
||||
this.label_actor = this.label;
|
||||
this.actor.add_child(this.label);
|
||||
this.actor.label_actor = this.label;
|
||||
|
||||
this.setIcon(icon);
|
||||
}
|
||||
@@ -416,12 +399,12 @@ class PopupImageMenuItem extends PopupBaseMenuItem {
|
||||
else
|
||||
this._icon.icon_name = icon;
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
var PopupMenuBase = class {
|
||||
constructor(sourceActor, styleClass) {
|
||||
if (this.constructor === PopupMenuBase)
|
||||
throw new TypeError(`Cannot instantiate abstract class ${this.constructor.name}`);
|
||||
if (new.target === PopupMenuBase)
|
||||
throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
|
||||
|
||||
this.sourceActor = sourceActor;
|
||||
this._parent = null;
|
||||
@@ -460,21 +443,13 @@ var PopupMenuBase = class {
|
||||
}
|
||||
|
||||
getSensitive() {
|
||||
let parentSensitive = this._parent ? this._parent.sensitive : true;
|
||||
let parentSensitive = this._parent ? this._parent.getSensitive() : true;
|
||||
return this._sensitive && parentSensitive;
|
||||
}
|
||||
|
||||
setSensitive(sensitive) {
|
||||
this._sensitive = sensitive;
|
||||
this.emit('notify::sensitive');
|
||||
}
|
||||
|
||||
get sensitive() {
|
||||
return this.getSensitive();
|
||||
}
|
||||
|
||||
set sensitive(sensitive) {
|
||||
this.setSensitive(sensitive);
|
||||
this.emit('sensitive-changed');
|
||||
}
|
||||
|
||||
_sessionUpdated() {
|
||||
@@ -510,7 +485,7 @@ var PopupMenuBase = class {
|
||||
app.activate();
|
||||
});
|
||||
|
||||
menuItem.visible = Main.sessionMode.allowSettings;
|
||||
menuItem.actor.visible = Main.sessionMode.allowSettings;
|
||||
this._settingsActions[desktopFile] = menuItem;
|
||||
|
||||
return menuItem;
|
||||
@@ -519,7 +494,7 @@ var PopupMenuBase = class {
|
||||
_setSettingsVisibility(visible) {
|
||||
for (let id in this._settingsActions) {
|
||||
let item = this._settingsActions[id];
|
||||
item.visible = visible;
|
||||
item.actor.visible = visible;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -542,17 +517,16 @@ var PopupMenuBase = class {
|
||||
|
||||
_subMenuActiveChanged(submenu, submenuItem) {
|
||||
if (this._activeMenuItem && this._activeMenuItem != submenuItem)
|
||||
this._activeMenuItem.active = false;
|
||||
this._activeMenuItem.setActive(false);
|
||||
this._activeMenuItem = submenuItem;
|
||||
this.emit('active-changed', submenuItem);
|
||||
}
|
||||
|
||||
_connectItemSignals(menuItem) {
|
||||
menuItem._activeChangeId = menuItem.connect('notify::active', (menuItem) => {
|
||||
let active = menuItem.active;
|
||||
menuItem._activeChangeId = menuItem.connect('active-changed', (menuItem, active) => {
|
||||
if (active && this._activeMenuItem != menuItem) {
|
||||
if (this._activeMenuItem)
|
||||
this._activeMenuItem.active = false;
|
||||
this._activeMenuItem.setActive(false);
|
||||
this._activeMenuItem = menuItem;
|
||||
this.emit('active-changed', menuItem);
|
||||
} else if (!active && this._activeMenuItem == menuItem) {
|
||||
@@ -560,8 +534,8 @@ var PopupMenuBase = class {
|
||||
this.emit('active-changed', null);
|
||||
}
|
||||
});
|
||||
menuItem._sensitiveChangeId = menuItem.connect('notify::sensitive', () => {
|
||||
let sensitive = menuItem.sensitive;
|
||||
menuItem._sensitiveChangeId = menuItem.connect('sensitive-changed', () => {
|
||||
let sensitive = menuItem.getSensitive();
|
||||
if (!sensitive && this._activeMenuItem == menuItem) {
|
||||
if (!this.actor.navigate_focus(menuItem.actor,
|
||||
St.DirectionType.TAB_FORWARD,
|
||||
@@ -577,7 +551,7 @@ var PopupMenuBase = class {
|
||||
this.itemActivated(BoxPointer.PopupAnimation.FULL);
|
||||
});
|
||||
|
||||
menuItem._parentSensitiveChangeId = this.connect('notify::sensitive', () => {
|
||||
menuItem._parentSensitiveChangeId = this.connect('sensitive-changed', () => {
|
||||
menuItem.syncSensitive();
|
||||
});
|
||||
|
||||
@@ -629,7 +603,7 @@ var PopupMenuBase = class {
|
||||
return;
|
||||
}
|
||||
|
||||
menuItem.show();
|
||||
menuItem.actor.show();
|
||||
}
|
||||
|
||||
moveMenuItem(menuItem, position) {
|
||||
@@ -676,8 +650,8 @@ var PopupMenuBase = class {
|
||||
let parentClosingId = this.connect('menu-closed', () => {
|
||||
menuItem.emit('menu-closed');
|
||||
});
|
||||
let subMenuSensitiveChangedId = this.connect('notify::sensitive', () => {
|
||||
menuItem.emit('notify::sensitive');
|
||||
let subMenuSensitiveChangedId = this.connect('sensitive-changed', () => {
|
||||
menuItem.emit('sensitive-changed');
|
||||
});
|
||||
|
||||
menuItem.connect('destroy', () => {
|
||||
@@ -883,9 +857,9 @@ var PopupMenu = class extends PopupMenuBase {
|
||||
|
||||
close(animate) {
|
||||
if (this._activeMenuItem)
|
||||
this._activeMenuItem.active = false;
|
||||
this._activeMenuItem.setActive(false);
|
||||
|
||||
if (this._boxPointer.visible) {
|
||||
if (this._boxPointer.actor.visible) {
|
||||
this._boxPointer.close(animate, () => {
|
||||
this.emit('menu-closed');
|
||||
});
|
||||
@@ -916,10 +890,6 @@ var PopupDummyMenu = class {
|
||||
return true;
|
||||
}
|
||||
|
||||
get sensitive() {
|
||||
return this.getSensitive();
|
||||
}
|
||||
|
||||
open() { this.emit('open-state-changed', true); }
|
||||
close() { this.emit('open-state-changed', false); }
|
||||
toggle() {}
|
||||
@@ -959,11 +929,7 @@ var PopupSubMenu = class extends PopupMenuBase {
|
||||
}
|
||||
|
||||
getSensitive() {
|
||||
return this._sensitive && this.sourceActor.sensitive;
|
||||
}
|
||||
|
||||
get sensitive() {
|
||||
return this.getSensitive();
|
||||
return this._sensitive && this.sourceActor._delegate.getSensitive();
|
||||
}
|
||||
|
||||
open(animate) {
|
||||
@@ -1030,7 +996,7 @@ var PopupSubMenu = class extends PopupMenuBase {
|
||||
this.emit('open-state-changed', false);
|
||||
|
||||
if (this._activeMenuItem)
|
||||
this._activeMenuItem.active = false;
|
||||
this._activeMenuItem.setActive(false);
|
||||
|
||||
if (animate && this._needsScrollbar())
|
||||
animate = false;
|
||||
@@ -1062,7 +1028,7 @@ var PopupSubMenu = class extends PopupMenuBase {
|
||||
|
||||
if (this.isOpen && event.get_key_symbol() == Clutter.KEY_Left) {
|
||||
this.close(BoxPointer.PopupAnimation.FULL);
|
||||
this.sourceActor._delegate.active = true;
|
||||
this.sourceActor._delegate.setActive(true);
|
||||
return Clutter.EVENT_STOP;
|
||||
}
|
||||
|
||||
@@ -1093,26 +1059,25 @@ var PopupMenuSection = class extends PopupMenuBase {
|
||||
close() { this.emit('open-state-changed', false); }
|
||||
};
|
||||
|
||||
var PopupSubMenuMenuItem = GObject.registerClass(
|
||||
class PopupSubMenuMenuItem extends PopupBaseMenuItem {
|
||||
_init(text, wantIcon) {
|
||||
super._init();
|
||||
var PopupSubMenuMenuItem = class extends PopupBaseMenuItem {
|
||||
constructor(text, wantIcon) {
|
||||
super();
|
||||
|
||||
this.add_style_class_name('popup-submenu-menu-item');
|
||||
this.actor.add_style_class_name('popup-submenu-menu-item');
|
||||
|
||||
if (wantIcon) {
|
||||
this.icon = new St.Icon({ style_class: 'popup-menu-icon' });
|
||||
this.add_child(this.icon);
|
||||
this.actor.add_child(this.icon);
|
||||
}
|
||||
|
||||
this.label = new St.Label({ text: text,
|
||||
y_expand: true,
|
||||
y_align: Clutter.ActorAlign.CENTER });
|
||||
this.add_child(this.label);
|
||||
this.label_actor = this.label;
|
||||
this.actor.add_child(this.label);
|
||||
this.actor.label_actor = this.label;
|
||||
|
||||
let expander = new St.Bin({ style_class: 'popup-menu-item-expander' });
|
||||
this.add(expander, { expand: true });
|
||||
this.actor.add(expander, { expand: true });
|
||||
|
||||
this._triangle = arrowIcon(St.Side.RIGHT);
|
||||
this._triangle.pivot_point = new Clutter.Point({ x: 0.5, y: 0.6 });
|
||||
@@ -1121,12 +1086,11 @@ class PopupSubMenuMenuItem extends PopupBaseMenuItem {
|
||||
y_align: Clutter.ActorAlign.CENTER });
|
||||
this._triangleBin.add_child(this._triangle);
|
||||
|
||||
this.add_child(this._triangleBin);
|
||||
this.add_accessible_state(Atk.StateType.EXPANDABLE);
|
||||
this.actor.add_child(this._triangleBin);
|
||||
this.actor.add_accessible_state (Atk.StateType.EXPANDABLE);
|
||||
|
||||
this.menu = new PopupSubMenu(this, this._triangle);
|
||||
this.menu = new PopupSubMenu(this.actor, this._triangle);
|
||||
this.menu.connect('open-state-changed', this._subMenuOpenStateChanged.bind(this));
|
||||
this.connect('destroy', () => { this.menu.destroy(); });
|
||||
}
|
||||
|
||||
_setParent(parent) {
|
||||
@@ -1143,18 +1107,24 @@ class PopupSubMenuMenuItem extends PopupBaseMenuItem {
|
||||
|
||||
_subMenuOpenStateChanged(menu, open) {
|
||||
if (open) {
|
||||
this.add_style_pseudo_class('open');
|
||||
this.actor.add_style_pseudo_class('open');
|
||||
this._getTopMenu()._setOpenedSubMenu(this.menu);
|
||||
this.add_accessible_state(Atk.StateType.EXPANDED);
|
||||
this.add_style_pseudo_class('checked');
|
||||
this.actor.add_accessible_state (Atk.StateType.EXPANDED);
|
||||
this.actor.add_style_pseudo_class('checked');
|
||||
} else {
|
||||
this.remove_style_pseudo_class('open');
|
||||
this.actor.remove_style_pseudo_class('open');
|
||||
this._getTopMenu()._setOpenedSubMenu(null);
|
||||
this.remove_accessible_state (Atk.StateType.EXPANDED);
|
||||
this.remove_style_pseudo_class('checked');
|
||||
this.actor.remove_accessible_state (Atk.StateType.EXPANDED);
|
||||
this.actor.remove_style_pseudo_class('checked');
|
||||
}
|
||||
}
|
||||
|
||||
destroy() {
|
||||
this.menu.destroy();
|
||||
|
||||
super.destroy();
|
||||
}
|
||||
|
||||
setSubmenuShown(open) {
|
||||
if (open)
|
||||
this.menu.open(BoxPointer.PopupAnimation.FULL);
|
||||
@@ -1192,7 +1162,7 @@ class PopupSubMenuMenuItem extends PopupBaseMenuItem {
|
||||
_onButtonReleaseEvent(actor) {
|
||||
// Since we override the parent, we need to manage what the parent does
|
||||
// with the active style class
|
||||
this.remove_style_pseudo_class('active');
|
||||
this.actor.remove_style_pseudo_class ('active');
|
||||
this._setOpenState(!this._getOpenState());
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
}
|
||||
@@ -1201,12 +1171,12 @@ class PopupSubMenuMenuItem extends PopupBaseMenuItem {
|
||||
if (event.type() == Clutter.EventType.TOUCH_END) {
|
||||
// Since we override the parent, we need to manage what the parent does
|
||||
// with the active style class
|
||||
this.remove_style_pseudo_class('active');
|
||||
this.actor.remove_style_pseudo_class ('active');
|
||||
this._setOpenState(!this._getOpenState());
|
||||
}
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
/* Basic implementation of a menu manager.
|
||||
* Call addMenu to add menus
|
||||
@@ -1216,7 +1186,7 @@ var PopupMenuManager = class {
|
||||
grabParams = Params.parse(grabParams,
|
||||
{ actionMode: Shell.ActionMode.POPUP });
|
||||
this._owner = owner;
|
||||
this._grabHelper = new GrabHelper.GrabHelper(owner, grabParams);
|
||||
this._grabHelper = new GrabHelper.GrabHelper(owner.actor, grabParams);
|
||||
this._menus = [];
|
||||
}
|
||||
|
||||
|
@@ -810,8 +810,16 @@ var ScreenShield = class {
|
||||
|
||||
this._maybeCancelDialog();
|
||||
|
||||
if (this._longLightbox.actor.visible) {
|
||||
// We're in the process of showing.
|
||||
if (this._longLightbox.actor.visible ||
|
||||
this._isActive) {
|
||||
// We're either shown and active, or in the process of
|
||||
// showing.
|
||||
// The latter is a very unlikely condition (it requires
|
||||
// idle-delay < 20), but in any case we have nothing
|
||||
// to do at this point: either isActive is true, or
|
||||
// it will soon be.
|
||||
// isActive can also be true if the lightbox is hidden,
|
||||
// in case the shield is down and the user hasn't unlocked yet
|
||||
return;
|
||||
}
|
||||
|
||||
|
@@ -1,6 +1,6 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
const { Clutter, Gio, GLib, Meta, Shell, St } = imports.gi;
|
||||
const { Clutter, Gio, GLib, Gtk, Meta, Shell, St } = imports.gi;
|
||||
const Signals = imports.signals;
|
||||
|
||||
const GrabHelper = imports.ui.grabHelper;
|
||||
@@ -227,6 +227,8 @@ var SelectArea = class {
|
||||
this._lastY = 0;
|
||||
this._result = null;
|
||||
|
||||
this._initRubberbandColors();
|
||||
|
||||
this._group = new St.Widget({ visible: false,
|
||||
reactive: true,
|
||||
x: 0,
|
||||
@@ -246,10 +248,10 @@ var SelectArea = class {
|
||||
coordinate: Clutter.BindCoordinate.ALL });
|
||||
this._group.add_constraint(constraint);
|
||||
|
||||
this._rubberband = new St.Widget({
|
||||
style_class: 'select-area-rubberband',
|
||||
visible: false
|
||||
});
|
||||
this._rubberband = new Clutter.Rectangle({ color: this._background,
|
||||
has_border: true,
|
||||
border_width: 1,
|
||||
border_color: this._border });
|
||||
this._group.add_actor(this._rubberband);
|
||||
}
|
||||
|
||||
@@ -263,6 +265,25 @@ var SelectArea = class {
|
||||
this._group.visible = true;
|
||||
}
|
||||
|
||||
_initRubberbandColors() {
|
||||
function colorFromRGBA(rgba) {
|
||||
return new Clutter.Color({ red: rgba.red * 255,
|
||||
green: rgba.green * 255,
|
||||
blue: rgba.blue * 255,
|
||||
alpha: rgba.alpha * 255 });
|
||||
}
|
||||
|
||||
let path = new Gtk.WidgetPath();
|
||||
path.append_type(Gtk.IconView);
|
||||
|
||||
let context = new Gtk.StyleContext();
|
||||
context.set_path(path);
|
||||
context.add_class('rubberband');
|
||||
|
||||
this._background = colorFromRGBA(context.get_background_color(Gtk.StateFlags.NORMAL));
|
||||
this._border = colorFromRGBA(context.get_border_color(Gtk.StateFlags.NORMAL));
|
||||
}
|
||||
|
||||
_getGeometry() {
|
||||
return { x: Math.min(this._startX, this._lastX),
|
||||
y: Math.min(this._startY, this._lastY),
|
||||
@@ -281,7 +302,6 @@ var SelectArea = class {
|
||||
|
||||
this._rubberband.set_position(geometry.x, geometry.y);
|
||||
this._rubberband.set_size(geometry.width, geometry.height);
|
||||
this._rubberband.show();
|
||||
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
}
|
||||
|
@@ -37,13 +37,16 @@ const { loadInterfaceXML } = imports.misc.fileUtils;
|
||||
* 'yield Scripting.sleep(500);'
|
||||
*/
|
||||
function sleep(milliseconds) {
|
||||
return new Promise(resolve => {
|
||||
let id = Mainloop.timeout_add(milliseconds, () => {
|
||||
resolve();
|
||||
return GLib.SOURCE_REMOVE;
|
||||
});
|
||||
GLib.Source.set_name_by_id(id, '[gnome-shell] sleep');
|
||||
let cb;
|
||||
|
||||
let id = Mainloop.timeout_add(milliseconds, () => {
|
||||
if (cb)
|
||||
cb();
|
||||
return GLib.SOURCE_REMOVE;
|
||||
});
|
||||
GLib.Source.set_name_by_id(id, '[gnome-shell] sleep');
|
||||
|
||||
return callback => { cb = callback; };
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -54,9 +57,14 @@ function sleep(milliseconds) {
|
||||
* 'yield Scripting.waitLeisure();'
|
||||
*/
|
||||
function waitLeisure() {
|
||||
return new Promise(resolve => {
|
||||
global.run_at_leisure(resolve);
|
||||
let cb;
|
||||
|
||||
global.run_at_leisure(() => {
|
||||
if (cb)
|
||||
cb();
|
||||
});
|
||||
|
||||
return callback => { cb = callback; };
|
||||
}
|
||||
|
||||
const PerfHelperIface = loadInterfaceXML('org.gnome.Shell.PerfHelper');
|
||||
@@ -74,16 +82,25 @@ function _getPerfHelper() {
|
||||
}
|
||||
|
||||
function _callRemote(obj, method, ...args) {
|
||||
return new Promise((resolve, reject) => {
|
||||
args.push((result, excp) => {
|
||||
if (excp)
|
||||
reject(excp);
|
||||
else
|
||||
resolve();
|
||||
});
|
||||
let cb;
|
||||
let errcb;
|
||||
|
||||
method.apply(obj, args);
|
||||
args.push((result, excp) => {
|
||||
if (excp) {
|
||||
if (errcb)
|
||||
errcb(excp);
|
||||
} else {
|
||||
if (cb)
|
||||
cb();
|
||||
}
|
||||
});
|
||||
|
||||
method.apply(obj, args);
|
||||
|
||||
return (callback, error_callback) => {
|
||||
cb = callback;
|
||||
errcb = error_callback;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -175,6 +192,27 @@ function collectStatistics() {
|
||||
Shell.PerfLog.get_default().collect_statistics();
|
||||
}
|
||||
|
||||
function _step(g, finish, onError) {
|
||||
try {
|
||||
let waitFunction = g.next();
|
||||
waitFunction(() => {
|
||||
_step(g, finish, onError);
|
||||
},
|
||||
err => {
|
||||
if (onError)
|
||||
onError(err);
|
||||
});
|
||||
} catch (err) {
|
||||
if (err instanceof StopIteration) {
|
||||
if (finish)
|
||||
finish();
|
||||
} else {
|
||||
if (onError)
|
||||
onError(err);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function _collect(scriptModule, outputFile) {
|
||||
let eventHandlers = {};
|
||||
|
||||
@@ -310,23 +348,23 @@ function _collect(scriptModule, outputFile) {
|
||||
* After running the script and collecting statistics from the
|
||||
* event log, GNOME Shell will exit.
|
||||
**/
|
||||
async function runPerfScript(scriptModule, outputFile) {
|
||||
function runPerfScript(scriptModule, outputFile) {
|
||||
Shell.PerfLog.get_default().set_enabled(true);
|
||||
|
||||
for (let step of scriptModule.run()) {
|
||||
try {
|
||||
await step;
|
||||
} catch (err) {
|
||||
log(`Script failed: ${err}\n${err.stack}`);
|
||||
Meta.exit(Meta.ExitCode.ERROR);
|
||||
}
|
||||
}
|
||||
let g = scriptModule.run();
|
||||
|
||||
try {
|
||||
_collect(scriptModule, outputFile);
|
||||
} catch (err) {
|
||||
log(`Script failed: ${err}\n${err.stack}`);
|
||||
Meta.exit(Meta.ExitCode.ERROR);
|
||||
}
|
||||
Meta.exit(Meta.ExitCode.SUCCESS);
|
||||
_step(g,
|
||||
() => {
|
||||
try {
|
||||
_collect(scriptModule, outputFile);
|
||||
} catch (err) {
|
||||
log("Script failed: " + err + "\n" + err.stack);
|
||||
Meta.exit(Meta.ExitCode.ERROR);
|
||||
}
|
||||
Meta.exit(Meta.ExitCode.SUCCESS);
|
||||
},
|
||||
err => {
|
||||
log("Script failed: " + err + "\n" + err.stack);
|
||||
Meta.exit(Meta.ExitCode.ERROR);
|
||||
});
|
||||
}
|
||||
|
@@ -92,9 +92,11 @@ const _modes = {
|
||||
unlockDialog: imports.ui.unlockDialog.UnlockDialog,
|
||||
components: Config.HAVE_NETWORKMANAGER ?
|
||||
['networkAgent', 'polkitAgent', 'telepathyClient',
|
||||
'keyring', 'autorunManager', 'automountManager'] :
|
||||
'keyring', 'autorunManager', 'automountManager',
|
||||
'updates'] :
|
||||
['polkitAgent', 'telepathyClient',
|
||||
'keyring', 'autorunManager', 'automountManager'],
|
||||
'keyring', 'autorunManager', 'automountManager',
|
||||
'updates'],
|
||||
|
||||
panel: {
|
||||
left: ['activities', 'appMenu'],
|
||||
|
@@ -79,17 +79,14 @@ var GnomeShell = class {
|
||||
for (let param in params)
|
||||
params[param] = params[param].deep_unpack();
|
||||
|
||||
let { connector,
|
||||
let { monitor: monitorIndex,
|
||||
label,
|
||||
level,
|
||||
max_level: maxLevel,
|
||||
icon: serializedIcon } = params;
|
||||
|
||||
let monitorIndex = -1;
|
||||
if (connector) {
|
||||
let monitorManager = Meta.MonitorManager.get();
|
||||
monitorIndex = monitorManager.get_monitor_for_connector(connector);
|
||||
}
|
||||
if (monitorIndex === undefined)
|
||||
monitorIndex = -1;
|
||||
|
||||
let icon = null;
|
||||
if (serializedIcon)
|
||||
@@ -206,12 +203,18 @@ var GnomeShell = class {
|
||||
this._grabbers.delete(name);
|
||||
}
|
||||
|
||||
ShowMonitorLabels2Async(params, invocation) {
|
||||
ShowMonitorLabelsAsync(params, invocation) {
|
||||
let sender = invocation.get_sender();
|
||||
let [dict] = params;
|
||||
Main.osdMonitorLabeler.show(sender, dict);
|
||||
}
|
||||
|
||||
ShowMonitorLabels2Async(params, invocation) {
|
||||
let sender = invocation.get_sender();
|
||||
let [dict] = params;
|
||||
Main.osdMonitorLabeler.show2(sender, dict);
|
||||
}
|
||||
|
||||
HideMonitorLabelsAsync(params, invocation) {
|
||||
let sender = invocation.get_sender();
|
||||
Main.osdMonitorLabeler.hide(sender);
|
||||
|
@@ -148,7 +148,7 @@ function addContextMenu(entry, params) {
|
||||
|
||||
entry.menu = new EntryMenu(entry);
|
||||
entry.menu.isPassword = params.isPassword;
|
||||
entry._menuManager = new PopupMenu.PopupMenuManager(entry,
|
||||
entry._menuManager = new PopupMenu.PopupMenuManager({ actor: entry },
|
||||
{ actionMode: params.actionMode });
|
||||
entry._menuManager.addMenu(entry.menu);
|
||||
|
||||
|
@@ -3,7 +3,6 @@
|
||||
const { Clutter, Gio, GLib, Pango, Shell, St } = imports.gi;
|
||||
const Signals = imports.signals;
|
||||
|
||||
const Animation = imports.ui.animation;
|
||||
const CheckBox = imports.ui.checkBox;
|
||||
const Dialog = imports.ui.dialog;
|
||||
const Main = imports.ui.main;
|
||||
@@ -15,7 +14,6 @@ const ShellEntry = imports.ui.shellEntry;
|
||||
const { loadInterfaceXML } = imports.misc.fileUtils;
|
||||
|
||||
var LIST_ITEM_ICON_SIZE = 48;
|
||||
var WORK_SPINNER_ICON_SIZE = 16;
|
||||
|
||||
const REMEMBER_MOUNT_PASSWORD_KEY = 'remember-mount-password';
|
||||
|
||||
@@ -150,7 +148,7 @@ var ShellMountOperation = class {
|
||||
}
|
||||
|
||||
this._dialogId = this._dialog.connect('response',
|
||||
(object, choice, password, remember, hiddenVolume, systemVolume, pim) => {
|
||||
(object, choice, password, remember) => {
|
||||
if (choice == -1) {
|
||||
this.mountOp.reply(Gio.MountOperationResult.ABORTED);
|
||||
} else {
|
||||
@@ -160,9 +158,6 @@ var ShellMountOperation = class {
|
||||
this.mountOp.set_password_save(Gio.PasswordSave.NEVER);
|
||||
|
||||
this.mountOp.set_password(password);
|
||||
this.mountOp.set_is_tcrypt_hidden_volume(hiddenVolume);
|
||||
this.mountOp.set_is_tcrypt_system_volume(systemVolume);
|
||||
this.mountOp.set_pim(pim);
|
||||
this.mountOp.reply(Gio.MountOperationResult.HANDLED);
|
||||
}
|
||||
});
|
||||
@@ -291,91 +286,24 @@ var ShellMountPasswordDialog = class extends ModalDialog.ModalDialog {
|
||||
let body = strings.shift() || null;
|
||||
super({ styleClass: 'prompt-dialog' });
|
||||
|
||||
let disksApp = Shell.AppSystem.get_default().lookup_app('org.gnome.DiskUtility.desktop');
|
||||
|
||||
let content = new Dialog.MessageDialogContent({ icon, title, body });
|
||||
this.contentLayout.add_actor(content);
|
||||
content._body.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
||||
|
||||
let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL });
|
||||
let grid = new St.Widget({ style_class: 'prompt-dialog-grid',
|
||||
layout_manager: layout });
|
||||
layout.hookup_style(grid);
|
||||
let rtl = grid.get_text_direction() === Clutter.TextDirection.RTL;
|
||||
this._passwordBox = new St.BoxLayout({ vertical: false, style_class: 'prompt-dialog-password-box' });
|
||||
content.messageBox.add(this._passwordBox);
|
||||
|
||||
if (flags & Gio.AskPasswordFlags.TCRYPT) {
|
||||
this._keyfilesLabel = new St.Label(({ style_class: 'prompt-dialog-keyfiles-label',
|
||||
visible: false }));
|
||||
this._passwordLabel = new St.Label(({ style_class: 'prompt-dialog-password-label',
|
||||
text: _("Password") }));
|
||||
this._passwordBox.add(this._passwordLabel, { y_fill: false, y_align: St.Align.MIDDLE });
|
||||
|
||||
this._hiddenVolume = new CheckBox.CheckBox(_("Hidden Volume"));
|
||||
content.messageBox.add(this._hiddenVolume.actor);
|
||||
|
||||
this._systemVolume = new CheckBox.CheckBox(_("Windows System Volume"));
|
||||
content.messageBox.add(this._systemVolume.actor);
|
||||
|
||||
this._keyfilesCheckbox = new CheckBox.CheckBox(_("Uses Keyfiles"));
|
||||
this._keyfilesCheckbox.actor.connect("clicked", this._onKeyfilesCheckboxClicked.bind(this));
|
||||
content.messageBox.add(this._keyfilesCheckbox.actor);
|
||||
|
||||
this._keyfilesLabel.clutter_text.set_markup(
|
||||
/* Translators: %s is the Disks application */
|
||||
_("To unlock a volume that uses keyfiles, use the <i>%s</i> utility instead.").format(disksApp.get_name())
|
||||
);
|
||||
this._keyfilesLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
||||
this._keyfilesLabel.clutter_text.line_wrap = true;
|
||||
content.messageBox.add(this._keyfilesLabel, { y_fill: false, y_align: St.Align.MIDDLE, expand: true });
|
||||
|
||||
this._pimLabel = new St.Label({ style_class: 'prompt-dialog-password-label',
|
||||
text: _("PIM Number"),
|
||||
y_align: Clutter.ActorAlign.CENTER });
|
||||
this._pimEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
|
||||
can_focus: true,
|
||||
x_expand: true });
|
||||
this._pimEntry.clutter_text.connect('activate', this._onEntryActivate.bind(this));
|
||||
this._pimEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE
|
||||
ShellEntry.addContextMenu(this._pimEntry, { isPassword: true });
|
||||
|
||||
if (rtl) {
|
||||
layout.attach(this._pimEntry, 0, 0, 1, 1);
|
||||
layout.attach(this._pimLabel, 1, 0, 1, 1);
|
||||
} else {
|
||||
layout.attach(this._pimLabel, 0, 0, 1, 1);
|
||||
layout.attach(this._pimEntry, 1, 0, 1, 1);
|
||||
}
|
||||
|
||||
this._pimErrorMessageLabel = new St.Label({ style_class: 'prompt-dialog-password-entry',
|
||||
text: _("The PIM must be a number or empty."),
|
||||
visible: false });
|
||||
layout.attach(this._pimErrorMessageLabel, 0, 2, 2, 1);
|
||||
} else {
|
||||
this._hiddenVolume = null;
|
||||
this._systemVolume = null;
|
||||
this._pimEntry = null;
|
||||
this._pimErrorMessageLabel = null;
|
||||
}
|
||||
|
||||
this._passwordLabel = new St.Label({ style_class: 'prompt-dialog-password-label',
|
||||
text: _("Password"),
|
||||
y_align: Clutter.ActorAlign.CENTER });
|
||||
this._passwordEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
|
||||
can_focus: true,
|
||||
x_expand: true });
|
||||
text: "",
|
||||
can_focus: true});
|
||||
ShellEntry.addContextMenu(this._passwordEntry, { isPassword: true });
|
||||
this._passwordEntry.clutter_text.connect('activate', this._onEntryActivate.bind(this));
|
||||
this._passwordEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE
|
||||
ShellEntry.addContextMenu(this._passwordEntry, { isPassword: true });
|
||||
this._passwordBox.add(this._passwordEntry, {expand: true });
|
||||
this.setInitialKeyFocus(this._passwordEntry);
|
||||
this._workSpinner = new Animation.Spinner(WORK_SPINNER_ICON_SIZE, true);
|
||||
this._passwordEntry.secondary_icon = this._workSpinner.actor;
|
||||
|
||||
if (rtl) {
|
||||
layout.attach(this._passwordEntry, 0, 1, 1, 1);
|
||||
layout.attach(this._passwordLabel, 1, 1, 1, 1);
|
||||
} else {
|
||||
layout.attach(this._passwordLabel, 0, 1, 1, 1);
|
||||
layout.attach(this._passwordEntry, 1, 1, 1, 1);
|
||||
}
|
||||
|
||||
content.messageBox.add(grid);
|
||||
|
||||
this._errorMessageLabel = new St.Label({ style_class: 'prompt-dialog-error-label',
|
||||
text: _("Sorry, that didn’t work. Please try again.") });
|
||||
@@ -385,7 +313,8 @@ var ShellMountPasswordDialog = class extends ModalDialog.ModalDialog {
|
||||
content.messageBox.add(this._errorMessageLabel);
|
||||
|
||||
if (flags & Gio.AskPasswordFlags.SAVING_SUPPORTED) {
|
||||
this._rememberChoice = new CheckBox.CheckBox(_("Remember Password"));
|
||||
this._rememberChoice = new CheckBox.CheckBox();
|
||||
this._rememberChoice.getLabelActor().text = _("Remember Password");
|
||||
this._rememberChoice.actor.checked =
|
||||
global.settings.get_boolean(REMEMBER_MOUNT_PASSWORD_KEY);
|
||||
content.messageBox.add(this._rememberChoice.actor);
|
||||
@@ -393,32 +322,21 @@ var ShellMountPasswordDialog = class extends ModalDialog.ModalDialog {
|
||||
this._rememberChoice = null;
|
||||
}
|
||||
|
||||
this._defaultButtons = [{ label: _("Cancel"),
|
||||
action: this._onCancelButton.bind(this),
|
||||
key: Clutter.Escape
|
||||
},
|
||||
{ label: _("Unlock"),
|
||||
action: this._onUnlockButton.bind(this),
|
||||
default: true
|
||||
}];
|
||||
let buttons = [{ label: _("Cancel"),
|
||||
action: this._onCancelButton.bind(this),
|
||||
key: Clutter.Escape
|
||||
},
|
||||
{ label: _("Unlock"),
|
||||
action: this._onUnlockButton.bind(this),
|
||||
default: true
|
||||
}];
|
||||
|
||||
this._usesKeyfilesButtons = [{ label: _("Cancel"),
|
||||
action: this._onCancelButton.bind(this),
|
||||
key: Clutter.Escape
|
||||
},
|
||||
{ /* Translators: %s is the Disks application */
|
||||
label: _("Open %s").format(disksApp.get_name()),
|
||||
action: this._onOpenDisksButton.bind(this),
|
||||
default: true
|
||||
}];
|
||||
|
||||
this.setButtons(this._defaultButtons);
|
||||
this.setButtons(buttons);
|
||||
}
|
||||
|
||||
reaskPassword() {
|
||||
this._passwordEntry.set_text('');
|
||||
this._errorMessageLabel.show();
|
||||
this._workSpinner.stop();
|
||||
}
|
||||
|
||||
_onCancelButton() {
|
||||
@@ -430,60 +348,12 @@ var ShellMountPasswordDialog = class extends ModalDialog.ModalDialog {
|
||||
}
|
||||
|
||||
_onEntryActivate() {
|
||||
let pim = 0;
|
||||
if (this._pimEntry !== null)
|
||||
pim = this._pimEntry.get_text();
|
||||
if (isNaN(pim)) {
|
||||
this._pimEntry.set_text('');
|
||||
this._pimErrorMessageLabel.show();
|
||||
return;
|
||||
} else if (this._pimErrorMessageLabel !== null) {
|
||||
this._pimErrorMessageLabel.hide();
|
||||
}
|
||||
|
||||
global.settings.set_boolean(REMEMBER_MOUNT_PASSWORD_KEY,
|
||||
this._rememberChoice && this._rememberChoice.actor.checked);
|
||||
|
||||
this._workSpinner.play();
|
||||
this.emit('response', 1,
|
||||
this._passwordEntry.get_text(),
|
||||
this._rememberChoice &&
|
||||
this._rememberChoice.actor.checked,
|
||||
this._hiddenVolume &&
|
||||
this._hiddenVolume.actor.checked,
|
||||
this._systemVolume &&
|
||||
this._systemVolume.actor.checked,
|
||||
pim);
|
||||
}
|
||||
|
||||
_onKeyfilesCheckboxClicked() {
|
||||
let useKeyfiles = this._keyfilesCheckbox.actor.checked;
|
||||
this._passwordEntry.reactive = !useKeyfiles;
|
||||
this._passwordEntry.can_focus = !useKeyfiles;
|
||||
this._passwordEntry.clutter_text.editable = !useKeyfiles;
|
||||
this._passwordEntry.clutter_text.selectable = !useKeyfiles;
|
||||
this._pimEntry.reactive = !useKeyfiles;
|
||||
this._pimEntry.can_focus = !useKeyfiles;
|
||||
this._pimEntry.clutter_text.editable = !useKeyfiles;
|
||||
this._pimEntry.clutter_text.selectable = !useKeyfiles;
|
||||
this._rememberChoice.actor.reactive = !useKeyfiles;
|
||||
this._rememberChoice.actor.can_focus = !useKeyfiles;
|
||||
this._keyfilesLabel.visible = useKeyfiles;
|
||||
this.setButtons(useKeyfiles ? this._usesKeyfilesButtons : this._defaultButtons);
|
||||
}
|
||||
|
||||
_onOpenDisksButton() {
|
||||
let app = Shell.AppSystem.get_default().lookup_app('org.gnome.DiskUtility.desktop');
|
||||
if (app)
|
||||
app.activate();
|
||||
else
|
||||
Main.notifyError(
|
||||
/* Translators: %s is the Disks application */
|
||||
_("Unable to start %s").format(app.get_name()),
|
||||
/* Translators: %s is the Disks application */
|
||||
_("Couldn't find the %s application").format(app.get_name())
|
||||
);
|
||||
this._onCancelButton();
|
||||
this._rememberChoice.actor.checked);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -645,7 +515,7 @@ var GnomeShellMountOpHandler = class {
|
||||
|
||||
this._dialog = new ShellMountPasswordDialog(message, this._createGIcon(iconName), flags);
|
||||
this._dialog.connect('response',
|
||||
(object, choice, password, remember, hiddenVolume, systemVolume, pim) => {
|
||||
(object, choice, password, remember) => {
|
||||
let details = {};
|
||||
let response;
|
||||
|
||||
@@ -657,9 +527,6 @@ var GnomeShellMountOpHandler = class {
|
||||
let passSave = remember ? Gio.PasswordSave.PERMANENTLY : Gio.PasswordSave.NEVER;
|
||||
details['password_save'] = GLib.Variant.new('u', passSave);
|
||||
details['password'] = GLib.Variant.new('s', password);
|
||||
details['hidden_volume'] = GLib.Variant.new('b', hiddenVolume);
|
||||
details['system_volume'] = GLib.Variant.new('b', systemVolume);
|
||||
details['pim'] = GLib.Variant.new('u', parseInt(pim));
|
||||
}
|
||||
|
||||
this._clearCurrentRequest(response, details);
|
||||
|
@@ -39,7 +39,7 @@ class ATIndicator extends PanelMenu.Button {
|
||||
icon_name: 'preferences-desktop-accessibility-symbolic' }));
|
||||
this._hbox.add_child(PopupMenu.arrowIcon(St.Side.BOTTOM));
|
||||
|
||||
this.add_child(this._hbox);
|
||||
this.actor.add_child(this._hbox);
|
||||
|
||||
this._a11ySettings = new Gio.Settings({ schema_id: A11Y_SCHEMA });
|
||||
this._a11ySettings.connect('changed::' + KEY_ALWAYS_SHOW, this._queueSyncMenuVisibility.bind(this));
|
||||
@@ -86,7 +86,7 @@ class ATIndicator extends PanelMenu.Button {
|
||||
let alwaysShow = this._a11ySettings.get_boolean(KEY_ALWAYS_SHOW);
|
||||
let items = this.menu._getMenuItems();
|
||||
|
||||
this.visible = alwaysShow || items.some(f => !!f.state);
|
||||
this.actor.visible = alwaysShow || items.some(f => !!f.state);
|
||||
|
||||
return GLib.SOURCE_REMOVE;
|
||||
}
|
||||
@@ -112,22 +112,38 @@ class ATIndicator extends PanelMenu.Button {
|
||||
|
||||
_buildItem(string, schema, key) {
|
||||
let settings = new Gio.Settings({ schema_id: schema });
|
||||
let widget = this._buildItemExtended(string,
|
||||
settings.get_boolean(key),
|
||||
settings.is_writable(key),
|
||||
enabled => settings.set_boolean(key, enabled));
|
||||
|
||||
settings.connect('changed::' + key, () => {
|
||||
settings.connect('changed::'+key, () => {
|
||||
widget.setToggleState(settings.get_boolean(key));
|
||||
|
||||
this._queueSyncMenuVisibility();
|
||||
});
|
||||
|
||||
let widget = this._buildItemExtended(string,
|
||||
settings.get_boolean(key),
|
||||
settings.is_writable(key),
|
||||
enabled => settings.set_boolean(key, enabled));
|
||||
return widget;
|
||||
}
|
||||
|
||||
_buildHCItem() {
|
||||
let interfaceSettings = new Gio.Settings({ schema_id: DESKTOP_INTERFACE_SCHEMA });
|
||||
interfaceSettings.connect('changed::' + KEY_GTK_THEME, () => {
|
||||
let value = interfaceSettings.get_string(KEY_GTK_THEME);
|
||||
if (value == HIGH_CONTRAST_THEME) {
|
||||
highContrast.setToggleState(true);
|
||||
} else {
|
||||
highContrast.setToggleState(false);
|
||||
gtkTheme = value;
|
||||
}
|
||||
|
||||
this._queueSyncMenuVisibility();
|
||||
});
|
||||
interfaceSettings.connect('changed::' + KEY_ICON_THEME, () => {
|
||||
let value = interfaceSettings.get_string(KEY_ICON_THEME);
|
||||
if (value != HIGH_CONTRAST_THEME)
|
||||
iconTheme = value;
|
||||
});
|
||||
|
||||
let gtkTheme = interfaceSettings.get_string(KEY_GTK_THEME);
|
||||
let iconTheme = interfaceSettings.get_string(KEY_ICON_THEME);
|
||||
let hasHC = (gtkTheme == HIGH_CONTRAST_THEME);
|
||||
@@ -148,30 +164,19 @@ class ATIndicator extends PanelMenu.Button {
|
||||
interfaceSettings.reset(KEY_ICON_THEME);
|
||||
}
|
||||
});
|
||||
|
||||
interfaceSettings.connect('changed::' + KEY_GTK_THEME, () => {
|
||||
let value = interfaceSettings.get_string(KEY_GTK_THEME);
|
||||
if (value == HIGH_CONTRAST_THEME) {
|
||||
highContrast.setToggleState(true);
|
||||
} else {
|
||||
highContrast.setToggleState(false);
|
||||
gtkTheme = value;
|
||||
}
|
||||
|
||||
this._queueSyncMenuVisibility();
|
||||
});
|
||||
|
||||
interfaceSettings.connect('changed::' + KEY_ICON_THEME, () => {
|
||||
let value = interfaceSettings.get_string(KEY_ICON_THEME);
|
||||
if (value != HIGH_CONTRAST_THEME)
|
||||
iconTheme = value;
|
||||
});
|
||||
|
||||
return highContrast;
|
||||
}
|
||||
|
||||
_buildFontItem() {
|
||||
let settings = new Gio.Settings({ schema_id: DESKTOP_INTERFACE_SCHEMA });
|
||||
settings.connect('changed::' + KEY_TEXT_SCALING_FACTOR, () => {
|
||||
let factor = settings.get_double(KEY_TEXT_SCALING_FACTOR);
|
||||
let active = (factor > 1.0);
|
||||
widget.setToggleState(active);
|
||||
|
||||
this._queueSyncMenuVisibility();
|
||||
});
|
||||
|
||||
let factor = settings.get_double(KEY_TEXT_SCALING_FACTOR);
|
||||
let initial_setting = (factor > 1.0);
|
||||
let widget = this._buildItemExtended(_("Large Text"),
|
||||
@@ -184,15 +189,6 @@ class ATIndicator extends PanelMenu.Button {
|
||||
else
|
||||
settings.reset(KEY_TEXT_SCALING_FACTOR);
|
||||
});
|
||||
|
||||
settings.connect('changed::' + KEY_TEXT_SCALING_FACTOR, () => {
|
||||
let factor = settings.get_double(KEY_TEXT_SCALING_FACTOR);
|
||||
let active = (factor > 1.0);
|
||||
widget.setToggleState(active);
|
||||
|
||||
this._queueSyncMenuVisibility();
|
||||
});
|
||||
|
||||
return widget;
|
||||
}
|
||||
});
|
||||
|
144
js/ui/status/automaticUpdates.js
Normal file
@@ -0,0 +1,144 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
//
|
||||
// Copyright (C) 2018 Endless Mobile, Inc.
|
||||
//
|
||||
// This is a GNOME Shell component to wrap the interactions over
|
||||
// D-Bus with the Mogwai system daemon.
|
||||
//
|
||||
// Licensed under the GNU General Public License Version 2
|
||||
//
|
||||
// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
const { Gio, GLib, Shell, St } = imports.gi;
|
||||
|
||||
const UpdateManager = imports.misc.updateManager;
|
||||
|
||||
const Main = imports.ui.main;
|
||||
const MessageTray = imports.ui.messageTray;
|
||||
const PanelMenu = imports.ui.panelMenu;
|
||||
const PopupMenu = imports.ui.popupMenu;
|
||||
|
||||
const NM_SETTING_AUTOMATIC_UPDATES_NOTIFICATION_TIME = "connection.automatic-updates-notification-time";
|
||||
const NM_SETTING_ALLOW_DOWNLOADS = 'connection.allow-downloads';
|
||||
const NM_SETTING_TARIFF_ENABLED = "connection.tariff-enabled";
|
||||
|
||||
const SchedulerInterface = '\
|
||||
<node> \
|
||||
<interface name="com.endlessm.DownloadManager1.Scheduler"> \
|
||||
<property name="ActiveEntryCount" type="u" access="read" /> \
|
||||
<property name="EntryCount" type="u" access="read" /> \
|
||||
</interface> \
|
||||
</node>';
|
||||
|
||||
const SchedulerProxy = Gio.DBusProxy.makeProxyWrapper(SchedulerInterface);
|
||||
|
||||
var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
constructor() {
|
||||
super();
|
||||
|
||||
this._indicator = this._addIndicator();
|
||||
this._indicator.visible = false;
|
||||
|
||||
this._item = new PopupMenu.PopupSubMenuMenuItem("", true);
|
||||
this._toggleItem = this._item.menu.addAction("", this._toggleAutomaticUpdates.bind(this));
|
||||
this._item.menu.addAction(_("Updates Queue"), () => {
|
||||
let params = new GLib.Variant('(sava{sv})', [ 'set-mode', [ new GLib.Variant('s', 'updates') ], {} ]);
|
||||
Gio.DBus.session.call('org.gnome.Software',
|
||||
'/org/gnome/Software',
|
||||
'org.gtk.Actions',
|
||||
'Activate',
|
||||
params,
|
||||
null,
|
||||
Gio.DBusCallFlags.NONE,
|
||||
5000,
|
||||
null,
|
||||
(conn, result) => {
|
||||
try {
|
||||
conn.call_finish(result);
|
||||
} catch (e) {
|
||||
logError(e, 'Failed to start gnome-software');
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
this._item.menu.addSettingsAction(_("Set a Schedule"), 'gnome-updates-panel.desktop');
|
||||
this.menu.addMenuItem(this._item);
|
||||
|
||||
this._manager = UpdateManager.getUpdateManager();
|
||||
this._manager.connect('notify::state', this._updateState.bind(this));
|
||||
|
||||
this._updateState();
|
||||
}
|
||||
|
||||
_updateState() {
|
||||
this._updateStatus();
|
||||
}
|
||||
|
||||
_sessionUpdated() {
|
||||
let sensitive = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter;
|
||||
this.menu.setSensitive(sensitive);
|
||||
}
|
||||
|
||||
_updateStatus() {
|
||||
// Toggle item name
|
||||
this._updateItem();
|
||||
|
||||
// Icons
|
||||
let icon = this._getIcon()
|
||||
|
||||
this._item.icon.gicon = icon;
|
||||
this._indicator.gicon = icon;
|
||||
|
||||
// Only show the Automatic Updates icon at the bottom bar when it is
|
||||
// both enabled, and there are updates being downloaded or installed.
|
||||
this._updateVisibility();
|
||||
|
||||
// The status label
|
||||
this._item.label.text = _("Automatic Updates");
|
||||
}
|
||||
|
||||
_updateItem() {
|
||||
let state = this._manager.state;
|
||||
|
||||
if (state == UpdateManager.State.DISABLED)
|
||||
this._toggleItem.label.text = _("Turn On");
|
||||
else
|
||||
this._toggleItem.label.text = _("Turn Off");
|
||||
}
|
||||
|
||||
_toggleAutomaticUpdates() {
|
||||
this._manager.toggleAutomaticUpdates();
|
||||
}
|
||||
|
||||
_getIcon() {
|
||||
let state = this._manager.state;
|
||||
let iconName = UpdateManager.stateToIconName(state);
|
||||
|
||||
if (!iconName)
|
||||
return null;
|
||||
|
||||
let iconFile = Gio.File.new_for_uri(iconName);
|
||||
let gicon = new Gio.FileIcon({ file: iconFile });
|
||||
|
||||
return gicon;
|
||||
}
|
||||
|
||||
_updateVisibility() {
|
||||
let state = this._manager.state;
|
||||
|
||||
this._item.actor.visible = (state != UpdateManager.State.DISCONNECTED);
|
||||
this._indicator.visible = (state == UpdateManager.State.DOWNLOADING);
|
||||
}
|
||||
};
|
@@ -118,9 +118,9 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
// Remember if there were setup devices and show the menu
|
||||
// if we've seen setup devices and we're not hard blocked
|
||||
if (nDevices > 0)
|
||||
this._item.visible = !this._proxy.BluetoothHardwareAirplaneMode;
|
||||
this._item.actor.visible = !this._proxy.BluetoothHardwareAirplaneMode;
|
||||
else
|
||||
this._item.visible = this._proxy.BluetoothHasAirplaneMode && !this._proxy.BluetoothAirplaneMode;
|
||||
this._item.actor.visible = this._proxy.BluetoothHasAirplaneMode && !this._proxy.BluetoothAirplaneMode;
|
||||
|
||||
if (nConnectedDevices > 0)
|
||||
/* Translators: this is the number of connected bluetooth devices */
|
||||
|
@@ -37,12 +37,12 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
|
||||
let icon = new St.Icon({ icon_name: 'display-brightness-symbolic',
|
||||
style_class: 'popup-menu-icon' });
|
||||
this._item.add(icon);
|
||||
this._item.add(this._slider.actor, { expand: true });
|
||||
this._item.connect('button-press-event', (actor, event) => {
|
||||
this._item.actor.add(icon);
|
||||
this._item.actor.add(this._slider.actor, { expand: true });
|
||||
this._item.actor.connect('button-press-event', (actor, event) => {
|
||||
return this._slider.startDragging(event);
|
||||
});
|
||||
this._item.connect('key-press-event', (actor, event) => {
|
||||
this._item.actor.connect('key-press-event', (actor, event) => {
|
||||
return this._slider.onKeyPressEvent(actor, event);
|
||||
});
|
||||
|
||||
@@ -55,7 +55,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
|
||||
_sync() {
|
||||
let visible = this._proxy.Brightness >= 0;
|
||||
this._item.visible = visible;
|
||||
this._item.actor.visible = visible;
|
||||
if (visible)
|
||||
this._slider.setValue(this._proxy.Brightness / 100.0);
|
||||
}
|
||||
|
@@ -15,18 +15,17 @@ const Util = imports.misc.util;
|
||||
const INPUT_SOURCE_TYPE_XKB = 'xkb';
|
||||
const INPUT_SOURCE_TYPE_IBUS = 'ibus';
|
||||
|
||||
var LayoutMenuItem = GObject.registerClass(
|
||||
class LayoutMenuItem extends PopupMenu.PopupBaseMenuItem {
|
||||
_init(displayName, shortName) {
|
||||
super._init();
|
||||
var LayoutMenuItem = class extends PopupMenu.PopupBaseMenuItem {
|
||||
constructor(displayName, shortName) {
|
||||
super();
|
||||
|
||||
this.label = new St.Label({ text: displayName });
|
||||
this.indicator = new St.Label({ text: shortName });
|
||||
this.add(this.label, { expand: true });
|
||||
this.add(this.indicator);
|
||||
this.label_actor = this.label;
|
||||
this.actor.add(this.label, { expand: true });
|
||||
this.actor.add(this.indicator);
|
||||
this.actor.label_actor = this.label;
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
var InputSource = class {
|
||||
constructor(type, id, displayName, shortName, index) {
|
||||
@@ -126,8 +125,8 @@ class InputSourceSwitcher extends SwitcherPopup.SwitcherList {
|
||||
|
||||
var InputSourceSettings = class {
|
||||
constructor() {
|
||||
if (this.constructor === InputSourceSettings)
|
||||
throw new TypeError(`Cannot instantiate abstract class ${this.constructor.name}`);
|
||||
if (new.target === InputSourceSettings)
|
||||
throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
|
||||
}
|
||||
|
||||
_emitInputSourcesChanged() {
|
||||
@@ -823,7 +822,7 @@ class InputSourceIndicator extends PanelMenu.Button {
|
||||
this._hbox.add_child(this._container);
|
||||
this._hbox.add_child(PopupMenu.arrowIcon(St.Side.BOTTOM));
|
||||
|
||||
this.add_child(this._hbox);
|
||||
this.actor.add_child(this._hbox);
|
||||
|
||||
this._propSeparator = new PopupMenu.PopupSeparatorMenuItem();
|
||||
this.menu.addMenuItem(this._propSeparator);
|
||||
@@ -858,7 +857,7 @@ class InputSourceIndicator extends PanelMenu.Button {
|
||||
// but at least for now it is used as "allow popping up windows
|
||||
// from shell menus"; we can always add a separate sessionMode
|
||||
// option if need arises.
|
||||
this._showLayoutItem.visible = Main.sessionMode.allowSettings;
|
||||
this._showLayoutItem.actor.visible = Main.sessionMode.allowSettings;
|
||||
}
|
||||
|
||||
_sourcesChanged() {
|
||||
@@ -909,11 +908,11 @@ class InputSourceIndicator extends PanelMenu.Button {
|
||||
// We also hide if we have only one visible source unless
|
||||
// it's an IBus source with properties.
|
||||
this.menu.close();
|
||||
this.hide();
|
||||
this.actor.hide();
|
||||
return;
|
||||
}
|
||||
|
||||
this.show();
|
||||
this.actor.show();
|
||||
|
||||
this._buildPropSection(newSource.properties);
|
||||
|
||||
|
@@ -101,12 +101,12 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
_syncIndicator() {
|
||||
if (this._managerProxy == null) {
|
||||
this._indicator.visible = false;
|
||||
this._item.visible = false;
|
||||
this._item.actor.visible = false;
|
||||
return;
|
||||
}
|
||||
|
||||
this._indicator.visible = this._managerProxy.InUse;
|
||||
this._item.visible = this._indicator.visible;
|
||||
this._item.actor.visible = this._indicator.visible;
|
||||
this._updateMenuLabels();
|
||||
}
|
||||
|
||||
|
@@ -167,10 +167,10 @@ var NMConnectionItem = class {
|
||||
};
|
||||
Signals.addSignalMethods(NMConnectionItem.prototype);
|
||||
|
||||
var NMConnectionSection = class NMConnectionSection {
|
||||
var NMConnectionSection = class {
|
||||
constructor(client) {
|
||||
if (this.constructor === NMConnectionSection)
|
||||
throw new TypeError(`Cannot instantiate abstract type ${this.constructor.name}`);
|
||||
if (new.target === NMConnectionSection)
|
||||
throw new TypeError('Cannot instantiate abstract type ' + new.target.name);
|
||||
|
||||
this._client = client;
|
||||
|
||||
@@ -235,14 +235,14 @@ var NMConnectionSection = class NMConnectionSection {
|
||||
if (!this._connectionValid(connection))
|
||||
return;
|
||||
|
||||
// This function is called every time the connection is added or updated.
|
||||
// This function is called everytime connection is added or updated
|
||||
// In the usual case, we already added this connection and UUID
|
||||
// didn't change. So we need to check if we already have an item,
|
||||
// and update it for properties in the connection that changed
|
||||
// (the only one we care about is the name)
|
||||
// But it's also possible we didn't know about this connection
|
||||
// (eg, during coldplug, or because it was updated and suddenly
|
||||
// it's valid for this device), in which case we add a new item.
|
||||
// it's valid for this device), in which case we add a new item
|
||||
|
||||
let item = this._connectionItems.get(connection.get_uuid());
|
||||
if (item)
|
||||
@@ -297,13 +297,12 @@ var NMConnectionSection = class NMConnectionSection {
|
||||
};
|
||||
Signals.addSignalMethods(NMConnectionSection.prototype);
|
||||
|
||||
var NMConnectionDevice = class NMConnectionDevice extends NMConnectionSection {
|
||||
var NMConnectionDevice = class extends NMConnectionSection {
|
||||
constructor(client, device) {
|
||||
if (new.target === NMConnectionDevice)
|
||||
throw new TypeError('Cannot instantiate abstract type ' + new.target.name);
|
||||
|
||||
super(client);
|
||||
|
||||
if (this.constructor === NMConnectionDevice)
|
||||
throw new TypeError(`Cannot instantiate abstract type ${this.constructor.name}`);
|
||||
|
||||
this._device = device;
|
||||
this._description = '';
|
||||
|
||||
@@ -389,8 +388,8 @@ var NMConnectionDevice = class NMConnectionDevice extends NMConnectionSection {
|
||||
|
||||
_sync() {
|
||||
let nItems = this._connectionItems.size;
|
||||
this._autoConnectItem.visible = (nItems == 0);
|
||||
this._deactivateItem.visible = this._device.state > NM.DeviceState.DISCONNECTED;
|
||||
this._autoConnectItem.actor.visible = (nItems == 0);
|
||||
this._deactivateItem.actor.visible = this._device.state > NM.DeviceState.DISCONNECTED;
|
||||
|
||||
if (this._activeConnection == null) {
|
||||
let activeConnection = this._device.active_connection;
|
||||
@@ -477,7 +476,7 @@ var NMDeviceWired = class extends NMConnectionDevice {
|
||||
}
|
||||
|
||||
_sync() {
|
||||
this.item.visible = this._hasCarrier();
|
||||
this.item.actor.visible = this._hasCarrier();
|
||||
super._sync();
|
||||
}
|
||||
|
||||
@@ -1076,7 +1075,7 @@ var NMWirelessDialog = class extends ModalDialog.ModalDialog {
|
||||
|
||||
let newPos = Util.insertSorted(this._networks, network, this._networkSortFunction);
|
||||
this._createNetworkItem(network);
|
||||
this._itemBox.insert_child_at_index(network.item, newPos);
|
||||
this._itemBox.insert_child_at_index(network.item.actor, newPos);
|
||||
}
|
||||
|
||||
this._syncView();
|
||||
@@ -1094,7 +1093,7 @@ var NMWirelessDialog = class extends ModalDialog.ModalDialog {
|
||||
network.accessPoints.splice(res.ap, 1);
|
||||
|
||||
if (network.accessPoints.length == 0) {
|
||||
network.item.destroy();
|
||||
network.item.actor.destroy();
|
||||
this._networks.splice(res.network, 1);
|
||||
} else {
|
||||
network.item.updateBestAP(network.accessPoints[0]);
|
||||
@@ -1110,7 +1109,7 @@ var NMWirelessDialog = class extends ModalDialog.ModalDialog {
|
||||
|
||||
this._itemBox.remove_all_children();
|
||||
this._networks.forEach(network => {
|
||||
this._itemBox.add_child(network.item);
|
||||
this._itemBox.add_child(network.item.actor);
|
||||
});
|
||||
|
||||
adjustment.value = scrollValue;
|
||||
@@ -1118,25 +1117,25 @@ var NMWirelessDialog = class extends ModalDialog.ModalDialog {
|
||||
|
||||
_selectNetwork(network) {
|
||||
if (this._selectedNetwork)
|
||||
this._selectedNetwork.item.remove_style_pseudo_class('selected');
|
||||
this._selectedNetwork.item.actor.remove_style_pseudo_class('selected');
|
||||
|
||||
this._selectedNetwork = network;
|
||||
this._updateSensitivity();
|
||||
|
||||
if (this._selectedNetwork)
|
||||
this._selectedNetwork.item.add_style_pseudo_class('selected');
|
||||
this._selectedNetwork.item.actor.add_style_pseudo_class('selected');
|
||||
}
|
||||
|
||||
_createNetworkItem(network) {
|
||||
network.item = new NMWirelessDialogItem(network);
|
||||
network.item.setActive(network == this._selectedNetwork);
|
||||
network.item.connect('selected', () => {
|
||||
Util.ensureActorVisibleInScrollView(this._scrollView, network.item);
|
||||
Util.ensureActorVisibleInScrollView(this._scrollView, network.item.actor);
|
||||
this._selectNetwork(network);
|
||||
});
|
||||
network.item.connect('destroy', () => {
|
||||
network.item.actor.connect('destroy', () => {
|
||||
let keyFocus = global.stage.key_focus;
|
||||
if (keyFocus && keyFocus.contains(network.item))
|
||||
if (keyFocus && keyFocus.contains(network.item.actor))
|
||||
this._itemBox.grab_key_focus();
|
||||
});
|
||||
}
|
||||
@@ -1262,7 +1261,7 @@ var NMDeviceWireless = class {
|
||||
|
||||
_sync() {
|
||||
this._toggleItem.label.text = this._client.wireless_enabled ? _("Turn Off") : _("Turn On");
|
||||
this._toggleItem.visible = this._client.wireless_hardware_enabled;
|
||||
this._toggleItem.actor.visible = this._client.wireless_hardware_enabled;
|
||||
|
||||
this.item.icon.icon_name = this._getMenuIcon();
|
||||
this.item.label.text = this._getStatus();
|
||||
@@ -1452,7 +1451,7 @@ var NMVpnSection = class extends NMConnectionSection {
|
||||
|
||||
_sync() {
|
||||
let nItems = this._connectionItems.size;
|
||||
this.item.visible = (nItems > 0);
|
||||
this.item.actor.visible = (nItems > 0);
|
||||
|
||||
super._sync();
|
||||
}
|
||||
@@ -1535,7 +1534,7 @@ var DeviceCategory = class extends PopupMenu.PopupMenuSection {
|
||||
|
||||
this._summaryItem.menu.addSettingsAction(_('Network Settings'),
|
||||
'gnome-network-panel.desktop');
|
||||
this._summaryItem.hide();
|
||||
this._summaryItem.actor.hide();
|
||||
|
||||
}
|
||||
|
||||
@@ -1544,7 +1543,7 @@ var DeviceCategory = class extends PopupMenu.PopupMenuSection {
|
||||
(prev, child) => prev + (child.visible ? 1 : 0), 0);
|
||||
this._summaryItem.label.text = this._getSummaryLabel(nDevices);
|
||||
let shouldSummarize = nDevices > MAX_DEVICE_ITEMS;
|
||||
this._summaryItem.visible = shouldSummarize;
|
||||
this._summaryItem.actor.visible = shouldSummarize;
|
||||
this.section.actor.visible = !shouldSummarize;
|
||||
}
|
||||
|
||||
@@ -1674,11 +1673,7 @@ var NMApplet = class extends PanelMenu.SystemIndicator {
|
||||
_readDevices() {
|
||||
let devices = this._client.get_devices() || [ ];
|
||||
for (let i = 0; i < devices.length; ++i) {
|
||||
try {
|
||||
this._deviceAdded(this._client, devices[i], true);
|
||||
} catch (e) {
|
||||
log(`Failed to add device ${devices[i]}: ${e}`);
|
||||
}
|
||||
this._deviceAdded(this._client, devices[i], true);
|
||||
}
|
||||
this._syncDeviceNames();
|
||||
}
|
||||
@@ -1731,24 +1726,14 @@ var NMApplet = class extends PanelMenu.SystemIndicator {
|
||||
this._addDeviceWrapper(wrapper);
|
||||
|
||||
this._nmDevices.push(device);
|
||||
this._deviceChanged(device, skipSyncDeviceNames);
|
||||
if (!skipSyncDeviceNames)
|
||||
this._syncDeviceNames();
|
||||
|
||||
device.connect('notify::interface', () => {
|
||||
this._deviceChanged(device, false);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
_deviceChanged(device, skipSyncDeviceNames) {
|
||||
let wrapper = device._delegate;
|
||||
|
||||
if (!skipSyncDeviceNames)
|
||||
this._syncDeviceNames();
|
||||
|
||||
if (wrapper instanceof NMConnectionSection) {
|
||||
this._connections.forEach(connection => {
|
||||
wrapper.checkConnection(connection);
|
||||
});
|
||||
if (wrapper instanceof NMConnectionSection) {
|
||||
this._connections.forEach(connection => {
|
||||
wrapper.checkConnection(connection);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -61,6 +61,6 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
: _("Night Light On");
|
||||
this._disableItem.label.text = disabled ? _("Resume")
|
||||
: _("Disable Until Tomorrow");
|
||||
this._item.visible = this._indicator.visible = visible;
|
||||
this._item.actor.visible = this._indicator.visible = visible;
|
||||
}
|
||||
};
|
||||
|
@@ -96,11 +96,11 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
// Do we have batteries or a UPS?
|
||||
let visible = this._proxy.IsPresent;
|
||||
if (visible) {
|
||||
this._item.show();
|
||||
this._item.actor.show();
|
||||
this._percentageLabel.visible = this._desktopSettings.get_boolean(SHOW_BATTERY_PERCENTAGE);
|
||||
} else {
|
||||
// If there's no battery, then we use the power icon.
|
||||
this._item.hide();
|
||||
this._item.actor.hide();
|
||||
this._indicator.icon_name = 'system-shutdown-symbolic';
|
||||
this._percentageLabel.hide();
|
||||
return;
|
||||
|
@@ -53,10 +53,10 @@ var RemoteAccessApplet = class extends PanelMenu.SystemIndicator {
|
||||
_sync() {
|
||||
if (this._handles.size == 0) {
|
||||
this._indicator.visible = false;
|
||||
this._item.visible = false;
|
||||
this._item.actor.visible = false;
|
||||
} else {
|
||||
this._indicator.visible = true;
|
||||
this._item.visible = true;
|
||||
this._item.actor.visible = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -97,7 +97,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
let showAirplaneMode = this._manager.shouldShowAirplaneMode;
|
||||
|
||||
this._indicator.visible = (airplaneMode && showAirplaneMode);
|
||||
this._item.visible = (airplaneMode && showAirplaneMode);
|
||||
this._item.actor.visible = (airplaneMode && showAirplaneMode);
|
||||
this._offItem.setSensitive(!hwAirplaneMode);
|
||||
|
||||
if (hwAirplaneMode)
|
||||
|
@@ -116,10 +116,10 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
|
||||
this._createSubMenu();
|
||||
|
||||
this._loginScreenItem.connect('notify::visible',
|
||||
() => { this._updateMultiUser(); });
|
||||
this._logoutItem.connect('notify::visible',
|
||||
() => { this._updateMultiUser(); });
|
||||
this._loginScreenItem.actor.connect('notify::visible',
|
||||
() => { this._updateMultiUser(); });
|
||||
this._logoutItem.actor.connect('notify::visible',
|
||||
() => { this._updateMultiUser(); });
|
||||
// Whether shutdown is available or not depends on both lockdown
|
||||
// settings (disable-log-out) and Polkit policy - the latter doesn't
|
||||
// notify, so we update the menu item each time the menu opens or
|
||||
@@ -142,7 +142,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
this._lockScreenAction.visible ||
|
||||
this._altSwitcher.actor.visible);
|
||||
|
||||
this.buttonGroup.visible = visible;
|
||||
this._actionsItem.actor.visible = visible;
|
||||
}
|
||||
|
||||
_sessionUpdated() {
|
||||
@@ -150,10 +150,10 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
}
|
||||
|
||||
_updateMultiUser() {
|
||||
let hasSwitchUser = this._loginScreenItem.visible;
|
||||
let hasLogout = this._logoutItem.visible;
|
||||
let hasSwitchUser = this._loginScreenItem.actor.visible;
|
||||
let hasLogout = this._logoutItem.actor.visible;
|
||||
|
||||
this._switchUserSubMenu.visible = hasSwitchUser || hasLogout;
|
||||
this._switchUserSubMenu.actor.visible = hasSwitchUser || hasLogout;
|
||||
}
|
||||
|
||||
_updateSwitchUserSubMenu() {
|
||||
@@ -208,7 +208,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
this._switchUserSubMenu.menu.addMenuItem(item);
|
||||
this._loginScreenItem = item;
|
||||
this._systemActions.bind_property('can-switch-user',
|
||||
this._loginScreenItem,
|
||||
this._loginScreenItem.actor,
|
||||
'visible',
|
||||
bindFlags);
|
||||
|
||||
@@ -220,7 +220,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
this._switchUserSubMenu.menu.addMenuItem(item);
|
||||
this._logoutItem = item;
|
||||
this._systemActions.bind_property('can-logout',
|
||||
this._logoutItem,
|
||||
this._logoutItem.actor,
|
||||
'visible',
|
||||
bindFlags);
|
||||
|
||||
@@ -236,7 +236,6 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
|
||||
item = new PopupMenu.PopupBaseMenuItem({ reactive: false,
|
||||
can_focus: false });
|
||||
this.buttonGroup = item;
|
||||
|
||||
let app = this._settingsApp = Shell.AppSystem.get_default().lookup_app(
|
||||
'gnome-control-center.desktop'
|
||||
@@ -251,14 +250,14 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
log('Missing required core component Settings, expect trouble…');
|
||||
this._settingsAction = new St.Widget();
|
||||
}
|
||||
item.add(this._settingsAction, { expand: true, x_fill: false });
|
||||
item.actor.add(this._settingsAction, { expand: true, x_fill: false });
|
||||
|
||||
this._orientationLockAction = this._createActionButton('', _("Orientation Lock"));
|
||||
this._orientationLockAction.connect('clicked', () => {
|
||||
this.menu.itemActivated(BoxPointer.PopupAnimation.NONE),
|
||||
this._systemActions.activateLockOrientation();
|
||||
});
|
||||
item.add(this._orientationLockAction, { expand: true, x_fill: false });
|
||||
item.actor.add(this._orientationLockAction, { expand: true, x_fill: false });
|
||||
this._systemActions.bind_property('can-lock-orientation',
|
||||
this._orientationLockAction,
|
||||
'visible',
|
||||
@@ -273,7 +272,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
this.menu.itemActivated(BoxPointer.PopupAnimation.NONE);
|
||||
this._systemActions.activateLockScreen();
|
||||
});
|
||||
item.add(this._lockScreenAction, { expand: true, x_fill: false });
|
||||
item.actor.add(this._lockScreenAction, { expand: true, x_fill: false });
|
||||
this._systemActions.bind_property('can-lock-screen',
|
||||
this._lockScreenAction,
|
||||
'visible',
|
||||
@@ -300,8 +299,9 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
bindFlags);
|
||||
|
||||
this._altSwitcher = new AltSwitcher(this._powerOffAction, this._suspendAction);
|
||||
item.add(this._altSwitcher.actor, { expand: true, x_fill: false });
|
||||
item.actor.add(this._altSwitcher.actor, { expand: true, x_fill: false });
|
||||
|
||||
this._actionsItem = item;
|
||||
this.menu.addMenuItem(item);
|
||||
|
||||
|
||||
|
@@ -41,12 +41,12 @@ var StreamSlider = class {
|
||||
this._slider.connect('drag-end', this._notifyVolumeChange.bind(this));
|
||||
|
||||
this._icon = new St.Icon({ style_class: 'popup-menu-icon' });
|
||||
this.item.add(this._icon);
|
||||
this.item.add(this._slider.actor, { expand: true });
|
||||
this.item.connect('button-press-event', (actor, event) => {
|
||||
this.item.actor.add(this._icon);
|
||||
this.item.actor.add(this._slider.actor, { expand: true });
|
||||
this.item.actor.connect('button-press-event', (actor, event) => {
|
||||
return this._slider.startDragging(event);
|
||||
});
|
||||
this.item.connect('key-press-event', (actor, event) => {
|
||||
this.item.actor.connect('key-press-event', (actor, event) => {
|
||||
return this._slider.onKeyPressEvent(actor, event);
|
||||
});
|
||||
|
||||
@@ -93,7 +93,7 @@ var StreamSlider = class {
|
||||
|
||||
_updateVisibility() {
|
||||
let visible = this._shouldBeVisible();
|
||||
this.item.visible = visible;
|
||||
this.item.actor.visible = visible;
|
||||
}
|
||||
|
||||
scroll(event) {
|
||||
|
@@ -30,10 +30,12 @@ function primaryModifier(mask) {
|
||||
return primary;
|
||||
}
|
||||
|
||||
var SwitcherPopup = GObject.registerClass({
|
||||
GTypeFlags: GObject.TypeFlags.ABSTRACT
|
||||
}, class SwitcherPopup extends St.Widget {
|
||||
var SwitcherPopup = GObject.registerClass(
|
||||
class SwitcherPopup extends St.Widget {
|
||||
_init(items) {
|
||||
if (new.target === SwitcherPopup)
|
||||
throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
|
||||
|
||||
super._init({ style_class: 'switcher-popup',
|
||||
reactive: true,
|
||||
visible: false });
|
||||
@@ -162,7 +164,7 @@ var SwitcherPopup = GObject.registerClass({
|
||||
}
|
||||
|
||||
_keyPressHandler(keysym, action) {
|
||||
throw new GObject.NotImplementedError(`_keyPressHandler in ${this.constructor.name}`);
|
||||
throw new Error('Not implemented');
|
||||
}
|
||||
|
||||
_keyPressEvent(actor, event) {
|
||||
|
@@ -152,7 +152,7 @@ function registerSpecialPropertySplitter(name, splitFunction, parameters) {
|
||||
// Tweener to a Clutter.TimeLine. Now, Clutter.Timeline itself isn't a
|
||||
// whole lot more sophisticated than a simple timeout at a fixed frame
|
||||
// rate, but at least it knows how to drop frames. (See
|
||||
// HippoAnimationManager for a more sophisticated view of continuous
|
||||
// HippoAnimationManager for a more sophisticated view of continous
|
||||
// time updates; even better is to pay attention to the vertical
|
||||
// vblank and sync to that when possible.)
|
||||
//
|
||||
|
@@ -59,7 +59,7 @@ var DisplayChangeDialog = class extends ModalDialog.ModalDialog {
|
||||
{ x_fill: true,
|
||||
y_fill: true });
|
||||
|
||||
/* Translators: this and the following message should be limited in length,
|
||||
/* Translators: this and the following message should be limited in lenght,
|
||||
to avoid ellipsizing the labels.
|
||||
*/
|
||||
this._cancelButton = this.addButton({ label: _("Revert Settings"),
|
||||
@@ -456,28 +456,13 @@ var TilePreview = class {
|
||||
};
|
||||
|
||||
var TouchpadWorkspaceSwitchAction = class {
|
||||
constructor(actor, allowedModes) {
|
||||
this._allowedModes = allowedModes;
|
||||
constructor(actor) {
|
||||
this._dx = 0;
|
||||
this._dy = 0;
|
||||
this._enabled = true;
|
||||
actor.connect('captured-event', this._handleEvent.bind(this));
|
||||
this._touchpadSettings = new Gio.Settings({schema_id: 'org.gnome.desktop.peripherals.touchpad'});
|
||||
}
|
||||
|
||||
get enabled() {
|
||||
return this._enabled;
|
||||
}
|
||||
|
||||
set enabled(enabled) {
|
||||
if (this._enabled == enabled)
|
||||
return;
|
||||
|
||||
this._enabled = enabled;
|
||||
if (!enabled)
|
||||
this.emit('cancel');
|
||||
}
|
||||
|
||||
_checkActivated() {
|
||||
let dir;
|
||||
|
||||
@@ -497,16 +482,15 @@ var TouchpadWorkspaceSwitchAction = class {
|
||||
}
|
||||
|
||||
_handleEvent(actor, event) {
|
||||
let allowedModes = Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW;
|
||||
|
||||
if (event.type() != Clutter.EventType.TOUCHPAD_SWIPE)
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
if (event.get_touchpad_gesture_finger_count() != 4)
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
if ((this._allowedModes & Main.actionMode) == 0)
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
if (!this._enabled)
|
||||
if ((allowedModes & Main.actionMode) == 0)
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
if (event.get_gesture_phase() == Clutter.TouchpadGesturePhase.UPDATE) {
|
||||
@@ -539,11 +523,10 @@ var WorkspaceSwitchAction = GObject.registerClass({
|
||||
'motion': { param_types: [GObject.TYPE_DOUBLE, GObject.TYPE_DOUBLE] },
|
||||
'cancel': { param_types: [] }},
|
||||
}, class WorkspaceSwitchAction extends Clutter.SwipeAction {
|
||||
_init(allowedModes) {
|
||||
_init() {
|
||||
super._init();
|
||||
this.set_n_touch_points(4);
|
||||
this._swept = false;
|
||||
this._allowedModes = allowedModes;
|
||||
|
||||
global.display.connect('grab-op-begin', () => {
|
||||
this.cancel();
|
||||
@@ -551,12 +534,14 @@ var WorkspaceSwitchAction = GObject.registerClass({
|
||||
}
|
||||
|
||||
vfunc_gesture_prepare(actor) {
|
||||
let allowedModes = Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW;
|
||||
|
||||
this._swept = false;
|
||||
|
||||
if (!super.vfunc_gesture_prepare(actor))
|
||||
return false;
|
||||
|
||||
return (this._allowedModes & Main.actionMode);
|
||||
return (allowedModes & Main.actionMode);
|
||||
}
|
||||
|
||||
vfunc_gesture_progress(actor) {
|
||||
@@ -1058,15 +1043,14 @@ var WindowManager = class {
|
||||
global.workspace_manager.override_workspace_layout(Meta.DisplayCorner.TOPLEFT,
|
||||
false, -1, 1);
|
||||
|
||||
let allowedModes = Shell.ActionMode.NORMAL;
|
||||
let gesture = new WorkspaceSwitchAction(allowedModes);
|
||||
let gesture = new WorkspaceSwitchAction();
|
||||
gesture.connect('motion', this._switchWorkspaceMotion.bind(this));
|
||||
gesture.connect('activated', this._actionSwitchWorkspace.bind(this));
|
||||
gesture.connect('cancel', this._switchWorkspaceCancel.bind(this));
|
||||
global.stage.add_action(gesture);
|
||||
|
||||
// This is not a normal Clutter.GestureAction, doesn't need add_action()
|
||||
gesture = new TouchpadWorkspaceSwitchAction(global.stage, allowedModes);
|
||||
gesture = new TouchpadWorkspaceSwitchAction(global.stage);
|
||||
gesture.connect('motion', this._switchWorkspaceMotion.bind(this));
|
||||
gesture.connect('activated', this._actionSwitchWorkspace.bind(this));
|
||||
gesture.connect('cancel', this._switchWorkspaceCancel.bind(this));
|
||||
@@ -1218,10 +1202,6 @@ var WindowManager = class {
|
||||
// Same for OR windows
|
||||
if (window.is_override_redirect())
|
||||
return;
|
||||
// Sticky windows don't need moving, in fact moving would
|
||||
// unstick them
|
||||
if (window.on_all_workspaces)
|
||||
return;
|
||||
// Windows on workspaces below pos don't need moving
|
||||
let index = window.get_workspace().index();
|
||||
if (index < pos)
|
||||
@@ -1488,13 +1468,8 @@ var WindowManager = class {
|
||||
if (this._clearAnimationInfo(actor))
|
||||
this._shellwm.completed_size_change(actor);
|
||||
|
||||
let destroyId = actor.connect('destroy', () => {
|
||||
this._clearAnimationInfo(actor);
|
||||
});
|
||||
|
||||
actor.__animationInfo = { clone: actorClone,
|
||||
oldRect: oldFrameRect,
|
||||
destroyId: destroyId };
|
||||
oldRect: oldFrameRect };
|
||||
}
|
||||
|
||||
_sizeChangedWindow(shellwm, actor) {
|
||||
@@ -1555,7 +1530,6 @@ var WindowManager = class {
|
||||
_clearAnimationInfo(actor) {
|
||||
if (actor.__animationInfo) {
|
||||
actor.__animationInfo.clone.destroy();
|
||||
actor.disconnect(actor.__animationInfo.destroyId);
|
||||
delete actor.__animationInfo;
|
||||
return true;
|
||||
}
|
||||
@@ -1870,25 +1844,17 @@ var WindowManager = class {
|
||||
}
|
||||
}
|
||||
|
||||
_getPositionForDirection(direction, fromWs, toWs) {
|
||||
_getPositionForDirection(direction) {
|
||||
let xDest = 0, yDest = 0;
|
||||
|
||||
let oldWsIsFullscreen = fromWs.list_windows().some(w => w.is_fullscreen());
|
||||
let newWsIsFullscreen = toWs.list_windows().some(w => w.is_fullscreen());
|
||||
|
||||
// We have to shift windows up or down by the height of the panel to prevent having a
|
||||
// visible gap between the windows while switching workspaces. Since fullscreen windows
|
||||
// hide the panel, they don't need to be shifted up or down.
|
||||
let shiftHeight = Main.panel.height;
|
||||
|
||||
if (direction == Meta.MotionDirection.UP ||
|
||||
direction == Meta.MotionDirection.UP_LEFT ||
|
||||
direction == Meta.MotionDirection.UP_RIGHT)
|
||||
yDest = -global.screen_height + (oldWsIsFullscreen ? 0 : shiftHeight);
|
||||
yDest = -global.screen_height + Main.panel.height;
|
||||
else if (direction == Meta.MotionDirection.DOWN ||
|
||||
direction == Meta.MotionDirection.DOWN_LEFT ||
|
||||
direction == Meta.MotionDirection.DOWN_RIGHT)
|
||||
yDest = global.screen_height - (newWsIsFullscreen ? 0 : shiftHeight);
|
||||
yDest = global.screen_height - Main.panel.height;
|
||||
|
||||
if (direction == Meta.MotionDirection.LEFT ||
|
||||
direction == Meta.MotionDirection.UP_LEFT ||
|
||||
@@ -1946,7 +1912,7 @@ var WindowManager = class {
|
||||
switchData.container.add_actor(info.actor);
|
||||
info.actor.raise_top();
|
||||
|
||||
let [x, y] = this._getPositionForDirection(dir, curWs, ws);
|
||||
let [x, y] = this._getPositionForDirection(dir);
|
||||
info.actor.set_position(x, y);
|
||||
}
|
||||
|
||||
@@ -2032,11 +1998,7 @@ var WindowManager = class {
|
||||
|
||||
this._switchData.inProgress = true;
|
||||
|
||||
let workspaceManager = global.workspace_manager;
|
||||
let fromWs = workspaceManager.get_workspace_by_index(from);
|
||||
let toWs = workspaceManager.get_workspace_by_index(to);
|
||||
|
||||
let [xDest, yDest] = this._getPositionForDirection(direction, fromWs, toWs);
|
||||
let [xDest, yDest] = this._getPositionForDirection(direction);
|
||||
|
||||
/* @direction is the direction that the "camera" moves, so the
|
||||
* screen contents have to move one screen's worth in the
|
||||
|
@@ -173,7 +173,7 @@ var WindowMenu = class extends PopupMenu.PopupMenu {
|
||||
|
||||
var WindowMenuManager = class {
|
||||
constructor() {
|
||||
this._manager = new PopupMenu.PopupMenuManager(Main.layoutManager.dummyCursor);
|
||||
this._manager = new PopupMenu.PopupMenuManager({ actor: Main.layoutManager.dummyCursor });
|
||||
|
||||
this._sourceActor = new St.Widget({ reactive: true, visible: false });
|
||||
this._sourceActor.connect('button-press-event', () => {
|
||||
|
@@ -786,8 +786,8 @@ var WindowPositionFlags = {
|
||||
|
||||
var LayoutStrategy = class {
|
||||
constructor(monitor, rowSpacing, columnSpacing) {
|
||||
if (this.constructor === LayoutStrategy)
|
||||
throw new TypeError(`Cannot instantiate abstract type ${this.constructor.name}`);
|
||||
if (new.target === LayoutStrategy)
|
||||
throw new TypeError('Cannot instantiate abstract type ' + new.target.name);
|
||||
|
||||
this._monitor = monitor;
|
||||
this._rowSpacing = rowSpacing;
|
||||
@@ -813,7 +813,7 @@ var LayoutStrategy = class {
|
||||
}
|
||||
|
||||
// Computes and returns an individual scaling factor for @window,
|
||||
// to be applied in addition to the overall layout scale.
|
||||
// to be applied in addition to the overal layout scale.
|
||||
_computeWindowScale(window) {
|
||||
// Since we align windows next to each other, the height of the
|
||||
// thumbnails is much more important to preserve than the width of
|
||||
@@ -835,7 +835,7 @@ var LayoutStrategy = class {
|
||||
// (optionally) for each row in @layout.rows. This method is
|
||||
// intended to be called by subclasses.
|
||||
_computeRowSizes(layout) {
|
||||
throw new GObject.NotImplementedError(`_computeRowSizes in ${this.constructor.name}`);
|
||||
throw new Error('_computeRowSizes not implemented');
|
||||
}
|
||||
|
||||
// Compute strategy-specific window slots for each window in
|
||||
@@ -848,7 +848,7 @@ var LayoutStrategy = class {
|
||||
// * gridHeight - The totial height used by the grid, unscaled, unspaced.
|
||||
// * rows - A list of rows, which should be instantiated by _newRow.
|
||||
computeLayout(windows, layout) {
|
||||
throw new GObject.NotImplementedError(`computeLayout in ${this.constructor.name}`);
|
||||
throw new Error('computeLayout not implemented');
|
||||
}
|
||||
|
||||
// Given @layout, compute the overall scale and space of the layout.
|
||||
@@ -1266,7 +1266,7 @@ var Workspace = class {
|
||||
}
|
||||
|
||||
// We will reposition windows anyway when enter again overview or when ending the windows
|
||||
// animations with fade animation.
|
||||
// animations whith fade animation.
|
||||
// In this way we avoid unwanted animations of windows repositioning while
|
||||
// animating overview.
|
||||
if (this.leavingOverview || this._animatingWindowsFade)
|
||||
@@ -1886,10 +1886,10 @@ var Workspace = class {
|
||||
// Win win -- better scale and better space
|
||||
return true;
|
||||
} else if (newLayout.scale > oldLayout.scale && newLayout.space <= oldLayout.space) {
|
||||
// Keep new layout only if scale gain outweighs aspect space loss
|
||||
// Keep new layout only if scale gain outweights aspect space loss
|
||||
return scalePower > spacePower;
|
||||
} else if (newLayout.scale <= oldLayout.scale && newLayout.space > oldLayout.space) {
|
||||
// Keep new layout only if aspect space gain outweighs scale loss
|
||||
// Keep new layout only if aspect space gain outweights scale loss
|
||||
return spacePower > scalePower;
|
||||
} else {
|
||||
// Lose -- worse scale and space
|
||||
|
@@ -85,6 +85,8 @@ class WorkspaceSwitcherPopup extends St.Widget {
|
||||
height: global.screen_height,
|
||||
style_class: 'workspace-switcher-group' });
|
||||
|
||||
this.actor = this;
|
||||
|
||||
Main.uiGroup.add_actor(this);
|
||||
|
||||
this._timeoutId = 0;
|
||||
@@ -140,7 +142,7 @@ class WorkspaceSwitcherPopup extends St.Widget {
|
||||
time: ANIMATION_TIME,
|
||||
transition: 'easeOutQuad'
|
||||
});
|
||||
this.show();
|
||||
this.actor.show();
|
||||
}
|
||||
|
||||
display(direction, activeWorkspaceIndex) {
|
||||
|
@@ -601,7 +601,8 @@ class ThumbnailsBox extends St.Widget {
|
||||
style_class: 'workspace-thumbnails',
|
||||
request_mode: Clutter.RequestMode.WIDTH_FOR_HEIGHT });
|
||||
|
||||
this._delegate = this;
|
||||
this.actor = this;
|
||||
this.actor._delegate = this;
|
||||
|
||||
let indicator = new St.Bin({ style_class: 'workspace-thumbnail-indicator' });
|
||||
|
||||
|
@@ -1,11 +1,10 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
const { Clutter, Gio, GObject, Meta, Shell, St } = imports.gi;
|
||||
const { Clutter, Gio, GObject, Meta, St } = imports.gi;
|
||||
const Signals = imports.signals;
|
||||
|
||||
const Main = imports.ui.main;
|
||||
const Tweener = imports.ui.tweener;
|
||||
const WindowManager = imports.ui.windowManager;
|
||||
const Workspace = imports.ui.workspace;
|
||||
|
||||
var WORKSPACE_SWITCH_TIME = 0.25;
|
||||
@@ -83,8 +82,7 @@ var WorkspacesView = class extends WorkspacesViewBase {
|
||||
|
||||
this._animating = false; // tweening
|
||||
this._scrolling = false; // swipe-scrolling
|
||||
this._gestureActive = false; // touch(pad) gestures
|
||||
this._animatingScroll = false; // programmatically updating the adjustment
|
||||
this._animatingScroll = false; // programatically updating the adjustment
|
||||
|
||||
let activeWorkspaceIndex = workspaceManager.get_active_workspace_index();
|
||||
this.scrollAdjustment = new St.Adjustment({ value: activeWorkspaceIndex,
|
||||
@@ -213,7 +211,7 @@ var WorkspacesView = class extends WorkspacesViewBase {
|
||||
|
||||
for (let w = 0; w < this._workspaces.length; w++) {
|
||||
let workspace = this._workspaces[w];
|
||||
if (this._animating || this._scrolling || this._gestureActive) {
|
||||
if (this._animating || this._scrolling) {
|
||||
workspace.actor.show();
|
||||
} else {
|
||||
if (this._inDrag)
|
||||
@@ -225,7 +223,7 @@ var WorkspacesView = class extends WorkspacesViewBase {
|
||||
}
|
||||
|
||||
_updateScrollAdjustment(index) {
|
||||
if (this._scrolling || this._gestureActive)
|
||||
if (this._scrolling)
|
||||
return;
|
||||
|
||||
this._animatingScroll = true;
|
||||
@@ -302,18 +300,6 @@ var WorkspacesView = class extends WorkspacesViewBase {
|
||||
this._updateVisibility();
|
||||
}
|
||||
|
||||
startTouchGesture() {
|
||||
this._gestureActive = true;
|
||||
}
|
||||
|
||||
endTouchGesture() {
|
||||
this._gestureActive = false;
|
||||
|
||||
// Make sure title captions etc are shown as necessary
|
||||
this._scrollToActive();
|
||||
this._updateVisibility();
|
||||
}
|
||||
|
||||
// sync the workspaces' positions to the value of the scroll adjustment
|
||||
// and change the active workspace if appropriate
|
||||
_onScroll(adj) {
|
||||
@@ -324,7 +310,7 @@ var WorkspacesView = class extends WorkspacesViewBase {
|
||||
let active = workspaceManager.get_active_workspace_index();
|
||||
let current = Math.round(adj.value);
|
||||
|
||||
if (active != current && !this._gestureActive) {
|
||||
if (active != current) {
|
||||
if (!this._workspaces[current]) {
|
||||
// The current workspace was destroyed. This could happen
|
||||
// when you are on the last empty workspace, and consolidate
|
||||
@@ -405,12 +391,6 @@ var ExtraWorkspaceView = class extends WorkspacesViewBase {
|
||||
|
||||
endSwipeScroll() {
|
||||
}
|
||||
|
||||
startTouchGesture() {
|
||||
}
|
||||
|
||||
endTouchGesture() {
|
||||
}
|
||||
};
|
||||
|
||||
var DelegateFocusNavigator = GObject.registerClass(
|
||||
@@ -450,46 +430,35 @@ var WorkspacesDisplay = class {
|
||||
return false;
|
||||
}
|
||||
|
||||
this._startSwipeScroll();
|
||||
for (let i = 0; i < this._workspacesViews.length; i++)
|
||||
this._workspacesViews[i].startSwipeScroll();
|
||||
return true;
|
||||
});
|
||||
panAction.connect('gesture-cancel', () => {
|
||||
clickAction.release();
|
||||
this._endSwipeScroll();
|
||||
for (let i = 0; i < this._workspacesViews.length; i++)
|
||||
this._workspacesViews[i].endSwipeScroll();
|
||||
});
|
||||
panAction.connect('gesture-end', () => {
|
||||
clickAction.release();
|
||||
this._endSwipeScroll();
|
||||
for (let i = 0; i < this._workspacesViews.length; i++)
|
||||
this._workspacesViews[i].endSwipeScroll();
|
||||
});
|
||||
Main.overview.addAction(panAction);
|
||||
this.actor.bind_property('mapped', panAction, 'enabled', GObject.BindingFlags.SYNC_CREATE);
|
||||
|
||||
let allowedModes = Shell.ActionMode.OVERVIEW;
|
||||
let switchGesture = new WindowManager.WorkspaceSwitchAction(allowedModes);
|
||||
switchGesture.connect('motion', this._onSwitchWorkspaceMotion.bind(this));
|
||||
switchGesture.connect('activated', this._onSwitchWorkspaceActivated.bind(this));
|
||||
switchGesture.connect('cancel', this._endTouchGesture.bind(this));
|
||||
Main.overview.addAction(switchGesture);
|
||||
this.actor.bind_property('mapped', switchGesture, 'enabled', GObject.BindingFlags.SYNC_CREATE);
|
||||
|
||||
switchGesture = new WindowManager.TouchpadWorkspaceSwitchAction(global.stage, allowedModes);
|
||||
switchGesture.connect('motion', this._onSwitchWorkspaceMotion.bind(this));
|
||||
switchGesture.connect('activated', this._onSwitchWorkspaceActivated.bind(this));
|
||||
switchGesture.connect('cancel', this._endTouchGesture.bind(this));
|
||||
this.actor.connect('notify::mapped', () => {
|
||||
switchGesture.enabled = this.actor.mapped;
|
||||
});
|
||||
|
||||
this._primaryIndex = Main.layoutManager.primaryIndex;
|
||||
|
||||
this._workspacesViews = [];
|
||||
switchGesture.enabled = this.actor.mapped;
|
||||
this._primaryScrollAdjustment = null;
|
||||
|
||||
this._settings = new Gio.Settings({ schema_id: MUTTER_SCHEMA });
|
||||
this._settings.connect('changed::workspaces-only-on-primary',
|
||||
this._workspacesOnlyOnPrimaryChanged.bind(this));
|
||||
this._workspacesOnlyOnPrimaryChanged();
|
||||
|
||||
this._switchWorkspaceNotifyId = 0;
|
||||
|
||||
this._notifyOpacityId = 0;
|
||||
this._restackedNotifyId = 0;
|
||||
this._scrollEventId = 0;
|
||||
@@ -505,47 +474,6 @@ var WorkspacesDisplay = class {
|
||||
return false;
|
||||
}
|
||||
|
||||
_startSwipeScroll() {
|
||||
for (let i = 0; i < this._workspacesViews.length; i++)
|
||||
this._workspacesViews[i].startSwipeScroll();
|
||||
}
|
||||
|
||||
_endSwipeScroll() {
|
||||
for (let i = 0; i < this._workspacesViews.length; i++)
|
||||
this._workspacesViews[i].endSwipeScroll();
|
||||
}
|
||||
|
||||
_startTouchGesture() {
|
||||
for (let i = 0; i < this._workspacesViews.length; i++)
|
||||
this._workspacesViews[i].startTouchGesture();
|
||||
}
|
||||
|
||||
_endTouchGesture() {
|
||||
for (let i = 0; i < this._workspacesViews.length; i++)
|
||||
this._workspacesViews[i].endTouchGesture();
|
||||
}
|
||||
|
||||
_onSwitchWorkspaceMotion(action, xRel, yRel) {
|
||||
// We don't have a way to hook into start of touchpad actions,
|
||||
// luckily this is safe to call repeatedly.
|
||||
this._startTouchGesture();
|
||||
|
||||
let workspaceManager = global.workspace_manager;
|
||||
let active = workspaceManager.get_active_workspace_index();
|
||||
let adjustment = this._scrollAdjustment;
|
||||
adjustment.value = (active - yRel / this.actor.height) * adjustment.page_size;
|
||||
}
|
||||
|
||||
_onSwitchWorkspaceActivated(action, direction) {
|
||||
let workspaceManager = global.workspace_manager;
|
||||
let activeWorkspace = workspaceManager.get_active_workspace();
|
||||
let newWs = activeWorkspace.get_neighbor(direction);
|
||||
if (newWs != activeWorkspace)
|
||||
newWs.activate(global.get_current_time());
|
||||
|
||||
this._endTouchGesture();
|
||||
}
|
||||
|
||||
navigateFocus(from, direction) {
|
||||
return this._getPrimaryView().actor.navigate_focus(from, direction, false);
|
||||
}
|
||||
|
52
meson.build
@@ -1,5 +1,5 @@
|
||||
project('gnome-shell', 'c',
|
||||
version: '3.33.2',
|
||||
version: '3.32.0',
|
||||
meson_version: '>= 0.47.0',
|
||||
license: 'GPLv2+'
|
||||
)
|
||||
@@ -14,16 +14,16 @@ cogl_pango_pc = 'mutter-cogl-pango-' + mutter_api_version
|
||||
libmutter_pc = 'libmutter-' + mutter_api_version
|
||||
|
||||
croco_req = '>= 0.6.8'
|
||||
ecal_req = '>= 3.33.1'
|
||||
ecal_req = '>= 3.5.3'
|
||||
eds_req = '>= 3.17.2'
|
||||
gcr_req = '>= 3.7.5'
|
||||
gdesktop_req = '>= 3.7.90'
|
||||
gio_req = '>= 2.56.0'
|
||||
gi_req = '>= 1.49.1'
|
||||
gjs_req = '>= 1.57.2'
|
||||
gjs_req = '>= 1.54.0'
|
||||
gtk_req = '>= 3.15.0'
|
||||
json_glib_req = '>= 0.13.2'
|
||||
mutter_req = '>= 3.33.2'
|
||||
mutter_req = '>= 3.32.0'
|
||||
polkit_req = '>= 0.100'
|
||||
schemas_req = '>= 3.27.90'
|
||||
startup_req = '>= 0.11'
|
||||
@@ -73,7 +73,7 @@ else
|
||||
endif
|
||||
|
||||
atk_bridge_dep = dependency('atk-bridge-2.0')
|
||||
ecal_dep = dependency('libecal-2.0', version: ecal_req)
|
||||
ecal_dep = dependency('libecal-1.2', version: ecal_req)
|
||||
eds_dep = dependency('libedataserver-1.2', version: eds_req)
|
||||
gcr_dep = dependency('gcr-base-3', version: gcr_req)
|
||||
gdk_x11_dep = dependency('gdk-x11-3.0')
|
||||
@@ -167,48 +167,6 @@ cdata.set('HAVE_FDWALK',
|
||||
cc.has_function('fdwalk')
|
||||
)
|
||||
|
||||
all_warnings = [
|
||||
'-fno-strict-aliasing',
|
||||
'-Wpointer-arith',
|
||||
'-Wmissing-declarations',
|
||||
'-Wimplicit-function-declaration',
|
||||
'-Wformat=2',
|
||||
'-Wformat-nonliteral',
|
||||
'-Wformat-security',
|
||||
'-Wstrict-prototypes',
|
||||
'-Wmissing-prototypes',
|
||||
'-Wnested-externs',
|
||||
'-Wold-style-definition',
|
||||
'-Wundef',
|
||||
'-Wunused',
|
||||
'-Wcast-align',
|
||||
'-Wmissing-noreturn',
|
||||
'-Wmissing-format-attribute',
|
||||
'-Wmissing-include-dirs',
|
||||
'-Wlogical-op',
|
||||
'-Wignored-qualifiers',
|
||||
'-Werror=redundant-decls',
|
||||
'-Werror=implicit',
|
||||
'-Werror=nonnull',
|
||||
'-Werror=init-self',
|
||||
'-Werror=main',
|
||||
'-Werror=missing-braces',
|
||||
'-Werror=sequence-point',
|
||||
'-Werror=return-type',
|
||||
'-Werror=trigraphs',
|
||||
'-Werror=array-bounds',
|
||||
'-Werror=write-strings',
|
||||
'-Werror=address',
|
||||
'-Werror=int-to-pointer-cast',
|
||||
'-Werror=pointer-to-int-cast',
|
||||
'-Werror=empty-body',
|
||||
'-Werror=write-strings',
|
||||
]
|
||||
|
||||
supported_warnings = cc.get_supported_arguments(all_warnings)
|
||||
|
||||
add_project_arguments(supported_warnings, language: 'c')
|
||||
|
||||
config_h = configure_file(
|
||||
input: 'config.h.meson',
|
||||
output: 'config.h',
|
||||
|
@@ -52,6 +52,7 @@ js/ui/search.js
|
||||
js/ui/shellEntry.js
|
||||
js/ui/shellMountOperation.js
|
||||
js/ui/status/accessibility.js
|
||||
js/ui/status/automaticUpdates.js
|
||||
js/ui/status/bluetooth.js
|
||||
js/ui/status/brightness.js
|
||||
js/ui/status/keyboard.js
|
||||
|
128
po/de.po
@@ -16,14 +16,14 @@
|
||||
# Benjamin Steinwender <b@stbe.at>, 2013-2014.
|
||||
# Bernd Homuth <dev@hmt.im>, 2014-2015, 2016, 2019.
|
||||
# Franco Della-Monica <franco.della.monica@gmail.com>, 2016.
|
||||
# Tim Sabsch <tim@sabsch.com>, 2018-2019.
|
||||
# Tim Sabsch <tim@sabsch.com>, 2018.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell master\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
|
||||
"POT-Creation-Date: 2019-05-08 10:16+0000\n"
|
||||
"PO-Revision-Date: 2019-05-12 12:36+0200\n"
|
||||
"POT-Creation-Date: 2019-03-02 19:56+0000\n"
|
||||
"PO-Revision-Date: 2019-03-02 21:13+0100\n"
|
||||
"Last-Translator: Tim Sabsch <tim@sabsch.com>\n"
|
||||
"Language-Team: Deutsch <gnome-de@gnome.org>\n"
|
||||
"Language: de\n"
|
||||
@@ -390,6 +390,11 @@ msgstr ""
|
||||
msgid "Network Login"
|
||||
msgstr "Netzwerkanmeldung"
|
||||
|
||||
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
|
||||
#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9
|
||||
msgid "network-workgroup"
|
||||
msgstr "network-workgroup"
|
||||
|
||||
#: js/extensionPrefs/main.js:116
|
||||
msgid "Something’s gone wrong"
|
||||
msgstr "Etwas ist schiefgelaufen"
|
||||
@@ -537,7 +542,7 @@ msgstr "abmelden;verlassen"
|
||||
#: js/misc/systemActions.js:109
|
||||
msgctxt "search-result"
|
||||
msgid "Suspend"
|
||||
msgstr "Bereitschaft"
|
||||
msgstr "In Bereitschaft versetzen"
|
||||
|
||||
#. Translators: A list of keywords that match the suspend action, separated by semicolons
|
||||
#: js/misc/systemActions.js:112
|
||||
@@ -757,12 +762,12 @@ msgstr "Zu Favoriten hinzufügen"
|
||||
msgid "Show Details"
|
||||
msgstr "Details anzeigen"
|
||||
|
||||
#: js/ui/appFavorites.js:149
|
||||
#: js/ui/appFavorites.js:141
|
||||
#, javascript-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "%s wurde zu Ihren Favoriten hinzugefügt"
|
||||
|
||||
#: js/ui/appFavorites.js:183
|
||||
#: js/ui/appFavorites.js:175
|
||||
#, javascript-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s wurde aus Ihren Favoriten entfernt"
|
||||
@@ -1048,7 +1053,7 @@ msgstr "Passwort der mobilen Breitbandverbindung"
|
||||
msgid "A password is required to connect to “%s”."
|
||||
msgstr "Es wird ein Passwort benötigt, um sich mit »%s« zu verbinden."
|
||||
|
||||
#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1664
|
||||
#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665
|
||||
msgid "Network Manager"
|
||||
msgstr "Netzwerk-Verwaltung"
|
||||
|
||||
@@ -1120,23 +1125,23 @@ msgstr "Weltuhren hinzufügen …"
|
||||
msgid "World Clocks"
|
||||
msgstr "Weltuhren"
|
||||
|
||||
#: js/ui/dateMenu.js:228
|
||||
#: js/ui/dateMenu.js:222
|
||||
msgid "Weather"
|
||||
msgstr "Wetter"
|
||||
|
||||
#: js/ui/dateMenu.js:311
|
||||
#: js/ui/dateMenu.js:305
|
||||
msgid "Select a location…"
|
||||
msgstr "Ort auswählen …"
|
||||
|
||||
#: js/ui/dateMenu.js:319
|
||||
#: js/ui/dateMenu.js:313
|
||||
msgid "Loading…"
|
||||
msgstr "Wird geladen …"
|
||||
|
||||
#: js/ui/dateMenu.js:329
|
||||
#: js/ui/dateMenu.js:323
|
||||
msgid "Go online for weather information"
|
||||
msgstr "Gehen Sie Online, um Wetterinformationen beziehen zu können"
|
||||
|
||||
#: js/ui/dateMenu.js:331
|
||||
#: js/ui/dateMenu.js:325
|
||||
msgid "Weather information is currently unavailable"
|
||||
msgstr "Wetterinformationen sind momentan nicht verfügbar"
|
||||
|
||||
@@ -1299,26 +1304,26 @@ msgid "Download and install “%s” from extensions.gnome.org?"
|
||||
msgstr "»%s« von extensions.gnome.org herunterladen und installieren?"
|
||||
|
||||
#. Translators: %s is an application name like "Settings"
|
||||
#: js/ui/inhibitShortcutsDialog.js:78
|
||||
#: js/ui/inhibitShortcutsDialog.js:50
|
||||
#, javascript-format
|
||||
msgid "%s wants to inhibit shortcuts"
|
||||
msgstr "%s möchte Tastenkombinationen sperren"
|
||||
|
||||
#: js/ui/inhibitShortcutsDialog.js:79
|
||||
#: js/ui/inhibitShortcutsDialog.js:51
|
||||
msgid "Application wants to inhibit shortcuts"
|
||||
msgstr "Die Anwendung möchte Tastenkombinationen sperren"
|
||||
|
||||
#. Translators: %s is a keyboard shortcut like "Super+x"
|
||||
#: js/ui/inhibitShortcutsDialog.js:88
|
||||
#: js/ui/inhibitShortcutsDialog.js:60
|
||||
#, javascript-format
|
||||
msgid "You can restore shortcuts by pressing %s."
|
||||
msgstr "Sie können Tastenkombinationen durch Drücken von %s wiederherstellen."
|
||||
|
||||
#: js/ui/inhibitShortcutsDialog.js:93
|
||||
#: js/ui/inhibitShortcutsDialog.js:65
|
||||
msgid "Deny"
|
||||
msgstr "Ablehnen"
|
||||
|
||||
#: js/ui/inhibitShortcutsDialog.js:100
|
||||
#: js/ui/inhibitShortcutsDialog.js:71
|
||||
msgid "Allow"
|
||||
msgstr "Zulassen"
|
||||
|
||||
@@ -1371,13 +1376,13 @@ msgid "Leave On"
|
||||
msgstr "Eingeschaltet lassen"
|
||||
|
||||
#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133
|
||||
#: js/ui/status/network.js:1263
|
||||
#: js/ui/status/network.js:1264
|
||||
msgid "Turn On"
|
||||
msgstr "Einschalten"
|
||||
|
||||
#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133
|
||||
#: js/ui/status/network.js:128 js/ui/status/network.js:310
|
||||
#: js/ui/status/network.js:1263 js/ui/status/network.js:1375
|
||||
#: js/ui/status/network.js:1264 js/ui/status/network.js:1376
|
||||
#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79
|
||||
#: js/ui/status/rfkill.js:106
|
||||
msgid "Turn Off"
|
||||
@@ -1387,7 +1392,7 @@ msgstr "Ausschalten"
|
||||
msgid "Leave Off"
|
||||
msgstr "Ausgeschaltet lassen"
|
||||
|
||||
#: js/ui/keyboard.js:200
|
||||
#: js/ui/keyboard.js:203
|
||||
msgid "Region & Language Settings"
|
||||
msgstr "Regions- und Spracheinstellungen"
|
||||
|
||||
@@ -1439,7 +1444,7 @@ msgstr "Quelle zeigen"
|
||||
msgid "Web Page"
|
||||
msgstr "Webseite"
|
||||
|
||||
#: js/ui/messageTray.js:1480
|
||||
#: js/ui/messageTray.js:1474
|
||||
msgid "System Information"
|
||||
msgstr "Systeminformationen"
|
||||
|
||||
@@ -1523,11 +1528,11 @@ msgstr "Beenden"
|
||||
|
||||
#. Translators: If there is no suitable word for "Activities"
|
||||
#. in your language, you can use the word for "Overview".
|
||||
#: js/ui/panel.js:470
|
||||
#: js/ui/panel.js:471
|
||||
msgid "Activities"
|
||||
msgstr "Aktivitäten"
|
||||
|
||||
#: js/ui/panel.js:745
|
||||
#: js/ui/panel.js:746
|
||||
msgctxt "System menu in the top bar"
|
||||
msgid "System"
|
||||
msgstr "System"
|
||||
@@ -1536,6 +1541,15 @@ msgstr "System"
|
||||
msgid "Top Bar"
|
||||
msgstr "Oberes Panel"
|
||||
|
||||
#. Translators: this MUST be either "toggle-switch-us"
|
||||
#. (for toggle switches containing the English words
|
||||
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
|
||||
#. switches containing "◯" and "|"). Other values will
|
||||
#. simply result in invisible toggle switches.
|
||||
#: js/ui/popupMenu.js:285
|
||||
msgid "toggle-switch-us"
|
||||
msgstr "toggle-switch-intl"
|
||||
|
||||
#: js/ui/runDialog.js:64
|
||||
msgid "Enter a Command"
|
||||
msgstr "Bitte geben Sie einen Befehl ein"
|
||||
@@ -1575,7 +1589,7 @@ msgid_plural "%d new notifications"
|
||||
msgstr[0] "%d neue Benachrichtigung"
|
||||
msgstr[1] "%d neue Benachrichtigungen"
|
||||
|
||||
#: js/ui/screenShield.js:449 js/ui/status/system.js:271
|
||||
#: js/ui/screenShield.js:449 js/ui/status/system.js:270
|
||||
msgid "Lock"
|
||||
msgstr "Sperren"
|
||||
|
||||
@@ -1590,11 +1604,11 @@ msgstr "GNOME muss den Bildschirm sperren"
|
||||
#.
|
||||
#. XXX: another option is to kick the user into the gdm login
|
||||
#. screen, where we're not affected by grabs
|
||||
#: js/ui/screenShield.js:826 js/ui/screenShield.js:1299
|
||||
#: js/ui/screenShield.js:834 js/ui/screenShield.js:1307
|
||||
msgid "Unable to lock"
|
||||
msgstr "Sperrung fehlgeschlagen"
|
||||
|
||||
#: js/ui/screenShield.js:827 js/ui/screenShield.js:1300
|
||||
#: js/ui/screenShield.js:835 js/ui/screenShield.js:1308
|
||||
msgid "Lock was blocked by an application"
|
||||
msgstr "Sperrung wurde von einer Anwendung blockiert"
|
||||
|
||||
@@ -1758,7 +1772,7 @@ msgid "<unknown>"
|
||||
msgstr "<Unbekannt>"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:416 js/ui/status/network.js:1292
|
||||
#: js/ui/status/network.js:416 js/ui/status/network.js:1293
|
||||
#, javascript-format
|
||||
msgid "%s Off"
|
||||
msgstr "%s ausgeschaltet"
|
||||
@@ -1784,7 +1798,7 @@ msgid "%s Disconnecting"
|
||||
msgstr "%s wird getrennt"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:434 js/ui/status/network.js:1284
|
||||
#: js/ui/status/network.js:434 js/ui/status/network.js:1285
|
||||
#, javascript-format
|
||||
msgid "%s Connecting"
|
||||
msgstr "%s wird verbunden"
|
||||
@@ -1824,7 +1838,7 @@ msgid "Mobile Broadband Settings"
|
||||
msgstr "Einstellungen der mobilen Breitbandverbindung"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:553 js/ui/status/network.js:1289
|
||||
#: js/ui/status/network.js:553 js/ui/status/network.js:1290
|
||||
#, javascript-format
|
||||
msgid "%s Hardware Disabled"
|
||||
msgstr "%s-Hardware ausgeschaltet"
|
||||
@@ -1896,72 +1910,72 @@ msgid "Wi-Fi Settings"
|
||||
msgstr "Drahtlosnetzwerk-Einstellungen"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:1280
|
||||
#: js/ui/status/network.js:1281
|
||||
#, javascript-format
|
||||
msgid "%s Hotspot Active"
|
||||
msgstr "Hotspot %s eingeschaltet"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:1295
|
||||
#: js/ui/status/network.js:1296
|
||||
#, javascript-format
|
||||
msgid "%s Not Connected"
|
||||
msgstr "%s nicht verbunden"
|
||||
|
||||
#: js/ui/status/network.js:1392
|
||||
#: js/ui/status/network.js:1393
|
||||
msgid "connecting…"
|
||||
msgstr "Verbindungsaufbau …"
|
||||
|
||||
#. Translators: this is for network connections that require some kind of key or password
|
||||
#: js/ui/status/network.js:1395
|
||||
#: js/ui/status/network.js:1396
|
||||
msgid "authentication required"
|
||||
msgstr "Anmeldung erforderlich"
|
||||
|
||||
#: js/ui/status/network.js:1397
|
||||
#: js/ui/status/network.js:1398
|
||||
msgid "connection failed"
|
||||
msgstr "Verbindung gescheitert"
|
||||
|
||||
#: js/ui/status/network.js:1447
|
||||
#: js/ui/status/network.js:1448
|
||||
msgid "VPN Settings"
|
||||
msgstr "VPN-Einstellungen"
|
||||
|
||||
#: js/ui/status/network.js:1464
|
||||
#: js/ui/status/network.js:1465
|
||||
msgid "VPN"
|
||||
msgstr "VPN"
|
||||
|
||||
#: js/ui/status/network.js:1474
|
||||
#: js/ui/status/network.js:1475
|
||||
msgid "VPN Off"
|
||||
msgstr "VPN ausgeschaltet"
|
||||
|
||||
#: js/ui/status/network.js:1535 js/ui/status/rfkill.js:82
|
||||
#: js/ui/status/network.js:1536 js/ui/status/rfkill.js:82
|
||||
msgid "Network Settings"
|
||||
msgstr "Netzwerkeinstellungen"
|
||||
|
||||
#: js/ui/status/network.js:1564
|
||||
#: js/ui/status/network.js:1565
|
||||
#, javascript-format
|
||||
msgid "%s Wired Connection"
|
||||
msgid_plural "%s Wired Connections"
|
||||
msgstr[0] "%s Kabelverbindung"
|
||||
msgstr[1] "%s Kabelverbindungen"
|
||||
|
||||
#: js/ui/status/network.js:1568
|
||||
#: js/ui/status/network.js:1569
|
||||
#, javascript-format
|
||||
msgid "%s Wi-Fi Connection"
|
||||
msgid_plural "%s Wi-Fi Connections"
|
||||
msgstr[0] "%s Funknetzwerkverbindung"
|
||||
msgstr[1] "%s Funknetzwerkverbindungen"
|
||||
|
||||
#: js/ui/status/network.js:1572
|
||||
#: js/ui/status/network.js:1573
|
||||
#, javascript-format
|
||||
msgid "%s Modem Connection"
|
||||
msgid_plural "%s Modem Connections"
|
||||
msgstr[0] "%s Modem-Verbindung"
|
||||
msgstr[1] "%s Modem-Verbindungen"
|
||||
|
||||
#: js/ui/status/network.js:1705
|
||||
#: js/ui/status/network.js:1702
|
||||
msgid "Connection failed"
|
||||
msgstr "Verbindung gescheitert"
|
||||
|
||||
#: js/ui/status/network.js:1706
|
||||
#: js/ui/status/network.js:1703
|
||||
msgid "Activation of network connection failed"
|
||||
msgstr "Aktivierung der Netzwerkverbindung ist gescheitert"
|
||||
|
||||
@@ -2043,15 +2057,15 @@ msgstr "Abmelden"
|
||||
msgid "Account Settings"
|
||||
msgstr "Kontoeinstellungen"
|
||||
|
||||
#: js/ui/status/system.js:256
|
||||
#: js/ui/status/system.js:255
|
||||
msgid "Orientation Lock"
|
||||
msgstr "Hoch-/Querformats-Fixierung"
|
||||
|
||||
#: js/ui/status/system.js:282
|
||||
#: js/ui/status/system.js:281
|
||||
msgid "Suspend"
|
||||
msgstr "Bereitschaft"
|
||||
msgstr "In Bereitschaft versetzen"
|
||||
|
||||
#: js/ui/status/system.js:292
|
||||
#: js/ui/status/system.js:291
|
||||
msgid "Power Off"
|
||||
msgstr "Ausschalten"
|
||||
|
||||
@@ -2169,7 +2183,7 @@ msgstr[1] ""
|
||||
|
||||
#. Translators: This represents the size of a window. The first number is
|
||||
#. * the width of the window and the second is the height.
|
||||
#: js/ui/windowManager.js:677
|
||||
#: js/ui/windowManager.js:662
|
||||
#, javascript-format
|
||||
msgid "%d × %d"
|
||||
msgstr "%d × %d"
|
||||
@@ -2242,6 +2256,11 @@ msgstr "Auf den Bildschirm nach rechts verschieben"
|
||||
msgid "Evolution Calendar"
|
||||
msgstr "Evolution-Kalender"
|
||||
|
||||
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
|
||||
#: src/calendar-server/evolution-calendar.desktop.in:6
|
||||
msgid "evolution"
|
||||
msgstr "evolution"
|
||||
|
||||
#: src/main.c:408
|
||||
msgid "Print version"
|
||||
msgstr "Version ausgeben"
|
||||
@@ -2260,12 +2279,12 @@ msgstr ""
|
||||
msgid "List possible modes"
|
||||
msgstr "Die möglichen Modi auflisten"
|
||||
|
||||
#: src/shell-app.c:264
|
||||
#: src/shell-app.c:260
|
||||
msgctxt "program"
|
||||
msgid "Unknown"
|
||||
msgstr "Unbekannt"
|
||||
|
||||
#: src/shell-app.c:515
|
||||
#: src/shell-app.c:511
|
||||
#, c-format
|
||||
msgid "Failed to launch “%s”"
|
||||
msgstr "»%s« konnte nicht gestartet werden"
|
||||
@@ -2304,15 +2323,6 @@ msgstr[1] "%u Eingänge"
|
||||
msgid "System Sounds"
|
||||
msgstr "Systemklänge"
|
||||
|
||||
#~ msgid "network-workgroup"
|
||||
#~ msgstr "network-workgroup"
|
||||
|
||||
#~ msgid "toggle-switch-us"
|
||||
#~ msgstr "toggle-switch-intl"
|
||||
|
||||
#~ msgid "evolution"
|
||||
#~ msgstr "evolution"
|
||||
|
||||
#~ msgid "There was an error loading the preferences dialog for %s:"
|
||||
#~ msgstr ""
|
||||
#~ "Beim Laden des Einstellungsdialogs für %s ist ein Fehler aufgetreten:"
|
||||
|
1043
po/en_GB.po
224
po/eo.po
@@ -6,22 +6,22 @@
|
||||
# Daniel PUENTES <blatberk@openmailbox.org>, 2015.
|
||||
# Nicolas MAIA < >, 2015.
|
||||
# Kristjan SCHMIDT <kristjan.schmidt@googlemail.com>, 2011, 2012, 2015, 2016, 2018.
|
||||
# Carmen Bianca BAKKER <carmen@carmenbianca.eu>, 2018-2019.
|
||||
# Carmen Bianca BAKKER <carmen@carmenbianca.eu>, 2018, 2019.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell master\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
|
||||
"POT-Creation-Date: 2019-05-08 17:45+0000\n"
|
||||
"PO-Revision-Date: 2019-05-09 20:12+0200\n"
|
||||
"POT-Creation-Date: 2019-02-21 18:43+0000\n"
|
||||
"PO-Revision-Date: 2019-02-22 13:19+0100\n"
|
||||
"Last-Translator: Carmen Bianca BAKKER <carmen@carmenbianca.eu>\n"
|
||||
"Language-Team: Esperanto <gnome-eo-list@gnome.org>\n"
|
||||
"Language: eo\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: Gtranslator 3.32.0\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Poedit 2.2.1\n"
|
||||
"X-DamnedLies-Scope: partial\n"
|
||||
"X-Project-Style: gnome\n"
|
||||
|
||||
@@ -185,8 +185,8 @@ msgstr "Klavkombino por malfermi la “Montri aplikaĵojn”-vidon"
|
||||
msgid ""
|
||||
"Keybinding to open the “Show Applications” view of the Activities Overview."
|
||||
msgstr ""
|
||||
"Klavkombino por malfermi la “Montri aplikaĵojn” vidon de la Aktivecoj-"
|
||||
"Superrigardo."
|
||||
"Klavkombino por malfermi la “Montri aplikaĵojn” vidon de la aktivecoj "
|
||||
"superrigardo."
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:124
|
||||
msgid "Keybinding to open the overview"
|
||||
@@ -194,7 +194,7 @@ msgstr "Klavkombino por malfermi la superrigardon"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:125
|
||||
msgid "Keybinding to open the Activities Overview."
|
||||
msgstr "Klavkombino por malfermi la Aktivecoj-Superrigardon."
|
||||
msgstr "Klavkombino por malfermi la aktivecoj superrigardon."
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:131
|
||||
msgid "Keybinding to toggle the visibility of the notification list"
|
||||
@@ -334,6 +334,11 @@ msgstr "En musa reĝimo, prokrasti ŝanĝi fokuson ĝis la musmontrilo haltas"
|
||||
msgid "Network Login"
|
||||
msgstr "Reta saluto"
|
||||
|
||||
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
|
||||
#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9
|
||||
msgid "network-workgroup"
|
||||
msgstr "network-workgroup"
|
||||
|
||||
#: js/extensionPrefs/main.js:116
|
||||
msgid "Something’s gone wrong"
|
||||
msgstr "Io fiaskis"
|
||||
@@ -383,7 +388,7 @@ msgstr "Foliumi en Programaro"
|
||||
#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55
|
||||
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136
|
||||
#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188
|
||||
#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:889
|
||||
#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888
|
||||
msgid "Cancel"
|
||||
msgstr "Nuligi"
|
||||
|
||||
@@ -414,7 +419,7 @@ msgstr "Ĉu ne en listo?"
|
||||
|
||||
#. Translators: this message is shown below the username entry field
|
||||
#. to clue the user in on how to login to the local network realm
|
||||
#: js/gdm/loginDialog.js:884
|
||||
#: js/gdm/loginDialog.js:880
|
||||
#, javascript-format
|
||||
msgid "(e.g., user or %s)"
|
||||
msgstr "(ekzemple, uzanto aŭ %s)"
|
||||
@@ -422,12 +427,12 @@ msgstr "(ekzemple, uzanto aŭ %s)"
|
||||
#. TTLS and PEAP are actually much more complicated, but this complication
|
||||
#. is not visible here since we only care about phase2 authentication
|
||||
#. (and don't even care of which one)
|
||||
#: js/gdm/loginDialog.js:889 js/ui/components/networkAgent.js:243
|
||||
#: js/gdm/loginDialog.js:885 js/ui/components/networkAgent.js:243
|
||||
#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281
|
||||
msgid "Username: "
|
||||
msgstr "Uzantonomo: "
|
||||
|
||||
#: js/gdm/loginDialog.js:1227
|
||||
#: js/gdm/loginDialog.js:1223
|
||||
msgid "Login Window"
|
||||
msgstr "Salutfenestro"
|
||||
|
||||
@@ -681,37 +686,32 @@ msgstr "Oftaj"
|
||||
msgid "All"
|
||||
msgstr "Ĉiuj"
|
||||
|
||||
#. Translators: This is the heading of a list of open windows
|
||||
#: js/ui/appDisplay.js:1713 js/ui/panel.js:79
|
||||
msgid "Open Windows"
|
||||
msgstr "Malfermaj fenestroj"
|
||||
|
||||
#: js/ui/appDisplay.js:1732 js/ui/panel.js:86
|
||||
#: js/ui/appDisplay.js:1737 js/ui/panel.js:83
|
||||
msgid "New Window"
|
||||
msgstr "Nova fenestro"
|
||||
|
||||
#: js/ui/appDisplay.js:1746
|
||||
#: js/ui/appDisplay.js:1751
|
||||
msgid "Launch using Dedicated Graphics Card"
|
||||
msgstr "Lanĉi uzante dediĉitan vidkarton"
|
||||
|
||||
#: js/ui/appDisplay.js:1773 js/ui/dash.js:239
|
||||
#: js/ui/appDisplay.js:1778 js/ui/dash.js:239
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Forigi el preferataj"
|
||||
|
||||
#: js/ui/appDisplay.js:1779
|
||||
#: js/ui/appDisplay.js:1784
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Aldoni al preferataj"
|
||||
|
||||
#: js/ui/appDisplay.js:1789 js/ui/panel.js:97
|
||||
#: js/ui/appDisplay.js:1794 js/ui/panel.js:94
|
||||
msgid "Show Details"
|
||||
msgstr "Montri detalojn"
|
||||
|
||||
#: js/ui/appFavorites.js:149
|
||||
#: js/ui/appFavorites.js:141
|
||||
#, javascript-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "%s estas aldonita de via preferataj aplikaĵoj."
|
||||
|
||||
#: js/ui/appFavorites.js:183
|
||||
#: js/ui/appFavorites.js:175
|
||||
#, javascript-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s estas forigita de via preferataj aplikaĵoj."
|
||||
@@ -919,7 +919,7 @@ msgstr ""
|
||||
"Alternative vi povas konekti per premi la “WPS”-butonon de via enkursigilo."
|
||||
|
||||
#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219
|
||||
#: js/ui/status/network.js:310 js/ui/status/network.js:892
|
||||
#: js/ui/status/network.js:309 js/ui/status/network.js:891
|
||||
msgid "Connect"
|
||||
msgstr "Konekti"
|
||||
|
||||
@@ -949,7 +949,7 @@ msgstr "Servo: "
|
||||
|
||||
#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685
|
||||
msgid "Authentication required by wireless network"
|
||||
msgstr "Sendrata reto bezonas aŭtentigon"
|
||||
msgstr "Aŭtentigo estas bezonata de sendrata reto"
|
||||
|
||||
#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686
|
||||
#, javascript-format
|
||||
@@ -977,7 +977,7 @@ msgstr "PIN-kodo bezonata"
|
||||
|
||||
#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700
|
||||
msgid "PIN code is needed for the mobile broadband device"
|
||||
msgstr "PIN-kodo necesas por la portebla larĝkapacita aparato"
|
||||
msgstr "PIN-kodo estas bezonata por la portebla larĝkapacita aparato"
|
||||
|
||||
#: js/ui/components/networkAgent.js:333
|
||||
msgid "PIN: "
|
||||
@@ -991,7 +991,7 @@ msgstr "Portebla larĝkapacita retopasvorto"
|
||||
#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707
|
||||
#, javascript-format
|
||||
msgid "A password is required to connect to “%s”."
|
||||
msgstr "Pasvorto necesas por konekti al “%s”."
|
||||
msgstr "Pasvorto estas bezonata por konekti al “%s”."
|
||||
|
||||
#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665
|
||||
msgid "Network Manager"
|
||||
@@ -1065,23 +1065,23 @@ msgstr "Aldoni mondajn horloĝojn…"
|
||||
msgid "World Clocks"
|
||||
msgstr "Mondaj horloĝoj"
|
||||
|
||||
#: js/ui/dateMenu.js:228
|
||||
#: js/ui/dateMenu.js:222
|
||||
msgid "Weather"
|
||||
msgstr "Vetero"
|
||||
|
||||
#: js/ui/dateMenu.js:311
|
||||
#: js/ui/dateMenu.js:305
|
||||
msgid "Select a location…"
|
||||
msgstr "Elekti lokon…"
|
||||
|
||||
#: js/ui/dateMenu.js:319
|
||||
#: js/ui/dateMenu.js:313
|
||||
msgid "Loading…"
|
||||
msgstr "Ŝargante…"
|
||||
|
||||
#: js/ui/dateMenu.js:329
|
||||
#: js/ui/dateMenu.js:323
|
||||
msgid "Go online for weather information"
|
||||
msgstr "Enretigi por veterinformoj"
|
||||
|
||||
#: js/ui/dateMenu.js:331
|
||||
#: js/ui/dateMenu.js:325
|
||||
msgid "Weather information is currently unavailable"
|
||||
msgstr "Veterinformoj ĉimomente nehaveblas"
|
||||
|
||||
@@ -1240,26 +1240,26 @@ msgid "Download and install “%s” from extensions.gnome.org?"
|
||||
msgstr "Ĉu elŝuti kaj instali “%s” de extensions.gnome.org?"
|
||||
|
||||
#. Translators: %s is an application name like "Settings"
|
||||
#: js/ui/inhibitShortcutsDialog.js:78
|
||||
#: js/ui/inhibitShortcutsDialog.js:50
|
||||
#, javascript-format
|
||||
msgid "%s wants to inhibit shortcuts"
|
||||
msgstr "%s volas malebligi klavkombinojn"
|
||||
|
||||
#: js/ui/inhibitShortcutsDialog.js:79
|
||||
#: js/ui/inhibitShortcutsDialog.js:51
|
||||
msgid "Application wants to inhibit shortcuts"
|
||||
msgstr "Aplikaĵo volas malebligi klavkombinojn"
|
||||
|
||||
#. Translators: %s is a keyboard shortcut like "Super+x"
|
||||
#: js/ui/inhibitShortcutsDialog.js:88
|
||||
#: js/ui/inhibitShortcutsDialog.js:60
|
||||
#, javascript-format
|
||||
msgid "You can restore shortcuts by pressing %s."
|
||||
msgstr "Vi povas restaŭri klavkombinojn per premi %s."
|
||||
|
||||
#: js/ui/inhibitShortcutsDialog.js:93
|
||||
#: js/ui/inhibitShortcutsDialog.js:65
|
||||
msgid "Deny"
|
||||
msgstr "Rifuzi"
|
||||
|
||||
#: js/ui/inhibitShortcutsDialog.js:100
|
||||
#: js/ui/inhibitShortcutsDialog.js:71
|
||||
msgid "Allow"
|
||||
msgstr "Akcepti"
|
||||
|
||||
@@ -1315,7 +1315,7 @@ msgid "Turn On"
|
||||
msgstr "Ŝalti"
|
||||
|
||||
#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133
|
||||
#: js/ui/status/network.js:128 js/ui/status/network.js:311
|
||||
#: js/ui/status/network.js:128 js/ui/status/network.js:310
|
||||
#: js/ui/status/network.js:1264 js/ui/status/network.js:1376
|
||||
#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79
|
||||
#: js/ui/status/rfkill.js:106
|
||||
@@ -1326,59 +1326,59 @@ msgstr "Malŝalti"
|
||||
msgid "Leave Off"
|
||||
msgstr "Lasi malŝaltita"
|
||||
|
||||
#: js/ui/keyboard.js:200
|
||||
#: js/ui/keyboard.js:203
|
||||
msgid "Region & Language Settings"
|
||||
msgstr "Regiono & lingvo agordoj"
|
||||
|
||||
#: js/ui/lookingGlass.js:615
|
||||
#: js/ui/lookingGlass.js:614
|
||||
msgid "No extensions installed"
|
||||
msgstr "Neniu kromprogramo instalita"
|
||||
|
||||
#. Translators: argument is an extension UUID.
|
||||
#: js/ui/lookingGlass.js:669
|
||||
#: js/ui/lookingGlass.js:668
|
||||
#, javascript-format
|
||||
msgid "%s has not emitted any errors."
|
||||
msgstr "%s ne eligintaj ajnaj eraroj."
|
||||
|
||||
#: js/ui/lookingGlass.js:675
|
||||
#: js/ui/lookingGlass.js:674
|
||||
msgid "Hide Errors"
|
||||
msgstr "Kaŝi erarojn"
|
||||
|
||||
#: js/ui/lookingGlass.js:679 js/ui/lookingGlass.js:739
|
||||
#: js/ui/lookingGlass.js:678 js/ui/lookingGlass.js:738
|
||||
msgid "Show Errors"
|
||||
msgstr "Montri erarojn"
|
||||
|
||||
#: js/ui/lookingGlass.js:688
|
||||
#: js/ui/lookingGlass.js:687
|
||||
msgid "Enabled"
|
||||
msgstr "Enŝaltita"
|
||||
|
||||
#. translators:
|
||||
#. * The device has been disabled
|
||||
#: js/ui/lookingGlass.js:691 subprojects/gvc/gvc-mixer-control.c:1864
|
||||
#: js/ui/lookingGlass.js:690 subprojects/gvc/gvc-mixer-control.c:1866
|
||||
msgid "Disabled"
|
||||
msgstr "Elŝaltita"
|
||||
|
||||
#: js/ui/lookingGlass.js:693
|
||||
#: js/ui/lookingGlass.js:692
|
||||
msgid "Error"
|
||||
msgstr "Eraro"
|
||||
|
||||
#: js/ui/lookingGlass.js:695
|
||||
#: js/ui/lookingGlass.js:694
|
||||
msgid "Out of date"
|
||||
msgstr "Neaktuala"
|
||||
|
||||
#: js/ui/lookingGlass.js:697
|
||||
#: js/ui/lookingGlass.js:696
|
||||
msgid "Downloading"
|
||||
msgstr "Elŝutante"
|
||||
|
||||
#: js/ui/lookingGlass.js:721
|
||||
#: js/ui/lookingGlass.js:720
|
||||
msgid "View Source"
|
||||
msgstr "Montri fonton"
|
||||
|
||||
#: js/ui/lookingGlass.js:730
|
||||
#: js/ui/lookingGlass.js:729
|
||||
msgid "Web Page"
|
||||
msgstr "Retpaĝo"
|
||||
|
||||
#: js/ui/messageTray.js:1479
|
||||
#: js/ui/messageTray.js:1474
|
||||
msgid "System Information"
|
||||
msgstr "Sisteminformoj"
|
||||
|
||||
@@ -1404,14 +1404,13 @@ msgstr "Malfari"
|
||||
msgid "Overview"
|
||||
msgstr "Superrigardo"
|
||||
|
||||
# Imperativo
|
||||
#. Translators: this is the text displayed
|
||||
#. in the search entry when no search is
|
||||
#. active; it should not exceed ~30
|
||||
#. characters.
|
||||
#: js/ui/overview.js:226
|
||||
msgid "Type to search…"
|
||||
msgstr "Tajpu por serĉi…"
|
||||
msgstr "Tajpi por serĉi…"
|
||||
|
||||
#: js/ui/padOsd.js:92
|
||||
msgid "New shortcut…"
|
||||
@@ -1457,17 +1456,17 @@ msgstr "Premu Esk-klavon por ĉesi"
|
||||
msgid "Press any key to exit"
|
||||
msgstr "Premu iun ajn klavon por ĉesi"
|
||||
|
||||
#: js/ui/panel.js:113
|
||||
#: js/ui/panel.js:108
|
||||
msgid "Quit"
|
||||
msgstr "Ĉesi"
|
||||
|
||||
#. Translators: If there is no suitable word for "Activities"
|
||||
#. in your language, you can use the word for "Overview".
|
||||
#: js/ui/panel.js:468
|
||||
#: js/ui/panel.js:466
|
||||
msgid "Activities"
|
||||
msgstr "Aktivecoj"
|
||||
|
||||
#: js/ui/panel.js:743
|
||||
#: js/ui/panel.js:741
|
||||
msgctxt "System menu in the top bar"
|
||||
msgid "System"
|
||||
msgstr "Sistemo"
|
||||
@@ -1476,6 +1475,15 @@ msgstr "Sistemo"
|
||||
msgid "Top Bar"
|
||||
msgstr "Supra breto"
|
||||
|
||||
#. Translators: this MUST be either "toggle-switch-us"
|
||||
#. (for toggle switches containing the English words
|
||||
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
|
||||
#. switches containing "◯" and "|"). Other values will
|
||||
#. simply result in invisible toggle switches.
|
||||
#: js/ui/popupMenu.js:285
|
||||
msgid "toggle-switch-us"
|
||||
msgstr "toggle-switch-intl"
|
||||
|
||||
#: js/ui/runDialog.js:64
|
||||
msgid "Enter a Command"
|
||||
msgstr "Enigu komandon"
|
||||
@@ -1512,7 +1520,7 @@ msgid_plural "%d new notifications"
|
||||
msgstr[0] "%d nova sciigo"
|
||||
msgstr[1] "%d novaj sciigoj"
|
||||
|
||||
#: js/ui/screenShield.js:449 js/ui/status/system.js:271
|
||||
#: js/ui/screenShield.js:449 js/ui/status/system.js:270
|
||||
msgid "Lock"
|
||||
msgstr "Ŝlosi"
|
||||
|
||||
@@ -1527,11 +1535,11 @@ msgstr "GNOME bezonas ŝlosi la ekranon"
|
||||
#.
|
||||
#. XXX: another option is to kick the user into the gdm login
|
||||
#. screen, where we're not affected by grabs
|
||||
#: js/ui/screenShield.js:826 js/ui/screenShield.js:1299
|
||||
#: js/ui/screenShield.js:834 js/ui/screenShield.js:1307
|
||||
msgid "Unable to lock"
|
||||
msgstr "Ne eblas ŝlosi"
|
||||
|
||||
#: js/ui/screenShield.js:827 js/ui/screenShield.js:1300
|
||||
#: js/ui/screenShield.js:835 js/ui/screenShield.js:1308
|
||||
msgid "Lock was blocked by an application"
|
||||
msgstr "Ŝloso estis blokita de aplikaĵo"
|
||||
|
||||
@@ -1610,11 +1618,11 @@ msgstr "Saltaj klavoj"
|
||||
msgid "Mouse Keys"
|
||||
msgstr "Musklavoj"
|
||||
|
||||
#: js/ui/status/accessibility.js:135
|
||||
#: js/ui/status/accessibility.js:151
|
||||
msgid "High Contrast"
|
||||
msgstr "Alta kontrasto"
|
||||
|
||||
#: js/ui/status/accessibility.js:177
|
||||
#: js/ui/status/accessibility.js:182
|
||||
msgid "Large Text"
|
||||
msgstr "Granda teksto"
|
||||
|
||||
@@ -1622,7 +1630,7 @@ msgstr "Granda teksto"
|
||||
msgid "Bluetooth"
|
||||
msgstr "Bludento"
|
||||
|
||||
#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:586
|
||||
#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585
|
||||
msgid "Bluetooth Settings"
|
||||
msgstr "Bludento-agordoj"
|
||||
|
||||
@@ -1693,13 +1701,13 @@ msgid "<unknown>"
|
||||
msgstr "<nekonata>"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:417 js/ui/status/network.js:1293
|
||||
#: js/ui/status/network.js:416 js/ui/status/network.js:1293
|
||||
#, javascript-format
|
||||
msgid "%s Off"
|
||||
msgstr "%s malŝaltita"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:420
|
||||
#: js/ui/status/network.js:419
|
||||
#, javascript-format
|
||||
msgid "%s Connected"
|
||||
msgstr "%s konektita"
|
||||
@@ -1707,119 +1715,119 @@ msgstr "%s konektita"
|
||||
#. Translators: this is for network devices that are physically present but are not
|
||||
#. under NetworkManager's control (and thus cannot be used in the menu);
|
||||
#. %s is a network identifier
|
||||
#: js/ui/status/network.js:425
|
||||
#: js/ui/status/network.js:424
|
||||
#, javascript-format
|
||||
msgid "%s Unmanaged"
|
||||
msgstr "%s nemastrumita"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:428
|
||||
#: js/ui/status/network.js:427
|
||||
#, javascript-format
|
||||
msgid "%s Disconnecting"
|
||||
msgstr "%s malkonektante"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:435 js/ui/status/network.js:1285
|
||||
#: js/ui/status/network.js:434 js/ui/status/network.js:1285
|
||||
#, javascript-format
|
||||
msgid "%s Connecting"
|
||||
msgstr "%s konektante"
|
||||
|
||||
#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier
|
||||
#: js/ui/status/network.js:438
|
||||
#: js/ui/status/network.js:437
|
||||
#, javascript-format
|
||||
msgid "%s Requires Authentication"
|
||||
msgstr "%s postulas aŭtentigon"
|
||||
|
||||
#. Translators: this is for devices that require some kind of firmware or kernel
|
||||
#. module, which is missing; %s is a network identifier
|
||||
#: js/ui/status/network.js:446
|
||||
#: js/ui/status/network.js:445
|
||||
#, javascript-format
|
||||
msgid "Firmware Missing For %s"
|
||||
msgstr "Mikroprogramo mankas por %s"
|
||||
|
||||
#. Translators: this is for a network device that cannot be activated (for example it
|
||||
#. is disabled by rfkill, or it has no coverage; %s is a network identifier
|
||||
#: js/ui/status/network.js:450
|
||||
#: js/ui/status/network.js:449
|
||||
#, javascript-format
|
||||
msgid "%s Unavailable"
|
||||
msgstr "%s nedisponebla"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:453
|
||||
#: js/ui/status/network.js:452
|
||||
#, javascript-format
|
||||
msgid "%s Connection Failed"
|
||||
msgstr "%s konekto malsukcesis"
|
||||
|
||||
#: js/ui/status/network.js:465
|
||||
#: js/ui/status/network.js:464
|
||||
msgid "Wired Settings"
|
||||
msgstr "Drataj agordoj"
|
||||
|
||||
#: js/ui/status/network.js:507
|
||||
#: js/ui/status/network.js:506
|
||||
msgid "Mobile Broadband Settings"
|
||||
msgstr "Porteblaj larĝkapacitaj agordoj"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:554 js/ui/status/network.js:1290
|
||||
#: js/ui/status/network.js:553 js/ui/status/network.js:1290
|
||||
#, javascript-format
|
||||
msgid "%s Hardware Disabled"
|
||||
msgstr "%s aparataro malŝaltita"
|
||||
|
||||
#. Translators: this is for a network device that cannot be activated
|
||||
#. because it's disabled by rfkill (airplane mode); %s is a network identifier
|
||||
#: js/ui/status/network.js:558
|
||||
#: js/ui/status/network.js:557
|
||||
#, javascript-format
|
||||
msgid "%s Disabled"
|
||||
msgstr "%s malŝaltita"
|
||||
|
||||
#: js/ui/status/network.js:598
|
||||
#: js/ui/status/network.js:597
|
||||
msgid "Connect to Internet"
|
||||
msgstr "Konekti al interreto"
|
||||
|
||||
#: js/ui/status/network.js:787
|
||||
#: js/ui/status/network.js:786
|
||||
msgid "Airplane Mode is On"
|
||||
msgstr "Aviadila reĝimo ŝaltita"
|
||||
|
||||
#: js/ui/status/network.js:788
|
||||
#: js/ui/status/network.js:787
|
||||
msgid "Wi-Fi is disabled when airplane mode is on."
|
||||
msgstr "Vifio malebliĝas se aviadila reĝimo estas ŝaltita."
|
||||
|
||||
#: js/ui/status/network.js:789
|
||||
#: js/ui/status/network.js:788
|
||||
msgid "Turn Off Airplane Mode"
|
||||
msgstr "Malŝalti aviadilan reĝimon"
|
||||
|
||||
#: js/ui/status/network.js:798
|
||||
#: js/ui/status/network.js:797
|
||||
msgid "Wi-Fi is Off"
|
||||
msgstr "Vifio malŝaltita"
|
||||
|
||||
#: js/ui/status/network.js:799
|
||||
#: js/ui/status/network.js:798
|
||||
msgid "Wi-Fi needs to be turned on in order to connect to a network."
|
||||
msgstr "Necesas ŝalti vifion por konekti al reto."
|
||||
|
||||
#: js/ui/status/network.js:800
|
||||
#: js/ui/status/network.js:799
|
||||
msgid "Turn On Wi-Fi"
|
||||
msgstr "Ŝalti vifion"
|
||||
|
||||
#: js/ui/status/network.js:825
|
||||
#: js/ui/status/network.js:824
|
||||
msgid "Wi-Fi Networks"
|
||||
msgstr "Vifiaj retoj"
|
||||
|
||||
#: js/ui/status/network.js:827
|
||||
#: js/ui/status/network.js:826
|
||||
msgid "Select a network"
|
||||
msgstr "Elekti reton"
|
||||
|
||||
#: js/ui/status/network.js:856
|
||||
#: js/ui/status/network.js:855
|
||||
msgid "No Networks"
|
||||
msgstr "Neniu reto"
|
||||
|
||||
#: js/ui/status/network.js:877 js/ui/status/rfkill.js:104
|
||||
#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104
|
||||
msgid "Use hardware switch to turn off"
|
||||
msgstr "Uzi aparataran ŝaltilon por malŝalti"
|
||||
|
||||
#: js/ui/status/network.js:1153
|
||||
#: js/ui/status/network.js:1152
|
||||
msgid "Select Network"
|
||||
msgstr "Elekti reton"
|
||||
|
||||
#: js/ui/status/network.js:1159
|
||||
#: js/ui/status/network.js:1158
|
||||
msgid "Wi-Fi Settings"
|
||||
msgstr "Vifio-agordoj"
|
||||
|
||||
@@ -1833,7 +1841,7 @@ msgstr "%s retkaptejo aktiva"
|
||||
#: js/ui/status/network.js:1296
|
||||
#, javascript-format
|
||||
msgid "%s Not Connected"
|
||||
msgstr "%s ne konektita"
|
||||
msgstr "%s nekonektita"
|
||||
|
||||
#: js/ui/status/network.js:1393
|
||||
msgid "connecting…"
|
||||
@@ -1885,11 +1893,11 @@ msgid_plural "%s Modem Connections"
|
||||
msgstr[0] "%s modema konekto"
|
||||
msgstr[1] "%s modemaj konektoj"
|
||||
|
||||
#: js/ui/status/network.js:1706
|
||||
#: js/ui/status/network.js:1702
|
||||
msgid "Connection failed"
|
||||
msgstr "Konekto malsukcesis"
|
||||
|
||||
#: js/ui/status/network.js:1707
|
||||
#: js/ui/status/network.js:1703
|
||||
msgid "Activation of network connection failed"
|
||||
msgstr "Aktivigo de reto-konekto malsukcesis"
|
||||
|
||||
@@ -1971,15 +1979,15 @@ msgstr "Adiaŭi"
|
||||
msgid "Account Settings"
|
||||
msgstr "Kontoagordoj"
|
||||
|
||||
#: js/ui/status/system.js:256
|
||||
#: js/ui/status/system.js:255
|
||||
msgid "Orientation Lock"
|
||||
msgstr "Orientiĝa ŝloso"
|
||||
|
||||
#: js/ui/status/system.js:282
|
||||
#: js/ui/status/system.js:281
|
||||
msgid "Suspend"
|
||||
msgstr "Dormeti"
|
||||
|
||||
#: js/ui/status/system.js:292
|
||||
#: js/ui/status/system.js:291
|
||||
msgid "Power Off"
|
||||
msgstr "Malŝalti"
|
||||
|
||||
@@ -2094,7 +2102,7 @@ msgstr[1] "Agordaj ŝanĝoj malfaritos post %d sekundoj"
|
||||
|
||||
#. Translators: This represents the size of a window. The first number is
|
||||
#. * the width of the window and the second is the height.
|
||||
#: js/ui/windowManager.js:677
|
||||
#: js/ui/windowManager.js:662
|
||||
#, javascript-format
|
||||
msgid "%d × %d"
|
||||
msgstr "%d × %d"
|
||||
@@ -2167,6 +2175,11 @@ msgstr "Movi al dekstra ekrano"
|
||||
msgid "Evolution Calendar"
|
||||
msgstr "Evolucio-kalendaro"
|
||||
|
||||
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
|
||||
#: src/calendar-server/evolution-calendar.desktop.in:6
|
||||
msgid "evolution"
|
||||
msgstr "evolution"
|
||||
|
||||
#: src/main.c:408
|
||||
msgid "Print version"
|
||||
msgstr "Presi version"
|
||||
@@ -2183,12 +2196,12 @@ msgstr "Uzi specifan reĝimon, ekz. “gdm” por la salut-ekrano"
|
||||
msgid "List possible modes"
|
||||
msgstr "Listigi eblajn reĝimojn"
|
||||
|
||||
#: src/shell-app.c:264
|
||||
#: src/shell-app.c:260
|
||||
msgctxt "program"
|
||||
msgid "Unknown"
|
||||
msgstr "Nekonata"
|
||||
|
||||
#: src/shell-app.c:515
|
||||
#: src/shell-app.c:511
|
||||
#, c-format
|
||||
msgid "Failed to launch “%s”"
|
||||
msgstr "Malsukcesis lanĉi “%s”"
|
||||
@@ -2207,7 +2220,7 @@ msgstr "La uzanto malakceptis la aŭtentigan dialogon"
|
||||
|
||||
#. translators:
|
||||
#. * The number of sound outputs on a particular device
|
||||
#: subprojects/gvc/gvc-mixer-control.c:1871
|
||||
#: subprojects/gvc/gvc-mixer-control.c:1873
|
||||
#, c-format
|
||||
msgid "%u Output"
|
||||
msgid_plural "%u Outputs"
|
||||
@@ -2216,26 +2229,17 @@ msgstr[1] "%u eligoj"
|
||||
|
||||
#. translators:
|
||||
#. * The number of sound inputs on a particular device
|
||||
#: subprojects/gvc/gvc-mixer-control.c:1881
|
||||
#: subprojects/gvc/gvc-mixer-control.c:1883
|
||||
#, c-format
|
||||
msgid "%u Input"
|
||||
msgid_plural "%u Inputs"
|
||||
msgstr[0] "%u enigo"
|
||||
msgstr[1] "%u enigoj"
|
||||
|
||||
#: subprojects/gvc/gvc-mixer-control.c:2736
|
||||
#: subprojects/gvc/gvc-mixer-control.c:2738
|
||||
msgid "System Sounds"
|
||||
msgstr "Sistemsonoj"
|
||||
|
||||
#~ msgid "toggle-switch-us"
|
||||
#~ msgstr "toggle-switch-intl"
|
||||
|
||||
#~ msgid "network-workgroup"
|
||||
#~ msgstr "network-workgroup"
|
||||
|
||||
#~ msgid "evolution"
|
||||
#~ msgstr "evolution"
|
||||
|
||||
#~ msgid "There was an error loading the preferences dialog for %s:"
|
||||
#~ msgstr "Eraro okazis dum ŝarĝado de la agorda dialogo de %s:"
|
||||
|
||||
|
114
po/fr.po
@@ -14,23 +14,23 @@
|
||||
# Alain Lojewski <allomervan@gmail.com>, 2014-2018.
|
||||
# Erwan Georget <egeorget@opmbx.org>, 2016.
|
||||
# Claude Paroz <claude@2xlibre.net>, 2010-2011, 2016.
|
||||
# Charles Monzat <charles.monzat@numericable.fr>, 2016-2018.
|
||||
# Julien Humbert <julroy67@gmail.com>, 2019.
|
||||
# Charles Monzat <charles.monzat@free.fr>, 2016-2019.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell master fr\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
|
||||
"POT-Creation-Date: 2019-03-13 20:47+0000\n"
|
||||
"PO-Revision-Date: 2019-03-17 19:15+0100\n"
|
||||
"Last-Translator: Charles Monzat <charles.monzat@free.fr>\n"
|
||||
"Language-Team: GNOME French Team <gnomefr@traduc.org>\n"
|
||||
"POT-Creation-Date: 2019-02-28 03:16+0000\n"
|
||||
"PO-Revision-Date: 2019-02-28 08:29+0100\n"
|
||||
"Last-Translator: Julien Humbert <julroy67@gmail.com>\n"
|
||||
"Language-Team: français <gnomefr@traduc.org>\n"
|
||||
"Language: fr\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: Gtranslator 3.32.0\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
"X-Generator: Poedit 2.2.1\n"
|
||||
|
||||
#: data/50-gnome-shell-system.xml:6
|
||||
msgid "System"
|
||||
@@ -482,7 +482,7 @@ msgstr "Absent de la liste ?"
|
||||
|
||||
#. Translators: this message is shown below the username entry field
|
||||
#. to clue the user in on how to login to the local network realm
|
||||
#: js/gdm/loginDialog.js:884
|
||||
#: js/gdm/loginDialog.js:880
|
||||
#, javascript-format
|
||||
msgid "(e.g., user or %s)"
|
||||
msgstr "(par ex. utilisateur ou %s)"
|
||||
@@ -490,12 +490,12 @@ msgstr "(par ex. utilisateur ou %s)"
|
||||
#. TTLS and PEAP are actually much more complicated, but this complication
|
||||
#. is not visible here since we only care about phase2 authentication
|
||||
#. (and don't even care of which one)
|
||||
#: js/gdm/loginDialog.js:889 js/ui/components/networkAgent.js:243
|
||||
#: js/gdm/loginDialog.js:885 js/ui/components/networkAgent.js:243
|
||||
#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281
|
||||
msgid "Username: "
|
||||
msgstr "Nom d’utilisateur : "
|
||||
|
||||
#: js/gdm/loginDialog.js:1227
|
||||
#: js/gdm/loginDialog.js:1223
|
||||
msgid "Login Window"
|
||||
msgstr "Fenêtre de connexion"
|
||||
|
||||
@@ -1075,7 +1075,7 @@ msgstr "Mot de passe de la connexion mobile"
|
||||
msgid "A password is required to connect to “%s”."
|
||||
msgstr "Un mot de passe est requis pour se connecter à « %s »."
|
||||
|
||||
#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1664
|
||||
#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665
|
||||
msgid "Network Manager"
|
||||
msgstr "Gestionnaire de réseau"
|
||||
|
||||
@@ -1335,26 +1335,26 @@ msgid "Download and install “%s” from extensions.gnome.org?"
|
||||
msgstr "Télécharger et installer « %s » à partir de extensions.gnome.org ?"
|
||||
|
||||
#. Translators: %s is an application name like "Settings"
|
||||
#: js/ui/inhibitShortcutsDialog.js:78
|
||||
#: js/ui/inhibitShortcutsDialog.js:50
|
||||
#, javascript-format
|
||||
msgid "%s wants to inhibit shortcuts"
|
||||
msgstr "%s veut neutraliser les raccourcis"
|
||||
|
||||
#: js/ui/inhibitShortcutsDialog.js:79
|
||||
#: js/ui/inhibitShortcutsDialog.js:51
|
||||
msgid "Application wants to inhibit shortcuts"
|
||||
msgstr "L’application veut neutraliser les raccourcis"
|
||||
|
||||
#. Translators: %s is a keyboard shortcut like "Super+x"
|
||||
#: js/ui/inhibitShortcutsDialog.js:88
|
||||
#: js/ui/inhibitShortcutsDialog.js:60
|
||||
#, javascript-format
|
||||
msgid "You can restore shortcuts by pressing %s."
|
||||
msgstr "Pour restaurer les raccourcis, appuyez sur %s."
|
||||
|
||||
#: js/ui/inhibitShortcutsDialog.js:93
|
||||
#: js/ui/inhibitShortcutsDialog.js:65
|
||||
msgid "Deny"
|
||||
msgstr "Refuser"
|
||||
|
||||
#: js/ui/inhibitShortcutsDialog.js:100
|
||||
#: js/ui/inhibitShortcutsDialog.js:71
|
||||
msgid "Allow"
|
||||
msgstr "Autoriser"
|
||||
|
||||
@@ -1407,13 +1407,13 @@ msgid "Leave On"
|
||||
msgstr "Laisser activé"
|
||||
|
||||
#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133
|
||||
#: js/ui/status/network.js:1263
|
||||
#: js/ui/status/network.js:1264
|
||||
msgid "Turn On"
|
||||
msgstr "Activer"
|
||||
|
||||
#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133
|
||||
#: js/ui/status/network.js:128 js/ui/status/network.js:310
|
||||
#: js/ui/status/network.js:1263 js/ui/status/network.js:1375
|
||||
#: js/ui/status/network.js:1264 js/ui/status/network.js:1376
|
||||
#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79
|
||||
#: js/ui/status/rfkill.js:106
|
||||
msgid "Turn Off"
|
||||
@@ -1423,59 +1423,59 @@ msgstr "Éteindre"
|
||||
msgid "Leave Off"
|
||||
msgstr "Laisser éteint"
|
||||
|
||||
#: js/ui/keyboard.js:200
|
||||
#: js/ui/keyboard.js:203
|
||||
msgid "Region & Language Settings"
|
||||
msgstr "Paramètres de langue et région"
|
||||
|
||||
#: js/ui/lookingGlass.js:615
|
||||
#: js/ui/lookingGlass.js:614
|
||||
msgid "No extensions installed"
|
||||
msgstr "Aucune extension installée"
|
||||
|
||||
#. Translators: argument is an extension UUID.
|
||||
#: js/ui/lookingGlass.js:669
|
||||
#: js/ui/lookingGlass.js:668
|
||||
#, javascript-format
|
||||
msgid "%s has not emitted any errors."
|
||||
msgstr "%s n’a émis aucune erreur."
|
||||
|
||||
#: js/ui/lookingGlass.js:675
|
||||
#: js/ui/lookingGlass.js:674
|
||||
msgid "Hide Errors"
|
||||
msgstr "Masquer les erreurs"
|
||||
|
||||
#: js/ui/lookingGlass.js:679 js/ui/lookingGlass.js:739
|
||||
#: js/ui/lookingGlass.js:678 js/ui/lookingGlass.js:738
|
||||
msgid "Show Errors"
|
||||
msgstr "Afficher les erreurs"
|
||||
|
||||
#: js/ui/lookingGlass.js:688
|
||||
#: js/ui/lookingGlass.js:687
|
||||
msgid "Enabled"
|
||||
msgstr "Activé"
|
||||
|
||||
#. translators:
|
||||
#. * The device has been disabled
|
||||
#: js/ui/lookingGlass.js:691 subprojects/gvc/gvc-mixer-control.c:1864
|
||||
#: js/ui/lookingGlass.js:690 subprojects/gvc/gvc-mixer-control.c:1866
|
||||
msgid "Disabled"
|
||||
msgstr "Désactivé"
|
||||
|
||||
#: js/ui/lookingGlass.js:693
|
||||
#: js/ui/lookingGlass.js:692
|
||||
msgid "Error"
|
||||
msgstr "Erreur"
|
||||
|
||||
#: js/ui/lookingGlass.js:695
|
||||
#: js/ui/lookingGlass.js:694
|
||||
msgid "Out of date"
|
||||
msgstr "Périmé"
|
||||
|
||||
#: js/ui/lookingGlass.js:697
|
||||
#: js/ui/lookingGlass.js:696
|
||||
msgid "Downloading"
|
||||
msgstr "Téléchargement"
|
||||
|
||||
#: js/ui/lookingGlass.js:721
|
||||
#: js/ui/lookingGlass.js:720
|
||||
msgid "View Source"
|
||||
msgstr "Afficher la source"
|
||||
|
||||
#: js/ui/lookingGlass.js:730
|
||||
#: js/ui/lookingGlass.js:729
|
||||
msgid "Web Page"
|
||||
msgstr "Page Web"
|
||||
|
||||
#: js/ui/messageTray.js:1480
|
||||
#: js/ui/messageTray.js:1474
|
||||
msgid "System Information"
|
||||
msgstr "Informations du système"
|
||||
|
||||
@@ -1559,16 +1559,16 @@ msgstr "Quitter"
|
||||
|
||||
#. Translators: If there is no suitable word for "Activities"
|
||||
#. in your language, you can use the word for "Overview".
|
||||
#: js/ui/panel.js:471
|
||||
#: js/ui/panel.js:466
|
||||
msgid "Activities"
|
||||
msgstr "Activités"
|
||||
|
||||
#: js/ui/panel.js:746
|
||||
#: js/ui/panel.js:741
|
||||
msgctxt "System menu in the top bar"
|
||||
msgid "System"
|
||||
msgstr "Système"
|
||||
|
||||
#: js/ui/panel.js:866
|
||||
#: js/ui/panel.js:861
|
||||
msgid "Top Bar"
|
||||
msgstr "Barre supérieure"
|
||||
|
||||
@@ -1800,7 +1800,7 @@ msgid "<unknown>"
|
||||
msgstr "<inconnu>"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:416 js/ui/status/network.js:1292
|
||||
#: js/ui/status/network.js:416 js/ui/status/network.js:1293
|
||||
#, javascript-format
|
||||
msgid "%s Off"
|
||||
msgstr "%s éteint"
|
||||
@@ -1826,7 +1826,7 @@ msgid "%s Disconnecting"
|
||||
msgstr "Déconnexion de %s en cours"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:434 js/ui/status/network.js:1284
|
||||
#: js/ui/status/network.js:434 js/ui/status/network.js:1285
|
||||
#, javascript-format
|
||||
msgid "%s Connecting"
|
||||
msgstr "Connexion de %s en cours"
|
||||
@@ -1866,7 +1866,7 @@ msgid "Mobile Broadband Settings"
|
||||
msgstr "Paramètres connexion mobile"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:553 js/ui/status/network.js:1289
|
||||
#: js/ui/status/network.js:553 js/ui/status/network.js:1290
|
||||
#, javascript-format
|
||||
msgid "%s Hardware Disabled"
|
||||
msgstr "Équipement %s désactivé"
|
||||
@@ -1931,72 +1931,72 @@ msgid "Wi-Fi Settings"
|
||||
msgstr "Paramètres Wi-Fi"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:1280
|
||||
#: js/ui/status/network.js:1281
|
||||
#, javascript-format
|
||||
msgid "%s Hotspot Active"
|
||||
msgstr "Point d’accès %s actif"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:1295
|
||||
#: js/ui/status/network.js:1296
|
||||
#, javascript-format
|
||||
msgid "%s Not Connected"
|
||||
msgstr "%s non connecté"
|
||||
|
||||
#: js/ui/status/network.js:1392
|
||||
#: js/ui/status/network.js:1393
|
||||
msgid "connecting…"
|
||||
msgstr "connexion…"
|
||||
|
||||
#. Translators: this is for network connections that require some kind of key or password
|
||||
#: js/ui/status/network.js:1395
|
||||
#: js/ui/status/network.js:1396
|
||||
msgid "authentication required"
|
||||
msgstr "authentification nécessaire"
|
||||
|
||||
#: js/ui/status/network.js:1397
|
||||
#: js/ui/status/network.js:1398
|
||||
msgid "connection failed"
|
||||
msgstr "échec de connexion"
|
||||
|
||||
#: js/ui/status/network.js:1447
|
||||
#: js/ui/status/network.js:1448
|
||||
msgid "VPN Settings"
|
||||
msgstr "Paramètres VPN"
|
||||
|
||||
#: js/ui/status/network.js:1464
|
||||
#: js/ui/status/network.js:1465
|
||||
msgid "VPN"
|
||||
msgstr "VPN"
|
||||
|
||||
#: js/ui/status/network.js:1474
|
||||
#: js/ui/status/network.js:1475
|
||||
msgid "VPN Off"
|
||||
msgstr "VPN désactivé"
|
||||
|
||||
#: js/ui/status/network.js:1535 js/ui/status/rfkill.js:82
|
||||
#: js/ui/status/network.js:1536 js/ui/status/rfkill.js:82
|
||||
msgid "Network Settings"
|
||||
msgstr "Paramètres du réseau"
|
||||
|
||||
#: js/ui/status/network.js:1564
|
||||
#: js/ui/status/network.js:1565
|
||||
#, javascript-format
|
||||
msgid "%s Wired Connection"
|
||||
msgid_plural "%s Wired Connections"
|
||||
msgstr[0] "%s connexion filaire."
|
||||
msgstr[1] "%s connexions filaires."
|
||||
|
||||
#: js/ui/status/network.js:1568
|
||||
#: js/ui/status/network.js:1569
|
||||
#, javascript-format
|
||||
msgid "%s Wi-Fi Connection"
|
||||
msgid_plural "%s Wi-Fi Connections"
|
||||
msgstr[0] "%s connexion Wi-Fi."
|
||||
msgstr[1] "%s connexions Wi-Fi."
|
||||
|
||||
#: js/ui/status/network.js:1572
|
||||
#: js/ui/status/network.js:1573
|
||||
#, javascript-format
|
||||
msgid "%s Modem Connection"
|
||||
msgid_plural "%s Modem Connections"
|
||||
msgstr[0] "%s connexion à un modem."
|
||||
msgstr[1] "%s connexions à des modems."
|
||||
|
||||
#: js/ui/status/network.js:1701
|
||||
#: js/ui/status/network.js:1702
|
||||
msgid "Connection failed"
|
||||
msgstr "Échec de connexion"
|
||||
|
||||
#: js/ui/status/network.js:1702
|
||||
#: js/ui/status/network.js:1703
|
||||
msgid "Activation of network connection failed"
|
||||
msgstr "L’activation de la connexion réseau a échoué"
|
||||
|
||||
@@ -2049,7 +2049,7 @@ msgstr "%d∶%02d avant chargement complet (%d %%)"
|
||||
#: js/ui/status/power.js:117 js/ui/status/power.js:119
|
||||
#, javascript-format
|
||||
msgid "%d %%"
|
||||
msgstr "%d %%"
|
||||
msgstr "%d %%"
|
||||
|
||||
#: js/ui/status/remoteAccess.js:42
|
||||
msgid "Screen is Being Shared"
|
||||
@@ -2298,12 +2298,12 @@ msgstr ""
|
||||
msgid "List possible modes"
|
||||
msgstr "Lister les modes possibles"
|
||||
|
||||
#: src/shell-app.c:264
|
||||
#: src/shell-app.c:260
|
||||
msgctxt "program"
|
||||
msgid "Unknown"
|
||||
msgstr "Inconnu"
|
||||
|
||||
#: src/shell-app.c:515
|
||||
#: src/shell-app.c:511
|
||||
#, c-format
|
||||
msgid "Failed to launch “%s”"
|
||||
msgstr "Impossible de lancer « %s »"
|
||||
@@ -2322,7 +2322,7 @@ msgstr "La fenêtre d’authentification a été écartée par l’utilisateur"
|
||||
|
||||
#. translators:
|
||||
#. * The number of sound outputs on a particular device
|
||||
#: subprojects/gvc/gvc-mixer-control.c:1871
|
||||
#: subprojects/gvc/gvc-mixer-control.c:1873
|
||||
#, c-format
|
||||
msgid "%u Output"
|
||||
msgid_plural "%u Outputs"
|
||||
@@ -2331,14 +2331,14 @@ msgstr[1] "%u sorties"
|
||||
|
||||
#. translators:
|
||||
#. * The number of sound inputs on a particular device
|
||||
#: subprojects/gvc/gvc-mixer-control.c:1881
|
||||
#: subprojects/gvc/gvc-mixer-control.c:1883
|
||||
#, c-format
|
||||
msgid "%u Input"
|
||||
msgid_plural "%u Inputs"
|
||||
msgstr[0] "%u entrée"
|
||||
msgstr[1] "%u entrées"
|
||||
|
||||
#: subprojects/gvc/gvc-mixer-control.c:2736
|
||||
#: subprojects/gvc/gvc-mixer-control.c:2738
|
||||
msgid "System Sounds"
|
||||
msgstr "Sons système"
|
||||
|
||||
|
178
po/id.po
@@ -4,13 +4,12 @@
|
||||
# Andika Triwidada <andika@gmail.com>, 2010-2014, 2017.
|
||||
# Dirgita <dirgitadevina@yahoo.co.id>, 2011, 2012, 2014.
|
||||
# Wibiharto <wibinem@yahoo.com>, 2011.
|
||||
# Kukuh Syafaat <kukuhsyafaat@gnome.org>, 2017, 2018, 2019.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell master\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
|
||||
"POT-Creation-Date: 2019-04-17 19:29+0000\n"
|
||||
"PO-Revision-Date: 2019-04-25 14:54+0700\n"
|
||||
"POT-Creation-Date: 2019-02-21 18:43+0000\n"
|
||||
"PO-Revision-Date: 2019-02-14 22:18+0700\n"
|
||||
"Last-Translator: Kukuh Syafaat <kukuhsyafaat@gnome.org>\n"
|
||||
"Language-Team: Indonesian <gnome-l10n-id@googlegroups.com>\n"
|
||||
"Language: id\n"
|
||||
@@ -377,6 +376,11 @@ msgstr ""
|
||||
msgid "Network Login"
|
||||
msgstr "Log Masuk Jaringan"
|
||||
|
||||
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
|
||||
#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9
|
||||
msgid "network-workgroup"
|
||||
msgstr "network-workgroup"
|
||||
|
||||
#: js/extensionPrefs/main.js:116
|
||||
msgid "Something’s gone wrong"
|
||||
msgstr "Ada yang tidak beres"
|
||||
@@ -457,7 +461,7 @@ msgstr "Tak masuk daftar?"
|
||||
|
||||
#. Translators: this message is shown below the username entry field
|
||||
#. to clue the user in on how to login to the local network realm
|
||||
#: js/gdm/loginDialog.js:884
|
||||
#: js/gdm/loginDialog.js:880
|
||||
#, javascript-format
|
||||
msgid "(e.g., user or %s)"
|
||||
msgstr "(cth., pengguna dari %s)"
|
||||
@@ -465,12 +469,12 @@ msgstr "(cth., pengguna dari %s)"
|
||||
#. TTLS and PEAP are actually much more complicated, but this complication
|
||||
#. is not visible here since we only care about phase2 authentication
|
||||
#. (and don't even care of which one)
|
||||
#: js/gdm/loginDialog.js:889 js/ui/components/networkAgent.js:243
|
||||
#: js/gdm/loginDialog.js:885 js/ui/components/networkAgent.js:243
|
||||
#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281
|
||||
msgid "Username: "
|
||||
msgstr "Nama pengguna: "
|
||||
|
||||
#: js/gdm/loginDialog.js:1227
|
||||
#: js/gdm/loginDialog.js:1223
|
||||
msgid "Login Window"
|
||||
msgstr "Jendela Log Masuk"
|
||||
|
||||
@@ -724,37 +728,32 @@ msgstr "Sering"
|
||||
msgid "All"
|
||||
msgstr "Semua"
|
||||
|
||||
#. Translators: This is the heading of a list of open windows
|
||||
#: js/ui/appDisplay.js:1713 js/ui/panel.js:79
|
||||
msgid "Open Windows"
|
||||
msgstr "Buka Jendela"
|
||||
|
||||
#: js/ui/appDisplay.js:1732 js/ui/panel.js:86
|
||||
#: js/ui/appDisplay.js:1737 js/ui/panel.js:83
|
||||
msgid "New Window"
|
||||
msgstr "Jendela Baru"
|
||||
|
||||
#: js/ui/appDisplay.js:1746
|
||||
#: js/ui/appDisplay.js:1751
|
||||
msgid "Launch using Dedicated Graphics Card"
|
||||
msgstr "Luncurkan menggunakan Kartu Grafis Terdedikasi"
|
||||
|
||||
#: js/ui/appDisplay.js:1773 js/ui/dash.js:239
|
||||
#: js/ui/appDisplay.js:1778 js/ui/dash.js:239
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Hapus dari Favorit"
|
||||
|
||||
#: js/ui/appDisplay.js:1779
|
||||
#: js/ui/appDisplay.js:1784
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Tambah ke Favorit"
|
||||
|
||||
#: js/ui/appDisplay.js:1789 js/ui/panel.js:97
|
||||
#: js/ui/appDisplay.js:1794 js/ui/panel.js:94
|
||||
msgid "Show Details"
|
||||
msgstr "Tampilkan Rincian"
|
||||
|
||||
#: js/ui/appFavorites.js:149
|
||||
#: js/ui/appFavorites.js:141
|
||||
#, javascript-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "%s telah ditambahkan ke favorit Anda."
|
||||
|
||||
#: js/ui/appFavorites.js:183
|
||||
#: js/ui/appFavorites.js:175
|
||||
#, javascript-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s telah dihapus dari favorit Anda."
|
||||
@@ -1040,7 +1039,7 @@ msgstr "Sandi jaringan data seluler"
|
||||
msgid "A password is required to connect to “%s”."
|
||||
msgstr "Perlu suatu sandi untuk menyambung ke \"%s\"."
|
||||
|
||||
#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1664
|
||||
#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665
|
||||
msgid "Network Manager"
|
||||
msgstr "Manajer Jaringan"
|
||||
|
||||
@@ -1110,23 +1109,23 @@ msgstr "Tambah jam dunia…"
|
||||
msgid "World Clocks"
|
||||
msgstr "Jam Dunia"
|
||||
|
||||
#: js/ui/dateMenu.js:228
|
||||
#: js/ui/dateMenu.js:222
|
||||
msgid "Weather"
|
||||
msgstr "Cuaca"
|
||||
|
||||
#: js/ui/dateMenu.js:311
|
||||
#: js/ui/dateMenu.js:305
|
||||
msgid "Select a location…"
|
||||
msgstr "Pilih lokasi…"
|
||||
|
||||
#: js/ui/dateMenu.js:319
|
||||
#: js/ui/dateMenu.js:313
|
||||
msgid "Loading…"
|
||||
msgstr "Memuat…"
|
||||
|
||||
#: js/ui/dateMenu.js:329
|
||||
#: js/ui/dateMenu.js:323
|
||||
msgid "Go online for weather information"
|
||||
msgstr "Pergi daring untuk informasi cuaca"
|
||||
|
||||
#: js/ui/dateMenu.js:331
|
||||
#: js/ui/dateMenu.js:325
|
||||
msgid "Weather information is currently unavailable"
|
||||
msgstr "Informasi cuaca saat ini tidak tersedia"
|
||||
|
||||
@@ -1289,26 +1288,26 @@ msgid "Download and install “%s” from extensions.gnome.org?"
|
||||
msgstr "Unduh dan pasang \"%s\" dari extensions.gnome.org?"
|
||||
|
||||
#. Translators: %s is an application name like "Settings"
|
||||
#: js/ui/inhibitShortcutsDialog.js:78
|
||||
#: js/ui/inhibitShortcutsDialog.js:50
|
||||
#, javascript-format
|
||||
msgid "%s wants to inhibit shortcuts"
|
||||
msgstr "%s ingin mencegah pintasan"
|
||||
|
||||
#: js/ui/inhibitShortcutsDialog.js:79
|
||||
#: js/ui/inhibitShortcutsDialog.js:51
|
||||
msgid "Application wants to inhibit shortcuts"
|
||||
msgstr "Aplikasi ingin mencegah pintasan"
|
||||
|
||||
#. Translators: %s is a keyboard shortcut like "Super+x"
|
||||
#: js/ui/inhibitShortcutsDialog.js:88
|
||||
#: js/ui/inhibitShortcutsDialog.js:60
|
||||
#, javascript-format
|
||||
msgid "You can restore shortcuts by pressing %s."
|
||||
msgstr "Anda dapat memulihkan pintasan dengan menekan %s."
|
||||
|
||||
#: js/ui/inhibitShortcutsDialog.js:93
|
||||
#: js/ui/inhibitShortcutsDialog.js:65
|
||||
msgid "Deny"
|
||||
msgstr "Tolak"
|
||||
|
||||
#: js/ui/inhibitShortcutsDialog.js:100
|
||||
#: js/ui/inhibitShortcutsDialog.js:71
|
||||
msgid "Allow"
|
||||
msgstr "Izinkan"
|
||||
|
||||
@@ -1359,13 +1358,13 @@ msgid "Leave On"
|
||||
msgstr "Biarkan Menyala"
|
||||
|
||||
#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133
|
||||
#: js/ui/status/network.js:1263
|
||||
#: js/ui/status/network.js:1264
|
||||
msgid "Turn On"
|
||||
msgstr "Nyalakan"
|
||||
|
||||
#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133
|
||||
#: js/ui/status/network.js:128 js/ui/status/network.js:310
|
||||
#: js/ui/status/network.js:1263 js/ui/status/network.js:1375
|
||||
#: js/ui/status/network.js:1264 js/ui/status/network.js:1376
|
||||
#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79
|
||||
#: js/ui/status/rfkill.js:106
|
||||
msgid "Turn Off"
|
||||
@@ -1375,59 +1374,59 @@ msgstr "Matikan"
|
||||
msgid "Leave Off"
|
||||
msgstr "Biarkan Mati"
|
||||
|
||||
#: js/ui/keyboard.js:200
|
||||
#: js/ui/keyboard.js:203
|
||||
msgid "Region & Language Settings"
|
||||
msgstr "Pengaturan Wilayah & Bahasa"
|
||||
|
||||
#: js/ui/lookingGlass.js:615
|
||||
#: js/ui/lookingGlass.js:614
|
||||
msgid "No extensions installed"
|
||||
msgstr "Tak ada ekstensi terpasang"
|
||||
|
||||
#. Translators: argument is an extension UUID.
|
||||
#: js/ui/lookingGlass.js:669
|
||||
#: js/ui/lookingGlass.js:668
|
||||
#, javascript-format
|
||||
msgid "%s has not emitted any errors."
|
||||
msgstr "%s tidak menampilkan galat apa pun."
|
||||
|
||||
#: js/ui/lookingGlass.js:675
|
||||
#: js/ui/lookingGlass.js:674
|
||||
msgid "Hide Errors"
|
||||
msgstr "Sembunyikan Galat"
|
||||
|
||||
#: js/ui/lookingGlass.js:679 js/ui/lookingGlass.js:739
|
||||
#: js/ui/lookingGlass.js:678 js/ui/lookingGlass.js:738
|
||||
msgid "Show Errors"
|
||||
msgstr "Tampilkan Galat"
|
||||
|
||||
#: js/ui/lookingGlass.js:688
|
||||
#: js/ui/lookingGlass.js:687
|
||||
msgid "Enabled"
|
||||
msgstr "Diaktifkan"
|
||||
|
||||
#. translators:
|
||||
#. * The device has been disabled
|
||||
#: js/ui/lookingGlass.js:691 subprojects/gvc/gvc-mixer-control.c:1864
|
||||
#: js/ui/lookingGlass.js:690 subprojects/gvc/gvc-mixer-control.c:1866
|
||||
msgid "Disabled"
|
||||
msgstr "Dinonaktifkan"
|
||||
|
||||
#: js/ui/lookingGlass.js:693
|
||||
#: js/ui/lookingGlass.js:692
|
||||
msgid "Error"
|
||||
msgstr "Galat"
|
||||
|
||||
#: js/ui/lookingGlass.js:695
|
||||
#: js/ui/lookingGlass.js:694
|
||||
msgid "Out of date"
|
||||
msgstr "Kadaluarsa"
|
||||
|
||||
#: js/ui/lookingGlass.js:697
|
||||
#: js/ui/lookingGlass.js:696
|
||||
msgid "Downloading"
|
||||
msgstr "Mengunduh"
|
||||
|
||||
#: js/ui/lookingGlass.js:721
|
||||
#: js/ui/lookingGlass.js:720
|
||||
msgid "View Source"
|
||||
msgstr "Tilik Sumber"
|
||||
|
||||
#: js/ui/lookingGlass.js:730
|
||||
#: js/ui/lookingGlass.js:729
|
||||
msgid "Web Page"
|
||||
msgstr "Halaman Web"
|
||||
|
||||
#: js/ui/messageTray.js:1480
|
||||
#: js/ui/messageTray.js:1474
|
||||
msgid "System Information"
|
||||
msgstr "Informasi Sistem"
|
||||
|
||||
@@ -1505,25 +1504,35 @@ msgstr "Tekan Esc untuk keluar"
|
||||
msgid "Press any key to exit"
|
||||
msgstr "Tekan tombol apa saja untuk keluar"
|
||||
|
||||
#: js/ui/panel.js:113
|
||||
#: js/ui/panel.js:108
|
||||
msgid "Quit"
|
||||
msgstr "Keluar"
|
||||
|
||||
#. Translators: If there is no suitable word for "Activities"
|
||||
#. in your language, you can use the word for "Overview".
|
||||
#: js/ui/panel.js:468
|
||||
#: js/ui/panel.js:466
|
||||
msgid "Activities"
|
||||
msgstr "Aktivitas"
|
||||
|
||||
#: js/ui/panel.js:743
|
||||
#: js/ui/panel.js:741
|
||||
msgctxt "System menu in the top bar"
|
||||
msgid "System"
|
||||
msgstr "Sistem"
|
||||
|
||||
#: js/ui/panel.js:864
|
||||
#: js/ui/panel.js:861
|
||||
msgid "Top Bar"
|
||||
msgstr "Bar Atas"
|
||||
|
||||
# Dirgita: Hayo, enaknya pake I/O atau ON/OFF?^^
|
||||
#. Translators: this MUST be either "toggle-switch-us"
|
||||
#. (for toggle switches containing the English words
|
||||
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
|
||||
#. switches containing "◯" and "|"). Other values will
|
||||
#. simply result in invisible toggle switches.
|
||||
#: js/ui/popupMenu.js:285
|
||||
msgid "toggle-switch-us"
|
||||
msgstr "toggle-switch-intl"
|
||||
|
||||
#: js/ui/runDialog.js:64
|
||||
msgid "Enter a Command"
|
||||
msgstr "Ketikkan Perintah"
|
||||
@@ -1560,7 +1569,7 @@ msgid_plural "%d new notifications"
|
||||
msgstr[0] "%d pemberitahuan baru"
|
||||
msgstr[1] "%d pemberitahuan baru"
|
||||
|
||||
#: js/ui/screenShield.js:449 js/ui/status/system.js:271
|
||||
#: js/ui/screenShield.js:449 js/ui/status/system.js:270
|
||||
msgid "Lock"
|
||||
msgstr "Kunci"
|
||||
|
||||
@@ -1575,11 +1584,11 @@ msgstr "GNOME perlu mengunci layar"
|
||||
#.
|
||||
#. XXX: another option is to kick the user into the gdm login
|
||||
#. screen, where we're not affected by grabs
|
||||
#: js/ui/screenShield.js:826 js/ui/screenShield.js:1299
|
||||
#: js/ui/screenShield.js:834 js/ui/screenShield.js:1307
|
||||
msgid "Unable to lock"
|
||||
msgstr "Tak bisa mengunci"
|
||||
|
||||
#: js/ui/screenShield.js:827 js/ui/screenShield.js:1300
|
||||
#: js/ui/screenShield.js:835 js/ui/screenShield.js:1308
|
||||
msgid "Lock was blocked by an application"
|
||||
msgstr "Kunci diblokir oleh suatu aplikasi"
|
||||
|
||||
@@ -1741,7 +1750,7 @@ msgid "<unknown>"
|
||||
msgstr "<tak dikenal>"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:416 js/ui/status/network.js:1292
|
||||
#: js/ui/status/network.js:416 js/ui/status/network.js:1293
|
||||
#, javascript-format
|
||||
msgid "%s Off"
|
||||
msgstr "%s Mati"
|
||||
@@ -1767,7 +1776,7 @@ msgid "%s Disconnecting"
|
||||
msgstr "%s Memutus"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:434 js/ui/status/network.js:1284
|
||||
#: js/ui/status/network.js:434 js/ui/status/network.js:1285
|
||||
#, javascript-format
|
||||
msgid "%s Connecting"
|
||||
msgstr "%s Menyambung"
|
||||
@@ -1807,7 +1816,7 @@ msgid "Mobile Broadband Settings"
|
||||
msgstr "Pengaturan Data Seluler"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:553 js/ui/status/network.js:1289
|
||||
#: js/ui/status/network.js:553 js/ui/status/network.js:1290
|
||||
#, javascript-format
|
||||
msgid "%s Hardware Disabled"
|
||||
msgstr "%s Perangkat Keras Dinonaktifkan"
|
||||
@@ -1872,72 +1881,72 @@ msgid "Wi-Fi Settings"
|
||||
msgstr "Pengaturan Wi-Fi"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:1280
|
||||
#: js/ui/status/network.js:1281
|
||||
#, javascript-format
|
||||
msgid "%s Hotspot Active"
|
||||
msgstr "%s Hotspot Aktif"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: js/ui/status/network.js:1295
|
||||
#: js/ui/status/network.js:1296
|
||||
#, javascript-format
|
||||
msgid "%s Not Connected"
|
||||
msgstr "%s Tak Tersambung"
|
||||
|
||||
#: js/ui/status/network.js:1392
|
||||
#: js/ui/status/network.js:1393
|
||||
msgid "connecting…"
|
||||
msgstr "menyambung…"
|
||||
|
||||
#. Translators: this is for network connections that require some kind of key or password
|
||||
#: js/ui/status/network.js:1395
|
||||
#: js/ui/status/network.js:1396
|
||||
msgid "authentication required"
|
||||
msgstr "diperlukan otentikasi"
|
||||
|
||||
#: js/ui/status/network.js:1397
|
||||
#: js/ui/status/network.js:1398
|
||||
msgid "connection failed"
|
||||
msgstr "koneksi gagal"
|
||||
|
||||
#: js/ui/status/network.js:1447
|
||||
#: js/ui/status/network.js:1448
|
||||
msgid "VPN Settings"
|
||||
msgstr "Pengaturan VPN"
|
||||
|
||||
#: js/ui/status/network.js:1464
|
||||
#: js/ui/status/network.js:1465
|
||||
msgid "VPN"
|
||||
msgstr "VPN"
|
||||
|
||||
#: js/ui/status/network.js:1474
|
||||
#: js/ui/status/network.js:1475
|
||||
msgid "VPN Off"
|
||||
msgstr "VPN Mati"
|
||||
|
||||
#: js/ui/status/network.js:1535 js/ui/status/rfkill.js:82
|
||||
#: js/ui/status/network.js:1536 js/ui/status/rfkill.js:82
|
||||
msgid "Network Settings"
|
||||
msgstr "Pengaturan Jaringan"
|
||||
|
||||
#: js/ui/status/network.js:1564
|
||||
#: js/ui/status/network.js:1565
|
||||
#, javascript-format
|
||||
msgid "%s Wired Connection"
|
||||
msgid_plural "%s Wired Connections"
|
||||
msgstr[0] "%s Koneksi Kabel"
|
||||
msgstr[1] "%s Koneksi Kabel"
|
||||
|
||||
#: js/ui/status/network.js:1568
|
||||
#: js/ui/status/network.js:1569
|
||||
#, javascript-format
|
||||
msgid "%s Wi-Fi Connection"
|
||||
msgid_plural "%s Wi-Fi Connections"
|
||||
msgstr[0] "%s Koneksi Wi-Fi"
|
||||
msgstr[1] "%s Koneksi Wi-Fi"
|
||||
|
||||
#: js/ui/status/network.js:1572
|
||||
#: js/ui/status/network.js:1573
|
||||
#, javascript-format
|
||||
msgid "%s Modem Connection"
|
||||
msgid_plural "%s Modem Connections"
|
||||
msgstr[0] "%s Koneksi Modem"
|
||||
msgstr[1] "%s Koneksi Modem"
|
||||
|
||||
#: js/ui/status/network.js:1705
|
||||
#: js/ui/status/network.js:1702
|
||||
msgid "Connection failed"
|
||||
msgstr "Koneksi gagal"
|
||||
|
||||
#: js/ui/status/network.js:1706
|
||||
#: js/ui/status/network.js:1703
|
||||
msgid "Activation of network connection failed"
|
||||
msgstr "Aktivasi koneksi jaringan gagal"
|
||||
|
||||
@@ -2019,15 +2028,15 @@ msgstr "Keluar"
|
||||
msgid "Account Settings"
|
||||
msgstr "Pengaturan Akun"
|
||||
|
||||
#: js/ui/status/system.js:256
|
||||
#: js/ui/status/system.js:255
|
||||
msgid "Orientation Lock"
|
||||
msgstr "Kunci Orientasi"
|
||||
|
||||
#: js/ui/status/system.js:282
|
||||
#: js/ui/status/system.js:281
|
||||
msgid "Suspend"
|
||||
msgstr "Suspensi"
|
||||
|
||||
#: js/ui/status/system.js:292
|
||||
#: js/ui/status/system.js:291
|
||||
msgid "Power Off"
|
||||
msgstr "Matikan"
|
||||
|
||||
@@ -2143,7 +2152,7 @@ msgstr[1] "Perubahan tatanan akan dikembalikan dalam %d detik"
|
||||
|
||||
#. Translators: This represents the size of a window. The first number is
|
||||
#. * the width of the window and the second is the height.
|
||||
#: js/ui/windowManager.js:677
|
||||
#: js/ui/windowManager.js:662
|
||||
#, javascript-format
|
||||
msgid "%d × %d"
|
||||
msgstr "%d × %d"
|
||||
@@ -2216,6 +2225,11 @@ msgstr "Pindahkan ke Monitor Kanan"
|
||||
msgid "Evolution Calendar"
|
||||
msgstr "Evolution Kalender"
|
||||
|
||||
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
|
||||
#: src/calendar-server/evolution-calendar.desktop.in:6
|
||||
msgid "evolution"
|
||||
msgstr "evolution"
|
||||
|
||||
#: src/main.c:408
|
||||
msgid "Print version"
|
||||
msgstr "Versi Cetak"
|
||||
@@ -2232,12 +2246,12 @@ msgstr "Menggunakan mode tertentu, mis. \"gdm\" untuk layar masuk"
|
||||
msgid "List possible modes"
|
||||
msgstr "Menampilkan mode yang mungkin"
|
||||
|
||||
#: src/shell-app.c:264
|
||||
#: src/shell-app.c:260
|
||||
msgctxt "program"
|
||||
msgid "Unknown"
|
||||
msgstr "Tak dikenal"
|
||||
|
||||
#: src/shell-app.c:515
|
||||
#: src/shell-app.c:511
|
||||
#, c-format
|
||||
msgid "Failed to launch “%s”"
|
||||
msgstr "Gagal meluncurkan \"%s\""
|
||||
@@ -2256,7 +2270,7 @@ msgstr "Dialog autentikasi ditolak oleh pengguna"
|
||||
|
||||
#. translators:
|
||||
#. * The number of sound outputs on a particular device
|
||||
#: subprojects/gvc/gvc-mixer-control.c:1871
|
||||
#: subprojects/gvc/gvc-mixer-control.c:1873
|
||||
#, c-format
|
||||
msgid "%u Output"
|
||||
msgid_plural "%u Outputs"
|
||||
@@ -2265,27 +2279,17 @@ msgstr[1] "%u Keluaran"
|
||||
|
||||
#. translators:
|
||||
#. * The number of sound inputs on a particular device
|
||||
#: subprojects/gvc/gvc-mixer-control.c:1881
|
||||
#: subprojects/gvc/gvc-mixer-control.c:1883
|
||||
#, c-format
|
||||
msgid "%u Input"
|
||||
msgid_plural "%u Inputs"
|
||||
msgstr[0] "%u Masukan"
|
||||
msgstr[1] "%u Masukan"
|
||||
|
||||
#: subprojects/gvc/gvc-mixer-control.c:2736
|
||||
#: subprojects/gvc/gvc-mixer-control.c:2738
|
||||
msgid "System Sounds"
|
||||
msgstr "Suara Sistem"
|
||||
|
||||
#~ msgid "network-workgroup"
|
||||
#~ msgstr "network-workgroup"
|
||||
|
||||
# Dirgita: Hayo, enaknya pake I/O atau ON/OFF?^^
|
||||
#~ msgid "toggle-switch-us"
|
||||
#~ msgstr "toggle-switch-intl"
|
||||
|
||||
#~ msgid "evolution"
|
||||
#~ msgstr "evolution"
|
||||
|
||||
#~ msgid "There was an error loading the preferences dialog for %s:"
|
||||
#~ msgstr "Ada galat saat memuat dialog preferensi bagi %s:"
|
||||
|
||||
|
2
po/tg.po
@@ -308,7 +308,7 @@ msgstr "Воридшавии шабакавӣ"
|
||||
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
|
||||
#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9
|
||||
msgid "network-workgroup"
|
||||
msgstr "network-workgroup"
|
||||
msgstr "шабака-гурӯҳи корӣ"
|
||||
|
||||
#: js/extensionPrefs/main.js:116
|
||||
msgid "Something’s gone wrong"
|
||||
|
1083
po/zh_CN.po
1021
po/zh_TW.po
@@ -295,13 +295,13 @@ create_client_for_source (ESource *source,
|
||||
CalendarSourceData *source_data)
|
||||
{
|
||||
ClientData *data;
|
||||
EClient *client;
|
||||
ECalClient *client;
|
||||
GError *error = NULL;
|
||||
|
||||
client = g_hash_table_lookup (source_data->clients, source);
|
||||
g_return_if_fail (client == NULL);
|
||||
|
||||
client = e_cal_client_connect_sync (source, source_type, -1, NULL, &error);
|
||||
client = e_cal_client_new (source, source_type, &error);
|
||||
if (!client)
|
||||
{
|
||||
g_warning ("Could not load source '%s': %s",
|
||||
@@ -312,7 +312,7 @@ create_client_for_source (ESource *source,
|
||||
}
|
||||
|
||||
data = g_slice_new0 (ClientData);
|
||||
data->client = E_CAL_CLIENT (client); /* takes ownership */
|
||||
data->client = client; /* takes ownership */
|
||||
data->backend_died_id = g_signal_connect (client,
|
||||
"backend-died",
|
||||
G_CALLBACK (backend_died_cb),
|
||||
|
@@ -102,120 +102,97 @@ typedef struct
|
||||
} CollectAppointmentsData;
|
||||
|
||||
static time_t
|
||||
get_time_from_property (ICalComponent *icomp,
|
||||
ICalPropertyKind prop_kind,
|
||||
ICalTime * (* get_prop_func) (ICalProperty *prop),
|
||||
ICalTimezone *default_zone)
|
||||
get_time_from_property (icalcomponent *ical,
|
||||
icalproperty_kind prop_kind,
|
||||
struct icaltimetype (* get_prop_func) (const icalproperty *prop),
|
||||
icaltimezone *default_zone)
|
||||
{
|
||||
ICalProperty *prop;
|
||||
ICalTime *itt;
|
||||
ICalParameter *param;
|
||||
ICalTimezone *timezone = NULL;
|
||||
time_t retval;
|
||||
icalproperty *prop;
|
||||
struct icaltimetype ical_time;
|
||||
icalparameter *param;
|
||||
icaltimezone *timezone = NULL;
|
||||
|
||||
prop = i_cal_component_get_first_property (icomp, prop_kind);
|
||||
prop = icalcomponent_get_first_property (ical, prop_kind);
|
||||
if (!prop)
|
||||
return 0;
|
||||
|
||||
itt = get_prop_func (prop);
|
||||
ical_time = get_prop_func (prop);
|
||||
|
||||
param = i_cal_property_get_first_parameter (prop, I_CAL_TZID_PARAMETER);
|
||||
param = icalproperty_get_first_parameter (prop, ICAL_TZID_PARAMETER);
|
||||
if (param)
|
||||
timezone = i_cal_timezone_get_builtin_timezone_from_tzid (i_cal_parameter_get_tzid (param));
|
||||
else if (i_cal_time_is_utc (itt))
|
||||
timezone = i_cal_timezone_get_utc_timezone ();
|
||||
timezone = icaltimezone_get_builtin_timezone_from_tzid (icalparameter_get_tzid (param));
|
||||
else if (icaltime_is_utc (ical_time))
|
||||
timezone = icaltimezone_get_utc_timezone ();
|
||||
else
|
||||
timezone = default_zone;
|
||||
|
||||
retval = i_cal_time_as_timet_with_zone (itt, timezone);
|
||||
|
||||
g_clear_object (¶m);
|
||||
g_clear_object (&prop);
|
||||
g_clear_object (&itt);
|
||||
|
||||
return retval;
|
||||
return icaltime_as_timet_with_zone (ical_time, timezone);
|
||||
}
|
||||
|
||||
static char *
|
||||
get_ical_uid (ICalComponent *icomp)
|
||||
get_ical_uid (icalcomponent *ical)
|
||||
{
|
||||
return g_strdup (i_cal_component_get_uid (icomp));
|
||||
return g_strdup (icalcomponent_get_uid (ical));
|
||||
}
|
||||
|
||||
static char *
|
||||
get_ical_summary (ICalComponent *icomp)
|
||||
get_ical_summary (icalcomponent *ical)
|
||||
{
|
||||
ICalProperty *prop;
|
||||
char *retval;
|
||||
icalproperty *prop;
|
||||
|
||||
prop = i_cal_component_get_first_property (icomp, I_CAL_SUMMARY_PROPERTY);
|
||||
prop = icalcomponent_get_first_property (ical, ICAL_SUMMARY_PROPERTY);
|
||||
if (!prop)
|
||||
return NULL;
|
||||
|
||||
retval = g_strdup (i_cal_property_get_summary (prop));
|
||||
|
||||
g_object_unref (prop);
|
||||
|
||||
return retval;
|
||||
return g_strdup (icalproperty_get_summary (prop));
|
||||
}
|
||||
|
||||
static char *
|
||||
get_ical_description (ICalComponent *icomp)
|
||||
get_ical_description (icalcomponent *ical)
|
||||
{
|
||||
ICalProperty *prop;
|
||||
char *retval;
|
||||
icalproperty *prop;
|
||||
|
||||
prop = i_cal_component_get_first_property (icomp, I_CAL_DESCRIPTION_PROPERTY);
|
||||
prop = icalcomponent_get_first_property (ical, ICAL_DESCRIPTION_PROPERTY);
|
||||
if (!prop)
|
||||
return NULL;
|
||||
|
||||
retval = g_strdup (i_cal_property_get_description (prop));
|
||||
|
||||
g_object_unref (prop);
|
||||
|
||||
return retval;
|
||||
return g_strdup (icalproperty_get_description (prop));
|
||||
}
|
||||
|
||||
static inline time_t
|
||||
get_ical_start_time (ICalComponent *icomp,
|
||||
ICalTimezone *default_zone)
|
||||
get_ical_start_time (icalcomponent *ical,
|
||||
icaltimezone *default_zone)
|
||||
{
|
||||
return get_time_from_property (icomp,
|
||||
I_CAL_DTSTART_PROPERTY,
|
||||
i_cal_property_get_dtstart,
|
||||
return get_time_from_property (ical,
|
||||
ICAL_DTSTART_PROPERTY,
|
||||
icalproperty_get_dtstart,
|
||||
default_zone);
|
||||
}
|
||||
|
||||
static inline time_t
|
||||
get_ical_end_time (ICalComponent *icomp,
|
||||
ICalTimezone *default_zone)
|
||||
get_ical_end_time (icalcomponent *ical,
|
||||
icaltimezone *default_zone)
|
||||
{
|
||||
return get_time_from_property (icomp,
|
||||
I_CAL_DTEND_PROPERTY,
|
||||
i_cal_property_get_dtend,
|
||||
return get_time_from_property (ical,
|
||||
ICAL_DTEND_PROPERTY,
|
||||
icalproperty_get_dtend,
|
||||
default_zone);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
get_ical_is_all_day (ICalComponent *icomp,
|
||||
get_ical_is_all_day (icalcomponent *ical,
|
||||
time_t start_time,
|
||||
ICalTimezone *default_zone)
|
||||
icaltimezone *default_zone)
|
||||
{
|
||||
ICalProperty *prop;
|
||||
ICalDuration *duration;
|
||||
ICalTime *dtstart;
|
||||
struct tm *start_tm;
|
||||
time_t end_time;
|
||||
gboolean retval;
|
||||
icalproperty *prop;
|
||||
struct tm *start_tm;
|
||||
time_t end_time;
|
||||
struct icaldurationtype duration;
|
||||
struct icaltimetype start_icaltime;
|
||||
|
||||
dtstart = i_cal_component_get_dtstart (icomp);
|
||||
if (dtstart && i_cal_time_is_date (dtstart))
|
||||
{
|
||||
g_clear_object (&dtstart);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
g_clear_object (&dtstart);
|
||||
start_icaltime = icalcomponent_get_dtstart (ical);
|
||||
if (start_icaltime.is_date)
|
||||
return TRUE;
|
||||
|
||||
start_tm = gmtime (&start_time);
|
||||
if (start_tm->tm_sec != 0 ||
|
||||
@@ -223,40 +200,35 @@ get_ical_is_all_day (ICalComponent *icomp,
|
||||
start_tm->tm_hour != 0)
|
||||
return FALSE;
|
||||
|
||||
if ((end_time = get_ical_end_time (icomp, default_zone)))
|
||||
if ((end_time = get_ical_end_time (ical, default_zone)))
|
||||
return (end_time - start_time) % 86400 == 0;
|
||||
|
||||
prop = i_cal_component_get_first_property (icomp, I_CAL_DURATION_PROPERTY);
|
||||
prop = icalcomponent_get_first_property (ical, ICAL_DURATION_PROPERTY);
|
||||
if (!prop)
|
||||
return FALSE;
|
||||
|
||||
duration = i_cal_property_get_duration (prop);
|
||||
duration = icalproperty_get_duration (prop);
|
||||
|
||||
retval = duration && (i_cal_duration_as_int (duration) % 86400) == 0;
|
||||
|
||||
g_clear_object (&duration);
|
||||
g_clear_object (&prop);
|
||||
|
||||
return retval;
|
||||
return icaldurationtype_as_int (duration) % 86400 == 0;
|
||||
}
|
||||
|
||||
static inline time_t
|
||||
get_ical_due_time (ICalComponent *icomp,
|
||||
ICalTimezone *default_zone)
|
||||
get_ical_due_time (icalcomponent *ical,
|
||||
icaltimezone *default_zone)
|
||||
{
|
||||
return get_time_from_property (icomp,
|
||||
I_CAL_DUE_PROPERTY,
|
||||
i_cal_property_get_due,
|
||||
return get_time_from_property (ical,
|
||||
ICAL_DUE_PROPERTY,
|
||||
icalproperty_get_due,
|
||||
default_zone);
|
||||
}
|
||||
|
||||
static inline time_t
|
||||
get_ical_completed_time (ICalComponent *icomp,
|
||||
ICalTimezone *default_zone)
|
||||
get_ical_completed_time (icalcomponent *ical,
|
||||
icaltimezone *default_zone)
|
||||
{
|
||||
return get_time_from_property (icomp,
|
||||
I_CAL_COMPLETED_PROPERTY,
|
||||
i_cal_property_get_completed,
|
||||
return get_time_from_property (ical,
|
||||
ICAL_COMPLETED_PROPERTY,
|
||||
icalproperty_get_completed,
|
||||
default_zone);
|
||||
}
|
||||
|
||||
@@ -393,69 +365,67 @@ calendar_appointment_free (CalendarAppointment *appointment)
|
||||
|
||||
static void
|
||||
calendar_appointment_init (CalendarAppointment *appointment,
|
||||
ICalComponent *icomp,
|
||||
icalcomponent *ical,
|
||||
ECalClient *cal)
|
||||
{
|
||||
ICalTimezone *default_zone;
|
||||
icaltimezone *default_zone;
|
||||
const char *source_id;
|
||||
|
||||
source_id = e_source_get_uid (e_client_get_source (E_CLIENT (cal)));
|
||||
default_zone = e_cal_client_get_default_timezone (cal);
|
||||
|
||||
appointment->uid = get_ical_uid (icomp);
|
||||
appointment->uid = get_ical_uid (ical);
|
||||
appointment->source_id = g_strdup (source_id);
|
||||
appointment->backend_name = get_source_backend_name (cal);
|
||||
appointment->summary = get_ical_summary (icomp);
|
||||
appointment->description = get_ical_description (icomp);
|
||||
appointment->summary = get_ical_summary (ical);
|
||||
appointment->description = get_ical_description (ical);
|
||||
appointment->color_string = get_source_color (cal);
|
||||
appointment->start_time = get_ical_start_time (icomp, default_zone);
|
||||
appointment->end_time = get_ical_end_time (icomp, default_zone);
|
||||
appointment->is_all_day = get_ical_is_all_day (icomp,
|
||||
appointment->start_time = get_ical_start_time (ical, default_zone);
|
||||
appointment->end_time = get_ical_end_time (ical, default_zone);
|
||||
appointment->is_all_day = get_ical_is_all_day (ical,
|
||||
appointment->start_time,
|
||||
default_zone);
|
||||
}
|
||||
|
||||
static CalendarAppointment *
|
||||
calendar_appointment_new (ICalComponent *icomp,
|
||||
calendar_appointment_new (icalcomponent *ical,
|
||||
ECalClient *cal)
|
||||
{
|
||||
CalendarAppointment *appointment;
|
||||
|
||||
appointment = g_new0 (CalendarAppointment, 1);
|
||||
|
||||
calendar_appointment_init (appointment, icomp, cal);
|
||||
calendar_appointment_init (appointment, ical, cal);
|
||||
return appointment;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
generate_instances_cb (ICalComponent *icomp,
|
||||
ICalTime *instance_start,
|
||||
ICalTime *instance_end,
|
||||
gpointer user_data,
|
||||
GCancellable *cancellable,
|
||||
GError **error)
|
||||
generate_instances_cb (ECalComponent *comp,
|
||||
time_t start,
|
||||
time_t end,
|
||||
gpointer data)
|
||||
{
|
||||
ECalClient *cal = ((CollectAppointmentsData *)user_data)->client;
|
||||
GHashTable *appointments = ((CollectAppointmentsData *)user_data)->appointments;
|
||||
ECalClient *cal = ((CollectAppointmentsData *)data)->client;
|
||||
GHashTable *appointments = ((CollectAppointmentsData *)data)->appointments;
|
||||
CalendarAppointment *appointment;
|
||||
CalendarOccurrence *occurrence;
|
||||
ICalTimezone *default_zone;
|
||||
const gchar *uid;
|
||||
const char *uid;
|
||||
|
||||
default_zone = e_cal_client_get_default_timezone (cal);
|
||||
uid = i_cal_component_get_uid (icomp);
|
||||
e_cal_component_get_uid (comp, &uid);
|
||||
appointment = g_hash_table_lookup (appointments, uid);
|
||||
|
||||
if (appointment == NULL)
|
||||
{
|
||||
appointment = calendar_appointment_new (icomp, cal);
|
||||
icalcomponent *ical = e_cal_component_get_icalcomponent (comp);
|
||||
|
||||
appointment = calendar_appointment_new (ical, cal);
|
||||
g_hash_table_insert (appointments, g_strdup (uid), appointment);
|
||||
}
|
||||
|
||||
occurrence = g_new0 (CalendarOccurrence, 1);
|
||||
occurrence->start_time = i_cal_time_as_timet_with_zone (instance_start, default_zone);
|
||||
occurrence->end_time = i_cal_time_as_timet_with_zone (instance_end, default_zone);
|
||||
occurrence->rid = e_cal_util_component_get_recurid_as_string (icomp);
|
||||
occurrence->start_time = start;
|
||||
occurrence->end_time = end;
|
||||
occurrence->rid = e_cal_component_get_recurid_as_string (comp);
|
||||
|
||||
appointment->occurrences = g_slist_append (appointment->occurrences, occurrence);
|
||||
|
||||
@@ -472,7 +442,7 @@ struct _App
|
||||
time_t since;
|
||||
time_t until;
|
||||
|
||||
ICalTimezone *zone;
|
||||
icaltimezone *zone;
|
||||
|
||||
CalendarSources *sources;
|
||||
gulong sources_signal_id;
|
||||
@@ -498,9 +468,9 @@ app_update_timezone (App *app)
|
||||
if (g_strcmp0 (location, app->timezone_location) != 0)
|
||||
{
|
||||
if (location == NULL)
|
||||
app->zone = i_cal_timezone_get_utc_timezone ();
|
||||
app->zone = icaltimezone_get_utc_timezone ();
|
||||
else
|
||||
app->zone = i_cal_timezone_get_builtin_timezone (location);
|
||||
app->zone = icaltimezone_get_builtin_timezone (location);
|
||||
g_free (app->timezone_location);
|
||||
app->timezone_location = location;
|
||||
print_debug ("Using timezone %s", app->timezone_location);
|
||||
@@ -558,10 +528,10 @@ on_objects_added (ECalClientView *view,
|
||||
|
||||
for (l = objects; l != NULL; l = l->next)
|
||||
{
|
||||
ICalComponent *icomp = l->data;
|
||||
icalcomponent *ical = l->data;
|
||||
const char *uid;
|
||||
|
||||
uid = i_cal_component_get_uid (icomp);
|
||||
uid = icalcomponent_get_uid (ical);
|
||||
|
||||
if (g_hash_table_lookup (app->appointments, uid) == NULL)
|
||||
{
|
||||
@@ -630,7 +600,7 @@ app_load_events (App *app)
|
||||
|
||||
since_iso8601 = isodate_from_time_t (app->since);
|
||||
until_iso8601 = isodate_from_time_t (app->until);
|
||||
tz_location = i_cal_timezone_get_location (app->zone);
|
||||
tz_location = icaltimezone_get_location (app->zone);
|
||||
|
||||
print_debug ("Loading events since %s until %s",
|
||||
since_iso8601,
|
||||
@@ -652,12 +622,21 @@ app_load_events (App *app)
|
||||
|
||||
e_cal_client_set_default_timezone (cal, app->zone);
|
||||
|
||||
error = NULL;
|
||||
if (!e_client_open_sync (E_CLIENT (cal), TRUE, NULL, &error))
|
||||
{
|
||||
ESource *source = e_client_get_source (E_CLIENT (cal));
|
||||
g_warning ("Error opening calendar %s: %s\n",
|
||||
e_source_get_uid (source), error->message);
|
||||
g_error_free (error);
|
||||
continue;
|
||||
}
|
||||
|
||||
data.client = cal;
|
||||
data.appointments = app->appointments;
|
||||
e_cal_client_generate_instances_sync (cal,
|
||||
app->since,
|
||||
app->until,
|
||||
NULL,
|
||||
generate_instances_cb,
|
||||
&data);
|
||||
|
||||
@@ -1099,7 +1078,7 @@ main (int argc,
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------------- */
|
||||
|
||||
static void __attribute__((format(printf, 1, 0)))
|
||||
static void
|
||||
print_debug (const gchar *format, ...)
|
||||
{
|
||||
gchar *s;
|
||||
|
@@ -266,7 +266,7 @@ main (int argc,
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------------- */
|
||||
|
||||
static void __attribute__((format(printf, 1, 0)))
|
||||
static void
|
||||
print_debug (const gchar *format, ...)
|
||||
{
|
||||
gchar *s;
|
||||
|