Compare commits
52 Commits
3.7.1
...
wip/gdbus-
Author | SHA1 | Date | |
---|---|---|---|
d2052a885e | |||
afcc1b7b52 | |||
a6b4d68a1d | |||
aef9b733e5 | |||
348208617b | |||
2c34c8e20f | |||
d19fa731d6 | |||
59bb1cc387 | |||
56909d0646 | |||
04da29c939 | |||
307f7a3024 | |||
e80bfa39f5 | |||
29714922ea | |||
88192114ac | |||
9d78208b76 | |||
d817bf0395 | |||
4d51056226 | |||
a607174a25 | |||
37d6a624b7 | |||
0c807bddaf | |||
a0470bfc66 | |||
b9463d23e8 | |||
04debd1623 | |||
9d31576cf5 | |||
8daca28a90 | |||
9899604261 | |||
687e1eabed | |||
eb09f34114 | |||
fbeb446ed7 | |||
92033ce0f5 | |||
9171bab5e5 | |||
f9819eb7b0 | |||
85728f0d15 | |||
9396849d56 | |||
6f5e5672bb | |||
b936e60876 | |||
fa4bd91213 | |||
81eeef7d3c | |||
a7b5134820 | |||
92a01c67ba | |||
71c23613b5 | |||
4f876995de | |||
9cf4a76196 | |||
9efe5287e4 | |||
8c4b34de4e | |||
93e3559dc3 | |||
caa0f63e1f | |||
a4e29e1244 | |||
599f2f43e3 | |||
3a453c5f73 | |||
98b313c75f | |||
8b796d80a7 |
@ -52,7 +52,7 @@ AC_MSG_CHECKING([for GStreamer (needed for recording functionality)])
|
||||
if $PKG_CONFIG --exists gstreamer-1.0 '>=' $GSTREAMER_MIN_VERSION ; then
|
||||
AC_MSG_RESULT(yes)
|
||||
build_recorder=true
|
||||
recorder_modules="gstreamer-1.0 gstreamer-base-1.0 x11"
|
||||
recorder_modules="gstreamer-1.0 gstreamer-base-1.0 x11 gtk+-3.0"
|
||||
PKG_CHECK_MODULES(TEST_SHELL_RECORDER, $recorder_modules clutter-1.0 xfixes gl)
|
||||
else
|
||||
AC_MSG_RESULT(no)
|
||||
@ -97,8 +97,7 @@ PKG_CHECK_MODULES(GNOME_SHELL, gio-unix-2.0 >= $GIO_MIN_VERSION
|
||||
telepathy-logger-0.2 >= $TELEPATHY_LOGGER_MIN_VERSION
|
||||
polkit-agent-1 >= $POLKIT_MIN_VERSION xfixes
|
||||
libnm-glib libnm-util gnome-keyring-1
|
||||
gcr-3 >= $GCR_MIN_VERSION
|
||||
gnome-desktop-3.0 >= $GNOME_DESKTOP_REQUIRED_VERSION)
|
||||
gcr-3 >= $GCR_MIN_VERSION)
|
||||
|
||||
PKG_CHECK_MODULES(SHELL_PERF_HELPER, gtk+-3.0 gio-2.0)
|
||||
|
||||
@ -139,7 +138,7 @@ PKG_CHECK_EXISTS([gnome-bluetooth-1.0 >= 3.1.0],
|
||||
AC_SUBST([HAVE_BLUETOOTH],[0])
|
||||
AC_MSG_RESULT([no])])
|
||||
|
||||
PKG_CHECK_MODULES(CALENDAR_SERVER, libecal-1.2 >= $LIBECAL_MIN_VERSION libedataserver-1.2 >= $LIBEDATASERVER_MIN_VERSION libedataserverui-3.0 >= $LIBEDATASERVERUI_MIN_VERSION gio-2.0)
|
||||
PKG_CHECK_MODULES(CALENDAR_SERVER, libecal-1.2 >= $LIBECAL_MIN_VERSION libedataserver-1.2 >= $LIBEDATASERVER_MIN_VERSION gio-2.0)
|
||||
AC_SUBST(CALENDAR_SERVER_CFLAGS)
|
||||
AC_SUBST(CALENDAR_SERVER_LIBS)
|
||||
|
||||
|
@ -57,6 +57,14 @@ value here is from the TpConnectionPresenceType enumeration.</_summary>
|
||||
<_summary>Internally used to store the last session presence status for the user. The
|
||||
value here is from the GsmPresenceStatus enumeration.</_summary>
|
||||
</key>
|
||||
<key name="always-show-log-out" type="b">
|
||||
<default>false</default>
|
||||
<_summary>Always show the 'Log out' menuitem in the user menu.</_summary>
|
||||
<_description>
|
||||
This key overrides the automatic hiding of the 'Log out'
|
||||
menuitem in single-user, single-session situations.
|
||||
</_description>
|
||||
</key>
|
||||
<child name="calendar" schema="org.gnome.shell.calendar"/>
|
||||
<child name="recorder" schema="org.gnome.shell.recorder"/>
|
||||
<child name="keybindings" schema="org.gnome.shell.keybindings"/>
|
||||
|
@ -39,7 +39,6 @@ stage {
|
||||
/* small */
|
||||
.app-well-menu,
|
||||
.contact-details-status,
|
||||
.run-dialog-label,
|
||||
.run-dialog-error-label {
|
||||
font-size: 9pt;
|
||||
}
|
||||
@ -311,7 +310,7 @@ StScrollBar StButton#vhandle:active {
|
||||
.notification-icon-button:focus,
|
||||
.hotplug-notification-item:focus,
|
||||
.modal-dialog-button:focus {
|
||||
border: 2px solid #8b8b8b;
|
||||
border-width: 2px;
|
||||
}
|
||||
|
||||
.dash-search-button:active,
|
||||
@ -326,17 +325,20 @@ StScrollBar StButton#vhandle:active {
|
||||
background-gradient-end: rgba(255, 255, 255, 0.2);
|
||||
}
|
||||
|
||||
.notification-button:insensitive,
|
||||
.notification-icon-button:insensitive,
|
||||
.notification-button:insensitive {
|
||||
.modal-dialog-button:insensitive {
|
||||
border-color: #666666;
|
||||
color: #9f9f9f;
|
||||
background-gradient-direction: none;
|
||||
background-color: rgba(102, 102, 102, 0.15);
|
||||
}
|
||||
|
||||
/* Entries */
|
||||
|
||||
#searchEntry,
|
||||
.notification StEntry,
|
||||
.login-dialog-prompt-entry,
|
||||
.prompt-dialog-password-entry {
|
||||
.modal-dialog StEntry {
|
||||
color: rgb(64, 64, 64);
|
||||
caret-color: rgb(64, 64, 64);
|
||||
font-size: 12pt;
|
||||
@ -346,6 +348,7 @@ StScrollBar StButton#vhandle:active {
|
||||
}
|
||||
|
||||
#searchEntry,
|
||||
.run-dialog-entry,
|
||||
.notification StEntry {
|
||||
border: 2px solid rgba(245,245,245,0.2);
|
||||
background-gradient-start: rgba(5,5,6,0.1);
|
||||
@ -358,8 +361,7 @@ StScrollBar StButton#vhandle:active {
|
||||
#searchEntry:focus,
|
||||
#searchEntry:hover,
|
||||
.notification StEntry:focus,
|
||||
.login-dialog-prompt-entry,
|
||||
.prompt-dialog-password-entry {
|
||||
.modal-dialog StEntry {
|
||||
border: 2px solid rgb(136,138,133);
|
||||
background-gradient-start: rgb(200,200,200);
|
||||
background-gradient-end: white;
|
||||
@ -368,12 +370,17 @@ StScrollBar StButton#vhandle:active {
|
||||
}
|
||||
|
||||
.notification StEntry:focus,
|
||||
.prompt-dialog-password-entry:focus,
|
||||
.login-dialog-prompt-entry:focus {
|
||||
.modal-dialog StEntry:focus {
|
||||
border: 2px solid #3465a4;
|
||||
}
|
||||
|
||||
#searchEntry {
|
||||
border-color: rgba(245,245,245,0.3);
|
||||
color: rgb(192, 192, 192);
|
||||
caret-color: rgb(192, 192, 192);
|
||||
}
|
||||
|
||||
#searchEntry:hover {
|
||||
color: rgb(128, 128, 128);
|
||||
caret-color: rgb(128, 128, 128);
|
||||
}
|
||||
@ -386,8 +393,7 @@ StScrollBar StButton#vhandle:active {
|
||||
}
|
||||
|
||||
.notification StEntry,
|
||||
.prompt-dialog-password-entry,
|
||||
.login-dialog-prompt-entry {
|
||||
.modal-dialog StEntry {
|
||||
border-radius: 5px;
|
||||
padding: 4px 4px;
|
||||
}
|
||||
@ -551,7 +557,6 @@ StScrollBar StButton#vhandle:active {
|
||||
}
|
||||
|
||||
.status-chooser-combo.popup-combo-menu {
|
||||
background-color: rgba(0,0,0,0.7);
|
||||
padding: .4em 0em;
|
||||
border-radius: 4px;
|
||||
border: 1px solid #5f5f5f;
|
||||
@ -614,9 +619,9 @@ StScrollBar StButton#vhandle:active {
|
||||
|
||||
.window-close, .notification-close {
|
||||
background-image: url("close-window.svg");
|
||||
background-size: 34px;
|
||||
height: 34px;
|
||||
width: 34px;
|
||||
background-size: 32px;
|
||||
height: 32px;
|
||||
width: 32px;
|
||||
}
|
||||
|
||||
.window-close {
|
||||
@ -627,15 +632,22 @@ StScrollBar StButton#vhandle:active {
|
||||
/* we start out in the top right of the
|
||||
* notification, inset.
|
||||
*
|
||||
* center is 32px/2 = 17px
|
||||
* center is 32px/2 = 16px
|
||||
*
|
||||
* adjust left 2px
|
||||
* adjust down 8px */
|
||||
|
||||
-shell-close-overlap-x: 15px;
|
||||
-shell-close-overlap-x: 14px;
|
||||
-shell-close-overlap-y: -12px;
|
||||
}
|
||||
|
||||
.notification-close:rtl {
|
||||
/* as above, but starting out in the top left of the
|
||||
* notification. */
|
||||
|
||||
-shell-close-overlap-x: -14px;
|
||||
}
|
||||
|
||||
.window-close:rtl {
|
||||
-st-background-image-shadow: 2px 2px 6px rgba(0,0,0,0.5);
|
||||
}
|
||||
@ -682,6 +694,11 @@ StScrollBar StButton#vhandle:active {
|
||||
|
||||
.search-entry-icon {
|
||||
icon-size: 1em;
|
||||
color: #c0c0c0;
|
||||
}
|
||||
|
||||
#searchEntry:hover .search-entry-icon,
|
||||
#searchEntry:focus .search-entry-icon {
|
||||
color: #8d8f8a;
|
||||
}
|
||||
|
||||
@ -1193,7 +1210,6 @@ StScrollBar StButton#vhandle:active {
|
||||
background: #2e3436 url(message-tray-background.png);
|
||||
background-repeat: repeat;
|
||||
transition-duration: 250;
|
||||
height: 72px;
|
||||
}
|
||||
|
||||
#message-tray:keyboard {
|
||||
@ -1203,7 +1219,7 @@ StScrollBar StButton#vhandle:active {
|
||||
|
||||
#message-tray:overview {
|
||||
background: rgba(0, 0, 0, 0.1);
|
||||
border-top: 1px solid rgba(128, 128, 128, 0.3);
|
||||
outline: 1px solid rgba(128, 128, 128, 0.3);
|
||||
}
|
||||
|
||||
.notification {
|
||||
@ -1425,28 +1441,34 @@ StScrollBar StButton#vhandle:active {
|
||||
}
|
||||
|
||||
#summary-mode {
|
||||
padding: 0px 6px 0px 6px; /* same as the values in .summary-source */
|
||||
height: 60px;
|
||||
spacing: 10px;
|
||||
height: 72px;
|
||||
}
|
||||
|
||||
.summary-source-button {
|
||||
border-radius: 4px;
|
||||
transition-duration: 100;
|
||||
padding: 6px 3px 6px 3px;
|
||||
}
|
||||
|
||||
.summary-source-button:hover {
|
||||
.summary-source-button:last-child:ltr {
|
||||
padding-right: 6px;
|
||||
}
|
||||
|
||||
.summary-source-button:last-child:rtl {
|
||||
padding-left: 6px;
|
||||
}
|
||||
|
||||
.summary-source-button:hover .summary-source {
|
||||
background-color: rgba(255,255,255,0.1);
|
||||
}
|
||||
|
||||
.summary-source-button:focus,
|
||||
.summary-source-button:selected {
|
||||
.summary-source-button:focus .summary-source,
|
||||
.summary-source-button:selected .summary-source {
|
||||
background-color: rgba(255,255,255,0.33);
|
||||
}
|
||||
|
||||
.summary-source {
|
||||
padding-right: 6px;
|
||||
padding-left: 6px;
|
||||
border-radius: 4px;
|
||||
padding: 0 6px 0 6px;
|
||||
transition-duration: 100;
|
||||
}
|
||||
|
||||
.summary-source-counter {
|
||||
@ -1624,35 +1646,26 @@ StScrollBar StButton#vhandle:active {
|
||||
padding: 4px 32px 5px;
|
||||
}
|
||||
|
||||
.modal-dialog-button:insensitive {
|
||||
color: rgb(60, 60, 60);
|
||||
}
|
||||
|
||||
.modal-dialog-button:focus {
|
||||
padding: 3px 31px 4px;
|
||||
}
|
||||
|
||||
/* Run Dialog */
|
||||
|
||||
.run-dialog-label {
|
||||
font-size: 12pt;
|
||||
font-weight: bold;
|
||||
color: #999999;
|
||||
padding-bottom: .4em;
|
||||
}
|
||||
|
||||
.run-dialog-error-box {
|
||||
padding-top: 15px;
|
||||
spacing: 5px;
|
||||
}
|
||||
|
||||
.run-dialog-entry {
|
||||
font-weight: bold;
|
||||
width: 23em;
|
||||
selection-background-color: white;
|
||||
selected-color: black;
|
||||
}
|
||||
|
||||
.run-dialog {
|
||||
border-radius: 16px;
|
||||
|
||||
padding-right: 21px;
|
||||
padding-left: 21px;
|
||||
padding-bottom: 15px;
|
||||
padding-top: 15px;
|
||||
.modal-dialog .run-dialog-entry {
|
||||
width: 20em;
|
||||
}
|
||||
|
||||
.lightbox {
|
||||
@ -2178,24 +2191,20 @@ StScrollBar StButton#vhandle:active {
|
||||
height: .75em;
|
||||
}
|
||||
|
||||
|
||||
.login-dialog .modal-dialog-button {
|
||||
border: 1px solid #666666;
|
||||
border-radius: 5px;
|
||||
padding: 3px 18px;
|
||||
}
|
||||
|
||||
.login-dialog .modal-dialog-button:focus {
|
||||
padding: 2px 17px;
|
||||
border: 2px solid #8b8b8b;
|
||||
}
|
||||
|
||||
.login-dialog .modal-dialog-button:default {
|
||||
background-gradient-start: #6793c4;
|
||||
background-gradient-end: #335d8f;
|
||||
background-gradient-direction: vertical;
|
||||
padding: 2px 17px;
|
||||
border: 2px solid #16335d;
|
||||
border-color: #16335d;
|
||||
}
|
||||
|
||||
.login-dialog .modal-dialog-button:default:focus {
|
||||
@ -2213,6 +2222,13 @@ StScrollBar StButton#vhandle:active {
|
||||
background-gradient-end: #74a0d0;
|
||||
}
|
||||
|
||||
.login-dialog .modal-dialog-button:default:insensitive {
|
||||
border-color: #666666;
|
||||
color: #9f9f9f;
|
||||
background-gradient-direction: none;
|
||||
background-color: rgba(102, 102, 102, 0.15);
|
||||
}
|
||||
|
||||
.login-dialog-message-warning {
|
||||
color: orange;
|
||||
}
|
||||
|
@ -21,7 +21,16 @@ const GnomeShellIface = <interface name="org.gnome.Shell.Extensions">
|
||||
</signal>
|
||||
</interface>;
|
||||
|
||||
const GnomeShellProxy = Gio.DBusProxy.makeProxyWrapper(GnomeShellIface);
|
||||
const GnomeShellProxy = new Gio.DBusProxyClass({
|
||||
Name: 'GnomeShellProxy',
|
||||
Interface: GnomeShellIface,
|
||||
|
||||
_init: function() {
|
||||
this.parent({ g_bus_type: Gio.BusType.SESSION,
|
||||
g_name: 'org.gnome.Shell',
|
||||
g_object_path: '/org/gnome/Shell' });
|
||||
}
|
||||
});
|
||||
|
||||
function stripPrefix(string, prefix) {
|
||||
if (string.slice(0, prefix.length) == prefix)
|
||||
@ -191,7 +200,8 @@ const Application = new Lang.Class({
|
||||
|
||||
this._extensionPrefsBin.add(label);
|
||||
|
||||
this._shellProxy = new GnomeShellProxy(Gio.DBus.session, 'org.gnome.Shell', '/org/gnome/Shell');
|
||||
this._shellProxy = new GnomeShellProxy();
|
||||
this._shellProxy.init(null);
|
||||
this._shellProxy.connectSignal('ExtensionStatusChanged', Lang.bind(this, function(proxy, senderName, [uuid, state, error]) {
|
||||
if (ExtensionUtils.extensions[uuid] !== undefined)
|
||||
this._scanExtensions();
|
||||
|
@ -11,16 +11,14 @@ const FprintManagerIface = <interface name='net.reactivated.Fprint.Manager'>
|
||||
</method>
|
||||
</interface>;
|
||||
|
||||
const FprintManagerInfo = Gio.DBusInterfaceInfo.new_for_xml(FprintManagerIface);
|
||||
const FprintManager = new Gio.DBusProxyClass({
|
||||
Name: 'FprintManager',
|
||||
Interface: FprintManagerIface,
|
||||
|
||||
function FprintManager() {
|
||||
var self = new Gio.DBusProxy({ g_connection: Gio.DBus.system,
|
||||
g_interface_name: FprintManagerInfo.name,
|
||||
g_interface_info: FprintManagerInfo,
|
||||
g_name: 'net.reactivated.Fprint',
|
||||
g_object_path: '/net/reactivated/Fprint/Manager',
|
||||
g_flags: (Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES) });
|
||||
|
||||
self.init(null);
|
||||
return self;
|
||||
}
|
||||
_init: function() {
|
||||
this.parent({ g_bus_type: Gio.BusType.SYSTEM,
|
||||
g_name: 'net.reactivated.Fprint',
|
||||
g_object_path: '/net/reactivated/Fprint/Manager',
|
||||
g_flags: (Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES) });
|
||||
}
|
||||
});
|
||||
|
@ -39,13 +39,14 @@ const GdmUtil = imports.gdm.util;
|
||||
const Lightbox = imports.ui.lightbox;
|
||||
const Main = imports.ui.main;
|
||||
const ModalDialog = imports.ui.modalDialog;
|
||||
const PanelMenu = imports.ui.panelMenu;
|
||||
const Tweener = imports.ui.tweener;
|
||||
const UserMenu = imports.ui.userMenu;
|
||||
|
||||
const _RESIZE_ANIMATION_TIME = 0.25;
|
||||
const _SCROLL_ANIMATION_TIME = 0.5;
|
||||
const _TIMED_LOGIN_IDLE_THRESHOLD = 5.0;
|
||||
const _LOGO_ICON_NAME_SIZE = 48;
|
||||
const _LOGO_ICON_HEIGHT = 16;
|
||||
|
||||
let _loginDialog = null;
|
||||
|
||||
@ -82,6 +83,36 @@ function _smoothlyResizeActor(actor, width, height) {
|
||||
return hold;
|
||||
}
|
||||
|
||||
const LogoMenuButton = new Lang.Class({
|
||||
Name: 'LogoMenuButton',
|
||||
Extends: PanelMenu.Button,
|
||||
|
||||
_init: function() {
|
||||
this.parent(0.0, null, true);
|
||||
|
||||
this._settings = new Gio.Settings({ schema: GdmUtil.LOGIN_SCREEN_SCHEMA });
|
||||
this._settings.connect('changed::' + GdmUtil.LOGO_KEY,
|
||||
Lang.bind(this, this._updateLogo));
|
||||
|
||||
this._iconBin = new St.Bin();
|
||||
this.actor.add_actor(this._iconBin);
|
||||
|
||||
this._updateLogo();
|
||||
},
|
||||
|
||||
_updateLogo: function() {
|
||||
let path = this._settings.get_string(GdmUtil.LOGO_KEY);
|
||||
let icon = null;
|
||||
|
||||
if (path) {
|
||||
let file = Gio.file_new_for_path(path);
|
||||
let cache = St.TextureCache.get_default();
|
||||
icon = cache.load_uri_async(file.get_uri(), -1, _LOGO_ICON_HEIGHT);
|
||||
}
|
||||
this._iconBin.set_child(icon);
|
||||
}
|
||||
});
|
||||
|
||||
const UserListItem = new Lang.Class({
|
||||
Name: 'UserListItem',
|
||||
|
||||
@ -659,17 +690,11 @@ const LoginDialog = new Lang.Class({
|
||||
|
||||
this._settings = new Gio.Settings({ schema: GdmUtil.LOGIN_SCREEN_SCHEMA });
|
||||
|
||||
this._settings.connect('changed::' + GdmUtil.LOGO_KEY,
|
||||
Lang.bind(this, this._updateLogo));
|
||||
this._settings.connect('changed::' + GdmUtil.BANNER_MESSAGE_KEY,
|
||||
Lang.bind(this, this._updateBanner));
|
||||
this._settings.connect('changed::' + GdmUtil.BANNER_MESSAGE_TEXT_KEY,
|
||||
Lang.bind(this, this._updateBanner));
|
||||
|
||||
this._logoBox = new St.Bin({ style_class: 'login-dialog-logo-box' });
|
||||
this.contentLayout.add(this._logoBox);
|
||||
this._updateLogo();
|
||||
|
||||
this._bannerLabel = new St.Label({ style_class: 'login-dialog-banner',
|
||||
text: '' });
|
||||
this.contentLayout.add(this._bannerLabel);
|
||||
@ -770,20 +795,6 @@ const LoginDialog = new Lang.Class({
|
||||
|
||||
},
|
||||
|
||||
_updateLogo: function() {
|
||||
this._logoBox.child = null;
|
||||
let path = this._settings.get_string(GdmUtil.LOGO_KEY);
|
||||
|
||||
if (path) {
|
||||
let file = Gio.file_new_for_path(path);
|
||||
let uri = file.get_uri();
|
||||
|
||||
let textureCache = St.TextureCache.get_default();
|
||||
this._logoBox.child = textureCache.load_uri_async(uri, -1, _LOGO_ICON_NAME_SIZE);
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
_updateBanner: function() {
|
||||
let enabled = this._settings.get_boolean(GdmUtil.BANNER_MESSAGE_KEY);
|
||||
let text = this._settings.get_string(GdmUtil.BANNER_MESSAGE_TEXT_KEY);
|
||||
@ -802,8 +813,7 @@ const LoginDialog = new Lang.Class({
|
||||
let tasks = [this._hidePrompt,
|
||||
|
||||
new Batch.ConcurrentBatch(this, [this._fadeInTitleLabel,
|
||||
this._fadeInNotListedButton,
|
||||
this._fadeInLogo]),
|
||||
this._fadeInNotListedButton]),
|
||||
|
||||
function() {
|
||||
this._sessionList.close();
|
||||
@ -829,9 +839,13 @@ const LoginDialog = new Lang.Class({
|
||||
},
|
||||
|
||||
_showMessage: function(userVerifier, message, styleClass) {
|
||||
this._promptMessage.text = message;
|
||||
this._promptMessage.styleClass = styleClass;
|
||||
GdmUtil.fadeInActor(this._promptMessage);
|
||||
if (message) {
|
||||
this._promptMessage.text = message;
|
||||
this._promptMessage.styleClass = styleClass;
|
||||
GdmUtil.fadeInActor(this._promptMessage);
|
||||
} else {
|
||||
GdmUtil.fadeOutActor(this._promptMessage);
|
||||
}
|
||||
},
|
||||
|
||||
_showLoginHint: function(verifier, message) {
|
||||
@ -1075,7 +1089,7 @@ const LoginDialog = new Lang.Class({
|
||||
}));
|
||||
},
|
||||
|
||||
_onNotListedClicked: function(user) {
|
||||
_onNotListedClicked: function() {
|
||||
let tasks = [function() {
|
||||
return this._userList.hideItems();
|
||||
},
|
||||
@ -1089,8 +1103,7 @@ const LoginDialog = new Lang.Class({
|
||||
},
|
||||
|
||||
new Batch.ConcurrentBatch(this, [this._fadeOutTitleLabel,
|
||||
this._fadeOutNotListedButton,
|
||||
this._fadeOutLogo]),
|
||||
this._fadeOutNotListedButton]),
|
||||
|
||||
function() {
|
||||
let hold = new Batch.Hold();
|
||||
@ -1103,14 +1116,6 @@ const LoginDialog = new Lang.Class({
|
||||
batch.run();
|
||||
},
|
||||
|
||||
_fadeInLogo: function() {
|
||||
return GdmUtil.fadeInActor(this._logoBox);
|
||||
},
|
||||
|
||||
_fadeOutLogo: function() {
|
||||
return GdmUtil.fadeOutActor(this._logoBox);
|
||||
},
|
||||
|
||||
_fadeInBanner: function() {
|
||||
return GdmUtil.fadeInActor(this._bannerLabel);
|
||||
},
|
||||
@ -1159,8 +1164,7 @@ const LoginDialog = new Lang.Class({
|
||||
},
|
||||
|
||||
new Batch.ConcurrentBatch(this, [this._fadeOutTitleLabel,
|
||||
this._fadeOutNotListedButton,
|
||||
this._fadeOutLogo]),
|
||||
this._fadeOutNotListedButton]),
|
||||
|
||||
function() {
|
||||
return this._userList.shrinkToNaturalHeight();
|
||||
|
@ -35,7 +35,13 @@ const PowerMenuButton = new Lang.Class({
|
||||
/* Translators: accessible name of the power menu in the login screen */
|
||||
this.parent('system-shutdown-symbolic', _("Power"));
|
||||
|
||||
this._loginManager = LoginManager.getLoginManager();
|
||||
LoginManager.getLoginManager(Lang.bind(this, function(manager) {
|
||||
this._loginManager = manager;
|
||||
|
||||
this._updateHaveShutdown();
|
||||
this._updateHaveRestart();
|
||||
this._updateHaveSuspend();
|
||||
}));
|
||||
|
||||
this._settings = new Gio.Settings({ schema: GdmUtil.LOGIN_SCREEN_SCHEMA });
|
||||
this._settings.connect('changed::disable-restart-buttons',
|
||||
@ -64,6 +70,12 @@ const PowerMenuButton = new Lang.Class({
|
||||
},
|
||||
|
||||
_updateHaveShutdown: function() {
|
||||
if (!this._loginManager) {
|
||||
this._haveShutdown = false;
|
||||
this._powerOffItem.actor.visible = false;
|
||||
return;
|
||||
}
|
||||
|
||||
this._loginManager.canPowerOff(Lang.bind(this, function(result) {
|
||||
this._haveShutdown = result;
|
||||
this._powerOffItem.actor.visible = this._haveShutdown;
|
||||
@ -72,6 +84,12 @@ const PowerMenuButton = new Lang.Class({
|
||||
},
|
||||
|
||||
_updateHaveRestart: function() {
|
||||
if (!this._loginManager) {
|
||||
this._haveRestart = false;
|
||||
this._restartItem.actor.visible = false;
|
||||
return;
|
||||
}
|
||||
|
||||
this._loginManager.canReboot(Lang.bind(this, function(result) {
|
||||
this._haveRestart = result;
|
||||
this._restartItem.actor.visible = this._haveRestart;
|
||||
@ -80,6 +98,12 @@ const PowerMenuButton = new Lang.Class({
|
||||
},
|
||||
|
||||
_updateHaveSuspend: function() {
|
||||
if (!this._loginManager) {
|
||||
this._haveSuspend = false;
|
||||
this._suspendItem.actor.visible = false;
|
||||
return;
|
||||
}
|
||||
|
||||
this._loginManager.canSuspend(Lang.bind(this, function(result) {
|
||||
this._haveSuspend = result;
|
||||
this._suspendItem.actor.visible = this._haveSuspend;
|
||||
|
@ -1,6 +1,7 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
const Gio = imports.gi.Gio;
|
||||
const GLib = imports.gi.GLib;
|
||||
const Lang = imports.lang;
|
||||
const Shell = imports.gi.Shell;
|
||||
const Signals = imports.signals;
|
||||
@ -16,7 +17,16 @@ const ProviderIface = <interface name='org.freedesktop.realmd.Provider'>
|
||||
<arg name="realm" type="ao" direction="out"/>
|
||||
</method>
|
||||
</interface>;
|
||||
const Provider = Gio.DBusProxy.makeProxyWrapper(ProviderIface);
|
||||
const Provider = new Gio.DBusProxyClass({
|
||||
Name: 'RealmdProvider',
|
||||
Interface: ProviderIface,
|
||||
|
||||
_init: function() {
|
||||
this.parent({ g_bus_type: Gio.BusType.SYSTEM,
|
||||
g_name: 'org.freedesktop.realmd',
|
||||
g_object_path: '/org/freedesktop/realmd' });
|
||||
}
|
||||
});
|
||||
|
||||
const ServiceIface = <interface name="org.freedesktop.realmd.Service">
|
||||
<method name="Cancel">
|
||||
@ -31,7 +41,16 @@ const ServiceIface = <interface name="org.freedesktop.realmd.Service">
|
||||
<arg name="operation" type="s"/>
|
||||
</signal>
|
||||
</interface>;
|
||||
const Service = Gio.DBusProxy.makeProxyWrapper(ServiceIface);
|
||||
const Service = new Gio.DBusProxyClass({
|
||||
Name: 'RealmdService',
|
||||
Interface: ServiceIface,
|
||||
|
||||
_init: function(service) {
|
||||
this.parent({ g_bus_type: Gio.BusType.SYSTEM,
|
||||
g_name: 'org.freedesktop.realmd',
|
||||
g_object_path: service });
|
||||
}
|
||||
});
|
||||
|
||||
const RealmIface = <interface name="org.freedesktop.realmd.Realm">
|
||||
<property name="Name" type="s" access="read"/>
|
||||
@ -51,16 +70,22 @@ const RealmIface = <interface name="org.freedesktop.realmd.Realm">
|
||||
<arg name="options" type="a{sv}" direction="in"/>
|
||||
</method>
|
||||
</interface>;
|
||||
const Realm = Gio.DBusProxy.makeProxyWrapper(RealmIface);
|
||||
const Realm = new Gio.DBusProxyClass({
|
||||
Name: 'RealmdRealm',
|
||||
Interface: RealmIface,
|
||||
|
||||
_init: function(realm) {
|
||||
this.parent({ g_bus_type: Gio.BusType.SYSTEM,
|
||||
g_name: 'org.freedesktop.realmd',
|
||||
g_object_path: realm });
|
||||
}
|
||||
});
|
||||
|
||||
const Manager = new Lang.Class({
|
||||
Name: 'Manager',
|
||||
|
||||
_init: function(parentActor) {
|
||||
this._aggregateProvider = Provider(Gio.DBus.system,
|
||||
'org.freedesktop.realmd',
|
||||
'/org/freedesktop/realmd',
|
||||
Lang.bind(this, this._reloadRealms))
|
||||
this._aggregateProvider = new Provider();
|
||||
this._realms = {};
|
||||
|
||||
this._aggregateProvider.connect('g-properties-changed',
|
||||
@ -68,6 +93,16 @@ const Manager = new Lang.Class({
|
||||
if ('Realms' in properties.deep_unpack())
|
||||
this._reloadRealms();
|
||||
}));
|
||||
|
||||
this._aggregateProvider.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(proxy, result) {
|
||||
try {
|
||||
proxy.init_finish(result);
|
||||
} catch(e) {
|
||||
return;
|
||||
}
|
||||
|
||||
this._reloadRealms();
|
||||
}));
|
||||
},
|
||||
|
||||
_reloadRealms: function() {
|
||||
@ -77,10 +112,8 @@ const Manager = new Lang.Class({
|
||||
return;
|
||||
|
||||
for (let i = 0; i < realmPaths.length; i++) {
|
||||
let realm = Realm(Gio.DBus.system,
|
||||
'org.freedesktop.realmd',
|
||||
realmPaths[i],
|
||||
Lang.bind(this, this._onRealmLoaded));
|
||||
let realm = new Realm(realmPaths[i]);
|
||||
realm.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, this._onRealmLoaded));
|
||||
}
|
||||
},
|
||||
|
||||
@ -97,9 +130,10 @@ const Manager = new Lang.Class({
|
||||
this._updateLoginFormat();
|
||||
},
|
||||
|
||||
_onRealmLoaded: function(realm, error) {
|
||||
if (error)
|
||||
return;
|
||||
_onRealmLoaded: function(realm, result) {
|
||||
try {
|
||||
realm.init_finish(result);
|
||||
} catch(e) { return; }
|
||||
|
||||
this._reloadRealm(realm);
|
||||
|
||||
|
@ -82,6 +82,8 @@ const ShellUserVerifier = new Lang.Class({
|
||||
this._settings = new Gio.Settings({ schema: LOGIN_SCREEN_SCHEMA });
|
||||
|
||||
this._fprintManager = new Fprint.FprintManager();
|
||||
this._fprintManager.init(null);
|
||||
|
||||
this._realmManager = new Realmd.Manager();
|
||||
|
||||
this._failCounter = 0;
|
||||
@ -125,6 +127,9 @@ const ShellUserVerifier = new Lang.Class({
|
||||
},
|
||||
|
||||
answerQuery: function(serviceName, answer) {
|
||||
// Clear any previous message
|
||||
this.emit('show-message', null, null);
|
||||
|
||||
this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null);
|
||||
},
|
||||
|
||||
@ -134,11 +139,14 @@ const ShellUserVerifier = new Lang.Class({
|
||||
if (!this._settings.get_boolean(FINGERPRINT_AUTHENTICATION_KEY))
|
||||
return;
|
||||
|
||||
this._fprintManager.GetDefaultDeviceRemote(Gio.DBusCallFlags.NONE, this._cancellable, Lang.bind(this,
|
||||
function(device, error) {
|
||||
if (!error && device)
|
||||
this._haveFingerprintReader = true;
|
||||
}));
|
||||
this._fprintManager.GetDefaultDeviceRemote(this._cancellable, Lang.bind(this, function(manager, result) {
|
||||
try {
|
||||
let device = manager.GetDefaultDeviceFinish(result);
|
||||
this._haveFingerprintReader = !!device;
|
||||
} catch(e) {
|
||||
this._haveFingerprintReader = false;
|
||||
}
|
||||
}));
|
||||
},
|
||||
|
||||
_reportInitError: function(where, error) {
|
||||
@ -330,12 +338,11 @@ const ShellUserVerifier = new Lang.Class({
|
||||
// Otherwise, we allow ALLOWED_FAILURES attempts. After that, we
|
||||
// go back to the welcome screen.
|
||||
|
||||
this._failCounter++;
|
||||
let canRetry = retry && this._userName &&
|
||||
this._failCounter < this._settings.get_int(ALLOWED_FAILURES_KEY);
|
||||
|
||||
if (canRetry) {
|
||||
this._failCounter++;
|
||||
|
||||
this.clear();
|
||||
this.begin(this._userName, new Batch.Hold());
|
||||
} else {
|
||||
|
@ -21,11 +21,16 @@ const PresenceStatus = {
|
||||
IDLE: 3
|
||||
};
|
||||
|
||||
var PresenceProxy = Gio.DBusProxy.makeProxyWrapper(PresenceIface);
|
||||
function Presence(initCallback, cancellable) {
|
||||
return new PresenceProxy(Gio.DBus.session, 'org.gnome.SessionManager',
|
||||
'/org/gnome/SessionManager/Presence', initCallback, cancellable);
|
||||
}
|
||||
const Presence = new Gio.DBusProxyClass({
|
||||
Name: 'GnomeSessionPresence',
|
||||
Interface: PresenceIface,
|
||||
|
||||
_init: function() {
|
||||
this.parent({ g_bus_type: Gio.BusType.SESSION,
|
||||
g_name: 'org.gnome.SessionManager',
|
||||
g_object_path: '/org/gnome/SessionManager/Presence' });
|
||||
}
|
||||
});
|
||||
|
||||
// Note inhibitors are immutable objects, so they don't
|
||||
// change at runtime (changes always come in the form
|
||||
@ -39,10 +44,16 @@ const InhibitorIface = <interface name="org.gnome.SessionManager.Inhibitor">
|
||||
</method>
|
||||
</interface>;
|
||||
|
||||
var InhibitorProxy = Gio.DBusProxy.makeProxyWrapper(InhibitorIface);
|
||||
function Inhibitor(objectPath, initCallback, cancellable) {
|
||||
return new InhibitorProxy(Gio.DBus.session, 'org.gnome.SessionManager', objectPath, initCallback, cancellable);
|
||||
}
|
||||
const Inhibitor = new Gio.DBusProxyClass({
|
||||
Name: 'GnomeSessionInhibitor',
|
||||
Interface: InhibitorIface,
|
||||
|
||||
_init: function(inhibitor) {
|
||||
this.parent({ g_bus_type: Gio.BusType.SESSION,
|
||||
g_name: 'org.gnome.SessionManager',
|
||||
g_object_path: inhibitor });
|
||||
}
|
||||
});
|
||||
|
||||
// Not the full interface, only the methods we use
|
||||
const SessionManagerIface = <interface name="org.gnome.SessionManager">
|
||||
@ -66,7 +77,14 @@ const SessionManagerIface = <interface name="org.gnome.SessionManager">
|
||||
</signal>
|
||||
</interface>;
|
||||
|
||||
var SessionManagerProxy = Gio.DBusProxy.makeProxyWrapper(SessionManagerIface);
|
||||
function SessionManager(initCallback, cancellable) {
|
||||
return new SessionManagerProxy(Gio.DBus.session, 'org.gnome.SessionManager', '/org/gnome/SessionManager', initCallback, cancellable);
|
||||
}
|
||||
const SessionManager = new Gio.DBusProxyClass({
|
||||
Name: 'GnomeSessionManager',
|
||||
Interface: SessionManagerIface,
|
||||
|
||||
_init: function() {
|
||||
this.parent({ g_bus_type: Gio.BusType.SESSION,
|
||||
g_name: 'org.gnome.SessionManager',
|
||||
g_object_path: '/org/gnome/SessionManager' });
|
||||
},
|
||||
});
|
||||
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
const GLib = imports.gi.GLib;
|
||||
const Gio = imports.gi.Gio;
|
||||
const GObject = imports.gi.GObject;
|
||||
const Lang = imports.lang;
|
||||
const Mainloop = imports.mainloop;
|
||||
const Shell = imports.gi.Shell;
|
||||
@ -33,8 +34,26 @@ const SystemdLoginSessionIface = <interface name='org.freedesktop.login1.Session
|
||||
<signal name='Unlock' />
|
||||
</interface>;
|
||||
|
||||
const SystemdLoginManager = Gio.DBusProxy.makeProxyWrapper(SystemdLoginManagerIface);
|
||||
const SystemdLoginSession = Gio.DBusProxy.makeProxyWrapper(SystemdLoginSessionIface);
|
||||
const SystemdLoginManager = new Gio.DBusProxyClass({
|
||||
Name: 'SystemdLoginManager',
|
||||
Interface: SystemdLoginManagerIface,
|
||||
|
||||
_init: function() {
|
||||
this.parent({ g_bus_type: Gio.BusType.SYSTEM,
|
||||
g_name: 'org.freedesktop.login1',
|
||||
g_object_path: '/org/freedesktop/login1' });
|
||||
}
|
||||
});
|
||||
const SystemdLoginSession = new Gio.DBusProxyClass({
|
||||
Name: 'SystemdLoginSession',
|
||||
Interface: SystemdLoginSessionIface,
|
||||
|
||||
_init: function(session) {
|
||||
this.parent({ g_bus_type: Gio.BusType.SYSTEM,
|
||||
g_name: 'org.freedesktop.login1',
|
||||
g_object_path: session });
|
||||
}
|
||||
});
|
||||
|
||||
const ConsoleKitManagerIface = <interface name='org.freedesktop.ConsoleKit.Manager'>
|
||||
<method name='CanRestart'>
|
||||
@ -61,51 +80,128 @@ const ConsoleKitSessionIface = <interface name='org.freedesktop.ConsoleKit.Sessi
|
||||
<signal name='Unlock' />
|
||||
</interface>;
|
||||
|
||||
const ConsoleKitSession = Gio.DBusProxy.makeProxyWrapper(ConsoleKitSessionIface);
|
||||
const ConsoleKitManager = Gio.DBusProxy.makeProxyWrapper(ConsoleKitManagerIface);
|
||||
const ConsoleKitSession = new Gio.DBusProxyClass({
|
||||
Name: 'ConsoleKitSession',
|
||||
Interface: ConsoleKitSessionIface,
|
||||
|
||||
_init: function(session) {
|
||||
this.parent({ g_bus_type: Gio.BusType.SYSTEM,
|
||||
g_name: 'org.freedesktop.ConsoleKit',
|
||||
g_object_path: session });
|
||||
}
|
||||
});
|
||||
const ConsoleKitManager = new Gio.DBusProxyClass({
|
||||
Name: 'ConsoleKitManager',
|
||||
Interface: ConsoleKitManagerIface,
|
||||
|
||||
_init: function() {
|
||||
this.parent({ g_bus_type: Gio.BusType.SYSTEM,
|
||||
g_name: 'org.freedesktop.ConsoleKit',
|
||||
g_object_path: '/org/freedesktop/ConsoleKit/Manager' });
|
||||
}
|
||||
});
|
||||
|
||||
function haveSystemd() {
|
||||
return GLib.access("/sys/fs/cgroup/systemd", 0) >= 0;
|
||||
}
|
||||
|
||||
let _loginManager = null;
|
||||
let _pendingAsyncCallbacks = [];
|
||||
|
||||
/**
|
||||
* LoginManager:
|
||||
* An abstraction over systemd/logind and ConsoleKit.
|
||||
*
|
||||
*/
|
||||
function getLoginManager() {
|
||||
function getLoginManager(asyncCallback) {
|
||||
if (_loginManager == null) {
|
||||
if (haveSystemd())
|
||||
_loginManager = new LoginManagerSystemd();
|
||||
else
|
||||
_loginManager = new LoginManagerConsoleKit();
|
||||
}
|
||||
if (_pendingAsyncCallbacks.length == 0) {
|
||||
let manager;
|
||||
|
||||
return _loginManager;
|
||||
if (haveSystemd())
|
||||
manager = new LoginManagerSystemd();
|
||||
else
|
||||
manager = new LoginManagerConsoleKit();
|
||||
|
||||
manager.initAsync(null, function(obj, result) {
|
||||
obj.initFinish(result);
|
||||
|
||||
_loginManager = manager;
|
||||
|
||||
_pendingAsyncCallbacks.forEach(function (f) { f(obj) });
|
||||
_pendingAsyncCallbacks = [];
|
||||
});
|
||||
|
||||
_pendingAsyncCallbacks = [asyncCallback];
|
||||
} else {
|
||||
_pendingAsyncCallbacks.push(asyncCallback);
|
||||
}
|
||||
} else {
|
||||
GLib.idle_add(GLib.PRIORITY_DEFAULT, function() {
|
||||
asyncCallback(_loginManager);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
const LoginManagerSystemd = new Lang.Class({
|
||||
Name: 'LoginManagerSystemd',
|
||||
Extends: GObject.Object,
|
||||
|
||||
_init: function() {
|
||||
this._proxy = new SystemdLoginManager(Gio.DBus.system,
|
||||
'org.freedesktop.login1',
|
||||
'/org/freedesktop/login1');
|
||||
this.parent();
|
||||
|
||||
this._proxy = new SystemdLoginManager();
|
||||
},
|
||||
|
||||
initAsync: function(cancellable, asyncCallback) {
|
||||
let simpleResult = Gio.SimpleAsyncResult.new(this, asyncCallback, null);
|
||||
simpleResult.set_check_cancellable(cancellable);
|
||||
|
||||
this._proxy.init_async(GLib.PRIORITY_DEFAULT, cancellable, Lang.bind(this, function(proxy, result) {
|
||||
try {
|
||||
proxy.init_finish(result);
|
||||
|
||||
if (cancellable && cancellable.is_cancelled())
|
||||
return;
|
||||
|
||||
this._fetchCurrentSession(cancellable, simpleResult);
|
||||
} catch(e if e instanceof GLib.Error) {
|
||||
simpleResult.set_from_error(e);
|
||||
simpleResult.complete();
|
||||
}
|
||||
}));
|
||||
},
|
||||
|
||||
initFinish: function(simpleResult) {
|
||||
if (!simpleResult.propagate_error())
|
||||
return simpleResult.get_op_res_gboolean();
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
_fetchCurrentSession: function(cancellable, simpleResult) {
|
||||
this._currentSession = new SystemdLoginSession('/org/freedesktop/login1/session/' +
|
||||
GLib.getenv('XDG_SESSION_ID'));
|
||||
|
||||
this._currentSession.init_async(GLib.PRIORITY_DEFAULT, cancellable, Lang.bind(this, function(proxy, result) {
|
||||
try {
|
||||
proxy.init_finish(result);
|
||||
|
||||
simpleResult.set_op_res_gboolean(true);
|
||||
} catch(e if e instanceof GLib.Error) {
|
||||
simpleResult.set_from_error(e);
|
||||
}
|
||||
|
||||
simpleResult.complete();
|
||||
}));
|
||||
},
|
||||
|
||||
// Having this function is a bit of a hack since the Systemd and ConsoleKit
|
||||
// session objects have different interfaces - but in both cases there are
|
||||
// Lock/Unlock signals, and that's all we count upon at the moment.
|
||||
//
|
||||
// This is only valid after async initialization
|
||||
getCurrentSessionProxy: function() {
|
||||
if (!this._currentSession) {
|
||||
this._currentSession = new SystemdLoginSession(Gio.DBus.system,
|
||||
'org.freedesktop.login1',
|
||||
'/org/freedesktop/login1/session/' +
|
||||
GLib.getenv('XDG_SESSION_ID'));
|
||||
}
|
||||
|
||||
return this._currentSession;
|
||||
},
|
||||
|
||||
@ -114,66 +210,126 @@ const LoginManagerSystemd = new Lang.Class({
|
||||
},
|
||||
|
||||
canPowerOff: function(asyncCallback) {
|
||||
this._proxy.CanPowerOffRemote(function(result, error) {
|
||||
if (error)
|
||||
asyncCallback(false);
|
||||
else
|
||||
asyncCallback(result[0] != 'no');
|
||||
this._proxy.CanPowerOffRemote(null, function(proxy, result) {
|
||||
let val = false;
|
||||
|
||||
try {
|
||||
val = proxy.CanPowerOffFinish(result)[0] != 'no';
|
||||
} catch(e) { }
|
||||
|
||||
asyncCallback(val);
|
||||
});
|
||||
},
|
||||
|
||||
canReboot: function(asyncCallback) {
|
||||
this._proxy.CanRebootRemote(function(result, error) {
|
||||
if (error)
|
||||
asyncCallback(false);
|
||||
else
|
||||
asyncCallback(result[0] != 'no');
|
||||
this._proxy.CanRebootRemote(null, function(proxy, result) {
|
||||
let val = false;
|
||||
|
||||
try {
|
||||
val = proxy.CanRebootFinish(result)[0] != 'no';
|
||||
} catch(e) { }
|
||||
|
||||
asyncCallback(val);
|
||||
});
|
||||
},
|
||||
|
||||
canSuspend: function(asyncCallback) {
|
||||
this._proxy.CanSuspendRemote(function(result, error) {
|
||||
if (error)
|
||||
asyncCallback(false);
|
||||
else
|
||||
asyncCallback(result[0] != 'no');
|
||||
this._proxy.CanSuspendRemote(null, function(proxy, result) {
|
||||
let val = false;
|
||||
|
||||
try {
|
||||
val = proxy.CanRebootFinish(result)[0] != 'no';
|
||||
} catch(e) { }
|
||||
|
||||
asyncCallback(val);
|
||||
});
|
||||
},
|
||||
|
||||
powerOff: function() {
|
||||
this._proxy.PowerOffRemote(true);
|
||||
this._proxy.PowerOffRemote(true, null, null);
|
||||
},
|
||||
|
||||
reboot: function() {
|
||||
this._proxy.RebootRemote(true);
|
||||
this._proxy.RebootRemote(true, null, null);
|
||||
},
|
||||
|
||||
suspend: function() {
|
||||
this._proxy.SuspendRemote(true);
|
||||
this._proxy.SuspendRemote(true, null, null);
|
||||
}
|
||||
});
|
||||
|
||||
const LoginManagerConsoleKit = new Lang.Class({
|
||||
Name: 'LoginManagerConsoleKit',
|
||||
Extends: GObject.Object,
|
||||
|
||||
_init: function() {
|
||||
this._proxy = new ConsoleKitManager(Gio.DBus.system,
|
||||
'org.freedesktop.ConsoleKit',
|
||||
'/org/freedesktop/ConsoleKit/Manager');
|
||||
this.parent();
|
||||
|
||||
this._proxy = new ConsoleKitManager();
|
||||
this._upClient = new UPowerGlib.Client();
|
||||
},
|
||||
|
||||
initAsync: function(cancellable, asyncCallback) {
|
||||
let simpleResult = Gio.SimpleAsyncResult.new(this, asyncCallback, null);
|
||||
simpleResult.set_check_cancellable(cancellable);
|
||||
|
||||
this._proxy.init_async(GLib.PRIORITY_DEFAULT, cancellable, Lang.bind(this, function(proxy, result) {
|
||||
try {
|
||||
proxy.init_finish(result);
|
||||
|
||||
if (cancellable && cancellable.is_cancelled())
|
||||
return;
|
||||
|
||||
this._fetchCurrentSession(cancellable, simpleResult);
|
||||
} catch(e if e instanceof GLib.Error) {
|
||||
simpleResult.set_from_error(e);
|
||||
simpleResult.complete();
|
||||
}
|
||||
}));
|
||||
},
|
||||
|
||||
initFinish: function(simpleResult) {
|
||||
if (!simpleResult.propagate_error())
|
||||
return simpleResult.get_op_res_gboolean();
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
_fetchCurrentSession: function(cancellable, simpleResult) {
|
||||
this._proxy.GetCurrentSessionRemote(cancellable, Lang.bind(this, function(proxy, result) {
|
||||
try {
|
||||
let [currentSessionId] = proxy.GetCurrentSessionFinish(result);
|
||||
|
||||
if (cancellable && cancellable.is_cancelled())
|
||||
return;
|
||||
|
||||
this._createSessionProxy(currentSessionId, cancellable, simpleResult);
|
||||
} catch(e if e instanceof GLib.Error) {
|
||||
simpleResult.set_from_error(e);
|
||||
simpleResult.complete();
|
||||
}
|
||||
}));
|
||||
},
|
||||
|
||||
_createSessionProxy: function(currentSessionId, cancellable, simpleResult) {
|
||||
this._currentSession = new ConsoleKitSession(currentSessionId);
|
||||
this._currentSession.init_async(GLib.PRIORITY_DEFAULT, cancellable, Lang.bind(this, function(proxy, result) {
|
||||
try {
|
||||
proxy.init_finish(result);
|
||||
|
||||
simpleResult.set_op_res_gboolean(true);
|
||||
} catch(e if e instanceof GLib.Error) {
|
||||
simpleResult.set_from_error(e);
|
||||
}
|
||||
|
||||
simpleResult.complete();
|
||||
}));
|
||||
},
|
||||
|
||||
// Having this function is a bit of a hack since the Systemd and ConsoleKit
|
||||
// session objects have different interfaces - but in both cases there are
|
||||
// Lock/Unlock signals, and that's all we count upon at the moment.
|
||||
getCurrentSessionProxy: function() {
|
||||
if (!this._currentSession) {
|
||||
let [currentSessionId] = this._proxy.GetCurrentSessionSync();
|
||||
this._currentSession = new ConsoleKitSession(Gio.DBus.system,
|
||||
'org.freedesktop.ConsoleKit',
|
||||
currentSessionId);
|
||||
}
|
||||
|
||||
return this._currentSession;
|
||||
},
|
||||
|
||||
@ -185,26 +341,32 @@ const LoginManagerConsoleKit = new Lang.Class({
|
||||
session.connectSignal('ActiveChanged', Lang.bind(this, function(object, senderName, [isActive]) {
|
||||
this._sessionActive = isActive;
|
||||
}));
|
||||
[this._sessionActive] = session.IsActiveSync();
|
||||
[this._sessionActive] = session.IsActiveSync(null);
|
||||
|
||||
return this._sessionActive;
|
||||
},
|
||||
|
||||
canPowerOff: function(asyncCallback) {
|
||||
this._proxy.CanStopRemote(function(result, error) {
|
||||
if (error)
|
||||
asyncCallback(false);
|
||||
else
|
||||
asyncCallback(result[0]);
|
||||
this._proxy.CanStopRemote(null, function(proxy, result) {
|
||||
let val = false;
|
||||
|
||||
try {
|
||||
[val] = proxy.CanStopFinish(result);
|
||||
} catch(e) { }
|
||||
|
||||
asyncCallback(val);
|
||||
});
|
||||
},
|
||||
|
||||
canReboot: function(asyncCallback) {
|
||||
this._proxy.CanRestartRemote(function(result, error) {
|
||||
if (error)
|
||||
asyncCallback(false);
|
||||
else
|
||||
asyncCallback(result[0]);
|
||||
this._proxy.CanRestartRemote(null, function(proxy, result) {
|
||||
let val = false;
|
||||
|
||||
try {
|
||||
[val] = proxy.CanRestartFinish(result);
|
||||
} catch(e) { }
|
||||
|
||||
asyncCallback(val);
|
||||
});
|
||||
},
|
||||
|
||||
@ -216,11 +378,11 @@ const LoginManagerConsoleKit = new Lang.Class({
|
||||
},
|
||||
|
||||
powerOff: function() {
|
||||
this._proxy.StopRemote();
|
||||
this._proxy.StopRemote(null, null);
|
||||
},
|
||||
|
||||
reboot: function() {
|
||||
this._proxy.RestartRemote();
|
||||
this._proxy.RestartRemote(null, null);
|
||||
},
|
||||
|
||||
suspend: function() {
|
||||
|
@ -1,6 +1,7 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
const Gio = imports.gi.Gio;
|
||||
const GLib = imports.gi.GLib;
|
||||
const Lang = imports.lang;
|
||||
const Shell = imports.gi.Shell;
|
||||
const Signals = imports.signals;
|
||||
@ -26,7 +27,16 @@ const ModemGsmNetworkInterface = <interface name="org.freedesktop.ModemManager.M
|
||||
</signal>
|
||||
</interface>;
|
||||
|
||||
const ModemGsmNetworkProxy = Gio.DBusProxy.makeProxyWrapper(ModemGsmNetworkInterface);
|
||||
const ModemGsmNetworkProxy = new Gio.DBusProxyClass({
|
||||
Name: 'ModemGsmNetworkProxy',
|
||||
Interface: ModemGsmNetworkInterface,
|
||||
|
||||
_init: function(modem) {
|
||||
this.parent({ g_bus_type: Gio.BusType.SYSTEM,
|
||||
g_name: 'org.freedesktop.ModemManager',
|
||||
g_object_path: modem });
|
||||
}
|
||||
});
|
||||
|
||||
const ModemCdmaInterface = <interface name="org.freedesktop.ModemManager.Modem.Cdma">
|
||||
<method name="GetSignalQuality">
|
||||
@ -40,7 +50,16 @@ const ModemCdmaInterface = <interface name="org.freedesktop.ModemManager.Modem.C
|
||||
</signal>
|
||||
</interface>;
|
||||
|
||||
const ModemCdmaProxy = Gio.DBusProxy.makeProxyWrapper(ModemCdmaInterface);
|
||||
const ModemCdmaProxy = new Gio.DBusProxyClass({
|
||||
Name: 'ModemCdmaProxy',
|
||||
Interface: ModemCdmaInterface,
|
||||
|
||||
_init: function(modem) {
|
||||
this.parent({ g_bus_type: Gio.BusType.SYSTEM,
|
||||
g_name: 'org.freedesktop.ModemManager',
|
||||
g_object_path: modem });
|
||||
},
|
||||
});
|
||||
|
||||
let _providersTable;
|
||||
function _getProvidersTable() {
|
||||
@ -54,11 +73,18 @@ const ModemGsm = new Lang.Class({
|
||||
Name: 'ModemGsm',
|
||||
|
||||
_init: function(path) {
|
||||
this._proxy = new ModemGsmNetworkProxy(Gio.DBus.system, 'org.freedesktop.ModemManager', path);
|
||||
this._proxy = new ModemGsmNetworkProxy(path);
|
||||
this._proxy.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(obj, result) {
|
||||
obj.init_finish(result);
|
||||
|
||||
this._finishInit();
|
||||
}));
|
||||
|
||||
this.signal_quality = 0;
|
||||
this.operator_name = null;
|
||||
},
|
||||
|
||||
_finishInit: function() {
|
||||
// Code is duplicated because the function have different signatures
|
||||
this._proxy.connectSignal('SignalQuality', Lang.bind(this, function(proxy, sender, [quality]) {
|
||||
this.signal_quality = quality;
|
||||
@ -68,24 +94,19 @@ const ModemGsm = new Lang.Class({
|
||||
this.operator_name = this._findOperatorName(name, code);
|
||||
this.emit('notify::operator-name');
|
||||
}));
|
||||
this._proxy.GetRegistrationInfoRemote(Lang.bind(this, function([result], err) {
|
||||
if (err) {
|
||||
log(err);
|
||||
return;
|
||||
}
|
||||
|
||||
let [status, code, name] = result;
|
||||
this._proxy.GetRegistrationInfoRemote(null, Lang.bind(this, function(proxy, result) {
|
||||
let [status, code, name] = proxy.GetRegistrationInfoFinish(result);
|
||||
this.operator_name = this._findOperatorName(name, code);
|
||||
this.emit('notify::operator-name');
|
||||
}));
|
||||
this._proxy.GetSignalQualityRemote(Lang.bind(this, function(result, err) {
|
||||
if (err) {
|
||||
this._proxy.GetSignalQualityRemote(null, Lang.bind(this, function(proxy, result) {
|
||||
try {
|
||||
[this.signal_quality] = proxy.GetSignalQualityFinish(result);
|
||||
} catch(e) {
|
||||
// it will return an error if the device is not connected
|
||||
this.signal_quality = 0;
|
||||
} else {
|
||||
let [quality] = result;
|
||||
this.signal_quality = quality;
|
||||
}
|
||||
|
||||
this.emit('notify::signal-quality');
|
||||
}));
|
||||
},
|
||||
@ -157,10 +178,18 @@ const ModemCdma = new Lang.Class({
|
||||
Name: 'ModemCdma',
|
||||
|
||||
_init: function(path) {
|
||||
this._proxy = new ModemCdmaProxy(Gio.DBus.system, 'org.freedesktop.ModemManager', path);
|
||||
this._proxy = new ModemCdmaProxy(path);
|
||||
this._proxy.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(obj, result) {
|
||||
obj.init_finish(result);
|
||||
|
||||
this._finishInit();
|
||||
}));
|
||||
|
||||
this.signal_quality = 0;
|
||||
this.operator_name = null;
|
||||
},
|
||||
|
||||
_finishInit: function() {
|
||||
this._proxy.connectSignal('SignalQuality', Lang.bind(this, function(proxy, sender, params) {
|
||||
this.signal_quality = params[0];
|
||||
this.emit('notify::signal-quality');
|
||||
@ -170,30 +199,31 @@ const ModemCdma = new Lang.Class({
|
||||
if (this.operator_name == null)
|
||||
this._refreshServingSystem();
|
||||
}));
|
||||
this._proxy.GetSignalQualityRemote(Lang.bind(this, function(result, err) {
|
||||
if (err) {
|
||||
this._proxy.GetSignalQualityRemote(null, Lang.bind(this, function(proxy, result) {
|
||||
try {
|
||||
[this.signal_quality] = proxy.GetSignalQualityFinish(result);
|
||||
} catch(e) {
|
||||
// it will return an error if the device is not connected
|
||||
this.signal_quality = 0;
|
||||
} else {
|
||||
let [quality] = result;
|
||||
this.signal_quality = quality;
|
||||
}
|
||||
|
||||
this.emit('notify::signal-quality');
|
||||
}));
|
||||
},
|
||||
|
||||
_refreshServingSystem: function() {
|
||||
this._proxy.GetServingSystemRemote(Lang.bind(this, function([result], err) {
|
||||
if (err) {
|
||||
// it will return an error if the device is not connected
|
||||
this.operator_name = null;
|
||||
} else {
|
||||
let [bandClass, band, id] = result;
|
||||
this._proxy.GetServingSystemRemote(null, Lang.bind(this, function(proxy, result) {
|
||||
try {
|
||||
let [bandClass, band, name] = proxy.GetServingSystemFinish(result);
|
||||
if (name.length > 0)
|
||||
this.operator_name = this._findProviderForSid(id);
|
||||
this.operator_name = this._findProviderForSid(name);
|
||||
else
|
||||
this.operator_name = null;
|
||||
} catch(e) {
|
||||
// it will return an error if the device is not connected
|
||||
this.operator_name = null;
|
||||
}
|
||||
|
||||
this.emit('notify::operator-name');
|
||||
}));
|
||||
},
|
||||
|
@ -141,6 +141,7 @@ const BoxPointer = new Lang.Class({
|
||||
|
||||
this._muteInput();
|
||||
|
||||
Tweener.removeTweens(this);
|
||||
Tweener.addTween(this, { opacity: fade ? 0 : 255,
|
||||
xOffset: xOffset,
|
||||
yOffset: yOffset,
|
||||
|
@ -1,6 +1,7 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const GLib = imports.gi.GLib;
|
||||
const Gio = imports.gi.Gio;
|
||||
const Lang = imports.lang;
|
||||
const St = imports.gi.St;
|
||||
@ -200,19 +201,17 @@ const CalendarServerIface = <interface name="org.gnome.Shell.CalendarServer">
|
||||
<signal name="Changed" />
|
||||
</interface>;
|
||||
|
||||
const CalendarServerInfo = Gio.DBusInterfaceInfo.new_for_xml(CalendarServerIface);
|
||||
const CalendarServer = new Gio.DBusProxyClass({
|
||||
Name: 'CalendarServer',
|
||||
Interface: CalendarServerIface,
|
||||
|
||||
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_LOAD_PROPERTIES });
|
||||
|
||||
self.init(null);
|
||||
return self;
|
||||
}
|
||||
_init: function() {
|
||||
this.parent({ g_bus_type: Gio.BusType.SESSION,
|
||||
g_name: 'org.gnome.Shell.CalendarServer',
|
||||
g_object_path: '/org/gnome/Shell/CalendarServer',
|
||||
g_flags: Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES });
|
||||
}
|
||||
});
|
||||
|
||||
function _datesEqual(a, b) {
|
||||
if (a < b)
|
||||
@ -242,11 +241,15 @@ const DBusEventSource = new Lang.Class({
|
||||
this._dbusProxy = new CalendarServer();
|
||||
this._dbusProxy.connectSignal('Changed', Lang.bind(this, this._onChanged));
|
||||
|
||||
this._dbusProxy.connect('notify::g-name-owner', Lang.bind(this, function() {
|
||||
if (this._dbusProxy.g_name_owner)
|
||||
this._onNameAppeared();
|
||||
else
|
||||
this._onNameVanished();
|
||||
this._dbusProxy.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(proxy, result) {
|
||||
try {
|
||||
proxy.init_finish(result);
|
||||
} catch(e) {
|
||||
return;
|
||||
}
|
||||
|
||||
this._resetCache();
|
||||
this.emit('changed');
|
||||
}));
|
||||
},
|
||||
|
||||
@ -256,51 +259,52 @@ const DBusEventSource = new Lang.Class({
|
||||
this._lastRequestEnd = null;
|
||||
},
|
||||
|
||||
_onNameAppeared: function(owner) {
|
||||
this._resetCache();
|
||||
this._loadEvents(true);
|
||||
},
|
||||
|
||||
_onNameVanished: function(oldOwner) {
|
||||
this._resetCache();
|
||||
this.emit('changed');
|
||||
},
|
||||
|
||||
_onChanged: function() {
|
||||
this._loadEvents(false);
|
||||
},
|
||||
|
||||
_onEventsReceived: function([appointments]) {
|
||||
let newEvents = [];
|
||||
if (appointments != null) {
|
||||
for (let n = 0; n < appointments.length; n++) {
|
||||
let a = appointments[n];
|
||||
let date = new Date(a[4] * 1000);
|
||||
let end = new Date(a[5] * 1000);
|
||||
let summary = a[1];
|
||||
let allDay = a[3];
|
||||
let event = new CalendarEvent(date, end, summary, allDay);
|
||||
newEvents.push(event);
|
||||
}
|
||||
newEvents.sort(function(event1, event2) {
|
||||
return event1.date.getTime() - event2.date.getTime();
|
||||
});
|
||||
_onEventsReceived: function(proxy, result) {
|
||||
let appointments;
|
||||
try {
|
||||
[appointments] = proxy.call_finish(result).deep_unpack();
|
||||
} catch(e if e instanceof GLib.Error) {
|
||||
// ignore errors coming from DBus
|
||||
appointments = [];
|
||||
}
|
||||
|
||||
let newEvents = [];
|
||||
for (let n = 0; n < appointments.length; n++) {
|
||||
let a = appointments[n];
|
||||
let date = new Date(a[4] * 1000);
|
||||
let end = new Date(a[5] * 1000);
|
||||
let summary = a[1];
|
||||
let allDay = a[3];
|
||||
let event = new CalendarEvent(date, end, summary, allDay);
|
||||
newEvents.push(event);
|
||||
}
|
||||
newEvents.sort(function(event1, event2) {
|
||||
return event1.date.getTime() - event2.date.getTime();
|
||||
});
|
||||
|
||||
this._events = newEvents;
|
||||
this.emit('changed');
|
||||
},
|
||||
|
||||
_loadEvents: function(forceReload) {
|
||||
if (this._curRequestBegin && this._curRequestEnd){
|
||||
/* Can't use GetEventsRemote because we need to pass the
|
||||
flags here */
|
||||
let callFlags = Gio.DBusCallFlags.NO_AUTO_START;
|
||||
if (forceReload)
|
||||
callFlags = Gio.DBusCallFlags.NONE;
|
||||
this._dbusProxy.GetEventsRemote(this._curRequestBegin.getTime() / 1000,
|
||||
this._curRequestEnd.getTime() / 1000,
|
||||
forceReload,
|
||||
Lang.bind(this, this._onEventsReceived),
|
||||
callFlags);
|
||||
callFlags = Gio.DBusCallFlags.NONE;
|
||||
this._dbusProxy.call("GetEvents",
|
||||
GLib.Variant.new("(xxb)", [this._curRequestBegin.getTime() / 1000,
|
||||
this._curRequestEnd.getTime() / 1000,
|
||||
forceReload]),
|
||||
callFlags,
|
||||
-1,
|
||||
null,
|
||||
Lang.bind(this, this._onEventsReceived));
|
||||
}
|
||||
},
|
||||
|
||||
@ -393,7 +397,6 @@ const Calendar = new Lang.Class({
|
||||
this._eventSourceChangedId = this._eventSource.connect('changed', Lang.bind(this, function() {
|
||||
this._update(false);
|
||||
}));
|
||||
this._update(true);
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -33,7 +33,9 @@ const AutomountManager = new Lang.Class({
|
||||
Lang.bind(this, this._InhibitorsChanged));
|
||||
this._inhibited = false;
|
||||
|
||||
this._loginManager = LoginManager.getLoginManager();
|
||||
LoginManager.getLoginManager(Lang.bind(this, function(manager) {
|
||||
this._loginManager = manager;
|
||||
}));
|
||||
this._volumeMonitor = Gio.VolumeMonitor.get();
|
||||
},
|
||||
|
||||
@ -85,7 +87,7 @@ const AutomountManager = new Lang.Class({
|
||||
_onDriveConnected: function() {
|
||||
// if we're not in the current ConsoleKit session,
|
||||
// or screensaver is active, don't play sounds
|
||||
if (!this._loginManager.sessionActive)
|
||||
if (!this._loginManager || !this._loginManager.sessionActive)
|
||||
return;
|
||||
|
||||
global.play_theme_sound(0, 'device-added-media');
|
||||
@ -94,7 +96,7 @@ const AutomountManager = new Lang.Class({
|
||||
_onDriveDisconnected: function() {
|
||||
// if we're not in the current ConsoleKit session,
|
||||
// or screensaver is active, don't play sounds
|
||||
if (!this._loginManager.sessionActive)
|
||||
if (!this._loginManager || !this._loginManager.sessionActive)
|
||||
return;
|
||||
|
||||
global.play_theme_sound(0, 'device-removed-media');
|
||||
@ -103,7 +105,7 @@ const AutomountManager = new Lang.Class({
|
||||
_onDriveEjectButton: function(monitor, drive) {
|
||||
// TODO: this code path is not tested, as the GVfs volume monitor
|
||||
// doesn't emit this signal just yet.
|
||||
if (!this._loginManager.sessionActive)
|
||||
if (!this._loginManager || !this._loginManager.sessionActive)
|
||||
return;
|
||||
|
||||
// we force stop/eject in this case, so we don't have to pass a
|
||||
@ -143,7 +145,7 @@ const AutomountManager = new Lang.Class({
|
||||
if (params.checkSession) {
|
||||
// if we're not in the current ConsoleKit session,
|
||||
// don't attempt automount
|
||||
if (!this._loginManager.sessionActive)
|
||||
if (!this._loginManager || !this._loginManager.sessionActive)
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
const Lang = imports.lang;
|
||||
const Gio = imports.gi.Gio;
|
||||
const GLib = imports.gi.GLib;
|
||||
const St = imports.gi.St;
|
||||
|
||||
const LoginManager = imports.misc.loginManager;
|
||||
@ -82,12 +83,16 @@ const HotplugSnifferIface = <interface name="org.gnome.Shell.HotplugSniffer">
|
||||
</method>
|
||||
</interface>;
|
||||
|
||||
const HotplugSnifferProxy = Gio.DBusProxy.makeProxyWrapper(HotplugSnifferIface);
|
||||
function HotplugSniffer() {
|
||||
return new HotplugSnifferProxy(Gio.DBus.session,
|
||||
'org.gnome.Shell.HotplugSniffer',
|
||||
'/org/gnome/Shell/HotplugSniffer');
|
||||
}
|
||||
const HotplugSniffer = new Gio.DBusProxyClass({
|
||||
Name: 'HotplugSnifferProxy',
|
||||
Interface: HotplugSnifferIface,
|
||||
|
||||
_init: function() {
|
||||
this.parent({ g_bus_type: Gio.BusType.SESSION,
|
||||
g_name: 'org.gnome.Shell.HotplugSniffer',
|
||||
g_object_path: '/org/gnome/Shell/HotplugSniffer' });
|
||||
}
|
||||
});
|
||||
|
||||
const ContentTypeDiscoverer = new Lang.Class({
|
||||
Name: 'ContentTypeDiscoverer',
|
||||
@ -127,10 +132,14 @@ const ContentTypeDiscoverer = new Lang.Class({
|
||||
let root = mount.get_root();
|
||||
|
||||
let hotplugSniffer = new HotplugSniffer();
|
||||
hotplugSniffer.SniffURIRemote(root.get_uri(),
|
||||
Lang.bind(this, function([contentTypes]) {
|
||||
this._emitCallback(mount, contentTypes);
|
||||
}));
|
||||
hotplugSniffer.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(proxy, result) {
|
||||
proxy.init_finish(result);
|
||||
|
||||
proxy.SniffURIRemote(root.get_uri(), null, Lang.bind(this, function(proxy, result) {
|
||||
let [contentTypes] = proxy.SniffURIFinish(result);
|
||||
this._emitCallback(mount, contentTypes);
|
||||
}));
|
||||
}));
|
||||
}
|
||||
},
|
||||
|
||||
@ -162,7 +171,9 @@ const AutorunManager = new Lang.Class({
|
||||
Name: 'AutorunManager',
|
||||
|
||||
_init: function() {
|
||||
this._loginManager = LoginManager.getLoginManager();
|
||||
LoginManager.getLoginManager(Lang.bind(this, function(manager) {
|
||||
this._loginManager = manager;
|
||||
}));
|
||||
|
||||
this._volumeMonitor = Gio.VolumeMonitor.get();
|
||||
|
||||
@ -215,7 +226,7 @@ const AutorunManager = new Lang.Class({
|
||||
_onMountAdded: function(monitor, mount) {
|
||||
// don't do anything if our session is not the currently
|
||||
// active one
|
||||
if (!this._loginManager.sessionActive)
|
||||
if (!this._loginManager || !this._loginManager.sessionActive)
|
||||
return;
|
||||
|
||||
this._processMount(mount, true);
|
||||
|
@ -408,7 +408,10 @@ const VPNRequestHandler = new Lang.Class({
|
||||
}
|
||||
},
|
||||
|
||||
cancel: function() {
|
||||
cancel: function(respond) {
|
||||
if (respond)
|
||||
this._agent.respond(this._requestId, Shell.NetworkAgentResponse.USER_CANCELED);
|
||||
|
||||
if (this._newStylePlugin && this._shellDialog) {
|
||||
this._shellDialog.close(global.get_current_time());
|
||||
this._shellDialog.destroy();
|
||||
@ -599,6 +602,16 @@ const NetworkAgent = new Lang.Class({
|
||||
},
|
||||
|
||||
disable: function() {
|
||||
let requestId;
|
||||
|
||||
for (requestId in this._dialogs)
|
||||
this._dialogs[requestId].cancel();
|
||||
this._dialogs = { };
|
||||
|
||||
for (requestId in this._vpnRequests)
|
||||
this._vpnRequests[requestId].cancel(true);
|
||||
this._vpnRequests = { };
|
||||
|
||||
this._native.unregister();
|
||||
},
|
||||
|
||||
@ -622,7 +635,7 @@ const NetworkAgent = new Lang.Class({
|
||||
this._dialogs[requestId].destroy();
|
||||
delete this._dialogs[requestId];
|
||||
} else if (this._vpnRequests[requestId]) {
|
||||
this._vpnRequests[requestId].cancel();
|
||||
this._vpnRequests[requestId].cancel(false);
|
||||
delete this._vpnRequests[requestId];
|
||||
}
|
||||
},
|
||||
|
@ -41,7 +41,7 @@ const Recorder = new Lang.Class({
|
||||
recorder.set_framerate(this._recorderSettings.get_int('framerate'));
|
||||
/* Translators: this is a filename used for screencast recording */
|
||||
// xgettext:no-c-format
|
||||
recorder.set_filename(_("Screencast from %d %t") + '.' + this._recorderSettings.get_string('file-extension'));
|
||||
recorder.set_file_template(_("Screencast from %d %t") + '.' + this._recorderSettings.get_string('file-extension'));
|
||||
let pipeline = this._recorderSettings.get_string('pipeline');
|
||||
|
||||
if (!pipeline.match(/^\s*$/))
|
||||
|
@ -105,7 +105,7 @@ const restartDialogContent = {
|
||||
endDescription: _("Restarting the system."),
|
||||
confirmButtons: [{ signal: 'ConfirmedReboot',
|
||||
label: C_("button", "Restart") }],
|
||||
iconName: 'system-shutdown-symbolic',
|
||||
iconName: 'view-refresh-symbolic',
|
||||
iconStyleClass: 'end-session-dialog-shutdown-icon'
|
||||
};
|
||||
|
||||
@ -218,6 +218,34 @@ function init() {
|
||||
_endSessionDialog = new EndSessionDialog();
|
||||
}
|
||||
|
||||
const EndSessionExporter = new Gio.DBusImplementerClass({
|
||||
Name: 'EndSessionExporter',
|
||||
Interface: EndSessionDialogIface,
|
||||
|
||||
_init: function() {
|
||||
this.parent();
|
||||
|
||||
this.export(Gio.DBus.session, '/org/gnome/SessionManager/EndSessionDialog');
|
||||
},
|
||||
|
||||
OpenAsync: function(parameters, invocation) {
|
||||
this.emit('open', parameters, invocation);
|
||||
},
|
||||
|
||||
close: function() {
|
||||
this.emit_signal('Closed');
|
||||
},
|
||||
|
||||
cancel: function() {
|
||||
this.emit_signal('Canceled');
|
||||
},
|
||||
|
||||
confirm: function(type) {
|
||||
this.emit_signal(type);
|
||||
},
|
||||
});
|
||||
Signals.addSignalMethods(EndSessionExporter.prototype);
|
||||
|
||||
const EndSessionDialog = new Lang.Class({
|
||||
Name: 'EndSessionDialog',
|
||||
Extends: ModalDialog.ModalDialog,
|
||||
@ -295,8 +323,8 @@ const EndSessionDialog = new Lang.Class({
|
||||
scrollView.hide();
|
||||
}));
|
||||
|
||||
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(EndSessionDialogIface, this);
|
||||
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/SessionManager/EndSessionDialog');
|
||||
this._exporter = new EndSessionExporter();
|
||||
this._exporter.connect('open', Lang.bind(this, this._onOpenRequest));
|
||||
},
|
||||
|
||||
_onDestroy: function() {
|
||||
@ -387,19 +415,19 @@ const EndSessionDialog = new Lang.Class({
|
||||
|
||||
close: function() {
|
||||
this.parent();
|
||||
this._dbusImpl.emit_signal('Closed', null);
|
||||
this._exporter.close();
|
||||
},
|
||||
|
||||
cancel: function() {
|
||||
this._stopTimer();
|
||||
this._dbusImpl.emit_signal('Canceled', null);
|
||||
this._exporter.cancel();
|
||||
this.close(global.get_current_time());
|
||||
},
|
||||
|
||||
_confirm: function(signal) {
|
||||
this._fadeOutDialog();
|
||||
this._stopTimer();
|
||||
this._dbusImpl.emit_signal(signal, null);
|
||||
this._exporter.confirm(signal);
|
||||
},
|
||||
|
||||
_onOpened: function() {
|
||||
@ -452,7 +480,7 @@ const EndSessionDialog = new Lang.Class({
|
||||
this._updateContent();
|
||||
},
|
||||
|
||||
OpenAsync: function(parameters, invocation) {
|
||||
_onOpenRequest: function(exporter, parameters, invocation) {
|
||||
let [type, timestamp, totalSecondsToStayOpen, inhibitorObjectPaths] = parameters;
|
||||
this._totalSecondsToStayOpen = totalSecondsToStayOpen;
|
||||
this._inhibitors = [];
|
||||
@ -466,7 +494,10 @@ const EndSessionDialog = new Lang.Class({
|
||||
}
|
||||
|
||||
for (let i = 0; i < inhibitorObjectPaths.length; i++) {
|
||||
let inhibitor = new GnomeSession.Inhibitor(inhibitorObjectPaths[i], Lang.bind(this, function(proxy, error) {
|
||||
let inhibitor = new GnomeSession.Inhibitor(inhibitorObjectPaths[i]);
|
||||
inhibitor.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(proxy, result) {
|
||||
proxy.init_finish(result);
|
||||
|
||||
this._onInhibitorLoaded(proxy);
|
||||
}));
|
||||
|
||||
|
@ -2,7 +2,6 @@
|
||||
|
||||
const Caribou = imports.gi.Caribou;
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const DBus = imports.dbus;
|
||||
const Gdk = imports.gi.Gdk;
|
||||
const Gio = imports.gi.Gio;
|
||||
const GLib = imports.gi.GLib;
|
||||
@ -191,13 +190,14 @@ const Key = new Lang.Class({
|
||||
}
|
||||
});
|
||||
|
||||
const Keyboard = new Lang.Class({
|
||||
const Keyboard = new Gio.DBusImplementerClass({
|
||||
// HACK: we can't set Name, because it collides with Name dbus property
|
||||
// Name: 'Keyboard',
|
||||
Interface: CaribouKeyboardIface,
|
||||
|
||||
_init: function () {
|
||||
this._impl = Gio.DBusExportedObject.wrapJSObject(CaribouKeyboardIface, this);
|
||||
this._impl.export(Gio.DBus.session, '/org/gnome/Caribou/Keyboard');
|
||||
this.parent();
|
||||
this.export(Gio.DBus.session, '/org/gnome/Caribou/Keyboard');
|
||||
|
||||
this.actor = null;
|
||||
this._focusInTray = false;
|
||||
|
@ -104,7 +104,7 @@ const LayoutManager = new Lang.Class({
|
||||
this.primaryMonitor = null;
|
||||
this.primaryIndex = -1;
|
||||
this._hotCorners = [];
|
||||
this._rootPixmap = null;
|
||||
this._background = null;
|
||||
this._leftPanelBarrier = 0;
|
||||
this._rightPanelBarrier = 0;
|
||||
this._trayBarrier = 0;
|
||||
@ -333,30 +333,30 @@ const LayoutManager = new Lang.Class({
|
||||
// to the greeter. Otherwise, we'll just animate the panel,
|
||||
// as usual.
|
||||
if (Main.sessionMode.isGreeter) {
|
||||
this._rootPixmap = global.create_xrootpmap_texture();
|
||||
if (this._rootPixmap != null) {
|
||||
Main.uiGroup.add_actor(this._rootPixmap);
|
||||
Tweener.addTween(this._rootPixmap,
|
||||
this._background = Meta.BackgroundActor.new_for_screen(global.screen);
|
||||
if (this._background != null) {
|
||||
Main.uiGroup.add_actor(this._background);
|
||||
Tweener.addTween(this._background,
|
||||
{ opacity: 0,
|
||||
time: PLYMOUTH_TRANSITION_TIME,
|
||||
transition: 'linear',
|
||||
onComplete: this._fadeRootpmapComplete,
|
||||
onComplete: this._fadeBackgroundComplete,
|
||||
onCompleteScope: this });
|
||||
plymouthTransitionRunning = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!plymouthTransitionRunning)
|
||||
this._fadeRootpmapComplete();
|
||||
this._fadeBackgroundComplete();
|
||||
},
|
||||
|
||||
_fadeRootpmapComplete: function() {
|
||||
_fadeBackgroundComplete: function() {
|
||||
// Don't animate the strut
|
||||
this._chrome.freezeUpdateRegions();
|
||||
|
||||
if (this._rootPixmap != null) {
|
||||
this._rootPixmap.destroy();
|
||||
this._rootPixmap = null;
|
||||
if (this._background != null) {
|
||||
this._background.destroy();
|
||||
this._background = null;
|
||||
}
|
||||
|
||||
Tweener.addTween(this.panelBox,
|
||||
|
@ -96,14 +96,15 @@ const ZoomRegionIface = <interface name={ZOOM_SERVICE_NAME}>
|
||||
// '/org/gnome/Magnifier/ZoomRegion/zoomer1', etc.
|
||||
let _zoomRegionInstanceCount = 0;
|
||||
|
||||
const ShellMagnifier = new Lang.Class({
|
||||
const ShellMagnifier = new Gio.DBusImplementerClass({
|
||||
Name: 'ShellMagnifier',
|
||||
Interface: MagnifierIface,
|
||||
|
||||
_init: function() {
|
||||
this._zoomers = {};
|
||||
this.parent();
|
||||
this.export(Gio.DBus.session, MAG_SERVICE_PATH);
|
||||
|
||||
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(MagnifierIface, this);
|
||||
this._dbusImpl.export(Gio.DBus.session, MAG_SERVICE_PATH);
|
||||
this._zoomers = {};
|
||||
},
|
||||
|
||||
/**
|
||||
@ -332,14 +333,15 @@ const ShellMagnifier = new Lang.Class({
|
||||
* @zoomerObjectPath: String that is the path to a DBus ZoomRegion.
|
||||
* @zoomRegion: The actual zoom region associated with the object path.
|
||||
*/
|
||||
const ShellMagnifierZoomRegion = new Lang.Class({
|
||||
const ShellMagnifierZoomRegion = new Gio.DBusImplementerClass({
|
||||
Name: 'ShellMagnifierZoomRegion',
|
||||
Interface: ZoomRegionIface,
|
||||
|
||||
_init: function(zoomerObjectPath, zoomRegion) {
|
||||
this._zoomRegion = zoomRegion;
|
||||
this.parent();
|
||||
this.export(Gio.DBus.session, zoomerObjectPath);
|
||||
|
||||
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ZoomRegionIface, this);
|
||||
this._dbusImpl.export(Gio.DBus.session, zoomerObjectPath);
|
||||
this._zoomRegion = zoomRegion;
|
||||
},
|
||||
|
||||
/**
|
||||
@ -417,6 +419,6 @@ const ShellMagnifierZoomRegion = new Lang.Class({
|
||||
},
|
||||
|
||||
destroy: function() {
|
||||
this._dbusImpl.unexport();
|
||||
this.unexport();
|
||||
}
|
||||
});
|
||||
|
@ -1237,12 +1237,6 @@ const SummaryItem = new Lang.Class({
|
||||
|
||||
this.notificationStackWidget = new St.Widget({ layout_manager: new Clutter.BinLayout() });
|
||||
|
||||
this._closeButton = makeCloseButton();
|
||||
this._closeButton.connect('clicked', Lang.bind(this, function() {
|
||||
source.destroy();
|
||||
source.emit('done-displaying-content');
|
||||
}));
|
||||
|
||||
this.notificationStackView = new St.ScrollView({ style_class: source.isChat ? '' : 'summary-notification-stack-scrollview',
|
||||
vscrollbar_policy: source.isChat ? Gtk.PolicyType.NEVER : Gtk.PolicyType.AUTOMATIC,
|
||||
hscrollbar_policy: Gtk.PolicyType.NEVER });
|
||||
@ -1251,7 +1245,9 @@ const SummaryItem = new Lang.Class({
|
||||
vertical: true });
|
||||
this.notificationStackView.add_actor(this.notificationStack);
|
||||
this.notificationStackWidget.add_actor(this.notificationStackView);
|
||||
this.notificationStackWidget.add_actor(this._closeButton);
|
||||
|
||||
this.closeButton = makeCloseButton();
|
||||
this.notificationStackWidget.add_actor(this.closeButton);
|
||||
this._stackedNotifications = [];
|
||||
|
||||
this._oldMaxScrollAdjustment = 0;
|
||||
@ -1268,14 +1264,6 @@ 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;
|
||||
},
|
||||
|
||||
_onKeyPress: function(actor, event) {
|
||||
if (event.get_key_symbol() == Clutter.KEY_Up) {
|
||||
actor.emit('clicked', 1);
|
||||
@ -1377,13 +1365,16 @@ const MessageTray = new Lang.Class({
|
||||
Name: 'MessageTray',
|
||||
|
||||
_init: function() {
|
||||
this._presence = new GnomeSession.Presence(Lang.bind(this, function(proxy, error) {
|
||||
this._presence = new GnomeSession.Presence();
|
||||
this._presence.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(proxy, result) {
|
||||
proxy.init_finish(result);
|
||||
|
||||
this._onStatusChanged(proxy.status);
|
||||
this._presence.connectSignal('StatusChanged', Lang.bind(this, function(proxy, senderName, [status]) {
|
||||
this._onStatusChanged(status);
|
||||
}));
|
||||
}));
|
||||
this._busy = false;
|
||||
this._presence.connectSignal('StatusChanged', Lang.bind(this, function(proxy, senderName, [status]) {
|
||||
this._onStatusChanged(status);
|
||||
}));
|
||||
|
||||
this.actor = new St.Widget({ name: 'message-tray',
|
||||
reactive: true,
|
||||
@ -1603,12 +1594,9 @@ const MessageTray = new Lang.Class({
|
||||
|
||||
_onCloseClicked: function() {
|
||||
if (this._notificationState == State.SHOWN) {
|
||||
this._closeButton.hide();
|
||||
this._notificationClosed = true;
|
||||
this._notification.emit('done-displaying');
|
||||
|
||||
if (!this._notification.resident)
|
||||
this._notification.destroy();
|
||||
|
||||
this._updateState();
|
||||
this._notificationClosed = false;
|
||||
}
|
||||
},
|
||||
@ -2101,9 +2089,8 @@ const MessageTray = new Lang.Class({
|
||||
transition: 'easeOutQuad'
|
||||
});
|
||||
|
||||
if (this._overviewVisible) {
|
||||
if (!this._overviewVisible)
|
||||
this._lightbox.show();
|
||||
}
|
||||
|
||||
return true;
|
||||
},
|
||||
@ -2141,6 +2128,10 @@ const MessageTray = new Lang.Class({
|
||||
},
|
||||
|
||||
_hideTray: function() {
|
||||
// Having the summary item animate out while sliding down the tray
|
||||
// is distracting, so hide it immediately in case it was visible.
|
||||
this._summaryBoxPointer.actor.hide();
|
||||
|
||||
this._tween(this.actor, '_trayState', State.HIDDEN,
|
||||
{ y: 0,
|
||||
time: ANIMATION_TIME,
|
||||
@ -2420,7 +2411,10 @@ const MessageTray = new Lang.Class({
|
||||
this._notificationQueue = newQueue;
|
||||
|
||||
this._summaryBoxPointer.bin.child = this._summaryBoxPointerItem.notificationStackWidget;
|
||||
this._summaryBoxPointerItem.closeButtonVisible = true;
|
||||
|
||||
let closeButton = this._summaryBoxPointerItem.closeButton;
|
||||
closeButton.show();
|
||||
this._summaryBoxPointerCloseClickedId = closeButton.connect('clicked', Lang.bind(this, this._hideSummaryBoxPointer));
|
||||
this._summaryBoxPointerItem.prepareNotificationStackForShowing();
|
||||
} else if (this._clickedSummaryItemMouseButton == 3) {
|
||||
this._summaryBoxPointer.bin.child = this._clickedSummaryItem.rightClickMenu;
|
||||
@ -2530,6 +2524,8 @@ const MessageTray = new Lang.Class({
|
||||
this._summaryBoxPointer.bin.child = null;
|
||||
this._summaryBoxPointerItem.disconnect(this._summaryBoxPointerContentUpdatedId);
|
||||
this._summaryBoxPointerContentUpdatedId = 0;
|
||||
this._summaryBoxPointerItem.closeButton.disconnect(this._summaryBoxPointerCloseClickedId);
|
||||
this._summaryBoxPointerCloseClickedId = 0;
|
||||
this._summaryBoxPointerItem.source.disconnect(this._sourceDoneDisplayingId);
|
||||
this._summaryBoxPointerDoneDisplayingId = 0;
|
||||
|
||||
|
@ -25,10 +25,19 @@ const BusIface = <interface name="org.freedesktop.DBus">
|
||||
</method>
|
||||
</interface>;
|
||||
|
||||
var BusProxy = Gio.DBusProxy.makeProxyWrapper(BusIface);
|
||||
function Bus() {
|
||||
return new BusProxy(Gio.DBus.session, 'org.freedesktop.DBus', '/org/freedesktop/DBus');
|
||||
}
|
||||
const Bus = new Gio.DBusProxyClass({
|
||||
Name: 'SessionBusProxy',
|
||||
Interface: BusIface,
|
||||
|
||||
_init: function() {
|
||||
this.parent({ g_bus_type: Gio.BusType.SESSION,
|
||||
g_name: 'org.freedesktop.DBus',
|
||||
g_object_path: '/org/freedesktop/DBus',
|
||||
g_flags: (Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES |
|
||||
Gio.DBusProxyFlags.DO_NOT_CONNECT_SIGNALS |
|
||||
Gio.DBusProxyFlags.DO_NOT_AUTO_START) });
|
||||
}
|
||||
});
|
||||
|
||||
const NotificationDaemonIface = <interface name="org.freedesktop.Notifications">
|
||||
<method name="Notify">
|
||||
@ -103,17 +112,20 @@ const STANDARD_TRAY_ICON_IMPLEMENTATIONS = {
|
||||
'ibus-ui-gtk': 'keyboard'
|
||||
};
|
||||
|
||||
const NotificationDaemon = new Lang.Class({
|
||||
const NotificationDaemon = new Gio.DBusImplementerClass({
|
||||
Name: 'NotificationDaemon',
|
||||
Interface: NotificationDaemonIface,
|
||||
|
||||
_init: function() {
|
||||
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(NotificationDaemonIface, this);
|
||||
this._dbusImpl.export(Gio.DBus.session, '/org/freedesktop/Notifications');
|
||||
this.parent();
|
||||
this.export(Gio.DBus.session, '/org/freedesktop/Notifications');
|
||||
|
||||
this._sources = [];
|
||||
this._senderToPid = {};
|
||||
this._notifications = {};
|
||||
this._busProxy = new Bus();
|
||||
// This is synchronous but fast because of the flags we use.
|
||||
this._busProxy.init(null);
|
||||
|
||||
this._trayManager = new Shell.TrayManager();
|
||||
this._trayIconAddedId = this._trayManager.connect('tray-icon-added', Lang.bind(this, this._onTrayIconAdded));
|
||||
@ -316,18 +328,20 @@ const NotificationDaemon = new Lang.Class({
|
||||
return invocation.return_value(GLib.Variant.new('(u)', [id]));;
|
||||
}
|
||||
|
||||
this._busProxy.GetConnectionUnixProcessIDRemote(sender, Lang.bind(this, function (result, excp) {
|
||||
this._busProxy.GetConnectionUnixProcessIDRemote(sender, null, Lang.bind(this, function (proxy, result) {
|
||||
// The app may have updated or removed the notification
|
||||
ndata = this._notifications[id];
|
||||
if (!ndata)
|
||||
return;
|
||||
|
||||
if (excp) {
|
||||
|
||||
let pid;
|
||||
try {
|
||||
[pid] = proxy.GetConnectionUnixProcessIDFinish(result);
|
||||
} catch(excp) {
|
||||
logError(excp, 'Call to GetConnectionUnixProcessID failed');
|
||||
return;
|
||||
}
|
||||
|
||||
let [pid] = result;
|
||||
source = this._getSource(appName, pid, ndata, sender, null);
|
||||
|
||||
// We only store sender-pid entries for persistent sources.
|
||||
@ -487,13 +501,11 @@ const NotificationDaemon = new Lang.Class({
|
||||
},
|
||||
|
||||
_emitNotificationClosed: function(id, reason) {
|
||||
this._dbusImpl.emit_signal('NotificationClosed',
|
||||
GLib.Variant.new('(uu)', [id, reason]));
|
||||
this.emit_signal('NotificationClosed', id, reason);
|
||||
},
|
||||
|
||||
_emitActionInvoked: function(id, action) {
|
||||
this._dbusImpl.emit_signal('ActionInvoked',
|
||||
GLib.Variant.new('(us)', [id, action]));
|
||||
this.emit_signal('ActionInvoked', id, action);
|
||||
},
|
||||
|
||||
_onTrayIconAdded: function(o, icon) {
|
||||
|
@ -247,6 +247,10 @@ const AppMenuButton = new Lang.Class({
|
||||
this._container.connect('get-preferred-height', Lang.bind(this, this._getContentPreferredHeight));
|
||||
this._container.connect('allocate', Lang.bind(this, this._contentAllocate));
|
||||
|
||||
let textureCache = St.TextureCache.get_default();
|
||||
textureCache.connect('icon-theme-changed',
|
||||
Lang.bind(this, this._onIconThemeChanged));
|
||||
|
||||
this._iconBox = new Shell.Slicer({ name: 'appMenuIcon' });
|
||||
this._iconBox.connect('style-changed',
|
||||
Lang.bind(this, this._onIconBoxStyleChanged));
|
||||
@ -332,6 +336,15 @@ const AppMenuButton = new Lang.Class({
|
||||
this._updateIconBoxClip();
|
||||
},
|
||||
|
||||
_onIconThemeChanged: function() {
|
||||
if (this._iconBox.child == null)
|
||||
return;
|
||||
|
||||
this._iconBox.child.destroy();
|
||||
let icon = this._targetApp.get_faded_icon(2 * PANEL_ICON_SIZE);
|
||||
this._iconBox.set_child(icon);
|
||||
},
|
||||
|
||||
_updateIconBoxClip: function() {
|
||||
let allocation = this._iconBox.allocation;
|
||||
if (this._iconBottomClip > 0)
|
||||
@ -901,6 +914,7 @@ const PANEL_ITEM_IMPLEMENTATIONS = {
|
||||
'volume': imports.ui.status.volume.Indicator,
|
||||
'battery': imports.ui.status.power.Indicator,
|
||||
'lockScreen': imports.ui.status.lockScreenMenu.Indicator,
|
||||
'logo': imports.gdm.loginDialog.LogoMenuButton,
|
||||
'keyboard': imports.ui.status.keyboard.InputSourceIndicator,
|
||||
'powerMenu': imports.gdm.powerMenu.PowerMenuButton,
|
||||
'userMenu': imports.ui.userMenu.UserMenuButton
|
||||
|
@ -214,7 +214,8 @@ const Button = new Lang.Class({
|
||||
destroy: function() {
|
||||
this.actor._delegate = null;
|
||||
|
||||
this.menu.destroy();
|
||||
if (this.menu)
|
||||
this.menu.destroy();
|
||||
this.actor.destroy();
|
||||
|
||||
this.emit('destroy');
|
||||
|
@ -1269,13 +1269,14 @@ const PopupMenu = new Lang.Class({
|
||||
},
|
||||
|
||||
close: function(animate) {
|
||||
if (!this.isOpen)
|
||||
return;
|
||||
|
||||
if (this._activeMenuItem)
|
||||
this._activeMenuItem.setActive(false);
|
||||
|
||||
this._boxPointer.hide(animate);
|
||||
if (this._boxPointer.actor.visible)
|
||||
this._boxPointer.hide(animate);
|
||||
|
||||
if (!this.isOpen)
|
||||
return;
|
||||
|
||||
this.isOpen = false;
|
||||
this.emit('open-state-changed', false);
|
||||
|
@ -29,8 +29,15 @@ const SearchProviderIface = <interface name="org.gnome.Shell.SearchProvider">
|
||||
</method>
|
||||
</interface>;
|
||||
|
||||
var SearchProviderProxy = Gio.DBusProxy.makeProxyWrapper(SearchProviderIface);
|
||||
var SearchProviderProxy = new Gio.DBusProxyClass({
|
||||
Name: 'SearchProviderProxy',
|
||||
Interface: SearchProviderIface,
|
||||
|
||||
_init: function(params) {
|
||||
params.g_bus_type = Gio.BusType.SESSION;
|
||||
this.parent(params);
|
||||
}
|
||||
});
|
||||
|
||||
function loadRemoteSearchProviders(addProviderCallback) {
|
||||
let dataDirs = GLib.get_system_data_dirs();
|
||||
@ -90,13 +97,22 @@ function loadRemoteSearchProvidersFromDir(dir, loadedProviders, addProviderCallb
|
||||
icon,
|
||||
busName,
|
||||
objectPath);
|
||||
remoteProvider.initAsync(null, function(obj, result) {
|
||||
try {
|
||||
remoteProvider.initFinish(result);
|
||||
} catch(e) {
|
||||
log('Failed to add search provider "%s": %s'.format(title, e.toString()));
|
||||
return;
|
||||
}
|
||||
|
||||
addProviderCallback(remoteProvider);
|
||||
});
|
||||
|
||||
loadedProviders[objectPath] = remoteProvider;
|
||||
} catch(e) {
|
||||
log('Failed to add search provider "%s": %s'.format(title, e.toString()));
|
||||
continue;
|
||||
}
|
||||
|
||||
addProviderCallback(remoteProvider);
|
||||
}
|
||||
}));
|
||||
|
||||
@ -107,13 +123,41 @@ const RemoteSearchProvider = new Lang.Class({
|
||||
Extends: Search.SearchProvider,
|
||||
|
||||
_init: function(title, icon, dbusName, dbusPath) {
|
||||
this._proxy = new SearchProviderProxy(Gio.DBus.session,
|
||||
dbusName, dbusPath);
|
||||
|
||||
this.parent(title.toUpperCase());
|
||||
|
||||
this._proxy = new SearchProviderProxy({ g_name: dbusName,
|
||||
g_object_path: dbusPath });
|
||||
this._cancellable = new Gio.Cancellable();
|
||||
},
|
||||
|
||||
initAsync: function(cancellable, asyncCallback) {
|
||||
// Can't pass "this" as source object, because RemoteSearchProvider
|
||||
// is not a GObject.Object (and in gjs you can't inherit from a JS
|
||||
// type that in turn inherits from GObject)
|
||||
|
||||
let simpleResult = Gio.SimpleAsyncResult.new(null, asyncCallback, null);
|
||||
simpleResult.set_check_cancellable(cancellable);
|
||||
|
||||
this._proxy.init_async(GLib.PRIORITY_DEFAULT, cancellable, Lang.bind(this, function(proxy, result) {
|
||||
try {
|
||||
proxy.init_finish(result);
|
||||
|
||||
simpleResult.set_op_res_gboolean(true);
|
||||
} catch(e if e instanceof GLib.Error) {
|
||||
simpleResult.set_from_error(e);
|
||||
}
|
||||
|
||||
simpleResult.complete();
|
||||
}));
|
||||
},
|
||||
|
||||
initFinish: function(simpleResult) {
|
||||
if (!simpleResult.propagate_error())
|
||||
return simpleResult.get_op_res_gboolean();
|
||||
|
||||
return false;
|
||||
},
|
||||
|
||||
createIcon: function(size, meta) {
|
||||
if (meta['gicon']) {
|
||||
return new St.Icon({ gicon: Gio.icon_new_for_string(meta['gicon']),
|
||||
@ -131,10 +175,17 @@ const RemoteSearchProvider = new Lang.Class({
|
||||
icon_size: size });
|
||||
},
|
||||
|
||||
_getResultsFinished: function(results, error) {
|
||||
if (error)
|
||||
return;
|
||||
this.searchSystem.pushResults(this, results[0]);
|
||||
_getResultsFinished: function(proxy, result) {
|
||||
try {
|
||||
// We rely on a small implementation detail of the
|
||||
// GDBus bindings here: all *Finish are equal
|
||||
|
||||
let [results] = proxy.GetInitialResultSetFinish(result);
|
||||
this.searchSystem.pushResults(this, results);
|
||||
} catch(e) {
|
||||
if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
|
||||
log('Received error from search provider %s: %s'.format(this.title, String(e)));
|
||||
}
|
||||
},
|
||||
|
||||
getInitialResultSet: function(terms) {
|
||||
@ -142,8 +193,8 @@ const RemoteSearchProvider = new Lang.Class({
|
||||
this._cancellable.reset();
|
||||
try {
|
||||
this._proxy.GetInitialResultSetRemote(terms,
|
||||
Lang.bind(this, this._getResultsFinished),
|
||||
this._cancellable);
|
||||
this._cancellable,
|
||||
Lang.bind(this, this._getResultsFinished));
|
||||
} catch(e) {
|
||||
log('Error calling GetInitialResultSet for provider %s: %s'.format( this.title, e.toString()));
|
||||
this.searchSystem.pushResults(this, []);
|
||||
@ -155,30 +206,30 @@ const RemoteSearchProvider = new Lang.Class({
|
||||
this._cancellable.reset();
|
||||
try {
|
||||
this._proxy.GetSubsearchResultSetRemote(previousResults, newTerms,
|
||||
Lang.bind(this, this._getResultsFinished),
|
||||
this._cancellable);
|
||||
this._cancellable,
|
||||
Lang.bind(this, this._getResultsFinished))
|
||||
} catch(e) {
|
||||
log('Error calling GetSubsearchResultSet for provider %s: %s'.format(this.title, e.toString()));
|
||||
this.searchSystem.pushResults(this, []);
|
||||
}
|
||||
},
|
||||
|
||||
_getResultMetasFinished: function(results, error, callback) {
|
||||
if (error) {
|
||||
_getResultMetasFinished: function(proxy, result, callback) {
|
||||
try {
|
||||
let [metas] = results.GetResultMetasFinish(result);
|
||||
let resultMetas = [];
|
||||
for (let i = 0; i < metas.length; i++) {
|
||||
for (let prop in metas[i])
|
||||
metas[i][prop] = metas[i][prop].deep_unpack();
|
||||
resultMetas.push({ id: metas[i]['id'],
|
||||
name: metas[i]['name'],
|
||||
createIcon: Lang.bind(this,
|
||||
this.createIcon, metas[i]) });
|
||||
}
|
||||
callback(resultMetas);
|
||||
} catch(e) {
|
||||
callback([]);
|
||||
return;
|
||||
}
|
||||
let metas = results[0];
|
||||
let resultMetas = [];
|
||||
for (let i = 0; i < metas.length; i++) {
|
||||
for (let prop in metas[i])
|
||||
metas[i][prop] = metas[i][prop].deep_unpack();
|
||||
resultMetas.push({ id: metas[i]['id'],
|
||||
name: metas[i]['name'],
|
||||
createIcon: Lang.bind(this,
|
||||
this.createIcon, metas[i]) });
|
||||
}
|
||||
callback(resultMetas);
|
||||
},
|
||||
|
||||
getResultMetas: function(ids, callback) {
|
||||
@ -186,8 +237,8 @@ const RemoteSearchProvider = new Lang.Class({
|
||||
this._cancellable.reset();
|
||||
try {
|
||||
this._proxy.GetResultMetasRemote(ids,
|
||||
Lang.bind(this, this._getResultMetasFinished, callback),
|
||||
this._cancellable);
|
||||
this._cancellable,
|
||||
Lang.bind(this, this._getResultMetasFinished, callback));
|
||||
} catch(e) {
|
||||
log('Error calling GetResultMetas for provider %s: %s'.format(this.title, e.toString()));
|
||||
callback([]);
|
||||
@ -195,7 +246,7 @@ const RemoteSearchProvider = new Lang.Class({
|
||||
},
|
||||
|
||||
activateResult: function(id) {
|
||||
this._proxy.ActivateResultRemote(id);
|
||||
this._proxy.ActivateResultRemote(id, null, null);
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -202,11 +202,12 @@ const RunDialog = new Lang.Class({
|
||||
|
||||
|
||||
let label = new St.Label({ style_class: 'run-dialog-label',
|
||||
text: _("Please enter a command:") });
|
||||
text: _("Enter a Command") });
|
||||
|
||||
this.contentLayout.add(label, { y_align: St.Align.START });
|
||||
|
||||
let entry = new St.Entry({ style_class: 'run-dialog-entry' });
|
||||
let entry = new St.Entry({ style_class: 'run-dialog-entry',
|
||||
can_focus: true });
|
||||
ShellEntry.addContextMenu(entry);
|
||||
|
||||
entry.label_actor = label;
|
||||
@ -236,6 +237,10 @@ const RunDialog = new Lang.Class({
|
||||
|
||||
this._errorBox.hide();
|
||||
|
||||
this.setButtons([{ action: Lang.bind(this, this.close),
|
||||
label: _("Close"),
|
||||
key: Clutter.Escape }]);
|
||||
|
||||
this._pathCompleter = new Gio.FilenameCompleter();
|
||||
this._commandCompleter = new CommandCompleter();
|
||||
this._group.connect('notify::visible', Lang.bind(this._commandCompleter, this._commandCompleter.update));
|
||||
@ -246,20 +251,12 @@ const RunDialog = new Lang.Class({
|
||||
let symbol = e.get_key_symbol();
|
||||
if (symbol == Clutter.Return || symbol == Clutter.KP_Enter) {
|
||||
this.popModal();
|
||||
if (e.get_state() & Clutter.ModifierType.CONTROL_MASK)
|
||||
this._run(o.get_text(), true);
|
||||
else
|
||||
this._run(o.get_text(), false);
|
||||
if (!this._commandError)
|
||||
this._run(o.get_text(),
|
||||
e.get_state() & Clutter.ModifierType.CONTROL_MASK);
|
||||
if (!this._commandError ||
|
||||
!this.pushModal())
|
||||
this.close();
|
||||
else {
|
||||
if (!this.pushModal())
|
||||
this.close();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
if (symbol == Clutter.Escape) {
|
||||
this.close();
|
||||
|
||||
return true;
|
||||
}
|
||||
if (symbol == Clutter.slash) {
|
||||
|
@ -26,7 +26,7 @@ const Util = imports.misc.util;
|
||||
const SCREENSAVER_SCHEMA = 'org.gnome.desktop.screensaver';
|
||||
const LOCK_ENABLED_KEY = 'lock-enabled';
|
||||
|
||||
const CURTAIN_SLIDE_TIME = 0.5;
|
||||
const CURTAIN_SLIDE_TIME = 0.3;
|
||||
// fraction of screen height the arrow must reach before completing
|
||||
// the slide up automatically
|
||||
const ARROW_DRAG_THRESHOLD = 0.1;
|
||||
@ -47,7 +47,7 @@ const SUMMARY_ICON_SIZE = 48;
|
||||
// STANDARD_FADE_TIME is used when the session goes idle, while
|
||||
// SHORT_FADE_TIME is used when requesting lock explicitly from the user menu
|
||||
const STANDARD_FADE_TIME = 10;
|
||||
const SHORT_FADE_TIME = 0.8;
|
||||
const SHORT_FADE_TIME = 0.3;
|
||||
|
||||
const Clock = new Lang.Class({
|
||||
Name: 'ScreenShieldClock',
|
||||
@ -186,7 +186,7 @@ const NotificationsBox = new Lang.Class({
|
||||
|
||||
if (obj.resident) {
|
||||
this._residentNotificationBox.add(item.notificationStackWidget);
|
||||
item.closeButtonVisible = false;
|
||||
item.closeButton.hide();
|
||||
item.prepareNotificationStackForShowing();
|
||||
} else {
|
||||
[obj.sourceBox, obj.countLabel] = this._makeNotificationSource(item.source);
|
||||
@ -244,7 +244,7 @@ const NotificationsBox = new Lang.Class({
|
||||
obj.resident = true;
|
||||
|
||||
this._residentNotificationBox.add(obj.item.notificationStackWidget);
|
||||
obj.item.closeButtonVisible = false;
|
||||
obj.item.closeButton.hide();
|
||||
obj.item.prepareNotificationStackForShowing();
|
||||
} else {
|
||||
// just update the counter
|
||||
@ -418,10 +418,11 @@ const ScreenShield = new Lang.Class({
|
||||
|
||||
this._screenSaverDBus = new ShellDBus.ScreenSaverDBus(this);
|
||||
|
||||
this._loginManager = LoginManager.getLoginManager();
|
||||
this._loginSession = this._loginManager.getCurrentSessionProxy();
|
||||
this._loginSession.connectSignal('Lock', Lang.bind(this, function() { this.lock(false); }));
|
||||
this._loginSession.connectSignal('Unlock', Lang.bind(this, function() { this.unlock(); }));
|
||||
LoginManager.getLoginManager(Lang.bind(this, function(manager) {
|
||||
this._loginSession = manager.getCurrentSessionProxy();
|
||||
this._loginSession.connectSignal('Lock', Lang.bind(this, function() { this.lock(false); }));
|
||||
this._loginSession.connectSignal('Unlock', Lang.bind(this, function() { this.unlock(); }));
|
||||
}));
|
||||
|
||||
this._settings = new Gio.Settings({ schema: SCREENSAVER_SCHEMA });
|
||||
|
||||
@ -526,7 +527,7 @@ const ScreenShield = new Lang.Class({
|
||||
Tweener.addTween(this._lockScreenGroup,
|
||||
{ y: 0,
|
||||
time: time,
|
||||
transition: 'linear',
|
||||
transition: 'easeInQuad',
|
||||
onComplete: function() {
|
||||
this._lockScreenGroup.fixed_position_set = false;
|
||||
this._lockScreenState = MessageTray.State.SHOWN;
|
||||
@ -580,14 +581,13 @@ const ScreenShield = new Lang.Class({
|
||||
showDialog: function() {
|
||||
// Ensure that the stage window is mapped, before taking a grab
|
||||
// otherwise X errors out
|
||||
let actorShownId = 0;
|
||||
actorShownId = this.actor.connect('show', Lang.bind(this, function() {
|
||||
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function() {
|
||||
if (!this._isModal) {
|
||||
Main.pushModal(this.actor);
|
||||
this._isModal = true;
|
||||
}
|
||||
|
||||
this.actor.disconnect(actorShownId);
|
||||
return false;
|
||||
}));
|
||||
|
||||
this.actor.show();
|
||||
@ -623,7 +623,7 @@ const ScreenShield = new Lang.Class({
|
||||
Tweener.addTween(this._lockScreenGroup,
|
||||
{ y: -h,
|
||||
time: time,
|
||||
transition: 'linear',
|
||||
transition: 'easeInQuad',
|
||||
onComplete: function() {
|
||||
this._lockScreenState = MessageTray.State.HIDDEN;
|
||||
this._lockScreenGroup.hide();
|
||||
@ -684,7 +684,7 @@ const ScreenShield = new Lang.Class({
|
||||
Tweener.addTween(this._lockScreenGroup,
|
||||
{ y: 0,
|
||||
time: SHORT_FADE_TIME,
|
||||
transition: 'linear',
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: function() {
|
||||
this._lockScreenShown();
|
||||
},
|
||||
@ -876,6 +876,7 @@ const ScreenShieldFallback = new Lang.Class({
|
||||
g_flags: (Gio.DBusProxyFlags.DO_NOT_AUTO_START |
|
||||
Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES),
|
||||
});
|
||||
// This is synchronous but it is the fallback case.
|
||||
this._proxy.init(null);
|
||||
|
||||
this._proxy.connect('g-signal', Lang.bind(this, this._onSignal));
|
||||
|
@ -80,15 +80,23 @@ const PerfHelperIface = <interface name="org.gnome.Shell.PerfHelper">
|
||||
<method name="DestroyWindows" />
|
||||
</interface>;
|
||||
|
||||
var PerfHelperProxy = Gio.DBusProxy.makeProxyWrapper(PerfHelperIface);
|
||||
function PerfHelper() {
|
||||
return new PerfHelperProxy(Gio.DBus.session, 'org.gnome.Shell.PerfHelper', '/org/gnome/Shell/PerfHelper');
|
||||
}
|
||||
const PerfHelper = new Gio.DBusProxyClass({
|
||||
Name: 'PerfHelperProxy',
|
||||
Interface: PerfHelperIface,
|
||||
|
||||
_init: function() {
|
||||
this.parent({ g_bus_type: Gio.BusType.SESSION,
|
||||
g_name: 'org.gnome.Shell.PerfHelper',
|
||||
g_object_path: '/org/gnome/Shell/PerfHelper' });
|
||||
}
|
||||
});
|
||||
|
||||
let _perfHelper = null;
|
||||
function _getPerfHelper() {
|
||||
if (_perfHelper == null)
|
||||
if (_perfHelper == null) {
|
||||
_perfHelper = new PerfHelper();
|
||||
_perfHelper.init(null);
|
||||
}
|
||||
|
||||
return _perfHelper;
|
||||
}
|
||||
@ -111,7 +119,8 @@ function createTestWindow(width, height, alpha, maximized) {
|
||||
let perfHelper = _getPerfHelper();
|
||||
|
||||
perfHelper.CreateWindowRemote(width, height, alpha, maximized,
|
||||
function(result, excp) {
|
||||
null,
|
||||
function(proxy, result) {
|
||||
if (cb)
|
||||
cb();
|
||||
});
|
||||
@ -131,7 +140,7 @@ function waitTestWindows() {
|
||||
let cb;
|
||||
let perfHelper = _getPerfHelper();
|
||||
|
||||
perfHelper.WaitWindowsRemote(function(result, excp) {
|
||||
perfHelper.WaitWindowsRemote(null, function(proxy, result) {
|
||||
if (cb)
|
||||
cb();
|
||||
});
|
||||
@ -154,7 +163,7 @@ function destroyTestWindows() {
|
||||
let cb;
|
||||
let perfHelper = _getPerfHelper();
|
||||
|
||||
perfHelper.DestroyWindowsRemote(function(result, excp) {
|
||||
perfHelper.DestroyWindowsRemote(null, function(proxy, result) {
|
||||
if (cb)
|
||||
cb();
|
||||
});
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
const Gio = imports.gi.Gio;
|
||||
const GLib = imports.gi.GLib;
|
||||
const GObject = imports.gi.GObject;
|
||||
const Lang = imports.lang;
|
||||
const Signals = imports.signals;
|
||||
const Shell = imports.gi.Shell;
|
||||
@ -75,6 +76,8 @@ const SearchProvider = new Lang.Class({
|
||||
Name: 'SearchProvider',
|
||||
|
||||
_init: function(title) {
|
||||
this.parent();
|
||||
|
||||
this.title = title;
|
||||
this.searchSystem = null;
|
||||
},
|
||||
|
@ -39,7 +39,7 @@ const _modes = {
|
||||
unlockDialog: imports.gdm.loginDialog.LoginDialog,
|
||||
components: ['polkitAgent'],
|
||||
panel: {
|
||||
left: [],
|
||||
left: ['logo'],
|
||||
center: ['dateMenu'],
|
||||
right: ['a11y', 'display', 'keyboard',
|
||||
'volume', 'battery', 'powerMenu']
|
||||
|
@ -67,14 +67,16 @@ const ScreenSaverIface = <interface name="org.gnome.ScreenSaver">
|
||||
</signal>
|
||||
</interface>;
|
||||
|
||||
const GnomeShell = new Lang.Class({
|
||||
const GnomeShell = new Gio.DBusImplementerClass({
|
||||
Name: 'GnomeShellDBus',
|
||||
Interface: GnomeShellIface,
|
||||
|
||||
_init: function() {
|
||||
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(GnomeShellIface, this);
|
||||
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell');
|
||||
this.parent();
|
||||
|
||||
this._extensionsSerivce = new GnomeShellExtensions();
|
||||
this.export(Gio.DBus.session, '/org/gnome/Shell');
|
||||
|
||||
this._extensionsService = new GnomeShellExtensions();
|
||||
},
|
||||
|
||||
/**
|
||||
@ -236,12 +238,14 @@ const GnomeShellExtensionsIface = <interface name="org.gnome.Shell.Extensions">
|
||||
<property name="ShellVersion" type="s" access="read" />
|
||||
</interface>;
|
||||
|
||||
const GnomeShellExtensions = new Lang.Class({
|
||||
const GnomeShellExtensions = new Gio.DBusImplementerClass({
|
||||
Name: 'GnomeShellExtensionsDBus',
|
||||
Interface: GnomeShellExtensionsIface,
|
||||
|
||||
_init: function() {
|
||||
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(GnomeShellExtensionsIface, this);
|
||||
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell');
|
||||
this.parent();
|
||||
|
||||
this.export(Gio.DBus.session, '/org/gnome/Shell');
|
||||
ExtensionSystem.connect('extension-state-changed',
|
||||
Lang.bind(this, this._extensionStateChanged));
|
||||
},
|
||||
@ -335,25 +339,23 @@ const GnomeShellExtensions = new Lang.Class({
|
||||
ShellVersion: Config.PACKAGE_VERSION,
|
||||
|
||||
_extensionStateChanged: function(_, newState) {
|
||||
this._dbusImpl.emit_signal('ExtensionStatusChanged',
|
||||
GLib.Variant.new('(sis)', [newState.uuid, newState.state, newState.error]));
|
||||
this.emit_signal('ExtensionStatusChanged', newState.uuid, newState.state, newState.error);
|
||||
}
|
||||
});
|
||||
|
||||
const ScreenSaverDBus = new Lang.Class({
|
||||
const ScreenSaverDBus = new Gio.DBusImplementerClass({
|
||||
Name: 'ScreenSaverDBus',
|
||||
Interface: ScreenSaverIface,
|
||||
|
||||
_init: function(screenShield) {
|
||||
this.parent();
|
||||
|
||||
this._screenShield = screenShield;
|
||||
screenShield.connect('lock-status-changed', Lang.bind(this, function(shield) {
|
||||
this._dbusImpl.emit_signal('ActiveChanged', GLib.Variant.new('(b)', [shield.locked]));
|
||||
this.emit_signal('ActiveChanged', shield.locked);
|
||||
}));
|
||||
|
||||
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ScreenSaverIface, this);
|
||||
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/ScreenSaver');
|
||||
|
||||
this.export(Gio.DBus.session, '/org/gnome/ScreenSaver');
|
||||
Gio.DBus.session.own_name('org.gnome.ScreenSaver', Gio.BusNameOwnerFlags.REPLACE, null, null);
|
||||
},
|
||||
|
||||
|
@ -554,14 +554,16 @@ const ShellMountOperationType = {
|
||||
SHOW_PROCESSES: 3
|
||||
};
|
||||
|
||||
const GnomeShellMountOpHandler = new Lang.Class({
|
||||
const GnomeShellMountOpHandler = new Gio.DBusImplementerClass({
|
||||
Name: 'GnomeShellMountOpHandler',
|
||||
Interface: GnomeShellMountOpIface,
|
||||
|
||||
_init: function() {
|
||||
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(GnomeShellMountOpIface, this);
|
||||
this._dbusImpl.export(Gio.DBus.session, '/org/gtk/MountOperationHandler');
|
||||
Gio.bus_own_name_on_connection(Gio.DBus.session, 'org.gtk.MountOperationHandler',
|
||||
Gio.BusNameOwnerFlags.REPLACE, null, null);
|
||||
this.parent();
|
||||
|
||||
this.export(Gio.DBus.session, '/org/gtk/MountOperationHandler');
|
||||
Gio.DBus.session.own_name('org.gtk.MountOperationHandler',
|
||||
Gio.BusNameOwnerFlags.REPLACE, null, null);
|
||||
|
||||
this._dialog = null;
|
||||
this._volumeMonitor = Gio.VolumeMonitor.get();
|
||||
|
@ -233,20 +233,11 @@ const NMWirelessSectionTitleMenuItem = new Lang.Class({
|
||||
}
|
||||
});
|
||||
|
||||
const NMDevice = new Lang.Class({
|
||||
Name: 'NMDevice',
|
||||
const NMConnectionBased = new Lang.Class({
|
||||
Name: 'NMConnectionBased',
|
||||
Abstract: true,
|
||||
|
||||
_init: function(client, device, connections) {
|
||||
this.device = device;
|
||||
if (device) {
|
||||
this.device._delegate = this;
|
||||
this._stateChangedId = this.device.connect('state-changed', Lang.bind(this, this._deviceStateChanged));
|
||||
} else
|
||||
this._stateChangedId = 0;
|
||||
|
||||
// protected
|
||||
this._client = client;
|
||||
_init: function(connections) {
|
||||
this._connections = [ ];
|
||||
for (let i = 0; i < connections.length; i++) {
|
||||
if (!connections[i].get_uuid())
|
||||
@ -264,26 +255,115 @@ const NMDevice = new Lang.Class({
|
||||
this._connections.push(obj);
|
||||
}
|
||||
this._connections.sort(this._connectionSortFunction);
|
||||
},
|
||||
|
||||
checkConnection: function(connection) {
|
||||
let pos = this._findConnection(connection.get_uuid());
|
||||
let exists = pos != -1;
|
||||
let valid = this.connectionValid(connection);
|
||||
let similar = false;
|
||||
if (exists) {
|
||||
let existing = this._connections[pos];
|
||||
|
||||
// Check if connection changed name or id
|
||||
similar = existing.name == connection.get_id() &&
|
||||
existing.timestamp == connection._timestamp;
|
||||
}
|
||||
|
||||
if (exists && valid && similar) {
|
||||
// Nothing to do
|
||||
return;
|
||||
}
|
||||
|
||||
if (exists)
|
||||
this.removeConnection(connection);
|
||||
if (valid)
|
||||
this.addConnection(connection);
|
||||
},
|
||||
|
||||
addConnection: function(connection) {
|
||||
// record the connection
|
||||
let obj = {
|
||||
connection: connection,
|
||||
name: connection.get_id(),
|
||||
uuid: connection.get_uuid(),
|
||||
timestamp: connection._timestamp,
|
||||
item: null,
|
||||
};
|
||||
Util.insertSorted(this._connections, obj, this._connectionSortFunction);
|
||||
|
||||
this._queueCreateSection();
|
||||
},
|
||||
|
||||
removeConnection: function(connection) {
|
||||
let pos = this._findConnection(connection.get_uuid());
|
||||
if (pos == -1) {
|
||||
// this connection was never added, nothing to do here
|
||||
return;
|
||||
}
|
||||
|
||||
let obj = this._connections[pos];
|
||||
if (obj.item)
|
||||
obj.item.destroy();
|
||||
this._connections.splice(pos, 1);
|
||||
|
||||
if (this._connections.length <= 1) {
|
||||
// We need to show the automatic connection again
|
||||
// (or in the case of NMDeviceWired, we want to hide
|
||||
// the only explicit connection)
|
||||
this._queueCreateSection();
|
||||
}
|
||||
},
|
||||
|
||||
_findConnection: function(uuid) {
|
||||
for (let i = 0; i < this._connections.length; i++) {
|
||||
let obj = this._connections[i];
|
||||
if (obj.uuid == uuid)
|
||||
return i;
|
||||
}
|
||||
return -1;
|
||||
},
|
||||
|
||||
_connectionSortFunction: function(one, two) {
|
||||
if (one.timestamp == two.timestamp)
|
||||
return GLib.utf8_collate(one.name, two.name);
|
||||
|
||||
return two.timestamp - one.timestamp;
|
||||
},
|
||||
});
|
||||
Signals.addSignalMethods(NMConnectionBased.prototype);
|
||||
|
||||
const NMDevice = new Lang.Class({
|
||||
Name: 'NMDevice',
|
||||
Abstract: true,
|
||||
Extends: NMConnectionBased,
|
||||
|
||||
_init: function(client, device, connections) {
|
||||
this.device = device;
|
||||
this.device._delegate = this;
|
||||
this._stateChangedId = this.device.connect('state-changed', Lang.bind(this, this._deviceStateChanged));
|
||||
|
||||
// protected
|
||||
this._client = client;
|
||||
this.parent(connections);
|
||||
this._activeConnection = null;
|
||||
this._activeConnectionItem = null;
|
||||
this._autoConnectionItem = null;
|
||||
this._overflowItem = null;
|
||||
|
||||
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)
|
||||
ok = this.activate();
|
||||
else
|
||||
ok = this.deactivate();
|
||||
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)
|
||||
ok = this.activate();
|
||||
else
|
||||
ok = this.deactivate();
|
||||
|
||||
if (!ok)
|
||||
item.setToggleState(!state);
|
||||
}));
|
||||
if (!ok)
|
||||
item.setToggleState(!state);
|
||||
}));
|
||||
|
||||
this._updateStatusItem();
|
||||
}
|
||||
this._updateStatusItem();
|
||||
this.section = new PopupMenu.PopupMenuSection();
|
||||
|
||||
this._deferredWorkId = Main.initializeDeferredWork(this.section.actor, Lang.bind(this, this._createSection));
|
||||
@ -352,6 +432,10 @@ const NMDevice = new Lang.Class({
|
||||
return this.device.state == NetworkManager.DeviceState.ACTIVATED;
|
||||
},
|
||||
|
||||
clearActiveConnection: function(activeConnection) {
|
||||
this.setActiveConnection(null);
|
||||
},
|
||||
|
||||
setActiveConnection: function(activeConnection) {
|
||||
if (activeConnection == this._activeConnection)
|
||||
// nothing to do
|
||||
@ -369,80 +453,13 @@ const NMDevice = new Lang.Class({
|
||||
this._queueCreateSection();
|
||||
},
|
||||
|
||||
checkConnection: function(connection) {
|
||||
let pos = this._findConnection(connection.get_uuid());
|
||||
let exists = pos != -1;
|
||||
let valid = this.connectionValid(connection);
|
||||
let similar = false;
|
||||
if (exists) {
|
||||
let existing = this._connections[pos];
|
||||
|
||||
// Check if connection changed name or id
|
||||
similar = existing.name == connection.get_id() &&
|
||||
existing.timestamp == connection._timestamp;
|
||||
}
|
||||
|
||||
if (exists && valid && similar) {
|
||||
// Nothing to do
|
||||
return;
|
||||
}
|
||||
|
||||
if (exists)
|
||||
this.removeConnection(connection);
|
||||
if (valid)
|
||||
this.addConnection(connection);
|
||||
},
|
||||
|
||||
addConnection: function(connection) {
|
||||
// record the connection
|
||||
let obj = {
|
||||
connection: connection,
|
||||
name: connection.get_id(),
|
||||
uuid: connection.get_uuid(),
|
||||
timestamp: connection._timestamp,
|
||||
item: null,
|
||||
};
|
||||
Util.insertSorted(this._connections, obj, this._connectionSortFunction);
|
||||
|
||||
this._clearSection();
|
||||
this._queueCreateSection();
|
||||
},
|
||||
|
||||
removeConnection: function(connection) {
|
||||
let pos = this._findConnection(connection.get_uuid());
|
||||
if (pos == -1) {
|
||||
// this connection was never added, nothing to do here
|
||||
return;
|
||||
}
|
||||
|
||||
let obj = this._connections[pos];
|
||||
if (obj.item)
|
||||
obj.item.destroy();
|
||||
this._connections.splice(pos, 1);
|
||||
|
||||
if (this._connections.length <= 1) {
|
||||
// We need to show the automatic connection again
|
||||
// (or in the case of NMDeviceWired, we want to hide
|
||||
// the only explicit connection)
|
||||
this._clearSection();
|
||||
this._queueCreateSection();
|
||||
}
|
||||
},
|
||||
|
||||
connectionValid: function(connection) {
|
||||
return this.device.connection_valid(connection);
|
||||
},
|
||||
|
||||
_connectionSortFunction: function(one, two) {
|
||||
if (one.timestamp == two.timestamp)
|
||||
return GLib.utf8_collate(one.name, two.name);
|
||||
|
||||
return two.timestamp - one.timestamp;
|
||||
},
|
||||
|
||||
setEnabled: function(enabled) {
|
||||
// do nothing by default, we want to keep the conneciton list visible
|
||||
// in the majority of cases (wired, wwan, vpn)
|
||||
// in the majority of cases (wired, wwan)
|
||||
},
|
||||
|
||||
getStatusLabel: function() {
|
||||
@ -500,15 +517,6 @@ const NMDevice = new Lang.Class({
|
||||
throw new TypeError('Invoking pure virtual function NMDevice.createAutomaticConnection');
|
||||
},
|
||||
|
||||
_findConnection: function(uuid) {
|
||||
for (let i = 0; i < this._connections.length; i++) {
|
||||
let obj = this._connections[i];
|
||||
if (obj.uuid == uuid)
|
||||
return i;
|
||||
}
|
||||
return -1;
|
||||
},
|
||||
|
||||
_queueCreateSection: function() {
|
||||
this._clearSection();
|
||||
Main.queueDeferredWork(this._deferredWorkId);
|
||||
@ -652,8 +660,6 @@ const NMDevice = new Lang.Class({
|
||||
return out;
|
||||
}
|
||||
});
|
||||
Signals.addSignalMethods(NMDevice.prototype);
|
||||
|
||||
|
||||
const NMDeviceWired = new Lang.Class({
|
||||
Name: 'NMDeviceWired',
|
||||
@ -868,95 +874,6 @@ const NMDeviceBluetooth = new Lang.Class({
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
// Not a real device, but I save a lot code this way
|
||||
const NMDeviceVPN = new Lang.Class({
|
||||
Name: 'NMDeviceVPN',
|
||||
Extends: NMDevice,
|
||||
|
||||
_init: function(client, device, connections) {
|
||||
// Disable autoconnections
|
||||
this._autoConnectionName = null;
|
||||
this.category = NMConnectionCategory.VPN;
|
||||
|
||||
this.parent(client, null, connections);
|
||||
},
|
||||
|
||||
connectionValid: function(connection) {
|
||||
return connection._type == NetworkManager.SETTING_VPN_SETTING_NAME;
|
||||
},
|
||||
|
||||
get empty() {
|
||||
return this._connections.length == 0;
|
||||
},
|
||||
|
||||
get connected() {
|
||||
if (!this._activeConnection)
|
||||
return false;
|
||||
|
||||
return this._activeConnection.vpn_state == NetworkManager.VPNConnectionState.ACTIVATED;
|
||||
},
|
||||
|
||||
setActiveConnection: function(activeConnection) {
|
||||
if (this._stateChangeId)
|
||||
this._activeConnection.disconnect(this._stateChangeId);
|
||||
this._stateChangeId = 0;
|
||||
|
||||
this.parent(activeConnection);
|
||||
|
||||
if (this._activeConnection)
|
||||
this._stateChangeId = this._activeConnection.connect('vpn-state-changed',
|
||||
Lang.bind(this, this._connectionStateChanged));
|
||||
|
||||
this.emit('state-changed');
|
||||
},
|
||||
|
||||
_shouldShowConnectionList: function() {
|
||||
return true;
|
||||
},
|
||||
|
||||
deactivate: function() {
|
||||
if (this._activeConnection)
|
||||
this._client.deactivate_connection(this._activeConnection);
|
||||
},
|
||||
|
||||
getStatusLabel: function() {
|
||||
if (!this._activeConnection) // Same as DISCONNECTED
|
||||
return null;
|
||||
|
||||
switch(this._activeConnection.vpn_state) {
|
||||
case NetworkManager.VPNConnectionState.DISCONNECTED:
|
||||
case NetworkManager.VPNConnectionState.ACTIVATED:
|
||||
return null;
|
||||
case NetworkManager.VPNConnectionState.PREPARE:
|
||||
case NetworkManager.VPNConnectionState.CONNECT:
|
||||
case NetworkManager.VPNConnectionState.IP_CONFIG_GET:
|
||||
return _("connecting...");
|
||||
case NetworkManager.VPNConnectionState.NEED_AUTH:
|
||||
/* Translators: this is for network connections that require some kind of key or password */
|
||||
return _("authentication required");
|
||||
case NetworkManager.VPNConnectionState.FAILED:
|
||||
return _("connection failed");
|
||||
default:
|
||||
log('VPN connection state invalid, is %d'.format(this.device.state));
|
||||
return 'invalid';
|
||||
}
|
||||
},
|
||||
|
||||
_connectionStateChanged: function(connection, newstate, reason) {
|
||||
if (newstate == NetworkManager.VPNConnectionState.FAILED) {
|
||||
// FIXME: if we ever want to show something based on reason,
|
||||
// we need to convert from NetworkManager.VPNConnectionStateReason
|
||||
// to NetworkManager.DeviceStateReason
|
||||
this.emit('activation-failed', reason);
|
||||
}
|
||||
|
||||
// Differently from real NMDevices, there is no need to queue
|
||||
// an update of the menu section, contents wouldn't change anyway
|
||||
this.emit('state-changed');
|
||||
}
|
||||
});
|
||||
|
||||
const NMDeviceWireless = new Lang.Class({
|
||||
Name: 'NMDeviceWireless',
|
||||
Extends: NMDevice,
|
||||
@ -1557,6 +1474,151 @@ const NMDeviceWireless = new Lang.Class({
|
||||
},
|
||||
});
|
||||
|
||||
const NMVPNSection = new Lang.Class({
|
||||
Name: 'NMVPNSection',
|
||||
Extends: NMConnectionBased,
|
||||
category: NMConnectionCategory.VPN,
|
||||
|
||||
_init: function(client, connections) {
|
||||
this.parent(connections);
|
||||
this._client = client;
|
||||
|
||||
this.section = new PopupMenu.PopupMenuSection();
|
||||
this._deferredWorkId = Main.initializeDeferredWork(this.section.actor, Lang.bind(this, this._createSection));
|
||||
},
|
||||
|
||||
get empty() {
|
||||
return this._connections.length == 0;
|
||||
},
|
||||
|
||||
connectionValid: function(connection) {
|
||||
// filtering is done by NMApplet code
|
||||
return true;
|
||||
},
|
||||
|
||||
getStatusLabel: function(activeConnection) {
|
||||
switch(activeConnection.vpn_state) {
|
||||
case NetworkManager.VPNConnectionState.DISCONNECTED:
|
||||
case NetworkManager.VPNConnectionState.ACTIVATED:
|
||||
return null;
|
||||
case NetworkManager.VPNConnectionState.PREPARE:
|
||||
case NetworkManager.VPNConnectionState.CONNECT:
|
||||
case NetworkManager.VPNConnectionState.IP_CONFIG_GET:
|
||||
return _("connecting...");
|
||||
case NetworkManager.VPNConnectionState.NEED_AUTH:
|
||||
/* Translators: this is for network connections that require some kind of key or password */
|
||||
return _("authentication required");
|
||||
case NetworkManager.VPNConnectionState.FAILED:
|
||||
return _("connection failed");
|
||||
default:
|
||||
log('VPN connection state invalid, is %d'.format(this.device.state));
|
||||
return 'invalid';
|
||||
}
|
||||
},
|
||||
|
||||
clearActiveConnection: function(activeConnection) {
|
||||
let pos = this._findConnection(activeConnection.uuid);
|
||||
if (pos < 0)
|
||||
return;
|
||||
|
||||
let obj = this._connections[pos];
|
||||
obj.active.disconnect(obj.stateChangedId);
|
||||
obj.active = null;
|
||||
|
||||
if (obj.item) {
|
||||
obj.item.setToggleState(false);
|
||||
obj.item.setStatus(null);
|
||||
}
|
||||
},
|
||||
|
||||
setActiveConnection: function(activeConnection) {
|
||||
let pos = this._findConnection(activeConnection.uuid);
|
||||
if (pos < 0)
|
||||
return;
|
||||
|
||||
let obj = this._connections[pos];
|
||||
obj.active = activeConnection;
|
||||
obj.stateChangedId = obj.active.connect('vpn-state-changed',
|
||||
Lang.bind(this, this._connectionStateChanged));
|
||||
|
||||
if (obj.item) {
|
||||
obj.item.setToggleState(obj.active.vpn_state ==
|
||||
NetworkManager.VPNConnectionState.ACTIVATED);
|
||||
obj.item.setStatus(this.getStatusLabel(obj.active));
|
||||
}
|
||||
},
|
||||
|
||||
_queueCreateSection: function() {
|
||||
this.section.removeAll();
|
||||
Main.queueDeferredWork(this._deferredWorkId);
|
||||
},
|
||||
|
||||
_createConnectionItem: function(obj) {
|
||||
let menuItem = new PopupMenu.PopupSwitchMenuItem(obj.name, false,
|
||||
{ style_class: 'popup-subtitle-menu-item' });
|
||||
menuItem.connect('toggled', Lang.bind(this, function(menuItem) {
|
||||
if (menuItem.state) {
|
||||
this._client.activate_connection(obj.connection, null, null, null);
|
||||
// Immediately go back to disconnected, until NM tells us to change
|
||||
menuItem.setToggleState(false);
|
||||
} else if (obj.active) {
|
||||
this._client.deactivate_connection(obj.active);
|
||||
}
|
||||
}));
|
||||
|
||||
if (obj.active) {
|
||||
menuItem.setToggleState(obj.active.vpn_state ==
|
||||
NetworkManager.VPNConnectionState.ACTIVATED);
|
||||
menuItem.setStatus(this.getStatusLabel(obj.active));
|
||||
}
|
||||
|
||||
return menuItem;
|
||||
},
|
||||
|
||||
_createSection: function() {
|
||||
if (this._connections.length > 0) {
|
||||
this.section.actor.show();
|
||||
|
||||
for(let j = 0; j < this._connections.length; ++j) {
|
||||
let obj = this._connections[j];
|
||||
obj.item = this._createConnectionItem(obj);
|
||||
|
||||
if (j >= NUM_VISIBLE_NETWORKS) {
|
||||
if (!this._overflowItem) {
|
||||
this._overflowItem = new PopupMenu.PopupSubMenuMenuItem(_("More..."));
|
||||
this.section.addMenuItem(this._overflowItem);
|
||||
}
|
||||
this._overflowItem.menu.addMenuItem(obj.item);
|
||||
} else
|
||||
this.section.addMenuItem(obj.item);
|
||||
}
|
||||
} else {
|
||||
this.section.actor.hide()
|
||||
}
|
||||
},
|
||||
|
||||
_connectionStateChanged: function(vpnConnection, newstate, reason) {
|
||||
if (newstate == NetworkManager.VPNConnectionState.FAILED) {
|
||||
// FIXME: if we ever want to show something based on reason,
|
||||
// we need to convert from NetworkManager.VPNConnectionStateReason
|
||||
// to NetworkManager.DeviceStateReason
|
||||
this.emit('activation-failed', reason);
|
||||
}
|
||||
|
||||
let pos = this._findConnection(vpnConnection.uuid);
|
||||
if (pos >= 0) {
|
||||
let obj = this._connections[pos];
|
||||
if (obj.item) {
|
||||
obj.item.setToggleState(vpnConnection.vpn_state ==
|
||||
NetworkManager.VPNConnectionState.ACTIVATED);
|
||||
obj.item.setStatus(this.getStatusLabel(vpnConnection));
|
||||
}
|
||||
} else {
|
||||
log('Could not find connection for vpn-state-changed handler');
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
const NMApplet = new Lang.Class({
|
||||
Name: 'NMApplet',
|
||||
Extends: PanelMenu.SystemStatusButton,
|
||||
@ -1567,7 +1629,44 @@ const NMApplet = new Lang.Class({
|
||||
this.secondaryIcon = this.addIcon(new Gio.ThemedIcon({ name: 'network-vpn-symbolic' }));
|
||||
this.secondaryIcon.hide();
|
||||
|
||||
this._client = NMClient.Client.new();
|
||||
// Device types
|
||||
this._dtypes = { };
|
||||
this._dtypes[NetworkManager.DeviceType.ETHERNET] = NMDeviceWired;
|
||||
this._dtypes[NetworkManager.DeviceType.WIFI] = NMDeviceWireless;
|
||||
this._dtypes[NetworkManager.DeviceType.MODEM] = NMDeviceModem;
|
||||
this._dtypes[NetworkManager.DeviceType.BT] = NMDeviceBluetooth;
|
||||
// TODO: WiMax support
|
||||
|
||||
// Connection types
|
||||
this._ctypes = { };
|
||||
this._ctypes[NetworkManager.SETTING_WIRELESS_SETTING_NAME] = NMConnectionCategory.WIRELESS;
|
||||
this._ctypes[NetworkManager.SETTING_WIRED_SETTING_NAME] = NMConnectionCategory.WIRED;
|
||||
this._ctypes[NetworkManager.SETTING_PPPOE_SETTING_NAME] = NMConnectionCategory.WIRED;
|
||||
this._ctypes[NetworkManager.SETTING_PPP_SETTING_NAME] = NMConnectionCategory.WIRED;
|
||||
this._ctypes[NetworkManager.SETTING_BLUETOOTH_SETTING_NAME] = NMConnectionCategory.WWAN;
|
||||
this._ctypes[NetworkManager.SETTING_CDMA_SETTING_NAME] = NMConnectionCategory.WWAN;
|
||||
this._ctypes[NetworkManager.SETTING_GSM_SETTING_NAME] = NMConnectionCategory.WWAN;
|
||||
this._ctypes[NetworkManager.SETTING_VPN_SETTING_NAME] = NMConnectionCategory.VPN;
|
||||
|
||||
NMClient.Client.new_async(null, Lang.bind(this, this._clientGot));
|
||||
NMClient.RemoteSettings.new_async(null, null, Lang.bind(this, this._remoteSettingsGot));
|
||||
},
|
||||
|
||||
_clientGot: function(obj, result) {
|
||||
this._client = NMClient.Client.new_finish(result);
|
||||
|
||||
this._tryLateInit();
|
||||
},
|
||||
|
||||
_remoteSettingsGot: function(obj, result) {
|
||||
this._settings = NMClient.RemoteSettings.new_finish(result);
|
||||
|
||||
this._tryLateInit();
|
||||
},
|
||||
|
||||
_tryLateInit: function() {
|
||||
if (!this._client || !this._settings)
|
||||
return;
|
||||
|
||||
this._statusSection = new PopupMenu.PopupMenuSection();
|
||||
this._statusItem = new PopupMenu.PopupMenuItem('', { reactive: false });
|
||||
@ -1622,56 +1721,23 @@ const NMApplet = new Lang.Class({
|
||||
this.menu.addMenuItem(this._devices.wwan.section);
|
||||
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||
|
||||
this._devices.vpn = {
|
||||
section: new PopupMenu.PopupMenuSection(),
|
||||
device: this._makeWrapperDevice(NMDeviceVPN, null),
|
||||
item: new NMWiredSectionTitleMenuItem(_("VPN Connections"))
|
||||
};
|
||||
this._devices.vpn.section.addMenuItem(this._devices.vpn.item);
|
||||
this._devices.vpn.section.addMenuItem(this._devices.vpn.device.section);
|
||||
this._devices.vpn.section.actor.hide();
|
||||
this.menu.addMenuItem(this._devices.vpn.section);
|
||||
this._vpnSection = new NMVPNSection(this._client, this._connections);
|
||||
this._vpnSection.connect('activation-failed', Lang.bind(this, this._onActivationFailed));
|
||||
this.menu.addMenuItem(this._vpnSection.section);
|
||||
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||
this.menu.addSettingsAction(_("Network Settings"), 'gnome-network-panel.desktop');
|
||||
|
||||
// Device types
|
||||
this._dtypes = { };
|
||||
this._dtypes[NetworkManager.DeviceType.ETHERNET] = NMDeviceWired;
|
||||
this._dtypes[NetworkManager.DeviceType.WIFI] = NMDeviceWireless;
|
||||
this._dtypes[NetworkManager.DeviceType.MODEM] = NMDeviceModem;
|
||||
this._dtypes[NetworkManager.DeviceType.BT] = NMDeviceBluetooth;
|
||||
// TODO: WiMax support
|
||||
this._readConnections();
|
||||
this._readDevices();
|
||||
this._syncNMState();
|
||||
|
||||
// Connection types
|
||||
this._ctypes = { };
|
||||
this._ctypes[NetworkManager.SETTING_WIRELESS_SETTING_NAME] = NMConnectionCategory.WIRELESS;
|
||||
this._ctypes[NetworkManager.SETTING_WIRED_SETTING_NAME] = NMConnectionCategory.WIRED;
|
||||
this._ctypes[NetworkManager.SETTING_PPPOE_SETTING_NAME] = NMConnectionCategory.WIRED;
|
||||
this._ctypes[NetworkManager.SETTING_PPP_SETTING_NAME] = NMConnectionCategory.WIRED;
|
||||
this._ctypes[NetworkManager.SETTING_BLUETOOTH_SETTING_NAME] = NMConnectionCategory.WWAN;
|
||||
this._ctypes[NetworkManager.SETTING_CDMA_SETTING_NAME] = NMConnectionCategory.WWAN;
|
||||
this._ctypes[NetworkManager.SETTING_GSM_SETTING_NAME] = NMConnectionCategory.WWAN;
|
||||
this._ctypes[NetworkManager.SETTING_VPN_SETTING_NAME] = NMConnectionCategory.VPN;
|
||||
|
||||
this._settings = NMClient.RemoteSettings.new(null);
|
||||
this._connectionsReadId = this._settings.connect('connections-read', Lang.bind(this, function() {
|
||||
this._readConnections();
|
||||
this._readDevices();
|
||||
this._syncNMState();
|
||||
|
||||
// Connect to signals late so that early signals don't find in inconsistent state
|
||||
// and connect only once (this signal handler can be called again if NetworkManager goes up and down)
|
||||
if (!this._inited) {
|
||||
this._inited = true;
|
||||
this._client.connect('notify::manager-running', Lang.bind(this, this._syncNMState));
|
||||
this._client.connect('notify::networking-enabled', Lang.bind(this, this._syncNMState));
|
||||
this._client.connect('notify::state', Lang.bind(this, this._syncNMState));
|
||||
this._client.connect('notify::active-connections', Lang.bind(this, this._updateIcon));
|
||||
this._client.connect('device-added', Lang.bind(this, this._deviceAdded));
|
||||
this._client.connect('device-removed', Lang.bind(this, this._deviceRemoved));
|
||||
this._settings.connect('new-connection', Lang.bind(this, this._newConnection));
|
||||
}
|
||||
}));
|
||||
this._client.connect('notify::manager-running', Lang.bind(this, this._syncNMState));
|
||||
this._client.connect('notify::networking-enabled', Lang.bind(this, this._syncNMState));
|
||||
this._client.connect('notify::state', Lang.bind(this, this._syncNMState));
|
||||
this._client.connect('notify::active-connections', Lang.bind(this, this._updateIcon));
|
||||
this._client.connect('device-added', Lang.bind(this, this._deviceAdded));
|
||||
this._client.connect('device-removed', Lang.bind(this, this._deviceRemoved));
|
||||
this._settings.connect('new-connection', Lang.bind(this, this._newConnection));
|
||||
},
|
||||
|
||||
_ensureSource: function() {
|
||||
@ -1699,18 +1765,6 @@ const NMApplet = new Lang.Class({
|
||||
},
|
||||
|
||||
_syncSectionTitle: function(category) {
|
||||
if (category == NMConnectionCategory.VPN) {
|
||||
// Special case VPN: it's only one device (and a fake one
|
||||
// actually), and we don't show it if empty
|
||||
let device = this._devices.vpn.device;
|
||||
let section = this._devices.vpn.section;
|
||||
let item = this._devices.vpn.item;
|
||||
|
||||
section.actor.visible = !device.empty;
|
||||
item.updateForDevice(device);
|
||||
return;
|
||||
}
|
||||
|
||||
let devices = this._devices[category].devices;
|
||||
let item = this._devices[category].item;
|
||||
let section = this._devices[category].section;
|
||||
@ -1758,17 +1812,20 @@ const NMApplet = new Lang.Class({
|
||||
this._source.notify(device._notification);
|
||||
},
|
||||
|
||||
_onActivationFailed: 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-symbolic',
|
||||
_("Connection failed"),
|
||||
_("Activation of network connection failed"),
|
||||
MessageTray.Urgency.HIGH);
|
||||
},
|
||||
|
||||
_makeWrapperDevice: function(wrapperClass, device) {
|
||||
let wrapper = new wrapperClass(this._client, device, this._connections);
|
||||
|
||||
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-symbolic',
|
||||
_("Connection failed"),
|
||||
_("Activation of network connection failed"),
|
||||
MessageTray.Urgency.HIGH);
|
||||
}));
|
||||
wrapper._activationFailedId = wrapper.connect('activation-failed',
|
||||
Lang.bind(this, this._onActivationFailed));
|
||||
wrapper._deviceStateChangedId = wrapper.connect('state-changed', Lang.bind(this, function(dev) {
|
||||
this._syncSectionTitle(dev.category);
|
||||
}));
|
||||
@ -1851,7 +1908,7 @@ const NMApplet = new Lang.Class({
|
||||
for (let i = 0; i < closedConnections.length; i++) {
|
||||
let active = closedConnections[i];
|
||||
if (active._primaryDevice) {
|
||||
active._primaryDevice.setActiveConnection(null);
|
||||
active._primaryDevice.clearActiveConnection(active);
|
||||
active._primaryDevice = null;
|
||||
}
|
||||
if (active._inited) {
|
||||
@ -1918,7 +1975,7 @@ const NMApplet = new Lang.Class({
|
||||
}
|
||||
}
|
||||
} else
|
||||
a._primaryDevice = this._devices.vpn.device
|
||||
a._primaryDevice = this._vpnSection;
|
||||
|
||||
if (a._primaryDevice)
|
||||
a._primaryDevice.setActiveConnection(a);
|
||||
@ -2000,8 +2057,7 @@ const NMApplet = new Lang.Class({
|
||||
let section = connection._section;
|
||||
|
||||
if (section == NMConnectionCategory.VPN) {
|
||||
this._devices.vpn.device.removeConnection(connection);
|
||||
this._syncSectionTitle(section);
|
||||
this._vpnSection.removeConnection(connection);
|
||||
} else if (section != NMConnectionCategory.INVALID) {
|
||||
let devices = this._devices[section].devices;
|
||||
for (let i = 0; i < devices.length; i++)
|
||||
@ -2024,8 +2080,7 @@ const NMApplet = new Lang.Class({
|
||||
if (section == NMConnectionCategory.INVALID)
|
||||
return;
|
||||
if (section == NMConnectionCategory.VPN) {
|
||||
this._devices.vpn.device.checkConnection(connection);
|
||||
this._syncSectionTitle(section);
|
||||
this._vpnSection.checkConnection(connection);
|
||||
} else {
|
||||
let devices = this._devices[section].devices;
|
||||
for (let i = 0; i < devices.length; i++) {
|
||||
@ -2051,7 +2106,6 @@ const NMApplet = new Lang.Class({
|
||||
this._syncSectionTitle(NMConnectionCategory.WIRED);
|
||||
this._syncSectionTitle(NMConnectionCategory.WIRELESS);
|
||||
this._syncSectionTitle(NMConnectionCategory.WWAN);
|
||||
this._syncSectionTitle(NMConnectionCategory.VPN);
|
||||
},
|
||||
|
||||
_syncNMState: function() {
|
||||
|
@ -1,6 +1,7 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
const Gio = imports.gi.Gio;
|
||||
const GLib = imports.gi.GLib;
|
||||
const Lang = imports.lang;
|
||||
const St = imports.gi.St;
|
||||
|
||||
@ -45,7 +46,16 @@ const PowerManagerInterface = <interface name="org.gnome.SettingsDaemon.Power">
|
||||
<property name="Icon" type="s" access="read" />
|
||||
</interface>;
|
||||
|
||||
const PowerManagerProxy = Gio.DBusProxy.makeProxyWrapper(PowerManagerInterface);
|
||||
const PowerManagerProxy = new Gio.DBusProxyClass({
|
||||
Name: 'PowerManagerProxy',
|
||||
Interface: PowerManagerInterface,
|
||||
|
||||
_init: function() {
|
||||
this.parent({ g_bus_type: Gio.BusType.SESSION,
|
||||
g_name: BUS_NAME,
|
||||
g_object_path: OBJECT_PATH });
|
||||
}
|
||||
});
|
||||
|
||||
const Indicator = new Lang.Class({
|
||||
Name: 'PowerIndicator',
|
||||
@ -54,7 +64,7 @@ const Indicator = new Lang.Class({
|
||||
_init: function() {
|
||||
this.parent('battery-missing-symbolic', _("Battery"));
|
||||
|
||||
this._proxy = new PowerManagerProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH);
|
||||
this._proxy = new PowerManagerProxy();
|
||||
|
||||
this._deviceItems = [ ];
|
||||
this._hasPrimary = false;
|
||||
@ -73,18 +83,26 @@ const Indicator = new Lang.Class({
|
||||
|
||||
this._proxy.connect('g-properties-changed',
|
||||
Lang.bind(this, this._devicesChanged));
|
||||
this._devicesChanged();
|
||||
this._proxy.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(proxy, result) {
|
||||
proxy.init_finish(result);
|
||||
|
||||
this._devicesChanged();
|
||||
}));
|
||||
},
|
||||
|
||||
_readPrimaryDevice: function() {
|
||||
this._proxy.GetPrimaryDeviceRemote(Lang.bind(this, function(result, error) {
|
||||
if (error) {
|
||||
this._proxy.GetPrimaryDeviceRemote(null, Lang.bind(this, function(proxy, result) {
|
||||
let device_id, device_type, icon, percentage, state, seconds;
|
||||
try {
|
||||
[[device_id, device_type, icon, percentage, state, seconds]] =
|
||||
proxy.GetPrimaryDeviceFinish(result);
|
||||
} catch(e) {
|
||||
this._hasPrimary = false;
|
||||
this._primaryDeviceId = null;
|
||||
this._batteryItem.actor.hide();
|
||||
return;
|
||||
}
|
||||
let [[device_id, device_type, icon, percentage, state, seconds]] = result;
|
||||
|
||||
if (device_type == UPDeviceType.BATTERY) {
|
||||
this._hasPrimary = true;
|
||||
let time = Math.round(seconds / 60);
|
||||
@ -121,16 +139,18 @@ const Indicator = new Lang.Class({
|
||||
},
|
||||
|
||||
_readOtherDevices: function() {
|
||||
this._proxy.GetDevicesRemote(Lang.bind(this, function(result, error) {
|
||||
this._proxy.GetDevicesRemote(null, Lang.bind(this, function(proxy, result) {
|
||||
this._deviceItems.forEach(function(i) { i.destroy(); });
|
||||
this._deviceItems = [];
|
||||
|
||||
if (error) {
|
||||
let devices;
|
||||
try {
|
||||
[devices] = proxy.GetDevicesFinish(result);
|
||||
} catch(e) {
|
||||
return;
|
||||
}
|
||||
|
||||
let position = 0;
|
||||
let [devices] = result;
|
||||
for (let i = 0; i < devices.length; i++) {
|
||||
let [device_id, device_type] = devices[i];
|
||||
if (device_type == UPDeviceType.AC_POWER || device_id == this._primaryDeviceId)
|
||||
|
@ -208,9 +208,13 @@ const UnlockDialog = new Lang.Class({
|
||||
},
|
||||
|
||||
_showMessage: function(userVerifier, message, styleClass) {
|
||||
this._promptMessage.text = message;
|
||||
this._promptMessage.styleClass = styleClass;
|
||||
GdmUtil.fadeInActor(this._promptMessage);
|
||||
if (message) {
|
||||
this._promptMessage.text = message;
|
||||
this._promptMessage.styleClass = styleClass;
|
||||
GdmUtil.fadeInActor(this._promptMessage);
|
||||
} else {
|
||||
GdmUtil.fadeOutActor(this._promptMessage);
|
||||
}
|
||||
},
|
||||
|
||||
_onAskQuestion: function(verifier, serviceName, question, passwordChar) {
|
||||
@ -278,6 +282,7 @@ const UnlockDialog = new Lang.Class({
|
||||
this._currentQuery = null;
|
||||
this._firstQuestion = true;
|
||||
|
||||
this._promptEntry.text = '';
|
||||
this._promptEntry.clutter_text.set_password_char('\u25cf');
|
||||
this._promptEntry.menu.isPassword = true;
|
||||
|
||||
|
@ -26,6 +26,7 @@ const DISABLE_USER_SWITCH_KEY = 'disable-user-switching';
|
||||
const DISABLE_LOCK_SCREEN_KEY = 'disable-lock-screen';
|
||||
const DISABLE_LOG_OUT_KEY = 'disable-log-out';
|
||||
const LOCK_ENABLED_KEY = 'lock-enabled';
|
||||
const ALWAYS_SHOW_LOG_OUT_KEY = 'always-show-log-out';
|
||||
|
||||
const DIALOG_ICON_SIZE = 64;
|
||||
|
||||
@ -187,15 +188,19 @@ const IMStatusChooserItem = new Lang.Class({
|
||||
item = new IMStatusItem(_("Idle"), 'user-idle-symbolic');
|
||||
this._combo.addMenuItem(item, IMStatus.IDLE);
|
||||
|
||||
item = new IMStatusItem(_("Unavailable"), 'user-offline-symbolic');
|
||||
item = new IMStatusItem(_("Offline"), 'user-offline-symbolic');
|
||||
this._combo.addMenuItem(item, IMStatus.OFFLINE);
|
||||
|
||||
this._combo.connect('active-item-changed',
|
||||
Lang.bind(this, this._changeIMStatus));
|
||||
|
||||
this._presence = new GnomeSession.Presence();
|
||||
this._presence.connectSignal('StatusChanged', Lang.bind(this, function(proxy, senderName, [status]) {
|
||||
this._sessionStatusChanged(status);
|
||||
this._presence.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(obj, result) {
|
||||
obj.init_finish(result);
|
||||
|
||||
this._presence.connectSignal('StatusChanged', Lang.bind(this, function(proxy, senderName, [status]) {
|
||||
this._sessionStatusChanged(status);
|
||||
}));
|
||||
}));
|
||||
|
||||
this._sessionPresenceRestored = false;
|
||||
@ -479,14 +484,33 @@ const UserMenuButton = new Lang.Class({
|
||||
this._userManager = AccountsService.UserManager.get_default();
|
||||
|
||||
this._user = this._userManager.get_user(GLib.get_user_name());
|
||||
|
||||
this._presence = new GnomeSession.Presence();
|
||||
this._session = new GnomeSession.SessionManager();
|
||||
this._presence.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(proxy, result) {
|
||||
proxy.init_finish(result);
|
||||
|
||||
this._updateSwitch(this._presence.status);
|
||||
this._presence.connectSignal('StatusChanged', Lang.bind(this, function (proxy, senderName, [status]) {
|
||||
this._updateSwitch(status);
|
||||
}));
|
||||
}));
|
||||
|
||||
let session = new GnomeSession.SessionManager();
|
||||
session.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(proxy, result) {
|
||||
// This should never fail.
|
||||
proxy.init_finish(result);
|
||||
|
||||
this._session = proxy;
|
||||
this._updateHaveShutdown();
|
||||
}));
|
||||
this._haveShutdown = true;
|
||||
this._haveSuspend = true;
|
||||
|
||||
this._accountMgr = Tp.AccountManager.dup();
|
||||
|
||||
this._loginManager = LoginManager.getLoginManager();
|
||||
LoginManager.getLoginManager(Lang.bind(this, function(manager) {
|
||||
this._loginManager = manager;
|
||||
}));
|
||||
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
||||
|
||||
this._iconBox = new St.Bin();
|
||||
@ -532,11 +556,6 @@ const UserMenuButton = new Lang.Class({
|
||||
|
||||
this._createSubMenu();
|
||||
|
||||
this._updateSwitch(this._presence.status);
|
||||
this._presence.connectSignal('StatusChanged', Lang.bind(this, function (proxy, senderName, [status]) {
|
||||
this._updateSwitch(status);
|
||||
}));
|
||||
|
||||
this._userManager.connect('notify::is-loaded',
|
||||
Lang.bind(this, this._updateMultiUser));
|
||||
this._userManager.connect('notify::has-multiple-users',
|
||||
@ -616,10 +635,13 @@ const UserMenuButton = new Lang.Class({
|
||||
|
||||
_updateLogout: function() {
|
||||
let allowLogout = !this._lockdownSettings.get_boolean(DISABLE_LOG_OUT_KEY);
|
||||
let alwaysShow = global.settings.get_boolean(ALWAYS_SHOW_LOG_OUT_KEY);
|
||||
let systemAccount = this._user.system_account;
|
||||
let localAccount = this._user.local_account;
|
||||
let multiUser = this._userManager.has_multiple_users;
|
||||
let multiSession = Gdm.get_session_ids().length > 1;
|
||||
|
||||
this._logoutItem.actor.visible = allowLogout && (multiUser || multiSession);
|
||||
this._logoutItem.actor.visible = allowLogout && (alwaysShow || multiUser || multiSession || systemAccount || !localAccount);
|
||||
},
|
||||
|
||||
_updateLockScreen: function() {
|
||||
@ -633,17 +655,29 @@ const UserMenuButton = new Lang.Class({
|
||||
},
|
||||
|
||||
_updateHaveShutdown: function() {
|
||||
this._session.CanShutdownRemote(Lang.bind(this,
|
||||
function(result, error) {
|
||||
if (!error) {
|
||||
this._haveShutdown = result[0];
|
||||
this._updateInstallUpdates();
|
||||
this._updateSuspendOrPowerOff();
|
||||
}
|
||||
}));
|
||||
if (!this._session) {
|
||||
this._haveShutdown = false;
|
||||
return;
|
||||
}
|
||||
|
||||
this._session.CanShutdownRemote(null, Lang.bind(this, function(proxy, result) {
|
||||
try {
|
||||
[this._haveShutdown] = proxy.CanShutdownFinish(result);
|
||||
} catch(e) {
|
||||
this._haveShutdown = false;
|
||||
}
|
||||
|
||||
this._updateInstallUpdates();
|
||||
this._updateSuspendOrPowerOff();
|
||||
}));
|
||||
},
|
||||
|
||||
_updateHaveSuspend: function() {
|
||||
if (!this._loginManager) {
|
||||
this._haveSuspend = false;
|
||||
return;
|
||||
}
|
||||
|
||||
this._loginManager.canSuspend(Lang.bind(this,
|
||||
function(result) {
|
||||
this._haveSuspend = result;
|
||||
@ -833,14 +867,17 @@ const UserMenuButton = new Lang.Class({
|
||||
|
||||
_onQuitSessionActivate: function() {
|
||||
Main.overview.hide();
|
||||
this._session.LogoutRemote(0);
|
||||
|
||||
if (this._session)
|
||||
this._session.LogoutRemote(0, null, null);
|
||||
},
|
||||
|
||||
_onInstallUpdatesActivate: function() {
|
||||
Main.overview.hide();
|
||||
Util.spawn(['pkexec', '/usr/libexec/pk-trigger-offline-update']);
|
||||
|
||||
this._session.RebootRemote();
|
||||
if (this._haveShutdown)
|
||||
this._session.RebootRemote(null, null);
|
||||
},
|
||||
|
||||
_onSuspendOrPowerOffActivate: function() {
|
||||
@ -848,8 +885,8 @@ const UserMenuButton = new Lang.Class({
|
||||
|
||||
if (this._haveShutdown &&
|
||||
this._suspendOrPowerOffItem.state == PopupMenu.PopupAlternatingMenuItemState.DEFAULT) {
|
||||
this._session.ShutdownRemote();
|
||||
} else {
|
||||
this._session.ShutdownRemote(null, null);
|
||||
} else if (this._haveSuspend) {
|
||||
if (this._screenSaverSettings.get_boolean(LOCK_ENABLED_KEY)) {
|
||||
let tmpId = Main.screenShield.connect('lock-screen-shown', Lang.bind(this, function() {
|
||||
Main.screenShield.disconnect(tmpId);
|
||||
|
@ -159,6 +159,24 @@ const WindowClone = new Lang.Class({
|
||||
this._selected = false;
|
||||
},
|
||||
|
||||
get slot() {
|
||||
let x, y, w, h;
|
||||
|
||||
if (this.inDrag) {
|
||||
x = this.dragOrigX;
|
||||
y = this.dragOrigY;
|
||||
w = this.actor.width * this.dragOrigScale;
|
||||
h = this.actor.height * this.dragOrigScale;
|
||||
} else {
|
||||
x = this.actor.x;
|
||||
y = this.actor.y;
|
||||
w = this.actor.width * this.actor.scale_x;
|
||||
h = this.actor.height * this.actor.scale_y;
|
||||
}
|
||||
|
||||
return [x, y, w, h];
|
||||
},
|
||||
|
||||
setStackAbove: function (actor) {
|
||||
this._stackAbove = actor;
|
||||
if (this.inDrag || this._zooming)
|
||||
@ -435,6 +453,11 @@ const WindowOverlay = new Lang.Class({
|
||||
this._updateCaptionId = metaWindow.connect('notify::title',
|
||||
Lang.bind(this, function(w) {
|
||||
this.title.text = w.title;
|
||||
// we need this for the next call to get_preferred_width
|
||||
// to return useful results
|
||||
this.title.set_size(-1, -1);
|
||||
|
||||
this._repositionSelf();
|
||||
}));
|
||||
|
||||
let button = new St.Button({ style_class: 'window-close' });
|
||||
@ -501,6 +524,11 @@ const WindowOverlay = new Lang.Class({
|
||||
this.title.height + this.title._spacing];
|
||||
},
|
||||
|
||||
_repositionSelf: function() {
|
||||
let [cloneX, cloneY, cloneWidth, cloneHeight] = this._windowClone.slot;
|
||||
this.updatePositions(cloneX, cloneY, cloneWidth, cloneHeight, false);
|
||||
},
|
||||
|
||||
/**
|
||||
* @cloneX: x position of windowClone
|
||||
* @cloneY: y position of windowClone
|
||||
@ -538,9 +566,8 @@ const WindowOverlay = new Lang.Class({
|
||||
else
|
||||
button.set_position(Math.floor(buttonX), Math.floor(buttonY));
|
||||
|
||||
if (!title.fullWidth)
|
||||
title.fullWidth = title.width;
|
||||
let titleWidth = Math.min(title.fullWidth, cloneWidth);
|
||||
let [titleMinWidth, titleNatWidth] = title.get_preferred_width(-1);
|
||||
let titleWidth = Math.max(titleMinWidth, Math.min(titleNatWidth, cloneWidth));
|
||||
|
||||
let titleX = cloneX + (cloneWidth - titleWidth) / 2;
|
||||
let titleY = cloneY + cloneHeight + title._spacing;
|
||||
|
22
po/fa.po
22
po/fa.po
@ -708,7 +708,7 @@ msgstr "ارسال در <b>%A</b>, <b>%B %d</b>, %Y"
|
||||
#: ../js/ui/components/telepathyClient.js:988
|
||||
#, c-format
|
||||
msgid "%s is now known as %s"
|
||||
msgstr "%s با عنوان %s شناخته میشود"
|
||||
msgstr "%s با عنوان %s شناخته میشود"
|
||||
|
||||
#. translators: argument is a room name like
|
||||
#. * room@jabber.org for example.
|
||||
@ -723,7 +723,7 @@ msgstr "دعوتنامه به %s"
|
||||
#: ../js/ui/components/telepathyClient.js:1096
|
||||
#, c-format
|
||||
msgid "%s is inviting you to join %s"
|
||||
msgstr "%s از شما دعوت میکند که به %s بپیوندید"
|
||||
msgstr "%s از شما دعوت میکند که به %s بپیوندید"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1098
|
||||
#: ../js/ui/components/telepathyClient.js:1177
|
||||
@ -767,13 +767,13 @@ msgstr "پاسخگویی"
|
||||
#: ../js/ui/components/telepathyClient.js:1171
|
||||
#, c-format
|
||||
msgid "%s is sending you %s"
|
||||
msgstr "%s در حال ارسال %s به شما است"
|
||||
msgstr "%s در حال ارسال %s به شما است"
|
||||
|
||||
#. To translators: The parameter is the contact's alias
|
||||
#: ../js/ui/components/telepathyClient.js:1206
|
||||
#, c-format
|
||||
msgid "%s would like permission to see when you are online"
|
||||
msgstr "%s اجازه دسترسی برای دیدن زمانهایی که شما برخط هستید را دارد"
|
||||
msgstr "%s اجازه دسترسی برای دیدن زمانهایی که شما برخط هستید را دارد"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1298
|
||||
msgid "Network error"
|
||||
@ -938,8 +938,8 @@ msgstr ""
|
||||
#, c-format
|
||||
msgid "%s will be logged out automatically in %d second."
|
||||
msgid_plural "%s will be logged out automatically in %d seconds."
|
||||
msgstr[0] "%s به طور خودکار در مدت %Id ثانیه از سیستم خارج خواهد شد."
|
||||
msgstr[1] "%s به طور خودکار در مدت %Id ثانیه از سیستم خارج خواهد شد."
|
||||
msgstr[0] "%s به طور خودکار در مدت %Id ثانیه از سیستم خارج خواهد شد."
|
||||
msgstr[1] "%s به طور خودکار در مدت %Id ثانیه از سیستم خارج خواهد شد."
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:70
|
||||
#, c-format
|
||||
@ -1698,7 +1698,7 @@ msgstr ""
|
||||
#: ../js/ui/wanda.js:121
|
||||
#, c-format
|
||||
msgid "%s the Oracle says"
|
||||
msgstr "%s پیشگو میگوید"
|
||||
msgstr "%s پیشگو میگوید"
|
||||
|
||||
#: ../js/ui/wanda.js:162
|
||||
msgid "Your favorite Easter Egg"
|
||||
@ -1852,16 +1852,16 @@ msgstr "محاوره تایید هویت از طرف کاربر رد شد"
|
||||
#~ msgstr "شبکه"
|
||||
|
||||
#~ msgid "%s is online."
|
||||
#~ msgstr "%s بر خط است."
|
||||
#~ msgstr "%s بر خط است."
|
||||
|
||||
#~ msgid "%s is offline."
|
||||
#~ msgstr "%s برون خط است."
|
||||
#~ msgstr "%s برون خط است."
|
||||
|
||||
#~ msgid "%s is away."
|
||||
#~ msgstr "%s غایب است."
|
||||
#~ msgstr "%s غایب است."
|
||||
|
||||
#~ msgid "%s is busy."
|
||||
#~ msgstr "%s مشغول است."
|
||||
#~ msgstr "%s مشغول است."
|
||||
|
||||
#~ msgid "Hidden"
|
||||
#~ msgstr "نامرئی"
|
||||
|
26
po/he.po
26
po/he.po
@ -351,12 +351,12 @@ msgstr "הוספה למועדפים"
|
||||
#: ../js/ui/appFavorites.js:87
|
||||
#, c-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "%s נוסף למועדפים שלך."
|
||||
msgstr "%s נוסף למועדפים שלך."
|
||||
|
||||
#: ../js/ui/appFavorites.js:118
|
||||
#, c-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s הוסר מהמועדפים שלך."
|
||||
msgstr "%s הוסר מהמועדפים שלך."
|
||||
|
||||
#. Translators: Shown in calendar event list for all day events
|
||||
#. * Keep it short, best if you can use less then 10 characters
|
||||
@ -751,13 +751,13 @@ msgstr "מענה"
|
||||
#: ../js/ui/components/telepathyClient.js:1171
|
||||
#, c-format
|
||||
msgid "%s is sending you %s"
|
||||
msgstr "%s שולח/ת אליך %s"
|
||||
msgstr "%s שולח/ת אליך %s"
|
||||
|
||||
#. To translators: The parameter is the contact's alias
|
||||
#: ../js/ui/components/telepathyClient.js:1206
|
||||
#, c-format
|
||||
msgid "%s would like permission to see when you are online"
|
||||
msgstr "%s רוצה לקבל הרשאות כדי לראות מתי מצבך הוא מקוון"
|
||||
msgstr "%s רוצה לקבל הרשאות כדי לראות מתי מצבך הוא מקוון"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1298
|
||||
msgid "Network error"
|
||||
@ -1017,7 +1017,7 @@ msgstr "לא מותקנות הרחבות"
|
||||
#: ../js/ui/lookingGlass.js:745
|
||||
#, c-format
|
||||
msgid "%s has not emitted any errors."
|
||||
msgstr "%s לא העלה שגיאות כלשהן."
|
||||
msgstr "%s לא העלה שגיאות כלשהן."
|
||||
|
||||
#: ../js/ui/lookingGlass.js:751
|
||||
msgid "Hide Errors"
|
||||
@ -1436,7 +1436,7 @@ msgstr "חיוג אוטומטי"
|
||||
#: ../js/ui/status/network.js:853 ../js/ui/status/network.js:1476
|
||||
#, c-format
|
||||
msgid "Auto %s"
|
||||
msgstr "%s אוטומטי"
|
||||
msgstr "%s אוטומטי"
|
||||
|
||||
#: ../js/ui/status/network.js:855
|
||||
msgid "Auto bluetooth"
|
||||
@ -1688,7 +1688,7 @@ msgstr ""
|
||||
#: ../js/ui/wanda.js:123
|
||||
#, c-format
|
||||
msgid "%s the Oracle says"
|
||||
msgstr "%s, כה אמרה האוראקל"
|
||||
msgstr "%s, כה אמרה האוראקל"
|
||||
|
||||
#: ../js/ui/wanda.js:164
|
||||
msgid "Your favorite Easter Egg"
|
||||
@ -1697,7 +1697,7 @@ msgstr "ביצת הפסחא האהובה עליך"
|
||||
#: ../js/ui/windowAttentionHandler.js:19
|
||||
#, c-format
|
||||
msgid "'%s' is ready"
|
||||
msgstr "'%s' מוכן"
|
||||
msgstr "'%s' מוכן"
|
||||
|
||||
#: ../src/calendar-server/evolution-calendar.desktop.in.in.h:1
|
||||
msgid "Evolution Calendar"
|
||||
@ -1845,16 +1845,16 @@ msgstr "המשתמש בחר להתעלם מתיבת דו־שיח האימות"
|
||||
#~ msgstr "רשת"
|
||||
|
||||
#~ msgid "%s is online."
|
||||
#~ msgstr "%s התחבר/ה."
|
||||
#~ msgstr "%s התחבר/ה."
|
||||
|
||||
#~ msgid "%s is offline."
|
||||
#~ msgstr "%s התנתק/ה."
|
||||
#~ msgstr "%s התנתק/ה."
|
||||
|
||||
#~ msgid "%s is away."
|
||||
#~ msgstr "'%s' מרוחק/ת."
|
||||
#~ msgstr "'%s' מרוחק/ת."
|
||||
|
||||
#~ msgid "%s is busy."
|
||||
#~ msgstr "%s עסוק/ה."
|
||||
#~ msgstr "%s עסוק/ה."
|
||||
|
||||
#~ msgid "Hidden"
|
||||
#~ msgstr "מוסתר"
|
||||
@ -1887,7 +1887,7 @@ msgstr "המשתמש בחר להתעלם מתיבת דו־שיח האימות"
|
||||
#~ msgstr "הצגת ססמה"
|
||||
|
||||
#~ msgid "%s has finished starting"
|
||||
#~ msgstr "%s סיים את תהליך ההתחלה"
|
||||
#~ msgstr "%s סיים את תהליך ההתחלה"
|
||||
|
||||
#~ msgid "Home Folder"
|
||||
#~ msgstr "תיקיית הבית"
|
||||
|
244
po/pl.po
244
po/pl.po
@ -11,8 +11,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2012-09-25 15:12+0200\n"
|
||||
"PO-Revision-Date: 2012-09-25 15:13+0200\n"
|
||||
"POT-Creation-Date: 2012-10-31 19:12+0100\n"
|
||||
"PO-Revision-Date: 2012-10-31 19:13+0100\n"
|
||||
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
|
||||
"Language-Team: Polish <gnomepl@aviary.pl>\n"
|
||||
"Language: pl\n"
|
||||
@ -142,62 +142,74 @@ msgstr ""
|
||||
"użytkownika. Wartość pochodzi ze spisu GsmPresenceStatus."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13
|
||||
msgid "Always show the 'Log out' menuitem in the user menu."
|
||||
msgstr "Wyświetlanie elementu menu \"Wyloguj się\" w menu użytkownika."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
|
||||
msgid ""
|
||||
"This key overrides the automatic hiding of the 'Log out' menuitem in single-"
|
||||
"user, single-session situations."
|
||||
msgstr ""
|
||||
"Ten klucz zastępuje automatyczne ukrywanie elementu menu \"Wyloguj się\" w "
|
||||
"sytuacji, gdy istnieje tylko jeden użytkownik i jedna sesja."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
|
||||
msgid "Show the week date in the calendar"
|
||||
msgstr "Wyświetlanie dnia tygodnia w kalendarzu"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
|
||||
msgid "If true, display the ISO week date in the calendar."
|
||||
msgstr ""
|
||||
"Jeśli jest ustawione na \"true\", to wyświetla w kalendarzu dzień tygodnia w "
|
||||
"formacie ISO."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
|
||||
msgid "Keybinding to open the application menu"
|
||||
msgstr "Skrót do otwarcia menu programu"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
|
||||
msgid "Keybinding to open the application menu."
|
||||
msgstr "Skrót do otwarcia menu programu."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
||||
msgid "Keybinding to toggle the visibility of the message tray"
|
||||
msgstr "Skrót do przełączenia widoczności obszaru powiadamiania"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
||||
msgid "Keybinding to toggle the visibility of the message tray."
|
||||
msgstr "Skrót do przełączenia widoczności obszaru powiadamiania."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
|
||||
msgid "Keybinding to toggle the screen recorder"
|
||||
msgstr "Skrót do przełączenia nagrywania ekranu"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
||||
msgid "Keybinding to start/stop the builtin screen recorder."
|
||||
msgstr "Skrót do uruchomienia/zatrzymania wbudowanego nagrywania ekranu."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
||||
msgid "Which keyboard to use"
|
||||
msgstr "Której klawiatury używać"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
||||
msgid "The type of keyboard to use."
|
||||
msgstr "Typ używanej klawiatury."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
||||
msgid "Framerate used for recording screencasts."
|
||||
msgstr "Liczba klatek na sekundę do nagrywania ekranu."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
|
||||
msgid ""
|
||||
"The framerate of the resulting screencast recordered by GNOME Shell's "
|
||||
"screencast recorder in frames-per-second."
|
||||
msgstr "Liczba klatek na sekundę wynikowego nagrania ekranu."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
||||
msgid "The gstreamer pipeline used to encode the screencast"
|
||||
msgstr "Potok biblioteki GStreamer używany do zakodowania nagrania ekranu"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
||||
#, no-c-format
|
||||
msgid ""
|
||||
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
|
||||
@ -222,11 +234,11 @@ msgstr ""
|
||||
"i nagrywa do formatu WebM używając kodeka VP8. %T jest zamieniane na "
|
||||
"odgadniętą optymalną liczbę wątków dla komputera."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
|
||||
msgid "File extension used for storing the screencast"
|
||||
msgstr "Rozszerzenie pliku używane do przechowywania nagrań ekranu"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
|
||||
msgid ""
|
||||
"The filename for recorded screencasts will be a unique filename based on the "
|
||||
"current date, and use this extension. It should be changed when recording to "
|
||||
@ -252,11 +264,11 @@ msgstr ""
|
||||
"Proszę wybrać rozszerzenie do skonfigurowania używając powyższego pola "
|
||||
"wyboru."
|
||||
|
||||
#: ../js/gdm/loginDialog.js:528
|
||||
#: ../js/gdm/loginDialog.js:529
|
||||
msgid "Session..."
|
||||
msgstr "Sesja..."
|
||||
|
||||
#: ../js/gdm/loginDialog.js:676
|
||||
#: ../js/gdm/loginDialog.js:677
|
||||
msgctxt "title"
|
||||
msgid "Sign In"
|
||||
msgstr "Proszę się zalogować"
|
||||
@ -264,23 +276,23 @@ msgstr "Proszę się zalogować"
|
||||
#. 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:743
|
||||
#: ../js/gdm/loginDialog.js:736
|
||||
msgid "Not listed?"
|
||||
msgstr "Inny użytkownik?"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:896 ../js/ui/components/networkAgent.js:137
|
||||
#: ../js/gdm/loginDialog.js:889 ../js/ui/components/networkAgent.js:137
|
||||
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373
|
||||
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:396
|
||||
#: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:166
|
||||
#: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:167
|
||||
msgid "Cancel"
|
||||
msgstr "Anuluj"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:901
|
||||
#: ../js/gdm/loginDialog.js:894
|
||||
msgctxt "button"
|
||||
msgid "Sign In"
|
||||
msgstr "Zaloguj"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:1240
|
||||
#: ../js/gdm/loginDialog.js:1215
|
||||
msgid "Login Window"
|
||||
msgstr "Okno logowania"
|
||||
|
||||
@ -289,8 +301,8 @@ msgstr "Okno logowania"
|
||||
msgid "Power"
|
||||
msgstr "Zasilanie"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:89 ../js/ui/userMenu.js:663 ../js/ui/userMenu.js:667
|
||||
#: ../js/ui/userMenu.js:778
|
||||
#: ../js/gdm/powerMenu.js:89 ../js/ui/userMenu.js:664 ../js/ui/userMenu.js:668
|
||||
#: ../js/ui/userMenu.js:779
|
||||
msgid "Suspend"
|
||||
msgstr "Uśpij"
|
||||
|
||||
@ -298,8 +310,8 @@ msgstr "Uśpij"
|
||||
msgid "Restart"
|
||||
msgstr "Uruchom ponownie"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:99 ../js/ui/userMenu.js:665 ../js/ui/userMenu.js:667
|
||||
#: ../js/ui/userMenu.js:777
|
||||
#: ../js/gdm/powerMenu.js:99 ../js/ui/userMenu.js:666 ../js/ui/userMenu.js:668
|
||||
#: ../js/ui/userMenu.js:778
|
||||
msgid "Power Off"
|
||||
msgstr "Wyłącz komputer"
|
||||
|
||||
@ -350,7 +362,7 @@ msgstr "Ustawienia"
|
||||
msgid "New Window"
|
||||
msgstr "Nowe okno"
|
||||
|
||||
#: ../js/ui/appDisplay.js:678 ../js/ui/dash.js:271
|
||||
#: ../js/ui/appDisplay.js:678 ../js/ui/dash.js:290
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Usuń z ulubionych"
|
||||
|
||||
@ -514,16 +526,16 @@ msgstr "Ten tydzień"
|
||||
msgid "Next week"
|
||||
msgstr "Następny tydzień"
|
||||
|
||||
#: ../js/ui/components/autorunManager.js:278
|
||||
#: ../js/ui/components/autorunManager.js:297
|
||||
msgid "Removable Devices"
|
||||
msgstr "Urządzenia wymienne"
|
||||
|
||||
#: ../js/ui/components/autorunManager.js:575
|
||||
#: ../js/ui/components/autorunManager.js:594
|
||||
#, c-format
|
||||
msgid "Open with %s"
|
||||
msgstr "Otwórz za pomocą %s"
|
||||
|
||||
#: ../js/ui/components/autorunManager.js:601
|
||||
#: ../js/ui/components/autorunManager.js:620
|
||||
msgid "Eject"
|
||||
msgstr "Wysuń"
|
||||
|
||||
@ -680,35 +692,35 @@ msgstr "Wycisz"
|
||||
#. 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/components/telepathyClient.js:948
|
||||
#: ../js/ui/components/telepathyClient.js:950
|
||||
#, no-c-format
|
||||
msgid "Sent at <b>%X</b> on <b>%A</b>"
|
||||
msgstr "Wysłano w dniu <b>%e %b</b> o godzinie <b>%H:%M</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/components/telepathyClient.js:954
|
||||
#: ../js/ui/components/telepathyClient.js:956
|
||||
#, no-c-format
|
||||
msgid "Sent on <b>%A</b>, <b>%B %d</b>"
|
||||
msgstr "Wysłano w dniu <b>%d %B</b>, <b>%A</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/components/telepathyClient.js:959
|
||||
#: ../js/ui/components/telepathyClient.js:961
|
||||
#, no-c-format
|
||||
msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y"
|
||||
msgstr "Wysłano w dniu <b>%d %B</b> %Y, <b>%A</b>"
|
||||
|
||||
#. Translators: this is the other person changing their old IM name to their new
|
||||
#. IM name.
|
||||
#: ../js/ui/components/telepathyClient.js:988
|
||||
#: ../js/ui/components/telepathyClient.js:990
|
||||
#, c-format
|
||||
msgid "%s is now known as %s"
|
||||
msgstr "Użytkownik %s jest teraz znany jako %s"
|
||||
|
||||
#. translators: argument is a room name like
|
||||
#. * room@jabber.org for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1088
|
||||
#: ../js/ui/components/telepathyClient.js:1090
|
||||
#, c-format
|
||||
msgid "Invitation to %s"
|
||||
msgstr "Zaproszenie do pokoju %s"
|
||||
@ -716,42 +728,42 @@ msgstr "Zaproszenie do pokoju %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/components/telepathyClient.js:1096
|
||||
#: ../js/ui/components/telepathyClient.js:1098
|
||||
#, c-format
|
||||
msgid "%s is inviting you to join %s"
|
||||
msgstr "Użytkownik %s zaprasza do dołączenia do pokoju %s"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1098
|
||||
#: ../js/ui/components/telepathyClient.js:1177
|
||||
#: ../js/ui/components/telepathyClient.js:1240
|
||||
#: ../js/ui/components/telepathyClient.js:1100
|
||||
#: ../js/ui/components/telepathyClient.js:1179
|
||||
#: ../js/ui/components/telepathyClient.js:1242
|
||||
msgid "Decline"
|
||||
msgstr "Odmów"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1099
|
||||
#: ../js/ui/components/telepathyClient.js:1178
|
||||
#: ../js/ui/components/telepathyClient.js:1241
|
||||
#: ../js/ui/components/telepathyClient.js:1101
|
||||
#: ../js/ui/components/telepathyClient.js:1180
|
||||
#: ../js/ui/components/telepathyClient.js:1243
|
||||
msgid "Accept"
|
||||
msgstr "Zaakceptuj"
|
||||
|
||||
#. translators: argument is a contact name like Alice for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1129
|
||||
#: ../js/ui/components/telepathyClient.js:1131
|
||||
#, c-format
|
||||
msgid "Video call from %s"
|
||||
msgstr "Wideorozmowa z użytkownikiem %s"
|
||||
|
||||
#. translators: argument is a contact name like Alice for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1132
|
||||
#: ../js/ui/components/telepathyClient.js:1134
|
||||
#, c-format
|
||||
msgid "Call from %s"
|
||||
msgstr "Rozmowa z użytkownikiem %s"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1137
|
||||
#: ../js/ui/components/telepathyClient.js:1139
|
||||
#: ../js/ui/status/bluetooth.js:346
|
||||
msgid "Reject"
|
||||
msgstr "Odrzuć"
|
||||
|
||||
#. translators: this is a button label (verb), not a noun
|
||||
#: ../js/ui/components/telepathyClient.js:1139
|
||||
#: ../js/ui/components/telepathyClient.js:1141
|
||||
msgid "Answer"
|
||||
msgstr "Odbierz"
|
||||
|
||||
@ -760,111 +772,111 @@ msgstr "Odbierz"
|
||||
#. * file name. The string will be something
|
||||
#. * like: "Alice is sending you test.ogg"
|
||||
#.
|
||||
#: ../js/ui/components/telepathyClient.js:1171
|
||||
#: ../js/ui/components/telepathyClient.js:1173
|
||||
#, c-format
|
||||
msgid "%s is sending you %s"
|
||||
msgstr "Użytkownik %s przysyła plik %s"
|
||||
|
||||
#. To translators: The parameter is the contact's alias
|
||||
#: ../js/ui/components/telepathyClient.js:1206
|
||||
#: ../js/ui/components/telepathyClient.js:1208
|
||||
#, c-format
|
||||
msgid "%s would like permission to see when you are online"
|
||||
msgstr "Użytkownik %s prosi o uprawnienie do wyświetlania stanu"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1298
|
||||
#: ../js/ui/components/telepathyClient.js:1300
|
||||
msgid "Network error"
|
||||
msgstr "Błąd sieci"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1300
|
||||
#: ../js/ui/components/telepathyClient.js:1302
|
||||
msgid "Authentication failed"
|
||||
msgstr "Uwierzytelnienie się nie powiodło"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1302
|
||||
#: ../js/ui/components/telepathyClient.js:1304
|
||||
msgid "Encryption error"
|
||||
msgstr "Błąd szyfrowania"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1304
|
||||
#: ../js/ui/components/telepathyClient.js:1306
|
||||
msgid "Certificate not provided"
|
||||
msgstr "Nie podano certyfikatu"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1306
|
||||
#: ../js/ui/components/telepathyClient.js:1308
|
||||
msgid "Certificate untrusted"
|
||||
msgstr "Certyfikat jest niezaufany"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1308
|
||||
#: ../js/ui/components/telepathyClient.js:1310
|
||||
msgid "Certificate expired"
|
||||
msgstr "Certyfikat wygasł"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1310
|
||||
#: ../js/ui/components/telepathyClient.js:1312
|
||||
msgid "Certificate not activated"
|
||||
msgstr "Certyfikat nie został aktywowany"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1312
|
||||
#: ../js/ui/components/telepathyClient.js:1314
|
||||
msgid "Certificate hostname mismatch"
|
||||
msgstr "Nazwa komputera certyfikatu się nie zgadza"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1314
|
||||
#: ../js/ui/components/telepathyClient.js:1316
|
||||
msgid "Certificate fingerprint mismatch"
|
||||
msgstr "Odcisk palca certyfikatu się nie zgadza"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1316
|
||||
#: ../js/ui/components/telepathyClient.js:1318
|
||||
msgid "Certificate self-signed"
|
||||
msgstr "Certyfikat został samodzielnie podpisany"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1318
|
||||
#: ../js/ui/components/telepathyClient.js:1320
|
||||
msgid "Status is set to offline"
|
||||
msgstr "Stan jest ustawiony na offline"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1320
|
||||
#: ../js/ui/components/telepathyClient.js:1322
|
||||
msgid "Encryption is not available"
|
||||
msgstr "Szyfrowanie jest niedostępne"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1322
|
||||
#: ../js/ui/components/telepathyClient.js:1324
|
||||
msgid "Certificate is invalid"
|
||||
msgstr "Certyfikat jest nieprawidłowy"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1324
|
||||
#: ../js/ui/components/telepathyClient.js:1326
|
||||
msgid "Connection has been refused"
|
||||
msgstr "Odrzucono połączenie"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1326
|
||||
#: ../js/ui/components/telepathyClient.js:1328
|
||||
msgid "Connection can't be established"
|
||||
msgstr "Nie można nawiązać połączenia"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1328
|
||||
#: ../js/ui/components/telepathyClient.js:1330
|
||||
msgid "Connection has been lost"
|
||||
msgstr "Utracono połączenie"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1330
|
||||
#: ../js/ui/components/telepathyClient.js:1332
|
||||
msgid "This account is already connected to the server"
|
||||
msgstr "To konto jest już połączone z serwerem"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1332
|
||||
#: ../js/ui/components/telepathyClient.js:1334
|
||||
msgid ""
|
||||
"Connection has been replaced by a new connection using the same resource"
|
||||
msgstr ""
|
||||
"Połączenie zostało zastąpione nowym z wykorzystaniem tego samego zasobu"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1334
|
||||
#: ../js/ui/components/telepathyClient.js:1336
|
||||
msgid "The account already exists on the server"
|
||||
msgstr "Konto już istnieje na serwerze"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1336
|
||||
#: ../js/ui/components/telepathyClient.js:1338
|
||||
msgid "Server is currently too busy to handle the connection"
|
||||
msgstr "Serwer jest obecnie zbyt zajęty, aby obsłużyć połączenie"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1338
|
||||
#: ../js/ui/components/telepathyClient.js:1340
|
||||
msgid "Certificate has been revoked"
|
||||
msgstr "Certyfikat został unieważniony"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1340
|
||||
#: ../js/ui/components/telepathyClient.js:1342
|
||||
msgid ""
|
||||
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
|
||||
msgstr ""
|
||||
"Certyfikat używa niezabezpieczonego algorytmu szyfrowania lub jest "
|
||||
"kryptograficznie słaby"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1342
|
||||
#: ../js/ui/components/telepathyClient.js:1344
|
||||
msgid ""
|
||||
"The length of the server certificate, or the depth of the server certificate "
|
||||
"chain, exceed the limits imposed by the cryptography library"
|
||||
@ -872,30 +884,30 @@ msgstr ""
|
||||
"Długość certyfikatu serwera lub głębokość jego łańcucha przekracza "
|
||||
"ograniczenia nałożone przez bibliotekę kryptograficzną"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1344
|
||||
#: ../js/ui/components/telepathyClient.js:1346
|
||||
msgid "Internal error"
|
||||
msgstr "Błąd wewnętrzny"
|
||||
|
||||
#. translators: argument is the account name, like
|
||||
#. * name@jabber.org for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1354
|
||||
#: ../js/ui/components/telepathyClient.js:1356
|
||||
#, c-format
|
||||
msgid "Connection to %s failed"
|
||||
msgstr "Połączenie z kontem %s się nie powiodło"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1363
|
||||
#: ../js/ui/components/telepathyClient.js:1365
|
||||
msgid "Reconnect"
|
||||
msgstr "Połącz ponownie"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1364
|
||||
#: ../js/ui/components/telepathyClient.js:1366
|
||||
msgid "Edit account"
|
||||
msgstr "Modyfikuj konto"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1409
|
||||
#: ../js/ui/components/telepathyClient.js:1411
|
||||
msgid "Unknown reason"
|
||||
msgstr "Nieznana przyczyna"
|
||||
|
||||
#: ../js/ui/dash.js:245 ../js/ui/dash.js:273
|
||||
#: ../js/ui/dash.js:253 ../js/ui/dash.js:292
|
||||
msgid "Show Applications"
|
||||
msgstr "Wyświetl programy"
|
||||
|
||||
@ -903,14 +915,14 @@ msgstr "Wyświetl programy"
|
||||
msgid "Date and Time Settings"
|
||||
msgstr "Ustawienia daty i czasu"
|
||||
|
||||
#: ../js/ui/dateMenu.js:109
|
||||
#: ../js/ui/dateMenu.js:111
|
||||
msgid "Open Calendar"
|
||||
msgstr "Otwórz kalendarz"
|
||||
|
||||
#. Translators: This is the date format to use when the calendar popup is
|
||||
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
|
||||
#.
|
||||
#: ../js/ui/dateMenu.js:175
|
||||
#: ../js/ui/dateMenu.js:201
|
||||
msgid "%A %B %e, %Y"
|
||||
msgstr "%A, %e %B %Y"
|
||||
|
||||
@ -1075,23 +1087,23 @@ msgstr "Wyświetl źródło"
|
||||
msgid "Web Page"
|
||||
msgstr "Strona WWW"
|
||||
|
||||
#: ../js/ui/messageTray.js:1081
|
||||
#: ../js/ui/messageTray.js:1084
|
||||
msgid "Open"
|
||||
msgstr "Otwórz"
|
||||
|
||||
#: ../js/ui/messageTray.js:1088
|
||||
#: ../js/ui/messageTray.js:1091
|
||||
msgid "Remove"
|
||||
msgstr "Usuń"
|
||||
|
||||
#: ../js/ui/messageTray.js:2088
|
||||
#: ../js/ui/messageTray.js:1543
|
||||
msgid "Message Tray"
|
||||
msgstr "Obszar powiadamiania"
|
||||
|
||||
#: ../js/ui/messageTray.js:2551
|
||||
#: ../js/ui/messageTray.js:2549
|
||||
msgid "System Information"
|
||||
msgstr "Informacje systemowe"
|
||||
|
||||
#: ../js/ui/notificationDaemon.js:506 ../src/shell-app.c:373
|
||||
#: ../js/ui/notificationDaemon.js:506 ../src/shell-app.c:374
|
||||
msgctxt "program"
|
||||
msgid "Unknown"
|
||||
msgstr "Nieznany"
|
||||
@ -1147,7 +1159,7 @@ msgstr "Proszę wprowadzić polecenie:"
|
||||
|
||||
#. Translators: This is a time format for a date in
|
||||
#. long format
|
||||
#: ../js/ui/screenShield.js:79
|
||||
#: ../js/ui/screenShield.js:80
|
||||
msgid "%A, %B %d"
|
||||
msgstr "%A, %e %B"
|
||||
|
||||
@ -1199,7 +1211,7 @@ msgstr "Hasło"
|
||||
msgid "Remember Password"
|
||||
msgstr "Zapamiętanie hasła"
|
||||
|
||||
#: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:169
|
||||
#: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:170
|
||||
msgid "Unlock"
|
||||
msgstr "Odblokuj"
|
||||
|
||||
@ -1614,67 +1626,63 @@ msgstr "Głośność"
|
||||
msgid "Microphone"
|
||||
msgstr "Mikrofon"
|
||||
|
||||
#: ../js/ui/unlockDialog.js:176
|
||||
#: ../js/ui/unlockDialog.js:177
|
||||
msgid "Log in as another user"
|
||||
msgstr "Zaloguj jako inny użytkownik"
|
||||
|
||||
#: ../js/ui/userMenu.js:180
|
||||
#: ../js/ui/userMenu.js:181
|
||||
msgid "Available"
|
||||
msgstr "Dostępny"
|
||||
|
||||
#: ../js/ui/userMenu.js:183
|
||||
#: ../js/ui/userMenu.js:184
|
||||
msgid "Busy"
|
||||
msgstr "Zajęty"
|
||||
|
||||
#: ../js/ui/userMenu.js:186
|
||||
#: ../js/ui/userMenu.js:187
|
||||
msgid "Invisible"
|
||||
msgstr "Niewidoczny"
|
||||
|
||||
#: ../js/ui/userMenu.js:189
|
||||
#: ../js/ui/userMenu.js:190
|
||||
msgid "Away"
|
||||
msgstr "Nieobecny"
|
||||
|
||||
#: ../js/ui/userMenu.js:192
|
||||
#: ../js/ui/userMenu.js:193
|
||||
msgid "Idle"
|
||||
msgstr "Bezczynny"
|
||||
|
||||
#: ../js/ui/userMenu.js:195
|
||||
#: ../js/ui/userMenu.js:196
|
||||
msgid "Unavailable"
|
||||
msgstr "Niedostępny"
|
||||
|
||||
#: ../js/ui/userMenu.js:618 ../js/ui/userMenu.js:759
|
||||
msgid "Switch User"
|
||||
msgstr "Przełącz użytkownika"
|
||||
|
||||
#: ../js/ui/userMenu.js:619
|
||||
msgid "Switch Session"
|
||||
msgstr "Przełącz sesję"
|
||||
|
||||
#: ../js/ui/userMenu.js:743
|
||||
#: ../js/ui/userMenu.js:744
|
||||
msgid "Notifications"
|
||||
msgstr "Powiadomienia"
|
||||
|
||||
#: ../js/ui/userMenu.js:751
|
||||
#: ../js/ui/userMenu.js:752
|
||||
msgid "System Settings"
|
||||
msgstr "Ustawienia systemu"
|
||||
|
||||
#: ../js/ui/userMenu.js:764
|
||||
#: ../js/ui/userMenu.js:760
|
||||
msgid "Switch User"
|
||||
msgstr "Przełącz użytkownika"
|
||||
|
||||
#: ../js/ui/userMenu.js:765
|
||||
msgid "Log Out"
|
||||
msgstr "Wyloguj się"
|
||||
|
||||
#: ../js/ui/userMenu.js:769
|
||||
#: ../js/ui/userMenu.js:770
|
||||
msgid "Lock"
|
||||
msgstr "Zablokuj ekran"
|
||||
|
||||
#: ../js/ui/userMenu.js:784
|
||||
#: ../js/ui/userMenu.js:785
|
||||
msgid "Install Updates & Restart"
|
||||
msgstr "Zaktualizuj i uruchom ponownie"
|
||||
|
||||
#: ../js/ui/userMenu.js:802
|
||||
#: ../js/ui/userMenu.js:803
|
||||
msgid "Your chat status will be set to busy"
|
||||
msgstr "Stan komunikatora zostanie ustawiony na \"zajęty\""
|
||||
|
||||
#: ../js/ui/userMenu.js:803
|
||||
#: ../js/ui/userMenu.js:804
|
||||
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."
|
||||
@ -1696,7 +1704,7 @@ msgstr "Programy"
|
||||
msgid "Search"
|
||||
msgstr "Wyszukiwanie"
|
||||
|
||||
#: ../js/ui/wanda.js:119
|
||||
#: ../js/ui/wanda.js:117
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Sorry, no wisdom for you today:\n"
|
||||
@ -1705,12 +1713,12 @@ msgstr ""
|
||||
"Nic mądrego na dzisiaj:\n"
|
||||
"%s"
|
||||
|
||||
#: ../js/ui/wanda.js:123
|
||||
#: ../js/ui/wanda.js:121
|
||||
#, c-format
|
||||
msgid "%s the Oracle says"
|
||||
msgstr "Wyrocznia %s przemawia"
|
||||
|
||||
#: ../js/ui/wanda.js:164
|
||||
#: ../js/ui/wanda.js:162
|
||||
msgid "Your favorite Easter Egg"
|
||||
msgstr "Twój ulubiony żart"
|
||||
|
||||
@ -1747,23 +1755,23 @@ msgstr[2] "%u wejść"
|
||||
msgid "System Sounds"
|
||||
msgstr "Dźwięki systemowe"
|
||||
|
||||
#: ../src/main.c:330
|
||||
#: ../src/main.c:332
|
||||
msgid "Print version"
|
||||
msgstr "Wyświetla wersję"
|
||||
|
||||
#: ../src/main.c:336
|
||||
#: ../src/main.c:338
|
||||
msgid "Mode used by GDM for login screen"
|
||||
msgstr "Tryb używany przez GDM dla ekranu logowania"
|
||||
|
||||
#: ../src/main.c:342
|
||||
#: ../src/main.c:344
|
||||
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
|
||||
msgstr "Używa podanego trybu, np. \"gdm\" dla ekranu logowania"
|
||||
|
||||
#: ../src/main.c:348
|
||||
#: ../src/main.c:350
|
||||
msgid "List possible modes"
|
||||
msgstr "Wyświetla listę możliwych trybów"
|
||||
|
||||
#: ../src/shell-app.c:621
|
||||
#: ../src/shell-app.c:622
|
||||
#, c-format
|
||||
msgid "Failed to launch '%s'"
|
||||
msgstr "Uruchomienie \"%s\" się nie powiodło"
|
||||
|
296
po/sk.po
296
po/sk.po
@ -10,8 +10,8 @@ msgstr ""
|
||||
"Project-Id-Version: gnome-shell\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-10-18 16:51+0000\n"
|
||||
"PO-Revision-Date: 2012-10-13 22:35+0100\n"
|
||||
"POT-Creation-Date: 2012-10-27 16:22+0000\n"
|
||||
"PO-Revision-Date: 2012-10-28 19:49+0000\n"
|
||||
"Last-Translator: Dušan Kazik <prescott66@gmail.com>\n"
|
||||
"Language-Team: Slovak <gnome-sk-list@gnome.org>\n"
|
||||
"Language: sk\n"
|
||||
@ -25,8 +25,6 @@ msgstr ""
|
||||
msgid "Screenshots"
|
||||
msgstr "Snímky obrazovky"
|
||||
|
||||
# PM: inde dianie na obrazovke
|
||||
# DK:presne taketo nieco som chcel povedat ale nevedel som ako
|
||||
#: ../data/50-gnome-shell-screenshot.xml.in.h:2
|
||||
msgid "Record a screencast"
|
||||
msgstr "Zaznamenať dianie na obrazovke"
|
||||
@ -37,20 +35,16 @@ msgstr "Systém"
|
||||
|
||||
#: ../data/50-gnome-shell-system.xml.in.h:2
|
||||
msgid "Show the message tray"
|
||||
msgstr "Zobraziť lištu správ"
|
||||
msgstr "Zobrazí lištu správ"
|
||||
|
||||
# tooltip
|
||||
#: ../data/50-gnome-shell-system.xml.in.h:3
|
||||
#, fuzzy
|
||||
#| msgid "Show Applications"
|
||||
msgid "Show all applications"
|
||||
msgstr "Zobrazí aplikácie"
|
||||
msgstr "Zobrazí všetky aplikácie"
|
||||
|
||||
#: ../data/50-gnome-shell-system.xml.in.h:4
|
||||
#, fuzzy
|
||||
#| msgid "Keybinding to open the application menu"
|
||||
msgid "Open the application menu"
|
||||
msgstr "Klávesová skratka na otvorenie ponuky aplikácií"
|
||||
msgstr "Otvorí ponuku aplikácií"
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:1
|
||||
msgid "GNOME Shell"
|
||||
@ -85,13 +79,9 @@ msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:3
|
||||
msgid "Uuids of extensions to enable"
|
||||
msgstr "Uuid identifikátory rozšírení určených na povolenie"
|
||||
msgstr "Vlastnosť uuid rozšírení určených na povolenie"
|
||||
|
||||
# PM: nepáči sa mi konštrukcia viet, preklad vyznieva strojovo
|
||||
# DK: uz lepsie?
|
||||
# PM: lepšie ale nepáči sa mi org.gnome.Shell. mne sa vidí že to bude nejaký súbor a potom predložka na asi nebude dobre
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:4
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"GNOME Shell extensions have a uuid property; this key lists extensions which "
|
||||
"should be loaded. Any extension that wants to be loaded needs to be in this "
|
||||
@ -101,7 +91,7 @@ msgstr ""
|
||||
"Rozšírenia pre GNOME Shell majú vlastnosť uuid; tento kľúč obsahuje zoznam "
|
||||
"rozšírení, ktoré by mali byť načítané. Každé rozšírenie, ktoré je potrebné "
|
||||
"načítať, musí byť v tomto zozname. Tento zoznam môžete upraviť aj ručne "
|
||||
"pomocou metód DBus EnableExtension a DisableExtension na org.gnome.Shell."
|
||||
"pomocou metód DBus EnableExtension a DisableExtension v org.gnome.Shell."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:5
|
||||
msgid "Whether to collect stats about applications usage"
|
||||
@ -176,17 +166,15 @@ msgid "Keybinding to open the application menu."
|
||||
msgstr "Klávesová skratka na otvorenie ponuky aplikácií."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
|
||||
#, fuzzy
|
||||
#| msgid "Keybinding to open the application menu"
|
||||
msgid "Keybinding to open the \"Show Applications\" view"
|
||||
msgstr "Klávesová skratka na otvorenie ponuky aplikácií"
|
||||
msgstr "Klávesová skratka na otvorenie pohľadu „Zobraziť aplikácie“"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
|
||||
#, fuzzy
|
||||
#| msgid "Keybinding to open the application menu."
|
||||
msgid ""
|
||||
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
|
||||
msgstr "Klávesová skratka na otvorenie ponuky aplikácií."
|
||||
msgstr ""
|
||||
"Klávesová skratka na otvorenie pohľadu „Zobraziť aplikácie“ v prehľade "
|
||||
"aktivít."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
||||
msgid "Keybinding to toggle the visibility of the message tray"
|
||||
@ -211,7 +199,7 @@ msgstr "Ktorú klávesnicu používať"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
||||
msgid "The type of keyboard to use."
|
||||
msgstr "Typ klávesnice, ktorý sa má používať."
|
||||
msgstr "Typ klávesnice, ktorá sa má používať."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
||||
msgid "Framerate used for recording screencasts."
|
||||
@ -273,6 +261,39 @@ msgstr ""
|
||||
"základe aktuálneho dátumu a použije túto príponu. Pri nahrávaní do iného "
|
||||
"formátu kontajneru by mala byť zmenená."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
|
||||
msgid "Attach modal dialog to the parent window"
|
||||
msgstr "Pripojiť modálne dialógové okno k rodičovskému oknu"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
|
||||
msgid ""
|
||||
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
|
||||
msgstr "Tento kľúč preváži kľúč v org.gnome.mutter po spustení GNOME Shell."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
|
||||
msgid "Arrangement of buttons on the titlebar"
|
||||
msgstr "Usporiadanie tlačidiel na titulku okna"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
|
||||
msgid ""
|
||||
"This key overrides the key in org.gnome.desktop.wm.preferences when running "
|
||||
"GNOME Shell."
|
||||
msgstr ""
|
||||
"Tento kľúč preváži kľúč v org.gnome.desktop.wm.preferences po spustení GNOME "
|
||||
"Shell."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
|
||||
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
|
||||
msgid "Workspaces are managed dynamically"
|
||||
msgstr "Pracovné priestory sú spravované dynamicky"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
|
||||
msgid "Workspaces only on primary monitor"
|
||||
msgstr "Pracovné priestory sú iba na primárnom monitore"
|
||||
|
||||
#: ../js/extensionPrefs/main.js:124
|
||||
#, c-format
|
||||
msgid "There was an error loading the preferences dialog for %s:"
|
||||
@ -286,11 +307,11 @@ msgstr "Rozšírenie"
|
||||
msgid "Select an extension to configure using the combobox above."
|
||||
msgstr "Použitím ponuky vyberte rozšírenie na nastavenie"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:529
|
||||
#: ../js/gdm/loginDialog.js:560
|
||||
msgid "Session..."
|
||||
msgstr "Relácia..."
|
||||
|
||||
#: ../js/gdm/loginDialog.js:677
|
||||
#: ../js/gdm/loginDialog.js:704
|
||||
msgctxt "title"
|
||||
msgid "Sign In"
|
||||
msgstr "Prihlásenie"
|
||||
@ -299,42 +320,42 @@ msgstr "Prihlásenie"
|
||||
#. 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:736
|
||||
#: ../js/gdm/loginDialog.js:763
|
||||
msgid "Not listed?"
|
||||
msgstr "Nie ste v zozname?"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:889 ../js/ui/components/networkAgent.js:137
|
||||
#: ../js/gdm/loginDialog.js:901 ../js/ui/components/networkAgent.js:137
|
||||
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373
|
||||
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:396
|
||||
#: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:167
|
||||
#: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:168
|
||||
msgid "Cancel"
|
||||
msgstr "Zrušiť"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:894
|
||||
#: ../js/gdm/loginDialog.js:906
|
||||
msgctxt "button"
|
||||
msgid "Sign In"
|
||||
msgstr "Prihlásiť sa"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:1215
|
||||
#: ../js/gdm/loginDialog.js:1217
|
||||
msgid "Login Window"
|
||||
msgstr "Prihlasovacie okno"
|
||||
|
||||
#. Translators: accessible name of the power menu in the login screen
|
||||
#: ../js/gdm/powerMenu.js:37
|
||||
#: ../js/gdm/powerMenu.js:36
|
||||
msgid "Power"
|
||||
msgstr "Napájanie"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:95 ../js/ui/userMenu.js:655 ../js/ui/userMenu.js:659
|
||||
#: ../js/ui/userMenu.js:770
|
||||
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:663 ../js/ui/userMenu.js:667
|
||||
#: ../js/ui/userMenu.js:778
|
||||
msgid "Suspend"
|
||||
msgstr "Uspať"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:100
|
||||
#: ../js/gdm/powerMenu.js:98
|
||||
msgid "Restart"
|
||||
msgstr "Reštartovať"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:105 ../js/ui/userMenu.js:657
|
||||
#: ../js/ui/userMenu.js:659 ../js/ui/userMenu.js:769
|
||||
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:665
|
||||
#: ../js/ui/userMenu.js:667 ../js/ui/userMenu.js:777
|
||||
msgid "Power Off"
|
||||
msgstr "Vypnúť"
|
||||
|
||||
@ -517,35 +538,35 @@ msgid "S"
|
||||
msgstr "So"
|
||||
|
||||
#. Translators: Text to show if there are no events
|
||||
#: ../js/ui/calendar.js:699
|
||||
#: ../js/ui/calendar.js:700
|
||||
msgid "Nothing Scheduled"
|
||||
msgstr "Žiadne naplánované udalosti"
|
||||
|
||||
#. Translators: Shown on calendar heading when selected day occurs on current year
|
||||
#: ../js/ui/calendar.js:715
|
||||
#: ../js/ui/calendar.js:716
|
||||
msgctxt "calendar heading"
|
||||
msgid "%A, %B %d"
|
||||
msgstr "%A, %e. %B"
|
||||
|
||||
#. Translators: Shown on calendar heading when selected day occurs on different year
|
||||
#: ../js/ui/calendar.js:718
|
||||
#: ../js/ui/calendar.js:719
|
||||
msgctxt "calendar heading"
|
||||
msgid "%A, %B %d, %Y"
|
||||
msgstr "%A, %e. %B %Y"
|
||||
|
||||
#: ../js/ui/calendar.js:728
|
||||
#: ../js/ui/calendar.js:729
|
||||
msgid "Today"
|
||||
msgstr "Dnes"
|
||||
|
||||
#: ../js/ui/calendar.js:732
|
||||
#: ../js/ui/calendar.js:733
|
||||
msgid "Tomorrow"
|
||||
msgstr "Zajtra"
|
||||
|
||||
#: ../js/ui/calendar.js:743
|
||||
#: ../js/ui/calendar.js:744
|
||||
msgid "This week"
|
||||
msgstr "Tento týždeň"
|
||||
|
||||
#: ../js/ui/calendar.js:751
|
||||
#: ../js/ui/calendar.js:752
|
||||
msgid "Next week"
|
||||
msgstr "Ďalší týždeň"
|
||||
|
||||
@ -553,10 +574,11 @@ msgstr "Ďalší týždeň"
|
||||
msgid "Removable Devices"
|
||||
msgstr "Vymeniteľné zariadenia"
|
||||
|
||||
# DK: doplnil som slovo "programu", aby to znelo prirodzenejsie. priklad:po pripojeni USB kluca bolo zobrazene "Otvoriť pomocou Súbory"
|
||||
#: ../js/ui/components/autorunManager.js:591
|
||||
#, c-format
|
||||
msgid "Open with %s"
|
||||
msgstr "Otvoriť pomocou %s"
|
||||
msgstr "Otvoriť pomocou programu %s"
|
||||
|
||||
#: ../js/ui/components/autorunManager.js:617
|
||||
msgid "Eject"
|
||||
@ -623,7 +645,7 @@ msgstr ""
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:314
|
||||
msgid "Wired 802.1X authentication"
|
||||
msgstr "Overenie totožnosti drôtovej 802.1X"
|
||||
msgstr "Overenie totožnosti k drôtovej sieti 802.1X"
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:316
|
||||
msgid "Network name: "
|
||||
@ -631,7 +653,7 @@ msgstr "Názov siete: "
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:321
|
||||
msgid "DSL authentication"
|
||||
msgstr "Overenie totožnosti DSL"
|
||||
msgstr "Overenie totožnosti k DSL"
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:328
|
||||
msgid "PIN code required"
|
||||
@ -639,7 +661,7 @@ msgstr "Požaduje sa kód PIN"
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:329
|
||||
msgid "PIN code is needed for the mobile broadband device"
|
||||
msgstr "Pre zariadenie mobilnej siete je potrebný PIN kód"
|
||||
msgstr "Pre zariadenie mobilnej siete je potrebný kód PIN"
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:330
|
||||
msgid "PIN: "
|
||||
@ -647,7 +669,7 @@ msgstr "PIN: "
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:336
|
||||
msgid "Mobile broadband network password"
|
||||
msgstr "Heslo pre mobilnú sieť"
|
||||
msgstr "Heslo k mobilnej sieti"
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:337
|
||||
#, c-format
|
||||
@ -675,11 +697,12 @@ msgstr "Overiť totožnosť"
|
||||
msgid "Sorry, that didn't work. Please try again."
|
||||
msgstr "Prepáčte, ale nezabralo to. Skúste to, prosím, znova."
|
||||
|
||||
# %d je datum, %t je cas
|
||||
#. Translators: this is a filename used for screencast recording
|
||||
#: ../js/ui/components/recorder.js:44
|
||||
#, no-c-format
|
||||
msgid "Screencast from %d %t"
|
||||
msgstr "Záznam videa obrazovky z %d %t"
|
||||
msgstr "Záznam videa obrazovky dňa %d o %t"
|
||||
|
||||
#. FIXME: We don't have a 'chat room' icon (bgo #653737) use
|
||||
#. system-users for now as Empathy does.
|
||||
@ -714,44 +737,42 @@ msgid "Mute"
|
||||
msgstr "Stlmiť"
|
||||
|
||||
#. Translators: this is a time format string followed by the word "Yesterday". i.e. "14:30 on Yesterday"
|
||||
#: ../js/ui/components/telepathyClient.js:941
|
||||
#: ../js/ui/components/telepathyClient.js:943
|
||||
#, no-c-format
|
||||
msgid "<b>%H:%M</b> on Yesterday"
|
||||
msgstr ""
|
||||
msgstr "včera o <b>%H:%M</b>"
|
||||
|
||||
#. Translators: this is a time format string followed by a week day name. i.e. "14:30 on Monday
|
||||
#: ../js/ui/components/telepathyClient.js:947
|
||||
#, fuzzy, no-c-format
|
||||
#| msgid "Sent at <b>%X</b> on <b>%A</b>"
|
||||
#: ../js/ui/components/telepathyClient.js:949
|
||||
#, no-c-format
|
||||
msgid "<b>%H:%M</b> on <b>%A</b>"
|
||||
msgstr "Čas odoslania: <b>%A</b>, <b>%R</b>"
|
||||
msgstr "v <b>%A</b> o <b>%H:%M</b>"
|
||||
|
||||
#. Translators: this is a time format in the style of "14:30 on Wednesday, May 25",
|
||||
#. shown when you get a chat message in the same year
|
||||
#: ../js/ui/components/telepathyClient.js:953
|
||||
#, fuzzy, no-c-format
|
||||
#| msgid "Sent on <b>%A</b>, <b>%B %d</b>"
|
||||
#: ../js/ui/components/telepathyClient.js:955
|
||||
#, no-c-format
|
||||
msgid "<b>%H:%M</b> on <b>%A</b>, <b>%B</b> <b>%d</b>"
|
||||
msgstr "Čas odoslania: <b>%A</b>, <b>%e. %B</b>"
|
||||
msgstr "v <b>%A</b> o <b>%H:%M</b>, <b>%e.</b> <b>%B</b>"
|
||||
|
||||
#. Translators: this is a time format in the style of "14:30 on Wednesday, May 25, 2012",
|
||||
#. shown when you get a chat message in a different year
|
||||
#: ../js/ui/components/telepathyClient.js:958
|
||||
#, fuzzy, no-c-format
|
||||
#| msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y"
|
||||
#: ../js/ui/components/telepathyClient.js:960
|
||||
#, no-c-format
|
||||
msgid "<b>%H:%M</b> on <b>%A</b>, <b>%B</b> <b>%d</b>, %Y"
|
||||
msgstr "Čas odoslania: <b>%A</b>, <b>%e. %B</b> %Y"
|
||||
msgstr "v <b>%A</b> o <b>%H:%M</b>, <b>%e.</b> <b>%B</b>, %Y"
|
||||
|
||||
#. Translators: this is the other person changing their old IM name to their new
|
||||
#. IM name.
|
||||
#: ../js/ui/components/telepathyClient.js:986
|
||||
#: ../js/ui/components/telepathyClient.js:988
|
||||
#, c-format
|
||||
msgid "%s is now known as %s"
|
||||
msgstr "%s odteraz vystupuje ako %s"
|
||||
msgstr "Kontakt %s odteraz vystupuje ako %s"
|
||||
|
||||
|
||||
#. translators: argument is a room name like
|
||||
#. * room@jabber.org for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1085
|
||||
#: ../js/ui/components/telepathyClient.js:1087
|
||||
#, c-format
|
||||
msgid "Invitation to %s"
|
||||
msgstr "Pozvánka do %s"
|
||||
@ -759,42 +780,42 @@ msgstr "Pozvánka do %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/components/telepathyClient.js:1093
|
||||
#: ../js/ui/components/telepathyClient.js:1095
|
||||
#, c-format
|
||||
msgid "%s is inviting you to join %s"
|
||||
msgstr "%s vás pozýva aby ste sa pridali do %s"
|
||||
msgstr "Kontakt %s vás pozýva aby ste sa pridali do %s"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1095
|
||||
#: ../js/ui/components/telepathyClient.js:1174
|
||||
#: ../js/ui/components/telepathyClient.js:1237
|
||||
#: ../js/ui/components/telepathyClient.js:1097
|
||||
#: ../js/ui/components/telepathyClient.js:1176
|
||||
#: ../js/ui/components/telepathyClient.js:1239
|
||||
msgid "Decline"
|
||||
msgstr "Odmietnuť"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1096
|
||||
#: ../js/ui/components/telepathyClient.js:1175
|
||||
#: ../js/ui/components/telepathyClient.js:1238
|
||||
#: ../js/ui/components/telepathyClient.js:1098
|
||||
#: ../js/ui/components/telepathyClient.js:1177
|
||||
#: ../js/ui/components/telepathyClient.js:1240
|
||||
msgid "Accept"
|
||||
msgstr "Prijať"
|
||||
|
||||
#. translators: argument is a contact name like Alice for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1126
|
||||
#: ../js/ui/components/telepathyClient.js:1128
|
||||
#, c-format
|
||||
msgid "Video call from %s"
|
||||
msgstr "Videohovor od používateľa %s"
|
||||
msgstr "Videohovor od kontaktu %s"
|
||||
|
||||
#. translators: argument is a contact name like Alice for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1129
|
||||
#: ../js/ui/components/telepathyClient.js:1131
|
||||
#, c-format
|
||||
msgid "Call from %s"
|
||||
msgstr "Hovor od používateľa %s"
|
||||
msgstr "Hovor od kontaktu %s"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1134
|
||||
#: ../js/ui/components/telepathyClient.js:1136
|
||||
#: ../js/ui/status/bluetooth.js:346
|
||||
msgid "Reject"
|
||||
msgstr "Odmietnuť"
|
||||
|
||||
#. translators: this is a button label (verb), not a noun
|
||||
#: ../js/ui/components/telepathyClient.js:1136
|
||||
#: ../js/ui/components/telepathyClient.js:1138
|
||||
msgid "Answer"
|
||||
msgstr "Prijať hovor"
|
||||
|
||||
@ -803,110 +824,111 @@ msgstr "Prijať hovor"
|
||||
#. * file name. The string will be something
|
||||
#. * like: "Alice is sending you test.ogg"
|
||||
#.
|
||||
#: ../js/ui/components/telepathyClient.js:1168
|
||||
#: ../js/ui/components/telepathyClient.js:1170
|
||||
#, c-format
|
||||
msgid "%s is sending you %s"
|
||||
msgstr "%s vám posiela %s"
|
||||
msgstr "Kontakt %s vám posiela %s"
|
||||
|
||||
#. To translators: The parameter is the contact's alias
|
||||
#: ../js/ui/components/telepathyClient.js:1203
|
||||
#: ../js/ui/components/telepathyClient.js:1205
|
||||
#, c-format
|
||||
msgid "%s would like permission to see when you are online"
|
||||
msgstr "%s by chcel získať oprávnenie vidieť, kedy ste pripojený"
|
||||
msgstr ""
|
||||
"Kontakt %s by chcel získať oprávnenie vidieť, kedy ste pripojený"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1295
|
||||
#: ../js/ui/components/telepathyClient.js:1297
|
||||
msgid "Network error"
|
||||
msgstr "Chyba siete"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1297
|
||||
#: ../js/ui/components/telepathyClient.js:1299
|
||||
msgid "Authentication failed"
|
||||
msgstr "Overenie totožnosti zlyhalo"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1299
|
||||
#: ../js/ui/components/telepathyClient.js:1301
|
||||
msgid "Encryption error"
|
||||
msgstr "Chyba šifrovania"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1301
|
||||
#: ../js/ui/components/telepathyClient.js:1303
|
||||
msgid "Certificate not provided"
|
||||
msgstr "Neposkytnutý certifikát"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1303
|
||||
#: ../js/ui/components/telepathyClient.js:1305
|
||||
msgid "Certificate untrusted"
|
||||
msgstr "Nedôveryhodný certifikát"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1305
|
||||
#: ../js/ui/components/telepathyClient.js:1307
|
||||
msgid "Certificate expired"
|
||||
msgstr "Certifikát s ukončenou platnosťou"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1307
|
||||
#: ../js/ui/components/telepathyClient.js:1309
|
||||
msgid "Certificate not activated"
|
||||
msgstr "Neaktivovaný certifikát"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1309
|
||||
#: ../js/ui/components/telepathyClient.js:1311
|
||||
msgid "Certificate hostname mismatch"
|
||||
msgstr "Certifikát s nesúhlasným názvom hostiteľa"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1311
|
||||
#: ../js/ui/components/telepathyClient.js:1313
|
||||
msgid "Certificate fingerprint mismatch"
|
||||
msgstr "Certifikát s nesúhlasným odtlačkom"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1313
|
||||
#: ../js/ui/components/telepathyClient.js:1315
|
||||
msgid "Certificate self-signed"
|
||||
msgstr "Sebou podpísaný certifikát"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1315
|
||||
#: ../js/ui/components/telepathyClient.js:1317
|
||||
msgid "Status is set to offline"
|
||||
msgstr "Stav je nastavený na odhlásený"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1317
|
||||
#: ../js/ui/components/telepathyClient.js:1319
|
||||
msgid "Encryption is not available"
|
||||
msgstr "Šifrovanie nie je dostupné"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1319
|
||||
#: ../js/ui/components/telepathyClient.js:1321
|
||||
msgid "Certificate is invalid"
|
||||
msgstr "Certifikát je neplatný"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1321
|
||||
#: ../js/ui/components/telepathyClient.js:1323
|
||||
msgid "Connection has been refused"
|
||||
msgstr "Pripojenie bolo odmietnuté"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1323
|
||||
#: ../js/ui/components/telepathyClient.js:1325
|
||||
msgid "Connection can't be established"
|
||||
msgstr "Nedá sa nadviazať spojenie"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1325
|
||||
#: ../js/ui/components/telepathyClient.js:1327
|
||||
msgid "Connection has been lost"
|
||||
msgstr "Spojenie sa stratilo"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1327
|
||||
#: ../js/ui/components/telepathyClient.js:1329
|
||||
msgid "This account is already connected to the server"
|
||||
msgstr "Tento účet je už pripojený k serveru"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1329
|
||||
#: ../js/ui/components/telepathyClient.js:1331
|
||||
msgid ""
|
||||
"Connection has been replaced by a new connection using the same resource"
|
||||
msgstr "Pripojenie bolo nahradené novým, ktoré používa rovnaký zdroj"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1331
|
||||
#: ../js/ui/components/telepathyClient.js:1333
|
||||
msgid "The account already exists on the server"
|
||||
msgstr "Účet na serveri už existuje"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1333
|
||||
#: ../js/ui/components/telepathyClient.js:1335
|
||||
msgid "Server is currently too busy to handle the connection"
|
||||
msgstr "Server je momentálne príliš zaneprázdnený na zvládnutie pripojenia"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1335
|
||||
#: ../js/ui/components/telepathyClient.js:1337
|
||||
msgid "Certificate has been revoked"
|
||||
msgstr "Certifikát bol zrušený"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1337
|
||||
#: ../js/ui/components/telepathyClient.js:1339
|
||||
msgid ""
|
||||
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
|
||||
msgstr ""
|
||||
"Šifrovací algoritmus používaný certifikátom nie je bezpečný alebo je "
|
||||
"kryptograficky slabý"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1339
|
||||
#: ../js/ui/components/telepathyClient.js:1341
|
||||
msgid ""
|
||||
"The length of the server certificate, or the depth of the server certificate "
|
||||
"chain, exceed the limits imposed by the cryptography library"
|
||||
@ -914,26 +936,26 @@ msgstr ""
|
||||
"Dĺžka certifikátu servera, alebo hĺbka reťazca certifikátu servera presahuje "
|
||||
"limit stanovený kryptografickou knižnicou."
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1341
|
||||
#: ../js/ui/components/telepathyClient.js:1343
|
||||
msgid "Internal error"
|
||||
msgstr "Vnútorná chyba"
|
||||
|
||||
#. translators: argument is the account name, like
|
||||
#. * name@jabber.org for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1351
|
||||
#: ../js/ui/components/telepathyClient.js:1353
|
||||
#, c-format
|
||||
msgid "Connection to %s failed"
|
||||
msgstr "Pripojenie k %s zlyhalo"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1360
|
||||
#: ../js/ui/components/telepathyClient.js:1362
|
||||
msgid "Reconnect"
|
||||
msgstr "Znovu sa pripojiť"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1361
|
||||
#: ../js/ui/components/telepathyClient.js:1363
|
||||
msgid "Edit account"
|
||||
msgstr "Upraviť účet"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1406
|
||||
#: ../js/ui/components/telepathyClient.js:1408
|
||||
msgid "Unknown reason"
|
||||
msgstr "Neznámy dôvod"
|
||||
|
||||
@ -992,7 +1014,7 @@ msgstr[2] "Budete automaticky odhlásený o %d sekundy."
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:74
|
||||
msgid "Logging out of the system."
|
||||
msgstr "Odhlasuje sa zo systému."
|
||||
msgstr "Prebieha odhlásenie zo systému."
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:76
|
||||
msgctxt "button"
|
||||
@ -1120,21 +1142,21 @@ msgstr "Zobraziť zdroj"
|
||||
msgid "Web Page"
|
||||
msgstr "Webová stránka"
|
||||
|
||||
#: ../js/ui/messageTray.js:1082
|
||||
#: ../js/ui/messageTray.js:1083
|
||||
msgid "Open"
|
||||
msgstr "Otvoriť"
|
||||
|
||||
#: ../js/ui/messageTray.js:1089
|
||||
#: ../js/ui/messageTray.js:1090
|
||||
msgid "Remove"
|
||||
msgstr "Odstrániť"
|
||||
|
||||
# DK: zvazoval som pouzit "Panel správ"
|
||||
# neviem co bude vhodnejsie ako preklad "tray"
|
||||
#: ../js/ui/messageTray.js:1545
|
||||
#: ../js/ui/messageTray.js:1534
|
||||
msgid "Message Tray"
|
||||
msgstr "Lišta správ"
|
||||
|
||||
#: ../js/ui/messageTray.js:2552
|
||||
#: ../js/ui/messageTray.js:2557
|
||||
msgid "System Information"
|
||||
msgstr "Informácie o systéme"
|
||||
|
||||
@ -1175,7 +1197,7 @@ msgstr "Ukončiť"
|
||||
msgid "Activities"
|
||||
msgstr "Aktivity"
|
||||
|
||||
#: ../js/ui/panel.js:965
|
||||
#: ../js/ui/panel.js:966
|
||||
msgid "Top Bar"
|
||||
msgstr "Horná lišta"
|
||||
|
||||
@ -1197,11 +1219,11 @@ msgstr "Prosím, zadajte príkaz:"
|
||||
# v ostatnych retazcoch je pouzite %e, tak to bude asi OK
|
||||
#. Translators: This is a time format for a date in
|
||||
#. long format
|
||||
#: ../js/ui/screenShield.js:79
|
||||
#: ../js/ui/screenShield.js:80
|
||||
msgid "%A, %B %d"
|
||||
msgstr "%A, %e. %B"
|
||||
|
||||
#: ../js/ui/screenShield.js:143
|
||||
#: ../js/ui/screenShield.js:144
|
||||
#, c-format
|
||||
msgid "%d new message"
|
||||
msgid_plural "%d new messages"
|
||||
@ -1209,13 +1231,13 @@ msgstr[0] "%d nových správ"
|
||||
msgstr[1] "%d nová správa"
|
||||
msgstr[2] "%d nové správy"
|
||||
|
||||
#: ../js/ui/screenShield.js:145
|
||||
#: ../js/ui/screenShield.js:146
|
||||
#, c-format
|
||||
msgid "%d new notification"
|
||||
msgid_plural "%d new notifications"
|
||||
msgstr[0] "%d nových upozornení"
|
||||
msgstr[1] "%d nové upozornenie"
|
||||
msgstr[2] "%d nové upozornenia"
|
||||
msgstr[0] "%d nových oznámení"
|
||||
msgstr[1] "%d nové oznámenie"
|
||||
msgstr[2] "%d nové oznámenia"
|
||||
|
||||
#: ../js/ui/searchDisplay.js:275
|
||||
msgid "Searching..."
|
||||
@ -1249,13 +1271,13 @@ msgstr "Heslo"
|
||||
msgid "Remember Password"
|
||||
msgstr "Zapamätať heslo"
|
||||
|
||||
#: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:170
|
||||
#: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:171
|
||||
msgid "Unlock"
|
||||
msgstr "Odblokovať"
|
||||
|
||||
#: ../js/ui/status/accessibility.js:39
|
||||
msgid "Accessibility"
|
||||
msgstr "Prístupnosť"
|
||||
msgstr "Zjednodušenie ovládania"
|
||||
|
||||
#: ../js/ui/status/accessibility.js:44
|
||||
msgid "Zoom"
|
||||
@ -1537,7 +1559,7 @@ msgstr "Mobilné"
|
||||
|
||||
#: ../js/ui/status/network.js:1628
|
||||
msgid "VPN Connections"
|
||||
msgstr "VPN pripojenia"
|
||||
msgstr "Pripojenia k VPN"
|
||||
|
||||
#: ../js/ui/status/network.js:1635
|
||||
msgid "Network Settings"
|
||||
@ -1669,7 +1691,7 @@ msgstr "Hlasitosť"
|
||||
msgid "Microphone"
|
||||
msgstr "Mikrofón"
|
||||
|
||||
#: ../js/ui/unlockDialog.js:177
|
||||
#: ../js/ui/unlockDialog.js:178
|
||||
msgid "Log in as another user"
|
||||
msgstr "Prihlásiť ako iný používateľ"
|
||||
|
||||
@ -1697,35 +1719,35 @@ msgstr "Nečinný"
|
||||
msgid "Unavailable"
|
||||
msgstr "Nedostupný"
|
||||
|
||||
#: ../js/ui/userMenu.js:735
|
||||
#: ../js/ui/userMenu.js:743
|
||||
msgid "Notifications"
|
||||
msgstr "Upozornenia"
|
||||
|
||||
#: ../js/ui/userMenu.js:743
|
||||
#: ../js/ui/userMenu.js:751
|
||||
msgid "System Settings"
|
||||
msgstr "Nastavenia systému"
|
||||
|
||||
#: ../js/ui/userMenu.js:751
|
||||
#: ../js/ui/userMenu.js:759
|
||||
msgid "Switch User"
|
||||
msgstr "Prepnúť používateľa"
|
||||
|
||||
#: ../js/ui/userMenu.js:756
|
||||
#: ../js/ui/userMenu.js:764
|
||||
msgid "Log Out"
|
||||
msgstr "Odhlásiť sa"
|
||||
|
||||
#: ../js/ui/userMenu.js:761
|
||||
#: ../js/ui/userMenu.js:769
|
||||
msgid "Lock"
|
||||
msgstr "Uzamknúť"
|
||||
|
||||
#: ../js/ui/userMenu.js:776
|
||||
#: ../js/ui/userMenu.js:784
|
||||
msgid "Install Updates & Restart"
|
||||
msgstr "Nainštalovať aktualizácie a reštartovať"
|
||||
|
||||
#: ../js/ui/userMenu.js:794
|
||||
#: ../js/ui/userMenu.js:802
|
||||
msgid "Your chat status will be set to busy"
|
||||
msgstr "Váš stav bude nastavený na zaneprázdnený"
|
||||
|
||||
#: ../js/ui/userMenu.js:795
|
||||
#: ../js/ui/userMenu.js:803
|
||||
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."
|
||||
|
24
po/ug.po
24
po/ug.po
@ -218,12 +218,12 @@ msgstr "يىغقۇچقا قوش"
|
||||
#: ../js/ui/appFavorites.js:91
|
||||
#, c-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "%s يىغقۇچىڭىزغا قوشۇلدى."
|
||||
msgstr "%s يىغقۇچىڭىزغا قوشۇلدى."
|
||||
|
||||
#: ../js/ui/appFavorites.js:122
|
||||
#, c-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s يىغقۇچىڭىزدىن چىقىرىۋېتىلىدۇ."
|
||||
msgstr "%s يىغقۇچىڭىزدىن چىقىرىۋېتىلىدۇ."
|
||||
|
||||
#. Translators: Shown in calendar event list for all day events
|
||||
#. * Keep it short, best if you can use less then 10 characters
|
||||
@ -437,7 +437,7 @@ msgstr "يېقىنقى تۈرلەر"
|
||||
#: ../js/ui/endSessionDialog.js:63
|
||||
#, c-format
|
||||
msgid "Log Out %s"
|
||||
msgstr "%s تىزىمدىن چىقىش"
|
||||
msgstr "%s تىزىمدىن چىقىش"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:64 ../js/ui/endSessionDialog.js:70
|
||||
msgid "Log Out"
|
||||
@ -452,7 +452,7 @@ msgstr ""
|
||||
#: ../js/ui/endSessionDialog.js:66
|
||||
#, c-format
|
||||
msgid "%s will be logged out automatically in %d seconds."
|
||||
msgstr "%s تىزىمدىن %d سېكۇنتتىن كېيىن ئۆزلۈكىدىن چىقىسىز."
|
||||
msgstr "%s تىزىمدىن %d سېكۇنتتىن كېيىن ئۆزلۈكىدىن چىقىسىز."
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:67
|
||||
#, c-format
|
||||
@ -566,7 +566,7 @@ msgstr "سىزىقچە"
|
||||
#: ../js/ui/panel.js:533
|
||||
#, c-format
|
||||
msgid "Quit %s"
|
||||
msgstr "%s چېكىن"
|
||||
msgstr "%s چېكىن"
|
||||
|
||||
#. Button on the left side of the panel.
|
||||
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
|
||||
@ -799,7 +799,7 @@ msgstr "رەت قىل"
|
||||
#: ../js/ui/status/bluetooth.js:408
|
||||
#, c-format
|
||||
msgid "Pairing confirmation for %s"
|
||||
msgstr "%s نىڭ جەزملىشىنى جۈپلەشتۈرۈۋاتىدۇ"
|
||||
msgstr "%s نىڭ جەزملىشىنى جۈپلەشتۈرۈۋاتىدۇ"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:414 ../js/ui/status/bluetooth.js:448
|
||||
#, c-format
|
||||
@ -823,7 +823,7 @@ msgstr "ماسلاشمىدى"
|
||||
#: ../js/ui/status/bluetooth.js:441
|
||||
#, c-format
|
||||
msgid "Pairing request for %s"
|
||||
msgstr "%s دىن كەلگەن جۈپلەش ئىلتىماسى"
|
||||
msgstr "%s دىن كەلگەن جۈپلەش ئىلتىماسى"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:449
|
||||
msgid "Please enter the PIN mentioned on the device."
|
||||
@ -1074,22 +1074,22 @@ msgstr "مىكروفون"
|
||||
#: ../js/ui/telepathyClient.js:335
|
||||
#, c-format
|
||||
msgid "%s is online."
|
||||
msgstr "%s توردا."
|
||||
msgstr "%s توردا."
|
||||
|
||||
#: ../js/ui/telepathyClient.js:340
|
||||
#, c-format
|
||||
msgid "%s is offline."
|
||||
msgstr "%s توردا يوق."
|
||||
msgstr "%s توردا يوق."
|
||||
|
||||
#: ../js/ui/telepathyClient.js:343
|
||||
#, c-format
|
||||
msgid "%s is away."
|
||||
msgstr "%s يوق."
|
||||
msgstr "%s يوق."
|
||||
|
||||
#: ../js/ui/telepathyClient.js:346
|
||||
#, c-format
|
||||
msgid "%s is busy."
|
||||
msgstr "%s ئالدىراش."
|
||||
msgstr "%s ئالدىراش."
|
||||
|
||||
#. Translators: this is a time format string followed by a date.
|
||||
#. If applicable, replace %X with a strftime format valid for your
|
||||
@ -1114,7 +1114,7 @@ msgstr "ئىزدە"
|
||||
#: ../js/ui/windowAttentionHandler.js:42
|
||||
#, c-format
|
||||
msgid "%s has finished starting"
|
||||
msgstr "%s باشلاشنى تاماملىدى"
|
||||
msgstr "%s باشلاشنى تاماملىدى"
|
||||
|
||||
#: ../js/ui/windowAttentionHandler.js:44
|
||||
#, c-format
|
||||
|
@ -31,7 +31,6 @@
|
||||
#include <string.h>
|
||||
#define HANDLE_LIBICAL_MEMORY
|
||||
#include <libecal/libecal.h>
|
||||
#include <libedataserverui/libedataserverui.h>
|
||||
|
||||
#undef CALENDAR_ENABLE_DEBUG
|
||||
#include "calendar-debug.h"
|
||||
|
@ -34,7 +34,6 @@
|
||||
#include <unistd.h>
|
||||
|
||||
#include <gio/gio.h>
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
#define HANDLE_LIBICAL_MEMORY
|
||||
#include <libecal/libecal.h>
|
||||
@ -985,9 +984,11 @@ on_name_lost (GDBusConnection *connection,
|
||||
const gchar *name,
|
||||
gpointer user_data)
|
||||
{
|
||||
GMainLoop *main_loop = user_data;
|
||||
|
||||
g_print ("gnome-shell-calendar-server[%d]: Lost (or failed to acquire) the name " BUS_NAME " - exiting\n",
|
||||
(gint) getpid ());
|
||||
gtk_main_quit ();
|
||||
g_main_loop_quit (main_loop);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -1003,11 +1004,13 @@ stdin_channel_io_func (GIOChannel *source,
|
||||
GIOCondition condition,
|
||||
gpointer data)
|
||||
{
|
||||
GMainLoop *main_loop = data;
|
||||
|
||||
if (condition & G_IO_HUP)
|
||||
{
|
||||
g_debug ("gnome-shell-calendar-server[%d]: Got HUP on stdin - exiting\n",
|
||||
(gint) getpid ());
|
||||
gtk_main_quit ();
|
||||
g_main_loop_quit (main_loop);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -1022,6 +1025,7 @@ main (int argc,
|
||||
{
|
||||
GError *error;
|
||||
GOptionContext *opt_context;
|
||||
GMainLoop *main_loop;
|
||||
gint ret;
|
||||
guint name_owner_id;
|
||||
GIOChannel *stdin_channel;
|
||||
@ -1031,9 +1035,7 @@ main (int argc,
|
||||
name_owner_id = 0;
|
||||
stdin_channel = NULL;
|
||||
|
||||
/* We need to initialize GTK+ since evolution-data-server may decide to use
|
||||
* GTK+ to pop up a dialog box */
|
||||
gtk_init (&argc, &argv);
|
||||
g_type_init ();
|
||||
|
||||
introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL);
|
||||
g_assert (introspection_data != NULL);
|
||||
@ -1048,11 +1050,15 @@ main (int argc,
|
||||
goto out;
|
||||
}
|
||||
|
||||
main_loop = g_main_loop_new (NULL, FALSE);
|
||||
|
||||
stdin_channel = g_io_channel_unix_new (STDIN_FILENO);
|
||||
g_io_add_watch (stdin_channel,
|
||||
G_IO_HUP,
|
||||
stdin_channel_io_func,
|
||||
NULL);
|
||||
g_io_add_watch_full (stdin_channel,
|
||||
G_PRIORITY_DEFAULT,
|
||||
G_IO_HUP,
|
||||
stdin_channel_io_func,
|
||||
g_main_loop_ref (main_loop),
|
||||
(GDestroyNotify) g_main_loop_unref);
|
||||
|
||||
name_owner_id = g_bus_own_name (G_BUS_TYPE_SESSION,
|
||||
BUS_NAME,
|
||||
@ -1061,10 +1067,12 @@ main (int argc,
|
||||
on_bus_acquired,
|
||||
on_name_acquired,
|
||||
on_name_lost,
|
||||
NULL,
|
||||
NULL);
|
||||
g_main_loop_ref (main_loop),
|
||||
(GDestroyNotify) g_main_loop_unref);
|
||||
|
||||
gtk_main ();
|
||||
g_main_loop_run (main_loop);
|
||||
|
||||
g_main_loop_unref (main_loop);
|
||||
|
||||
ret = 0;
|
||||
|
||||
|
@ -73,6 +73,7 @@ struct _ShellApp
|
||||
char *window_id_string;
|
||||
|
||||
char *casefolded_name;
|
||||
char *casefolded_generic_name;
|
||||
char *name_collation_key;
|
||||
char *casefolded_exec;
|
||||
char **casefolded_keywords;
|
||||
@ -1310,6 +1311,7 @@ static void
|
||||
shell_app_init_search_data (ShellApp *app)
|
||||
{
|
||||
const char *name;
|
||||
const char *generic_name;
|
||||
const char *exec;
|
||||
const char * const *keywords;
|
||||
char *normalized_exec;
|
||||
@ -1319,6 +1321,12 @@ 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);
|
||||
|
||||
generic_name = g_desktop_app_info_get_generic_name (appinfo);
|
||||
if (generic_name)
|
||||
app->casefolded_generic_name = shell_util_normalize_and_casefold (generic_name);
|
||||
else
|
||||
app->casefolded_generic_name = NULL;
|
||||
|
||||
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);
|
||||
@ -1388,6 +1396,18 @@ _shell_app_match_search_terms (ShellApp *app,
|
||||
current_match = MATCH_SUBSTRING;
|
||||
}
|
||||
|
||||
if (app->casefolded_generic_name)
|
||||
{
|
||||
p = strstr (app->casefolded_generic_name, term);
|
||||
if (p != NULL)
|
||||
{
|
||||
if (p == app->casefolded_generic_name || *(p - 1) == ' ')
|
||||
current_match = MATCH_PREFIX;
|
||||
else if (current_match < MATCH_PREFIX)
|
||||
current_match = MATCH_SUBSTRING;
|
||||
}
|
||||
}
|
||||
|
||||
if (app->casefolded_exec)
|
||||
{
|
||||
p = strstr (app->casefolded_exec, term);
|
||||
@ -1497,6 +1517,7 @@ shell_app_finalize (GObject *object)
|
||||
g_free (app->window_id_string);
|
||||
|
||||
g_free (app->casefolded_name);
|
||||
g_free (app->casefolded_generic_name);
|
||||
g_free (app->name_collation_key);
|
||||
g_free (app->casefolded_exec);
|
||||
g_strfreev (app->casefolded_keywords);
|
||||
|
@ -1693,43 +1693,3 @@ shell_global_get_session_mode (ShellGlobal *global)
|
||||
|
||||
return global->session_mode;
|
||||
}
|
||||
|
||||
/**
|
||||
* shell_global_create_xrootpmap_texture:
|
||||
* @global: The #ShellGlobal
|
||||
*
|
||||
* This returns the _XROOTPMAP_ID pixmap that gdm should have stuffed
|
||||
* in the root window. The goal here is to allow a smooth fade between
|
||||
* plymouth and the shell greeter. This is also a workaround for gjs not
|
||||
* supporting raw xlib types.
|
||||
*
|
||||
* Returns: (transfer floating): A #ClutterActor that represents the
|
||||
* _XROOTPMAP_ID pixmap property from the root window.
|
||||
*/
|
||||
ClutterActor *
|
||||
shell_global_create_xrootpmap_texture (ShellGlobal *global)
|
||||
{
|
||||
Atom res_type;
|
||||
int res_format;
|
||||
unsigned long res_nitems, bytesafter;
|
||||
unsigned char *data;
|
||||
Pixmap root_pixmap_id = None;
|
||||
|
||||
g_return_val_if_fail (SHELL_IS_GLOBAL (global), NULL);
|
||||
|
||||
if (XGetWindowProperty (global->xdisplay,
|
||||
DefaultRootWindow (global->xdisplay),
|
||||
XInternAtom (global->xdisplay, "_XROOTPMAP_ID", False),
|
||||
0, G_MAXLONG, False, XA_PIXMAP,
|
||||
&res_type, &res_format, &res_nitems, &bytesafter, &data) == Success)
|
||||
{
|
||||
if (res_type == XA_PIXMAP && res_format == 32 && res_nitems == 1)
|
||||
root_pixmap_id = * (Pixmap *) data;
|
||||
XFree (data);
|
||||
}
|
||||
|
||||
if (root_pixmap_id != None)
|
||||
return clutter_x11_texture_pixmap_new_with_pixmap (root_pixmap_id);
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
@ -136,8 +136,6 @@ void shell_global_reexec_self (ShellGlobal *global);
|
||||
|
||||
const char * shell_global_get_session_mode (ShellGlobal *global);
|
||||
|
||||
ClutterActor * shell_global_create_xrootpmap_texture (ShellGlobal *global);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __SHELL_GLOBAL_H__ */
|
||||
|
@ -11,6 +11,8 @@
|
||||
#define GST_USE_UNSTABLE_API
|
||||
#include <gst/gst.h>
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
#include "shell-recorder-src.h"
|
||||
#include "shell-recorder.h"
|
||||
#include "shell-screen-grabber.h"
|
||||
@ -65,7 +67,7 @@ struct _ShellRecorder {
|
||||
|
||||
int framerate;
|
||||
char *pipeline_description;
|
||||
char *filename;
|
||||
char *file_template;
|
||||
|
||||
/* We might have multiple pipelines that are finishing encoding
|
||||
* to go along with the current pipeline where we are recording.
|
||||
@ -90,6 +92,7 @@ struct _RecorderPipeline
|
||||
GstElement *pipeline;
|
||||
GstElement *src;
|
||||
int outfile;
|
||||
char *filename;
|
||||
};
|
||||
|
||||
static void recorder_set_stage (ShellRecorder *recorder,
|
||||
@ -98,8 +101,8 @@ static void recorder_set_framerate (ShellRecorder *recorder,
|
||||
int framerate);
|
||||
static void recorder_set_pipeline (ShellRecorder *recorder,
|
||||
const char *pipeline);
|
||||
static void recorder_set_filename (ShellRecorder *recorder,
|
||||
const char *filename);
|
||||
static void recorder_set_file_template (ShellRecorder *recorder,
|
||||
const char *file_template);
|
||||
|
||||
static void recorder_pipeline_set_caps (RecorderPipeline *pipeline);
|
||||
static void recorder_pipeline_closed (RecorderPipeline *pipeline);
|
||||
@ -109,7 +112,7 @@ enum {
|
||||
PROP_STAGE,
|
||||
PROP_FRAMERATE,
|
||||
PROP_PIPELINE,
|
||||
PROP_FILENAME
|
||||
PROP_FILE_TEMPLATE
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE(ShellRecorder, shell_recorder, G_TYPE_OBJECT);
|
||||
@ -269,18 +272,6 @@ static void
|
||||
shell_recorder_finalize (GObject *object)
|
||||
{
|
||||
ShellRecorder *recorder = SHELL_RECORDER (object);
|
||||
GSList *l;
|
||||
|
||||
for (l = recorder->pipelines; l; l = l->next)
|
||||
{
|
||||
RecorderPipeline *pipeline = l->data;
|
||||
|
||||
/* Remove the back-reference. The pipeline will be freed
|
||||
* when it finishes. (Or when the process exits, but that's
|
||||
* out of our control.)
|
||||
*/
|
||||
pipeline->recorder = NULL;
|
||||
}
|
||||
|
||||
if (recorder->update_memory_used_timeout)
|
||||
g_source_remove (recorder->update_memory_used_timeout);
|
||||
@ -290,7 +281,7 @@ shell_recorder_finalize (GObject *object)
|
||||
|
||||
recorder_set_stage (recorder, NULL);
|
||||
recorder_set_pipeline (recorder, NULL);
|
||||
recorder_set_filename (recorder, NULL);
|
||||
recorder_set_file_template (recorder, NULL);
|
||||
|
||||
g_object_unref (recorder->grabber);
|
||||
|
||||
@ -917,22 +908,22 @@ recorder_set_pipeline (ShellRecorder *recorder,
|
||||
}
|
||||
|
||||
static void
|
||||
recorder_set_filename (ShellRecorder *recorder,
|
||||
const char *filename)
|
||||
recorder_set_file_template (ShellRecorder *recorder,
|
||||
const char *file_template)
|
||||
{
|
||||
if (filename == recorder->filename ||
|
||||
(filename && recorder->filename && strcmp (recorder->filename, filename) == 0))
|
||||
if (file_template == recorder->file_template ||
|
||||
(file_template && recorder->file_template && strcmp (recorder->file_template, file_template) == 0))
|
||||
return;
|
||||
|
||||
if (recorder->current_pipeline)
|
||||
shell_recorder_close (recorder);
|
||||
|
||||
if (recorder->filename)
|
||||
g_free (recorder->filename);
|
||||
if (recorder->file_template)
|
||||
g_free (recorder->file_template);
|
||||
|
||||
recorder->filename = g_strdup (filename);
|
||||
recorder->file_template = g_strdup (file_template);
|
||||
|
||||
g_object_notify (G_OBJECT (recorder), "filename");
|
||||
g_object_notify (G_OBJECT (recorder), "file-template");
|
||||
}
|
||||
|
||||
static void
|
||||
@ -954,8 +945,8 @@ shell_recorder_set_property (GObject *object,
|
||||
case PROP_PIPELINE:
|
||||
recorder_set_pipeline (recorder, g_value_get_string (value));
|
||||
break;
|
||||
case PROP_FILENAME:
|
||||
recorder_set_filename (recorder, g_value_get_string (value));
|
||||
case PROP_FILE_TEMPLATE:
|
||||
recorder_set_file_template (recorder, g_value_get_string (value));
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
@ -982,8 +973,8 @@ shell_recorder_get_property (GObject *object,
|
||||
case PROP_PIPELINE:
|
||||
g_value_set_string (value, recorder->pipeline_description);
|
||||
break;
|
||||
case PROP_FILENAME:
|
||||
g_value_set_string (value, recorder->filename);
|
||||
case PROP_FILE_TEMPLATE:
|
||||
g_value_set_string (value, recorder->file_template);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
@ -1027,9 +1018,9 @@ shell_recorder_class_init (ShellRecorderClass *klass)
|
||||
G_PARAM_READWRITE));
|
||||
|
||||
g_object_class_install_property (gobject_class,
|
||||
PROP_FILENAME,
|
||||
g_param_spec_string ("filename",
|
||||
"Filename",
|
||||
PROP_FILE_TEMPLATE,
|
||||
g_param_spec_string ("file-template",
|
||||
"File Template",
|
||||
"The filename template to use for output files",
|
||||
NULL,
|
||||
G_PARAM_READWRITE));
|
||||
@ -1149,13 +1140,14 @@ get_absolute_path (char *maybe_relative)
|
||||
* be opened.
|
||||
*/
|
||||
static int
|
||||
recorder_open_outfile (ShellRecorder *recorder)
|
||||
recorder_open_outfile (ShellRecorder *recorder,
|
||||
char **outfilename)
|
||||
{
|
||||
const char *pattern;
|
||||
int flags;
|
||||
int outfile = -1;
|
||||
|
||||
pattern = recorder->filename;
|
||||
pattern = recorder->file_template;
|
||||
if (!pattern)
|
||||
return -1;
|
||||
|
||||
@ -1230,8 +1222,12 @@ recorder_open_outfile (ShellRecorder *recorder)
|
||||
{
|
||||
g_printerr ("Recording to %s\n", path);
|
||||
|
||||
if (outfilename != NULL)
|
||||
*outfilename = path;
|
||||
else
|
||||
g_free (path);
|
||||
g_string_free (filename, TRUE);
|
||||
g_free (path);
|
||||
|
||||
goto out;
|
||||
}
|
||||
|
||||
@ -1269,7 +1265,8 @@ recorder_pipeline_add_sink (RecorderPipeline *pipeline)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
pipeline->outfile = recorder_open_outfile (pipeline->recorder);
|
||||
pipeline->outfile = recorder_open_outfile (pipeline->recorder,
|
||||
&pipeline->filename);
|
||||
if (pipeline->outfile == -1)
|
||||
goto out;
|
||||
|
||||
@ -1344,6 +1341,10 @@ recorder_pipeline_free (RecorderPipeline *pipeline)
|
||||
if (pipeline->outfile != -1)
|
||||
close (pipeline->outfile);
|
||||
|
||||
g_free (pipeline->filename);
|
||||
|
||||
g_clear_object (&pipeline->recorder);
|
||||
|
||||
g_free (pipeline);
|
||||
}
|
||||
|
||||
@ -1393,6 +1394,10 @@ recorder_pipeline_closed (RecorderPipeline *pipeline)
|
||||
|
||||
if (pipeline->recorder)
|
||||
{
|
||||
GtkRecentManager *recent_manager;
|
||||
GFile *file;
|
||||
char *uri;
|
||||
|
||||
ShellRecorder *recorder = pipeline->recorder;
|
||||
if (pipeline == recorder->current_pipeline)
|
||||
{
|
||||
@ -1401,6 +1406,15 @@ recorder_pipeline_closed (RecorderPipeline *pipeline)
|
||||
shell_recorder_close (recorder);
|
||||
}
|
||||
|
||||
recent_manager = gtk_recent_manager_get_default ();
|
||||
|
||||
file = g_file_new_for_path (pipeline->filename);
|
||||
uri = g_file_get_uri (file);
|
||||
gtk_recent_manager_add_item (recent_manager,
|
||||
uri);
|
||||
g_free (uri);
|
||||
g_object_unref (file);
|
||||
|
||||
recorder->pipelines = g_slist_remove (recorder->pipelines, pipeline);
|
||||
}
|
||||
|
||||
@ -1452,7 +1466,7 @@ recorder_open_pipeline (ShellRecorder *recorder)
|
||||
GstBus *bus;
|
||||
|
||||
pipeline = g_new0(RecorderPipeline, 1);
|
||||
pipeline->recorder = recorder;
|
||||
pipeline->recorder = g_object_ref (recorder);
|
||||
pipeline->outfile = - 1;
|
||||
|
||||
pipeline_description = recorder->pipeline_description;
|
||||
@ -1555,10 +1569,10 @@ shell_recorder_set_framerate (ShellRecorder *recorder,
|
||||
}
|
||||
|
||||
/**
|
||||
* shell_recorder_set_filename:
|
||||
* shell_recorder_set_file_template:
|
||||
* @recorder: the #ShellRecorder
|
||||
* @filename: the filename template to use for output files,
|
||||
* or %NULL for the defalt value.
|
||||
* @file_template: the filename template to use for output files,
|
||||
* or %NULL for the defalt value.
|
||||
*
|
||||
* Sets the filename that will be used when creating output
|
||||
* files. This is only used if the configured pipeline has an
|
||||
@ -1573,12 +1587,12 @@ shell_recorder_set_framerate (ShellRecorder *recorder,
|
||||
* The default value is 'shell-%d%u-%c.ogg'.
|
||||
*/
|
||||
void
|
||||
shell_recorder_set_filename (ShellRecorder *recorder,
|
||||
const char *filename)
|
||||
shell_recorder_set_file_template (ShellRecorder *recorder,
|
||||
const char *file_template)
|
||||
{
|
||||
g_return_if_fail (SHELL_IS_RECORDER (recorder));
|
||||
|
||||
recorder_set_filename (recorder, filename);
|
||||
recorder_set_file_template (recorder, file_template);
|
||||
|
||||
}
|
||||
|
||||
@ -1593,7 +1607,7 @@ shell_recorder_set_filename (ShellRecorder *recorder,
|
||||
* should have an unconnected sink pad where the recorded
|
||||
* video is recorded. It will normally have a unconnected
|
||||
* source pad; output from that pad will be written into the
|
||||
* output file. (See shell_recorder_set_filename().) However
|
||||
* output file. (See shell_recorder_set_file_template().) However
|
||||
* the pipeline can also take care of its own output - this
|
||||
* might be used to send the output to an icecast server
|
||||
* via shout2send or similar.
|
||||
|
@ -32,8 +32,8 @@ ShellRecorder *shell_recorder_new (ClutterStage *stage);
|
||||
|
||||
void shell_recorder_set_framerate (ShellRecorder *recorder,
|
||||
int framerate);
|
||||
void shell_recorder_set_filename (ShellRecorder *recorder,
|
||||
const char *filename);
|
||||
void shell_recorder_set_file_template (ShellRecorder *recorder,
|
||||
const char *file_template);
|
||||
void shell_recorder_set_pipeline (ShellRecorder *recorder,
|
||||
const char *pipeline);
|
||||
gboolean shell_recorder_record (ShellRecorder *recorder);
|
||||
|
@ -3,6 +3,7 @@
|
||||
#define GST_USE_UNSTABLE_API
|
||||
#include "shell-recorder.h"
|
||||
#include <clutter/clutter.h>
|
||||
#include <gtk/gtk.h>
|
||||
#include <gst/gst.h>
|
||||
|
||||
/* Very simple test of the ShellRecorder class; shows some text strings
|
||||
@ -11,23 +12,34 @@
|
||||
static ShellRecorder *recorder = NULL;
|
||||
|
||||
static gboolean
|
||||
stop_recording_timeout (gpointer data)
|
||||
stop_recording_timeout (ClutterActor *stage)
|
||||
{
|
||||
if (recorder)
|
||||
{
|
||||
shell_recorder_close (recorder);
|
||||
|
||||
/* quit when the recorder finishes closing
|
||||
*/
|
||||
g_object_weak_ref (G_OBJECT (recorder),
|
||||
(GWeakNotify)
|
||||
clutter_actor_destroy,
|
||||
stage);
|
||||
|
||||
g_object_unref (recorder);
|
||||
}
|
||||
|
||||
clutter_main_quit ();
|
||||
else
|
||||
{
|
||||
clutter_actor_destroy (stage);
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
on_animation_completed (ClutterAnimation *animation)
|
||||
on_animation_completed (ClutterAnimation *animation,
|
||||
ClutterStage *stage)
|
||||
{
|
||||
g_timeout_add (1000, stop_recording_timeout, NULL);
|
||||
g_timeout_add (1000, (GSourceFunc) stop_recording_timeout, stage);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -35,7 +47,7 @@ on_stage_realized (ClutterActor *stage,
|
||||
gpointer data)
|
||||
{
|
||||
recorder = shell_recorder_new (CLUTTER_STAGE (stage));
|
||||
shell_recorder_set_filename (recorder, "test-recorder.ogg");
|
||||
shell_recorder_set_file_template (recorder, "test-recorder.ogg");
|
||||
shell_recorder_record (recorder);
|
||||
}
|
||||
|
||||
@ -46,6 +58,7 @@ int main (int argc, char **argv)
|
||||
ClutterAnimation *animation;
|
||||
ClutterColor red, green, blue;
|
||||
|
||||
gtk_init (&argc, &argv);
|
||||
gst_init (&argc, &argv);
|
||||
if (clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS)
|
||||
return 1;
|
||||
@ -69,7 +82,7 @@ int main (int argc, char **argv)
|
||||
"y", 240.0,
|
||||
NULL);
|
||||
g_signal_connect (animation, "completed",
|
||||
G_CALLBACK (on_animation_completed), NULL);
|
||||
G_CALLBACK (on_animation_completed), stage);
|
||||
|
||||
text = g_object_new (CLUTTER_TYPE_TEXT,
|
||||
"text", "Blue",
|
||||
@ -110,7 +123,5 @@ int main (int argc, char **argv)
|
||||
|
||||
clutter_main ();
|
||||
|
||||
g_object_unref (stage);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
34
tests/interactive/test-title.js
Executable file
34
tests/interactive/test-title.js
Executable file
@ -0,0 +1,34 @@
|
||||
#!/usr/bin/env gjs
|
||||
|
||||
const Gtk = imports.gi.Gtk;
|
||||
const Mainloop = imports.mainloop;
|
||||
|
||||
function nextTitle() {
|
||||
let length = Math.random() * 20;
|
||||
let str = '';
|
||||
|
||||
for (let i = 0; i < length; i++) {
|
||||
// 97 == 'a'
|
||||
str += String.fromCharCode(97 + Math.random() * 26);
|
||||
}
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
function main() {
|
||||
Gtk.init(null);
|
||||
|
||||
let win = new Gtk.Window({ title: nextTitle() });
|
||||
win.connect('destroy', Gtk.main_quit);
|
||||
win.present();
|
||||
|
||||
Mainloop.timeout_add(5000, function() {
|
||||
win.title = nextTitle();
|
||||
return true;
|
||||
});
|
||||
|
||||
Gtk.main();
|
||||
}
|
||||
|
||||
main();
|
||||
|
Reference in New Issue
Block a user