Compare commits

...

19 Commits

Author SHA1 Message Date
752b1df659 shell-app: Add discrete GPU support for NVidia drivers
Add the necessary environment variables that would make offloading to
the NVidia "secondary" drivers work as expected.

Closes: https://gitlab.gnome.org/GNOME/gnome-shell/issues/1810
2019-10-24 14:49:22 +02:00
366b06716d appDisplay: Respect X-KDE-RunOnDiscreteGpu appInfo property
When X-KDE-RunOnDiscreteGpu is set in the application's .desktop file,
launch the application on the discrete GPU if available, and offer
to launch on the discrete GPU manually otherwise.

Closes: https://gitlab.gnome.org/GNOME/gnome-shell/issues/1804
2019-10-24 14:44:40 +02:00
4d47b16d33 shell-app: Respect X-KDE-RunOnDiscreteGpu when launching apps
If whether to launch on the discrete GPU or the integrated one isn't
passed down to us, check whether the application prefers to be launched
on the discrete GPU.

See: https://gitlab.gnome.org/GNOME/gnome-shell/issues/1804
2019-10-24 14:44:40 +02:00
6526e9edf6 appDisplay: Remove unimplemented 'activate-discrete-gpu'
It was added in commit 009d021 but not advertised, and likely not used
by an application since then.

See: https://gitlab.gnome.org/GNOME/gnome-shell/issues/1804
2019-10-24 14:22:51 +02:00
055c007ac2 dnd: Skip drag target when its acceptDrop() throws an exception
In the case of bugs in a drag target's acceptDrop() function, it may
throw an exception. In the previous code, this would break out of the
loop entirely and never cancel the drag, so the mouse button release
event would be ignored and you would have to press Esc to get out of the
drag.

In this change, if acceptDrop() throws an exception, we log it and move
on to the next parent target instead.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/777
2019-10-22 18:08:10 -07:00
43cf466d09 js: Replace Clutter.Actor.get_allocation_geometry()
The function was deprecated and has now been dropped from mutter.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/776
2019-10-21 18:41:35 +02:00
6965781d59 st: Use clutter_actor_pick() in pick
Use the new function to perform picking and avoid
going through any painting-related code paths.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/773
2019-10-21 13:53:56 +00:00
80680803aa Update Persian translation 2019-10-19 15:16:39 +00:00
51601f3ead Update shotwell desktop file name references
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/774
2019-10-18 16:50:57 +02:00
b25a73c243 authPrompt: Wiggle on failure
Add a wiggle effect to the password entry on failure. The
parameters are set as per design review during GNOME Shell
Hackfest 2019.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/768
2019-10-18 11:25:45 +00:00
d0690c3952 util: Add wiggle helper
Add Util.wiggle(), which accepts the wiggle offset, duration,
and number of times, as parameters.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/768
2019-10-18 11:25:45 +00:00
f2466caef3 environment: Parse repeat-count and auto-reverse
Those are two useful ClutterTimeline properties and
will be needed for wiggling the search entry when
failing the password.

Add support for passing repeat-count and auto-reverse
to ClutterActor.ease and ClutterActor.ease_property.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/768
2019-10-18 11:25:45 +00:00
b1d22d2058 search: Drop SearchResultInterface again
It adds a significant cost to AppIcons which are used
 - quite a log (depending on installed apps)
 - in preformance-sensitive contexts (spring animation)

Just rely on duck typing and revert 91a5133116.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1799
2019-10-17 15:56:07 +00:00
6f7e5976e2 Update Friulian translation 2019-10-17 13:54:18 +00:00
29543f369f Update Croatian translation 2019-10-17 12:08:58 +00:00
a144a1c76d workspace: Use graphene instead of clutter
This was forgotten after the graphene type port landed.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/770
2019-10-17 11:31:59 +02:00
d91927674d workspace: Sort windows in overview grid using cached center
When accessing properties on ClutterActor for size and position there is
a notable access time overhead. This overhead adds considerable user lag
when opening the overview if many windows are open.

This is primarily due to these properties being accessed while sorting
WindowClone instances by their window's center for placement in the
overview. By pre-computing this center value only once when
initializing WindowClone, the induced lag can be significantly reduced.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/763
2019-10-17 07:27:59 +00:00
d12cd12e1b ci: Make run-eslint more convenient for local use
The script can be helpful outside of CI, in particular for gradually
transitioning to the new style.

Reverting commit f00201fa6c it is already possible to do something
like

 $ CI_MERGE_REQUEST_PROJECT_URL=https://gitlab.gnome.org/GNOME/gnome-shell \
   CI_MERGE_REQUEST_TARGET_BRANCH_NAME=master CI_COMMIT_SHA=HEAD \
   .gitlab-ci/run-eslint.sh

but that is hardly convenient.

Instead, allow passing the required parameters on the command line:

 $ .gitlab-ci/run-eslint.sh origin master

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/730
2019-10-16 15:37:12 +00:00
caa50dc1a3 ci: Ensure eslint output exists
We are a long time away from an error-free eslint run,
but when we get there eventually, let's not trip over
non-existent files ...

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/730
2019-10-16 15:37:12 +00:00
19 changed files with 1011 additions and 861 deletions

View File

@ -16,8 +16,14 @@ run_eslint() {
ARGS_LEGACY='--config lint/eslintrc-legacy.json'
local extra_args=ARGS_$1
local output=OUTPUT_$1
eslint -f unix ${!extra_args} -o ${!output} js
local output_var=OUTPUT_$1
local output=${!output_var}
# ensure output exists even if eslint doesn't report any errors
mkdir -p $(dirname $output)
touch $output
eslint -f unix ${!extra_args} -o $output js
}
list_commit_range_additions() {
@ -70,10 +76,13 @@ create_common() {
# non-legacy style just yet ...
unset CI_MERGE_REQUEST_TARGET_BRANCH_NAME
if [ "$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" ]; then
git fetch $CI_MERGE_REQUEST_PROJECT_URL.git $CI_MERGE_REQUEST_TARGET_BRANCH_NAME
REMOTE=${1:-$CI_MERGE_REQUEST_PROJECT_URL.git}
BRANCH_NAME=${2:-$CI_MERGE_REQUEST_TARGET_BRANCH_NAME}
if [ "$BRANCH_NAME" ]; then
git fetch $REMOTE $BRANCH_NAME
branch_point=$(git merge-base HEAD FETCH_HEAD)
commit_range=$branch_point...$CI_COMMIT_SHA
commit_range=$branch_point...HEAD
list_commit_range_additions $commit_range > $LINE_CHANGES
@ -96,7 +105,7 @@ if ! is_empty $OUTPUT_FINAL; then
fi
# Just show the report and succeed when not testing a MR
if [ -z "$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" ]; then
if [ -z "$BRANCH_NAME" ]; then
exit 0
fi

View File

@ -50,7 +50,7 @@
</description>
</key>
<key name="favorite-apps" type="as">
<default>[ 'epiphany.desktop', 'evolution.desktop', 'rhythmbox.desktop', 'shotwell.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop' ]</default>
<default>[ 'epiphany.desktop', 'evolution.desktop', 'rhythmbox.desktop', 'org.gnome.Shotwell.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop' ]</default>
<summary>List of desktop file IDs for favorite applications</summary>
<description>
The applications corresponding to these identifiers

View File

@ -6,6 +6,7 @@ const { Clutter, GObject, Pango, Shell, St } = imports.gi;
const Animation = imports.ui.animation;
const Batch = imports.gdm.batch;
const GdmUtil = imports.gdm.util;
const Util = imports.misc.util;
const Params = imports.misc.params;
const ShellEntry = imports.ui.shellEntry;
const UserWidget = imports.ui.userWidget;
@ -16,6 +17,10 @@ var DEFAULT_BUTTON_WELL_ANIMATION_TIME = 300;
var MESSAGE_FADE_OUT_ANIMATION_TIME = 500;
const WIGGLE_OFFSET = 6;
const WIGGLE_DURATION = 65;
const N_WIGGLES = 3;
var AuthPromptMode = {
UNLOCK_ONLY: 0,
UNLOCK_OR_LOG_IN: 1
@ -256,6 +261,12 @@ var AuthPrompt = GObject.registerClass({
this.updateSensitivity(canRetry);
this.setActorInDefaultButtonWell(null);
this.verificationStatus = AuthPromptStatus.VERIFICATION_FAILED;
Util.wiggle(this._entry, {
offset: WIGGLE_OFFSET,
duration: WIGGLE_DURATION,
wiggleCount: N_WIGGLES,
});
}
_onVerificationComplete() {

View File

@ -1,7 +1,7 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
/* exported findUrls, spawn, spawnCommandLine, spawnApp, trySpawnCommandLine,
formatTime, formatTimeSpan, createTimeLabel, insertSorted,
makeCloseButton, ensureActorVisibleInScrollView */
makeCloseButton, ensureActorVisibleInScrollView, wiggle */
const { Clutter, Gio, GLib, GObject, Shell, St } = imports.gi;
const Gettext = imports.gettext;
@ -429,3 +429,37 @@ function ensureActorVisibleInScrollView(scrollView, actor) {
duration: SCROLL_TIME
});
}
function wiggle(actor, params) {
params = Params.parse(params, {
offset: 0,
duration: 0,
wiggleCount: 0,
});
actor.translation_x = 0;
// Accelerate before wiggling
actor.ease({
translation_x: -params.offset,
duration: params.duration,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
onComplete: () => {
// Wiggle
actor.ease({
translation_x: params.offset,
duration: params.duration,
mode: Clutter.AnimationMode.LINEAR,
repeatCount: params.wiggleCount,
autoReverse: true,
onComplete: () => {
// Decelerate and return to the original position
actor.ease({
translation_x: 0,
duration: params.duration,
mode: Clutter.AnimationMode.EASE_IN_QUAD,
});
}
});
}
});
}

View File

@ -2045,7 +2045,6 @@ var AppFolderPopup = GObject.registerClass({
var AppIcon = GObject.registerClass({
GTypeName: 'AppDisplay_AppIcon',
Implements: [Search.SearchResultInterface],
Signals: {
'menu-state-changed': { param_types: [GObject.TYPE_BOOLEAN] },
'sync-tooltip': {},
@ -2514,13 +2513,15 @@ var AppIconMenu = class AppIconMenu extends PopupMenu.PopupMenu {
this._appendSeparator();
}
let wantsDiscreteGpu = appInfo.get_boolean("PreferRunOnDiscreteGPU") ||
appInfo.get_boolean("X-KDE-RunOnDiscreteGpu");
if (discreteGpuAvailable &&
this._source.app.state == Shell.AppState.STOPPED &&
!actions.includes('activate-discrete-gpu')) {
!wantsDiscreteGpu &&
this._source.app.state == Shell.AppState.STOPPED) {
this._onDiscreteGpuMenuItem = this._appendMenuItem(_("Launch using Dedicated Graphics Card"));
this._onDiscreteGpuMenuItem.connect('activate', () => {
this._source.animateLaunch();
this._source.app.launch(0, -1, true);
this._source.app.launch(0, -1, Shell.AppGpuSelection.DISCRETE);
this.emit('activate-window', null);
});
}
@ -2529,8 +2530,7 @@ var AppIconMenu = class AppIconMenu extends PopupMenu.PopupMenu {
let action = actions[i];
let item = this._appendMenuItem(appInfo.get_action_name(action));
item.connect('activate', (emitter, event) => {
if (action == 'new-window' ||
action == 'activate-discrete-gpu')
if (action == 'new-window')
this._source.animateLaunch();
this._source.app.launch_action(action, event.get_time(), -1);

View File

@ -55,6 +55,7 @@ const RENAMED_DESKTOP_IDS = {
'org.gnome.taquin.desktop': 'org.gnome.Taquin.desktop',
'org.gnome.Weather.Application.desktop': 'org.gnome.Weather.desktop',
'polari.desktop': 'org.gnome.Polari.desktop',
'shotwell.desktop': 'org.gnome.Shotwell.desktop',
'tali.desktop': 'org.gnome.Tali.desktop',
'totem.desktop': 'org.gnome.Totem.desktop',
'evince.desktop': 'org.gnome.Evince.desktop',

View File

@ -573,11 +573,15 @@ var _Draggable = class _Draggable {
while (target) {
if (target._delegate && target._delegate.acceptDrop) {
let [r_, targX, targY] = target.transform_stage_point(dropX, dropY);
if (target._delegate.acceptDrop(this.actor._delegate,
this._dragActor,
targX,
targY,
event.get_time())) {
let accepted = false;
try {
accepted = target._delegate.acceptDrop(this.actor._delegate,
this._dragActor, targX, targY, event.get_time());
} catch (e) {
// On error, skip this target
logError(e, "Skipping drag target");
}
if (accepted) {
// If it accepted the drop without taking the actor,
// handle it ourselves.
if (this._dragActor && this._dragActor.get_parent() == Main.uiGroup) {

View File

@ -105,6 +105,16 @@ function _easeActor(actor, params) {
actor.set_easing_delay(params.delay);
delete params.delay;
let repeatCount = 0;
if (params.repeatCount != undefined)
repeatCount = params.repeatCount;
delete params.repeatCount;
let autoReverse = false;
if (params.autoReverse != undefined)
autoReverse = params.autoReverse;
delete params.autoReverse;
if (params.mode != undefined)
actor.set_easing_mode(params.mode);
delete params.mode;
@ -127,10 +137,12 @@ function _easeActor(actor, params) {
else
Meta.disable_unredirect_for_display(global.display);
if (transition)
if (transition) {
transition.set({ repeatCount, autoReverse });
transition.connect('stopped', (t, finished) => callback(finished));
else
} else {
callback(true);
}
}
function _easeActorProperty(actor, propName, target, params) {
@ -143,6 +155,16 @@ function _easeActorProperty(actor, propName, target, params) {
params.duration = adjustAnimationTime(params.duration);
let duration = Math.floor(params.duration || 0);
let repeatCount = 0;
if (params.repeatCount != undefined)
repeatCount = params.repeatCount;
delete params.repeatCount;
let autoReverse = false;
if (params.autoReverse != undefined)
autoReverse = params.autoReverse;
delete params.autoReverse;
// Copy Clutter's behavior for implicit animations, see
// should_skip_implicit_transition()
if (actor instanceof Clutter.Actor && !actor.mapped)
@ -168,7 +190,9 @@ function _easeActorProperty(actor, propName, target, params) {
let transition = new Clutter.PropertyTransition(Object.assign({
property_name: propName,
interval: new Clutter.Interval({ value_type: pspec.value_type }),
remove_on_complete: true
remove_on_complete: true,
repeat_count: repeatCount,
auto_reverse: autoReverse,
}, params));
actor.add_transition(propName, transition);

View File

@ -477,16 +477,16 @@ class RedBorderEffect extends Clutter.Effect {
color.init_from_4ub(0xff, 0, 0, 0xc4);
Cogl.set_source_color(color);
let geom = actor.get_allocation_geometry();
let alloc = actor.get_allocation_box();
let width = 2;
// clockwise order
Cogl.rectangle(0, 0, geom.width, width);
Cogl.rectangle(geom.width - width, width,
geom.width, geom.height);
Cogl.rectangle(0, geom.height,
geom.width - width, geom.height - width);
Cogl.rectangle(0, geom.height - width,
Cogl.rectangle(0, 0, alloc.get_width(), width);
Cogl.rectangle(alloc.get_width() - width, width,
alloc.get_width(), alloc.get_height());
Cogl.rectangle(0, alloc.get_height(),
alloc.get_width() - width, alloc.get_height() - width);
Cogl.rectangle(0, alloc.get_height() - width,
width, width);
}
});

View File

@ -1,5 +1,5 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
/* exported SearchResultsView, SearchResultInterface */
/* exported SearchResultsView */
const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
@ -32,17 +32,8 @@ class MaxWidthBox extends St.BoxLayout {
}
});
var SearchResultInterface = GObject.registerClass({
Requires: [Clutter.Actor],
}, class SearchResultInterface extends GObject.Interface {
activate() {
throw new GObject.NotImplementedError('activate in %s'.format(this.constructor.name));
}
});
var SearchResult = GObject.registerClass({
Implements: [SearchResultInterface]
}, class SearchResult extends St.Button {
var SearchResult = GObject.registerClass(
class SearchResult extends St.Button {
_init(provider, metaInfo, resultsView) {
this.provider = provider;
this.metaInfo = metaInfo;
@ -253,8 +244,6 @@ var SearchResultsBase = GObject.registerClass({
metasNeeded.forEach((resultId, i) => {
let meta = metas[i];
let display = this._createResultDisplay(meta);
if (!(display instanceof SearchResultInterface))
throw new Error(`${display} is not a valid search result`);
display.connect('key-focus-in', this._keyFocusIn.bind(this));
this._resultDisplays[resultId] = display;
});

View File

@ -1,7 +1,8 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
/* exported Workspace */
const { Atk, Clutter, GLib, GObject, Meta, Pango, Shell, St } = imports.gi;
const { Atk, Clutter, GLib, GObject,
Graphene, Meta, Pango, Shell, St } = imports.gi;
const Signals = imports.signals;
const DND = imports.ui.dnd;
@ -158,6 +159,8 @@ var WindowClone = GObject.registerClass({
this.x = this._boundingBox.x;
this.y = this._boundingBox.y;
this._computeWindowCenter();
let clickAction = new Clutter.ClickAction();
clickAction.connect('clicked', this._onClicked.bind(this));
clickAction.connect('long-press', this._onLongPress.bind(this));
@ -293,6 +296,18 @@ var WindowClone = GObject.registerClass({
this.layout_manager.boundingBox = rect;
}
get windowCenter() {
return this._windowCenter;
}
_computeWindowCenter() {
let box = this.realWindow.get_allocation_box();
this._windowCenter = new Graphene.Point({
x: box.get_x() + box.get_width() / 2,
y: box.get_y() + box.get_height() / 2,
});
}
// Find the actor just below us, respecting reparenting done by DND code
getActualStackAbove() {
if (this._stackAbove == null)
@ -1017,11 +1032,7 @@ var UnalignedLayoutStrategy = class extends LayoutStrategy {
_sortRow(row) {
// Sort windows horizontally to minimize travel distance.
// This affects in what order the windows end up in a row.
row.windows.sort((a, b) => {
let aCenter = a.realWindow.x + a.realWindow.width / 2;
let bCenter = b.realWindow.x + b.realWindow.width / 2;
return aCenter - bCenter;
});
row.windows.sort((a, b) => a.windowCenter.x - b.windowCenter.x);
}
computeLayout(windows, layout) {
@ -1040,11 +1051,7 @@ var UnalignedLayoutStrategy = class extends LayoutStrategy {
// Sort windows vertically to minimize travel distance.
// This affects what rows the windows get placed in.
let sortedWindows = windows.slice();
sortedWindows.sort((a, b) => {
let aCenter = a.realWindow.y + a.realWindow.height / 2;
let bCenter = b.realWindow.y + b.realWindow.height / 2;
return aCenter - bCenter;
});
sortedWindows.sort((a, b) => a.windowCenter.y - b.windowCenter.y);
let windowIdx = 0;
for (let i = 0; i < numRows; i++) {

980
po/fa.po

File diff suppressed because it is too large Load Diff

100
po/fur.po
View File

@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: video-subtitles master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2019-09-17 11:44+0000\n"
"PO-Revision-Date: 2019-09-26 16:19+0200\n"
"POT-Creation-Date: 2019-10-12 20:48+0000\n"
"PO-Revision-Date: 2019-10-17 15:53+0200\n"
"Last-Translator: Fabio Tomat <f.t.public@gmail.com>\n"
"Language-Team: Friulian <fur@li.org>\n"
"Language: fur\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.2.3\n"
"X-Generator: Poedit 2.2.4\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: data/50-gnome-shell-system.xml:6
@ -467,7 +467,7 @@ msgid "Next"
msgstr "Indenant"
#: js/gdm/authPrompt.js:197 js/ui/shellMountOperation.js:396
#: js/ui/unlockDialog.js:42
#: js/ui/unlockDialog.js:45
msgid "Unlock"
msgstr "Sbloche"
@ -497,8 +497,8 @@ msgstr "(p.e., utent o %s)"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: js/gdm/loginDialog.js:884 js/ui/components/networkAgent.js:247
#: js/ui/components/networkAgent.js:267 js/ui/components/networkAgent.js:285
#: js/gdm/loginDialog.js:884 js/ui/components/networkAgent.js:248
#: js/ui/components/networkAgent.js:268 js/ui/components/networkAgent.js:286
msgid "Username: "
msgstr "Non utent: "
@ -760,32 +760,32 @@ msgstr "Dispès"
msgid "All"
msgstr "Dutis"
#: js/ui/appDisplay.js:1749
#: js/ui/appDisplay.js:1745
msgid "Rename"
msgstr "Cambie non"
#. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2397 js/ui/panel.js:76
#: js/ui/appDisplay.js:2418 js/ui/panel.js:76
msgid "Open Windows"
msgstr "Barcons vierts"
#: js/ui/appDisplay.js:2416 js/ui/panel.js:83
#: js/ui/appDisplay.js:2437 js/ui/panel.js:83
msgid "New Window"
msgstr "Gnûf barcon"
#: js/ui/appDisplay.js:2428
#: js/ui/appDisplay.js:2449
msgid "Launch using Dedicated Graphics Card"
msgstr "Invie doprant une schede grafiche dedicade"
#: js/ui/appDisplay.js:2457 js/ui/dash.js:239
#: js/ui/appDisplay.js:2478 js/ui/dash.js:239
msgid "Remove from Favorites"
msgstr "Gjave dai preferîts"
#: js/ui/appDisplay.js:2463
#: js/ui/appDisplay.js:2484
msgid "Add to Favorites"
msgstr "Zonte tai preferîts"
#: js/ui/appDisplay.js:2473 js/ui/panel.js:94
#: js/ui/appDisplay.js:2494 js/ui/panel.js:94
msgid "Show Details"
msgstr "Mostre Detais"
@ -1017,34 +1017,34 @@ msgid "Connect"
msgstr "Conet"
#. Cisco LEAP
#: js/ui/components/networkAgent.js:216 js/ui/components/networkAgent.js:228
#: js/ui/components/networkAgent.js:250 js/ui/components/networkAgent.js:269
#: js/ui/components/networkAgent.js:289 js/ui/components/networkAgent.js:299
#: js/ui/components/networkAgent.js:217 js/ui/components/networkAgent.js:229
#: js/ui/components/networkAgent.js:251 js/ui/components/networkAgent.js:270
#: js/ui/components/networkAgent.js:290 js/ui/components/networkAgent.js:300
msgid "Password: "
msgstr "Password: "
#. static WEP
#: js/ui/components/networkAgent.js:221
#: js/ui/components/networkAgent.js:222
msgid "Key: "
msgstr "Clâf: "
#: js/ui/components/networkAgent.js:253 js/ui/components/networkAgent.js:275
#: js/ui/components/networkAgent.js:254 js/ui/components/networkAgent.js:276
msgid "Private key password: "
msgstr "Password di clâf privade: "
#: js/ui/components/networkAgent.js:273
#: js/ui/components/networkAgent.js:274
msgid "Identity: "
msgstr "Identitât: "
#: js/ui/components/networkAgent.js:287
#: js/ui/components/networkAgent.js:288
msgid "Service: "
msgstr "Servizi: "
#: js/ui/components/networkAgent.js:316 js/ui/components/networkAgent.js:691
#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:692
msgid "Authentication required by wireless network"
msgstr "La rêt cence fîl e domande autenticazion"
#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:692
#: js/ui/components/networkAgent.js:318 js/ui/components/networkAgent.js:693
#, javascript-format
msgid ""
"Passwords or encryption keys are required to access the wireless network "
@ -1053,41 +1053,41 @@ msgstr ""
"Si scugne meti une password o une clâf di cifradure par jentrâ te rêt cence "
"fîl \"%s\"."
#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:696
#: js/ui/components/networkAgent.js:322 js/ui/components/networkAgent.js:697
msgid "Wired 802.1X authentication"
msgstr "Autenticazion vie fîl 802.1X"
#: js/ui/components/networkAgent.js:323
#: js/ui/components/networkAgent.js:324
msgid "Network name: "
msgstr "Non rêt: "
#: js/ui/components/networkAgent.js:328 js/ui/components/networkAgent.js:700
#: js/ui/components/networkAgent.js:329 js/ui/components/networkAgent.js:701
msgid "DSL authentication"
msgstr "Autenticazion DSL"
#: js/ui/components/networkAgent.js:335 js/ui/components/networkAgent.js:705
#: js/ui/components/networkAgent.js:336 js/ui/components/networkAgent.js:706
msgid "PIN code required"
msgstr "Si pretint un codiç PIN"
#: js/ui/components/networkAgent.js:336 js/ui/components/networkAgent.js:706
#: js/ui/components/networkAgent.js:337 js/ui/components/networkAgent.js:707
msgid "PIN code is needed for the mobile broadband device"
msgstr "Si scugne meti un codiç PIN pal dispositîf a bande largje mobil"
#: js/ui/components/networkAgent.js:337
#: js/ui/components/networkAgent.js:338
msgid "PIN: "
msgstr "PIN: "
#: js/ui/components/networkAgent.js:344 js/ui/components/networkAgent.js:712
#: js/ui/components/networkAgent.js:345 js/ui/components/networkAgent.js:713
msgid "Mobile broadband network password"
msgstr "Passowrd rêt mobil a bande largje"
#: js/ui/components/networkAgent.js:345 js/ui/components/networkAgent.js:697
#: js/ui/components/networkAgent.js:701 js/ui/components/networkAgent.js:713
#: js/ui/components/networkAgent.js:346 js/ui/components/networkAgent.js:698
#: js/ui/components/networkAgent.js:702 js/ui/components/networkAgent.js:714
#, javascript-format
msgid "A password is required to connect to “%s”."
msgstr "A covente une password par tacâsi a '%s'."
#: js/ui/components/networkAgent.js:680 js/ui/status/network.js:1675
#: js/ui/components/networkAgent.js:681 js/ui/status/network.js:1675
msgid "Network Manager"
msgstr "Ministradôr di rêt"
@ -1475,6 +1475,26 @@ msgstr "Viôt sorzint"
msgid "Web Page"
msgstr "Pagjine Web"
#: js/ui/main.js:267
msgid "Logged in as a privileged user"
msgstr "Jentre come utent privilegjât"
#: js/ui/main.js:268
msgid ""
"Running a session as a privileged user should be avoided for security "
"reasons. If possible, you should log in as a normal user."
msgstr ""
"Si varès di evitâ di eseguî une session come utent privilegjât par resons di "
"sigurece. Se pussibil, tu varessis di jentrâ come utent normâl."
#: js/ui/main.js:274
msgid "Screen Lock disabled"
msgstr "Bloc dal schermi disabilitât"
#: js/ui/main.js:275
msgid "Screen Locking requires the GNOME display manager."
msgstr "Il bloc dal schermi al à bisugne dal gjestôr dai visôrs di GNOME."
#: js/ui/messageTray.js:1465
msgid "System Information"
msgstr "Informazion di sisteme"
@ -2219,11 +2239,11 @@ msgstr "Dome esterni"
msgid "Built-in Only"
msgstr "Dome incorporât"
#: js/ui/unlockDialog.js:50
#: js/ui/unlockDialog.js:53
msgid "Log in as another user"
msgstr "Jentre come altri utent"
#: js/ui/unlockDialog.js:67
#: js/ui/unlockDialog.js:70
msgid "Unlock Window"
msgstr "Sbloche barcon"
@ -2266,7 +2286,7 @@ msgstr[1] ""
#. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height.
#: js/ui/windowManager.js:683
#: js/ui/windowManager.js:686
#, javascript-format
msgid "%d × %d"
msgstr "%d × %d"
@ -2350,7 +2370,7 @@ msgstr ""
#: src/extensions-tool/command-create.c:192 src/extensions-tool/main.c:169
msgid "Name"
msgstr "Non "
msgstr "Non"
#: src/extensions-tool/command-create.c:203
#, c-format
@ -2604,7 +2624,7 @@ msgstr "Comants:"
msgid "Print help"
msgstr "Stampe jutori"
#: src/extensions-tool/main.c:248 src/main.c:468
#: src/extensions-tool/main.c:248 src/main.c:460
msgid "Print version"
msgstr "Stampe version"
@ -2653,15 +2673,15 @@ msgstr "Instale complès di estensions"
msgid "Use “%s” to get detailed help.\n"
msgstr "Dopre “%s” par vê un jutori detaiât.\n"
#: src/main.c:474
#: src/main.c:466
msgid "Mode used by GDM for login screen"
msgstr "Modalitât doprade da GDM pe videade di acès"
#: src/main.c:480
#: src/main.c:472
msgid "Use a specific mode, e.g. “gdm” for login screen"
msgstr "Dopre une modalitât specifiche, par esempli “gdm” pe videade di acès"
#: src/main.c:486
#: src/main.c:478
msgid "List possible modes"
msgstr "Liste modalitâts pussibilis"

524
po/hr.po

File diff suppressed because it is too large Load Diff

View File

@ -509,7 +509,7 @@ shell_app_activate_full (ShellApp *app,
case SHELL_APP_STATE_STOPPED:
{
GError *error = NULL;
if (!shell_app_launch (app, timestamp, workspace, FALSE, &error))
if (!shell_app_launch (app, timestamp, workspace, SHELL_APP_GPU_SELECTION_AUTO, &error))
{
char *msg;
msg = g_strdup_printf (_("Failed to launch “%s”"), shell_app_get_name (app));
@ -584,7 +584,7 @@ shell_app_open_new_window (ShellApp *app,
* instance (Firefox). There are a few less-sensical cases such
* as say Pidgin.
*/
shell_app_launch (app, 0, workspace, FALSE, NULL);
shell_app_launch (app, 0, workspace, SHELL_APP_GPU_SELECTION_AUTO, NULL);
}
/**
@ -1255,19 +1255,37 @@ wait_pid (GDesktopAppInfo *appinfo,
g_child_watch_add (pid, (GChildWatchFunc) g_spawn_close_pid, NULL);
}
static gboolean
get_with_discrete_gpu (ShellApp *app,
ShellAppGpuSelection discrete_gpu)
{
switch (discrete_gpu)
{
case SHELL_APP_GPU_SELECTION_INTEGRATED:
return FALSE;
case SHELL_APP_GPU_SELECTION_DISCRETE:
return TRUE;
case SHELL_APP_GPU_SELECTION_AUTO:
return g_desktop_app_info_get_boolean (app->info, "PreferRunOnDiscreteGPU") ||
g_desktop_app_info_get_boolean (app->info, "X-KDE-RunOnDiscreteGpu");
default:
g_assert_not_reached();
}
}
/**
* shell_app_launch:
* @timestamp: Event timestamp, or 0 for current event timestamp
* @workspace: Start on this workspace, or -1 for default
* @discrete_gpu: Whether to start on the discrete GPU
* @discrete_gpu: the preferred GPU to launch the application on.
* @error: A #GError
*/
gboolean
shell_app_launch (ShellApp *app,
guint timestamp,
int workspace,
gboolean discrete_gpu,
GError **error)
shell_app_launch (ShellApp *app,
guint timestamp,
int workspace,
ShellAppGpuSelection discrete_gpu,
GError **error)
{
ShellGlobal *global;
GAppLaunchContext *context;
@ -1289,8 +1307,13 @@ shell_app_launch (ShellApp *app,
global = shell_global_get ();
context = shell_global_create_app_launch_context (global, timestamp, workspace);
if (discrete_gpu)
g_app_launch_context_setenv (context, "DRI_PRIME", "1");
/* FIXME: this should probably check whether we're on a dual-GPU system */
if (get_with_discrete_gpu (app, discrete_gpu))
{
g_app_launch_context_setenv (context, "DRI_PRIME", "1");
g_app_launch_context_setenv (context, "__NV_PRIME_RENDER_OFFLOAD", "1");
g_app_launch_context_setenv (context, "__GLX_VENDOR_LIBRARY_NAME", "nvidia");
}
/* Set LEAVE_DESCRIPTORS_OPEN in order to use an optimized gspawn
* codepath. The shell's open file descriptors should be marked CLOEXEC

View File

@ -18,6 +18,12 @@ typedef enum {
SHELL_APP_STATE_RUNNING
} ShellAppState;
typedef enum {
SHELL_APP_GPU_SELECTION_AUTO = -1,
SHELL_APP_GPU_SELECTION_INTEGRATED = 0,
SHELL_APP_GPU_SELECTION_DISCRETE = 1
} ShellAppGpuSelection;
const char *shell_app_get_id (ShellApp *app);
GDesktopAppInfo *shell_app_get_app_info (ShellApp *app);
@ -51,11 +57,11 @@ GSList *shell_app_get_pids (ShellApp *app);
gboolean shell_app_is_on_workspace (ShellApp *app, MetaWorkspace *workspace);
gboolean shell_app_launch (ShellApp *app,
guint timestamp,
int workspace,
gboolean discrete_gpu,
GError **error);
gboolean shell_app_launch (ShellApp *app,
guint timestamp,
int workspace,
ShellAppGpuSelection discrete_gpu,
GError **error);
void shell_app_launch_action (ShellApp *app,
const char *action_name,

View File

@ -489,7 +489,7 @@ st_box_layout_pick (ClutterActor *actor)
for (child = clutter_actor_get_first_child (actor);
child != NULL;
child = clutter_actor_get_next_sibling (child))
clutter_actor_paint (child);
clutter_actor_pick (child);
if (priv->hadjustment || priv->vadjustment)
cogl_framebuffer_pop_clip (fb);

View File

@ -302,11 +302,11 @@ st_scroll_view_pick (ClutterActor *actor)
CLUTTER_ACTOR_CLASS (st_scroll_view_parent_class)->pick (actor);
if (priv->child)
clutter_actor_paint (priv->child);
clutter_actor_pick (priv->child);
if (priv->hscrollbar_visible)
clutter_actor_paint (priv->hscroll);
clutter_actor_pick (priv->hscroll);
if (priv->vscrollbar_visible)
clutter_actor_paint (priv->vscroll);
clutter_actor_pick (priv->vscroll);
}
static gboolean

View File

@ -36,16 +36,16 @@ function test() {
obin.connect_after('paint', actor => {
Cogl.set_source_color4f(0, 1, 0, 1);
let geom = actor.get_allocation_geometry();
let alloc = actor.get_allocation_box();
let width = 3;
// clockwise order
Cogl.rectangle(0, 0, geom.width, width);
Cogl.rectangle(geom.width - width, width,
geom.width, geom.height);
Cogl.rectangle(0, geom.height,
geom.width - width, geom.height - width);
Cogl.rectangle(0, geom.height - width,
Cogl.rectangle(0, 0, alloc.get_width(), width);
Cogl.rectangle(alloc.get_width() - width, width,
alloc.get_width(), alloc.get_height());
Cogl.rectangle(0, alloc.get_height(),
alloc.get_width() - width, alloc.get_height() - width);
Cogl.rectangle(0, alloc.get_height() - width,
width, width);
});
tbox.add(obin);