Compare commits
117 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
08a69cdcbd | ||
|
|
aa9c095c8e | ||
|
|
b257029d3e | ||
|
|
cb9062f818 | ||
|
|
3a1f623ea3 | ||
|
|
47d46e367e | ||
|
|
e5534e86ab | ||
|
|
e0ca572572 | ||
|
|
ca4b86e7ca | ||
|
|
f177bd0b51 | ||
|
|
11086e8ef8 | ||
|
|
1237aef727 | ||
|
|
79bfea5970 | ||
|
|
50f8ae6fc7 | ||
|
|
73ec86797b | ||
|
|
703417a760 | ||
|
|
3013a87bd2 | ||
|
|
833cb2556b | ||
|
|
8f4f8fccdb | ||
|
|
38e4ab1cea | ||
|
|
366a3e2c35 | ||
|
|
fcb175ebb3 | ||
|
|
a76cc79f88 | ||
|
|
1a6d74fcb2 | ||
|
|
eb351b1882 | ||
|
|
43caace1b6 | ||
|
|
167ed7c35b | ||
|
|
69735940ec | ||
|
|
1a7fad129d | ||
|
|
6931e6cf0f | ||
|
|
87e021cd2e | ||
|
|
d3f5d94afe | ||
|
|
a3d8b5e526 | ||
|
|
5e46abfa03 | ||
|
|
f4740bac65 | ||
|
|
dc10e61a20 | ||
|
|
82c8aad157 | ||
|
|
4ba1f26e4d | ||
|
|
f8805e8311 | ||
|
|
c815979f2a | ||
|
|
54e5ffcac1 | ||
|
|
3fd0502cb9 | ||
|
|
8aed51180f | ||
|
|
e616877fd2 | ||
|
|
df15ee4074 | ||
|
|
4cf3acd0ec | ||
|
|
77ea16e18f | ||
|
|
85d993386a | ||
|
|
14a7da767b | ||
|
|
2f3df71cc1 | ||
|
|
dc13e72b89 | ||
|
|
2beff9896a | ||
|
|
43af6f4792 | ||
|
|
04d1a35cb5 | ||
|
|
f075b36d4f | ||
|
|
c21b1e5fe0 | ||
|
|
042c1fd54b | ||
|
|
ee6086373b | ||
|
|
382310fe51 | ||
|
|
d52cb510fc | ||
|
|
c1de2788b1 | ||
|
|
41dc9e0894 | ||
|
|
d3b0d23d8f | ||
|
|
f96dcaccbe | ||
|
|
2672f205fd | ||
|
|
1ba21ed367 | ||
|
|
79408d359c | ||
|
|
12c76e53cb | ||
|
|
ac44426557 | ||
|
|
684e5bec15 | ||
|
|
70d19530c4 | ||
|
|
e34ab6c5ae | ||
|
|
b3cb9d8459 | ||
|
|
df3fa973ad | ||
|
|
1f4895428d | ||
|
|
417941a1bf | ||
|
|
973a6b21a2 | ||
|
|
b50604d070 | ||
|
|
a1ecf459b3 | ||
|
|
6ea80eadd6 | ||
|
|
9dafaa2c0c | ||
|
|
50e5736c03 | ||
|
|
46fcfb7629 | ||
|
|
8a86540090 | ||
|
|
785ab8192b | ||
|
|
3c386e0c50 | ||
|
|
bec48492ab | ||
|
|
13a10f8afd | ||
|
|
00fe97a55a | ||
|
|
9e665e4903 | ||
|
|
efc128e681 | ||
|
|
6851c5443a | ||
|
|
baf08dd688 | ||
|
|
67115b3e9b | ||
|
|
4ca2697271 | ||
|
|
4696bfbb80 | ||
|
|
18c62a1987 | ||
|
|
d60a4e97d6 | ||
|
|
43883a6945 | ||
|
|
58ff5c6cc6 | ||
|
|
3902e8bff0 | ||
|
|
5d6f37017b | ||
|
|
ecbf2f1429 | ||
|
|
56dc2eb96e | ||
|
|
2154a22c90 | ||
|
|
3fafe0da07 | ||
|
|
983535224e | ||
|
|
88effdd9c3 | ||
|
|
e9a4843eb0 | ||
|
|
c50132b29f | ||
|
|
e92a6b3c6c | ||
|
|
66a36bf591 | ||
|
|
39559f0a09 | ||
|
|
712623946f | ||
|
|
47ce72e011 | ||
|
|
7f8c5c4f64 | ||
|
|
64fdff6ace |
55
NEWS
55
NEWS
@@ -1,3 +1,58 @@
|
||||
3.5.91
|
||||
======
|
||||
* Improve modal dialog styling of network secret prompts [Jasper; #682412]
|
||||
* Fix visibility of non-active workspaces during overview transition
|
||||
[Florian; #682002]
|
||||
* Improve scrollbar theming [Cosimo; #682476]
|
||||
* Make sure the app menu remains hidden in locked state [Florian; #682475]
|
||||
* Add tooltip to show-applications icon [Jasper; #682445]
|
||||
* Do not add duplicate remote search providers [Florian; #682470]
|
||||
* Handle 'popup-menu' signal on summary items [Florian; #682486]
|
||||
* Fix dwelling during mouse-down [Owen; #682385]
|
||||
* Set label actor for endSessionDialog.ListItem [Alejandro; #677503]
|
||||
* Don't match on comments when searching applications [Florian; #682529]
|
||||
* Make workspace selector more similar to the mockup [Stefano; #662087]
|
||||
* Fix extension installation and reloading [Jasper; #682578]
|
||||
* Hide removable devices in the lock screen [Giovanni; #681143]
|
||||
* Reset cancellable after hitting Escape on login screen [Alban; #681537]
|
||||
* Fix suspend from the user menu [Giovanni; #682746]
|
||||
* Set label actor for summary items in message tray [Alejandro; #677229]
|
||||
* Set label for the "Show applications" dash button [Alejandro; #682366]
|
||||
* Load extensions as late as possible [Jasper; #682822]
|
||||
* Improve mount operation dialogs [Jon; #682645]
|
||||
* Remove "Connect to ..." item from places search [Florian; #682817]
|
||||
* Don't auto-expand notifications with actions [Giovanni; #682738]
|
||||
* Add a new lock screen menu to combine volume network and power
|
||||
[Giovanni; #682540]
|
||||
* Add support for pre-edit to StIMText [Daiki; #664041]
|
||||
* Remove StIconType [Jasper, Florian, Rui, Giovanni, Debarshi; #682540]
|
||||
* Use monitor geometry for dwelling [Florian; #683044]
|
||||
* Add support for surrounding-text to StIMText [Daiki; #683015]
|
||||
* Improve the placement and style of the "No results" text [Jasper; #683135]
|
||||
* Remove broken network device activation policy [Giovanni; #683136]
|
||||
* Hide power status icon when no battery is present [Tim; #683080]
|
||||
* Ensure summary items are square and have spacing [Debarshi; #682248]
|
||||
* Fix close buttons overlapping screen edge [Debarshi; #682343]
|
||||
* Escape the tray when a legacy icon is clicked [Giovanni; #682244]
|
||||
* Update arrow in the screen shield to match latest mockups [Giovanni; #682285]
|
||||
* Allow lifting the screen shield with the mouse wheel [Giovanni; #683164]
|
||||
* Make sure to show the app menu after unlocking the screen [Jasper; #683154]
|
||||
* Misc bug fixes and cleanups [Debarshi, Florian, Giovanni, Jasper, Rui;
|
||||
#582650, #667439, #682238, #682268, #682429, #682455, #682544, #682546,
|
||||
#682683, #682710, #682998, #683073, #683137, #683156]
|
||||
|
||||
Contributors:
|
||||
Alban Browaeys, Giovanni Campagna, Cosimo Cecchi, Stefano Facchini,
|
||||
Adel Gadllah, Tim Lunn, Rui Matos, William Jon McCann, Florian Müllner,
|
||||
Alejandro Piñeiro, Debarshi Ray, Jasper St. Pierre, Owen Taylor, Daiki Ueno
|
||||
|
||||
Translations:
|
||||
Piotr Drąg [pl], Takayuki KUSANO [ja], Kjartan Maraas [nb],
|
||||
Aurimas Černius [lt], Daniel Mustieles [es], Yuri Myasoedov [ru],
|
||||
Khaled Hosny [ar], Yaron Shahrabani [he], Tom Tryfonidis [el],
|
||||
Nilamdyuti Goswami [as], Fran Diéguez [gl], Nguyễn Thái Ngọc Duy [vi],
|
||||
A S Alam [pa], Dr.T.Vasudevan [ta], Luca Ferretti [it]
|
||||
|
||||
3.5.90
|
||||
======
|
||||
* Use symbolic icons for workspace switch OSD [Jon; #680738]
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
AC_PREREQ(2.63)
|
||||
AC_INIT([gnome-shell],[3.5.90],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
|
||||
AC_INIT([gnome-shell],[3.5.91],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
|
||||
|
||||
AC_CONFIG_HEADERS([config.h])
|
||||
AC_CONFIG_SRCDIR([src/shell-global.c])
|
||||
@@ -63,7 +63,7 @@ AM_CONDITIONAL(BUILD_RECORDER, $build_recorder)
|
||||
CLUTTER_MIN_VERSION=1.11.11
|
||||
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
|
||||
GJS_MIN_VERSION=1.33.2
|
||||
MUTTER_MIN_VERSION=3.5.90
|
||||
MUTTER_MIN_VERSION=3.5.91
|
||||
GTK_MIN_VERSION=3.3.9
|
||||
GIO_MIN_VERSION=2.31.6
|
||||
LIBECAL_MIN_VERSION=3.5.3
|
||||
|
||||
@@ -80,25 +80,25 @@ StScrollBar StBin#trough {
|
||||
}
|
||||
|
||||
StScrollBar StButton#vhandle {
|
||||
background-color: #959797;
|
||||
background-color: #5d6464;
|
||||
border: 2px solid #242424;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
StScrollBar StButton#hhandle {
|
||||
background-color: #959797;
|
||||
background-color: #5d6464;
|
||||
border: 2px solid #242424;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
StScrollBar StButton#hhandle:hover,
|
||||
StScrollBar StButton#vhandle:hover {
|
||||
background-color: #c2c3c3;
|
||||
background-color: #777d7c;
|
||||
}
|
||||
|
||||
StScrollBar StButton#hhandle:active,
|
||||
StScrollBar StButton#vhandle:active {
|
||||
background-color: #729fcf;
|
||||
background-color: #3465a4;
|
||||
}
|
||||
|
||||
/* Check Boxes */
|
||||
@@ -502,7 +502,7 @@ StButton.popup-menu-item:insensitive {
|
||||
-boxpointer-gap: 4px
|
||||
}
|
||||
|
||||
#networkMenu {
|
||||
.panel-status-button-box {
|
||||
spacing: 4px;
|
||||
}
|
||||
|
||||
@@ -578,22 +578,24 @@ StButton.popup-menu-item:insensitive {
|
||||
border-right: 0px;
|
||||
border-radius: 9px 0px 0px 9px;
|
||||
background-color: rgba(0, 0, 0, 0.5);
|
||||
padding: 8px;
|
||||
padding: 11px 7px 11px 11px;
|
||||
}
|
||||
|
||||
.workspace-thumbnails-background:rtl {
|
||||
border-right: 1px;
|
||||
border-left: 0px;
|
||||
border-radius: 0px 9px 9px 0px;
|
||||
padding: 11px 11px 11px 7px;
|
||||
}
|
||||
|
||||
.workspace-thumbnails {
|
||||
spacing: 7px;
|
||||
spacing: 11px;
|
||||
}
|
||||
|
||||
.workspace-thumbnail-indicator {
|
||||
outline: 2px solid white;
|
||||
border: 1px solid #888;
|
||||
border: 4px solid rgba(255,255,255,0.7);
|
||||
border-radius: 4px;
|
||||
padding: 1px;
|
||||
}
|
||||
|
||||
.window-caption {
|
||||
@@ -693,7 +695,6 @@ StButton.popup-menu-item:insensitive {
|
||||
padding-left: 20px;
|
||||
}
|
||||
|
||||
.search-statustext,
|
||||
.search-section-header {
|
||||
padding: 4px 12px;
|
||||
spacing: 4px;
|
||||
@@ -701,6 +702,12 @@ StButton.popup-menu-item:insensitive {
|
||||
font-size: .8em;
|
||||
}
|
||||
|
||||
.search-statustext {
|
||||
color: #efefef;
|
||||
font-size: 2em;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.search-section-results {
|
||||
padding: 6px;
|
||||
}
|
||||
@@ -1208,6 +1215,13 @@ StButton.popup-menu-item:insensitive {
|
||||
padding-bottom: 8px;
|
||||
}
|
||||
|
||||
.notification-unexpanded {
|
||||
/* We want to force the actor at a specific size, irrespective
|
||||
of its minimum and preferred size, so we override both */
|
||||
min-height: 36px;
|
||||
height: 36px;
|
||||
}
|
||||
|
||||
/* We use row-span = 2 for the image cell, which prevents its height preferences to be
|
||||
taken into account during allocation, so its height ends up being limited by the height
|
||||
of the content in the other rows. To avoid showing a stretched image, we set the minimum
|
||||
@@ -1403,12 +1417,9 @@ StButton.popup-menu-item:insensitive {
|
||||
}
|
||||
|
||||
#summary-mode {
|
||||
padding: 2px 0px 0px 4px;
|
||||
height: 72px;
|
||||
}
|
||||
|
||||
#summary-mode:rtl {
|
||||
padding: 2px 4px 0px 0px;
|
||||
padding: 0px 6px 0px 6px; /* same as the values in .summary-source */
|
||||
height: 60px;
|
||||
spacing: 10px;
|
||||
}
|
||||
|
||||
.summary-source-button {
|
||||
@@ -1672,6 +1683,7 @@ StButton.popup-menu-item:insensitive {
|
||||
border-radius: 5px;
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
background-size: contain;
|
||||
}
|
||||
|
||||
.end-session-dialog-shutdown-icon {
|
||||
@@ -1832,6 +1844,7 @@ StButton.popup-menu-item:insensitive {
|
||||
|
||||
.prompt-dialog-password-box {
|
||||
spacing: 1em;
|
||||
padding-bottom: 1em;
|
||||
}
|
||||
|
||||
.prompt-dialog-error-label {
|
||||
@@ -1870,10 +1883,19 @@ StButton.popup-menu-item:insensitive {
|
||||
color: #ff0000;
|
||||
}
|
||||
|
||||
.polkit-dialog-user-icon {
|
||||
border: 2px solid #8b8b8b;
|
||||
border-radius: 5px;
|
||||
background-size: contain;
|
||||
width: 48px;
|
||||
height: 48px;
|
||||
}
|
||||
|
||||
/* Network Agent Dialog */
|
||||
|
||||
.network-dialog-secret-table {
|
||||
spacing-rows: 15px;
|
||||
spacing-columns: 1em;
|
||||
}
|
||||
|
||||
.keyring-dialog-control-table {
|
||||
@@ -2178,10 +2200,16 @@ StButton.popup-menu-item:insensitive {
|
||||
background-repeat: repeat;
|
||||
}
|
||||
|
||||
#lockScreenGroup .arrow {
|
||||
color: #333333;
|
||||
width: 100px;
|
||||
height: 50px;
|
||||
.screen-shield-arrows {
|
||||
padding-bottom: 3em;
|
||||
}
|
||||
|
||||
.screen-shield-arrows Gjs_Arrow {
|
||||
color: white;
|
||||
width: 80px;
|
||||
height: 48px;
|
||||
-arrow-thickness: 12px;
|
||||
-arrow-shadow: 0 1px 1px rgba(0,0,0,0.4);
|
||||
}
|
||||
|
||||
.screen-shield-clock {
|
||||
|
||||
@@ -85,6 +85,7 @@ nobase_dist_js_DATA = \
|
||||
ui/shellDBus.js \
|
||||
ui/status/accessibility.js \
|
||||
ui/status/keyboard.js \
|
||||
ui/status/lockScreenMenu.js \
|
||||
ui/status/network.js \
|
||||
ui/status/power.js \
|
||||
ui/status/volume.js \
|
||||
|
||||
@@ -39,6 +39,7 @@ const Lightbox = imports.ui.lightbox;
|
||||
const Main = imports.ui.main;
|
||||
const ModalDialog = imports.ui.modalDialog;
|
||||
const Tweener = imports.ui.tweener;
|
||||
const UserMenu = imports.ui.userMenu;
|
||||
|
||||
const _RESIZE_ANIMATION_TIME = 0.25;
|
||||
const _SCROLL_ANIMATION_TIME = 0.5;
|
||||
@@ -96,14 +97,14 @@ const UserListItem = new Lang.Class({
|
||||
x_align: St.Align.START,
|
||||
x_fill: true });
|
||||
|
||||
this._iconBin = new St.Bin();
|
||||
layout.add(this._iconBin);
|
||||
this._userAvatar = new UserMenu.UserAvatarWidget(this.user,
|
||||
{ styleClass: 'login-dialog-user-list-item-icon' });
|
||||
layout.add(this._userAvatar.actor);
|
||||
let textLayout = new St.BoxLayout({ style_class: 'login-dialog-user-list-item-text-box',
|
||||
vertical: true });
|
||||
layout.add(textLayout, { expand: true });
|
||||
|
||||
this._nameLabel = new St.Label({ text: this.user.get_real_name(),
|
||||
style_class: 'login-dialog-user-list-item-name' });
|
||||
this._nameLabel = new St.Label({ style_class: 'login-dialog-user-list-item-name' });
|
||||
textLayout.add(this._nameLabel,
|
||||
{ y_fill: false,
|
||||
y_align: St.Align.MIDDLE,
|
||||
@@ -117,63 +118,16 @@ const UserListItem = new Lang.Class({
|
||||
y_fill: false,
|
||||
y_align: St.Align.END });
|
||||
|
||||
this._updateIcon();
|
||||
this._updateLoggedIn();
|
||||
|
||||
this.actor.connect('clicked', Lang.bind(this, this._onClicked));
|
||||
this._onUserChanged();
|
||||
},
|
||||
|
||||
_onUserChanged: function() {
|
||||
this._nameLabel.set_text(this.user.get_real_name());
|
||||
this._updateIcon();
|
||||
this._userAvatar.update();
|
||||
this._updateLoggedIn();
|
||||
},
|
||||
|
||||
_setIconFromFile: function(iconFile, styleClass) {
|
||||
if (styleClass)
|
||||
this._iconBin.set_style_class_name(styleClass);
|
||||
this._iconBin.set_style(null);
|
||||
|
||||
this._iconBin.child = null;
|
||||
if (iconFile) {
|
||||
this._iconBin.show();
|
||||
// We use background-image instead of, say, St.TextureCache
|
||||
// so the theme writers can add a rounded frame around the image
|
||||
// and so theme writers can pick the icon size.
|
||||
this._iconBin.set_style('background-image: url("' + iconFile + '");' +
|
||||
'background-size: contain;');
|
||||
} else {
|
||||
this._iconBin.hide();
|
||||
}
|
||||
},
|
||||
|
||||
_setIconFromName: function(iconName, styleClass) {
|
||||
if (styleClass)
|
||||
this._iconBin.set_style_class_name(styleClass);
|
||||
this._iconBin.set_style(null);
|
||||
|
||||
if (iconName != null) {
|
||||
let icon = new St.Icon();
|
||||
icon.set_icon_name(iconName)
|
||||
|
||||
this._iconBin.child = icon;
|
||||
this._iconBin.show();
|
||||
} else {
|
||||
this._iconBin.child = null;
|
||||
this._iconBin.hide();
|
||||
}
|
||||
},
|
||||
|
||||
_updateIcon: function() {
|
||||
let iconFileName = this.user.get_icon_file();
|
||||
let gicon = null;
|
||||
|
||||
if (GLib.file_test(iconFileName, GLib.FileTest.EXISTS))
|
||||
this._setIconFromFile(iconFileName, 'login-dialog-user-list-item-icon');
|
||||
else
|
||||
this._setIconFromName('avatar-default', 'login-dialog-user-list-item-icon');
|
||||
},
|
||||
|
||||
syncStyleClasses: function() {
|
||||
this._updateLoggedIn();
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ const PowerMenuButton = new Lang.Class({
|
||||
Extends: PanelMenu.SystemStatusButton,
|
||||
|
||||
_init: function() {
|
||||
this.parent('system-shutdown', null);
|
||||
this.parent('system-shutdown-symbolic', null);
|
||||
this._upClient = new UPowerGlib.Client();
|
||||
|
||||
this._loginManager = LoginManager.getLoginManager();
|
||||
|
||||
@@ -79,18 +79,17 @@ const ShellUserVerifier = new Lang.Class({
|
||||
|
||||
this._settings = new Gio.Settings({ schema: LOGIN_SCREEN_SCHEMA });
|
||||
|
||||
this._cancellable = new Gio.Cancellable();
|
||||
|
||||
this._fprintManager = new Fprint.FprintManager();
|
||||
this._checkForFingerprintReader();
|
||||
|
||||
this._realmManager = new Realmd.Manager();
|
||||
},
|
||||
|
||||
begin: function(userName, hold) {
|
||||
this._cancellable = new Gio.Cancellable();
|
||||
this._hold = hold;
|
||||
this._userName = userName;
|
||||
|
||||
this._checkForFingerprintReader();
|
||||
|
||||
if (userName) {
|
||||
// If possible, reauthenticate an already running session,
|
||||
// so any session specific credentials get updated appropriately
|
||||
@@ -102,14 +101,18 @@ const ShellUserVerifier = new Lang.Class({
|
||||
},
|
||||
|
||||
cancel: function() {
|
||||
this._cancellable.cancel();
|
||||
if (this._cancellable)
|
||||
this._cancellable.cancel();
|
||||
|
||||
if (this._userVerifier)
|
||||
this._userVerifier.call_cancel_sync(null);
|
||||
},
|
||||
|
||||
clear: function() {
|
||||
this._cancellable.cancel();
|
||||
if (this._cancellable) {
|
||||
this._cancellable.cancel();
|
||||
this._cancellable = null;
|
||||
}
|
||||
|
||||
if (this._userVerifier) {
|
||||
this._userVerifier.run_dispose();
|
||||
@@ -143,11 +146,12 @@ const ShellUserVerifier = new Lang.Class({
|
||||
this._hold.release();
|
||||
} catch (e) {
|
||||
if (this._reauthOnly) {
|
||||
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
|
||||
return;
|
||||
|
||||
logError(e, 'Failed to open reauthentication channel');
|
||||
|
||||
this._hold.release();
|
||||
this.emit('verification-failed');
|
||||
|
||||
this._hold.release();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -158,10 +162,14 @@ const ShellUserVerifier = new Lang.Class({
|
||||
},
|
||||
|
||||
_userVerifierGot: function(client, result) {
|
||||
this._userVerifier = client.get_user_verifier_finish(result);
|
||||
try {
|
||||
this._userVerifier = client.get_user_verifier_finish(result);
|
||||
} catch(e if e.matches(Gio.IOErrorEnum, Gio.ErrorEnum.CANCELLED)) {
|
||||
return;
|
||||
}
|
||||
|
||||
this._connectSignals();
|
||||
this._beginVerification();
|
||||
|
||||
this._hold.release();
|
||||
},
|
||||
|
||||
@@ -183,7 +191,12 @@ const ShellUserVerifier = new Lang.Class({
|
||||
this._userName,
|
||||
this._cancellable,
|
||||
Lang.bind(this, function(obj, result) {
|
||||
obj.call_begin_verification_for_user_finish(result);
|
||||
try {
|
||||
obj.call_begin_verification_for_user_finish(result);
|
||||
} catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) {
|
||||
return;
|
||||
}
|
||||
|
||||
this._hold.release();
|
||||
}));
|
||||
|
||||
@@ -194,7 +207,12 @@ const ShellUserVerifier = new Lang.Class({
|
||||
this._userName,
|
||||
this._cancellable,
|
||||
Lang.bind(this, function(obj, result) {
|
||||
obj.call_begin_verification_for_user_finish(result);
|
||||
try {
|
||||
obj.call_begin_verification_for_user_finish(result);
|
||||
} catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) {
|
||||
return;
|
||||
}
|
||||
|
||||
this._hold.release();
|
||||
}));
|
||||
}
|
||||
@@ -202,7 +220,12 @@ const ShellUserVerifier = new Lang.Class({
|
||||
this._userVerifier.call_begin_verification(PASSWORD_SERVICE_NAME,
|
||||
this._cancellable,
|
||||
Lang.bind(this, function(obj, result) {
|
||||
obj.call_begin_verification_finish(result);
|
||||
try {
|
||||
obj.call_begin_verification_finish(result);
|
||||
} catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) {
|
||||
return;
|
||||
}
|
||||
|
||||
this._hold.release();
|
||||
}));
|
||||
}
|
||||
@@ -270,8 +293,6 @@ const ShellUserVerifier = new Lang.Class({
|
||||
this._userVerifier.run_dispose();
|
||||
this._userVerifier = null;
|
||||
|
||||
this._checkForFingerprintReader();
|
||||
|
||||
this.emit('reset');
|
||||
},
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ const Lang = imports.lang;
|
||||
const Gio = imports.gi.Gio;
|
||||
const St = imports.gi.St;
|
||||
|
||||
const LoginManager = imports.misc.loginManager;
|
||||
const Main = imports.ui.main;
|
||||
const MessageTray = imports.ui.messageTray;
|
||||
const ShellMountOperation = imports.ui.shellMountOperation;
|
||||
@@ -142,6 +143,8 @@ const AutorunManager = new Lang.Class({
|
||||
Name: 'AutorunManager',
|
||||
|
||||
_init: function() {
|
||||
this._loginManager = LoginManager.getLoginManager();
|
||||
|
||||
this._volumeMonitor = Gio.VolumeMonitor.get();
|
||||
|
||||
this._volumeMonitor.connect('mount-added',
|
||||
@@ -176,7 +179,7 @@ const AutorunManager = new Lang.Class({
|
||||
_onMountAdded: function(monitor, mount) {
|
||||
// don't do anything if our session is not the currently
|
||||
// active one
|
||||
if (!Main.automountManager.isSessionActive())
|
||||
if (!this._loginManager.sessionActive)
|
||||
return;
|
||||
|
||||
let discoverer = new ContentTypeDiscoverer(Lang.bind (this,
|
||||
@@ -258,7 +261,8 @@ const AutorunResidentSource = new Lang.Class({
|
||||
Extends: MessageTray.Source,
|
||||
|
||||
_init: function() {
|
||||
this.parent(_("Removable Devices"), 'media-removable', St.IconType.FULLCOLOR);
|
||||
this.parent(_("Removable Devices"), 'media-removable');
|
||||
this.showInLockScreen = false;
|
||||
|
||||
this._mounts = [];
|
||||
|
||||
|
||||
@@ -410,6 +410,7 @@ const BoxPointer = new Lang.Class({
|
||||
|
||||
let themeNode = this.actor.get_theme_node();
|
||||
let gap = themeNode.get_length('-boxpointer-gap');
|
||||
let padding = themeNode.get_length('-arrow-rise');
|
||||
|
||||
let resX, resY;
|
||||
|
||||
@@ -435,8 +436,8 @@ const BoxPointer = new Lang.Class({
|
||||
case St.Side.BOTTOM:
|
||||
resX = sourceCenterX - (halfMargin + (natWidth - margin) * alignment);
|
||||
|
||||
resX = Math.max(resX, monitor.x + 10);
|
||||
resX = Math.min(resX, monitor.x + monitor.width - (10 + natWidth));
|
||||
resX = Math.max(resX, monitor.x + padding);
|
||||
resX = Math.min(resX, monitor.x + monitor.width - (padding + natWidth));
|
||||
this.setArrowOrigin(sourceCenterX - resX);
|
||||
break;
|
||||
|
||||
@@ -444,8 +445,8 @@ const BoxPointer = new Lang.Class({
|
||||
case St.Side.RIGHT:
|
||||
resY = sourceCenterY - (halfMargin + (natHeight - margin) * alignment);
|
||||
|
||||
resY = Math.max(resY, monitor.y + 10);
|
||||
resY = Math.min(resY, monitor.y + monitor.height - (10 + natHeight));
|
||||
resY = Math.max(resY, monitor.y + padding);
|
||||
resY = Math.min(resY, monitor.y + monitor.height - (padding + natHeight));
|
||||
|
||||
this.setArrowOrigin(sourceCenterY - resY);
|
||||
break;
|
||||
|
||||
@@ -204,12 +204,11 @@ const CalendarServerInfo = Gio.DBusInterfaceInfo.new_for_xml(CalendarServerIfac
|
||||
|
||||
function CalendarServer() {
|
||||
var self = new Gio.DBusProxy({ g_connection: Gio.DBus.session,
|
||||
g_interface_name: CalendarServerInfo.name,
|
||||
g_interface_info: CalendarServerInfo,
|
||||
g_name: 'org.gnome.Shell.CalendarServer',
|
||||
g_object_path: '/org/gnome/Shell/CalendarServer',
|
||||
g_flags: (Gio.DBusProxyFlags.DO_NOT_AUTO_START |
|
||||
Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES) });
|
||||
g_interface_name: CalendarServerInfo.name,
|
||||
g_interface_info: CalendarServerInfo,
|
||||
g_name: 'org.gnome.Shell.CalendarServer',
|
||||
g_object_path: '/org/gnome/Shell/CalendarServer',
|
||||
g_flags: Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES });
|
||||
|
||||
self.init(null);
|
||||
return self;
|
||||
|
||||
@@ -318,7 +318,6 @@ const CtrlAltTabSwitcher = new Lang.Class({
|
||||
let icon = item.iconActor;
|
||||
if (!icon) {
|
||||
icon = new St.Icon({ icon_name: item.iconName,
|
||||
icon_type: St.IconType.SYMBOLIC,
|
||||
icon_size: POPUP_APPICON_SIZE });
|
||||
}
|
||||
box.add(icon, { x_fill: false, y_fill: false } );
|
||||
|
||||
@@ -124,15 +124,19 @@ const DashItemContainer = new Lang.Class({
|
||||
},
|
||||
|
||||
setLabelText: function(text) {
|
||||
if (this.label == null)
|
||||
if (this.label == null) {
|
||||
this.label = new St.Label({ style_class: 'dash-label'});
|
||||
Main.layoutManager.addChrome(this.label);
|
||||
this.label.hide();
|
||||
}
|
||||
|
||||
this.label.set_text(text);
|
||||
Main.layoutManager.addChrome(this.label);
|
||||
this.label.hide();
|
||||
},
|
||||
|
||||
hideLabel: function () {
|
||||
if (this.label == null)
|
||||
return;
|
||||
|
||||
Tweener.addTween(this.label,
|
||||
{ opacity: 0,
|
||||
time: DASH_ITEM_LABEL_HIDE_TIME,
|
||||
@@ -246,14 +250,15 @@ const ShowAppsIcon = new Lang.Class({
|
||||
this.toggleButton._delegate = this;
|
||||
|
||||
this.setChild(this.toggleButton);
|
||||
this.setHover(false);
|
||||
this.toggleButton.label_actor = this.label;
|
||||
},
|
||||
|
||||
_createIcon: function(size) {
|
||||
this._iconActor = new St.Icon({ icon_name: 'view-grid-symbolic',
|
||||
icon_size: size,
|
||||
style_class: 'show-apps-icon',
|
||||
track_hover: true,
|
||||
icon_type: St.IconType.SYMBOLIC,
|
||||
icon_size: size });
|
||||
track_hover: true });
|
||||
return this._iconActor;
|
||||
},
|
||||
|
||||
@@ -261,6 +266,11 @@ const ShowAppsIcon = new Lang.Class({
|
||||
this.toggleButton.set_hover(hovered);
|
||||
if (this._iconActor)
|
||||
this._iconActor.set_hover(hovered);
|
||||
|
||||
if (hovered)
|
||||
this.setLabelText(_("Remove from Favorites"));
|
||||
else
|
||||
this.setLabelText(_("Show Applications"));
|
||||
},
|
||||
|
||||
// Rely on the dragged item being a favorite
|
||||
@@ -326,6 +336,7 @@ const Dash = new Lang.Class({
|
||||
|
||||
this._showAppsIcon = new ShowAppsIcon();
|
||||
this._showAppsIcon.icon.setIconSize(this.iconSize);
|
||||
this._hookUpLabel(this._showAppsIcon);
|
||||
|
||||
this.showAppsButton = this._showAppsIcon.toggleButton;
|
||||
|
||||
@@ -424,6 +435,17 @@ const Dash = new Lang.Class({
|
||||
Main.queueDeferredWork(this._workId);
|
||||
},
|
||||
|
||||
_hookUpLabel: function(item) {
|
||||
item.child.connect('notify::hover', Lang.bind(this, function() {
|
||||
this._onHover(item);
|
||||
}));
|
||||
|
||||
Main.overview.connect('hiding', Lang.bind(this, function() {
|
||||
this._labelShowing = false;
|
||||
item.hideLabel();
|
||||
}));
|
||||
},
|
||||
|
||||
_createAppItem: function(app) {
|
||||
let display = new AppDisplay.AppWellIcon(app,
|
||||
{ setSizeManually: true,
|
||||
@@ -443,25 +465,14 @@ const Dash = new Lang.Class({
|
||||
item.setLabelText(app.get_name());
|
||||
// Override default AppWellIcon label_actor
|
||||
display.actor.label_actor = item.label;
|
||||
|
||||
|
||||
display.icon.setIconSize(this.iconSize);
|
||||
display.actor.connect('notify::hover',
|
||||
Lang.bind(this, function() {
|
||||
this._onHover(item, display)
|
||||
}));
|
||||
|
||||
Main.overview.connect('hiding',
|
||||
Lang.bind(this, function() {
|
||||
this._labelShowing = false;
|
||||
item.hideLabel();
|
||||
}));
|
||||
this._hookUpLabel(item);
|
||||
|
||||
return item;
|
||||
},
|
||||
|
||||
_onHover: function (item, display) {
|
||||
if (display.actor.get_hover() && !display.isMenuUp) {
|
||||
_onHover: function (item) {
|
||||
if (item.child.get_hover() && !item.child._delegate.isMenuUp) {
|
||||
if (this._showLabelTimeoutId == 0) {
|
||||
let timeout = this._labelShowing ? 0 : DASH_ITEM_HOVER_TIMEOUT;
|
||||
this._showLabelTimeoutId = Mainloop.timeout_add(timeout,
|
||||
|
||||
@@ -34,6 +34,7 @@ const GnomeSession = imports.misc.gnomeSession;
|
||||
const Main = imports.ui.main;
|
||||
const ModalDialog = imports.ui.modalDialog;
|
||||
const Tweener = imports.ui.tweener;
|
||||
const UserMenu = imports.ui.userMenu;
|
||||
|
||||
let _endSessionDialog = null;
|
||||
|
||||
@@ -89,7 +90,7 @@ const shutdownDialogContent = {
|
||||
label: C_("button", "Restart") },
|
||||
{ signal: 'ConfirmedShutdown',
|
||||
label: C_("button", "Power Off") }],
|
||||
iconName: 'system-shutdown',
|
||||
iconName: 'system-shutdown-symbolic',
|
||||
iconStyleClass: 'end-session-dialog-shutdown-icon'
|
||||
};
|
||||
|
||||
@@ -104,7 +105,7 @@ const restartDialogContent = {
|
||||
endDescription: _("Restarting the system."),
|
||||
confirmButtons: [{ signal: 'ConfirmedReboot',
|
||||
label: C_("button", "Restart") }],
|
||||
iconName: 'system-shutdown',
|
||||
iconName: 'system-shutdown-symbolic',
|
||||
iconStyleClass: 'end-session-dialog-shutdown-icon'
|
||||
};
|
||||
|
||||
@@ -160,6 +161,7 @@ const ListItem = new Lang.Class({
|
||||
|
||||
this._descriptionLabel = new St.Label({ text: this._reason,
|
||||
style_class: 'end-session-dialog-app-list-item-description' });
|
||||
this.actor.label_actor = this._nameLabel;
|
||||
textLayout.add(this._descriptionLabel,
|
||||
{ expand: true,
|
||||
x_fill: true });
|
||||
@@ -302,41 +304,6 @@ const EndSessionDialog = new Lang.Class({
|
||||
this._user.disconnect(this._userChangedId);
|
||||
},
|
||||
|
||||
_setIconFromFile: function(iconFile, styleClass) {
|
||||
if (styleClass)
|
||||
this._iconBin.set_style_class_name(styleClass);
|
||||
this._iconBin.set_style(null);
|
||||
|
||||
this._iconBin.child = null;
|
||||
if (iconFile) {
|
||||
this._iconBin.show();
|
||||
this._iconBin.set_style('background-image: url("' + iconFile + '");' +
|
||||
'background-size: contain;');
|
||||
} else {
|
||||
this._iconBin.hide();
|
||||
}
|
||||
},
|
||||
|
||||
_setIconFromName: function(iconName, styleClass) {
|
||||
if (styleClass)
|
||||
this._iconBin.set_style_class_name(styleClass);
|
||||
this._iconBin.set_style(null);
|
||||
|
||||
if (iconName != null) {
|
||||
let textureCache = St.TextureCache.get_default();
|
||||
let icon = textureCache.load_icon_name(this._iconBin.get_theme_node(),
|
||||
iconName,
|
||||
St.IconType.SYMBOLIC,
|
||||
_DIALOG_ICON_SIZE);
|
||||
|
||||
this._iconBin.child = icon;
|
||||
this._iconBin.show();
|
||||
} else {
|
||||
this._iconBin.child = null;
|
||||
this._iconBin.hide();
|
||||
}
|
||||
},
|
||||
|
||||
_updateDescription: function() {
|
||||
if (this.state != ModalDialog.State.OPENING &&
|
||||
this.state != ModalDialog.State.OPENED)
|
||||
@@ -385,16 +352,16 @@ const EndSessionDialog = new Lang.Class({
|
||||
return;
|
||||
|
||||
let dialogContent = DialogContent[this._type];
|
||||
|
||||
if (this._user.is_loaded && !dialogContent.iconName) {
|
||||
let iconFile = this._user.get_icon_file();
|
||||
if (GLib.file_test(iconFile, GLib.FileTest.EXISTS))
|
||||
this._setIconFromFile(iconFile, dialogContent.iconStyleClass);
|
||||
else
|
||||
this._setIconFromName('avatar-default', dialogContent.iconStyleClass);
|
||||
} else if (dialogContent.iconName) {
|
||||
this._setIconFromName(dialogContent.iconName,
|
||||
dialogContent.iconStyleClass);
|
||||
if (dialogContent.iconName) {
|
||||
this._iconBin.child = new St.Icon({ icon_name: dialogContent.iconName,
|
||||
icon_size: _DIALOG_ICON_SIZE,
|
||||
style_class: dialogContent.iconStyleClass });
|
||||
} else {
|
||||
let avatarWidget = new UserMenu.UserAvatarWidget(this._user,
|
||||
{ iconSize: _DIALOG_ICON_SIZE,
|
||||
styleClass: dialogContent.iconStyleClass });
|
||||
this._iconBin.child = avatarWidget.actor;
|
||||
avatarWidget.update();
|
||||
}
|
||||
|
||||
this._updateDescription();
|
||||
|
||||
@@ -60,7 +60,7 @@ function uninstallExtension(uuid) {
|
||||
if (extension.type != ExtensionUtils.ExtensionType.PER_USER)
|
||||
return false;
|
||||
|
||||
if (!ExtensionSystem.unloadExtension(uuid))
|
||||
if (!ExtensionSystem.unloadExtension(extension))
|
||||
return false;
|
||||
|
||||
FileUtils.recursivelyDeleteDir(extension.dir, true);
|
||||
@@ -82,7 +82,7 @@ function gotExtensionZipFile(session, message, uuid, dir, callback, errback) {
|
||||
}
|
||||
|
||||
let [file, stream] = Gio.File.new_tmp('XXXXXX.shell-extension.zip');
|
||||
let contents = message.response_body.flatten().as_bytes();
|
||||
let contents = message.response_body.flatten().get_as_bytes();
|
||||
stream.output_stream.write_bytes(contents, null);
|
||||
stream.close(null);
|
||||
let [success, pid] = GLib.spawn_async(null,
|
||||
@@ -124,7 +124,7 @@ function updateExtension(uuid) {
|
||||
let oldExtension = ExtensionUtils.extensions[uuid];
|
||||
let extensionDir = oldExtension.dir;
|
||||
|
||||
if (!ExtensionSystem.unloadExtension(uuid))
|
||||
if (!ExtensionSystem.unloadExtension(oldExtension))
|
||||
return;
|
||||
|
||||
FileUtils.recursivelyMoveDir(extensionDir, oldExtensionTmpDir);
|
||||
@@ -135,7 +135,7 @@ function updateExtension(uuid) {
|
||||
try {
|
||||
ExtensionSystem.loadExtension(extension);
|
||||
} catch(e) {
|
||||
ExtensionSystem.unloadExtension(uuid);
|
||||
ExtensionSystem.unloadExtension(extension);
|
||||
|
||||
logError(e, 'Error loading extension %s'.format(uuid));
|
||||
|
||||
|
||||
@@ -158,23 +158,32 @@ function loadExtension(extension) {
|
||||
_signals.emit('extension-state-changed', extension);
|
||||
}
|
||||
|
||||
function unloadExtension(uuid) {
|
||||
let extension = ExtensionUtils.extensions[uuid];
|
||||
if (!extension)
|
||||
return false;
|
||||
|
||||
function unloadExtension(extension) {
|
||||
// Try to disable it -- if it's ERROR'd, we can't guarantee that,
|
||||
// but it will be removed on next reboot, and hopefully nothing
|
||||
// broke too much.
|
||||
disableExtension(uuid);
|
||||
disableExtension(extension.uuid);
|
||||
|
||||
extension.state = ExtensionState.UNINSTALLED;
|
||||
_signals.emit('extension-state-changed', extension);
|
||||
|
||||
delete ExtensionUtils.extensions[uuid];
|
||||
delete ExtensionUtils.extensions[extension.uuid];
|
||||
return true;
|
||||
}
|
||||
|
||||
function reloadExtension(oldExtension) {
|
||||
// Grab the things we'll need to pass to createExtensionObject
|
||||
// to reload it.
|
||||
let { uuid: uuid, dir: dir, type: type } = oldExtension;
|
||||
|
||||
// Then unload the old extension.
|
||||
unloadExtension(oldExtension);
|
||||
|
||||
// Now, recreate the extension and load it.
|
||||
let newExtension = ExtensionUtils.createExtensionObject(uuid, dir, type);
|
||||
loadExtension(newExtension);
|
||||
}
|
||||
|
||||
function initExtension(uuid) {
|
||||
let extension = ExtensionUtils.extensions[uuid];
|
||||
let dir = extension.dir;
|
||||
|
||||
@@ -128,7 +128,9 @@ const GrabHelper = new Lang.Class({
|
||||
// on the owner of the GrabHelper. As long as there is at least one
|
||||
// { modal: true } actor on the grab stack, the grab will be kept.
|
||||
// When the last { modal: true } actor is ungrabbed, then the modal
|
||||
// will be dropped.
|
||||
// will be dropped. A modal grab can fail if there is already a grab
|
||||
// in effect from aother application; in this case the function returns
|
||||
// false and nothing happens. Non-modal grabs can never fail.
|
||||
//
|
||||
// If @params contains { grabFocus: true }, then if you call grab()
|
||||
// while the shell is outside the overview, it will set the stage
|
||||
@@ -151,10 +153,12 @@ const GrabHelper = new Lang.Class({
|
||||
let newFocus = params.actor;
|
||||
|
||||
if (this.isActorGrabbed(params.actor))
|
||||
return;
|
||||
return true;
|
||||
|
||||
if (this._grabFocusCount == 0 && this._modalCount == 0)
|
||||
this._fullGrab(hadFocus, params.modal, params.grabFocus);
|
||||
if (this._grabFocusCount == 0 && this._modalCount == 0) {
|
||||
if (!this._fullGrab(hadFocus, params.modal, params.grabFocus))
|
||||
return false;
|
||||
}
|
||||
|
||||
params.savedFocus = focus;
|
||||
this._grabStack.push(params);
|
||||
@@ -166,19 +170,22 @@ const GrabHelper = new Lang.Class({
|
||||
this._grabFocusCount++;
|
||||
|
||||
_navigateActor(newFocus, hadFocus);
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
_fullGrab: function(hadFocus, modal, grabFocus) {
|
||||
let metaDisplay = global.screen.get_display();
|
||||
|
||||
if (modal) {
|
||||
if (!Main.pushModal(this._owner))
|
||||
return false;
|
||||
}
|
||||
|
||||
this._grabbedFromKeynav = hadFocus;
|
||||
this._preGrabInputMode = global.stage_input_mode;
|
||||
this._prevFocusedWindow = null;
|
||||
|
||||
if (modal) {
|
||||
Main.pushModal(this._owner);
|
||||
}
|
||||
|
||||
if (grabFocus) {
|
||||
this._prevFocusedWindow = metaDisplay.focus_window;
|
||||
if (this._preGrabInputMode == Shell.StageInputMode.NONREACTIVE ||
|
||||
@@ -193,6 +200,8 @@ const GrabHelper = new Lang.Class({
|
||||
this._keyFocusNotifyId = global.stage.connect('notify::key-focus', Lang.bind(this, this._onKeyFocusChanged));
|
||||
this._focusWindowChangedId = metaDisplay.connect('notify::focus-window', Lang.bind(this, this._focusWindowChanged));
|
||||
}
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
// ignoreRelease:
|
||||
|
||||
@@ -542,7 +542,7 @@ const KeyboardSource = new Lang.Class({
|
||||
|
||||
_init: function(keyboard) {
|
||||
this._keyboard = keyboard;
|
||||
this.parent(_("Keyboard"), 'input-keyboard', St.IconType.SYMBOLIC);
|
||||
this.parent(_("Keyboard"), 'input-keyboard-symbolic');
|
||||
},
|
||||
|
||||
handleSummaryClick: function() {
|
||||
|
||||
@@ -314,7 +314,7 @@ const LayoutManager = new Lang.Class({
|
||||
|
||||
get currentMonitor() {
|
||||
let index = global.screen.get_current_monitor();
|
||||
return Main.layoutManager.monitors[index];
|
||||
return this.monitors[index];
|
||||
},
|
||||
|
||||
_startupAnimation: function() {
|
||||
|
||||
@@ -38,7 +38,6 @@ var commandHeader = 'const Clutter = imports.gi.Clutter; ' +
|
||||
/* Utility functions...we should probably be able to use these
|
||||
* in the shell core code too. */
|
||||
'const stage = global.stage; ' +
|
||||
'const color = function(pixel) { let c= new Clutter.Color(); c.from_pixel(pixel); return c; }; ' +
|
||||
/* Special lookingGlass functions */
|
||||
'const it = Main.lookingGlass.getIt(); ' +
|
||||
'const r = Lang.bind(Main.lookingGlass, Main.lookingGlass.getResult); ';
|
||||
@@ -869,7 +868,6 @@ const LookingGlass = new Lang.Class({
|
||||
let toolbar = new St.BoxLayout({ name: 'Toolbar' });
|
||||
this.actor.add_actor(toolbar);
|
||||
let inspectIcon = new St.Icon({ icon_name: 'gtk-color-picker',
|
||||
icon_type: St.IconType.FULLCOLOR,
|
||||
icon_size: 24 });
|
||||
toolbar.add_actor(inspectIcon);
|
||||
inspectIcon.reactive = true;
|
||||
|
||||
@@ -12,7 +12,7 @@ const Signals = imports.signals;
|
||||
const Main = imports.ui.main;
|
||||
const MagnifierDBus = imports.ui.magnifierDBus;
|
||||
const Params = imports.misc.params;
|
||||
|
||||
const PointerWatcher = imports.ui.pointerWatcher;
|
||||
|
||||
const MOUSE_POLL_FREQUENCY = 50;
|
||||
const CROSSHAIRS_CLIP_SIZE = [100, 100];
|
||||
@@ -56,7 +56,7 @@ const Magnifier = new Lang.Class({
|
||||
let xfixesCursor = Shell.XFixesCursor.get_for_stage(global.stage);
|
||||
this._mouseSprite = new Clutter.Texture();
|
||||
xfixesCursor.update_texture_image(this._mouseSprite);
|
||||
this._cursorRoot = new Clutter.Group();
|
||||
this._cursorRoot = new Clutter.Actor();
|
||||
this._cursorRoot.add_actor(this._mouseSprite);
|
||||
|
||||
// Create the first ZoomRegion and initialize it according to the
|
||||
@@ -136,11 +136,8 @@ const Magnifier = new Lang.Class({
|
||||
* Turn on mouse tracking, if not already doing so.
|
||||
*/
|
||||
startTrackingMouse: function() {
|
||||
if (!this._mouseTrackingId)
|
||||
this._mouseTrackingId = Mainloop.timeout_add(
|
||||
MOUSE_POLL_FREQUENCY,
|
||||
Lang.bind(this, this.scrollToMousePos)
|
||||
);
|
||||
if (!this._pointerWatch)
|
||||
this._pointerWatch = PointerWatcher.getPointerWatcher().addWatch(MOUSE_POLL_FREQUENCY, Lang.bind(this, this.scrollToMousePos));
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -148,10 +145,10 @@ const Magnifier = new Lang.Class({
|
||||
* Turn off mouse tracking, if not already doing so.
|
||||
*/
|
||||
stopTrackingMouse: function() {
|
||||
if (this._mouseTrackingId)
|
||||
Mainloop.source_remove(this._mouseTrackingId);
|
||||
if (this._pointerWatch)
|
||||
this._pointerWatch.remove();
|
||||
|
||||
this._mouseTrackingId = null;
|
||||
this._pointerWatch = null;
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -303,8 +300,7 @@ const Magnifier = new Lang.Class({
|
||||
*/
|
||||
setCrosshairsColor: function(color) {
|
||||
if (this._crossHairs) {
|
||||
let clutterColor = new Clutter.Color();
|
||||
clutterColor.from_string(color);
|
||||
let [res, clutterColor] = Clutter.Color.from_string(color);
|
||||
this._crossHairs.setColor(clutterColor);
|
||||
}
|
||||
},
|
||||
@@ -1081,21 +1077,21 @@ const ZoomRegion = new Lang.Class({
|
||||
// hide the magnified region from CLUTTER_PICK_ALL
|
||||
Shell.util_set_hidden_from_pick (this._magView, true);
|
||||
|
||||
// Append a Clutter.Group to clip the contents of the magnified view.
|
||||
let mainGroup = new Clutter.Group({ clip_to_allocation: true });
|
||||
// Add a group to clip the contents of the magnified view.
|
||||
let mainGroup = new Clutter.Actor({ clip_to_allocation: true });
|
||||
this._magView.set_child(mainGroup);
|
||||
|
||||
// Add a background for when the magnified uiGroup is scrolled
|
||||
// out of view (don't want to see desktop showing through).
|
||||
this._background = new Clutter.Rectangle({ color: Main.DEFAULT_BACKGROUND_COLOR });
|
||||
this._background = new Clutter.Actor({ background_color: Main.DEFAULT_BACKGROUND_COLOR,
|
||||
width: global.screen_width,
|
||||
height: global.screen_height });
|
||||
mainGroup.add_actor(this._background);
|
||||
|
||||
// Clone the group that contains all of UI on the screen. This is the
|
||||
// chrome, the windows, etc.
|
||||
this._uiGroupClone = new Clutter.Clone({ source: Main.uiGroup });
|
||||
mainGroup.add_actor(this._uiGroupClone);
|
||||
Main.uiGroup.set_size(global.screen_width, global.screen_height);
|
||||
this._background.set_size(global.screen_width, global.screen_height);
|
||||
|
||||
// Add either the given mouseSourceActor to the ZoomRegion, or a clone of
|
||||
// it.
|
||||
@@ -1329,7 +1325,7 @@ const ZoomRegion = new Lang.Class({
|
||||
this._mouseActor.set_scale(this._xMagFactor, this._yMagFactor);
|
||||
|
||||
let [x, y] = this._screenToViewPort(0, 0);
|
||||
this._uiGroupClone.set_position(x, y);
|
||||
this._uiGroupClone.set_position(Math.round(x), Math.round(y));
|
||||
|
||||
this._updateMousePosition();
|
||||
},
|
||||
@@ -1357,7 +1353,6 @@ const ZoomRegion = new Lang.Class({
|
||||
if (!this.isActive())
|
||||
return;
|
||||
|
||||
Main.uiGroup.set_size(global.screen_width, global.screen_height);
|
||||
this._background.set_size(global.screen_width, global.screen_height);
|
||||
|
||||
if (this._screenPosition == GDesktopEnums.MagnifierScreenPosition.NONE)
|
||||
@@ -1381,15 +1376,15 @@ const Crosshairs = new Lang.Class({
|
||||
let groupWidth = global.screen_width * 3;
|
||||
let groupHeight = global.screen_height * 3;
|
||||
|
||||
this._actor = new Clutter.Group({
|
||||
this._actor = new Clutter.Actor({
|
||||
clip_to_allocation: false,
|
||||
width: groupWidth,
|
||||
height: groupHeight
|
||||
});
|
||||
this._horizLeftHair = new Clutter.Rectangle();
|
||||
this._horizRightHair = new Clutter.Rectangle();
|
||||
this._vertTopHair = new Clutter.Rectangle();
|
||||
this._vertBottomHair = new Clutter.Rectangle();
|
||||
this._horizLeftHair = new Clutter.Actor();
|
||||
this._horizRightHair = new Clutter.Actor();
|
||||
this._vertTopHair = new Clutter.Actor();
|
||||
this._vertBottomHair = new Clutter.Actor();
|
||||
this._actor.add_actor(this._horizLeftHair);
|
||||
this._actor.add_actor(this._horizRightHair);
|
||||
this._actor.add_actor(this._vertTopHair);
|
||||
@@ -1460,10 +1455,10 @@ const Crosshairs = new Lang.Class({
|
||||
* @clutterColor: The color as a Clutter.Color.
|
||||
*/
|
||||
setColor: function(clutterColor) {
|
||||
this._horizLeftHair.set_color(clutterColor);
|
||||
this._horizRightHair.set_color(clutterColor);
|
||||
this._vertTopHair.set_color(clutterColor);
|
||||
this._vertBottomHair.set_color(clutterColor);
|
||||
this._horizLeftHair.background_color = clutterColor;
|
||||
this._horizRightHair.background_color = clutterColor;
|
||||
this._vertTopHair.background_color = clutterColor;
|
||||
this._vertBottomHair.background_color = clutterColor;
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -1472,9 +1467,7 @@ const Crosshairs = new Lang.Class({
|
||||
* @color: The color as a Clutter.Color.
|
||||
*/
|
||||
getColor: function() {
|
||||
let clutterColor = new Clutter.Color();
|
||||
this._horizLeftHair.get_color(clutterColor);
|
||||
return clutterColor;
|
||||
return this._horizLeftHair.get_color();
|
||||
},
|
||||
|
||||
/**
|
||||
|
||||
@@ -43,13 +43,11 @@ const XdndHandler = imports.ui.xdndHandler;
|
||||
const Util = imports.misc.util;
|
||||
|
||||
const OVERRIDES_SCHEMA = 'org.gnome.shell.overrides';
|
||||
const DEFAULT_BACKGROUND_COLOR = new Clutter.Color();
|
||||
DEFAULT_BACKGROUND_COLOR.from_pixel(0x2266bbff);
|
||||
const DEFAULT_BACKGROUND_COLOR = Clutter.Color.from_pixel(0x2266bbff);
|
||||
|
||||
let automountManager = null;
|
||||
let autorunManager = null;
|
||||
let panel = null;
|
||||
let hotCorners = [];
|
||||
let overview = null;
|
||||
let runDialog = null;
|
||||
let lookingGlass = null;
|
||||
@@ -81,10 +79,6 @@ let _overridesSettings = null;
|
||||
let background = null;
|
||||
|
||||
function createUserSession() {
|
||||
// Load the calendar server. Note that we are careful about
|
||||
// not loading any events until the user presses the clock
|
||||
global.launch_calendar_server();
|
||||
|
||||
telepathyClient = new TelepathyClient.Client();
|
||||
automountManager = new AutomountManager.AutomountManager();
|
||||
autorunManager = new AutorunManager.AutorunManager();
|
||||
@@ -223,8 +217,7 @@ function start() {
|
||||
|
||||
sessionMode.createSession();
|
||||
|
||||
panel.startStatusArea();
|
||||
|
||||
panel.init();
|
||||
layoutManager.init();
|
||||
keyboard.init();
|
||||
overview.init();
|
||||
@@ -233,11 +226,6 @@ function start() {
|
||||
global.screen.override_workspace_layout(Meta.ScreenCorner.TOPLEFT,
|
||||
false, -1, 1);
|
||||
|
||||
if (sessionMode.allowExtensions) {
|
||||
ExtensionDownloader.init();
|
||||
ExtensionSystem.loadExtensions();
|
||||
}
|
||||
|
||||
if (sessionMode.hasRunDialog) {
|
||||
Meta.keybindings_set_custom_handler('panel-run-dialog', function() {
|
||||
getRunDialog().open();
|
||||
@@ -286,6 +274,11 @@ function start() {
|
||||
global.screen.connect('restacked', _windowsRestacked);
|
||||
|
||||
_nWorkspacesChanged();
|
||||
|
||||
if (sessionMode.allowExtensions) {
|
||||
ExtensionDownloader.init();
|
||||
ExtensionSystem.loadExtensions();
|
||||
}
|
||||
}
|
||||
|
||||
let _workspaces = [];
|
||||
@@ -509,9 +502,6 @@ function loadTheme() {
|
||||
|
||||
let theme = new St.Theme ({ application_stylesheet: cssStylesheet });
|
||||
|
||||
if (sessionMode.extraStylesheet)
|
||||
theme.load_stylesheet(sessionMode.extraStylesheet);
|
||||
|
||||
if (previousTheme) {
|
||||
let customStylesheets = previousTheme.get_custom_stylesheets();
|
||||
|
||||
|
||||
@@ -337,6 +337,7 @@ const Notification = new Lang.Class({
|
||||
}));
|
||||
|
||||
this.actor = new St.Button({ accessible_role: Atk.Role.NOTIFICATION });
|
||||
this.actor.add_style_class_name('notification-unexpanded');
|
||||
this.actor._delegate = this;
|
||||
this.actor.connect('clicked', Lang.bind(this, this._onClicked));
|
||||
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
||||
@@ -852,6 +853,8 @@ const Notification = new Lang.Class({
|
||||
|
||||
expand: function(animate) {
|
||||
this.expanded = true;
|
||||
this.actor.remove_style_class_name('notification-unexpanded');
|
||||
|
||||
// The banner is never shown when the title did not fit, so this
|
||||
// can be an if-else statement.
|
||||
if (!this._titleFitsInBannerMode) {
|
||||
@@ -889,6 +892,8 @@ const Notification = new Lang.Class({
|
||||
// Restore banner opacity in case the notification is shown in the
|
||||
// banner mode again on update.
|
||||
this._bannerLabel.opacity = 255;
|
||||
// Restore height requisition
|
||||
this.actor.add_style_class_name('notification-unexpanded');
|
||||
this.emit('collapsed');
|
||||
},
|
||||
|
||||
@@ -1029,14 +1034,14 @@ const Source = new Lang.Class({
|
||||
|
||||
SOURCE_ICON_SIZE: 48,
|
||||
|
||||
_init: function(title, iconName, iconType) {
|
||||
_init: function(title, iconName) {
|
||||
this.title = title;
|
||||
this.iconName = iconName;
|
||||
this.iconType = iconType;
|
||||
|
||||
this.isTransient = false;
|
||||
this.isChat = false;
|
||||
this.isMuted = false;
|
||||
this.showInLockScreen = true;
|
||||
|
||||
this.notifications = [];
|
||||
},
|
||||
@@ -1078,7 +1083,6 @@ const Source = new Lang.Class({
|
||||
// something more fancy.
|
||||
createIcon: function(size) {
|
||||
return new St.Icon({ icon_name: this.iconName,
|
||||
icon_type: this.iconType,
|
||||
icon_size: size });
|
||||
},
|
||||
|
||||
@@ -1185,7 +1189,7 @@ const SummaryItem = new Lang.Class({
|
||||
button_mask: St.ButtonMask.ONE | St.ButtonMask.TWO | St.ButtonMask.THREE,
|
||||
can_focus: true,
|
||||
track_hover: true });
|
||||
|
||||
this.actor.label_actor = new St.Label({ text: source.title });
|
||||
this._sourceBox = new St.BoxLayout({ style_class: 'summary-source' });
|
||||
|
||||
this._sourceIcon = source.getSummaryIcon();
|
||||
@@ -1254,6 +1258,14 @@ const SummaryItem = new Lang.Class({
|
||||
global.focus_manager.add_group(this.rightClickMenu);
|
||||
},
|
||||
|
||||
get closeButtonVisible() {
|
||||
return this._closeButton.visible;
|
||||
},
|
||||
|
||||
set closeButtonVisible(v) {
|
||||
this._closeButton.visible = v;
|
||||
},
|
||||
|
||||
prepareNotificationStackForShowing: function() {
|
||||
if (this.notificationStack.get_n_children() > 0)
|
||||
return;
|
||||
@@ -1262,7 +1274,6 @@ const SummaryItem = new Lang.Class({
|
||||
this._appendNotificationToStack(this.source.notifications[i]);
|
||||
}
|
||||
|
||||
this.notificationStackWidget.width = this.notificationStackView.width;
|
||||
this.scrollTo(St.Side.BOTTOM);
|
||||
},
|
||||
|
||||
@@ -1357,6 +1368,7 @@ const MessageTray = new Lang.Class({
|
||||
}));
|
||||
|
||||
this.actor = new St.Widget({ name: 'message-tray',
|
||||
layout_manager: new Clutter.BinLayout(),
|
||||
reactive: true,
|
||||
track_hover: true });
|
||||
this.actor.connect('style-changed', Lang.bind(this, this._onStyleChanged));
|
||||
@@ -1374,6 +1386,7 @@ const MessageTray = new Lang.Class({
|
||||
this._notificationClickedId = 0;
|
||||
|
||||
this._summaryBin = new St.Bin({ x_align: St.Align.END,
|
||||
y_expand: true, // this is the Clutter property
|
||||
reactive: true });
|
||||
this._summaryBin.connect('button-release-event', Lang.bind(this, function(actor, event) {
|
||||
this._setClickedSummaryItem(null);
|
||||
@@ -1489,19 +1502,27 @@ const MessageTray = new Lang.Class({
|
||||
let pointerWatcher = PointerWatcher.getPointerWatcher();
|
||||
pointerWatcher.addWatch(TRAY_DWELL_CHECK_INTERVAL, Lang.bind(this, this._checkTrayDwell));
|
||||
this._trayDwellTimeoutId = 0;
|
||||
this._trayDwelling = false;
|
||||
},
|
||||
|
||||
_checkTrayDwell: function(x, y) {
|
||||
// We only set up dwell timeout when the user is not hovering over the tray
|
||||
// (!this.actor.hover). This avoids bringing up the message tray after the
|
||||
// user clicks on a notification with the pointer on the bottom pixel
|
||||
// of the monitor.
|
||||
if (y == global.screen_height - 1 && !this.actor.hover) {
|
||||
if (this._trayDwellTimeoutId == 0)
|
||||
let monitor = Main.layoutManager.bottomMonitor;
|
||||
let shouldDwell = (x >= monitor.x && x <= monitor.x + monitor.width &&
|
||||
y == monitor.y + monitor.height - 1);
|
||||
if (shouldDwell) {
|
||||
// We only set up dwell timeout when the user is not hovering over the tray
|
||||
// (!this.actor.hover). This avoids bringing up the message tray after the
|
||||
// user clicks on a notification with the pointer on the bottom pixel
|
||||
// of the monitor. The _trayDwelling variable is used so that we only try to
|
||||
// fire off one tray dwell - if it fails (because, say, the user has the mouse down),
|
||||
// we don't try again until the user moves the mouse up and down again.
|
||||
if (!this._trayDwelling && !this.actor.hover && this._trayDwellTimeoutId == 0)
|
||||
this._trayDwellTimeoutId = Mainloop.timeout_add(TRAY_DWELL_TIME,
|
||||
Lang.bind(this, this._trayDwellTimeout));
|
||||
Lang.bind(this, this._trayDwellTimeout));
|
||||
this._trayDwelling = true;
|
||||
} else {
|
||||
this._cancelTrayDwell();
|
||||
this._trayDwelling = false;
|
||||
}
|
||||
},
|
||||
|
||||
@@ -1578,10 +1599,15 @@ const MessageTray = new Lang.Class({
|
||||
}));
|
||||
|
||||
summaryItem.actor.connect('clicked', Lang.bind(this,
|
||||
function (actor, button) {
|
||||
function(actor, button) {
|
||||
actor.grab_key_focus();
|
||||
this._onSummaryItemClicked(summaryItem, button);
|
||||
}));
|
||||
summaryItem.actor.connect('popup-menu', Lang.bind(this,
|
||||
function(actor, button) {
|
||||
actor.grab_key_focus();
|
||||
this._onSummaryItemClicked(summaryItem, 3);
|
||||
}));
|
||||
|
||||
source.connect('destroy', Lang.bind(this, this._onSourceDestroy));
|
||||
|
||||
@@ -1721,7 +1747,7 @@ const MessageTray = new Lang.Class({
|
||||
|
||||
_onSummaryItemClicked: function(summaryItem, button) {
|
||||
if (summaryItem.source.handleSummaryClick()) {
|
||||
this._setClickedSummaryItem(null);
|
||||
this._escapeTray();
|
||||
} else {
|
||||
if (!this._setClickedSummaryItem(summaryItem, button))
|
||||
this._setClickedSummaryItem(null);
|
||||
@@ -1789,7 +1815,7 @@ const MessageTray = new Lang.Class({
|
||||
// We wait just a little before hiding the message tray in case the user quickly moves the mouse back into it.
|
||||
// We wait for a longer period if the notification popped up where the mouse pointer was already positioned.
|
||||
// That gives the user more time to mouse away from the notification and mouse back in in order to expand it.
|
||||
let timeout = this._useLongerHideTimeout ? LONGER_HIDE_TIMEOUT * 1000 : HIDE_TIMEOUT * 1000;
|
||||
let timeout = this._useLongerTrayLeftTimeout ? LONGER_HIDE_TIMEOUT * 1000 : HIDE_TIMEOUT * 1000;
|
||||
this._trayLeftTimeoutId = Mainloop.timeout_add(timeout, Lang.bind(this, this._onTrayLeftTimeout));
|
||||
}
|
||||
},
|
||||
@@ -1988,23 +2014,26 @@ const MessageTray = new Lang.Class({
|
||||
},
|
||||
|
||||
_showTray: function() {
|
||||
// Don't actually take a modal grab in the overview.
|
||||
// Just add something to the grab stack that we can
|
||||
// pop later.
|
||||
if (!this._grabHelper.grab({ actor: this.actor,
|
||||
modal: !this._overviewVisible,
|
||||
onUngrab: Lang.bind(this, this._escapeTray) })) {
|
||||
this._traySummoned = false;
|
||||
return;
|
||||
}
|
||||
|
||||
this._tween(this.actor, '_trayState', State.SHOWN,
|
||||
{ y: -this.actor.height,
|
||||
time: ANIMATION_TIME,
|
||||
transition: 'easeOutQuad'
|
||||
});
|
||||
|
||||
// Don't actually take a modal grab in the overview.
|
||||
// Just add something to the grab stack that we can
|
||||
// pop later.
|
||||
this._grabHelper.grab({ actor: this.actor,
|
||||
modal: !this._overviewVisible,
|
||||
onUngrab: Lang.bind(this, this._escapeTray) });
|
||||
|
||||
// Don't move the windows up if we are in the overview,
|
||||
// but show the tray in the ctrl+alt+tab list.
|
||||
if (this._overviewVisible) {
|
||||
Main.ctrlAltTabManager.addGroup(this._summary, _("Message Tray"), 'start-here',
|
||||
Main.ctrlAltTabManager.addGroup(this._summary, _("Message Tray"), 'start-here-symbolic',
|
||||
{ sortGroup: CtrlAltTab.SortGroup.BOTTOM });
|
||||
return;
|
||||
}
|
||||
@@ -2113,9 +2142,10 @@ const MessageTray = new Lang.Class({
|
||||
// explicitly mouses away from it and then mouses back in.
|
||||
this._showNotificationMouseX = x;
|
||||
this._showNotificationMouseY = y;
|
||||
// We save the y coordinate of the mouse at the time when we started showing the notification
|
||||
// and then we update it in _notifiationTimeout() if the mouse is moving towards the
|
||||
// notification. We don't pop down the notification if the mouse is moving towards it.
|
||||
// We save the coordinates of the mouse at the time when we started showing the notification
|
||||
// and then we update it in _notificationTimeout(). We don't pop down the notification if
|
||||
// the mouse is moving towards it or within it.
|
||||
this._lastSeenMouseX = x;
|
||||
this._lastSeenMouseY = y;
|
||||
},
|
||||
|
||||
@@ -2183,13 +2213,20 @@ const MessageTray = new Lang.Class({
|
||||
// hide it yet. (We just create a new timeout (and destroy
|
||||
// the old one) each time because the bookkeeping is
|
||||
// simpler.)
|
||||
this._lastSeenMouseY = y;
|
||||
this._updateNotificationTimeout(1000);
|
||||
} else if (this._useLongerTrayLeftTimeout && !this._trayLeftTimeoutId &&
|
||||
(x != this._lastSeenMouseX || y != this._lastSeenMouseY)) {
|
||||
// Refresh the timeout if the notification originally
|
||||
// popped up under the pointer, and the pointer is hovering
|
||||
// inside it.
|
||||
this._updateNotificationTimeout(1000);
|
||||
} else {
|
||||
this._notificationTimeoutId = 0;
|
||||
this._updateState();
|
||||
}
|
||||
|
||||
this._lastSeenMouseX = x;
|
||||
this._lastSeenMouseY = y;
|
||||
return false;
|
||||
},
|
||||
|
||||
@@ -2311,6 +2348,7 @@ const MessageTray = new Lang.Class({
|
||||
this._notificationQueue = newQueue;
|
||||
|
||||
this._summaryBoxPointer.bin.child = this._summaryBoxPointerItem.notificationStackWidget;
|
||||
this._summaryBoxPointerItem.closeButtonVisible = true;
|
||||
this._summaryBoxPointerItem.prepareNotificationStackForShowing();
|
||||
} else if (this._clickedSummaryItemMouseButton == 3) {
|
||||
this._summaryBoxPointer.bin.child = this._clickedSummaryItem.rightClickMenu;
|
||||
@@ -2442,7 +2480,7 @@ const SystemNotificationSource = new Lang.Class({
|
||||
Extends: Source,
|
||||
|
||||
_init: function() {
|
||||
this.parent(_("System Information"), 'dialog-information', St.IconType.SYMBOLIC);
|
||||
this.parent(_("System Information"), 'dialog-information-symbolic');
|
||||
this.setTransient(true);
|
||||
},
|
||||
|
||||
|
||||
@@ -135,7 +135,10 @@ const NetworkSecretDialog = new Lang.Class({
|
||||
} else
|
||||
secret.valid = true;
|
||||
|
||||
secretTable.add(label, { row: pos, col: 0, x_expand: false, x_fill: true, x_align: St.Align.START, y_align: St.Align.START });
|
||||
secretTable.add(label, { row: pos, col: 0,
|
||||
x_expand: false, x_fill: true,
|
||||
x_align: St.Align.START,
|
||||
y_fill: false, y_align: St.Align.MIDDLE });
|
||||
secretTable.add(secret.entry, { row: pos, col: 1, x_expand: true, x_fill: true, y_align: St.Align.END });
|
||||
pos++;
|
||||
|
||||
@@ -165,6 +168,7 @@ const NetworkSecretDialog = new Lang.Class({
|
||||
}
|
||||
|
||||
this._okButton.button.reactive = valid;
|
||||
this._okButton.button.can_focus = valid;
|
||||
},
|
||||
|
||||
_onOk: function() {
|
||||
|
||||
@@ -256,6 +256,7 @@ const NotificationDaemon = new Lang.Class({
|
||||
Mainloop.idle_add(Lang.bind(this,
|
||||
function () {
|
||||
this._emitNotificationClosed(id, NotificationClosedReason.DISMISSED);
|
||||
return false;
|
||||
}));
|
||||
return invocation.return_value(GLib.Variant.new('(u)', [id]));
|
||||
}
|
||||
@@ -356,7 +357,6 @@ const NotificationDaemon = new Lang.Class({
|
||||
|
||||
let gicon = this._iconForNotificationData(icon, hints);
|
||||
let iconActor = new St.Icon({ gicon: gicon,
|
||||
icon_type: St.IconType.FULLCOLOR,
|
||||
icon_size: MessageTray.NOTIFICATION_ICON_SIZE });
|
||||
|
||||
if (notification == null) {
|
||||
@@ -583,18 +583,12 @@ const Source = new Lang.Class({
|
||||
this.notifications.length > 0)
|
||||
return false;
|
||||
|
||||
if (Main.overview.visible) {
|
||||
// We can't just connect to Main.overview's 'hidden' signal,
|
||||
// because it's emitted *before* it calls popModal()...
|
||||
let id = global.connect('notify::stage-input-mode', Lang.bind(this,
|
||||
function () {
|
||||
global.disconnect(id);
|
||||
this.trayIcon.click(event);
|
||||
}));
|
||||
Main.overview.hide();
|
||||
} else {
|
||||
let id = global.connect('notify::stage-input-mode', Lang.bind(this, function () {
|
||||
global.disconnect(id);
|
||||
this.trayIcon.click(event);
|
||||
}
|
||||
}));
|
||||
|
||||
Main.overview.hide();
|
||||
return true;
|
||||
},
|
||||
|
||||
|
||||
@@ -70,14 +70,13 @@ const ShellInfo = new Lang.Class({
|
||||
let notification = null;
|
||||
if (this._source.notifications.length == 0) {
|
||||
notification = new MessageTray.Notification(this._source, text, null);
|
||||
notification.setTransient(true);
|
||||
notification.setShowWhenLocked(true);
|
||||
} else {
|
||||
notification = this._source.notifications[0];
|
||||
notification.update(text, null, { clear: true });
|
||||
}
|
||||
|
||||
notification.setTransient(true);
|
||||
|
||||
this._undoCallback = undoCallback;
|
||||
if (undoCallback) {
|
||||
notification.addButton('system-undo',
|
||||
@@ -211,7 +210,7 @@ const Overview = new Lang.Class({
|
||||
|
||||
// Translators: this is the name of the dock/favorites area on
|
||||
// the left of the overview
|
||||
Main.ctrlAltTabManager.addGroup(this._dash.actor, _("Dash"), 'user-bookmarks');
|
||||
Main.ctrlAltTabManager.addGroup(this._dash.actor, _("Dash"), 'user-bookmarks-symbolic');
|
||||
|
||||
Main.layoutManager.connect('monitors-changed', Lang.bind(this, this._relayout));
|
||||
this._relayout();
|
||||
|
||||
154
js/ui/panel.js
154
js/ui/panel.js
@@ -14,13 +14,14 @@ const St = imports.gi.St;
|
||||
const Signals = imports.signals;
|
||||
const Atk = imports.gi.Atk;
|
||||
|
||||
|
||||
const Config = imports.misc.config;
|
||||
const CtrlAltTab = imports.ui.ctrlAltTab;
|
||||
const DND = imports.ui.dnd;
|
||||
const Layout = imports.ui.layout;
|
||||
const Overview = imports.ui.overview;
|
||||
const PopupMenu = imports.ui.popupMenu;
|
||||
const PanelMenu = imports.ui.panelMenu;
|
||||
const DateMenu = imports.ui.dateMenu;
|
||||
const Main = imports.ui.main;
|
||||
const Tweener = imports.ui.tweener;
|
||||
|
||||
@@ -221,14 +222,14 @@ const AppMenuButton = new Lang.Class({
|
||||
Name: 'AppMenuButton',
|
||||
Extends: PanelMenu.Button,
|
||||
|
||||
_init: function(menuManager) {
|
||||
_init: function(panel) {
|
||||
this.parent(0.0, null, true);
|
||||
|
||||
this.actor.accessible_role = Atk.Role.MENU;
|
||||
|
||||
this._startingApps = [];
|
||||
|
||||
this._menuManager = menuManager;
|
||||
this._menuManager = panel.menuManager;
|
||||
this._targetApp = null;
|
||||
this._appMenuNotifyId = 0;
|
||||
this._actionGroupNotifyId = 0;
|
||||
@@ -285,7 +286,7 @@ const AppMenuButton = new Lang.Class({
|
||||
},
|
||||
|
||||
show: function() {
|
||||
if (this._visible)
|
||||
if (this._visible || Main.screenShield.locked)
|
||||
return;
|
||||
|
||||
this._visible = true;
|
||||
@@ -468,10 +469,12 @@ const AppMenuButton = new Lang.Class({
|
||||
},
|
||||
|
||||
setLockedState: function(locked) {
|
||||
if (locked)
|
||||
if (locked) {
|
||||
this.hide();
|
||||
else
|
||||
} else {
|
||||
this.show();
|
||||
this._sync();
|
||||
}
|
||||
},
|
||||
|
||||
_sync: function() {
|
||||
@@ -899,6 +902,29 @@ const PanelCorner = new Lang.Class({
|
||||
}
|
||||
});
|
||||
|
||||
const PANEL_ITEM_IMPLEMENTATIONS = {
|
||||
'activities': ActivitiesButton,
|
||||
'appMenu': AppMenuButton,
|
||||
'dateMenu': imports.ui.dateMenu.DateMenuButton,
|
||||
'a11y': imports.ui.status.accessibility.ATIndicator,
|
||||
'volume': imports.ui.status.volume.Indicator,
|
||||
'battery': imports.ui.status.power.Indicator,
|
||||
'lockScreen': imports.ui.status.lockScreenMenu.Indicator,
|
||||
'keyboard': imports.ui.status.keyboard.InputSourceIndicator,
|
||||
'powerMenu': imports.gdm.powerMenu.PowerMenuButton,
|
||||
'userMenu': imports.ui.userMenu.UserMenuButton
|
||||
};
|
||||
|
||||
if (Config.HAVE_BLUETOOTH)
|
||||
PANEL_ITEM_IMPLEMENTATIONS['bluetooth'] =
|
||||
imports.ui.status.bluetooth.Indicator;
|
||||
|
||||
try {
|
||||
PANEL_ITEM_IMPLEMENTATIONS['network'] =
|
||||
imports.ui.status.network.NMApplet;
|
||||
} catch(e) {
|
||||
log('NMApplet is not supported. It is possible that your NetworkManager version is too old');
|
||||
}
|
||||
|
||||
const Panel = new Lang.Class({
|
||||
Name: 'Panel',
|
||||
@@ -908,7 +934,7 @@ const Panel = new Lang.Class({
|
||||
reactive: true });
|
||||
this.actor._delegate = this;
|
||||
|
||||
this._statusArea = {};
|
||||
this.statusArea = {};
|
||||
|
||||
Main.overview.connect('shown', Lang.bind(this, function () {
|
||||
this.actor.add_style_class_name('in-overview');
|
||||
@@ -919,7 +945,7 @@ const Panel = new Lang.Class({
|
||||
|
||||
Main.screenShield.connect('lock-status-changed', Lang.bind(this, this._onLockStateChanged));
|
||||
|
||||
this._menus = new PopupMenu.PopupMenuManager(this);
|
||||
this.menuManager = new PopupMenu.PopupMenuManager(this);
|
||||
|
||||
this._leftBox = new St.BoxLayout({ name: 'panelLeft' });
|
||||
this.actor.add_actor(this._leftBox);
|
||||
@@ -946,29 +972,8 @@ const Panel = new Lang.Class({
|
||||
this.actor.connect('allocate', Lang.bind(this, this._allocate));
|
||||
this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress));
|
||||
|
||||
/* Button on the left side of the panel. */
|
||||
if (Main.sessionMode.hasOverview) {
|
||||
this._activitiesButton = new ActivitiesButton();
|
||||
this._activities = this._activitiesButton.actor;
|
||||
this._leftBox.add(this._activities);
|
||||
|
||||
// The activities button has a pretend menu, so as to integrate
|
||||
// more cleanly with the rest of the panel
|
||||
this._menus.addMenu(this._activitiesButton.menu);
|
||||
}
|
||||
|
||||
if (Main.sessionMode.hasAppMenu) {
|
||||
this._appMenu = new AppMenuButton(this._menus);
|
||||
this._leftBox.add(this._appMenu.actor);
|
||||
}
|
||||
|
||||
/* center */
|
||||
this._dateMenu = new DateMenu.DateMenuButton();
|
||||
this._centerBox.add(this._dateMenu.actor, { y_fill: true });
|
||||
this._menus.addMenu(this._dateMenu.menu);
|
||||
|
||||
Main.layoutManager.panelBox.add(this.actor);
|
||||
Main.ctrlAltTabManager.addGroup(this.actor, _("Top Bar"), 'start-here',
|
||||
Main.ctrlAltTabManager.addGroup(this.actor, _("Top Bar"), 'start-here-symbolic',
|
||||
{ sortGroup: CtrlAltTab.SortGroup.TOP });
|
||||
},
|
||||
|
||||
@@ -1086,76 +1091,71 @@ const Panel = new Lang.Class({
|
||||
},
|
||||
|
||||
openAppMenu: function() {
|
||||
let menu = this._appMenu.menu;
|
||||
if (!this._appMenu.actor.reactive || menu.isOpen)
|
||||
let indicator = this.statusArea.appMenu;
|
||||
if (!indicator) // appMenu not supported by current session mode
|
||||
return;
|
||||
|
||||
let menu = indicator.menu;
|
||||
if (!indicator.actor.reactive || menu.isOpen)
|
||||
return;
|
||||
|
||||
menu.open();
|
||||
menu.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
|
||||
},
|
||||
|
||||
startStatusArea: function() {
|
||||
for (let i = 0; i < Main.sessionMode.statusArea.order.length; i++) {
|
||||
let role = Main.sessionMode.statusArea.order[i];
|
||||
let constructor = Main.sessionMode.statusArea.implementation[role];
|
||||
init: function() {
|
||||
let panel = Main.sessionMode.panel;
|
||||
this._initBox(panel.left, this._leftBox);
|
||||
this._initBox(panel.center, this._centerBox);
|
||||
this._initBox(panel.right, this._rightBox);
|
||||
},
|
||||
|
||||
_initBox: function(elements, box) {
|
||||
for (let i = 0; i < elements.length; i++) {
|
||||
let role = elements[i];
|
||||
let constructor = PANEL_ITEM_IMPLEMENTATIONS[role];
|
||||
if (!constructor) {
|
||||
// This icon is not implemented (this is a bug)
|
||||
// panel icon is not supported (can happen for
|
||||
// bluetooth or network)
|
||||
continue;
|
||||
}
|
||||
|
||||
let indicator = new constructor();
|
||||
this.addToStatusArea(role, indicator, i);
|
||||
let indicator = new constructor(this);
|
||||
this._addToPanelBox(role, indicator, i, box);
|
||||
}
|
||||
},
|
||||
|
||||
_insertStatusItem: function(actor, position) {
|
||||
let children = this._rightBox.get_children();
|
||||
let i;
|
||||
for (i = children.length - 1; i >= 0; i--) {
|
||||
let rolePosition = children[i]._rolePosition;
|
||||
if (position > rolePosition) {
|
||||
this._rightBox.insert_child_at_index(actor, i + 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (i == -1) {
|
||||
// If we didn't find a position, we must be first
|
||||
this._rightBox.insert_child_at_index(actor, 0);
|
||||
}
|
||||
actor._rolePosition = position;
|
||||
_addToPanelBox: function(role, indicator, position, box) {
|
||||
box.insert_child_at_index(indicator.actor, position);
|
||||
if (indicator.menu)
|
||||
this.menuManager.addMenu(indicator.menu);
|
||||
this.statusArea[role] = indicator;
|
||||
let destroyId = indicator.connect('destroy', Lang.bind(this, function(emitter) {
|
||||
delete this.statusArea[role];
|
||||
emitter.disconnect(destroyId);
|
||||
}));
|
||||
},
|
||||
|
||||
addToStatusArea: function(role, indicator, position) {
|
||||
if (this._statusArea[role])
|
||||
addToStatusArea: function(role, indicator, position, box) {
|
||||
if (this.statusArea[role])
|
||||
throw new Error('Extension point conflict: there is already a status indicator for role ' + role);
|
||||
|
||||
if (!(indicator instanceof PanelMenu.Button))
|
||||
throw new TypeError('Status indicator must be an instance of PanelMenu.Button');
|
||||
|
||||
if (!position)
|
||||
position = 0;
|
||||
this._insertStatusItem(indicator.actor, position);
|
||||
if (indicator.menu)
|
||||
this._menus.addMenu(indicator.menu);
|
||||
|
||||
this._statusArea[role] = indicator;
|
||||
let destroyId = indicator.connect('destroy', Lang.bind(this, function(emitter) {
|
||||
delete this._statusArea[role];
|
||||
emitter.disconnect(destroyId);
|
||||
}));
|
||||
|
||||
position = position || 0;
|
||||
let boxes = {
|
||||
left: this._leftBox,
|
||||
center: this._centerBox,
|
||||
right: this._rightBox
|
||||
};
|
||||
let boxContainer = boxes[box] || this._rightBox;
|
||||
this._addToPanelBox(role, indicator, position, boxContainer);
|
||||
return indicator;
|
||||
},
|
||||
|
||||
_onLockStateChanged: function(shield, locked) {
|
||||
if (this._activitiesButton)
|
||||
this._activitiesButton.setLockedState(locked);
|
||||
if (this._appMenu)
|
||||
this._appMenu.setLockedState(locked);
|
||||
if (this._dateMenu)
|
||||
this._dateMenu.setLockedState(locked);
|
||||
|
||||
for (let id in this._statusArea)
|
||||
this._statusArea[id].setLockedState(locked);
|
||||
for (let id in this.statusArea)
|
||||
this.statusArea[id].setLockedState(locked);
|
||||
},
|
||||
});
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Gio = imports.gi.Gio;
|
||||
const Gtk = imports.gi.Gtk;
|
||||
const Lang = imports.lang;
|
||||
const Shell = imports.gi.Shell;
|
||||
@@ -230,19 +231,36 @@ const SystemStatusButton = new Lang.Class({
|
||||
|
||||
_init: function(iconName, nameText) {
|
||||
this.parent(0.0, nameText);
|
||||
|
||||
this._iconActor = new St.Icon({ icon_name: iconName,
|
||||
icon_type: St.IconType.SYMBOLIC,
|
||||
style_class: 'system-status-icon' });
|
||||
this.actor.add_actor(this._iconActor);
|
||||
this.actor.add_style_class_name('panel-status-button');
|
||||
|
||||
this._box = new St.BoxLayout({ style_class: 'panel-status-button-box' });
|
||||
this.actor.add_actor(this._box);
|
||||
|
||||
if (iconName)
|
||||
this.setIcon(iconName);
|
||||
},
|
||||
|
||||
addIcon: function(gicon) {
|
||||
let icon = new St.Icon({ gicon: gicon,
|
||||
style_class: 'system-status-icon' });
|
||||
this._box.add_actor(icon);
|
||||
|
||||
return icon;
|
||||
},
|
||||
|
||||
setIcon: function(iconName) {
|
||||
this._iconActor.icon_name = iconName;
|
||||
// Need to first add a NULL GIcon and then set icon_name, to ensure
|
||||
// compatibility with -symbolic fallbacks
|
||||
|
||||
if (!this.mainIcon)
|
||||
this.mainIcon = this.addIcon(null);
|
||||
this.mainIcon.icon_name = iconName;
|
||||
},
|
||||
|
||||
setGIcon: function(gicon) {
|
||||
this._iconActor.gicon = gicon;
|
||||
if (this.mainIcon)
|
||||
this.mainIcon.gicon = gicon;
|
||||
else
|
||||
this.mainIcon = this.addIcon(gicon);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -153,26 +153,8 @@ const PlacesManager = new Lang.Class({
|
||||
Gio.app_info_launch_default_for_uri(desktopUri, _makeLaunchContext(params));
|
||||
});
|
||||
|
||||
this._connect = new PlaceInfo('special:connect', _("Connect to..."),
|
||||
function (size) {
|
||||
// do NOT use St.Icon here, it crashes the shell
|
||||
// see wanda.js for details
|
||||
return St.TextureCache.get_default().load_icon_name(null,
|
||||
'applications-internet',
|
||||
St.IconType.FULLCOLOR,
|
||||
size);
|
||||
},
|
||||
function (params) {
|
||||
// BUG: nautilus-connect-server doesn't have a desktop file, so we can't
|
||||
// launch it with the workspace from params. It's probably pretty rare
|
||||
// and odd to drag this place onto a workspace in any case
|
||||
|
||||
Util.spawn(['nautilus-connect-server']);
|
||||
});
|
||||
|
||||
this._defaultPlaces.push(this._home);
|
||||
this._defaultPlaces.push(this._desktopMenu);
|
||||
this._defaultPlaces.push(this._connect);
|
||||
|
||||
/*
|
||||
* Show devices, code more or less ported from nautilus-places-sidebar.c
|
||||
|
||||
@@ -35,6 +35,9 @@ const PolkitAgent = imports.gi.PolkitAgent;
|
||||
|
||||
const ModalDialog = imports.ui.modalDialog;
|
||||
const ShellEntry = imports.ui.shellEntry;
|
||||
const UserMenu = imports.ui.userMenu;
|
||||
|
||||
const DIALOG_ICON_SIZE = 48;
|
||||
|
||||
const AuthenticationDialog = new Lang.Class({
|
||||
Name: 'AuthenticationDialog',
|
||||
@@ -117,9 +120,11 @@ const AuthenticationDialog = new Lang.Class({
|
||||
let userBox = new St.BoxLayout({ style_class: 'polkit-dialog-user-layout',
|
||||
vertical: false });
|
||||
messageBox.add(userBox);
|
||||
this._userIcon = new St.Icon();
|
||||
this._userIcon.hide();
|
||||
userBox.add(this._userIcon,
|
||||
this._userAvatar = new UserMenu.UserAvatarWidget(this._user,
|
||||
{ iconSize: DIALOG_ICON_SIZE,
|
||||
styleClass: 'polkit-dialog-user-icon' });
|
||||
this._userAvatar.actor.hide();
|
||||
userBox.add(this._userAvatar.actor,
|
||||
{ x_fill: true,
|
||||
y_fill: false,
|
||||
x_align: St.Align.END,
|
||||
@@ -314,18 +319,8 @@ const AuthenticationDialog = new Lang.Class({
|
||||
|
||||
_onUserChanged: function() {
|
||||
if (this._user.is_loaded) {
|
||||
if (this._userIcon) {
|
||||
let iconFileName = this._user.get_icon_file();
|
||||
let iconFile = Gio.file_new_for_path(iconFileName);
|
||||
let icon;
|
||||
if (iconFile.query_exists(null)) {
|
||||
icon = new Gio.FileIcon({file: iconFile});
|
||||
} else {
|
||||
icon = new Gio.ThemedIcon({name: 'avatar-default'});
|
||||
}
|
||||
this._userIcon.set_gicon (icon);
|
||||
this._userIcon.show();
|
||||
}
|
||||
this._userAvatar.update();
|
||||
this._userAvatar.actor.show();
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
@@ -134,6 +134,7 @@ const PopupBaseMenuItem = new Lang.Class({
|
||||
|
||||
this.sensitive = sensitive;
|
||||
this.actor.reactive = sensitive;
|
||||
this.actor.can_focus = sensitive;
|
||||
|
||||
this.emit('sensitive-changed', sensitive);
|
||||
},
|
||||
@@ -717,7 +718,8 @@ const Switch = new Lang.Class({
|
||||
|
||||
_init: function(state) {
|
||||
this.actor = new St.Bin({ style_class: 'toggle-switch',
|
||||
accessible_role: Atk.Role.CHECK_BOX});
|
||||
accessible_role: Atk.Role.CHECK_BOX,
|
||||
can_focus: true });
|
||||
// Translators: this MUST be either "toggle-switch-us"
|
||||
// (for toggle switches containing the English words
|
||||
// "ON" and "OFF") or "toggle-switch-intl" (for toggle
|
||||
@@ -1050,14 +1052,17 @@ const PopupMenuBase = new Lang.Class({
|
||||
|
||||
if (menuItem instanceof PopupMenuSection) {
|
||||
this._connectSubMenuSignals(menuItem, menuItem);
|
||||
menuItem._closingId = this.connect('open-state-changed',
|
||||
menuItem._parentOpenStateChangedId = this.connect('open-state-changed',
|
||||
function(self, open) {
|
||||
if (!open)
|
||||
menuItem.close(BoxPointer.PopupAnimation.FADE);
|
||||
if (open)
|
||||
menuItem.open();
|
||||
else
|
||||
menuItem.close();
|
||||
});
|
||||
menuItem.connect('destroy', Lang.bind(this, function() {
|
||||
menuItem.disconnect(menuItem._subMenuActivateId);
|
||||
menuItem.disconnect(menuItem._subMenuActiveChangeId);
|
||||
this.disconnect(menuItem._parentOpenStateChangedId);
|
||||
|
||||
this.length--;
|
||||
}));
|
||||
@@ -1438,7 +1443,7 @@ const PopupMenuSection = new Lang.Class({
|
||||
|
||||
// deliberately ignore any attempt to open() or close(), but emit the
|
||||
// corresponding signal so children can still pick it up
|
||||
open: function(animate) { this.emit('open-state-changed', true); },
|
||||
open: function() { this.emit('open-state-changed', true); },
|
||||
close: function() { this.emit('open-state-changed', false); },
|
||||
|
||||
destroy: function() {
|
||||
@@ -1876,7 +1881,7 @@ const RemoteMenu = new Lang.Class({
|
||||
}));
|
||||
}
|
||||
|
||||
item.actor.reactive = action.enabled;
|
||||
item.actor.reactive = item.actor.can_focus = action.enabled;
|
||||
|
||||
destroyId = item.connect('destroy', Lang.bind(this, function() {
|
||||
item.disconnect(destroyId);
|
||||
@@ -2008,7 +2013,7 @@ const RemoteMenu = new Lang.Class({
|
||||
if (action.items.length) {
|
||||
for (let i = 0; i < action.items.length; i++) {
|
||||
let item = action.items[i];
|
||||
item.actor.reactive = action.enabled;
|
||||
item.actor.reactive = item.actor.can_focus = action.enabled;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,16 +34,17 @@ var SearchProviderProxy = Gio.DBusProxy.makeProxyWrapper(SearchProviderIface);
|
||||
|
||||
function loadRemoteSearchProviders(addProviderCallback) {
|
||||
let dataDirs = GLib.get_system_data_dirs();
|
||||
let loadedProviders = {};
|
||||
for (let i = 0; i < dataDirs.length; i++) {
|
||||
let path = GLib.build_filenamev([dataDirs[i], 'gnome-shell', 'search-providers']);
|
||||
let dir = Gio.file_new_for_path(path);
|
||||
if (!dir.query_exists(null))
|
||||
continue;
|
||||
loadRemoteSearchProvidersFromDir(dir, addProviderCallback);
|
||||
loadRemoteSearchProvidersFromDir(dir, loadedProviders, addProviderCallback);
|
||||
}
|
||||
};
|
||||
|
||||
function loadRemoteSearchProvidersFromDir(dir, addProviderCallback) {
|
||||
function loadRemoteSearchProvidersFromDir(dir, loadedProviders, addProviderCallback) {
|
||||
let dirPath = dir.get_path();
|
||||
FileUtils.listDirAsync(dir, Lang.bind(this, function(files) {
|
||||
for (let i = 0; i < files.length; i++) {
|
||||
@@ -65,6 +66,9 @@ function loadRemoteSearchProvidersFromDir(dir, addProviderCallback) {
|
||||
let busName = keyfile.get_string(group, 'BusName');
|
||||
let objectPath = keyfile.get_string(group, 'ObjectPath');
|
||||
|
||||
if (loadedProviders[objectPath])
|
||||
continue;
|
||||
|
||||
let appInfo = null;
|
||||
try {
|
||||
let desktopId = keyfile.get_string(group, 'DesktopId');
|
||||
@@ -86,6 +90,7 @@ function loadRemoteSearchProvidersFromDir(dir, addProviderCallback) {
|
||||
icon,
|
||||
busName,
|
||||
objectPath);
|
||||
loadedProviders[objectPath] = remoteProvider;
|
||||
} catch(e) {
|
||||
log('Failed to add search provider "%s": %s'.format(title, e.toString()));
|
||||
continue;
|
||||
@@ -112,8 +117,7 @@ const RemoteSearchProvider = new Lang.Class({
|
||||
createIcon: function(size, meta) {
|
||||
if (meta['gicon']) {
|
||||
return new St.Icon({ gicon: Gio.icon_new_for_string(meta['gicon']),
|
||||
icon_size: size,
|
||||
icon_type: St.IconType.FULLCOLOR });
|
||||
icon_size: size });
|
||||
} else if (meta['icon-data']) {
|
||||
let [width, height, rowStride, hasAlpha,
|
||||
bitsPerSample, nChannels, data] = meta['icon-data'];
|
||||
@@ -124,8 +128,7 @@ const RemoteSearchProvider = new Lang.Class({
|
||||
|
||||
// Ugh, but we want to fall back to something ...
|
||||
return new St.Icon({ icon_name: 'text-x-generic',
|
||||
icon_size: size,
|
||||
icon_type: St.IconType.FULLCOLOR });
|
||||
icon_size: size });
|
||||
},
|
||||
|
||||
_getResultsFinished: function(results, error) {
|
||||
|
||||
@@ -1,13 +1,16 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
const Cairo = imports.cairo;
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Gio = imports.gi.Gio;
|
||||
const GLib = imports.gi.GLib;
|
||||
const GnomeDesktop = imports.gi.GnomeDesktop;
|
||||
const Lang = imports.lang;
|
||||
const Mainloop = imports.mainloop;
|
||||
const Meta = imports.gi.Meta;
|
||||
const Signals = imports.signals;
|
||||
const St = imports.gi.St;
|
||||
const TweenerEquations = imports.tweener.equations;
|
||||
|
||||
const GnomeSession = imports.misc.gnomeSession;
|
||||
const Layout = imports.ui.layout;
|
||||
@@ -25,6 +28,11 @@ const CURTAIN_SLIDE_TIME = 0.5;
|
||||
// the slide up automatically
|
||||
const ARROW_DRAG_TRESHOLD = 0.1;
|
||||
|
||||
// Parameters for the arrow animation
|
||||
const N_ARROWS = 3;
|
||||
const ARROW_ANIMATION_TIME = 0.6;
|
||||
const ARROW_ANIMATION_PEAK_OPACITY = 0.4;
|
||||
|
||||
// The distance in px that the lock screen will move to when pressing
|
||||
// a key that has no effect in the lock screen (bumping it)
|
||||
const BUMP_SIZE = 25;
|
||||
@@ -159,8 +167,9 @@ const NotificationsBox = new Lang.Class({
|
||||
},
|
||||
|
||||
_summaryItemAdded: function(tray, item, dontUpdateVisibility) {
|
||||
// Ignore transient sources
|
||||
if (item.source.isTransient)
|
||||
// Ignore transient sources, or sources explicitly marked not to show
|
||||
// in the lock screen
|
||||
if (item.source.isTransient || !item.source.showInLockScreen)
|
||||
return;
|
||||
|
||||
let obj = {
|
||||
@@ -174,8 +183,9 @@ const NotificationsBox = new Lang.Class({
|
||||
};
|
||||
|
||||
if (obj.resident) {
|
||||
this._residentNotificationBox.add(item.notificationStackWidget);
|
||||
item.closeButtonVisible = false;
|
||||
item.prepareNotificationStackForShowing();
|
||||
this._residentNotificationBox.add(item.notificationStackView);
|
||||
} else {
|
||||
[obj.sourceBox, obj.countLabel] = this._makeNotificationSource(item.source);
|
||||
this._persistentNotificationBox.add(obj.sourceBox, { x_fill: false, x_align: St.Align.MIDDLE });
|
||||
@@ -220,7 +230,8 @@ const NotificationsBox = new Lang.Class({
|
||||
|
||||
if (obj.resident && !itemShouldBeResident) {
|
||||
// make into a regular item
|
||||
this._residentNotificationBox.remove_actor(obj.item.notificationStackView);
|
||||
obj.item.doneShowingNotificationStack();
|
||||
this._residentNotificationBox.remove_actor(obj.item.notificationStackWidget);
|
||||
|
||||
[obj.sourceBox, obj.countLabel] = this._makeNotificationSource(obj.source);
|
||||
this._persistentNotificationBox.add(obj.sourceBox);
|
||||
@@ -230,8 +241,9 @@ const NotificationsBox = new Lang.Class({
|
||||
obj.sourceBox = obj.countLabel = null;
|
||||
obj.resident = true;
|
||||
|
||||
this._residentNotificationBox.add(obj.item.notificationStackWidget);
|
||||
obj.item.closeButtonVisible = false;
|
||||
obj.item.prepareNotificationStackForShowing();
|
||||
this._residentNotificationBox.add(obj.item.notificationStackView);
|
||||
} else {
|
||||
// just update the counter
|
||||
let count = obj.source.unseenCount;
|
||||
@@ -253,8 +265,8 @@ const NotificationsBox = new Lang.Class({
|
||||
|
||||
_removeItem: function(obj) {
|
||||
if (obj.resident) {
|
||||
this._residentNotificationBox.remove_actor(obj.item.notificationStackView);
|
||||
obj.item.doneShowingNotificationStack();
|
||||
this._residentNotificationBox.remove_actor(obj.item.notificationStackWidget);
|
||||
} else {
|
||||
obj.sourceBox.destroy();
|
||||
}
|
||||
@@ -265,6 +277,62 @@ const NotificationsBox = new Lang.Class({
|
||||
},
|
||||
});
|
||||
|
||||
const Arrow = new Lang.Class({
|
||||
Name: 'Arrow',
|
||||
Extends: St.Bin,
|
||||
|
||||
_init: function(params) {
|
||||
this.parent(params);
|
||||
this.x_fill = this.y_fill = true;
|
||||
this.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS);
|
||||
|
||||
this._drawingArea = new St.DrawingArea();
|
||||
this._drawingArea.connect('repaint', Lang.bind(this, this._drawArrow));
|
||||
this.child = this._drawingArea;
|
||||
|
||||
this._shadowHelper = null;
|
||||
this._shadowWidth = this._shadowHeight = 0;
|
||||
},
|
||||
|
||||
_drawArrow: function(arrow) {
|
||||
let cr = arrow.get_context();
|
||||
let [w, h] = arrow.get_surface_size();
|
||||
let node = this.get_theme_node();
|
||||
let thickness = node.get_length('-arrow-thickness');
|
||||
|
||||
Clutter.cairo_set_source_color(cr, node.get_foreground_color());
|
||||
|
||||
cr.setLineCap(Cairo.LineCap.ROUND);
|
||||
cr.setLineWidth(thickness);
|
||||
|
||||
cr.moveTo(thickness / 2, h - thickness / 2);
|
||||
cr.lineTo(w/2, thickness);
|
||||
cr.lineTo(w - thickness / 2, h - thickness / 2);
|
||||
cr.stroke();
|
||||
},
|
||||
|
||||
vfunc_style_changed: function() {
|
||||
let node = this.get_theme_node();
|
||||
this._shadow = node.get_shadow('-arrow-shadow');
|
||||
if (this._shadow)
|
||||
this._shadowHelper = St.ShadowHelper.new(this._shadow);
|
||||
else
|
||||
this._shadowHelper = null;
|
||||
},
|
||||
|
||||
vfunc_paint: function() {
|
||||
if (this._shadowHelper) {
|
||||
this._shadowHelper.update(this._drawingArea);
|
||||
|
||||
let allocation = this._drawingArea.get_allocation_box();
|
||||
let paintOpacity = this._drawingArea.get_paint_opacity();
|
||||
this._shadowHelper.paint(allocation, paintOpacity);
|
||||
}
|
||||
|
||||
this._drawingArea.paint();
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* To test screen shield, make sure to kill gnome-screensaver.
|
||||
*
|
||||
@@ -281,6 +349,7 @@ const ScreenShield = new Lang.Class({
|
||||
_init: function() {
|
||||
this.actor = Main.layoutManager.screenShieldGroup;
|
||||
|
||||
this._lockScreenState = MessageTray.State.HIDDEN;
|
||||
this._lockScreenGroup = new St.Widget({ x_expand: true,
|
||||
y_expand: true,
|
||||
reactive: true,
|
||||
@@ -289,6 +358,8 @@ const ScreenShield = new Lang.Class({
|
||||
});
|
||||
this._lockScreenGroup.connect('key-release-event',
|
||||
Lang.bind(this, this._onLockScreenKeyRelease));
|
||||
this._lockScreenGroup.connect('scroll-event',
|
||||
Lang.bind(this, this._onLockScreenScroll));
|
||||
|
||||
this._lockScreenContents = new St.Widget({ layout_manager: new Clutter.BinLayout(),
|
||||
name: 'lockScreenContents' });
|
||||
@@ -298,19 +369,20 @@ const ScreenShield = new Lang.Class({
|
||||
this._lockScreenGroup.add_actor(this._background);
|
||||
this._lockScreenGroup.add_actor(this._lockScreenContents);
|
||||
|
||||
// FIXME: build the rest of the lock screen here
|
||||
this._arrowContainer = new St.BoxLayout({ style_class: 'screen-shield-arrows',
|
||||
vertical: true,
|
||||
x_align: Clutter.ActorAlign.CENTER,
|
||||
y_align: Clutter.ActorAlign.END,
|
||||
// HACK: without these, ClutterBinLayout
|
||||
// ignores alignment properties on the actor
|
||||
x_expand: true,
|
||||
y_expand: true });
|
||||
|
||||
this._arrow = new St.DrawingArea({ style_class: 'arrow',
|
||||
reactive: true,
|
||||
x_align: Clutter.ActorAlign.CENTER,
|
||||
y_align: Clutter.ActorAlign.END,
|
||||
// HACK: without these, ClutterBinLayout
|
||||
// ignores alignment properties on the actor
|
||||
x_expand: true,
|
||||
y_expand: true
|
||||
});
|
||||
this._arrow.connect('repaint', Lang.bind(this, this._drawArrow));
|
||||
this._lockScreenContents.add_actor(this._arrow);
|
||||
for (let i = 0; i < N_ARROWS; i++) {
|
||||
let arrow = new Arrow({ opacity: 0 });
|
||||
this._arrowContainer.add_actor(arrow);
|
||||
}
|
||||
this._lockScreenContents.add_actor(this._arrowContainer);
|
||||
|
||||
let dragArea = new Clutter.Rect({ origin: new Clutter.Point({ x: 0, y: -global.screen_height, }),
|
||||
size: new Clutter.Size({ width: global.screen_width,
|
||||
@@ -364,29 +436,60 @@ const ScreenShield = new Lang.Class({
|
||||
return true;
|
||||
}
|
||||
|
||||
// If the dialog is created, but hasn't received focus yet,
|
||||
// the lock screen could be still focused, so bumping would
|
||||
// make the curtain fall again.
|
||||
if (!this._dialog)
|
||||
// Don't bump if the lock screen is not showing or is
|
||||
// animating, as the bump overrides the animation and would
|
||||
// remove any onComplete handler
|
||||
if (this._lockScreenState == MessageTray.State.SHOWN)
|
||||
this._bumpLockScreen();
|
||||
return true;
|
||||
},
|
||||
|
||||
_drawArrow: function() {
|
||||
let cr = this._arrow.get_context();
|
||||
let [w, h] = this._arrow.get_surface_size();
|
||||
let node = this._arrow.get_theme_node();
|
||||
_onLockScreenScroll: function(actor, event) {
|
||||
if (this._lockScreenState != MessageTray.State.SHOWN)
|
||||
return false;
|
||||
|
||||
Clutter.cairo_set_source_color(cr, node.get_foreground_color());
|
||||
let delta = 0;
|
||||
if (event.get_scroll_direction() == Clutter.ScrollDirection.UP)
|
||||
delta = 5;
|
||||
else if (event.get_scroll_direction() == Clutter.ScrollDirection.SMOOTH)
|
||||
delta = Math.max(0, event.get_scroll_delta()[0]);
|
||||
|
||||
cr.moveTo(0, h);
|
||||
cr.lineTo(w/2, 0);
|
||||
cr.lineTo(w, h);
|
||||
cr.fill();
|
||||
this._lockScreenScrollCounter += delta;
|
||||
|
||||
// 7 standard scrolls to lift up
|
||||
if (this._lockScreenScrollCounter > 35) {
|
||||
this._ensureUnlockDialog();
|
||||
this._hideLockScreen(0);
|
||||
}
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
_animateArrows: function() {
|
||||
let arrows = this._arrowContainer.get_children();
|
||||
let unitaryDelay = ARROW_ANIMATION_TIME / (arrows.length + 1);
|
||||
let maxOpacity = 255 * ARROW_ANIMATION_PEAK_OPACITY;
|
||||
for (let i = 0; i < arrows.length; i++) {
|
||||
arrows.opacity = 0;
|
||||
Tweener.addTween(arrows[i],
|
||||
{ opacity: 0,
|
||||
delay: unitaryDelay * (N_ARROWS - (i + 1)),
|
||||
time: ARROW_ANIMATION_TIME,
|
||||
transition: function(t, b, c, d) {
|
||||
if (t < d/2)
|
||||
return TweenerEquations.easeOutQuad(t, 0, maxOpacity, d/2);
|
||||
else
|
||||
return TweenerEquations.easeInQuad(t - d/2, maxOpacity, -maxOpacity, d/2);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
_onDragBegin: function() {
|
||||
Tweener.removeTweens(this._lockScreenGroup);
|
||||
this._lockScreenState = MessageTray.State.HIDING;
|
||||
this._ensureUnlockDialog();
|
||||
},
|
||||
|
||||
@@ -405,8 +508,10 @@ const ScreenShield = new Lang.Class({
|
||||
time: time,
|
||||
transition: 'linear',
|
||||
onComplete: function() {
|
||||
this.fixed_position_set = false;
|
||||
}
|
||||
this._lockScreenGroup.fixed_position_set = false;
|
||||
this._lockScreenState = MessageTray.State.SHOWN;
|
||||
},
|
||||
onCompleteScope: this,
|
||||
});
|
||||
|
||||
// If we have a unlock dialog, cancel it
|
||||
@@ -470,6 +575,8 @@ const ScreenShield = new Lang.Class({
|
||||
},
|
||||
|
||||
_hideLockScreen: function(animate) {
|
||||
this._lockScreenState = MessageTray.State.HIDING;
|
||||
|
||||
if (animate) {
|
||||
// Tween the lock screen out of screen
|
||||
// try to use the same speed regardless of original position
|
||||
@@ -480,13 +587,21 @@ const ScreenShield = new Lang.Class({
|
||||
{ y: -h,
|
||||
time: time,
|
||||
transition: 'linear',
|
||||
onComplete: function() { this.hide(); }
|
||||
onComplete: function() {
|
||||
this._lockScreenHidden();
|
||||
},
|
||||
onCompleteScope: this,
|
||||
});
|
||||
} else {
|
||||
this._lockScreenGroup.hide();
|
||||
this._lockScreenHidden();
|
||||
}
|
||||
},
|
||||
|
||||
_lockScreenHidden: function() {
|
||||
this._lockScreenState = MessageTray.State.HIDDEN;
|
||||
this._lockScreenGroup.hide();
|
||||
},
|
||||
|
||||
_ensureUnlockDialog: function() {
|
||||
if (!this._dialog) {
|
||||
[this._dialog, this._keepDialog] = Main.sessionMode.createUnlockDialog(this._lockDialogGroup);
|
||||
@@ -530,6 +645,7 @@ const ScreenShield = new Lang.Class({
|
||||
|
||||
_resetLockScreen: function(animate) {
|
||||
this._lockScreenGroup.show();
|
||||
this._lockScreenState = MessageTray.State.SHOWING;
|
||||
|
||||
if (animate) {
|
||||
this._lockScreenGroup.y = -global.screen_height;
|
||||
@@ -539,8 +655,7 @@ const ScreenShield = new Lang.Class({
|
||||
time: SHORT_FADE_TIME,
|
||||
transition: 'linear',
|
||||
onComplete: function() {
|
||||
this._lockScreenGroup.fixed_position_set = false;
|
||||
this.emit('lock-screen-shown');
|
||||
this._lockScreenShown();
|
||||
},
|
||||
onCompleteScope: this
|
||||
});
|
||||
@@ -552,14 +667,26 @@ const ScreenShield = new Lang.Class({
|
||||
time: SHORT_FADE_TIME,
|
||||
transition: 'easeOutQuad' });
|
||||
} else {
|
||||
this._lockScreenGroup.fixed_position_set = false;
|
||||
this._lockDialogGroup.opacity = 255;
|
||||
this.emit('lock-screen-shown');
|
||||
this._lockScreenShown();
|
||||
}
|
||||
|
||||
this._lockScreenGroup.grab_key_focus();
|
||||
},
|
||||
|
||||
_lockScreenShown: function() {
|
||||
if (this._arrowAnimationId)
|
||||
Mainloop.source_remove(this._arrowAnimationId);
|
||||
this._arrowAnimationId = Mainloop.timeout_add(6000, Lang.bind(this, this._animateArrows));
|
||||
this._animateArrows();
|
||||
|
||||
this._lockScreenState = MessageTray.State.SHOWN;
|
||||
this._lockScreenGroup.fixed_position_set = false;
|
||||
this._lockScreenScrollCounter = 0;
|
||||
|
||||
this.emit('lock-screen-shown');
|
||||
},
|
||||
|
||||
// Some of the actors in the lock screen are heavy in
|
||||
// resources, so we only create them when needed
|
||||
_prepareLockScreen: function() {
|
||||
@@ -595,6 +722,11 @@ const ScreenShield = new Lang.Class({
|
||||
|
||||
this._lockScreenContentsBox.destroy();
|
||||
|
||||
if (this._arrowAnimationId) {
|
||||
Mainloop.source_remove(this._arrowAnimationId);
|
||||
this._arrowAnimationId = 0;
|
||||
}
|
||||
|
||||
this._hasLockScreen = false;
|
||||
},
|
||||
|
||||
|
||||
@@ -190,7 +190,7 @@ const SearchResults = new Lang.Class({
|
||||
scrollView.add_actor(this._content);
|
||||
|
||||
this.actor.add(scrollView, { x_fill: true,
|
||||
y_fill: false,
|
||||
y_fill: true,
|
||||
expand: true,
|
||||
x_align: St.Align.START,
|
||||
y_align: St.Align.START });
|
||||
@@ -205,7 +205,10 @@ const SearchResults = new Lang.Class({
|
||||
}));
|
||||
|
||||
this._statusText = new St.Label({ style_class: 'search-statustext' });
|
||||
this._content.add(this._statusText);
|
||||
this._statusBin = new St.Bin({ x_align: St.Align.MIDDLE,
|
||||
y_align: St.Align.MIDDLE });
|
||||
this._content.add(this._statusBin, { expand: true });
|
||||
this._statusBin.add_actor(this._statusText);
|
||||
this._providers = this._searchSystem.getProviders();
|
||||
this._providerMeta = [];
|
||||
for (let i = 0; i < this._providers.length; i++) {
|
||||
@@ -265,14 +268,14 @@ const SearchResults = new Lang.Class({
|
||||
|
||||
reset: function() {
|
||||
this._searchSystem.reset();
|
||||
this._statusText.hide();
|
||||
this._statusBin.hide();
|
||||
this._clearDisplay();
|
||||
},
|
||||
|
||||
startingSearch: function() {
|
||||
this.reset();
|
||||
this._statusText.set_text(_("Searching..."));
|
||||
this._statusText.show();
|
||||
this._statusBin.show();
|
||||
},
|
||||
|
||||
doSearch: function (searchString) {
|
||||
@@ -322,10 +325,10 @@ const SearchResults = new Lang.Class({
|
||||
}
|
||||
|
||||
if (!haveResults) {
|
||||
this._statusText.set_text(_("No matching results."));
|
||||
this._statusText.show();
|
||||
this._statusText.set_text(_("No results."));
|
||||
this._statusBin.show();
|
||||
} else {
|
||||
this._statusText.hide();
|
||||
this._statusBin.hide();
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
@@ -2,36 +2,13 @@
|
||||
|
||||
const Lang = imports.lang;
|
||||
|
||||
const Config = imports.misc.config;
|
||||
const Main = imports.ui.main;
|
||||
const Params = imports.misc.params;
|
||||
|
||||
|
||||
const STANDARD_STATUS_AREA_SHELL_IMPLEMENTATION = {
|
||||
'a11y': imports.ui.status.accessibility.ATIndicator,
|
||||
'volume': imports.ui.status.volume.Indicator,
|
||||
'battery': imports.ui.status.power.Indicator,
|
||||
'keyboard': imports.ui.status.keyboard.InputSourceIndicator,
|
||||
'userMenu': imports.ui.userMenu.UserMenuButton
|
||||
};
|
||||
|
||||
if (Config.HAVE_BLUETOOTH)
|
||||
STANDARD_STATUS_AREA_SHELL_IMPLEMENTATION['bluetooth'] =
|
||||
imports.ui.status.bluetooth.Indicator;
|
||||
|
||||
try {
|
||||
STANDARD_STATUS_AREA_SHELL_IMPLEMENTATION['network'] =
|
||||
imports.ui.status.network.NMApplet;
|
||||
} catch(e) {
|
||||
log('NMApplet is not supported. It is possible that your NetworkManager version is too old');
|
||||
}
|
||||
|
||||
|
||||
const DEFAULT_MODE = 'user';
|
||||
|
||||
const _modes = {
|
||||
'gdm': { hasOverview: false,
|
||||
hasAppMenu: false,
|
||||
showCalendarEvents: false,
|
||||
allowSettings: false,
|
||||
allowExtensions: false,
|
||||
@@ -40,24 +17,15 @@ const _modes = {
|
||||
hasWorkspaces: false,
|
||||
createSession: Main.createGDMSession,
|
||||
createUnlockDialog: Main.createGDMLoginDialog,
|
||||
extraStylesheet: null,
|
||||
statusArea: {
|
||||
order: [
|
||||
'a11y', 'display', 'keyboard',
|
||||
'volume', 'battery', 'powerMenu'
|
||||
],
|
||||
implementation: {
|
||||
'a11y': imports.ui.status.accessibility.ATIndicator,
|
||||
'volume': imports.ui.status.volume.Indicator,
|
||||
'battery': imports.ui.status.power.Indicator,
|
||||
'keyboard': imports.ui.status.keyboard.InputSourceIndicator,
|
||||
'powerMenu': imports.gdm.powerMenu.PowerMenuButton
|
||||
}
|
||||
panel: {
|
||||
left: [],
|
||||
center: ['dateMenu'],
|
||||
right: ['a11y', 'display', 'keyboard',
|
||||
'volume', 'battery', 'lockScreen', 'powerMenu']
|
||||
}
|
||||
},
|
||||
|
||||
'initial-setup': { hasOverview: false,
|
||||
hasAppMenu: false,
|
||||
showCalendarEvents: false,
|
||||
allowSettings: false,
|
||||
allowExtensions: false,
|
||||
@@ -65,21 +33,14 @@ const _modes = {
|
||||
hasRunDialog: false,
|
||||
hasWorkspaces: false,
|
||||
createSession: Main.createInitialSetupSession,
|
||||
extraStylesheet: null,
|
||||
statusArea: {
|
||||
order: [
|
||||
'a11y', 'keyboard', 'volume'
|
||||
],
|
||||
implementation: {
|
||||
'a11y': imports.ui.status.accessibility.ATIndicator,
|
||||
'keyboard': imports.ui.status.keyboard.XKBIndicator,
|
||||
'volume': imports.ui.status.volume.Indicator
|
||||
}
|
||||
}
|
||||
},
|
||||
panel: {
|
||||
left: [],
|
||||
center: ['dateMenu'],
|
||||
right: ['a11y', 'keyboard', 'volume', 'lockScreen']
|
||||
}
|
||||
},
|
||||
|
||||
'user': { hasOverview: true,
|
||||
hasAppMenu: true,
|
||||
showCalendarEvents: true,
|
||||
allowSettings: true,
|
||||
allowExtensions: true,
|
||||
@@ -88,13 +49,11 @@ const _modes = {
|
||||
hasWorkspaces: true,
|
||||
createSession: Main.createUserSession,
|
||||
createUnlockDialog: Main.createSessionUnlockDialog,
|
||||
extraStylesheet: null,
|
||||
statusArea: {
|
||||
order: [
|
||||
'input-method', 'a11y', 'keyboard', 'volume', 'bluetooth',
|
||||
'network', 'battery', 'userMenu'
|
||||
],
|
||||
implementation: STANDARD_STATUS_AREA_SHELL_IMPLEMENTATION
|
||||
panel: {
|
||||
left: ['activities', 'appMenu'],
|
||||
center: ['dateMenu'],
|
||||
right: ['a11y', 'keyboard', 'volume', 'bluetooth',
|
||||
'network', 'battery', 'lockScreen', 'userMenu']
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -318,8 +318,11 @@ const GnomeShellExtensions = new Lang.Class({
|
||||
},
|
||||
|
||||
ReloadExtension: function(uuid) {
|
||||
ExtensionSystem.unloadExtension(uuid);
|
||||
ExtensionSystem.loadExtension(uuid);
|
||||
let extension = ExtensionUtils.extensions[uuid];
|
||||
if (!extension)
|
||||
return;
|
||||
|
||||
ExtensionSystem.reloadExtension(extension);
|
||||
},
|
||||
|
||||
CheckForUpdates: function() {
|
||||
|
||||
@@ -240,7 +240,7 @@ const ShellUnmountNotifier = new Lang.Class({
|
||||
Extends: MessageTray.Source,
|
||||
|
||||
_init: function() {
|
||||
this.parent('', 'media-removable', St.IconType.FULLCOLOR);
|
||||
this.parent('', 'media-removable');
|
||||
|
||||
this._notification = null;
|
||||
Main.messageTray.add(this);
|
||||
@@ -361,12 +361,12 @@ const ShellMountPasswordDialog = new Lang.Class({
|
||||
if (strings[1])
|
||||
description.set_text(strings[1]);
|
||||
|
||||
this._passwordBox = new St.BoxLayout({ vertical: false });
|
||||
this._passwordBox = new St.BoxLayout({ vertical: false, style_class: 'prompt-dialog-password-box' });
|
||||
this._messageBox.add(this._passwordBox);
|
||||
|
||||
this._passwordLabel = new St.Label(({ style_class: 'prompt-dialog-password-label',
|
||||
text: _("Passphrase") }));
|
||||
this._passwordBox.add(this._passwordLabel);
|
||||
text: _("Password") }));
|
||||
this._passwordBox.add(this._passwordLabel, { y_fill: false, y_align: St.Align.MIDDLE });
|
||||
|
||||
this._passwordEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
|
||||
text: "",
|
||||
@@ -386,7 +386,7 @@ const ShellMountPasswordDialog = new Lang.Class({
|
||||
|
||||
if (flags & Gio.AskPasswordFlags.SAVING_SUPPORTED) {
|
||||
this._rememberChoice = new CheckBox.CheckBox();
|
||||
this._rememberChoice.getLabelActor().text = _("Remember Passphrase");
|
||||
this._rememberChoice.getLabelActor().text = _("Remember Password");
|
||||
this._rememberChoice.actor.checked = true;
|
||||
this._messageBox.add(this._rememberChoice.actor);
|
||||
} else {
|
||||
|
||||
@@ -36,7 +36,7 @@ const ATIndicator = new Lang.Class({
|
||||
Extends: PanelMenu.SystemStatusButton,
|
||||
|
||||
_init: function() {
|
||||
this.parent('preferences-desktop-accessibility', _("Accessibility"));
|
||||
this.parent('preferences-desktop-accessibility-symbolic', _("Accessibility"));
|
||||
|
||||
let highContrast = this._buildHCItem();
|
||||
this.menu.addMenuItem(highContrast);
|
||||
|
||||
@@ -24,7 +24,7 @@ const Indicator = new Lang.Class({
|
||||
Extends: PanelMenu.SystemStatusButton,
|
||||
|
||||
_init: function() {
|
||||
this.parent('bluetooth-disabled', _("Bluetooth"));
|
||||
this.parent('bluetooth-disabled-symbolic', _("Bluetooth"));
|
||||
|
||||
this._applet = new GnomeBluetoothApplet.Applet();
|
||||
|
||||
@@ -111,10 +111,10 @@ const Indicator = new Lang.Class({
|
||||
|
||||
if (on) {
|
||||
this._discoverable.actor.show();
|
||||
this.setIcon('bluetooth-active');
|
||||
this.setIcon('bluetooth-active-symbolic');
|
||||
} else {
|
||||
this._discoverable.actor.hide();
|
||||
this.setIcon('bluetooth-disabled');
|
||||
this.setIcon('bluetooth-disabled-symbolic');
|
||||
}
|
||||
},
|
||||
|
||||
@@ -306,7 +306,7 @@ const Indicator = new Lang.Class({
|
||||
|
||||
_ensureSource: function() {
|
||||
if (!this._source) {
|
||||
this._source = new MessageTray.Source(_("Bluetooth"), 'bluetooth-active', St.IconType.SYMBOLIC);
|
||||
this._source = new MessageTray.Source(_("Bluetooth"), 'bluetooth-active');
|
||||
Main.messageTray.add(this._source);
|
||||
}
|
||||
},
|
||||
|
||||
62
js/ui/status/lockScreenMenu.js
Normal file
62
js/ui/status/lockScreenMenu.js
Normal file
@@ -0,0 +1,62 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const GObject = imports.gi.GObject;
|
||||
const Lang = imports.lang;
|
||||
const St = imports.gi.St;
|
||||
|
||||
const Main = imports.ui.main;
|
||||
const PanelMenu = imports.ui.panelMenu;
|
||||
const PopupMenu = imports.ui.popupMenu;
|
||||
const VolumeMenu = imports.ui.status.volume;
|
||||
|
||||
const Indicator = new Lang.Class({
|
||||
Name: 'LockScreenMenuIndicator',
|
||||
Extends: PanelMenu.SystemStatusButton,
|
||||
|
||||
_init: function() {
|
||||
this.parent(null, _("Volume, network, battery"));
|
||||
this.actor.hide();
|
||||
|
||||
this._volume = Main.panel.statusArea.volume;
|
||||
if (this._volume) {
|
||||
this._volumeIcon = this.addIcon(null);
|
||||
this._volume.mainIcon.bind_property('gicon', this._volumeIcon, 'gicon',
|
||||
GObject.BindingFlags.SYNC_CREATE);
|
||||
this._volume.mainIcon.bind_property('visible', this._volumeIcon, 'visible',
|
||||
GObject.BindingFlags.SYNC_CREATE);
|
||||
|
||||
this._volumeControl = VolumeMenu.getMixerControl();
|
||||
this._volumeMenu = new VolumeMenu.VolumeMenu(this._volumeControl);
|
||||
this.menu.addMenuItem(this._volumeMenu);
|
||||
}
|
||||
|
||||
this._network = Main.panel.statusArea.network;
|
||||
if (this._network) {
|
||||
this._networkIcon = this.addIcon(null);
|
||||
this._network.mainIcon.bind_property('gicon', this._networkIcon, 'gicon',
|
||||
GObject.BindingFlags.SYNC_CREATE);
|
||||
this._network.mainIcon.bind_property('visible', this._networkIcon, 'visible',
|
||||
GObject.BindingFlags.SYNC_CREATE);
|
||||
|
||||
this._networkSecondaryIcon = this.addIcon(null);
|
||||
this._network.secondaryIcon.bind_property('gicon', this._networkSecondaryIcon, 'gicon',
|
||||
GObject.BindingFlags.SYNC_CREATE);
|
||||
this._network.secondaryIcon.bind_property('visible', this._networkSecondaryIcon, 'visible',
|
||||
GObject.BindingFlags.SYNC_CREATE);
|
||||
}
|
||||
|
||||
this._battery = Main.panel.statusArea.battery;
|
||||
if (this._battery) {
|
||||
this._batteryIcon = this.addIcon(null);
|
||||
this._battery.mainIcon.bind_property('gicon', this._batteryIcon, 'gicon',
|
||||
GObject.BindingFlags.SYNC_CREATE);
|
||||
this._battery.mainIcon.bind_property('visible', this._batteryIcon, 'visible',
|
||||
GObject.BindingFlags.SYNC_CREATE);
|
||||
}
|
||||
},
|
||||
|
||||
setLockedState: function(locked) {
|
||||
this.actor.visible = locked;
|
||||
}
|
||||
});
|
||||
@@ -1,6 +1,7 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
const GLib = imports.gi.GLib;
|
||||
const GObject = imports.gi.GObject;
|
||||
const Gio = imports.gi.Gio;
|
||||
const Lang = imports.lang;
|
||||
const NetworkManager = imports.gi.NetworkManager;
|
||||
const NMClient = imports.gi.NMClient;
|
||||
@@ -121,7 +122,7 @@ const NMNetworkMenuItem = new Lang.Class({
|
||||
this._secureIcon = new St.Icon({ style_class: 'popup-menu-icon' });
|
||||
if (this.bestAP._secType != NMAccessPointSecurity.UNKNOWN &&
|
||||
this.bestAP._secType != NMAccessPointSecurity.NONE)
|
||||
this._secureIcon.icon_name = 'network-wireless-encrypted';
|
||||
this._secureIcon.icon_name = 'network-wireless-encrypted-symbolic';
|
||||
this._icons.add_actor(this._secureIcon);
|
||||
},
|
||||
|
||||
@@ -132,9 +133,9 @@ const NMNetworkMenuItem = new Lang.Class({
|
||||
|
||||
_getIcon: function() {
|
||||
if (this.bestAP.mode == NM80211Mode.ADHOC)
|
||||
return 'network-workgroup';
|
||||
return 'network-workgroup-symbolic';
|
||||
else
|
||||
return 'network-wireless-signal-' + signalToIcon(this.bestAP.strength);
|
||||
return 'network-wireless-signal-' + signalToIcon(this.bestAP.strength) + '-symbolic';
|
||||
}
|
||||
});
|
||||
|
||||
@@ -167,15 +168,14 @@ const NMWiredSectionTitleMenuItem = new Lang.Class({
|
||||
|
||||
let newState = this._switch.state;
|
||||
|
||||
// Immediately reset the switch to false, it will be updated appropriately
|
||||
// by state-changed signals in devices (but fixes the VPN not being in sync
|
||||
// if the ActiveConnection object is never seen by libnm-glib)
|
||||
this._switch.setToggleState(false);
|
||||
|
||||
let ok;
|
||||
if (newState)
|
||||
this._device.activate();
|
||||
ok = this._device.activate();
|
||||
else
|
||||
this._device.deactivate();
|
||||
ok = this._device.deactivate();
|
||||
|
||||
if (!ok)
|
||||
this._switch.setToggleState(false);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -272,11 +272,14 @@ const NMDevice = new Lang.Class({
|
||||
if (this.device) {
|
||||
this.statusItem = new PopupMenu.PopupSwitchMenuItem(this._getDescription(), this.connected, { style_class: 'popup-subtitle-menu-item' });
|
||||
this._statusChanged = this.statusItem.connect('toggled', Lang.bind(this, function(item, state) {
|
||||
let ok;
|
||||
if (state)
|
||||
this.activate();
|
||||
ok = this.activate();
|
||||
else
|
||||
this.deactivate();
|
||||
this.emit('enabled-changed');
|
||||
ok = this.deactivate();
|
||||
|
||||
if (!ok)
|
||||
item.setToggleState(!state);
|
||||
}));
|
||||
|
||||
this._updateStatusItem();
|
||||
@@ -314,22 +317,35 @@ const NMDevice = new Lang.Class({
|
||||
|
||||
deactivate: function() {
|
||||
this.device.disconnect(null);
|
||||
return true;
|
||||
},
|
||||
|
||||
activate: function() {
|
||||
if (this._activeConnection)
|
||||
// nothing to do
|
||||
return;
|
||||
return true;
|
||||
|
||||
// pick the most recently used connection and connect to that
|
||||
// or if no connections ever set, create an automatic one
|
||||
if (this._connections.length > 0) {
|
||||
// If there is only one connection available, use that
|
||||
// Otherwise, if no connection is currently configured,
|
||||
// try automatic configuration (or summon the config dialog)
|
||||
if (this._connections.length == 1) {
|
||||
this._client.activate_connection(this._connections[0].connection, this.device, null, null);
|
||||
} else if (this._autoConnectionName) {
|
||||
let connection = this._createAutomaticConnection();
|
||||
if (connection)
|
||||
this._client.add_and_activate_connection(connection, this.device, null, null);
|
||||
return true;
|
||||
} else if (this._connections.length == 0) {
|
||||
return this._activateAutomaticConnection();
|
||||
}
|
||||
|
||||
return false;
|
||||
},
|
||||
|
||||
_activateAutomaticConnection: function() {
|
||||
let connection = this._createAutomaticConnection();
|
||||
if (connection) {
|
||||
this._client.add_and_activate_connection(connection, this.device, null, null);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
},
|
||||
|
||||
get connected() {
|
||||
@@ -760,7 +776,7 @@ const NMDeviceModem = new Lang.Class({
|
||||
},
|
||||
|
||||
_getSignalIcon: function() {
|
||||
return 'network-cellular-signal-' + signalToIcon(this.mobileDevice.signal_quality);
|
||||
return 'network-cellular-signal-' + signalToIcon(this.mobileDevice.signal_quality) + '-symbolic';
|
||||
},
|
||||
|
||||
_createSection: function() {
|
||||
@@ -786,13 +802,13 @@ const NMDeviceModem = new Lang.Class({
|
||||
this.parent();
|
||||
},
|
||||
|
||||
_createAutomaticConnection: function() {
|
||||
_activateAutomaticConnection: function() {
|
||||
// Mobile wizard is too complex for the shell UI and
|
||||
// is handled by the network panel
|
||||
Util.spawn(['gnome-control-center', 'network',
|
||||
'connect-3g', this.device.get_path()]);
|
||||
return null;
|
||||
}
|
||||
return true;
|
||||
},
|
||||
});
|
||||
|
||||
const NMDeviceBluetooth = new Lang.Class({
|
||||
@@ -821,6 +837,16 @@ const NMDeviceBluetooth = new Lang.Class({
|
||||
return connection;
|
||||
},
|
||||
|
||||
_activateAutomaticConnection: function() {
|
||||
// FIXME: DUN devices are configured like modems, so
|
||||
// we need to spawn the mobile wizard
|
||||
// but the network panel doesn't support bluetooth at the moment
|
||||
// so we just create an empty connection and hope
|
||||
// that this phone supports PAN
|
||||
|
||||
return this.parent();
|
||||
},
|
||||
|
||||
_makeConnectionName: function(device) {
|
||||
let name = device.name;
|
||||
if (name)
|
||||
@@ -1041,44 +1067,13 @@ const NMDeviceWireless = new Lang.Class({
|
||||
activate: function() {
|
||||
if (this._activeConnection)
|
||||
// nothing to do
|
||||
return;
|
||||
return true;
|
||||
|
||||
// among all visible networks, pick the last recently used connection
|
||||
let best = null;
|
||||
let bestApObj = null;
|
||||
let bestTime = 0;
|
||||
for (let i = 0; i < this._networks.length; i++) {
|
||||
let apObj = this._networks[i];
|
||||
for (let j = 0; j < apObj.connections.length; j++) {
|
||||
let connection = apObj.connections[j];
|
||||
if (connection._timestamp > bestTime) {
|
||||
best = connection;
|
||||
bestTime = connection._timestamp;
|
||||
bestApObj = apObj;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (best) {
|
||||
for (let i = 0; i < bestApObj.accessPoints.length; i++) {
|
||||
let ap = bestApObj.accessPoints[i];
|
||||
if (ap.connection_valid(best)) {
|
||||
this._client.activate_connection(best, this.device, ap.dbus_path, null);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// XXX: what else to do?
|
||||
// for now, just pick a random network
|
||||
// (this function is called in a corner case anyway, that is, only when
|
||||
// the user toggles the switch and has more than one wireless device)
|
||||
if (this._networks.length > 0) {
|
||||
let connection = this._createAutomaticConnection(this._networks[0]);
|
||||
let accessPoints = this._networks[0].accessPoints;
|
||||
this._client.add_and_activate_connection(connection, this.device, accessPoints[0].dbus_path, null);
|
||||
}
|
||||
// All possible policy we can have here is just broken
|
||||
// NM autoconnects when wifi devices are enabled, and if it
|
||||
// didn't, there is a good reason
|
||||
// User, pick a connection from the list, thank you
|
||||
return false;
|
||||
},
|
||||
|
||||
_notifySsidCb: function(accessPoint) {
|
||||
@@ -1468,7 +1463,7 @@ const NMDeviceWireless = new Lang.Class({
|
||||
{ reactive: false });
|
||||
else
|
||||
this._activeConnectionItem = new PopupMenu.PopupImageMenuItem(title,
|
||||
'network-wireless-connected',
|
||||
'network-wireless-connected-symbolic',
|
||||
{ reactive: false });
|
||||
this._activeConnectionItem.setShowDot(true);
|
||||
},
|
||||
@@ -1564,26 +1559,15 @@ const NMDeviceWireless = new Lang.Class({
|
||||
|
||||
const NMApplet = new Lang.Class({
|
||||
Name: 'NMApplet',
|
||||
Extends: PanelMenu.Button,
|
||||
Extends: PanelMenu.SystemStatusButton,
|
||||
|
||||
_init: function() {
|
||||
this.parent(0.0, _('Network'));
|
||||
this.parent('network-offline', _('Network'));
|
||||
|
||||
this._box = new St.BoxLayout({ name: 'networkMenu' });
|
||||
this.actor.add_actor (this._box);
|
||||
this.actor.add_style_class_name('panel-status-button');
|
||||
|
||||
this._primaryIcon = new St.Icon({ icon_name: 'network-offline',
|
||||
icon_type: St.IconType.SYMBOLIC,
|
||||
style_class: 'system-status-icon' });
|
||||
this._box.add_actor(this._primaryIcon);
|
||||
|
||||
this._secondaryIcon = new St.Icon({ icon_name: 'network-vpn',
|
||||
icon_type: St.IconType.SYMBOLIC,
|
||||
style_class: 'system-status-icon',
|
||||
visible: false });
|
||||
this._box.add_actor(this._secondaryIcon);
|
||||
this.secondaryIcon = this.addIcon(new Gio.ThemedIcon({ name: 'network-vpn-symbolic' }));
|
||||
this.secondaryIcon.hide();
|
||||
|
||||
this._isLocked = false;
|
||||
this._client = NMClient.Client.new();
|
||||
|
||||
this._statusSection = new PopupMenu.PopupMenuSection();
|
||||
@@ -1691,24 +1675,15 @@ const NMApplet = new Lang.Class({
|
||||
}));
|
||||
},
|
||||
|
||||
setIcon: function(iconName) {
|
||||
this._primaryIcon.icon_name = iconName;
|
||||
},
|
||||
|
||||
setLockedState: function(locked) {
|
||||
// FIXME: more design discussion is needed before we can
|
||||
// expose part of this menu
|
||||
|
||||
if (locked)
|
||||
this.menu.close();
|
||||
this.actor.reactive = !locked;
|
||||
this._isLocked = locked;
|
||||
this._syncNMState();
|
||||
},
|
||||
|
||||
_ensureSource: function() {
|
||||
if (!this._source) {
|
||||
this._source = new MessageTray.Source(_("Network Manager"),
|
||||
'network-transmit-receive',
|
||||
St.IconType.SYMBOLIC);
|
||||
'network-transmit-receive');
|
||||
|
||||
this._source.connect('destroy', Lang.bind(this, function() {
|
||||
this._source = null;
|
||||
@@ -1779,9 +1754,7 @@ const NMApplet = new Lang.Class({
|
||||
this._ensureSource();
|
||||
|
||||
let icon = new St.Icon({ icon_name: iconName,
|
||||
icon_type: St.IconType.SYMBOLIC,
|
||||
icon_size: this._source.ICON_SIZE
|
||||
});
|
||||
icon_size: MessageTray.NOTIFICATION_ICON_SIZE });
|
||||
device._notification = new MessageTray.Notification(this._source, title, text,
|
||||
{ icon: icon });
|
||||
device._notification.setUrgency(urgency);
|
||||
@@ -1798,7 +1771,7 @@ const NMApplet = new Lang.Class({
|
||||
wrapper._activationFailedId = wrapper.connect('activation-failed', Lang.bind(this, function(device, reason) {
|
||||
// XXX: nm-applet has no special text depending on reason
|
||||
// but I'm not sure of this generic message
|
||||
this._notifyForDevice(device, 'network-error',
|
||||
this._notifyForDevice(device, 'network-error-symbolic',
|
||||
_("Connection failed"),
|
||||
_("Activation of network connection failed"),
|
||||
MessageTray.Urgency.HIGH);
|
||||
@@ -1823,7 +1796,6 @@ const NMApplet = new Lang.Class({
|
||||
let wrapperClass = this._dtypes[device.get_device_type()];
|
||||
if (wrapperClass) {
|
||||
let wrapper = this._makeWrapperDevice(wrapperClass, device);
|
||||
|
||||
let section = this._devices[wrapper.category].section;
|
||||
let devices = this._devices[wrapper.category].devices;
|
||||
|
||||
@@ -2090,16 +2062,11 @@ const NMApplet = new Lang.Class({
|
||||
},
|
||||
|
||||
_syncNMState: function() {
|
||||
if (!this._client.manager_running) {
|
||||
log('NetworkManager is not running, hiding...');
|
||||
this.menu.close();
|
||||
this.actor.hide();
|
||||
return;
|
||||
} else
|
||||
this.actor.show();
|
||||
this.mainIcon.visible = this._client.manager_running;
|
||||
this.actor.visible = this.mainIcon.visible && !this._isLocked;
|
||||
|
||||
if (!this._client.networking_enabled) {
|
||||
this.setIcon('network-offline');
|
||||
this.setIcon('network-offline-symbolic');
|
||||
this._hideDevices();
|
||||
this._statusItem.label.text = _("Networking is disabled");
|
||||
this._statusSection.actor.show();
|
||||
@@ -2117,22 +2084,22 @@ const NMApplet = new Lang.Class({
|
||||
let hasMobileIcon = false;
|
||||
|
||||
if (!mc) {
|
||||
this.setIcon('network-offline');
|
||||
this.setIcon('network-offline-symbolic');
|
||||
} else if (mc.state == NetworkManager.ActiveConnectionState.ACTIVATING) {
|
||||
switch (mc._section) {
|
||||
case NMConnectionCategory.WWAN:
|
||||
this.setIcon('network-cellular-acquiring');
|
||||
this.setIcon('network-cellular-acquiring-symbolic');
|
||||
break;
|
||||
case NMConnectionCategory.WIRELESS:
|
||||
this.setIcon('network-wireless-acquiring');
|
||||
this.setIcon('network-wireless-acquiring-symbolic');
|
||||
break;
|
||||
case NMConnectionCategory.WIRED:
|
||||
this.setIcon('network-wired-acquiring');
|
||||
this.setIcon('network-wired-acquiring-symbolic');
|
||||
break;
|
||||
default:
|
||||
// fallback to a generic connected icon
|
||||
// (it could be a private connection of some other user)
|
||||
this.setIcon('network-wired-acquiring');
|
||||
this.setIcon('network-wired-acquiring-symbolic');
|
||||
}
|
||||
} else {
|
||||
let dev;
|
||||
@@ -2147,17 +2114,17 @@ const NMApplet = new Lang.Class({
|
||||
log('An active wireless connection, in infrastructure mode, involves no access point?');
|
||||
break;
|
||||
}
|
||||
this.setIcon('network-wireless-connected');
|
||||
this.setIcon('network-wireless-connected-symbolic');
|
||||
} else {
|
||||
if (this._activeAccessPoint != ap) {
|
||||
if (this._accessPointUpdateId)
|
||||
this._activeAccessPoint.disconnect(this._accessPointUpdateId);
|
||||
this._activeAccessPoint = ap;
|
||||
this._activeAccessPointUpdateId = ap.connect('notify::strength', Lang.bind(this, function() {
|
||||
this.setIcon('network-wireless-signal-' + signalToIcon(ap.strength));
|
||||
this.setIcon('network-wireless-signal-' + signalToIcon(ap.strength) + '-symbolic');
|
||||
}));
|
||||
}
|
||||
this.setIcon('network-wireless-signal-' + signalToIcon(ap.strength));
|
||||
this.setIcon('network-wireless-signal-' + signalToIcon(ap.strength) + '-symbolic');
|
||||
hasApIcon = true;
|
||||
}
|
||||
break;
|
||||
@@ -2166,7 +2133,7 @@ const NMApplet = new Lang.Class({
|
||||
break;
|
||||
}
|
||||
case NMConnectionCategory.WIRED:
|
||||
this.setIcon('network-wired');
|
||||
this.setIcon('network-wired-symbolic');
|
||||
break;
|
||||
case NMConnectionCategory.WWAN:
|
||||
dev = mc._primaryDevice;
|
||||
@@ -2176,7 +2143,7 @@ const NMApplet = new Lang.Class({
|
||||
}
|
||||
if (!dev.mobileDevice) {
|
||||
// this can happen for bluetooth in PAN mode
|
||||
this.setIcon('network-cellular-connected');
|
||||
this.setIcon('network-cellular-connected-symbolic');
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -2185,37 +2152,37 @@ const NMApplet = new Lang.Class({
|
||||
this._mobileUpdateDevice.disconnect(this._mobileUpdateId);
|
||||
this._mobileUpdateDevice = dev.mobileDevice;
|
||||
this._mobileUpdateId = dev.mobileDevice.connect('notify::signal-quality', Lang.bind(this, function() {
|
||||
this.setIcon('network-cellular-signal-' + signalToIcon(dev.mobileDevice.signal_quality));
|
||||
this.setIcon('network-cellular-signal-' + signalToIcon(dev.mobileDevice.signal_quality) + '-symbolic');
|
||||
}));
|
||||
}
|
||||
this.setIcon('network-cellular-signal-' + signalToIcon(dev.mobileDevice.signal_quality));
|
||||
this.setIcon('network-cellular-signal-' + signalToIcon(dev.mobileDevice.signal_quality) + '-symbolic');
|
||||
hasMobileIcon = true;
|
||||
break;
|
||||
default:
|
||||
// fallback to a generic connected icon
|
||||
// (it could be a private connection of some other user)
|
||||
this.setIcon('network-wired');
|
||||
this.setIcon('network-wired-symbolic');
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// update VPN indicator
|
||||
if (this._vpnConnection) {
|
||||
let vpnIconName = 'network-vpn';
|
||||
let vpnIconName = 'network-vpn-symbolic';
|
||||
if (this._vpnConnection.state == NetworkManager.ActiveConnectionState.ACTIVATING)
|
||||
vpnIconName = 'network-vpn-acquiring';
|
||||
vpnIconName = 'network-vpn-acquiring-symbolic';
|
||||
|
||||
// only show a separate icon when we're using a wireless/3g connection
|
||||
if (mc._section == NMConnectionCategory.WIRELESS ||
|
||||
mc._section == NMConnectionCategory.WWAN) {
|
||||
this._secondaryIcon.icon_name = vpnIconName;
|
||||
this._secondaryIcon.visible = true;
|
||||
this.secondaryIcon.icon_name = vpnIconName;
|
||||
this.secondaryIcon.show();
|
||||
} else {
|
||||
this.setIcon(vpnIconName);
|
||||
this._secondaryIcon.visible = false;
|
||||
this.secondaryIcon.hide();
|
||||
}
|
||||
} else {
|
||||
this._secondaryIcon.visible = false;
|
||||
this.secondaryIcon.hide();
|
||||
}
|
||||
|
||||
// cleanup stale signal connections
|
||||
|
||||
@@ -52,10 +52,11 @@ const Indicator = new Lang.Class({
|
||||
Extends: PanelMenu.SystemStatusButton,
|
||||
|
||||
_init: function() {
|
||||
this.parent('battery-missing', _("Battery"));
|
||||
this.parent('battery-missing-symbolic', _("Battery"));
|
||||
|
||||
this._proxy = new PowerManagerProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH);
|
||||
|
||||
this._isLocked = false;
|
||||
this._deviceItems = [ ];
|
||||
this._hasPrimary = false;
|
||||
this._primaryDeviceId = null;
|
||||
@@ -77,9 +78,8 @@ const Indicator = new Lang.Class({
|
||||
},
|
||||
|
||||
setLockedState: function(locked) {
|
||||
if (locked)
|
||||
this.menu.close();
|
||||
this.actor.reactive = !locked;
|
||||
this._isLocked = locked;
|
||||
this._syncIcon();
|
||||
},
|
||||
|
||||
_readPrimaryDevice: function() {
|
||||
@@ -150,16 +150,21 @@ const Indicator = new Lang.Class({
|
||||
}));
|
||||
},
|
||||
|
||||
_devicesChanged: function() {
|
||||
_syncIcon: function() {
|
||||
let icon = this._proxy.Icon;
|
||||
let hasIcon = false;
|
||||
|
||||
if (icon) {
|
||||
let gicon = Gio.icon_new_for_string(icon);
|
||||
this.setGIcon(gicon);
|
||||
this.actor.show();
|
||||
} else {
|
||||
this.menu.close();
|
||||
this.actor.hide();
|
||||
hasIcon = true;
|
||||
}
|
||||
this.mainIcon.visible = hasIcon;
|
||||
this.actor.visible = hasIcon && !this._isLocked;
|
||||
},
|
||||
|
||||
_devicesChanged: function() {
|
||||
this._syncIcon();
|
||||
this._readPrimaryDevice();
|
||||
this._readOtherDevices();
|
||||
}
|
||||
@@ -178,7 +183,6 @@ const DeviceItem = new Lang.Class({
|
||||
this._label = new St.Label({ text: this._deviceTypeToString(device_type) });
|
||||
|
||||
this._icon = new St.Icon({ gicon: Gio.icon_new_for_string(icon),
|
||||
icon_type: St.IconType.SYMBOLIC,
|
||||
style_class: 'popup-menu-icon' });
|
||||
|
||||
this._box.add_actor(this._icon);
|
||||
|
||||
@@ -12,14 +12,27 @@ const VOLUME_ADJUSTMENT_STEP = 0.05; /* Volume adjustment step in % */
|
||||
|
||||
const VOLUME_NOTIFY_ID = 1;
|
||||
|
||||
const Indicator = new Lang.Class({
|
||||
Name: 'VolumeIndicator',
|
||||
Extends: PanelMenu.SystemStatusButton,
|
||||
// Each Gvc.MixerControl is a connection to PulseAudio,
|
||||
// so it's better to make it a singleton
|
||||
let _mixerControl;
|
||||
function getMixerControl() {
|
||||
if (_mixerControl)
|
||||
return _mixerControl;
|
||||
|
||||
_init: function() {
|
||||
this.parent('audio-volume-muted', _("Volume"));
|
||||
_mixerControl = new Gvc.MixerControl({ name: 'GNOME Shell Volume Control' });
|
||||
_mixerControl.open();
|
||||
|
||||
this._control = new Gvc.MixerControl({ name: 'GNOME Shell Volume Control' });
|
||||
return _mixerControl;
|
||||
}
|
||||
|
||||
const VolumeMenu = new Lang.Class({
|
||||
Name: 'VolumeMenu',
|
||||
Extends: PopupMenu.PopupMenuSection,
|
||||
|
||||
_init: function(control) {
|
||||
this.parent();
|
||||
|
||||
this._control = control;
|
||||
this._control.connect('state-changed', Lang.bind(this, this._onControlStateChanged));
|
||||
this._control.connect('default-sink-changed', Lang.bind(this, this._readOutput));
|
||||
this._control.connect('default-source-changed', Lang.bind(this, this._readInput));
|
||||
@@ -35,10 +48,10 @@ const Indicator = new Lang.Class({
|
||||
this._outputSlider = new PopupMenu.PopupSliderMenuItem(0);
|
||||
this._outputSlider.connect('value-changed', Lang.bind(this, this._sliderChanged, '_output'));
|
||||
this._outputSlider.connect('drag-end', Lang.bind(this, this._notifyVolumeChange));
|
||||
this.menu.addMenuItem(this._outputTitle);
|
||||
this.menu.addMenuItem(this._outputSlider);
|
||||
this.addMenuItem(this._outputTitle);
|
||||
this.addMenuItem(this._outputSlider);
|
||||
|
||||
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||
|
||||
this._input = null;
|
||||
this._inputVolumeId = 0;
|
||||
@@ -47,22 +60,11 @@ const Indicator = new Lang.Class({
|
||||
this._inputSlider = new PopupMenu.PopupSliderMenuItem(0);
|
||||
this._inputSlider.connect('value-changed', Lang.bind(this, this._sliderChanged, '_input'));
|
||||
this._inputSlider.connect('drag-end', Lang.bind(this, this._notifyVolumeChange));
|
||||
this.menu.addMenuItem(this._inputTitle);
|
||||
this.menu.addMenuItem(this._inputSlider);
|
||||
|
||||
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||
this.menu.addSettingsAction(_("Sound Settings"), 'gnome-sound-panel.desktop');
|
||||
|
||||
this.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent));
|
||||
this._control.open();
|
||||
this.addMenuItem(this._inputTitle);
|
||||
this.addMenuItem(this._inputSlider);
|
||||
},
|
||||
|
||||
setLockedState: function(locked) {
|
||||
this.menu.setSettingsVisibility(!locked);
|
||||
},
|
||||
|
||||
_onScrollEvent: function(actor, event) {
|
||||
let direction = event.get_scroll_direction();
|
||||
scroll: function(direction) {
|
||||
let currentVolume = this._output.volume;
|
||||
|
||||
if (direction == Clutter.ScrollDirection.DOWN) {
|
||||
@@ -88,9 +90,8 @@ const Indicator = new Lang.Class({
|
||||
if (this._control.get_state() == Gvc.MixerControlState.READY) {
|
||||
this._readOutput();
|
||||
this._readInput();
|
||||
this.actor.show();
|
||||
} else {
|
||||
this.actor.hide();
|
||||
this.emit('icon-changed', null);
|
||||
}
|
||||
},
|
||||
|
||||
@@ -109,7 +110,7 @@ const Indicator = new Lang.Class({
|
||||
this._volumeChanged (null, null, '_output');
|
||||
} else {
|
||||
this._outputSlider.setValue(0);
|
||||
this.setIcon('audio-volume-muted-symbolic');
|
||||
this.emit('icon-changed', 'audio-volume-muted-symbolic');
|
||||
}
|
||||
},
|
||||
|
||||
@@ -155,14 +156,14 @@ const Indicator = new Lang.Class({
|
||||
|
||||
_volumeToIcon: function(volume) {
|
||||
if (volume <= 0) {
|
||||
return 'audio-volume-muted';
|
||||
return 'audio-volume-muted-symbolic';
|
||||
} else {
|
||||
let n = Math.floor(3 * volume / this._volumeMax) + 1;
|
||||
if (n < 2)
|
||||
return 'audio-volume-low';
|
||||
return 'audio-volume-low-symbolic';
|
||||
if (n >= 3)
|
||||
return 'audio-volume-high';
|
||||
return 'audio-volume-medium';
|
||||
return 'audio-volume-high-symbolic';
|
||||
return 'audio-volume-medium-symbolic';
|
||||
}
|
||||
},
|
||||
|
||||
@@ -196,15 +197,55 @@ const Indicator = new Lang.Class({
|
||||
slider.setValue(muted ? 0 : (this[property].volume / this._volumeMax));
|
||||
if (property == '_output') {
|
||||
if (muted)
|
||||
this.setIcon('audio-volume-muted');
|
||||
this.emit('icon-changed', 'audio-volume-muted-symbolic');
|
||||
else
|
||||
this.setIcon(this._volumeToIcon(this._output.volume));
|
||||
this.emit('icon-changed', this._volumeToIcon(this._output.volume));
|
||||
}
|
||||
},
|
||||
|
||||
_volumeChanged: function(object, param_spec, property) {
|
||||
this[property+'Slider'].setValue(this[property].volume / this._volumeMax);
|
||||
if (property == '_output' && !this._output.is_muted)
|
||||
this.setIcon(this._volumeToIcon(this._output.volume));
|
||||
this.emit('icon-changed', this._volumeToIcon(this._output.volume));
|
||||
}
|
||||
});
|
||||
|
||||
const Indicator = new Lang.Class({
|
||||
Name: 'VolumeIndicator',
|
||||
Extends: PanelMenu.SystemStatusButton,
|
||||
|
||||
_init: function() {
|
||||
this.parent('audio-volume-muted-symbolic', _("Volume"));
|
||||
|
||||
this._isLocked = false;
|
||||
|
||||
this._control = getMixerControl();
|
||||
this._volumeMenu = new VolumeMenu(this._control);
|
||||
this._volumeMenu.connect('icon-changed', Lang.bind(this, function(menu, icon) {
|
||||
this._hasPulseAudio = (icon != null);
|
||||
this.setIcon(icon);
|
||||
this._syncVisibility();
|
||||
}));
|
||||
|
||||
this.menu.addMenuItem(this._volumeMenu);
|
||||
|
||||
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||
this.menu.addSettingsAction(_("Sound Settings"), 'gnome-sound-panel.desktop');
|
||||
|
||||
this.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent));
|
||||
},
|
||||
|
||||
setLockedState: function(locked) {
|
||||
this._isLocked = locked;
|
||||
this._syncVisibility();
|
||||
},
|
||||
|
||||
_syncVisibility: function() {
|
||||
this.actor.visible = this._hasPulseAudio && !this._isLocked;
|
||||
this.mainIcon.visible = this._hasPulseAudio;
|
||||
},
|
||||
|
||||
_onScrollEvent: function(actor, event) {
|
||||
this._volumeMenu.scroll(event.get_scroll_direction());
|
||||
}
|
||||
});
|
||||
|
||||
@@ -383,8 +383,7 @@ const Client = new Lang.Class({
|
||||
_ensureSubscriptionSource: function() {
|
||||
if (this._subscriptionSource == null) {
|
||||
this._subscriptionSource = new MessageTray.Source(_("Subscription request"),
|
||||
'gtk-dialog-question',
|
||||
St.IconType.FULLCOLOR);
|
||||
'gtk-dialog-question');
|
||||
Main.messageTray.add(this._subscriptionSource);
|
||||
this._subscriptionSource.connect('destroy', Lang.bind(this, function () {
|
||||
this._subscriptionSource = null;
|
||||
@@ -420,8 +419,7 @@ const Client = new Lang.Class({
|
||||
_ensureAccountSource: function() {
|
||||
if (this._accountSource == null) {
|
||||
this._accountSource = new MessageTray.Source(_("Connection error"),
|
||||
'gtk-dialog-error',
|
||||
St.IconType.FULLCOLOR);
|
||||
'gtk-dialog-error');
|
||||
Main.messageTray.add(this._accountSource);
|
||||
this._accountSource.connect('destroy', Lang.bind(this, function () {
|
||||
this._accountSource = null;
|
||||
@@ -497,7 +495,6 @@ const ChatSource = new Lang.Class({
|
||||
this._iconBox.child = textureCache.load_uri_async(uri, this._iconBox._size, this._iconBox._size);
|
||||
} else {
|
||||
this._iconBox.child = new St.Icon({ icon_name: 'avatar-default',
|
||||
icon_type: St.IconType.FULLCOLOR,
|
||||
icon_size: this._iconBox._size });
|
||||
}
|
||||
|
||||
@@ -506,8 +503,7 @@ const ChatSource = new Lang.Class({
|
||||
|
||||
createSecondaryIcon: function() {
|
||||
let iconBox = new St.Bin();
|
||||
iconBox.child = new St.Icon({ style_class: 'secondary-icon',
|
||||
icon_type: St.IconType.FULLCOLOR });
|
||||
iconBox.child = new St.Icon({ style_class: 'secondary-icon' });
|
||||
let presenceType = this._contact.get_presence_type();
|
||||
|
||||
switch (presenceType) {
|
||||
@@ -1197,7 +1193,6 @@ const SubscriptionRequestNotification = new Lang.Class({
|
||||
}
|
||||
else {
|
||||
iconBox.child = new St.Icon({ icon_name: 'avatar-default',
|
||||
icon_type: St.IconType.FULLCOLOR,
|
||||
icon_size: iconBox._size });
|
||||
}
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ const UserWidget = new Lang.Class({
|
||||
this.actor = new St.BoxLayout({ style_class: 'unlock-dialog-user-name-container',
|
||||
vertical: false });
|
||||
|
||||
this._avatar = new UserMenu.UserAvatarWidget(user, { reactive: false });
|
||||
this._avatar = new UserMenu.UserAvatarWidget(user);
|
||||
this.actor.add(this._avatar.actor,
|
||||
{ x_fill: true, y_fill: true });
|
||||
|
||||
@@ -166,6 +166,7 @@ const UnlockDialog = new Lang.Class({
|
||||
},
|
||||
|
||||
_reset: function() {
|
||||
this._userVerifier.clear();
|
||||
this._userVerifier.begin(this._userName, new Batch.Hold());
|
||||
},
|
||||
|
||||
|
||||
@@ -48,9 +48,12 @@ const UserAvatarWidget = new Lang.Class({
|
||||
|
||||
_init: function(user, params) {
|
||||
this._user = user;
|
||||
params = Params.parse(params, { reactive: true });
|
||||
params = Params.parse(params, { reactive: false,
|
||||
iconSize: DIALOG_ICON_SIZE,
|
||||
styleClass: 'status-chooser-user-icon' });
|
||||
this._iconSize = params.iconSize;
|
||||
|
||||
this.actor = new St.Bin({ style_class: 'status-chooser-user-icon',
|
||||
this.actor = new St.Bin({ style_class: params.styleClass,
|
||||
track_hover: params.reactive,
|
||||
reactive: params.reactive });
|
||||
},
|
||||
@@ -66,9 +69,8 @@ const UserAvatarWidget = new Lang.Class({
|
||||
this.actor.style = 'background-image: url("%s");'.format(iconFile);
|
||||
} else {
|
||||
this.actor.style = null;
|
||||
this.actor.child = new St.Icon({ icon_name: 'avatar-default',
|
||||
icon_type: St.IconType.SYMBOLIC,
|
||||
icon_size: DIALOG_ICON_SIZE });
|
||||
this.actor.child = new St.Icon({ icon_name: 'avatar-default-symbolic',
|
||||
icon_size: this._iconSize });
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -144,7 +146,7 @@ const IMStatusChooserItem = new Lang.Class({
|
||||
this._userManager = AccountsService.UserManager.get_default();
|
||||
this._user = this._userManager.get_user(GLib.get_user_name());
|
||||
|
||||
this._avatar = new UserAvatarWidget(this._user);
|
||||
this._avatar = new UserAvatarWidget(this._user, { reactive: true });
|
||||
this._iconBin = new St.Button({ child: this._avatar.actor });
|
||||
this.addActor(this._iconBin);
|
||||
|
||||
@@ -164,22 +166,22 @@ const IMStatusChooserItem = new Lang.Class({
|
||||
|
||||
let item;
|
||||
|
||||
item = new IMStatusItem(_("Available"), 'user-available');
|
||||
item = new IMStatusItem(_("Available"), 'user-available-symbolic');
|
||||
this._combo.addMenuItem(item, IMStatus.AVAILABLE);
|
||||
|
||||
item = new IMStatusItem(_("Busy"), 'user-busy');
|
||||
item = new IMStatusItem(_("Busy"), 'user-busy-symbolic');
|
||||
this._combo.addMenuItem(item, IMStatus.BUSY);
|
||||
|
||||
item = new IMStatusItem(_("Invisible"), 'user-invisible');
|
||||
item = new IMStatusItem(_("Invisible"), 'user-invisible-symbolic');
|
||||
this._combo.addMenuItem(item, IMStatus.HIDDEN);
|
||||
|
||||
item = new IMStatusItem(_("Away"), 'user-away');
|
||||
item = new IMStatusItem(_("Away"), 'user-away-symbolic');
|
||||
this._combo.addMenuItem(item, IMStatus.AWAY);
|
||||
|
||||
item = new IMStatusItem(_("Idle"), 'user-idle');
|
||||
item = new IMStatusItem(_("Idle"), 'user-idle-symbolic');
|
||||
this._combo.addMenuItem(item, IMStatus.IDLE);
|
||||
|
||||
item = new IMStatusItem(_("Unavailable"), 'user-offline');
|
||||
item = new IMStatusItem(_("Unavailable"), 'user-offline-symbolic');
|
||||
this._combo.addMenuItem(item, IMStatus.OFFLINE);
|
||||
|
||||
this._combo.connect('active-item-changed',
|
||||
@@ -480,19 +482,19 @@ const UserMenuButton = new Lang.Class({
|
||||
box.add(this._iconBox, { y_align: St.Align.MIDDLE, y_fill: false });
|
||||
|
||||
let textureCache = St.TextureCache.get_default();
|
||||
this._offlineIcon = new St.Icon({ icon_name: 'user-offline',
|
||||
this._offlineIcon = new St.Icon({ icon_name: 'user-offline-symbolic',
|
||||
style_class: 'popup-menu-icon' });
|
||||
this._availableIcon = new St.Icon({ icon_name: 'user-available',
|
||||
this._availableIcon = new St.Icon({ icon_name: 'user-available-symbolic',
|
||||
style_class: 'popup-menu-icon' });
|
||||
this._busyIcon = new St.Icon({ icon_name: 'user-busy',
|
||||
this._busyIcon = new St.Icon({ icon_name: 'user-busy-symbolic',
|
||||
style_class: 'popup-menu-icon' });
|
||||
this._invisibleIcon = new St.Icon({ icon_name: 'user-invisible',
|
||||
this._invisibleIcon = new St.Icon({ icon_name: 'user-invisible-symbolic',
|
||||
style_class: 'popup-menu-icon' });
|
||||
this._awayIcon = new St.Icon({ icon_name: 'user-away',
|
||||
this._awayIcon = new St.Icon({ icon_name: 'user-away-symbolic',
|
||||
style_class: 'popup-menu-icon' });
|
||||
this._idleIcon = new St.Icon({ icon_name: 'user-idle',
|
||||
this._idleIcon = new St.Icon({ icon_name: 'user-idle-symbolic',
|
||||
style_class: 'popup-menu-icon' });
|
||||
this._pendingIcon = new St.Icon({ icon_name: 'user-status-pending',
|
||||
this._pendingIcon = new St.Icon({ icon_name: 'user-status-pending-symbolic',
|
||||
style_class: 'popup-menu-icon' });
|
||||
|
||||
this._accountMgr.connect('most-available-presence-changed',
|
||||
|
||||
@@ -73,11 +73,9 @@ const ViewSelector = new Lang.Class({
|
||||
global.stage.connect('notify::key-focus', Lang.bind(this, this._onStageKeyFocusChanged));
|
||||
|
||||
this._inactiveIcon = new St.Icon({ style_class: 'search-entry-icon',
|
||||
icon_name: 'edit-find',
|
||||
icon_type: St.IconType.SYMBOLIC });
|
||||
icon_name: 'edit-find-symbolic' });
|
||||
this._activeIcon = new St.Icon({ style_class: 'search-entry-icon',
|
||||
icon_name: 'edit-clear',
|
||||
icon_type: St.IconType.SYMBOLIC });
|
||||
icon_name: 'edit-clear-symbolic' });
|
||||
this._entry.set_secondary_icon(this._inactiveIcon);
|
||||
|
||||
this._iconClickedId = 0;
|
||||
@@ -85,15 +83,15 @@ const ViewSelector = new Lang.Class({
|
||||
|
||||
this._workspacesDisplay = new WorkspacesView.WorkspacesDisplay();
|
||||
this._workspacesPage = this._addPage(this._workspacesDisplay.actor, null,
|
||||
_("Windows"), 'text-x-generic');
|
||||
_("Windows"), 'text-x-generic-symbolic');
|
||||
|
||||
this._appDisplay = new AppDisplay.AllAppDisplay();
|
||||
this._appsPage = this._addPage(this._appDisplay.actor, null,
|
||||
_("Applications"), 'system-run');
|
||||
_("Applications"), 'system-run-symbolic');
|
||||
|
||||
this._searchResults = new SearchDisplay.SearchResults(this._searchSystem);
|
||||
this._searchPage = this._addPage(this._searchResults.actor, this._entry,
|
||||
_("Search"), 'edit-find');
|
||||
_("Search"), 'edit-find-symbolic');
|
||||
|
||||
// Default search providers
|
||||
// Wanda comes obviously first
|
||||
|
||||
@@ -55,9 +55,7 @@ const WandaIcon = new Lang.Class({
|
||||
|
||||
if (!this._imageFile) {
|
||||
return new St.Icon({ icon_name: 'face-smile',
|
||||
icon_type: St.IconType.FULLCOLOR,
|
||||
icon_size: iconSize
|
||||
});
|
||||
icon_size: iconSize });
|
||||
}
|
||||
|
||||
this._animations = St.TextureCache.get_default().load_sliced_image(this._imageFile, this._imgWidth, this._imgHeight);
|
||||
@@ -183,7 +181,6 @@ const WandaSearchProvider = new Lang.Class({
|
||||
// triggers an assertion failure)
|
||||
return St.TextureCache.get_default().load_icon_name(null,
|
||||
'face-smile',
|
||||
St.IconType.FULLCOLOR,
|
||||
iconSize);
|
||||
}
|
||||
}]);
|
||||
|
||||
@@ -27,16 +27,24 @@ const WindowDimmer = new Lang.Class({
|
||||
this._brightnessEffect = new Clutter.BrightnessContrastEffect();
|
||||
actor.add_effect(this._brightnessEffect);
|
||||
this.actor = actor;
|
||||
this._enabled = true;
|
||||
this._dimFactor = 0.0;
|
||||
this._syncEnabled();
|
||||
},
|
||||
|
||||
_syncEnabled: function() {
|
||||
this._brightnessEffect.enabled = (this._enabled && this._dimFactor > 0);
|
||||
},
|
||||
|
||||
setEnabled: function(enabled) {
|
||||
this._brightnessEffect.enabled = enabled;
|
||||
this._enabled = enabled;
|
||||
this._syncEnabled();
|
||||
},
|
||||
|
||||
set dimFactor(factor) {
|
||||
this._dimFactor = factor;
|
||||
this._brightnessEffect.set_brightness(factor * DIM_BRIGHTNESS);
|
||||
this._syncEnabled();
|
||||
},
|
||||
|
||||
get dimFactor() {
|
||||
@@ -45,10 +53,17 @@ const WindowDimmer = new Lang.Class({
|
||||
});
|
||||
|
||||
function getWindowDimmer(actor) {
|
||||
if (!actor._windowDimmer)
|
||||
actor._windowDimmer = new WindowDimmer(actor);
|
||||
let enabled = Meta.prefs_get_attach_modal_dialogs();
|
||||
if (actor._windowDimmer)
|
||||
actor._windowDimmer.setEnabled(enabled);
|
||||
|
||||
return actor._windowDimmer;
|
||||
if (enabled) {
|
||||
if (!actor._windowDimmer)
|
||||
actor._windowDimmer = new WindowDimmer(actor);
|
||||
return actor._windowDimmer;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
const WindowManager = new Lang.Class({
|
||||
@@ -255,9 +270,7 @@ const WindowManager = new Lang.Class({
|
||||
if (!actor)
|
||||
return;
|
||||
let dimmer = getWindowDimmer(actor);
|
||||
let enabled = Meta.prefs_get_attach_modal_dialogs();
|
||||
dimmer.setEnabled(enabled);
|
||||
if (!enabled)
|
||||
if (!dimmer)
|
||||
return;
|
||||
Tweener.addTween(dimmer,
|
||||
{ dimFactor: 1.0,
|
||||
@@ -271,15 +284,12 @@ const WindowManager = new Lang.Class({
|
||||
if (!actor)
|
||||
return;
|
||||
let dimmer = getWindowDimmer(actor);
|
||||
let enabled = Meta.prefs_get_attach_modal_dialogs();
|
||||
dimmer.setEnabled(enabled);
|
||||
if (!enabled)
|
||||
if (!dimmer)
|
||||
return;
|
||||
Tweener.addTween(dimmer,
|
||||
{ dimFactor: 0.0,
|
||||
time: UNDIM_TIME,
|
||||
transition: 'linear'
|
||||
});
|
||||
transition: 'linear' });
|
||||
},
|
||||
|
||||
_mapWindow : function(shellwm, actor) {
|
||||
|
||||
@@ -986,15 +986,10 @@ const Workspace = new Lang.Class({
|
||||
if (this._reservedSlot == clone)
|
||||
return;
|
||||
|
||||
if (clone && this.containsMetaWindow(clone.metaWindow)) {
|
||||
this._reservedSlot = null;
|
||||
this.positionWindows(WindowPositionFlags.ANIMATE);
|
||||
return;
|
||||
}
|
||||
if (clone)
|
||||
this._reservedSlot = clone;
|
||||
else
|
||||
this._reservedSlot = null;
|
||||
if (clone && this.containsMetaWindow(clone.metaWindow))
|
||||
clone = null;
|
||||
|
||||
this._reservedSlot = clone;
|
||||
this.positionWindows(WindowPositionFlags.ANIMATE);
|
||||
},
|
||||
|
||||
|
||||
@@ -1045,9 +1045,16 @@ const ThumbnailsBox = new Lang.Class({
|
||||
childBox.y2 = box.y2;
|
||||
this._background.allocate(childBox, flags);
|
||||
|
||||
let indicatorY = this._indicatorY;
|
||||
let indicatorY1 = this._indicatorY;
|
||||
let indicatorY2;
|
||||
// when not animating, the workspace position overrides this._indicatorY
|
||||
let indicatorWorkspace = !this._animatingIndicator ? global.screen.get_active_workspace() : null;
|
||||
let indicatorThemeNode = this._indicator.get_theme_node();
|
||||
|
||||
let indicatorTopFullBorder = indicatorThemeNode.get_padding(St.Side.TOP) + indicatorThemeNode.get_border_width(St.Side.TOP);
|
||||
let indicatorBottomFullBorder = indicatorThemeNode.get_padding(St.Side.BOTTOM) + indicatorThemeNode.get_border_width(St.Side.BOTTOM);
|
||||
let indicatorLeftFullBorder = indicatorThemeNode.get_padding(St.Side.LEFT) + indicatorThemeNode.get_border_width(St.Side.LEFT);
|
||||
let indicatorRightFullBorder = indicatorThemeNode.get_padding(St.Side.RIGHT) + indicatorThemeNode.get_border_width(St.Side.RIGHT);
|
||||
|
||||
let y = contentBox.y1;
|
||||
|
||||
@@ -1093,8 +1100,10 @@ const ThumbnailsBox = new Lang.Class({
|
||||
let y2 = Math.round(y + thumbnailHeight);
|
||||
let roundedVScale = (y2 - y1) / portholeHeight;
|
||||
|
||||
if (thumbnail.metaWorkspace == indicatorWorkspace)
|
||||
indicatorY = y1;
|
||||
if (thumbnail.metaWorkspace == indicatorWorkspace) {
|
||||
indicatorY1 = y1;
|
||||
indicatorY2 = y2;
|
||||
}
|
||||
|
||||
// Allocating a scaled actor is funny - x1/y1 correspond to the origin
|
||||
// of the actor, but x2/y2 are increased by the *unscaled* size.
|
||||
@@ -1119,8 +1128,10 @@ const ThumbnailsBox = new Lang.Class({
|
||||
childBox.x1 = contentBox.x2 - thumbnailWidth;
|
||||
childBox.x2 = contentBox.x2;
|
||||
}
|
||||
childBox.y1 = indicatorY;
|
||||
childBox.y2 = childBox.y1 + thumbnailHeight;
|
||||
childBox.x1 -= indicatorLeftFullBorder;
|
||||
childBox.x2 += indicatorRightFullBorder;
|
||||
childBox.y1 = indicatorY1 - indicatorTopFullBorder;
|
||||
childBox.y2 = (indicatorY2 ? indicatorY2 : (indicatorY1 + thumbnailHeight)) + indicatorBottomFullBorder;
|
||||
this._indicator.allocate(childBox, flags);
|
||||
},
|
||||
|
||||
@@ -1135,7 +1146,9 @@ const ThumbnailsBox = new Lang.Class({
|
||||
}
|
||||
|
||||
this._animatingIndicator = true;
|
||||
this.indicatorY = this._indicator.allocation.y1;
|
||||
let indicatorThemeNode = this._indicator.get_theme_node();
|
||||
let indicatorTopFullBorder = indicatorThemeNode.get_padding(St.Side.TOP) + indicatorThemeNode.get_border_width(St.Side.TOP);
|
||||
this.indicatorY = this._indicator.allocation.y1 + indicatorTopFullBorder;
|
||||
Tweener.addTween(this,
|
||||
{ indicatorY: thumbnail.actor.allocation.y1,
|
||||
time: WorkspacesView.WORKSPACE_SWITCH_TIME,
|
||||
|
||||
@@ -317,8 +317,6 @@ const WorkspacesView = new Lang.Class({
|
||||
|
||||
this._updateWorkspaceActors(false);
|
||||
}
|
||||
|
||||
this._scrollToActive(true);
|
||||
},
|
||||
|
||||
_activeWorkspaceChanged: function(wm, from, to, direction) {
|
||||
@@ -870,15 +868,10 @@ const WorkspacesDisplay = new Lang.Class({
|
||||
let clipX = rtl ? x + controlsVisible : x;
|
||||
let clipY = y + (fullHeight - clipHeight) / 2;
|
||||
|
||||
if (this._zoomOut) {
|
||||
width -= controlsNatural;
|
||||
if (rtl)
|
||||
x += controlsNatural;
|
||||
} else {
|
||||
width -= controlsVisible;
|
||||
if (rtl)
|
||||
x += controlsVisible;
|
||||
}
|
||||
let widthAdjust = this._zoomOut ? controlsNatural : controlsVisible;
|
||||
width -= widthAdjust;
|
||||
if (rtl)
|
||||
x += widthAdjust;
|
||||
|
||||
height = (fullHeight / fullWidth) * width;
|
||||
let difference = fullHeight - height;
|
||||
|
||||
@@ -35,6 +35,7 @@ js/ui/shellMountOperation.js
|
||||
js/ui/status/accessibility.js
|
||||
js/ui/status/bluetooth.js
|
||||
js/ui/status/keyboard.js
|
||||
js/ui/status/lockScreenMenu.js
|
||||
js/ui/status/network.js
|
||||
js/ui/status/power.js
|
||||
js/ui/status/volume.js
|
||||
|
||||
347
po/as.po
347
po/as.po
@@ -9,8 +9,8 @@ msgstr ""
|
||||
"Project-Id-Version: gnome-shell master\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug."
|
||||
"cgi?product=gnome-shell&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2012-08-08 23:36+0000\n"
|
||||
"PO-Revision-Date: 2012-08-09 12:58+0530\n"
|
||||
"POT-Creation-Date: 2012-08-21 18:33+0000\n"
|
||||
"PO-Revision-Date: 2012-08-27 14:44+0530\n"
|
||||
"Last-Translator: Nilamdyuti Goswami <ngoswami@redhat.com>\n"
|
||||
"Language-Team: as_IN <kde-i18n-doc@kde.org>\n"
|
||||
"Language: \n"
|
||||
@@ -26,7 +26,7 @@ msgstr "GNOME শ্বেল"
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:2
|
||||
msgid "Window management and application launching"
|
||||
msgstr "উইন্ডো ব্যৱস্থাপনা আৰু অনুপ্ৰয়োগৰ লঞ্চ"
|
||||
msgstr "উইন্ডো ব্যৱস্থাপনা আৰু এপ্লিকেচনৰ লঞ্চ"
|
||||
|
||||
#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1
|
||||
#: ../js/extensionPrefs/main.js:152
|
||||
@@ -69,7 +69,7 @@ msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:5
|
||||
msgid "Whether to collect stats about applications usage"
|
||||
msgstr "অনুপ্ৰয়োগ ব্যৱহাৰ বিষয়ে পৰিসংখ্যা সংগ্ৰহ কৰা হব নে"
|
||||
msgstr "এপ্লিকেচন ব্যৱহাৰ বিষয়ে পৰিসংখ্যা সংগ্ৰহ কৰা হব নে"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:6
|
||||
msgid ""
|
||||
@@ -78,20 +78,20 @@ msgid ""
|
||||
"want to disable this for privacy reasons. Please note that doing so won't "
|
||||
"remove already saved data."
|
||||
msgstr ""
|
||||
"শ্বেলে সাধাৰণত সক্ৰিয় অনুপ্ৰয়োগসমূহ মনিটৰ কৰে যাতে সকলোতকৈ অধিক ব্যৱহৃতসমূহ "
|
||||
"শ্বেলে সাধাৰণত সক্ৰিয় এপ্লিকেচনসমূহ মনিটৰ কৰে যাতে সকলোতকৈ অধিক ব্যৱহৃতসমূহ "
|
||||
"(উদাহৰনস্বৰুপে লঞ্চাৰসমূহত) ক দেখুৱাব পাৰে। যত এই তথ্য গোপন ৰখা হব, আপুনি ইয়াক "
|
||||
"গোপনীয়তা কাৰণসমূহৰ কাৰণে অসামৰ্থবান কৰিব পাৰে। অনুগ্ৰহ কৰি মন কৰিব যে এনেকুৱা "
|
||||
"কৰাত ইতিমধ্যে সংৰক্ষীত তথ্য আতৰি নাযায়।"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:7
|
||||
msgid "List of desktop file IDs for favorite applications"
|
||||
msgstr "পছন্দৰ অনুপ্ৰয়োগসমূহৰ কাৰণে ডেস্কটপ নথিপত্ৰ IDসমূহৰ তালিকা"
|
||||
msgstr "পছন্দৰ এপ্লিকেচনসমূহৰ কাৰণে ডেস্কটপ ফাইল IDসমূহৰ তালিকা"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:8
|
||||
msgid ""
|
||||
"The applications corresponding to these identifiers will be displayed in the "
|
||||
"favorites area."
|
||||
msgstr "এই পৰিচয়কসমূহৰ লগত আনুষংগিক অনুপ্ৰয়োগসমূহ পছন্দৰ স্থানত প্ৰদৰ্শীত কৰা হব।"
|
||||
msgstr "এই পৰিচয়কসমূহৰ লগত আনুষংগিক এপ্লিকেচনসমূহ পছন্দৰ স্থানত প্ৰদৰ্শীত কৰা হব।"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:9
|
||||
msgid "disabled OpenSearch providers"
|
||||
@@ -131,19 +131,17 @@ msgstr "যদি সত্য, ISO সপ্তাহ তাৰিখক কে
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
|
||||
msgid "Keybinding to open the application menu"
|
||||
msgstr "অনুপ্ৰয়োগ মেনু খোলিবলে Keybinding"
|
||||
msgstr "এপ্লিকেচন মেনু খোলিবলে Keybinding"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
|
||||
msgid "Keybinding to open the application menu."
|
||||
msgstr "অনুপ্ৰয়োগ মেনু খোলিবলে Keybinding।"
|
||||
msgstr "এপ্লিকেচন মেনু খোলিবলে Keybinding।"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
|
||||
#| msgid "Keybinding to toggle the screen recorder"
|
||||
msgid "Keybinding to toggle the visibility of the message tray"
|
||||
msgstr "বাৰ্তা ট্ৰেৰ দৃশ্যমানতা টগ'ল কৰিবলে Keybinding"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
||||
#| msgid "Keybinding to toggle the screen recorder"
|
||||
msgid "Keybinding to toggle the visibility of the message tray."
|
||||
msgstr "বাৰ্তা ট্ৰেৰ দৃশ্যমানতা টগ'ল কৰিবলে Keybinding।"
|
||||
|
||||
@@ -196,7 +194,7 @@ msgstr ""
|
||||
"ৰেকৰ্ডিংসমূহ এনক'ড কৰোতে ব্যৱহৃত GStreamer পাইপলাইন সংহতি কৰে। ই gst-launch ৰ "
|
||||
"কাৰণে ব্যৱহৃত বাক্যবিন্যাস অনুকৰন কৰে। পাইপলাইনৰ এটা অসংযোগিত চিঙ্ক পেড থাকিব লাগে "
|
||||
"যত ৰেকৰ্ড কৰা ভিডিঅ' ৰেকৰ্ড কৰা হয়। ইয়াৰ সাধাৰণত এটা অসংযোগিত উৎস পেড থাকিব; "
|
||||
"সেই পেডৰ পৰা আউটপুট এটা আউটপুট নথিপত্ৰলে লিখা হব। যি কি নহওক পাইপলাইনে নিজৰ "
|
||||
"সেই পেডৰ পৰা আউটপুট এটা আউটপুট ফাইললে লিখা হব। যি কি নহওক পাইপলাইনে নিজৰ "
|
||||
"আউটপুটৰ যত্ন লব পাৰে - ইয়াৰ হওতো আউটপুটক shout2send অথবা সমসাময়িকৰে এটা icecast "
|
||||
"চাৰ্ভাৰত পঠাবলে ব্যৱহাৰ হব পাৰে। যেতিয়া এটা ৰিক্ত মানলে অসংহিত বা সংহিত, "
|
||||
"অবিকল্পিত পাইপলাইন ব্যৱহাৰ কৰা হব। এইটো বৰ্তমানত 'vp8enc quality=8 speed=6 "
|
||||
@@ -213,9 +211,9 @@ msgid ""
|
||||
"current date, and use this extension. It should be changed when recording to "
|
||||
"a different container format."
|
||||
msgstr ""
|
||||
"ৰেকৰ্ড কৰা screencasts ৰ কাৰণে নথিপত্ৰ নাম বৰ্তমান তাৰিখৰ উপৰত ভিত্তি কৰি এটা "
|
||||
"অবিকল্প নথিপত্ৰ নাম হব, আৰু এই সম্প্ৰসাৰন ব্যৱহাৰ কৰিব। ইয়াক এটা ভিন্ন অন্তৰ্ভুক্তক "
|
||||
"বিন্যাসত ৰেকৰ্ড কৰোতে পৰিৱৰ্তন কৰিব লাগিব।"
|
||||
"ৰেকৰ্ড কৰা screencasts ৰ কাৰণে ফাইল নাম বৰ্তমান তাৰিখৰ উপৰত ভিত্তি কৰি এটা "
|
||||
"অবিকল্প ফাইল নাম হব, আৰু এই সম্প্ৰসাৰন ব্যৱহাৰ কৰিব। ইয়াক এটা ভিন্ন অন্তৰ্ভুক্তক "
|
||||
"বিন্যাসত ৰেকৰ্ড কৰোতে পৰিবৰ্তন কৰিব লাগিব।"
|
||||
|
||||
#: ../js/extensionPrefs/main.js:124
|
||||
#, c-format
|
||||
@@ -239,49 +237,55 @@ msgctxt "title"
|
||||
msgid "Sign In"
|
||||
msgstr "ছাইন ইন কৰক"
|
||||
|
||||
#. Translators: this message is shown below the password entry field
|
||||
#. to indicate the user can swipe their finger instead
|
||||
#: ../js/gdm/loginDialog.js:766 ../js/ui/unlockDialog.js:124
|
||||
msgid "(or swipe finger)"
|
||||
msgstr "(অথবা আঙুলি স্বাইপ কৰক)"
|
||||
|
||||
#. translators: this message is shown below the user list on the
|
||||
#. login screen. It can be activated to reveal an entry for
|
||||
#. manually entering the username.
|
||||
#: ../js/gdm/loginDialog.js:787
|
||||
#: ../js/gdm/loginDialog.js:784
|
||||
msgid "Not listed?"
|
||||
msgstr "তালিকাভুক্ত নহয়?"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:930 ../js/ui/endSessionDialog.js:406
|
||||
#: ../js/gdm/loginDialog.js:929 ../js/ui/endSessionDialog.js:406
|
||||
#: ../js/ui/extensionDownloader.js:195 ../js/ui/networkAgent.js:153
|
||||
#: ../js/ui/polkitAuthenticationAgent.js:176
|
||||
#: ../js/ui/shellMountOperation.js:396 ../js/ui/status/bluetooth.js:432
|
||||
#: ../js/ui/unlockDialog.js:129
|
||||
msgid "Cancel"
|
||||
msgstr "বাতিল কৰক"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:935
|
||||
#: ../js/gdm/loginDialog.js:934
|
||||
msgctxt "button"
|
||||
msgid "Sign In"
|
||||
msgstr "ছাইন ইন কৰক"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:1278
|
||||
#: ../js/gdm/loginDialog.js:1277
|
||||
msgid "Login Window"
|
||||
msgstr "লগিন উইন্ডো"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:130 ../js/ui/userMenu.js:612
|
||||
#: ../js/ui/userMenu.js:616 ../js/ui/userMenu.js:727
|
||||
#: ../js/gdm/powerMenu.js:88 ../js/ui/userMenu.js:634 ../js/ui/userMenu.js:638
|
||||
#: ../js/ui/userMenu.js:749
|
||||
msgid "Suspend"
|
||||
msgstr "বাতিল কৰক"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:135
|
||||
#: ../js/gdm/powerMenu.js:93
|
||||
msgid "Restart"
|
||||
msgstr "পুনৰাম্ভ কৰক"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:140 ../js/ui/userMenu.js:614
|
||||
#: ../js/ui/userMenu.js:616 ../js/ui/userMenu.js:726
|
||||
#: ../js/gdm/powerMenu.js:98 ../js/ui/userMenu.js:636 ../js/ui/userMenu.js:638
|
||||
#: ../js/ui/userMenu.js:748
|
||||
msgid "Power Off"
|
||||
msgstr "পাৱাৰ অফ"
|
||||
|
||||
#. Translators: this message is shown below the password entry field
|
||||
#. to indicate the user can swipe their finger instead
|
||||
#: ../js/gdm/util.js:220
|
||||
msgid "(or swipe finger)"
|
||||
msgstr "(অথবা আঙুলি স্বাইপ কৰক)"
|
||||
|
||||
#: ../js/gdm/util.js:245
|
||||
#, c-format
|
||||
msgid "(e.g., user or %s)"
|
||||
msgstr "(উদাহৰণ, ব্যৱহাৰকাৰী অথবা %s)"
|
||||
|
||||
#: ../js/misc/util.js:92
|
||||
msgid "Command not found"
|
||||
msgstr "কমান্ড পোৱা নগল"
|
||||
@@ -483,17 +487,18 @@ msgstr "আজি"
|
||||
msgid "Tomorrow"
|
||||
msgstr "কালি"
|
||||
|
||||
#: ../js/ui/calendar.js:727
|
||||
#: ../js/ui/calendar.js:729
|
||||
msgid "This week"
|
||||
msgstr "এই সপ্তাহ"
|
||||
|
||||
#: ../js/ui/calendar.js:735
|
||||
#: ../js/ui/calendar.js:737
|
||||
msgid "Next week"
|
||||
msgstr "অহা সপ্তাহ"
|
||||
|
||||
#: ../js/ui/dash.js:238 ../js/ui/messageTray.js:1321
|
||||
msgid "Remove"
|
||||
msgstr "আতৰাওক"
|
||||
#: ../js/ui/dash.js:241
|
||||
#| msgid "Applications"
|
||||
msgid "Show Applications"
|
||||
msgstr "এপ্লিকেচনসমূহ দেখুৱাওক"
|
||||
|
||||
#: ../js/ui/dateMenu.js:94
|
||||
msgid "Date and Time Settings"
|
||||
@@ -523,7 +528,7 @@ msgstr "লগ আউট কৰক"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:62
|
||||
msgid "Click Log Out to quit these applications and log out of the system."
|
||||
msgstr "এই অনুপ্ৰয়োগসমূহ প্ৰস্থান কৰি চিস্টেমৰ পৰা লগ আউট হবলে লগ আউট ক্লিক কৰক।"
|
||||
msgstr "এই এপ্লিকেচনসমূহ প্ৰস্থান কৰি চিস্টেমৰ পৰা লগ আউট হবলে লগ আউট ক্লিক কৰক।"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:64
|
||||
#, c-format
|
||||
@@ -555,7 +560,7 @@ msgstr "পাৱাৰ অফ"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:81
|
||||
msgid "Click Power Off to quit these applications and power off the system."
|
||||
msgstr "এই অনুপ্ৰয়োগসমূহক প্ৰস্থান কৰি চিস্টেম পাৱাৰ অফ কৰিবলে পাৱাৰ অফ ক্লিক কৰক।"
|
||||
msgstr "এই এপ্লিকেচনসমূহক প্ৰস্থান কৰি চিস্টেম পাৱাৰ অফ কৰিবলে পাৱাৰ অফ ক্লিক কৰক।"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:83
|
||||
#, c-format
|
||||
@@ -585,7 +590,7 @@ msgstr "পুনৰাম্ভ কৰক"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:98
|
||||
msgid "Click Restart to quit these applications and restart the system."
|
||||
msgstr "এই অনুপ্ৰয়োগসমূহক প্ৰস্থান কৰি চিস্টেম পুনৰাম্ভ কৰিবলে পুনৰাম্ভ ক্লিক কৰক।"
|
||||
msgstr "এই এপ্লিকেচনসমূহক প্ৰস্থান কৰি চিস্টেম পুনৰাম্ভ কৰিবলে পুনৰাম্ভ ক্লিক কৰক।"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:100
|
||||
#, c-format
|
||||
@@ -612,7 +617,7 @@ msgid "tray"
|
||||
msgstr "ট্ৰে"
|
||||
|
||||
#: ../js/ui/keyboard.js:545 ../js/ui/status/keyboard.js:146
|
||||
#: ../js/ui/status/power.js:205
|
||||
#: ../js/ui/status/power.js:207
|
||||
msgid "Keyboard"
|
||||
msgstr "কিবৰ্ড"
|
||||
|
||||
@@ -620,7 +625,7 @@ msgstr "কিবৰ্ড"
|
||||
msgid "Password:"
|
||||
msgstr "পাছৱাৰ্ড:"
|
||||
|
||||
#: ../js/ui/keyringPrompt.js:102
|
||||
#: ../js/ui/keyringPrompt.js:105
|
||||
msgid "Type again:"
|
||||
msgstr "আকৌ টাইপ কৰক:"
|
||||
|
||||
@@ -678,19 +683,27 @@ msgstr "ৱেব পৃষ্ঠা"
|
||||
msgid "Screencast from %d %t"
|
||||
msgstr "%d %t ৰ পৰা স্ক্ৰিনকাস্ট দেখুৱাওক"
|
||||
|
||||
#: ../js/ui/messageTray.js:1314
|
||||
#: ../js/ui/messageTray.js:1228
|
||||
msgid "Open"
|
||||
msgstr "খোলক"
|
||||
|
||||
#: ../js/ui/messageTray.js:1331
|
||||
#: ../js/ui/messageTray.js:1235
|
||||
msgid "Remove"
|
||||
msgstr "আতৰাওক"
|
||||
|
||||
#: ../js/ui/messageTray.js:1245
|
||||
msgid "Unmute"
|
||||
msgstr "অমৌন কৰক"
|
||||
|
||||
#: ../js/ui/messageTray.js:1331
|
||||
#: ../js/ui/messageTray.js:1245
|
||||
msgid "Mute"
|
||||
msgstr "মোন কৰক"
|
||||
|
||||
#: ../js/ui/messageTray.js:2664
|
||||
#: ../js/ui/messageTray.js:2027
|
||||
msgid "Message Tray"
|
||||
msgstr "বাৰ্তা ট্ৰে"
|
||||
|
||||
#: ../js/ui/messageTray.js:2465
|
||||
msgid "System Information"
|
||||
msgstr "চিস্টেম তথ্য"
|
||||
|
||||
@@ -778,25 +791,25 @@ msgctxt "program"
|
||||
msgid "Unknown"
|
||||
msgstr "অজ্ঞাত"
|
||||
|
||||
#: ../js/ui/overview.js:89
|
||||
#: ../js/ui/overview.js:84
|
||||
msgid "Undo"
|
||||
msgstr "কাৰ্য্য বাতিল কৰক"
|
||||
|
||||
#: ../js/ui/overview.js:129
|
||||
#: ../js/ui/overview.js:124
|
||||
msgid "Overview"
|
||||
msgstr "অভাৰভিউ"
|
||||
|
||||
#: ../js/ui/overview.js:199
|
||||
msgid "Windows"
|
||||
msgstr "উইন্ডোসমূহ"
|
||||
|
||||
#: ../js/ui/overview.js:202
|
||||
msgid "Applications"
|
||||
msgstr "অনুপ্ৰয়োগসমূহ"
|
||||
#. Translators: this is the text displayed
|
||||
#. in the search entry when no search is
|
||||
#. active; it should not exceed ~30
|
||||
#. characters.
|
||||
#: ../js/ui/overview.js:193
|
||||
msgid "Type to search..."
|
||||
msgstr "সন্ধান কৰিবলে টাইপ কৰক..."
|
||||
|
||||
#. Translators: this is the name of the dock/favorites area on
|
||||
#. the left of the overview
|
||||
#: ../js/ui/overview.js:227
|
||||
#: ../js/ui/overview.js:214
|
||||
msgid "Dash"
|
||||
msgstr "ডেশ"
|
||||
|
||||
@@ -857,7 +870,7 @@ msgstr "ক্ষমা কৰিব, সেয়া কাম নকৰিলে
|
||||
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
|
||||
#. switches containing "◯" and "|"). Other values will
|
||||
#. simply result in invisible toggle switches.
|
||||
#: ../js/ui/popupMenu.js:723
|
||||
#: ../js/ui/popupMenu.js:726
|
||||
msgid "toggle-switch-us"
|
||||
msgstr "toggle-switch-us"
|
||||
|
||||
@@ -865,11 +878,34 @@ msgstr "toggle-switch-us"
|
||||
msgid "Please enter a command:"
|
||||
msgstr "অনুগ্ৰহ কৰি এটা কমান্ড সুমুৱাওক:"
|
||||
|
||||
#: ../js/ui/searchDisplay.js:320
|
||||
#. Translators: This is a time format for a date in
|
||||
#. long format
|
||||
#: ../js/ui/screenShield.js:69
|
||||
#| msgctxt "calendar heading"
|
||||
#| msgid "%A, %B %d"
|
||||
msgid "%A, %B %d"
|
||||
msgstr "%A, %B %d"
|
||||
|
||||
#: ../js/ui/screenShield.js:134
|
||||
#, c-format
|
||||
msgid "%d new message"
|
||||
msgid_plural "%d new messages"
|
||||
msgstr[0] "%d নতুন বাৰ্তা"
|
||||
msgstr[1] "%d নতুন বাৰ্তাসমূহ"
|
||||
|
||||
#: ../js/ui/screenShield.js:136
|
||||
#, c-format
|
||||
#| msgid "Notifications"
|
||||
msgid "%d new notification"
|
||||
msgid_plural "%d new notifications"
|
||||
msgstr[0] "%d নতুন অধিসূচনা"
|
||||
msgstr[1] "%d নতুন অধিসূচনাসমূহ"
|
||||
|
||||
#: ../js/ui/searchDisplay.js:274
|
||||
msgid "Searching..."
|
||||
msgstr "সন্ধান কৰা হৈছে..."
|
||||
|
||||
#: ../js/ui/searchDisplay.js:373
|
||||
#: ../js/ui/searchDisplay.js:325
|
||||
msgid "No matching results."
|
||||
msgstr "কোনো মিল থকা ফলাফল নাই।"
|
||||
|
||||
@@ -897,7 +933,7 @@ msgstr "পাচফ্ৰেইছ"
|
||||
msgid "Remember Passphrase"
|
||||
msgstr "পাচফ্ৰেইছ মনত ৰাখক"
|
||||
|
||||
#: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:129
|
||||
#: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:132
|
||||
msgid "Unlock"
|
||||
msgstr "আনলক কৰক"
|
||||
|
||||
@@ -962,7 +998,7 @@ msgstr "দৃশ্যমানতা"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:58
|
||||
msgid "Send Files to Device..."
|
||||
msgstr "নথিপত্ৰসমূহক ডিভাইচলে পঠাওক..."
|
||||
msgstr "ফাইলসমূহক ডিভাইচলে পঠাওক..."
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:59
|
||||
msgid "Set up a New Device..."
|
||||
@@ -992,11 +1028,11 @@ msgstr "সংযোগ কৰা হৈ আছে..."
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:243
|
||||
msgid "Send Files..."
|
||||
msgstr "নথিপত্ৰসমূহ পঠাওক..."
|
||||
msgstr "ফাইলসমূহ পঠাওক..."
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:248
|
||||
msgid "Browse Files..."
|
||||
msgstr "নথিপত্ৰসমূহ ব্ৰাউছ কৰক..."
|
||||
msgstr "ফাইলসমূহ ব্ৰাউছ কৰক..."
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:257
|
||||
msgid "Error browsing device"
|
||||
@@ -1037,7 +1073,7 @@ msgstr "সদায় অভিগম প্ৰদান কৰক"
|
||||
msgid "Grant this time only"
|
||||
msgstr "কেৱল এইবাৰৰ কাৰণে প্ৰদান কৰক"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:351 ../js/ui/telepathyClient.js:1106
|
||||
#: ../js/ui/status/bluetooth.js:351 ../js/ui/telepathyClient.js:1110
|
||||
msgid "Reject"
|
||||
msgstr "নাকচ কৰক"
|
||||
|
||||
@@ -1198,7 +1234,7 @@ msgstr "সংযোগ ব্যৰ্থ"
|
||||
msgid "Activation of network connection failed"
|
||||
msgstr "নেটৱাৰ্ক সংযোগ সক্ৰিয়কৰণ ব্যৰ্থ হল"
|
||||
|
||||
#: ../js/ui/status/network.js:2066
|
||||
#: ../js/ui/status/network.js:2104
|
||||
msgid "Networking is disabled"
|
||||
msgstr "নেটৱাৰ্কিং অসামৰ্থবান কৰা আছে"
|
||||
|
||||
@@ -1254,47 +1290,47 @@ msgctxt "percent of battery remaining"
|
||||
msgid "%d%%"
|
||||
msgstr "%d%%"
|
||||
|
||||
#: ../js/ui/status/power.js:195
|
||||
#: ../js/ui/status/power.js:197
|
||||
msgid "AC adapter"
|
||||
msgstr "AC এডাপ্টাৰ"
|
||||
|
||||
#: ../js/ui/status/power.js:197
|
||||
#: ../js/ui/status/power.js:199
|
||||
msgid "Laptop battery"
|
||||
msgstr "লেপটপ বেটাৰি"
|
||||
|
||||
#: ../js/ui/status/power.js:199
|
||||
#: ../js/ui/status/power.js:201
|
||||
msgid "UPS"
|
||||
msgstr "UPS"
|
||||
|
||||
#: ../js/ui/status/power.js:201
|
||||
#: ../js/ui/status/power.js:203
|
||||
msgid "Monitor"
|
||||
msgstr "মনিটৰ"
|
||||
|
||||
#: ../js/ui/status/power.js:203
|
||||
#: ../js/ui/status/power.js:205
|
||||
msgid "Mouse"
|
||||
msgstr "মাউছ"
|
||||
|
||||
#: ../js/ui/status/power.js:207
|
||||
#: ../js/ui/status/power.js:209
|
||||
msgid "PDA"
|
||||
msgstr "PDA"
|
||||
|
||||
#: ../js/ui/status/power.js:209
|
||||
#: ../js/ui/status/power.js:211
|
||||
msgid "Cell phone"
|
||||
msgstr "চেল ফোন"
|
||||
|
||||
#: ../js/ui/status/power.js:211
|
||||
#: ../js/ui/status/power.js:213
|
||||
msgid "Media player"
|
||||
msgstr "মিডিয়া প্লেয়াৰ"
|
||||
|
||||
#: ../js/ui/status/power.js:213
|
||||
#: ../js/ui/status/power.js:215
|
||||
msgid "Tablet"
|
||||
msgstr "টেবলেট"
|
||||
|
||||
#: ../js/ui/status/power.js:215
|
||||
#: ../js/ui/status/power.js:217
|
||||
msgid "Computer"
|
||||
msgstr "কমপিউটাৰ"
|
||||
|
||||
#: ../js/ui/status/power.js:217
|
||||
#: ../js/ui/status/power.js:219
|
||||
msgctxt "device"
|
||||
msgid "Unknown"
|
||||
msgstr "অজ্ঞাত"
|
||||
@@ -1310,60 +1346,60 @@ msgstr "মাইক্ৰোফোন"
|
||||
|
||||
#. FIXME: We don't have a 'chat room' icon (bgo #653737) use
|
||||
#. system-users for now as Empathy does.
|
||||
#: ../js/ui/telepathyClient.js:226
|
||||
#: ../js/ui/telepathyClient.js:228
|
||||
msgid "Invitation"
|
||||
msgstr "নিমন্ত্ৰণ"
|
||||
|
||||
#. We got the TpContact
|
||||
#: ../js/ui/telepathyClient.js:284
|
||||
#: ../js/ui/telepathyClient.js:288
|
||||
msgid "Call"
|
||||
msgstr "কল"
|
||||
|
||||
#. We got the TpContact
|
||||
#: ../js/ui/telepathyClient.js:300
|
||||
#: ../js/ui/telepathyClient.js:304
|
||||
msgid "File Transfer"
|
||||
msgstr "নথিপত্ৰ স্থানান্তৰ"
|
||||
msgstr "ফাইল স্থানান্তৰ"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:381
|
||||
#: ../js/ui/telepathyClient.js:385
|
||||
msgid "Subscription request"
|
||||
msgstr "স্বাক্ষৰণ অনুৰোধ"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:418
|
||||
#: ../js/ui/telepathyClient.js:422
|
||||
msgid "Connection error"
|
||||
msgstr "সংযোগ ত্ৰুটি"
|
||||
|
||||
#. Translators: this is a time format string followed by a date.
|
||||
#. If applicable, replace %X with a strftime format valid for your
|
||||
#. locale, without seconds.
|
||||
#: ../js/ui/telepathyClient.js:917
|
||||
#: ../js/ui/telepathyClient.js:921
|
||||
#, no-c-format
|
||||
msgid "Sent at <b>%X</b> on <b>%A</b>"
|
||||
msgstr "<b>%X</b> on <b>%A</b> ত পঠোৱা হৈছে"
|
||||
|
||||
#. Translators: this is a time format in the style of "Wednesday, May 25",
|
||||
#. shown when you get a chat message in the same year.
|
||||
#: ../js/ui/telepathyClient.js:923
|
||||
#: ../js/ui/telepathyClient.js:927
|
||||
#, no-c-format
|
||||
msgid "Sent on <b>%A</b>, <b>%B %d</b>"
|
||||
msgstr "<b>%A</b> ত পঠোৱা হৈছে, <b>%B %d</b>"
|
||||
|
||||
#. Translators: this is a time format in the style of "Wednesday, May 25, 2012",
|
||||
#. shown when you get a chat message in a different year.
|
||||
#: ../js/ui/telepathyClient.js:928
|
||||
#: ../js/ui/telepathyClient.js:932
|
||||
#, no-c-format
|
||||
msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y"
|
||||
msgstr "<b>%A</b> ত পঠোৱা হৈছে, <b>%B %d</b>, %Y"
|
||||
|
||||
#. Translators: this is the other person changing their old IM name to their new
|
||||
#. IM name.
|
||||
#: ../js/ui/telepathyClient.js:957
|
||||
#: ../js/ui/telepathyClient.js:961
|
||||
#, c-format
|
||||
msgid "%s is now known as %s"
|
||||
msgstr "%s এতিয়া %s হিচাপে জনাজাত"
|
||||
|
||||
#. translators: argument is a room name like
|
||||
#. * room@jabber.org for example.
|
||||
#: ../js/ui/telepathyClient.js:1057
|
||||
#: ../js/ui/telepathyClient.js:1061
|
||||
#, c-format
|
||||
msgid "Invitation to %s"
|
||||
msgstr "%s লে নিমন্ত্ৰণ"
|
||||
@@ -1371,35 +1407,35 @@ msgstr "%s লে নিমন্ত্ৰণ"
|
||||
#. translators: first argument is the name of a contact and the second
|
||||
#. * one the name of a room. "Alice is inviting you to join room@jabber.org
|
||||
#. * for example.
|
||||
#: ../js/ui/telepathyClient.js:1065
|
||||
#: ../js/ui/telepathyClient.js:1069
|
||||
#, c-format
|
||||
msgid "%s is inviting you to join %s"
|
||||
msgstr "%s এ আপোনাক %s ত অংশগ্ৰহণ কৰিবলে আমন্ত্ৰণ জনাইছে"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1067 ../js/ui/telepathyClient.js:1146
|
||||
#: ../js/ui/telepathyClient.js:1210
|
||||
#: ../js/ui/telepathyClient.js:1071 ../js/ui/telepathyClient.js:1150
|
||||
#: ../js/ui/telepathyClient.js:1214
|
||||
msgid "Decline"
|
||||
msgstr "নাকচ কৰক"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1068 ../js/ui/telepathyClient.js:1147
|
||||
#: ../js/ui/telepathyClient.js:1211
|
||||
#: ../js/ui/telepathyClient.js:1072 ../js/ui/telepathyClient.js:1151
|
||||
#: ../js/ui/telepathyClient.js:1215
|
||||
msgid "Accept"
|
||||
msgstr "গ্ৰহন কৰক"
|
||||
|
||||
#. translators: argument is a contact name like Alice for example.
|
||||
#: ../js/ui/telepathyClient.js:1098
|
||||
#: ../js/ui/telepathyClient.js:1102
|
||||
#, c-format
|
||||
msgid "Video call from %s"
|
||||
msgstr "%s ৰ পৰা ভিডিঅ' কল"
|
||||
|
||||
#. translators: argument is a contact name like Alice for example.
|
||||
#: ../js/ui/telepathyClient.js:1101
|
||||
#: ../js/ui/telepathyClient.js:1105
|
||||
#, c-format
|
||||
msgid "Call from %s"
|
||||
msgstr "%s - পৰা কল"
|
||||
|
||||
#. translators: this is a button label (verb), not a noun
|
||||
#: ../js/ui/telepathyClient.js:1108
|
||||
#: ../js/ui/telepathyClient.js:1112
|
||||
msgid "Answer"
|
||||
msgstr "উত্তৰ"
|
||||
|
||||
@@ -1408,107 +1444,107 @@ msgstr "উত্তৰ"
|
||||
#. * file name. The string will be something
|
||||
#. * like: "Alice is sending you test.ogg"
|
||||
#.
|
||||
#: ../js/ui/telepathyClient.js:1140
|
||||
#: ../js/ui/telepathyClient.js:1144
|
||||
#, c-format
|
||||
msgid "%s is sending you %s"
|
||||
msgstr "%s এ আপোনাক %s পঠাই আছে"
|
||||
|
||||
#. To translators: The parameter is the contact's alias
|
||||
#: ../js/ui/telepathyClient.js:1175
|
||||
#: ../js/ui/telepathyClient.js:1179
|
||||
#, c-format
|
||||
msgid "%s would like permission to see when you are online"
|
||||
msgstr "আপুনি কেতিয়া অনলাইন আছে চাবলে %s এ অনুমতি বিচাৰিব"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1268
|
||||
#: ../js/ui/telepathyClient.js:1272
|
||||
msgid "Network error"
|
||||
msgstr "নেটৱাৰ্ক ত্ৰুটি"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1270
|
||||
#: ../js/ui/telepathyClient.js:1274
|
||||
msgid "Authentication failed"
|
||||
msgstr "প্ৰমাণীকৰণ ব্যৰ্থ"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1272
|
||||
#: ../js/ui/telepathyClient.js:1276
|
||||
msgid "Encryption error"
|
||||
msgstr "ইনক্ৰিপষণ ত্ৰুটি"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1274
|
||||
#: ../js/ui/telepathyClient.js:1278
|
||||
msgid "Certificate not provided"
|
||||
msgstr "প্ৰমাণপত্ৰ প্ৰদান কৰা হোৱা নাই"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1276
|
||||
#: ../js/ui/telepathyClient.js:1280
|
||||
msgid "Certificate untrusted"
|
||||
msgstr "প্ৰমাণপত্ৰক ভৰষা কৰিব নোৱাৰি"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1278
|
||||
#: ../js/ui/telepathyClient.js:1282
|
||||
msgid "Certificate expired"
|
||||
msgstr "প্ৰমাণপত্ৰৰ অৱসান ঘটিছে"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1280
|
||||
#: ../js/ui/telepathyClient.js:1284
|
||||
msgid "Certificate not activated"
|
||||
msgstr "প্ৰমাণপত্ৰ সক্ৰিয় কৰা হোৱা নাই"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1282
|
||||
#: ../js/ui/telepathyClient.js:1286
|
||||
msgid "Certificate hostname mismatch"
|
||||
msgstr "প্ৰমাণপত্ৰ হস্টনাম অমিল"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1284
|
||||
#: ../js/ui/telepathyClient.js:1288
|
||||
msgid "Certificate fingerprint mismatch"
|
||||
msgstr "প্ৰমাণপত্ৰ ফিংগাৰপ্ৰিন্ট অমিল"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1286
|
||||
#: ../js/ui/telepathyClient.js:1290
|
||||
msgid "Certificate self-signed"
|
||||
msgstr "প্ৰমাণপত্ৰ স্ব-স্বাক্ষৰীত"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1288
|
||||
#: ../js/ui/telepathyClient.js:1292
|
||||
msgid "Status is set to offline"
|
||||
msgstr "অৱস্থা অফলাইনলে সংহতি কৰা হৈছে"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1290
|
||||
#: ../js/ui/telepathyClient.js:1294
|
||||
msgid "Encryption is not available"
|
||||
msgstr "ইনক্ৰিপষণ উপলব্ধ নহয়"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1292
|
||||
#: ../js/ui/telepathyClient.js:1296
|
||||
msgid "Certificate is invalid"
|
||||
msgstr "প্ৰমাণপত্ৰ অবৈধ"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1294
|
||||
#: ../js/ui/telepathyClient.js:1298
|
||||
msgid "Connection has been refused"
|
||||
msgstr "সংযোগ নাকচ কৰা হৈছে"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1296
|
||||
#: ../js/ui/telepathyClient.js:1300
|
||||
msgid "Connection can't be established"
|
||||
msgstr "সংযোগ স্থাপন কৰিব নোৱাৰি"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1298
|
||||
#: ../js/ui/telepathyClient.js:1302
|
||||
msgid "Connection has been lost"
|
||||
msgstr "সংযোগ হেৰাইছে"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1300
|
||||
#: ../js/ui/telepathyClient.js:1304
|
||||
msgid "This account is already connected to the server"
|
||||
msgstr "এই একাওন্ট ইতিমধ্যে চাৰ্ভাৰৰ সৈতে সংযোগিত"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1302
|
||||
#: ../js/ui/telepathyClient.js:1306
|
||||
msgid "Connection has been replaced by a new connection using the same resource"
|
||||
msgstr "সংযোগক একে সম্পদ ব্যৱহাৰ কৰি এটা নতুন সংযোগৰে প্ৰতিস্থাপন কৰা হৈছে"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1304
|
||||
#: ../js/ui/telepathyClient.js:1308
|
||||
msgid "The account already exists on the server"
|
||||
msgstr "একাওন্ট ইতিমধ্যে চাৰ্ভাৰত উপস্থিত"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1306
|
||||
#: ../js/ui/telepathyClient.js:1310
|
||||
msgid "Server is currently too busy to handle the connection"
|
||||
msgstr "চাৰ্ভাৰ সংযোগ ব্যৱস্থাপনা কৰিবলে বৰ্তমানে অতি ব্যস্ত"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1308
|
||||
#: ../js/ui/telepathyClient.js:1312
|
||||
msgid "Certificate has been revoked"
|
||||
msgstr "প্ৰমাণপত্ৰ প্ৰত্যাহাৰ কৰা হৈছে"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1310
|
||||
#: ../js/ui/telepathyClient.js:1314
|
||||
msgid "Certificate uses an insecure cipher algorithm or is cryptographically weak"
|
||||
msgstr ""
|
||||
"প্ৰমাণপত্ৰয় এটা অসুৰক্ষিত চিফাৰ এলগৰিথম ব্যৱহাৰ কৰে অথবা ক্ৰিপ্টোগ্ৰাফিয়ভাৱে দুৰ্বল"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1312
|
||||
#: ../js/ui/telepathyClient.js:1316
|
||||
msgid ""
|
||||
"The length of the server certificate, or the depth of the server certificate "
|
||||
"chain, exceed the limits imposed by the cryptography library"
|
||||
@@ -1516,90 +1552,91 @@ msgstr ""
|
||||
"চাৰ্ভাৰ প্ৰমাণপত্ৰৰ দৈৰ্ঘ, অথবা চাৰ্ভাৰ প্ৰমাণপত্ৰ শৃংখলৰ গভীৰতা, ক্ৰিপ্টোগ্ৰাফী "
|
||||
"লাইব্ৰেৰীয়ে প্ৰণয়ন কৰা সীমাসমূহত অতিক্ৰম কৰে"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1314
|
||||
#: ../js/ui/telepathyClient.js:1318
|
||||
msgid "Internal error"
|
||||
msgstr "অভ্যন্তৰীক ত্ৰুটি"
|
||||
|
||||
#. translators: argument is the account name, like
|
||||
#. * name@jabber.org for example.
|
||||
#: ../js/ui/telepathyClient.js:1324
|
||||
#: ../js/ui/telepathyClient.js:1328
|
||||
#, c-format
|
||||
msgid "Connection to %s failed"
|
||||
msgstr "%s লে সংযোগ ব্যৰ্থ"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1333
|
||||
#: ../js/ui/telepathyClient.js:1337
|
||||
msgid "Reconnect"
|
||||
msgstr "পুনৰ সংযোগ কৰক"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1334
|
||||
#: ../js/ui/telepathyClient.js:1338
|
||||
msgid "Edit account"
|
||||
msgstr "একাওন্ট সম্পাদন কৰক"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1380
|
||||
#: ../js/ui/telepathyClient.js:1383
|
||||
msgid "Unknown reason"
|
||||
msgstr "অজ্ঞাত কাৰণ"
|
||||
|
||||
#: ../js/ui/unlockDialog.js:138
|
||||
msgid "Login as another user"
|
||||
#: ../js/ui/unlockDialog.js:140
|
||||
#| msgid "Login as another user"
|
||||
msgid "Log in as another user"
|
||||
msgstr "অন্য ব্যৱহাৰকাৰী হিচাপে লগিন কৰক"
|
||||
|
||||
#: ../js/ui/userMenu.js:161
|
||||
#: ../js/ui/userMenu.js:167
|
||||
msgid "Available"
|
||||
msgstr "উপলব্ধ"
|
||||
|
||||
#: ../js/ui/userMenu.js:164
|
||||
#: ../js/ui/userMenu.js:170
|
||||
msgid "Busy"
|
||||
msgstr "ব্যস্থ"
|
||||
|
||||
#: ../js/ui/userMenu.js:167
|
||||
#: ../js/ui/userMenu.js:173
|
||||
msgid "Invisible"
|
||||
msgstr "অদৃশ্য"
|
||||
|
||||
#: ../js/ui/userMenu.js:170
|
||||
#: ../js/ui/userMenu.js:176
|
||||
msgid "Away"
|
||||
msgstr "আতৰত"
|
||||
|
||||
#: ../js/ui/userMenu.js:173
|
||||
#: ../js/ui/userMenu.js:179
|
||||
msgid "Idle"
|
||||
msgstr "অলস"
|
||||
|
||||
#: ../js/ui/userMenu.js:176
|
||||
#: ../js/ui/userMenu.js:182
|
||||
msgid "Unavailable"
|
||||
msgstr "উপলব্ধ নাই"
|
||||
|
||||
#: ../js/ui/userMenu.js:567 ../js/ui/userMenu.js:708
|
||||
#: ../js/ui/userMenu.js:589 ../js/ui/userMenu.js:730
|
||||
msgid "Switch User"
|
||||
msgstr "ব্যৱহাৰকাৰী পৰিবৰ্তন কৰক"
|
||||
|
||||
#: ../js/ui/userMenu.js:568
|
||||
#: ../js/ui/userMenu.js:590
|
||||
msgid "Switch Session"
|
||||
msgstr "অধিবেশন পৰিবৰ্তন কৰক"
|
||||
|
||||
#: ../js/ui/userMenu.js:691
|
||||
#: ../js/ui/userMenu.js:713
|
||||
msgid "Notifications"
|
||||
msgstr "অধিসূচনাসমূহ"
|
||||
|
||||
#: ../js/ui/userMenu.js:700
|
||||
#: ../js/ui/userMenu.js:722
|
||||
msgid "System Settings"
|
||||
msgstr "চিস্টেম সংহতিসমূহ"
|
||||
|
||||
#: ../js/ui/userMenu.js:713
|
||||
#: ../js/ui/userMenu.js:735
|
||||
msgid "Log Out"
|
||||
msgstr "লগ আউট কৰক"
|
||||
|
||||
#: ../js/ui/userMenu.js:718
|
||||
#: ../js/ui/userMenu.js:740
|
||||
msgid "Lock"
|
||||
msgstr "লক কৰক"
|
||||
|
||||
#: ../js/ui/userMenu.js:733
|
||||
#: ../js/ui/userMenu.js:755
|
||||
msgid "Install Updates & Restart"
|
||||
msgstr "আপডেইটসমূহ ইনস্টল কৰক & পুনাৰম্ভ কৰক"
|
||||
|
||||
#: ../js/ui/userMenu.js:751
|
||||
#: ../js/ui/userMenu.js:773
|
||||
msgid "Your chat status will be set to busy"
|
||||
msgstr "আপোনাৰ চেট অৱস্থা ব্যস্থলে সংহতি কৰা হব"
|
||||
|
||||
#: ../js/ui/userMenu.js:752
|
||||
#: ../js/ui/userMenu.js:774
|
||||
msgid ""
|
||||
"Notifications are now disabled, including chat messages. Your online status "
|
||||
"has been adjusted to let others know that you might not see their messages."
|
||||
@@ -1608,19 +1645,19 @@ msgstr ""
|
||||
"অনলাইন অৱস্থা ঠিক কৰা হৈছে যাতে আনে জানিব পাৰে যে আপুনি সিহতৰ বাৰ্তা চাব "
|
||||
"নোৱাৰিবও পাৰে।"
|
||||
|
||||
#. Translators: this is the text displayed
|
||||
#. in the search entry when no search is
|
||||
#. active; it should not exceed ~30
|
||||
#. characters.
|
||||
#: ../js/ui/viewSelector.js:113
|
||||
msgid "Type to search..."
|
||||
msgstr "সন্ধান কৰিবলে টাইপ কৰক..."
|
||||
#: ../js/ui/viewSelector.js:88
|
||||
msgid "Windows"
|
||||
msgstr "উইন্ডোসমূহ"
|
||||
|
||||
#: ../js/ui/viewSelector.js:131 ../src/shell-util.c:254
|
||||
#: ../js/ui/viewSelector.js:92
|
||||
msgid "Applications"
|
||||
msgstr "এপ্লিকেচনসমূহ"
|
||||
|
||||
#: ../js/ui/viewSelector.js:96 ../src/shell-util.c:250
|
||||
msgid "Search"
|
||||
msgstr "সন্ধান কৰক"
|
||||
|
||||
#: ../js/ui/wanda.js:124
|
||||
#: ../js/ui/wanda.js:125
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Sorry, no wisdom for you today:\n"
|
||||
@@ -1629,12 +1666,12 @@ msgstr ""
|
||||
"ক্ষমা কৰিব, আপোনাৰ বাবে আজি কোনো জ্ঞান নাই:\n"
|
||||
"%s"
|
||||
|
||||
#: ../js/ui/wanda.js:128
|
||||
#: ../js/ui/wanda.js:129
|
||||
#, c-format
|
||||
msgid "%s the Oracle says"
|
||||
msgstr "%s Oracle এ ক'য়"
|
||||
|
||||
#: ../js/ui/wanda.js:168
|
||||
#: ../js/ui/wanda.js:170
|
||||
msgid "Your favorite Easter Egg"
|
||||
msgstr "আপোনাৰ পছন্দৰ Easter Egg"
|
||||
|
||||
@@ -1712,22 +1749,22 @@ msgstr "প্ৰমাণীকৰণ ডাইলগ ব্যৱহাৰক
|
||||
|
||||
#. Translators: this is the same string as the one found in
|
||||
#. * nautilus
|
||||
#: ../src/shell-util.c:98
|
||||
#: ../src/shell-util.c:94
|
||||
msgid "Home"
|
||||
msgstr "ঘৰ"
|
||||
|
||||
#. Translators: this is the same string as the one found in
|
||||
#. * nautilus
|
||||
#: ../src/shell-util.c:108
|
||||
#: ../src/shell-util.c:104
|
||||
msgid "File System"
|
||||
msgstr "নথিপত্ৰ প্ৰণালী"
|
||||
msgstr "ফাইল চিস্টেম"
|
||||
|
||||
#. Translators: the first string is the name of a gvfs
|
||||
#. * method, and the second string is a path. For
|
||||
#. * example, "Trash: some-directory". It means that the
|
||||
#. * directory called "some-directory" is in the trash.
|
||||
#.
|
||||
#: ../src/shell-util.c:304
|
||||
#: ../src/shell-util.c:300
|
||||
#, c-format
|
||||
msgid "%1$s: %2$s"
|
||||
msgstr "%1$s: %2$s"
|
||||
|
||||
386
po/he.po
386
po/he.po
@@ -8,8 +8,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell master\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2012-08-10 14:43+0300\n"
|
||||
"PO-Revision-Date: 2012-08-10 14:44+0200\n"
|
||||
"POT-Creation-Date: 2012-08-26 10:43+0300\n"
|
||||
"PO-Revision-Date: 2012-08-26 10:46+0200\n"
|
||||
"Last-Translator: Yaron Shahrabani <sh.yaron@gmail.com>\n"
|
||||
"Language-Team: Hebrew <sh.yaron@gmail.com>\n"
|
||||
"Language: he\n"
|
||||
@@ -177,57 +177,62 @@ msgctxt "title"
|
||||
msgid "Sign In"
|
||||
msgstr "כניסה"
|
||||
|
||||
#. Translators: this message is shown below the password entry field
|
||||
#. to indicate the user can swipe their finger instead
|
||||
#: ../js/gdm/loginDialog.js:766
|
||||
#: ../js/ui/unlockDialog.js:124
|
||||
msgid "(or swipe finger)"
|
||||
msgstr "(או להעביר אצבע)"
|
||||
|
||||
#. translators: this message is shown below the user list on the
|
||||
#. login screen. It can be activated to reveal an entry for
|
||||
#. manually entering the username.
|
||||
#: ../js/gdm/loginDialog.js:787
|
||||
#: ../js/gdm/loginDialog.js:784
|
||||
msgid "Not listed?"
|
||||
msgstr "לא רשום?"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:930
|
||||
#: ../js/ui/endSessionDialog.js:406
|
||||
#: ../js/gdm/loginDialog.js:929
|
||||
#: ../js/ui/endSessionDialog.js:407
|
||||
#: ../js/ui/extensionDownloader.js:195
|
||||
#: ../js/ui/networkAgent.js:153
|
||||
#: ../js/ui/networkAgent.js:156
|
||||
#: ../js/ui/polkitAuthenticationAgent.js:176
|
||||
#: ../js/ui/shellMountOperation.js:396
|
||||
#: ../js/ui/status/bluetooth.js:432
|
||||
#: ../js/ui/unlockDialog.js:129
|
||||
msgid "Cancel"
|
||||
msgstr "ביטול"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:935
|
||||
#: ../js/gdm/loginDialog.js:934
|
||||
msgctxt "button"
|
||||
msgid "Sign In"
|
||||
msgstr "כניסה"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:1278
|
||||
#: ../js/gdm/loginDialog.js:1277
|
||||
msgid "Login Window"
|
||||
msgstr "חלון כניסה"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:130
|
||||
#: ../js/ui/userMenu.js:612
|
||||
#: ../js/ui/userMenu.js:616
|
||||
#: ../js/ui/userMenu.js:727
|
||||
#: ../js/gdm/powerMenu.js:88
|
||||
#: ../js/ui/userMenu.js:634
|
||||
#: ../js/ui/userMenu.js:638
|
||||
#: ../js/ui/userMenu.js:749
|
||||
msgid "Suspend"
|
||||
msgstr "השהיה"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:135
|
||||
#: ../js/gdm/powerMenu.js:93
|
||||
msgid "Restart"
|
||||
msgstr "הפעלה מחדש"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:140
|
||||
#: ../js/ui/userMenu.js:614
|
||||
#: ../js/ui/userMenu.js:616
|
||||
#: ../js/ui/userMenu.js:726
|
||||
#: ../js/gdm/powerMenu.js:98
|
||||
#: ../js/ui/userMenu.js:636
|
||||
#: ../js/ui/userMenu.js:638
|
||||
#: ../js/ui/userMenu.js:748
|
||||
msgid "Power Off"
|
||||
msgstr "כיבוי"
|
||||
|
||||
#. Translators: this message is shown below the password entry field
|
||||
#. to indicate the user can swipe their finger instead
|
||||
#: ../js/gdm/util.js:220
|
||||
msgid "(or swipe finger)"
|
||||
msgstr "(או להעביר אצבע)"
|
||||
|
||||
#: ../js/gdm/util.js:245
|
||||
#, c-format
|
||||
msgid "(e.g., user or %s)"
|
||||
msgstr "(משתמש או %s לדוגמה)"
|
||||
|
||||
#: ../js/misc/util.js:92
|
||||
msgid "Command not found"
|
||||
msgstr "הפקודה לא נמצאה"
|
||||
@@ -261,6 +266,7 @@ msgid "New Window"
|
||||
msgstr "חלון חדש"
|
||||
|
||||
#: ../js/ui/appDisplay.js:678
|
||||
#: ../js/ui/dash.js:271
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "הסרה מהמועדפים"
|
||||
|
||||
@@ -278,16 +284,16 @@ msgstr "%s נוסף למועדפים שלך."
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s הוסר מהמועדפים שלך."
|
||||
|
||||
#: ../js/ui/autorunManager.js:261
|
||||
#: ../js/ui/autorunManager.js:264
|
||||
msgid "Removable Devices"
|
||||
msgstr "התקנים נשלפים"
|
||||
|
||||
#: ../js/ui/autorunManager.js:548
|
||||
#: ../js/ui/autorunManager.js:551
|
||||
#, c-format
|
||||
msgid "Open with %s"
|
||||
msgstr "פתיחה באמצעות %s"
|
||||
|
||||
#: ../js/ui/autorunManager.js:574
|
||||
#: ../js/ui/autorunManager.js:577
|
||||
msgid "Eject"
|
||||
msgstr "שליפה"
|
||||
|
||||
@@ -429,18 +435,18 @@ msgstr "היום"
|
||||
msgid "Tomorrow"
|
||||
msgstr "מחר"
|
||||
|
||||
#: ../js/ui/calendar.js:727
|
||||
#: ../js/ui/calendar.js:729
|
||||
msgid "This week"
|
||||
msgstr "השבוע"
|
||||
|
||||
#: ../js/ui/calendar.js:735
|
||||
#: ../js/ui/calendar.js:737
|
||||
msgid "Next week"
|
||||
msgstr "בשבוע הבא"
|
||||
|
||||
#: ../js/ui/dash.js:238
|
||||
#: ../js/ui/messageTray.js:1321
|
||||
msgid "Remove"
|
||||
msgstr "הסרה"
|
||||
#: ../js/ui/dash.js:245
|
||||
#: ../js/ui/dash.js:273
|
||||
msgid "Show Applications"
|
||||
msgstr "הצגת יישומים"
|
||||
|
||||
#: ../js/ui/dateMenu.js:94
|
||||
msgid "Date and Time Settings"
|
||||
@@ -565,7 +571,7 @@ msgstr "מגש מערכת"
|
||||
|
||||
#: ../js/ui/keyboard.js:545
|
||||
#: ../js/ui/status/keyboard.js:146
|
||||
#: ../js/ui/status/power.js:205
|
||||
#: ../js/ui/status/power.js:207
|
||||
msgid "Keyboard"
|
||||
msgstr "מקלדת"
|
||||
|
||||
@@ -574,7 +580,7 @@ msgstr "מקלדת"
|
||||
msgid "Password:"
|
||||
msgstr "ססמה:"
|
||||
|
||||
#: ../js/ui/keyringPrompt.js:102
|
||||
#: ../js/ui/keyringPrompt.js:105
|
||||
msgid "Type again:"
|
||||
msgstr "נא להקליד שוב:"
|
||||
|
||||
@@ -634,127 +640,135 @@ msgstr "דף אינטרנט"
|
||||
msgid "Screencast from %d %t"
|
||||
msgstr "צילום מסך מהקובץ %d %t"
|
||||
|
||||
#: ../js/ui/messageTray.js:1314
|
||||
#: ../js/ui/messageTray.js:1228
|
||||
msgid "Open"
|
||||
msgstr "פתיחה"
|
||||
|
||||
#: ../js/ui/messageTray.js:1331
|
||||
#: ../js/ui/messageTray.js:1235
|
||||
msgid "Remove"
|
||||
msgstr "הסרה"
|
||||
|
||||
#: ../js/ui/messageTray.js:1245
|
||||
msgid "Unmute"
|
||||
msgstr "ביטול ההשתקה"
|
||||
|
||||
#: ../js/ui/messageTray.js:1331
|
||||
#: ../js/ui/messageTray.js:1245
|
||||
msgid "Mute"
|
||||
msgstr "השתקה"
|
||||
|
||||
#: ../js/ui/messageTray.js:2664
|
||||
#: ../js/ui/messageTray.js:2020
|
||||
msgid "Message Tray"
|
||||
msgstr "אזור דיווח ההודעות"
|
||||
|
||||
#: ../js/ui/messageTray.js:2458
|
||||
msgid "System Information"
|
||||
msgstr "פרטי המערכת"
|
||||
|
||||
#: ../js/ui/networkAgent.js:148
|
||||
#: ../js/ui/networkAgent.js:151
|
||||
msgid "Connect"
|
||||
msgstr "התחברות"
|
||||
|
||||
#. Cisco LEAP
|
||||
#: ../js/ui/networkAgent.js:238
|
||||
#: ../js/ui/networkAgent.js:250
|
||||
#: ../js/ui/networkAgent.js:277
|
||||
#: ../js/ui/networkAgent.js:297
|
||||
#: ../js/ui/networkAgent.js:307
|
||||
#: ../js/ui/networkAgent.js:241
|
||||
#: ../js/ui/networkAgent.js:253
|
||||
#: ../js/ui/networkAgent.js:280
|
||||
#: ../js/ui/networkAgent.js:300
|
||||
#: ../js/ui/networkAgent.js:310
|
||||
msgid "Password: "
|
||||
msgstr "ססמה:"
|
||||
|
||||
#. static WEP
|
||||
#: ../js/ui/networkAgent.js:243
|
||||
#: ../js/ui/networkAgent.js:246
|
||||
msgid "Key: "
|
||||
msgstr "מפתח:"
|
||||
|
||||
#. TTLS and PEAP are actually much more complicated, but this complication
|
||||
#. is not visible here since we only care about phase2 authentication
|
||||
#. (and don't even care of which one)
|
||||
#: ../js/ui/networkAgent.js:275
|
||||
#: ../js/ui/networkAgent.js:293
|
||||
#: ../js/ui/networkAgent.js:278
|
||||
#: ../js/ui/networkAgent.js:296
|
||||
msgid "Username: "
|
||||
msgstr "שם משתמש:"
|
||||
|
||||
#: ../js/ui/networkAgent.js:281
|
||||
#: ../js/ui/networkAgent.js:284
|
||||
msgid "Identity: "
|
||||
msgstr "זהות:"
|
||||
|
||||
#: ../js/ui/networkAgent.js:283
|
||||
#: ../js/ui/networkAgent.js:286
|
||||
msgid "Private key password: "
|
||||
msgstr "ססמת מפתח פרטי:"
|
||||
|
||||
#: ../js/ui/networkAgent.js:295
|
||||
#: ../js/ui/networkAgent.js:298
|
||||
msgid "Service: "
|
||||
msgstr "שירות:"
|
||||
|
||||
#: ../js/ui/networkAgent.js:324
|
||||
#: ../js/ui/networkAgent.js:327
|
||||
msgid "Authentication required by wireless network"
|
||||
msgstr "הרשת האלחוטית דורשת אימות"
|
||||
|
||||
#: ../js/ui/networkAgent.js:325
|
||||
#: ../js/ui/networkAgent.js:328
|
||||
#, c-format
|
||||
msgid "Passwords or encryption keys are required to access the wireless network '%s'."
|
||||
msgstr "ססמאות או מפתחות הצפנה נדרשים כדי לגשת לרשת האלחוטית '%s'."
|
||||
|
||||
#: ../js/ui/networkAgent.js:329
|
||||
#: ../js/ui/networkAgent.js:332
|
||||
msgid "Wired 802.1X authentication"
|
||||
msgstr "אימות Wired 802.1X"
|
||||
|
||||
#: ../js/ui/networkAgent.js:331
|
||||
#: ../js/ui/networkAgent.js:334
|
||||
msgid "Network name: "
|
||||
msgstr "שם הרשת:"
|
||||
|
||||
#: ../js/ui/networkAgent.js:336
|
||||
#: ../js/ui/networkAgent.js:339
|
||||
msgid "DSL authentication"
|
||||
msgstr "אימות DSL"
|
||||
|
||||
#: ../js/ui/networkAgent.js:343
|
||||
#: ../js/ui/networkAgent.js:346
|
||||
msgid "PIN code required"
|
||||
msgstr "נדרש קוד PIN"
|
||||
|
||||
#: ../js/ui/networkAgent.js:344
|
||||
#: ../js/ui/networkAgent.js:347
|
||||
msgid "PIN code is needed for the mobile broadband device"
|
||||
msgstr "נדרש קוד PIN עבור התקן החיבור האלחוטי בפס רחב"
|
||||
|
||||
#: ../js/ui/networkAgent.js:345
|
||||
#: ../js/ui/networkAgent.js:348
|
||||
msgid "PIN: "
|
||||
msgstr "PIN: "
|
||||
|
||||
#: ../js/ui/networkAgent.js:351
|
||||
#: ../js/ui/networkAgent.js:354
|
||||
msgid "Mobile broadband network password"
|
||||
msgstr "ססמת רשת הפס הרחב הניידת"
|
||||
|
||||
#: ../js/ui/networkAgent.js:352
|
||||
#: ../js/ui/networkAgent.js:355
|
||||
#, c-format
|
||||
msgid "A password is required to connect to '%s'."
|
||||
msgstr "נדרשת ססמה כדי להתחבר אל '%s'."
|
||||
|
||||
#: ../js/ui/notificationDaemon.js:506
|
||||
#: ../src/shell-app.c:374
|
||||
#: ../src/shell-app.c:373
|
||||
msgctxt "program"
|
||||
msgid "Unknown"
|
||||
msgstr "לא ידוע"
|
||||
|
||||
#: ../js/ui/overview.js:89
|
||||
#: ../js/ui/overview.js:84
|
||||
msgid "Undo"
|
||||
msgstr "ביטול"
|
||||
|
||||
#: ../js/ui/overview.js:129
|
||||
#: ../js/ui/overview.js:124
|
||||
msgid "Overview"
|
||||
msgstr "סקירה"
|
||||
|
||||
#: ../js/ui/overview.js:199
|
||||
msgid "Windows"
|
||||
msgstr "חלונות"
|
||||
|
||||
#: ../js/ui/overview.js:202
|
||||
msgid "Applications"
|
||||
msgstr "יישומים"
|
||||
#. Translators: this is the text displayed
|
||||
#. in the search entry when no search is
|
||||
#. active; it should not exceed ~30
|
||||
#. characters.
|
||||
#: ../js/ui/overview.js:193
|
||||
msgid "Type to search..."
|
||||
msgstr "יש להקליד כדי לחפש..."
|
||||
|
||||
#. Translators: this is the name of the dock/favorites area on
|
||||
#. the left of the overview
|
||||
#: ../js/ui/overview.js:227
|
||||
#: ../js/ui/overview.js:214
|
||||
msgid "Dash"
|
||||
msgstr "חלונית"
|
||||
|
||||
@@ -815,7 +829,7 @@ msgstr "פעולה זו לא הצליחה, נא לנסות שוב. עמך הסל
|
||||
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
|
||||
#. switches containing "◯" and "|"). Other values will
|
||||
#. simply result in invisible toggle switches.
|
||||
#: ../js/ui/popupMenu.js:723
|
||||
#: ../js/ui/popupMenu.js:726
|
||||
msgid "toggle-switch-us"
|
||||
msgstr "toggle-switch-intl"
|
||||
|
||||
@@ -823,11 +837,33 @@ msgstr "toggle-switch-intl"
|
||||
msgid "Please enter a command:"
|
||||
msgstr "נא להזין פקודה:"
|
||||
|
||||
#: ../js/ui/searchDisplay.js:320
|
||||
#. Translators: This is a time format for a date in
|
||||
#. long format
|
||||
#: ../js/ui/screenShield.js:69
|
||||
msgid "%A, %B %d"
|
||||
msgstr "%A, ה־%d ב%B"
|
||||
|
||||
#: ../js/ui/screenShield.js:134
|
||||
#, c-format
|
||||
msgid "%d new message"
|
||||
msgid_plural "%d new messages"
|
||||
msgstr[0] "הודעה חדשה אחת"
|
||||
msgstr[1] "%d הודעות חדשות"
|
||||
msgstr[2] "2 הודעות חדשות"
|
||||
|
||||
#: ../js/ui/screenShield.js:136
|
||||
#, c-format
|
||||
msgid "%d new notification"
|
||||
msgid_plural "%d new notifications"
|
||||
msgstr[0] "התרעה אחת"
|
||||
msgstr[1] "%d התרעות"
|
||||
msgstr[2] "2 התרעות"
|
||||
|
||||
#: ../js/ui/searchDisplay.js:274
|
||||
msgid "Searching..."
|
||||
msgstr "בחיפוש..."
|
||||
|
||||
#: ../js/ui/searchDisplay.js:373
|
||||
#: ../js/ui/searchDisplay.js:325
|
||||
msgid "No matching results."
|
||||
msgstr "אין תוצאות תואמות."
|
||||
|
||||
@@ -856,7 +892,7 @@ msgid "Remember Passphrase"
|
||||
msgstr "שמירת מילת הצופן"
|
||||
|
||||
#: ../js/ui/shellMountOperation.js:400
|
||||
#: ../js/ui/unlockDialog.js:129
|
||||
#: ../js/ui/unlockDialog.js:132
|
||||
msgid "Unlock"
|
||||
msgstr "שחרור"
|
||||
|
||||
@@ -1005,7 +1041,7 @@ msgid "Grant this time only"
|
||||
msgstr "הענקת גישה הפעם בלבד"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:351
|
||||
#: ../js/ui/telepathyClient.js:1106
|
||||
#: ../js/ui/telepathyClient.js:1110
|
||||
msgid "Reject"
|
||||
msgstr "סירוב"
|
||||
|
||||
@@ -1164,15 +1200,15 @@ msgstr "הגדרות הרשת"
|
||||
msgid "Network Manager"
|
||||
msgstr "מנהל הרשתות"
|
||||
|
||||
#: ../js/ui/status/network.js:1802
|
||||
#: ../js/ui/status/network.js:1801
|
||||
msgid "Connection failed"
|
||||
msgstr "ההתחברות נכשל"
|
||||
|
||||
#: ../js/ui/status/network.js:1803
|
||||
#: ../js/ui/status/network.js:1802
|
||||
msgid "Activation of network connection failed"
|
||||
msgstr "הפעלת חיבור הרשת נכשלה"
|
||||
|
||||
#: ../js/ui/status/network.js:2066
|
||||
#: ../js/ui/status/network.js:2103
|
||||
msgid "Networking is disabled"
|
||||
msgstr "תכונת הרשת מנוטרלת"
|
||||
|
||||
@@ -1233,47 +1269,47 @@ msgctxt "percent of battery remaining"
|
||||
msgid "%d%%"
|
||||
msgstr "%d%%"
|
||||
|
||||
#: ../js/ui/status/power.js:195
|
||||
#: ../js/ui/status/power.js:197
|
||||
msgid "AC adapter"
|
||||
msgstr "מתאם חשמל"
|
||||
|
||||
#: ../js/ui/status/power.js:197
|
||||
#: ../js/ui/status/power.js:199
|
||||
msgid "Laptop battery"
|
||||
msgstr "סוללת נייד"
|
||||
|
||||
#: ../js/ui/status/power.js:199
|
||||
#: ../js/ui/status/power.js:201
|
||||
msgid "UPS"
|
||||
msgstr "אל־פסק"
|
||||
|
||||
#: ../js/ui/status/power.js:201
|
||||
#: ../js/ui/status/power.js:203
|
||||
msgid "Monitor"
|
||||
msgstr "צג"
|
||||
|
||||
#: ../js/ui/status/power.js:203
|
||||
#: ../js/ui/status/power.js:205
|
||||
msgid "Mouse"
|
||||
msgstr "עכבר"
|
||||
|
||||
#: ../js/ui/status/power.js:207
|
||||
#: ../js/ui/status/power.js:209
|
||||
msgid "PDA"
|
||||
msgstr "מחשב כף יד"
|
||||
|
||||
#: ../js/ui/status/power.js:209
|
||||
#: ../js/ui/status/power.js:211
|
||||
msgid "Cell phone"
|
||||
msgstr "טלפון סלולרי"
|
||||
|
||||
#: ../js/ui/status/power.js:211
|
||||
#: ../js/ui/status/power.js:213
|
||||
msgid "Media player"
|
||||
msgstr "נגן מדיה"
|
||||
|
||||
#: ../js/ui/status/power.js:213
|
||||
#: ../js/ui/status/power.js:215
|
||||
msgid "Tablet"
|
||||
msgstr "טבלת שליטה"
|
||||
|
||||
#: ../js/ui/status/power.js:215
|
||||
#: ../js/ui/status/power.js:217
|
||||
msgid "Computer"
|
||||
msgstr "מחשב"
|
||||
|
||||
#: ../js/ui/status/power.js:217
|
||||
#: ../js/ui/status/power.js:219
|
||||
msgctxt "device"
|
||||
msgid "Unknown"
|
||||
msgstr "לא ידוע"
|
||||
@@ -1290,60 +1326,60 @@ msgstr "מיקרופון"
|
||||
|
||||
#. FIXME: We don't have a 'chat room' icon (bgo #653737) use
|
||||
#. system-users for now as Empathy does.
|
||||
#: ../js/ui/telepathyClient.js:226
|
||||
#: ../js/ui/telepathyClient.js:228
|
||||
msgid "Invitation"
|
||||
msgstr "הזמנה"
|
||||
|
||||
#. We got the TpContact
|
||||
#: ../js/ui/telepathyClient.js:284
|
||||
#: ../js/ui/telepathyClient.js:288
|
||||
msgid "Call"
|
||||
msgstr "התקשרות"
|
||||
|
||||
#. We got the TpContact
|
||||
#: ../js/ui/telepathyClient.js:300
|
||||
#: ../js/ui/telepathyClient.js:304
|
||||
msgid "File Transfer"
|
||||
msgstr "העברת קבצים"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:381
|
||||
#: ../js/ui/telepathyClient.js:385
|
||||
msgid "Subscription request"
|
||||
msgstr "בקשת הרשמה"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:418
|
||||
#: ../js/ui/telepathyClient.js:422
|
||||
msgid "Connection error"
|
||||
msgstr "שגיאת התחברות"
|
||||
|
||||
#. Translators: this is a time format string followed by a date.
|
||||
#. If applicable, replace %X with a strftime format valid for your
|
||||
#. locale, without seconds.
|
||||
#: ../js/ui/telepathyClient.js:917
|
||||
#: ../js/ui/telepathyClient.js:921
|
||||
#, no-c-format
|
||||
msgid "Sent at <b>%X</b> on <b>%A</b>"
|
||||
msgstr "נשלח ב־<b>%X</b> בשעה <b>%A</b>"
|
||||
|
||||
#. Translators: this is a time format in the style of "Wednesday, May 25",
|
||||
#. shown when you get a chat message in the same year.
|
||||
#: ../js/ui/telepathyClient.js:923
|
||||
#: ../js/ui/telepathyClient.js:927
|
||||
#, no-c-format
|
||||
msgid "Sent on <b>%A</b>, <b>%B %d</b>"
|
||||
msgstr "נשלח ב<b>%A</b>, <b>ה־%d ב%B</b>"
|
||||
|
||||
#. Translators: this is a time format in the style of "Wednesday, May 25, 2012",
|
||||
#. shown when you get a chat message in a different year.
|
||||
#: ../js/ui/telepathyClient.js:928
|
||||
#: ../js/ui/telepathyClient.js:932
|
||||
#, no-c-format
|
||||
msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y"
|
||||
msgstr "נשלח ב<b>%A</b>, <b>ה־%d ב%B</b>, %Y"
|
||||
|
||||
#. Translators: this is the other person changing their old IM name to their new
|
||||
#. IM name.
|
||||
#: ../js/ui/telepathyClient.js:957
|
||||
#: ../js/ui/telepathyClient.js:961
|
||||
#, c-format
|
||||
msgid "%s is now known as %s"
|
||||
msgstr "השם של %s הוחלף ל־%s"
|
||||
|
||||
#. translators: argument is a room name like
|
||||
#. * room@jabber.org for example.
|
||||
#: ../js/ui/telepathyClient.js:1057
|
||||
#: ../js/ui/telepathyClient.js:1061
|
||||
#, c-format
|
||||
msgid "Invitation to %s"
|
||||
msgstr "הזמנה ל־%s"
|
||||
@@ -1351,37 +1387,37 @@ msgstr "הזמנה ל־%s"
|
||||
#. translators: first argument is the name of a contact and the second
|
||||
#. * one the name of a room. "Alice is inviting you to join room@jabber.org
|
||||
#. * for example.
|
||||
#: ../js/ui/telepathyClient.js:1065
|
||||
#: ../js/ui/telepathyClient.js:1069
|
||||
#, c-format
|
||||
msgid "%s is inviting you to join %s"
|
||||
msgstr "הוזמנת על ידי %s להצטרף אל %s"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1067
|
||||
#: ../js/ui/telepathyClient.js:1146
|
||||
#: ../js/ui/telepathyClient.js:1210
|
||||
#: ../js/ui/telepathyClient.js:1071
|
||||
#: ../js/ui/telepathyClient.js:1150
|
||||
#: ../js/ui/telepathyClient.js:1214
|
||||
msgid "Decline"
|
||||
msgstr "דחייה"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1068
|
||||
#: ../js/ui/telepathyClient.js:1147
|
||||
#: ../js/ui/telepathyClient.js:1211
|
||||
#: ../js/ui/telepathyClient.js:1072
|
||||
#: ../js/ui/telepathyClient.js:1151
|
||||
#: ../js/ui/telepathyClient.js:1215
|
||||
msgid "Accept"
|
||||
msgstr "אישור"
|
||||
|
||||
#. translators: argument is a contact name like Alice for example.
|
||||
#: ../js/ui/telepathyClient.js:1098
|
||||
#: ../js/ui/telepathyClient.js:1102
|
||||
#, c-format
|
||||
msgid "Video call from %s"
|
||||
msgstr "שיחת וידאו מאת %s"
|
||||
|
||||
#. translators: argument is a contact name like Alice for example.
|
||||
#: ../js/ui/telepathyClient.js:1101
|
||||
#: ../js/ui/telepathyClient.js:1105
|
||||
#, c-format
|
||||
msgid "Call from %s"
|
||||
msgstr "שיחה מאת %s"
|
||||
|
||||
#. translators: this is a button label (verb), not a noun
|
||||
#: ../js/ui/telepathyClient.js:1108
|
||||
#: ../js/ui/telepathyClient.js:1112
|
||||
msgid "Answer"
|
||||
msgstr "מענה"
|
||||
|
||||
@@ -1390,211 +1426,211 @@ msgstr "מענה"
|
||||
#. * file name. The string will be something
|
||||
#. * like: "Alice is sending you test.ogg"
|
||||
#.
|
||||
#: ../js/ui/telepathyClient.js:1140
|
||||
#: ../js/ui/telepathyClient.js:1144
|
||||
#, c-format
|
||||
msgid "%s is sending you %s"
|
||||
msgstr "%s שולח/ת אליך %s"
|
||||
|
||||
#. To translators: The parameter is the contact's alias
|
||||
#: ../js/ui/telepathyClient.js:1175
|
||||
#: ../js/ui/telepathyClient.js:1179
|
||||
#, c-format
|
||||
msgid "%s would like permission to see when you are online"
|
||||
msgstr "%s רוצה לקבל הרשאות כדי לראות מתי מצבך הוא מקוון"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1268
|
||||
#: ../js/ui/telepathyClient.js:1272
|
||||
msgid "Network error"
|
||||
msgstr "שגיאת רשת"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1270
|
||||
#: ../js/ui/telepathyClient.js:1274
|
||||
msgid "Authentication failed"
|
||||
msgstr "האימות נכשל"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1272
|
||||
#: ../js/ui/telepathyClient.js:1276
|
||||
msgid "Encryption error"
|
||||
msgstr "שגיאת הצפנה"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1274
|
||||
#: ../js/ui/telepathyClient.js:1278
|
||||
msgid "Certificate not provided"
|
||||
msgstr "לא סופק אישור"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1276
|
||||
#: ../js/ui/telepathyClient.js:1280
|
||||
msgid "Certificate untrusted"
|
||||
msgstr "האישור אינו מהימן"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1278
|
||||
#: ../js/ui/telepathyClient.js:1282
|
||||
msgid "Certificate expired"
|
||||
msgstr "האישור פג"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1280
|
||||
#: ../js/ui/telepathyClient.js:1284
|
||||
msgid "Certificate not activated"
|
||||
msgstr "האישור לא מופעל"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1282
|
||||
#: ../js/ui/telepathyClient.js:1286
|
||||
msgid "Certificate hostname mismatch"
|
||||
msgstr "שם המארח באישור אינו תואם"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1284
|
||||
#: ../js/ui/telepathyClient.js:1288
|
||||
msgid "Certificate fingerprint mismatch"
|
||||
msgstr "חוסר התאמה בטביעת האצבע של האישור"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1286
|
||||
#: ../js/ui/telepathyClient.js:1290
|
||||
msgid "Certificate self-signed"
|
||||
msgstr "אישור בחתימה עצמית"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1288
|
||||
#: ../js/ui/telepathyClient.js:1292
|
||||
msgid "Status is set to offline"
|
||||
msgstr "המצב הוגדר ל'מנותק'"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1290
|
||||
#: ../js/ui/telepathyClient.js:1294
|
||||
msgid "Encryption is not available"
|
||||
msgstr "ההצפנה אינה זמינה"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1292
|
||||
#: ../js/ui/telepathyClient.js:1296
|
||||
msgid "Certificate is invalid"
|
||||
msgstr "האישור אינו תקף"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1294
|
||||
#: ../js/ui/telepathyClient.js:1298
|
||||
msgid "Connection has been refused"
|
||||
msgstr "ההתחברות נשללה"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1296
|
||||
#: ../js/ui/telepathyClient.js:1300
|
||||
msgid "Connection can't be established"
|
||||
msgstr "לא ניתן להפעיל את החיבור"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1298
|
||||
#: ../js/ui/telepathyClient.js:1302
|
||||
msgid "Connection has been lost"
|
||||
msgstr "החיבור אבד"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1300
|
||||
#: ../js/ui/telepathyClient.js:1304
|
||||
msgid "This account is already connected to the server"
|
||||
msgstr "חשבון זה כבר מחובר לשרת"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1302
|
||||
#: ../js/ui/telepathyClient.js:1306
|
||||
msgid "Connection has been replaced by a new connection using the same resource"
|
||||
msgstr "החיבור הוחלף בחיבור חדש באמצעות אותו המשאב"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1304
|
||||
#: ../js/ui/telepathyClient.js:1308
|
||||
msgid "The account already exists on the server"
|
||||
msgstr "החשבון כבר קיים בשרת"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1306
|
||||
#: ../js/ui/telepathyClient.js:1310
|
||||
msgid "Server is currently too busy to handle the connection"
|
||||
msgstr "השרת עסוק ברגע זה מכדי לטפל בחיבור"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1308
|
||||
#: ../js/ui/telepathyClient.js:1312
|
||||
msgid "Certificate has been revoked"
|
||||
msgstr "האישור נשלל"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1310
|
||||
#: ../js/ui/telepathyClient.js:1314
|
||||
msgid "Certificate uses an insecure cipher algorithm or is cryptographically weak"
|
||||
msgstr "האישור משתמש באלגוריתם הצפנה שאינו בטוח או חלש מבחינת הצפנה"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1312
|
||||
#: ../js/ui/telepathyClient.js:1316
|
||||
msgid "The length of the server certificate, or the depth of the server certificate chain, exceed the limits imposed by the cryptography library"
|
||||
msgstr "אורך אישור השרת, או עומק שרשרת אישור השרת, חורגים מהמגבלות שנכפו על ידי ספריית ההצפנה"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1314
|
||||
#: ../js/ui/telepathyClient.js:1318
|
||||
msgid "Internal error"
|
||||
msgstr "שגיאה פנימית"
|
||||
|
||||
#. translators: argument is the account name, like
|
||||
#. * name@jabber.org for example.
|
||||
#: ../js/ui/telepathyClient.js:1324
|
||||
#: ../js/ui/telepathyClient.js:1328
|
||||
#, c-format
|
||||
msgid "Connection to %s failed"
|
||||
msgstr "החיבור אל %s נכשל"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1333
|
||||
#: ../js/ui/telepathyClient.js:1337
|
||||
msgid "Reconnect"
|
||||
msgstr "התחברות מחדש"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1334
|
||||
#: ../js/ui/telepathyClient.js:1338
|
||||
msgid "Edit account"
|
||||
msgstr "עריכת חשבון"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1380
|
||||
#: ../js/ui/telepathyClient.js:1383
|
||||
msgid "Unknown reason"
|
||||
msgstr "סיבה לא ידועה"
|
||||
|
||||
#: ../js/ui/unlockDialog.js:138
|
||||
msgid "Login as another user"
|
||||
#: ../js/ui/unlockDialog.js:140
|
||||
msgid "Log in as another user"
|
||||
msgstr "כניסה בתור משתמש אחר"
|
||||
|
||||
#: ../js/ui/userMenu.js:161
|
||||
#: ../js/ui/userMenu.js:167
|
||||
msgid "Available"
|
||||
msgstr "זמין"
|
||||
|
||||
#: ../js/ui/userMenu.js:164
|
||||
#: ../js/ui/userMenu.js:170
|
||||
msgid "Busy"
|
||||
msgstr "עסוק"
|
||||
|
||||
#: ../js/ui/userMenu.js:167
|
||||
#: ../js/ui/userMenu.js:173
|
||||
msgid "Invisible"
|
||||
msgstr "בלתי נראה"
|
||||
|
||||
#: ../js/ui/userMenu.js:170
|
||||
#: ../js/ui/userMenu.js:176
|
||||
msgid "Away"
|
||||
msgstr "מרוחק"
|
||||
|
||||
#: ../js/ui/userMenu.js:173
|
||||
#: ../js/ui/userMenu.js:179
|
||||
msgid "Idle"
|
||||
msgstr "בהמתנה"
|
||||
|
||||
#: ../js/ui/userMenu.js:176
|
||||
#: ../js/ui/userMenu.js:182
|
||||
msgid "Unavailable"
|
||||
msgstr "לא זמין"
|
||||
|
||||
#: ../js/ui/userMenu.js:567
|
||||
#: ../js/ui/userMenu.js:708
|
||||
#: ../js/ui/userMenu.js:589
|
||||
#: ../js/ui/userMenu.js:730
|
||||
msgid "Switch User"
|
||||
msgstr "החלפת משתמש"
|
||||
|
||||
#: ../js/ui/userMenu.js:568
|
||||
#: ../js/ui/userMenu.js:590
|
||||
msgid "Switch Session"
|
||||
msgstr "החלפת הפעלה"
|
||||
|
||||
#: ../js/ui/userMenu.js:691
|
||||
#: ../js/ui/userMenu.js:713
|
||||
msgid "Notifications"
|
||||
msgstr "התרעות"
|
||||
|
||||
#: ../js/ui/userMenu.js:700
|
||||
#: ../js/ui/userMenu.js:722
|
||||
msgid "System Settings"
|
||||
msgstr "הגדרות המערכת"
|
||||
|
||||
#: ../js/ui/userMenu.js:713
|
||||
#: ../js/ui/userMenu.js:735
|
||||
msgid "Log Out"
|
||||
msgstr "ֹיציאה"
|
||||
|
||||
#: ../js/ui/userMenu.js:718
|
||||
#: ../js/ui/userMenu.js:740
|
||||
msgid "Lock"
|
||||
msgstr "נעילה"
|
||||
|
||||
#: ../js/ui/userMenu.js:733
|
||||
#: ../js/ui/userMenu.js:755
|
||||
msgid "Install Updates & Restart"
|
||||
msgstr "התקנת עדכונים והפעלה מחדש"
|
||||
|
||||
#: ../js/ui/userMenu.js:751
|
||||
#: ../js/ui/userMenu.js:773
|
||||
msgid "Your chat status will be set to busy"
|
||||
msgstr "מצב הצ׳אט שלך יוגדר ל'עסוק'"
|
||||
|
||||
#: ../js/ui/userMenu.js:752
|
||||
#: ../js/ui/userMenu.js:774
|
||||
msgid "Notifications are now disabled, including chat messages. Your online status has been adjusted to let others know that you might not see their messages."
|
||||
msgstr "ההתרעות כבויות כעת, לרבות הודעות צ׳אט. המצב המקוון שלך הותאם כדי לבשר לאחרים שיתכן שהודעותיהם לא יתקבלו באופן מיידי."
|
||||
|
||||
#. Translators: this is the text displayed
|
||||
#. in the search entry when no search is
|
||||
#. active; it should not exceed ~30
|
||||
#. characters.
|
||||
#: ../js/ui/viewSelector.js:113
|
||||
msgid "Type to search..."
|
||||
msgstr "יש להקליד כדי לחפש..."
|
||||
#: ../js/ui/viewSelector.js:88
|
||||
msgid "Windows"
|
||||
msgstr "חלונות"
|
||||
|
||||
#: ../js/ui/viewSelector.js:131
|
||||
#: ../src/shell-util.c:254
|
||||
#: ../js/ui/viewSelector.js:92
|
||||
msgid "Applications"
|
||||
msgstr "יישומים"
|
||||
|
||||
#: ../js/ui/viewSelector.js:96
|
||||
#: ../src/shell-util.c:250
|
||||
msgid "Search"
|
||||
msgstr "חיפוש"
|
||||
|
||||
#: ../js/ui/wanda.js:124
|
||||
#: ../js/ui/wanda.js:125
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Sorry, no wisdom for you today:\n"
|
||||
@@ -1603,12 +1639,12 @@ msgstr ""
|
||||
"אין משפטי חכמה עבורך להיום, צר לי:\n"
|
||||
"%s"
|
||||
|
||||
#: ../js/ui/wanda.js:128
|
||||
#: ../js/ui/wanda.js:129
|
||||
#, c-format
|
||||
msgid "%s the Oracle says"
|
||||
msgstr "%s, כה אמרה האוראקל"
|
||||
|
||||
#: ../js/ui/wanda.js:168
|
||||
#: ../js/ui/wanda.js:170
|
||||
msgid "Your favorite Easter Egg"
|
||||
msgstr "ביצת הפסחא האהובה עליך"
|
||||
|
||||
@@ -1661,7 +1697,7 @@ msgstr "שימוש במצב מסוים, לדוגמה: „gdm“ למסך הכנ
|
||||
msgid "List possible modes"
|
||||
msgstr "הצגת המצבים האפשריים"
|
||||
|
||||
#: ../src/shell-app.c:622
|
||||
#: ../src/shell-app.c:621
|
||||
#, c-format
|
||||
msgid "Failed to launch '%s'"
|
||||
msgstr "אירע כשל בטעינת '%s'"
|
||||
@@ -1688,13 +1724,13 @@ msgstr "המשתמש בחר להתעלם מתיבת דו־שיח האימות"
|
||||
|
||||
#. Translators: this is the same string as the one found in
|
||||
#. * nautilus
|
||||
#: ../src/shell-util.c:98
|
||||
#: ../src/shell-util.c:94
|
||||
msgid "Home"
|
||||
msgstr "בית"
|
||||
|
||||
#. Translators: this is the same string as the one found in
|
||||
#. * nautilus
|
||||
#: ../src/shell-util.c:108
|
||||
#: ../src/shell-util.c:104
|
||||
msgid "File System"
|
||||
msgstr "מערכת הקבצים"
|
||||
|
||||
@@ -1703,7 +1739,7 @@ msgstr "מערכת הקבצים"
|
||||
#. * example, "Trash: some-directory". It means that the
|
||||
#. * directory called "some-directory" is in the trash.
|
||||
#.
|
||||
#: ../src/shell-util.c:304
|
||||
#: ../src/shell-util.c:300
|
||||
#, c-format
|
||||
msgid "%1$s: %2$s"
|
||||
msgstr "%1$s: %2$s"
|
||||
|
||||
@@ -59,8 +59,7 @@ function init() {
|
||||
x_fill: true,
|
||||
y_fill: false,
|
||||
track_hover: true });
|
||||
let icon = new St.Icon({ icon_name: 'system-run',
|
||||
icon_type: St.IconType.SYMBOLIC,
|
||||
let icon = new St.Icon({ icon_name: 'system-run-symbolic',
|
||||
style_class: 'system-status-icon' });
|
||||
|
||||
button.set_child(icon);
|
||||
|
||||
@@ -74,7 +74,6 @@ struct _ShellApp
|
||||
|
||||
char *casefolded_name;
|
||||
char *name_collation_key;
|
||||
char *casefolded_description;
|
||||
char *casefolded_exec;
|
||||
char **casefolded_keywords;
|
||||
};
|
||||
@@ -1282,6 +1281,8 @@ unref_running_state (ShellAppRunningState *state)
|
||||
|
||||
g_clear_object (&state->remote_menu);
|
||||
g_clear_object (&state->muxer);
|
||||
g_clear_pointer (&state->unique_bus_name, g_free);
|
||||
g_clear_pointer (&state->remote_menu, g_free);
|
||||
|
||||
g_slice_free (ShellAppRunningState, state);
|
||||
}
|
||||
@@ -1310,7 +1311,6 @@ shell_app_init_search_data (ShellApp *app)
|
||||
{
|
||||
const char *name;
|
||||
const char *exec;
|
||||
const char *comment;
|
||||
const char * const *keywords;
|
||||
char *normalized_exec;
|
||||
GDesktopAppInfo *appinfo;
|
||||
@@ -1319,9 +1319,6 @@ shell_app_init_search_data (ShellApp *app)
|
||||
name = g_app_info_get_name (G_APP_INFO (appinfo));
|
||||
app->casefolded_name = shell_util_normalize_and_casefold (name);
|
||||
|
||||
comment = g_app_info_get_description (G_APP_INFO (appinfo));
|
||||
app->casefolded_description = shell_util_normalize_and_casefold (comment);
|
||||
|
||||
exec = g_app_info_get_executable (G_APP_INFO (appinfo));
|
||||
normalized_exec = shell_util_normalize_and_casefold (exec);
|
||||
app->casefolded_exec = trim_exec_line (normalized_exec);
|
||||
@@ -1403,16 +1400,6 @@ _shell_app_match_search_terms (ShellApp *app,
|
||||
}
|
||||
}
|
||||
|
||||
if (app->casefolded_description && current_match < MATCH_PREFIX)
|
||||
{
|
||||
/* Only do substring matches, as prefix matches are not meaningful
|
||||
* enough for descriptions
|
||||
*/
|
||||
p = strstr (app->casefolded_description, term);
|
||||
if (p != NULL)
|
||||
current_match = MATCH_SUBSTRING;
|
||||
}
|
||||
|
||||
if (app->casefolded_keywords)
|
||||
{
|
||||
int i = 0;
|
||||
@@ -1511,7 +1498,6 @@ shell_app_finalize (GObject *object)
|
||||
|
||||
g_free (app->casefolded_name);
|
||||
g_free (app->name_collation_key);
|
||||
g_free (app->casefolded_description);
|
||||
g_free (app->casefolded_exec);
|
||||
g_strfreev (app->casefolded_keywords);
|
||||
|
||||
|
||||
@@ -1686,60 +1686,6 @@ gboolean _shell_global_check_xdnd_event (ShellGlobal *global,
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* shell_global_launch_calendar_server:
|
||||
* @global: The #ShellGlobal.
|
||||
*
|
||||
* Launch the gnome-shell-calendar-server helper.
|
||||
*/
|
||||
void
|
||||
shell_global_launch_calendar_server (ShellGlobal *global)
|
||||
{
|
||||
const gchar *bin_dir;
|
||||
gchar *calendar_server_exe;
|
||||
GError *error;
|
||||
gchar *argv[2];
|
||||
gint child_standard_input;
|
||||
|
||||
/* launch calendar-server */
|
||||
bin_dir = g_getenv ("GNOME_SHELL_BINDIR");
|
||||
if (bin_dir != NULL)
|
||||
calendar_server_exe = g_strdup_printf ("%s/gnome-shell-calendar-server", bin_dir);
|
||||
else
|
||||
calendar_server_exe = g_strdup_printf (GNOME_SHELL_LIBEXECDIR "/gnome-shell-calendar-server");
|
||||
|
||||
argv[0] = calendar_server_exe;
|
||||
argv[1] = NULL;
|
||||
error = NULL;
|
||||
if (!g_spawn_async_with_pipes (NULL, /* working_directory */
|
||||
argv,
|
||||
NULL, /* envp */
|
||||
0, /* GSpawnFlags */
|
||||
NULL, /* child_setup */
|
||||
NULL, /* user_data */
|
||||
NULL, /* GPid *child_pid */
|
||||
&child_standard_input,
|
||||
NULL, /* gint *stdout */
|
||||
NULL, /* gint *stderr */
|
||||
&error))
|
||||
{
|
||||
g_warning ("Error launching `%s': %s (%s %d)",
|
||||
calendar_server_exe,
|
||||
error->message,
|
||||
g_quark_to_string (error->domain),
|
||||
error->code);
|
||||
g_error_free (error);
|
||||
}
|
||||
/* Note that gnome-shell-calendar-server exits whenever its stdin
|
||||
* file descriptor is HUP'ed. This means that whenever the the shell
|
||||
* process exits or is being replaced, the calendar server is also
|
||||
* exits...and if the shell is being replaced, a new copy of the
|
||||
* calendar server is launched...
|
||||
*/
|
||||
|
||||
g_free (calendar_server_exe);
|
||||
}
|
||||
|
||||
const char *
|
||||
shell_global_get_session_mode (ShellGlobal *global)
|
||||
{
|
||||
|
||||
@@ -134,8 +134,6 @@ void shell_global_init_xdnd (ShellGlobal *global);
|
||||
|
||||
void shell_global_reexec_self (ShellGlobal *global);
|
||||
|
||||
void shell_global_launch_calendar_server (ShellGlobal *global);
|
||||
|
||||
const char * shell_global_get_session_mode (ShellGlobal *global);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
@@ -128,7 +128,7 @@ st_bin_get_preferred_width (ClutterActor *self,
|
||||
|
||||
st_theme_node_adjust_for_height (theme_node, &for_height);
|
||||
|
||||
if (priv->child == NULL)
|
||||
if (priv->child == NULL || !CLUTTER_ACTOR_IS_VISIBLE (priv->child))
|
||||
{
|
||||
if (min_width_p)
|
||||
*min_width_p = 0;
|
||||
@@ -157,7 +157,7 @@ st_bin_get_preferred_height (ClutterActor *self,
|
||||
|
||||
st_theme_node_adjust_for_width (theme_node, &for_width);
|
||||
|
||||
if (priv->child == NULL)
|
||||
if (priv->child == NULL || !CLUTTER_ACTOR_IS_VISIBLE (priv->child))
|
||||
{
|
||||
if (min_height_p)
|
||||
*min_height_p = 0;
|
||||
|
||||
@@ -777,14 +777,32 @@ st_button_accessible_notify_label_cb (StButton *button,
|
||||
g_object_notify (G_OBJECT (accessible), "accessible-name");
|
||||
}
|
||||
|
||||
static void
|
||||
st_button_accessible_compute_role (AtkObject *accessible,
|
||||
StButton *button)
|
||||
{
|
||||
atk_object_set_role (accessible, button->priv->is_toggle
|
||||
? ATK_ROLE_TOGGLE_BUTTON : ATK_ROLE_PUSH_BUTTON);
|
||||
}
|
||||
|
||||
static void
|
||||
st_button_accessible_notify_toggle_mode_cb (StButton *button,
|
||||
GParamSpec *psec,
|
||||
AtkObject *accessible)
|
||||
{
|
||||
st_button_accessible_compute_role (accessible, button);
|
||||
}
|
||||
|
||||
static void
|
||||
st_button_accessible_initialize (AtkObject *obj,
|
||||
gpointer data)
|
||||
gpointer data)
|
||||
{
|
||||
ATK_OBJECT_CLASS (st_button_accessible_parent_class)->initialize (obj, data);
|
||||
|
||||
obj->role = ATK_ROLE_PUSH_BUTTON;
|
||||
st_button_accessible_compute_role (obj, ST_BUTTON (data));
|
||||
|
||||
g_signal_connect (data, "notify::label",
|
||||
G_CALLBACK (st_button_accessible_notify_label_cb), obj);
|
||||
g_signal_connect (data, "notify::toggle-mode",
|
||||
G_CALLBACK (st_button_accessible_notify_toggle_mode_cb), obj);
|
||||
}
|
||||
|
||||
@@ -172,8 +172,7 @@ show_capslock_feedback (StEntry *entry)
|
||||
{
|
||||
ClutterActor *icon = g_object_new (ST_TYPE_ICON,
|
||||
"style-class", "capslock-warning",
|
||||
"icon-type", ST_ICON_SYMBOLIC,
|
||||
"icon-name", "dialog-warning",
|
||||
"icon-name", "dialog-warning-symbolic",
|
||||
NULL);
|
||||
|
||||
st_entry_set_secondary_icon (entry, icon);
|
||||
|
||||
131
src/st/st-icon.c
131
src/st/st-icon.c
@@ -37,7 +37,6 @@ enum
|
||||
|
||||
PROP_GICON,
|
||||
PROP_ICON_NAME,
|
||||
PROP_ICON_TYPE,
|
||||
PROP_ICON_SIZE
|
||||
};
|
||||
|
||||
@@ -53,8 +52,6 @@ struct _StIconPrivate
|
||||
guint opacity_handler_id;
|
||||
|
||||
GIcon *gicon;
|
||||
gchar *icon_name;
|
||||
StIconType icon_type;
|
||||
gint prop_icon_size; /* icon size set as property */
|
||||
gint theme_icon_size; /* icon size from theme node */
|
||||
gint icon_size; /* icon size we are using */
|
||||
@@ -69,7 +66,6 @@ static void st_icon_update (StIcon *icon);
|
||||
static gboolean st_icon_update_icon_size (StIcon *icon);
|
||||
|
||||
#define DEFAULT_ICON_SIZE 48
|
||||
#define DEFAULT_ICON_TYPE ST_ICON_SYMBOLIC
|
||||
|
||||
static void
|
||||
st_icon_set_property (GObject *gobject,
|
||||
@@ -89,10 +85,6 @@ st_icon_set_property (GObject *gobject,
|
||||
st_icon_set_icon_name (icon, g_value_get_string (value));
|
||||
break;
|
||||
|
||||
case PROP_ICON_TYPE:
|
||||
st_icon_set_icon_type (icon, g_value_get_enum (value));
|
||||
break;
|
||||
|
||||
case PROP_ICON_SIZE:
|
||||
st_icon_set_icon_size (icon, g_value_get_int (value));
|
||||
break;
|
||||
@@ -121,10 +113,6 @@ st_icon_get_property (GObject *gobject,
|
||||
g_value_set_string (value, st_icon_get_icon_name (icon));
|
||||
break;
|
||||
|
||||
case PROP_ICON_TYPE:
|
||||
g_value_set_enum (value, st_icon_get_icon_type (icon));
|
||||
break;
|
||||
|
||||
case PROP_ICON_SIZE:
|
||||
g_value_set_int (value, st_icon_get_icon_size (icon));
|
||||
break;
|
||||
@@ -174,20 +162,6 @@ st_icon_dispose (GObject *gobject)
|
||||
G_OBJECT_CLASS (st_icon_parent_class)->dispose (gobject);
|
||||
}
|
||||
|
||||
static void
|
||||
st_icon_finalize (GObject *gobject)
|
||||
{
|
||||
StIconPrivate *priv = ST_ICON (gobject)->priv;
|
||||
|
||||
if (priv->icon_name)
|
||||
{
|
||||
g_free (priv->icon_name);
|
||||
priv->icon_name = NULL;
|
||||
}
|
||||
|
||||
G_OBJECT_CLASS (st_icon_parent_class)->finalize (gobject);
|
||||
}
|
||||
|
||||
static void
|
||||
st_icon_get_preferred_height (ClutterActor *actor,
|
||||
gfloat for_width,
|
||||
@@ -337,7 +311,6 @@ st_icon_class_init (StIconClass *klass)
|
||||
object_class->get_property = st_icon_get_property;
|
||||
object_class->set_property = st_icon_set_property;
|
||||
object_class->dispose = st_icon_dispose;
|
||||
object_class->finalize = st_icon_finalize;
|
||||
|
||||
actor_class->get_preferred_height = st_icon_get_preferred_height;
|
||||
actor_class->get_preferred_width = st_icon_get_preferred_width;
|
||||
@@ -348,7 +321,7 @@ st_icon_class_init (StIconClass *klass)
|
||||
|
||||
pspec = g_param_spec_object ("gicon",
|
||||
"GIcon",
|
||||
"A GIcon to override :icon-name",
|
||||
"The GIcon shown by this icon actor",
|
||||
G_TYPE_ICON,
|
||||
ST_PARAM_READWRITE);
|
||||
g_object_class_install_property (object_class, PROP_GICON, pspec);
|
||||
@@ -356,17 +329,9 @@ st_icon_class_init (StIconClass *klass)
|
||||
pspec = g_param_spec_string ("icon-name",
|
||||
"Icon name",
|
||||
"An icon name",
|
||||
NULL, ST_PARAM_READWRITE);
|
||||
NULL, ST_PARAM_READWRITE | G_PARAM_DEPRECATED);
|
||||
g_object_class_install_property (object_class, PROP_ICON_NAME, pspec);
|
||||
|
||||
pspec = g_param_spec_enum ("icon-type",
|
||||
"Icon type",
|
||||
"The type of icon that should be used",
|
||||
ST_TYPE_ICON_TYPE,
|
||||
DEFAULT_ICON_TYPE,
|
||||
ST_PARAM_READWRITE);
|
||||
g_object_class_install_property (object_class, PROP_ICON_TYPE, pspec);
|
||||
|
||||
pspec = g_param_spec_int ("icon-size",
|
||||
"Icon size",
|
||||
"The size if the icon, if positive. Otherwise the size will be derived from the current style",
|
||||
@@ -382,7 +347,6 @@ st_icon_init (StIcon *self)
|
||||
|
||||
self->priv->icon_size = DEFAULT_ICON_SIZE;
|
||||
self->priv->prop_icon_size = -1;
|
||||
self->priv->icon_type = DEFAULT_ICON_TYPE;
|
||||
|
||||
self->priv->shadow_material = COGL_INVALID_HANDLE;
|
||||
self->priv->shadow_width = -1;
|
||||
@@ -492,14 +456,6 @@ st_icon_update (StIcon *icon)
|
||||
priv->gicon,
|
||||
priv->icon_size);
|
||||
}
|
||||
else if (priv->icon_name)
|
||||
{
|
||||
priv->pending_texture = st_texture_cache_load_icon_name (cache,
|
||||
theme_node,
|
||||
priv->icon_name,
|
||||
priv->icon_type,
|
||||
priv->icon_size);
|
||||
}
|
||||
|
||||
if (priv->pending_texture)
|
||||
{
|
||||
@@ -562,9 +518,16 @@ st_icon_new (void)
|
||||
const gchar *
|
||||
st_icon_get_icon_name (StIcon *icon)
|
||||
{
|
||||
StIconPrivate *priv;
|
||||
|
||||
g_return_val_if_fail (ST_IS_ICON (icon), NULL);
|
||||
|
||||
return icon->priv->icon_name;
|
||||
priv = icon->priv;
|
||||
|
||||
if (priv->gicon && G_IS_THEMED_ICON (priv->gicon))
|
||||
return g_themed_icon_get_names (G_THEMED_ICON (priv->gicon)) [0];
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void
|
||||
@@ -577,71 +540,20 @@ st_icon_set_icon_name (StIcon *icon,
|
||||
|
||||
priv = icon->priv;
|
||||
|
||||
/* Check if there's no change */
|
||||
if (g_strcmp0 (priv->icon_name, icon_name) == 0)
|
||||
return;
|
||||
|
||||
g_free (priv->icon_name);
|
||||
priv->icon_name = g_strdup (icon_name);
|
||||
|
||||
if (priv->gicon)
|
||||
{
|
||||
g_object_unref (priv->gicon);
|
||||
priv->gicon = NULL;
|
||||
g_object_notify (G_OBJECT (icon), "gicon");
|
||||
}
|
||||
g_object_unref (priv->gicon);
|
||||
|
||||
if (icon_name)
|
||||
priv->gicon = g_themed_icon_new_with_default_fallbacks (icon_name);
|
||||
else
|
||||
priv->gicon = NULL;
|
||||
|
||||
g_object_notify (G_OBJECT (icon), "gicon");
|
||||
g_object_notify (G_OBJECT (icon), "icon-name");
|
||||
|
||||
st_icon_update (icon);
|
||||
}
|
||||
|
||||
/**
|
||||
* st_icon_get_icon_type:
|
||||
* @icon: a #StIcon
|
||||
*
|
||||
* Gets the type of icon we'll look up to display in the actor.
|
||||
* See st_icon_set_icon_type().
|
||||
*
|
||||
* Return value: the icon type.
|
||||
*/
|
||||
StIconType
|
||||
st_icon_get_icon_type (StIcon *icon)
|
||||
{
|
||||
g_return_val_if_fail (ST_IS_ICON (icon), DEFAULT_ICON_TYPE);
|
||||
|
||||
return icon->priv->icon_type;
|
||||
}
|
||||
|
||||
/**
|
||||
* st_icon_set_icon_type:
|
||||
* @icon: a #StIcon
|
||||
* @icon_type: the type of icon to use
|
||||
*
|
||||
* Sets the type of icon we'll look up to display in the actor.
|
||||
* The icon type determines whether we use a symbolic icon or
|
||||
* a full color icon and also is used for specific handling for
|
||||
* application and document icons.
|
||||
*/
|
||||
void
|
||||
st_icon_set_icon_type (StIcon *icon,
|
||||
StIconType icon_type)
|
||||
{
|
||||
StIconPrivate *priv;
|
||||
|
||||
g_return_if_fail (ST_IS_ICON (icon));
|
||||
|
||||
priv = icon->priv;
|
||||
|
||||
if (icon_type == priv->icon_type)
|
||||
return;
|
||||
|
||||
priv->icon_type = icon_type;
|
||||
st_icon_update (icon);
|
||||
|
||||
g_object_notify (G_OBJECT (icon), "icon-type");
|
||||
}
|
||||
|
||||
/**
|
||||
* st_icon_get_gicon:
|
||||
* @icon: an icon
|
||||
@@ -665,7 +577,7 @@ void
|
||||
st_icon_set_gicon (StIcon *icon, GIcon *gicon)
|
||||
{
|
||||
g_return_if_fail (ST_IS_ICON (icon));
|
||||
g_return_if_fail (G_IS_ICON (gicon));
|
||||
g_return_if_fail (gicon == NULL || G_IS_ICON (gicon));
|
||||
|
||||
if (icon->priv->gicon == gicon) /* do nothing */
|
||||
return;
|
||||
@@ -679,13 +591,6 @@ st_icon_set_gicon (StIcon *icon, GIcon *gicon)
|
||||
if (gicon)
|
||||
icon->priv->gicon = g_object_ref (gicon);
|
||||
|
||||
if (icon->priv->icon_name)
|
||||
{
|
||||
g_free (icon->priv->icon_name);
|
||||
icon->priv->icon_name = NULL;
|
||||
g_object_notify (G_OBJECT (icon), "icon-name");
|
||||
}
|
||||
|
||||
g_object_notify (G_OBJECT (icon), "gicon");
|
||||
|
||||
st_icon_update (icon);
|
||||
|
||||
@@ -88,9 +88,6 @@ ClutterActor* st_icon_new (void);
|
||||
const gchar *st_icon_get_icon_name (StIcon *icon);
|
||||
void st_icon_set_icon_name (StIcon *icon, const gchar *icon_name);
|
||||
|
||||
void st_icon_set_icon_type (StIcon *icon, StIconType icon_type);
|
||||
StIconType st_icon_get_icon_type (StIcon *icon);
|
||||
|
||||
gint st_icon_get_icon_size (StIcon *icon);
|
||||
void st_icon_set_icon_size (StIcon *icon, gint size);
|
||||
|
||||
|
||||
@@ -36,22 +36,6 @@
|
||||
* ClutterIMText but using GtkIMContext rather than ClutterIMContext.
|
||||
*/
|
||||
|
||||
/* Places where this actor doesn't support all of GtkIMContext:
|
||||
*
|
||||
* A) It doesn't support preedit. This makes it fairly useless for
|
||||
* most complicated input methods. Fixing this requires support
|
||||
* directly in ClutterText, since there is no way to wedge a
|
||||
* preedit string in externally.
|
||||
* B) It doesn't support surrounding context via the
|
||||
* :retrieve-surrounding and :delete-surrounding signals. This could
|
||||
* be added here, but only affects a small number of input methods
|
||||
* and really doesn't make a lot of sense without A)
|
||||
*
|
||||
* Another problem that will show up with usage in GNOME Shell's overview
|
||||
* is that the user may have trouble seeing and interacting with ancilliary
|
||||
* windows shown by the IM.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
@@ -77,10 +61,6 @@ struct _StIMTextPrivate
|
||||
guint need_im_reset : 1;
|
||||
};
|
||||
|
||||
static void st_im_text_commit_cb (GtkIMContext *context,
|
||||
const gchar *str,
|
||||
StIMText *imtext);
|
||||
|
||||
G_DEFINE_TYPE (StIMText, st_im_text, CLUTTER_TYPE_TEXT)
|
||||
|
||||
static void
|
||||
@@ -88,15 +68,7 @@ st_im_text_dispose (GObject *object)
|
||||
{
|
||||
StIMTextPrivate *priv = ST_IM_TEXT (object)->priv;
|
||||
|
||||
if (priv->im_context != NULL)
|
||||
{
|
||||
g_signal_handlers_disconnect_by_func (priv->im_context,
|
||||
(void *) st_im_text_commit_cb,
|
||||
object);
|
||||
|
||||
g_object_unref (priv->im_context);
|
||||
priv->im_context = NULL;
|
||||
}
|
||||
g_clear_object (&priv->im_context);
|
||||
|
||||
G_OBJECT_CLASS (st_im_text_parent_class)->dispose (object);
|
||||
}
|
||||
@@ -140,6 +112,72 @@ st_im_text_commit_cb (GtkIMContext *context,
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
st_im_text_preedit_changed_cb (GtkIMContext *context,
|
||||
StIMText *imtext)
|
||||
{
|
||||
ClutterText *clutter_text = CLUTTER_TEXT (imtext);
|
||||
gchar *preedit_str = NULL;
|
||||
PangoAttrList *preedit_attrs = NULL;
|
||||
gint cursor_pos = 0;
|
||||
|
||||
gtk_im_context_get_preedit_string (context,
|
||||
&preedit_str,
|
||||
&preedit_attrs,
|
||||
&cursor_pos);
|
||||
|
||||
clutter_text_set_preedit_string (clutter_text,
|
||||
preedit_str,
|
||||
preedit_attrs,
|
||||
cursor_pos);
|
||||
|
||||
g_free (preedit_str);
|
||||
pango_attr_list_unref (preedit_attrs);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
st_im_text_retrieve_surrounding_cb (GtkIMContext *context,
|
||||
StIMText *imtext)
|
||||
{
|
||||
ClutterText *clutter_text = CLUTTER_TEXT (imtext);
|
||||
ClutterTextBuffer *buffer;
|
||||
const gchar *text;
|
||||
gint cursor_pos;
|
||||
|
||||
buffer = clutter_text_get_buffer (clutter_text);
|
||||
text = clutter_text_buffer_get_text (buffer);
|
||||
|
||||
cursor_pos = clutter_text_get_cursor_position (clutter_text);
|
||||
if (cursor_pos < 0)
|
||||
cursor_pos = clutter_text_buffer_get_length (buffer);
|
||||
|
||||
gtk_im_context_set_surrounding (context, text,
|
||||
/* length and cursor_index are in bytes */
|
||||
clutter_text_buffer_get_bytes (buffer),
|
||||
g_utf8_offset_to_pointer (text, cursor_pos) - text);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
st_im_text_delete_surrounding_cb (GtkIMContext *context,
|
||||
gint offset,
|
||||
gint n_chars,
|
||||
StIMText *imtext)
|
||||
{
|
||||
ClutterText *clutter_text = CLUTTER_TEXT (imtext);
|
||||
|
||||
if (clutter_text_get_editable (clutter_text))
|
||||
{
|
||||
gint cursor_pos = clutter_text_get_cursor_position (clutter_text);
|
||||
clutter_text_delete_text (clutter_text,
|
||||
cursor_pos + offset,
|
||||
cursor_pos + offset + n_chars);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
reset_im_context (StIMText *self)
|
||||
{
|
||||
@@ -445,6 +483,12 @@ st_im_text_init (StIMText *self)
|
||||
priv->im_context = gtk_im_multicontext_new ();
|
||||
g_signal_connect (priv->im_context, "commit",
|
||||
G_CALLBACK (st_im_text_commit_cb), self);
|
||||
g_signal_connect (priv->im_context, "preedit-changed",
|
||||
G_CALLBACK (st_im_text_preedit_changed_cb), self);
|
||||
g_signal_connect (priv->im_context, "retrieve-surrounding",
|
||||
G_CALLBACK (st_im_text_retrieve_surrounding_cb), self);
|
||||
g_signal_connect (priv->im_context, "delete-surrounding",
|
||||
G_CALLBACK (st_im_text_delete_surrounding_cb), self);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -21,6 +21,10 @@
|
||||
#include "config.h"
|
||||
|
||||
#include "st-shadow.h"
|
||||
#include "st-private.h"
|
||||
|
||||
G_DEFINE_BOXED_TYPE (StShadow, st_shadow, st_shadow_ref, st_shadow_unref)
|
||||
G_DEFINE_BOXED_TYPE (StShadowHelper, st_shadow_helper, st_shadow_helper_copy, st_shadow_helper_free)
|
||||
|
||||
/**
|
||||
* SECTION: st-shadow
|
||||
@@ -175,16 +179,126 @@ st_shadow_get_box (StShadow *shadow,
|
||||
+ shadow->blur + shadow->spread;
|
||||
}
|
||||
|
||||
GType
|
||||
st_shadow_get_type (void)
|
||||
/**
|
||||
* 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
|
||||
* or size change. Then, it would call st_shadow_helper_paint() inside
|
||||
* its paint() virtual function.
|
||||
*/
|
||||
|
||||
struct _StShadowHelper {
|
||||
StShadow *shadow;
|
||||
CoglMaterial *material;
|
||||
|
||||
gfloat width;
|
||||
gfloat height;
|
||||
};
|
||||
|
||||
/**
|
||||
* st_shadow_helper_new:
|
||||
* @shadow: a #StShadow representing the shadow properties
|
||||
*
|
||||
* Builds a #StShadowHelper that will build a drop shadow
|
||||
* using @source as the mask.
|
||||
*
|
||||
* Returns: (transfer full): a new #StShadowHelper
|
||||
*/
|
||||
StShadowHelper *
|
||||
st_shadow_helper_new (StShadow *shadow)
|
||||
{
|
||||
static GType _st_shadow_type = 0;
|
||||
StShadowHelper *helper;
|
||||
|
||||
if (G_UNLIKELY (_st_shadow_type == 0))
|
||||
_st_shadow_type =
|
||||
g_boxed_type_register_static ("StShadow",
|
||||
(GBoxedCopyFunc) st_shadow_ref,
|
||||
(GBoxedFreeFunc) st_shadow_unref);
|
||||
helper = g_slice_new0 (StShadowHelper);
|
||||
helper->shadow = st_shadow_ref (shadow);
|
||||
|
||||
return _st_shadow_type;
|
||||
return helper;
|
||||
}
|
||||
|
||||
void
|
||||
st_shadow_helper_update (StShadowHelper *helper,
|
||||
ClutterActor *source)
|
||||
{
|
||||
gfloat width, height;
|
||||
|
||||
clutter_actor_get_size (source, &width, &height);
|
||||
|
||||
if (helper->material == NULL ||
|
||||
helper->width != width ||
|
||||
helper->height != height)
|
||||
{
|
||||
if (helper->material)
|
||||
cogl_object_unref (helper->material);
|
||||
|
||||
helper->material = _st_create_shadow_material_from_actor (helper->shadow, source);
|
||||
helper->width = width;
|
||||
helper->height = height;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* st_shadow_helper_copy:
|
||||
* @helper: the #StShadowHelper to copy
|
||||
*
|
||||
* Returns: (transfer full): a copy of @helper
|
||||
*/
|
||||
StShadowHelper *
|
||||
st_shadow_helper_copy (StShadowHelper *helper)
|
||||
{
|
||||
StShadowHelper *copy;
|
||||
|
||||
copy = g_slice_new (StShadowHelper);
|
||||
*copy = *helper;
|
||||
if (copy->material)
|
||||
cogl_object_ref (copy->material);
|
||||
st_shadow_ref (copy->shadow);
|
||||
|
||||
return copy;
|
||||
}
|
||||
|
||||
/**
|
||||
* st_shadow_helper_free:
|
||||
* @helper: a #StShadowHelper
|
||||
*
|
||||
* Free resources associated with @helper.
|
||||
*/
|
||||
void
|
||||
st_shadow_helper_free (StShadowHelper *helper)
|
||||
{
|
||||
if (helper->material)
|
||||
cogl_object_unref (helper->material);
|
||||
st_shadow_unref (helper->shadow);
|
||||
|
||||
g_slice_free (StShadowHelper, helper);
|
||||
}
|
||||
|
||||
/**
|
||||
* st_shadow_helper_paint:
|
||||
* @helper: a #StShadowHelper
|
||||
* @actor_box: the bounding box of the shadow
|
||||
* @paint_opacity: the opacity at which the shadow is painted
|
||||
*
|
||||
* Paints the shadow associated with @helper This must only
|
||||
* be called from the implementation of ClutterActor::paint().
|
||||
*/
|
||||
void
|
||||
st_shadow_helper_paint (StShadowHelper *helper,
|
||||
ClutterActorBox *actor_box,
|
||||
guint8 paint_opacity)
|
||||
{
|
||||
ClutterActorBox allocation;
|
||||
float width, height;
|
||||
|
||||
clutter_actor_box_get_size (actor_box, &width, &height);
|
||||
|
||||
allocation.x1 = (width - helper->width) / 2;
|
||||
allocation.y1 = (height - helper->height) / 2;
|
||||
allocation.x2 = allocation.x1 + helper->width;
|
||||
allocation.y2 = allocation.y1 + helper->height;
|
||||
|
||||
_st_paint_shadow_with_opacity (helper->shadow,
|
||||
helper->material,
|
||||
&allocation,
|
||||
paint_opacity);
|
||||
}
|
||||
|
||||
@@ -26,8 +26,10 @@
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define ST_TYPE_SHADOW (st_shadow_get_type ())
|
||||
#define ST_TYPE_SHADOW_HELPER (st_shadow_get_type ())
|
||||
|
||||
typedef struct _StShadow StShadow;
|
||||
typedef struct _StShadowHelper StShadowHelper;
|
||||
|
||||
/**
|
||||
* StShadow:
|
||||
@@ -70,6 +72,21 @@ void st_shadow_get_box (StShadow *shadow,
|
||||
const ClutterActorBox *actor_box,
|
||||
ClutterActorBox *shadow_box);
|
||||
|
||||
|
||||
GType st_shadow_helper_get_type (void) G_GNUC_CONST;
|
||||
|
||||
StShadowHelper *st_shadow_helper_new (StShadow *shadow);
|
||||
|
||||
StShadowHelper *st_shadow_helper_copy (StShadowHelper *helper);
|
||||
void st_shadow_helper_free (StShadowHelper *helper);
|
||||
|
||||
void st_shadow_helper_update (StShadowHelper *helper,
|
||||
ClutterActor *source);
|
||||
|
||||
void st_shadow_helper_paint (StShadowHelper *helper,
|
||||
ClutterActorBox *actor_box,
|
||||
guint8 paint_opacity);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __ST_SHADOW__ */
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include "config.h"
|
||||
|
||||
#include "st-texture-cache.h"
|
||||
#include "st-private.h"
|
||||
#include <gtk/gtk.h>
|
||||
#include <string.h>
|
||||
#include <glib.h>
|
||||
@@ -967,9 +968,6 @@ load_gicon_with_colors (StTextureCache *cache,
|
||||
* icon isn't loaded already, the texture will be filled
|
||||
* asynchronously.
|
||||
*
|
||||
* This will load @icon as a full-color icon; if you want a symbolic
|
||||
* icon, you must use st_texture_cache_load_icon_name().
|
||||
*
|
||||
* Return Value: (transfer none): A new #ClutterActor for the icon, or %NULL if not found
|
||||
*/
|
||||
ClutterActor *
|
||||
@@ -1123,69 +1121,15 @@ st_texture_cache_load_sliced_image (StTextureCache *cache,
|
||||
return actor;
|
||||
}
|
||||
|
||||
/**
|
||||
* StIconType:
|
||||
* @ST_ICON_SYMBOLIC: a symbolic (ie, mostly monochrome) icon
|
||||
* @ST_ICON_FULLCOLOR: a full-color icon
|
||||
*
|
||||
* Describes what style of icon is desired in a call to
|
||||
* st_texture_cache_load_icon_name() or st_texture_cache_load_gicon().
|
||||
* Use %ST_ICON_SYMBOLIC for symbolic icons (eg, for the panel and
|
||||
* much of the rest of the shell chrome) or %ST_ICON_FULLCOLOR for a
|
||||
* full-color icon.
|
||||
*/
|
||||
|
||||
/* generates names like g_themed_icon_new_with_default_fallbacks(),
|
||||
* but *only* symbolic names
|
||||
*/
|
||||
static char **
|
||||
symbolic_names_for_icon (const char *name)
|
||||
{
|
||||
char **parts, **names;
|
||||
int i, numnames;
|
||||
|
||||
parts = g_strsplit (name, "-", -1);
|
||||
numnames = g_strv_length (parts);
|
||||
names = g_new (char *, numnames + 1);
|
||||
for (i = 0; parts[i]; i++)
|
||||
{
|
||||
if (i == 0)
|
||||
{
|
||||
names[i] = g_strdup_printf ("%s-symbolic", parts[i]);
|
||||
}
|
||||
else
|
||||
{
|
||||
names[i] = g_strdup_printf ("%.*s-%s-symbolic",
|
||||
(int) (strlen (names[i - 1]) - strlen ("-symbolic")),
|
||||
names[i - 1], parts[i]);
|
||||
}
|
||||
}
|
||||
names[i] = NULL;
|
||||
|
||||
g_strfreev (parts);
|
||||
|
||||
/* need to reverse here, because longest (most specific)
|
||||
name has to come first */
|
||||
for (i = 0; i < (numnames / 2); i++) {
|
||||
char *tmp = names[i];
|
||||
names[i] = names[numnames - i - 1];
|
||||
names[numnames - i - 1] = tmp;
|
||||
}
|
||||
|
||||
return names;
|
||||
}
|
||||
|
||||
/**
|
||||
* st_texture_cache_load_icon_name:
|
||||
* @cache: The texture cache instance
|
||||
* @theme_node: (allow-none): a #StThemeNode
|
||||
* @name: Name of a themed icon
|
||||
* @icon_type: the type of icon to load
|
||||
* @size: Size of themed icon
|
||||
*
|
||||
* Load a themed icon into a texture. See the #StIconType documentation
|
||||
* for an explanation of how @icon_type affects the returned icon. The
|
||||
* colors used for symbolic icons are derived from @theme_node.
|
||||
* Load a themed icon into a texture. The colors used for symbolic
|
||||
* icons are derived from @theme_node.
|
||||
*
|
||||
* Return Value: (transfer none): A new #ClutterTexture for the icon
|
||||
*/
|
||||
@@ -1193,50 +1137,23 @@ ClutterActor *
|
||||
st_texture_cache_load_icon_name (StTextureCache *cache,
|
||||
StThemeNode *theme_node,
|
||||
const char *name,
|
||||
StIconType icon_type,
|
||||
gint size)
|
||||
{
|
||||
ClutterActor *texture;
|
||||
GIcon *themed;
|
||||
char **names;
|
||||
|
||||
g_return_val_if_fail (!(icon_type == ST_ICON_SYMBOLIC && theme_node == NULL), NULL);
|
||||
themed = g_themed_icon_new_with_default_fallbacks (name);
|
||||
texture = load_gicon_with_colors (cache, themed, size,
|
||||
theme_node ? st_theme_node_get_icon_colors (theme_node) : NULL);
|
||||
g_object_unref (themed);
|
||||
|
||||
switch (icon_type)
|
||||
if (texture == NULL)
|
||||
{
|
||||
case ST_ICON_SYMBOLIC:
|
||||
names = symbolic_names_for_icon (name);
|
||||
themed = g_themed_icon_new_from_names (names, -1);
|
||||
g_strfreev (names);
|
||||
texture = load_gicon_with_colors (cache, themed, size,
|
||||
st_theme_node_get_icon_colors (theme_node));
|
||||
g_object_unref (themed);
|
||||
if (texture == NULL)
|
||||
{
|
||||
/* We don't have an equivalent of image-missing
|
||||
* for the symbolic icon theme, so just create a blank
|
||||
* actor. */
|
||||
texture = (ClutterActor *) create_default_texture ();
|
||||
clutter_actor_set_size (texture, size, size);
|
||||
}
|
||||
|
||||
return texture;
|
||||
break;
|
||||
case ST_ICON_FULLCOLOR:
|
||||
themed = g_themed_icon_new_with_default_fallbacks (name);
|
||||
texture = load_gicon_with_colors (cache, themed, size, NULL);
|
||||
g_object_unref (themed);
|
||||
if (texture == NULL)
|
||||
{
|
||||
themed = g_themed_icon_new ("image-missing");
|
||||
texture = load_gicon_with_colors (cache, themed, size, NULL);
|
||||
g_object_unref (themed);
|
||||
}
|
||||
return texture;
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached ();
|
||||
texture = (ClutterActor *) create_default_texture ();
|
||||
clutter_actor_set_size (texture, size, size);
|
||||
}
|
||||
|
||||
return texture;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -81,7 +81,6 @@ ClutterActor *st_texture_cache_bind_pixbuf_property (StTextureCache *cache,
|
||||
ClutterActor *st_texture_cache_load_icon_name (StTextureCache *cache,
|
||||
StThemeNode *theme_node,
|
||||
const char *name,
|
||||
StIconType icon_type,
|
||||
gint size);
|
||||
|
||||
ClutterActor *st_texture_cache_load_gicon (StTextureCache *cache,
|
||||
|
||||
@@ -40,11 +40,6 @@ typedef enum {
|
||||
ST_ALIGN_END
|
||||
} StAlign;
|
||||
|
||||
typedef enum {
|
||||
ST_ICON_SYMBOLIC,
|
||||
ST_ICON_FULLCOLOR
|
||||
} StIconType;
|
||||
|
||||
typedef enum {
|
||||
ST_BACKGROUND_SIZE_AUTO,
|
||||
ST_BACKGROUND_SIZE_CONTAIN,
|
||||
|
||||
@@ -1597,6 +1597,8 @@ st_widget_set_track_hover (StWidget *widget,
|
||||
|
||||
if (priv->track_hover)
|
||||
st_widget_sync_hover (widget);
|
||||
else
|
||||
st_widget_set_hover (widget, FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -28,27 +28,21 @@ function test() {
|
||||
}
|
||||
|
||||
addTest("Symbolic",
|
||||
{ icon_name: 'battery-full',
|
||||
icon_type: St.IconType.SYMBOLIC,
|
||||
{ icon_name: 'battery-full-symbolic',
|
||||
icon_size: 48 });
|
||||
addTest("Full color",
|
||||
{ icon_name: 'battery-full',
|
||||
icon_type: St.IconType.FULLCOLOR,
|
||||
icon_size: 48 });
|
||||
addTest("Default size",
|
||||
{ icon_name: 'battery-full',
|
||||
icon_type: St.IconType.SYMBOLIC });
|
||||
{ icon_name: 'battery-full-symbolic' });
|
||||
addTest("Size set by property",
|
||||
{ icon_name: 'battery-full',
|
||||
icon_type: St.IconType.SYMBOLIC,
|
||||
{ icon_name: 'battery-full-symbolic',
|
||||
icon_size: 32 });
|
||||
addTest("Size set by style",
|
||||
{ icon_name: 'battery-full',
|
||||
icon_type: St.IconType.SYMBOLIC,
|
||||
{ icon_name: 'battery-full-symbolic',
|
||||
style: 'icon-size: 1em;' });
|
||||
addTest("16px icon in 48px icon widget",
|
||||
{ icon_name: 'battery-full',
|
||||
icon_type: St.IconType.SYMBOLIC,
|
||||
{ icon_name: 'battery-full-symbolic',
|
||||
style: 'icon-size: 16px; width: 48px; height: 48px; border: 1px solid black;' });
|
||||
|
||||
function iconRow(icons, box_style) {
|
||||
@@ -56,7 +50,6 @@ function test() {
|
||||
|
||||
for each (let iconName in icons) {
|
||||
hb.add(new St.Icon({ icon_name: iconName,
|
||||
icon_type: St.IconType.SYMBOLIC,
|
||||
icon_size: 48 }));
|
||||
}
|
||||
|
||||
@@ -66,16 +59,16 @@ function test() {
|
||||
let normalCss = 'background: white; color: black; padding: 10px 10px;';
|
||||
let reversedCss = 'background: black; color: white; warning-color: #ffcc00; error-color: #ff0000; padding: 10px 10px;';
|
||||
|
||||
let batteryIcons = ['battery-full-charging',
|
||||
'battery-full',
|
||||
'battery-good',
|
||||
'battery-low',
|
||||
'battery-caution' ];
|
||||
let batteryIcons = ['battery-full-charging-symbolic',
|
||||
'battery-full-symbolic',
|
||||
'battery-good-symbolic',
|
||||
'battery-low-symbolic',
|
||||
'battery-caution-symbolic' ];
|
||||
|
||||
let volumeIcons = ['audio-volume-high',
|
||||
'audio-volume-medium',
|
||||
'audio-volume-low',
|
||||
'audio-volume-muted' ];
|
||||
let volumeIcons = ['audio-volume-high-symbolic',
|
||||
'audio-volume-medium-symbolic',
|
||||
'audio-volume-low-symbolic',
|
||||
'audio-volume-muted-symbolic' ];
|
||||
|
||||
iconRow(batteryIcons, normalCss);
|
||||
iconRow(batteryIcons, reversedCss);
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
# Only rebuild modules that have changed
|
||||
build_policy = 'updated'
|
||||
|
||||
moduleset = 'gnome-apps-3.4'
|
||||
moduleset = 'gnome-apps-3.6'
|
||||
|
||||
modules = [ 'meta-gnome-core-shell' ]
|
||||
|
||||
|
||||
Reference in New Issue
Block a user