Compare commits

..

1 Commits

Author SHA1 Message Date
9ab35786f6 theme: Search in versioned directories
We support third party themes, via the "stylesheetName" property of a
mode's json files. However, our external CSS API is not completely
stable. If a third party theme wants to work on multiple gnome-shell
versions - for example because it is shipped as a Flatpak or a Snap - it
is not possible to ensure that a theme corresponding to the running
gnome-shell version is loaded.

GTK+ loads themes from versioned directories, search backwards from the
current version. Let's do the same in gnome-shell too. Then a downstream
theme can be shipped in $datadir/gnome-shell/3.28/theme/.

We keep searching all of the current paths. Additionally, the default
case where we look for the 'gnome' theme as a resource in the binary
continues to be the default so there are no additional lookups for users
of this theme.
2018-06-28 11:14:54 +01:00
96 changed files with 2227 additions and 4321 deletions

51
NEWS
View File

@ -1,54 +1,3 @@
3.29.90
=======
* Add remote access indication on wayland [Jonas; !160]
* Fix wrong window positions in overview on wayland [Marco; #776588]
* Add gesture to unfullscreen a window [Jan-Michael; !123]
* Add PickColor method to screenshot D-Bus interface [Florian; #286]
* Consider "new-window" action when opening new windows [Florian; #756844]
* Make workspace switching gestures follow motion [Carlos; #788994]
* Support audio volumes above 100% [Didier; #790280]
* Misc. bug fixes [Florian, Daniel; #424, !132, !182, #433, !179, #786496]
Contributors:
Jonas Ådahl, Jan-Michael Brummer, Piotr Drąg, Daniel Drake, Carlos Garnacho,
Florian Müllner, Georges Basile Stavracas Neto, Didier Roche, Jakub Steiner,
Marco Trevisan (Treviño)
Translators:
Charles Monzat [fr], Daniel Mustieles [es]
3.29.4
======
* Fix "Clear All" for calendar events [Florian; #325]
* Allow cancelling direct switch operations [Xavier; #315]
* Support being started by systemd --user [Iain; !137, !138]
* Support key event forwarding required by some input methods [Carlos; #275]
* Misc. bug fixes and cleanups [Jasper, Andrea, Florian; #663461, #372, !112,
#414, !151]
Contributors:
Andrea Azzarone, Carlos Garnacho, Xavier Johnson, Iain Lane, Florian Müllner,
Jasper St. Pierre
Translators:
Stas Solovey [ru]
3.29.3
======
* Save creation time in screenshot metadata [Florian; #790481]
* Improve consistency between ctrl- and middle-click on app icons [Xavier; #316]
* Add support for font-feature-settings CSS property [Ryan; #34]
* Adjust to MetaScreen removal [Jonas; #759538]
* Misc. bug fixes [Florian, Marco, Sam; #298, #788931, #26, #76, !54, #788882,
#791233]
Contributors:
Jonas Ådahl, Ryan Hendrickson, Xavier Johnson, Florian Müllner, Joe Rabinoff,
Sam Spilsbury, Marco Trevisan (Treviño)
Translators:
Gun Chleoc [gd], Yi-Jyun Pan [zh_TW], Cédric Valmary [oc], Jordi Mas [ca]
3.29.2 3.29.2
====== ======
* Guard against untimely keyboard map changes [Carlos; #240] * Guard against untimely keyboard map changes [Carlos; #240]

View File

@ -24,9 +24,3 @@
/* Define if _NL_TIME_FIRST_WEEKDATE is available */ /* Define if _NL_TIME_FIRST_WEEKDATE is available */
#mesondefine HAVE__NL_TIME_FIRST_WEEKDAY #mesondefine HAVE__NL_TIME_FIRST_WEEKDAY
/* Define if you have the `g_desktop_app_info_launch_uris_as_manager_with_fds` function */
#mesondefine HAVE_GIO_DESKTOP_LAUNCH_URIS_WITH_FDS
/* Define if fdwalk is available in libc */
#mesondefine HAVE_FDWALK

View File

@ -1,6 +0,0 @@
[org.gnome.mutter:GNOME]
attach-modal-dialogs=true
edge-tiling=true
dynamic-workspaces=true
workspaces-only-on-primary=true
focus-change-on-pointer-rest=true

View File

@ -1,5 +0,0 @@
[Desktop Entry]
Type=Application
Name=GNOME settings overrides migration
NoDisplay=true
Exec=@libexecdir@/gnome-shell-overrides-migration.sh

View File

@ -1,5 +0,0 @@
[Unit]
Description=GNOME Shell (wayland sync point)
After=gnome-shell.service
BindsTo=gnome-shell.service
Conflicts=gnome-shell-x11.target

View File

@ -1,5 +0,0 @@
[Unit]
Description=GNOME Shell (x11 sync point)
After=gnome-shell.service
BindsTo=gnome-shell.service
Conflicts=gnome-shell-wayland.target

View File

@ -1,11 +0,0 @@
[Unit]
Description=GNOME Shell
Wants=gnome-session.service
After=graphical-session-pre.target gnome-session-bus.target
PartOf=graphical-session.target
[Service]
Type=dbus
ExecStart=@bindir@/gnome-shell
Restart=on-failure
BusName=org.gnome.Shell

View File

@ -92,33 +92,6 @@ schema = configure_file(
configuration: schemaconf, configuration: schemaconf,
install_dir: schemadir install_dir: schemadir
) )
install_data('00_org.gnome.shell.gschema.override', install_dir: schemadir)
overrides_migration_conf = configuration_data()
overrides_migration_conf.set('libexecdir', libexecdir)
overrides_migration = configure_file(
input: 'gnome-shell-overrides-migration.desktop.in',
output: 'gnome-shell-overrides-migration.desktop',
configuration: overrides_migration_conf,
install_dir: autostartdir
)
if have_systemd
unitconf = configuration_data()
unitconf.set('bindir', bindir)
unit = configure_file(
input: 'gnome-shell.service.in',
output: 'gnome-shell.service',
configuration: unitconf,
install_dir: systemduserunitdir
)
units = files('gnome-shell-wayland.target',
'gnome-shell-x11.target')
install_data(units, install_dir: systemduserunitdir)
endif
# for unit tests - gnome.compile_schemas() only looks in srcdir # for unit tests - gnome.compile_schemas() only looks in srcdir
custom_target('compile-schemas', custom_target('compile-schemas',

View File

@ -91,23 +91,6 @@
<arg type="s" direction="out" name="filename_used"/> <arg type="s" direction="out" name="filename_used"/>
</method> </method>
<!--
PickColor:
Picks a color and returns the result.
The @result vardict contains:
<variablelist>
<varlistentry>
<term>color (ddd)</term>
<listitem><para>The color, RGB values in the range [0,1].</para></listitem>
</varlistentry>
</variablelist>
-->
<method name="PickColor">
<arg type="a{sv}" direction="out" name="result"/>
</method>
<!-- <!--
FlashArea: FlashArea:
@x: the X coordinate of the area to flash @x: the X coordinate of the area to flash

View File

@ -190,7 +190,6 @@
</key> </key>
</schema> </schema>
<!-- unused, change 00_org.gnome.shell.gschema.override instead -->
<schema id="org.gnome.shell.overrides" path="/org/gnome/shell/overrides/" <schema id="org.gnome.shell.overrides" path="/org/gnome/shell/overrides/"
gettext-domain="@GETTEXT_PACKAGE@"> gettext-domain="@GETTEXT_PACKAGE@">
<key name="attach-modal-dialogs" type="b"> <key name="attach-modal-dialogs" type="b">

View File

@ -128,15 +128,12 @@ StScrollBar {
.slider { .slider {
height: 1em; height: 1em;
-barlevel-height: 0.3em; -slider-height: 0.3em;
-barlevel-background-color: $insensitive_bg_color; //background of the trough -slider-background-color: $insensitive_bg_color; //background of the trough
-barlevel-border-color: $borders_color; //trough border color -slider-border-color: $borders_color; //trough border color
-barlevel-active-background-color: $selected_bg_color; //active trough fill -slider-active-background-color: $selected_bg_color; //active trough fill
-barlevel-active-border-color: darken($selected_bg_color,10%); //active trough border -slider-active-border-color: darken($selected_bg_color,10%); //active trough border
-barlevel-overdrive-color: $destructive_color; -slider-border-width: 1px;
-barlevel-overdrive-border-color: darken($destructive_color,10%);
-barlevel-overdrive-separator-width: 0.2em;
-barlevel-border-width: 1px;
-slider-handle-radius: 6px; -slider-handle-radius: 6px;
} }
@ -588,11 +585,13 @@ StScrollBar {
.osd-monitor-label { font-size: 3em; } .osd-monitor-label { font-size: 3em; }
.level { .level {
height: 0.6em; height: 0.6em;
-barlevel-height: 0.6em; border-radius: 0.3em;
-barlevel-background-color: transparentize(darken($osd_bg_color,15%),0.5); background-color: transparentize(darken($osd_bg_color,15%),0.5);
-barlevel-active-background-color: $osd_fg_color; color: $osd_fg_color;
-barlevel-overdrive-color: $destructive_color; }
-barlevel-overdrive-separator-width: 0.2em; .level-bar {
background-color: $osd_fg_color;
border-radius: 0.3em;
} }
} }
@ -826,8 +825,6 @@ StScrollBar {
.screencast-indicator { color: $warning_color; } .screencast-indicator { color: $warning_color; }
.remote-access-indicator { color: $warning_color; }
&.solid { &.solid {
background-color: black; background-color: black;
/* transition from transparent to solid */ /* transition from transparent to solid */
@ -1125,7 +1122,6 @@ StScrollBar {
} }
.system-menu-action { .system-menu-action {
-st-icon-style: symbolic;
color: $fg_color; color: $fg_color;
border-radius: 32px; /* wish we could do 50% */ border-radius: 32px; /* wish we could do 50% */
padding: 13px; padding: 13px;

View File

@ -14,7 +14,7 @@
id="svg7384" id="svg7384"
height="32" height="32"
sodipodi:docname="key-layout.svg" sodipodi:docname="key-layout.svg"
inkscape:version="0.92.3 (2405546, 2018-03-11)"> inkscape:version="0.92.2 (5c3e80d, 2017-08-06)">
<sodipodi:namedview <sodipodi:namedview
pagecolor="#ffffff" pagecolor="#ffffff"
bordercolor="#666666" bordercolor="#666666"
@ -24,21 +24,17 @@
guidetolerance="10" guidetolerance="10"
inkscape:pageopacity="0" inkscape:pageopacity="0"
inkscape:pageshadow="2" inkscape:pageshadow="2"
inkscape:window-width="3440" inkscape:window-width="1919"
inkscape:window-height="1376" inkscape:window-height="1011"
id="namedview19" id="namedview19"
showgrid="false" showgrid="false"
inkscape:zoom="1" inkscape:zoom="14.75"
inkscape:cx="46.246852" inkscape:cx="1.220339"
inkscape:cy="17.474578" inkscape:cy="11.842802"
inkscape:window-x="0" inkscape:window-x="0"
inkscape:window-y="27" inkscape:window-y="55"
inkscape:window-maximized="1" inkscape:window-maximized="0"
inkscape:current-layer="svg7384"> inkscape:current-layer="svg7384" />
<inkscape:grid
type="xygrid"
id="grid861" />
</sodipodi:namedview>
<metadata <metadata
id="metadata90"> id="metadata90">
<rdf:RDF> <rdf:RDF>
@ -96,34 +92,23 @@
style="display:inline" style="display:inline"
id="g4953" /> id="g4953" />
<g <g
style="stroke-width:0.5;enable-background:new"
id="g3561"
inkscape:label="preferences-desktop-locale" inkscape:label="preferences-desktop-locale"
transform="matrix(2,0,0,2,135.99464,-895.9793)"> id="g11728"
<path transform="matrix(2,0,0,2,-522.0004,-1086)"
sodipodi:nodetypes="cc" style="display:inline;stroke-width:1">
inkscape:connector-curvature="0"
id="path3535"
d="m -65,450 v 12"
style="fill:#e5e5e5;fill-opacity:1;fill-rule:evenodd;stroke:#e5e5e5;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
sodipodi:nodetypes="ccccccccc"
inkscape:connector-curvature="0"
id="path3537"
d="m -65,456 h 4 l 1,2 h 5 v -6 h -4 l -1,-2 h -5 z"
style="fill:none;fill-rule:evenodd;stroke:#e5e5e5;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="opacity:1;vector-effect:none;fill:#e5e5e5;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m -65,456 h 4 l 1,2 h 5 v -6 h -4 l -1,-2 h -5 z"
id="path3539"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccccc" />
<rect <rect
style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:0.89050001;marker:none;enable-background:new" style="fill:none;stroke:none;stroke-width:1"
id="rect3543" id="rect11724"
y="448" width="16"
x="-68"
height="16" height="16"
width="16" /> x="20"
y="326"
transform="translate(241.0002,217)" />
<path
style="fill:#e5e5e5;fill-opacity:1;stroke:none;stroke-width:1"
d="m 265.69612,545.23396 c -3.58218,0 -4.66582,1.39975 -4.66582,1.39975 v 10.04946 c 0,0 1.08364,-1.07673 4.66582,-1.07673 2.9161,0 4.47225,1.07673 7.17818,1.07673 2.08923,0 3.19429,-1.39975 3.19429,-1.39975 v -10.04946 c 0,0 -1.14095,1.04084 -3.23018,1.04084 -3.3734,0 -3.97619,-1.04084 -7.14229,-1.04084 z m 2.93145,2.77148 c 1.32876,0 2.375,1.08037 2.375,2.4375 0,1.35713 -1.04624,2.46875 -2.375,2.46875 -1.32876,0 -2.40625,-1.11162 -2.40625,-2.46875 0,-1.35713 1.07749,-2.4375 2.40625,-2.4375 z m -4.5625,0.96875 0.96875,1.03125 -0.9375,-0.0312 0.9375,1 -0.96875,-0.0312 0.96875,1.03125 -1,-0.0312 0.0312,-1 h -0.0312 l 0.0312,-0.9688 h -0.0312 z m 4.5625,0 c -0.794,0 -1.46875,0.6578 -1.46875,1.46875 0,0.81095 0.67475,1.46875 1.46875,1.46875 0.79399,0 1.4375,-0.6578 1.4375,-1.46875 0,-0.81095 -0.64351,-1.46875 -1.4375,-1.46875 z m 4.375,0 v 1 l 0.0312,0.96875 h -0.0312 l 0.0312,1 -1,0.0312 0.96875,-1.03125 -0.96875,0.0312 0.9375,-1 -0.9375,0.0312 z m -7.9375,2.96875 0.96875,1.03125 -1,-0.0312 z m 6.9375,0 0.0312,1 -1,0.0312 z m -5.9375,1 0.96875,1.03125 -1,-0.0312 z m 4.9375,0 0.0312,1 -1,0.0312 z"
id="path11726"
inkscape:connector-curvature="0"
sodipodi:nodetypes="sccssccsssssssccccccccccccsssssccccccccccccccccccccccccccc" />
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@ -13,102 +13,10 @@
height="64px" height="64px"
id="svg3393" id="svg3393"
version="1.1" version="1.1"
inkscape:version="0.92.3 (2405546, 2018-03-11)" inkscape:version="0.48.5 r10040"
sodipodi:docname="no-notifications.svg"> sodipodi:docname="New document 2">
<defs <defs
id="defs3395"> id="defs3395" />
<clipPath
id="clipPath6262-0"
clipPathUnits="userSpaceOnUse">
<rect
style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none"
id="rect6264-6"
width="3.8250003"
height="6.3750005"
x="26.849981"
y="220.75" />
</clipPath>
<clipPath
id="clipPath6258-0"
clipPathUnits="userSpaceOnUse">
<rect
style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none"
id="rect6260-6"
width="2.8977275"
height="5.3129687"
x="26.965673"
y="221.28162" />
</clipPath>
<clipPath
id="clipPath6254-6"
clipPathUnits="userSpaceOnUse">
<rect
style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none"
id="rect6256-6"
width="1.876245"
height="4.8783236"
x="26.998718"
y="221.50153" />
</clipPath>
<clipPath
id="clipPath8028-3"
clipPathUnits="userSpaceOnUse">
<path
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -73,-30 -7,-7 v -4.5 h 16.5 v 4.5 l -7.5,7 z"
id="path8030-6"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccc" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath6810-7-87-7">
<rect
style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
id="rect6812-2-4-5"
width="14"
height="11"
x="21"
y="281" />
</clipPath>
<clipPath
id="clipPath6262"
clipPathUnits="userSpaceOnUse">
<rect
style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none"
id="rect6264"
width="3.8250003"
height="6.3750005"
x="26.849981"
y="220.75" />
</clipPath>
<clipPath
id="clipPath6258"
clipPathUnits="userSpaceOnUse">
<rect
style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none"
id="rect6260"
width="2.8977275"
height="5.3129687"
x="26.965673"
y="221.28162" />
</clipPath>
<clipPath
id="clipPath6254"
clipPathUnits="userSpaceOnUse">
<rect
style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none"
id="rect6256"
width="1.876245"
height="4.8783236"
x="26.998718"
y="221.50153" />
</clipPath>
<inkscape:path-effect
effect="spiro"
id="path-effect3951"
is_visible="true" />
</defs>
<sodipodi:namedview <sodipodi:namedview
id="base" id="base"
pagecolor="#ffffff" pagecolor="#ffffff"
@ -116,17 +24,17 @@
borderopacity="1.0" borderopacity="1.0"
inkscape:pageopacity="0.0" inkscape:pageopacity="0.0"
inkscape:pageshadow="2" inkscape:pageshadow="2"
inkscape:zoom="1" inkscape:zoom="5.5"
inkscape:cx="125.08157" inkscape:cx="32"
inkscape:cy="-13.805087" inkscape:cy="32"
inkscape:current-layer="layer1" inkscape:current-layer="layer1"
showgrid="true" showgrid="true"
inkscape:document-units="px" inkscape:document-units="px"
inkscape:grid-bbox="true" inkscape:grid-bbox="true"
inkscape:window-width="1664" inkscape:window-width="697"
inkscape:window-height="1034" inkscape:window-height="613"
inkscape:window-x="1479" inkscape:window-x="100"
inkscape:window-y="252" inkscape:window-y="77"
inkscape:window-maximized="0" /> inkscape:window-maximized="0" />
<metadata <metadata
id="metadata3398"> id="metadata3398">
@ -146,7 +54,7 @@
inkscape:groupmode="layer"> inkscape:groupmode="layer">
<g <g
style="display:inline" style="display:inline"
transform="matrix(4,0,0,4,-79.702662,-0.35415646)" transform="matrix(4,0,0,4,0.29733827,-0.35415646)"
id="g19245"> id="g19245">
<g <g
id="g19247" id="g19247"
@ -163,15 +71,15 @@
transform="translate(-323.02908,-649.02581)"> transform="translate(-323.02908,-649.02581)">
<path <path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
d="m 331.9377,653 c 0.0187,0.16677 0.0625,0.32822 0.0625,0.5 0,2.48528 -2.01472,4.5 -4.5,4.5 -0.11769,0 -0.22834,-0.0224 -0.34375,-0.0312 v 2.21875 c 0,1.00412 0.80838,1.8125 1.8125,1.8125 l 1.54511,-5e-5 2,2.04688 2.0625,-2.04688 h 1.61114 c 1.00413,0 1.8125,-0.80838 1.8125,-1.8125 v -5.375 c 0,-1.00412 -0.80837,-1.8125 -1.8125,-1.8125 z" d="m 331.9377,653 c 0.0187,0.16677 0.0625,0.32822 0.0625,0.5 0,2.48528 -2.01472,4.5 -4.5,4.5 -0.11769,0 -0.22834,-0.0224 -0.34375,-0.0312 l 0,2.21875 c 0,1.00412 0.80838,1.8125 1.8125,1.8125 l 1.54511,-5e-5 2,2.04688 2.0625,-2.04688 1.61114,0 c 1.00413,0 1.8125,-0.80838 1.8125,-1.8125 l 0,-5.375 c 0,-1.00412 -0.80837,-1.8125 -1.8125,-1.8125 z"
id="path19253" id="path19253"
sodipodi:nodetypes="csscsscccssssc" sodipodi:nodetypes="csscsscccssssc"
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#c3c3c3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;enable-background:accumulate" /> style="opacity:0.5;color:#000000;fill:#c3c3c3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<path <path
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
d="m 327.5002,650 c -1.933,0 -3.5,1.567 -3.5,3.5 0,1.933 1.567,3.5 3.5,3.5 1.933,0 3.5,-1.567 3.5,-3.5 0,-1.933 -1.567,-3.5 -3.5,-3.5 z m -0.53125,1 h 1.03125 l -0.0625,1.375 a 0.19951718,0.19951718 0 0 0 0,0.0625 0.19951718,0.19951718 0 0 0 0,0.0312 0.19951718,0.19951718 0 0 0 0.125,0.125 0.19951718,0.19951718 0 0 0 0.0312,0 0.19951718,0.19951718 0 0 0 0.0625,0 0.19951718,0.19951718 0 0 0 0.0625,0 0.19951718,0.19951718 0 0 0 0.0312,-0.0312 l 1.15625,-0.75 0.5,0.90625 -1.21875,0.625 a 0.19951718,0.19951718 0 0 0 -0.0312,0 0.19951718,0.19951718 0 0 0 -0.0312,0.0312 0.19951718,0.19951718 0 0 0 -0.0312,0.0937 0.19951718,0.19951718 0 0 0 0,0.0625 0.19951718,0.19951718 0 0 0 0,0.0312 0.19951718,0.19951718 0 0 0 0.0312,0.0625 0.19951718,0.19951718 0 0 0 0.0312,0.0312 0.19951718,0.19951718 0 0 0 0.0312,0.0312 l 1.25,0.625 -0.53125,0.90625 -1.15625,-0.781 a 0.19951718,0.19951718 0 0 0 -0.0312,0 0.19951718,0.19951718 0 0 0 -0.0625,-0.0312 0.19951718,0.19951718 0 0 0 -0.0625,0 0.19951718,0.19951718 0 0 0 -0.125,0.0937 0.19951718,0.19951718 0 0 0 -0.0312,0.0312 0.19951718,0.19951718 0 0 0 0,0.0312 0.19951718,0.19951718 0 0 0 0,0.0625 L 328.0002,656 h -1.03125 l 0.0937,-1.375 a 0.19951718,0.19951718 0 0 0 -0.0312,-0.0937 0.19951718,0.19951718 0 0 0 -0.0312,-0.0625 0.19951718,0.19951718 0 0 0 -0.0625,-0.0312 0.19951718,0.19951718 0 0 0 -0.0625,-0.0312 0.19951718,0.19951718 0 0 0 -0.0312,0 0.19951718,0.19951718 0 0 0 -0.0937,0.0312 l -1.1875,0.78125 -0.5,-0.90625 1.25,-0.625 a 0.19951718,0.19951718 0 0 0 0.0312,-0.0312 0.19951718,0.19951718 0 0 0 0.0312,-0.0312 0.19951718,0.19951718 0 0 0 0.0312,-0.0625 0.19951718,0.19951718 0 0 0 0,-0.0312 0.19951718,0.19951718 0 0 0 0,-0.0625 0.19951718,0.19951718 0 0 0 0,-0.0312 0.19951718,0.19951718 0 0 0 -0.0312,-0.0625 0.19951718,0.19951718 0 0 0 -0.0312,-0.0312 0.19951718,0.19951718 0 0 0 -0.0312,0 l -1.25,-0.625 0.5,-0.90625 1.1875,0.75 a 0.19951718,0.19951718 0 0 0 0.0312,0.0312 0.19951718,0.19951718 0 0 0 0.0625,0 0.19951718,0.19951718 0 0 0 0.0625,0 0.19951718,0.19951718 0 0 0 0.0312,0 0.19951718,0.19951718 0 0 0 0.0312,-0.0312 0.19951718,0.19951718 0 0 0 0.0312,-0.0312 0.19951718,0.19951718 0 0 0 0.0312,-0.0312 0.19951718,0.19951718 0 0 0 0,-0.0312 0.19951718,0.19951718 0 0 0 0.0312,-0.0625 0.19951718,0.19951718 0 0 0 0,-0.0312 z" d="m 327.5002,650 c -1.933,0 -3.5,1.567 -3.5,3.5 0,1.933 1.567,3.5 3.5,3.5 1.933,0 3.5,-1.567 3.5,-3.5 0,-1.933 -1.567,-3.5 -3.5,-3.5 z m -0.53125,1 1.03125,0 -0.0625,1.375 a 0.19951718,0.19951718 0 0 0 0,0.0625 0.19951718,0.19951718 0 0 0 0,0.0312 0.19951718,0.19951718 0 0 0 0.125,0.125 0.19951718,0.19951718 0 0 0 0.0312,0 0.19951718,0.19951718 0 0 0 0.0625,0 0.19951718,0.19951718 0 0 0 0.0625,0 0.19951718,0.19951718 0 0 0 0.0312,-0.0312 l 1.15625,-0.75 0.5,0.90625 -1.21875,0.625 a 0.19951718,0.19951718 0 0 0 -0.0312,0 0.19951718,0.19951718 0 0 0 -0.0312,0.0312 0.19951718,0.19951718 0 0 0 -0.0312,0.0937 0.19951718,0.19951718 0 0 0 0,0.0625 0.19951718,0.19951718 0 0 0 0,0.0312 0.19951718,0.19951718 0 0 0 0.0312,0.0625 0.19951718,0.19951718 0 0 0 0.0312,0.0312 0.19951718,0.19951718 0 0 0 0.0312,0.0312 l 1.25,0.625 -0.53125,0.90625 -1.15625,-0.781 a 0.19951718,0.19951718 0 0 0 -0.0312,0 0.19951718,0.19951718 0 0 0 -0.0625,-0.0312 0.19951718,0.19951718 0 0 0 -0.0625,0 0.19951718,0.19951718 0 0 0 -0.125,0.0937 0.19951718,0.19951718 0 0 0 -0.0312,0.0312 0.19951718,0.19951718 0 0 0 0,0.0312 0.19951718,0.19951718 0 0 0 0,0.0625 l 0.0625,1.3751 -1.03125,0 0.0937,-1.375 a 0.19951718,0.19951718 0 0 0 -0.0312,-0.0937 0.19951718,0.19951718 0 0 0 -0.0312,-0.0625 0.19951718,0.19951718 0 0 0 -0.0625,-0.0312 0.19951718,0.19951718 0 0 0 -0.0625,-0.0312 0.19951718,0.19951718 0 0 0 -0.0312,0 0.19951718,0.19951718 0 0 0 -0.0937,0.0312 l -1.1875,0.78125 -0.5,-0.90625 1.25,-0.625 a 0.19951718,0.19951718 0 0 0 0.0312,-0.0312 0.19951718,0.19951718 0 0 0 0.0312,-0.0312 0.19951718,0.19951718 0 0 0 0.0312,-0.0625 0.19951718,0.19951718 0 0 0 0,-0.0312 0.19951718,0.19951718 0 0 0 0,-0.0625 0.19951718,0.19951718 0 0 0 0,-0.0312 0.19951718,0.19951718 0 0 0 -0.0312,-0.0625 0.19951718,0.19951718 0 0 0 -0.0312,-0.0312 0.19951718,0.19951718 0 0 0 -0.0312,0 l -1.25,-0.625 0.5,-0.90625 1.1875,0.75 a 0.19951718,0.19951718 0 0 0 0.0312,0.0312 0.19951718,0.19951718 0 0 0 0.0625,0 0.19951718,0.19951718 0 0 0 0.0625,0 0.19951718,0.19951718 0 0 0 0.0312,0 0.19951718,0.19951718 0 0 0 0.0312,-0.0312 0.19951718,0.19951718 0 0 0 0.0312,-0.0312 0.19951718,0.19951718 0 0 0 0.0312,-0.0312 0.19951718,0.19951718 0 0 0 0,-0.0312 0.19951718,0.19951718 0 0 0 0.0312,-0.0625 0.19951718,0.19951718 0 0 0 0,-0.0312 L 326.96895,651 z"
id="path19255" id="path19255"
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;enable-background:accumulate" /> style="color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
</g> </g>
<g <g
id="g19257" id="g19257"
@ -202,22 +110,5 @@
style="display:inline" style="display:inline"
transform="translate(-323.02908,-649.02581)" /> transform="translate(-323.02908,-649.02581)" />
</g> </g>
<g
style="opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:new"
inkscape:label="preferences-system-notifications"
id="g13967"
transform="matrix(4,0,0,4,-1044.0008,-2172)">
<path
inkscape:connector-curvature="0"
d="m 268.94244,544.94838 c -2.20914,0 -3.33013,1.5 -4,4 l -1,5 c -0.10831,0.54156 -0.44772,1 -1,1 v 1 h 12 v -1 c -0.55229,0 -0.89169,-0.45844 -1,-1 l -1,-5 c -0.53033,-2.5 -1.79086,-4 -4,-4 z"
id="path40220"
sodipodi:nodetypes="ccsccccscc"
style="opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal" />
<path
inkscape:connector-curvature="0"
d="m 269.11822,556.94838 a 1.5,1.5 0 0 0 1.41211,1 1.5,1.5 0 0 0 1.41211,-1 z"
id="path40774"
style="opacity:1;vector-effect:none;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal" />
</g>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

@ -242,11 +242,11 @@ var AuthPrompt = new Lang.Class({
this.emit('prompted'); this.emit('prompted');
}, },
_onVerificationFailed(userVerifier, canRetry) { _onVerificationFailed() {
this._queryingService = null; this._queryingService = null;
this.clear(); this.clear();
this.updateSensitivity(canRetry); this.updateSensitivity(true);
this.setActorInDefaultButtonWell(null); this.setActorInDefaultButtonWell(null);
this.verificationStatus = AuthPromptStatus.VERIFICATION_FAILED; this.verificationStatus = AuthPromptStatus.VERIFICATION_FAILED;
}, },
@ -439,7 +439,6 @@ var AuthPrompt = new Lang.Class({
this.verificationStatus = AuthPromptStatus.NOT_VERIFYING; this.verificationStatus = AuthPromptStatus.NOT_VERIFYING;
this.cancelButton.reactive = true; this.cancelButton.reactive = true;
this.nextButton.label = _("Next"); this.nextButton.label = _("Next");
this._preemptiveAnswer = null;
if (this._userVerifier) if (this._userVerifier)
this._userVerifier.cancel(); this._userVerifier.cancel();

View File

@ -350,19 +350,16 @@ var ShellUserVerifier = new Lang.Class({
try { try {
this._clearUserVerifier(); this._clearUserVerifier();
this._userVerifier = client.open_reauthentication_channel_finish(result); this._userVerifier = client.open_reauthentication_channel_finish(result);
} catch(e) { } catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) {
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
return; return;
if (e.matches(Gio.DBusError, Gio.DBusError.ACCESS_DENIED) && } catch(e if e.matches(Gio.DBusError, Gio.DBusError.ACCESS_DENIED) &&
!this._reauthOnly) { !this._reauthOnly) {
// Gdm emits org.freedesktop.DBus.Error.AccessDenied when there // Gdm emits org.freedesktop.DBus.Error.AccessDenied when there is
// is no session to reauthenticate. Fall back to performing // no session to reauthenticate. Fall back to performing verification
// verification from this login session // from this login session
client.get_user_verifier(this._cancellable, client.get_user_verifier(this._cancellable, this._userVerifierGot.bind(this));
this._userVerifierGot.bind(this));
return; return;
} } catch(e) {
this._reportInitError('Failed to open reauthentication channel', e); this._reportInitError('Failed to open reauthentication channel', e);
return; return;
} }
@ -377,9 +374,9 @@ var ShellUserVerifier = new Lang.Class({
try { try {
this._clearUserVerifier(); this._clearUserVerifier();
this._userVerifier = client.get_user_verifier_finish(result); this._userVerifier = client.get_user_verifier_finish(result);
} catch(e) { } catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) {
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
return; return;
} catch(e) {
this._reportInitError('Failed to obtain user verifier', e); this._reportInitError('Failed to obtain user verifier', e);
return; return;
} }
@ -437,9 +434,9 @@ var ShellUserVerifier = new Lang.Class({
(obj, result) => { (obj, result) => {
try { try {
obj.call_begin_verification_for_user_finish(result); obj.call_begin_verification_for_user_finish(result);
} catch(e) { } catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) {
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
return; return;
} catch(e) {
this._reportInitError('Failed to start verification for user', e); this._reportInitError('Failed to start verification for user', e);
return; return;
} }
@ -452,9 +449,9 @@ var ShellUserVerifier = new Lang.Class({
(obj, result) => { (obj, result) => {
try { try {
obj.call_begin_verification_finish(result); obj.call_begin_verification_finish(result);
} catch(e) { } catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) {
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
return; return;
} catch(e) {
this._reportInitError('Failed to start verification', e); this._reportInitError('Failed to start verification', e);
return; return;
} }
@ -537,13 +534,12 @@ var ShellUserVerifier = new Lang.Class({
_verificationFailed(retry) { _verificationFailed(retry) {
// For Not Listed / enterprise logins, immediately reset // For Not Listed / enterprise logins, immediately reset
// the dialog // the dialog
// Otherwise, when in login mode we allow ALLOWED_FAILURES attempts. // Otherwise, we allow ALLOWED_FAILURES attempts. After that, we
// After that, we go back to the welcome screen. // go back to the welcome screen.
this._failCounter++; this._failCounter++;
let canRetry = retry && this._userName && let canRetry = retry && this._userName &&
(this._reauthOnly || this._failCounter < this._settings.get_int(ALLOWED_FAILURES_KEY);
this._failCounter < this._settings.get_int(ALLOWED_FAILURES_KEY));
if (canRetry) { if (canRetry) {
if (!this.hasPendingMessages) { if (!this.hasPendingMessages) {
@ -566,7 +562,7 @@ var ShellUserVerifier = new Lang.Class({
} }
} }
this.emit('verification-failed', canRetry); this.emit('verification-failed');
}, },
_onConversationStopped(client, serviceName) { _onConversationStopped(client, serviceName) {

View File

@ -43,7 +43,6 @@
<file>ui/audioDeviceSelection.js</file> <file>ui/audioDeviceSelection.js</file>
<file>ui/backgroundMenu.js</file> <file>ui/backgroundMenu.js</file>
<file>ui/background.js</file> <file>ui/background.js</file>
<file>ui/barLevel.js</file>
<file>ui/boxpointer.js</file> <file>ui/boxpointer.js</file>
<file>ui/calendar.js</file> <file>ui/calendar.js</file>
<file>ui/checkBox.js</file> <file>ui/checkBox.js</file>
@ -131,7 +130,6 @@
<file>ui/status/rfkill.js</file> <file>ui/status/rfkill.js</file>
<file>ui/status/volume.js</file> <file>ui/status/volume.js</file>
<file>ui/status/bluetooth.js</file> <file>ui/status/bluetooth.js</file>
<file>ui/status/remoteAccess.js</file>
<file>ui/status/screencast.js</file> <file>ui/status/screencast.js</file>
<file>ui/status/system.js</file> <file>ui/status/system.js</file>
<file>ui/status/thunderbolt.js</file> <file>ui/status/thunderbolt.js</file>

View File

@ -112,8 +112,6 @@ function createExtensionObject(uuid, dir, type) {
let metadataContents, success, tag; let metadataContents, success, tag;
try { try {
[success, metadataContents, tag] = metadataFile.load_contents(null); [success, metadataContents, tag] = metadataFile.load_contents(null);
if (metadataContents instanceof Uint8Array)
metadataContents = imports.byteArray.toString(metadataContents);
} catch (e) { } catch (e) {
throw new Error('Failed to load metadata.json: ' + e); throw new Error('Failed to load metadata.json: ' + e);
} }

View File

@ -115,11 +115,6 @@ var IBusManager = new Lang.Class({
object_path: IBus.PATH_PANEL }); object_path: IBus.PATH_PANEL });
this._candidatePopup.setPanelService(this._panelService); this._candidatePopup.setPanelService(this._panelService);
this._panelService.connect('update-property', this._updateProperty.bind(this)); this._panelService.connect('update-property', this._updateProperty.bind(this));
this._panelService.connect('set-cursor-location', (ps, x, y, w, h) => {
let cursorLocation = { x, y, width: w, height: h };
this.emit('set-cursor-location', cursorLocation);
});
try { try {
// IBus versions older than 1.5.10 have a bug which // IBus versions older than 1.5.10 have a bug which
// causes spurious set-content-type emissions when // causes spurious set-content-type emissions when

View File

@ -15,8 +15,6 @@ var InputMethod = new Lang.Class({
this._purpose = 0; this._purpose = 0;
this._enabled = true; this._enabled = true;
this._currentFocus = null; this._currentFocus = null;
this._currentEvent = null;
this._doForwardEvent = false;
this._ibus = IBus.Bus.new_async(); this._ibus = IBus.Bus.new_async();
this._ibus.connect('connected', this._onConnected.bind(this)); this._ibus.connect('connected', this._onConnected.bind(this));
this._ibus.connect('disconnected', this._clear.bind(this)); this._ibus.connect('disconnected', this._clear.bind(this));
@ -27,9 +25,6 @@ var InputMethod = new Lang.Class({
this._onSourceChanged.bind(this)); this._onSourceChanged.bind(this));
this._currentSource = this._inputSourceManager.currentSource; this._currentSource = this._inputSourceManager.currentSource;
let deviceManager = Clutter.DeviceManager.get_default();
this._virtualDevice = deviceManager.create_virtual_device(Clutter.InputDeviceType.KEYBOARD_DEVICE);
if (this._ibus.is_connected()) if (this._ibus.is_connected())
this._onConnected(); this._onConnected();
}, },
@ -69,7 +64,6 @@ var InputMethod = new Lang.Class({
this._context.connect('commit-text', this._onCommitText.bind(this)); this._context.connect('commit-text', this._onCommitText.bind(this));
this._context.connect('delete-surrounding-text', this._onDeleteSurroundingText.bind(this)); this._context.connect('delete-surrounding-text', this._onDeleteSurroundingText.bind(this));
this._context.connect('update-preedit-text', this._onUpdatePreeditText.bind(this)); this._context.connect('update-preedit-text', this._onUpdatePreeditText.bind(this));
this._context.connect('forward-key-event', this._onForwardKeyEvent.bind(this));
this._updateCapabilities(); this._updateCapabilities();
}, },
@ -102,24 +96,6 @@ var InputMethod = new Lang.Class({
this.set_preedit_text(str, pos); this.set_preedit_text(str, pos);
}, },
_onForwardKeyEvent(context, keyval, keycode, state) {
let press = (state & IBus.ModifierType.RELEASE_MASK) == 0;
if (this._currentEvent) {
// If we are handling this same event in filter_key_press(),
// just let it go through, sending the same event again will
// be silenced away because the key counts as pressed.
if (this._currentEvent.get_key_symbol() == keyval &&
(this._currentEvent.type() == Clutter.EventType.KEY_PRESS) == press) {
this._doForwardEvent = true;
return;
}
}
this._virtualDevice.notify_key(Clutter.get_current_event_time(), keycode,
press ? Clutter.KeyState.PRESSED : Clutter.KeyState.RELEASED);
},
vfunc_focus_in(focus) { vfunc_focus_in(focus) {
this._currentFocus = focus; this._currentFocus = focus;
if (this._context) { if (this._context) {
@ -221,23 +197,13 @@ var InputMethod = new Lang.Class({
if (event.type() == Clutter.EventType.KEY_RELEASE) if (event.type() == Clutter.EventType.KEY_RELEASE)
state |= IBus.ModifierType.RELEASE_MASK; state |= IBus.ModifierType.RELEASE_MASK;
this._currentEvent = event;
this._doForwardEvent = false;
this._context.process_key_event_async(event.get_key_symbol(), this._context.process_key_event_async(event.get_key_symbol(),
event.get_key_code() - 8, // Convert XKB keycodes to evcodes event.get_key_code() - 8, // Convert XKB keycodes to evcodes
state, -1, null, state, -1, null,
(context, res) => { (context, res) => {
try { try {
let retval = context.process_key_event_async_finish(res); let retval = context.process_key_event_async_finish(res);
if (this._doForwardEvent)
retval = false;
this.notify_key_event(event, retval); this.notify_key_event(event, retval);
this._doForwardEvent = false;
this._currentEvent = null;
} catch (e) { } catch (e) {
log('Error processing key on IM: ' + e.message); log('Error processing key on IM: ' + e.message);
} }

View File

@ -40,24 +40,14 @@ const SystemdLoginSessionIface = '<node> \
<signal name="Lock" /> \ <signal name="Lock" /> \
<signal name="Unlock" /> \ <signal name="Unlock" /> \
<property name="Active" type="b" access="read" /> \ <property name="Active" type="b" access="read" /> \
<property name="Class" type="s" access="read" /> \
<property name="Id" type="s" access="read" /> \
<method name="SetLockedHint"> \ <method name="SetLockedHint"> \
<arg type="b" direction="in"/> \ <arg type="b" direction="in"/> \
</method> \ </method> \
</interface> \ </interface> \
</node>'; </node>';
const SystemdLoginUserIface = '<node> \
<interface name="org.freedesktop.login1.User"> \
<property name="Display" type="(so)" access="read" /> \
<property name="Sessions" type="a(so)" access="read" /> \
</interface> \
</node>';
const SystemdLoginManager = Gio.DBusProxy.makeProxyWrapper(SystemdLoginManagerIface); const SystemdLoginManager = Gio.DBusProxy.makeProxyWrapper(SystemdLoginManagerIface);
const SystemdLoginSession = Gio.DBusProxy.makeProxyWrapper(SystemdLoginSessionIface); const SystemdLoginSession = Gio.DBusProxy.makeProxyWrapper(SystemdLoginSessionIface);
const SystemdLoginUser = Gio.DBusProxy.makeProxyWrapper(SystemdLoginUserIface);
function haveSystemd() { function haveSystemd() {
return GLib.access("/run/systemd/seats", 0) >= 0; return GLib.access("/run/systemd/seats", 0) >= 0;
@ -119,9 +109,6 @@ var LoginManagerSystemd = new Lang.Class({
this._proxy = new SystemdLoginManager(Gio.DBus.system, this._proxy = new SystemdLoginManager(Gio.DBus.system,
'org.freedesktop.login1', 'org.freedesktop.login1',
'/org/freedesktop/login1'); '/org/freedesktop/login1');
this._userProxy = new SystemdLoginUser(Gio.DBus.system,
'org.freedesktop.login1',
'/org/freedesktop/login1/user/self');
this._proxy.connectSignal('PrepareForSleep', this._proxy.connectSignal('PrepareForSleep',
this._prepareForSleep.bind(this)); this._prepareForSleep.bind(this));
}, },
@ -134,32 +121,9 @@ var LoginManagerSystemd = new Lang.Class({
let sessionId = GLib.getenv('XDG_SESSION_ID'); let sessionId = GLib.getenv('XDG_SESSION_ID');
if (!sessionId) { if (!sessionId) {
log('Unset XDG_SESSION_ID, getCurrentSessionProxy() called outside a user session. Asking logind directly.'); log('Unset XDG_SESSION_ID, getCurrentSessionProxy() called outside a user session.');
let [session, objectPath] = this._userProxy.Display;
if (session) {
log(`Will monitor session ${session}`);
sessionId = session;
} else {
log('Failed to find "Display" session; are we the greeter?');
for (let [session, objectPath] of this._userProxy.Sessions) {
let sessionProxy = new SystemdLoginSession(Gio.DBus.system,
'org.freedesktop.login1',
objectPath);
log(`Considering ${session}, class=${sessionProxy.Class}`);
if (sessionProxy.Class == 'greeter') {
log(`Yes, will monitor session ${session}`);
sessionId = session;
break;
}
}
if (!sessionId) {
log('No, failed to get session from logind.');
return; return;
} }
}
}
this._proxy.GetSessionRemote(sessionId, (result, error) => { this._proxy.GetSessionRemote(sessionId, (result, error) => {
if (error) { if (error) {

View File

@ -502,8 +502,7 @@ var CyclerPopup = new Lang.Class({
_finish() { _finish() {
let window = this._items[this._selectedIndex]; let window = this._items[this._selectedIndex];
let ws = window.get_workspace(); let ws = window.get_workspace();
let workspaceManager = global.workspace_manager; let activeWs = global.screen.get_active_workspace();
let activeWs = workspaceManager.get_active_workspace();
if (window.minimized) { if (window.minimized) {
Main.wm.skipNextEffect(window.get_compositor_private()); Main.wm.skipNextEffect(window.get_compositor_private());
@ -573,14 +572,7 @@ var WindowSwitcherPopup = new Lang.Class({
}, },
_getWindowList() { _getWindowList() {
let workspace = null; let workspace = this._settings.get_boolean('current-workspace-only') ? global.screen.get_active_workspace() : null;
if (this._settings.get_boolean('current-workspace-only')) {
let workspaceManager = global.workspace_manager;
workspace = workspaceManager.get_active_workspace();
}
return getWindows(workspace); return getWindows(workspace);
}, },
@ -628,14 +620,7 @@ var WindowCyclerPopup = new Lang.Class({
}, },
_getWindows() { _getWindows() {
let workspace = null; let workspace = this._settings.get_boolean('current-workspace-only') ? global.screen.get_active_workspace() : null;
if (this._settings.get_boolean('current-workspace-only')) {
let workspaceManager = global.workspace_manager;
workspace = workspaceManager.get_active_workspace();
}
return getWindows(workspace); return getWindows(workspace);
}, },
@ -684,14 +669,8 @@ var AppSwitcher = new Lang.Class({
let windowTracker = Shell.WindowTracker.get_default(); let windowTracker = Shell.WindowTracker.get_default();
let settings = new Gio.Settings({ schema_id: 'org.gnome.shell.app-switcher' }); let settings = new Gio.Settings({ schema_id: 'org.gnome.shell.app-switcher' });
let workspace = settings.get_boolean('current-workspace-only') ? global.screen.get_active_workspace()
let workspace = null; : null;
if (settings.get_boolean('current-workspace-only')) {
let workspaceManager = global.workspace_manager;
workspace = workspaceManager.get_active_workspace();
}
let allWindows = global.display.get_tab_list(Meta.TabList.NORMAL, workspace); let allWindows = global.display.get_tab_list(Meta.TabList.NORMAL, workspace);
// Construct the AppIcons, add to the popup // Construct the AppIcons, add to the popup

View File

@ -1862,8 +1862,7 @@ var AppIconMenu = new Lang.Class({
// Display the app windows menu items and the separator between windows // Display the app windows menu items and the separator between windows
// of the current desktop and other windows. // of the current desktop and other windows.
let workspaceManager = global.workspace_manager; let activeWorkspace = global.screen.get_active_workspace();
let activeWorkspace = workspaceManager.get_active_workspace();
let separatorShown = windows.length > 0 && windows[0].get_workspace() != activeWorkspace; let separatorShown = windows.length > 0 && windows[0].get_workspace() != activeWorkspace;
for (let i = 0; i < windows.length; i++) { for (let i = 0; i < windows.length; i++) {

View File

@ -240,7 +240,7 @@ var Background = new Lang.Class({
file: null, file: null,
style: null }); style: null });
this.background = new Meta.Background({ meta_display: global.display }); this.background = new Meta.Background({ meta_screen: global.screen });
this.background._delegate = this; this.background._delegate = this;
this._settings = params.settings; this._settings = params.settings;
@ -499,12 +499,12 @@ var SystemBackground = new Lang.Class({
let file = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/noise-texture.png'); let file = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/noise-texture.png');
if (_systemBackground == null) { if (_systemBackground == null) {
_systemBackground = new Meta.Background({ meta_display: global.display }); _systemBackground = new Meta.Background({ meta_screen: global.screen });
_systemBackground.set_color(DEFAULT_BACKGROUND_COLOR); _systemBackground.set_color(DEFAULT_BACKGROUND_COLOR);
_systemBackground.set_file(file, GDesktopEnums.BackgroundStyle.WALLPAPER); _systemBackground.set_file(file, GDesktopEnums.BackgroundStyle.WALLPAPER);
} }
this.actor = new Meta.BackgroundActor({ meta_display: global.display, this.actor = new Meta.BackgroundActor({ meta_screen: global.screen,
monitor: 0, monitor: 0,
background: _systemBackground }); background: _systemBackground });
@ -538,9 +538,7 @@ var BackgroundSource = new Lang.Class({
this._settings = new Gio.Settings({ schema_id: settingsSchema }); this._settings = new Gio.Settings({ schema_id: settingsSchema });
this._backgrounds = []; this._backgrounds = [];
let monitorManager = Meta.MonitorManager.get(); this._monitorsChangedId = global.screen.connect('monitors-changed',
this._monitorsChangedId =
monitorManager.connect('monitors-changed',
this._onMonitorsChanged.bind(this)); this._onMonitorsChanged.bind(this));
}, },
@ -606,8 +604,7 @@ var BackgroundSource = new Lang.Class({
}, },
destroy() { destroy() {
let monitorManager = Meta.MonitorManager.get(); global.screen.disconnect(this._monitorsChangedId);
monitorManager.disconnect(this._monitorsChangedId);
for (let monitorIndex in this._backgrounds) { for (let monitorIndex in this._backgrounds) {
let background = this._backgrounds[monitorIndex]; let background = this._backgrounds[monitorIndex];
@ -754,7 +751,7 @@ var BackgroundManager = new Lang.Class({
_createBackgroundActor() { _createBackgroundActor() {
let background = this._backgroundSource.getBackground(this._monitorIndex); let background = this._backgroundSource.getBackground(this._monitorIndex);
let backgroundActor = new Meta.BackgroundActor({ meta_display: global.display, let backgroundActor = new Meta.BackgroundActor({ meta_screen: global.screen,
monitor: this._monitorIndex, monitor: this._monitorIndex,
background: background.background, background: background.background,
vignette: this._vignette, vignette: this._vignette,

View File

@ -1,210 +0,0 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const Atk = imports.gi.Atk;
const Cairo = imports.cairo;
const Clutter = imports.gi.Clutter;
const Lang = imports.lang;
const St = imports.gi.St;
const Signals = imports.signals;
var BarLevel = new Lang.Class({
Name: "BarLevel",
_init(value, params) {
if (isNaN(value))
// Avoid spreading NaNs around
throw TypeError('The bar level value must be a number');
this._maxValue = 1;
this._value = Math.max(Math.min(value, this._maxValue), 0);
this._overdriveStart = 1;
this._barLevelWidth = 0;
if (params == undefined)
params = {}
this.actor = new St.DrawingArea({ styleClass: params['styleClass'] || 'barlevel',
can_focus: params['canFocus'] || false,
reactive: params['reactive'] || false,
accessible_role: params['accessibleRole'] || Atk.Role.LEVEL_BAR });
this.actor.connect('repaint', this._barLevelRepaint.bind(this));
this.actor.connect('allocation-changed', (actor, box) => {
this._barLevelWidth = box.get_width();
});
this._customAccessible = St.GenericAccessible.new_for_actor(this.actor);
this.actor.set_accessible(this._customAccessible);
this._customAccessible.connect('get-current-value', this._getCurrentValue.bind(this));
this._customAccessible.connect('get-minimum-value', this._getMinimumValue.bind(this));
this._customAccessible.connect('get-maximum-value', this._getMaximumValue.bind(this));
this._customAccessible.connect('set-current-value', this._setCurrentValue.bind(this));
this.connect('value-changed', this._valueChanged.bind(this));
},
setValue(value) {
if (isNaN(value))
throw TypeError('The bar level value must be a number');
this._value = Math.max(Math.min(value, this._maxValue), 0);
this.actor.queue_repaint();
},
setMaximumValue(value) {
if (isNaN(value))
throw TypeError('The bar level max value must be a number');
this._maxValue = Math.max(value, 1);
this._overdriveStart = Math.min(this._overdriveStart, this._maxValue);
this.actor.queue_repaint();
},
setOverdriveStart(value) {
if (isNaN(value))
throw TypeError('The overdrive limit value must be a number');
if (value > this._maxValue)
throw new Error(`Tried to set overdrive value to ${value}, ` +
`which is a number greater than the maximum allowed value ${this._maxValue}`);
this._overdriveStart = value;
this._value = Math.max(Math.min(value, this._maxValue), 0);
this.actor.queue_repaint();
},
_barLevelRepaint(area) {
let cr = area.get_context();
let themeNode = area.get_theme_node();
let [width, height] = area.get_surface_size();
let barLevelHeight = themeNode.get_length('-barlevel-height');
let barLevelBorderRadius = Math.min(width, barLevelHeight) / 2;
let fgColor = themeNode.get_foreground_color();
let barLevelColor = themeNode.get_color('-barlevel-background-color');
let barLevelActiveColor = themeNode.get_color('-barlevel-active-background-color');
let barLevelOverdriveColor = themeNode.get_color('-barlevel-overdrive-color');
let barLevelBorderWidth = Math.min(themeNode.get_length('-barlevel-border-width'), 1);
let [hasBorderColor, barLevelBorderColor] =
themeNode.lookup_color('-barlevel-border-color', false);
if (!hasBorderColor)
barLevelBorderColor = barLevelColor;
let [hasActiveBorderColor, barLevelActiveBorderColor] =
themeNode.lookup_color('-barlevel-active-border-color', false);
if (!hasActiveBorderColor)
barLevelActiveBorderColor = barLevelActiveColor;
let [hasOverdriveBorderColor, barLevelOverdriveBorderColor] =
themeNode.lookup_color('-barlevel-overdrive-border-color', false);
if (!hasOverdriveBorderColor)
barLevelOverdriveBorderColor = barLevelOverdriveColor;
const TAU = Math.PI * 2;
let endX = 0;
if (this._maxValue > 0)
endX = barLevelBorderRadius + (width - 2 * barLevelBorderRadius) * this._value / this._maxValue;
let overdriveSeparatorX = barLevelBorderRadius + (width - 2 * barLevelBorderRadius) * this._overdriveStart / this._maxValue;
let overdriveActive = this._overdriveStart !== this._maxValue;
let overdriveSeparatorWidth = 0;
if (overdriveActive)
overdriveSeparatorWidth = themeNode.get_length('-barlevel-overdrive-separator-width');
/* background bar */
cr.arc(width - barLevelBorderRadius - barLevelBorderWidth, height / 2, barLevelBorderRadius, TAU * 3 / 4, TAU * 1 / 4);
cr.lineTo(endX, (height + barLevelHeight) / 2);
cr.lineTo(endX, (height - barLevelHeight) / 2);
cr.lineTo(width - barLevelBorderRadius - barLevelBorderWidth, (height - barLevelHeight) / 2);
Clutter.cairo_set_source_color(cr, barLevelColor);
cr.fillPreserve();
Clutter.cairo_set_source_color(cr, barLevelBorderColor);
cr.setLineWidth(barLevelBorderWidth);
cr.stroke();
/* normal progress bar */
let x = Math.min(endX, overdriveSeparatorX - overdriveSeparatorWidth / 2);
cr.arc(barLevelBorderRadius + barLevelBorderWidth, height / 2, barLevelBorderRadius, TAU * 1 / 4, TAU * 3 / 4);
cr.lineTo(x, (height - barLevelHeight) / 2);
cr.lineTo(x, (height + barLevelHeight) / 2);
cr.lineTo(barLevelBorderRadius + barLevelBorderWidth, (height + barLevelHeight) / 2);
Clutter.cairo_set_source_color(cr, barLevelActiveColor);
cr.fillPreserve();
Clutter.cairo_set_source_color(cr, barLevelActiveBorderColor);
cr.setLineWidth(barLevelBorderWidth);
cr.stroke();
/* overdrive progress barLevel */
x = Math.min(endX, overdriveSeparatorX) + overdriveSeparatorWidth / 2;
if (this._value > this._overdriveStart) {
cr.moveTo(x, (height - barLevelHeight) / 2);
cr.lineTo(endX, (height - barLevelHeight) / 2);
cr.lineTo(endX, (height + barLevelHeight) / 2);
cr.lineTo(x, (height + barLevelHeight) / 2);
cr.lineTo(x, (height - barLevelHeight) / 2);
Clutter.cairo_set_source_color(cr, barLevelOverdriveColor);
cr.fillPreserve();
Clutter.cairo_set_source_color(cr, barLevelOverdriveBorderColor);
cr.setLineWidth(barLevelBorderWidth);
cr.stroke();
}
/* end progress bar arc */
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) {
cr.moveTo(overdriveSeparatorX - overdriveSeparatorWidth / 2, (height - barLevelHeight) / 2);
cr.lineTo(overdriveSeparatorX + overdriveSeparatorWidth / 2, (height - barLevelHeight) / 2);
cr.lineTo(overdriveSeparatorX + overdriveSeparatorWidth / 2, (height + barLevelHeight) / 2);
cr.lineTo(overdriveSeparatorX - overdriveSeparatorWidth / 2, (height + barLevelHeight) / 2);
cr.lineTo(overdriveSeparatorX - overdriveSeparatorWidth / 2, (height - barLevelHeight) / 2);
if (this._value <= this._overdriveStart)
Clutter.cairo_set_source_color(cr, fgColor);
else
Clutter.cairo_set_source_color(cr, barLevelColor);
cr.fill();
}
cr.$dispose();
},
_getCurrentValue(actor) {
return this._value;
},
_getOverdriveStart(actor) {
return this._overdriveStart;
},
_getMinimumValue(actor) {
return 0;
},
_getMaximumValue(actor) {
return this._maxValue;
},
_setCurrentValue(actor, value) {
this._value = value;
},
_valueChanged(barLevel, value, property) {
this._customAccessible.notify("accessible-value");
},
get value() {
return this._value;
}
});
Signals.addSignalMethods(BarLevel.prototype);

View File

@ -821,8 +821,6 @@ var EventsSection = new Lang.Class({
this._desktopSettings.connect('changed', this._reloadEvents.bind(this)); this._desktopSettings.connect('changed', this._reloadEvents.bind(this));
this._eventSource = new EmptyEventSource(); this._eventSource = new EmptyEventSource();
this._messageById = new Map();
this.parent(); this.parent();
this._title = new St.Button({ style_class: 'events-section-title', this._title = new St.Button({ style_class: 'events-section-title',
@ -877,32 +875,20 @@ var EventsSection = new Lang.Class({
this._reloading = true; this._reloading = true;
this._list.destroy_all_children();
let periodBegin = _getBeginningOfDay(this._date); let periodBegin = _getBeginningOfDay(this._date);
let periodEnd = _getEndOfDay(this._date); let periodEnd = _getEndOfDay(this._date);
let events = this._eventSource.getEvents(periodBegin, periodEnd); let events = this._eventSource.getEvents(periodBegin, periodEnd);
let ids = events.map(e => e.id);
this._messageById.forEach((message, id) => {
if (ids.includes(id))
return;
this._messageById.delete(id);
this.removeMessage(message);
});
for (let i = 0; i < events.length; i++) { for (let i = 0; i < events.length; i++) {
let event = events[i]; let event = events[i];
let message = this._messageById.get(event.id); let message = new EventMessage(event, this._date);
if (!message) {
message = new EventMessage(event, this._date);
message.connect('close', () => { message.connect('close', () => {
this._ignoreEvent(event); this._ignoreEvent(event);
}); });
this._messageById.set(event.id, message);
this.addMessage(message, false); this.addMessage(message, false);
} else {
this.moveMessage(message, i, false);
}
} }
this._reloading = false; this._reloading = false;

View File

@ -100,7 +100,7 @@ var CloseDialog = new Lang.Class({
if (this._dialog != null) if (this._dialog != null)
return; return;
Meta.disable_unredirect_for_display(global.display); Meta.disable_unredirect_for_screen(global.screen);
this._timeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, ALIVE_TIMEOUT, this._timeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, ALIVE_TIMEOUT,
() => { () => {
@ -128,7 +128,7 @@ var CloseDialog = new Lang.Class({
if (this._dialog == null) if (this._dialog == null)
return; return;
Meta.enable_unredirect_for_display(global.display); Meta.enable_unredirect_for_screen(global.screen);
GLib.source_remove(this._timeoutId); GLib.source_remove(this._timeoutId);
this._timeoutId = 0; this._timeoutId = 0;

View File

@ -85,11 +85,9 @@ var CtrlAltTabManager = new Lang.Class({
// And add the windows metacity would show in its Ctrl-Alt-Tab list // And add the windows metacity would show in its Ctrl-Alt-Tab list
if (Main.sessionMode.hasWindows && !Main.overview.visible) { if (Main.sessionMode.hasWindows && !Main.overview.visible) {
let display = global.display; let screen = global.screen;
let workspaceManager = global.workspace_manager; let display = screen.get_display();
let activeWorkspace = workspaceManager.get_active_workspace(); let windows = display.get_tab_list(Meta.TabList.DOCKS, screen.get_active_workspace ());
let windows = display.get_tab_list(Meta.TabList.DOCKS,
activeWorkspace);
let windowTracker = Shell.WindowTracker.get_default(); let windowTracker = Shell.WindowTracker.get_default();
let textureCache = St.TextureCache.get_default(); let textureCache = St.TextureCache.get_default();
for (let i = 0; i < windows.length; i++) { for (let i = 0; i < windows.length; i++) {
@ -133,7 +131,7 @@ var CtrlAltTabManager = new Lang.Class({
}, },
_focusWindows(timestamp) { _focusWindows(timestamp) {
global.display.focus_default_window(timestamp); global.screen.focus_default_window(timestamp);
} }
}); });

View File

@ -280,7 +280,7 @@ var _Draggable = new Lang.Class({
this._touchSequence = sequence; this._touchSequence = sequence;
this._grabEvents(); this._grabEvents();
global.display.set_cursor(Meta.Cursor.DND_IN_DRAG); global.screen.set_cursor(Meta.Cursor.DND_IN_DRAG);
this._dragX = this._dragStartX = stageX; this._dragX = this._dragStartX = stageX;
this._dragY = this._dragStartY = stageY; this._dragY = this._dragStartY = stageY;
@ -412,7 +412,7 @@ var _Draggable = new Lang.Class({
if (motionFunc) { if (motionFunc) {
let result = motionFunc(dragEvent); let result = motionFunc(dragEvent);
if (result != DragMotionResult.CONTINUE) { if (result != DragMotionResult.CONTINUE) {
global.display.set_cursor(DRAG_CURSOR_MAP[result]); global.screen.set_cursor(DRAG_CURSOR_MAP[result]);
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
} }
} }
@ -430,13 +430,13 @@ var _Draggable = new Lang.Class({
targY, targY,
0); 0);
if (result != DragMotionResult.CONTINUE) { if (result != DragMotionResult.CONTINUE) {
global.display.set_cursor(DRAG_CURSOR_MAP[result]); global.screen.set_cursor(DRAG_CURSOR_MAP[result]);
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
} }
} }
target = target.get_parent(); target = target.get_parent();
} }
global.display.set_cursor(Meta.Cursor.DND_IN_DRAG); global.screen.set_cursor(Meta.Cursor.DND_IN_DRAG);
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}, },
@ -509,7 +509,7 @@ var _Draggable = new Lang.Class({
} }
this._dragInProgress = false; this._dragInProgress = false;
global.display.set_cursor(Meta.Cursor.DEFAULT); global.screen.set_cursor(Meta.Cursor.DEFAULT);
this.emit('drag-end', event.get_time(), true); this.emit('drag-end', event.get_time(), true);
this._dragComplete(); this._dragComplete();
return true; return true;
@ -561,7 +561,7 @@ var _Draggable = new Lang.Class({
let [snapBackX, snapBackY, snapBackScale] = this._getRestoreLocation(); let [snapBackX, snapBackY, snapBackScale] = this._getRestoreLocation();
if (this._actorDestroyed) { if (this._actorDestroyed) {
global.display.set_cursor(Meta.Cursor.DEFAULT); global.screen.set_cursor(Meta.Cursor.DEFAULT);
if (!this._buttonDown) if (!this._buttonDown)
this._dragComplete(); this._dragComplete();
this.emit('drag-end', eventTime, false); this.emit('drag-end', eventTime, false);
@ -620,7 +620,7 @@ var _Draggable = new Lang.Class({
if (!this._buttonDown) if (!this._buttonDown)
this._dragComplete(); this._dragComplete();
global.display.set_cursor(Meta.Cursor.DEFAULT); global.screen.set_cursor(Meta.Cursor.DEFAULT);
}, },
_onAnimationComplete(dragActor, eventTime) { _onAnimationComplete(dragActor, eventTime) {

View File

@ -27,9 +27,9 @@ var EdgeDragAction = new Lang.Class({
_getMonitorRect(x, y) { _getMonitorRect(x, y) {
let rect = new Meta.Rectangle({ x: x - 1, y: y - 1, width: 1, height: 1 }); let rect = new Meta.Rectangle({ x: x - 1, y: y - 1, width: 1, height: 1 });
let monitorIndex = global.display.get_monitor_index_for_rect(rect); let monitorIndex = global.screen.get_monitor_index_for_rect(rect);
return global.display.get_monitor_geometry(monitorIndex); return global.screen.get_monitor_geometry(monitorIndex);
}, },
vfunc_gesture_prepare(action, actor) { vfunc_gesture_prepare(action, actor) {

View File

@ -697,14 +697,7 @@ var EndSessionDialog = new Lang.Class({
if (proxy.State == 'closing') if (proxy.State == 'closing')
continue; continue;
let sessionId = GLib.getenv('XDG_SESSION_ID'); if (proxy.Id == GLib.getenv('XDG_SESSION_ID'))
if (!sessionId)
this._loginManager.getCurrentSessionProxy(currentSessionProxy => {
sessionId = currentSessionProxy.Id;
log(`endSessionDialog: No XDG_SESSION_ID, fetched from logind: ${sessionId}`);
});
if (proxy.Id == sessionId)
continue; continue;
let session = { user: this._userManager.get_user(userName), let session = { user: this._userManager.get_user(userName),

View File

@ -1,5 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const FocusCaretTracker = imports.ui.focusCaretTracker;
const Atspi = imports.gi.Atspi; const Atspi = imports.gi.Atspi;
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const Gdk = imports.gi.Gdk; const Gdk = imports.gi.Gdk;
@ -12,7 +13,6 @@ const Signals = imports.signals;
const St = imports.gi.St; const St = imports.gi.St;
const InputSourceManager = imports.ui.status.keyboard; const InputSourceManager = imports.ui.status.keyboard;
const IBusManager = imports.misc.ibusManager;
const BoxPointer = imports.ui.boxpointer; const BoxPointer = imports.ui.boxpointer;
const Layout = imports.ui.layout; const Layout = imports.ui.layout;
const Main = imports.ui.main; const Main = imports.ui.main;
@ -261,7 +261,6 @@ var Key = new Lang.Class({
this._extended_keyboard = null; this._extended_keyboard = null;
this._pressTimeoutId = 0; this._pressTimeoutId = 0;
this._capturedPress = false; this._capturedPress = false;
this._capturedEventId = 0; this._capturedEventId = 0;
this._unmapId = 0; this._unmapId = 0;
this._longPress = false; this._longPress = false;
@ -472,8 +471,6 @@ var KeyboardModel = new Lang.Class({
_loadModel(groupName) { _loadModel(groupName) {
let file = Gio.File.new_for_uri('resource:///org/gnome/shell/osk-layouts/%s.json'.format(groupName)); let file = Gio.File.new_for_uri('resource:///org/gnome/shell/osk-layouts/%s.json'.format(groupName));
let [success, contents] = file.load_contents(null); let [success, contents] = file.load_contents(null);
if (contents instanceof Uint8Array)
contents = imports.byteArray.toString(contents);
return JSON.parse(contents); return JSON.parse(contents);
}, },
@ -487,73 +484,6 @@ var KeyboardModel = new Lang.Class({
} }
}); });
var FocusTracker = new Lang.Class({
Name: 'FocusTracker',
_init() {
this._currentWindow = null;
global.display.connect('notify::focus-window', () => {
this._setCurrentWindow(global.display.focus_window);
this.emit('window-changed', this._currentWindow);
});
global.display.connect('grab-op-begin', (display, window, op) => {
if (window == this._currentWindow &&
(op == Meta.GrabOp.MOVING || op == Meta.GrabOp.KEYBOARD_MOVING))
this.emit('reset');
});
/* Valid for wayland clients */
Main.inputMethod.connect('cursor-location-changed', (o, rect) => {
let newRect = { x: rect.get_x(), y: rect.get_y(), width: rect.get_width(), height: rect.get_height() };
this._setCurrentRect(newRect);
});
this._ibusManager = IBusManager.getIBusManager();
this._ibusManager.connect('set-cursor-location', (manager, rect) => {
/* Valid for X11 clients only */
if (Main.inputMethod.currentFocus)
return;
this._setCurrentRect(rect);
});
},
get currentWindow() {
return this._currentWindow;
},
_setCurrentWindow(window) {
this._currentWindow = window;
},
_setCurrentRect(rect) {
if (this._currentWindow) {
let frameRect = this._currentWindow.get_frame_rect();
rect.x -= frameRect.x;
rect.y -= frameRect.y;
}
this._rect = rect;
this.emit('position-changed');
},
getCurrentRect() {
let rect = { x: this._rect.x, y: this._rect.y,
width: this._rect.width, height: this._rect.height };
if (this._currentWindow) {
let frameRect = this._currentWindow.get_frame_rect();
rect.x += frameRect.x;
rect.y += frameRect.y;
}
return rect;
}
});
Signals.addSignalMethods(FocusTracker.prototype);
var Keyboard = new Lang.Class({ var Keyboard = new Lang.Class({
Name: 'Keyboard', Name: 'Keyboard',
@ -561,10 +491,15 @@ var Keyboard = new Lang.Class({
this.actor = null; this.actor = null;
this._focusInExtendedKeys = false; this._focusInExtendedKeys = false;
this._focusCaretTracker = new FocusCaretTracker.FocusCaretTracker();
this._focusCaretTracker.connect('focus-changed', this._onFocusChanged.bind(this));
this._focusCaretTracker.connect('caret-moved', this._onCaretMoved.bind(this));
this._languagePopup = null; this._languagePopup = null;
this._currentAccessible = null;
this._caretTrackingEnabled = false;
this._updateCaretPositionId = 0;
this._currentFocusWindow = null; this._currentFocusWindow = null;
this._animFocusedWindow = null; this._originalWindowY = null;
this._delayedAnimFocusWindow = null;
this._enableKeyboard = false; // a11y settings value this._enableKeyboard = false; // a11y settings value
this._enabled = false; // enabled state (by setting or device type) this._enabled = false; // enabled state (by setting or device type)
@ -575,14 +510,6 @@ var Keyboard = new Lang.Class({
this._lastDeviceId = null; this._lastDeviceId = null;
this._suggestions = null; this._suggestions = null;
this._focusTracker = new FocusTracker();
this._focusTracker.connect('position-changed', this._onFocusPositionChanged.bind(this));
this._focusTracker.connect('reset', () => {
this._delayedAnimFocusWindow = null;
this._animFocusedWindow = null;
this._oskFocusWindow = null;
});
Meta.get_backend().connect('last-device-changed', Meta.get_backend().connect('last-device-changed',
(backend, deviceId) => { (backend, deviceId) => {
let manager = Clutter.DeviceManager.get_default(); let manager = Clutter.DeviceManager.get_default();
@ -605,15 +532,102 @@ var Keyboard = new Lang.Class({
this._keyboardRestingId = 0; this._keyboardRestingId = 0;
Main.layoutManager.connect('monitors-changed', this._relayout.bind(this)); Main.layoutManager.connect('monitors-changed', this._relayout.bind(this));
//Main.inputMethod.connect('cursor-location-changed', (o, rect) => {
// if (this._keyboardVisible) {
// let currentWindow = global.screen.get_display().focus_window;
// this.setCursorLocation(currentWindow, rect.get_x(), rect.get_y(),
// rect.get_width(), rect.get_height());
// }
//});
}, },
get visible() { get visible() {
return this._keyboardVisible; return this._keyboardVisible;
}, },
_onFocusPositionChanged(focusTracker) { _setCaretTrackerEnabled(enabled) {
let rect = focusTracker.getCurrentRect(); if (this._caretTrackingEnabled == enabled)
this.setCursorLocation(focusTracker.currentWindow, rect.x, rect.y, rect.width, rect.height); return;
this._caretTrackingEnabled = enabled;
if (enabled) {
this._focusCaretTracker.registerFocusListener();
this._focusCaretTracker.registerCaretListener();
} else {
this._focusCaretTracker.deregisterFocusListener();
this._focusCaretTracker.deregisterCaretListener();
}
},
_updateCaretPosition(accessible) {
if (this._updateCaretPositionId)
GLib.source_remove(this._updateCaretPositionId);
if (!this._keyboardRequested)
return;
this._updateCaretPositionId = GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => {
this._updateCaretPositionId = 0;
let currentWindow = global.screen.get_display().focus_window;
if (!currentWindow) {
this.setCursorLocation(null);
return GLib.SOURCE_REMOVE;
}
let windowRect = currentWindow.get_frame_rect();
let text = accessible.get_text_iface();
let component = accessible.get_component_iface();
try {
let caretOffset = text.get_caret_offset();
let caretRect = text.get_character_extents(caretOffset, Atspi.CoordType.WINDOW);
let focusRect = component.get_extents(Atspi.CoordType.WINDOW);
if (caretRect.width == 0 && caretRect.height == 0)
caretRect = focusRect;
this.setCursorLocation(currentWindow, caretRect.x, caretRect.y, caretRect.width, caretRect.height);
} catch (e) {
log('Error updating caret position for OSK: ' + e.message);
}
return GLib.SOURCE_REMOVE;
});
GLib.Source.set_name_by_id(this._updateCaretPositionId, '[gnome-shell] this._updateCaretPosition');
},
_focusIsTextEntry(accessible) {
try {
let role = accessible.get_role();
let stateSet = accessible.get_state_set();
return stateSet.contains(Atspi.StateType.EDITABLE) || role == Atspi.Role.TERMINAL;
} catch (e) {
log('Error determining accessible role: ' + e.message);
return false;
}
},
_onFocusChanged(caretTracker, event) {
let accessible = event.source;
if (!this._focusIsTextEntry(accessible))
return;
let focused = event.detail1 != 0;
if (focused) {
this._currentAccessible = accessible;
this._updateCaretPosition(accessible);
this.show(Main.layoutManager.focusIndex);
} else if (this._currentAccessible == accessible) {
this._currentAccessible = null;
this.hide();
}
},
_onCaretMoved(caretTracker, event) {
let accessible = event.source;
if (this._currentAccessible == accessible)
this._updateCaretPosition(accessible);
}, },
_lastDeviceIsTouchscreen() { _lastDeviceIsTouchscreen() {
@ -636,6 +650,8 @@ var Keyboard = new Lang.Class({
if (!this._enabled && !this._keyboardController) if (!this._enabled && !this._keyboardController)
return; return;
this._setCaretTrackerEnabled(this._enabled);
if (this._enabled && !this._keyboardController) if (this._enabled && !this._keyboardController)
this._setupKeyboard(); this._setupKeyboard();
else if (!this._enabled) else if (!this._enabled)
@ -920,11 +936,9 @@ var Keyboard = new Lang.Class({
}, },
_relayout() { _relayout() {
let monitor = Main.layoutManager.keyboardMonitor; if (this.actor == null)
if (this.actor == null || monitor == null)
return; return;
let monitor = Main.layoutManager.keyboardMonitor;
let maxHeight = monitor.height / 3; let maxHeight = monitor.height / 3;
this.actor.width = monitor.width; this.actor.width = monitor.width;
this.actor.height = maxHeight; this.actor.height = maxHeight;
@ -1013,14 +1027,11 @@ var Keyboard = new Lang.Class({
if (!this._keyboardRequested) if (!this._keyboardRequested)
return; return;
if (this._currentAccessible)
this._updateCaretPosition(this._currentAccessible);
Main.layoutManager.keyboardIndex = monitor; Main.layoutManager.keyboardIndex = monitor;
this._relayout(); this._relayout();
Main.layoutManager.showKeyboard(); Main.layoutManager.showKeyboard();
if (this._delayedAnimFocusWindow) {
this._setAnimationWindow(this._delayedAnimFocusWindow);
this._delayedAnimFocusWindow = null;
}
}, },
hide() { hide() {
@ -1091,9 +1102,8 @@ var Keyboard = new Lang.Class({
window.move_frame(true, frameRect.x, frameRect.y); window.move_frame(true, frameRect.x, frameRect.y);
}, },
_animateWindow(window, show) { _animateWindow(window, show, deltaY) {
let windowActor = window.get_compositor_private(); let windowActor = window.get_compositor_private();
let deltaY = Main.layoutManager.keyboardBox.height;
if (!windowActor) if (!windowActor)
return; return;
@ -1114,39 +1124,35 @@ var Keyboard = new Lang.Class({
} }
}, },
_setAnimationWindow(window) { setCursorLocation(window, x, y , w, h) {
if (this._animFocusedWindow == window) if (window == this._oskFocusWindow)
return; return;
if (this._animFocusedWindow) if (this._oskFocusWindow) {
this._animateWindow(this._animFocusedWindow, false); let display = global.screen.get_display();
if (window)
this._animateWindow(window, true);
this._animFocusedWindow = window; if (display.get_grab_op() == Meta.GrabOp.NONE ||
}, display.get_focus_window() != this._oskFocusWindow)
this._animateWindow(this._oskFocusWindow, false, this._oskFocusWindowDelta);
setCursorLocation(window, x, y , w, h) { this._oskFocusWindow = null;
this._oskFocusWindowDelta = null;
}
if (window) {
let monitor = Main.layoutManager.keyboardMonitor; let monitor = Main.layoutManager.keyboardMonitor;
if (window && monitor) {
let keyboardHeight = Main.layoutManager.keyboardBox.height; let keyboardHeight = Main.layoutManager.keyboardBox.height;
let focusObscured = false; let frameRect = window.get_frame_rect();
let windowActor = window.get_compositor_private();
let delta = 0;
if (y + h >= monitor.y + monitor.height - keyboardHeight) { if (frameRect.y + y + h >= monitor.height - keyboardHeight)
if (this._keyboardVisible) delta = keyboardHeight;
this._setAnimationWindow(window);
else
this._delayedAnimFocusWindow = window;
} else if (y < keyboardHeight) {
this._delayedAnimFocusWindow = null;
this._setAnimationWindow(null);
}
} else {
this._setAnimationWindow(null);
}
this._animateWindow(window, true, delta);
this._oskFocusWindow = window; this._oskFocusWindow = window;
this._oskFocusWindowDelta = delta;
}
}, },
}); });

View File

@ -109,7 +109,7 @@ var MonitorConstraint = new Lang.Class({
if (!this._workareasChangedId) { if (!this._workareasChangedId) {
this._workareasChangedId = this._workareasChangedId =
global.display.connect('workareas-changed', () => { global.screen.connect('workareas-changed', () => {
if (this._workArea) if (this._workArea)
this.actor.queue_relayout(); this.actor.queue_relayout();
}); });
@ -120,7 +120,7 @@ var MonitorConstraint = new Lang.Class({
this._monitorsChangedId = 0; this._monitorsChangedId = 0;
if (this._workareasChangedId) if (this._workareasChangedId)
global.display.disconnect(this._workareasChangedId); global.screen.disconnect(this._workareasChangedId);
this._workareasChangedId = 0; this._workareasChangedId = 0;
} }
@ -142,8 +142,7 @@ var MonitorConstraint = new Lang.Class({
let rect; let rect;
if (this._workArea) { if (this._workArea) {
let workspaceManager = global.workspace_manager; let ws = global.screen.get_workspace_by_index(0);
let ws = workspaceManager.get_workspace_by_index(0);
rect = ws.get_work_area_for_monitor(index); rect = ws.get_work_area_for_monitor(index);
} else { } else {
rect = Main.layoutManager.monitors[index]; rect = Main.layoutManager.monitors[index];
@ -165,7 +164,7 @@ var Monitor = new Lang.Class({
}, },
get inFullscreen() { get inFullscreen() {
return global.display.get_monitor_in_fullscreen(this.index); return global.screen.get_monitor_in_fullscreen(this.index);
} }
}) })
@ -260,7 +259,7 @@ var LayoutManager = new Lang.Class({
global.stage.remove_actor(global.top_window_group); global.stage.remove_actor(global.top_window_group);
this.uiGroup.add_actor(global.top_window_group); this.uiGroup.add_actor(global.top_window_group);
let feedbackGroup = Meta.get_feedback_group_for_display(global.display); let feedbackGroup = Meta.get_feedback_group_for_screen(global.screen);
global.stage.remove_actor(feedbackGroup); global.stage.remove_actor(feedbackGroup);
this.uiGroup.add_actor(feedbackGroup); this.uiGroup.add_actor(feedbackGroup);
@ -270,19 +269,14 @@ var LayoutManager = new Lang.Class({
this._bgManagers = []; this._bgManagers = [];
// Need to update struts on new workspaces when they are added // Need to update struts on new workspaces when they are added
let workspaceManager = global.workspace_manager; global.screen.connect('notify::n-workspaces',
workspaceManager.connect('notify::n-workspaces',
this._queueUpdateRegions.bind(this)); this._queueUpdateRegions.bind(this));
global.screen.connect('restacked',
let display = global.display;
display.connect('restacked',
this._windowsRestacked.bind(this)); this._windowsRestacked.bind(this));
display.connect('in-fullscreen-changed', global.screen.connect('monitors-changed',
this._updateFullscreen.bind(this));
let monitorManager = Meta.MonitorManager.get();
monitorManager.connect('monitors-changed',
this._monitorsChanged.bind(this)); this._monitorsChanged.bind(this));
global.screen.connect('in-fullscreen-changed',
this._updateFullscreen.bind(this));
this._monitorsChanged(); this._monitorsChanged();
// NVIDIA drivers don't preserve FBO contents across // NVIDIA drivers don't preserve FBO contents across
@ -325,12 +319,12 @@ var LayoutManager = new Lang.Class({
}, },
_updateMonitors() { _updateMonitors() {
let display = global.display; let screen = global.screen;
this.monitors = []; this.monitors = [];
let nMonitors = display.get_n_monitors(); let nMonitors = screen.get_n_monitors();
for (let i = 0; i < nMonitors; i++) for (let i = 0; i < nMonitors; i++)
this.monitors.push(new Monitor(i, display.get_monitor_geometry(i))); this.monitors.push(new Monitor(i, screen.get_monitor_geometry(i)));
if (nMonitors == 0) { if (nMonitors == 0) {
this.primaryIndex = this.bottomIndex = -1; this.primaryIndex = this.bottomIndex = -1;
@ -339,7 +333,7 @@ var LayoutManager = new Lang.Class({
} else { } else {
// If there are monitors below the primary, then we need // If there are monitors below the primary, then we need
// to split primary from bottom. // to split primary from bottom.
this.primaryIndex = this.bottomIndex = display.get_primary_monitor(); this.primaryIndex = this.bottomIndex = screen.get_primary_monitor();
for (let i = 0; i < this.monitors.length; i++) { for (let i = 0; i < this.monitors.length; i++) {
let monitor = this.monitors[i]; let monitor = this.monitors[i];
if (this._isAboveOrBelowPrimary(monitor)) { if (this._isAboveOrBelowPrimary(monitor)) {
@ -544,7 +538,7 @@ var LayoutManager = new Lang.Class({
}, },
get currentMonitor() { get currentMonitor() {
let index = global.display.get_current_monitor(); let index = global.screen.get_current_monitor();
return this.monitors[index]; return this.monitors[index];
}, },
@ -563,8 +557,6 @@ var LayoutManager = new Lang.Class({
}, },
get focusMonitor() { get focusMonitor() {
if (this.focusIndex < 0)
return null;
return this.monitors[this.focusIndex]; return this.monitors[this.focusIndex];
}, },
@ -917,8 +909,7 @@ var LayoutManager = new Lang.Class({
getWorkAreaForMonitor(monitorIndex) { getWorkAreaForMonitor(monitorIndex) {
// Assume that all workspaces will have the same // Assume that all workspaces will have the same
// struts and pick the first one. // struts and pick the first one.
let workspaceManager = global.workspace_manager; let ws = global.screen.get_workspace_by_index(0);
let ws = workspaceManager.get_workspace_by_index(0);
return ws.get_work_area_for_monitor(monitorIndex); return ws.get_work_area_for_monitor(monitorIndex);
}, },
@ -928,7 +919,7 @@ var LayoutManager = new Lang.Class({
let [x, y] = actor.get_transformed_position(); let [x, y] = actor.get_transformed_position();
let [w, h] = actor.get_transformed_size(); let [w, h] = actor.get_transformed_size();
let rect = new Meta.Rectangle({ x: x, y: y, width: w, height: h }); let rect = new Meta.Rectangle({ x: x, y: y, width: w, height: h });
return global.display.get_monitor_index_for_rect(rect); return global.screen.get_monitor_index_for_rect(rect);
}, },
findMonitorForActor(actor) { findMonitorForActor(actor) {
@ -1061,9 +1052,9 @@ var LayoutManager = new Lang.Class({
global.set_stage_input_region(rects); global.set_stage_input_region(rects);
this._isPopupWindowVisible = isPopupMenuVisible; this._isPopupWindowVisible = isPopupMenuVisible;
let workspaceManager = global.workspace_manager; let screen = global.screen;
for (let w = 0; w < workspaceManager.n_workspaces; w++) { for (let w = 0; w < screen.n_workspaces; w++) {
let workspace = workspaceManager.get_workspace_by_index(w); let workspace = screen.get_workspace_by_index(w);
workspace.set_builtin_struts(struts); workspace.set_builtin_struts(struts);
} }

View File

@ -61,7 +61,7 @@ var Magnifier = new Lang.Class({
this._zoomRegions = []; this._zoomRegions = [];
// Create small clutter tree for the magnified mouse. // Create small clutter tree for the magnified mouse.
let cursorTracker = Meta.CursorTracker.get_for_display(global.display); let cursorTracker = Meta.CursorTracker.get_for_screen(global.screen);
this._mouseSprite = new Clutter.Texture(); this._mouseSprite = new Clutter.Texture();
Shell.util_cursor_tracker_to_clutter(cursorTracker, this._mouseSprite); Shell.util_cursor_tracker_to_clutter(cursorTracker, this._mouseSprite);
this._cursorRoot = new Clutter.Actor(); this._cursorRoot = new Clutter.Actor();
@ -116,10 +116,10 @@ var Magnifier = new Lang.Class({
if (isActive != activate) { if (isActive != activate) {
if (activate) { if (activate) {
Meta.disable_unredirect_for_display(global.display); Meta.disable_unredirect_for_screen(global.screen);
this.startTrackingMouse(); this.startTrackingMouse();
} else { } else {
Meta.enable_unredirect_for_display(global.display); Meta.enable_unredirect_for_screen(global.screen);
this.stopTrackingMouse(); this.stopTrackingMouse();
} }
} }

View File

@ -14,6 +14,7 @@ const St = imports.gi.St;
const AccessDialog = imports.ui.accessDialog; const AccessDialog = imports.ui.accessDialog;
const AudioDeviceSelection = imports.ui.audioDeviceSelection; const AudioDeviceSelection = imports.ui.audioDeviceSelection;
const Components = imports.ui.components; const Components = imports.ui.components;
const Config = imports.misc.config;
const CtrlAltTab = imports.ui.ctrlAltTab; const CtrlAltTab = imports.ui.ctrlAltTab;
const EndSessionDialog = imports.ui.endSessionDialog; const EndSessionDialog = imports.ui.endSessionDialog;
const Environment = imports.ui.environment; const Environment = imports.ui.environment;
@ -249,28 +250,63 @@ function _initializeUI() {
}); });
} }
function _getStylesheet(name) { function _findThemeDirByVersion(dir, major, minor, name) {
let path;
let stylesheet; let stylesheet;
let subpath;
stylesheet = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/' + name); /* Don't search back to before we introduced this support */
if (stylesheet.query_exists(null)) let max_minor = (major == 3) ? 28 : 0;
for (let i = minor; i >= max_minor; i = i - 2) {
subpath = major + '.' + i;
path = GLib.build_filenamev([dir, 'gnome-shell', subpath, 'theme', name]);
stylesheet = Gio.file_new_for_path(path);
log('Checking for ' + path);
if (stylesheet.query_exists(null)) {
log('Using ' + path);
return stylesheet; return stylesheet;
}
}
let dataDirs = GLib.get_system_data_dirs(); path = GLib.build_filenamev([dir, 'gnome-shell', 'theme', name]);
for (let i = 0; i < dataDirs.length; i++) { stylesheet = Gio.file_new_for_path(path);
let path = GLib.build_filenamev([dataDirs[i], 'gnome-shell', 'theme', name]);
let stylesheet = Gio.file_new_for_path(path); if (stylesheet.query_exists(null)) {
if (stylesheet.query_exists(null)) log('Using unversioned' + path);
return stylesheet; return stylesheet;
} }
stylesheet = Gio.File.new_for_path(global.datadir + '/theme/' + name);
if (stylesheet.query_exists(null))
return stylesheet;
return null; return null;
} }
function _getStylesheet(name) {
let stylesheet;
let [major, minor] = Config.PACKAGE_VERSION.split('.');
// Directories are versioned according to the stable version
if ((minor % 2) == 1)
minor++;
stylesheet = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/' + name);
if (stylesheet.query_exists(null)) {
log('Using built-in default theme ' + name)
return stylesheet;
}
let dataDirs = GLib.get_system_data_dirs();
for (let i = 0; i < dataDirs.length; i++) {
stylesheet = _findThemeDirByVersion(dataDirs[i], major, minor, name)
if (stylesheet != null)
return stylesheet;
}
return _findThemeDirByVersion(global.datadir, major, minor, name);
}
function _getDefaultStylesheet() { function _getDefaultStylesheet() {
let stylesheet = null; let stylesheet = null;
let name = sessionMode.stylesheetName; let name = sessionMode.stylesheetName;
@ -429,7 +465,7 @@ function pushModal(actor, params) {
log('pushModal: invocation of begin_modal failed'); log('pushModal: invocation of begin_modal failed');
return false; return false;
} }
Meta.disable_unredirect_for_display(global.display); Meta.disable_unredirect_for_screen(global.screen);
} }
modalCount += 1; modalCount += 1;
@ -528,7 +564,7 @@ function popModal(actor, timestamp) {
layoutManager.modalEnded(); layoutManager.modalEnded();
global.end_modal(timestamp); global.end_modal(timestamp);
Meta.enable_unredirect_for_display(global.display); Meta.enable_unredirect_for_screen(global.screen);
actionMode = Shell.ActionMode.NORMAL; actionMode = Shell.ActionMode.NORMAL;
} }
@ -556,15 +592,14 @@ function openRunDialog() {
* and switching out of the overview if it's currently active * and switching out of the overview if it's currently active
*/ */
function activateWindow(window, time, workspaceNum) { function activateWindow(window, time, workspaceNum) {
let workspaceManager = global.workspace_manager; let activeWorkspaceNum = global.screen.get_active_workspace_index();
let activeWorkspaceNum = workspaceManager.get_active_workspace_index();
let windowWorkspaceNum = (workspaceNum !== undefined) ? workspaceNum : window.get_workspace().index(); let windowWorkspaceNum = (workspaceNum !== undefined) ? workspaceNum : window.get_workspace().index();
if (!time) if (!time)
time = global.get_current_time(); time = global.get_current_time();
if (windowWorkspaceNum != activeWorkspaceNum) { if (windowWorkspaceNum != activeWorkspaceNum) {
let workspace = workspaceManager.get_workspace_by_index(windowWorkspaceNum); let workspace = global.screen.get_workspace_by_index(windowWorkspaceNum);
workspace.activate_with_focus(window, time); workspace.activate_with_focus(window, time);
} else { } else {
window.activate(time); window.activate(time);

View File

@ -96,10 +96,10 @@ var URLHighlighter = new Lang.Class({
let urlId = this._findUrlAtPos(event); let urlId = this._findUrlAtPos(event);
if (urlId != -1 && !this._cursorChanged) { if (urlId != -1 && !this._cursorChanged) {
global.display.set_cursor(Meta.Cursor.POINTING_HAND); global.screen.set_cursor(Meta.Cursor.POINTING_HAND);
this._cursorChanged = true; this._cursorChanged = true;
} else if (urlId == -1) { } else if (urlId == -1) {
global.display.set_cursor(Meta.Cursor.DEFAULT); global.screen.set_cursor(Meta.Cursor.DEFAULT);
this._cursorChanged = false; this._cursorChanged = false;
} }
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
@ -110,7 +110,7 @@ var URLHighlighter = new Lang.Class({
if (this._cursorChanged) { if (this._cursorChanged) {
this._cursorChanged = false; this._cursorChanged = false;
global.display.set_cursor(Meta.Cursor.DEFAULT); global.screen.set_cursor(Meta.Cursor.DEFAULT);
} }
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}); });

View File

@ -917,7 +917,7 @@ var MessageTray = new Lang.Class({
Main.layoutManager.addChrome(this.actor, { affectsInputRegion: false }); Main.layoutManager.addChrome(this.actor, { affectsInputRegion: false });
Main.layoutManager.trackChrome(this._bannerBin, { affectsInputRegion: true }); Main.layoutManager.trackChrome(this._bannerBin, { affectsInputRegion: true });
global.display.connect('in-fullscreen-changed', this._updateState.bind(this)); global.screen.connect('in-fullscreen-changed', this._updateState.bind(this));
Main.sessionMode.connect('updated', this._sessionUpdated.bind(this)); Main.sessionMode.connect('updated', this._sessionUpdated.bind(this));

View File

@ -116,7 +116,7 @@ var ModalDialog = new Lang.Class({
if (onPrimary) if (onPrimary)
this._monitorConstraint.primary = true; this._monitorConstraint.primary = true;
else else
this._monitorConstraint.index = global.display.get_current_monitor(); this._monitorConstraint.index = global.screen.get_current_monitor();
this.state = State.OPENING; this.state = State.OPENING;

View File

@ -831,10 +831,8 @@ var GtkNotificationDaemon = new Lang.Class({
let source; let source;
try { try {
source = this._ensureAppSource(appId); source = this._ensureAppSource(appId);
} catch(e) { } catch(e if e instanceof InvalidAppError) {
if (e instanceof InvalidAppError)
return; return;
throw e;
} }
notifications.forEach(([notificationId, notification]) => { notifications.forEach(([notificationId, notification]) => {
@ -865,13 +863,10 @@ var GtkNotificationDaemon = new Lang.Class({
let source; let source;
try { try {
source = this._ensureAppSource(appId); source = this._ensureAppSource(appId);
} catch(e) { } catch(e if e instanceof InvalidAppError) {
if (e instanceof InvalidAppError) {
invocation.return_dbus_error('org.gtk.Notifications.InvalidApp', 'The app by ID "%s" could not be found'.format(appId)); invocation.return_dbus_error('org.gtk.Notifications.InvalidApp', 'The app by ID "%s" could not be found'.format(appId));
return; return;
} }
throw e;
}
let timestamp = GLib.DateTime.new_now_local().to_unix(); let timestamp = GLib.DateTime.new_now_local().to_unix();
notification['timestamp'] = new GLib.Variant('x', timestamp); notification['timestamp'] = new GLib.Variant('x', timestamp);

View File

@ -32,7 +32,7 @@ var OsdMonitorLabel = new Lang.Class({
Main.uiGroup.set_child_above_sibling(this._actor, null); Main.uiGroup.set_child_above_sibling(this._actor, null);
this._position(); this._position();
Meta.disable_unredirect_for_display(global.display); Meta.disable_unredirect_for_screen(global.screen);
}, },
_position() { _position() {
@ -48,7 +48,7 @@ var OsdMonitorLabel = new Lang.Class({
destroy() { destroy() {
this._actor.destroy(); this._actor.destroy();
Meta.enable_unredirect_for_display(global.display); Meta.enable_unredirect_for_screen(global.screen);
} }
}); });

View File

@ -4,7 +4,6 @@ const Clutter = imports.gi.Clutter;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const St = imports.gi.St; const St = imports.gi.St;
const BarLevel = imports.ui.barLevel;
const Lang = imports.lang; const Lang = imports.lang;
const Layout = imports.ui.layout; const Layout = imports.ui.layout;
const Main = imports.ui.main; const Main = imports.ui.main;
@ -18,18 +17,16 @@ var LEVEL_ANIMATION_TIME = 0.1;
var LevelBar = new Lang.Class({ var LevelBar = new Lang.Class({
Name: 'LevelBar', Name: 'LevelBar',
Extends: BarLevel.BarLevel,
_init() { _init() {
this._level = 0; this._level = 0;
this._maxLevel = 100;
let params = { this.actor = new St.Bin({ style_class: 'level',
styleClass: 'level', x_align: St.Align.START,
} y_fill: true });
this.parent(this._level, params); this._bar = new St.Widget({ style_class: 'level-bar' });
this.actor.accessible_name = _("Volume"); this.actor.set_child(this._bar);
this.actor.connect('notify::width', () => { this.level = this.level; }); this.actor.connect('notify::width', () => { this.level = this.level; });
}, },
@ -39,19 +36,12 @@ var LevelBar = new Lang.Class({
}, },
set level(value) { set level(value) {
this._level = Math.max(0, Math.min(value, this._maxLevel)); this._level = Math.max(0, Math.min(value, 100));
this.setValue(this._level / 100); let alloc = this.actor.get_allocation_box();
}, let newWidth = Math.round((alloc.x2 - alloc.x1) * this._level / 100);
if (newWidth != this._bar.width)
get maxLevel() { this._bar.width = newWidth;
return this._maxLevel;
},
set maxLevel(value) {
this._maxLevel = Math.max(100, value);
this.setMaximumValue(this._maxLevel / 100);
} }
}); });
@ -150,18 +140,12 @@ var OsdWindow = new Lang.Class({
} }
}, },
setMaxLevel(maxLevel) {
if (maxLevel === undefined)
maxLevel = 100;
this._level.maxLevel = maxLevel;
},
show() { show() {
if (!this._icon.gicon) if (!this._icon.gicon)
return; return;
if (!this.actor.visible) { if (!this.actor.visible) {
Meta.disable_unredirect_for_display(global.display); Meta.disable_unredirect_for_screen(global.screen);
this.actor.show(); this.actor.show();
this.actor.opacity = 0; this.actor.opacity = 0;
this.actor.get_parent().set_child_above_sibling(this.actor, null); this.actor.get_parent().set_child_above_sibling(this.actor, null);
@ -195,7 +179,7 @@ var OsdWindow = new Lang.Class({
transition: 'easeOutQuad', transition: 'easeOutQuad',
onComplete: () => { onComplete: () => {
this._reset(); this._reset();
Meta.enable_unredirect_for_display(global.display); Meta.enable_unredirect_for_screen(global.screen);
} }
}); });
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
@ -205,7 +189,6 @@ var OsdWindow = new Lang.Class({
this.actor.hide(); this.actor.hide();
this.setLabel(null); this.setLabel(null);
this.setLevel(null); this.setLevel(null);
this.setMaxLevel(null);
}, },
_relayout() { _relayout() {
@ -250,25 +233,24 @@ var OsdWindowManager = new Lang.Class({
this._osdWindows.length = Main.layoutManager.monitors.length; this._osdWindows.length = Main.layoutManager.monitors.length;
}, },
_showOsdWindow(monitorIndex, icon, label, level, maxLevel) { _showOsdWindow(monitorIndex, icon, label, level) {
this._osdWindows[monitorIndex].setIcon(icon); this._osdWindows[monitorIndex].setIcon(icon);
this._osdWindows[monitorIndex].setLabel(label); this._osdWindows[monitorIndex].setLabel(label);
this._osdWindows[monitorIndex].setLevel(level); this._osdWindows[monitorIndex].setLevel(level);
this._osdWindows[monitorIndex].setMaxLevel(maxLevel);
this._osdWindows[monitorIndex].show(); this._osdWindows[monitorIndex].show();
}, },
show(monitorIndex, icon, label, level, maxLevel) { show(monitorIndex, icon, label, level) {
if (monitorIndex != -1) { if (monitorIndex != -1) {
for (let i = 0; i < this._osdWindows.length; i++) { for (let i = 0; i < this._osdWindows.length; i++) {
if (i == monitorIndex) if (i == monitorIndex)
this._showOsdWindow(i, icon, label, level, maxLevel); this._showOsdWindow(i, icon, label, level);
else else
this._osdWindows[i].cancel(); this._osdWindows[i].cancel();
} }
} else { } else {
for (let i = 0; i < this._osdWindows.length; i++) for (let i = 0; i < this._osdWindows.length; i++)
this._showOsdWindow(i, icon, label, level, maxLevel); this._showOsdWindow(i, icon, label, level);
} }
}, },

View File

@ -157,7 +157,7 @@ var Overview = new Lang.Class({
Main.xdndHandler.connect('drag-begin', this._onDragBegin.bind(this)); Main.xdndHandler.connect('drag-begin', this._onDragBegin.bind(this));
Main.xdndHandler.connect('drag-end', this._onDragEnd.bind(this)); Main.xdndHandler.connect('drag-end', this._onDragEnd.bind(this));
global.display.connect('restacked', this._onRestacked.bind(this)); global.screen.connect('restacked', this._onRestacked.bind(this));
this._windowSwitchTimeoutId = 0; this._windowSwitchTimeoutId = 0;
this._windowSwitchTimestamp = 0; this._windowSwitchTimestamp = 0;
@ -286,8 +286,7 @@ var Overview = new Lang.Class({
DND.addDragMonitor(this._dragMonitor); DND.addDragMonitor(this._dragMonitor);
// Remember the workspace we started from // Remember the workspace we started from
let workspaceManager = global.workspace_manager; this._lastActiveWorkspaceIndex = global.screen.get_active_workspace_index();
this._lastActiveWorkspaceIndex = workspaceManager.get_active_workspace_index();
}, },
_onDragEnd(time) { _onDragEnd(time) {
@ -297,8 +296,7 @@ var Overview = new Lang.Class({
// we have to go back to where we started and hide // we have to go back to where we started and hide
// the overview // the overview
if (this._shown) { if (this._shown) {
let workspaceManager = global.workspace_manager; global.screen.get_workspace_by_index(this._lastActiveWorkspaceIndex).activate(time);
workspaceManager.get_workspace_by_index(this._lastActiveWorkspaceIndex).activate(time);
this.hide(); this.hide();
} }
this._resetWindowSwitchTimeout(); this._resetWindowSwitchTimeout();
@ -319,9 +317,9 @@ var Overview = new Lang.Class({
let display = Gdk.Display.get_default(); let display = Gdk.Display.get_default();
let deviceManager = display.get_device_manager(); let deviceManager = display.get_device_manager();
let pointer = deviceManager.get_client_pointer(); let pointer = deviceManager.get_client_pointer();
let [gdkScreen, pointerX, pointerY] = pointer.get_position(); let [screen, pointerX, pointerY] = pointer.get_position();
pointer.warp(gdkScreen, pointerX, pointerY); pointer.warp(screen, pointerX, pointerY);
}, },
_onDragMotion(dragEvent) { _onDragMotion(dragEvent) {
@ -552,7 +550,7 @@ var Overview = new Lang.Class({
this.visibleTarget = true; this.visibleTarget = true;
this._activationTime = GLib.get_monotonic_time() / GLib.USEC_PER_SEC; this._activationTime = GLib.get_monotonic_time() / GLib.USEC_PER_SEC;
Meta.disable_unredirect_for_display(global.display); Meta.disable_unredirect_for_screen(global.screen);
this.viewSelector.show(); this.viewSelector.show();
this._overview.opacity = 0; this._overview.opacity = 0;
@ -637,7 +635,7 @@ var Overview = new Lang.Class({
_hideDone() { _hideDone() {
// Re-enable unredirection // Re-enable unredirection
Meta.enable_unredirect_for_display(global.display); Meta.enable_unredirect_for_screen(global.screen);
this.viewSelector.hide(); this.viewSelector.hide();
this._desktopFade.hide(); this._desktopFade.hide();

View File

@ -313,8 +313,6 @@ var PadDiagram = new Lang.Class({
_init(params) { _init(params) {
let file = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/pad-osd.css'); let file = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/pad-osd.css');
let [success, css, etag] = file.load_contents(null); let [success, css, etag] = file.load_contents(null);
if (css instanceof Uint8Array)
css = imports.byteArray.toString(css);
this._curEdited = null; this._curEdited = null;
this._prevEdited = null; this._prevEdited = null;
this._css = css; this._css = css;

View File

@ -265,8 +265,7 @@ var AppMenuButton = new Lang.Class({
}, },
_findTargetApp() { _findTargetApp() {
let workspaceManager = global.workspace_manager; let workspace = global.screen.get_active_workspace();
let workspace = workspaceManager.get_active_workspace();
let tracker = Shell.WindowTracker.get_default(); let tracker = Shell.WindowTracker.get_default();
let focusedApp = tracker.focus_app; let focusedApp = tracker.focus_app;
if (focusedApp && focusedApp.is_on_workspace(workspace)) if (focusedApp && focusedApp.is_on_workspace(workspace))
@ -710,7 +709,6 @@ var AggregateMenu = new Lang.Class({
this._bluetooth = null; this._bluetooth = null;
} }
this._remoteAccess = new imports.ui.status.remoteAccess.RemoteAccessApplet();
this._power = new imports.ui.status.power.Indicator(); this._power = new imports.ui.status.power.Indicator();
this._rfkill = new imports.ui.status.rfkill.Indicator(); this._rfkill = new imports.ui.status.rfkill.Indicator();
this._volume = new imports.ui.status.volume.Indicator(); this._volume = new imports.ui.status.volume.Indicator();
@ -731,7 +729,6 @@ var AggregateMenu = new Lang.Class({
if (this._bluetooth) { if (this._bluetooth) {
this._indicators.add_child(this._bluetooth.indicators); this._indicators.add_child(this._bluetooth.indicators);
} }
this._indicators.add_child(this._remoteAccess.indicators);
this._indicators.add_child(this._rfkill.indicators); this._indicators.add_child(this._rfkill.indicators);
this._indicators.add_child(this._volume.indicators); this._indicators.add_child(this._volume.indicators);
this._indicators.add_child(this._power.indicators); this._indicators.add_child(this._power.indicators);
@ -746,7 +743,6 @@ var AggregateMenu = new Lang.Class({
if (this._bluetooth) { if (this._bluetooth) {
this.menu.addMenuItem(this._bluetooth.menu); this.menu.addMenuItem(this._bluetooth.menu);
} }
this.menu.addMenuItem(this._remoteAccess.menu);
this.menu.addMenuItem(this._location.menu); this.menu.addMenuItem(this._location.menu);
this.menu.addMenuItem(this._rfkill.menu); this.menu.addMenuItem(this._rfkill.menu);
this.menu.addMenuItem(this._power.menu); this.menu.addMenuItem(this._power.menu);
@ -800,7 +796,6 @@ var Panel = new Lang.Class({
this.actor.connect('get-preferred-height', this._getPreferredHeight.bind(this)); this.actor.connect('get-preferred-height', this._getPreferredHeight.bind(this));
this.actor.connect('allocate', this._allocate.bind(this)); this.actor.connect('allocate', this._allocate.bind(this));
this.actor.connect('button-press-event', this._onButtonPress.bind(this)); this.actor.connect('button-press-event', this._onButtonPress.bind(this));
this.actor.connect('touch-event', this._onButtonPress.bind(this));
this.actor.connect('key-press-event', this._onKeyPress.bind(this)); this.actor.connect('key-press-event', this._onKeyPress.bind(this));
Main.overview.connect('showing', () => { Main.overview.connect('showing', () => {
@ -823,7 +818,7 @@ var Panel = new Lang.Class({
global.window_group.connect('actor-removed', this._onWindowActorRemoved.bind(this)); global.window_group.connect('actor-removed', this._onWindowActorRemoved.bind(this));
global.window_manager.connect('switch-workspace', this._updateSolidStyle.bind(this)); global.window_manager.connect('switch-workspace', this._updateSolidStyle.bind(this));
global.display.connect('workareas-changed', () => { this.actor.queue_relayout(); }); global.screen.connect('workareas-changed', () => { this.actor.queue_relayout(); });
this._updatePanel(); this._updatePanel();
}, },
@ -944,13 +939,8 @@ var Panel = new Lang.Class({
if (event.get_source() != actor) if (event.get_source() != actor)
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
let type = event.type(); let button = event.get_button();
let isPress = type == Clutter.EventType.BUTTON_PRESS; if (button != 1)
if (!isPress && type != Clutter.EventType.TOUCH_BEGIN)
return Clutter.EVENT_PROPAGATE;
let button = isPress ? event.get_button() : -1;
if (isPress && button != 1)
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
let focusWindow = global.display.focus_window; let focusWindow = global.display.focus_window;
@ -971,7 +961,8 @@ var Panel = new Lang.Class({
if (!allowDrag) if (!allowDrag)
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
global.display.begin_grab_op(dragWindow, global.display.begin_grab_op(global.screen,
dragWindow,
Meta.GrabOp.MOVING, Meta.GrabOp.MOVING,
false, /* pointer grab */ false, /* pointer grab */
true, /* frame action */ true, /* frame action */
@ -986,7 +977,7 @@ var Panel = new Lang.Class({
_onKeyPress(actor, event) { _onKeyPress(actor, event) {
let symbol = event.get_key_symbol(); let symbol = event.get_key_symbol();
if (symbol == Clutter.KEY_Escape) { if (symbol == Clutter.KEY_Escape) {
global.display.focus_default_window(event.get_time()); global.screen.focus_default_window(event.get_time());
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
} }
@ -1084,8 +1075,7 @@ var Panel = new Lang.Class({
return; return;
/* Get all the windows in the active workspace that are in the primary monitor and visible */ /* Get all the windows in the active workspace that are in the primary monitor and visible */
let workspaceManager = global.workspace_manager; let activeWorkspace = global.screen.get_active_workspace();
let activeWorkspace = workspaceManager.get_active_workspace();
let windows = activeWorkspace.list_windows().filter(metaWindow => { let windows = activeWorkspace.list_windows().filter(metaWindow => {
return metaWindow.is_on_primary_monitor() && return metaWindow.is_on_primary_monitor() &&
metaWindow.showing_on_its_workspace() && metaWindow.showing_on_its_workspace() &&

View File

@ -141,17 +141,8 @@ var PopupBaseMenuItem = new Lang.Class({
}, },
_onKeyPressEvent(actor, event) { _onKeyPressEvent(actor, event) {
let state = event.get_state();
// if user has a modifier down (except capslock)
// then don't handle the key press here
state &= ~Clutter.ModifierType.LOCK_MASK;
state &= Clutter.ModifierType.MODIFIER_MASK;
if (state)
return Clutter.EVENT_PROPAGATE;
let symbol = event.get_key_symbol(); let symbol = event.get_key_symbol();
if (symbol == Clutter.KEY_space || symbol == Clutter.KEY_Return) { if (symbol == Clutter.KEY_space || symbol == Clutter.KEY_Return) {
this.activate(event); this.activate(event);
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;

View File

@ -62,11 +62,7 @@ var RunDialog = new Lang.Class({
'rt': () => { 'rt': () => {
Main.reloadThemeResource(); Main.reloadThemeResource();
Main.loadTheme(); Main.loadTheme();
}, }
'check_cloexec_fds': () => {
Shell.util_check_cloexec_fds();
},
}; };
@ -176,9 +172,8 @@ var RunDialog = new Lang.Class({
if (name.slice(0, text.length) == text) if (name.slice(0, text.length) == text)
results.push(name); results.push(name);
} }
} catch (e) { } catch (e if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND) &&
if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND) && !e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_DIRECTORY))) {
!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_DIRECTORY))
log(e); log(e);
} finally { } finally {
return results; return results;

View File

@ -570,7 +570,7 @@ var ScreenShield = new Lang.Class({
this._shortLightbox.connect('shown', this._onShortLightboxShown.bind(this)); this._shortLightbox.connect('shown', this._onShortLightboxShown.bind(this));
this.idleMonitor = Meta.IdleMonitor.get_core(); this.idleMonitor = Meta.IdleMonitor.get_core();
this._cursorTracker = Meta.CursorTracker.get_for_display(global.display); this._cursorTracker = Meta.CursorTracker.get_for_screen(global.screen);
this._syncInhibitor(); this._syncInhibitor();
}, },

View File

@ -56,7 +56,7 @@ var ScreencastService = new Lang.Class({
let recorder = this._recorders.get(sender); let recorder = this._recorders.get(sender);
if (!recorder) { if (!recorder) {
recorder = new Shell.Recorder({ stage: global.stage, recorder = new Shell.Recorder({ stage: global.stage,
display: global.display }); screen: global.screen });
recorder._watchNameId = recorder._watchNameId =
Gio.bus_watch_name(Gio.BusType.SESSION, sender, 0, null, Gio.bus_watch_name(Gio.BusType.SESSION, sender, 0, null,
this._onNameVanished.bind(this)); this._onNameVanished.bind(this));

View File

@ -55,9 +55,6 @@ const ScreenshotIface = '<node> \
<arg type="i" direction="in" name="width"/> \ <arg type="i" direction="in" name="width"/> \
<arg type="i" direction="in" name="height"/> \ <arg type="i" direction="in" name="height"/> \
</method> \ </method> \
<method name="PickColor"> \
<arg type="a{sv}" direction="out" name="result"/> \
</method> \
</interface> \ </interface> \
</node>'; </node>';
@ -75,13 +72,10 @@ var ScreenshotService = new Lang.Class({
Gio.DBus.session.own_name('org.gnome.Shell.Screenshot', Gio.BusNameOwnerFlags.REPLACE, null, null); Gio.DBus.session.own_name('org.gnome.Shell.Screenshot', Gio.BusNameOwnerFlags.REPLACE, null, null);
}, },
_createScreenshot(invocation, needsDisk=true) { _createScreenshot(invocation) {
let lockedDown = false;
if (needsDisk)
lockedDown = this._lockdownSettings.get_boolean('disable-save-to-disk')
let sender = invocation.get_sender(); let sender = invocation.get_sender();
if (this._screenShooter.has(sender) || lockedDown) { if (this._screenShooter.has(sender) ||
this._lockdownSettings.get_boolean('disable-save-to-disk')) {
invocation.return_value(GLib.Variant.new('(bs)', [false, ''])); invocation.return_value(GLib.Variant.new('(bs)', [false, '']));
return null; return null;
} }
@ -116,7 +110,7 @@ var ScreenshotService = new Lang.Class({
y + height <= global.screen_height; y + height <= global.screen_height;
}, },
_onScreenshotComplete(result, area, filenameUsed, flash, invocation) { _onScreenshotComplete(obj, result, area, filenameUsed, flash, invocation) {
if (result) { if (result) {
if (flash) { if (flash) {
let flashspot = new Flashspot(area); let flashspot = new Flashspot(area);
@ -163,15 +157,9 @@ var ScreenshotService = new Lang.Class({
if (!screenshot) if (!screenshot)
return; return;
screenshot.screenshot_area (x, y, width, height, filename, screenshot.screenshot_area (x, y, width, height, filename,
(o, res) => { (obj, result, area, filenameUsed) => {
try { this._onScreenshotComplete(obj, result, area, filenameUsed,
let [result, area, filenameUsed] =
screenshot.screenshot_area_finish(res);
this._onScreenshotComplete(result, area, filenameUsed,
flash, invocation); flash, invocation);
} catch (e) {
invocation.return_gerror (e);
}
}); });
}, },
@ -181,15 +169,9 @@ var ScreenshotService = new Lang.Class({
if (!screenshot) if (!screenshot)
return; return;
screenshot.screenshot_window (include_frame, include_cursor, filename, screenshot.screenshot_window (include_frame, include_cursor, filename,
(o, res) => { (obj, result, area, filenameUsed) => {
try { this._onScreenshotComplete(obj, result, area, filenameUsed,
let [result, area, filenameUsed] =
screenshot.screenshot_window_finish(res);
this._onScreenshotComplete(result, area, filenameUsed,
flash, invocation); flash, invocation);
} catch (e) {
invocation.return_gerror (e);
}
}); });
}, },
@ -199,15 +181,9 @@ var ScreenshotService = new Lang.Class({
if (!screenshot) if (!screenshot)
return; return;
screenshot.screenshot(include_cursor, filename, screenshot.screenshot(include_cursor, filename,
(o, res) => { (obj, result, area, filenameUsed) => {
try { this._onScreenshotComplete(obj, result, area, filenameUsed,
let [result, area, filenameUsed] =
screenshot.screenshot_finish(res);
this._onScreenshotComplete(result, area, filenameUsed,
flash, invocation); flash, invocation);
} catch (e) {
invocation.return_gerror (e);
}
}); });
}, },
@ -239,34 +215,6 @@ var ScreenshotService = new Lang.Class({
let flashspot = new Flashspot({ x : x, y : y, width: width, height: height}); let flashspot = new Flashspot({ x : x, y : y, width: width, height: height});
flashspot.fire(); flashspot.fire();
invocation.return_value(null); invocation.return_value(null);
},
PickColorAsync(params, invocation) {
let pickPixel = new PickPixel();
pickPixel.show();
pickPixel.connect('finished', (pickPixel, coords) => {
if (coords) {
let screenshot = this._createScreenshot(invocation, false);
if (!screenshot)
return;
screenshot.pick_color(...coords, (o, res) => {
let [success, color] = screenshot.pick_color_finish(res);
let { red, green, blue } = color;
let retval = GLib.Variant.new('(a{sv})', [{
color: GLib.Variant.new('(ddd)', [
red / 255.0,
green / 255.0,
blue / 255.0
])
}]);
this._removeShooterForSender(invocation.get_sender());
invocation.return_value(retval);
});
} else {
invocation.return_error_literal(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED,
"Operation was cancelled");
}
});
} }
}); });
@ -313,7 +261,7 @@ var SelectArea = new Lang.Class({
onUngrab: this._onUngrab.bind(this) })) onUngrab: this._onUngrab.bind(this) }))
return; return;
global.display.set_cursor(Meta.Cursor.CROSSHAIR); global.screen.set_cursor(Meta.Cursor.CROSSHAIR);
Main.uiGroup.set_child_above_sibling(this._group, null); Main.uiGroup.set_child_above_sibling(this._group, null);
this._group.visible = true; this._group.visible = true;
}, },
@ -382,7 +330,7 @@ var SelectArea = new Lang.Class({
}, },
_onUngrab() { _onUngrab() {
global.display.set_cursor(Meta.Cursor.DEFAULT); global.screen.set_cursor(Meta.Cursor.DEFAULT);
this.emit('finished', this._result); this.emit('finished', this._result);
GLib.idle_add(GLib.PRIORITY_DEFAULT, () => { GLib.idle_add(GLib.PRIORITY_DEFAULT, () => {
@ -393,54 +341,6 @@ var SelectArea = new Lang.Class({
}); });
Signals.addSignalMethods(SelectArea.prototype); Signals.addSignalMethods(SelectArea.prototype);
var PickPixel = new Lang.Class({
Name: 'PickPixel',
_init() {
this._result = null;
this._group = new St.Widget({ visible: false,
reactive: true });
Main.uiGroup.add_actor(this._group);
this._grabHelper = new GrabHelper.GrabHelper(this._group);
this._group.connect('button-release-event',
this._onButtonRelease.bind(this));
let constraint = new Clutter.BindConstraint({ source: global.stage,
coordinate: Clutter.BindCoordinate.ALL });
this._group.add_constraint(constraint);
},
show() {
if (!this._grabHelper.grab({ actor: this._group,
onUngrab: this._onUngrab.bind(this) }))
return;
global.display.set_cursor(Meta.Cursor.CROSSHAIR);
Main.uiGroup.set_child_above_sibling(this._group, null);
this._group.visible = true;
},
_onButtonRelease(actor, event) {
this._result = event.get_coords();
this._grabHelper.ungrab();
return Clutter.EVENT_PROPAGATE;
},
_onUngrab() {
global.display.set_cursor(Meta.Cursor.DEFAULT);
this.emit('finished', this._result);
GLib.idle_add(GLib.PRIORITY_DEFAULT, () => {
this._group.destroy();
return GLib.SOURCE_REMOVE;
});
}
});
Signals.addSignalMethods(PickPixel.prototype);
var FLASHSPOT_ANIMATION_OUT_TIME = 0.5; // seconds var FLASHSPOT_ANIMATION_OUT_TIME = 0.5; // seconds
var Flashspot = new Lang.Class({ var Flashspot = new Lang.Class({

View File

@ -216,15 +216,13 @@ function _step(g, finish, onError) {
if (onError) if (onError)
onError(err); onError(err);
}); });
} catch (err) { } catch (err if err instanceof StopIteration) {
if (err instanceof StopIteration) {
if (finish) if (finish)
finish(); finish();
} else { } catch (err) {
if (onError) if (onError)
onError(err); onError(err);
} }
}
} }
function _collect(scriptModule, outputFile) { function _collect(scriptModule, outputFile) {

View File

@ -117,8 +117,6 @@ function _loadMode(file, info) {
let fileContent, success, tag, newMode; let fileContent, success, tag, newMode;
try { try {
[success, fileContent, tag] = file.load_contents(null); [success, fileContent, tag] = file.load_contents(null);
if (fileContent instanceof Uint8Array)
fileContent = imports.byteArray.toString(fileContent);
newMode = JSON.parse(fileContent); newMode = JSON.parse(fileContent);
} catch(e) { } catch(e) {
return; return;

View File

@ -145,20 +145,15 @@ var GnomeShell = new Lang.Class({
for (let param in params) for (let param in params)
params[param] = params[param].deep_unpack(); params[param] = params[param].deep_unpack();
let { monitor: monitorIndex, let monitorIndex = params['monitor'] || -1;
label, let label = params['label'] || undefined;
level, let level = params['level'] || undefined;
max_level: maxLevel,
icon: serializedIcon } = params;
if (monitorIndex === undefined)
monitorIndex = -1;
let icon = null; let icon = null;
if (serializedIcon) if (params['icon'])
icon = Gio.Icon.new_for_string(serializedIcon); icon = Gio.Icon.new_for_string(params['icon']);
Main.osdWindowManager.show(monitorIndex, icon, label, level, maxLevel); Main.osdWindowManager.show(monitorIndex, icon, label, level);
}, },
FocusApp(id) { FocusApp(id) {

View File

@ -7,38 +7,55 @@ const Lang = imports.lang;
const St = imports.gi.St; const St = imports.gi.St;
const Signals = imports.signals; const Signals = imports.signals;
const BarLevel = imports.ui.barLevel;
var SLIDER_SCROLL_STEP = 0.02; /* Slider scrolling step in % */ var SLIDER_SCROLL_STEP = 0.02; /* Slider scrolling step in % */
var Slider = new Lang.Class({ var Slider = new Lang.Class({
Name: "Slider", Name: "Slider",
Extends: BarLevel.BarLevel,
_init(value) { _init(value) {
let params = { if (isNaN(value))
styleClass: 'slider', // Avoid spreading NaNs around
canFocus: true, throw TypeError('The slider value must be a number');
reactive: true, this._value = Math.max(Math.min(value, 1), 0);
accessibleRole: Atk.Role.SLIDER, this._sliderWidth = 0;
}
this.parent(value, params)
this.actor = new St.DrawingArea({ style_class: 'slider',
can_focus: true,
reactive: true,
accessible_role: Atk.Role.SLIDER });
this.actor.connect('repaint', this._sliderRepaint.bind(this));
this.actor.connect('button-press-event', this._startDragging.bind(this)); this.actor.connect('button-press-event', this._startDragging.bind(this));
this.actor.connect('touch-event', this._touchDragging.bind(this)); this.actor.connect('touch-event', this._touchDragging.bind(this));
this.actor.connect('scroll-event', this._onScrollEvent.bind(this)); this.actor.connect('scroll-event', this._onScrollEvent.bind(this));
this.actor.connect('key-press-event', this.onKeyPressEvent.bind(this)); this.actor.connect('key-press-event', this.onKeyPressEvent.bind(this));
this.actor.connect('allocation-changed', (actor, box) => {
this._sliderWidth = box.get_width();
});
this._releaseId = this._motionId = 0; this._releaseId = this._motionId = 0;
this._dragging = false; this._dragging = false;
this._customAccessible = St.GenericAccessible.new_for_actor(this.actor);
this.actor.set_accessible(this._customAccessible);
this._customAccessible.connect('get-current-value', this._getCurrentValue.bind(this));
this._customAccessible.connect('get-minimum-value', this._getMinimumValue.bind(this));
this._customAccessible.connect('get-maximum-value', this._getMaximumValue.bind(this));
this._customAccessible.connect('get-minimum-increment', this._getMinimumIncrement.bind(this)); this._customAccessible.connect('get-minimum-increment', this._getMinimumIncrement.bind(this));
this._customAccessible.connect('set-current-value', this._setCurrentValue.bind(this));
this.connect('value-changed', this._valueChanged.bind(this));
}, },
_barLevelRepaint(area) { setValue(value) {
this.parent(area); if (isNaN(value))
throw TypeError('The slider value must be a number');
// Add handle this._value = Math.max(Math.min(value, 1), 0);
this.actor.queue_repaint();
},
_sliderRepaint(area) {
let cr = area.get_context(); let cr = area.get_context();
let themeNode = area.get_theme_node(); let themeNode = area.get_theme_node();
let [width, height] = area.get_surface_size(); let [width, height] = area.get_surface_size();
@ -49,9 +66,41 @@ var Slider = new Lang.Class({
let [hasHandleColor, handleBorderColor] = let [hasHandleColor, handleBorderColor] =
themeNode.lookup_color('-slider-handle-border-color', false); themeNode.lookup_color('-slider-handle-border-color', false);
let sliderHeight = themeNode.get_length('-slider-height');
let sliderBorderWidth = themeNode.get_length('-slider-border-width');
let sliderBorderRadius = Math.min(width, sliderHeight) / 2;
let sliderBorderColor = themeNode.get_color('-slider-border-color');
let sliderColor = themeNode.get_color('-slider-background-color');
let sliderActiveBorderColor = themeNode.get_color('-slider-active-border-color');
let sliderActiveColor = themeNode.get_color('-slider-active-background-color');
const TAU = Math.PI * 2; const TAU = Math.PI * 2;
let handleX = handleRadius + (width - 2 * handleRadius) * this._value / this._maxValue; let handleX = handleRadius + (width - 2 * handleRadius) * this._value;
cr.arc(sliderBorderRadius + sliderBorderWidth, height / 2, sliderBorderRadius, TAU * 1/4, TAU * 3/4);
cr.lineTo(handleX, (height - sliderHeight) / 2);
cr.lineTo(handleX, (height + sliderHeight) / 2);
cr.lineTo(sliderBorderRadius + sliderBorderWidth, (height + sliderHeight) / 2);
Clutter.cairo_set_source_color(cr, sliderActiveColor);
cr.fillPreserve();
Clutter.cairo_set_source_color(cr, sliderActiveBorderColor);
cr.setLineWidth(sliderBorderWidth);
cr.stroke();
cr.arc(width - sliderBorderRadius - sliderBorderWidth, height / 2, sliderBorderRadius, TAU * 3/4, TAU * 1/4);
cr.lineTo(handleX, (height + sliderHeight) / 2);
cr.lineTo(handleX, (height - sliderHeight) / 2);
cr.lineTo(width - sliderBorderRadius - sliderBorderWidth, (height - sliderHeight) / 2);
Clutter.cairo_set_source_color(cr, sliderColor);
cr.fillPreserve();
Clutter.cairo_set_source_color(cr, sliderBorderColor);
cr.setLineWidth(sliderBorderWidth);
cr.stroke();
let handleY = height / 2; let handleY = height / 2;
let color = themeNode.get_foreground_color(); let color = themeNode.get_foreground_color();
@ -159,7 +208,7 @@ var Slider = new Lang.Class({
delta = -dy * SLIDER_SCROLL_STEP; delta = -dy * SLIDER_SCROLL_STEP;
} }
this._value = Math.min(Math.max(0, this._value + delta), this._maxValue); this._value = Math.min(Math.max(0, this._value + delta), 1);
this.actor.queue_repaint(); this.actor.queue_repaint();
this.emit('value-changed', this._value); this.emit('value-changed', this._value);
@ -181,7 +230,7 @@ var Slider = new Lang.Class({
let key = event.get_key_symbol(); let key = event.get_key_symbol();
if (key == Clutter.KEY_Right || key == Clutter.KEY_Left) { if (key == Clutter.KEY_Right || key == Clutter.KEY_Left) {
let delta = key == Clutter.KEY_Right ? 0.1 : -0.1; let delta = key == Clutter.KEY_Right ? 0.1 : -0.1;
this._value = Math.max(0, Math.min(this._value + delta, this._maxValue)); this._value = Math.max(0, Math.min(this._value + delta, 1));
this.actor.queue_repaint(); this.actor.queue_repaint();
this.emit('drag-begin'); this.emit('drag-begin');
this.emit('value-changed', this._value); this.emit('value-changed', this._value);
@ -197,7 +246,7 @@ var Slider = new Lang.Class({
relX = absX - sliderX; relX = absX - sliderX;
relY = absY - sliderY; relY = absY - sliderY;
let width = this._barLevelWidth; let width = this._sliderWidth;
let handleRadius = this.actor.get_theme_node().get_length('-slider-handle-radius'); let handleRadius = this.actor.get_theme_node().get_length('-slider-handle-radius');
let newvalue; let newvalue;
@ -207,14 +256,38 @@ var Slider = new Lang.Class({
newvalue = 1; newvalue = 1;
else else
newvalue = (relX - handleRadius) / (width - 2 * handleRadius); newvalue = (relX - handleRadius) / (width - 2 * handleRadius);
this._value = newvalue * this._maxValue; this._value = newvalue;
this.actor.queue_repaint(); this.actor.queue_repaint();
this.emit('value-changed', this._value); this.emit('value-changed', this._value);
}, },
_getCurrentValue(actor) {
return this._value;
},
_getMinimumValue(actor) {
return 0;
},
_getMaximumValue(actor) {
return 1;
},
_getMinimumIncrement(actor) { _getMinimumIncrement(actor) {
return 0.1; return 0.1;
}, },
_setCurrentValue(actor, value) {
this._value = value;
},
_valueChanged(slider, value, property) {
this._customAccessible.notify ("accessible-value");
},
get value() {
return this._value;
}
}); });
Signals.addSignalMethods(Slider.prototype); Signals.addSignalMethods(Slider.prototype);

View File

@ -398,7 +398,7 @@ var InputSourceManager = new Lang.Class({
return true; return true;
}, },
_switchInputSource(display, window, binding) { _switchInputSource(display, screen, window, binding) {
if (this._mruSources.length < 2) if (this._mruSources.length < 2)
return; return;

View File

@ -1,81 +0,0 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Lang = imports.lang;
const Meta = imports.gi.Meta;
const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu;
var RemoteAccessApplet = new Lang.Class({
Name: 'RemoteAccessApplet',
Extends: PanelMenu.SystemIndicator,
_init() {
this.parent();
let backend = Meta.get_backend();
let controller = backend.get_remote_access_controller();
if (!controller)
return;
// We can't possibly know about all types of screen sharing on X11, so
// showing these controls on X11 might give a false sense of security.
// Thus, only enable these controls when using Wayland, where we are
// in control of sharing.
if (!Meta.is_wayland_compositor())
return;
this._handles = new Set();
this._indicator = null;
this._menuSection = null;
controller.connect('new-handle', (controller, handle) => {
this._onNewHandle(handle);
});
},
_ensureControls() {
if (this._indicator)
return;
this._indicator = this._addIndicator();
this._indicator.icon_name = 'screen-shared-symbolic';
this._indicator.add_style_class_name('remote-access-indicator');
this._item =
new PopupMenu.PopupSubMenuMenuItem(_("Screen is Being Shared"),
true);
this._item.menu.addAction(_("Turn off"),
() => {
for (let handle of this._handles)
handle.stop();
});
this._item.icon.icon_name = 'screen-shared-symbolic';
this.menu.addMenuItem(this._item);
},
_sync() {
if (this._handles.size == 0) {
this._indicator.visible = false;
this._item.actor.visible = false;
} else {
this._indicator.visible = true;
this._item.actor.visible = true;
}
},
_onStopped(handle) {
this._handles.delete(handle);
this._sync();
},
_onNewHandle(handle) {
this._handles.add(handle);
handle.connect('stopped', this._onStopped.bind(this));
if (this._handles.size == 1) {
this._ensureControls();
this._sync();
}
},
});

View File

@ -261,19 +261,8 @@ var Indicator = new Lang.Class({
item = new PopupMenu.PopupBaseMenuItem({ reactive: false, item = new PopupMenu.PopupBaseMenuItem({ reactive: false,
can_focus: false }); can_focus: false });
let app = this._settingsApp = Shell.AppSystem.get_default().lookup_app( this._settingsAction = this._createActionButton('preferences-system-symbolic', _("Settings"));
'gnome-control-center.desktop' this._settingsAction.connect('clicked', () => { this._onSettingsClicked(); });
);
if (app) {
let [icon, name] = [app.app_info.get_icon().names[0],
app.get_name()];
this._settingsAction = this._createActionButton(icon, name);
this._settingsAction.connect('clicked',
this._onSettingsClicked.bind(this));
} else {
log('Missing required core component Settings, expect trouble…');
this._settingsAction = new St.Widget();
}
item.actor.add(this._settingsAction, { expand: true, x_fill: false }); item.actor.add(this._settingsAction, { expand: true, x_fill: false });
this._orientationLockAction = this._createActionButton('', _("Orientation Lock")); this._orientationLockAction = this._createActionButton('', _("Orientation Lock"));
@ -291,7 +280,7 @@ var Indicator = new Lang.Class({
'icon-name', 'icon-name',
bindFlags); bindFlags);
this._lockScreenAction = this._createActionButton('changes-prevent', _("Lock")); this._lockScreenAction = this._createActionButton('changes-prevent-symbolic', _("Lock"));
this._lockScreenAction.connect('clicked', () => { this._lockScreenAction.connect('clicked', () => {
this.menu.itemActivated(BoxPointer.PopupAnimation.NONE); this.menu.itemActivated(BoxPointer.PopupAnimation.NONE);
this._systemActions.activateLockScreen(); this._systemActions.activateLockScreen();
@ -302,7 +291,7 @@ var Indicator = new Lang.Class({
'visible', 'visible',
bindFlags); bindFlags);
this._suspendAction = this._createActionButton('media-playback-pause', _("Suspend")); this._suspendAction = this._createActionButton('media-playback-pause-symbolic', _("Suspend"));
this._suspendAction.connect('clicked', () => { this._suspendAction.connect('clicked', () => {
this.menu.itemActivated(BoxPointer.PopupAnimation.NONE); this.menu.itemActivated(BoxPointer.PopupAnimation.NONE);
this._systemActions.activateSuspend(); this._systemActions.activateSuspend();
@ -312,7 +301,7 @@ var Indicator = new Lang.Class({
'visible', 'visible',
bindFlags); bindFlags);
this._powerOffAction = this._createActionButton('system-shutdown', _("Power Off")); this._powerOffAction = this._createActionButton('system-shutdown-symbolic', _("Power Off"));
this._powerOffAction.connect('clicked', () => { this._powerOffAction.connect('clicked', () => {
this.menu.itemActivated(BoxPointer.PopupAnimation.NONE); this.menu.itemActivated(BoxPointer.PopupAnimation.NONE);
this._systemActions.activatePowerOff(); this._systemActions.activatePowerOff();
@ -341,7 +330,8 @@ var Indicator = new Lang.Class({
_onSettingsClicked() { _onSettingsClicked() {
this.menu.itemActivated(); this.menu.itemActivated();
let app = Shell.AppSystem.get_default().lookup_app('gnome-control-center.desktop');
Main.overview.hide(); Main.overview.hide();
this._settingsApp.activate(); app.activate();
} }
}); });

View File

@ -12,8 +12,6 @@ const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
const Slider = imports.ui.slider; const Slider = imports.ui.slider;
const ALLOW_AMPLIFIED_VOLUME_KEY = 'allow-volume-above-100-percent';
var VOLUME_NOTIFY_ID = 1; var VOLUME_NOTIFY_ID = 1;
// Each Gvc.MixerControl is a connection to PulseAudio, // Each Gvc.MixerControl is a connection to PulseAudio,
@ -38,11 +36,6 @@ var StreamSlider = new Lang.Class({
this.item = new PopupMenu.PopupBaseMenuItem({ activate: false }); this.item = new PopupMenu.PopupBaseMenuItem({ activate: false });
this._slider = new Slider.Slider(0); this._slider = new Slider.Slider(0);
this._soundSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.sound' });
this._soundSettings.connect('changed::' + ALLOW_AMPLIFIED_VOLUME_KEY, this._amplifySettingsChanged.bind(this));
this._amplifySettingsChanged();
this._slider.connect('value-changed', this._sliderChanged.bind(this)); this._slider.connect('value-changed', this._sliderChanged.bind(this));
this._slider.connect('drag-end', this._notifyVolumeChange.bind(this)); this._slider.connect('drag-end', this._notifyVolumeChange.bind(this));
@ -142,40 +135,21 @@ var StreamSlider = new Lang.Class({
this.emit('stream-updated'); this.emit('stream-updated');
}, },
_amplifySettingsChanged() {
this._allowAmplified = this._soundSettings.get_boolean(ALLOW_AMPLIFIED_VOLUME_KEY);
if (this._allowAmplified)
this._slider.setMaximumValue(this.getMaxLevel() / 100);
else
this._slider.setMaximumValue(1);
if (this._stream)
this._updateVolume();
},
getIcon() { getIcon() {
if (!this._stream) if (!this._stream)
return null; return null;
let icons = ["audio-volume-muted-symbolic",
"audio-volume-low-symbolic",
"audio-volume-medium-symbolic",
"audio-volume-high-symbolic",
"audio-volume-overamplified-symbolic"];
let volume = this._stream.volume; let volume = this._stream.volume;
let n;
if (this._stream.is_muted || volume <= 0) { if (this._stream.is_muted || volume <= 0) {
n = 0; return 'audio-volume-muted-symbolic';
} else { } else {
n = Math.ceil(3 * volume / this._control.get_vol_max_norm()); let n = Math.floor(3 * volume / this._control.get_vol_max_norm()) + 1;
if (n < 1) if (n < 2)
n = 1; return 'audio-volume-low-symbolic';
else if (n > 3) if (n >= 3)
n = 4; return 'audio-volume-high-symbolic';
return 'audio-volume-medium-symbolic';
} }
return icons[n];
}, },
getLevel() { getLevel() {
@ -183,14 +157,6 @@ var StreamSlider = new Lang.Class({
return null; return null;
return 100 * this._stream.volume / this._control.get_vol_max_norm(); return 100 * this._stream.volume / this._control.get_vol_max_norm();
},
getMaxLevel() {
let maxVolume = this._control.get_vol_max_norm();
if (this._allowAmplified)
maxVolume = this._control.get_vol_max_amplified();
return 100 * maxVolume / this._control.get_vol_max_norm();
} }
}); });
Signals.addSignalMethods(StreamSlider.prototype); Signals.addSignalMethods(StreamSlider.prototype);
@ -344,10 +310,6 @@ var VolumeMenu = new Lang.Class({
getLevel() { getLevel() {
return this._output.getLevel(); return this._output.getLevel();
},
getMaxLevel() {
return this._output.getMaxLevel();
} }
}); });
@ -384,9 +346,8 @@ var Indicator = new Lang.Class({
return result; return result;
let gicon = new Gio.ThemedIcon({ name: this._volumeMenu.getIcon() }); let gicon = new Gio.ThemedIcon({ name: this._volumeMenu.getIcon() });
let level = parseInt(this._volumeMenu.getLevel()); let level = this._volumeMenu.getLevel();
let maxLevel = parseInt(this._volumeMenu.getMaxLevel()); Main.osdWindowManager.show(-1, gicon, null, level);
Main.osdWindowManager.show(-1, gicon, null, level, maxLevel);
return result; return result;
} }
}); });

View File

@ -192,9 +192,7 @@ var SwitcherPopup = new Lang.Class({
if (this._keyPressHandler(keysym, action) != Clutter.EVENT_PROPAGATE) if (this._keyPressHandler(keysym, action) != Clutter.EVENT_PROPAGATE)
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
// Note: pressing one of the below keys will destroy the popup only if if (keysym == Clutter.Escape)
// that key is not used by the active popup's keyboard shortcut
if (keysym == Clutter.Escape || keysym == Clutter.Tab)
this.destroy(); this.destroy();
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;

View File

@ -3,7 +3,6 @@
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GObject = imports.gi.GObject;
const Lang = imports.lang; const Lang = imports.lang;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
@ -35,7 +34,6 @@ var WINDOW_ANIMATION_TIME = 0.25;
var DIM_BRIGHTNESS = -0.3; var DIM_BRIGHTNESS = -0.3;
var DIM_TIME = 0.500; var DIM_TIME = 0.500;
var UNDIM_TIME = 0.250; var UNDIM_TIME = 0.250;
var MOTION_THRESHOLD = 100;
var ONE_SECOND = 1000; // in ms var ONE_SECOND = 1000; // in ms
@ -202,25 +200,27 @@ var WorkspaceTracker = new Lang.Class({
let tracker = Shell.WindowTracker.get_default(); let tracker = Shell.WindowTracker.get_default();
tracker.connect('startup-sequence-changed', this._queueCheckWorkspaces.bind(this)); tracker.connect('startup-sequence-changed', this._queueCheckWorkspaces.bind(this));
let workspaceManager = global.workspace_manager; global.screen.connect('notify::n-workspaces', this._nWorkspacesChanged.bind(this));
workspaceManager.connect('notify::n-workspaces', global.window_manager.connect('switch-workspace', this._queueCheckWorkspaces.bind(this));
this._nWorkspacesChanged.bind(this));
global.window_manager.connect('switch-workspace',
this._queueCheckWorkspaces.bind(this));
global.display.connect('window-entered-monitor', global.screen.connect('window-entered-monitor', this._windowEnteredMonitor.bind(this));
this._windowEnteredMonitor.bind(this)); global.screen.connect('window-left-monitor', this._windowLeftMonitor.bind(this));
global.display.connect('window-left-monitor', global.screen.connect('restacked', this._windowsRestacked.bind(this));
this._windowLeftMonitor.bind(this));
global.display.connect('restacked',
this._windowsRestacked.bind(this));
this._workspaceSettings = new Gio.Settings({ schema_id: 'org.gnome.mutter' }); this._workspaceSettings = this._getWorkspaceSettings();
this._workspaceSettings.connect('changed::dynamic-workspaces', this._queueCheckWorkspaces.bind(this)); this._workspaceSettings.connect('changed::dynamic-workspaces', this._queueCheckWorkspaces.bind(this));
this._nWorkspacesChanged(); this._nWorkspacesChanged();
}, },
_getWorkspaceSettings() {
let settings = global.get_overrides_settings();
if (settings &&
settings.settings_schema.list_keys().indexOf('dynamic-workspaces') > -1)
return settings;
return new Gio.Settings({ schema_id: 'org.gnome.mutter' });
},
blockUpdates() { blockUpdates() {
this._pauseWorkspaceCheck = true; this._pauseWorkspaceCheck = true;
}, },
@ -230,7 +230,6 @@ var WorkspaceTracker = new Lang.Class({
}, },
_checkWorkspaces() { _checkWorkspaces() {
let workspaceManager = global.workspace_manager;
let i; let i;
let emptyWorkspaces = []; let emptyWorkspaces = [];
@ -258,7 +257,7 @@ var WorkspaceTracker = new Lang.Class({
let sequences = Shell.WindowTracker.get_default().get_startup_sequences(); let sequences = Shell.WindowTracker.get_default().get_startup_sequences();
for (i = 0; i < sequences.length; i++) { for (i = 0; i < sequences.length; i++) {
let index = sequences[i].get_workspace(); let index = sequences[i].get_workspace();
if (index >= 0 && index <= workspaceManager.n_workspaces) if (index >= 0 && index <= global.screen.n_workspaces)
emptyWorkspaces[index] = false; emptyWorkspaces[index] = false;
} }
@ -276,17 +275,17 @@ var WorkspaceTracker = new Lang.Class({
// If we don't have an empty workspace at the end, add one // If we don't have an empty workspace at the end, add one
if (!emptyWorkspaces[emptyWorkspaces.length -1]) { if (!emptyWorkspaces[emptyWorkspaces.length -1]) {
workspaceManager.append_new_workspace(false, global.get_current_time()); global.screen.append_new_workspace(false, global.get_current_time());
emptyWorkspaces.push(false); emptyWorkspaces.push(false);
} }
let activeWorkspaceIndex = workspaceManager.get_active_workspace_index(); let activeWorkspaceIndex = global.screen.get_active_workspace_index();
emptyWorkspaces[activeWorkspaceIndex] = false; emptyWorkspaces[activeWorkspaceIndex] = false;
// Delete other empty workspaces; do it from the end to avoid index changes // Delete other empty workspaces; do it from the end to avoid index changes
for (i = emptyWorkspaces.length - 2; i >= 0; i--) { for (i = emptyWorkspaces.length - 2; i >= 0; i--) {
if (emptyWorkspaces[i]) if (emptyWorkspaces[i])
workspaceManager.remove_workspace(this._workspaces[i], global.get_current_time()); global.screen.remove_workspace(this._workspaces[i], global.get_current_time());
} }
this._checkWorkspacesId = 0; this._checkWorkspacesId = 0;
@ -318,14 +317,14 @@ var WorkspaceTracker = new Lang.Class({
GLib.Source.set_name_by_id(id, '[gnome-shell] this._queueCheckWorkspaces'); GLib.Source.set_name_by_id(id, '[gnome-shell] this._queueCheckWorkspaces');
}, },
_windowLeftMonitor(metaDisplay, monitorIndex, metaWin) { _windowLeftMonitor(metaScreen, monitorIndex, metaWin) {
// If the window left the primary monitor, that // If the window left the primary monitor, that
// might make that workspace empty // might make that workspace empty
if (monitorIndex == Main.layoutManager.primaryIndex) if (monitorIndex == Main.layoutManager.primaryIndex)
this._queueCheckWorkspaces(); this._queueCheckWorkspaces();
}, },
_windowEnteredMonitor(metaDisplay, monitorIndex, metaWin) { _windowEnteredMonitor(metaScreen, monitorIndex, metaWin) {
// If the window entered the primary monitor, that // If the window entered the primary monitor, that
// might make that workspace non-empty // might make that workspace non-empty
if (monitorIndex == Main.layoutManager.primaryIndex) if (monitorIndex == Main.layoutManager.primaryIndex)
@ -345,9 +344,8 @@ var WorkspaceTracker = new Lang.Class({
}, },
_nWorkspacesChanged() { _nWorkspacesChanged() {
let workspaceManager = global.workspace_manager;
let oldNumWorkspaces = this._workspaces.length; let oldNumWorkspaces = this._workspaces.length;
let newNumWorkspaces = workspaceManager.n_workspaces; let newNumWorkspaces = global.screen.n_workspaces;
if (oldNumWorkspaces == newNumWorkspaces) if (oldNumWorkspaces == newNumWorkspaces)
return false; return false;
@ -358,7 +356,7 @@ var WorkspaceTracker = new Lang.Class({
// Assume workspaces are only added at the end // Assume workspaces are only added at the end
for (w = oldNumWorkspaces; w < newNumWorkspaces; w++) for (w = oldNumWorkspaces; w < newNumWorkspaces; w++)
this._workspaces[w] = workspaceManager.get_workspace_by_index(w); this._workspaces[w] = global.screen.get_workspace_by_index(w);
for (w = oldNumWorkspaces; w < newNumWorkspaces; w++) { for (w = oldNumWorkspaces; w < newNumWorkspaces; w++) {
let workspace = this._workspaces[w]; let workspace = this._workspaces[w];
@ -372,7 +370,7 @@ var WorkspaceTracker = new Lang.Class({
let removedIndex; let removedIndex;
let removedNum = oldNumWorkspaces - newNumWorkspaces; let removedNum = oldNumWorkspaces - newNumWorkspaces;
for (let w = 0; w < oldNumWorkspaces; w++) { for (let w = 0; w < oldNumWorkspaces; w++) {
let workspace = workspaceManager.get_workspace_by_index(w); let workspace = global.screen.get_workspace_by_index(w);
if (this._workspaces[w] != workspace) { if (this._workspaces[w] != workspace) {
removedIndex = w; removedIndex = w;
break; break;
@ -489,8 +487,13 @@ var TouchpadWorkspaceSwitchAction = new Lang.Class({
}, },
_checkActivated() { _checkActivated() {
const MOTION_THRESHOLD = 50;
let allowedModes = Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW;
let dir; let dir;
if ((allowedModes & Main.actionMode) == 0)
return;
if (this._dy < -MOTION_THRESHOLD) if (this._dy < -MOTION_THRESHOLD)
dir = Meta.MotionDirection.DOWN; dir = Meta.MotionDirection.DOWN;
else if (this._dy > MOTION_THRESHOLD) else if (this._dy > MOTION_THRESHOLD)
@ -500,35 +503,26 @@ var TouchpadWorkspaceSwitchAction = new Lang.Class({
else if (this._dx > MOTION_THRESHOLD) else if (this._dx > MOTION_THRESHOLD)
dir = Meta.MotionDirection.LEFT; dir = Meta.MotionDirection.LEFT;
else else
return false; return;
this.emit('activated', dir); this.emit('activated', dir);
return true;
}, },
_handleEvent(actor, event) { _handleEvent(actor, event) {
let allowedModes = Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW;
if (event.type() != Clutter.EventType.TOUCHPAD_SWIPE) if (event.type() != Clutter.EventType.TOUCHPAD_SWIPE)
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
if (event.get_touchpad_gesture_finger_count() != 4) if (event.get_touchpad_gesture_finger_count() != 4)
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
if ((allowedModes & Main.actionMode) == 0)
return Clutter.EVENT_PROPAGATE;
if (event.get_gesture_phase() == Clutter.TouchpadGesturePhase.UPDATE) { if (event.get_gesture_phase() == Clutter.TouchpadGesturePhase.UPDATE) {
let [dx, dy] = event.get_gesture_motion_delta(); let [dx, dy] = event.get_gesture_motion_delta();
// Scale deltas up a bit to make it feel snappier this._dx += dx;
this._dx += dx * 2; this._dy += dy;
this._dy += dy * 2;
this.emit('motion', this._dx, this._dy);
} else { } else {
if ((event.get_gesture_phase() == Clutter.TouchpadGesturePhase.END && ! this._checkActivated()) || if (event.get_gesture_phase() == Clutter.TouchpadGesturePhase.END)
event.get_gesture_phase() == Clutter.TouchpadGesturePhase.CANCEL) this._checkActivated();
this.emit('cancel');
this._dx = 0; this._dx = 0;
this._dy = 0; this._dy = 0;
@ -542,14 +536,14 @@ Signals.addSignalMethods(TouchpadWorkspaceSwitchAction.prototype);
var WorkspaceSwitchAction = new Lang.Class({ var WorkspaceSwitchAction = new Lang.Class({
Name: 'WorkspaceSwitchAction', Name: 'WorkspaceSwitchAction',
Extends: Clutter.SwipeAction, Extends: Clutter.SwipeAction,
Signals: { 'activated': { param_types: [Meta.MotionDirection.$gtype] }, Signals: { 'activated': { param_types: [Meta.MotionDirection.$gtype] } },
'motion': { param_types: [GObject.TYPE_DOUBLE, GObject.TYPE_DOUBLE] },
'cancel': { param_types: [] }},
_init() { _init() {
const MOTION_THRESHOLD = 50;
this.parent(); this.parent();
this.set_n_touch_points(4); this.set_n_touch_points(4);
this._swept = false; this.set_threshold_trigger_distance(MOTION_THRESHOLD, MOTION_THRESHOLD);
global.display.connect('grab-op-begin', () => { global.display.connect('grab-op-begin', () => {
this.cancel(); this.cancel();
@ -559,35 +553,13 @@ var WorkspaceSwitchAction = new Lang.Class({
vfunc_gesture_prepare(actor) { vfunc_gesture_prepare(actor) {
let allowedModes = Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW; let allowedModes = Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW;
this._swept = false;
if (!this.parent(actor)) if (!this.parent(actor))
return false; return false;
return (allowedModes & Main.actionMode); return (allowedModes & Main.actionMode);
}, },
vfunc_gesture_progress(actor) { vfunc_swept(actor, direction) {
let [x, y] = this.get_motion_coords(0);
let [xPress, yPress] = this.get_press_coords(0);
this.emit('motion', x - xPress, y - yPress);
return true;
},
vfunc_gesture_cancel(actor) {
if (!this._swept)
this.emit('cancel');
},
vfunc_swipe(actor, direction) {
let [x, y] = this.get_motion_coords(0);
let [xPress, yPress] = this.get_press_coords(0);
if (Math.abs(x - xPress) < MOTION_THRESHOLD &&
Math.abs(y - yPress) < MOTION_THRESHOLD) {
this.emit('cancel');
return;
}
let dir; let dir;
if (direction & Clutter.SwipeDirection.UP) if (direction & Clutter.SwipeDirection.UP)
@ -599,7 +571,6 @@ var WorkspaceSwitchAction = new Lang.Class({
else if (direction & Clutter.SwipeDirection.RIGHT) else if (direction & Clutter.SwipeDirection.RIGHT)
dir = Meta.MotionDirection.LEFT; dir = Meta.MotionDirection.LEFT;
this._swept = true;
this.emit('activated', dir); this.emit('activated', dir);
} }
}); });
@ -656,8 +627,8 @@ var AppSwitchAction = new Lang.Class({
if (this.get_n_current_points() == 3) { if (this.get_n_current_points() == 3) {
for (let i = 0; i < this.get_n_current_points(); i++) { for (let i = 0; i < this.get_n_current_points(); i++) {
let [startX, startY] = this.get_press_coords(i); [startX, startY] = this.get_press_coords(i);
let [x, y] = this.get_motion_coords(i); [x, y] = this.get_motion_coords(i);
if (Math.abs(x - startX) > MOTION_THRESHOLD || if (Math.abs(x - startX) > MOTION_THRESHOLD ||
Math.abs(y - startY) > MOTION_THRESHOLD) Math.abs(y - startY) > MOTION_THRESHOLD)
@ -721,14 +692,7 @@ var WindowManager = new Lang.Class({
this._isWorkspacePrepended = false; this._isWorkspacePrepended = false;
this._switchData = null; this._switchData = null;
this._shellwm.connect('kill-switch-workspace', (shellwm) => { this._shellwm.connect('kill-switch-workspace', this._switchWorkspaceDone.bind(this));
if (this._switchData) {
if (this._switchData.inProgress)
this._switchWorkspaceDone(shellwm);
else if (!this._switchData.gestureActivated)
this._finishWorkspaceSwitch(this._switchData);
}
});
this._shellwm.connect('kill-window-effects', (shellwm, actor) => { this._shellwm.connect('kill-window-effects', (shellwm, actor) => {
this._minimizeWindowDone(shellwm, actor); this._minimizeWindowDone(shellwm, actor);
this._mapWindowDone(shellwm, actor); this._mapWindowDone(shellwm, actor);
@ -750,7 +714,7 @@ var WindowManager = new Lang.Class({
this._shellwm.connect('confirm-display-change', this._confirmDisplayChange.bind(this)); this._shellwm.connect('confirm-display-change', this._confirmDisplayChange.bind(this));
this._shellwm.connect('create-close-dialog', this._createCloseDialog.bind(this)); this._shellwm.connect('create-close-dialog', this._createCloseDialog.bind(this));
this._shellwm.connect('create-inhibit-shortcuts-dialog', this._createInhibitShortcutsDialog.bind(this)); this._shellwm.connect('create-inhibit-shortcuts-dialog', this._createInhibitShortcutsDialog.bind(this));
global.display.connect('restacked', this._syncStacking.bind(this)); global.screen.connect('restacked', this._syncStacking.bind(this));
this._workspaceSwitcherPopup = null; this._workspaceSwitcherPopup = null;
this._tilePreview = null; this._tilePreview = null;
@ -1006,20 +970,16 @@ var WindowManager = new Lang.Class({
if (Main.sessionMode.hasWorkspaces) if (Main.sessionMode.hasWorkspaces)
this._workspaceTracker = new WorkspaceTracker(this); this._workspaceTracker = new WorkspaceTracker(this);
global.workspace_manager.override_workspace_layout(Meta.DisplayCorner.TOPLEFT, global.screen.override_workspace_layout(Meta.ScreenCorner.TOPLEFT,
false, -1, 1); false, -1, 1);
let gesture = new WorkspaceSwitchAction(); let gesture = new WorkspaceSwitchAction();
gesture.connect('motion', this._switchWorkspaceMotion.bind(this));
gesture.connect('activated', this._actionSwitchWorkspace.bind(this)); gesture.connect('activated', this._actionSwitchWorkspace.bind(this));
gesture.connect('cancel', this._switchWorkspaceCancel.bind(this));
global.stage.add_action(gesture); global.stage.add_action(gesture);
// This is not a normal Clutter.GestureAction, doesn't need add_action() // This is not a normal Clutter.GestureAction, doesn't need add_action()
gesture = new TouchpadWorkspaceSwitchAction(global.stage); gesture = new TouchpadWorkspaceSwitchAction(global.stage);
gesture.connect('motion', this._switchWorkspaceMotion.bind(this));
gesture.connect('activated', this._actionSwitchWorkspace.bind(this)); gesture.connect('activated', this._actionSwitchWorkspace.bind(this));
gesture.connect('cancel', this._switchWorkspaceCancel.bind(this));
gesture = new AppSwitchAction(); gesture = new AppSwitchAction();
gesture.connect('activated', this._switchApp.bind(this)); gesture.connect('activated', this._switchApp.bind(this));
@ -1031,14 +991,6 @@ var WindowManager = new Lang.Class({
Main.keyboard.show(Main.layoutManager.bottomIndex); Main.keyboard.show(Main.layoutManager.bottomIndex);
}); });
global.stage.add_action(gesture); global.stage.add_action(gesture);
gesture = new EdgeDragAction.EdgeDragAction(St.Side.TOP, mode);
gesture.connect('activated', () => {
let currentWindow = global.display.focus_window;
if (currentWindow)
currentWindow.unmake_fullscreen();
});
global.stage.add_action(gesture);
}, },
_showPadOsd(display, device, settings, imagePath, editionMode, monitorIndex) { _showPadOsd(display, device, settings, imagePath, editionMode, monitorIndex) {
@ -1048,52 +1000,9 @@ var WindowManager = new Lang.Class({
return this._currentPadOsd.actor; return this._currentPadOsd.actor;
}, },
_switchWorkspaceMotion(action, xRel, yRel) {
let workspaceManager = global.workspace_manager;
let activeWorkspace = workspaceManager.get_active_workspace();
if (!this._switchData)
this._prepareWorkspaceSwitch(activeWorkspace.index(), -1);
if (yRel < 0 && !this._switchData.surroundings[Meta.MotionDirection.DOWN])
yRel = 0;
if (yRel > 0 && !this._switchData.surroundings[Meta.MotionDirection.UP])
yRel = 0;
if (xRel < 0 && !this._switchData.surroundings[Meta.MotionDirection.RIGHT])
xRel = 0;
if (xRel > 0 && !this._switchData.surroundings[Meta.MotionDirection.LEFT])
xRel = 0;
this._switchData.container.set_position(xRel, yRel);
},
_switchWorkspaceCancel() {
if (!this._switchData || this._switchData.inProgress)
return;
let switchData = this._switchData;
this._switchData = null;
Tweener.addTween(switchData.container,
{ x: 0,
y: 0,
time: WINDOW_ANIMATION_TIME,
transition: 'easeOutQuad',
onComplete: this._finishWorkspaceSwitch,
onCompleteScope: this,
onCompleteParams: [switchData],
});
},
_actionSwitchWorkspace(action, direction) { _actionSwitchWorkspace(action, direction) {
let workspaceManager = global.workspace_manager; let newWs = global.screen.get_active_workspace().get_neighbor(direction);
let activeWorkspace = workspaceManager.get_active_workspace();
let newWs = activeWorkspace.get_neighbor(direction);
if (newWs == activeWorkspace) {
this._switchWorkspaceCancel();
} else {
this._switchData.gestureActivated = true;
this.actionMoveWorkspace(newWs); this.actionMoveWorkspace(newWs);
}
}, },
_lookupIndex(windows, metaWindow) { _lookupIndex(windows, metaWindow) {
@ -1108,10 +1017,8 @@ var WindowManager = new Lang.Class({
_switchApp() { _switchApp() {
let windows = global.get_window_actors().filter(actor => { let windows = global.get_window_actors().filter(actor => {
let win = actor.metaWindow; let win = actor.metaWindow;
let workspaceManager = global.workspace_manager;
let activeWorkspace = workspaceManager.get_active_workspace();
return (!win.is_override_redirect() && return (!win.is_override_redirect() &&
win.located_on_workspace(activeWorkspace)); win.located_on_workspace(global.screen.get_active_workspace()));
}); });
if (windows.length == 0) if (windows.length == 0)
@ -1135,12 +1042,10 @@ var WindowManager = new Lang.Class({
}, },
insertWorkspace(pos) { insertWorkspace(pos) {
let workspaceManager = global.workspace_manager;
if (!Meta.prefs_get_dynamic_workspaces()) if (!Meta.prefs_get_dynamic_workspaces())
return; return;
workspaceManager.append_new_workspace(false, global.get_current_time()); global.screen.append_new_workspace(false, global.get_current_time());
let windows = global.get_window_actors().map(a => a.meta_window); let windows = global.get_window_actors().map(a => a.meta_window);
@ -1164,9 +1069,9 @@ var WindowManager = new Lang.Class({
// If the new workspace was inserted before the active workspace, // If the new workspace was inserted before the active workspace,
// activate the workspace to which its windows went // activate the workspace to which its windows went
let activeIndex = workspaceManager.get_active_workspace_index(); let activeIndex = global.screen.get_active_workspace_index();
if (activeIndex >= pos) { if (activeIndex >= pos) {
let newWs = workspaceManager.get_workspace_by_index(activeIndex + 1); let newWs = global.screen.get_workspace_by_index(activeIndex + 1);
this._blockAnimations = true; this._blockAnimations = true;
newWs.activate(global.get_current_time()); newWs.activate(global.get_current_time());
this._blockAnimations = false; this._blockAnimations = false;
@ -1268,10 +1173,6 @@ var WindowManager = new Lang.Class({
yScale = geom.height / actor.height; yScale = geom.height / actor.height;
} else { } else {
let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()]; let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()];
if (!monitor) {
this._minimizeWindowDone();
return;
}
xDest = monitor.x; xDest = monitor.x;
yDest = monitor.y; yDest = monitor.y;
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL)
@ -1347,11 +1248,6 @@ var WindowManager = new Lang.Class({
geom.height / actor.height); geom.height / actor.height);
} else { } else {
let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()]; let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()];
if (!monitor) {
actor.show();
this._unminimizeWindowDone();
return;
}
actor.set_position(monitor.x, monitor.y); actor.set_position(monitor.x, monitor.y);
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL)
actor.x += monitor.width; actor.x += monitor.width;
@ -1773,104 +1669,63 @@ var WindowManager = new Lang.Class({
if (this._switchData == null) if (this._switchData == null)
return; return;
// Update stacking of windows in inGroup (aka the workspace we are
// switching to). Windows in outGroup are about to be hidden anyway,
// so we just ignore them here.
let windows = global.get_window_actors(); let windows = global.get_window_actors();
let lastCurSibling = null; let sibling = null;
let lastDirSibling = [];
for (let i = 0; i < windows.length; i++) { for (let i = 0; i < windows.length; i++) {
if (windows[i].get_parent() == this._switchData.curGroup) { if (windows[i].get_parent() != this._switchData.inGroup)
this._switchData.curGroup.set_child_above_sibling(windows[i], lastCurSibling);
lastCurSibling = windows[i];
} else {
for (let dir of Object.values(Meta.MotionDirection)) {
let info = this._switchData.surroundings[dir];
if (!info || windows[i].get_parent() != info.actor)
continue; continue;
let sibling = lastDirSibling[dir]; this._switchData.inGroup.set_child_above_sibling(windows[i], sibling);
if (sibling == undefined) sibling = windows[i];
sibling = null;
info.actor.set_child_above_sibling(windows[i], sibling);
lastDirSibling[dir] = windows[i];
break;
}
}
} }
}, },
_getPositionForDirection(direction) { _switchWorkspace(shellwm, from, to, direction) {
if (!Main.sessionMode.hasWorkspaces || !this._shouldAnimate()) {
shellwm.completed_switch_workspace();
return;
}
let windows = global.get_window_actors();
/* @direction is the direction that the "camera" moves, so the
* screen contents have to move one screen's worth in the
* opposite direction.
*/
let xDest = 0, yDest = 0; let xDest = 0, yDest = 0;
if (direction == Meta.MotionDirection.UP || if (direction == Meta.MotionDirection.UP ||
direction == Meta.MotionDirection.UP_LEFT || direction == Meta.MotionDirection.UP_LEFT ||
direction == Meta.MotionDirection.UP_RIGHT) direction == Meta.MotionDirection.UP_RIGHT)
yDest = -global.screen_height + Main.panel.actor.height; yDest = global.screen_height - Main.panel.actor.height;
else if (direction == Meta.MotionDirection.DOWN || else if (direction == Meta.MotionDirection.DOWN ||
direction == Meta.MotionDirection.DOWN_LEFT || direction == Meta.MotionDirection.DOWN_LEFT ||
direction == Meta.MotionDirection.DOWN_RIGHT) direction == Meta.MotionDirection.DOWN_RIGHT)
yDest = global.screen_height - Main.panel.actor.height; yDest = -global.screen_height + Main.panel.actor.height;
if (direction == Meta.MotionDirection.LEFT || if (direction == Meta.MotionDirection.LEFT ||
direction == Meta.MotionDirection.UP_LEFT || direction == Meta.MotionDirection.UP_LEFT ||
direction == Meta.MotionDirection.DOWN_LEFT) direction == Meta.MotionDirection.DOWN_LEFT)
xDest = -global.screen_width; xDest = global.screen_width;
else if (direction == Meta.MotionDirection.RIGHT || else if (direction == Meta.MotionDirection.RIGHT ||
direction == Meta.MotionDirection.UP_RIGHT || direction == Meta.MotionDirection.UP_RIGHT ||
direction == Meta.MotionDirection.DOWN_RIGHT) direction == Meta.MotionDirection.DOWN_RIGHT)
xDest = global.screen_width; xDest = -global.screen_width;
return [xDest, yDest];
},
_prepareWorkspaceSwitch(from, to, direction) {
if (this._switchData)
return;
let wgroup = global.window_group;
let windows = global.get_window_actors();
let switchData = {}; let switchData = {};
this._switchData = switchData; this._switchData = switchData;
switchData.curGroup = new Clutter.Actor(); switchData.inGroup = new Clutter.Actor();
switchData.outGroup = new Clutter.Actor();
switchData.movingWindowBin = new Clutter.Actor(); switchData.movingWindowBin = new Clutter.Actor();
switchData.windows = []; switchData.windows = [];
switchData.surroundings = {};
switchData.gestureActivated = false;
switchData.inProgress = false;
switchData.container = new Clutter.Actor();
switchData.container.add_actor(switchData.curGroup);
let wgroup = global.window_group;
wgroup.add_actor(switchData.inGroup);
wgroup.add_actor(switchData.outGroup);
wgroup.add_actor(switchData.movingWindowBin); wgroup.add_actor(switchData.movingWindowBin);
wgroup.add_actor(switchData.container);
let workspaceManager = global.workspace_manager;
let curWs = workspaceManager.get_workspace_by_index (from);
for (let dir of Object.values(Meta.MotionDirection)) {
let ws = null;
if (to < 0)
ws = curWs.get_neighbor(dir);
else if (dir == direction)
ws = workspaceManager.get_workspace_by_index(to);
if (ws == null || ws == curWs) {
switchData.surroundings[dir] = null;
continue;
}
let info = { index: ws.index(),
actor: new Clutter.Actor() };
switchData.surroundings[dir] = info;
switchData.container.add_actor(info.actor);
info.actor.raise_top();
let [x, y] = this._getPositionForDirection(dir);
info.actor.set_position(x, y);
}
switchData.movingWindowBin.raise_top();
for (let i = 0; i < windows.length; i++) { for (let i = 0; i < windows.length; i++) {
let actor = windows[i]; let actor = windows[i];
@ -1891,70 +1746,20 @@ var WindowManager = new Lang.Class({
actor.reparent(switchData.movingWindowBin); actor.reparent(switchData.movingWindowBin);
} else if (window.get_workspace().index() == from) { } else if (window.get_workspace().index() == from) {
switchData.windows.push(record); switchData.windows.push(record);
actor.reparent(switchData.curGroup); actor.reparent(switchData.outGroup);
} else { } else if (window.get_workspace().index() == to) {
let visible = false;
for (let dir of Object.values(Meta.MotionDirection)) {
let info = switchData.surroundings[dir];
if (!info || info.index != window.get_workspace().index())
continue;
switchData.windows.push(record); switchData.windows.push(record);
actor.reparent(info.actor); actor.reparent(switchData.inGroup);
visible = true; actor.show();
break;
}
actor.visible = visible;
} }
} }
},
_finishWorkspaceSwitch(switchData) { switchData.inGroup.set_position(-xDest, -yDest);
this._switchData = null; switchData.inGroup.raise_top();
for (let i = 0; i < switchData.windows.length; i++) { switchData.movingWindowBin.raise_top();
let w = switchData.windows[i];
if (w.window.is_destroyed()) // Window gone
continue;
w.window.reparent(w.parent); Tweener.addTween(switchData.outGroup,
if (w.window.get_meta_window().get_workspace() !=
global.workspace_manager.get_active_workspace())
w.window.hide();
}
Tweener.removeTweens(switchData.container);
switchData.container.destroy();
switchData.movingWindowBin.destroy();
this._movingWindow = null;
},
_switchWorkspace(shellwm, from, to, direction) {
if (!Main.sessionMode.hasWorkspaces || !this._shouldAnimate()) {
shellwm.completed_switch_workspace();
return;
}
// If we come from a gesture, switchData will already be set,
// and we don't want to overwrite it.
if (!this._switchData)
this._prepareWorkspaceSwitch(from, to, direction);
this._switchData.inProgress = true;
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
* opposite direction.
*/
xDest = -xDest;
yDest = -yDest;
Tweener.addTween(this._switchData.container,
{ x: xDest, { x: xDest,
y: yDest, y: yDest,
time: WINDOW_ANIMATION_TIME, time: WINDOW_ANIMATION_TIME,
@ -1963,10 +1768,39 @@ var WindowManager = new Lang.Class({
onCompleteScope: this, onCompleteScope: this,
onCompleteParams: [shellwm] onCompleteParams: [shellwm]
}); });
Tweener.addTween(switchData.inGroup,
{ x: 0,
y: 0,
time: WINDOW_ANIMATION_TIME,
transition: 'easeOutQuad'
});
}, },
_switchWorkspaceDone(shellwm) { _switchWorkspaceDone(shellwm) {
this._finishWorkspaceSwitch(this._switchData); let switchData = this._switchData;
if (!switchData)
return;
this._switchData = null;
for (let i = 0; i < switchData.windows.length; i++) {
let w = switchData.windows[i];
if (w.window.is_destroyed()) // Window gone
continue;
if (w.window.get_parent() == switchData.outGroup) {
w.window.reparent(w.parent);
w.window.hide();
} else
w.window.reparent(w.parent);
}
Tweener.removeTweens(switchData.inGroup);
Tweener.removeTweens(switchData.outGroup);
switchData.inGroup.destroy();
switchData.outGroup.destroy();
switchData.movingWindowBin.destroy();
if (this._movingWindow)
this._movingWindow = null;
shellwm.completed_switch_workspace(); shellwm.completed_switch_workspace();
}, },
@ -1986,7 +1820,7 @@ var WindowManager = new Lang.Class({
this._windowMenuManager.showWindowMenuForWindow(window, menu, rect); this._windowMenuManager.showWindowMenuForWindow(window, menu, rect);
}, },
_startSwitcher(display, window, binding) { _startSwitcher(display, screen, window, binding) {
let constructor = null; let constructor = null;
switch (binding.get_name()) { switch (binding.get_name()) {
case 'switch-applications': case 'switch-applications':
@ -2025,15 +1859,15 @@ var WindowManager = new Lang.Class({
tabPopup.destroy(); tabPopup.destroy();
}, },
_startA11ySwitcher(display, window, binding) { _startA11ySwitcher(display, screen, window, binding) {
Main.ctrlAltTabManager.popup(binding.is_reversed(), binding.get_name(), binding.get_mask()); Main.ctrlAltTabManager.popup(binding.is_reversed(), binding.get_name(), binding.get_mask());
}, },
_toggleAppMenu(display, window, event, binding) { _toggleAppMenu(display, screen, window, event, binding) {
Main.panel.toggleAppMenu(); Main.panel.toggleAppMenu();
}, },
_toggleCalendar(display, window, event, binding) { _toggleCalendar(display, screen, window, event, binding) {
Main.panel.toggleCalendar(); Main.panel.toggleCalendar();
}, },
@ -2046,13 +1880,11 @@ var WindowManager = new Lang.Class({
OrigTweener.resumeAllTweens(); OrigTweener.resumeAllTweens();
}, },
_showWorkspaceSwitcher(display, window, binding) { _showWorkspaceSwitcher(display, screen, window, binding) {
let workspaceManager = display.get_workspace_manager();
if (!Main.sessionMode.hasWorkspaces) if (!Main.sessionMode.hasWorkspaces)
return; return;
if (workspaceManager.n_workspaces == 1) if (screen.n_workspaces == 1)
return; return;
let [action,,,target] = binding.get_name().split('-'); let [action,,,target] = binding.get_name().split('-');
@ -2071,22 +1903,22 @@ var WindowManager = new Lang.Class({
if (target == 'last') { if (target == 'last') {
direction = Meta.MotionDirection.DOWN; direction = Meta.MotionDirection.DOWN;
newWs = workspaceManager.get_workspace_by_index(workspaceManager.n_workspaces - 1); newWs = screen.get_workspace_by_index(screen.n_workspaces - 1);
} else if (isNaN(target)) { } else if (isNaN(target)) {
// Prepend a new workspace dynamically // Prepend a new workspace dynamically
if (workspaceManager.get_active_workspace_index() == 0 && if (screen.get_active_workspace_index() == 0 &&
action == 'move' && target == 'up' && this._isWorkspacePrepended == false) { action == 'move' && target == 'up' && this._isWorkspacePrepended == false) {
this.insertWorkspace(0); this.insertWorkspace(0);
this._isWorkspacePrepended = true; this._isWorkspacePrepended = true;
} }
direction = Meta.MotionDirection[target.toUpperCase()]; direction = Meta.MotionDirection[target.toUpperCase()];
newWs = workspaceManager.get_active_workspace().get_neighbor(direction); newWs = screen.get_active_workspace().get_neighbor(direction);
} else if (target > 0) { } else if (target > 0) {
target--; target--;
newWs = workspaceManager.get_workspace_by_index(target); newWs = screen.get_workspace_by_index(target);
if (workspaceManager.get_active_workspace().index() > target) if (screen.get_active_workspace().index() > target)
direction = Meta.MotionDirection.UP; direction = Meta.MotionDirection.UP;
else else
direction = Meta.MotionDirection.DOWN; direction = Meta.MotionDirection.DOWN;
@ -2119,8 +1951,7 @@ var WindowManager = new Lang.Class({
if (!Main.sessionMode.hasWorkspaces) if (!Main.sessionMode.hasWorkspaces)
return; return;
let workspaceManager = global.workspace_manager; let activeWorkspace = global.screen.get_active_workspace();
let activeWorkspace = workspaceManager.get_active_workspace();
if (activeWorkspace != workspace) if (activeWorkspace != workspace)
workspace.activate(global.get_current_time()); workspace.activate(global.get_current_time());
@ -2130,8 +1961,7 @@ var WindowManager = new Lang.Class({
if (!Main.sessionMode.hasWorkspaces) if (!Main.sessionMode.hasWorkspaces)
return; return;
let workspaceManager = global.workspace_manager; let activeWorkspace = global.screen.get_active_workspace();
let activeWorkspace = workspaceManager.get_active_workspace();
if (activeWorkspace != workspace) { if (activeWorkspace != workspace) {
// This won't have any effect for "always sticky" windows // This won't have any effect for "always sticky" windows

View File

@ -126,15 +126,16 @@ var WindowMenu = new Lang.Class({
} }
} }
let display = global.display; let screen = global.screen;
let nMonitors = display.get_n_monitors(); let nMonitors = screen.get_n_monitors();
let monitorIndex = window.get_monitor(); if (nMonitors > 1) {
if (nMonitors > 1 && monitorIndex >= 0) {
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
let monitorIndex = window.get_monitor();
let dir = Meta.ScreenDirection.UP; let dir = Meta.ScreenDirection.UP;
let upMonitorIndex = let upMonitorIndex =
display.get_monitor_neighbor_index(monitorIndex, dir); screen.get_monitor_neighbor_index(monitorIndex, dir);
if (upMonitorIndex != -1) { if (upMonitorIndex != -1) {
this.addAction(_("Move to Monitor Up"), () => { this.addAction(_("Move to Monitor Up"), () => {
window.move_to_monitor(upMonitorIndex); window.move_to_monitor(upMonitorIndex);
@ -143,7 +144,7 @@ var WindowMenu = new Lang.Class({
dir = Meta.ScreenDirection.DOWN; dir = Meta.ScreenDirection.DOWN;
let downMonitorIndex = let downMonitorIndex =
display.get_monitor_neighbor_index(monitorIndex, dir); screen.get_monitor_neighbor_index(monitorIndex, dir);
if (downMonitorIndex != -1) { if (downMonitorIndex != -1) {
this.addAction(_("Move to Monitor Down"), () => { this.addAction(_("Move to Monitor Down"), () => {
window.move_to_monitor(downMonitorIndex); window.move_to_monitor(downMonitorIndex);
@ -152,7 +153,7 @@ var WindowMenu = new Lang.Class({
dir = Meta.ScreenDirection.LEFT; dir = Meta.ScreenDirection.LEFT;
let leftMonitorIndex = let leftMonitorIndex =
display.get_monitor_neighbor_index(monitorIndex, dir); screen.get_monitor_neighbor_index(monitorIndex, dir);
if (leftMonitorIndex != -1) { if (leftMonitorIndex != -1) {
this.addAction(_("Move to Monitor Left"), () => { this.addAction(_("Move to Monitor Left"), () => {
window.move_to_monitor(leftMonitorIndex); window.move_to_monitor(leftMonitorIndex);
@ -161,7 +162,7 @@ var WindowMenu = new Lang.Class({
dir = Meta.ScreenDirection.RIGHT; dir = Meta.ScreenDirection.RIGHT;
let rightMonitorIndex = let rightMonitorIndex =
display.get_monitor_neighbor_index(monitorIndex, dir); screen.get_monitor_neighbor_index(monitorIndex, dir);
if (rightMonitorIndex != -1) { if (rightMonitorIndex != -1) {
this.addAction(_("Move to Monitor Right"), () => { this.addAction(_("Move to Monitor Right"), () => {
window.move_to_monitor(rightMonitorIndex); window.move_to_monitor(rightMonitorIndex);

View File

@ -110,7 +110,6 @@ var WindowClone = new Lang.Class({
this.metaWindow = realWindow.meta_window; this.metaWindow = realWindow.meta_window;
this.metaWindow._delegate = this; this.metaWindow._delegate = this;
this._workspace = workspace; this._workspace = workspace;
this._attachedDialogs = [];
this._windowClone = new Clutter.Clone({ source: realWindow }); this._windowClone = new Clutter.Clone({ source: realWindow });
// We expect this.actor to be used for all interaction rather than // We expect this.actor to be used for all interaction rather than
@ -138,10 +137,8 @@ var WindowClone = new Lang.Class({
this._dragSlot = [0, 0, 0, 0]; this._dragSlot = [0, 0, 0, 0];
this._stackAbove = null; this._stackAbove = null;
this._windowClone._sizeChangedId = this.metaWindow.connect('size-changed', this._windowClone._updateId = this.metaWindow.connect('size-changed',
this._onMetaWindowSizeChanged.bind(this)); this._onRealWindowSizeChanged.bind(this));
this._windowClone._posChangedId = this.metaWindow.connect('position-changed',
this._computeBoundingBox.bind(this));
this._windowClone._destroyId = this._windowClone._destroyId =
this.realWindow.connect('destroy', () => { this.realWindow.connect('destroy', () => {
// First destroy the clone and then destroy everything // First destroy the clone and then destroy everything
@ -180,7 +177,6 @@ var WindowClone = new Lang.Class({
this.inDrag = false; this.inDrag = false;
this._selected = false; this._selected = false;
this._closeRequested = false;
}, },
set slot(slot) { set slot(slot) {
@ -196,6 +192,7 @@ var WindowClone = new Lang.Class({
deleteAll() { deleteAll() {
// Delete all windows, starting from the bottom-most (most-modal) one // Delete all windows, starting from the bottom-most (most-modal) one
let windows = this.actor.get_children(); let windows = this.actor.get_children();
for (let i = windows.length - 1; i >= 1; i--) { for (let i = windows.length - 1; i >= 1; i--) {
let realWindow = windows[i].source; let realWindow = windows[i].source;
@ -205,49 +202,29 @@ var WindowClone = new Lang.Class({
} }
this.metaWindow.delete(global.get_current_time()); this.metaWindow.delete(global.get_current_time());
this._closeRequested = true;
}, },
addDialog(win) { addAttachedDialog(win) {
let realWin = win.get_compositor_private();
if (this._attachedDialogs.includes(realWin))
return;
this._attachedDialogs.push(realWin);
let parent = win.get_transient_for();
while (parent.is_attached_dialog())
parent = parent.get_transient_for();
// Display dialog if it is attached to our metaWindow
if (win.is_attached_dialog() && parent == this.metaWindow) {
this._doAddAttachedDialog(win, win.get_compositor_private()); this._doAddAttachedDialog(win, win.get_compositor_private());
this._onMetaWindowSizeChanged(); this._computeBoundingBox();
} this.emit('size-changed');
// The dialog popped up after the user tried to close the window,
// assume it's a close confirmation and leave the overview
if (this._closeRequested)
this._activate();
}, },
hasAttachedDialogs() { hasAttachedDialogs() {
return this._attachedDialogs.length > 1; return this.actor.get_n_children() > 1;
}, },
_doAddAttachedDialog(metaWin, realWin) { _doAddAttachedDialog(metaWin, realWin) {
let clone = new Clutter.Clone({ source: realWin }); let clone = new Clutter.Clone({ source: realWin });
clone._sizeChangedId = metaWin.connect('size-changed', clone._updateId = metaWin.connect('size-changed', () => {
this._onMetaWindowSizeChanged.bind(this)); this._computeBoundingBox();
clone._posChangedId = metaWin.connect('position-changed', this.emit('size-changed');
this._onMetaWindowSizeChanged.bind(this)); });
clone._destroyId = realWin.connect('destroy', () => { clone._destroyId = realWin.connect('destroy', () => {
let idx = this._attachedDialogs.indexOf(realWin);
this._attachedDialogs.splice(idx, 1);
clone.destroy(); clone.destroy();
this._onMetaWindowSizeChanged(); this._computeBoundingBox();
this.emit('size-changed');
}); });
this.actor.add_child(clone); this.actor.add_child(clone);
}, },
@ -344,13 +321,12 @@ var WindowClone = new Lang.Class({
else else
realWindow = child.source; realWindow = child.source;
realWindow.meta_window.disconnect(child._sizeChangedId); realWindow.meta_window.disconnect(child._updateId);
realWindow.meta_window.disconnect(child._posChangedId);
realWindow.disconnect(child._destroyId); realWindow.disconnect(child._destroyId);
}); });
}, },
_onMetaWindowSizeChanged() { _onRealWindowSizeChanged() {
this._computeBoundingBox(); this._computeBoundingBox();
this.emit('size-changed'); this.emit('size-changed');
}, },
@ -485,12 +461,14 @@ var WindowOverlay = new Lang.Class({
button._overlap = 0; button._overlap = 0;
this._idleToggleCloseId = 0; this._idleToggleCloseId = 0;
button.connect('clicked', () => this._windowClone.deleteAll()); button.connect('clicked', this._closeWindow.bind(this));
windowClone.actor.connect('destroy', this._onDestroy.bind(this)); windowClone.actor.connect('destroy', this._onDestroy.bind(this));
windowClone.connect('show-chrome', this._onShowChrome.bind(this)); windowClone.connect('show-chrome', this._onShowChrome.bind(this));
windowClone.connect('hide-chrome', this._onHideChrome.bind(this)); windowClone.connect('hide-chrome', this._onHideChrome.bind(this));
this._windowAddedId = 0;
button.hide(); button.hide();
title.hide(); title.hide();
@ -611,12 +589,43 @@ var WindowOverlay = new Lang.Class({
Tweener.addTween(actor, params); Tweener.addTween(actor, params);
}, },
_closeWindow(actor) {
let metaWindow = this._windowClone.metaWindow;
this._workspace = metaWindow.get_workspace();
this._windowAddedId = this._workspace.connect('window-added',
this._onWindowAdded.bind(this));
this._windowClone.deleteAll();
},
_windowCanClose() { _windowCanClose() {
return this._windowClone.metaWindow.can_close() && return this._windowClone.metaWindow.can_close() &&
!this._windowClone.hasAttachedDialogs(); !this._windowClone.hasAttachedDialogs();
}, },
_onWindowAdded(workspace, win) {
let metaWindow = this._windowClone.metaWindow;
if (win.get_transient_for() == metaWindow) {
workspace.disconnect(this._windowAddedId);
this._windowAddedId = 0;
// use an idle handler to avoid mapping problems -
// see comment in Workspace._windowAdded
let id = Mainloop.idle_add(() => {
this._windowClone.emit('selected');
return GLib.SOURCE_REMOVE;
});
GLib.Source.set_name_by_id(id, '[gnome-shell] this._windowClone.emit');
}
},
_onDestroy() { _onDestroy() {
if (this._windowAddedId > 0) {
this._workspace.disconnect(this._windowAddedId);
this._windowAddedId = 0;
}
if (this._idleToggleCloseId > 0) { if (this._idleToggleCloseId > 0) {
Mainloop.source_remove(this._idleToggleCloseId); Mainloop.source_remove(this._idleToggleCloseId);
this._idleToggleCloseId = 0; this._idleToggleCloseId = 0;
@ -1147,9 +1156,9 @@ var Workspace = new Lang.Class({
this._windowRemovedId = this.metaWorkspace.connect('window-removed', this._windowRemovedId = this.metaWorkspace.connect('window-removed',
this._windowRemoved.bind(this)); this._windowRemoved.bind(this));
} }
this._windowEnteredMonitorId = global.display.connect('window-entered-monitor', this._windowEnteredMonitorId = global.screen.connect('window-entered-monitor',
this._windowEnteredMonitor.bind(this)); this._windowEnteredMonitor.bind(this));
this._windowLeftMonitorId = global.display.connect('window-left-monitor', this._windowLeftMonitorId = global.screen.connect('window-left-monitor',
this._windowLeftMonitor.bind(this)); this._windowLeftMonitor.bind(this));
this._repositionWindowsId = 0; this._repositionWindowsId = 0;
@ -1296,8 +1305,7 @@ var Workspace = new Lang.Class({
let area = padArea(this._actualGeometry, padding); let area = padArea(this._actualGeometry, padding);
let slots = strategy.computeWindowSlots(layout, area); let slots = strategy.computeWindowSlots(layout, area);
let workspaceManager = global.workspace_manager; let currentWorkspace = global.screen.get_active_workspace();
let currentWorkspace = workspaceManager.get_active_workspace();
let isOnCurrentWorkspace = this.metaWorkspace == null || this.metaWorkspace == currentWorkspace; let isOnCurrentWorkspace = this.metaWorkspace == null || this.metaWorkspace == currentWorkspace;
for (let i = 0; i < slots.length; i++) { for (let i = 0; i < slots.length; i++) {
@ -1434,9 +1442,17 @@ var Workspace = new Lang.Class({
_doRemoveWindow(metaWin) { _doRemoveWindow(metaWin) {
let win = metaWin.get_compositor_private(); let win = metaWin.get_compositor_private();
let clone = this._removeWindowClone(metaWin); // find the position of the window in our list
let index = this._lookupIndex (metaWin);
if (index == -1)
return;
let clone = this._windows[index];
this._windows.splice(index, 1);
this._windowOverlays.splice(index, 1);
if (clone) {
// If metaWin.get_compositor_private() returned non-NULL, that // If metaWin.get_compositor_private() returned non-NULL, that
// means the window still exists (and is just being moved to // means the window still exists (and is just being moved to
// another workspace or something), so set its overviewHint // another workspace or something), so set its overviewHint
@ -1453,7 +1469,7 @@ var Workspace = new Lang.Class({
}; };
} }
clone.destroy(); clone.destroy();
}
// We need to reposition the windows; to avoid shuffling windows // We need to reposition the windows; to avoid shuffling windows
// around while the user is interacting with the workspace, we delay // around while the user is interacting with the workspace, we delay
@ -1506,17 +1522,21 @@ var Workspace = new Lang.Class({
return; return;
if (!this._isOverviewWindow(win)) { if (!this._isOverviewWindow(win)) {
if (metaWin.get_transient_for() == null) if (metaWin.is_attached_dialog()) {
let parent = metaWin.get_transient_for();
while (parent.is_attached_dialog())
parent = metaWin.get_transient_for();
let idx = this._lookupIndex (parent);
if (idx < 0) {
// parent was not created yet, it will take care
// of the dialog when created
return; return;
}
// Let the top-most ancestor handle all transients let clone = this._windows[idx];
let parent = metaWin.find_root_ancestor(); clone.addAttachedDialog(metaWin);
let clone = this._windows.find(c => c.metaWindow == parent); }
// If no clone was found, the parent hasn't been created yet
// and will take care of the dialog when added
if (clone)
clone.addDialog(metaWin);
return; return;
} }
@ -1548,13 +1568,13 @@ var Workspace = new Lang.Class({
this._doRemoveWindow(metaWin); this._doRemoveWindow(metaWin);
}, },
_windowEnteredMonitor(metaDisplay, monitorIndex, metaWin) { _windowEnteredMonitor(metaScreen, monitorIndex, metaWin) {
if (monitorIndex == this.monitorIndex) { if (monitorIndex == this.monitorIndex) {
this._doAddWindow(metaWin); this._doAddWindow(metaWin);
} }
}, },
_windowLeftMonitor(metaDisplay, monitorIndex, metaWin) { _windowLeftMonitor(metaScreen, monitorIndex, metaWin) {
if (monitorIndex == this.monitorIndex) { if (monitorIndex == this.monitorIndex) {
this._doRemoveWindow(metaWin); this._doRemoveWindow(metaWin);
} }
@ -1579,9 +1599,7 @@ var Workspace = new Lang.Class({
if (this._windows.length == 0) if (this._windows.length == 0)
return; return;
let workspaceManager = global.workspace_manager; if (this.metaWorkspace != null && this.metaWorkspace != global.screen.get_active_workspace())
let activeWorkspace = workspaceManager.get_active_workspace();
if (this.metaWorkspace != null && this.metaWorkspace != activeWorkspace)
return; return;
// Special case maximized windows, since it doesn't make sense // Special case maximized windows, since it doesn't make sense
@ -1637,9 +1655,7 @@ var Workspace = new Lang.Class({
this._repositionWindowsId = 0; this._repositionWindowsId = 0;
} }
let workspaceManager = global.workspace_manager; if (this.metaWorkspace != null && this.metaWorkspace != global.screen.get_active_workspace())
let activeWorkspace = workspaceManager.get_active_workspace();
if (this.metaWorkspace != null && this.metaWorkspace != activeWorkspace)
return; return;
// Special case maximized windows, since it doesn't make sense // Special case maximized windows, since it doesn't make sense
@ -1709,8 +1725,7 @@ var Workspace = new Lang.Class({
}, },
zoomFromOverview() { zoomFromOverview() {
let workspaceManager = global.workspace_manager; let currentWorkspace = global.screen.get_active_workspace();
let currentWorkspace = workspaceManager.get_active_workspace();
this.leavingOverview = true; this.leavingOverview = true;
@ -1778,8 +1793,8 @@ var Workspace = new Lang.Class({
this.metaWorkspace.disconnect(this._windowAddedId); this.metaWorkspace.disconnect(this._windowAddedId);
this.metaWorkspace.disconnect(this._windowRemovedId); this.metaWorkspace.disconnect(this._windowRemovedId);
} }
global.display.disconnect(this._windowEnteredMonitorId); global.screen.disconnect(this._windowEnteredMonitorId);
global.display.disconnect(this._windowLeftMonitorId); global.screen.disconnect(this._windowLeftMonitorId);
if (this._repositionWindowsId > 0) { if (this._repositionWindowsId > 0) {
Mainloop.source_remove(this._repositionWindowsId); Mainloop.source_remove(this._repositionWindowsId);
@ -1844,9 +1859,6 @@ var Workspace = new Lang.Class({
clone.connect('size-changed', () => { clone.connect('size-changed', () => {
this._recalculateWindowPositions(WindowPositionFlags.NONE); this._recalculateWindowPositions(WindowPositionFlags.NONE);
}); });
clone.actor.connect('destroy', () => {
this._removeWindowClone(clone.metaWindow);
});
this.actor.add_actor(clone.actor); this.actor.add_actor(clone.actor);
@ -1868,17 +1880,6 @@ var Workspace = new Lang.Class({
return [clone, overlay]; return [clone, overlay];
}, },
_removeWindowClone(metaWin) {
// find the position of the window in our list
let index = this._lookupIndex (metaWin);
if (index == -1)
return null;
this._windowOverlays.splice(index, 1);
return this._windows.splice(index, 1).pop();
},
_onShowOverlayClose(windowOverlay) { _onShowOverlayClose(windowOverlay) {
for (let i = 0; i < this._windowOverlays.length; i++) { for (let i = 0; i < this._windowOverlays.length; i++) {
let overlay = this._windowOverlays[i]; let overlay = this._windowOverlays[i];
@ -2014,8 +2015,7 @@ var Workspace = new Lang.Class({
if (metaWindow.get_monitor() != this.monitorIndex) if (metaWindow.get_monitor() != this.monitorIndex)
metaWindow.move_to_monitor(this.monitorIndex); metaWindow.move_to_monitor(this.monitorIndex);
let workspaceManager = global.workspace_manager; let index = this.metaWorkspace ? this.metaWorkspace.index() : global.screen.get_active_workspace_index();
let index = this.metaWorkspace ? this.metaWorkspace.index() : workspaceManager.get_active_workspace_index();
metaWindow.change_workspace_by_index(index, false); metaWindow.change_workspace_by_index(index, false);
return true; return true;
} else if (source.shellWorkspaceLaunch) { } else if (source.shellWorkspaceLaunch) {

View File

@ -47,12 +47,9 @@ var WorkspaceSwitcherPopup = new Lang.Class({
this.actor.hide(); this.actor.hide();
let workspaceManager = global.workspace_manager; this._globalSignals = [];
this._workspaceManagerSignals = []; this._globalSignals.push(global.screen.connect('workspace-added', this._redisplay.bind(this)));
this._workspaceManagerSignals.push(workspaceManager.connect('workspace-added', this._globalSignals.push(global.screen.connect('workspace-removed', this._redisplay.bind(this)));
this._redisplay.bind(this)));
this._workspaceManagerSignals.push(workspaceManager.connect('workspace-removed',
this._redisplay.bind(this)));
}, },
_getPreferredHeight(actor, forWidth, alloc) { _getPreferredHeight(actor, forWidth, alloc) {
@ -71,12 +68,11 @@ var WorkspaceSwitcherPopup = new Lang.Class({
height += childNaturalHeight * workArea.width / workArea.height; height += childNaturalHeight * workArea.width / workArea.height;
} }
let workspaceManager = global.workspace_manager; let spacing = this._itemSpacing * (global.screen.n_workspaces - 1);
let spacing = this._itemSpacing * (workspaceManager.n_workspaces - 1);
height += spacing; height += spacing;
height = Math.min(height, availHeight); height = Math.min(height, availHeight);
this._childHeight = (height - spacing) / workspaceManager.n_workspaces; this._childHeight = (height - spacing) / global.screen.n_workspaces;
alloc.min_size = height; alloc.min_size = height;
alloc.natural_size = height; alloc.natural_size = height;
@ -108,11 +104,9 @@ var WorkspaceSwitcherPopup = new Lang.Class({
}, },
_redisplay() { _redisplay() {
let workspaceManager = global.workspace_manager;
this._list.destroy_all_children(); this._list.destroy_all_children();
for (let i = 0; i < workspaceManager.n_workspaces; i++) { for (let i = 0; i < global.screen.n_workspaces; i++) {
let indicator = null; let indicator = null;
if (i == this._activeWorkspaceIndex && this._direction == Meta.MotionDirection.UP) if (i == this._activeWorkspaceIndex && this._direction == Meta.MotionDirection.UP)
@ -170,9 +164,8 @@ var WorkspaceSwitcherPopup = new Lang.Class({
Mainloop.source_remove(this._timeoutId); Mainloop.source_remove(this._timeoutId);
this._timeoutId = 0; this._timeoutId = 0;
let workspaceManager = global.workspace_manager; for (let i = 0; i < this._globalSignals.length; i++)
for (let i = 0; i < this._workspaceManagerSignals.length; i++) global.screen.disconnect(this._globalSignals[i]);
workspaceManager.disconnect(this._workspaceManagerSignals[i]);
this.actor.destroy(); this.actor.destroy();

View File

@ -68,7 +68,7 @@ var WindowClone = new Lang.Class({
this.realWindow = realWindow; this.realWindow = realWindow;
this.metaWindow = realWindow.meta_window; this.metaWindow = realWindow.meta_window;
this.clone._updateId = this.realWindow.connect('notify::position', this.clone._updateId = this.metaWindow.connect('position-changed',
this._onPositionChanged.bind(this)); this._onPositionChanged.bind(this));
this.clone._destroyId = this.realWindow.connect('destroy', () => { this.clone._destroyId = this.realWindow.connect('destroy', () => {
// First destroy the clone and then destroy everything // First destroy the clone and then destroy everything
@ -151,9 +151,9 @@ var WindowClone = new Lang.Class({
_doAddAttachedDialog(metaDialog, realDialog) { _doAddAttachedDialog(metaDialog, realDialog) {
let clone = new Clutter.Clone({ source: realDialog }); let clone = new Clutter.Clone({ source: realDialog });
this._updateDialogPosition(metaDialog, clone); this._updateDialogPosition(realDialog, clone);
clone._updateId = realDialog.connect('notify::position', dialog => { clone._updateId = metaDialog.connect('position-changed', dialog => {
this._updateDialogPosition(dialog, clone); this._updateDialogPosition(dialog, clone);
}); });
clone._destroyId = realDialog.connect('destroy', () => { clone._destroyId = realDialog.connect('destroy', () => {
@ -162,7 +162,8 @@ var WindowClone = new Lang.Class({
this.actor.add_child(clone); this.actor.add_child(clone);
}, },
_updateDialogPosition(metaDialog, cloneDialog) { _updateDialogPosition(realDialog, cloneDialog) {
let metaDialog = realDialog.meta_window;
let dialogRect = metaDialog.get_frame_rect(); let dialogRect = metaDialog.get_frame_rect();
let rect = this.metaWindow.get_frame_rect(); let rect = this.metaWindow.get_frame_rect();
@ -170,6 +171,7 @@ var WindowClone = new Lang.Class({
}, },
_onPositionChanged() { _onPositionChanged() {
let rect = this.metaWindow.get_frame_rect();
this.actor.set_position(this.realWindow.x, this.realWindow.y); this.actor.set_position(this.realWindow.x, this.realWindow.y);
}, },
@ -177,7 +179,7 @@ var WindowClone = new Lang.Class({
this.actor.get_children().forEach(child => { this.actor.get_children().forEach(child => {
let realWindow = child.source; let realWindow = child.source;
realWindow.disconnect(child._updateId); realWindow.meta_window.disconnect(child._updateId);
realWindow.disconnect(child._destroyId); realWindow.disconnect(child._destroyId);
}); });
}, },
@ -302,9 +304,9 @@ var WorkspaceThumbnail = new Lang.Class({
this._windowAdded.bind(this)); this._windowAdded.bind(this));
this._windowRemovedId = this.metaWorkspace.connect('window-removed', this._windowRemovedId = this.metaWorkspace.connect('window-removed',
this._windowRemoved.bind(this)); this._windowRemoved.bind(this));
this._windowEnteredMonitorId = global.display.connect('window-entered-monitor', this._windowEnteredMonitorId = global.screen.connect('window-entered-monitor',
this._windowEnteredMonitor.bind(this)); this._windowEnteredMonitor.bind(this));
this._windowLeftMonitorId = global.display.connect('window-left-monitor', this._windowLeftMonitorId = global.screen.connect('window-left-monitor',
this._windowLeftMonitor.bind(this)); this._windowLeftMonitor.bind(this));
this.state = ThumbnailState.NORMAL; this.state = ThumbnailState.NORMAL;
@ -370,8 +372,17 @@ var WorkspaceThumbnail = new Lang.Class({
}, },
_doRemoveWindow(metaWin) { _doRemoveWindow(metaWin) {
let clone = this._removeWindowClone(metaWin); let win = metaWin.get_compositor_private();
if (clone)
// find the position of the window in our list
let index = this._lookupIndex (metaWin);
if (index == -1)
return;
let clone = this._windows[index];
this._windows.splice(index, 1);
clone.destroy(); clone.destroy();
}, },
@ -415,7 +426,7 @@ var WorkspaceThumbnail = new Lang.Class({
} else if (metaWin.is_attached_dialog()) { } else if (metaWin.is_attached_dialog()) {
let parent = metaWin.get_transient_for(); let parent = metaWin.get_transient_for();
while (parent.is_attached_dialog()) while (parent.is_attached_dialog())
parent = parent.get_transient_for(); parent = metaWin.get_transient_for();
let idx = this._lookupIndex (parent); let idx = this._lookupIndex (parent);
if (idx < 0) { if (idx < 0) {
@ -444,13 +455,13 @@ var WorkspaceThumbnail = new Lang.Class({
this._doRemoveWindow(metaWin); this._doRemoveWindow(metaWin);
}, },
_windowEnteredMonitor(metaDisplay, monitorIndex, metaWin) { _windowEnteredMonitor(metaScreen, monitorIndex, metaWin) {
if (monitorIndex == this.monitorIndex) { if (monitorIndex == this.monitorIndex) {
this._doAddWindow(metaWin); this._doAddWindow(metaWin);
} }
}, },
_windowLeftMonitor(metaDisplay, monitorIndex, metaWin) { _windowLeftMonitor(metaScreen, monitorIndex, metaWin) {
if (monitorIndex == this.monitorIndex) { if (monitorIndex == this.monitorIndex) {
this._doRemoveWindow(metaWin); this._doRemoveWindow(metaWin);
} }
@ -476,8 +487,8 @@ var WorkspaceThumbnail = new Lang.Class({
this.metaWorkspace.disconnect(this._windowAddedId); this.metaWorkspace.disconnect(this._windowAddedId);
this.metaWorkspace.disconnect(this._windowRemovedId); this.metaWorkspace.disconnect(this._windowRemovedId);
global.display.disconnect(this._windowEnteredMonitorId); global.screen.disconnect(this._windowEnteredMonitorId);
global.display.disconnect(this._windowLeftMonitorId); global.screen.disconnect(this._windowLeftMonitorId);
for (let i = 0; i < this._allWindows.length; i++) for (let i = 0; i < this._allWindows.length; i++)
this._allWindows[i].disconnect(this._minimizedChangedIds[i]); this._allWindows[i].disconnect(this._minimizedChangedIds[i]);
@ -524,9 +535,6 @@ var WorkspaceThumbnail = new Lang.Class({
clone.connect('drag-end', () => { clone.connect('drag-end', () => {
Main.overview.endWindowDrag(clone.metaWindow); Main.overview.endWindowDrag(clone.metaWindow);
}); });
clone.actor.connect('destroy', () => {
this._removeWindowClone(clone.metaWindow);
});
this._contents.add_actor(clone.actor); this._contents.add_actor(clone.actor);
if (this._windows.length == 0) if (this._windows.length == 0)
@ -539,24 +547,12 @@ var WorkspaceThumbnail = new Lang.Class({
return clone; return clone;
}, },
_removeWindowClone(metaWin) {
// find the position of the window in our list
let index = this._lookupIndex (metaWin);
if (index == -1)
return null;
return this._windows.splice(index, 1).pop();
},
activate(time) { activate(time) {
if (this.state > ThumbnailState.NORMAL) if (this.state > ThumbnailState.NORMAL)
return; return;
// a click on the already current workspace should go back to the main view // a click on the already current workspace should go back to the main view
let workspaceManager = global.workspace_manager; if (this.metaWorkspace == global.screen.get_active_workspace())
let activeWorkspace = workspaceManager.get_active_workspace();
if (this.metaWorkspace == activeWorkspace)
Main.overview.hide(); Main.overview.hide();
else else
this.metaWorkspace.activate(time); this.metaWorkspace.activate(time);
@ -678,19 +674,12 @@ var ThumbnailsBox = new Lang.Class({
this._updateSwitcherVisibility.bind(this)); this._updateSwitcherVisibility.bind(this));
Main.layoutManager.connect('monitors-changed', this._rebuildThumbnails.bind(this)); Main.layoutManager.connect('monitors-changed', this._rebuildThumbnails.bind(this));
this._switchWorkspaceNotifyId = 0;
this._nWorkspacesNotifyId = 0;
this._syncStackingId = 0;
this._workareasChangedId = 0;
}, },
_updateSwitcherVisibility() { _updateSwitcherVisibility() {
let workspaceManager = global.workspace_manager;
this.actor.visible = this.actor.visible =
this._settings.get_boolean('dynamic-workspaces') || this._settings.get_boolean('dynamic-workspaces') ||
workspaceManager.n_workspaces > 1; global.screen.n_workspaces > 1;
}, },
_activateThumbnailAtPoint(stageX, stageY, time) { _activateThumbnailAtPoint(stageX, stageY, time) {
@ -848,8 +837,7 @@ var ThumbnailsBox = new Lang.Class({
// to open its first window within some time, as tracked by Shell.WindowTracker. // to open its first window within some time, as tracked by Shell.WindowTracker.
// Here, we only add a very brief timeout to avoid the _immediate_ removal of the // Here, we only add a very brief timeout to avoid the _immediate_ removal of the
// workspace while we wait for the startup sequence to load. // workspace while we wait for the startup sequence to load.
let workspaceManager = global.workspace_manager; Main.wm.keepWorkspaceAlive(global.screen.get_workspace_by_index(newWorkspaceIndex),
Main.wm.keepWorkspaceAlive(workspaceManager.get_workspace_by_index(newWorkspaceIndex),
WORKSPACE_KEEP_ALIVE_TIME); WORKSPACE_KEEP_ALIVE_TIME);
} }
@ -868,21 +856,18 @@ var ThumbnailsBox = new Lang.Class({
}, },
_createThumbnails() { _createThumbnails() {
let workspaceManager = global.workspace_manager;
this._switchWorkspaceNotifyId = this._switchWorkspaceNotifyId =
global.window_manager.connect('switch-workspace', global.window_manager.connect('switch-workspace',
this._activeWorkspaceChanged.bind(this)); this._activeWorkspaceChanged.bind(this));
this._nWorkspacesNotifyId = this._nWorkspacesNotifyId =
workspaceManager.connect('notify::n-workspaces', global.screen.connect('notify::n-workspaces',
this._workspacesChanged.bind(this)); this._workspacesChanged.bind(this));
this._syncStackingId = this._syncStackingId =
Main.overview.connect('windows-restacked', Main.overview.connect('windows-restacked',
this._syncStacking.bind(this)); this._syncStacking.bind(this));
this._workareasChangedId = this._workareasChangedId =
global.display.connect('workareas-changed', global.screen.connect('workareas-changed', this._rebuildThumbnails.bind(this));
this._rebuildThumbnails.bind(this));
this._targetScale = 0; this._targetScale = 0;
this._scale = 0; this._scale = 0;
@ -893,7 +878,7 @@ var ThumbnailsBox = new Lang.Class({
for (let key in ThumbnailState) for (let key in ThumbnailState)
this._stateCounts[ThumbnailState[key]] = 0; this._stateCounts[ThumbnailState[key]] = 0;
this.addThumbnails(0, workspaceManager.n_workspaces); this.addThumbnails(0, global.screen.n_workspaces);
this._updateSwitcherVisibility(); this._updateSwitcherVisibility();
}, },
@ -907,8 +892,7 @@ var ThumbnailsBox = new Lang.Class({
this._switchWorkspaceNotifyId = 0; this._switchWorkspaceNotifyId = 0;
} }
if (this._nWorkspacesNotifyId > 0) { if (this._nWorkspacesNotifyId > 0) {
let workspaceManager = global.workspace_manager; global.screen.disconnect(this._nWorkspacesNotifyId);
workspaceManager.disconnect(this._nWorkspacesNotifyId);
this._nWorkspacesNotifyId = 0; this._nWorkspacesNotifyId = 0;
} }
@ -918,7 +902,7 @@ var ThumbnailsBox = new Lang.Class({
} }
if (this._workareasChangedId > 0) { if (this._workareasChangedId > 0) {
global.display.disconnect(this._workareasChangedId); global.screen.disconnect(this._workareasChangedId);
this._workareasChangedId = 0; this._workareasChangedId = 0;
} }
@ -938,10 +922,9 @@ var ThumbnailsBox = new Lang.Class({
_workspacesChanged() { _workspacesChanged() {
let validThumbnails = let validThumbnails =
this._thumbnails.filter(t => t.state <= ThumbnailState.NORMAL); this._thumbnails.filter(t => t.state <= ThumbnailState.NORMAL);
let workspaceManager = global.workspace_manager;
let oldNumWorkspaces = validThumbnails.length; let oldNumWorkspaces = validThumbnails.length;
let newNumWorkspaces = workspaceManager.n_workspaces; let newNumWorkspaces = global.screen.n_workspaces;
let active = workspaceManager.get_active_workspace_index(); let active = global.screen.get_active_workspace_index();
if (newNumWorkspaces > oldNumWorkspaces) { if (newNumWorkspaces > oldNumWorkspaces) {
this.addThumbnails(oldNumWorkspaces, newNumWorkspaces - oldNumWorkspaces); this.addThumbnails(oldNumWorkspaces, newNumWorkspaces - oldNumWorkspaces);
@ -949,7 +932,7 @@ var ThumbnailsBox = new Lang.Class({
let removedIndex; let removedIndex;
let removedNum = oldNumWorkspaces - newNumWorkspaces; let removedNum = oldNumWorkspaces - newNumWorkspaces;
for (let w = 0; w < oldNumWorkspaces; w++) { for (let w = 0; w < oldNumWorkspaces; w++) {
let metaWorkspace = workspaceManager.get_workspace_by_index(w); let metaWorkspace = global.screen.get_workspace_by_index(w);
if (this._thumbnails[w].metaWorkspace != metaWorkspace) { if (this._thumbnails[w].metaWorkspace != metaWorkspace) {
removedIndex = w; removedIndex = w;
break; break;
@ -963,12 +946,10 @@ var ThumbnailsBox = new Lang.Class({
}, },
addThumbnails(start, count) { addThumbnails(start, count) {
let workspaceManager = global.workspace_manager;
if (!this._ensurePorthole()) if (!this._ensurePorthole())
return; return;
for (let k = start; k < start + count; k++) { for (let k = start; k < start + count; k++) {
let metaWorkspace = workspaceManager.get_workspace_by_index(k); let metaWorkspace = global.screen.get_workspace_by_index(k);
let thumbnail = new WorkspaceThumbnail(metaWorkspace); let thumbnail = new WorkspaceThumbnail(metaWorkspace);
thumbnail.setPorthole(this._porthole.x, this._porthole.y, thumbnail.setPorthole(this._porthole.x, this._porthole.y,
this._porthole.width, this._porthole.height); this._porthole.width, this._porthole.height);
@ -1154,11 +1135,10 @@ var ThumbnailsBox = new Lang.Class({
return; return;
} }
let workspaceManager = global.workspace_manager;
let themeNode = this.actor.get_theme_node(); let themeNode = this.actor.get_theme_node();
let spacing = themeNode.get_length('spacing'); let spacing = themeNode.get_length('spacing');
let nWorkspaces = workspaceManager.n_workspaces; let nWorkspaces = global.screen.n_workspaces;
let totalSpacing = (nWorkspaces - 1) * spacing; let totalSpacing = (nWorkspaces - 1) * spacing;
alloc.min_size = totalSpacing; alloc.min_size = totalSpacing;
@ -1172,11 +1152,10 @@ var ThumbnailsBox = new Lang.Class({
return; return;
} }
let workspaceManager = global.workspace_manager;
let themeNode = this.actor.get_theme_node(); let themeNode = this.actor.get_theme_node();
let spacing = this.actor.get_theme_node().get_length('spacing'); let spacing = this.actor.get_theme_node().get_length('spacing');
let nWorkspaces = workspaceManager.n_workspaces; let nWorkspaces = global.screen.n_workspaces;
let totalSpacing = (nWorkspaces - 1) * spacing; let totalSpacing = (nWorkspaces - 1) * spacing;
let avail = forHeight - totalSpacing; let avail = forHeight - totalSpacing;
@ -1207,7 +1186,6 @@ var ThumbnailsBox = new Lang.Class({
if (this._thumbnails.length == 0) // not visible if (this._thumbnails.length == 0) // not visible
return; return;
let workspaceManager = global.workspace_manager;
let themeNode = this.actor.get_theme_node(); let themeNode = this.actor.get_theme_node();
let portholeWidth = this._porthole.width; let portholeWidth = this._porthole.width;
@ -1215,7 +1193,7 @@ var ThumbnailsBox = new Lang.Class({
let spacing = themeNode.get_length('spacing'); let spacing = themeNode.get_length('spacing');
// Compute the scale we'll need once everything is updated // Compute the scale we'll need once everything is updated
let nWorkspaces = workspaceManager.n_workspaces; let nWorkspaces = global.screen.n_workspaces;
let totalSpacing = (nWorkspaces - 1) * spacing; let totalSpacing = (nWorkspaces - 1) * spacing;
let avail = (box.y2 - box.y1) - totalSpacing; let avail = (box.y2 - box.y1) - totalSpacing;
@ -1249,8 +1227,7 @@ var ThumbnailsBox = new Lang.Class({
let indicatorY1 = this._indicatorY; let indicatorY1 = this._indicatorY;
let indicatorY2; let indicatorY2;
// when not animating, the workspace position overrides this._indicatorY // when not animating, the workspace position overrides this._indicatorY
let activeWorkspace = workspaceManager.get_active_workspace(); let indicatorWorkspace = !this._animatingIndicator ? global.screen.get_active_workspace() : null;
let indicatorWorkspace = !this._animatingIndicator ? activeWorkspace : null;
let indicatorThemeNode = this._indicator.get_theme_node(); let indicatorThemeNode = this._indicator.get_theme_node();
let indicatorTopFullBorder = indicatorThemeNode.get_padding(St.Side.TOP) + indicatorThemeNode.get_border_width(St.Side.TOP); let indicatorTopFullBorder = indicatorThemeNode.get_padding(St.Side.TOP) + indicatorThemeNode.get_border_width(St.Side.TOP);
@ -1341,8 +1318,7 @@ var ThumbnailsBox = new Lang.Class({
_activeWorkspaceChanged(wm, from, to, direction) { _activeWorkspaceChanged(wm, from, to, direction) {
let thumbnail; let thumbnail;
let workspaceManager = global.workspace_manager; let activeWorkspace = global.screen.get_active_workspace();
let activeWorkspace = workspaceManager.get_active_workspace();
for (let i = 0; i < this._thumbnails.length; i++) { for (let i = 0; i < this._thumbnails.length; i++) {
if (this._thumbnails[i].metaWorkspace == activeWorkspace) { if (this._thumbnails[i].metaWorkspace == activeWorkspace) {
thumbnail = this._thumbnails[i]; thumbnail = this._thumbnails[i];

View File

@ -91,29 +91,25 @@ var WorkspacesView = new Lang.Class({
Extends: WorkspacesViewBase, Extends: WorkspacesViewBase,
_init(monitorIndex) { _init(monitorIndex) {
let workspaceManager = global.workspace_manager;
this.parent(monitorIndex); this.parent(monitorIndex);
this._animating = false; // tweening this._animating = false; // tweening
this._scrolling = false; // swipe-scrolling this._scrolling = false; // swipe-scrolling
this._animatingScroll = false; // programatically updating the adjustment this._animatingScroll = false; // programatically updating the adjustment
let activeWorkspaceIndex = workspaceManager.get_active_workspace_index(); let activeWorkspaceIndex = global.screen.get_active_workspace_index();
this.scrollAdjustment = new St.Adjustment({ value: activeWorkspaceIndex, this.scrollAdjustment = new St.Adjustment({ value: activeWorkspaceIndex,
lower: 0, lower: 0,
page_increment: 1, page_increment: 1,
page_size: 1, page_size: 1,
step_increment: 0, step_increment: 0,
upper: workspaceManager.n_workspaces }); upper: global.screen.n_workspaces });
this.scrollAdjustment.connect('notify::value', this.scrollAdjustment.connect('notify::value',
this._onScroll.bind(this)); this._onScroll.bind(this));
this._workspaces = []; this._workspaces = [];
this._updateWorkspaces(); this._updateWorkspaces();
this._updateWorkspacesId = this._updateWorkspacesId = global.screen.connect('notify::n-workspaces', this._updateWorkspaces.bind(this));
workspaceManager.connect('notify::n-workspaces',
this._updateWorkspaces.bind(this));
this._overviewShownId = this._overviewShownId =
Main.overview.connect('shown', () => { Main.overview.connect('shown', () => {
@ -142,8 +138,7 @@ var WorkspacesView = new Lang.Class({
}, },
getActiveWorkspace() { getActiveWorkspace() {
let workspaceManager = global.workspace_manager; let active = global.screen.get_active_workspace_index();
let active = workspaceManager.get_active_workspace_index();
return this._workspaces[active]; return this._workspaces[active];
}, },
@ -174,8 +169,7 @@ var WorkspacesView = new Lang.Class({
}, },
_scrollToActive() { _scrollToActive() {
let workspaceManager = global.workspace_manager; let active = global.screen.get_active_workspace_index();
let active = workspaceManager.get_active_workspace_index();
this._updateWorkspaceActors(true); this._updateWorkspaceActors(true);
this._updateScrollAdjustment(active); this._updateScrollAdjustment(active);
@ -184,8 +178,7 @@ var WorkspacesView = new Lang.Class({
// Update workspace actors parameters // Update workspace actors parameters
// @showAnimation: iff %true, transition between states // @showAnimation: iff %true, transition between states
_updateWorkspaceActors(showAnimation) { _updateWorkspaceActors(showAnimation) {
let workspaceManager = global.workspace_manager; let active = global.screen.get_active_workspace_index();
let active = workspaceManager.get_active_workspace_index();
this._animating = showAnimation; this._animating = showAnimation;
@ -221,8 +214,7 @@ var WorkspacesView = new Lang.Class({
}, },
_updateVisibility() { _updateVisibility() {
let workspaceManager = global.workspace_manager; let active = global.screen.get_active_workspace_index();
let active = workspaceManager.get_active_workspace_index();
for (let w = 0; w < this._workspaces.length; w++) { for (let w = 0; w < this._workspaces.length; w++) {
let workspace = this._workspaces[w]; let workspace = this._workspaces[w];
@ -254,14 +246,13 @@ var WorkspacesView = new Lang.Class({
}, },
_updateWorkspaces() { _updateWorkspaces() {
let workspaceManager = global.workspace_manager; let newNumWorkspaces = global.screen.n_workspaces;
let newNumWorkspaces = workspaceManager.n_workspaces;
this.scrollAdjustment.upper = newNumWorkspaces; this.scrollAdjustment.upper = newNumWorkspaces;
let needsUpdate = false; let needsUpdate = false;
for (let j = 0; j < newNumWorkspaces; j++) { for (let j = 0; j < newNumWorkspaces; j++) {
let metaWorkspace = workspaceManager.get_workspace_by_index(j); let metaWorkspace = global.screen.get_workspace_by_index(j);
let workspace; let workspace;
if (j >= this._workspaces.length) { /* added */ if (j >= this._workspaces.length) { /* added */
@ -299,8 +290,7 @@ var WorkspacesView = new Lang.Class({
this.scrollAdjustment.run_dispose(); this.scrollAdjustment.run_dispose();
Main.overview.disconnect(this._overviewShownId); Main.overview.disconnect(this._overviewShownId);
global.window_manager.disconnect(this._switchWorkspaceNotifyId); global.window_manager.disconnect(this._switchWorkspaceNotifyId);
let workspaceManager = global.workspace_manager; global.screen.disconnect(this._updateWorkspacesId);
workspaceManager.disconnect(this._updateWorkspacesId);
}, },
startSwipeScroll() { startSwipeScroll() {
@ -321,8 +311,7 @@ var WorkspacesView = new Lang.Class({
if (this._animatingScroll) if (this._animatingScroll)
return; return;
let workspaceManager = global.workspace_manager; let active = global.screen.get_active_workspace_index();
let active = workspaceManager.get_active_workspace_index();
let current = Math.round(adj.value); let current = Math.round(adj.value);
if (active != current) { if (active != current) {
@ -604,7 +593,7 @@ var WorkspacesDisplay = new Lang.Class({
_getMonitorIndexForEvent(event) { _getMonitorIndexForEvent(event) {
let [x, y] = event.get_coords(); let [x, y] = event.get_coords();
let rect = new Meta.Rectangle({ x: x, y: y, width: 1, height: 1 }); let rect = new Meta.Rectangle({ x: x, y: y, width: 1, height: 1 });
return global.display.get_monitor_index_for_rect(rect); return global.screen.get_monitor_index_for_rect(rect);
}, },
_getPrimaryView() { _getPrimaryView() {
@ -690,8 +679,7 @@ var WorkspacesDisplay = new Lang.Class({
this._getMonitorIndexForEvent(event) != this._primaryIndex) this._getMonitorIndexForEvent(event) != this._primaryIndex)
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
let workspaceManager = global.workspace_manager; let activeWs = global.screen.get_active_workspace();
let activeWs = workspaceManager.get_active_workspace();
let ws; let ws;
switch (event.get_scroll_direction()) { switch (event.get_scroll_direction()) {
case Clutter.ScrollDirection.UP: case Clutter.ScrollDirection.UP:
@ -710,8 +698,7 @@ var WorkspacesDisplay = new Lang.Class({
_onKeyPressEvent(actor, event) { _onKeyPressEvent(actor, event) {
if (!this.actor.mapped) if (!this.actor.mapped)
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
let workspaceManager = global.workspace_manager; let activeWs = global.screen.get_active_workspace();
let activeWs = workspaceManager.get_active_workspace();
let ws; let ws;
switch (event.get_key_symbol()) { switch (event.get_key_symbol()) {
case Clutter.KEY_Page_Up: case Clutter.KEY_Page_Up:

View File

@ -1,12 +1,12 @@
project('gnome-shell', 'c', project('gnome-shell', 'c',
version: '3.29.90', version: '3.29.2',
meson_version: '>= 0.42.0', meson_version: '>= 0.42.0',
license: 'GPLv2+' license: 'GPLv2+'
) )
# We depend on a specific version of the libmutter API. The mutter variants of # We depend on a specific version of the libmutter API. The mutter variants of
# the Cogl and Clutter libraries also use this API version. # the Cogl and Clutter libraries also use this API version.
mutter_api_version = '3' mutter_api_version = '2'
clutter_pc = 'mutter-clutter-' + mutter_api_version clutter_pc = 'mutter-clutter-' + mutter_api_version
cogl_pc = 'mutter-cogl-' + mutter_api_version cogl_pc = 'mutter-cogl-' + mutter_api_version
@ -23,9 +23,9 @@ gi_req = '>= 1.49.1'
gjs_req = '>= 1.47.0' gjs_req = '>= 1.47.0'
gtk_req = '>= 3.15.0' gtk_req = '>= 3.15.0'
json_glib_req = '>= 0.13.2' json_glib_req = '>= 0.13.2'
mutter_req = '>= 3.29.90' mutter_req = '>= 3.29.2'
polkit_req = '>= 0.100' polkit_req = '>= 0.100'
schemas_req = '>= 3.27.90' schemas_req = '>= 3.21.3'
startup_req = '>= 0.11' startup_req = '>= 0.11'
ibus_req = '>= 1.5.2' ibus_req = '>= 1.5.2'
@ -44,12 +44,10 @@ datadir = join_paths(prefix, get_option('datadir'))
libdir = join_paths(prefix, get_option('libdir')) libdir = join_paths(prefix, get_option('libdir'))
libexecdir = join_paths(prefix, get_option('libexecdir')) libexecdir = join_paths(prefix, get_option('libexecdir'))
mandir = join_paths(prefix, get_option('mandir')) mandir = join_paths(prefix, get_option('mandir'))
sysconfdir = join_paths(prefix, get_option('sysconfdir'))
pkgdatadir = join_paths(datadir, meson.project_name()) pkgdatadir = join_paths(datadir, meson.project_name())
pkglibdir = join_paths(libdir, meson.project_name()) pkglibdir = join_paths(libdir, meson.project_name())
autostartdir = join_paths(sysconfdir, 'xdg', 'autostart')
convertdir = join_paths(datadir, 'GConf', 'gsettings') convertdir = join_paths(datadir, 'GConf', 'gsettings')
desktopdir = join_paths(datadir, 'applications') desktopdir = join_paths(datadir, 'applications')
ifacedir = join_paths(datadir, 'dbus-1', 'interfaces') ifacedir = join_paths(datadir, 'dbus-1', 'interfaces')
@ -61,13 +59,6 @@ servicedir = join_paths(datadir, 'dbus-1', 'services')
plugindir = get_variable('BROWSER_PLUGIN_DIR', mozplugindir) plugindir = get_variable('BROWSER_PLUGIN_DIR', mozplugindir)
# XXX: Once https://github.com/systemd/systemd/issues/9595 is fixed and we can
# depend on this version, replace with something like:
# systemduserunitdir = systemd_dep.get_pkgconfig_variable('systemduserunitdir',
# define_variable: ['prefix', prefix])
# and uncomment systemd_dep below
systemduserunitdir = join_paths(prefix, 'lib', 'systemd', 'user')
keybindings_dep = dependency('gnome-keybindings', required: false) keybindings_dep = dependency('gnome-keybindings', required: false)
if keybindings_dep.found() if keybindings_dep.found()
keysdir = keybindings_dep.get_pkgconfig_variable('keysdir') keysdir = keybindings_dep.get_pkgconfig_variable('keysdir')
@ -126,12 +117,10 @@ else
endif endif
if get_option('systemd') if get_option('systemd')
libsystemd_dep = dependency('libsystemd') systemd_dep = dependency('libsystemd')
# XXX: see systemduserunitdir have_systemd = systemd_dep.found()
# systemd_dep = dependency('systemd')
have_systemd = true
else else
libsystemd_dep = [] systemd_dep = []
have_systemd = false have_systemd = false
endif endif
@ -163,11 +152,6 @@ cdata.set_quoted('PACKAGE_VERSION', meson.project_version())
cdata.set('HAVE_NETWORKMANAGER', have_networkmanager) cdata.set('HAVE_NETWORKMANAGER', have_networkmanager)
cdata.set('HAVE_SYSTEMD', have_systemd) cdata.set('HAVE_SYSTEMD', have_systemd)
# New API added in glib-2.57.2
cdata.set('HAVE_GIO_DESKTOP_LAUNCH_URIS_WITH_FDS',
cc.has_function('g_desktop_app_info_launch_uris_as_manager_with_fds',
dependencies : gio_dep)
)
cdata.set('HAVE_FDWALK', cc.has_function('fdwalk')) cdata.set('HAVE_FDWALK', cc.has_function('fdwalk'))
cdata.set('HAVE_MALLINFO', cc.has_function('mallinfo')) cdata.set('HAVE_MALLINFO', cc.has_function('mallinfo'))
cdata.set('HAVE_SYS_RESOURCE_H', cc.has_header('sys/resource.h')) cdata.set('HAVE_SYS_RESOURCE_H', cc.has_header('sys/resource.h'))
@ -175,10 +159,6 @@ cdata.set('HAVE__NL_TIME_FIRST_WEEKDAY',
cc.has_header_symbol('langinfo.h', '_NL_TIME_FIRST_WEEKDAY') cc.has_header_symbol('langinfo.h', '_NL_TIME_FIRST_WEEKDAY')
) )
cdata.set('HAVE_FDWALK',
cc.has_function('fdwalk')
)
config_h = configure_file( config_h = configure_file(
input: 'config.h.meson', input: 'config.h.meson',
output: 'config.h', output: 'config.h',
@ -205,7 +185,6 @@ subdir('src')
subdir('po') subdir('po')
subdir('data') subdir('data')
subdir('tests') subdir('tests')
subdir('tools')
if get_option('gtk_doc') if get_option('gtk_doc')
subdir('docs/reference') subdir('docs/reference')

View File

@ -40,7 +40,6 @@ js/ui/messageList.js
js/ui/messageTray.js js/ui/messageTray.js
js/ui/mpris.js js/ui/mpris.js
js/ui/notificationDaemon.js js/ui/notificationDaemon.js
js/ui/osdWindow.js
js/ui/overviewControls.js js/ui/overviewControls.js
js/ui/overview.js js/ui/overview.js
js/ui/padOsd.js js/ui/padOsd.js
@ -59,7 +58,6 @@ js/ui/status/location.js
js/ui/status/network.js js/ui/status/network.js
js/ui/status/nightLight.js js/ui/status/nightLight.js
js/ui/status/power.js js/ui/status/power.js
js/ui/status/remoteAccess.js
js/ui/status/rfkill.js js/ui/status/rfkill.js
js/ui/status/system.js js/ui/status/system.js
js/ui/status/thunderbolt.js js/ui/status/thunderbolt.js

View File

@ -10,7 +10,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: HEAD\n" "Project-Id-Version: HEAD\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2018-04-13 19:54+0000\n" "POT-Creation-Date: 2018-03-10 12:32+0000\n"
"PO-Revision-Date: 2018-03-10 21:24+0100\n" "PO-Revision-Date: 2018-03-10 21:24+0100\n"
"Last-Translator: Robert Antoni Buj Gelonch <rbuj@fedoraproject.org>\n" "Last-Translator: Robert Antoni Buj Gelonch <rbuj@fedoraproject.org>\n"
"Language-Team: Catalan <tradgnome@softcatala.org>\n" "Language-Team: Catalan <tradgnome@softcatala.org>\n"
@ -349,7 +349,7 @@ msgid "There was an error loading the preferences dialog for %s:"
msgstr "S'ha produït un error en carregar el diàleg de preferències de %s:" msgstr "S'ha produït un error en carregar el diàleg de preferències de %s:"
#: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71 #: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:153 #: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:148
#: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197 #: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197
#: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919 #: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919
msgid "Cancel" msgid "Cancel"
@ -669,12 +669,12 @@ msgstr "Afegeix als preferits"
msgid "Show Details" msgid "Show Details"
msgstr "Mostra els detalls" msgstr "Mostra els detalls"
#: js/ui/appFavorites.js:140 #: js/ui/appFavorites.js:138
#, javascript-format #, javascript-format
msgid "%s has been added to your favorites." msgid "%s has been added to your favorites."
msgstr "S'ha afegit %s als preferits." msgstr "S'ha afegit %s als preferits."
#: js/ui/appFavorites.js:174 #: js/ui/appFavorites.js:172
#, javascript-format #, javascript-format
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "S'ha suprimit %s dels preferits." msgstr "S'ha suprimit %s dels preferits."
@ -869,7 +869,7 @@ msgstr "S'ha desconnectat un dispositiu extern"
msgid "Open with %s" msgid "Open with %s"
msgstr "Obre amb %s" msgstr "Obre amb %s"
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:295 #: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:284
msgid "Password:" msgid "Password:"
msgstr "Contrasenya:" msgstr "Contrasenya:"
@ -957,15 +957,15 @@ msgstr "Cal introduir una contrasenya per connectar-vos a «%s»."
msgid "Network Manager" msgid "Network Manager"
msgstr "Gestor de connexions de xarxa" msgstr "Gestor de connexions de xarxa"
#: js/ui/components/polkitAgent.js:48 #: js/ui/components/polkitAgent.js:43
msgid "Authentication Required" msgid "Authentication Required"
msgstr "Cal autenticació" msgstr "Cal autenticació"
#: js/ui/components/polkitAgent.js:76 #: js/ui/components/polkitAgent.js:71
msgid "Administrator" msgid "Administrator"
msgstr "Administrador" msgstr "Administrador"
#: js/ui/components/polkitAgent.js:156 #: js/ui/components/polkitAgent.js:151
msgid "Authenticate" msgid "Authenticate"
msgstr "Autentica" msgstr "Autentica"
@ -973,7 +973,7 @@ msgstr "Autentica"
#. * requested authentication was not gained; this can happen #. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password), #. * because of an authentication error (like invalid password),
#. * for instance. #. * for instance.
#: js/ui/components/polkitAgent.js:281 js/ui/shellMountOperation.js:327 #: js/ui/components/polkitAgent.js:270 js/ui/shellMountOperation.js:327
msgid "Sorry, that didnt work. Please try again." msgid "Sorry, that didnt work. Please try again."
msgstr "No ha funcionat. Torneu-ho a provar." msgstr "No ha funcionat. Torneu-ho a provar."
@ -1021,7 +1021,7 @@ msgstr "Afegeix rellotges del món…"
msgid "World Clocks" msgid "World Clocks"
msgstr "Rellotges del món" msgstr "Rellotges del món"
#: js/ui/dateMenu.js:227 #: js/ui/dateMenu.js:225
msgid "Weather" msgid "Weather"
msgstr "El temps" msgstr "El temps"
@ -1029,7 +1029,7 @@ msgstr "El temps"
#. libgweather for the possible condition strings. If at all #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:291 #: js/ui/dateMenu.js:289
#, javascript-format #, javascript-format
msgid "%s all day." msgid "%s all day."
msgstr "%s tot el dia." msgstr "%s tot el dia."
@ -1038,7 +1038,7 @@ msgstr "%s tot el dia."
#. libgweather for the possible condition strings. If at all #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:297 #: js/ui/dateMenu.js:295
#, javascript-format #, javascript-format
msgid "%s, then %s later." msgid "%s, then %s later."
msgstr "%s, llavors %s més tard." msgstr "%s, llavors %s més tard."
@ -1047,30 +1047,30 @@ msgstr "%s, llavors %s més tard."
#. libgweather for the possible condition strings. If at all #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:303 #: js/ui/dateMenu.js:301
#, javascript-format #, javascript-format
msgid "%s, then %s, followed by %s later." msgid "%s, then %s, followed by %s later."
msgstr "%s, llavors %s, seguit per %s més tard." msgstr "%s, llavors %s, seguit per %s més tard."
#: js/ui/dateMenu.js:314 #: js/ui/dateMenu.js:312
msgid "Select a location…" msgid "Select a location…"
msgstr "Trieu una ubicació…" msgstr "Trieu una ubicació…"
#: js/ui/dateMenu.js:317 #: js/ui/dateMenu.js:315
msgid "Loading…" msgid "Loading…"
msgstr "S'està carregant…" msgstr "S'està carregant…"
#. Translators: %s is a temperature with unit, e.g. "23℃" #. Translators: %s is a temperature with unit, e.g. "23℃"
#: js/ui/dateMenu.js:323 #: js/ui/dateMenu.js:321
#, javascript-format #, javascript-format
msgid "Feels like %s." msgid "Feels like %s."
msgstr "Sensació tèrmica de %s." msgstr "Sensació tèrmica de %s."
#: js/ui/dateMenu.js:326 #: js/ui/dateMenu.js:324
msgid "Go online for weather information" msgid "Go online for weather information"
msgstr "Vés en línia per a informació sobre el temps" msgstr "Vés en línia per a informació sobre el temps"
#: js/ui/dateMenu.js:328 #: js/ui/dateMenu.js:326
msgid "Weather information is currently unavailable" msgid "Weather information is currently unavailable"
msgstr "La informació sobre el temps no està disponible" msgstr "La informació sobre el temps no està disponible"
@ -1990,8 +1990,7 @@ msgid ""
"New device has been detected while you were away. Please disconnect and " "New device has been detected while you were away. Please disconnect and "
"reconnect the device to start using it." "reconnect the device to start using it."
msgstr "" msgstr ""
"El nou dispositiu s'ha detectat mentre estàveu absents. Desconnecteu i " "El nou dispositiu s'ha detectat mentre estàveu absents. Desconnecteu i torneu a connectar el dispositiu per a començar a utilitzar-lo."
"torneu a connectar el dispositiu per a començar a utilitzar-lo."
#: js/ui/status/thunderbolt.js:356 #: js/ui/status/thunderbolt.js:356
msgid "Thunderbolt authorization error" msgid "Thunderbolt authorization error"
@ -1999,8 +1998,8 @@ msgstr "S'ha produït un error d'autorització a Thunderbolt"
#: js/ui/status/thunderbolt.js:357 #: js/ui/status/thunderbolt.js:357
#, javascript-format #, javascript-format
msgid "Could not authorize the Thunderbolt device: %s" msgid "Could not authorize the thunderbolt device: %s"
msgstr "No s'ha pogut autoritzar el dispositiu Thunderbolt: %s" msgstr "No s'ha pogut autoritzar el dispositiu thunderbolt: %s"
#: js/ui/status/volume.js:128 #: js/ui/status/volume.js:128
msgid "Volume changed" msgid "Volume changed"

164
po/es.po
View File

@ -9,8 +9,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell.master\n" "Project-Id-Version: gnome-shell.master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2018-07-24 18:34+0000\n" "POT-Creation-Date: 2018-04-13 19:54+0000\n"
"PO-Revision-Date: 2018-07-27 13:15+0200\n" "PO-Revision-Date: 2018-04-25 12:54+0200\n"
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n" "Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
"Language-Team: es <gnome-es-list@gnome.org>\n" "Language-Team: es <gnome-es-list@gnome.org>\n"
"Language: es\n" "Language: es\n"
@ -18,7 +18,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Gtranslator 2.91.7\n" "X-Generator: Gtranslator 2.91.6\n"
#: data/50-gnome-shell-system.xml:6 #: data/50-gnome-shell-system.xml:6
msgid "System" msgid "System"
@ -366,20 +366,20 @@ msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Iniciar sesión" msgstr "Iniciar sesión"
#: js/gdm/loginDialog.js:319 #: js/gdm/loginDialog.js:315
msgid "Choose Session" msgid "Choose Session"
msgstr "Elegir sesión" msgstr "Elegir sesión"
#. translators: this message is shown below the user list on the #. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for #. login screen. It can be activated to reveal an entry for
#. manually entering the username. #. manually entering the username.
#: js/gdm/loginDialog.js:462 #: js/gdm/loginDialog.js:458
msgid "Not listed?" msgid "Not listed?"
msgstr "¿No está en la lista?" msgstr "¿No está en la lista?"
#. Translators: this message is shown below the username entry field #. Translators: this message is shown below the username entry field
#. to clue the user in on how to login to the local network realm #. to clue the user in on how to login to the local network realm
#: js/gdm/loginDialog.js:891 #: js/gdm/loginDialog.js:887
#, javascript-format #, javascript-format
msgid "(e.g., user or %s)" msgid "(e.g., user or %s)"
msgstr "(ej., usuario o %s)" msgstr "(ej., usuario o %s)"
@ -387,12 +387,12 @@ msgstr "(ej., usuario o %s)"
#. TTLS and PEAP are actually much more complicated, but this complication #. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication #. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one) #. (and don't even care of which one)
#: js/gdm/loginDialog.js:896 js/ui/components/networkAgent.js:243 #: js/gdm/loginDialog.js:892 js/ui/components/networkAgent.js:243
#: js/ui/components/networkAgent.js:261 #: js/ui/components/networkAgent.js:261
msgid "Username: " msgid "Username: "
msgstr "Nombre de usuario:" msgstr "Nombre de usuario:"
#: js/gdm/loginDialog.js:1234 #: js/gdm/loginDialog.js:1228
msgid "Login Window" msgid "Login Window"
msgstr "Ventana de inicio de sesión" msgstr "Ventana de inicio de sesión"
@ -405,7 +405,7 @@ msgstr "Error de autenticación"
#. as a cue to display our own message. #. as a cue to display our own message.
#. Translators: this message is shown below the password entry field #. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead #. to indicate the user can swipe their finger instead
#: js/gdm/util.js:485 #: js/gdm/util.js:482
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(o pase el dedo)" msgstr "(o pase el dedo)"
@ -645,23 +645,23 @@ msgstr "Frecuentes"
msgid "All" msgid "All"
msgstr "Todas" msgstr "Todas"
#: js/ui/appDisplay.js:1890 #: js/ui/appDisplay.js:1886
msgid "New Window" msgid "New Window"
msgstr "Ventana nueva" msgstr "Ventana nueva"
#: js/ui/appDisplay.js:1904 #: js/ui/appDisplay.js:1900
msgid "Launch using Dedicated Graphics Card" msgid "Launch using Dedicated Graphics Card"
msgstr "Lanzar usando la tarjeta gráfica dedicada" msgstr "Lanzar usando la tarjeta gráfica dedicada"
#: js/ui/appDisplay.js:1931 js/ui/dash.js:285 #: js/ui/appDisplay.js:1927 js/ui/dash.js:285
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Quitar de los favoritos" msgstr "Quitar de los favoritos"
#: js/ui/appDisplay.js:1937 #: js/ui/appDisplay.js:1933
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Añadir a los favoritos" msgstr "Añadir a los favoritos"
#: js/ui/appDisplay.js:1947 #: js/ui/appDisplay.js:1943
msgid "Show Details" msgid "Show Details"
msgstr "Mostrar detalles" msgstr "Mostrar detalles"
@ -808,35 +808,35 @@ msgctxt "event list time"
msgid "All Day" msgid "All Day"
msgstr "Todo el día" msgstr "Todo el día"
#: js/ui/calendar.js:866 #: js/ui/calendar.js:864
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %d de %B" msgstr "%A, %d de %B"
#: js/ui/calendar.js:870 #: js/ui/calendar.js:868
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d, %Y" msgid "%A, %B %d, %Y"
msgstr "%A, %d de %B de %Y" msgstr "%A, %d de %B de %Y"
#: js/ui/calendar.js:1100 #: js/ui/calendar.js:1086
msgid "No Notifications" msgid "No Notifications"
msgstr "No hay notificaciones" msgstr "No hay notificaciones"
#: js/ui/calendar.js:1103 #: js/ui/calendar.js:1089
msgid "No Events" msgid "No Events"
msgstr "No hay eventos" msgstr "No hay eventos"
#: js/ui/calendar.js:1131 #: js/ui/calendar.js:1117
msgid "Clear All" msgid "Clear All"
msgstr "Limpiar todo" msgstr "Limpiar todo"
#. Translators: %s is an application name #. Translators: %s is an application name
#: js/ui/closeDialog.js:47 #: js/ui/closeDialog.js:44
#, javascript-format #, javascript-format
msgid "“%s” is not responding." msgid "“%s” is not responding."
msgstr "«%s» no responde." msgstr "«%s» no responde."
#: js/ui/closeDialog.js:48 #: js/ui/closeDialog.js:45
msgid "" msgid ""
"You may choose to wait a short while for it to continue or force the " "You may choose to wait a short while for it to continue or force the "
"application to quit entirely." "application to quit entirely."
@ -844,11 +844,11 @@ msgstr ""
"Puede elegir esperar un momento para que continúe o forzar a la aplicación a " "Puede elegir esperar un momento para que continúe o forzar a la aplicación a "
"terminar." "terminar."
#: js/ui/closeDialog.js:64 #: js/ui/closeDialog.js:61
msgid "Force Quit" msgid "Force Quit"
msgstr "Forzar la salida" msgstr "Forzar la salida"
#: js/ui/closeDialog.js:67 #: js/ui/closeDialog.js:64
msgid "Wait" msgid "Wait"
msgstr "Esperar" msgstr "Esperar"
@ -865,7 +865,7 @@ msgstr "Dispositivo externo desconectado"
msgid "Open with %s" msgid "Open with %s"
msgstr "Abrir con %s" msgstr "Abrir con %s"
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:297 #: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:295
msgid "Password:" msgid "Password:"
msgstr "Contraseña:" msgstr "Contraseña:"
@ -902,11 +902,11 @@ msgstr "Contraseña de la clave privada:"
msgid "Service: " msgid "Service: "
msgstr "Servicio:" msgstr "Servicio:"
#: js/ui/components/networkAgent.js:292 js/ui/components/networkAgent.js:664 #: js/ui/components/networkAgent.js:292 js/ui/components/networkAgent.js:659
msgid "Authentication required by wireless network" msgid "Authentication required by wireless network"
msgstr "La red inalámbrica requiere autenticación" msgstr "La red inalámbrica requiere autenticación"
#: js/ui/components/networkAgent.js:293 js/ui/components/networkAgent.js:665 #: js/ui/components/networkAgent.js:293 js/ui/components/networkAgent.js:660
#, javascript-format #, javascript-format
msgid "" msgid ""
"Passwords or encryption keys are required to access the wireless network " "Passwords or encryption keys are required to access the wireless network "
@ -915,7 +915,7 @@ msgstr ""
"Se necesitan contraseñas o claves de cifrado para acceder a la red " "Se necesitan contraseñas o claves de cifrado para acceder a la red "
"inalámbrica «%s»." "inalámbrica «%s»."
#: js/ui/components/networkAgent.js:297 js/ui/components/networkAgent.js:668 #: js/ui/components/networkAgent.js:297 js/ui/components/networkAgent.js:663
msgid "Wired 802.1X authentication" msgid "Wired 802.1X authentication"
msgstr "Autenticación 802.1X cableada" msgstr "Autenticación 802.1X cableada"
@ -923,15 +923,15 @@ msgstr "Autenticación 802.1X cableada"
msgid "Network name: " msgid "Network name: "
msgstr "Nombre de la red: " msgstr "Nombre de la red: "
#: js/ui/components/networkAgent.js:304 js/ui/components/networkAgent.js:672 #: js/ui/components/networkAgent.js:304 js/ui/components/networkAgent.js:667
msgid "DSL authentication" msgid "DSL authentication"
msgstr "Autenticación DSL" msgstr "Autenticación DSL"
#: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:678 #: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:673
msgid "PIN code required" msgid "PIN code required"
msgstr "Código PIN requerido" msgstr "Código PIN requerido"
#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:679 #: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:674
msgid "PIN code is needed for the mobile broadband device" msgid "PIN code is needed for the mobile broadband device"
msgstr "Se necesita un código PIN para el dispositivo de banda ancha móvil" msgstr "Se necesita un código PIN para el dispositivo de banda ancha móvil"
@ -939,17 +939,17 @@ msgstr "Se necesita un código PIN para el dispositivo de banda ancha móvil"
msgid "PIN: " msgid "PIN: "
msgstr "PIN: " msgstr "PIN: "
#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:685 #: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:680
msgid "Mobile broadband network password" msgid "Mobile broadband network password"
msgstr "Contraseña de la red de banda ancha móvil" msgstr "Contraseña de la red de banda ancha móvil"
#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:669 #: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:664
#: js/ui/components/networkAgent.js:673 js/ui/components/networkAgent.js:686 #: js/ui/components/networkAgent.js:668 js/ui/components/networkAgent.js:681
#, javascript-format #, javascript-format
msgid "A password is required to connect to “%s”." msgid "A password is required to connect to “%s”."
msgstr "Se requiere una contraseña para conectarse a «%s»." msgstr "Se requiere una contraseña para conectarse a «%s»."
#: js/ui/components/networkAgent.js:653 js/ui/status/network.js:1704 #: js/ui/components/networkAgent.js:648 js/ui/status/network.js:1691
msgid "Network Manager" msgid "Network Manager"
msgstr "Gestor de la red" msgstr "Gestor de la red"
@ -969,7 +969,7 @@ msgstr "Autenticar"
#. * requested authentication was not gained; this can happen #. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password), #. * because of an authentication error (like invalid password),
#. * for instance. #. * for instance.
#: js/ui/components/polkitAgent.js:283 js/ui/shellMountOperation.js:327 #: js/ui/components/polkitAgent.js:281 js/ui/shellMountOperation.js:327
msgid "Sorry, that didnt work. Please try again." msgid "Sorry, that didnt work. Please try again."
msgstr "Eso no ha funcionado. Inténtelo de nuevo." msgstr "Eso no ha funcionado. Inténtelo de nuevo."
@ -1301,13 +1301,13 @@ msgid "Leave On"
msgstr "Dejar activada" msgstr "Dejar activada"
#: js/ui/kbdA11yDialog.js:59 js/ui/status/bluetooth.js:143 #: js/ui/kbdA11yDialog.js:59 js/ui/status/bluetooth.js:143
#: js/ui/status/network.js:1294 #: js/ui/status/network.js:1281
msgid "Turn On" msgid "Turn On"
msgstr "Encender" msgstr "Encender"
#: js/ui/kbdA11yDialog.js:67 js/ui/status/bluetooth.js:143 #: js/ui/kbdA11yDialog.js:67 js/ui/status/bluetooth.js:143
#: js/ui/status/network.js:154 js/ui/status/network.js:337 #: js/ui/status/network.js:154 js/ui/status/network.js:337
#: js/ui/status/network.js:1294 js/ui/status/network.js:1409 #: js/ui/status/network.js:1281 js/ui/status/network.js:1396
#: js/ui/status/nightLight.js:47 js/ui/status/rfkill.js:90 #: js/ui/status/nightLight.js:47 js/ui/status/rfkill.js:90
#: js/ui/status/rfkill.js:117 #: js/ui/status/rfkill.js:117
msgid "Turn Off" msgid "Turn Off"
@ -1369,7 +1369,7 @@ msgstr "Ver fuente"
msgid "Web Page" msgid "Web Page"
msgstr "Página web" msgstr "Página web"
#: js/ui/messageTray.js:1495 #: js/ui/messageTray.js:1493
msgid "System Information" msgid "System Information"
msgstr "Información del sistema" msgstr "Información del sistema"
@ -1443,22 +1443,22 @@ msgstr "Pulse Esc para salir"
msgid "Press any key to exit" msgid "Press any key to exit"
msgstr "Pulse cualquier tecla para salir" msgstr "Pulse cualquier tecla para salir"
#: js/ui/panel.js:356 #: js/ui/panel.js:355
msgid "Quit" msgid "Quit"
msgstr "Salir" msgstr "Salir"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: js/ui/panel.js:412 #: js/ui/panel.js:411
msgid "Activities" msgid "Activities"
msgstr "Actividades" msgstr "Actividades"
#: js/ui/panel.js:693 #: js/ui/panel.js:692
msgctxt "System menu in the top bar" msgctxt "System menu in the top bar"
msgid "System" msgid "System"
msgstr "Sistema" msgstr "Sistema"
#: js/ui/panel.js:816 #: js/ui/panel.js:811
msgid "Top Bar" msgid "Top Bar"
msgstr "Barra superior" msgstr "Barra superior"
@ -1467,7 +1467,7 @@ msgstr "Barra superior"
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle #. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will #. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches. #. simply result in invisible toggle switches.
#: js/ui/popupMenu.js:300 #: js/ui/popupMenu.js:291
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-intl" msgstr "toggle-switch-intl"
@ -1475,15 +1475,15 @@ msgstr "toggle-switch-intl"
msgid "Enter a Command" msgid "Enter a Command"
msgstr "Introducir un comando" msgstr "Introducir un comando"
#: js/ui/runDialog.js:110 js/ui/windowMenu.js:174 #: js/ui/runDialog.js:110 js/ui/windowMenu.js:175
msgid "Close" msgid "Close"
msgstr "Cerrar" msgstr "Cerrar"
#: js/ui/runDialog.js:274 #: js/ui/runDialog.js:273
msgid "Restart is not available on Wayland" msgid "Restart is not available on Wayland"
msgstr "Reiniciar si no está disponible en Wayland" msgstr "Reiniciar si no está disponible en Wayland"
#: js/ui/runDialog.js:279 #: js/ui/runDialog.js:278
msgid "Restarting…" msgid "Restarting…"
msgstr "Reiniciando…" msgstr "Reiniciando…"
@ -1690,7 +1690,7 @@ msgid "<unknown>"
msgstr "<desconocido>" msgstr "<desconocido>"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:441 js/ui/status/network.js:1323 #: js/ui/status/network.js:441 js/ui/status/network.js:1310
#, javascript-format #, javascript-format
msgid "%s Off" msgid "%s Off"
msgstr "%s apagada" msgstr "%s apagada"
@ -1716,7 +1716,7 @@ msgid "%s Disconnecting"
msgstr "Desconectando %s" msgstr "Desconectando %s"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:459 js/ui/status/network.js:1315 #: js/ui/status/network.js:459 js/ui/status/network.js:1302
#, javascript-format #, javascript-format
msgid "%s Connecting" msgid "%s Connecting"
msgstr "Conectando %s" msgstr "Conectando %s"
@ -1756,7 +1756,7 @@ msgid "Mobile Broadband Settings"
msgstr "Configuración de banda ancha móvil" msgstr "Configuración de banda ancha móvil"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:578 js/ui/status/network.js:1320 #: js/ui/status/network.js:578 js/ui/status/network.js:1307
#, javascript-format #, javascript-format
msgid "%s Hardware Disabled" msgid "%s Hardware Disabled"
msgstr "Hardware %s desactivado" msgstr "Hardware %s desactivado"
@ -1812,81 +1812,81 @@ msgstr "No hay redes"
msgid "Use hardware switch to turn off" msgid "Use hardware switch to turn off"
msgstr "Usar el interruptor hardware para apagar" msgstr "Usar el interruptor hardware para apagar"
#: js/ui/status/network.js:1186 #: js/ui/status/network.js:1173
msgid "Select Network" msgid "Select Network"
msgstr "Seleccionar red" msgstr "Seleccionar red"
#: js/ui/status/network.js:1192 #: js/ui/status/network.js:1179
msgid "Wi-Fi Settings" msgid "Wi-Fi Settings"
msgstr "Configuración de Wi-Fi" msgstr "Configuración de Wi-Fi"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:1311 #: js/ui/status/network.js:1298
#, javascript-format #, javascript-format
msgid "%s Hotspot Active" msgid "%s Hotspot Active"
msgstr "Punto de acceso %s activo" msgstr "Punto de acceso %s activo"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:1326 #: js/ui/status/network.js:1313
#, javascript-format #, javascript-format
msgid "%s Not Connected" msgid "%s Not Connected"
msgstr "%s no conectado" msgstr "%s no conectado"
#: js/ui/status/network.js:1426 #: js/ui/status/network.js:1413
msgid "connecting…" msgid "connecting…"
msgstr "conectando…" msgstr "conectando…"
#. Translators: this is for network connections that require some kind of key or password #. Translators: this is for network connections that require some kind of key or password
#: js/ui/status/network.js:1429 #: js/ui/status/network.js:1416
msgid "authentication required" msgid "authentication required"
msgstr "se necesita autenticación" msgstr "se necesita autenticación"
#: js/ui/status/network.js:1431 #: js/ui/status/network.js:1418
msgid "connection failed" msgid "connection failed"
msgstr "falló la conexión" msgstr "falló la conexión"
#: js/ui/status/network.js:1485 #: js/ui/status/network.js:1472
msgid "VPN Settings" msgid "VPN Settings"
msgstr "Configuración de VPN" msgstr "Configuración de VPN"
#: js/ui/status/network.js:1498 #: js/ui/status/network.js:1485
msgid "VPN" msgid "VPN"
msgstr "VPN" msgstr "VPN"
#: js/ui/status/network.js:1508 #: js/ui/status/network.js:1495
msgid "VPN Off" msgid "VPN Off"
msgstr "VPN apagada" msgstr "VPN apagada"
#: js/ui/status/network.js:1572 js/ui/status/rfkill.js:93 #: js/ui/status/network.js:1559 js/ui/status/rfkill.js:93
msgid "Network Settings" msgid "Network Settings"
msgstr "Configuración de la red" msgstr "Configuración de la red"
#: js/ui/status/network.js:1601 #: js/ui/status/network.js:1588
#, javascript-format #, javascript-format
msgid "%s Wired Connection" msgid "%s Wired Connection"
msgid_plural "%s Wired Connections" msgid_plural "%s Wired Connections"
msgstr[0] "%s conexión cableada" msgstr[0] "%s conexión cableada"
msgstr[1] "%s conexiones cableadas" msgstr[1] "%s conexiones cableadas"
#: js/ui/status/network.js:1605 #: js/ui/status/network.js:1592
#, javascript-format #, javascript-format
msgid "%s Wi-Fi Connection" msgid "%s Wi-Fi Connection"
msgid_plural "%s Wi-Fi Connections" msgid_plural "%s Wi-Fi Connections"
msgstr[0] "%s conexión inalámbrica" msgstr[0] "%s conexión inalámbrica"
msgstr[1] "%s conexiones inalámbricas" msgstr[1] "%s conexiones inalámbricas"
#: js/ui/status/network.js:1609 #: js/ui/status/network.js:1596
#, javascript-format #, javascript-format
msgid "%s Modem Connection" msgid "%s Modem Connection"
msgid_plural "%s Modem Connections" msgid_plural "%s Modem Connections"
msgstr[0] "%s conexión por módem" msgstr[0] "%s conexión por módem"
msgstr[1] "%s conexiones por módem" msgstr[1] "%s conexiones por módem"
#: js/ui/status/network.js:1741 #: js/ui/status/network.js:1728
msgid "Connection failed" msgid "Connection failed"
msgstr "Falló la conexión" msgstr "Falló la conexión"
#: js/ui/status/network.js:1742 #: js/ui/status/network.js:1729
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "Falló la activación de la conexión de red" msgstr "Falló la activación de la conexión de red"
@ -1937,15 +1937,6 @@ msgstr "%d%02d para la carga completa (%d%%)"
msgid "%d%%" msgid "%d%%"
msgstr "%d%%" msgstr "%d%%"
#: js/ui/status/remoteAccess.js:45
msgid "Screen is Being Shared"
msgstr "Se está compartiendo la pantalla"
#: js/ui/status/remoteAccess.js:47
#| msgid "Turn Off"
msgid "Turn off"
msgstr "Apagar"
#. The menu only appears when airplane mode is on, so just #. The menu only appears when airplane mode is on, so just
#. statically build it as if it was on, rather than dynamically #. statically build it as if it was on, rather than dynamically
#. changing the menu contents. #. changing the menu contents.
@ -1977,16 +1968,16 @@ msgstr "Suspender"
msgid "Power Off" msgid "Power Off"
msgstr "Apagar" msgstr "Apagar"
#: js/ui/status/thunderbolt.js:298 #: js/ui/status/thunderbolt.js:294
msgid "Thunderbolt" msgid "Thunderbolt"
msgstr "Thunderbolt" msgstr "Thunderbolt"
#. we are done #. we are done
#: js/ui/status/thunderbolt.js:354 #: js/ui/status/thunderbolt.js:350
msgid "Unknown Thunderbolt device" msgid "Unknown Thunderbolt device"
msgstr "Dispositivo Thunderbolt desconocido" msgstr "Dispositivo Thunderbolt desconocido"
#: js/ui/status/thunderbolt.js:355 #: js/ui/status/thunderbolt.js:351
msgid "" msgid ""
"New device has been detected while you were away. Please disconnect and " "New device has been detected while you were away. Please disconnect and "
"reconnect the device to start using it." "reconnect the device to start using it."
@ -1994,12 +1985,13 @@ msgstr ""
"Se ha detectado un dispositivo nuevo mientras estaba fuera. Desconéctelo y " "Se ha detectado un dispositivo nuevo mientras estaba fuera. Desconéctelo y "
"vuélvalo a conectar para empezar a usarlo." "vuélvalo a conectar para empezar a usarlo."
#: js/ui/status/thunderbolt.js:360 #: js/ui/status/thunderbolt.js:356
msgid "Thunderbolt authorization error" msgid "Thunderbolt authorization error"
msgstr "Error de autorización de Thunderbolt" msgstr "Error de autorización de Thunderbolt"
#: js/ui/status/thunderbolt.js:361 #: js/ui/status/thunderbolt.js:357
#, javascript-format #, javascript-format
#| msgid "Could not authorize the thunderbolt device: %s"
msgid "Could not authorize the Thunderbolt device: %s" msgid "Could not authorize the Thunderbolt device: %s"
msgstr "No se pudo autorizar el dispositivo Thunderbolt: %s" msgstr "No se pudo autorizar el dispositivo Thunderbolt: %s"
@ -2084,7 +2076,7 @@ msgstr[1] "La configuración se revertirá en %d segundos"
#. Translators: This represents the size of a window. The first number is #. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height. #. * the width of the window and the second is the height.
#: js/ui/windowManager.js:668 #: js/ui/windowManager.js:660
#, javascript-format #, javascript-format
msgid "%d × %d" msgid "%d × %d"
msgstr "%d × %d" msgstr "%d × %d"
@ -2137,19 +2129,19 @@ msgstr "Subir a un área de trabajo"
msgid "Move to Workspace Down" msgid "Move to Workspace Down"
msgstr "Bajar a un área de trabajo" msgstr "Bajar a un área de trabajo"
#: js/ui/windowMenu.js:139 #: js/ui/windowMenu.js:140
msgid "Move to Monitor Up" msgid "Move to Monitor Up"
msgstr "Mover a la pantalla de arriba" msgstr "Mover a la pantalla de arriba"
#: js/ui/windowMenu.js:148 #: js/ui/windowMenu.js:149
msgid "Move to Monitor Down" msgid "Move to Monitor Down"
msgstr "Mover a la pantalla de abajo" msgstr "Mover a la pantalla de abajo"
#: js/ui/windowMenu.js:157 #: js/ui/windowMenu.js:158
msgid "Move to Monitor Left" msgid "Move to Monitor Left"
msgstr "Mover a la pantalla de la izquierda" msgstr "Mover a la pantalla de la izquierda"
#: js/ui/windowMenu.js:166 #: js/ui/windowMenu.js:167
msgid "Move to Monitor Right" msgid "Move to Monitor Right"
msgstr "Mover a la pantalla de la derecha" msgstr "Mover a la pantalla de la derecha"
@ -2180,12 +2172,12 @@ msgstr ""
msgid "List possible modes" msgid "List possible modes"
msgstr "Listar los modos posibles" msgstr "Listar los modos posibles"
#: src/shell-app.c:272 #: src/shell-app.c:270
msgctxt "program" msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "Desconocido" msgstr "Desconocido"
#: src/shell-app.c:523 #: src/shell-app.c:511
#, c-format #, c-format
msgid "Failed to launch “%s”" msgid "Failed to launch “%s”"
msgstr "Falló al lanzar «%s»" msgstr "Falló al lanzar «%s»"

View File

@ -14,22 +14,22 @@
# Alain Lojewski <allomervan@gmail.com>, 2014-2018. # Alain Lojewski <allomervan@gmail.com>, 2014-2018.
# Erwan Georget <egeorget@opmbx.org>, 2016. # Erwan Georget <egeorget@opmbx.org>, 2016.
# Claude Paroz <claude@2xlibre.net>, 2010-2011, 2016. # Claude Paroz <claude@2xlibre.net>, 2010-2011, 2016.
# Charles Monzat <superboa@hotmail.fr>, 2016, 2018. # Charles Monzat <superboa@hotmail.fr>, 2016.
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell master fr\n" "Project-Id-Version: gnome-shell master fr\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2018-04-13 19:54+0000\n" "POT-Creation-Date: 2018-03-03 10:22+0000\n"
"PO-Revision-Date: 2018-04-18 19:30+0200\n" "PO-Revision-Date: 2018-03-01 09:00+0100\n"
"Last-Translator: Charles Monzat <superboa@hotmail.fr>\n" "Last-Translator: Alain Lojewski <allomervan@gmail.com>\n"
"Language-Team: français <gnomefr@traduc.org>\n" "Language-Team: français <gnomefr@traduc.org>\n"
"Language: fr\n" "Language: fr\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: Gtranslator 2.91.7\n" "X-Generator: Poedit 1.8.12\n"
#: data/50-gnome-shell-system.xml:6 #: data/50-gnome-shell-system.xml:6
msgid "System" msgid "System"
@ -234,7 +234,7 @@ msgstr ""
#: data/org.gnome.shell.gschema.xml.in:116 #: data/org.gnome.shell.gschema.xml.in:116
msgid "Keybinding to open the overview" msgid "Keybinding to open the overview"
msgstr "Combinaison de touches pour ouvrir la vue densemble" msgstr "Combinaison de touches pour ouvrir la vue d'ensemble"
#: data/org.gnome.shell.gschema.xml.in:117 #: data/org.gnome.shell.gschema.xml.in:117
msgid "Keybinding to open the Activities Overview." msgid "Keybinding to open the Activities Overview."
@ -329,7 +329,7 @@ msgstr ""
#: data/org.gnome.shell.gschema.xml.in:206 #: data/org.gnome.shell.gschema.xml.in:206
msgid "Enable edge tiling when dropping windows on screen edges" msgid "Enable edge tiling when dropping windows on screen edges"
msgstr "Activer lempilage des fenêtres déposées sur les bords de lécran" msgstr "Activer lempilage des fenêtres déposées sur les bords de l'écran"
#: data/org.gnome.shell.gschema.xml.in:214 #: data/org.gnome.shell.gschema.xml.in:214
msgid "Workspaces are managed dynamically" msgid "Workspaces are managed dynamically"
@ -362,7 +362,7 @@ msgstr ""
"préférences de %s :" "préférences de %s :"
#: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71 #: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:153 #: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:148
#: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197 #: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197
#: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919 #: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919
msgid "Cancel" msgid "Cancel"
@ -682,12 +682,12 @@ msgstr "Ajouter aux favoris"
msgid "Show Details" msgid "Show Details"
msgstr "Afficher les détails" msgstr "Afficher les détails"
#: js/ui/appFavorites.js:140 #: js/ui/appFavorites.js:138
#, javascript-format #, javascript-format
msgid "%s has been added to your favorites." msgid "%s has been added to your favorites."
msgstr "%s a été ajouté à vos favoris." msgstr "%s a été ajouté à vos favoris."
#: js/ui/appFavorites.js:174 #: js/ui/appFavorites.js:172
#, javascript-format #, javascript-format
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "%s a été supprimé de vos favoris." msgstr "%s a été supprimé de vos favoris."
@ -897,7 +897,7 @@ msgstr "Disque externe déconnecté"
msgid "Open with %s" msgid "Open with %s"
msgstr "Ouvrir avec %s" msgstr "Ouvrir avec %s"
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:295 #: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:284
msgid "Password:" msgid "Password:"
msgstr "Mot de passe :" msgstr "Mot de passe :"
@ -985,15 +985,15 @@ msgstr "Un mot de passe est requis pour se connecter à « %s »."
msgid "Network Manager" msgid "Network Manager"
msgstr "Gestionnaire de réseau" msgstr "Gestionnaire de réseau"
#: js/ui/components/polkitAgent.js:48 #: js/ui/components/polkitAgent.js:43
msgid "Authentication Required" msgid "Authentication Required"
msgstr "Authentification nécessaire" msgstr "Authentification nécessaire"
#: js/ui/components/polkitAgent.js:76 #: js/ui/components/polkitAgent.js:71
msgid "Administrator" msgid "Administrator"
msgstr "Administrateur" msgstr "Administrateur"
#: js/ui/components/polkitAgent.js:156 #: js/ui/components/polkitAgent.js:151
msgid "Authenticate" msgid "Authenticate"
msgstr "Sauthentifier" msgstr "Sauthentifier"
@ -1001,7 +1001,7 @@ msgstr "Sauthentifier"
#. * requested authentication was not gained; this can happen #. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password), #. * because of an authentication error (like invalid password),
#. * for instance. #. * for instance.
#: js/ui/components/polkitAgent.js:281 js/ui/shellMountOperation.js:327 #: js/ui/components/polkitAgent.js:270 js/ui/shellMountOperation.js:327
msgid "Sorry, that didnt work. Please try again." msgid "Sorry, that didnt work. Please try again."
msgstr "Échec de lauthentification. Essayez à nouveau." msgstr "Échec de lauthentification. Essayez à nouveau."
@ -1061,7 +1061,7 @@ msgstr "Ajouter des horloges locales…"
msgid "World Clocks" msgid "World Clocks"
msgstr "Horloges locales" msgstr "Horloges locales"
#: js/ui/dateMenu.js:227 #: js/ui/dateMenu.js:225
msgid "Weather" msgid "Weather"
msgstr "Météo" msgstr "Météo"
@ -1069,7 +1069,7 @@ msgstr "Météo"
#. libgweather for the possible condition strings. If at all #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:291 #: js/ui/dateMenu.js:289
#, javascript-format #, javascript-format
msgid "%s all day." msgid "%s all day."
msgstr "%s toute la journée." msgstr "%s toute la journée."
@ -1078,7 +1078,7 @@ msgstr "%s toute la journée."
#. libgweather for the possible condition strings. If at all #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:297 #: js/ui/dateMenu.js:295
#, javascript-format #, javascript-format
msgid "%s, then %s later." msgid "%s, then %s later."
msgstr "%s, puis %s plus tard." msgstr "%s, puis %s plus tard."
@ -1087,30 +1087,30 @@ msgstr "%s, puis %s plus tard."
#. libgweather for the possible condition strings. If at all #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:303 #: js/ui/dateMenu.js:301
#, javascript-format #, javascript-format
msgid "%s, then %s, followed by %s later." msgid "%s, then %s, followed by %s later."
msgstr "%s, puis %s, suivi par %s plus tard." msgstr "%s, puis %s, suivi par %s plus tard."
#: js/ui/dateMenu.js:314 #: js/ui/dateMenu.js:312
msgid "Select a location…" msgid "Select a location…"
msgstr "Choisir un emplacement…" msgstr "Choisir un emplacement…"
#: js/ui/dateMenu.js:317 #: js/ui/dateMenu.js:315
msgid "Loading…" msgid "Loading…"
msgstr "Chargement…" msgstr "Chargement…"
#. Translators: %s is a temperature with unit, e.g. "23℃" #. Translators: %s is a temperature with unit, e.g. "23℃"
#: js/ui/dateMenu.js:323 #: js/ui/dateMenu.js:321
#, javascript-format #, javascript-format
msgid "Feels like %s." msgid "Feels like %s."
msgstr "Température ressentie : %s." msgstr "Température ressentie : %s."
#: js/ui/dateMenu.js:326 #: js/ui/dateMenu.js:324
msgid "Go online for weather information" msgid "Go online for weather information"
msgstr "Chercher les informations météorologiques en ligne" msgstr "Chercher les informations météorologiques en ligne"
#: js/ui/dateMenu.js:328 #: js/ui/dateMenu.js:326
msgid "Weather information is currently unavailable" msgid "Weather information is currently unavailable"
msgstr "Les informations météorologiques ne sont pas disponibles actuellement" msgstr "Les informations météorologiques ne sont pas disponibles actuellement"
@ -1706,7 +1706,7 @@ msgstr "Paramètres de confidentialité"
#: js/ui/status/location.js:196 #: js/ui/status/location.js:196
msgid "Location In Use" msgid "Location In Use"
msgstr "Localisation en cours dutilisation" msgstr "Localisation en cours d'utilisation"
#: js/ui/status/location.js:200 #: js/ui/status/location.js:200
msgid "Location Disabled" msgid "Location Disabled"
@ -1947,11 +1947,11 @@ msgstr "Reprendre"
#: js/ui/status/nightLight.js:71 #: js/ui/status/nightLight.js:71
msgid "Disable Until Tomorrow" msgid "Disable Until Tomorrow"
msgstr "Désactiver jusquà demain" msgstr "Désactiver jusqu'à demain"
#: js/ui/status/power.js:61 #: js/ui/status/power.js:61
msgid "Power Settings" msgid "Power Settings"
msgstr "Paramètres de gestion de lénergie" msgstr "Paramètres de gestion de l'énergie"
#: js/ui/status/power.js:77 #: js/ui/status/power.js:77
msgid "Fully Charged" msgid "Fully Charged"
@ -2011,16 +2011,16 @@ msgstr "Mettre en veille"
msgid "Power Off" msgid "Power Off"
msgstr "Éteindre" msgstr "Éteindre"
#: js/ui/status/thunderbolt.js:294 #: js/ui/status/thunderbolt.js:272
msgid "Thunderbolt" msgid "Thunderbolt"
msgstr "Interface Thunderbolt" msgstr "Interface Thunderbolt"
#. we are done #. we are done
#: js/ui/status/thunderbolt.js:350 #: js/ui/status/thunderbolt.js:328
msgid "Unknown Thunderbolt device" msgid "Unknown Thunderbolt device"
msgstr "Périphérique Thunderbolt inconnu" msgstr "Périphérique Thunderbolt inconnu"
#: js/ui/status/thunderbolt.js:351 #: js/ui/status/thunderbolt.js:329
msgid "" msgid ""
"New device has been detected while you were away. Please disconnect and " "New device has been detected while you were away. Please disconnect and "
"reconnect the device to start using it." "reconnect the device to start using it."
@ -2028,14 +2028,13 @@ msgstr ""
"Un nouveau périphérique a été détecté pendant votre absence. Veuillez le " "Un nouveau périphérique a été détecté pendant votre absence. Veuillez le "
"débrancher et rebrancher avant de commencer à lutiliser" "débrancher et rebrancher avant de commencer à lutiliser"
#: js/ui/status/thunderbolt.js:356 #: js/ui/status/thunderbolt.js:334
msgid "Thunderbolt authorization error" msgid "Thunderbolt authorization error"
msgstr "Erreur dautorisation Thunderbolt" msgstr "Erreur dautorisation Thunderbolt"
#: js/ui/status/thunderbolt.js:357 #: js/ui/status/thunderbolt.js:335
#, javascript-format #, javascript-format
#| msgid "Could not authorize the thunderbolt device: %s" msgid "Could not authorize the thunderbolt device: %s"
msgid "Could not authorize the Thunderbolt device: %s"
msgstr "Impossible dautoriser le périphérique Thunderbolt : %s" msgstr "Impossible dautoriser le périphérique Thunderbolt : %s"
#: js/ui/status/volume.js:128 #: js/ui/status/volume.js:128

1595
po/oc.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -12,14 +12,14 @@
# Valery Kirichenko <valera5505@gmail.com>, 2014. # Valery Kirichenko <valera5505@gmail.com>, 2014.
# Yuri Myasoedov <ymyasoedov@yandex.ru>, 2012, 2013, 2014. # Yuri Myasoedov <ymyasoedov@yandex.ru>, 2012, 2013, 2014.
# Ivan Komaritsyn <vantu5z@mail.ru>, 2015. # Ivan Komaritsyn <vantu5z@mail.ru>, 2015.
# Stas Solovey <whats_up@tut.by>, 2011, 2013, 2014, 2015, 2016, 2017, 2018. # Stas Solovey <whats_up@tut.by>, 2011, 2013, 2014, 2015, 2016, 2017.
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell\n" "Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2018-04-19 20:33+0000\n" "POT-Creation-Date: 2018-04-13 18:31+0000\n"
"PO-Revision-Date: 2018-07-17 00:25+0300\n" "PO-Revision-Date: 2018-04-19 23:31+0300\n"
"Last-Translator: Stas Solovey <whats_up@tut.by>\n" "Last-Translator: Stas Solovey <whats_up@tut.by>\n"
"Language-Team: Русский <gnome-cyr@gnome.org>\n" "Language-Team: Русский <gnome-cyr@gnome.org>\n"
"Language: ru\n" "Language: ru\n"
@ -28,7 +28,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Poedit 2.0.9\n" "X-Generator: Poedit 2.0.6\n"
#: data/50-gnome-shell-system.xml:6 #: data/50-gnome-shell-system.xml:6
msgid "System" msgid "System"
@ -364,20 +364,20 @@ msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Войти" msgstr "Войти"
#: js/gdm/loginDialog.js:319 #: js/gdm/loginDialog.js:315
msgid "Choose Session" msgid "Choose Session"
msgstr "Выбрать сеанс" msgstr "Выбрать сеанс"
#. translators: this message is shown below the user list on the #. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for #. login screen. It can be activated to reveal an entry for
#. manually entering the username. #. manually entering the username.
#: js/gdm/loginDialog.js:462 #: js/gdm/loginDialog.js:458
msgid "Not listed?" msgid "Not listed?"
msgstr "Нет в списке?" msgstr "Нет в списке?"
#. Translators: this message is shown below the username entry field #. Translators: this message is shown below the username entry field
#. to clue the user in on how to login to the local network realm #. to clue the user in on how to login to the local network realm
#: js/gdm/loginDialog.js:891 #: js/gdm/loginDialog.js:887
#, javascript-format #, javascript-format
msgid "(e.g., user or %s)" msgid "(e.g., user or %s)"
msgstr "(например, пользователь или %s)" msgstr "(например, пользователь или %s)"
@ -385,12 +385,12 @@ msgstr "(например, пользователь или %s)"
#. TTLS and PEAP are actually much more complicated, but this complication #. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication #. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one) #. (and don't even care of which one)
#: js/gdm/loginDialog.js:896 js/ui/components/networkAgent.js:243 #: js/gdm/loginDialog.js:892 js/ui/components/networkAgent.js:243
#: js/ui/components/networkAgent.js:261 #: js/ui/components/networkAgent.js:261
msgid "Username: " msgid "Username: "
msgstr "Имя пользователя: " msgstr "Имя пользователя: "
#: js/gdm/loginDialog.js:1234 #: js/gdm/loginDialog.js:1228
msgid "Login Window" msgid "Login Window"
msgstr "Окно входа в систему" msgstr "Окно входа в систему"
@ -2053,7 +2053,7 @@ msgstr "Ошибка авторизации Thunderbolt"
#: js/ui/status/thunderbolt.js:357 #: js/ui/status/thunderbolt.js:357
#, javascript-format #, javascript-format
msgid "Could not authorize the Thunderbolt device: %s" msgid "Could not authorize the thunderbolt device: %s"
msgstr "Не удалось авторизовать устройство Thunderbolt: %s" msgstr "Не удалось авторизовать устройство Thunderbolt: %s"
#: js/ui/status/volume.js:128 #: js/ui/status/volume.js:128

160
po/sl.po
View File

@ -8,8 +8,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2018-07-30 17:00+0000\n" "POT-Creation-Date: 2018-04-17 15:11+0000\n"
"PO-Revision-Date: 2018-07-30 22:14+0200\n" "PO-Revision-Date: 2018-04-17 18:32+0200\n"
"Last-Translator: Matej Urbančič <mateju@svn.gnome.org>\n" "Last-Translator: Matej Urbančič <mateju@svn.gnome.org>\n"
"Language-Team: Slovenian GNOME Translation Team <gnome-si@googlegroups.com>\n" "Language-Team: Slovenian GNOME Translation Team <gnome-si@googlegroups.com>\n"
"Language: sl\n" "Language: sl\n"
@ -352,20 +352,20 @@ msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Prijava" msgstr "Prijava"
#: js/gdm/loginDialog.js:319 #: js/gdm/loginDialog.js:315
msgid "Choose Session" msgid "Choose Session"
msgstr "Izbor seje" msgstr "Izbor seje"
#. translators: this message is shown below the user list on the #. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for #. login screen. It can be activated to reveal an entry for
#. manually entering the username. #. manually entering the username.
#: js/gdm/loginDialog.js:462 #: js/gdm/loginDialog.js:458
msgid "Not listed?" msgid "Not listed?"
msgstr "Ali uporabniškega imena ni na seznamu?" msgstr "Ali uporabniškega imena ni na seznamu?"
#. Translators: this message is shown below the username entry field #. Translators: this message is shown below the username entry field
#. to clue the user in on how to login to the local network realm #. to clue the user in on how to login to the local network realm
#: js/gdm/loginDialog.js:891 #: js/gdm/loginDialog.js:887
#, javascript-format #, javascript-format
msgid "(e.g., user or %s)" msgid "(e.g., user or %s)"
msgstr "(na primer, uporabnika ali %s)" msgstr "(na primer, uporabnika ali %s)"
@ -373,12 +373,12 @@ msgstr "(na primer, uporabnika ali %s)"
#. TTLS and PEAP are actually much more complicated, but this complication #. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication #. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one) #. (and don't even care of which one)
#: js/gdm/loginDialog.js:896 js/ui/components/networkAgent.js:243 #: js/gdm/loginDialog.js:892 js/ui/components/networkAgent.js:243
#: js/ui/components/networkAgent.js:261 #: js/ui/components/networkAgent.js:261
msgid "Username: " msgid "Username: "
msgstr "Uporabniško ime: " msgstr "Uporabniško ime: "
#: js/gdm/loginDialog.js:1234 #: js/gdm/loginDialog.js:1228
msgid "Login Window" msgid "Login Window"
msgstr "Prijavno okno" msgstr "Prijavno okno"
@ -391,7 +391,7 @@ msgstr "Napaka overitve"
#. as a cue to display our own message. #. as a cue to display our own message.
#. Translators: this message is shown below the password entry field #. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead #. to indicate the user can swipe their finger instead
#: js/gdm/util.js:485 #: js/gdm/util.js:482
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(ali pa povlecite prst)" msgstr "(ali pa povlecite prst)"
@ -643,23 +643,23 @@ msgstr "Pogosti"
msgid "All" msgid "All"
msgstr "Vsi" msgstr "Vsi"
#: js/ui/appDisplay.js:1890 #: js/ui/appDisplay.js:1886
msgid "New Window" msgid "New Window"
msgstr "Novo okno" msgstr "Novo okno"
#: js/ui/appDisplay.js:1904 #: js/ui/appDisplay.js:1900
msgid "Launch using Dedicated Graphics Card" msgid "Launch using Dedicated Graphics Card"
msgstr "Zaženi z uporabo določene grafične kartice" msgstr "Zaženi z uporabo določene grafične kartice"
#: js/ui/appDisplay.js:1931 js/ui/dash.js:285 #: js/ui/appDisplay.js:1927 js/ui/dash.js:285
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Odstrani iz priljubljenih" msgstr "Odstrani iz priljubljenih"
#: js/ui/appDisplay.js:1937 #: js/ui/appDisplay.js:1933
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Dodaj med priljubljene" msgstr "Dodaj med priljubljene"
#: js/ui/appDisplay.js:1947 #: js/ui/appDisplay.js:1943
msgid "Show Details" msgid "Show Details"
msgstr "Pokaži besedilo" msgstr "Pokaži besedilo"
@ -806,35 +806,35 @@ msgctxt "event list time"
msgid "All Day" msgid "All Day"
msgstr "Celodnevno" msgstr "Celodnevno"
#: js/ui/calendar.js:866 #: js/ui/calendar.js:864
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %d. %m." msgstr "%A, %d. %m."
#: js/ui/calendar.js:870 #: js/ui/calendar.js:868
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d, %Y" msgid "%A, %B %d, %Y"
msgstr "%A, %d %B %Y" msgstr "%A, %d %B %Y"
#: js/ui/calendar.js:1100 #: js/ui/calendar.js:1086
msgid "No Notifications" msgid "No Notifications"
msgstr "Ni obvestil" msgstr "Ni obvestil"
#: js/ui/calendar.js:1103 #: js/ui/calendar.js:1089
msgid "No Events" msgid "No Events"
msgstr "Ni dogodkov" msgstr "Ni dogodkov"
#: js/ui/calendar.js:1131 #: js/ui/calendar.js:1117
msgid "Clear All" msgid "Clear All"
msgstr "Počisti vse" msgstr "Počisti vse"
#. Translators: %s is an application name #. Translators: %s is an application name
#: js/ui/closeDialog.js:47 #: js/ui/closeDialog.js:44
#, javascript-format #, javascript-format
msgid "“%s” is not responding." msgid "“%s” is not responding."
msgstr "Program »%s« se ne odziva." msgstr "Program »%s« se ne odziva."
#: js/ui/closeDialog.js:48 #: js/ui/closeDialog.js:45
msgid "" msgid ""
"You may choose to wait a short while for it to continue or force the " "You may choose to wait a short while for it to continue or force the "
"application to quit entirely." "application to quit entirely."
@ -842,11 +842,11 @@ msgstr ""
"Lahko počakate, če se program morda začne spet odzivati, lahko pa vsilite " "Lahko počakate, če se program morda začne spet odzivati, lahko pa vsilite "
"končanje delovanja." "končanje delovanja."
#: js/ui/closeDialog.js:64 #: js/ui/closeDialog.js:61
msgid "Force Quit" msgid "Force Quit"
msgstr "Vsili končanje" msgstr "Vsili končanje"
#: js/ui/closeDialog.js:67 #: js/ui/closeDialog.js:64
msgid "Wait" msgid "Wait"
msgstr "Počakaj" msgstr "Počakaj"
@ -863,7 +863,7 @@ msgstr "Zunanji pogon je odklopljen"
msgid "Open with %s" msgid "Open with %s"
msgstr "Odpri s programom %s" msgstr "Odpri s programom %s"
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:297 #: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:295
msgid "Password:" msgid "Password:"
msgstr "Geslo:" msgstr "Geslo:"
@ -900,11 +900,11 @@ msgstr "Geslo zasebnega ključa: "
msgid "Service: " msgid "Service: "
msgstr "Storitev: " msgstr "Storitev: "
#: js/ui/components/networkAgent.js:292 js/ui/components/networkAgent.js:664 #: js/ui/components/networkAgent.js:292 js/ui/components/networkAgent.js:659
msgid "Authentication required by wireless network" msgid "Authentication required by wireless network"
msgstr "Zahtevana overitev za brezžično omrežje" msgstr "Zahtevana overitev za brezžično omrežje"
#: js/ui/components/networkAgent.js:293 js/ui/components/networkAgent.js:665 #: js/ui/components/networkAgent.js:293 js/ui/components/networkAgent.js:660
#, javascript-format #, javascript-format
msgid "" msgid ""
"Passwords or encryption keys are required to access the wireless network " "Passwords or encryption keys are required to access the wireless network "
@ -913,7 +913,7 @@ msgstr ""
"Za povezavo v brezžično omrežje »%s« je zahtevano geslo oziroma šifrirni " "Za povezavo v brezžično omrežje »%s« je zahtevano geslo oziroma šifrirni "
"ključ." "ključ."
#: js/ui/components/networkAgent.js:297 js/ui/components/networkAgent.js:668 #: js/ui/components/networkAgent.js:297 js/ui/components/networkAgent.js:663
msgid "Wired 802.1X authentication" msgid "Wired 802.1X authentication"
msgstr "Žična overitev 802.1X" msgstr "Žična overitev 802.1X"
@ -921,15 +921,15 @@ msgstr "Žična overitev 802.1X"
msgid "Network name: " msgid "Network name: "
msgstr "Naziv omrežja: " msgstr "Naziv omrežja: "
#: js/ui/components/networkAgent.js:304 js/ui/components/networkAgent.js:672 #: js/ui/components/networkAgent.js:304 js/ui/components/networkAgent.js:667
msgid "DSL authentication" msgid "DSL authentication"
msgstr "Overitev DSL" msgstr "Overitev DSL"
#: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:678 #: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:673
msgid "PIN code required" msgid "PIN code required"
msgstr "Zahtevana koda PIN" msgstr "Zahtevana koda PIN"
#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:679 #: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:674
msgid "PIN code is needed for the mobile broadband device" msgid "PIN code is needed for the mobile broadband device"
msgstr "Za napravo mobilnega širokopasovnega dostopa je zahtevana koda PIN." msgstr "Za napravo mobilnega širokopasovnega dostopa je zahtevana koda PIN."
@ -937,17 +937,17 @@ msgstr "Za napravo mobilnega širokopasovnega dostopa je zahtevana koda PIN."
msgid "PIN: " msgid "PIN: "
msgstr "Koda PIN: " msgstr "Koda PIN: "
#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:685 #: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:680
msgid "Mobile broadband network password" msgid "Mobile broadband network password"
msgstr "Geslo mobilnega širokopasovnega dostopa" msgstr "Geslo mobilnega širokopasovnega dostopa"
#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:669 #: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:664
#: js/ui/components/networkAgent.js:673 js/ui/components/networkAgent.js:686 #: js/ui/components/networkAgent.js:668 js/ui/components/networkAgent.js:681
#, javascript-format #, javascript-format
msgid "A password is required to connect to “%s”." msgid "A password is required to connect to “%s”."
msgstr "Za povezavo z omrežjem »%s« je zahtevano geslo." msgstr "Za povezavo z omrežjem »%s« je zahtevano geslo."
#: js/ui/components/networkAgent.js:653 js/ui/status/network.js:1704 #: js/ui/components/networkAgent.js:648 js/ui/status/network.js:1691
msgid "Network Manager" msgid "Network Manager"
msgstr "Upravljalnik omrežij" msgstr "Upravljalnik omrežij"
@ -967,7 +967,7 @@ msgstr "Overi"
#. * requested authentication was not gained; this can happen #. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password), #. * because of an authentication error (like invalid password),
#. * for instance. #. * for instance.
#: js/ui/components/polkitAgent.js:283 js/ui/shellMountOperation.js:327 #: js/ui/components/polkitAgent.js:281 js/ui/shellMountOperation.js:327
msgid "Sorry, that didnt work. Please try again." msgid "Sorry, that didnt work. Please try again."
msgstr "Overitev je spodletela.. Poskusite znova." msgstr "Overitev je spodletela.. Poskusite znova."
@ -1309,13 +1309,13 @@ msgid "Leave On"
msgstr "Pusti omogočeno" msgstr "Pusti omogočeno"
#: js/ui/kbdA11yDialog.js:59 js/ui/status/bluetooth.js:143 #: js/ui/kbdA11yDialog.js:59 js/ui/status/bluetooth.js:143
#: js/ui/status/network.js:1294 #: js/ui/status/network.js:1281
msgid "Turn On" msgid "Turn On"
msgstr "Omogoči" msgstr "Omogoči"
#: js/ui/kbdA11yDialog.js:67 js/ui/status/bluetooth.js:143 #: js/ui/kbdA11yDialog.js:67 js/ui/status/bluetooth.js:143
#: js/ui/status/network.js:154 js/ui/status/network.js:337 #: js/ui/status/network.js:154 js/ui/status/network.js:337
#: js/ui/status/network.js:1294 js/ui/status/network.js:1409 #: js/ui/status/network.js:1281 js/ui/status/network.js:1396
#: js/ui/status/nightLight.js:47 js/ui/status/rfkill.js:90 #: js/ui/status/nightLight.js:47 js/ui/status/rfkill.js:90
#: js/ui/status/rfkill.js:117 #: js/ui/status/rfkill.js:117
msgid "Turn Off" msgid "Turn Off"
@ -1377,7 +1377,7 @@ msgstr "Poglej vir"
msgid "Web Page" msgid "Web Page"
msgstr "Spletna stran" msgstr "Spletna stran"
#: js/ui/messageTray.js:1495 #: js/ui/messageTray.js:1493
msgid "System Information" msgid "System Information"
msgstr "Podrobnosti sistema" msgstr "Podrobnosti sistema"
@ -1451,22 +1451,22 @@ msgstr "Pritisnite tipko Esc za končanje"
msgid "Press any key to exit" msgid "Press any key to exit"
msgstr "Pritisnite katerokoli tipko za končanje" msgstr "Pritisnite katerokoli tipko za končanje"
#: js/ui/panel.js:356 #: js/ui/panel.js:355
msgid "Quit" msgid "Quit"
msgstr "Končaj" msgstr "Končaj"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: js/ui/panel.js:412 #: js/ui/panel.js:411
msgid "Activities" msgid "Activities"
msgstr "Dejavnosti" msgstr "Dejavnosti"
#: js/ui/panel.js:693 #: js/ui/panel.js:692
msgctxt "System menu in the top bar" msgctxt "System menu in the top bar"
msgid "System" msgid "System"
msgstr "Sistem" msgstr "Sistem"
#: js/ui/panel.js:816 #: js/ui/panel.js:811
msgid "Top Bar" msgid "Top Bar"
msgstr "Vrhnja vrstica" msgstr "Vrhnja vrstica"
@ -1475,7 +1475,7 @@ msgstr "Vrhnja vrstica"
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle #. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will #. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches. #. simply result in invisible toggle switches.
#: js/ui/popupMenu.js:300 #: js/ui/popupMenu.js:291
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-intl" msgstr "toggle-switch-intl"
@ -1483,15 +1483,15 @@ msgstr "toggle-switch-intl"
msgid "Enter a Command" msgid "Enter a Command"
msgstr "Vnos ukaza" msgstr "Vnos ukaza"
#: js/ui/runDialog.js:110 js/ui/windowMenu.js:174 #: js/ui/runDialog.js:110 js/ui/windowMenu.js:175
msgid "Close" msgid "Close"
msgstr "Zapri" msgstr "Zapri"
#: js/ui/runDialog.js:274 #: js/ui/runDialog.js:273
msgid "Restart is not available on Wayland" msgid "Restart is not available on Wayland"
msgstr "Na sistemu Wayland je na voljo ponovni zagon" msgstr "Na sistemu Wayland je na voljo ponovni zagon"
#: js/ui/runDialog.js:279 #: js/ui/runDialog.js:278
msgid "Restarting…" msgid "Restarting…"
msgstr "Ponovno zaganjanje ...." msgstr "Ponovno zaganjanje ...."
@ -1706,7 +1706,7 @@ msgid "<unknown>"
msgstr "<neznano>" msgstr "<neznano>"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:441 js/ui/status/network.js:1323 #: js/ui/status/network.js:441 js/ui/status/network.js:1310
#, javascript-format #, javascript-format
msgid "%s Off" msgid "%s Off"
msgstr "%s izklopljeno" msgstr "%s izklopljeno"
@ -1732,7 +1732,7 @@ msgid "%s Disconnecting"
msgstr "%s poteka prekinjanje povezave" msgstr "%s poteka prekinjanje povezave"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:459 js/ui/status/network.js:1315 #: js/ui/status/network.js:459 js/ui/status/network.js:1302
#, javascript-format #, javascript-format
msgid "%s Connecting" msgid "%s Connecting"
msgstr "%s poteka vzpostavljanje povezave" msgstr "%s poteka vzpostavljanje povezave"
@ -1772,7 +1772,7 @@ msgid "Mobile Broadband Settings"
msgstr "Nastavitve mobilnega širokopasovnega dostopa" msgstr "Nastavitve mobilnega širokopasovnega dostopa"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:578 js/ui/status/network.js:1320 #: js/ui/status/network.js:578 js/ui/status/network.js:1307
#, javascript-format #, javascript-format
msgid "%s Hardware Disabled" msgid "%s Hardware Disabled"
msgstr "%s strojno onemogočeno" msgstr "%s strojno onemogočeno"
@ -1828,56 +1828,56 @@ msgstr "Ni zaznanih omrežij"
msgid "Use hardware switch to turn off" msgid "Use hardware switch to turn off"
msgstr "Uporabite strojni gumb za izklop" msgstr "Uporabite strojni gumb za izklop"
#: js/ui/status/network.js:1186 #: js/ui/status/network.js:1173
msgid "Select Network" msgid "Select Network"
msgstr "Izbor omrežja" msgstr "Izbor omrežja"
#: js/ui/status/network.js:1192 #: js/ui/status/network.js:1179
msgid "Wi-Fi Settings" msgid "Wi-Fi Settings"
msgstr "Nastavitve Wi-Fi" msgstr "Nastavitve Wi-Fi"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:1311 #: js/ui/status/network.js:1298
#, javascript-format #, javascript-format
msgid "%s Hotspot Active" msgid "%s Hotspot Active"
msgstr "%s vroča točka je dejavna" msgstr "%s vroča točka je dejavna"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:1326 #: js/ui/status/network.js:1313
#, javascript-format #, javascript-format
msgid "%s Not Connected" msgid "%s Not Connected"
msgstr "%s brez povezave" msgstr "%s brez povezave"
#: js/ui/status/network.js:1426 #: js/ui/status/network.js:1413
msgid "connecting…" msgid "connecting…"
msgstr "vzpostavljanje povezave …" msgstr "vzpostavljanje povezave …"
#. Translators: this is for network connections that require some kind of key or password #. Translators: this is for network connections that require some kind of key or password
#: js/ui/status/network.js:1429 #: js/ui/status/network.js:1416
msgid "authentication required" msgid "authentication required"
msgstr "zahtevana je overitev" msgstr "zahtevana je overitev"
#: js/ui/status/network.js:1431 #: js/ui/status/network.js:1418
msgid "connection failed" msgid "connection failed"
msgstr "povezovanje je spodletelo" msgstr "povezovanje je spodletelo"
#: js/ui/status/network.js:1485 #: js/ui/status/network.js:1472
msgid "VPN Settings" msgid "VPN Settings"
msgstr "Nastavitve VPN" msgstr "Nastavitve VPN"
#: js/ui/status/network.js:1498 #: js/ui/status/network.js:1485
msgid "VPN" msgid "VPN"
msgstr "VPN" msgstr "VPN"
#: js/ui/status/network.js:1508 #: js/ui/status/network.js:1495
msgid "VPN Off" msgid "VPN Off"
msgstr "Onemogočen VPN" msgstr "Onemogočen VPN"
#: js/ui/status/network.js:1572 js/ui/status/rfkill.js:93 #: js/ui/status/network.js:1559 js/ui/status/rfkill.js:93
msgid "Network Settings" msgid "Network Settings"
msgstr "Omrežne nastavitve" msgstr "Omrežne nastavitve"
#: js/ui/status/network.js:1601 #: js/ui/status/network.js:1588
#, javascript-format #, javascript-format
msgid "%s Wired Connection" msgid "%s Wired Connection"
msgid_plural "%s Wired Connections" msgid_plural "%s Wired Connections"
@ -1886,7 +1886,7 @@ msgstr[1] "%s žična povezava"
msgstr[2] "%s žični povezavi" msgstr[2] "%s žični povezavi"
msgstr[3] "%s žične povezave" msgstr[3] "%s žične povezave"
#: js/ui/status/network.js:1605 #: js/ui/status/network.js:1592
#, javascript-format #, javascript-format
msgid "%s Wi-Fi Connection" msgid "%s Wi-Fi Connection"
msgid_plural "%s Wi-Fi Connections" msgid_plural "%s Wi-Fi Connections"
@ -1895,7 +1895,7 @@ msgstr[1] "%s povezava Wi-Fi"
msgstr[2] "%s povezavi Wi-Fi" msgstr[2] "%s povezavi Wi-Fi"
msgstr[3] "%s povezave Wi-Fi" msgstr[3] "%s povezave Wi-Fi"
#: js/ui/status/network.js:1609 #: js/ui/status/network.js:1596
#, javascript-format #, javascript-format
msgid "%s Modem Connection" msgid "%s Modem Connection"
msgid_plural "%s Modem Connections" msgid_plural "%s Modem Connections"
@ -1904,11 +1904,11 @@ msgstr[1] "%s modemska povezava"
msgstr[2] "%s modemski povezavi" msgstr[2] "%s modemski povezavi"
msgstr[3] "%s modemske povezave" msgstr[3] "%s modemske povezave"
#: js/ui/status/network.js:1741 #: js/ui/status/network.js:1728
msgid "Connection failed" msgid "Connection failed"
msgstr "Povezovanje je spodletelo" msgstr "Povezovanje je spodletelo"
#: js/ui/status/network.js:1742 #: js/ui/status/network.js:1729
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "Omogočanje omrežne povezave je spodletelo." msgstr "Omogočanje omrežne povezave je spodletelo."
@ -1959,14 +1959,6 @@ msgstr "%d%02d do polnosti (%d%%)"
msgid "%d%%" msgid "%d%%"
msgstr "%d%%" msgstr "%d%%"
#: js/ui/status/remoteAccess.js:46
msgid "Screen is Being Shared"
msgstr "Zaslon je v načinu souporabe"
#: js/ui/status/remoteAccess.js:48
msgid "Turn off"
msgstr "Izklopi"
#. The menu only appears when airplane mode is on, so just #. The menu only appears when airplane mode is on, so just
#. statically build it as if it was on, rather than dynamically #. statically build it as if it was on, rather than dynamically
#. changing the menu contents. #. changing the menu contents.
@ -1998,16 +1990,16 @@ msgstr "V pripravljenost"
msgid "Power Off" msgid "Power Off"
msgstr "Izklop" msgstr "Izklop"
#: js/ui/status/thunderbolt.js:298 #: js/ui/status/thunderbolt.js:294
msgid "Thunderbolt" msgid "Thunderbolt"
msgstr "Thunderbolt" msgstr "Thunderbolt"
#. we are done #. we are done
#: js/ui/status/thunderbolt.js:354 #: js/ui/status/thunderbolt.js:350
msgid "Unknown Thunderbolt device" msgid "Unknown Thunderbolt device"
msgstr "Neznana naprava Thunderbolt" msgstr "Neznana naprava Thunderbolt"
#: js/ui/status/thunderbolt.js:355 #: js/ui/status/thunderbolt.js:351
msgid "" msgid ""
"New device has been detected while you were away. Please disconnect and " "New device has been detected while you were away. Please disconnect and "
"reconnect the device to start using it." "reconnect the device to start using it."
@ -2015,11 +2007,11 @@ msgstr ""
"Med nedejavnostjo je bila zaznana nova. Odklopite napravo in jo znova " "Med nedejavnostjo je bila zaznana nova. Odklopite napravo in jo znova "
"priklopite za uporabo." "priklopite za uporabo."
#: js/ui/status/thunderbolt.js:360 #: js/ui/status/thunderbolt.js:356
msgid "Thunderbolt authorization error" msgid "Thunderbolt authorization error"
msgstr "Napaka overitve naprave Thunderbolt" msgstr "Napaka overitve naprave Thunderbolt"
#: js/ui/status/thunderbolt.js:361 #: js/ui/status/thunderbolt.js:357
#, javascript-format #, javascript-format
msgid "Could not authorize the Thunderbolt device: %s" msgid "Could not authorize the Thunderbolt device: %s"
msgstr "Naprave Thunderbolt ni mogoče overiti: %s" msgstr "Naprave Thunderbolt ni mogoče overiti: %s"
@ -2107,7 +2099,7 @@ msgstr[3] "Spremembe nastavitev bodo povrnjene v %d sekundah."
#. Translators: This represents the size of a window. The first number is #. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height. #. * the width of the window and the second is the height.
#: js/ui/windowManager.js:668 #: js/ui/windowManager.js:660
#, javascript-format #, javascript-format
msgid "%d × %d" msgid "%d × %d"
msgstr "%d × %d" msgstr "%d × %d"
@ -2160,19 +2152,19 @@ msgstr "Premakni na zgornjo delovno površino"
msgid "Move to Workspace Down" msgid "Move to Workspace Down"
msgstr "Premakni na spodnjo delovno površino" msgstr "Premakni na spodnjo delovno površino"
#: js/ui/windowMenu.js:139 #: js/ui/windowMenu.js:140
msgid "Move to Monitor Up" msgid "Move to Monitor Up"
msgstr "Premakni na zaslon zgoraj" msgstr "Premakni na zaslon zgoraj"
#: js/ui/windowMenu.js:148 #: js/ui/windowMenu.js:149
msgid "Move to Monitor Down" msgid "Move to Monitor Down"
msgstr "Premakni na zaslon spodaj" msgstr "Premakni na zaslon spodaj"
#: js/ui/windowMenu.js:157 #: js/ui/windowMenu.js:158
msgid "Move to Monitor Left" msgid "Move to Monitor Left"
msgstr "Premakni na zaslon levo" msgstr "Premakni na zaslon levo"
#: js/ui/windowMenu.js:166 #: js/ui/windowMenu.js:167
msgid "Move to Monitor Right" msgid "Move to Monitor Right"
msgstr "Premakni na zaslon desno" msgstr "Premakni na zaslon desno"
@ -2201,12 +2193,12 @@ msgstr "Uporabi poseben način, na primer »gdm« za prijavni zaslon"
msgid "List possible modes" msgid "List possible modes"
msgstr "Seznam mogočih načinov" msgstr "Seznam mogočih načinov"
#: src/shell-app.c:272 #: src/shell-app.c:270
msgctxt "program" msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "Neznano" msgstr "Neznano"
#: src/shell-app.c:523 #: src/shell-app.c:511
#, c-format #, c-format
msgid "Failed to launch “%s”" msgid "Failed to launch “%s”"
msgstr "Zaganjanje »%s« je spodletelo" msgstr "Zaganjanje »%s« je spodletelo"

View File

@ -167,19 +167,22 @@ gnome_shell_plugin_init (GnomeShellPlugin *shell_plugin)
static gboolean static gboolean
gnome_shell_plugin_has_swap_event (GnomeShellPlugin *shell_plugin) gnome_shell_plugin_has_swap_event (GnomeShellPlugin *shell_plugin)
{ {
MetaPlugin *plugin = META_PLUGIN (shell_plugin);
CoglDisplay *cogl_display = CoglDisplay *cogl_display =
cogl_context_get_display (shell_plugin->cogl_context); cogl_context_get_display (shell_plugin->cogl_context);
CoglRenderer *renderer = cogl_display_get_renderer (cogl_display); CoglRenderer *renderer = cogl_display_get_renderer (cogl_display);
const char * (* query_extensions_string) (Display *dpy, int screen); const char * (* query_extensions_string) (Display *dpy, int screen);
Bool (* query_extension) (Display *dpy, int *error, int *event); Bool (* query_extension) (Display *dpy, int *error, int *event);
MetaScreen *screen;
Display *xdisplay; Display *xdisplay;
int screen_number;
const char *glx_extensions; const char *glx_extensions;
/* We will only get swap events if Cogl is using GLX */ /* We will only get swap events if Cogl is using GLX */
if (cogl_renderer_get_winsys_id (renderer) != COGL_WINSYS_ID_GLX) if (cogl_renderer_get_winsys_id (renderer) != COGL_WINSYS_ID_GLX)
return FALSE; return FALSE;
screen = meta_plugin_get_screen (plugin);
xdisplay = clutter_x11_get_default_display (); xdisplay = clutter_x11_get_default_display ();
query_extensions_string = query_extensions_string =
@ -191,8 +194,9 @@ gnome_shell_plugin_has_swap_event (GnomeShellPlugin *shell_plugin)
&shell_plugin->glx_error_base, &shell_plugin->glx_error_base,
&shell_plugin->glx_event_base); &shell_plugin->glx_event_base);
screen_number = XDefaultScreen (xdisplay); glx_extensions =
glx_extensions = query_extensions_string (xdisplay, screen_number); query_extensions_string (xdisplay,
meta_screen_get_screen_number (screen));
return strstr (glx_extensions, "GLX_INTEL_swap_event") != NULL; return strstr (glx_extensions, "GLX_INTEL_swap_event") != NULL;
} }

View File

@ -31,6 +31,8 @@ extern GType gnome_shell_plugin_get_type (void);
#define SHELL_DBUS_SERVICE "org.gnome.Shell" #define SHELL_DBUS_SERVICE "org.gnome.Shell"
#define MAGNIFIER_DBUS_SERVICE "org.gnome.Magnifier" #define MAGNIFIER_DBUS_SERVICE "org.gnome.Magnifier"
#define OVERRIDES_SCHEMA "org.gnome.shell.overrides"
#define WM_NAME "GNOME Shell" #define WM_NAME "GNOME Shell"
#define GNOME_WM_KEYBINDINGS "Mutter,GNOME Shell" #define GNOME_WM_KEYBINDINGS "Mutter,GNOME Shell"
@ -170,6 +172,26 @@ shell_dbus_init (gboolean replace)
g_object_unref (session); g_object_unref (session);
} }
static void
shell_prefs_init (void)
{
ShellGlobal *global = shell_global_get ();
GSettings *settings = shell_global_get_overrides_settings (global);
GSettingsSchema *schema;
char **keys, **k;
if (!settings)
return;
g_object_get (G_OBJECT (settings), "settings-schema", &schema, NULL);
for (keys = k = g_settings_schema_list_keys (schema); *k; k++)
meta_prefs_override_preference_schema (*k, g_settings_schema_get_id (schema));
g_strfreev (keys);
g_settings_schema_unref (schema);
}
static void static void
shell_introspection_init (void) shell_introspection_init (void)
{ {
@ -487,6 +509,8 @@ main (int argc, char **argv)
_shell_global_init ("session-mode", session_mode, NULL); _shell_global_init ("session-mode", session_mode, NULL);
shell_prefs_init ();
dump_gjs_stack_on_signal (SIGABRT); dump_gjs_stack_on_signal (SIGABRT);
dump_gjs_stack_on_signal (SIGFPE); dump_gjs_stack_on_signal (SIGFPE);
dump_gjs_stack_on_signal (SIGIOT); dump_gjs_stack_on_signal (SIGIOT);

View File

@ -53,7 +53,7 @@ gnome_shell_deps = [
canberra_dep, canberra_gtk_dep, canberra_dep, canberra_gtk_dep,
polkit_dep, polkit_dep,
gcr_dep, gcr_dep,
libsystemd_dep systemd_dep
] ]
gnome_shell_deps += nm_deps gnome_shell_deps += nm_deps

View File

@ -7,8 +7,6 @@
#include <glib/gi18n-lib.h> #include <glib/gi18n-lib.h>
#include <meta/display.h> #include <meta/display.h>
#include <meta/meta-workspace-manager.h>
#include <meta/meta-x11-display.h>
#include "shell-app-private.h" #include "shell-app-private.h"
#include "shell-enum-types.h" #include "shell-enum-types.h"
@ -360,17 +358,6 @@ find_most_recent_transient_on_same_workspace (MetaDisplay *display,
return result; return result;
} }
static MetaWorkspace *
get_active_workspace (void)
{
ShellGlobal *global = shell_global_get ();
MetaDisplay *display = shell_global_get_display (global);
MetaWorkspaceManager *workspace_manager =
meta_display_get_workspace_manager (display);
return meta_workspace_manager_get_active_workspace (workspace_manager);
}
/** /**
* shell_app_activate_window: * shell_app_activate_window:
* @app: a #ShellApp * @app: a #ShellApp
@ -404,8 +391,9 @@ shell_app_activate_window (ShellApp *app,
{ {
GSList *windows_reversed, *iter; GSList *windows_reversed, *iter;
ShellGlobal *global = shell_global_get (); ShellGlobal *global = shell_global_get ();
MetaDisplay *display = shell_global_get_display (global); MetaScreen *screen = shell_global_get_screen (global);
MetaWorkspace *active = get_active_workspace (); MetaDisplay *display = meta_screen_get_display (screen);
MetaWorkspace *active = meta_screen_get_active_workspace (screen);
MetaWorkspace *workspace = meta_window_get_workspace (window); MetaWorkspace *workspace = meta_window_get_workspace (window);
guint32 last_user_timestamp = meta_display_get_last_user_time (display); guint32 last_user_timestamp = meta_display_get_last_user_time (display);
MetaWindow *most_recent_transient; MetaWindow *most_recent_transient;
@ -551,46 +539,15 @@ void
shell_app_open_new_window (ShellApp *app, shell_app_open_new_window (ShellApp *app,
int workspace) int workspace)
{ {
GActionGroup *group = NULL;
const char * const *actions;
g_return_if_fail (app->info != NULL); g_return_if_fail (app->info != NULL);
/* First check whether the application provides a "new-window" desktop /* Here we just always launch the application again, even if we know
* action - it is a safe bet that it will open a new window, and activating
* it will trigger startup notification if necessary
*/
actions = g_desktop_app_info_list_actions (G_DESKTOP_APP_INFO (app->info));
if (g_strv_contains (actions, "new-window"))
{
shell_app_launch_action (app, "new-window", 0, workspace);
return;
}
/* Next, check whether the app exports an explicit "new-window" action
* that we can activate on the bus - the muxer will add startup notification
* information to the platform data, so this should work just as well as
* desktop actions.
*/
group = app->running_state ? G_ACTION_GROUP (app->running_state->muxer)
: NULL;
if (group &&
g_action_group_has_action (group, "app.new-window") &&
g_action_group_get_action_parameter_type (group, "app.new-window") == NULL)
{
g_action_group_activate_action (group, "app.new-window", NULL);
return;
}
/* Lastly, just always launch the application again, even if we know
* it was already running. For most applications this * it was already running. For most applications this
* should have the effect of creating a new window, whether that's * should have the effect of creating a new window, whether that's
* a second process (in the case of Calculator) or IPC to existing * a second process (in the case of Calculator) or IPC to existing
* instance (Firefox). There are a few less-sensical cases such * instance (Firefox). There are a few less-sensical cases such
* as say Pidgin. * as say Pidgin. Ideally, we have the application express to us
* that it supports an explicit new-window action.
*/ */
shell_app_launch (app, 0, workspace, FALSE, NULL); shell_app_launch (app, 0, workspace, FALSE, NULL);
} }
@ -617,7 +574,10 @@ shell_app_can_open_new_window (ShellApp *app)
state = app->running_state; state = app->running_state;
/* If the app has an explicit new-window action, then it can /* If the app has an explicit new-window action, then it can
(or it should be able to) ...
(or it should be able to - we don't actually call the action
because we need to trigger startup notification, so it still
depends on what the app decides to do for Activate vs ActivateAction)
*/ */
if (g_action_group_has_action (G_ACTION_GROUP (state->muxer), "app.new-window")) if (g_action_group_has_action (G_ACTION_GROUP (state->muxer), "app.new-window"))
return TRUE; return TRUE;
@ -726,7 +686,7 @@ shell_app_get_windows (ShellApp *app)
{ {
CompareWindowsData data; CompareWindowsData data;
data.app = app; data.app = app;
data.active_workspace = get_active_workspace (); data.active_workspace = meta_screen_get_active_workspace (shell_global_get_screen (shell_global_get ()));
app->running_state->windows = g_slist_sort_with_data (app->running_state->windows, shell_app_compare_windows, &data); app->running_state->windows = g_slist_sort_with_data (app->running_state->windows, shell_app_compare_windows, &data);
app->running_state->window_sort_stale = FALSE; app->running_state->window_sort_stale = FALSE;
} }
@ -962,7 +922,7 @@ shell_app_on_skip_taskbar_changed (MetaWindow *window,
} }
static void static void
shell_app_on_ws_switch (MetaWorkspaceManager *workspace_manager, shell_app_on_ws_switch (MetaScreen *screen,
int from, int from,
int to, int to,
MetaMotionDirection direction, MetaMotionDirection direction,
@ -1155,11 +1115,11 @@ _shell_app_handle_startup_sequence (ShellApp *app,
*/ */
if (starting && shell_app_get_state (app) == SHELL_APP_STATE_STOPPED) if (starting && shell_app_get_state (app) == SHELL_APP_STATE_STOPPED)
{ {
MetaDisplay *display = shell_global_get_display (shell_global_get ()); MetaScreen *screen = shell_global_get_screen (shell_global_get ());
MetaX11Display *x11_display = meta_display_get_x11_display (display); MetaDisplay *display = meta_screen_get_display (screen);
shell_app_state_transition (app, SHELL_APP_STATE_STARTING); shell_app_state_transition (app, SHELL_APP_STATE_STARTING);
meta_x11_display_focus_the_no_focus_window (x11_display, meta_display_focus_the_no_focus_window (display, screen,
sn_startup_sequence_get_timestamp (sequence)); sn_startup_sequence_get_timestamp (sequence));
app->started_on_workspace = sn_startup_sequence_get_workspace (sequence); app->started_on_workspace = sn_startup_sequence_get_workspace (sequence);
} }
@ -1207,7 +1167,7 @@ shell_app_request_quit (ShellApp *app)
return TRUE; return TRUE;
} }
#if !defined(HAVE_GIO_DESKTOP_LAUNCH_URIS_WITH_FDS) && defined(HAVE_SYSTEMD) #ifdef HAVE_SYSTEMD
/* This sets up the launched application to log to the journal /* This sets up the launched application to log to the journal
* using its own identifier, instead of just "gnome-session". * using its own identifier, instead of just "gnome-session".
*/ */
@ -1255,7 +1215,6 @@ shell_app_launch (ShellApp *app,
ShellGlobal *global; ShellGlobal *global;
GAppLaunchContext *context; GAppLaunchContext *context;
gboolean ret; gboolean ret;
GSpawnFlags flags;
if (app->info == NULL) if (app->info == NULL)
{ {
@ -1275,39 +1234,9 @@ shell_app_launch (ShellApp *app,
if (discrete_gpu) if (discrete_gpu)
g_app_launch_context_setenv (context, "DRI_PRIME", "1"); g_app_launch_context_setenv (context, "DRI_PRIME", "1");
/* Set LEAVE_DESCRIPTORS_OPEN in order to use an optimized gspawn
* codepath. The shell's open file descriptors should be marked CLOEXEC
* so that they are automatically closed even with this flag set.
*/
flags = G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD |
G_SPAWN_LEAVE_DESCRIPTORS_OPEN;
#ifdef HAVE_GIO_DESKTOP_LAUNCH_URIS_WITH_FDS
/* Optimized spawn path, avoiding a child_setup function */
{
int journalfd = -1;
#ifdef HAVE_SYSTEMD
journalfd = sd_journal_stream_fd (shell_app_get_id (app), LOG_INFO, FALSE);
#endif /* HAVE_SYSTEMD */
ret = g_desktop_app_info_launch_uris_as_manager_with_fds (app->info, NULL,
context,
flags,
NULL, NULL,
wait_pid, NULL,
-1,
journalfd,
journalfd,
error);
if (journalfd >= 0)
(void) close (journalfd);
}
#else /* !HAVE_GIO_DESKTOP_LAUNCH_URIS_WITH_FDS */
ret = g_desktop_app_info_launch_uris_as_manager (app->info, NULL, ret = g_desktop_app_info_launch_uris_as_manager (app->info, NULL,
context, context,
flags, G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD,
#ifdef HAVE_SYSTEMD #ifdef HAVE_SYSTEMD
app_child_setup, (gpointer)shell_app_get_id (app), app_child_setup, (gpointer)shell_app_get_id (app),
#else #else
@ -1315,7 +1244,6 @@ shell_app_launch (ShellApp *app,
#endif #endif
wait_pid, NULL, wait_pid, NULL,
error); error);
#endif /* HAVE_GIO_DESKTOP_LAUNCH_URIS_WITH_FDS */
g_object_unref (context); g_object_unref (context);
return ret; return ret;
@ -1362,17 +1290,15 @@ shell_app_get_app_info (ShellApp *app)
static void static void
create_running_state (ShellApp *app) create_running_state (ShellApp *app)
{ {
MetaDisplay *display = shell_global_get_display (shell_global_get ()); MetaScreen *screen;
MetaWorkspaceManager *workspace_manager =
meta_display_get_workspace_manager (display);
g_assert (app->running_state == NULL); g_assert (app->running_state == NULL);
screen = shell_global_get_screen (shell_global_get ());
app->running_state = g_slice_new0 (ShellAppRunningState); app->running_state = g_slice_new0 (ShellAppRunningState);
app->running_state->refcount = 1; app->running_state->refcount = 1;
app->running_state->workspace_switch_id = app->running_state->workspace_switch_id =
g_signal_connect (workspace_manager, "workspace-switched", g_signal_connect (screen, "workspace-switched", G_CALLBACK(shell_app_on_ws_switch), app);
G_CALLBACK (shell_app_on_ws_switch), app);
app->running_state->session = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL); app->running_state->session = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL);
g_assert (app->running_state->session != NULL); g_assert (app->running_state->session != NULL);
@ -1423,9 +1349,7 @@ shell_app_update_app_menu (ShellApp *app,
static void static void
unref_running_state (ShellAppRunningState *state) unref_running_state (ShellAppRunningState *state)
{ {
MetaDisplay *display = shell_global_get_display (shell_global_get ()); MetaScreen *screen;
MetaWorkspaceManager *workspace_manager =
meta_display_get_workspace_manager (display);
g_assert (state->refcount > 0); g_assert (state->refcount > 0);
@ -1433,7 +1357,8 @@ unref_running_state (ShellAppRunningState *state)
if (state->refcount > 0) if (state->refcount > 0)
return; return;
g_signal_handler_disconnect (workspace_manager, state->workspace_switch_id); screen = shell_global_get_screen (shell_global_get ());
g_signal_handler_disconnect (screen, state->workspace_switch_id);
g_clear_object (&state->application_proxy); g_clear_object (&state->application_proxy);

View File

@ -28,8 +28,6 @@
#include <meta/meta-shaped-texture.h> #include <meta/meta-shaped-texture.h>
#include <meta/meta-cursor-tracker.h> #include <meta/meta-cursor-tracker.h>
#include <meta/meta-settings.h> #include <meta/meta-settings.h>
#include <meta/meta-workspace-manager.h>
#include <meta/meta-x11-display.h>
#ifdef HAVE_SYSTEMD #ifdef HAVE_SYSTEMD
#include <systemd/sd-journal.h> #include <systemd/sd-journal.h>
@ -62,10 +60,9 @@ struct _ShellGlobal {
Window stage_xwindow; Window stage_xwindow;
MetaDisplay *meta_display; MetaDisplay *meta_display;
MetaWorkspaceManager *workspace_manager;
GdkDisplay *gdk_display; GdkDisplay *gdk_display;
MetaX11Display *x11_display;
Display *xdisplay; Display *xdisplay;
MetaScreen *meta_screen;
char *session_mode; char *session_mode;
@ -99,8 +96,8 @@ enum {
PROP_0, PROP_0,
PROP_SESSION_MODE, PROP_SESSION_MODE,
PROP_SCREEN,
PROP_DISPLAY, PROP_DISPLAY,
PROP_WORKSPACE_MANAGER,
PROP_SCREEN_WIDTH, PROP_SCREEN_WIDTH,
PROP_SCREEN_HEIGHT, PROP_SCREEN_HEIGHT,
PROP_STAGE, PROP_STAGE,
@ -166,17 +163,17 @@ shell_global_get_property(GObject *object,
case PROP_SESSION_MODE: case PROP_SESSION_MODE:
g_value_set_string (value, shell_global_get_session_mode (global)); g_value_set_string (value, shell_global_get_session_mode (global));
break; break;
case PROP_SCREEN:
g_value_set_object (value, global->meta_screen);
break;
case PROP_DISPLAY: case PROP_DISPLAY:
g_value_set_object (value, global->meta_display); g_value_set_object (value, global->meta_display);
break; break;
case PROP_WORKSPACE_MANAGER:
g_value_set_object (value, global->workspace_manager);
break;
case PROP_SCREEN_WIDTH: case PROP_SCREEN_WIDTH:
{ {
int width, height; int width, height;
meta_display_get_size (global->meta_display, &width, &height); meta_screen_get_size (global->meta_screen, &width, &height);
g_value_set_int (value, width); g_value_set_int (value, width);
} }
break; break;
@ -184,7 +181,7 @@ shell_global_get_property(GObject *object,
{ {
int width, height; int width, height;
meta_display_get_size (global->meta_display, &width, &height); meta_screen_get_size (global->meta_screen, &width, &height);
g_value_set_int (value, height); g_value_set_int (value, height);
} }
break; break;
@ -192,10 +189,10 @@ shell_global_get_property(GObject *object,
g_value_set_object (value, global->stage); g_value_set_object (value, global->stage);
break; break;
case PROP_WINDOW_GROUP: case PROP_WINDOW_GROUP:
g_value_set_object (value, meta_get_window_group_for_display (global->meta_display)); g_value_set_object (value, meta_get_window_group_for_screen (global->meta_screen));
break; break;
case PROP_TOP_WINDOW_GROUP: case PROP_TOP_WINDOW_GROUP:
g_value_set_object (value, meta_get_top_window_group_for_display (global->meta_display)); g_value_set_object (value, meta_get_top_window_group_for_screen (global->meta_screen));
break; break;
case PROP_WINDOW_MANAGER: case PROP_WINDOW_MANAGER:
g_value_set_object (value, global->wm); g_value_set_object (value, global->wm);
@ -373,6 +370,13 @@ shell_global_class_init (ShellGlobalClass *klass)
"The session mode to use", "The session mode to use",
"user", "user",
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (gobject_class,
PROP_SCREEN,
g_param_spec_object ("screen",
"Screen",
"Metacity screen object for the shell",
META_TYPE_SCREEN,
G_PARAM_READABLE));
g_object_class_install_property (gobject_class, g_object_class_install_property (gobject_class,
PROP_SCREEN_WIDTH, PROP_SCREEN_WIDTH,
@ -397,14 +401,6 @@ shell_global_class_init (ShellGlobalClass *klass)
META_TYPE_DISPLAY, META_TYPE_DISPLAY,
G_PARAM_READABLE)); G_PARAM_READABLE));
g_object_class_install_property (gobject_class,
PROP_WORKSPACE_MANAGER,
g_param_spec_object ("workspace-manager",
"Workspace manager",
"Workspace manager",
META_TYPE_WORKSPACE_MANAGER,
G_PARAM_READABLE));
g_object_class_install_property (gobject_class, g_object_class_install_property (gobject_class,
PROP_STAGE, PROP_STAGE,
g_param_spec_object ("stage", g_param_spec_object ("stage",
@ -568,7 +564,7 @@ focus_window_changed (MetaDisplay *display,
/* If the stage window became unfocused, drop the key focus /* If the stage window became unfocused, drop the key focus
* on Clutter's side. */ * on Clutter's side. */
if (!meta_stage_is_focused (global->meta_display)) if (!meta_stage_is_focused (global->meta_screen))
clutter_stage_set_key_focus (global->stage, NULL); clutter_stage_set_key_focus (global->stage, NULL);
} }
@ -598,13 +594,13 @@ sync_stage_window_focus (ShellGlobal *global)
actor = get_key_focused_actor (global); actor = get_key_focused_actor (global);
/* An actor got key focus and the stage needs to be focused. */ /* An actor got key focus and the stage needs to be focused. */
if (actor != NULL && !meta_stage_is_focused (global->meta_display)) if (actor != NULL && !meta_stage_is_focused (global->meta_screen))
meta_focus_stage_window (global->meta_display, meta_focus_stage_window (global->meta_screen,
get_current_time_maybe_roundtrip (global)); get_current_time_maybe_roundtrip (global));
/* An actor dropped key focus. Focus the default window. */ /* An actor dropped key focus. Focus the default window. */
else if (actor == NULL && meta_stage_is_focused (global->meta_display)) else if (actor == NULL && meta_stage_is_focused (global->meta_screen))
meta_display_focus_default_window (global->meta_display, meta_screen_focus_default_window (global->meta_screen,
get_current_time_maybe_roundtrip (global)); get_current_time_maybe_roundtrip (global));
} }
@ -620,12 +616,12 @@ focus_actor_changed (ClutterStage *stage,
static void static void
sync_input_region (ShellGlobal *global) sync_input_region (ShellGlobal *global)
{ {
MetaDisplay *display = global->meta_display; MetaScreen *screen = global->meta_screen;
if (global->has_modal) if (global->has_modal)
meta_set_stage_input_region (display, None); meta_set_stage_input_region (screen, None);
else else
meta_set_stage_input_region (display, global->input_region); meta_set_stage_input_region (screen, global->input_region);
} }
/** /**
@ -679,6 +675,17 @@ shell_global_get_stage (ShellGlobal *global)
return global->stage; return global->stage;
} }
/**
* shell_global_get_screen:
*
* Return value: (transfer none): The default #MetaScreen
*/
MetaScreen *
shell_global_get_screen (ShellGlobal *global)
{
return global->meta_screen;
}
/** /**
* shell_global_get_display: * shell_global_get_display:
* *
@ -705,7 +712,7 @@ shell_global_get_window_actors (ShellGlobal *global)
g_return_val_if_fail (SHELL_IS_GLOBAL (global), NULL); g_return_val_if_fail (SHELL_IS_GLOBAL (global), NULL);
for (l = meta_get_window_actors (global->meta_display); l; l = l->next) for (l = meta_get_window_actors (global->meta_screen); l; l = l->next)
if (!meta_window_actor_is_destroyed (l->data)) if (!meta_window_actor_is_destroyed (l->data))
filtered = g_list_prepend (filtered, l->data); filtered = g_list_prepend (filtered, l->data);
@ -831,15 +838,13 @@ entry_cursor_func (StEntry *entry,
{ {
ShellGlobal *global = user_data; ShellGlobal *global = user_data;
meta_display_set_cursor (global->meta_display, meta_screen_set_cursor (global->meta_screen, use_ibeam ? META_CURSOR_IBEAM : META_CURSOR_DEFAULT);
use_ibeam ? META_CURSOR_IBEAM : META_CURSOR_DEFAULT);
} }
void void
_shell_global_set_plugin (ShellGlobal *global, _shell_global_set_plugin (ShellGlobal *global,
MetaPlugin *plugin) MetaPlugin *plugin)
{ {
MetaDisplay *display;
MetaBackend *backend; MetaBackend *backend;
MetaSettings *settings; MetaSettings *settings;
@ -849,15 +854,13 @@ _shell_global_set_plugin (ShellGlobal *global,
global->plugin = plugin; global->plugin = plugin;
global->wm = shell_wm_new (plugin); global->wm = shell_wm_new (plugin);
display = meta_plugin_get_display (plugin); global->meta_screen = meta_plugin_get_screen (plugin);
global->meta_display = display; global->meta_display = meta_screen_get_display (global->meta_screen);
global->workspace_manager = meta_display_get_workspace_manager (display); global->xdisplay = meta_display_get_xdisplay (global->meta_display);
global->x11_display = meta_display_get_x11_display (display);
global->xdisplay = meta_x11_display_get_xdisplay (global->x11_display);
global->gdk_display = gdk_x11_lookup_xdisplay (global->xdisplay); global->gdk_display = gdk_x11_lookup_xdisplay (global->xdisplay);
global->stage = CLUTTER_STAGE (meta_get_stage_for_display (display)); global->stage = CLUTTER_STAGE (meta_get_stage_for_screen (global->meta_screen));
if (meta_is_wayland_compositor ()) if (meta_is_wayland_compositor ())
{ {
@ -969,12 +972,12 @@ shell_global_end_modal (ShellGlobal *global,
/* If the stage window is unfocused, ensure that there's no /* If the stage window is unfocused, ensure that there's no
* actor focused on Clutter's side. */ * actor focused on Clutter's side. */
if (!meta_stage_is_focused (global->meta_display)) if (!meta_stage_is_focused (global->meta_screen))
clutter_stage_set_key_focus (global->stage, NULL); clutter_stage_set_key_focus (global->stage, NULL);
/* An actor dropped key focus. Focus the default window. */ /* An actor dropped key focus. Focus the default window. */
else if (get_key_focused_actor (global) && meta_stage_is_focused (global->meta_display)) else if (get_key_focused_actor (global) && meta_stage_is_focused (global->meta_screen))
meta_display_focus_default_window (global->meta_display, meta_screen_focus_default_window (global->meta_screen,
get_current_time_maybe_roundtrip (global)); get_current_time_maybe_roundtrip (global));
sync_input_region (global); sync_input_region (global);
@ -1156,7 +1159,8 @@ shell_global_reexec_self (ShellGlobal *global)
*/ */
pre_exec_close_fds (); pre_exec_close_fds ();
meta_display_close (shell_global_get_display (global), meta_display_unmanage_screen (shell_global_get_display (global),
shell_global_get_screen (global),
shell_global_get_current_time (global)); shell_global_get_current_time (global));
execvp (arr->pdata[0], (char**)arr->pdata); execvp (arr->pdata[0], (char**)arr->pdata);
@ -1242,7 +1246,7 @@ shell_global_notify_error (ShellGlobal *global,
*/ */
void shell_global_init_xdnd (ShellGlobal *global) void shell_global_init_xdnd (ShellGlobal *global)
{ {
Window output_window = meta_get_overlay_window (global->meta_display); Window output_window = meta_get_overlay_window (global->meta_screen);
long xdnd_version = 5; long xdnd_version = 5;
XChangeProperty (global->xdisplay, global->stage_xwindow, XChangeProperty (global->xdisplay, global->stage_xwindow,
@ -1280,7 +1284,7 @@ shell_global_get_pointer (ShellGlobal *global,
ClutterModifierType raw_mods; ClutterModifierType raw_mods;
MetaCursorTracker *tracker; MetaCursorTracker *tracker;
tracker = meta_cursor_tracker_get_for_display (global->meta_display); tracker = meta_cursor_tracker_get_for_screen (global->meta_screen);
meta_cursor_tracker_get_pointer (tracker, x, y, &raw_mods); meta_cursor_tracker_get_pointer (tracker, x, y, &raw_mods);
*mods = raw_mods & CLUTTER_MODIFIER_MASK; *mods = raw_mods & CLUTTER_MODIFIER_MASK;
@ -1338,6 +1342,37 @@ shell_global_get_settings (ShellGlobal *global)
return global->settings; return global->settings;
} }
/**
* shell_global_get_overrides_settings:
* @global: A #ShellGlobal
*
* Get the session overrides GSettings instance.
*
* Return value: (transfer none): The GSettings object
*/
GSettings *
shell_global_get_overrides_settings (ShellGlobal *global)
{
static GSettings *settings = NULL;
const char *schema;
g_return_val_if_fail (SHELL_IS_GLOBAL (global), NULL);
if (!settings)
{
if (strcmp (global->session_mode, "classic") == 0)
schema = "org.gnome.shell.extensions.classic-overrides";
else if (strcmp (global->session_mode, "user") == 0)
schema = "org.gnome.shell.overrides";
else
return NULL;
settings = g_settings_new (schema);
}
return settings;
}
/** /**
* shell_global_get_current_time: * shell_global_get_current_time:
* @global: A #ShellGlobal * @global: A #ShellGlobal
@ -1397,12 +1432,7 @@ shell_global_create_app_launch_context (ShellGlobal *global,
gdk_app_launch_context_set_timestamp (context, timestamp); gdk_app_launch_context_set_timestamp (context, timestamp);
if (workspace < 0) if (workspace < 0)
{ workspace = meta_screen_get_active_workspace_index (global->meta_screen);
MetaWorkspaceManager *workspace_manager = global->workspace_manager;
workspace =
meta_workspace_manager_get_active_workspace_index (workspace_manager);
}
gdk_app_launch_context_set_desktop (context, workspace); gdk_app_launch_context_set_desktop (context, workspace);
return (GAppLaunchContext *)context; return (GAppLaunchContext *)context;

View File

@ -16,9 +16,11 @@ G_DECLARE_FINAL_TYPE (ShellGlobal, shell_global, SHELL, GLOBAL, GObject)
ShellGlobal *shell_global_get (void); ShellGlobal *shell_global_get (void);
ClutterStage *shell_global_get_stage (ShellGlobal *global); ClutterStage *shell_global_get_stage (ShellGlobal *global);
MetaScreen *shell_global_get_screen (ShellGlobal *global);
MetaDisplay *shell_global_get_display (ShellGlobal *global); MetaDisplay *shell_global_get_display (ShellGlobal *global);
GList *shell_global_get_window_actors (ShellGlobal *global); GList *shell_global_get_window_actors (ShellGlobal *global);
GSettings *shell_global_get_settings (ShellGlobal *global); GSettings *shell_global_get_settings (ShellGlobal *global);
GSettings *shell_global_get_overrides_settings (ShellGlobal *global);
guint32 shell_global_get_current_time (ShellGlobal *global); guint32 shell_global_get_current_time (ShellGlobal *global);

View File

@ -15,8 +15,8 @@
#include <gdk/gdk.h> #include <gdk/gdk.h>
#include <cogl/cogl.h> #include <cogl/cogl.h>
#include <meta/screen.h>
#include <meta/meta-cursor-tracker.h> #include <meta/meta-cursor-tracker.h>
#include <meta/display.h>
#include <meta/compositor-mutter.h> #include <meta/compositor-mutter.h>
#include "shell-global.h" #include "shell-global.h"
@ -112,7 +112,7 @@ static void recorder_remove_redraw_timeout (ShellRecorder *recorder);
enum { enum {
PROP_0, PROP_0,
PROP_DISPLAY, PROP_SCREEN,
PROP_STAGE, PROP_STAGE,
PROP_FRAMERATE, PROP_FRAMERATE,
PROP_PIPELINE, PROP_PIPELINE,
@ -670,12 +670,12 @@ recorder_set_stage (ShellRecorder *recorder,
} }
static void static void
recorder_set_display (ShellRecorder *recorder, recorder_set_screen (ShellRecorder *recorder,
MetaDisplay *display) MetaScreen *screen)
{ {
MetaCursorTracker *tracker; MetaCursorTracker *tracker;
tracker = meta_cursor_tracker_get_for_display (display); tracker = meta_cursor_tracker_get_for_screen (screen);
if (tracker == recorder->cursor_tracker) if (tracker == recorder->cursor_tracker)
return; return;
@ -760,8 +760,8 @@ shell_recorder_set_property (GObject *object,
switch (prop_id) switch (prop_id)
{ {
case PROP_DISPLAY: case PROP_SCREEN:
recorder_set_display (recorder, g_value_get_object (value)); recorder_set_screen (recorder, g_value_get_object (value));
break; break;
case PROP_STAGE: case PROP_STAGE:
recorder_set_stage (recorder, g_value_get_object (value)); recorder_set_stage (recorder, g_value_get_object (value));
@ -825,11 +825,11 @@ shell_recorder_class_init (ShellRecorderClass *klass)
gobject_class->set_property = shell_recorder_set_property; gobject_class->set_property = shell_recorder_set_property;
g_object_class_install_property (gobject_class, g_object_class_install_property (gobject_class,
PROP_DISPLAY, PROP_SCREEN,
g_param_spec_object ("display", g_param_spec_object ("screen",
"Display", "Screen",
"Display to record", "Screen to record",
META_TYPE_DISPLAY, META_TYPE_SCREEN,
G_PARAM_WRITABLE)); G_PARAM_WRITABLE));
g_object_class_install_property (gobject_class, g_object_class_install_property (gobject_class,
@ -1551,7 +1551,7 @@ shell_recorder_record (ShellRecorder *recorder,
recorder_add_update_pointer_timeout (recorder); recorder_add_update_pointer_timeout (recorder);
/* Disable unredirection while we are recoring */ /* Disable unredirection while we are recoring */
meta_disable_unredirect_for_display (shell_global_get_display (shell_global_get ())); meta_disable_unredirect_for_screen (shell_global_get_screen (shell_global_get ()));
/* Set up repaint hook */ /* Set up repaint hook */
recorder->repaint_hook_id = clutter_threads_add_repaint_func(recorder_repaint_hook, recorder->stage, NULL); recorder->repaint_hook_id = clutter_threads_add_repaint_func(recorder_repaint_hook, recorder->stage, NULL);
@ -1602,7 +1602,7 @@ shell_recorder_close (ShellRecorder *recorder)
recorder->state = RECORDER_STATE_CLOSED; recorder->state = RECORDER_STATE_CLOSED;
/* Reenable after the recording */ /* Reenable after the recording */
meta_enable_unredirect_for_display (shell_global_get_display (shell_global_get ())); meta_enable_unredirect_for_screen (shell_global_get_screen (shell_global_get ()));
/* Release the refcount we took when we started recording */ /* Release the refcount we took when we started recording */
g_object_unref (recorder); g_object_unref (recorder);

View File

@ -38,6 +38,8 @@ struct _ShellScreenshotPrivate
gboolean include_cursor; gboolean include_cursor;
gboolean include_frame; gboolean include_frame;
ShellScreenshotCallback callback;
}; };
G_DEFINE_TYPE_WITH_PRIVATE (ShellScreenshot, shell_screenshot, G_TYPE_OBJECT); G_DEFINE_TYPE_WITH_PRIVATE (ShellScreenshot, shell_screenshot, G_TYPE_OBJECT);
@ -57,22 +59,24 @@ shell_screenshot_init (ShellScreenshot *screenshot)
static void static void
on_screenshot_written (GObject *source, on_screenshot_written (GObject *source,
GAsyncResult *task, GAsyncResult *result,
gpointer user_data) gpointer user_data)
{ {
ShellScreenshot *screenshot = SHELL_SCREENSHOT (source); ShellScreenshot *screenshot = SHELL_SCREENSHOT (source);
ShellScreenshotPrivate *priv = screenshot->priv; ShellScreenshotPrivate *priv = screenshot->priv;
GTask *result = user_data;
g_task_return_boolean (result, g_task_propagate_boolean (G_TASK (task), NULL)); if (priv->callback)
g_object_unref (result); priv->callback (screenshot,
g_task_propagate_boolean (G_TASK (result), NULL),
&priv->screenshot_area,
priv->filename_used);
g_clear_pointer (&priv->image, cairo_surface_destroy); g_clear_pointer (&priv->image, cairo_surface_destroy);
g_clear_pointer (&priv->filename, g_free); g_clear_pointer (&priv->filename, g_free);
g_clear_pointer (&priv->filename_used, g_free); g_clear_pointer (&priv->filename_used, g_free);
g_clear_pointer (&priv->datetime, g_date_time_unref); g_clear_pointer (&priv->datetime, g_date_time_unref);
meta_enable_unredirect_for_display (shell_global_get_display (priv->global)); meta_enable_unredirect_for_screen (shell_global_get_screen (priv->global));
} }
/* called in an I/O thread */ /* called in an I/O thread */
@ -309,22 +313,21 @@ _draw_cursor_image (MetaCursorTracker *tracker,
static void static void
grab_screenshot (ClutterActor *stage, grab_screenshot (ClutterActor *stage,
GTask *result) ShellScreenshot *screenshot)
{ {
MetaDisplay *display; MetaScreen *screen;
MetaCursorTracker *tracker; MetaCursorTracker *tracker;
int width, height; int width, height;
GTask *result;
GSettings *settings; GSettings *settings;
ShellScreenshot *screenshot = g_task_get_source_object (result);
ShellScreenshotPrivate *priv = screenshot->priv; ShellScreenshotPrivate *priv = screenshot->priv;
GTask *task;
display = shell_global_get_display (priv->global); screen = shell_global_get_screen (priv->global);
meta_display_get_size (display, &width, &height); meta_screen_get_size (screen, &width, &height);
do_grab_screenshot (screenshot, CLUTTER_STAGE (stage), 0, 0, width, height); do_grab_screenshot (screenshot, CLUTTER_STAGE (stage), 0, 0, width, height);
if (meta_display_get_n_monitors (display) > 1) if (meta_screen_get_n_monitors (screen) > 1)
{ {
cairo_region_t *screen_region = cairo_region_create (); cairo_region_t *screen_region = cairo_region_create ();
cairo_region_t *stage_region; cairo_region_t *stage_region;
@ -333,11 +336,10 @@ grab_screenshot (ClutterActor *stage,
int i; int i;
cairo_t *cr; cairo_t *cr;
for (i = meta_display_get_n_monitors (display) - 1; i >= 0; i--) for (i = meta_screen_get_n_monitors (screen) - 1; i >= 0; i--)
{ {
meta_display_get_monitor_geometry (display, i, &monitor_rect); meta_screen_get_monitor_geometry (screen, i, &monitor_rect);
cairo_region_union_rectangle (screen_region, cairo_region_union_rectangle (screen_region, (const cairo_rectangle_int_t *) &monitor_rect);
(const cairo_rectangle_int_t *) &monitor_rect);
} }
stage_rect.x = 0; stage_rect.x = 0;
@ -372,25 +374,24 @@ grab_screenshot (ClutterActor *stage,
if (priv->include_cursor && if (priv->include_cursor &&
!g_settings_get_boolean (settings, MAGNIFIER_ACTIVE_KEY)) !g_settings_get_boolean (settings, MAGNIFIER_ACTIVE_KEY))
{ {
tracker = meta_cursor_tracker_get_for_display (display); tracker = meta_cursor_tracker_get_for_screen (screen);
_draw_cursor_image (tracker, priv->image, priv->screenshot_area); _draw_cursor_image (tracker, priv->image, priv->screenshot_area);
} }
g_object_unref (settings); g_object_unref (settings);
g_signal_handlers_disconnect_by_func (stage, grab_screenshot, result); g_signal_handlers_disconnect_by_func (stage, (void *)grab_screenshot, (gpointer)screenshot);
task = g_task_new (screenshot, NULL, on_screenshot_written, result); result = g_task_new (screenshot, NULL, on_screenshot_written, NULL);
g_task_run_in_thread (task, write_screenshot_thread); g_task_run_in_thread (result, write_screenshot_thread);
g_object_unref (task); g_object_unref (result);
} }
static void static void
grab_area_screenshot (ClutterActor *stage, grab_area_screenshot (ClutterActor *stage,
GTask *result) ShellScreenshot *screenshot)
{ {
ShellScreenshot *screenshot = g_task_get_source_object (result); GTask *result;
ShellScreenshotPrivate *priv = screenshot->priv; ShellScreenshotPrivate *priv = screenshot->priv;
GTask *task;
do_grab_screenshot (screenshot, do_grab_screenshot (screenshot,
CLUTTER_STAGE (stage), CLUTTER_STAGE (stage),
@ -399,22 +400,22 @@ grab_area_screenshot (ClutterActor *stage,
priv->screenshot_area.width, priv->screenshot_area.width,
priv->screenshot_area.height); priv->screenshot_area.height);
g_signal_handlers_disconnect_by_func (stage, grab_area_screenshot, result); g_signal_handlers_disconnect_by_func (stage, (void *)grab_area_screenshot, (gpointer)screenshot);
task = g_task_new (screenshot, NULL, on_screenshot_written, result); result = g_task_new (screenshot, NULL, on_screenshot_written, NULL);
g_task_run_in_thread (task, write_screenshot_thread); g_task_run_in_thread (result, write_screenshot_thread);
g_object_unref (task); g_object_unref (result);
} }
static void static void
grab_window_screenshot (ClutterActor *stage, grab_window_screenshot (ClutterActor *stage,
GTask *result) ShellScreenshot *screenshot)
{ {
ShellScreenshot *screenshot = g_task_get_source_object (result);
ShellScreenshotPrivate *priv = screenshot->priv; ShellScreenshotPrivate *priv = screenshot->priv;
GTask *task; GTask *result;
GSettings *settings; GSettings *settings;
MetaDisplay *display = shell_global_get_display (priv->global); MetaScreen *screen = shell_global_get_screen (priv->global);
MetaCursorTracker *tracker; MetaCursorTracker *tracker;
MetaDisplay *display = meta_screen_get_display (screen);
MetaWindow *window = meta_display_get_focus_window (display); MetaWindow *window = meta_display_get_focus_window (display);
ClutterActor *window_actor; ClutterActor *window_actor;
gfloat actor_x, actor_y; gfloat actor_x, actor_y;
@ -445,59 +446,17 @@ grab_window_screenshot (ClutterActor *stage,
settings = g_settings_new (A11Y_APPS_SCHEMA); settings = g_settings_new (A11Y_APPS_SCHEMA);
if (priv->include_cursor && !g_settings_get_boolean (settings, MAGNIFIER_ACTIVE_KEY)) if (priv->include_cursor && !g_settings_get_boolean (settings, MAGNIFIER_ACTIVE_KEY))
{ {
tracker = meta_cursor_tracker_get_for_display (display); tracker = meta_cursor_tracker_get_for_screen (screen);
_draw_cursor_image (tracker, priv->image, priv->screenshot_area); _draw_cursor_image (tracker, priv->image, priv->screenshot_area);
} }
g_object_unref (settings); g_object_unref (settings);
g_signal_handlers_disconnect_by_func (stage, grab_window_screenshot, result); g_signal_handlers_disconnect_by_func (stage, (void *)grab_window_screenshot, (gpointer)screenshot);
task = g_task_new (screenshot, NULL, on_screenshot_written, result); result = g_task_new (screenshot, NULL, on_screenshot_written, NULL);
g_task_run_in_thread (task, write_screenshot_thread); g_task_run_in_thread (result, write_screenshot_thread);
g_object_unref (task);
}
static void
grab_pixel (ClutterActor *stage,
GTask *result)
{
ShellScreenshot *screenshot = g_task_get_source_object (result);
ShellScreenshotPrivate *priv = screenshot->priv;
do_grab_screenshot (screenshot,
CLUTTER_STAGE (stage),
priv->screenshot_area.x,
priv->screenshot_area.y,
1,
1);
meta_enable_unredirect_for_display (shell_global_get_display (priv->global));
g_signal_handlers_disconnect_by_func (stage, grab_pixel, result);
g_task_return_boolean (result, TRUE);
g_object_unref (result); g_object_unref (result);
} }
static gboolean
finish_screenshot (ShellScreenshot *screenshot,
GAsyncResult *result,
cairo_rectangle_int_t **area,
const char **filename_used,
GError **error)
{
ShellScreenshotPrivate *priv = screenshot->priv;
if (!g_task_propagate_boolean (G_TASK (result), error))
return FALSE;
if (area)
*area = &priv->screenshot_area;
if (filename_used)
*filename_used = priv->filename_used;
return TRUE;
}
/** /**
* shell_screenshot_screenshot: * shell_screenshot_screenshot:
* @screenshot: the #ShellScreenshot * @screenshot: the #ShellScreenshot
@ -505,7 +464,6 @@ finish_screenshot (ShellScreenshot *screenshot,
* @filename: The filename for the screenshot * @filename: The filename for the screenshot
* @callback: (scope async): function to call returning success or failure * @callback: (scope async): function to call returning success or failure
* of the async grabbing * of the async grabbing
* @user_data: the data to pass to callback function
* *
* Takes a screenshot of the whole screen * Takes a screenshot of the whole screen
* in @filename as png image. * in @filename as png image.
@ -515,69 +473,30 @@ void
shell_screenshot_screenshot (ShellScreenshot *screenshot, shell_screenshot_screenshot (ShellScreenshot *screenshot,
gboolean include_cursor, gboolean include_cursor,
const char *filename, const char *filename,
GAsyncReadyCallback callback, ShellScreenshotCallback callback)
gpointer user_data)
{ {
ClutterActor *stage; ClutterActor *stage;
ShellScreenshotPrivate *priv = screenshot->priv; ShellScreenshotPrivate *priv = screenshot->priv;
GTask *result;
if (priv->filename != NULL) { if (priv->filename != NULL) {
if (callback) if (callback)
g_task_report_new_error (screenshot, callback (screenshot, FALSE, NULL, "");
callback,
user_data,
shell_screenshot_screenshot,
G_IO_ERROR,
G_IO_ERROR_PENDING,
"Only one screenshot operation at a time "
"is permitted");
return; return;
} }
result = g_task_new (screenshot, NULL, callback, user_data);
g_task_set_source_tag (result, shell_screenshot_screenshot);
priv->filename = g_strdup (filename); priv->filename = g_strdup (filename);
priv->callback = callback;
priv->include_cursor = include_cursor; priv->include_cursor = include_cursor;
stage = CLUTTER_ACTOR (shell_global_get_stage (priv->global)); stage = CLUTTER_ACTOR (shell_global_get_stage (priv->global));
meta_disable_unredirect_for_display (shell_global_get_display (priv->global)); meta_disable_unredirect_for_screen (shell_global_get_screen (priv->global));
g_signal_connect_after (stage, "paint", G_CALLBACK (grab_screenshot), result); g_signal_connect_after (stage, "paint", G_CALLBACK (grab_screenshot), (gpointer)screenshot);
clutter_actor_queue_redraw (stage); clutter_actor_queue_redraw (stage);
} }
/**
* shell_screenshot_screenshot_finish:
* @screenshot: the #ShellScreenshot
* @result: the #GAsyncResult that was provided to the callback
* @area: (out) (transfer none): the area that was grabbed in screen coordinates
* @filename_used: (out) (transfer none): the name of the file the screenshot
* was written to
* @error: #GError for error reporting
*
* Finish the asynchronous operation started by shell_screenshot_screenshot()
* and obtain its result.
*
* Returns: whether the operation was successful
*
*/
gboolean
shell_screenshot_screenshot_finish (ShellScreenshot *screenshot,
GAsyncResult *result,
cairo_rectangle_int_t **area,
const char **filename_used,
GError **error)
{
g_return_val_if_fail (g_async_result_is_tagged (result,
shell_screenshot_screenshot),
FALSE);
return finish_screenshot (screenshot, result, area, filename_used, error);
}
/** /**
* shell_screenshot_screenshot_area: * shell_screenshot_screenshot_area:
* @screenshot: the #ShellScreenshot * @screenshot: the #ShellScreenshot
@ -588,7 +507,6 @@ shell_screenshot_screenshot_finish (ShellScreenshot *screenshot,
* @filename: The filename for the screenshot * @filename: The filename for the screenshot
* @callback: (scope async): function to call returning success or failure * @callback: (scope async): function to call returning success or failure
* of the async grabbing * of the async grabbing
* @user_data: the data to pass to callback function
* *
* Takes a screenshot of the passed in area and saves it * Takes a screenshot of the passed in area and saves it
* in @filename as png image. * in @filename as png image.
@ -601,72 +519,33 @@ shell_screenshot_screenshot_area (ShellScreenshot *screenshot,
int width, int width,
int height, int height,
const char *filename, const char *filename,
GAsyncReadyCallback callback, ShellScreenshotCallback callback)
gpointer user_data)
{ {
ClutterActor *stage; ClutterActor *stage;
ShellScreenshotPrivate *priv = screenshot->priv; ShellScreenshotPrivate *priv = screenshot->priv;
GTask *result;
if (priv->filename != NULL) { if (priv->filename != NULL) {
if (callback) if (callback)
g_task_report_new_error (screenshot, callback (screenshot, FALSE, NULL, "");
callback,
NULL,
shell_screenshot_screenshot_area,
G_IO_ERROR,
G_IO_ERROR_PENDING,
"Only one screenshot operation at a time "
"is permitted");
return; return;
} }
result = g_task_new (screenshot, NULL, callback, user_data);
g_task_set_source_tag (result, shell_screenshot_screenshot_area);
priv->filename = g_strdup (filename); priv->filename = g_strdup (filename);
priv->screenshot_area.x = x; priv->screenshot_area.x = x;
priv->screenshot_area.y = y; priv->screenshot_area.y = y;
priv->screenshot_area.width = width; priv->screenshot_area.width = width;
priv->screenshot_area.height = height; priv->screenshot_area.height = height;
priv->callback = callback;
stage = CLUTTER_ACTOR (shell_global_get_stage (priv->global)); stage = CLUTTER_ACTOR (shell_global_get_stage (priv->global));
meta_disable_unredirect_for_display (shell_global_get_display (shell_global_get ())); meta_disable_unredirect_for_screen (shell_global_get_screen (shell_global_get ()));
g_signal_connect_after (stage, "paint", G_CALLBACK (grab_area_screenshot), result); g_signal_connect_after (stage, "paint", G_CALLBACK (grab_area_screenshot), (gpointer)screenshot);
clutter_actor_queue_redraw (stage); clutter_actor_queue_redraw (stage);
} }
/**
* shell_screenshot_screenshot_area_finish:
* @screenshot: the #ShellScreenshot
* @result: the #GAsyncResult that was provided to the callback
* @area: (out) (transfer none): the area that was grabbed in screen coordinates
* @filename_used: (out) (transfer none): the name of the file the screenshot
* was written to
* @error: #GError for error reporting
*
* Finish the asynchronous operation started by shell_screenshot_screenshot_area()
* and obtain its result.
*
* Returns: whether the operation was successful
*
*/
gboolean
shell_screenshot_screenshot_area_finish (ShellScreenshot *screenshot,
GAsyncResult *result,
cairo_rectangle_int_t **area,
const char **filename_used,
GError **error)
{
g_return_val_if_fail (g_async_result_is_tagged (result,
shell_screenshot_screenshot_area),
FALSE);
return finish_screenshot (screenshot, result, area, filename_used, error);
}
/** /**
* shell_screenshot_screenshot_window: * shell_screenshot_screenshot_window:
* @screenshot: the #ShellScreenshot * @screenshot: the #ShellScreenshot
@ -675,7 +554,6 @@ shell_screenshot_screenshot_area_finish (ShellScreenshot *screenshot,
* @filename: The filename for the screenshot * @filename: The filename for the screenshot
* @callback: (scope async): function to call returning success or failure * @callback: (scope async): function to call returning success or failure
* of the async grabbing * of the async grabbing
* @user_data: the data to pass to callback function
* *
* Takes a screenshot of the focused window (optionally omitting the frame) * Takes a screenshot of the focused window (optionally omitting the frame)
* in @filename as png image. * in @filename as png image.
@ -686,173 +564,34 @@ shell_screenshot_screenshot_window (ShellScreenshot *screenshot,
gboolean include_frame, gboolean include_frame,
gboolean include_cursor, gboolean include_cursor,
const char *filename, const char *filename,
GAsyncReadyCallback callback, ShellScreenshotCallback callback)
gpointer user_data)
{ {
ShellScreenshotPrivate *priv = screenshot->priv; ShellScreenshotPrivate *priv = screenshot->priv;
MetaDisplay *display = shell_global_get_display (priv->global); MetaScreen *screen = shell_global_get_screen (priv->global);
ClutterActor *stage; ClutterActor *stage;
MetaDisplay *display = meta_screen_get_display (screen);
MetaWindow *window = meta_display_get_focus_window (display); MetaWindow *window = meta_display_get_focus_window (display);
GTask *result;
if (priv->filename != NULL || !window) { if (priv->filename != NULL || !window) {
if (callback) if (callback)
g_task_report_new_error (screenshot, callback (screenshot, FALSE, NULL, "");
callback,
NULL,
shell_screenshot_screenshot_window,
G_IO_ERROR,
G_IO_ERROR_PENDING,
"Only one screenshot operation at a time "
"is permitted");
return; return;
} }
result = g_task_new (screenshot, NULL, callback, user_data);
g_task_set_source_tag (result, shell_screenshot_screenshot_window);
priv->filename = g_strdup (filename); priv->filename = g_strdup (filename);
priv->callback = callback;
priv->include_frame = include_frame; priv->include_frame = include_frame;
priv->include_cursor = include_cursor; priv->include_cursor = include_cursor;
stage = CLUTTER_ACTOR (shell_global_get_stage (priv->global)); stage = CLUTTER_ACTOR (shell_global_get_stage (priv->global));
meta_disable_unredirect_for_display (shell_global_get_display (shell_global_get ())); meta_disable_unredirect_for_screen (shell_global_get_screen (shell_global_get ()));
g_signal_connect_after (stage, "paint", G_CALLBACK (grab_window_screenshot), result); g_signal_connect_after (stage, "paint", G_CALLBACK (grab_window_screenshot), (gpointer)screenshot);
clutter_actor_queue_redraw (stage); clutter_actor_queue_redraw (stage);
} }
/**
* shell_screenshot_screenshot_window_finish:
* @screenshot: the #ShellScreenshot
* @result: the #GAsyncResult that was provided to the callback
* @area: (out) (transfer none): the area that was grabbed in screen coordinates
* @filename_used: (out) (transfer none): the name of the file the screenshot
* was written to
* @error: #GError for error reporting
*
* Finish the asynchronous operation started by shell_screenshot_screenshot_window()
* and obtain its result.
*
* Returns: whether the operation was successful
*
*/
gboolean
shell_screenshot_screenshot_window_finish (ShellScreenshot *screenshot,
GAsyncResult *result,
cairo_rectangle_int_t **area,
const char **filename_used,
GError **error)
{
g_return_val_if_fail (g_async_result_is_tagged (result,
shell_screenshot_screenshot_window),
FALSE);
return finish_screenshot (screenshot, result, area, filename_used, error);
}
/**
* shell_screenshot_pick_color:
* @screenshot: the #ShellScreenshot
* @x: The X coordinate to pick
* @y: The Y coordinate to pick
* @callback: (scope async): function to call returning success or failure
* of the async grabbing
*
* Picks the pixel at @x, @y and returns its color as #ClutterColor.
*
*/
void
shell_screenshot_pick_color (ShellScreenshot *screenshot,
int x,
int y,
GAsyncReadyCallback callback,
gpointer user_data)
{
ShellScreenshotPrivate *priv = screenshot->priv;
MetaDisplay *display = shell_global_get_display (priv->global);
ClutterActor *stage;
GTask *result;
result = g_task_new (screenshot, NULL, callback, user_data);
g_task_set_source_tag (result, shell_screenshot_pick_color);
priv->screenshot_area.x = x;
priv->screenshot_area.y = y;
priv->screenshot_area.width = 1;
priv->screenshot_area.height = 1;
stage = CLUTTER_ACTOR (shell_global_get_stage (priv->global));
meta_disable_unredirect_for_display (display);
g_signal_connect_after (stage, "paint", G_CALLBACK (grab_pixel), result);
clutter_actor_queue_redraw (stage);
}
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
#define INDEX_A 3
#define INDEX_R 2
#define INDEX_G 1
#define INDEX_B 0
#else
#define INDEX_A 0
#define INDEX_R 1
#define INDEX_G 2
#define INDEX_B 3
#endif
/**
* shell_screenshot_pick_color_finish:
* @screenshot: the #ShellScreenshot
* @result: the #GAsyncResult that was provided to the callback
* @color: (out caller-allocates): the picked color
* @error: #GError for error reporting
*
* Finish the asynchronous operation started by shell_screenshot_pick_color()
* and obtain its result.
*
* Returns: whether the operation was successful
*
*/
gboolean
shell_screenshot_pick_color_finish (ShellScreenshot *screenshot,
GAsyncResult *result,
ClutterColor *color,
GError **error)
{
ShellScreenshotPrivate *priv = screenshot->priv;
g_return_val_if_fail (g_async_result_is_tagged (result,
shell_screenshot_pick_color),
FALSE);
if (!g_task_propagate_boolean (G_TASK (result), error))
return FALSE;
/* protect against mutter changing the format used for stage captures */
g_assert (cairo_image_surface_get_format (priv->image) == CAIRO_FORMAT_ARGB32);
if (color)
{
uint8_t *data = cairo_image_surface_get_data (priv->image);
color->alpha = data[INDEX_A];
color->red = data[INDEX_R];
color->green = data[INDEX_G];
color->blue = data[INDEX_B];
}
return TRUE;
}
#undef INDEX_A
#undef INDEX_R
#undef INDEX_G
#undef INDEX_B
ShellScreenshot * ShellScreenshot *
shell_screenshot_new (void) shell_screenshot_new (void)
{ {

View File

@ -16,51 +16,28 @@ G_DECLARE_FINAL_TYPE (ShellScreenshot, shell_screenshot,
ShellScreenshot *shell_screenshot_new (void); ShellScreenshot *shell_screenshot_new (void);
typedef void (*ShellScreenshotCallback) (ShellScreenshot *screenshot,
gboolean success,
cairo_rectangle_int_t *screenshot_area,
const gchar *filename_used);
void shell_screenshot_screenshot_area (ShellScreenshot *screenshot, void shell_screenshot_screenshot_area (ShellScreenshot *screenshot,
int x, int x,
int y, int y,
int width, int width,
int height, int height,
const char *filename, const char *filename,
GAsyncReadyCallback callback, ShellScreenshotCallback callback);
gpointer user_data);
gboolean shell_screenshot_screenshot_area_finish (ShellScreenshot *screenshot,
GAsyncResult *result,
cairo_rectangle_int_t **area,
const char **filename_used,
GError **error);
void shell_screenshot_screenshot_window (ShellScreenshot *screenshot, void shell_screenshot_screenshot_window (ShellScreenshot *screenshot,
gboolean include_frame, gboolean include_frame,
gboolean include_cursor, gboolean include_cursor,
const char *filename, const char *filename,
GAsyncReadyCallback callback, ShellScreenshotCallback callback);
gpointer user_data);
gboolean shell_screenshot_screenshot_window_finish (ShellScreenshot *screenshot,
GAsyncResult *result,
cairo_rectangle_int_t **area,
const char **filename_used,
GError **error);
void shell_screenshot_screenshot (ShellScreenshot *screenshot, void shell_screenshot_screenshot (ShellScreenshot *screenshot,
gboolean include_cursor, gboolean include_cursor,
const char *filename, const char *filename,
GAsyncReadyCallback callback, ShellScreenshotCallback callback);
gpointer user_data);
gboolean shell_screenshot_screenshot_finish (ShellScreenshot *screenshot,
GAsyncResult *result,
cairo_rectangle_int_t **area,
const char **filename_used,
GError **error);
void shell_screenshot_pick_color (ShellScreenshot *screenshot,
int x,
int y,
GAsyncReadyCallback callback,
gpointer user_data);
gboolean shell_screenshot_pick_color_finish (ShellScreenshot *screenshot,
GAsyncResult *result,
ClutterColor *color,
GError **error);
#endif /* ___SHELL_SCREENSHOT_H__ */ #endif /* ___SHELL_SCREENSHOT_H__ */

View File

@ -210,13 +210,16 @@ shell_tray_manager_style_changed (StWidget *theme_widget,
void void
shell_tray_manager_manage_screen (ShellTrayManager *manager, shell_tray_manager_manage_screen (ShellTrayManager *manager,
MetaScreen *screen,
StWidget *theme_widget) StWidget *theme_widget)
{ {
GdkDisplay *display; GdkDisplay *display;
GdkScreen *gdk_screen; GdkScreen *gdk_screen;
int screen_number;
display = gdk_display_get_default (); display = gdk_display_get_default ();
gdk_screen = gdk_display_get_default_screen (display); screen_number = meta_screen_get_screen_number (screen);
gdk_screen = gdk_display_get_screen (display, screen_number);
na_tray_manager_manage_screen (manager->priv->na_manager, gdk_screen); na_tray_manager_manage_screen (manager->priv->na_manager, gdk_screen);

View File

@ -14,6 +14,7 @@ G_DECLARE_FINAL_TYPE (ShellTrayManager, shell_tray_manager,
ShellTrayManager *shell_tray_manager_new (void); ShellTrayManager *shell_tray_manager_new (void);
void shell_tray_manager_manage_screen (ShellTrayManager *manager, void shell_tray_manager_manage_screen (ShellTrayManager *manager,
MetaScreen *screen,
StWidget *theme_widget); StWidget *theme_widget);
G_END_DECLS G_END_DECLS

View File

@ -2,15 +2,8 @@
#include "config.h" #include "config.h"
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/wait.h> #include <sys/wait.h>
#ifdef HAVE_SYS_RESOURCE_H
#include <sys/resource.h>
#endif
#include <GL/gl.h> #include <GL/gl.h>
#include <cogl/cogl.h> #include <cogl/cogl.h>
@ -521,108 +514,3 @@ shell_util_composite_capture_images (ClutterCapture *captures,
return image; return image;
} }
#ifndef HAVE_FDWALK
static int
fdwalk (int (*cb)(void *data, int fd),
void *data)
{
gint open_max;
gint fd;
gint res = 0;
#ifdef HAVE_SYS_RESOURCE_H
struct rlimit rl;
#endif
#ifdef __linux__
DIR *d;
if ((d = opendir("/proc/self/fd")))
{
struct dirent *de;
while ((de = readdir(d)))
{
glong l;
gchar *e = NULL;
if (de->d_name[0] == '.')
continue;
errno = 0;
l = strtol(de->d_name, &e, 10);
if (errno != 0 || !e || *e)
continue;
fd = (gint) l;
if ((glong) fd != l)
continue;
if (fd == dirfd(d))
continue;
if ((res = cb (data, fd)) != 0)
break;
}
closedir(d);
return res;
}
/* If /proc is not mounted or not accessible we fall back to the old
* rlimit trick */
#endif
#ifdef HAVE_SYS_RESOURCE_H
if (getrlimit (RLIMIT_NOFILE, &rl) == 0 && rl.rlim_max != RLIM_INFINITY)
open_max = rl.rlim_max;
else
#endif
open_max = sysconf (_SC_OPEN_MAX);
for (fd = 0; fd < open_max; fd++)
if ((res = cb (data, fd)) != 0)
break;
return res;
}
#endif
static int
check_cloexec (void *data,
gint fd)
{
int r;
if (fd < 3)
return 0;
r = fcntl (fd, F_GETFD);
if (r < 0)
return 0;
if (!(r & FD_CLOEXEC))
g_warning ("fd %d is not CLOEXEC", fd);
return 0;
}
/**
* shell_util_check_cloexec_fds:
*
* Walk over all open file descriptors. Check them for the FD_CLOEXEC flag.
* If this flag is not set, log the offending file descriptor number.
*
* It is important that gnome-shell's file descriptors are all marked CLOEXEC,
* so that the shell's open file descriptors are not passed to child processes
* that we launch.
*/
void
shell_util_check_cloexec_fds (void)
{
fdwalk (check_cloexec, NULL);
g_info ("Open fd CLOEXEC check complete");
}

View File

@ -60,8 +60,6 @@ cairo_surface_t * shell_util_composite_capture_images (ClutterCapture *captures
int width, int width,
int height); int height);
void shell_util_check_cloexec_fds (void);
G_END_DECLS G_END_DECLS
#endif /* __SHELL_UTIL_H__ */ #endif /* __SHELL_UTIL_H__ */

View File

@ -13,7 +13,6 @@
#include <meta/group.h> #include <meta/group.h>
#include <meta/util.h> #include <meta/util.h>
#include <meta/window.h> #include <meta/window.h>
#include <meta/meta-workspace-manager.h>
#define SN_API_NOT_YET_FROZEN 1 #define SN_API_NOT_YET_FROZEN 1
#include <libsn/sn.h> #include <libsn/sn.h>
@ -588,16 +587,13 @@ shell_window_tracker_on_window_removed (MetaWorkspace *workspace,
static void static void
load_initial_windows (ShellWindowTracker *tracker) load_initial_windows (ShellWindowTracker *tracker)
{ {
MetaDisplay *display = shell_global_get_display (shell_global_get ()); GList *workspaces, *iter;
MetaWorkspaceManager *workspace_manager = MetaScreen *screen = shell_global_get_screen (shell_global_get ());
meta_display_get_workspace_manager (display); workspaces = meta_screen_get_workspaces (screen);
GList *workspaces;
GList *l;
workspaces = meta_workspace_manager_get_workspaces (workspace_manager); for (iter = workspaces; iter; iter = iter->next)
for (l = workspaces; l; l = l->next)
{ {
MetaWorkspace *workspace = l->data; MetaWorkspace *workspace = iter->data;
GList *windows = meta_workspace_list_windows (workspace); GList *windows = meta_workspace_list_windows (workspace);
GList *window_iter; GList *window_iter;
@ -612,18 +608,18 @@ load_initial_windows (ShellWindowTracker *tracker)
} }
static void static void
shell_window_tracker_on_n_workspaces_changed (MetaWorkspaceManager *workspace_manager, shell_window_tracker_on_n_workspaces_changed (MetaScreen *screen,
GParamSpec *pspec, GParamSpec *pspec,
gpointer user_data) gpointer user_data)
{ {
ShellWindowTracker *self = SHELL_WINDOW_TRACKER (user_data); ShellWindowTracker *self = SHELL_WINDOW_TRACKER (user_data);
GList *workspaces; GList *workspaces, *iter;
GList *l;
workspaces = meta_workspace_manager_get_workspaces (workspace_manager); workspaces = meta_screen_get_workspaces (screen);
for (l = workspaces; l; l = l->next)
for (iter = workspaces; iter; iter = iter->next)
{ {
MetaWorkspace *workspace = l->data; MetaWorkspace *workspace = iter->data;
/* This pair of disconnect/connect is idempotent if we were /* This pair of disconnect/connect is idempotent if we were
* already connected, while ensuring we get connected for * already connected, while ensuring we get connected for
@ -646,20 +642,20 @@ shell_window_tracker_on_n_workspaces_changed (MetaWorkspaceManager *workspace_ma
static void static void
init_window_tracking (ShellWindowTracker *self) init_window_tracking (ShellWindowTracker *self)
{ {
MetaDisplay *display = shell_global_get_display (shell_global_get ()); MetaDisplay *display;
MetaWorkspaceManager *workspace_manager = MetaScreen *screen = shell_global_get_screen (shell_global_get ());
meta_display_get_workspace_manager (display);
g_signal_connect (workspace_manager, "notify::n-workspaces", g_signal_connect (screen, "notify::n-workspaces",
G_CALLBACK (shell_window_tracker_on_n_workspaces_changed), self); G_CALLBACK (shell_window_tracker_on_n_workspaces_changed), self);
display = meta_screen_get_display (screen);
g_signal_connect (display, "notify::focus-window", g_signal_connect (display, "notify::focus-window",
G_CALLBACK (on_focus_window_changed), self); G_CALLBACK (on_focus_window_changed), self);
shell_window_tracker_on_n_workspaces_changed (workspace_manager, NULL, self); shell_window_tracker_on_n_workspaces_changed (screen, NULL, self);
} }
static void static void
on_startup_sequence_changed (MetaDisplay *display, on_startup_sequence_changed (MetaScreen *screen,
SnStartupSequence *sequence, SnStartupSequence *sequence,
ShellWindowTracker *self) ShellWindowTracker *self)
{ {
@ -675,13 +671,14 @@ on_startup_sequence_changed (MetaDisplay *display,
static void static void
shell_window_tracker_init (ShellWindowTracker *self) shell_window_tracker_init (ShellWindowTracker *self)
{ {
MetaDisplay *display = shell_global_get_display (shell_global_get ()); MetaScreen *screen;
self->window_to_app = g_hash_table_new_full (g_direct_hash, g_direct_equal, self->window_to_app = g_hash_table_new_full (g_direct_hash, g_direct_equal,
NULL, (GDestroyNotify) g_object_unref); NULL, (GDestroyNotify) g_object_unref);
screen = shell_global_get_screen (shell_global_get ());
g_signal_connect (display, "startup-sequence-changed", g_signal_connect (G_OBJECT (screen), "startup-sequence-changed",
G_CALLBACK (on_startup_sequence_changed), self); G_CALLBACK (on_startup_sequence_changed), self);
load_initial_windows (self); load_initial_windows (self);
@ -798,9 +795,8 @@ GSList *
shell_window_tracker_get_startup_sequences (ShellWindowTracker *self) shell_window_tracker_get_startup_sequences (ShellWindowTracker *self)
{ {
ShellGlobal *global = shell_global_get (); ShellGlobal *global = shell_global_get ();
MetaDisplay *display = shell_global_get_display (global); MetaScreen *screen = shell_global_get_screen (global);
return meta_screen_get_startup_sequences (screen);
return meta_display_get_startup_sequences (display);
} }
/* sn_startup_sequence_ref returns void, so make a /* sn_startup_sequence_ref returns void, so make a

View File

@ -205,8 +205,7 @@ st_adjustment_class_init (StAdjustmentClass *klass)
G_MAXDOUBLE, G_MAXDOUBLE,
0.0, 0.0,
ST_PARAM_READWRITE | ST_PARAM_READWRITE |
G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT));
G_PARAM_EXPLICIT_NOTIFY));
g_object_class_install_property (object_class, g_object_class_install_property (object_class,
PROP_UPPER, PROP_UPPER,
g_param_spec_double ("upper", g_param_spec_double ("upper",
@ -216,8 +215,7 @@ st_adjustment_class_init (StAdjustmentClass *klass)
G_MAXDOUBLE, G_MAXDOUBLE,
0.0, 0.0,
ST_PARAM_READWRITE | ST_PARAM_READWRITE |
G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT));
G_PARAM_EXPLICIT_NOTIFY));
g_object_class_install_property (object_class, g_object_class_install_property (object_class,
PROP_VALUE, PROP_VALUE,
g_param_spec_double ("value", g_param_spec_double ("value",
@ -227,8 +225,7 @@ st_adjustment_class_init (StAdjustmentClass *klass)
G_MAXDOUBLE, G_MAXDOUBLE,
0.0, 0.0,
ST_PARAM_READWRITE | ST_PARAM_READWRITE |
G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT));
G_PARAM_EXPLICIT_NOTIFY));
g_object_class_install_property (object_class, g_object_class_install_property (object_class,
PROP_STEP_INC, PROP_STEP_INC,
g_param_spec_double ("step-increment", g_param_spec_double ("step-increment",
@ -238,8 +235,7 @@ st_adjustment_class_init (StAdjustmentClass *klass)
G_MAXDOUBLE, G_MAXDOUBLE,
0.0, 0.0,
ST_PARAM_READWRITE | ST_PARAM_READWRITE |
G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT));
G_PARAM_EXPLICIT_NOTIFY));
g_object_class_install_property (object_class, g_object_class_install_property (object_class,
PROP_PAGE_INC, PROP_PAGE_INC,
g_param_spec_double ("page-increment", g_param_spec_double ("page-increment",
@ -249,8 +245,7 @@ st_adjustment_class_init (StAdjustmentClass *klass)
G_MAXDOUBLE, G_MAXDOUBLE,
0.0, 0.0,
ST_PARAM_READWRITE | ST_PARAM_READWRITE |
G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT));
G_PARAM_EXPLICIT_NOTIFY));
g_object_class_install_property (object_class, g_object_class_install_property (object_class,
PROP_PAGE_SIZE, PROP_PAGE_SIZE,
g_param_spec_double ("page-size", g_param_spec_double ("page-size",
@ -260,8 +255,7 @@ st_adjustment_class_init (StAdjustmentClass *klass)
G_MAXDOUBLE, G_MAXDOUBLE,
0.0, 0.0,
ST_PARAM_READWRITE | ST_PARAM_READWRITE |
G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT));
G_PARAM_EXPLICIT_NOTIFY));
/** /**
* StAdjustment::changed: * StAdjustment::changed:
* @self: the #StAdjustment * @self: the #StAdjustment

View File

@ -90,7 +90,7 @@ adjustment_value_notify_cb (StAdjustment *adjustment,
GParamSpec *pspec, GParamSpec *pspec,
StBoxLayout *box) StBoxLayout *box)
{ {
clutter_actor_queue_relayout (CLUTTER_ACTOR (box)); clutter_actor_queue_redraw (CLUTTER_ACTOR (box));
} }
static void static void
@ -490,7 +490,7 @@ st_box_layout_get_paint_volume (ClutterActor *actor,
ClutterPaintVolume *volume) ClutterPaintVolume *volume)
{ {
StBoxLayout *self = ST_BOX_LAYOUT (actor); StBoxLayout *self = ST_BOX_LAYOUT (actor);
gdouble x, y, lower, upper; gdouble x, y;
StBoxLayoutPrivate *priv = self->priv; StBoxLayoutPrivate *priv = self->priv;
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor)); StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor));
ClutterActorBox allocation_box; ClutterActorBox allocation_box;
@ -505,42 +505,13 @@ st_box_layout_get_paint_volume (ClutterActor *actor,
* our paint volume on that. */ * our paint volume on that. */
if (priv->hadjustment || priv->vadjustment) if (priv->hadjustment || priv->vadjustment)
{ {
gdouble width, height;
clutter_actor_get_allocation_box (actor, &allocation_box); clutter_actor_get_allocation_box (actor, &allocation_box);
st_theme_node_get_content_box (theme_node, &allocation_box, &content_box); st_theme_node_get_content_box (theme_node, &allocation_box, &content_box);
origin.x = content_box.x1 - allocation_box.x1; origin.x = content_box.x1 - allocation_box.x1;
origin.y = content_box.y1 - allocation_box.y2; origin.y = content_box.y1 - allocation_box.y2;
origin.z = 0.f; origin.z = 0.f;
clutter_paint_volume_set_width (volume, content_box.x2 - content_box.x1);
if (priv->hadjustment) clutter_paint_volume_set_height (volume, content_box.y2 - content_box.y1);
{
g_object_get (priv->hadjustment,
"lower", &lower,
"upper", &upper,
NULL);
width = upper - lower;
}
else
{
width = content_box.x2 - content_box.x1;
}
if (priv->vadjustment)
{
g_object_get (priv->vadjustment,
"lower", &lower,
"upper", &upper,
NULL);
height = upper - lower;
}
else
{
height = content_box.y2 - content_box.y1;
}
clutter_paint_volume_set_width (volume, width);
clutter_paint_volume_set_height (volume, height);
} }
else if (!CLUTTER_ACTOR_CLASS (st_box_layout_parent_class)->get_paint_volume (actor, volume)) else if (!CLUTTER_ACTOR_CLASS (st_box_layout_parent_class)->get_paint_volume (actor, volume))
return FALSE; return FALSE;

View File

@ -905,13 +905,6 @@ st_entry_unmap (ClutterActor *actor)
CLUTTER_ACTOR_CLASS (st_entry_parent_class)->unmap (actor); CLUTTER_ACTOR_CLASS (st_entry_parent_class)->unmap (actor);
} }
static gboolean
st_entry_get_paint_volume (ClutterActor *actor,
ClutterPaintVolume *volume)
{
return clutter_paint_volume_set_from_allocation (volume, actor);
}
static void static void
st_entry_class_init (StEntryClass *klass) st_entry_class_init (StEntryClass *klass)
{ {
@ -929,7 +922,6 @@ st_entry_class_init (StEntryClass *klass)
actor_class->allocate = st_entry_allocate; actor_class->allocate = st_entry_allocate;
actor_class->paint = st_entry_paint; actor_class->paint = st_entry_paint;
actor_class->unmap = st_entry_unmap; actor_class->unmap = st_entry_unmap;
actor_class->get_paint_volume = st_entry_get_paint_volume;
actor_class->key_press_event = st_entry_key_press_event; actor_class->key_press_event = st_entry_key_press_event;
actor_class->key_focus_in = st_entry_key_focus_in; actor_class->key_focus_in = st_entry_key_focus_in;

View File

@ -56,15 +56,12 @@ struct _StIconPrivate
CoglPipeline *shadow_pipeline; CoglPipeline *shadow_pipeline;
StShadow *shadow_spec; StShadow *shadow_spec;
ClutterSize shadow_size;
}; };
G_DEFINE_TYPE_WITH_PRIVATE (StIcon, st_icon, ST_TYPE_WIDGET) G_DEFINE_TYPE_WITH_PRIVATE (StIcon, st_icon, ST_TYPE_WIDGET)
static void st_icon_update (StIcon *icon); static void st_icon_update (StIcon *icon);
static gboolean st_icon_update_icon_size (StIcon *icon); static gboolean st_icon_update_icon_size (StIcon *icon);
static void st_icon_update_shadow_pipeline (StIcon *icon);
static void st_icon_clear_shadow_pipeline (StIcon *icon);
#define DEFAULT_ICON_SIZE 48 #define DEFAULT_ICON_SIZE 48
@ -161,20 +158,20 @@ st_icon_dispose (GObject *gobject)
static void static void
st_icon_paint (ClutterActor *actor) st_icon_paint (ClutterActor *actor)
{ {
StIcon *icon = ST_ICON (actor); StIconPrivate *priv = ST_ICON (actor)->priv;
StIconPrivate *priv = icon->priv;
st_widget_paint_background (ST_WIDGET (actor)); st_widget_paint_background (ST_WIDGET (actor));
if (priv->icon_texture) if (priv->icon_texture)
{ {
st_icon_update_shadow_pipeline (icon);
if (priv->shadow_pipeline) if (priv->shadow_pipeline)
{ {
ClutterActorBox allocation; ClutterActorBox allocation;
float width, height;
clutter_actor_get_allocation_box (priv->icon_texture, &allocation); clutter_actor_get_allocation_box (priv->icon_texture, &allocation);
clutter_actor_box_get_size (&allocation, &width, &height);
_st_paint_shadow_with_opacity (priv->shadow_spec, _st_paint_shadow_with_opacity (priv->shadow_spec,
priv->shadow_pipeline, priv->shadow_pipeline,
&allocation, &allocation,
@ -192,7 +189,7 @@ st_icon_style_changed (StWidget *widget)
StThemeNode *theme_node = st_widget_get_theme_node (widget); StThemeNode *theme_node = st_widget_get_theme_node (widget);
StIconPrivate *priv = self->priv; StIconPrivate *priv = self->priv;
st_icon_clear_shadow_pipeline (self); g_clear_pointer (&priv->shadow_pipeline, cogl_object_unref);
g_clear_pointer (&priv->shadow_spec, st_shadow_unref); g_clear_pointer (&priv->shadow_spec, st_shadow_unref);
priv->shadow_spec = st_theme_node_get_shadow (theme_node, "icon-shadow"); priv->shadow_spec = st_theme_node_get_shadow (theme_node, "icon-shadow");
@ -270,50 +267,22 @@ st_icon_init (StIcon *self)
self->priv->shadow_pipeline = NULL; self->priv->shadow_pipeline = NULL;
} }
static void
st_icon_clear_shadow_pipeline (StIcon *icon)
{
StIconPrivate *priv = icon->priv;
g_clear_pointer (&priv->shadow_pipeline, cogl_object_unref);
clutter_size_init (&priv->shadow_size, 0, 0);
}
static void static void
st_icon_update_shadow_pipeline (StIcon *icon) st_icon_update_shadow_pipeline (StIcon *icon)
{ {
StIconPrivate *priv = icon->priv; StIconPrivate *priv = icon->priv;
if (priv->icon_texture && priv->shadow_spec) g_clear_pointer (&priv->shadow_pipeline, cogl_object_unref);
{
ClutterActorBox box;
float width, height;
clutter_actor_get_allocation_box (CLUTTER_ACTOR (icon), &box); if (priv->shadow_spec)
clutter_actor_box_get_size (&box, &width, &height); priv->shadow_pipeline = _st_create_shadow_pipeline_from_actor (priv->shadow_spec, priv->icon_texture);
if (priv->shadow_pipeline == NULL ||
priv->shadow_size.width != width ||
priv->shadow_size.height != height)
{
st_icon_clear_shadow_pipeline (icon);
priv->shadow_pipeline =
_st_create_shadow_pipeline_from_actor (priv->shadow_spec,
priv->icon_texture);
if (priv->shadow_pipeline)
clutter_size_init (&priv->shadow_size, width, height);
}
}
} }
static void static void
on_pixbuf_changed (ClutterTexture *texture, on_pixbuf_changed (ClutterTexture *texture,
StIcon *icon) StIcon *icon)
{ {
st_icon_clear_shadow_pipeline (icon); st_icon_update_shadow_pipeline (icon);
clutter_actor_queue_redraw (CLUTTER_ACTOR (icon));
} }
static void static void
@ -338,7 +307,7 @@ st_icon_finish_update (StIcon *icon)
/* Remove the temporary ref we added */ /* Remove the temporary ref we added */
g_object_unref (priv->icon_texture); g_object_unref (priv->icon_texture);
st_icon_clear_shadow_pipeline (icon); st_icon_update_shadow_pipeline (icon);
/* "pixbuf-change" is actually a misnomer for "texture-changed" */ /* "pixbuf-change" is actually a misnomer for "texture-changed" */
g_signal_connect_object (priv->icon_texture, "pixbuf-change", g_signal_connect_object (priv->icon_texture, "pixbuf-change",

View File

@ -432,8 +432,6 @@ _st_create_shadow_pipeline_from_actor (StShadow *shadow_spec,
CoglPipeline *shadow_pipeline = NULL; CoglPipeline *shadow_pipeline = NULL;
float width, height; float width, height;
g_return_val_if_fail (clutter_actor_has_allocation (actor), NULL);
clutter_actor_get_size (actor, &width, &height); clutter_actor_get_size (actor, &width, &height);
if (width == 0 || height == 0) if (width == 0 || height == 0)

View File

@ -304,13 +304,6 @@ st_scroll_view_pick (ClutterActor *actor,
clutter_actor_paint (priv->vscroll); clutter_actor_paint (priv->vscroll);
} }
static gboolean
st_scroll_view_get_paint_volume (ClutterActor *actor,
ClutterPaintVolume *volume)
{
return clutter_paint_volume_set_from_allocation (volume, actor);
}
static double static double
get_scrollbar_width (StScrollView *scroll, get_scrollbar_width (StScrollView *scroll,
gfloat for_height) gfloat for_height)
@ -800,7 +793,6 @@ st_scroll_view_class_init (StScrollViewClass *klass)
actor_class->paint = st_scroll_view_paint; actor_class->paint = st_scroll_view_paint;
actor_class->pick = st_scroll_view_pick; actor_class->pick = st_scroll_view_pick;
actor_class->get_paint_volume = st_scroll_view_get_paint_volume;
actor_class->get_preferred_width = st_scroll_view_get_preferred_width; actor_class->get_preferred_width = st_scroll_view_get_preferred_width;
actor_class->get_preferred_height = st_scroll_view_get_preferred_height; actor_class->get_preferred_height = st_scroll_view_get_preferred_height;
actor_class->allocate = st_scroll_view_allocate; actor_class->allocate = st_scroll_view_allocate;

View File

@ -780,13 +780,13 @@ st_texture_cache_load (StTextureCache *cache,
if (!texture) if (!texture)
{ {
texture = load (cache, key, data, error); texture = load (cache, key, data, error);
if (texture && policy == ST_TEXTURE_CACHE_POLICY_FOREVER) if (texture)
g_hash_table_insert (cache->priv->keyed_cache, g_strdup (key), texture); g_hash_table_insert (cache->priv->keyed_cache, g_strdup (key), texture);
else
return NULL;
} }
if (texture && policy == ST_TEXTURE_CACHE_POLICY_FOREVER)
cogl_object_ref (texture); cogl_object_ref (texture);
return texture; return texture;
} }

View File

@ -402,7 +402,7 @@ st_theme_node_lookup_corner (StThemeNode *node,
return COGL_INVALID_HANDLE; return COGL_INVALID_HANDLE;
key = corner_to_string (&corner); key = corner_to_string (&corner);
texture = st_texture_cache_load (cache, key, ST_TEXTURE_CACHE_POLICY_FOREVER, load_corner, &corner, NULL); texture = st_texture_cache_load (cache, key, ST_TEXTURE_CACHE_POLICY_NONE, load_corner, &corner, NULL);
if (texture) if (texture)
{ {

View File

@ -1,38 +0,0 @@
#!/bin/sh
PKG_DATA_DIR=${XDG_DATA_HOME:-$HOME/.local/share}/gnome-shell
MIGRATION_GUARD=$PKG_DATA_DIR/gnome-overrides-migrated
OVERRIDE_SCHEMA=
if [ -f $MIGRATION_GUARD ]; then
exit # already migrated
fi
# Find the right session
if echo $XDG_CURRENT_DESKTOP | grep -q -v GNOME; then
exit # not a GNOME session
fi
if echo $XDG_CURRENT_DESKTOP | grep -q Classic; then
OVERRIDE_SCHEMA=org.gnome.shell.extensions.classic-overrides
else
OVERRIDE_SCHEMA=org.gnome.shell.overrides
fi
mkdir -p $PKG_DATA_DIR
for k in `gsettings list-keys $OVERRIDE_SCHEMA`
do
if [ $k = button-layout ]; then
orig_schema=org.gnome.desktop.wm.preferences
else
orig_schema=org.gnome.mutter
fi
oldValue=`gsettings get $OVERRIDE_SCHEMA $k`
curValue=`gsettings get $orig_schema $k`
if [ $oldValue != $curValue ]; then
gsettings set $orig_schema $k $oldValue
fi
done && touch $MIGRATION_GUARD

View File

@ -1,4 +0,0 @@
install_data('gnome-shell-overrides-migration.sh',
install_dir: libexecdir,
install_mode: 'rwxr-xr-x'
)