Compare commits

..

1 Commits

Author SHA1 Message Date
Jakub Steiner
c6172739a2 theme: window close button touchup
- tone down the shading considerably to match the previous look

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/453
2019-03-11 20:52:27 +01:00
90 changed files with 5274 additions and 5221 deletions

1
.gitignore vendored
View File

@@ -80,4 +80,3 @@ tests/run-test.sh
*~
*.patch
*.sw?
.vscode

View File

@@ -15,10 +15,10 @@ variables:
- merge_requests
check_commit_log:
image: registry.gitlab.gnome.org/gnome/mutter/master:v1
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:

View File

@@ -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

31
NEWS
View File

@@ -1,34 +1,3 @@
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]

View File

@@ -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>

View File

@@ -21,8 +21,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>

View File

@@ -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;
@@ -1137,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; }
@@ -1150,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 -2px 0 0 transparentize($selected_bg_color, 0.9);
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;
}
}
@@ -1231,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;

View File

@@ -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

View 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

View File

@@ -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
View 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

View File

@@ -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);

View File

@@ -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);

View File

@@ -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;

View File

@@ -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);

View File

@@ -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" },

View File

@@ -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;

View File

@@ -477,8 +477,8 @@ var CyclerList = GObject.registerClass({
var CyclerPopup = GObject.registerClass(
class CyclerPopup extends SwitcherPopup.SwitcherPopup {
_init() {
if (this.constructor.name === CyclerPopup.prototype.constructor.name)
throw new TypeError(`Cannot instantiate abstract class ${this.constructor.name}`);
if (new.target === CyclerPopup)
throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
super._init();
@@ -619,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() {

View File

@@ -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,
@@ -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();

View File

@@ -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',
};

View File

@@ -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) {

View File

@@ -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) {

View File

@@ -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();

View File

@@ -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];

View File

@@ -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 });

View File

@@ -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';

View File

@@ -306,9 +306,6 @@ var _Draggable = class _Draggable {
* for the draggable.
*/
startDrag(stageX, stageY, time, sequence, device) {
if (currentDraggable)
return;
if (device == undefined) {
let event = Clutter.get_current_event();
@@ -450,8 +447,7 @@ var _Draggable = class _Draggable {
let [stageX, stageY] = event.get_coords();
// See if the user has moved the mouse enough to trigger a drag
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
let threshold = St.Settings.get().drag_threshold * scaleFactor;
let threshold = St.Settings.get().drag_threshold;
if (!currentDraggable &&
(Math.abs(stageX - this._dragStartX) > threshold ||
Math.abs(stageY - this._dragStartY) > threshold)) {

View File

@@ -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() {

View File

@@ -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);
}

View File

@@ -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 });
@@ -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,

View File

@@ -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));
@@ -1162,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,
@@ -1202,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();
}
@@ -1355,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);
});
}
@@ -1382,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) {
@@ -1442,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) {
@@ -1472,13 +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._currentPage = null;
this._groups = {};
this._groups = [];
this._onGroupChanged();
}
@@ -1521,12 +1513,12 @@ var Keyboard = class Keyboard {
let activeGroupName = this._keyboardController.getCurrentGroup();
let layers = this._groups[activeGroupName];
if (this._currentPage != null) {
this._setCurrentLevelLatched(this._currentPage, false);
this._currentPage.hide();
if (this._current_page != null) {
this._setCurrentLevelLatched(this._current_page, false);
this._current_page.hide();
}
this._currentPage = layers[activeLevel];
this._current_page = layers[activeLevel];
this._updateCurrentPageVisible();
}

View File

@@ -252,7 +252,7 @@ var LayoutManager = GObject.registerClass({
// 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);

View File

@@ -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();
}
@@ -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);
}
};

View File

@@ -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);
}
});
}

View File

@@ -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;

View File

@@ -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)

View File

@@ -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];
}
});

View File

@@ -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() {

View File

@@ -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();
});
@@ -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();
@@ -806,7 +809,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 +827,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 +882,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 +976,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 +1021,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 +1043,7 @@ class Panel extends St.Widget {
return;
let menu = indicator.menu;
if (!indicator.reactive)
if (!indicator.actor.reactive)
return;
menu.close();
@@ -1185,21 +1201,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
});
}
});

View File

@@ -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

View File

@@ -277,6 +277,12 @@ var Switch = class {
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);
}
@@ -397,8 +403,8 @@ var PopupImageMenuItem = class extends PopupBaseMenuItem {
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;
@@ -853,7 +859,7 @@ var PopupMenu = class extends PopupMenuBase {
if (this._activeMenuItem)
this._activeMenuItem.setActive(false);
if (this._boxPointer.visible) {
if (this._boxPointer.actor.visible) {
this._boxPointer.close(animate, () => {
this.emit('menu-closed');
});
@@ -1180,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 = [];
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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);
});
}

View File

@@ -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);

View File

@@ -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);

View File

@@ -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;
}
});

View File

@@ -125,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() {
@@ -822,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);
@@ -908,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);

View File

@@ -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;
@@ -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 = '';
@@ -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();
}

View File

@@ -236,7 +236,6 @@ var Indicator = class extends PanelMenu.SystemIndicator {
item = new PopupMenu.PopupBaseMenuItem({ reactive: false,
can_focus: false });
this.buttonGroup = item.actor;
let app = this._settingsApp = Shell.AppSystem.get_default().lookup_app(
'gnome-control-center.desktop'

View File

@@ -33,8 +33,8 @@ function primaryModifier(mask) {
var SwitcherPopup = GObject.registerClass(
class SwitcherPopup extends St.Widget {
_init(items) {
if (this.constructor.name === SwitcherPopup.prototype.constructor.name)
throw new TypeError(`Cannot instantiate abstract class ${this.constructor.name}`);
if (new.target === SwitcherPopup)
throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
super._init({ style_class: 'switcher-popup',
reactive: true,

View File

@@ -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

View File

@@ -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', () => {

View File

@@ -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;

View File

@@ -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) {

View File

@@ -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' });

View File

@@ -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,7 +82,6 @@ var WorkspacesView = class extends WorkspacesViewBase {
this._animating = false; // tweening
this._scrolling = false; // swipe-scrolling
this._gestureActive = false; // touch(pad) gestures
this._animatingScroll = false; // programatically updating the adjustment
let activeWorkspaceIndex = workspaceManager.get_active_workspace_index();
@@ -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,41 +430,27 @@ 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 = [];
this._primaryScrollAdjustment = null;
switchGesture.enabled = this.actor.mapped;
this._settings = new Gio.Settings({ schema_id: MUTTER_SCHEMA });
this._settings.connect('changed::workspaces-only-on-primary',
@@ -508,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);
}

View File

@@ -1,5 +1,5 @@
project('gnome-shell', 'c',
version: '3.32.1',
version: '3.32.0',
meson_version: '>= 0.47.0',
license: 'GPLv2+'
)
@@ -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',

1038
po/ar.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

193
po/eo.po
View File

@@ -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-04-17 19:29+0000\n"
"PO-Revision-Date: 2019-05-01 16:29+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 "Somethings gone wrong"
msgstr "Io fiaskis"
@@ -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,38 +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 "Windows"
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."
@@ -994,7 +993,7 @@ msgstr "Portebla larĝkapacita retopasvorto"
msgid "A password is required to connect to “%s”."
msgstr "Pasvorto estas bezonata por konekti al “%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 "Retadministrilo"
@@ -1066,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"
@@ -1241,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"
@@ -1311,13 +1310,13 @@ msgid "Leave On"
msgstr "Lasi ŝaltita"
#: 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 "Ŝalti"
#: 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"
@@ -1327,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:1480
#: js/ui/messageTray.js:1474
msgid "System Information"
msgstr "Sisteminformoj"
@@ -1405,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…"
@@ -1458,25 +1456,34 @@ 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"
#: js/ui/panel.js:864
#: js/ui/panel.js:861
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"
@@ -1513,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"
@@ -1528,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"
@@ -1694,7 +1701,7 @@ msgid "<unknown>"
msgstr "<nekonata>"
#. 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 malŝaltita"
@@ -1720,7 +1727,7 @@ msgid "%s Disconnecting"
msgstr "%s malkonektante"
#. 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 konektante"
@@ -1760,7 +1767,7 @@ msgid "Mobile Broadband Settings"
msgstr "Porteblaj larĝkapacitaj agordoj"
#. 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 aparataro malŝaltita"
@@ -1825,72 +1832,72 @@ msgid "Wi-Fi Settings"
msgstr "Vifio-agordoj"
#. 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 retkaptejo aktiva"
#. 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 ne konektita"
msgstr "%s nekonektita"
#: js/ui/status/network.js:1392
#: js/ui/status/network.js:1393
msgid "connecting…"
msgstr "konektante…"
#. 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 "aŭtentigo necesas"
#: js/ui/status/network.js:1397
#: js/ui/status/network.js:1398
msgid "connection failed"
msgstr "konekto malsukcesis"
#: js/ui/status/network.js:1447
#: js/ui/status/network.js:1448
msgid "VPN Settings"
msgstr "VPR-agordoj"
#: js/ui/status/network.js:1464
#: js/ui/status/network.js:1465
msgid "VPN"
msgstr "VPR"
#: js/ui/status/network.js:1474
#: js/ui/status/network.js:1475
msgid "VPN Off"
msgstr "VPR malŝaltita"
#: 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 "Ret-agordoj"
#: 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 drata konekto"
msgstr[1] "%s drataj konektoj"
#: 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 vifia konekto"
msgstr[1] "%s vifiaj konektoj"
#: 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 modema konekto"
msgstr[1] "%s modemaj konektoj"
#: js/ui/status/network.js:1705
#: js/ui/status/network.js:1702
msgid "Connection failed"
msgstr "Konekto malsukcesis"
#: js/ui/status/network.js:1706
#: js/ui/status/network.js:1703
msgid "Activation of network connection failed"
msgstr "Aktivigo de reto-konekto malsukcesis"
@@ -1972,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"
@@ -2095,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"
@@ -2168,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"
@@ -2184,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”"
@@ -2208,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"
@@ -2217,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:"

800
po/es.po

File diff suppressed because it is too large Load Diff

114
po/fr.po
View File

@@ -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 dutilisateur : "
#: 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 "Lapplication 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 na é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 daccè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 "Lactivation 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 dauthentification a été écartée par lutilisateur"
#. 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"

783
po/fur.po

File diff suppressed because it is too large Load Diff

1520
po/hr.po

File diff suppressed because it is too large Load Diff

178
po/id.po
View File

@@ -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 "Somethings 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:"

1029
po/sk.po

File diff suppressed because it is too large Load Diff

144
po/tg.po
View File

@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: Tajik Gnome\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2019-03-02 10:57+0000\n"
"PO-Revision-Date: 2019-03-13 21:44+0500\n"
"PO-Revision-Date: 2019-03-06 20:14+0500\n"
"Last-Translator: Victor Ibragimov <victor.ibragimov@gmail.com>\n"
"Language-Team: \n"
"Language: tg\n"
@@ -32,7 +32,7 @@ msgstr "Марказонидани огоҳии фаъол"
#: data/50-gnome-shell-system.xml:15
msgid "Show the overview"
msgstr "Намоиш додани ҷамъбаст"
msgstr "Намоиш додани хулоса"
#: data/50-gnome-shell-system.xml:18
msgid "Show all applications"
@@ -82,7 +82,7 @@ msgstr "Ғайрифаъол кардани васеъшавиҳои корба
#: data/org.gnome.shell.gschema.xml.in:27
msgid "Disable all extensions the user has enabled without affecting the “enabled-extension” setting."
msgstr "Ҳамаи васеъшавиҳое, ки корбар фаъол кард, бе расонидани таъсир ба танзими “васеъшавиии-фаъол” ғайрифаъол карда мешаванд."
msgstr ""
#: data/org.gnome.shell.gschema.xml.in:34
msgid "Disables the validation of extension version compatibility"
@@ -188,11 +188,11 @@ msgstr "Тугмабандӣ барои иваз кардани намоёнии
#: data/org.gnome.shell.gschema.xml.in:138
msgid "Keybinding to focus the active notification"
msgstr "Тугмабандӣ барои марказонидани огоҳии фаъол"
msgstr "Тугмабандӣ барои гузоштани фокус ба огоҳии фаъол"
#: data/org.gnome.shell.gschema.xml.in:139
msgid "Keybinding to focus the active notification."
msgstr "Тугмабандӣ барои марказонидани огоҳии фаъол."
msgstr "Тугмабандӣ барои гузоштани фокус ба огоҳии фаъол."
#: data/org.gnome.shell.gschema.xml.in:145
msgid "Keybinding that pauses and resumes all running tweens, for debugging purposes"
@@ -245,11 +245,11 @@ msgstr "Гузариш ба барномаи 9"
#: data/org.gnome.shell.gschema.xml.in:190
msgid "Which keyboard to use"
msgstr "Клавиатураро интихоб намоед"
msgstr "Клавиатураро интихоб кунед"
#: data/org.gnome.shell.gschema.xml.in:191
msgid "The type of keyboard to use."
msgstr "Навъи клавиатурае, ки истифода мешавад."
msgstr "Намуди клавиатура барои истифода."
#: data/org.gnome.shell.gschema.xml.in:202
#: data/org.gnome.shell.gschema.xml.in:229
@@ -308,15 +308,15 @@ 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 "Somethings gone wrong"
msgstr "Чизе нодуруст ба миён омад"
msgstr ""
#: js/extensionPrefs/main.js:123
msgid "Were very sorry, but theres been a problem: the settings for this extension cant be displayed. We recommend that you report the issue to the extension authors."
msgstr "Мутаассифона, хатое ба вуҷуд омад: танзимот барои ин васеъшавӣ нишон дода намешавад. Тавсия дода мешавад, ки шумо дар бораи хато ба муаллифони васеъшавӣ гузориш диҳед."
msgstr ""
#: js/extensionPrefs/main.js:130
#| msgid "Show Details"
@@ -330,7 +330,7 @@ msgstr "Намоиш додани хатоҳо"
#: js/extensionPrefs/main.js:185
msgid "Homepage"
msgstr "Саҳифаи асосӣ"
msgstr ""
#: js/extensionPrefs/main.js:186
#| msgid "UUIDs of extensions to enable"
@@ -340,15 +340,15 @@ msgstr "Рамзҳои UUID барои пасвандҳои фаъолшаван
#: js/extensionPrefs/main.js:449
#| msgid "No extensions installed"
msgid "No Extensions Installed"
msgstr "Ягон васеъшавӣ насб нашудааст"
msgstr "Ягон пасванд насб нашудааст"
#: js/extensionPrefs/main.js:459
msgid "Extensions can be installed through Software or <a href=\"https://extensions.gnome.org\">extensions.gnome.org</a>."
msgstr "Васеъшавиҳо ба воситаи низоми нармафзор ё <a href=\"https://extensions.gnome.org\">extensions.gnome.org</a> ҷорӣ карда мешаванд."
msgstr ""
#: js/extensionPrefs/main.js:474
msgid "Browse in Software"
msgstr "Намоиш дар низоми нармафзор"
msgstr ""
#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136
@@ -430,7 +430,7 @@ msgstr ""
#: js/misc/systemActions.js:95
msgctxt "search-result"
msgid "Lock Screen"
msgstr "Қулф кардани экран"
msgstr ""
#. Translators: A list of keywords that match the lock screen action, separated by semicolons
#: js/misc/systemActions.js:98
@@ -454,13 +454,13 @@ msgstr ""
#| msgid "Suspend"
msgctxt "search-result"
msgid "Suspend"
msgstr "Таваққуф кардани низом"
msgstr "Таваққуф кардан"
#. Translators: A list of keywords that match the suspend action, separated by semicolons
#: js/misc/systemActions.js:112
#| msgid "Suspend"
msgid "suspend;sleep"
msgstr "таваққуф;хоб"
msgstr "Таваққуф"
#. Translators: The name of the switch user action in search
#: js/misc/systemActions.js:116
@@ -473,14 +473,14 @@ msgstr "Иваз кардани корбар"
#: js/misc/systemActions.js:119
#| msgid "Switch User"
msgid "switch user"
msgstr "ивази корбар"
msgstr "Таъвизи корбар"
#. Translators: The name of the lock orientation action in search
#: js/misc/systemActions.js:123
#| msgid "Orientation Lock"
msgctxt "search-result"
msgid "Lock Orientation"
msgstr "Қулфи самти экран"
msgstr "Қулфи самт"
#. Translators: A list of keywords that match the lock orientation action, separated by semicolons
#: js/misc/systemActions.js:126
@@ -504,7 +504,7 @@ msgstr "Иҷрокунии “%s” қатъ шудааст:"
#: js/misc/util.js:175
msgid "Just now"
msgstr "Ҳоли ҳозир"
msgstr ""
#: js/misc/util.js:177
#, javascript-format
@@ -533,29 +533,29 @@ msgstr "Дирӯз"
#, javascript-format
msgid "%d day ago"
msgid_plural "%d days ago"
msgstr[0] "%d рӯз пеш"
msgstr[1] "%d рӯз пеш"
msgstr[0] ""
msgstr[1] ""
#: js/misc/util.js:188
#, javascript-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
msgstr[0] "%d ҳафта пеш"
msgstr[1] "%d ҳафта пеш"
msgstr[0] ""
msgstr[1] ""
#: js/misc/util.js:191
#, javascript-format
msgid "%d month ago"
msgid_plural "%d months ago"
msgstr[0] "%d моҳ пеш"
msgstr[1] "%d моҳ пеш"
msgstr[0] ""
msgstr[1] ""
#: js/misc/util.js:193
#, javascript-format
msgid "%d year ago"
msgid_plural "%d years ago"
msgstr[0] "%d сол пеш"
msgstr[1] "%d сол пеш"
msgstr[0] ""
msgstr[1] ""
#. Translators: Time in 24h format
#: js/misc/util.js:223
@@ -635,22 +635,22 @@ msgstr "%B %d %Y, %l%M %p"
#: js/portalHelper/main.js:40
#| msgid "Hotspot Active"
msgid "Hotspot Login"
msgstr "Воридшавӣ ба нуқтаи пайваст"
msgstr "Hotspot фаъол аст"
#: js/portalHelper/main.js:86
msgid "Your connection to this hotspot login is not secure. Passwords or other information you enter on this page can be viewed by people nearby."
msgstr "Пайвасти воридшавии шумо ба нуқтаи пайвасти ҷорӣ бехатар намебошад. Ниҳонвожаҳо ё маълумоти дигаре, ки дар ин саҳифа ворид карда мешавад, метавонанд бо одамони дар гидру атроф ошкор карда шаванд."
msgstr ""
#. No support for non-modal system dialogs, so ignore the option
#. let modal = options['modal'] || true;
#: js/ui/accessDialog.js:37 js/ui/status/location.js:360
msgid "Deny Access"
msgstr "Манъ кардани дастрасӣ"
msgstr ""
#: js/ui/accessDialog.js:38 js/ui/status/location.js:363
#| msgid "Always grant access"
msgid "Grant Access"
msgstr "Иҷозат додани дастрасӣ"
msgstr "Ҳамеша иҷозат додан"
#: js/ui/appDisplay.js:660
msgid "Frequently used applications will appear here"
@@ -697,7 +697,7 @@ msgstr "%s аз баргузидаҳои шумо тоза шудааст."
#: js/ui/audioDeviceSelection.js:42
#| msgid "Send Files to Device…"
msgid "Select Audio Device"
msgstr "Интихоби дастгоҳи аудиоӣ"
msgstr "Фиристодани файлҳо ба дастгоҳ..."
#: js/ui/audioDeviceSelection.js:53
msgid "Sound Settings"
@@ -705,11 +705,11 @@ msgstr "Танзимоти садо"
#: js/ui/audioDeviceSelection.js:62
msgid "Headphones"
msgstr "Гӯшмонакҳо"
msgstr ""
#: js/ui/audioDeviceSelection.js:64
msgid "Headset"
msgstr "Гӯшмонак бо микрофон"
msgstr ""
#: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247
msgid "Microphone"
@@ -717,7 +717,7 @@ msgstr "Микрофон"
#: js/ui/backgroundMenu.js:13
msgid "Change Background…"
msgstr "Тағйир додани пазсамина"
msgstr "Тағйир додани пазсамина..."
#: js/ui/backgroundMenu.js:15 js/ui/status/nightLight.js:43
msgid "Display Settings"
@@ -800,7 +800,7 @@ msgstr "%OB"
#.
#: js/ui/calendar.js:342
msgid "%OB %Y"
msgstr "%OB %Y"
msgstr ""
#: js/ui/calendar.js:399
msgid "Previous month"
@@ -854,14 +854,14 @@ msgstr "Ягон рӯйдод нест"
#: js/ui/calendar.js:1075
msgid "Clear"
msgstr "Пок кардан"
msgstr ""
#. Translators: %s is an application name
#: js/ui/closeDialog.js:42
#, javascript-format
#| msgid "“%s” is ready"
msgid "“%s” is not responding."
msgstr "“%s” ҷавоб намедиҳад."
msgstr "“%s” омода аст"
#: js/ui/closeDialog.js:43
msgid "You may choose to wait a short while for it to continue or force the application to quit entirely."
@@ -869,11 +869,11 @@ msgstr ""
#: js/ui/closeDialog.js:59
msgid "Force Quit"
msgstr "Маҷбуран пӯшида шавад"
msgstr ""
#: js/ui/closeDialog.js:62
msgid "Wait"
msgstr "Интизор шавед"
msgstr ""
#: js/ui/components/automountManager.js:86
msgid "External drive connected"
@@ -910,24 +910,24 @@ msgstr "Пайваст шудан"
#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265
#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295
msgid "Password: "
msgstr "Ниҳонвожа: "
msgstr "Ниҳонвожа:"
#. static WEP
#: js/ui/components/networkAgent.js:216
msgid "Key: "
msgstr "Калид: "
msgstr "Калид:"
#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271
msgid "Private key password: "
msgstr "Ниҳонвожаи калиди шахсӣ: "
msgstr "Пароли калиди шахсӣ:"
#: js/ui/components/networkAgent.js:269
msgid "Identity: "
msgstr "Шахсият: "
msgstr "Шахсият:"
#: js/ui/components/networkAgent.js:283
msgid "Service: "
msgstr "Хидмат: "
msgstr "Хидмат:"
#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685
msgid "Authentication required by wireless network"
@@ -944,7 +944,7 @@ msgstr "Санҷиши ҳаққонияти 802.1X-и симдор"
#: js/ui/components/networkAgent.js:319
msgid "Network name: "
msgstr "Номи шабака: "
msgstr "Номи шабака:"
#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693
msgid "DSL authentication"
@@ -960,7 +960,7 @@ msgstr "Барои дастгоҳи паҳннавори мобилӣ рамзи
#: js/ui/components/networkAgent.js:333
msgid "PIN: "
msgstr "PIN: "
msgstr "PIN:"
#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706
msgid "Mobile broadband network password"
@@ -1051,12 +1051,12 @@ msgstr "Обу ҳаво"
#: js/ui/dateMenu.js:305
#| msgid "Select a network"
msgid "Select a location…"
msgstr "Интихоби ҷойгиршавӣ…"
msgstr "Интихоб кардани шабака"
#: js/ui/dateMenu.js:313
#| msgid "Searching…"
msgid "Loading…"
msgstr "Бор шуда истодааст"
msgstr "Ҷустуҷӯ рафта истодааст..."
#: js/ui/dateMenu.js:323
msgid "Go online for weather information"
@@ -1274,7 +1274,7 @@ msgstr ""
#: js/ui/kbdA11yDialog.js:57
msgid "Leave On"
msgstr "Ҳамеша фаъол"
msgstr ""
#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133
#: js/ui/status/network.js:1264
@@ -1287,11 +1287,11 @@ msgstr "Фаъол кардан"
#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79
#: js/ui/status/rfkill.js:106
msgid "Turn Off"
msgstr "Ғайрифаъол кардан"
msgstr "Хомӯш кардан"
#: js/ui/kbdA11yDialog.js:65
msgid "Leave Off"
msgstr "Ҳамеша ғайрифаъол"
msgstr ""
#: js/ui/keyboard.js:203
msgid "Region & Language Settings"
@@ -1327,7 +1327,7 @@ msgstr "Ғайрифаъол"
#: js/ui/lookingGlass.js:693
msgid "Error"
msgstr "Хато"
msgstr "Хатогӣ"
#: js/ui/lookingGlass.js:695
msgid "Out of date"
@@ -1372,7 +1372,7 @@ msgstr "Ботил сохтан"
#. activities. See also note for "Activities" string.
#: js/ui/overview.js:100
msgid "Overview"
msgstr "Ҷамъбаст"
msgstr "Хулоса"
#. Translators: this is the text displayed
#. in the search entry when no search is
@@ -1380,20 +1380,20 @@ msgstr "Ҷамъбаст"
#. characters.
#: js/ui/overview.js:226
msgid "Type to search…"
msgstr "Барои ҷустуҷӯ чизеро чоп намоед…"
msgstr "Ҷустуҷӯ кардан..."
#: js/ui/padOsd.js:92
msgid "New shortcut…"
msgstr "Миёнбури нав…"
msgstr ""
#: js/ui/padOsd.js:141
#| msgid "Applications"
msgid "Application defined"
msgstr "Барномаи муайяншуда"
msgstr "Барномаҳо"
#: js/ui/padOsd.js:142
msgid "Show on-screen help"
msgstr "Намоиш додани кумаки экранӣ"
msgstr ""
#: js/ui/padOsd.js:143
#| msgid "Switch User"
@@ -1406,7 +1406,7 @@ msgstr ""
#: js/ui/padOsd.js:209
msgid "Done"
msgstr "Тайёр"
msgstr ""
#: js/ui/padOsd.js:721
msgid "Edit…"
@@ -1414,19 +1414,19 @@ msgstr "Таҳрир кардан…"
#: js/ui/padOsd.js:763 js/ui/padOsd.js:868
msgid "None"
msgstr "Ҳеҷ"
msgstr ""
#: js/ui/padOsd.js:822
msgid "Press a button to configure"
msgstr "Барои идома тугмаеро пахш намоед"
msgstr ""
#: js/ui/padOsd.js:823
msgid "Press Esc to exit"
msgstr "Барои баромад тугмаи Esc-ро пахш намоед"
msgstr ""
#: js/ui/padOsd.js:826
msgid "Press any key to exit"
msgstr "Барои баромад тугмаи дилхоҳро пахш намоед"
msgstr ""
#: js/ui/panel.js:108
msgid "Quit"
@@ -1446,7 +1446,7 @@ msgstr "Низом"
#: js/ui/panel.js:861
msgid "Top Bar"
msgstr "Лавҳаии болоӣ"
msgstr "Панели боло"
#. Translators: this MUST be either "toggle-switch-us"
#. (for toggle switches containing the English words
@@ -1519,7 +1519,7 @@ msgstr "Қулф аз тарави барнома баста шудааст"
#: js/ui/search.js:635
msgid "Searching…"
msgstr "Дар ҳоли ҷустуҷӯ…"
msgstr "Ҷустуҷӯ рафта истодааст..."
#: js/ui/search.js:637
msgid "No results."
@@ -1836,7 +1836,7 @@ msgstr "%s пайваст нашудааст"
#: js/ui/status/network.js:1393
#| msgid "Connecting"
msgid "connecting…"
msgstr "пайваст шуда истодааст…"
msgstr "Пайвастшавӣ"
#. Translators: this is for network connections that require some kind of key or password
#: js/ui/status/network.js:1396
@@ -1894,7 +1894,7 @@ msgstr "Пайваст қатъ шудааст"
#: js/ui/status/network.js:1703
msgid "Activation of network connection failed"
msgstr "Фаъолсозии пайвасти шабака қатъ шуд"
msgstr "Фаъолсозии пайвасти шабака қатъ шудааст."
#: js/ui/status/nightLight.js:60
#| msgid "Networking is disabled"
@@ -1929,7 +1929,7 @@ msgstr ""
#. to estimate battery life
#: js/ui/status/power.js:70 js/ui/status/power.js:76
msgid "Estimating…"
msgstr "Ҳисоб шуда истодааст"
msgstr "Ҳисоб шуда истодааст..."
#. Translators: this is <hours>:<minutes> Remaining (<percentage>)
#: js/ui/status/power.js:84
@@ -1948,7 +1948,7 @@ msgstr "%d%02d то пур шудан (%d%%)"
#: js/ui/status/power.js:117 js/ui/status/power.js:119
#, javascript-format
msgid "%d%%"
msgstr "%d%%"
msgstr ""
#: js/ui/status/remoteAccess.js:42
msgid "Screen is Being Shared"
@@ -1978,11 +1978,11 @@ msgstr "Баромад аз мизи корӣ"
#: js/ui/status/system.js:227
#| msgid "Sound Settings"
msgid "Account Settings"
msgstr "Танзимоти ҳисоб"
msgstr "Танзимоти садо"
#: js/ui/status/system.js:255
msgid "Orientation Lock"
msgstr "Қулфи самти экран"
msgstr "Қулфи самт"
#: js/ui/status/system.js:281
msgid "Suspend"

File diff suppressed because it is too large Load Diff

View File

@@ -1078,7 +1078,7 @@ main (int argc,
/* ---------------------------------------------------------------------------------------------------- */
static void __attribute__((format(printf, 1, 0)))
static void
print_debug (const gchar *format, ...)
{
gchar *s;

View File

@@ -266,7 +266,7 @@ main (int argc,
/* ---------------------------------------------------------------------------------------------------- */
static void __attribute__((format(printf, 1, 0)))
static void
print_debug (const gchar *format, ...)
{
gchar *s;

View File

@@ -1069,9 +1069,9 @@ _shell_app_add_window (ShellApp *app,
app->running_state->window_sort_stale = TRUE;
app->running_state->windows = g_slist_prepend (app->running_state->windows, g_object_ref (window));
g_signal_connect_object (window, "unmanaged", G_CALLBACK(shell_app_on_unmanaged), app, 0);
g_signal_connect_object (window, "notify::user-time", G_CALLBACK(shell_app_on_user_time_changed), app, 0);
g_signal_connect_object (window, "notify::skip-taskbar", G_CALLBACK(shell_app_on_skip_taskbar_changed), app, 0);
g_signal_connect (window, "unmanaged", G_CALLBACK(shell_app_on_unmanaged), app);
g_signal_connect (window, "notify::user-time", G_CALLBACK(shell_app_on_user_time_changed), app);
g_signal_connect (window, "notify::skip-taskbar", G_CALLBACK(shell_app_on_skip_taskbar_changed), app);
shell_app_update_app_actions (app, window);
shell_app_ensure_busy_watch (app);
@@ -1183,26 +1183,13 @@ _shell_app_handle_startup_sequence (ShellApp *app,
gboolean
shell_app_request_quit (ShellApp *app)
{
GActionGroup *group = NULL;
GSList *iter;
if (shell_app_get_state (app) != SHELL_APP_STATE_RUNNING)
return FALSE;
/* First, check whether the app exports an explicit "quit" action
* that we can activate on the bus
*/
group = G_ACTION_GROUP (app->running_state->muxer);
/* TODO - check for an XSMP connection; we could probably use that */
if (g_action_group_has_action (group, "app.quit") &&
g_action_group_get_action_parameter_type (group, "app.quit") == NULL)
{
g_action_group_activate_action (group, "app.quit", NULL);
return TRUE;
}
/* Otherwise, fall back to closing all the app's windows */
for (iter = app->running_state->windows; iter; iter = iter->next)
{
MetaWindow *win = iter->data;

View File

@@ -863,7 +863,6 @@ _shell_global_set_plugin (ShellGlobal *global,
}
st_entry_set_cursor_func (entry_cursor_func, global);
st_clipboard_set_selection (meta_display_get_selection (display));
g_signal_connect (global->stage, "notify::width",
G_CALLBACK (global_stage_notify_width), global);

View File

@@ -149,7 +149,7 @@ shell_glsl_quad_constructed (GObject *object)
priv->pipeline = cogl_pipeline_copy (klass->base_pipeline);
cogl_pipeline_set_layer_null_texture (priv->pipeline, 0);
cogl_pipeline_set_layer_null_texture (priv->pipeline, 0, COGL_TEXTURE_TYPE_2D);
}
static void

View File

@@ -186,7 +186,9 @@ shell_invert_lightness_effect_init (ShellInvertLightnessEffect *self)
cogl_pipeline_add_layer_snippet (klass->base_pipeline, 0, snippet);
cogl_object_unref (snippet);
cogl_pipeline_set_layer_null_texture (klass->base_pipeline, 0);
cogl_pipeline_set_layer_null_texture (klass->base_pipeline,
0, /* layer number */
COGL_TEXTURE_TYPE_2D);
}
self->pipeline = cogl_pipeline_copy (klass->base_pipeline);

View File

@@ -17,13 +17,15 @@
#include <meta/meta-cursor-tracker.h>
#include <meta/display.h>
#include <meta/compositor-mutter.h>
#include <st/st.h>
#include "shell-global.h"
#include "shell-recorder-src.h"
#include "shell-recorder.h"
#include "shell-util.h"
#define A11Y_APPS_SCHEMA "org.gnome.desktop.a11y.applications"
#define MAGNIFIER_ACTIVE_KEY "screen-magnifier-enabled"
typedef enum {
RECORDER_STATE_CLOSED,
RECORDER_STATE_RECORDING
@@ -56,6 +58,7 @@ struct _ShellRecorder {
int pointer_x;
int pointer_y;
GSettings *a11y_settings;
gboolean draw_cursor;
MetaCursorTracker *cursor_tracker;
cairo_surface_t *cursor_image;
@@ -210,6 +213,8 @@ shell_recorder_init (ShellRecorder *recorder)
recorder->memory_target = get_memory_target();
recorder->a11y_settings = g_settings_new (A11Y_APPS_SCHEMA);
recorder->state = RECORDER_STATE_CLOSED;
recorder->framerate = DEFAULT_FRAMES_PER_SECOND;
recorder->draw_cursor = TRUE;
@@ -234,6 +239,8 @@ shell_recorder_finalize (GObject *object)
recorder_remove_redraw_timeout (recorder);
g_clear_object (&recorder->a11y_settings);
G_OBJECT_CLASS (shell_recorder_parent_class)->finalize (object);
}
@@ -458,16 +465,9 @@ recorder_record_frame (ShellRecorder *recorder,
GST_BUFFER_PTS(buffer) = now;
if (recorder->draw_cursor)
{
StSettings *settings = st_settings_get ();
gboolean magnifier_active = FALSE;
g_object_get (settings, "magnifier-active", &magnifier_active, NULL);
if (magnifier_active)
recorder_draw_cursor (recorder, buffer);
}
if (recorder->draw_cursor &&
!g_settings_get_boolean (recorder->a11y_settings, MAGNIFIER_ACTIVE_KEY))
recorder_draw_cursor (recorder, buffer);
shell_recorder_src_add_buffer (SHELL_RECORDER_SRC (recorder->current_pipeline->src), buffer);
gst_buffer_unref (buffer);

View File

@@ -7,12 +7,14 @@
#include <meta/meta-plugin.h>
#include <meta/meta-shaped-texture.h>
#include <meta/meta-cursor-tracker.h>
#include <st/st.h>
#include "shell-global.h"
#include "shell-screenshot.h"
#include "shell-util.h"
#define A11Y_APPS_SCHEMA "org.gnome.desktop.a11y.applications"
#define MAGNIFIER_ACTIVE_KEY "screen-magnifier-enabled"
typedef struct _ShellScreenshotPrivate ShellScreenshotPrivate;
struct _ShellScreenshot
@@ -200,9 +202,6 @@ write_screenshot_thread (GTask *result,
cairo_image_surface_get_height (priv->image));
creation_time = g_date_time_format (priv->datetime, "%c");
if (!creation_time)
creation_time = g_date_time_format (priv->datetime, "%FT%T%z");
if (gdk_pixbuf_save_to_stream (pixbuf, stream, "png", NULL, NULL,
"tEXt::Software", "gnome-screenshot",
"tEXt::Creation Time", creation_time,
@@ -269,12 +268,9 @@ should_draw_cursor_image (ShellScreenshotMode mode)
{
if (mode == SHELL_SCREENSHOT_WINDOW || !meta_is_wayland_compositor ())
{
StSettings *settings = st_settings_get ();
gboolean magnifier_active = FALSE;
g_autoptr (GSettings) settings = g_settings_new (A11Y_APPS_SCHEMA);
g_object_get (settings, "magnifier-active", &magnifier_active, NULL);
if (!magnifier_active)
if (!g_settings_get_boolean (settings, MAGNIFIER_ACTIVE_KEY))
return TRUE;
}

View File

@@ -430,7 +430,7 @@ ClutterContent *
shell_util_get_content_for_window_actor (MetaWindowActor *window_actor,
MetaRectangle *window_rect)
{
MetaShapedTexture *texture;
ClutterActor *texture;
ClutterContent *content;
cairo_surface_t *surface;
cairo_rectangle_int_t clip;
@@ -453,7 +453,8 @@ shell_util_get_content_for_window_actor (MetaWindowActor *window_actor,
clip.width = ceilf (window_rect->width * resource_scale);
clip.height = ceilf (window_rect->height * resource_scale);
surface = meta_shaped_texture_get_image (texture, &clip);
surface = meta_shaped_texture_get_image (META_SHAPED_TEXTURE (texture),
&clip);
content = clutter_canvas_new ();
clutter_canvas_set_size (CLUTTER_CANVAS (content),

View File

@@ -125,7 +125,7 @@ st_cflags = [
libst = shared_library('st-1.0',
sources: st_gir_sources + st_non_gir_sources,
c_args: st_cflags,
dependencies: [clutter_dep, gtk_dep, croco_dep, mutter_dep, m_dep],
dependencies: [clutter_dep, gtk_dep, croco_dep, x11_dep, m_dep],
build_rpath: mutter_typelibdir,
install_rpath: mutter_typelibdir,
install_dir: pkglibdir,
@@ -152,7 +152,7 @@ libst_gir = gnome.generate_gir(libst,
sources: st_gir_sources,
nsversion: '1.0',
namespace: 'St',
includes: ['Clutter-' + mutter_api_version, 'Cally-' + mutter_api_version, 'Meta-' + mutter_api_version, 'Gtk-3.0'],
includes: ['Clutter-' + mutter_api_version, 'Cally-' + mutter_api_version, 'Gtk-3.0'],
dependencies: [mutter_dep],
include_directories: include_directories('..'),
extra_args: ['-DST_COMPILATION', '--quiet'],

View File

@@ -19,49 +19,251 @@
/**
* SECTION:st-clipboard
* @short_description: a simple representation of the clipboard
* @short_description: a simple representation of the X clipboard
*
* #StCliboard is a very simple object representation of the clipboard
* available to applications. Text is always assumed to be UTF-8 and non-text
* items are not handled.
*/
#include "config.h"
#include "st-clipboard.h"
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <gdk/gdk.h>
#include <gdk/gdkx.h>
#include <string.h>
#include <meta/display.h>
#include <meta/meta-selection-source-memory.h>
#include <meta/meta-selection.h>
struct _StClipboardPrivate
{
Window clipboard_window;
gchar *clipboard_text;
G_DEFINE_TYPE (StClipboard, st_clipboard, G_TYPE_OBJECT)
Atom *supported_targets;
gint n_targets;
};
typedef struct _TransferData TransferData;
struct _TransferData
G_DEFINE_TYPE_WITH_PRIVATE (StClipboard, st_clipboard, G_TYPE_OBJECT)
typedef struct _EventFilterData EventFilterData;
struct _EventFilterData
{
StClipboard *clipboard;
StClipboardCallbackFunc callback;
gpointer user_data;
GOutputStream *stream;
};
const char *supported_mimetypes[] = {
"text/plain;charset=utf-8",
"UTF8_STRING",
"text/plain",
"STRING",
};
static Atom __atom_primary = None;
static Atom __atom_clip = None;
static Atom __utf8_string = None;
static Atom __atom_targets = None;
static void
st_clipboard_dispose (GObject *object)
{
G_OBJECT_CLASS (st_clipboard_parent_class)->dispose (object);
}
static void
st_clipboard_finalize (GObject *object)
{
StClipboardPrivate *priv = ((StClipboard *) object)->priv;
g_free (priv->clipboard_text);
priv->clipboard_text = NULL;
g_free (priv->supported_targets);
priv->supported_targets = NULL;
priv->n_targets = 0;
G_OBJECT_CLASS (st_clipboard_parent_class)->finalize (object);
}
static GdkFilterReturn
st_clipboard_provider (GdkXEvent *xevent_p,
GdkEvent *gev,
void *user_data)
{
StClipboard *clipboard = user_data;
XEvent *xev = (XEvent *) xevent_p;
XSelectionEvent notify_event;
XSelectionRequestEvent *req_event;
GdkDisplay *display = gdk_display_get_default ();
if (xev->type != SelectionRequest ||
xev->xany.window != clipboard->priv->clipboard_window ||
!clipboard->priv->clipboard_text)
return GDK_FILTER_CONTINUE;
req_event = &xev->xselectionrequest;
gdk_x11_display_error_trap_push (display);
if (req_event->target == __atom_targets)
{
XChangeProperty (req_event->display,
req_event->requestor,
req_event->property,
XA_ATOM,
32,
PropModeReplace,
(guchar*) clipboard->priv->supported_targets,
clipboard->priv->n_targets);
}
else
{
XChangeProperty (req_event->display,
req_event->requestor,
req_event->property,
req_event->target,
8,
PropModeReplace,
(guchar*) clipboard->priv->clipboard_text,
strlen (clipboard->priv->clipboard_text));
}
notify_event.type = SelectionNotify;
notify_event.display = req_event->display;
notify_event.requestor = req_event->requestor;
notify_event.selection = req_event->selection;
notify_event.target = req_event->target;
notify_event.time = req_event->time;
if (req_event->property == None)
notify_event.property = req_event->target;
else
notify_event.property = req_event->property;
/* notify the requestor that they have a copy of the selection */
XSendEvent (req_event->display, req_event->requestor, False, 0,
(XEvent *) &notify_event);
/* Make it happen non async */
XSync (GDK_DISPLAY_XDISPLAY (display), FALSE);
if (gdk_x11_display_error_trap_pop (display))
{
/* FIXME: Warn here on fail ? */
}
return GDK_FILTER_REMOVE;
}
static MetaSelection *meta_selection = NULL;
static void
st_clipboard_class_init (StClipboardClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->dispose = st_clipboard_dispose;
object_class->finalize = st_clipboard_finalize;
}
static void
st_clipboard_init (StClipboard *self)
{
GdkDisplay *gdk_display;
Display *dpy;
StClipboardPrivate *priv;
priv = self->priv = st_clipboard_get_instance_private (self);
gdk_display = gdk_display_get_default ();
dpy = GDK_DISPLAY_XDISPLAY (gdk_display);
priv->clipboard_window =
XCreateSimpleWindow (dpy,
gdk_x11_get_default_root_xwindow (),
-1, -1, 1, 1, 0, 0, 0);
/* Only create once */
if (__atom_primary == None)
__atom_primary = XInternAtom (dpy, "PRIMARY", 0);
if (__atom_clip == None)
__atom_clip = XInternAtom (dpy, "CLIPBOARD", 0);
if (__utf8_string == None)
__utf8_string = XInternAtom (dpy, "UTF8_STRING", 0);
if (__atom_targets == None)
__atom_targets = XInternAtom (dpy, "TARGETS", 0);
priv->n_targets = 2;
priv->supported_targets = g_new (Atom, priv->n_targets);
priv->supported_targets[0] = __utf8_string;
priv->supported_targets[1] = __atom_targets;
gdk_window_add_filter (NULL, /* all windows */
st_clipboard_provider,
self);
}
static GdkFilterReturn
st_clipboard_x11_event_filter (GdkXEvent *xevent_p,
GdkEvent *gev,
void *user_data)
{
XEvent *xev = (XEvent *) xevent_p;
EventFilterData *filter_data = user_data;
StClipboardPrivate *priv = filter_data->clipboard->priv;
Atom actual_type;
int actual_format, result;
unsigned long nitems, bytes_after;
unsigned char *data = NULL;
GdkDisplay *display = gdk_display_get_default ();
if(xev->type != SelectionNotify ||
xev->xany.window != priv->clipboard_window)
return GDK_FILTER_CONTINUE;
if (xev->xselection.property == None)
{
/* clipboard empty */
filter_data->callback (filter_data->clipboard,
NULL,
filter_data->user_data);
gdk_window_remove_filter (NULL,
st_clipboard_x11_event_filter,
filter_data);
g_free (filter_data);
return GDK_FILTER_REMOVE;
}
gdk_x11_display_error_trap_push (display);
result = XGetWindowProperty (xev->xselection.display,
xev->xselection.requestor,
xev->xselection.property,
0L, G_MAXINT,
True,
AnyPropertyType,
&actual_type,
&actual_format,
&nitems,
&bytes_after,
&data);
if (gdk_x11_display_error_trap_pop (display) || result != Success)
{
/* FIXME: handle failure better */
g_warning ("Clipboard: prop retrival failed");
}
filter_data->callback (filter_data->clipboard, (char*) data,
filter_data->user_data);
gdk_window_remove_filter (NULL,
st_clipboard_x11_event_filter,
filter_data);
g_free (filter_data);
if (data)
XFree (data);
return GDK_FILTER_REMOVE;
}
/**
@@ -85,57 +287,10 @@ st_clipboard_get_default (void)
return default_clipboard;
}
static gboolean
convert_type (StClipboardType type,
MetaSelectionType *type_out)
static Atom
atom_for_clipboard_type (StClipboardType type)
{
if (type == ST_CLIPBOARD_TYPE_PRIMARY)
*type_out = META_SELECTION_PRIMARY;
else if (type == ST_CLIPBOARD_TYPE_CLIPBOARD)
*type_out = META_SELECTION_CLIPBOARD;
else
return FALSE;
return TRUE;
}
static const char *
pick_mimetype (MetaSelection *meta_selection,
MetaSelectionType selection_type)
{
const char *selected_mimetype = NULL;
GList *mimetypes;
int i;
mimetypes = meta_selection_get_mimetypes (meta_selection, selection_type);
for (i = 0; i < G_N_ELEMENTS (supported_mimetypes); i++)
{
if (g_list_find_custom (mimetypes, supported_mimetypes[i],
(GCompareFunc) g_strcmp0))
{
selected_mimetype = supported_mimetypes[i];
break;
}
}
g_list_free_full (mimetypes, g_free);
return selected_mimetype;
}
static void
transfer_cb (MetaSelection *selection,
GAsyncResult *res,
TransferData *data)
{
const gchar *text = NULL;
if (meta_selection_transfer_finish (selection, res, NULL))
text = g_memory_output_stream_get_data (G_MEMORY_OUTPUT_STREAM (data->stream));
data->callback (data->clipboard, text, data->user_data);
g_object_unref (data->stream);
g_free (data);
return type == ST_CLIPBOARD_TYPE_CLIPBOARD ? __atom_clip : __atom_primary;
}
/**
@@ -155,35 +310,37 @@ st_clipboard_get_text (StClipboard *clipboard,
StClipboardCallbackFunc callback,
gpointer user_data)
{
MetaSelectionType selection_type;
TransferData *data;
const char *mimetype = NULL;
EventFilterData *data;
GdkDisplay *gdk_display;
Display *dpy;
g_return_if_fail (ST_IS_CLIPBOARD (clipboard));
g_return_if_fail (meta_selection != NULL);
g_return_if_fail (callback != NULL);
if (convert_type (type, &selection_type))
mimetype = pick_mimetype (meta_selection, selection_type);
if (!mimetype)
{
callback (clipboard, NULL, user_data);
return;
}
data = g_new0 (TransferData, 1);
data = g_new0 (EventFilterData, 1);
data->clipboard = clipboard;
data->callback = callback;
data->user_data = user_data;
data->stream = g_memory_output_stream_new_resizable ();
meta_selection_transfer_async (meta_selection,
selection_type,
mimetype, -1,
data->stream, NULL,
(GAsyncReadyCallback) transfer_cb,
data);
gdk_window_add_filter (NULL, /* all windows */
st_clipboard_x11_event_filter,
data);
gdk_display = gdk_display_get_default ();
dpy = GDK_DISPLAY_XDISPLAY (gdk_display);
gdk_x11_display_error_trap_push (gdk_display);
XConvertSelection (dpy,
atom_for_clipboard_type (type),
__utf8_string, __utf8_string,
clipboard->priv->clipboard_window,
CurrentTime);
if (gdk_x11_display_error_trap_pop (gdk_display))
{
/* FIXME */
}
}
/**
@@ -199,26 +356,31 @@ st_clipboard_set_text (StClipboard *clipboard,
StClipboardType type,
const gchar *text)
{
MetaSelectionType selection_type;
MetaSelectionSource *source;
GBytes *bytes;
StClipboardPrivate *priv;
GdkDisplay *gdk_display;
Display *dpy;
g_return_if_fail (ST_IS_CLIPBOARD (clipboard));
g_return_if_fail (meta_selection != NULL);
g_return_if_fail (text != NULL);
if (!convert_type (type, &selection_type))
return;
priv = clipboard->priv;
bytes = g_bytes_new_take (g_strdup (text), strlen (text));
source = meta_selection_source_memory_new ("text/plain;charset=utf-8", bytes);
g_bytes_unref (bytes);
/* make a copy of the text */
g_free (priv->clipboard_text);
priv->clipboard_text = g_strdup (text);
meta_selection_set_owner (meta_selection, selection_type, source);
}
void
st_clipboard_set_selection (MetaSelection *selection)
{
meta_selection = selection;
/* tell X we own the clipboard selection */
gdk_display = gdk_display_get_default ();
dpy = GDK_DISPLAY_XDISPLAY (gdk_display);
gdk_x11_display_error_trap_push (gdk_display);
XSetSelectionOwner (dpy, atom_for_clipboard_type (type), priv->clipboard_window, CurrentTime);
XSync (dpy, FALSE);
if (gdk_x11_display_error_trap_pop (gdk_display))
{
/* FIXME */
}
}

View File

@@ -25,7 +25,6 @@
#define _ST_CLIPBOARD_H
#include <glib-object.h>
#include <meta/meta-selection.h>
G_BEGIN_DECLS
@@ -33,6 +32,7 @@ G_BEGIN_DECLS
G_DECLARE_FINAL_TYPE (StClipboard, st_clipboard, ST, CLIPBOARD, GObject)
typedef struct _StClipboard StClipboard;
typedef struct _StClipboardPrivate StClipboardPrivate;
/**
* StClipboard:
@@ -44,6 +44,7 @@ struct _StClipboard
{
/*< private >*/
GObject parent;
StClipboardPrivate *priv;
};
typedef enum {
@@ -73,8 +74,6 @@ void st_clipboard_set_text (StClipboard *clipboard,
StClipboardType type,
const gchar *text);
void st_clipboard_set_selection (MetaSelection *selection);
G_END_DECLS
#endif /* _ST_CLIPBOARD_H */

View File

@@ -206,8 +206,8 @@ st_icon_style_changed (StWidget *widget)
}
priv->theme_icon_size = (int)(0.5 + st_theme_node_get_length (theme_node, "icon-size"));
if (st_icon_update_icon_size (self))
st_icon_update (self);
st_icon_update_icon_size (self);
st_icon_update (self);
}
static void

View File

@@ -204,7 +204,9 @@ _st_create_texture_pipeline (CoglTexture *src_texture)
clutter_backend_get_cogl_context (clutter_get_default_backend ());
texture_pipeline_template = cogl_pipeline_new (ctx);
cogl_pipeline_set_layer_null_texture (texture_pipeline_template, 0);
cogl_pipeline_set_layer_null_texture (texture_pipeline_template,
0, /* layer */
COGL_TEXTURE_TYPE_2D);
}
pipeline = cogl_pipeline_copy (texture_pipeline_template);

View File

@@ -30,7 +30,6 @@
#define KEY_DRAG_THRESHOLD "drag-threshold"
#define KEY_GTK_THEME "gtk-theme"
#define KEY_GTK_ICON_THEME "icon-theme"
#define KEY_MAGNIFIER_ACTIVE "screen-magnifier-enabled"
enum {
PROP_0,
@@ -39,7 +38,6 @@ enum {
PROP_DRAG_THRESHOLD,
PROP_GTK_THEME,
PROP_GTK_ICON_THEME,
PROP_MAGNIFIER_ACTIVE,
N_PROPS
};
@@ -50,13 +48,11 @@ struct _StSettings
GObject parent_object;
GSettings *interface_settings;
GSettings *mouse_settings;
GSettings *a11y_settings;
gchar *gtk_theme;
gchar *gtk_icon_theme;
gboolean enable_animations;
gboolean primary_paste;
gboolean magnifier_active;
gint drag_threshold;
};
@@ -109,9 +105,6 @@ st_settings_get_property (GObject *object,
case PROP_GTK_ICON_THEME:
g_value_set_string (value, settings->gtk_icon_theme);
break;
case PROP_MAGNIFIER_ACTIVE:
g_value_set_boolean (value, settings->magnifier_active);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
@@ -151,11 +144,6 @@ st_settings_class_init (StSettingsClass *klass)
"GTK+ Icon Theme",
"",
G_PARAM_READABLE);
props[PROP_MAGNIFIER_ACTIVE] = g_param_spec_boolean("magnifier-active",
"Magnifier is active",
"Weather the a11y magnifier is active",
FALSE,
G_PARAM_READABLE);
g_object_class_install_properties (object_class, N_PROPS, props);
}
@@ -202,18 +190,6 @@ on_mouse_settings_changed (GSettings *g_settings,
}
}
static void
on_a11y_settings_changed (GSettings *g_settings,
const gchar *key,
StSettings *settings)
{
if (g_str_equal (key, KEY_MAGNIFIER_ACTIVE))
{
settings->magnifier_active = g_settings_get_boolean (g_settings, key);
g_object_notify_by_pspec (G_OBJECT (settings), props[PROP_MAGNIFIER_ACTIVE]);
}
}
static void
st_settings_init (StSettings *settings)
{
@@ -225,10 +201,6 @@ st_settings_init (StSettings *settings)
g_signal_connect (settings->interface_settings, "changed",
G_CALLBACK (on_mouse_settings_changed), settings);
settings->a11y_settings = g_settings_new ("org.gnome.desktop.a11y.applications");
g_signal_connect (settings->a11y_settings, "changed",
G_CALLBACK (on_a11y_settings_changed), settings);
settings->enable_animations = g_settings_get_boolean (settings->interface_settings,
KEY_ENABLE_ANIMATIONS);
settings->primary_paste = g_settings_get_boolean (settings->interface_settings,
@@ -239,8 +211,6 @@ st_settings_init (StSettings *settings)
KEY_GTK_ICON_THEME);
settings->drag_threshold = g_settings_get_int (settings->mouse_settings,
KEY_DRAG_THRESHOLD);
settings->magnifier_active = g_settings_get_boolean (settings->a11y_settings,
KEY_MAGNIFIER_ACTIVE);
}
/**

View File

@@ -24,8 +24,6 @@
#ifndef __ST_SETTINGS_H__
#define __ST_SETTINGS_H__
#include <glib-object.h>
G_BEGIN_DECLS
#define ST_TYPE_SETTINGS (st_settings_get_type ())
@@ -33,6 +31,4 @@ G_DECLARE_FINAL_TYPE (StSettings, st_settings, ST, SETTINGS, GObject)
StSettings * st_settings_get (void);
G_END_DECLS
#endif /* __ST_SETTINGS_H__ */

View File

@@ -496,31 +496,15 @@ pixbuf_to_st_content_image (GdkPixbuf *pixbuf,
ClutterContent *image;
g_autoptr(GError) error = NULL;
float native_width, native_height;
native_width = ceilf (gdk_pixbuf_get_width (pixbuf) / resource_scale);
native_height = ceilf (gdk_pixbuf_get_height (pixbuf) / resource_scale);
if (width < 0 && height < 0)
{
width = native_width;
height = native_height;
}
else if (width < 0)
{
height *= paint_scale;
width = native_width * (height / native_height);
}
else if (height < 0)
{
width *= paint_scale;
height = native_height * (width / native_width);
}
if (width < 0)
width = ceilf (gdk_pixbuf_get_width (pixbuf) / resource_scale);
else
{
width *= paint_scale;
height *= paint_scale;
}
width *= paint_scale;
if (height < 0)
height = ceilf (gdk_pixbuf_get_height (pixbuf) / resource_scale);
else
height *= paint_scale;
image = st_image_content_new_with_preferred_size (width, height);
clutter_image_set_data (CLUTTER_IMAGE (image),

View File

@@ -107,8 +107,6 @@ struct _StThemeNode {
int box_shadow_min_width;
int box_shadow_min_height;
guint stylesheets_changed_id;
CoglPipeline *border_slices_texture;
CoglPipeline *border_slices_pipeline;
CoglPipeline *background_texture;

View File

@@ -111,11 +111,9 @@ st_theme_node_dispose (GObject *gobject)
node->icon_colors = NULL;
}
if (node->theme && node->stylesheets_changed_id)
{
g_signal_handler_disconnect (node->theme, node->stylesheets_changed_id);
node->stylesheets_changed_id = 0;
}
if (node->theme)
g_signal_handlers_disconnect_by_func (node->theme,
on_custom_stylesheets_changed, node);
st_theme_node_paint_state_free (&node->cached_state);
@@ -232,9 +230,8 @@ st_theme_node_new (StThemeContext *context,
if (theme != NULL)
{
node->theme = g_object_ref (theme);
node->stylesheets_changed_id =
g_signal_connect (node->theme, "custom-stylesheets-changed",
G_CALLBACK (on_custom_stylesheets_changed), node);
g_signal_connect (node->theme, "custom-stylesheets-changed",
G_CALLBACK (on_custom_stylesheets_changed), node);
}
node->element_type = element_type;
@@ -1139,14 +1136,10 @@ get_length_from_term_int (StThemeNode *node,
{
double value;
GetFromTermResult result;
int scale_factor;
result = get_length_from_term (node, term, use_parent_font, &value);
if (result == VALUE_FOUND)
{
g_object_get (node->context, "scale-factor", &scale_factor, NULL);
*length = (int) ((value / scale_factor) + 0.5) * scale_factor;
}
*length = (int) (0.5 + value);
return result;
}

View File

@@ -1718,7 +1718,7 @@ st_widget_recompute_style (StWidget *widget,
StThemeNode *new_theme_node = st_widget_get_theme_node (widget);
int transition_duration;
StSettings *settings;
gboolean paint_equal, geometry_equal = FALSE;
gboolean paint_equal;
gboolean animations_enabled;
if (new_theme_node == old_theme_node)
@@ -1729,9 +1729,8 @@ st_widget_recompute_style (StWidget *widget,
_st_theme_node_apply_margins (new_theme_node, CLUTTER_ACTOR (widget));
if (old_theme_node)
geometry_equal = st_theme_node_geometry_equal (old_theme_node, new_theme_node);
if (!geometry_equal)
if (!old_theme_node ||
!st_theme_node_geometry_equal (old_theme_node, new_theme_node))
clutter_actor_queue_relayout ((ClutterActor *) widget);
transition_duration = st_theme_node_get_transition_duration (new_theme_node);
@@ -1783,11 +1782,7 @@ st_widget_recompute_style (StWidget *widget,
st_theme_node_paint_state_invalidate (current_paint_state (widget));
}
if (!paint_equal || !geometry_equal)
g_signal_emit (widget, signals[STYLE_CHANGED], 0);
else
notify_children_of_style_change ((ClutterActor *) widget);
g_signal_emit (widget, signals[STYLE_CHANGED], 0);
priv->is_style_dirty = FALSE;
}

View File

@@ -70,7 +70,7 @@ static guint manager_signals[LAST_SIGNAL];
#define SYSTEM_TRAY_ORIENTATION_VERT 1
#ifdef GDK_WINDOWING_X11
static gboolean na_tray_manager_check_running_screen_x11 (void);
static gboolean na_tray_manager_check_running_screen_x11 ();
#endif
static void na_tray_manager_finalize (GObject *object);
@@ -808,7 +808,7 @@ na_tray_manager_manage_screen (NaTrayManager *manager)
#ifdef GDK_WINDOWING_X11
static gboolean
na_tray_manager_check_running_screen_x11 (void)
na_tray_manager_check_running_screen_x11 ()
{
GdkDisplay *display;
GdkScreen *screen;
@@ -833,7 +833,7 @@ na_tray_manager_check_running_screen_x11 (void)
#endif
gboolean
na_tray_manager_check_running (void)
na_tray_manager_check_running ()
{
#ifdef GDK_WINDOWING_X11
return na_tray_manager_check_running_screen_x11 ();