Compare commits

...

23 Commits

Author SHA1 Message Date
a91c1caf42 Bump version to 3.16.3
Update NEWS.
2015-07-02 14:26:44 +02:00
90f14d0762 app-system: Improve StartupWMClass heuristics
Our StartUpWMClass heuristics use a StartupWMClass -> .desktop ID
mapping built from the list of all installed applications. In case
of multiple .desktop files setting the same StartupWMClass, we
currently simply pick the last one returned by g_app_info_get_all (),
which can be a bit surprising:
A window with WM_CLASS 'emacs', launched through a .desktop file
named 'emacs.desktop' with a StartupWMClass of 'emacs' maps to ...
'emacsclient.desktop'!
Make this case a bit less random by preferring the app info whose
ID matches the StartupWMClass.

https://bugzilla.gnome.org/show_bug.cgi?id=751541
2015-07-02 14:21:38 +02:00
77f2e3abde gdm: fix banner allocation computation
The code to figure how how much room that banner had was wrong.
This commit fixes it.

https://bugzilla.gnome.org/show_bug.cgi?id=751517
2015-06-26 18:04:39 +02:00
a02019cf9e main: Fix a memory leak
We are pointlessly calling g_settings_list_keys() twice, without
freeing the result from the first call.
2015-06-26 18:04:31 +02:00
a341b74aeb AllView: prevent accessing a NULL effect
In some cases we might be allocated a size such that
this._grid.topPadding and this._grid.bottomPadding are both 0 which
means that the ScrollView fade effect gets removed. In that case don't
try to access the effect since it will be NULL.

https://bugzilla.gnome.org/show_bug.cgi?id=750714
2015-06-26 18:04:11 +02:00
9e0a5fa3a9 Revert "Revert "keyboard: Handle touch events""
And make these only handled on wayland. There's a plethora of issues
around touch passive grab and touch/pointer doubly handling to use
these right away on X11, so we stick to single-touch/pointer there.

This reverts commit 032a688a72.

https://bugzilla.gnome.org/show_bug.cgi?id=750287
2015-06-02 17:59:41 +02:00
49856d4961 windowMenu: Close when corresponding window goes away
The menu is clearly associated with a particular window, so keeping
it around when the window is gone doesn't make sense - in case of
the window menu, it is actually harmful as every action will act on
the invalidated window and result in a crash. So just dismiss the
menu when the menu is unmanaged.

https://bugzilla.gnome.org/show_bug.cgi?id=749529
2015-05-21 18:21:28 +02:00
4db34fca36 layout: Set initial visibility of fullscreen-tracking chrome
When chrome is added with the trackFullscreen parameter, the actor's
visibility will be updated automatically whenever its monitor's
fullscreen state changes. However as we currently ignore the fullscreen
state at the time the chrome is added, the initial visibility may well
be incorrect - fix this by updating the initial visibility as necessary.

https://bugzilla.gnome.org/show_bug.cgi?id=749383
2015-05-21 14:01:35 +02:00
3dfced7976 Bump version to 3.16.2
Update NEWS.
2015-05-14 15:31:02 +02:00
3e8b7faab8 messageTray: Emit signal when notifications are enabled/disabled
Since the introduction of per-source notification policy in commit
098bd4509b, the NotificationPolicy::enable-changed signal has been
used to track the 'enable' setting. However as we never actually
emitted that signal, this never worked without a restart - oops.

https://bugzilla.gnome.org/show_bug.cgi?id=749279
2015-05-14 15:15:54 +02:00
2a3e410d71 ScreenShield: only inhibit suspend if we're the active session
If we aren't the active session clutter can't animate and thus we
can't expect the shield to be shown before releasing the suspend
inhibitor so we should release it immediately when becoming inactive.

https://bugzilla.gnome.org/show_bug.cgi?id=749228
2015-05-14 13:59:48 +02:00
518e7d9fc5 ScreenShield: tie the suspend inhibitor to our isActive property
The whole point of holding a suspend inhibitor is to be able to lock
before suspending.

Currently, when resuming we immediately take the inhibitor without
checking that we're locked which means that we won't be able to
release this inhibitor if we don't unlock at least once.

To prevent that and to better match the inhibitor's intention in the
first place, we can tie the inhibitor with not being locked. In
practice, we also want to let the locking animation finish before
suspending, so we'll tie the inhibitor with not being active
instead.

https://bugzilla.gnome.org/show_bug.cgi?id=749228
2015-05-14 13:59:48 +02:00
0954efd875 ScreenShield: ensure we don't leak logind inhibitors
This could happen if we are VT switched away and an animated
activation is requested because we're preparing to enter sleep. Since
we don't animate in this case we'd never reach
_completeLockScreenShown() before coming out of sleep, at which point
we _inhibitSuspend() again and would leak the previous inhibitor.

https://bugzilla.gnome.org/show_bug.cgi?id=749228
2015-05-13 19:00:53 +02:00
8d913c5297 make expanders more visible for alt-tab
https://bugzilla.gnome.org/show_bug.cgi?id=745058
2015-05-11 15:21:04 +02:00
58b9b10ed3 Added Occitan translation 2015-05-10 12:29:23 +00:00
sun
fb46f0b808 update zh_CN translation 2015-05-03 10:09:43 +08:00
79c020fdb9 panel: Set up 'open-state-changed' handler on menu changes
Commit 08690d658f generalized the banner-blocking behavior of the
dateMenu to all menus that would obscure the banner. However setting
up the 'open-state-changed' handler only when an indicator is added
does not work for indicators that change their entire menu (like the
app menu) - we currently end up with menus with no connected signal
handler, and throw an error when trying to disconnect an invalid
signal ID.
To address this, add a new PanelButton::menu-set signal and use that
to set up the 'open-state-changed' handler.

https://bugzilla.gnome.org/show_bug.cgi?id=745910
2015-04-30 18:34:09 +02:00
f8eb9e763d shell-global: Mark the sync pointer motion event as synthetic
This allows mutter to ignore these events for the purpose of keeping
idle time.

https://bugzilla.gnome.org/show_bug.cgi?id=748541
2015-04-27 19:47:47 +02:00
ed6cb19283 Updated Icelandic translation 2015-04-27 15:30:20 +00:00
95c903aa40 panel: Block banners when opening menus that would overlap
We currently block banners while the time+date menu is open, as it
would obscure the notification. However it is not necessarily the
only menu for which this is the case, so generalize the behavior
to all menus that would overlap banners when open.

https://bugzilla.gnome.org/show_bug.cgi?id=745910
2015-04-25 09:57:56 +02:00
e4974beebf panel: Move notification banners below time+date dropdown
As notifications appear in the time+date dropdown's message list, there's
a strong relationship between notification banners and the menu. However
while the time+date menu is centered by default, which matches the banner
position, its actual position depends on the session mode - in particular
it is moved to the right in classic mode.
Reinforce the relationship in these cases by moving notification banners
underneath the time+date menu.

https://bugzilla.gnome.org/show_bug.cgi?id=745910
2015-04-25 09:57:56 +02:00
5ec9f15500 messageTray: Make notification banners unfocusable
Unlike entries in the calendar's message list, banners are not subject
to the normal keynav chain, and making the banner actor itself unfocusable
allows for the focus to be moved to the action area when expanded.

https://bugzilla.gnome.org/show_bug.cgi?id=747205
2015-04-16 18:32:35 +02:00
b4ebb4d98f calendar: make day with events more prominent
https://bugzilla.gnome.org/show_bug.cgi?id=747715
2015-04-15 13:03:18 +02:00
23 changed files with 2941 additions and 793 deletions

24
NEWS
View File

@ -1,3 +1,27 @@
3.16.3
======
* Handle touch events in OSK on wayland [Rui; #750287]
* Misc. bug fixes [Florian, Rui, Ray; #749383, #749529, #750714, #751517,
#751541]
Contributors:
Rui Matos, Florian Müllner, Ray Strode
3.16.2
======
* Make event highlight in calendar more prominent [Jakub; #747715]
* Fix keyboard focus when focusing a notification banner [Florian; #747205]
* Move notification banners below the dateMenu [Meet, Florian; #745910]
* Increase visibility of expanders in alt-tab popup [Jakub; #745058]
* Ensure suspend inhibitors are released when VT switched away [Rui; #749228]
* Misc. bug fixes [Rui, Florian; #748541, #749279]
Contributors:
Rui Matos, Florian Müllner, Meet Parikh, Jakub Steiner
Translations:
Sveinn í Felli [is], sun [zh_CN], Cédric Valmary [oc]
3.16.1
======
* gdm: Move long session chooser menus to the side [Florian; #734352]

View File

@ -1,5 +1,5 @@
AC_PREREQ(2.63)
AC_INIT([gnome-shell],[3.16.1],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_INIT([gnome-shell],[3.16.3],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_SRCDIR([src/shell-global.c])

View File

@ -10,11 +10,11 @@
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="29"
height="29"
width="24"
height="24"
id="svg10621"
version="1.1"
inkscape:version="0.48.2 r9819"
inkscape:version="0.91 r13725"
sodipodi:docname="calendar-today.svg">
<defs
id="defs10623">
@ -118,17 +118,6 @@
fx="51"
fy="30"
r="42" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient34508-1-3"
id="radialGradient3113"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
cx="51"
cy="30"
fx="51"
fy="30"
r="42" />
</defs>
<sodipodi:namedview
id="base"
@ -137,22 +126,23 @@
borderopacity="1.0"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:zoom="15.839192"
inkscape:cx="20.652108"
inkscape:cy="11.839084"
inkscape:zoom="8"
inkscape:cx="-23.537329"
inkscape:cy="-31.442864"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1280"
inkscape:window-height="741"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
borderlayer="true">
inkscape:window-width="2133"
inkscape:window-height="1241"
inkscape:window-x="238"
inkscape:window-y="88"
inkscape:window-maximized="0"
borderlayer="true"
inkscape:showpageshadow="false">
<inkscape:grid
type="xygrid"
id="grid3109"
@ -169,7 +159,7 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
@ -177,28 +167,12 @@
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-469.08263,-532.99307)">
<path
sodipodi:type="arc"
style="opacity:0.4625;color:#000000;fill:url(#radialGradient3113);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="path34506-3"
sodipodi:cx="51"
sodipodi:cy="30"
sodipodi:rx="42"
sodipodi:ry="16"
d="M 9,29.999999 A 42,16 0 0 1 93,30 l -42,0 z"
sodipodi:start="3.1415927"
sodipodi:end="6.2831853"
transform="matrix(0.43692393,0,0,1.3783114,461.29951,517.6437)"
inkscape:export-filename="/home/jimmac/src/cvs/gnome/gnome-shell-design/mockups/motion/textures/panel.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
<rect
style="fill:#ffffff;fill-opacity:0.50196078;stroke-width:0.43599999;stroke-miterlimit:4;stroke-dasharray:none"
id="rect2996"
width="31"
height="3"
x="468.08264"
y="558.99304" />
transform="translate(-469.08263,-537.99307)">
<circle
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:0.23756906;fill-rule:nonzero;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;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="path7305"
cx="481.57138"
cy="559.4649"
r="1.5" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

@ -488,10 +488,9 @@ StScrollBar {
.switcher-arrow {
border-color: transparent;
color: black; }
.switcher-arrow:highlighted {
color: #fff; }
color: rgba(255, 255, 255, 0.8); }
.switcher-arrow:highlighted {
color: #fff; }
.input-source-switcher-symbol {
font-size: 34pt;
@ -710,8 +709,9 @@ StScrollBar {
border: 1px solid rgba(0, 0, 0, 0.5); }
.calendar-day-with-events {
color: #f2f2f2;
font-weight: bold; }
color: white;
font-weight: bold;
background-image: url("resource:///org/gnome/shell/theme/calendar-today.svg"); }
.calendar-other-month-day {
color: rgba(255, 255, 255, 0.15);

View File

@ -488,10 +488,9 @@ StScrollBar {
.switcher-arrow {
border-color: transparent;
color: #1c1f1f; }
.switcher-arrow:highlighted {
color: #eeeeec; }
color: rgba(238, 238, 236, 0.8); }
.switcher-arrow:highlighted {
color: #eeeeec; }
.input-source-switcher-symbol {
font-size: 34pt;
@ -710,8 +709,9 @@ StScrollBar {
border: 1px solid rgba(28, 31, 31, 0.5); }
.calendar-day-with-events {
color: #e2e2df;
font-weight: bold; }
color: white;
font-weight: bold;
background-image: url("resource:///org/gnome/shell/theme/calendar-today.svg"); }
.calendar-other-month-day {
color: rgba(238, 238, 236, 0.15);

View File

@ -584,7 +584,14 @@ const LoginDialog = new Lang.Class({
// try a different layout, or if we have what extra space we
// can hand out
if (bannerAllocation) {
let leftOverYSpace = dialogHeight - bannerHeight - authPromptHeight - logoHeight;
let bannerSpace;
if (authPromptAllocation)
bannerSpace = authPromptAllocation.y1 - bannerAllocation.y1;
else
bannerSpace = 0;
let leftOverYSpace = bannerSpace - bannerHeight;
if (leftOverYSpace > 0) {
// First figure out how much left over space is up top

View File

@ -753,7 +753,8 @@ const AllView = new Lang.Class({
let fadeOffset = Math.min(this._grid.topPadding,
this._grid.bottomPadding);
this._scrollView.update_fade_effect(fadeOffset, 0);
this._scrollView.get_effect('fade').fade_edges = true;
if (fadeOffset > 0)
this._scrollView.get_effect('fade').fade_edges = true;
if (this._availWidth != availWidth || this._availHeight != availHeight || oldNPages != this._grid.nPages()) {
this._adjustment.value = 0;

View File

@ -357,8 +357,6 @@ const DateMenuButton = new Lang.Class({
this._date.setDate(now);
this._messageList.setDate(now);
}
// Block notification banners while the menu is open
Main.messageTray.bannerBlocked = isOpen;
}));
// Fill up the first column

View File

@ -114,6 +114,35 @@ const Key = new Lang.Class({
key.release();
return Clutter.EVENT_PROPAGATE;
}));
button.connect('touch-event', Lang.bind(this,
function (actor, event) {
let device = event.get_device();
let sequence = event.get_event_sequence();
// We only handle touch events here on wayland. On X11
// we do get emulated pointer events, which already works
// for single-touch cases. Besides, the X11 passive touch grab
// set up by Mutter will make us see first the touch events
// and later the pointer events, so it will look like two
// unrelated series of events, we want to avoid double handling
// in these cases.
if (!Meta.is_wayland_compositor())
return Clutter.EVENT_PROPAGATE;
if (!this._touchPressed &&
event.type() == Clutter.EventType.TOUCH_BEGIN) {
device.sequence_grab(sequence, actor);
this._touchPressed = true;
key.press();
} else if (this._touchPressed &&
event.type() == Clutter.EventType.TOUCH_END &&
device.sequence_get_grabbed_actor(sequence) == actor) {
device.sequence_ungrab(sequence);
this._touchPressed = false;
key.release();
}
return Clutter.EVENT_PROPAGATE;
}));
return button;
},

View File

@ -837,6 +837,7 @@ const LayoutManager = new Lang.Class({
// need to connect to 'destroy' too.
this._trackedActors.push(actorData);
this._updateActorVisibility(actorData);
this._queueUpdateRegions();
},
@ -855,25 +856,23 @@ const LayoutManager = new Lang.Class({
this._queueUpdateRegions();
},
_updateActorVisibility: function(actorData) {
if (!actorData.trackFullscreen)
return;
let monitor = this.findMonitorForActor(actorData.actor);
actorData.actor.visible = !(global.window_group.visible &&
monitor &&
monitor.inFullscreen);
},
_updateVisibility: function() {
let windowsVisible = Main.sessionMode.hasWindows && !this._inOverview;
global.window_group.visible = windowsVisible;
global.top_window_group.visible = windowsVisible;
for (let i = 0; i < this._trackedActors.length; i++) {
let actorData = this._trackedActors[i], visible;
if (!actorData.trackFullscreen)
continue;
if (!windowsVisible)
visible = true;
else if (this.findMonitorForActor(actorData.actor).inFullscreen)
visible = false;
else
visible = true;
actorData.actor.visible = visible;
}
this._trackedActors.forEach(Lang.bind(this, this._updateActorVisibility));
},
getWorkAreaForMonitor: function(monitorIndex) {

View File

@ -258,6 +258,8 @@ const NotificationApplicationPolicy = new Lang.Class({
_changed: function(settings, key) {
this.emit('policy-changed', key);
if (key == 'enable')
this.emit('enable-changed');
},
_canonicalizeId: function(id) {
@ -508,6 +510,7 @@ const NotificationBanner = new Lang.Class({
_init: function(notification) {
this.parent(notification);
this.actor.can_focus = false;
this.actor.add_style_class_name('notification-banner');
this._buttonBox = null;
@ -975,6 +978,14 @@ const MessageTray = new Lang.Class({
Shell.util_set_hidden_from_pick(this.actor, false);
},
get bannerAlignment() {
return this._bannerBin.get_x_align();
},
set bannerAlignment(align) {
this._bannerBin.set_x_align(align);
},
_onNotificationKeyRelease: function(actor, event) {
if (event.get_key_symbol() == Clutter.KEY_Escape && event.get_state() == 0) {
this._expireNotification();

View File

@ -933,6 +933,14 @@ const Panel = new Lang.Class({
this._updateBox(panel.center, this._centerBox);
this._updateBox(panel.right, this._rightBox);
if (panel.left.indexOf('dateMenu') != -1)
Main.messageTray.bannerAlignment = Clutter.ActorAlign.START;
else if (panel.right.indexOf('dateMenu') != -1)
Main.messageTray.bannerAlignment = Clutter.ActorAlign.END;
// Default to center if there is no dateMenu
else
Main.messageTray.bannerAlignment = Clutter.ActorAlign.CENTER;
if (this._sessionStyle)
this._removeStyleClassName(this._sessionStyle);
@ -995,6 +1003,7 @@ const Panel = new Lang.Class({
if (parent)
parent.remove_actor(container);
box.insert_child_at_index(container, position);
if (indicator.menu)
this.menuManager.addMenu(indicator.menu);
@ -1004,6 +1013,8 @@ const Panel = new Lang.Class({
emitter.disconnect(destroyId);
container.destroy();
}));
indicator.connect('menu-set', Lang.bind(this, this._onMenuSet));
this._onMenuSet(indicator);
},
addToStatusArea: function(role, indicator, position, box) {
@ -1035,5 +1046,24 @@ const Panel = new Lang.Class({
this.actor.remove_style_class_name(className);
this._rightCorner.actor.remove_style_class_name(className);
this._leftCorner.actor.remove_style_class_name(className);
},
_onMenuSet: function(indicator) {
if (!indicator.menu || indicator.menu._openChangedId > 0)
return;
indicator.menu._openChangedId = indicator.menu.connect('open-state-changed',
Lang.bind(this, function(menu, isOpen) {
let boxAlignment;
if (this._leftBox.contains(indicator.container))
boxAlignment = Clutter.ActorAlign.START;
else if (this._centerBox.contains(indicator.container))
boxAlignment = Clutter.ActorAlign.CENTER;
else if (this._rightBox.contains(indicator.container))
boxAlignment = Clutter.ActorAlign.END;
if (boxAlignment == Main.messageTray.bannerAlignment)
Main.messageTray.bannerBlocked = isOpen;
}));
}
});

View File

@ -128,6 +128,7 @@ const Button = new Lang.Class({
Main.uiGroup.add_actor(this.menu.actor);
this.menu.actor.hide();
}
this.emit('menu-set');
},
_onEvent: function(actor, event) {

View File

@ -507,21 +507,22 @@ const ScreenShield = new Lang.Class({
this._liftShield(true, 0);
}));
this._inhibitor = null;
this._aboutToSuspend = false;
this._loginManager = LoginManager.getLoginManager();
this._loginManager.connect('prepare-for-sleep',
Lang.bind(this, this._prepareForSleep));
this._inhibitSuspend();
this._loginSession = null;
this._loginManager.getCurrentSessionProxy(Lang.bind(this,
function(sessionProxy) {
this._loginSession = sessionProxy;
this._loginSession.connectSignal('Lock', Lang.bind(this, function() { this.lock(false); }));
this._loginSession.connectSignal('Unlock', Lang.bind(this, function() { this.deactivate(false); }));
this._loginSession.connect('g-properties-changed', Lang.bind(this, this._syncInhibitor));
this._syncInhibitor();
}));
this._settings = new Gio.Settings({ schema_id: SCREENSAVER_SCHEMA });
this._settings.connect('changed::' + LOCK_ENABLED_KEY, Lang.bind(this, this._syncInhibitor));
this._isModal = false;
this._hasLockScreen = false;
@ -547,6 +548,18 @@ const ScreenShield = new Lang.Class({
this.idleMonitor = Meta.IdleMonitor.get_core();
this._cursorTracker = Meta.CursorTracker.get_for_screen(global.screen);
this._syncInhibitor();
},
_setActive: function(active) {
let prevIsActive = this._isActive;
this._isActive = active;
if (prevIsActive != this._isActive)
this.emit('active-changed');
this._syncInhibitor();
},
_createBackground: function(monitorIndex) {
@ -664,31 +677,28 @@ const ScreenShield = new Lang.Class({
return Clutter.EVENT_STOP;
},
_inhibitSuspend: function() {
this._loginManager.inhibit(_("GNOME needs to lock the screen"),
Lang.bind(this, function(inhibitor) {
this._inhibitor = inhibitor;
}));
},
_uninhibitSuspend: function() {
if (this._inhibitor)
this._inhibitor.close(null);
this._inhibitor = null;
_syncInhibitor: function() {
let inhibit = (this._loginSession && this._loginSession.Active &&
!this._isActive && this._settings.get_boolean(LOCK_ENABLED_KEY));
if (inhibit) {
this._loginManager.inhibit(_("GNOME needs to lock the screen"),
Lang.bind(this, function(inhibitor) {
if (this._inhibitor)
this._inhibitor.close(null);
this._inhibitor = inhibitor;
}));
} else {
if (this._inhibitor)
this._inhibitor.close(null);
this._inhibitor = null;
}
},
_prepareForSleep: function(loginManager, aboutToSuspend) {
this._aboutToSuspend = aboutToSuspend;
if (aboutToSuspend) {
if (!this._settings.get_boolean(LOCK_ENABLED_KEY)) {
this._uninhibitSuspend();
return;
}
this.lock(true);
if (this._settings.get_boolean(LOCK_ENABLED_KEY))
this.lock(true);
} else {
this._inhibitSuspend();
this._wakeUpScreen();
}
},
@ -1083,15 +1093,7 @@ const ScreenShield = new Lang.Class({
},
_completeLockScreenShown: function() {
let prevIsActive = this._isActive;
this._isActive = true;
if (prevIsActive != this._isActive)
this.emit('active-changed');
if (this._aboutToSuspend)
this._uninhibitSuspend();
this._setActive(true);
this.emit('lock-screen-shown');
},
@ -1185,8 +1187,7 @@ const ScreenShield = new Lang.Class({
// gnome-settings-daemon will stop blanking the screen
this._activationTime = 0;
this._isActive = false;
this.emit('active-changed');
this._setActive(false);
return;
}
@ -1229,9 +1230,8 @@ const ScreenShield = new Lang.Class({
}
this._activationTime = 0;
this._isActive = false;
this._setActive(false);
this._isLocked = false;
this.emit('active-changed');
this.emit('locked-changed');
global.set_runtime_state(LOCKED_STATE_STR, null);
},

View File

@ -167,6 +167,10 @@ const WindowMenuManager = new Lang.Class({
menu.connect('activate', function() {
window.check_alive(global.get_current_time());
});
let destroyId = window.connect('unmanaged',
function() {
menu.close();
});
this._sourceActor.set_size(rect.width, rect.height);
this._sourceActor.set_position(rect.x, rect.y);
@ -180,6 +184,7 @@ const WindowMenuManager = new Lang.Class({
this._sourceActor.hide();
menu.destroy();
window.disconnect(destroyId);
}));
}
});

View File

@ -50,6 +50,7 @@ nb
ne
nl
nn
oc
or
pa
pl

933
po/is.po

File diff suppressed because it is too large Load Diff

2115
po/oc.po Normal file

File diff suppressed because it is too large Load Diff

View File

@ -21,8 +21,8 @@ msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2015-03-03 22:33+0000\n"
"PO-Revision-Date: 2015-03-04 17:55+0800\n"
"POT-Creation-Date: 2015-04-25 08:00+0000\n"
"PO-Revision-Date: 2015-04-17 19:36+0800\n"
"Last-Translator: Aron Xu <happyaron.xu@gmail.com>\n"
"Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n"
"Language: zh_CN\n"
@ -30,6 +30,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Poedit 1.7.5\n"
#: ../data/50-gnome-shell-system.xml.in.h:1
msgid "System"
@ -287,55 +288,55 @@ msgstr "将鼠标模式下焦点的更改推迟到指针停止移动之后"
msgid "Network Login"
msgstr "网络登录"
#: ../js/extensionPrefs/main.js:123
#: ../js/extensionPrefs/main.js:122
#, javascript-format
msgid "There was an error loading the preferences dialog for %s:"
msgstr "载入 %s 的首选想对话框出错:"
#: ../js/extensionPrefs/main.js:155
#: ../js/extensionPrefs/main.js:154
msgid "GNOME Shell Extensions"
msgstr "配置 GNOME Shell 扩展"
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:143
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:145
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:452
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/network.js:916
msgid "Cancel"
msgstr "取消"
#: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:217
#: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:215
msgid "Next"
msgstr "下一步"
#: ../js/gdm/authPrompt.js:213 ../js/ui/shellMountOperation.js:403
#: ../js/gdm/authPrompt.js:211 ../js/ui/shellMountOperation.js:403
#: ../js/ui/unlockDialog.js:59
msgid "Unlock"
msgstr "解锁"
#: ../js/gdm/authPrompt.js:215
#: ../js/gdm/authPrompt.js:213
msgctxt "button"
msgid "Sign In"
msgstr "登录"
#: ../js/gdm/loginDialog.js:276
#: ../js/gdm/loginDialog.js:281
msgid "Choose Session"
msgstr "选择会话"
#: ../js/gdm/loginDialog.js:417
#: ../js/gdm/loginDialog.js:431
msgid "Not listed?"
msgstr "未列出?"
#: ../js/gdm/loginDialog.js:826
#: ../js/gdm/loginDialog.js:840
#, javascript-format
msgid "(e.g., user or %s)"
msgstr "(如 user 或 %s)"
#: ../js/gdm/loginDialog.js:831 ../js/ui/components/networkAgent.js:269
#: ../js/ui/components/networkAgent.js:287
#: ../js/gdm/loginDialog.js:845 ../js/ui/components/networkAgent.js:271
#: ../js/ui/components/networkAgent.js:289
msgid "Username: "
msgstr "用户名:"
#: ../js/gdm/loginDialog.js:1166
#: ../js/gdm/loginDialog.js:1173
msgid "Login Window"
msgstr "登录窗口"
@ -347,50 +348,112 @@ msgstr "认证出错"
msgid "(or swipe finger)"
msgstr "(或滑动手指)"
#: ../js/misc/util.js:115
#: ../js/misc/util.js:119
msgid "Command not found"
msgstr "命令未找到"
#: ../js/misc/util.js:148
#: ../js/misc/util.js:152
msgid "Could not parse command:"
msgstr "不能解析命令:"
#: ../js/misc/util.js:156
#: ../js/misc/util.js:160
#, javascript-format
msgid "Execution of “%s” failed:"
msgstr "运行“%s”失败"
#. Translators: Time in 24h format */
#: ../js/misc/util.js:191
msgid "%H%M"
msgstr "%H%M"
#. Translators: this is the word "Yesterday" followed by a
#. time string in 24h format. i.e. "Yesterday, 14:30" */
#: ../js/misc/util.js:197
msgid "Yesterday, %H%M"
msgstr "昨天 %H:%M"
#. Translators: this is the week day name followed by a time
#. string in 24h format. i.e. "Monday, 14:30" */
#: ../js/misc/util.js:203
msgid "%A, %H%M"
msgstr "%A %H:%M"
#. Translators: this is the month name and day number
#. followed by a time string in 24h format.
#. i.e. "May 25, 14:30" */
#: ../js/misc/util.js:209
msgid "%B %d, %H%M"
msgstr "%m月%d日, %H:%M"
#. Translators: this is the month name, day number, year
#. number followed by a time string in 24h format.
#. i.e. "May 25 2012, 14:30" */
#: ../js/misc/util.js:215
msgid "%B %d %Y, %H%M"
msgstr "%Y年%m月%d日, %H:%M"
#. Translators: Time in 12h format */
#: ../js/misc/util.js:220
msgid "%l%M %p"
msgstr "%p %-l:%M"
#. Translators: this is the word "Yesterday" followed by a
#. time string in 12h format. i.e. "Yesterday, 2:30 pm" */
#: ../js/misc/util.js:226
msgid "Yesterday, %l%M %p"
msgstr "昨天%p %-l:%M"
#. Translators: this is the week day name followed by a time
#. string in 12h format. i.e. "Monday, 2:30 pm" */
#: ../js/misc/util.js:232
msgid "%A, %l%M %p"
msgstr "%A%p %-l:%M"
#. Translators: this is the month name and day number
#. followed by a time string in 12h format.
#. i.e. "May 25, 2:30 pm" */
#: ../js/misc/util.js:238
msgid "%B %d, %l%M %p"
msgstr "%m月%d日%p %-l:%M"
#. Translators: this is the month name, day number, year
#. number followed by a time string in 12h format.
#. i.e. "May 25 2012, 2:30 pm"*/
#: ../js/misc/util.js:244
msgid "%B %d %Y, %l%M %p"
msgstr "%Y年%m月%d日%p %-l:%M"
#. TRANSLATORS: this is the title of the wifi captive portal login
#. * window, until we know the title of the actual login page */
#: ../js/portalHelper/main.js:85
msgid "Web Authentication Redirect"
msgstr "网页认证重定向"
#: ../js/ui/appDisplay.js:785
#: ../js/ui/appDisplay.js:788
msgid "Frequently used applications will appear here"
msgstr "常用的应用程序会出现在这里"
#: ../js/ui/appDisplay.js:905
#: ../js/ui/appDisplay.js:908
msgid "Frequent"
msgstr "常用"
#: ../js/ui/appDisplay.js:912
#: ../js/ui/appDisplay.js:915
msgid "All"
msgstr "全部"
#: ../js/ui/appDisplay.js:1840
#: ../js/ui/appDisplay.js:1844
msgid "New Window"
msgstr "新窗口"
#: ../js/ui/appDisplay.js:1868 ../js/ui/dash.js:289
#: ../js/ui/appDisplay.js:1872 ../js/ui/dash.js:289
msgid "Remove from Favorites"
msgstr "从收藏夹中移除"
#: ../js/ui/appDisplay.js:1874
#: ../js/ui/appDisplay.js:1878
msgid "Add to Favorites"
msgstr "添加到收藏夹"
#: ../js/ui/appDisplay.js:1884
#: ../js/ui/appDisplay.js:1888
msgid "Show Details"
msgstr "显示细节"
@ -404,8 +467,8 @@ msgstr "%s 已经添加到了您的收藏夹。"
msgid "%s has been removed from your favorites."
msgstr "%s 已经从您的收藏夹移除。"
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:649
#: ../js/ui/status/system.js:337
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:650
#: ../js/ui/status/system.js:334
msgid "Settings"
msgstr "设置"
@ -414,119 +477,104 @@ msgid "Change Background…"
msgstr "更换壁纸..."
#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). */
#: ../js/ui/calendar.js:52
#: ../js/ui/calendar.js:53
msgctxt "calendar-no-work"
msgid "06"
msgstr "周日和周六"
#. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters
#. */
#: ../js/ui/calendar.js:81
msgctxt "event list time"
msgid "All Day"
msgstr "全天"
#. Translators: Shown in calendar event list, if 24h format,
#. \u2236 is a ratio character, similar to : */
#: ../js/ui/calendar.js:88 ../js/ui/calendar.js:1596
msgctxt "event list time"
msgid "%H%M"
msgstr "%H%M"
#. Translators: Shown in calendar event list, if 12h format,
#. \u2236 is a ratio character, similar to : and \u2009 is
#. a thin space */
#: ../js/ui/calendar.js:97
msgctxt "event list time"
msgid "%l%M%p"
msgstr "%p %-l:%M"
#. Translators: Calendar grid abbreviation for Sunday.
#. *
#. * NOTE: These grid abbreviations are always shown together
#. * and in order, e.g. "S M T W T F S".
#. */
#: ../js/ui/calendar.js:111
#: ../js/ui/calendar.js:82
msgctxt "grid sunday"
msgid "S"
msgstr "日"
#. Translators: Calendar grid abbreviation for Monday */
#: ../js/ui/calendar.js:113
#: ../js/ui/calendar.js:84
msgctxt "grid monday"
msgid "M"
msgstr "一"
#. Translators: Calendar grid abbreviation for Tuesday */
#: ../js/ui/calendar.js:115
#: ../js/ui/calendar.js:86
msgctxt "grid tuesday"
msgid "T"
msgstr "二"
#. Translators: Calendar grid abbreviation for Wednesday */
#: ../js/ui/calendar.js:117
#: ../js/ui/calendar.js:88
msgctxt "grid wednesday"
msgid "W"
msgstr "三"
#. Translators: Calendar grid abbreviation for Thursday */
#: ../js/ui/calendar.js:119
#: ../js/ui/calendar.js:90
msgctxt "grid thursday"
msgid "T"
msgstr "四"
#. Translators: Calendar grid abbreviation for Friday */
#: ../js/ui/calendar.js:121
#: ../js/ui/calendar.js:92
msgctxt "grid friday"
msgid "F"
msgstr "五"
#. Translators: Calendar grid abbreviation for Saturday */
#: ../js/ui/calendar.js:123
#: ../js/ui/calendar.js:94
msgctxt "grid saturday"
msgid "S"
msgstr "六"
#: ../js/ui/calendar.js:590
#: ../js/ui/calendar.js:564
msgid "Previous month"
msgstr "上个月"
#: ../js/ui/calendar.js:600
#: ../js/ui/calendar.js:574
msgid "Next month"
msgstr "下个月"
#: ../js/ui/calendar.js:807
#: ../js/ui/calendar.js:781
msgid "Week %V"
msgstr "第 %V 星期"
#: ../js/ui/calendar.js:1263
#. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters
#. */
#: ../js/ui/calendar.js:1187
msgctxt "event list time"
msgid "All Day"
msgstr "全天"
#: ../js/ui/calendar.js:1289
msgid "Clear section"
msgstr "清除选中项目"
#: ../js/ui/calendar.js:1455
#: ../js/ui/calendar.js:1516
msgid "Events"
msgstr "事件"
#: ../js/ui/calendar.js:1463
#: ../js/ui/calendar.js:1525
msgctxt "calendar heading"
msgid "%A, %B %d"
msgstr "%m月%d日 %A"
#: ../js/ui/calendar.js:1467
#: ../js/ui/calendar.js:1529
msgctxt "calendar heading"
msgid "%A, %B %d, %Y"
msgstr "%Y年%m月%d日 %A"
#: ../js/ui/calendar.js:1560
#: ../js/ui/calendar.js:1614
msgid "Notifications"
msgstr "提示"
#: ../js/ui/calendar.js:1700
#: ../js/ui/calendar.js:1765
msgid "No Notifications"
msgstr "无提示"
#: ../js/ui/calendar.js:1703
#: ../js/ui/calendar.js:1768
msgid "No Events"
msgstr "无事件"
@ -551,79 +599,93 @@ msgstr "密码:"
msgid "Type again:"
msgstr "再输一次:"
#: ../js/ui/components/networkAgent.js:138 ../js/ui/status/network.js:277
#: ../js/ui/components/networkAgent.js:140 ../js/ui/status/network.js:277
#: ../js/ui/status/network.js:359 ../js/ui/status/network.js:919
msgid "Connect"
msgstr "连接"
#: ../js/ui/components/networkAgent.js:231
#: ../js/ui/components/networkAgent.js:243
#: ../js/ui/components/networkAgent.js:271
#: ../js/ui/components/networkAgent.js:291
#: ../js/ui/components/networkAgent.js:301
#: ../js/ui/components/networkAgent.js:233
#: ../js/ui/components/networkAgent.js:245
#: ../js/ui/components/networkAgent.js:273
#: ../js/ui/components/networkAgent.js:293
#: ../js/ui/components/networkAgent.js:303
msgid "Password: "
msgstr "密码:"
#: ../js/ui/components/networkAgent.js:236
#: ../js/ui/components/networkAgent.js:238
msgid "Key: "
msgstr "密钥:"
#: ../js/ui/components/networkAgent.js:275
#: ../js/ui/components/networkAgent.js:277
msgid "Identity: "
msgstr "身份:"
#: ../js/ui/components/networkAgent.js:277
#: ../js/ui/components/networkAgent.js:279
msgid "Private key password: "
msgstr "私人密钥密码:"
#: ../js/ui/components/networkAgent.js:289
#: ../js/ui/components/networkAgent.js:291
msgid "Service: "
msgstr "服务:"
#: ../js/ui/components/networkAgent.js:318
#: ../js/ui/components/networkAgent.js:320
#: ../js/ui/components/networkAgent.js:658
msgid "Authentication required by wireless network"
msgstr "无线网络要求身份认证"
#: ../js/ui/components/networkAgent.js:319
#: ../js/ui/components/networkAgent.js:321
#: ../js/ui/components/networkAgent.js:659
#, javascript-format
msgid ""
"Passwords or encryption keys are required to access the wireless network "
"“%s”."
msgstr "访问无线网络“%s”需要密码或密钥。"
#: ../js/ui/components/networkAgent.js:323
#: ../js/ui/components/networkAgent.js:325
#: ../js/ui/components/networkAgent.js:662
msgid "Wired 802.1X authentication"
msgstr "有线 802.1X 认证"
#: ../js/ui/components/networkAgent.js:325
#: ../js/ui/components/networkAgent.js:327
msgid "Network name: "
msgstr "网络名称:"
#: ../js/ui/components/networkAgent.js:330
#: ../js/ui/components/networkAgent.js:332
#: ../js/ui/components/networkAgent.js:666
msgid "DSL authentication"
msgstr "DSL 认证"
#: ../js/ui/components/networkAgent.js:337
#: ../js/ui/components/networkAgent.js:339
#: ../js/ui/components/networkAgent.js:672
msgid "PIN code required"
msgstr "需要 PIN 码"
#: ../js/ui/components/networkAgent.js:338
#: ../js/ui/components/networkAgent.js:340
#: ../js/ui/components/networkAgent.js:673
msgid "PIN code is needed for the mobile broadband device"
msgstr "移动宽带设备需要 PIN 码"
#: ../js/ui/components/networkAgent.js:339
#: ../js/ui/components/networkAgent.js:341
msgid "PIN: "
msgstr "PIN"
#: ../js/ui/components/networkAgent.js:345
#: ../js/ui/components/networkAgent.js:348
#: ../js/ui/components/networkAgent.js:679
msgid "Mobile broadband network password"
msgstr "移动宽带网络密码"
#: ../js/ui/components/networkAgent.js:346
#: ../js/ui/components/networkAgent.js:349
#: ../js/ui/components/networkAgent.js:663
#: ../js/ui/components/networkAgent.js:667
#: ../js/ui/components/networkAgent.js:680
#, javascript-format
msgid "A password is required to connect to “%s”."
msgstr "连接到“%s”需要密码。"
#: ../js/ui/components/networkAgent.js:647 ../js/ui/status/network.js:1657
msgid "Network Manager"
msgstr "网络管理器"
#: ../js/ui/components/polkitAgent.js:54
msgid "Authentication Required"
msgstr "需要认证"
@ -644,71 +706,9 @@ msgstr "认证"
msgid "Sorry, that didn't work. Please try again."
msgstr "抱歉,您的输入有误。请重试。"
#. Translators: Time in 24h format */
#: ../js/ui/components/telepathyClient.js:764 ../js/ui/dateMenu.js:210
msgid "%H%M"
msgstr "%H%M"
#. Translators: this is the word "Yesterday" followed by a
#. time string in 24h format. i.e. "Yesterday, 14:30" */
#: ../js/ui/components/telepathyClient.js:771
msgid "Yesterday, %H%M"
msgstr "昨天 %H:%M"
#. Translators: this is the week day name followed by a time
#. string in 24h format. i.e. "Monday, 14:30" */
#: ../js/ui/components/telepathyClient.js:778
msgid "%A, %H%M"
msgstr "%A %H:%M"
#. Translators: this is the month name and day number
#. followed by a time string in 24h format.
#. i.e. "May 25, 14:30" */
#: ../js/ui/components/telepathyClient.js:785
msgid "%B %d, %H%M"
msgstr "%m月%d日, %H:%M"
#. Translators: this is the month name, day number, year
#. number followed by a time string in 24h format.
#. i.e. "May 25 2012, 14:30" */
#: ../js/ui/components/telepathyClient.js:791
msgid "%B %d %Y, %H%M"
msgstr "%Y年%m月%d日, %H:%M"
#. Translators: Time in 12h format */
#: ../js/ui/components/telepathyClient.js:797 ../js/ui/dateMenu.js:213
msgid "%l%M %p"
msgstr "%p %-l:%M"
#. Translators: this is the word "Yesterday" followed by a
#. time string in 12h format. i.e. "Yesterday, 2:30 pm" */
#: ../js/ui/components/telepathyClient.js:804
msgid "Yesterday, %l%M %p"
msgstr "昨天%p %-l:%M"
#. Translators: this is the week day name followed by a time
#. string in 12h format. i.e. "Monday, 2:30 pm" */
#: ../js/ui/components/telepathyClient.js:811
msgid "%A, %l%M %p"
msgstr "%A%p %-l:%M"
#. Translators: this is the month name and day number
#. followed by a time string in 12h format.
#. i.e. "May 25, 2:30 pm" */
#: ../js/ui/components/telepathyClient.js:818
msgid "%B %d, %l%M %p"
msgstr "%m月%d日%p %-l:%M"
#. Translators: this is the month name, day number, year
#. number followed by a time string in 12h format.
#. i.e. "May 25 2012, 2:30 pm"*/
#: ../js/ui/components/telepathyClient.js:824
msgid "%B %d %Y, %l%M %p"
msgstr "%Y年%m月%d日%p %-l:%M"
#. Translators: this is the other person changing their old IM name to their new
#. IM name. */
#: ../js/ui/components/telepathyClient.js:856
#: ../js/ui/components/telepathyClient.js:757
#, javascript-format
msgid "%s is now known as %s"
msgstr "%s 现在叫做 %s"
@ -721,7 +721,7 @@ msgstr "窗口"
msgid "Show Applications"
msgstr "显示应用程序"
#: ../js/ui/dash.js:451
#: ../js/ui/dash.js:449
msgid "Dash"
msgstr "Dash"
@ -878,10 +878,19 @@ msgstr "安装"
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "从 extensions.gnome.org 下载并安装“%s”"
#: ../js/ui/keyboard.js:706 ../js/ui/status/keyboard.js:576
#: ../js/ui/keyboard.js:718 ../js/ui/status/keyboard.js:713
msgid "Keyboard"
msgstr "键盘"
#. translators: 'Hide' is a verb */
#: ../js/ui/legacyTray.js:66
msgid "Hide tray"
msgstr "隐藏托盘"
#: ../js/ui/legacyTray.js:107
msgid "Status Icons"
msgstr "状态图标"
#: ../js/ui/lookingGlass.js:643
msgid "No extensions installed"
msgstr "未安装扩展"
@ -934,7 +943,7 @@ msgstr "查看源"
msgid "Web Page"
msgstr "网页"
#: ../js/ui/messageTray.js:2131
#: ../js/ui/messageTray.js:1504
msgid "System Information"
msgstr "系统信息"
@ -954,21 +963,21 @@ msgstr "概览"
msgid "Type to search…"
msgstr "输入以搜索..."
#: ../js/ui/panel.js:351
#: ../js/ui/panel.js:352
msgid "Quit"
msgstr "退出"
#. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". */
#: ../js/ui/panel.js:403
#: ../js/ui/panel.js:404
msgid "Activities"
msgstr "活动"
#: ../js/ui/panel.js:754
#: ../js/ui/panel.js:755
msgid "Top Bar"
msgstr "顶栏"
#: ../js/ui/popupMenu.js:288
#: ../js/ui/popupMenu.js:289
msgid "toggle-switch-us"
msgstr "toggle-switch-us"
@ -1002,7 +1011,7 @@ msgid "%d new notification"
msgid_plural "%d new notifications"
msgstr[0] "%d 条新通知"
#: ../js/ui/screenShield.js:432 ../js/ui/status/system.js:345
#: ../js/ui/screenShield.js:432 ../js/ui/status/system.js:342
msgid "Lock"
msgstr "锁定"
@ -1018,11 +1027,11 @@ msgstr "无法锁定"
msgid "Lock was blocked by an application"
msgstr "一个应用程序阻止了锁定"
#: ../js/ui/search.js:609
#: ../js/ui/search.js:617
msgid "Searching…"
msgstr "正在搜索..."
#: ../js/ui/search.js:611
#: ../js/ui/search.js:619
msgid "No results."
msgstr "无结果。"
@ -1086,11 +1095,11 @@ msgstr "筛选键"
msgid "Mouse Keys"
msgstr "鼠标按键"
#: ../js/ui/status/accessibility.js:144
#: ../js/ui/status/accessibility.js:167
msgid "High Contrast"
msgstr "高对比度"
#: ../js/ui/status/accessibility.js:193
#: ../js/ui/status/accessibility.js:202
msgid "Large Text"
msgstr "大号文本"
@ -1123,7 +1132,7 @@ msgstr "无连接"
msgid "Brightness"
msgstr "亮度"
#: ../js/ui/status/keyboard.js:599
#: ../js/ui/status/keyboard.js:736
msgid "Show Keyboard Layout"
msgstr "显示键盘布局"
@ -1292,10 +1301,6 @@ msgstr "VPN 设置"
msgid "VPN"
msgstr "VPN"
#: ../js/ui/status/network.js:1657
msgid "Network Manager"
msgstr "网络管理器"
#: ../js/ui/status/network.js:1697
msgid "Activation of network connection failed"
msgstr "启用网络连接失败"
@ -1338,23 +1343,23 @@ msgstr "乘机模式"
msgid "On"
msgstr "开"
#: ../js/ui/status/system.js:317
#: ../js/ui/status/system.js:314
msgid "Switch User"
msgstr "切换用户"
#: ../js/ui/status/system.js:322
#: ../js/ui/status/system.js:319
msgid "Log Out"
msgstr "注销"
#: ../js/ui/status/system.js:341
#: ../js/ui/status/system.js:338
msgid "Orientation Lock"
msgstr "方向锁定"
#: ../js/ui/status/system.js:349
#: ../js/ui/status/system.js:346
msgid "Suspend"
msgstr "挂起"
#: ../js/ui/status/system.js:352
#: ../js/ui/status/system.js:349
msgid "Power Off"
msgstr "关机"
@ -1414,7 +1419,7 @@ msgstr[0] "设置更改将在 %d 后还原"
#. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height. */
#: ../js/ui/windowManager.js:599
#: ../js/ui/windowManager.js:613
#, javascript-format
msgid "%d x %d"
msgstr "%d x %d"
@ -1499,12 +1504,12 @@ msgstr "使用指定模式,如 “gdm”用于登录屏幕的模式"
msgid "List possible modes"
msgstr "列出可用的模式"
#: ../src/shell-app.c:247
#: ../src/shell-app.c:239
msgctxt "program"
msgid "Unknown"
msgstr "未知"
#: ../src/shell-app.c:488
#: ../src/shell-app.c:480
#, c-format
msgid "Failed to launch “%s”"
msgstr "启动“%s”失败"
@ -1520,3 +1525,11 @@ msgstr "密码不能为空"
#: ../src/shell-polkit-authentication-agent.c:346
msgid "Authentication dialog was dismissed by the user"
msgstr "认证对话框被用户驳回"
#~ msgctxt "event list time"
#~ msgid "%H%M"
#~ msgstr "%H%M"
#~ msgctxt "event list time"
#~ msgid "%l%M%p"
#~ msgstr "%p %-l:%M"

View File

@ -181,7 +181,6 @@ shell_prefs_init (void)
g_object_get (G_OBJECT (settings), "schema-id", &schema_id, NULL);
keys = g_settings_list_keys (settings);
for (keys = k = g_settings_list_keys (settings); *k; k++)
meta_prefs_override_preference_schema (*k, schema_id);

View File

@ -83,12 +83,18 @@ scan_startup_wm_class_to_id (ShellAppSystem *self)
for (l = apps; l != NULL; l = l->next)
{
GAppInfo *info = l->data;
const char *startup_wm_class, *id;
const char *startup_wm_class, *id, *old_id;
id = g_app_info_get_id (info);
startup_wm_class = g_desktop_app_info_get_startup_wm_class (G_DESKTOP_APP_INFO (info));
if (startup_wm_class != NULL)
if (startup_wm_class == NULL)
continue;
/* In case multiple .desktop files set the same StartupWMClass, prefer
* the one where ID and StartupWMClass match */
old_id = g_hash_table_lookup (priv->startup_wm_class_to_id, startup_wm_class);
if (old_id == NULL || strcmp (id, startup_wm_class) == 0)
g_hash_table_insert (priv->startup_wm_class_to_id,
g_strdup (startup_wm_class), g_strdup (id));
}

View File

@ -1464,7 +1464,7 @@ shell_global_sync_pointer (ShellGlobal *global)
event.type = CLUTTER_MOTION;
event.time = shell_global_get_current_time (global);
event.flags = 0;
event.flags = CLUTTER_EVENT_FLAG_SYNTHETIC;
event.stage = global->stage;
event.x = x;
event.y = y;