Compare commits

...

113 Commits

Author SHA1 Message Date
Cédric Valmary
c64f195e96 Added Occitan translation 2015-05-16 07:17:17 +00:00
Daniel Mustieles
247546d531 Updated Spanish translation 2014-10-06 13:01:13 +02:00
Sam Friedmann
44252b052d Updated French translation 2014-04-07 10:53:41 +00:00
Simon McVittie
226032d2e1 Specifically ask for Telepathy 0.x
Telepathy 1.0 will not be compatible, and will probably require
source changes. telepathy-glib 0.12 and telepathy-logger 0.2 are
the 0.x ABIs (they were the first stable-branches to have g-i).

Bug: https://bugzilla.gnome.org/show_bug.cgi?id=721704
Reviewed-by: Giovanni Campagna
2014-03-25 17:19:57 +00:00
Wylmer Wang
53f28074ad Updated Chinese (China) translation 2014-03-10 12:06:14 +00:00
Gil Forcada
2993e02c33 [l10n] Update Catalan translation 2014-02-21 23:26:26 +01:00
Ankit Patel
628bfc8311 Updated Gujarati translations 2014-02-03 17:51:19 +05:30
Shankar Prasad
27bfaf9b35 updated kn.po 2014-02-03 16:59:07 +05:30
A S Alam
e4e87d03c5 update translation for 3.8 branch 2014-02-01 17:03:08 -06:00
Wylmer Wang
956d89fbec Update Chinese simplified translation 2014-01-14 18:41:18 +08:00
Мирослав Николић
1ad62527ea Updated Serbian translation 2014-01-13 09:49:54 +01:00
Мирослав Николић
1d79d74e97 Updated Serbian translation 2014-01-13 09:24:04 +01:00
Christian Kirbach
b90183665f Updated German translation 2014-01-02 14:48:37 +01:00
Andika Triwidada
73fde364c8 Updated Indonesian translation 2013-12-30 13:38:18 +07:00
Marek Černocký
21b05e8150 Updated Czech translation 2013-12-30 00:03:09 +01:00
Marek Černocký
e8391a726d Updated Czech translation 2013-12-29 23:54:11 +01:00
Aurimas Černius
fb85a476a1 Updated Lithuanian translation 2013-12-21 16:32:53 +02:00
Andika Triwidada
047acb887e Updated Indonesian translation 2013-12-20 23:10:15 +07:00
Muhammet Kara
eaadeb8ef4 [l10n]Updated Turkish translation 2013-12-07 08:37:01 +02:00
Shantha kumar
03946a9621 Updated Tamil Translations 2013-11-11 14:56:49 +05:30
Florian Müllner
820f689f77 popupMenu: Fix removing the active menu from PopupMenuManager
Commit b42af9aa99 changed the parameter list of _closeMenu()
to account for changes in the GrabHelper ungrab mechanism, but
didn't update other callers.

https://bugzilla.gnome.org/show_bug.cgi?id=709806
2013-11-07 00:13:43 +01:00
Lasse Liehu
724f99cc62 Finnish translation update 2013-11-05 08:02:42 +02:00
Yuri Myasoedov
83125c4849 Updated Russian translation 2013-11-01 23:29:03 +04:00
Antonio Fernandes C. Neto
d8a1ce0871 Updated Brazilian Portuguese translation, proofread by Enrico Nicoletto 2013-10-30 23:35:03 -02:00
Мирослав Николић
e156e1a438 Updated Serbian translation 2013-10-25 22:31:28 +02:00
Stas Solovey
83f3084415 Updated Russian translation 2013-10-18 18:31:50 +04:00
Мирослав Николић
81e93d083e Updated Serbian translation 2013-10-15 19:56:50 +02:00
Мирослав Николић
542353b8d8 Updated Serbian translation 2013-10-15 19:50:28 +02:00
Balázs Úr
8868d3aa6d Updated Hungarian translation 2013-10-13 13:43:29 +02:00
Andika Triwidada
c419649fe7 Updated Indonesian translation 2013-10-08 17:10:12 +07:00
Aurimas Černius
130c726fff Updated Lithuanian translation 2013-10-05 16:49:08 +03:00
Adel Gadllah
ac478727cc layout: Use monitor index when adding bg managers
Don't assume that this._bgManagers.push() (i.e adding to the end) is always
correct.

On startup we call _createPrimaryBackground which passes in the primary index
which may not be 0.
2013-10-02 15:59:32 +02:00
Adel Gadllah
331c73002f background: Disconnect settings signal handler on destroy
We connect to the changed signal in _init() but never actually disconnect from
it. The callback has a reference to "this" which results into the background
object not getting garbage collected.

Fix that leaks by disconnecting in _destroy()

https://bugzilla.gnome.org/show_bug.cgi?id=709263
2013-10-02 15:44:57 +02:00
Marek Černocký
95a587e81b Updated Czech translation 2013-10-02 09:56:07 +02:00
Nilamdyuti Goswami
38a45b4f0f Assamese translation updated 2013-10-01 11:27:23 +05:30
Dimitris Spingos
c730cd3296 Updated Greek translation 2013-09-30 17:45:35 +03:00
Daniel Mustieles
c10a18ab71 Updated Spanish translation 2013-09-30 12:13:12 +02:00
Matej Urbančič
ca2f7597b4 Updated Slovenian translation 2013-09-28 21:31:19 +02:00
Fran Diéguez
3c70435969 Updated Galician translations 2013-09-28 16:26:41 +02:00
Adel Gadllah
0a1b9867fc Revert "background: fix asynchronous management of background loading operations"
This reverts commit 1020d8a0f8.

https://bugzilla.gnome.org/show_bug.cgi?id=704646
2013-08-16 14:52:22 +02:00
Giovanni Campagna
d8177a8f3b ScreenShield: don't allow events through the lock dialog
Make the lock dialog group reactive, to intercept any events
before they go to the actors below.
In the future, we may restructure our chrome to have a clear
layer system, but for now it fixes a security issue in the lock
screen (you can see the contents of the windows by dragging
if the screen was locked with the overview active)

https://bugzilla.gnome.org/show_bug.cgi?id=705840
2013-08-13 17:11:44 +02:00
Adel Gadllah
52417a8363 st-scroll-view: Unconditionally allocate scrollbars
Commit cfecd063c9 changed the allocation logic to not allocate
scrollbars when the *_visible booleans are false. This breaks the
fade effect as well as the NEVER policy. We do not paint scrollbars
when they are not supposed to be visible, so not allocating them
and thus leaving them in a "needs allocation" state just causes problems.

I am not convinced that it solved any problem to begin with (we don't paint
them anyway).

As the previous condition has basically always been true, just do it
unconditionally.

https://bugzilla.gnome.org/show_bug.cgi?id=705664
2013-08-11 18:19:56 +02:00
Inaki Larranaga Murgoitio
8191e10665 Updated Basque language 2013-08-05 10:24:19 +02:00
Adel Gadllah
a6f39a12d7 overview: Reset opacity when not animating
We are not resetting the opacity when we are not animating, which can cause
a hidden window to end up with opacity 0 if we remove the tween to early.
2013-08-04 11:38:40 +02:00
Ray Strode
79a42e097d Bump version to 3.8.4
Update NEWS.
2013-07-30 21:03:28 -04:00
Jasper St. Pierre
4a5e276551 messageTray: Ensure notifications are focused after they are expanded
If we focus notifications before they're expanded, the body and action
area won't be visible, and the can_focus members like the text entry
will not be able to be focused.

Ensure that all of the all actors that would be in an expanded notification
are visible before we attempt to focus them.

https://bugzilla.gnome.org/show_bug.cgi?id=698778
2013-07-30 18:38:21 -04:00
Giovanni Campagna
35abf39971 Background: don't require a URI scheme for picture-uri
Migration from old settings can result in a path instead of URI
there. This is technically invalid, but can easily recognize it
and avoid the crash.

Minor changes by Ray Strode

https://bugzilla.gnome.org/show_bug.cgi?id=702121
2013-07-30 18:31:25 -04:00
Jasper St. Pierre
c1d107a682 shell-app: Fade the app icon on the left in RTL layouts
The point of fading the icon is to make the text displayed over the
icon more legible. In RTL layouts, the text is displayed on the left
of the icon, so fading the right-hand-side of the icon doesn't work
well.

https://bugzilla.gnome.org/show_bug.cgi?id=704583
2013-07-30 18:20:54 -04:00
Giovanni Campagna
31f67d9142 MessageTray: don't list the sources all the time
The point of a hash table is that you don't need to list all the
elements. To avoid that, keep a "clearableCount" in MessageTray,
which can be used by the message tray menu to show and hide the
clear item, and that is updated in constant time when sources
are added or removed.

https://bugzilla.gnome.org/show_bug.cgi?id=700194
2013-07-30 18:13:17 -04:00
Giovanni Campagna
3a0197c8db Hash: make .size() constant time
MessageTray calls .size() very often to update the no messages label,
so a linear time implementation is not good enough.

https://bugzilla.gnome.org/show_bug.cgi?id=700194
2013-07-30 18:12:25 -04:00
Jasper St. Pierre
c4f744d7ec overview: Don't allow exiting the overview if we have a DND drag
Otherwise, people can drag app icons or window thumbnails out of
the overview, and it just looks weird.

https://bugzilla.gnome.org/show_bug.cgi?id=698484
2013-07-30 18:11:14 -04:00
Alban Browaeys
61b1679719 st-icon: check if gicon is null before unref.
Commit a6b49fe7d6
introduced a check for equality of priv->gicon vs gicon
and unref then return early if so. But if both are null,
we should not unref gicon. Only return.

https://bugzilla.gnome.org/show_bug.cgi?id=698863
2013-07-30 18:00:15 -04:00
Emilio Pozuelo Monfort
cdbb1bb665 st-scroll-view: properly check if the scrollbars are visible
We don't set :visible on the scrollbars, but use booleans to track
if they are visible. Thus check the booleans instead of the actor's
properties when allocating the scrollbars.

https://bugzilla.gnome.org/show_bug.cgi?id=704265
2013-07-17 17:31:04 +02:00
Lionel Landwerlin
1020d8a0f8 background: fix asynchronous management of background loading operations
This fixes a blue background being drawn when switching the monitors
configuration using hardware keys
(clone/multimonitor/external/internal).

The problem is that the shell gather all background loading requests
under the same meta_background_load_file_async call using one
GCancellable (the first one to come). So when the shell receives a
batch of 12 or so XRandr events, it creates 12 new background managers
which end up trying to load 12 times the same background picture. All
of these requests are batched into the same
meta_background_load_file_async using the first GCancellable received
on the first request. Unfortunately, when the first request is
cancelled by the following event indicating a new monitor setup, all
of the background picture requests are dropped on the floor, and
nothing gets loaded (hence the blue screen background).

https://bugzilla.gnome.org/show_bug.cgi?id=703001
2013-07-03 17:05:30 +01:00
Matthias Clasen
1f6811ca06 Make autorun notifications work
The code that checks for various conditions is confusing and
undercommented. It appears one of the recent refactorings
inadvertedly inverted the sense of the 'hidden mountpoint'
check, and caused autorun to not work for anything that does
not have a 'native root' - which is pretty much all volumes
implemented by gvfs.

https://bugzilla.gnome.org/show_bug.cgi?id=703418
2013-07-01 21:48:19 -04:00
Emilio Pozuelo Monfort
c256154190 boxpointer: fix left/right arrow side calculation
Commit d6cace32 introduced a typo in the left/right arrow side
calculation code that causes in most scenarios (where the monitor
width is greater then the height) to not flip the box when it doesn't
fit inside the monitor.

https://bugzilla.gnome.org/show_bug.cgi?id=703403
2013-07-01 18:54:05 +02:00
Lionel Landwerlin
60225ef86d screenShield: fix empty screen shield
If the drag action ends after something else has put the screen shield
into a different state we can end up in an inconsistent screen shield
state where the whole thing is empty.

https://bugzilla.gnome.org/show_bug.cgi?id=703126
2013-06-27 11:19:15 +01:00
Carlos Soriano
48498d83d3 telepathyClient: Align timestamps to the right again
Commit 3de0ebf changed timestamps to be center-aligned. New
design updates change this, so revert it.

http://bugzilla.gnome.org/show_bug.cgi?id=687809
2013-06-26 15:55:24 +02:00
Carlos Soriano
14757dbd6c telepathyClient: Increase the timestamp timeout to 3 minutes
The timestamp timeout specifies how long we should wait before
adding a timestamp to the notification. A timeout of one minute
ended up showing a lot of timestamps, so increase it to 3 minutes.

https://bugzilla.gnome.org/show_bug.cgi?id=687809
2013-06-26 15:55:02 +02:00
Florian Müllner
df89d4dc59 layout: Keep the top_window group above newly added chrome
The top_window_group was introduced for popup windows that should
appear above system chrome, but as the group itself is just a child
of Main.uiGroup, chrome that is added after top_window_group will
still be stacked on top.
At least correct the stacking for actors added via addChrome().

https://bugzilla.gnome.org/show_bug.cgi?id=702338
2013-06-26 13:39:18 +02:00
Florian Müllner
ace549c1bf st: Be more forgiving when calling get_theme_node() on unstaged widgets
While it is obviously still an error to call get_theme_node() on a
widget that hasn't been added to the stage hierarchy yet, asserting
on it hasn't proven too successful in avoiding those errors - it's
likely the most frequent reason for crash reports. Just accept that
there'll always be code paths where we can hit this case and make
it non-fatal.

https://bugzilla.gnome.org/show_bug.cgi?id=610279
2013-06-24 23:07:50 +02:00
Mathieu Bridon
1198ffd297 gdm: Align the "Not Listed?" label
https://bugzilla.gnome.org/show_bug.cgi?id=702307
2013-06-24 13:28:29 +02:00
Adel Gadllah
1aac5c43e4 Fix syntax error 2013-06-18 23:01:26 +02:00
Adel Gadllah
4d785d249f osdWindow: Don't call enable_unredirection on startup
This is wrong because it is already enabled. So move this
to out of reset, which gets called from _init().
2013-06-18 22:46:33 +02:00
Jonh Wendell
efbf102b63 gdm: clear the messages queue when the user answers a prompt
the messages were being shown even when the user entered the
right information they were asked for.

https://bugzilla.gnome.org/show_bug.cgi?id=702458
2013-06-18 11:56:33 -03:00
Matthias Clasen
4d1668b01c logout dialog: Show the correct text right away
The end session dialog was waiting a second before updating
its text to display the timer. It is nicer to show the correct
message from the start.

https://bugzilla.gnome.org/show_bug.cgi?id=702056
2013-06-12 05:49:00 -04:00
Florian Müllner
cad6f31c1a Bump version to 3.8.3
Update NEWS.
2013-06-07 21:46:20 +02:00
Florian Müllner
294f59103f window-switcher: Only show windows from current workspace by default
When adding the window switcher, we copied our default values from
the alternate-tab extension. Arguably it makes more sense to mimick
the old mutter/metacity behavior though, so change the default
accordingly.

https://bugzilla.gnome.org/show_bug.cgi?id=701214
2013-06-07 21:34:01 +02:00
Adel Gadllah
f88f51dd99 osdWindow: Disable unredirection while showing the OSD
This allows OSDs to be visible even when displayed on top
of unredirected windows.

https://bugzilla.gnome.org/show_bug.cgi?id=701224
2013-06-07 21:22:03 +02:00
Xavier Claessens
c1eaf97bc6 RemoteMenu: Avoid useless signal connections
If we are missing more than one action, every time action-added is
called, it calls modelChanged() again and re-connect signal for
all action still missing. This patch prevent from connecting signals
again when doing a refresh because a missing action is now available.
All necessary signals have already been connected.

https://bugzilla.gnome.org/show_bug.cgi?id=694612
2013-06-07 20:08:37 +02:00
Xavier Claessens
1420f62dfa RemoteMenu: use detailed action-added signal
This avoid disconnecting all signals if we are waiting for
different actions to be added, leading to incomplete menu.
Previously if we were waiting for 2 different actions in 2
different sections, the first action-added signal would
disconnect the 2nd signal handler as well, so the model of
that section would not be updated when the 2nd action is added.

https://bugzilla.gnome.org/show_bug.cgi?id=694612
2013-06-07 20:08:37 +02:00
Florian Müllner
3ff194247a main: Use the correct schema for 'dynamic-workspaces'
We currently monitor the shell's override schema for changes to
the 'dynamic-workspaces' key, which ends up being the wrong
schema in classic mode. With the new ability to use mode-specific
overides, we can finally fix this.

https://bugzilla.gnome.org/show_bug.cgi?id=701717
2013-06-07 19:59:41 +02:00
Florian Müllner
36b1cd13c9 main: Pick up overridesSchema from sessionMode
This will allow the use of mode-specific defaults. For classic mode
we currently implement this with mini-extensions, but this may result
in confusing behavior when settings change due to extensions being
disabled during screen locks (not to mention that those mini-extensions
are hardly an elegant approach).

https://bugzilla.gnome.org/show_bug.cgi?id=701717
2013-06-07 19:59:39 +02:00
Florian Müllner
bcede26d77 main: Move pref overrides to JS
We will allow to use mode-specific overrides; in preparation for that,
move the code so that we only override preferences after initializing
the session mode.

https://bugzilla.gnome.org/show_bug.cgi?id=701717
2013-06-07 19:58:52 +02:00
eternalhui
fbf1ee8a01 update Simplified Chinese (zh_CN) translation 2013-06-06 11:44:18 +08:00
Florian Müllner
1360747c9e dnd: Use pushModal() to grab the keyboard
Currently we "only" grab the keyboard when starting a drag operation,
which does not impede keybindings to be processed. This is at best
not harmful (like workspace switching), but may have unintended effects
otherwise - for instance, the hot corner is disabled, so having the
corresponding keyboard shortcut still active is fairly odd (not to
mention that it leaves the system in a confused state).
Fix this by switching to pushModal()/popModal(), which will push a
dedicated keybinding mode for us.

https://bugzilla.gnome.org/show_bug.cgi?id=700877
2013-06-05 16:36:23 +02:00
Florian Müllner
1d95841da0 screenShield: Clear clipboard on lock
Currently the clipboard's contents may leak to unauthorized parties by
pasting into the unlock dialog's password entry and unmasking the entry.
Prevent this from happening by clearing the clipboard on lock.

https://bugzilla.gnome.org/show_bug.cgi?id=698922
2013-06-05 16:23:52 +02:00
Rui Matos
494fcfecf8 osdWindow: Make sure the OSD is always our topmost chrome element
In particular this fixes the OSD showing up behind a modal dialog's
lightbox.

https://bugzilla.gnome.org/show_bug.cgi?id=701269
2013-06-05 15:36:12 +02:00
Florian Müllner
75705b45ef dash: Grow the empty dash during drag operations
When the dash does not contain any applications (either favorites
or running), it is currently impossable to add a favorite via DND.
Grow the dash slightly in that case to provide a drop target.

https://bugzilla.gnome.org/show_bug.cgi?id=684618
2013-06-05 14:54:45 +02:00
Florian Müllner
1ad1e48741 dash: Minor cleanup
https://bugzilla.gnome.org/show_bug.cgi?id=684618
2013-06-05 14:54:45 +02:00
Florian Müllner
ddb682e4fe dash: Use a single code path for clearing the drag placeholder
We currently only keep track of old placeholders when moving past
the dragged app's current favorite position, as this is the only
case where we need to worry about jitter. Still, moving it into
_clearDragPlaceholder() allows us to consolidate code paths, which
is a good thing ...

https://bugzilla.gnome.org/show_bug.cgi?id=684618
2013-06-05 14:54:45 +02:00
Florian Müllner
5216b77600 dash: Make sure _clearDragPlaceholder() resets _dragPlaceholderPos
The function currently only resets the placeholder position if
there is a placeholder; this is not necessarily true, as the
placeholder may be reset outside _clearDragPlaceholder().
If this happens, the placeholder will temporarily stop working
for the "old" position (and permanently if it's the only position).
Just reset the position unconditionally.

https://bugzilla.gnome.org/show_bug.cgi?id=684618
2013-06-05 14:28:25 +02:00
Cheng-Chia Tseng
c93d91d80b Updated Traditional Chinese translation(Hong Kong and Taiwan) 2013-06-04 21:50:40 +08:00
Carlos Soriano
f9e3467b70 appDisplay: Give more horizontal space to control buttons
Before, the text of those buttons were truncated when the text exceeded
the fixed width we had in the CSS.
Now, we give more horizontal space to the control buttons to match
the maximum text length of all buttons.

https://bugzilla.gnome.org/show_bug.cgi?id=696307
2013-06-04 13:53:42 +02:00
Florian Müllner
13bea1a01b Bump gvc submodule
As of commit 95a1b874d8, the submodule is supposed to be at
revision 3d6aac673b88ff, but commit 31774a7711 accidentally
reverted it back to the previously used revision.
2013-05-31 20:50:42 +02:00
Florian Müllner
76c930e471 build: Bump gcr requirement
https://bugzilla.gnome.org/show_bug.cgi?id=700972
2013-05-31 20:44:13 +02:00
Adel Gadllah
9f6cd75170 shell-gtk-embed: Lower tray icon windows to the bottom of the stack
Otherwise they break the "top level window" detection used by the
unredirect code in mutter, causes game windows not to be unredirected
when tray icons are present.

https://bugzilla.gnome.org/show_bug.cgi?id=701224
2013-05-30 00:59:11 +02:00
Adel Gadllah
c107882828 xdnd: Lower window activation timeout
The current one is perceived as too high by users, so try a shorter timeout.

https://bugzilla.gnome.org/show_bug.cgi?id=700150
2013-05-29 22:06:32 +02:00
Giovanni Campagna
d18e084cd5 Keyboard: clear currentSource after destruction
StLabel doesn't like that we set its properties after destructions,
and this would happen in currentInputSourceChanged() at the end,
when setting the ornament.
2013-05-25 20:39:33 +02:00
Rui Matos
2eb779740c messageTray: Check if the clicked summary item has a right click menu
Commit e71129aa68 introduced the
possibility of having summary items without a right click menu so we
should check for one before trying to show it.

https://bugzilla.gnome.org/show_bug.cgi?id=700190
2013-05-24 23:57:47 +02:00
Rui Matos
3ce20568d0 status/keyboard: Allow switching input source in the message tray
We still can't show a popup switcher in the message tray but we can at
least degrade gracefully and advance to the next input source.

https://bugzilla.gnome.org/show_bug.cgi?id=697009
2013-05-24 23:57:47 +02:00
Rui Matos
d45ab6f15e status/keyboard: Switch input source on special modifiers accelerator
This simply mimics the X server's layout switching behavior by
advancing to the next input source and wrapping around.

https://bugzilla.gnome.org/show_bug.cgi?id=697008
2013-05-24 23:57:47 +02:00
Rui Matos
cd7197e605 status/keyboard: Synchronize input source switching with key events
Currently we simply set the gsettings key when activating an input
source. This obviously introduces a time window, between the event that
activates the switch and when the switch is complete, under which key
events are being delivered to applications and interpreted according
to the previous input source.

The patches in bug 696996 introduce a DBus API in g-s-d that allows us
to know when an input source if effectively active. Using that and
freezing keyboard events in the X server until we hear back from g-s-d
we can ensure that events won't be misinterpreted after an input
source switch.

https://bugzilla.gnome.org/show_bug.cgi?id=697007
2013-05-24 23:57:47 +02:00
Stef Walter
3f6c1aadef Depend on gcr-base instead of gcr pkg-config file
gnome-shell does not use the UI bits of the Gcr library

https://bugzilla.gnome.org/show_bug.cgi?id=700944
2013-05-24 11:18:17 +02:00
Florian Müllner
29e8290b65 docs: Include ShellKeyBindingMode in docs
https://bugzilla.gnome.org/show_bug.cgi?id=700900
2013-05-23 17:10:37 +02:00
Florian Müllner
3074e48405 popupMenu: Allow for an optional border for slider handle
While the default style works well will a solid handle, using both
border and fill color would be desirable in classic mode. Add the
necessary (optional) style properties to allow this.

https://bugzilla.gnome.org/show_bug.cgi?id=697917
2013-05-22 18:47:37 +02:00
Florian Müllner
12c2939b64 screenshot: Hide cursor while magnifier is active
As with the screen recorder, the magnifier already adds its own
copy of the system cursor, so we should not add it again. Just
as in the screen recorder case, we don't address the case where
the cursor should not be included in the screenshot, but the
magnifier adds it anyway.

https://bugzilla.gnome.org/show_bug.cgi?id=700488
2013-05-22 18:34:45 +02:00
Florian Müllner
c7eed59562 recorder: Hide cursor while magnifier is active
The magnifier adds its own copy of the system cursor to apply the
expected transformations, so we don't need to add it again in the
recorder; this avoids two different cursors showing up in recordings,
but doesn't address the case where the cursor should not be recorded
at all, but the magnifier adds it anyway.

https://bugzilla.gnome.org/show_bug.cgi?id=700488
2013-05-22 18:34:45 +02:00
Florian Müllner
73903400c5 screencast: Fix return value in case of invalid file template
If we are passed an invalid file template, ShellRecorder.record()
will return a %NULL filename; as the Screencast DBus interface
expects a string return value, we cannot return the value unmodified
in that case.

https://bugzilla.gnome.org/show_bug.cgi?id=700842
2013-05-22 17:24:04 +02:00
Rui Matos
dc7cc9b517 userWidget: Fix leaking instances
UserWidget instances should be destroyed when the actor is. That's
what consumer code expects since the destroy() method is never called.

https://bugzilla.gnome.org/show_bug.cgi?id=700807
2013-05-21 21:55:21 +02:00
Florian Müllner
b18c239240 appDisplay: Also account for folder popup's close buttons
As the close button of folder popups overlaps at the top, it ends
up being cut off if the folder is located at the very top of the
view. Fix this glitch by taking the button's overlap into account
in that case.

https://bugzilla.gnome.org/show_bug.cgi?id=694371
2013-05-20 18:21:16 +02:00
Florian Müllner
3c66f1a4d9 appDisplay: Fix cut-off folders in All view
We already take care of growing the view if open folders overlap
at the bottom, however folder popups may still end up being cut
off when opening above the source icon - if the popup is high enough,
its y coordinate will be negative and therefore outside the parent's
allocation. To fix, we can either make sure that folders pop up below
their source icon in that case, or adjust the parent grid's position
as necessary while a folder is open. This implements the latter.

https://bugzilla.gnome.org/show_bug.cgi?id=694371
2013-05-20 18:21:16 +02:00
Florian Müllner
1dff5fb5b2 appDisplay: Expand AllView
If the view doesn't fill the available space, content should still
start at the top rather than the center - not least the positioning
code for folder popups assumes that, so set the appropriate expand
flags.

https://bugzilla.gnome.org/show_bug.cgi?id=694371
2013-05-20 18:21:16 +02:00
Allan Day
e2561d15b5 theme: polish the session chooser
The session chooser list has an embedded look which doesn't fit
well with the rest of the theme. Give it more of a flat appearance
and simplify the visuals.
https://bugzilla.gnome.org/show_bug.cgi?id=695742
2013-05-19 15:25:58 -04:00
Florian Müllner
326c3732b8 screenshot: Check for NULL window in screenshot_window()
screenshot_window() currently assumes a focus window, which will
result in a crash if that's not the case.

https://bugzilla.gnome.org/show_bug.cgi?id=700625
2013-05-19 15:32:56 +02:00
Florian Müllner
5dd020f2e2 recorder: Use workarea to position the recording icon
It looks a bit unpolished to overlap our own chrome with the recording
icon, which may happen when an existing adds UI at the bottom edge.
Fix this by using the primary monitor's workarea for the position rather
than the entire monitor.

https://bugzilla.gnome.org/show_bug.cgi?id=700409
2013-05-18 14:30:16 +02:00
Florian Müllner
b6edbd46b9 overview: Add focusSearch() method and export it over DBus
Some keyboard spot a dedicated search key, which gnome-settings-daemon
currently handles by spawning gnome-search-tool. It makes a lot of
sense to promote the Shell's integrated search feature instead, so
expose an appropriate DBus method g-s-d can use.

https://bugzilla.gnome.org/show_bug.cgi?id=700536
2013-05-17 18:28:47 +02:00
Matthias Clasen
c330036fef Document --clutter-display in the man page
This is the sole option that was missing from the
man page.

https://bugzilla.gnome.org/show_bug.cgi?id=700339
2013-05-16 18:45:25 -04:00
Florian Müllner
d0a864b9b9 windowManager: Enable switch-to-workspace-n keybindings in overview
Those keybindings are unassigned by default, but that's not a valid
reason they shouldn't work like the related switch-up/down bindings.

https://bugzilla.gnome.org/show_bug.cgi?id=649977
2013-05-16 00:41:17 +02:00
Florian Müllner
9bed5b725e network: Fix stupid typo
There is no ACTIVE state in NetworkManager.ActionConnectionState,
it's ACTIVATED.

https://bugzilla.gnome.org/show_bug.cgi?id=700394
2013-05-15 17:48:21 +02:00
Florian Müllner
f374ecfc75 altTab: Always activate MRU window when activating an app
Commit 2499f2ed80 went back to using shell_app_activate() for
selecting an app, which favors windows on the current workspace;
this is the behavior we want for instance when activating a
launcher, but it's wrong for the alt-tab list - explicitly
request the first (e.g. MRU) window in that case.

https://bugzilla.gnome.org/show_bug.cgi?id=700356
2013-05-15 12:13:41 +02:00
Florian Müllner
dd8ca02425 PopupMenuManager: Fix child menus
Since commit c84dc6254d, popup menus are closed automatically
when another menu opens (to catch the case where a menu is opened
by keyboard shortcut, which wasn't handled before). However in the
case of child menus, both child and parent are expected to be visible,
so handle this case explicitly.

https://bugzilla.gnome.org/show_bug.cgi?id=699678
2013-05-14 19:09:09 +02:00
Florian Müllner
ff3f9bdd7d volume: Adjust to icon name changes
The headphone icon gained an audio- prefix, use that instead of
the old name.
2013-05-14 14:28:34 +02:00
75 changed files with 9072 additions and 8333 deletions

62
NEWS
View File

@@ -1,3 +1,65 @@
3.8.4
=====
* Fix initial text in logout dialog [Matthias; #702056]
* Clear login messages when the user answers [John; #702458]
* Align the "Not Listed?" label properly in the login screen [Mathieu; #702307]
* Workaround crash causing bugs in code [Florian; #610279]
* Improve time stamp in chat messages (frequency and formatting)
[Carlos; #687809, #687809]
* Fix unlock screen after prematurely stopping curtain drag [Lionel; #703126]
* Fix autorun notification [Matthis; 703418
* Fix background occasionally turning solid blue on monitor changes [Lionel: #703001]
* Increase message tray performance [Giovanni; #700194]
* Fix focus of notifications after they're expanded [Jasper; #698778]
* Fix orientation of gradient on app menu in RTL locales [Jasper; #704583]
* Support filenames in addition to file uris for background
[Giovanni, Ray; #702121]
* misc bug fixes [Adel, Florian, Emilio, Alban, Jasper; #702338, #704265,
#698863, #698484]
Contributors:
Mathieu Bridon, Alban Browaeys, Giovanni Campagna, Matthias Clasen, Adel Gadllah,
Emilio Pozuelo Monfort, Linonel Landwerlin, Carlos Soriano, Ray Strode,
John Wendell
3.8.3
=====
* Fix child menu regression introduced in 3.8.2 [Florian; #699678]
* Fix alt-tab not always switching back to the previous window [Florian; #700356]
* Fix VPN network icon regression introduced in 3.8.2 [Florian; #700394]
* Allow switch-to-workspace-n keybindings in overview [Florian; #649977]
* Update man page [Matthias; #700339]
* Add FocusSearch DBus method [Florian; #700536]
* gdm: Update the session chooser style [Allan; #695742]
* Fix some app folders getting truncated at the top [Florian; #694371]
* Fix duplicate cursors in screenshots with magnification [Florian; #700488]
* popupMenu: Allow for an optional border for slider handle [Florian; #697917]
* Synchronize input source switching with key events [Rui; #697007]
* Switch input source on modifiers-only accelerator [Rui; #697008]
* Allow input source switching in message tray [Rui; #697009]
* Tweak timeout for activating windows during XDND [Adel; #700150]
* Fix fullscreen windows not being unredirected when legacy tray icons
are around [Adel; #701224]
* Fix ellipsization in control buttons in app picker [Carlos; #696307]
* Fix DND to empty dash [Florian; #684618]
* Fix OSD window appearing below system modal dialogs [Rui; #701269]
* Clear clipboard on screen lock to prevent information leak [Florian; #698922]
* Allow session mode specific overrides schema [Florian; #701717]
* Fix incomplete app menu if multiple actions only become available later
[Xavier; #694612]
* Fix showing the OSD when a fullscreen app is unredirected [Adel, #701224]
* window-switcher: Only show windows from current workspace by default
[Florian; #701214
* Misc bug fixes [Florian, Rui, Giovanni, Stef; #700409, #700625, #700807,
#700842, #700900, #700944, #700190, #700972, #700877]
Contributors:
Giovanni Campagna, Xavier Claessens, Matthias Clasen, Allan Day,
Adel Gadllah, Rui Matos, Florian Müllner, Carlos Soriano, Stef Walter
Translations:
Cheng-Chia Tseng [zh_HK, zh_TW], eternalhui [zh_CN]
3.8.2
=====
* Fix hotcorner regression in RTL locales [Jasper; #698884]

View File

@@ -1,5 +1,5 @@
AC_PREREQ(2.63)
AC_INIT([gnome-shell],[3.8.2],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_INIT([gnome-shell],[3.8.4],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_SRCDIR([src/shell-global.c])
@@ -63,7 +63,7 @@ AM_CONDITIONAL(BUILD_RECORDER, $build_recorder)
CLUTTER_MIN_VERSION=1.13.4
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
GJS_MIN_VERSION=1.35.4
MUTTER_MIN_VERSION=3.8.2
MUTTER_MIN_VERSION=3.8.3
GTK_MIN_VERSION=3.7.9
GIO_MIN_VERSION=2.35.0
LIBECAL_MIN_VERSION=3.5.3
@@ -71,7 +71,7 @@ LIBEDATASERVER_MIN_VERSION=3.5.3
TELEPATHY_GLIB_MIN_VERSION=0.17.5
POLKIT_MIN_VERSION=0.100
STARTUP_NOTIFICATION_MIN_VERSION=0.11
GCR_MIN_VERSION=3.3.90
GCR_MIN_VERSION=3.7.5
GNOME_DESKTOP_REQUIRED_VERSION=3.7.90
GNOME_MENUS_REQUIRED_VERSION=3.5.3
NETWORKMANAGER_MIN_VERSION=0.9.6
@@ -96,7 +96,7 @@ PKG_CHECK_MODULES(GNOME_SHELL, gio-unix-2.0 >= $GIO_MIN_VERSION
polkit-agent-1 >= $POLKIT_MIN_VERSION xfixes
libnm-glib libnm-util >= $NETWORKMANAGER_MIN_VERSION
libnm-gtk >= $NETWORKMANAGER_MIN_VERSION
libsecret-unstable gcr-3 >= $GCR_MIN_VERSION)
libsecret-unstable gcr-base-3 >= $GCR_MIN_VERSION)
PKG_CHECK_MODULES(GNOME_SHELL_JS, gio-2.0 gjs-internals-1.0 >= $GJS_MIN_VERSION)
PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 >= 0.6.8 x11)

View File

@@ -207,7 +207,7 @@ value here is from the GsmPresenceStatus enumeration.</_summary>
</_description>
</key>
<key type="b" name="current-workspace-only">
<default>false</default>
<default>true</default>
<summary>Limit switcher to current workspace.</summary>
<description>
If true, only windows from the current workspace are shown in the switcher.

View File

@@ -800,6 +800,11 @@ StScrollBar StButton#vhandle:active {
height: 24px;
}
.empty-dash-drop-target {
width: 24px;
height: 24px;
}
/* Search Box */
#searchEntry {
@@ -887,12 +892,11 @@ StScrollBar StButton#vhandle:active {
}
.app-view-controls {
width: 250px;
padding-bottom: 32px;
}
.app-view-control {
padding: 4px 16px;
padding: 4px 32px;
}
.search-display > StBoxLayout,
@@ -2308,6 +2312,7 @@ StScrollBar StButton#vhandle:active {
font-weight: bold;
color: #666666;
padding-top: 1em;
padding-left: 2px;
}
.login-dialog-not-listed-button:focus .login-dialog-not-listed-label,
@@ -2338,52 +2343,43 @@ StScrollBar StButton#vhandle:active {
width: 15em;
}
.login-dialog-session-list {
color: #ffffff;
font-size: 10.5pt;
.login-dialog-session-list,
.login-dialog-session-list-item {
color: #babdb6;
}
.login-dialog-session-list-button:focus,
.login-dialog-session-list-button:active,
.login-dialog-session-list-button:hover,
.login-dialog-session-list-item:focus,
.login-dialog-session-list-item:hover {
color: white;
}
.login-dialog-session-list-button {
padding: 4px;
}
.login-dialog-session-list-button:focus {
background-color: #4c4c4c;
}
.login-dialog-session-list-button:active {
background-color: #4c4c4c;
}
.login-dialog-session-list-button:hover {
font-weight: bold;
}
.login-dialog-session-list-scroll-view {
background-gradient-start: rgba(80,80,80,0.3);
background-gradient-end: rgba(80,80,80,0.7);
background-gradient-direction: vertical;
box-shadow: inset 0px 2px 4px rgba(0,0,0,0.9);
border-radius: 8px;
border: 1px solid rgba(80,80,80,1.0);
padding: .5em;
padding: 6px;
}
.login-dialog-session-list-item:focus {
background-color: #666666;
.login-dialog-session-list-item {
padding-bottom: 6px;
}
.login-dialog-session-list-triangle {
padding-right: .5em;
padding-right: 6px;
}
.login-dialog-session-list-item-box {
spacing: .25em;
padding-left: 6px;
spacing: 6px;
}
.login-dialog-session-list-item-dot {
width: .75em;
height: .75em;
width: 10px;
height: 10px;
}
.login-dialog-logo-bin {

View File

@@ -46,6 +46,7 @@
<xi:include href="doc-gen-org.gnome.Shell.SearchProvider.xml"/>
<xi:include href="doc-gen-org.gnome.Shell.SearchProvider2.xml"/>
<xi:include href="xml/shell-global.xml"/>
<xi:include href="xml/shell-keybinding-modes.xml"/>
<xi:include href="xml/shell-wm.xml"/>
<xi:include href="xml/shell-xfixes-cursor.xml"/>
<xi:include href="xml/shell-util.xml"/>

View File

@@ -164,6 +164,7 @@ const ShellUserVerifier = new Lang.Class({
answerQuery: function(serviceName, answer) {
if (!this._userVerifier.hasPendingMessages) {
this._clearMessageQueue();
this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null);
} else {
let signalId = this._userVerifier.connect('no-more-messages',

View File

@@ -58,6 +58,7 @@ const Map = new Lang.Class({
_init: function(iterable) {
this._pool = { };
this._size = 0;
if (iterable) {
for (let i = 0; i < iterable.length; i++) {
@@ -99,6 +100,7 @@ const Map = new Lang.Class({
node.value = value;
} else {
this._pool[hash] = { key: key, value: value };
this._size++;
}
},
@@ -108,6 +110,7 @@ const Map = new Lang.Class({
if (node && _sameValue(node.key, key)) {
delete this._pool[hash];
this._size--;
return [node.key, node.value];
} else {
return [null, null];
@@ -136,6 +139,6 @@ const Map = new Lang.Class({
},
size: function() {
return Object.getOwnPropertyNames(this._pool).length;
return this._size;
},
});

View File

@@ -234,7 +234,7 @@ const AppSwitcherPopup = new Lang.Class({
_finish : function(timestamp) {
let appIcon = this._items[this._selectedIndex];
if (this._currentWindow < 0)
appIcon.app.activate_full(-1, timestamp);
appIcon.app.activate_window(appIcon.cachedWindows[0], timestamp);
else
Main.activateWindow(appIcon.cachedWindows[this._currentWindow], timestamp);

View File

@@ -187,6 +187,9 @@ const AllView = new Lang.Class({
_init: function() {
this.parent();
this._grid.actor.y_align = Clutter.ActorAlign.START;
this._grid.actor.y_expand = true;
let box = new St.BoxLayout({ vertical: true });
this._stack = new St.Widget({ layout_manager: new AllViewLayout() });
this._stack.add_actor(this._grid.actor);
@@ -276,8 +279,12 @@ const AllView = new Lang.Class({
this._eventBlocker.reactive = isOpen;
this._currentPopup = isOpen ? popup : null;
this._updateIconOpacities(isOpen);
if (isOpen)
if (isOpen) {
this._ensureIconVisible(popup.actor);
this._grid.actor.y = popup.parentOffset;
} else {
this._grid.actor.y = 0;
}
}));
},
@@ -327,6 +334,42 @@ const Views = {
ALL: 1
};
const ControlsBoxLayout = Lang.Class({
Name: 'ControlsBoxLayout',
Extends: Clutter.BoxLayout,
/**
* Override the BoxLayout behavior to use the maximum preferred width of all
* buttons for each child
*/
vfunc_get_preferred_width: function(container, forHeight) {
let maxMinWidth = 0;
let maxNaturalWidth = 0;
for (let child = container.get_first_child();
child;
child = child.get_next_sibling()) {
let [minWidth, natWidth] = child.get_preferred_width(forHeight);
maxMinWidth = Math.max(maxMinWidth, minWidth);
maxNaturalWidth = Math.max(maxNaturalWidth, natWidth);
}
let childrenCount = container.get_n_children();
let totalSpacing = this.spacing * (childrenCount - 1);
return [maxMinWidth * childrenCount + totalSpacing,
maxNaturalWidth * childrenCount + totalSpacing];
},
vfunc_set_container: function(container) {
if(this._styleChangedId) {
this._container.disconnect(this._styleChangedId);
this._styleChangedId = 0;
}
if(container != null)
this._styleChangedId = container.connect('style-changed', Lang.bind(this,
function() { this.spacing = this._container.get_theme_node().get_length('spacing'); }));
this._container = container;
}
});
const AppDisplay = new Lang.Class({
Name: 'AppDisplay',
@@ -367,9 +410,9 @@ const AppDisplay = new Lang.Class({
x_expand: true, y_expand: true });
this.actor.add(this._viewStack, { expand: true });
let layout = new Clutter.BoxLayout({ homogeneous: true });
this._controls = new St.Widget({ style_class: 'app-view-controls',
layout_manager: layout });
let layout = new ControlsBoxLayout({ homogeneous: true });
this._controls = new St.Widget({ style_class: 'app-view-controls' });
this._controls.set_layout_manager(layout);
this.actor.add(new St.Bin({ child: this._controls }));
@@ -572,7 +615,11 @@ const FolderIcon = new Lang.Class({
// Position the popup above or below the source icon
if (side == St.Side.BOTTOM) {
this._popup.actor.show();
this._popup.actor.y = this.actor.y - this._popup.actor.height;
let closeButtonOffset = -this._popup.closeButton.translation_y;
let y = this.actor.y - this._popup.actor.height;
let yWithButton = y - closeButtonOffset;
this._popup.parentOffset = yWithButton < 0 ? -yWithButton : 0;
this._popup.actor.y = Math.max(y, closeButtonOffset);
this._popup.actor.hide();
} else {
this._popup.actor.y = this.actor.y + this.actor.height;
@@ -595,6 +642,7 @@ const AppFolderPopup = new Lang.Class({
this._arrowSide = side;
this._isOpen = false;
this.parentOffset = 0;
this.actor = new St.Widget({ layout_manager: new Clutter.BinLayout(),
visible: false,
@@ -618,11 +666,11 @@ const AppFolderPopup = new Lang.Class({
this.actor.add_actor(this._boxPointer.actor);
this._boxPointer.bin.set_child(this._view.actor);
let closeButton = Util.makeCloseButton();
closeButton.connect('clicked', Lang.bind(this, this.popdown));
this.actor.add_actor(closeButton);
this.closeButton = Util.makeCloseButton();
this.closeButton.connect('clicked', Lang.bind(this, this.popdown));
this.actor.add_actor(this.closeButton);
this._boxPointer.actor.bind_property('opacity', closeButton, 'opacity',
this._boxPointer.actor.bind_property('opacity', this.closeButton, 'opacity',
GObject.BindingFlags.SYNC_CREATE);
global.focus_manager.add_group(this.actor);

View File

@@ -318,9 +318,9 @@ const Background = new Lang.Class({
this._cancellable = new Gio.Cancellable();
this.isLoaded = false;
this._settings.connect('changed', Lang.bind(this, function() {
this.emit('changed');
}));
this._settingsChangedSignalId = this._settings.connect('changed', Lang.bind(this, function() {
this.emit('changed');
}));
this._load();
},
@@ -361,6 +361,10 @@ const Background = new Lang.Class({
this.actor.disconnect(this._destroySignalId);
this._destroySignalId = 0;
if (this._settingsChangedSignalId != 0)
this._settings.disconnect(this._settingsChangedSignalId);
this._settingsChangedSignalId = 0;
},
_setLoaded: function() {
@@ -571,7 +575,16 @@ const Background = new Lang.Class({
}
let uri = this._settings.get_string(PICTURE_URI_KEY);
let filename = Gio.File.new_for_uri(uri).get_path();
let filename;
if (GLib.uri_parse_scheme(uri) != null)
filename = Gio.File.new_for_uri(uri).get_path();
else
filename = uri;
if (!filename) {
this._setLoaded();
return;
}
this._loadFile(filename);
},

View File

@@ -589,12 +589,12 @@ const BoxPointer = new Lang.Class({
return St.Side.TOP;
break;
case St.Side.LEFT:
if (sourceAllocation.y2 + boxWidth > monitor.x + monitor.width &&
if (sourceAllocation.x2 + boxWidth > monitor.x + monitor.width &&
boxWidth < sourceAllocation.x1 - monitor.x)
return St.Side.RIGHT;
break;
case St.Side.RIGHT:
if (sourceAllocation.y1 - boxWidth < monitor.x &&
if (sourceAllocation.x1 - boxWidth < monitor.x &&
boxWidth < monitor.x + monitor.width - sourceAllocation.x2)
return St.Side.LEFT;
break;

View File

@@ -31,7 +31,7 @@ function shouldAutorunMount(mount, forTransient) {
if (!volume || (!volume.allowAutorun && forTransient))
return false;
if (!root.is_native() || isMountRootHidden(root))
if (root.is_native() && isMountRootHidden(root))
return false;
return true;

View File

@@ -18,7 +18,7 @@ const Params = imports.misc.params;
const PopupMenu = imports.ui.popupMenu;
// See Notification.appendMessage
const SCROLLBACK_IMMEDIATE_TIME = 60; // 1 minute
const SCROLLBACK_IMMEDIATE_TIME = 3 * 60; // 3 minutes
const SCROLLBACK_RECENT_TIME = 15 * 60; // 15 minutes
const SCROLLBACK_RECENT_LENGTH = 20;
const SCROLLBACK_IDLE_LENGTH = 5;
@@ -967,7 +967,8 @@ const ChatNotification = new Lang.Class({
let timeLabel = this._append({ body: this._formatTimestamp(lastMessageDate),
group: 'meta',
styles: ['chat-meta-message'],
childProps: { expand: true, x_fill: false },
childProps: { expand: true, x_fill: false,
x_align: St.Align.END },
noTimestamp: true,
timestamp: lastMessageTime });

View File

@@ -326,6 +326,16 @@ const DragPlaceholderItem = new Lang.Class({
}
});
const EmptyDropTargetItem = new Lang.Class({
Name: 'EmptyDropTargetItem',
Extends: DashItemContainer,
_init: function() {
this.parent();
this.setChild(new St.Bin({ style_class: 'empty-dash-drop-target' }));
}
});
const DashActor = new Lang.Class({
Name: 'DashActor',
Extends: St.Widget,
@@ -441,6 +451,12 @@ const Dash = new Lang.Class({
dragMotion: Lang.bind(this, this._onDragMotion)
};
DND.addDragMonitor(this._dragMonitor);
if (this._box.get_n_children() == 0) {
this._emptyDropTarget = new EmptyDropTargetItem();
this._box.insert_child_at_index(this._emptyDropTarget, 0);
this._emptyDropTarget.show(true);
}
},
_onDragCancelled: function() {
@@ -457,6 +473,7 @@ const Dash = new Lang.Class({
_endDrag: function() {
this._clearDragPlaceholder();
this._clearEmptyDropTarget();
this._showAppsIcon.setDragApp(null);
DND.removeDragMonitor(this._dragMonitor);
},
@@ -797,9 +814,21 @@ const Dash = new Lang.Class({
_clearDragPlaceholder: function() {
if (this._dragPlaceholder) {
this._animatingPlaceholdersCount++;
this._dragPlaceholder.animateOutAndDestroy();
this._dragPlaceholder.connect('destroy',
Lang.bind(this, function() {
this._animatingPlaceholdersCount--;
}));
this._dragPlaceholder = null;
this._dragPlaceholderPos = -1;
}
this._dragPlaceholderPos = -1;
},
_clearEmptyDropTarget: function() {
if (this._emptyDropTarget) {
this._emptyDropTarget.animateOutAndDestroy();
this._emptyDropTarget = null;
}
},
@@ -827,23 +856,18 @@ const Dash = new Lang.Class({
numChildren--;
}
let pos = Math.floor(y * numChildren / boxHeight);
let pos;
if (!this._emptyDropTarget)
pos = Math.floor(y * numChildren / boxHeight);
else
pos = 0; // always insert at the top when dash is empty
if (pos != this._dragPlaceholderPos && pos <= numFavorites && this._animatingPlaceholdersCount == 0) {
this._dragPlaceholderPos = pos;
// Don't allow positioning before or after self
if (favPos != -1 && (pos == favPos || pos == favPos + 1)) {
if (this._dragPlaceholder) {
this._dragPlaceholder.animateOutAndDestroy();
this._animatingPlaceholdersCount++;
this._dragPlaceholder.connect('destroy',
Lang.bind(this, function() {
this._animatingPlaceholdersCount--;
}));
}
this._dragPlaceholder = null;
this._clearDragPlaceholder();
return DND.DragMotionResult.CONTINUE;
}
@@ -868,9 +892,9 @@ const Dash = new Lang.Class({
// Remove the drag placeholder if we are not in the
// "favorites zone"
if (pos > numFavorites && this._dragPlaceholder) {
if (pos > numFavorites)
this._clearDragPlaceholder();
}
if (!this._dragPlaceholder)
return DND.DragMotionResult.NO_DROP;

View File

@@ -149,16 +149,16 @@ const _Draggable = new Lang.Class({
_grabEvents: function() {
if (!this._eventsGrabbed) {
Clutter.grab_pointer(_getEventHandlerActor());
Clutter.grab_keyboard(_getEventHandlerActor());
this._eventsGrabbed = true;
this._eventsGrabbed = Main.pushModal(_getEventHandlerActor());
if (this._eventsGrabbed)
Clutter.grab_pointer(_getEventHandlerActor());
}
},
_ungrabEvents: function() {
if (this._eventsGrabbed) {
Clutter.ungrab_pointer();
Clutter.ungrab_keyboard();
Main.popModal(_getEventHandlerActor());
this._eventsGrabbed = false;
}
},

View File

@@ -420,6 +420,7 @@ const EndSessionDialog = new Lang.Class({
_startTimer: function() {
let startTime = GLib.get_monotonic_time();
this._secondsLeft = this._totalSecondsToStayOpen;
this._updateDescription();
this._timerId = Mainloop.timeout_add_seconds(1, Lang.bind(this,
function() {

View File

@@ -5,6 +5,8 @@ imports.gi.versions.Gio = '2.0';
imports.gi.versions.Gdk = '3.0';
imports.gi.versions.GdkPixbuf = '2.0';
imports.gi.versions.Gtk = '3.0';
imports.gi.versions.TelepathyGLib = '0.12';
imports.gi.versions.TelepathyLogger = '0.2';
const Clutter = imports.gi.Clutter;;
const Gettext = imports.gettext;

View File

@@ -347,7 +347,7 @@ const LayoutManager = new Lang.Class({
BackgroundMenu.addBackgroundMenu(bgManager.background.actor);
}));
this._bgManagers.push(bgManager);
this._bgManagers[monitorIndex] = bgManager;
return bgManager.background;
},
@@ -728,6 +728,8 @@ const LayoutManager = new Lang.Class({
// and shown otherwise)
addChrome: function(actor, params) {
this.uiGroup.add_actor(actor);
if (this.uiGroup.contains(global.top_window_group))
this.uiGroup.set_child_below_sibling(actor, global.top_window_group);
this._trackActor(actor, params);
},

View File

@@ -38,7 +38,6 @@ const Magnifier = imports.ui.magnifier;
const XdndHandler = imports.ui.xdndHandler;
const Util = imports.misc.util;
const OVERRIDES_SCHEMA = 'org.gnome.shell.overrides';
const DEFAULT_BACKGROUND_COLOR = Clutter.Color.from_pixel(0x2e3436ff);
let componentManager = null;
@@ -68,7 +67,7 @@ let layoutManager = null;
let _startDate;
let _defaultCssStylesheet = null;
let _cssStylesheet = null;
let _overridesSettings = null;
let _workspacesSettings = null;
function _sessionUpdated() {
_loadDefaultStylesheet();
@@ -106,6 +105,7 @@ function start() {
function _sessionsLoaded() {
sessionMode.connect('updated', _sessionUpdated);
_initializePrefs();
_initializeUI();
shellDBusService = new ShellDBus.GnomeShell();
@@ -114,6 +114,21 @@ function _sessionsLoaded() {
_sessionUpdated();
}
function _initializePrefs() {
let keys = new Gio.Settings({ schema: sessionMode.overridesSchema }).list_keys();
for (let i = 0; i < keys.length; i++)
Meta.prefs_override_preference_schema (keys[i], sessionMode.overridesSchema);
let workspacesSchema;
if (keys.indexOf('dynamic-workspaces') > -1)
workspacesSchema = sessionMode.overridesSchema;
else
workspacesSchema = 'org.gnome.mutter';
_workspacesSettings = new Gio.Settings({ schema: workspacesSchema });
_workspacesSettings.connect('changed::dynamic-workspaces', _queueCheckWorkspaces);
}
function _initializeUI() {
// Ensure ShellWindowTracker and ShellAppUsage are initialized; this will
// also initialize ShellAppSystem first. ShellAppSystem
@@ -179,9 +194,6 @@ function _initializeUI() {
Scripting.runPerfScript(module, perfOutput);
}
_overridesSettings = new Gio.Settings({ schema: OVERRIDES_SCHEMA });
_overridesSettings.connect('changed::dynamic-workspaces', _queueCheckWorkspaces);
global.screen.connect('notify::n-workspaces', _nWorkspacesChanged);
global.screen.connect('window-entered-monitor', _windowEnteredMonitor);

View File

@@ -1530,11 +1530,7 @@ const MessageTrayContextMenu = new Lang.Class({
},
_updateClearSensitivity: function() {
let sources = this._tray.getSources();
sources = sources.filter(function(source) {
return !source.trayIcon && !source.isChat && !source.resident;
});
this._clearItem.setSensitive(sources.length > 0);
this._clearItem.setSensitive(this._tray.clearableCount > 0);
},
setPosition: function(x, y) {
@@ -1661,6 +1657,8 @@ const MessageTray = new Lang.Class({
this._desktopClone = null;
this._inCtrlAltTab = false;
this.clearableCount = 0;
this._lightbox = new Lightbox.Lightbox(global.overlay_group,
{ inhibitEvents: true,
fadeInTime: ANIMATION_TIME,
@@ -1899,6 +1897,9 @@ const MessageTray = new Lang.Class({
this._summary.insert_child_at_index(summaryItem.actor, this._chatSummaryItemsCount);
}
if (!source.trayIcon && !source.isChat && !source.resident)
this.clearableCount++;
this._sources.set(source, obj);
obj.notifyId = source.connect('notify', Lang.bind(this, this._onNotify));
@@ -1940,6 +1941,9 @@ const MessageTray = new Lang.Class({
if (source.isChat)
this._chatSummaryItemsCount--;
if (!source.trayIcon && !source.isChat && !source.resident)
this.clearableCount--;
source.disconnect(obj.notifyId);
source.disconnect(obj.destroyId);
source.disconnect(obj.mutedChangedId);
@@ -2245,10 +2249,15 @@ const MessageTray = new Lang.Class({
let canShowSummaryBoxPointer = this._trayState == State.SHOWN;
// We only have sources with empty notification stacks for legacy tray icons. Currently, we never attempt
// to show notifications for legacy tray icons, but this would be necessary if we did.
let requestedNotificationStackIsEmpty = (this._clickedSummaryItemMouseButton == 1 && this._clickedSummaryItem.source.notifications.length == 0);
let wrongSummaryNotificationStack = (this._clickedSummaryItemMouseButton == 1 &&
let requestedNotificationStackIsEmpty = (haveClickedSummaryItem &&
this._clickedSummaryItemMouseButton == 1 &&
this._clickedSummaryItem.source.notifications.length == 0);
let wrongSummaryNotificationStack = (haveClickedSummaryItem &&
this._clickedSummaryItemMouseButton == 1 &&
this._summaryBoxPointer.bin.child != this._clickedSummaryItem.notificationStackWidget);
let wrongSummaryRightClickMenu = (this._clickedSummaryItemMouseButton == 3 &&
let wrongSummaryRightClickMenu = (haveClickedSummaryItem &&
this._clickedSummaryItemMouseButton == 3 &&
this._clickedSummaryItem.rightClickMenu != null &&
this._summaryBoxPointer.bin.child != this._clickedSummaryItem.rightClickMenu);
let wrongSummaryBoxPointer = (haveClickedSummaryItem &&
(wrongSummaryNotificationStack || wrongSummaryRightClickMenu));
@@ -2595,16 +2604,16 @@ const MessageTray = new Lang.Class({
},
_expandNotification: function(autoExpanding) {
// Don't focus notifications that are auto-expanding.
if (!autoExpanding)
this._ensureNotificationFocused();
if (!this._notificationExpandedId)
this._notificationExpandedId =
this._notification.connect('expanded',
Lang.bind(this, this._onNotificationExpanded));
// Don't animate changes in notifications that are auto-expanding.
this._notification.expand(!autoExpanding);
// Don't focus notifications that are auto-expanding.
if (!autoExpanding)
this._ensureNotificationFocused();
},
_onNotificationExpanded: function() {

View File

@@ -136,8 +136,10 @@ const OsdWindow = new Lang.Class({
return;
if (!this.actor.visible) {
Meta.disable_unredirect_for_screen(global.screen);
this.actor.show();
this.actor.opacity = 0;
this.actor.get_parent().set_child_above_sibling(this.actor, null);
Tweener.addTween(this.actor,
{ opacity: 255,
@@ -165,7 +167,11 @@ const OsdWindow = new Lang.Class({
{ opacity: 0,
time: FADE_TIME,
transition: 'easeOutQuad',
onComplete: Lang.bind(this, this._reset) });
onComplete: Lang.bind(this, function() {
this._reset();
Meta.enable_unredirect_for_screen(global.screen);
})
});
},
_reset: function() {

View File

@@ -31,7 +31,7 @@ const ANIMATION_TIME = 0.25;
// and don't want the shading animation to get cut off
const SHADE_ANIMATION_TIME = .20;
const DND_WINDOW_SWITCH_TIMEOUT = 1250;
const DND_WINDOW_SWITCH_TIMEOUT = 750;
const OVERVIEW_ACTIVATION_TIMEOUT = 0.5;
@@ -461,6 +461,7 @@ const Overview = new Lang.Class({
beginItemDrag: function(source) {
this.emit('item-drag-begin');
this._inDrag = true;
},
cancelledItemDrag: function(source) {
@@ -469,10 +470,12 @@ const Overview = new Lang.Class({
endItemDrag: function(source) {
this.emit('item-drag-end');
this._inDrag = false;
},
beginWindowDrag: function(source) {
this.emit('window-drag-begin');
this._inDrag = true;
},
cancelledWindowDrag: function(source) {
@@ -481,6 +484,7 @@ const Overview = new Lang.Class({
endWindowDrag: function(source) {
this.emit('window-drag-end');
this._inDrag = false;
},
// show:
@@ -499,6 +503,11 @@ const Overview = new Lang.Class({
this._animateVisible();
},
focusSearch: function() {
this.show();
this._searchEntry.grab_key_focus();
},
fadeInDesktop: function() {
this._desktopFade.opacity = 0;
this._desktopFade.show();
@@ -604,6 +613,8 @@ const Overview = new Lang.Class({
shouldToggleByCornerOrButton: function() {
if (this.animationInProgress)
return false;
if (this._inDrag)
return false;
if (this._activationTime == 0 || Date.now() / 1000 - this._activationTime > OVERVIEW_ACTIVATION_TIMEOUT)
return true;
return false;

View File

@@ -371,13 +371,16 @@ const AppMenuButton = new Lang.Class({
this._updateIconBoxClip();
},
_syncIcon: function() {
let icon = this._targetApp.get_faded_icon(2 * PANEL_ICON_SIZE, this._iconBox.text_direction);
this._iconBox.set_child(icon);
},
_onIconThemeChanged: function() {
if (this._iconBox.child == null)
return;
this._iconBox.child.destroy();
let icon = this._targetApp.get_faded_icon(2 * PANEL_ICON_SIZE);
this._iconBox.set_child(icon);
this._syncIcon();
},
_updateIconBoxClip: function() {
@@ -595,12 +598,10 @@ const AppMenuButton = new Lang.Class({
}
this._targetApp = targetApp;
let icon = targetApp.get_faded_icon(2 * PANEL_ICON_SIZE);
this._label.setText(targetApp.get_name());
this.setName(targetApp.get_name());
this._iconBox.set_child(icon);
this._syncIcon();
this._iconBox.show();
if (targetApp.get_state() == Shell.AppState.STARTING)

View File

@@ -553,6 +553,10 @@ const PopupSliderMenuItem = new Lang.Class({
let handleRadius = themeNode.get_length('-slider-handle-radius');
let handleBorderWidth = themeNode.get_length('-slider-handle-border-width');
let [hasHandleColor, handleBorderColor] =
themeNode.lookup_color('-slider-handle-border-color', false);
let sliderWidth = width - 2 * handleRadius;
let sliderHeight = themeNode.get_length('-slider-height');
@@ -604,7 +608,16 @@ const PopupSliderMenuItem = new Lang.Class({
color.blue / 255,
color.alpha / 255);
cr.arc(handleX, handleY, handleRadius, 0, 2 * Math.PI);
cr.fill();
cr.fillPreserve();
if (hasHandleColor && handleBorderWidth) {
cr.setSourceRGBA(
handleBorderColor.red / 255,
handleBorderColor.green / 255,
handleBorderColor.blue / 255,
handleBorderColor.alpha / 255);
cr.setLineWidth(handleBorderWidth);
cr.stroke();
}
cr.$dispose();
},
@@ -1813,6 +1826,8 @@ const RemoteMenu = new Lang.Class({
this._actionStateChangeId = this.actionGroup.connect('action-state-changed', Lang.bind(this, this._actionStateChanged));
this._actionEnableChangeId = this.actionGroup.connect('action-enabled-changed', Lang.bind(this, this._actionEnabledChanged));
this._skipSignalConnection = false;
},
destroy: function() {
@@ -1860,7 +1875,7 @@ const RemoteMenu = new Lang.Class({
let action_id = model.get_item_attribute_value(index, Gio.MENU_ATTRIBUTE_ACTION, null).deep_unpack();
if (!this.actionGroup.has_action(action_id)) {
// the action may not be there yet, wait for action-added
return [null, false, 'action-added'];
return [null, false, 'action-added::' + action_id];
}
if (!this._actions[action_id])
@@ -1897,7 +1912,7 @@ const RemoteMenu = new Lang.Class({
break;
default:
log('Action "%s" has state of type %s, which is not supported'.format(action_id, action.state.get_type_string()));
return [null, false, 'action-state-changed'];
return [null, false, 'action-state-changed::' + action_id];
}
} else {
target = model.get_item_attribute_value(index, Gio.MENU_ATTRIBUTE_TARGET, null);
@@ -1973,13 +1988,16 @@ const RemoteMenu = new Lang.Class({
target.addMenuItem(separator, k+1);
k++;
}
} else if (changeSignal) {
} else if (changeSignal && !this._skipSignalConnection) {
let signalId = this.actionGroup.connect(changeSignal, Lang.bind(this, function(actionGroup, actionName) {
actionGroup.disconnect(signalId);
if (this._actions[actionName]) return;
// force a full update
/* force a full update but do not reconnect signals if other
* actions are missing */
this._skipSignalConnection = true;
this._modelChanged(model, 0, -1, model.get_n_items(), target);
this._skipSignalConnection = false;
}));
}
}
@@ -2088,7 +2106,7 @@ const PopupMenuManager = new Lang.Class({
removeMenu: function(menu) {
if (menu == this.activeMenu)
this._closeMenu(menu);
this._closeMenu(false, menu);
let position = this._findMenu(menu);
if (position == -1) // not a menu we manage
@@ -2124,7 +2142,7 @@ const PopupMenuManager = new Lang.Class({
_onMenuOpenState: function(menu, open) {
if (open) {
if (this.activeMenu)
if (this.activeMenu && !this.activeMenu.isChildMenu(menu))
this.activeMenu.close(BoxPointer.PopupAnimation.FADE);
this._grabHelper.grab({ actor: menu.actor, modal: true, focus: menu.sourceActor,
onUngrab: Lang.bind(this, this._closeMenu, menu) });

View File

@@ -478,6 +478,7 @@ const ScreenShield = new Lang.Class({
this._lockDialogGroup = new St.Widget({ x_expand: true,
y_expand: true,
reactive: true,
opacity: 0,
pivot_point: new Clutter.Point({ x: 0.5, y: 0.5 }),
name: 'lockDialogGroup' });
@@ -709,6 +710,8 @@ const ScreenShield = new Lang.Class({
},
_onDragEnd: function(action, actor, eventX, eventY, modifiers) {
if (this._lockScreenState != MessageTray.State.HIDING)
return;
if (this._lockScreenGroup.y < -(ARROW_DRAG_THRESHOLD * global.stage.height)) {
// Complete motion automatically
let [velocity, velocityX, velocityY] = this._dragAction.get_velocity(0);
@@ -1200,6 +1203,12 @@ const ScreenShield = new Lang.Class({
return;
}
// Clear the clipboard - otherwise, its contents may be leaked
// to unauthorized parties by pasting into the unlock dialog's
// password entry and unmasking the entry
St.Clipboard.get_default().set_text(St.ClipboardType.CLIPBOARD, '');
St.Clipboard.get_default().set_text(St.ClipboardType.PRIMARY, '');
this._isLocked = true;
this.activate(animate);

View File

@@ -105,7 +105,8 @@ const ScreencastService = new Lang.Class({
recorder.set_file_template(fileTemplate);
this._applyOptionalParameters(recorder, options);
returnValue = recorder.record();
let [success, fileName] = recorder.record();
returnValue = [success, fileName ? fileName : ''];
}
invocation.return_value(GLib.Variant.new('(bs)', returnValue));
@@ -125,7 +126,8 @@ const ScreencastService = new Lang.Class({
recorder.set_file_template(fileTemplate);
recorder.set_area(x, y, width, height);
this._applyOptionalParameters(recorder, options);
returnValue = recorder.record();
let [success, fileName] = recorder.record();
returnValue = [success, fileName ? fileName : ''];
}
invocation.return_value(GLib.Variant.new('(bs)', returnValue));

View File

@@ -16,6 +16,7 @@ const _modes = {
'restrictive': {
parentMode: null,
stylesheetName: 'gnome-shell.css',
overridesSchema: 'org.gnome.shell.overrides',
hasOverview: false,
showCalendarEvents: false,
allowSettings: false,

View File

@@ -21,6 +21,7 @@ const GnomeShellIface = <interface name="org.gnome.Shell">
<arg type="b" direction="out" name="success" />
<arg type="s" direction="out" name="result" />
</method>
<method name="FocusSearch"/>
<method name="ShowOSD">
<arg type="a{sv}" direction="in" name="params"/>
</method>
@@ -116,6 +117,10 @@ const GnomeShell = new Lang.Class({
return [success, returnValue];
},
FocusSearch: function() {
Main.overview.focusSearch();
},
ShowOSD: function(params) {
for (let param in params)
params[param] = params[param].deep_unpack();

View File

@@ -33,6 +33,33 @@ const KEY_INPUT_SOURCES = 'sources';
const INPUT_SOURCE_TYPE_XKB = 'xkb';
const INPUT_SOURCE_TYPE_IBUS = 'ibus';
// This is the longest we'll keep the keyboard frozen until an input
// source is active.
const MAX_INPUT_SOURCE_ACTIVATION_TIME = 4000; // ms
const BUS_NAME = 'org.gnome.SettingsDaemon.Keyboard';
const OBJECT_PATH = '/org/gnome/SettingsDaemon/Keyboard';
const KeyboardManagerInterface =
<interface name="org.gnome.SettingsDaemon.Keyboard">
<method name="SetInputSource">
<arg type="u" direction="in" />
</method>
</interface>;
const KeyboardManagerProxy = Gio.DBusProxy.makeProxyWrapper(KeyboardManagerInterface);
function releaseKeyboard() {
if (Main.modalCount > 0)
global.display.unfreeze_keyboard(global.get_current_time());
else
global.display.ungrab_keyboard(global.get_current_time());
}
function holdKeyboard() {
global.freeze_keyboard(global.get_current_time());
}
const IBusManager = new Lang.Class({
Name: 'IBusManager',
@@ -329,14 +356,14 @@ const InputSourceIndicator = new Lang.Class({
Main.wm.addKeybinding('switch-input-source',
new Gio.Settings({ schema: "org.gnome.desktop.wm.keybindings" }),
Meta.KeyBindingFlags.REVERSES,
Shell.KeyBindingMode.ALL & ~Shell.KeyBindingMode.MESSAGE_TRAY,
Shell.KeyBindingMode.ALL,
Lang.bind(this, this._switchInputSource));
this._keybindingActionBackward =
Main.wm.addKeybinding('switch-input-source-backward',
new Gio.Settings({ schema: "org.gnome.desktop.wm.keybindings" }),
Meta.KeyBindingFlags.REVERSES |
Meta.KeyBindingFlags.REVERSED,
Shell.KeyBindingMode.ALL & ~Shell.KeyBindingMode.MESSAGE_TRAY,
Shell.KeyBindingMode.ALL,
Lang.bind(this, this._switchInputSource));
this._settings = new Gio.Settings({ schema: DESKTOP_INPUT_SOURCES_SCHEMA });
this._settings.connect('changed::' + KEY_CURRENT_INPUT_SOURCE, Lang.bind(this, this._currentInputSourceChanged));
@@ -356,6 +383,15 @@ const InputSourceIndicator = new Lang.Class({
this._ibusManager.connect('property-updated', Lang.bind(this, this._ibusPropertyUpdated));
this._inputSourcesChanged();
this._keyboardManager = new KeyboardManagerProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH,
function(proxy, error) {
if (error)
log(error.message);
});
this._keyboardManager.g_default_timeout = MAX_INPUT_SOURCE_ACTIVATION_TIME;
global.display.connect('modifiers-accelerator-activated', Lang.bind(this, this._modifiersSwitcher));
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this._showLayoutItem = this.menu.addAction(_("Show Keyboard Layout"), Lang.bind(this, this._showLayout));
@@ -389,10 +425,43 @@ const InputSourceIndicator = new Lang.Class({
this._inputSourcesChanged();
},
_modifiersSwitcher: function() {
let sourceIndexes = Object.keys(this._inputSources);
if (sourceIndexes.length == 0) {
releaseKeyboard();
return true;
}
let is = this._currentSource;
if (!is)
is = this._inputSources[sourceIndexes[0]];
let nextIndex = is.index + 1;
if (nextIndex > sourceIndexes[sourceIndexes.length - 1])
nextIndex = 0;
while (!(is = this._inputSources[nextIndex]))
nextIndex += 1;
is.activate();
return true;
},
_switchInputSource: function(display, screen, window, binding) {
if (this._mruSources.length < 2)
return;
// HACK: Fall back on simple input source switching since we
// can't show a popup switcher while a GrabHelper grab is in
// effect without considerable work to consolidate the usage
// of pushModal/popModal and grabHelper. See
// https://bugzilla.gnome.org/show_bug.cgi?id=695143 .
if (Main.keybindingMode == Shell.KeyBindingMode.MESSAGE_TRAY ||
Main.keybindingMode == Shell.KeyBindingMode.TOPBAR_POPUP) {
this._modifiersSwitcher();
return;
}
let popup = new InputSourcePopup(this._mruSources, this._keybindingAction, this._keybindingActionBackward);
let modifiers = binding.get_modifiers();
let backwards = modifiers & Meta.VirtualModifier.SHIFT_MASK;
@@ -451,6 +520,7 @@ const InputSourceIndicator = new Lang.Class({
this._inputSources = {};
this._ibusSources = {};
this._currentSource = null;
let inputSourcesByShortName = {};
@@ -479,10 +549,8 @@ const InputSourceIndicator = new Lang.Class({
let is = new InputSource(type, id, displayName, shortName, i);
is.connect('activate', Lang.bind(this, function() {
if (this._currentSource && this._currentSource.index == is.index)
return;
this._settings.set_value(KEY_CURRENT_INPUT_SOURCE,
GLib.Variant.new_uint32(is.index));
holdKeyboard();
this._keyboardManager.SetInputSourceRemote(is.index, releaseKeyboard);
}));
if (!(is.shortName in inputSourcesByShortName))

View File

@@ -2080,12 +2080,12 @@ const NMApplet = new Lang.Class({
if (a.state == NetworkManager.ActiveConnectionState.ACTIVATING)
activating = a;
else if (a.state == NetworkManager.ActiveConnectionState.ACTIVE)
else if (a.state == NetworkManager.ActiveConnectionState.ACTIVATED)
active_any = a;
if (a._type == 'vpn' &&
(a.state == NetworkManager.ActiveConnectionState.ACTIVATING ||
a.state == NetworkManager.ActiveConnectionState.ACTIVE))
a.state == NetworkManager.ActiveConnectionState.ACTIVATED))
active_vpn = a;
if (!a._primaryDevice) {

View File

@@ -307,7 +307,7 @@ const Indicator = new Lang.Class({
this._headphoneIcon.visible = value;
}));
this._headphoneIcon = this.addIcon(new Gio.ThemedIcon({ name: 'headphones-symbolic' }));
this._headphoneIcon = this.addIcon(new Gio.ThemedIcon({ name: 'audio-headphones-symbolic' }));
this._headphoneIcon.visible = false;
this.menu.addMenuItem(this._volumeMenu);

View File

@@ -16,6 +16,7 @@ const UserWidget = new Lang.Class({
this.actor = new St.BoxLayout({ style_class: 'user-widget',
vertical: false });
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
this._avatar = new UserMenu.UserAvatarWidget(user);
this.actor.add(this._avatar.actor,
@@ -36,7 +37,7 @@ const UserWidget = new Lang.Class({
this._updateUser();
},
destroy: function() {
_onDestroy: function() {
if (this._userLoadedId != 0) {
this._user.disconnect(this._userLoadedId);
this._userLoadedId = 0;
@@ -46,8 +47,6 @@ const UserWidget = new Lang.Class({
this._user.disconnect(this._userChangedId);
this._userChangedId = 0;
}
this.actor.destroy();
},
_updateUser: function() {

View File

@@ -136,6 +136,42 @@ const WindowManager = new Lang.Class({
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._showWorkspaceSwitcher));
this.allowKeybinding('switch-to-workspace-1',
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW);
this.allowKeybinding('switch-to-workspace-2',
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW);
this.allowKeybinding('switch-to-workspace-3',
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW);
this.allowKeybinding('switch-to-workspace-4',
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW);
this.allowKeybinding('switch-to-workspace-5',
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW);
this.allowKeybinding('switch-to-workspace-6',
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW);
this.allowKeybinding('switch-to-workspace-7',
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW);
this.allowKeybinding('switch-to-workspace-8',
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW);
this.allowKeybinding('switch-to-workspace-9',
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW);
this.allowKeybinding('switch-to-workspace-10',
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW);
this.allowKeybinding('switch-to-workspace-11',
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW);
this.allowKeybinding('switch-to-workspace-12',
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW);
this.setCustomKeybindingHandler('switch-applications',
Shell.KeyBindingMode.NORMAL,
Lang.bind(this, this._startAppSwitcher));

View File

@@ -1094,6 +1094,7 @@ const Workspace = new Lang.Class({
Tweener.removeTweens(clone.actor);
clone.actor.set_position(x, y);
clone.actor.set_scale(scale, scale);
clone.actor.set_opacity(255);
clone.overlay.relayout(false);
this._showWindowOverlay(clone, overlay, isOnCurrentWorkspace);
}

View File

@@ -125,6 +125,12 @@
<listitem><para>List possible modes and exit</para></listitem>
</varlistentry>
<varlistentry>
<term><option>--clutter-display=<replaceable>DISPLAY</replaceable></option></term>
<listitem><para>Clutter the option display (otherwise ignored)</para></listitem>
</varlistentry>
</variablelist>
</refsect1>

View File

@@ -46,6 +46,7 @@ ms
nb
nl
nn
oc
or
pa
pl

588
po/as.po

File diff suppressed because it is too large Load Diff

521
po/ca.po

File diff suppressed because it is too large Load Diff

525
po/cs.po

File diff suppressed because it is too large Load Diff

477
po/de.po

File diff suppressed because it is too large Load Diff

598
po/el.po

File diff suppressed because it is too large Load Diff

662
po/es.po

File diff suppressed because it is too large Load Diff

View File

@@ -1244,7 +1244,7 @@ msgstr "Ezezaguna"
#, c-format
msgid "%d new message"
msgid_plural "%d new messages"
msgstr[0] "Mezu berri &d"
msgstr[0] "Mezu berri %d"
msgstr[1] "%d mezu berri"
#: ../js/ui/overview.js:84

646
po/fi.po

File diff suppressed because it is too large Load Diff

523
po/fr.po

File diff suppressed because it is too large Load Diff

595
po/gl.po

File diff suppressed because it is too large Load Diff

688
po/gu.po

File diff suppressed because it is too large Load Diff

508
po/hu.po

File diff suppressed because it is too large Load Diff

577
po/id.po

File diff suppressed because it is too large Load Diff

726
po/kn.po

File diff suppressed because it is too large Load Diff

273
po/lt.po
View File

@@ -11,9 +11,9 @@ 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: 2013-03-23 11:49+0000\n"
"PO-Revision-Date: 2013-03-26 22:43+0200\n"
"Last-Translator: Mantas Kriaučiūnas <mantas@akl.lt>\n"
"POT-Creation-Date: 2013-12-20 16:10+0000\n"
"PO-Revision-Date: 2013-12-21 16:31+0200\n"
"Last-Translator: Aurimas Černius <aurisc4@gmail.com>\n"
"Language-Team: Lietuvių <gnome-lt@lists.akl.lt>\n"
"Language: lt\n"
"MIME-Version: 1.0\n"
@@ -360,7 +360,7 @@ msgstr "Darbalaukiai tik pagrindiniame monitoriuje"
#: ../js/extensionPrefs/main.js:125
#, c-format
msgid "There was an error loading the preferences dialog for %s:"
msgstr "Įvyko klaida įkeliant %s nustatymų dialogą:"
msgstr "Kilo klaida įkeliant %s nustatymų dialogą:"
#: ../js/extensionPrefs/main.js:165
msgid "Extension"
@@ -370,43 +370,50 @@ msgstr "Plėtinys"
msgid "Select an extension to configure using the combobox above."
msgstr "Išskleidžiamajame sąraše pasirinkite konfigūruotiną plėtinį."
#: ../js/gdm/loginDialog.js:405
#: ../js/gdm/loginDialog.js:371
msgid "Session…"
msgstr "Seansas…"
#. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for
#. manually entering the username.
#: ../js/gdm/loginDialog.js:630
#: ../js/gdm/loginDialog.js:601
msgid "Not listed?"
msgstr "Nėra sąraše?"
#: ../js/gdm/loginDialog.js:786 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:375
#: ../js/gdm/loginDialog.js:776 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:376
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:99
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:96
#: ../js/ui/userMenu.js:938
msgid "Cancel"
msgstr "Atsisakyti"
#: ../js/gdm/loginDialog.js:802
#: ../js/gdm/loginDialog.js:791
msgctxt "button"
msgid "Sign In"
msgstr "Prisijungti"
#: ../js/gdm/loginDialog.js:802
#: ../js/gdm/loginDialog.js:791
msgid "Next"
msgstr "Kitas"
#. Translators: this message is shown below the username entry field
#. to clue the user in on how to login to the local network realm
#: ../js/gdm/loginDialog.js:888
#, c-format
msgid "(e.g., user or %s)"
msgstr "(pvz., naudotojas arba %s)"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: ../js/gdm/loginDialog.js:917 ../js/ui/components/networkAgent.js:260
#: ../js/gdm/loginDialog.js:892 ../js/ui/components/networkAgent.js:260
#: ../js/ui/components/networkAgent.js:278
msgid "Username: "
msgstr "Naudotojo vardas: "
#: ../js/gdm/loginDialog.js:1173
#: ../js/gdm/loginDialog.js:1158
msgid "Login Window"
msgstr "Prisijungimo langas"
@@ -429,21 +436,16 @@ msgstr "Paleisti iš naujo"
msgid "Power Off"
msgstr "Išjungti"
#: ../js/gdm/util.js:249
#: ../js/gdm/util.js:248
msgid "Authentication error"
msgstr "Tapatybės patvirtinimo klaida"
#. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead
#: ../js/gdm/util.js:366
#: ../js/gdm/util.js:365
msgid "(or swipe finger)"
msgstr "(arba perbraukite pirštu)"
#: ../js/gdm/util.js:391
#, c-format
msgid "(e.g., user or %s)"
msgstr "(pvz., naudotojas arba %s)"
#: ../js/misc/util.js:97
msgid "Command not found"
msgstr "Komanda nerasta"
@@ -459,23 +461,23 @@ msgstr "Nepavyko perskaityti komandos:"
msgid "Execution of '%s' failed:"
msgstr "Nepavyko įvykdyti „%s“:"
#: ../js/ui/appDisplay.js:349
#: ../js/ui/appDisplay.js:392
msgid "Frequent"
msgstr "Dažnai naudojamos"
#: ../js/ui/appDisplay.js:356
#: ../js/ui/appDisplay.js:399
msgid "All"
msgstr "Visos"
#: ../js/ui/appDisplay.js:914
#: ../js/ui/appDisplay.js:977
msgid "New Window"
msgstr "Naujas langas"
#: ../js/ui/appDisplay.js:917 ../js/ui/dash.js:284
#: ../js/ui/appDisplay.js:980 ../js/ui/dash.js:284
msgid "Remove from Favorites"
msgstr "Pašalinti iš mėgstamų"
#: ../js/ui/appDisplay.js:918
#: ../js/ui/appDisplay.js:981
msgid "Add to Favorites"
msgstr "Pridėti prie mėgstamų"
@@ -512,7 +514,7 @@ msgctxt "event list time"
msgid "%H\\u2236%M"
msgstr "%H\\u2236%M"
#. Transators: Shown in calendar event list, if 12h format,
#. 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:77
@@ -667,11 +669,11 @@ msgstr "Atverti su %s"
msgid "Eject"
msgstr "Išimti"
#: ../js/ui/components/keyring.js:82 ../js/ui/components/polkitAgent.js:268
#: ../js/ui/components/keyring.js:88 ../js/ui/components/polkitAgent.js:280
msgid "Password:"
msgstr "Slaptažodis:"
#: ../js/ui/components/keyring.js:101
#: ../js/ui/components/keyring.js:107
msgid "Type again:"
msgstr "Įveskite dar kartą:"
@@ -751,15 +753,15 @@ msgstr "Mobiliojo plačiajuosčio tinklo slaptažodis"
msgid "A password is required to connect to '%s'."
msgstr "Būtinas slaptažodis norint prisijungti prie „%s“"
#: ../js/ui/components/polkitAgent.js:55
#: ../js/ui/components/polkitAgent.js:54
msgid "Authentication Required"
msgstr "Reikia patvirtinti tapatybę"
#: ../js/ui/components/polkitAgent.js:93
#: ../js/ui/components/polkitAgent.js:92
msgid "Administrator"
msgstr "Administratorius"
#: ../js/ui/components/polkitAgent.js:165
#: ../js/ui/components/polkitAgent.js:170
msgid "Authenticate"
msgstr "Patvirtinti tapatybę"
@@ -767,12 +769,12 @@ msgstr "Patvirtinti tapatybę"
#. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password),
#. * for instance.
#: ../js/ui/components/polkitAgent.js:256 ../js/ui/shellMountOperation.js:383
#: ../js/ui/components/polkitAgent.js:266 ../js/ui/shellMountOperation.js:383
msgid "Sorry, that didn't work. Please try again."
msgstr "Atsiprašome, tai nesuveikė. Bandykite dar kartą."
#. Translators: this is a filename used for screencast recording
#: ../js/ui/components/recorder.js:48
#: ../js/ui/components/recorder.js:47
#, no-c-format
msgid "Screencast from %d %t"
msgstr "Ekrano vaizdo įrašas iš %d %t"
@@ -831,14 +833,14 @@ msgstr "<b>%B</b> <b>%d</b> <b>%Y</b>, <b>%H:%M</b> "
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
#: ../js/ui/components/telepathyClient.js:985
#: ../js/ui/components/telepathyClient.js:986
#, c-format
msgid "%s is now known as %s"
msgstr "%s nuo šiol vadinasi %s"
#. translators: argument is a room name like
#. * room@jabber.org for example.
#: ../js/ui/components/telepathyClient.js:1088
#: ../js/ui/components/telepathyClient.js:1089
#, c-format
msgid "Invitation to %s"
msgstr "Kvietimas į %s"
@@ -846,38 +848,38 @@ msgstr "Kvietimas į %s"
#. translators: first argument is the name of a contact and the second
#. * one the name of a room. "Alice is inviting you to join room@jabber.org
#. * for example.
#: ../js/ui/components/telepathyClient.js:1096
#: ../js/ui/components/telepathyClient.js:1097
#, c-format
msgid "%s is inviting you to join %s"
msgstr "%s jus kviečia prisijungti prie %s"
#: ../js/ui/components/telepathyClient.js:1098
#: ../js/ui/components/telepathyClient.js:1137
#: ../js/ui/components/telepathyClient.js:1177
#: ../js/ui/components/telepathyClient.js:1240
#: ../js/ui/components/telepathyClient.js:1099
#: ../js/ui/components/telepathyClient.js:1138
#: ../js/ui/components/telepathyClient.js:1178
#: ../js/ui/components/telepathyClient.js:1241
msgid "Decline"
msgstr "Atmesti"
#: ../js/ui/components/telepathyClient.js:1099
#: ../js/ui/components/telepathyClient.js:1178
#: ../js/ui/components/telepathyClient.js:1241
#: ../js/ui/components/telepathyClient.js:1100
#: ../js/ui/components/telepathyClient.js:1179
#: ../js/ui/components/telepathyClient.js:1242
msgid "Accept"
msgstr "Priimti"
#. translators: argument is a contact name like Alice for example.
#: ../js/ui/components/telepathyClient.js:1129
#: ../js/ui/components/telepathyClient.js:1130
#, c-format
msgid "Video call from %s"
msgstr "Vaizdo skambutis nuo %s"
#. translators: argument is a contact name like Alice for example.
#: ../js/ui/components/telepathyClient.js:1132
#: ../js/ui/components/telepathyClient.js:1133
#, c-format
msgid "Call from %s"
msgstr "Skambutis nuo %s"
#. translators: this is a button label (verb), not a noun
#: ../js/ui/components/telepathyClient.js:1139
#: ../js/ui/components/telepathyClient.js:1140
msgid "Answer"
msgstr "Atsiliepti"
@@ -886,110 +888,110 @@ msgstr "Atsiliepti"
#. * file name. The string will be something
#. * like: "Alice is sending you test.ogg"
#.
#: ../js/ui/components/telepathyClient.js:1171
#: ../js/ui/components/telepathyClient.js:1172
#, c-format
msgid "%s is sending you %s"
msgstr "%s jums siunčia %s"
#. To translators: The parameter is the contact's alias
#: ../js/ui/components/telepathyClient.js:1206
#: ../js/ui/components/telepathyClient.js:1207
#, c-format
msgid "%s would like permission to see when you are online"
msgstr "%s pageidauja matyti, kai esate prisijungę prie interneto"
#: ../js/ui/components/telepathyClient.js:1298
#: ../js/ui/components/telepathyClient.js:1299
msgid "Network error"
msgstr "Tinklo klaida"
#: ../js/ui/components/telepathyClient.js:1300
#: ../js/ui/components/telepathyClient.js:1301
msgid "Authentication failed"
msgstr "Nepavyko patvirtinti tapatybės"
#: ../js/ui/components/telepathyClient.js:1302
#: ../js/ui/components/telepathyClient.js:1303
msgid "Encryption error"
msgstr "Šifravimo klaida"
#: ../js/ui/components/telepathyClient.js:1304
#: ../js/ui/components/telepathyClient.js:1305
msgid "Certificate not provided"
msgstr "Liudijimas nepateiktas"
#: ../js/ui/components/telepathyClient.js:1306
#: ../js/ui/components/telepathyClient.js:1307
msgid "Certificate untrusted"
msgstr "Liudijimas nepatikimas"
#: ../js/ui/components/telepathyClient.js:1308
#: ../js/ui/components/telepathyClient.js:1309
msgid "Certificate expired"
msgstr "Liudijimo galiojimas pasibaigęs"
#: ../js/ui/components/telepathyClient.js:1310
#: ../js/ui/components/telepathyClient.js:1311
msgid "Certificate not activated"
msgstr "Liudijimas neaktyvuotas"
#: ../js/ui/components/telepathyClient.js:1312
#: ../js/ui/components/telepathyClient.js:1313
msgid "Certificate hostname mismatch"
msgstr "Liudijimo serverio vardo nesutapimas"
#: ../js/ui/components/telepathyClient.js:1314
#: ../js/ui/components/telepathyClient.js:1315
msgid "Certificate fingerprint mismatch"
msgstr "Liudijimo piršto atspaudo nesutapimas"
#: ../js/ui/components/telepathyClient.js:1316
#: ../js/ui/components/telepathyClient.js:1317
msgid "Certificate self-signed"
msgstr "Liudijimas pačių pasirašytas"
#: ../js/ui/components/telepathyClient.js:1318
#: ../js/ui/components/telepathyClient.js:1319
msgid "Status is set to offline"
msgstr "Nustatyta atsijungimo būsena"
#: ../js/ui/components/telepathyClient.js:1320
#: ../js/ui/components/telepathyClient.js:1321
msgid "Encryption is not available"
msgstr "Šifravimas negalimas"
#: ../js/ui/components/telepathyClient.js:1322
#: ../js/ui/components/telepathyClient.js:1323
msgid "Certificate is invalid"
msgstr "Liudijimas netinkamas"
#: ../js/ui/components/telepathyClient.js:1324
#: ../js/ui/components/telepathyClient.js:1325
msgid "Connection has been refused"
msgstr "Ryšys atmestas"
#: ../js/ui/components/telepathyClient.js:1326
#: ../js/ui/components/telepathyClient.js:1327
msgid "Connection can't be established"
msgstr "Nepavyko užmegzti ryšio"
#: ../js/ui/components/telepathyClient.js:1328
#: ../js/ui/components/telepathyClient.js:1329
msgid "Connection has been lost"
msgstr "Ryšys nutrūko"
#: ../js/ui/components/telepathyClient.js:1330
#: ../js/ui/components/telepathyClient.js:1331
msgid "This account is already connected to the server"
msgstr "Ši paskyra jau prijungta prie serverio"
#: ../js/ui/components/telepathyClient.js:1332
#: ../js/ui/components/telepathyClient.js:1333
msgid ""
"Connection has been replaced by a new connection using the same resource"
msgstr "Ryšys pakeistas nauju ryšiu naudojant tą patį išteklių"
#: ../js/ui/components/telepathyClient.js:1334
#: ../js/ui/components/telepathyClient.js:1335
msgid "The account already exists on the server"
msgstr "Tokia paskyra serveryje jau yra"
#: ../js/ui/components/telepathyClient.js:1336
#: ../js/ui/components/telepathyClient.js:1337
msgid "Server is currently too busy to handle the connection"
msgstr "Šiuo metu serveris per daug užimtas šiai užklausai apdoroti"
#: ../js/ui/components/telepathyClient.js:1338
#: ../js/ui/components/telepathyClient.js:1339
msgid "Certificate has been revoked"
msgstr "Liudijimas atšauktas"
#: ../js/ui/components/telepathyClient.js:1340
#: ../js/ui/components/telepathyClient.js:1341
msgid ""
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr ""
"Liudijimui naudojamas nesaugus šifravimo algoritmas arba jis kriptografiškai "
"silpnas"
#: ../js/ui/components/telepathyClient.js:1342
#: ../js/ui/components/telepathyClient.js:1343
msgid ""
"The length of the server certificate, or the depth of the server certificate "
"chain, exceed the limits imposed by the cryptography library"
@@ -997,22 +999,22 @@ msgstr ""
"Serverio liudijimo ilgis arba liudijimų eilės dydis viršija kriptografijos "
"bibliotekos apribojimus"
#: ../js/ui/components/telepathyClient.js:1344
#: ../js/ui/components/telepathyClient.js:1345
msgid "Internal error"
msgstr "Vidinė klaida"
#. translators: argument is the account name, like
#. * name@jabber.org for example.
#: ../js/ui/components/telepathyClient.js:1354
#: ../js/ui/components/telepathyClient.js:1355
#, c-format
msgid "Unable to connect to %s"
msgstr "Nepavyksta prisijungti prie %s"
#: ../js/ui/components/telepathyClient.js:1359
#: ../js/ui/components/telepathyClient.js:1360
msgid "View account"
msgstr "Rodyti paskyrą"
#: ../js/ui/components/telepathyClient.js:1398
#: ../js/ui/components/telepathyClient.js:1399
msgid "Unknown reason"
msgstr "Nežinoma priežastis"
@@ -1026,7 +1028,7 @@ msgstr "Paleisti programas"
#. Translators: this is the name of the dock/favorites area on
#. the left of the overview
#: ../js/ui/dash.js:435
#: ../js/ui/dash.js:445
msgid "Dash"
msgstr "Paleidimo sritis"
@@ -1038,14 +1040,14 @@ msgstr "Atverti kalendorių"
msgid "Open Clocks"
msgstr "Atverti laikrodžius"
#: ../js/ui/dateMenu.js:105
#: ../js/ui/dateMenu.js:104
msgid "Date & Time Settings"
msgstr "Datos ir laiko nustatymai"
#. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#.
#: ../js/ui/dateMenu.js:215
#: ../js/ui/dateMenu.js:216
msgid "%A %B %e, %Y"
msgstr "%A, %Y m. %B %d d."
@@ -1156,7 +1158,7 @@ msgstr "Įdiegti"
msgid "Download and install '%s' from extensions.gnome.org?"
msgstr "Atsiųsti ir įdiegti „%s“ iš extensions.gnome.org?"
#: ../js/ui/keyboard.js:619 ../js/ui/status/keyboard.js:314
#: ../js/ui/keyboard.js:619 ../js/ui/status/keyboard.js:333
#: ../js/ui/status/power.js:211
msgid "Keyboard"
msgstr "Klaviatūra"
@@ -1183,7 +1185,9 @@ msgstr "Rodyti klaidas"
msgid "Enabled"
msgstr "Įjungta"
#: ../js/ui/lookingGlass.js:769
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:769 ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled"
msgstr "Išjungta"
@@ -1223,19 +1227,19 @@ msgstr "Išvalyti pranešimus"
msgid "Notification Settings"
msgstr "Pranešimų nustatymai"
#: ../js/ui/messageTray.js:1709
#: ../js/ui/messageTray.js:1707
msgid "No Messages"
msgstr "Nėra pranešimų"
#: ../js/ui/messageTray.js:1782
#: ../js/ui/messageTray.js:1783
msgid "Message Tray"
msgstr "Pranešimų juosta"
#: ../js/ui/messageTray.js:2810
#: ../js/ui/messageTray.js:2822
msgid "System Information"
msgstr "Sistemos informacija"
#: ../js/ui/notificationDaemon.js:629 ../src/shell-app.c:374
#: ../js/ui/notificationDaemon.js:629 ../src/shell-app.c:392
msgctxt "program"
msgid "Unknown"
msgstr "Nežinoma"
@@ -1264,17 +1268,17 @@ msgstr "Apžvalga"
msgid "Type to search…"
msgstr "Rašykite, ko ieškote…"
#: ../js/ui/panel.js:612
#: ../js/ui/panel.js:636
msgid "Quit"
msgstr "Užverti"
#. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:636
#: ../js/ui/panel.js:687
msgid "Activities"
msgstr "Apžvalga"
#: ../js/ui/panel.js:933
#: ../js/ui/panel.js:983
msgid "Top Bar"
msgstr "Viršutinė juosta"
@@ -1283,15 +1287,15 @@ msgstr "Viršutinė juosta"
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:727
#: ../js/ui/popupMenu.js:740
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
#: ../js/ui/runDialog.js:73
#: ../js/ui/runDialog.js:74
msgid "Enter a Command"
msgstr "Įveskite komandą"
#: ../js/ui/runDialog.js:109
#: ../js/ui/runDialog.js:110
msgid "Close"
msgstr "Užverti"
@@ -1313,7 +1317,7 @@ msgstr[2] "%d naujų pranešimų"
msgid "Lock"
msgstr "Užrakinti"
#: ../js/ui/screenShield.js:637
#: ../js/ui/screenShield.js:642
msgid "GNOME needs to lock the screen"
msgstr "GNOME aplinkai reikia užrakinti ekraną"
@@ -1324,11 +1328,11 @@ msgstr "GNOME aplinkai reikia užrakinti ekraną"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: ../js/ui/screenShield.js:758 ../js/ui/screenShield.js:1194
#: ../js/ui/screenShield.js:765 ../js/ui/screenShield.js:1201
msgid "Unable to lock"
msgstr "Nepavyksta užrakinti"
#: ../js/ui/screenShield.js:759 ../js/ui/screenShield.js:1195
#: ../js/ui/screenShield.js:766 ../js/ui/screenShield.js:1202
msgid "Lock was blocked by an application"
msgstr "Programa užblokavo užrakinimą"
@@ -1340,19 +1344,19 @@ msgstr "Ieškoma…"
msgid "No results."
msgstr "Nerasta atitikmenų."
#: ../js/ui/shellEntry.js:29
#: ../js/ui/shellEntry.js:27
msgid "Copy"
msgstr "Kopijuoti"
#: ../js/ui/shellEntry.js:34
#: ../js/ui/shellEntry.js:32
msgid "Paste"
msgstr "Įdėti"
#: ../js/ui/shellEntry.js:106
#: ../js/ui/shellEntry.js:99
msgid "Show Text"
msgstr "Rodyti tekstą"
#: ../js/ui/shellEntry.js:108
#: ../js/ui/shellEntry.js:101
msgid "Hide Text"
msgstr "Slėpti tekstą"
@@ -1364,7 +1368,7 @@ msgstr "Slaptažodis"
msgid "Remember Password"
msgstr "Atsiminti slaptažodį"
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:113
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:109
msgid "Unlock"
msgstr "Atrakinti"
@@ -1533,11 +1537,12 @@ msgstr "Įveskite PIN, nurodytą įrenginyje."
msgid "OK"
msgstr "Gerai"
#: ../js/ui/status/keyboard.js:368
#: ../js/ui/status/keyboard.js:396
msgid "Show Keyboard Layout"
msgstr "Rodyti klaviatūros išdėstymą"
#: ../js/ui/status/keyboard.js:373
#: ../js/ui/status/keyboard.js:401
#| msgid "Date & Time Settings"
msgid "Region & Language Settings"
msgstr "Regiono ir kalbos nustatymai"
@@ -1655,7 +1660,7 @@ msgstr "Nepavyko prisijungti"
msgid "Activation of network connection failed"
msgstr "Tinklo ryšio nepavyko aktyvuoti"
#: ../js/ui/status/network.js:2276
#: ../js/ui/status/network.js:2282
msgid "Networking is disabled"
msgstr "Tinklas išjungtas"
@@ -1773,11 +1778,11 @@ msgstr "Garsumas"
msgid "Microphone"
msgstr "Mikrofonas"
#: ../js/ui/unlockDialog.js:124
#: ../js/ui/unlockDialog.js:120
msgid "Log in as another user"
msgstr "Prisijungti kitu naudotoju"
#: ../js/ui/unlockDialog.js:145
#: ../js/ui/unlockDialog.js:141
msgid "Unlock Window"
msgstr "Atrakinimo langas"
@@ -1885,32 +1890,56 @@ msgstr "„%s“ yra pasirengusi"
msgid "Evolution Calendar"
msgstr "Evolution kalendorius"
#: ../src/main.c:347
#. translators:
#. * The number of sound outputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1837
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
msgstr[0] "%u išvestis"
msgstr[1] "%u išvestys"
msgstr[2] "%u išvesčių"
#. translators:
#. * The number of sound inputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1847
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
msgstr[0] "%u įvestis"
msgstr[1] "%u įvestys"
msgstr[2] "%u įvesčių"
#: ../src/gvc/gvc-mixer-control.c:2373
msgid "System Sounds"
msgstr "Sistemos garsai"
#: ../src/main.c:328
msgid "Print version"
msgstr "Išvesti versijos numerį"
#: ../src/main.c:353
#: ../src/main.c:334
msgid "Mode used by GDM for login screen"
msgstr "Veiksena, naudojama GDM prisijungimo ekrane"
#: ../src/main.c:359
#: ../src/main.c:340
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "Naudoti konkrečią veikseną, pvz., „gdm“ prisijungimo ekranui"
#: ../src/main.c:365
#: ../src/main.c:346
msgid "List possible modes"
msgstr "Išvardinti galimas veiksenas"
#: ../src/shell-app.c:622
#: ../src/shell-app.c:640
#, c-format
msgid "Failed to launch '%s'"
msgstr "Nepavyko paleisti „%s“"
#: ../src/shell-keyring-prompt.c:708
#: ../src/shell-keyring-prompt.c:714
msgid "Passwords do not match."
msgstr "Slaptažodžiai nesutampa."
#: ../src/shell-keyring-prompt.c:716
#: ../src/shell-keyring-prompt.c:722
msgid "Password cannot be blank"
msgstr "Slaptažodis negali būti tuščias"
@@ -1918,17 +1947,17 @@ msgstr "Slaptažodis negali būti tuščias"
msgid "Authentication dialog was dismissed by the user"
msgstr "Naudotojas užvėrė tapatybės patvirtinimo dialogą"
#~ msgid "%u Output"
#~ msgid_plural "%u Outputs"
#~ msgstr[0] "%u išvestis"
#~ msgstr[1] "%u išvestys"
#~ msgstr[2] "%u išvesčių"
#~ msgctxt "event list time"
#~ msgid "%H%M"
#~ msgstr "%H%M"
#~ msgid "%u Input"
#~ msgid_plural "%u Inputs"
#~ msgstr[0] "%u įvestis"
#~ msgstr[1] "%u įvestys"
#~ msgstr[2] "%u įvesčių"
#~ msgctxt "event list time"
#~ msgid "%l%M%p"
#~ msgstr "%l%M"
#~ msgid "System Sounds"
#~ msgstr "Sistemos garsai"
#~ msgid "calendar:MY"
#~ msgstr "calendar:YM"
#~| msgid "Network error"
#~ msgid "Network"
#~ msgstr "Tinklas"

2487
po/oc.po Normal file

File diff suppressed because it is too large Load Diff

603
po/pa.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

532
po/ru.po

File diff suppressed because it is too large Load Diff

528
po/sl.po

File diff suppressed because it is too large Load Diff

522
po/sr.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

958
po/ta.po

File diff suppressed because it is too large Load Diff

566
po/tr.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -9,15 +9,16 @@ msgstr ""
"Project-Id-Version: gnome-shell 3.3.90\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2013-03-04 08:38+0000\n"
"PO-Revision-Date: 2013-03-06 19:06+0800\n"
"Last-Translator: Chao-Hsiung Liao <j_h_liau@yahoo.com.tw>\n"
"POT-Creation-Date: 2013-05-31 18:55+0000\n"
"PO-Revision-Date: 2013-06-04 21:50+0800\n"
"Last-Translator: Cheng-Chia Tseng <pswo10680@gmail.com>\n"
"Language-Team: Chinese (Hong Kong) <community@linuxhall.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Poedit 1.5.3\n"
"X-Generator: Poedit 1.5.4\n"
#: ../data/50-gnome-shell-screenshot.xml.in.h:1
msgid "Screenshots"
@@ -313,44 +314,50 @@ msgstr "擴充功能"
msgid "Select an extension to configure using the combobox above."
msgstr "使用上面的組合方塊選擇要設定的擴充功能。"
#: ../js/gdm/loginDialog.js:405
#| msgid "Session..."
#: ../js/gdm/loginDialog.js:371
msgid "Session…"
msgstr "作業階段…"
#. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for
#. manually entering the username.
#: ../js/gdm/loginDialog.js:629
#: ../js/gdm/loginDialog.js:601
msgid "Not listed?"
msgstr "沒有列出來?"
#: ../js/gdm/loginDialog.js:783 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:375
#: ../js/gdm/loginDialog.js:776 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:376
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:126
#: ../js/ui/userMenu.js:934
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:96
#: ../js/ui/userMenu.js:938
msgid "Cancel"
msgstr "取消"
#: ../js/gdm/loginDialog.js:799
#: ../js/gdm/loginDialog.js:791
msgctxt "button"
msgid "Sign In"
msgstr "登入"
#: ../js/gdm/loginDialog.js:799
#: ../js/gdm/loginDialog.js:791
msgid "Next"
msgstr "下一個"
#. Translators: this message is shown below the username entry field
#. to clue the user in on how to login to the local network realm
#: ../js/gdm/loginDialog.js:888
#, c-format
msgid "(e.g., user or %s)"
msgstr "(例如: user 或 %s)"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: ../js/gdm/loginDialog.js:904 ../js/ui/components/networkAgent.js:260
#: ../js/gdm/loginDialog.js:892 ../js/ui/components/networkAgent.js:260
#: ../js/ui/components/networkAgent.js:278
msgid "Username: "
msgstr "使用者名稱:"
#: ../js/gdm/loginDialog.js:1157
#: ../js/gdm/loginDialog.js:1158
msgid "Login Window"
msgstr "登入視窗"
@@ -359,8 +366,8 @@ msgstr "登入視窗"
msgid "Power"
msgstr "電源"
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:695 ../js/ui/userMenu.js:699
#: ../js/ui/userMenu.js:815
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:696 ../js/ui/userMenu.js:700
#: ../js/ui/userMenu.js:816
msgid "Suspend"
msgstr "暫停"
@@ -368,58 +375,53 @@ msgstr "暫停"
msgid "Restart"
msgstr "重新啟動"
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:697
#: ../js/ui/userMenu.js:699 ../js/ui/userMenu.js:814 ../js/ui/userMenu.js:938
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:698
#: ../js/ui/userMenu.js:700 ../js/ui/userMenu.js:815 ../js/ui/userMenu.js:942
msgid "Power Off"
msgstr "關閉電源"
#: ../js/gdm/util.js:182
#: ../js/gdm/util.js:247
msgid "Authentication error"
msgstr "驗證錯誤"
#. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead
#: ../js/gdm/util.js:299
#: ../js/gdm/util.js:364
msgid "(or swipe finger)"
msgstr "(或是滑過手指)"
#: ../js/gdm/util.js:324
#, c-format
msgid "(e.g., user or %s)"
msgstr "(例如: user 或 %s)"
#: ../js/misc/util.js:94
#: ../js/misc/util.js:97
msgid "Command not found"
msgstr "找不到指令"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: ../js/misc/util.js:127
#: ../js/misc/util.js:130
msgid "Could not parse command:"
msgstr "無法分析指令:"
#: ../js/misc/util.js:135
#: ../js/misc/util.js:138
#, c-format
msgid "Execution of '%s' failed:"
msgstr "執行「%s」失敗"
#: ../js/ui/appDisplay.js:348
#: ../js/ui/appDisplay.js:356
msgid "Frequent"
msgstr "頻率"
msgstr "常用"
#: ../js/ui/appDisplay.js:355
#: ../js/ui/appDisplay.js:363
msgid "All"
msgstr "全部"
#: ../js/ui/appDisplay.js:913
#: ../js/ui/appDisplay.js:941
msgid "New Window"
msgstr "新視窗"
#: ../js/ui/appDisplay.js:916 ../js/ui/dash.js:284
#: ../js/ui/appDisplay.js:944 ../js/ui/dash.js:284
msgid "Remove from Favorites"
msgstr "自喜好中移除"
#: ../js/ui/appDisplay.js:917
#: ../js/ui/appDisplay.js:945
msgid "Add to Favorites"
msgstr "加入喜好"
@@ -433,7 +435,7 @@ msgstr "%s 已加入你的喜好中。"
msgid "%s has been removed from your favorites."
msgstr "%s 已經從你的喜好中移除。"
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:788
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:789
msgid "Settings"
msgstr "設定值"
@@ -456,7 +458,7 @@ msgctxt "event list time"
msgid "%H\\u2236%M"
msgstr "%H\\u2236%M"
#. Transators: Shown in calendar event list, if 12h format,
#. 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:77
@@ -558,35 +560,35 @@ msgid "S"
msgstr "六"
#. Translators: Text to show if there are no events
#: ../js/ui/calendar.js:692
#: ../js/ui/calendar.js:720
msgid "Nothing Scheduled"
msgstr "沒有預訂行程"
#. Translators: Shown on calendar heading when selected day occurs on current year
#: ../js/ui/calendar.js:708
#: ../js/ui/calendar.js:736
msgctxt "calendar heading"
msgid "%A, %B %d"
msgstr "%m月%d日%A"
#. Translators: Shown on calendar heading when selected day occurs on different year
#: ../js/ui/calendar.js:711
#: ../js/ui/calendar.js:739
msgctxt "calendar heading"
msgid "%A, %B %d, %Y"
msgstr "%Y年%m月%d日%A"
#: ../js/ui/calendar.js:721
#: ../js/ui/calendar.js:749
msgid "Today"
msgstr "今天"
#: ../js/ui/calendar.js:725
#: ../js/ui/calendar.js:753
msgid "Tomorrow"
msgstr "明天"
#: ../js/ui/calendar.js:736
#: ../js/ui/calendar.js:764
msgid "This week"
msgstr "本週"
#: ../js/ui/calendar.js:744
#: ../js/ui/calendar.js:772
msgid "Next week"
msgstr "下週"
@@ -602,20 +604,20 @@ msgstr "外部裝置已拔除"
msgid "Removable Devices"
msgstr "可移除式裝置"
#: ../js/ui/components/autorunManager.js:593
#: ../js/ui/components/autorunManager.js:594
#, c-format
msgid "Open with %s"
msgstr "用 %s 開啟"
#: ../js/ui/components/autorunManager.js:619
#: ../js/ui/components/autorunManager.js:620
msgid "Eject"
msgstr "退出"
#: ../js/ui/components/keyring.js:82 ../js/ui/components/polkitAgent.js:268
#: ../js/ui/components/keyring.js:88 ../js/ui/components/polkitAgent.js:280
msgid "Password:"
msgstr "密碼: "
#: ../js/ui/components/keyring.js:101
#: ../js/ui/components/keyring.js:107
msgid "Type again:"
msgstr "再輸入一次:"
@@ -693,15 +695,15 @@ msgstr "流動寬頻網絡密碼"
msgid "A password is required to connect to '%s'."
msgstr "連線至「%s」需要密碼。"
#: ../js/ui/components/polkitAgent.js:55
#: ../js/ui/components/polkitAgent.js:54
msgid "Authentication Required"
msgstr "要求驗證"
#: ../js/ui/components/polkitAgent.js:93
#: ../js/ui/components/polkitAgent.js:92
msgid "Administrator"
msgstr "系統管理員"
#: ../js/ui/components/polkitAgent.js:165
#: ../js/ui/components/polkitAgent.js:170
msgid "Authenticate"
msgstr "驗證"
@@ -709,12 +711,12 @@ msgstr "驗證"
#. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password),
#. * for instance.
#: ../js/ui/components/polkitAgent.js:256 ../js/ui/shellMountOperation.js:383
#: ../js/ui/components/polkitAgent.js:266 ../js/ui/shellMountOperation.js:383
msgid "Sorry, that didn't work. Please try again."
msgstr "抱歉,那樣無法運作。請再試一次。"
#. Translators: this is a filename used for screencast recording
#: ../js/ui/components/recorder.js:48
#: ../js/ui/components/recorder.js:47
#, no-c-format
msgid "Screencast from %d %t"
msgstr "Screencast from %d %t"
@@ -976,14 +978,14 @@ msgstr "開啟行事曆"
msgid "Open Clocks"
msgstr "開啟時鐘"
#: ../js/ui/dateMenu.js:105
#: ../js/ui/dateMenu.js:104
msgid "Date & Time Settings"
msgstr "日期與時刻設定值"
#. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#.
#: ../js/ui/dateMenu.js:205
#: ../js/ui/dateMenu.js:216
msgid "%A %B %e, %Y"
msgstr "%Y年%m月%e日%A"
@@ -1080,7 +1082,7 @@ msgstr "安裝"
msgid "Download and install '%s' from extensions.gnome.org?"
msgstr "是否從 extensions.gnome.org 下載並安裝「%s」"
#: ../js/ui/keyboard.js:619 ../js/ui/status/keyboard.js:314
#: ../js/ui/keyboard.js:619 ../js/ui/status/keyboard.js:333
#: ../js/ui/status/power.js:211
msgid "Keyboard"
msgstr "鍵盤"
@@ -1142,7 +1144,6 @@ msgid "Remove"
msgstr "移除"
#: ../js/ui/messageTray.js:1501
#| msgid "No Messages"
msgid "Clear Messages"
msgstr "清除訊息"
@@ -1150,15 +1151,15 @@ msgstr "清除訊息"
msgid "Notification Settings"
msgstr "通知設定值"
#: ../js/ui/messageTray.js:1707
#: ../js/ui/messageTray.js:1709
msgid "No Messages"
msgstr "沒有訊息"
#: ../js/ui/messageTray.js:1787
#: ../js/ui/messageTray.js:1785
msgid "Message Tray"
msgstr "訊息匣"
#: ../js/ui/messageTray.js:2864
#: ../js/ui/messageTray.js:2818
msgid "System Information"
msgstr "系統資訊"
@@ -1167,13 +1168,13 @@ msgctxt "program"
msgid "Unknown"
msgstr "不明"
#: ../js/ui/overviewControls.js:460 ../js/ui/screenShield.js:153
#: ../js/ui/overviewControls.js:463 ../js/ui/screenShield.js:149
#, c-format
msgid "%d new message"
msgid_plural "%d new messages"
msgstr[0] "%d 個新訊息"
#: ../js/ui/overview.js:82
#: ../js/ui/overview.js:84
msgid "Undo"
msgstr "復原"
@@ -1185,22 +1186,21 @@ msgstr "概覽"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
#: ../js/ui/overview.js:284
#| msgid "Type to search..."
#: ../js/ui/overview.js:271
msgid "Type to search…"
msgstr "輸入以搜尋…"
#: ../js/ui/panel.js:613
#: ../js/ui/panel.js:635
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:642
#: ../js/ui/panel.js:686
msgid "Activities"
msgstr "概覽 "
#: ../js/ui/panel.js:983
#: ../js/ui/panel.js:982
msgid "Top Bar"
msgstr "頂端列"
@@ -1209,35 +1209,35 @@ msgstr "頂端列"
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:727
#: ../js/ui/popupMenu.js:740
msgid "toggle-switch-us"
msgstr "toggle-switch-us"
#: ../js/ui/runDialog.js:205
#: ../js/ui/runDialog.js:74
msgid "Enter a Command"
msgstr "請輸入指令"
#: ../js/ui/runDialog.js:241
#: ../js/ui/runDialog.js:110
msgid "Close"
msgstr "關閉"
#. Translators: This is a time format for a date in
#. long format
#: ../js/ui/screenShield.js:90
#: ../js/ui/screenShield.js:86
msgid "%A, %B %d"
msgstr "%m月%d日%A"
#: ../js/ui/screenShield.js:155
#: ../js/ui/screenShield.js:151
#, c-format
msgid "%d new notification"
msgid_plural "%d new notifications"
msgstr[0] "%d 個新通知"
#: ../js/ui/screenShield.js:442 ../js/ui/userMenu.js:806
#: ../js/ui/screenShield.js:438 ../js/ui/userMenu.js:807
msgid "Lock"
msgstr "鎖定"
#: ../js/ui/screenShield.js:639
#: ../js/ui/screenShield.js:641
msgid "GNOME needs to lock the screen"
msgstr "GNOME 需要鎖定螢幕"
@@ -1248,37 +1248,35 @@ msgstr "GNOME 需要鎖定螢幕"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: ../js/ui/screenShield.js:758 ../js/ui/screenShield.js:1169
#| msgid "Unable to connect to %s"
#: ../js/ui/screenShield.js:762 ../js/ui/screenShield.js:1198
msgid "Unable to lock"
msgstr "無法鎖定"
#: ../js/ui/screenShield.js:759 ../js/ui/screenShield.js:1170
#: ../js/ui/screenShield.js:763 ../js/ui/screenShield.js:1199
msgid "Lock was blocked by an application"
msgstr "鎖定被應用程式阻擋"
#: ../js/ui/searchDisplay.js:431
#| msgid "Searching..."
#: ../js/ui/searchDisplay.js:453
msgid "Searching…"
msgstr "搜尋…"
#: ../js/ui/searchDisplay.js:475
#: ../js/ui/searchDisplay.js:497
msgid "No results."
msgstr "沒有結果。"
#: ../js/ui/shellEntry.js:29
#: ../js/ui/shellEntry.js:27
msgid "Copy"
msgstr "複製"
#: ../js/ui/shellEntry.js:34
#: ../js/ui/shellEntry.js:32
msgid "Paste"
msgstr "貼上"
#: ../js/ui/shellEntry.js:105
#: ../js/ui/shellEntry.js:99
msgid "Show Text"
msgstr "顯示文字"
#: ../js/ui/shellEntry.js:107
#: ../js/ui/shellEntry.js:101
msgid "Hide Text"
msgstr "隱藏文字"
@@ -1290,7 +1288,7 @@ msgstr "密碼"
msgid "Remember Password"
msgstr "記住密碼"
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:140
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:109
msgid "Unlock"
msgstr "解鎖"
@@ -1354,12 +1352,10 @@ msgid "Visibility"
msgstr "顯示狀態"
#: ../js/ui/status/bluetooth.js:59
#| msgid "Send Files to Device..."
msgid "Send Files to Device…"
msgstr "傳送檔案到裝置…"
#: ../js/ui/status/bluetooth.js:60
#| msgid "Set Up a New Device..."
msgid "Set Up a New Device…"
msgstr "設定新的裝置…"
@@ -1386,7 +1382,6 @@ msgid "connecting..."
msgstr "連線中…"
#: ../js/ui/status/bluetooth.js:239
#| msgid "Send Files..."
msgid "Send Files…"
msgstr "傳送檔案…"
@@ -1462,11 +1457,11 @@ msgstr "請輸入裝置所提及的 PIN。"
msgid "OK"
msgstr "確定"
#: ../js/ui/status/keyboard.js:368
#: ../js/ui/status/keyboard.js:396
msgid "Show Keyboard Layout"
msgstr "顯示鍵盤配置"
#: ../js/ui/status/keyboard.js:373
#: ../js/ui/status/keyboard.js:401
msgid "Region & Language Settings"
msgstr "地區和語言設定值"
@@ -1584,7 +1579,7 @@ msgstr "連線失敗"
msgid "Activation of network connection failed"
msgstr "啟動網絡連線失敗"
#: ../js/ui/status/network.js:2276
#: ../js/ui/status/network.js:2282
msgid "Networking is disabled"
msgstr "網絡已停用"
@@ -1599,7 +1594,6 @@ msgstr "電源設定值"
#. 0 is reported when UPower does not have enough data
#. to estimate battery life
#: ../js/ui/status/power.js:99
#| msgid "Estimating..."
msgid "Estimating…"
msgstr "評估中…"
@@ -1695,11 +1689,11 @@ msgstr "音量"
msgid "Microphone"
msgstr "麥克風"
#: ../js/ui/unlockDialog.js:151
#: ../js/ui/unlockDialog.js:120
msgid "Log in as another user"
msgstr "以另一個使用者身分登入"
#: ../js/ui/unlockDialog.js:177
#: ../js/ui/unlockDialog.js:141
msgid "Unlock Window"
msgstr "解鎖視窗"
@@ -1727,46 +1721,48 @@ msgstr "閒置"
msgid "Offline"
msgstr "離線"
#: ../js/ui/userMenu.js:780
#: ../js/ui/userMenu.js:781
msgid "Notifications"
msgstr "通知"
#: ../js/ui/userMenu.js:796
#: ../js/ui/userMenu.js:797
msgid "Switch User"
msgstr "切換使用者"
#: ../js/ui/userMenu.js:801
#: ../js/ui/userMenu.js:802
msgid "Log Out"
msgstr "登出"
#: ../js/ui/userMenu.js:821
#: ../js/ui/userMenu.js:822
msgid "Install Updates & Restart"
msgstr "安裝更新 & 重新啟動"
#: ../js/ui/userMenu.js:839
#: ../js/ui/userMenu.js:840
msgid "Your chat status will be set to busy"
msgstr "你的聊天狀態會設為忙碌"
#: ../js/ui/userMenu.js:840
#: ../js/ui/userMenu.js:841
msgid ""
"Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages."
msgstr "通知現在已被停用,包含聊天訊息。你的上線狀態也調整為讓其他人知道你沒時間看他們的訊息。"
#: ../js/ui/userMenu.js:886
#: ../js/ui/userMenu.js:888
msgid "Other users are logged in."
msgstr "其他使用者已登入。"
#: ../js/ui/userMenu.js:891
#: ../js/ui/userMenu.js:893
msgid "Shutting down might cause them to lose unsaved work."
msgstr "關機可能使它們失去未儲存的工作。"
#: ../js/ui/userMenu.js:918
#. Translators: Remote here refers to a remote session, like a ssh login
#: ../js/ui/userMenu.js:921
#, c-format
msgid "%s (remote)"
msgstr "%s (遠端)"
#: ../js/ui/userMenu.js:920
#. Translators: Console here refers to a tty like a VT console
#: ../js/ui/userMenu.js:924
#, c-format
msgid "%s (console)"
msgstr "%s (主控臺)"
@@ -1779,7 +1775,7 @@ msgstr "應用程式"
msgid "Search"
msgstr "搜尋"
#: ../js/ui/wanda.js:92
#: ../js/ui/wanda.js:77
#, c-format
msgid ""
"Sorry, no wisdom for you today:\n"
@@ -1788,7 +1784,7 @@ msgstr ""
"抱歉,今天可能有些問題:\n"
"%s"
#: ../js/ui/wanda.js:96
#: ../js/ui/wanda.js:81
#, c-format
msgid "%s the Oracle says"
msgstr "%s Oracle 說:"
@@ -1818,7 +1814,7 @@ msgid "%u Input"
msgid_plural "%u Inputs"
msgstr[0] "%u 輸入"
#: ../src/gvc/gvc-mixer-control.c:2371
#: ../src/gvc/gvc-mixer-control.c:2373
msgid "System Sounds"
msgstr "系統音效"
@@ -1843,11 +1839,11 @@ msgstr "列出可能的模式"
msgid "Failed to launch '%s'"
msgstr "無法啟動「%s」"
#: ../src/shell-keyring-prompt.c:708
#: ../src/shell-keyring-prompt.c:714
msgid "Passwords do not match."
msgstr "密碼不相符。"
#: ../src/shell-keyring-prompt.c:716
#: ../src/shell-keyring-prompt.c:722
msgid "Password cannot be blank"
msgstr "密碼不能為空白"

View File

@@ -9,15 +9,16 @@ msgstr ""
"Project-Id-Version: gnome-shell 3.3.90\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2013-03-04 08:38+0000\n"
"PO-Revision-Date: 2013-03-05 19:49+0800\n"
"Last-Translator: Chao-Hsiung Liao <j_h_liau@yahoo.com.tw>\n"
"POT-Creation-Date: 2013-05-31 18:55+0000\n"
"PO-Revision-Date: 2013-04-27 00:04+0800\n"
"Last-Translator: Cheng-Chia Tseng <pswo10680@gmail.com>\n"
"Language-Team: Chinese (Taiwan) <zh-l10n@lists.linux.org.tw>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Poedit 1.5.3\n"
"X-Generator: Poedit 1.5.4\n"
#: ../data/50-gnome-shell-screenshot.xml.in.h:1
msgid "Screenshots"
@@ -343,44 +344,50 @@ msgstr "擴充功能"
msgid "Select an extension to configure using the combobox above."
msgstr "使用上面的組合方塊選擇要設定的擴充功能。"
#: ../js/gdm/loginDialog.js:405
#| msgid "Session..."
#: ../js/gdm/loginDialog.js:371
msgid "Session…"
msgstr "作業階段…"
#. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for
#. manually entering the username.
#: ../js/gdm/loginDialog.js:629
#: ../js/gdm/loginDialog.js:601
msgid "Not listed?"
msgstr "沒有列出來?"
#: ../js/gdm/loginDialog.js:783 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:375
#: ../js/gdm/loginDialog.js:776 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:376
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:126
#: ../js/ui/userMenu.js:934
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:96
#: ../js/ui/userMenu.js:938
msgid "Cancel"
msgstr "取消"
#: ../js/gdm/loginDialog.js:799
#: ../js/gdm/loginDialog.js:791
msgctxt "button"
msgid "Sign In"
msgstr "登入"
#: ../js/gdm/loginDialog.js:799
#: ../js/gdm/loginDialog.js:791
msgid "Next"
msgstr "下一個"
#. Translators: this message is shown below the username entry field
#. to clue the user in on how to login to the local network realm
#: ../js/gdm/loginDialog.js:888
#, c-format
msgid "(e.g., user or %s)"
msgstr "(例如: user 或 %s)"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: ../js/gdm/loginDialog.js:904 ../js/ui/components/networkAgent.js:260
#: ../js/gdm/loginDialog.js:892 ../js/ui/components/networkAgent.js:260
#: ../js/ui/components/networkAgent.js:278
msgid "Username: "
msgstr "使用者名稱:"
#: ../js/gdm/loginDialog.js:1157
#: ../js/gdm/loginDialog.js:1158
msgid "Login Window"
msgstr "登入視窗"
@@ -389,8 +396,8 @@ msgstr "登入視窗"
msgid "Power"
msgstr "電源"
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:695 ../js/ui/userMenu.js:699
#: ../js/ui/userMenu.js:815
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:696 ../js/ui/userMenu.js:700
#: ../js/ui/userMenu.js:816
msgid "Suspend"
msgstr "暫停"
@@ -398,58 +405,53 @@ msgstr "暫停"
msgid "Restart"
msgstr "重新啟動"
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:697
#: ../js/ui/userMenu.js:699 ../js/ui/userMenu.js:814 ../js/ui/userMenu.js:938
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:698
#: ../js/ui/userMenu.js:700 ../js/ui/userMenu.js:815 ../js/ui/userMenu.js:942
msgid "Power Off"
msgstr "關閉電源"
#: ../js/gdm/util.js:182
#: ../js/gdm/util.js:247
msgid "Authentication error"
msgstr "驗證錯誤"
#. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead
#: ../js/gdm/util.js:299
#: ../js/gdm/util.js:364
msgid "(or swipe finger)"
msgstr "(或是滑過手指)"
#: ../js/gdm/util.js:324
#, c-format
msgid "(e.g., user or %s)"
msgstr "(例如: user 或 %s)"
#: ../js/misc/util.js:94
#: ../js/misc/util.js:97
msgid "Command not found"
msgstr "找不到指令"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: ../js/misc/util.js:127
#: ../js/misc/util.js:130
msgid "Could not parse command:"
msgstr "無法分析指令:"
#: ../js/misc/util.js:135
#: ../js/misc/util.js:138
#, c-format
msgid "Execution of '%s' failed:"
msgstr "執行「%s」失敗"
#: ../js/ui/appDisplay.js:348
#: ../js/ui/appDisplay.js:356
msgid "Frequent"
msgstr "頻率"
msgstr "常用"
#: ../js/ui/appDisplay.js:355
#: ../js/ui/appDisplay.js:363
msgid "All"
msgstr "全部"
#: ../js/ui/appDisplay.js:913
#: ../js/ui/appDisplay.js:941
msgid "New Window"
msgstr "新視窗"
#: ../js/ui/appDisplay.js:916 ../js/ui/dash.js:284
#: ../js/ui/appDisplay.js:944 ../js/ui/dash.js:284
msgid "Remove from Favorites"
msgstr "自喜好中移除"
#: ../js/ui/appDisplay.js:917
#: ../js/ui/appDisplay.js:945
msgid "Add to Favorites"
msgstr "加入喜好"
@@ -463,7 +465,7 @@ msgstr "%s 已加入您的喜好中。"
msgid "%s has been removed from your favorites."
msgstr "%s 已經從您的喜好中移除。"
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:788
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:789
msgid "Settings"
msgstr "設定值"
@@ -486,7 +488,7 @@ msgctxt "event list time"
msgid "%H\\u2236%M"
msgstr "%H\\u2236%M"
#. Transators: Shown in calendar event list, if 12h format,
#. 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:77
@@ -588,35 +590,35 @@ msgid "S"
msgstr "六"
#. Translators: Text to show if there are no events
#: ../js/ui/calendar.js:692
#: ../js/ui/calendar.js:720
msgid "Nothing Scheduled"
msgstr "沒有預訂行程"
#. Translators: Shown on calendar heading when selected day occurs on current year
#: ../js/ui/calendar.js:708
#: ../js/ui/calendar.js:736
msgctxt "calendar heading"
msgid "%A, %B %d"
msgstr "%m月%d日%A"
#. Translators: Shown on calendar heading when selected day occurs on different year
#: ../js/ui/calendar.js:711
#: ../js/ui/calendar.js:739
msgctxt "calendar heading"
msgid "%A, %B %d, %Y"
msgstr "%Y年%m月%d日%A"
#: ../js/ui/calendar.js:721
#: ../js/ui/calendar.js:749
msgid "Today"
msgstr "今天"
#: ../js/ui/calendar.js:725
#: ../js/ui/calendar.js:753
msgid "Tomorrow"
msgstr "明天"
#: ../js/ui/calendar.js:736
#: ../js/ui/calendar.js:764
msgid "This week"
msgstr "本週"
#: ../js/ui/calendar.js:744
#: ../js/ui/calendar.js:772
msgid "Next week"
msgstr "下週"
@@ -632,20 +634,20 @@ msgstr "外部裝置已拔除"
msgid "Removable Devices"
msgstr "可移除式裝置"
#: ../js/ui/components/autorunManager.js:593
#: ../js/ui/components/autorunManager.js:594
#, c-format
msgid "Open with %s"
msgstr "用 %s 開啟"
#: ../js/ui/components/autorunManager.js:619
#: ../js/ui/components/autorunManager.js:620
msgid "Eject"
msgstr "退出"
#: ../js/ui/components/keyring.js:82 ../js/ui/components/polkitAgent.js:268
#: ../js/ui/components/keyring.js:88 ../js/ui/components/polkitAgent.js:280
msgid "Password:"
msgstr "密碼: "
#: ../js/ui/components/keyring.js:101
#: ../js/ui/components/keyring.js:107
msgid "Type again:"
msgstr "再輸入一次:"
@@ -723,15 +725,15 @@ msgstr "行動寬頻網路密碼"
msgid "A password is required to connect to '%s'."
msgstr "連線至「%s」需要密碼。"
#: ../js/ui/components/polkitAgent.js:55
#: ../js/ui/components/polkitAgent.js:54
msgid "Authentication Required"
msgstr "要求驗證"
#: ../js/ui/components/polkitAgent.js:93
#: ../js/ui/components/polkitAgent.js:92
msgid "Administrator"
msgstr "系統管理員"
#: ../js/ui/components/polkitAgent.js:165
#: ../js/ui/components/polkitAgent.js:170
msgid "Authenticate"
msgstr "驗證"
@@ -739,12 +741,12 @@ msgstr "驗證"
#. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password),
#. * for instance.
#: ../js/ui/components/polkitAgent.js:256 ../js/ui/shellMountOperation.js:383
#: ../js/ui/components/polkitAgent.js:266 ../js/ui/shellMountOperation.js:383
msgid "Sorry, that didn't work. Please try again."
msgstr "抱歉,那樣無法運作。請再試一次。"
#. Translators: this is a filename used for screencast recording
#: ../js/ui/components/recorder.js:48
#: ../js/ui/components/recorder.js:47
#, no-c-format
msgid "Screencast from %d %t"
msgstr "Screencast from %d %t"
@@ -1006,14 +1008,14 @@ msgstr "開啟行事曆"
msgid "Open Clocks"
msgstr "開啟時鐘"
#: ../js/ui/dateMenu.js:105
#: ../js/ui/dateMenu.js:104
msgid "Date & Time Settings"
msgstr "日期與時刻設定值"
#. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#.
#: ../js/ui/dateMenu.js:205
#: ../js/ui/dateMenu.js:216
msgid "%A %B %e, %Y"
msgstr "%Y年%m月%e日%A"
@@ -1110,7 +1112,7 @@ msgstr "安裝"
msgid "Download and install '%s' from extensions.gnome.org?"
msgstr "是否從 extensions.gnome.org 下載並安裝「%s」"
#: ../js/ui/keyboard.js:619 ../js/ui/status/keyboard.js:314
#: ../js/ui/keyboard.js:619 ../js/ui/status/keyboard.js:333
#: ../js/ui/status/power.js:211
msgid "Keyboard"
msgstr "鍵盤"
@@ -1172,7 +1174,6 @@ msgid "Remove"
msgstr "移除"
#: ../js/ui/messageTray.js:1501
#| msgid "No Messages"
msgid "Clear Messages"
msgstr "清除訊息"
@@ -1180,15 +1181,15 @@ msgstr "清除訊息"
msgid "Notification Settings"
msgstr "通知設定值"
#: ../js/ui/messageTray.js:1707
#: ../js/ui/messageTray.js:1709
msgid "No Messages"
msgstr "沒有訊息"
#: ../js/ui/messageTray.js:1787
#: ../js/ui/messageTray.js:1785
msgid "Message Tray"
msgstr "訊息匣"
#: ../js/ui/messageTray.js:2864
#: ../js/ui/messageTray.js:2818
msgid "System Information"
msgstr "系統資訊"
@@ -1197,13 +1198,13 @@ msgctxt "program"
msgid "Unknown"
msgstr "不明"
#: ../js/ui/overviewControls.js:460 ../js/ui/screenShield.js:153
#: ../js/ui/overviewControls.js:463 ../js/ui/screenShield.js:149
#, c-format
msgid "%d new message"
msgid_plural "%d new messages"
msgstr[0] "%d 個新訊息"
#: ../js/ui/overview.js:82
#: ../js/ui/overview.js:84
msgid "Undo"
msgstr "復原"
@@ -1215,22 +1216,21 @@ msgstr "概覽"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
#: ../js/ui/overview.js:284
#| msgid "Type to search..."
#: ../js/ui/overview.js:271
msgid "Type to search…"
msgstr "輸入以搜尋…"
#: ../js/ui/panel.js:613
#: ../js/ui/panel.js:635
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:642
#: ../js/ui/panel.js:686
msgid "Activities"
msgstr "概覽 "
#: ../js/ui/panel.js:983
#: ../js/ui/panel.js:982
msgid "Top Bar"
msgstr "頂端列"
@@ -1239,35 +1239,35 @@ msgstr "頂端列"
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:727
#: ../js/ui/popupMenu.js:740
msgid "toggle-switch-us"
msgstr "toggle-switch-us"
#: ../js/ui/runDialog.js:205
#: ../js/ui/runDialog.js:74
msgid "Enter a Command"
msgstr "請輸入指令"
#: ../js/ui/runDialog.js:241
#: ../js/ui/runDialog.js:110
msgid "Close"
msgstr "關閉"
#. Translators: This is a time format for a date in
#. long format
#: ../js/ui/screenShield.js:90
#: ../js/ui/screenShield.js:86
msgid "%A, %B %d"
msgstr "%m月%d日%A"
#: ../js/ui/screenShield.js:155
#: ../js/ui/screenShield.js:151
#, c-format
msgid "%d new notification"
msgid_plural "%d new notifications"
msgstr[0] "%d 個新通知"
#: ../js/ui/screenShield.js:442 ../js/ui/userMenu.js:806
#: ../js/ui/screenShield.js:438 ../js/ui/userMenu.js:807
msgid "Lock"
msgstr "鎖定"
#: ../js/ui/screenShield.js:639
#: ../js/ui/screenShield.js:641
msgid "GNOME needs to lock the screen"
msgstr "GNOME 需要鎖定螢幕"
@@ -1278,37 +1278,35 @@ msgstr "GNOME 需要鎖定螢幕"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: ../js/ui/screenShield.js:758 ../js/ui/screenShield.js:1169
#| msgid "Unable to connect to %s"
#: ../js/ui/screenShield.js:762 ../js/ui/screenShield.js:1198
msgid "Unable to lock"
msgstr "無法鎖定"
#: ../js/ui/screenShield.js:759 ../js/ui/screenShield.js:1170
#: ../js/ui/screenShield.js:763 ../js/ui/screenShield.js:1199
msgid "Lock was blocked by an application"
msgstr "鎖定被應用程式阻擋"
#: ../js/ui/searchDisplay.js:431
#| msgid "Searching..."
#: ../js/ui/searchDisplay.js:453
msgid "Searching…"
msgstr "搜尋…"
#: ../js/ui/searchDisplay.js:475
#: ../js/ui/searchDisplay.js:497
msgid "No results."
msgstr "沒有結果。"
#: ../js/ui/shellEntry.js:29
#: ../js/ui/shellEntry.js:27
msgid "Copy"
msgstr "複製"
#: ../js/ui/shellEntry.js:34
#: ../js/ui/shellEntry.js:32
msgid "Paste"
msgstr "貼上"
#: ../js/ui/shellEntry.js:105
#: ../js/ui/shellEntry.js:99
msgid "Show Text"
msgstr "顯示文字"
#: ../js/ui/shellEntry.js:107
#: ../js/ui/shellEntry.js:101
msgid "Hide Text"
msgstr "隱藏文字"
@@ -1320,7 +1318,7 @@ msgstr "密碼"
msgid "Remember Password"
msgstr "記住密碼"
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:140
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:109
msgid "Unlock"
msgstr "解鎖"
@@ -1384,12 +1382,10 @@ msgid "Visibility"
msgstr "顯示狀態"
#: ../js/ui/status/bluetooth.js:59
#| msgid "Send Files to Device..."
msgid "Send Files to Device…"
msgstr "傳送檔案到裝置…"
#: ../js/ui/status/bluetooth.js:60
#| msgid "Set Up a New Device..."
msgid "Set Up a New Device…"
msgstr "設定新的裝置…"
@@ -1416,7 +1412,6 @@ msgid "connecting..."
msgstr "連線中…"
#: ../js/ui/status/bluetooth.js:239
#| msgid "Send Files..."
msgid "Send Files…"
msgstr "傳送檔案…"
@@ -1492,11 +1487,11 @@ msgstr "請輸入裝置所提及的 PIN。"
msgid "OK"
msgstr "確定"
#: ../js/ui/status/keyboard.js:368
#: ../js/ui/status/keyboard.js:396
msgid "Show Keyboard Layout"
msgstr "顯示鍵盤配置"
#: ../js/ui/status/keyboard.js:373
#: ../js/ui/status/keyboard.js:401
msgid "Region & Language Settings"
msgstr "地區和語言設定值"
@@ -1614,7 +1609,7 @@ msgstr "連線失敗"
msgid "Activation of network connection failed"
msgstr "啟動網路連線失敗"
#: ../js/ui/status/network.js:2276
#: ../js/ui/status/network.js:2282
msgid "Networking is disabled"
msgstr "網路已停用"
@@ -1629,7 +1624,6 @@ msgstr "電源設定值"
#. 0 is reported when UPower does not have enough data
#. to estimate battery life
#: ../js/ui/status/power.js:99
#| msgid "Estimating..."
msgid "Estimating…"
msgstr "評估中…"
@@ -1725,11 +1719,11 @@ msgstr "音量"
msgid "Microphone"
msgstr "麥克風"
#: ../js/ui/unlockDialog.js:151
#: ../js/ui/unlockDialog.js:120
msgid "Log in as another user"
msgstr "以另一個使用者身分登入"
#: ../js/ui/unlockDialog.js:177
#: ../js/ui/unlockDialog.js:141
msgid "Unlock Window"
msgstr "解鎖視窗"
@@ -1757,27 +1751,27 @@ msgstr "閒置"
msgid "Offline"
msgstr "離線"
#: ../js/ui/userMenu.js:780
#: ../js/ui/userMenu.js:781
msgid "Notifications"
msgstr "通知"
#: ../js/ui/userMenu.js:796
#: ../js/ui/userMenu.js:797
msgid "Switch User"
msgstr "切換使用者"
#: ../js/ui/userMenu.js:801
#: ../js/ui/userMenu.js:802
msgid "Log Out"
msgstr "登出"
#: ../js/ui/userMenu.js:821
#: ../js/ui/userMenu.js:822
msgid "Install Updates & Restart"
msgstr "安裝更新 & 重新啟動"
#: ../js/ui/userMenu.js:839
#: ../js/ui/userMenu.js:840
msgid "Your chat status will be set to busy"
msgstr "您的聊天狀態會設為忙碌"
#: ../js/ui/userMenu.js:840
#: ../js/ui/userMenu.js:841
msgid ""
"Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages."
@@ -1785,20 +1779,22 @@ msgstr ""
"通知現在已被停用,包含聊天訊息。您的上線狀態也調整為讓其他人知道您沒時間看他"
"們的訊息。"
#: ../js/ui/userMenu.js:886
#: ../js/ui/userMenu.js:888
msgid "Other users are logged in."
msgstr "其他使用者已登入。"
#: ../js/ui/userMenu.js:891
#: ../js/ui/userMenu.js:893
msgid "Shutting down might cause them to lose unsaved work."
msgstr "關機可能使它們失去未儲存的工作。"
#: ../js/ui/userMenu.js:918
#. Translators: Remote here refers to a remote session, like a ssh login
#: ../js/ui/userMenu.js:921
#, c-format
msgid "%s (remote)"
msgstr "%s (遠端)"
#: ../js/ui/userMenu.js:920
#. Translators: Console here refers to a tty like a VT console
#: ../js/ui/userMenu.js:924
#, c-format
msgid "%s (console)"
msgstr "%s (主控臺)"
@@ -1811,7 +1807,7 @@ msgstr "應用程式"
msgid "Search"
msgstr "搜尋"
#: ../js/ui/wanda.js:92
#: ../js/ui/wanda.js:77
#, c-format
msgid ""
"Sorry, no wisdom for you today:\n"
@@ -1820,7 +1816,7 @@ msgstr ""
"抱歉,今天可能有些問題:\n"
"%s"
#: ../js/ui/wanda.js:96
#: ../js/ui/wanda.js:81
#, c-format
msgid "%s the Oracle says"
msgstr "%s Oracle 說:"
@@ -1850,7 +1846,7 @@ msgid "%u Input"
msgid_plural "%u Inputs"
msgstr[0] "%u 輸入"
#: ../src/gvc/gvc-mixer-control.c:2371
#: ../src/gvc/gvc-mixer-control.c:2373
msgid "System Sounds"
msgstr "系統音效"
@@ -1875,11 +1871,11 @@ msgstr "列出可能的模式"
msgid "Failed to launch '%s'"
msgstr "無法啟動「%s」"
#: ../src/shell-keyring-prompt.c:708
#: ../src/shell-keyring-prompt.c:714
msgid "Passwords do not match."
msgstr "密碼不相符。"
#: ../src/shell-keyring-prompt.c:716
#: ../src/shell-keyring-prompt.c:722
msgid "Password cannot be blank"
msgstr "密碼不能為空白"

Submodule src/gvc updated: 03894efbcd...3d6aac673b

View File

@@ -36,8 +36,6 @@ extern GType gnome_shell_plugin_get_type (void);
#define SHELL_DBUS_SERVICE "org.gnome.Shell"
#define MAGNIFIER_DBUS_SERVICE "org.gnome.Magnifier"
#define OVERRIDES_SCHEMA "org.gnome.shell.overrides"
#define WM_NAME "GNOME Shell"
#define GNOME_WM_KEYBINDINGS "Mutter,GNOME Shell"
@@ -166,23 +164,6 @@ shell_dbus_init (gboolean replace)
g_object_unref (session);
}
static void
shell_prefs_init (void)
{
meta_prefs_override_preference_schema ("attach-modal-dialogs",
OVERRIDES_SCHEMA);
meta_prefs_override_preference_schema ("dynamic-workspaces",
OVERRIDES_SCHEMA);
meta_prefs_override_preference_schema ("workspaces-only-on-primary",
OVERRIDES_SCHEMA);
meta_prefs_override_preference_schema ("button-layout",
OVERRIDES_SCHEMA);
meta_prefs_override_preference_schema ("edge-tiling",
OVERRIDES_SCHEMA);
meta_prefs_override_preference_schema ("focus-change-on-pointer-rest",
OVERRIDES_SCHEMA);
}
static void
shell_introspection_init (void)
{
@@ -409,7 +390,6 @@ main (int argc, char **argv)
shell_dbus_init (meta_get_replace_current_wm ());
shell_a11y_init ();
shell_perf_log_init ();
shell_prefs_init ();
shell_introspection_init ();
shell_fonts_init ();

View File

@@ -210,6 +210,7 @@ shell_app_create_icon_texture (ShellApp *app,
typedef struct {
ShellApp *app;
int size;
ClutterTextDirection direction;
} CreateFadedIconData;
static CoglHandle
@@ -227,7 +228,7 @@ shell_app_create_faded_icon_cpu (StTextureCache *cache,
guint8 n_channels;
gboolean have_alpha;
gint fade_start;
gint fade_range;
gint fade_end;
guint i, j;
guint pixbuf_byte_size;
guint8 *orig_pixels;
@@ -279,14 +280,26 @@ shell_app_create_faded_icon_cpu (StTextureCache *cache,
pixels = g_malloc0 (rowstride * height);
memcpy (pixels, orig_pixels, pixbuf_byte_size);
fade_start = width / 2;
fade_range = width - fade_start;
for (i = fade_start; i < width; i++)
/* fade on the right side for LTR, left side for RTL */
if (data->direction == CLUTTER_TEXT_DIRECTION_LTR)
{
fade_start = width / 2;
fade_end = width;
}
else
{
fade_start = 0;
fade_end = width / 2;
}
for (i = fade_start; i < fade_end; i++)
{
for (j = 0; j < height; j++)
{
guchar *pixel = &pixels[j * rowstride + i * n_channels];
float fade = 1.0 - ((float) i - fade_start) / fade_range;
float fade = ((float) i - fade_start) / (fade_end - fade_start);
if (data->direction == CLUTTER_TEXT_DIRECTION_LTR)
fade = 1.0 - fade;
pixel[0] = 0.5 + pixel[0] * fade;
pixel[1] = 0.5 + pixel[1] * fade;
pixel[2] = 0.5 + pixel[2] * fade;
@@ -312,13 +325,14 @@ shell_app_create_faded_icon_cpu (StTextureCache *cache,
* shell_app_get_faded_icon:
* @app: A #ShellApp
* @size: Size in pixels
* @direction: Whether to fade on the left or right
*
* Return an actor with a horizontally faded look.
*
* Return value: (transfer none): A floating #ClutterActor, or %NULL if no icon
*/
ClutterActor *
shell_app_get_faded_icon (ShellApp *app, int size)
shell_app_get_faded_icon (ShellApp *app, int size, ClutterTextDirection direction)
{
CoglHandle texture;
ClutterActor *result;
@@ -334,9 +348,13 @@ shell_app_get_faded_icon (ShellApp *app, int size)
/* Use icon: prefix so that we get evicted from the cache on
* icon theme changes. */
cache_key = g_strdup_printf ("icon:%s,size=%d,faded", shell_app_get_id (app), size);
cache_key = g_strdup_printf ("icon:%s,size=%d,faded-%s",
shell_app_get_id (app),
size,
direction == CLUTTER_TEXT_DIRECTION_RTL ? "rtl" : "ltr");
data.app = app;
data.size = size;
data.direction = direction;
texture = st_texture_cache_load (st_texture_cache_get_default (),
cache_key,
ST_TEXTURE_CACHE_POLICY_FOREVER,

View File

@@ -42,7 +42,7 @@ GMenuTreeEntry *shell_app_get_tree_entry (ShellApp *app);
GDesktopAppInfo *shell_app_get_app_info (ShellApp *app);
ClutterActor *shell_app_create_icon_texture (ShellApp *app, int size);
ClutterActor *shell_app_get_faded_icon (ShellApp *app, int size);
ClutterActor *shell_app_get_faded_icon (ShellApp *app, int size, ClutterTextDirection direction);
const char *shell_app_get_name (ShellApp *app);
const char *shell_app_get_description (ShellApp *app);
gboolean shell_app_is_window_backed (ShellApp *app);

View File

@@ -1009,6 +1009,13 @@ shell_global_end_modal (ShellGlobal *global,
meta_plugin_end_modal (global->plugin, timestamp);
}
void
shell_global_freeze_keyboard (ShellGlobal *global,
guint32 timestamp)
{
meta_display_freeze_keyboard (global->meta_display, global->stage_xwindow, timestamp);
}
/* Code to close all file descriptors before we exec; copied from gspawn.c in GLib.
*
* Authors: Padraig O'Briain, Matthias Clasen, Lennart Poettering

View File

@@ -44,6 +44,8 @@ gboolean shell_global_begin_modal (ShellGlobal *global,
MetaModalOptions options);
void shell_global_end_modal (ShellGlobal *global,
guint32 timestamp);
void shell_global_freeze_keyboard (ShellGlobal *global,
guint32 timestamp);
typedef enum {
SHELL_STAGE_INPUT_MODE_NONREACTIVE,

View File

@@ -106,6 +106,8 @@ shell_gtk_embed_window_created_cb (MetaDisplay *display,
0, 0 /* offset x/y */);
cairo_region_destroy (empty_region);
gdk_window_lower (gdk_window);
/* Now that we've found the window we don't need to listen for
new windows anymore */
g_signal_handler_disconnect (display,

View File

@@ -25,6 +25,9 @@
/* This is also hard-coded in mutter and GDK */
#define VIRTUAL_CORE_POINTER_ID 2
#define A11Y_APPS_SCHEMA "org.gnome.desktop.a11y.applications"
#define MAGNIFIER_ACTIVE_KEY "screen-magnifier-enabled"
typedef enum {
RECORDER_STATE_CLOSED,
RECORDER_STATE_RECORDING
@@ -68,6 +71,7 @@ struct _ShellRecorder {
CoglHandle recording_icon; /* icon shown while playing */
GSettings *a11y_settings;
gboolean draw_cursor;
cairo_surface_t *cursor_image;
int cursor_hot_x;
@@ -277,6 +281,8 @@ shell_recorder_init (ShellRecorder *recorder)
recorder->recording_icon = create_recording_icon ();
recorder->memory_target = get_memory_target();
recorder->a11y_settings = g_settings_new (A11Y_APPS_SCHEMA);
recorder->state = RECORDER_STATE_CLOSED;
recorder->framerate = DEFAULT_FRAMES_PER_SECOND;
recorder->draw_cursor = TRUE;
@@ -299,6 +305,8 @@ shell_recorder_finalize (GObject *object)
cogl_handle_unref (recorder->recording_icon);
g_clear_object (&recorder->a11y_settings);
G_OBJECT_CLASS (shell_recorder_parent_class)->finalize (object);
}
@@ -477,7 +485,7 @@ recorder_draw_buffer_meter (ShellRecorder *recorder)
GdkRectangle primary_monitor;
float rects[16];
gdk_screen_get_monitor_geometry (recorder->gdk_screen,
gdk_screen_get_monitor_workarea (recorder->gdk_screen,
gdk_screen_get_primary_monitor (recorder->gdk_screen),
&primary_monitor);
@@ -580,7 +588,8 @@ recorder_record_frame (ShellRecorder *recorder)
GST_BUFFER_PTS(buffer) = now - recorder->start_time;
if (recorder->draw_cursor)
if (recorder->draw_cursor &&
!g_settings_get_boolean (recorder->a11y_settings, MAGNIFIER_ACTIVE_KEY))
recorder_draw_cursor (recorder, buffer);
shell_recorder_src_add_buffer (SHELL_RECORDER_SRC (recorder->current_pipeline->src), buffer);
@@ -602,7 +611,7 @@ recorder_on_stage_paint (ClutterActor *actor,
{
GdkRectangle primary_monitor;
gdk_screen_get_monitor_geometry (recorder->gdk_screen,
gdk_screen_get_monitor_workarea (recorder->gdk_screen,
gdk_screen_get_primary_monitor (recorder->gdk_screen),
&primary_monitor);
if (!recorder->only_paint)

View File

@@ -15,6 +15,9 @@
#include "shell-global.h"
#include "shell-screenshot.h"
#define A11Y_APPS_SCHEMA "org.gnome.desktop.a11y.applications"
#define MAGNIFIER_ACTIVE_KEY "screen-magnifier-enabled"
struct _ShellScreenshotClass
{
GObjectClass parent_class;
@@ -304,6 +307,7 @@ grab_screenshot (ClutterActor *stage,
MetaScreen *screen = shell_global_get_screen (screenshot_data->screenshot->global);
int width, height;
GSimpleAsyncResult *result;
GSettings *settings;
meta_screen_get_size (screen, &width, &height);
@@ -352,8 +356,11 @@ grab_screenshot (ClutterActor *stage,
screenshot_data->screenshot_area.width = width;
screenshot_data->screenshot_area.height = height;
if (screenshot_data->include_cursor)
settings = g_settings_new (A11Y_APPS_SCHEMA);
if (screenshot_data->include_cursor &&
!g_settings_get_boolean (settings, MAGNIFIER_ACTIVE_KEY))
_draw_cursor_image (screenshot_data->image, screenshot_data->screenshot_area);
g_object_unref (settings);
g_signal_handlers_disconnect_by_func (stage, (void *)grab_screenshot, (gpointer)screenshot_data);
@@ -476,6 +483,7 @@ shell_screenshot_screenshot_window (ShellScreenshot *screenshot,
ShellScreenshotCallback callback)
{
GSimpleAsyncResult *result;
GSettings *settings;
_screenshot_data *screenshot_data = g_new0 (_screenshot_data, 1);
@@ -492,6 +500,17 @@ shell_screenshot_screenshot_window (ShellScreenshot *screenshot,
screenshot_data->filename = g_strdup (filename);
screenshot_data->callback = callback;
if (!window)
{
screenshot_data->filename_used = g_strdup ("");
result = g_simple_async_result_new (NULL, on_screenshot_written, (gpointer)screenshot_data, shell_screenshot_screenshot_window);
g_simple_async_result_set_op_res_gboolean (result, FALSE);
g_simple_async_result_complete (result);
g_object_unref (result);
return;
}
window_actor = CLUTTER_ACTOR (meta_window_get_compositor_private (window));
clutter_actor_get_position (window_actor, &actor_x, &actor_y);
@@ -522,8 +541,10 @@ shell_screenshot_screenshot_window (ShellScreenshot *screenshot,
stex = META_SHAPED_TEXTURE (meta_window_actor_get_texture (META_WINDOW_ACTOR (window_actor)));
screenshot_data->image = meta_shaped_texture_get_image (stex, &clip);
if (include_cursor)
settings = g_settings_new (A11Y_APPS_SCHEMA);
if (include_cursor && !g_settings_get_boolean (settings, MAGNIFIER_ACTIVE_KEY))
_draw_cursor_image (screenshot_data->image, screenshot_data->screenshot_area);
g_object_unref (settings);
result = g_simple_async_result_new (NULL, on_screenshot_written, (gpointer)screenshot_data, shell_screenshot_screenshot_window);
g_simple_async_result_run_in_thread (result, write_screenshot_thread, G_PRIORITY_DEFAULT, NULL);

View File

@@ -539,7 +539,8 @@ st_icon_set_icon_name (StIcon *icon,
if (g_icon_equal (priv->gicon, gicon)) /* do nothing */
{
g_object_unref (gicon);
if (gicon)
g_object_unref (gicon);
return;
}

View File

@@ -598,42 +598,36 @@ st_scroll_view_allocate (ClutterActor *actor,
*/
/* Vertical scrollbar */
if (CLUTTER_ACTOR_IS_VISIBLE (priv->vscroll))
{
if (clutter_actor_get_text_direction (actor) == CLUTTER_TEXT_DIRECTION_RTL)
{
child_box.x1 = content_box.x1;
child_box.x2 = content_box.x1 + sb_width;
}
else
{
child_box.x1 = content_box.x2 - sb_width;
child_box.x2 = content_box.x2;
}
child_box.y1 = content_box.y1;
child_box.y2 = content_box.y2 - (hscrollbar_visible ? sb_height : 0);
if (clutter_actor_get_text_direction (actor) == CLUTTER_TEXT_DIRECTION_RTL)
{
child_box.x1 = content_box.x1;
child_box.x2 = content_box.x1 + sb_width;
}
else
{
child_box.x1 = content_box.x2 - sb_width;
child_box.x2 = content_box.x2;
}
child_box.y1 = content_box.y1;
child_box.y2 = content_box.y2 - (hscrollbar_visible ? sb_height : 0);
clutter_actor_allocate (priv->vscroll, &child_box, flags);
}
clutter_actor_allocate (priv->vscroll, &child_box, flags);
/* Horizontal scrollbar */
if (CLUTTER_ACTOR_IS_VISIBLE (priv->hscroll))
{
if (clutter_actor_get_text_direction (actor) == CLUTTER_TEXT_DIRECTION_RTL)
{
child_box.x1 = content_box.x1 + (vscrollbar_visible ? sb_width : 0);
child_box.x2 = content_box.x2;
}
else
{
child_box.x1 = content_box.x1;
child_box.x2 = content_box.x2 - (vscrollbar_visible ? sb_width : 0);
}
child_box.y1 = content_box.y2 - sb_height;
child_box.y2 = content_box.y2;
if (clutter_actor_get_text_direction (actor) == CLUTTER_TEXT_DIRECTION_RTL)
{
child_box.x1 = content_box.x1 + (vscrollbar_visible ? sb_width : 0);
child_box.x2 = content_box.x2;
}
else
{
child_box.x1 = content_box.x1;
child_box.x2 = content_box.x2 - (vscrollbar_visible ? sb_width : 0);
}
child_box.y1 = content_box.y2 - sb_height;
child_box.y2 = content_box.y2;
clutter_actor_allocate (priv->hscroll, &child_box, flags);
}
clutter_actor_allocate (priv->hscroll, &child_box, flags);
/* In case the scrollbar policy is NEVER or scrollbars should be
* overlayed, we don't trim the content box allocation by the

View File

@@ -608,8 +608,9 @@ st_widget_get_theme_node (StWidget *widget)
if (stage == NULL)
{
g_error ("st_widget_get_theme_node called on the widget %s which is not in the stage.",
st_describe_actor (CLUTTER_ACTOR (widget)));
g_critical ("st_widget_get_theme_node called on the widget %s which is not in the stage.",
st_describe_actor (CLUTTER_ACTOR (widget)));
return g_object_new (ST_TYPE_THEME_NODE, NULL);
}
if (parent_node == NULL)