Compare commits
98 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a6131bd00b | |||
| e864d0d1cc | |||
| 930595003d | |||
| 51df22adcf | |||
| 6ff6eb2c22 | |||
| 6bee46bf1a | |||
| f4347d240a | |||
| 81b8ad4499 | |||
| aeee81a82c | |||
| fcefdc3271 | |||
| 7a017c1e76 | |||
| b2455f0ecd | |||
| 573aba17d7 | |||
| 2117c42d74 | |||
| 5edffcd859 | |||
| d8b526a715 | |||
| a5b6871562 | |||
| deb6031381 | |||
| 486cb59aff | |||
| de9a3df7bd | |||
| db131fc7da | |||
| 80c6656c4f | |||
| a5a3523df8 | |||
| 06acd9ff25 | |||
| 1a1d45d9e4 | |||
| 1d3775b3d1 | |||
| 15c83db793 | |||
| cc021589b8 | |||
| 5e316d37cb | |||
| 28dbb47937 | |||
| 619de9d5ee | |||
| 561b8aeb03 | |||
| 4286fd1bcc | |||
| 3bb0897bc1 | |||
| 12eedcf6f7 | |||
| 08d382facc | |||
| d9ae9a023a | |||
| 96a1de92db | |||
| cc2f46b837 | |||
| 9f25047e24 | |||
| fb66afbf71 | |||
| 365fa6abc9 | |||
| d7a824f35f | |||
| 0d8e412220 | |||
| 991f6ef508 | |||
| 37f03f5e2e | |||
| b4a4ff0a06 | |||
| de8876bd5e | |||
| 5ad272e628 | |||
| 3b22582752 | |||
| e734fcbd21 | |||
| 435879c121 | |||
| ed81650f55 | |||
| 1276a880de | |||
| 584016c291 | |||
| 41664b152c | |||
| 8957c277a1 | |||
| 8b9be8f120 | |||
| d3b687df8b | |||
| df463177e7 | |||
| 62af36ebfa | |||
| c5246b7415 | |||
| d39c1fd685 | |||
| 665a7fbbcb | |||
| a4987d03b8 | |||
| c477f10bfb | |||
| 2ae0f368b9 | |||
| ac33058086 | |||
| c7a08aaf74 | |||
| 8c1d6d88cf | |||
| 33b16681c6 | |||
| 3c51716268 | |||
| e5421b6cc6 | |||
| f1e7ae1010 | |||
| 10fe907c83 | |||
| ae9809caba | |||
| c95d197c5c | |||
| ae8749b7e1 | |||
| 84a548c0b9 | |||
| f047cb0baf | |||
| 28494941e1 | |||
| b70059ac4d | |||
| eb567c1120 | |||
| b1eb9b9080 | |||
| a0b6535210 | |||
| 9a9b3afa31 | |||
| 59bc054ef6 | |||
| 57e9dfe722 | |||
| f17a519c38 | |||
| 8223ca9739 | |||
| fe20c27b60 | |||
| 5ba59d1096 | |||
| 0ad1e9bbc1 | |||
| 5ea14f063f | |||
| 3cc3d03f0b | |||
| 057e5bb0c1 | |||
| 07fc66765d | |||
| daa7b9b6ab |
-12
@@ -1,12 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2011 Giovanni Campagna <gcampagna@src.gnome.org>
|
|
||||||
# SPDX-FileCopyrightText: 2023 Florian Müllner <fmuellner@gnome.org>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: CC0-1.0
|
|
||||||
|
|
||||||
po/gnome-shell-extensions.pot
|
|
||||||
zip-files/
|
|
||||||
*~
|
|
||||||
*.patch
|
|
||||||
*.sw?
|
|
||||||
.buildconfig
|
|
||||||
.vscode
|
|
||||||
@@ -1,21 +1,3 @@
|
|||||||
46.alpha
|
|
||||||
========
|
|
||||||
* workspace-indicator: Fix initial preview visibility [Florian; !280, !292]
|
|
||||||
* screenshot-window-sizer: Fix cycling between sizes backwards [Florian; !284]
|
|
||||||
* Add back overview in Classic session [Florian; !287]
|
|
||||||
* Allow running Classic session headless [Jonas; !289]
|
|
||||||
* window-list: Fix buttons not being clickable at the screen edge
|
|
||||||
[Florian; !291]
|
|
||||||
* Add system-monitor extension [Florian; !277]
|
|
||||||
* Fixed crash [Florian; !290]
|
|
||||||
* Misc. bug fixes and cleanups [Florian; !276, !275, !278, !281, !286, !288]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Jonas Ådahl, Florian Müllner
|
|
||||||
|
|
||||||
Translators:
|
|
||||||
Kristjan SCHMIDT [eo], Brage Fuglseth [nb]
|
|
||||||
|
|
||||||
45.0
|
45.0
|
||||||
====
|
====
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
{
|
{
|
||||||
"parentMode": "user",
|
"parentMode": "user",
|
||||||
"colorScheme": "force-light",
|
"colorScheme": "force-light",
|
||||||
|
"hasOverview": false,
|
||||||
"showWelcomeDialog": false,
|
"showWelcomeDialog": false,
|
||||||
"enabledExtensions": [@CLASSIC_EXTENSIONS@],
|
"enabledExtensions": [@CLASSIC_EXTENSIONS@],
|
||||||
"panel": { "left": ["activities"],
|
"panel": { "left": [],
|
||||||
"center": [],
|
"center": [],
|
||||||
"right": ["a11y", "keyboard", "dateMenu", "quickSettings"]
|
"right": ["a11y", "keyboard", "dateMenu", "quickSettings"]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,4 +6,3 @@ TryExec=gnome-session
|
|||||||
Type=Application
|
Type=Application
|
||||||
DesktopNames=GNOME-Classic;GNOME;
|
DesktopNames=GNOME-Classic;GNOME;
|
||||||
X-GDM-SessionRegisters=true
|
X-GDM-SessionRegisters=true
|
||||||
X-GDM-CanRunHeadless=true
|
|
||||||
|
|||||||
@@ -6,4 +6,3 @@ TryExec=gnome-session
|
|||||||
Type=Application
|
Type=Application
|
||||||
DesktopNames=GNOME-Classic;GNOME;
|
DesktopNames=GNOME-Classic;GNOME;
|
||||||
X-GDM-SessionRegisters=true
|
X-GDM-SessionRegisters=true
|
||||||
X-GDM-CanRunHeadless=true
|
|
||||||
|
|||||||
@@ -41,8 +41,6 @@ for f in $extensiondir/*; do
|
|||||||
cp $srcdir/NEWS $srcdir/COPYING $f
|
cp $srcdir/NEWS $srcdir/COPYING $f
|
||||||
sources=(NEWS COPYING $(cd $f; ls *.js))
|
sources=(NEWS COPYING $(cd $f; ls *.js))
|
||||||
|
|
||||||
[ -d $f/icons ] && sources+=(icons)
|
|
||||||
|
|
||||||
[ -f $schema ] || unset schema
|
[ -f $schema ] || unset schema
|
||||||
|
|
||||||
gnome-extensions pack ${sources[@]/#/--extra-source=} \
|
gnome-extensions pack ${sources[@]/#/--extra-source=} \
|
||||||
|
|||||||
@@ -214,9 +214,9 @@ class CategoryMenuItem extends PopupMenu.PopupBaseMenuItem {
|
|||||||
this._grab?.dismiss();
|
this._grab?.dismiss();
|
||||||
delete this._grab;
|
delete this._grab;
|
||||||
|
|
||||||
const targetActor = global.stage.get_event_actor(event);
|
let source = event.get_source();
|
||||||
if (targetActor instanceof St.Widget)
|
if (source instanceof St.Widget)
|
||||||
targetActor.sync_hover();
|
source.sync_hover();
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -255,7 +255,7 @@ class DesktopTarget extends EventEmitter {
|
|||||||
this._desktopDestroyedId = 0;
|
this._desktopDestroyedId = 0;
|
||||||
|
|
||||||
this._windowAddedId =
|
this._windowAddedId =
|
||||||
global.window_group.connect('child-added',
|
global.window_group.connect('actor-added',
|
||||||
this._onWindowAdded.bind(this));
|
this._onWindowAdded.bind(this));
|
||||||
|
|
||||||
global.get_window_actors().forEach(a => {
|
global.get_window_actors().forEach(a => {
|
||||||
@@ -363,20 +363,6 @@ class DesktopTarget extends EventEmitter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class MainLayout extends Clutter.BoxLayout {
|
|
||||||
static {
|
|
||||||
GObject.registerClass(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
vfunc_get_preferred_height(container, forWidth) {
|
|
||||||
const [mainChild] = container;
|
|
||||||
const [minHeight, natHeight] =
|
|
||||||
mainChild.get_preferred_height(forWidth);
|
|
||||||
|
|
||||||
return [minHeight, natHeight + MENU_HEIGHT_OFFSET];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class ApplicationsButton extends PanelMenu.Button {
|
class ApplicationsButton extends PanelMenu.Button {
|
||||||
static {
|
static {
|
||||||
GObject.registerClass(this);
|
GObject.registerClass(this);
|
||||||
@@ -399,7 +385,7 @@ class ApplicationsButton extends PanelMenu.Button {
|
|||||||
y_align: Clutter.ActorAlign.CENTER,
|
y_align: Clutter.ActorAlign.CENTER,
|
||||||
});
|
});
|
||||||
|
|
||||||
this.add_child(this._label);
|
this.add_actor(this._label);
|
||||||
this.name = 'panelApplications';
|
this.name = 'panelApplications';
|
||||||
this.label_actor = this._label;
|
this.label_actor = this._label;
|
||||||
|
|
||||||
@@ -446,6 +432,15 @@ class ApplicationsButton extends PanelMenu.Button {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_createVertSeparator() {
|
||||||
|
let separator = new St.DrawingArea({
|
||||||
|
style_class: 'calendar-vertical-separator',
|
||||||
|
pseudo_class: 'highlighted',
|
||||||
|
});
|
||||||
|
separator.connect('repaint', this._onVertSepRepaint.bind(this));
|
||||||
|
return separator;
|
||||||
|
}
|
||||||
|
|
||||||
_onDestroy() {
|
_onDestroy() {
|
||||||
super._onDestroy();
|
super._onDestroy();
|
||||||
|
|
||||||
@@ -467,6 +462,21 @@ class ApplicationsButton extends PanelMenu.Button {
|
|||||||
return super._onMenuKeyPress(actor, event);
|
return super._onMenuKeyPress(actor, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_onVertSepRepaint(area) {
|
||||||
|
let cr = area.get_context();
|
||||||
|
let themeNode = area.get_theme_node();
|
||||||
|
let [width, height] = area.get_surface_size();
|
||||||
|
let stippleColor = themeNode.get_color('-stipple-color');
|
||||||
|
let stippleWidth = themeNode.get_length('-stipple-width');
|
||||||
|
let x = Math.floor(width / 2) + 0.5;
|
||||||
|
cr.moveTo(x, 0);
|
||||||
|
cr.lineTo(x, height);
|
||||||
|
Clutter.cairo_set_source_color(cr, stippleColor);
|
||||||
|
cr.setDash([1, 3], 1); // Hard-code for now
|
||||||
|
cr.setLineWidth(stippleWidth);
|
||||||
|
cr.stroke();
|
||||||
|
}
|
||||||
|
|
||||||
_onOpenStateChanged(menu, open) {
|
_onOpenStateChanged(menu, open) {
|
||||||
if (open) {
|
if (open) {
|
||||||
if (this.reloadFlag) {
|
if (this.reloadFlag) {
|
||||||
@@ -544,7 +554,7 @@ class ApplicationsButton extends PanelMenu.Button {
|
|||||||
_createLayout() {
|
_createLayout() {
|
||||||
let section = new PopupMenu.PopupMenuSection();
|
let section = new PopupMenu.PopupMenuSection();
|
||||||
this.menu.addMenuItem(section);
|
this.menu.addMenuItem(section);
|
||||||
this.mainBox = new St.BoxLayout({layoutManager: new MainLayout()});
|
this.mainBox = new St.BoxLayout({vertical: false});
|
||||||
this.leftBox = new St.BoxLayout({vertical: true});
|
this.leftBox = new St.BoxLayout({vertical: true});
|
||||||
this.applicationsScrollBox = new St.ScrollView({
|
this.applicationsScrollBox = new St.ScrollView({
|
||||||
style_class: 'apps-menu vfade',
|
style_class: 'apps-menu vfade',
|
||||||
@@ -568,17 +578,19 @@ class ApplicationsButton extends PanelMenu.Button {
|
|||||||
this.leftBox.add_child(this.categoriesScrollBox);
|
this.leftBox.add_child(this.categoriesScrollBox);
|
||||||
|
|
||||||
this.applicationsBox = new St.BoxLayout({vertical: true});
|
this.applicationsBox = new St.BoxLayout({vertical: true});
|
||||||
this.applicationsScrollBox.set_child(this.applicationsBox);
|
this.applicationsScrollBox.add_actor(this.applicationsBox);
|
||||||
this.categoriesBox = new St.BoxLayout({vertical: true});
|
this.categoriesBox = new St.BoxLayout({vertical: true});
|
||||||
this.categoriesScrollBox.set_child(this.categoriesBox);
|
this.categoriesScrollBox.add_actor(this.categoriesBox);
|
||||||
|
|
||||||
this.mainBox.add_child(this.leftBox);
|
this.mainBox.add(this.leftBox);
|
||||||
|
this.mainBox.add_child(this._createVertSeparator());
|
||||||
this.mainBox.add_child(this.applicationsScrollBox);
|
this.mainBox.add_child(this.applicationsScrollBox);
|
||||||
section.actor.add_child(this.mainBox);
|
section.actor.add_actor(this.mainBox);
|
||||||
}
|
}
|
||||||
|
|
||||||
_display() {
|
_display() {
|
||||||
this._applicationsButtons.clear();
|
this._applicationsButtons.clear();
|
||||||
|
this.mainBox.style = 'width: 35em;';
|
||||||
this.mainBox.hide();
|
this.mainBox.hide();
|
||||||
|
|
||||||
// Load categories
|
// Load categories
|
||||||
@@ -586,7 +598,7 @@ class ApplicationsButton extends PanelMenu.Button {
|
|||||||
this._tree.load_sync();
|
this._tree.load_sync();
|
||||||
let root = this._tree.get_root_directory();
|
let root = this._tree.get_root_directory();
|
||||||
let categoryMenuItem = new CategoryMenuItem(this, null);
|
let categoryMenuItem = new CategoryMenuItem(this, null);
|
||||||
this.categoriesBox.add_child(categoryMenuItem);
|
this.categoriesBox.add_actor(categoryMenuItem);
|
||||||
let iter = root.iter();
|
let iter = root.iter();
|
||||||
let nextType;
|
let nextType;
|
||||||
while ((nextType = iter.next()) !== GMenu.TreeItemType.INVALID) {
|
while ((nextType = iter.next()) !== GMenu.TreeItemType.INVALID) {
|
||||||
@@ -602,12 +614,18 @@ class ApplicationsButton extends PanelMenu.Button {
|
|||||||
this._loadCategory(categoryId, dir);
|
this._loadCategory(categoryId, dir);
|
||||||
if (this.applicationsByCategory[categoryId].length > 0) {
|
if (this.applicationsByCategory[categoryId].length > 0) {
|
||||||
categoryMenuItem = new CategoryMenuItem(this, dir);
|
categoryMenuItem = new CategoryMenuItem(this, dir);
|
||||||
this.categoriesBox.add_child(categoryMenuItem);
|
this.categoriesBox.add_actor(categoryMenuItem);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load applications
|
// Load applications
|
||||||
this._displayButtons(this._listApplications(null));
|
this._displayButtons(this._listApplications(null));
|
||||||
|
|
||||||
|
let themeContext = St.ThemeContext.get_for_stage(global.stage);
|
||||||
|
let scaleFactor = themeContext.scale_factor;
|
||||||
|
let categoriesHeight = this.categoriesBox.height / scaleFactor;
|
||||||
|
let height = Math.round(categoriesHeight) + MENU_HEIGHT_OFFSET;
|
||||||
|
this.mainBox.style += `height: ${height}px`;
|
||||||
}
|
}
|
||||||
|
|
||||||
selectCategory(dir) {
|
selectCategory(dir) {
|
||||||
@@ -615,7 +633,7 @@ class ApplicationsButton extends PanelMenu.Button {
|
|||||||
if (c._delegate instanceof PopupMenu.PopupSeparatorMenuItem)
|
if (c._delegate instanceof PopupMenu.PopupSeparatorMenuItem)
|
||||||
c._delegate.destroy();
|
c._delegate.destroy();
|
||||||
else
|
else
|
||||||
this.applicationsBox.remove_child(c);
|
this.applicationsBox.remove_actor(c);
|
||||||
});
|
});
|
||||||
|
|
||||||
if (dir)
|
if (dir)
|
||||||
@@ -638,7 +656,7 @@ class ApplicationsButton extends PanelMenu.Button {
|
|||||||
this._applicationsButtons.set(app, item);
|
this._applicationsButtons.set(app, item);
|
||||||
}
|
}
|
||||||
if (!item.get_parent())
|
if (!item.get_parent())
|
||||||
this.applicationsBox.add_child(item);
|
this.applicationsBox.add_actor(item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,8 +4,6 @@
|
|||||||
* SPDX-License-Identifier: GPL-2.0-or-later
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.apps-menu {width: 26em;}
|
|
||||||
|
|
||||||
.apps-menu:ltr {
|
.apps-menu:ltr {
|
||||||
padding-right: 3px;
|
padding-right: 3px;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,8 +22,7 @@ class WindowMover {
|
|||||||
this._appSystem.connectObject('installed-changed',
|
this._appSystem.connectObject('installed-changed',
|
||||||
() => this._updateAppData(), this);
|
() => this._updateAppData(), this);
|
||||||
|
|
||||||
this._settings.connectObject('changed',
|
this._settings.connect('changed', this._updateAppConfigs.bind(this));
|
||||||
this._updateAppConfigs.bind(this), this);
|
|
||||||
this._updateAppConfigs();
|
this._updateAppConfigs();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,8 +58,11 @@ class WindowMover {
|
|||||||
|
|
||||||
destroy() {
|
destroy() {
|
||||||
this._appSystem.disconnectObject(this);
|
this._appSystem.disconnectObject(this);
|
||||||
this._settings.disconnectObject(this);
|
|
||||||
this._settings = null;
|
if (this._settings) {
|
||||||
|
this._settings.run_dispose();
|
||||||
|
this._settings = null;
|
||||||
|
}
|
||||||
|
|
||||||
this._appConfigs.clear();
|
this._appConfigs.clear();
|
||||||
this._updateAppData();
|
this._updateAppData();
|
||||||
|
|||||||
@@ -39,6 +39,8 @@ class MountMenuItem extends PopupMenu.PopupBaseMenuItem {
|
|||||||
|
|
||||||
this.mount = mount;
|
this.mount = mount;
|
||||||
|
|
||||||
|
this.connect('destroy', this._onDestroy.bind(this));
|
||||||
|
|
||||||
let ejectIcon = new St.Icon({
|
let ejectIcon = new St.Icon({
|
||||||
icon_name: 'media-eject-symbolic',
|
icon_name: 'media-eject-symbolic',
|
||||||
style_class: 'popup-menu-icon',
|
style_class: 'popup-menu-icon',
|
||||||
@@ -48,7 +50,7 @@ class MountMenuItem extends PopupMenu.PopupBaseMenuItem {
|
|||||||
style_class: 'button',
|
style_class: 'button',
|
||||||
});
|
});
|
||||||
ejectButton.connect('clicked', this._eject.bind(this));
|
ejectButton.connect('clicked', this._eject.bind(this));
|
||||||
this.add_child(ejectButton);
|
this.add(ejectButton);
|
||||||
|
|
||||||
this.hide();
|
this.hide();
|
||||||
|
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ class PlacesMenu extends PanelMenu.Button {
|
|||||||
y_expand: true,
|
y_expand: true,
|
||||||
y_align: Clutter.ActorAlign.CENTER,
|
y_align: Clutter.ActorAlign.CENTER,
|
||||||
});
|
});
|
||||||
this.add_child(label);
|
this.add_actor(label);
|
||||||
|
|
||||||
this.placesManager = new PlacesManager();
|
this.placesManager = new PlacesManager();
|
||||||
|
|
||||||
|
|||||||
@@ -141,8 +141,8 @@ class RootInfo extends PlaceInfo {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
this._proxy = obj;
|
this._proxy = obj;
|
||||||
this._proxy.connectObject('g-properties-changed',
|
this._proxy.connect('g-properties-changed',
|
||||||
this._propertiesChanged.bind(this), this);
|
this._propertiesChanged.bind(this));
|
||||||
this._propertiesChanged(obj);
|
this._propertiesChanged(obj);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -161,8 +161,10 @@ class RootInfo extends PlaceInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
destroy() {
|
destroy() {
|
||||||
this._proxy?.disconnectObject(this);
|
if (this._proxy) {
|
||||||
this._proxy = null;
|
this._proxy.run_dispose();
|
||||||
|
this._proxy = null;
|
||||||
|
}
|
||||||
super.destroy();
|
super.destroy();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ export default class ScreenshotWindowSizerExtension extends Extension {
|
|||||||
_flashMessage(message) {
|
_flashMessage(message) {
|
||||||
if (!this._text) {
|
if (!this._text) {
|
||||||
this._text = new St.Label({style_class: 'screenshot-sizer-message'});
|
this._text = new St.Label({style_class: 'screenshot-sizer-message'});
|
||||||
Main.uiGroup.add_child(this._text);
|
Main.uiGroup.add_actor(this._text);
|
||||||
}
|
}
|
||||||
|
|
||||||
this._text.remove_all_transitions();
|
this._text.remove_all_transitions();
|
||||||
@@ -65,7 +65,10 @@ export default class ScreenshotWindowSizerExtension extends Extension {
|
|||||||
* @param {Meta.KeyBinding} binding - the key binding
|
* @param {Meta.KeyBinding} binding - the key binding
|
||||||
*/
|
*/
|
||||||
_cycleScreenshotSizes(display, window, binding) {
|
_cycleScreenshotSizes(display, window, binding) {
|
||||||
const backwards = binding.is_reversed();
|
// Probably this isn't useful with 5 sizes, but you can decrease instead
|
||||||
|
// of increase by holding down shift.
|
||||||
|
let modifiers = binding.get_modifiers();
|
||||||
|
let backwards = (modifiers & Meta.VirtualModifier.SHIFT_MASK) !== 0;
|
||||||
|
|
||||||
// Unmaximize first
|
// Unmaximize first
|
||||||
if (window.get_maximized() !== 0)
|
if (window.get_maximized() !== 0)
|
||||||
@@ -96,7 +99,7 @@ export default class ScreenshotWindowSizerExtension extends Extension {
|
|||||||
|
|
||||||
// get the next size up or down from ideal
|
// get the next size up or down from ideal
|
||||||
let newIndex = (nearestIndex + (backwards ? -1 : 1)) % scaledSizes.length;
|
let newIndex = (nearestIndex + (backwards ? -1 : 1)) % scaledSizes.length;
|
||||||
let [newWidth, newHeight] = scaledSizes.at(newIndex);
|
let [newWidth, newHeight] = scaledSizes[newIndex];
|
||||||
|
|
||||||
// Push the window onscreen if it would be resized offscreen
|
// Push the window onscreen if it would be resized offscreen
|
||||||
let newX = outerRect.x;
|
let newX = outerRect.x;
|
||||||
|
|||||||
@@ -1,480 +0,0 @@
|
|||||||
/*
|
|
||||||
* SPDX-FileCopyrightText: 2023 Florian Müllner <fmuellner@gnome.org>
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
*/
|
|
||||||
|
|
||||||
import Clutter from 'gi://Clutter';
|
|
||||||
import Gio from 'gi://Gio';
|
|
||||||
import GLib from 'gi://GLib';
|
|
||||||
import GObject from 'gi://GObject';
|
|
||||||
import GTop from 'gi://GTop';
|
|
||||||
import Pango from 'gi://Pango';
|
|
||||||
import Shell from 'gi://Shell';
|
|
||||||
import St from 'gi://St';
|
|
||||||
|
|
||||||
import {Extension, gettext as _} from 'resource:///org/gnome/shell/extensions/extension.js';
|
|
||||||
import * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js';
|
|
||||||
import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js';
|
|
||||||
|
|
||||||
import * as Main from 'resource:///org/gnome/shell/ui/main.js';
|
|
||||||
|
|
||||||
const THRESHOLD_HIGH = 0.80;
|
|
||||||
|
|
||||||
// adapted from load-graph.cpp in gnome-system-monitor
|
|
||||||
/**
|
|
||||||
* @param {string} str
|
|
||||||
* @returns {number}
|
|
||||||
*/
|
|
||||||
function strHash(str) {
|
|
||||||
let hash = 0xcbf29ce484222325n;
|
|
||||||
|
|
||||||
for (const c of str)
|
|
||||||
hash = (hash * 0x00000100000001B3n) ^ BigInt(c.codePointAt(0));
|
|
||||||
return hash;
|
|
||||||
}
|
|
||||||
|
|
||||||
class StatSection extends St.BoxLayout {
|
|
||||||
static {
|
|
||||||
GObject.registerClass(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor(iconName, accessibleName) {
|
|
||||||
super({
|
|
||||||
style_class: 'system-monitor-stat-section',
|
|
||||||
accessibleName,
|
|
||||||
});
|
|
||||||
|
|
||||||
const ext = Extension.lookupByURL(import.meta.url);
|
|
||||||
const file =
|
|
||||||
ext.dir.resolve_relative_path(`icons/${iconName}.svg`);
|
|
||||||
|
|
||||||
this._icon = new St.Icon({
|
|
||||||
style_class: 'system-monitor-stat-section-icon',
|
|
||||||
gicon: new Gio.FileIcon({file}),
|
|
||||||
});
|
|
||||||
this.add_child(this._icon);
|
|
||||||
|
|
||||||
this.label = new St.Label({
|
|
||||||
style_class: 'system-monitor-stat-section-label',
|
|
||||||
y_align: Clutter.ActorAlign.CENTER,
|
|
||||||
});
|
|
||||||
this.label.clutter_text.set({
|
|
||||||
ellipsize: Pango.EllipsizeMode.NONE,
|
|
||||||
x_align: Clutter.ActorAlign.CENTER,
|
|
||||||
});
|
|
||||||
this.add_child(this.label);
|
|
||||||
|
|
||||||
this.connect('destroy', () => this._clearTimeout());
|
|
||||||
this.connect('notify::visible', () => this._sync());
|
|
||||||
this._sync();
|
|
||||||
}
|
|
||||||
|
|
||||||
_ensureTimeout() {
|
|
||||||
if (this._updateId)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._updateId = GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, 1,
|
|
||||||
() => {
|
|
||||||
this._update();
|
|
||||||
return GLib.SOURCE_CONTINUE;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
_clearTimeout() {
|
|
||||||
if (this._updateId)
|
|
||||||
GLib.source_remove(this._updateId);
|
|
||||||
delete this._updateId;
|
|
||||||
}
|
|
||||||
|
|
||||||
_sync() {
|
|
||||||
if (this.visible)
|
|
||||||
this._ensureTimeout();
|
|
||||||
else
|
|
||||||
this._clearTimeout();
|
|
||||||
|
|
||||||
if (this.visible)
|
|
||||||
this._update();
|
|
||||||
}
|
|
||||||
|
|
||||||
_update() {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class LoadStatSection extends StatSection {
|
|
||||||
static {
|
|
||||||
GObject.registerClass(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
#formatter = new Intl.NumberFormat(undefined, {
|
|
||||||
style: 'percent',
|
|
||||||
});
|
|
||||||
|
|
||||||
_getLoadValue() {
|
|
||||||
}
|
|
||||||
|
|
||||||
_update() {
|
|
||||||
const load = this._getLoadValue();
|
|
||||||
this.label.text = this.#formatter.format(load);
|
|
||||||
|
|
||||||
if (load >= THRESHOLD_HIGH)
|
|
||||||
this.add_style_class_name('high-usage');
|
|
||||||
else
|
|
||||||
this.remove_style_class_name('high-usage');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class CpuSection extends LoadStatSection {
|
|
||||||
static {
|
|
||||||
GObject.registerClass(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
#prevCpu = new GTop.glibtop_cpu();
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
super('processor-symbolic', _('CPU stats'));
|
|
||||||
}
|
|
||||||
|
|
||||||
_getLoadValue() {
|
|
||||||
const cpu = new GTop.glibtop_cpu();
|
|
||||||
GTop.glibtop_get_cpu(cpu);
|
|
||||||
|
|
||||||
const total = cpu.total - this.#prevCpu.total;
|
|
||||||
const user = cpu.user - this.#prevCpu.user;
|
|
||||||
const sys = cpu.sys - this.#prevCpu.sys;
|
|
||||||
const nice = cpu.nice - this.#prevCpu.nice;
|
|
||||||
|
|
||||||
this.#prevCpu = cpu;
|
|
||||||
|
|
||||||
return (user + sys + nice) / Math.max(total, 1.0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class MemSection extends LoadStatSection {
|
|
||||||
static {
|
|
||||||
GObject.registerClass(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
super('memory-symbolic', _('Memory stats'));
|
|
||||||
}
|
|
||||||
|
|
||||||
_getLoadValue() {
|
|
||||||
const mem = new GTop.glibtop_mem();
|
|
||||||
GTop.glibtop_get_mem(mem);
|
|
||||||
|
|
||||||
const {user, total} = mem;
|
|
||||||
return user / Math.max(total, 1.0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class SwapSection extends LoadStatSection {
|
|
||||||
static {
|
|
||||||
GObject.registerClass(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
super('swap-symbolic', _('Swap stats'));
|
|
||||||
}
|
|
||||||
|
|
||||||
_getLoadValue() {
|
|
||||||
const swap = new GTop.glibtop_swap();
|
|
||||||
GTop.glibtop_get_swap(swap);
|
|
||||||
|
|
||||||
const {used, total} = swap;
|
|
||||||
return used / Math.max(total, 1.0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class NetStatSection extends StatSection {
|
|
||||||
static {
|
|
||||||
GObject.registerClass(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
#formats = [{
|
|
||||||
factor: 1000,
|
|
||||||
formatter: new Intl.NumberFormat(undefined, {
|
|
||||||
style: 'unit',
|
|
||||||
unit: 'kilobyte',
|
|
||||||
maximumFractionDigits: 1,
|
|
||||||
minimumFractionDigits: 1,
|
|
||||||
}),
|
|
||||||
}, {
|
|
||||||
factor: 1000 * 10,
|
|
||||||
formatter: new Intl.NumberFormat(undefined, {
|
|
||||||
style: 'unit',
|
|
||||||
unit: 'kilobyte',
|
|
||||||
maximumFractionDigits: 0,
|
|
||||||
}),
|
|
||||||
}, {
|
|
||||||
factor: 1000 * 1000,
|
|
||||||
formatter: new Intl.NumberFormat(undefined, {
|
|
||||||
style: 'unit',
|
|
||||||
unit: 'megabyte',
|
|
||||||
maximumFractionDigits: 1,
|
|
||||||
minimumFractionDigits: 1,
|
|
||||||
}),
|
|
||||||
}, {
|
|
||||||
factor: 1000 * 1000 * 10,
|
|
||||||
formatter: new Intl.NumberFormat(undefined, {
|
|
||||||
style: 'unit',
|
|
||||||
unit: 'megabyte',
|
|
||||||
maximumFractionDigits: 0,
|
|
||||||
}),
|
|
||||||
}, {
|
|
||||||
factor: 1000 * 1000 * 1000,
|
|
||||||
formatter: new Intl.NumberFormat(undefined, {
|
|
||||||
style: 'unit',
|
|
||||||
unit: 'gigabyte',
|
|
||||||
maximumFractionDigits: 1,
|
|
||||||
minimumFractionDigits: 1,
|
|
||||||
}),
|
|
||||||
}, {
|
|
||||||
factor: 1000 * 1000 * 1000 * 10,
|
|
||||||
formatter: new Intl.NumberFormat(undefined, {
|
|
||||||
style: 'unit',
|
|
||||||
unit: 'gigabyte',
|
|
||||||
maximumFractionDigits: 0,
|
|
||||||
}),
|
|
||||||
}, {
|
|
||||||
factor: 1000 * 1000 * 1000 * 1000,
|
|
||||||
formatter: new Intl.NumberFormat(undefined, {
|
|
||||||
style: 'unit',
|
|
||||||
unit: 'terabyte',
|
|
||||||
maximumFractionDigits: 1,
|
|
||||||
minimumFractionDigits: 1,
|
|
||||||
}),
|
|
||||||
}, {
|
|
||||||
factor: 1000 * 1000 * 1000 * 1000 * 10,
|
|
||||||
formatter: new Intl.NumberFormat(undefined, {
|
|
||||||
style: 'unit',
|
|
||||||
unit: 'terabyte',
|
|
||||||
maximumFractionDigits: 0,
|
|
||||||
}),
|
|
||||||
}, {
|
|
||||||
factor: 1000 * 1000 * 1000 * 1000 * 1000,
|
|
||||||
formatter: new Intl.NumberFormat(undefined, {
|
|
||||||
style: 'unit',
|
|
||||||
unit: 'petabyte',
|
|
||||||
maximumFractionDigits: 1,
|
|
||||||
minimumFractionDigits: 1,
|
|
||||||
}),
|
|
||||||
}];
|
|
||||||
|
|
||||||
#lastBytes = 0;
|
|
||||||
#lastHash = 0;
|
|
||||||
#lastTime = 0;
|
|
||||||
|
|
||||||
_getBytes(_netload) {
|
|
||||||
}
|
|
||||||
|
|
||||||
_getFormat(bytes) {
|
|
||||||
for (let i = 1; i < this.#formats.length; i++) {
|
|
||||||
if (bytes < this.#formats.at(i).factor)
|
|
||||||
return this.#formats.at(i - 1);
|
|
||||||
}
|
|
||||||
return this.#formats.at(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
_update() {
|
|
||||||
const FLAG_LOOPBACK = 1 << 4; // GTop sucks
|
|
||||||
|
|
||||||
const netlist = new GTop.glibtop_netlist();
|
|
||||||
const ifnames = GTop.glibtop_get_netlist(netlist);
|
|
||||||
|
|
||||||
let bytes = 0;
|
|
||||||
let hash = 1n;
|
|
||||||
|
|
||||||
for (const ifname of ifnames) {
|
|
||||||
const netload = new GTop.glibtop_netload();
|
|
||||||
GTop.glibtop_get_netload(netload, ifname);
|
|
||||||
|
|
||||||
if (netload.if_flags & FLAG_LOOPBACK)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
bytes += this._getBytes(netload);
|
|
||||||
hash += strHash(ifname);
|
|
||||||
}
|
|
||||||
|
|
||||||
const time = GLib.get_monotonic_time();
|
|
||||||
|
|
||||||
let dbytes = 0;
|
|
||||||
|
|
||||||
// Skip calculation if new data is less than old (interface
|
|
||||||
// removed, counters reset, ...) or if it is the first time
|
|
||||||
if (bytes >= this.#lastBytes &&
|
|
||||||
hash === this.#lastHash &&
|
|
||||||
this.#lastTime !== 0) {
|
|
||||||
const dtime = (time - this.#lastTime) / GLib.USEC_PER_SEC;
|
|
||||||
dbytes = (bytes - this.#lastBytes) / dtime;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.#lastBytes = bytes;
|
|
||||||
this.#lastTime = time;
|
|
||||||
this.#lastHash = hash;
|
|
||||||
|
|
||||||
const {factor, formatter} = this._getFormat(dbytes);
|
|
||||||
this.label.text = formatter.format(dbytes / factor);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class UploadSection extends NetStatSection {
|
|
||||||
static {
|
|
||||||
GObject.registerClass(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
super('upload-symbolic', _('Upload stats'));
|
|
||||||
}
|
|
||||||
|
|
||||||
_getBytes(netload) {
|
|
||||||
return netload.bytes_out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class DownloadSection extends NetStatSection {
|
|
||||||
static {
|
|
||||||
GObject.registerClass(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
super('download-symbolic', _('Download stats'));
|
|
||||||
}
|
|
||||||
|
|
||||||
_getBytes(netload) {
|
|
||||||
return netload.bytes_in;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Indicator extends PanelMenu.Button {
|
|
||||||
static {
|
|
||||||
GObject.registerClass(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor(settings) {
|
|
||||||
super(0.5, _('System stats'));
|
|
||||||
|
|
||||||
this._settings = settings;
|
|
||||||
this.connect('destroy',
|
|
||||||
() => (this._settings = null));
|
|
||||||
|
|
||||||
const box = new St.BoxLayout({
|
|
||||||
styleClass: 'system-monitor-stat-sections',
|
|
||||||
});
|
|
||||||
|
|
||||||
this.add_child(box);
|
|
||||||
|
|
||||||
this._placeholder = new St.Icon({
|
|
||||||
styleClass: 'system-status-icon system-monitor-placeholder',
|
|
||||||
});
|
|
||||||
box.add_child(this._placeholder);
|
|
||||||
|
|
||||||
this._cpuSection = new CpuSection();
|
|
||||||
this._settings.bind('show-cpu',
|
|
||||||
this._cpuSection, 'visible',
|
|
||||||
Gio.SettingsBindFlags.GET);
|
|
||||||
box.add_child(this._cpuSection);
|
|
||||||
|
|
||||||
this._memSection = new MemSection();
|
|
||||||
this._settings.bind('show-memory',
|
|
||||||
this._memSection, 'visible',
|
|
||||||
Gio.SettingsBindFlags.GET);
|
|
||||||
box.add_child(this._memSection);
|
|
||||||
|
|
||||||
this._swapSection = new SwapSection();
|
|
||||||
this._settings.bind('show-swap',
|
|
||||||
this._swapSection, 'visible',
|
|
||||||
Gio.SettingsBindFlags.GET);
|
|
||||||
box.add_child(this._swapSection);
|
|
||||||
|
|
||||||
this._ulSection = new UploadSection();
|
|
||||||
this._settings.bind('show-upload',
|
|
||||||
this._ulSection, 'visible',
|
|
||||||
Gio.SettingsBindFlags.GET);
|
|
||||||
box.add_child(this._ulSection);
|
|
||||||
|
|
||||||
this._dlSection = new DownloadSection();
|
|
||||||
this._settings.bind('show-download',
|
|
||||||
this._dlSection, 'visible',
|
|
||||||
Gio.SettingsBindFlags.GET);
|
|
||||||
box.add_child(this._dlSection);
|
|
||||||
|
|
||||||
this.menu.addMenuItem(
|
|
||||||
new PopupMenu.PopupSeparatorMenuItem(_('Show')));
|
|
||||||
|
|
||||||
this._cpuItem = this.menu.addAction(_('CPU'),
|
|
||||||
() => this._toggleSettings('show-cpu'));
|
|
||||||
this._memItem = this.menu.addAction(_('Memory'),
|
|
||||||
() => this._toggleSettings('show-memory'));
|
|
||||||
this._swapItem = this.menu.addAction(_('Swap'),
|
|
||||||
() => this._toggleSettings('show-swap'));
|
|
||||||
this._ulItem = this.menu.addAction(_('Upload'),
|
|
||||||
() => this._toggleSettings('show-upload'));
|
|
||||||
this._dlItem = this.menu.addAction(_('Download'),
|
|
||||||
() => this._toggleSettings('show-download'));
|
|
||||||
|
|
||||||
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
|
||||||
|
|
||||||
this._appMenuItem = this.menu.addAction(_('Open System Monitor'),
|
|
||||||
() => this._openSystemMonitor());
|
|
||||||
|
|
||||||
const appSystem = Shell.AppSystem.get_default();
|
|
||||||
appSystem.connectObject('installed-changed',
|
|
||||||
() => this._updateSystemMonitorApp(), this);
|
|
||||||
this._updateSystemMonitorApp();
|
|
||||||
|
|
||||||
this._settings.connectObject('changed',
|
|
||||||
() => this._sync(), this);
|
|
||||||
this._sync();
|
|
||||||
}
|
|
||||||
|
|
||||||
_updateSystemMonitorApp() {
|
|
||||||
const appSystem = Shell.AppSystem.get_default();
|
|
||||||
this._systemMonitorApp =
|
|
||||||
appSystem.lookup_app('gnome-system-monitor.desktop');
|
|
||||||
this._placeholder.gicon = this._systemMonitorApp?.icon ?? null;
|
|
||||||
this.visible = this._systemMonitorApp != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
_openSystemMonitor() {
|
|
||||||
this._systemMonitorApp.activate();
|
|
||||||
Main.overview.hide();
|
|
||||||
}
|
|
||||||
|
|
||||||
_toggleSettings(key) {
|
|
||||||
this._settings.set_boolean(key, !this._settings.get_boolean(key));
|
|
||||||
}
|
|
||||||
|
|
||||||
_sync() {
|
|
||||||
this._cpuItem.setOrnament(this._settings.get_boolean('show-cpu')
|
|
||||||
? PopupMenu.Ornament.CHECK
|
|
||||||
: PopupMenu.Ornament.NONE);
|
|
||||||
this._memItem.setOrnament(this._settings.get_boolean('show-memory')
|
|
||||||
? PopupMenu.Ornament.CHECK
|
|
||||||
: PopupMenu.Ornament.NONE);
|
|
||||||
this._swapItem.setOrnament(this._settings.get_boolean('show-swap')
|
|
||||||
? PopupMenu.Ornament.CHECK
|
|
||||||
: PopupMenu.Ornament.NONE);
|
|
||||||
this._ulItem.setOrnament(this._settings.get_boolean('show-upload')
|
|
||||||
? PopupMenu.Ornament.CHECK
|
|
||||||
: PopupMenu.Ornament.NONE);
|
|
||||||
this._dlItem.setOrnament(this._settings.get_boolean('show-download')
|
|
||||||
? PopupMenu.Ornament.CHECK
|
|
||||||
: PopupMenu.Ornament.NONE);
|
|
||||||
|
|
||||||
this._placeholder.visible =
|
|
||||||
this._settings.list_keys().every(key => !this._settings.get_boolean(key));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default class SystemMonitorExtension extends Extension {
|
|
||||||
enable() {
|
|
||||||
this._indicator = new Indicator(this.getSettings());
|
|
||||||
Main.panel.addToStatusArea(this.uuid, this._indicator);
|
|
||||||
}
|
|
||||||
|
|
||||||
disable() {
|
|
||||||
this._indicator.destroy();
|
|
||||||
this._indicator = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
||||||
<filter id="a" height="100%" width="100%" x="0%" y="0%">
|
|
||||||
<feColorMatrix color-interpolation-filters="sRGB" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"/>
|
|
||||||
</filter>
|
|
||||||
<mask id="b">
|
|
||||||
<g filter="url(#a)">
|
|
||||||
<path d="m -1.6 -1.6 h 19.2 v 19.2 h -19.2 z" fill-opacity="0.5"/>
|
|
||||||
</g>
|
|
||||||
</mask>
|
|
||||||
<clipPath id="c">
|
|
||||||
<path d="m 0 0 h 1600 v 1200 h -1600 z"/>
|
|
||||||
</clipPath>
|
|
||||||
<mask id="d">
|
|
||||||
<g filter="url(#a)">
|
|
||||||
<path d="m -1.6 -1.6 h 19.2 v 19.2 h -19.2 z" fill-opacity="0.7"/>
|
|
||||||
</g>
|
|
||||||
</mask>
|
|
||||||
<clipPath id="e">
|
|
||||||
<path d="m 0 0 h 1600 v 1200 h -1600 z"/>
|
|
||||||
</clipPath>
|
|
||||||
<mask id="f">
|
|
||||||
<g filter="url(#a)">
|
|
||||||
<path d="m -1.6 -1.6 h 19.2 v 19.2 h -19.2 z" fill-opacity="0.35"/>
|
|
||||||
</g>
|
|
||||||
</mask>
|
|
||||||
<clipPath id="g">
|
|
||||||
<path d="m 0 0 h 1600 v 1200 h -1600 z"/>
|
|
||||||
</clipPath>
|
|
||||||
<g mask="url(#b)">
|
|
||||||
<g clip-path="url(#c)" transform="matrix(1 0 0 1 -920 -120)">
|
|
||||||
<path d="m 550 182 c -0.351562 0.003906 -0.695312 0.101562 -1 0.28125 v 3.4375 c 0.304688 0.179688 0.648438 0.277344 1 0.28125 c 1.105469 0 2 -0.894531 2 -2 s -0.894531 -2 -2 -2 z m 0 5 c -0.339844 0 -0.679688 0.058594 -1 0.175781 v 6.824219 h 4 v -4 c 0 -1.65625 -1.34375 -3 -3 -3 z m 0 0"/>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
<g mask="url(#d)">
|
|
||||||
<g clip-path="url(#e)" transform="matrix(1 0 0 1 -920 -120)">
|
|
||||||
<path d="m 569 182 v 4 c 1.105469 0 2 -0.894531 2 -2 s -0.894531 -2 -2 -2 z m 0 5 v 7 h 3 v -4 c 0 -1.65625 -1.34375 -3 -3 -3 z m 0 0"/>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
<g mask="url(#f)">
|
|
||||||
<g clip-path="url(#g)" transform="matrix(1 0 0 1 -920 -120)">
|
|
||||||
<path d="m 573 182.269531 v 3.449219 c 0.613281 -0.355469 0.996094 -1.007812 1 -1.71875 c 0 -0.714844 -0.382812 -1.375 -1 -1.730469 z m 0 4.90625 v 6.824219 h 2 v -4 c 0 -1.269531 -0.800781 -2.402344 -2 -2.824219 z m 0 0"/>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
<path d="m 7.984375 1 c -0.550781 0 -1 0.449219 -1 1 v 8.585938 l -2.292969 -2.292969 c -0.1875 -0.1875 -0.441406 -0.292969 -0.707031 -0.292969 s -0.519531 0.105469 -0.707031 0.292969 c -0.390625 0.390625 -0.390625 1.023437 0 1.414062 l 4 4 c 0.390625 0.390625 1.023437 0.390625 1.414062 0 l 4 -4 c 0.390625 -0.390625 0.390625 -1.023437 0 -1.414062 s -1.023437 -0.390625 -1.414062 0 l -2.292969 2.292969 v -8.585938 c 0 -0.550781 -0.445313 -1 -1 -1 z m 0 0"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 2.5 KiB |
@@ -1,3 +0,0 @@
|
|||||||
SPDX-FileCopyrightText: Icon Development Kit
|
|
||||||
|
|
||||||
SPDX-License-Identifier: CC0-1.0
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" height="16px" viewBox="0 0 16 16" width="16px"><path d="m 3 2 c -1.660156 0 -3 1.339844 -3 3 v 4 c 0 1.660156 1.339844 3 3 3 h 10 c 1.660156 0 3 -1.339844 3 -3 v -4 c 0 -1.660156 -1.339844 -3 -3 -3 z m 0 2 h 10 c 0.554688 0 1 0.445312 1 1 v 4 c 0 0.554688 -0.445312 1 -1 1 h -10 c -0.554688 0 -1 -0.445312 -1 -1 v -4 c 0 -0.554688 0.445312 -1 1 -1 z m 0 0"/><path d="m 2 10 h 12 v 4 h -12 z m 0 0"/><g fill-opacity="0.501961"><path d="m 4 5 h 2 v 4 h -2 z m 0 0"/><path d="m 7 5 h 2 v 4 h -2 z m 0 0"/><path d="m 10 5 h 2 v 4 h -2 z m 0 0"/></g></svg>
|
|
||||||
|
Before Width: | Height: | Size: 631 B |
@@ -1,3 +0,0 @@
|
|||||||
SPDX-FileCopyrightText: Icon Development Kit
|
|
||||||
|
|
||||||
SPDX-License-Identifier: CC0-1.0
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" height="16px" viewBox="0 0 16 16" width="16px"><path d="m 5 5 h 6 v 6 h -6 z m 0 0"/><path d="m 13 5 h 3 v 1 h -3 z m 0 0"/><path d="m 13 7 h 3 v 1 h -3 z m 0 0"/><path d="m 13 9 h 3 v 1 h -3 z m 0 0"/><path d="m 0 6 h 3 v 1 h -3 z m 0 0"/><path d="m 0 8 h 3 v 1 h -3 z m 0 0"/><path d="m 0 10 h 3 v 1 h -3 z m 0 0"/><path d="m 5 0 h 1 v 3 h -1 z m 0 0"/><path d="m 7 0 h 1 v 3 h -1 z m 0 0"/><path d="m 9 0 h 1 v 3 h -1 z m 0 0"/><path d="m 10 13 h 1 v 3 h -1 z m 0 0"/><path d="m 8 13 h 1 v 3 h -1 z m 0 0"/><path d="m 6 13 h 1 v 3 h -1 z m 0 0"/><path d="m 5 2 c -1.644531 0 -3 1.355469 -3 3 v 6 c 0 1.644531 1.355469 3 3 3 h 6 c 1.644531 0 3 -1.355469 3 -3 v -6 c 0 -1.644531 -1.355469 -3 -3 -3 z m 0 2 h 6 c 0.570312 0 1 0.429688 1 1 v 6 c 0 0.570312 -0.429688 1 -1 1 h -6 c -0.570312 0 -1 -0.429688 -1 -1 v -6 c 0 -0.570312 0.429688 -1 1 -1 z m 0 0"/></svg>
|
|
||||||
|
Before Width: | Height: | Size: 943 B |
@@ -1,3 +0,0 @@
|
|||||||
SPDX-FileCopyrightText: Icon Development Kit
|
|
||||||
|
|
||||||
SPDX-License-Identifier: CC0-1.0
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" height="16px" viewBox="0 0 16 16" width="16px"><path d="m 5 7 c -0.308594 0 -0.613281 0.089844 -0.8125 0.28125 l -3.59375 3.71875 l 3.65625 3.71875 c 0.199219 0.191406 0.441406 0.28125 0.75 0.28125 h 1 v -1 c 0 -0.257812 -0.128906 -0.527344 -0.3125 -0.71875 l -1.28125 -1.28125 h 4.59375 c 0.527344 0.007812 1 -0.472656 1 -1 s -0.472656 -1.007812 -1 -1 h -4.625 l 1.21875 -1.28125 c 0.183594 -0.191406 0.40625 -0.460938 0.40625 -0.71875 v -1 z m 0 0"/><path d="m 11 9 c 0.308594 0 0.613281 -0.089844 0.8125 -0.28125 l 3.59375 -3.71875 l -3.65625 -3.71875 c -0.199219 -0.191406 -0.441406 -0.28125 -0.75 -0.28125 h -1 v 1 c 0 0.257812 0.128906 0.527344 0.3125 0.71875 l 1.28125 1.28125 h -4.59375 c -0.527344 -0.007812 -1 0.472656 -1 1 s 0.472656 1.007812 1 1 h 4.625 l -1.21875 1.28125 c -0.183594 0.191406 -0.40625 0.460938 -0.40625 0.71875 v 1 z m 0 0"/></svg>
|
|
||||||
|
Before Width: | Height: | Size: 941 B |
@@ -1,3 +0,0 @@
|
|||||||
SPDX-FileCopyrightText: Icon Development Kit
|
|
||||||
|
|
||||||
SPDX-License-Identifier: CC0-1.0
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
||||||
<filter id="a" height="100%" width="100%" x="0%" y="0%">
|
|
||||||
<feColorMatrix color-interpolation-filters="sRGB" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"/>
|
|
||||||
</filter>
|
|
||||||
<mask id="b">
|
|
||||||
<g filter="url(#a)">
|
|
||||||
<path d="m -1.6 -1.6 h 19.2 v 19.2 h -19.2 z" fill-opacity="0.5"/>
|
|
||||||
</g>
|
|
||||||
</mask>
|
|
||||||
<clipPath id="c">
|
|
||||||
<path d="m 0 0 h 1600 v 1200 h -1600 z"/>
|
|
||||||
</clipPath>
|
|
||||||
<mask id="d">
|
|
||||||
<g filter="url(#a)">
|
|
||||||
<path d="m -1.6 -1.6 h 19.2 v 19.2 h -19.2 z" fill-opacity="0.7"/>
|
|
||||||
</g>
|
|
||||||
</mask>
|
|
||||||
<clipPath id="e">
|
|
||||||
<path d="m 0 0 h 1600 v 1200 h -1600 z"/>
|
|
||||||
</clipPath>
|
|
||||||
<mask id="f">
|
|
||||||
<g filter="url(#a)">
|
|
||||||
<path d="m -1.6 -1.6 h 19.2 v 19.2 h -19.2 z" fill-opacity="0.35"/>
|
|
||||||
</g>
|
|
||||||
</mask>
|
|
||||||
<clipPath id="g">
|
|
||||||
<path d="m 0 0 h 1600 v 1200 h -1600 z"/>
|
|
||||||
</clipPath>
|
|
||||||
<g mask="url(#b)">
|
|
||||||
<g clip-path="url(#c)" transform="matrix(1 0 0 1 -900 -120)">
|
|
||||||
<path d="m 550 182 c -0.351562 0.003906 -0.695312 0.101562 -1 0.28125 v 3.4375 c 0.304688 0.179688 0.648438 0.277344 1 0.28125 c 1.105469 0 2 -0.894531 2 -2 s -0.894531 -2 -2 -2 z m 0 5 c -0.339844 0 -0.679688 0.058594 -1 0.175781 v 6.824219 h 4 v -4 c 0 -1.65625 -1.34375 -3 -3 -3 z m 0 0"/>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
<g mask="url(#d)">
|
|
||||||
<g clip-path="url(#e)" transform="matrix(1 0 0 1 -900 -120)">
|
|
||||||
<path d="m 569 182 v 4 c 1.105469 0 2 -0.894531 2 -2 s -0.894531 -2 -2 -2 z m 0 5 v 7 h 3 v -4 c 0 -1.65625 -1.34375 -3 -3 -3 z m 0 0"/>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
<g mask="url(#f)">
|
|
||||||
<g clip-path="url(#g)" transform="matrix(1 0 0 1 -900 -120)">
|
|
||||||
<path d="m 573 182.269531 v 3.449219 c 0.613281 -0.355469 0.996094 -1.007812 1 -1.71875 c 0 -0.714844 -0.382812 -1.375 -1 -1.730469 z m 0 4.90625 v 6.824219 h 2 v -4 c 0 -1.269531 -0.800781 -2.402344 -2 -2.824219 z m 0 0"/>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
<path d="m 8.015625 15 c 0.550781 0 1 -0.449219 1 -1 v -8.585938 l 2.292969 2.292969 c 0.1875 0.1875 0.441406 0.292969 0.707031 0.292969 s 0.519531 -0.105469 0.707031 -0.292969 c 0.390625 -0.390625 0.390625 -1.023437 0 -1.414062 l -4 -4 c -0.390625 -0.390625 -1.023437 -0.390625 -1.414062 0 l -4 4 c -0.390625 0.390625 -0.390625 1.023437 0 1.414062 s 1.023437 0.390625 1.414062 0 l 2.292969 -2.292969 v 8.585938 c 0 0.550781 0.445313 1 1 1 z m 0 0"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 2.5 KiB |
@@ -1,3 +0,0 @@
|
|||||||
SPDX-FileCopyrightText: Icon Development Kit
|
|
||||||
|
|
||||||
SPDX-License-Identifier: CC0-1.0
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2017 Florian Müllner <fmuellner@gnome.org>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
|
|
||||||
extension_data += configure_file(
|
|
||||||
input: metadata_name + '.in',
|
|
||||||
output: metadata_name,
|
|
||||||
configuration: metadata_conf
|
|
||||||
)
|
|
||||||
|
|
||||||
extension_data += files('stylesheet.css')
|
|
||||||
extension_schemas += files('schemas/' + metadata_conf.get('gschemaname') + '.gschema.xml')
|
|
||||||
|
|
||||||
install_subdir('icons', install_dir: join_paths(extensiondir, uuid))
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"extension-id": "@extension_id@",
|
|
||||||
"uuid": "@uuid@",
|
|
||||||
"settings-schema": "@gschemaname@",
|
|
||||||
"gettext-domain": "@gettext_domain@",
|
|
||||||
"name": "System Monitor",
|
|
||||||
"description": "Monitor system from the top bar",
|
|
||||||
"shell-version": [ "@shell_current@" ],
|
|
||||||
"url": "@url@"
|
|
||||||
}
|
|
||||||
-31
@@ -1,31 +0,0 @@
|
|||||||
<!--
|
|
||||||
SPDX-FileCopyrightText: 2023 Florian Müllner <fmuellner@gnome.org>
|
|
||||||
|
|
||||||
SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
-->
|
|
||||||
|
|
||||||
<schemalist gettext-domain="gnome-shell-extensions">
|
|
||||||
<schema id="org.gnome.shell.extensions.system-monitor"
|
|
||||||
path="/org/gnome/shell/extensions/system-monitor/">
|
|
||||||
<key name="show-cpu" type="b">
|
|
||||||
<default>true</default>
|
|
||||||
<summary>Show CPU usage</summary>
|
|
||||||
</key>
|
|
||||||
<key name="show-memory" type="b">
|
|
||||||
<default>true</default>
|
|
||||||
<summary>Show memory usage</summary>
|
|
||||||
</key>
|
|
||||||
<key name="show-swap" type="b">
|
|
||||||
<default>true</default>
|
|
||||||
<summary>Show swap usage</summary>
|
|
||||||
</key>
|
|
||||||
<key name="show-upload" type="b">
|
|
||||||
<default>true</default>
|
|
||||||
<summary>Show upload</summary>
|
|
||||||
</key>
|
|
||||||
<key name="show-download" type="b">
|
|
||||||
<default>true</default>
|
|
||||||
<summary>Show download</summary>
|
|
||||||
</key>
|
|
||||||
</schema>
|
|
||||||
</schemalist>
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
/*
|
|
||||||
* SPDX-FileCopyrightText: 2023 Florian Müllner <fmuellner@gnome.org>
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
*/
|
|
||||||
|
|
||||||
.system-monitor-stat-section {
|
|
||||||
padding: 0 6px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.system-monitor-stat-section-icon {icon-size: 1.08em;}
|
|
||||||
.system-monitor-stat-section-label {
|
|
||||||
min-width: 3.0em;
|
|
||||||
font-size: 0.9em;
|
|
||||||
}
|
|
||||||
.system-monitor-placeholder {-st-icon-style: symbolic;}
|
|
||||||
|
|
||||||
.panel-button .high-usage {color: #ff7800;}
|
|
||||||
@@ -21,13 +21,12 @@ const SETTINGS_KEY = 'name';
|
|||||||
export default class ThemeManager extends Extension {
|
export default class ThemeManager extends Extension {
|
||||||
enable() {
|
enable() {
|
||||||
this._settings = this.getSettings();
|
this._settings = this.getSettings();
|
||||||
this._settings.connectObject(`changed::${SETTINGS_KEY}`,
|
this._settings.connect(`changed::${SETTINGS_KEY}`, this._changeTheme.bind(this));
|
||||||
this._changeTheme.bind(this), this);
|
|
||||||
this._changeTheme();
|
this._changeTheme();
|
||||||
}
|
}
|
||||||
|
|
||||||
disable() {
|
disable() {
|
||||||
this._settings?.disconnectObject();
|
this._settings?.run_dispose();
|
||||||
this._settings = null;
|
this._settings = null;
|
||||||
|
|
||||||
Main.setThemeStylesheet(null);
|
Main.setThemeStylesheet(null);
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ class UserThemePrefsWidget extends Adw.PreferencesGroup {
|
|||||||
this._actionGroup.add_action(
|
this._actionGroup.add_action(
|
||||||
this._settings.create_action('name'));
|
this._settings.create_action('name'));
|
||||||
|
|
||||||
this.connect('destroy', () => (this._settings = null));
|
this.connect('destroy', () => this._settings.run_dispose());
|
||||||
|
|
||||||
this._rows = new Map();
|
this._rows = new Map();
|
||||||
this._addTheme(''); // default
|
this._addTheme(''); // default
|
||||||
|
|||||||
@@ -17,8 +17,10 @@ import {Extension, gettext as _} from 'resource:///org/gnome/shell/extensions/ex
|
|||||||
|
|
||||||
import * as DND from 'resource:///org/gnome/shell/ui/dnd.js';
|
import * as DND from 'resource:///org/gnome/shell/ui/dnd.js';
|
||||||
import * as Main from 'resource:///org/gnome/shell/ui/main.js';
|
import * as Main from 'resource:///org/gnome/shell/ui/main.js';
|
||||||
|
import * as Overview from 'resource:///org/gnome/shell/ui/overview.js';
|
||||||
import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js';
|
import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js';
|
||||||
|
|
||||||
|
import {WindowPicker, WindowPickerToggle} from './windowPicker.js';
|
||||||
import {WorkspaceIndicator} from './workspaceIndicator.js';
|
import {WorkspaceIndicator} from './workspaceIndicator.js';
|
||||||
|
|
||||||
const ICON_TEXTURE_SIZE = 24;
|
const ICON_TEXTURE_SIZE = 24;
|
||||||
@@ -121,10 +123,10 @@ class WindowTitle extends St.BoxLayout {
|
|||||||
this._metaWindow = metaWindow;
|
this._metaWindow = metaWindow;
|
||||||
|
|
||||||
this._icon = new St.Bin({style_class: 'window-button-icon'});
|
this._icon = new St.Bin({style_class: 'window-button-icon'});
|
||||||
this.add_child(this._icon);
|
this.add(this._icon);
|
||||||
this.label_actor = new St.Label({y_align: Clutter.ActorAlign.CENTER});
|
this.label_actor = new St.Label({y_align: Clutter.ActorAlign.CENTER});
|
||||||
this.label_actor.clutter_text.single_line_mode = true;
|
this.label_actor.clutter_text.single_line_mode = true;
|
||||||
this.add_child(this.label_actor);
|
this.add(this.label_actor);
|
||||||
|
|
||||||
this._textureCache = St.TextureCache.get_default();
|
this._textureCache = St.TextureCache.get_default();
|
||||||
this._textureCache.connectObject('icon-theme-changed',
|
this._textureCache.connectObject('icon-theme-changed',
|
||||||
@@ -410,7 +412,7 @@ class WindowButton extends BaseButton {
|
|||||||
this._onMenuStateChanged.bind(this));
|
this._onMenuStateChanged.bind(this));
|
||||||
this._contextMenu.actor.hide();
|
this._contextMenu.actor.hide();
|
||||||
this._contextMenuManager.addMenu(this._contextMenu);
|
this._contextMenuManager.addMenu(this._contextMenu);
|
||||||
Main.uiGroup.add_child(this._contextMenu.actor);
|
Main.uiGroup.add_actor(this._contextMenu.actor);
|
||||||
|
|
||||||
global.display.connectObject('notify::focus-window',
|
global.display.connectObject('notify::focus-window',
|
||||||
() => this._updateStyle(), this);
|
() => this._updateStyle(), this);
|
||||||
@@ -536,25 +538,25 @@ class AppButton extends BaseButton {
|
|||||||
this._singleWindowTitle = new St.Bin({
|
this._singleWindowTitle = new St.Bin({
|
||||||
x_expand: true,
|
x_expand: true,
|
||||||
});
|
});
|
||||||
stack.add_child(this._singleWindowTitle);
|
stack.add_actor(this._singleWindowTitle);
|
||||||
|
|
||||||
this._multiWindowTitle = new St.BoxLayout({
|
this._multiWindowTitle = new St.BoxLayout({
|
||||||
style_class: 'window-button-box',
|
style_class: 'window-button-box',
|
||||||
x_expand: true,
|
x_expand: true,
|
||||||
});
|
});
|
||||||
stack.add_child(this._multiWindowTitle);
|
stack.add_actor(this._multiWindowTitle);
|
||||||
|
|
||||||
this._icon = new St.Bin({
|
this._icon = new St.Bin({
|
||||||
style_class: 'window-button-icon',
|
style_class: 'window-button-icon',
|
||||||
child: app.create_icon_texture(ICON_TEXTURE_SIZE),
|
child: app.create_icon_texture(ICON_TEXTURE_SIZE),
|
||||||
});
|
});
|
||||||
this._multiWindowTitle.add_child(this._icon);
|
this._multiWindowTitle.add(this._icon);
|
||||||
|
|
||||||
let label = new St.Label({
|
let label = new St.Label({
|
||||||
text: app.get_name(),
|
text: app.get_name(),
|
||||||
y_align: Clutter.ActorAlign.CENTER,
|
y_align: Clutter.ActorAlign.CENTER,
|
||||||
});
|
});
|
||||||
this._multiWindowTitle.add_child(label);
|
this._multiWindowTitle.add(label);
|
||||||
this._multiWindowTitle.label_actor = label;
|
this._multiWindowTitle.label_actor = label;
|
||||||
|
|
||||||
this._menuManager = new PopupMenu.PopupMenuManager(this);
|
this._menuManager = new PopupMenu.PopupMenuManager(this);
|
||||||
@@ -564,13 +566,13 @@ class AppButton extends BaseButton {
|
|||||||
this._menu.actor.hide();
|
this._menu.actor.hide();
|
||||||
this._menu.connect('activate', this._onMenuActivate.bind(this));
|
this._menu.connect('activate', this._onMenuActivate.bind(this));
|
||||||
this._menuManager.addMenu(this._menu);
|
this._menuManager.addMenu(this._menu);
|
||||||
Main.uiGroup.add_child(this._menu.actor);
|
Main.uiGroup.add_actor(this._menu.actor);
|
||||||
|
|
||||||
this._appContextMenu = new AppContextMenu(this);
|
this._appContextMenu = new AppContextMenu(this);
|
||||||
this._appContextMenu.connect('open-state-changed',
|
this._appContextMenu.connect('open-state-changed',
|
||||||
this._onMenuStateChanged.bind(this));
|
this._onMenuStateChanged.bind(this));
|
||||||
this._appContextMenu.actor.hide();
|
this._appContextMenu.actor.hide();
|
||||||
Main.uiGroup.add_child(this._appContextMenu.actor);
|
Main.uiGroup.add_actor(this._appContextMenu.actor);
|
||||||
|
|
||||||
this._textureCache = St.TextureCache.get_default();
|
this._textureCache = St.TextureCache.get_default();
|
||||||
this._textureCache.connectObject('icon-theme-changed', () => {
|
this._textureCache.connectObject('icon-theme-changed', () => {
|
||||||
@@ -635,7 +637,7 @@ class AppButton extends BaseButton {
|
|||||||
this._windowContextMenu = new WindowContextMenu(this, this.metaWindow);
|
this._windowContextMenu = new WindowContextMenu(this, this.metaWindow);
|
||||||
this._windowContextMenu.connect(
|
this._windowContextMenu.connect(
|
||||||
'open-state-changed', this._onMenuStateChanged.bind(this));
|
'open-state-changed', this._onMenuStateChanged.bind(this));
|
||||||
Main.uiGroup.add_child(this._windowContextMenu.actor);
|
Main.uiGroup.add_actor(this._windowContextMenu.actor);
|
||||||
this._windowContextMenu.actor.hide();
|
this._windowContextMenu.actor.hide();
|
||||||
this._contextMenuManager.addMenu(this._windowContextMenu);
|
this._contextMenuManager.addMenu(this._windowContextMenu);
|
||||||
}
|
}
|
||||||
@@ -680,7 +682,7 @@ class AppButton extends BaseButton {
|
|||||||
for (let i = 0; i < windows.length; i++) {
|
for (let i = 0; i < windows.length; i++) {
|
||||||
let windowTitle = new WindowTitle(windows[i]);
|
let windowTitle = new WindowTitle(windows[i]);
|
||||||
let item = new PopupMenu.PopupBaseMenuItem();
|
let item = new PopupMenu.PopupBaseMenuItem();
|
||||||
item.add_child(windowTitle);
|
item.add_actor(windowTitle);
|
||||||
item._window = windows[i];
|
item._window = windows[i];
|
||||||
this._menu.addMenuItem(item);
|
this._menu.addMenuItem(item);
|
||||||
}
|
}
|
||||||
@@ -726,7 +728,13 @@ class WindowList extends St.Widget {
|
|||||||
this._monitor = monitor;
|
this._monitor = monitor;
|
||||||
|
|
||||||
let box = new St.BoxLayout({x_expand: true, y_expand: true});
|
let box = new St.BoxLayout({x_expand: true, y_expand: true});
|
||||||
this.add_child(box);
|
this.add_actor(box);
|
||||||
|
|
||||||
|
let toggle = new WindowPickerToggle();
|
||||||
|
box.add_actor(toggle);
|
||||||
|
|
||||||
|
toggle.connect('notify::checked',
|
||||||
|
this._updateWindowListVisibility.bind(this));
|
||||||
|
|
||||||
let layout = new Clutter.BoxLayout({homogeneous: true});
|
let layout = new Clutter.BoxLayout({homogeneous: true});
|
||||||
this._windowList = new St.Widget({
|
this._windowList = new St.Widget({
|
||||||
@@ -747,7 +755,7 @@ class WindowList extends St.Widget {
|
|||||||
this._windowList.connect('scroll-event', this._onScrollEvent.bind(this));
|
this._windowList.connect('scroll-event', this._onScrollEvent.bind(this));
|
||||||
|
|
||||||
let indicatorsBox = new St.BoxLayout({x_align: Clutter.ActorAlign.END});
|
let indicatorsBox = new St.BoxLayout({x_align: Clutter.ActorAlign.END});
|
||||||
box.add_child(indicatorsBox);
|
box.add(indicatorsBox);
|
||||||
|
|
||||||
this._workspaceIndicator = new WorkspaceIndicator();
|
this._workspaceIndicator = new WorkspaceIndicator();
|
||||||
indicatorsBox.add_child(this._workspaceIndicator.container);
|
indicatorsBox.add_child(this._workspaceIndicator.container);
|
||||||
@@ -820,8 +828,8 @@ class WindowList extends St.Widget {
|
|||||||
}, this);
|
}, this);
|
||||||
|
|
||||||
this._windowSignals = new Map();
|
this._windowSignals = new Map();
|
||||||
global.display.connectObject(
|
this._windowCreatedId = global.display.connect(
|
||||||
'window-created', (dsp, win) => this._addWindow(win), this);
|
'window-created', (dsp, win) => this._addWindow(win));
|
||||||
|
|
||||||
Main.xdndHandler.connectObject(
|
Main.xdndHandler.connectObject(
|
||||||
'drag-begin', () => this._monitorDrag(),
|
'drag-begin', () => this._monitorDrag(),
|
||||||
@@ -836,8 +844,8 @@ class WindowList extends St.Widget {
|
|||||||
this._dndWindow = null;
|
this._dndWindow = null;
|
||||||
|
|
||||||
this._settings = settings;
|
this._settings = settings;
|
||||||
this._settings.connectObject('changed::grouping-mode',
|
this._settings.connect('changed::grouping-mode',
|
||||||
() => this._groupingModeChanged(), this);
|
() => this._groupingModeChanged());
|
||||||
this._grouped = undefined;
|
this._grouped = undefined;
|
||||||
this._groupingModeChanged();
|
this._groupingModeChanged();
|
||||||
}
|
}
|
||||||
@@ -875,6 +883,20 @@ class WindowList extends St.Widget {
|
|||||||
this._workspaceIndicator.visible = hasWorkspaces && workspacesOnMonitor;
|
this._workspaceIndicator.visible = hasWorkspaces && workspacesOnMonitor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_updateWindowListVisibility() {
|
||||||
|
const {windowPicker} = Extension.lookupByURL(import.meta.url);
|
||||||
|
const visible = !windowPicker.visible;
|
||||||
|
|
||||||
|
this._windowList.ease({
|
||||||
|
opacity: visible ? 255 : 0,
|
||||||
|
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
||||||
|
duration: Overview.ANIMATION_TIME,
|
||||||
|
});
|
||||||
|
|
||||||
|
this._windowList.reactive = visible;
|
||||||
|
this._windowList.get_children().forEach(c => (c.reactive = visible));
|
||||||
|
}
|
||||||
|
|
||||||
_getPreferredUngroupedWindowListWidth() {
|
_getPreferredUngroupedWindowListWidth() {
|
||||||
if (this._windowList.get_n_children() === 0)
|
if (this._windowList.get_n_children() === 0)
|
||||||
return this._windowList.get_preferred_width(-1)[1];
|
return this._windowList.get_preferred_width(-1)[1];
|
||||||
@@ -1070,8 +1092,7 @@ class WindowList extends St.Widget {
|
|||||||
|
|
||||||
this._stopMonitoringDrag();
|
this._stopMonitoringDrag();
|
||||||
|
|
||||||
this._settings.disconnectObject();
|
this._settings.run_dispose();
|
||||||
this._settings = null;
|
|
||||||
|
|
||||||
let windows = global.get_window_actors();
|
let windows = global.get_window_actors();
|
||||||
for (let i = 0; i < windows.length; i++)
|
for (let i = 0; i < windows.length; i++)
|
||||||
@@ -1084,6 +1105,7 @@ export default class WindowListExtension extends Extension {
|
|||||||
super(metadata);
|
super(metadata);
|
||||||
|
|
||||||
this._windowLists = null;
|
this._windowLists = null;
|
||||||
|
this._hideOverviewOrig = Main.overview.hide;
|
||||||
}
|
}
|
||||||
|
|
||||||
enable() {
|
enable() {
|
||||||
@@ -1096,6 +1118,13 @@ export default class WindowListExtension extends Extension {
|
|||||||
Main.layoutManager.connectObject('monitors-changed',
|
Main.layoutManager.connectObject('monitors-changed',
|
||||||
() => this._buildWindowLists(), this);
|
() => this._buildWindowLists(), this);
|
||||||
|
|
||||||
|
this.windowPicker = new WindowPicker();
|
||||||
|
|
||||||
|
Main.overview.hide = () => {
|
||||||
|
this.windowPicker.close();
|
||||||
|
this._hideOverviewOrig.call(Main.overview);
|
||||||
|
};
|
||||||
|
|
||||||
this._buildWindowLists();
|
this._buildWindowLists();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1115,15 +1144,19 @@ export default class WindowListExtension extends Extension {
|
|||||||
if (!this._windowLists)
|
if (!this._windowLists)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Main.layoutManager.disconnectObject(this);
|
|
||||||
this._settings.disconnectObject(this);
|
this._settings.disconnectObject(this);
|
||||||
this._settings = null;
|
Main.layoutManager.disconnectObject(this);
|
||||||
|
|
||||||
this._windowLists.forEach(windowList => {
|
this._windowLists.forEach(windowList => {
|
||||||
windowList.hide();
|
windowList.hide();
|
||||||
windowList.destroy();
|
windowList.destroy();
|
||||||
});
|
});
|
||||||
this._windowLists = null;
|
this._windowLists = null;
|
||||||
|
|
||||||
|
this.windowPicker.destroy();
|
||||||
|
delete this.windowPicker;
|
||||||
|
|
||||||
|
Main.overview.hide = this._hideOverviewOrig;
|
||||||
}
|
}
|
||||||
|
|
||||||
someWindowListContains(actor) {
|
someWindowListContains(actor) {
|
||||||
|
|||||||
@@ -12,5 +12,5 @@ extension_data += files(
|
|||||||
'stylesheet-light.css'
|
'stylesheet-light.css'
|
||||||
)
|
)
|
||||||
|
|
||||||
extension_sources += files('prefs.js', 'workspaceIndicator.js')
|
extension_sources += files('prefs.js', 'windowPicker.js', 'workspaceIndicator.js')
|
||||||
extension_schemas += files(metadata_conf.get('gschemaname') + '.gschema.xml')
|
extension_schemas += files(metadata_conf.get('gschemaname') + '.gschema.xml')
|
||||||
|
|||||||
@@ -6,111 +6,115 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
.window-list {
|
.window-list {
|
||||||
spacing: 2px;
|
spacing: 2px;
|
||||||
font-size: 10pt;
|
font-size: 10pt;
|
||||||
}
|
}
|
||||||
|
|
||||||
.bottom-panel {
|
.bottom-panel {
|
||||||
background-color: #000000;
|
background-color: #000000;
|
||||||
border-top-width: 0px;
|
border-top-width: 0px;
|
||||||
height: 2.45em;
|
padding: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.window-button {
|
.window-button {
|
||||||
padding: 4px, 3px;
|
padding: 2px, 1px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.window-button:first-child:ltr {
|
.window-button:first-child:ltr {
|
||||||
padding-left: 2px;
|
padding-left: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.window-button:last-child:rtl {
|
.window-button:last-child:rtl {
|
||||||
padding-right: 2px;
|
padding-right: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.window-button-box {
|
.window-button-box {
|
||||||
spacing: 4px;
|
spacing: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.window-button > StWidget,
|
||||||
|
.window-picker-toggle > StWidget {
|
||||||
|
color: #bbb;
|
||||||
|
background-color: #1d1d1d;
|
||||||
|
border-radius: 4px;
|
||||||
|
padding: 3px 6px 1px;
|
||||||
|
transition: 100ms ease;
|
||||||
}
|
}
|
||||||
|
|
||||||
.window-button > StWidget {
|
.window-button > StWidget {
|
||||||
color: #bbb;
|
-st-natural-width: 18.75em;
|
||||||
background-color: #1d1d1d;
|
max-width: 18.75em;
|
||||||
border-radius: 4px;
|
|
||||||
padding: 3px 6px 1px;
|
|
||||||
transition: 100ms ease;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.window-button > StWidget {
|
.window-button:hover > StWidget,
|
||||||
-st-natural-width: 18.75em;
|
.window-picker-toggle:hover > StWidget {
|
||||||
max-width: 18.75em;
|
color: #fff;
|
||||||
}
|
background-color: #303030;
|
||||||
|
|
||||||
.window-button:hover > StWidget {
|
|
||||||
color: #fff;
|
|
||||||
background-color: #303030;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.window-button:active > StWidget,
|
.window-button:active > StWidget,
|
||||||
.window-button:focus > StWidget {
|
.window-button:focus > StWidget {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
background-color: #3f3f3f;
|
background-color: #3f3f3f;
|
||||||
}
|
}
|
||||||
|
|
||||||
.window-button.focused > StWidget {
|
.window-button.focused > StWidget,
|
||||||
color: #fff;
|
.window-picker-toggle:checked > StWidget {
|
||||||
background-color: #3f3f3f;
|
color: #fff;
|
||||||
|
background-color: #3f3f3f;
|
||||||
}
|
}
|
||||||
|
|
||||||
.window-button.focused:active > StWidget {
|
.window-button.focused:active > StWidget,
|
||||||
color: #fff;
|
.window-picker-toggle:checked:active > StWidget {
|
||||||
background-color: #3f3f3f;
|
color: #fff;
|
||||||
|
background-color: #3f3f3f;
|
||||||
}
|
}
|
||||||
|
|
||||||
.window-button.minimized > StWidget {
|
.window-button.minimized > StWidget {
|
||||||
color: #666;
|
color: #666;
|
||||||
background-color: #161616;
|
background-color: #161616;
|
||||||
}
|
}
|
||||||
|
|
||||||
.window-button.minimized:active > StWidget {
|
.window-button.minimized:active > StWidget {
|
||||||
color: #666;
|
color: #666;
|
||||||
background-color: #161616;
|
background-color: #161616;
|
||||||
}
|
}
|
||||||
|
|
||||||
.window-button-icon {
|
.window-button-icon {
|
||||||
width: 24px;
|
width: 24px;
|
||||||
height: 24px;
|
height: 24px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.window-list-workspace-indicator .status-label-bin {
|
.window-list-workspace-indicator .status-label-bin {
|
||||||
background-color: rgba(200, 200, 200, 0.3);
|
background-color: rgba(200, 200, 200, 0.3);
|
||||||
padding: 5px;
|
padding: 0 3px;
|
||||||
margin: 3px;
|
margin: 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.window-list-workspace-indicator .workspaces-box {
|
.window-list-workspace-indicator .workspaces-box {
|
||||||
spacing: 3px;
|
spacing: 3px;
|
||||||
padding: 5px;
|
padding: 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.window-list-workspace-indicator .workspace {
|
.window-list-workspace-indicator .workspace {
|
||||||
width: 52px;
|
width: 52px;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
background-color: #1e1e1e;
|
background-color: #1e1e1e;
|
||||||
}
|
}
|
||||||
|
|
||||||
.window-list-workspace-indicator .workspace.active {
|
.window-list-workspace-indicator .workspace.active {
|
||||||
background-color: #3f3f3f;
|
background-color: #3f3f3f;
|
||||||
}
|
}
|
||||||
|
|
||||||
.window-list-window-preview {
|
.window-list-window-preview {
|
||||||
background-color: #bebebe;
|
background-color: #bebebe;
|
||||||
border-radius: 1px;
|
border-radius: 1px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.window-list-window-preview.active {
|
.window-list-window-preview.active {
|
||||||
background-color: #d4d4d4;
|
background-color: #d4d4d4;
|
||||||
}
|
}
|
||||||
|
|
||||||
.notification {
|
.notification {
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,10 +10,12 @@
|
|||||||
#panel.bottom-panel {
|
#panel.bottom-panel {
|
||||||
border-top-width: 1px;
|
border-top-width: 1px;
|
||||||
border-bottom-width: 0px;
|
border-bottom-width: 0px;
|
||||||
height: 2.5em;
|
height: 2.25em ;
|
||||||
|
padding: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.bottom-panel .window-button > StWidget {
|
.bottom-panel .window-button > StWidget,
|
||||||
|
.bottom-panel .window-picker-toggle > StWidget {
|
||||||
color: #2e3436;
|
color: #2e3436;
|
||||||
background-color: #eee;
|
background-color: #eee;
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
@@ -28,7 +30,8 @@
|
|||||||
max-width: 18.75em;
|
max-width: 18.75em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.bottom-panel .window-button:hover > StWidget {
|
.bottom-panel .window-button:hover > StWidget,
|
||||||
|
.bottom-panel .window-picker-toggle:hover > StWidget {
|
||||||
background-color: #f9f9f9;
|
background-color: #f9f9f9;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -37,7 +40,8 @@
|
|||||||
box-shadow: inset 0 1px 3px rgba(0,0,0,0.1);
|
box-shadow: inset 0 1px 3px rgba(0,0,0,0.1);
|
||||||
}
|
}
|
||||||
|
|
||||||
.bottom-panel .window-button.focused > StWidget {
|
.bottom-panel .window-button.focused > StWidget,
|
||||||
|
.bottom-panel .window-picker-toggle:checked > StWidget {
|
||||||
background-color: #ccc;
|
background-color: #ccc;
|
||||||
box-shadow: inset 0 1px 3px rgba(0,0,0,0.1);
|
box-shadow: inset 0 1px 3px rgba(0,0,0,0.1);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,342 @@
|
|||||||
|
// SPDX-FileCopyrightText: 2019 Florian Müllner <fmuellner@gnome.org>
|
||||||
|
// SPDX-FileCopyrightText: 2019 Marco Trevisan (Treviño) <mail@3v1n0.net>
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
import Clutter from 'gi://Clutter';
|
||||||
|
import GObject from 'gi://GObject';
|
||||||
|
import Shell from 'gi://Shell';
|
||||||
|
import St from 'gi://St';
|
||||||
|
|
||||||
|
import {Extension, InjectionManager} from 'resource:///org/gnome/shell/extensions/extension.js';
|
||||||
|
import * as Layout from 'resource:///org/gnome/shell/ui/layout.js';
|
||||||
|
import * as Main from 'resource:///org/gnome/shell/ui/main.js';
|
||||||
|
import {WorkspacesDisplay} from 'resource:///org/gnome/shell/ui/workspacesView.js';
|
||||||
|
import * as Workspace from 'resource:///org/gnome/shell/ui/workspace.js';
|
||||||
|
|
||||||
|
import {VIGNETTE_BRIGHTNESS} from 'resource:///org/gnome/shell/ui/lightbox.js';
|
||||||
|
import {
|
||||||
|
SIDE_CONTROLS_ANIMATION_TIME,
|
||||||
|
OverviewAdjustment,
|
||||||
|
ControlsState
|
||||||
|
} from 'resource:///org/gnome/shell/ui/overviewControls.js';
|
||||||
|
|
||||||
|
class MyWorkspacesDisplay extends WorkspacesDisplay {
|
||||||
|
static {
|
||||||
|
GObject.registerClass(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor(controls, overviewAdjustment) {
|
||||||
|
let workspaceManager = global.workspace_manager;
|
||||||
|
|
||||||
|
const workspaceAdjustment = new St.Adjustment({
|
||||||
|
value: workspaceManager.get_active_workspace_index(),
|
||||||
|
lower: 0,
|
||||||
|
page_increment: 1,
|
||||||
|
page_size: 1,
|
||||||
|
step_increment: 0,
|
||||||
|
upper: workspaceManager.n_workspaces,
|
||||||
|
});
|
||||||
|
|
||||||
|
super(controls, workspaceAdjustment, overviewAdjustment);
|
||||||
|
|
||||||
|
this._windowPicker = controls;
|
||||||
|
|
||||||
|
this._workspaceAdjustment = workspaceAdjustment;
|
||||||
|
this._workspaceAdjustment.actor = this;
|
||||||
|
|
||||||
|
workspaceManager.connectObject('notify::n-workspaces',
|
||||||
|
() => this._updateAdjustment(), this);
|
||||||
|
|
||||||
|
this.add_constraint(
|
||||||
|
new Layout.MonitorConstraint({
|
||||||
|
primary: true,
|
||||||
|
work_area: true,
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
prepareToEnterOverview(...args) {
|
||||||
|
if (!this._scrollEventId) {
|
||||||
|
this._scrollEventId = this._windowPicker.connect('scroll-event',
|
||||||
|
this._onScrollEvent.bind(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
super.prepareToEnterOverview(...args);
|
||||||
|
}
|
||||||
|
|
||||||
|
vfunc_hide(...args) {
|
||||||
|
if (this._scrollEventId > 0)
|
||||||
|
this._windowPicker.disconnect(this._scrollEventId);
|
||||||
|
this._scrollEventId = 0;
|
||||||
|
|
||||||
|
super.vfunc_hide(...args);
|
||||||
|
}
|
||||||
|
|
||||||
|
_updateAdjustment() {
|
||||||
|
let workspaceManager = global.workspace_manager;
|
||||||
|
this._workspaceAdjustment.set({
|
||||||
|
upper: workspaceManager.n_workspaces,
|
||||||
|
value: workspaceManager.get_active_workspace_index(),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class WindowPicker extends Clutter.Actor {
|
||||||
|
static [GObject.signals] = {
|
||||||
|
'open-state-changed': {param_types: [GObject.TYPE_BOOLEAN]},
|
||||||
|
};
|
||||||
|
|
||||||
|
static {
|
||||||
|
GObject.registerClass(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
super({reactive: true});
|
||||||
|
|
||||||
|
this._visible = false;
|
||||||
|
this._modal = false;
|
||||||
|
|
||||||
|
this._stageKeyPressId = 0;
|
||||||
|
|
||||||
|
this._adjustment = new OverviewAdjustment(this);
|
||||||
|
|
||||||
|
this._injectionManager = new InjectionManager();
|
||||||
|
this.connect('destroy', this._onDestroy.bind(this));
|
||||||
|
|
||||||
|
global.bind_property('screen-width',
|
||||||
|
this, 'width',
|
||||||
|
GObject.BindingFlags.SYNC_CREATE);
|
||||||
|
global.bind_property('screen-height',
|
||||||
|
this, 'height',
|
||||||
|
GObject.BindingFlags.SYNC_CREATE);
|
||||||
|
|
||||||
|
this._workspacesDisplay = new MyWorkspacesDisplay(this, this._adjustment);
|
||||||
|
this.add_child(this._workspacesDisplay);
|
||||||
|
|
||||||
|
Main.uiGroup.insert_child_below(this, global.window_group);
|
||||||
|
|
||||||
|
if (!Main.sessionMode.hasOverview) {
|
||||||
|
this._injectBackgroundShade();
|
||||||
|
|
||||||
|
global.display.connectObject('overlay-key', () => {
|
||||||
|
if (!this._visible)
|
||||||
|
this.open();
|
||||||
|
else
|
||||||
|
this.close();
|
||||||
|
}, this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_injectBackgroundShade() {
|
||||||
|
const backgroundProto = Workspace.WorkspaceBackground.prototype;
|
||||||
|
this._injectionManager.overrideMethod(backgroundProto, '_updateBorderRadius',
|
||||||
|
() => {
|
||||||
|
return function () {};
|
||||||
|
});
|
||||||
|
this._injectionManager.overrideMethod(backgroundProto, 'vfunc_allocate',
|
||||||
|
() => {
|
||||||
|
/* eslint-disable no-invalid-this */
|
||||||
|
return function (box) {
|
||||||
|
this.set_allocation(box);
|
||||||
|
|
||||||
|
const themeNode = this.get_theme_node();
|
||||||
|
const contentBox = themeNode.get_content_box(box);
|
||||||
|
|
||||||
|
this._bin.allocate(contentBox);
|
||||||
|
|
||||||
|
const [contentWidth, contentHeight] = contentBox.get_size();
|
||||||
|
const monitor = Main.layoutManager.monitors[this._monitorIndex];
|
||||||
|
const xRatio = contentWidth / this._workarea.width;
|
||||||
|
const yRatio = contentHeight / this._workarea.height;
|
||||||
|
|
||||||
|
const right = area => area.x + area.width;
|
||||||
|
const bottom = area => area.y + area.height;
|
||||||
|
|
||||||
|
const offsets = {
|
||||||
|
left: xRatio * (this._workarea.x - monitor.x),
|
||||||
|
right: xRatio * (right(monitor) - right(this._workarea)),
|
||||||
|
top: yRatio * (this._workarea.y - monitor.y),
|
||||||
|
bottom: yRatio * (bottom(monitor) - bottom(this._workarea)),
|
||||||
|
};
|
||||||
|
|
||||||
|
contentBox.set_origin(-offsets.left, -offsets.top);
|
||||||
|
contentBox.set_size(
|
||||||
|
offsets.left + contentWidth + offsets.right,
|
||||||
|
offsets.top + contentHeight + offsets.bottom);
|
||||||
|
this._backgroundGroup.allocate(contentBox);
|
||||||
|
};
|
||||||
|
/* eslint-enable */
|
||||||
|
});
|
||||||
|
this._injectionManager.overrideMethod(backgroundProto, 'vfunc_parent_set',
|
||||||
|
() => {
|
||||||
|
/* eslint-disable no-invalid-this */
|
||||||
|
return function () {
|
||||||
|
setTimeout(() => {
|
||||||
|
const parent = this.get_parent();
|
||||||
|
if (!parent)
|
||||||
|
return;
|
||||||
|
|
||||||
|
parent._overviewAdjustment.connectObject('notify::value', () => {
|
||||||
|
const {value: progress} = parent._overviewAdjustment;
|
||||||
|
const brightness = 1 - (1 - VIGNETTE_BRIGHTNESS) * progress;
|
||||||
|
for (const bg of this._backgroundGroup ?? []) {
|
||||||
|
bg.content.set({
|
||||||
|
vignette: true,
|
||||||
|
brightness,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, this);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
/* eslint-enable */
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
get visible() {
|
||||||
|
return this._visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
open() {
|
||||||
|
if (this._visible)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._visible = true;
|
||||||
|
|
||||||
|
if (!this._syncGrab())
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._fakeOverviewVisible(true);
|
||||||
|
this._workspacesDisplay.prepareToEnterOverview();
|
||||||
|
Main.overview._animationInProgress = true;
|
||||||
|
|
||||||
|
this._adjustment.value = ControlsState.HIDDEN;
|
||||||
|
this._adjustment.ease(ControlsState.WINDOW_PICKER, {
|
||||||
|
duration: SIDE_CONTROLS_ANIMATION_TIME,
|
||||||
|
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
||||||
|
onComplete: () => (Main.overview._animationInProgress = false),
|
||||||
|
});
|
||||||
|
|
||||||
|
this._stageKeyPressId = global.stage.connect('key-press-event',
|
||||||
|
(a, event) => {
|
||||||
|
let sym = event.get_key_symbol();
|
||||||
|
if (sym === Clutter.KEY_Escape) {
|
||||||
|
this.close();
|
||||||
|
return Clutter.EVENT_STOP;
|
||||||
|
}
|
||||||
|
return Clutter.EVENT_PROPAGATE;
|
||||||
|
});
|
||||||
|
|
||||||
|
this.emit('open-state-changed', this._visible);
|
||||||
|
}
|
||||||
|
|
||||||
|
close() {
|
||||||
|
if (!this._visible)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._visible = false;
|
||||||
|
|
||||||
|
if (!this._syncGrab())
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._workspacesDisplay.prepareToLeaveOverview();
|
||||||
|
|
||||||
|
Main.overview._animationInProgress = true;
|
||||||
|
this._adjustment.ease(ControlsState.HIDDEN, {
|
||||||
|
duration: SIDE_CONTROLS_ANIMATION_TIME,
|
||||||
|
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
||||||
|
onComplete: () => {
|
||||||
|
Main.overview._animationInProgress = false;
|
||||||
|
this._workspacesDisplay.hide();
|
||||||
|
this._fakeOverviewVisible(false);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
global.stage.disconnect(this._stageKeyPressId);
|
||||||
|
this._stageKeyPressId = 0;
|
||||||
|
|
||||||
|
this.emit('open-state-changed', this._visible);
|
||||||
|
}
|
||||||
|
|
||||||
|
getWorkspacesBoxForState() {
|
||||||
|
return this.allocation;
|
||||||
|
}
|
||||||
|
|
||||||
|
_fakeOverviewVisible(visible) {
|
||||||
|
// Fake overview state for WorkspacesDisplay
|
||||||
|
Main.overview._visible = visible;
|
||||||
|
|
||||||
|
// Hide real windows
|
||||||
|
Main.layoutManager._inOverview = visible;
|
||||||
|
Main.layoutManager._updateVisibility();
|
||||||
|
}
|
||||||
|
|
||||||
|
_syncGrab() {
|
||||||
|
if (this._visible) {
|
||||||
|
if (this._modal)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
const grab = Main.pushModal(global.stage, {
|
||||||
|
actionMode: Shell.ActionMode.OVERVIEW,
|
||||||
|
});
|
||||||
|
if (grab.get_seat_state() !== Clutter.GrabState.NONE) {
|
||||||
|
this._grab = grab;
|
||||||
|
this._modal = true;
|
||||||
|
} else {
|
||||||
|
Main.popModal(grab);
|
||||||
|
this.hide();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else if (this._modal) {
|
||||||
|
Main.popModal(this._grab);
|
||||||
|
this._modal = false;
|
||||||
|
this._grab = null;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
_onDestroy() {
|
||||||
|
this._injectionManager.clear();
|
||||||
|
|
||||||
|
if (this._stageKeyPressId)
|
||||||
|
global.stage.disconnect(this._stageKeyPressId);
|
||||||
|
this._stageKeyPressId = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class WindowPickerToggle extends St.Button {
|
||||||
|
static {
|
||||||
|
GObject.registerClass(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
let iconBin = new St.Widget({
|
||||||
|
layout_manager: new Clutter.BinLayout(),
|
||||||
|
});
|
||||||
|
iconBin.add_child(new St.Icon({
|
||||||
|
icon_name: 'focus-windows-symbolic',
|
||||||
|
icon_size: 16,
|
||||||
|
x_expand: true,
|
||||||
|
y_expand: true,
|
||||||
|
x_align: Clutter.ActorAlign.CENTER,
|
||||||
|
y_align: Clutter.ActorAlign.CENTER,
|
||||||
|
}));
|
||||||
|
super({
|
||||||
|
style_class: 'window-picker-toggle',
|
||||||
|
child: iconBin,
|
||||||
|
visible: !Main.sessionMode.hasOverview,
|
||||||
|
toggle_mode: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
const {windowPicker} = Extension.lookupByURL(import.meta.url);
|
||||||
|
this.connect('notify::checked', () => {
|
||||||
|
if (this.checked)
|
||||||
|
windowPicker.open();
|
||||||
|
else
|
||||||
|
windowPicker.close();
|
||||||
|
});
|
||||||
|
|
||||||
|
windowPicker.connect('open-state-changed', () => {
|
||||||
|
this.checked = windowPicker.visible;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -36,12 +36,13 @@ class WindowPreview extends St.Button {
|
|||||||
this._window = window;
|
this._window = window;
|
||||||
|
|
||||||
this._window.connectObject(
|
this._window.connectObject(
|
||||||
'size-changed', () => this._checkRelayout(),
|
'size-changed', () => this.queue_relayout(),
|
||||||
'position-changed', () => this._checkRelayout(),
|
'position-changed', () => {
|
||||||
|
this._updateVisible();
|
||||||
|
this.queue_relayout();
|
||||||
|
},
|
||||||
'notify::minimized', this._updateVisible.bind(this),
|
'notify::minimized', this._updateVisible.bind(this),
|
||||||
'notify::window-type', this._updateVisible.bind(this),
|
|
||||||
this);
|
this);
|
||||||
this._updateVisible();
|
|
||||||
|
|
||||||
global.display.connectObject('notify::focus-window',
|
global.display.connectObject('notify::focus-window',
|
||||||
this._onFocusChanged.bind(this), this);
|
this._onFocusChanged.bind(this), this);
|
||||||
@@ -60,15 +61,11 @@ class WindowPreview extends St.Button {
|
|||||||
this.remove_style_class_name('active');
|
this.remove_style_class_name('active');
|
||||||
}
|
}
|
||||||
|
|
||||||
_checkRelayout() {
|
_updateVisible() {
|
||||||
const monitor = Main.layoutManager.findIndexForActor(this);
|
const monitor = Main.layoutManager.findIndexForActor(this);
|
||||||
const workArea = Main.layoutManager.getWorkAreaForMonitor(monitor);
|
const workArea = Main.layoutManager.getWorkAreaForMonitor(monitor);
|
||||||
if (this._window.get_frame_rect().overlap(workArea))
|
this.visible = this._window.get_frame_rect().overlap(workArea) &&
|
||||||
this.queue_relayout();
|
this._window.window_type !== Meta.WindowType.DESKTOP &&
|
||||||
}
|
|
||||||
|
|
||||||
_updateVisible() {
|
|
||||||
this.visible = this._window.window_type !== Meta.WindowType.DESKTOP &&
|
|
||||||
this._window.showing_on_its_workspace();
|
this._window.showing_on_its_workspace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -261,7 +258,7 @@ export class WorkspaceIndicator extends PanelMenu.Button {
|
|||||||
x_expand: true,
|
x_expand: true,
|
||||||
y_expand: true,
|
y_expand: true,
|
||||||
});
|
});
|
||||||
this.add_child(container);
|
this.add_actor(container);
|
||||||
|
|
||||||
let workspaceManager = global.workspace_manager;
|
let workspaceManager = global.workspace_manager;
|
||||||
|
|
||||||
@@ -274,7 +271,7 @@ export class WorkspaceIndicator extends PanelMenu.Button {
|
|||||||
y_expand: true,
|
y_expand: true,
|
||||||
child: this._statusLabel,
|
child: this._statusLabel,
|
||||||
});
|
});
|
||||||
container.add_child(this._statusBin);
|
container.add_actor(this._statusBin);
|
||||||
|
|
||||||
this._thumbnailsBox = new St.BoxLayout({
|
this._thumbnailsBox = new St.BoxLayout({
|
||||||
style_class: 'workspaces-box',
|
style_class: 'workspaces-box',
|
||||||
@@ -283,7 +280,7 @@ export class WorkspaceIndicator extends PanelMenu.Button {
|
|||||||
});
|
});
|
||||||
this._thumbnailsBox.connect('scroll-event',
|
this._thumbnailsBox.connect('scroll-event',
|
||||||
this._onScrollEvent.bind(this));
|
this._onScrollEvent.bind(this));
|
||||||
container.add_child(this._thumbnailsBox);
|
container.add_actor(this._thumbnailsBox);
|
||||||
|
|
||||||
this._workspacesItems = [];
|
this._workspacesItems = [];
|
||||||
|
|
||||||
@@ -397,7 +394,7 @@ export class WorkspaceIndicator extends PanelMenu.Button {
|
|||||||
|
|
||||||
for (let i = 0; i < workspaceManager.n_workspaces; i++) {
|
for (let i = 0; i < workspaceManager.n_workspaces; i++) {
|
||||||
let thumb = new WorkspaceThumbnail(i);
|
let thumb = new WorkspaceThumbnail(i);
|
||||||
this._thumbnailsBox.add_child(thumb);
|
this._thumbnailsBox.add_actor(thumb);
|
||||||
}
|
}
|
||||||
this._updateActiveThumbnail();
|
this._updateActiveThumbnail();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ export default class Extension {
|
|||||||
style_class: 'extension-windowsNavigator-window-tooltip',
|
style_class: 'extension-windowsNavigator-window-tooltip',
|
||||||
visible: false,
|
visible: false,
|
||||||
});
|
});
|
||||||
this.add_child(this._tip);
|
this.add_actor(this._tip);
|
||||||
|
|
||||||
this.connect('notify::scale-x', () => {
|
this.connect('notify::scale-x', () => {
|
||||||
this._tip.set_scale(1 / this.scale_x, 1 / this.scale_x);
|
this._tip.set_scale(1 / this.scale_x, 1 / this.scale_x);
|
||||||
|
|||||||
@@ -42,12 +42,13 @@ class WindowPreview extends St.Button {
|
|||||||
this._window = window;
|
this._window = window;
|
||||||
|
|
||||||
this._window.connectObject(
|
this._window.connectObject(
|
||||||
'size-changed', () => this._checkRelayout(),
|
'size-changed', () => this.queue_relayout(),
|
||||||
'position-changed', () => this._checkRelayout(),
|
'position-changed', () => {
|
||||||
|
this._updateVisible();
|
||||||
|
this.queue_relayout();
|
||||||
|
},
|
||||||
'notify::minimized', this._updateVisible.bind(this),
|
'notify::minimized', this._updateVisible.bind(this),
|
||||||
'notify::window-type', this._updateVisible.bind(this),
|
|
||||||
this);
|
this);
|
||||||
this._updateVisible();
|
|
||||||
|
|
||||||
global.display.connectObject('notify::focus-window',
|
global.display.connectObject('notify::focus-window',
|
||||||
this._onFocusChanged.bind(this), this);
|
this._onFocusChanged.bind(this), this);
|
||||||
@@ -66,15 +67,11 @@ class WindowPreview extends St.Button {
|
|||||||
this.remove_style_class_name('active');
|
this.remove_style_class_name('active');
|
||||||
}
|
}
|
||||||
|
|
||||||
_checkRelayout() {
|
_updateVisible() {
|
||||||
const monitor = Main.layoutManager.findIndexForActor(this);
|
const monitor = Main.layoutManager.findIndexForActor(this);
|
||||||
const workArea = Main.layoutManager.getWorkAreaForMonitor(monitor);
|
const workArea = Main.layoutManager.getWorkAreaForMonitor(monitor);
|
||||||
if (this._window.get_frame_rect().overlap(workArea))
|
this.visible = this._window.get_frame_rect().overlap(workArea) &&
|
||||||
this.queue_relayout();
|
this._window.window_type !== Meta.WindowType.DESKTOP &&
|
||||||
}
|
|
||||||
|
|
||||||
_updateVisible() {
|
|
||||||
this.visible = this._window.window_type !== Meta.WindowType.DESKTOP &&
|
|
||||||
this._window.showing_on_its_workspace();
|
this._window.showing_on_its_workspace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -263,7 +260,7 @@ class WorkspaceIndicator extends PanelMenu.Button {
|
|||||||
x_expand: true,
|
x_expand: true,
|
||||||
y_expand: true,
|
y_expand: true,
|
||||||
});
|
});
|
||||||
this.add_child(container);
|
this.add_actor(container);
|
||||||
|
|
||||||
let workspaceManager = global.workspace_manager;
|
let workspaceManager = global.workspace_manager;
|
||||||
|
|
||||||
@@ -274,7 +271,7 @@ class WorkspaceIndicator extends PanelMenu.Button {
|
|||||||
text: this._labelText(),
|
text: this._labelText(),
|
||||||
});
|
});
|
||||||
|
|
||||||
container.add_child(this._statusLabel);
|
container.add_actor(this._statusLabel);
|
||||||
|
|
||||||
this._thumbnailsBox = new St.BoxLayout({
|
this._thumbnailsBox = new St.BoxLayout({
|
||||||
style_class: 'panel-workspace-indicator-box',
|
style_class: 'panel-workspace-indicator-box',
|
||||||
@@ -282,7 +279,7 @@ class WorkspaceIndicator extends PanelMenu.Button {
|
|||||||
reactive: true,
|
reactive: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
container.add_child(this._thumbnailsBox);
|
container.add_actor(this._thumbnailsBox);
|
||||||
|
|
||||||
this._workspacesItems = [];
|
this._workspacesItems = [];
|
||||||
this._workspaceSection = new PopupMenu.PopupMenuSection();
|
this._workspaceSection = new PopupMenu.PopupMenuSection();
|
||||||
@@ -405,7 +402,7 @@ class WorkspaceIndicator extends PanelMenu.Button {
|
|||||||
|
|
||||||
for (let i = 0; i < workspaceManager.n_workspaces; i++) {
|
for (let i = 0; i < workspaceManager.n_workspaces; i++) {
|
||||||
let thumb = new WorkspaceThumbnail(i);
|
let thumb = new WorkspaceThumbnail(i);
|
||||||
this._thumbnailsBox.add_child(thumb);
|
this._thumbnailsBox.add_actor(thumb);
|
||||||
}
|
}
|
||||||
this._updateActiveThumbnail();
|
this._updateActiveThumbnail();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ Most extensions can be installed by configuring --prefix=$HOME/.local,
|
|||||||
and will be picked automatically at next login.
|
and will be picked automatically at next login.
|
||||||
</description>
|
</description>
|
||||||
<homepage rdf:resource="https://wiki.gnome.org/Projects/GnomeShell/Extensions" />
|
<homepage rdf:resource="https://wiki.gnome.org/Projects/GnomeShell/Extensions" />
|
||||||
|
<mailing-list rdf:resource="http://mail.gnome.org/mailman/listinfo/gnome-shell-list" />
|
||||||
<support-forum rdf:resource="https://discourse.gnome.org/tag/shell" />
|
<support-forum rdf:resource="https://discourse.gnome.org/tag/shell" />
|
||||||
<download-page rdf:resource="https://download.gnome.org/sources/gnome-shell-extensions/" />
|
<download-page rdf:resource="https://download.gnome.org/sources/gnome-shell-extensions/" />
|
||||||
<bug-database rdf:resource="https://gitlab.gnome.org/GNOME/gnome-shell-extensions/issues" />
|
<bug-database rdf:resource="https://gitlab.gnome.org/GNOME/gnome-shell-extensions/issues" />
|
||||||
|
|||||||
@@ -12,12 +12,6 @@ rules:
|
|||||||
- error
|
- error
|
||||||
- smart
|
- smart
|
||||||
prefer-arrow-callback: error
|
prefer-arrow-callback: error
|
||||||
jsdoc/require-param-description: off
|
|
||||||
jsdoc/require-jsdoc:
|
|
||||||
- error
|
|
||||||
- exemptEmptyFunctions: true
|
|
||||||
publicOnly:
|
|
||||||
esm: true
|
|
||||||
globals:
|
globals:
|
||||||
global: readonly
|
global: readonly
|
||||||
parserOptions:
|
parserOptions:
|
||||||
|
|||||||
+1
-2
@@ -3,7 +3,7 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
project('gnome-shell-extensions',
|
project('gnome-shell-extensions',
|
||||||
version: '46.alpha',
|
version: '45.0',
|
||||||
meson_version: '>= 0.58.0',
|
meson_version: '>= 0.58.0',
|
||||||
license: 'GPL2+'
|
license: 'GPL2+'
|
||||||
)
|
)
|
||||||
@@ -42,7 +42,6 @@ default_extensions += [
|
|||||||
'drive-menu',
|
'drive-menu',
|
||||||
'light-style',
|
'light-style',
|
||||||
'screenshot-window-sizer',
|
'screenshot-window-sizer',
|
||||||
'system-monitor',
|
|
||||||
'windowsNavigator',
|
'windowsNavigator',
|
||||||
'workspace-indicator'
|
'workspace-indicator'
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -3,48 +3,39 @@
|
|||||||
# This file is distributed under the same license as the gnome-shell-extensions package.
|
# This file is distributed under the same license as the gnome-shell-extensions package.
|
||||||
# Ryan LORTIE <desrt@desrt.ca>, 2013.
|
# Ryan LORTIE <desrt@desrt.ca>, 2013.
|
||||||
# Daniel PUENTES <blatberk@openmailbox.org>, 2015.
|
# Daniel PUENTES <blatberk@openmailbox.org>, 2015.
|
||||||
|
# Kristjan SCHMIDT <kristjan.schmidt@googlemail.com>, 2011-2019.
|
||||||
# Carmen Bianca BAKKER <carmen@carmenbianca.eu>, 2021.
|
# Carmen Bianca BAKKER <carmen@carmenbianca.eu>, 2021.
|
||||||
# Kristjan SCHMIDT <kristjan.schmidt@googlemail.com>, 2011-2023.
|
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: gnome-shell-extensions master\n"
|
"Project-Id-Version: gnome-shell-extensions master\n"
|
||||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/"
|
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/"
|
||||||
"issues\n"
|
"issues\n"
|
||||||
"POT-Creation-Date: 2023-08-05 15:58+0000\n"
|
"POT-Creation-Date: 2021-03-27 20:14+0000\n"
|
||||||
"PO-Revision-Date: 2023-09-27 22:47+0200\n"
|
"PO-Revision-Date: 2021-03-29 17:24+0200\n"
|
||||||
"Last-Translator: Kristjan SCHMIDT <kristjan.schmidt@googlemail.com>\n"
|
"Last-Translator: Carmen Bianca BAKKER <carmen@carmenbianca.eu>\n"
|
||||||
"Language-Team: Esperanto <gnome-eo-list@gnome.org>\n"
|
"Language-Team: Esperanto <gnome-eo-list@gnome.org>\n"
|
||||||
"Language: eo\n"
|
"Language: eo\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"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
|
||||||
"X-Generator: Gtranslator 42.0\n"
|
"X-Generator: Gtranslator 3.38.0\n"
|
||||||
"X-Project-Style: gnome\n"
|
"X-Project-Style: gnome\n"
|
||||||
|
|
||||||
#: data/gnome-classic.desktop.in:3
|
#: data/gnome-classic.desktop.in:3
|
||||||
msgid "GNOME Classic"
|
msgid "GNOME Classic"
|
||||||
msgstr "GNOME-klasika"
|
msgstr "GNOME-klasika"
|
||||||
|
|
||||||
#: data/gnome-classic.desktop.in:4 data/gnome-classic-wayland.desktop.in:4
|
#: data/gnome-classic.desktop.in:4
|
||||||
#: data/gnome-classic-xorg.desktop.in:4
|
|
||||||
msgid "This session logs you into GNOME Classic"
|
msgid "This session logs you into GNOME Classic"
|
||||||
msgstr "Ĉi tiu seanco ensalutas vin GNOME-klasiken"
|
msgstr "Ĉi tiu seanco ensalutas vin GNOME-klasiken"
|
||||||
|
|
||||||
#: data/gnome-classic-wayland.desktop.in:3
|
#: extensions/apps-menu/extension.js:113
|
||||||
msgid "GNOME Classic on Wayland"
|
|
||||||
msgstr "GNOME-klasika je Vajlando"
|
|
||||||
|
|
||||||
#: data/gnome-classic-xorg.desktop.in:3
|
|
||||||
msgid "GNOME Classic on Xorg"
|
|
||||||
msgstr "GNOME-klasika je Xorg"
|
|
||||||
|
|
||||||
#: extensions/apps-menu/extension.js:121
|
|
||||||
msgid "Favorites"
|
msgid "Favorites"
|
||||||
msgstr "Plej ŝatataj"
|
msgstr "Plej ŝatataj"
|
||||||
|
|
||||||
#: extensions/apps-menu/extension.js:378
|
#: extensions/apps-menu/extension.js:367
|
||||||
msgid "Applications"
|
msgid "Applications"
|
||||||
msgstr "Aplikaĵoj"
|
msgstr "Aplikaĵoj"
|
||||||
|
|
||||||
@@ -60,26 +51,26 @@ msgstr ""
|
|||||||
"Listo de ĉenoj, ĉiu enhavas aplikaĵan identigilon ('desktop' dosiernomo), "
|
"Listo de ĉenoj, ĉiu enhavas aplikaĵan identigilon ('desktop' dosiernomo), "
|
||||||
"sevkita per dupunkto kaj la laborspaca numero"
|
"sevkita per dupunkto kaj la laborspaca numero"
|
||||||
|
|
||||||
#: extensions/auto-move-windows/prefs.js:155
|
#: extensions/auto-move-windows/prefs.js:35
|
||||||
msgid "Workspace Rules"
|
msgid "Workspace Rules"
|
||||||
msgstr "Laborspacaj reguloj"
|
msgstr "Laborspacaj reguloj"
|
||||||
|
|
||||||
#: extensions/auto-move-windows/prefs.js:309
|
#: extensions/auto-move-windows/prefs.js:237
|
||||||
msgid "Add Rule"
|
msgid "Add Rule"
|
||||||
msgstr "Aldoni regulon"
|
msgstr "Aldoni regulon"
|
||||||
|
|
||||||
#. TRANSLATORS: %s is the filesystem name
|
#. TRANSLATORS: %s is the filesystem name
|
||||||
#: extensions/drive-menu/extension.js:122
|
#: extensions/drive-menu/extension.js:112
|
||||||
#: extensions/places-menu/placeDisplay.js:213
|
#: extensions/places-menu/placeDisplay.js:233
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Ejecting drive “%s” failed:"
|
msgid "Ejecting drive “%s” failed:"
|
||||||
msgstr "Elĵeto de volumo “%s” malsukcesis:"
|
msgstr "Elĵeto de volumo “%s” malsukcesis:"
|
||||||
|
|
||||||
#: extensions/drive-menu/extension.js:141
|
#: extensions/drive-menu/extension.js:128
|
||||||
msgid "Removable devices"
|
msgid "Removable devices"
|
||||||
msgstr "Demeteblaj aparatoj"
|
msgstr "Demeteblaj aparatoj"
|
||||||
|
|
||||||
#: extensions/drive-menu/extension.js:163
|
#: extensions/drive-menu/extension.js:152
|
||||||
msgid "Open Files"
|
msgid "Open Files"
|
||||||
msgstr "Malfermi dosierojn"
|
msgstr "Malfermi dosierojn"
|
||||||
|
|
||||||
@@ -111,31 +102,31 @@ msgstr ""
|
|||||||
"estas meti ĝin malsupre). Si vi ŝanĝas ĉi agordon tiam vi devas restartigi "
|
"estas meti ĝin malsupre). Si vi ŝanĝas ĉi agordon tiam vi devas restartigi "
|
||||||
"la ŝelon."
|
"la ŝelon."
|
||||||
|
|
||||||
#: extensions/places-menu/extension.js:85
|
#: extensions/places-menu/extension.js:89
|
||||||
#: extensions/places-menu/extension.js:88
|
#: extensions/places-menu/extension.js:92
|
||||||
msgid "Places"
|
msgid "Places"
|
||||||
msgstr "Lokoj"
|
msgstr "Lokoj"
|
||||||
|
|
||||||
#: extensions/places-menu/placeDisplay.js:53
|
#: extensions/places-menu/placeDisplay.js:46
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Failed to launch “%s”"
|
msgid "Failed to launch “%s”"
|
||||||
msgstr "Malsukcesis lanĉi “%s”"
|
msgstr "Malsukcesis lanĉi “%s”"
|
||||||
|
|
||||||
#: extensions/places-menu/placeDisplay.js:68
|
#: extensions/places-menu/placeDisplay.js:61
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Failed to mount volume for “%s”"
|
msgid "Failed to mount volume for “%s”"
|
||||||
msgstr "Ne eblis munti datumportilon por “%s”"
|
msgstr "Ne eblis munti datumportilon por “%s”"
|
||||||
|
|
||||||
#: extensions/places-menu/placeDisplay.js:128
|
#: extensions/places-menu/placeDisplay.js:148
|
||||||
#: extensions/places-menu/placeDisplay.js:151
|
#: extensions/places-menu/placeDisplay.js:171
|
||||||
msgid "Computer"
|
msgid "Computer"
|
||||||
msgstr "Komputilo"
|
msgstr "Komputilo"
|
||||||
|
|
||||||
#: extensions/places-menu/placeDisplay.js:328
|
#: extensions/places-menu/placeDisplay.js:359
|
||||||
msgid "Home"
|
msgid "Home"
|
||||||
msgstr "Domo"
|
msgstr "Domo"
|
||||||
|
|
||||||
#: extensions/places-menu/placeDisplay.js:373
|
#: extensions/places-menu/placeDisplay.js:404
|
||||||
msgid "Browse Network"
|
msgid "Browse Network"
|
||||||
msgstr "Foliumi reton"
|
msgstr "Foliumi reton"
|
||||||
|
|
||||||
@@ -155,47 +146,47 @@ msgstr "Etosnomo"
|
|||||||
msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
|
msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
|
||||||
msgstr "La nomo de la etoso, malfermigi de ~/.themes/name/gnome-shell"
|
msgstr "La nomo de la etoso, malfermigi de ~/.themes/name/gnome-shell"
|
||||||
|
|
||||||
#: extensions/window-list/extension.js:71
|
#: extensions/window-list/extension.js:98
|
||||||
msgid "Close"
|
msgid "Close"
|
||||||
msgstr "Fermi"
|
msgstr "Fermi"
|
||||||
|
|
||||||
#: extensions/window-list/extension.js:98
|
#: extensions/window-list/extension.js:118
|
||||||
msgid "Unminimize"
|
msgid "Unminimize"
|
||||||
msgstr "Malminimumigi"
|
msgstr "Malminimumigi"
|
||||||
|
|
||||||
#: extensions/window-list/extension.js:98
|
#: extensions/window-list/extension.js:118
|
||||||
msgid "Minimize"
|
msgid "Minimize"
|
||||||
msgstr "Minimumigi"
|
msgstr "Minimumigi"
|
||||||
|
|
||||||
#: extensions/window-list/extension.js:105
|
#: extensions/window-list/extension.js:125
|
||||||
msgid "Unmaximize"
|
msgid "Unmaximize"
|
||||||
msgstr "Malmaksimumigi"
|
msgstr "Malmaksimumigi"
|
||||||
|
|
||||||
#: extensions/window-list/extension.js:105
|
#: extensions/window-list/extension.js:125
|
||||||
msgid "Maximize"
|
msgid "Maximize"
|
||||||
msgstr "Maksimumigi"
|
msgstr "Maksimumigi"
|
||||||
|
|
||||||
#: extensions/window-list/extension.js:468
|
#: extensions/window-list/extension.js:432
|
||||||
msgid "Minimize all"
|
msgid "Minimize all"
|
||||||
msgstr "Minimumigi ĉiujn"
|
msgstr "Minimumigi ĉiujn"
|
||||||
|
|
||||||
#: extensions/window-list/extension.js:474
|
#: extensions/window-list/extension.js:438
|
||||||
msgid "Unminimize all"
|
msgid "Unminimize all"
|
||||||
msgstr "Malminimumigi ĉiujn"
|
msgstr "Malminimumigi ĉiujn"
|
||||||
|
|
||||||
#: extensions/window-list/extension.js:480
|
#: extensions/window-list/extension.js:444
|
||||||
msgid "Maximize all"
|
msgid "Maximize all"
|
||||||
msgstr "Maksimumigi ĉiujn"
|
msgstr "Maksimumigi ĉiujn"
|
||||||
|
|
||||||
#: extensions/window-list/extension.js:488
|
#: extensions/window-list/extension.js:452
|
||||||
msgid "Unmaximize all"
|
msgid "Unmaximize all"
|
||||||
msgstr "Malmaksimumigi ĉiujn"
|
msgstr "Malmaksimumigi ĉiujn"
|
||||||
|
|
||||||
#: extensions/window-list/extension.js:496
|
#: extensions/window-list/extension.js:460
|
||||||
msgid "Close all"
|
msgid "Close all"
|
||||||
msgstr "Fermi ĉiujn"
|
msgstr "Fermi ĉiujn"
|
||||||
|
|
||||||
#: extensions/window-list/extension.js:776
|
#: extensions/window-list/extension.js:737
|
||||||
msgid "Window List"
|
msgid "Window List"
|
||||||
msgstr "Fenestra listo"
|
msgstr "Fenestra listo"
|
||||||
|
|
||||||
@@ -212,7 +203,7 @@ msgstr ""
|
|||||||
"Validaj valoroj estas “neniam”, “aŭtomate” kaj ĉiam”."
|
"Validaj valoroj estas “neniam”, “aŭtomate” kaj ĉiam”."
|
||||||
|
|
||||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20
|
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20
|
||||||
#: extensions/window-list/prefs.js:76
|
#: extensions/window-list/prefs.js:100
|
||||||
msgid "Show windows from all workspaces"
|
msgid "Show windows from all workspaces"
|
||||||
msgstr "Montri la fenestrojn de ĉiuj laborspacoj"
|
msgstr "Montri la fenestrojn de ĉiuj laborspacoj"
|
||||||
|
|
||||||
@@ -231,41 +222,41 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Ĉu montri la fenestroliston en ĉiuj konektitaj ekranoj aŭ nur en la ĉefa."
|
"Ĉu montri la fenestroliston en ĉiuj konektitaj ekranoj aŭ nur en la ĉefa."
|
||||||
|
|
||||||
#: extensions/window-list/prefs.js:32
|
#: extensions/window-list/prefs.js:29
|
||||||
msgid "Window Grouping"
|
msgid "Window Grouping"
|
||||||
msgstr "Fenestra grupigo"
|
msgstr "Fenestra grupigo"
|
||||||
|
|
||||||
#: extensions/window-list/prefs.js:37
|
#: extensions/window-list/prefs.js:58
|
||||||
msgid "Never group windows"
|
msgid "Never group windows"
|
||||||
msgstr "Neniam grupigi fenestrojn"
|
msgstr "Neniam grupigi fenestrojn"
|
||||||
|
|
||||||
#: extensions/window-list/prefs.js:38
|
#: extensions/window-list/prefs.js:59
|
||||||
msgid "Group windows when space is limited"
|
msgid "Group windows when space is limited"
|
||||||
msgstr "Grupigi fenestrojn kiam spaco limitas"
|
msgstr "Grupigi fenestrojn kiam spaco limitas"
|
||||||
|
|
||||||
#: extensions/window-list/prefs.js:39
|
#: extensions/window-list/prefs.js:60
|
||||||
msgid "Always group windows"
|
msgid "Always group windows"
|
||||||
msgstr "Ĉiam grupigi fenestrojn"
|
msgstr "Ĉiam grupigi fenestrojn"
|
||||||
|
|
||||||
#: extensions/window-list/prefs.js:63
|
#: extensions/window-list/prefs.js:94
|
||||||
msgid "Show on all monitors"
|
msgid "Show on all monitors"
|
||||||
msgstr "Montri en ĉiuj ekranoj"
|
msgstr "Montri en ĉiuj ekranoj"
|
||||||
|
|
||||||
#: extensions/window-list/workspaceIndicator.js:248
|
#: extensions/window-list/workspaceIndicator.js:249
|
||||||
#: extensions/workspace-indicator/extension.js:252
|
#: extensions/workspace-indicator/extension.js:255
|
||||||
msgid "Workspace Indicator"
|
msgid "Workspace Indicator"
|
||||||
msgstr "Laborspaco Indikilo"
|
msgstr "Laborspaco Indikilo"
|
||||||
|
|
||||||
#: extensions/workspace-indicator/prefs.js:65
|
#: extensions/workspace-indicator/prefs.js:34
|
||||||
|
msgid "Workspace Names"
|
||||||
|
msgstr "Laborspacaj nomoj"
|
||||||
|
|
||||||
|
#: extensions/workspace-indicator/prefs.js:67
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Workspace %d"
|
msgid "Workspace %d"
|
||||||
msgstr "Laborspaco %d"
|
msgstr "Laborspaco %d"
|
||||||
|
|
||||||
#: extensions/workspace-indicator/prefs.js:132
|
#: extensions/workspace-indicator/prefs.js:208
|
||||||
msgid "Workspace Names"
|
|
||||||
msgstr "Laborspacaj nomoj"
|
|
||||||
|
|
||||||
#: extensions/workspace-indicator/prefs.js:258
|
|
||||||
msgid "Add Workspace"
|
msgid "Add Workspace"
|
||||||
msgstr "Aldoni laborspacon"
|
msgstr "Aldoni laborspacon"
|
||||||
|
|
||||||
|
|||||||
@@ -6,81 +6,178 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: gnome-shell-extensions 3.26.x\n"
|
"Project-Id-Version: gnome-shell-extensions 3.26.x\n"
|
||||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/"
|
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell&keywords=I18N+L10N&component=extensions\n"
|
||||||
"issues\n"
|
"POT-Creation-Date: 2017-10-04 18:03+0000\n"
|
||||||
"POT-Creation-Date: 2023-08-05 15:58+0000\n"
|
"PO-Revision-Date: 2017-11-06 13:40+0100\n"
|
||||||
"PO-Revision-Date: 2023-10-12 22:27+0200\n"
|
"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
|
||||||
"Last-Translator: Brage <bragefuglseth@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"
|
||||||
"Language: nb\n"
|
"Language: nb\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"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Generator: Poedit 3.4\n"
|
"X-Generator: Poedit 1.5.4\n"
|
||||||
|
|
||||||
#: data/gnome-classic.desktop.in:3
|
#: data/gnome-classic.desktop.in:3 data/gnome-classic.session.desktop.in:3
|
||||||
msgid "GNOME Classic"
|
msgid "GNOME Classic"
|
||||||
msgstr "Klassisk GNOME"
|
msgstr "Klassisk GNOME"
|
||||||
|
|
||||||
#: data/gnome-classic.desktop.in:4 data/gnome-classic-wayland.desktop.in:4
|
#: data/gnome-classic.desktop.in:4
|
||||||
#: data/gnome-classic-xorg.desktop.in:4
|
|
||||||
msgid "This session logs you into GNOME Classic"
|
msgid "This session logs you into GNOME Classic"
|
||||||
msgstr "Denne økten logger inn i klassisk GNOME"
|
msgstr "Denne økten logger inn i klassisk GNOME"
|
||||||
|
|
||||||
#: data/gnome-classic-wayland.desktop.in:3
|
#: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:7
|
||||||
msgid "GNOME Classic on Wayland"
|
msgid "Attach modal dialog to the parent window"
|
||||||
msgstr "Klassisk GNOME med Wayland"
|
msgstr "Fest modal dialog til opphavsvindu"
|
||||||
|
|
||||||
#: data/gnome-classic-xorg.desktop.in:3
|
#: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:8
|
||||||
msgid "GNOME Classic on Xorg"
|
#: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:25
|
||||||
msgstr "Klassisk GNOME med Xorg"
|
#: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:33
|
||||||
|
#: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:41
|
||||||
|
msgid ""
|
||||||
|
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
|
||||||
|
msgstr ""
|
||||||
|
"Denne nøkkelen overstyrer nøkkelen i org.gnome.mutter når GNOME Shell kjører."
|
||||||
|
|
||||||
#: extensions/apps-menu/extension.js:121
|
#: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:16
|
||||||
|
msgid "Arrangement of buttons on the titlebar"
|
||||||
|
msgstr "Plassering av knapper på tittellinjen"
|
||||||
|
|
||||||
|
#: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:17
|
||||||
|
msgid ""
|
||||||
|
"This key overrides the key in org.gnome.desktop.wm.preferences when running "
|
||||||
|
"GNOME Shell."
|
||||||
|
msgstr ""
|
||||||
|
"Denne nøkkelen overstyrer nøkkelen i org.gnome.desktop.wm.preferences når "
|
||||||
|
"GNOME Shell kjører."
|
||||||
|
|
||||||
|
#: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:24
|
||||||
|
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||||
|
msgstr ""
|
||||||
|
"Del opp skjermkantene i fliser når brukeren drar og slipper vinduer på dem"
|
||||||
|
|
||||||
|
#: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:32
|
||||||
|
msgid "Workspaces only on primary monitor"
|
||||||
|
msgstr "Arbeidsområder kun på hovedskjerm"
|
||||||
|
|
||||||
|
#: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:40
|
||||||
|
msgid "Delay focus changes in mouse mode until the pointer stops moving"
|
||||||
|
msgstr "Vent med å endre fokus i mus-modus til pekeren holdes i ro"
|
||||||
|
|
||||||
|
#: extensions/alternate-tab/prefs.js:20
|
||||||
|
msgid "Thumbnail only"
|
||||||
|
msgstr "Kun miniatyr"
|
||||||
|
|
||||||
|
#: extensions/alternate-tab/prefs.js:21
|
||||||
|
msgid "Application icon only"
|
||||||
|
msgstr "Kun programikon"
|
||||||
|
|
||||||
|
#: extensions/alternate-tab/prefs.js:22
|
||||||
|
msgid "Thumbnail and application icon"
|
||||||
|
msgstr "Miniatyr og programikon"
|
||||||
|
|
||||||
|
#: extensions/alternate-tab/prefs.js:38
|
||||||
|
msgid "Present windows as"
|
||||||
|
msgstr "Vis vinduer som"
|
||||||
|
|
||||||
|
#: extensions/alternate-tab/prefs.js:69
|
||||||
|
msgid "Show only windows in the current workspace"
|
||||||
|
msgstr "Vis kun vinduer i aktivt arbeidsområde"
|
||||||
|
|
||||||
|
#: extensions/apps-menu/extension.js:41
|
||||||
|
msgid "Activities Overview"
|
||||||
|
msgstr "Aktivitetsoversikt"
|
||||||
|
|
||||||
|
#: extensions/apps-menu/extension.js:141
|
||||||
msgid "Favorites"
|
msgid "Favorites"
|
||||||
msgstr "Favoritter"
|
msgstr "Favoritter"
|
||||||
|
|
||||||
#: extensions/apps-menu/extension.js:378
|
#: extensions/apps-menu/extension.js:436
|
||||||
msgid "Applications"
|
msgid "Applications"
|
||||||
msgstr "Apper"
|
msgstr "Programmer"
|
||||||
|
|
||||||
#: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:6
|
#: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:6
|
||||||
msgid "Application and workspace list"
|
msgid "Application and workspace list"
|
||||||
msgstr "Liste over apper og områder"
|
msgstr "Liste med programmer og arbeidsområder"
|
||||||
|
|
||||||
#: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:7
|
#: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:7
|
||||||
msgid ""
|
msgid ""
|
||||||
"A list of strings, each containing an application id (desktop file name), "
|
"A list of strings, each containing an application id (desktop file name), "
|
||||||
"followed by a colon and the workspace number"
|
"followed by a colon and the workspace number"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"En liste hvor hvert element inneholder en app-ID (navn på skrivebordsfil), "
|
"En liste med strenger som inneholder en ID for et program (navn på .desktop-"
|
||||||
"fulgt av et kolon og et områdenummer"
|
"fil), fulgt av et kolon og arbeidsområdenummeret"
|
||||||
|
|
||||||
#: extensions/auto-move-windows/prefs.js:155
|
#: extensions/auto-move-windows/prefs.js:60
|
||||||
msgid "Workspace Rules"
|
msgid "Application"
|
||||||
msgstr "Områderegler"
|
msgstr "Program"
|
||||||
|
|
||||||
#: extensions/auto-move-windows/prefs.js:309
|
#: extensions/auto-move-windows/prefs.js:69
|
||||||
|
#: extensions/auto-move-windows/prefs.js:127
|
||||||
|
msgid "Workspace"
|
||||||
|
msgstr "Arbeidsområde"
|
||||||
|
|
||||||
|
#: extensions/auto-move-windows/prefs.js:85
|
||||||
msgid "Add Rule"
|
msgid "Add Rule"
|
||||||
msgstr "Legg til regel"
|
msgstr "Legg til regel"
|
||||||
|
|
||||||
|
#: extensions/auto-move-windows/prefs.js:106
|
||||||
|
msgid "Create new matching rule"
|
||||||
|
msgstr "Lag en ny regel for treff"
|
||||||
|
|
||||||
|
#: extensions/auto-move-windows/prefs.js:111
|
||||||
|
msgid "Add"
|
||||||
|
msgstr "Legg til"
|
||||||
|
|
||||||
#. TRANSLATORS: %s is the filesystem name
|
#. TRANSLATORS: %s is the filesystem name
|
||||||
#: extensions/drive-menu/extension.js:122
|
#: extensions/drive-menu/extension.js:107
|
||||||
#: extensions/places-menu/placeDisplay.js:213
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Ejecting drive “%s” failed:"
|
msgid "Ejecting drive “%s” failed:"
|
||||||
msgstr "Løsning av lagringsenheten “%s” mislyktes:"
|
msgstr "Utløsing av stasjon «%s» feilet:"
|
||||||
|
|
||||||
#: extensions/drive-menu/extension.js:141
|
#: extensions/drive-menu/extension.js:125
|
||||||
msgid "Removable devices"
|
msgid "Removable devices"
|
||||||
msgstr "Flyttbare enheter"
|
msgstr "Avtagbare enheter"
|
||||||
|
|
||||||
#: extensions/drive-menu/extension.js:163
|
#: extensions/drive-menu/extension.js:150
|
||||||
msgid "Open Files"
|
msgid "Open Files"
|
||||||
msgstr "Åpne filer"
|
msgstr "Åpne fil"
|
||||||
|
|
||||||
|
#: extensions/example/extension.js:17
|
||||||
|
msgid "Hello, world!"
|
||||||
|
msgstr "Hallo verden!"
|
||||||
|
|
||||||
|
#: extensions/example/org.gnome.shell.extensions.example.gschema.xml:5
|
||||||
|
msgid "Alternative greeting text."
|
||||||
|
msgstr "Alternativ velkomsttekst."
|
||||||
|
|
||||||
|
#: extensions/example/org.gnome.shell.extensions.example.gschema.xml:6
|
||||||
|
msgid ""
|
||||||
|
"If not empty, it contains the text that will be shown when clicking on the "
|
||||||
|
"panel."
|
||||||
|
msgstr ""
|
||||||
|
"Hvis denne ikke er tom, inneholder den tekst som vises når brukeren klikker "
|
||||||
|
"på panelet."
|
||||||
|
|
||||||
|
#: extensions/example/prefs.js:30
|
||||||
|
msgid "Message"
|
||||||
|
msgstr "Melding"
|
||||||
|
|
||||||
|
#. TRANSLATORS: Example is the name of the extension, should not be
|
||||||
|
#. translated
|
||||||
|
#: extensions/example/prefs.js:43
|
||||||
|
msgid ""
|
||||||
|
"Example aims to show how to build well behaved extensions for the Shell and "
|
||||||
|
"as such it has little functionality on its own.\n"
|
||||||
|
"Nevertheless it’s possible to customize the greeting message."
|
||||||
|
msgstr ""
|
||||||
|
"Example har som hensikt å vise hvordan du kan bygge godt fungerende "
|
||||||
|
"utvidelser til Gnome-skallet, og byr dermed på lite funksjonalitet i seg "
|
||||||
|
"selv.\n"
|
||||||
|
"Hvis du likevel har lyst, kan du tilpasse velkomstmeldingen."
|
||||||
|
|
||||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:5
|
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:5
|
||||||
msgid "Use more screen for windows"
|
msgid "Use more screen for windows"
|
||||||
msgstr "Bruk mer av skjermen til vinduer"
|
msgstr "Bruk mer skjerm til vinduer"
|
||||||
|
|
||||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:6
|
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:6
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -88,14 +185,14 @@ msgid ""
|
|||||||
"aspect ratio, and consolidating them further to reduce the bounding box. "
|
"aspect ratio, and consolidating them further to reduce the bounding box. "
|
||||||
"This setting applies only with the natural placement strategy."
|
"This setting applies only with the natural placement strategy."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Prøv å bruke mer av skjermen til miniatyrvinduer ved å tilpasse dem til "
|
"Prøv å bruke mer skjermplass for å plassere miniatyrvinduer ved å tilpasse "
|
||||||
"skjermens høyde- og breddeforhold, og ved å samle dem tettere sammen for å "
|
"dem til skjermens høyde- og breddeforhold, og slå dem sammen ytterligere for "
|
||||||
"redusere tomrom. Denne innstillingen virker bare når naturlig plassering er "
|
"å redusere avgrensingsboksen. Denne innstillinga gjelder bare med naturlig "
|
||||||
"i bruk."
|
"plassering-strategien."
|
||||||
|
|
||||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:11
|
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:11
|
||||||
msgid "Place window captions on top"
|
msgid "Place window captions on top"
|
||||||
msgstr "Plasser vindustekster i toppen"
|
msgstr "Plasser vindutekster i toppen"
|
||||||
|
|
||||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:12
|
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:12
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -103,97 +200,103 @@ msgid ""
|
|||||||
"shell default of placing it at the bottom. Changing this setting requires "
|
"shell default of placing it at the bottom. Changing this setting requires "
|
||||||
"restarting the shell to have any effect."
|
"restarting the shell to have any effect."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Hvis denne innstillingen er slått på, plasseres vindustekster på toppen av "
|
"Hvis verdien av denne er «true» (sann), plasseres vindutekster i toppen av "
|
||||||
"sine respektive miniatyrbilder i stedet for på bunnen. For at denne "
|
"gjeldende miniatyr og overstyrer skallets standard bunnplassering. Hvis du "
|
||||||
"innstillingen skal tre i kraft, må GNOME Shell startes på nytt."
|
"endrer denne innstillinga, må du starte skallet på nytt for at den skal tre "
|
||||||
|
"i kraft."
|
||||||
|
|
||||||
#: extensions/places-menu/extension.js:85
|
#: extensions/places-menu/extension.js:78
|
||||||
#: extensions/places-menu/extension.js:88
|
#: extensions/places-menu/extension.js:81
|
||||||
msgid "Places"
|
msgid "Places"
|
||||||
msgstr "Steder"
|
msgstr "Steder"
|
||||||
|
|
||||||
#: extensions/places-menu/placeDisplay.js:53
|
#: extensions/places-menu/placeDisplay.js:65
|
||||||
#, javascript-format
|
|
||||||
msgid "Failed to launch “%s”"
|
|
||||||
msgstr "Oppstart av “%s” mislyktes"
|
|
||||||
|
|
||||||
#: extensions/places-menu/placeDisplay.js:68
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Failed to mount volume for “%s”"
|
msgid "Failed to mount volume for “%s”"
|
||||||
msgstr "Klarte ikke å montere dataområde for “%s”"
|
msgstr "Klarte ikke å montere volum for «%s»"
|
||||||
|
|
||||||
#: extensions/places-menu/placeDisplay.js:128
|
#: extensions/places-menu/placeDisplay.js:78
|
||||||
#: extensions/places-menu/placeDisplay.js:151
|
#, javascript-format
|
||||||
|
msgid "Failed to launch “%s”"
|
||||||
|
msgstr "Klarte ikke å starte «%s»"
|
||||||
|
|
||||||
|
#: extensions/places-menu/placeDisplay.js:137
|
||||||
|
#: extensions/places-menu/placeDisplay.js:160
|
||||||
msgid "Computer"
|
msgid "Computer"
|
||||||
msgstr "Datamaskin"
|
msgstr "Datamaskin"
|
||||||
|
|
||||||
#: extensions/places-menu/placeDisplay.js:328
|
#: extensions/places-menu/placeDisplay.js:303
|
||||||
msgid "Home"
|
msgid "Home"
|
||||||
msgstr "Hjem"
|
msgstr "Hjem"
|
||||||
|
|
||||||
#: extensions/places-menu/placeDisplay.js:373
|
#: extensions/places-menu/placeDisplay.js:347
|
||||||
msgid "Browse Network"
|
msgid "Browse Network"
|
||||||
msgstr "Bla gjennom nettverk"
|
msgstr "Bla gjennom nettverk"
|
||||||
|
|
||||||
#: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:7
|
#: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:7
|
||||||
msgid "Cycle Screenshot Sizes"
|
msgid "Cycle Screenshot Sizes"
|
||||||
msgstr "Bla gjennom skjermbildestørrelser"
|
msgstr "Bla gjennom størrelser på skjermdump"
|
||||||
|
|
||||||
#: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:11
|
#: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:11
|
||||||
msgid "Cycle Screenshot Sizes Backward"
|
msgid "Cycle Screenshot Sizes Backward"
|
||||||
msgstr "Bla gjennom skjermbildestørrelser baklengs"
|
msgstr "Bla gjennom størrelser på skjermdump baklengs"
|
||||||
|
|
||||||
#: extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml:5
|
#: extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml:5
|
||||||
msgid "Theme name"
|
msgid "Theme name"
|
||||||
msgstr "Stilnavn"
|
msgstr "Navn på tema"
|
||||||
|
|
||||||
#: extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml:6
|
#: extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml:6
|
||||||
msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
|
msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
|
||||||
msgstr "Navn på stil, som vil bli lastet fra ~/.themes/{navn}/gnome-shell"
|
msgstr "Navn på tema som skal lastes fra ~/.themes/name/gnome-shell"
|
||||||
|
|
||||||
#: extensions/window-list/extension.js:71
|
#: extensions/window-list/extension.js:110
|
||||||
msgid "Close"
|
msgid "Close"
|
||||||
msgstr "Lukk"
|
msgstr "Lukk"
|
||||||
|
|
||||||
#: extensions/window-list/extension.js:98
|
#: extensions/window-list/extension.js:129
|
||||||
msgid "Unminimize"
|
msgid "Unminimize"
|
||||||
msgstr "Gjenopprett"
|
msgstr "Gjenopprett"
|
||||||
|
|
||||||
#: extensions/window-list/extension.js:98
|
#: extensions/window-list/extension.js:130
|
||||||
msgid "Minimize"
|
msgid "Minimize"
|
||||||
msgstr "Minimer"
|
msgstr "Minimer"
|
||||||
|
|
||||||
#: extensions/window-list/extension.js:105
|
#: extensions/window-list/extension.js:136
|
||||||
msgid "Unmaximize"
|
msgid "Unmaximize"
|
||||||
msgstr "Demaksimer"
|
msgstr "Gjenopprett"
|
||||||
|
|
||||||
#: extensions/window-list/extension.js:105
|
#: extensions/window-list/extension.js:137
|
||||||
msgid "Maximize"
|
msgid "Maximize"
|
||||||
msgstr "Maksimer"
|
msgstr "Maksimer"
|
||||||
|
|
||||||
#: extensions/window-list/extension.js:468
|
#: extensions/window-list/extension.js:420
|
||||||
msgid "Minimize all"
|
msgid "Minimize all"
|
||||||
msgstr "Minimer alle"
|
msgstr "Minimer alle"
|
||||||
|
|
||||||
#: extensions/window-list/extension.js:474
|
#: extensions/window-list/extension.js:428
|
||||||
msgid "Unminimize all"
|
msgid "Unminimize all"
|
||||||
msgstr "Gjenopprett alle"
|
msgstr "Gjenopprett alle"
|
||||||
|
|
||||||
#: extensions/window-list/extension.js:480
|
#: extensions/window-list/extension.js:436
|
||||||
msgid "Maximize all"
|
msgid "Maximize all"
|
||||||
msgstr "Maksimer alle"
|
msgstr "Maksimer alle"
|
||||||
|
|
||||||
#: extensions/window-list/extension.js:488
|
#: extensions/window-list/extension.js:445
|
||||||
msgid "Unmaximize all"
|
msgid "Unmaximize all"
|
||||||
msgstr "Demaksimer alle"
|
msgstr "Gjenopprett alle"
|
||||||
|
|
||||||
#: extensions/window-list/extension.js:496
|
#: extensions/window-list/extension.js:454
|
||||||
msgid "Close all"
|
msgid "Close all"
|
||||||
msgstr "Lukk alle"
|
msgstr "Lukk alle"
|
||||||
|
|
||||||
#: extensions/window-list/extension.js:776
|
#: extensions/window-list/extension.js:678
|
||||||
|
#: extensions/workspace-indicator/extension.js:30
|
||||||
|
msgid "Workspace Indicator"
|
||||||
|
msgstr "Arbeidsområdeindikator"
|
||||||
|
|
||||||
|
#: extensions/window-list/extension.js:842
|
||||||
msgid "Window List"
|
msgid "Window List"
|
||||||
msgstr "Vindusliste"
|
msgstr "Vinduliste"
|
||||||
|
|
||||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:12
|
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:12
|
||||||
msgid "When to group windows"
|
msgid "When to group windows"
|
||||||
@@ -204,146 +307,50 @@ msgid ""
|
|||||||
"Decides when to group windows from the same application on the window list. "
|
"Decides when to group windows from the same application on the window list. "
|
||||||
"Possible values are “never”, “auto” and “always”."
|
"Possible values are “never”, “auto” and “always”."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Avgjør når vinduer som tilhører samme app skal grupperes i vindulista. "
|
"Avgjør når vinduer fra samme program skal grupperes i vindulista. Mulige "
|
||||||
"Mulige verdier er “never” (aldri), “auto” og “always” (alltid)."
|
"verdier er «never» (aldri), «auto» og «always» (alltid)."
|
||||||
|
|
||||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20
|
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20
|
||||||
#: extensions/window-list/prefs.js:76
|
msgid "Show the window list on all monitors"
|
||||||
msgid "Show windows from all workspaces"
|
msgstr "Vis vindulisten på alle skjermer"
|
||||||
msgstr "Vis vinduer fra alle områder"
|
|
||||||
|
|
||||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:21
|
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:21
|
||||||
msgid "Whether to show windows from all workspaces or only the current one."
|
|
||||||
msgstr "Om det skal vises vinduer fra alle områder eller bare det nåværende."
|
|
||||||
|
|
||||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:27
|
|
||||||
msgid "Show the window list on all monitors"
|
|
||||||
msgstr "Vis vinduslisten på alle skjermer"
|
|
||||||
|
|
||||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:28
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Whether to show the window list on all connected monitors or only on the "
|
"Whether to show the window list on all connected monitors or only on the "
|
||||||
"primary one."
|
"primary one."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Om vinduslisten skal vises på alle tilkoblede skjermer eller bare "
|
"Hvorvidt vindulisten skal vises på alle tilkoblede skjermer eller bare "
|
||||||
"hovedskjermen."
|
"primærskjerm."
|
||||||
|
|
||||||
#: extensions/window-list/prefs.js:32
|
#: extensions/window-list/prefs.js:32
|
||||||
msgid "Window Grouping"
|
msgid "Window Grouping"
|
||||||
msgstr "Vindusgruppering"
|
msgstr "Gruppering av vinduer"
|
||||||
|
|
||||||
#: extensions/window-list/prefs.js:37
|
#: extensions/window-list/prefs.js:50
|
||||||
msgid "Never group windows"
|
msgid "Never group windows"
|
||||||
msgstr "Aldri grupper vinduer"
|
msgstr "Aldri grupper vinduer"
|
||||||
|
|
||||||
#: extensions/window-list/prefs.js:38
|
#: extensions/window-list/prefs.js:51
|
||||||
msgid "Group windows when space is limited"
|
msgid "Group windows when space is limited"
|
||||||
msgstr "Grupper vinduer når det er begrenset med plass"
|
msgstr "Grupper vinduer når det er begrenset med plass"
|
||||||
|
|
||||||
#: extensions/window-list/prefs.js:39
|
#: extensions/window-list/prefs.js:52
|
||||||
msgid "Always group windows"
|
msgid "Always group windows"
|
||||||
msgstr "Alltid grupper vinduer"
|
msgstr "Alltid grupper vinduer"
|
||||||
|
|
||||||
#: extensions/window-list/prefs.js:63
|
#: extensions/window-list/prefs.js:75
|
||||||
msgid "Show on all monitors"
|
msgid "Show on all monitors"
|
||||||
msgstr "Vis på alle skjermer"
|
msgstr "Vis på alle skjermer"
|
||||||
|
|
||||||
#: extensions/window-list/workspaceIndicator.js:248
|
#: extensions/workspace-indicator/prefs.js:141
|
||||||
#: extensions/workspace-indicator/extension.js:252
|
msgid "Workspace Names"
|
||||||
msgid "Workspace Indicator"
|
msgstr "Navn på arbeidsområder"
|
||||||
msgstr "Områdeindikator"
|
|
||||||
|
|
||||||
#: extensions/workspace-indicator/prefs.js:65
|
#: extensions/workspace-indicator/prefs.js:157
|
||||||
|
msgid "Name"
|
||||||
|
msgstr "Navn"
|
||||||
|
|
||||||
|
#: extensions/workspace-indicator/prefs.js:198
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Workspace %d"
|
msgid "Workspace %d"
|
||||||
msgstr "Område %d"
|
msgstr "Arbeidsområde %d"
|
||||||
|
|
||||||
#: extensions/workspace-indicator/prefs.js:132
|
|
||||||
msgid "Workspace Names"
|
|
||||||
msgstr "Områdenavn"
|
|
||||||
|
|
||||||
#: extensions/workspace-indicator/prefs.js:258
|
|
||||||
msgid "Add Workspace"
|
|
||||||
msgstr "Legg til område"
|
|
||||||
|
|
||||||
#~ msgid "Attach modal dialog to the parent window"
|
|
||||||
#~ msgstr "Fest modal dialog til opphavsvindu"
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "This key overrides the key in org.gnome.mutter when running GNOME Shell."
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "Denne nøkkelen overstyrer nøkkelen i org.gnome.mutter når GNOME Shell "
|
|
||||||
#~ "kjører."
|
|
||||||
|
|
||||||
#~ msgid "Arrangement of buttons on the titlebar"
|
|
||||||
#~ msgstr "Plassering av knapper på tittellinjen"
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "This key overrides the key in org.gnome.desktop.wm.preferences when "
|
|
||||||
#~ "running GNOME Shell."
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "Denne nøkkelen overstyrer nøkkelen i org.gnome.desktop.wm.preferences når "
|
|
||||||
#~ "GNOME Shell kjører."
|
|
||||||
|
|
||||||
#~ msgid "Enable edge tiling when dropping windows on screen edges"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "Del opp skjermkantene i fliser når brukeren drar og slipper vinduer på dem"
|
|
||||||
|
|
||||||
#~ msgid "Workspaces only on primary monitor"
|
|
||||||
#~ msgstr "Arbeidsområder kun på hovedskjerm"
|
|
||||||
|
|
||||||
#~ msgid "Delay focus changes in mouse mode until the pointer stops moving"
|
|
||||||
#~ msgstr "Vent med å endre fokus i mus-modus til pekeren holdes i ro"
|
|
||||||
|
|
||||||
#~ msgid "Thumbnail only"
|
|
||||||
#~ msgstr "Kun miniatyr"
|
|
||||||
|
|
||||||
#~ msgid "Application icon only"
|
|
||||||
#~ msgstr "Kun programikon"
|
|
||||||
|
|
||||||
#~ msgid "Thumbnail and application icon"
|
|
||||||
#~ msgstr "Miniatyr og programikon"
|
|
||||||
|
|
||||||
#~ msgid "Present windows as"
|
|
||||||
#~ msgstr "Vis vinduer som"
|
|
||||||
|
|
||||||
#~ msgid "Activities Overview"
|
|
||||||
#~ msgstr "Aktivitetsoversikt"
|
|
||||||
|
|
||||||
#~ msgid "Application"
|
|
||||||
#~ msgstr "Program"
|
|
||||||
|
|
||||||
#~ msgid "Create new matching rule"
|
|
||||||
#~ msgstr "Lag en ny regel for treff"
|
|
||||||
|
|
||||||
#~ msgid "Add"
|
|
||||||
#~ msgstr "Legg til"
|
|
||||||
|
|
||||||
#~ msgid "Hello, world!"
|
|
||||||
#~ msgstr "Hallo verden!"
|
|
||||||
|
|
||||||
#~ msgid "Alternative greeting text."
|
|
||||||
#~ msgstr "Alternativ velkomsttekst."
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "If not empty, it contains the text that will be shown when clicking on "
|
|
||||||
#~ "the panel."
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "Hvis denne ikke er tom, inneholder den tekst som vises når brukeren "
|
|
||||||
#~ "klikker på panelet."
|
|
||||||
|
|
||||||
#~ msgid "Message"
|
|
||||||
#~ msgstr "Melding"
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "Example aims to show how to build well behaved extensions for the Shell "
|
|
||||||
#~ "and as such it has little functionality on its own.\n"
|
|
||||||
#~ "Nevertheless it’s possible to customize the greeting message."
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "Example har som hensikt å vise hvordan du kan bygge godt fungerende "
|
|
||||||
#~ "utvidelser til Gnome-skallet, og byr dermed på lite funksjonalitet i seg "
|
|
||||||
#~ "selv.\n"
|
|
||||||
#~ "Hvis du likevel har lyst, kan du tilpasse velkomstmeldingen."
|
|
||||||
|
|
||||||
#~ msgid "Name"
|
|
||||||
#~ msgstr "Navn"
|
|
||||||
|
|||||||
Reference in New Issue
Block a user