Compare commits

..

51 Commits

Author SHA1 Message Date
Florian Müllner
7a2d4959f2 Bump version to 3.25.2
Update NEWS.
2017-05-24 23:51:43 +02:00
Florian Müllner
6b3c9539f6 st: Fix doc comment
The trailing colon breaks recent versions of gtk-doc, so drop it.
2017-05-24 23:39:51 +02:00
Florian Müllner
7e7e3ec016 lookingGlass: Use standard icon names for GC icon
Commit b929320d4 added a toolbar item to force garbage collection,
however it won't be visible for most users, as it uses a non-standard
legacy icon name (the default icon theme dropped it as far back as 2009).

https://bugzilla.gnome.org/show_bug.cgi?id=782982
2017-05-24 23:39:51 +02:00
Alessandro Bono
83fb34608c windowManager: Add animations for maximize and unmaximize
The fullscreen animation code is now generic enough to handle any
size change animations, so stop limiting it to (un)fullscreen to
get animations on (un)maximize as well.

https://bugzilla.gnome.org/show_bug.cgi?id=766685
2017-05-24 21:10:28 +02:00
Alessandro Bono
a72f0604dc windowManager: Rename functions and variables
Stop using the word 'fullscreen' since the code is also
going to be used for maximize and tile actions.

https://bugzilla.gnome.org/show_bug.cgi?id=766685
2017-05-24 21:10:28 +02:00
Alessandro Bono
4dfad536a3 windowManager: Use sourceRect for consistency
Now that we always pass the old frame rect, we can use that
instead of picking up the dimensions of the clone actor.

https://bugzilla.gnome.org/show_bug.cgi?id=766685
2017-05-24 21:10:28 +02:00
Alessandro Bono
0dca5e513b windowManager: Generalize translation values
Currently, the translation values are set with the assumption that
one of the actors represents a fullscreen window. In order to
generalize it for any size change transition, we can simply swap
the monitor rect with the source or target rect as appropriate,
and translate the actor from the target to the source position by
subtracting the former and adding the latter.

https://bugzilla.gnome.org/show_bug.cgi?id=766685
2017-05-24 21:10:28 +02:00
Alessandro Bono
7090592477 windowManager: Rename variable
Since there is already targetRect that represents where the
window is going to move, rename oldRect to sourceRect to
represent from where the window is moving.

https://bugzilla.gnome.org/show_bug.cgi?id=766685
2017-05-24 21:10:28 +02:00
Ting-Wei Lan
63f2fdd1a4 build: Use #!/bin/sh instead of #!/bin/bash
There is no bashism in autogen.sh now.

https://bugzilla.gnome.org/show_bug.cgi?id=780215
2017-05-24 22:08:33 +08:00
Carlos Garnacho
e94de67bd2 switcherPopup: Ignore implicit enter events when the popup is mapped
If the popup happens to be mapped beneath the pointer, mutter will now
emit an implicit enter notify event (i.e. not caused by pointer motion).
In this case the switcherPopup still goes and selects the item, which
results in too sensitive alt-tab menus if the pointer happens to be in
the wrong place.

Make highlighting rely on motion events instead, so it always involves
user interaction when triggered by the pointer.

https://bugzilla.gnome.org/show_bug.cgi?id=755164
2017-05-23 18:38:35 +02:00
Florian Müllner
817ff52414 util: Always use 12h format if requested
Whether we show times in 12h format currently depends on:
 - the 'clock-format' desktop setting
 - the locale support for AM/PM

This was consist with other GNOME components, however both the
WallClock[0] and the Date+Time Settings panel[1] dropped the
second check after GDateTime started supporting AM/PM independently
from the locale, so we should follow suite.

[0] https://git.gnome.org/browse/gnome-desktop/commit?id=226fe725ef2cb2
[1] https://git.gnome.org/browse/gnome-control-center/commit?id=85cd910af

https://bugzilla.gnome.org/show_bug.cgi?id=782930
2017-05-22 15:41:29 +02:00
Michael Biebl
a55599a239 Switch to stable libsecret API
Most of the libsecret API was declared stable in 0.18 and the stable API
now provides everything we need, so switch from libsecret-unstable to
libsecret-1.

https://bugzilla.gnome.org/show_bug.cgi?id=782637
2017-05-21 04:49:11 +02:00
Furkan Ahmet Kara
94114d82ff Update Turkish translation
(cherry picked from commit e7ad9d7217)
2017-05-20 03:52:11 +00:00
Florian Müllner
7cc88f96c4 theme: Update sass submodule 2017-05-19 19:02:32 +02:00
Alessandro Bono
447bf55e45 panel: Add transparency when free-floating
The solid black top bar we currently use works well for maximized
or tiled windows, as it puts focus on the application content by
blending into the monitor bezel. However it also visually reduces
the screen space, which is particularly noticeable when no window
is located nearby. Having the top bar blend with the background is
a better option in that case, so track window positions and add
some transparency when the top bar is free-floating.

https://bugzilla.gnome.org/show_bug.cgi?id=747163
2017-05-19 18:58:40 +02:00
Jeremy Bicha
9d53a7700a tests: Update markup test for function moved to messageList
https://bugzilla.gnome.org/show_bug.cgi?id=782802
2017-05-19 08:30:04 -04:00
Милош Поповић
51145a3d41 Update Serbian Latin translation
(cherry picked from commit 4c1467196e)
2017-05-18 21:56:33 +00:00
Милош Поповић
1297315cc2 Update Serbian translation 2017-05-18 21:54:51 +00:00
Christian Stadelmann
b859a7f763 Update German translation
(cherry picked from commit 946ff3b380)
2017-05-18 18:55:55 +00:00
Carlos Garnacho
41baf0fc74 keyboard: Drop dbus naming semantics from Set[Entry|Cursor]Location
Those functions don't proxy dbus method calls anymore, so just drop the
uppercase 'S'.

https://bugzilla.gnome.org/show_bug.cgi?id=777342
2017-05-15 14:50:02 +02:00
Carlos Garnacho
c324395ee6 keyboard: Remove Show/Hide calls
And merge with the "internal" show/hide() ones. Those functions don't
proxy dbus method calls anymore, so it makes no sense to expose these.
Also, the timestamp is no longer needed as there is a single source for
these events.

https://bugzilla.gnome.org/show_bug.cgi?id=777342
2017-05-15 14:50:02 +02:00
Carlos Garnacho
aecd1c126a keyboard: Avoid runtime dependency on the Caribou daemon
The caribou daemon only gives us focus tracking, which is almost 1:1 with
our own FocusCaretTracker implementation. This means we can entirely
replace the Caribou daemon inside gnome-shell, reducing the Caribou
dependency to just libcaribou, and more specifically the
CaribouKeyboardModel we pull the keyboard models from.

As we still need underneath a CaribouDisplayAdapter to drive the keyboard,
reuse the wayland one, which has been renamed to make it look generic, plus
it will use the virtual input device API from mutter/clutter.

https://bugzilla.gnome.org/show_bug.cgi?id=777342
2017-05-15 14:50:02 +02:00
Matthias Liertzer
9b7304488e Fix bashism in autogen.sh
https://bugzilla.gnome.org/show_bug.cgi?id=780215
2017-05-11 15:54:16 +02:00
Florian Müllner
6362b3d057 dateMenu: Fix a runtime warning
GJS now warns about excess parameters, so wrap the queue_relayout()
into an anonymous function instead of using it directly as signal
handler.
2017-05-11 15:20:10 +02:00
Daiki Ueno
0142fae742 search: copy result to clipboard if requested
Some search providers such as GNOME Characters want to copy search
results to clipboard.  However, on Wayland, clipboards are only
accessible from applications that have a visible surface on display.

This patch allows a search provider to request the shell to copy a
search result to clipboard when 'clipboardText' is included in the meta
of the result.

https://bugzilla.gnome.org/show_bug.cgi?id=775099
2017-05-11 11:11:22 +02:00
Mario Sanchez Prada
73680e2433 popupMenu: Change the position of the icon in PopupImageMenuItem
We are moving the icon to be added before the text instead of after,
which is consistent with other menu items in other popup menus, such
as the ones in the system indicator's popup menu.

https://bugzilla.gnome.org/show_bug.cgi?id=782166
2017-05-09 18:32:23 +01:00
Mario Sanchez Prada
e38c26894b popupMenu: Allow specifying an icon on PopupMenuBase.addAction()
This allows passing an optional icon parameter to addAction()
so that a PopupImageMenuItem instance is created instead of a
PopupMenuItem if an icon is specified.

https://bugzilla.gnome.org/show_bug.cgi?id=782166
2017-05-09 18:32:23 +01:00
Mario Sanchez Prada
28ca96064b popupMenu: Accept either an icon name or a GIcon on PopupImageMenuItem
Add an extra check to setIcon() so that either a GIcon or an string
with the icon's name is handlded, so that we can create menu items
in different ways (e.g. by passing a GIcon created from a resource).

https://bugzilla.gnome.org/show_bug.cgi?id=782166
2017-05-09 18:32:23 +01:00
Jordi Mas
be95a63a03 Update Catalan translation 2017-05-07 21:31:02 +02:00
Florian Müllner
2a3a5dfc0b theme: Use font-relative width for prompts
The usual expectation when selecting large fonts is for content to
be bigger, not that less content is displayed. While not always
possible, there's no reason not to scale modal dialogues with the
font size.

https://bugzilla.gnome.org/show_bug.cgi?id=782000
2017-05-05 11:27:29 +02:00
Florian Müllner
94a0ae1ec3 entry: Fix *-icon-clicked handler
Commit ffe4eaf00d broke the handler by fetching the instance private
from the wrong actor - as we don't use the ::primary-icon-clicked signal,
and the ::secondary-icon-clicked signal still works by accident, nobody
noticed until now ...

https://bugzilla.gnome.org/show_bug.cgi?id=782190
2017-05-05 00:38:54 +02:00
Florian Müllner
44fb014a0d Bump version to 3.25.1
Update NEWS.
2017-04-27 18:30:05 +02:00
Florian Müllner
8007f4dda3 docs: Fix typo 2017-04-27 18:30:05 +02:00
Emilio Pozuelo Monfort
ff425d1db7 extensionSystem: handle reloading broken extensions
Some extensions out there may fail to reload. When that happens,
we need to catch any exceptions so that we don't leave things in
a broken state that could lead to leaving extensions enabled in
the screen shield.

https://bugzilla.gnome.org/show_bug.cgi?id=781728
2017-04-25 17:47:08 +02:00
Khaled Hosny
9a65f20d91 Update Arabic translation 2017-04-24 16:40:38 +02:00
Jordi Mas
0770383f78 Fix to Catalan translation 2017-04-22 22:07:28 +02:00
Florian Müllner
06fdf2fdc8 extensionPrefs: Avoid a runtime warning
Since 5b3fb024be, the main window is only shown when not launched
with a valid UUID. As GtkDialog isn't meant to be used standalone,
we currently trigger a (harmless but annoying) warning in case
the main window isn't shown; we can avoid the warning by setting
up the preference dialog manually instead of using the GtkDialog
convenience class.

https://bugzilla.gnome.org/show_bug.cgi?id=781545
2017-04-20 19:18:23 +02:00
Florian Müllner
7a20683728 extensionPrefs: Fix enum member name 2017-04-20 17:35:35 +02:00
raresvis
8e443a2aff WeatherClient: set enabled providers after setting a valid location
So far, the GWeatherInfo was given the enabled weather providers
as a parameter, at construction time. Because of the way in
which libgweather was designed, setting the providers right from
the beginning enabled libgweather to use them internally in order
to update its state. Updating the internal state is only relevant
when there is a valid location set, which is not guaranteed at the
time when the GWeatherInfo object is constructed.

In order to fix this, enable no providers at construction time and
only set valid providers after setting a valid location.

https://bugzilla.gnome.org/show_bug.cgi?id=780404
2017-04-19 20:41:35 +03:00
Xiaoguang Wang
fcbb942e24 loginDialog: Fix session button can be clicked
When session menu button is hidden, button can be clicked and show popup
menu.

https://bugzilla.gnome.org/show_bug.cgi?id=781482
2017-04-19 10:27:41 -04:00
Philip Chimento
1508d76d32 build: Require bash for pushd
If using sh, there's no pushd. Make autogen.sh execute with bash instead.
2017-04-15 00:00:54 -07:00
Марко Костић
ef9dee2a05 Update Serbian translation 2017-04-13 00:09:44 +00:00
Milo Casagrande
2714d8d0ce Update Italian translation
(cherry picked from commit 635bdea284)
2017-04-11 06:41:37 +00:00
Florian Müllner
243dae14ea background: Fix file check
The _animationFile property was removed in commit 8a4c862633 ...
2017-04-11 02:43:07 +02:00
Carlos Soriano
2cce1b9ea0 appFavorites: Rename gnome-music.desktop
Recently Music gained a flatpak manifest inside the repo in bug 779905.
However that requires the desktop file to be properly named like
DBUS addresses are.

This patch renames the old Music desktop file to the new one.

https://bugzilla.gnome.org/show_bug.cgi?id=780157
2017-04-09 11:04:40 +02:00
gogo
89f4e983d6 Update Croatian translation
(cherry picked from commit c526413119)
2017-04-08 15:16:44 +00:00
Γιάννης Κουτσούκος
f680cf6050 Update Greek translation 2017-04-08 15:07:01 +00:00
Jonas Ådahl
4cd4678194 Add ShowMonitorLabels2 D-Bus API
Add a new D-Bus method for setting the monitor labels. This new method
takes connector names instead of output ids for associating with actual
monitors.

https://bugzilla.gnome.org/show_bug.cgi?id=777732
2017-04-07 22:30:35 +08:00
Jonas Ådahl
082bc20bb9 shell-global: Get UI scaling factor from mutter
Let mutter determine the UI scale, while taking things like monitor
layout mode into consideration.

https://bugzilla.gnome.org/show_bug.cgi?id=777732
2017-04-07 22:30:35 +08:00
Jonas Ådahl
32ea7d763a Don't set clutters 'window-scaling-factor' property
It doesn't exist anymore.

https://bugzilla.gnome.org/show_bug.cgi?id=777732
2017-04-07 22:30:35 +08:00
Carlos Garnacho
44e80f4c46 st-texture-cache: Plug some pixbuf refcount leaks on async operations
When extracting the sliced image, the GTask grants data ownership on
g_task_propagate_*, so the pixbuf list must be properly freed. On async
load, we just left a dangling reference when returning on the async
task.

https://bugzilla.gnome.org/show_bug.cgi?id=642652
2017-04-07 14:17:59 +02:00
42 changed files with 834 additions and 802 deletions

51
NEWS
View File

@@ -1,35 +1,23 @@
3.24.3
3.25.2
======
* Bypass proxies for captive portal [Bastien; #769692]
* Fix missing icons in freedesktop notifications [Florian; #784245]
* Fix blocked clicks in shutdown dialog [Florian; #781738]
* Implement tablet rings/strips configuration [Carlos; #782033]
* Misc. bug fixes [Matthias, Jeremy, Bastien, Florian; #780215, #782802,
#783286, #784130, #784353, #781471]
Contributors:
Jeremy Bicha, Carlos Garnacho, Matthias Liertzer, Florian Müllner,
Bastien Nocera
Translations:
Christian Stadelmann [de], Марко Костић [sr], Милош Поповић [sr@latin],
Furkan Ahmet Kara [tr], Jeremy Bicha [es, he]
3.24.2
======
* Only fetch weather information when there's a valid location [Rares; #780404]
* Handle extension errors during reload due to settings change [Emilio; #781728]
* Fix StEntry::primary-icon-clicked emission [Florian; #782190]
* Allow search providers to provide clipboard text for results [Daiki; #775099]
* Misc. bug fixes [Florian; #781545]
* Add an optional icon parameter to PopupMenu.addAction() [Mario; #782166]
* Allow search providers to include clipboard text with results [Daiki; #775099]
* Reduce dependency on Caribou [Carlos; #777342]
* Add transparency to top bar when free floating [Alessandro; #747163]
* Animate maximize/unmaximize operations [Alessandro; #766685]
* Misc. bug fixes [Florian, Matthias, Jeremy, Michael, Carlos, Lan; #782000,
#780215, #782802, #782637, #782930, #755164, #780215, #782982]
Contributors:
Florian Müllner, Emilio Pozuelo Monfort, Daiki Ueno, Rares Visalom
Jeremy Bicha, Michael Biebl, Alessandro Bono, Carlos Garnacho, Ting-Wei Lan,
Matthias Liertzer, Florian Müllner, Mario Sanchez Prada, Daiki Ueno
Translations:
Milo Casagrande [it], Милош Поповић [sr], Khaled Hosny [ar]
Jordi Mas [ca], Christian Stadelmann [de], Милош Поповић [sr],
Милош Поповић [sr@latin], Furkan Ahmet Kara [tr]
3.24.1
3.25.1
======
* Close Wifi selection dialog on lock [Florian; #780054]
* Fix DND over window previews in overview [Florian; #737166]
@@ -37,11 +25,15 @@ Translations:
* Follow GNOME Weather's location permissions [Florian; #780252]
* Fix portals that require a new window to be loaded [Catalin; #759044]
* Fix restricting menus to screen height on HiDPI displays [Cosimo; #753305]
* Misc. bug fixes and cleanups [Florian, Cosimo, Bastien, Catalin, Carlos;
#780063, #780321, #780381, #780453, #758873, #780606, #642652]
* Misc. bug fixes and cleanups [Florian, Cosimo, Bastien, Catalin, Carlos G.,
Jonas, Carlos S., Xiaoguang, Rares, Emilio; #780063, #780321, #780381,
#780453, #758873, #780606, #642652, #777732, #780157, #781482, #780404,
#781545, #781728]
Contributors:
Cosimo Cecchi, Carlos Garnacho, Catalin Iacob, Florian Müllner, Bastien Nocera
Jonas Ådahl, Cosimo Cecchi, Philip Chimento, Carlos Garnacho, Catalin Iacob,
Florian Müllner, Bastien Nocera, Emilio Pozuelo Monfort, Carlos Soriano,
Rares Visalom, Xiaoguang Wang
Translations:
Marek Cernocky [cs], Piotr Drąg [pl], Anders Jonsson [sv], Stas Solovey [ru],
@@ -51,7 +43,8 @@ Translations:
Changwoo Ryu [ko], Mario Blättermann [de], Fran Dieguez [gl],
Dušan Kazik [sk], Yuras Shumovich [be], Fabio Tomat [fur],
Kjartan Maraas [nb], Aurimas Černius [lt], Trần Ngọc Quân [vi],
Rūdolfs Mazurs [lv], Ask Hjorth Larsen [da], Tom Tryfonidis [el], gogo [hr]
Rūdolfs Mazurs [lv], Γιάννης Κουτσούκος [el], gogo [hr], Марко Костић [sr],
Jordi Mas [ca], Khaled Hosny [ar]
3.24.0
======

View File

@@ -1,5 +1,5 @@
AC_PREREQ(2.63)
AC_INIT([gnome-shell],[3.24.3],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_INIT([gnome-shell],[3.25.2],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AX_IS_RELEASE([git-directory])
AC_CONFIG_HEADERS([config.h])
@@ -85,9 +85,9 @@ AC_MSG_RESULT($enable_systemd)
GOBJECT_INTROSPECTION_MIN_VERSION=1.49.1
GJS_MIN_VERSION=1.47.0
MUTTER_MIN_VERSION=3.24.0
MUTTER_MIN_VERSION=3.25.2
GTK_MIN_VERSION=3.15.0
GIO_MIN_VERSION=2.45.3
GIO_MIN_VERSION=2.53.0
LIBECAL_MIN_VERSION=3.5.3
LIBEDATASERVER_MIN_VERSION=3.17.2
POLKIT_MIN_VERSION=0.100
@@ -190,7 +190,7 @@ if test "x$enable_networkmanager" != "xno"; then
[libnm-glib
libnm-util >= $NETWORKMANAGER_MIN_VERSION
libnm-gtk >= $NETWORKMANAGER_MIN_VERSION
libsecret-unstable],
libsecret-1 >= 0.18],
[have_networkmanager=yes],
[have_networkmanager=no])

View File

@@ -300,7 +300,7 @@ StScrollBar {
padding-bottom: 6px; }
.mount-question-dialog-subject {
max-width: 500px; }
max-width: 34em; }
.show-processes-dialog-subject:rtl,
.mount-question-dialog-subject:rtl {
@@ -345,7 +345,7 @@ StScrollBar {
/* Password or Authentication Dialog */
.prompt-dialog {
width: 500px;
width: 34em;
border: 3px solid rgba(238, 238, 236, 0.2); }
.prompt-dialog-main-layout {
@@ -669,7 +669,9 @@ StScrollBar {
/* TOP BAR */
#panel {
background-color: black;
background-color: rgba(0, 0, 0, 0.2);
/* transition from solid to transparent */
transition-duration: 500ms;
font-weight: bold;
height: 1.86em; }
#panel.unlock-screen, #panel.login-screen, #panel.lock-screen {
@@ -678,7 +680,7 @@ StScrollBar {
spacing: 4px; }
#panel .panel-corner {
-panel-corner-radius: 6px;
-panel-corner-background-color: black;
-panel-corner-background-color: rgba(0, 0, 0, 0.2);
-panel-corner-border-width: 2px;
-panel-corner-border-color: transparent; }
#panel .panel-corner:active, #panel .panel-corner:overview, #panel .panel-corner:focus {
@@ -691,14 +693,24 @@ StScrollBar {
-natural-hpadding: 12px;
-minimum-hpadding: 6px;
font-weight: bold;
color: #ccc;
color: #eee;
text-shadow: 0px 0px 2px rgba(0, 0, 0, 0.9);
transition-duration: 100ms; }
#panel .panel-button .app-menu-icon {
-st-icon-style: symbolic;
margin-left: 4px;
margin-right: 4px; }
#panel .panel-button .system-status-icon,
#panel .panel-button .app-menu-icon > StIcon,
#panel .panel-button .popup-menu-arrow {
icon-shadow: 0px 0px 2px rgba(0, 0, 0, 0.9); }
#panel .panel-button:hover {
color: white; }
color: white;
text-shadow: 0px 0px 8px black; }
#panel .panel-button:hover .system-status-icon,
#panel .panel-button:hover .app-menu-icon > StIcon,
#panel .panel-button:hover .popup-menu-arrow {
icon-shadow: 0px 0px 8px black; }
#panel .panel-button:active, #panel .panel-button:overview, #panel .panel-button:focus, #panel .panel-button:checked {
background-color: rgba(0, 0, 0, 0.01);
box-shadow: inset 0 -2px 0px #256ab1;
@@ -719,6 +731,21 @@ StScrollBar {
spacing: 0; }
#panel .screencast-indicator {
color: #f57900; }
#panel.solid {
background-color: black;
/* transition from transparent to solid */
transition-duration: 300ms; }
#panel.solid .panel-corner {
-panel-corner-background-color: black; }
#panel.solid .panel-button {
color: #ccc;
text-shadow: none; }
#panel.solid .panel-button:hover {
color: white; }
#panel.solid .system-status-icon,
#panel.solid .app-menu-icon > StIcon,
#panel.solid .popup-menu-arrow {
icon-shadow: none; }
#calendarArea {
padding: 0.75em 1.0em; }
@@ -1010,9 +1037,9 @@ StScrollBar {
/* NETWORK DIALOGS */
.nm-dialog {
max-height: 500px;
min-height: 450px;
min-width: 470px; }
max-height: 34em;
min-height: 31em;
min-width: 32em; }
.nm-dialog-content {
spacing: 20px;

View File

@@ -300,7 +300,7 @@ StScrollBar {
padding-bottom: 6px; }
.mount-question-dialog-subject {
max-width: 500px; }
max-width: 34em; }
.show-processes-dialog-subject:rtl,
.mount-question-dialog-subject:rtl {
@@ -345,7 +345,7 @@ StScrollBar {
/* Password or Authentication Dialog */
.prompt-dialog {
width: 500px;
width: 34em;
border: 3px solid rgba(238, 238, 236, 0.2); }
.prompt-dialog-main-layout {
@@ -669,7 +669,9 @@ StScrollBar {
/* TOP BAR */
#panel {
background-color: black;
background-color: rgba(0, 0, 0, 0.2);
/* transition from solid to transparent */
transition-duration: 500ms;
font-weight: bold;
height: 1.86em; }
#panel.unlock-screen, #panel.login-screen, #panel.lock-screen {
@@ -678,7 +680,7 @@ StScrollBar {
spacing: 4px; }
#panel .panel-corner {
-panel-corner-radius: 6px;
-panel-corner-background-color: black;
-panel-corner-background-color: rgba(0, 0, 0, 0.2);
-panel-corner-border-width: 2px;
-panel-corner-border-color: transparent; }
#panel .panel-corner:active, #panel .panel-corner:overview, #panel .panel-corner:focus {
@@ -691,14 +693,24 @@ StScrollBar {
-natural-hpadding: 12px;
-minimum-hpadding: 6px;
font-weight: bold;
color: #ccc;
color: #eee;
text-shadow: 0px 0px 2px rgba(0, 0, 0, 0.9);
transition-duration: 100ms; }
#panel .panel-button .app-menu-icon {
-st-icon-style: symbolic;
margin-left: 4px;
margin-right: 4px; }
#panel .panel-button .system-status-icon,
#panel .panel-button .app-menu-icon > StIcon,
#panel .panel-button .popup-menu-arrow {
icon-shadow: 0px 0px 2px rgba(0, 0, 0, 0.9); }
#panel .panel-button:hover {
color: white; }
color: white;
text-shadow: 0px 0px 8px black; }
#panel .panel-button:hover .system-status-icon,
#panel .panel-button:hover .app-menu-icon > StIcon,
#panel .panel-button:hover .popup-menu-arrow {
icon-shadow: 0px 0px 8px black; }
#panel .panel-button:active, #panel .panel-button:overview, #panel .panel-button:focus, #panel .panel-button:checked {
background-color: rgba(0, 0, 0, 0.01);
box-shadow: inset 0 -2px 0px #256ab1;
@@ -719,6 +731,21 @@ StScrollBar {
spacing: 0; }
#panel .screencast-indicator {
color: #f57900; }
#panel.solid {
background-color: black;
/* transition from transparent to solid */
transition-duration: 300ms; }
#panel.solid .panel-corner {
-panel-corner-background-color: black; }
#panel.solid .panel-button {
color: #ccc;
text-shadow: none; }
#panel.solid .panel-button:hover {
color: white; }
#panel.solid .system-status-icon,
#panel.solid .app-menu-icon > StIcon,
#panel.solid .popup-menu-arrow {
icon-shadow: none; }
#calendarArea {
padding: 0.75em 1.0em; }
@@ -1010,9 +1037,9 @@ StScrollBar {
/* NETWORK DIALOGS */
.nm-dialog {
max-height: 500px;
min-height: 450px;
min-width: 470px; }
max-height: 34em;
min-height: 31em;
min-width: 32em; }
.nm-dialog-content {
spacing: 20px;

View File

@@ -775,10 +775,12 @@ const LoginDialog = new Lang.Class({
},
_onPrompted: function() {
this._sessionMenuButton.updateSensitivity(true);
if (this._shouldShowSessionMenuButton())
if (this._shouldShowSessionMenuButton()) {
this._sessionMenuButton.updateSensitivity(true);
this._authPrompt.setActorInDefaultButtonWell(this._sessionMenuButton.actor);
} else {
this._sessionMenuButton.updateSensitivity(false);
}
this._showPrompt();
},
@@ -881,6 +883,7 @@ const LoginDialog = new Lang.Class({
}));
this._updateCancelButton();
this._sessionMenuButton.updateSensitivity(false);
this._authPrompt.updateSensitivity(true);
this._showPrompt();
},

View File

@@ -128,9 +128,6 @@ const ShellUserVerifier = new Lang.Class({
this._client = client;
this._defaultService = null;
this._preemptingService = null;
this._settings = new Gio.Settings({ schema_id: LOGIN_SCREEN_SCHEMA });
this._settings.connect('changed',
Lang.bind(this, this._updateDefaultService));
@@ -143,7 +140,6 @@ const ShellUserVerifier = new Lang.Class({
// at startup should result in immediately initiating authentication.
// This is different than fingeprint readers, where we only check them
// after a user has been picked.
this.smartcardDetected = false;
this._checkForSmartcard();
this._smartcardInsertedId = this._smartcardManager.connect('smartcard-inserted',

View File

@@ -69,7 +69,7 @@ const HistoryManager = new Lang.Class({
this._indexChanged();
}
return this._historyIndex ? this._history[this._historyIndex -1] : null;
return this._historyIndex[this._history.length];
},
addItem: function(input) {

View File

@@ -190,7 +190,7 @@ const IBusManager = new Lang.Class({
},
getEngineDesc: function(id) {
if (!IBus || !this._ready || !this._engines.hasOwnProperty(id))
if (!IBus || !this._ready)
return null;
return this._engines[id];

View File

@@ -218,11 +218,10 @@ function formatTime(time, params) {
if (_desktopSettings == null)
_desktopSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.interface' });
let clockFormat = _desktopSettings.get_string('clock-format');
let hasAmPm = date.format('%p') != '';
params = Params.parse(params, { timeOnly: false });
if (clockFormat == '24h' || !hasAmPm) {
if (clockFormat == '24h') {
// Show only the time if date is on today
if (daysAgo < 1 || params.timeOnly)
/* Translators: Time in 24h format */
@@ -281,10 +280,7 @@ function formatTime(time, params) {
// xgettext:no-c-format
format = N_("%B %d %Y, %l\u2236%M %p");
}
let formattedTime = date.format(Shell.util_translate_time_string(format));
// prepend LTR-mark to colon/ratio to force a text direction on times
return formattedTime.replace(/([:\u2236])/g, '\u200e$1');
return date.format(Shell.util_translate_time_string(format));
}
function createTimeLabel(date, params) {

View File

@@ -143,7 +143,6 @@ const PortalWindow = new Lang.Class({
this._webContext = WebKit.WebContext.new_ephemeral();
this._webContext.set_cache_model(WebKit.CacheModel.DOCUMENT_VIEWER);
this._webContext.set_network_proxy_settings(WebKit.NetworkProxyMode.NO_PROXY, null);
this._webView = WebKit.WebView.new_with_context(this._webContext);
this._webView.connect('decide-policy', Lang.bind(this, this._onDecidePolicy));
@@ -357,7 +356,7 @@ const WebPortalHelper = new Lang.Class({
if (top.window != null)
return;
top.window = new PortalWindow(this, top.url, top.timestamp, Lang.bind(this, function(result) {
top.window = new PortalWindow(this, top.uri, top.timestamp, Lang.bind(this, function(result) {
this._dbusImpl.emit_signal('Done', new GLib.Variant('(ou)', [top.connection, result]));
}));
},

View File

@@ -1083,8 +1083,6 @@ const AppSearchProvider = new Lang.Class({
_init: function() {
this._appSys = Shell.AppSystem.get_default();
this.id = 'applications';
this.isRemoteProvider = false;
this.canLaunchSearch = false;
},
getResultMetas: function(apps, callback) {
@@ -1253,7 +1251,6 @@ const FolderIcon = new Lang.Class({
_init: function(id, path, parentView) {
this.id = id;
this.name = '';
this._parentView = parentView;
this._folder = new Gio.Settings({ schema_id: 'org.gnome.desktop.app-folders.folder',

View File

@@ -6,6 +6,7 @@ const Signals = imports.signals;
const Main = imports.ui.main;
// In alphabetical order
const RENAMED_DESKTOP_IDS = {
'baobab.desktop': 'org.gnome.baobab.desktop',
'cheese.desktop': 'org.gnome.Cheese.desktop',
@@ -27,6 +28,7 @@ const RENAMED_DESKTOP_IDS = {
'gnome-documents.desktop': 'org.gnome.Documents.desktop',
'gnome-font-viewer.desktop': 'org.gnome.font-viewer.desktop',
'gnome-nibbles.desktop': 'org.gnome.Nibbles.desktop',
'gnome-music.desktop': 'org.gnome.Music.desktop',
'gnome-photos.desktop': 'org.gnome.Photos.desktop',
'gnome-screenshot.desktop': 'org.gnome.Screenshot.desktop',
'gnome-software.desktop': 'org.gnome.Software.desktop',

View File

@@ -761,8 +761,8 @@ const NotificationMessage = new Lang.Class({
_init: function(notification) {
this.notification = notification;
this.parent(notification.title, notification.bannerBodyText);
this.setUseBodyMarkup(notification.bannerBodyMarkup);
this.parent(notification.title, notification.bannerBodyText);
this.setIcon(this._getIcon());

View File

@@ -756,44 +756,42 @@ const Dash = new Lang.Class({
let newIndex = 0;
let oldIndex = 0;
while (newIndex < newApps.length || oldIndex < oldApps.length) {
let oldApp = oldApps.length > oldIndex ? oldApps[oldIndex] : null;
let newApp = newApps.length > newIndex ? newApps[newIndex] : null;
// No change at oldIndex/newIndex
if (oldApp == newApp) {
if (oldApps[oldIndex] == newApps[newIndex]) {
oldIndex++;
newIndex++;
continue;
}
// App removed at oldIndex
if (oldApp && newApps.indexOf(oldApp) == -1) {
if (oldApps[oldIndex] &&
newApps.indexOf(oldApps[oldIndex]) == -1) {
removedActors.push(children[oldIndex]);
oldIndex++;
continue;
}
// App added at newIndex
if (newApp && oldApps.indexOf(newApp) == -1) {
addedItems.push({ app: newApp,
item: this._createAppItem(newApp),
if (newApps[newIndex] &&
oldApps.indexOf(newApps[newIndex]) == -1) {
addedItems.push({ app: newApps[newIndex],
item: this._createAppItem(newApps[newIndex]),
pos: newIndex });
newIndex++;
continue;
}
// App moved
let nextApp = newApps.length > newIndex + 1 ? newApps[newIndex + 1]
: null;
let insertHere = nextApp && nextApp == oldApp;
let insertHere = newApps[newIndex + 1] &&
newApps[newIndex + 1] == oldApps[oldIndex];
let alreadyRemoved = removedActors.reduce(function(result, actor) {
let removedApp = actor.child._delegate.app;
return result || removedApp == newApp;
return result || removedApp == newApps[newIndex];
}, false);
if (insertHere || alreadyRemoved) {
let newItem = this._createAppItem(newApp);
addedItems.push({ app: newApp,
let newItem = this._createAppItem(newApps[newIndex]);
addedItems.push({ app: newApps[newIndex],
item: newItem,
pos: newIndex + removedActors.length });
newIndex++;

View File

@@ -474,8 +474,6 @@ const DateMenuButton = new Lang.Class({
let layout = new FreezableBinLayout();
let bin = new St.Widget({ layout_manager: layout });
// For some minimal compatibility with PopupMenuItem
bin._delegate = this;
this.menu.box.add_child(bin);
hbox = new St.BoxLayout({ name: 'calendarArea' });

View File

@@ -1,5 +1,7 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const FocusCaretTracker = imports.ui.focusCaretTracker;
const Atspi = imports.gi.Atspi;
const Caribou = imports.gi.Caribou;
const Clutter = imports.gi.Clutter;
const Gdk = imports.gi.Gdk;
@@ -25,42 +27,6 @@ const KEYBOARD_TYPE = 'keyboard-type';
const A11Y_APPLICATIONS_SCHEMA = 'org.gnome.desktop.a11y.applications';
const SHOW_KEYBOARD = 'screen-keyboard-enabled';
const CARIBOU_BUS_NAME = 'org.gnome.Caribou.Daemon';
const CARIBOU_OBJECT_PATH = '/org/gnome/Caribou/Daemon';
const CaribouKeyboardIface = '<node> \
<interface name="org.gnome.Caribou.Keyboard"> \
<method name="Show"> \
<arg type="u" direction="in" /> \
</method> \
<method name="Hide"> \
<arg type="u" direction="in" /> \
</method> \
<method name="SetCursorLocation"> \
<arg type="i" direction="in" /> \
<arg type="i" direction="in" /> \
<arg type="i" direction="in" /> \
<arg type="i" direction="in" /> \
</method> \
<method name="SetEntryLocation"> \
<arg type="i" direction="in" /> \
<arg type="i" direction="in" /> \
<arg type="i" direction="in" /> \
<arg type="i" direction="in" /> \
</method> \
<property name="Name" access="read" type="s" /> \
</interface> \
</node>';
const CaribouDaemonIface = '<node> \
<interface name="org.gnome.Caribou.Daemon"> \
<method name="Run" /> \
<method name="Quit" /> \
</interface> \
</node>';
const CaribouDaemonProxy = Gio.DBusProxy.makeProxyWrapper(CaribouDaemonIface);
const Key = new Lang.Class({
Name: 'Key',
@@ -188,18 +154,19 @@ const Key = new Lang.Class({
Signals.addSignalMethods(Key.prototype);
const Keyboard = new Lang.Class({
// HACK: we can't set Name, because it collides with Name dbus property
// Name: 'Keyboard',
Name: 'Keyboard',
_init: function () {
this._impl = Gio.DBusExportedObject.wrapJSObject(CaribouKeyboardIface, this);
this._impl.export(Gio.DBus.session, '/org/gnome/Caribou/Keyboard');
this.actor = null;
this._focusInTray = false;
this._focusInExtendedKeys = false;
this._timestamp = global.display.get_current_time_roundtrip();
this._focusCaretTracker = new FocusCaretTracker.FocusCaretTracker();
this._focusCaretTracker.connect('focus-changed', Lang.bind(this, this._onFocusChanged));
this._focusCaretTracker.connect('caret-moved', Lang.bind(this, this._onCaretMoved));
this._currentAccessible = null;
this._caretTrackingEnabled = false;
this._updateCaretPositionId = 0;
this._keyboardSettings = new Gio.Settings({ schema_id: KEYBOARD_SCHEMA });
this._keyboardSettings.connect('changed', Lang.bind(this, this._sync));
@@ -208,9 +175,7 @@ const Keyboard = new Lang.Class({
this._daemonProxy = null;
this._lastDeviceId = null;
if (Meta.is_wayland_compositor() &&
Caribou.DisplayAdapter.set_default)
Caribou.DisplayAdapter.set_default(new ShellWaylandAdapter());
Caribou.DisplayAdapter.set_default(new LocalAdapter());
Meta.get_backend().connect('last-device-changed', Lang.bind(this,
function (backend, deviceId) {
@@ -240,6 +205,93 @@ const Keyboard = new Lang.Class({
this._redraw();
},
_setCaretTrackerEnabled: function (enabled) {
if (this._caretTrackingEnabled == enabled)
return;
this._caretTrackingEnabled = enabled;
if (enabled) {
this._focusCaretTracker.registerFocusListener();
this._focusCaretTracker.registerCaretListener();
} else {
this._focusCaretTracker.deregisterFocusListener();
this._focusCaretTracker.deregisterCaretListener();
}
},
_updateCaretPosition: function (accessible) {
if (this._updateCaretPositionId)
GLib.source_remove(this._updateCaretPositionId);
this._updateCaretPositionId = GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, Lang.bind(this, function() {
this._updateCaretPositionId = 0;
let currentWindow = global.screen.get_display().focus_window;
if (!currentWindow)
return GLib.SOURCE_REMOVE;
let windowRect = currentWindow.get_frame_rect();
let text = accessible.get_text_iface();
let component = accessible.get_component_iface();
try {
let caretOffset = text.get_caret_offset();
let caretRect = text.get_character_extents(caretOffset, Atspi.CoordType.WINDOW);
let focusRect = component.get_extents(Atspi.CoordType.WINDOW);
caretRect.x += windowRect.x;
caretRect.y += windowRect.y;
focusRect.x += windowRect.x;
focusRect.y += windowRect.y;
if (caretRect.width == 0 && caretRect.height == 0)
caretRect = focusRect;
this.setEntryLocation(focusRect.x, focusRect.y, focusRect.width, focusRect.height);
this.setCursorLocation(caretRect.x, caretRect.y, caretRect.width, caretRect.height);
} catch (e) {
log('Error updating caret position for OSK: ' + e.message);
}
return GLib.SOURCE_REMOVE;
}));
GLib.Source.set_name_by_id(this._updateCaretPositionId, '[gnome-shell] this._updateCaretPosition');
},
_focusIsTextEntry: function (accessible) {
try {
let role = accessible.get_role();
let stateSet = accessible.get_state_set();
return stateSet.contains(Atspi.StateType.EDITABLE) || role == Atspi.Role.TERMINAL;
} catch (e) {
log('Error determining accessible role: ' + e.message);
return false;
}
},
_onFocusChanged: function (caretTracker, event) {
let accessible = event.source;
if (!this._focusIsTextEntry(accessible))
return;
let focused = event.detail1 != 0;
if (focused) {
this._currentAccessible = accessible;
this._updateCaretPosition(accessible);
this.show(Main.layoutManager.focusIndex);
} else if (this._currentAccessible == accessible) {
this._currentAccessible = null;
this.hide();
}
},
_onCaretMoved: function (caretTracker, event) {
let accessible = event.source;
if (this._currentAccessible == accessible)
this._updateCaretPosition(accessible);
},
_lastDeviceIsTouchscreen: function () {
if (!this._lastDeviceId)
return false;
@@ -262,6 +314,8 @@ const Keyboard = new Lang.Class({
this._keyboard.keyboard_type == this._keyboardSettings.get_string(KEYBOARD_TYPE))
return;
this._setCaretTrackerEnabled(this._enableKeyboard);
if (this._keyboard)
this._destroyKeyboard();
@@ -297,23 +351,6 @@ const Keyboard = new Lang.Class({
},
_setupKeyboard: function() {
if (!this._daemonProxy) {
this._daemonProxy = new CaribouDaemonProxy(Gio.DBus.session, CARIBOU_BUS_NAME,
CARIBOU_OBJECT_PATH,
Lang.bind(this, function(proxy, error) {
if (error) {
log(error.message);
return;
}
}));
}
this._daemonProxy.RunRemote(function (result, error) {
if (error) {
log(error.message);
return;
}
});
this.actor = new St.BoxLayout({ name: 'keyboard', vertical: true, reactive: true });
Main.layoutManager.keyboardBox.add_actor(this.actor);
Main.layoutManager.trackChrome(this.actor);
@@ -359,17 +396,17 @@ const Keyboard = new Lang.Class({
let time = global.get_current_time();
if (!(focus instanceof Clutter.Text)) {
this.Hide(time);
this.hide();
return;
}
if (!this._showIdleId) {
this._showIdleId = GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE,
Lang.bind(this, function() {
this.Show(time);
this.show(Main.layoutManager.focusIndex);
return GLib.SOURCE_REMOVE;
}));
GLib.Source.set_name_by_id(this._showIdleId, '[gnome-shell] this.Show');
GLib.Source.set_name_by_id(this._showIdleId, '[gnome-shell] this.show');
}
},
@@ -570,7 +607,7 @@ const Keyboard = new Lang.Class({
shouldTakeEvent: function(event) {
let actor = event.get_source();
return Main.layoutManager.keyboardBox.contains(actor) ||
!!actor._extended_keys || !!actor.extended_key;
actor._extended_keys || actor.extended_key;
},
_clearKeyboardRestTimer: function() {
@@ -581,6 +618,10 @@ const Keyboard = new Lang.Class({
},
show: function (monitor) {
if (!this._enableKeyboard)
return;
this._clearShowIdle();
this._keyboardRequested = true;
if (this._keyboardVisible) {
@@ -613,6 +654,10 @@ const Keyboard = new Lang.Class({
},
hide: function () {
if (!this._enableKeyboard)
return;
this._clearShowIdle();
this._keyboardRequested = false;
if (!this._keyboardVisible)
@@ -664,20 +709,6 @@ const Keyboard = new Lang.Class({
this._moveTemporarily();
},
// _compareTimestamp:
//
// Compare two timestamps taking into account
// CURRENT_TIME (0)
_compareTimestamp: function(one, two) {
if (one == two)
return 0;
if (one == Clutter.CURRENT_TIME)
return 1;
if (two == Clutter.CURRENT_TIME)
return -1;
return one - two;
},
_clearShowIdle: function() {
if (!this._showIdleId)
return;
@@ -685,52 +716,19 @@ const Keyboard = new Lang.Class({
this._showIdleId = 0;
},
// D-Bus methods
Show: function(timestamp) {
if (!this._enableKeyboard)
return;
if (this._compareTimestamp(timestamp, this._timestamp) < 0)
return;
this._clearShowIdle();
if (timestamp != Clutter.CURRENT_TIME)
this._timestamp = timestamp;
this.show(Main.layoutManager.focusIndex);
},
Hide: function(timestamp) {
if (!this._enableKeyboard)
return;
if (this._compareTimestamp(timestamp, this._timestamp) < 0)
return;
this._clearShowIdle();
if (timestamp != Clutter.CURRENT_TIME)
this._timestamp = timestamp;
this.hide();
},
SetCursorLocation: function(x, y, w, h) {
setCursorLocation: function(x, y, w, h) {
if (!this._enableKeyboard)
return;
// this._setLocation(x, y);
},
SetEntryLocation: function(x, y, w, h) {
setEntryLocation: function(x, y, w, h) {
if (!this._enableKeyboard)
return;
// this._setLocation(x, y);
},
get Name() {
return 'gnome-shell';
}
});
const KeyboardSource = new Lang.Class({
@@ -754,8 +752,8 @@ const KeyboardSource = new Lang.Class({
}
});
const ShellWaylandAdapter = new Lang.Class({
Name: 'ShellWaylandAdapter',
const LocalAdapter = new Lang.Class({
Name: 'LocalAdapter',
Extends: Caribou.XAdapter,
_init: function () {

View File

@@ -896,10 +896,7 @@ const LayoutManager = new Lang.Class({
},
findMonitorForActor: function(actor) {
let index = this.findIndexForActor(actor);
if (index >= 0 && index < this.monitors.length)
return this.monitors[index];
return null;
return this.monitors[this.findIndexForActor(actor)];
},
_queueUpdateRegions: function() {
@@ -969,11 +966,7 @@ const LayoutManager = new Lang.Class({
if (actorData.affectsInputRegion && wantsInputRegion && actorData.actor.get_paint_visibility())
rects.push(new Meta.Rectangle({ x: x, y: y, width: w, height: h }));
let monitor = null;
if (actorData.affectsStruts)
monitor = this.findMonitorForActor(actorData.actor);
if (monitor) {
if (actorData.affectsStruts) {
// Limit struts to the size of the screen
let x1 = Math.max(x, 0);
let x2 = Math.min(x + w, global.screen_width);
@@ -990,6 +983,7 @@ const LayoutManager = new Lang.Class({
// spans the width/height across the middle of the
// screen, then we don't create a strut for it at all.
let monitor = this.findMonitorForActor(actorData.actor);
let side;
if (x1 <= monitor.x && x2 >= monitor.x + monitor.width) {
if (y1 <= monitor.y)

View File

@@ -783,7 +783,6 @@ const LookingGlass = new Lang.Class({
this._open = false;
this._it = null;
this._offset = 0;
this._results = [];
@@ -834,19 +833,19 @@ const LookingGlass = new Lang.Class({
return Clutter.EVENT_STOP;
}));
let gcIcon = new St.Icon({ icon_name: 'gnome-fs-trash-full',
let gcIcon = new St.Icon({ icon_name: 'user-trash-full',
icon_size: 24 });
toolbar.add_actor(gcIcon);
gcIcon.reactive = true;
gcIcon.connect('button-press-event', Lang.bind(this, function () {
gcIcon.icon_name = 'gnome-fs-trash-empty';
gcIcon.icon_name = 'user-trash';
System.gc();
this._timeoutId = Mainloop.timeout_add(500, Lang.bind(this, function () {
gcIcon.icon_name = 'gnome-fs-trash-full';
gcIcon.icon_name = 'user-trash-full';
this._timeoutId = 0;
return GLib.SOURCE_REMOVE;
}));
GLib.Source.set_name_by_id(this._timeoutId, '[gnome-shell] gcIcon.icon_name = \'gnome-fs-trash-full\'');
GLib.Source.set_name_by_id(this._timeoutId, '[gnome-shell] gcIcon.icon_name = \'user-trash-full\'');
return Clutter.EVENT_PROPAGATE;
}));

View File

@@ -165,11 +165,6 @@ const ScaleLayout = new Lang.Class({
Name: 'ScaleLayout',
Extends: Clutter.BinLayout,
_init: function(params) {
this._container = null;
this.parent(params);
},
_connectContainer: function(container) {
if (this._container == container)
return;
@@ -304,8 +299,6 @@ const Message = new Lang.Class({
_init: function(title, body) {
this.expanded = false;
this._useBodyMarkup = false;
this.actor = new St.Button({ style_class: 'message',
accessible_role: Atk.Role.NOTIFICATION,
can_focus: true,

View File

@@ -128,10 +128,10 @@ const FdoNotificationDaemon = new Lang.Class({
switch (hints.urgency) {
case Urgency.LOW:
case Urgency.NORMAL:
stockIcon = 'dialog-information';
stockIcon = 'gtk-dialog-info';
break;
case Urgency.CRITICAL:
stockIcon = 'dialog-error';
stockIcon = 'gtk-dialog-error';
break;
}
return new Gio.ThemedIcon({ name: stockIcon });
@@ -186,8 +186,7 @@ const FdoNotificationDaemon = new Lang.Class({
return source;
}
let appId = ndata ? ndata.hints['desktop-entry'] || null : null;
source = new FdoNotificationDaemonSource(title, pid, sender, appId);
source = new FdoNotificationDaemonSource(title, pid, sender, ndata ? ndata.hints['desktop-entry'] : null);
this._sources.push(source);
source.connect('destroy', Lang.bind(this, function() {
@@ -392,10 +391,10 @@ const FdoNotificationDaemon = new Lang.Class({
notification.setUrgency(MessageTray.Urgency.CRITICAL);
break;
}
notification.setResident(!!hints.resident);
notification.setResident(hints.resident == true);
// 'transient' is a reserved keyword in JS, so we have to retrieve the value
// of the 'transient' hint with hints['transient'] rather than hints.transient
notification.setTransient(!!hints['transient']);
notification.setTransient(hints['transient'] == true);
let sourceGIcon = source.useNotificationIcon ? gicon : null;
source.processNotification(notification, sourceGIcon);

View File

@@ -120,6 +120,25 @@ const OsdMonitorLabeler = new Lang.Class({
}
},
show2: function(client, params) {
if (!this._trackClient(client))
return;
this._reset();
for (let connector in params) {
let monitor = this._monitorManager.get_monitor_for_connector(connector);
if (monitor == -1)
continue;
this._monitorLabels.get(monitor).push(params[connector].deep_unpack());
}
for (let [monitor, labels] of this._monitorLabels.entries()) {
labels.sort();
this._osdLabels.push(new OsdMonitorLabel(monitor, labels.join(' ')));
}
},
hide: function(client) {
if (!this._untrackClient(client))
return;

View File

@@ -154,16 +154,9 @@ const ActionComboBox = new Lang.Class({
this._actionLabels.set(GDesktopEnums.PadButtonAction.SWITCH_MONITOR, _("Switch monitor"));
this._actionLabels.set(GDesktopEnums.PadButtonAction.KEYBINDING, _("Assign keystroke"));
this._buttonItems = [];
for (let [action, label] of this._actionLabels.entries()) {
let selectedAction = action;
let item = this._editMenu.addAction(label, Lang.bind(this, function() { this._onActionSelected(selectedAction) }));
/* These actions only apply to pad buttons */
if (selectedAction == GDesktopEnums.PadButtonAction.HELP ||
selectedAction == GDesktopEnums.PadButtonAction.SWITCH_MONITOR)
this._buttonItems.push(item);
this._editMenu.addAction(label, Lang.bind(this, function() { this._onActionSelected(selectedAction) }));
}
this.setAction(GDesktopEnums.PadButtonAction.NONE);
@@ -192,10 +185,6 @@ const ActionComboBox = new Lang.Class({
this.popup();
else
this.popdown();
},
setButtonActionsActive: function (active) {
this._buttonItems.forEach(item => { item.setSensitive(active); });
}
});
Signals.addSignalMethods(ActionComboBox.prototype);
@@ -234,16 +223,13 @@ const ActionEditor = new Lang.Class({
}
},
setSettings: function (settings, action) {
setSettings: function (settings) {
this._buttonSettings = settings;
this._currentAction = this._buttonSettings.get_enum('action');
this._currentKeybinding = this._buttonSettings.get_string('keybinding');
this._actionComboBox.setAction(this._currentAction);
this._updateKeybindingEntryState();
let isButton = (action == Meta.PadActionType.BUTTON);
this._actionComboBox.setButtonActionsActive(isButton);
},
close: function() {
@@ -307,8 +293,6 @@ const PadDiagram = new Lang.Class({
_init: function (params) {
let file = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/pad-osd.css');
let [success, css, etag] = file.load_contents(null);
this._curEdited = null;
this._prevEdited = null;
this._css = css;
this._labels = [];
this._activeButtons = [];
@@ -566,39 +550,25 @@ const PadDiagram = new Lang.Class({
this.add_actor(label);
},
_applyLabel: function(label, action, idx, dir, str) {
if (str != null) {
label.set_text(str);
let [found, x, y, arrangement] = this.getLabelCoords(action, idx, dir);
this._allocateChild(label, x, y, arrangement);
}
label.show();
},
stopEdition: function (continues, str) {
stopEdition: function (str) {
this._editorActor.hide();
if (this._prevEdited) {
let [label, action, idx, dir] = this._prevEdited;
this._applyLabel(label, action, idx, dir, str);
this._prevEdited = null;
}
if (this._curEdited) {
let [label, action, idx, dir] = this._curEdited;
this._applyLabel(label, action, idx, dir, str);
if (continues)
this._prevEdited = this._curEdited;
if (str != null) {
label.set_text(str);
let [found, x, y, arrangement] = this.getLabelCoords(action, idx, dir);
this._allocateChild(label, x, y, arrangement);
}
label.show();
this._curEdited = null;
}
},
startEdition: function(action, idx, dir) {
let editedLabel;
if (this._curEdited)
return;
this.stopEdition();
for (let i = 0; i < this._labels.length; i++) {
let [label, itemAction, itemIdx, itemDir] = this._labels[i];
@@ -692,7 +662,7 @@ const PadOsd = new Lang.Class({
this._updatePadChooser();
this._actionEditor = new ActionEditor();
this._actionEditor.connect('done', Lang.bind(this, this._endActionEdition));
this._actionEditor.connect('done', Lang.bind(this, this._endButtonActionEdition));
this._padDiagram = new PadDiagram({ image: this._imagePath,
left_handed: settings.get_boolean('left-handed'),
@@ -711,17 +681,11 @@ const PadOsd = new Lang.Class({
}
for (i = 0; i < padDevice.get_n_rings(); i++) {
let [found] = this._padDiagram.getRingLabelCoords(i, CW);
if (!found)
break;
this._createLabel(Meta.PadActionType.RING, i, CW);
this._createLabel(Meta.PadActionType.RING, i, CCW);
}
for (i = 0; i < padDevice.get_n_strips(); i++) {
let [found] = this._padDiagram.getStripLabelCoords(i, UP);
if (!found)
break;
this._createLabel(Meta.PadActionType.STRIP, i, UP);
this._createLabel(Meta.PadActionType.STRIP, i, DOWN);
}
@@ -779,10 +743,8 @@ const PadOsd = new Lang.Class({
if (event.type() == Clutter.EventType.PAD_BUTTON_PRESS &&
event.get_source_device() == this.padDevice) {
this._padDiagram.activateButton(event.get_button());
let isModeSwitch = this.padDevice.get_mode_switch_button_group(event.get_button()) >= 0;
/* Buttons that switch between modes cannot be edited */
if (this._editionMode && !isModeSwitch)
if (this._editionMode)
this._startButtonActionEdition(event.get_button());
return Clutter.EVENT_STOP;
} else if (event.type() == Clutter.EventType.PAD_BUTTON_RELEASE &&
@@ -791,23 +753,11 @@ const PadOsd = new Lang.Class({
return Clutter.EVENT_STOP;
} else if (event.type() == Clutter.EventType.KEY_PRESS &&
(!this._editionMode || event.get_key_symbol() == Clutter.Escape)) {
if (this._editedAction != null)
this._endActionEdition();
if (this._editingButtonAction != null)
this._endButtonActionEdition();
else
this.destroy();
return Clutter.EVENT_STOP;
} else if (event.get_source_device() == this.padDevice &&
event.type() == Clutter.EventType.PAD_STRIP) {
if (this._editionMode) {
let [retval, number, mode] = event.get_pad_event_details();
this._startStripActionEdition(number, UP, mode);
}
} else if (event.get_source_device() == this.padDevice &&
event.type() == Clutter.EventType.PAD_RING) {
if (this._editionMode) {
let [retval, number, mode] = event.get_pad_event_details();
this._startRingActionEdition(number, CCW, mode);
}
}
// If the event comes from another pad in the same group,
@@ -840,79 +790,33 @@ const PadOsd = new Lang.Class({
this._titleLabel.clutter_text.set_markup('<span size="larger"><b>' + title + '</b></span>');
},
_isEditedAction: function (type, number, dir) {
if (!this._editedAction)
return false;
return (this._editedAction.type == type &&
this._editedAction.number == number &&
this._editedAction.dir == dir);
},
_followUpActionEdition: function (str) {
let { type, dir, number, mode } = this._editedAction;
let hasNextAction = (type == Meta.PadActionType.RING && dir == CCW ||
type == Meta.PadActionType.STRIP && dir == UP);
if (!hasNextAction)
return false;
this._padDiagram.stopEdition(true, str);
this._editedAction = null;
if (type == Meta.PadActionType.RING)
this._startRingActionEdition(number, CW, mode);
else
this._startStripActionEdition(number, DOWN, mode);
return true;
},
_endActionEdition: function () {
_endButtonActionEdition: function () {
this._actionEditor.close();
if (this._editedAction != null) {
if (this._editingButtonAction != null) {
let str = global.display.get_pad_action_label(this.padDevice,
this._editedAction.type,
this._editedAction.number);
if (this._followUpActionEdition(str))
return;
this._padDiagram.stopEdition(false, str ? str : _("None"))
this._editedAction = null;
Meta.PadActionType.BUTTON,
this._editingButtonAction);
this._padDiagram.stopEdition(str ? str : _("None"))
this._editingButtonAction = null;
}
this._editedActionSettings = null;
},
_startActionEdition: function (key, type, number, dir, mode) {
if (this._isEditedAction(type, number, dir))
return;
this._endActionEdition();
this._editedAction = { type, number, dir, mode };
let settingsPath = this._settings.path + key + '/';
this._editedActionSettings = Gio.Settings.new_with_path('org.gnome.desktop.peripherals.tablet.pad-button',
settingsPath);
this._actionEditor.setSettings(this._editedActionSettings, type);
this._padDiagram.startEdition(type, number, dir);
this._editedButtonSettings = null;
},
_startButtonActionEdition: function (button) {
if (this._editingButtonAction == button)
return;
this._endButtonActionEdition();
this._editingButtonAction = button;
let ch = String.fromCharCode('A'.charCodeAt() + button);
let key = 'button' + ch;
this._startActionEdition(key, Meta.PadActionType.BUTTON, button);
},
_startRingActionEdition: function (ring, dir, mode) {
let ch = String.fromCharCode('A'.charCodeAt() + ring);
let key = 'ring%s-%s-mode-%d'.format(ch, dir == CCW ? 'ccw' : 'cw', mode);
this._startActionEdition(key, Meta.PadActionType.RING, ring, dir, mode);
},
_startStripActionEdition: function (strip, dir, mode) {
let ch = String.fromCharCode('A'.charCodeAt() + strip);
let key = 'strip%s-%s-mode-%d'.format(ch, dir == UP ? 'up' : 'down', mode);
this._startActionEdition(key, Meta.PadActionType.STRIP, strip, dir, mode);
let settingsPath = this._settings.path + "button" + ch + '/';
this._editedButtonSettings = Gio.Settings.new_with_path('org.gnome.desktop.peripherals.tablet.pad-button',
settingsPath);
this._actionEditor.setSettings(this._editedButtonSettings);
this._padDiagram.startEdition(Meta.PadActionType.BUTTON, button);
},
setEditionMode: function (editionMode) {

View File

@@ -801,9 +801,11 @@ const Panel = new Lang.Class({
Main.overview.connect('showing', Lang.bind(this, function () {
this.actor.add_style_pseudo_class('overview');
this._updateSolidStyle();
}));
Main.overview.connect('hiding', Lang.bind(this, function () {
this.actor.remove_style_pseudo_class('overview');
this._updateSolidStyle();
}));
Main.layoutManager.panelBox.add(this.actor);
@@ -811,9 +813,26 @@ const Panel = new Lang.Class({
{ sortGroup: CtrlAltTab.SortGroup.TOP });
Main.sessionMode.connect('updated', Lang.bind(this, this._updatePanel));
this._trackedWindows = new Map();
global.window_group.connect('actor-added', Lang.bind(this, this._onWindowActorAdded));
global.window_group.connect('actor-removed', Lang.bind(this, this._onWindowActorRemoved));
global.window_manager.connect('switch-workspace', Lang.bind(this, this._updateSolidStyle));
this._updatePanel();
},
_onWindowActorAdded: function(container, metaWindowActor) {
let signalId = metaWindowActor.connect('allocation-changed', Lang.bind(this, this._updateSolidStyle));
this._trackedWindows.set(metaWindowActor, signalId);
},
_onWindowActorRemoved: function(container, metaWindowActor) {
metaWindowActor.disconnect(this._trackedWindows.get(metaWindowActor));
this._trackedWindows.delete(metaWindowActor);
this._updateSolidStyle();
},
_getPreferredWidth: function(actor, forHeight, alloc) {
alloc.min_size = -1;
alloc.natural_size = Main.layoutManager.primaryMonitor.width;
@@ -1012,6 +1031,36 @@ const Panel = new Lang.Class({
}
},
_updateSolidStyle: function() {
if (this.actor.has_style_pseudo_class('overview') || !Main.sessionMode.hasWindows) {
this._removeStyleClassName('solid');
return;
}
/* Get all the windows in the active workspace that are in the primary monitor and visible */
let activeWorkspace = global.screen.get_active_workspace();
let windows = activeWorkspace.list_windows().filter(function(metaWindow) {
return metaWindow.is_on_primary_monitor() &&
metaWindow.showing_on_its_workspace() &&
metaWindow.get_window_type() != Meta.WindowType.DESKTOP;
});
/* Check if at least one window is near enough to the panel */
let [, panelTop] = this.actor.get_transformed_position();
let panelBottom = panelTop + this.actor.get_height();
let scale = St.ThemeContext.get_for_stage(global.stage).scale_factor;
let isNearEnough = windows.some(Lang.bind(this, function(metaWindow) {
let verticalPosition = metaWindow.get_frame_rect().y;
return verticalPosition < panelBottom + 5 * scale;
}));
if (isNearEnough)
this._addStyleClassName('solid');
else
this._removeStyleClassName('solid');
},
_hideIndicators: function() {
for (let role in PANEL_ITEM_IMPLEMENTATIONS) {
let indicator = this.statusArea[role];
@@ -1104,7 +1153,7 @@ const Panel = new Lang.Class({
},
_onMenuSet: function(indicator) {
if (!indicator.menu || indicator.menu.hasOwnProperty('_openChangedId'))
if (!indicator.menu || indicator.menu._openChangedId > 0)
return;
indicator.menu._openChangedId = indicator.menu.connect('open-state-changed',

View File

@@ -2,6 +2,8 @@
const Clutter = imports.gi.Clutter;
const Gtk = imports.gi.Gtk;
const Gio = imports.gi.Gio;
const GObject = imports.gi.GObject;
const Lang = imports.lang;
const Shell = imports.gi.Shell;
const Signals = imports.signals;
@@ -389,20 +391,24 @@ const PopupImageMenuItem = new Lang.Class({
Name: 'PopupImageMenuItem',
Extends: PopupBaseMenuItem,
_init: function (text, iconName, params) {
_init: function (text, icon, params) {
this.parent(params);
this.label = new St.Label({ text: text });
this.actor.add_child(this.label);
this._icon = new St.Icon({ style_class: 'popup-menu-icon' });
this.actor.add_child(this._icon, { align: St.Align.END });
this.label = new St.Label({ text: text });
this.actor.add_child(this.label);
this.actor.label_actor = this.label;
this.setIcon(iconName);
this.setIcon(icon);
},
setIcon: function(name) {
this._icon.icon_name = name;
setIcon: function(icon) {
// The 'icon' parameter can be either a Gio.Icon or a string.
if (GObject.type_is_a(icon, Gio.Icon))
this._icon.gicon = icon;
else
this._icon.icon_name = icon;
}
});
@@ -461,8 +467,13 @@ const PopupMenuBase = new Lang.Class({
this._setSettingsVisibility(Main.sessionMode.allowSettings);
},
addAction: function(title, callback) {
let menuItem = new PopupMenuItem(title);
addAction: function(title, callback, icon) {
let menuItem;
if (icon != undefined)
menuItem = new PopupImageMenuItem(title, icon);
else
menuItem = new PopupMenuItem(title);
this.addMenuItem(menuItem);
menuItem.connect('activate', Lang.bind(this, function (menuItem, event) {
callback(event);

View File

@@ -192,10 +192,6 @@ const RemoteMenu = new Lang.Class({
_removeItem.bind(null, this));
},
get actionGroup() {
return this._actionGroup;
},
destroy: function() {
this._tracker.destroy();
this.parent();

View File

@@ -200,7 +200,6 @@ const RemoteSearchProvider = new Lang.Class({
this.appInfo = appInfo;
this.id = appInfo.get_id();
this.isRemoteProvider = true;
this.canLaunchSearch = false;
},
createIcon: function(size, meta) {

View File

@@ -28,6 +28,9 @@ const GnomeShellIface = '<node> \
<method name="ShowMonitorLabels"> \
<arg type="a{uv}" direction="in" name="params" /> \
</method> \
<method name="ShowMonitorLabels2"> \
<arg type="a{sv}" direction="in" name="params" /> \
</method> \
<method name="HideMonitorLabels" /> \
<method name="FocusApp"> \
<arg type="s" direction="in" name="id"/> \
@@ -142,15 +145,15 @@ const GnomeShell = new Lang.Class({
for (let param in params)
params[param] = params[param].deep_unpack();
let monitorIndex = params['monitor'] || -1;
let label = params['label'] || undefined;
let level = params['level'] || undefined;
let monitorIndex = -1;
if (params['monitor'] >= 0)
monitorIndex = params['monitor'];
let icon = null;
if (params['icon'])
icon = Gio.Icon.new_for_string(params['icon']);
Main.osdWindowManager.show(monitorIndex, icon, label, level);
Main.osdWindowManager.show(monitorIndex, icon, params['label'], params['level']);
},
FocusApp: function(id) {
@@ -250,6 +253,12 @@ const GnomeShell = new Lang.Class({
Main.osdMonitorLabeler.show(sender, dict);
},
ShowMonitorLabels2Async: function(params, invocation) {
let sender = invocation.get_sender();
let [dict] = params;
Main.osdMonitorLabeler.show2(sender, dict);
},
HideMonitorLabelsAsync: function(params, invocation) {
let sender = invocation.get_sender();
Main.osdMonitorLabeler.hide(sender);

View File

@@ -1709,7 +1709,6 @@ const NMApplet = new Lang.Class({
this._mainConnection = null;
this._mainConnectionIconChangedId = 0;
this._mainConnectionStateChangedId = 0;
this._notification = null;

View File

@@ -42,15 +42,9 @@ const AltSwitcher = new Lang.Class({
_init: function(standard, alternate) {
this._standard = standard;
this._standard.connect('notify::visible', Lang.bind(this, this._sync));
if (this._standard instanceof St.Button)
this._standard.connect('clicked',
() => { this._clickAction.release(); });
this._alternate = alternate;
this._alternate.connect('notify::visible', Lang.bind(this, this._sync));
if (this._alternate instanceof St.Button)
this._alternate.connect('clicked',
() => { this._clickAction.release(); });
this._capturedEventId = global.stage.connect('captured-event', Lang.bind(this, this._onCapturedEvent));

View File

@@ -385,7 +385,7 @@ const SwitcherList = new Lang.Class({
let n = this._items.length;
bbox.connect('clicked', Lang.bind(this, function() { this._onItemClicked(n); }));
bbox.connect('enter-event', Lang.bind(this, function() { this._onItemEnter(n); }));
bbox.connect('motion-event', Lang.bind(this, function() { return this._onItemEnter(n); }));
bbox.label_actor = label;
@@ -399,7 +399,11 @@ const SwitcherList = new Lang.Class({
},
_onItemEnter: function (index) {
this._itemEntered(index);
// Avoid reentrancy
if (index != this._currentItemEntered) {
this._currentItemEntered = index;
this._itemEntered(index);
}
return Clutter.EVENT_PROPAGATE;
},

View File

@@ -1313,15 +1313,13 @@ const WindowManager = new Lang.Class({
return;
}
if ((whichChange == Meta.SizeChange.FULLSCREEN ||
whichChange == Meta.SizeChange.UNFULLSCREEN) &&
oldFrameRect.width > 0 && oldFrameRect.height > 0)
this._fullscreenAnimation(shellwm, actor, oldFrameRect, whichChange);
if (oldFrameRect.width > 0 && oldFrameRect.height > 0)
this._prepareAnimationInfo(shellwm, actor, oldFrameRect, whichChange);
else
shellwm.completed_size_change(actor);
},
_fullscreenAnimation: function(shellwm, actor, oldFrameRect, change) {
_prepareAnimationInfo: function(shellwm, actor, oldFrameRect, change) {
// Position a clone of the window on top of the old position,
// while actor updates are frozen.
let actorContent = Shell.util_get_content_for_window_actor(actor, oldFrameRect);
@@ -1331,26 +1329,25 @@ const WindowManager = new Lang.Class({
actorClone.set_size(oldFrameRect.width, oldFrameRect.height);
Main.uiGroup.add_actor(actorClone);
let rect = change == Meta.SizeChange.FULLSCREEN ? oldFrameRect : null;
if (this._clearFullscreenInfo(actor))
if (this._clearAnimationInfo(actor))
this._shellwm.completed_size_change(actor);
actor.__fullscreenInfo = { clone: actorClone,
oldRect: rect };
actor.__animationInfo = { clone: actorClone,
oldRect: oldFrameRect };
},
_sizeChangedWindow: function(shellwm, actor) {
if (!actor.__fullscreenInfo)
if (!actor.__animationInfo)
return;
if (this._resizing.indexOf(actor) != -1)
return;
let actorClone = actor.__fullscreenInfo.clone;
let actorClone = actor.__animationInfo.clone;
let targetRect = actor.meta_window.get_frame_rect();
let sourceRect = actor.__animationInfo.oldRect;
let scaleX = targetRect.width / actorClone.width;
let scaleY = targetRect.height / actorClone.height;
let scaleX = targetRect.width / sourceRect.width;
let scaleY = targetRect.height / sourceRect.height;
this._resizing.push(actor);
@@ -1365,15 +1362,8 @@ const WindowManager = new Lang.Class({
transition: 'easeOutQuad'
});
let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()];
let oldRect = actor.__fullscreenInfo.oldRect;
if (oldRect) {
actor.translation_x = oldRect.x - monitor.x;
actor.translation_y = oldRect.y - monitor.y;
} else {
actor.translation_x = -(targetRect.x - monitor.x);
actor.translation_y = -(targetRect.y - monitor.y);
}
actor.translation_x = -targetRect.x + sourceRect.x;
actor.translation_y = -targetRect.y + sourceRect.y;
// Now set scale the actor to size it as the clone.
actor.scale_x = 1 / scaleX;
@@ -1401,10 +1391,10 @@ const WindowManager = new Lang.Class({
shellwm.completed_size_change(actor);
},
_clearFullscreenInfo: function(actor) {
if (actor.__fullscreenInfo) {
actor.__fullscreenInfo.clone.destroy();
delete actor.__fullscreenInfo;
_clearAnimationInfo: function(actor) {
if (actor.__animationInfo) {
actor.__animationInfo.clone.destroy();
delete actor.__animationInfo;
return true;
}
return false;
@@ -1417,13 +1407,13 @@ const WindowManager = new Lang.Class({
actor.scale_y = 1.0;
actor.translation_x = 0;
actor.translation_y = 0;
this._clearFullscreenInfo(actor);
this._clearAnimationInfo(actor);
}
},
_sizeChangeWindowOverwritten: function(shellwm, actor) {
if (this._removeEffect(this._resizing, actor))
this._clearFullscreenInfo(actor);
this._clearAnimationInfo(actor);
},
_hasAttachedDialogs: function(window, ignoreWindow) {
@@ -1614,7 +1604,7 @@ const WindowManager = new Lang.Class({
return;
}
switch (actor.meta_window.window_type) {
switch (actor._windowType) {
case Meta.WindowType.NORMAL:
actor.set_pivot_point(0.5, 0.5);
this._destroying.push(actor);

View File

@@ -1100,7 +1100,6 @@ const Workspace = new Lang.Class({
_init : function(metaWorkspace, monitorIndex) {
// When dragging a window, we use this slot for reserve space.
this._reservedSlot = null;
this._reservedSlotWindow = null;
this.metaWorkspace = metaWorkspace;
// The full geometry is the geometry we should try and position

489
po/ca.po

File diff suppressed because it is too large Load Diff

220
po/da.po
View File

@@ -21,8 +21,8 @@ msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2017-04-07 12:28+0000\n"
"PO-Revision-Date: 2017-04-08 16:17+0200\n"
"POT-Creation-Date: 2017-03-03 11:37+0000\n"
"PO-Revision-Date: 2017-03-07 20:04+0200\n"
"Last-Translator: Kris Thomsen\n"
"Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
"Language: da\n"
@@ -347,7 +347,7 @@ msgstr "Der opstod in fejl ved indlæsning af indstillingsdialogen for %s:"
#: js/gdm/authPrompt.js:149 js/ui/audioDeviceSelection.js:71
#: js/ui/components/networkAgent.js:145 js/ui/components/polkitAgent.js:179
#: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:195
#: js/ui/shellMountOperation.js:399 js/ui/status/network.js:947
#: js/ui/shellMountOperation.js:399 js/ui/status/network.js:939
msgid "Cancel"
msgstr "Annullér"
@@ -395,7 +395,7 @@ msgstr "Brugernavn: "
msgid "Login Window"
msgstr "Indlogningsvindue"
#: js/gdm/util.js:342
#: js/gdm/util.js:341
msgid "Authentication error"
msgstr "Godkendelsesfejl"
@@ -404,7 +404,7 @@ msgstr "Godkendelsesfejl"
#. as a cue to display our own message.
#. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead
#: js/gdm/util.js:474
#: js/gdm/util.js:473
msgid "(or swipe finger)"
msgstr "(eller indlæs fingeraftryk)"
@@ -442,6 +442,7 @@ msgstr[0] "%d time siden"
msgstr[1] "%d timer siden"
#: js/misc/util.js:188
#| msgid "Yesterday, %H%M"
msgid "Yesterday"
msgstr "I går"
@@ -461,6 +462,8 @@ msgstr[1] "%d uger siden"
#: js/misc/util.js:196
#, javascript-format
#| msgid "%d minute ago"
#| msgid_plural "%d minutes ago"
msgid "%d month ago"
msgid_plural "%d months ago"
msgstr[0] "%d måned siden"
@@ -468,6 +471,8 @@ msgstr[1] "%d måneder siden"
#: js/misc/util.js:198
#, javascript-format
#| msgid "%d day ago"
#| msgid_plural "%d days ago"
msgid "%d year ago"
msgid_plural "%d years ago"
msgstr[0] "%d år siden"
@@ -544,11 +549,11 @@ msgid "%B %d %Y, %l%M %p"
msgstr "%d. %B %Y, %l%M %p"
#. TRANSLATORS: this is the title of the wifi captive portal login window
#: js/portalHelper/main.js:66
#: js/portalHelper/main.js:67
msgid "Hotspot Login"
msgstr "Hotspot-login"
#: js/portalHelper/main.js:112
#: js/portalHelper/main.js:113
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."
@@ -558,11 +563,11 @@ msgstr ""
#. No support for non-modal system dialogs, so ignore the option
#. let modal = options['modal'] || true;
#: js/ui/accessDialog.js:62 js/ui/status/location.js:405
#: js/ui/accessDialog.js:62 js/ui/status/location.js:427
msgid "Deny Access"
msgstr "Forbyd adgang"
#: js/ui/accessDialog.js:63 js/ui/status/location.js:408
#: js/ui/accessDialog.js:63 js/ui/status/location.js:430
msgid "Grant Access"
msgstr "Giv adgang"
@@ -762,7 +767,7 @@ msgid "Type again:"
msgstr "Indtast igen:"
#: js/ui/components/networkAgent.js:140 js/ui/status/network.js:272
#: js/ui/status/network.js:366 js/ui/status/network.js:950
#: js/ui/status/network.js:366 js/ui/status/network.js:942
msgid "Connect"
msgstr "Forbind"
@@ -837,7 +842,7 @@ msgstr "Adgangskode til mobilt bredbåndsnetværk"
msgid "A password is required to connect to “%s”."
msgstr "Der kræves en adgangskode for at forbinde til “%s”."
#: js/ui/components/networkAgent.js:655 js/ui/status/network.js:1759
#: js/ui/components/networkAgent.js:655 js/ui/status/network.js:1747
msgid "Network Manager"
msgstr "Netværkshåndtering"
@@ -863,12 +868,12 @@ msgstr "Beklager, det fungerede ikke. Prøv igen."
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
#: js/ui/components/telepathyClient.js:799
#: js/ui/components/telepathyClient.js:767
#, javascript-format
msgid "%s is now known as %s"
msgstr "%s kalder sig nu %s"
#: js/ui/ctrlAltTab.js:29 js/ui/viewSelector.js:179
#: js/ui/ctrlAltTab.js:29 js/ui/viewSelector.js:178
msgid "Windows"
msgstr "Vinduer"
@@ -937,24 +942,21 @@ msgid "%s, then %s, followed by %s later."
msgstr "%s, derefter %s, efterfulgt af %s."
#: js/ui/dateMenu.js:300
msgid "Select a location…"
msgstr "Vælg en placering …"
#: js/ui/dateMenu.js:303
#| msgid "Searching…"
msgid "Loading…"
msgstr "Indlæser …"
#. Translators: %s is a temperature with unit, e.g. "23℃"
#: js/ui/dateMenu.js:309
#: js/ui/dateMenu.js:306
#, javascript-format
msgid "Feels like %s."
msgstr "Føles som %s."
#: js/ui/dateMenu.js:312
#: js/ui/dateMenu.js:309
msgid "Go online for weather information"
msgstr "Gå online for at se information om vejret"
#: js/ui/dateMenu.js:314
#: js/ui/dateMenu.js:311
msgid "Weather information is currently unavailable"
msgstr "Vejrinformation er ikke tilgængelig i øjeblikket"
@@ -1127,51 +1129,51 @@ msgstr "Skjul statusfelt"
msgid "Status Icons"
msgstr "Statusikoner"
#: js/ui/lookingGlass.js:642
#: js/ui/lookingGlass.js:643
msgid "No extensions installed"
msgstr "Ingen udvidelser er installeret"
#. Translators: argument is an extension UUID.
#: js/ui/lookingGlass.js:696
#: js/ui/lookingGlass.js:697
#, javascript-format
msgid "%s has not emitted any errors."
msgstr "%s er ikke kommet med nogen fejl."
#: js/ui/lookingGlass.js:702
#: js/ui/lookingGlass.js:703
msgid "Hide Errors"
msgstr "Skjul fejl"
#: js/ui/lookingGlass.js:706 js/ui/lookingGlass.js:766
#: js/ui/lookingGlass.js:707 js/ui/lookingGlass.js:767
msgid "Show Errors"
msgstr "Vis fejl"
#: js/ui/lookingGlass.js:715
#: js/ui/lookingGlass.js:716
msgid "Enabled"
msgstr "Aktiveret"
#. translators:
#. * The device has been disabled
#: js/ui/lookingGlass.js:718 src/gvc/gvc-mixer-control.c:1866
#: js/ui/lookingGlass.js:719 src/gvc/gvc-mixer-control.c:1866
msgid "Disabled"
msgstr "Deaktiveret"
#: js/ui/lookingGlass.js:720
#: js/ui/lookingGlass.js:721
msgid "Error"
msgstr "Fejl"
#: js/ui/lookingGlass.js:722
#: js/ui/lookingGlass.js:723
msgid "Out of date"
msgstr "Udløbet"
#: js/ui/lookingGlass.js:724
#: js/ui/lookingGlass.js:725
msgid "Downloading"
msgstr "Henter"
#: js/ui/lookingGlass.js:748
#: js/ui/lookingGlass.js:749
msgid "View Source"
msgstr "Vis kilde"
#: js/ui/lookingGlass.js:757
#: js/ui/lookingGlass.js:758
msgid "Web Page"
msgstr "Webside"
@@ -1205,47 +1207,47 @@ msgstr "Oversigt"
msgid "Type to search…"
msgstr "Skriv for at søge …"
#: js/ui/padOsd.js:103
#: js/ui/padOsd.js:37
msgid "New shortcut…"
msgstr "Ny genvej …"
#: js/ui/padOsd.js:152
#: js/ui/padOsd.js:86
msgid "Application defined"
msgstr "Program defineret"
#: js/ui/padOsd.js:153
#: js/ui/padOsd.js:87
msgid "Show on-screen help"
msgstr "Vis hjælp på skærmen"
#: js/ui/padOsd.js:154
#: js/ui/padOsd.js:88
msgid "Switch monitor"
msgstr "Skift skærm"
#: js/ui/padOsd.js:155
#: js/ui/padOsd.js:89
msgid "Assign keystroke"
msgstr "Tildel tastekombination"
#: js/ui/padOsd.js:209
#: js/ui/padOsd.js:143
msgid "Done"
msgstr "Færdig"
#: js/ui/padOsd.js:698
#: js/ui/padOsd.js:597
msgid "Edit…"
msgstr "Redigér …"
#: js/ui/padOsd.js:738 js/ui/padOsd.js:800
#: js/ui/padOsd.js:610 js/ui/padOsd.js:665
msgid "None"
msgstr "Ingen"
#: js/ui/padOsd.js:783
#: js/ui/padOsd.js:648
msgid "Press a button to configure"
msgstr "Tryk på en knap for at konfigurere"
#: js/ui/padOsd.js:784
#: js/ui/padOsd.js:649
msgid "Press Esc to exit"
msgstr "Tryk Esc for at afslutte"
#: js/ui/padOsd.js:787
#: js/ui/padOsd.js:652
msgid "Press any key to exit"
msgstr "Tryk en vilkårlig tast for at afslutte"
@@ -1281,7 +1283,7 @@ msgstr "toggle-switch-intl"
msgid "Enter a Command"
msgstr "Indtast en kommando"
#: js/ui/runDialog.js:111 js/ui/windowMenu.js:160
#: js/ui/runDialog.js:111 js/ui/windowMenu.js:162
msgid "Close"
msgstr "Luk"
@@ -1295,29 +1297,29 @@ msgstr "Genstarter …"
#. Translators: This is a time format for a date in
#. long format
#: js/ui/screenShield.js:88
#: js/ui/screenShield.js:85
msgid "%A, %B %d"
msgstr "%A, %d. %B"
#: js/ui/screenShield.js:147
#: js/ui/screenShield.js:144
#, javascript-format
msgid "%d new message"
msgid_plural "%d new messages"
msgstr[0] "%d ny besked"
msgstr[1] "%d nye beskeder"
#: js/ui/screenShield.js:149
#: js/ui/screenShield.js:146
#, javascript-format
msgid "%d new notification"
msgid_plural "%d new notifications"
msgstr[0] "%d ny påmindelse"
msgstr[1] "%d nye påmindelser"
#: js/ui/screenShield.js:452 js/ui/status/system.js:409
#: js/ui/screenShield.js:449 js/ui/status/system.js:409
msgid "Lock"
msgstr "Lås"
#: js/ui/screenShield.js:715
#: js/ui/screenShield.js:707
msgid "GNOME needs to lock the screen"
msgstr "GNOME er nødt til at låse skærmen"
@@ -1328,11 +1330,11 @@ msgstr "GNOME er nødt til at låse skærmen"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: js/ui/screenShield.js:836 js/ui/screenShield.js:1308
#: js/ui/screenShield.js:828 js/ui/screenShield.js:1295
msgid "Unable to lock"
msgstr "Kunne ikke låse"
#: js/ui/screenShield.js:837 js/ui/screenShield.js:1309
#: js/ui/screenShield.js:829 js/ui/screenShield.js:1296
msgid "Lock was blocked by an application"
msgstr "Lås blev blokeret af et program"
@@ -1436,13 +1438,13 @@ msgstr "Slukket"
msgid "On"
msgstr "Tændt"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1310
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1302
msgid "Turn On"
msgstr "Tænd"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:181
#: js/ui/status/network.js:367 js/ui/status/network.js:1310
#: js/ui/status/network.js:1429 js/ui/status/nightLight.js:47
#: js/ui/status/network.js:367 js/ui/status/network.js:1302
#: js/ui/status/network.js:1417 js/ui/status/nightLight.js:47
#: js/ui/status/rfkill.js:90 js/ui/status/rfkill.js:117
msgid "Turn Off"
msgstr "Sluk"
@@ -1455,37 +1457,37 @@ msgstr "Lysstyrke"
msgid "Show Keyboard Layout"
msgstr "Vis tastaturlayout"
#: js/ui/status/location.js:88 js/ui/status/location.js:196
#: js/ui/status/location.js:107 js/ui/status/location.js:215
msgid "Location Enabled"
msgstr "Placering aktiveret"
#: js/ui/status/location.js:89 js/ui/status/location.js:197
#: js/ui/status/location.js:108 js/ui/status/location.js:216
msgid "Disable"
msgstr "Slå fra"
#: js/ui/status/location.js:90
#: js/ui/status/location.js:109
msgid "Privacy Settings"
msgstr "Indstillinger for privatliv"
#: js/ui/status/location.js:195
#: js/ui/status/location.js:214
msgid "Location In Use"
msgstr "Placering i brug"
#: js/ui/status/location.js:199
#: js/ui/status/location.js:218
msgid "Location Disabled"
msgstr "Placering deaktiveret"
#: js/ui/status/location.js:200
#: js/ui/status/location.js:219
msgid "Enable"
msgstr "Slå til"
#. Translators: %s is an application name
#: js/ui/status/location.js:414
#: js/ui/status/location.js:436
#, javascript-format
msgid "Give %s access to your location?"
msgstr "Giv %s adgang til din placering?"
#: js/ui/status/location.js:416
#: js/ui/status/location.js:438
msgid "Location access can be changed at any time from the privacy settings."
msgstr ""
"Placeringsadgang kan ændres når som helst via privatlivsindstillingerne."
@@ -1495,7 +1497,7 @@ msgid "<unknown>"
msgstr "<ukendt>"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:465 js/ui/status/network.js:1339
#: js/ui/status/network.js:465 js/ui/status/network.js:1331
#, javascript-format
msgid "%s Off"
msgstr "%s er slukket"
@@ -1521,7 +1523,7 @@ msgid "%s Disconnecting"
msgstr "%s frakobler"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:483 js/ui/status/network.js:1331
#: js/ui/status/network.js:483 js/ui/status/network.js:1323
#, javascript-format
msgid "%s Connecting"
msgstr "%s forbinder"
@@ -1561,7 +1563,7 @@ msgid "Mobile Broadband Settings"
msgstr "Indstillinger for mobilbredbånd"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:602 js/ui/status/network.js:1336
#: js/ui/status/network.js:602 js/ui/status/network.js:1328
#, javascript-format
msgid "%s Hardware Disabled"
msgstr "Hardwaren %s er deaktiveret"
@@ -1577,122 +1579,122 @@ msgstr "%s er deaktiveret"
msgid "Connect to Internet"
msgstr "Forbind til internet"
#: js/ui/status/network.js:844
#: js/ui/status/network.js:836
msgid "Airplane Mode is On"
msgstr "Flytilstand er slået til"
#: js/ui/status/network.js:845
#: js/ui/status/network.js:837
msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "Trådløs er deaktiveret når flytilstand er slået til."
#: js/ui/status/network.js:846
#: js/ui/status/network.js:838
msgid "Turn Off Airplane Mode"
msgstr "Slå flytilstand fra"
#: js/ui/status/network.js:855
#: js/ui/status/network.js:847
msgid "Wi-Fi is Off"
msgstr "Trådløs er slået fra"
#: js/ui/status/network.js:856
#: js/ui/status/network.js:848
msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr "Trådløs skal tændes for at kunne forbinde til et netværk."
#: js/ui/status/network.js:857
#: js/ui/status/network.js:849
msgid "Turn On Wi-Fi"
msgstr "Slå trådløs til"
#: js/ui/status/network.js:882
#: js/ui/status/network.js:874
msgid "Wi-Fi Networks"
msgstr "Trådløse netværk"
#: js/ui/status/network.js:884
#: js/ui/status/network.js:876
msgid "Select a network"
msgstr "Vælg et netværk"
#: js/ui/status/network.js:914
#: js/ui/status/network.js:906
msgid "No Networks"
msgstr "Ingen netværk"
#: js/ui/status/network.js:935 js/ui/status/rfkill.js:115
#: js/ui/status/network.js:927 js/ui/status/rfkill.js:115
msgid "Use hardware switch to turn off"
msgstr "Brug hardwareknap til at slukke"
#: js/ui/status/network.js:1202
#: js/ui/status/network.js:1194
msgid "Select Network"
msgstr "Vælg netværk"
#: js/ui/status/network.js:1208
#: js/ui/status/network.js:1200
msgid "Wi-Fi Settings"
msgstr "Indstillinger for trådløs"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1327
#: js/ui/status/network.js:1319
#, javascript-format
msgid "%s Hotspot Active"
msgstr "Hotspottet %s er aktivt"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1342
#: js/ui/status/network.js:1334
#, javascript-format
msgid "%s Not Connected"
msgstr "%s er ikke forbundet"
#: js/ui/status/network.js:1446
#: js/ui/status/network.js:1434
msgid "connecting…"
msgstr "forbinder …"
#. Translators: this is for network connections that require some kind of key or password
#: js/ui/status/network.js:1449
#: js/ui/status/network.js:1437
msgid "authentication required"
msgstr "godkendelse påkrævet"
#: js/ui/status/network.js:1451
#: js/ui/status/network.js:1439
msgid "connection failed"
msgstr "forbindelse mislykkedes"
#: js/ui/status/network.js:1517 js/ui/status/network.js:1612
#: js/ui/status/network.js:1505 js/ui/status/network.js:1600
#: js/ui/status/rfkill.js:93
msgid "Network Settings"
msgstr "Netværksindstillinger"
#: js/ui/status/network.js:1519
#: js/ui/status/network.js:1507
msgid "VPN Settings"
msgstr "Indstillinger for VPN"
#: js/ui/status/network.js:1538
#: js/ui/status/network.js:1526
msgid "VPN"
msgstr "VPN"
#: js/ui/status/network.js:1548
#: js/ui/status/network.js:1536
msgid "VPN Off"
msgstr "VPN slukket"
#: js/ui/status/network.js:1643
#: js/ui/status/network.js:1631
#, javascript-format
msgid "%s Wired Connection"
msgid_plural "%s Wired Connections"
msgstr[0] "%s kablet forbindelse"
msgstr[1] "%s kablede forbindelser"
#: js/ui/status/network.js:1647
#: js/ui/status/network.js:1635
#, javascript-format
msgid "%s Wi-Fi Connection"
msgid_plural "%s Wi-Fi Connections"
msgstr[0] "%s trådløs forbindelse"
msgstr[1] "%s trådløse forbindelser"
#: js/ui/status/network.js:1651
#: js/ui/status/network.js:1639
#, javascript-format
msgid "%s Modem Connection"
msgid_plural "%s Modem Connections"
msgstr[0] "%s modem-forbindelse"
msgstr[1] "%s modem-forbindelser"
#: js/ui/status/network.js:1798
#: js/ui/status/network.js:1786
msgid "Connection failed"
msgstr "Forbindelse mislykkedes"
#: js/ui/status/network.js:1799
#: js/ui/status/network.js:1787
msgid "Activation of network connection failed"
msgstr "Aktivering af netværksforbindelse mislykkedes"
@@ -1790,11 +1792,11 @@ msgstr "Log ind som en anden bruger"
msgid "Unlock Window"
msgstr "Lås vindue op"
#: js/ui/viewSelector.js:183
#: js/ui/viewSelector.js:182
msgid "Applications"
msgstr "Programmer"
#: js/ui/viewSelector.js:187
#: js/ui/viewSelector.js:186
msgid "Search"
msgstr "Søg"
@@ -1803,22 +1805,22 @@ msgstr "Søg"
msgid "“%s” is ready"
msgstr "“%s” er klar"
#: js/ui/windowManager.js:84
#: js/ui/windowManager.js:83
msgid "Do you want to keep these display settings?"
msgstr "Vil du beholde disse skærmindstillinger?"
#. Translators: this and the following message should be limited in lenght,
#. to avoid ellipsizing the labels.
#.
#: js/ui/windowManager.js:103
#: js/ui/windowManager.js:102
msgid "Revert Settings"
msgstr "Forkast indstillinger"
#: js/ui/windowManager.js:106
#: js/ui/windowManager.js:105
msgid "Keep Changes"
msgstr "Behold ændringer"
#: js/ui/windowManager.js:124
#: js/ui/windowManager.js:123
#, javascript-format
msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds"
@@ -1827,7 +1829,7 @@ msgstr[1] "Indstillingsændringer vil forkastes om %d sekunder"
#. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height.
#: js/ui/windowManager.js:679
#: js/ui/windowManager.js:678
#, javascript-format
msgid "%d × %d"
msgstr "%d × %d"
@@ -1864,35 +1866,35 @@ msgstr "Altid øverst"
msgid "Always on Visible Workspace"
msgstr "Altid på synligt arbejdsområde"
#: js/ui/windowMenu.js:103
#: js/ui/windowMenu.js:105
msgid "Move to Workspace Left"
msgstr "Flyt til venste arbejdsområde"
#: js/ui/windowMenu.js:108
#: js/ui/windowMenu.js:110
msgid "Move to Workspace Right"
msgstr "Flyt til højre arbejdsområde"
#: js/ui/windowMenu.js:113
#: js/ui/windowMenu.js:115
msgid "Move to Workspace Up"
msgstr "Flyt til arbejdsområdet ovenover"
#: js/ui/windowMenu.js:118
#: js/ui/windowMenu.js:120
msgid "Move to Workspace Down"
msgstr "Flyt til arbejdsområdet nedenunder"
#: js/ui/windowMenu.js:134
#: js/ui/windowMenu.js:136
msgid "Move to Monitor Up"
msgstr "Flyt til skærmen ovenover"
#: js/ui/windowMenu.js:140
#: js/ui/windowMenu.js:142
msgid "Move to Monitor Down"
msgstr "Flyt til skærmen nedenunder"
#: js/ui/windowMenu.js:146
#: js/ui/windowMenu.js:148
msgid "Move to Monitor Left"
msgstr "Flyt til venstre skærm"
#: js/ui/windowMenu.js:152
#: js/ui/windowMenu.js:154
msgid "Move to Monitor Right"
msgstr "Flyt til højre skærm"
@@ -1927,19 +1929,19 @@ msgstr[1] "%u inputs"
msgid "System Sounds"
msgstr "Systemlyde"
#: src/main.c:372
#: src/main.c:381
msgid "Print version"
msgstr "Udskriv version"
#: src/main.c:378
#: src/main.c:387
msgid "Mode used by GDM for login screen"
msgstr "Tilstand brugt af GDM til indlogningskærm"
#: src/main.c:384
#: src/main.c:393
msgid "Use a specific mode, e.g. “gdm” for login screen"
msgstr "Brug en specifik tilstand, f.eks. “gdm” til logind-skærm"
#: src/main.c:390
#: src/main.c:399
msgid "List possible modes"
msgstr "Vis mulige tilstande"

View File

@@ -1,10 +1,10 @@
# Spanish translation of gnome-shell.
# Copyright (C) 2009 gnome-shell's COPYRIGHT HOLDER
# This file is distributed under the same license as the gnome-shell package.
# Jorge González <jorgegonz@svn.gnome.org>, 2009, 2010, 2011.
# Benjamín Valero Espinosa <benjavalero@gmail.com>, 2011.
#
# Daniel Mustieles <daniel.mustieles@gmail.com>, 2010-2017.
# Spanish translation of gnome-shell.
# Copyright (C) 2009 gnome-shell's COPYRIGHT HOLDER
# This file is distributed under the same license as the gnome-shell package.
# Jorge González <jorgegonz@svn.gnome.org>, 2009, 2010, 2011.
# Benjamín Valero Espinosa <benjavalero@gmail.com>, 2011.
#
# Daniel Mustieles <daniel.mustieles@gmail.com>, 2010, 2011, 2012, 2013, 2014, 2015.
, 2016, 2017.
#
msgid ""

View File

@@ -1,10 +1,10 @@
# Hebrew translation for gnome-shell.
# Copyright (C) 2009 gnome-shell's COPYRIGHT HOLDER
# This file is distributed under the same license as the gnome-shell package.
# liel <lielft@gmail.com>, 2009.
# Yaron Shahrabani <sh.yaron@gmail.com>, 2010.
#
# Yosef Or Boczko <yoseforb@gnome.org>, 2013, 2014.
# Hebrew translation for gnome-shell.
# Copyright (C) 2009 gnome-shell's COPYRIGHT HOLDER
# This file is distributed under the same license as the gnome-shell package.
# liel <lielft@gmail.com>, 2009.
# Yaron Shahrabani <sh.yaron@gmail.com>, 2010.
#
# Yosef Or Boczko <yoseforb@gnome.org>, 2013, 2014.
, 2014.
#
msgid ""
@@ -1095,7 +1095,7 @@ msgstr "מופעל מחדש…"
#: js/ui/screenShield.js:85
msgid "%A, %B %d"
msgstr "%A, ה־%d ב%B"
# javascript-format
# javascript-format
#: js/ui/screenShield.js:144
#, javascript-format
@@ -1103,7 +1103,7 @@ msgid_plural "%d new messages"
msgid_plural "%d new messages"
msgstr[0] "הודעה חדשה אחת"
msgstr[1] "%d הודעות חדשות"
# javascript-format
# javascript-format
#: js/ui/screenShield.js:146
#, javascript-format
@@ -1577,7 +1577,7 @@ msgstr "שחזור הגדרות"
#: js/ui/windowManager.js:85
msgid "Keep Changes"
msgstr "שמירת שינויים"
# javascript-format
# javascript-format
#: js/ui/windowManager.js:103
#, javascript-format
@@ -1728,7 +1728,7 @@ msgstr "המשתמש בחר להתעלם מתיבת דו־שיח האימות"
#~ msgid "System"
#~ msgstr "מערכת"
# javascript-format
# javascript-format
#~ msgid "Show the notification list"
#~ msgstr "הצגת רשימת ההתרעות"
@@ -1759,7 +1759,7 @@ msgstr "המשתמש בחר להתעלם מתיבת דו־שיח האימות"
#~ msgid "GNOME Shell (wayland compositor)"
#~ msgstr "GNOME Shell (מסדר wayland)"
# javascript-format
# javascript-format
#~ msgid "%d Connected Device"
#~ msgid_plural "%d Connected Devices"

View File

@@ -68,7 +68,6 @@ main(int argc, char **argv)
if (clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS)
return 1;
g_object_set (clutter_settings_get_default (), "window-scaling-factor", 1, NULL);
gdk_x11_display_set_window_scale (gdk_display_get_default (), 1);
context = g_option_context_new (NULL);

View File

@@ -22,6 +22,7 @@
#include <gdk/gdkx.h>
#include <gio/gio.h>
#include <girepository.h>
#include <meta/meta-backend.h>
#include <meta/display.h>
#include <meta/util.h>
#include <meta/meta-shaped-texture.h>
@@ -833,35 +834,38 @@ global_stage_after_swap (gpointer data)
return TRUE;
}
static void
update_scale_factor (GtkSettings *settings,
GParamSpec *pspec,
gpointer data)
update_scaling_factor (ShellGlobal *global,
MetaBackend *backend)
{
ShellGlobal *global = SHELL_GLOBAL (data);
ClutterStage *stage = CLUTTER_STAGE (global->stage);
StThemeContext *context = st_theme_context_get_for_stage (stage);
GValue value = G_VALUE_INIT;
int scaling_factor;
g_value_init (&value, G_TYPE_INT);
if (gdk_screen_get_setting (global->gdk_screen, "gdk-window-scaling-factor", &value))
scaling_factor = meta_backend_get_ui_scaling_factor (backend);
g_object_set (context, "scale-factor", scaling_factor, NULL);
if (meta_is_wayland_compositor ())
{
g_object_set (context, "scale-factor", g_value_get_int (&value), NULL);
if (meta_is_wayland_compositor ())
{
int xft_dpi;
g_object_get (settings, "gtk-xft-dpi", &xft_dpi, NULL);
GtkSettings *settings = gtk_settings_get_default ();
int xft_dpi;
g_object_set (clutter_settings_get_default (), "font-dpi", xft_dpi, NULL);
}
g_object_get (settings, "gtk-xft-dpi", &xft_dpi, NULL);
g_object_set (clutter_settings_get_default (), "font-dpi", xft_dpi, NULL);
}
/* Make sure clutter and gdk scaling stays disabled */
g_object_set (clutter_settings_get_default (), "window-scaling-factor", 1, NULL);
gdk_x11_display_set_window_scale (gdk_display_get_default (), 1);
}
static void
ui_scaling_factor_changed (MetaBackend *backend,
ShellGlobal *global)
{
update_scaling_factor (global, backend);
}
/* This is an IBus workaround. The flow of events with IBus is that every time
* it gets gets a key event, it:
*
@@ -965,6 +969,8 @@ void
_shell_global_set_plugin (ShellGlobal *global,
MetaPlugin *plugin)
{
MetaBackend *backend;
g_return_if_fail (SHELL_IS_GLOBAL (global));
g_return_if_fail (global->plugin == NULL);
@@ -1045,18 +1051,15 @@ _shell_global_set_plugin (ShellGlobal *global,
g_signal_connect (global->meta_display, "notify::focus-window",
G_CALLBACK (focus_window_changed), global);
/* gdk-window-scaling-factor is not exported to gtk-settings
* because it is handled inside gdk, so we use gtk-xft-dpi instead
* which also changes when the scale factor changes.
*/
g_signal_connect (gtk_settings_get_default (), "notify::gtk-xft-dpi",
G_CALLBACK (update_scale_factor), global);
backend = meta_get_backend ();
g_signal_connect (backend, "ui-scaling-factor-changed",
G_CALLBACK (ui_scaling_factor_changed), global);
gdk_event_handler_set (gnome_shell_gdk_event_handler, global, NULL);
global->focus_manager = st_focus_manager_get_for_stage (global->stage);
update_scale_factor (gtk_settings_get_default (), NULL, global);
update_scaling_factor (global, meta_get_backend ());
}
GjsContext *

View File

@@ -23,8 +23,6 @@
#include <string.h>
#include <dbus/dbus-glib.h>
/* For use of unstable features in libsecret, until they stabilize */
#define SECRET_API_SUBJECT_TO_CHANGE
#include <libsecret/secret.h>
#include "shell-network-agent.h"

View File

@@ -420,8 +420,7 @@ _st_create_shadow_pipeline_from_actor (StShadow *shadow_spec,
CoglTexture *texture;
texture = clutter_texture_get_cogl_texture (CLUTTER_TEXTURE (actor));
if (texture)
shadow_pipeline = _st_create_shadow_pipeline (shadow_spec, texture);
shadow_pipeline = _st_create_shadow_pipeline (shadow_spec, texture);
}
else
{

View File

@@ -180,7 +180,7 @@ st_shadow_get_box (StShadow *shadow,
}
/**
* SECTION:st-shadow-helper:
* SECTION: st-shadow-helper
*
* An helper for implementing a drop shadow on a actor.
* The actor is expected to recreate the helper whenever its contents