Compare commits
14 Commits
Author | SHA1 | Date | |
---|---|---|---|
1b7577298a | |||
c4e0f6df08 | |||
58aafe9520 | |||
a46df7f8ec | |||
1dd16618d1 | |||
a4190f83ac | |||
a8e17f73ec | |||
86a741c1ee | |||
5cc6fef689 | |||
522a5fe480 | |||
b1239b1257 | |||
58063d9ee1 | |||
d7aba2dece | |||
35fced27df |
@ -1788,20 +1788,19 @@ StScrollBar {
|
||||
.login-dialog-user-list-view { -st-vfade-offset: 1em; }
|
||||
.login-dialog-user-list {
|
||||
spacing: 12px;
|
||||
padding: .2em;
|
||||
width: 23em;
|
||||
&:expanded .login-dialog-user-list-item:selected { background-color: $selected_bg_color; color: $selected_fg_color; }
|
||||
&:expanded .login-dialog-user-list-item:logged-in { border-right: 2px solid $selected_bg_color; }
|
||||
}
|
||||
.login-dialog-user-list-item {
|
||||
border-radius: 5px;
|
||||
padding: .2em;
|
||||
padding: 6px;
|
||||
color: darken($osd_fg_color,30%);
|
||||
&:ltr { padding-right: 1em; }
|
||||
&:rtl { padding-left: 1em; }
|
||||
&:ltr .user-widget { padding-right: 1em; }
|
||||
&:rtl .user-widget { padding-left: 1em; }
|
||||
.login-dialog-timed-login-indicator {
|
||||
height: 2px;
|
||||
margin: 2px 0 0 0;
|
||||
margin-top: 6px;
|
||||
background-color: $osd_fg_color;
|
||||
}
|
||||
&:focus .login-dialog-timed-login-indicator { background-color: $selected_fg_color; }
|
||||
@ -1816,8 +1815,8 @@ StScrollBar {
|
||||
padding-left: 15px;
|
||||
}
|
||||
.user-widget-label {
|
||||
&:ltr { padding-left: 18px; }
|
||||
&:rtl { padding-right: 18px; }
|
||||
&:ltr { padding-left: 14px; }
|
||||
&:rtl { padding-right: 14px; }
|
||||
}
|
||||
|
||||
.login-dialog-prompt-layout {
|
||||
|
@ -25,7 +25,6 @@ const GLib = imports.gi.GLib;
|
||||
const GObject = imports.gi.GObject;
|
||||
const Gtk = imports.gi.Gtk;
|
||||
const Lang = imports.lang;
|
||||
const Mainloop = imports.mainloop;
|
||||
const Meta = imports.gi.Meta;
|
||||
const Pango = imports.gi.Pango;
|
||||
const Shell = imports.gi.Shell;
|
||||
@ -86,7 +85,8 @@ var UserListItem = new Lang.Class({
|
||||
GObject.BindingFlags.SYNC_CREATE);
|
||||
|
||||
this._timedLoginIndicator = new St.Bin({ style_class: 'login-dialog-timed-login-indicator',
|
||||
scale_x: 0 });
|
||||
scale_x: 0,
|
||||
visible: false });
|
||||
layout.add(this._timedLoginIndicator);
|
||||
|
||||
this.actor.connect('clicked', this._onClicked.bind(this));
|
||||
@ -126,6 +126,8 @@ var UserListItem = new Lang.Class({
|
||||
|
||||
this.hideTimedLoginIndicator();
|
||||
|
||||
this._timedLoginIndicator.visible = true;
|
||||
|
||||
let startTime = GLib.get_monotonic_time();
|
||||
|
||||
this._timedLoginTimeoutId = GLib.timeout_add (GLib.PRIORITY_DEFAULT, 33,
|
||||
@ -152,6 +154,8 @@ var UserListItem = new Lang.Class({
|
||||
GLib.source_remove(this._timedLoginTimeoutId);
|
||||
this._timedLoginTimeoutId = 0;
|
||||
}
|
||||
|
||||
this._timedLoginIndicator.visible = false;
|
||||
this._timedLoginIndicator.scale_x = 0.;
|
||||
}
|
||||
});
|
||||
@ -991,59 +995,81 @@ var LoginDialog = new Lang.Class({
|
||||
return hold;
|
||||
},
|
||||
|
||||
_showTimedLoginAnimation() {
|
||||
this._timedLoginItem.actor.grab_key_focus();
|
||||
return this._timedLoginItem.showTimedLoginIndicator(this._timedLoginAnimationTime);
|
||||
},
|
||||
|
||||
_blockTimedLoginUntilIdle() {
|
||||
// This blocks timed login from starting until a few
|
||||
// seconds after the user stops interacting with the
|
||||
// login screen.
|
||||
//
|
||||
// We skip this step if the timed login delay is very
|
||||
// short.
|
||||
if ((this._timedLoginDelay - _TIMED_LOGIN_IDLE_THRESHOLD) <= 0)
|
||||
return null;
|
||||
|
||||
let hold = new Batch.Hold();
|
||||
|
||||
this._timedLoginIdleTimeOutId = Mainloop.timeout_add_seconds(_TIMED_LOGIN_IDLE_THRESHOLD,
|
||||
this._timedLoginIdleTimeOutId = GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, _TIMED_LOGIN_IDLE_THRESHOLD,
|
||||
() => {
|
||||
this._timedLoginAnimationTime -= _TIMED_LOGIN_IDLE_THRESHOLD;
|
||||
this._timedLoginIdleTimeOutId = 0;
|
||||
hold.release();
|
||||
return GLib.SOURCE_REMOVE;
|
||||
});
|
||||
GLib.Source.set_name_by_id(this._timedLoginIdleTimeOutId, '[gnome-shell] this._timedLoginAnimationTime');
|
||||
GLib.Source.set_name_by_id(this._timedLoginIdleTimeOutId, '[gnome-shell] this._timedLoginIdleTimeOutId');
|
||||
return hold;
|
||||
},
|
||||
|
||||
_startTimedLogin(userName, delay) {
|
||||
this._timedLoginItem = null;
|
||||
this._timedLoginDelay = delay;
|
||||
this._timedLoginAnimationTime = delay;
|
||||
let firstRun = true;
|
||||
|
||||
// Cancel execution of old batch
|
||||
if (this._timedLoginBatch) {
|
||||
this._timedLoginBatch.cancel();
|
||||
this._timedLoginBatch = null;
|
||||
firstRun = false;
|
||||
}
|
||||
|
||||
// Reset previous idle-timeout
|
||||
if (this._timedLoginIdleTimeOutId) {
|
||||
GLib.source_remove(this._timedLoginIdleTimeOutId);
|
||||
this._timedLoginIdleTimeOutId = 0;
|
||||
}
|
||||
|
||||
let loginItem = null;
|
||||
let animationTime;
|
||||
|
||||
let tasks = [() => this._waitForItemForUser(userName),
|
||||
|
||||
() => {
|
||||
this._timedLoginItem = this._userList.getItemFromUserName(userName);
|
||||
loginItem = this._userList.getItemFromUserName(userName);
|
||||
|
||||
// If there is an animation running on the item, reset it.
|
||||
loginItem.hideTimedLoginIndicator();
|
||||
},
|
||||
|
||||
() => {
|
||||
// If we're just starting out, start on the right
|
||||
// item.
|
||||
// If we're just starting out, start on the right item.
|
||||
if (!this._userManager.is_loaded) {
|
||||
this._userList.jumpToItem(this._timedLoginItem);
|
||||
this._userList.jumpToItem(loginItem);
|
||||
}
|
||||
},
|
||||
|
||||
this._blockTimedLoginUntilIdle,
|
||||
|
||||
() => {
|
||||
this._userList.scrollToItem(this._timedLoginItem);
|
||||
// This blocks the timed login animation until a few
|
||||
// seconds after the user stops interacting with the
|
||||
// login screen.
|
||||
|
||||
// We skip this step if the timed login delay is very short.
|
||||
if (delay > _TIMED_LOGIN_IDLE_THRESHOLD) {
|
||||
animationTime = delay - _TIMED_LOGIN_IDLE_THRESHOLD;
|
||||
return this._blockTimedLoginUntilIdle();
|
||||
} else {
|
||||
animationTime = delay;
|
||||
}
|
||||
},
|
||||
|
||||
this._showTimedLoginAnimation,
|
||||
() => {
|
||||
// If idle timeout is done, make sure the timed login indicator is shown
|
||||
if (delay > _TIMED_LOGIN_IDLE_THRESHOLD &&
|
||||
this._authPrompt.actor.visible)
|
||||
this._authPrompt.cancel();
|
||||
|
||||
if (delay > _TIMED_LOGIN_IDLE_THRESHOLD || firstRun) {
|
||||
this._userList.scrollToItem(loginItem);
|
||||
loginItem.actor.grab_key_focus();
|
||||
}
|
||||
},
|
||||
|
||||
() => loginItem.showTimedLoginIndicator(animationTime),
|
||||
|
||||
() => {
|
||||
this._timedLoginBatch = null;
|
||||
@ -1055,37 +1081,17 @@ var LoginDialog = new Lang.Class({
|
||||
return this._timedLoginBatch.run();
|
||||
},
|
||||
|
||||
_resetTimedLogin() {
|
||||
if (this._timedLoginBatch) {
|
||||
this._timedLoginBatch.cancel();
|
||||
this._timedLoginBatch = null;
|
||||
}
|
||||
|
||||
if (this._timedLoginItem)
|
||||
this._timedLoginItem.hideTimedLoginIndicator();
|
||||
|
||||
let userName = this._timedLoginItem.user.get_user_name();
|
||||
|
||||
if (userName)
|
||||
this._startTimedLogin(userName, this._timedLoginDelay);
|
||||
},
|
||||
|
||||
_onTimedLoginRequested(client, userName, seconds) {
|
||||
if (this._timedLoginBatch)
|
||||
return;
|
||||
|
||||
this._startTimedLogin(userName, seconds);
|
||||
|
||||
// Restart timed login on user interaction
|
||||
global.stage.connect('captured-event', (actor, event) => {
|
||||
if (this._timedLoginDelay == undefined)
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
if (event.type() == Clutter.EventType.KEY_PRESS ||
|
||||
event.type() == Clutter.EventType.BUTTON_PRESS) {
|
||||
if (this._timedLoginBatch) {
|
||||
this._timedLoginBatch.cancel();
|
||||
this._timedLoginBatch = null;
|
||||
}
|
||||
} else if (event.type() == Clutter.EventType.KEY_RELEASE ||
|
||||
event.type() == Clutter.EventType.BUTTON_RELEASE) {
|
||||
this._resetTimedLogin();
|
||||
this._startTimedLogin(userName, seconds);
|
||||
}
|
||||
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
@ -166,7 +166,7 @@ var CandidatePopup = new Lang.Class({
|
||||
this._panelService.cursor_down();
|
||||
});
|
||||
|
||||
this._candidateArea.connect('candidate-clicked', () => {
|
||||
this._candidateArea.connect('candidate-clicked', (area, index, button, state) => {
|
||||
this._panelService.candidate_clicked(index, button, state);
|
||||
});
|
||||
|
||||
|
40
po/ru.po
40
po/ru.po
@ -18,8 +18,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
|
||||
"POT-Creation-Date: 2018-04-12 11:47+0000\n"
|
||||
"PO-Revision-Date: 2018-04-12 16:48+0300\n"
|
||||
"POT-Creation-Date: 2018-04-13 18:31+0000\n"
|
||||
"PO-Revision-Date: 2018-04-19 23:31+0300\n"
|
||||
"Last-Translator: Stas Solovey <whats_up@tut.by>\n"
|
||||
"Language-Team: Русский <gnome-cyr@gnome.org>\n"
|
||||
"Language: ru\n"
|
||||
@ -344,7 +344,7 @@ msgid "There was an error loading the preferences dialog for %s:"
|
||||
msgstr "Возникла ошибка загрузки диалогового окна параметров для %s:"
|
||||
|
||||
#: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71
|
||||
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:149
|
||||
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:153
|
||||
#: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197
|
||||
#: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919
|
||||
msgid "Cancel"
|
||||
@ -563,7 +563,6 @@ msgstr "Вчера, %H∶%M"
|
||||
msgid "%A, %H∶%M"
|
||||
msgstr "%A, %H∶%M"
|
||||
|
||||
# fix даты "11 мар., 20:35"
|
||||
#. Translators: this is the month name and day number
|
||||
#. followed by a time string in 24h format.
|
||||
#. i.e. "May 25, 14:30"
|
||||
@ -572,7 +571,6 @@ msgstr "%A, %H∶%M"
|
||||
msgid "%B %d, %H∶%M"
|
||||
msgstr "%-d %B, %H∶%M"
|
||||
|
||||
# fix даты
|
||||
#. Translators: this is the month name, day number, year
|
||||
#. number followed by a time string in 24h format.
|
||||
#. i.e. "May 25 2012, 14:30"
|
||||
@ -581,7 +579,6 @@ msgstr "%-d %B, %H∶%M"
|
||||
msgid "%B %d %Y, %H∶%M"
|
||||
msgstr "%-d %B %Y, %H∶%M"
|
||||
|
||||
# по всей видимости разрабы коммент перепутали c "Translators: Time in 12h format"
|
||||
#. Translators: Time in 12h format
|
||||
#: js/misc/util.js:257
|
||||
msgid "%l∶%M %p"
|
||||
@ -823,7 +820,6 @@ msgctxt "calendar heading"
|
||||
msgid "%A, %B %d"
|
||||
msgstr "%A, %-d %B"
|
||||
|
||||
# fix для даты в календаре и на экране блокировки
|
||||
#: js/ui/calendar.js:868
|
||||
msgctxt "calendar heading"
|
||||
msgid "%A, %B %d, %Y"
|
||||
@ -876,7 +872,7 @@ msgstr "Внешний диск отключён"
|
||||
msgid "Open with %s"
|
||||
msgstr "Открыть с помощью %s"
|
||||
|
||||
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:285
|
||||
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:295
|
||||
msgid "Password:"
|
||||
msgstr "Пароль:"
|
||||
|
||||
@ -963,15 +959,15 @@ msgstr "Для подключения к «%s» требуется пароль.
|
||||
msgid "Network Manager"
|
||||
msgstr "Диспетчер сети"
|
||||
|
||||
#: js/ui/components/polkitAgent.js:44
|
||||
#: js/ui/components/polkitAgent.js:48
|
||||
msgid "Authentication Required"
|
||||
msgstr "Требуется подтверждение подлинности"
|
||||
|
||||
#: js/ui/components/polkitAgent.js:72
|
||||
#: js/ui/components/polkitAgent.js:76
|
||||
msgid "Administrator"
|
||||
msgstr "Администратор"
|
||||
|
||||
#: js/ui/components/polkitAgent.js:152
|
||||
#: js/ui/components/polkitAgent.js:156
|
||||
msgid "Authenticate"
|
||||
msgstr "Подтвердить"
|
||||
|
||||
@ -979,7 +975,7 @@ msgstr "Подтвердить"
|
||||
#. * requested authentication was not gained; this can happen
|
||||
#. * because of an authentication error (like invalid password),
|
||||
#. * for instance.
|
||||
#: js/ui/components/polkitAgent.js:271 js/ui/shellMountOperation.js:327
|
||||
#: js/ui/components/polkitAgent.js:281 js/ui/shellMountOperation.js:327
|
||||
msgid "Sorry, that didn’t work. Please try again."
|
||||
msgstr "Не удалось подтвердить подлинность. Попробуйте снова."
|
||||
|
||||
@ -1004,7 +1000,6 @@ msgstr "Показать приложения"
|
||||
msgid "Dash"
|
||||
msgstr "Панель приложений"
|
||||
|
||||
# fix для даты в календаре и на экране блокировки
|
||||
#. 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").
|
||||
#.
|
||||
@ -1012,7 +1007,6 @@ msgstr "Панель приложений"
|
||||
msgid "%B %e %Y"
|
||||
msgstr "%-d %B %Y"
|
||||
|
||||
# fix для даты в календаре и на экране блокировки
|
||||
#. Translators: This is the accessible name of the date button shown
|
||||
#. * below the time in the shell; it should combine the weekday and the
|
||||
#. * date, e.g. "Tuesday February 17 2015".
|
||||
@ -1029,7 +1023,7 @@ msgstr "Добавить мировые часы…"
|
||||
msgid "World Clocks"
|
||||
msgstr "Мировые часы"
|
||||
|
||||
#: js/ui/dateMenu.js:225
|
||||
#: js/ui/dateMenu.js:227
|
||||
msgid "Weather"
|
||||
msgstr "Погода"
|
||||
|
||||
@ -1037,7 +1031,7 @@ msgstr "Погода"
|
||||
#. libgweather for the possible condition strings. If at all
|
||||
#. possible, the sentence should match the grammatical case etc. of
|
||||
#. the inserted conditions.
|
||||
#: js/ui/dateMenu.js:289
|
||||
#: js/ui/dateMenu.js:291
|
||||
#, javascript-format
|
||||
msgid "%s all day."
|
||||
msgstr "%s весь день."
|
||||
@ -1046,7 +1040,7 @@ msgstr "%s весь день."
|
||||
#. libgweather for the possible condition strings. If at all
|
||||
#. possible, the sentence should match the grammatical case etc. of
|
||||
#. the inserted conditions.
|
||||
#: js/ui/dateMenu.js:295
|
||||
#: js/ui/dateMenu.js:297
|
||||
#, javascript-format
|
||||
msgid "%s, then %s later."
|
||||
msgstr "%s, затем позднее %s."
|
||||
@ -1055,30 +1049,30 @@ msgstr "%s, затем позднее %s."
|
||||
#. libgweather for the possible condition strings. If at all
|
||||
#. possible, the sentence should match the grammatical case etc. of
|
||||
#. the inserted conditions.
|
||||
#: js/ui/dateMenu.js:301
|
||||
#: js/ui/dateMenu.js:303
|
||||
#, javascript-format
|
||||
msgid "%s, then %s, followed by %s later."
|
||||
msgstr "%s, затем %s, позже %s."
|
||||
|
||||
#: js/ui/dateMenu.js:312
|
||||
#: js/ui/dateMenu.js:314
|
||||
msgid "Select a location…"
|
||||
msgstr "Выберите местоположение…"
|
||||
|
||||
#: js/ui/dateMenu.js:315
|
||||
#: js/ui/dateMenu.js:317
|
||||
msgid "Loading…"
|
||||
msgstr "Загрузка…"
|
||||
|
||||
#. Translators: %s is a temperature with unit, e.g. "23℃"
|
||||
#: js/ui/dateMenu.js:321
|
||||
#: js/ui/dateMenu.js:323
|
||||
#, javascript-format
|
||||
msgid "Feels like %s."
|
||||
msgstr "Ощущается как %s."
|
||||
|
||||
#: js/ui/dateMenu.js:324
|
||||
#: js/ui/dateMenu.js:326
|
||||
msgid "Go online for weather information"
|
||||
msgstr "Подключите интернет для получения информации о погоде"
|
||||
|
||||
#: js/ui/dateMenu.js:326
|
||||
#: js/ui/dateMenu.js:328
|
||||
msgid "Weather information is currently unavailable"
|
||||
msgstr "Информация о погоде сейчас недоступна"
|
||||
|
||||
|
@ -395,13 +395,6 @@ get_app_for_window (ShellWindowTracker *tracker,
|
||||
if (meta_window_is_remote (window))
|
||||
return _shell_app_new_for_window (window);
|
||||
|
||||
/* Check if the window was opened from within a sandbox; if this
|
||||
* is the case, a corresponding .desktop file is guaranteed to match;
|
||||
*/
|
||||
result = get_app_from_sandboxed_app_id (window);
|
||||
if (result != NULL)
|
||||
return result;
|
||||
|
||||
/* Check if the window has a GApplication ID attached; this is
|
||||
* canonical if it does
|
||||
*/
|
||||
@ -416,6 +409,15 @@ get_app_for_window (ShellWindowTracker *tracker,
|
||||
if (result != NULL)
|
||||
return result;
|
||||
|
||||
/* Check if the window was opened from within a sandbox; if this
|
||||
* is the case, a corresponding .desktop file is guaranteed to match;
|
||||
* Do this after having checked by WM_CLASS so that sandboxed apps
|
||||
* installing multiple .desktop files can properly match their windows.
|
||||
*/
|
||||
result = get_app_from_sandboxed_app_id (window);
|
||||
if (result != NULL)
|
||||
return result;
|
||||
|
||||
result = get_app_from_window_pid (tracker, window);
|
||||
if (result != NULL)
|
||||
return result;
|
||||
|
Reference in New Issue
Block a user