Compare commits
32 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
eee341e907 | ||
|
|
aad96bb1c4 | ||
|
|
50d3ee5703 | ||
|
|
08dfb78815 | ||
|
|
6949a5d075 | ||
|
|
893d3b0473 | ||
|
|
f5128e13f2 | ||
|
|
8318ea919f | ||
|
|
bde20e78f0 | ||
|
|
02db9525e7 | ||
|
|
8d4586bd57 | ||
|
|
8872659621 | ||
|
|
46c7677643 | ||
|
|
4b9f4b1b63 | ||
|
|
b64c93897b | ||
|
|
a7939f18d1 | ||
|
|
15efbc29be | ||
|
|
6e5466a4ec | ||
|
|
737c897624 | ||
|
|
c317a876dd | ||
|
|
72c67aacc4 | ||
|
|
ba7e3fc0b5 | ||
|
|
61cf679b8c | ||
|
|
ba55bacab4 | ||
|
|
9445bd2205 | ||
|
|
6ed1f45ffd | ||
|
|
81be1d2e2f | ||
|
|
52abf74088 | ||
|
|
623bc6dbf3 | ||
|
|
04b23ec68f | ||
|
|
b65f362f0d | ||
|
|
7c30f35b12 |
@@ -1,33 +1,81 @@
|
||||
image: registry.gitlab.gnome.org/gnome/gnome-shell/extension-ci:v2
|
||||
include:
|
||||
- remote: "https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/8445ff7af2a68795afb98f486251f2ef8f90621c/templates/ci-fairy.yml"
|
||||
|
||||
image: registry.gitlab.gnome.org/gnome/gnome-shell/fedora/33:2020-11-17.0
|
||||
|
||||
stages:
|
||||
- pre_review
|
||||
- review
|
||||
- build
|
||||
|
||||
default:
|
||||
# Cancel jobs if newer commits are pushed to the branch
|
||||
interruptible: true
|
||||
# Auto-retry jobs in case of infra failures
|
||||
retry:
|
||||
max: 1
|
||||
when:
|
||||
- 'runner_system_failure'
|
||||
- 'stuck_or_timeout_failure'
|
||||
- 'scheduler_failure'
|
||||
- 'api_failure'
|
||||
|
||||
variables:
|
||||
LINT_LOG: "eslint-report.txt"
|
||||
LINT_LOG: "eslint-report.xml"
|
||||
JS_LOG: "js-report.txt"
|
||||
|
||||
.only_default: &only_default
|
||||
only:
|
||||
- branches
|
||||
- tags
|
||||
- merge_requests
|
||||
workflow:
|
||||
rules:
|
||||
- if: '$CI_MERGE_REQUEST_IID'
|
||||
- if: '$CI_COMMIT_TAG'
|
||||
- if: '$CI_COMMIT_BRANCH'
|
||||
|
||||
.pipeline_guard: &pipeline_guard
|
||||
rules:
|
||||
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
|
||||
- if: '$CI_COMMIT_TAG'
|
||||
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
|
||||
- if: '$CI_COMMIT_BRANCH =~ /^gnome-[0-9-]+$/'
|
||||
- when: 'manual'
|
||||
|
||||
check_commit_log:
|
||||
image: registry.gitlab.gnome.org/gnome/gjs:fedora.static-analysis
|
||||
stage: review
|
||||
extends:
|
||||
- .fdo.ci-fairy
|
||||
stage: pre_review
|
||||
script:
|
||||
- ./.gitlab-ci/check-commit-log.sh
|
||||
only:
|
||||
- merge_requests
|
||||
<<: *pipeline_guard
|
||||
artifacts:
|
||||
expire_in: 1 week
|
||||
paths:
|
||||
- commit-message-junit-report.xml
|
||||
reports:
|
||||
junit: commit-message-junit-report.xml
|
||||
|
||||
check-merge-request:
|
||||
extends:
|
||||
- .fdo.ci-fairy
|
||||
stage: pre_review
|
||||
script:
|
||||
- if [[ x"$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" != "x" ]] ;
|
||||
then
|
||||
ci-fairy check-merge-request --require-allow-collaboration --junit-xml=check-merge-request-report.xml ;
|
||||
else
|
||||
echo "Not a merge request" ;
|
||||
fi
|
||||
<<: *pipeline_guard
|
||||
artifacts:
|
||||
expire_in: 1 week
|
||||
paths:
|
||||
- check-merge-request-report.xml
|
||||
reports:
|
||||
junit: check-merge-request-report.xml
|
||||
|
||||
js_check:
|
||||
stage: review
|
||||
script:
|
||||
- find extensions -name '*.js' -exec js68 -c -s '{}' ';' 2>&1 | tee $JS_LOG
|
||||
- find extensions -name '*.js' -exec js78 -c '{}' ';' 2>&1 | tee $JS_LOG
|
||||
- (! grep -q . $JS_LOG)
|
||||
<<: *only_default
|
||||
artifacts:
|
||||
paths:
|
||||
- ${JS_LOG}
|
||||
@@ -36,18 +84,18 @@ js_check:
|
||||
eslint:
|
||||
stage: review
|
||||
script:
|
||||
- eslint -o $LINT_LOG extensions --no-color || { cat $LINT_LOG; false; }
|
||||
<<: *only_default
|
||||
- eslint -o $LINT_LOG -f junit extensions
|
||||
artifacts:
|
||||
paths:
|
||||
- ${LINT_LOG}
|
||||
when: on_failure
|
||||
reports:
|
||||
junit: ${LINT_LOG}
|
||||
|
||||
build-bundles:
|
||||
stage: build
|
||||
needs: ["check_commit_log"]
|
||||
script:
|
||||
- ./export-zips.sh
|
||||
<<: *only_default
|
||||
artifacts:
|
||||
name: 'Extension bundles'
|
||||
expose_as: 'Get Extension bundles here'
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
if [ -z "$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" ]; then
|
||||
echo Cannot review non-merge request
|
||||
exit 1
|
||||
echo This is not a merge request, skipping
|
||||
exit 0
|
||||
fi
|
||||
|
||||
git fetch $CI_MERGE_REQUEST_PROJECT_URL.git $CI_MERGE_REQUEST_TARGET_BRANCH_NAME
|
||||
@@ -16,16 +16,59 @@ if [ -z "$commits" ]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
function commit_message_has_url() {
|
||||
JUNIT_REPORT_TESTS_FILE=$(mktemp)
|
||||
|
||||
function append_failed_test_case() {
|
||||
test_name="$1"
|
||||
commit="$2"
|
||||
test_message="$3"
|
||||
commit_short=${commit:0:8}
|
||||
|
||||
echo "<testcase name=\"$test_name: $commit_short\"><failure message=\"$commit_short: $test_message\"/></testcase>" >> $JUNIT_REPORT_TESTS_FILE
|
||||
echo &>2 "Commit check failed: $commit_short: $test_message"
|
||||
}
|
||||
|
||||
function append_passed_test_case() {
|
||||
test_name="$1"
|
||||
commit="$2"
|
||||
commit_short=${commit:0:8}
|
||||
echo "<testcase name=\"$test_name: $commit_short\"></testcase>" >> $JUNIT_REPORT_TESTS_FILE
|
||||
}
|
||||
|
||||
function generate_junit_report() {
|
||||
junit_report_file="$1"
|
||||
num_tests=$(cat "$JUNIT_REPORT_TESTS_FILE" | wc -l)
|
||||
num_failures=$(grep '<failure />' "$JUNIT_REPORT_TESTS_FILE" | wc -l )
|
||||
|
||||
echo Generating JUnit report \"$(pwd)/$junit_report_file\" with $num_tests tests and $num_failures failures.
|
||||
|
||||
cat > $junit_report_file << __EOF__
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<testsuites tests="$num_tests" errors="0" failures="$num_failures">
|
||||
<testsuite name="commit-review" tests="$num_tests" errors="0" failures="$num_failures" skipped="0">
|
||||
$(< $JUNIT_REPORT_TESTS_FILE)
|
||||
</testsuite>
|
||||
</testsuites>
|
||||
__EOF__
|
||||
}
|
||||
|
||||
function commit_message_has_mr_url() {
|
||||
commit=$1
|
||||
commit_message=$(git show -s --format='format:%b' $commit)
|
||||
echo "$commit_message" | grep -qe "\($CI_MERGE_REQUEST_PROJECT_URL/\(-/\)\?\(issues\|merge_requests\)/[0-9]\+\|https://bugzilla.gnome.org/show_bug.cgi?id=[0-9]\+\)"
|
||||
echo "$commit_message" | grep -qe "^$CI_MERGE_REQUEST_PROJECT_URL\/\(-\/\)\?merge_requests\/$CI_MERGE_REQUEST_IID$"
|
||||
return $?
|
||||
}
|
||||
|
||||
for commit in $commits; do
|
||||
if ! commit_message_has_url $commit; then
|
||||
echo "Missing merge request or issue URL on commit $(echo $commit | cut -c -8)"
|
||||
exit 1
|
||||
if commit_message_has_mr_url $commit; then
|
||||
append_failed_test_case superfluous_url $commit \
|
||||
"Commit message must not contain a link to its own merge request"
|
||||
else
|
||||
append_passed_test_case superfluous_url $commit
|
||||
fi
|
||||
done
|
||||
|
||||
generate_junit_report commit-message-junit-report.xml
|
||||
|
||||
! grep -q '<failure' commit-message-junit-report.xml
|
||||
exit $?
|
||||
|
||||
18
NEWS
18
NEWS
@@ -1,3 +1,21 @@
|
||||
40.alpha
|
||||
========
|
||||
* window-list: Honor changes in skip-taskbar property [Sergio; !130]
|
||||
* window-list, workspace-indicator: Adjust to 3.38 changes [Florian; !133]
|
||||
* window-list, workspace-indicator: Improve previews in workspace thumbs
|
||||
[Florian; #260, !142]
|
||||
* auto-move: Improve behavior on multi-monitor setups [Florian; !135]
|
||||
* windowNavigator: Adjust to 3.38 changes [Thun; #259]
|
||||
* Misc. bug fixes and cleanups [Florian, Jonas Å, Jordan, Ray; !131, !136,
|
||||
!137, !140, !141, !144, !146, !145]
|
||||
|
||||
Contributors:
|
||||
Sergio Costas, Florian Müllner, Jordan Petridis, Thun Pin, Ray Strode,
|
||||
Jonas Ådahl
|
||||
|
||||
Translators:
|
||||
Fabio Tomat [fur], Jordi Mas [ca]
|
||||
|
||||
3.38.1
|
||||
======
|
||||
|
||||
|
||||
Submodule data/gnome-shell-sass updated: 940aff8ce7...710fc54a26
@@ -116,10 +116,12 @@ function myCheckWorkspaces() {
|
||||
let keepAliveWorkspaces = [];
|
||||
let foundNonEmpty = false;
|
||||
for (let i = this._workspaces.length - 1; i >= 0; i--) {
|
||||
if (!foundNonEmpty)
|
||||
foundNonEmpty = this._workspaces[i].list_windows().length > 0;
|
||||
else if (!this._workspaces[i]._keepAliveId)
|
||||
if (!foundNonEmpty) {
|
||||
foundNonEmpty = this._workspaces[i].list_windows().some(
|
||||
w => !w.is_on_all_workspaces());
|
||||
} else if (!this._workspaces[i]._keepAliveId) {
|
||||
keepAliveWorkspaces.push(this._workspaces[i]);
|
||||
}
|
||||
}
|
||||
|
||||
// make sure the original method only removes empty workspaces at the end
|
||||
|
||||
@@ -103,7 +103,6 @@ class NaturalLayoutStrategy extends Workspace.LayoutStrategy {
|
||||
direction++;
|
||||
if (direction === 4)
|
||||
direction = 0;
|
||||
|
||||
}
|
||||
|
||||
let loopCounter = 0;
|
||||
|
||||
@@ -486,7 +486,6 @@ var PlacesManager = class {
|
||||
}
|
||||
|
||||
_reloadBookmarks() {
|
||||
|
||||
this._bookmarks = [];
|
||||
|
||||
let content = Shell.get_file_contents_utf8_sync(this._bookmarksFile.get_path());
|
||||
|
||||
@@ -352,6 +352,9 @@ class WindowButton extends BaseButton {
|
||||
super._init(perMonitor, monitorIndex);
|
||||
|
||||
this.metaWindow = metaWindow;
|
||||
this._skipTaskbarId = metaWindow.connect('notify::skip-taskbar', () => {
|
||||
this._updateVisibility();
|
||||
});
|
||||
this._updateVisibility();
|
||||
|
||||
this._windowTitle = new WindowTitle(this.metaWindow);
|
||||
@@ -412,6 +415,7 @@ class WindowButton extends BaseButton {
|
||||
|
||||
_onDestroy() {
|
||||
super._onDestroy();
|
||||
this.metaWindow.disconnect(this._skipTaskbarId);
|
||||
this.metaWindow.disconnect(this._workspaceChangedId);
|
||||
global.display.disconnect(this._notifyFocusId);
|
||||
this._contextMenu.destroy();
|
||||
@@ -608,7 +612,6 @@ class AppButton extends BaseButton {
|
||||
this._contextMenuManager.addMenu(this._appContextMenu);
|
||||
this.label_actor = this._multiWindowTitle.label_actor;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
_onClicked(actor, button) {
|
||||
@@ -783,9 +786,9 @@ class WindowList extends St.Widget {
|
||||
});
|
||||
|
||||
this._dragBeginId = Main.xdndHandler.connect('drag-begin',
|
||||
this._onDragBegin.bind(this));
|
||||
this._monitorDrag.bind(this));
|
||||
this._dragEndId = Main.xdndHandler.connect('drag-end',
|
||||
this._onDragEnd.bind(this));
|
||||
this._stopMonitoringDrag.bind(this));
|
||||
this._dragMonitor = {
|
||||
dragMotion: this._onDragMotion.bind(this),
|
||||
};
|
||||
@@ -948,9 +951,6 @@ class WindowList extends St.Widget {
|
||||
}
|
||||
|
||||
_onWindowAdded(ws, win) {
|
||||
if (win.skip_taskbar)
|
||||
return;
|
||||
|
||||
if (!this._grouped)
|
||||
this._checkGrouping();
|
||||
|
||||
@@ -1016,11 +1016,11 @@ class WindowList extends St.Widget {
|
||||
}
|
||||
}
|
||||
|
||||
_onDragBegin() {
|
||||
_monitorDrag() {
|
||||
DND.addDragMonitor(this._dragMonitor);
|
||||
}
|
||||
|
||||
_onDragEnd() {
|
||||
_stopMonitoringDrag() {
|
||||
DND.removeDragMonitor(this._dragMonitor);
|
||||
this._removeActivateTimeout();
|
||||
}
|
||||
@@ -1094,6 +1094,7 @@ class WindowList extends St.Widget {
|
||||
|
||||
global.display.disconnect(this._fullscreenChangedId);
|
||||
|
||||
this._stopMonitoringDrag();
|
||||
Main.xdndHandler.disconnect(this._dragBeginId);
|
||||
Main.xdndHandler.disconnect(this._dragEndId);
|
||||
|
||||
|
||||
@@ -24,27 +24,14 @@ class WindowPreview extends St.Button {
|
||||
this.connect('destroy', this._onDestroy.bind(this));
|
||||
|
||||
this._sizeChangedId = this._window.connect('size-changed',
|
||||
this._relayout.bind(this));
|
||||
() => this.queue_relayout());
|
||||
this._positionChangedId = this._window.connect('position-changed',
|
||||
this._relayout.bind(this));
|
||||
this._minimizedChangedId = this._window.connect('notify::minimized',
|
||||
this._relayout.bind(this));
|
||||
this._monitorEnteredId = global.display.connect('window-entered-monitor',
|
||||
this._relayout.bind(this));
|
||||
this._monitorLeftId = global.display.connect('window-left-monitor',
|
||||
this._relayout.bind(this));
|
||||
|
||||
// Do initial layout when we get a parent
|
||||
let id = this.connect('parent-set', () => {
|
||||
this.disconnect(id);
|
||||
if (!this.get_parent())
|
||||
return;
|
||||
this._laterId = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => {
|
||||
this._laterId = 0;
|
||||
this._relayout();
|
||||
return false;
|
||||
() => {
|
||||
this._updateVisible();
|
||||
this.queue_relayout();
|
||||
});
|
||||
});
|
||||
this._minimizedChangedId = this._window.connect('notify::minimized',
|
||||
this._updateVisible.bind(this));
|
||||
|
||||
this._focusChangedId = global.display.connect('notify::focus-window',
|
||||
this._onFocusChanged.bind(this));
|
||||
@@ -52,19 +39,15 @@ class WindowPreview extends St.Button {
|
||||
}
|
||||
|
||||
// needed for DND
|
||||
get realWindow() {
|
||||
return this._window.get_compositor_private();
|
||||
get metaWindow() {
|
||||
return this._window;
|
||||
}
|
||||
|
||||
_onDestroy() {
|
||||
this._window.disconnect(this._sizeChangedId);
|
||||
this._window.disconnect(this._positionChangedId);
|
||||
this._window.disconnect(this._minimizedChangedId);
|
||||
global.display.disconnect(this._monitorEnteredId);
|
||||
global.display.disconnect(this._monitorLeftId);
|
||||
global.display.disconnect(this._focusChangedId);
|
||||
if (this._laterId)
|
||||
Meta.later_remove(this._laterId);
|
||||
}
|
||||
|
||||
_onFocusChanged() {
|
||||
@@ -74,26 +57,42 @@ class WindowPreview extends St.Button {
|
||||
this.remove_style_class_name('active');
|
||||
}
|
||||
|
||||
_relayout() {
|
||||
let monitor = Main.layoutManager.findIndexForActor(this);
|
||||
this.visible = monitor === this._window.get_monitor() &&
|
||||
_updateVisible() {
|
||||
const monitor = Main.layoutManager.findIndexForActor(this);
|
||||
const workArea = Main.layoutManager.getWorkAreaForMonitor(monitor);
|
||||
this.visible = this._window.get_frame_rect().overlap(workArea) &&
|
||||
this._window.window_type !== Meta.WindowType.DESKTOP &&
|
||||
this._window.showing_on_its_workspace();
|
||||
}
|
||||
});
|
||||
|
||||
if (!this.visible)
|
||||
return;
|
||||
let WorkspaceLayout = GObject.registerClass(
|
||||
class WorkspaceLayout extends Clutter.LayoutManager {
|
||||
vfunc_get_preferred_width() {
|
||||
return [0, 0];
|
||||
}
|
||||
|
||||
let workArea = Main.layoutManager.getWorkAreaForMonitor(monitor);
|
||||
let hscale = this.get_parent().allocation.get_width() / workArea.width;
|
||||
let vscale = this.get_parent().allocation.get_height() / workArea.height;
|
||||
vfunc_get_preferred_height() {
|
||||
return [0, 0];
|
||||
}
|
||||
|
||||
let frameRect = this._window.get_frame_rect();
|
||||
this.set_size(
|
||||
Math.round(Math.min(frameRect.width, workArea.width) * hscale),
|
||||
Math.round(Math.min(frameRect.height, workArea.height) * vscale));
|
||||
this.set_position(
|
||||
Math.round(frameRect.x * hscale),
|
||||
Math.round(frameRect.y * vscale));
|
||||
vfunc_allocate(container, box) {
|
||||
const monitor = Main.layoutManager.findIndexForActor(container);
|
||||
const workArea = Main.layoutManager.getWorkAreaForMonitor(monitor);
|
||||
const hscale = box.get_width() / workArea.width;
|
||||
const vscale = box.get_height() / workArea.height;
|
||||
|
||||
for (const child of container) {
|
||||
const childBox = new Clutter.ActorBox();
|
||||
const frameRect = child.metaWindow.get_frame_rect();
|
||||
childBox.set_size(
|
||||
Math.round(Math.min(frameRect.width, workArea.width) * hscale),
|
||||
Math.round(Math.min(frameRect.height, workArea.height) * vscale));
|
||||
childBox.set_origin(
|
||||
Math.round((frameRect.x - workArea.x) * hscale),
|
||||
Math.round((frameRect.y - workArea.y) * vscale));
|
||||
child.allocate(childBox);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -103,7 +102,7 @@ class WorkspaceThumbnail extends St.Button {
|
||||
super._init({
|
||||
style_class: 'workspace',
|
||||
child: new Clutter.Actor({
|
||||
layout_manager: new Clutter.BinLayout(),
|
||||
layout_manager: new WorkspaceLayout(),
|
||||
clip_to_allocation: true,
|
||||
}),
|
||||
});
|
||||
@@ -134,16 +133,15 @@ class WorkspaceThumbnail extends St.Button {
|
||||
}
|
||||
|
||||
acceptDrop(source) {
|
||||
if (!source.realWindow)
|
||||
if (!source.metaWindow)
|
||||
return false;
|
||||
|
||||
let window = source.realWindow.get_meta_window();
|
||||
this._moveWindow(window);
|
||||
this._moveWindow(source.metaWindow);
|
||||
return true;
|
||||
}
|
||||
|
||||
handleDragOver(source) {
|
||||
if (source.realWindow)
|
||||
if (source.metaWindow)
|
||||
return DND.DragMotionResult.MOVE_DROP;
|
||||
else
|
||||
return DND.DragMotionResult.CONTINUE;
|
||||
|
||||
@@ -1,45 +1,12 @@
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
/* exported init */
|
||||
const { Clutter, GObject, St } = imports.gi;
|
||||
const { Clutter, Graphene, GObject, St } = imports.gi;
|
||||
|
||||
const Main = imports.ui.main;
|
||||
const Workspace = imports.ui.workspace;
|
||||
const WorkspacesView = imports.ui.workspacesView;
|
||||
|
||||
class MyWindowOverlay extends Workspace.WindowOverlay {
|
||||
constructor(windowClone, parentActor) {
|
||||
super(windowClone, parentActor);
|
||||
|
||||
this._id = null;
|
||||
this._text = new St.Label({
|
||||
style_class: 'extension-windowsNavigator-window-tooltip',
|
||||
visible: false,
|
||||
});
|
||||
parentActor.add_actor(this._text);
|
||||
}
|
||||
|
||||
showTooltip() {
|
||||
this._parentActor.set_child_below_sibling(this._text, null);
|
||||
this._text.show();
|
||||
this._text.text = (this._windowClone.slotId + 1).toString();
|
||||
}
|
||||
|
||||
hideTooltip() {
|
||||
if (this._text && this._text.visible)
|
||||
this._text.hide();
|
||||
}
|
||||
|
||||
relayout(animate) {
|
||||
super.relayout(animate);
|
||||
|
||||
let [cloneX, cloneY, cloneWidth_, cloneHeight_] = this._windowClone.slot;
|
||||
|
||||
let textX = cloneX - 2;
|
||||
let textY = cloneY - 2;
|
||||
this._text.set_position(Math.floor(textX) + 5, Math.floor(textY) + 5);
|
||||
this._parentActor.set_child_below_sibling(this._text, null);
|
||||
}
|
||||
}
|
||||
const WINDOW_SLOT = 4;
|
||||
|
||||
var MyWorkspace = GObject.registerClass(
|
||||
class MyWorkspace extends Workspace.Workspace {
|
||||
@@ -61,57 +28,89 @@ class MyWorkspace extends Workspace.Workspace {
|
||||
}
|
||||
}
|
||||
|
||||
vfunc_allocate(box) {
|
||||
super.vfunc_allocate(box);
|
||||
|
||||
if (this._tip)
|
||||
this._tip.allocate_preferred_size(0, 0);
|
||||
}
|
||||
|
||||
showTooltip() {
|
||||
if (!this._tip || !this._actualGeometry)
|
||||
if (!this._tip)
|
||||
return;
|
||||
this._tip.text = (this.metaWorkspace.index() + 1).toString();
|
||||
|
||||
// Hand code this instead of using _getSpacingAndPadding
|
||||
// because that fails on empty workspaces
|
||||
let node = this.get_theme_node();
|
||||
let padding = {
|
||||
left: node.get_padding(St.Side.LEFT),
|
||||
top: node.get_padding(St.Side.TOP),
|
||||
bottom: node.get_padding(St.Side.BOTTOM),
|
||||
right: node.get_padding(St.Side.RIGHT),
|
||||
};
|
||||
|
||||
let area = Workspace.padArea(this._actualGeometry, padding);
|
||||
this._tip.x = area.x;
|
||||
this._tip.y = area.y;
|
||||
this._tip.show();
|
||||
this.set_child_below_sibling(this._tip, null);
|
||||
}
|
||||
|
||||
hideTooltip() {
|
||||
if (!this._tip)
|
||||
return;
|
||||
if (!this._tip.get_parent())
|
||||
return;
|
||||
this._tip.hide();
|
||||
if (this._tip)
|
||||
this._tip.hide();
|
||||
}
|
||||
|
||||
getWindowWithTooltip(id) {
|
||||
for (let i = 0; i < this._windows.length; i++) {
|
||||
if (this._windows[i].slotId + 1 === id)
|
||||
return this._windows[i].metaWindow;
|
||||
}
|
||||
return null;
|
||||
const slot = this.layout_manager._windowSlots[id - 1];
|
||||
return slot ? slot[WINDOW_SLOT].metaWindow : null;
|
||||
}
|
||||
|
||||
showWindowsTooltips() {
|
||||
for (let i in this._windowOverlays) {
|
||||
if (this._windowOverlays[i])
|
||||
this._windowOverlays[i].showTooltip();
|
||||
for (let i = 0; i < this.layout_manager._windowSlots.length; i++) {
|
||||
if (this.layout_manager._windowSlots[i])
|
||||
this.layout_manager._windowSlots[i][WINDOW_SLOT].showTooltip(`${i + 1}`);
|
||||
}
|
||||
}
|
||||
|
||||
hideWindowsTooltips() {
|
||||
for (let i in this._windowOverlays) {
|
||||
if (this._windowOverlays[i])
|
||||
this._windowOverlays[i].hideTooltip();
|
||||
for (let i in this.layout_manager._windowSlots) {
|
||||
if (this.layout_manager._windowSlots[i])
|
||||
this.layout_manager._windowSlots[i][WINDOW_SLOT].hideTooltip();
|
||||
}
|
||||
}
|
||||
|
||||
// overriding _addWindowClone to apply the tooltip patch on the cloned
|
||||
// windowPreview
|
||||
_addWindowClone(metaWindow) {
|
||||
const clone = super._addWindowClone(metaWindow);
|
||||
|
||||
// appling the tooltip patch
|
||||
(function patchPreview() {
|
||||
this._text = new St.Label({
|
||||
style_class: 'extension-windowsNavigator-window-tooltip',
|
||||
visible: false,
|
||||
});
|
||||
|
||||
this._text.add_constraint(new Clutter.BindConstraint({
|
||||
source: this._borderCenter,
|
||||
coordinate: Clutter.BindCoordinate.POSITION,
|
||||
}));
|
||||
this._text.add_constraint(new Clutter.AlignConstraint({
|
||||
source: this._borderCenter,
|
||||
align_axis: Clutter.AlignAxis.X_AXIS,
|
||||
pivot_point: new Graphene.Point({ x: 0.5, y: -1 }),
|
||||
factor: this._closeButtonSide === St.Side.LEFT ? 1 : 0,
|
||||
}));
|
||||
this._text.add_constraint(new Clutter.AlignConstraint({
|
||||
source: this._borderCenter,
|
||||
align_axis: Clutter.AlignAxis.Y_AXIS,
|
||||
pivot_point: new Graphene.Point({ x: -1, y: 0.5 }),
|
||||
factor: 0,
|
||||
}));
|
||||
|
||||
this.add_child(this._text);
|
||||
}).call(clone);
|
||||
|
||||
clone.showTooltip = function (text) {
|
||||
this._text.set({ text });
|
||||
this._text.show();
|
||||
};
|
||||
|
||||
clone.hideTooltip = function () {
|
||||
if (this._text && this._text.visible)
|
||||
this._text.hide();
|
||||
};
|
||||
|
||||
return clone;
|
||||
}
|
||||
});
|
||||
|
||||
var MyWorkspacesView = GObject.registerClass(
|
||||
@@ -244,19 +243,16 @@ class MyWorkspacesView extends WorkspacesView.WorkspacesView {
|
||||
|
||||
class Extension {
|
||||
constructor() {
|
||||
this._origWindowOverlay = Workspace.WindowOverlay;
|
||||
this._origWorkspace = Workspace.Workspace;
|
||||
this._origWorkspacesView = WorkspacesView.WorkspacesView;
|
||||
}
|
||||
|
||||
enable() {
|
||||
Workspace.WindowOverlay = MyWindowOverlay;
|
||||
Workspace.Workspace = MyWorkspace;
|
||||
WorkspacesView.WorkspacesView = MyWorkspacesView;
|
||||
}
|
||||
|
||||
disable() {
|
||||
Workspace.WindowOverlay = this._origWindowOverlay;
|
||||
Workspace.Workspace = this._origWorkspace;
|
||||
WorkspacesView.WorkspacesView = this._origWorkspacesView;
|
||||
}
|
||||
|
||||
@@ -30,27 +30,14 @@ class WindowPreview extends St.Button {
|
||||
this.connect('destroy', this._onDestroy.bind(this));
|
||||
|
||||
this._sizeChangedId = this._window.connect('size-changed',
|
||||
this._relayout.bind(this));
|
||||
() => this.queue_relayout());
|
||||
this._positionChangedId = this._window.connect('position-changed',
|
||||
this._relayout.bind(this));
|
||||
this._minimizedChangedId = this._window.connect('notify::minimized',
|
||||
this._relayout.bind(this));
|
||||
this._monitorEnteredId = global.display.connect('window-entered-monitor',
|
||||
this._relayout.bind(this));
|
||||
this._monitorLeftId = global.display.connect('window-left-monitor',
|
||||
this._relayout.bind(this));
|
||||
|
||||
// Do initial layout when we get a parent
|
||||
let id = this.connect('parent-set', () => {
|
||||
this.disconnect(id);
|
||||
if (!this.get_parent())
|
||||
return;
|
||||
this._laterId = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => {
|
||||
this._laterId = 0;
|
||||
this._relayout();
|
||||
return false;
|
||||
() => {
|
||||
this._updateVisible();
|
||||
this.queue_relayout();
|
||||
});
|
||||
});
|
||||
this._minimizedChangedId = this._window.connect('notify::minimized',
|
||||
this._updateVisible.bind(this));
|
||||
|
||||
this._focusChangedId = global.display.connect('notify::focus-window',
|
||||
this._onFocusChanged.bind(this));
|
||||
@@ -58,19 +45,15 @@ class WindowPreview extends St.Button {
|
||||
}
|
||||
|
||||
// needed for DND
|
||||
get realWindow() {
|
||||
return this._window.get_compositor_private();
|
||||
get metaWindow() {
|
||||
return this._window;
|
||||
}
|
||||
|
||||
_onDestroy() {
|
||||
this._window.disconnect(this._sizeChangedId);
|
||||
this._window.disconnect(this._positionChangedId);
|
||||
this._window.disconnect(this._minimizedChangedId);
|
||||
global.display.disconnect(this._monitorEnteredId);
|
||||
global.display.disconnect(this._monitorLeftId);
|
||||
global.display.disconnect(this._focusChangedId);
|
||||
if (this._laterId)
|
||||
Meta.later_remove(this._laterId);
|
||||
}
|
||||
|
||||
_onFocusChanged() {
|
||||
@@ -80,26 +63,42 @@ class WindowPreview extends St.Button {
|
||||
this.remove_style_class_name('active');
|
||||
}
|
||||
|
||||
_relayout() {
|
||||
let monitor = Main.layoutManager.findIndexForActor(this);
|
||||
this.visible = monitor === this._window.get_monitor() &&
|
||||
_updateVisible() {
|
||||
const monitor = Main.layoutManager.findIndexForActor(this);
|
||||
const workArea = Main.layoutManager.getWorkAreaForMonitor(monitor);
|
||||
this.visible = this._window.get_frame_rect().overlap(workArea) &&
|
||||
this._window.window_type !== Meta.WindowType.DESKTOP &&
|
||||
this._window.showing_on_its_workspace();
|
||||
}
|
||||
});
|
||||
|
||||
if (!this.visible)
|
||||
return;
|
||||
let WorkspaceLayout = GObject.registerClass(
|
||||
class WorkspaceLayout extends Clutter.LayoutManager {
|
||||
vfunc_get_preferred_width() {
|
||||
return [0, 0];
|
||||
}
|
||||
|
||||
let workArea = Main.layoutManager.getWorkAreaForMonitor(monitor);
|
||||
let hscale = this.get_parent().allocation.get_width() / workArea.width;
|
||||
let vscale = this.get_parent().allocation.get_height() / workArea.height;
|
||||
vfunc_get_preferred_height() {
|
||||
return [0, 0];
|
||||
}
|
||||
|
||||
let frameRect = this._window.get_frame_rect();
|
||||
this.set_size(
|
||||
Math.round(Math.min(frameRect.width, workArea.width) * hscale),
|
||||
Math.round(Math.min(frameRect.height, workArea.height) * vscale));
|
||||
this.set_position(
|
||||
Math.round(frameRect.x * hscale),
|
||||
Math.round(frameRect.y * vscale));
|
||||
vfunc_allocate(container, box) {
|
||||
const monitor = Main.layoutManager.findIndexForActor(container);
|
||||
const workArea = Main.layoutManager.getWorkAreaForMonitor(monitor);
|
||||
const hscale = box.get_width() / workArea.width;
|
||||
const vscale = box.get_height() / workArea.height;
|
||||
|
||||
for (const child of container) {
|
||||
const childBox = new Clutter.ActorBox();
|
||||
const frameRect = child.metaWindow.get_frame_rect();
|
||||
childBox.set_size(
|
||||
Math.round(Math.min(frameRect.width, workArea.width) * hscale),
|
||||
Math.round(Math.min(frameRect.height, workArea.height) * vscale));
|
||||
childBox.set_origin(
|
||||
Math.round((frameRect.x - workArea.x) * hscale),
|
||||
Math.round((frameRect.y - workArea.y) * vscale));
|
||||
child.allocate(childBox);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -109,7 +108,7 @@ class WorkspaceThumbnail extends St.Button {
|
||||
super._init({
|
||||
style_class: 'workspace',
|
||||
child: new Clutter.Actor({
|
||||
layout_manager: new Clutter.BinLayout(),
|
||||
layout_manager: new WorkspaceLayout(),
|
||||
clip_to_allocation: true,
|
||||
}),
|
||||
});
|
||||
@@ -140,16 +139,15 @@ class WorkspaceThumbnail extends St.Button {
|
||||
}
|
||||
|
||||
acceptDrop(source) {
|
||||
if (!source.realWindow)
|
||||
if (!source.metaWindow)
|
||||
return false;
|
||||
|
||||
let window = source.realWindow.get_meta_window();
|
||||
this._moveWindow(window);
|
||||
this._moveWindow(source.metaWindow);
|
||||
return true;
|
||||
}
|
||||
|
||||
handleDragOver(source) {
|
||||
if (source.realWindow)
|
||||
if (source.metaWindow)
|
||||
return DND.DragMotionResult.MOVE_DROP;
|
||||
else
|
||||
return DND.DragMotionResult.CONTINUE;
|
||||
|
||||
@@ -34,4 +34,10 @@ and will be picked automatically at next login.
|
||||
<gnome:userid>fmuellner</gnome:userid>
|
||||
</foaf:Person>
|
||||
</maintainer>
|
||||
<maintainer>
|
||||
<foaf:Person>
|
||||
<foaf:name>Marge Bot</foaf:name>
|
||||
<gnome:userid>marge-bot</gnome:userid>
|
||||
</foaf:Person>
|
||||
</maintainer>
|
||||
</Project>
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
---
|
||||
# SPDX-License-Identifier: MIT OR LGPL-2.0-or-later
|
||||
env:
|
||||
es6: true
|
||||
extends: 'eslint:recommended'
|
||||
@@ -24,7 +25,9 @@ rules:
|
||||
# allow: [^vfunc_, ^on_, _instance_init]
|
||||
comma-dangle:
|
||||
- error
|
||||
- always-multiline
|
||||
- arrays: always-multiline
|
||||
objects: always-multiline
|
||||
functions: never
|
||||
comma-spacing:
|
||||
- error
|
||||
- before: false
|
||||
@@ -87,6 +90,7 @@ rules:
|
||||
- error
|
||||
- all
|
||||
- conditionalAssign: false
|
||||
nestedBinaryExpressions: false
|
||||
returnAssign: false
|
||||
no-implicit-coercion:
|
||||
- error
|
||||
@@ -105,15 +109,15 @@ rules:
|
||||
no-prototype-builtins: 'off'
|
||||
no-restricted-properties:
|
||||
- error
|
||||
- object: Lang
|
||||
property: copyProperties
|
||||
message: Use Object.assign()
|
||||
- object: Lang
|
||||
property: bind
|
||||
message: Use arrow notation or Function.prototype.bind()
|
||||
- object: Lang
|
||||
property: Class
|
||||
message: Use ES6 classes
|
||||
- object: imports
|
||||
property: mainloop
|
||||
message: Use GLib main loops and timeouts
|
||||
no-restricted-syntax:
|
||||
- error
|
||||
- selector: >-
|
||||
@@ -129,6 +133,8 @@ rules:
|
||||
BlockStatement[body.length=1]
|
||||
CallExpression[arguments.length=0][callee.object.type="Super"][callee.property.name="_init"]
|
||||
message: _init() that only calls super._init() is unnecessary
|
||||
- selector: BinaryExpression[operator="instanceof"][right.name="Array"]
|
||||
message: Use Array.isArray()
|
||||
no-return-assign: error
|
||||
no-return-await: error
|
||||
no-self-compare: error
|
||||
@@ -165,6 +171,9 @@ rules:
|
||||
object-shorthand: error
|
||||
operator-assignment: error
|
||||
operator-linebreak: error
|
||||
padded-blocks:
|
||||
- error
|
||||
- never
|
||||
# These may be a bit controversial, we can try them out and enable them later
|
||||
# prefer-const: error
|
||||
# prefer-destructuring: error
|
||||
@@ -217,12 +226,12 @@ globals:
|
||||
ARGV: readonly
|
||||
Debugger: readonly
|
||||
GIRepositoryGType: readonly
|
||||
globalThis: readonly
|
||||
imports: readonly
|
||||
Intl: readonly
|
||||
log: readonly
|
||||
logError: readonly
|
||||
print: readonly
|
||||
printerr: readonly
|
||||
window: readonly
|
||||
parserOptions:
|
||||
ecmaVersion: 2017
|
||||
ecmaVersion: 2020
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
project('gnome-shell-extensions',
|
||||
version: '3.38.1',
|
||||
version: '40.alpha',
|
||||
meson_version: '>= 0.44.0',
|
||||
license: 'GPL2+'
|
||||
)
|
||||
@@ -21,9 +21,9 @@ sessiondir = join_paths(datadir, 'gnome-session', 'sessions')
|
||||
xsessiondir = join_paths(datadir, 'xsessions')
|
||||
|
||||
ver_arr = meson.project_version().split('.')
|
||||
if ver_arr[1].to_int().is_even()
|
||||
shell_version = '@0@.@1@'.format(ver_arr[0], ver_arr[1])
|
||||
else
|
||||
if ver_arr[1].version_compare('>=0')
|
||||
shell_version = ver_arr[0]
|
||||
else # pre-release (alpha, beta, rc)
|
||||
shell_version = '.'.join(ver_arr)
|
||||
endif
|
||||
|
||||
|
||||
2
po/ca.po
2
po/ca.po
@@ -83,7 +83,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Intenta utilitzar més espai de la pantalla per a posicionar les miniatures de "
|
||||
"les finestres adaptant-les a la ràtio d'aspecte de la pantalla, consolidant-"
|
||||
"les més per a reduir la capsa que les envolta. Aquest paràmetre de "
|
||||
"les més per a reduir la caixa que les envolta. Aquest paràmetre de "
|
||||
"configuració només s'aplica a l'estratègia de posicionament de finestres "
|
||||
"natural."
|
||||
|
||||
|
||||
60
po/fur.po
60
po/fur.po
@@ -8,23 +8,23 @@ msgstr ""
|
||||
"Project-Id-Version: gnome-shell-extensions master\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/"
|
||||
"issues\n"
|
||||
"POT-Creation-Date: 2020-05-28 00:55+0000\n"
|
||||
"PO-Revision-Date: 2020-07-12 18:10+0200\n"
|
||||
"POT-Creation-Date: 2020-10-08 21:24+0000\n"
|
||||
"PO-Revision-Date: 2020-10-17 22:14+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.3.1\n"
|
||||
"X-Generator: Poedit 2.4.1\n"
|
||||
|
||||
#: data/gnome-classic.desktop.in:3 data/gnome-classic.session.desktop.in:3
|
||||
#: data/gnome-classic.desktop.in:3
|
||||
msgid "GNOME Classic"
|
||||
msgstr "GNOME Classic"
|
||||
|
||||
#: data/gnome-classic.desktop.in:4
|
||||
msgid "This session logs you into GNOME Classic"
|
||||
msgstr "Cheste session a si invie cun GNOME classic"
|
||||
msgstr "Cheste session ti fâs jentrâ in GNOME Classic"
|
||||
|
||||
#: extensions/apps-menu/extension.js:113
|
||||
msgid "Favorites"
|
||||
@@ -43,8 +43,8 @@ msgid ""
|
||||
"A list of strings, each containing an application id (desktop file name), "
|
||||
"followed by a colon and the workspace number"
|
||||
msgstr ""
|
||||
"Une liste di stringhis, ogniune a ten il ID di une aplicazion (non dal file ."
|
||||
"desktop), seguît di doi ponts e il numar dal spazi di lavôr"
|
||||
"Une liste di stringhis, ogniune e ten il ID di une aplicazion (non dal file ."
|
||||
"desktop), cun daûr doi ponts e il numar dal spazi di lavôr"
|
||||
|
||||
#: extensions/auto-move-windows/prefs.js:35
|
||||
msgid "Workspace Rules"
|
||||
@@ -63,15 +63,15 @@ msgstr "No si è rivâts a parâ fûr la unitât “%s”»:"
|
||||
|
||||
#: extensions/drive-menu/extension.js:128
|
||||
msgid "Removable devices"
|
||||
msgstr "Argagn rimovibil"
|
||||
msgstr "Dispositîfs estraibii"
|
||||
|
||||
#: extensions/drive-menu/extension.js:155
|
||||
msgid "Open Files"
|
||||
msgstr "Vierç i file"
|
||||
msgstr "Vierç i files"
|
||||
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:5
|
||||
msgid "Use more screen for windows"
|
||||
msgstr "Dopre plui spazi par i balcons"
|
||||
msgstr "Dopre plui schermi pai barcons"
|
||||
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:6
|
||||
msgid ""
|
||||
@@ -79,14 +79,14 @@ msgid ""
|
||||
"aspect ratio, and consolidating them further to reduce the bounding box. "
|
||||
"This setting applies only with the natural placement strategy."
|
||||
msgstr ""
|
||||
"Cîr di doprâ plui puest par plaçâ lis miniaturis dai balcons, adatânsi al "
|
||||
"rapuart di aspiet dal visôr e consolidanlis ancjemo di plui par ridusi il "
|
||||
"spazi complessîf. Cheste impostazion a si apliche dome se l'algoritmo di "
|
||||
"posizionament al è \"natural\"."
|
||||
"Cîr di doprâ plui schermi par plaçâ lis miniaturis dai barcons, adatant il "
|
||||
"rapuart di aspiet dal visôr e consolidant ancjemo di plui lis miniaturis par "
|
||||
"ridusi il spazi complessîf. Cheste impostazion si apliche dome se "
|
||||
"l'algoritmi di plaçament al è naturâl."
|
||||
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:11
|
||||
msgid "Place window captions on top"
|
||||
msgstr "Met il titul dal balcon insomp"
|
||||
msgstr "Met il titul dal barcon parsore"
|
||||
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:12
|
||||
msgid ""
|
||||
@@ -94,9 +94,9 @@ msgid ""
|
||||
"shell default of placing it at the bottom. Changing this setting requires "
|
||||
"restarting the shell to have any effect."
|
||||
msgstr ""
|
||||
"Se VÊR, al place i titui dai balcons insomp as relativis miniaturis, lant in "
|
||||
"volte al compuartament normâl de shell, che lis place in bas.Cambiant cheste "
|
||||
"impostazion a si scugne tornâ a inviâ la shell."
|
||||
"Se VÊR, al place i titui dai barcons denant des relativis miniaturis, "
|
||||
"sorpassant il compuartament predefinît de shell, che lis place in bas. "
|
||||
"Cambiant cheste impostazion si scugne tornâ a inviâ la shell."
|
||||
|
||||
#: extensions/places-menu/extension.js:89
|
||||
#: extensions/places-menu/extension.js:93
|
||||
@@ -120,7 +120,7 @@ msgstr "Computer"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:359
|
||||
msgid "Home"
|
||||
msgstr "Cjase"
|
||||
msgstr "Home"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:404
|
||||
msgid "Browse Network"
|
||||
@@ -128,11 +128,11 @@ msgstr "Esplore rêt"
|
||||
|
||||
#: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:7
|
||||
msgid "Cycle Screenshot Sizes"
|
||||
msgstr "Dimensions caturis di schermi ciclichis"
|
||||
msgstr "Dimensions videadis catuardis ciclichis"
|
||||
|
||||
#: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:11
|
||||
msgid "Cycle Screenshot Sizes Backward"
|
||||
msgstr "Dimensions caturis di schermi ciclichis indaûr"
|
||||
msgstr "Dimensions videadis caturadis ciclichis indaûr"
|
||||
|
||||
#: extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml:5
|
||||
msgid "Theme name"
|
||||
@@ -184,19 +184,19 @@ msgstr "Siere ducj"
|
||||
|
||||
#: extensions/window-list/extension.js:734
|
||||
msgid "Window List"
|
||||
msgstr "Liste balcons"
|
||||
msgstr "Liste barcons"
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:12
|
||||
msgid "When to group windows"
|
||||
msgstr "Quant ingrumâ i balcons"
|
||||
msgstr "Cuant meti in grup i barcons"
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:13
|
||||
msgid ""
|
||||
"Decides when to group windows from the same application on the window list. "
|
||||
"Possible values are “never”, “auto” and “always”."
|
||||
msgstr ""
|
||||
"Al decît cuant intropâ i balcons de stesse aplicazion su le liste dai "
|
||||
"balcons. I pussibii valôrs a son “never”, “auto” e “always”."
|
||||
"Al decît cuant meti dongje i barcons de stesse aplicazion su la liste dai "
|
||||
"barcons. I valôrs pussibii a son “never”, “auto” e “always”."
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20
|
||||
#: extensions/window-list/prefs.js:100
|
||||
@@ -218,23 +218,23 @@ msgid ""
|
||||
"primary one."
|
||||
msgstr ""
|
||||
"Indiche se mostrâ la liste dai barcons su ducj i visôrs tacâts o nome sul "
|
||||
"principâl."
|
||||
"chel principâl."
|
||||
|
||||
#: extensions/window-list/prefs.js:29
|
||||
msgid "Window Grouping"
|
||||
msgstr "Ingrumament balcons"
|
||||
msgstr "Intropament di barcons"
|
||||
|
||||
#: extensions/window-list/prefs.js:58
|
||||
msgid "Never group windows"
|
||||
msgstr "No ingrumâ i balcons"
|
||||
msgstr "No sta meti mai in grup i barcons"
|
||||
|
||||
#: extensions/window-list/prefs.js:59
|
||||
msgid "Group windows when space is limited"
|
||||
msgstr "Ingrume i balcons quanche al'è pôc puest"
|
||||
msgstr "Met dongje i barcons cuant che il spazi al è limitât"
|
||||
|
||||
#: extensions/window-list/prefs.js:60
|
||||
msgid "Always group windows"
|
||||
msgstr "Ingrume simpri i balcons"
|
||||
msgstr "Met simpri in grup i barcons"
|
||||
|
||||
#: extensions/window-list/prefs.js:94
|
||||
msgid "Show on all monitors"
|
||||
|
||||
Reference in New Issue
Block a user