Compare commits

...

163 Commits

Author SHA1 Message Date
0ada312748 Bump version to 3.33.2
Update NEWS.
2019-05-22 18:23:02 +00:00
88697add1b js: Throw GObject.NotImplementedError when requiring overriding
Since version 1.50.0, gjs defines GObject.NotImplementedError for throwing
errors when a "virtual" method that requires a subclass implementation is not
defined.

So use this instead of a generic JS Error in such cases.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/549
2019-05-21 15:43:21 -05:00
4730b7a094 shellMountOperation: Add spinner to password dialog
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/126
2019-05-20 19:59:04 +02:00
aa3e64aec3 shellMountOperation: Support TCRYPT
This extends the ShellMountPasswordDialog by widgets which allow
specifying parameters supported by TrueCrypt and VeraCrypt compatible
volumes (TCRYPT). This includes:

 - Whether the volume to be unlocked is hidden.
 - Whether the volume to be unlocked is a system partition.
   Note: TrueCrypt and VeraCrypt only support encrypting Windows
   systems [1], so the label for this option is "Windows System Volume".
 - Whether to use a PIM [2].
 - Whether to use keyfiles. Unfortunately, GMountOperation doesn't
   support TCRYPT keyfiles, so if this checkbox is checked, we tell the
   user that they should unlock the volume with Disks, which supports
   unlocking TCRYPT volumes with keyfiles.

[1] https://www.veracrypt.fr/en/System%20Encryption.html
[2] https://www.veracrypt.fr/en/Header%20Key%20Derivation.html

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/126
2019-05-20 19:59:04 +02:00
af26e2b212 shellMountOperation: Move password entry to a grid
This prepares for additional UI elements added for TCRYPT support.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/126
2019-05-20 19:59:04 +02:00
8167f20972 workspacesView: remove unused variables 2019-05-19 16:06:39 +00:00
bd4aac8f49 calendar-server: Port to libecal-2.0
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/501
2019-05-17 20:24:08 +00:00
785dd5c5f7 Revert "calendar-server: Port to libecal-2.0"
This reverts commit 71e469a59c.
2019-05-17 22:23:43 +02:00
71e469a59c calendar-server: Port to libecal-2.0
Port the calendar-server code to work with the latest evolution-data-server
API changes.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/501
2019-05-17 22:17:07 +02:00
6d4b9d29b8 ci: Switch to mutter's docker image
Mutter's CI now also builds gnome-shell to ensure that a MR doesn't
break the shell. Its docker image has therefore been updated to contain
all our deps as well, so we don't need our own image anymore.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/546
2019-05-17 20:52:44 +02:00
33f5bb39cd introspect: Include sandboxed-app-id as well
App IDs in gnome-shell don't match AppStream, Flatpak or Snap IDs. For the
desktop portal, the latter two are more relevant, so include it in the
returned information.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1289
2019-05-16 13:02:08 +00:00
a1c3900630 introspect: Remove unused variable
https://gitlab.gnome.org/GNOME/gnome-shell/issues/1289
2019-05-16 13:02:08 +00:00
cdaf164c01 Updated Spanish translation 2019-05-16 12:41:26 +02:00
2bd80579ed layout: Show important actors above top_window_group
The top_window_group is used for windows like popup menus, which should
appear above shell chrome like the panel.

Since we want important actors such as the screen keyboard or modal
dialogs to be shown above those windows, add their actors after adding
global.top_window_group to this.uiGroup and provide a new function
addTopChrome() to add important chrome above the top_window_group.

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

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/358
2019-05-15 22:39:53 +00:00
54039c3552 st: Introspect ScrollViewFade to read fade properties
Util.ensureActorVisibleInScrollView takes care of the potential scroll view fade
effect in order to compute the scroll offset, reading the ScrollViewFade's
`vfade-offset` property. This was correctly working until gnome 3.30 cycle.
However such property isn't defined now because since gjs 1.54, it can only
fetch introspected properties and St.ScrollViewFade was considered a private API
not exposed by gir.

Fix this by also introspecting st-scroll-view-fade sources.
Not being considered private anymore, install the header.

Fixes https://gitlab.gnome.org/GNOME/gnome-shell/issues/1061
2019-05-15 15:15:31 -05:00
b197a1affb cleanup: Fix spelling errors
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/515
2019-05-15 19:32:29 +00:00
51655be6a3 keyring: Use bind_property for message and description values
This code was commented out in commit 593b431 as it was causing a crash in gjs.

As per the [1] gjs fix, this can now be safely used again.

[1] https://gitlab.gnome.org/GNOME/gjs/merge_requests/289
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/510
2019-05-15 18:37:45 +00:00
9697c209c0 system: Just use buttonGroup instead of adding extra _actionsItem
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/499
2019-05-15 17:27:08 +00:00
6ecb0a4546 popupMenu: Implement Switch as actor
Switch is used only by menu items, and implement it extending St.Bin

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/499
2019-05-15 17:27:08 +00:00
30861d4800 popupMenu: Make sensitive a Menu and MenuItem property
Use 'sensitive' as native gobject property for PopupBaseMenuItem, while simulate
it for PopupMenuBase.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/499
2019-05-15 17:27:08 +00:00
a23391ea28 PopupBaseMenuItem: Use active property for menu items
Instead of using methods and flags, just use a gobject property to keep track
of the active state.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/499
2019-05-15 17:27:08 +00:00
58e0b80cac panel: Use menu items as actors
All menu items are actors now, so remove all the actor property usages.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/499
2019-05-15 17:27:08 +00:00
41dd744b74 js/status: Use menu items as actors
All menu items are actors now, so remove all the actor property usages.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/499
2019-05-15 17:27:07 +00:00
bdf66d7b62 popupMenu: Implement vfunc's for key focus in/out
As per the fact the menu item is an object we can just vfunc's.
This is not possible for events as specific union object is passed instead of
just the Clutter.Event.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/499
2019-05-15 17:27:07 +00:00
4258ae3ec2 popupMenuItem: Make it a widget inheriting from St.BoxLayout
Don't use composition for PopupBaseMenuItem, but instead inherit from BoxLayout.
So remove the internal actor, making all the menu items actor themselves.

Add an actor property as fallback to avoid warnings for usage in menus.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/499
2019-05-15 17:27:07 +00:00
9b379c49ba systemActions: Only do prefix matches
Our search for system actions is currently inconsistent with searching
for applications: While we match terms anywhere within keywords, GIO
will only match at the beginning of words.

In order to get the same behavior, split keywords into single words
and only match terms at the beginning of a word.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/745
2019-05-15 17:20:21 +00:00
7e70dd8453 js: Use GTypeFlags to define abstract GObject classes
gjs now supports an optional GTypeFlags value for GObject subclasses
defined with GObject.registerClass(), so it is not possible to define
abstract classes on the gobject-level, just like from C.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/517
2019-05-15 17:09:30 +00:00
2e209a82f9 Bump version to 3.33.1
Update NEWS.
2019-05-14 15:31:14 +00:00
ab0ecc469f Update German translation
(cherry picked from commit 1c5f926a70)
2019-05-12 10:38:34 +00:00
7d75ddf635 Update Esperanto translation 2019-05-11 10:27:11 +00:00
271e43a1ed keyboard: Remove unused _hideSubkeys function
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/540
2019-05-09 16:11:26 -05:00
2702a82896 keyboard: Unset Idle ID before removing it
When toggling keyboard various times, we might get an error because trying to
disconnect an idle that isn't set anymore.

This is because when we remove the idle, we don't unset the ID.
Also clear the idle when destroying the keyboard.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/540
2019-05-09 15:08:20 -05:00
8ad33d8752 keyboard: Use JS style for current page variable
We should use camelCase for _currentPage.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/540
2019-05-09 15:08:18 -05:00
d84bbb8770 keyboard: Don't try to set the same current page twice
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/540
2019-05-09 15:07:56 -05:00
c0c2edf2e1 keyboard: Unset current page when it gets destroyed
The current page is going to be destroyed as part of _onKeyboardGroupsChanged
cleanup, however we don't unset its pointer, and thus we'd might try to call a
function using an invalidated pointer.

So, unset the this._current_page reference when its get destroyed, connecting
to destroy signal when setting it and disconnecting when changing page.

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

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/540
2019-05-09 15:07:54 -05:00
de0c3251dd Update Chinese (China) translation 2019-05-08 18:13:32 +08:00
0afd600ea4 st: Delay handling of :first/:last-child changes
Updating the :first/:last-child pseudo classes can result in a lot
of unnecessary style changes when bulk-adding children to a container,
as every child ends up as the new last child.

Address this by deferring the style change to an idle, so we only do
the work once for the actual first and last child.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/529
2019-05-07 20:28:03 +00:00
598407b14a Revert "st: Reload icon on style changes only if necessary"
The size isn't the only relevant style change, we also need to pick
up icon-colors, icon-style and icon-shadow.

This reverts commit 94995e9c1e.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/529
2019-05-07 20:28:03 +00:00
d9bfa16f05 network: Handle interface name changes
The interface name when a device is added may not be the final one. For
example when using USB tethering, it will first appear as 'usb0' before
being renamed to something like 'enp0s20f0u1' depending on the port the
phone is plugged in.

As a result, we will ignore the new interface name in that case and fail
to associate the correct connection with the device: Instead of the
correct "USB Ethernet" (or user-customized name), it will show up as
"Ethernet".

Fix this by updating names and connections when a device's interface
property changes.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/534
2019-05-07 15:21:09 +00:00
03117d65b2 panel: Drag topmost maximized window
This makes it possible to drag a window which appears connected with the
panel, even if it is not in focus. As a result, it should be easier to
manipulate side-by-side windows.

https://bugzilla.gnome.org/show_bug.cgi?id=679290
2019-05-04 13:50:04 -07:00
5520bb3890 texture-cache: Keep aspect ratio for content images
Images are loaded either with a supplied fixed size, or using the "native"
dimensions of the file. When creating a content image from the loaded data,
we currently simply apply this directly to the preferred size.

This works usually fine: GdkPixbuf will always keep the aspect ratio, so
if only one dimension is provided, the other will be adjusted accordingly:

Loading a 200x200 image with a requested size of (100, -1) will result in
a 100x100 content image.

There is a catch though: GdkPixbuf will only scale *down* to the requested
size, no up. That is, loading a 100x100 image with a requested size of
(200, -1) will result in a 100x100 pixbuf. But as we assume that the pixbuf
size matches the requested size, the image content ends up with 200x100.

Fix this by explicitly handling the case where only one size was supplied,
and make the other dimension take the aspect ratio into account

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/525
2019-05-04 00:50:31 +00:00
4e6b2eb72a windowManager: Fix fullscreen windows in ws switching animations
To prevent a small gap between windows in the workspace switching
animation, we temporarily shift windows up or down by the height of the
panel. This obviously breaks the animation for fullscreen windows, those
will overlap with the ones on the other workspace since there is no
panel shown in that case.

Fix this by checking whether the old or new workspace includes a
fullscreen window and don't shift the windows if there is one.

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

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/322
2019-05-03 22:14:04 +00:00
2e5295b3a9 dialog: Use object's set to assign properties
We can just assign a properties object to a GObject using the set() method
instead of using Object.assign.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/531
2019-05-03 15:34:06 -05:00
3121c9aa29 dialog: Really set ellipsize mode in subtitle and body
Dialog's subtitle or body could not be properly wrapped, while it's ellipsized
when the text's width doesn't exceed the container size.

Clutter text has an `ellipsize` property, however in dialog's subtitle and body
we have been setting the `ellipsize-mode` property to Pango.EllipsizeMode.NONE
that is not present in the underlying GObject.

Not being an error in javascript, gjs didn't warn us about this, while at the
same time the St.Label's default Pango.EllipsizeMode.END was used.

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

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/531
2019-05-03 15:34:05 -05:00
1ebbd7c768 st: Reimplement StClipboard on top of MetaSelection
And stop using X11/gdk for this.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/331
2019-05-02 15:58:51 +00:00
8572bb97c7 Update Esperanto translation 2019-05-01 19:54:12 +00:00
d5ebd8c816 dashSpacer: Don't trigger allocations from size negotiations
If an actor's allocation is outdated, clutter_actor_get_allocation_box()
will queue a relayout. That's why it's advised to not use the function
unless the allocation is known to be valid (namely during paint), but
in particular not from within get_preferred_width/height vfuncs.

Using the :allocation property (which may be outdated) would be better,
but in this case we can simply delegate the request to the correct actor.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1065
2019-04-30 20:59:28 +00:00
ed999ce926 keyboard: Destroy old layout actors when regenerating keyboard groups
We were cleaning up self._groups, but the actors for all previous
groups/layers/modes would remain attached to the aspect container,
simply hidden.

Under some circumstances this can really make the amount of actors
in the shell stage to quickly ramp up, it's not just a "leak" but
also has potential side effects on performance.

We should destroy all child actors of this._aspectContainer, except
the static ones (emoji and keypad).

While at it, fix this._groups re-initialization, as it's actually an
object, not an array.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/523
Closes?: https://gitlab.gnome.org/GNOME/mutter/issues/556
2019-04-30 21:33:02 +02:00
50b7739076 worldClocks: Ignore locations with unknown timezone
We currently assume that every location has an associated timezone.
While this is sound in the real world, in practise it depends on
whether or not libgweather can find a corresponding timezone DB
entry.

This used to be a fringe case, but has become more likely when commit
https://gitlab.gnome.org/GNOME/libgweather/commit/d7682676ac9 moved
weather stations from cities to countries - the station itself is un-
likely to have a timezone entry, and the country may be part of more
than a single timezone.

It would be good for libgweather to return a timezone for those
locations again, but we should defend against the case anyway.
We cannot tell what time it is at a particular location without
knowing the timezone, so simply filter them out.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1062
2019-04-30 16:15:27 +00:00
94995e9c1e st: Reload icon on style changes only if necessary
The parameters that may affect the icon on ::style-changed are more size
related than visual (we listen to icon theme changes for the latter). It
makes sense to just update the icon if the size came out different.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/524
2019-04-30 15:02:37 +02:00
fb04dafb0b st: Use g_signal_handler_disconnect() to disconnect from StTheme
With a high enough amount of actors, there may be enough theme nodes and
signal connections on StTheme::custom-stylesheets-changed that
g_signal_handlers_disconnect_by*() on dispose becomes expensive, this may
become a surprisingly hot spot in StWidget::style-changed.

Keep the handler ID around and use g_signal_handler_disconnect() to avoid
linear lookups for the matching func/data.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/524
2019-04-30 15:02:29 +02:00
d57234bec9 panel: Don't chain up to parent's allocate
The top bar handles allocating all its children itself, so there's
little value in chaining up to st_widget_allocate() and get the
default layout manager allocating all children again (and possibly
differently).

If this happens, we end up with an infinite allocation cycle with
corresponding performance penalty. Fix this by just doing and what
Shell.GenericContainer did before commit 286ffbe2b6 replaced it,
and not chain up to StWidget.

Thanks to Robert Mader for debugging the issue.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1054
2019-04-29 18:29:14 +00:00
38da54fb02 padOsd: Use non-deprecated librsvg API to create handle
On one hand, we were using a path instead of an URI on
rsvg_handle_set_base_uri(). This broke at some point in librsvg
(presumably for the best, handling paths there sounds non-standard)
leaving a blank svg (As the base image wouldn't be accessed).

On the other hand, we use this with the deprecated rsvg_handle_write()
which we should drift away from.

Using rsvg_handle_new_from_stream_sync() neatly solves both. We use
newer API based on input streams and GFiles, and it internally does
the right thing, bringing the pad OSD back to life.

Closes: https://gitlab.gnome.org/GNOME/gnome-shell/issues/1220
2019-04-27 05:50:08 +00:00
bbd3275dad js: Check for this.constructor type instead of new.target
Use more ES6-inspired check for classes initializations.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/503
2019-04-26 20:48:52 -05:00
3a3f9aa008 CyclerPopup: Check for type using constructor
Classes that are sub-classes of GObject don't use a constructor per se, so we
can't check for new.target (as this is undefined) in _init.

Then compare the current constructor name instead.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/503
2019-04-26 20:48:52 -05:00
3c54e863e6 SwitcherPopup: Check for type using constructor
Classes that are sub-classes of GObject don't use a constructor per se, so we
can't check for new.target (as this is undefined) in _init.

Then compare the current constructor name instead.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/503
2019-04-26 20:48:52 -05:00
a63ba61194 keyboard: Disable emoji support on X11
Unlike regular keys that generate key events from a virtual device,
emoji keys rely on the input method to insert the character. However
as the compositor cannot inject IM events into ibus, this only works
in the shell's own entries on X11.

We shouldn't expose mostly broken functionality to the user, so limit
the feature to the wayland session.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1172
2019-04-26 22:33:28 +00:00
ab9710ee7b ci: Improve script output
git-fetch's -q flag doesn't suppress warnings, so it's not a full
replacement of the redirection that was removed in commit 8cefd919.
Shut up the cryptic warning and replace it with a clearer log message
instead.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/511
2019-04-26 21:32:51 +02:00
43cef45229 ci: Try harder to find a matching mutter branch
Depending on how gitlab's CI checks out gnome-shell, the shell branch
may not have a local reference like "gnome-3-32", but only a remote
one like "remotes/origin/gnome-3-32".

Consider that case as well when looking for a corresponding mutter branch.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/511
2019-04-26 21:32:51 +02:00
8db4f3c67f ci: Handle merge requests for non-master branches
If we don't find a branch that matches the branch used in the merge
request, we currently fall back to the non-merge-request matching,
i.e. first try the current shell branch, then fall back to master.

This should work for commits to upstream branches, but not for merge
requests to a stable branch. For those, the target branch name is
a better fallback.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/509
2019-04-26 21:32:51 +02:00
594a070029 ci: Fix checking out mutter for stable branches
Remote branches always start with the remote itself, so just looking
for "gnome-3-32" etc. won't produce a match.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/509
2019-04-26 21:32:51 +02:00
c2e04e3cfa ci: Silence some warnings
... as suggested by Jonas in mutter!548.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/509
2019-04-26 21:32:51 +02:00
293f50e8e5 accessibility: Add settings changed signal handler after creating widget
Move the signal handlers for changed settings to be connected after the
creation of the menu items to make sure a reference to the item is set.

While it also worked fine before, this solution certainly looks cleaner.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/512
2019-04-26 18:47:45 +00:00
df7fea3407 Update Friulian translation 2019-04-26 14:11:05 +00:00
563412698a Update Indonesian translation 2019-04-25 07:56:11 +00:00
2b30146c6c ci: Ensure we clone a deep enough history for commit review
It seems gitlab changed something recently in the default clone depth
which made MRs with >10 commits to obscurely fail in the review stage.
As per https://docs.gitlab.com/ee/ci/yaml/#shallow-cloning, bump it
to 100 to allow bigger MRs.

https://gitlab.gnome.org/GNOME/mutter/merge_requests/551
2019-04-24 13:28:07 +02:00
0f531d8c44 ShellApp: Use g_signal_connect_object for window signals
A window being unmanaged can cause the ShellApp to be removed from
the ShellAppSystem, which if we are unlucky is the app's last
reference, causing it to be disposed and freed. It would be bad if this
happened before we finished handling the signal.

Use g_signal_connect_object to ensure that a reference is held to
the ShellApp for the duration of the signal handler, delaying its
last-unref.

In particular, when a signal handler calls _shell_app_remove_window(),
there is a brief period for which ShellApp breaks the intended
invariant (see !497) that app->running_state is non-NULL if and only if
app->running_state->windows is also non-NULL (non-empty). Freeing the
ShellApp at this point would cause a crash. This seems likely to be the
root cause of <https://gitlab.gnome.org/GNOME/gnome-shell/issues/750>,
<https://gitlab.gnome.org/GNOME/gnome-shell/issues/822> and
<https://bugs.debian.org/926212>.

Signed-off-by: Simon McVittie <smcv@debian.org>
2019-04-23 12:51:56 +00:00
218c87994b Updated Spanish translation 2019-04-23 10:28:12 +02:00
f74c07b9ac st: Only emit ::style-changed on actual changes
Compare painting/geometry of old and new paint nodes, so it's ensured to
be only emitted on actual style changes. Emission still must be propagated
through to children, though.

Closes: https://gitlab.gnome.org/GNOME/gnome-shell/issues/1153
2019-04-22 18:48:57 +02:00
59edea4bb4 workspacesView: sync gesture enabled state after setting it up completely
At the point it is disabled, it has got signal handlers connected but
this._workspacesView is uninitialized. This triggers:

(gnome-shell:3993): Gjs-WARNING **: 18:49:53.281: JS ERROR: Exception in callback for signal: cancel: TypeError: this._workspacesViews is undefined
_endTouchGesture@resource:///org/gnome/shell/ui/workspacesView.js:527:25
_emit@resource:///org/gnome/gjs/modules/signals.js:142:27
set enabled@resource:///org/gnome/shell/ui/windowManager.js:478:13
WorkspacesDisplay<@resource:///org/gnome/shell/ui/workspacesView.js:482:9
ViewSelector<@resource:///org/gnome/shell/ui/viewSelector.js:167:35
ControlsManager<@resource:///org/gnome/shell/ui/overviewControls.js:405:29
init@resource:///org/gnome/shell/ui/overview.js:234:26
_initializeUI@resource:///org/gnome/shell/ui/main.js:184:5
start@resource:///org/gnome/shell/ui/main.js:124:5
@<main>:1:31

On startup. Shuffling these two lines prevent this from happening.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/506
2019-04-19 18:58:33 +02:00
4d4d5a0b16 shell, st: Adjust to CoglPipeline API changes
cogl_pipeline_set_layer_null_texture() now doesn't receive
the texture type, since it only supports 2D textures now.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/503
2019-04-18 16:33:06 -03:00
03c4930883 util: Fix compiler warning
A harmless warning due to meta_surface_actor_get_texture()
now returning a pointer to MetaShapedTexture instead of
ClutterActor.

No functional changes.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/502
2019-04-18 15:40:55 -03:00
9593e20425 meson.build: Add more compilation warnings
Use the same warnings as mutter.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/441
2019-04-17 21:39:03 +00:00
2b1d6e607f calendar-server: Add gnu_printf format attribute
Suggested by compiler with `-Wsuggest-attribute=format`

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/441
2019-04-17 21:39:03 +00:00
1dff32e48a hotplug-sniffer: Add gnu_printf format attribute
Suggested by compiler with `-Wsuggest-attribute=format`

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/441
2019-04-17 21:39:03 +00:00
1e3a174de9 na-tray-manager: Add missing void to functions with no arguments
to avoid "old-style function definition" and "function declaration
isn’t a prototype" warnings.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/441
2019-04-17 21:39:03 +00:00
7bb84dae80 popupMenu: Make MenuManager to take an actor as parameter
Since we assume now that most of the classes are actors per se we can just pass
the actor itself as parameter

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/487
2019-04-17 21:32:18 +00:00
44fcb9e9af workspaceThumbnail: Remove this.actor definition to ThumbnailsBox
Remove this.actor = actor, since the class is now an actor itself.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/487
2019-04-17 21:32:18 +00:00
2d30e310bc workspaceSwitcherPopup: Remove this.actor definition to self
Remove this.actor = actor, since the class is now an actor itself.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/487
2019-04-17 21:32:18 +00:00
be2d630348 panel: Remove this.actor definition to self
Remove this.actor = actor, since the class is now an actor itself.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/487
2019-04-17 21:32:18 +00:00
bea6045aae messageTray: Remove this.actor definition to SourceActor
Remove this.actor = actor, since the class is now an actor itself.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/487
2019-04-17 21:32:18 +00:00
ad491e7922 iconGrid: Remove this.actor definition to BaseIcon
Remove this.actor = actor, since the class is now an actor itself.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/487
2019-04-17 21:32:18 +00:00
fedb8e706a panelMenu: Remove usage of this.actor from Button
Remove this.actor = actor, since the class is now an actor itself.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/487
2019-04-17 21:32:18 +00:00
1be933bc49 boxpointer: Don't use boxpointer actor, as it's now an actor itself
Remove this.actor = actor, since the class is now an actor itself.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/487
2019-04-17 21:32:18 +00:00
526bb72f3d environment: Warn when trying to access a deprecated actor property
The port away from the old Shell.GenericContainer actor turned many JS
classes with a corresponding actor property into Clutter.Actor subclasses.
For compatibility reasons, those properties were kept around for a while.
They were now removed and any code that still uses them should be adjusted.

Facilitate that transition by defining the compatibility property on
Clutter.Actor itself, but log a warning every time it is accessed.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/487
2019-04-17 21:32:18 +00:00
49c95cff6c theme: Update window preview style
- simplify the close button to use blue, lighter blue and darker blue
   solid disks for normal, hover and active states

 - use a milky, transparent white border for the hover effect of the border

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/461
2019-04-17 21:25:34 +00:00
56a361650c appIconMenu: Sync windows section with app menu
Keep the app icon context menu consistent with the app menu, so stop
grouping windows by workspace and add a section heading.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/968
2019-04-17 19:23:23 +00:00
d4763b157d appMenu: Add heading to windows section
It may not be immediately obvious that the windows section is a
list of open application windows, as titles like "Downloads" can
easily be confused with an action. Add a section heading to avoid
confusion.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/968
2019-04-17 19:23:23 +00:00
d2dc072ba9 appMenu: Remove separator in window section
We currently copy the app icon menu behavior, which puts a separator
between windows from the current workspace and windows from any other
workspace. It is more useful to have the windows section appear as a
clearly marked group, so drop the separator.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/968
2019-04-17 19:23:23 +00:00
ffaca00594 appMenu: Add separator between "Details" and "Quit"
The two actions are sufficiently different to warrant their own
groups.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/968
2019-04-17 19:23:23 +00:00
9090b7dc3d Bump version to 3.32.1
Update NEWS.
2019-04-17 21:08:32 +02:00
a540fe4130 st: Round CSS units to the nearest multiple of the scale factor
Actors themed through CSS should ideally get sizes and positions that
conform to the "pixel grid". A notorious example is the panel that has a
height of 1.86em. On unchanged font settings and hidpi that translates to
55px, which leaves the workarea with "half pixels" that hidpi wayland
applications don't know how to fully cover.

If the requested height is a multiple of the scale factor, the workarea
and maximized applications can then work on full pixels.

Closes: https://gitlab.gnome.org/GNOME/gnome-shell/issues/91
2019-04-17 18:46:37 +00:00
5be61bbb68 barLevel: Don't show border radius if the value is 0
Work around a known regression from [1] that caused the volume bar in
the OSD window to never be hidden, even if the volume is set to 0. This
happened because the border radius of the barLevel is always drawn
without ensuring that the actual bar is visible.

So simply check if the value to draw is 0, and if it is, don't draw the
border radius of the bar at all. This will still result in incorrect
representation of values that have a width smaller than 2*border-radius,
but at least the bar looks right for a width of 0 now.

[1] https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/2

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/384
2019-04-17 18:38:13 +00:00
8e51fee5c1 windowManager: ensure actor resize clone dies with actor
If a window gets destroyed right before it's resize
animation starts the user can get confronted with an undead
zombie clone that doesn't go away.

This commit makes sure said clones get reaped with their
actors.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1166
2019-04-17 18:31:22 +00:00
9d6fcfdc85 switch: Drop separate handling for US
The switches no longer use ON/OFF or o/|, so just use the
same class and artwork everywhere.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/496
2019-04-16 17:28:31 +00:00
5f5a3b78a5 theme: update toggle switch design
- for the short term, just replace the SVG assets

See https://gitlab.gnome.org/GNOME/gnome-shell/issues/841 for background
2019-04-16 16:05:10 +02:00
4e5ca6d376 dash: Fix messed up icon height
When determining the biggest icon size that fits the available height,
we first subtract the additional space requirements of icons (spacing,
padding, running indicator etc.) and then divide the result by the
number of icons to get the maximum size available to each icon texture.

In the above, the additional space requirement of each icon is taken
from the first icon (as all icons are assumed to be the same), and
calculated as the difference between the icon button's preferred height
and the currently used icon size.

To make sure that the icon is actually using the dash's current icon
size (even while animating to a new icon size), we enforce its height
during the size request and restore its original height afterwards.

However after some recent changes, that step is causing troubles:
For some reason, the original height may be 0, and when we restore it,
we end up forcing a fixed non-height that bypasses the regular size
request machinery.

While it is unclear where exactly the zero height comes from (maybe
waiting for a valid resource scale?), it is clear that it's best
to avoid forcing a fixed height. So instead of making the icon
texture comply with the assumed icon size, adjust the calculations
to use its current height request.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1053
2019-04-13 14:17:07 +00:00
2fab75f448 dateMenu: Make clock offsets relative to local time
We recently added offsets to world clocks that represent the location's
timezone as UTC offset. However for most users, that representation is
overly technical and less helpful than the difference to their local time.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1157
2019-04-13 12:11:14 +00:00
22883f2fa2 dateMenu: Make sure we always display a clock name
We currently use the city name for all location except named timezones.
However locations only have a city name if they are of level CITY or
DETACHED, or if they are of level WEATHER_STATION with a parent of level
CITY.

So when libgweather commit d7682676ac9 moved weather station locations from
cities to countries, it broke their names in the world clocks section.

To fix this, stop making assumptions about when we can use the city name
and simply try it first for all locations and fall back to the plain name
if its not available.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1150
2019-04-12 03:17:35 +02:00
5d9f80bc73 extensionPrefs: Fix pref button appearance
After the Adwaita refresh, the button shows up oval rather than
circular. To address this, make sure that the "image-button" class
is applied as well by using the dedicated setter function.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/482
2019-04-12 00:51:44 +02:00
f7d117488b appFavorites: Update RENAMED_DESKTOP_IDS
Fixes https://gitlab.gnome.org/GNOME/gnome-shell/issues/1160
2019-04-11 23:28:49 +02:00
244a329ee7 boxpointer: Compute source allocation and work area just once
Compute the source actor workarea and allocation when repositioning and keep it
cached so that we've not to calculating it again in _calculateArrowSide.

Since _calculateArrowSide only is called inside _updateFlip that is always
called just after reposition, we can be sure that the computed values are still
correct.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/435
2019-04-11 19:38:17 +00:00
044572cb60 boxpointer: Use X/Y actor positioning instead of an anchor point
Currently all the widgets using BoxPointer and so popup actors are always drawn
at screen origin and then shifted at paint time in the proper position.

This doesn't work when using resource scale, since the widgets need to know
in which monitor they currently are in order to use properly scaled resources.

So, basically revert commit 22c22e0d7 and go back using the actual actor
coordinates for positioning and the actor translation for animating it, as the
relayouting issues of the past seem to be gone now.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1008
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/435
2019-04-11 19:38:17 +00:00
746875258d layout: Use an invisible but mapped actor as dummy cursor
Since this could be used as boxpointer source, it should be marked as mapped,
or it will be ignored.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/435
2019-04-11 19:38:17 +00:00
4892a87dfe boxpointer: Compute arrowStride using sourceActor monitor as reference
I suppose this was also the goal of commit 96e14dc, but because it was checking
the value of the always-undefined this.sourceActor, it really never worked as
expected.

So, now since we assume that this._sourceActor is always defined just use it
as reference to compute the monitor menu position.

Fixes https://gitlab.gnome.org/GNOME/gnome-shell/issues/1029
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/435
2019-04-11 19:38:17 +00:00
8b9c8ddb1e windowManager: Don't move sticky windows when inserting workspace
Inserting a workspace is implemented by appending a new workspace, then
shifting all windows after the "new" workspace up. This has an unintended
side effect on sticky windows, as changing its workspace will unstick it.

Fix this by excluding sticky windows - there's little point in moving them
anyway, given that they should be on all workspaces (including the original
workspace and the target one).

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1151
2019-04-11 19:00:52 +00:00
eb9000576c shellDBus: Accept connector to restrict OSD to one monitor
The monitor index is not something that gnome-shell and
gnome-settings-daemon seem to be agreeing about. Using the connector
string is a much more reliable method of identifying a specific screen
and we are indeed using this already for monitor labling.

So switch over to use the connector rather than the monitor index. If a
user tries to use the old API, then the OSD will simply show up on all
monitors (which is the status quo currently anyway).

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/489
2019-04-11 18:53:53 +00:00
862aaf341e shellDBus: Remove ShowMonitorLabels API
This API has been broken for quite some time now as the corresponding
mutter function meta_monitor_manager_get_monitor_for_output was removed.
If anyone tries to use it, we would just run into a backtrace.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/490
2019-04-11 17:49:40 +00:00
a5c75ff58b screenshot: Don't pick up rubberband style from GTK
Selecting a screen area for a screenshot isn't the same as selecting
items in an icon view, so there's no strong rationale for picking
up the style from GTK. We stopped doing that for other elements like
tile previews long ago, so just use our own style here too.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/481
2019-04-11 17:27:50 +00:00
4541fb9819 perf: Stop using GTK
Instead of going through GtkSettings, we can just as well use the
underlying GSettings directly.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/481
2019-04-11 17:27:50 +00:00
9f8edd980c panel: Remove left-over Gtk.Settings
It has been unused since commit c334aa2a4c.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/481
2019-04-11 17:27:50 +00:00
e5b9043435 workspacesView: Support touch/touchpad gestures to switch workspaces
Now that the existing touch/touchpad gestures in windowManager only
handle normal mode, add corresponding gestures for the overview and
hook them up to the existing workspace scroll animations.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/516
2019-04-11 17:00:17 +00:00
c0012c2ea4 windowManager: Limit switch gestures to normal mode
The window group is hidden while in overview, so the stick-to-content
animation isn't visible either. Worse, the gestures messes up the
position of window actors in that case. Just limit the gesture to
normal mode for now, we will soon add it back in the overview with
its own animation handling.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/516
2019-04-11 17:00:17 +00:00
b77e4975f0 switchGestures: Do not hard-code allowed modes
The touch/touchpad gestures to switch workspace currently hard-code
the modes in which we want the gestures to work. While these modes
are correct, the existing switch animation only works in NORMAL mode,
not in the overview where the window group is hidden. The easiest way
to address this is to handle both cases completely separately, namely
use separate actions in- and outside the overview.

Make the existing usable in that way by making the list of allowed
modes a constructor parameter.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/516
2019-04-11 17:00:17 +00:00
e83f2344f6 windowManager: Allow disabling touchpad workspace switch action
Just like actual ClutterActions, it can make sense to temporarily
disable the touchpad action, so add an appropriate property.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/516
2019-04-11 17:00:17 +00:00
de6512be1a st: Add missing include
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/485
2019-04-08 18:17:46 +02:00
0b72ff1896 st: Add missing END_DECLS marker
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/485
2019-04-08 18:17:33 +02:00
fea0192772 weather: Handle missing permission store
Our weather integration is supposed to follow GNOME Weather's settings,
including its permission to use location services. However there's a
discrepancy in case xdg-desktop-portal is unavailable:

While our geoclue agent grants all applications access to location
services in that case, the weather integration treats it as if
access was denied.

Fix this by handling this case explicitly.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1130
2019-04-03 13:27:42 +00:00
f81ac498fb ci: Use custom image for commit log check
We can speed up the check a little bit by using an image that
already contains git, so do that.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/480
2019-04-03 13:50:35 +02:00
5357e0a18c st/settings: Add magnifier activation property and bind to settings
The same code for reading the current magnifier state is repeated in both
shell-recorder, shell-screenshot and magnifier itself.
So to move this inside a property of st-settings so that we can refer to it
all over the places removing duplications.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/473
2019-04-02 20:28:54 +00:00
d7632bbd3d Ignore '.vscode' folder for users of that editor
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/476
2019-04-02 17:37:31 +00:00
1b5e91e4b3 shell: Fallback on ISO 8601 datetime string for screenshot date info
If the locale doesn't honor strftime()'s %c argument, we would end up
feeding NULLs into GdkPixbuf tagging. Fallback to a sensible (although
not nicely localized) datetime string.

Closes: https://gitlab.gnome.org/GNOME/gnome-shell/issues/1017
2019-04-02 00:25:39 +00:00
727195c767 magnifier: Use actor scaling filters on content texture node
Reuse the same filter values of the attached actor, instead of hardcoding the
defaults.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/454
2019-04-01 16:34:44 -04:00
9158f55360 magnifier: Track cursor sprite changes only when active
There's no point in keeping the cursor sprite texture around all the time,
and to listen for its changes, we just need this when the magnifier is active.

So, initialize the magnifier texture and monitor for the sprite changes on
activation, while disconnect from the signal and nullify the texture when
the magnifier is deactivated.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/443
2019-04-01 16:34:44 -04:00
8146e9d527 magnifier: Invalidate content size when it changes
In case the content size changes we need to invalidate its size in order to
trigger a full actor relayout.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/443
2019-04-01 16:34:44 -04:00
4247251020 magnifier: Use all color channels to paint content texture node
In order to paint all the color channels of the content texture we need to
set the color channels to 255, so instead of doing this manually we can just
reuse the static color definition for white.

Fixes https://gitlab.gnome.org/GNOME/gnome-shell/issues/1020
2019-04-01 22:13:50 +02:00
7eee0e0ed6 magnifier: Return all parameters on sprite content preferred size
ClutterContent's get_preferred_size should return a boolean weather the
preferred size is valid, so in javascript we've to return this state value
before out width and height.

Since this was not happening, clutter was considering the width as the state
(converting the non-zero value to true), the height as the width, while ignoring
the returned height (that was then defaulted to 0)

Fixes https://gitlab.gnome.org/GNOME/gnome-shell/issues/1020
2019-04-01 22:13:50 +02:00
4f0851ca77 Update Slovak translation 2019-04-01 15:09:41 +00:00
911ae49767 Updated Spanish translation 2019-04-01 10:29:36 +02:00
5af81d4057 Update Esperanto translation 2019-04-01 06:04:01 +00:00
c435889baa Update Chinese (Taiwan) translation 2019-03-31 15:34:17 +00:00
49f79d9d5d Update Chinese (Taiwan) translation 2019-03-31 15:12:01 +00:00
1767cd0f6c app: Consider "quit" action for quit
Just like we take a remote "new-window" action into account for
opening new windows, we should call an explicit "quit" action
before falling back to closing all the app's windows on quit.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/624
2019-03-28 00:02:20 +00:00
3e0915521a magnifier: Only connect to signals when ZoomRegion is active
There's no need to listen signals when the zoom region is inactive, so let's
just connect/disconnect them.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/472
2019-03-28 00:38:42 +01:00
a298943fac magnifier: Update screen position on activation
The default ZoomRegion is created at startup and only updated if it is active
when the monitor setup changes. Thus when reactivating the magnifier after a
display change, the viewport used is still the one that been computed with the
old screen geometry values.

Move screen update code inside a function and call it both when activating
the zoom region and when the monitor changes during a zoom session.

Fixes https://gitlab.gnome.org/GNOME/gnome-shell/issues/1120
2019-03-28 00:38:42 +01:00
df9ddf96a5 iconGrid: Chain up in style-changed
Commit 81ec8215a0 moved the handling of style changes from a signal
handler to a vfunc without chaining up to the parent, losing propagating
the change to children and queueing a paint update.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1117
2019-03-27 18:10:52 +01:00
4fa5d701d5 network: Catch errors when reading devices
NetworkManager added support for a new device - NMDeviceWifiP2P - but
did not add the corresponding enum value in NMDeviceType. The return
value for nm_device_get_device_type() is therefore "illegal" for the
newly added device, and gjs throws an exception.

This should ultimately be fixed in libnm, but as errors when adding
one device shouldn't interfere with adding any other devices, catching
exception is a good idea anyway, so do just that.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1023
2019-03-27 15:06:49 +00:00
b05683d586 Update Croatian translation 2019-03-26 11:34:00 +00:00
2f3f3fbcdb boxpointer: Calculate position using workarea
Take the workarea into consideration when calculating the position and the size
of box pointer and of its arrow.

Closes: https://gitlab.gnome.org/GNOME/gnome-shell/issues/1102
2019-03-22 12:31:48 +00:00
611605a67f scripting: Don't use legacy API
The current scripting module makes heavy use of pre-standardized
iterator/generator/promise APIs, at least for some of those support
was pulled in SpiderMonkey 58.

Port to the new standardized replacements to get the module back into
a working state.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/440
2019-03-21 10:18:02 +00:00
0427a782be main: Wait for startup completion before running perf script
The scripts generally assume a functional shell, so wait until
that is the case.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/440
2019-03-21 10:18:02 +00:00
32baff5906 perf: Use var for METRICS
Each perf module exposes it to the scripting module to report metrics
after all tests have been run. The symbol's scope should allow that,
so declare it as var.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/440
2019-03-21 10:18:02 +00:00
0089143d06 aggregateMenu: Include action buttons in width computation again
Commit 1b169655ac removed the system indicator from the list of children
that are considered for the overall menu width, because we do want the
log-out submenu to adapt to the available width.

However as a side effect, action buttons no longer contribute to the
width either, so if extensions add additional buttons, the menu is
likely to overflow.

Avoid this by only adding the button group to the list of size children.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1094
2019-03-21 10:08:29 +00:00
05e55cee23 Update Arabic translation 2019-03-18 14:37:34 +02:00
31e7f0340f windowCycler: Create settings before chaining up
It's used in _getWindows() which is called from the parent's _init().

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1064
2019-03-18 09:48:02 +00:00
6e317a54fd screenShield: Handle signal 'StatusChanged' when lockscreen is active
When lockscreen is active, screen can't be dimed if signal
'StatusChanged' is ignored. We need to handle this signal.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/900
2019-03-18 08:32:54 +08:00
9c1f62c38c Update French translation 2019-03-17 18:59:32 +00:00
1341d5557f Fix Icon in Tajik translation 2019-03-16 18:21:38 +01:00
b7d79a5f06 Update British English translation 2019-03-16 11:19:57 +00:00
62233a4db4 dnd: Multiply drag threshold by output scale
So it comes out right on hidpi, and consistent with clients.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/455
2019-03-13 17:22:35 +00:00
4a7e2ddff5 dnd: Make startDrag() fail if there is a current grab
This call just went through stomping over previous drag operations if any,
_maybeStartDrag() accounted for this, but other callers (well, WindowClone
in workspace.js) don't. This must bail out early even if a drag operation is
requested, luckily all callers account for it already.

This broke shell state by preserving connected captured-event handlers if
one tried to drag multiple windows simultaneously through multitouch. We
of course don't support that, now more elegantly.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/455
2019-03-13 17:22:35 +00:00
fb737ebde0 Update Tajik Translation 2019-03-13 21:45:05 +05:00
bf77cb44e7 Merge branch 'master' of gitlab.gnome.org:GNOME/gnome-shell 2019-03-13 21:40:31 +05:00
c72e2bb4a9 Update Tajik Translation 2019-03-13 21:39:34 +05:00
68c182b1df Update Tajik Translation 2019-03-13 21:18:10 +05:00
348d303794 theme: Fix :checked:active page-indicator
Closes https://gitlab.gnome.org/GNOME/gnome-shell/issues/1036
2019-03-12 11:58:36 +00:00
ede0fd8660 magnifier: Fix color argument
Clutter.TextureNode takes a Clutter.Color, not a Cogl.Color.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1020
2019-03-12 01:52:22 +00:00
187c2193e8 st-theme-node-transition: Exclude get_new_paint_state() from introspection
to silence a build warning.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/449
2019-03-12 01:14:52 +00:00
706bdd8059 st-widget: Add missing g_return_val_if_fail()
It's a public function, so it's good practice to sanity-check its
input (unless disabled at compile time of course).

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1018
2019-03-12 01:00:32 +00:00
436861edc8 theme: improve legibility of error messages
- the login dialog uses warning_color, so be consistent
- nevertheless increase lightness of the error_color

Fixes issue https://gitlab.gnome.org/GNOME/gnome-shell/issues/1016
2019-03-12 00:54:26 +00:00
9729a2e772 texture-cache: Apply resource scale to the right dimension
Size matters!

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/444
2019-03-12 00:48:11 +00:00
6b924c00c5 layout: Use custom actor for uiGroup
The bind constraint that replaced the Shell.GenericContainer in commit
f4682748fa is subtly different from the previous code:
It forces the actor to have the same size as the stage, rather than just
requesting that size.

This breaks the magnifier which relies on the UI being able to be bigger
than the display size. Fix by going back to using a custom actor.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/646
2019-03-12 00:39:40 +00:00
b90f4d29a4 userWidget: Fix avatar size
The texture cache now returns an actor with an appropriate ClutterContent
rather than a ClutterTexture. That actor uses the CONTENT_SIZE request
mode, which means that it will unconditionally request the preferred size
of the content. That is, setting an explicit size no longer has an effect.

Fix this by making sure the image is already loaded with the desired
dimensions.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1024
2019-03-12 00:34:04 +00:00
114 changed files with 6676 additions and 6333 deletions

1
.gitignore vendored
View File

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

View File

@ -15,10 +15,10 @@ variables:
- merge_requests
check_commit_log:
image: registry.fedoraproject.org/fedora:latest
image: registry.gitlab.gnome.org/gnome/mutter/master:v2
stage: review
before_script:
- dnf install -y git
variables:
GIT_DEPTH: "100"
script:
- ./.gitlab-ci/check-commit-log.sh
only:
@ -40,7 +40,7 @@ js_check:
when: on_failure
build:
image: registry.gitlab.gnome.org/gnome/gnome-shell/master:v1
image: registry.gitlab.gnome.org/gnome/mutter/master:v2
stage: build
before_script:
- .gitlab-ci/checkout-mutter.sh
@ -58,7 +58,7 @@ build:
- build
test:
image: registry.gitlab.gnome.org/gnome/gnome-shell/master:v1
image: registry.gitlab.gnome.org/gnome/mutter/master:v2
stage: test
before_script:
- ninja -C mutter/build install
@ -72,7 +72,7 @@ test:
when: on_failure
test-pot:
image: registry.gitlab.gnome.org/gnome/gnome-shell/master:v1
image: registry.gitlab.gnome.org/gnome/mutter/master:v2
stage: test
before_script:
- ninja -C mutter/build install

View File

@ -1,19 +0,0 @@
FROM registry.gitlab.gnome.org/gnome/mutter/master:v1
RUN dnf -y update && dnf -y upgrade && \
dnf install -y 'dnf-command(copr)' && \
dnf copr enable -y fmuellner/gnome-shell-ci && \
dnf builddep -y gnome-shell --setopt=install_weak_deps=False && \
# bt only exports HAVE_BLUETOOTH to js, rest are outdated build-requires
dnf remove -y gnome-bluetooth-libs-devel dbus-glib-devel \
upower-devel python3-devel && \
# We'll build mutter ourselves
dnf remove -y --noautoremove mutter mutter-devel && \
# Needed for tests
dnf install -y '*/xvfb-run' gdm-lib accountsservice-libs && \
dnf clean all && \
rm -rf /var/cache/dnf

View File

@ -17,15 +17,19 @@ if [ "$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" ]; then
merge_request_branch=$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME
echo Looking for $merge_request_branch on remote ...
if git fetch $merge_request_remote $merge_request_branch >/dev/null 2>&1; then
if git fetch -q $merge_request_remote $merge_request_branch 2>/dev/null; then
mutter_target=FETCH_HEAD
else
mutter_target=origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME
echo Using $mutter_target instead
fi
fi
if [ -z "$mutter_target" ]; then
mutter_target=$(git branch -r -l $shell_branch)
mutter_target=$(git branch -r -l origin/$shell_branch)
mutter_target=${mutter_target:-$(git branch -r -l ${shell_branch#remotes/})}
mutter_target=${mutter_target:-origin/master}
echo Using $mutter_target instead
fi
git checkout $mutter_target
git checkout -q $mutter_target

77
NEWS
View File

@ -1,3 +1,80 @@
3.33.2
======
* Fix keeping actors visible in scrollviews [Marco; #1061]
* Move some chrome above popup windows [Jonas D.; !358]
* Include 'sandboxed-app-id' in winodw introspection info [Florian; #1289]
* Port to libecal-2.0 [Milan; !501]
* Support TCRYPT in mount password dialog [segfault; !126]
* Misc. bug fixes and cleanups [Florian, Marco, Veerasamy; !517, #745, !499,
!510, !515, !546, !549]
Contributors:
Cosimo Cecchi, Milan Crha, Jonas Dreßler, Florian Müllner, segfault,
Veerasamy Sevagen, Marco Trevisan (Treviño)
Translators:
Daniel Mustieles [es]
3.33.1
======
* Refine the app menu [Florian; #968]
* Refine window preview style [Feichtmeier; !461]
* Only emit ::style-changed on actual changes [Carlos; #1153]
* Disable emoji on-screen keyboard support on X11 [Florian; #1172]
* Fix tablet button mapping overlay [Carlos; #1220]
* Don't crash for world clock locations with no timezone [Florian; #1062]
* Don't leak old on-screen keyboard layout groups [Carlos; mutter#556]
* Fix ellipsization in dialog subtitles/bodies [Marco; !531]
* Fix glitch of fullscreen window in workspace switch animation [Jonas D.; !322]
* Fix distortion of some image contents [Florian; !525]
* Allow dragging unfocused tiled/maximized windows from top bar [Dylan; #679290]
* Handle network interface name changes [Fabrice; !534]
* Avoid unnecessary style changes when computing :first/:last-child
[Florian; !529]
* Misc. bug fixes and cleanups [Florian, Marco, Robert, Georges, Carlos, Simon,
Jonas D.; !487, !441, !502, !503, !504, !506, #822, !551, !512, !509, !511,
#1054, !524, #1065, !331, !540]
Contributors:
Fabrice Bellet, Jonas Dreßler, Feichtmeier, Carlos Garnacho, Robert Mader,
Dylan McCall, Simon McVittie, Florian Müllner, Georges Basile Stavracas Neto,
Marco Trevisan (Treviño)
Translators:
Daniel Mustieles [es], Kukuh Syafaat [id], Fabio Tomat [fur],
Carmen Bianca BAKKER [eo], Dingzhong Chen [zh_CN], Tim Sabsch [de]
3.32.1
======
* Fix avatar scaling on login screen [Florian; #1024]
* Fix distortion of desktop zoom [Florian; #646]
* Fix mouse cursor visibility when using desktop zoom [Florian, Marco; #1020]
* Fix screen dimming after wake-up on lock screen [Xiaoguang; #900]
* Fix Alt+Esc switcher [Florian; #1064]
* Respect struts for popover placement [Andrea; #1102]
* Fix app icons updates after theme changes [Florian; #1117]
* Fix desktop zoom after resolution changes [Marco; #1120]
* Implement stick-to-finger workspace switch overview gestures [Florian; #516]
* Make World Clocks offsets relative to local time [Florian; #1157]
* Fix top app icon disappearing from dash [Florian; #1053]
* Update switch style to match new Adwaita [Jakub; !496]
* Ensure CSS units are pixel-aligned when scaling is used [Carlos; #91]
* Misc. bug fixes and cleanups [Florian, Jakub, Robert, Alex, Carlos, Phil,
Marco, Benjamin, AsciiWolf, Ray, verdre; !444, #1016, #1018, !449, #1036,
!455, #1094, !440, #1023, #624, #1017, !476, !473, !480, #1130, !485, !481,
!490, !489, #1151, !435, #1160, !482, #1150, #1166, !384]
Contributors:
AsciiWolf, Andrea Azzarone, Benjamin Berg, Carlos Garnacho, Victor Ibragimov,
Robert Mader, Alex Monday, Florian Müllner, Jakub Steiner, Ray Strode,
Marco Trevisan (Treviño), verdre, Xiaoguang Wang, Phil Wyett
Translators:
Victor Ibragimov [tg, af, et, ja], Bruce Cowan [en_GB], Piotr Drąg [tg],
Charles Monzat [fr], Khaled Hosny [ar], Goran Vidović [hr],
Cheng-Chia Tseng [zh_TW], Carmen Bianca BAKKER [eo], Daniel Mustieles [es],
Dušan Kazik [sk]
3.32.0
======
* Fix sizing issues in on-screen-keyboard emoji panel [Carlos; !439]

View File

@ -9,9 +9,6 @@
<method name="ShowOSD">
<arg type="a{sv}" direction="in" name="params"/>
</method>
<method name="ShowMonitorLabels">
<arg type="a{uv}" direction="in" name="params"/>
</method>
<method name="ShowMonitorLabels2">
<arg type="a{sv}" direction="in" name="params"/>
</method>

View File

@ -21,10 +21,8 @@
<file>noise-texture.png</file>
<file>pad-osd.css</file>
<file>process-working.svg</file>
<file>toggle-off-us.svg</file>
<file>toggle-off-intl.svg</file>
<file>toggle-off-hc.svg</file>
<file>toggle-on-us.svg</file>
<file>toggle-on-intl.svg</file>
<file>toggle-on-hc.svg</file>
</gresource>

View File

@ -16,7 +16,7 @@ $link_visited_color: if($variant == 'light', darken($selected_bg_color, 20%), li
$top_hilight: $borders_edge;
$warning_color: #f57900;
$error_color: #cc0000;
$error_color: #ff8080;
$success_color: if($variant == 'light', #33d17a, darken(#33d17a, 10%));
$destructive_color: if($variant == 'light', #e01b24, darken(#e01b24, 10%));

View File

@ -157,18 +157,13 @@ StScrollBar {
/* Switches */
.toggle-switch {
width: 65px;
width: 46px;
height: 22px;
background-size: contain;
background-image: url("resource:///org/gnome/shell/theme/toggle-off-intl.svg");
&:checked { background-image: url("resource:///org/gnome/shell/theme/toggle-on-intl.svg"); }
}
@each $v in us, intl {
.toggle-switch-#{$v} {
background-image: url("resource:///org/gnome/shell/theme/toggle-off-#{$v}.svg");
&:checked { background-image: url("resource:///org/gnome/shell/theme/toggle-on-#{$v}.svg"); }
}
}
/* links */
.shell-link {
color: $link_color;
@ -387,12 +382,11 @@ StScrollBar {
.prompt-dialog-password-box {
spacing: 1em;
padding-bottom: 1em;
}
.prompt-dialog-error-label {
font-size: 10pt;
color: $error_color;
color: $warning_color;
padding-bottom: 8px;
}
@ -410,6 +404,23 @@ StScrollBar {
padding-bottom: 8px;
}
.prompt-dialog-pim-box {
spacing: 1em;
}
.prompt-dialog-grid {
spacing-rows: 15px;
spacing-columns: 1em;
}
.prompt-dialog-keyfiles-box {
spacing: 1em;
}
.prompt-dialog-button.button {
padding: 8px;
}
/* Polkit Dialog */
@ -1142,6 +1153,12 @@ StScrollBar {
.ripple-box:rtl { border-radius: 0 0 0 52px; } // just a simple change to the border radius position
// Rubberband for select-area screenshots
.select-area-rubberband {
background-color: transparentize($selected_bg_color,0.7);
border: 1px solid $selected_bg_color;
}
// not really top bar only
.popup-menu-arrow { icon-size: 1.09em; }
.popup-menu-icon { icon-size: 1.09em; }
@ -1149,25 +1166,23 @@ StScrollBar {
//close buttons
.window-close {
background-color: white;
background-color: $selected_bg_color;
color: white;
border-radius: 24px;
border: 4px solid $selected_bg_color;
box-shadow: inset 0 -4px 0 0 transparentize($selected_bg_color, 0.5);
color: $selected_bg_color;
border: 2px solid $selected_bg_color;
height: 24px;
width: 24px;
-shell-close-overlap: 14px;
-shell-close-overlap: 11px;
box-shadow: -1px 1px 5px 0px transparentize(black, 0.5);
&:hover {
background-color: $selected_bg_color;
border-color: white;
color: white;
background-color: lighten($selected_bg_color, 5%);
border-color: lighten($selected_bg_color, 5%);
}
&:active {
background-color: mix(white, $selected_bg_color, 75%);
border-color: $selected_bg_color;
color: $selected_bg_color;
background-color: darken($selected_bg_color, 5%);
border-color: darken($selected_bg_color, 5%);
}
}
@ -1232,13 +1247,14 @@ StScrollBar {
}
.window-clone-border {
border: 4px solid $selected_bg_color;
border-radius: 4px;
$_bg: transparentize(white, 0.65);
border: 5px solid $_bg;
border-radius: 6px;
// For window decorations with round corners we can't match
// the exact shape when the window is scaled. So apply a shadow
// to fix that case
box-shadow: inset 0px 0px 0px 1px $selected_bg_color;
}
box-shadow: inset 0 0 0 1px $_bg;
}
.window-caption {
spacing: 25px;
color: $selected_fg_color;
@ -1453,13 +1469,13 @@ StScrollBar {
height: 12px;
background-color: transparent;
border: 2px solid rgba(255, 255, 255, 0.4);
border-radius:12px;
border-radius: 12px;
}
&:hover .page-indicator-icon { border-color: white; }
&:active .page-indicator-icon { border: none; margin: 2px; background-color:#fff; }
&:active .page-indicator-icon { border: none; margin: 2px; background-color: white; }
&:checked .page-indicator-icon,
&:checked:active { background-color: #fff;}
&:checked:active .page-indicator-icon { background-color: white;}
}
.no-frequent-applications-label { @extend %status_text; }

View File

@ -10,124 +10,62 @@
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="65"
width="46"
height="22"
id="svg2857"
viewBox="0 0 46 22"
version="1.1"
inkscape:version="0.48.5 r10040"
sodipodi:docname="toggle-off-us.svg">
id="svg2751"
inkscape:version="0.92.4 5da689c313, 2019-01-14"
sodipodi:docname="toggle-off-intl.svg">
<defs
id="defs2859">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 526.18109 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="744.09448 : 526.18109 : 1"
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
id="perspective2865" />
<inkscape:perspective
id="perspective2843"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
id="defs2745">
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient76469-7-7-4"
id="linearGradient38024"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0215462,0,0,1.0322581,717.22867,428.68472)"
x1="6"
y1="102.95528"
x2="6"
y2="84.505203" />
<linearGradient
inkscape:collect="always"
id="linearGradient76469-7-7-4">
id="linearGradient3329">
<stop
style="stop-color:#2e3232;stop-opacity:1"
style="stop-color:#39393a;stop-opacity:1;"
offset="0"
id="stop76471-7-1-5" />
id="stop3325" />
<stop
style="stop-color:#3e4545;stop-opacity:1"
style="stop-color:#302f30;stop-opacity:1"
offset="1"
id="stop76473-9-0-0" />
</linearGradient>
<inkscape:path-effect
effect="spiro"
id="path-effect77541-4"
is_visible="true" />
<inkscape:path-effect
effect="spiro"
id="path-effect77541-4-0"
is_visible="true" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient37802-8"
id="linearGradient12311-3-1-0-5-4"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.5918367,0,0,0.85714285,-256.56122,59.071426)"
x1="610.13782"
y1="501.43866"
x2="610.13782"
y2="492.52756" />
<linearGradient
id="linearGradient37802-8"
inkscape:collect="always">
<stop
id="stop37804-1"
offset="0"
style="stop-color:#2c2c2c;stop-opacity:1" />
<stop
id="stop37806-8"
offset="1"
style="stop-color:#16191a;stop-opacity:1" />
id="stop3327" />
</linearGradient>
<linearGradient
y2="492.52756"
x2="610.13782"
y1="501.43866"
x1="610.13782"
gradientTransform="matrix(1.5918367,0,0,0.85714285,-900.56122,-423.92857)"
inkscape:collect="always"
xlink:href="#linearGradient3329"
id="linearGradient3331"
x1="53"
y1="294.42917"
x2="53"
y2="309.80417"
gradientUnits="userSpaceOnUse"
id="linearGradient13602"
xlink:href="#linearGradient37802-8"
inkscape:collect="always" />
gradientTransform="translate(-42.760724)" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#000000"
pagecolor="#535353"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="-5.0602834"
inkscape:cy="16.473273"
inkscape:cx="-19.436775"
inkscape:cy="-13.499723"
inkscape:document-units="px"
inkscape:current-layer="g37994"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="2560"
inkscape:window-height="1375"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
units="px"
inkscape:pagecheckerboard="true"
borderlayer="true"
inkscape:showpageshadow="false"
inkscape:snap-nodes="false"
inkscape:snap-bbox="true"
showborder="false">
<inkscape:grid
type="xygrid"
id="grid12954"
empspacing="5"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true" />
id="grid3298" />
</sodipodi:namedview>
<metadata
id="metadata2862">
id="metadata2748">
<rdf:RDF>
<cc:Work
rdf:about="">
@ -142,68 +80,24 @@
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-444.64286,-781.36218)">
<g
transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)"
id="g37994">
<g
id="g37996"
transform="translate(-115,1277)">
<rect
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964000000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.19591837"
id="rect13475"
width="98"
height="25"
x="644.5"
y="484.61118"
rx="4.7429576"
ry="3.8424656" />
<rect
ry="3.8424656"
rx="4.7429576"
y="483.5"
x="644.5"
height="25"
width="98"
id="rect38000"
style="color:#000000;fill:url(#linearGradient12311-3-1-0-5-4);fill-opacity:1;fill-rule:nonzero;stroke:#16191a;stroke-width:1.37920942;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
</g>
<g
transform="translate(-49.946213,-1.890275)"
id="g38002">
<g
transform="translate(-115,1247)"
style="display:inline"
id="g38004">
<rect
ry="3.7972314"
rx="4.6871223"
y="515.5"
x="694.53046"
height="25"
width="45.969578"
id="rect38006"
style="color:#000000;fill:url(#linearGradient38024);fill-opacity:1;fill-rule:nonzero;stroke:#1f2020;stroke-width:1.37920964;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<path
sodipodi:nodetypes="cc"
style="opacity:0.1;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
d="m 699.09675,516.7365 36.86904,0"
id="path38016"
inkscape:path-effect="#path-effect77541-4"
inkscape:original-d="m 699.09675,516.7365 36.86904,0"
inkscape:connector-curvature="0" />
</g>
</g>
<path
sodipodi:type="arc"
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:2.15627193;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
id="path13479"
sodipodi:cx="16.4375"
sodipodi:cy="10.8125"
sodipodi:rx="4.3125"
sodipodi:ry="4.3125"
d="m 20.75,10.8125 a 4.3125,4.3125 0 1 1 -8.625,0 4.3125,4.3125 0 1 1 8.625,0 z"
transform="matrix(1.4212691,0,0,1.1514287,577.38488,1761.1138)" />
</g>
transform="translate(0,-291.17916)">
<rect
style="opacity:1;vector-effect:none;fill:#323233;fill-opacity:1;stroke:#272728;stroke-width:1.08532763;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
id="rect3296"
width="44.446434"
height="20.910645"
x="0.625"
y="291.71494"
rx="10.455324"
ry="10.073335" />
<rect
ry="10.455322"
rx="10.455322"
y="291.71494"
x="0.5428465"
height="20.910645"
width="21.142862"
id="rect3300"
style="opacity:1;vector-effect:none;fill:url(#linearGradient3331);fill-opacity:1;stroke:#151515;stroke-width:1.08532763;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@ -1,255 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="65"
height="22"
id="svg2857"
version="1.1"
inkscape:version="0.48.5 r10040"
sodipodi:docname="toggle-on-intl.svg">
<defs
id="defs2859">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 526.18109 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="744.09448 : 526.18109 : 1"
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
id="perspective2865" />
<inkscape:perspective
id="perspective2843"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient76469-7-7-4"
id="linearGradient38024"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0215462,0,0,1.0322581,717.22867,428.68472)"
x1="6"
y1="102.95528"
x2="6"
y2="84.505203" />
<linearGradient
inkscape:collect="always"
id="linearGradient76469-7-7-4">
<stop
style="stop-color:#2e3232;stop-opacity:1"
offset="0"
id="stop76471-7-1-5" />
<stop
style="stop-color:#3e4545;stop-opacity:1"
offset="1"
id="stop76473-9-0-0" />
</linearGradient>
<inkscape:path-effect
effect="spiro"
id="path-effect77541-4"
is_visible="true" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient37802"
id="linearGradient12311-3-1-0-5"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.5918367,0,0,0.85714285,-256.56122,59.071426)"
x1="610.13782"
y1="501.43866"
x2="610.13782"
y2="492.52756" />
<linearGradient
id="linearGradient37802"
inkscape:collect="always">
<stop
id="stop37804"
offset="0"
style="stop-color:#2c2c2c;stop-opacity:1" />
<stop
id="stop37806"
offset="1"
style="stop-color:#16191a;stop-opacity:1" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient76469-7-7-4-3"
id="linearGradient77680"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,1.0322581,717.71949,428.68472)"
x1="6"
y1="102.95528"
x2="6"
y2="84.505203" />
<linearGradient
inkscape:collect="always"
id="linearGradient76469-7-7-4-3">
<stop
style="stop-color:#2e3232;stop-opacity:1"
offset="0"
id="stop76471-7-1-5-7" />
<stop
style="stop-color:#3e4545;stop-opacity:1"
offset="1"
id="stop76473-9-0-0-9" />
</linearGradient>
<inkscape:path-effect
effect="spiro"
id="path-effect77541-4-0"
is_visible="true" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient37802-8"
id="linearGradient12311-3-1-0-5-4"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.5918367,0,0,0.85714285,-256.56122,59.071426)"
x1="610.13782"
y1="501.43866"
x2="610.13782"
y2="492.52756" />
<linearGradient
id="linearGradient37802-8"
inkscape:collect="always">
<stop
id="stop37804-1"
offset="0"
style="stop-color:#2c2c2c;stop-opacity:1" />
<stop
id="stop37806-8"
offset="1"
style="stop-color:#16191a;stop-opacity:1" />
</linearGradient>
<linearGradient
y2="492.52756"
x2="610.13782"
y1="501.43866"
x1="610.13782"
gradientTransform="matrix(1.5918367,0,0,0.85714285,-900.56122,-423.92857)"
gradientUnits="userSpaceOnUse"
id="linearGradient13602"
xlink:href="#linearGradient37802-8"
inkscape:collect="always" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#000000"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="16.760995"
inkscape:cy="21.955673"
inkscape:document-units="px"
inkscape:current-layer="g37994"
showgrid="false"
inkscape:window-width="2560"
inkscape:window-height="1375"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
borderlayer="true"
inkscape:showpageshadow="false"
inkscape:snap-nodes="false"
inkscape:snap-bbox="true"
showborder="false">
<inkscape:grid
type="xygrid"
id="grid12954"
empspacing="5"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true" />
</sodipodi:namedview>
<metadata
id="metadata2862">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-444.64286,-781.36218)">
<g
transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)"
id="g37994">
<g
id="g37996"
transform="translate(-115,1277)">
<rect
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964000000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.19591837"
id="rect13475"
width="98"
height="25"
x="644.5"
y="484.61118"
rx="4.7429576"
ry="3.8424656" />
<rect
ry="3.8424656"
rx="4.7429576"
y="483.5"
x="644.5"
height="25"
width="98"
id="rect38000"
style="color:#000000;fill:url(#linearGradient12311-3-1-0-5-4);fill-opacity:1;fill-rule:nonzero;stroke:#16191a;stroke-width:1.37920942;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
</g>
<g
transform="translate(-49.946213,-1.890275)"
id="g38002">
<g
transform="translate(-115,1247)"
style="display:inline"
id="g38004">
<rect
ry="3.7972314"
rx="4.6871223"
y="515.5"
x="694.53046"
height="25"
width="45.969578"
id="rect38006"
style="color:#000000;fill:url(#linearGradient38024);fill-opacity:1;fill-rule:nonzero;stroke:#1f2020;stroke-width:1.37920964;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<path
sodipodi:nodetypes="cc"
style="opacity:0.1;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
d="m 699.09675,516.7365 36.86904,0"
id="path38016"
inkscape:path-effect="#path-effect77541-4"
inkscape:original-d="m 699.09675,516.7365 36.86904,0"
inkscape:connector-curvature="0" />
</g>
</g>
<text
xml:space="preserve"
style="font-size:13.79166794px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Cantarell;-inkscape-font-specification:Cantarell Bold"
x="520.29974"
y="1997.0011"
id="text75614"
sodipodi:linespacing="125%"
transform="scale(1.1236771,0.88993537)"><tspan
sodipodi:role="line"
id="tspan75616"
x="520.29974"
y="1997.0011">OFF</tspan></text>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 8.8 KiB

View File

@ -10,117 +10,69 @@
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="65"
width="46"
height="22"
id="svg2857"
viewBox="0 0 46 22"
version="1.1"
inkscape:version="0.91 r13725"
id="svg2751"
inkscape:version="0.92.4 5da689c313, 2019-01-14"
sodipodi:docname="toggle-on-intl.svg">
<defs
id="defs2859">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 526.18109 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="744.09448 : 526.18109 : 1"
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
id="perspective2865" />
<inkscape:perspective
id="perspective2843"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
id="defs2745">
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient77461"
id="linearGradient77551"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.3066667,0,0,1,-841.64667,-483)"
x1="1164.7644"
y1="962.93695"
x2="1164.7644"
y2="970.51404" />
<linearGradient
id="linearGradient77461"
inkscape:collect="always">
id="linearGradient3329">
<stop
id="stop77463"
style="stop-color:#39393a;stop-opacity:1;"
offset="0"
style="stop-color:#182f4c;stop-opacity:1" />
id="stop3325" />
<stop
id="stop77465"
style="stop-color:#302f30;stop-opacity:1"
offset="1"
style="stop-color:#205b9a;stop-opacity:1" />
id="stop3327" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient76469-7-7-4"
id="linearGradient38024"
xlink:href="#linearGradient3329"
id="linearGradient3331"
x1="53"
y1="294.42917"
x2="53"
y2="309.80417"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0215462,0,0,1.0322581,717.22867,428.68472)"
x1="6"
y1="102.95528"
x2="6"
y2="84.505203" />
<linearGradient
inkscape:collect="always"
id="linearGradient76469-7-7-4">
<stop
style="stop-color:#2e3232;stop-opacity:1"
offset="0"
id="stop76471-7-1-5" />
<stop
style="stop-color:#3e4545;stop-opacity:1"
offset="1"
id="stop76473-9-0-0" />
</linearGradient>
<inkscape:path-effect
effect="spiro"
id="path-effect77541-4"
is_visible="true" />
gradientTransform="translate(-19)" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#000000"
pagecolor="#535353"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="37.410841"
inkscape:cy="16.009314"
inkscape:cx="13.588971"
inkscape:cy="14.124546"
inkscape:document-units="px"
inkscape:current-layer="g37994"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="2560"
inkscape:window-height="1376"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
units="px"
inkscape:pagecheckerboard="true"
borderlayer="true"
inkscape:showpageshadow="false"
inkscape:snap-nodes="false"
inkscape:snap-bbox="true"
showborder="false">
<inkscape:grid
type="xygrid"
id="grid12954"
empspacing="5"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true" />
id="grid3298" />
</sodipodi:namedview>
<metadata
id="metadata2862">
id="metadata2748">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
@ -128,65 +80,24 @@
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-444.64286,-781.36218)">
<g
transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)"
id="g37994">
<g
id="g37996"
transform="translate(-115,1277)">
<rect
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964000000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.19591837"
id="rect13475"
width="98"
height="25"
x="644.5"
y="484.61118"
rx="4.7429576"
ry="3.8424656" />
<rect
ry="3.8424656"
rx="4.7429576"
y="483.5"
x="644.5"
height="25"
width="98"
id="rect38000"
style="color:#000000;fill:url(#linearGradient77551);fill-opacity:1;fill-rule:nonzero;stroke:#182f4c;stroke-width:1.37920964;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
</g>
<g
transform="translate(2.0625,-2)"
id="g38002">
<g
transform="translate(-115,1247)"
style="display:inline"
id="g38004">
<rect
ry="3.7972314"
rx="4.6871223"
y="515.5"
x="694.53046"
height="25"
width="45.969578"
id="rect38006"
style="color:#000000;fill:url(#linearGradient38024);fill-opacity:1;fill-rule:nonzero;stroke:#1f2020;stroke-width:1.37920964;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<path
sodipodi:nodetypes="cc"
style="opacity:0.1;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
d="m 699.09675,516.7365 36.86904,0"
id="path38016"
inkscape:path-effect="#path-effect77541-4"
inkscape:original-d="m 699.09675,516.7365 36.86904,0"
inkscape:connector-curvature="0" />
</g>
</g>
<rect
style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
id="rect13678"
width="3.0646207"
height="12.414008"
x="554.77728"
y="1767.3566" />
</g>
transform="translate(0,-291.17916)">
<rect
style="opacity:1;vector-effect:none;fill:#15539e;fill-opacity:1;stroke:#030e1b;stroke-width:1.08532763;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
id="rect3296"
width="44.446434"
height="20.910645"
x="0.625"
y="291.71494"
rx="10.455324"
ry="10.073335" />
<rect
ry="10.455322"
rx="10.455322"
y="291.71494"
x="24.30357"
height="20.910645"
width="21.142862"
id="rect3300"
style="opacity:1;vector-effect:none;fill:url(#linearGradient3331);fill-opacity:1;stroke:#030e1b;stroke-width:1.08532763;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 6.8 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@ -1,207 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="65"
height="22"
id="svg2857"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="toggle-on-us.svg">
<defs
id="defs2859">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 526.18109 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="744.09448 : 526.18109 : 1"
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
id="perspective2865" />
<inkscape:perspective
id="perspective2843"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient76469-7-7-4"
id="linearGradient38024"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0215462,0,0,1.0322581,717.22867,428.68472)"
x1="6"
y1="102.95528"
x2="6"
y2="84.505203" />
<linearGradient
inkscape:collect="always"
id="linearGradient76469-7-7-4">
<stop
style="stop-color:#2e3232;stop-opacity:1"
offset="0"
id="stop76471-7-1-5" />
<stop
style="stop-color:#3e4545;stop-opacity:1"
offset="1"
id="stop76473-9-0-0" />
</linearGradient>
<inkscape:path-effect
effect="spiro"
id="path-effect77541-4"
is_visible="true" />
<linearGradient
id="linearGradient77461-1"
inkscape:collect="always">
<stop
id="stop77463-1"
offset="0"
style="stop-color:#182f4c;stop-opacity:1" />
<stop
id="stop77465-4"
offset="1"
style="stop-color:#205b9a;stop-opacity:1" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient77461-1"
id="linearGradient77551-6-5"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.8527367,0,0,0.80554422,-969.41608,-778.00299)"
x1="1164.7644"
y1="962.93695"
x2="1164.7644"
y2="970.51404" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient77461-1"
id="linearGradient11198"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.3066667,0,0,1,-1066.3709,794.25325)"
x1="1322.5831"
y1="-312.51855"
x2="1322.5831"
y2="-306.53461" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#000000"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="-26.798898"
inkscape:cy="5.3753009"
inkscape:document-units="px"
inkscape:current-layer="g37994"
showgrid="false"
inkscape:window-width="2560"
inkscape:window-height="1376"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
borderlayer="true"
inkscape:showpageshadow="false"
inkscape:snap-nodes="false"
inkscape:snap-bbox="true"
showborder="false">
<inkscape:grid
type="xygrid"
id="grid12954"
empspacing="5"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true" />
</sodipodi:namedview>
<metadata
id="metadata2862">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-444.64286,-781.36218)">
<g
transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)"
id="g37994">
<g
id="g37996"
transform="translate(-115,1277)">
<rect
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964000000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.19591837"
id="rect13475"
width="98"
height="25"
x="644.5"
y="484.61118"
rx="4.7429576"
ry="3.8424656" />
<rect
ry="3.8424656"
rx="4.7429576"
y="483.5"
x="644.5"
height="25"
width="98"
id="rect38000"
style="color:#000000;fill:url(#linearGradient11198);fill-opacity:1;fill-rule:nonzero;stroke:#182f4c;stroke-width:1.37920964;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;clip-rule:nonzero;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;filter-blend-mode:normal;filter-gaussianBlur-deviation:0;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto" />
</g>
<g
transform="translate(2.0625,-2)"
id="g38002">
<g
transform="translate(-115,1247)"
style="display:inline"
id="g38004">
<rect
ry="3.7972314"
rx="4.6871223"
y="515.5"
x="694.53046"
height="25"
width="45.969578"
id="rect38006"
style="color:#000000;fill:url(#linearGradient38024);fill-opacity:1;fill-rule:nonzero;stroke:#1f2020;stroke-width:1.37920964;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<path
sodipodi:nodetypes="cc"
style="opacity:0.1;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
d="m 699.09675,516.7365 36.86904,0"
id="path38016"
inkscape:path-effect="#path-effect77541-4"
inkscape:original-d="m 699.09675,516.7365 36.86904,0"
inkscape:connector-curvature="0" />
</g>
</g>
<text
transform="scale(1.1000946,0.90901274)"
sodipodi:linespacing="125%"
id="text38018"
y="1955.5205"
x="495.94223"
style="font-size:13.29953671px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Cantarell;-inkscape-font-specification:Cantarell Bold"
xml:space="preserve"><tspan
y="1955.5205"
x="495.94223"
id="tspan38020"
sodipodi:role="line">ON</tspan></text>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 7.7 KiB

View File

@ -551,9 +551,9 @@ class ExtensionRow extends Gtk.ListBoxRow {
let button = new Gtk.Button({ valign: Gtk.Align.CENTER,
no_show_all: true });
button.add(new Gtk.Image({ icon_name: 'emblem-system-symbolic',
icon_size: Gtk.IconSize.BUTTON,
visible: true }));
button.set_image(new Gtk.Image({ icon_name: 'emblem-system-symbolic',
icon_size: Gtk.IconSize.BUTTON,
visible: true }));
button.get_style_context().add_class('circular');
hbox.add(button);

View File

@ -124,7 +124,7 @@ var Batch = class extends Task {
}
process() {
throw new Error('Not implemented');
throw new GObject.NotImplementedError(`process in ${this.constructor.name}`);
}
runTask() {

View File

@ -325,7 +325,7 @@ var SessionMenuButton = class {
this._button.remove_style_pseudo_class('active');
});
this._manager = new PopupMenu.PopupMenuManager({ actor: this._button },
this._manager = new PopupMenu.PopupMenuManager(this._button,
{ actionMode: Shell.ActionMode.NONE });
this._manager.addMenu(this._menu);
@ -652,7 +652,7 @@ var LoginDialog = GObject.registerClass({
bannerAllocation.x2 = Math.floor(centerX - centerGap / 2);
bannerAllocation.x1 = Math.floor(bannerAllocation.x2 - wideBannerWidth);
// figure out how tall it would like to be and try to accomodate
// figure out how tall it would like to be and try to accommodate
// but don't let it get too close to the logo
let [wideMinHeight, wideBannerHeight] = this._bannerView.get_preferred_height(wideBannerWidth);

View File

@ -42,8 +42,6 @@ var IntrospectService = class {
}
_isStandaloneApp(app) {
let windows = app.get_windows();
return app.get_windows().some(w => w.transient_for == null);
}
@ -55,6 +53,11 @@ var IntrospectService = class {
return APP_WHITELIST.includes(sender);
}
_getSandboxedAppId(app) {
let ids = app.get_windows().map(w => w.get_sandboxed_app_id());
return ids.find(id => id != null);
}
_syncRunningApplications() {
let tracker = Shell.WindowTracker.get_default();
let apps = this._appSystem.get_running();
@ -76,6 +79,10 @@ var IntrospectService = class {
newActiveApplication = app.get_id();
}
let sandboxedAppId = this._getSandboxedAppId(app);
if (sandboxedAppId)
appInfo['sandboxed-app-id'] = new GLib.Variant('s', sandboxedAppId);
newRunningApplications[app.get_id()] = appInfo;
}
@ -137,6 +144,7 @@ var IntrospectService = class {
let frameRect = window.get_frame_rect();
let title = window.get_title();
let wmClass = window.get_wm_class();
let sandboxedAppId = window.get_sandboxed_app_id();
windowsList[windowId] = {
'app-id': GLib.Variant.new('s', app.get_id()),
@ -153,6 +161,10 @@ var IntrospectService = class {
if (wmClass != null)
windowsList[windowId]['wm-class'] = GLib.Variant.new('s', wmClass);
if (sandboxedAppId != null)
windowsList[windowId]['sandboxed-app-id'] =
GLib.Variant.new('s', sandboxedAppId);
}
}
invocation.return_value(new GLib.Variant('(a{ta{sv}})', [windowsList]));

View File

@ -88,42 +88,42 @@ const SystemActions = GObject.registerClass({
name: C_("search-result", "Power Off"),
iconName: 'system-shutdown-symbolic',
// Translators: A list of keywords that match the power-off action, separated by semicolons
keywords: _("power off;shutdown;reboot;restart").split(';'),
keywords: _("power off;shutdown;reboot;restart").split(/[; ]/),
available: false });
this._actions.set(LOCK_SCREEN_ACTION_ID,
{ // Translators: The name of the lock screen action in search
name: C_("search-result", "Lock Screen"),
iconName: 'system-lock-screen-symbolic',
// Translators: A list of keywords that match the lock screen action, separated by semicolons
keywords: _("lock screen").split(';'),
keywords: _("lock screen").split(/[; ]/),
available: false });
this._actions.set(LOGOUT_ACTION_ID,
{ // Translators: The name of the logout action in search
name: C_("search-result", "Log Out"),
iconName: 'application-exit-symbolic',
// Translators: A list of keywords that match the logout action, separated by semicolons
keywords: _("logout;sign off").split(';'),
keywords: _("logout;log out;sign off").split(/[; ]/),
available: false });
this._actions.set(SUSPEND_ACTION_ID,
{ // Translators: The name of the suspend action in search
name: C_("search-result", "Suspend"),
iconName: 'media-playback-pause-symbolic',
// Translators: A list of keywords that match the suspend action, separated by semicolons
keywords: _("suspend;sleep").split(';'),
keywords: _("suspend;sleep").split(/[; ]/),
available: false });
this._actions.set(SWITCH_USER_ACTION_ID,
{ // Translators: The name of the switch user action in search
name: C_("search-result", "Switch User"),
iconName: 'system-switch-user-symbolic',
// Translators: A list of keywords that match the switch user action, separated by semicolons
keywords: _("switch user").split(';'),
keywords: _("switch user").split(/[; ]/),
available: false });
this._actions.set(LOCK_ORIENTATION_ACTION_ID,
{ // Translators: The name of the lock orientation action in search
name: C_("search-result", "Lock Orientation"),
iconName: '',
// Translators: A list of keywords that match the lock orientation action, separated by semicolons
keywords: _("lock orientation;screen;rotation").split(';'),
keywords: _("lock orientation;screen;rotation").split(/[; ]/),
available: false });
this._loginScreenSettings = new Gio.Settings({ schema_id: LOGIN_SCREEN_SCHEMA });
@ -262,7 +262,7 @@ const SystemActions = GObject.registerClass({
let results = [];
for (let [key, {available, keywords}] of this._actions)
if (available && terms.every(t => keywords.some(k => (k.indexOf(t) >= 0))))
if (available && terms.every(t => keywords.some(k => k.startsWith(t))))
results.push(key);
return results;

View File

@ -366,7 +366,7 @@ class CloseButton extends St.Button {
}
_computeBoxPointerOffset() {
if (!this._boxPointer || !this._boxPointer.actor.get_stage())
if (!this._boxPointer || !this._boxPointer.get_stage())
return 0;
let side = this._boxPointer.arrowSide;

View File

@ -30,6 +30,14 @@ var WeatherClient = class {
return;
}
if (this._permStore.g_name_owner == null) {
// Failed to auto-start, likely because xdg-desktop-portal
// isn't installed; don't restrict access to location service
this._weatherAuthorized = true;
this._updateAutoLocation();
return;
}
this._permStore.LookupRemote('gnome', 'geolocation', (res, error) => {
if (error)
log('Error looking up permission: ' + error.message);

View File

@ -10,7 +10,7 @@ const Scripting = imports.ui.scripting;
// someone should be able to get an idea of how well the shell is performing
// on a particular system.
let METRICS = {
var METRICS = {
overviewLatencyFirst:
{ description: "Time to first frame after triggering overview, first time",
units: "us" },

View File

@ -1,8 +1,8 @@
const { Clutter, Gio, Gtk, Shell } = imports.gi;
const { Clutter, Gio, Shell } = imports.gi;
const Main = imports.ui.main;
const Scripting = imports.ui.scripting;
let METRICS = {
var METRICS = {
timeToDesktop:
{ description: "Time from starting graphical.target to desktop showing",
units: "us" },
@ -104,7 +104,10 @@ function *run() {
yield Scripting.waitLeisure();
Scripting.scriptEvent('desktopShown');
Gtk.Settings.get_default().gtk_enable_animations = false;
let interfaceSettings = new Gio.Settings({
schema_id: 'org.gnome.desktop.interface'
});
interfaceSettings.set_boolean('enable-animations', false);
Scripting.scriptEvent('overviewShowStart');
Main.overview.show();
@ -200,7 +203,7 @@ function *run() {
yield Scripting.sleep(1000);
Gtk.Settings.get_default().gtk_enable_animations = true;
interfaceSettings.set_boolean('enable-animations', true);
}
let overviewShowStart;

View File

@ -474,12 +474,10 @@ var CyclerList = GObject.registerClass({
}
});
var CyclerPopup = GObject.registerClass(
class CyclerPopup extends SwitcherPopup.SwitcherPopup {
var CyclerPopup = GObject.registerClass({
GTypeFlags: GObject.TypeFlags.ABSTRACT
}, class CyclerPopup extends SwitcherPopup.SwitcherPopup {
_init() {
if (new.target === CyclerPopup)
throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
super._init();
this._items = this._getWindows();
@ -619,9 +617,8 @@ class WindowSwitcherPopup extends SwitcherPopup.SwitcherPopup {
var WindowCyclerPopup = GObject.registerClass(
class WindowCyclerPopup extends CyclerPopup {
_init() {
super._init();
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell.window-switcher' });
super._init();
}
_getWindows() {

View File

@ -98,8 +98,8 @@ function clamp(value, min, max) {
class BaseAppView {
constructor(params, gridParams) {
if (new.target === BaseAppView)
throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
if (this.constructor === BaseAppView)
throw new TypeError(`Cannot instantiate abstract class ${this.constructor.name}`);
gridParams = Params.parse(gridParams, { xAlign: St.Align.MIDDLE,
columnLimit: MAX_COLUMNS,
@ -414,7 +414,7 @@ var AllView = class AllView extends BaseAppView {
this._refilterApps();
}
// Overriden from BaseAppView
// Overridden from BaseAppView
animate(animationDirection, onComplete) {
this._scrollView.reactive = false;
let completionFunc = () => {
@ -1017,7 +1017,7 @@ var FolderView = class FolderView extends BaseAppView {
Util.ensureActorVisibleInScrollView(this.actor, actor);
}
// Overriden from BaseAppView
// Overridden from BaseAppView
animate(animationDirection) {
this._grid.animatePulse(animationDirection);
}
@ -1081,7 +1081,7 @@ var FolderView = class FolderView extends BaseAppView {
let contentBox = this.actor.get_theme_node().get_content_box(pageBox);
// We only can show icons inside the collection view boxPointer
// so we have to substract the required padding etc of the boxpointer
// so we have to subtract the required padding etc of the boxpointer
return [(contentBox.x2 - contentBox.x1) - 2 * this._offsetForEachSide, (contentBox.y2 - contentBox.y1) - 2 * this._offsetForEachSide];
}
@ -1301,16 +1301,16 @@ var AppFolderPopup = class AppFolderPopup {
x_expand: true,
x_align: St.Align.START });
this._boxPointer.actor.style_class = 'app-folder-popup';
this.actor.add_actor(this._boxPointer.actor);
this._boxPointer.style_class = 'app-folder-popup';
this.actor.add_actor(this._boxPointer);
this._boxPointer.bin.set_child(this._view.actor);
this.closeButton = Util.makeCloseButton(this._boxPointer);
this.closeButton.connect('clicked', this.popdown.bind(this));
this.actor.add_actor(this.closeButton);
this._boxPointer.actor.bind_property('opacity', this.closeButton, 'opacity',
GObject.BindingFlags.SYNC_CREATE);
this._boxPointer.bind_property('opacity', this.closeButton, 'opacity',
GObject.BindingFlags.SYNC_CREATE);
global.focus_manager.add_group(this.actor);
@ -1479,7 +1479,7 @@ var AppIcon = class AppIcon {
this.actor.connect('popup-menu', this._onKeyboardPopupMenu.bind(this));
this._menu = null;
this._menuManager = new PopupMenu.PopupMenuManager(this);
this._menuManager = new PopupMenu.PopupMenuManager(this.actor);
if (isDraggable) {
this._draggable = DND.makeDraggable(this.actor);
@ -1707,25 +1707,20 @@ var AppIconMenu = class AppIconMenu extends PopupMenu.PopupMenu {
w => !w.skip_taskbar
);
// Display the app windows menu items and the separator between windows
// of the current desktop and other windows.
let workspaceManager = global.workspace_manager;
let activeWorkspace = workspaceManager.get_active_workspace();
let separatorShown = windows.length > 0 && windows[0].get_workspace() != activeWorkspace;
if (windows.length > 0)
this.addMenuItem(
/* Translators: This is the heading of a list of open windows */
new PopupMenu.PopupSeparatorMenuItem(_("Open Windows"))
);
for (let i = 0; i < windows.length; i++) {
let window = windows[i];
if (!separatorShown && window.get_workspace() != activeWorkspace) {
this._appendSeparator();
separatorShown = true;
}
windows.forEach(window => {
let title = window.title ? window.title
: this._source.app.get_name();
let item = this._appendMenuItem(title);
item.connect('activate', () => {
this.emit('activate-window', window);
});
}
});
if (!this._source.app.is_window_backed()) {
this._appendSeparator();

View File

@ -14,39 +14,47 @@ const RENAMED_DESKTOP_IDS = {
'epiphany.desktop': 'org.gnome.Epiphany.desktop',
'evolution.desktop': 'org.gnome.Evolution.desktop',
'file-roller.desktop': 'org.gnome.FileRoller.desktop',
'five-or-more.desktop': 'org.gnome.five-or-more.desktop',
'four-in-a-row.desktop': 'org.gnome.Four-in-a-row.desktop',
'gcalctool.desktop': 'org.gnome.Calculator.desktop',
'geary.desktop': 'org.gnome.Geary.desktop',
'gedit.desktop': 'org.gnome.gedit.desktop',
'glchess.desktop': 'gnome-chess.desktop',
'glines.desktop': 'five-or-more.desktop',
'gnect.desktop': 'four-in-a-row.desktop',
'glchess.desktop': 'org.gnome.Chess.desktop',
'glines.desktop': 'org.gnome.five-or-more.desktop',
'gnect.desktop': 'org.gnome.Four-in-a-row.desktop',
'gnibbles.desktop': 'org.gnome.Nibbles.desktop',
'gnobots2.desktop': 'gnome-robots.desktop',
'gnobots2.desktop': 'org.gnome.Robots.desktop',
'gnome-boxes.desktop': 'org.gnome.Boxes.desktop',
'gnome-calculator.desktop': 'org.gnome.Calculator.desktop',
'gnome-chess.desktop': 'org.gnome.Chess.desktop',
'gnome-clocks.desktop': 'org.gnome.clocks.desktop',
'gnome-contacts.desktop': 'org.gnome.Contacts.desktop',
'gnome-documents.desktop': 'org.gnome.Documents.desktop',
'gnome-font-viewer.desktop': 'org.gnome.font-viewer.desktop',
'gnome-klotski.desktop': 'org.gnome.Klotski.desktop',
'gnome-nibbles.desktop': 'org.gnome.Nibbles.desktop',
'gnome-mahjongg.desktop': 'org.gnome.Mahjongg.desktop',
'gnome-mines.desktop': 'org.gnome.Mines.desktop',
'gnome-music.desktop': 'org.gnome.Music.desktop',
'gnome-photos.desktop': 'org.gnome.Photos.desktop',
'gnome-robots.desktop': 'org.gnome.Robots.desktop',
'gnome-screenshot.desktop': 'org.gnome.Screenshot.desktop',
'gnome-software.desktop': 'org.gnome.Software.desktop',
'gnome-terminal.desktop': 'org.gnome.Terminal.desktop',
'gnome-tetravex.desktop': 'org.gnome.Tetravex.desktop',
'gnome-tweaks.desktop': 'org.gnome.tweaks.desktop',
'gnome-weather.desktop': 'org.gnome.Weather.desktop',
'gnomine.desktop': 'gnome-mines.desktop',
'gnotravex.desktop': 'gnome-tetravex.desktop',
'gnotski.desktop': 'gnome-klotski.desktop',
'gtali.desktop': 'tali.desktop',
'gnomine.desktop': 'org.gnome.Mines.desktop',
'gnotravex.desktop': 'org.gnome.Tetravex.desktop',
'gnotski.desktop': 'org.gnome.Klotski.desktop',
'gtali.desktop': 'org.gnome.Tali.desktop',
'iagno.desktop': 'org.gnome.Reversi.desktop',
'nautilus.desktop': 'org.gnome.Nautilus.desktop',
'org.gnome.gnome-2048.desktop': 'org.gnome.TwentyFortyEight.desktop',
'org.gnome.taquin.desktop': 'org.gnome.Taquin.desktop',
'org.gnome.Weather.Application.desktop': 'org.gnome.Weather.desktop',
'polari.desktop': 'org.gnome.Polari.desktop',
'tali.desktop': 'org.gnome.Tali.desktop',
'totem.desktop': 'org.gnome.Totem.desktop',
'evince.desktop': 'org.gnome.Evince.desktop',
};

View File

@ -25,7 +25,7 @@ var BackgroundMenu = class BackgroundMenu extends PopupMenu.PopupMenu {
function addBackgroundMenu(actor, layoutManager) {
actor.reactive = true;
actor._backgroundMenu = new BackgroundMenu(layoutManager);
actor._backgroundManager = new PopupMenu.PopupMenuManager({ actor: actor });
actor._backgroundManager = new PopupMenu.PopupMenuManager(actor);
actor._backgroundManager.addMenu(actor._backgroundMenu);
function openMenu(x, y) {

View File

@ -121,7 +121,8 @@ var BarLevel = class {
cr.lineTo(x, (height - barLevelHeight) / 2);
cr.lineTo(x, (height + barLevelHeight) / 2);
cr.lineTo(barLevelBorderRadius + barLevelBorderWidth, (height + barLevelHeight) / 2);
Clutter.cairo_set_source_color(cr, barLevelActiveColor);
if (this._value > 0)
Clutter.cairo_set_source_color(cr, barLevelActiveColor);
cr.fillPreserve();
Clutter.cairo_set_source_color(cr, barLevelActiveBorderColor);
cr.setLineWidth(barLevelBorderWidth);
@ -143,17 +144,19 @@ var BarLevel = class {
}
/* end progress bar arc */
if (this._value <= this._overdriveStart)
Clutter.cairo_set_source_color(cr, barLevelActiveColor);
else
Clutter.cairo_set_source_color(cr, barLevelOverdriveColor);
cr.arc(endX, height / 2, barLevelBorderRadius, TAU * 3 / 4, TAU * 1 / 4);
cr.lineTo(Math.floor(endX), (height + barLevelHeight) / 2);
cr.lineTo(Math.floor(endX), (height - barLevelHeight) / 2);
cr.lineTo(endX, (height - barLevelHeight) / 2);
cr.fillPreserve();
cr.setLineWidth(barLevelBorderWidth);
cr.stroke();
if (this._value > 0) {
if (this._value <= this._overdriveStart)
Clutter.cairo_set_source_color(cr, barLevelActiveColor);
else
Clutter.cairo_set_source_color(cr, barLevelOverdriveColor);
cr.arc(endX, height / 2, barLevelBorderRadius, TAU * 3 / 4, TAU * 1 / 4);
cr.lineTo(Math.floor(endX), (height + barLevelHeight) / 2);
cr.lineTo(Math.floor(endX), (height - barLevelHeight) / 2);
cr.lineTo(endX, (height - barLevelHeight) / 2);
cr.fillPreserve();
cr.setLineWidth(barLevelBorderWidth);
cr.stroke();
}
/* draw overdrive separator */
if (overdriveActive) {

View File

@ -24,7 +24,7 @@ var POPUP_ANIMATION_TIME = 0.15;
* placed. The arrow position may be controlled via
* setArrowOrigin(). The arrow side might be temporarily flipped
* depending on the box size and source position to keep the box
* totally inside the monitor if possible.
* totally inside the monitor workarea if possible.
*
*/
var BoxPointer = GObject.registerClass({
@ -33,8 +33,6 @@ var BoxPointer = GObject.registerClass({
_init(arrowSide, binProperties) {
super._init();
this.actor = this;
this.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS);
this._arrowSide = arrowSide;
@ -47,10 +45,6 @@ var BoxPointer = GObject.registerClass({
this._border.connect('repaint', this._drawBorder.bind(this));
this.add_actor(this._border);
this.bin.raise(this._border);
this._xOffset = 0;
this._yOffset = 0;
this._xPosition = 0;
this._yPosition = 0;
this._sourceAlignment = 0.5;
this._capturedEventId = 0;
this._muteInput();
@ -118,23 +112,23 @@ var BoxPointer = GObject.registerClass({
if (animate & PopupAnimation.SLIDE) {
switch (this._arrowSide) {
case St.Side.TOP:
this.yOffset = -rise;
this.translation_y = -rise;
break;
case St.Side.BOTTOM:
this.yOffset = rise;
this.translation_y = rise;
break;
case St.Side.LEFT:
this.xOffset = -rise;
this.translation_x = -rise;
break;
case St.Side.RIGHT:
this.xOffset = rise;
this.translation_x = rise;
break;
}
}
Tweener.addTween(this, { opacity: 255,
xOffset: 0,
yOffset: 0,
translation_x: 0,
translation_y: 0,
transition: 'linear',
onComplete: () => {
this._unmuteInput();
@ -148,8 +142,8 @@ var BoxPointer = GObject.registerClass({
if (!this.visible)
return;
let xOffset = 0;
let yOffset = 0;
let translationX = 0;
let translationY = 0;
let themeNode = this.get_theme_node();
let rise = themeNode.get_length('-arrow-rise');
let fade = (animate & PopupAnimation.FADE);
@ -158,16 +152,16 @@ var BoxPointer = GObject.registerClass({
if (animate & PopupAnimation.SLIDE) {
switch (this._arrowSide) {
case St.Side.TOP:
yOffset = rise;
translationY = rise;
break;
case St.Side.BOTTOM:
yOffset = -rise;
translationY = -rise;
break;
case St.Side.LEFT:
xOffset = rise;
translationX = rise;
break;
case St.Side.RIGHT:
xOffset = -rise;
translationX = -rise;
break;
}
}
@ -176,15 +170,15 @@ var BoxPointer = GObject.registerClass({
Tweener.removeTweens(this);
Tweener.addTween(this, { opacity: fade ? 0 : 255,
xOffset: xOffset,
yOffset: yOffset,
translation_x: translationX,
translation_y: translationY,
transition: 'linear',
time: animationTime,
onComplete: () => {
this.hide();
this.opacity = 0;
this.xOffset = 0;
this.yOffset = 0;
this.translation_x = 0;
this.translation_y = 0;
if (onComplete)
onComplete();
}
@ -477,11 +471,15 @@ var BoxPointer = GObject.registerClass({
_reposition() {
let sourceActor = this._sourceActor;
let alignment = this._arrowAlignment;
let monitorIndex = Main.layoutManager.findIndexForActor(sourceActor);
this._sourceAllocation = Shell.util_get_transformed_allocation(sourceActor);
this._workArea = Main.layoutManager.getWorkAreaForMonitor(monitorIndex);
// Position correctly relative to the sourceActor
let sourceNode = sourceActor.get_theme_node();
let sourceContentBox = sourceNode.get_content_box(sourceActor.get_allocation_box());
let sourceAllocation = Shell.util_get_transformed_allocation(sourceActor);
let sourceAllocation = this._sourceAllocation;
let sourceCenterX = sourceAllocation.x1 + sourceContentBox.x1 + (sourceContentBox.x2 - sourceContentBox.x1) * this._sourceAlignment;
let sourceCenterY = sourceAllocation.y1 + sourceContentBox.y1 + (sourceContentBox.y2 - sourceContentBox.y1) * this._sourceAlignment;
let [minWidth, minHeight, natWidth, natHeight] = this.get_preferred_size();
@ -489,7 +487,7 @@ var BoxPointer = GObject.registerClass({
// We also want to keep it onscreen, and separated from the
// edge by the same distance as the main part of the box is
// separated from its sourceActor
let monitor = Main.layoutManager.findMonitorForActor(sourceActor);
let workarea = this._workArea;
let themeNode = this.get_theme_node();
let borderWidth = themeNode.get_length('-arrow-border-width');
let arrowBase = themeNode.get_length('-arrow-base');
@ -539,8 +537,8 @@ var BoxPointer = GObject.registerClass({
case St.Side.BOTTOM:
resX = sourceCenterX - (halfMargin + (natWidth - margin) * alignment);
resX = Math.max(resX, monitor.x + padding);
resX = Math.min(resX, monitor.x + monitor.width - (padding + natWidth));
resX = Math.max(resX, workarea.x + padding);
resX = Math.min(resX, workarea.x + workarea.width - (padding + natWidth));
arrowOrigin = sourceCenterX - resX;
if (arrowOrigin <= (x1 + (borderRadius + halfBase))) {
@ -558,8 +556,8 @@ var BoxPointer = GObject.registerClass({
case St.Side.RIGHT:
resY = sourceCenterY - (halfMargin + (natHeight - margin) * alignment);
resY = Math.max(resY, monitor.y + padding);
resY = Math.min(resY, monitor.y + monitor.height - (padding + natHeight));
resY = Math.max(resY, workarea.y + padding);
resY = Math.min(resY, workarea.y + workarea.height - (padding + natHeight));
arrowOrigin = sourceCenterY - resY;
if (arrowOrigin <= (y1 + (borderRadius + halfBase))) {
@ -583,9 +581,9 @@ var BoxPointer = GObject.registerClass({
parent = parent.get_parent();
}
this._xPosition = Math.floor(x);
this._yPosition = Math.floor(y);
this._shiftActor();
// Actually set the position
this.x = Math.floor(x);
this.y = Math.floor(y);
}
// @origin: Coordinate specifying middle of the arrow, along
@ -608,44 +606,30 @@ var BoxPointer = GObject.registerClass({
}
}
_shiftActor() {
// Since the position of the BoxPointer depends on the allocated size
// of the BoxPointer and the position of the source actor, trying
// to position the BoxPointer via the x/y properties will result in
// allocation loops and warnings. Instead we do the positioning via
// the anchor point, which is independent of allocation, and leave
// x == y == 0.
this.set_anchor_point(-(this._xPosition + this._xOffset),
-(this._yPosition + this._yOffset));
}
_calculateArrowSide(arrowSide) {
let sourceAllocation = Shell.util_get_transformed_allocation(this._sourceActor);
let sourceAllocation = this._sourceAllocation;
let [minWidth, minHeight, boxWidth, boxHeight] = this.get_preferred_size();
let monitorActor = this.sourceActor;
if (!monitorActor)
monitorActor = this;
let monitor = Main.layoutManager.findMonitorForActor(monitorActor);
let workarea = this._workArea;
switch (arrowSide) {
case St.Side.TOP:
if (sourceAllocation.y2 + boxHeight > monitor.y + monitor.height &&
boxHeight < sourceAllocation.y1 - monitor.y)
if (sourceAllocation.y2 + boxHeight > workarea.y + workarea.height &&
boxHeight < sourceAllocation.y1 - workarea.y)
return St.Side.BOTTOM;
break;
case St.Side.BOTTOM:
if (sourceAllocation.y1 - boxHeight < monitor.y &&
boxHeight < monitor.y + monitor.height - sourceAllocation.y2)
if (sourceAllocation.y1 - boxHeight < workarea.y &&
boxHeight < workarea.y + workarea.height - sourceAllocation.y2)
return St.Side.TOP;
break;
case St.Side.LEFT:
if (sourceAllocation.x2 + boxWidth > monitor.x + monitor.width &&
boxWidth < sourceAllocation.x1 - monitor.x)
if (sourceAllocation.x2 + boxWidth > workarea.x + workarea.width &&
boxWidth < sourceAllocation.x1 - workarea.x)
return St.Side.RIGHT;
break;
case St.Side.RIGHT:
if (sourceAllocation.x1 - boxWidth < monitor.x &&
boxWidth < monitor.x + monitor.width - sourceAllocation.x2)
if (sourceAllocation.x1 - boxWidth < workarea.x &&
boxWidth < workarea.x + workarea.width - sourceAllocation.x2)
return St.Side.LEFT;
break;
}
@ -667,24 +651,6 @@ var BoxPointer = GObject.registerClass({
}
}
set xOffset(offset) {
this._xOffset = offset;
this._shiftActor();
}
get xOffset() {
return this._xOffset;
}
set yOffset(offset) {
this._yOffset = offset;
this._shiftActor();
}
get yOffset() {
return this._yOffset;
}
updateArrowSide(side) {
this._arrowSide = side;
this._border.queue_repaint();

View File

@ -5,6 +5,7 @@ const Mainloop = imports.mainloop;
const Params = imports.misc.params;
const GnomeSession = imports.misc.gnomeSession;
const Main = imports.ui.main;
const ShellMountOperation = imports.ui.shellMountOperation;
var GNOME_SESSION_AUTOMOUNT_INHIBIT = 16;
@ -199,12 +200,20 @@ var AutomountManager = class {
// error strings are not unique for the cases in the comments below.
if (e.message.includes('No key available with this passphrase') || // cryptsetup
e.message.includes('No key available to unlock device') || // udisks (no password)
e.message.includes('Error unlocking')) { // udisks (wrong password)
// libblockdev wrong password opening LUKS device
e.message.includes('Failed to activate device: Incorrect passphrase') ||
// cryptsetup returns EINVAL in many cases, including wrong TCRYPT password/parameters
e.message.includes('Failed to load device\'s parameters: Invalid argument')) {
this._reaskPassword(volume);
} else {
if (e.message.includes('Compiled against a version of libcryptsetup that does not support the VeraCrypt PIM setting')) {
Main.notifyError(_("Unable to unlock volume"),
_("The installed udisks version does not support the PIM setting"));
}
if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.FAILED_HANDLED))
log('Unable to mount volume ' + volume.get_name() + ': ' + e.toString());
this._closeOperation(volume);
}
}

View File

@ -23,20 +23,8 @@ var KeyringDialog = class extends ModalDialog.ModalDialog {
this._content = new Dialog.MessageDialogContent({ icon });
this.contentLayout.add(this._content);
// FIXME: Why does this break now?
/*
this.prompt.bind_property('message', this._content, 'title', GObject.BindingFlags.SYNC_CREATE);
this.prompt.bind_property('description', this._content, 'body', GObject.BindingFlags.SYNC_CREATE);
*/
this.prompt.connect('notify::message', () => {
this._content.title = this.prompt.message;
});
this._content.title = this.prompt.message;
this.prompt.connect('notify::description', () => {
this._content.body = this.prompt.description;
});
this._content.body = this.prompt.description;
this._workSpinner = null;
this._controlTable = null;

View File

@ -401,7 +401,7 @@ var ChatSource = class extends MessageTray.Source {
if (this._client.is_handling_channel(this._channel)) {
// We are handling the channel, try to pass it to Empathy or Polari
// (depending on the channel type)
// We don't check if either app is availble - mission control will
// We don't check if either app is available - mission control will
// fallback to something else if activation fails
let target;

View File

@ -584,22 +584,18 @@ var Dash = class Dash {
let firstButton = iconChildren[0].child;
let firstIcon = firstButton._delegate.icon;
let minHeight, natHeight;
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
// Enforce the current icon size during the size request
// Enforce valid spacings during the size request
firstIcon.icon.ensure_style();
let [, currentHeight] = firstIcon.icon.get_size();
firstIcon.icon.set_height(this.iconSize * scaleFactor);
[minHeight, natHeight] = firstButton.get_preferred_height(-1);
firstIcon.icon.set_height(currentHeight);
let [, iconHeight] = firstIcon.icon.get_preferred_height(-1);
let [, buttonHeight] = firstButton.get_preferred_height(-1);
// Subtract icon padding and box spacing from the available height
availHeight -= iconChildren.length * (natHeight - this.iconSize * scaleFactor) +
availHeight -= iconChildren.length * (buttonHeight - iconHeight) +
(iconChildren.length - 1) * spacing;
let availSize = availHeight / iconChildren.length;
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
let iconSizes = baseIconSizes.map(s => s * scaleFactor);
let newIconSize = baseIconSizes[0];
@ -903,7 +899,7 @@ var Dash = class Dash {
favPos++;
}
// No drag placeholder means we don't wan't to favorite the app
// No drag placeholder means we don't want to favorite the app
// and we are dragging it to its original position
if (!this._dragPlaceholder)
return true;

View File

@ -118,7 +118,7 @@ var WorldClocksSection = class WorldClocksSection {
if (!clocks[i].location)
continue;
let l = world.deserialize(clocks[i].location);
if (l)
if (l && l.get_timezone() != null)
this._locations.push({ location: l });
}
@ -136,11 +136,12 @@ var WorldClocksSection = class WorldClocksSection {
layout.attach(header, 0, 0, 2, 1);
this.actor.label_actor = header;
let localOffset = GLib.DateTime.new_now_local().get_utc_offset();
for (let i = 0; i < this._locations.length; i++) {
let l = this._locations[i].location;
let name = l.get_level() == GWeather.LocationLevel.NAMED_TIMEZONE ? l.get_name()
: l.get_city_name();
let name = l.get_city_name() || l.get_name();
let label = new St.Label({ style_class: 'world-clocks-city',
text: name,
x_align: Clutter.ActorAlign.START,
@ -149,7 +150,8 @@ var WorldClocksSection = class WorldClocksSection {
let time = new St.Label({ style_class: 'world-clocks-time' });
let offset = l.get_timezone().get_offset() / 60.;
let otherOffset = this._getTimeAtLocation(l).get_utc_offset();
let offset = (otherOffset - localOffset) / GLib.TIME_SPAN_HOUR;
let fmt = (Math.trunc(offset) == offset) ? '%s%.0f' : '%s%.1f';
let prefix = (offset >= 0) ? '+' : '-';
let tz = new St.Label({ style_class: 'world-clocks-timezone',
@ -182,11 +184,15 @@ var WorldClocksSection = class WorldClocksSection {
}
}
_getTimeAtLocation(location) {
let tz = GLib.TimeZone.new(location.get_timezone().get_tzid());
return GLib.DateTime.new_now(tz);
}
_updateLabels() {
for (let i = 0; i < this._locations.length; i++) {
let l = this._locations[i];
let tz = GLib.TimeZone.new(l.location.get_timezone().get_tzid());
let now = GLib.DateTime.new_now(tz);
let now = this._getTimeAtLocation(l.location);
l.actor.text = Util.formatTime(now, { timeOnly: true });
}
}
@ -470,10 +476,9 @@ class DateMenuButton extends PanelMenu.Button {
box.add_actor(this._clockDisplay);
box.add_actor(this._indicator.actor);
this.actor.label_actor = this._clockDisplay;
this.actor.add_actor(box);
this.actor.add_style_class_name ('clock-display');
this.label_actor = this._clockDisplay;
this.add_actor(box);
this.add_style_class_name ('clock-display');
let layout = new FreezableBinLayout();
let bin = new St.Widget({ layout_manager: layout });

View File

@ -175,10 +175,10 @@ var MessageDialogContent = GObject.registerClass({
this[`_${prop}`].add_style_class_name(`message-dialog-${prop}`);
});
let textProps = { ellipsize_mode: Pango.EllipsizeMode.NONE,
let textProps = { ellipsize: Pango.EllipsizeMode.NONE,
line_wrap: true };
Object.assign(this._subtitle.clutter_text, textProps);
Object.assign(this._body.clutter_text, textProps);
this._subtitle.clutter_text.set(textProps);
this._body.clutter_text.set(textProps);
if (!params.hasOwnProperty('style_class'))
params.style_class = 'message-dialog-main-layout';

View File

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

View File

@ -96,6 +96,15 @@ function init() {
Clutter.Actor.prototype.toString = function() {
return St.describe_actor(this);
};
// Deprecation warning for former JS classes turned into an actor subclass
Object.defineProperty(Clutter.Actor.prototype, 'actor', {
get() {
let klass = this.constructor.name;
let { stack } = new Error();
log(`Usage of object.actor is deprecated for ${klass}\n${stack}`);
return this;
}
});
let origToString = Object.prototype.toString;
Object.prototype.toString = function() {

View File

@ -272,7 +272,7 @@ var CandidatePopup = class CandidatePopup {
_setDummyCursorGeometry(x, y, w, h) {
Main.layoutManager.setDummyCursorGeometry(x, y, w, h);
if (this._boxPointer.actor.visible)
if (this._boxPointer.visible)
this._boxPointer.setPosition(Main.layoutManager.dummyCursor, 0);
}
@ -285,7 +285,7 @@ var CandidatePopup = class CandidatePopup {
if (isVisible) {
this._boxPointer.setPosition(Main.layoutManager.dummyCursor, 0);
this._boxPointer.open(BoxPointer.PopupAnimation.NONE);
this._boxPointer.actor.raise_top();
this._boxPointer.raise_top();
} else {
this._boxPointer.close(BoxPointer.PopupAnimation.NONE);
}

View File

@ -43,8 +43,6 @@ class BaseIcon extends St.Bin {
x_fill: true,
y_fill: true });
this.actor = this;
this.connect('destroy', this._onDestroy.bind(this));
this._box = new St.BoxLayout({ vertical: true });
@ -81,7 +79,7 @@ class BaseIcon extends St.Bin {
// This can be overridden by a subclass, or by the createIcon
// parameter to _init()
createIcon(size) {
throw new Error('no implementation of createIcon in ' + this);
throw new GObject.NotImplementedError(`createIcon in ${this.constructor.name}`);
}
setIconSize(size) {
@ -104,6 +102,7 @@ class BaseIcon extends St.Bin {
}
vfunc_style_changed() {
super.vfunc_style_changed();
let node = this.get_theme_node();
let size;
@ -187,8 +186,6 @@ var IconGrid = GObject.registerClass({
super._init({ style_class: 'icon-grid',
y_align: Clutter.ActorAlign.START });
this.actor = this;
params = Params.parse(params, { rowLimit: null,
columnLimit: null,
minRows: 1,
@ -419,7 +416,8 @@ var IconGrid = GObject.registerClass({
animatePulse(animationDirection) {
if (animationDirection != AnimationDirection.IN)
throw new Error("Pulse animation only implements 'in' animation direction");
throw new GObject.NotImplementedError("Pulse animation only implements " +
"'in' animation direction");
this._cancelAnimation();
@ -843,7 +841,7 @@ var PaginatedIconGrid = GObject.registerClass({
}
}
// Overriden from IconGrid
// Overridden from IconGrid
_getChildrenToAnimate() {
let children = this._getVisibleChildren();
let firstIndex = this._childrenPerPage * this.currentPage;

View File

@ -282,11 +282,11 @@ var Key = class Key {
y_fill: true,
x_align: St.Align.START });
this._boxPointer.hide();
Main.layoutManager.addChrome(this._boxPointer.actor);
Main.layoutManager.addChrome(this._boxPointer);
this._boxPointer.setPosition(this.keyButton, 0.5);
// Adds style to existing keyboard style to avoid repetition
this._boxPointer.actor.add_style_class_name('keyboard-subkeys');
this._boxPointer.add_style_class_name('keyboard-subkeys');
this._getExtendedKeys();
this.keyButton._extended_keys = this._extended_keyboard;
}
@ -1049,7 +1049,7 @@ var Keyboard = class Keyboard {
this._a11yApplicationsSettings.connect('changed', this._syncEnabled.bind(this));
this._lastDeviceId = null;
this._suggestions = null;
this._emojiKeyVisible = true;
this._emojiKeyVisible = Meta.is_wayland_compositor();
this._focusTracker = new FocusTracker();
this._focusTracker.connect('position-changed', this._onFocusPositionChanged.bind(this));
@ -1144,6 +1144,7 @@ var Keyboard = class Keyboard {
this._keyboardController.disconnect(this._keypadVisibleId);
if (this._focusNotifyId)
global.stage.disconnect(this._focusNotifyId);
this._clearShowIdle();
this._keyboard = null;
this.actor.destroy();
this.actor = null;
@ -1162,7 +1163,7 @@ var Keyboard = class Keyboard {
this._keyboardController = new KeyboardController();
this._groups = {};
this._current_page = null;
this._currentPage = null;
this._suggestions = new Suggestions();
this.actor.add(this._suggestions.actor,
@ -1202,10 +1203,12 @@ var Keyboard = class Keyboard {
this._keyboardNotifyId = this._keyboardController.connect('active-group', this._onGroupChanged.bind(this));
this._keyboardGroupsChangedId = this._keyboardController.connect('groups-changed', this._onKeyboardGroupsChanged.bind(this));
this._keyboardStateId = this._keyboardController.connect('panel-state', this._onKeyboardStateChanged.bind(this));
this._emojiKeyVisibleId = this._keyboardController.connect('emoji-visible', this._onEmojiKeyVisible.bind(this));
this._keypadVisibleId = this._keyboardController.connect('keypad-visible', this._onKeypadVisible.bind(this));
this._focusNotifyId = global.stage.connect('notify::key-focus', this._onKeyFocusChanged.bind(this));
if (Meta.is_wayland_compositor())
this._emojiKeyVisibleId = this._keyboardController.connect('emoji-visible', this._onEmojiKeyVisible.bind(this));
this._relayout();
}
@ -1227,6 +1230,7 @@ var Keyboard = class Keyboard {
if (!this._showIdleId) {
this._showIdleId = GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => {
this.show(Main.layoutManager.focusIndex);
this._showIdleId = 0;
return GLib.SOURCE_REMOVE;
});
GLib.Source.set_name_by_id(this._showIdleId, '[gnome-shell] this.show');
@ -1353,7 +1357,7 @@ var Keyboard = class Keyboard {
} else if (switchToLevel == 1) {
extraButton.connect('long-press', () => {
this._latched = true;
this._setCurrentLevelLatched(this._current_page, this._latched);
this._setCurrentLevelLatched(this._currentPage, this._latched);
});
}
@ -1380,8 +1384,8 @@ var Keyboard = class Keyboard {
}
_updateCurrentPageVisible() {
if (this._current_page)
this._current_page.visible = !this._emojiActive && !this._keypadVisible;
if (this._currentPage)
this._currentPage.visible = !this._emojiActive && !this._keypadVisible;
}
_setEmojiActive(active) {
@ -1440,7 +1444,7 @@ var Keyboard = class Keyboard {
_getGridSlots() {
let numOfHorizSlots = 0, numOfVertSlots;
let rows = this._current_page.get_children();
let rows = this._currentPage.get_children();
numOfVertSlots = rows.length;
for (let i = 0; i < rows.length; ++i) {
@ -1470,7 +1474,12 @@ var Keyboard = class Keyboard {
}
_onKeyboardGroupsChanged(keyboard) {
this._groups = [];
let nonGroupActors = [this._emojiSelection.actor, this._keypad.actor];
this._aspectContainer.get_children().filter(c => !nonGroupActors.includes(c)).forEach(c => {
c.destroy();
});
this._groups = {};
this._onGroupChanged();
}
@ -1512,13 +1521,24 @@ var Keyboard = class Keyboard {
_setActiveLayer(activeLevel) {
let activeGroupName = this._keyboardController.getCurrentGroup();
let layers = this._groups[activeGroupName];
let currentPage = layers[activeLevel];
if (this._current_page != null) {
this._setCurrentLevelLatched(this._current_page, false);
this._current_page.hide();
if (this._currentPage == currentPage) {
this._updateCurrentPageVisible();
return;
}
this._current_page = layers[activeLevel];
if (this._currentPage != null) {
this._setCurrentLevelLatched(this._currentPage, false);
this._currentPage.disconnect(this._currentPage._destroyID);
this._currentPage.hide();
delete this._currentPage._destroyID;
}
this._currentPage = currentPage;
this._currentPage._destroyID = this._currentPage.connect('destroy', () => {
this._currentPage = null;
});
this._updateCurrentPageVisible();
}
@ -1606,18 +1626,6 @@ var Keyboard = class Keyboard {
this.setCursorLocation(null);
}
_hideSubkeys() {
if (this._subkeysBoxPointer) {
this._subkeysBoxPointer.hide(BoxPointer.PopupAnimation.FULL);
this._subkeysBoxPointer = null;
}
if (this._capturedEventId) {
this.actor.disconnect(this._capturedEventId);
this._capturedEventId = 0;
}
this._capturedPress = false;
}
resetSuggestions() {
if (this._suggestions)
this._suggestions.clear();

View File

@ -160,6 +160,19 @@ var Monitor = class Monitor {
}
};
const UiActor = GObject.registerClass(
class UiActor extends St.Widget {
vfunc_get_preferred_width (forHeight) {
let width = global.stage.width;
return [width, width];
}
vfunc_get_preferred_height (forWidth) {
let height = global.stage.height;
return [height, height];
}
});
const defaultParams = {
trackFullscreen: false,
affectsStruts: false,
@ -200,17 +213,20 @@ var LayoutManager = GObject.registerClass({
global.stage.no_clear_hint = true;
// Set up stage hierarchy to group all UI actors under one container.
this.uiGroup = new St.Widget({ name: 'uiGroup' });
this.uiGroup = new UiActor({ name: 'uiGroup' });
this.uiGroup.set_flags(Clutter.ActorFlags.NO_LAYOUT);
this.uiGroup.add_constraint(new Clutter.BindConstraint({
source: global.stage,
coordinate: Clutter.BindCoordinate.ALL,
}));
global.stage.add_child(this.uiGroup);
global.stage.remove_actor(global.window_group);
this.uiGroup.add_actor(global.window_group);
global.stage.add_child(this.uiGroup);
// Using addChrome() to add actors to uiGroup will position actors
// underneath the top_window_group.
// To insert actors at the top of uiGroup, we use addTopChrome() or
// add the actor directly using uiGroup.add_actor().
global.stage.remove_actor(global.top_window_group);
this.uiGroup.add_actor(global.top_window_group);
this.overviewGroup = new St.Widget({ name: 'overviewGroup',
visible: false,
@ -222,7 +238,7 @@ var LayoutManager = GObject.registerClass({
clip_to_allocation: true,
layout_manager: new Clutter.BinLayout(),
});
this.addChrome(this.screenShieldGroup);
this.addTopChrome(this.screenShieldGroup);
this.panelBox = new St.BoxLayout({ name: 'panelBox',
vertical: true });
@ -238,17 +254,14 @@ var LayoutManager = GObject.registerClass({
this.keyboardBox = new St.BoxLayout({ name: 'keyboardBox',
reactive: true,
track_hover: true });
this.addChrome(this.keyboardBox);
this.addTopChrome(this.keyboardBox);
this._keyboardHeightNotifyId = 0;
// A dummy actor that tracks the mouse or text cursor, based on the
// position and size set in setDummyCursorGeometry.
this.dummyCursor = new St.Widget({ width: 0, height: 0, visible: false });
this.dummyCursor = new St.Widget({ width: 0, height: 0, opacity: 0 });
this.uiGroup.add_actor(this.dummyCursor);
global.stage.remove_actor(global.top_window_group);
this.uiGroup.add_actor(global.top_window_group);
let feedbackGroup = Meta.get_feedback_group_for_display(global.display);
global.stage.remove_actor(feedbackGroup);
this.uiGroup.add_actor(feedbackGroup);
@ -793,6 +806,16 @@ var LayoutManager = GObject.registerClass({
this._trackActor(actor, params);
}
// addTopChrome:
// @actor: an actor to add to the chrome
// @params: (optional) additional params
//
// Like addChrome(), but adds @actor above all windows, including popups.
addTopChrome(actor, params) {
this.uiGroup.add_actor(actor);
this._trackActor(actor, params);
}
// trackChrome:
// @actor: a descendant of the chrome to begin tracking
// @params: parameters describing how to track @actor

View File

@ -1,6 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const { Atspi, Clutter, Cogl, GDesktopEnums,
const { Atspi, Clutter, GDesktopEnums,
Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
const Mainloop = imports.mainloop;
const Signals = imports.signals;
@ -18,9 +18,6 @@ var NO_CHANGE = 0.0;
var POINTER_REST_TIME = 1000; // milliseconds
// Settings
const APPLICATIONS_SCHEMA = 'org.gnome.desktop.a11y.applications';
const SHOW_KEY = 'screen-magnifier-enabled';
const MAGNIFIER_SCHEMA = 'org.gnome.desktop.a11y.magnifier';
const SCREEN_POSITION_KEY = 'screen-position';
const MAG_FACTOR_KEY = 'mag-factor';
@ -56,22 +53,19 @@ var MouseSpriteContent = GObject.registerClass({
vfunc_get_preferred_size() {
if (!this._texture)
return [0, 0];
return [false, 0, 0];
return [this._texture.get_width(), this._texture.get_height()];
return [true, this._texture.get_width(), this._texture.get_height()];
}
vfunc_paint_content(actor, node) {
if (!this._texture)
return;
let color = new Cogl.Color();
color.init_from_4ub(0, 0, 0, 0);
let color = Clutter.Color.get_static(Clutter.StaticColor.WHITE);
let [minFilter, magFilter] = actor.get_content_scaling_filters();
let textureNode = new Clutter.TextureNode(this._texture,
color,
Clutter.ScalingFilter.NEAREST,
Clutter.ScalingFilter.NEAREST);
color, minFilter, magFilter);
textureNode.set_name('MouseSpriteContent');
node.add_child(textureNode);
@ -86,8 +80,14 @@ var MouseSpriteContent = GObject.registerClass({
if (this._texture == coglTexture)
return;
let oldTexture = this._texture;
this._texture = coglTexture;
this.invalidate();
if (!oldTexture || !coglTexture ||
oldTexture.get_width() != coglTexture.get_width() ||
oldTexture.get_height() != coglTexture.get_height())
this.invalidate_size();
}
});
@ -102,7 +102,6 @@ var Magnifier = class Magnifier {
this._mouseSprite = new Clutter.Actor({ request_mode: Clutter.RequestMode.CONTENT_SIZE });
this._mouseSprite.content = new MouseSpriteContent();
this._updateSpriteTexture();
this._cursorRoot = new Clutter.Actor();
this._cursorRoot.add_actor(this._mouseSprite);
@ -115,14 +114,16 @@ var Magnifier = class Magnifier {
let aZoomRegion = new ZoomRegion(this, this._cursorRoot);
this._zoomRegions.push(aZoomRegion);
let showAtLaunch = this._settingsInit(aZoomRegion);
this._settingsInit(aZoomRegion);
aZoomRegion.scrollContentsTo(this.xMouse, this.yMouse);
cursorTracker.connect('cursor-changed', this._updateMouseSprite.bind(this));
St.Settings.get().connect('notify::magnifier-active', () => {
this.setActive(St.Settings.get().magnifier_active);
});
// Export to dbus.
magDBusService = new MagnifierDBus.ShellMagnifier();
this.setActive(showAtLaunch);
this.setActive(St.Settings.get().magnifier_active);
}
/**
@ -155,9 +156,15 @@ var Magnifier = class Magnifier {
if (isActive != activate) {
if (activate) {
this._updateMouseSprite();
this._cursorSpriteChangedId =
this._cursorTracker.connect('cursor-changed',
this._updateMouseSprite.bind(this));
Meta.disable_unredirect_for_display(global.display);
this.startTrackingMouse();
} else {
this._cursorTracker.disconnect(this._cursorSpriteChangedId);
this._mouseSprite.content.texture = null;
Meta.enable_unredirect_for_display(global.display);
this.stopTrackingMouse();
}
@ -495,13 +502,8 @@ var Magnifier = class Magnifier {
}
_settingsInit(zoomRegion) {
this._appSettings = new Gio.Settings({ schema_id: APPLICATIONS_SCHEMA });
this._settings = new Gio.Settings({ schema_id: MAGNIFIER_SCHEMA });
this._appSettings.connect('changed::' + SHOW_KEY, () => {
this.setActive(this._appSettings.get_boolean(SHOW_KEY));
});
this._settings.connect('changed::' + SCREEN_POSITION_KEY,
this._updateScreenPosition.bind(this));
this._settings.connect('changed::' + MAG_FACTOR_KEY,
@ -608,8 +610,6 @@ var Magnifier = class Magnifier {
let showCrosshairs = this._settings.get_boolean(SHOW_CROSS_HAIRS_KEY);
this.addCrosshairs();
this.setCrosshairsVisible(showCrosshairs);
return this._appSettings.get_boolean(SHOW_KEY);
}
_updateScreenPosition() {
@ -756,13 +756,41 @@ var ZoomRegion = class ZoomRegion {
this._pointerIdleMonitor = Meta.IdleMonitor.get_for_device(Meta.VIRTUAL_CORE_POINTER_ID);
this._scrollContentsTimerId = 0;
}
Main.layoutManager.connect('monitors-changed',
this._monitorsChanged.bind(this));
this._focusCaretTracker.connect('caret-moved',
this._updateCaret.bind(this));
this._focusCaretTracker.connect('focus-changed',
this._updateFocus.bind(this));
_connectSignals() {
if (this._signalConnections)
return;
this._signalConnections = [];
let id = Main.layoutManager.connect('monitors-changed',
this._monitorsChanged.bind(this));
this._signalConnections.push([Main.layoutManager, id]);
id = this._focusCaretTracker.connect('caret-moved', this._updateCaret.bind(this));
this._signalConnections.push([this._focusCaretTracker, id]);
id = this._focusCaretTracker.connect('focus-changed', this._updateFocus.bind(this));
this._signalConnections.push([this._focusCaretTracker, id]);
}
_disconnectSignals() {
for (let [obj, id] of this._signalConnections)
obj.disconnect(id);
delete this._signalConnections;
}
_updateScreenPosition() {
if (this._screenPosition == GDesktopEnums.MagnifierScreenPosition.NONE)
this._setViewPort({
x: this._viewPortX,
y: this._viewPortY,
width: this._viewPortWidth,
height: this._viewPortHeight
});
else
this.setScreenPosition(this._screenPosition);
}
_updateFocus(caller, event) {
@ -810,10 +838,13 @@ var ZoomRegion = class ZoomRegion {
this._createActors();
if (this._isMouseOverRegion())
this._magnifier.hideSystemCursor();
this._updateScreenPosition();
this._updateMagViewGeometry();
this._updateCloneGeometry();
this._updateMousePosition();
this._connectSignals();
} else {
this._disconnectSignals();
this._destroyActors();
}
@ -1241,7 +1272,7 @@ var ZoomRegion = class ZoomRegion {
/**
* getContrast:
* Retreive the contrast of the magnified view.
* Retrieve the contrast of the magnified view.
* @return Object containing the contrast for the red, green,
* and blue channels.
*/
@ -1563,18 +1594,8 @@ var ZoomRegion = class ZoomRegion {
}
_monitorsChanged() {
if (!this.isActive())
return;
this._background.set_size(global.screen_width, global.screen_height);
if (this._screenPosition == GDesktopEnums.MagnifierScreenPosition.NONE)
this._setViewPort({ x: this._viewPortX,
y: this._viewPortY,
width: this._viewPortWidth,
height: this._viewPortHeight });
else
this.setScreenPosition(this._screenPosition);
this._updateScreenPosition();
}
};

View File

@ -211,13 +211,6 @@ function _initializeUI() {
_startDate = new Date();
let perfModuleName = GLib.getenv("SHELL_PERF_MODULE");
if (perfModuleName) {
let perfOutput = GLib.getenv("SHELL_PERF_OUTPUT");
let module = eval('imports.perf.' + perfModuleName + ';');
Scripting.runPerfScript(module, perfOutput);
}
ExtensionDownloader.init();
ExtensionSystem.init();
@ -239,6 +232,13 @@ function _initializeUI() {
Shell.Global.log_structured('GNOME Shell started at ' + _startDate,
['MESSAGE_ID=' + GNOMESHELL_STARTED_MESSAGE_ID]);
}
let perfModuleName = GLib.getenv("SHELL_PERF_MODULE");
if (perfModuleName) {
let perfOutput = GLib.getenv("SHELL_PERF_OUTPUT");
let module = eval('imports.perf.' + perfModuleName + ';');
Scripting.runPerfScript(module, perfOutput);
}
});
}
@ -636,7 +636,7 @@ function _queueBeforeRedraw(workId) {
* initialization as well, under the assumption that new actors
* will need it.
*
* Returns: A string work identifer
* Returns: A string work identifier
*/
function initializeDeferredWork(actor, callback, props) {
// Turn into a string so we can use as an object property

View File

@ -584,7 +584,6 @@ class SourceActor extends St.Widget {
this._source = source;
this._size = size;
this.actor = this;
this.connect('destroy', () => {
this._source.disconnect(this._iconUpdatedId);
this._actorDestroyed = true;

View File

@ -224,10 +224,10 @@ var ModalDialog = class {
// can be dismissed by a close call.
//
// The main point of this method is to give some indication to the user
// that the dialog reponse has been acknowledged but will take a few
// that the dialog response has been acknowledged but will take a few
// moments before being processed.
// e.g., if a user clicked "Log Out" then the dialog should go away
// imediately, but the lightbox should remain until the logout is
// immediately, but the lightbox should remain until the logout is
// complete.
_fadeOutDialog(timestamp) {
if (this.state == State.CLOSED || this.state == State.CLOSING)

View File

@ -95,28 +95,6 @@ var OsdMonitorLabeler = class {
this._reset();
for (let id in params) {
let monitor = this._monitorManager.get_monitor_for_output(id);
if (monitor == -1)
continue;
this._monitorLabels.get(monitor).push(params[id].deep_unpack());
}
// In mirrored display setups, more than one physical outputs
// might be showing the same logical monitor. In that case, we
// join each output's labels on the same OSD widget.
for (let [monitor, labels] of this._monitorLabels.entries()) {
labels.sort();
this._osdLabels.push(new OsdMonitorLabel(monitor, labels.join(' ')));
}
}
show2(client, params) {
if (!this._trackClient(client))
return;
this._reset();
for (let connector in params) {
let monitor = this._monitorManager.get_monitor_for_connector(connector);
if (monitor == -1)

View File

@ -122,7 +122,7 @@ var SlidingControl = class {
}
_getSlide() {
throw new Error('getSlide() must be overridden');
throw new GObject.NotImplementedError(`_getSlide in ${this.constructor.name}`);
}
_updateSlide() {
@ -369,17 +369,15 @@ class DashSpacer extends St.Widget {
}
vfunc_get_preferred_width(forHeight) {
let box = this.get_allocation_box();
let minWidth = super.vfunc_get_preferred_width(forHeight)[0];
let natWidth = box.x2 - box.x1;
return [minWidth, natWidth];
if (this._bindConstraint)
return this._bindConstraint.source.get_preferred_width(forHeight);
return super.vfunc_get_preferred_width(forHeight);
}
vfunc_get_preferred_height(forWidth) {
let box = this.get_allocation_box();
let minHeight = super.vfunc_get_preferred_height(forWidth)[0];
let natHeight = box.y2 - box.y1;
return [minHeight, natHeight];
if (this._bindConstraint)
return this._bindConstraint.source.get_preferred_height(forWidth);
return super.vfunc_get_preferred_height(forWidth);
}
});

View File

@ -374,12 +374,12 @@ var PadDiagram = GObject.registerClass({
svgData += this._cssString();
svgData += this._wrappingSvgFooter();
let handle = new Rsvg.Handle();
handle.set_base_uri(GLib.path_get_dirname(this._imagePath));
handle.write(svgData);
handle.close();
let istream = new Gio.MemoryInputStream();
istream.add_bytes(new GLib.Bytes(svgData));
return handle;
return Rsvg.Handle.new_from_stream_sync(istream,
Gio.File.new_for_path(this._imagePath),
0, null);
}
_updateDiagramScale() {

View File

@ -1,6 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const { Atk, Clutter, Gio, GLib, GObject, Gtk, Meta, Shell, St } = imports.gi;
const { Atk, Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
const Cairo = imports.cairo;
const Mainloop = imports.mainloop;
@ -75,6 +75,9 @@ class AppMenu extends PopupMenu.PopupMenu {
this._windowsChangedId = 0;
/* Translators: This is the heading of a list of open windows */
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem(_("Open Windows")));
this._windowSection = new PopupMenu.PopupMenuSection();
this.addMenuItem(this._windowSection);
@ -105,6 +108,8 @@ class AppMenu extends PopupMenu.PopupMenu {
});
});
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this.addAction(_("Quit"), () => {
this._app.request_quit();
});
@ -117,7 +122,7 @@ class AppMenu extends PopupMenu.PopupMenu {
_updateDetailsVisibility() {
let sw = this._appSystem.lookup_app('org.gnome.Software.desktop');
this._detailsItem.actor.visible = (sw != null);
this._detailsItem.visible = (sw != null);
}
isEmpty() {
@ -155,7 +160,7 @@ class AppMenu extends PopupMenu.PopupMenu {
});
});
this._newWindowItem.actor.visible =
this._newWindowItem.visible =
app && app.can_open_new_window() && !actions.includes('new-window');
}
@ -172,13 +177,6 @@ class AppMenu extends PopupMenu.PopupMenu {
Main.activateWindow(window, event.get_time());
});
});
// Add separator between windows of the current desktop and other windows.
let workspaceManager = global.workspace_manager;
let activeWorkspace = workspaceManager.get_active_workspace();
let pos = windows.findIndex(w => w.get_workspace() != activeWorkspace);
if (pos >= 0)
this._windowSection.addMenuItem(new PopupMenu.PopupSeparatorMenuItem(), pos);
}
}
@ -196,21 +194,20 @@ var AppMenuButton = GObject.registerClass({
_init(panel) {
super._init(0.0, null, true);
this.actor.accessible_role = Atk.Role.MENU;
this.accessible_role = Atk.Role.MENU;
this._startingApps = [];
this._menuManager = panel.menuManager;
this._gtkSettings = Gtk.Settings.get_default();
this._targetApp = null;
this._busyNotifyId = 0;
let bin = new St.Bin({ name: 'appMenu' });
bin.connect('style-changed', this._onStyleChanged.bind(this));
this.actor.add_actor(bin);
this.add_actor(bin);
this.actor.bind_property("reactive", this.actor, "can-focus", 0);
this.actor.reactive = false;
this.bind_property("reactive", this, "can-focus", 0);
this.reactive = false;
this._container = new St.BoxLayout({ style_class: 'panel-status-menu-box' });
bin.set_child(this._container);
@ -266,10 +263,10 @@ var AppMenuButton = GObject.registerClass({
return;
this._visible = true;
this.actor.reactive = true;
this.reactive = true;
this.show();
Tweener.removeTweens(this.actor);
Tweener.addTween(this.actor,
Tweener.removeTweens(this);
Tweener.addTween(this,
{ opacity: 255,
time: Overview.ANIMATION_TIME,
transition: 'easeOutQuad' });
@ -280,9 +277,9 @@ var AppMenuButton = GObject.registerClass({
return;
this._visible = false;
this.actor.reactive = false;
Tweener.removeTweens(this.actor);
Tweener.addTween(this.actor,
this.reactive = false;
Tweener.removeTweens(this);
Tweener.addTween(this,
{ opacity: 0,
time: Overview.ANIMATION_TIME,
transition: 'easeOutQuad',
@ -405,7 +402,7 @@ var AppMenuButton = GObject.registerClass({
if (this._targetApp) {
this._busyNotifyId = this._targetApp.connect('notify::busy', this._sync.bind(this));
this._label.set_text(this._targetApp.get_name());
this.actor.set_accessible_name(this._targetApp.get_name());
this.set_accessible_name(this._targetApp.get_name());
}
}
@ -423,7 +420,7 @@ var AppMenuButton = GObject.registerClass({
else
this.stopAnimation();
this.actor.reactive = (visible && !isBusy);
this.reactive = (visible && !isBusy);
this._syncIcon();
this.menu.setApp(this._targetApp);
@ -462,28 +459,28 @@ var ActivitiesButton = GObject.registerClass(
class ActivitiesButton extends PanelMenu.Button {
_init() {
super._init(0.0, null, true);
this.actor.accessible_role = Atk.Role.TOGGLE_BUTTON;
this.accessible_role = Atk.Role.TOGGLE_BUTTON;
this.actor.name = 'panelActivities';
this.name = 'panelActivities';
/* Translators: If there is no suitable word for "Activities"
in your language, you can use the word for "Overview". */
this._label = new St.Label({ text: _("Activities"),
y_align: Clutter.ActorAlign.CENTER });
this.actor.add_actor(this._label);
this.add_actor(this._label);
this.actor.label_actor = this._label;
this.label_actor = this._label;
this.actor.connect('captured-event', this._onCapturedEvent.bind(this));
this.actor.connect_after('key-release-event', this._onKeyRelease.bind(this));
this.connect('captured-event', this._onCapturedEvent.bind(this));
this.connect_after('key-release-event', this._onKeyRelease.bind(this));
Main.overview.connect('showing', () => {
this.actor.add_style_pseudo_class('overview');
this.actor.add_accessible_state (Atk.StateType.CHECKED);
this.add_style_pseudo_class('overview');
this.add_accessible_state (Atk.StateType.CHECKED);
});
Main.overview.connect('hiding', () => {
this.actor.remove_style_pseudo_class('overview');
this.actor.remove_accessible_state (Atk.StateType.CHECKED);
this.remove_style_pseudo_class('overview');
this.remove_accessible_state (Atk.StateType.CHECKED);
});
this._xdndTimeOut = 0;
@ -536,7 +533,7 @@ class ActivitiesButton extends PanelMenu.Button {
let [x, y, mask] = global.get_pointer();
let pickedActor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, x, y);
if (pickedActor == this.actor && Main.overview.shouldToggleByCornerOrButton())
if (pickedActor == this && Main.overview.shouldToggleByCornerOrButton())
Main.overview.toggle();
Mainloop.source_remove(this._xdndTimeOut);
@ -750,7 +747,7 @@ class AggregateMenu extends PanelMenu.Button {
this.menu.box.set_layout_manager(menuLayout);
this._indicators = new St.BoxLayout({ style_class: 'panel-status-indicators-box' });
this.actor.add_child(this._indicators);
this.add_child(this._indicators);
if (Config.HAVE_NETWORKMANAGER) {
this._network = new imports.ui.status.network.NMApplet();
@ -809,6 +806,7 @@ class AggregateMenu extends PanelMenu.Button {
menuLayout.addSizeChild(this._location.menu.actor);
menuLayout.addSizeChild(this._rfkill.menu.actor);
menuLayout.addSizeChild(this._power.menu.actor);
menuLayout.addSizeChild(this._system.buttonGroup);
}
});
@ -827,9 +825,6 @@ class Panel extends St.Widget {
super._init({ name: 'panel',
reactive: true });
// For compatibility with extensions that still use the
// this.actor field
this.actor = this;
this.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS);
this._sessionStyle = null;
@ -882,7 +877,7 @@ class Panel extends St.Widget {
}
vfunc_allocate(box, flags) {
super.vfunc_allocate(box, flags);
this.set_allocation(box, flags);
let allocWidth = box.x2 - box.x1;
let allocHeight = box.y2 - box.y1;
@ -976,22 +971,11 @@ class Panel extends St.Widget {
if (isPress && button != 1)
return Clutter.EVENT_PROPAGATE;
let focusWindow = global.display.focus_window;
if (!focusWindow)
return Clutter.EVENT_PROPAGATE;
let dragWindow = focusWindow.is_attached_dialog() ? focusWindow.get_transient_for()
: focusWindow;
if (!dragWindow)
return Clutter.EVENT_PROPAGATE;
let rect = dragWindow.get_frame_rect();
let [stageX, stageY] = event.get_coords();
let allowDrag = dragWindow.maximized_vertically &&
stageX > rect.x && stageX < rect.x + rect.width;
let dragWindow = this._getDraggableWindowForPosition(stageX);
if (!allowDrag)
if (!dragWindow)
return Clutter.EVENT_PROPAGATE;
global.display.begin_grab_op(dragWindow,
@ -1021,7 +1005,7 @@ class Panel extends St.Widget {
return; // menu not supported by current session mode
let menu = indicator.menu;
if (!indicator.actor.reactive)
if (!indicator.reactive)
return;
menu.toggle();
@ -1043,7 +1027,7 @@ class Panel extends St.Widget {
return;
let menu = indicator.menu;
if (!indicator.actor.reactive)
if (!indicator.reactive)
return;
menu.close();
@ -1201,4 +1185,21 @@ class Panel extends St.Widget {
Main.messageTray.bannerBlocked = isOpen;
});
}
_getDraggableWindowForPosition(stageX) {
let workspaceManager = global.workspace_manager;
let workspace = workspaceManager.get_active_workspace()
let allWindowsByStacking = global.display.sort_windows_by_stacking(
workspace.list_windows()
).reverse();
return allWindowsByStacking.find(metaWindow => {
let rect = metaWindow.get_frame_rect();
return metaWindow.is_on_primary_monitor() &&
metaWindow.showing_on_its_workspace() &&
metaWindow.get_window_type() != Meta.WindowType.DESKTOP &&
metaWindow.maximized_vertically &&
stageX > rect.x && stageX < rect.x + rect.width
});
}
});

View File

@ -14,12 +14,11 @@ class ButtonBox extends St.Widget {
super._init(params);
this.actor = this;
this._delegate = this;
this.container = new St.Bin({ y_fill: true,
x_fill: true,
child: this.actor });
child: this });
this.connect('style-changed', this._onStyleChanged.bind(this));
this.connect('destroy', this._onDestroy.bind(this));
@ -105,9 +104,9 @@ var Button = GObject.registerClass({
this.connect('notify::visible', this._onVisibilityChanged.bind(this));
if (dontCreateMenu)
this.menu = new PopupMenu.PopupDummyMenu(this.actor);
this.menu = new PopupMenu.PopupDummyMenu(this);
else
this.setMenu(new PopupMenu.PopupMenu(this.actor, menuAlignment, St.Side.TOP, 0));
this.setMenu(new PopupMenu.PopupMenu(this, menuAlignment, St.Side.TOP, 0));
}
setSensitive(sensitive) {
@ -145,7 +144,7 @@ var Button = GObject.registerClass({
if (!this.menu)
return;
if (!this.actor.visible)
if (!this.visible)
this.menu.close();
}
@ -155,10 +154,10 @@ var Button = GObject.registerClass({
let symbol = event.get_key_symbol();
if (symbol == Clutter.KEY_Left || symbol == Clutter.KEY_Right) {
let group = global.focus_manager.get_group(this.actor);
let group = global.focus_manager.get_group(this);
if (group) {
let direction = (symbol == Clutter.KEY_Left) ? St.DirectionType.LEFT : St.DirectionType.RIGHT;
group.navigate_focus(this.actor, direction, false);
group.navigate_focus(this, direction, false);
return Clutter.EVENT_STOP;
}
}
@ -167,9 +166,9 @@ var Button = GObject.registerClass({
_onOpenStateChanged(menu, open) {
if (open)
this.actor.add_style_pseudo_class('active');
this.add_style_pseudo_class('active');
else
this.actor.remove_style_pseudo_class('active');
this.remove_style_pseudo_class('active');
// Setting the max-height won't do any good if the minimum height of the
// menu is higher then the screen; it's useful if part of the menu is

View File

@ -51,49 +51,64 @@ function arrowIcon(side) {
return arrow;
}
var PopupBaseMenuItem = class {
constructor(params) {
var PopupBaseMenuItem = GObject.registerClass({
Properties: {
'active': GObject.ParamSpec.boolean('active', 'active', 'active',
GObject.ParamFlags.READWRITE,
GObject.TYPE_BOOLEAN,
false),
'sensitive': GObject.ParamSpec.boolean('sensitive', 'sensitive', 'sensitive',
GObject.ParamFlags.READWRITE,
GObject.TYPE_BOOLEAN,
true),
},
Signals: {
'activate': { param_types: [Clutter.Event.$gtype] },
}
}, class PopupBaseMenuItem extends St.BoxLayout {
_init(params) {
params = Params.parse (params, { reactive: true,
activate: true,
hover: true,
style_class: null,
can_focus: true
});
this.actor = new St.BoxLayout({ style_class: 'popup-menu-item',
reactive: params.reactive,
track_hover: params.reactive,
can_focus: params.can_focus,
accessible_role: Atk.Role.MENU_ITEM });
this.actor._delegate = this;
super._init({ style_class: 'popup-menu-item',
reactive: params.reactive,
track_hover: params.reactive,
can_focus: params.can_focus,
accessible_role: Atk.Role.MENU_ITEM });
this._delegate = this;
this._ornament = Ornament.NONE;
this._ornamentLabel = new St.Label({ style_class: 'popup-menu-ornament' });
this.actor.add(this._ornamentLabel);
this.add(this._ornamentLabel);
this._parent = null;
this.active = false;
this._active = false;
this._activatable = params.reactive && params.activate;
this._sensitive = true;
if (!this._activatable)
this.actor.add_style_class_name('popup-inactive-menu-item');
this.add_style_class_name('popup-inactive-menu-item');
if (params.style_class)
this.actor.add_style_class_name(params.style_class);
this.add_style_class_name(params.style_class);
if (this._activatable) {
this.actor.connect('button-press-event', this._onButtonPressEvent.bind(this));
this.actor.connect('button-release-event', this._onButtonReleaseEvent.bind(this));
this.actor.connect('touch-event', this._onTouchEvent.bind(this));
this.actor.connect('key-press-event', this._onKeyPressEvent.bind(this));
this.connect('button-press-event', this._onButtonPressEvent.bind(this));
this.connect('button-release-event', this._onButtonReleaseEvent.bind(this));
this.connect('touch-event', this._onTouchEvent.bind(this));
this.connect('key-press-event', this._onKeyPressEvent.bind(this));
}
if (params.reactive && params.hover)
this.actor.connect('notify::hover', this._onHoverChanged.bind(this));
this.bind_property('hover', this, 'active', GObject.BindingFlags.SYNC_CREATE);
}
this.actor.connect('key-focus-in', this._onKeyFocusIn.bind(this));
this.actor.connect('key-focus-out', this._onKeyFocusOut.bind(this));
this.actor.connect('destroy', this._onDestroy.bind(this));
get actor() {
/* This is kept for compatibility with current implementation, and we
don't want to warn here yet since PopupMenu depends on this */
return this;
}
_getTopMenu() {
@ -109,24 +124,24 @@ var PopupBaseMenuItem = class {
_onButtonPressEvent(actor, event) {
// This is the CSS active state
this.actor.add_style_pseudo_class ('active');
this.add_style_pseudo_class('active');
return Clutter.EVENT_PROPAGATE;
}
_onButtonReleaseEvent(actor, event) {
this.actor.remove_style_pseudo_class ('active');
this.remove_style_pseudo_class('active');
this.activate(event);
return Clutter.EVENT_STOP;
}
_onTouchEvent(actor, event) {
if (event.type() == Clutter.EventType.TOUCH_END) {
this.actor.remove_style_pseudo_class ('active');
this.remove_style_pseudo_class('active');
this.activate(event);
return Clutter.EVENT_STOP;
} else if (event.type() == Clutter.EventType.TOUCH_BEGIN) {
// This is the CSS active state
this.actor.add_style_pseudo_class ('active');
this.add_style_pseudo_class('active');
}
return Clutter.EVENT_PROPAGATE;
}
@ -151,54 +166,56 @@ var PopupBaseMenuItem = class {
return Clutter.EVENT_PROPAGATE;
}
_onKeyFocusIn(actor) {
this.setActive(true);
vfunc_key_focus_in() {
super.vfunc_key_focus_in();
this.active = true;
}
_onKeyFocusOut(actor) {
this.setActive(false);
}
_onHoverChanged(actor) {
this.setActive(actor.hover);
vfunc_key_focus_out() {
super.vfunc_key_focus_out();
this.active = false;
}
activate(event) {
this.emit('activate', event);
}
setActive(active) {
get active() {
return this._active;
}
set active(active) {
let activeChanged = active != this.active;
if (activeChanged) {
this.active = active;
this._active = active;
if (active) {
this.actor.add_style_class_name('selected');
if (this.actor.can_focus)
this.actor.grab_key_focus();
this.add_style_class_name('selected');
if (this.can_focus)
this.grab_key_focus();
} else {
this.actor.remove_style_class_name('selected');
this.remove_style_class_name('selected');
// Remove the CSS active state if the user press the button and
// while holding moves to another menu item, so we don't paint all items.
// The correct behaviour would be to set the new item with the CSS
// active state as well, but button-press-event is not trigered,
// so we should track it in our own, which would involve some work
// in the container
this.actor.remove_style_pseudo_class ('active');
this.remove_style_pseudo_class('active');
}
this.emit('active-changed', active);
this.notify('active');
}
}
syncSensitive() {
let sensitive = this.getSensitive();
this.actor.reactive = sensitive;
this.actor.can_focus = sensitive;
this.emit('sensitive-changed');
let sensitive = this.sensitive;
this.reactive = sensitive;
this.can_focus = sensitive;
this.notify('sensitive');
return sensitive;
}
getSensitive() {
let parentSensitive = this._parent ? this._parent.getSensitive() : true;
let parentSensitive = this._parent ? this._parent.sensitive : true;
return this._activatable && this._sensitive && parentSensitive;
}
@ -210,12 +227,12 @@ var PopupBaseMenuItem = class {
this.syncSensitive();
}
destroy() {
this.actor.destroy();
get sensitive() {
return this.getSensitive();
}
_onDestroy() {
this.emit('destroy');
set sensitive(sensitive) {
this.setSensitive(sensitive);
}
setOrnament(ornament) {
@ -226,36 +243,38 @@ var PopupBaseMenuItem = class {
if (ornament == Ornament.DOT) {
this._ornamentLabel.text = '\u2022';
this.actor.add_accessible_state(Atk.StateType.CHECKED);
this.add_accessible_state(Atk.StateType.CHECKED);
} else if (ornament == Ornament.CHECK) {
this._ornamentLabel.text = '\u2713';
this.actor.add_accessible_state(Atk.StateType.CHECKED);
this.add_accessible_state(Atk.StateType.CHECKED);
} else if (ornament == Ornament.NONE) {
this._ornamentLabel.text = '';
this.actor.remove_accessible_state(Atk.StateType.CHECKED);
this.remove_accessible_state(Atk.StateType.CHECKED);
}
}
};
Signals.addSignalMethods(PopupBaseMenuItem.prototype);
});
var PopupMenuItem = class extends PopupBaseMenuItem {
constructor(text, params) {
super(params);
var PopupMenuItem = GObject.registerClass(
class PopupMenuItem extends PopupBaseMenuItem {
_init(text, params) {
super._init(params);
this.label = new St.Label({ text: text });
this.actor.add_child(this.label);
this.actor.label_actor = this.label
this.add_child(this.label);
this.label_actor = this.label
}
};
});
var PopupSeparatorMenuItem = class extends PopupBaseMenuItem {
constructor(text) {
super({ reactive: false,
can_focus: false});
var PopupSeparatorMenuItem = GObject.registerClass(
class PopupSeparatorMenuItem extends PopupBaseMenuItem {
_init(text) {
super._init({ reactive: false,
can_focus: false });
this.label = new St.Label({ text: text || '' });
this.actor.add(this.label);
this.actor.label_actor = this.label;
this.add(this.label);
this.label_actor = this.label;
this.label.connect('notify::text',
this._syncVisibility.bind(this));
@ -264,81 +283,78 @@ var PopupSeparatorMenuItem = class extends PopupBaseMenuItem {
this._separator = new St.Widget({ style_class: 'popup-separator-menu-item',
y_expand: true,
y_align: Clutter.ActorAlign.CENTER });
this.actor.add(this._separator, { expand: true });
this.add(this._separator, { expand: true });
}
_syncVisibility() {
this.label.visible = this.label.text != '';
}
};
});
var Switch = class {
constructor(state) {
this.actor = new St.Bin({ style_class: 'toggle-switch',
accessible_role: Atk.Role.CHECK_BOX,
can_focus: true });
// Translators: this MUST be either "toggle-switch-us"
// (for toggle switches containing the English words
// "ON" and "OFF") or "toggle-switch-intl" (for toggle
// switches containing "◯" and "|"). Other values will
// simply result in invisible toggle switches.
this.actor.add_style_class_name(_("toggle-switch-us"));
var Switch = GObject.registerClass(
class Switch extends St.Bin {
_init(state) {
super._init({ style_class: 'toggle-switch',
accessible_role: Atk.Role.CHECK_BOX,
can_focus: true });
this.setToggleState(state);
}
setToggleState(state) {
if (state)
this.actor.add_style_pseudo_class('checked');
this.add_style_pseudo_class('checked');
else
this.actor.remove_style_pseudo_class('checked');
this.remove_style_pseudo_class('checked');
this.state = state;
}
toggle() {
this.setToggleState(!this.state);
}
};
});
var PopupSwitchMenuItem = class extends PopupBaseMenuItem {
constructor(text, active, params) {
super(params);
var PopupSwitchMenuItem = GObject.registerClass({
Signals: { 'toggled': { param_types: [GObject.TYPE_BOOLEAN] }, },
},
class PopupSwitchMenuItem extends PopupBaseMenuItem {
_init(text, active, params) {
super._init(params);
this.label = new St.Label({ text: text });
this._switch = new Switch(active);
this.actor.accessible_role = Atk.Role.CHECK_MENU_ITEM;
this.accessible_role = Atk.Role.CHECK_MENU_ITEM;
this.checkAccessibleState();
this.actor.label_actor = this.label;
this.label_actor = this.label;
this.actor.add_child(this.label);
this.add_child(this.label);
this._statusBin = new St.Bin({ x_align: St.Align.END });
this.actor.add(this._statusBin, { expand: true, x_align: St.Align.END });
this.add(this._statusBin, { expand: true, x_align: St.Align.END });
this._statusLabel = new St.Label({ text: '',
style_class: 'popup-status-menu-item'
});
this._statusBin.child = this._switch.actor;
this._statusBin.child = this._switch;
}
setStatus(text) {
if (text != null) {
this._statusLabel.text = text;
this._statusBin.child = this._statusLabel;
this.actor.reactive = false;
this.actor.accessible_role = Atk.Role.MENU_ITEM;
this.reactive = false;
this.accessible_role = Atk.Role.MENU_ITEM;
} else {
this._statusBin.child = this._switch.actor;
this.actor.reactive = true;
this.actor.accessible_role = Atk.Role.CHECK_MENU_ITEM;
this._statusBin.child = this._switch;
this.reactive = true;
this.accessible_role = Atk.Role.CHECK_MENU_ITEM;
}
this.checkAccessibleState();
}
activate(event) {
if (this._switch.actor.mapped) {
if (this._switch.mapped)
this.toggle();
}
// we allow pressing space to toggle the switch
// without closing the menu
@ -365,29 +381,30 @@ var PopupSwitchMenuItem = class extends PopupBaseMenuItem {
}
checkAccessibleState() {
switch (this.actor.accessible_role) {
switch (this.accessible_role) {
case Atk.Role.CHECK_MENU_ITEM:
if (this._switch.state)
this.actor.add_accessible_state (Atk.StateType.CHECKED);
this.add_accessible_state(Atk.StateType.CHECKED);
else
this.actor.remove_accessible_state (Atk.StateType.CHECKED);
this.remove_accessible_state(Atk.StateType.CHECKED);
break;
default:
this.actor.remove_accessible_state (Atk.StateType.CHECKED);
this.remove_accessible_state(Atk.StateType.CHECKED);
}
}
};
});
var PopupImageMenuItem = class extends PopupBaseMenuItem {
constructor(text, icon, params) {
super(params);
var PopupImageMenuItem = GObject.registerClass(
class PopupImageMenuItem extends PopupBaseMenuItem {
_init(text, icon, params) {
super._init(params);
this._icon = new St.Icon({ style_class: 'popup-menu-icon',
x_align: Clutter.ActorAlign.END });
this.actor.add_child(this._icon);
this.add_child(this._icon);
this.label = new St.Label({ text: text });
this.actor.add_child(this.label);
this.actor.label_actor = this.label;
this.add_child(this.label);
this.label_actor = this.label;
this.setIcon(icon);
}
@ -399,12 +416,12 @@ var PopupImageMenuItem = class extends PopupBaseMenuItem {
else
this._icon.icon_name = icon;
}
};
});
var PopupMenuBase = class {
constructor(sourceActor, styleClass) {
if (new.target === PopupMenuBase)
throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
if (this.constructor === PopupMenuBase)
throw new TypeError(`Cannot instantiate abstract class ${this.constructor.name}`);
this.sourceActor = sourceActor;
this._parent = null;
@ -443,13 +460,21 @@ var PopupMenuBase = class {
}
getSensitive() {
let parentSensitive = this._parent ? this._parent.getSensitive() : true;
let parentSensitive = this._parent ? this._parent.sensitive : true;
return this._sensitive && parentSensitive;
}
setSensitive(sensitive) {
this._sensitive = sensitive;
this.emit('sensitive-changed');
this.emit('notify::sensitive');
}
get sensitive() {
return this.getSensitive();
}
set sensitive(sensitive) {
this.setSensitive(sensitive);
}
_sessionUpdated() {
@ -485,7 +510,7 @@ var PopupMenuBase = class {
app.activate();
});
menuItem.actor.visible = Main.sessionMode.allowSettings;
menuItem.visible = Main.sessionMode.allowSettings;
this._settingsActions[desktopFile] = menuItem;
return menuItem;
@ -494,7 +519,7 @@ var PopupMenuBase = class {
_setSettingsVisibility(visible) {
for (let id in this._settingsActions) {
let item = this._settingsActions[id];
item.actor.visible = visible;
item.visible = visible;
}
}
@ -517,16 +542,17 @@ var PopupMenuBase = class {
_subMenuActiveChanged(submenu, submenuItem) {
if (this._activeMenuItem && this._activeMenuItem != submenuItem)
this._activeMenuItem.setActive(false);
this._activeMenuItem.active = false;
this._activeMenuItem = submenuItem;
this.emit('active-changed', submenuItem);
}
_connectItemSignals(menuItem) {
menuItem._activeChangeId = menuItem.connect('active-changed', (menuItem, active) => {
menuItem._activeChangeId = menuItem.connect('notify::active', (menuItem) => {
let active = menuItem.active;
if (active && this._activeMenuItem != menuItem) {
if (this._activeMenuItem)
this._activeMenuItem.setActive(false);
this._activeMenuItem.active = false;
this._activeMenuItem = menuItem;
this.emit('active-changed', menuItem);
} else if (!active && this._activeMenuItem == menuItem) {
@ -534,8 +560,8 @@ var PopupMenuBase = class {
this.emit('active-changed', null);
}
});
menuItem._sensitiveChangeId = menuItem.connect('sensitive-changed', () => {
let sensitive = menuItem.getSensitive();
menuItem._sensitiveChangeId = menuItem.connect('notify::sensitive', () => {
let sensitive = menuItem.sensitive;
if (!sensitive && this._activeMenuItem == menuItem) {
if (!this.actor.navigate_focus(menuItem.actor,
St.DirectionType.TAB_FORWARD,
@ -551,7 +577,7 @@ var PopupMenuBase = class {
this.itemActivated(BoxPointer.PopupAnimation.FULL);
});
menuItem._parentSensitiveChangeId = this.connect('sensitive-changed', () => {
menuItem._parentSensitiveChangeId = this.connect('notify::sensitive', () => {
menuItem.syncSensitive();
});
@ -603,7 +629,7 @@ var PopupMenuBase = class {
return;
}
menuItem.actor.show();
menuItem.show();
}
moveMenuItem(menuItem, position) {
@ -650,8 +676,8 @@ var PopupMenuBase = class {
let parentClosingId = this.connect('menu-closed', () => {
menuItem.emit('menu-closed');
});
let subMenuSensitiveChangedId = this.connect('sensitive-changed', () => {
menuItem.emit('sensitive-changed');
let subMenuSensitiveChangedId = this.connect('notify::sensitive', () => {
menuItem.emit('notify::sensitive');
});
menuItem.connect('destroy', () => {
@ -857,9 +883,9 @@ var PopupMenu = class extends PopupMenuBase {
close(animate) {
if (this._activeMenuItem)
this._activeMenuItem.setActive(false);
this._activeMenuItem.active = false;
if (this._boxPointer.actor.visible) {
if (this._boxPointer.visible) {
this._boxPointer.close(animate, () => {
this.emit('menu-closed');
});
@ -890,6 +916,10 @@ var PopupDummyMenu = class {
return true;
}
get sensitive() {
return this.getSensitive();
}
open() { this.emit('open-state-changed', true); }
close() { this.emit('open-state-changed', false); }
toggle() {}
@ -929,7 +959,11 @@ var PopupSubMenu = class extends PopupMenuBase {
}
getSensitive() {
return this._sensitive && this.sourceActor._delegate.getSensitive();
return this._sensitive && this.sourceActor.sensitive;
}
get sensitive() {
return this.getSensitive();
}
open(animate) {
@ -996,7 +1030,7 @@ var PopupSubMenu = class extends PopupMenuBase {
this.emit('open-state-changed', false);
if (this._activeMenuItem)
this._activeMenuItem.setActive(false);
this._activeMenuItem.active = false;
if (animate && this._needsScrollbar())
animate = false;
@ -1028,7 +1062,7 @@ var PopupSubMenu = class extends PopupMenuBase {
if (this.isOpen && event.get_key_symbol() == Clutter.KEY_Left) {
this.close(BoxPointer.PopupAnimation.FULL);
this.sourceActor._delegate.setActive(true);
this.sourceActor._delegate.active = true;
return Clutter.EVENT_STOP;
}
@ -1059,25 +1093,26 @@ var PopupMenuSection = class extends PopupMenuBase {
close() { this.emit('open-state-changed', false); }
};
var PopupSubMenuMenuItem = class extends PopupBaseMenuItem {
constructor(text, wantIcon) {
super();
var PopupSubMenuMenuItem = GObject.registerClass(
class PopupSubMenuMenuItem extends PopupBaseMenuItem {
_init(text, wantIcon) {
super._init();
this.actor.add_style_class_name('popup-submenu-menu-item');
this.add_style_class_name('popup-submenu-menu-item');
if (wantIcon) {
this.icon = new St.Icon({ style_class: 'popup-menu-icon' });
this.actor.add_child(this.icon);
this.add_child(this.icon);
}
this.label = new St.Label({ text: text,
y_expand: true,
y_align: Clutter.ActorAlign.CENTER });
this.actor.add_child(this.label);
this.actor.label_actor = this.label;
this.add_child(this.label);
this.label_actor = this.label;
let expander = new St.Bin({ style_class: 'popup-menu-item-expander' });
this.actor.add(expander, { expand: true });
this.add(expander, { expand: true });
this._triangle = arrowIcon(St.Side.RIGHT);
this._triangle.pivot_point = new Clutter.Point({ x: 0.5, y: 0.6 });
@ -1086,11 +1121,12 @@ var PopupSubMenuMenuItem = class extends PopupBaseMenuItem {
y_align: Clutter.ActorAlign.CENTER });
this._triangleBin.add_child(this._triangle);
this.actor.add_child(this._triangleBin);
this.actor.add_accessible_state (Atk.StateType.EXPANDABLE);
this.add_child(this._triangleBin);
this.add_accessible_state(Atk.StateType.EXPANDABLE);
this.menu = new PopupSubMenu(this.actor, this._triangle);
this.menu = new PopupSubMenu(this, this._triangle);
this.menu.connect('open-state-changed', this._subMenuOpenStateChanged.bind(this));
this.connect('destroy', () => { this.menu.destroy(); });
}
_setParent(parent) {
@ -1107,24 +1143,18 @@ var PopupSubMenuMenuItem = class extends PopupBaseMenuItem {
_subMenuOpenStateChanged(menu, open) {
if (open) {
this.actor.add_style_pseudo_class('open');
this.add_style_pseudo_class('open');
this._getTopMenu()._setOpenedSubMenu(this.menu);
this.actor.add_accessible_state (Atk.StateType.EXPANDED);
this.actor.add_style_pseudo_class('checked');
this.add_accessible_state(Atk.StateType.EXPANDED);
this.add_style_pseudo_class('checked');
} else {
this.actor.remove_style_pseudo_class('open');
this.remove_style_pseudo_class('open');
this._getTopMenu()._setOpenedSubMenu(null);
this.actor.remove_accessible_state (Atk.StateType.EXPANDED);
this.actor.remove_style_pseudo_class('checked');
this.remove_accessible_state (Atk.StateType.EXPANDED);
this.remove_style_pseudo_class('checked');
}
}
destroy() {
this.menu.destroy();
super.destroy();
}
setSubmenuShown(open) {
if (open)
this.menu.open(BoxPointer.PopupAnimation.FULL);
@ -1162,7 +1192,7 @@ var PopupSubMenuMenuItem = class extends PopupBaseMenuItem {
_onButtonReleaseEvent(actor) {
// Since we override the parent, we need to manage what the parent does
// with the active style class
this.actor.remove_style_pseudo_class ('active');
this.remove_style_pseudo_class('active');
this._setOpenState(!this._getOpenState());
return Clutter.EVENT_PROPAGATE;
}
@ -1171,12 +1201,12 @@ var PopupSubMenuMenuItem = class extends PopupBaseMenuItem {
if (event.type() == Clutter.EventType.TOUCH_END) {
// Since we override the parent, we need to manage what the parent does
// with the active style class
this.actor.remove_style_pseudo_class ('active');
this.remove_style_pseudo_class('active');
this._setOpenState(!this._getOpenState());
}
return Clutter.EVENT_PROPAGATE;
}
};
});
/* Basic implementation of a menu manager.
* Call addMenu to add menus
@ -1186,7 +1216,7 @@ var PopupMenuManager = class {
grabParams = Params.parse(grabParams,
{ actionMode: Shell.ActionMode.POPUP });
this._owner = owner;
this._grabHelper = new GrabHelper.GrabHelper(owner.actor, grabParams);
this._grabHelper = new GrabHelper.GrabHelper(owner, grabParams);
this._menus = [];
}

View File

@ -810,16 +810,8 @@ var ScreenShield = class {
this._maybeCancelDialog();
if (this._longLightbox.actor.visible ||
this._isActive) {
// We're either shown and active, or in the process of
// showing.
// The latter is a very unlikely condition (it requires
// idle-delay < 20), but in any case we have nothing
// to do at this point: either isActive is true, or
// it will soon be.
// isActive can also be true if the lightbox is hidden,
// in case the shield is down and the user hasn't unlocked yet
if (this._longLightbox.actor.visible) {
// We're in the process of showing.
return;
}

View File

@ -1,6 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const { Clutter, Gio, GLib, Gtk, Meta, Shell, St } = imports.gi;
const { Clutter, Gio, GLib, Meta, Shell, St } = imports.gi;
const Signals = imports.signals;
const GrabHelper = imports.ui.grabHelper;
@ -227,8 +227,6 @@ var SelectArea = class {
this._lastY = 0;
this._result = null;
this._initRubberbandColors();
this._group = new St.Widget({ visible: false,
reactive: true,
x: 0,
@ -248,10 +246,10 @@ var SelectArea = class {
coordinate: Clutter.BindCoordinate.ALL });
this._group.add_constraint(constraint);
this._rubberband = new Clutter.Rectangle({ color: this._background,
has_border: true,
border_width: 1,
border_color: this._border });
this._rubberband = new St.Widget({
style_class: 'select-area-rubberband',
visible: false
});
this._group.add_actor(this._rubberband);
}
@ -265,25 +263,6 @@ var SelectArea = class {
this._group.visible = true;
}
_initRubberbandColors() {
function colorFromRGBA(rgba) {
return new Clutter.Color({ red: rgba.red * 255,
green: rgba.green * 255,
blue: rgba.blue * 255,
alpha: rgba.alpha * 255 });
}
let path = new Gtk.WidgetPath();
path.append_type(Gtk.IconView);
let context = new Gtk.StyleContext();
context.set_path(path);
context.add_class('rubberband');
this._background = colorFromRGBA(context.get_background_color(Gtk.StateFlags.NORMAL));
this._border = colorFromRGBA(context.get_border_color(Gtk.StateFlags.NORMAL));
}
_getGeometry() {
return { x: Math.min(this._startX, this._lastX),
y: Math.min(this._startY, this._lastY),
@ -302,6 +281,7 @@ var SelectArea = class {
this._rubberband.set_position(geometry.x, geometry.y);
this._rubberband.set_size(geometry.width, geometry.height);
this._rubberband.show();
return Clutter.EVENT_PROPAGATE;
}

View File

@ -37,16 +37,13 @@ const { loadInterfaceXML } = imports.misc.fileUtils;
* 'yield Scripting.sleep(500);'
*/
function sleep(milliseconds) {
let cb;
let id = Mainloop.timeout_add(milliseconds, () => {
if (cb)
cb();
return GLib.SOURCE_REMOVE;
return new Promise(resolve => {
let id = Mainloop.timeout_add(milliseconds, () => {
resolve();
return GLib.SOURCE_REMOVE;
});
GLib.Source.set_name_by_id(id, '[gnome-shell] sleep');
});
GLib.Source.set_name_by_id(id, '[gnome-shell] sleep');
return callback => { cb = callback; };
}
/**
@ -57,14 +54,9 @@ function sleep(milliseconds) {
* 'yield Scripting.waitLeisure();'
*/
function waitLeisure() {
let cb;
global.run_at_leisure(() => {
if (cb)
cb();
return new Promise(resolve => {
global.run_at_leisure(resolve);
});
return callback => { cb = callback; };
}
const PerfHelperIface = loadInterfaceXML('org.gnome.Shell.PerfHelper');
@ -82,25 +74,16 @@ function _getPerfHelper() {
}
function _callRemote(obj, method, ...args) {
let cb;
let errcb;
return new Promise((resolve, reject) => {
args.push((result, excp) => {
if (excp)
reject(excp);
else
resolve();
});
args.push((result, excp) => {
if (excp) {
if (errcb)
errcb(excp);
} else {
if (cb)
cb();
}
method.apply(obj, args);
});
method.apply(obj, args);
return (callback, error_callback) => {
cb = callback;
errcb = error_callback;
};
}
/**
@ -192,27 +175,6 @@ function collectStatistics() {
Shell.PerfLog.get_default().collect_statistics();
}
function _step(g, finish, onError) {
try {
let waitFunction = g.next();
waitFunction(() => {
_step(g, finish, onError);
},
err => {
if (onError)
onError(err);
});
} catch (err) {
if (err instanceof StopIteration) {
if (finish)
finish();
} else {
if (onError)
onError(err);
}
}
}
function _collect(scriptModule, outputFile) {
let eventHandlers = {};
@ -348,23 +310,23 @@ function _collect(scriptModule, outputFile) {
* After running the script and collecting statistics from the
* event log, GNOME Shell will exit.
**/
function runPerfScript(scriptModule, outputFile) {
async function runPerfScript(scriptModule, outputFile) {
Shell.PerfLog.get_default().set_enabled(true);
let g = scriptModule.run();
for (let step of scriptModule.run()) {
try {
await step;
} catch (err) {
log(`Script failed: ${err}\n${err.stack}`);
Meta.exit(Meta.ExitCode.ERROR);
}
}
_step(g,
() => {
try {
_collect(scriptModule, outputFile);
} catch (err) {
log("Script failed: " + err + "\n" + err.stack);
Meta.exit(Meta.ExitCode.ERROR);
}
Meta.exit(Meta.ExitCode.SUCCESS);
},
err => {
log("Script failed: " + err + "\n" + err.stack);
Meta.exit(Meta.ExitCode.ERROR);
});
try {
_collect(scriptModule, outputFile);
} catch (err) {
log(`Script failed: ${err}\n${err.stack}`);
Meta.exit(Meta.ExitCode.ERROR);
}
Meta.exit(Meta.ExitCode.SUCCESS);
}

View File

@ -79,14 +79,17 @@ var GnomeShell = class {
for (let param in params)
params[param] = params[param].deep_unpack();
let { monitor: monitorIndex,
let { connector,
label,
level,
max_level: maxLevel,
icon: serializedIcon } = params;
if (monitorIndex === undefined)
monitorIndex = -1;
let monitorIndex = -1;
if (connector) {
let monitorManager = Meta.MonitorManager.get();
monitorIndex = monitorManager.get_monitor_for_connector(connector);
}
let icon = null;
if (serializedIcon)
@ -203,16 +206,10 @@ var GnomeShell = class {
this._grabbers.delete(name);
}
ShowMonitorLabelsAsync(params, invocation) {
let sender = invocation.get_sender();
let [dict] = params;
Main.osdMonitorLabeler.show(sender, dict);
}
ShowMonitorLabels2Async(params, invocation) {
let sender = invocation.get_sender();
let [dict] = params;
Main.osdMonitorLabeler.show2(sender, dict);
Main.osdMonitorLabeler.show(sender, dict);
}
HideMonitorLabelsAsync(params, invocation) {

View File

@ -148,7 +148,7 @@ function addContextMenu(entry, params) {
entry.menu = new EntryMenu(entry);
entry.menu.isPassword = params.isPassword;
entry._menuManager = new PopupMenu.PopupMenuManager({ actor: entry },
entry._menuManager = new PopupMenu.PopupMenuManager(entry,
{ actionMode: params.actionMode });
entry._menuManager.addMenu(entry.menu);

View File

@ -3,6 +3,7 @@
const { Clutter, Gio, GLib, Pango, Shell, St } = imports.gi;
const Signals = imports.signals;
const Animation = imports.ui.animation;
const CheckBox = imports.ui.checkBox;
const Dialog = imports.ui.dialog;
const Main = imports.ui.main;
@ -14,6 +15,7 @@ const ShellEntry = imports.ui.shellEntry;
const { loadInterfaceXML } = imports.misc.fileUtils;
var LIST_ITEM_ICON_SIZE = 48;
var WORK_SPINNER_ICON_SIZE = 16;
const REMEMBER_MOUNT_PASSWORD_KEY = 'remember-mount-password';
@ -148,7 +150,7 @@ var ShellMountOperation = class {
}
this._dialogId = this._dialog.connect('response',
(object, choice, password, remember) => {
(object, choice, password, remember, hiddenVolume, systemVolume, pim) => {
if (choice == -1) {
this.mountOp.reply(Gio.MountOperationResult.ABORTED);
} else {
@ -158,6 +160,9 @@ var ShellMountOperation = class {
this.mountOp.set_password_save(Gio.PasswordSave.NEVER);
this.mountOp.set_password(password);
this.mountOp.set_is_tcrypt_hidden_volume(hiddenVolume);
this.mountOp.set_is_tcrypt_system_volume(systemVolume);
this.mountOp.set_pim(pim);
this.mountOp.reply(Gio.MountOperationResult.HANDLED);
}
});
@ -286,24 +291,91 @@ var ShellMountPasswordDialog = class extends ModalDialog.ModalDialog {
let body = strings.shift() || null;
super({ styleClass: 'prompt-dialog' });
let disksApp = Shell.AppSystem.get_default().lookup_app('org.gnome.DiskUtility.desktop');
let content = new Dialog.MessageDialogContent({ icon, title, body });
this.contentLayout.add_actor(content);
content._body.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
this._passwordBox = new St.BoxLayout({ vertical: false, style_class: 'prompt-dialog-password-box' });
content.messageBox.add(this._passwordBox);
let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL });
let grid = new St.Widget({ style_class: 'prompt-dialog-grid',
layout_manager: layout });
layout.hookup_style(grid);
let rtl = grid.get_text_direction() === Clutter.TextDirection.RTL;
this._passwordLabel = new St.Label(({ style_class: 'prompt-dialog-password-label',
text: _("Password") }));
this._passwordBox.add(this._passwordLabel, { y_fill: false, y_align: St.Align.MIDDLE });
if (flags & Gio.AskPasswordFlags.TCRYPT) {
this._keyfilesLabel = new St.Label(({ style_class: 'prompt-dialog-keyfiles-label',
visible: false }));
this._hiddenVolume = new CheckBox.CheckBox(_("Hidden Volume"));
content.messageBox.add(this._hiddenVolume.actor);
this._systemVolume = new CheckBox.CheckBox(_("Windows System Volume"));
content.messageBox.add(this._systemVolume.actor);
this._keyfilesCheckbox = new CheckBox.CheckBox(_("Uses Keyfiles"));
this._keyfilesCheckbox.actor.connect("clicked", this._onKeyfilesCheckboxClicked.bind(this));
content.messageBox.add(this._keyfilesCheckbox.actor);
this._keyfilesLabel.clutter_text.set_markup(
/* Translators: %s is the Disks application */
_("To unlock a volume that uses keyfiles, use the <i>%s</i> utility instead.").format(disksApp.get_name())
);
this._keyfilesLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
this._keyfilesLabel.clutter_text.line_wrap = true;
content.messageBox.add(this._keyfilesLabel, { y_fill: false, y_align: St.Align.MIDDLE, expand: true });
this._pimLabel = new St.Label({ style_class: 'prompt-dialog-password-label',
text: _("PIM Number"),
y_align: Clutter.ActorAlign.CENTER });
this._pimEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
can_focus: true,
x_expand: true });
this._pimEntry.clutter_text.connect('activate', this._onEntryActivate.bind(this));
this._pimEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE
ShellEntry.addContextMenu(this._pimEntry, { isPassword: true });
if (rtl) {
layout.attach(this._pimEntry, 0, 0, 1, 1);
layout.attach(this._pimLabel, 1, 0, 1, 1);
} else {
layout.attach(this._pimLabel, 0, 0, 1, 1);
layout.attach(this._pimEntry, 1, 0, 1, 1);
}
this._pimErrorMessageLabel = new St.Label({ style_class: 'prompt-dialog-password-entry',
text: _("The PIM must be a number or empty."),
visible: false });
layout.attach(this._pimErrorMessageLabel, 0, 2, 2, 1);
} else {
this._hiddenVolume = null;
this._systemVolume = null;
this._pimEntry = null;
this._pimErrorMessageLabel = null;
}
this._passwordLabel = new St.Label({ style_class: 'prompt-dialog-password-label',
text: _("Password"),
y_align: Clutter.ActorAlign.CENTER });
this._passwordEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
text: "",
can_focus: true});
ShellEntry.addContextMenu(this._passwordEntry, { isPassword: true });
can_focus: true,
x_expand: true });
this._passwordEntry.clutter_text.connect('activate', this._onEntryActivate.bind(this));
this._passwordEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE
this._passwordBox.add(this._passwordEntry, {expand: true });
ShellEntry.addContextMenu(this._passwordEntry, { isPassword: true });
this.setInitialKeyFocus(this._passwordEntry);
this._workSpinner = new Animation.Spinner(WORK_SPINNER_ICON_SIZE, true);
this._passwordEntry.secondary_icon = this._workSpinner.actor;
if (rtl) {
layout.attach(this._passwordEntry, 0, 1, 1, 1);
layout.attach(this._passwordLabel, 1, 1, 1, 1);
} else {
layout.attach(this._passwordLabel, 0, 1, 1, 1);
layout.attach(this._passwordEntry, 1, 1, 1, 1);
}
content.messageBox.add(grid);
this._errorMessageLabel = new St.Label({ style_class: 'prompt-dialog-error-label',
text: _("Sorry, that didnt work. Please try again.") });
@ -313,8 +385,7 @@ var ShellMountPasswordDialog = class extends ModalDialog.ModalDialog {
content.messageBox.add(this._errorMessageLabel);
if (flags & Gio.AskPasswordFlags.SAVING_SUPPORTED) {
this._rememberChoice = new CheckBox.CheckBox();
this._rememberChoice.getLabelActor().text = _("Remember Password");
this._rememberChoice = new CheckBox.CheckBox(_("Remember Password"));
this._rememberChoice.actor.checked =
global.settings.get_boolean(REMEMBER_MOUNT_PASSWORD_KEY);
content.messageBox.add(this._rememberChoice.actor);
@ -322,21 +393,32 @@ var ShellMountPasswordDialog = class extends ModalDialog.ModalDialog {
this._rememberChoice = null;
}
let buttons = [{ label: _("Cancel"),
action: this._onCancelButton.bind(this),
key: Clutter.Escape
},
{ label: _("Unlock"),
action: this._onUnlockButton.bind(this),
default: true
}];
this._defaultButtons = [{ label: _("Cancel"),
action: this._onCancelButton.bind(this),
key: Clutter.Escape
},
{ label: _("Unlock"),
action: this._onUnlockButton.bind(this),
default: true
}];
this.setButtons(buttons);
this._usesKeyfilesButtons = [{ label: _("Cancel"),
action: this._onCancelButton.bind(this),
key: Clutter.Escape
},
{ /* Translators: %s is the Disks application */
label: _("Open %s").format(disksApp.get_name()),
action: this._onOpenDisksButton.bind(this),
default: true
}];
this.setButtons(this._defaultButtons);
}
reaskPassword() {
this._passwordEntry.set_text('');
this._errorMessageLabel.show();
this._workSpinner.stop();
}
_onCancelButton() {
@ -348,12 +430,60 @@ var ShellMountPasswordDialog = class extends ModalDialog.ModalDialog {
}
_onEntryActivate() {
let pim = 0;
if (this._pimEntry !== null)
pim = this._pimEntry.get_text();
if (isNaN(pim)) {
this._pimEntry.set_text('');
this._pimErrorMessageLabel.show();
return;
} else if (this._pimErrorMessageLabel !== null) {
this._pimErrorMessageLabel.hide();
}
global.settings.set_boolean(REMEMBER_MOUNT_PASSWORD_KEY,
this._rememberChoice && this._rememberChoice.actor.checked);
this._workSpinner.play();
this.emit('response', 1,
this._passwordEntry.get_text(),
this._rememberChoice &&
this._rememberChoice.actor.checked);
this._rememberChoice.actor.checked,
this._hiddenVolume &&
this._hiddenVolume.actor.checked,
this._systemVolume &&
this._systemVolume.actor.checked,
pim);
}
_onKeyfilesCheckboxClicked() {
let useKeyfiles = this._keyfilesCheckbox.actor.checked;
this._passwordEntry.reactive = !useKeyfiles;
this._passwordEntry.can_focus = !useKeyfiles;
this._passwordEntry.clutter_text.editable = !useKeyfiles;
this._passwordEntry.clutter_text.selectable = !useKeyfiles;
this._pimEntry.reactive = !useKeyfiles;
this._pimEntry.can_focus = !useKeyfiles;
this._pimEntry.clutter_text.editable = !useKeyfiles;
this._pimEntry.clutter_text.selectable = !useKeyfiles;
this._rememberChoice.actor.reactive = !useKeyfiles;
this._rememberChoice.actor.can_focus = !useKeyfiles;
this._keyfilesLabel.visible = useKeyfiles;
this.setButtons(useKeyfiles ? this._usesKeyfilesButtons : this._defaultButtons);
}
_onOpenDisksButton() {
let app = Shell.AppSystem.get_default().lookup_app('org.gnome.DiskUtility.desktop');
if (app)
app.activate();
else
Main.notifyError(
/* Translators: %s is the Disks application */
_("Unable to start %s").format(app.get_name()),
/* Translators: %s is the Disks application */
_("Couldn't find the %s application").format(app.get_name())
);
this._onCancelButton();
}
};
@ -515,7 +645,7 @@ var GnomeShellMountOpHandler = class {
this._dialog = new ShellMountPasswordDialog(message, this._createGIcon(iconName), flags);
this._dialog.connect('response',
(object, choice, password, remember) => {
(object, choice, password, remember, hiddenVolume, systemVolume, pim) => {
let details = {};
let response;
@ -527,6 +657,9 @@ var GnomeShellMountOpHandler = class {
let passSave = remember ? Gio.PasswordSave.PERMANENTLY : Gio.PasswordSave.NEVER;
details['password_save'] = GLib.Variant.new('u', passSave);
details['password'] = GLib.Variant.new('s', password);
details['hidden_volume'] = GLib.Variant.new('b', hiddenVolume);
details['system_volume'] = GLib.Variant.new('b', systemVolume);
details['pim'] = GLib.Variant.new('u', parseInt(pim));
}
this._clearCurrentRequest(response, details);

View File

@ -39,7 +39,7 @@ class ATIndicator extends PanelMenu.Button {
icon_name: 'preferences-desktop-accessibility-symbolic' }));
this._hbox.add_child(PopupMenu.arrowIcon(St.Side.BOTTOM));
this.actor.add_child(this._hbox);
this.add_child(this._hbox);
this._a11ySettings = new Gio.Settings({ schema_id: A11Y_SCHEMA });
this._a11ySettings.connect('changed::' + KEY_ALWAYS_SHOW, this._queueSyncMenuVisibility.bind(this));
@ -86,7 +86,7 @@ class ATIndicator extends PanelMenu.Button {
let alwaysShow = this._a11ySettings.get_boolean(KEY_ALWAYS_SHOW);
let items = this.menu._getMenuItems();
this.actor.visible = alwaysShow || items.some(f => !!f.state);
this.visible = alwaysShow || items.some(f => !!f.state);
return GLib.SOURCE_REMOVE;
}
@ -112,38 +112,22 @@ class ATIndicator extends PanelMenu.Button {
_buildItem(string, schema, key) {
let settings = new Gio.Settings({ schema_id: schema });
settings.connect('changed::'+key, () => {
let widget = this._buildItemExtended(string,
settings.get_boolean(key),
settings.is_writable(key),
enabled => settings.set_boolean(key, enabled));
settings.connect('changed::' + key, () => {
widget.setToggleState(settings.get_boolean(key));
this._queueSyncMenuVisibility();
});
let widget = this._buildItemExtended(string,
settings.get_boolean(key),
settings.is_writable(key),
enabled => settings.set_boolean(key, enabled));
return widget;
}
_buildHCItem() {
let interfaceSettings = new Gio.Settings({ schema_id: DESKTOP_INTERFACE_SCHEMA });
interfaceSettings.connect('changed::' + KEY_GTK_THEME, () => {
let value = interfaceSettings.get_string(KEY_GTK_THEME);
if (value == HIGH_CONTRAST_THEME) {
highContrast.setToggleState(true);
} else {
highContrast.setToggleState(false);
gtkTheme = value;
}
this._queueSyncMenuVisibility();
});
interfaceSettings.connect('changed::' + KEY_ICON_THEME, () => {
let value = interfaceSettings.get_string(KEY_ICON_THEME);
if (value != HIGH_CONTRAST_THEME)
iconTheme = value;
});
let gtkTheme = interfaceSettings.get_string(KEY_GTK_THEME);
let iconTheme = interfaceSettings.get_string(KEY_ICON_THEME);
let hasHC = (gtkTheme == HIGH_CONTRAST_THEME);
@ -164,19 +148,30 @@ class ATIndicator extends PanelMenu.Button {
interfaceSettings.reset(KEY_ICON_THEME);
}
});
interfaceSettings.connect('changed::' + KEY_GTK_THEME, () => {
let value = interfaceSettings.get_string(KEY_GTK_THEME);
if (value == HIGH_CONTRAST_THEME) {
highContrast.setToggleState(true);
} else {
highContrast.setToggleState(false);
gtkTheme = value;
}
this._queueSyncMenuVisibility();
});
interfaceSettings.connect('changed::' + KEY_ICON_THEME, () => {
let value = interfaceSettings.get_string(KEY_ICON_THEME);
if (value != HIGH_CONTRAST_THEME)
iconTheme = value;
});
return highContrast;
}
_buildFontItem() {
let settings = new Gio.Settings({ schema_id: DESKTOP_INTERFACE_SCHEMA });
settings.connect('changed::' + KEY_TEXT_SCALING_FACTOR, () => {
let factor = settings.get_double(KEY_TEXT_SCALING_FACTOR);
let active = (factor > 1.0);
widget.setToggleState(active);
this._queueSyncMenuVisibility();
});
let factor = settings.get_double(KEY_TEXT_SCALING_FACTOR);
let initial_setting = (factor > 1.0);
let widget = this._buildItemExtended(_("Large Text"),
@ -189,6 +184,15 @@ class ATIndicator extends PanelMenu.Button {
else
settings.reset(KEY_TEXT_SCALING_FACTOR);
});
settings.connect('changed::' + KEY_TEXT_SCALING_FACTOR, () => {
let factor = settings.get_double(KEY_TEXT_SCALING_FACTOR);
let active = (factor > 1.0);
widget.setToggleState(active);
this._queueSyncMenuVisibility();
});
return widget;
}
});

View File

@ -118,9 +118,9 @@ var Indicator = class extends PanelMenu.SystemIndicator {
// Remember if there were setup devices and show the menu
// if we've seen setup devices and we're not hard blocked
if (nDevices > 0)
this._item.actor.visible = !this._proxy.BluetoothHardwareAirplaneMode;
this._item.visible = !this._proxy.BluetoothHardwareAirplaneMode;
else
this._item.actor.visible = this._proxy.BluetoothHasAirplaneMode && !this._proxy.BluetoothAirplaneMode;
this._item.visible = this._proxy.BluetoothHasAirplaneMode && !this._proxy.BluetoothAirplaneMode;
if (nConnectedDevices > 0)
/* Translators: this is the number of connected bluetooth devices */

View File

@ -37,12 +37,12 @@ var Indicator = class extends PanelMenu.SystemIndicator {
let icon = new St.Icon({ icon_name: 'display-brightness-symbolic',
style_class: 'popup-menu-icon' });
this._item.actor.add(icon);
this._item.actor.add(this._slider.actor, { expand: true });
this._item.actor.connect('button-press-event', (actor, event) => {
this._item.add(icon);
this._item.add(this._slider.actor, { expand: true });
this._item.connect('button-press-event', (actor, event) => {
return this._slider.startDragging(event);
});
this._item.actor.connect('key-press-event', (actor, event) => {
this._item.connect('key-press-event', (actor, event) => {
return this._slider.onKeyPressEvent(actor, event);
});
@ -55,7 +55,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
_sync() {
let visible = this._proxy.Brightness >= 0;
this._item.actor.visible = visible;
this._item.visible = visible;
if (visible)
this._slider.setValue(this._proxy.Brightness / 100.0);
}

View File

@ -15,17 +15,18 @@ const Util = imports.misc.util;
const INPUT_SOURCE_TYPE_XKB = 'xkb';
const INPUT_SOURCE_TYPE_IBUS = 'ibus';
var LayoutMenuItem = class extends PopupMenu.PopupBaseMenuItem {
constructor(displayName, shortName) {
super();
var LayoutMenuItem = GObject.registerClass(
class LayoutMenuItem extends PopupMenu.PopupBaseMenuItem {
_init(displayName, shortName) {
super._init();
this.label = new St.Label({ text: displayName });
this.indicator = new St.Label({ text: shortName });
this.actor.add(this.label, { expand: true });
this.actor.add(this.indicator);
this.actor.label_actor = this.label;
this.add(this.label, { expand: true });
this.add(this.indicator);
this.label_actor = this.label;
}
};
});
var InputSource = class {
constructor(type, id, displayName, shortName, index) {
@ -125,8 +126,8 @@ class InputSourceSwitcher extends SwitcherPopup.SwitcherList {
var InputSourceSettings = class {
constructor() {
if (new.target === InputSourceSettings)
throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
if (this.constructor === InputSourceSettings)
throw new TypeError(`Cannot instantiate abstract class ${this.constructor.name}`);
}
_emitInputSourcesChanged() {
@ -822,7 +823,7 @@ class InputSourceIndicator extends PanelMenu.Button {
this._hbox.add_child(this._container);
this._hbox.add_child(PopupMenu.arrowIcon(St.Side.BOTTOM));
this.actor.add_child(this._hbox);
this.add_child(this._hbox);
this._propSeparator = new PopupMenu.PopupSeparatorMenuItem();
this.menu.addMenuItem(this._propSeparator);
@ -857,7 +858,7 @@ class InputSourceIndicator extends PanelMenu.Button {
// but at least for now it is used as "allow popping up windows
// from shell menus"; we can always add a separate sessionMode
// option if need arises.
this._showLayoutItem.actor.visible = Main.sessionMode.allowSettings;
this._showLayoutItem.visible = Main.sessionMode.allowSettings;
}
_sourcesChanged() {
@ -908,11 +909,11 @@ class InputSourceIndicator extends PanelMenu.Button {
// We also hide if we have only one visible source unless
// it's an IBus source with properties.
this.menu.close();
this.actor.hide();
this.hide();
return;
}
this.actor.show();
this.show();
this._buildPropSection(newSource.properties);

View File

@ -101,12 +101,12 @@ var Indicator = class extends PanelMenu.SystemIndicator {
_syncIndicator() {
if (this._managerProxy == null) {
this._indicator.visible = false;
this._item.actor.visible = false;
this._item.visible = false;
return;
}
this._indicator.visible = this._managerProxy.InUse;
this._item.actor.visible = this._indicator.visible;
this._item.visible = this._indicator.visible;
this._updateMenuLabels();
}

View File

@ -167,10 +167,10 @@ var NMConnectionItem = class {
};
Signals.addSignalMethods(NMConnectionItem.prototype);
var NMConnectionSection = class {
var NMConnectionSection = class NMConnectionSection {
constructor(client) {
if (new.target === NMConnectionSection)
throw new TypeError('Cannot instantiate abstract type ' + new.target.name);
if (this.constructor === NMConnectionSection)
throw new TypeError(`Cannot instantiate abstract type ${this.constructor.name}`);
this._client = client;
@ -235,14 +235,14 @@ var NMConnectionSection = class {
if (!this._connectionValid(connection))
return;
// This function is called everytime connection is added or updated
// This function is called every time the connection is added or updated.
// In the usual case, we already added this connection and UUID
// didn't change. So we need to check if we already have an item,
// and update it for properties in the connection that changed
// (the only one we care about is the name)
// But it's also possible we didn't know about this connection
// (eg, during coldplug, or because it was updated and suddenly
// it's valid for this device), in which case we add a new item
// it's valid for this device), in which case we add a new item.
let item = this._connectionItems.get(connection.get_uuid());
if (item)
@ -297,12 +297,13 @@ var NMConnectionSection = class {
};
Signals.addSignalMethods(NMConnectionSection.prototype);
var NMConnectionDevice = class extends NMConnectionSection {
var NMConnectionDevice = class NMConnectionDevice extends NMConnectionSection {
constructor(client, device) {
if (new.target === NMConnectionDevice)
throw new TypeError('Cannot instantiate abstract type ' + new.target.name);
super(client);
if (this.constructor === NMConnectionDevice)
throw new TypeError(`Cannot instantiate abstract type ${this.constructor.name}`);
this._device = device;
this._description = '';
@ -388,8 +389,8 @@ var NMConnectionDevice = class extends NMConnectionSection {
_sync() {
let nItems = this._connectionItems.size;
this._autoConnectItem.actor.visible = (nItems == 0);
this._deactivateItem.actor.visible = this._device.state > NM.DeviceState.DISCONNECTED;
this._autoConnectItem.visible = (nItems == 0);
this._deactivateItem.visible = this._device.state > NM.DeviceState.DISCONNECTED;
if (this._activeConnection == null) {
let activeConnection = this._device.active_connection;
@ -476,7 +477,7 @@ var NMDeviceWired = class extends NMConnectionDevice {
}
_sync() {
this.item.actor.visible = this._hasCarrier();
this.item.visible = this._hasCarrier();
super._sync();
}
@ -1075,7 +1076,7 @@ var NMWirelessDialog = class extends ModalDialog.ModalDialog {
let newPos = Util.insertSorted(this._networks, network, this._networkSortFunction);
this._createNetworkItem(network);
this._itemBox.insert_child_at_index(network.item.actor, newPos);
this._itemBox.insert_child_at_index(network.item, newPos);
}
this._syncView();
@ -1093,7 +1094,7 @@ var NMWirelessDialog = class extends ModalDialog.ModalDialog {
network.accessPoints.splice(res.ap, 1);
if (network.accessPoints.length == 0) {
network.item.actor.destroy();
network.item.destroy();
this._networks.splice(res.network, 1);
} else {
network.item.updateBestAP(network.accessPoints[0]);
@ -1109,7 +1110,7 @@ var NMWirelessDialog = class extends ModalDialog.ModalDialog {
this._itemBox.remove_all_children();
this._networks.forEach(network => {
this._itemBox.add_child(network.item.actor);
this._itemBox.add_child(network.item);
});
adjustment.value = scrollValue;
@ -1117,25 +1118,25 @@ var NMWirelessDialog = class extends ModalDialog.ModalDialog {
_selectNetwork(network) {
if (this._selectedNetwork)
this._selectedNetwork.item.actor.remove_style_pseudo_class('selected');
this._selectedNetwork.item.remove_style_pseudo_class('selected');
this._selectedNetwork = network;
this._updateSensitivity();
if (this._selectedNetwork)
this._selectedNetwork.item.actor.add_style_pseudo_class('selected');
this._selectedNetwork.item.add_style_pseudo_class('selected');
}
_createNetworkItem(network) {
network.item = new NMWirelessDialogItem(network);
network.item.setActive(network == this._selectedNetwork);
network.item.connect('selected', () => {
Util.ensureActorVisibleInScrollView(this._scrollView, network.item.actor);
Util.ensureActorVisibleInScrollView(this._scrollView, network.item);
this._selectNetwork(network);
});
network.item.actor.connect('destroy', () => {
network.item.connect('destroy', () => {
let keyFocus = global.stage.key_focus;
if (keyFocus && keyFocus.contains(network.item.actor))
if (keyFocus && keyFocus.contains(network.item))
this._itemBox.grab_key_focus();
});
}
@ -1261,7 +1262,7 @@ var NMDeviceWireless = class {
_sync() {
this._toggleItem.label.text = this._client.wireless_enabled ? _("Turn Off") : _("Turn On");
this._toggleItem.actor.visible = this._client.wireless_hardware_enabled;
this._toggleItem.visible = this._client.wireless_hardware_enabled;
this.item.icon.icon_name = this._getMenuIcon();
this.item.label.text = this._getStatus();
@ -1451,7 +1452,7 @@ var NMVpnSection = class extends NMConnectionSection {
_sync() {
let nItems = this._connectionItems.size;
this.item.actor.visible = (nItems > 0);
this.item.visible = (nItems > 0);
super._sync();
}
@ -1534,7 +1535,7 @@ var DeviceCategory = class extends PopupMenu.PopupMenuSection {
this._summaryItem.menu.addSettingsAction(_('Network Settings'),
'gnome-network-panel.desktop');
this._summaryItem.actor.hide();
this._summaryItem.hide();
}
@ -1543,7 +1544,7 @@ var DeviceCategory = class extends PopupMenu.PopupMenuSection {
(prev, child) => prev + (child.visible ? 1 : 0), 0);
this._summaryItem.label.text = this._getSummaryLabel(nDevices);
let shouldSummarize = nDevices > MAX_DEVICE_ITEMS;
this._summaryItem.actor.visible = shouldSummarize;
this._summaryItem.visible = shouldSummarize;
this.section.actor.visible = !shouldSummarize;
}
@ -1673,7 +1674,11 @@ var NMApplet = class extends PanelMenu.SystemIndicator {
_readDevices() {
let devices = this._client.get_devices() || [ ];
for (let i = 0; i < devices.length; ++i) {
this._deviceAdded(this._client, devices[i], true);
try {
this._deviceAdded(this._client, devices[i], true);
} catch (e) {
log(`Failed to add device ${devices[i]}: ${e}`);
}
}
this._syncDeviceNames();
}
@ -1726,14 +1731,24 @@ var NMApplet = class extends PanelMenu.SystemIndicator {
this._addDeviceWrapper(wrapper);
this._nmDevices.push(device);
if (!skipSyncDeviceNames)
this._syncDeviceNames();
this._deviceChanged(device, skipSyncDeviceNames);
if (wrapper instanceof NMConnectionSection) {
this._connections.forEach(connection => {
wrapper.checkConnection(connection);
});
}
device.connect('notify::interface', () => {
this._deviceChanged(device, false);
});
}
}
_deviceChanged(device, skipSyncDeviceNames) {
let wrapper = device._delegate;
if (!skipSyncDeviceNames)
this._syncDeviceNames();
if (wrapper instanceof NMConnectionSection) {
this._connections.forEach(connection => {
wrapper.checkConnection(connection);
});
}
}

View File

@ -61,6 +61,6 @@ var Indicator = class extends PanelMenu.SystemIndicator {
: _("Night Light On");
this._disableItem.label.text = disabled ? _("Resume")
: _("Disable Until Tomorrow");
this._item.actor.visible = this._indicator.visible = visible;
this._item.visible = this._indicator.visible = visible;
}
};

View File

@ -96,11 +96,11 @@ var Indicator = class extends PanelMenu.SystemIndicator {
// Do we have batteries or a UPS?
let visible = this._proxy.IsPresent;
if (visible) {
this._item.actor.show();
this._item.show();
this._percentageLabel.visible = this._desktopSettings.get_boolean(SHOW_BATTERY_PERCENTAGE);
} else {
// If there's no battery, then we use the power icon.
this._item.actor.hide();
this._item.hide();
this._indicator.icon_name = 'system-shutdown-symbolic';
this._percentageLabel.hide();
return;

View File

@ -53,10 +53,10 @@ var RemoteAccessApplet = class extends PanelMenu.SystemIndicator {
_sync() {
if (this._handles.size == 0) {
this._indicator.visible = false;
this._item.actor.visible = false;
this._item.visible = false;
} else {
this._indicator.visible = true;
this._item.actor.visible = true;
this._item.visible = true;
}
}

View File

@ -97,7 +97,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
let showAirplaneMode = this._manager.shouldShowAirplaneMode;
this._indicator.visible = (airplaneMode && showAirplaneMode);
this._item.actor.visible = (airplaneMode && showAirplaneMode);
this._item.visible = (airplaneMode && showAirplaneMode);
this._offItem.setSensitive(!hwAirplaneMode);
if (hwAirplaneMode)

View File

@ -116,10 +116,10 @@ var Indicator = class extends PanelMenu.SystemIndicator {
this._createSubMenu();
this._loginScreenItem.actor.connect('notify::visible',
() => { this._updateMultiUser(); });
this._logoutItem.actor.connect('notify::visible',
() => { this._updateMultiUser(); });
this._loginScreenItem.connect('notify::visible',
() => { this._updateMultiUser(); });
this._logoutItem.connect('notify::visible',
() => { this._updateMultiUser(); });
// Whether shutdown is available or not depends on both lockdown
// settings (disable-log-out) and Polkit policy - the latter doesn't
// notify, so we update the menu item each time the menu opens or
@ -142,7 +142,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
this._lockScreenAction.visible ||
this._altSwitcher.actor.visible);
this._actionsItem.actor.visible = visible;
this.buttonGroup.visible = visible;
}
_sessionUpdated() {
@ -150,10 +150,10 @@ var Indicator = class extends PanelMenu.SystemIndicator {
}
_updateMultiUser() {
let hasSwitchUser = this._loginScreenItem.actor.visible;
let hasLogout = this._logoutItem.actor.visible;
let hasSwitchUser = this._loginScreenItem.visible;
let hasLogout = this._logoutItem.visible;
this._switchUserSubMenu.actor.visible = hasSwitchUser || hasLogout;
this._switchUserSubMenu.visible = hasSwitchUser || hasLogout;
}
_updateSwitchUserSubMenu() {
@ -208,7 +208,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
this._switchUserSubMenu.menu.addMenuItem(item);
this._loginScreenItem = item;
this._systemActions.bind_property('can-switch-user',
this._loginScreenItem.actor,
this._loginScreenItem,
'visible',
bindFlags);
@ -220,7 +220,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
this._switchUserSubMenu.menu.addMenuItem(item);
this._logoutItem = item;
this._systemActions.bind_property('can-logout',
this._logoutItem.actor,
this._logoutItem,
'visible',
bindFlags);
@ -236,6 +236,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
item = new PopupMenu.PopupBaseMenuItem({ reactive: false,
can_focus: false });
this.buttonGroup = item;
let app = this._settingsApp = Shell.AppSystem.get_default().lookup_app(
'gnome-control-center.desktop'
@ -250,14 +251,14 @@ var Indicator = class extends PanelMenu.SystemIndicator {
log('Missing required core component Settings, expect trouble…');
this._settingsAction = new St.Widget();
}
item.actor.add(this._settingsAction, { expand: true, x_fill: false });
item.add(this._settingsAction, { expand: true, x_fill: false });
this._orientationLockAction = this._createActionButton('', _("Orientation Lock"));
this._orientationLockAction.connect('clicked', () => {
this.menu.itemActivated(BoxPointer.PopupAnimation.NONE),
this._systemActions.activateLockOrientation();
});
item.actor.add(this._orientationLockAction, { expand: true, x_fill: false });
item.add(this._orientationLockAction, { expand: true, x_fill: false });
this._systemActions.bind_property('can-lock-orientation',
this._orientationLockAction,
'visible',
@ -272,7 +273,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
this.menu.itemActivated(BoxPointer.PopupAnimation.NONE);
this._systemActions.activateLockScreen();
});
item.actor.add(this._lockScreenAction, { expand: true, x_fill: false });
item.add(this._lockScreenAction, { expand: true, x_fill: false });
this._systemActions.bind_property('can-lock-screen',
this._lockScreenAction,
'visible',
@ -299,9 +300,8 @@ var Indicator = class extends PanelMenu.SystemIndicator {
bindFlags);
this._altSwitcher = new AltSwitcher(this._powerOffAction, this._suspendAction);
item.actor.add(this._altSwitcher.actor, { expand: true, x_fill: false });
item.add(this._altSwitcher.actor, { expand: true, x_fill: false });
this._actionsItem = item;
this.menu.addMenuItem(item);

View File

@ -41,12 +41,12 @@ var StreamSlider = class {
this._slider.connect('drag-end', this._notifyVolumeChange.bind(this));
this._icon = new St.Icon({ style_class: 'popup-menu-icon' });
this.item.actor.add(this._icon);
this.item.actor.add(this._slider.actor, { expand: true });
this.item.actor.connect('button-press-event', (actor, event) => {
this.item.add(this._icon);
this.item.add(this._slider.actor, { expand: true });
this.item.connect('button-press-event', (actor, event) => {
return this._slider.startDragging(event);
});
this.item.actor.connect('key-press-event', (actor, event) => {
this.item.connect('key-press-event', (actor, event) => {
return this._slider.onKeyPressEvent(actor, event);
});
@ -93,7 +93,7 @@ var StreamSlider = class {
_updateVisibility() {
let visible = this._shouldBeVisible();
this.item.actor.visible = visible;
this.item.visible = visible;
}
scroll(event) {

View File

@ -30,12 +30,10 @@ function primaryModifier(mask) {
return primary;
}
var SwitcherPopup = GObject.registerClass(
class SwitcherPopup extends St.Widget {
var SwitcherPopup = GObject.registerClass({
GTypeFlags: GObject.TypeFlags.ABSTRACT
}, class SwitcherPopup extends St.Widget {
_init(items) {
if (new.target === SwitcherPopup)
throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
super._init({ style_class: 'switcher-popup',
reactive: true,
visible: false });
@ -164,7 +162,7 @@ class SwitcherPopup extends St.Widget {
}
_keyPressHandler(keysym, action) {
throw new Error('Not implemented');
throw new GObject.NotImplementedError(`_keyPressHandler in ${this.constructor.name}`);
}
_keyPressEvent(actor, event) {

View File

@ -152,7 +152,7 @@ function registerSpecialPropertySplitter(name, splitFunction, parameters) {
// Tweener to a Clutter.TimeLine. Now, Clutter.Timeline itself isn't a
// whole lot more sophisticated than a simple timeout at a fixed frame
// rate, but at least it knows how to drop frames. (See
// HippoAnimationManager for a more sophisticated view of continous
// HippoAnimationManager for a more sophisticated view of continuous
// time updates; even better is to pay attention to the vertical
// vblank and sync to that when possible.)
//

View File

@ -46,15 +46,14 @@ var Avatar = class {
if (iconFile) {
let file = Gio.File.new_for_path(iconFile);
this.actor.child = null;
this.actor.style = 'background-image: url("%s");'.format(iconFile);
this.actor.style = `
background-image: url("${iconFile}");
background-size: ${this._iconSize}px`;
} else {
this.actor.style = null;
this.actor.child = new St.Icon({ icon_name: 'avatar-default-symbolic',
icon_size: this._iconSize });
}
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
this.actor.set_size(this._iconSize * scaleFactor, this._iconSize * scaleFactor);
}
};

View File

@ -59,7 +59,7 @@ var DisplayChangeDialog = class extends ModalDialog.ModalDialog {
{ x_fill: true,
y_fill: true });
/* Translators: this and the following message should be limited in lenght,
/* Translators: this and the following message should be limited in length,
to avoid ellipsizing the labels.
*/
this._cancelButton = this.addButton({ label: _("Revert Settings"),
@ -456,13 +456,28 @@ var TilePreview = class {
};
var TouchpadWorkspaceSwitchAction = class {
constructor(actor) {
constructor(actor, allowedModes) {
this._allowedModes = allowedModes;
this._dx = 0;
this._dy = 0;
this._enabled = true;
actor.connect('captured-event', this._handleEvent.bind(this));
this._touchpadSettings = new Gio.Settings({schema_id: 'org.gnome.desktop.peripherals.touchpad'});
}
get enabled() {
return this._enabled;
}
set enabled(enabled) {
if (this._enabled == enabled)
return;
this._enabled = enabled;
if (!enabled)
this.emit('cancel');
}
_checkActivated() {
let dir;
@ -482,15 +497,16 @@ var TouchpadWorkspaceSwitchAction = class {
}
_handleEvent(actor, event) {
let allowedModes = Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW;
if (event.type() != Clutter.EventType.TOUCHPAD_SWIPE)
return Clutter.EVENT_PROPAGATE;
if (event.get_touchpad_gesture_finger_count() != 4)
return Clutter.EVENT_PROPAGATE;
if ((allowedModes & Main.actionMode) == 0)
if ((this._allowedModes & Main.actionMode) == 0)
return Clutter.EVENT_PROPAGATE;
if (!this._enabled)
return Clutter.EVENT_PROPAGATE;
if (event.get_gesture_phase() == Clutter.TouchpadGesturePhase.UPDATE) {
@ -523,10 +539,11 @@ var WorkspaceSwitchAction = GObject.registerClass({
'motion': { param_types: [GObject.TYPE_DOUBLE, GObject.TYPE_DOUBLE] },
'cancel': { param_types: [] }},
}, class WorkspaceSwitchAction extends Clutter.SwipeAction {
_init() {
_init(allowedModes) {
super._init();
this.set_n_touch_points(4);
this._swept = false;
this._allowedModes = allowedModes;
global.display.connect('grab-op-begin', () => {
this.cancel();
@ -534,14 +551,12 @@ var WorkspaceSwitchAction = GObject.registerClass({
}
vfunc_gesture_prepare(actor) {
let allowedModes = Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW;
this._swept = false;
if (!super.vfunc_gesture_prepare(actor))
return false;
return (allowedModes & Main.actionMode);
return (this._allowedModes & Main.actionMode);
}
vfunc_gesture_progress(actor) {
@ -1043,14 +1058,15 @@ var WindowManager = class {
global.workspace_manager.override_workspace_layout(Meta.DisplayCorner.TOPLEFT,
false, -1, 1);
let gesture = new WorkspaceSwitchAction();
let allowedModes = Shell.ActionMode.NORMAL;
let gesture = new WorkspaceSwitchAction(allowedModes);
gesture.connect('motion', this._switchWorkspaceMotion.bind(this));
gesture.connect('activated', this._actionSwitchWorkspace.bind(this));
gesture.connect('cancel', this._switchWorkspaceCancel.bind(this));
global.stage.add_action(gesture);
// This is not a normal Clutter.GestureAction, doesn't need add_action()
gesture = new TouchpadWorkspaceSwitchAction(global.stage);
gesture = new TouchpadWorkspaceSwitchAction(global.stage, allowedModes);
gesture.connect('motion', this._switchWorkspaceMotion.bind(this));
gesture.connect('activated', this._actionSwitchWorkspace.bind(this));
gesture.connect('cancel', this._switchWorkspaceCancel.bind(this));
@ -1202,6 +1218,10 @@ var WindowManager = class {
// Same for OR windows
if (window.is_override_redirect())
return;
// Sticky windows don't need moving, in fact moving would
// unstick them
if (window.on_all_workspaces)
return;
// Windows on workspaces below pos don't need moving
let index = window.get_workspace().index();
if (index < pos)
@ -1468,8 +1488,13 @@ var WindowManager = class {
if (this._clearAnimationInfo(actor))
this._shellwm.completed_size_change(actor);
let destroyId = actor.connect('destroy', () => {
this._clearAnimationInfo(actor);
});
actor.__animationInfo = { clone: actorClone,
oldRect: oldFrameRect };
oldRect: oldFrameRect,
destroyId: destroyId };
}
_sizeChangedWindow(shellwm, actor) {
@ -1530,6 +1555,7 @@ var WindowManager = class {
_clearAnimationInfo(actor) {
if (actor.__animationInfo) {
actor.__animationInfo.clone.destroy();
actor.disconnect(actor.__animationInfo.destroyId);
delete actor.__animationInfo;
return true;
}
@ -1844,17 +1870,25 @@ var WindowManager = class {
}
}
_getPositionForDirection(direction) {
_getPositionForDirection(direction, fromWs, toWs) {
let xDest = 0, yDest = 0;
let oldWsIsFullscreen = fromWs.list_windows().some(w => w.is_fullscreen());
let newWsIsFullscreen = toWs.list_windows().some(w => w.is_fullscreen());
// We have to shift windows up or down by the height of the panel to prevent having a
// visible gap between the windows while switching workspaces. Since fullscreen windows
// hide the panel, they don't need to be shifted up or down.
let shiftHeight = Main.panel.height;
if (direction == Meta.MotionDirection.UP ||
direction == Meta.MotionDirection.UP_LEFT ||
direction == Meta.MotionDirection.UP_RIGHT)
yDest = -global.screen_height + Main.panel.height;
yDest = -global.screen_height + (oldWsIsFullscreen ? 0 : shiftHeight);
else if (direction == Meta.MotionDirection.DOWN ||
direction == Meta.MotionDirection.DOWN_LEFT ||
direction == Meta.MotionDirection.DOWN_RIGHT)
yDest = global.screen_height - Main.panel.height;
yDest = global.screen_height - (newWsIsFullscreen ? 0 : shiftHeight);
if (direction == Meta.MotionDirection.LEFT ||
direction == Meta.MotionDirection.UP_LEFT ||
@ -1912,7 +1946,7 @@ var WindowManager = class {
switchData.container.add_actor(info.actor);
info.actor.raise_top();
let [x, y] = this._getPositionForDirection(dir);
let [x, y] = this._getPositionForDirection(dir, curWs, ws);
info.actor.set_position(x, y);
}
@ -1998,7 +2032,11 @@ var WindowManager = class {
this._switchData.inProgress = true;
let [xDest, yDest] = this._getPositionForDirection(direction);
let workspaceManager = global.workspace_manager;
let fromWs = workspaceManager.get_workspace_by_index(from);
let toWs = workspaceManager.get_workspace_by_index(to);
let [xDest, yDest] = this._getPositionForDirection(direction, fromWs, toWs);
/* @direction is the direction that the "camera" moves, so the
* screen contents have to move one screen's worth in the

View File

@ -173,7 +173,7 @@ var WindowMenu = class extends PopupMenu.PopupMenu {
var WindowMenuManager = class {
constructor() {
this._manager = new PopupMenu.PopupMenuManager({ actor: Main.layoutManager.dummyCursor });
this._manager = new PopupMenu.PopupMenuManager(Main.layoutManager.dummyCursor);
this._sourceActor = new St.Widget({ reactive: true, visible: false });
this._sourceActor.connect('button-press-event', () => {

View File

@ -786,8 +786,8 @@ var WindowPositionFlags = {
var LayoutStrategy = class {
constructor(monitor, rowSpacing, columnSpacing) {
if (new.target === LayoutStrategy)
throw new TypeError('Cannot instantiate abstract type ' + new.target.name);
if (this.constructor === LayoutStrategy)
throw new TypeError(`Cannot instantiate abstract type ${this.constructor.name}`);
this._monitor = monitor;
this._rowSpacing = rowSpacing;
@ -813,7 +813,7 @@ var LayoutStrategy = class {
}
// Computes and returns an individual scaling factor for @window,
// to be applied in addition to the overal layout scale.
// to be applied in addition to the overall layout scale.
_computeWindowScale(window) {
// Since we align windows next to each other, the height of the
// thumbnails is much more important to preserve than the width of
@ -835,7 +835,7 @@ var LayoutStrategy = class {
// (optionally) for each row in @layout.rows. This method is
// intended to be called by subclasses.
_computeRowSizes(layout) {
throw new Error('_computeRowSizes not implemented');
throw new GObject.NotImplementedError(`_computeRowSizes in ${this.constructor.name}`);
}
// Compute strategy-specific window slots for each window in
@ -848,7 +848,7 @@ var LayoutStrategy = class {
// * gridHeight - The totial height used by the grid, unscaled, unspaced.
// * rows - A list of rows, which should be instantiated by _newRow.
computeLayout(windows, layout) {
throw new Error('computeLayout not implemented');
throw new GObject.NotImplementedError(`computeLayout in ${this.constructor.name}`);
}
// Given @layout, compute the overall scale and space of the layout.
@ -1266,7 +1266,7 @@ var Workspace = class {
}
// We will reposition windows anyway when enter again overview or when ending the windows
// animations whith fade animation.
// animations with fade animation.
// In this way we avoid unwanted animations of windows repositioning while
// animating overview.
if (this.leavingOverview || this._animatingWindowsFade)
@ -1886,10 +1886,10 @@ var Workspace = class {
// Win win -- better scale and better space
return true;
} else if (newLayout.scale > oldLayout.scale && newLayout.space <= oldLayout.space) {
// Keep new layout only if scale gain outweights aspect space loss
// Keep new layout only if scale gain outweighs aspect space loss
return scalePower > spacePower;
} else if (newLayout.scale <= oldLayout.scale && newLayout.space > oldLayout.space) {
// Keep new layout only if aspect space gain outweights scale loss
// Keep new layout only if aspect space gain outweighs scale loss
return spacePower > scalePower;
} else {
// Lose -- worse scale and space

View File

@ -85,8 +85,6 @@ class WorkspaceSwitcherPopup extends St.Widget {
height: global.screen_height,
style_class: 'workspace-switcher-group' });
this.actor = this;
Main.uiGroup.add_actor(this);
this._timeoutId = 0;
@ -142,7 +140,7 @@ class WorkspaceSwitcherPopup extends St.Widget {
time: ANIMATION_TIME,
transition: 'easeOutQuad'
});
this.actor.show();
this.show();
}
display(direction, activeWorkspaceIndex) {

View File

@ -601,8 +601,7 @@ class ThumbnailsBox extends St.Widget {
style_class: 'workspace-thumbnails',
request_mode: Clutter.RequestMode.WIDTH_FOR_HEIGHT });
this.actor = this;
this.actor._delegate = this;
this._delegate = this;
let indicator = new St.Bin({ style_class: 'workspace-thumbnail-indicator' });

View File

@ -1,10 +1,11 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const { Clutter, Gio, GObject, Meta, St } = imports.gi;
const { Clutter, Gio, GObject, Meta, Shell, St } = imports.gi;
const Signals = imports.signals;
const Main = imports.ui.main;
const Tweener = imports.ui.tweener;
const WindowManager = imports.ui.windowManager;
const Workspace = imports.ui.workspace;
var WORKSPACE_SWITCH_TIME = 0.25;
@ -82,7 +83,8 @@ var WorkspacesView = class extends WorkspacesViewBase {
this._animating = false; // tweening
this._scrolling = false; // swipe-scrolling
this._animatingScroll = false; // programatically updating the adjustment
this._gestureActive = false; // touch(pad) gestures
this._animatingScroll = false; // programmatically updating the adjustment
let activeWorkspaceIndex = workspaceManager.get_active_workspace_index();
this.scrollAdjustment = new St.Adjustment({ value: activeWorkspaceIndex,
@ -211,7 +213,7 @@ var WorkspacesView = class extends WorkspacesViewBase {
for (let w = 0; w < this._workspaces.length; w++) {
let workspace = this._workspaces[w];
if (this._animating || this._scrolling) {
if (this._animating || this._scrolling || this._gestureActive) {
workspace.actor.show();
} else {
if (this._inDrag)
@ -223,7 +225,7 @@ var WorkspacesView = class extends WorkspacesViewBase {
}
_updateScrollAdjustment(index) {
if (this._scrolling)
if (this._scrolling || this._gestureActive)
return;
this._animatingScroll = true;
@ -300,6 +302,18 @@ var WorkspacesView = class extends WorkspacesViewBase {
this._updateVisibility();
}
startTouchGesture() {
this._gestureActive = true;
}
endTouchGesture() {
this._gestureActive = false;
// Make sure title captions etc are shown as necessary
this._scrollToActive();
this._updateVisibility();
}
// sync the workspaces' positions to the value of the scroll adjustment
// and change the active workspace if appropriate
_onScroll(adj) {
@ -310,7 +324,7 @@ var WorkspacesView = class extends WorkspacesViewBase {
let active = workspaceManager.get_active_workspace_index();
let current = Math.round(adj.value);
if (active != current) {
if (active != current && !this._gestureActive) {
if (!this._workspaces[current]) {
// The current workspace was destroyed. This could happen
// when you are on the last empty workspace, and consolidate
@ -391,6 +405,12 @@ var ExtraWorkspaceView = class extends WorkspacesViewBase {
endSwipeScroll() {
}
startTouchGesture() {
}
endTouchGesture() {
}
};
var DelegateFocusNavigator = GObject.registerClass(
@ -430,35 +450,46 @@ var WorkspacesDisplay = class {
return false;
}
for (let i = 0; i < this._workspacesViews.length; i++)
this._workspacesViews[i].startSwipeScroll();
this._startSwipeScroll();
return true;
});
panAction.connect('gesture-cancel', () => {
clickAction.release();
for (let i = 0; i < this._workspacesViews.length; i++)
this._workspacesViews[i].endSwipeScroll();
this._endSwipeScroll();
});
panAction.connect('gesture-end', () => {
clickAction.release();
for (let i = 0; i < this._workspacesViews.length; i++)
this._workspacesViews[i].endSwipeScroll();
this._endSwipeScroll();
});
Main.overview.addAction(panAction);
this.actor.bind_property('mapped', panAction, 'enabled', GObject.BindingFlags.SYNC_CREATE);
let allowedModes = Shell.ActionMode.OVERVIEW;
let switchGesture = new WindowManager.WorkspaceSwitchAction(allowedModes);
switchGesture.connect('motion', this._onSwitchWorkspaceMotion.bind(this));
switchGesture.connect('activated', this._onSwitchWorkspaceActivated.bind(this));
switchGesture.connect('cancel', this._endTouchGesture.bind(this));
Main.overview.addAction(switchGesture);
this.actor.bind_property('mapped', switchGesture, 'enabled', GObject.BindingFlags.SYNC_CREATE);
switchGesture = new WindowManager.TouchpadWorkspaceSwitchAction(global.stage, allowedModes);
switchGesture.connect('motion', this._onSwitchWorkspaceMotion.bind(this));
switchGesture.connect('activated', this._onSwitchWorkspaceActivated.bind(this));
switchGesture.connect('cancel', this._endTouchGesture.bind(this));
this.actor.connect('notify::mapped', () => {
switchGesture.enabled = this.actor.mapped;
});
this._primaryIndex = Main.layoutManager.primaryIndex;
this._workspacesViews = [];
this._primaryScrollAdjustment = null;
switchGesture.enabled = this.actor.mapped;
this._settings = new Gio.Settings({ schema_id: MUTTER_SCHEMA });
this._settings.connect('changed::workspaces-only-on-primary',
this._workspacesOnlyOnPrimaryChanged.bind(this));
this._workspacesOnlyOnPrimaryChanged();
this._switchWorkspaceNotifyId = 0;
this._notifyOpacityId = 0;
this._restackedNotifyId = 0;
this._scrollEventId = 0;
@ -474,6 +505,47 @@ var WorkspacesDisplay = class {
return false;
}
_startSwipeScroll() {
for (let i = 0; i < this._workspacesViews.length; i++)
this._workspacesViews[i].startSwipeScroll();
}
_endSwipeScroll() {
for (let i = 0; i < this._workspacesViews.length; i++)
this._workspacesViews[i].endSwipeScroll();
}
_startTouchGesture() {
for (let i = 0; i < this._workspacesViews.length; i++)
this._workspacesViews[i].startTouchGesture();
}
_endTouchGesture() {
for (let i = 0; i < this._workspacesViews.length; i++)
this._workspacesViews[i].endTouchGesture();
}
_onSwitchWorkspaceMotion(action, xRel, yRel) {
// We don't have a way to hook into start of touchpad actions,
// luckily this is safe to call repeatedly.
this._startTouchGesture();
let workspaceManager = global.workspace_manager;
let active = workspaceManager.get_active_workspace_index();
let adjustment = this._scrollAdjustment;
adjustment.value = (active - yRel / this.actor.height) * adjustment.page_size;
}
_onSwitchWorkspaceActivated(action, direction) {
let workspaceManager = global.workspace_manager;
let activeWorkspace = workspaceManager.get_active_workspace();
let newWs = activeWorkspace.get_neighbor(direction);
if (newWs != activeWorkspace)
newWs.activate(global.get_current_time());
this._endTouchGesture();
}
navigateFocus(from, direction) {
return this._getPrimaryView().actor.navigate_focus(from, direction, false);
}

View File

@ -1,5 +1,5 @@
project('gnome-shell', 'c',
version: '3.32.0',
version: '3.33.2',
meson_version: '>= 0.47.0',
license: 'GPLv2+'
)
@ -14,16 +14,16 @@ cogl_pango_pc = 'mutter-cogl-pango-' + mutter_api_version
libmutter_pc = 'libmutter-' + mutter_api_version
croco_req = '>= 0.6.8'
ecal_req = '>= 3.5.3'
ecal_req = '>= 3.33.1'
eds_req = '>= 3.17.2'
gcr_req = '>= 3.7.5'
gdesktop_req = '>= 3.7.90'
gio_req = '>= 2.56.0'
gi_req = '>= 1.49.1'
gjs_req = '>= 1.54.0'
gjs_req = '>= 1.57.2'
gtk_req = '>= 3.15.0'
json_glib_req = '>= 0.13.2'
mutter_req = '>= 3.32.0'
mutter_req = '>= 3.33.2'
polkit_req = '>= 0.100'
schemas_req = '>= 3.27.90'
startup_req = '>= 0.11'
@ -73,7 +73,7 @@ else
endif
atk_bridge_dep = dependency('atk-bridge-2.0')
ecal_dep = dependency('libecal-1.2', version: ecal_req)
ecal_dep = dependency('libecal-2.0', version: ecal_req)
eds_dep = dependency('libedataserver-1.2', version: eds_req)
gcr_dep = dependency('gcr-base-3', version: gcr_req)
gdk_x11_dep = dependency('gdk-x11-3.0')
@ -167,6 +167,48 @@ cdata.set('HAVE_FDWALK',
cc.has_function('fdwalk')
)
all_warnings = [
'-fno-strict-aliasing',
'-Wpointer-arith',
'-Wmissing-declarations',
'-Wimplicit-function-declaration',
'-Wformat=2',
'-Wformat-nonliteral',
'-Wformat-security',
'-Wstrict-prototypes',
'-Wmissing-prototypes',
'-Wnested-externs',
'-Wold-style-definition',
'-Wundef',
'-Wunused',
'-Wcast-align',
'-Wmissing-noreturn',
'-Wmissing-format-attribute',
'-Wmissing-include-dirs',
'-Wlogical-op',
'-Wignored-qualifiers',
'-Werror=redundant-decls',
'-Werror=implicit',
'-Werror=nonnull',
'-Werror=init-self',
'-Werror=main',
'-Werror=missing-braces',
'-Werror=sequence-point',
'-Werror=return-type',
'-Werror=trigraphs',
'-Werror=array-bounds',
'-Werror=write-strings',
'-Werror=address',
'-Werror=int-to-pointer-cast',
'-Werror=pointer-to-int-cast',
'-Werror=empty-body',
'-Werror=write-strings',
]
supported_warnings = cc.get_supported_arguments(all_warnings)
add_project_arguments(supported_warnings, language: 'c')
config_h = configure_file(
input: 'config.h.meson',
output: 'config.h',

1038
po/ar.po

File diff suppressed because it is too large Load Diff

128
po/de.po
View File

@ -16,14 +16,14 @@
# Benjamin Steinwender <b@stbe.at>, 2013-2014.
# Bernd Homuth <dev@hmt.im>, 2014-2015, 2016, 2019.
# Franco Della-Monica <franco.della.monica@gmail.com>, 2016.
# Tim Sabsch <tim@sabsch.com>, 2018.
# Tim Sabsch <tim@sabsch.com>, 2018-2019.
#
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2019-03-02 19:56+0000\n"
"PO-Revision-Date: 2019-03-02 21:13+0100\n"
"POT-Creation-Date: 2019-05-08 10:16+0000\n"
"PO-Revision-Date: 2019-05-12 12:36+0200\n"
"Last-Translator: Tim Sabsch <tim@sabsch.com>\n"
"Language-Team: Deutsch <gnome-de@gnome.org>\n"
"Language: de\n"
@ -390,11 +390,6 @@ msgstr ""
msgid "Network Login"
msgstr "Netzwerkanmeldung"
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9
msgid "network-workgroup"
msgstr "network-workgroup"
#: js/extensionPrefs/main.js:116
msgid "Somethings gone wrong"
msgstr "Etwas ist schiefgelaufen"
@ -542,7 +537,7 @@ msgstr "abmelden;verlassen"
#: js/misc/systemActions.js:109
msgctxt "search-result"
msgid "Suspend"
msgstr "In Bereitschaft versetzen"
msgstr "Bereitschaft"
#. Translators: A list of keywords that match the suspend action, separated by semicolons
#: js/misc/systemActions.js:112
@ -762,12 +757,12 @@ msgstr "Zu Favoriten hinzufügen"
msgid "Show Details"
msgstr "Details anzeigen"
#: js/ui/appFavorites.js:141
#: js/ui/appFavorites.js:149
#, javascript-format
msgid "%s has been added to your favorites."
msgstr "%s wurde zu Ihren Favoriten hinzugefügt"
#: js/ui/appFavorites.js:175
#: js/ui/appFavorites.js:183
#, javascript-format
msgid "%s has been removed from your favorites."
msgstr "%s wurde aus Ihren Favoriten entfernt"
@ -1053,7 +1048,7 @@ msgstr "Passwort der mobilen Breitbandverbindung"
msgid "A password is required to connect to “%s”."
msgstr "Es wird ein Passwort benötigt, um sich mit »%s« zu verbinden."
#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665
#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1664
msgid "Network Manager"
msgstr "Netzwerk-Verwaltung"
@ -1125,23 +1120,23 @@ msgstr "Weltuhren hinzufügen …"
msgid "World Clocks"
msgstr "Weltuhren"
#: js/ui/dateMenu.js:222
#: js/ui/dateMenu.js:228
msgid "Weather"
msgstr "Wetter"
#: js/ui/dateMenu.js:305
#: js/ui/dateMenu.js:311
msgid "Select a location…"
msgstr "Ort auswählen …"
#: js/ui/dateMenu.js:313
#: js/ui/dateMenu.js:319
msgid "Loading…"
msgstr "Wird geladen …"
#: js/ui/dateMenu.js:323
#: js/ui/dateMenu.js:329
msgid "Go online for weather information"
msgstr "Gehen Sie Online, um Wetterinformationen beziehen zu können"
#: js/ui/dateMenu.js:325
#: js/ui/dateMenu.js:331
msgid "Weather information is currently unavailable"
msgstr "Wetterinformationen sind momentan nicht verfügbar"
@ -1304,26 +1299,26 @@ msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "»%s« von extensions.gnome.org herunterladen und installieren?"
#. Translators: %s is an application name like "Settings"
#: js/ui/inhibitShortcutsDialog.js:50
#: js/ui/inhibitShortcutsDialog.js:78
#, javascript-format
msgid "%s wants to inhibit shortcuts"
msgstr "%s möchte Tastenkombinationen sperren"
#: js/ui/inhibitShortcutsDialog.js:51
#: js/ui/inhibitShortcutsDialog.js:79
msgid "Application wants to inhibit shortcuts"
msgstr "Die Anwendung möchte Tastenkombinationen sperren"
#. Translators: %s is a keyboard shortcut like "Super+x"
#: js/ui/inhibitShortcutsDialog.js:60
#: js/ui/inhibitShortcutsDialog.js:88
#, javascript-format
msgid "You can restore shortcuts by pressing %s."
msgstr "Sie können Tastenkombinationen durch Drücken von %s wiederherstellen."
#: js/ui/inhibitShortcutsDialog.js:65
#: js/ui/inhibitShortcutsDialog.js:93
msgid "Deny"
msgstr "Ablehnen"
#: js/ui/inhibitShortcutsDialog.js:71
#: js/ui/inhibitShortcutsDialog.js:100
msgid "Allow"
msgstr "Zulassen"
@ -1376,13 +1371,13 @@ msgid "Leave On"
msgstr "Eingeschaltet lassen"
#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133
#: js/ui/status/network.js:1264
#: js/ui/status/network.js:1263
msgid "Turn On"
msgstr "Einschalten"
#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133
#: js/ui/status/network.js:128 js/ui/status/network.js:310
#: js/ui/status/network.js:1264 js/ui/status/network.js:1376
#: js/ui/status/network.js:1263 js/ui/status/network.js:1375
#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79
#: js/ui/status/rfkill.js:106
msgid "Turn Off"
@ -1392,7 +1387,7 @@ msgstr "Ausschalten"
msgid "Leave Off"
msgstr "Ausgeschaltet lassen"
#: js/ui/keyboard.js:203
#: js/ui/keyboard.js:200
msgid "Region & Language Settings"
msgstr "Regions- und Spracheinstellungen"
@ -1444,7 +1439,7 @@ msgstr "Quelle zeigen"
msgid "Web Page"
msgstr "Webseite"
#: js/ui/messageTray.js:1474
#: js/ui/messageTray.js:1480
msgid "System Information"
msgstr "Systeminformationen"
@ -1528,11 +1523,11 @@ msgstr "Beenden"
#. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview".
#: js/ui/panel.js:471
#: js/ui/panel.js:470
msgid "Activities"
msgstr "Aktivitäten"
#: js/ui/panel.js:746
#: js/ui/panel.js:745
msgctxt "System menu in the top bar"
msgid "System"
msgstr "System"
@ -1541,15 +1536,6 @@ msgstr "System"
msgid "Top Bar"
msgstr "Oberes Panel"
#. Translators: this MUST be either "toggle-switch-us"
#. (for toggle switches containing the English words
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches.
#: js/ui/popupMenu.js:285
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
#: js/ui/runDialog.js:64
msgid "Enter a Command"
msgstr "Bitte geben Sie einen Befehl ein"
@ -1589,7 +1575,7 @@ msgid_plural "%d new notifications"
msgstr[0] "%d neue Benachrichtigung"
msgstr[1] "%d neue Benachrichtigungen"
#: js/ui/screenShield.js:449 js/ui/status/system.js:270
#: js/ui/screenShield.js:449 js/ui/status/system.js:271
msgid "Lock"
msgstr "Sperren"
@ -1604,11 +1590,11 @@ msgstr "GNOME muss den Bildschirm sperren"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: js/ui/screenShield.js:834 js/ui/screenShield.js:1307
#: js/ui/screenShield.js:826 js/ui/screenShield.js:1299
msgid "Unable to lock"
msgstr "Sperrung fehlgeschlagen"
#: js/ui/screenShield.js:835 js/ui/screenShield.js:1308
#: js/ui/screenShield.js:827 js/ui/screenShield.js:1300
msgid "Lock was blocked by an application"
msgstr "Sperrung wurde von einer Anwendung blockiert"
@ -1772,7 +1758,7 @@ msgid "<unknown>"
msgstr "<Unbekannt>"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:416 js/ui/status/network.js:1293
#: js/ui/status/network.js:416 js/ui/status/network.js:1292
#, javascript-format
msgid "%s Off"
msgstr "%s ausgeschaltet"
@ -1798,7 +1784,7 @@ msgid "%s Disconnecting"
msgstr "%s wird getrennt"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:434 js/ui/status/network.js:1285
#: js/ui/status/network.js:434 js/ui/status/network.js:1284
#, javascript-format
msgid "%s Connecting"
msgstr "%s wird verbunden"
@ -1838,7 +1824,7 @@ msgid "Mobile Broadband Settings"
msgstr "Einstellungen der mobilen Breitbandverbindung"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:553 js/ui/status/network.js:1290
#: js/ui/status/network.js:553 js/ui/status/network.js:1289
#, javascript-format
msgid "%s Hardware Disabled"
msgstr "%s-Hardware ausgeschaltet"
@ -1910,72 +1896,72 @@ msgid "Wi-Fi Settings"
msgstr "Drahtlosnetzwerk-Einstellungen"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1281
#: js/ui/status/network.js:1280
#, javascript-format
msgid "%s Hotspot Active"
msgstr "Hotspot %s eingeschaltet"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1296
#: js/ui/status/network.js:1295
#, javascript-format
msgid "%s Not Connected"
msgstr "%s nicht verbunden"
#: js/ui/status/network.js:1393
#: js/ui/status/network.js:1392
msgid "connecting…"
msgstr "Verbindungsaufbau …"
#. Translators: this is for network connections that require some kind of key or password
#: js/ui/status/network.js:1396
#: js/ui/status/network.js:1395
msgid "authentication required"
msgstr "Anmeldung erforderlich"
#: js/ui/status/network.js:1398
#: js/ui/status/network.js:1397
msgid "connection failed"
msgstr "Verbindung gescheitert"
#: js/ui/status/network.js:1448
#: js/ui/status/network.js:1447
msgid "VPN Settings"
msgstr "VPN-Einstellungen"
#: js/ui/status/network.js:1465
#: js/ui/status/network.js:1464
msgid "VPN"
msgstr "VPN"
#: js/ui/status/network.js:1475
#: js/ui/status/network.js:1474
msgid "VPN Off"
msgstr "VPN ausgeschaltet"
#: js/ui/status/network.js:1536 js/ui/status/rfkill.js:82
#: js/ui/status/network.js:1535 js/ui/status/rfkill.js:82
msgid "Network Settings"
msgstr "Netzwerkeinstellungen"
#: js/ui/status/network.js:1565
#: js/ui/status/network.js:1564
#, javascript-format
msgid "%s Wired Connection"
msgid_plural "%s Wired Connections"
msgstr[0] "%s Kabelverbindung"
msgstr[1] "%s Kabelverbindungen"
#: js/ui/status/network.js:1569
#: js/ui/status/network.js:1568
#, javascript-format
msgid "%s Wi-Fi Connection"
msgid_plural "%s Wi-Fi Connections"
msgstr[0] "%s Funknetzwerkverbindung"
msgstr[1] "%s Funknetzwerkverbindungen"
#: js/ui/status/network.js:1573
#: js/ui/status/network.js:1572
#, javascript-format
msgid "%s Modem Connection"
msgid_plural "%s Modem Connections"
msgstr[0] "%s Modem-Verbindung"
msgstr[1] "%s Modem-Verbindungen"
#: js/ui/status/network.js:1702
#: js/ui/status/network.js:1705
msgid "Connection failed"
msgstr "Verbindung gescheitert"
#: js/ui/status/network.js:1703
#: js/ui/status/network.js:1706
msgid "Activation of network connection failed"
msgstr "Aktivierung der Netzwerkverbindung ist gescheitert"
@ -2057,15 +2043,15 @@ msgstr "Abmelden"
msgid "Account Settings"
msgstr "Kontoeinstellungen"
#: js/ui/status/system.js:255
#: js/ui/status/system.js:256
msgid "Orientation Lock"
msgstr "Hoch-/Querformats-Fixierung"
#: js/ui/status/system.js:281
#: js/ui/status/system.js:282
msgid "Suspend"
msgstr "In Bereitschaft versetzen"
msgstr "Bereitschaft"
#: js/ui/status/system.js:291
#: js/ui/status/system.js:292
msgid "Power Off"
msgstr "Ausschalten"
@ -2183,7 +2169,7 @@ msgstr[1] ""
#. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height.
#: js/ui/windowManager.js:662
#: js/ui/windowManager.js:677
#, javascript-format
msgid "%d × %d"
msgstr "%d × %d"
@ -2256,11 +2242,6 @@ msgstr "Auf den Bildschirm nach rechts verschieben"
msgid "Evolution Calendar"
msgstr "Evolution-Kalender"
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
#: src/calendar-server/evolution-calendar.desktop.in:6
msgid "evolution"
msgstr "evolution"
#: src/main.c:408
msgid "Print version"
msgstr "Version ausgeben"
@ -2279,12 +2260,12 @@ msgstr ""
msgid "List possible modes"
msgstr "Die möglichen Modi auflisten"
#: src/shell-app.c:260
#: src/shell-app.c:264
msgctxt "program"
msgid "Unknown"
msgstr "Unbekannt"
#: src/shell-app.c:511
#: src/shell-app.c:515
#, c-format
msgid "Failed to launch “%s”"
msgstr "»%s« konnte nicht gestartet werden"
@ -2323,6 +2304,15 @@ msgstr[1] "%u Eingänge"
msgid "System Sounds"
msgstr "Systemklänge"
#~ msgid "network-workgroup"
#~ msgstr "network-workgroup"
#~ msgid "toggle-switch-us"
#~ msgstr "toggle-switch-intl"
#~ msgid "evolution"
#~ msgstr "evolution"
#~ msgid "There was an error loading the preferences dialog for %s:"
#~ msgstr ""
#~ "Beim Laden des Einstellungsdialogs für %s ist ein Fehler aufgetreten:"

File diff suppressed because it is too large Load Diff

224
po/eo.po
View File

@ -6,22 +6,22 @@
# Daniel PUENTES <blatberk@openmailbox.org>, 2015.
# Nicolas MAIA < >, 2015.
# Kristjan SCHMIDT <kristjan.schmidt@googlemail.com>, 2011, 2012, 2015, 2016, 2018.
# Carmen Bianca BAKKER <carmen@carmenbianca.eu>, 2018, 2019.
# Carmen Bianca BAKKER <carmen@carmenbianca.eu>, 2018-2019.
#
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2019-02-21 18:43+0000\n"
"PO-Revision-Date: 2019-02-22 13:19+0100\n"
"POT-Creation-Date: 2019-05-08 17:45+0000\n"
"PO-Revision-Date: 2019-05-09 20:12+0200\n"
"Last-Translator: Carmen Bianca BAKKER <carmen@carmenbianca.eu>\n"
"Language-Team: Esperanto <gnome-eo-list@gnome.org>\n"
"Language: eo\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.2.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"X-Generator: Gtranslator 3.32.0\n"
"X-DamnedLies-Scope: partial\n"
"X-Project-Style: gnome\n"
@ -185,8 +185,8 @@ msgstr "Klavkombino por malfermi la “Montri aplikaĵojn”-vidon"
msgid ""
"Keybinding to open the “Show Applications” view of the Activities Overview."
msgstr ""
"Klavkombino por malfermi la “Montri aplikaĵojn” vidon de la aktivecoj "
"superrigardo."
"Klavkombino por malfermi la “Montri aplikaĵojn” vidon de la Aktivecoj-"
"Superrigardo."
#: data/org.gnome.shell.gschema.xml.in:124
msgid "Keybinding to open the overview"
@ -194,7 +194,7 @@ msgstr "Klavkombino por malfermi la superrigardon"
#: data/org.gnome.shell.gschema.xml.in:125
msgid "Keybinding to open the Activities Overview."
msgstr "Klavkombino por malfermi la aktivecoj superrigardon."
msgstr "Klavkombino por malfermi la Aktivecoj-Superrigardon."
#: data/org.gnome.shell.gschema.xml.in:131
msgid "Keybinding to toggle the visibility of the notification list"
@ -334,11 +334,6 @@ msgstr "En musa reĝimo, prokrasti ŝanĝi fokuson ĝis la musmontrilo haltas"
msgid "Network Login"
msgstr "Reta saluto"
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9
msgid "network-workgroup"
msgstr "network-workgroup"
#: js/extensionPrefs/main.js:116
msgid "Somethings gone wrong"
msgstr "Io fiaskis"
@ -388,7 +383,7 @@ msgstr "Foliumi en Programaro"
#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136
#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188
#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888
#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:889
msgid "Cancel"
msgstr "Nuligi"
@ -419,7 +414,7 @@ msgstr "Ĉu ne en listo?"
#. Translators: this message is shown below the username entry field
#. to clue the user in on how to login to the local network realm
#: js/gdm/loginDialog.js:880
#: js/gdm/loginDialog.js:884
#, javascript-format
msgid "(e.g., user or %s)"
msgstr "(ekzemple, uzanto aŭ %s)"
@ -427,12 +422,12 @@ msgstr "(ekzemple, uzanto aŭ %s)"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: js/gdm/loginDialog.js:885 js/ui/components/networkAgent.js:243
#: js/gdm/loginDialog.js:889 js/ui/components/networkAgent.js:243
#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281
msgid "Username: "
msgstr "Uzantonomo: "
#: js/gdm/loginDialog.js:1223
#: js/gdm/loginDialog.js:1227
msgid "Login Window"
msgstr "Salutfenestro"
@ -686,32 +681,37 @@ msgstr "Oftaj"
msgid "All"
msgstr "Ĉiuj"
#: js/ui/appDisplay.js:1737 js/ui/panel.js:83
#. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:1713 js/ui/panel.js:79
msgid "Open Windows"
msgstr "Malfermaj fenestroj"
#: js/ui/appDisplay.js:1732 js/ui/panel.js:86
msgid "New Window"
msgstr "Nova fenestro"
#: js/ui/appDisplay.js:1751
#: js/ui/appDisplay.js:1746
msgid "Launch using Dedicated Graphics Card"
msgstr "Lanĉi uzante dediĉitan vidkarton"
#: js/ui/appDisplay.js:1778 js/ui/dash.js:239
#: js/ui/appDisplay.js:1773 js/ui/dash.js:239
msgid "Remove from Favorites"
msgstr "Forigi el preferataj"
#: js/ui/appDisplay.js:1784
#: js/ui/appDisplay.js:1779
msgid "Add to Favorites"
msgstr "Aldoni al preferataj"
#: js/ui/appDisplay.js:1794 js/ui/panel.js:94
#: js/ui/appDisplay.js:1789 js/ui/panel.js:97
msgid "Show Details"
msgstr "Montri detalojn"
#: js/ui/appFavorites.js:141
#: js/ui/appFavorites.js:149
#, javascript-format
msgid "%s has been added to your favorites."
msgstr "%s estas aldonita de via preferataj aplikaĵoj."
#: js/ui/appFavorites.js:175
#: js/ui/appFavorites.js:183
#, javascript-format
msgid "%s has been removed from your favorites."
msgstr "%s estas forigita de via preferataj aplikaĵoj."
@ -919,7 +919,7 @@ msgstr ""
"Alternative vi povas konekti per premi la “WPS”-butonon de via enkursigilo."
#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219
#: js/ui/status/network.js:309 js/ui/status/network.js:891
#: js/ui/status/network.js:310 js/ui/status/network.js:892
msgid "Connect"
msgstr "Konekti"
@ -949,7 +949,7 @@ msgstr "Servo: "
#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685
msgid "Authentication required by wireless network"
msgstr "Aŭtentigo estas bezonata de sendrata reto"
msgstr "Sendrata reto bezonas aŭtentigon"
#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686
#, javascript-format
@ -977,7 +977,7 @@ msgstr "PIN-kodo bezonata"
#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700
msgid "PIN code is needed for the mobile broadband device"
msgstr "PIN-kodo estas bezonata por la portebla larĝkapacita aparato"
msgstr "PIN-kodo necesas por la portebla larĝkapacita aparato"
#: js/ui/components/networkAgent.js:333
msgid "PIN: "
@ -991,7 +991,7 @@ msgstr "Portebla larĝkapacita retopasvorto"
#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707
#, javascript-format
msgid "A password is required to connect to “%s”."
msgstr "Pasvorto estas bezonata por konekti al “%s”."
msgstr "Pasvorto necesas por konekti al “%s”."
#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665
msgid "Network Manager"
@ -1065,23 +1065,23 @@ msgstr "Aldoni mondajn horloĝojn…"
msgid "World Clocks"
msgstr "Mondaj horloĝoj"
#: js/ui/dateMenu.js:222
#: js/ui/dateMenu.js:228
msgid "Weather"
msgstr "Vetero"
#: js/ui/dateMenu.js:305
#: js/ui/dateMenu.js:311
msgid "Select a location…"
msgstr "Elekti lokon…"
#: js/ui/dateMenu.js:313
#: js/ui/dateMenu.js:319
msgid "Loading…"
msgstr "Ŝargante…"
#: js/ui/dateMenu.js:323
#: js/ui/dateMenu.js:329
msgid "Go online for weather information"
msgstr "Enretigi por veterinformoj"
#: js/ui/dateMenu.js:325
#: js/ui/dateMenu.js:331
msgid "Weather information is currently unavailable"
msgstr "Veterinformoj ĉimomente nehaveblas"
@ -1240,26 +1240,26 @@ msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "Ĉu elŝuti kaj instali “%s” de extensions.gnome.org?"
#. Translators: %s is an application name like "Settings"
#: js/ui/inhibitShortcutsDialog.js:50
#: js/ui/inhibitShortcutsDialog.js:78
#, javascript-format
msgid "%s wants to inhibit shortcuts"
msgstr "%s volas malebligi klavkombinojn"
#: js/ui/inhibitShortcutsDialog.js:51
#: js/ui/inhibitShortcutsDialog.js:79
msgid "Application wants to inhibit shortcuts"
msgstr "Aplikaĵo volas malebligi klavkombinojn"
#. Translators: %s is a keyboard shortcut like "Super+x"
#: js/ui/inhibitShortcutsDialog.js:60
#: js/ui/inhibitShortcutsDialog.js:88
#, javascript-format
msgid "You can restore shortcuts by pressing %s."
msgstr "Vi povas restaŭri klavkombinojn per premi %s."
#: js/ui/inhibitShortcutsDialog.js:65
#: js/ui/inhibitShortcutsDialog.js:93
msgid "Deny"
msgstr "Rifuzi"
#: js/ui/inhibitShortcutsDialog.js:71
#: js/ui/inhibitShortcutsDialog.js:100
msgid "Allow"
msgstr "Akcepti"
@ -1315,7 +1315,7 @@ msgid "Turn On"
msgstr "Ŝalti"
#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133
#: js/ui/status/network.js:128 js/ui/status/network.js:310
#: js/ui/status/network.js:128 js/ui/status/network.js:311
#: js/ui/status/network.js:1264 js/ui/status/network.js:1376
#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79
#: js/ui/status/rfkill.js:106
@ -1326,59 +1326,59 @@ msgstr "Malŝalti"
msgid "Leave Off"
msgstr "Lasi malŝaltita"
#: js/ui/keyboard.js:203
#: js/ui/keyboard.js:200
msgid "Region & Language Settings"
msgstr "Regiono & lingvo agordoj"
#: js/ui/lookingGlass.js:614
#: js/ui/lookingGlass.js:615
msgid "No extensions installed"
msgstr "Neniu kromprogramo instalita"
#. Translators: argument is an extension UUID.
#: js/ui/lookingGlass.js:668
#: js/ui/lookingGlass.js:669
#, javascript-format
msgid "%s has not emitted any errors."
msgstr "%s ne eligintaj ajnaj eraroj."
#: js/ui/lookingGlass.js:674
#: js/ui/lookingGlass.js:675
msgid "Hide Errors"
msgstr "Kaŝi erarojn"
#: js/ui/lookingGlass.js:678 js/ui/lookingGlass.js:738
#: js/ui/lookingGlass.js:679 js/ui/lookingGlass.js:739
msgid "Show Errors"
msgstr "Montri erarojn"
#: js/ui/lookingGlass.js:687
#: js/ui/lookingGlass.js:688
msgid "Enabled"
msgstr "Enŝaltita"
#. translators:
#. * The device has been disabled
#: js/ui/lookingGlass.js:690 subprojects/gvc/gvc-mixer-control.c:1866
#: js/ui/lookingGlass.js:691 subprojects/gvc/gvc-mixer-control.c:1864
msgid "Disabled"
msgstr "Elŝaltita"
#: js/ui/lookingGlass.js:692
#: js/ui/lookingGlass.js:693
msgid "Error"
msgstr "Eraro"
#: js/ui/lookingGlass.js:694
#: js/ui/lookingGlass.js:695
msgid "Out of date"
msgstr "Neaktuala"
#: js/ui/lookingGlass.js:696
#: js/ui/lookingGlass.js:697
msgid "Downloading"
msgstr "Elŝutante"
#: js/ui/lookingGlass.js:720
#: js/ui/lookingGlass.js:721
msgid "View Source"
msgstr "Montri fonton"
#: js/ui/lookingGlass.js:729
#: js/ui/lookingGlass.js:730
msgid "Web Page"
msgstr "Retpaĝo"
#: js/ui/messageTray.js:1474
#: js/ui/messageTray.js:1479
msgid "System Information"
msgstr "Sisteminformoj"
@ -1404,13 +1404,14 @@ msgstr "Malfari"
msgid "Overview"
msgstr "Superrigardo"
# Imperativo
#. Translators: this is the text displayed
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
#: js/ui/overview.js:226
msgid "Type to search…"
msgstr "Tajpi por serĉi…"
msgstr "Tajpu por serĉi…"
#: js/ui/padOsd.js:92
msgid "New shortcut…"
@ -1456,17 +1457,17 @@ msgstr "Premu Esk-klavon por ĉesi"
msgid "Press any key to exit"
msgstr "Premu iun ajn klavon por ĉesi"
#: js/ui/panel.js:108
#: js/ui/panel.js:113
msgid "Quit"
msgstr "Ĉesi"
#. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview".
#: js/ui/panel.js:466
#: js/ui/panel.js:468
msgid "Activities"
msgstr "Aktivecoj"
#: js/ui/panel.js:741
#: js/ui/panel.js:743
msgctxt "System menu in the top bar"
msgid "System"
msgstr "Sistemo"
@ -1475,15 +1476,6 @@ msgstr "Sistemo"
msgid "Top Bar"
msgstr "Supra breto"
#. Translators: this MUST be either "toggle-switch-us"
#. (for toggle switches containing the English words
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches.
#: js/ui/popupMenu.js:285
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
#: js/ui/runDialog.js:64
msgid "Enter a Command"
msgstr "Enigu komandon"
@ -1520,7 +1512,7 @@ msgid_plural "%d new notifications"
msgstr[0] "%d nova sciigo"
msgstr[1] "%d novaj sciigoj"
#: js/ui/screenShield.js:449 js/ui/status/system.js:270
#: js/ui/screenShield.js:449 js/ui/status/system.js:271
msgid "Lock"
msgstr "Ŝlosi"
@ -1535,11 +1527,11 @@ msgstr "GNOME bezonas ŝlosi la ekranon"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: js/ui/screenShield.js:834 js/ui/screenShield.js:1307
#: js/ui/screenShield.js:826 js/ui/screenShield.js:1299
msgid "Unable to lock"
msgstr "Ne eblas ŝlosi"
#: js/ui/screenShield.js:835 js/ui/screenShield.js:1308
#: js/ui/screenShield.js:827 js/ui/screenShield.js:1300
msgid "Lock was blocked by an application"
msgstr "Ŝloso estis blokita de aplikaĵo"
@ -1618,11 +1610,11 @@ msgstr "Saltaj klavoj"
msgid "Mouse Keys"
msgstr "Musklavoj"
#: js/ui/status/accessibility.js:151
#: js/ui/status/accessibility.js:135
msgid "High Contrast"
msgstr "Alta kontrasto"
#: js/ui/status/accessibility.js:182
#: js/ui/status/accessibility.js:177
msgid "Large Text"
msgstr "Granda teksto"
@ -1630,7 +1622,7 @@ msgstr "Granda teksto"
msgid "Bluetooth"
msgstr "Bludento"
#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585
#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:586
msgid "Bluetooth Settings"
msgstr "Bludento-agordoj"
@ -1701,13 +1693,13 @@ msgid "<unknown>"
msgstr "<nekonata>"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:416 js/ui/status/network.js:1293
#: js/ui/status/network.js:417 js/ui/status/network.js:1293
#, javascript-format
msgid "%s Off"
msgstr "%s malŝaltita"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:419
#: js/ui/status/network.js:420
#, javascript-format
msgid "%s Connected"
msgstr "%s konektita"
@ -1715,119 +1707,119 @@ msgstr "%s konektita"
#. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu);
#. %s is a network identifier
#: js/ui/status/network.js:424
#: js/ui/status/network.js:425
#, javascript-format
msgid "%s Unmanaged"
msgstr "%s nemastrumita"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:427
#: js/ui/status/network.js:428
#, javascript-format
msgid "%s Disconnecting"
msgstr "%s malkonektante"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:434 js/ui/status/network.js:1285
#: js/ui/status/network.js:435 js/ui/status/network.js:1285
#, javascript-format
msgid "%s Connecting"
msgstr "%s konektante"
#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier
#: js/ui/status/network.js:437
#: js/ui/status/network.js:438
#, javascript-format
msgid "%s Requires Authentication"
msgstr "%s postulas aŭtentigon"
#. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing; %s is a network identifier
#: js/ui/status/network.js:445
#: js/ui/status/network.js:446
#, javascript-format
msgid "Firmware Missing For %s"
msgstr "Mikroprogramo mankas por %s"
#. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage; %s is a network identifier
#: js/ui/status/network.js:449
#: js/ui/status/network.js:450
#, javascript-format
msgid "%s Unavailable"
msgstr "%s nedisponebla"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:452
#: js/ui/status/network.js:453
#, javascript-format
msgid "%s Connection Failed"
msgstr "%s konekto malsukcesis"
#: js/ui/status/network.js:464
#: js/ui/status/network.js:465
msgid "Wired Settings"
msgstr "Drataj agordoj"
#: js/ui/status/network.js:506
#: js/ui/status/network.js:507
msgid "Mobile Broadband Settings"
msgstr "Porteblaj larĝkapacitaj agordoj"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:553 js/ui/status/network.js:1290
#: js/ui/status/network.js:554 js/ui/status/network.js:1290
#, javascript-format
msgid "%s Hardware Disabled"
msgstr "%s aparataro malŝaltita"
#. Translators: this is for a network device that cannot be activated
#. because it's disabled by rfkill (airplane mode); %s is a network identifier
#: js/ui/status/network.js:557
#: js/ui/status/network.js:558
#, javascript-format
msgid "%s Disabled"
msgstr "%s malŝaltita"
#: js/ui/status/network.js:597
#: js/ui/status/network.js:598
msgid "Connect to Internet"
msgstr "Konekti al interreto"
#: js/ui/status/network.js:786
#: js/ui/status/network.js:787
msgid "Airplane Mode is On"
msgstr "Aviadila reĝimo ŝaltita"
#: js/ui/status/network.js:787
#: js/ui/status/network.js:788
msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "Vifio malebliĝas se aviadila reĝimo estas ŝaltita."
#: js/ui/status/network.js:788
#: js/ui/status/network.js:789
msgid "Turn Off Airplane Mode"
msgstr "Malŝalti aviadilan reĝimon"
#: js/ui/status/network.js:797
#: js/ui/status/network.js:798
msgid "Wi-Fi is Off"
msgstr "Vifio malŝaltita"
#: js/ui/status/network.js:798
#: js/ui/status/network.js:799
msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr "Necesas ŝalti vifion por konekti al reto."
#: js/ui/status/network.js:799
#: js/ui/status/network.js:800
msgid "Turn On Wi-Fi"
msgstr "Ŝalti vifion"
#: js/ui/status/network.js:824
#: js/ui/status/network.js:825
msgid "Wi-Fi Networks"
msgstr "Vifiaj retoj"
#: js/ui/status/network.js:826
#: js/ui/status/network.js:827
msgid "Select a network"
msgstr "Elekti reton"
#: js/ui/status/network.js:855
#: js/ui/status/network.js:856
msgid "No Networks"
msgstr "Neniu reto"
#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104
#: js/ui/status/network.js:877 js/ui/status/rfkill.js:104
msgid "Use hardware switch to turn off"
msgstr "Uzi aparataran ŝaltilon por malŝalti"
#: js/ui/status/network.js:1152
#: js/ui/status/network.js:1153
msgid "Select Network"
msgstr "Elekti reton"
#: js/ui/status/network.js:1158
#: js/ui/status/network.js:1159
msgid "Wi-Fi Settings"
msgstr "Vifio-agordoj"
@ -1841,7 +1833,7 @@ msgstr "%s retkaptejo aktiva"
#: js/ui/status/network.js:1296
#, javascript-format
msgid "%s Not Connected"
msgstr "%s nekonektita"
msgstr "%s ne konektita"
#: js/ui/status/network.js:1393
msgid "connecting…"
@ -1893,11 +1885,11 @@ msgid_plural "%s Modem Connections"
msgstr[0] "%s modema konekto"
msgstr[1] "%s modemaj konektoj"
#: js/ui/status/network.js:1702
#: js/ui/status/network.js:1706
msgid "Connection failed"
msgstr "Konekto malsukcesis"
#: js/ui/status/network.js:1703
#: js/ui/status/network.js:1707
msgid "Activation of network connection failed"
msgstr "Aktivigo de reto-konekto malsukcesis"
@ -1979,15 +1971,15 @@ msgstr "Adiaŭi"
msgid "Account Settings"
msgstr "Kontoagordoj"
#: js/ui/status/system.js:255
#: js/ui/status/system.js:256
msgid "Orientation Lock"
msgstr "Orientiĝa ŝloso"
#: js/ui/status/system.js:281
#: js/ui/status/system.js:282
msgid "Suspend"
msgstr "Dormeti"
#: js/ui/status/system.js:291
#: js/ui/status/system.js:292
msgid "Power Off"
msgstr "Malŝalti"
@ -2102,7 +2094,7 @@ msgstr[1] "Agordaj ŝanĝoj malfaritos post %d sekundoj"
#. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height.
#: js/ui/windowManager.js:662
#: js/ui/windowManager.js:677
#, javascript-format
msgid "%d × %d"
msgstr "%d × %d"
@ -2175,11 +2167,6 @@ msgstr "Movi al dekstra ekrano"
msgid "Evolution Calendar"
msgstr "Evolucio-kalendaro"
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
#: src/calendar-server/evolution-calendar.desktop.in:6
msgid "evolution"
msgstr "evolution"
#: src/main.c:408
msgid "Print version"
msgstr "Presi version"
@ -2196,12 +2183,12 @@ msgstr "Uzi specifan reĝimon, ekz. “gdm” por la salut-ekrano"
msgid "List possible modes"
msgstr "Listigi eblajn reĝimojn"
#: src/shell-app.c:260
#: src/shell-app.c:264
msgctxt "program"
msgid "Unknown"
msgstr "Nekonata"
#: src/shell-app.c:511
#: src/shell-app.c:515
#, c-format
msgid "Failed to launch “%s”"
msgstr "Malsukcesis lanĉi “%s”"
@ -2220,7 +2207,7 @@ msgstr "La uzanto malakceptis la aŭtentigan dialogon"
#. translators:
#. * The number of sound outputs on a particular device
#: subprojects/gvc/gvc-mixer-control.c:1873
#: subprojects/gvc/gvc-mixer-control.c:1871
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
@ -2229,17 +2216,26 @@ msgstr[1] "%u eligoj"
#. translators:
#. * The number of sound inputs on a particular device
#: subprojects/gvc/gvc-mixer-control.c:1883
#: subprojects/gvc/gvc-mixer-control.c:1881
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
msgstr[0] "%u enigo"
msgstr[1] "%u enigoj"
#: subprojects/gvc/gvc-mixer-control.c:2738
#: subprojects/gvc/gvc-mixer-control.c:2736
msgid "System Sounds"
msgstr "Sistemsonoj"
#~ msgid "toggle-switch-us"
#~ msgstr "toggle-switch-intl"
#~ msgid "network-workgroup"
#~ msgstr "network-workgroup"
#~ msgid "evolution"
#~ msgstr "evolution"
#~ msgid "There was an error loading the preferences dialog for %s:"
#~ msgstr "Eraro okazis dum ŝarĝado de la agorda dialogo de %s:"

802
po/es.po

File diff suppressed because it is too large Load Diff

114
po/fr.po
View File

@ -14,23 +14,23 @@
# Alain Lojewski <allomervan@gmail.com>, 2014-2018.
# Erwan Georget <egeorget@opmbx.org>, 2016.
# Claude Paroz <claude@2xlibre.net>, 2010-2011, 2016.
# Charles Monzat <charles.monzat@numericable.fr>, 2016-2018.
# Julien Humbert <julroy67@gmail.com>, 2019.
# Charles Monzat <charles.monzat@free.fr>, 2016-2019.
#
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master fr\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2019-02-28 03:16+0000\n"
"PO-Revision-Date: 2019-02-28 08:29+0100\n"
"Last-Translator: Julien Humbert <julroy67@gmail.com>\n"
"Language-Team: français <gnomefr@traduc.org>\n"
"POT-Creation-Date: 2019-03-13 20:47+0000\n"
"PO-Revision-Date: 2019-03-17 19:15+0100\n"
"Last-Translator: Charles Monzat <charles.monzat@free.fr>\n"
"Language-Team: GNOME French Team <gnomefr@traduc.org>\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: Poedit 2.2.1\n"
"Plural-Forms: nplurals=2; plural=(n > 1)\n"
"X-Generator: Gtranslator 3.32.0\n"
#: data/50-gnome-shell-system.xml:6
msgid "System"
@ -482,7 +482,7 @@ msgstr "Absent de la liste ?"
#. Translators: this message is shown below the username entry field
#. to clue the user in on how to login to the local network realm
#: js/gdm/loginDialog.js:880
#: js/gdm/loginDialog.js:884
#, javascript-format
msgid "(e.g., user or %s)"
msgstr "(par ex. utilisateur ou %s)"
@ -490,12 +490,12 @@ msgstr "(par ex. utilisateur ou %s)"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: js/gdm/loginDialog.js:885 js/ui/components/networkAgent.js:243
#: js/gdm/loginDialog.js:889 js/ui/components/networkAgent.js:243
#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281
msgid "Username: "
msgstr "Nom dutilisateur : "
#: js/gdm/loginDialog.js:1223
#: js/gdm/loginDialog.js:1227
msgid "Login Window"
msgstr "Fenêtre de connexion"
@ -1075,7 +1075,7 @@ msgstr "Mot de passe de la connexion mobile"
msgid "A password is required to connect to “%s”."
msgstr "Un mot de passe est requis pour se connecter à « %s »."
#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665
#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1664
msgid "Network Manager"
msgstr "Gestionnaire de réseau"
@ -1335,26 +1335,26 @@ msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "Télécharger et installer « %s » à partir de extensions.gnome.org ?"
#. Translators: %s is an application name like "Settings"
#: js/ui/inhibitShortcutsDialog.js:50
#: js/ui/inhibitShortcutsDialog.js:78
#, javascript-format
msgid "%s wants to inhibit shortcuts"
msgstr "%s veut neutraliser les raccourcis"
#: js/ui/inhibitShortcutsDialog.js:51
#: js/ui/inhibitShortcutsDialog.js:79
msgid "Application wants to inhibit shortcuts"
msgstr "Lapplication veut neutraliser les raccourcis"
#. Translators: %s is a keyboard shortcut like "Super+x"
#: js/ui/inhibitShortcutsDialog.js:60
#: js/ui/inhibitShortcutsDialog.js:88
#, javascript-format
msgid "You can restore shortcuts by pressing %s."
msgstr "Pour restaurer les raccourcis, appuyez sur %s."
#: js/ui/inhibitShortcutsDialog.js:65
#: js/ui/inhibitShortcutsDialog.js:93
msgid "Deny"
msgstr "Refuser"
#: js/ui/inhibitShortcutsDialog.js:71
#: js/ui/inhibitShortcutsDialog.js:100
msgid "Allow"
msgstr "Autoriser"
@ -1407,13 +1407,13 @@ msgid "Leave On"
msgstr "Laisser activé"
#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133
#: js/ui/status/network.js:1264
#: js/ui/status/network.js:1263
msgid "Turn On"
msgstr "Activer"
#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133
#: js/ui/status/network.js:128 js/ui/status/network.js:310
#: js/ui/status/network.js:1264 js/ui/status/network.js:1376
#: js/ui/status/network.js:1263 js/ui/status/network.js:1375
#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79
#: js/ui/status/rfkill.js:106
msgid "Turn Off"
@ -1423,59 +1423,59 @@ msgstr "Éteindre"
msgid "Leave Off"
msgstr "Laisser éteint"
#: js/ui/keyboard.js:203
#: js/ui/keyboard.js:200
msgid "Region & Language Settings"
msgstr "Paramètres de langue et région"
#: js/ui/lookingGlass.js:614
#: js/ui/lookingGlass.js:615
msgid "No extensions installed"
msgstr "Aucune extension installée"
#. Translators: argument is an extension UUID.
#: js/ui/lookingGlass.js:668
#: js/ui/lookingGlass.js:669
#, javascript-format
msgid "%s has not emitted any errors."
msgstr "%s na émis aucune erreur."
#: js/ui/lookingGlass.js:674
#: js/ui/lookingGlass.js:675
msgid "Hide Errors"
msgstr "Masquer les erreurs"
#: js/ui/lookingGlass.js:678 js/ui/lookingGlass.js:738
#: js/ui/lookingGlass.js:679 js/ui/lookingGlass.js:739
msgid "Show Errors"
msgstr "Afficher les erreurs"
#: js/ui/lookingGlass.js:687
#: js/ui/lookingGlass.js:688
msgid "Enabled"
msgstr "Activé"
#. translators:
#. * The device has been disabled
#: js/ui/lookingGlass.js:690 subprojects/gvc/gvc-mixer-control.c:1866
#: js/ui/lookingGlass.js:691 subprojects/gvc/gvc-mixer-control.c:1864
msgid "Disabled"
msgstr "Désactivé"
#: js/ui/lookingGlass.js:692
#: js/ui/lookingGlass.js:693
msgid "Error"
msgstr "Erreur"
#: js/ui/lookingGlass.js:694
#: js/ui/lookingGlass.js:695
msgid "Out of date"
msgstr "Périmé"
#: js/ui/lookingGlass.js:696
#: js/ui/lookingGlass.js:697
msgid "Downloading"
msgstr "Téléchargement"
#: js/ui/lookingGlass.js:720
#: js/ui/lookingGlass.js:721
msgid "View Source"
msgstr "Afficher la source"
#: js/ui/lookingGlass.js:729
#: js/ui/lookingGlass.js:730
msgid "Web Page"
msgstr "Page Web"
#: js/ui/messageTray.js:1474
#: js/ui/messageTray.js:1480
msgid "System Information"
msgstr "Informations du système"
@ -1559,16 +1559,16 @@ msgstr "Quitter"
#. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview".
#: js/ui/panel.js:466
#: js/ui/panel.js:471
msgid "Activities"
msgstr "Activités"
#: js/ui/panel.js:741
#: js/ui/panel.js:746
msgctxt "System menu in the top bar"
msgid "System"
msgstr "Système"
#: js/ui/panel.js:861
#: js/ui/panel.js:866
msgid "Top Bar"
msgstr "Barre supérieure"
@ -1800,7 +1800,7 @@ msgid "<unknown>"
msgstr "<inconnu>"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:416 js/ui/status/network.js:1293
#: js/ui/status/network.js:416 js/ui/status/network.js:1292
#, javascript-format
msgid "%s Off"
msgstr "%s éteint"
@ -1826,7 +1826,7 @@ msgid "%s Disconnecting"
msgstr "Déconnexion de %s en cours"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:434 js/ui/status/network.js:1285
#: js/ui/status/network.js:434 js/ui/status/network.js:1284
#, javascript-format
msgid "%s Connecting"
msgstr "Connexion de %s en cours"
@ -1866,7 +1866,7 @@ msgid "Mobile Broadband Settings"
msgstr "Paramètres connexion mobile"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:553 js/ui/status/network.js:1290
#: js/ui/status/network.js:553 js/ui/status/network.js:1289
#, javascript-format
msgid "%s Hardware Disabled"
msgstr "Équipement %s désactivé"
@ -1931,72 +1931,72 @@ msgid "Wi-Fi Settings"
msgstr "Paramètres Wi-Fi"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1281
#: js/ui/status/network.js:1280
#, javascript-format
msgid "%s Hotspot Active"
msgstr "Point daccès %s actif"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1296
#: js/ui/status/network.js:1295
#, javascript-format
msgid "%s Not Connected"
msgstr "%s non connecté"
#: js/ui/status/network.js:1393
#: js/ui/status/network.js:1392
msgid "connecting…"
msgstr "connexion…"
#. Translators: this is for network connections that require some kind of key or password
#: js/ui/status/network.js:1396
#: js/ui/status/network.js:1395
msgid "authentication required"
msgstr "authentification nécessaire"
#: js/ui/status/network.js:1398
#: js/ui/status/network.js:1397
msgid "connection failed"
msgstr "échec de connexion"
#: js/ui/status/network.js:1448
#: js/ui/status/network.js:1447
msgid "VPN Settings"
msgstr "Paramètres VPN"
#: js/ui/status/network.js:1465
#: js/ui/status/network.js:1464
msgid "VPN"
msgstr "VPN"
#: js/ui/status/network.js:1475
#: js/ui/status/network.js:1474
msgid "VPN Off"
msgstr "VPN désactivé"
#: js/ui/status/network.js:1536 js/ui/status/rfkill.js:82
#: js/ui/status/network.js:1535 js/ui/status/rfkill.js:82
msgid "Network Settings"
msgstr "Paramètres du réseau"
#: js/ui/status/network.js:1565
#: js/ui/status/network.js:1564
#, javascript-format
msgid "%s Wired Connection"
msgid_plural "%s Wired Connections"
msgstr[0] "%s connexion filaire."
msgstr[1] "%s connexions filaires."
#: js/ui/status/network.js:1569
#: js/ui/status/network.js:1568
#, javascript-format
msgid "%s Wi-Fi Connection"
msgid_plural "%s Wi-Fi Connections"
msgstr[0] "%s connexion Wi-Fi."
msgstr[1] "%s connexions Wi-Fi."
#: js/ui/status/network.js:1573
#: js/ui/status/network.js:1572
#, javascript-format
msgid "%s Modem Connection"
msgid_plural "%s Modem Connections"
msgstr[0] "%s connexion à un modem."
msgstr[1] "%s connexions à des modems."
#: js/ui/status/network.js:1702
#: js/ui/status/network.js:1701
msgid "Connection failed"
msgstr "Échec de connexion"
#: js/ui/status/network.js:1703
#: js/ui/status/network.js:1702
msgid "Activation of network connection failed"
msgstr "Lactivation de la connexion réseau a échoué"
@ -2049,7 +2049,7 @@ msgstr "%d%02d avant chargement complet (%d %%)"
#: js/ui/status/power.js:117 js/ui/status/power.js:119
#, javascript-format
msgid "%d%%"
msgstr "%d%%"
msgstr "%d %%"
#: js/ui/status/remoteAccess.js:42
msgid "Screen is Being Shared"
@ -2298,12 +2298,12 @@ msgstr ""
msgid "List possible modes"
msgstr "Lister les modes possibles"
#: src/shell-app.c:260
#: src/shell-app.c:264
msgctxt "program"
msgid "Unknown"
msgstr "Inconnu"
#: src/shell-app.c:511
#: src/shell-app.c:515
#, c-format
msgid "Failed to launch “%s”"
msgstr "Impossible de lancer « %s »"
@ -2322,7 +2322,7 @@ msgstr "La fenêtre dauthentification a été écartée par lutilisateur"
#. translators:
#. * The number of sound outputs on a particular device
#: subprojects/gvc/gvc-mixer-control.c:1873
#: subprojects/gvc/gvc-mixer-control.c:1871
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
@ -2331,14 +2331,14 @@ msgstr[1] "%u sorties"
#. translators:
#. * The number of sound inputs on a particular device
#: subprojects/gvc/gvc-mixer-control.c:1883
#: subprojects/gvc/gvc-mixer-control.c:1881
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
msgstr[0] "%u entrée"
msgstr[1] "%u entrées"
#: subprojects/gvc/gvc-mixer-control.c:2738
#: subprojects/gvc/gvc-mixer-control.c:2736
msgid "System Sounds"
msgstr "Sons système"

783
po/fur.po

File diff suppressed because it is too large Load Diff

1520
po/hr.po

File diff suppressed because it is too large Load Diff

178
po/id.po
View File

@ -4,12 +4,13 @@
# Andika Triwidada <andika@gmail.com>, 2010-2014, 2017.
# Dirgita <dirgitadevina@yahoo.co.id>, 2011, 2012, 2014.
# Wibiharto <wibinem@yahoo.com>, 2011.
# Kukuh Syafaat <kukuhsyafaat@gnome.org>, 2017, 2018, 2019.
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2019-02-21 18:43+0000\n"
"PO-Revision-Date: 2019-02-14 22:18+0700\n"
"POT-Creation-Date: 2019-04-17 19:29+0000\n"
"PO-Revision-Date: 2019-04-25 14:54+0700\n"
"Last-Translator: Kukuh Syafaat <kukuhsyafaat@gnome.org>\n"
"Language-Team: Indonesian <gnome-l10n-id@googlegroups.com>\n"
"Language: id\n"
@ -376,11 +377,6 @@ msgstr ""
msgid "Network Login"
msgstr "Log Masuk Jaringan"
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9
msgid "network-workgroup"
msgstr "network-workgroup"
#: js/extensionPrefs/main.js:116
msgid "Somethings gone wrong"
msgstr "Ada yang tidak beres"
@ -461,7 +457,7 @@ msgstr "Tak masuk daftar?"
#. Translators: this message is shown below the username entry field
#. to clue the user in on how to login to the local network realm
#: js/gdm/loginDialog.js:880
#: js/gdm/loginDialog.js:884
#, javascript-format
msgid "(e.g., user or %s)"
msgstr "(cth., pengguna dari %s)"
@ -469,12 +465,12 @@ msgstr "(cth., pengguna dari %s)"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: js/gdm/loginDialog.js:885 js/ui/components/networkAgent.js:243
#: js/gdm/loginDialog.js:889 js/ui/components/networkAgent.js:243
#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281
msgid "Username: "
msgstr "Nama pengguna: "
#: js/gdm/loginDialog.js:1223
#: js/gdm/loginDialog.js:1227
msgid "Login Window"
msgstr "Jendela Log Masuk"
@ -728,32 +724,37 @@ msgstr "Sering"
msgid "All"
msgstr "Semua"
#: js/ui/appDisplay.js:1737 js/ui/panel.js:83
#. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:1713 js/ui/panel.js:79
msgid "Open Windows"
msgstr "Buka Jendela"
#: js/ui/appDisplay.js:1732 js/ui/panel.js:86
msgid "New Window"
msgstr "Jendela Baru"
#: js/ui/appDisplay.js:1751
#: js/ui/appDisplay.js:1746
msgid "Launch using Dedicated Graphics Card"
msgstr "Luncurkan menggunakan Kartu Grafis Terdedikasi"
#: js/ui/appDisplay.js:1778 js/ui/dash.js:239
#: js/ui/appDisplay.js:1773 js/ui/dash.js:239
msgid "Remove from Favorites"
msgstr "Hapus dari Favorit"
#: js/ui/appDisplay.js:1784
#: js/ui/appDisplay.js:1779
msgid "Add to Favorites"
msgstr "Tambah ke Favorit"
#: js/ui/appDisplay.js:1794 js/ui/panel.js:94
#: js/ui/appDisplay.js:1789 js/ui/panel.js:97
msgid "Show Details"
msgstr "Tampilkan Rincian"
#: js/ui/appFavorites.js:141
#: js/ui/appFavorites.js:149
#, javascript-format
msgid "%s has been added to your favorites."
msgstr "%s telah ditambahkan ke favorit Anda."
#: js/ui/appFavorites.js:175
#: js/ui/appFavorites.js:183
#, javascript-format
msgid "%s has been removed from your favorites."
msgstr "%s telah dihapus dari favorit Anda."
@ -1039,7 +1040,7 @@ msgstr "Sandi jaringan data seluler"
msgid "A password is required to connect to “%s”."
msgstr "Perlu suatu sandi untuk menyambung ke \"%s\"."
#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665
#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1664
msgid "Network Manager"
msgstr "Manajer Jaringan"
@ -1109,23 +1110,23 @@ msgstr "Tambah jam dunia…"
msgid "World Clocks"
msgstr "Jam Dunia"
#: js/ui/dateMenu.js:222
#: js/ui/dateMenu.js:228
msgid "Weather"
msgstr "Cuaca"
#: js/ui/dateMenu.js:305
#: js/ui/dateMenu.js:311
msgid "Select a location…"
msgstr "Pilih lokasi…"
#: js/ui/dateMenu.js:313
#: js/ui/dateMenu.js:319
msgid "Loading…"
msgstr "Memuat…"
#: js/ui/dateMenu.js:323
#: js/ui/dateMenu.js:329
msgid "Go online for weather information"
msgstr "Pergi daring untuk informasi cuaca"
#: js/ui/dateMenu.js:325
#: js/ui/dateMenu.js:331
msgid "Weather information is currently unavailable"
msgstr "Informasi cuaca saat ini tidak tersedia"
@ -1288,26 +1289,26 @@ msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "Unduh dan pasang \"%s\" dari extensions.gnome.org?"
#. Translators: %s is an application name like "Settings"
#: js/ui/inhibitShortcutsDialog.js:50
#: js/ui/inhibitShortcutsDialog.js:78
#, javascript-format
msgid "%s wants to inhibit shortcuts"
msgstr "%s ingin mencegah pintasan"
#: js/ui/inhibitShortcutsDialog.js:51
#: js/ui/inhibitShortcutsDialog.js:79
msgid "Application wants to inhibit shortcuts"
msgstr "Aplikasi ingin mencegah pintasan"
#. Translators: %s is a keyboard shortcut like "Super+x"
#: js/ui/inhibitShortcutsDialog.js:60
#: js/ui/inhibitShortcutsDialog.js:88
#, javascript-format
msgid "You can restore shortcuts by pressing %s."
msgstr "Anda dapat memulihkan pintasan dengan menekan %s."
#: js/ui/inhibitShortcutsDialog.js:65
#: js/ui/inhibitShortcutsDialog.js:93
msgid "Deny"
msgstr "Tolak"
#: js/ui/inhibitShortcutsDialog.js:71
#: js/ui/inhibitShortcutsDialog.js:100
msgid "Allow"
msgstr "Izinkan"
@ -1358,13 +1359,13 @@ msgid "Leave On"
msgstr "Biarkan Menyala"
#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133
#: js/ui/status/network.js:1264
#: js/ui/status/network.js:1263
msgid "Turn On"
msgstr "Nyalakan"
#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133
#: js/ui/status/network.js:128 js/ui/status/network.js:310
#: js/ui/status/network.js:1264 js/ui/status/network.js:1376
#: js/ui/status/network.js:1263 js/ui/status/network.js:1375
#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79
#: js/ui/status/rfkill.js:106
msgid "Turn Off"
@ -1374,59 +1375,59 @@ msgstr "Matikan"
msgid "Leave Off"
msgstr "Biarkan Mati"
#: js/ui/keyboard.js:203
#: js/ui/keyboard.js:200
msgid "Region & Language Settings"
msgstr "Pengaturan Wilayah & Bahasa"
#: js/ui/lookingGlass.js:614
#: js/ui/lookingGlass.js:615
msgid "No extensions installed"
msgstr "Tak ada ekstensi terpasang"
#. Translators: argument is an extension UUID.
#: js/ui/lookingGlass.js:668
#: js/ui/lookingGlass.js:669
#, javascript-format
msgid "%s has not emitted any errors."
msgstr "%s tidak menampilkan galat apa pun."
#: js/ui/lookingGlass.js:674
#: js/ui/lookingGlass.js:675
msgid "Hide Errors"
msgstr "Sembunyikan Galat"
#: js/ui/lookingGlass.js:678 js/ui/lookingGlass.js:738
#: js/ui/lookingGlass.js:679 js/ui/lookingGlass.js:739
msgid "Show Errors"
msgstr "Tampilkan Galat"
#: js/ui/lookingGlass.js:687
#: js/ui/lookingGlass.js:688
msgid "Enabled"
msgstr "Diaktifkan"
#. translators:
#. * The device has been disabled
#: js/ui/lookingGlass.js:690 subprojects/gvc/gvc-mixer-control.c:1866
#: js/ui/lookingGlass.js:691 subprojects/gvc/gvc-mixer-control.c:1864
msgid "Disabled"
msgstr "Dinonaktifkan"
#: js/ui/lookingGlass.js:692
#: js/ui/lookingGlass.js:693
msgid "Error"
msgstr "Galat"
#: js/ui/lookingGlass.js:694
#: js/ui/lookingGlass.js:695
msgid "Out of date"
msgstr "Kadaluarsa"
#: js/ui/lookingGlass.js:696
#: js/ui/lookingGlass.js:697
msgid "Downloading"
msgstr "Mengunduh"
#: js/ui/lookingGlass.js:720
#: js/ui/lookingGlass.js:721
msgid "View Source"
msgstr "Tilik Sumber"
#: js/ui/lookingGlass.js:729
#: js/ui/lookingGlass.js:730
msgid "Web Page"
msgstr "Halaman Web"
#: js/ui/messageTray.js:1474
#: js/ui/messageTray.js:1480
msgid "System Information"
msgstr "Informasi Sistem"
@ -1504,35 +1505,25 @@ msgstr "Tekan Esc untuk keluar"
msgid "Press any key to exit"
msgstr "Tekan tombol apa saja untuk keluar"
#: js/ui/panel.js:108
#: js/ui/panel.js:113
msgid "Quit"
msgstr "Keluar"
#. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview".
#: js/ui/panel.js:466
#: js/ui/panel.js:468
msgid "Activities"
msgstr "Aktivitas"
#: js/ui/panel.js:741
#: js/ui/panel.js:743
msgctxt "System menu in the top bar"
msgid "System"
msgstr "Sistem"
#: js/ui/panel.js:861
#: js/ui/panel.js:864
msgid "Top Bar"
msgstr "Bar Atas"
# Dirgita: Hayo, enaknya pake I/O atau ON/OFF?^^
#. Translators: this MUST be either "toggle-switch-us"
#. (for toggle switches containing the English words
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches.
#: js/ui/popupMenu.js:285
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
#: js/ui/runDialog.js:64
msgid "Enter a Command"
msgstr "Ketikkan Perintah"
@ -1569,7 +1560,7 @@ msgid_plural "%d new notifications"
msgstr[0] "%d pemberitahuan baru"
msgstr[1] "%d pemberitahuan baru"
#: js/ui/screenShield.js:449 js/ui/status/system.js:270
#: js/ui/screenShield.js:449 js/ui/status/system.js:271
msgid "Lock"
msgstr "Kunci"
@ -1584,11 +1575,11 @@ msgstr "GNOME perlu mengunci layar"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: js/ui/screenShield.js:834 js/ui/screenShield.js:1307
#: js/ui/screenShield.js:826 js/ui/screenShield.js:1299
msgid "Unable to lock"
msgstr "Tak bisa mengunci"
#: js/ui/screenShield.js:835 js/ui/screenShield.js:1308
#: js/ui/screenShield.js:827 js/ui/screenShield.js:1300
msgid "Lock was blocked by an application"
msgstr "Kunci diblokir oleh suatu aplikasi"
@ -1750,7 +1741,7 @@ msgid "<unknown>"
msgstr "<tak dikenal>"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:416 js/ui/status/network.js:1293
#: js/ui/status/network.js:416 js/ui/status/network.js:1292
#, javascript-format
msgid "%s Off"
msgstr "%s Mati"
@ -1776,7 +1767,7 @@ msgid "%s Disconnecting"
msgstr "%s Memutus"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:434 js/ui/status/network.js:1285
#: js/ui/status/network.js:434 js/ui/status/network.js:1284
#, javascript-format
msgid "%s Connecting"
msgstr "%s Menyambung"
@ -1816,7 +1807,7 @@ msgid "Mobile Broadband Settings"
msgstr "Pengaturan Data Seluler"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:553 js/ui/status/network.js:1290
#: js/ui/status/network.js:553 js/ui/status/network.js:1289
#, javascript-format
msgid "%s Hardware Disabled"
msgstr "%s Perangkat Keras Dinonaktifkan"
@ -1881,72 +1872,72 @@ msgid "Wi-Fi Settings"
msgstr "Pengaturan Wi-Fi"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1281
#: js/ui/status/network.js:1280
#, javascript-format
msgid "%s Hotspot Active"
msgstr "%s Hotspot Aktif"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1296
#: js/ui/status/network.js:1295
#, javascript-format
msgid "%s Not Connected"
msgstr "%s Tak Tersambung"
#: js/ui/status/network.js:1393
#: js/ui/status/network.js:1392
msgid "connecting…"
msgstr "menyambung…"
#. Translators: this is for network connections that require some kind of key or password
#: js/ui/status/network.js:1396
#: js/ui/status/network.js:1395
msgid "authentication required"
msgstr "diperlukan otentikasi"
#: js/ui/status/network.js:1398
#: js/ui/status/network.js:1397
msgid "connection failed"
msgstr "koneksi gagal"
#: js/ui/status/network.js:1448
#: js/ui/status/network.js:1447
msgid "VPN Settings"
msgstr "Pengaturan VPN"
#: js/ui/status/network.js:1465
#: js/ui/status/network.js:1464
msgid "VPN"
msgstr "VPN"
#: js/ui/status/network.js:1475
#: js/ui/status/network.js:1474
msgid "VPN Off"
msgstr "VPN Mati"
#: js/ui/status/network.js:1536 js/ui/status/rfkill.js:82
#: js/ui/status/network.js:1535 js/ui/status/rfkill.js:82
msgid "Network Settings"
msgstr "Pengaturan Jaringan"
#: js/ui/status/network.js:1565
#: js/ui/status/network.js:1564
#, javascript-format
msgid "%s Wired Connection"
msgid_plural "%s Wired Connections"
msgstr[0] "%s Koneksi Kabel"
msgstr[1] "%s Koneksi Kabel"
#: js/ui/status/network.js:1569
#: js/ui/status/network.js:1568
#, javascript-format
msgid "%s Wi-Fi Connection"
msgid_plural "%s Wi-Fi Connections"
msgstr[0] "%s Koneksi Wi-Fi"
msgstr[1] "%s Koneksi Wi-Fi"
#: js/ui/status/network.js:1573
#: js/ui/status/network.js:1572
#, javascript-format
msgid "%s Modem Connection"
msgid_plural "%s Modem Connections"
msgstr[0] "%s Koneksi Modem"
msgstr[1] "%s Koneksi Modem"
#: js/ui/status/network.js:1702
#: js/ui/status/network.js:1705
msgid "Connection failed"
msgstr "Koneksi gagal"
#: js/ui/status/network.js:1703
#: js/ui/status/network.js:1706
msgid "Activation of network connection failed"
msgstr "Aktivasi koneksi jaringan gagal"
@ -2028,15 +2019,15 @@ msgstr "Keluar"
msgid "Account Settings"
msgstr "Pengaturan Akun"
#: js/ui/status/system.js:255
#: js/ui/status/system.js:256
msgid "Orientation Lock"
msgstr "Kunci Orientasi"
#: js/ui/status/system.js:281
#: js/ui/status/system.js:282
msgid "Suspend"
msgstr "Suspensi"
#: js/ui/status/system.js:291
#: js/ui/status/system.js:292
msgid "Power Off"
msgstr "Matikan"
@ -2152,7 +2143,7 @@ msgstr[1] "Perubahan tatanan akan dikembalikan dalam %d detik"
#. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height.
#: js/ui/windowManager.js:662
#: js/ui/windowManager.js:677
#, javascript-format
msgid "%d × %d"
msgstr "%d × %d"
@ -2225,11 +2216,6 @@ msgstr "Pindahkan ke Monitor Kanan"
msgid "Evolution Calendar"
msgstr "Evolution Kalender"
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
#: src/calendar-server/evolution-calendar.desktop.in:6
msgid "evolution"
msgstr "evolution"
#: src/main.c:408
msgid "Print version"
msgstr "Versi Cetak"
@ -2246,12 +2232,12 @@ msgstr "Menggunakan mode tertentu, mis. \"gdm\" untuk layar masuk"
msgid "List possible modes"
msgstr "Menampilkan mode yang mungkin"
#: src/shell-app.c:260
#: src/shell-app.c:264
msgctxt "program"
msgid "Unknown"
msgstr "Tak dikenal"
#: src/shell-app.c:511
#: src/shell-app.c:515
#, c-format
msgid "Failed to launch “%s”"
msgstr "Gagal meluncurkan \"%s\""
@ -2270,7 +2256,7 @@ msgstr "Dialog autentikasi ditolak oleh pengguna"
#. translators:
#. * The number of sound outputs on a particular device
#: subprojects/gvc/gvc-mixer-control.c:1873
#: subprojects/gvc/gvc-mixer-control.c:1871
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
@ -2279,17 +2265,27 @@ msgstr[1] "%u Keluaran"
#. translators:
#. * The number of sound inputs on a particular device
#: subprojects/gvc/gvc-mixer-control.c:1883
#: subprojects/gvc/gvc-mixer-control.c:1881
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
msgstr[0] "%u Masukan"
msgstr[1] "%u Masukan"
#: subprojects/gvc/gvc-mixer-control.c:2738
#: subprojects/gvc/gvc-mixer-control.c:2736
msgid "System Sounds"
msgstr "Suara Sistem"
#~ msgid "network-workgroup"
#~ msgstr "network-workgroup"
# Dirgita: Hayo, enaknya pake I/O atau ON/OFF?^^
#~ msgid "toggle-switch-us"
#~ msgstr "toggle-switch-intl"
#~ msgid "evolution"
#~ msgstr "evolution"
#~ msgid "There was an error loading the preferences dialog for %s:"
#~ msgstr "Ada galat saat memuat dialog preferensi bagi %s:"

1029
po/sk.po

File diff suppressed because it is too large Load Diff

144
po/tg.po
View File

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

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -295,13 +295,13 @@ create_client_for_source (ESource *source,
CalendarSourceData *source_data)
{
ClientData *data;
ECalClient *client;
EClient *client;
GError *error = NULL;
client = g_hash_table_lookup (source_data->clients, source);
g_return_if_fail (client == NULL);
client = e_cal_client_new (source, source_type, &error);
client = e_cal_client_connect_sync (source, source_type, -1, NULL, &error);
if (!client)
{
g_warning ("Could not load source '%s': %s",
@ -312,7 +312,7 @@ create_client_for_source (ESource *source,
}
data = g_slice_new0 (ClientData);
data->client = client; /* takes ownership */
data->client = E_CAL_CLIENT (client); /* takes ownership */
data->backend_died_id = g_signal_connect (client,
"backend-died",
G_CALLBACK (backend_died_cb),

View File

@ -102,97 +102,120 @@ typedef struct
} CollectAppointmentsData;
static time_t
get_time_from_property (icalcomponent *ical,
icalproperty_kind prop_kind,
struct icaltimetype (* get_prop_func) (const icalproperty *prop),
icaltimezone *default_zone)
get_time_from_property (ICalComponent *icomp,
ICalPropertyKind prop_kind,
ICalTime * (* get_prop_func) (ICalProperty *prop),
ICalTimezone *default_zone)
{
icalproperty *prop;
struct icaltimetype ical_time;
icalparameter *param;
icaltimezone *timezone = NULL;
ICalProperty *prop;
ICalTime *itt;
ICalParameter *param;
ICalTimezone *timezone = NULL;
time_t retval;
prop = icalcomponent_get_first_property (ical, prop_kind);
prop = i_cal_component_get_first_property (icomp, prop_kind);
if (!prop)
return 0;
ical_time = get_prop_func (prop);
itt = get_prop_func (prop);
param = icalproperty_get_first_parameter (prop, ICAL_TZID_PARAMETER);
param = i_cal_property_get_first_parameter (prop, I_CAL_TZID_PARAMETER);
if (param)
timezone = icaltimezone_get_builtin_timezone_from_tzid (icalparameter_get_tzid (param));
else if (icaltime_is_utc (ical_time))
timezone = icaltimezone_get_utc_timezone ();
timezone = i_cal_timezone_get_builtin_timezone_from_tzid (i_cal_parameter_get_tzid (param));
else if (i_cal_time_is_utc (itt))
timezone = i_cal_timezone_get_utc_timezone ();
else
timezone = default_zone;
return icaltime_as_timet_with_zone (ical_time, timezone);
retval = i_cal_time_as_timet_with_zone (itt, timezone);
g_clear_object (&param);
g_clear_object (&prop);
g_clear_object (&itt);
return retval;
}
static char *
get_ical_uid (icalcomponent *ical)
get_ical_uid (ICalComponent *icomp)
{
return g_strdup (icalcomponent_get_uid (ical));
return g_strdup (i_cal_component_get_uid (icomp));
}
static char *
get_ical_summary (icalcomponent *ical)
get_ical_summary (ICalComponent *icomp)
{
icalproperty *prop;
ICalProperty *prop;
char *retval;
prop = icalcomponent_get_first_property (ical, ICAL_SUMMARY_PROPERTY);
prop = i_cal_component_get_first_property (icomp, I_CAL_SUMMARY_PROPERTY);
if (!prop)
return NULL;
return g_strdup (icalproperty_get_summary (prop));
retval = g_strdup (i_cal_property_get_summary (prop));
g_object_unref (prop);
return retval;
}
static char *
get_ical_description (icalcomponent *ical)
get_ical_description (ICalComponent *icomp)
{
icalproperty *prop;
ICalProperty *prop;
char *retval;
prop = icalcomponent_get_first_property (ical, ICAL_DESCRIPTION_PROPERTY);
prop = i_cal_component_get_first_property (icomp, I_CAL_DESCRIPTION_PROPERTY);
if (!prop)
return NULL;
return g_strdup (icalproperty_get_description (prop));
retval = g_strdup (i_cal_property_get_description (prop));
g_object_unref (prop);
return retval;
}
static inline time_t
get_ical_start_time (icalcomponent *ical,
icaltimezone *default_zone)
get_ical_start_time (ICalComponent *icomp,
ICalTimezone *default_zone)
{
return get_time_from_property (ical,
ICAL_DTSTART_PROPERTY,
icalproperty_get_dtstart,
return get_time_from_property (icomp,
I_CAL_DTSTART_PROPERTY,
i_cal_property_get_dtstart,
default_zone);
}
static inline time_t
get_ical_end_time (icalcomponent *ical,
icaltimezone *default_zone)
get_ical_end_time (ICalComponent *icomp,
ICalTimezone *default_zone)
{
return get_time_from_property (ical,
ICAL_DTEND_PROPERTY,
icalproperty_get_dtend,
return get_time_from_property (icomp,
I_CAL_DTEND_PROPERTY,
i_cal_property_get_dtend,
default_zone);
}
static gboolean
get_ical_is_all_day (icalcomponent *ical,
get_ical_is_all_day (ICalComponent *icomp,
time_t start_time,
icaltimezone *default_zone)
ICalTimezone *default_zone)
{
icalproperty *prop;
struct tm *start_tm;
time_t end_time;
struct icaldurationtype duration;
struct icaltimetype start_icaltime;
ICalProperty *prop;
ICalDuration *duration;
ICalTime *dtstart;
struct tm *start_tm;
time_t end_time;
gboolean retval;
start_icaltime = icalcomponent_get_dtstart (ical);
if (start_icaltime.is_date)
return TRUE;
dtstart = i_cal_component_get_dtstart (icomp);
if (dtstart && i_cal_time_is_date (dtstart))
{
g_clear_object (&dtstart);
return TRUE;
}
g_clear_object (&dtstart);
start_tm = gmtime (&start_time);
if (start_tm->tm_sec != 0 ||
@ -200,35 +223,40 @@ get_ical_is_all_day (icalcomponent *ical,
start_tm->tm_hour != 0)
return FALSE;
if ((end_time = get_ical_end_time (ical, default_zone)))
if ((end_time = get_ical_end_time (icomp, default_zone)))
return (end_time - start_time) % 86400 == 0;
prop = icalcomponent_get_first_property (ical, ICAL_DURATION_PROPERTY);
prop = i_cal_component_get_first_property (icomp, I_CAL_DURATION_PROPERTY);
if (!prop)
return FALSE;
duration = icalproperty_get_duration (prop);
duration = i_cal_property_get_duration (prop);
return icaldurationtype_as_int (duration) % 86400 == 0;
retval = duration && (i_cal_duration_as_int (duration) % 86400) == 0;
g_clear_object (&duration);
g_clear_object (&prop);
return retval;
}
static inline time_t
get_ical_due_time (icalcomponent *ical,
icaltimezone *default_zone)
get_ical_due_time (ICalComponent *icomp,
ICalTimezone *default_zone)
{
return get_time_from_property (ical,
ICAL_DUE_PROPERTY,
icalproperty_get_due,
return get_time_from_property (icomp,
I_CAL_DUE_PROPERTY,
i_cal_property_get_due,
default_zone);
}
static inline time_t
get_ical_completed_time (icalcomponent *ical,
icaltimezone *default_zone)
get_ical_completed_time (ICalComponent *icomp,
ICalTimezone *default_zone)
{
return get_time_from_property (ical,
ICAL_COMPLETED_PROPERTY,
icalproperty_get_completed,
return get_time_from_property (icomp,
I_CAL_COMPLETED_PROPERTY,
i_cal_property_get_completed,
default_zone);
}
@ -365,67 +393,69 @@ calendar_appointment_free (CalendarAppointment *appointment)
static void
calendar_appointment_init (CalendarAppointment *appointment,
icalcomponent *ical,
ICalComponent *icomp,
ECalClient *cal)
{
icaltimezone *default_zone;
ICalTimezone *default_zone;
const char *source_id;
source_id = e_source_get_uid (e_client_get_source (E_CLIENT (cal)));
default_zone = e_cal_client_get_default_timezone (cal);
appointment->uid = get_ical_uid (ical);
appointment->uid = get_ical_uid (icomp);
appointment->source_id = g_strdup (source_id);
appointment->backend_name = get_source_backend_name (cal);
appointment->summary = get_ical_summary (ical);
appointment->description = get_ical_description (ical);
appointment->summary = get_ical_summary (icomp);
appointment->description = get_ical_description (icomp);
appointment->color_string = get_source_color (cal);
appointment->start_time = get_ical_start_time (ical, default_zone);
appointment->end_time = get_ical_end_time (ical, default_zone);
appointment->is_all_day = get_ical_is_all_day (ical,
appointment->start_time = get_ical_start_time (icomp, default_zone);
appointment->end_time = get_ical_end_time (icomp, default_zone);
appointment->is_all_day = get_ical_is_all_day (icomp,
appointment->start_time,
default_zone);
}
static CalendarAppointment *
calendar_appointment_new (icalcomponent *ical,
calendar_appointment_new (ICalComponent *icomp,
ECalClient *cal)
{
CalendarAppointment *appointment;
appointment = g_new0 (CalendarAppointment, 1);
calendar_appointment_init (appointment, ical, cal);
calendar_appointment_init (appointment, icomp, cal);
return appointment;
}
static gboolean
generate_instances_cb (ECalComponent *comp,
time_t start,
time_t end,
gpointer data)
generate_instances_cb (ICalComponent *icomp,
ICalTime *instance_start,
ICalTime *instance_end,
gpointer user_data,
GCancellable *cancellable,
GError **error)
{
ECalClient *cal = ((CollectAppointmentsData *)data)->client;
GHashTable *appointments = ((CollectAppointmentsData *)data)->appointments;
ECalClient *cal = ((CollectAppointmentsData *)user_data)->client;
GHashTable *appointments = ((CollectAppointmentsData *)user_data)->appointments;
CalendarAppointment *appointment;
CalendarOccurrence *occurrence;
const char *uid;
ICalTimezone *default_zone;
const gchar *uid;
e_cal_component_get_uid (comp, &uid);
default_zone = e_cal_client_get_default_timezone (cal);
uid = i_cal_component_get_uid (icomp);
appointment = g_hash_table_lookup (appointments, uid);
if (appointment == NULL)
{
icalcomponent *ical = e_cal_component_get_icalcomponent (comp);
appointment = calendar_appointment_new (ical, cal);
appointment = calendar_appointment_new (icomp, cal);
g_hash_table_insert (appointments, g_strdup (uid), appointment);
}
occurrence = g_new0 (CalendarOccurrence, 1);
occurrence->start_time = start;
occurrence->end_time = end;
occurrence->rid = e_cal_component_get_recurid_as_string (comp);
occurrence->start_time = i_cal_time_as_timet_with_zone (instance_start, default_zone);
occurrence->end_time = i_cal_time_as_timet_with_zone (instance_end, default_zone);
occurrence->rid = e_cal_util_component_get_recurid_as_string (icomp);
appointment->occurrences = g_slist_append (appointment->occurrences, occurrence);
@ -442,7 +472,7 @@ struct _App
time_t since;
time_t until;
icaltimezone *zone;
ICalTimezone *zone;
CalendarSources *sources;
gulong sources_signal_id;
@ -468,9 +498,9 @@ app_update_timezone (App *app)
if (g_strcmp0 (location, app->timezone_location) != 0)
{
if (location == NULL)
app->zone = icaltimezone_get_utc_timezone ();
app->zone = i_cal_timezone_get_utc_timezone ();
else
app->zone = icaltimezone_get_builtin_timezone (location);
app->zone = i_cal_timezone_get_builtin_timezone (location);
g_free (app->timezone_location);
app->timezone_location = location;
print_debug ("Using timezone %s", app->timezone_location);
@ -528,10 +558,10 @@ on_objects_added (ECalClientView *view,
for (l = objects; l != NULL; l = l->next)
{
icalcomponent *ical = l->data;
ICalComponent *icomp = l->data;
const char *uid;
uid = icalcomponent_get_uid (ical);
uid = i_cal_component_get_uid (icomp);
if (g_hash_table_lookup (app->appointments, uid) == NULL)
{
@ -600,7 +630,7 @@ app_load_events (App *app)
since_iso8601 = isodate_from_time_t (app->since);
until_iso8601 = isodate_from_time_t (app->until);
tz_location = icaltimezone_get_location (app->zone);
tz_location = i_cal_timezone_get_location (app->zone);
print_debug ("Loading events since %s until %s",
since_iso8601,
@ -622,21 +652,12 @@ app_load_events (App *app)
e_cal_client_set_default_timezone (cal, app->zone);
error = NULL;
if (!e_client_open_sync (E_CLIENT (cal), TRUE, NULL, &error))
{
ESource *source = e_client_get_source (E_CLIENT (cal));
g_warning ("Error opening calendar %s: %s\n",
e_source_get_uid (source), error->message);
g_error_free (error);
continue;
}
data.client = cal;
data.appointments = app->appointments;
e_cal_client_generate_instances_sync (cal,
app->since,
app->until,
NULL,
generate_instances_cb,
&data);
@ -1078,7 +1099,7 @@ main (int argc,
/* ---------------------------------------------------------------------------------------------------- */
static void
static void __attribute__((format(printf, 1, 0)))
print_debug (const gchar *format, ...)
{
gchar *s;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -117,7 +117,7 @@ remove_mnemonics (const GValue *value)
label = g_value_get_string (value);
g_return_val_if_fail (label != NULL, NULL);
/* Stripped label will have the original label lenght at most */
/* Stripped label will have the original label length at most */
stripped_label = temp = g_new (gchar, strlen(label) + 1);
g_assert (stripped_label != NULL);

View File

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

Some files were not shown because too many files have changed in this diff Show More