Compare commits

...

42 Commits

Author SHA1 Message Date
Florian Müllner
1b881e1eaa Bump version to 3.31.2
Update NEWS.
2018-11-14 02:21:07 +01:00
Florian Müllner
40a8ab60f4 Update sass submodule 2018-11-14 02:21:07 +01:00
Piotr Drąg
b684e756e2 Update POTFILES.in 2018-11-13 01:26:18 +01:00
Florian Müllner
7eae32eb76 workspace-indicator: Don't override ClutterActor.destroy()
Now that PanelMenu.Button was made an StWidget subclass, the destroy()
method actually maps to the ClutterActor method, and overriding it
results in warnings when the extension is disabled. So instead, use
the existing ::destroy handler.

https://gitlab.gnome.org/GNOME/gnome-shell-extensions/issues/113
2018-11-12 23:42:06 +00:00
Florian Müllner
34c20e6176 workspace-indicator: Stop using compatibility actor property
PanelMenu.Button sets up a `this.actor = this` property for compatibility,
but let's reflect the actual new object hierarchy.

https://gitlab.gnome.org/GNOME/gnome-shell-extensions/issues/113
2018-11-12 23:42:06 +00:00
Florian Müllner
62818e71e9 workspace-indicator: Adjust to gnome-shell changes
PanelMenu.Button is now a GObject subclass, so initialization must
happen in _init() rather than constructor().

https://gitlab.gnome.org/GNOME/gnome-shell-extensions/issues/113
2018-11-12 23:42:06 +00:00
Florian Müllner
ee85839d60 drive-menu: Don't override ClutterActor.destroy()
Now that PanelMenu.Button was made an StWidget subclass, the destroy()
method actually maps to the ClutterActor method, and overriding it
results in warnings when the extension is disabled. So instead, use
the existing ::destroy handler.

https://gitlab.gnome.org/GNOME/gnome-shell-extensions/issues/113
2018-11-12 23:42:06 +00:00
Florian Müllner
d9932b8f55 drive-menu: Stop using compatibility actor property
PanelMenu.Button sets up a `this.actor = this` property for compatibility,
but let's reflect the actual new object hierarchy.

https://gitlab.gnome.org/GNOME/gnome-shell-extensions/issues/113
2018-11-12 23:42:06 +00:00
Florian Müllner
efa882080f drive-menu: Adjust to gnome-shell changes
PanelMenu.Button is now a GObject subclass, so initialization must
happen in _init() rather than constructor().

https://gitlab.gnome.org/GNOME/gnome-shell-extensions/issues/113
2018-11-12 23:42:06 +00:00
Florian Müllner
132b3b0509 places-menu: Don't override ClutterActor.destroy()
Now that PanelMenu.Button was made an StWidget subclass, the destroy()
method actually maps to the ClutterActor method, and overriding it
results in warnings when the extension is disabled. So instead, use
the existing ::destroy handler.

https://gitlab.gnome.org/GNOME/gnome-shell-extensions/issues/113
2018-11-12 23:42:06 +00:00
Florian Müllner
e5a0616a0a places-menu: Stop using compatibility actor property
PanelMenu.Button sets up a `this.actor = this` property for compatibility,
but let's reflect the actual new object hierarchy.

https://gitlab.gnome.org/GNOME/gnome-shell-extensions/issues/113
2018-11-12 23:42:06 +00:00
Florian Müllner
fbeb3cf1e9 places-menu: Adjust to gnome-shell changes
PanelMenu.Button is now a GObject subclass, so initialization must
happen in _init() rather than constructor().

https://gitlab.gnome.org/GNOME/gnome-shell-extensions/issues/113
2018-11-12 23:42:06 +00:00
Florian Müllner
072fbee7cb apps-menu: Stop using compatibility actor property
PanelMenu.Button sets up a `this.actor = this` property for compatibility,
but let's reflect the actual new object hierarchy.

https://gitlab.gnome.org/GNOME/gnome-shell-extensions/issues/113
2018-11-12 23:42:06 +00:00
Florian Müllner
e9928b3c08 apps-menu: Adjust to gnome-shell changes
PanelMenu.Button is now a GObject subclass, so initialization must
happen in _init() rather than constructor().

https://gitlab.gnome.org/GNOME/gnome-shell-extensions/issues/113
2018-11-12 23:42:06 +00:00
Florian Müllner
2af737a8c2 apps-menu: Remove pointless destroy() implementation
https://gitlab.gnome.org/GNOME/gnome-shell-extensions/issues/113
2018-11-12 23:42:06 +00:00
Florian Müllner
321702fd15 window-list: Stop using compatibility actor property
PanelMenu.Button sets up a `this.actor = this` property for compatibility,
but let's reflect the actual new object hierarchy.

https://gitlab.gnome.org/GNOME/gnome-shell-extensions/issues/113
2018-11-12 23:42:06 +00:00
Florian Müllner
60493faf96 window-list: Don't override ClutterActor.destroy()
Now that PanelMenu.Button was made an StWidget subclass, the destroy()
method actually maps to the ClutterActor method, and overriding it
results in warnings when the extension is disabled. So instead, use
the existing ::destroy handler.

https://gitlab.gnome.org/GNOME/gnome-shell-extensions/issues/113
2018-11-12 23:42:06 +00:00
Florian Müllner
821cbf9328 window-list: Adjust to gnome-shell changes
PanelMenu.Button is now a GObject subclass, so initialization must
happen in _init() rather than constructor().

https://gitlab.gnome.org/GNOME/gnome-shell-extensions/issues/113
2018-11-12 23:42:06 +00:00
Florian Müllner
cc0f167c0e extensions: Remove example extension
There are plenty of extension examples out there, no need to include
a sample extension that doesn't show-case any useful functionality
but puts additional burden on distributors to exclude it from packaged
extensions.
2018-11-13 00:19:45 +01:00
Florian Müllner
d731534d04 extensions: Remove alternate-tab
Ever since GNOME 3.8 when gnome-shell started to provide the window
switcher functionality itself, the extension has only existed to
change the default behavior of the alt-tab shortcut in the classic
session. Now that we achieve this behavior with a per-desktop override,
there's no longer a need for the extension, so remove it altogether.

Users who prefer the window switcher over the default app switcher
can use the regular keyboard settings to assign a shortcut to the
"Switch windows" action.

https://bugzilla.gnome.org/show_bug.cgi?id=786496
2018-11-13 00:14:44 +01:00
Florian Müllner
94eba47358 Bump version to 3.30.1
Update NEWS.
2018-10-08 22:55:05 +02:00
Florian Müllner
d34933de0b Update sass submodule 2018-10-08 22:50:52 +02:00
Florian Müllner
9410bdfad6 window-list: Ignore hidden buttons when scrolling
Window lists are per-monitor, so workspaces are implemented by
simply hiding all buttons that correspond to windows/apps on
other workspaces. That means we need to take the visibility
into account when handling scroll-events to switch through the
list, or else we'll end up switching "randomly" between workspaces.

https://gitlab.gnome.org/GNOME/gnome-shell-extensions/issues/78
2018-10-06 16:05:46 +00:00
Florian Müllner
d424b0f645 window-list: Minor clean-up
Modern javascript has explicit methods for locating the first
element of an array that meets a certain condition, use those
instead of manually looping over the array.

https://gitlab.gnome.org/GNOME/gnome-shell-extensions/issues/78
2018-10-06 16:05:46 +00:00
Florian Müllner
c0454db0c6 appsMenu: Consider scale-factor in height computation
Actor heights are in physical pixels, while CSS measures are in logical
pixels, so we need to adjust accordingly to prevent the scale factor
from being applied twice.

https://gitlab.gnome.org/GNOME/gnome-shell-extensions/issues/102
2018-09-23 17:31:03 +02:00
Florian Müllner
913b2ba691 Bump version to 3.30.0 2018-09-04 00:10:36 +02:00
Florian Müllner
ba51869b93 Bump version to 3.29.91
Update NEWS.
2018-08-20 15:48:53 +02:00
Florian Müllner
ffe6110ea9 Stop using conditional catch statements
They are a mozilla extension that is going away in SpiderMonkey 60.

https://gitlab.gnome.org/GNOME/gnome-shell-extensions/issues/90
2018-08-13 12:00:22 +02:00
Florian Müllner
8b1bcc9fed Bump version to 3.29.90
Update NEWS.
2018-08-01 03:47:30 +02:00
Florian Müllner
ebad80c64d Update sass submodule 2018-08-01 03:46:05 +02:00
Florian Müllner
39caf951e0 data: Use override for default alt-tab keybindings
Per-desktop overrides aren't limited to keys in org.gnome.mutter, so
we can use them instead of the alternate-tab extension to default to
the window switcher in the classic session.

https://bugzilla.gnome.org/show_bug.cgi?id=786496
2018-07-09 19:18:54 +02:00
Florian Müllner
ecf28e13b4 window-list: Use correct settings schemas
Override schemas are gone (yay!), so we can now simply use the original
schema independent from the used session mode.

https://bugzilla.gnome.org/show_bug.cgi?id=786496
2018-07-09 19:18:54 +02:00
Florian Müllner
a01b44f7de data: Replace override schema with per-desktop override
GSettings now recognizes per-desktop overrides that can be used
to change schemas' default values for classic mode, so use that
instead of the separate override schema we currently use with
mutter's custom override mechanism.

https://bugzilla.gnome.org/show_bug.cgi?id=786496
2018-07-09 19:18:54 +02:00
Florian Müllner
6b1926bab3 Bump version to 3.29.3
Update NEWS.
2018-07-09 19:09:13 +02:00
Florian Müllner
64986740e3 Update sass submodule 2018-07-09 19:08:15 +02:00
Jonas Ådahl
6583eae622 Remove usage of MetaScreen
As of the libmutter API version 3 MetaScreen does no longer exist.
Functionality that previously depended on MetaScreen has been moved
elsewhere (e.g. MetaDisplay or MetaWorkspaceManager etc).

https://bugzilla.gnome.org/show_bug.cgi?id=759538
2018-07-06 19:53:08 +02:00
Florian Müllner
9add688abf Actually bump version number
Gah ...
2018-05-24 19:06:33 +02:00
Florian Müllner
a85764a0ab Bump version to 3.29.2
Update NEWS.
2018-05-24 19:04:07 +02:00
Florian Müllner
eaa2c7857e Update submodule URL
gnome-shell-sass was migrated to gitlab, so update to the correct URL
instead of relying on the redirect.
2018-05-24 19:04:07 +02:00
Florian Müllner
6e1b5bc346 Update sass submodule 2018-05-24 19:01:36 +02:00
Florian Müllner
f59ab1272d drive-menu: Disconnect volume monitor signals
The handler IDs were renamed at some point, resulting in the signals
not being disconnected on disable.
2018-05-10 18:56:23 +02:00
Florian Müllner
f25ffe6f63 build: Include translations in uploaded zip files
The meson port accidentally dropped translations from the generated
zip files for uploading to extensions.gnome.org, add them back.

https://gitlab.gnome.org/GNOME/gnome-shell-extensions/issues/69
2018-05-07 12:00:19 +02:00
29 changed files with 274 additions and 553 deletions

2
.gitmodules vendored
View File

@@ -1,3 +1,3 @@
[submodule "data/gnome-shell-sass"]
path = data/gnome-shell-sass
url = https://git.gnome.org/browse/gnome-shell-sass/
url = https://gitlab.gnome.org/GNOME/gnome-shell-sass.git

49
NEWS
View File

@@ -1,3 +1,52 @@
3.31.2
======
* Remove obsolete alternate-tab extension [Florian; #786496]
* Adjust to gnome-shell changes [Florian; #113]
Contributors:
Florian Müllner
3.30.1
======
* apps-menu: Fix height on HiDPI systems [Florian; #102]
* window-list: Only switch between windows on active workspace when scrolling
[Florian; #78]
Contributors:
Florian Müllner
3.30.0
======
* Bump version
3.29.91
=======
* Misc. bug fixes [Florian; #90]
Contributors:
Florian Müllner
3.29.90
=======
* Misc. bug fixes [Florian; #786496]
Contributors:
Florian Müllner
3.29.3
======
* Adjust to global.screen removal [Jonas; #759538]
Contributors:
Jonas Ådahl, Florian Müllner
3.29.2
======
* Misc. bug fixes [Florian; #69]
Contributors:
Florian Müllner
3.28.1
======
* Misc. bug fixes [Xiaoguang, Florian; #59, #62]

View File

@@ -15,10 +15,6 @@ Bugs should be reported to the GNOME [bug tracking system][bug-tracker].
## Extensions
* alternate-tab
Lets you use classic Alt+Tab (window-based instead of app-based) in GNOME Shell.
* apps-menu
Lets you reach an application using gnome 2.x style menu on the panel.
@@ -34,10 +30,6 @@ GSettings key.
Shows a status menu for rapid unmount and power off of external storage devices
(i.e. pendrives)
* example
A minimal example illustrating how to write extensions.
* launch-new-instance
Changes application icons to always launch a new instance when activated.

View File

@@ -0,0 +1,9 @@
[org.gnome.mutter:GNOME-Classic]
dynamic-workspaces=false
[org.gnome.desktop.wm.preferences:GNOME-Classic]
button-layout='appmenu:minimize,maximize,close'
[org.gnome.desktop.wm.keybindings:GNOME-Classic]
switch-applications=[]
switch-windows=['<Super>Tab','<Alt>Tab']

View File

@@ -59,5 +59,5 @@ custom_target(style + '.css',
install_data(theme_data, install_dir: themedir)
classic_schema = 'org.gnome.shell.extensions.classic-overrides.gschema.xml'
install_data(classic_schema, install_dir: schemadir)
classic_override = '00_org.gnome.shell.extensions.classic.gschema.override'
install_data(classic_override, install_dir: schemadir)

View File

@@ -1,46 +0,0 @@
<schemalist>
<schema id="org.gnome.shell.extensions.classic-overrides"
path="/org/gnome/shell/extensions/classic-overrides/"
gettext-domain="gnome-shell-extensions">
<key name="attach-modal-dialogs" type="b">
<default>true</default>
<summary>Attach modal dialog to the parent window</summary>
<description>
This key overrides the key in org.gnome.mutter when running
GNOME Shell.
</description>
</key>
<key name="button-layout" type="s">
<default>"appmenu:minimize,maximize,close"</default>
<summary>Arrangement of buttons on the titlebar</summary>
<description>
This key overrides the key in org.gnome.desktop.wm.preferences when running GNOME Shell.
</description>
</key>
<key name="edge-tiling" type="b">
<default>true</default>
<summary>Enable edge tiling when dropping windows on screen edges</summary>
<description>
This key overrides the key in org.gnome.mutter when running GNOME Shell.
</description>
</key>
<key name="workspaces-only-on-primary" type="b">
<default>true</default>
<summary>Workspaces only on primary monitor</summary>
<description>
This key overrides the key in org.gnome.mutter when running GNOME Shell.
</description>
</key>
<key name="focus-change-on-pointer-rest" type="b">
<default>true</default>
<summary>Delay focus changes in mouse mode until the pointer stops moving</summary>
<description>
This key overrides the key in org.gnome.mutter when running GNOME Shell.
</description>
</key>
</schema>
</schemalist>

View File

@@ -22,6 +22,7 @@ for f in $extensiondir/*; do
schema=$schemadir/org.gnome.shell.extensions.$name.gschema.xml
cp $srcdir/NEWS $srcdir/COPYING $f
cp -r $localedir $f
if [ -f $schema ]; then
mkdir $f/schemas

View File

@@ -1,62 +0,0 @@
/* -*- mode: js; js-basic-offset: 4; indent-tabs-mode: nil -*- */
const Clutter = imports.gi.Clutter;
const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell;
const AltTab = imports.ui.altTab;
const Main = imports.ui.main;
const WindowManager = imports.ui.windowManager;
let injections = {};
function init(metadata) {
}
function setKeybinding(name, func) {
Main.wm.setCustomKeybindingHandler(name, Shell.ActionMode.NORMAL, func);
}
function enable() {
injections['_keyPressHandler'] = AltTab.WindowSwitcherPopup.prototype._keyPressHandler;
AltTab.WindowSwitcherPopup.prototype._keyPressHandler = function(keysym, action) {
switch(action) {
case Meta.KeyBindingAction.SWITCH_APPLICATIONS:
action = Meta.KeyBindingAction.SWITCH_WINDOWS;
break;
case Meta.KeyBindingAction.SWITCH_APPLICATIONS_BACKWARD:
action = Meta.KeyBindingAction.SWITCH_WINDOWS_BACKWARD;
break;
}
return injections['_keyPressHandler'].call(this, keysym, action);
};
Main.wm._forcedWindowSwitcher = function(display, screen, window, binding) {
/* prevent a corner case where both popups show up at once */
if (this._workspaceSwitcherPopup != null)
this._workspaceSwitcherPopup.destroy();
let tabPopup = new AltTab.WindowSwitcherPopup();
if (!tabPopup.show(binding.is_reversed(), binding.get_name(), binding.get_mask()))
tabPopup.destroy();
};
setKeybinding('switch-applications',
Main.wm._forcedWindowSwitcher.bind(Main.wm));
setKeybinding('switch-applications-backward',
Main.wm._forcedWindowSwitcher.bind(Main.wm));
}
function disable() {
var prop;
setKeybinding('switch-applications',
Main.wm._startSwitcher.bind(Main.wm));
setKeybinding('switch-applications-backward',
Main.wm._startSwitcher.bind(Main.wm));
for (prop in injections)
AltTab.WindowSwitcherPopup.prototype[prop] = injections[prop];
delete Main.wm._forcedWindowSwitcher;
}

View File

@@ -1,11 +0,0 @@
{
"extension-id": "@extension_id@",
"uuid": "@uuid@",
"settings-schema": "@gschemaname@",
"gettext-domain": "@gettext_domain@",
"name": "AlternateTab",
"description": "Substitute Alt-Tab with a window based switcher that does not group by application.\nThis extension is part of Classic Mode and is officially supported by GNOME. Please do not report bugs using the form below, use GNOME's GitLab instance instead.",
"original-authors": [ "jw@bargsten.org", "thomas.bouffon@gmail.com" ],
"shell-version": [ "@shell_current@" ],
"url": "@url@"
}

View File

@@ -1,81 +0,0 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const Gio = imports.gi.Gio;
const Gtk = imports.gi.Gtk;
const GObject = imports.gi.GObject;
const Gettext = imports.gettext.domain('gnome-shell-extensions');
const _ = Gettext.gettext;
const N_ = e => e;
const ExtensionUtils = imports.misc.extensionUtils;
const Me = ExtensionUtils.getCurrentExtension();
const Convenience = Me.imports.convenience;
const SETTINGS_APP_ICON_MODE = 'app-icon-mode';
const SETTINGS_CURRENT_WORKSPACE_ONLY = 'current-workspace-only';
const MODES = {
'thumbnail-only': N_("Thumbnail only"),
'app-icon-only': N_("Application icon only"),
'both': N_("Thumbnail and application icon"),
};
const AltTabSettingsWidget = GObject.registerClass(
class AltTabSettingsWidget extends Gtk.Grid {
_init(params) {
super._init(params);
this.margin = 24;
this.row_spacing = 6;
this.orientation = Gtk.Orientation.VERTICAL;
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell.window-switcher' });
let presentLabel = '<b>' + _("Present windows as") + '</b>';
this.add(new Gtk.Label({ label: presentLabel, use_markup: true,
halign: Gtk.Align.START }));
let align = new Gtk.Alignment({ left_padding: 12 });
this.add(align);
let grid = new Gtk.Grid({ orientation: Gtk.Orientation.VERTICAL,
row_spacing: 6,
column_spacing: 6 });
align.add(grid);
let radio = null;
let currentMode = this._settings.get_string(SETTINGS_APP_ICON_MODE);
for (let mode in MODES) {
// copy the mode variable because it has function scope, not block scope
// so cannot be used in a closure
let modeCapture = mode;
let name = Gettext.gettext(MODES[mode]);
radio = new Gtk.RadioButton({ group: radio, label: name, valign: Gtk.Align.START });
radio.connect('toggled', widget => {
if (widget.active)
this._settings.set_string(SETTINGS_APP_ICON_MODE, modeCapture);
});
grid.add(radio);
if (mode == currentMode)
radio.active = true;
}
let check = new Gtk.CheckButton({ label: _("Show only windows in the current workspace"),
margin_top: 6 });
this._settings.bind(SETTINGS_CURRENT_WORKSPACE_ONLY, check, 'active', Gio.SettingsBindFlags.DEFAULT);
this.add(check);
}
});
function init() {
Convenience.initTranslations();
}
function buildPrefsWidget() {
let widget = new AltTabSettingsWidget();
widget.show_all();
return widget;
}

View File

@@ -1 +0,0 @@
/* This extensions requires no special styling */

View File

@@ -3,6 +3,7 @@
const Atk = imports.gi.Atk;
const DND = imports.ui.dnd;
const GMenu = imports.gi.GMenu;
const GObject = imports.gi.GObject;
const Shell = imports.gi.Shell;
const St = imports.gi.St;
const Clutter = imports.gi.Clutter;
@@ -400,17 +401,18 @@ class DesktopTarget {
};
Signals.addSignalMethods(DesktopTarget.prototype);
let ApplicationsButton = GObject.registerClass(
class ApplicationsButton extends PanelMenu.Button {
constructor() {
super(1.0, null, false);
_init() {
super._init(1.0, null, false);
this.setMenu(new ApplicationsMenu(this.actor, 1.0, St.Side.TOP, this));
this.setMenu(new ApplicationsMenu(this, 1.0, St.Side.TOP, this));
Main.panel.menuManager.addMenu(this.menu);
// At this moment applications menu is not keyboard navigable at
// all (so not accessible), so it doesn't make sense to set as
// role ATK_ROLE_MENU like other elements of the panel.
this.actor.accessible_role = Atk.Role.LABEL;
this.accessible_role = Atk.Role.LABEL;
let hbox = new St.BoxLayout({ style_class: 'panel-status-menu-box' });
@@ -420,18 +422,17 @@ class ApplicationsButton extends PanelMenu.Button {
hbox.add_child(this._label);
hbox.add_child(PopupMenu.arrowIcon(St.Side.BOTTOM));
this.actor.add_actor(hbox);
this.actor.name = 'panelApplications';
this.actor.label_actor = this._label;
this.add_actor(hbox);
this.name = 'panelApplications';
this.label_actor = this._label;
this.actor.connect('captured-event', this._onCapturedEvent.bind(this));
this.actor.connect('destroy', this._onDestroy.bind(this));
this.connect('captured-event', this._onCapturedEvent.bind(this));
this._showingId = Main.overview.connect('showing', () => {
this.actor.add_accessible_state (Atk.StateType.CHECKED);
this.add_accessible_state (Atk.StateType.CHECKED);
});
this._hidingId = Main.overview.connect('hiding', () => {
this.actor.remove_accessible_state (Atk.StateType.CHECKED);
this.remove_accessible_state (Atk.StateType.CHECKED);
});
Main.layoutManager.connect('startup-complete',
this._setKeybinding.bind(this));
@@ -685,7 +686,10 @@ class ApplicationsButton extends PanelMenu.Button {
//Load applications
this._displayButtons(this._listApplications(null));
let height = this.categoriesBox.height + MENU_HEIGHT_OFFSET + 'px';
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 + 'px';
this.mainBox.style+=('height: ' + height);
}
@@ -740,11 +744,7 @@ class ApplicationsButton extends PanelMenu.Button {
return applist;
}
destroy() {
super.destroy();
}
};
});
let appsMenuButton;
let activitiesButton;

View File

@@ -79,9 +79,10 @@ class WindowMover {
return;
// ensure we have the required number of workspaces
for (let i = global.screen.n_workspaces; i <= workspaceNum; i++) {
let workspaceManager = global.workspace_manager;
for (let i = workspaceManager.n_workspaces; i <= workspaceNum; i++) {
window.change_workspace_by_index(i - 1, false);
global.screen.append_new_workspace(false, 0);
workspaceManager.append_new_workspace(false, 0);
}
window.change_workspace_by_index(workspaceNum, false);

View File

@@ -1,6 +1,7 @@
// Drive menu extension
const Clutter = imports.gi.Clutter;
const Gio = imports.gi.Gio;
const GObject = imports.gi.GObject;
const St = imports.gi.St;
const Shell = imports.gi.Shell;
@@ -113,9 +114,10 @@ class MountMenuItem extends PopupMenu.PopupBaseMenuItem {
}
};
let DriveMenu = GObject.registerClass(
class DriveMenu extends PanelMenu.Button {
constructor() {
super(0.0, _("Removable devices"));
_init() {
super._init(0.0, _("Removable devices"));
let hbox = new St.BoxLayout({ style_class: 'panel-status-menu-box' });
let icon = new St.Icon({ icon_name: 'media-eject-symbolic',
@@ -123,7 +125,7 @@ class DriveMenu extends PanelMenu.Button {
hbox.add_child(icon);
hbox.add_child(PopupMenu.arrowIcon(St.Side.BOTTOM));
this.actor.add_child(hbox);
this.add_child(hbox);
this._monitor = Gio.VolumeMonitor.get();
this._addedId = this._monitor.connect('mount-added', (monitor, mount) => {
@@ -151,9 +153,9 @@ class DriveMenu extends PanelMenu.Button {
_updateMenuVisibility() {
if (this._mounts.filter(i => i.actor.visible).length > 0)
this.actor.show();
this.show();
else
this.actor.hide();
this.hide();
}
_addMount(mount) {
@@ -174,17 +176,17 @@ class DriveMenu extends PanelMenu.Button {
log ('Removing a mount that was never added to the menu');
}
destroy() {
if (this._connectedId) {
this._monitor.disconnect(this._connectedId);
this._monitor.disconnect(this._disconnectedId);
this._connectedId = 0;
this._disconnectedId = 0;
_onDestroy() {
if (this._addedId) {
this._monitor.disconnect(this._addedId);
this._monitor.disconnect(this._removedId);
this._addedId = 0;
this._removedId = 0;
}
super.destroy();
super._onDestroy();
}
};
});
function init() {
Convenience.initTranslations();

View File

@@ -1,49 +0,0 @@
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
// Sample extension code, makes clicking on the panel show a message
const St = imports.gi.St;
const Mainloop = imports.mainloop;
const Gettext = imports.gettext.domain('gnome-shell-extensions');
const _ = Gettext.gettext;
const Main = imports.ui.main;
const ExtensionUtils = imports.misc.extensionUtils;
const Me = ExtensionUtils.getCurrentExtension();
const Convenience = Me.imports.convenience;
function _showHello() {
let settings = Convenience.getSettings();
let text = settings.get_string('hello-text') || _("Hello, world!");
let label = new St.Label({ style_class: 'helloworld-label', text: text });
let monitor = Main.layoutManager.primaryMonitor;
global.stage.add_actor(label);
label.set_position(Math.floor (monitor.width / 2 - label.width / 2), Math.floor(monitor.height / 2 - label.height / 2));
Mainloop.timeout_add(3000, () => { label.destroy(); });
}
// Put your extension initialization code here
function init(metadata) {
log ('Example extension initalized');
Convenience.initTranslations();
}
let signalId;
function enable() {
log ('Example extension enabled');
Main.panel.actor.reactive = true;
signalId = Main.panel.actor.connect('button-release-event', _showHello);
}
function disable() {
log ('Example extension disabled');
if (signalId) {
Main.panel.actor.disconnect(signalId);
signalId = 0;
}
}

View File

@@ -1,8 +0,0 @@
extension_data += configure_file(
input: metadata_name + '.in',
output: metadata_name,
configuration: metadata_conf
)
extension_sources += files('prefs.js')
extension_schemas += files(metadata_conf.get('gschemaname') + '.gschema.xml')

View File

@@ -1,10 +0,0 @@
{
"extension-id": "@extension_id@",
"uuid": "@uuid@",
"settings-schema": "@gschemaname@",
"gettext-domain": "@gettext_domain@",
"name": "Hello, World!",
"description": "An example extension to show how it works. Shows Hello, world when clicking on the top panel.",
"shell-version": [ "@shell_current@" ],
"url": "@url@"
}

View File

@@ -1,9 +0,0 @@
<schemalist gettext-domain="gnome-shell-extensions">
<schema id="org.gnome.shell.extensions.example" path="/org/gnome/shell/extensions/example/">
<key name="hello-text" type="s">
<default>''</default>
<summary>Alternative greeting text.</summary>
<description>If not empty, it contains the text that will be shown when clicking on the panel.</description>
</key>
</schema>
</schemalist>

View File

@@ -1,54 +0,0 @@
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
const GLib = imports.gi.GLib;
const GObject = imports.gi.GObject;
const Gio = imports.gi.Gio;
const Gtk = imports.gi.Gtk;
const Gettext = imports.gettext.domain('gnome-shell-extensions');
const _ = Gettext.gettext;
const ExtensionUtils = imports.misc.extensionUtils;
const Me = ExtensionUtils.getCurrentExtension();
const Convenience = Me.imports.convenience;
function init() {
Convenience.initTranslations();
}
const ExamplePrefsWidget = GObject.registerClass(
class ExamplePrefsWidget extends Gtk.Grid {
_init(params) {
super._init(params);
this.margin = 12;
this.row_spacing = this.column_spacing = 6;
this.set_orientation(Gtk.Orientation.VERTICAL);
this.add(new Gtk.Label({ label: '<b>' + _("Message") + '</b>',
use_markup: true,
halign: Gtk.Align.START }));
let entry = new Gtk.Entry({ hexpand: true,
margin_bottom: 12 });
this.add(entry);
this._settings = Convenience.getSettings();
this._settings.bind('hello-text', entry, 'text', Gio.SettingsBindFlags.DEFAULT);
// TRANSLATORS: Example is the name of the extension, should not be
// translated
let primaryText = _("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 its possible to customize the greeting message.");
this.add(new Gtk.Label({ label: primaryText,
wrap: true, xalign: 0 }));
}
});
function buildPrefsWidget() {
let widget = new ExamplePrefsWidget();
widget.show_all();
return widget;
}

View File

@@ -1,8 +0,0 @@
/* Example stylesheet */
.helloworld-label {
font-size: 36px;
font-weight: bold;
color: #ffffff;
background-color: rgba(10,10,10,0.7);
border-radius: 5px;
}

View File

@@ -3,6 +3,7 @@
const Clutter = imports.gi.Clutter;
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const GObject = imports.gi.GObject;
const Shell = imports.gi.Shell;
const St = imports.gi.St;
@@ -74,9 +75,10 @@ const SECTIONS = [
'network'
]
let PlacesMenu = GObject.registerClass(
class PlacesMenu extends PanelMenu.Button {
constructor() {
super(0.0, _("Places"));
_init() {
super._init(0.0, _("Places"));
let hbox = new St.BoxLayout({ style_class: 'panel-status-menu-box' });
let label = new St.Label({ text: _("Places"),
@@ -84,7 +86,7 @@ class PlacesMenu extends PanelMenu.Button {
y_align: Clutter.ActorAlign.CENTER });
hbox.add_child(label);
hbox.add_child(PopupMenu.arrowIcon(St.Side.BOTTOM));
this.actor.add_actor(hbox);
this.add_actor(hbox);
this.placesManager = new PlaceDisplay.PlacesManager();
@@ -103,10 +105,10 @@ class PlacesMenu extends PanelMenu.Button {
}
}
destroy() {
_onDestroy() {
this.placesManager.destroy();
super.destroy();
super._onDestroy();
}
_redisplay(id) {
@@ -122,7 +124,7 @@ class PlacesMenu extends PanelMenu.Button {
this._sections[id].actor.visible = places.length > 0;
}
};
});
function init() {
Convenience.initTranslations();

View File

@@ -50,33 +50,35 @@ class PlaceInfo {
return (_ignored, result) => {
try {
Gio.AppInfo.launch_default_for_uri_finish(result);
} catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_MOUNTED)) {
let source = {
get_icon: () => { return this.icon; }
};
let op = new ShellMountOperation.ShellMountOperation(source);
this.file.mount_enclosing_volume(0, op.mountOp, null, (file, result) => {
try {
op.close();
file.mount_enclosing_volume_finish(result);
} catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.FAILED_HANDLED)) {
// e.g. user canceled the password dialog
return;
} catch(e) {
Main.notifyError(_("Failed to mount volume for “%s”").format(this.name), e.message);
return;
}
if (tryMount) {
let callback = this._createLaunchCallback(launchContext, false);
Gio.AppInfo.launch_default_for_uri_async(file.get_uri(),
launchContext,
null,
callback);
}
});
} catch(e) {
Main.notifyError(_("Failed to launch “%s”").format(this.name), e.message);
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_MOUNTED)) {
let source = {
get_icon: () => { return this.icon; }
};
let op = new ShellMountOperation.ShellMountOperation(source);
this.file.mount_enclosing_volume(0, op.mountOp, null, (file, result) => {
try {
op.close();
file.mount_enclosing_volume_finish(result);
} catch(e) {
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.FAILED_HANDLED))
// e.g. user canceled the password dialog
return;
Main.notifyError(_("Failed to mount volume for “%s”").format(this.name), e.message);
return;
}
if (tryMount) {
let callback = this._createLaunchCallback(launchContext, false);
Gio.AppInfo.launch_default_for_uri_async(file.get_uri(),
launchContext,
null,
callback);
}
});
} else {
Main.notifyError(_("Failed to launch “%s”").format(this.name), e.message);
}
}
}
}
@@ -97,8 +99,10 @@ class PlaceInfo {
let info = file.query_info_finish(result);
this.icon = info.get_symbolic_icon();
this.emit('changed');
} catch(e if e instanceof Gio.IOErrorEnum) {
return;
} catch(e) {
if (e instanceof Gio.IOErrorEnum)
return;
throw e;
}
});
@@ -123,8 +127,10 @@ class PlaceInfo {
try {
let info = this.file.query_info('standard::display-name', 0, null);
return info.get_display_name();
} catch(e if e instanceof Gio.IOErrorEnum) {
return this.file.get_basename();
} catch(e) {
if (e instanceof Gio.IOErrorEnum)
return this.file.get_basename();
throw e;
}
}
};
@@ -349,8 +355,10 @@ var PlacesManager = class {
let file = Gio.File.new_for_path(specialPath), info;
try {
info = new PlaceInfo('special', file);
} catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND)) {
continue;
} catch(e) {
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND))
continue;
throw e;
}
specials.push(info);
@@ -514,8 +522,10 @@ var PlacesManager = class {
try {
devItem = new PlaceDeviceInfo(kind, mount);
} catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND)) {
return;
} catch(e) {
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND))
return;
throw e;
}
this._places[kind].push(devItem);
@@ -526,8 +536,10 @@ var PlacesManager = class {
try {
volItem = new PlaceVolumeInfo(kind, volume);
} catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND)) {
return;
} catch(e) {
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND))
return;
throw e;
}
this._places[kind].push(volItem);

View File

@@ -69,7 +69,7 @@ let SIZES = [
[1600, 900]
];
function cycleScreenshotSizes(display, screen, window, binding) {
function cycleScreenshotSizes(display, window, binding) {
// Probably this isn't useful with 5 sizes, but you can decrease instead
// of increase by holding down shift.
let modifiers = binding.get_modifiers();

View File

@@ -1,6 +1,7 @@
const Clutter = imports.gi.Clutter;
const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio;
const GObject = imports.gi.GObject;
const Gtk = imports.gi.Gtk;
const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell;
@@ -238,10 +239,10 @@ class BaseButton {
if (this._perMonitor) {
this._windowEnteredMonitorId =
global.screen.connect('window-entered-monitor',
global.display.connect('window-entered-monitor',
this._windowEnteredOrLeftMonitor.bind(this));
this._windowLeftMonitorId =
global.screen.connect('window-left-monitor',
global.display.connect('window-left-monitor',
this._windowEnteredOrLeftMonitor.bind(this));
}
}
@@ -282,12 +283,12 @@ class BaseButton {
this.actor.remove_style_class_name('focused');
}
_windowEnteredOrLeftMonitor(metaScreen, monitorIndex, metaWindow) {
_windowEnteredOrLeftMonitor(metaDisplay, monitorIndex, metaWindow) {
throw new Error('Not implemented');
}
_isWindowVisible(window) {
let workspace = global.screen.get_active_workspace();
let workspace = global.workspace_manager.get_active_workspace();
return !window.skip_taskbar &&
window.located_on_workspace(workspace) &&
@@ -315,11 +316,11 @@ class BaseButton {
global.window_manager.disconnect(this._switchWorkspaceId);
if (this._windowEnteredMonitorId)
global.screen.disconnect(this._windowEnteredMonitorId);
global.display.disconnect(this._windowEnteredMonitorId);
this._windowEnteredMonitorId = 0;
if (this._windowLeftMonitorId)
global.screen.disconnect(this._windowLeftMonitorId);
global.display.disconnect(this._windowLeftMonitorId);
this._windowLeftMonitorId = 0;
}
};
@@ -377,7 +378,7 @@ class WindowButton extends BaseButton {
this.actor.remove_style_class_name('minimized');
}
_windowEnteredOrLeftMonitor(metaScreen, monitorIndex, metaWindow) {
_windowEnteredOrLeftMonitor(metaDisplay, monitorIndex, metaWindow) {
if (monitorIndex == this._monitorIndex && metaWindow == this.metaWindow)
this._updateVisibility();
}
@@ -518,7 +519,7 @@ class AppButton extends BaseButton {
this._updateStyle();
}
_windowEnteredOrLeftMonitor(metaScreen, monitorIndex, metaWindow) {
_windowEnteredOrLeftMonitor(metaDisplay, monitorIndex, metaWindow) {
if (this._windowTracker.get_window_app(metaWindow) == this.app &&
monitorIndex == this._monitorIndex) {
this._updateVisibility();
@@ -529,7 +530,7 @@ class AppButton extends BaseButton {
_updateVisibility() {
if (!this._perMonitor) {
// fast path: use ShellApp API to avoid iterating over all windows.
let workspace = global.screen.get_active_workspace();
let workspace = global.workspace_manager.get_active_workspace();
this.actor.visible = this.app.is_on_workspace(workspace);
} else {
this.actor.visible = this.getWindowList().length >= 1;
@@ -641,18 +642,21 @@ class AppButton extends BaseButton {
};
let WorkspaceIndicator = GObject.registerClass(
class WorkspaceIndicator extends PanelMenu.Button {
constructor() {
super(0.0, _("Workspace Indicator"), true);
this.setMenu(new PopupMenu.PopupMenu(this.actor, 0.0, St.Side.BOTTOM));
this.actor.add_style_class_name('window-list-workspace-indicator');
_init() {
super._init(0.0, _("Workspace Indicator"), true);
this.setMenu(new PopupMenu.PopupMenu(this, 0.0, St.Side.BOTTOM));
this.add_style_class_name('window-list-workspace-indicator');
this.menu.actor.remove_style_class_name('panel-menu');
let container = new St.Widget({ layout_manager: new Clutter.BinLayout(),
x_expand: true, y_expand: true });
this.actor.add_actor(container);
this.add_actor(container);
this._currentWorkspace = global.screen.get_active_workspace().index();
let workspaceManager = global.workspace_manager;
this._currentWorkspace = workspaceManager.get_active_workspace().index();
this.statusLabel = new St.Label({ text: this._getStatusText(),
x_align: Clutter.ActorAlign.CENTER,
y_align: Clutter.ActorAlign.CENTER });
@@ -660,13 +664,13 @@ class WorkspaceIndicator extends PanelMenu.Button {
this.workspacesItems = [];
this._screenSignals = [];
this._screenSignals.push(global.screen.connect('notify::n-workspaces',
this._updateMenu.bind(this)));
this._screenSignals.push(global.screen.connect_after('workspace-switched',
this._updateIndicator.bind(this)));
this._workspaceManagerSignals = [];
this._workspaceManagerSignals.push(workspaceManager.connect('notify::n-workspaces',
this._updateMenu.bind(this)));
this._workspaceManagerSignals.push(workspaceManager.connect_after('workspace-switched',
this._updateIndicator.bind(this)));
this.actor.connect('scroll-event', this._onScrollEvent.bind(this));
this.connect('scroll-event', this._onScrollEvent.bind(this));
this._updateMenu();
this._settings = new Gio.Settings({ schema_id: 'org.gnome.desktop.wm.preferences' });
@@ -675,39 +679,42 @@ class WorkspaceIndicator extends PanelMenu.Button {
this._updateMenu.bind(this));
}
destroy() {
for (let i = 0; i < this._screenSignals.length; i++)
global.screen.disconnect(this._screenSignals[i]);
_onDestroy() {
for (let i = 0; i < this._workspaceManagerSignals.length; i++)
global.workspace_manager.disconnect(this._workspaceManagerSignals[i]);
if (this._settingsChangedId) {
this._settings.disconnect(this._settingsChangedId);
this._settingsChangedId = 0;
}
super.destroy();
super._onDestroy();
}
_updateIndicator() {
this.workspacesItems[this._currentWorkspace].setOrnament(PopupMenu.Ornament.NONE);
this._currentWorkspace = global.screen.get_active_workspace().index();
this._currentWorkspace = global.workspace_manager.get_active_workspace().index();
this.workspacesItems[this._currentWorkspace].setOrnament(PopupMenu.Ornament.DOT);
this.statusLabel.set_text(this._getStatusText());
}
_getStatusText() {
let current = global.screen.get_active_workspace().index();
let total = global.screen.n_workspaces;
let workspaceManager = global.workspace_manager;
let current = workspaceManager.get_active_workspace().index();
let total = workspaceManager.n_workspaces;
return '%d / %d'.format(current + 1, total);
}
_updateMenu() {
let workspaceManager = global.workspace_manager;
this.menu.removeAll();
this.workspacesItems = [];
this._currentWorkspace = global.screen.get_active_workspace().index();
this._currentWorkspace = workspaceManager.get_active_workspace().index();
for(let i = 0; i < global.screen.n_workspaces; i++) {
for(let i = 0; i < workspaceManager.n_workspaces; i++) {
let name = Meta.prefs_get_workspace_name(i);
let item = new PopupMenu.PopupMenuItem(name);
item.workspaceId = i;
@@ -727,8 +734,10 @@ class WorkspaceIndicator extends PanelMenu.Button {
}
_activate(index) {
if(index >= 0 && index < global.screen.n_workspaces) {
let metaWorkspace = global.screen.get_workspace_by_index(index);
let workspaceManager = global.workspace_manager;
if(index >= 0 && index < workspaceManager.n_workspaces) {
let metaWorkspace = workspaceManager.get_workspace_by_index(index);
metaWorkspace.activate(global.get_current_time());
}
}
@@ -752,7 +761,7 @@ class WorkspaceIndicator extends PanelMenu.Button {
if (actor.get_n_children() > 0)
actor.get_first_child().allocate(box, flags);
}
};
});
class WindowList {
constructor(perMonitor, monitor) {
@@ -792,14 +801,12 @@ class WindowList {
indicatorsBox.add(this._workspaceIndicator.container, { expand: false, y_fill: true });
this._mutterSettings = new Gio.Settings({ schema_id: 'org.gnome.mutter' });
this._workspaceSettings = this._getWorkspaceSettings();
this._workspacesOnlyOnPrimaryChangedId =
this._workspaceSettings.connect('changed::workspaces-only-on-primary',
this._updateWorkspaceIndicatorVisibility.bind(this));
this._dynamicWorkspacesSettings = this._getDynamicWorkspacesSettings();
this._mutterSettings.connect('changed::workspaces-only-on-primary',
this._updateWorkspaceIndicatorVisibility.bind(this));
this._dynamicWorkspacesChangedId =
this._dynamicWorkspacesSettings.connect('changed::dynamic-workspaces',
this._updateWorkspaceIndicatorVisibility.bind(this));
this._mutterSettings.connect('changed::dynamic-workspaces',
this._updateWorkspaceIndicatorVisibility.bind(this));
this._updateWorkspaceIndicatorVisibility();
this._menuManager = new PopupMenu.PopupMenuManager(this);
@@ -833,10 +840,12 @@ class WindowList {
this._updateKeyboardAnchor();
});
let workspaceManager = global.workspace_manager;
this._workspaceSignals = new Map();
this._nWorkspacesChangedId =
global.screen.connect('notify::n-workspaces',
this._onWorkspacesChanged.bind(this));
workspaceManager.connect('notify::n-workspaces',
this._onWorkspacesChanged.bind(this));
this._onWorkspacesChanged();
this._switchWorkspaceId =
@@ -856,7 +865,7 @@ class WindowList {
});
this._fullscreenChangedId =
global.screen.connect('in-fullscreen-changed', () => {
global.display.connect('in-fullscreen-changed', () => {
this._updateKeyboardAnchor();
});
@@ -881,19 +890,6 @@ class WindowList {
this._groupingModeChanged();
}
_getDynamicWorkspacesSettings() {
if (this._workspaceSettings.list_keys().includes('dynamic-workspaces'))
return this._workspaceSettings;
return this._mutterSettings;
}
_getWorkspaceSettings() {
let settings = global.get_overrides_settings() || this._mutterSettings;
if (settings.list_keys().includes('workspaces-only-on-primary'))
return settings;
return this._mutterSettings;
}
_onScrollEvent(actor, event) {
let direction = event.get_scroll_direction();
let diff = 0;
@@ -904,17 +900,12 @@ class WindowList {
else
return;
let children = this._windowList.get_children().map(a => a._delegate);
let active = 0;
for (let i = 0; i < children.length; i++) {
if (children[i].active) {
active = i;
break;
}
}
active = Math.max(0, Math.min(active + diff, children.length-1));
children[active].activate();
let children = this._windowList.get_children()
.filter(c => c.visible)
.map(a => a._delegate);
let active = children.findIndex(c => c.active);
let newActive = Math.max(0, Math.min(active + diff, children.length-1));
children[newActive].activate();
}
_updatePosition() {
@@ -923,10 +914,11 @@ class WindowList {
}
_updateWorkspaceIndicatorVisibility() {
let hasWorkspaces = this._dynamicWorkspacesSettings.get_boolean('dynamic-workspaces') ||
global.screen.n_workspaces > 1;
let workspaceManager = global.workspace_manager;
let hasWorkspaces = this._mutterSettings.get_boolean('dynamic-workspaces') ||
workspaceManager.n_workspaces > 1;
let workspacesOnMonitor = this._monitor == Main.layoutManager.primaryMonitor ||
!this._workspaceSettings.get_boolean('workspaces-only-on-primary');
!this._mutterSettings.get_boolean('workspaces-only-on-primary');
this._workspaceIndicator.actor.visible = hasWorkspaces && workspacesOnMonitor;
}
@@ -939,7 +931,7 @@ class WindowList {
let [, childWidth] = children[0].get_preferred_width(-1);
let spacing = this._windowList.layout_manager.spacing;
let workspace = global.screen.get_active_workspace();
let workspace = global.workspace_manager.get_active_workspace();
let windows = global.display.get_tab_list(Meta.TabList.NORMAL, workspace);
if (this._perMonitor)
windows = windows.filter(w => w.get_monitor() == this._monitor.index);
@@ -1028,12 +1020,9 @@ class WindowList {
_removeApp(app) {
let children = this._windowList.get_children();
for (let i = 0; i < children.length; i++) {
if (children[i]._delegate.app == app) {
children[i].destroy();
return;
}
}
let child = children.find(c => c._delegate.app == app);
if (child)
child.destroy();
}
_onWindowAdded(ws, win) {
@@ -1047,10 +1036,8 @@ class WindowList {
return;
let children = this._windowList.get_children();
for (let i = 0; i < children.length; i++) {
if (children[i]._delegate.metaWindow == win)
return;
}
if (children.find(c => c._delegate.metaWindow == win))
return;
let button = new WindowButton(win, this._perMonitor, this._monitor.index);
this._windowList.layout_manager.pack(button.actor,
@@ -1070,18 +1057,17 @@ class WindowList {
return; // not actually removed, just moved to another workspace
let children = this._windowList.get_children();
for (let i = 0; i < children.length; i++) {
if (children[i]._delegate.metaWindow == win) {
children[i].destroy();
return;
}
}
let child = children.find(c => c._delegate.metaWindow == win);
if (child)
child.destroy();
}
_onWorkspacesChanged() {
let numWorkspaces = global.screen.n_workspaces;
let workspaceManager = global.workspace_manager;
let numWorkspaces = workspaceManager.n_workspaces;
for (let i = 0; i < numWorkspaces; i++) {
let workspace = global.screen.get_workspace_by_index(i);
let workspace = workspaceManager.get_workspace_by_index(i);
if (this._workspaceSignals.has(workspace))
continue;
@@ -1099,9 +1085,11 @@ class WindowList {
}
_disconnectWorkspaceSignals() {
let numWorkspaces = global.screen.n_workspaces;
let workspaceManager = global.workspace_manager;
let numWorkspaces = workspaceManager.n_workspaces;
for (let i = 0; i < numWorkspaces; i++) {
let workspace = global.screen.get_workspace_by_index(i);
let workspace = workspaceManager.get_workspace_by_index(i);
let signals = this._workspaceSignals.get(workspace);
this._workspaceSignals.delete(workspace);
workspace.disconnect(signals._windowAddedId);
@@ -1163,8 +1151,8 @@ class WindowList {
}
_onDestroy() {
this._workspaceSettings.disconnect(this._workspacesOnlyOnPrimaryChangedId);
this._dynamicWorkspacesSettings.disconnect(this._dynamicWorkspacesChangedId);
this._mutterSettings.disconnect(this._workspacesOnlyOnPrimaryChangedId);
this._mutterSettings.disconnect(this._dynamicWorkspacesChangedId);
this._workspaceIndicator.destroy();
@@ -1179,7 +1167,7 @@ class WindowList {
Main.layoutManager.hideKeyboard();
this._disconnectWorkspaceSignals();
global.screen.disconnect(this._nWorkspacesChangedId);
global.workspace_manager.disconnect(this._nWorkspacesChangedId);
this._nWorkspacesChangedId = 0;
global.window_manager.disconnect(this._switchWorkspaceId);
@@ -1189,7 +1177,7 @@ class WindowList {
Main.overview.disconnect(this._overviewShowingId);
Main.overview.disconnect(this._overviewHidingId);
global.screen.disconnect(this._fullscreenChangedId);
global.display.disconnect(this._fullscreenChangedId);
Main.xdndHandler.disconnect(this._dragBeginId);
Main.xdndHandler.disconnect(this._dragEndId);

View File

@@ -135,14 +135,16 @@ function enable() {
if(Main.overview.viewSelector._activePage != Main.overview.viewSelector._workspacesPage)
return false;
let workspaceManager = global.workspace_manager;
if ((o.get_key_symbol() == Clutter.KEY_Alt_L ||
o.get_key_symbol() == Clutter.KEY_Alt_R)
&& !this._pickWorkspace) {
this._prevFocusActor = global.stage.get_key_focus();
global.stage.set_key_focus(null);
this._active = global.screen.get_active_workspace_index();
this._active = workspaceManager.get_active_workspace_index();
this._pickWindow = true;
this._workspaces[global.screen.get_active_workspace_index()].showWindowsTooltips();
this._workspaces[workspaceManager.get_active_workspace_index()].showWindowsTooltips();
return true;
}
if ((o.get_key_symbol() == Clutter.KEY_Control_L ||
@@ -166,7 +168,7 @@ function enable() {
return true;
if (this._pickWindow) {
if (this._active != global.screen.get_active_workspace_index()) {
if (this._active != workspaceManager.get_active_workspace_index()) {
this._hideTooltips();
return false;
}

View File

@@ -1,6 +1,7 @@
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
const Gio = imports.gi.Gio;
const GObject = imports.gi.GObject;
const Meta = imports.gi.Meta;
const Clutter = imports.gi.Clutter;
const St = imports.gi.St;
@@ -21,28 +22,32 @@ const Convenience = Me.imports.convenience;
const WORKSPACE_SCHEMA = 'org.gnome.desktop.wm.preferences';
const WORKSPACE_KEY = 'workspace-names';
let WorkspaceIndicator = GObject.registerClass(
class WorkspaceIndicator extends PanelMenu.Button {
constructor() {
super(0.0, _("Workspace Indicator"));
_init() {
super._init(0.0, _("Workspace Indicator"));
this._currentWorkspace = global.screen.get_active_workspace().index();
let workspaceManager = global.workspace_manager;
this._currentWorkspace = workspaceManager.get_active_workspace().index();
this.statusLabel = new St.Label({ y_align: Clutter.ActorAlign.CENTER,
text: this._labelText() });
this.actor.add_actor(this.statusLabel);
this.add_actor(this.statusLabel);
this.workspacesItems = [];
this._workspaceSection = new PopupMenu.PopupMenuSection();
this.menu.addMenuItem(this._workspaceSection);
this._screenSignals = [];
this._screenSignals.push(global.screen.connect_after('workspace-added', this._createWorkspacesSection.bind(this)));
this._screenSignals.push(global.screen.connect_after('workspace-removed',
this._createWorkspacesSection.bind(this)));
this._screenSignals.push(global.screen.connect_after('workspace-switched',
this._updateIndicator.bind(this)));
this._workspaceManagerSignals = [];
this._workspaceManagerSignals.push(workspaceManager.connect_after('workspace-added',
this._createWorkspacesSection.bind(this)));
this._workspaceManagerSignals.push(workspaceManager.connect_after('workspace-removed',
this._createWorkspacesSection.bind(this)));
this._workspaceManagerSignals.push(workspaceManager.connect_after('workspace-switched',
this._updateIndicator.bind(this)));
this.actor.connect('scroll-event', this._onScrollEvent.bind(this));
this.connect('scroll-event', this._onScrollEvent.bind(this));
this._createWorkspacesSection();
//styling
@@ -54,21 +59,21 @@ class WorkspaceIndicator extends PanelMenu.Button {
this._createWorkspacesSection.bind(this));
}
destroy() {
for (let i = 0; i < this._screenSignals.length; i++)
global.screen.disconnect(this._screenSignals[i]);
_onDestroy() {
for (let i = 0; i < this._workspaceManagerSignals.length; i++)
global.workspace_manager.disconnect(this._workspaceManagerSignals[i]);
if (this._settingsChangedId) {
this._settings.disconnect(this._settingsChangedId);
this._settingsChangedId = 0;
}
super.destroy();
super._onDestroy();
}
_updateIndicator() {
this.workspacesItems[this._currentWorkspace].setOrnament(PopupMenu.Ornament.NONE);
this._currentWorkspace = global.screen.get_active_workspace().index();
this._currentWorkspace = global.workspace_manager.get_active_workspace().index();
this.workspacesItems[this._currentWorkspace].setOrnament(PopupMenu.Ornament.DOT);
this.statusLabel.set_text(this._labelText());
@@ -83,12 +88,14 @@ class WorkspaceIndicator extends PanelMenu.Button {
}
_createWorkspacesSection() {
let workspaceManager = global.workspace_manager;
this._workspaceSection.removeAll();
this.workspacesItems = [];
this._currentWorkspace = global.screen.get_active_workspace().index();
this._currentWorkspace = workspaceManager.get_active_workspace().index();
let i = 0;
for(; i < global.screen.n_workspaces; i++) {
for(; i < workspaceManager.n_workspaces; i++) {
this.workspacesItems[i] = new PopupMenu.PopupMenuItem(this._labelText(i));
this._workspaceSection.addMenuItem(this.workspacesItems[i]);
this.workspacesItems[i].workspaceId = i;
@@ -106,8 +113,10 @@ class WorkspaceIndicator extends PanelMenu.Button {
}
_activate(index) {
if(index >= 0 && index < global.screen.n_workspaces) {
let metaWorkspace = global.screen.get_workspace_by_index(index);
let workspaceManager = global.workspace_manager;
if(index >= 0 && index < workspaceManager.n_workspaces) {
let metaWorkspace = workspaceManager.get_workspace_by_index(index);
metaWorkspace.activate(global.get_current_time());
}
}
@@ -123,10 +132,10 @@ class WorkspaceIndicator extends PanelMenu.Button {
return;
}
let newIndex = global.screen.get_active_workspace().index() + diff;
let newIndex = global.workspace_manager.get_active_workspace().index() + diff;
this._activate(newIndex);
}
};
});
function init(meta) {
Convenience.initTranslations();

View File

@@ -1,5 +1,5 @@
project('gnome-shell-extensions',
version: '3.28.1',
version: '3.31.2',
meson_version: '>= 0.44.0',
license: 'GPL2+'
)
@@ -34,7 +34,6 @@ endif
uuid_suffix = '@gnome-shell-extensions.gcampax.github.com'
classic_extensions = [
'alternate-tab',
'apps-menu',
'places-menu',
'launch-new-instance',
@@ -52,7 +51,6 @@ default_extensions += [
all_extensions = default_extensions
all_extensions += [
'auto-move-windows',
'example',
'native-window-placement',
'user-theme'
]

View File

@@ -1,15 +1,10 @@
data/gnome-classic.desktop.in
data/gnome-classic.session.desktop.in
data/org.gnome.shell.extensions.classic-overrides.gschema.xml
extensions/alternate-tab/prefs.js
extensions/apps-menu/extension.js
extensions/auto-move-windows/extension.js
extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml
extensions/auto-move-windows/prefs.js
extensions/drive-menu/extension.js
extensions/example/extension.js
extensions/example/org.gnome.shell.extensions.example.gschema.xml
extensions/example/prefs.js
extensions/native-window-placement/extension.js
extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml
extensions/places-menu/extension.js