Compare commits

..

4 Commits

Author SHA1 Message Date
Rui Matos
11bf65e2b4 status/keyboard: Disregard the backwards flag for the popup switcher
This seems to cause more harm than good. It puzzles users looking at
the shortcuts list in g-c-c and it prevents otherwise valid shortcuts
like Shift+Hangul from working.

https://bugzilla.gnome.org/show_bug.cgi?id=695823
2013-04-05 18:12:48 +02:00
Rui Matos
a8b7e559aa status/keyboard: Allow switching input source in the message tray
We still can't show a popup switcher in the message tray but we can at
least degrade gracefully and advance to the next input source.

https://bugzilla.gnome.org/show_bug.cgi?id=697009
2013-04-05 18:12:48 +02:00
Rui Matos
b733e30a4a status/keyboard: Switch input source on special modifiers accelerator
This simply mimics the X server's layout switching behavior by
advancing to the next input source and wrapping around.

https://bugzilla.gnome.org/show_bug.cgi?id=697008
2013-04-05 18:12:48 +02:00
Rui Matos
b607958134 status/keyboard: Synchronize input source switching with key events
Currently we simply set the gsettings key when activating an input
source. This obviously introduces a time window, between the event that
activates the switch and when the switch is complete, under which key
events are being delivered to applications and interpreted according
to the previous input source.

The patches in bug 696996 introduce a DBus API in g-s-d that allows us
to know when an input source if effectively active. Using that and
freezing keyboard events in the X server until we hear back from g-s-d
we can ensure that events won't be misinterpreted after an input
source switch.

https://bugzilla.gnome.org/show_bug.cgi?id=697007
2013-04-05 18:12:47 +02:00
59 changed files with 2131 additions and 5156 deletions

59
NEWS
View File

@@ -1,62 +1,3 @@
3.8.2
=====
* Fix hotcorner regression in RTL locales [Jasper; #698884]
* Allow some keybindings to work while a top bar menu is open [Florian; #698938]
* Make open-app-menu keybinding a toggle action [Florian; #686756]
* ctrlAltTab: Use symbolic icons for desktop windows [Matthias; #697914]
* gdm: Fix regression where domain login hint not shown [Stef; #698200]
* Hide "Open Calendar" item when no calendar app is installed [Lionel; #697725]
* Update how branding appears on login screen [Florian; #694912, #699877]
* Allow OSD popups to grow if necessary [Marta; #696523]
* Fix offset of shadow offscreen rendering [Lionel; #698301]
* Fix insensitive button preventing empty keyring password [Stef; #696304]
* Allow cancelling keyring dialog between prompts [Stef; #682830]
* modalDialog: Show spinner while working [Stef; #684438]
* Provide a DBus API for screencasting [Florian; #696247]
* Implement app folder keynav and shortcuts [Florian; #695314]
* polkitAgent: Allow retrying after mistyped passwords [Stef; #684431]
* Add input purpose and hints to StEntry and StIMText [Daiki; #691392]
* Set input-purpose property for password entries [Rui; #700043]
* Misc fixes and cleanups [Jasper, Florian, Giovanni, Tim, Rui; #697203,
#698959, #696720, #698531, #676285, #698812, #699189]
Contributors:
Giovanni Campagna, Matthias Clasen, Lionel Landwerlin, Tim Lunn, Rui Matos,
Simon McVittie, Marta Milakovic, Florian Müllner, Jasper St. Pierre,
Daiki Ueno, Stef Walter
Translations:
Muhammet Kara [tr], Nik Kalach [ia], Žygimantas Beručka [lt],
Kjartan Maraas [nb]
3.8.1
=====
* Clip window group during startup animation [Jasper; #696323]
* Check for logind rather than systemd [Martin; #696252]
* Don't special-case last remote search provider position [Giovanni; #694974]
* Fix memory leaks [Ray, Jasper; ##697119, #697295, #697300, #697395]
* AppSwitcherPopup: Activate only the selected window if any [Rui; #697480]
* Enable screen recorder keybinding in all modes [Florian; #696200]
* Remove box-shadow from screen shield for performance reasons [Adel; #697274]
* Add support for -st-natural-width/height CSS properties [Giovanni; #664411]
* Remove excessive padding from notification buttons [Allan; #664411]
* Fix thumbnail dragging in overview [Jasper; #697504]
* theme-node: Add get_url()/lookup_url() methods [Florian; #693688]
* Misc bug fixes and cleanups [Jasper, Rui, Colin, David, Ray, Matthias:
#695859, #696259, #696585, #696436, #697432, #697435, #697560, #697722,
#697709]
Contributors:
Giovanni Campagna, Matthias Clasen, Allan Day, Adel Gadllah, David Gumberg,
Rui Matos, Florian Müllner, Martin Pitt, Jasper St. Pierre, Ray Strode,
Colin Walters
Translations:
Daniel Martinez [an], Bruce Cowan [en_GB], Khaled Hosny [ar],
Ihar Hrachyshka [be], Aron Xu [zh_CN], Wojciech Szczęsny [pl],
Inaki Larranaga Murgoitio [eu], Kjartan Maraas [nb],
Милош Поповић [sr, sr@latin], Trần Ngọc Quân [vi]
3.8.0.1 3.8.0.1
======= =======
* Background bug fixes [Ray; #696712] * Background bug fixes [Ray; #696712]

View File

@@ -1,5 +1,5 @@
AC_PREREQ(2.63) AC_PREREQ(2.63)
AC_INIT([gnome-shell],[3.8.2],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell]) AC_INIT([gnome-shell],[3.8.0.1],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_CONFIG_HEADERS([config.h]) AC_CONFIG_HEADERS([config.h])
AC_CONFIG_SRCDIR([src/shell-global.c]) AC_CONFIG_SRCDIR([src/shell-global.c])
@@ -63,7 +63,7 @@ AM_CONDITIONAL(BUILD_RECORDER, $build_recorder)
CLUTTER_MIN_VERSION=1.13.4 CLUTTER_MIN_VERSION=1.13.4
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1 GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
GJS_MIN_VERSION=1.35.4 GJS_MIN_VERSION=1.35.4
MUTTER_MIN_VERSION=3.8.2 MUTTER_MIN_VERSION=3.8.0
GTK_MIN_VERSION=3.7.9 GTK_MIN_VERSION=3.7.9
GIO_MIN_VERSION=2.35.0 GIO_MIN_VERSION=2.35.0
LIBECAL_MIN_VERSION=3.5.3 LIBECAL_MIN_VERSION=3.5.3

View File

@@ -15,7 +15,6 @@ desktop_DATA = gnome-shell.desktop gnome-shell-extension-prefs.desktop
introspectiondir = $(datadir)/dbus-1/interfaces introspectiondir = $(datadir)/dbus-1/interfaces
introspection_DATA = \ introspection_DATA = \
org.gnome.Shell.Screencast.xml \
org.gnome.Shell.Screenshot.xml \ org.gnome.Shell.Screenshot.xml \
org.gnome.ShellSearchProvider.xml \ org.gnome.ShellSearchProvider.xml \
org.gnome.ShellSearchProvider2.xml org.gnome.ShellSearchProvider2.xml

View File

@@ -1,96 +0,0 @@
<!DOCTYPE node PUBLIC
'-//freedesktop//DTD D-BUS Object Introspection 1.0//EN'
'http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd'>
<node>
<!--
org.gnome.Shell.Screencast:
@short_description: Screencast interface
The interface used to record screen contents.
-->
<interface name="org.gnome.Shell.Screencast">
<!--
Screencast:
@file_template: the template for the filename to use
@options: a dictionary of optional parameters
@success: whether the screencast was started successfully
@filename_used: the file where the screencast is being saved
Records a screencast of the whole screen and saves it
(by default) as webm video under a filename derived from
@file_template. The template is either a relative or absolute
filename which may contain some escape sequences - %d and %t
will be replaced by the start date and time of the recording.
If a relative name is used, the screencast will be saved in the
$XDG_VIDEOS_DIR if it exists, or the home directory otherwise.
The actual filename of the saved video is returned in @filename_used.
The set of optional parameters in @options currently consists of:
'draw-cursor'(b): whether the cursor should be included in the
recording (true)
'framerate'(i): the number of frames per second that should be
recorded if possible (30)
'pipeline'(s): the GStreamer pipeline used to encode recordings
in gst-launch format; if not specified, the
recorder will produce vp8 (webm) video (unset)
-->
<method name="Screencast">
<arg type="s" direction="in" name="file_template"/>
<arg type="a{sv}" direction="in" name="options"/>
<arg type="b" direction="in" name="flash"/>
<arg type="b" direction="out" name="success"/>
<arg type="s" direction="out" name="filename_used"/>
</method>
<!--
ScreencastArea:
@x: the X coordinate of the area to capture
@y: the Y coordinate of the area to capture
@width: the width of the area to capture
@height: the height of the area to capture
@file_template: the template for the filename to use
@options: a dictionary of optional parameters
@success: whether the screencast was started successfully
@filename_used: the file where the screencast is being saved
Records a screencast of the passed in area and saves it
(by default) as webm video under a filename derived from
@file_template. The template is either a relative or absolute
filename which may contain some escape sequences - %d and %t
will be replaced by the start date and time of the recording.
If a relative name is used, the screencast will be saved in the
$XDG_VIDEOS_DIR if it exists, or the home directory otherwise.
The actual filename of the saved video is returned in @filename_used.
The set of optional parameters in @options currently consists of:
'draw-cursor'(b): whether the cursor should be included in the
recording (true)
'framerate'(i): the number of frames per second that should be
recorded if possible (30)
'pipeline'(s): the GStreamer pipeline used to encode recordings
in gst-launch format; if not specified, the
recorder will produce vp8 (webm) video (unset)
-->
<method name="ScreencastArea">
<arg type="i" direction="in" name="x"/>
<arg type="i" direction="in" name="y"/>
<arg type="i" direction="in" name="width"/>
<arg type="i" direction="in" name="height"/>
<arg type="s" direction="in" name="file_template"/>
<arg type="a{sv}" direction="in" name="options"/>
<arg type="b" direction="out" name="success"/>
<arg type="s" direction="out" name="filename_used"/>
</method>
<!--
StopScreencast:
@success: whether stopping the recording was successful
Stop the recording started by either Screencast or ScreencastArea.
-->
<method name="StopScreencast">
<arg type="b" direction="out" name="success"/>
</method>
</interface>
</node>

View File

@@ -512,7 +512,6 @@ StScrollBar StButton#vhandle:active {
} }
#appMenu { #appMenu {
spinner-image: url("process-working.svg");
spacing: 4px; spacing: 4px;
} }
@@ -1454,13 +1453,11 @@ StScrollBar StButton#vhandle:active {
} }
.notification-button { .notification-button {
-st-natural-width: 140px; padding: 4px 42px 5px;
padding: 4px 4px 5px;
} }
.notification-button:focus { .notification-button:focus {
-st-natural-width: 138px; padding: 3px 41px 4px;
padding: 3px 4px 4px;
} }
.notification-icon-button { .notification-icon-button {
@@ -2386,10 +2383,6 @@ StScrollBar StButton#vhandle:active {
height: .75em; height: .75em;
} }
.login-dialog-logo-bin {
padding: 24px 0px;
}
.login-dialog .modal-dialog-button-box { .login-dialog .modal-dialog-button-box {
spacing: 3px; spacing: 3px;
} }
@@ -2452,6 +2445,7 @@ StScrollBar StButton#vhandle:active {
.screen-shield-background { .screen-shield-background {
background: black; background: black;
box-shadow: 0px 4px 8px rgba(0,0,0,0.9);
} }
#lockDialogGroup { #lockDialogGroup {

View File

@@ -78,7 +78,6 @@ nobase_dist_js_DATA = \
ui/popupMenu.js \ ui/popupMenu.js \
ui/remoteSearch.js \ ui/remoteSearch.js \
ui/runDialog.js \ ui/runDialog.js \
ui/screencast.js \
ui/screenshot.js \ ui/screenshot.js \
ui/screenShield.js \ ui/screenShield.js \
ui/scripting.js \ ui/scripting.js \

View File

@@ -28,7 +28,6 @@ const Mainloop = imports.mainloop;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const Lang = imports.lang; const Lang = imports.lang;
const Pango = imports.gi.Pango; const Pango = imports.gi.Pango;
const Realmd = imports.gdm.realmd;
const Signals = imports.signals; const Signals = imports.signals;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const St = imports.gi.St; const St = imports.gi.St;
@@ -40,6 +39,7 @@ const GdmUtil = imports.gdm.util;
const Lightbox = imports.ui.lightbox; const Lightbox = imports.ui.lightbox;
const Main = imports.ui.main; const Main = imports.ui.main;
const ModalDialog = imports.ui.modalDialog; const ModalDialog = imports.ui.modalDialog;
const Panel = imports.ui.panel;
const PanelMenu = imports.ui.panelMenu; const PanelMenu = imports.ui.panelMenu;
const Tweener = imports.ui.tweener; const Tweener = imports.ui.tweener;
const UserMenu = imports.ui.userMenu; const UserMenu = imports.ui.userMenu;
@@ -48,10 +48,44 @@ const UserWidget = imports.ui.userWidget;
const _FADE_ANIMATION_TIME = 0.25; const _FADE_ANIMATION_TIME = 0.25;
const _SCROLL_ANIMATION_TIME = 0.5; const _SCROLL_ANIMATION_TIME = 0.5;
const _TIMED_LOGIN_IDLE_THRESHOLD = 5.0; const _TIMED_LOGIN_IDLE_THRESHOLD = 5.0;
const _LOGO_ICON_HEIGHT = 48; const _LOGO_ICON_HEIGHT = 16;
const WORK_SPINNER_ICON_SIZE = 24;
const WORK_SPINNER_ANIMATION_DELAY = 1.0;
const WORK_SPINNER_ANIMATION_TIME = 0.3;
let _loginDialog = null; let _loginDialog = null;
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({ const UserListItem = new Lang.Class({
Name: 'UserListItem', Name: 'UserListItem',
@@ -518,12 +552,6 @@ const LoginDialog = new Lang.Class({
Lang.bind(this, this._updateBanner)); Lang.bind(this, this._updateBanner));
this._settings.connect('changed::' + GdmUtil.DISABLE_USER_LIST_KEY, this._settings.connect('changed::' + GdmUtil.DISABLE_USER_LIST_KEY,
Lang.bind(this, this._updateDisableUserList)); Lang.bind(this, this._updateDisableUserList));
this._settings.connect('changed::' + GdmUtil.LOGO_KEY,
Lang.bind(this, this._updateLogo));
this._textureCache = St.TextureCache.get_default();
this._textureCache.connect('texture-file-changed',
Lang.bind(this, this._updateLogoTexture));
this._userSelectionBox = new St.BoxLayout({ style_class: 'login-dialog-user-selection-box', this._userSelectionBox = new St.BoxLayout({ style_class: 'login-dialog-user-selection-box',
vertical: true }); vertical: true });
@@ -581,6 +609,7 @@ const LoginDialog = new Lang.Class({
this._promptBox.add(this._promptLoginHint); this._promptBox.add(this._promptLoginHint);
this._signInButton = null; this._signInButton = null;
this._workSpinner = null;
this._sessionList = new SessionList(); this._sessionList = new SessionList();
this._sessionList.connect('session-activated', this._sessionList.connect('session-activated',
@@ -615,11 +644,6 @@ const LoginDialog = new Lang.Class({
x_align: St.Align.START, x_align: St.Align.START,
x_fill: true }); x_fill: true });
this._logoBin = new St.Bin({ style_class: 'login-dialog-logo-bin', y_expand: true });
this._logoBin.set_y_align(Clutter.ActorAlign.END);
this.backgroundStack.add_actor(this._logoBin);
this._updateLogo();
if (!this._userManager.is_loaded) if (!this._userManager.is_loaded)
this._userManagerLoadedId = this._userManager.connect('notify::is-loaded', this._userManagerLoadedId = this._userManager.connect('notify::is-loaded',
Lang.bind(this, function() { Lang.bind(this, function() {
@@ -666,24 +690,6 @@ const LoginDialog = new Lang.Class({
} }
}, },
_updateLogoTexture: function(cache, uri) {
if (this._logoFileUri != uri)
return;
let icon = null;
if (this._logoFileUri)
icon = this._textureCache.load_uri_async(this._logoFileUri,
-1, _LOGO_ICON_HEIGHT);
this._logoBin.set_child(icon);
},
_updateLogo: function() {
let path = this._settings.get_string(GdmUtil.LOGO_KEY);
this._logoFileUri = path ? Gio.file_new_for_path(path).get_uri() : null;
this._updateLogoTexture(this._textureCache, this._logoFileUri);
},
_reset: function() { _reset: function() {
this._userVerifier.clear(); this._userVerifier.clear();
@@ -702,7 +708,7 @@ const LoginDialog = new Lang.Class({
this._promptEntry.text = ''; this._promptEntry.text = '';
this._updateSensitivity(true); this._updateSensitivity(true);
this.setWorking(false); this._setWorking(false);
}, },
_onDefaultSessionChanged: function(client, sessionId) { _onDefaultSessionChanged: function(client, sessionId) {
@@ -768,6 +774,10 @@ const LoginDialog = new Lang.Class({
}, },
_prepareDialog: function(forSecret, hold) { _prepareDialog: function(forSecret, hold) {
this._workSpinner = new Panel.AnimatedIcon('process-working.svg', WORK_SPINNER_ICON_SIZE);
this._workSpinner.actor.opacity = 0;
this._workSpinner.actor.show();
this.buttonLayout.visible = true; this.buttonLayout.visible = true;
this.clearButtons(); this.clearButtons();
@@ -780,11 +790,12 @@ const LoginDialog = new Lang.Class({
y_fill: false, y_fill: false,
x_align: St.Align.START, x_align: St.Align.START,
y_align: St.Align.MIDDLE }); y_align: St.Align.MIDDLE });
this.placeSpinner({ expand: false, this.buttonLayout.add(this._workSpinner.actor,
x_fill: false, { expand: false,
y_fill: false, x_fill: false,
x_align: St.Align.END, y_fill: false,
y_align: St.Align.MIDDLE }); x_align: St.Align.END,
y_align: St.Align.MIDDLE });
this._signInButton = this.addButton({ action: Lang.bind(this, function() { this._signInButton = this.addButton({ action: Lang.bind(this, function() {
hold.release(); hold.release();
}), }),
@@ -837,7 +848,7 @@ const LoginDialog = new Lang.Class({
this._promptEntryActivateId = 0; this._promptEntryActivateId = 0;
} }
this.setWorking(false); this._setWorking(false);
this._promptBox.hide(); this._promptBox.hide();
this._promptLoginHint.hide(); this._promptLoginHint.hide();
@@ -850,9 +861,36 @@ const LoginDialog = new Lang.Class({
this._promptLoginHint.hide(); this._promptLoginHint.hide();
this.clearButtons(); this.clearButtons();
this._workSpinner = null;
this._signInButton = null; this._signInButton = null;
}, },
_setWorking: function(working) {
if (!this._workSpinner)
return;
if (working) {
this._workSpinner.play();
Tweener.addTween(this._workSpinner.actor,
{ opacity: 255,
delay: WORK_SPINNER_ANIMATION_DELAY,
time: WORK_SPINNER_ANIMATION_TIME,
transition: 'linear'
});
} else {
Tweener.addTween(this._workSpinner.actor,
{ opacity: 0,
time: WORK_SPINNER_ANIMATION_TIME,
transition: 'linear',
onCompleteScope: this,
onComplete: function() {
if (this._workSpinner)
this._workSpinner.stop();
}
});
}
},
_askQuestion: function(verifier, serviceName, question, passwordChar) { _askQuestion: function(verifier, serviceName, question, passwordChar) {
this._promptLabel.set_text(question); this._promptLabel.set_text(question);
@@ -867,7 +905,7 @@ const LoginDialog = new Lang.Class({
function() { function() {
let text = this._promptEntry.get_text(); let text = this._promptEntry.get_text();
this._updateSensitivity(false); this._updateSensitivity(false);
this.setWorking(true); this._setWorking(true);
this._userVerifier.answerQuery(serviceName, text); this._userVerifier.answerQuery(serviceName, text);
}]; }];
@@ -875,40 +913,17 @@ const LoginDialog = new Lang.Class({
return batch.run(); return batch.run();
}, },
_showRealmLoginHint: function(realmManager, hint) {
if (!hint)
return;
hint = hint.replace(/%U/g, 'user');
hint = hint.replace(/%D/g, 'DOMAIN');
hint = hint.replace(/%[^UD]/g, '');
// Translators: this message is shown below the username entry field
// to clue the user in on how to login to the local network realm
this._showLoginHint(null, _("(e.g., user or %s)").format(hint));
},
_askForUsernameAndLogIn: function() { _askForUsernameAndLogIn: function() {
this._promptLabel.set_text(_("Username: ")); this._promptLabel.set_text(_("Username: "));
this._promptEntry.set_text(''); this._promptEntry.set_text('');
this._promptEntry.clutter_text.set_password_char(''); this._promptEntry.clutter_text.set_password_char('');
let realmManager = new Realmd.Manager();
let signalId = realmManager.connect('login-format-changed',
Lang.bind(this, this._showRealmLoginHint));
this._showRealmLoginHint(realmManager.loginFormat);
let tasks = [this._showPrompt, let tasks = [this._showPrompt,
function() { function() {
let userName = this._promptEntry.get_text(); let userName = this._promptEntry.get_text();
this._promptEntry.reactive = false; this._promptEntry.reactive = false;
return this._beginVerificationForUser(userName); return this._beginVerificationForUser(userName);
},
function() {
realmManager.disconnect(signalId)
realmManager.release();
}]; }];
let batch = new Batch.ConsecutiveBatch(this, tasks); let batch = new Batch.ConsecutiveBatch(this, tasks);

View File

@@ -63,7 +63,7 @@ const Manager = new Lang.Class({
Lang.bind(this, this._reloadRealms)) Lang.bind(this, this._reloadRealms))
this._realms = {}; this._realms = {};
this._signalId = this._aggregateProvider.connect('g-properties-changed', this._aggregateProvider.connect('g-properties-changed',
Lang.bind(this, function(proxy, properties) { Lang.bind(this, function(proxy, properties) {
if ('Realms' in properties.deep_unpack()) if ('Realms' in properties.deep_unpack())
this._reloadRealms(); this._reloadRealms();
@@ -106,7 +106,7 @@ const Manager = new Lang.Class({
realm.connect('g-properties-changed', realm.connect('g-properties-changed',
Lang.bind(this, function(proxy, properties) { Lang.bind(this, function(proxy, properties) {
if ('Configured' in properties.deep_unpack()) if ('Configured' in properties.deep_unpack())
this._reloadRealm(realm); this._reloadRealm();
})); }));
}, },
@@ -134,18 +134,6 @@ const Manager = new Lang.Class({
this._updateLoginFormat(); this._updateLoginFormat();
return this._loginFormat; return this._loginFormat;
},
release: function() {
Service(Gio.DBus.system,
'org.freedesktop.realmd',
'/org/freedesktop/realmd',
function(service) {
service.ReleaseRemote();
});
this._aggregateProvider.disconnect(this._signalId);
this._realms = { };
this._updateLoginFormat();
} }
}); });
Signals.addSignalMethods(Manager.prototype) Signals.addSignalMethods(Manager.prototype)

View File

@@ -9,6 +9,7 @@ const Signals = imports.signals;
const Batch = imports.gdm.batch; const Batch = imports.gdm.batch;
const Fprint = imports.gdm.fingerprint; const Fprint = imports.gdm.fingerprint;
const Realmd = imports.gdm.realmd;
const Main = imports.ui.main; const Main = imports.ui.main;
const Params = imports.misc.params; const Params = imports.misc.params;
const Tweener = imports.ui.tweener; const Tweener = imports.ui.tweener;
@@ -116,6 +117,7 @@ const ShellUserVerifier = new Lang.Class({
this._settings = new Gio.Settings({ schema: LOGIN_SCREEN_SCHEMA }); this._settings = new Gio.Settings({ schema: LOGIN_SCREEN_SCHEMA });
this._fprintManager = new Fprint.FprintManager(); this._fprintManager = new Fprint.FprintManager();
this._realmManager = new Realmd.Manager();
this._messageQueue = []; this._messageQueue = [];
this._messageQueueTimeoutId = 0; this._messageQueueTimeoutId = 0;
this.hasPendingMessages = false; this.hasPendingMessages = false;
@@ -375,11 +377,30 @@ const ShellUserVerifier = new Lang.Class({
this._queueMessage(problem, 'login-dialog-message-warning'); this._queueMessage(problem, 'login-dialog-message-warning');
}, },
_showRealmLoginHint: function() {
if (this._realmManager.loginFormat) {
let hint = this._realmManager.loginFormat;
hint = hint.replace(/%U/g, 'user');
hint = hint.replace(/%D/g, 'DOMAIN');
hint = hint.replace(/%[^UD]/g, '');
// Translators: this message is shown below the username entry field
// to clue the user in on how to login to the local network realm
this.emit('show-login-hint',
_("(e.g., user or %s)").format(hint));
}
},
_onInfoQuery: function(client, serviceName, question) { _onInfoQuery: function(client, serviceName, question) {
// We only expect questions to come from the main auth service // We only expect questions to come from the main auth service
if (serviceName != PASSWORD_SERVICE_NAME) if (serviceName != PASSWORD_SERVICE_NAME)
return; return;
this._showRealmLoginHint();
this._realmLoginHintSignalId = this._realmManager.connect('login-format-changed',
Lang.bind(this, this._showRealmLoginHint));
this.emit('ask-question', serviceName, question, ''); this.emit('ask-question', serviceName, question, '');
}, },
@@ -455,6 +476,11 @@ const ShellUserVerifier = new Lang.Class({
} }
this.emit('hide-login-hint'); this.emit('hide-login-hint');
if (this._realmLoginHintSignalId) {
this._realmManager.disconnect(this._realmLoginHintSignalId);
this._realmLoginHintSignalId = 0;
}
}, },
}); });
Signals.addSignalMethods(ShellUserVerifier.prototype); Signals.addSignalMethods(ShellUserVerifier.prototype);

View File

@@ -233,10 +233,8 @@ const AppSwitcherPopup = new Lang.Class({
_finish : function(timestamp) { _finish : function(timestamp) {
let appIcon = this._items[this._selectedIndex]; let appIcon = this._items[this._selectedIndex];
if (this._currentWindow < 0) let window = this._currentWindow > 0 ? this._currentWindow : 0;
appIcon.app.activate_full(-1, timestamp); appIcon.app.activate_window(appIcon.cachedWindows[window], timestamp);
else
Main.activateWindow(appIcon.cachedWindows[this._currentWindow], timestamp);
this.parent(); this.parent();
}, },

View File

@@ -625,24 +625,10 @@ const AppFolderPopup = new Lang.Class({
this._boxPointer.actor.bind_property('opacity', closeButton, 'opacity', this._boxPointer.actor.bind_property('opacity', closeButton, 'opacity',
GObject.BindingFlags.SYNC_CREATE); GObject.BindingFlags.SYNC_CREATE);
global.focus_manager.add_group(this.actor);
source.actor.connect('destroy', Lang.bind(this, source.actor.connect('destroy', Lang.bind(this,
function() { function() {
this.actor.destroy(); this.actor.destroy();
})); }));
this.actor.connect('key-press-event', Lang.bind(this, this._onKeyPress));
},
_onKeyPress: function(actor, event) {
if (!this._isOpen)
return false;
if (event.get_key_symbol() != Clutter.KEY_Escape)
return false;
this.popdown();
return true;
}, },
toggle: function() { toggle: function() {
@@ -657,7 +643,6 @@ const AppFolderPopup = new Lang.Class({
return; return;
this.actor.show(); this.actor.show();
this.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
this._boxPointer.setArrowActor(this._source.actor); this._boxPointer.setArrowActor(this._source.actor);
this._boxPointer.show(BoxPointer.PopupAnimation.FADE | this._boxPointer.show(BoxPointer.PopupAnimation.FADE |

View File

@@ -126,11 +126,6 @@ const BackgroundCache = new Lang.Class({
}, },
removeImageContent: function(content) { removeImageContent: function(content) {
let filename = content.get_filename();
if (filename && this._fileMonitors[filename])
delete this._fileMonitors[filename];
this._removeContent(this._images, content); this._removeContent(this._images, content);
}, },
@@ -431,7 +426,7 @@ const Background = new Lang.Class({
content.brightness = this._brightness; content.brightness = this._brightness;
content.vignette_sharpness = this._vignetteSharpness; content.vignette_sharpness = this._vignetteSharpness;
this._cache.removeImageContent(this._images[index].content); this._cache.removeImageContent(content);
this._images[index].content = content; this._images[index].content = content;
this._watchCacheFile(filename); this._watchCacheFile(filename);
}, },
@@ -747,15 +742,11 @@ const BackgroundManager = new Lang.Class({
time: FADE_ANIMATION_TIME, time: FADE_ANIMATION_TIME,
transition: 'easeOutQuad', transition: 'easeOutQuad',
onComplete: Lang.bind(this, function() { onComplete: Lang.bind(this, function() {
if (this._newBackground == newBackground) { if (this.background == background) {
this.background = newBackground; this.background = newBackground;
this._newBackground = null; this._newBackground = null;
} else { background.actor.destroy();
newBackground.actor.destroy();
} }
background.actor.destroy();
this.emit('changed'); this.emit('changed');
}) })
}); });

View File

@@ -46,10 +46,8 @@ function addBackgroundMenu(actor) {
clickAction.connect('long-press', function(action, actor, state) { clickAction.connect('long-press', function(action, actor, state) {
if (state == Clutter.LongPressState.QUERY) if (state == Clutter.LongPressState.QUERY)
return action.get_button() == 1 && !actor._backgroundMenu.isOpen; return action.get_button() == 1 && !actor._backgroundMenu.isOpen;
if (state == Clutter.LongPressState.ACTIVATE) { if (state == Clutter.LongPressState.ACTIVATE)
openMenu(); openMenu();
actor._backgroundManager.ignoreRelease();
}
return true; return true;
}); });
clickAction.connect('clicked', function(action) { clickAction.connect('clicked', function(action) {
@@ -62,7 +60,5 @@ function addBackgroundMenu(actor) {
actor._backgroundMenu.destroy(); actor._backgroundMenu.destroy();
actor._backgroundMenu = null; actor._backgroundMenu = null;
actor._backgroundManager = null; actor._backgroundManager = null;
cursor.destroy();
}); });
} }

View File

@@ -25,7 +25,7 @@ const KeyringDialog = new Lang.Class({
this.prompt = new Shell.KeyringPrompt(); this.prompt = new Shell.KeyringPrompt();
this.prompt.connect('show-password', Lang.bind(this, this._onShowPassword)); this.prompt.connect('show-password', Lang.bind(this, this._onShowPassword));
this.prompt.connect('show-confirm', Lang.bind(this, this._onShowConfirm)); this.prompt.connect('show-confirm', Lang.bind(this, this._onShowConfirm));
this.prompt.connect('prompt-close', Lang.bind(this, this._onHidePrompt)); this.prompt.connect('hide-prompt', Lang.bind(this, this._onHidePrompt));
let mainContentBox = new St.BoxLayout({ style_class: 'prompt-dialog-main-layout', let mainContentBox = new St.BoxLayout({ style_class: 'prompt-dialog-main-layout',
vertical: false }); vertical: false });
@@ -63,17 +63,11 @@ const KeyringDialog = new Lang.Class({
this._cancelButton = this.addButton({ label: '', this._cancelButton = this.addButton({ label: '',
action: Lang.bind(this, this._onCancelButton), action: Lang.bind(this, this._onCancelButton),
key: Clutter.Escape }, key: Clutter.Escape });
{ expand: true, x_fill: false, x_align: St.Align.START });
this.placeSpinner({ expand: false,
x_fill: false,
y_fill: false,
x_align: St.Align.END,
y_align: St.Align.MIDDLE });
this._continueButton = this.addButton({ label: '', this._continueButton = this.addButton({ label: '',
action: Lang.bind(this, this._onContinueButton), action: Lang.bind(this, this._onContinueButton),
default: true }, default: true },
{ expand: false, x_fill: false, x_align: St.Align.END }); { expand: true, x_fill: false, x_align: St.Align.END });
this.prompt.bind_property('cancel-label', this._cancelButton, 'label', GObject.BindingFlags.SYNC_CREATE); this.prompt.bind_property('cancel-label', this._cancelButton, 'label', GObject.BindingFlags.SYNC_CREATE);
this.prompt.bind_property('continue-label', this._continueButton, 'label', GObject.BindingFlags.SYNC_CREATE); this.prompt.bind_property('continue-label', this._continueButton, 'label', GObject.BindingFlags.SYNC_CREATE);
@@ -149,19 +143,11 @@ const KeyringDialog = new Lang.Class({
}, },
_updateSensitivity: function(sensitive) { _updateSensitivity: function(sensitive) {
if (this._passwordEntry) { this._passwordEntry.reactive = sensitive;
this._passwordEntry.reactive = sensitive; this._passwordEntry.clutter_text.editable = sensitive;
this._passwordEntry.clutter_text.editable = sensitive;
}
if (this._confirmEntry) {
this._confirmEntry.reactive = sensitive;
this._confirmEntry.clutter_text.editable = sensitive;
}
this._continueButton.can_focus = sensitive; this._continueButton.can_focus = sensitive;
this._continueButton.reactive = sensitive; this._continueButton.reactive = sensitive;
this.setWorking(!sensitive);
}, },
_ensureOpen: function() { _ensureOpen: function() {

View File

@@ -31,6 +31,7 @@ const AuthenticationDialog = new Lang.Class({
this.message = message; this.message = message;
this.userNames = userNames; this.userNames = userNames;
this._wasDismissed = false; this._wasDismissed = false;
this._completed = false;
let mainContentBox = new St.BoxLayout({ style_class: 'prompt-dialog-main-layout', let mainContentBox = new St.BoxLayout({ style_class: 'prompt-dialog-main-layout',
vertical: false }); vertical: false });
@@ -160,32 +161,26 @@ const AuthenticationDialog = new Lang.Class({
this._cancelButton = this.addButton({ label: _("Cancel"), this._cancelButton = this.addButton({ label: _("Cancel"),
action: Lang.bind(this, this.cancel), action: Lang.bind(this, this.cancel),
key: Clutter.Escape }, key: Clutter.Escape });
{ expand: true, x_fill: false, x_align: St.Align.START });
this.placeSpinner({ expand: false,
x_fill: false,
y_fill: false,
x_align: St.Align.END,
y_align: St.Align.MIDDLE });
this._okButton = this.addButton({ label: _("Authenticate"), this._okButton = this.addButton({ label: _("Authenticate"),
action: Lang.bind(this, this._onAuthenticateButtonPressed), action: Lang.bind(this, this._onAuthenticateButtonPressed),
default: true }, default: true },
{ expand: false, x_fill: false, x_align: St.Align.END }); { expand: true, x_fill: false, x_align: St.Align.END });
this._doneEmitted = false; this._doneEmitted = false;
this._identityToAuth = Polkit.UnixUser.new_for_name(userName); this._identityToAuth = Polkit.UnixUser.new_for_name(userName);
this._cookie = cookie; this._cookie = cookie;
},
performAuthentication: function() {
this.destroySession();
this._session = new PolkitAgent.Session({ identity: this._identityToAuth, this._session = new PolkitAgent.Session({ identity: this._identityToAuth,
cookie: this._cookie }); cookie: this._cookie });
this._session.connect('completed', Lang.bind(this, this._onSessionCompleted)); this._session.connect('completed', Lang.bind(this, this._onSessionCompleted));
this._session.connect('request', Lang.bind(this, this._onSessionRequest)); this._session.connect('request', Lang.bind(this, this._onSessionRequest));
this._session.connect('show-error', Lang.bind(this, this._onSessionShowError)); this._session.connect('show-error', Lang.bind(this, this._onSessionShowError));
this._session.connect('show-info', Lang.bind(this, this._onSessionShowInfo)); this._session.connect('show-info', Lang.bind(this, this._onSessionShowInfo));
},
startAuthentication: function() {
this._session.initiate(); this._session.initiate();
}, },
@@ -207,14 +202,14 @@ const AuthenticationDialog = new Lang.Class({
log('polkitAuthenticationAgent: Failed to show modal dialog.' + log('polkitAuthenticationAgent: Failed to show modal dialog.' +
' Dismissing authentication request for action-id ' + this.actionId + ' Dismissing authentication request for action-id ' + this.actionId +
' cookie ' + this._cookie); ' cookie ' + this._cookie);
this._emitDone(true); this._emitDone(false, true);
} }
}, },
_emitDone: function(dismissed) { _emitDone: function(keepVisible, dismissed) {
if (!this._doneEmitted) { if (!this._doneEmitted) {
this._doneEmitted = true; this._doneEmitted = true;
this.emit('done', dismissed); this.emit('done', keepVisible, dismissed);
} }
}, },
@@ -224,7 +219,6 @@ const AuthenticationDialog = new Lang.Class({
this._okButton.can_focus = sensitive; this._okButton.can_focus = sensitive;
this._okButton.reactive = sensitive; this._okButton.reactive = sensitive;
this.setWorking(!sensitive);
}, },
_onEntryActivate: function() { _onEntryActivate: function() {
@@ -243,16 +237,12 @@ const AuthenticationDialog = new Lang.Class({
}, },
_onSessionCompleted: function(session, gainedAuthorization) { _onSessionCompleted: function(session, gainedAuthorization) {
if (this._completed || this._doneEmitted) if (this._completed)
return; return;
this._completed = true; this._completed = true;
/* Yay, all done */ if (!gainedAuthorization) {
if (gainedAuthorization) {
this._emitDone(false);
} else {
/* Unless we are showing an existing error message from the PAM /* Unless we are showing an existing error message from the PAM
* module (the PAM module could be reporting the authentication * module (the PAM module could be reporting the authentication
* error providing authentication-method specific information), * error providing authentication-method specific information),
@@ -268,10 +258,8 @@ const AuthenticationDialog = new Lang.Class({
this._infoMessageLabel.hide(); this._infoMessageLabel.hide();
this._nullMessageLabel.hide(); this._nullMessageLabel.hide();
} }
/* Try and authenticate again */
this.performAuthentication();
} }
this._emitDone(!gainedAuthorization, false);
}, },
_onSessionRequest: function(session, request, echo_on) { _onSessionRequest: function(session, request, echo_on) {
@@ -315,7 +303,6 @@ const AuthenticationDialog = new Lang.Class({
if (this._session) { if (this._session) {
if (!this._completed) if (!this._completed)
this._session.cancel(); this._session.cancel();
this._completed = false;
this._session = null; this._session = null;
} }
}, },
@@ -330,7 +317,7 @@ const AuthenticationDialog = new Lang.Class({
cancel: function() { cancel: function() {
this._wasDismissed = true; this._wasDismissed = true;
this.close(global.get_current_time()); this.close(global.get_current_time());
this._emitDone(true); this._emitDone(false, true);
}, },
}); });
Signals.addSignalMethods(AuthenticationDialog.prototype); Signals.addSignalMethods(AuthenticationDialog.prototype);
@@ -340,6 +327,7 @@ const AuthenticationAgent = new Lang.Class({
_init: function() { _init: function() {
this._currentDialog = null; this._currentDialog = null;
this._isCompleting = false;
this._handle = null; this._handle = null;
this._native = new Shell.PolkitAuthenticationAgent(); this._native = new Shell.PolkitAuthenticationAgent();
this._native.connect('initiate', Lang.bind(this, this._onInitiate)); this._native.connect('initiate', Lang.bind(this, this._onInitiate));
@@ -376,24 +364,45 @@ const AuthenticationAgent = new Lang.Class({
// discussion. // discussion.
this._currentDialog.connect('done', Lang.bind(this, this._onDialogDone)); this._currentDialog.connect('done', Lang.bind(this, this._onDialogDone));
this._currentDialog.performAuthentication(); this._currentDialog.startAuthentication();
}, },
_onCancel: function(nativeAgent) { _onCancel: function(nativeAgent) {
this._completeRequest(false); this._completeRequest(false, false);
}, },
_onDialogDone: function(dialog, dismissed) { _onDialogDone: function(dialog, keepVisible, dismissed) {
this._completeRequest(dismissed); this._completeRequest(keepVisible, dismissed);
}, },
_completeRequest: function(dismissed) { _reallyCompleteRequest: function(dismissed) {
this._currentDialog.close(); this._currentDialog.close();
this._currentDialog.destroySession(); this._currentDialog.destroySession();
this._currentDialog = null; this._currentDialog = null;
this._isCompleting = false;
this._native.complete(dismissed); this._native.complete(dismissed)
}, },
_completeRequest: function(keepVisible, wasDismissed) {
if (this._isCompleting)
return;
this._isCompleting = true;
if (keepVisible) {
// Give the user 2 seconds to read 'Authentication Failure' before
// dismissing the dialog
Mainloop.timeout_add(2000,
Lang.bind(this,
function() {
this._reallyCompleteRequest(wasDismissed);
return false;
}));
} else {
this._reallyCompleteRequest(wasDismissed);
}
}
}); });
const Component = AuthenticationAgent; const Component = AuthenticationAgent;

View File

@@ -20,7 +20,8 @@ const Recorder = new Lang.Class({
Main.wm.addKeybinding('toggle-recording', Main.wm.addKeybinding('toggle-recording',
this._bindingSettings, this._bindingSettings,
Meta.KeyBindingFlags.NONE, Meta.KeyBindingFlags.NONE,
Shell.KeyBindingMode.ALL, Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._toggleRecorder)); Lang.bind(this, this._toggleRecorder));
}, },

View File

@@ -89,25 +89,19 @@ const CtrlAltTabManager = new Lang.Class({
let items = this._items.filter(function (item) { return item.proxy.mapped; }); let items = this._items.filter(function (item) { return item.proxy.mapped; });
// And add the windows metacity would show in its Ctrl-Alt-Tab list // And add the windows metacity would show in its Ctrl-Alt-Tab list
if (Main.sessionMode.hasWindows && !Main.overview.visible) { if (!Main.overview.visible) {
let screen = global.screen; let screen = global.screen;
let display = screen.get_display(); let display = screen.get_display();
let windows = display.get_tab_list(Meta.TabList.DOCKS, screen, screen.get_active_workspace ()); let windows = display.get_tab_list(Meta.TabList.DOCKS, screen, screen.get_active_workspace ());
let windowTracker = Shell.WindowTracker.get_default(); let windowTracker = Shell.WindowTracker.get_default();
let textureCache = St.TextureCache.get_default(); let textureCache = St.TextureCache.get_default();
for (let i = 0; i < windows.length; i++) { for (let i = 0; i < windows.length; i++) {
let icon = null; let icon;
let iconName = null; let app = windowTracker.get_window_app(windows[i]);
if (windows[i].get_window_type () == Meta.WindowType.DESKTOP) { if (app)
iconName = 'video-display-symbolic'; icon = app.create_icon_texture(POPUP_APPICON_SIZE);
} else { else
let app = windowTracker.get_window_app(windows[i]); icon = textureCache.bind_pixbuf_property(windows[i], 'icon');
if (app)
icon = app.create_icon_texture(POPUP_APPICON_SIZE);
else
icon = textureCache.bind_pixbuf_property(windows[i], 'icon');
}
items.push({ name: windows[i].title, items.push({ name: windows[i].title,
proxy: windows[i].get_compositor_private(), proxy: windows[i].get_compositor_private(),
focusCallback: Lang.bind(windows[i], focusCallback: Lang.bind(windows[i],
@@ -115,7 +109,6 @@ const CtrlAltTabManager = new Lang.Class({
Main.activateWindow(this, timestamp); Main.activateWindow(this, timestamp);
}), }),
iconActor: icon, iconActor: icon,
iconName: iconName,
sortGroup: SortGroup.MIDDLE }); sortGroup: SortGroup.MIDDLE });
} }
} }

View File

@@ -100,6 +100,7 @@ const DateMenuButton = new Lang.Class({
Shell.AppSystem.get_default().connect('installed-changed', Shell.AppSystem.get_default().connect('installed-changed',
Lang.bind(this, this._appInstalledChanged)); Lang.bind(this, this._appInstalledChanged));
this._appInstalledChanged();
item = this.menu.addSettingsAction(_("Date & Time Settings"), 'gnome-datetime-panel.desktop'); item = this.menu.addSettingsAction(_("Date & Time Settings"), 'gnome-datetime-panel.desktop');
if (item) { if (item) {
@@ -156,16 +157,14 @@ const DateMenuButton = new Lang.Class({
}, },
_appInstalledChanged: function() { _appInstalledChanged: function() {
this._calendarApp = undefined; let app = Shell.AppSystem.get_default().lookup_app('gnome-clocks.desktop');
this._updateEventsVisibility(); this._openClocksItem.actor.visible = app !== null;
}, },
_updateEventsVisibility: function() { _updateEventsVisibility: function() {
let visible = this._eventSource.hasCalendars; let visible = this._eventSource.hasCalendars;
this._openCalendarItem.actor.visible = visible && this._openCalendarItem.actor.visible = visible;
(this._getCalendarApp() != null); this._openClocksItem.actor.visible = visible;
this._openClocksItem.actor.visible = visible &&
(this._getClockApp() != null);
this._separator.visible = visible; this._separator.visible = visible;
if (visible) { if (visible) {
let alignment = 0.25; let alignment = 0.25;
@@ -218,34 +217,18 @@ const DateMenuButton = new Lang.Class({
this._date.set_text(displayDate.toLocaleFormat(dateFormat)); this._date.set_text(displayDate.toLocaleFormat(dateFormat));
}, },
_getCalendarApp: function() {
if (this._calendarApp !== undefined)
return this._calendarApp;
let apps = Gio.AppInfo.get_recommended_for_type('text/calendar');
if (apps && (apps.length > 0))
this._calendarApp = apps[0];
else
this._calendarApp = null;
return this._calendarApp;
},
_getClockApp: function() {
return Shell.AppSystem.get_default().lookup_app('gnome-clocks.desktop');
},
_onOpenCalendarActivate: function() { _onOpenCalendarActivate: function() {
this.menu.close(); this.menu.close();
let app = this._getCalendarApp(); let app = Gio.AppInfo.get_default_for_type('text/calendar', false);
if (app.get_id() == 'evolution.desktop') if (app.get_id() == 'evolution')
app = Gio.DesktopAppInfo.new('evolution-calendar.desktop'); app = Gio.DesktopAppInfo.new('evolution-calendar');
app.launch([], global.create_app_launch_context()); app.launch([], global.create_app_launch_context());
}, },
_onOpenClocksActivate: function() { _onOpenClocksActivate: function() {
this.menu.close(); this.menu.close();
let app = this._getClockApp(); let app = Shell.AppSystem.get_default().lookup_app('gnome-clocks.desktop');
app.activate(); app.activate();
} }
}); });

View File

@@ -291,19 +291,19 @@ const _Draggable = new Lang.Class({
this._dragOrigY = this._dragActor.y; this._dragOrigY = this._dragActor.y;
this._dragOrigScale = this._dragActor.scale_x; this._dragOrigScale = this._dragActor.scale_x;
// Set the actor's scale such that it will keep the same this._dragActor.reparent(Main.uiGroup);
// transformed size when it's reparented to the uiGroup this._dragActor.raise_top();
let [scaledWidth, scaledHeight] = this.actor.get_transformed_size(); Shell.util_set_hidden_from_pick(this._dragActor, true);
this._dragActor.set_scale(scaledWidth / this.actor.width,
scaledHeight / this.actor.height);
let [actorStageX, actorStageY] = this.actor.get_transformed_position(); let [actorStageX, actorStageY] = this.actor.get_transformed_position();
this._dragOffsetX = actorStageX - this._dragStartX; this._dragOffsetX = actorStageX - this._dragStartX;
this._dragOffsetY = actorStageY - this._dragStartY; this._dragOffsetY = actorStageY - this._dragStartY;
this._dragActor.reparent(Main.uiGroup); // Set the actor's scale such that it will keep the same
this._dragActor.raise_top(); // transformed size when it's reparented to the uiGroup
Shell.util_set_hidden_from_pick(this._dragActor, true); let [scaledWidth, scaledHeight] = this.actor.get_transformed_size();
this.actor.set_scale(scaledWidth / this.actor.width,
scaledHeight / this.actor.height);
} }
this._dragOrigOpacity = this._dragActor.opacity; this._dragOrigOpacity = this._dragActor.opacity;

View File

@@ -1092,21 +1092,12 @@ const HotCorner = new Lang.Class({
} }
if (size > 0) { if (size > 0) {
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) { this._verticalBarrier = new Meta.Barrier({ display: global.display,
this._verticalBarrier = new Meta.Barrier({ display: global.display, x1: this._x, x2: this._x, y1: this._y, y2: this._y + size,
x1: this._x, x2: this._x, y1: this._y, y2: this._y + size, directions: Meta.BarrierDirection.POSITIVE_X });
directions: Meta.BarrierDirection.NEGATIVE_X }); this._horizontalBarrier = new Meta.Barrier({ display: global.display,
this._horizontalBarrier = new Meta.Barrier({ display: global.display, x1: this._x, x2: this._x + size, y1: this._y, y2: this._y,
x1: this._x - size, x2: this._x, y1: this._y, y2: this._y, directions: Meta.BarrierDirection.POSITIVE_Y });
directions: Meta.BarrierDirection.POSITIVE_Y });
} else {
this._verticalBarrier = new Meta.Barrier({ display: global.display,
x1: this._x, x2: this._x, y1: this._y, y2: this._y + size,
directions: Meta.BarrierDirection.POSITIVE_X });
this._horizontalBarrier = new Meta.Barrier({ display: global.display,
x1: this._x, x2: this._x + size, y1: this._y, y2: this._y,
directions: Meta.BarrierDirection.POSITIVE_Y });
}
this._pressureBarrier.addBarrier(this._verticalBarrier); this._pressureBarrier.addBarrier(this._verticalBarrier);
this._pressureBarrier.addBarrier(this._horizontalBarrier); this._pressureBarrier.addBarrier(this._horizontalBarrier);

View File

@@ -1721,9 +1721,6 @@ const MessageTray = new Lang.Class({
this.actor.add_action(clickAction); this.actor.add_action(clickAction);
clickAction.connect('clicked', Lang.bind(this, function(action) { clickAction.connect('clicked', Lang.bind(this, function(action) {
if (this._trayState != State.SHOWN)
return;
let button = action.get_button(); let button = action.get_button();
if (button == 3) if (button == 3)
this._openContextMenu(); this._openContextMenu();
@@ -1734,7 +1731,7 @@ const MessageTray = new Lang.Class({
clickAction.connect('long-press', Lang.bind(this, function(action, actor, state) { clickAction.connect('long-press', Lang.bind(this, function(action, actor, state) {
switch (state) { switch (state) {
case Clutter.LongPressState.QUERY: case Clutter.LongPressState.QUERY:
return this._trayState == State.SHOWN; return true;
case Clutter.LongPressState.ACTIVATE: case Clutter.LongPressState.ACTIVATE:
this._openContextMenu(); this._openContextMenu();
} }

View File

@@ -22,10 +22,6 @@ const Tweener = imports.ui.tweener;
const OPEN_AND_CLOSE_TIME = 0.1; const OPEN_AND_CLOSE_TIME = 0.1;
const FADE_OUT_DIALOG_TIME = 1.0; const FADE_OUT_DIALOG_TIME = 1.0;
const WORK_SPINNER_ICON_SIZE = 24;
const WORK_SPINNER_ANIMATION_DELAY = 1.0;
const WORK_SPINNER_ANIMATION_TIME = 0.3;
const State = { const State = {
OPENED: 0, OPENED: 0,
CLOSED: 1, CLOSED: 1,
@@ -69,9 +65,7 @@ const ModalDialog = new Lang.Class({
this._group.connect('key-press-event', Lang.bind(this, this._onKeyPressEvent)); this._group.connect('key-press-event', Lang.bind(this, this._onKeyPressEvent));
this._group.connect('key-release-event', Lang.bind(this, this._onKeyReleaseEvent)); this._group.connect('key-release-event', Lang.bind(this, this._onKeyReleaseEvent));
this.backgroundStack = new St.Widget({ layout_manager: new Clutter.BinLayout() }); this._backgroundBin = new St.Bin();
this._backgroundBin = new St.Bin({ child: this.backgroundStack,
x_fill: true, y_fill: true });
this._monitorConstraint = new Layout.MonitorConstraint(); this._monitorConstraint = new Layout.MonitorConstraint();
this._backgroundBin.add_constraint(this._monitorConstraint); this._backgroundBin.add_constraint(this._monitorConstraint);
this._group.add_actor(this._backgroundBin); this._group.add_actor(this._backgroundBin);
@@ -87,10 +81,15 @@ const ModalDialog = new Lang.Class({
{ inhibitEvents: true }); { inhibitEvents: true });
this._lightbox.highlight(this._backgroundBin); this._lightbox.highlight(this._backgroundBin);
let stack = new Shell.Stack();
this._backgroundBin.child = stack;
this._eventBlocker = new Clutter.Actor({ reactive: true }); this._eventBlocker = new Clutter.Actor({ reactive: true });
this.backgroundStack.add_actor(this._eventBlocker); stack.add_actor(this._eventBlocker);
stack.add_actor(this.dialogLayout);
} else {
this._backgroundBin.child = this.dialogLayout;
} }
this.backgroundStack.add_actor(this.dialogLayout);
this.contentLayout = new St.BoxLayout({ vertical: true }); this.contentLayout = new St.BoxLayout({ vertical: true });
@@ -111,8 +110,6 @@ const ModalDialog = new Lang.Class({
this._initialKeyFocus = this.dialogLayout; this._initialKeyFocus = this.dialogLayout;
this._initialKeyFocusDestroyId = 0; this._initialKeyFocusDestroyId = 0;
this._savedKeyFocus = null; this._savedKeyFocus = null;
this._workSpinner = null;
}, },
destroy: function() { destroy: function() {
@@ -186,44 +183,6 @@ const ModalDialog = new Lang.Class({
return button; return button;
}, },
placeSpinner: function(layoutInfo) {
/* This is here because of recursive imports */
const Panel = imports.ui.panel;
let spinnerIcon = global.datadir + '/theme/process-working.svg';
this._workSpinner = new Panel.AnimatedIcon(spinnerIcon, WORK_SPINNER_ICON_SIZE);
this._workSpinner.actor.opacity = 0;
this._workSpinner.actor.show();
this.buttonLayout.add(this._workSpinner.actor, layoutInfo);
},
setWorking: function(working) {
if (!this._workSpinner)
return;
Tweener.removeTweens(this._workSpinner.actor);
if (working) {
this._workSpinner.play();
Tweener.addTween(this._workSpinner.actor,
{ opacity: 255,
delay: WORK_SPINNER_ANIMATION_DELAY,
time: WORK_SPINNER_ANIMATION_TIME,
transition: 'linear'
});
} else {
Tweener.addTween(this._workSpinner.actor,
{ opacity: 0,
time: WORK_SPINNER_ANIMATION_TIME,
transition: 'linear',
onCompleteScope: this,
onComplete: function() {
if (this._workSpinner)
this._workSpinner.stop();
}
});
}
},
_onKeyPressEvent: function(object, event) { _onKeyPressEvent: function(object, event) {
this._pressedKey = event.get_key_symbol(); this._pressedKey = event.get_key_symbol();
}, },

View File

@@ -8,7 +8,6 @@ const Layout = imports.ui.layout;
const Main = imports.ui.main; const Main = imports.ui.main;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
const Tweener = imports.ui.tweener; const Tweener = imports.ui.tweener;
const Meta = imports.gi.Meta;
const HIDE_TIMEOUT = 1500; const HIDE_TIMEOUT = 1500;
const FADE_TIME = 0.1; const FADE_TIME = 0.1;
@@ -72,7 +71,6 @@ const OsdWindow = new Lang.Class({
Name: 'OsdWindow', Name: 'OsdWindow',
_init: function() { _init: function() {
this._popupSize = 0;
this.actor = new St.Widget({ x_expand: true, this.actor = new St.Widget({ x_expand: true,
y_expand: true, y_expand: true,
x_align: Clutter.ActorAlign.CENTER, x_align: Clutter.ActorAlign.CENTER,
@@ -82,15 +80,6 @@ const OsdWindow = new Lang.Class({
vertical: true }); vertical: true });
this.actor.add_actor(this._box); this.actor.add_actor(this._box);
this._box.connect('style-changed', Lang.bind(this, this._onStyleChanged));
this._box.connect('notify::height', Lang.bind(this,
function() {
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this,
function() {
this._box.width = this._box.height;
}));
}));
this._icon = new St.Icon(); this._icon = new St.Icon();
this._box.add(this._icon, { expand: true }); this._box.add(this._icon, { expand: true });
@@ -180,25 +169,11 @@ const OsdWindow = new Lang.Class({
let scalew = monitor.width / 640.0; let scalew = monitor.width / 640.0;
let scaleh = monitor.height / 480.0; let scaleh = monitor.height / 480.0;
let scale = Math.min(scalew, scaleh); let scale = Math.min(scalew, scaleh);
this._popupSize = 110 * Math.max(1, scale); let size = 110 * Math.max(1, scale);
this._box.set_size(size, size);
this._box.translation_y = monitor.height / 4; this._box.translation_y = monitor.height / 4;
this._icon.icon_size = this._popupSize / 2;
this._box.style_changed();
},
_onStyleChanged: function() { this._icon.icon_size = size / 2;
let themeNode = this._box.get_theme_node();
let horizontalPadding = themeNode.get_horizontal_padding();
let verticalPadding = themeNode.get_vertical_padding();
let topBorder = themeNode.get_border_width(St.Side.TOP);
let bottomBorder = themeNode.get_border_width(St.Side.BOTTOM);
let leftBorder = themeNode.get_border_width(St.Side.LEFT);
let rightBorder = themeNode.get_border_width(St.Side.RIGHT);
let minWidth = this._popupSize - verticalPadding - leftBorder - rightBorder;
let minHeight = this._popupSize - horizontalPadding - topBorder - bottomBorder;
this._box.style = 'min-height: %dpx;'.format(Math.max(minWidth, minHeight));
} }
}); });

View File

@@ -144,8 +144,8 @@ const AnimatedIcon = new Lang.Class({
Name: 'AnimatedIcon', Name: 'AnimatedIcon',
Extends: Animation, Extends: Animation,
_init: function(filename, size) { _init: function(name, size) {
this.parent(filename, size, size, ANIMATED_ICON_UPDATE_TIMEOUT); this.parent(global.datadir + '/theme/' + name, size, size, ANIMATED_ICON_UPDATE_TIMEOUT);
} }
}); });
@@ -258,7 +258,6 @@ const AppMenuButton = new Lang.Class({
this._actionGroupNotifyId = 0; this._actionGroupNotifyId = 0;
let bin = new St.Bin({ name: 'appMenu' }); let bin = new St.Bin({ name: 'appMenu' });
bin.connect('style-changed', Lang.bind(this, this._onStyleChanged));
this.actor.add_actor(bin); this.actor.add_actor(bin);
this.actor.bind_property("reactive", this.actor, "can-focus", 0); this.actor.bind_property("reactive", this.actor, "can-focus", 0);
@@ -289,25 +288,27 @@ const AppMenuButton = new Lang.Class({
this._visible = !Main.overview.visible; this._visible = !Main.overview.visible;
if (!this._visible) if (!this._visible)
this.actor.hide(); this.actor.hide();
this._overviewHidingId = Main.overview.connect('hiding', Lang.bind(this, function () { Main.overview.connect('hiding', Lang.bind(this, function () {
this.show(); this.show();
})); }));
this._overviewShowingId = Main.overview.connect('showing', Lang.bind(this, function () { Main.overview.connect('showing', Lang.bind(this, function () {
this.hide(); this.hide();
})); }));
this._stop = true; this._stop = true;
this._spinner = null; this._spinner = new AnimatedIcon('process-working.svg',
PANEL_ICON_SIZE);
this._container.add_actor(this._spinner.actor);
this._spinner.actor.hide();
this._spinner.actor.lower_bottom();
let tracker = Shell.WindowTracker.get_default(); let tracker = Shell.WindowTracker.get_default();
let appSys = Shell.AppSystem.get_default(); let appSys = Shell.AppSystem.get_default();
this._focusAppNotifyId = tracker.connect('notify::focus-app', Lang.bind(this, this._focusAppChanged));
tracker.connect('notify::focus-app', Lang.bind(this, this._focusAppChanged)); appSys.connect('app-state-changed', Lang.bind(this, this._onAppStateChanged));
this._appStateChangedSignalId =
appSys.connect('app-state-changed', Lang.bind(this, this._onAppStateChanged)); global.window_manager.connect('switch-workspace', Lang.bind(this, this._sync));
this._switchWorkspaceNotifyId =
global.window_manager.connect('switch-workspace', Lang.bind(this, this._sync));
this._sync(); this._sync();
}, },
@@ -353,18 +354,6 @@ const AppMenuButton = new Lang.Class({
onCompleteScope: this }); onCompleteScope: this });
}, },
_onStyleChanged: function(actor) {
let node = actor.get_theme_node();
let [success, icon] = node.lookup_url('spinner-image', false);
if (!success || this._spinnerIcon == icon)
return;
this._spinnerIcon = icon;
this._spinner = new AnimatedIcon(this._spinnerIcon, PANEL_ICON_SIZE);
this._container.add_actor(this._spinner.actor);
this._spinner.actor.hide();
this._spinner.actor.lower_bottom();
},
_onIconBoxStyleChanged: function() { _onIconBoxStyleChanged: function() {
let node = this._iconBox.get_theme_node(); let node = this._iconBox.get_theme_node();
this._iconBottomClip = node.get_length('app-icon-bottom-clip'); this._iconBottomClip = node.get_length('app-icon-bottom-clip');
@@ -396,10 +385,6 @@ const AppMenuButton = new Lang.Class({
this._stop = true; this._stop = true;
this.actor.reactive = true; this.actor.reactive = true;
if (this._spinner == null)
return;
Tweener.addTween(this._spinner.actor, Tweener.addTween(this._spinner.actor,
{ opacity: 0, { opacity: 0,
time: SPINNER_ANIMATION_TIME, time: SPINNER_ANIMATION_TIME,
@@ -416,10 +401,6 @@ const AppMenuButton = new Lang.Class({
startAnimation: function() { startAnimation: function() {
this._stop = false; this._stop = false;
this.actor.reactive = false; this.actor.reactive = false;
if (this._spinner == null)
return;
this._spinner.play(); this._spinner.play();
this._spinner.actor.show(); this._spinner.actor.show();
}, },
@@ -482,9 +463,6 @@ const AppMenuButton = new Lang.Class({
} }
this._label.actor.allocate(childBox, flags); this._label.actor.allocate(childBox, flags);
if (this._spinner == null)
return;
if (direction == Clutter.TextDirection.LTR) { if (direction == Clutter.TextDirection.LTR) {
childBox.x1 = Math.floor(iconWidth / 2) + this._label.actor.width; childBox.x1 = Math.floor(iconWidth / 2) + this._label.actor.width;
childBox.x2 = childBox.x1 + this._spinner.actor.width; childBox.x2 = childBox.x1 + this._spinner.actor.width;
@@ -575,8 +553,7 @@ const AppMenuButton = new Lang.Class({
return; return;
} }
if (this._spinner) this._spinner.actor.hide();
this._spinner.actor.hide();
if (this._iconBox.child != null) if (this._iconBox.child != null)
this._iconBox.child.destroy(); this._iconBox.child.destroy();
this._iconBox.hide(); this._iconBox.hide();
@@ -639,33 +616,6 @@ const AppMenuButton = new Lang.Class({
this.setMenu(menu); this.setMenu(menu);
this._menuManager.addMenu(menu); this._menuManager.addMenu(menu);
},
destroy: function() {
if (this._appStateChangedSignalId > 0) {
let appSys = Shell.AppSystem.get_default();
appSys.disconnect(this._appStateChangedSignalId);
this._appStateChangedSignalId = 0;
}
if (this._focusAppNotifyId > 0) {
let tracker = Shell.WindowTracker.get_default();
tracker.disconnect(this._focusAppNotifyId);
this._focusAppNotifyId = 0;
}
if (this._overviewHidingId > 0) {
Main.overview.disconnect(this._overviewHidingId);
this._overviewHidingId = 0;
}
if (this._overviewShowingId > 0) {
Main.overview.disconnect(this._overviewShowingId);
this._overviewShowingId = 0;
}
if (this._switchWorkspaceNotifyId > 0) {
global.window_manager.disconnect(this._switchWorkspaceNotifyId);
this._switchWorkspaceNotifyId = 0;
}
this.parent();
} }
}); });
@@ -923,6 +873,7 @@ const PANEL_ITEM_IMPLEMENTATIONS = {
'volume': imports.ui.status.volume.Indicator, 'volume': imports.ui.status.volume.Indicator,
'battery': imports.ui.status.power.Indicator, 'battery': imports.ui.status.power.Indicator,
'lockScreen': imports.ui.status.lockScreenMenu.Indicator, 'lockScreen': imports.ui.status.lockScreenMenu.Indicator,
'logo': imports.gdm.loginDialog.LogoMenuButton,
'keyboard': imports.ui.status.keyboard.InputSourceIndicator, 'keyboard': imports.ui.status.keyboard.InputSourceIndicator,
'powerMenu': imports.gdm.powerMenu.PowerMenuButton, 'powerMenu': imports.gdm.powerMenu.PowerMenuButton,
'userMenu': imports.ui.userMenu.UserMenuButton 'userMenu': imports.ui.userMenu.UserMenuButton
@@ -951,7 +902,7 @@ const Panel = new Lang.Class({
this.statusArea = {}; this.statusArea = {};
this.menuManager = new PopupMenu.PopupMenuManager(this, { keybindingMode: Shell.KeyBindingMode.TOPBAR_POPUP }); this.menuManager = new PopupMenu.PopupMenuManager(this);
this._leftBox = new St.BoxLayout({ name: 'panelLeft' }); this._leftBox = new St.BoxLayout({ name: 'panelLeft' });
this.actor.add_actor(this._leftBox); this.actor.add_actor(this._leftBox);
@@ -1105,18 +1056,17 @@ const Panel = new Lang.Class({
return true; return true;
}, },
toggleAppMenu: function() { openAppMenu: function() {
let indicator = this.statusArea.appMenu; let indicator = this.statusArea.appMenu;
if (!indicator) // appMenu not supported by current session mode if (!indicator) // appMenu not supported by current session mode
return; return;
let menu = indicator.menu; let menu = indicator.menu;
if (!indicator.actor.reactive) if (!indicator.actor.reactive || menu.isOpen)
return; return;
menu.toggle(); menu.open();
if (menu.isOpen) menu.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
menu.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
}, },
set boxOpacity(value) { set boxOpacity(value) {

View File

@@ -1157,7 +1157,6 @@ const PopupMenuBase = new Lang.Class({
}, },
destroy: function() { destroy: function() {
this.close();
this.removeAll(); this.removeAll();
this.actor.destroy(); this.actor.destroy();
@@ -2052,9 +2051,9 @@ const RemoteMenu = new Lang.Class({
const PopupMenuManager = new Lang.Class({ const PopupMenuManager = new Lang.Class({
Name: 'PopupMenuManager', Name: 'PopupMenuManager',
_init: function(owner, grabParams) { _init: function(owner) {
this._owner = owner; this._owner = owner;
this._grabHelper = new GrabHelper.GrabHelper(owner.actor, grabParams); this._grabHelper = new GrabHelper.GrabHelper(owner.actor);
this._menus = []; this._menus = [];
}, },
@@ -2124,8 +2123,6 @@ const PopupMenuManager = new Lang.Class({
_onMenuOpenState: function(menu, open) { _onMenuOpenState: function(menu, open) {
if (open) { if (open) {
if (this.activeMenu)
this.activeMenu.close(BoxPointer.PopupAnimation.FADE);
this._grabHelper.grab({ actor: menu.actor, modal: true, focus: menu.sourceActor, this._grabHelper.grab({ actor: menu.actor, modal: true, focus: menu.sourceActor,
onUngrab: Lang.bind(this, this._closeMenu, menu) }); onUngrab: Lang.bind(this, this._closeMenu, menu) });
} else { } else {
@@ -2142,8 +2139,13 @@ const PopupMenuManager = new Lang.Class({
}, },
_changeMenu: function(newMenu) { _changeMenu: function(newMenu) {
newMenu.open(this.activeMenu ? BoxPointer.PopupAnimation.FADE let oldMenu = this.activeMenu;
: BoxPointer.PopupAnimation.FULL); if (oldMenu) {
oldMenu.close(BoxPointer.PopupAnimation.FADE);
newMenu.open(BoxPointer.PopupAnimation.FADE);
} else {
newMenu.open(BoxPointer.PopupAnimation.FULL);
}
}, },
_onMenuSourceEnter: function(menu) { _onMenuSourceEnter: function(menu) {

View File

@@ -35,8 +35,7 @@ const RunDialog = new Lang.Class({
Extends: ModalDialog.ModalDialog, Extends: ModalDialog.ModalDialog,
_init : function() { _init : function() {
this.parent({ styleClass: 'run-dialog', this.parent({ styleClass: 'run-dialog' });
destroyOnClose: false });
this._lockdownSettings = new Gio.Settings({ schema: LOCKDOWN_SCHEMA }); this._lockdownSettings = new Gio.Settings({ schema: LOCKDOWN_SCHEMA });
this._terminalSettings = new Gio.Settings({ schema: TERMINAL_SCHEMA }); this._terminalSettings = new Gio.Settings({ schema: TERMINAL_SCHEMA });

View File

@@ -562,7 +562,6 @@ const ScreenShield = new Lang.Class({
this._bgManagers[i].destroy(); this._bgManagers[i].destroy();
this._bgManagers = []; this._bgManagers = [];
this._backgroundGroup.destroy_all_children();
for (let i = 0; i < Main.layoutManager.monitors.length; i++) for (let i = 0; i < Main.layoutManager.monitors.length; i++)
this._createBackground(i); this._createBackground(i);
@@ -1115,9 +1114,6 @@ const ScreenShield = new Lang.Class({
deactivate: function(animate) { deactivate: function(animate) {
this._hideLockScreen(animate, 0); this._hideLockScreen(animate, 0);
if (this._hasLockScreen)
this._clearLockScreen();
if (Main.sessionMode.currentMode == 'lock-screen') if (Main.sessionMode.currentMode == 'lock-screen')
Main.sessionMode.popMode('lock-screen'); Main.sessionMode.popMode('lock-screen');
if (Main.sessionMode.currentMode == 'unlock-dialog') if (Main.sessionMode.currentMode == 'unlock-dialog')
@@ -1134,6 +1130,9 @@ const ScreenShield = new Lang.Class({
}, },
_completeDeactivate: function() { _completeDeactivate: function() {
if (this._hasLockScreen)
this._clearLockScreen();
if (this._dialog && !this._isGreeter) { if (this._dialog && !this._isGreeter) {
this._dialog.destroy(); this._dialog.destroy();
this._dialog = null; this._dialog = null;

View File

@@ -1,138 +0,0 @@
// -*- 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 Hash = imports.misc.hash;
const Main = imports.ui.main;
const ScreencastIface = <interface name="org.gnome.Shell.Screencast">
<method name="Screencast">
<arg type="s" direction="in" name="file_template"/>
<arg type="a{sv}" direction="in" name="options"/>
<arg type="b" direction="out" name="success"/>
<arg type="s" direction="out" name="filename_used"/>
</method>
<method name="ScreencastArea">
<arg type="i" direction="in" name="x"/>
<arg type="i" direction="in" name="y"/>
<arg type="i" direction="in" name="width"/>
<arg type="i" direction="in" name="height"/>
<arg type="s" direction="in" name="file_template"/>
<arg type="a{sv}" direction="in" name="options"/>
<arg type="b" direction="out" name="success"/>
<arg type="s" direction="out" name="filename_used"/>
</method>
<method name="StopScreencast">
<arg type="b" direction="out" name="success"/>
</method>
</interface>;
const ScreencastService = new Lang.Class({
Name: 'ScreencastService',
_init: function() {
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ScreencastIface, this);
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell/Screencast');
Gio.DBus.session.own_name('org.gnome.Shell.Screencast', Gio.BusNameOwnerFlags.REPLACE, null, null);
this._recorders = new Hash.Map();
Main.sessionMode.connect('updated',
Lang.bind(this, this._sessionModeChanged));
},
_ensureRecorderForSender: function(sender) {
let recorder = this._recorders.get(sender);
if (!recorder) {
recorder = new Shell.Recorder({ stage: global.stage });
recorder._watchNameId =
Gio.bus_watch_name(Gio.BusType.SESSION, sender, 0, null,
Lang.bind(this, this._onNameVanished));
this._recorders.set(sender, recorder);
}
return recorder;
},
_sessionModeChanged: function() {
if (Main.sessionMode.allowScreencast)
return;
for (let sender in this._recorders.keys())
this._recorders.delete(sender);
},
_onNameVanished: function(connection, name) {
this._stopRecordingForSender(name);
},
_stopRecordingForSender: function(sender) {
let recorder = this._recorders.get(sender);
if (!recorder)
return false;
Gio.bus_unwatch_name(recorder._watchNameId);
recorder.close();
this._recorders.delete(sender);
return true;
},
_applyOptionalParameters: function(recorder, options) {
for (let option in options)
options[option] = options[option].deep_unpack();
if (options['pipeline'])
recorder.set_pipeline(options['pipeline']);
if (options['framerate'])
recorder.set_framerate(options['framerate']);
if (options['draw-cursor'])
recorder.set_draw_cursor(options['draw-cursor']);
},
ScreencastAsync: function(params, invocation) {
let returnValue = [false, ''];
if (!Main.sessionMode.allowScreencast)
invocation.return_value(GLib.Variant.new('(bs)', returnValue));
let sender = invocation.get_sender();
let recorder = this._ensureRecorderForSender(sender);
if (!recorder.is_recording()) {
let [fileTemplate, options] = params;
recorder.set_file_template(fileTemplate);
this._applyOptionalParameters(recorder, options);
returnValue = recorder.record();
}
invocation.return_value(GLib.Variant.new('(bs)', returnValue));
},
ScreencastAreaAsync: function(params, invocation) {
let returnValue = [false, ''];
if (!Main.sessionMode.allowScreencast)
invocation.return_value(GLib.Variant.new('(bs)', returnValue));
let sender = invocation.get_sender();
let recorder = this._ensureRecorderForSender(sender);
if (!recorder.is_recording()) {
let [x, y, width, height, fileTemplate, options] = params;
recorder.set_file_template(fileTemplate);
recorder.set_area(x, y, width, height);
this._applyOptionalParameters(recorder, options);
returnValue = recorder.record();
}
invocation.return_value(GLib.Variant.new('(bs)', returnValue));
},
StopScreencastAsync: function(params, invocation) {
let success = this._stopRecordingForSender(invocation.get_sender());
invocation.return_value(GLib.Variant.new('(b)', [success]));
}
});

View File

@@ -45,7 +45,7 @@ const _modes = {
unlockDialog: imports.gdm.loginDialog.LoginDialog, unlockDialog: imports.gdm.loginDialog.LoginDialog,
components: ['polkitAgent'], components: ['polkitAgent'],
panel: { panel: {
left: [], left: ['logo'],
center: ['dateMenu'], center: ['dateMenu'],
right: ['a11yGreeter', 'display', 'keyboard', right: ['a11yGreeter', 'display', 'keyboard',
'volume', 'battery', 'powerMenu'] 'volume', 'battery', 'powerMenu']
@@ -81,7 +81,7 @@ const _modes = {
'initial-setup': { 'initial-setup': {
hasWindows: true, hasWindows: true,
isPrimary: true, isPrimary: true,
components: ['networkAgent', 'keyring'], components: ['keyring'],
panel: { panel: {
left: [], left: [],
center: ['dateMenu'], center: ['dateMenu'],
@@ -195,10 +195,6 @@ const SessionMode = new Lang.Class({
return this._modeStack[this._modeStack.length - 1]; return this._modeStack[this._modeStack.length - 1];
}, },
get allowScreencast() {
return this.components.indexOf('recorder') != -1;
},
_sync: function() { _sync: function() {
let params = this._modes[this.currentMode]; let params = this._modes[this.currentMode];
let defaults; let defaults;

View File

@@ -12,7 +12,6 @@ const ExtensionDownloader = imports.ui.extensionDownloader;
const ExtensionUtils = imports.misc.extensionUtils; const ExtensionUtils = imports.misc.extensionUtils;
const Hash = imports.misc.hash; const Hash = imports.misc.hash;
const Main = imports.ui.main; const Main = imports.ui.main;
const Screencast = imports.ui.screencast;
const Screenshot = imports.ui.screenshot; const Screenshot = imports.ui.screenshot;
const GnomeShellIface = <interface name="org.gnome.Shell"> const GnomeShellIface = <interface name="org.gnome.Shell">
@@ -71,7 +70,6 @@ const GnomeShell = new Lang.Class({
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell'); this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell');
this._extensionsService = new GnomeShellExtensions(); this._extensionsService = new GnomeShellExtensions();
this._screencastService = new Screencast.ScreencastService();
this._screenshotService = new Screenshot.ScreenshotService(); this._screenshotService = new Screenshot.ScreenshotService();
this._grabbedAccelerators = new Hash.Map(); this._grabbedAccelerators = new Hash.Map();
@@ -99,7 +97,7 @@ const GnomeShell = new Lang.Class({
*/ */
Eval: function(code) { Eval: function(code) {
if (!global.settings.get_boolean('development-tools')) if (!global.settings.get_boolean('development-tools'))
return [false, '']; return [false, null];
let returnValue; let returnValue;
let success; let success;

View File

@@ -14,7 +14,9 @@ const EntryMenu = new Lang.Class({
Name: 'ShellEntryMenu', Name: 'ShellEntryMenu',
Extends: PopupMenu.PopupMenu, Extends: PopupMenu.PopupMenu,
_init: function(entry) { _init: function(entry, params) {
params = Params.parse (params, { isPassword: false });
this.parent(entry, 0, St.Side.TOP); this.parent(entry, 0, St.Side.TOP);
this.actor.add_style_class_name('entry-context-menu'); this.actor.add_style_class_name('entry-context-menu');
@@ -35,6 +37,8 @@ const EntryMenu = new Lang.Class({
this._pasteItem = item; this._pasteItem = item;
this._passwordItem = null; this._passwordItem = null;
if (params.isPassword)
this._makePasswordItem();
Main.uiGroup.add_actor(this.actor); Main.uiGroup.add_actor(this.actor);
this.actor.hide(); this.actor.hide();
@@ -49,21 +53,19 @@ const EntryMenu = new Lang.Class({
}, },
get isPassword() { get isPassword() {
return this._passwordItem != null; return this._passwordItem != null;
}, },
set isPassword(v) { set isPassword(v) {
if (v == this.isPassword) if (v == this.isPassword)
return; return;
if (v) { if (v)
this._makePasswordItem(); this._makePasswordItem();
this._entry.input_purpose = Gtk.InputPurpose.PASSWORD; else {
} else { this._passwordItem.destroy();
this._passwordItem.destroy(); this._passwordItem = null;
this._passwordItem = null; }
this._entry.input_purpose = Gtk.InputPurpose.FREE_FORM;
}
}, },
open: function(animate) { open: function(animate) {
@@ -80,6 +82,11 @@ const EntryMenu = new Lang.Class({
this.actor.grab_key_focus(); this.actor.grab_key_focus();
}, },
close: function(animate) {
this._entry.grab_key_focus();
this.parent(animate);
},
_updateCopyItem: function() { _updateCopyItem: function() {
let selection = this._entry.clutter_text.get_selection(); let selection = this._entry.clutter_text.get_selection();
this._copyItem.setSensitive(!this._entry.clutter_text.password_char && this._copyItem.setSensitive(!this._entry.clutter_text.password_char &&
@@ -153,10 +160,7 @@ function addContextMenu(entry, params) {
if (entry.menu) if (entry.menu)
return; return;
params = Params.parse (params, { isPassword: false }); entry.menu = new EntryMenu(entry, params);
entry.menu = new EntryMenu(entry);
entry.menu.isPassword = params.isPassword;
entry._menuManager = new PopupMenu.PopupMenuManager({ actor: entry }); entry._menuManager = new PopupMenu.PopupMenuManager({ actor: entry });
entry._menuManager.addMenu(entry.menu); entry._menuManager.addMenu(entry.menu);

View File

@@ -33,6 +33,36 @@ const KEY_INPUT_SOURCES = 'sources';
const INPUT_SOURCE_TYPE_XKB = 'xkb'; const INPUT_SOURCE_TYPE_XKB = 'xkb';
const INPUT_SOURCE_TYPE_IBUS = 'ibus'; const INPUT_SOURCE_TYPE_IBUS = 'ibus';
// This is longest we'll keep the keyboard frozen until an input
// source is active.
const MAX_INPUT_SOURCE_ACTIVATION_TIME = 2000; // ms
const BUS_NAME = 'org.gnome.SettingsDaemon.Keyboard';
const OBJECT_PATH = '/org/gnome/SettingsDaemon/Keyboard';
const KeyboardManagerInterface =
<interface name="org.gnome.SettingsDaemon.Keyboard">
<method name="SetInputSource">
<arg type="u" direction="in" />
</method>
</interface>;
const KeyboardManagerProxy = Gio.DBusProxy.makeProxyWrapper(KeyboardManagerInterface);
function releaseKeyboard() {
if (Main.modalCount > 0)
global.display.unfreeze_keyboard(global.get_current_time());
else
global.display.ungrab_keyboard(global.get_current_time());
}
function holdKeyboard() {
if (Main.modalCount > 0)
global.display.freeze_keyboard(global.get_current_time());
else
global.display.grab_keyboard(global.get_current_time());
}
const IBusManager = new Lang.Class({ const IBusManager = new Lang.Class({
Name: 'IBusManager', Name: 'IBusManager',
@@ -45,24 +75,26 @@ const IBusManager = new Lang.Class({
this._readyCallback = readyCallback; this._readyCallback = readyCallback;
this._candidatePopup = new IBusCandidatePopup.CandidatePopup(); this._candidatePopup = new IBusCandidatePopup.CandidatePopup();
this._ibus = null;
this._panelService = null; this._panelService = null;
this._engines = {}; this._engines = {};
this._ready = false; this._ready = false;
this._registerPropertiesId = 0; this._registerPropertiesId = 0;
this._currentEngineName = null; this._currentEngineName = null;
this._ibus = IBus.Bus.new_async(); this._nameWatcherId = Gio.DBus.session.watch_name(IBus.SERVICE_IBUS,
this._ibus.connect('connected', Lang.bind(this, this._onConnected)); Gio.BusNameWatcherFlags.NONE,
this._ibus.connect('disconnected', Lang.bind(this, this._clear)); Lang.bind(this, this._onNameAppeared),
// Need to set this to get 'global-engine-changed' emitions Lang.bind(this, this._clear));
this._ibus.set_watch_ibus_signal(true);
this._ibus.connect('global-engine-changed', Lang.bind(this, this._engineChanged));
}, },
_clear: function() { _clear: function() {
if (this._panelService) if (this._panelService)
this._panelService.destroy(); this._panelService.destroy();
if (this._ibus)
this._ibus.destroy();
this._ibus = null;
this._panelService = null; this._panelService = null;
this._candidatePopup.setPanelService(null); this._candidatePopup.setPanelService(null);
this._engines = {}; this._engines = {};
@@ -74,12 +106,18 @@ const IBusManager = new Lang.Class({
this._readyCallback(false); this._readyCallback(false);
}, },
_onNameAppeared: function() {
this._ibus = IBus.Bus.new_async();
this._ibus.connect('connected', Lang.bind(this, this._onConnected));
},
_onConnected: function() { _onConnected: function() {
this._ibus.list_engines_async(-1, null, Lang.bind(this, this._initEngines)); this._ibus.list_engines_async(-1, null, Lang.bind(this, this._initEngines));
this._ibus.request_name_async(IBus.SERVICE_PANEL, this._ibus.request_name_async(IBus.SERVICE_PANEL,
IBus.BusNameFlag.REPLACE_EXISTING, IBus.BusNameFlag.REPLACE_EXISTING,
-1, null, -1, null,
Lang.bind(this, this._initPanelService)); Lang.bind(this, this._initPanelService));
this._ibus.connect('disconnected', Lang.bind(this, this._clear));
}, },
_initEngines: function(ibus, result) { _initEngines: function(ibus, result) {
@@ -101,6 +139,9 @@ const IBusManager = new Lang.Class({
this._panelService = new IBus.PanelService({ connection: this._ibus.get_connection(), this._panelService = new IBus.PanelService({ connection: this._ibus.get_connection(),
object_path: IBus.PATH_PANEL }); object_path: IBus.PATH_PANEL });
this._candidatePopup.setPanelService(this._panelService); this._candidatePopup.setPanelService(this._panelService);
// Need to set this to get 'global-engine-changed' emitions
this._ibus.set_watch_ibus_signal(true);
this._ibus.connect('global-engine-changed', Lang.bind(this, this._engineChanged));
this._panelService.connect('update-property', Lang.bind(this, this._updateProperty)); this._panelService.connect('update-property', Lang.bind(this, this._updateProperty));
// If an engine is already active we need to get its properties // If an engine is already active we need to get its properties
this._ibus.get_global_engine_async(-1, null, Lang.bind(this, function(i, result) { this._ibus.get_global_engine_async(-1, null, Lang.bind(this, function(i, result) {
@@ -129,9 +170,6 @@ const IBusManager = new Lang.Class({
}, },
_engineChanged: function(bus, engineName) { _engineChanged: function(bus, engineName) {
if (!this._ready)
return;
this._currentEngineName = engineName; this._currentEngineName = engineName;
if (this._registerPropertiesId != 0) if (this._registerPropertiesId != 0)
@@ -222,6 +260,7 @@ const InputSource = new Lang.Class({
}, },
activate: function() { activate: function() {
holdKeyboard();
this.emit('activate'); this.emit('activate');
}, },
}); });
@@ -254,11 +293,11 @@ const InputSourcePopup = new Lang.Class({
this._select(this._selectedIndex); this._select(this._selectedIndex);
}, },
_keyPressHandler: function(keysym, backwards, action) { _keyPressHandler: function(keysym, _ignored, action) {
if (action == this._action) if (action == this._action)
this._select(backwards ? this._previous() : this._next()); this._select(this._next());
else if (action == this._actionBackward) else if (action == this._actionBackward)
this._select(backwards ? this._next() : this._previous()); this._select(this._previous());
else if (keysym == Clutter.Left) else if (keysym == Clutter.Left)
this._select(this._previous()); this._select(this._previous());
else if (keysym == Clutter.Right) else if (keysym == Clutter.Right)
@@ -328,15 +367,14 @@ const InputSourceIndicator = new Lang.Class({
this._keybindingAction = this._keybindingAction =
Main.wm.addKeybinding('switch-input-source', Main.wm.addKeybinding('switch-input-source',
new Gio.Settings({ schema: "org.gnome.desktop.wm.keybindings" }), new Gio.Settings({ schema: "org.gnome.desktop.wm.keybindings" }),
Meta.KeyBindingFlags.REVERSES, Meta.KeyBindingFlags.NONE,
Shell.KeyBindingMode.ALL & ~Shell.KeyBindingMode.MESSAGE_TRAY, Shell.KeyBindingMode.ALL,
Lang.bind(this, this._switchInputSource)); Lang.bind(this, this._switchInputSource));
this._keybindingActionBackward = this._keybindingActionBackward =
Main.wm.addKeybinding('switch-input-source-backward', Main.wm.addKeybinding('switch-input-source-backward',
new Gio.Settings({ schema: "org.gnome.desktop.wm.keybindings" }), new Gio.Settings({ schema: "org.gnome.desktop.wm.keybindings" }),
Meta.KeyBindingFlags.REVERSES | Meta.KeyBindingFlags.NONE,
Meta.KeyBindingFlags.REVERSED, Shell.KeyBindingMode.ALL,
Shell.KeyBindingMode.ALL & ~Shell.KeyBindingMode.MESSAGE_TRAY,
Lang.bind(this, this._switchInputSource)); Lang.bind(this, this._switchInputSource));
this._settings = new Gio.Settings({ schema: DESKTOP_INPUT_SOURCES_SCHEMA }); this._settings = new Gio.Settings({ schema: DESKTOP_INPUT_SOURCES_SCHEMA });
this._settings.connect('changed::' + KEY_CURRENT_INPUT_SOURCE, Lang.bind(this, this._currentInputSourceChanged)); this._settings.connect('changed::' + KEY_CURRENT_INPUT_SOURCE, Lang.bind(this, this._currentInputSourceChanged));
@@ -356,6 +394,13 @@ const InputSourceIndicator = new Lang.Class({
this._ibusManager.connect('property-updated', Lang.bind(this, this._ibusPropertyUpdated)); this._ibusManager.connect('property-updated', Lang.bind(this, this._ibusPropertyUpdated));
this._inputSourcesChanged(); this._inputSourcesChanged();
this._keyboardManager = new KeyboardManagerProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH,
function(proxy, error) {
if (error)
log(error.message);
});
global.display.connect('modifiers-accelerator-activated', Lang.bind(this, this._modifiersSwitcher));
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this._showLayoutItem = this.menu.addAction(_("Show Keyboard Layout"), Lang.bind(this, this._showLayout)); this._showLayoutItem = this.menu.addAction(_("Show Keyboard Layout"), Lang.bind(this, this._showLayout));
@@ -389,13 +434,44 @@ const InputSourceIndicator = new Lang.Class({
this._inputSourcesChanged(); this._inputSourcesChanged();
}, },
_modifiersSwitcher: function() {
let sourceIndexes = Object.keys(this._inputSources);
if (sourceIndexes.length == 0) {
releaseKeyboard();
return;
}
let is = this._currentSource;
if (!is)
is = this._inputSources[sourceIndexes[0]];
let nextIndex = is.index + 1;
if (nextIndex > sourceIndexes[sourceIndexes.length - 1])
nextIndex = 0;
while (!(is = this._inputSources[nextIndex]))
nextIndex += 1;
is.activate();
},
_switchInputSource: function(display, screen, window, binding) { _switchInputSource: function(display, screen, window, binding) {
if (this._mruSources.length < 2) if (this._mruSources.length < 2)
return; return;
// HACK: Fall back on simple input source switching since we
// can't show a popup switcher while the message tray is up
// without considerable work to consolidate the usage of
// pushModal/popModal and grabHelper. See
// https://bugzilla.gnome.org/show_bug.cgi?id=695143 .
if (Main.keybindingMode == Shell.KeyBindingMode.MESSAGE_TRAY) {
this._modifiersSwitcher();
return;
}
let popup = new InputSourcePopup(this._mruSources, this._keybindingAction, this._keybindingActionBackward); let popup = new InputSourcePopup(this._mruSources, this._keybindingAction, this._keybindingActionBackward);
let modifiers = binding.get_modifiers(); let modifiers = binding.get_modifiers();
let backwards = modifiers & Meta.VirtualModifier.SHIFT_MASK; let backwards = false; // Not using this
if (!popup.show(backwards, binding.get_name(), binding.get_mask())) if (!popup.show(backwards, binding.get_name(), binding.get_mask()))
popup.destroy(); popup.destroy();
}, },
@@ -479,10 +555,10 @@ const InputSourceIndicator = new Lang.Class({
let is = new InputSource(type, id, displayName, shortName, i); let is = new InputSource(type, id, displayName, shortName, i);
is.connect('activate', Lang.bind(this, function() { is.connect('activate', Lang.bind(this, function() {
if (this._currentSource && this._currentSource.index == is.index) let inVariant = new GLib.Variant('(u)', [is.index]);
return; this._keyboardManager.call('SetInputSource', inVariant, 0,
this._settings.set_value(KEY_CURRENT_INPUT_SOURCE, MAX_INPUT_SOURCE_ACTIVATION_TIME,
GLib.Variant.new_uint32(is.index)); null, releaseKeyboard);
})); }));
if (!(is.shortName in inputSourcesByShortName)) if (!(is.shortName in inputSourcesByShortName))

View File

@@ -2047,7 +2047,6 @@ const NMApplet = new Lang.Class({
let default_ip4 = null; let default_ip4 = null;
let default_ip6 = null; let default_ip6 = null;
let active_vpn = null; let active_vpn = null;
let active_any = null;
for (let i = 0; i < this._activeConnections.length; i++) { for (let i = 0; i < this._activeConnections.length; i++) {
let a = this._activeConnections[i]; let a = this._activeConnections[i];
@@ -2078,15 +2077,10 @@ const NMApplet = new Lang.Class({
if (a.default6) if (a.default6)
default_ip6 = a; default_ip6 = a;
if (a.state == NetworkManager.ActiveConnectionState.ACTIVATING) if (a._type == 'vpn')
activating = a;
else if (a.state == NetworkManager.ActiveConnectionState.ACTIVE)
active_any = a;
if (a._type == 'vpn' &&
(a.state == NetworkManager.ActiveConnectionState.ACTIVATING ||
a.state == NetworkManager.ActiveConnectionState.ACTIVE))
active_vpn = a; active_vpn = a;
else if (a.state == NetworkManager.ActiveConnectionState.ACTIVATING)
activating = a;
if (!a._primaryDevice) { if (!a._primaryDevice) {
if (a._type != NetworkManager.SETTING_VPN_SETTING_NAME) { if (a._type != NetworkManager.SETTING_VPN_SETTING_NAME) {
@@ -2114,7 +2108,7 @@ const NMApplet = new Lang.Class({
} }
} }
this._mainConnection = activating || default_ip4 || default_ip6 || active_any || null; this._mainConnection = activating || default_ip4 || default_ip6 || this._activeConnections[0] || null;
this._vpnConnection = active_vpn; this._vpnConnection = active_vpn;
}, },

View File

@@ -91,6 +91,9 @@ const UnlockDialog = new Lang.Class({
this._promptLoginHint.hide(); this._promptLoginHint.hide();
this.contentLayout.add_actor(this._promptLoginHint); this.contentLayout.add_actor(this._promptLoginHint);
this._workSpinner = new Panel.AnimatedIcon('process-working.svg', LoginDialog.WORK_SPINNER_ICON_SIZE);
this._workSpinner.actor.opacity = 0;
this.allowCancel = false; this.allowCancel = false;
this.buttonLayout.visible = true; this.buttonLayout.visible = true;
this.addButton({ label: _("Cancel"), this.addButton({ label: _("Cancel"),
@@ -101,11 +104,12 @@ const UnlockDialog = new Lang.Class({
y_fill: false, y_fill: false,
x_align: St.Align.START, x_align: St.Align.START,
y_align: St.Align.MIDDLE }); y_align: St.Align.MIDDLE });
this.placeSpinner({ expand: false, this.buttonLayout.add(this._workSpinner.actor,
x_fill: false, { expand: false,
y_fill: false, x_fill: false,
x_align: St.Align.END, y_fill: false,
y_align: St.Align.MIDDLE }); x_align: St.Align.END,
y_align: St.Align.MIDDLE });
this._okButton = this.addButton({ label: _("Unlock"), this._okButton = this.addButton({ label: _("Unlock"),
action: Lang.bind(this, this._doUnlock), action: Lang.bind(this, this._doUnlock),
default: true }, default: true },
@@ -159,6 +163,28 @@ const UnlockDialog = new Lang.Class({
this._okButton.can_focus = sensitive; this._okButton.can_focus = sensitive;
}, },
_setWorking: function(working) {
if (working) {
this._workSpinner.play();
Tweener.addTween(this._workSpinner.actor,
{ opacity: 255,
delay: LoginDialog.WORK_SPINNER_ANIMATION_DELAY,
time: LoginDialog.WORK_SPINNER_ANIMATION_TIME,
transition: 'linear'
});
} else {
Tweener.addTween(this._workSpinner.actor,
{ opacity: 0,
time: LoginDialog.WORK_SPINNER_ANIMATION_TIME,
transition: 'linear',
onCompleteScope: this,
onComplete: function() {
this._workSpinner.stop();
}
});
}
},
_showMessage: function(userVerifier, message, styleClass) { _showMessage: function(userVerifier, message, styleClass) {
if (message) { if (message) {
this._promptMessage.text = message; this._promptMessage.text = message;
@@ -189,7 +215,7 @@ const UnlockDialog = new Lang.Class({
this._currentQuery = serviceName; this._currentQuery = serviceName;
this._updateSensitivity(true); this._updateSensitivity(true);
this.setWorking(false); this._setWorking(false);
}, },
_showLoginHint: function(verifier, message) { _showLoginHint: function(verifier, message) {
@@ -208,7 +234,7 @@ const UnlockDialog = new Lang.Class({
// the actual reply to GDM will be sent as soon as asked // the actual reply to GDM will be sent as soon as asked
this._firstQuestionAnswer = this._promptEntry.text; this._firstQuestionAnswer = this._promptEntry.text;
this._updateSensitivity(false); this._updateSensitivity(false);
this.setWorking(true); this._setWorking(true);
return; return;
} }
@@ -219,7 +245,7 @@ const UnlockDialog = new Lang.Class({
this._currentQuery = null; this._currentQuery = null;
this._updateSensitivity(false); this._updateSensitivity(false);
this.setWorking(true); this._setWorking(true);
this._userVerifier.answerQuery(query, this._promptEntry.text); this._userVerifier.answerQuery(query, this._promptEntry.text);
}, },
@@ -259,7 +285,7 @@ const UnlockDialog = new Lang.Class({
this._promptEntry.menu.isPassword = true; this._promptEntry.menu.isPassword = true;
this._updateSensitivity(false); this._updateSensitivity(false);
this.setWorking(false); this._setWorking(false);
}, },
_escape: function() { _escape: function() {

View File

@@ -172,9 +172,8 @@ const WindowManager = new Lang.Class({
this.addKeybinding('open-application-menu', this.addKeybinding('open-application-menu',
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }), new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
Meta.KeyBindingFlags.NONE, Meta.KeyBindingFlags.NONE,
Shell.KeyBindingMode.NORMAL | Shell.KeyBindingMode.NORMAL,
Shell.KeyBindingMode.TOPBAR_POPUP, Lang.bind(this, this._openAppMenu));
Lang.bind(this, this._toggleAppMenu));
Main.overview.connect('showing', Lang.bind(this, function() { Main.overview.connect('showing', Lang.bind(this, function() {
for (let i = 0; i < this._dimmedWindows.length; i++) for (let i = 0; i < this._dimmedWindows.length; i++)
@@ -680,8 +679,8 @@ const WindowManager = new Lang.Class({
Main.ctrlAltTabManager.popup(backwards, binding.get_name(), binding.get_mask()); Main.ctrlAltTabManager.popup(backwards, binding.get_name(), binding.get_mask());
}, },
_toggleAppMenu : function(display, screen, window, event, binding) { _openAppMenu : function(display, screen, window, event, binding) {
Main.panel.toggleAppMenu(); Main.panel.openAppMenu();
}, },
_showWorkspaceSwitcher : function(display, screen, window, binding) { _showWorkspaceSwitcher : function(display, screen, window, binding) {

View File

@@ -28,7 +28,6 @@ gu
he he
hi hi
hu hu
ia
id id
it it
ja ja

View File

@@ -55,7 +55,6 @@ js/ui/viewSelector.js
js/ui/wanda.js js/ui/wanda.js
js/ui/windowAttentionHandler.js js/ui/windowAttentionHandler.js
src/calendar-server/evolution-calendar.desktop.in.in src/calendar-server/evolution-calendar.desktop.in.in
# Please do not remove this file from POTFILES.in. Run "git submodule init && git submodule update" to get it.
src/gvc/gvc-mixer-control.c src/gvc/gvc-mixer-control.c
src/main.c src/main.c
src/shell-app.c src/shell-app.c

1938
po/ia.po

File diff suppressed because it is too large Load Diff

View File

@@ -461,7 +461,7 @@ msgstr "Nepavyko įvykdyti „%s“:"
#: ../js/ui/appDisplay.js:349 #: ../js/ui/appDisplay.js:349
msgid "Frequent" msgid "Frequent"
msgstr "Dažnai naudojamos" msgstr "Dažniausios"
#: ../js/ui/appDisplay.js:356 #: ../js/ui/appDisplay.js:356
msgid "All" msgid "All"
@@ -1262,7 +1262,7 @@ msgstr "Apžvalga"
#. characters. #. characters.
#: ../js/ui/overview.js:271 #: ../js/ui/overview.js:271
msgid "Type to search…" msgid "Type to search…"
msgstr "Rašykite, ko ieškote…" msgstr "Rašykite ko ieškote…"
#: ../js/ui/panel.js:612 #: ../js/ui/panel.js:612
msgid "Quit" msgid "Quit"
@@ -1299,7 +1299,7 @@ msgstr "Užverti"
#. long format #. long format
#: ../js/ui/screenShield.js:86 #: ../js/ui/screenShield.js:86
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %B %d d." msgstr "%A, %B %d"
#: ../js/ui/screenShield.js:151 #: ../js/ui/screenShield.js:151
#, c-format #, c-format

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell 3.8.x\n" "Project-Id-Version: gnome-shell 3.8.x\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-05-13 09:47+0200\n" "POT-Creation-Date: 2013-04-03 13:31+0200\n"
"PO-Revision-Date: 2013-04-03 13:31+0200\n" "PO-Revision-Date: 2013-04-03 13:31+0200\n"
"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n" "Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
"Language-Team: Norwegian bokmål <i18n-nb@lister.ping.uio.no>\n" "Language-Team: Norwegian bokmål <i18n-nb@lister.ping.uio.no>\n"
@@ -335,50 +335,43 @@ msgstr "Utvidelse"
msgid "Select an extension to configure using the combobox above." msgid "Select an extension to configure using the combobox above."
msgstr "Velg en utvidelse som skal konfigureres med komboboksen over." msgstr "Velg en utvidelse som skal konfigureres med komboboksen over."
#: ../js/gdm/loginDialog.js:371 #: ../js/gdm/loginDialog.js:405
msgid "Session…" msgid "Session…"
msgstr "Økt …" msgstr "Økt …"
#. translators: this message is shown below the user list on the #. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for #. login screen. It can be activated to reveal an entry for
#. manually entering the username. #. manually entering the username.
#: ../js/gdm/loginDialog.js:601 #: ../js/gdm/loginDialog.js:630
msgid "Not listed?" msgid "Not listed?"
msgstr "Ikke listet?" msgstr "Ikke listet?"
#: ../js/gdm/loginDialog.js:776 ../js/ui/components/networkAgent.js:137 #: ../js/gdm/loginDialog.js:786 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:376 #: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:375
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 #: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:96 #: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:99
#: ../js/ui/userMenu.js:938 #: ../js/ui/userMenu.js:938
msgid "Cancel" msgid "Cancel"
msgstr "Avbryt" msgstr "Avbryt"
#: ../js/gdm/loginDialog.js:791 #: ../js/gdm/loginDialog.js:802
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Logg inn" msgstr "Logg inn"
#: ../js/gdm/loginDialog.js:791 #: ../js/gdm/loginDialog.js:802
msgid "Next" msgid "Next"
msgstr "Neste" msgstr "Neste"
#. Translators: this message is shown below the username entry field
#. to clue the user in on how to login to the local network realm
#: ../js/gdm/loginDialog.js:888
#, c-format
msgid "(e.g., user or %s)"
msgstr "(f.eks. bruker eller %s)"
#. TTLS and PEAP are actually much more complicated, but this complication #. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication #. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one) #. (and don't even care of which one)
#: ../js/gdm/loginDialog.js:892 ../js/ui/components/networkAgent.js:260 #: ../js/gdm/loginDialog.js:917 ../js/ui/components/networkAgent.js:260
#: ../js/ui/components/networkAgent.js:278 #: ../js/ui/components/networkAgent.js:278
msgid "Username: " msgid "Username: "
msgstr "Brukernavn: " msgstr "Brukernavn: "
#: ../js/gdm/loginDialog.js:1158 #: ../js/gdm/loginDialog.js:1173
msgid "Login Window" msgid "Login Window"
msgstr "Innloggingsvindu" msgstr "Innloggingsvindu"
@@ -401,16 +394,21 @@ msgstr "Start på nytt"
msgid "Power Off" msgid "Power Off"
msgstr "Slå av" msgstr "Slå av"
#: ../js/gdm/util.js:247 #: ../js/gdm/util.js:249
msgid "Authentication error" msgid "Authentication error"
msgstr "Autentiseringsfeil" msgstr "Autentiseringsfeil"
#. Translators: this message is shown below the password entry field #. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead #. to indicate the user can swipe their finger instead
#: ../js/gdm/util.js:364 #: ../js/gdm/util.js:366
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(eller dra finger)" msgstr "(eller dra finger)"
#: ../js/gdm/util.js:391
#, c-format
msgid "(e.g., user or %s)"
msgstr "(f.eks. bruker eller %s)"
#: ../js/misc/util.js:97 #: ../js/misc/util.js:97
msgid "Command not found" msgid "Command not found"
msgstr "Kommando ikke funnet" msgstr "Kommando ikke funnet"
@@ -634,11 +632,11 @@ msgstr "Åpne med %s"
msgid "Eject" msgid "Eject"
msgstr "Løs ut" msgstr "Løs ut"
#: ../js/ui/components/keyring.js:88 ../js/ui/components/polkitAgent.js:275 #: ../js/ui/components/keyring.js:82 ../js/ui/components/polkitAgent.js:268
msgid "Password:" msgid "Password:"
msgstr "Passord:" msgstr "Passord:"
#: ../js/ui/components/keyring.js:107 #: ../js/ui/components/keyring.js:101
msgid "Type again:" msgid "Type again:"
msgstr "Skriv på nytt:" msgstr "Skriv på nytt:"
@@ -726,7 +724,7 @@ msgstr "Autentisering kreves"
msgid "Administrator" msgid "Administrator"
msgstr "Administrator" msgstr "Administrator"
#: ../js/ui/components/polkitAgent.js:171 #: ../js/ui/components/polkitAgent.js:165
msgid "Authenticate" msgid "Authenticate"
msgstr "Autentiser" msgstr "Autentiser"
@@ -734,12 +732,12 @@ msgstr "Autentiser"
#. * requested authentication was not gained; this can happen #. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password), #. * because of an authentication error (like invalid password),
#. * for instance. #. * for instance.
#: ../js/ui/components/polkitAgent.js:263 ../js/ui/shellMountOperation.js:383 #: ../js/ui/components/polkitAgent.js:256 ../js/ui/shellMountOperation.js:383
msgid "Sorry, that didn't work. Please try again." msgid "Sorry, that didn't work. Please try again."
msgstr "Beklager, det virket ikke. Vennligst prøv igjen." msgstr "Beklager, det virket ikke. Vennligst prøv igjen."
#. Translators: this is a filename used for screencast recording #. Translators: this is a filename used for screencast recording
#: ../js/ui/components/recorder.js:47 #: ../js/ui/components/recorder.js:48
#, no-c-format #, no-c-format
msgid "Screencast from %d %t" msgid "Screencast from %d %t"
msgstr "Skjermvideo fra %d %t" msgstr "Skjermvideo fra %d %t"
@@ -1005,14 +1003,14 @@ msgstr "Åpne kalender"
msgid "Open Clocks" msgid "Open Clocks"
msgstr "Åpne Klokker" msgstr "Åpne Klokker"
#: ../js/ui/dateMenu.js:104 #: ../js/ui/dateMenu.js:105
msgid "Date & Time Settings" msgid "Date & Time Settings"
msgstr "Innstillinger for dato og klokkeslett" msgstr "Innstillinger for dato og klokkeslett"
#. Translators: This is the date format to use when the calendar popup is #. 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"). #. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#. #.
#: ../js/ui/dateMenu.js:216 #: ../js/ui/dateMenu.js:215
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%a %e %B, %Y" msgstr "%a %e %B, %Y"
@@ -1190,11 +1188,11 @@ msgstr "Innstillinger for varsling"
msgid "No Messages" msgid "No Messages"
msgstr "Ingen meldinger" msgstr "Ingen meldinger"
#: ../js/ui/messageTray.js:1785 #: ../js/ui/messageTray.js:1782
msgid "Message Tray" msgid "Message Tray"
msgstr "Meldingstrau" msgstr "Meldingstrau"
#: ../js/ui/messageTray.js:2813 #: ../js/ui/messageTray.js:2810
msgid "System Information" msgid "System Information"
msgstr "Systeminformasjon" msgstr "Systeminformasjon"
@@ -1226,17 +1224,17 @@ msgstr "Oversikt"
msgid "Type to search…" msgid "Type to search…"
msgstr "Skriv for å søke …" msgstr "Skriv for å søke …"
#: ../js/ui/panel.js:635 #: ../js/ui/panel.js:612
msgid "Quit" msgid "Quit"
msgstr "Avslutt" msgstr "Avslutt"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:686 #: ../js/ui/panel.js:636
msgid "Activities" msgid "Activities"
msgstr "Aktiviteter" msgstr "Aktiviteter"
#: ../js/ui/panel.js:982 #: ../js/ui/panel.js:933
msgid "Top Bar" msgid "Top Bar"
msgstr "Topp-panel" msgstr "Topp-panel"
@@ -1249,11 +1247,11 @@ msgstr "Topp-panel"
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-intl" msgstr "toggle-switch-intl"
#: ../js/ui/runDialog.js:74 #: ../js/ui/runDialog.js:73
msgid "Enter a Command" msgid "Enter a Command"
msgstr "Oppgi en kommando" msgstr "Oppgi en kommando"
#: ../js/ui/runDialog.js:110 #: ../js/ui/runDialog.js:109
msgid "Close" msgid "Close"
msgstr "Lukk" msgstr "Lukk"
@@ -1274,7 +1272,7 @@ msgstr[1] "%d nye varslinger"
msgid "Lock" msgid "Lock"
msgstr "Lås" msgstr "Lås"
#: ../js/ui/screenShield.js:641 #: ../js/ui/screenShield.js:640
msgid "GNOME needs to lock the screen" msgid "GNOME needs to lock the screen"
msgstr "GNOME må låse skjermen" msgstr "GNOME må låse skjermen"
@@ -1285,11 +1283,11 @@ msgstr "GNOME må låse skjermen"
#. #.
#. XXX: another option is to kick the user into the gdm login #. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs #. screen, where we're not affected by grabs
#: ../js/ui/screenShield.js:762 ../js/ui/screenShield.js:1198 #: ../js/ui/screenShield.js:761 ../js/ui/screenShield.js:1197
msgid "Unable to lock" msgid "Unable to lock"
msgstr "Kan ikke låse" msgstr "Kan ikke låse"
#: ../js/ui/screenShield.js:763 ../js/ui/screenShield.js:1199 #: ../js/ui/screenShield.js:762 ../js/ui/screenShield.js:1198
msgid "Lock was blocked by an application" msgid "Lock was blocked by an application"
msgstr "Låsing ble stoppet av et program" msgstr "Låsing ble stoppet av et program"
@@ -1309,11 +1307,11 @@ msgstr "Kopier"
msgid "Paste" msgid "Paste"
msgstr "Lim inn" msgstr "Lim inn"
#: ../js/ui/shellEntry.js:101 #: ../js/ui/shellEntry.js:106
msgid "Show Text" msgid "Show Text"
msgstr "Vis tekst" msgstr "Vis tekst"
#: ../js/ui/shellEntry.js:103 #: ../js/ui/shellEntry.js:108
msgid "Hide Text" msgid "Hide Text"
msgstr "Skjul tekst" msgstr "Skjul tekst"
@@ -1325,7 +1323,7 @@ msgstr "Passord"
msgid "Remember Password" msgid "Remember Password"
msgstr "Husk passord" msgstr "Husk passord"
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:109 #: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:113
msgid "Unlock" msgid "Unlock"
msgstr "Lås opp" msgstr "Lås opp"
@@ -1616,7 +1614,7 @@ msgstr "Tilkobling feilet"
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "Aktivering av nettverkstilkobling feilet" msgstr "Aktivering av nettverkstilkobling feilet"
#: ../js/ui/status/network.js:2282 #: ../js/ui/status/network.js:2276
msgid "Networking is disabled" msgid "Networking is disabled"
msgstr "Nettverk er slått av" msgstr "Nettverk er slått av"
@@ -1730,11 +1728,11 @@ msgstr "Volum"
msgid "Microphone" msgid "Microphone"
msgstr "Mikrofon" msgstr "Mikrofon"
#: ../js/ui/unlockDialog.js:120 #: ../js/ui/unlockDialog.js:124
msgid "Log in as another user" msgid "Log in as another user"
msgstr "Logg inn som en annen bruker" msgstr "Logg inn som en annen bruker"
#: ../js/ui/unlockDialog.js:141 #: ../js/ui/unlockDialog.js:145
msgid "Unlock Window" msgid "Unlock Window"
msgstr "Lås opp vindu" msgstr "Lås opp vindu"
@@ -1887,11 +1885,11 @@ msgstr "Vis mulige modi"
msgid "Failed to launch '%s'" msgid "Failed to launch '%s'"
msgstr "Klarte ikke å starte «%s»" msgstr "Klarte ikke å starte «%s»"
#: ../src/shell-keyring-prompt.c:714 #: ../src/shell-keyring-prompt.c:708
msgid "Passwords do not match." msgid "Passwords do not match."
msgstr "Passordene er ikke like." msgstr "Passordene er ikke like."
#: ../src/shell-keyring-prompt.c:722 #: ../src/shell-keyring-prompt.c:716
msgid "Password cannot be blank" msgid "Password cannot be blank"
msgstr "Passordet kan ikke være tomt" msgstr "Passordet kan ikke være tomt"

163
po/sr.po
View File

@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n" "shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2013-03-31 01:48+0000\n" "POT-Creation-Date: 2013-03-04 08:38+0000\n"
"PO-Revision-Date: 2013-03-08 20:26+0200\n" "PO-Revision-Date: 2013-03-08 20:26+0200\n"
"Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n" "Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n"
"Language-Team: Serbian <gnom@prevod.org>\n" "Language-Team: Serbian <gnom@prevod.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : n" "Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : "
"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Project-Style: gnome\n" "X-Project-Style: gnome\n"
#: ../data/50-gnome-shell-screenshot.xml.in.h:1 #: ../data/50-gnome-shell-screenshot.xml.in.h:1
@@ -365,52 +365,53 @@ msgid "Select an extension to configure using the combobox above."
msgstr "Изаберите проширење за подешавање користећи прозорче за избор." msgstr "Изаберите проширење за подешавање користећи прозорче за избор."
#: ../js/gdm/loginDialog.js:405 #: ../js/gdm/loginDialog.js:405
#| msgid "Session..."
msgid "Session…" msgid "Session…"
msgstr "Сесија…" msgstr "Сесија…"
#. translators: this message is shown below the user list on the #. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for #. login screen. It can be activated to reveal an entry for
#. manually entering the username. #. manually entering the username.
#: ../js/gdm/loginDialog.js:630 #: ../js/gdm/loginDialog.js:629
msgid "Not listed?" msgid "Not listed?"
msgstr "Није на списку?" msgstr "Није на списку?"
#: ../js/gdm/loginDialog.js:786 ../js/ui/components/networkAgent.js:137 #: ../js/gdm/loginDialog.js:783 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:375 #: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:375
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 #: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:99 #: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:126
#: ../js/ui/userMenu.js:938 #: ../js/ui/userMenu.js:934
msgid "Cancel" msgid "Cancel"
msgstr "Откажи" msgstr "Откажи"
#: ../js/gdm/loginDialog.js:802 #: ../js/gdm/loginDialog.js:799
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Пријави ме" msgstr "Пријави ме"
#: ../js/gdm/loginDialog.js:802 #: ../js/gdm/loginDialog.js:799
msgid "Next" msgid "Next"
msgstr "Даље" msgstr "Даље"
#. TTLS and PEAP are actually much more complicated, but this complication #. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication #. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one) #. (and don't even care of which one)
#: ../js/gdm/loginDialog.js:917 ../js/ui/components/networkAgent.js:260 #: ../js/gdm/loginDialog.js:904 ../js/ui/components/networkAgent.js:260
#: ../js/ui/components/networkAgent.js:278 #: ../js/ui/components/networkAgent.js:278
msgid "Username: " msgid "Username: "
msgstr "Корисничко име: " msgstr "Корисничко име: "
#: ../js/gdm/loginDialog.js:1173 #: ../js/gdm/loginDialog.js:1157
msgid "Login Window" msgid "Login Window"
msgstr "Прозор за пријављивање" msgstr "Прозор за пријављивање"
#. Translators: accessible name of the power menu in the login screen #. Translators: accessible name of the power menu in the login screen
#: ../js/gdm/powerMenu.js:36 #: ../js/gdm/powerMenu.js:36
msgid "Power" msgid "Power"
msgstr "Напајање" msgstr "Угаси"
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:696 ../js/ui/userMenu.js:700 #: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:695 ../js/ui/userMenu.js:699
#: ../js/ui/userMenu.js:816 #: ../js/ui/userMenu.js:815
msgid "Suspend" msgid "Suspend"
msgstr "Обустави" msgstr "Обустави"
@@ -418,58 +419,58 @@ msgstr "Обустави"
msgid "Restart" msgid "Restart"
msgstr "Поново покрени" msgstr "Поново покрени"
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:698 #: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:697
#: ../js/ui/userMenu.js:700 ../js/ui/userMenu.js:815 ../js/ui/userMenu.js:942 #: ../js/ui/userMenu.js:699 ../js/ui/userMenu.js:814 ../js/ui/userMenu.js:938
msgid "Power Off" msgid "Power Off"
msgstr "Искључи" msgstr "Угаси"
#: ../js/gdm/util.js:249 #: ../js/gdm/util.js:182
msgid "Authentication error" msgid "Authentication error"
msgstr "Грешка потврђивања идентитета" msgstr "Грешка потврђивања идентитета"
#. Translators: this message is shown below the password entry field #. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead #. to indicate the user can swipe their finger instead
#: ../js/gdm/util.js:366 #: ../js/gdm/util.js:299
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(или лупите прст)" msgstr "(или лупите прст)"
#: ../js/gdm/util.js:391 #: ../js/gdm/util.js:324
#, c-format #, c-format
msgid "(e.g., user or %s)" msgid "(e.g., user or %s)"
msgstr "(нпр., корисник или %s)" msgstr "(нпр., корисник или %s)"
#: ../js/misc/util.js:97 #: ../js/misc/util.js:94
msgid "Command not found" msgid "Command not found"
msgstr "Наредба није нађена" msgstr "Наредба није нађена"
#. Replace "Error invoking GLib.shell_parse_argv: " with #. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer #. something nicer
#: ../js/misc/util.js:130 #: ../js/misc/util.js:127
msgid "Could not parse command:" msgid "Could not parse command:"
msgstr "Не могу да обрадим наредбу:" msgstr "Не могу да обрадим наредбу:"
#: ../js/misc/util.js:138 #: ../js/misc/util.js:135
#, c-format #, c-format
msgid "Execution of '%s' failed:" msgid "Execution of '%s' failed:"
msgstr "Није успело покретање „%s“:" msgstr "Није успело покретање „%s“:"
#: ../js/ui/appDisplay.js:349 #: ../js/ui/appDisplay.js:348
msgid "Frequent" msgid "Frequent"
msgstr "Често" msgstr "Често"
#: ../js/ui/appDisplay.js:356 #: ../js/ui/appDisplay.js:355
msgid "All" msgid "All"
msgstr "Све" msgstr "Све"
#: ../js/ui/appDisplay.js:914 #: ../js/ui/appDisplay.js:913
msgid "New Window" msgid "New Window"
msgstr "Нови прозор" msgstr "Нови прозор"
#: ../js/ui/appDisplay.js:917 ../js/ui/dash.js:284 #: ../js/ui/appDisplay.js:916 ../js/ui/dash.js:284
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Уклони из омиљених" msgstr "Уклони из омиљених"
#: ../js/ui/appDisplay.js:918 #: ../js/ui/appDisplay.js:917
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Додај у омиљене" msgstr "Додај у омиљене"
@@ -483,7 +484,7 @@ msgstr "„%s“ је додат међу омиљене."
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "„%s“ је уклоњен из омиљених." msgstr "„%s“ је уклоњен из омиљених."
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:789 #: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:788
msgid "Settings" msgid "Settings"
msgstr "Подешавања" msgstr "Подешавања"
@@ -506,7 +507,7 @@ msgctxt "event list time"
msgid "%H\\u2236%M" msgid "%H\\u2236%M"
msgstr "%H\\u2236%M" msgstr "%H\\u2236%M"
#. Translators: Shown in calendar event list, if 12h format, #. Transators: Shown in calendar event list, if 12h format,
#. \u2236 is a ratio character, similar to : and \u2009 is #. \u2236 is a ratio character, similar to : and \u2009 is
#. a thin space #. a thin space
#: ../js/ui/calendar.js:77 #: ../js/ui/calendar.js:77
@@ -608,35 +609,35 @@ msgid "S"
msgstr "Суб" msgstr "Суб"
#. Translators: Text to show if there are no events #. Translators: Text to show if there are no events
#: ../js/ui/calendar.js:720 #: ../js/ui/calendar.js:692
msgid "Nothing Scheduled" msgid "Nothing Scheduled"
msgstr "Ништа планирано" msgstr "Ништа планирано"
#. Translators: Shown on calendar heading when selected day occurs on current year #. Translators: Shown on calendar heading when selected day occurs on current year
#: ../js/ui/calendar.js:736 #: ../js/ui/calendar.js:708
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %B %d" msgstr "%A, %B %d"
#. Translators: Shown on calendar heading when selected day occurs on different year #. Translators: Shown on calendar heading when selected day occurs on different year
#: ../js/ui/calendar.js:739 #: ../js/ui/calendar.js:711
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d, %Y" msgid "%A, %B %d, %Y"
msgstr "%A, %B %d, %Y" msgstr "%A, %B %d, %Y"
#: ../js/ui/calendar.js:749 #: ../js/ui/calendar.js:721
msgid "Today" msgid "Today"
msgstr "Данас" msgstr "Данас"
#: ../js/ui/calendar.js:753 #: ../js/ui/calendar.js:725
msgid "Tomorrow" msgid "Tomorrow"
msgstr "Сутра" msgstr "Сутра"
#: ../js/ui/calendar.js:764 #: ../js/ui/calendar.js:736
msgid "This week" msgid "This week"
msgstr "Ове недеље" msgstr "Ове недеље"
#: ../js/ui/calendar.js:772 #: ../js/ui/calendar.js:744
msgid "Next week" msgid "Next week"
msgstr "Следеће недеље" msgstr "Следеће недеље"
@@ -652,12 +653,12 @@ msgstr "Спољни уређај је искључен"
msgid "Removable Devices" msgid "Removable Devices"
msgstr "Уклоњиви уређаји" msgstr "Уклоњиви уређаји"
#: ../js/ui/components/autorunManager.js:594 #: ../js/ui/components/autorunManager.js:593
#, c-format #, c-format
msgid "Open with %s" msgid "Open with %s"
msgstr "Отвори програмом %s" msgstr "Отвори програмом %s"
#: ../js/ui/components/autorunManager.js:620 #: ../js/ui/components/autorunManager.js:619
msgid "Eject" msgid "Eject"
msgstr "Избаци" msgstr "Избаци"
@@ -1037,7 +1038,7 @@ msgstr "Подешавања датума и времена"
#. Translators: This is the date format to use when the calendar popup is #. 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"). #. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#. #.
#: ../js/ui/dateMenu.js:215 #: ../js/ui/dateMenu.js:205
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%A, %e. %b., %R" msgstr "%A, %e. %b., %R"
@@ -1212,6 +1213,7 @@ msgid "Remove"
msgstr "Уклони" msgstr "Уклони"
#: ../js/ui/messageTray.js:1501 #: ../js/ui/messageTray.js:1501
#| msgid "No Messages"
msgid "Clear Messages" msgid "Clear Messages"
msgstr "Очисти поруке" msgstr "Очисти поруке"
@@ -1219,15 +1221,15 @@ msgstr "Очисти поруке"
msgid "Notification Settings" msgid "Notification Settings"
msgstr "Поставке обавештења" msgstr "Поставке обавештења"
#: ../js/ui/messageTray.js:1709 #: ../js/ui/messageTray.js:1707
msgid "No Messages" msgid "No Messages"
msgstr "Нема порука" msgstr "Нема порука"
#: ../js/ui/messageTray.js:1782 #: ../js/ui/messageTray.js:1787
msgid "Message Tray" msgid "Message Tray"
msgstr "Фиока порука" msgstr "Фиока порука"
#: ../js/ui/messageTray.js:2810 #: ../js/ui/messageTray.js:2864
msgid "System Information" msgid "System Information"
msgstr "Подаци о систему" msgstr "Подаци о систему"
@@ -1236,7 +1238,7 @@ msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "Непознат" msgstr "Непознат"
#: ../js/ui/overviewControls.js:463 ../js/ui/screenShield.js:149 #: ../js/ui/overviewControls.js:460 ../js/ui/screenShield.js:153
#, c-format #, c-format
msgid "%d new message" msgid "%d new message"
msgid_plural "%d new messages" msgid_plural "%d new messages"
@@ -1245,7 +1247,7 @@ msgstr[1] "%d нове поруке"
msgstr[2] "%d нових порука" msgstr[2] "%d нових порука"
msgstr[3] "Једна нова порука" msgstr[3] "Једна нова порука"
#: ../js/ui/overview.js:84 #: ../js/ui/overview.js:82
msgid "Undo" msgid "Undo"
msgstr "Опозови" msgstr "Опозови"
@@ -1257,21 +1259,22 @@ msgstr "Преглед"
#. in the search entry when no search is #. in the search entry when no search is
#. active; it should not exceed ~30 #. active; it should not exceed ~30
#. characters. #. characters.
#: ../js/ui/overview.js:271 #: ../js/ui/overview.js:284
#| msgid "Type to search..."
msgid "Type to search…" msgid "Type to search…"
msgstr "Упишите текст за претрагу…" msgstr "Упишите текст за претрагу…"
#: ../js/ui/panel.js:612 #: ../js/ui/panel.js:613
msgid "Quit" msgid "Quit"
msgstr "Изађи" msgstr "Изађи"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:636 #: ../js/ui/panel.js:642
msgid "Activities" msgid "Activities"
msgstr "Активности" msgstr "Активности"
#: ../js/ui/panel.js:933 #: ../js/ui/panel.js:983
msgid "Top Bar" msgid "Top Bar"
msgstr "Горња трака" msgstr "Горња трака"
@@ -1284,21 +1287,21 @@ msgstr "Горња трака"
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-intl" msgstr "toggle-switch-intl"
#: ../js/ui/runDialog.js:73 #: ../js/ui/runDialog.js:205
msgid "Enter a Command" msgid "Enter a Command"
msgstr "Унесите наредбу" msgstr "Унесите наредбу"
#: ../js/ui/runDialog.js:109 #: ../js/ui/runDialog.js:241
msgid "Close" msgid "Close"
msgstr "Затвори" msgstr "Затвори"
#. Translators: This is a time format for a date in #. Translators: This is a time format for a date in
#. long format #. long format
#: ../js/ui/screenShield.js:86 #: ../js/ui/screenShield.js:90
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %d. %B" msgstr "%A, %d. %B"
#: ../js/ui/screenShield.js:151 #: ../js/ui/screenShield.js:155
#, c-format #, c-format
msgid "%d new notification" msgid "%d new notification"
msgid_plural "%d new notifications" msgid_plural "%d new notifications"
@@ -1307,11 +1310,11 @@ msgstr[1] "%d нова обавештења"
msgstr[2] "%d нових обавештења" msgstr[2] "%d нових обавештења"
msgstr[3] "Једно ново обавештење" msgstr[3] "Једно ново обавештење"
#: ../js/ui/screenShield.js:438 ../js/ui/userMenu.js:807 #: ../js/ui/screenShield.js:442 ../js/ui/userMenu.js:806
msgid "Lock" msgid "Lock"
msgstr "Закључај" msgstr "Закључај"
#: ../js/ui/screenShield.js:640 #: ../js/ui/screenShield.js:639
msgid "GNOME needs to lock the screen" msgid "GNOME needs to lock the screen"
msgstr "Гном мора да закључа екран" msgstr "Гном мора да закључа екран"
@@ -1322,19 +1325,21 @@ msgstr "Гном мора да закључа екран"
#. #.
#. XXX: another option is to kick the user into the gdm login #. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs #. screen, where we're not affected by grabs
#: ../js/ui/screenShield.js:761 ../js/ui/screenShield.js:1197 #: ../js/ui/screenShield.js:758 ../js/ui/screenShield.js:1169
#| msgid "Unable to connect to %s"
msgid "Unable to lock" msgid "Unable to lock"
msgstr "Не могу да закључам" msgstr "Не могу да закључам"
#: ../js/ui/screenShield.js:762 ../js/ui/screenShield.js:1198 #: ../js/ui/screenShield.js:759 ../js/ui/screenShield.js:1170
msgid "Lock was blocked by an application" msgid "Lock was blocked by an application"
msgstr "Неки програм је блокирао закључавање" msgstr "Неки програм је блокирао закључавање"
#: ../js/ui/searchDisplay.js:453 #: ../js/ui/searchDisplay.js:431
#| msgid "Searching..."
msgid "Searching…" msgid "Searching…"
msgstr "Тражим…" msgstr "Тражим…"
#: ../js/ui/searchDisplay.js:497 #: ../js/ui/searchDisplay.js:475
msgid "No results." msgid "No results."
msgstr "Нема одговарајућих резултата." msgstr "Нема одговарајућих резултата."
@@ -1346,11 +1351,11 @@ msgstr "Умножи"
msgid "Paste" msgid "Paste"
msgstr "Убаци" msgstr "Убаци"
#: ../js/ui/shellEntry.js:106 #: ../js/ui/shellEntry.js:105
msgid "Show Text" msgid "Show Text"
msgstr "Прикажи текст" msgstr "Прикажи текст"
#: ../js/ui/shellEntry.js:108 #: ../js/ui/shellEntry.js:107
msgid "Hide Text" msgid "Hide Text"
msgstr "Сакриј текст" msgstr "Сакриј текст"
@@ -1362,7 +1367,7 @@ msgstr "Лозинка"
msgid "Remember Password" msgid "Remember Password"
msgstr "Запамти лозинку" msgstr "Запамти лозинку"
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:113 #: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:140
msgid "Unlock" msgid "Unlock"
msgstr "Откључај" msgstr "Откључај"
@@ -1426,10 +1431,12 @@ msgid "Visibility"
msgstr "Видљивост" msgstr "Видљивост"
#: ../js/ui/status/bluetooth.js:59 #: ../js/ui/status/bluetooth.js:59
#| msgid "Send Files to Device..."
msgid "Send Files to Device…" msgid "Send Files to Device…"
msgstr "Пошаљи датотеке на уређај…" msgstr "Пошаљи датотеке на уређај…"
#: ../js/ui/status/bluetooth.js:60 #: ../js/ui/status/bluetooth.js:60
#| msgid "Set Up a New Device..."
msgid "Set Up a New Device…" msgid "Set Up a New Device…"
msgstr "Подеси нови уређај…" msgstr "Подеси нови уређај…"
@@ -1456,6 +1463,7 @@ msgid "connecting..."
msgstr "повезујем се..." msgstr "повезујем се..."
#: ../js/ui/status/bluetooth.js:239 #: ../js/ui/status/bluetooth.js:239
#| msgid "Send Files..."
msgid "Send Files…" msgid "Send Files…"
msgstr "Пошаљи датотеке…" msgstr "Пошаљи датотеке…"
@@ -1668,6 +1676,7 @@ msgstr "Подешавања напајања"
#. 0 is reported when UPower does not have enough data #. 0 is reported when UPower does not have enough data
#. to estimate battery life #. to estimate battery life
#: ../js/ui/status/power.js:99 #: ../js/ui/status/power.js:99
#| msgid "Estimating..."
msgid "Estimating…" msgid "Estimating…"
msgstr "Приближно…" msgstr "Приближно…"
@@ -1775,11 +1784,11 @@ msgstr "Јачина звука"
msgid "Microphone" msgid "Microphone"
msgstr "Микрофон" msgstr "Микрофон"
#: ../js/ui/unlockDialog.js:124 #: ../js/ui/unlockDialog.js:151
msgid "Log in as another user" msgid "Log in as another user"
msgstr "Пријавите се као други корсник" msgstr "Пријавите се као други корсник"
#: ../js/ui/unlockDialog.js:145 #: ../js/ui/unlockDialog.js:177
msgid "Unlock Window" msgid "Unlock Window"
msgstr "Откључај прозор" msgstr "Откључај прозор"
@@ -1807,27 +1816,27 @@ msgstr "Мирује"
msgid "Offline" msgid "Offline"
msgstr "Ван мреже" msgstr "Ван мреже"
#: ../js/ui/userMenu.js:781 #: ../js/ui/userMenu.js:780
msgid "Notifications" msgid "Notifications"
msgstr "Обавештења" msgstr "Обавештења"
#: ../js/ui/userMenu.js:797 #: ../js/ui/userMenu.js:796
msgid "Switch User" msgid "Switch User"
msgstr "Промени корисника" msgstr "Промени корисника"
#: ../js/ui/userMenu.js:802 #: ../js/ui/userMenu.js:801
msgid "Log Out" msgid "Log Out"
msgstr "Одјави ме" msgstr "Одјави ме"
#: ../js/ui/userMenu.js:822 #: ../js/ui/userMenu.js:821
msgid "Install Updates & Restart" msgid "Install Updates & Restart"
msgstr "Инсталирај ажурирања и поново покрени" msgstr "Инсталирај ажурирања и поново покрени"
#: ../js/ui/userMenu.js:840 #: ../js/ui/userMenu.js:839
msgid "Your chat status will be set to busy" msgid "Your chat status will be set to busy"
msgstr "Ваше стање ћаскања ће бити постављено на заузето" msgstr "Ваше стање ћаскања ће бити постављено на заузето"
#: ../js/ui/userMenu.js:841 #: ../js/ui/userMenu.js:840
msgid "" msgid ""
"Notifications are now disabled, including chat messages. Your online status " "Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages." "has been adjusted to let others know that you might not see their messages."
@@ -1836,22 +1845,20 @@ msgstr ""
"мрежи је подешено тако да ће остали знати да ви не можете видети њихове " "мрежи је подешено тако да ће остали знати да ви не можете видети њихове "
"поруке." "поруке."
#: ../js/ui/userMenu.js:888 #: ../js/ui/userMenu.js:886
msgid "Other users are logged in." msgid "Other users are logged in."
msgstr "Други корисници су пријављени." msgstr "Други корисници су пријављени."
#: ../js/ui/userMenu.js:893 #: ../js/ui/userMenu.js:891
msgid "Shutting down might cause them to lose unsaved work." msgid "Shutting down might cause them to lose unsaved work."
msgstr "Искључивање може да доведе до тога да изгубе несачувани рад." msgstr "Искључивање може да доведе до тога да изгубе несачувани рад."
#. Translators: Remote here refers to a remote session, like a ssh login #: ../js/ui/userMenu.js:918
#: ../js/ui/userMenu.js:921
#, c-format #, c-format
msgid "%s (remote)" msgid "%s (remote)"
msgstr "%s (удаљено)" msgstr "%s (удаљено)"
#. Translators: Console here refers to a tty like a VT console #: ../js/ui/userMenu.js:920
#: ../js/ui/userMenu.js:924
#, c-format #, c-format
msgid "%s (console)" msgid "%s (console)"
msgstr "%s (љуска)" msgstr "%s (љуска)"
@@ -1864,7 +1871,7 @@ msgstr "Програми"
msgid "Search" msgid "Search"
msgstr "Тражи" msgstr "Тражи"
#: ../js/ui/wanda.js:77 #: ../js/ui/wanda.js:92
#, c-format #, c-format
msgid "" msgid ""
"Sorry, no wisdom for you today:\n" "Sorry, no wisdom for you today:\n"
@@ -1873,7 +1880,7 @@ msgstr ""
"Извините, данас за вас нема мудрости:\n" "Извините, данас за вас нема мудрости:\n"
"%s" "%s"
#: ../js/ui/wanda.js:81 #: ../js/ui/wanda.js:96
#, c-format #, c-format
msgid "%s the Oracle says" msgid "%s the Oracle says"
msgstr "Пророк је рекао %s" msgstr "Пророк је рекао %s"

View File

@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n" "shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2013-03-31 01:48+0000\n" "POT-Creation-Date: 2013-03-04 08:38+0000\n"
"PO-Revision-Date: 2013-03-08 20:26+0200\n" "PO-Revision-Date: 2013-03-08 20:26+0200\n"
"Last-Translator: Miroslav Nikolić <miroslavnikolic@rocketmail.com>\n" "Last-Translator: Miroslav Nikolić <miroslavnikolic@rocketmail.com>\n"
"Language-Team: Serbian <gnom@prevod.org>\n" "Language-Team: Serbian <gnom@prevod.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : n" "Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : "
"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Project-Style: gnome\n" "X-Project-Style: gnome\n"
#: ../data/50-gnome-shell-screenshot.xml.in.h:1 #: ../data/50-gnome-shell-screenshot.xml.in.h:1
@@ -365,52 +365,53 @@ msgid "Select an extension to configure using the combobox above."
msgstr "Izaberite proširenje za podešavanje koristeći prozorče za izbor." msgstr "Izaberite proširenje za podešavanje koristeći prozorče za izbor."
#: ../js/gdm/loginDialog.js:405 #: ../js/gdm/loginDialog.js:405
#| msgid "Session..."
msgid "Session…" msgid "Session…"
msgstr "Sesija…" msgstr "Sesija…"
#. translators: this message is shown below the user list on the #. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for #. login screen. It can be activated to reveal an entry for
#. manually entering the username. #. manually entering the username.
#: ../js/gdm/loginDialog.js:630 #: ../js/gdm/loginDialog.js:629
msgid "Not listed?" msgid "Not listed?"
msgstr "Nije na spisku?" msgstr "Nije na spisku?"
#: ../js/gdm/loginDialog.js:786 ../js/ui/components/networkAgent.js:137 #: ../js/gdm/loginDialog.js:783 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:375 #: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:375
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 #: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:99 #: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:126
#: ../js/ui/userMenu.js:938 #: ../js/ui/userMenu.js:934
msgid "Cancel" msgid "Cancel"
msgstr "Otkaži" msgstr "Otkaži"
#: ../js/gdm/loginDialog.js:802 #: ../js/gdm/loginDialog.js:799
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Prijavi me" msgstr "Prijavi me"
#: ../js/gdm/loginDialog.js:802 #: ../js/gdm/loginDialog.js:799
msgid "Next" msgid "Next"
msgstr "Dalje" msgstr "Dalje"
#. TTLS and PEAP are actually much more complicated, but this complication #. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication #. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one) #. (and don't even care of which one)
#: ../js/gdm/loginDialog.js:917 ../js/ui/components/networkAgent.js:260 #: ../js/gdm/loginDialog.js:904 ../js/ui/components/networkAgent.js:260
#: ../js/ui/components/networkAgent.js:278 #: ../js/ui/components/networkAgent.js:278
msgid "Username: " msgid "Username: "
msgstr "Korisničko ime: " msgstr "Korisničko ime: "
#: ../js/gdm/loginDialog.js:1173 #: ../js/gdm/loginDialog.js:1157
msgid "Login Window" msgid "Login Window"
msgstr "Prozor za prijavljivanje" msgstr "Prozor za prijavljivanje"
#. Translators: accessible name of the power menu in the login screen #. Translators: accessible name of the power menu in the login screen
#: ../js/gdm/powerMenu.js:36 #: ../js/gdm/powerMenu.js:36
msgid "Power" msgid "Power"
msgstr "Napajanje" msgstr "Ugasi"
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:696 ../js/ui/userMenu.js:700 #: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:695 ../js/ui/userMenu.js:699
#: ../js/ui/userMenu.js:816 #: ../js/ui/userMenu.js:815
msgid "Suspend" msgid "Suspend"
msgstr "Obustavi" msgstr "Obustavi"
@@ -418,58 +419,58 @@ msgstr "Obustavi"
msgid "Restart" msgid "Restart"
msgstr "Ponovo pokreni" msgstr "Ponovo pokreni"
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:698 #: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:697
#: ../js/ui/userMenu.js:700 ../js/ui/userMenu.js:815 ../js/ui/userMenu.js:942 #: ../js/ui/userMenu.js:699 ../js/ui/userMenu.js:814 ../js/ui/userMenu.js:938
msgid "Power Off" msgid "Power Off"
msgstr "Isključi" msgstr "Ugasi"
#: ../js/gdm/util.js:249 #: ../js/gdm/util.js:182
msgid "Authentication error" msgid "Authentication error"
msgstr "Greška potvrđivanja identiteta" msgstr "Greška potvrđivanja identiteta"
#. Translators: this message is shown below the password entry field #. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead #. to indicate the user can swipe their finger instead
#: ../js/gdm/util.js:366 #: ../js/gdm/util.js:299
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(ili lupite prst)" msgstr "(ili lupite prst)"
#: ../js/gdm/util.js:391 #: ../js/gdm/util.js:324
#, c-format #, c-format
msgid "(e.g., user or %s)" msgid "(e.g., user or %s)"
msgstr "(npr., korisnik ili %s)" msgstr "(npr., korisnik ili %s)"
#: ../js/misc/util.js:97 #: ../js/misc/util.js:94
msgid "Command not found" msgid "Command not found"
msgstr "Naredba nije nađena" msgstr "Naredba nije nađena"
#. Replace "Error invoking GLib.shell_parse_argv: " with #. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer #. something nicer
#: ../js/misc/util.js:130 #: ../js/misc/util.js:127
msgid "Could not parse command:" msgid "Could not parse command:"
msgstr "Ne mogu da obradim naredbu:" msgstr "Ne mogu da obradim naredbu:"
#: ../js/misc/util.js:138 #: ../js/misc/util.js:135
#, c-format #, c-format
msgid "Execution of '%s' failed:" msgid "Execution of '%s' failed:"
msgstr "Nije uspelo pokretanje „%s“:" msgstr "Nije uspelo pokretanje „%s“:"
#: ../js/ui/appDisplay.js:349 #: ../js/ui/appDisplay.js:348
msgid "Frequent" msgid "Frequent"
msgstr "Često" msgstr "Često"
#: ../js/ui/appDisplay.js:356 #: ../js/ui/appDisplay.js:355
msgid "All" msgid "All"
msgstr "Sve" msgstr "Sve"
#: ../js/ui/appDisplay.js:914 #: ../js/ui/appDisplay.js:913
msgid "New Window" msgid "New Window"
msgstr "Novi prozor" msgstr "Novi prozor"
#: ../js/ui/appDisplay.js:917 ../js/ui/dash.js:284 #: ../js/ui/appDisplay.js:916 ../js/ui/dash.js:284
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Ukloni iz omiljenih" msgstr "Ukloni iz omiljenih"
#: ../js/ui/appDisplay.js:918 #: ../js/ui/appDisplay.js:917
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Dodaj u omiljene" msgstr "Dodaj u omiljene"
@@ -483,7 +484,7 @@ msgstr "„%s“ je dodat među omiljene."
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "„%s“ je uklonjen iz omiljenih." msgstr "„%s“ je uklonjen iz omiljenih."
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:789 #: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:788
msgid "Settings" msgid "Settings"
msgstr "Podešavanja" msgstr "Podešavanja"
@@ -506,7 +507,7 @@ msgctxt "event list time"
msgid "%H\\u2236%M" msgid "%H\\u2236%M"
msgstr "%H\\u2236%M" msgstr "%H\\u2236%M"
#. Translators: Shown in calendar event list, if 12h format, #. Transators: Shown in calendar event list, if 12h format,
#. \u2236 is a ratio character, similar to : and \u2009 is #. \u2236 is a ratio character, similar to : and \u2009 is
#. a thin space #. a thin space
#: ../js/ui/calendar.js:77 #: ../js/ui/calendar.js:77
@@ -608,35 +609,35 @@ msgid "S"
msgstr "Sub" msgstr "Sub"
#. Translators: Text to show if there are no events #. Translators: Text to show if there are no events
#: ../js/ui/calendar.js:720 #: ../js/ui/calendar.js:692
msgid "Nothing Scheduled" msgid "Nothing Scheduled"
msgstr "Ništa planirano" msgstr "Ništa planirano"
#. Translators: Shown on calendar heading when selected day occurs on current year #. Translators: Shown on calendar heading when selected day occurs on current year
#: ../js/ui/calendar.js:736 #: ../js/ui/calendar.js:708
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %B %d" msgstr "%A, %B %d"
#. Translators: Shown on calendar heading when selected day occurs on different year #. Translators: Shown on calendar heading when selected day occurs on different year
#: ../js/ui/calendar.js:739 #: ../js/ui/calendar.js:711
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d, %Y" msgid "%A, %B %d, %Y"
msgstr "%A, %B %d, %Y" msgstr "%A, %B %d, %Y"
#: ../js/ui/calendar.js:749 #: ../js/ui/calendar.js:721
msgid "Today" msgid "Today"
msgstr "Danas" msgstr "Danas"
#: ../js/ui/calendar.js:753 #: ../js/ui/calendar.js:725
msgid "Tomorrow" msgid "Tomorrow"
msgstr "Sutra" msgstr "Sutra"
#: ../js/ui/calendar.js:764 #: ../js/ui/calendar.js:736
msgid "This week" msgid "This week"
msgstr "Ove nedelje" msgstr "Ove nedelje"
#: ../js/ui/calendar.js:772 #: ../js/ui/calendar.js:744
msgid "Next week" msgid "Next week"
msgstr "Sledeće nedelje" msgstr "Sledeće nedelje"
@@ -652,12 +653,12 @@ msgstr "Spoljni uređaj je isključen"
msgid "Removable Devices" msgid "Removable Devices"
msgstr "Uklonjivi uređaji" msgstr "Uklonjivi uređaji"
#: ../js/ui/components/autorunManager.js:594 #: ../js/ui/components/autorunManager.js:593
#, c-format #, c-format
msgid "Open with %s" msgid "Open with %s"
msgstr "Otvori programom %s" msgstr "Otvori programom %s"
#: ../js/ui/components/autorunManager.js:620 #: ../js/ui/components/autorunManager.js:619
msgid "Eject" msgid "Eject"
msgstr "Izbaci" msgstr "Izbaci"
@@ -1037,7 +1038,7 @@ msgstr "Podešavanja datuma i vremena"
#. Translators: This is the date format to use when the calendar popup is #. 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"). #. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#. #.
#: ../js/ui/dateMenu.js:215 #: ../js/ui/dateMenu.js:205
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%A, %e. %b., %R" msgstr "%A, %e. %b., %R"
@@ -1212,6 +1213,7 @@ msgid "Remove"
msgstr "Ukloni" msgstr "Ukloni"
#: ../js/ui/messageTray.js:1501 #: ../js/ui/messageTray.js:1501
#| msgid "No Messages"
msgid "Clear Messages" msgid "Clear Messages"
msgstr "Očisti poruke" msgstr "Očisti poruke"
@@ -1219,15 +1221,15 @@ msgstr "Očisti poruke"
msgid "Notification Settings" msgid "Notification Settings"
msgstr "Postavke obaveštenja" msgstr "Postavke obaveštenja"
#: ../js/ui/messageTray.js:1709 #: ../js/ui/messageTray.js:1707
msgid "No Messages" msgid "No Messages"
msgstr "Nema poruka" msgstr "Nema poruka"
#: ../js/ui/messageTray.js:1782 #: ../js/ui/messageTray.js:1787
msgid "Message Tray" msgid "Message Tray"
msgstr "Fioka poruka" msgstr "Fioka poruka"
#: ../js/ui/messageTray.js:2810 #: ../js/ui/messageTray.js:2864
msgid "System Information" msgid "System Information"
msgstr "Podaci o sistemu" msgstr "Podaci o sistemu"
@@ -1236,7 +1238,7 @@ msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "Nepoznat" msgstr "Nepoznat"
#: ../js/ui/overviewControls.js:463 ../js/ui/screenShield.js:149 #: ../js/ui/overviewControls.js:460 ../js/ui/screenShield.js:153
#, c-format #, c-format
msgid "%d new message" msgid "%d new message"
msgid_plural "%d new messages" msgid_plural "%d new messages"
@@ -1245,7 +1247,7 @@ msgstr[1] "%d nove poruke"
msgstr[2] "%d novih poruka" msgstr[2] "%d novih poruka"
msgstr[3] "Jedna nova poruka" msgstr[3] "Jedna nova poruka"
#: ../js/ui/overview.js:84 #: ../js/ui/overview.js:82
msgid "Undo" msgid "Undo"
msgstr "Opozovi" msgstr "Opozovi"
@@ -1257,21 +1259,22 @@ msgstr "Pregled"
#. in the search entry when no search is #. in the search entry when no search is
#. active; it should not exceed ~30 #. active; it should not exceed ~30
#. characters. #. characters.
#: ../js/ui/overview.js:271 #: ../js/ui/overview.js:284
#| msgid "Type to search..."
msgid "Type to search…" msgid "Type to search…"
msgstr "Upišite tekst za pretragu…" msgstr "Upišite tekst za pretragu…"
#: ../js/ui/panel.js:612 #: ../js/ui/panel.js:613
msgid "Quit" msgid "Quit"
msgstr "Izađi" msgstr "Izađi"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:636 #: ../js/ui/panel.js:642
msgid "Activities" msgid "Activities"
msgstr "Aktivnosti" msgstr "Aktivnosti"
#: ../js/ui/panel.js:933 #: ../js/ui/panel.js:983
msgid "Top Bar" msgid "Top Bar"
msgstr "Gornja traka" msgstr "Gornja traka"
@@ -1284,21 +1287,21 @@ msgstr "Gornja traka"
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-intl" msgstr "toggle-switch-intl"
#: ../js/ui/runDialog.js:73 #: ../js/ui/runDialog.js:205
msgid "Enter a Command" msgid "Enter a Command"
msgstr "Unesite naredbu" msgstr "Unesite naredbu"
#: ../js/ui/runDialog.js:109 #: ../js/ui/runDialog.js:241
msgid "Close" msgid "Close"
msgstr "Zatvori" msgstr "Zatvori"
#. Translators: This is a time format for a date in #. Translators: This is a time format for a date in
#. long format #. long format
#: ../js/ui/screenShield.js:86 #: ../js/ui/screenShield.js:90
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %d. %B" msgstr "%A, %d. %B"
#: ../js/ui/screenShield.js:151 #: ../js/ui/screenShield.js:155
#, c-format #, c-format
msgid "%d new notification" msgid "%d new notification"
msgid_plural "%d new notifications" msgid_plural "%d new notifications"
@@ -1307,11 +1310,11 @@ msgstr[1] "%d nova obaveštenja"
msgstr[2] "%d novih obaveštenja" msgstr[2] "%d novih obaveštenja"
msgstr[3] "Jedno novo obaveštenje" msgstr[3] "Jedno novo obaveštenje"
#: ../js/ui/screenShield.js:438 ../js/ui/userMenu.js:807 #: ../js/ui/screenShield.js:442 ../js/ui/userMenu.js:806
msgid "Lock" msgid "Lock"
msgstr "Zaključaj" msgstr "Zaključaj"
#: ../js/ui/screenShield.js:640 #: ../js/ui/screenShield.js:639
msgid "GNOME needs to lock the screen" msgid "GNOME needs to lock the screen"
msgstr "Gnom mora da zaključa ekran" msgstr "Gnom mora da zaključa ekran"
@@ -1322,19 +1325,21 @@ msgstr "Gnom mora da zaključa ekran"
#. #.
#. XXX: another option is to kick the user into the gdm login #. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs #. screen, where we're not affected by grabs
#: ../js/ui/screenShield.js:761 ../js/ui/screenShield.js:1197 #: ../js/ui/screenShield.js:758 ../js/ui/screenShield.js:1169
#| msgid "Unable to connect to %s"
msgid "Unable to lock" msgid "Unable to lock"
msgstr "Ne mogu da zaključam" msgstr "Ne mogu da zaključam"
#: ../js/ui/screenShield.js:762 ../js/ui/screenShield.js:1198 #: ../js/ui/screenShield.js:759 ../js/ui/screenShield.js:1170
msgid "Lock was blocked by an application" msgid "Lock was blocked by an application"
msgstr "Neki program je blokirao zaključavanje" msgstr "Neki program je blokirao zaključavanje"
#: ../js/ui/searchDisplay.js:453 #: ../js/ui/searchDisplay.js:431
#| msgid "Searching..."
msgid "Searching…" msgid "Searching…"
msgstr "Tražim…" msgstr "Tražim…"
#: ../js/ui/searchDisplay.js:497 #: ../js/ui/searchDisplay.js:475
msgid "No results." msgid "No results."
msgstr "Nema odgovarajućih rezultata." msgstr "Nema odgovarajućih rezultata."
@@ -1346,11 +1351,11 @@ msgstr "Umnoži"
msgid "Paste" msgid "Paste"
msgstr "Ubaci" msgstr "Ubaci"
#: ../js/ui/shellEntry.js:106 #: ../js/ui/shellEntry.js:105
msgid "Show Text" msgid "Show Text"
msgstr "Prikaži tekst" msgstr "Prikaži tekst"
#: ../js/ui/shellEntry.js:108 #: ../js/ui/shellEntry.js:107
msgid "Hide Text" msgid "Hide Text"
msgstr "Sakrij tekst" msgstr "Sakrij tekst"
@@ -1362,7 +1367,7 @@ msgstr "Lozinka"
msgid "Remember Password" msgid "Remember Password"
msgstr "Zapamti lozinku" msgstr "Zapamti lozinku"
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:113 #: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:140
msgid "Unlock" msgid "Unlock"
msgstr "Otključaj" msgstr "Otključaj"
@@ -1426,10 +1431,12 @@ msgid "Visibility"
msgstr "Vidljivost" msgstr "Vidljivost"
#: ../js/ui/status/bluetooth.js:59 #: ../js/ui/status/bluetooth.js:59
#| msgid "Send Files to Device..."
msgid "Send Files to Device…" msgid "Send Files to Device…"
msgstr "Pošalji datoteke na uređaj…" msgstr "Pošalji datoteke na uređaj…"
#: ../js/ui/status/bluetooth.js:60 #: ../js/ui/status/bluetooth.js:60
#| msgid "Set Up a New Device..."
msgid "Set Up a New Device…" msgid "Set Up a New Device…"
msgstr "Podesi novi uređaj…" msgstr "Podesi novi uređaj…"
@@ -1456,6 +1463,7 @@ msgid "connecting..."
msgstr "povezujem se..." msgstr "povezujem se..."
#: ../js/ui/status/bluetooth.js:239 #: ../js/ui/status/bluetooth.js:239
#| msgid "Send Files..."
msgid "Send Files…" msgid "Send Files…"
msgstr "Pošalji datoteke…" msgstr "Pošalji datoteke…"
@@ -1668,6 +1676,7 @@ msgstr "Podešavanja napajanja"
#. 0 is reported when UPower does not have enough data #. 0 is reported when UPower does not have enough data
#. to estimate battery life #. to estimate battery life
#: ../js/ui/status/power.js:99 #: ../js/ui/status/power.js:99
#| msgid "Estimating..."
msgid "Estimating…" msgid "Estimating…"
msgstr "Približno…" msgstr "Približno…"
@@ -1775,11 +1784,11 @@ msgstr "Jačina zvuka"
msgid "Microphone" msgid "Microphone"
msgstr "Mikrofon" msgstr "Mikrofon"
#: ../js/ui/unlockDialog.js:124 #: ../js/ui/unlockDialog.js:151
msgid "Log in as another user" msgid "Log in as another user"
msgstr "Prijavite se kao drugi korsnik" msgstr "Prijavite se kao drugi korsnik"
#: ../js/ui/unlockDialog.js:145 #: ../js/ui/unlockDialog.js:177
msgid "Unlock Window" msgid "Unlock Window"
msgstr "Otključaj prozor" msgstr "Otključaj prozor"
@@ -1807,27 +1816,27 @@ msgstr "Miruje"
msgid "Offline" msgid "Offline"
msgstr "Van mreže" msgstr "Van mreže"
#: ../js/ui/userMenu.js:781 #: ../js/ui/userMenu.js:780
msgid "Notifications" msgid "Notifications"
msgstr "Obaveštenja" msgstr "Obaveštenja"
#: ../js/ui/userMenu.js:797 #: ../js/ui/userMenu.js:796
msgid "Switch User" msgid "Switch User"
msgstr "Promeni korisnika" msgstr "Promeni korisnika"
#: ../js/ui/userMenu.js:802 #: ../js/ui/userMenu.js:801
msgid "Log Out" msgid "Log Out"
msgstr "Odjavi me" msgstr "Odjavi me"
#: ../js/ui/userMenu.js:822 #: ../js/ui/userMenu.js:821
msgid "Install Updates & Restart" msgid "Install Updates & Restart"
msgstr "Instaliraj ažuriranja i ponovo pokreni" msgstr "Instaliraj ažuriranja i ponovo pokreni"
#: ../js/ui/userMenu.js:840 #: ../js/ui/userMenu.js:839
msgid "Your chat status will be set to busy" msgid "Your chat status will be set to busy"
msgstr "Vaše stanje ćaskanja će biti postavljeno na zauzeto" msgstr "Vaše stanje ćaskanja će biti postavljeno na zauzeto"
#: ../js/ui/userMenu.js:841 #: ../js/ui/userMenu.js:840
msgid "" msgid ""
"Notifications are now disabled, including chat messages. Your online status " "Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages." "has been adjusted to let others know that you might not see their messages."
@@ -1836,22 +1845,20 @@ msgstr ""
"mreži je podešeno tako da će ostali znati da vi ne možete videti njihove " "mreži je podešeno tako da će ostali znati da vi ne možete videti njihove "
"poruke." "poruke."
#: ../js/ui/userMenu.js:888 #: ../js/ui/userMenu.js:886
msgid "Other users are logged in." msgid "Other users are logged in."
msgstr "Drugi korisnici su prijavljeni." msgstr "Drugi korisnici su prijavljeni."
#: ../js/ui/userMenu.js:893 #: ../js/ui/userMenu.js:891
msgid "Shutting down might cause them to lose unsaved work." msgid "Shutting down might cause them to lose unsaved work."
msgstr "Isključivanje može da dovede do toga da izgube nesačuvani rad." msgstr "Isključivanje može da dovede do toga da izgube nesačuvani rad."
#. Translators: Remote here refers to a remote session, like a ssh login #: ../js/ui/userMenu.js:918
#: ../js/ui/userMenu.js:921
#, c-format #, c-format
msgid "%s (remote)" msgid "%s (remote)"
msgstr "%s (udaljeno)" msgstr "%s (udaljeno)"
#. Translators: Console here refers to a tty like a VT console #: ../js/ui/userMenu.js:920
#: ../js/ui/userMenu.js:924
#, c-format #, c-format
msgid "%s (console)" msgid "%s (console)"
msgstr "%s (ljuska)" msgstr "%s (ljuska)"
@@ -1864,7 +1871,7 @@ msgstr "Programi"
msgid "Search" msgid "Search"
msgstr "Traži" msgstr "Traži"
#: ../js/ui/wanda.js:77 #: ../js/ui/wanda.js:92
#, c-format #, c-format
msgid "" msgid ""
"Sorry, no wisdom for you today:\n" "Sorry, no wisdom for you today:\n"
@@ -1873,7 +1880,7 @@ msgstr ""
"Izvinite, danas za vas nema mudrosti:\n" "Izvinite, danas za vas nema mudrosti:\n"
"%s" "%s"
#: ../js/ui/wanda.js:81 #: ../js/ui/wanda.js:96
#, c-format #, c-format
msgid "%s the Oracle says" msgid "%s the Oracle says"
msgstr "Prorok je rekao %s" msgstr "Prorok je rekao %s"

2590
po/tr.po

File diff suppressed because it is too large Load Diff

442
po/vi.po
View File

@@ -1,19 +1,18 @@
# Vietnamese translation for gnome-shell. # Vietnamese translation for gnome-shell.
# Copyright (C) 2013 GNOME i18n Project for Vietnamese. # Copyright (C) 2010 GNOME i18n Project for Vietnamese.
# This file is distributed under the same license as the gnome-shell package. # This file is distributed under the same license as the gnome-shell package.
# Nguyễn Thái Ngọc Duy <pclouds@gmail.com>, 2010-2013. # Nguyễn Thái Ngọc Duy <pclouds@gmail.com>, 2010-2013.
# Ngô Chin <ndtrung4419@gmail.com>, 2011. # Ngô Chin <ndtrung4419@gmail.com>, 2011.
# Trần Ngọc Quân <vnwildman@gmail.com>, 2013.
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell\n" "Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n" "shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2013-03-23 11:49+0000\n" "POT-Creation-Date: 2013-03-02 23:02+0000\n"
"PO-Revision-Date: 2013-04-13 17:51+1000\n" "PO-Revision-Date: 2013-03-03 11:13+0700\n"
"Last-Translator: Trần Ngọc Quân <vnwildman@gmail.com>\n" "Last-Translator: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>\n"
"Language-Team: Vietnamese <translation-team-vi@lists.sourceforge.net>\n" "Language-Team: Vietnamese <vi-VN@googlegroups.com>\n"
"Language: vi\n" "Language: vi\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -50,7 +49,7 @@ msgstr "Mở trình đơn ứng dụng"
#: ../data/gnome-shell.desktop.in.in.h:1 #: ../data/gnome-shell.desktop.in.in.h:1
msgid "GNOME Shell" msgid "GNOME Shell"
msgstr "Hệ vỏ GNOME" msgstr "GNOME Shell"
#: ../data/gnome-shell.desktop.in.in.h:2 #: ../data/gnome-shell.desktop.in.in.h:2
msgid "Window management and application launching" msgid "Window management and application launching"
@@ -59,11 +58,11 @@ msgstr "Quản lý cửa sổ và chạy ứng dụng"
#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1 #: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1
#: ../js/extensionPrefs/main.js:153 #: ../js/extensionPrefs/main.js:153
msgid "GNOME Shell Extension Preferences" msgid "GNOME Shell Extension Preferences"
msgstr "Cá nhân hóa phần mở rộng hệ vỏ GNOME" msgstr "Tuỳ thích phần mở rộng GNOME Shell"
#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:2 #: ../data/gnome-shell-extension-prefs.desktop.in.in.h:2
msgid "Configure GNOME Shell Extensions" msgid "Configure GNOME Shell Extensions"
msgstr "Cấu hình phần mở rộng Hệ vỏ GNOME" msgstr "Cấu hình phần mở rộng GNOME Shell"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:1 #: ../data/org.gnome.shell.gschema.xml.in.in.h:1
msgid "Enable internal tools useful for developers and testers from Alt-F2" msgid "Enable internal tools useful for developers and testers from Alt-F2"
@@ -88,7 +87,7 @@ msgid ""
"list. You can also manipulate this list with the EnableExtension and " "list. You can also manipulate this list with the EnableExtension and "
"DisableExtension DBus methods on org.gnome.Shell." "DisableExtension DBus methods on org.gnome.Shell."
msgstr "" msgstr ""
"Phần mở rộng Hệ vỏ GNOME có thuộc tính uuid; khóa này liệt kê danh sách phần " "Phần mở rộng GNOME Shell có thuộc tính uuid. Khoá này liệt kê danh sách phần "
"mở rộng nên nạp. Bất kỳ phần mở rộng nào muốn nạp phải nằm trong danh sách " "mở rộng nên nạp. Bất kỳ phần mở rộng nào muốn nạp phải nằm trong danh sách "
"này. Bạn có thể thao tác trên danh sách này với phương thức DBus " "này. Bạn có thể thao tác trên danh sách này với phương thức DBus "
"EnableExtension và DisableExtension trên org.gnome.Shell." "EnableExtension và DisableExtension trên org.gnome.Shell."
@@ -121,15 +120,13 @@ msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:9 #: ../data/org.gnome.shell.gschema.xml.in.in.h:9
msgid "List of categories that should be displayed as folders" msgid "List of categories that should be displayed as folders"
msgstr "Liệt kê các các-ta-lốc mà nó có thể hiển thị như một thư mục" msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:10 #: ../data/org.gnome.shell.gschema.xml.in.in.h:10
msgid "" msgid ""
"Each category name in this list will be represented as folder in the " "Each category name in this list will be represented as folder in the "
"application view, rather than being displayed inline in the main view." "application view, rather than being displayed inline in the main view."
msgstr "" msgstr ""
"Mỗi tên các-ta-lốc trong danh sách này sẽ được xuất hiện như là một thư mục "
"trong trình bày ứng dụng, thay vì hiển thị cùng dòng trong trình bày chính. "
#: ../data/org.gnome.shell.gschema.xml.in.in.h:11 #: ../data/org.gnome.shell.gschema.xml.in.in.h:11
msgid "History for command (Alt-F2) dialog" msgid "History for command (Alt-F2) dialog"
@@ -157,22 +154,18 @@ msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15 #: ../data/org.gnome.shell.gschema.xml.in.in.h:15
msgid "Always show the 'Log out' menuitem in the user menu." msgid "Always show the 'Log out' menuitem in the user menu."
msgstr "Luôn hiện mục Đăng xuất trên trình đơn người dùng." msgstr "Luôn hiện mục \"Đăng xuất\" trên trình đơn người dùng."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16 #: ../data/org.gnome.shell.gschema.xml.in.in.h:16
msgid "" msgid ""
"This key overrides the automatic hiding of the 'Log out' menuitem in single-" "This key overrides the automatic hiding of the 'Log out' menuitem in single-"
"user, single-session situations." "user, single-session situations."
msgstr "" msgstr ""
"Khóa này sẽ đè lên việc tự động ẩn trình đơn 'Đăng xuất' ở chế độ đơn-người-"
"dùng, đơn-phiên-làm-việc. "
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 #: ../data/org.gnome.shell.gschema.xml.in.in.h:17
msgid "" msgid ""
"Whether to remember password for mounting encrypted or remote filesystems" "Whether to remember password for mounting encrypted or remote filesystems"
msgstr "" msgstr ""
"Hoặc là ghi nhớ mật khẩu dành cho việc gắn hệ thống tập tin đã mã hóa hoặc "
"hệ thống tập tin trên máy chủ"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.in.h:18
msgid "" msgid ""
@@ -181,10 +174,6 @@ msgid ""
"'Remember Password' checkbox will be present. This key sets the default " "'Remember Password' checkbox will be present. This key sets the default "
"state of the checkbox." "state of the checkbox."
msgstr "" msgstr ""
"Hệ vỏ sẽ yêu cầu mật khẩu khi có thư mục được mã hóa hay hệ thống tập tin "
"máy mạng được gắn. Nếu mật khẩu có thể ghi lại để dùng trong lần sau, hộp "
"dấu kiểm “Nhớ mật khẩu” sẽ xuất hiện. Khóa này đặt trạng thái mặc định cho "
"hộp dấu kiểm."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.in.h:19
msgid "Show the week date in the calendar" msgid "Show the week date in the calendar"
@@ -237,27 +226,27 @@ msgstr "Phím chạy hoặc ngừng trình thu màn hình."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31 #: ../data/org.gnome.shell.gschema.xml.in.in.h:31
msgid "Which keyboard to use" msgid "Which keyboard to use"
msgstr "Bàn phím cần dùng" msgstr "Loại bàn phím cần dùng"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32 #: ../data/org.gnome.shell.gschema.xml.in.in.h:32
msgid "The type of keyboard to use." msgid "The type of keyboard to use."
msgstr "Kiểu bàn phím cần dùng." msgstr "Loại bàn phím cần dùng."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33 #: ../data/org.gnome.shell.gschema.xml.in.in.h:33
msgid "Framerate used for recording screencasts." msgid "Framerate used for recording screencasts."
msgstr "Tốc độ khung hình sẽ dùng khi ghi screencast." msgstr "Tốc độ khung dùng lưu screencast."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34 #: ../data/org.gnome.shell.gschema.xml.in.in.h:34
msgid "" msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's " "The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second." "screencast recorder in frames-per-second."
msgstr "" msgstr ""
"Tốc độ khung hình của screencast được ghi bởi bộ thu Hệ vỏ GNOME tính theo " "Tốc độ khung của screencast lưu bởi bộ thu GNOME Shell theo số khung mỗi "
"số khung mỗi giây." "giây."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35 #: ../data/org.gnome.shell.gschema.xml.in.in.h:35
msgid "The gstreamer pipeline used to encode the screencast" msgid "The gstreamer pipeline used to encode the screencast"
msgstr "Ống dẫn gstreamer dùng để thu screencast" msgstr "Ống dẫn gstreamer để thu screencast"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37 #: ../data/org.gnome.shell.gschema.xml.in.in.h:37
#, no-c-format #, no-c-format
@@ -278,9 +267,9 @@ msgstr ""
"source pad không kết nối; đầu ra từ pad sẽ được ghi vào tập tin kết quả. Tuy " "source pad không kết nối; đầu ra từ pad sẽ được ghi vào tập tin kết quả. Tuy "
"nhiên ống dẫn có thể tự lưu đầu ra riêng - có thể hữu dụng để gửi kết quả " "nhiên ống dẫn có thể tự lưu đầu ra riêng - có thể hữu dụng để gửi kết quả "
"đến máy chủ icecast thông qua shout2send hoặc tương tự. Nếu bỏ chọn hoặc đặt " "đến máy chủ icecast thông qua shout2send hoặc tương tự. Nếu bỏ chọn hoặc đặt "
"giá trị rỗng, ống dẫn mặc định sẽ được dùng, hiện thời là vp8enc " "giá trị rỗng, ống dẫn mặc định sẽ được dùng, hiện thời là 'vp8enc "
"min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 threads=%T ! " "min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 threads=%T ! "
"queue ! webmmux và lưu ở dạng WEBM dùng VP8 codec. %T được dùng để thế chỗ " "queue ! webmmux' và lưu ở dạng WEBM dùng VP8 codec. %T được dùng để thế chỗ "
"cho số thread dự đoán tối ưu cho hệ thống." "cho số thread dự đoán tối ưu cho hệ thống."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38 #: ../data/org.gnome.shell.gschema.xml.in.in.h:38
@@ -307,31 +296,25 @@ msgid ""
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-" "are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
"only' (shows only the application icon) or 'both'." "only' (shows only the application icon) or 'both'."
msgstr "" msgstr ""
"Cấu hình về cách hiển thị các cửa sổ ở bảng chuyển đổi. Các kiểu có thể là "
"'thumbnail-only' (hiển thị ảnh thu nhỏ của cửa sổ), 'app-icon-only' (chỉ "
"hiển thị biểu tượng của ứng dụng) hoặc 'both' (cả hai)."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42 #: ../data/org.gnome.shell.gschema.xml.in.in.h:42
msgid "Attach modal dialog to the parent window" msgid "Attach modal dialog to the parent window"
msgstr "Gắn hộp thoại dạng modal vào cửa sổ mẹ" msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43 #: ../data/org.gnome.shell.gschema.xml.in.in.h:43
msgid "" msgid ""
"This key overrides the key in org.gnome.mutter when running GNOME Shell." "This key overrides the key in org.gnome.mutter when running GNOME Shell."
msgstr "" msgstr ""
"Khóa này sẽ đè lên khóa có trong org.gnome.mutter khi chạy hệ vỏ GNOME."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44 #: ../data/org.gnome.shell.gschema.xml.in.in.h:44
msgid "Arrangement of buttons on the titlebar" msgid "Arrangement of buttons on the titlebar"
msgstr "Sắp đặt các nút trên thanh tiêu đề" msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:45 #: ../data/org.gnome.shell.gschema.xml.in.in.h:45
msgid "" msgid ""
"This key overrides the key in org.gnome.desktop.wm.preferences when running " "This key overrides the key in org.gnome.desktop.wm.preferences when running "
"GNOME Shell." "GNOME Shell."
msgstr "" msgstr ""
"Khóa này đè lên khóa có trong org.gnome.desktop.wm.preferences khi chạy hệ "
"vỏ GNOME."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:46 #: ../data/org.gnome.shell.gschema.xml.in.in.h:46
msgid "Enable edge tiling when dropping windows on screen edges" msgid "Enable edge tiling when dropping windows on screen edges"
@@ -365,46 +348,46 @@ msgstr "Phiên làm việc…"
#. translators: this message is shown below the user list on the #. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for #. login screen. It can be activated to reveal an entry for
#. manually entering the username. #. manually entering the username.
#: ../js/gdm/loginDialog.js:630 #: ../js/gdm/loginDialog.js:629
msgid "Not listed?" msgid "Not listed?"
msgstr "Không có trong danh sách?" msgstr "Không có trong danh sách?"
#: ../js/gdm/loginDialog.js:786 ../js/ui/components/networkAgent.js:137 #: ../js/gdm/loginDialog.js:783 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:375 #: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:375
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 #: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:99 #: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:126
#: ../js/ui/userMenu.js:938 #: ../js/ui/userMenu.js:932
msgid "Cancel" msgid "Cancel"
msgstr "Thôi" msgstr "Thôi"
#: ../js/gdm/loginDialog.js:802 #: ../js/gdm/loginDialog.js:799
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Đăng nhập" msgstr "Đăng nhập"
#: ../js/gdm/loginDialog.js:802 #: ../js/gdm/loginDialog.js:799
msgid "Next" msgid "Next"
msgstr "Kế tiếp" msgstr "Tới"
#. TTLS and PEAP are actually much more complicated, but this complication #. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication #. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one) #. (and don't even care of which one)
#: ../js/gdm/loginDialog.js:917 ../js/ui/components/networkAgent.js:260 #: ../js/gdm/loginDialog.js:904 ../js/ui/components/networkAgent.js:260
#: ../js/ui/components/networkAgent.js:278 #: ../js/ui/components/networkAgent.js:278
msgid "Username: " msgid "Username: "
msgstr "Tài khoản: " msgstr "Tên người dùng: "
#: ../js/gdm/loginDialog.js:1173 #: ../js/gdm/loginDialog.js:1157
msgid "Login Window" msgid "Login Window"
msgstr "Cửa sổ đăng nhập" msgstr "Cửa sổ đặt nhập"
#. Translators: accessible name of the power menu in the login screen #. Translators: accessible name of the power menu in the login screen
#: ../js/gdm/powerMenu.js:36 #: ../js/gdm/powerMenu.js:36
msgid "Power" msgid "Power"
msgstr "Nguồn" msgstr "Nguồn"
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:696 ../js/ui/userMenu.js:700 #: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:694 ../js/ui/userMenu.js:698
#: ../js/ui/userMenu.js:816 #: ../js/ui/userMenu.js:814
msgid "Suspend" msgid "Suspend"
msgstr "Ngưng" msgstr "Ngưng"
@@ -412,58 +395,58 @@ msgstr "Ngưng"
msgid "Restart" msgid "Restart"
msgstr "Khởi động lại" msgstr "Khởi động lại"
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:698 #: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:696
#: ../js/ui/userMenu.js:700 ../js/ui/userMenu.js:815 ../js/ui/userMenu.js:942 #: ../js/ui/userMenu.js:698 ../js/ui/userMenu.js:813 ../js/ui/userMenu.js:936
msgid "Power Off" msgid "Power Off"
msgstr "Tắt máy" msgstr "Tắt máy"
#: ../js/gdm/util.js:249 #: ../js/gdm/util.js:182
msgid "Authentication error" msgid "Authentication error"
msgstr "Lỗi xác thực" msgstr "Lỗi xác thực"
#. Translators: this message is shown below the password entry field #. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead #. to indicate the user can swipe their finger instead
#: ../js/gdm/util.js:366 #: ../js/gdm/util.js:299
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(hoặc quẹt ngón tay)" msgstr "(hoặc quẹt ngón tay)"
#: ../js/gdm/util.js:391 #: ../js/gdm/util.js:324
#, c-format #, c-format
msgid "(e.g., user or %s)" msgid "(e.g., user or %s)"
msgstr "(ví dụ: tài khoản hoặc %s)" msgstr "(ví dụ người dùng hoặc %s)"
#: ../js/misc/util.js:97 #: ../js/misc/util.js:94
msgid "Command not found" msgid "Command not found"
msgstr "Không tìm thấy lệnh" msgstr "Không tìm thấy lệnh"
#. Replace "Error invoking GLib.shell_parse_argv: " with #. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer #. something nicer
#: ../js/misc/util.js:130 #: ../js/misc/util.js:127
msgid "Could not parse command:" msgid "Could not parse command:"
msgstr "Không thể phân tích lệnh:" msgstr "Không thể phân tích lệnh:"
#: ../js/misc/util.js:138 #: ../js/misc/util.js:135
#, c-format #, c-format
msgid "Execution of '%s' failed:" msgid "Execution of '%s' failed:"
msgstr "Lỗi thực hiện %s:" msgstr "Lỗi thực hiện '%s':"
#: ../js/ui/appDisplay.js:349 #: ../js/ui/appDisplay.js:348
msgid "Frequent" msgid "Frequent"
msgstr "Thường dùng" msgstr "Thường dùng"
#: ../js/ui/appDisplay.js:356 #: ../js/ui/appDisplay.js:355
msgid "All" msgid "All"
msgstr "Tất cả" msgstr "Tất cả"
#: ../js/ui/appDisplay.js:914 #: ../js/ui/appDisplay.js:913
msgid "New Window" msgid "New Window"
msgstr "Cửa sổ mới" msgstr "Cửa sổ mới"
#: ../js/ui/appDisplay.js:917 ../js/ui/dash.js:284 #: ../js/ui/appDisplay.js:916 ../js/ui/dash.js:284
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Bỏ đánh dấu ưa thích" msgstr "Bỏ đánh dấu ưa thích"
#: ../js/ui/appDisplay.js:918 #: ../js/ui/appDisplay.js:917
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Đánh dấu ưa thích" msgstr "Đánh dấu ưa thích"
@@ -477,13 +460,13 @@ msgstr "Đã được đánh dấu ưa thích cho %s."
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "Đã bỏ đánh dấu ưa thích cho %s" msgstr "Đã bỏ đánh dấu ưa thích cho %s"
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:789 #: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:787
msgid "Settings" msgid "Settings"
msgstr "Cài đặt" msgstr "Thiết lập"
#: ../js/ui/backgroundMenu.js:21 #: ../js/ui/backgroundMenu.js:21
msgid "Change Background…" msgid "Change Background…"
msgstr "Đổi ảnh nền…" msgstr "Thay đổi nền…"
#. Translators: Shown in calendar event list for all day events #. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters #. * Keep it short, best if you can use less then 10 characters
@@ -602,35 +585,35 @@ msgid "S"
msgstr "T7" msgstr "T7"
#. Translators: Text to show if there are no events #. Translators: Text to show if there are no events
#: ../js/ui/calendar.js:720 #: ../js/ui/calendar.js:692
msgid "Nothing Scheduled" msgid "Nothing Scheduled"
msgstr "Không có lịch hẹn" msgstr "Không có lịch hẹn"
#. Translators: Shown on calendar heading when selected day occurs on current year #. Translators: Shown on calendar heading when selected day occurs on current year
#: ../js/ui/calendar.js:736 #: ../js/ui/calendar.js:708
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %d %B" msgstr "%A, %d %B"
#. Translators: Shown on calendar heading when selected day occurs on different year #. Translators: Shown on calendar heading when selected day occurs on different year
#: ../js/ui/calendar.js:739 #: ../js/ui/calendar.js:711
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d, %Y" msgid "%A, %B %d, %Y"
msgstr "%A, %d %B %Y" msgstr "%A, %d %B %Y"
#: ../js/ui/calendar.js:749 #: ../js/ui/calendar.js:721
msgid "Today" msgid "Today"
msgstr "Hôm nay" msgstr "Hôm nay"
#: ../js/ui/calendar.js:753 #: ../js/ui/calendar.js:725
msgid "Tomorrow" msgid "Tomorrow"
msgstr "Ngày mai" msgstr "Ngày mai"
#: ../js/ui/calendar.js:764 #: ../js/ui/calendar.js:736
msgid "This week" msgid "This week"
msgstr "Tuần này" msgstr "Tuần này"
#: ../js/ui/calendar.js:772 #: ../js/ui/calendar.js:744
msgid "Next week" msgid "Next week"
msgstr "Tuần tới" msgstr "Tuần tới"
@@ -646,12 +629,12 @@ msgstr "Ổ ngoài đã ngắt kết nối"
msgid "Removable Devices" msgid "Removable Devices"
msgstr "Thiết bị di động" msgstr "Thiết bị di động"
#: ../js/ui/components/autorunManager.js:594 #: ../js/ui/components/autorunManager.js:593
#, c-format #, c-format
msgid "Open with %s" msgid "Open with %s"
msgstr "Mở bằng %s" msgstr "Mở bằng %s"
#: ../js/ui/components/autorunManager.js:620 #: ../js/ui/components/autorunManager.js:619
msgid "Eject" msgid "Eject"
msgstr "Đẩy ra" msgstr "Đẩy ra"
@@ -702,7 +685,7 @@ msgstr "Mạng không dây cần xác thực"
msgid "" msgid ""
"Passwords or encryption keys are required to access the wireless network " "Passwords or encryption keys are required to access the wireless network "
"'%s'." "'%s'."
msgstr "Cần mật mã hoặc khoá mã để truy cập mạng không dây %s" msgstr "Cần mật mã hoặc khoá mã để truy cập mạng không dây '%s'"
#: ../js/ui/components/networkAgent.js:314 #: ../js/ui/components/networkAgent.js:314
msgid "Wired 802.1X authentication" msgid "Wired 802.1X authentication"
@@ -735,7 +718,7 @@ msgstr "Mật khẩu mạng băng thông rộng"
#: ../js/ui/components/networkAgent.js:337 #: ../js/ui/components/networkAgent.js:337
#, c-format #, c-format
msgid "A password is required to connect to '%s'." msgid "A password is required to connect to '%s'."
msgstr "Cần mật khẩu để kết nối đến %s." msgstr "Cần mật khẩu để kết nối đến '%s'."
#: ../js/ui/components/polkitAgent.js:55 #: ../js/ui/components/polkitAgent.js:55
msgid "Authentication Required" msgid "Authentication Required"
@@ -789,7 +772,7 @@ msgstr "Ngừng im lặng"
#: ../js/ui/components/telepathyClient.js:480 #: ../js/ui/components/telepathyClient.js:480
msgid "Mute" msgid "Mute"
msgstr "Câm" msgstr "Im lặng"
#. Translators: this is the word "Yesterday" followed by a time string. i.e. "Yesterday, 14:30" #. Translators: this is the word "Yesterday" followed by a time string. i.e. "Yesterday, 14:30"
#: ../js/ui/components/telepathyClient.js:942 #: ../js/ui/components/telepathyClient.js:942
@@ -1000,7 +983,7 @@ msgstr "Xem tài khoản"
msgid "Unknown reason" msgid "Unknown reason"
msgstr "Lý do không biết" msgstr "Lý do không biết"
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:96 #: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:97
msgid "Windows" msgid "Windows"
msgstr "Cửa sổ" msgstr "Cửa sổ"
@@ -1029,7 +1012,7 @@ msgstr "Thiết lập ngày giờ"
#. Translators: This is the date format to use when the calendar popup is #. 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"). #. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#. #.
#: ../js/ui/dateMenu.js:215 #: ../js/ui/dateMenu.js:205
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%A %e %B, %Y" msgstr "%A %e %B, %Y"
@@ -1125,7 +1108,7 @@ msgstr "Cài đặt"
#: ../js/ui/extensionDownloader.js:204 #: ../js/ui/extensionDownloader.js:204
#, c-format #, c-format
msgid "Download and install '%s' from extensions.gnome.org?" msgid "Download and install '%s' from extensions.gnome.org?"
msgstr "Tải và cài đặt %s từ extensions.gnome.org chứ?" msgstr "Tải và cài đặt '%s' từ extensions.gnome.org chứ?"
#: ../js/ui/keyboard.js:619 ../js/ui/status/keyboard.js:314 #: ../js/ui/keyboard.js:619 ../js/ui/status/keyboard.js:314
#: ../js/ui/status/power.js:211 #: ../js/ui/status/power.js:211
@@ -1154,7 +1137,9 @@ msgstr "Hiện lỗi"
msgid "Enabled" msgid "Enabled"
msgstr "Bật" msgstr "Bật"
#: ../js/ui/lookingGlass.js:769 #. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:769 ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled" msgid "Disabled"
msgstr "Tắt" msgstr "Tắt"
@@ -1194,15 +1179,15 @@ msgstr "Xoá thông báo"
msgid "Notification Settings" msgid "Notification Settings"
msgstr "Thiết lập thông báo" msgstr "Thiết lập thông báo"
#: ../js/ui/messageTray.js:1709 #: ../js/ui/messageTray.js:1707
msgid "No Messages" msgid "No Messages"
msgstr "Không có thông báo" msgstr "Không có thông báo"
#: ../js/ui/messageTray.js:1782 #: ../js/ui/messageTray.js:1787
msgid "Message Tray" msgid "Message Tray"
msgstr "Khay thông báo" msgstr "Khay thông báo"
#: ../js/ui/messageTray.js:2810 #: ../js/ui/messageTray.js:2864
msgid "System Information" msgid "System Information"
msgstr "Thông tin hệ thống" msgstr "Thông tin hệ thống"
@@ -1211,13 +1196,13 @@ msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "Không biết" msgstr "Không biết"
#: ../js/ui/overviewControls.js:463 ../js/ui/screenShield.js:149 #: ../js/ui/overviewControls.js:460 ../js/ui/screenShield.js:153
#, c-format #, c-format
msgid "%d new message" msgid "%d new message"
msgid_plural "%d new messages" msgid_plural "%d new messages"
msgstr[0] "%d tin nhắn mới" msgstr[0] "%d tin nhắn mới"
#: ../js/ui/overview.js:84 #: ../js/ui/overview.js:82
msgid "Undo" msgid "Undo"
msgstr "Hoàn lại" msgstr "Hoàn lại"
@@ -1229,21 +1214,21 @@ msgstr "Tổng quan"
#. in the search entry when no search is #. in the search entry when no search is
#. active; it should not exceed ~30 #. active; it should not exceed ~30
#. characters. #. characters.
#: ../js/ui/overview.js:271 #: ../js/ui/overview.js:284
msgid "Type to search…" msgid "Type to search…"
msgstr "Nhập để tìm…" msgstr "Nhập để tìm…"
#: ../js/ui/panel.js:612 #: ../js/ui/panel.js:613
msgid "Quit" msgid "Quit"
msgstr "Thoát" msgstr "Thoát"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:636 #: ../js/ui/panel.js:642
msgid "Activities" msgid "Activities"
msgstr "Hoạt động" msgstr "Hoạt động"
#: ../js/ui/panel.js:933 #: ../js/ui/panel.js:983
msgid "Top Bar" msgid "Top Bar"
msgstr "Thanh đỉnh" msgstr "Thanh đỉnh"
@@ -1256,31 +1241,31 @@ msgstr "Thanh đỉnh"
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-intl" msgstr "toggle-switch-intl"
#: ../js/ui/runDialog.js:73 #: ../js/ui/runDialog.js:205
msgid "Enter a Command" msgid "Enter a Command"
msgstr "Nhập lệnh" msgstr "Nhập lệnh"
#: ../js/ui/runDialog.js:109 #: ../js/ui/runDialog.js:241
msgid "Close" msgid "Close"
msgstr "Đóng" msgstr "Đóng"
#. Translators: This is a time format for a date in #. Translators: This is a time format for a date in
#. long format #. long format
#: ../js/ui/screenShield.js:86 #: ../js/ui/screenShield.js:90
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %d %B" msgstr "%A, %d %B"
#: ../js/ui/screenShield.js:151 #: ../js/ui/screenShield.js:155
#, c-format #, c-format
msgid "%d new notification" msgid "%d new notification"
msgid_plural "%d new notifications" msgid_plural "%d new notifications"
msgstr[0] "%d thông báo mới" msgstr[0] "%d thông báo mới"
#: ../js/ui/screenShield.js:438 ../js/ui/userMenu.js:807 #: ../js/ui/screenShield.js:442 ../js/ui/userMenu.js:805
msgid "Lock" msgid "Lock"
msgstr "Khoá" msgstr "Khoá"
#: ../js/ui/screenShield.js:637 #: ../js/ui/screenShield.js:639
msgid "GNOME needs to lock the screen" msgid "GNOME needs to lock the screen"
msgstr "GNOME cần khoá màn hình" msgstr "GNOME cần khoá màn hình"
@@ -1291,19 +1276,19 @@ msgstr "GNOME cần khoá màn hình"
#. #.
#. XXX: another option is to kick the user into the gdm login #. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs #. screen, where we're not affected by grabs
#: ../js/ui/screenShield.js:758 ../js/ui/screenShield.js:1194 #: ../js/ui/screenShield.js:758 ../js/ui/screenShield.js:1169
msgid "Unable to lock" msgid "Unable to lock"
msgstr "Không thể khoá" msgstr "Không thể khoá"
#: ../js/ui/screenShield.js:759 ../js/ui/screenShield.js:1195 #: ../js/ui/screenShield.js:759 ../js/ui/screenShield.js:1170
msgid "Lock was blocked by an application" msgid "Lock was blocked by an application"
msgstr "Một ứng dụng đã ngăn cản khoá" msgstr "Một ứng dụng đã ngăn cản khoá"
#: ../js/ui/searchDisplay.js:453 #: ../js/ui/searchDisplay.js:431
msgid "Searching…" msgid "Searching…"
msgstr "Đang tìm…" msgstr "Đang tìm…"
#: ../js/ui/searchDisplay.js:497 #: ../js/ui/searchDisplay.js:475
msgid "No results." msgid "No results."
msgstr "Không có kết quả." msgstr "Không có kết quả."
@@ -1315,11 +1300,11 @@ msgstr "Chép"
msgid "Paste" msgid "Paste"
msgstr "Dán" msgstr "Dán"
#: ../js/ui/shellEntry.js:106 #: ../js/ui/shellEntry.js:105
msgid "Show Text" msgid "Show Text"
msgstr "Hiện chữ" msgstr "Hiện chữ"
#: ../js/ui/shellEntry.js:108 #: ../js/ui/shellEntry.js:107
msgid "Hide Text" msgid "Hide Text"
msgstr "Ẩn chữ" msgstr "Ẩn chữ"
@@ -1331,7 +1316,7 @@ msgstr "Mật khẩu"
msgid "Remember Password" msgid "Remember Password"
msgstr "Nhớ mật khẩu" msgstr "Nhớ mật khẩu"
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:113 #: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:140
msgid "Unlock" msgid "Unlock"
msgstr "Bỏ khoá" msgstr "Bỏ khoá"
@@ -1448,7 +1433,7 @@ msgstr "Yêu cầu cấp quyền từ %s"
#: ../js/ui/status/bluetooth.js:328 #: ../js/ui/status/bluetooth.js:328
#, c-format #, c-format
msgid "Device %s wants access to the service '%s'" msgid "Device %s wants access to the service '%s'"
msgstr "Thiết bị %s muốn truy cập dịch vụ %s" msgstr "Thiết bị %s muốn truy cập dịch vụ '%s'"
#: ../js/ui/status/bluetooth.js:330 #: ../js/ui/status/bluetooth.js:330
msgid "Always grant access" msgid "Always grant access"
@@ -1476,7 +1461,7 @@ msgstr "Thiết bị %s muốn kết nối với máy tính này"
#: ../js/ui/status/bluetooth.js:366 #: ../js/ui/status/bluetooth.js:366
#, c-format #, c-format
msgid "Please confirm whether the PIN '%06d' matches the one on the device." msgid "Please confirm whether the PIN '%06d' matches the one on the device."
msgstr "Vui lòng xác nhận PIN %06d khớp với số trên thiết bị." msgstr "Vui lòng xác nhận PIN '%06d' khớp với số trên thiết bị."
#. Translators: this is the verb, not the noun #. Translators: this is the verb, not the noun
#: ../js/ui/status/bluetooth.js:369 #: ../js/ui/status/bluetooth.js:369
@@ -1732,59 +1717,59 @@ msgstr "Âm lượng"
msgid "Microphone" msgid "Microphone"
msgstr "Micrô" msgstr "Micrô"
#: ../js/ui/unlockDialog.js:124 #: ../js/ui/unlockDialog.js:151
msgid "Log in as another user" msgid "Log in as another user"
msgstr "Đăng nhập người dùng khác" msgstr "Đăng nhập người dùng khác"
#: ../js/ui/unlockDialog.js:145 #: ../js/ui/unlockDialog.js:177
msgid "Unlock Window" msgid "Unlock Window"
msgstr "Bỏ khoá cửa sổ" msgstr "Bỏ khoá cửa sổ"
#: ../js/ui/userMenu.js:193 #: ../js/ui/userMenu.js:192
msgid "Available" msgid "Available"
msgstr "Có mặt" msgstr "Có mặt"
#: ../js/ui/userMenu.js:196 #: ../js/ui/userMenu.js:195
msgid "Busy" msgid "Busy"
msgstr "Bận" msgstr "Bận"
#: ../js/ui/userMenu.js:199 #: ../js/ui/userMenu.js:198
msgid "Invisible" msgid "Invisible"
msgstr "Giấu mặt" msgstr "Giấu mặt"
#: ../js/ui/userMenu.js:202 #: ../js/ui/userMenu.js:201
msgid "Away" msgid "Away"
msgstr "Vắng mặt" msgstr "Vắng mặt"
#: ../js/ui/userMenu.js:205 #: ../js/ui/userMenu.js:204
msgid "Idle" msgid "Idle"
msgstr "Nhàn rỗi" msgstr "Nhàn rỗi"
#: ../js/ui/userMenu.js:208 #: ../js/ui/userMenu.js:207
msgid "Offline" msgid "Offline"
msgstr "Ngoại tuyến" msgstr "Ngoại tuyến"
#: ../js/ui/userMenu.js:781 #: ../js/ui/userMenu.js:779
msgid "Notifications" msgid "Notifications"
msgstr "Thông báo" msgstr "Thông báo"
#: ../js/ui/userMenu.js:797 #: ../js/ui/userMenu.js:795
msgid "Switch User" msgid "Switch User"
msgstr "Chuyển người dùng" msgstr "Chuyển người dùng"
#: ../js/ui/userMenu.js:802 #: ../js/ui/userMenu.js:800
msgid "Log Out" msgid "Log Out"
msgstr "Đăng xuất" msgstr "Đăng xuất"
#: ../js/ui/userMenu.js:822 #: ../js/ui/userMenu.js:820
msgid "Install Updates & Restart" msgid "Install Updates & Restart"
msgstr "Cài đặt bản cập nhật và khởi động lại" msgstr "Cài đặt bản cập nhật và khởi động lại"
#: ../js/ui/userMenu.js:840 #: ../js/ui/userMenu.js:838
msgid "Your chat status will be set to busy" msgid "Your chat status will be set to busy"
msgstr "Trạng thái nhắn tin của bạn sẽ được đặt là bận" msgstr "Trạng thái nhắn tin của bạn sẽ được đặt là bận"
#: ../js/ui/userMenu.js:841 #: ../js/ui/userMenu.js:839
msgid "" msgid ""
"Notifications are now disabled, including chat messages. Your online status " "Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages." "has been adjusted to let others know that you might not see their messages."
@@ -1792,35 +1777,33 @@ msgstr ""
"Thông báo đã bị tắt, bao gồm tin nhắn. Trạng thái trực tuyến của bạn đã được " "Thông báo đã bị tắt, bao gồm tin nhắn. Trạng thái trực tuyến của bạn đã được "
"điều chỉnh để mọi người biết bạn sẽ không xem tin nhắn họ gửi đến." "điều chỉnh để mọi người biết bạn sẽ không xem tin nhắn họ gửi đến."
#: ../js/ui/userMenu.js:888 #: ../js/ui/userMenu.js:885
msgid "Other users are logged in." msgid "Other users are logged in."
msgstr "Người dùng khác đang đăng nhập." msgstr "Người dùng khác đang đăng nhập."
#: ../js/ui/userMenu.js:893 #: ../js/ui/userMenu.js:890
msgid "Shutting down might cause them to lose unsaved work." msgid "Shutting down might cause them to lose unsaved work."
msgstr "Tắt sẽ làm mất những kết quả chưa được lưu." msgstr "Tắt sẽ làm mất những kết quả chưa được lưu."
#. Translators: Remote here refers to a remote session, like a ssh login #: ../js/ui/userMenu.js:916
#: ../js/ui/userMenu.js:921
#, c-format #, c-format
msgid "%s (remote)" msgid "%s (remote)"
msgstr "%s (ở xa)" msgstr "%s (ở xa)"
#. Translators: Console here refers to a tty like a VT console #: ../js/ui/userMenu.js:918
#: ../js/ui/userMenu.js:924
#, c-format #, c-format
msgid "%s (console)" msgid "%s (console)"
msgstr "%s (console)" msgstr "%s (console)"
#: ../js/ui/viewSelector.js:100 #: ../js/ui/viewSelector.js:101
msgid "Applications" msgid "Applications"
msgstr "Ứng dụng" msgstr "Ứng dụng"
#: ../js/ui/viewSelector.js:104 #: ../js/ui/viewSelector.js:105
msgid "Search" msgid "Search"
msgstr "Tìm" msgstr "Tìm"
#: ../js/ui/wanda.js:77 #: ../js/ui/wanda.js:92
#, c-format #, c-format
msgid "" msgid ""
"Sorry, no wisdom for you today:\n" "Sorry, no wisdom for you today:\n"
@@ -1829,7 +1812,7 @@ msgstr ""
"Rất tiếc, không có lời thông thái nào hôm nay:\n" "Rất tiếc, không có lời thông thái nào hôm nay:\n"
"%s" "%s"
#: ../js/ui/wanda.js:81 #: ../js/ui/wanda.js:96
#, c-format #, c-format
msgid "%s the Oracle says" msgid "%s the Oracle says"
msgstr "Nhà tiên tri %s nói" msgstr "Nhà tiên tri %s nói"
@@ -1837,12 +1820,32 @@ msgstr "Nhà tiên tri %s nói"
#: ../js/ui/windowAttentionHandler.js:19 #: ../js/ui/windowAttentionHandler.js:19
#, c-format #, c-format
msgid "'%s' is ready" msgid "'%s' is ready"
msgstr "%s đã sẵn sàng" msgstr "'%s' đã sẵn sàng"
#: ../src/calendar-server/evolution-calendar.desktop.in.in.h:1 #: ../src/calendar-server/evolution-calendar.desktop.in.in.h:1
msgid "Evolution Calendar" msgid "Evolution Calendar"
msgstr "Lịch Evolution" msgstr "Lịch Evolution"
#. translators:
#. * The number of sound outputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1837
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
msgstr[0] "%u đầu ra"
#. translators:
#. * The number of sound inputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1847
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
msgstr[0] "%u đầu vào"
#: ../src/gvc/gvc-mixer-control.c:2371
msgid "System Sounds"
msgstr "Âm thanh hệ thống"
#: ../src/main.c:347 #: ../src/main.c:347
msgid "Print version" msgid "Print version"
msgstr "In phiên bản" msgstr "In phiên bản"
@@ -1853,7 +1856,7 @@ msgstr "Chể độ dùng bởi GDM cho màn hình đăng nhập"
#: ../src/main.c:359 #: ../src/main.c:359
msgid "Use a specific mode, e.g. \"gdm\" for login screen" msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "Dùng chế độ đặc biệt, ví dụ gdm cho màn hình đăng nhập" msgstr "Dùng chế độ đặc biệt, ví dụ \"gdm\" cho màn hình đăng nhập"
#: ../src/main.c:365 #: ../src/main.c:365
msgid "List possible modes" msgid "List possible modes"
@@ -1862,7 +1865,7 @@ msgstr "Danh sách chế độ"
#: ../src/shell-app.c:622 #: ../src/shell-app.c:622
#, c-format #, c-format
msgid "Failed to launch '%s'" msgid "Failed to launch '%s'"
msgstr "Lỗi chạy %s" msgstr "Lỗi chạy '%s'"
#: ../src/shell-keyring-prompt.c:708 #: ../src/shell-keyring-prompt.c:708
msgid "Passwords do not match." msgid "Passwords do not match."
@@ -1876,17 +1879,6 @@ msgstr "Mật khẩu không thể không có"
msgid "Authentication dialog was dismissed by the user" msgid "Authentication dialog was dismissed by the user"
msgstr "Hộp thoại xác thực bị người dùng bỏ qua" msgstr "Hộp thoại xác thực bị người dùng bỏ qua"
#~ msgid "%u Output"
#~ msgid_plural "%u Outputs"
#~ msgstr[0] "%u đầu ra"
#~ msgid "%u Input"
#~ msgid_plural "%u Inputs"
#~ msgstr[0] "%u đầu vào"
#~ msgid "System Sounds"
#~ msgstr "Âm thanh hệ thống"
#~ msgctxt "title" #~ msgctxt "title"
#~ msgid "Sign In" #~ msgid "Sign In"
#~ msgstr "Đăng nhập" #~ msgstr "Đăng nhập"
@@ -1918,7 +1910,7 @@ msgstr "Hộp thoại xác thực bị người dùng bỏ qua"
#~ msgstr "%l:%M %p" #~ msgstr "%l:%M %p"
#~ msgid "Failed to unmount '%s'" #~ msgid "Failed to unmount '%s'"
#~ msgstr "Lỗi bỏ gắn kết %s" #~ msgstr "Lỗi bỏ gắn kết '%s'"
#~ msgid "Retry" #~ msgid "Retry"
#~ msgstr "Thử lại" #~ msgstr "Thử lại"
@@ -1933,7 +1925,7 @@ msgstr "Hộp thoại xác thực bị người dùng bỏ qua"
#~ msgstr "Lỗi duyệt tập tin" #~ msgstr "Lỗi duyệt tập tin"
#~ msgid "The requested device cannot be browsed, error is '%s'" #~ msgid "The requested device cannot be browsed, error is '%s'"
#~ msgstr "Không thể duyệt thiết bị yêu cầu , lỗi là %s" #~ msgstr "Không thể duyệt thiết bị yêu cầu , lỗi là '%s'"
#~ msgid "Wireless" #~ msgid "Wireless"
#~ msgstr "Mạng không dây" #~ msgstr "Mạng không dây"
@@ -2078,3 +2070,155 @@ msgstr "Hộp thoại xác thực bị người dùng bỏ qua"
#~ msgid "Show password" #~ msgid "Show password"
#~ msgstr "Hiện mật khẩu" #~ msgstr "Hiện mật khẩu"
#~| msgid "If true, display seconds in time."
#~ msgid "If true, display onscreen keyboard."
#~ msgstr "Nếu đúng (true), hiện bàn phím màn hình."
#~| msgid "Screen Keyboard"
#~ msgid "Show the onscreen keyboard"
#~ msgstr "Hiện bàn phím màn hình"
#~ msgid "%s has finished starting"
#~ msgstr "%s đã hoàn tất khởi chạy"
#~ msgid "Uuids of extensions to disable"
#~ msgstr "UUID của phần mở rộng cần tắt"
#~ msgid "You're now connected to mobile broadband connection '%s'"
#~ msgstr "Đã nối mạng '%s' (băng thông rộng)"
#~ msgid "You're now connected to wireless network '%s'"
#~ msgstr "Đã nối mạng '%s' (không dây)"
#~ msgid "You're now connected to wired network '%s'"
#~ msgstr "Đã nối mạng '%s' (dây)"
#~ msgid "You're now connected to VPN network '%s'"
#~ msgstr "Đã nối mạng VPN '%s'"
#~ msgid "Localization Settings"
#~ msgstr "Thiết lập bản địa hoá"
#~ msgid "Less than a minute ago"
#~ msgstr "Chưa đến một phút"
#~ msgid "%d minute ago"
#~ msgid_plural "%d minutes ago"
#~ msgstr[0] "%d phút trước"
#~ msgid "%d hour ago"
#~ msgid_plural "%d hours ago"
#~ msgstr[0] "%d giờ trước"
#~ msgid "%d day ago"
#~ msgid_plural "%d days ago"
#~ msgstr[0] "%d ngày trước"
#~ msgid "%d week ago"
#~ msgid_plural "%d weeks ago"
#~ msgstr[0] "%d tuần trước"
#~ msgid "Shut Down"
#~ msgstr "Tắt máy"
#~ msgid "Click Shut Down to quit these applications and shut down the system."
#~ msgstr "Nhấn Tắt máy để thoát những ứng dụng này và tắt hệ thống."
#~ msgid "The system will shut down automatically in %d seconds."
#~ msgstr "Hệ thống sẽ tự động tắt sau %d giây."
#~ msgid "Shutting down the system."
#~ msgstr "Tắt hệ thống."
#~ msgid "Confirm"
#~ msgstr "Xác nhận"
#~ msgid "Clip the crosshairs at the center"
#~ msgstr "Cắt lưới chéo ở giữa"
#~ msgid "Color of the crosshairs"
#~ msgstr "Màu lưới chéo"
#~ msgid ""
#~ "Determines the length of the vertical and horizontal lines that make up "
#~ "the crosshairs."
#~ msgstr "Xác định độ dài và rộng của những dòng tạo nên lưới chéo."
#~ msgid ""
#~ "Determines the transparency of the crosshairs, from fully opaque to fully "
#~ "transparent."
#~ msgstr "Xác định độ trong suốt của lưới chéo, từ đặc đến trong suốt."
#~ msgid "Enable lens mode"
#~ msgstr "Bật chế độ gương"
#~ msgid "Show or hide crosshairs"
#~ msgstr "Hiện hoặc ẩn lưới chéo"
#~ msgid "Show or hide the magnifier"
#~ msgstr "Hiện hoặc ẩn kính lúp"
#~ msgid "Thickness of the crosshairs"
#~ msgstr "Độ dày lưới chéo"
#~ msgid ""
#~ "Width of the vertical and horizontal lines that make up the crosshairs."
#~ msgstr "Độ rộng của đường dọc/ngang hình thành dấu gạch chéo."
#~ msgid "PREFERENCES"
#~ msgstr "TUỲ THÍCH"
#~ msgid "Shut Down..."
#~ msgstr "Tắt máy..."
#~ msgid "Search your computer"
#~ msgstr "Tìm trong máy"
#~ msgid "Customize the panel clock"
#~ msgstr "Tuỳ biến đồng hồ"
#~ msgid "Clock Format"
#~ msgstr "Dạng đồng hồ"
#~| msgid "System Preferences..."
#~ msgid "Clock Preferences"
#~ msgstr "Thiết lập đồng hồ"
#~ msgid "Panel Display"
#~ msgstr "Khung hiển thị"
#~ msgid "Show seco_nds"
#~ msgstr "Hiện _giây"
#~ msgid "_12 hour format"
#~ msgstr "Dạng _12 giờ"
#~ msgid "_24 hour format"
#~ msgstr "Dạng _24 giờ"
#~| msgid "System Preferences..."
#~ msgid "Preferences"
#~ msgstr "Thiết lập"
#~ msgid ""
#~ "Can't add a new workspace because maximum workspaces limit has been "
#~ "reached."
#~ msgstr ""
#~ "Không thể thêm vùng làm việc mới vì đã đạt giới hạn số vùng làm việc tối "
#~ "đa."
#~ msgid "Can't remove the first workspace."
#~ msgstr "Không thể bỏ vùng làm việc đầu tiên."
#~ msgid "Drag here to add favorites"
#~ msgstr "Kéo vào đây để thêm vào danh mục ưa thích"
#~ msgid "Find..."
#~ msgstr "Tìm"
#~ msgid "Sidebar"
#~ msgstr "Thanh bên"
#~ msgid "Recent Documents"
#~ msgstr "Tài liệu gần đây"

View File

@@ -15,8 +15,6 @@
* @SHELL_KEYBINDING_MODE_SYSTEM_MODAL: allow keybinding when a system modal * @SHELL_KEYBINDING_MODE_SYSTEM_MODAL: allow keybinding when a system modal
* dialog (e.g. authentification or session dialogs) is open * dialog (e.g. authentification or session dialogs) is open
* @SHELL_KEYBINDING_MODE_LOOKING_GLASS: allow keybinding in looking glass * @SHELL_KEYBINDING_MODE_LOOKING_GLASS: allow keybinding in looking glass
* @SHELL_KEYBINDING_MODE_TOPBAR_POPUP: allow keybinding while a top bar menu
* is open
* @SHELL_KEYBINDING_MODE_ALL: always allow keybinding * @SHELL_KEYBINDING_MODE_ALL: always allow keybinding
* *
* Controls in which GNOME Shell states a keybinding should be handled. * Controls in which GNOME Shell states a keybinding should be handled.
@@ -31,7 +29,6 @@ typedef enum {
SHELL_KEYBINDING_MODE_MESSAGE_TRAY = 1 << 5, SHELL_KEYBINDING_MODE_MESSAGE_TRAY = 1 << 5,
SHELL_KEYBINDING_MODE_SYSTEM_MODAL = 1 << 6, SHELL_KEYBINDING_MODE_SYSTEM_MODAL = 1 << 6,
SHELL_KEYBINDING_MODE_LOOKING_GLASS = 1 << 7, SHELL_KEYBINDING_MODE_LOOKING_GLASS = 1 << 7,
SHELL_KEYBINDING_MODE_TOPBAR_POPUP = 1 << 8,
SHELL_KEYBINDING_MODE_ALL = ~0, SHELL_KEYBINDING_MODE_ALL = ~0,
} ShellKeyBindingMode; } ShellKeyBindingMode;

View File

@@ -100,6 +100,7 @@ G_DEFINE_TYPE_WITH_CODE (ShellKeyringPrompt, shell_keyring_prompt, G_TYPE_OBJECT
enum { enum {
SIGNAL_SHOW_PASSWORD, SIGNAL_SHOW_PASSWORD,
SIGNAL_SHOW_CONFIRM, SIGNAL_SHOW_CONFIRM,
SIGNAL_HIDE_PROMPT,
SIGNAL_LAST SIGNAL_LAST
}; };
@@ -257,8 +258,10 @@ shell_keyring_prompt_dispose (GObject *obj)
{ {
ShellKeyringPrompt *self = SHELL_KEYRING_PROMPT (obj); ShellKeyringPrompt *self = SHELL_KEYRING_PROMPT (obj);
if (self->shown) if (self->shown) {
gcr_prompt_close (GCR_PROMPT (self)); self->shown = FALSE;
g_signal_emit (self, signals[SIGNAL_HIDE_PROMPT], 0);
}
if (self->async_result) if (self->async_result)
shell_keyring_prompt_cancel (self); shell_keyring_prompt_cancel (self);
@@ -381,6 +384,11 @@ shell_keyring_prompt_class_init (ShellKeyringPromptClass *klass)
0, 0, NULL, NULL, 0, 0, NULL, NULL,
g_cclosure_marshal_VOID__VOID, g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
signals[SIGNAL_HIDE_PROMPT] = g_signal_new ("hide-prompt", G_TYPE_FROM_CLASS (klass),
0, 0, NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
} }
static void static void
@@ -474,19 +482,6 @@ shell_keyring_prompt_confirm_finish (GcrPrompt *prompt,
return self->last_reply; return self->last_reply;
} }
static void
shell_keyring_prompt_close (GcrPrompt *prompt)
{
ShellKeyringPrompt *self = SHELL_KEYRING_PROMPT (prompt);
/*
* We expect keyring.js to connect to this signal and do the
* actual work of closing the prompt.
*/
self->shown = FALSE;
}
static void static void
shell_keyring_prompt_iface (GcrPromptIface *iface) shell_keyring_prompt_iface (GcrPromptIface *iface)
{ {
@@ -494,7 +489,6 @@ shell_keyring_prompt_iface (GcrPromptIface *iface)
iface->prompt_password_finish = shell_keyring_prompt_password_finish; iface->prompt_password_finish = shell_keyring_prompt_password_finish;
iface->prompt_confirm_async = shell_keyring_prompt_confirm_async; iface->prompt_confirm_async = shell_keyring_prompt_confirm_async;
iface->prompt_confirm_finish = shell_keyring_prompt_confirm_finish; iface->prompt_confirm_finish = shell_keyring_prompt_confirm_finish;
iface->prompt_close = shell_keyring_prompt_close;
} }
/** /**
@@ -752,19 +746,9 @@ shell_keyring_prompt_cancel (ShellKeyringPrompt *self)
GSimpleAsyncResult *res; GSimpleAsyncResult *res;
g_return_if_fail (SHELL_IS_KEYRING_PROMPT (self)); g_return_if_fail (SHELL_IS_KEYRING_PROMPT (self));
g_return_if_fail (self->mode != PROMPTING_NONE);
/*
* If cancelled while not prompting, we should just close the prompt,
* the user wants it to go away.
*/
if (self->mode == PROMPTING_NONE)
{
if (self->shown)
gcr_prompt_close (GCR_PROMPT (self));
return;
}
g_return_if_fail (self->async_result != NULL); g_return_if_fail (self->async_result != NULL);
self->last_reply = GCR_PROMPT_REPLY_CANCEL; self->last_reply = GCR_PROMPT_REPLY_CANCEL;
res = self->async_result; res = self->async_result;

View File

@@ -50,8 +50,6 @@ struct _ShellRecorder {
RecorderState state; RecorderState state;
ClutterStage *stage; ClutterStage *stage;
gboolean custom_area;
cairo_rectangle_int_t area;
int stage_width; int stage_width;
int stage_height; int stage_height;
@@ -68,7 +66,6 @@ struct _ShellRecorder {
CoglHandle recording_icon; /* icon shown while playing */ CoglHandle recording_icon; /* icon shown while playing */
gboolean draw_cursor;
cairo_surface_t *cursor_image; cairo_surface_t *cursor_image;
int cursor_hot_x; int cursor_hot_x;
int cursor_hot_y; int cursor_hot_y;
@@ -113,8 +110,6 @@ static void recorder_set_pipeline (ShellRecorder *recorder,
const char *pipeline); const char *pipeline);
static void recorder_set_file_template (ShellRecorder *recorder, static void recorder_set_file_template (ShellRecorder *recorder,
const char *file_template); const char *file_template);
static void recorder_set_draw_cursor (ShellRecorder *recorder,
gboolean draw_cursor);
static void recorder_pipeline_set_caps (RecorderPipeline *pipeline); static void recorder_pipeline_set_caps (RecorderPipeline *pipeline);
static void recorder_pipeline_closed (RecorderPipeline *pipeline); static void recorder_pipeline_closed (RecorderPipeline *pipeline);
@@ -124,8 +119,7 @@ enum {
PROP_STAGE, PROP_STAGE,
PROP_FRAMERATE, PROP_FRAMERATE,
PROP_PIPELINE, PROP_PIPELINE,
PROP_FILE_TEMPLATE, PROP_FILE_TEMPLATE
PROP_DRAW_CURSOR
}; };
G_DEFINE_TYPE(ShellRecorder, shell_recorder, G_TYPE_OBJECT); G_DEFINE_TYPE(ShellRecorder, shell_recorder, G_TYPE_OBJECT);
@@ -279,7 +273,6 @@ shell_recorder_init (ShellRecorder *recorder)
recorder->state = RECORDER_STATE_CLOSED; recorder->state = RECORDER_STATE_CLOSED;
recorder->framerate = DEFAULT_FRAMES_PER_SECOND; recorder->framerate = DEFAULT_FRAMES_PER_SECOND;
recorder->draw_cursor = TRUE;
} }
static void static void
@@ -436,10 +429,10 @@ recorder_draw_cursor (ShellRecorder *recorder,
/* We don't show a cursor unless the hot spot is in the frame; this /* We don't show a cursor unless the hot spot is in the frame; this
* means that sometimes we aren't going to draw a cursor even when * means that sometimes we aren't going to draw a cursor even when
* there is a little bit overlapping within the stage */ * there is a little bit overlapping within the stage */
if (recorder->pointer_x < recorder->area.x || if (recorder->pointer_x < 0 ||
recorder->pointer_y < recorder->area.y || recorder->pointer_y < 0 ||
recorder->pointer_x >= recorder->area.x + recorder->area.width || recorder->pointer_x >= recorder->stage_width ||
recorder->pointer_y >= recorder->area.y + recorder->area.height) recorder->pointer_y >= recorder->stage_height)
return; return;
if (!recorder->cursor_image) if (!recorder->cursor_image)
@@ -451,15 +444,15 @@ recorder_draw_cursor (ShellRecorder *recorder,
gst_buffer_map (buffer, &info, GST_MAP_WRITE); gst_buffer_map (buffer, &info, GST_MAP_WRITE);
surface = cairo_image_surface_create_for_data (info.data, surface = cairo_image_surface_create_for_data (info.data,
CAIRO_FORMAT_ARGB32, CAIRO_FORMAT_ARGB32,
recorder->area.width, recorder->stage_width,
recorder->area.height, recorder->stage_height,
recorder->area.width * 4); recorder->stage_width * 4);
cr = cairo_create (surface); cr = cairo_create (surface);
cairo_set_source_surface (cr, cairo_set_source_surface (cr,
recorder->cursor_image, recorder->cursor_image,
recorder->pointer_x - recorder->cursor_hot_x - recorder->area.x, recorder->pointer_x - recorder->cursor_hot_x,
recorder->pointer_y - recorder->cursor_hot_y - recorder->area.y); recorder->pointer_y - recorder->cursor_hot_y);
cairo_paint (cr); cairo_paint (cr);
cairo_destroy (cr); cairo_destroy (cr);
@@ -562,13 +555,12 @@ recorder_record_frame (ShellRecorder *recorder)
recorder->last_frame_time = now; recorder->last_frame_time = now;
size = recorder->area.width * recorder->area.height * 4; size = recorder->stage_width * recorder->stage_height * 4;
data = g_malloc (recorder->area.width * 4 * recorder->area.height); data = g_malloc (recorder->stage_width * 4 * recorder->stage_height);
cogl_read_pixels (recorder->area.x, cogl_read_pixels (0, 0, /* x/y */
recorder->area.y, recorder->stage_width,
recorder->area.width, recorder->stage_height,
recorder->area.height,
COGL_READ_PIXELS_COLOR_BUFFER, COGL_READ_PIXELS_COLOR_BUFFER,
CLUTTER_CAIRO_FORMAT_ARGB32, CLUTTER_CAIRO_FORMAT_ARGB32,
data); data);
@@ -580,8 +572,7 @@ recorder_record_frame (ShellRecorder *recorder)
GST_BUFFER_PTS(buffer) = now - recorder->start_time; GST_BUFFER_PTS(buffer) = now - recorder->start_time;
if (recorder->draw_cursor) recorder_draw_cursor (recorder, buffer);
recorder_draw_cursor (recorder, buffer);
shell_recorder_src_add_buffer (SHELL_RECORDER_SRC (recorder->current_pipeline->src), buffer); shell_recorder_src_add_buffer (SHELL_RECORDER_SRC (recorder->current_pipeline->src), buffer);
gst_buffer_unref (buffer); gst_buffer_unref (buffer);
@@ -625,14 +616,6 @@ recorder_update_size (ShellRecorder *recorder)
clutter_actor_get_allocation_box (CLUTTER_ACTOR (recorder->stage), &allocation); clutter_actor_get_allocation_box (CLUTTER_ACTOR (recorder->stage), &allocation);
recorder->stage_width = (int)(0.5 + allocation.x2 - allocation.x1); recorder->stage_width = (int)(0.5 + allocation.x2 - allocation.x1);
recorder->stage_height = (int)(0.5 + allocation.y2 - allocation.y1); recorder->stage_height = (int)(0.5 + allocation.y2 - allocation.y1);
if (!recorder->custom_area)
{
recorder->area.x = 0;
recorder->area.y = 0;
recorder->area.width = recorder->stage_width;
recorder->area.height = recorder->stage_height;
}
} }
static void static void
@@ -1023,18 +1006,6 @@ recorder_set_file_template (ShellRecorder *recorder,
g_object_notify (G_OBJECT (recorder), "file-template"); g_object_notify (G_OBJECT (recorder), "file-template");
} }
static void
recorder_set_draw_cursor (ShellRecorder *recorder,
gboolean draw_cursor)
{
if (draw_cursor == recorder->draw_cursor)
return;
recorder->draw_cursor = draw_cursor;
g_object_notify (G_OBJECT (recorder), "draw-cursor");
}
static void static void
shell_recorder_set_property (GObject *object, shell_recorder_set_property (GObject *object,
guint prop_id, guint prop_id,
@@ -1057,9 +1028,6 @@ shell_recorder_set_property (GObject *object,
case PROP_FILE_TEMPLATE: case PROP_FILE_TEMPLATE:
recorder_set_file_template (recorder, g_value_get_string (value)); recorder_set_file_template (recorder, g_value_get_string (value));
break; break;
case PROP_DRAW_CURSOR:
recorder_set_draw_cursor (recorder, g_value_get_boolean (value));
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;
@@ -1088,9 +1056,6 @@ shell_recorder_get_property (GObject *object,
case PROP_FILE_TEMPLATE: case PROP_FILE_TEMPLATE:
g_value_set_string (value, recorder->file_template); g_value_set_string (value, recorder->file_template);
break; break;
case PROP_DRAW_CURSOR:
g_value_set_boolean (value, recorder->draw_cursor);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;
@@ -1139,14 +1104,6 @@ shell_recorder_class_init (ShellRecorderClass *klass)
"The filename template to use for output files", "The filename template to use for output files",
NULL, NULL,
G_PARAM_READWRITE)); G_PARAM_READWRITE));
g_object_class_install_property (gobject_class,
PROP_DRAW_CURSOR,
g_param_spec_boolean ("draw-cursor",
"Draw Cursor",
"Whether to record the cursor",
TRUE,
G_PARAM_READWRITE));
} }
/* Sets the GstCaps (video format, in this case) on the stream /* Sets the GstCaps (video format, in this case) on the stream
@@ -1169,8 +1126,8 @@ recorder_pipeline_set_caps (RecorderPipeline *pipeline)
"bpp", G_TYPE_INT, 32, "bpp", G_TYPE_INT, 32,
"depth", G_TYPE_INT, 24, "depth", G_TYPE_INT, 24,
"framerate", GST_TYPE_FRACTION, pipeline->recorder->framerate, 1, "framerate", GST_TYPE_FRACTION, pipeline->recorder->framerate, 1,
"width", G_TYPE_INT, pipeline->recorder->area.width, "width", G_TYPE_INT, pipeline->recorder->stage_width,
"height", G_TYPE_INT, pipeline->recorder->area.height, "height", G_TYPE_INT, pipeline->recorder->stage_height,
NULL); NULL);
g_object_set (pipeline->src, "caps", caps, NULL); g_object_set (pipeline->src, "caps", caps, NULL);
gst_caps_unref (caps); gst_caps_unref (caps);
@@ -1721,15 +1678,6 @@ shell_recorder_set_file_template (ShellRecorder *recorder,
} }
void
shell_recorder_set_draw_cursor (ShellRecorder *recorder,
gboolean draw_cursor)
{
g_return_if_fail (SHELL_IS_RECORDER (recorder));
recorder_set_draw_cursor (recorder, draw_cursor);
}
/** /**
* shell_recorder_set_pipeline: * shell_recorder_set_pipeline:
* @recorder: the #ShellRecorder * @recorder: the #ShellRecorder
@@ -1757,35 +1705,9 @@ shell_recorder_set_pipeline (ShellRecorder *recorder,
recorder_set_pipeline (recorder, pipeline); recorder_set_pipeline (recorder, pipeline);
} }
void
shell_recorder_set_area (ShellRecorder *recorder,
int x,
int y,
int width,
int height)
{
g_return_if_fail (SHELL_IS_RECORDER (recorder));
recorder->custom_area = TRUE;
recorder->area.x = CLAMP (x, 0, recorder->stage_width);
recorder->area.y = CLAMP (y, 0, recorder->stage_height);
recorder->area.width = CLAMP (width,
0, recorder->stage_width - recorder->area.x);
recorder->area.height = CLAMP (height,
0, recorder->stage_height - recorder->area.y);
/* This breaks the recording but tweaking the GStreamer pipeline a bit
* might make it work, at least if the codec can handle a stream where
* the frame size changes in the middle.
*/
if (recorder->current_pipeline)
recorder_pipeline_set_caps (recorder->current_pipeline);
}
/** /**
* shell_recorder_record: * shell_recorder_record:
* @recorder: the #ShellRecorder * @recorder: the #ShellRecorder
* @filename_used: (out) (allow-none): actual filename used for recording
* *
* Starts recording, Starting the recording may fail if the output file * Starts recording, Starting the recording may fail if the output file
* cannot be opened, or if the output stream cannot be created * cannot be opened, or if the output stream cannot be created
@@ -1802,8 +1724,7 @@ shell_recorder_set_area (ShellRecorder *recorder,
* Return value: %TRUE if recording was succesfully started * Return value: %TRUE if recording was succesfully started
*/ */
gboolean gboolean
shell_recorder_record (ShellRecorder *recorder, shell_recorder_record (ShellRecorder *recorder)
char **filename_used)
{ {
g_return_val_if_fail (SHELL_IS_RECORDER (recorder), FALSE); g_return_val_if_fail (SHELL_IS_RECORDER (recorder), FALSE);
g_return_val_if_fail (recorder->stage != NULL, FALSE); g_return_val_if_fail (recorder->stage != NULL, FALSE);
@@ -1812,9 +1733,6 @@ shell_recorder_record (ShellRecorder *recorder,
if (!recorder_open_pipeline (recorder)) if (!recorder_open_pipeline (recorder))
return FALSE; return FALSE;
if (filename_used)
*filename_used = g_strdup (recorder->current_pipeline->filename);
recorder_connect_stage_callbacks (recorder); recorder_connect_stage_callbacks (recorder);
recorder->start_time = get_wall_time(); recorder->start_time = get_wall_time();

View File

@@ -36,15 +36,7 @@ void shell_recorder_set_file_template (ShellRecorder *recorder,
const char *file_template); const char *file_template);
void shell_recorder_set_pipeline (ShellRecorder *recorder, void shell_recorder_set_pipeline (ShellRecorder *recorder,
const char *pipeline); const char *pipeline);
void shell_recorder_set_draw_cursor (ShellRecorder *recorder, gboolean shell_recorder_record (ShellRecorder *recorder);
gboolean draw_cursor);
void shell_recorder_set_area (ShellRecorder *recorder,
int x,
int y,
int width,
int height);
gboolean shell_recorder_record (ShellRecorder *recorder,
char **filename_used);
void shell_recorder_close (ShellRecorder *recorder); void shell_recorder_close (ShellRecorder *recorder);
void shell_recorder_pause (ShellRecorder *recorder); void shell_recorder_pause (ShellRecorder *recorder);
gboolean shell_recorder_is_recording (ShellRecorder *recorder); gboolean shell_recorder_is_recording (ShellRecorder *recorder);

View File

@@ -82,8 +82,6 @@ enum
PROP_CLUTTER_TEXT, PROP_CLUTTER_TEXT,
PROP_HINT_TEXT, PROP_HINT_TEXT,
PROP_TEXT, PROP_TEXT,
PROP_INPUT_PURPOSE,
PROP_INPUT_HINTS,
}; };
/* signals */ /* signals */
@@ -138,14 +136,6 @@ st_entry_set_property (GObject *gobject,
st_entry_set_text (entry, g_value_get_string (value)); st_entry_set_text (entry, g_value_get_string (value));
break; break;
case PROP_INPUT_PURPOSE:
st_entry_set_input_purpose (entry, g_value_get_enum (value));
break;
case PROP_INPUT_HINTS:
st_entry_set_input_hints (entry, g_value_get_flags (value));
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
break; break;
@@ -174,14 +164,6 @@ st_entry_get_property (GObject *gobject,
g_value_set_string (value, clutter_text_get_text (CLUTTER_TEXT (priv->entry))); g_value_set_string (value, clutter_text_get_text (CLUTTER_TEXT (priv->entry)));
break; break;
case PROP_INPUT_PURPOSE:
g_value_set_enum (value, st_im_text_get_input_purpose (ST_IM_TEXT (priv->entry)));
break;
case PROP_INPUT_HINTS:
g_value_set_flags (value, st_im_text_get_input_hints (ST_IM_TEXT (priv->entry)));
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
break; break;
@@ -777,26 +759,6 @@ st_entry_class_init (StEntryClass *klass)
NULL, G_PARAM_READWRITE); NULL, G_PARAM_READWRITE);
g_object_class_install_property (gobject_class, PROP_TEXT, pspec); g_object_class_install_property (gobject_class, PROP_TEXT, pspec);
pspec = g_param_spec_enum ("input-purpose",
"Purpose",
"Purpose of the text field",
GTK_TYPE_INPUT_PURPOSE,
GTK_INPUT_PURPOSE_FREE_FORM,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
g_object_class_install_property (gobject_class,
PROP_INPUT_PURPOSE,
pspec);
pspec = g_param_spec_flags ("input-hints",
"hints",
"Hints for the text field behaviour",
GTK_TYPE_INPUT_HINTS,
GTK_INPUT_HINT_NONE,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
g_object_class_install_property (gobject_class,
PROP_INPUT_HINTS,
pspec);
/* signals */ /* signals */
/** /**
* StEntry::primary-icon-clicked: * StEntry::primary-icon-clicked:
@@ -1004,87 +966,6 @@ st_entry_get_hint_text (StEntry *entry)
return entry->priv->hint; return entry->priv->hint;
} }
/**
* st_entry_set_input_purpose:
* @entry: a #StEntry
* @purpose: the purpose
*
* Sets the #StEntry:input-purpose property which
* can be used by on-screen keyboards and other input
* methods to adjust their behaviour.
*/
void
st_entry_set_input_purpose (StEntry *entry,
GtkInputPurpose purpose)
{
StIMText *imtext;
g_return_if_fail (ST_IS_ENTRY (entry));
imtext = ST_IM_TEXT (entry->priv->entry);
if (st_im_text_get_input_purpose (imtext) != purpose)
{
st_im_text_set_input_purpose (imtext, purpose);
g_object_notify (G_OBJECT (entry), "input-purpose");
}
}
/**
* st_entry_get_input_purpose:
* @entry: a #StEntry
*
* Gets the value of the #StEntry:input-purpose property.
*/
GtkInputPurpose
st_entry_get_input_purpose (StEntry *entry)
{
g_return_val_if_fail (ST_IS_ENTRY (entry), GTK_INPUT_PURPOSE_FREE_FORM);
return st_im_text_get_input_purpose (ST_IM_TEXT (entry->priv->entry));
}
/**
* st_entry_set_input_hints:
* @entry: a #StEntry
* @hints: the hints
*
* Sets the #StEntry:input-hints property, which
* allows input methods to fine-tune their behaviour.
*/
void
st_entry_set_input_hints (StEntry *entry,
GtkInputHints hints)
{
StIMText *imtext;
g_return_if_fail (ST_IS_ENTRY (entry));
imtext = ST_IM_TEXT (entry->priv->entry);
if (st_im_text_get_input_hints (imtext) != hints)
{
st_im_text_set_input_hints (imtext, hints);
g_object_notify (G_OBJECT (entry), "input-hints");
}
}
/**
* st_entry_get_input_hints:
* @entry: a #StEntry
*
* Gets the value of the #StEntry:input-hints property.
*/
GtkInputHints
st_entry_get_input_hints (StEntry *entry)
{
g_return_val_if_fail (ST_IS_ENTRY (entry), GTK_INPUT_HINT_NONE);
return st_im_text_get_input_hints (ST_IM_TEXT (entry->priv->entry));
}
static gboolean static gboolean
_st_entry_icon_press_cb (ClutterActor *actor, _st_entry_icon_press_cb (ClutterActor *actor,
ClutterButtonEvent *event, ClutterButtonEvent *event,

View File

@@ -64,27 +64,20 @@ struct _StEntryClass
GType st_entry_get_type (void) G_GNUC_CONST; GType st_entry_get_type (void) G_GNUC_CONST;
StWidget *st_entry_new (const gchar *text); StWidget * st_entry_new (const gchar *text);
const gchar *st_entry_get_text (StEntry *entry); const gchar * st_entry_get_text (StEntry *entry);
void st_entry_set_text (StEntry *entry, void st_entry_set_text (StEntry *entry,
const gchar *text); const gchar *text);
ClutterActor *st_entry_get_clutter_text (StEntry *entry); ClutterActor* st_entry_get_clutter_text (StEntry *entry);
void st_entry_set_hint_text (StEntry *entry, void st_entry_set_hint_text (StEntry *entry,
const gchar *text); const gchar *text);
const gchar *st_entry_get_hint_text (StEntry *entry); const gchar * st_entry_get_hint_text (StEntry *entry);
void st_entry_set_input_purpose (StEntry *entry, void st_entry_set_primary_icon (StEntry *entry,
GtkInputPurpose purpose); ClutterActor *icon);
GtkInputPurpose st_entry_get_input_purpose (StEntry *entry); void st_entry_set_secondary_icon (StEntry *entry,
void st_entry_set_input_hints (StEntry *entry, ClutterActor *icon);
GtkInputHints hints);
GtkInputHints st_entry_get_input_hints (StEntry *entry);
void st_entry_set_primary_icon (StEntry *entry,
ClutterActor *icon);
void st_entry_set_secondary_icon (StEntry *entry,
ClutterActor *icon);
G_END_DECLS G_END_DECLS

View File

@@ -249,6 +249,11 @@ st_icon_paint (ClutterActor *actor)
clutter_actor_get_allocation_box (priv->icon_texture, &allocation); clutter_actor_get_allocation_box (priv->icon_texture, &allocation);
clutter_actor_box_get_size (&allocation, &width, &height); clutter_actor_box_get_size (&allocation, &width, &height);
allocation.x1 = (width - priv->shadow_width) / 2;
allocation.y1 = (height - priv->shadow_height) / 2;
allocation.x2 = allocation.x1 + priv->shadow_width;
allocation.y2 = allocation.y1 + priv->shadow_height;
_st_paint_shadow_with_opacity (priv->shadow_spec, _st_paint_shadow_with_opacity (priv->shadow_spec,
priv->shadow_material, priv->shadow_material,
&allocation, &allocation,
@@ -405,8 +410,8 @@ st_icon_finish_update (StIcon *icon)
st_icon_update_shadow_material (icon); st_icon_update_shadow_material (icon);
/* "pixbuf-change" is actually a misnomer for "texture-changed" */ /* "pixbuf-change" is actually a misnomer for "texture-changed" */
g_signal_connect_object (priv->icon_texture, "pixbuf-change", g_signal_connect (priv->icon_texture, "pixbuf-change",
G_CALLBACK (on_pixbuf_changed), icon, 0); G_CALLBACK (on_pixbuf_changed), icon);
} }
} }
@@ -464,7 +469,7 @@ st_icon_update (StIcon *icon)
else else
{ {
/* Will be shown when fully loaded */ /* Will be shown when fully loaded */
priv->opacity_handler_id = g_signal_connect_object (priv->pending_texture, "notify::opacity", G_CALLBACK (opacity_changed_cb), icon, 0); priv->opacity_handler_id = g_signal_connect (priv->pending_texture, "notify::opacity", G_CALLBACK (opacity_changed_cb), icon);
} }
} }
else if (priv->icon_texture) else if (priv->icon_texture)

View File

@@ -50,15 +50,6 @@
#include "st-im-text.h" #include "st-im-text.h"
/* properties */
enum
{
PROP_0,
PROP_INPUT_PURPOSE,
PROP_INPUT_HINTS,
};
#define ST_IM_TEXT_GET_PRIVATE(obj) \ #define ST_IM_TEXT_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), ST_TYPE_IM_TEXT, StIMTextPrivate)) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), ST_TYPE_IM_TEXT, StIMTextPrivate))
@@ -83,24 +74,27 @@ st_im_text_dispose (GObject *object)
} }
static void static void
st_im_text_cursor_event (ClutterText *self, update_im_cursor_location (StIMText *self)
const ClutterGeometry *geometry)
{ {
StIMTextPrivate *priv = ST_IM_TEXT (self)->priv; StIMTextPrivate *priv = self->priv;
ClutterText *clutter_text = CLUTTER_TEXT (self);
gint position;
gfloat cursor_x, cursor_y, cursor_height;
gfloat actor_x, actor_y; gfloat actor_x, actor_y;
GdkRectangle area; GdkRectangle area;
position = clutter_text_get_cursor_position (clutter_text);
clutter_text_position_to_coords (clutter_text, position,
&cursor_x, &cursor_y, &cursor_height);
clutter_actor_get_transformed_position (CLUTTER_ACTOR (self), &actor_x, &actor_y); clutter_actor_get_transformed_position (CLUTTER_ACTOR (self), &actor_x, &actor_y);
area.x = (int)(0.5 + geometry->x + actor_x); area.x = (int)(0.5 + cursor_x + actor_x);
area.y = (int)(0.5 + geometry->y + actor_y); area.y = (int)(0.5 + cursor_y + actor_y);
area.width = geometry->width; area.width = 0;
area.height = geometry->height; area.height = (int)(0.5 + cursor_height);
gtk_im_context_set_cursor_location (priv->im_context, &area); gtk_im_context_set_cursor_location (priv->im_context, &area);
if (CLUTTER_TEXT_CLASS (st_im_text_parent_class)->cursor_event)
CLUTTER_TEXT_CLASS (st_im_text_parent_class)->cursor_event (self, geometry);
} }
static void static void
@@ -196,6 +190,20 @@ reset_im_context (StIMText *self)
} }
} }
static void
st_im_text_paint (ClutterActor *actor)
{
StIMText *self = ST_IM_TEXT (actor);
ClutterText *clutter_text = CLUTTER_TEXT (actor);
/* This updates the cursor position as a side-effect */
if (CLUTTER_ACTOR_CLASS (st_im_text_parent_class)->paint)
CLUTTER_ACTOR_CLASS (st_im_text_parent_class)->paint (actor);
if (clutter_text_get_editable (clutter_text))
update_im_cursor_location (self);
}
static gboolean static gboolean
st_im_text_get_paint_volume (ClutterActor *self, st_im_text_get_paint_volume (ClutterActor *self,
ClutterPaintVolume *volume) ClutterPaintVolume *volume)
@@ -413,68 +421,17 @@ st_im_text_key_focus_out (ClutterActor *actor)
CLUTTER_ACTOR_CLASS (st_im_text_parent_class)->key_focus_out (actor); CLUTTER_ACTOR_CLASS (st_im_text_parent_class)->key_focus_out (actor);
} }
static void
st_im_text_set_property (GObject *gobject,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
StIMText *imtext = ST_IM_TEXT (gobject);
switch (prop_id)
{
case PROP_INPUT_PURPOSE:
st_im_text_set_input_purpose (imtext, g_value_get_enum (value));
break;
case PROP_INPUT_HINTS:
st_im_text_set_input_hints (imtext, g_value_get_flags (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
break;
}
}
static void
st_im_text_get_property (GObject *gobject,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
StIMText *imtext = ST_IM_TEXT (gobject);
switch (prop_id)
{
case PROP_INPUT_PURPOSE:
g_value_set_enum (value, st_im_text_get_input_purpose (imtext));
break;
case PROP_INPUT_HINTS:
g_value_set_flags (value, st_im_text_get_input_hints (imtext));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
break;
}
}
static void static void
st_im_text_class_init (StIMTextClass *klass) st_im_text_class_init (StIMTextClass *klass)
{ {
GObjectClass *object_class = G_OBJECT_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass);
ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass); ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
ClutterTextClass *text_class = CLUTTER_TEXT_CLASS (klass);
GParamSpec *pspec;
g_type_class_add_private (klass, sizeof (StIMTextPrivate)); g_type_class_add_private (klass, sizeof (StIMTextPrivate));
object_class->dispose = st_im_text_dispose; object_class->dispose = st_im_text_dispose;
object_class->set_property = st_im_text_set_property;
object_class->get_property = st_im_text_get_property;
actor_class->paint = st_im_text_paint;
actor_class->get_paint_volume = st_im_text_get_paint_volume; actor_class->get_paint_volume = st_im_text_get_paint_volume;
actor_class->realize = st_im_text_realize; actor_class->realize = st_im_text_realize;
actor_class->unrealize = st_im_text_unrealize; actor_class->unrealize = st_im_text_unrealize;
@@ -483,28 +440,6 @@ st_im_text_class_init (StIMTextClass *klass)
actor_class->captured_event = st_im_text_captured_event; actor_class->captured_event = st_im_text_captured_event;
actor_class->key_focus_in = st_im_text_key_focus_in; actor_class->key_focus_in = st_im_text_key_focus_in;
actor_class->key_focus_out = st_im_text_key_focus_out; actor_class->key_focus_out = st_im_text_key_focus_out;
text_class->cursor_event = st_im_text_cursor_event;
pspec = g_param_spec_enum ("input-purpose",
"Purpose",
"Purpose of the text field",
GTK_TYPE_INPUT_PURPOSE,
GTK_INPUT_PURPOSE_FREE_FORM,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
g_object_class_install_property (object_class,
PROP_INPUT_PURPOSE,
pspec);
pspec = g_param_spec_flags ("input-hints",
"hints",
"Hints for the text field behaviour",
GTK_TYPE_INPUT_HINTS,
GTK_INPUT_HINT_NONE,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
g_object_class_install_property (object_class,
PROP_INPUT_HINTS,
pspec);
} }
static void static void
@@ -540,96 +475,3 @@ st_im_text_new (const gchar *text)
"text", text, "text", text,
NULL); NULL);
} }
/**
* st_im_text_set_input_purpose:
* @imtext: a #StIMText
* @purpose: the purpose
*
* Sets the #StIMText:input-purpose property which
* can be used by on-screen keyboards and other input
* methods to adjust their behaviour.
*/
void
st_im_text_set_input_purpose (StIMText *imtext,
GtkInputPurpose purpose)
{
g_return_if_fail (ST_IS_IM_TEXT (imtext));
if (st_im_text_get_input_purpose (imtext) != purpose)
{
g_object_set (G_OBJECT (imtext->priv->im_context),
"input-purpose", purpose,
NULL);
g_object_get (G_OBJECT (imtext->priv->im_context),
"input-purpose", &purpose,
NULL);
g_object_notify (G_OBJECT (imtext), "input-purpose");
}
}
/**
* st_im_text_get_input_purpose:
* @imtext: a #StIMText
*
* Gets the value of the #StIMText:input-purpose property.
*/
GtkInputPurpose
st_im_text_get_input_purpose (StIMText *imtext)
{
GtkInputPurpose purpose;
g_return_val_if_fail (ST_IS_IM_TEXT (imtext), GTK_INPUT_PURPOSE_FREE_FORM);
g_object_get (G_OBJECT (imtext->priv->im_context),
"input-purpose", &purpose,
NULL);
return purpose;
}
/**
* st_im_text_set_input_hints:
* @imtext: a #StIMText
* @hints: the hints
*
* Sets the #StIMText:input-hints property, which
* allows input methods to fine-tune their behaviour.
*/
void
st_im_text_set_input_hints (StIMText *imtext,
GtkInputHints hints)
{
g_return_if_fail (ST_IS_IM_TEXT (imtext));
if (st_im_text_get_input_hints (imtext) != hints)
{
g_object_set (G_OBJECT (imtext->priv->im_context),
"input-hints", hints,
NULL);
g_object_notify (G_OBJECT (imtext), "input-hints");
}
}
/**
* st_im_text_get_input_hints:
* @imtext: a #StIMText
*
* Gets the value of the #StIMText:input-hints property.
*/
GtkInputHints
st_im_text_get_input_hints (StIMText *imtext)
{
GtkInputHints hints;
g_return_val_if_fail (ST_IS_IM_TEXT (imtext), GTK_INPUT_HINT_NONE);
g_object_get (G_OBJECT (imtext->priv->im_context),
"input-hints", &hints,
NULL);
return hints;
}

View File

@@ -60,13 +60,9 @@ struct _StIMTextClass
GType st_im_text_get_type (void) G_GNUC_CONST; GType st_im_text_get_type (void) G_GNUC_CONST;
ClutterActor *st_im_text_new (const gchar *text); ClutterActor *st_im_text_new (const gchar *text);
void st_im_text_set_input_purpose (StIMText *imtext, void st_im_text_set_autoshow_im (StIMText *self,
GtkInputPurpose purpose); gboolean autoshow);
GtkInputPurpose st_im_text_get_input_purpose (StIMText *imtext);
void st_im_text_set_input_hints (StIMText *imtext,
GtkInputHints hints);
GtkInputHints st_im_text_get_input_hints (StIMText *imtext);
G_END_DECLS G_END_DECLS

View File

@@ -218,6 +218,10 @@ st_label_paint (ClutterActor *actor)
clutter_actor_get_allocation_box (priv->label, &allocation); clutter_actor_get_allocation_box (priv->label, &allocation);
clutter_actor_box_get_size (&allocation, &width, &height); clutter_actor_box_get_size (&allocation, &width, &height);
allocation.x1 = allocation.y1 = 0;
allocation.x2 = width;
allocation.y2 = height;
if (priv->text_shadow_material == COGL_INVALID_HANDLE || if (priv->text_shadow_material == COGL_INVALID_HANDLE ||
width != priv->shadow_width || width != priv->shadow_width ||
height != priv->shadow_height) height != priv->shadow_height)

View File

@@ -511,7 +511,6 @@ _st_create_shadow_material_from_actor (StShadow *shadow_spec,
cogl_color_set_from_4ub (&clear_color, 0, 0, 0, 0); cogl_color_set_from_4ub (&clear_color, 0, 0, 0, 0);
cogl_push_framebuffer (offscreen); cogl_push_framebuffer (offscreen);
cogl_clear (&clear_color, COGL_BUFFER_BIT_COLOR); cogl_clear (&clear_color, COGL_BUFFER_BIT_COLOR);
cogl_translate (-box.x1, -box.y1, 0);
cogl_ortho (0, width, height, 0, 0, 1.0); cogl_ortho (0, width, height, 0, 0, 1.0);
clutter_actor_paint (actor); clutter_actor_paint (actor);
cogl_pop_framebuffer (); cogl_pop_framebuffer ();

View File

@@ -292,6 +292,11 @@ st_shadow_helper_paint (StShadowHelper *helper,
clutter_actor_box_get_size (actor_box, &width, &height); clutter_actor_box_get_size (actor_box, &width, &height);
allocation.x1 = (width - helper->width) / 2;
allocation.y1 = (height - helper->height) / 2;
allocation.x2 = allocation.x1 + helper->width;
allocation.y2 = allocation.y1 + helper->height;
_st_paint_shadow_with_opacity (helper->shadow, _st_paint_shadow_with_opacity (helper->shadow,
helper->material, helper->material,
&allocation, &allocation,

View File

@@ -879,101 +879,6 @@ st_theme_node_get_double (StThemeNode *node,
} }
} }
/**
* st_theme_node_lookup_url:
* @node: a #StThemeNode
* @property_name: The name of the string property
* @inherit: if %TRUE, if a value is not found for the property on the
* node, then it will be looked up on the parent node, and then on the
* parent's parent, and so forth. Note that if the property has a
* value of 'inherit' it will be inherited even if %FALSE is passed
* in for @inherit; this only affects the default behavior for inheritance.
* @value: (out): location to store the newly allocated value that was
* determined. If the property is not found, the value in this location
* will not be changed.
*
* Looks up a property containing a single URL value.
*
* See also st_theme_node_get_url(), which provides a simpler API.
*
* Return value: %TRUE if the property was found in the properties for this
* theme node (or in the properties of parent nodes when inheriting.)
*/
gboolean
st_theme_node_lookup_url (StThemeNode *node,
const char *property_name,
gboolean inherit,
char **value)
{
gboolean result = FALSE;
int i;
ensure_properties (node);
for (i = node->n_properties - 1; i >= 0; i--)
{
CRDeclaration *decl = node->properties[i];
if (strcmp (decl->property->stryng->str, property_name) == 0)
{
CRTerm *term = decl->value;
CRStyleSheet *base_stylesheet;
GFile *file;
if (term->type != TERM_URI && term->type != TERM_STRING)
continue;
if (decl->parent_statement != NULL)
base_stylesheet = decl->parent_statement->parent_sheet;
else
base_stylesheet = NULL;
file = _st_theme_resolve_url (node->theme,
base_stylesheet,
decl->value->content.str->stryng->str);
*value = g_file_get_path (file);
g_object_unref (file);
result = TRUE;
break;
}
}
if (!result && inherit && node->parent_node)
result = st_theme_node_lookup_url (node->parent_node, property_name, inherit, value);
return result;
}
/*
* st_theme_node_get_url:
* @node: a #StThemeNode
* @property_name: The name of the string property
*
* Looks up a property containing a single URL value.
*
* See also st_theme_node_lookup_url(), which provides more options,
* and lets you handle the case where the theme does not specify the
* indicated value.
*
* Return value: the newly allocated value if found.
* If @property_name is not found, a warning will be logged and %NULL
* will be returned.
*/
char *
st_theme_node_get_url (StThemeNode *node,
const char *property_name)
{
char *value;
if (st_theme_node_lookup_url (node, property_name, FALSE, &value))
return value;
else
{
g_warning ("Did not find string property '%s'", property_name);
return NULL;
}
}
static const PangoFontDescription * static const PangoFontDescription *
get_parent_font (StThemeNode *node) get_parent_font (StThemeNode *node)
{ {
@@ -1649,7 +1554,6 @@ void
_st_theme_node_ensure_geometry (StThemeNode *node) _st_theme_node_ensure_geometry (StThemeNode *node)
{ {
int i, j; int i, j;
int width, height;
if (node->geometry_computed) if (node->geometry_computed)
return; return;
@@ -1667,8 +1571,6 @@ _st_theme_node_ensure_geometry (StThemeNode *node)
node->outline_width = 0; node->outline_width = 0;
node->outline_color = TRANSPARENT_COLOR; node->outline_color = TRANSPARENT_COLOR;
width = -1;
height = -1;
node->width = -1; node->width = -1;
node->height = -1; node->height = -1;
node->min_width = -1; node->min_width = -1;
@@ -1688,12 +1590,8 @@ _st_theme_node_ensure_geometry (StThemeNode *node)
else if (g_str_has_prefix (property_name, "padding")) else if (g_str_has_prefix (property_name, "padding"))
do_padding_property (node, decl); do_padding_property (node, decl);
else if (strcmp (property_name, "width") == 0) else if (strcmp (property_name, "width") == 0)
do_size_property (node, decl, &width);
else if (strcmp (property_name, "height") == 0)
do_size_property (node, decl, &height);
else if (strcmp (property_name, "-st-natural-width") == 0)
do_size_property (node, decl, &node->width); do_size_property (node, decl, &node->width);
else if (strcmp (property_name, "-st-natural-height") == 0) else if (strcmp (property_name, "height") == 0)
do_size_property (node, decl, &node->height); do_size_property (node, decl, &node->height);
else if (strcmp (property_name, "min-width") == 0) else if (strcmp (property_name, "min-width") == 0)
do_size_property (node, decl, &node->min_width); do_size_property (node, decl, &node->min_width);
@@ -1705,43 +1603,29 @@ _st_theme_node_ensure_geometry (StThemeNode *node)
do_size_property (node, decl, &node->max_height); do_size_property (node, decl, &node->max_height);
} }
/* if (node->width != -1)
* Setting width sets max-width, min-width and -st-natural-width,
* unless one of them is set individually.
* Setting min-width sets natural width too, so that the minimum
* width reported by get_preferred_width() is always not greater
* than the natural width.
* The natural width in node->width is actually a lower bound, the
* actor is allowed to request something greater than that, but
* not greater than max-width.
* We don't need to clamp node->width to be less than max_width,
* that's done by adjust_preferred_width.
*/
if (width != -1)
{ {
if (node->width == -1)
node->width = width;
if (node->min_width == -1) if (node->min_width == -1)
node->min_width = width; node->min_width = node->width;
else if (node->width < node->min_width)
node->width = node->min_width;
if (node->max_width == -1) if (node->max_width == -1)
node->max_width = width; node->max_width = node->width;
else if (node->width > node->max_width)
node->width = node->max_width;
} }
if (node->width < node->min_width) if (node->height != -1)
node->width = node->min_width;
if (height != -1)
{ {
if (node->height == -1)
node->height = height;
if (node->min_height == -1) if (node->min_height == -1)
node->min_height = height; node->min_height = node->height;
else if (node->height < node->min_height)
node->height = node->min_height;
if (node->max_height == -1) if (node->max_height == -1)
node->max_height = height; node->max_height = node->height;
else if (node->height > node->max_height)
node->height = node->max_height;
} }
if (node->height < node->min_height)
node->height = node->min_height;
} }
int int
@@ -3541,7 +3425,7 @@ st_theme_node_adjust_preferred_width (StThemeNode *node,
if (natural_width_p) if (natural_width_p)
{ {
if (node->width != -1) if (node->width != -1)
*natural_width_p = MAX (*natural_width_p, node->width); *natural_width_p = node->width;
if (node->max_width != -1) if (node->max_width != -1)
*natural_width_p = MIN (*natural_width_p, node->max_width); *natural_width_p = MIN (*natural_width_p, node->max_width);
*natural_width_p += width_inc; *natural_width_p += width_inc;
@@ -3607,7 +3491,7 @@ st_theme_node_adjust_preferred_height (StThemeNode *node,
if (natural_height_p) if (natural_height_p)
{ {
if (node->height != -1) if (node->height != -1)
*natural_height_p = MAX (*natural_height_p, node->height); *natural_height_p = node->height;
if (node->max_height != -1) if (node->max_height != -1)
*natural_height_p = MIN (*natural_height_p, node->max_height); *natural_height_p = MIN (*natural_height_p, node->max_height);
*natural_height_p += height_inc; *natural_height_p += height_inc;

View File

@@ -142,10 +142,6 @@ gboolean st_theme_node_lookup_shadow (StThemeNode *node,
const char *property_name, const char *property_name,
gboolean inherit, gboolean inherit,
StShadow **shadow); StShadow **shadow);
gboolean st_theme_node_lookup_url (StThemeNode *node,
const char *property_name,
gboolean inherit,
char **value);
/* Easier-to-use variants of the above, for application-level use */ /* Easier-to-use variants of the above, for application-level use */
void st_theme_node_get_color (StThemeNode *node, void st_theme_node_get_color (StThemeNode *node,
@@ -157,8 +153,6 @@ gdouble st_theme_node_get_length (StThemeNode *node,
const char *property_name); const char *property_name);
StShadow *st_theme_node_get_shadow (StThemeNode *node, StShadow *st_theme_node_get_shadow (StThemeNode *node,
const char *property_name); const char *property_name);
char *st_theme_node_get_url (StThemeNode *node,
const char *property_name);
/* Specific getters for particular properties: cached /* Specific getters for particular properties: cached
*/ */

View File

@@ -48,7 +48,7 @@ on_stage_realized (ClutterActor *stage,
{ {
recorder = shell_recorder_new (CLUTTER_STAGE (stage)); recorder = shell_recorder_new (CLUTTER_STAGE (stage));
shell_recorder_set_file_template (recorder, "test-recorder.webm"); shell_recorder_set_file_template (recorder, "test-recorder.webm");
shell_recorder_record (recorder, NULL); shell_recorder_record (recorder);
} }
int main (int argc, char **argv) int main (int argc, char **argv)