Compare commits

...

68 Commits

Author SHA1 Message Date
6393e90a5a theme: sync OSD colors with gtk 2019-04-16 16:47:59 +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
48 changed files with 4151 additions and 3482 deletions

1
.gitignore vendored
View File

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

View File

@ -15,10 +15,8 @@ variables:
- merge_requests - merge_requests
check_commit_log: check_commit_log:
image: registry.fedoraproject.org/fedora:latest image: registry.gitlab.gnome.org/gnome/mutter/master:v1
stage: review stage: review
before_script:
- dnf install -y git
script: script:
- ./.gitlab-ci/check-commit-log.sh - ./.gitlab-ci/check-commit-log.sh
only: only:

View File

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

View File

@ -16,12 +16,12 @@ $link_visited_color: if($variant == 'light', darken($selected_bg_color, 20%), li
$top_hilight: $borders_edge; $top_hilight: $borders_edge;
$warning_color: #f57900; $warning_color: #f57900;
$error_color: #cc0000; $error_color: #ff8080;
$success_color: if($variant == 'light', #33d17a, darken(#33d17a, 10%)); $success_color: if($variant == 'light', #33d17a, darken(#33d17a, 10%));
$destructive_color: if($variant == 'light', #e01b24, darken(#e01b24, 10%)); $destructive_color: if($variant == 'light', #e01b24, darken(#e01b24, 10%));
$osd_fg_color: #eeeeec; $osd_fg_color: #eeeeec;
$osd_bg_color: #2e3436; $osd_bg_color: transparentize(darken(desaturate(#3d3846, 100%), 15%),0.3);
$osd_borders_color: transparentize(black, 0.3); $osd_borders_color: transparentize(black, 0.3);
$osd_outer_borders_color: transparentize(white, 0.9); $osd_outer_borders_color: transparentize(white, 0.9);

View File

@ -29,7 +29,7 @@ $panel-corner-radius: 6px;
/* GLOBALS */ /* GLOBALS */
$font-size: 11; $font-size: 11;
$font-family: Cantarell, Sans-Serif; $font-family: Cantarell, Sans-Serif;
$_bubble_bg_color: opacify($osd_bg_color,0.25); $_bubble_bg_color: $osd_bg_color;
$_bubble_fg_color: $osd_fg_color; $_bubble_fg_color: $osd_fg_color;
$_bubble_borders_color: transparentize($osd_fg_color,0.8); $_bubble_borders_color: transparentize($osd_fg_color,0.8);
@ -184,7 +184,7 @@ StScrollBar {
.modal-dialog { .modal-dialog {
border-radius: 9px; border-radius: 9px;
color: $osd_fg_color; color: $osd_fg_color;
background-color: transparentize(darken($osd_bg_color,10%),0.05); background-color: $osd_bg_color;
border: 1px solid $_bubble_borders_color; border: 1px solid $_bubble_borders_color;
.modal-dialog-content-box { .modal-dialog-content-box {
padding: 24px; padding: 24px;
@ -392,7 +392,7 @@ StScrollBar {
.prompt-dialog-error-label { .prompt-dialog-error-label {
font-size: 10pt; font-size: 10pt;
color: $error_color; color: $warning_color;
padding-bottom: 8px; padding-bottom: 8px;
} }
@ -1142,6 +1142,12 @@ StScrollBar {
.ripple-box:rtl { border-radius: 0 0 0 52px; } // just a simple change to the border radius position .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 // not really top bar only
.popup-menu-arrow { icon-size: 1.09em; } .popup-menu-arrow { icon-size: 1.09em; }
.popup-menu-icon { icon-size: 1.09em; } .popup-menu-icon { icon-size: 1.09em; }
@ -1453,13 +1459,13 @@ StScrollBar {
height: 12px; height: 12px;
background-color: transparent; background-color: transparent;
border: 2px solid rgba(255, 255, 255, 0.4); border: 2px solid rgba(255, 255, 255, 0.4);
border-radius:12px; border-radius: 12px;
} }
&:hover .page-indicator-icon { border-color: white; } &: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 .page-indicator-icon,
&:checked:active { background-color: #fff;} &:checked:active .page-indicator-icon { background-color: white;}
} }
.no-frequent-applications-label { @extend %status_text; } .no-frequent-applications-label { @extend %status_text; }

View File

@ -111,7 +111,7 @@
} }
} }
@mixin button($t, $c:$osd_bg_color, $tc:$fg_color, $edge: $borders_edge) { @mixin button($t, $c:opacify(lighten($osd_bg_color, 5%),1.0), $tc:$fg_color, $edge: $borders_edge) {
// //
// Button drawing function // Button drawing function
// //
@ -136,8 +136,7 @@
// //
// normal button // normal button
// //
$_bg: if($c!=$osd_bg_color, transparentize($c, 0.5), $_bg: $c;
$osd_bg_color);
color: $osd_fg_color; color: $osd_fg_color;
background-color: $_bg; background-color: $_bg;
@ -150,8 +149,7 @@
// //
// focused button // focused button
// //
$_bg: if($c!=$osd_bg_color, transparentize($c, 0.3), $_bg: lighten($c,3%);
lighten($osd_bg_color,3%));
color: $osd_fg_color; color: $osd_fg_color;
text-shadow: 0 1px black; text-shadow: 0 1px black;
@ -163,8 +161,7 @@
// //
// active osd button // active osd button
// //
$_bg: if($c!=$osd_bg_color, transparentize($c, 0.3), $_bg: lighten($c,3%);
lighten($osd_bg_color,3%));
color: white; color: white;
border-color: $osd_borders_color; border-color: $osd_borders_color;

View File

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

View File

@ -30,6 +30,14 @@ var WeatherClient = class {
return; 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) => { this._permStore.LookupRemote('gnome', 'geolocation', (res, error) => {
if (error) if (error)
log('Error looking up permission: ' + error.message); 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 // someone should be able to get an idea of how well the shell is performing
// on a particular system. // on a particular system.
let METRICS = { var METRICS = {
overviewLatencyFirst: overviewLatencyFirst:
{ description: "Time to first frame after triggering overview, first time", { description: "Time to first frame after triggering overview, first time",
units: "us" }, 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 Main = imports.ui.main;
const Scripting = imports.ui.scripting; const Scripting = imports.ui.scripting;
let METRICS = { var METRICS = {
timeToDesktop: timeToDesktop:
{ description: "Time from starting graphical.target to desktop showing", { description: "Time from starting graphical.target to desktop showing",
units: "us" }, units: "us" },
@ -104,7 +104,10 @@ function *run() {
yield Scripting.waitLeisure(); yield Scripting.waitLeisure();
Scripting.scriptEvent('desktopShown'); 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'); Scripting.scriptEvent('overviewShowStart');
Main.overview.show(); Main.overview.show();
@ -200,7 +203,7 @@ function *run() {
yield Scripting.sleep(1000); yield Scripting.sleep(1000);
Gtk.Settings.get_default().gtk_enable_animations = true; interfaceSettings.set_boolean('enable-animations', true);
} }
let overviewShowStart; let overviewShowStart;

View File

@ -619,9 +619,8 @@ class WindowSwitcherPopup extends SwitcherPopup.SwitcherPopup {
var WindowCyclerPopup = GObject.registerClass( var WindowCyclerPopup = GObject.registerClass(
class WindowCyclerPopup extends CyclerPopup { class WindowCyclerPopup extends CyclerPopup {
_init() { _init() {
super._init();
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell.window-switcher' }); this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell.window-switcher' });
super._init();
} }
_getWindows() { _getWindows() {

View File

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

View File

@ -24,7 +24,7 @@ var POPUP_ANIMATION_TIME = 0.15;
* placed. The arrow position may be controlled via * placed. The arrow position may be controlled via
* setArrowOrigin(). The arrow side might be temporarily flipped * setArrowOrigin(). The arrow side might be temporarily flipped
* depending on the box size and source position to keep the box * 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({ var BoxPointer = GObject.registerClass({
@ -47,10 +47,6 @@ var BoxPointer = GObject.registerClass({
this._border.connect('repaint', this._drawBorder.bind(this)); this._border.connect('repaint', this._drawBorder.bind(this));
this.add_actor(this._border); this.add_actor(this._border);
this.bin.raise(this._border); this.bin.raise(this._border);
this._xOffset = 0;
this._yOffset = 0;
this._xPosition = 0;
this._yPosition = 0;
this._sourceAlignment = 0.5; this._sourceAlignment = 0.5;
this._capturedEventId = 0; this._capturedEventId = 0;
this._muteInput(); this._muteInput();
@ -118,23 +114,23 @@ var BoxPointer = GObject.registerClass({
if (animate & PopupAnimation.SLIDE) { if (animate & PopupAnimation.SLIDE) {
switch (this._arrowSide) { switch (this._arrowSide) {
case St.Side.TOP: case St.Side.TOP:
this.yOffset = -rise; this.translation_y = -rise;
break; break;
case St.Side.BOTTOM: case St.Side.BOTTOM:
this.yOffset = rise; this.translation_y = rise;
break; break;
case St.Side.LEFT: case St.Side.LEFT:
this.xOffset = -rise; this.translation_x = -rise;
break; break;
case St.Side.RIGHT: case St.Side.RIGHT:
this.xOffset = rise; this.translation_x = rise;
break; break;
} }
} }
Tweener.addTween(this, { opacity: 255, Tweener.addTween(this, { opacity: 255,
xOffset: 0, translation_x: 0,
yOffset: 0, translation_y: 0,
transition: 'linear', transition: 'linear',
onComplete: () => { onComplete: () => {
this._unmuteInput(); this._unmuteInput();
@ -148,8 +144,8 @@ var BoxPointer = GObject.registerClass({
if (!this.visible) if (!this.visible)
return; return;
let xOffset = 0; let translationX = 0;
let yOffset = 0; let translationY = 0;
let themeNode = this.get_theme_node(); let themeNode = this.get_theme_node();
let rise = themeNode.get_length('-arrow-rise'); let rise = themeNode.get_length('-arrow-rise');
let fade = (animate & PopupAnimation.FADE); let fade = (animate & PopupAnimation.FADE);
@ -158,16 +154,16 @@ var BoxPointer = GObject.registerClass({
if (animate & PopupAnimation.SLIDE) { if (animate & PopupAnimation.SLIDE) {
switch (this._arrowSide) { switch (this._arrowSide) {
case St.Side.TOP: case St.Side.TOP:
yOffset = rise; translationY = rise;
break; break;
case St.Side.BOTTOM: case St.Side.BOTTOM:
yOffset = -rise; translationY = -rise;
break; break;
case St.Side.LEFT: case St.Side.LEFT:
xOffset = rise; translationX = rise;
break; break;
case St.Side.RIGHT: case St.Side.RIGHT:
xOffset = -rise; translationX = -rise;
break; break;
} }
} }
@ -176,15 +172,15 @@ var BoxPointer = GObject.registerClass({
Tweener.removeTweens(this); Tweener.removeTweens(this);
Tweener.addTween(this, { opacity: fade ? 0 : 255, Tweener.addTween(this, { opacity: fade ? 0 : 255,
xOffset: xOffset, translation_x: translationX,
yOffset: yOffset, translation_y: translationY,
transition: 'linear', transition: 'linear',
time: animationTime, time: animationTime,
onComplete: () => { onComplete: () => {
this.hide(); this.hide();
this.opacity = 0; this.opacity = 0;
this.xOffset = 0; this.translation_x = 0;
this.yOffset = 0; this.translation_y = 0;
if (onComplete) if (onComplete)
onComplete(); onComplete();
} }
@ -477,11 +473,15 @@ var BoxPointer = GObject.registerClass({
_reposition() { _reposition() {
let sourceActor = this._sourceActor; let sourceActor = this._sourceActor;
let alignment = this._arrowAlignment; 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 // Position correctly relative to the sourceActor
let sourceNode = sourceActor.get_theme_node(); let sourceNode = sourceActor.get_theme_node();
let sourceContentBox = sourceNode.get_content_box(sourceActor.get_allocation_box()); 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 sourceCenterX = sourceAllocation.x1 + sourceContentBox.x1 + (sourceContentBox.x2 - sourceContentBox.x1) * this._sourceAlignment;
let sourceCenterY = sourceAllocation.y1 + sourceContentBox.y1 + (sourceContentBox.y2 - sourceContentBox.y1) * this._sourceAlignment; let sourceCenterY = sourceAllocation.y1 + sourceContentBox.y1 + (sourceContentBox.y2 - sourceContentBox.y1) * this._sourceAlignment;
let [minWidth, minHeight, natWidth, natHeight] = this.get_preferred_size(); let [minWidth, minHeight, natWidth, natHeight] = this.get_preferred_size();
@ -489,7 +489,7 @@ var BoxPointer = GObject.registerClass({
// We also want to keep it onscreen, and separated from the // We also want to keep it onscreen, and separated from the
// edge by the same distance as the main part of the box is // edge by the same distance as the main part of the box is
// separated from its sourceActor // separated from its sourceActor
let monitor = Main.layoutManager.findMonitorForActor(sourceActor); let workarea = this._workArea;
let themeNode = this.get_theme_node(); let themeNode = this.get_theme_node();
let borderWidth = themeNode.get_length('-arrow-border-width'); let borderWidth = themeNode.get_length('-arrow-border-width');
let arrowBase = themeNode.get_length('-arrow-base'); let arrowBase = themeNode.get_length('-arrow-base');
@ -539,8 +539,8 @@ var BoxPointer = GObject.registerClass({
case St.Side.BOTTOM: case St.Side.BOTTOM:
resX = sourceCenterX - (halfMargin + (natWidth - margin) * alignment); resX = sourceCenterX - (halfMargin + (natWidth - margin) * alignment);
resX = Math.max(resX, monitor.x + padding); resX = Math.max(resX, workarea.x + padding);
resX = Math.min(resX, monitor.x + monitor.width - (padding + natWidth)); resX = Math.min(resX, workarea.x + workarea.width - (padding + natWidth));
arrowOrigin = sourceCenterX - resX; arrowOrigin = sourceCenterX - resX;
if (arrowOrigin <= (x1 + (borderRadius + halfBase))) { if (arrowOrigin <= (x1 + (borderRadius + halfBase))) {
@ -558,8 +558,8 @@ var BoxPointer = GObject.registerClass({
case St.Side.RIGHT: case St.Side.RIGHT:
resY = sourceCenterY - (halfMargin + (natHeight - margin) * alignment); resY = sourceCenterY - (halfMargin + (natHeight - margin) * alignment);
resY = Math.max(resY, monitor.y + padding); resY = Math.max(resY, workarea.y + padding);
resY = Math.min(resY, monitor.y + monitor.height - (padding + natHeight)); resY = Math.min(resY, workarea.y + workarea.height - (padding + natHeight));
arrowOrigin = sourceCenterY - resY; arrowOrigin = sourceCenterY - resY;
if (arrowOrigin <= (y1 + (borderRadius + halfBase))) { if (arrowOrigin <= (y1 + (borderRadius + halfBase))) {
@ -583,9 +583,9 @@ var BoxPointer = GObject.registerClass({
parent = parent.get_parent(); parent = parent.get_parent();
} }
this._xPosition = Math.floor(x); // Actually set the position
this._yPosition = Math.floor(y); this.x = Math.floor(x);
this._shiftActor(); this.y = Math.floor(y);
} }
// @origin: Coordinate specifying middle of the arrow, along // @origin: Coordinate specifying middle of the arrow, along
@ -608,44 +608,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) { _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 [minWidth, minHeight, boxWidth, boxHeight] = this.get_preferred_size();
let monitorActor = this.sourceActor; let workarea = this._workArea;
if (!monitorActor)
monitorActor = this;
let monitor = Main.layoutManager.findMonitorForActor(monitorActor);
switch (arrowSide) { switch (arrowSide) {
case St.Side.TOP: case St.Side.TOP:
if (sourceAllocation.y2 + boxHeight > monitor.y + monitor.height && if (sourceAllocation.y2 + boxHeight > workarea.y + workarea.height &&
boxHeight < sourceAllocation.y1 - monitor.y) boxHeight < sourceAllocation.y1 - workarea.y)
return St.Side.BOTTOM; return St.Side.BOTTOM;
break; break;
case St.Side.BOTTOM: case St.Side.BOTTOM:
if (sourceAllocation.y1 - boxHeight < monitor.y && if (sourceAllocation.y1 - boxHeight < workarea.y &&
boxHeight < monitor.y + monitor.height - sourceAllocation.y2) boxHeight < workarea.y + workarea.height - sourceAllocation.y2)
return St.Side.TOP; return St.Side.TOP;
break; break;
case St.Side.LEFT: case St.Side.LEFT:
if (sourceAllocation.x2 + boxWidth > monitor.x + monitor.width && if (sourceAllocation.x2 + boxWidth > workarea.x + workarea.width &&
boxWidth < sourceAllocation.x1 - monitor.x) boxWidth < sourceAllocation.x1 - workarea.x)
return St.Side.RIGHT; return St.Side.RIGHT;
break; break;
case St.Side.RIGHT: case St.Side.RIGHT:
if (sourceAllocation.x1 - boxWidth < monitor.x && if (sourceAllocation.x1 - boxWidth < workarea.x &&
boxWidth < monitor.x + monitor.width - sourceAllocation.x2) boxWidth < workarea.x + workarea.width - sourceAllocation.x2)
return St.Side.LEFT; return St.Side.LEFT;
break; break;
} }
@ -667,24 +653,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) { updateArrowSide(side) {
this._arrowSide = side; this._arrowSide = side;
this._border.queue_repaint(); this._border.queue_repaint();

View File

@ -584,22 +584,18 @@ var Dash = class Dash {
let firstButton = iconChildren[0].child; let firstButton = iconChildren[0].child;
let firstIcon = firstButton._delegate.icon; let firstIcon = firstButton._delegate.icon;
let minHeight, natHeight; // Enforce valid spacings during the size request
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
// Enforce the current icon size during the size request
firstIcon.icon.ensure_style(); firstIcon.icon.ensure_style();
let [, currentHeight] = firstIcon.icon.get_size(); let [, iconHeight] = firstIcon.icon.get_preferred_height(-1);
firstIcon.icon.set_height(this.iconSize * scaleFactor); let [, buttonHeight] = firstButton.get_preferred_height(-1);
[minHeight, natHeight] = firstButton.get_preferred_height(-1);
firstIcon.icon.set_height(currentHeight);
// Subtract icon padding and box spacing from the available height // 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; (iconChildren.length - 1) * spacing;
let availSize = availHeight / iconChildren.length; let availSize = availHeight / iconChildren.length;
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
let iconSizes = baseIconSizes.map(s => s * scaleFactor); let iconSizes = baseIconSizes.map(s => s * scaleFactor);
let newIconSize = baseIconSizes[0]; let newIconSize = baseIconSizes[0];

View File

@ -136,11 +136,12 @@ var WorldClocksSection = class WorldClocksSection {
layout.attach(header, 0, 0, 2, 1); layout.attach(header, 0, 0, 2, 1);
this.actor.label_actor = header; this.actor.label_actor = header;
let localOffset = GLib.DateTime.new_now_local().get_utc_offset();
for (let i = 0; i < this._locations.length; i++) { for (let i = 0; i < this._locations.length; i++) {
let l = this._locations[i].location; let l = this._locations[i].location;
let name = l.get_level() == GWeather.LocationLevel.NAMED_TIMEZONE ? l.get_name() let name = l.get_city_name() || l.get_name();
: l.get_city_name();
let label = new St.Label({ style_class: 'world-clocks-city', let label = new St.Label({ style_class: 'world-clocks-city',
text: name, text: name,
x_align: Clutter.ActorAlign.START, x_align: Clutter.ActorAlign.START,
@ -149,7 +150,8 @@ var WorldClocksSection = class WorldClocksSection {
let time = new St.Label({ style_class: 'world-clocks-time' }); 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 fmt = (Math.trunc(offset) == offset) ? '%s%.0f' : '%s%.1f';
let prefix = (offset >= 0) ? '+' : '-'; let prefix = (offset >= 0) ? '+' : '-';
let tz = new St.Label({ style_class: 'world-clocks-timezone', 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() { _updateLabels() {
for (let i = 0; i < this._locations.length; i++) { for (let i = 0; i < this._locations.length; i++) {
let l = this._locations[i]; let l = this._locations[i];
let tz = GLib.TimeZone.new(l.location.get_timezone().get_tzid()); let now = this._getTimeAtLocation(l.location);
let now = GLib.DateTime.new_now(tz);
l.actor.text = Util.formatTime(now, { timeOnly: true }); l.actor.text = Util.formatTime(now, { timeOnly: true });
} }
} }

View File

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

View File

@ -104,6 +104,7 @@ class BaseIcon extends St.Bin {
} }
vfunc_style_changed() { vfunc_style_changed() {
super.vfunc_style_changed();
let node = this.get_theme_node(); let node = this.get_theme_node();
let size; let size;

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 = { const defaultParams = {
trackFullscreen: false, trackFullscreen: false,
affectsStruts: false, affectsStruts: false,
@ -200,12 +213,8 @@ var LayoutManager = GObject.registerClass({
global.stage.no_clear_hint = true; global.stage.no_clear_hint = true;
// Set up stage hierarchy to group all UI actors under one container. // 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.set_flags(Clutter.ActorFlags.NO_LAYOUT);
this.uiGroup.add_constraint(new Clutter.BindConstraint({
source: global.stage,
coordinate: Clutter.BindCoordinate.ALL,
}));
global.stage.remove_actor(global.window_group); global.stage.remove_actor(global.window_group);
this.uiGroup.add_actor(global.window_group); this.uiGroup.add_actor(global.window_group);
@ -243,7 +252,7 @@ var LayoutManager = GObject.registerClass({
// A dummy actor that tracks the mouse or text cursor, based on the // A dummy actor that tracks the mouse or text cursor, based on the
// position and size set in setDummyCursorGeometry. // 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); this.uiGroup.add_actor(this.dummyCursor);
global.stage.remove_actor(global.top_window_group); global.stage.remove_actor(global.top_window_group);

View File

@ -1,6 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- 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; Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
const Signals = imports.signals; const Signals = imports.signals;
@ -18,9 +18,6 @@ var NO_CHANGE = 0.0;
var POINTER_REST_TIME = 1000; // milliseconds var POINTER_REST_TIME = 1000; // milliseconds
// Settings // Settings
const APPLICATIONS_SCHEMA = 'org.gnome.desktop.a11y.applications';
const SHOW_KEY = 'screen-magnifier-enabled';
const MAGNIFIER_SCHEMA = 'org.gnome.desktop.a11y.magnifier'; const MAGNIFIER_SCHEMA = 'org.gnome.desktop.a11y.magnifier';
const SCREEN_POSITION_KEY = 'screen-position'; const SCREEN_POSITION_KEY = 'screen-position';
const MAG_FACTOR_KEY = 'mag-factor'; const MAG_FACTOR_KEY = 'mag-factor';
@ -56,22 +53,19 @@ var MouseSpriteContent = GObject.registerClass({
vfunc_get_preferred_size() { vfunc_get_preferred_size() {
if (!this._texture) 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) { vfunc_paint_content(actor, node) {
if (!this._texture) if (!this._texture)
return; return;
let color = new Cogl.Color(); let color = Clutter.Color.get_static(Clutter.StaticColor.WHITE);
color.init_from_4ub(0, 0, 0, 0); let [minFilter, magFilter] = actor.get_content_scaling_filters();
let textureNode = new Clutter.TextureNode(this._texture, let textureNode = new Clutter.TextureNode(this._texture,
color, color, minFilter, magFilter);
Clutter.ScalingFilter.NEAREST,
Clutter.ScalingFilter.NEAREST);
textureNode.set_name('MouseSpriteContent'); textureNode.set_name('MouseSpriteContent');
node.add_child(textureNode); node.add_child(textureNode);
@ -86,8 +80,14 @@ var MouseSpriteContent = GObject.registerClass({
if (this._texture == coglTexture) if (this._texture == coglTexture)
return; return;
let oldTexture = this._texture;
this._texture = coglTexture; this._texture = coglTexture;
this.invalidate(); 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 = new Clutter.Actor({ request_mode: Clutter.RequestMode.CONTENT_SIZE });
this._mouseSprite.content = new MouseSpriteContent(); this._mouseSprite.content = new MouseSpriteContent();
this._updateSpriteTexture();
this._cursorRoot = new Clutter.Actor(); this._cursorRoot = new Clutter.Actor();
this._cursorRoot.add_actor(this._mouseSprite); this._cursorRoot.add_actor(this._mouseSprite);
@ -115,14 +114,16 @@ var Magnifier = class Magnifier {
let aZoomRegion = new ZoomRegion(this, this._cursorRoot); let aZoomRegion = new ZoomRegion(this, this._cursorRoot);
this._zoomRegions.push(aZoomRegion); this._zoomRegions.push(aZoomRegion);
let showAtLaunch = this._settingsInit(aZoomRegion); this._settingsInit(aZoomRegion);
aZoomRegion.scrollContentsTo(this.xMouse, this.yMouse); 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. // Export to dbus.
magDBusService = new MagnifierDBus.ShellMagnifier(); 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 (isActive != activate) {
if (activate) { if (activate) {
this._updateMouseSprite();
this._cursorSpriteChangedId =
this._cursorTracker.connect('cursor-changed',
this._updateMouseSprite.bind(this));
Meta.disable_unredirect_for_display(global.display); Meta.disable_unredirect_for_display(global.display);
this.startTrackingMouse(); this.startTrackingMouse();
} else { } else {
this._cursorTracker.disconnect(this._cursorSpriteChangedId);
this._mouseSprite.content.texture = null;
Meta.enable_unredirect_for_display(global.display); Meta.enable_unredirect_for_display(global.display);
this.stopTrackingMouse(); this.stopTrackingMouse();
} }
@ -495,13 +502,8 @@ var Magnifier = class Magnifier {
} }
_settingsInit(zoomRegion) { _settingsInit(zoomRegion) {
this._appSettings = new Gio.Settings({ schema_id: APPLICATIONS_SCHEMA });
this._settings = new Gio.Settings({ schema_id: MAGNIFIER_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._settings.connect('changed::' + SCREEN_POSITION_KEY,
this._updateScreenPosition.bind(this)); this._updateScreenPosition.bind(this));
this._settings.connect('changed::' + MAG_FACTOR_KEY, 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); let showCrosshairs = this._settings.get_boolean(SHOW_CROSS_HAIRS_KEY);
this.addCrosshairs(); this.addCrosshairs();
this.setCrosshairsVisible(showCrosshairs); this.setCrosshairsVisible(showCrosshairs);
return this._appSettings.get_boolean(SHOW_KEY);
} }
_updateScreenPosition() { _updateScreenPosition() {
@ -756,13 +756,41 @@ var ZoomRegion = class ZoomRegion {
this._pointerIdleMonitor = Meta.IdleMonitor.get_for_device(Meta.VIRTUAL_CORE_POINTER_ID); this._pointerIdleMonitor = Meta.IdleMonitor.get_for_device(Meta.VIRTUAL_CORE_POINTER_ID);
this._scrollContentsTimerId = 0; this._scrollContentsTimerId = 0;
}
Main.layoutManager.connect('monitors-changed', _connectSignals() {
this._monitorsChanged.bind(this)); if (this._signalConnections)
this._focusCaretTracker.connect('caret-moved', return;
this._updateCaret.bind(this));
this._focusCaretTracker.connect('focus-changed', this._signalConnections = [];
this._updateFocus.bind(this)); 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) { _updateFocus(caller, event) {
@ -810,10 +838,13 @@ var ZoomRegion = class ZoomRegion {
this._createActors(); this._createActors();
if (this._isMouseOverRegion()) if (this._isMouseOverRegion())
this._magnifier.hideSystemCursor(); this._magnifier.hideSystemCursor();
this._updateScreenPosition();
this._updateMagViewGeometry(); this._updateMagViewGeometry();
this._updateCloneGeometry(); this._updateCloneGeometry();
this._updateMousePosition(); this._updateMousePosition();
this._connectSignals();
} else { } else {
this._disconnectSignals();
this._destroyActors(); this._destroyActors();
} }
@ -1563,18 +1594,8 @@ var ZoomRegion = class ZoomRegion {
} }
_monitorsChanged() { _monitorsChanged() {
if (!this.isActive())
return;
this._background.set_size(global.screen_width, global.screen_height); this._background.set_size(global.screen_width, global.screen_height);
this._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);
} }
}; };

View File

@ -211,13 +211,6 @@ function _initializeUI() {
_startDate = new Date(); _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(); ExtensionDownloader.init();
ExtensionSystem.init(); ExtensionSystem.init();
@ -239,6 +232,13 @@ function _initializeUI() {
Shell.Global.log_structured('GNOME Shell started at ' + _startDate, Shell.Global.log_structured('GNOME Shell started at ' + _startDate,
['MESSAGE_ID=' + GNOMESHELL_STARTED_MESSAGE_ID]); ['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);
}
}); });
} }

View File

@ -95,28 +95,6 @@ var OsdMonitorLabeler = class {
this._reset(); 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) { for (let connector in params) {
let monitor = this._monitorManager.get_monitor_for_connector(connector); let monitor = this._monitorManager.get_monitor_for_connector(connector);
if (monitor == -1) if (monitor == -1)

View File

@ -1,6 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- 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 Cairo = imports.cairo;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
@ -201,7 +201,6 @@ var AppMenuButton = GObject.registerClass({
this._startingApps = []; this._startingApps = [];
this._menuManager = panel.menuManager; this._menuManager = panel.menuManager;
this._gtkSettings = Gtk.Settings.get_default();
this._targetApp = null; this._targetApp = null;
this._busyNotifyId = 0; this._busyNotifyId = 0;
@ -809,6 +808,7 @@ class AggregateMenu extends PanelMenu.Button {
menuLayout.addSizeChild(this._location.menu.actor); menuLayout.addSizeChild(this._location.menu.actor);
menuLayout.addSizeChild(this._rfkill.menu.actor); menuLayout.addSizeChild(this._rfkill.menu.actor);
menuLayout.addSizeChild(this._power.menu.actor); menuLayout.addSizeChild(this._power.menu.actor);
menuLayout.addSizeChild(this._system.buttonGroup);
} }
}); });

View File

@ -810,16 +810,8 @@ var ScreenShield = class {
this._maybeCancelDialog(); this._maybeCancelDialog();
if (this._longLightbox.actor.visible || if (this._longLightbox.actor.visible) {
this._isActive) { // We're in the process of showing.
// 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
return; return;
} }

View File

@ -1,6 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- 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 Signals = imports.signals;
const GrabHelper = imports.ui.grabHelper; const GrabHelper = imports.ui.grabHelper;
@ -227,8 +227,6 @@ var SelectArea = class {
this._lastY = 0; this._lastY = 0;
this._result = null; this._result = null;
this._initRubberbandColors();
this._group = new St.Widget({ visible: false, this._group = new St.Widget({ visible: false,
reactive: true, reactive: true,
x: 0, x: 0,
@ -248,10 +246,10 @@ var SelectArea = class {
coordinate: Clutter.BindCoordinate.ALL }); coordinate: Clutter.BindCoordinate.ALL });
this._group.add_constraint(constraint); this._group.add_constraint(constraint);
this._rubberband = new Clutter.Rectangle({ color: this._background, this._rubberband = new St.Widget({
has_border: true, style_class: 'select-area-rubberband',
border_width: 1, visible: false
border_color: this._border }); });
this._group.add_actor(this._rubberband); this._group.add_actor(this._rubberband);
} }
@ -265,25 +263,6 @@ var SelectArea = class {
this._group.visible = true; 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() { _getGeometry() {
return { x: Math.min(this._startX, this._lastX), return { x: Math.min(this._startX, this._lastX),
y: Math.min(this._startY, this._lastY), 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_position(geometry.x, geometry.y);
this._rubberband.set_size(geometry.width, geometry.height); this._rubberband.set_size(geometry.width, geometry.height);
this._rubberband.show();
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
} }

View File

@ -37,16 +37,13 @@ const { loadInterfaceXML } = imports.misc.fileUtils;
* 'yield Scripting.sleep(500);' * 'yield Scripting.sleep(500);'
*/ */
function sleep(milliseconds) { function sleep(milliseconds) {
let cb; return new Promise(resolve => {
let id = Mainloop.timeout_add(milliseconds, () => {
let id = Mainloop.timeout_add(milliseconds, () => { resolve();
if (cb) return GLib.SOURCE_REMOVE;
cb(); });
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();' * 'yield Scripting.waitLeisure();'
*/ */
function waitLeisure() { function waitLeisure() {
let cb; return new Promise(resolve => {
global.run_at_leisure(resolve);
global.run_at_leisure(() => {
if (cb)
cb();
}); });
return callback => { cb = callback; };
} }
const PerfHelperIface = loadInterfaceXML('org.gnome.Shell.PerfHelper'); const PerfHelperIface = loadInterfaceXML('org.gnome.Shell.PerfHelper');
@ -82,25 +74,16 @@ function _getPerfHelper() {
} }
function _callRemote(obj, method, ...args) { function _callRemote(obj, method, ...args) {
let cb; return new Promise((resolve, reject) => {
let errcb; args.push((result, excp) => {
if (excp)
reject(excp);
else
resolve();
});
args.push((result, excp) => { method.apply(obj, args);
if (excp) {
if (errcb)
errcb(excp);
} else {
if (cb)
cb();
}
}); });
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(); 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) { function _collect(scriptModule, outputFile) {
let eventHandlers = {}; let eventHandlers = {};
@ -348,23 +310,23 @@ function _collect(scriptModule, outputFile) {
* After running the script and collecting statistics from the * After running the script and collecting statistics from the
* event log, GNOME Shell will exit. * event log, GNOME Shell will exit.
**/ **/
function runPerfScript(scriptModule, outputFile) { async function runPerfScript(scriptModule, outputFile) {
Shell.PerfLog.get_default().set_enabled(true); 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);
try { } catch (err) {
_collect(scriptModule, outputFile); log(`Script failed: ${err}\n${err.stack}`);
} catch (err) { Meta.exit(Meta.ExitCode.ERROR);
log("Script failed: " + err + "\n" + err.stack); }
Meta.exit(Meta.ExitCode.ERROR); Meta.exit(Meta.ExitCode.SUCCESS);
}
Meta.exit(Meta.ExitCode.SUCCESS);
},
err => {
log("Script failed: " + err + "\n" + err.stack);
Meta.exit(Meta.ExitCode.ERROR);
});
} }

View File

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

View File

@ -1673,7 +1673,11 @@ var NMApplet = class extends PanelMenu.SystemIndicator {
_readDevices() { _readDevices() {
let devices = this._client.get_devices() || [ ]; let devices = this._client.get_devices() || [ ];
for (let i = 0; i < devices.length; ++i) { 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(); this._syncDeviceNames();
} }

View File

@ -236,6 +236,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
item = new PopupMenu.PopupBaseMenuItem({ reactive: false, item = new PopupMenu.PopupBaseMenuItem({ reactive: false,
can_focus: false }); can_focus: false });
this.buttonGroup = item.actor;
let app = this._settingsApp = Shell.AppSystem.get_default().lookup_app( let app = this._settingsApp = Shell.AppSystem.get_default().lookup_app(
'gnome-control-center.desktop' 'gnome-control-center.desktop'

View File

@ -46,15 +46,14 @@ var Avatar = class {
if (iconFile) { if (iconFile) {
let file = Gio.File.new_for_path(iconFile); let file = Gio.File.new_for_path(iconFile);
this.actor.child = null; 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 { } else {
this.actor.style = null; this.actor.style = null;
this.actor.child = new St.Icon({ icon_name: 'avatar-default-symbolic', this.actor.child = new St.Icon({ icon_name: 'avatar-default-symbolic',
icon_size: this._iconSize }); 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

@ -456,13 +456,28 @@ var TilePreview = class {
}; };
var TouchpadWorkspaceSwitchAction = class { var TouchpadWorkspaceSwitchAction = class {
constructor(actor) { constructor(actor, allowedModes) {
this._allowedModes = allowedModes;
this._dx = 0; this._dx = 0;
this._dy = 0; this._dy = 0;
this._enabled = true;
actor.connect('captured-event', this._handleEvent.bind(this)); actor.connect('captured-event', this._handleEvent.bind(this));
this._touchpadSettings = new Gio.Settings({schema_id: 'org.gnome.desktop.peripherals.touchpad'}); 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() { _checkActivated() {
let dir; let dir;
@ -482,15 +497,16 @@ var TouchpadWorkspaceSwitchAction = class {
} }
_handleEvent(actor, event) { _handleEvent(actor, event) {
let allowedModes = Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW;
if (event.type() != Clutter.EventType.TOUCHPAD_SWIPE) if (event.type() != Clutter.EventType.TOUCHPAD_SWIPE)
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
if (event.get_touchpad_gesture_finger_count() != 4) if (event.get_touchpad_gesture_finger_count() != 4)
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
if ((allowedModes & Main.actionMode) == 0) if ((this._allowedModes & Main.actionMode) == 0)
return Clutter.EVENT_PROPAGATE;
if (!this._enabled)
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
if (event.get_gesture_phase() == Clutter.TouchpadGesturePhase.UPDATE) { 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] }, 'motion': { param_types: [GObject.TYPE_DOUBLE, GObject.TYPE_DOUBLE] },
'cancel': { param_types: [] }}, 'cancel': { param_types: [] }},
}, class WorkspaceSwitchAction extends Clutter.SwipeAction { }, class WorkspaceSwitchAction extends Clutter.SwipeAction {
_init() { _init(allowedModes) {
super._init(); super._init();
this.set_n_touch_points(4); this.set_n_touch_points(4);
this._swept = false; this._swept = false;
this._allowedModes = allowedModes;
global.display.connect('grab-op-begin', () => { global.display.connect('grab-op-begin', () => {
this.cancel(); this.cancel();
@ -534,14 +551,12 @@ var WorkspaceSwitchAction = GObject.registerClass({
} }
vfunc_gesture_prepare(actor) { vfunc_gesture_prepare(actor) {
let allowedModes = Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW;
this._swept = false; this._swept = false;
if (!super.vfunc_gesture_prepare(actor)) if (!super.vfunc_gesture_prepare(actor))
return false; return false;
return (allowedModes & Main.actionMode); return (this._allowedModes & Main.actionMode);
} }
vfunc_gesture_progress(actor) { vfunc_gesture_progress(actor) {
@ -1043,14 +1058,15 @@ var WindowManager = class {
global.workspace_manager.override_workspace_layout(Meta.DisplayCorner.TOPLEFT, global.workspace_manager.override_workspace_layout(Meta.DisplayCorner.TOPLEFT,
false, -1, 1); 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('motion', this._switchWorkspaceMotion.bind(this));
gesture.connect('activated', this._actionSwitchWorkspace.bind(this)); gesture.connect('activated', this._actionSwitchWorkspace.bind(this));
gesture.connect('cancel', this._switchWorkspaceCancel.bind(this)); gesture.connect('cancel', this._switchWorkspaceCancel.bind(this));
global.stage.add_action(gesture); global.stage.add_action(gesture);
// This is not a normal Clutter.GestureAction, doesn't need add_action() // This is not a normal Clutter.GestureAction, doesn't need add_action()
gesture = new TouchpadWorkspaceSwitchAction(global.stage); gesture = new TouchpadWorkspaceSwitchAction(global.stage, allowedModes);
gesture.connect('motion', this._switchWorkspaceMotion.bind(this)); gesture.connect('motion', this._switchWorkspaceMotion.bind(this));
gesture.connect('activated', this._actionSwitchWorkspace.bind(this)); gesture.connect('activated', this._actionSwitchWorkspace.bind(this));
gesture.connect('cancel', this._switchWorkspaceCancel.bind(this)); gesture.connect('cancel', this._switchWorkspaceCancel.bind(this));
@ -1202,6 +1218,10 @@ var WindowManager = class {
// Same for OR windows // Same for OR windows
if (window.is_override_redirect()) if (window.is_override_redirect())
return; 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 // Windows on workspaces below pos don't need moving
let index = window.get_workspace().index(); let index = window.get_workspace().index();
if (index < pos) if (index < pos)

View File

@ -1,10 +1,11 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- 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 Signals = imports.signals;
const Main = imports.ui.main; const Main = imports.ui.main;
const Tweener = imports.ui.tweener; const Tweener = imports.ui.tweener;
const WindowManager = imports.ui.windowManager;
const Workspace = imports.ui.workspace; const Workspace = imports.ui.workspace;
var WORKSPACE_SWITCH_TIME = 0.25; var WORKSPACE_SWITCH_TIME = 0.25;
@ -82,6 +83,7 @@ var WorkspacesView = class extends WorkspacesViewBase {
this._animating = false; // tweening this._animating = false; // tweening
this._scrolling = false; // swipe-scrolling this._scrolling = false; // swipe-scrolling
this._gestureActive = false; // touch(pad) gestures
this._animatingScroll = false; // programatically updating the adjustment this._animatingScroll = false; // programatically updating the adjustment
let activeWorkspaceIndex = workspaceManager.get_active_workspace_index(); let activeWorkspaceIndex = workspaceManager.get_active_workspace_index();
@ -211,7 +213,7 @@ var WorkspacesView = class extends WorkspacesViewBase {
for (let w = 0; w < this._workspaces.length; w++) { for (let w = 0; w < this._workspaces.length; w++) {
let workspace = this._workspaces[w]; let workspace = this._workspaces[w];
if (this._animating || this._scrolling) { if (this._animating || this._scrolling || this._gestureActive) {
workspace.actor.show(); workspace.actor.show();
} else { } else {
if (this._inDrag) if (this._inDrag)
@ -223,7 +225,7 @@ var WorkspacesView = class extends WorkspacesViewBase {
} }
_updateScrollAdjustment(index) { _updateScrollAdjustment(index) {
if (this._scrolling) if (this._scrolling || this._gestureActive)
return; return;
this._animatingScroll = true; this._animatingScroll = true;
@ -300,6 +302,18 @@ var WorkspacesView = class extends WorkspacesViewBase {
this._updateVisibility(); 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 // sync the workspaces' positions to the value of the scroll adjustment
// and change the active workspace if appropriate // and change the active workspace if appropriate
_onScroll(adj) { _onScroll(adj) {
@ -310,7 +324,7 @@ var WorkspacesView = class extends WorkspacesViewBase {
let active = workspaceManager.get_active_workspace_index(); let active = workspaceManager.get_active_workspace_index();
let current = Math.round(adj.value); let current = Math.round(adj.value);
if (active != current) { if (active != current && !this._gestureActive) {
if (!this._workspaces[current]) { if (!this._workspaces[current]) {
// The current workspace was destroyed. This could happen // The current workspace was destroyed. This could happen
// when you are on the last empty workspace, and consolidate // when you are on the last empty workspace, and consolidate
@ -391,6 +405,12 @@ var ExtraWorkspaceView = class extends WorkspacesViewBase {
endSwipeScroll() { endSwipeScroll() {
} }
startTouchGesture() {
}
endTouchGesture() {
}
}; };
var DelegateFocusNavigator = GObject.registerClass( var DelegateFocusNavigator = GObject.registerClass(
@ -430,23 +450,37 @@ var WorkspacesDisplay = class {
return false; return false;
} }
for (let i = 0; i < this._workspacesViews.length; i++) this._startSwipeScroll();
this._workspacesViews[i].startSwipeScroll();
return true; return true;
}); });
panAction.connect('gesture-cancel', () => { panAction.connect('gesture-cancel', () => {
clickAction.release(); clickAction.release();
for (let i = 0; i < this._workspacesViews.length; i++) this._endSwipeScroll();
this._workspacesViews[i].endSwipeScroll();
}); });
panAction.connect('gesture-end', () => { panAction.connect('gesture-end', () => {
clickAction.release(); clickAction.release();
for (let i = 0; i < this._workspacesViews.length; i++) this._endSwipeScroll();
this._workspacesViews[i].endSwipeScroll();
}); });
Main.overview.addAction(panAction); Main.overview.addAction(panAction);
this.actor.bind_property('mapped', panAction, 'enabled', GObject.BindingFlags.SYNC_CREATE); 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;
});
switchGesture.enabled = this.actor.mapped;
this._primaryIndex = Main.layoutManager.primaryIndex; this._primaryIndex = Main.layoutManager.primaryIndex;
this._workspacesViews = []; this._workspacesViews = [];
@ -474,6 +508,47 @@ var WorkspacesDisplay = class {
return false; 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) { navigateFocus(from, direction) {
return this._getPrimaryView().actor.navigate_focus(from, direction, false); return this._getPrimaryView().actor.navigate_focus(from, direction, false);
} }

1038
po/ar.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

143
po/eo.po
View File

@ -12,9 +12,9 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2019-02-21 18:43+0000\n" "POT-Creation-Date: 2019-03-24 17:37+0000\n"
"PO-Revision-Date: 2019-02-22 13:19+0100\n" "PO-Revision-Date: 2019-03-31 00:14+0100\n"
"Last-Translator: Carmen Bianca BAKKER <carmen@carmenbianca.eu>\n" "Last-Translator: Carmen Bianca Bakker <carmen@carmenbianca.eu>\n"
"Language-Team: Esperanto <gnome-eo-list@gnome.org>\n" "Language-Team: Esperanto <gnome-eo-list@gnome.org>\n"
"Language: eo\n" "Language: eo\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -185,8 +185,8 @@ msgstr "Klavkombino por malfermi la “Montri aplikaĵojn”-vidon"
msgid "" msgid ""
"Keybinding to open the “Show Applications” view of the Activities Overview." "Keybinding to open the “Show Applications” view of the Activities Overview."
msgstr "" msgstr ""
"Klavkombino por malfermi la “Montri aplikaĵojn” vidon de la aktivecoj " "Klavkombino por malfermi la “Montri aplikaĵojn” vidon de la Aktivecoj-"
"superrigardo." "Superrigardo."
#: data/org.gnome.shell.gschema.xml.in:124 #: data/org.gnome.shell.gschema.xml.in:124
msgid "Keybinding to open the overview" msgid "Keybinding to open the overview"
@ -194,7 +194,7 @@ msgstr "Klavkombino por malfermi la superrigardon"
#: data/org.gnome.shell.gschema.xml.in:125 #: data/org.gnome.shell.gschema.xml.in:125
msgid "Keybinding to open the Activities Overview." 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 #: data/org.gnome.shell.gschema.xml.in:131
msgid "Keybinding to toggle the visibility of the notification list" 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" msgid "Network Login"
msgstr "Reta saluto" 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 #: js/extensionPrefs/main.js:116
msgid "Somethings gone wrong" msgid "Somethings gone wrong"
msgstr "Io fiaskis" msgstr "Io fiaskis"
@ -419,7 +414,7 @@ msgstr "Ĉu ne en listo?"
#. Translators: this message is shown below the username entry field #. Translators: this message is shown below the username entry field
#. to clue the user in on how to login to the local network realm #. to clue the user in on how to login to the local network realm
#: js/gdm/loginDialog.js:880 #: js/gdm/loginDialog.js:884
#, javascript-format #, javascript-format
msgid "(e.g., user or %s)" msgid "(e.g., user or %s)"
msgstr "(ekzemple, uzanto aŭ %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 #. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication #. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one) #. (and don't even care of which one)
#: js/gdm/loginDialog.js: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 #: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281
msgid "Username: " msgid "Username: "
msgstr "Uzantonomo: " msgstr "Uzantonomo: "
#: js/gdm/loginDialog.js:1223 #: js/gdm/loginDialog.js:1227
msgid "Login Window" msgid "Login Window"
msgstr "Salutfenestro" msgstr "Salutfenestro"
@ -993,7 +988,7 @@ msgstr "Portebla larĝkapacita retopasvorto"
msgid "A password is required to connect to “%s”." msgid "A password is required to connect to “%s”."
msgstr "Pasvorto estas bezonata por konekti al “%s”." msgstr "Pasvorto estas bezonata por konekti al “%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" msgid "Network Manager"
msgstr "Retadministrilo" msgstr "Retadministrilo"
@ -1240,26 +1235,26 @@ msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "Ĉu elŝuti kaj instali “%s” de extensions.gnome.org?" msgstr "Ĉu elŝuti kaj instali “%s” de extensions.gnome.org?"
#. Translators: %s is an application name like "Settings" #. Translators: %s is an application name like "Settings"
#: js/ui/inhibitShortcutsDialog.js:50 #: js/ui/inhibitShortcutsDialog.js:78
#, javascript-format #, javascript-format
msgid "%s wants to inhibit shortcuts" msgid "%s wants to inhibit shortcuts"
msgstr "%s volas malebligi klavkombinojn" msgstr "%s volas malebligi klavkombinojn"
#: js/ui/inhibitShortcutsDialog.js:51 #: js/ui/inhibitShortcutsDialog.js:79
msgid "Application wants to inhibit shortcuts" msgid "Application wants to inhibit shortcuts"
msgstr "Aplikaĵo volas malebligi klavkombinojn" msgstr "Aplikaĵo volas malebligi klavkombinojn"
#. Translators: %s is a keyboard shortcut like "Super+x" #. Translators: %s is a keyboard shortcut like "Super+x"
#: js/ui/inhibitShortcutsDialog.js:60 #: js/ui/inhibitShortcutsDialog.js:88
#, javascript-format #, javascript-format
msgid "You can restore shortcuts by pressing %s." msgid "You can restore shortcuts by pressing %s."
msgstr "Vi povas restaŭri klavkombinojn per premi %s." msgstr "Vi povas restaŭri klavkombinojn per premi %s."
#: js/ui/inhibitShortcutsDialog.js:65 #: js/ui/inhibitShortcutsDialog.js:93
msgid "Deny" msgid "Deny"
msgstr "Rifuzi" msgstr "Rifuzi"
#: js/ui/inhibitShortcutsDialog.js:71 #: js/ui/inhibitShortcutsDialog.js:100
msgid "Allow" msgid "Allow"
msgstr "Akcepti" msgstr "Akcepti"
@ -1310,13 +1305,13 @@ msgid "Leave On"
msgstr "Lasi ŝaltita" msgstr "Lasi ŝaltita"
#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 #: 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" msgid "Turn On"
msgstr "Ŝalti" msgstr "Ŝalti"
#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 #: 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: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/nightLight.js:39 js/ui/status/rfkill.js:79
#: js/ui/status/rfkill.js:106 #: js/ui/status/rfkill.js:106
msgid "Turn Off" msgid "Turn Off"
@ -1326,59 +1321,59 @@ msgstr "Malŝalti"
msgid "Leave Off" msgid "Leave Off"
msgstr "Lasi malŝaltita" msgstr "Lasi malŝaltita"
#: js/ui/keyboard.js:203 #: js/ui/keyboard.js:200
msgid "Region & Language Settings" msgid "Region & Language Settings"
msgstr "Regiono & lingvo agordoj" msgstr "Regiono & lingvo agordoj"
#: js/ui/lookingGlass.js:614 #: js/ui/lookingGlass.js:615
msgid "No extensions installed" msgid "No extensions installed"
msgstr "Neniu kromprogramo instalita" msgstr "Neniu kromprogramo instalita"
#. Translators: argument is an extension UUID. #. Translators: argument is an extension UUID.
#: js/ui/lookingGlass.js:668 #: js/ui/lookingGlass.js:669
#, javascript-format #, javascript-format
msgid "%s has not emitted any errors." msgid "%s has not emitted any errors."
msgstr "%s ne eligintaj ajnaj eraroj." msgstr "%s ne eligintaj ajnaj eraroj."
#: js/ui/lookingGlass.js:674 #: js/ui/lookingGlass.js:675
msgid "Hide Errors" msgid "Hide Errors"
msgstr "Kaŝi erarojn" 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" msgid "Show Errors"
msgstr "Montri erarojn" msgstr "Montri erarojn"
#: js/ui/lookingGlass.js:687 #: js/ui/lookingGlass.js:688
msgid "Enabled" msgid "Enabled"
msgstr "Enŝaltita" msgstr "Enŝaltita"
#. translators: #. translators:
#. * The device has been disabled #. * 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" msgid "Disabled"
msgstr "Elŝaltita" msgstr "Elŝaltita"
#: js/ui/lookingGlass.js:692 #: js/ui/lookingGlass.js:693
msgid "Error" msgid "Error"
msgstr "Eraro" msgstr "Eraro"
#: js/ui/lookingGlass.js:694 #: js/ui/lookingGlass.js:695
msgid "Out of date" msgid "Out of date"
msgstr "Neaktuala" msgstr "Neaktuala"
#: js/ui/lookingGlass.js:696 #: js/ui/lookingGlass.js:697
msgid "Downloading" msgid "Downloading"
msgstr "Elŝutante" msgstr "Elŝutante"
#: js/ui/lookingGlass.js:720 #: js/ui/lookingGlass.js:721
msgid "View Source" msgid "View Source"
msgstr "Montri fonton" msgstr "Montri fonton"
#: js/ui/lookingGlass.js:729 #: js/ui/lookingGlass.js:730
msgid "Web Page" msgid "Web Page"
msgstr "Retpaĝo" msgstr "Retpaĝo"
#: js/ui/messageTray.js:1474 #: js/ui/messageTray.js:1480
msgid "System Information" msgid "System Information"
msgstr "Sisteminformoj" msgstr "Sisteminformoj"
@ -1404,13 +1399,14 @@ msgstr "Malfari"
msgid "Overview" msgid "Overview"
msgstr "Superrigardo" msgstr "Superrigardo"
# Imperativo
#. Translators: this is the text displayed #. Translators: this is the text displayed
#. in the search entry when no search is #. in the search entry when no search is
#. active; it should not exceed ~30 #. active; it should not exceed ~30
#. characters. #. characters.
#: js/ui/overview.js:226 #: js/ui/overview.js:226
msgid "Type to search…" msgid "Type to search…"
msgstr "Tajpi por serĉi…" msgstr "Tajpu por serĉi…"
#: js/ui/padOsd.js:92 #: js/ui/padOsd.js:92
msgid "New shortcut…" msgid "New shortcut…"
@ -1462,16 +1458,16 @@ msgstr "Ĉesi"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: js/ui/panel.js:466 #: js/ui/panel.js:471
msgid "Activities" msgid "Activities"
msgstr "Aktivecoj" msgstr "Aktivecoj"
#: js/ui/panel.js:741 #: js/ui/panel.js:746
msgctxt "System menu in the top bar" msgctxt "System menu in the top bar"
msgid "System" msgid "System"
msgstr "Sistemo" msgstr "Sistemo"
#: js/ui/panel.js:861 #: js/ui/panel.js:867
msgid "Top Bar" msgid "Top Bar"
msgstr "Supra breto" msgstr "Supra breto"
@ -1520,7 +1516,7 @@ msgid_plural "%d new notifications"
msgstr[0] "%d nova sciigo" msgstr[0] "%d nova sciigo"
msgstr[1] "%d novaj sciigoj" 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" msgid "Lock"
msgstr "Ŝlosi" msgstr "Ŝlosi"
@ -1535,11 +1531,11 @@ msgstr "GNOME bezonas ŝlosi la ekranon"
#. #.
#. XXX: another option is to kick the user into the gdm login #. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs #. 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" msgid "Unable to lock"
msgstr "Ne eblas ŝlosi" 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" msgid "Lock was blocked by an application"
msgstr "Ŝloso estis blokita de aplikaĵo" msgstr "Ŝloso estis blokita de aplikaĵo"
@ -1701,7 +1697,7 @@ msgid "<unknown>"
msgstr "<nekonata>" msgstr "<nekonata>"
#. Translators: %s is a network identifier #. 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 #, javascript-format
msgid "%s Off" msgid "%s Off"
msgstr "%s malŝaltita" msgstr "%s malŝaltita"
@ -1727,7 +1723,7 @@ msgid "%s Disconnecting"
msgstr "%s malkonektante" msgstr "%s malkonektante"
#. Translators: %s is a network identifier #. 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 #, javascript-format
msgid "%s Connecting" msgid "%s Connecting"
msgstr "%s konektante" msgstr "%s konektante"
@ -1767,7 +1763,7 @@ msgid "Mobile Broadband Settings"
msgstr "Porteblaj larĝkapacitaj agordoj" msgstr "Porteblaj larĝkapacitaj agordoj"
#. Translators: %s is a network identifier #. 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 #, javascript-format
msgid "%s Hardware Disabled" msgid "%s Hardware Disabled"
msgstr "%s aparataro malŝaltita" msgstr "%s aparataro malŝaltita"
@ -1832,72 +1828,72 @@ msgid "Wi-Fi Settings"
msgstr "Vifio-agordoj" msgstr "Vifio-agordoj"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:1281 #: js/ui/status/network.js:1280
#, javascript-format #, javascript-format
msgid "%s Hotspot Active" msgid "%s Hotspot Active"
msgstr "%s retkaptejo aktiva" msgstr "%s retkaptejo aktiva"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:1296 #: js/ui/status/network.js:1295
#, javascript-format #, javascript-format
msgid "%s Not Connected" msgid "%s Not Connected"
msgstr "%s nekonektita" msgstr "%s ne konektita"
#: js/ui/status/network.js:1393 #: js/ui/status/network.js:1392
msgid "connecting…" msgid "connecting…"
msgstr "konektante…" msgstr "konektante…"
#. Translators: this is for network connections that require some kind of key or password #. Translators: this is for network connections that require some kind of key or password
#: js/ui/status/network.js:1396 #: js/ui/status/network.js:1395
msgid "authentication required" msgid "authentication required"
msgstr "aŭtentigo necesas" msgstr "aŭtentigo necesas"
#: js/ui/status/network.js:1398 #: js/ui/status/network.js:1397
msgid "connection failed" msgid "connection failed"
msgstr "konekto malsukcesis" msgstr "konekto malsukcesis"
#: js/ui/status/network.js:1448 #: js/ui/status/network.js:1447
msgid "VPN Settings" msgid "VPN Settings"
msgstr "VPR-agordoj" msgstr "VPR-agordoj"
#: js/ui/status/network.js:1465 #: js/ui/status/network.js:1464
msgid "VPN" msgid "VPN"
msgstr "VPR" msgstr "VPR"
#: js/ui/status/network.js:1475 #: js/ui/status/network.js:1474
msgid "VPN Off" msgid "VPN Off"
msgstr "VPR malŝaltita" msgstr "VPR malŝaltita"
#: 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" msgid "Network Settings"
msgstr "Ret-agordoj" msgstr "Ret-agordoj"
#: js/ui/status/network.js:1565 #: js/ui/status/network.js:1564
#, javascript-format #, javascript-format
msgid "%s Wired Connection" msgid "%s Wired Connection"
msgid_plural "%s Wired Connections" msgid_plural "%s Wired Connections"
msgstr[0] "%s drata konekto" msgstr[0] "%s drata konekto"
msgstr[1] "%s drataj konektoj" msgstr[1] "%s drataj konektoj"
#: js/ui/status/network.js:1569 #: js/ui/status/network.js:1568
#, javascript-format #, javascript-format
msgid "%s Wi-Fi Connection" msgid "%s Wi-Fi Connection"
msgid_plural "%s Wi-Fi Connections" msgid_plural "%s Wi-Fi Connections"
msgstr[0] "%s vifia konekto" msgstr[0] "%s vifia konekto"
msgstr[1] "%s vifiaj konektoj" msgstr[1] "%s vifiaj konektoj"
#: js/ui/status/network.js:1573 #: js/ui/status/network.js:1572
#, javascript-format #, javascript-format
msgid "%s Modem Connection" msgid "%s Modem Connection"
msgid_plural "%s Modem Connections" msgid_plural "%s Modem Connections"
msgstr[0] "%s modema konekto" msgstr[0] "%s modema konekto"
msgstr[1] "%s modemaj konektoj" msgstr[1] "%s modemaj konektoj"
#: js/ui/status/network.js:1702 #: js/ui/status/network.js:1701
msgid "Connection failed" msgid "Connection failed"
msgstr "Konekto malsukcesis" msgstr "Konekto malsukcesis"
#: js/ui/status/network.js:1703 #: js/ui/status/network.js:1702
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "Aktivigo de reto-konekto malsukcesis" msgstr "Aktivigo de reto-konekto malsukcesis"
@ -1979,15 +1975,15 @@ msgstr "Adiaŭi"
msgid "Account Settings" msgid "Account Settings"
msgstr "Kontoagordoj" msgstr "Kontoagordoj"
#: js/ui/status/system.js:255 #: js/ui/status/system.js:256
msgid "Orientation Lock" msgid "Orientation Lock"
msgstr "Orientiĝa ŝloso" msgstr "Orientiĝa ŝloso"
#: js/ui/status/system.js:281 #: js/ui/status/system.js:282
msgid "Suspend" msgid "Suspend"
msgstr "Dormeti" msgstr "Dormeti"
#: js/ui/status/system.js:291 #: js/ui/status/system.js:292
msgid "Power Off" msgid "Power Off"
msgstr "Malŝalti" msgstr "Malŝalti"
@ -2175,11 +2171,6 @@ msgstr "Movi al dekstra ekrano"
msgid "Evolution Calendar" msgid "Evolution Calendar"
msgstr "Evolucio-kalendaro" 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 #: src/main.c:408
msgid "Print version" msgid "Print version"
msgstr "Presi version" msgstr "Presi version"
@ -2196,12 +2187,12 @@ msgstr "Uzi specifan reĝimon, ekz. “gdm” por la salut-ekrano"
msgid "List possible modes" msgid "List possible modes"
msgstr "Listigi eblajn reĝimojn" msgstr "Listigi eblajn reĝimojn"
#: src/shell-app.c:260 #: src/shell-app.c:264
msgctxt "program" msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "Nekonata" msgstr "Nekonata"
#: src/shell-app.c:511 #: src/shell-app.c:515
#, c-format #, c-format
msgid "Failed to launch “%s”" msgid "Failed to launch “%s”"
msgstr "Malsukcesis lanĉi “%s”" msgstr "Malsukcesis lanĉi “%s”"
@ -2220,7 +2211,7 @@ msgstr "La uzanto malakceptis la aŭtentigan dialogon"
#. translators: #. translators:
#. * The number of sound outputs on a particular device #. * 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 #, c-format
msgid "%u Output" msgid "%u Output"
msgid_plural "%u Outputs" msgid_plural "%u Outputs"
@ -2229,17 +2220,23 @@ msgstr[1] "%u eligoj"
#. translators: #. translators:
#. * The number of sound inputs on a particular device #. * 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 #, c-format
msgid "%u Input" msgid "%u Input"
msgid_plural "%u Inputs" msgid_plural "%u Inputs"
msgstr[0] "%u enigo" msgstr[0] "%u enigo"
msgstr[1] "%u enigoj" msgstr[1] "%u enigoj"
#: subprojects/gvc/gvc-mixer-control.c:2738 #: subprojects/gvc/gvc-mixer-control.c:2736
msgid "System Sounds" msgid "System Sounds"
msgstr "Sistemsonoj" msgstr "Sistemsonoj"
#~ msgid "network-workgroup"
#~ msgstr "network-workgroup"
#~ msgid "evolution"
#~ msgstr "evolution"
#~ msgid "There was an error loading the preferences dialog for %s:" #~ msgid "There was an error loading the preferences dialog for %s:"
#~ msgstr "Eraro okazis dum ŝarĝado de la agorda dialogo de %s:" #~ msgstr "Eraro okazis dum ŝarĝado de la agorda dialogo de %s:"

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

1520
po/hr.po

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

View File

@ -1183,13 +1183,26 @@ _shell_app_handle_startup_sequence (ShellApp *app,
gboolean gboolean
shell_app_request_quit (ShellApp *app) shell_app_request_quit (ShellApp *app)
{ {
GActionGroup *group = NULL;
GSList *iter; GSList *iter;
if (shell_app_get_state (app) != SHELL_APP_STATE_RUNNING) if (shell_app_get_state (app) != SHELL_APP_STATE_RUNNING)
return FALSE; 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) for (iter = app->running_state->windows; iter; iter = iter->next)
{ {
MetaWindow *win = iter->data; MetaWindow *win = iter->data;

View File

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

View File

@ -7,14 +7,12 @@
#include <meta/meta-plugin.h> #include <meta/meta-plugin.h>
#include <meta/meta-shaped-texture.h> #include <meta/meta-shaped-texture.h>
#include <meta/meta-cursor-tracker.h> #include <meta/meta-cursor-tracker.h>
#include <st/st.h>
#include "shell-global.h" #include "shell-global.h"
#include "shell-screenshot.h" #include "shell-screenshot.h"
#include "shell-util.h" #include "shell-util.h"
#define A11Y_APPS_SCHEMA "org.gnome.desktop.a11y.applications"
#define MAGNIFIER_ACTIVE_KEY "screen-magnifier-enabled"
typedef struct _ShellScreenshotPrivate ShellScreenshotPrivate; typedef struct _ShellScreenshotPrivate ShellScreenshotPrivate;
struct _ShellScreenshot struct _ShellScreenshot
@ -202,6 +200,9 @@ write_screenshot_thread (GTask *result,
cairo_image_surface_get_height (priv->image)); cairo_image_surface_get_height (priv->image));
creation_time = g_date_time_format (priv->datetime, "%c"); creation_time = g_date_time_format (priv->datetime, "%c");
if (!creation_time)
creation_time = g_date_time_format (priv->datetime, "%FT%T%z");
if (gdk_pixbuf_save_to_stream (pixbuf, stream, "png", NULL, NULL, if (gdk_pixbuf_save_to_stream (pixbuf, stream, "png", NULL, NULL,
"tEXt::Software", "gnome-screenshot", "tEXt::Software", "gnome-screenshot",
"tEXt::Creation Time", creation_time, "tEXt::Creation Time", creation_time,
@ -268,9 +269,12 @@ should_draw_cursor_image (ShellScreenshotMode mode)
{ {
if (mode == SHELL_SCREENSHOT_WINDOW || !meta_is_wayland_compositor ()) if (mode == SHELL_SCREENSHOT_WINDOW || !meta_is_wayland_compositor ())
{ {
g_autoptr (GSettings) settings = g_settings_new (A11Y_APPS_SCHEMA); StSettings *settings = st_settings_get ();
gboolean magnifier_active = FALSE;
if (!g_settings_get_boolean (settings, MAGNIFIER_ACTIVE_KEY)) g_object_get (settings, "magnifier-active", &magnifier_active, NULL);
if (!magnifier_active)
return TRUE; return TRUE;
} }

View File

@ -30,6 +30,7 @@
#define KEY_DRAG_THRESHOLD "drag-threshold" #define KEY_DRAG_THRESHOLD "drag-threshold"
#define KEY_GTK_THEME "gtk-theme" #define KEY_GTK_THEME "gtk-theme"
#define KEY_GTK_ICON_THEME "icon-theme" #define KEY_GTK_ICON_THEME "icon-theme"
#define KEY_MAGNIFIER_ACTIVE "screen-magnifier-enabled"
enum { enum {
PROP_0, PROP_0,
@ -38,6 +39,7 @@ enum {
PROP_DRAG_THRESHOLD, PROP_DRAG_THRESHOLD,
PROP_GTK_THEME, PROP_GTK_THEME,
PROP_GTK_ICON_THEME, PROP_GTK_ICON_THEME,
PROP_MAGNIFIER_ACTIVE,
N_PROPS N_PROPS
}; };
@ -48,11 +50,13 @@ struct _StSettings
GObject parent_object; GObject parent_object;
GSettings *interface_settings; GSettings *interface_settings;
GSettings *mouse_settings; GSettings *mouse_settings;
GSettings *a11y_settings;
gchar *gtk_theme; gchar *gtk_theme;
gchar *gtk_icon_theme; gchar *gtk_icon_theme;
gboolean enable_animations; gboolean enable_animations;
gboolean primary_paste; gboolean primary_paste;
gboolean magnifier_active;
gint drag_threshold; gint drag_threshold;
}; };
@ -105,6 +109,9 @@ st_settings_get_property (GObject *object,
case PROP_GTK_ICON_THEME: case PROP_GTK_ICON_THEME:
g_value_set_string (value, settings->gtk_icon_theme); g_value_set_string (value, settings->gtk_icon_theme);
break; break;
case PROP_MAGNIFIER_ACTIVE:
g_value_set_boolean (value, settings->magnifier_active);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
} }
@ -144,6 +151,11 @@ st_settings_class_init (StSettingsClass *klass)
"GTK+ Icon Theme", "GTK+ Icon Theme",
"", "",
G_PARAM_READABLE); G_PARAM_READABLE);
props[PROP_MAGNIFIER_ACTIVE] = g_param_spec_boolean("magnifier-active",
"Magnifier is active",
"Weather the a11y magnifier is active",
FALSE,
G_PARAM_READABLE);
g_object_class_install_properties (object_class, N_PROPS, props); g_object_class_install_properties (object_class, N_PROPS, props);
} }
@ -190,6 +202,18 @@ on_mouse_settings_changed (GSettings *g_settings,
} }
} }
static void
on_a11y_settings_changed (GSettings *g_settings,
const gchar *key,
StSettings *settings)
{
if (g_str_equal (key, KEY_MAGNIFIER_ACTIVE))
{
settings->magnifier_active = g_settings_get_boolean (g_settings, key);
g_object_notify_by_pspec (G_OBJECT (settings), props[PROP_MAGNIFIER_ACTIVE]);
}
}
static void static void
st_settings_init (StSettings *settings) st_settings_init (StSettings *settings)
{ {
@ -201,6 +225,10 @@ st_settings_init (StSettings *settings)
g_signal_connect (settings->interface_settings, "changed", g_signal_connect (settings->interface_settings, "changed",
G_CALLBACK (on_mouse_settings_changed), settings); G_CALLBACK (on_mouse_settings_changed), settings);
settings->a11y_settings = g_settings_new ("org.gnome.desktop.a11y.applications");
g_signal_connect (settings->a11y_settings, "changed",
G_CALLBACK (on_a11y_settings_changed), settings);
settings->enable_animations = g_settings_get_boolean (settings->interface_settings, settings->enable_animations = g_settings_get_boolean (settings->interface_settings,
KEY_ENABLE_ANIMATIONS); KEY_ENABLE_ANIMATIONS);
settings->primary_paste = g_settings_get_boolean (settings->interface_settings, settings->primary_paste = g_settings_get_boolean (settings->interface_settings,
@ -211,6 +239,8 @@ st_settings_init (StSettings *settings)
KEY_GTK_ICON_THEME); KEY_GTK_ICON_THEME);
settings->drag_threshold = g_settings_get_int (settings->mouse_settings, settings->drag_threshold = g_settings_get_int (settings->mouse_settings,
KEY_DRAG_THRESHOLD); KEY_DRAG_THRESHOLD);
settings->magnifier_active = g_settings_get_boolean (settings->a11y_settings,
KEY_MAGNIFIER_ACTIVE);
} }
/** /**

View File

@ -24,6 +24,8 @@
#ifndef __ST_SETTINGS_H__ #ifndef __ST_SETTINGS_H__
#define __ST_SETTINGS_H__ #define __ST_SETTINGS_H__
#include <glib-object.h>
G_BEGIN_DECLS G_BEGIN_DECLS
#define ST_TYPE_SETTINGS (st_settings_get_type ()) #define ST_TYPE_SETTINGS (st_settings_get_type ())
@ -31,4 +33,6 @@ G_DECLARE_FINAL_TYPE (StSettings, st_settings, ST, SETTINGS, GObject)
StSettings * st_settings_get (void); StSettings * st_settings_get (void);
G_END_DECLS
#endif /* __ST_SETTINGS_H__ */ #endif /* __ST_SETTINGS_H__ */

View File

@ -502,7 +502,7 @@ pixbuf_to_st_content_image (GdkPixbuf *pixbuf,
width *= paint_scale; width *= paint_scale;
if (height < 0) if (height < 0)
height = ceilf (gdk_pixbuf_get_width (pixbuf) / resource_scale); height = ceilf (gdk_pixbuf_get_height (pixbuf) / resource_scale);
else else
height *= paint_scale; height *= paint_scale;

View File

@ -119,6 +119,10 @@ st_theme_node_transition_new (StThemeNode *from_node,
return transition; return transition;
} }
/**
* st_theme_node_transition_get_new_paint_state: (skip)
*
*/
StThemeNodePaintState * StThemeNodePaintState *
st_theme_node_transition_get_new_paint_state (StThemeNodeTransition *transition) st_theme_node_transition_get_new_paint_state (StThemeNodeTransition *transition)
{ {

View File

@ -579,7 +579,11 @@ get_root_theme_node (ClutterStage *stage)
StThemeNode * StThemeNode *
st_widget_get_theme_node (StWidget *widget) st_widget_get_theme_node (StWidget *widget)
{ {
StWidgetPrivate *priv = st_widget_get_instance_private (widget); StWidgetPrivate *priv;
g_return_val_if_fail (ST_IS_WIDGET (widget), NULL);
priv = st_widget_get_instance_private (widget);
if (priv->theme_node == NULL) if (priv->theme_node == NULL)
{ {