Compare commits
51 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7a2d4959f2 | ||
|
|
6b3c9539f6 | ||
|
|
7e7e3ec016 | ||
|
|
83fb34608c | ||
|
|
a72f0604dc | ||
|
|
4dfad536a3 | ||
|
|
0dca5e513b | ||
|
|
7090592477 | ||
|
|
63f2fdd1a4 | ||
|
|
e94de67bd2 | ||
|
|
817ff52414 | ||
|
|
a55599a239 | ||
|
|
94114d82ff | ||
|
|
7cc88f96c4 | ||
|
|
447bf55e45 | ||
|
|
9d53a7700a | ||
|
|
51145a3d41 | ||
|
|
1297315cc2 | ||
|
|
b859a7f763 | ||
|
|
41baf0fc74 | ||
|
|
c324395ee6 | ||
|
|
aecd1c126a | ||
|
|
9b7304488e | ||
|
|
6362b3d057 | ||
|
|
0142fae742 | ||
|
|
73680e2433 | ||
|
|
e38c26894b | ||
|
|
28ca96064b | ||
|
|
be95a63a03 | ||
|
|
2a3a5dfc0b | ||
|
|
94a0ae1ec3 | ||
|
|
44fb014a0d | ||
|
|
8007f4dda3 | ||
|
|
ff425d1db7 | ||
|
|
9a65f20d91 | ||
|
|
0770383f78 | ||
|
|
06fdf2fdc8 | ||
|
|
7a20683728 | ||
|
|
8e443a2aff | ||
|
|
fcbb942e24 | ||
|
|
1508d76d32 | ||
|
|
ef9dee2a05 | ||
|
|
2714d8d0ce | ||
|
|
243dae14ea | ||
|
|
2cce1b9ea0 | ||
|
|
89f4e983d6 | ||
|
|
f680cf6050 | ||
|
|
4cd4678194 | ||
|
|
082bc20bb9 | ||
|
|
32ea7d763a | ||
|
|
44e80f4c46 |
51
NEWS
51
NEWS
@@ -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
|
||||
======
|
||||
|
||||
@@ -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])
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Submodule data/theme/gnome-shell-sass updated: e94bce1fcf...4c361179a1
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
},
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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]));
|
||||
}));
|
||||
},
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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());
|
||||
|
||||
|
||||
@@ -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++;
|
||||
|
||||
@@ -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' });
|
||||
|
||||
@@ -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 () {
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}));
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
162
js/ui/padOsd.js
162
js/ui/padOsd.js
@@ -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) {
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -1709,7 +1709,6 @@ const NMApplet = new Lang.Class({
|
||||
|
||||
this._mainConnection = null;
|
||||
this._mainConnectionIconChangedId = 0;
|
||||
this._mainConnectionStateChangedId = 0;
|
||||
|
||||
this._notification = null;
|
||||
|
||||
|
||||
@@ -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));
|
||||
|
||||
|
||||
@@ -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;
|
||||
},
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
220
po/da.po
220
po/da.po
@@ -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"
|
||||
|
||||
|
||||
14
po/es.po
14
po/es.po
@@ -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 ""
|
||||
|
||||
24
po/he.po
24
po/he.po
@@ -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"
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 *
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user