Compare commits

...

105 Commits

Author SHA1 Message Date
170fe945a9 Initial experiment unifying app menus. 2020-06-21 03:28:17 -05:00
08a5f41505 windowManager: Support prepending workspace with horizontal layouts
Commit ce35d523a2 implemented that behavior for vertical workspace layouts,
there is no reason to not allow the same for horizontal layouts.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2916
2020-06-20 08:15:44 +00:00
ec36762309 st: Add st_clipboard_get_content()
Complementing st_clipboard_set_content(), this function allows retrieving
specific mimetypes from the selection as GBytes.

Related: https://gitlab.gnome.org/GNOME/nautilus/-/issues/634

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1321
2020-06-19 13:44:15 +02:00
aa70020bc8 appDisplay: Compare indicator and grid pages
In the past, the icon grid would update the number of pages
during the call to adaptToSize(). However, after the new grid
layout landed, the number of pages is updated by the time an
item is added or removed.

Instead of comparing the old and new number of pages in the
icon grid, compare the pages shown by the indicator, and the
grid pages.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1271
2020-06-18 10:54:31 -03:00
1e77e6fc79 pageIndicator: Add getter for current number of pages
Add a getter to PageIndicators to retrieve the number of pages
it currently displays.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1271
2020-06-18 10:54:31 -03:00
68203e7091 appDisplay: Allow a slighly bigger area for drag overshoot
Now that we don't have the Frequent tab anymore, and subsequently
the buttons to switch tabs, the app grid fill all the way to the
bottom, leaving no room for drag overshoot.

Add a 20px (i.e. OVERSHOOT_THRESHOLD) area at the bottom of the
grid where dragging actually scrolls to the next page.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1271
2020-06-18 10:54:31 -03:00
cff0752bcc appDisplay: Factor out shared code into BaseAppView
The two BaseAppView subclasses now share a lot in terms of
widgetry: they both have a scroll view, pagination dots, swipe
management, etc.

Move this shared code into BaseAppView. Notice, however, that
BaseAppView only creates the widgetry, but it doesn't add them
to any specific layout. FolderView arranges the widgetry in a
vertical box, while AppDisplay arranges it in a ShellStack.

Add a new 'orientation' parameter to BaseAppView and use it
to determine the orientation of the pagination dots, the swipe
tracker direction, and the scroll event handling.

It is worth noticing that the scroll event is a bit more
sophisticated now: when the orientation is horizontal, it
handles all directions since mice wheels usually only generate
up/down events.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1271
2020-06-18 10:54:31 -03:00
45d8e11123 Add pagination to the folder dialog
Make the folder dialog's app grid horizontal, and add
paginators to it as well. Add a new _createGrid() method
to BaseAppView that created an IconGrid.IconGrid by
default, and make FolderView override it to return the
new FolderGrid class.

Fixes https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2436

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1271
2020-06-18 10:54:22 -03:00
5aee714b70 theme: Adjust folder dialog CSS
https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1271
2020-06-18 10:32:01 -03:00
3c3c3b7c69 appDisplay: Don't destroy FolderView directly
When FolderIcon is destroyed, it destroyed the FolderView and, if
there's a folder dialog present, it destroys the dialog as well.

Turns out, the folder dialog adds the icon's FolderView to itself.
The view becomes part of the dialog's actor tree. When the dialog
is destroyed, it also tries to destroy the view - but the folder
view was already destroyed by FolderIcon!

Fix that by letting the dialog destroy the folder view if it exists,
otherwise destroy the folder view directly.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1271
2020-06-18 10:32:01 -03:00
6ba2913075 appDisplay: Add items in order
Add app icons to the exact page and position they're located
instead of always appending. This will be useful later when
custom icon positions are in place.

For now, it assumes pages are always filled, which is true,
but this will also change with custom icon positions.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1271
2020-06-18 10:31:57 -03:00
75c4e1cd63 appDisplay: Actually destroy icons
AppDisplay currently adds all icons, and hides the ones inside
a folder. Change that to only add the icons that are not inside
folders. Adding an icon to a folder removes the icon from the
main grid.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1271
2020-06-18 10:30:12 -03:00
fb4a4ca4a2 appDisplay: Redisplay folders before AppDisplay
When filtering out the app icons, AppDisplay calls FolderIcon.getAppIds(),
which then calls FolderView.getAllItems(). This last function reads the
already added app icons inside the given folder, and return their app ids.

So far, so good.

When the GSettings backing a folder changes, FolderIcon emits 'apps-changed'
to notify AppDisplay that the folder changed.

Cool.

When AppDisplay receives this signal, it first recreates its own icons, then
updates the folders, and finally hides the icons that are inside folders.

This series of events is unfortunate. Future patches will need the folder
to be updated *before* AppDisplay updates its own icons.

Update folder icons before chaining up to BaseAppView._redisplay().

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1271
2020-06-18 10:30:12 -03:00
4c2c1297be appDisplay: Move child focus handling to IconGrid
The icon grid is always paginated, so the app grid code doesn't need
to behave differently in the FolderView and AppDisplay.

Move the keyboard handling to IconGrid itself, and remove the now dead
code from AppDisplay.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1271
2020-06-18 10:30:12 -03:00
c5dbdad5fc iconGrid: Adapt grid layout according to available size
The new icon grid layout operates based on rows and columns, and
doesn't try to dynamically adapt it to fit to the container. In
this case, it is better to have a pre-defined set of well-known,
well-tested rows and columns, and switch between them based on
the aspect ratio of the screen.

Introduce a set of modes to the icon grid, and select the mode
that is closest to the aspect ratio.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1271
2020-06-18 10:30:12 -03:00
4e05bcd3b6 iconGrid: Use IconGridLayout
Replace the current grid code with IconGridLayout.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1271
2020-06-18 10:30:12 -03:00
3555550d5e iconGrid: Introduce IconGridLayout
IconGridLayout is a new layout manager that aims to replace the
current paginated layout algorithm implemented by the icon grid.

There are a few outstanding aspects of this new layout manager
that are worth highlighting. IconGridLayout implements all the
mechanisms necessary for a paginated icon grid, but doesn't
implement any policies around it. The reason behind this decision
is that this layout manager will be used by other places (e.g.
the login dialog) that demand different policies to how the
grid should look like.

Another important aspect of this grid is that it does not queue
any relayouts when changing its properties. If a relayout is
required, the actor should manually queue it. This is necessary
to avoid layout loops.

Add the IconGridLayout class. Next commits will do the surgery
to IconGrid and any related code to use this new layout manager.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1271
2020-06-18 10:30:12 -03:00
8e05fa2728 st: Don't leak st_describe_actor strings
Hopefully this code doesn't get hit much. And it does seem to be the
only user of the function.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1319
2020-06-18 14:10:59 +08:00
d7c3050e2d Update Romanian translation 2020-06-17 15:47:59 +00:00
89ba8562c3 dnd: Set drag actor position immediately after reparenting
For drag actors which get reparented to the uiGroup, we currently wait
until the next input event to set the fixed position of the actor, until
that they will just be allocated their old fixed position, which is 0,
0.

So avoid drag actors flickering at the top left for one frame and
position them correctly right after reparenting.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1310
2020-06-17 10:47:50 +02:00
82da73baff dnd: Fix size of actors which don't get allocated their preferred size
Properly adjust for drag actors which were allocated using a custom
vfunc_allocate() and might not have gotten allocated their preferred
size. When DND reparents the actor to the uiGroup, the drag actor will
get allocated its preferred size, so we also need to take the difference
between the old allocation size and the preferred size into account
before reparenting to the uiGroup.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1310
2020-06-17 10:47:47 +02:00
b2eeda9b46 dnd: Don't override fixed position if actor had no fixed position before
Properly handle drag actors which are not allocated using a fixed
position and disable the fixed position we were using to move the actor
around before we reparent it again to its original parent.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1310
2020-06-17 10:46:46 +02:00
0db41a3773 st/scroll-bar: Fix horizontal bar in RTL locales
As the view now scrolls from right-to-left in RTL locales, the
scroll bar handle should reflect that.

Likewise the event handling needs adjusting as well: Scrolling
left should increase the adjustment value, and clicking the
trough to the left of the handle as well.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1318
2020-06-17 01:08:03 +02:00
8d7f7e61dd st/scroll-view: Adjust scroll events in RTL locales
In RTL locales, scrolling left should increase the adjustment value.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1318
2020-06-17 01:07:28 +02:00
3f4b253dac st/viewport: Fix horizontal translation in RTL locales
In RTL locales, the lowest value should correspond to the right-most
position and vice-versa.

That this went unnoticed for so long shows how we have avoided horizontal
scrolling so far :-)

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1318
2020-06-16 23:57:51 +02:00
e4cbe5126a workspace: Split WindowPreview into a separate file
The workspace.js file is quite large and is a bit confusing when it
comes to the term "window" in there, because it can either refer to a
WindowPreview of a complete window or to an individual window like an
attached dialog.

So try to avoid that confusion and split the new WindowPreview class and
its WindowPreviewLayout layout manager out into a new windowPreview.js
file.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1307
2020-06-16 14:13:02 +02:00
8357739ef8 workspace: Stop exporting window actor in the WindowPreview
Having a public property exporting the MetaWindow is enough to get the
window actor, too, so remove the public realWindow property and while at
it, rename that property to _windowActor, too.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1307
2020-06-16 14:10:01 +02:00
6bef9334b7 workspace: Initialize WindowPreview using a MetaWindow
MetaWindow is Mutters representation of a window and provides all the
APIs about it, MetaWindowActor is just the ClutterActor that's drawing
that window. So use a MetaWindow to create a WindowPreview instead of
the window actor.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1307
2020-06-16 14:10:01 +02:00
8c49f45ac8 workspace: Set overviewHint on MetaWindow
We want to stop using the MetaWindowActor for things which are actually
related to the MetaWindow, one more thing where we can change that is
the overviewHint, which is currently added to the MetaWindowActor.

So move that hint to the MetaWindow and stop calling
get_compositor_private() in a few more places.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1307
2020-06-16 14:10:01 +02:00
46600740fe workspace: Stop using WindowPreview.realWindow in the overview
We can simply get the MetaWindowActor by calling
MetaWindow.get_compositor_private(), so stop accessing the realWindow
property of WindowPreview. For this we also have to make _isMyWindow()
and _isOverviewWindow() take a MetaWindow as an argument instead of a
MetaWindowActor.

Since the WorkspacesThumbnails are also drop targets for WindowPreviews
and their WindowClones also have the public metaWindow property, switch
to using the metaWindow property there, too.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1307
2020-06-16 14:10:01 +02:00
c281e868a0 workspace: Only pass MetaWindow to WindowPreviewLayout
Since the WindowPreview class rarely needs to handle the actual actor
painting the window preview, refactor the WindowPreviewLayout a bit to
only pass a MetaWindow to its addWindow() and removeWindow() functions.

Also make the getWindows() function return an array of MetaWindows,
which makes the getMetaWindow() function obsolete, so remove that.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1307
2020-06-16 14:09:54 +02:00
039431a73f workspace: Stop using clone terminology in WindowPreviewLayout
We're going to remove ClutterClones, so call the parameters to
addWindow() and removeWindow() "actor" instead of "clone". Also make the
destroyIds less confusing and rename the actual actor destroy id to
"destroyId", and rename the window actors destroy id to
"windowActorDestroyId".

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1307
2020-06-16 14:04:10 +02:00
d4f8ea1c53 workspace: Make some functions in WindowPreview private
Now that the WindowPreview also shows the overlays itself, we can make
some functions private.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1307
2020-06-16 13:55:17 +02:00
96f5e2b33e workspace: Call _activate() directly when clicking the window preview
We can remove the simply callback function in favour of an anonymous
function here.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1307
2020-06-16 13:55:17 +02:00
93a542d52c workspace: Set WindowPreview offscreen redirect inside constructor
This can also be moved to constructor, so do it.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1307
2020-06-16 13:55:17 +02:00
f4fcba74ff workspace: Remove slot property of WindowPreview
Since the slot property was only accessed by the old WindowOverlays to
get the position and size of the preview, we can safely stop setting it
and remove that property now.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1307
2020-06-16 13:55:17 +02:00
cadbf7cd8b workspace: Rename WindowClone to WindowPreview
Since ClutterClones are going to be removed, let's switch the
terminology here to something that's more understandable and rename the
WindowClone class and its layout manager to
WindowPreview/WindowPreviewLayout.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1307
2020-06-16 13:55:17 +02:00
dd8e1aef51 st-widget: Use clutter_input_device_get_actor() to get pointer actor
Use clutter_input_device_get_actor() since it replaces
clutter_input_device_get_pointer_actor().

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1285
2020-06-16 09:33:08 +00:00
15dc37a139 Update Kazakh translation 2020-06-15 13:38:33 +00:00
c23ad83c59 windowManager: Warn when removing old animationInfo
Now that we properly notify mutter about when a size-change animation
has ended, it should never happen that a new size-change animation is
started without the last one being cancelled (ie. 'kill-window-effects'
being emitted).

This means there should also never be an old animationInfo attached to a
window actor, so warn in case we still find one when starting the
animation.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1251
2020-06-15 13:12:03 +00:00
4a6f550acb windowManager: Use new mutter API to freeze window actors ourself
We're currently using the hack of telling mutter that our effect is
completed (even though it isn't) in order to unfreeze updates of the
window actor.

This causes a bug with detecting the wl_outputs a window is
visible on, because the MetaWindowActor emits its "effects-completed"
signal too early, making Mutter update the wl_outputs while we're doing
the animation.

Now since meta_wayland_actor_surface_is_on_logical_monitor() uses the
transformed position and size of the MetaSurfaceActor and is being
called right after we setup the animation (but before it actually
starts, that happens at the next paint cycle) it will use a "very wrong"
rectangle: The transformation has been set to move the actor back to its
old position, and while we did already unfreeze updates and called
clutter_actor_set_position() in meta_window_actor_sync_actor_geometry(),
the actual allocation is not updated yet; this makes
clutter_actor_get_transformed_position() return a position including in
the new transformation, but not including the new allocation, and the
rectangle ends up being moved to the next monitor or completely out of
the stage.

To fix this issue properly, we need to decouple unfreezing actor updates
from emitting the "effects-completed" signal, which is now possible with
the new meta_window_actor_freeze() and meta_window_actor_thaw() APIs. So
use those new methods to freeze and thaw actor updates ourselves and
make sure to call shellwm.completed_size_change() only after the
animation has finished.

Mutter MR: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1250

Fixes https://gitlab.gnome.org/GNOME/mutter/-/issues/513

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1251
2020-06-15 13:12:03 +00:00
8078d78c30 windowManager: Also clear animationInfo when size-changed wasn't emitted
It might be that we receive a "kill-window-effects" signal between the
emission of the "size-change" and the "size-changed" signal.

In this case we already have the animationInfo attached to the window
actor, so we should also remove it.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1251
2020-06-15 13:12:03 +00:00
d7185d71c6 windowManager: Clean up starting of size-change animations a bit
We can do without having two calls to shellwm.completed_size_change() in
there, so use an early return for all cases.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1251
2020-06-15 13:12:03 +00:00
522ecba180 workspace: Center overlay close button on border using guide actor
This makes use of the invisible actor introduced in the previous commit
to center the close button on the border.

Fixes https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2899

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1313
2020-06-14 21:58:47 +00:00
9b22f6183f workspace: Use invisible guide actor to center overlay title on border
Using CSS to center the title actor on the border is a bit ugly, because
it requires the CSS to match the calculations used in chromeHeights().
Also it is not possible to use CSS margins for cases where the position
of the actor is determined at run time, such as for the close button.

Instead use an invisible actor that spans between the horizontal and
vertical center lines of the border as guide when aligning the title
actor.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1313
2020-06-14 21:58:47 +00:00
b2c35e4fb0 workspace: Unbreak reposition animation
Commit 1ea22a5281 broke the window reposition animation when it
based the ::size-changed signal on the layout manager's bounding box
instead of the MetaWindow::size-changed signal.

That's happening because of the combination of:

  1. we adjust to window size changes immediately without animations
  2. closing a window triggers a change to a 0x0 bounding box which
     is not treated as a size change

Fix this by addressing the 2nd factor, and don't treat a change to
a 0x0 bounding box as size change.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2901
2020-06-14 21:20:36 +00:00
af543daf1c workspacesView: Only animate on show() when geometries are already set
Animating the window clones of the overview requires the fullGeometry
and the actualGeometry to be set, which they won't be when showing the
overview for the first time. So don't even try to animate the window
clones in that case because the geometries will still be null and
accessing them in workspace.js will throw errors.

The workspace views will still get the correct layout as soon as the
allocations happen because syncing the geometries will trigger updating
the window positions. Since animations are disabled for position changes
when syncing the geometry though, we won't get an animation and the
clones will jump into place. That's not a regression though since before
this change we also didn't animate in that case because the geometries
used were simply wrong (the actualGeometry was 0-sized as explained in
the last commit).

If we wanted to fix the initial animation of the overview, we'd have to
always enable animations of the window clones when syncing geometries,
but that would break the animation of the workspace when hovering the
workspaceThumbnail slider, because right now those animations are "glued
together" using the actualGeometry, so they would get out of sync.

The reason there are no errors happening in workspace.js with the
existing code is that due to a bug in Clutter the fullGeometry of
WorkspacesDisplay gets set very early while mapping the WorkspacesViews
(because the overviews ControlsManager gets an allocation during the
resource scale calculation of a ClutterClone, see
https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1181), so it
won't be set to null anymore when calling
WorkspacesView.animateToOverview().

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1119
2020-06-14 14:44:10 +00:00
baeb4079ee workspacesView: Avoid setting invalid geometries on views
The fullGeometry and the actualGeometry of the WorkspacesDisplay are set
from the allocation of the overviews ControlsManager and the
WorkspacesDisplay, that means they're only valid after those actors got
their allocations during Clutters allocation cycle.

Since WorkspacesDisplay._updateWorkspacesViews() is already called while
showing/mapping the WorkspacesDisplay, that allocation cycle didn't
happen yet and we end up either setting the geometries of the views to
null (in case of the fullGeometry) or to something wrong (a 0-sized
allocation in case of the actualGeometry).

So avoid setting invalid geometries on the views by initializing both
the fullGeometry and the actualGeometry to null, and then only updating
the geometries of the views after they're set to a correct value.

Note that this means we won't correctly animate the overview the first
time we open it since the animation depends on the geometries being set,
but is being started from show(), which means no allocations have
happened yet. In practice this introduces no regression though since
before this change we simply used incorrect geometries (see the 0-sized
allocation mentioned above) on the initial opening and the animation
didn't work either.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1119
2020-06-14 14:44:10 +00:00
f91f9801b4 Update Turkish translation 2020-06-14 07:52:41 +00:00
c5634335b0 workspace: Remove WindowOverlay in favour of new overlays of WindowClone
Start using the new overlays we introduced in the last commit and remove
the WindowOverlay class and the objects for keeping track of them in the
Workspace.

The new layout which doesn't use the -shell-close-overlap CSS property
anymore sligthly changes the position of the close button to be a bit
further away from the actual window.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1298
2020-06-11 20:50:08 +02:00
2b4317349f workspace: Set maxChromeWidth to window clone width
So far we allowed the titles of window overlays to expand their width to
be larger than the actual WindowClone, they could expand to the full
size of the Workspace.

Since we're now going to implement those titles as part of the
WindowClone itself, having this feature is no longer possible as easily
as it was before. That's because the clones are stacked according to the
stacking of the actual windows, and since the overlay-elements are
attached to those clones, they will also be shown underneath other
clones.

So stop allowing the titles to expand and limit their size to the width
of the clone, which makes sure titles never get shown above or
underneath other clones.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1298
2020-06-11 20:50:08 +02:00
96bfd1f8be workspace: Adjust for close button side in chromeWidth
When the close button is shown on the left side of the WindowClone, we
also need to return its width in chromeWidth() on the left side instead
of the right side, so do that.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1298
2020-06-11 20:50:08 +02:00
33ab53068e workspace: Add window overlay to WindowClone
Add the window overlays we're currently showing using the WindowOverlay
class to the WindowClone class and implement them using
ClutterConstraints instead of the old fixed position/size layout, which
had to be used because the workspaces were scaled, and the title and app
icon were kept unscaled using a separate layer.

Specifically, this is done by adding the ClutterClones to a static
container owned by the WindowClone and adding the elements of the
overlay as children to the WindowClone itself. That way the
overlay-elements can use the container as a source for their constraints
and we avoid having to make sure the overlays remain visible above the
ClutterClones.

We're not using the new overlays yet, they're hidden by default and
showOverlay() isn't called anywhere yet.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1298
2020-06-11 20:50:06 +02:00
40123ae6da workspace: Close windows using new layout manager API
Now that we have a new API to get all the windows and metaWindows from
our layout manager, implement the deleteAll() method of the window clone
using that API instead of looping through the children of the actor and
using the source of the ClutterClone.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1298
2020-06-11 20:49:31 +02:00
df149524d4 workspace: Add API to get windows and metaWindow to WindowCloneLayout
This will allow us to remove the remaining parts of the WindowClone
looping through children in favour of simply getting an array with the
windows or metaWindows and looping through that.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1298
2020-06-11 20:49:31 +02:00
f0ee9cdcf8 util: Remove unused class CloseButton
This looks like it was used to create the close buttons in the overview
at some point, we're no longer using it nowadays though, so remove it.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1298
2020-06-11 20:49:31 +02:00
a3257e8df5 Update Japanese translation 2020-06-11 10:27:58 +00:00
d2cf13eff4 unlockDialog: Set Switch User Button via _updateUserSwitchVisibility
This commit will set the button invisible when the user's can_switch
is false (e.g. when the session is remote) or user-switch-enabled is
disabled.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2687
2020-06-10 23:02:55 +08:00
8cd352b72b Update Japanese translation 2020-06-10 12:34:12 +00:00
c210052dc6 Update Japanese translation 2020-06-10 12:18:32 +00:00
0561af66e7 overview: Adapt to MetaBackgroundContent
The properties are now defined in MetaBackgroundContent.
Animate the ClutterContent properties.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1309
2020-06-09 20:10:52 +00:00
1e9b170d87 background: Adapt to MetaBackgroundContent
The properties are now part of MetaBackgroundContent, so set
the properties there instead.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1309
2020-06-09 20:10:52 +00:00
be02f76aa7 iconGrid: Trivial comment cleanup
There's no PaginatedIconGrid anymore

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1301
2020-06-09 16:14:30 -03:00
687928e7b7 appDisplay: Don't fade icons when a folder dialog is open
The folder dialog itself now has a background, there's no
need to fade the icons anymore.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1301
2020-06-09 16:14:30 -03:00
ffdf3feb04 appDisplay: Fade the dialog background
As a last step towards the better app grid, add a semi-transparent
black background to the folder dialog.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1301
2020-06-09 16:14:30 -03:00
a60b8b3b50 appDisplay: Set minRows to 3 in folder dialog grid
It gives the folder dialog a better layout overall. This is
going to be replaced in the future by the new icon grid code,
but it's a good improvement to have until there.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1301
2020-06-09 16:14:30 -03:00
3d6add68c7 appDisplay: Hide folder icon when dialog is open
In such a way that gives the illusion of the icon becoming
the dialog itself.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1301
2020-06-09 16:14:30 -03:00
85e055ffe3 appDisplay: Don't change search entry's reactive state
The folder dialog eats all events now, there's no need to
disable the search entry anymore.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1301
2020-06-09 16:14:29 -03:00
1691e422e7 appDisplay: Remove unused variable
As the title says.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1301
2020-06-09 16:14:29 -03:00
f442c9510e appDisplay: Fix misnamed variable
This should have been renamed to "displayingDialog" by
commit 7781f973f2.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1301
2020-06-09 16:14:29 -03:00
0de98eb772 appDisplay: Don't connect to 'space-closed'
This signal doesn't exist anymore.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1301
2020-06-09 16:14:29 -03:00
30172b5625 appDisplay: Popdown folder dialog on DnD
So that we're still able to drag icons out of folders, and to the
Dash. Wait 600ms (MENU_POPUP_TIMEOUT) before popping it down.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1301
2020-06-09 16:13:30 -03:00
8ae99a6898 appDisplay: Remove event blocker
It is unused now.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1301
2020-06-09 16:01:08 -03:00
5cfe5bf8c8 appDisplay: Move click action to dialog
Now that the folder dialog covers the whole primary
monitor, it eats all input events, and doesn't allow
the event blocker to detect clicks.

Move the click action to the folder dialog itself, and
popdown the dialog if a click is triggered on the dialog
(but not on any children).

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1301
2020-06-09 16:01:08 -03:00
c790c01a3b appDisplay: Move adaptToSize call to FolderView
There is absolutely no need to handle this in the dialog
itself.

Move the call to adaptToSize into FolderView.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1301
2020-06-09 16:01:08 -03:00
d4a947b475 appDisplay: Zoom dialog child in and out
Instead of zooming the dialog itself, zoom its only
child, which is the "actual" user-visible dialog.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1301
2020-06-09 16:01:08 -03:00
60d7999b6a appDisplay: Make AppFolderDialog subclass St.Bin
It'll simplify things a bit.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1301
2020-06-09 16:01:08 -03:00
c040d08b97 appDisplay: Make folder dialog cover the whole screen
Future commits will improve input handling of the folder
dialog, and they'll require the dialog to cover the whole
primary monitor.

Add another internal, center-aligned container to the
folder dialog, and make it cover the whole available area.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1301
2020-06-09 16:01:08 -03:00
3a53b25873 appDisplay: Constrain dialog to primary display
Much like the overview controls themselves are tied to the
primary display, constrain the folder dialog to the primary
display as well.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1301
2020-06-09 16:01:08 -03:00
d8e6f654a3 appDisplay: Add folder dialog to overview group
Right now, the app folder dialog isn't really a dialog,
since it is actually added to the AppDisplay. Furthermore,
having it added in AppDisplay may mess up with its sizing
calculations, since AppDisplay has a ClutterBinLayout and
the folder dialog has a fairly large minimum size.

Add the folder dialog to the overview group. Next commits
will adjust various actors to be able to better handle it.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1301
2020-06-09 16:01:08 -03:00
fdfcacf1db st/entry: Fix leak when copying or cutting text using shortcuts
clutter_text_get_selection() creates a copy of the selected text which
gets passed to st_clipboard_set_text() which creates its own copy. The
copy returned by clutter_text_get_selection() however never got free'd.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1306
2020-06-08 15:21:17 +00:00
d3efbcce9b Updated Spanish translation 2020-06-08 16:10:16 +02:00
ac34dbe353 Update Catalan translation 2020-06-06 14:56:58 +02:00
e0f3e13456 Update Ukrainian translation 2020-06-06 12:54:13 +00:00
fdd9def922 dateMenu: Add "Events" section
Events have a clear and obvious connection to the calendar, and similar
to the Clocks and Weather sections there's a strong link to a particular
application.

Adding them as another section to the right-hand side of the calendar
therefore presents a viable alternative to the old events section.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1282
2020-06-06 01:04:09 +02:00
771050f4d7 messageList: Remove setDate() method
Since the events section has been removed and visibility no longer
depends on the date, it's not used by anything anymore.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1282
2020-06-06 01:04:09 +02:00
8451df977c calendar: Simplify placeholder
Without the events section in the message list, the placeholder can only
reflect whether or not there are notifications.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1282
2020-06-06 01:04:09 +02:00
ff55cf017e calendar: Don't restrict section visibility by date
The idea behind hiding the notifications and media section on days
other than today was that they represent present activity together
with today's events, in contrast to past and future events from
other days.

After events were moved out of the message list, that behavior is
no longer useful: We just guarantee that the left-hand side of the
calendar will always be empty when browsing the calendar.

Adjust to that by removing the limitation by date.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1282
2020-06-06 01:04:09 +02:00
d36a180852 calendar: Remove events section from message list
While treating notifications as a type of present event was a neat
concept, there are some issues with it that we never managed to
address (not least the inability to "open" an event).

So remove the current events section from the message list; we'll
bring back events in a different form later.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1282
2020-06-06 01:04:09 +02:00
12c7f693d0 calendar-server: Notify HasCalendar changes when updating views
The HasCalendar property reflects whether there are any views, and views
change either when clients appear/disappear or when the time range changes.

However we currently only emit the PropertiesChanged signal for the former,
fix that.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1300
2020-06-05 22:56:16 +00:00
e0a8cb565e calendar-server: Move method
We'll need to call it from app_update_views(), so move it up to make
it available to that function without a prior declaration.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1300
2020-06-05 22:56:16 +00:00
46547ae027 shell-mime-sniffer: Ignore invalid file content type
The shell mime sniffer goes through all the files in a directory,
however in case a file content type is not recognized, the GIO function
g_file_info_get_content_type() may return NULL, causing a crash when
looking up into the content type tables, as they are supposed to contain
strings only and they use `g_str_hash` has func, which doesn't support
NULL values.

So, in case we get an invalid content type, let's just ignore it,
without adding it to the cache as we do in the nautilus code that was
inspiring the sniffer.

Fixes https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2643
2020-06-05 16:27:29 +02:00
68745328df Update Chinese (China) translation 2020-06-05 09:02:40 +00:00
4582d7a183 workspace: Remove no longer valid comment
This comment is no longer correct, we're not inserting any actors here
to adjust for the window border, but we're modifying the allocation of
the children to adjust for that border.

Since that happens in the layout manager anyway, remove the comment
here.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1297
2020-06-04 17:40:09 +00:00
cc5ed2fbf5 workspace: Use generic _addWindow function to add new clones
Now that we handle all ClutterClones belonging to the WindowClone pretty
much the same, we can add a generic _addWindow function to WindowClone
which creates the ClutterClone and adds it to the layout manager.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1297
2020-06-04 17:40:09 +00:00
a2545d186a workspace: Implement windowCenter using bounding box
This isn't quite the same as the allocation, but it's what the workspace
actually wants to use given that we use the bounding box of the
WindowClone for all the layout calculation.

So instead of calculating the windowCenter in the WindowClone, make use
of the bounding-box property of the layout manager and return the center
point of that.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1297
2020-06-04 17:40:09 +00:00
1ea22a5281 workspace: Use bounding-box property from layout manager
Make use of the new bounding-box property we introduced for the
WindowClones layout manager in the last commit.

With this we can remove all the bounding box calculation code from the
WindowClone class and simply use the "notify::bounding-box" signal to
notify changes to our size. To make sure users of the WindowClone don't
break, we now have to convert the layout managers ClutterActorBox in our
getter function to a JS object.

Since we now also don't have to connect to the "destroy" signal of the
attached dialogs anymore, we can remove _disconnectSignals() and only
listen to "destroy" of the toplevel window.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1297
2020-06-04 17:40:09 +00:00
090057d2df workspace: Track windows in WindowClone layout manager
Move the tracking of the bounding box and all the layout related things
out of the WindowClone class and into the layout manager. This allows
the layout manager to keep track of its windows itself and simply notify
the new bounding-box property in case that box changes.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1297
2020-06-04 17:40:08 +00:00
b3aab7f401 Updated Spanish translation 2020-06-04 09:15:53 +02:00
8154728d09 environment: Add Math.clamp
The good old clamp function, now part of the Math family.
Clamp is happy after so many years of loneliness.

This is a strict implementation of the draft ECMAScript
proposal.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1295
2020-06-03 12:55:53 -03:00
5569090d1c viewSelector: Make sure it's invisible when overview is hidden
Instead of overriding the hide() method, use the vfunc to
reset, and hide the workspaces display too.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1295
2020-06-03 12:55:45 -03:00
fc3bc7678d viewSelector: Rename show to animateToOverview
The same reasoning as the previous commits.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1295
2020-06-03 12:55:45 -03:00
8914a46669 workspacesView: Override vfunc_hide
Override the hide vfunc instead of the plain hide() method.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1295
2020-06-03 12:55:42 -03:00
e7ec373aee workspacesView: Rename show to animateToOverview
WorkspacesDisplay is a ClutterActor subclass, and overriding
the show and hide methods require chaining up, otherwise the
actor isn't actually shown or hidden.

To avoid clashing with the pre-existing show method, rename
to animateToOverview.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1295
2020-06-03 12:54:05 -03:00
fe131f926d workspace: Increase window clone fade duration to 200 ms
The current value of 100 ms is barely noticable and looks very abrupt,
use 200 ms instead which make it feel like an actual transition.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1296
2020-06-02 23:43:52 +00:00
44 changed files with 5535 additions and 3961 deletions

View File

@ -1,17 +1,13 @@
/* App Grid */
$app_icon_size: 96px;
$app_icon_padding: 24px;
// app icons
.icon-grid {
-shell-grid-horizontal-item-size: $app_icon_size + $app_icon_padding * 2;
-shell-grid-vertical-item-size: $app_icon_size + $app_icon_padding * 2;
spacing: $base_spacing * 6;
.overview-icon {
icon-size: $app_icon_size;
}
row-spacing: $base_spacing * 6;
column-spacing: $base_spacing * 6;
max-row-spacing: $base_spacing * 12;
max-column-spacing: $base_spacing * 12;
}
/* App Icons */
@ -42,8 +38,8 @@ $app_grid_fg_color: #fff;
.app-folder-dialog {
border-radius: $modal_radius * 1.5;
border: 1px solid $osd_outer_borders_color;
spacing: 12px;
background-color: transparentize(darken($osd_bg_color,10%), 0.05);
padding: 12px;
& .folder-name-container {
padding: 24px 36px 0;
@ -52,7 +48,7 @@ $app_grid_fg_color: #fff;
& .folder-name-label,
& .folder-name-entry {
font-size: 18pt;
font-weight: bold;
font-weight: 800;
}
& .folder-name-entry { width: 300px }
@ -71,11 +67,24 @@ $app_grid_fg_color: #fff;
& > StIcon { icon-size: 16px }
}
}
& .icon-grid {
row-spacing: $base_spacing * 2;
column-spacing: $base_spacing * 5;
}
& .page-indicators {
margin-bottom: 18px;
.page-indicator {
padding: 15px 12px;
}
}
}
.app-folder-dialog-container {
padding: 12px;
width: 800px;
height: 600px;
width: 620px;
height: 620px;
}
.app-folder-icon {

View File

@ -177,6 +177,32 @@
}
}
/* Events */
.events-button {
@include notification_bubble;
padding: $base_padding * 2;
.events-box {
spacing: $base_spacing;
}
.events-list {
spacing: 2 * $base_spacing;
}
.events-title {
color: desaturate(darken($fg_color,40%), 10%);
font-weight: bold;
margin-bottom: $base_margin;
}
.event-time {
color: darken($fg_color,20%);
font-feature-settings: "tnum";
@include fontsize($base_font_size - 1);
}
}
/* World clocks */
.world-clocks-button {
@include notification_bubble;

View File

@ -8,6 +8,7 @@ $window_thumbnail_border_color:transparentize($selected_fg_color, 0.65);
$window_close_button_size: 24px;
$window_close_button_padding: 3px;
$window_clone_border_size: 6px;
// Window picker
.window-picker {
@ -22,7 +23,7 @@ $window_close_button_padding: 3px;
// Borders on window thumbnails
.window-clone-border {
border-width: 6px;
border-width: $window_clone_border_size;
border-style: solid;
border-color: $window_thumbnail_border_color;
border-radius: $base_border_radius + 2;
@ -54,8 +55,6 @@ $window_close_button_padding: 3px;
width: $window_close_button_size;
box-shadow: -1px 1px 5px 0px rgba(0,0,0,0.5);
-shell-close-overlap: $window_close_button_size * 0.5;
&:hover {
background-color: lighten($selected_bg_color, 5%);
}

View File

@ -108,6 +108,7 @@
<file>ui/windowAttentionHandler.js</file>
<file>ui/windowMenu.js</file>
<file>ui/windowManager.js</file>
<file>ui/windowPreview.js</file>
<file>ui/workspace.js</file>
<file>ui/workspaceSwitcherPopup.js</file>
<file>ui/workspaceThumbnail.js</file>

View File

@ -1,9 +1,9 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
/* exported findUrls, spawn, spawnCommandLine, spawnApp, trySpawnCommandLine,
formatTime, formatTimeSpan, createTimeLabel, insertSorted,
makeCloseButton, ensureActorVisibleInScrollView, wiggle */
ensureActorVisibleInScrollView, wiggle */
const { Clutter, Gio, GLib, GObject, Shell, St, GnomeDesktop } = imports.gi;
const { Clutter, Gio, GLib, Shell, St, GnomeDesktop } = imports.gi;
const Gettext = imports.gettext;
const Main = imports.ui.main;
@ -363,51 +363,6 @@ function insertSorted(array, val, cmp) {
return pos;
}
var CloseButton = GObject.registerClass(
class CloseButton extends St.Button {
_init(boxpointer) {
super._init({
style_class: 'notification-close',
x_expand: true,
y_expand: true,
x_align: Clutter.ActorAlign.END,
y_align: Clutter.ActorAlign.START,
});
this._boxPointer = boxpointer;
if (boxpointer)
this._boxPointer.connect('arrow-side-changed', this._sync.bind(this));
}
_computeBoxPointerOffset() {
if (!this._boxPointer || !this._boxPointer.get_stage())
return 0;
let side = this._boxPointer.arrowSide;
if (side == St.Side.TOP)
return this._boxPointer.getArrowHeight();
else
return 0;
}
_sync() {
let themeNode = this.get_theme_node();
let offY = this._computeBoxPointerOffset();
this.translation_x = themeNode.get_length('-shell-close-overlap-x');
this.translation_y = themeNode.get_length('-shell-close-overlap-y') + offY;
}
vfunc_style_changed() {
this._sync();
super.vfunc_style_changed();
}
});
function makeCloseButton(boxpointer) {
return new CloseButton(boxpointer);
}
function ensureActorVisibleInScrollView(scrollView, actor) {
let adjustment = scrollView.vscroll.adjustment;
let [value, lower_, upper, stepIncrement_, pageIncrement_, pageSize] = adjustment.get_values();

File diff suppressed because it is too large Load Diff

View File

@ -512,8 +512,8 @@ var SystemBackground = GObject.registerClass({
super._init({
meta_display: global.display,
monitor: 0,
background: _systemBackground,
});
this.content.background = _systemBackground;
let id = GLib.idle_add(GLib.PRIORITY_DEFAULT, () => {
this.emit('loaded');
@ -738,6 +738,8 @@ var BackgroundManager = class BackgroundManager {
let backgroundActor = new Meta.BackgroundActor({
meta_display: global.display,
monitor: this._monitorIndex,
});
backgroundActor.content.set({
background,
vignette: this._vignette,
vignette_sharpness: 0.5,

View File

@ -14,7 +14,6 @@ const { loadInterfaceXML } = imports.misc.fileUtils;
var MSECS_IN_DAY = 24 * 60 * 60 * 1000;
var SHOW_WEEKDATE_KEY = 'show-weekdate';
var ELLIPSIS_CHAR = '\u2026';
var MESSAGE_ICON_SIZE = -1; // pick up from CSS
@ -32,10 +31,6 @@ function sameDay(dateA, dateB) {
return sameMonth(dateA, dateB) && (dateA.getDate() == dateB.getDate());
}
function isToday(date) {
return sameDay(new Date(), date);
}
function _isWorkDay(date) {
/* Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). */
let days = C_('calendar-no-work', "06");
@ -723,67 +718,6 @@ var Calendar = GObject.registerClass({
}
});
var EventMessage = GObject.registerClass(
class EventMessage extends MessageList.Message {
_init(event, date) {
super._init('', '');
this._date = date;
this.update(event);
this._icon = new St.Icon({ icon_name: 'x-office-calendar-symbolic' });
this.setIcon(this._icon);
}
vfunc_style_changed() {
let iconVisible = this.get_parent().has_style_pseudo_class('first-child');
this._icon.opacity = iconVisible ? 255 : 0;
super.vfunc_style_changed();
}
update(event) {
this._event = event;
this.setTitle(this._formatEventTime());
this.setBody(event.summary);
}
_formatEventTime() {
let periodBegin = _getBeginningOfDay(this._date);
let periodEnd = _getEndOfDay(this._date);
let allDay = this._event.allDay || (this._event.date <= periodBegin &&
this._event.end >= periodEnd);
let title;
if (allDay) {
/* Translators: Shown in calendar event list for all day events
* Keep it short, best if you can use less then 10 characters
*/
title = C_("event list time", "All Day");
} else {
let date = this._event.date >= periodBegin
? this._event.date
: this._event.end;
title = Util.formatTime(date, { timeOnly: true });
}
let rtl = Clutter.get_default_text_direction() == Clutter.TextDirection.RTL;
if (this._event.date < periodBegin && !this._event.allDay) {
if (rtl)
title = '%s%s'.format(title, ELLIPSIS_CHAR);
else
title = '%s%s'.format(ELLIPSIS_CHAR, title);
}
if (this._event.end > periodEnd && !this._event.allDay) {
if (rtl)
title = '%s%s'.format(ELLIPSIS_CHAR, title);
else
title = '%s%s'.format(title, ELLIPSIS_CHAR);
}
return title;
}
});
var NotificationMessage = GObject.registerClass(
class NotificationMessage extends MessageList.Message {
_init(notification) {
@ -849,149 +783,6 @@ class NotificationMessage extends MessageList.Message {
}
});
var EventsSection = GObject.registerClass(
class EventsSection extends MessageList.MessageListSection {
_init() {
super._init();
this._desktopSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.interface' });
this._desktopSettings.connect('changed', this._reloadEvents.bind(this));
this._eventSource = new EmptyEventSource();
this._messageById = new Map();
this._title = new St.Button({ style_class: 'events-section-title',
label: '',
can_focus: true });
this._title.child.x_align = Clutter.ActorAlign.START;
this.insert_child_below(this._title, null);
this._title.connect('clicked', this._onTitleClicked.bind(this));
this._title.connect('key-focus-in', this._onKeyFocusIn.bind(this));
this._appSys = Shell.AppSystem.get_default();
this._appSys.connect('installed-changed',
this._appInstalledChanged.bind(this));
this._appInstalledChanged();
}
setEventSource(eventSource) {
if (!(eventSource instanceof EventSourceBase))
throw new Error('Event source is not valid type');
this._eventSource = eventSource;
this._eventSource.connect('changed', this._reloadEvents.bind(this));
}
get allowed() {
return Main.sessionMode.showCalendarEvents;
}
_updateTitle() {
this._title.visible = !isToday(this._date);
if (!this._title.visible)
return;
let dayFormat;
let now = new Date();
if (sameYear(this._date, now)) {
/* Translators: Shown on calendar heading when selected day occurs on current year */
dayFormat = Shell.util_translate_time_string(NC_("calendar heading", "%A, %B %-d"));
} else {
/* Translators: Shown on calendar heading when selected day occurs on different year */
dayFormat = Shell.util_translate_time_string(NC_("calendar heading", "%A, %B %-d, %Y"));
}
this._title.label = this._date.toLocaleFormat(dayFormat);
}
_reloadEvents() {
if (this._eventSource.isLoading || this._reloading)
return;
this._reloading = true;
let periodBegin = _getBeginningOfDay(this._date);
let periodEnd = _getEndOfDay(this._date);
let events = this._eventSource.getEvents(periodBegin, periodEnd);
let ids = events.map(e => e.id);
this._messageById.forEach((message, id) => {
if (ids.includes(id))
return;
this._messageById.delete(id);
this.removeMessage(message);
});
for (let i = 0; i < events.length; i++) {
let event = events[i];
let message = this._messageById.get(event.id);
if (!message) {
message = new EventMessage(event, this._date);
this._messageById.set(event.id, message);
this.addMessage(message, false);
} else {
message.update(event);
this.moveMessage(message, i, false);
}
}
this._reloading = false;
this._sync();
}
_appInstalledChanged() {
this._calendarApp = undefined;
this._title.reactive = this._getCalendarApp() != null;
}
_getCalendarApp() {
if (this._calendarApp !== undefined)
return this._calendarApp;
let apps = Gio.AppInfo.get_recommended_for_type('text/calendar');
if (apps && (apps.length > 0)) {
let app = Gio.AppInfo.get_default_for_type('text/calendar', false);
let defaultInRecommended = apps.some(a => a.equal(app));
this._calendarApp = defaultInRecommended ? app : apps[0];
} else {
this._calendarApp = null;
}
return this._calendarApp;
}
_onTitleClicked() {
Main.overview.hide();
Main.panel.closeCalendar();
let appInfo = this._getCalendarApp();
if (appInfo.get_id() === 'org.gnome.Evolution.desktop') {
let app = this._appSys.lookup_app('evolution-calendar.desktop');
if (app)
appInfo = app.app_info;
}
appInfo.launch([], global.create_app_launch_context(0, -1));
}
setDate(date) {
super.setDate(date);
this._updateTitle();
this._reloadEvents();
}
_shouldShow() {
return !this.empty || !isToday(this._date);
}
_sync() {
if (this._reloading)
return;
super._sync();
}
});
var TimeLabel = GObject.registerClass(
class NotificationTimeLabel extends St.Label {
_init(datetime) {
@ -1088,10 +879,6 @@ class NotificationSection extends MessageList.MessageListSection {
});
super.vfunc_map();
}
_shouldShow() {
return !this.empty && isToday(this._date);
}
});
var Placeholder = GObject.registerClass(
@ -1100,41 +887,13 @@ class Placeholder extends St.BoxLayout {
super._init({ style_class: 'message-list-placeholder', vertical: true });
this._date = new Date();
let todayFile = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/no-notifications.svg');
let otherFile = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/no-events.svg');
this._todayIcon = new Gio.FileIcon({ file: todayFile });
this._otherIcon = new Gio.FileIcon({ file: otherFile });
this._icon = new St.Icon();
const file = Gio.File.new_for_uri(
'resource:///org/gnome/shell/theme/no-notifications.svg');
this._icon = new St.Icon({ gicon: new Gio.FileIcon({ file }) });
this.add_actor(this._icon);
this._label = new St.Label();
this._label = new St.Label({ text: _('No Notifications') });
this.add_actor(this._label);
this._sync();
}
setDate(date) {
if (sameDay(this._date, date))
return;
this._date = date;
this._sync();
}
_sync() {
let today = isToday(this._date);
if (today && this._icon.gicon == this._todayIcon)
return;
if (!today && this._icon.gicon == this._otherIcon)
return;
if (today) {
this._icon.gicon = this._todayIcon;
this._label.text = _("No Notifications");
} else {
this._icon.gicon = this._otherIcon;
this._label.text = _("No Events");
}
}
});
@ -1235,9 +994,6 @@ class CalendarMessageList extends St.Widget {
this._notificationSection = new NotificationSection();
this._addSection(this._notificationSection);
this._eventsSection = new EventsSection();
this._addSection(this._eventsSection);
Main.sessionMode.connect('updated', this._sync.bind(this));
}
@ -1273,13 +1029,4 @@ class CalendarMessageList extends St.Widget {
let canClear = sections.some(s => s.canClear && s.visible);
this._clearButton.reactive = canClear;
}
setEventSource(eventSource) {
this._eventsSection.setEventSource(eventSource);
}
setDate(date) {
this._sectionList.get_children().forEach(s => s.setDate(date));
this._placeholder.setDate(date);
}
});

View File

@ -13,7 +13,11 @@ const System = imports.system;
const { loadInterfaceXML } = imports.misc.fileUtils;
const NC_ = (context, str) => '%s\u0004%s'.format(context, str);
const T_ = Shell.util_translate_time_string;
const MAX_FORECASTS = 5;
const ELLIPSIS_CHAR = '\u2026';
const ClocksIntegrationIface = loadInterfaceXML('org.gnome.Shell.ClocksIntegration');
const ClocksProxy = Gio.DBusProxy.makeProxyWrapper(ClocksIntegrationIface);
@ -84,6 +88,188 @@ class TodayButton extends St.Button {
}
});
var EventsSection = GObject.registerClass(
class EventsSection extends St.Button {
_init() {
super._init({
style_class: 'events-button',
can_focus: true,
x_expand: true,
child: new St.BoxLayout({
style_class: 'events-box',
vertical: true,
x_expand: true,
}),
});
this._startDate = null;
this._endDate = null;
this._eventSource = null;
this._calendarApp = null;
this._title = new St.Label({
style_class: 'events-title',
});
this.child.add_child(this._title);
this._eventsList = new St.BoxLayout({
style_class: 'events-list',
vertical: true,
x_expand: true,
});
this.child.add_child(this._eventsList);
this._appSys = Shell.AppSystem.get_default();
this._appSys.connect('installed-changed',
this._appInstalledChanged.bind(this));
this._appInstalledChanged();
}
setDate(date) {
const day = [date.getFullYear(), date.getMonth(), date.getDate()];
this._startDate = new Date(...day);
this._endDate = new Date(...day, 23, 59, 59, 999);
this._updateTitle();
this._reloadEvents();
}
setEventSource(eventSource) {
if (!(eventSource instanceof Calendar.EventSourceBase))
throw new Error('Event source is not valid type');
this._eventSource = eventSource;
this._eventSource.connect('changed', this._reloadEvents.bind(this));
this._eventSource.connect('notify::has-calendars',
this._sync.bind(this));
this._sync();
}
_updateTitle() {
/* Translators: Shown on calendar heading when selected day occurs on current year */
const sameYearFormat = T_(NC_('calendar heading', '%B %-d'));
/* Translators: Shown on calendar heading when selected day occurs on different year */
const otherYearFormat = T_(NC_('calendar heading', '%B %-d %Y'));
const timeSpanDay = GLib.TIME_SPAN_DAY / 1000;
const now = new Date();
if (this._startDate <= now && now <= this._endDate)
this._title.text = _('Today');
else if (this._endDate < now && now - this._endDate < timeSpanDay)
this._title.text = _('Yesterday');
else if (this._startDate > now && this._startDate - now < timeSpanDay)
this._title.text = _('Tomorrow');
else if (this._startDate.getFullYear() === now.getFullYear())
this._title.text = this._startDate.toLocaleFormat(sameYearFormat);
else
this._title.text = this._startDate.toLocaleFormat(otherYearFormat);
}
_formatEventTime(event) {
const allDay = event.allDay ||
(event.date <= this._startDate && event.end >= this._endDate);
let title;
if (allDay) {
/* Translators: Shown in calendar event list for all day events
* Keep it short, best if you can use less then 10 characters
*/
title = C_('event list time', 'All Day');
} else {
let date = event.date >= this._startDate ? event.date : event.end;
title = Util.formatTime(date, { timeOnly: true });
}
const rtl = Clutter.get_default_text_direction() === Clutter.TextDirection.RTL;
if (event.date < this._startDate && !event.allDay) {
if (rtl)
title = '%s%s'.format(title, ELLIPSIS_CHAR);
else
title = '%s%s'.format(ELLIPSIS_CHAR, title);
}
if (event.end > this._endDate && !event.allDay) {
if (rtl)
title = '%s%s'.format(ELLIPSIS_CHAR, title);
else
title = '%s%s'.format(title, ELLIPSIS_CHAR);
}
return title;
}
_reloadEvents() {
if (this._eventSource.isLoading || this._reloading)
return;
this._reloading = true;
[...this._eventsList].forEach(c => c.destroy());
const events =
this._eventSource.getEvents(this._startDate, this._endDate);
for (let event of events) {
const box = new St.BoxLayout({
style_class: 'event-box',
vertical: true,
});
box.add(new St.Label({
text: event.summary,
style_class: 'event-summary',
}));
box.add(new St.Label({
text: this._formatEventTime(event),
style_class: 'event-time',
}));
this._eventsList.add_child(box);
}
if (this._eventsList.get_n_children() === 0) {
const placeholder = new St.Label({
text: _('No Events'),
style_class: 'event-placeholder',
});
this._eventsList.add_child(placeholder);
}
this._reloading = false;
this._sync();
}
vfunc_clicked() {
Main.overview.hide();
Main.panel.closeCalendar();
let appInfo = this._calendarApp;
if (appInfo.get_id() === 'org.gnome.Evolution.desktop') {
const app = this._appSys.lookup_app('evolution-calendar.desktop');
if (app)
appInfo = app.app_info;
}
appInfo.launch([], global.create_app_launch_context(0, -1));
}
_appInstalledChanged() {
const apps = Gio.AppInfo.get_recommended_for_type('text/calendar');
if (apps && (apps.length > 0)) {
const app = Gio.AppInfo.get_default_for_type('text/calendar', false);
const defaultInRecommended = apps.some(a => a.equal(app));
this._calendarApp = defaultInRecommended ? app : apps[0];
} else {
this._calendarApp = null;
}
return this._sync();
}
_sync() {
this.visible = this._eventSource && this._eventSource.hasCalendars;
this.reactive = this._calendarApp !== null;
}
});
var WorldClocksSection = GObject.registerClass(
class WorldClocksSection extends St.Button {
_init() {
@ -632,7 +818,7 @@ class DateMenuButton extends PanelMenu.Button {
this._calendar.connect('selected-date-changed', (_calendar, datetime) => {
let date = _gDateTimeToDate(datetime);
layout.frozen = !_isToday(date);
this._messageList.setDate(date);
this._eventsItem.setDate(date);
});
this.menu.connect('open-state-changed', (menu, isOpen) => {
@ -641,7 +827,7 @@ class DateMenuButton extends PanelMenu.Button {
let now = new Date();
this._calendar.setDate(now);
this._date.setDate(now);
this._messageList.setDate(now);
this._eventsItem.setDate(now);
}
});
@ -672,6 +858,9 @@ class DateMenuButton extends PanelMenu.Button {
style_class: 'datemenu-displays-box' });
this._displaysSection.add_actor(displaysBox);
this._eventsItem = new EventsSection();
displaysBox.add_child(this._eventsItem);
this._clocksItem = new WorldClocksSection();
displaysBox.add_child(this._clocksItem);
@ -697,7 +886,7 @@ class DateMenuButton extends PanelMenu.Button {
this._eventSource.destroy();
this._calendar.setEventSource(eventSource);
this._messageList.setEventSource(eventSource);
this._eventsItem.setEventSource(eventSource);
this._eventSource = eventSource;
}

View File

@ -375,19 +375,30 @@ var _Draggable = class _Draggable {
this._dragActorSource = undefined;
this._dragOrigParent = this.actor.get_parent();
this._dragOrigX = this._dragActor.x;
this._dragOrigY = this._dragActor.y;
this._dragActorHadFixedPos = this._dragActor.fixed_position_set;
this._dragOrigX = this._dragActor.allocation.x1;
this._dragOrigY = this._dragActor.allocation.y1;
this._dragOrigWidth = this._dragActor.allocation.get_width();
this._dragOrigHeight = this._dragActor.allocation.get_height();
this._dragOrigScale = this._dragActor.scale_x;
// When the actor gets reparented to the uiGroup, it will be
// allocated its preferred size, so use that size instead of the
// current allocation size.
const [, newAllocatedWidth] = this._dragActor.get_preferred_width(-1);
const [, newAllocatedHeight] = this._dragActor.get_preferred_height(-1);
const transformedAllocation =
Shell.util_get_transformed_allocation(this._dragActor);
// Set the actor's scale such that it will keep the same
// transformed size when it's reparented to the uiGroup
let [scaledWidth, scaledHeight] = this.actor.get_transformed_size();
this._dragActor.set_scale(scaledWidth / this.actor.width,
scaledHeight / this.actor.height);
this._dragActor.set_scale(
transformedAllocation.get_width() / newAllocatedWidth,
transformedAllocation.get_height() / newAllocatedHeight);
let [actorStageX, actorStageY] = this.actor.get_transformed_position();
this._dragOffsetX = actorStageX - this._dragStartX;
this._dragOffsetY = actorStageY - this._dragStartY;
this._dragOffsetX = transformedAllocation.x1 - this._dragStartX;
this._dragOffsetY = transformedAllocation.y1 - this._dragStartY;
this._dragOrigParent.remove_actor(this._dragActor);
Main.uiGroup.add_child(this._dragActor);
@ -417,6 +428,10 @@ var _Draggable = class _Draggable {
this._dragOffsetX -= transX;
this._dragOffsetY -= transY;
this._dragActor.set_position(
this._dragX + this._dragOffsetX,
this._dragY + this._dragOffsetY);
if (this._dragActorMaxSize != undefined) {
let [scaledWidth, scaledHeight] = this._dragActor.get_transformed_size();
let currentSize = Math.max(scaledWidth, scaledHeight);
@ -635,9 +650,15 @@ var _Draggable = class _Draggable {
if (parentWidth != 0)
parentScale = parentScaledWidth / parentWidth;
// Also adjust for the difference in the original actor width
// and the width it is now (children of uiGroup always get
// allocated their preferred size)
const childScaleX =
this._dragOrigWidth / this._dragActor.allocation.get_width();
x = parentX + parentScale * this._dragOrigX;
y = parentY + parentScale * this._dragOrigY;
scale = this._dragOrigScale * parentScale;
scale = this._dragOrigScale * parentScale * childScaleX;
} else {
// Snap back actor to its original stage position
x = this._snapBackX;
@ -718,7 +739,10 @@ var _Draggable = class _Draggable {
Main.uiGroup.remove_child(this._dragActor);
this._dragOrigParent.add_actor(this._dragActor);
dragActor.set_scale(this._dragOrigScale, this._dragOrigScale);
dragActor.set_position(this._dragOrigX, this._dragOrigY);
if (this._dragActorHadFixedPos)
dragActor.set_position(this._dragOrigX, this._dragOrigY);
else
dragActor.fixed_position_set = false;
} else {
dragActor.destroy();
}

View File

@ -362,6 +362,10 @@ function init() {
const Format = imports.format;
String.prototype.format = Format.format;
Math.clamp = function (x, lower, upper) {
return Math.min(Math.max(x, lower), upper);
};
}
// adjustAnimationTime:

File diff suppressed because it is too large Load Diff

View File

@ -4,7 +4,6 @@ const { Atk, Clutter, Gio, GLib,
const Main = imports.ui.main;
const MessageTray = imports.ui.messageTray;
const Calendar = imports.ui.calendar;
const Util = imports.misc.util;
var MESSAGE_ANIMATION_TIME = 100;
@ -572,7 +571,6 @@ var MessageListSection = GObject.registerClass({
Main.sessionMode.disconnect(id);
});
this._date = new Date();
this._empty = true;
this._canClear = false;
this._sync();
@ -598,13 +596,6 @@ var MessageListSection = GObject.registerClass({
return true;
}
setDate(date) {
if (Calendar.sameDay(date, this._date))
return;
this._date = date;
this._sync();
}
addMessage(message, animate) {
this.addMessageAtIndex(message, -1, animate);
}

View File

@ -2,7 +2,6 @@
const { Gio, GObject, Shell, St } = imports.gi;
const Signals = imports.signals;
const Calendar = imports.ui.calendar;
const Main = imports.ui.main;
const MessageList = imports.ui.messageList;
@ -252,10 +251,6 @@ class MediaSection extends MessageList.MessageListSection {
this._onProxyReady.bind(this));
}
_shouldShow() {
return !this.empty && Calendar.isToday(this._date);
}
get allowed() {
return !Main.sessionMode.isGreeter;
}

View File

@ -244,11 +244,11 @@ var Overview = class {
_unshadeBackgrounds() {
let backgrounds = this._backgroundGroup.get_children();
for (let i = 0; i < backgrounds.length; i++) {
backgrounds[i].ease_property('brightness', 1.0, {
backgrounds[i].ease_property('@content.brightness', 1.0, {
duration: SHADE_ANIMATION_TIME,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
});
backgrounds[i].ease_property('vignette-sharpness', 0.0, {
backgrounds[i].ease_property('@content.vignette-sharpness', 0.0, {
duration: SHADE_ANIMATION_TIME,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
});
@ -258,14 +258,16 @@ var Overview = class {
_shadeBackgrounds() {
let backgrounds = this._backgroundGroup.get_children();
for (let i = 0; i < backgrounds.length; i++) {
backgrounds[i].ease_property('brightness', Lightbox.VIGNETTE_BRIGHTNESS, {
duration: SHADE_ANIMATION_TIME,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
});
backgrounds[i].ease_property('vignette-sharpness', Lightbox.VIGNETTE_SHARPNESS, {
duration: SHADE_ANIMATION_TIME,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
});
backgrounds[i].ease_property('@content.brightness',
Lightbox.VIGNETTE_BRIGHTNESS, {
duration: SHADE_ANIMATION_TIME,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
});
backgrounds[i].ease_property('@content.vignette-sharpness',
Lightbox.VIGNETTE_SHARPNESS, {
duration: SHADE_ANIMATION_TIME,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
});
}
}
@ -575,7 +577,7 @@ var Overview = class {
this._activationTime = GLib.get_monotonic_time() / GLib.USEC_PER_SEC;
Meta.disable_unredirect_for_display(global.display);
this.viewSelector.show();
this.viewSelector.animateToOverview();
this._overview.opacity = 0;
this._overview.ease({

View File

@ -120,6 +120,10 @@ var PageIndicators = GObject.registerClass({
for (let i = 0; i < children.length; i++)
this._updateIndicator(children[i], i);
}
get nPages() {
return this._nPages;
}
});
var AnimatedPageIndicators = GObject.registerClass(

View File

@ -5,6 +5,7 @@ const { Atk, Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
const Cairo = imports.cairo;
const Animation = imports.ui.animation;
const AppDisplay = imports.ui.appDisplay;
const Config = imports.misc.config;
const CtrlAltTab = imports.ui.ctrlAltTab;
const DND = imports.ui.dnd;
@ -60,69 +61,20 @@ function _unpremultiply(color) {
return new Clutter.Color({ red, green, blue, alpha: color.alpha });
}
class AppMenu extends PopupMenu.PopupMenu {
class AppMenu extends AppDisplay.BaseAppMenu {
constructor(sourceActor) {
super(sourceActor, 0.5, St.Side.TOP);
super(sourceActor, St.Side.TOP);
this.actor.add_style_class_name('app-menu');
this._app = null;
this._appSystem = Shell.AppSystem.get_default();
this._windowsChangedId = 0;
/* Translators: This is the heading of a list of open windows */
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem(_("Open Windows")));
this._windowSection = new PopupMenu.PopupMenuSection();
this.addMenuItem(this._windowSection);
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this._newWindowItem = this.addAction(_("New Window"), () => {
this._app.open_new_window(-1);
});
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this._actionSection = new PopupMenu.PopupMenuSection();
this.addMenuItem(this._actionSection);
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this._detailsItem = this.addAction(_('Show Details'), async () => {
let id = this._app.get_id();
let args = GLib.Variant.new('(ss)', [id, '']);
const bus = await Gio.DBus.get(Gio.BusType.SESSION, null);
bus.call(
'org.gnome.Software',
'/org/gnome/Software',
'org.gtk.Actions', 'Activate',
new GLib.Variant('(sava{sv})', ['details', [args], null]),
null, 0, -1, null);
});
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this.addAction(_("Quit"), () => {
this._app.request_quit();
});
this._appSystem.connect('installed-changed', () => {
this._updateDetailsVisibility();
});
this._updateDetailsVisibility();
}
_updateDetailsVisibility() {
let sw = this._appSystem.lookup_app('org.gnome.Software.desktop');
this._detailsItem.visible = sw != null;
}
isEmpty() {
if (!this._app)
return true;
return super.isEmpty();
get app() {
return this._app;
}
setApp(app) {
@ -157,25 +109,6 @@ class AppMenu extends PopupMenu.PopupMenu {
this._newWindowItem.visible =
app && app.can_open_new_window() && !actions.includes('new-window');
}
_updateWindowsSection() {
this._windowSection.removeAll();
if (!this._app)
return;
let windows = this._app.get_windows();
windows.forEach(window => {
let title = window.title || this._app.get_name();
let item = this._windowSection.addAction(title, event => {
Main.activateWindow(window, event.get_time());
});
let id = window.connect('notify::title', () => {
item.label.text = window.title || this._app.get_name();
});
item.connect('destroy', () => window.disconnect(id));
});
}
}
/**

View File

@ -225,10 +225,6 @@ class Indicator extends PanelMenu.SystemIndicator {
}
});
function clamp(value, min, max) {
return Math.max(min, Math.min(max, value));
}
var AppAuthorizer = class {
constructor(desktopId, reqAccuracyLevel, permStoreProxy, maxAccuracyLevel) {
this.desktopId = desktopId;
@ -313,9 +309,8 @@ var AppAuthorizer = class {
_completeAuth() {
if (this._accuracyLevel != GeoclueAccuracyLevel.NONE) {
this._accuracyLevel = clamp(this._accuracyLevel,
0,
this._maxAccuracyLevel);
this._accuracyLevel = Math.clamp(this._accuracyLevel,
0, this._maxAccuracyLevel);
}
this._saveToPermissionStore();

View File

@ -28,10 +28,6 @@ const State = {
SCROLLING: 1,
};
function clamp(value, min, max) {
return Math.max(min, Math.min(max, value));
}
const TouchpadSwipeGesture = GObject.registerClass({
Properties: {
'enabled': GObject.ParamSpec.boolean(
@ -558,8 +554,8 @@ var SwipeTracker = GObject.registerClass({
let firstPoint = this._snapPoints[0];
let lastPoint = this._snapPoints[this._snapPoints.length - 1];
this._progress = clamp(this._progress, firstPoint, lastPoint);
this._progress = clamp(this._progress,
this._progress = Math.clamp(this._progress, firstPoint, lastPoint);
this._progress = Math.clamp(this._progress,
this._initialProgress - 1, this._initialProgress + 1);
this.emit('update', this._progress);
@ -606,7 +602,7 @@ var SwipeTracker = GObject.registerClass({
let duration = Math.abs((this._progress - endProgress) / velocity * DURATION_MULTIPLIER);
if (duration > 0) {
duration = clamp(duration,
duration = Math.clamp(duration,
MIN_ANIMATION_DURATION, MAX_ANIMATION_DURATION);
}

View File

@ -566,9 +566,17 @@ var UnlockDialog = GObject.registerClass({
this._otherUserButton.set_pivot_point(0.5, 0.5);
this._otherUserButton.connect('clicked', this._otherUserClicked.bind(this));
let screenSaverSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.screensaver' });
screenSaverSettings.bind('user-switch-enabled',
this._otherUserButton, 'visible', Gio.SettingsBindFlags.GET);
this._screenSaverSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.screensaver' });
this._userSwitchEnabledId = 0;
this._userSwitchEnabledId = this._screenSaverSettings.connect('changed::user-switch-enabled',
this._updateUserSwitchVisibility.bind(this));
this._userLoadedId = 0;
this._userLoadedId = this._user.connect('notify::is-loaded',
this._updateUserSwitchVisibility.bind(this));
this._updateUserSwitchVisibility();
// Main Box
let mainBox = new St.Widget();
@ -828,6 +836,21 @@ var UnlockDialog = GObject.registerClass({
this._gdmClient = null;
delete this._gdmClient;
}
if (this._userLoadedId) {
this._user.disconnect(this._userLoadedId);
this._userLoadedId = 0;
}
if (this._userSwitchEnabledId) {
this._screenSaverSettings.disconnect(this._userSwitchEnabledId);
this._userSwitchEnabledId = 0;
}
}
_updateUserSwitchVisibility() {
this._otherUserButton.visible = this._userManager.can_switch() &&
this._screenSaverSettings.get_boolean('user-switch-enabled');
}
cancel() {

View File

@ -132,6 +132,7 @@ var ViewSelector = GObject.registerClass({
super._init({
name: 'viewSelector',
x_expand: true,
visible: false,
});
this._showAppsButton = showAppsButton;
@ -271,9 +272,10 @@ var ViewSelector = GObject.registerClass({
Main.overview.show();
}
show() {
animateToOverview() {
this.show();
this.reset();
this._workspacesDisplay.show(this._showAppsButton.checked);
this._workspacesDisplay.animateToOverview(this._showAppsButton.checked);
this._activePage = null;
if (this._showAppsButton.checked)
this._showPage(this._appsPage);
@ -301,9 +303,11 @@ var ViewSelector = GObject.registerClass({
this._workspacesDisplay.setWorkspacesFullGeometry(geom);
}
hide() {
vfunc_hide() {
this.reset();
this._workspacesDisplay.hide();
super.vfunc_hide();
}
_addPage(actor, name, a11yIcon, params) {

View File

@ -1278,13 +1278,13 @@ var WindowManager = class {
}
_sizeChangeWindow(shellwm, actor, whichChange, oldFrameRect, _oldBufferRect) {
let types = [Meta.WindowType.NORMAL];
if (!this._shouldAnimateActor(actor, types)) {
shellwm.completed_size_change(actor);
return;
}
const types = [Meta.WindowType.NORMAL];
const shouldAnimate =
this._shouldAnimateActor(actor, types) &&
oldFrameRect.width > 0 &&
oldFrameRect.height > 0;
if (oldFrameRect.width > 0 && oldFrameRect.height > 0)
if (shouldAnimate)
this._prepareAnimationInfo(shellwm, actor, oldFrameRect, whichChange);
else
shellwm.completed_size_change(actor);
@ -1299,17 +1299,24 @@ var WindowManager = class {
actorClone.set_position(oldFrameRect.x, oldFrameRect.y);
actorClone.set_size(oldFrameRect.width, oldFrameRect.height);
if (this._clearAnimationInfo(actor))
actor.freeze();
if (this._clearAnimationInfo(actor)) {
log('Old animationInfo removed from actor %s'.format(actor));
this._shellwm.completed_size_change(actor);
}
let destroyId = actor.connect('destroy', () => {
this._clearAnimationInfo(actor);
});
this._resizePending.add(actor);
actor.__animationInfo = { clone: actorClone,
oldRect: oldFrameRect,
destroyId };
actor.__animationInfo = {
clone: actorClone,
oldRect: oldFrameRect,
frozen: true,
destroyId,
};
}
_sizeChangedWindow(shellwm, actor) {
@ -1362,13 +1369,17 @@ var WindowManager = class {
// Now unfreeze actor updates, to get it to the new size.
// It's important that we don't wait until the animation is completed to
// do this, otherwise our scale will be applied to the old texture size.
shellwm.completed_size_change(actor);
actor.thaw();
actor.__animationInfo.frozen = false;
}
_clearAnimationInfo(actor) {
if (actor.__animationInfo) {
actor.__animationInfo.clone.destroy();
actor.disconnect(actor.__animationInfo.destroyId);
if (actor.__animationInfo.frozen)
actor.thaw();
delete actor.__animationInfo;
return true;
}
@ -1383,10 +1394,13 @@ var WindowManager = class {
actor.translation_x = 0;
actor.translation_y = 0;
this._clearAnimationInfo(actor);
this._shellwm.completed_size_change(actor);
}
if (this._resizePending.delete(actor))
if (this._resizePending.delete(actor)) {
this._clearAnimationInfo(actor);
this._shellwm.completed_size_change(actor);
}
}
_hasAttachedDialogs(window, ignoreWindow) {
@ -2101,8 +2115,16 @@ var WindowManager = class {
newWs = workspaceManager.get_workspace_by_index(workspaceManager.n_workspaces - 1);
} else if (isNaN(target)) {
// Prepend a new workspace dynamically
if (workspaceManager.get_active_workspace_index() == 0 &&
action == 'move' && target == 'up' && this._isWorkspacePrepended == false) {
let prependTarget;
if (vertical)
prependTarget = 'up';
else if (rtl)
prependTarget = 'right';
else
prependTarget = 'left';
if (workspaceManager.get_active_workspace_index() === 0 &&
action === 'move' && target === prependTarget &&
this._isWorkspacePrepended === false) {
this.insertWorkspace(0);
this._isWorkspacePrepended = true;
}

736
js/ui/windowPreview.js Normal file
View File

@ -0,0 +1,736 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
/* exported WindowPreview */
const { Atk, Clutter, GLib, GObject,
Graphene, Meta, Pango, Shell, St } = imports.gi;
const DND = imports.ui.dnd;
var WINDOW_DND_SIZE = 256;
var WINDOW_OVERLAY_IDLE_HIDE_TIMEOUT = 750;
var WINDOW_OVERLAY_FADE_TIME = 200;
var DRAGGING_WINDOW_OPACITY = 100;
var WindowPreviewLayout = GObject.registerClass({
Properties: {
'bounding-box': GObject.ParamSpec.boxed(
'bounding-box', 'Bounding box', 'Bounding box',
GObject.ParamFlags.READABLE,
Clutter.ActorBox.$gtype),
},
}, class WindowPreviewLayout extends Clutter.LayoutManager {
_init() {
super._init();
this._container = null;
this._boundingBox = new Clutter.ActorBox();
this._windows = new Map();
}
_layoutChanged() {
let frameRect;
for (const windowInfo of this._windows.values()) {
const frame = windowInfo.metaWindow.get_frame_rect();
frameRect = frameRect ? frameRect.union(frame) : frame;
}
if (!frameRect)
frameRect = new Meta.Rectangle();
const oldBox = this._boundingBox.copy();
this._boundingBox.set_origin(frameRect.x, frameRect.y);
this._boundingBox.set_size(frameRect.width, frameRect.height);
if (!this._boundingBox.equal(oldBox))
this.notify('bounding-box');
// Always call layout_changed(), a size or position change of an
// attached dialog might not affect the boundingBox
this.layout_changed();
}
vfunc_set_container(container) {
this._container = container;
}
vfunc_get_preferred_height(_container, _forWidth) {
return [0, this._boundingBox.get_height()];
}
vfunc_get_preferred_width(_container, _forHeight) {
return [0, this._boundingBox.get_width()];
}
vfunc_allocate(container, box) {
// If the scale isn't 1, we weren't allocated our preferred size
// and have to scale the children allocations accordingly.
const scaleX = box.get_width() / this._boundingBox.get_width();
const scaleY = box.get_height() / this._boundingBox.get_height();
const childBox = new Clutter.ActorBox();
for (const child of container) {
if (!child.visible)
continue;
const windowInfo = this._windows.get(child);
if (windowInfo) {
const bufferRect = windowInfo.metaWindow.get_buffer_rect();
childBox.set_origin(
bufferRect.x - this._boundingBox.x1,
bufferRect.y - this._boundingBox.y1);
const [, , natWidth, natHeight] = child.get_preferred_size();
childBox.set_size(natWidth, natHeight);
childBox.x1 *= scaleX;
childBox.x2 *= scaleX;
childBox.y1 *= scaleY;
childBox.y2 *= scaleY;
child.allocate(childBox);
} else {
child.allocate_preferred_size();
}
}
}
/**
* addWindow:
* @param {Meta.Window} window: the MetaWindow instance
*
* Creates a ClutterActor drawing the texture of @window and adds it
* to the container. If @window is already part of the preview, this
* function will do nothing.
*
* @returns {Clutter.Actor} The newly created actor drawing @window
*/
addWindow(window) {
const index = [...this._windows.values()].findIndex(info =>
info.metaWindow === window);
if (index !== -1)
return null;
const windowActor = window.get_compositor_private();
const actor = new Clutter.Clone({ source: windowActor });
this._windows.set(actor, {
metaWindow: window,
windowActor,
sizeChangedId: window.connect('size-changed', () =>
this._layoutChanged()),
positionChangedId: window.connect('position-changed', () =>
this._layoutChanged()),
windowActorDestroyId: windowActor.connect('destroy', () =>
actor.destroy()),
destroyId: actor.connect('destroy', () =>
this.removeWindow(window)),
});
this._container.add_child(actor);
this._layoutChanged();
return actor;
}
/**
* removeWindow:
* @param {Meta.Window} window: the window to remove from the preview
*
* Removes a MetaWindow @window from the preview which has been added
* previously using addWindow(). If @window is not part of preview,
* this function will do nothing.
*/
removeWindow(window) {
const entry = [...this._windows].find(
([, i]) => i.metaWindow === window);
if (!entry)
return;
const [actor, windowInfo] = entry;
windowInfo.metaWindow.disconnect(windowInfo.sizeChangedId);
windowInfo.metaWindow.disconnect(windowInfo.positionChangedId);
windowInfo.windowActor.disconnect(windowInfo.windowActorDestroyId);
actor.disconnect(windowInfo.destroyId);
this._windows.delete(actor);
this._container.remove_child(actor);
this._layoutChanged();
}
/**
* getWindows:
*
* Gets an array of all MetaWindows that were added to the layout
* using addWindow(), ordered by the insertion order.
*
* @returns {Array} An array including all windows
*/
getWindows() {
return [...this._windows.values()].map(i => i.metaWindow);
}
// eslint-disable-next-line camelcase
get bounding_box() {
return this._boundingBox;
}
});
var WindowPreview = GObject.registerClass({
Signals: {
'drag-begin': {},
'drag-cancelled': {},
'drag-end': {},
'selected': { param_types: [GObject.TYPE_UINT] },
'show-chrome': {},
'size-changed': {},
},
}, class WindowPreview extends St.Widget {
_init(metaWindow, workspace) {
this.metaWindow = metaWindow;
this.metaWindow._delegate = this;
this._windowActor = metaWindow.get_compositor_private();
this._workspace = workspace;
super._init({
reactive: true,
can_focus: true,
accessible_role: Atk.Role.PUSH_BUTTON,
offscreen_redirect: Clutter.OffscreenRedirect.AUTOMATIC_FOR_OPACITY,
});
this._windowContainer = new Clutter.Actor();
// gjs currently can't handle setting an actors layout manager during
// the initialization of the actor if that layout manager keeps track
// of its container, so set the layout manager after creating the
// container
this._windowContainer.layout_manager = new WindowPreviewLayout();
this.add_child(this._windowContainer);
this._addWindow(metaWindow);
this._delegate = this;
this.slotId = 0;
this._stackAbove = null;
this._windowContainer.layout_manager.connect(
'notify::bounding-box', layout => {
// A bounding box of 0x0 means all windows were removed
if (layout.bounding_box.get_area() > 0)
this.emit('size-changed');
});
this._windowDestroyId =
this._windowActor.connect('destroy', () => this.destroy());
this._updateAttachedDialogs();
this.x = this.boundingBox.x;
this.y = this.boundingBox.y;
let clickAction = new Clutter.ClickAction();
clickAction.connect('clicked', () => this._activate());
clickAction.connect('long-press', this._onLongPress.bind(this));
this.add_action(clickAction);
this.connect('destroy', this._onDestroy.bind(this));
this._draggable = DND.makeDraggable(this,
{ restoreOnSuccess: true,
manualMode: true,
dragActorMaxSize: WINDOW_DND_SIZE,
dragActorOpacity: DRAGGING_WINDOW_OPACITY });
this._draggable.connect('drag-begin', this._onDragBegin.bind(this));
this._draggable.connect('drag-cancelled', this._onDragCancelled.bind(this));
this._draggable.connect('drag-end', this._onDragEnd.bind(this));
this.inDrag = false;
this._selected = false;
this._closeRequested = false;
this._idleHideOverlayId = 0;
this._border = new St.Widget({
visible: false,
style_class: 'window-clone-border',
});
this._borderConstraint = new Clutter.BindConstraint({
source: this._windowContainer,
coordinate: Clutter.BindCoordinate.SIZE,
});
this._border.add_constraint(this._borderConstraint);
this._border.add_constraint(new Clutter.AlignConstraint({
source: this._windowContainer,
align_axis: Clutter.AlignAxis.BOTH,
factor: 0.5,
}));
this._borderCenter = new Clutter.Actor();
this._border.bind_property('visible', this._borderCenter, 'visible',
GObject.BindingFlags.SYNC_CREATE);
this._borderCenterConstraint = new Clutter.BindConstraint({
source: this._windowContainer,
coordinate: Clutter.BindCoordinate.SIZE,
});
this._borderCenter.add_constraint(this._borderCenterConstraint);
this._borderCenter.add_constraint(new Clutter.AlignConstraint({
source: this._windowContainer,
align_axis: Clutter.AlignAxis.BOTH,
factor: 0.5,
}));
this._border.connect('style-changed',
this._onBorderStyleChanged.bind(this));
this._title = new St.Label({
visible: false,
style_class: 'window-caption',
text: this._getCaption(),
reactive: true,
});
this._title.add_constraint(new Clutter.BindConstraint({
source: this._borderCenter,
coordinate: Clutter.BindCoordinate.POSITION,
}));
this._title.add_constraint(new Clutter.AlignConstraint({
source: this._borderCenter,
align_axis: Clutter.AlignAxis.X_AXIS,
factor: 0.5,
}));
this._title.add_constraint(new Clutter.AlignConstraint({
source: this._borderCenter,
align_axis: Clutter.AlignAxis.Y_AXIS,
pivot_point: new Graphene.Point({ x: -1, y: 0.5 }),
factor: 1,
}));
this._title.clutter_text.ellipsize = Pango.EllipsizeMode.END;
this.label_actor = this._title;
this._updateCaptionId = this.metaWindow.connect('notify::title', () => {
this._title.text = this._getCaption();
});
const layout = Meta.prefs_get_button_layout();
this._closeButtonSide =
layout.left_buttons.includes(Meta.ButtonFunction.CLOSE)
? St.Side.LEFT : St.Side.RIGHT;
this._closeButton = new St.Button({
visible: false,
style_class: 'window-close',
child: new St.Icon({ icon_name: 'window-close-symbolic' }),
});
this._closeButton.add_constraint(new Clutter.BindConstraint({
source: this._borderCenter,
coordinate: Clutter.BindCoordinate.POSITION,
}));
this._closeButton.add_constraint(new Clutter.AlignConstraint({
source: this._borderCenter,
align_axis: Clutter.AlignAxis.X_AXIS,
pivot_point: new Graphene.Point({ x: 0.5, y: -1 }),
factor: this._closeButtonSide === St.Side.LEFT ? 0 : 1,
}));
this._closeButton.add_constraint(new Clutter.AlignConstraint({
source: this._borderCenter,
align_axis: Clutter.AlignAxis.Y_AXIS,
pivot_point: new Graphene.Point({ x: -1, y: 0.5 }),
factor: 0,
}));
this._closeButton.connect('clicked', () => this._deleteAll());
this.add_child(this._borderCenter);
this.add_child(this._border);
this.add_child(this._title);
this.add_child(this._closeButton);
}
vfunc_get_preferred_width(forHeight) {
const themeNode = this.get_theme_node();
// Only include window previews in size request, not chrome
const [minWidth, natWidth] =
this._windowContainer.get_preferred_width(
themeNode.adjust_for_height(forHeight));
return themeNode.adjust_preferred_width(minWidth, natWidth);
}
vfunc_get_preferred_height(forWidth) {
const themeNode = this.get_theme_node();
const [minHeight, natHeight] =
this._windowContainer.get_preferred_height(
themeNode.adjust_for_width(forWidth));
return themeNode.adjust_preferred_height(minHeight, natHeight);
}
vfunc_allocate(box) {
this.set_allocation(box);
for (const child of this)
child.allocate_available_size(0, 0, box.get_width(), box.get_height());
}
_onBorderStyleChanged() {
let borderNode = this._border.get_theme_node();
this._borderSize = borderNode.get_border_width(St.Side.TOP);
// Increase the size of the border actor so the border outlines
// the bounding box
this._borderConstraint.offset = this._borderSize * 2;
this._borderCenterConstraint.offset = this._borderSize;
}
_windowCanClose() {
return this.metaWindow.can_close() &&
!this._hasAttachedDialogs();
}
_getCaption() {
if (this.metaWindow.title)
return this.metaWindow.title;
let tracker = Shell.WindowTracker.get_default();
let app = tracker.get_window_app(this.metaWindow);
return app.get_name();
}
chromeHeights() {
this._border.ensure_style();
this._title.ensure_style();
const [, closeButtonHeight] = this._closeButton.get_preferred_height(-1);
const [, titleHeight] = this._title.get_preferred_height(-1);
const topOversize = (this._borderSize / 2) + (closeButtonHeight / 2);
const bottomOversize = Math.max(
this._borderSize,
(titleHeight / 2) + (this._borderSize / 2));
return [topOversize, bottomOversize];
}
chromeWidths() {
this._border.ensure_style();
const [, closeButtonWidth] = this._closeButton.get_preferred_width(-1);
const leftOversize = this._closeButtonSide === St.Side.LEFT
? (this._borderSize / 2) + (closeButtonWidth / 2)
: this._borderSize;
const rightOversize = this._closeButtonSide === St.Side.LEFT
? this._borderSize
: (this._borderSize / 2) + (closeButtonWidth / 2);
return [leftOversize, rightOversize];
}
showOverlay(animate) {
const ongoingTransition = this._border.get_transition('opacity');
// Don't do anything if we're fully visible already
if (this._border.visible && !ongoingTransition)
return;
// If we're supposed to animate and an animation in our direction
// is already happening, let that one continue
if (animate &&
ongoingTransition &&
ongoingTransition.get_interval().peek_final_value() === 255)
return;
const toShow = this._windowCanClose()
? [this._border, this._title, this._closeButton]
: [this._border, this._title];
toShow.forEach(a => {
a.opacity = 0;
a.show();
a.ease({
opacity: 255,
duration: animate ? WINDOW_OVERLAY_FADE_TIME : 0,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
});
});
this.emit('show-chrome');
}
hideOverlay(animate) {
const ongoingTransition = this._border.get_transition('opacity');
// Don't do anything if we're fully hidden already
if (!this._border.visible && !ongoingTransition)
return;
// If we're supposed to animate and an animation in our direction
// is already happening, let that one continue
if (animate &&
ongoingTransition &&
ongoingTransition.get_interval().peek_final_value() === 0)
return;
[this._border, this._title, this._closeButton].forEach(a => {
a.opacity = 255;
a.ease({
opacity: 0,
duration: animate ? WINDOW_OVERLAY_FADE_TIME : 0,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
onComplete: () => a.hide(),
});
});
}
_addWindow(metaWindow) {
const clone = this._windowContainer.layout_manager.addWindow(metaWindow);
// We expect this to be used for all interaction rather than
// the ClutterClone; as the former is reactive and the latter
// is not, this just works for most cases. However, for DND all
// actors are picked, so DND operations would operate on the clone.
// To avoid this, we hide it from pick.
Shell.util_set_hidden_from_pick(clone, true);
}
vfunc_has_overlaps() {
return this._hasAttachedDialogs();
}
_deleteAll() {
const windows = this._windowContainer.layout_manager.getWindows();
// Delete all windows, starting from the bottom-most (most-modal) one
for (const window of windows.reverse())
window.delete(global.get_current_time());
this._closeRequested = true;
}
addDialog(win) {
let parent = win.get_transient_for();
while (parent.is_attached_dialog())
parent = parent.get_transient_for();
// Display dialog if it is attached to our metaWindow
if (win.is_attached_dialog() && parent == this.metaWindow)
this._addWindow(win);
// The dialog popped up after the user tried to close the window,
// assume it's a close confirmation and leave the overview
if (this._closeRequested)
this._activate();
}
_hasAttachedDialogs() {
return this._windowContainer.layout_manager.getWindows().length > 1;
}
_updateAttachedDialogs() {
let iter = win => {
let actor = win.get_compositor_private();
if (!actor)
return false;
if (!win.is_attached_dialog())
return false;
this._addWindow(win);
win.foreach_transient(iter);
return true;
};
this.metaWindow.foreach_transient(iter);
}
get boundingBox() {
const box = this._windowContainer.layout_manager.bounding_box;
return {
x: box.x1,
y: box.y1,
width: box.get_width(),
height: box.get_height(),
};
}
get windowCenter() {
const box = this._windowContainer.layout_manager.bounding_box;
return new Graphene.Point({
x: box.get_x() + box.get_width() / 2,
y: box.get_y() + box.get_height() / 2,
});
}
// Find the actor just below us, respecting reparenting done by DND code
_getActualStackAbove() {
if (this._stackAbove == null)
return null;
if (this.inDrag) {
if (this._stackAbove._delegate)
return this._stackAbove._delegate._getActualStackAbove();
else
return null;
} else {
return this._stackAbove;
}
}
setStackAbove(actor) {
this._stackAbove = actor;
if (this.inDrag)
// We'll fix up the stack after the drag
return;
let parent = this.get_parent();
let actualAbove = this._getActualStackAbove();
if (actualAbove == null)
parent.set_child_below_sibling(this, null);
else
parent.set_child_above_sibling(this, actualAbove);
}
_onDestroy() {
this._windowActor.disconnect(this._windowDestroyId);
this.metaWindow._delegate = null;
this._delegate = null;
this.metaWindow.disconnect(this._updateCaptionId);
if (this._longPressLater) {
Meta.later_remove(this._longPressLater);
delete this._longPressLater;
}
if (this._idleHideOverlayId > 0) {
GLib.source_remove(this._idleHideOverlayId);
this._idleHideOverlayId = 0;
}
if (this.inDrag) {
this.emit('drag-end');
this.inDrag = false;
}
}
_activate() {
this._selected = true;
this.emit('selected', global.get_current_time());
}
vfunc_enter_event(crossingEvent) {
this.showOverlay(true);
return super.vfunc_enter_event(crossingEvent);
}
vfunc_leave_event(crossingEvent) {
if (this._idleHideOverlayId > 0)
GLib.source_remove(this._idleHideOverlayId);
this._idleHideOverlayId = GLib.timeout_add(
GLib.PRIORITY_DEFAULT,
WINDOW_OVERLAY_IDLE_HIDE_TIMEOUT, () => {
if (this._closeButton['has-pointer'] ||
this._title['has-pointer'])
return GLib.SOURCE_CONTINUE;
if (!this['has-pointer'])
this.hideOverlay(true);
this._idleHideOverlayId = 0;
return GLib.SOURCE_REMOVE;
});
GLib.Source.set_name_by_id(this._idleHideOverlayId, '[gnome-shell] this._idleHideOverlayId');
return super.vfunc_leave_event(crossingEvent);
}
vfunc_key_focus_in() {
super.vfunc_key_focus_in();
this.showOverlay(true);
}
vfunc_key_focus_out() {
super.vfunc_key_focus_out();
this.hideOverlay(true);
}
vfunc_key_press_event(keyEvent) {
let symbol = keyEvent.keyval;
let isEnter = symbol == Clutter.KEY_Return || symbol == Clutter.KEY_KP_Enter;
if (isEnter) {
this._activate();
return true;
}
return super.vfunc_key_press_event(keyEvent);
}
_onLongPress(action, actor, state) {
// Take advantage of the Clutter policy to consider
// a long-press canceled when the pointer movement
// exceeds dnd-drag-threshold to manually start the drag
if (state == Clutter.LongPressState.CANCEL) {
let event = Clutter.get_current_event();
this._dragTouchSequence = event.get_event_sequence();
if (this._longPressLater)
return true;
// A click cancels a long-press before any click handler is
// run - make sure to not start a drag in that case
this._longPressLater = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => {
delete this._longPressLater;
if (this._selected)
return;
let [x, y] = action.get_coords();
action.release();
this._draggable.startDrag(x, y, global.get_current_time(), this._dragTouchSequence, event.get_device());
});
} else {
this.showOverlay(true);
}
return true;
}
_onDragBegin(_draggable, _time) {
this.inDrag = true;
this.hideOverlay(false);
this.emit('drag-begin');
}
handleDragOver(source, actor, x, y, time) {
return this._workspace.handleDragOver(source, actor, x, y, time);
}
acceptDrop(source, actor, x, y, time) {
return this._workspace.acceptDrop(source, actor, x, y, time);
}
_onDragCancelled(_draggable, _time) {
this.emit('drag-cancelled');
}
_onDragEnd(_draggable, _time, _snapback) {
this.inDrag = false;
// We may not have a parent if DnD completed successfully, in
// which case our clone will shortly be destroyed and replaced
// with a new one on the target workspace.
let parent = this.get_parent();
if (parent !== null) {
if (this._stackAbove == null)
parent.set_child_below_sibling(this, null);
else
parent.set_child_above_sibling(this, this._stackAbove);
}
if (this['has-pointer'])
this.showOverlay(true);
this.emit('drag-end');
}
});

File diff suppressed because it is too large Load Diff

View File

@ -567,7 +567,8 @@ var WorkspaceThumbnail = GObject.registerClass({
if (this.state > ThumbnailState.NORMAL)
return DND.DragMotionResult.CONTINUE;
if (source.realWindow && !this._isMyWindow(source.realWindow))
if (source.metaWindow &&
!this._isMyWindow(source.metaWindow.get_compositor_private()))
return DND.DragMotionResult.MOVE_DROP;
if (source.app && source.app.can_open_new_window())
return DND.DragMotionResult.COPY_DROP;
@ -581,8 +582,8 @@ var WorkspaceThumbnail = GObject.registerClass({
if (this.state > ThumbnailState.NORMAL)
return false;
if (source.realWindow) {
let win = source.realWindow;
if (source.metaWindow) {
let win = source.metaWindow.get_compositor_private();
if (this._isMyWindow(win))
return false;
@ -795,7 +796,7 @@ var ThumbnailsBox = GObject.registerClass({
// Draggable target interface
handleDragOver(source, actor, x, y, time) {
if (!source.realWindow &&
if (!source.metaWindow &&
(!source.app || !source.app.can_open_new_window()) &&
(source.app || !source.shellWorkspaceLaunch) &&
source != Main.xdndHandler)
@ -846,7 +847,7 @@ var ThumbnailsBox = GObject.registerClass({
if (this._dropWorkspace != -1)
return this._thumbnails[this._dropWorkspace].handleDragOverInternal(source, actor, time);
else if (this._dropPlaceholderPos != -1)
return source.realWindow ? DND.DragMotionResult.MOVE_DROP : DND.DragMotionResult.COPY_DROP;
return source.metaWindow ? DND.DragMotionResult.MOVE_DROP : DND.DragMotionResult.COPY_DROP;
else
return DND.DragMotionResult.CONTINUE;
}
@ -855,12 +856,12 @@ var ThumbnailsBox = GObject.registerClass({
if (this._dropWorkspace != -1) {
return this._thumbnails[this._dropWorkspace].acceptDropInternal(source, actor, time);
} else if (this._dropPlaceholderPos != -1) {
if (!source.realWindow &&
if (!source.metaWindow &&
(!source.app || !source.app.can_open_new_window()) &&
(source.app || !source.shellWorkspaceLaunch))
return false;
let isWindow = !!source.realWindow;
let isWindow = !!source.metaWindow;
let newWorkspaceIndex;
[newWorkspaceIndex, this._dropPlaceholderPos] = [this._dropPlaceholderPos, -1];

View File

@ -393,7 +393,10 @@ class ExtraWorkspaceView extends WorkspacesViewBase {
var WorkspacesDisplay = GObject.registerClass(
class WorkspacesDisplay extends St.Widget {
_init(scrollAdjustment) {
super._init({ clip_to_allocation: true });
super._init({
visible: false,
clip_to_allocation: true,
});
this.connect('notify::allocation', this._updateWorkspacesActualGeometry.bind(this));
let workspaceManager = global.workspace_manager;
@ -450,6 +453,7 @@ class WorkspacesDisplay extends St.Widget {
this._keyPressEventId = 0;
this._scrollTimeoutId = 0;
this._actualGeometry = null;
this._fullGeometry = null;
this._inWindowDrag = false;
@ -608,15 +612,19 @@ class WorkspacesDisplay extends St.Widget {
return this._getPrimaryView().navigate_focus(from, direction, false);
}
show(fadeOnPrimary) {
animateToOverview(fadeOnPrimary) {
this.show();
this._updateWorkspacesViews();
for (let i = 0; i < this._workspacesViews.length; i++) {
let animationType;
if (fadeOnPrimary && i == this._primaryIndex)
animationType = AnimationType.FADE;
else
animationType = AnimationType.ZOOM;
this._workspacesViews[i].animateToOverview(animationType);
if (this._actualGeometry && this._fullGeometry) {
for (let i = 0; i < this._workspacesViews.length; i++) {
let animationType;
if (fadeOnPrimary && i == this._primaryIndex)
animationType = AnimationType.FADE;
else
animationType = AnimationType.ZOOM;
this._workspacesViews[i].animateToOverview(animationType);
}
}
this._restackedNotifyId =
@ -640,7 +648,7 @@ class WorkspacesDisplay extends St.Widget {
}
}
hide() {
vfunc_hide() {
if (this._restackedNotifyId > 0) {
Main.overview.disconnect(this._restackedNotifyId);
this._restackedNotifyId = 0;
@ -656,6 +664,8 @@ class WorkspacesDisplay extends St.Widget {
for (let i = 0; i < this._workspacesViews.length; i++)
this._workspacesViews[i].destroy();
this._workspacesViews = [];
super.vfunc_hide();
}
_workspacesOnlyOnPrimaryChanged() {
@ -690,8 +700,10 @@ class WorkspacesDisplay extends St.Widget {
this._workspacesViews.forEach(v => v.show());
this._updateWorkspacesFullGeometry();
this._updateWorkspacesActualGeometry();
if (this._fullGeometry)
this._syncWorkspacesFullGeometry();
if (this._actualGeometry)
this._syncWorkspacesActualGeometry();
}
_getMonitorIndexForEvent(event) {
@ -743,10 +755,10 @@ class WorkspacesDisplay extends St.Widget {
// the sliding controls were never slid in at all.
setWorkspacesFullGeometry(geom) {
this._fullGeometry = geom;
this._updateWorkspacesFullGeometry();
this._syncWorkspacesFullGeometry();
}
_updateWorkspacesFullGeometry() {
_syncWorkspacesFullGeometry() {
if (!this._workspacesViews.length)
return;
@ -758,18 +770,21 @@ class WorkspacesDisplay extends St.Widget {
}
_updateWorkspacesActualGeometry() {
const [x, y] = this.get_transformed_position();
const width = this.allocation.get_width();
const height = this.allocation.get_height();
this._actualGeometry = { x, y, width, height };
this._syncWorkspacesActualGeometry();
}
_syncWorkspacesActualGeometry() {
if (!this._workspacesViews.length)
return;
let [x, y] = this.get_transformed_position();
let allocation = this.allocation;
let width = allocation.x2 - allocation.x1;
let height = allocation.y2 - allocation.y1;
let primaryGeometry = { x, y, width, height };
let monitors = Main.layoutManager.monitors;
for (let i = 0; i < monitors.length; i++) {
let geometry = i == this._primaryIndex ? primaryGeometry : monitors[i];
let geometry = i === this._primaryIndex ? this._actualGeometry : monitors[i];
this._workspacesViews[i].setActualGeometry(geometry);
}
}

1
mutter Submodule

Submodule mutter added at 1551b6d386

255
po/ca.po
View File

@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: HEAD\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-05-14 17:40+0000\n"
"POT-Creation-Date: 2020-06-05 23:11+0000\n"
"PO-Revision-Date: 2020-05-15 20:39+0200\n"
"Last-Translator: Robert Antoni Buj Gelonch <rbuj@fedoraproject.org>\n"
"Language-Team: Catalan <tradgnome@softcatala.org>\n"
@ -592,7 +592,7 @@ msgid_plural "%d hours ago"
msgstr[0] "fa %d hora"
msgstr[1] "fa %d hores"
#: js/misc/util.js:191
#: js/misc/util.js:191 js/ui/dateMenu.js:162
msgid "Yesterday"
msgstr "Ahir"
@ -712,56 +712,44 @@ msgstr ""
#. No support for non-modal system dialogs, so ignore the option
#. let modal = options['modal'] || true;
#: js/ui/accessDialog.js:39 js/ui/status/location.js:374
#: js/ui/accessDialog.js:39 js/ui/status/location.js:369
msgid "Deny Access"
msgstr "Denega l'accés"
#: js/ui/accessDialog.js:40 js/ui/status/location.js:377
#: js/ui/accessDialog.js:40 js/ui/status/location.js:372
msgid "Grant Access"
msgstr "Permet l'accés"
#: js/ui/appDisplay.js:944
#: js/ui/appDisplay.js:956
msgid "Unnamed Folder"
msgstr "Carpeta sense nom"
#: js/ui/appDisplay.js:967
msgid "Frequently used applications will appear here"
msgstr "Les aplicacions utilitzades freqüentment apareixeran aquí"
#: js/ui/appDisplay.js:1102
msgid "Frequent"
msgstr "Freqüent"
#: js/ui/appDisplay.js:1109
msgid "All"
msgstr "Totes"
#. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2486 js/ui/panel.js:75
#: js/ui/appDisplay.js:2215 js/ui/panel.js:75
msgid "Open Windows"
msgstr "Obre finestres"
#: js/ui/appDisplay.js:2505 js/ui/panel.js:82
#: js/ui/appDisplay.js:2234 js/ui/panel.js:82
msgid "New Window"
msgstr "Finestra nova"
#: js/ui/appDisplay.js:2521
#: js/ui/appDisplay.js:2250
msgid "Launch using Integrated Graphics Card"
msgstr "Inicia usant una targeta gràfica integrada"
#: js/ui/appDisplay.js:2522
#: js/ui/appDisplay.js:2251
msgid "Launch using Discrete Graphics Card"
msgstr "Inicia usant una targeta gràfica discretaa"
msgstr "Inicia usant una targeta gràfica discreta"
#: js/ui/appDisplay.js:2550 js/ui/dash.js:239
#: js/ui/appDisplay.js:2279 js/ui/dash.js:239
msgid "Remove from Favorites"
msgstr "Suprimeix dels preferits"
#: js/ui/appDisplay.js:2556
#: js/ui/appDisplay.js:2285
msgid "Add to Favorites"
msgstr "Afegeix als preferits"
#: js/ui/appDisplay.js:2566 js/ui/panel.js:93
#: js/ui/appDisplay.js:2295 js/ui/panel.js:93
msgid "Show Details"
msgstr "Mostra els detalls"
@ -791,7 +779,7 @@ msgstr "Auriculars"
msgid "Headset"
msgstr "Auriculars amb micròfon"
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:270
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:273
msgid "Microphone"
msgstr "Micròfon"
@ -808,7 +796,7 @@ msgid "Settings"
msgstr "Paràmetres"
#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday).
#: js/ui/calendar.js:41
#: js/ui/calendar.js:36
msgctxt "calendar-no-work"
msgid "06"
msgstr "06"
@ -818,43 +806,43 @@ msgstr "06"
#. * NOTE: These grid abbreviations are always shown together
#. * and in order, e.g. "S M T W T F S".
#.
#: js/ui/calendar.js:70
#: js/ui/calendar.js:65
msgctxt "grid sunday"
msgid "S"
msgstr "Dg"
#. Translators: Calendar grid abbreviation for Monday
#: js/ui/calendar.js:72
#: js/ui/calendar.js:67
msgctxt "grid monday"
msgid "M"
msgstr "Dl"
#. Translators: Calendar grid abbreviation for Tuesday
#: js/ui/calendar.js:74
#: js/ui/calendar.js:69
msgctxt "grid tuesday"
msgid "T"
msgstr "Dt"
#. Translators: Calendar grid abbreviation for Wednesday
#: js/ui/calendar.js:76
#: js/ui/calendar.js:71
msgctxt "grid wednesday"
msgid "W"
msgstr "Dc"
#. Translators: Calendar grid abbreviation for Thursday
#: js/ui/calendar.js:78
#: js/ui/calendar.js:73
msgctxt "grid thursday"
msgid "T"
msgstr "Dj"
#. Translators: Calendar grid abbreviation for Friday
#: js/ui/calendar.js:80
#: js/ui/calendar.js:75
msgctxt "grid friday"
msgid "F"
msgstr "Dv"
#. Translators: Calendar grid abbreviation for Saturday
#: js/ui/calendar.js:82
#: js/ui/calendar.js:77
msgctxt "grid saturday"
msgid "S"
msgstr "Ds"
@ -865,7 +853,7 @@ msgstr "Ds"
#. * "%OB" is the new format specifier introduced in glibc 2.27,
#. * in most cases you should not change it.
#.
#: js/ui/calendar.js:397
#: js/ui/calendar.js:392
msgid "%OB"
msgstr "%OB"
@ -878,61 +866,37 @@ msgstr "%OB"
#. * in most cases you should not use the old "%B" here unless you
#. * absolutely know what you are doing.
#.
#: js/ui/calendar.js:407
#: js/ui/calendar.js:402
msgid "%OB %Y"
msgstr "%OB de %Y"
#: js/ui/calendar.js:466
#: js/ui/calendar.js:461
msgid "Previous month"
msgstr "Mes anterior"
#: js/ui/calendar.js:481
#: js/ui/calendar.js:476
msgid "Next month"
msgstr "Mes següent"
#: js/ui/calendar.js:631
#: js/ui/calendar.js:626
#, no-javascript-format
msgctxt "date day number format"
msgid "%d"
msgstr "%-d"
#: js/ui/calendar.js:687
#: js/ui/calendar.js:682
msgid "Week %V"
msgstr "Setmana %-V"
#. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters
#.
#: js/ui/calendar.js:762
msgctxt "event list time"
msgid "All Day"
msgstr "Tot el dia"
#. Translators: Shown on calendar heading when selected day occurs on current year
#: js/ui/calendar.js:900
msgctxt "calendar heading"
msgid "%A, %B %-d"
msgstr "%A %-d %B"
#. Translators: Shown on calendar heading when selected day occurs on different year
#: js/ui/calendar.js:903
msgctxt "calendar heading"
msgid "%A, %B %-d, %Y"
msgstr "%A %d %B de %Y"
#: js/ui/calendar.js:1133
#: js/ui/calendar.js:895
msgid "No Notifications"
msgstr "Cap notificació"
#: js/ui/calendar.js:1136
msgid "No Events"
msgstr "Cap cita"
#: js/ui/calendar.js:1190
#: js/ui/calendar.js:949
msgid "Do Not Disturb"
msgstr "No molesteu"
#: js/ui/calendar.js:1209
#: js/ui/calendar.js:968
msgid "Clear"
msgstr "Neteja-ho"
@ -1086,7 +1050,7 @@ msgstr "No ha funcionat. Torneu-ho a provar."
msgid "%s is now known as %s"
msgstr "En/na %s ara es diu %s"
#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:177
#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:178
msgid "Windows"
msgstr "Finestres"
@ -1105,7 +1069,7 @@ msgstr "Quadre d'aplicacions"
#. * "Tue 9:29 AM"). The string itself should become a full date, e.g.,
#. * "February 17 2015".
#.
#: js/ui/dateMenu.js:75
#: js/ui/dateMenu.js:79
msgid "%B %-d %Y"
msgstr "%-d %B de %Y"
@ -1113,35 +1077,67 @@ msgstr "%-d %B de %Y"
#. * below the time in the shell; it should combine the weekday and the
#. * date, e.g. "Tuesday February 17 2015".
#.
#: js/ui/dateMenu.js:82
#: js/ui/dateMenu.js:86
msgid "%A %B %e %Y"
msgstr "%A, %-e %B de %Y"
#: js/ui/dateMenu.js:161
#. Translators: Shown on calendar heading when selected day occurs on current year
#: js/ui/dateMenu.js:151
msgctxt "calendar heading"
msgid "%B %-d"
msgstr "%-d %B"
#. Translators: Shown on calendar heading when selected day occurs on different year
#: js/ui/dateMenu.js:154
msgctxt "calendar heading"
msgid "%B %-d %Y"
msgstr "%-d %B de %Y"
#: js/ui/dateMenu.js:160
msgid "Today"
msgstr "Avui"
#: js/ui/dateMenu.js:164
msgid "Tomorrow"
msgstr "Demà"
#. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters
#.
#: js/ui/dateMenu.js:180
msgctxt "event list time"
msgid "All Day"
msgstr "Tot el dia"
#: js/ui/dateMenu.js:231
msgid "No Events"
msgstr "Cap cita"
#: js/ui/dateMenu.js:348
msgid "Add world clocks…"
msgstr "Afegeix rellotges del món…"
#: js/ui/dateMenu.js:162
#: js/ui/dateMenu.js:349
msgid "World Clocks"
msgstr "Rellotges del món"
#: js/ui/dateMenu.js:424
#: js/ui/dateMenu.js:629
msgid "Loading…"
msgstr "S'està carregant…"
#: js/ui/dateMenu.js:434
#: js/ui/dateMenu.js:639
msgid "Go online for weather information"
msgstr "Vés en línia per a informació sobre el temps"
#: js/ui/dateMenu.js:436
#: js/ui/dateMenu.js:641
msgid "Weather information is currently unavailable"
msgstr "La informació sobre el temps no està disponible"
#: js/ui/dateMenu.js:446
#: js/ui/dateMenu.js:651
msgid "Weather"
msgstr "El temps"
#: js/ui/dateMenu.js:448
#: js/ui/dateMenu.js:653
msgid "Select weather location…"
msgstr "Trieu una ubicació pel temps…"
@ -1310,11 +1306,11 @@ msgstr "Instal·la l'extensió"
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "Voleu baixar i instal·lar «%s» d'extensions.gnome.org?"
#: js/ui/extensionSystem.js:251
#: js/ui/extensionSystem.js:252
msgid "Extension Updates Available"
msgstr "No hi ha cap actualització d'extensions disponible"
#: js/ui/extensionSystem.js:252
#: js/ui/extensionSystem.js:253
msgid "Extension updates are ready to be installed."
msgstr ""
"Les actualitzacions de les extensions estan preparades per a ser "
@ -1446,6 +1442,7 @@ msgid "Disabled"
msgstr "Inhabilitat"
#: js/ui/lookingGlass.js:743
#: subprojects/extensions-app/data/ui/extension-row.ui:188
msgid "Error"
msgstr "Error"
@ -1489,11 +1486,11 @@ msgstr "El bloqueig de pantalla requereix el gestor de pantalla del GNOME."
msgid "System Information"
msgstr "Informació de l'ordinador"
#: js/ui/mpris.js:204
#: js/ui/mpris.js:203
msgid "Unknown artist"
msgstr "Artista desconegut"
#: js/ui/mpris.js:214
#: js/ui/mpris.js:213
msgid "Unknown title"
msgstr "Títol desconegut"
@ -1539,23 +1536,23 @@ msgstr "Assigna la pulsació de tecla"
msgid "Done"
msgstr "Fet"
#: js/ui/padOsd.js:745
#: js/ui/padOsd.js:732
msgid "Edit…"
msgstr "Edita…"
#: js/ui/padOsd.js:787 js/ui/padOsd.js:910
#: js/ui/padOsd.js:774 js/ui/padOsd.js:891
msgid "None"
msgstr "Cap"
#: js/ui/padOsd.js:863
#: js/ui/padOsd.js:845
msgid "Press a button to configure"
msgstr "Premeu un botó per a configurar"
#: js/ui/padOsd.js:864
#: js/ui/padOsd.js:846
msgid "Press Esc to exit"
msgstr "Premeu Esc per a sortir"
#: js/ui/padOsd.js:867
#: js/ui/padOsd.js:849
msgid "Press any key to exit"
msgstr "Premeu qualsevol tecla per a sortir"
@ -1613,15 +1610,15 @@ msgstr "No es pot blocar"
msgid "Lock was blocked by an application"
msgstr "Una aplicació està bloquejant el bloqueig"
#: js/ui/search.js:702
#: js/ui/search.js:823
msgid "Searching…"
msgstr "S'està cercant…"
#: js/ui/search.js:704
#: js/ui/search.js:825
msgid "No results."
msgstr "No s'ha trobat cap resultat."
#: js/ui/search.js:830
#: js/ui/search.js:951
#, javascript-format
msgid "%d more"
msgid_plural "%d more"
@ -1818,17 +1815,17 @@ msgstr "Ubicació inhabilitada"
msgid "Enable"
msgstr "Habilita"
#: js/ui/status/location.js:355
#: js/ui/status/location.js:350
msgid "Allow location access"
msgstr "Permet accés a la ubicació"
#. Translators: %s is an application name
#: js/ui/status/location.js:357
#: js/ui/status/location.js:352
#, javascript-format
msgid "The app %s wants to access your location"
msgstr "L'aplicació %s vol accedir a la vostra ubicació"
#: js/ui/status/location.js:367
#: js/ui/status/location.js:362
msgid "Location access can be changed at any time from the privacy settings."
msgstr ""
"Podeu canviar la configuració de l'accés a la ubicació sempre que vulgueu "
@ -1940,7 +1937,8 @@ msgstr "La xarxa sense fil està desactivada"
#: js/ui/status/network.js:823
msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr "S'ha d'activar la xarxa sense fil per a poder-se connectar a una xarxa."
msgstr ""
"S'ha d'activar la xarxa sense fil per a poder-se connectar a una xarxa."
#: js/ui/status/network.js:824
msgid "Turn On Wi-Fi"
@ -2166,11 +2164,11 @@ msgstr "S'ha produït un error d'autorització a Thunderbolt"
msgid "Could not authorize the Thunderbolt device: %s"
msgstr "No s'ha pogut autoritzar el dispositiu Thunderbolt: %s"
#: js/ui/status/volume.js:151
#: js/ui/status/volume.js:154
msgid "Volume changed"
msgstr "S'ha canviat el volum"
#: js/ui/status/volume.js:222
#: js/ui/status/volume.js:225
msgid "Volume"
msgstr "Volum"
@ -2224,11 +2222,11 @@ msgstr "Desbloqueja la finestra"
msgid "Log in as another user"
msgstr "Entra amb un altre usuari"
#: js/ui/viewSelector.js:181
#: js/ui/viewSelector.js:182
msgid "Applications"
msgstr "Aplicacions"
#: js/ui/viewSelector.js:185
#: js/ui/viewSelector.js:186
msgid "Search"
msgstr "Cerca"
@ -2438,26 +2436,34 @@ msgid_plural "%d extensions will be updated on next login."
msgstr[0] "%d extensió serà actualitzada la següent vegada que entreu."
msgstr[1] "%d extensions seran actualitzades la següent vegada que entreu."
#: subprojects/extensions-app/data/ui/extension-row.ui:100
#: subprojects/extensions-tool/src/command-create.c:301
#: subprojects/extensions-app/js/main.js:461
msgid "The extension is incompatible with the current GNOME version"
msgstr "L'extensió és incompatible amb la versió actual del GNOME"
#: subprojects/extensions-app/js/main.js:464
msgid "The extension had an error"
msgstr "L'extensió ha tingut un error"
#: subprojects/extensions-app/data/ui/extension-row.ui:109
#: subprojects/extensions-tool/src/command-create.c:325
#: subprojects/extensions-tool/src/main.c:241
msgid "Description"
msgstr "Descripció"
#: subprojects/extensions-app/data/ui/extension-row.ui:123
#: subprojects/extensions-app/data/ui/extension-row.ui:132
#: subprojects/extensions-tool/src/main.c:253
msgid "Version"
msgstr "Versió"
#: subprojects/extensions-app/data/ui/extension-row.ui:151
#: subprojects/extensions-app/data/ui/extension-row.ui:160
msgid "Author"
msgstr "Autoria"
#: subprojects/extensions-app/data/ui/extension-row.ui:175
#: subprojects/extensions-app/data/ui/extension-row.ui:216
msgid "Website"
msgstr "Lloc web"
#: subprojects/extensions-app/data/ui/extension-row.ui:192
#: subprojects/extensions-app/data/ui/extension-row.ui:233
msgid "Remove…"
msgstr "Suprimeix…"
@ -2474,8 +2480,8 @@ msgid ""
"To find and add extensions, visit <a href=\"https://extensions.gnome.org"
"\">extensions.gnome.org</a>."
msgstr ""
"Per a visitar i afegir extensions, visiteu <a href=\"https://extensions.gnome."
"org\">extensions.gnome.org</a>."
"Per a visitar i afegir extensions, visiteu <a href=\"https://extensions."
"gnome.org\">extensions.gnome.org</a>."
#: subprojects/extensions-app/data/ui/extensions-window.ui:35
msgid "Warning"
@ -2520,12 +2526,12 @@ msgid "Log Out…"
msgstr "Surt…"
#. Translators: a file path to an extension directory
#: subprojects/extensions-tool/src/command-create.c:202
#: subprojects/extensions-tool/src/command-create.c:226
#, c-format
msgid "The new extension was successfully created in %s.\n"
msgstr "L'extensió nova s'ha creat amb èxit a %s.\n"
#: subprojects/extensions-tool/src/command-create.c:275
#: subprojects/extensions-tool/src/command-create.c:299
#, c-format
msgid ""
"Name should be a very short (ideally descriptive) string.\n"
@ -2534,12 +2540,12 @@ msgstr ""
"El nom ha de ser una cadena molt curta (idealment descriptiva).\n"
"Per exemple: %s"
#: subprojects/extensions-tool/src/command-create.c:281
#: subprojects/extensions-tool/src/command-create.c:305
#: subprojects/extensions-tool/src/main.c:238
msgid "Name"
msgstr "Nom"
#: subprojects/extensions-tool/src/command-create.c:295
#: subprojects/extensions-tool/src/command-create.c:319
#, c-format
msgid ""
"Description is a single-sentence explanation of what your extension does.\n"
@ -2548,7 +2554,7 @@ msgstr ""
"La descripció és una explicació d'una frase de què fa l'extensió.\n"
"Per exemple: %s"
#: subprojects/extensions-tool/src/command-create.c:315
#: subprojects/extensions-tool/src/command-create.c:339
msgid ""
"UUID is a globally-unique identifier for your extension.\n"
"This should be in the format of an email address (clicktofocus@janedoe."
@ -2557,56 +2563,56 @@ msgstr ""
"L'UUID és un identificador únic global per l'extensió\n"
"Ha de tenir el format d'una adreça de correu (exemple@softcatala.org)\n"
#: subprojects/extensions-tool/src/command-create.c:342
#: subprojects/extensions-tool/src/command-create.c:366
msgid "Choose one of the available templates:\n"
msgstr "Trieu una de les plantilles disponibles:\n"
#: subprojects/extensions-tool/src/command-create.c:356
#: subprojects/extensions-tool/src/command-create.c:380
msgid "Template"
msgstr "Plantilla"
#: subprojects/extensions-tool/src/command-create.c:411
#: subprojects/extensions-tool/src/command-create.c:435
msgid "The unique identifier of the new extension"
msgstr "L'identificador únic de l'extensió nova"
#: subprojects/extensions-tool/src/command-create.c:414
#: subprojects/extensions-tool/src/command-create.c:438
msgid "NAME"
msgstr "NOM"
#: subprojects/extensions-tool/src/command-create.c:415
#: subprojects/extensions-tool/src/command-create.c:439
msgid "The user-visible name of the new extension"
msgstr "El nom visible a l'usuari de l'extensió nova"
#: subprojects/extensions-tool/src/command-create.c:417
#: subprojects/extensions-tool/src/command-create.c:441
msgid "DESCRIPTION"
msgstr "DESCRIPCIÓ"
#: subprojects/extensions-tool/src/command-create.c:419
#: subprojects/extensions-tool/src/command-create.c:443
msgid "A short description of what the extension does"
msgstr "Una descripció curta del que fa l'extensió"
#: subprojects/extensions-tool/src/command-create.c:422
#: subprojects/extensions-tool/src/command-create.c:446
msgid "TEMPLATE"
msgstr "PLANTILLA"
#: subprojects/extensions-tool/src/command-create.c:423
#: subprojects/extensions-tool/src/command-create.c:447
msgid "The template to use for the new extension"
msgstr "La plantilla a usar per a l'extensió nova"
#: subprojects/extensions-tool/src/command-create.c:429
#: subprojects/extensions-tool/src/command-create.c:453
msgid "Enter extension information interactively"
msgstr "Introduïu la informació de l'extensió interactivament"
#: subprojects/extensions-tool/src/command-create.c:437
#: subprojects/extensions-tool/src/command-create.c:461
msgid "Create a new extension"
msgstr "Crea una extensió nova"
#: subprojects/extensions-tool/src/command-create.c:455
#: subprojects/extensions-tool/src/command-create.c:479
#: subprojects/extensions-tool/src/command-list.c:172
msgid "Unknown arguments"
msgstr "Arguments desconeguts"
#: subprojects/extensions-tool/src/command-create.c:480
#: subprojects/extensions-tool/src/command-create.c:504
msgid "UUID, name and description are required"
msgstr "Calen l'UUID, el nom i la descripció"
@ -2792,7 +2798,7 @@ msgstr "Desinstal·la una extensió"
#: subprojects/extensions-tool/src/main.c:72
msgid "Do not print error messages"
msgstr "No imprimeixis els missatges d'error "
msgstr "No imprimeixis els missatges d'error"
#: subprojects/extensions-tool/src/main.c:146
msgid "Failed to connect to GNOME Shell"
@ -2927,3 +2933,4 @@ msgstr[1] "%u entrades"
#: subprojects/gvc/gvc-mixer-control.c:2766
msgid "System Sounds"
msgstr "Sons del sistema"

286
po/es.po
View File

@ -9,8 +9,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell.master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-05-07 13:09+0000\n"
"PO-Revision-Date: 2020-05-07 16:46+0200\n"
"POT-Creation-Date: 2020-06-05 23:11+0000\n"
"PO-Revision-Date: 2020-06-08 16:06+0200\n"
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
"Language-Team: Spanish - Spain <gnome-es-list@gnome.org>\n"
"Language: es_ES\n"
@ -431,7 +431,7 @@ msgstr "Visitar la página web de la extensión"
#: js/ui/components/networkAgent.js:110 js/ui/components/polkitAgent.js:139
#: js/ui/endSessionDialog.js:369 js/ui/extensionDownloader.js:181
#: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386
#: js/ui/status/network.js:916 subprojects/extensions-app/js/main.js:148
#: js/ui/status/network.js:916 subprojects/extensions-app/js/main.js:149
msgid "Cancel"
msgstr "Cancelar"
@ -587,7 +587,7 @@ msgid_plural "%d hours ago"
msgstr[0] "Hace %d hora"
msgstr[1] "Hace %d horas"
#: js/misc/util.js:191
#: js/misc/util.js:191 js/ui/dateMenu.js:162
msgid "Yesterday"
msgstr "Ayer"
@ -706,56 +706,44 @@ msgstr ""
#. No support for non-modal system dialogs, so ignore the option
#. let modal = options['modal'] || true;
#: js/ui/accessDialog.js:39 js/ui/status/location.js:374
#: js/ui/accessDialog.js:39 js/ui/status/location.js:369
msgid "Deny Access"
msgstr "Denegar acceso"
#: js/ui/accessDialog.js:40 js/ui/status/location.js:377
#: js/ui/accessDialog.js:40 js/ui/status/location.js:372
msgid "Grant Access"
msgstr "Conceder acceso"
#: js/ui/appDisplay.js:943
#: js/ui/appDisplay.js:956
msgid "Unnamed Folder"
msgstr "Carpeta sin nombre"
#: js/ui/appDisplay.js:966
msgid "Frequently used applications will appear here"
msgstr "Las aplicaciones usadas frecuentemente aparecerán aquí"
#: js/ui/appDisplay.js:1101
msgid "Frequent"
msgstr "Frecuentes"
#: js/ui/appDisplay.js:1108
msgid "All"
msgstr "Todas"
#. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2485 js/ui/panel.js:75
#: js/ui/appDisplay.js:2215 js/ui/panel.js:75
msgid "Open Windows"
msgstr "Ventanas abiertas"
#: js/ui/appDisplay.js:2504 js/ui/panel.js:82
#: js/ui/appDisplay.js:2234 js/ui/panel.js:82
msgid "New Window"
msgstr "Ventana nueva"
#: js/ui/appDisplay.js:2520
#: js/ui/appDisplay.js:2250
msgid "Launch using Integrated Graphics Card"
msgstr "Lanzar usando la tarjeta gráfica integrada"
#: js/ui/appDisplay.js:2521
#: js/ui/appDisplay.js:2251
msgid "Launch using Discrete Graphics Card"
msgstr "Lanzar usando la tarjeta gráfica discreta"
#: js/ui/appDisplay.js:2549 js/ui/dash.js:239
#: js/ui/appDisplay.js:2279 js/ui/dash.js:239
msgid "Remove from Favorites"
msgstr "Quitar de los favoritos"
#: js/ui/appDisplay.js:2555
#: js/ui/appDisplay.js:2285
msgid "Add to Favorites"
msgstr "Añadir a los favoritos"
#: js/ui/appDisplay.js:2565 js/ui/panel.js:93
#: js/ui/appDisplay.js:2295 js/ui/panel.js:93
msgid "Show Details"
msgstr "Mostrar detalles"
@ -785,7 +773,7 @@ msgstr "Auriculares"
msgid "Headset"
msgstr "Manos libres"
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:270
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:273
msgid "Microphone"
msgstr "Micrófono"
@ -802,7 +790,7 @@ msgid "Settings"
msgstr "Configuración"
#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday).
#: js/ui/calendar.js:41
#: js/ui/calendar.js:36
msgctxt "calendar-no-work"
msgid "06"
msgstr "06"
@ -812,43 +800,43 @@ msgstr "06"
#. * NOTE: These grid abbreviations are always shown together
#. * and in order, e.g. "S M T W T F S".
#.
#: js/ui/calendar.js:70
#: js/ui/calendar.js:65
msgctxt "grid sunday"
msgid "S"
msgstr "D"
#. Translators: Calendar grid abbreviation for Monday
#: js/ui/calendar.js:72
#: js/ui/calendar.js:67
msgctxt "grid monday"
msgid "M"
msgstr "L"
#. Translators: Calendar grid abbreviation for Tuesday
#: js/ui/calendar.js:74
#: js/ui/calendar.js:69
msgctxt "grid tuesday"
msgid "T"
msgstr "M"
#. Translators: Calendar grid abbreviation for Wednesday
#: js/ui/calendar.js:76
#: js/ui/calendar.js:71
msgctxt "grid wednesday"
msgid "W"
msgstr "X"
#. Translators: Calendar grid abbreviation for Thursday
#: js/ui/calendar.js:78
#: js/ui/calendar.js:73
msgctxt "grid thursday"
msgid "T"
msgstr "J"
#. Translators: Calendar grid abbreviation for Friday
#: js/ui/calendar.js:80
#: js/ui/calendar.js:75
msgctxt "grid friday"
msgid "F"
msgstr "V"
#. Translators: Calendar grid abbreviation for Saturday
#: js/ui/calendar.js:82
#: js/ui/calendar.js:77
msgctxt "grid saturday"
msgid "S"
msgstr "S"
@ -859,7 +847,7 @@ msgstr "S"
#. * "%OB" is the new format specifier introduced in glibc 2.27,
#. * in most cases you should not change it.
#.
#: js/ui/calendar.js:397
#: js/ui/calendar.js:392
msgid "%OB"
msgstr "%OB"
@ -872,61 +860,37 @@ msgstr "%OB"
#. * in most cases you should not use the old "%B" here unless you
#. * absolutely know what you are doing.
#.
#: js/ui/calendar.js:407
#: js/ui/calendar.js:402
msgid "%OB %Y"
msgstr "%OB de %Y"
#: js/ui/calendar.js:466
#: js/ui/calendar.js:461
msgid "Previous month"
msgstr "Mes anterior"
#: js/ui/calendar.js:481
#: js/ui/calendar.js:476
msgid "Next month"
msgstr "Siguiente mes"
#: js/ui/calendar.js:631
#: js/ui/calendar.js:626
#, no-javascript-format
msgctxt "date day number format"
msgid "%d"
msgstr "%d"
#: js/ui/calendar.js:687
#: js/ui/calendar.js:682
msgid "Week %V"
msgstr "Semana %V"
#. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters
#.
#: js/ui/calendar.js:762
msgctxt "event list time"
msgid "All Day"
msgstr "Todo el día"
#. Translators: Shown on calendar heading when selected day occurs on current year
#: js/ui/calendar.js:900
msgctxt "calendar heading"
msgid "%A, %B %-d"
msgstr "%A, %d de %B"
#. Translators: Shown on calendar heading when selected day occurs on different year
#: js/ui/calendar.js:903
msgctxt "calendar heading"
msgid "%A, %B %-d, %Y"
msgstr "%A, %d de %B de %Y"
#: js/ui/calendar.js:1133
#: js/ui/calendar.js:895
msgid "No Notifications"
msgstr "No hay notificaciones"
#: js/ui/calendar.js:1136
msgid "No Events"
msgstr "No hay eventos"
#: js/ui/calendar.js:1190
#: js/ui/calendar.js:949
msgid "Do Not Disturb"
msgstr "No molestar"
#: js/ui/calendar.js:1209
#: js/ui/calendar.js:968
msgid "Clear"
msgstr "Limpiar"
@ -1080,7 +1044,7 @@ msgstr "Eso no ha funcionado. Inténtelo de nuevo."
msgid "%s is now known as %s"
msgstr "Ahora %s se llama %s"
#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:177
#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:178
msgid "Windows"
msgstr "Ventanas"
@ -1099,7 +1063,7 @@ msgstr "Tablero"
#. * "Tue 9:29 AM"). The string itself should become a full date, e.g.,
#. * "February 17 2015".
#.
#: js/ui/dateMenu.js:75
#: js/ui/dateMenu.js:79
msgid "%B %-d %Y"
msgstr "%B %e %Y"
@ -1107,35 +1071,69 @@ msgstr "%B %e %Y"
#. * below the time in the shell; it should combine the weekday and the
#. * date, e.g. "Tuesday February 17 2015".
#.
#: js/ui/dateMenu.js:82
#: js/ui/dateMenu.js:86
msgid "%A %B %e %Y"
msgstr "%A %e de %B de %Y"
#: js/ui/dateMenu.js:161
#. Translators: Shown on calendar heading when selected day occurs on current year
#: js/ui/dateMenu.js:151
#| msgid "%B %-d %Y"
msgctxt "calendar heading"
msgid "%B %-d"
msgstr "%B %-d"
#. Translators: Shown on calendar heading when selected day occurs on different year
#: js/ui/dateMenu.js:154
#| msgid "%B %-d %Y"
msgctxt "calendar heading"
msgid "%B %-d %Y"
msgstr "%B %-d %Y"
#: js/ui/dateMenu.js:160
msgid "Today"
msgstr "Hoy"
#: js/ui/dateMenu.js:164
msgid "Tomorrow"
msgstr "Mañana"
#. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters
#.
#: js/ui/dateMenu.js:180
msgctxt "event list time"
msgid "All Day"
msgstr "Todo el día"
#: js/ui/dateMenu.js:231
msgid "No Events"
msgstr "No hay eventos"
#: js/ui/dateMenu.js:348
msgid "Add world clocks…"
msgstr "Añadir relojes del mundo…"
#: js/ui/dateMenu.js:162
#: js/ui/dateMenu.js:349
msgid "World Clocks"
msgstr "Relojes del mundo"
#: js/ui/dateMenu.js:424
#: js/ui/dateMenu.js:629
msgid "Loading…"
msgstr "Cargando…"
#: js/ui/dateMenu.js:434
#: js/ui/dateMenu.js:639
msgid "Go online for weather information"
msgstr "Conectarse para obtener la información meteorológica"
#: js/ui/dateMenu.js:436
#: js/ui/dateMenu.js:641
msgid "Weather information is currently unavailable"
msgstr "La información meteorológica no está disponible actualmente."
#: js/ui/dateMenu.js:446
#: js/ui/dateMenu.js:651
msgid "Weather"
msgstr "Meteorología"
#: js/ui/dateMenu.js:448
#: js/ui/dateMenu.js:653
msgid "Select weather location…"
msgstr "Seleccionar ubicación meteorológica…"
@ -1301,11 +1299,11 @@ msgstr "Instalar extensión"
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "¿Descargar e instalar «%s» desde extensions.gnome.org?"
#: js/ui/extensionSystem.js:251
#: js/ui/extensionSystem.js:252
msgid "Extension Updates Available"
msgstr "Actualizaciones de extensiones disponibles"
#: js/ui/extensionSystem.js:252
#: js/ui/extensionSystem.js:253
msgid "Extension updates are ready to be installed."
msgstr "Las actualizaciones de las extensiones están listas para instalarse."
@ -1435,6 +1433,7 @@ msgid "Disabled"
msgstr "Desactivado"
#: js/ui/lookingGlass.js:743
#: subprojects/extensions-app/data/ui/extension-row.ui:188
msgid "Error"
msgstr "Error"
@ -1478,11 +1477,11 @@ msgstr "La pantalla de bloqueo necesita el gestor de pantallas de GNOME."
msgid "System Information"
msgstr "Información del sistema"
#: js/ui/mpris.js:199
#: js/ui/mpris.js:203
msgid "Unknown artist"
msgstr "Artista desconocido"
#: js/ui/mpris.js:209
#: js/ui/mpris.js:213
msgid "Unknown title"
msgstr "Título desconocido"
@ -1528,23 +1527,23 @@ msgstr "Asignar pulsación"
msgid "Done"
msgstr "Hecho"
#: js/ui/padOsd.js:745
#: js/ui/padOsd.js:732
msgid "Edit…"
msgstr "Editar…"
#: js/ui/padOsd.js:787 js/ui/padOsd.js:910
#: js/ui/padOsd.js:774 js/ui/padOsd.js:891
msgid "None"
msgstr "Nada"
#: js/ui/padOsd.js:863
#: js/ui/padOsd.js:845
msgid "Press a button to configure"
msgstr "Pulse un botón para configurar"
#: js/ui/padOsd.js:864
#: js/ui/padOsd.js:846
msgid "Press Esc to exit"
msgstr "Pulse Esc para salir"
#: js/ui/padOsd.js:867
#: js/ui/padOsd.js:849
msgid "Press any key to exit"
msgstr "Pulse cualquier tecla para salir"
@ -1602,15 +1601,15 @@ msgstr "No se pudo bloquear"
msgid "Lock was blocked by an application"
msgstr "Una aplicación impidió el bloqueo"
#: js/ui/search.js:702
#: js/ui/search.js:823
msgid "Searching…"
msgstr "Buscando…"
#: js/ui/search.js:704
#: js/ui/search.js:825
msgid "No results."
msgstr "No se encontraron resultados."
#: js/ui/search.js:830
#: js/ui/search.js:951
#, javascript-format
msgid "%d more"
msgid_plural "%d more"
@ -1808,17 +1807,17 @@ msgstr "Ubicación desactivada"
msgid "Enable"
msgstr "Activar"
#: js/ui/status/location.js:355
#: js/ui/status/location.js:350
msgid "Allow location access"
msgstr "Permitir acceso a la ubicación"
#. Translators: %s is an application name
#: js/ui/status/location.js:357
#: js/ui/status/location.js:352
#, javascript-format
msgid "The app %s wants to access your location"
msgstr "La aplicación %s quiere acceder a su ubicación"
#: js/ui/status/location.js:367
#: js/ui/status/location.js:362
msgid "Location access can be changed at any time from the privacy settings."
msgstr ""
"Los servicios de ubicación se pueden cambiar en cualquier momento desde la "
@ -2154,11 +2153,11 @@ msgstr "Error de autorización de Thunderbolt"
msgid "Could not authorize the Thunderbolt device: %s"
msgstr "No se pudo autorizar el dispositivo Thunderbolt: %s"
#: js/ui/status/volume.js:151
#: js/ui/status/volume.js:154
msgid "Volume changed"
msgstr "Volumen modificado"
#: js/ui/status/volume.js:222
#: js/ui/status/volume.js:225
msgid "Volume"
msgstr "Volumen"
@ -2212,11 +2211,11 @@ msgstr "Desbloquear ventana"
msgid "Log in as another user"
msgstr "Iniciar sesión como otro usuario"
#: js/ui/viewSelector.js:181
#: js/ui/viewSelector.js:182
msgid "Applications"
msgstr "Aplicaciones"
#: js/ui/viewSelector.js:185
#: js/ui/viewSelector.js:186
msgid "Search"
msgstr "Buscar"
@ -2369,13 +2368,13 @@ msgstr "El usuario rechazó el diálogo de autenticación"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:5
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:4
#: subprojects/extensions-app/js/main.js:182
#: subprojects/extensions-app/js/main.js:183
#: subprojects/extensions-app/data/ui/extensions-window.ui:61
msgid "Extensions"
msgstr "Extensiones"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:6
#: subprojects/extensions-app/js/main.js:183
#: subprojects/extensions-app/js/main.js:184
msgid "Manage your GNOME Extensions"
msgstr "Gestionar sus extensiones de GNOME Shell"
@ -2395,12 +2394,12 @@ msgstr ""
msgid "Configure GNOME Shell Extensions"
msgstr "Configurar las extensiones de GNOME Shell"
#: subprojects/extensions-app/js/main.js:144
#: subprojects/extensions-app/js/main.js:145
#, javascript-format
msgid "Remove “%s”?"
msgstr "¿Quitar «%s»?"
#: subprojects/extensions-app/js/main.js:145
#: subprojects/extensions-app/js/main.js:146
msgid ""
"If you remove the extension, you need to return to download it if you want "
"to enable it again"
@ -2408,44 +2407,52 @@ msgstr ""
"Si quita la extensión necesitará volver a descargarla si quiere activarla de "
"nuevo"
#: subprojects/extensions-app/js/main.js:149
#: subprojects/extensions-app/js/main.js:150
msgid "Remove"
msgstr "Quitar"
#: subprojects/extensions-app/js/main.js:181
#: subprojects/extensions-app/js/main.js:182
msgid "translator-credits"
msgstr ""
"Daniel Mustieles <daniel.mustieles@gmail.com>, 2010-2020\n"
"Benjamín Valero Espinosa <benjavalero@gmail.com>, 2011\n"
"Jorge González <jorgegonz@svn.gnome.org>, 2009, 2010, 2011"
#: subprojects/extensions-app/js/main.js:313
#: subprojects/extensions-app/js/main.js:314
#, javascript-format
msgid "%d extension will be updated on next login."
msgid_plural "%d extensions will be updated on next login."
msgstr[0] "la próxima vez que inicie sesión se actualizará %d extensión"
msgstr[1] "la próxima vez que inicie sesión se actualizarán %d extensiones"
#: subprojects/extensions-app/data/ui/extension-row.ui:100
#: subprojects/extensions-tool/src/command-create.c:301
#: subprojects/extensions-app/js/main.js:461
msgid "The extension is incompatible with the current GNOME version"
msgstr "La extensión no es compatible con la versión de GNOME actual"
#: subprojects/extensions-app/js/main.js:464
msgid "The extension had an error"
msgstr "La extensión contiene un error"
#: subprojects/extensions-app/data/ui/extension-row.ui:109
#: subprojects/extensions-tool/src/command-create.c:325
#: subprojects/extensions-tool/src/main.c:241
msgid "Description"
msgstr "Descripción"
#: subprojects/extensions-app/data/ui/extension-row.ui:123
#: subprojects/extensions-app/data/ui/extension-row.ui:132
#: subprojects/extensions-tool/src/main.c:253
msgid "Version"
msgstr "Versión"
#: subprojects/extensions-app/data/ui/extension-row.ui:151
#: subprojects/extensions-app/data/ui/extension-row.ui:160
msgid "Author"
msgstr "Autor"
#: subprojects/extensions-app/data/ui/extension-row.ui:175
#: subprojects/extensions-app/data/ui/extension-row.ui:216
msgid "Website"
msgstr "Página web"
#: subprojects/extensions-app/data/ui/extension-row.ui:192
#: subprojects/extensions-app/data/ui/extension-row.ui:233
msgid "Remove…"
msgstr "Quitar…"
@ -2508,12 +2515,12 @@ msgid "Log Out…"
msgstr "Cerrar la sesión…"
#. Translators: a file path to an extension directory
#: subprojects/extensions-tool/src/command-create.c:202
#: subprojects/extensions-tool/src/command-create.c:226
#, c-format
msgid "The new extension was successfully created in %s.\n"
msgstr "Se ha creado correctamente la nueva extensión en %s.\n"
#: subprojects/extensions-tool/src/command-create.c:275
#: subprojects/extensions-tool/src/command-create.c:299
#, c-format
msgid ""
"Name should be a very short (ideally descriptive) string.\n"
@ -2522,12 +2529,12 @@ msgstr ""
"El nombre debe ser una cadena (descriptiva) muy corta.\n"
"Algunos ejemplos: %s"
#: subprojects/extensions-tool/src/command-create.c:281
#: subprojects/extensions-tool/src/command-create.c:305
#: subprojects/extensions-tool/src/main.c:238
msgid "Name"
msgstr "Nombre"
#: subprojects/extensions-tool/src/command-create.c:295
#: subprojects/extensions-tool/src/command-create.c:319
#, c-format
msgid ""
"Description is a single-sentence explanation of what your extension does.\n"
@ -2536,7 +2543,7 @@ msgstr ""
"La descripción es una única frase para explicar qué hace su extensión.\n"
"Algunos ejemplos: %s"
#: subprojects/extensions-tool/src/command-create.c:315
#: subprojects/extensions-tool/src/command-create.c:339
msgid ""
"UUID is a globally-unique identifier for your extension.\n"
"This should be in the format of an email address (clicktofocus@janedoe."
@ -2546,56 +2553,56 @@ msgstr ""
"Normalmente debe estar en formato de dirección de correo electrónico "
"(pulsarparaenfocar@usuario.ejemplo.com)\n"
#: subprojects/extensions-tool/src/command-create.c:342
#: subprojects/extensions-tool/src/command-create.c:366
msgid "Choose one of the available templates:\n"
msgstr "Elija una de las plantillas disponibles:\n"
#: subprojects/extensions-tool/src/command-create.c:356
#: subprojects/extensions-tool/src/command-create.c:380
msgid "Template"
msgstr "Plantilla"
#: subprojects/extensions-tool/src/command-create.c:411
#: subprojects/extensions-tool/src/command-create.c:435
msgid "The unique identifier of the new extension"
msgstr "El identificador único de la nueva extensión"
#: subprojects/extensions-tool/src/command-create.c:414
#: subprojects/extensions-tool/src/command-create.c:438
msgid "NAME"
msgstr "NOMBRE"
#: subprojects/extensions-tool/src/command-create.c:415
#: subprojects/extensions-tool/src/command-create.c:439
msgid "The user-visible name of the new extension"
msgstr "El nombre visible por el usuario de esta extensión"
#: subprojects/extensions-tool/src/command-create.c:417
#: subprojects/extensions-tool/src/command-create.c:441
msgid "DESCRIPTION"
msgstr "DESCRIPCIÓN"
#: subprojects/extensions-tool/src/command-create.c:419
#: subprojects/extensions-tool/src/command-create.c:443
msgid "A short description of what the extension does"
msgstr "Una breve descripción de qué hace la extensión"
#: subprojects/extensions-tool/src/command-create.c:422
#: subprojects/extensions-tool/src/command-create.c:446
msgid "TEMPLATE"
msgstr "PLANTILLA"
#: subprojects/extensions-tool/src/command-create.c:423
#: subprojects/extensions-tool/src/command-create.c:447
msgid "The template to use for the new extension"
msgstr "La plantilla que usar para la nueva extensión"
#: subprojects/extensions-tool/src/command-create.c:429
#: subprojects/extensions-tool/src/command-create.c:453
msgid "Enter extension information interactively"
msgstr "Introduzca la información de la extensión interactivamente"
#: subprojects/extensions-tool/src/command-create.c:437
#: subprojects/extensions-tool/src/command-create.c:461
msgid "Create a new extension"
msgstr "Crear una extensión nueva"
#: subprojects/extensions-tool/src/command-create.c:455
#: subprojects/extensions-tool/src/command-create.c:479
#: subprojects/extensions-tool/src/command-list.c:172
msgid "Unknown arguments"
msgstr "Argumentos desconocidos"
#: subprojects/extensions-tool/src/command-create.c:480
#: subprojects/extensions-tool/src/command-create.c:504
msgid "UUID, name and description are required"
msgstr "Se necesita el UUID, el nombre y la descripción"
@ -2917,6 +2924,23 @@ msgstr[1] "%u entradas"
msgid "System Sounds"
msgstr "Sonidos del sistema"
#~ msgctxt "calendar heading"
#~ msgid "%A, %B %-d"
#~ msgstr "%A, %d de %B"
#~ msgctxt "calendar heading"
#~ msgid "%A, %B %-d, %Y"
#~ msgstr "%A, %d de %B de %Y"
#~ msgid "Frequently used applications will appear here"
#~ msgstr "Las aplicaciones usadas frecuentemente aparecerán aquí"
#~ msgid "Frequent"
#~ msgstr "Frecuentes"
#~ msgid "All"
#~ msgstr "Todas"
#~ msgid "Copy Error"
#~ msgstr "Copiar error"
@ -3265,12 +3289,6 @@ msgstr "Sonidos del sistema"
#~ msgid "Nothing Scheduled"
#~ msgstr "Nada programado"
#~ msgid "Today"
#~ msgstr "Hoy"
#~ msgid "Tomorrow"
#~ msgstr "Mañana"
#~ msgid "This week"
#~ msgstr "Esta semana"

290
po/ja.po
View File

@ -1,5 +1,5 @@
# Japanese translation of gnome-shell package.
# Copyright (C) 2009-2020 the gnome-shell copyright holder.
# Copyright (C) 2010-2017, 2019-2020 the gnome-shell copyright holder.
# This file is distributed under the same license as the gnome-shell package.
# Nishio Futoshi <fut_nis@d3.dion.ne.jp>, 2010.
# Kiyotaka NISHIBORI <ml.nishibori.kiyotaka@gmail.com>, 2011.
@ -16,8 +16,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-05-04 14:38+0000\n"
"PO-Revision-Date: 2020-05-13 23:00+0900\n"
"POT-Creation-Date: 2020-06-10 17:32+0000\n"
"PO-Revision-Date: 2020-06-11 19:00+0900\n"
"Last-Translator: sicklylife <translation@sicklylife.jp>\n"
"Language-Team: Japanese <gnome-translation@gnome.gr.jp>\n"
"Language: ja\n"
@ -421,7 +421,7 @@ msgstr "拡張機能のホームページを開く"
#: js/ui/components/networkAgent.js:110 js/ui/components/polkitAgent.js:139
#: js/ui/endSessionDialog.js:369 js/ui/extensionDownloader.js:181
#: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386
#: js/ui/status/network.js:916 subprojects/extensions-app/js/main.js:148
#: js/ui/status/network.js:916 subprojects/extensions-app/js/main.js:149
msgid "Cancel"
msgstr "キャンセル"
@ -577,7 +577,7 @@ msgid "%d hour ago"
msgid_plural "%d hours ago"
msgstr[0] "%d 時間前"
#: js/misc/util.js:191
#: js/misc/util.js:191 js/ui/dateMenu.js:162
msgid "Yesterday"
msgstr "昨日"
@ -692,56 +692,44 @@ msgstr ""
#. No support for non-modal system dialogs, so ignore the option
#. let modal = options['modal'] || true;
#: js/ui/accessDialog.js:39 js/ui/status/location.js:374
#: js/ui/accessDialog.js:39 js/ui/status/location.js:369
msgid "Deny Access"
msgstr "拒否"
#: js/ui/accessDialog.js:40 js/ui/status/location.js:377
#: js/ui/accessDialog.js:40 js/ui/status/location.js:372
msgid "Grant Access"
msgstr "許可"
#: js/ui/appDisplay.js:943
#: js/ui/appDisplay.js:902
msgid "Unnamed Folder"
msgstr "名前なしのフォルダー"
#: js/ui/appDisplay.js:966
msgid "Frequently used applications will appear here"
msgstr "よく使用するアプリケーションがここに表示されます"
#: js/ui/appDisplay.js:1101
msgid "Frequent"
msgstr "常用"
#: js/ui/appDisplay.js:1108
msgid "All"
msgstr "すべて"
#. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2485 js/ui/panel.js:75
#: js/ui/appDisplay.js:2241 js/ui/panel.js:75
msgid "Open Windows"
msgstr "開いているウィンドウ"
#: js/ui/appDisplay.js:2504 js/ui/panel.js:82
#: js/ui/appDisplay.js:2260 js/ui/panel.js:82
msgid "New Window"
msgstr "新しいウィンドウで開く"
#: js/ui/appDisplay.js:2520
#: js/ui/appDisplay.js:2276
msgid "Launch using Integrated Graphics Card"
msgstr "統合グラフィックカードを使用して起動"
#: js/ui/appDisplay.js:2521
#: js/ui/appDisplay.js:2277
msgid "Launch using Discrete Graphics Card"
msgstr "ディスクリートグラフィックカードを使用して起動"
#: js/ui/appDisplay.js:2549 js/ui/dash.js:239
#: js/ui/appDisplay.js:2305 js/ui/dash.js:239
msgid "Remove from Favorites"
msgstr "お気に入りから削除"
#: js/ui/appDisplay.js:2555
#: js/ui/appDisplay.js:2311
msgid "Add to Favorites"
msgstr "お気に入りに追加"
#: js/ui/appDisplay.js:2565 js/ui/panel.js:93
#: js/ui/appDisplay.js:2321 js/ui/panel.js:93
msgid "Show Details"
msgstr "詳細を表示"
@ -771,7 +759,7 @@ msgstr "ヘッドフォン"
msgid "Headset"
msgstr "ヘッドセット"
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:270
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:273
msgid "Microphone"
msgstr "マイク"
@ -788,7 +776,7 @@ msgid "Settings"
msgstr "設定"
#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday).
#: js/ui/calendar.js:41
#: js/ui/calendar.js:36
msgctxt "calendar-no-work"
msgid "06"
msgstr "06"
@ -798,43 +786,43 @@ msgstr "06"
#. * NOTE: These grid abbreviations are always shown together
#. * and in order, e.g. "S M T W T F S".
#.
#: js/ui/calendar.js:70
#: js/ui/calendar.js:65
msgctxt "grid sunday"
msgid "S"
msgstr "日"
#. Translators: Calendar grid abbreviation for Monday
#: js/ui/calendar.js:72
#: js/ui/calendar.js:67
msgctxt "grid monday"
msgid "M"
msgstr "月"
#. Translators: Calendar grid abbreviation for Tuesday
#: js/ui/calendar.js:74
#: js/ui/calendar.js:69
msgctxt "grid tuesday"
msgid "T"
msgstr "火"
#. Translators: Calendar grid abbreviation for Wednesday
#: js/ui/calendar.js:76
#: js/ui/calendar.js:71
msgctxt "grid wednesday"
msgid "W"
msgstr "水"
#. Translators: Calendar grid abbreviation for Thursday
#: js/ui/calendar.js:78
#: js/ui/calendar.js:73
msgctxt "grid thursday"
msgid "T"
msgstr "木"
#. Translators: Calendar grid abbreviation for Friday
#: js/ui/calendar.js:80
#: js/ui/calendar.js:75
msgctxt "grid friday"
msgid "F"
msgstr "金"
#. Translators: Calendar grid abbreviation for Saturday
#: js/ui/calendar.js:82
#: js/ui/calendar.js:77
msgctxt "grid saturday"
msgid "S"
msgstr "土"
@ -847,7 +835,7 @@ msgstr "土"
#. * "%OB" is the new format specifier introduced in glibc 2.27,
#. * in most cases you should not change it.
#.
#: js/ui/calendar.js:397
#: js/ui/calendar.js:392
msgid "%OB"
msgstr "%B"
@ -860,61 +848,37 @@ msgstr "%B"
#. * in most cases you should not use the old "%B" here unless you
#. * absolutely know what you are doing.
#.
#: js/ui/calendar.js:407
#: js/ui/calendar.js:402
msgid "%OB %Y"
msgstr "%Y年%B"
#: js/ui/calendar.js:466
#: js/ui/calendar.js:461
msgid "Previous month"
msgstr "先月"
#: js/ui/calendar.js:481
#: js/ui/calendar.js:476
msgid "Next month"
msgstr "来月"
#: js/ui/calendar.js:631
#: js/ui/calendar.js:626
#, no-javascript-format
msgctxt "date day number format"
msgid "%d"
msgstr "%d"
#: js/ui/calendar.js:687
#: js/ui/calendar.js:682
msgid "Week %V"
msgstr "第 %V 週"
#. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters
#.
#: js/ui/calendar.js:762
msgctxt "event list time"
msgid "All Day"
msgstr "終日"
#. Translators: Shown on calendar heading when selected day occurs on current year
#: js/ui/calendar.js:900
msgctxt "calendar heading"
msgid "%A, %B %-d"
msgstr "%B%-e日 (%a)"
#. Translators: Shown on calendar heading when selected day occurs on different year
#: js/ui/calendar.js:903
msgctxt "calendar heading"
msgid "%A, %B %-d, %Y"
msgstr "%Y年%B%-e日 (%a)"
#: js/ui/calendar.js:1133
#: js/ui/calendar.js:895
msgid "No Notifications"
msgstr "通知なし"
#: js/ui/calendar.js:1136
msgid "No Events"
msgstr "イベントなし"
#: js/ui/calendar.js:1190
#: js/ui/calendar.js:949
msgid "Do Not Disturb"
msgstr "通知ポップアップを表示しない"
#: js/ui/calendar.js:1209
#: js/ui/calendar.js:968
msgid "Clear"
msgstr "消去"
@ -1066,7 +1030,7 @@ msgstr "申し訳ありません、認証できませんでした。再試行し
msgid "%s is now known as %s"
msgstr "%s は %s になりました"
#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:177
#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:178
msgid "Windows"
msgstr "ウィンドウ"
@ -1085,7 +1049,7 @@ msgstr "ダッシュボード"
#. * "Tue 9:29 AM"). The string itself should become a full date, e.g.,
#. * "February 17 2015".
#.
#: js/ui/dateMenu.js:75
#: js/ui/dateMenu.js:79
msgid "%B %-d %Y"
msgstr "%Y年%-m月%-e日"
@ -1093,35 +1057,67 @@ msgstr "%Y年%-m月%-e日"
#. * below the time in the shell; it should combine the weekday and the
#. * date, e.g. "Tuesday February 17 2015".
#.
#: js/ui/dateMenu.js:82
#: js/ui/dateMenu.js:86
msgid "%A %B %e %Y"
msgstr "%Y年%-m月%-e日 (%a)"
#: js/ui/dateMenu.js:161
#. Translators: Shown on calendar heading when selected day occurs on current year
#: js/ui/dateMenu.js:151
msgctxt "calendar heading"
msgid "%B %-d"
msgstr "%-m月%-e日"
#. Translators: Shown on calendar heading when selected day occurs on different year
#: js/ui/dateMenu.js:154
msgctxt "calendar heading"
msgid "%B %-d %Y"
msgstr "%Y年%-m月%-e日"
#: js/ui/dateMenu.js:160
msgid "Today"
msgstr "今日"
#: js/ui/dateMenu.js:164
msgid "Tomorrow"
msgstr "明日"
#. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters
#.
#: js/ui/dateMenu.js:180
msgctxt "event list time"
msgid "All Day"
msgstr "終日"
#: js/ui/dateMenu.js:231
msgid "No Events"
msgstr "イベントなし"
#: js/ui/dateMenu.js:348
msgid "Add world clocks…"
msgstr "世界時計を追加…"
#: js/ui/dateMenu.js:162
#: js/ui/dateMenu.js:349
msgid "World Clocks"
msgstr "世界時計"
#: js/ui/dateMenu.js:424
#: js/ui/dateMenu.js:629
msgid "Loading…"
msgstr "読み込み中…"
#: js/ui/dateMenu.js:434
#: js/ui/dateMenu.js:639
msgid "Go online for weather information"
msgstr "気象情報取得のためにネットワークに接続してください"
#: js/ui/dateMenu.js:436
#: js/ui/dateMenu.js:641
msgid "Weather information is currently unavailable"
msgstr "気象情報を取得できません"
#: js/ui/dateMenu.js:446
#: js/ui/dateMenu.js:651
msgid "Weather"
msgstr "天気"
#: js/ui/dateMenu.js:448
#: js/ui/dateMenu.js:653
msgid "Select weather location…"
msgstr "天気の場所を選択…"
@ -1279,11 +1275,11 @@ msgstr "拡張機能をインストール"
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "extensions.gnome.org から“%s”をダウンロードしてインストールしますか?"
#: js/ui/extensionSystem.js:251
#: js/ui/extensionSystem.js:252
msgid "Extension Updates Available"
msgstr "拡張機能のアップデートが利用可能です"
#: js/ui/extensionSystem.js:252
#: js/ui/extensionSystem.js:253
msgid "Extension updates are ready to be installed."
msgstr "拡張機能のアップデートをインストールする準備ができました。"
@ -1410,6 +1406,7 @@ msgid "Disabled"
msgstr "無効"
#: js/ui/lookingGlass.js:743
#: subprojects/extensions-app/data/ui/extension-row.ui:188
msgid "Error"
msgstr "エラー"
@ -1453,11 +1450,11 @@ msgstr "画面ロックには GNOME ディスプレイマネージャーが必
msgid "System Information"
msgstr "システム情報"
#: js/ui/mpris.js:199
#: js/ui/mpris.js:203
msgid "Unknown artist"
msgstr "不明なアーティスト"
#: js/ui/mpris.js:209
#: js/ui/mpris.js:213
msgid "Unknown title"
msgstr "不明なタイトル"
@ -1503,23 +1500,23 @@ msgstr "キーストロークを割り当て"
msgid "Done"
msgstr "完了"
#: js/ui/padOsd.js:745
#: js/ui/padOsd.js:732
msgid "Edit…"
msgstr "編集…"
#: js/ui/padOsd.js:787 js/ui/padOsd.js:910
#: js/ui/padOsd.js:774 js/ui/padOsd.js:891
msgid "None"
msgstr "なし"
#: js/ui/padOsd.js:863
#: js/ui/padOsd.js:845
msgid "Press a button to configure"
msgstr "ボタンを押して設定してください"
#: js/ui/padOsd.js:864
#: js/ui/padOsd.js:846
msgid "Press Esc to exit"
msgstr "Esc を押すと終了します"
#: js/ui/padOsd.js:867
#: js/ui/padOsd.js:849
msgid "Press any key to exit"
msgstr "キーを押すと終了します"
@ -1529,16 +1526,16 @@ msgstr "終了"
#. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview".
#: js/ui/panel.js:432
#: js/ui/panel.js:435
msgid "Activities"
msgstr "アクティビティ"
#: js/ui/panel.js:711
#: js/ui/panel.js:714
msgctxt "System menu in the top bar"
msgid "System"
msgstr "システム"
#: js/ui/panel.js:824
#: js/ui/panel.js:827
msgid "Top Bar"
msgstr "トップバー"
@ -1577,15 +1574,15 @@ msgstr "ロックできません"
msgid "Lock was blocked by an application"
msgstr "アプリケーションによってロックがブロックされました"
#: js/ui/search.js:702
#: js/ui/search.js:823
msgid "Searching…"
msgstr "検索中…"
#: js/ui/search.js:704
#: js/ui/search.js:825
msgid "No results."
msgstr "一致するものがありません。"
#: js/ui/search.js:830
#: js/ui/search.js:951
#, javascript-format
msgid "%d more"
msgid_plural "%d more"
@ -1782,17 +1779,17 @@ msgstr "位置情報サービス無効"
msgid "Enable"
msgstr "有効"
#: js/ui/status/location.js:355
#: js/ui/status/location.js:350
msgid "Allow location access"
msgstr "位置情報へのアクセスの許可"
#. Translators: %s is an application name
#: js/ui/status/location.js:357
#: js/ui/status/location.js:352
#, javascript-format
msgid "The app %s wants to access your location"
msgstr "アプリ %s が位置情報へのアクセスを要求しています"
#: js/ui/status/location.js:367
#: js/ui/status/location.js:362
msgid "Location access can be changed at any time from the privacy settings."
msgstr ""
"位置情報のアクセス許可設定は、プライバシー設定からいつでも変更できます。"
@ -2123,11 +2120,11 @@ msgstr "Thunderbolt 認証エラー"
msgid "Could not authorize the Thunderbolt device: %s"
msgstr "Thunderbolt デバイスを認証できませんでした: %s"
#: js/ui/status/volume.js:151
#: js/ui/status/volume.js:154
msgid "Volume changed"
msgstr "音量変更しました"
#: js/ui/status/volume.js:222
#: js/ui/status/volume.js:225
msgid "Volume"
msgstr "音量"
@ -2181,11 +2178,11 @@ msgstr "ロック解除"
msgid "Log in as another user"
msgstr "別のユーザーでログイン"
#: js/ui/viewSelector.js:181
#: js/ui/viewSelector.js:182
msgid "Applications"
msgstr "アプリケーション"
#: js/ui/viewSelector.js:185
#: js/ui/viewSelector.js:186
msgid "Search"
msgstr "検索"
@ -2335,19 +2332,19 @@ msgstr "認証ダイアログはユーザーに拒否されました"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:5
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:4
#: subprojects/extensions-app/js/main.js:182
#: subprojects/extensions-app/js/main.js:183
#: subprojects/extensions-app/data/ui/extensions-window.ui:61
msgid "Extensions"
msgstr "拡張機能"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:6
#: subprojects/extensions-app/js/main.js:183
#: subprojects/extensions-app/js/main.js:184
msgid "Manage your GNOME Extensions"
msgstr "GNOME 拡張機能を管理します"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:17
msgid "The GNOME Project"
msgstr ""
msgstr "The GNOME Project"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:36
msgid ""
@ -2359,23 +2356,23 @@ msgstr ""
msgid "Configure GNOME Shell Extensions"
msgstr "GNOME Shell 拡張機能の設定を行います"
#: subprojects/extensions-app/js/main.js:144
#: subprojects/extensions-app/js/main.js:145
#, javascript-format
msgid "Remove “%s”?"
msgstr "“%s”を削除しますか?"
#: subprojects/extensions-app/js/main.js:145
#: subprojects/extensions-app/js/main.js:146
msgid ""
"If you remove the extension, you need to return to download it if you want "
"to enable it again"
msgstr ""
"拡張機能を削除した場合、再度有効にするにはダウンロードし直す必要があります"
#: subprojects/extensions-app/js/main.js:149
#: subprojects/extensions-app/js/main.js:150
msgid "Remove"
msgstr "削除"
#: subprojects/extensions-app/js/main.js:181
#: subprojects/extensions-app/js/main.js:182
msgid "translator-credits"
msgstr ""
"Hideki Yamane <henrich@debian.org>\n"
@ -2389,32 +2386,40 @@ msgstr ""
"Takayuki KUSANO <AE5T-KSN@asahi-net.or.jp>\n"
"Yoji TOYODA <bsyamato@sea.plala.or.jp>"
#: subprojects/extensions-app/js/main.js:313
#: subprojects/extensions-app/js/main.js:314
#, javascript-format
msgid "%d extension will be updated on next login."
msgid_plural "%d extensions will be updated on next login."
msgstr[0] "%d 個の拡張機能を次回ログイン時に更新します。"
#: subprojects/extensions-app/data/ui/extension-row.ui:100
#: subprojects/extensions-tool/src/command-create.c:301
#: subprojects/extensions-app/js/main.js:461
msgid "The extension is incompatible with the current GNOME version"
msgstr "現在の GNOME のバージョンと互換性のない拡張機能です"
#: subprojects/extensions-app/js/main.js:464
msgid "The extension had an error"
msgstr "拡張機能にエラーがありました"
#: subprojects/extensions-app/data/ui/extension-row.ui:109
#: subprojects/extensions-tool/src/command-create.c:325
#: subprojects/extensions-tool/src/main.c:241
msgid "Description"
msgstr "説明"
#: subprojects/extensions-app/data/ui/extension-row.ui:123
#: subprojects/extensions-app/data/ui/extension-row.ui:132
#: subprojects/extensions-tool/src/main.c:253
msgid "Version"
msgstr "バージョン"
#: subprojects/extensions-app/data/ui/extension-row.ui:151
#: subprojects/extensions-app/data/ui/extension-row.ui:160
msgid "Author"
msgstr "作者"
#: subprojects/extensions-app/data/ui/extension-row.ui:175
#: subprojects/extensions-app/data/ui/extension-row.ui:216
msgid "Website"
msgstr "ウェブサイト"
#: subprojects/extensions-app/data/ui/extension-row.ui:192
#: subprojects/extensions-app/data/ui/extension-row.ui:233
msgid "Remove…"
msgstr "削除…"
@ -2470,94 +2475,94 @@ msgstr ""
#: subprojects/extensions-app/data/ui/extensions-window.ui:273
msgid "Extension Updates Ready"
msgstr "拡張機能更新できます"
msgstr "拡張機能更新準備完了"
#: subprojects/extensions-app/data/ui/extensions-window.ui:289
msgid "Log Out…"
msgstr "ログアウト…"
#. Translators: a file path to an extension directory
#: subprojects/extensions-tool/src/command-create.c:202
#: subprojects/extensions-tool/src/command-create.c:226
#, c-format
msgid "The new extension was successfully created in %s.\n"
msgstr ""
#: subprojects/extensions-tool/src/command-create.c:275
#: subprojects/extensions-tool/src/command-create.c:299
#, c-format
msgid ""
"Name should be a very short (ideally descriptive) string.\n"
"Examples are: %s"
msgstr ""
#: subprojects/extensions-tool/src/command-create.c:281
#: subprojects/extensions-tool/src/command-create.c:305
#: subprojects/extensions-tool/src/main.c:238
msgid "Name"
msgstr "名前"
#: subprojects/extensions-tool/src/command-create.c:295
#: subprojects/extensions-tool/src/command-create.c:319
#, c-format
msgid ""
"Description is a single-sentence explanation of what your extension does.\n"
"Examples are: %s"
msgstr ""
#: subprojects/extensions-tool/src/command-create.c:315
#: subprojects/extensions-tool/src/command-create.c:339
msgid ""
"UUID is a globally-unique identifier for your extension.\n"
"This should be in the format of an email address (clicktofocus@janedoe."
"example.com)\n"
msgstr ""
#: subprojects/extensions-tool/src/command-create.c:342
#: subprojects/extensions-tool/src/command-create.c:366
msgid "Choose one of the available templates:\n"
msgstr ""
#: subprojects/extensions-tool/src/command-create.c:356
#: subprojects/extensions-tool/src/command-create.c:380
msgid "Template"
msgstr ""
#: subprojects/extensions-tool/src/command-create.c:411
#: subprojects/extensions-tool/src/command-create.c:435
msgid "The unique identifier of the new extension"
msgstr ""
#: subprojects/extensions-tool/src/command-create.c:414
#: subprojects/extensions-tool/src/command-create.c:438
msgid "NAME"
msgstr ""
#: subprojects/extensions-tool/src/command-create.c:415
#: subprojects/extensions-tool/src/command-create.c:439
msgid "The user-visible name of the new extension"
msgstr ""
#: subprojects/extensions-tool/src/command-create.c:417
#: subprojects/extensions-tool/src/command-create.c:441
msgid "DESCRIPTION"
msgstr ""
#: subprojects/extensions-tool/src/command-create.c:419
#: subprojects/extensions-tool/src/command-create.c:443
msgid "A short description of what the extension does"
msgstr ""
#: subprojects/extensions-tool/src/command-create.c:422
#: subprojects/extensions-tool/src/command-create.c:446
msgid "TEMPLATE"
msgstr ""
#: subprojects/extensions-tool/src/command-create.c:423
#: subprojects/extensions-tool/src/command-create.c:447
msgid "The template to use for the new extension"
msgstr ""
#: subprojects/extensions-tool/src/command-create.c:429
#: subprojects/extensions-tool/src/command-create.c:453
msgid "Enter extension information interactively"
msgstr ""
#: subprojects/extensions-tool/src/command-create.c:437
#: subprojects/extensions-tool/src/command-create.c:461
msgid "Create a new extension"
msgstr "新しい拡張機能を作成します"
#: subprojects/extensions-tool/src/command-create.c:455
#: subprojects/extensions-tool/src/command-create.c:479
#: subprojects/extensions-tool/src/command-list.c:172
msgid "Unknown arguments"
msgstr "不明な引数です"
#: subprojects/extensions-tool/src/command-create.c:480
#: subprojects/extensions-tool/src/command-create.c:504
msgid "UUID, name and description are required"
msgstr ""
@ -2877,6 +2882,23 @@ msgstr[0] "入力数: %u"
msgid "System Sounds"
msgstr "システムのサウンド"
#~ msgid "Frequently used applications will appear here"
#~ msgstr "よく使用するアプリケーションがここに表示されます"
#~ msgid "Frequent"
#~ msgstr "常用"
#~ msgid "All"
#~ msgstr "すべて"
#~ msgctxt "calendar heading"
#~ msgid "%A, %B %-d"
#~ msgstr "%B%-e日 (%a)"
#~ msgctxt "calendar heading"
#~ msgid "%A, %B %-d, %Y"
#~ msgstr "%Y年%B%-e日 (%a)"
#~ msgid "Copy Error"
#~ msgstr "エラーをコピー"

2034
po/kk.po

File diff suppressed because it is too large Load Diff

239
po/ro.po
View File

@ -10,9 +10,10 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-05-21 23:22+0000\n"
"PO-Revision-Date: 2020-05-22 15:07+0300\n"
"Last-Translator: Florentina Mușat <emryslokadottir [at] gmail [dot] com>\n"
"POT-Creation-Date: 2020-06-09 19:41+0000\n"
"PO-Revision-Date: 2020-06-17 18:47+0300\n"
"Last-Translator: Florentina Mușat <florentina [dot] musat [dot] 28 [at] "
"gmail [dot] com>\n"
"Language-Team: Gnome Romanian Translation Team <gnomero-list@lists."
"sourceforge.net>\n"
"Language: ro\n"
@ -594,7 +595,7 @@ msgstr[0] "%d oră în urmă"
msgstr[1] "%d ore în urmă"
msgstr[2] "%d de ore în urmă"
#: js/misc/util.js:191
#: js/misc/util.js:191 js/ui/dateMenu.js:162
msgid "Yesterday"
msgstr "Ieri"
@ -718,56 +719,44 @@ msgstr ""
#. No support for non-modal system dialogs, so ignore the option
#. let modal = options['modal'] || true;
#: js/ui/accessDialog.js:39 js/ui/status/location.js:374
#: js/ui/accessDialog.js:39 js/ui/status/location.js:369
msgid "Deny Access"
msgstr "Refuză accesul"
#: js/ui/accessDialog.js:40 js/ui/status/location.js:377
#: js/ui/accessDialog.js:40 js/ui/status/location.js:372
msgid "Grant Access"
msgstr "Permite accesul"
#: js/ui/appDisplay.js:944
#: js/ui/appDisplay.js:902
msgid "Unnamed Folder"
msgstr "Dosar nedenumit"
#: js/ui/appDisplay.js:967
msgid "Frequently used applications will appear here"
msgstr "Aplicațiile utilizate frecvent vor fi afișate aici"
#: js/ui/appDisplay.js:1102
msgid "Frequent"
msgstr "Frecvente"
#: js/ui/appDisplay.js:1109
msgid "All"
msgstr "Toate"
#. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2486 js/ui/panel.js:75
#: js/ui/appDisplay.js:2241 js/ui/panel.js:75
msgid "Open Windows"
msgstr "Ferestre deschise"
#: js/ui/appDisplay.js:2505 js/ui/panel.js:82
#: js/ui/appDisplay.js:2260 js/ui/panel.js:82
msgid "New Window"
msgstr "Fereastră nouă"
#: js/ui/appDisplay.js:2521
#: js/ui/appDisplay.js:2276
msgid "Launch using Integrated Graphics Card"
msgstr "Lansează folosind placa grafică integrată"
#: js/ui/appDisplay.js:2522
#: js/ui/appDisplay.js:2277
msgid "Launch using Discrete Graphics Card"
msgstr "Lansează folosind placa grafică discretă"
#: js/ui/appDisplay.js:2550 js/ui/dash.js:239
#: js/ui/appDisplay.js:2305 js/ui/dash.js:239
msgid "Remove from Favorites"
msgstr "Elimină din favorite"
#: js/ui/appDisplay.js:2556
#: js/ui/appDisplay.js:2311
msgid "Add to Favorites"
msgstr "Adaugă la Favorite"
#: js/ui/appDisplay.js:2566 js/ui/panel.js:93
#: js/ui/appDisplay.js:2321 js/ui/panel.js:93
msgid "Show Details"
msgstr "Arată detaliile"
@ -814,7 +803,7 @@ msgid "Settings"
msgstr "Configurări"
#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday).
#: js/ui/calendar.js:41
#: js/ui/calendar.js:36
msgctxt "calendar-no-work"
msgid "06"
msgstr "06"
@ -824,43 +813,43 @@ msgstr "06"
#. * NOTE: These grid abbreviations are always shown together
#. * and in order, e.g. "S M T W T F S".
#.
#: js/ui/calendar.js:70
#: js/ui/calendar.js:65
msgctxt "grid sunday"
msgid "S"
msgstr "D"
#. Translators: Calendar grid abbreviation for Monday
#: js/ui/calendar.js:72
#: js/ui/calendar.js:67
msgctxt "grid monday"
msgid "M"
msgstr "L"
#. Translators: Calendar grid abbreviation for Tuesday
#: js/ui/calendar.js:74
#: js/ui/calendar.js:69
msgctxt "grid tuesday"
msgid "T"
msgstr "M"
#. Translators: Calendar grid abbreviation for Wednesday
#: js/ui/calendar.js:76
#: js/ui/calendar.js:71
msgctxt "grid wednesday"
msgid "W"
msgstr "M"
#. Translators: Calendar grid abbreviation for Thursday
#: js/ui/calendar.js:78
#: js/ui/calendar.js:73
msgctxt "grid thursday"
msgid "T"
msgstr "J"
#. Translators: Calendar grid abbreviation for Friday
#: js/ui/calendar.js:80
#: js/ui/calendar.js:75
msgctxt "grid friday"
msgid "F"
msgstr "V"
#. Translators: Calendar grid abbreviation for Saturday
#: js/ui/calendar.js:82
#: js/ui/calendar.js:77
msgctxt "grid saturday"
msgid "S"
msgstr "S"
@ -871,7 +860,7 @@ msgstr "S"
#. * "%OB" is the new format specifier introduced in glibc 2.27,
#. * in most cases you should not change it.
#.
#: js/ui/calendar.js:397
#: js/ui/calendar.js:392
msgid "%OB"
msgstr "%OB"
@ -884,61 +873,37 @@ msgstr "%OB"
#. * in most cases you should not use the old "%B" here unless you
#. * absolutely know what you are doing.
#.
#: js/ui/calendar.js:407
#: js/ui/calendar.js:402
msgid "%OB %Y"
msgstr "%OB %Y"
#: js/ui/calendar.js:466
#: js/ui/calendar.js:461
msgid "Previous month"
msgstr "Luna precedentă"
#: js/ui/calendar.js:481
#: js/ui/calendar.js:476
msgid "Next month"
msgstr "Luna viitoare"
#: js/ui/calendar.js:631
#: js/ui/calendar.js:626
#, no-javascript-format
msgctxt "date day number format"
msgid "%d"
msgstr "%d"
#: js/ui/calendar.js:687
#: js/ui/calendar.js:682
msgid "Week %V"
msgstr "Săptămâna %V"
#. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters
#.
#: js/ui/calendar.js:762
msgctxt "event list time"
msgid "All Day"
msgstr "Toată ziua"
#. Translators: Shown on calendar heading when selected day occurs on current year
#: js/ui/calendar.js:900
msgctxt "calendar heading"
msgid "%A, %B %-d"
msgstr "%A, %B %-d"
#. Translators: Shown on calendar heading when selected day occurs on different year
#: js/ui/calendar.js:903
msgctxt "calendar heading"
msgid "%A, %B %-d, %Y"
msgstr "%A, %B %-d, %Y"
#: js/ui/calendar.js:1133
#: js/ui/calendar.js:895
msgid "No Notifications"
msgstr "Nu există notificări"
#: js/ui/calendar.js:1136
msgid "No Events"
msgstr "Nu există evenimente"
#: js/ui/calendar.js:1190
#: js/ui/calendar.js:949
msgid "Do Not Disturb"
msgstr "Nu deranja"
#: js/ui/calendar.js:1209
#: js/ui/calendar.js:968
msgid "Clear"
msgstr "Curăță"
@ -1093,7 +1058,7 @@ msgstr "Nu a funcționat. Încercați din nou."
msgid "%s is now known as %s"
msgstr "%s este acum cunoscut ca %s"
#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:177
#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:178
msgid "Windows"
msgstr "Ferestre"
@ -1112,7 +1077,7 @@ msgstr "Dash"
#. * "Tue 9:29 AM"). The string itself should become a full date, e.g.,
#. * "February 17 2015".
#.
#: js/ui/dateMenu.js:75
#: js/ui/dateMenu.js:79
msgid "%B %-d %Y"
msgstr "%B %-d %Y"
@ -1120,35 +1085,67 @@ msgstr "%B %-d %Y"
#. * below the time in the shell; it should combine the weekday and the
#. * date, e.g. "Tuesday February 17 2015".
#.
#: js/ui/dateMenu.js:82
#: js/ui/dateMenu.js:86
msgid "%A %B %e %Y"
msgstr "%A %B %e %Y"
#: js/ui/dateMenu.js:162
#. Translators: Shown on calendar heading when selected day occurs on current year
#: js/ui/dateMenu.js:151
msgctxt "calendar heading"
msgid "%B %-d"
msgstr "%B %-d"
#. Translators: Shown on calendar heading when selected day occurs on different year
#: js/ui/dateMenu.js:154
msgctxt "calendar heading"
msgid "%B %-d %Y"
msgstr "%B %-d %Y"
#: js/ui/dateMenu.js:160
msgid "Today"
msgstr "Astăzi"
#: js/ui/dateMenu.js:164
msgid "Tomorrow"
msgstr "Mâine"
#. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters
#.
#: js/ui/dateMenu.js:180
msgctxt "event list time"
msgid "All Day"
msgstr "Toată ziua"
#: js/ui/dateMenu.js:231
msgid "No Events"
msgstr "Nu există evenimente"
#: js/ui/dateMenu.js:348
msgid "Add world clocks…"
msgstr "Adaugă un fus orar…"
#: js/ui/dateMenu.js:163
#: js/ui/dateMenu.js:349
msgid "World Clocks"
msgstr "Fusuri orare"
#: js/ui/dateMenu.js:443
#: js/ui/dateMenu.js:629
msgid "Loading…"
msgstr "Se încarcă…"
#: js/ui/dateMenu.js:453
#: js/ui/dateMenu.js:639
msgid "Go online for weather information"
msgstr "Conectați-vă la internet pentru informații despre vreme"
#: js/ui/dateMenu.js:455
#: js/ui/dateMenu.js:641
msgid "Weather information is currently unavailable"
msgstr "Informațiile despre vreme nu sunt disponibile momentan"
#: js/ui/dateMenu.js:465
#: js/ui/dateMenu.js:651
msgid "Weather"
msgstr "Vreme"
#: js/ui/dateMenu.js:467
#: js/ui/dateMenu.js:653
msgid "Select weather location…"
msgstr "Selectează locația vremii…"
@ -1495,11 +1492,11 @@ msgstr "Blocarea ecranului necesită administratorul de afișaj GNOME."
msgid "System Information"
msgstr "Informații despre sistem"
#: js/ui/mpris.js:204
#: js/ui/mpris.js:203
msgid "Unknown artist"
msgstr "Artist necunoscut"
#: js/ui/mpris.js:214
#: js/ui/mpris.js:213
msgid "Unknown title"
msgstr "Titlu necunoscut"
@ -1545,23 +1542,23 @@ msgstr "Alochează tasta apăsată"
msgid "Done"
msgstr "Gata"
#: js/ui/padOsd.js:745
#: js/ui/padOsd.js:732
msgid "Edit…"
msgstr "Editează…"
#: js/ui/padOsd.js:787 js/ui/padOsd.js:910
#: js/ui/padOsd.js:774 js/ui/padOsd.js:891
msgid "None"
msgstr "Nespecificat"
#: js/ui/padOsd.js:863
#: js/ui/padOsd.js:845
msgid "Press a button to configure"
msgstr "Apăsați un buton de configurat"
#: js/ui/padOsd.js:864
#: js/ui/padOsd.js:846
msgid "Press Esc to exit"
msgstr "Apăsați Esc pentru a ieși"
#: js/ui/padOsd.js:867
#: js/ui/padOsd.js:849
msgid "Press any key to exit"
msgstr "Apăsați orice tastă pentru a ieși"
@ -1826,17 +1823,17 @@ msgstr "Locația dezactivată"
msgid "Enable"
msgstr "Activează"
#: js/ui/status/location.js:355
#: js/ui/status/location.js:350
msgid "Allow location access"
msgstr "Permite accesul la locație"
#. Translators: %s is an application name
#: js/ui/status/location.js:357
#: js/ui/status/location.js:352
#, javascript-format
msgid "The app %s wants to access your location"
msgstr "Aplicația %s dorește să vă acceseze locația"
#: js/ui/status/location.js:367
#: js/ui/status/location.js:362
msgid "Location access can be changed at any time from the privacy settings."
msgstr ""
"Accesul la locație poate fi schimbat oricând din configurările de "
@ -2233,11 +2230,11 @@ msgstr "Deblochează fereastră"
msgid "Log in as another user"
msgstr "Intră în sesiune ca utilizator diferit"
#: js/ui/viewSelector.js:181
#: js/ui/viewSelector.js:182
msgid "Applications"
msgstr "Aplicații"
#: js/ui/viewSelector.js:185
#: js/ui/viewSelector.js:186
msgid "Search"
msgstr "Caută"
@ -2434,7 +2431,8 @@ msgstr "Elimină"
#: subprojects/extensions-app/js/main.js:182
msgid "translator-credits"
msgstr "Florentina Mușat <emryslokadottir [at] gmail [dot] com>, 2020"
msgstr ""
"Florentina Mușat <florentina [dot] musat [dot] 28 [at] gmail [dot] com>, 2020"
#: subprojects/extensions-app/js/main.js:314
#, javascript-format
@ -2453,7 +2451,7 @@ msgid "The extension had an error"
msgstr "Extensia a avut o eroare"
#: subprojects/extensions-app/data/ui/extension-row.ui:109
#: subprojects/extensions-tool/src/command-create.c:301
#: subprojects/extensions-tool/src/command-create.c:325
#: subprojects/extensions-tool/src/main.c:241
msgid "Description"
msgstr "Descriere"
@ -2534,12 +2532,12 @@ msgid "Log Out…"
msgstr "Deautentificare…"
#. Translators: a file path to an extension directory
#: subprojects/extensions-tool/src/command-create.c:202
#: subprojects/extensions-tool/src/command-create.c:226
#, c-format
msgid "The new extension was successfully created in %s.\n"
msgstr "Extensia nouă a fost creată cu succes la %s.\n"
#: subprojects/extensions-tool/src/command-create.c:275
#: subprojects/extensions-tool/src/command-create.c:299
#, c-format
msgid ""
"Name should be a very short (ideally descriptive) string.\n"
@ -2548,12 +2546,12 @@ msgstr ""
"Numele ar trebui să fie un șir foarte scurt (ideal descriptiv).\n"
"Exemple: %s"
#: subprojects/extensions-tool/src/command-create.c:281
#: subprojects/extensions-tool/src/command-create.c:305
#: subprojects/extensions-tool/src/main.c:238
msgid "Name"
msgstr "Nume"
#: subprojects/extensions-tool/src/command-create.c:295
#: subprojects/extensions-tool/src/command-create.c:319
#, c-format
msgid ""
"Description is a single-sentence explanation of what your extension does.\n"
@ -2563,7 +2561,7 @@ msgstr ""
"extensia.\n"
"Exemple: %s"
#: subprojects/extensions-tool/src/command-create.c:315
#: subprojects/extensions-tool/src/command-create.c:339
msgid ""
"UUID is a globally-unique identifier for your extension.\n"
"This should be in the format of an email address (clicktofocus@janedoe."
@ -2573,56 +2571,56 @@ msgstr ""
"Aceasta ar trebui să fie în formatul unei adrese de email "
"(clicktofocus@janedoe.example.com)\n"
#: subprojects/extensions-tool/src/command-create.c:342
#: subprojects/extensions-tool/src/command-create.c:366
msgid "Choose one of the available templates:\n"
msgstr "Alege unul din șabloanele existente:\n"
#: subprojects/extensions-tool/src/command-create.c:356
#: subprojects/extensions-tool/src/command-create.c:380
msgid "Template"
msgstr "Șablon"
#: subprojects/extensions-tool/src/command-create.c:411
#: subprojects/extensions-tool/src/command-create.c:435
msgid "The unique identifier of the new extension"
msgstr "Identificatorul unic al noii extensii"
#: subprojects/extensions-tool/src/command-create.c:414
#: subprojects/extensions-tool/src/command-create.c:438
msgid "NAME"
msgstr "NUME"
#: subprojects/extensions-tool/src/command-create.c:415
#: subprojects/extensions-tool/src/command-create.c:439
msgid "The user-visible name of the new extension"
msgstr "Numele vizibil de utilizator pentru noua extensie"
#: subprojects/extensions-tool/src/command-create.c:417
#: subprojects/extensions-tool/src/command-create.c:441
msgid "DESCRIPTION"
msgstr "DESCRIERE"
#: subprojects/extensions-tool/src/command-create.c:419
#: subprojects/extensions-tool/src/command-create.c:443
msgid "A short description of what the extension does"
msgstr "O scurtă descriere despre ce face extensia"
#: subprojects/extensions-tool/src/command-create.c:422
#: subprojects/extensions-tool/src/command-create.c:446
msgid "TEMPLATE"
msgstr "ȘABLON"
#: subprojects/extensions-tool/src/command-create.c:423
#: subprojects/extensions-tool/src/command-create.c:447
msgid "The template to use for the new extension"
msgstr "Șablonul de utilizat pentru extensia nouă"
#: subprojects/extensions-tool/src/command-create.c:429
#: subprojects/extensions-tool/src/command-create.c:453
msgid "Enter extension information interactively"
msgstr "Introdu informațiile extensiei interactiv"
#: subprojects/extensions-tool/src/command-create.c:437
#: subprojects/extensions-tool/src/command-create.c:461
msgid "Create a new extension"
msgstr "Creează o nouă extensie"
#: subprojects/extensions-tool/src/command-create.c:455
#: subprojects/extensions-tool/src/command-create.c:479
#: subprojects/extensions-tool/src/command-list.c:172
msgid "Unknown arguments"
msgstr "Argumente necunoscute"
#: subprojects/extensions-tool/src/command-create.c:480
#: subprojects/extensions-tool/src/command-create.c:504
msgid "UUID, name and description are required"
msgstr "UUID-ul, numele și descrierea sunt necesare"
@ -2946,6 +2944,23 @@ msgstr[2] "%u de intrări"
msgid "System Sounds"
msgstr "Sunete de sistem"
#~ msgid "Frequently used applications will appear here"
#~ msgstr "Aplicațiile utilizate frecvent vor fi afișate aici"
#~ msgid "Frequent"
#~ msgstr "Frecvente"
#~ msgid "All"
#~ msgstr "Toate"
#~ msgctxt "calendar heading"
#~ msgid "%A, %B %-d"
#~ msgstr "%A, %B %-d"
#~ msgctxt "calendar heading"
#~ msgid "%A, %B %-d, %Y"
#~ msgstr "%A, %B %-d, %Y"
#~ msgid "Copy Error"
#~ msgstr "Eroare la copiere"
@ -3115,12 +3130,6 @@ msgstr "Sunete de sistem"
#~ msgid "Nothing Scheduled"
#~ msgstr "Nimic programat"
#~ msgid "Today"
#~ msgstr "Astăzi"
#~ msgid "Tomorrow"
#~ msgstr "Mâine"
#~ msgid "This week"
#~ msgstr "Săptămâna aceasta"

267
po/tr.po
View File

@ -17,7 +17,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-05-15 18:43+0000\n"
"POT-Creation-Date: 2020-06-11 10:28+0000\n"
"PO-Revision-Date: 2020-05-16 12:12+0300\n"
"Last-Translator: Emin Tufan Çetin <etcetin@gmail.com>\n"
"Language-Team: Türkçe <gnome-turk@gnome.org>\n"
@ -586,7 +586,7 @@ msgid "%d hour ago"
msgid_plural "%d hours ago"
msgstr[0] "%d saat önce"
#: js/misc/util.js:191
#: js/misc/util.js:191 js/ui/dateMenu.js:162
msgid "Yesterday"
msgstr "Dün"
@ -702,56 +702,44 @@ msgstr ""
#. No support for non-modal system dialogs, so ignore the option
#. let modal = options['modal'] || true;
#: js/ui/accessDialog.js:39 js/ui/status/location.js:374
#: js/ui/accessDialog.js:39 js/ui/status/location.js:369
msgid "Deny Access"
msgstr "Erişimi Reddet"
#: js/ui/accessDialog.js:40 js/ui/status/location.js:377
#: js/ui/accessDialog.js:40 js/ui/status/location.js:372
msgid "Grant Access"
msgstr "Erişime İzin Ver"
#: js/ui/appDisplay.js:944
#: js/ui/appDisplay.js:902
msgid "Unnamed Folder"
msgstr "Adsız Klasör"
#: js/ui/appDisplay.js:967
msgid "Frequently used applications will appear here"
msgstr "Sık kullanılan uygulamalar burada yer alacak"
#: js/ui/appDisplay.js:1102
msgid "Frequent"
msgstr "Sık Sık"
#: js/ui/appDisplay.js:1109
msgid "All"
msgstr "Tümü"
#. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2486 js/ui/panel.js:75
#: js/ui/appDisplay.js:2241 js/ui/panel.js:75
msgid "Open Windows"
msgstr "Açık Pencereler"
#: js/ui/appDisplay.js:2505 js/ui/panel.js:82
#: js/ui/appDisplay.js:2260 js/ui/panel.js:82
msgid "New Window"
msgstr "Yeni Pencere"
#: js/ui/appDisplay.js:2521
#: js/ui/appDisplay.js:2276
msgid "Launch using Integrated Graphics Card"
msgstr "Tümleşik Ekran Kartıyla Başlat"
#: js/ui/appDisplay.js:2522
#: js/ui/appDisplay.js:2277
msgid "Launch using Discrete Graphics Card"
msgstr "Ayrık Ekran Kartıyla Başlat"
#: js/ui/appDisplay.js:2550 js/ui/dash.js:239
#: js/ui/appDisplay.js:2305 js/ui/dash.js:239
msgid "Remove from Favorites"
msgstr "Sık Kullanılanlardan Çıkar"
#: js/ui/appDisplay.js:2556
#: js/ui/appDisplay.js:2311
msgid "Add to Favorites"
msgstr "Sık Kullanılanlara Ekle"
#: js/ui/appDisplay.js:2566 js/ui/panel.js:93
#: js/ui/appDisplay.js:2321 js/ui/panel.js:93
msgid "Show Details"
msgstr "Ayrıntıları Göster"
@ -781,7 +769,7 @@ msgstr "Kulaklıklar"
msgid "Headset"
msgstr "Kulaklıklı Mikrofon"
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:270
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:273
msgid "Microphone"
msgstr "Mikrofon"
@ -798,7 +786,7 @@ msgid "Settings"
msgstr "Ayarlar"
#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday).
#: js/ui/calendar.js:41
#: js/ui/calendar.js:36
msgctxt "calendar-no-work"
msgid "06"
msgstr "06"
@ -808,43 +796,43 @@ msgstr "06"
#. * NOTE: These grid abbreviations are always shown together
#. * and in order, e.g. "S M T W T F S".
#.
#: js/ui/calendar.js:70
#: js/ui/calendar.js:65
msgctxt "grid sunday"
msgid "S"
msgstr "P"
#. Translators: Calendar grid abbreviation for Monday
#: js/ui/calendar.js:72
#: js/ui/calendar.js:67
msgctxt "grid monday"
msgid "M"
msgstr "P"
#. Translators: Calendar grid abbreviation for Tuesday
#: js/ui/calendar.js:74
#: js/ui/calendar.js:69
msgctxt "grid tuesday"
msgid "T"
msgstr "S"
#. Translators: Calendar grid abbreviation for Wednesday
#: js/ui/calendar.js:76
#: js/ui/calendar.js:71
msgctxt "grid wednesday"
msgid "W"
msgstr "Ç"
#. Translators: Calendar grid abbreviation for Thursday
#: js/ui/calendar.js:78
#: js/ui/calendar.js:73
msgctxt "grid thursday"
msgid "T"
msgstr "P"
#. Translators: Calendar grid abbreviation for Friday
#: js/ui/calendar.js:80
#: js/ui/calendar.js:75
msgctxt "grid friday"
msgid "F"
msgstr "C"
#. Translators: Calendar grid abbreviation for Saturday
#: js/ui/calendar.js:82
#: js/ui/calendar.js:77
msgctxt "grid saturday"
msgid "S"
msgstr "C"
@ -855,7 +843,7 @@ msgstr "C"
#. * "%OB" is the new format specifier introduced in glibc 2.27,
#. * in most cases you should not change it.
#.
#: js/ui/calendar.js:397
#: js/ui/calendar.js:392
msgid "%OB"
msgstr "%OB"
@ -868,61 +856,37 @@ msgstr "%OB"
#. * in most cases you should not use the old "%B" here unless you
#. * absolutely know what you are doing.
#.
#: js/ui/calendar.js:407
#: js/ui/calendar.js:402
msgid "%OB %Y"
msgstr "%OB %Y"
#: js/ui/calendar.js:466
#: js/ui/calendar.js:461
msgid "Previous month"
msgstr "Önceki ay"
#: js/ui/calendar.js:481
#: js/ui/calendar.js:476
msgid "Next month"
msgstr "Gelecek ay"
#: js/ui/calendar.js:631
#: js/ui/calendar.js:626
#, no-javascript-format
msgctxt "date day number format"
msgid "%d"
msgstr "%d"
#: js/ui/calendar.js:687
#: js/ui/calendar.js:682
msgid "Week %V"
msgstr "%V. Hafta"
#. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters
#.
#: js/ui/calendar.js:762
msgctxt "event list time"
msgid "All Day"
msgstr "Tüm Gün"
#. Translators: Shown on calendar heading when selected day occurs on current year
#: js/ui/calendar.js:900
msgctxt "calendar heading"
msgid "%A, %B %-d"
msgstr "%A, %-d %B"
#. Translators: Shown on calendar heading when selected day occurs on different year
#: js/ui/calendar.js:903
msgctxt "calendar heading"
msgid "%A, %B %-d, %Y"
msgstr "%A, %-d %B, %Y"
#: js/ui/calendar.js:1133
#: js/ui/calendar.js:895
msgid "No Notifications"
msgstr "Bildirim Yok"
#: js/ui/calendar.js:1136
msgid "No Events"
msgstr "Olay Yok"
#: js/ui/calendar.js:1190
#: js/ui/calendar.js:949
msgid "Do Not Disturb"
msgstr "Rahatsız Etme"
#: js/ui/calendar.js:1209
#: js/ui/calendar.js:968
msgid "Clear"
msgstr "Temizle"
@ -1076,7 +1040,7 @@ msgstr "Üzgünüm ama işe yaramadı. Lütfen yeniden deneyin."
msgid "%s is now known as %s"
msgstr "%s, şimdi %s olarak biliniyor"
#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:177
#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:178
msgid "Windows"
msgstr "Pencereler"
@ -1095,7 +1059,7 @@ msgstr "Konsol"
#. * "Tue 9:29 AM"). The string itself should become a full date, e.g.,
#. * "February 17 2015".
#.
#: js/ui/dateMenu.js:75
#: js/ui/dateMenu.js:79
msgid "%B %-d %Y"
msgstr "%-d %B %Y"
@ -1103,35 +1067,67 @@ msgstr "%-d %B %Y"
#. * below the time in the shell; it should combine the weekday and the
#. * date, e.g. "Tuesday February 17 2015".
#.
#: js/ui/dateMenu.js:82
#: js/ui/dateMenu.js:86
msgid "%A %B %e %Y"
msgstr "%e %B %Y %A"
#: js/ui/dateMenu.js:161
#. Translators: Shown on calendar heading when selected day occurs on current year
#: js/ui/dateMenu.js:151
msgctxt "calendar heading"
msgid "%B %-d"
msgstr "%-d %B"
#. Translators: Shown on calendar heading when selected day occurs on different year
#: js/ui/dateMenu.js:154
msgctxt "calendar heading"
msgid "%B %-d %Y"
msgstr "%-d %B %Y"
#: js/ui/dateMenu.js:160
msgid "Today"
msgstr "Bugün"
#: js/ui/dateMenu.js:164
msgid "Tomorrow"
msgstr "Yarın"
#. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters
#.
#: js/ui/dateMenu.js:180
msgctxt "event list time"
msgid "All Day"
msgstr "Tüm Gün"
#: js/ui/dateMenu.js:231
msgid "No Events"
msgstr "Olay Yok"
#: js/ui/dateMenu.js:348
msgid "Add world clocks…"
msgstr "Dünya saatlerini ekle…"
#: js/ui/dateMenu.js:162
#: js/ui/dateMenu.js:349
msgid "World Clocks"
msgstr "Dünya Saatleri"
#: js/ui/dateMenu.js:424
#: js/ui/dateMenu.js:629
msgid "Loading…"
msgstr "Yükleniyor…"
#: js/ui/dateMenu.js:434
#: js/ui/dateMenu.js:639
msgid "Go online for weather information"
msgstr "Hava durumu bilgisi için çevrim içi olun"
#: js/ui/dateMenu.js:436
#: js/ui/dateMenu.js:641
msgid "Weather information is currently unavailable"
msgstr "Hava durumu bilgisi şu anda kullanılabilir değil"
#: js/ui/dateMenu.js:446
#: js/ui/dateMenu.js:651
msgid "Weather"
msgstr "Hava Durumu"
#: js/ui/dateMenu.js:448
#: js/ui/dateMenu.js:653
msgid "Select weather location…"
msgstr "Hava durumu konumu seç…"
@ -1290,11 +1286,11 @@ msgstr "Uzantı Yükle"
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "extensions.gnome.org üstünden “%s” uzantısı indirilip kurulsun mu?"
#: js/ui/extensionSystem.js:251
#: js/ui/extensionSystem.js:252
msgid "Extension Updates Available"
msgstr "Uzantı Güncellemeleri Var"
#: js/ui/extensionSystem.js:252
#: js/ui/extensionSystem.js:253
msgid "Extension updates are ready to be installed."
msgstr "Uzantı güncellemeleri kuruluma hazır."
@ -1421,6 +1417,7 @@ msgid "Disabled"
msgstr "Devre dışı"
#: js/ui/lookingGlass.js:743
#: subprojects/extensions-app/data/ui/extension-row.ui:188
msgid "Error"
msgstr "Hata"
@ -1464,11 +1461,11 @@ msgstr "Ekran Kilitleme, GNOME ekran yöneticisi gerektirir."
msgid "System Information"
msgstr "Sistem Bilgisi"
#: js/ui/mpris.js:204
#: js/ui/mpris.js:203
msgid "Unknown artist"
msgstr "Bilinmeyen sanatçı"
#: js/ui/mpris.js:214
#: js/ui/mpris.js:213
msgid "Unknown title"
msgstr "Bilinmeyen başlık"
@ -1514,23 +1511,23 @@ msgstr "Tuş vuruşu ata"
msgid "Done"
msgstr "Bitti"
#: js/ui/padOsd.js:745
#: js/ui/padOsd.js:732
msgid "Edit…"
msgstr "Düzenle…"
#: js/ui/padOsd.js:787 js/ui/padOsd.js:910
#: js/ui/padOsd.js:774 js/ui/padOsd.js:891
msgid "None"
msgstr "Yok"
#: js/ui/padOsd.js:863
#: js/ui/padOsd.js:845
msgid "Press a button to configure"
msgstr "Yapılandırmak için düğmeye bas"
#: js/ui/padOsd.js:864
#: js/ui/padOsd.js:846
msgid "Press Esc to exit"
msgstr "Çıkmak için Escye bas"
#: js/ui/padOsd.js:867
#: js/ui/padOsd.js:849
msgid "Press any key to exit"
msgstr "Çıkmak için herhangi bir tuşa bas"
@ -1588,15 +1585,15 @@ msgstr "Kilitlenemedi"
msgid "Lock was blocked by an application"
msgstr "Kilitleme bir uygulama tarafından engellendi"
#: js/ui/search.js:702
#: js/ui/search.js:823
msgid "Searching…"
msgstr "Aranıyor…"
#: js/ui/search.js:704
#: js/ui/search.js:825
msgid "No results."
msgstr "Sonuç yok."
#: js/ui/search.js:830
#: js/ui/search.js:951
#, javascript-format
msgid "%d more"
msgid_plural "%d more"
@ -1793,17 +1790,17 @@ msgstr "Konum Devre Dışı"
msgid "Enable"
msgstr "Etkinleştir"
#: js/ui/status/location.js:355
#: js/ui/status/location.js:350
msgid "Allow location access"
msgstr "Konum erişimine izin ver"
#. Translators: %s is an application name
#: js/ui/status/location.js:357
#: js/ui/status/location.js:352
#, javascript-format
msgid "The app %s wants to access your location"
msgstr "%s uygulaması konumunuza erişmek istiyor"
#: js/ui/status/location.js:367
#: js/ui/status/location.js:362
msgid "Location access can be changed at any time from the privacy settings."
msgstr "Konum erişimi, gizlilik ayarlarından her zaman değiştirilebilir."
@ -2134,11 +2131,11 @@ msgstr "Thunderbolt yetkilendirme hatası"
msgid "Could not authorize the Thunderbolt device: %s"
msgstr "Thunderbolt aygıtı yetkilendirilemedi: %s"
#: js/ui/status/volume.js:151
#: js/ui/status/volume.js:154
msgid "Volume changed"
msgstr "Bölüm değişti"
#: js/ui/status/volume.js:222
#: js/ui/status/volume.js:225
msgid "Volume"
msgstr "Bölüm"
@ -2192,11 +2189,11 @@ msgstr "Kilit Açma Penceresi"
msgid "Log in as another user"
msgstr "Başka kullanıcı olarak oturum aç"
#: js/ui/viewSelector.js:181
#: js/ui/viewSelector.js:182
msgid "Applications"
msgstr "Uygulamalar"
#: js/ui/viewSelector.js:185
#: js/ui/viewSelector.js:186
msgid "Search"
msgstr "Ara"
@ -2402,26 +2399,34 @@ msgid "%d extension will be updated on next login."
msgid_plural "%d extensions will be updated on next login."
msgstr[0] "%d uzantı sonraki girişte güncellenecek."
#: subprojects/extensions-app/data/ui/extension-row.ui:100
#: subprojects/extensions-tool/src/command-create.c:301
#: subprojects/extensions-app/js/main.js:461
msgid "The extension is incompatible with the current GNOME version"
msgstr "Uzantı, geçerli GNOME sürümüyle uyumsuz"
#: subprojects/extensions-app/js/main.js:464
msgid "The extension had an error"
msgstr "Uzantıda hata oluştu"
#: subprojects/extensions-app/data/ui/extension-row.ui:109
#: subprojects/extensions-tool/src/command-create.c:325
#: subprojects/extensions-tool/src/main.c:241
msgid "Description"
msgstr "Açıklama"
#: subprojects/extensions-app/data/ui/extension-row.ui:123
#: subprojects/extensions-app/data/ui/extension-row.ui:132
#: subprojects/extensions-tool/src/main.c:253
msgid "Version"
msgstr "Sürüm"
#: subprojects/extensions-app/data/ui/extension-row.ui:151
#: subprojects/extensions-app/data/ui/extension-row.ui:160
msgid "Author"
msgstr "Yazar"
#: subprojects/extensions-app/data/ui/extension-row.ui:175
#: subprojects/extensions-app/data/ui/extension-row.ui:216
msgid "Website"
msgstr "Web Sitesi"
#: subprojects/extensions-app/data/ui/extension-row.ui:192
#: subprojects/extensions-app/data/ui/extension-row.ui:233
msgid "Remove…"
msgstr "Kaldır…"
@ -2483,12 +2488,12 @@ msgid "Log Out…"
msgstr "Oturumu Kapat…"
#. Translators: a file path to an extension directory
#: subprojects/extensions-tool/src/command-create.c:202
#: subprojects/extensions-tool/src/command-create.c:226
#, c-format
msgid "The new extension was successfully created in %s.\n"
msgstr "Yeni uzantı %s içinde oluşturuldu.\n"
#: subprojects/extensions-tool/src/command-create.c:275
#: subprojects/extensions-tool/src/command-create.c:299
#, c-format
msgid ""
"Name should be a very short (ideally descriptive) string.\n"
@ -2497,12 +2502,12 @@ msgstr ""
"Ad çok kısa (ideal olarak açıklayıcı) dizge olmalıdır.\n"
"Örnekler: %s"
#: subprojects/extensions-tool/src/command-create.c:281
#: subprojects/extensions-tool/src/command-create.c:305
#: subprojects/extensions-tool/src/main.c:238
msgid "Name"
msgstr "Ad"
#: subprojects/extensions-tool/src/command-create.c:295
#: subprojects/extensions-tool/src/command-create.c:319
#, c-format
msgid ""
"Description is a single-sentence explanation of what your extension does.\n"
@ -2511,7 +2516,7 @@ msgstr ""
"Açıklama, uzantınızın ne yaptığı anlatan tek tümcelik tanımlamadır.\n"
"Örnekler: %s"
#: subprojects/extensions-tool/src/command-create.c:315
#: subprojects/extensions-tool/src/command-create.c:339
msgid ""
"UUID is a globally-unique identifier for your extension.\n"
"This should be in the format of an email address (clicktofocus@janedoe."
@ -2520,56 +2525,56 @@ msgstr ""
"UUID, uzantınız için genel ve benzersiz tanımlayıcıdır.\n"
"E-posta biçiminde olmalıdır (clicktofocus@janedoe.example.com)\n"
#: subprojects/extensions-tool/src/command-create.c:342
#: subprojects/extensions-tool/src/command-create.c:366
msgid "Choose one of the available templates:\n"
msgstr "Uygun şablonlardan birini seçin:\n"
#: subprojects/extensions-tool/src/command-create.c:356
#: subprojects/extensions-tool/src/command-create.c:380
msgid "Template"
msgstr "Şablon"
#: subprojects/extensions-tool/src/command-create.c:411
#: subprojects/extensions-tool/src/command-create.c:435
msgid "The unique identifier of the new extension"
msgstr "Yeni uzantının eşsiz tanımlayıcısı"
#: subprojects/extensions-tool/src/command-create.c:414
#: subprojects/extensions-tool/src/command-create.c:438
msgid "NAME"
msgstr "AD"
#: subprojects/extensions-tool/src/command-create.c:415
#: subprojects/extensions-tool/src/command-create.c:439
msgid "The user-visible name of the new extension"
msgstr "Yeni uzantının kullanıcı tarafından görülebilir adı"
#: subprojects/extensions-tool/src/command-create.c:417
#: subprojects/extensions-tool/src/command-create.c:441
msgid "DESCRIPTION"
msgstr "AÇIKLAMA"
#: subprojects/extensions-tool/src/command-create.c:419
#: subprojects/extensions-tool/src/command-create.c:443
msgid "A short description of what the extension does"
msgstr "Uzantının ne yaptığına dair kısa açıklama"
#: subprojects/extensions-tool/src/command-create.c:422
#: subprojects/extensions-tool/src/command-create.c:446
msgid "TEMPLATE"
msgstr "ŞABLON"
#: subprojects/extensions-tool/src/command-create.c:423
#: subprojects/extensions-tool/src/command-create.c:447
msgid "The template to use for the new extension"
msgstr "Yeni uzantı için kullanılacak şablon"
#: subprojects/extensions-tool/src/command-create.c:429
#: subprojects/extensions-tool/src/command-create.c:453
msgid "Enter extension information interactively"
msgstr "Uzantı bilgisini etkileşimli olarak gir"
#: subprojects/extensions-tool/src/command-create.c:437
#: subprojects/extensions-tool/src/command-create.c:461
msgid "Create a new extension"
msgstr "Yeni uzantı oluştur"
#: subprojects/extensions-tool/src/command-create.c:455
#: subprojects/extensions-tool/src/command-create.c:479
#: subprojects/extensions-tool/src/command-list.c:172
msgid "Unknown arguments"
msgstr "Bilinmeyen argüman"
#: subprojects/extensions-tool/src/command-create.c:480
#: subprojects/extensions-tool/src/command-create.c:504
msgid "UUID, name and description are required"
msgstr "UUID, ad ve açıklama gereklidir"
@ -2889,7 +2894,23 @@ msgstr[0] "%u Girdi"
msgid "System Sounds"
msgstr "Sistem Sesleri"
#, javascript-format
#~ msgid "Frequently used applications will appear here"
#~ msgstr "Sık kullanılan uygulamalar burada yer alacak"
#~ msgid "Frequent"
#~ msgstr "Sık Sık"
#~ msgid "All"
#~ msgstr "Tümü"
#~ msgctxt "calendar heading"
#~ msgid "%A, %B %-d"
#~ msgstr "%A, %-d %B"
#~ msgctxt "calendar heading"
#~ msgid "%A, %B %-d, %Y"
#~ msgstr "%A, %-d %B, %Y"
#~ msgid "%d Connected"
#~ msgid_plural "%d Connected"
#~ msgstr[0] "%d Aygıt Bağlandı"
@ -3217,12 +3238,6 @@ msgstr "Sistem Sesleri"
#~ msgid "Nothing Scheduled"
#~ msgstr "Planınız Boş"
#~ msgid "Today"
#~ msgstr "Bugün"
#~ msgid "Tomorrow"
#~ msgstr "Yarın"
#~ msgid "This week"
#~ msgstr "Bu hafta"

230
po/uk.po
View File

@ -10,8 +10,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-05-21 23:22+0000\n"
"PO-Revision-Date: 2020-05-22 08:44+0300\n"
"POT-Creation-Date: 2020-06-05 23:11+0000\n"
"PO-Revision-Date: 2020-06-06 15:53+0300\n"
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
"Language-Team: Ukrainian <kde-i18n-uk@kde.org>\n"
"Language: uk\n"
@ -578,7 +578,7 @@ msgstr[1] "%d години тому"
msgstr[2] "%d годин тому"
msgstr[3] "%d година тому"
#: js/misc/util.js:191
#: js/misc/util.js:191 js/ui/dateMenu.js:162
msgid "Yesterday"
msgstr "Учора"
@ -705,56 +705,44 @@ msgstr ""
#. No support for non-modal system dialogs, so ignore the option
#. let modal = options['modal'] || true;
#: js/ui/accessDialog.js:39 js/ui/status/location.js:374
#: js/ui/accessDialog.js:39 js/ui/status/location.js:369
msgid "Deny Access"
msgstr "Заборонити доступ"
#: js/ui/accessDialog.js:40 js/ui/status/location.js:377
#: js/ui/accessDialog.js:40 js/ui/status/location.js:372
msgid "Grant Access"
msgstr "Надати доступ"
#: js/ui/appDisplay.js:944
#: js/ui/appDisplay.js:956
msgid "Unnamed Folder"
msgstr "Неназвана тека"
#: js/ui/appDisplay.js:967
msgid "Frequently used applications will appear here"
msgstr "Часто використовувані програми будуть з'являтись тут"
#: js/ui/appDisplay.js:1102
msgid "Frequent"
msgstr "Частовживане"
#: js/ui/appDisplay.js:1109
msgid "All"
msgstr "Усе"
#. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2486 js/ui/panel.js:75
#: js/ui/appDisplay.js:2215 js/ui/panel.js:75
msgid "Open Windows"
msgstr "Відкрити вікна"
#: js/ui/appDisplay.js:2505 js/ui/panel.js:82
#: js/ui/appDisplay.js:2234 js/ui/panel.js:82
msgid "New Window"
msgstr "Нове вікно"
#: js/ui/appDisplay.js:2521
#: js/ui/appDisplay.js:2250
msgid "Launch using Integrated Graphics Card"
msgstr "Запустити через інтегровану графічну плату"
#: js/ui/appDisplay.js:2522
#: js/ui/appDisplay.js:2251
msgid "Launch using Discrete Graphics Card"
msgstr "Запустити через дискретну графічну плату"
#: js/ui/appDisplay.js:2550 js/ui/dash.js:239
#: js/ui/appDisplay.js:2279 js/ui/dash.js:239
msgid "Remove from Favorites"
msgstr "Вилучити з улюбленого"
#: js/ui/appDisplay.js:2556
#: js/ui/appDisplay.js:2285
msgid "Add to Favorites"
msgstr "Додати до улюбленого"
#: js/ui/appDisplay.js:2566 js/ui/panel.js:93
#: js/ui/appDisplay.js:2295 js/ui/panel.js:93
msgid "Show Details"
msgstr "Показати подробиці"
@ -801,7 +789,7 @@ msgid "Settings"
msgstr "Параметри"
#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday).
#: js/ui/calendar.js:41
#: js/ui/calendar.js:36
msgctxt "calendar-no-work"
msgid "06"
msgstr "06"
@ -811,43 +799,43 @@ msgstr "06"
#. * NOTE: These grid abbreviations are always shown together
#. * and in order, e.g. "S M T W T F S".
#.
#: js/ui/calendar.js:70
#: js/ui/calendar.js:65
msgctxt "grid sunday"
msgid "S"
msgstr "Н"
#. Translators: Calendar grid abbreviation for Monday
#: js/ui/calendar.js:72
#: js/ui/calendar.js:67
msgctxt "grid monday"
msgid "M"
msgstr "П"
#. Translators: Calendar grid abbreviation for Tuesday
#: js/ui/calendar.js:74
#: js/ui/calendar.js:69
msgctxt "grid tuesday"
msgid "T"
msgstr "В"
#. Translators: Calendar grid abbreviation for Wednesday
#: js/ui/calendar.js:76
#: js/ui/calendar.js:71
msgctxt "grid wednesday"
msgid "W"
msgstr "С"
#. Translators: Calendar grid abbreviation for Thursday
#: js/ui/calendar.js:78
#: js/ui/calendar.js:73
msgctxt "grid thursday"
msgid "T"
msgstr "Ч"
#. Translators: Calendar grid abbreviation for Friday
#: js/ui/calendar.js:80
#: js/ui/calendar.js:75
msgctxt "grid friday"
msgid "F"
msgstr "П"
#. Translators: Calendar grid abbreviation for Saturday
#: js/ui/calendar.js:82
#: js/ui/calendar.js:77
msgctxt "grid saturday"
msgid "S"
msgstr "С"
@ -858,7 +846,7 @@ msgstr "С"
#. * "%OB" is the new format specifier introduced in glibc 2.27,
#. * in most cases you should not change it.
#.
#: js/ui/calendar.js:397
#: js/ui/calendar.js:392
msgid "%OB"
msgstr "%OB"
@ -871,61 +859,37 @@ msgstr "%OB"
#. * in most cases you should not use the old "%B" here unless you
#. * absolutely know what you are doing.
#.
#: js/ui/calendar.js:407
#: js/ui/calendar.js:402
msgid "%OB %Y"
msgstr "%OB %Y"
#: js/ui/calendar.js:466
#: js/ui/calendar.js:461
msgid "Previous month"
msgstr "Попередній місяць"
#: js/ui/calendar.js:481
#: js/ui/calendar.js:476
msgid "Next month"
msgstr "Наступний місяць"
#: js/ui/calendar.js:631
#: js/ui/calendar.js:626
#, no-javascript-format
msgctxt "date day number format"
msgid "%d"
msgstr "%d"
#: js/ui/calendar.js:687
#: js/ui/calendar.js:682
msgid "Week %V"
msgstr "Тиждень %V"
#. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters
#.
#: js/ui/calendar.js:762
msgctxt "event list time"
msgid "All Day"
msgstr "Увесь день"
#. Translators: Shown on calendar heading when selected day occurs on current year
#: js/ui/calendar.js:900
msgctxt "calendar heading"
msgid "%A, %B %-d"
msgstr "%A, %-d %B"
#. Translators: Shown on calendar heading when selected day occurs on different year
#: js/ui/calendar.js:903
msgctxt "calendar heading"
msgid "%A, %B %-d, %Y"
msgstr "%A, %-d %B, %Y"
#: js/ui/calendar.js:1133
#: js/ui/calendar.js:895
msgid "No Notifications"
msgstr "Немає сповіщень"
#: js/ui/calendar.js:1136
msgid "No Events"
msgstr "Немає подій"
#: js/ui/calendar.js:1190
#: js/ui/calendar.js:949
msgid "Do Not Disturb"
msgstr "Не турбувати"
#: js/ui/calendar.js:1209
#: js/ui/calendar.js:968
msgid "Clear"
msgstr "Очистити"
@ -1076,7 +1040,7 @@ msgstr "Вибачте, це не спрацювало. Спробуйте ще.
msgid "%s is now known as %s"
msgstr "%s тепер відомий як %s"
#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:177
#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:178
msgid "Windows"
msgstr "Вікна"
@ -1095,7 +1059,7 @@ msgstr "Риска"
#. * "Tue 9:29 AM"). The string itself should become a full date, e.g.,
#. * "February 17 2015".
#.
#: js/ui/dateMenu.js:75
#: js/ui/dateMenu.js:79
msgid "%B %-d %Y"
msgstr "%-d %B %Y"
@ -1103,35 +1067,69 @@ msgstr "%-d %B %Y"
#. * below the time in the shell; it should combine the weekday and the
#. * date, e.g. "Tuesday February 17 2015".
#.
#: js/ui/dateMenu.js:82
#: js/ui/dateMenu.js:86
msgid "%A %B %e %Y"
msgstr "%A %-d %B %Y"
#: js/ui/dateMenu.js:162
#. Translators: Shown on calendar heading when selected day occurs on current year
#: js/ui/dateMenu.js:151
#| msgid "%B %-d %Y"
msgctxt "calendar heading"
msgid "%B %-d"
msgstr "%-d %B"
#. Translators: Shown on calendar heading when selected day occurs on different year
#: js/ui/dateMenu.js:154
#| msgid "%B %-d %Y"
msgctxt "calendar heading"
msgid "%B %-d %Y"
msgstr "%-d %B %Y"
#: js/ui/dateMenu.js:160
msgid "Today"
msgstr "Сьогодні"
#: js/ui/dateMenu.js:164
msgid "Tomorrow"
msgstr "Завтра"
#. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters
#.
#: js/ui/dateMenu.js:180
msgctxt "event list time"
msgid "All Day"
msgstr "Увесь день"
#: js/ui/dateMenu.js:231
msgid "No Events"
msgstr "Немає подій"
#: js/ui/dateMenu.js:348
msgid "Add world clocks…"
msgstr "Додати світові годинники…"
#: js/ui/dateMenu.js:163
#: js/ui/dateMenu.js:349
msgid "World Clocks"
msgstr "Світові годинники"
#: js/ui/dateMenu.js:443
#: js/ui/dateMenu.js:629
msgid "Loading…"
msgstr "Завантаження…"
#: js/ui/dateMenu.js:453
#: js/ui/dateMenu.js:639
msgid "Go online for weather information"
msgstr "Увійти в мережу за прогнозом погоди"
#: js/ui/dateMenu.js:455
#: js/ui/dateMenu.js:641
msgid "Weather information is currently unavailable"
msgstr "Наразі інформації про погоду недоступна"
#: js/ui/dateMenu.js:465
#: js/ui/dateMenu.js:651
msgid "Weather"
msgstr "Погода"
#: js/ui/dateMenu.js:467
#: js/ui/dateMenu.js:653
msgid "Select weather location…"
msgstr "Виберіть місцевість для погоди…"
@ -1483,11 +1481,11 @@ msgstr "Блокування екрана потребує керування в
msgid "System Information"
msgstr "Інформація про систему"
#: js/ui/mpris.js:204
#: js/ui/mpris.js:203
msgid "Unknown artist"
msgstr "Невідомий виконавець"
#: js/ui/mpris.js:214
#: js/ui/mpris.js:213
msgid "Unknown title"
msgstr "Невідома назва"
@ -1533,23 +1531,23 @@ msgstr "Призначити клавішу"
msgid "Done"
msgstr "Зроблено"
#: js/ui/padOsd.js:745
#: js/ui/padOsd.js:732
msgid "Edit…"
msgstr "Редагувати…"
#: js/ui/padOsd.js:787 js/ui/padOsd.js:910
#: js/ui/padOsd.js:774 js/ui/padOsd.js:891
msgid "None"
msgstr "Немає"
#: js/ui/padOsd.js:863
#: js/ui/padOsd.js:845
msgid "Press a button to configure"
msgstr "Натисніть кнопку, щоб налаштувати"
#: js/ui/padOsd.js:864
#: js/ui/padOsd.js:846
msgid "Press Esc to exit"
msgstr "Натисніть клавішу «Esc», щоб вийти"
#: js/ui/padOsd.js:867
#: js/ui/padOsd.js:849
msgid "Press any key to exit"
msgstr "Натисніть будь-яку клавішу, щоб вийти"
@ -1813,17 +1811,17 @@ msgstr "Місцевість вимкнено"
msgid "Enable"
msgstr "Увімкнути"
#: js/ui/status/location.js:355
#: js/ui/status/location.js:350
msgid "Allow location access"
msgstr "Дозволити доступ до даних перебування"
#. Translators: %s is an application name
#: js/ui/status/location.js:357
#: js/ui/status/location.js:352
#, javascript-format
msgid "The app %s wants to access your location"
msgstr "Програмі %s потрібен доступ до даних щодо місця вашого перебування"
#: js/ui/status/location.js:367
#: js/ui/status/location.js:362
msgid "Location access can be changed at any time from the privacy settings."
msgstr ""
"Доступ до місця перебування можна змінити в будь-яку мить у параметрах "
@ -2222,11 +2220,11 @@ msgstr "Розблокувати вікно"
msgid "Log in as another user"
msgstr "Увійти як інший користувач"
#: js/ui/viewSelector.js:181
#: js/ui/viewSelector.js:182
msgid "Applications"
msgstr "Програми"
#: js/ui/viewSelector.js:185
#: js/ui/viewSelector.js:186
msgid "Search"
msgstr "Пошук"
@ -2443,12 +2441,11 @@ msgid "The extension is incompatible with the current GNOME version"
msgstr "Розширення є несумісним із поточною версією GNOME"
#: subprojects/extensions-app/js/main.js:464
#| msgid "Show extension info"
msgid "The extension had an error"
msgstr "У розширенні сталася помилка"
#: subprojects/extensions-app/data/ui/extension-row.ui:109
#: subprojects/extensions-tool/src/command-create.c:301
#: subprojects/extensions-tool/src/command-create.c:325
#: subprojects/extensions-tool/src/main.c:241
msgid "Description"
msgstr "Опис"
@ -2529,12 +2526,12 @@ msgid "Log Out…"
msgstr "Вийти…"
#. Translators: a file path to an extension directory
#: subprojects/extensions-tool/src/command-create.c:202
#: subprojects/extensions-tool/src/command-create.c:226
#, c-format
msgid "The new extension was successfully created in %s.\n"
msgstr "Нове розширення успішно створено в %s.\n"
#: subprojects/extensions-tool/src/command-create.c:275
#: subprojects/extensions-tool/src/command-create.c:299
#, c-format
msgid ""
"Name should be a very short (ideally descriptive) string.\n"
@ -2543,12 +2540,12 @@ msgstr ""
"Назва повинна бути дуже короткою (бажано максимально описовою).\n"
"Наприклад: %s"
#: subprojects/extensions-tool/src/command-create.c:281
#: subprojects/extensions-tool/src/command-create.c:305
#: subprojects/extensions-tool/src/main.c:238
msgid "Name"
msgstr "Назва"
#: subprojects/extensions-tool/src/command-create.c:295
#: subprojects/extensions-tool/src/command-create.c:319
#, c-format
msgid ""
"Description is a single-sentence explanation of what your extension does.\n"
@ -2557,7 +2554,7 @@ msgstr ""
"Опис — пояснення одним реченням того, що розширення робить.\n"
"Наприклад: %s"
#: subprojects/extensions-tool/src/command-create.c:315
#: subprojects/extensions-tool/src/command-create.c:339
msgid ""
"UUID is a globally-unique identifier for your extension.\n"
"This should be in the format of an email address (clicktofocus@janedoe."
@ -2567,56 +2564,56 @@ msgstr ""
"Він зберігається у форматі електронної адреси (clicktofocus@janedoe.example."
"com)\n"
#: subprojects/extensions-tool/src/command-create.c:342
#: subprojects/extensions-tool/src/command-create.c:366
msgid "Choose one of the available templates:\n"
msgstr "Виберіть один із доступних шаблонів:\n"
#: subprojects/extensions-tool/src/command-create.c:356
#: subprojects/extensions-tool/src/command-create.c:380
msgid "Template"
msgstr "Шаблон"
#: subprojects/extensions-tool/src/command-create.c:411
#: subprojects/extensions-tool/src/command-create.c:435
msgid "The unique identifier of the new extension"
msgstr "Унікальний код розширення"
#: subprojects/extensions-tool/src/command-create.c:414
#: subprojects/extensions-tool/src/command-create.c:438
msgid "NAME"
msgstr "НАЗВА"
#: subprojects/extensions-tool/src/command-create.c:415
#: subprojects/extensions-tool/src/command-create.c:439
msgid "The user-visible name of the new extension"
msgstr "Загальна назва розширення"
#: subprojects/extensions-tool/src/command-create.c:417
#: subprojects/extensions-tool/src/command-create.c:441
msgid "DESCRIPTION"
msgstr "ОПИС"
#: subprojects/extensions-tool/src/command-create.c:419
#: subprojects/extensions-tool/src/command-create.c:443
msgid "A short description of what the extension does"
msgstr "Короткий опис того, що розширення робить"
#: subprojects/extensions-tool/src/command-create.c:422
#: subprojects/extensions-tool/src/command-create.c:446
msgid "TEMPLATE"
msgstr "ШАБЛОН"
#: subprojects/extensions-tool/src/command-create.c:423
#: subprojects/extensions-tool/src/command-create.c:447
msgid "The template to use for the new extension"
msgstr "Шаблон, яким слід скористатися для нового розширення"
#: subprojects/extensions-tool/src/command-create.c:429
#: subprojects/extensions-tool/src/command-create.c:453
msgid "Enter extension information interactively"
msgstr "Ввести інформацію про розширення покроково"
#: subprojects/extensions-tool/src/command-create.c:437
#: subprojects/extensions-tool/src/command-create.c:461
msgid "Create a new extension"
msgstr "Створити розширення"
#: subprojects/extensions-tool/src/command-create.c:455
#: subprojects/extensions-tool/src/command-create.c:479
#: subprojects/extensions-tool/src/command-list.c:172
msgid "Unknown arguments"
msgstr "Невідомі параметри"
#: subprojects/extensions-tool/src/command-create.c:480
#: subprojects/extensions-tool/src/command-create.c:504
msgid "UUID, name and description are required"
msgstr "UUID, назва і опис — обов'язкові"
@ -2942,6 +2939,23 @@ msgstr[3] "%u вхід"
msgid "System Sounds"
msgstr "Системні звуки"
#~ msgid "Frequently used applications will appear here"
#~ msgstr "Часто використовувані програми будуть з'являтись тут"
#~ msgid "Frequent"
#~ msgstr "Частовживане"
#~ msgid "All"
#~ msgstr "Усе"
#~ msgctxt "calendar heading"
#~ msgid "%A, %B %-d"
#~ msgstr "%A, %-d %B"
#~ msgctxt "calendar heading"
#~ msgid "%A, %B %-d, %Y"
#~ msgstr "%A, %-d %B, %Y"
#~ msgid "Copy Error"
#~ msgstr "Скопіювати помилку"

File diff suppressed because it is too large Load Diff

View File

@ -695,10 +695,35 @@ app_stop_view (App *app,
g_signal_handlers_disconnect_by_func (view, on_objects_removed, app);
}
static void
app_notify_has_calendars (App *app)
{
GVariantBuilder dict_builder;
g_variant_builder_init (&dict_builder, G_VARIANT_TYPE ("a{sv}"));
g_variant_builder_add (&dict_builder, "{sv}", "HasCalendars",
g_variant_new_boolean (app_has_calendars (app)));
g_dbus_connection_emit_signal (app->connection,
NULL,
"/org/gnome/Shell/CalendarServer",
"org.freedesktop.DBus.Properties",
"PropertiesChanged",
g_variant_new ("(sa{sv}as)",
"org.gnome.Shell.CalendarServer",
&dict_builder,
NULL),
NULL);
g_variant_builder_clear (&dict_builder);
}
static void
app_update_views (App *app)
{
GSList *link, *clients;
gboolean had_views, has_views;
had_views = app->live_views != NULL;
for (link = app->live_views; link; link = g_slist_next (link))
{
@ -723,31 +748,14 @@ app_update_views (App *app)
app->live_views = g_slist_prepend (app->live_views, view);
}
has_views = app->live_views != NULL;
if (has_views != had_views)
app_notify_has_calendars (app);
g_slist_free_full (clients, g_object_unref);
}
static void
app_notify_has_calendars (App *app)
{
GVariantBuilder dict_builder;
g_variant_builder_init (&dict_builder, G_VARIANT_TYPE ("a{sv}"));
g_variant_builder_add (&dict_builder, "{sv}", "HasCalendars",
g_variant_new_boolean (app_has_calendars (app)));
g_dbus_connection_emit_signal (g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL),
NULL,
"/org/gnome/Shell/CalendarServer",
"org.freedesktop.DBus.Properties",
"PropertiesChanged",
g_variant_new ("(sa{sv}as)",
"org.gnome.Shell.CalendarServer",
&dict_builder,
NULL),
NULL);
g_variant_builder_clear (&dict_builder);
}
static void
on_client_appeared_cb (CalendarSources *sources,
ECalClient *client,

View File

@ -253,7 +253,9 @@ deep_count_one (DeepCountState *state,
else
{
content_type = g_file_info_get_content_type (info);
add_content_type_to_cache (state, content_type);
if (content_type)
add_content_type_to_cache (state, content_type);
}
}

View File

@ -40,7 +40,7 @@ typedef struct _TransferData TransferData;
struct _TransferData
{
StClipboard *clipboard;
StClipboardCallbackFunc callback;
GCallback callback;
gpointer user_data;
GOutputStream *stream;
};
@ -140,12 +140,29 @@ transfer_cb (MetaSelection *selection,
memcpy (text, g_memory_output_stream_get_data (G_MEMORY_OUTPUT_STREAM (data->stream)), data_size);
}
data->callback (data->clipboard, text, data->user_data);
((StClipboardCallbackFunc) data->callback) (data->clipboard, text,
data->user_data);
g_object_unref (data->stream);
g_free (data);
g_free (text);
}
static void
transfer_bytes_cb (MetaSelection *selection,
GAsyncResult *res,
TransferData *data)
{
GBytes *bytes = NULL;
if (meta_selection_transfer_finish (selection, res, NULL))
bytes = g_memory_output_stream_steal_as_bytes (G_MEMORY_OUTPUT_STREAM (data->stream));
((StClipboardContentCallbackFunc) data->callback) (data->clipboard, bytes,
data->user_data);
g_object_unref (data->stream);
g_clear_pointer (&bytes, g_bytes_unref);
}
/**
* st_clipboard_get_mimetypes:
* @clipboard: a #StClipboard
@ -205,7 +222,7 @@ st_clipboard_get_text (StClipboard *clipboard,
data = g_new0 (TransferData, 1);
data->clipboard = clipboard;
data->callback = callback;
data->callback = G_CALLBACK (callback);
data->user_data = user_data;
data->stream = g_memory_output_stream_new_resizable ();
@ -217,6 +234,52 @@ st_clipboard_get_text (StClipboard *clipboard,
data);
}
/**
* st_clipboard_get_content:
* @clipboard: A #StCliboard
* @type: The type of clipboard data you want
* @mimetype: The mimetype to get content for
* @callback: (scope async): function to be called when the type is retrieved
* @user_data: data to be passed to the callback
*
* Request the data from the clipboard in #GBytes form. @callback is executed
* when the data is retrieved.
*
*/
void
st_clipboard_get_content (StClipboard *clipboard,
StClipboardType type,
const gchar *mimetype,
StClipboardContentCallbackFunc callback,
gpointer user_data)
{
MetaSelectionType selection_type;
TransferData *data;
g_return_if_fail (ST_IS_CLIPBOARD (clipboard));
g_return_if_fail (meta_selection != NULL);
g_return_if_fail (callback != NULL);
if (!mimetype || !convert_type (type, &selection_type))
{
callback (clipboard, NULL, user_data);
return;
}
data = g_new0 (TransferData, 1);
data->clipboard = clipboard;
data->callback = G_CALLBACK (callback);
data->user_data = user_data;
data->stream = g_memory_output_stream_new_resizable ();
meta_selection_transfer_async (meta_selection,
selection_type,
mimetype, -1,
data->stream, NULL,
(GAsyncReadyCallback) transfer_bytes_cb,
data);
}
/**
* st_clipboard_set_content:
* @clipboard: A #StClipboard

View File

@ -63,6 +63,18 @@ typedef void (*StClipboardCallbackFunc) (StClipboard *clipboard,
const gchar *text,
gpointer user_data);
/**
* StClipboardContentCallbackFunc:
* @clipboard: A #StClipboard
* @bytes: content from the clipboard
* @user_data: user data
*
* Callback function called when content is retrieved from the clipboard.
*/
typedef void (*StClipboardContentCallbackFunc) (StClipboard *clipboard,
GBytes *bytes,
gpointer user_data);
StClipboard* st_clipboard_get_default (void);
GList * st_clipboard_get_mimetypes (StClipboard *clipboard,
@ -80,6 +92,11 @@ void st_clipboard_set_content (StClipboard *clipboard,
StClipboardType type,
const gchar *mimetype,
GBytes *bytes);
void st_clipboard_get_content (StClipboard *clipboard,
StClipboardType type,
const gchar *mimetype,
StClipboardContentCallbackFunc callback,
gpointer user_data);
void st_clipboard_set_selection (MetaSelection *selection);

View File

@ -678,6 +678,8 @@ st_entry_key_press_event (ClutterActor *actor,
ST_CLIPBOARD_TYPE_CLIPBOARD,
text);
g_free (text);
return TRUE;
}
@ -704,6 +706,8 @@ st_entry_key_press_event (ClutterActor *actor,
clutter_text_delete_selection ((ClutterText *) priv->entry);
}
g_free (text);
return TRUE;
}

View File

@ -262,14 +262,25 @@ scroll_bar_allocate_children (StScrollBar *bar,
}
else
{
ClutterTextDirection direction;
avail_size = content_box.x2 - content_box.x1;
handle_size = increment * avail_size;
handle_size = CLAMP (handle_size, min_size, max_size);
handle_box.x1 = content_box.x1 + position * (avail_size - handle_size);
handle_box.y1 = content_box.y1;
direction = clutter_actor_get_text_direction (CLUTTER_ACTOR (bar));
if (direction == CLUTTER_TEXT_DIRECTION_RTL)
{
handle_box.x2 = content_box.x2 - position * (avail_size - handle_size);
handle_box.x1 = handle_box.x2 - handle_size;
}
else
{
handle_box.x1 = content_box.x1 + position * (avail_size - handle_size);
handle_box.x2 = handle_box.x1 + handle_size;
}
handle_box.x2 = handle_box.x1 + handle_size;
handle_box.y1 = content_box.y1;
handle_box.y2 = content_box.y2;
}
@ -464,28 +475,40 @@ st_scroll_bar_scroll_event (ClutterActor *actor,
ClutterScrollEvent *event)
{
StScrollBarPrivate *priv = ST_SCROLL_BAR_PRIVATE (actor);
ClutterTextDirection direction;
ClutterScrollDirection scroll_dir;
if (clutter_event_is_pointer_emulated ((ClutterEvent *) event))
return TRUE;
switch (event->direction)
direction = clutter_actor_get_text_direction (actor);
scroll_dir = event->direction;
switch (scroll_dir)
{
case CLUTTER_SCROLL_SMOOTH:
{
gdouble delta_x, delta_y;
clutter_event_get_scroll_delta ((ClutterEvent *)event, &delta_x, &delta_y);
if (direction == CLUTTER_TEXT_DIRECTION_RTL)
delta_x *= -1;
if (priv->vertical)
st_adjustment_adjust_for_scroll_event (priv->adjustment, delta_y);
else
st_adjustment_adjust_for_scroll_event (priv->adjustment, delta_x);
}
break;
case CLUTTER_SCROLL_UP:
case CLUTTER_SCROLL_DOWN:
case CLUTTER_SCROLL_LEFT:
case CLUTTER_SCROLL_RIGHT:
adjust_with_direction (priv->adjustment, event->direction);
if (direction == CLUTTER_TEXT_DIRECTION_RTL)
scroll_dir = scroll_dir == CLUTTER_SCROLL_LEFT ? CLUTTER_SCROLL_RIGHT
: CLUTTER_SCROLL_LEFT;
/* Fall through */
case CLUTTER_SCROLL_UP:
case CLUTTER_SCROLL_DOWN:
adjust_with_direction (priv->adjustment, scroll_dir);
break;
default:
g_return_val_if_reached (FALSE);
@ -552,6 +575,7 @@ move_slider (StScrollBar *bar,
gfloat y)
{
StScrollBarPrivate *priv = st_scroll_bar_get_instance_private (bar);
ClutterTextDirection direction;
gdouble position, lower, upper, page_size;
gfloat ux, uy, pos, size;
@ -585,6 +609,10 @@ move_slider (StScrollBar *bar,
NULL,
&page_size);
direction = clutter_actor_get_text_direction (CLUTTER_ACTOR (bar));
if (direction == CLUTTER_TEXT_DIRECTION_RTL)
pos = size - pos;
position = ((pos / size)
* (upper - lower - page_size))
+ lower;
@ -668,6 +696,7 @@ static gboolean
trough_paging_cb (StScrollBar *self)
{
StScrollBarPrivate *priv = st_scroll_bar_get_instance_private (self);
ClutterTextDirection direction;
g_autoptr (ClutterTransition) transition = NULL;
StSettings *settings;
gfloat handle_pos, event_pos, tx, ty;
@ -725,6 +754,10 @@ trough_paging_cb (StScrollBar *self)
priv->move_y,
&tx, &ty);
direction = clutter_actor_get_text_direction (CLUTTER_ACTOR (self));
if (direction == CLUTTER_TEXT_DIRECTION_RTL)
page_increment *= -1;
if (priv->vertical)
event_pos = ty;
else

View File

@ -757,6 +757,7 @@ st_scroll_view_scroll_event (ClutterActor *self,
ClutterScrollEvent *event)
{
StScrollViewPrivate *priv = ST_SCROLL_VIEW (self)->priv;
ClutterTextDirection direction;
/* don't handle scroll events if requested not to */
if (!priv->mouse_scroll)
@ -765,12 +766,18 @@ st_scroll_view_scroll_event (ClutterActor *self,
if (clutter_event_is_pointer_emulated ((ClutterEvent *) event))
return TRUE;
direction = clutter_actor_get_text_direction (self);
switch (event->direction)
{
case CLUTTER_SCROLL_SMOOTH:
{
gdouble delta_x, delta_y;
clutter_event_get_scroll_delta ((ClutterEvent *)event, &delta_x, &delta_y);
if (direction == CLUTTER_TEXT_DIRECTION_RTL)
delta_x *= -1;
st_adjustment_adjust_for_scroll_event (priv->hadjustment, delta_x);
st_adjustment_adjust_for_scroll_event (priv->vadjustment, delta_y);
}
@ -781,7 +788,18 @@ st_scroll_view_scroll_event (ClutterActor *self,
break;
case CLUTTER_SCROLL_LEFT:
case CLUTTER_SCROLL_RIGHT:
adjust_with_direction (priv->hadjustment, event->direction);
if (direction == CLUTTER_TEXT_DIRECTION_RTL)
{
ClutterScrollDirection dir;
dir = event->direction == CLUTTER_SCROLL_LEFT ? CLUTTER_SCROLL_RIGHT
: CLUTTER_SCROLL_LEFT;
adjust_with_direction (priv->hadjustment, dir);
}
else
{
adjust_with_direction (priv->hadjustment, event->direction);
}
break;
default:
g_warn_if_reached();

View File

@ -301,6 +301,26 @@ st_viewport_allocate (ClutterActor *actor,
}
}
static double
get_hadjustment_value (StViewport *viewport)
{
StViewportPrivate *priv = st_viewport_get_instance_private (viewport);
ClutterTextDirection direction;
double x, upper, page_size;
if (!priv->hadjustment)
return 0;
st_adjustment_get_values (priv->hadjustment,
&x, NULL, &upper, NULL, NULL, &page_size);
direction = clutter_actor_get_text_direction (CLUTTER_ACTOR (viewport));
if (direction == CLUTTER_TEXT_DIRECTION_RTL)
return upper - page_size - x;
return x;
}
static void
st_viewport_apply_transform (ClutterActor *actor,
CoglMatrix *matrix)
@ -314,7 +334,7 @@ st_viewport_apply_transform (ClutterActor *actor,
parent_class->apply_transform (actor, matrix);
if (priv->hadjustment)
x = st_adjustment_get_value (priv->hadjustment);
x = get_hadjustment_value (viewport);
else
x = 0;
@ -336,7 +356,7 @@ get_border_paint_offsets (StViewport *viewport,
StViewportPrivate *priv = st_viewport_get_instance_private (viewport);
if (priv->hadjustment)
*x = st_adjustment_get_value (priv->hadjustment);
*x = get_hadjustment_value (viewport);
else
*x = 0;

View File

@ -601,8 +601,11 @@ st_widget_get_theme_node (StWidget *widget)
if (stage == NULL)
{
g_autofree char *desc = 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)));
desc);
return g_object_new (ST_TYPE_THEME_NODE, NULL);
}
@ -1903,7 +1906,7 @@ st_widget_sync_hover (StWidget *widget)
seat = clutter_backend_get_default_seat (clutter_get_default_backend ());
pointer = clutter_seat_get_pointer (seat);
pointer_actor = clutter_input_device_get_pointer_actor (pointer);
pointer_actor = clutter_input_device_get_actor (pointer, NULL);
if (pointer_actor && clutter_actor_get_reactive (CLUTTER_ACTOR (widget)))
st_widget_set_hover (widget, clutter_actor_contains (CLUTTER_ACTOR (widget), pointer_actor));
else